ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzQyYTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotICAgICAgICAgICAgPCEtLSAgU1NFIFVJPyBIb3cnZCB0aGF0IGhhcHBlbmQ/ISAgLS0+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL3VpLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjMwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWpzcG1vZGVsLmphcgotZGV2LnByb3BlcnRpZXMKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZV82LjAuMC5qYXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlXzYuMC4wLnppcAotanNwbW9kZWxzcmMuemlwCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdhNGMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BpbmRleG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaD1mYWxzZQotCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL3Jlc29sdmU9ZmFsc2UKLQotCi0jIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyLl9kZWJ1Zwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvbWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvY2FjaGU9ZmFsc2UKLQotIyBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5DTURvY3VtZW50RmFjdG9yeVRMRC5fZGVidWcKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L2ZhY3Rvcnk9ZmFsc2UKLQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvamVjdERlc2NyaXB0aW9uLl9kZWJ1Z0luZGV4Q3JlYXRpb24KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvaW5kZXhjcmVhdGlvbj1mYWxzZQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvamVjdERlc2NyaXB0aW9uLl9kZWJ1Z0luZGV4VGltZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleHRpbWU9ZmFsc2UKLQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliSW5kZXguX2RlYnVnRXZlbnRzCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2V2ZW50cz1mYWxzZQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliSW5kZXguX2RlYnVnSW5kZXhDcmVhdGlvbgotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdSZXNvbHV0aW9uCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL3Jlc29sdmU9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGphdmFtYXBwaW5nPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3I9ZmFsc2UKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJ2YXJzPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJjbGFzc2xvYWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTBiN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSG93VG9HZW4uaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQzOWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotPHA+Ci1KU1BlZENTU1Rva2VuaXplciBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjEgCi1mcm9tIHRoZSBKU1BlZENTU1Rva2VuaXplci5mbGV4IGdyYW1tZXIgZmlsZS4KLUFmdGVyIGdlbmVyYXRpbmcgdGhlIHNjYW5uZXIsIEkgcmVtb3ZlZCB1bnVzZWQgcHJpdmF0ZSBmaWVsZCBlcnJvcnMuCi08L3A+Ci08L2JvZHk+Ci08aHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9KU1BlZENTU1Rva2VuaXplci5mbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODE5NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkpTUGVkQ1NTUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5JQ1NTVG9rZW5pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotDQotJSUNCi0NCi0lcHVibGljDQotJWNsYXNzIEpTUGVkQ1NTVG9rZW5pemVyDQotJWltcGxlbWVudHMgSlNQZWRDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0lbGluZQ0KLSV1bmljb2RlDQotJWNhc2VsZXNzDQotJXBhY2sNCi0NCi0lew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsNCi0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7DQotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7DQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7DQotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsNCi0NCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgew0KLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgew0KLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQ7DQotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsNCi0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOw0KLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsNCi0JCWludCBzdGFydDsNCi0JCWludCB0ZXh0TGVuZ3RoOw0KLQkJaW50IGxlbmd0aDsNCi0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsNCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0NCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQlzdGFydCA9IHl5Y2hhcjsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCB8fCBjb250ZXh0ID09IENTU19KU1BfRUwpew0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19FTF9FTkQgJiYgbmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCWlmIChjb250ZXh0LmVxdWFscyhDU1NfSlNQX1NDUklQVExFVCkgJiYgKHl5c3RhdGUoKSA9PSBTVF9KU1BfRElSRUNUSVZFIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfRVhQIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfREVDTEFSQVRJT04pKXsNCi0JCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0JCQkJCX0NCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCl7DQotCQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlRfRU5EKSB7DQotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7DQotCQkJCQkJaWYgKGNvbnRleHQuZXF1YWxzKENTU19KU1BfU0NSSVBUTEVUKSAmJiB5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpew0KLQkJCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0JCQkJCQl9DQotDQotCQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQkJCQkNCi0JCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfQ09NTUVOVCl7DQotCQkJCQkJY29udGV4dCA9IENTU19DT01NRU5UOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJDQotCQkJfQ0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzDQotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgew0KLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOw0KLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsNCi0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TDQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOw0KLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgew0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsNCi0JCQkJfQ0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQNCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsNCi0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZA0KLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZg0KLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7DQotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7DQotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsNCi0JCQl9DQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotICAJfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8NCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOw0KLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7DQotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7DQotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJDQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7DQotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOw0KLQkJCXRva2Vucy5hZGQodG9rZW4pOw0KLQkJfQ0KLQ0KLSAgCQlyZXR1cm4gdG9rZW5zOw0KLSAgCX0NCi0gIAkNCi0gIAkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsNCi0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7DQotICAJCQlyZXR1cm4gZmFsc2U7DQotICAJCX0gZWxzZSB7DQotICAJCQlyZXR1cm4gdHJ1ZTsNCi0gIAkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7DQotCQlyZXR1cm4geXljaGFyOw0KLQl9DQotCQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsNCi0JCXJldHVybiB6ekF0RU9GOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCQl6elJlYWRlciA9IGluOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0JCXp6U3RhdGUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JCXp6TGV4aWNhbFN0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7DQotDQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLQkJaWYgKHp6QnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsNCi0JCQl6ekJ1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07DQotCQl9DQotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl6ek1hcmtlZFBvcyA9IDA7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JCXp6UHVzaGJhY2tQb3MgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLQkJenpDdXJyZW50UG9zID0gMDsNCi0NCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXp6U3RhcnRSZWFkID0gMDsNCi0NCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JCQlmcm9tIGlucHV0ICovDQotCQl6ekVuZFJlYWQgPSAwOw0KLQ0KLQkJLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXlsaW5lID0gMDsNCi0NCi0JCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5Y2hhciA9IDA7DQotDQotCQkvKioNCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSANCi0JCSAqIG1hdGNoZWQgdGV4dA0KLQkJICovDQotCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLQkJLyoqIA0KLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotCQkgKi8NCi0JCXp6QXRCT0wgPSBmYWxzZTsNCi0JCQ0KLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXp6QXRFT0YgPSBmYWxzZTsNCi0NCi0JCS8qIHVzZXIgdmFyaWFibGVzICovDQotCQkvLwkJZlVuZGVmaW5lZC5kZWxldGUoMCwgZlVuZGVmaW5lZC5sZW5ndGgoKSk7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgZkpTUFByZXZpb3VzU3RhdGUgPSBmSW5pdGlhbFN0YXRlOw0KLQlwcml2YXRlIHZvaWQgeXlKc3BCZWdpbihpbnQgbmV3c3RhdGUpew0KLQkJZkpTUFByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7DQotCQl5eWJlZ2luKG5ld3N0YXRlKTsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgeXlKc3BFbmQoKXsNCi0JCXl5YmVnaW4oZkpTUFByZXZpb3VzU3RhdGUpOw0KLQl9DQotJX0NCi0NCi0lc3RhdGUgU1RfQ0hBUlNFVF9OQU1FDQotJXN0YXRlIFNUX0NIQVJTRVRfREVMSU1JVEVSDQotJXN0YXRlIFNUX0lNUE9SVF9VUkkNCi0lc3RhdGUgU1RfSU1QT1JUX01FRElVTQ0KLSVzdGF0ZSBTVF9JTVBPUlRfREVMSU1JVEVSDQotJXN0YXRlIFNUX01FRElBX01FRElVTQ0KLSVzdGF0ZSBTVF9NRURJQV9ERUxJTUlURVINCi0lc3RhdGUgU1RfUEFHRV9QU0VVRE9fUEFHRQ0KLSVzdGF0ZSBTVF9QQUdFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSDQotJXN0YXRlIFNUX1NFTEVDVE9SDQotJXN0YXRlIFNUX1NFTEVDVE9SX01PRElGSUVSDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORA0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1INCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFDQotJXN0YXRlIFNUX0pTUF9TQ1JJUFRMRVQNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRQ0KLSVzdGF0ZSBTVF9KU1BfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfSlNQX0VYUA0KLSVzdGF0ZSBTVF9KU1BfRUwNCi0lc3RhdGUgU1RfSlNQX0NPTU1FTlQNCi0NCi0NCi1oID0gWzAtOWEtZl0NCi1ub25hc2NpaSA9IFtcdTAwODAtXHVmZmZmXQ0KLXVuaWNvZGUgPSBcXHtofXsxLDZ9WyBcdFxyXG5cZl0/DQotZXNjYXBlID0ge3VuaWNvZGV9fFxcWyAtflx1MDA4MC1cdWZmZmZdDQotbm1zdGFydCA9IFtfYS16QS1aLV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLW5tY2hhciA9IFtfYS16QS1aMC05LV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLXN0cmluZzEgPSBcIihbXHQgISMkJSYoLX5dfFxce25sfXxcJ3x7bm9uYXNjaWl9fHtlc2NhcGV9KSpcIg0KLXN0cmluZzIgPSBcJyhbXHQgISMkJSYoLX5dfFxce25sfXxcInx7bm9uYXNjaWl9fHtlc2NhcGV9KSpcJw0KLQ0KLWlkZW50ID0ge25tc3RhcnR9e25tY2hhcn0qDQotbmFtZSA9IHtubWNoYXJ9Kw0KLW51bSA9IFsrLV0/KFswLTldK3xbMC05XSoiLiJbMC05XSspDQotc3RyaW5nID0ge3N0cmluZzF9fHtzdHJpbmcyfQ0KLXVybCA9IChbICEjJCUmKi1+XXx7bm9uYXNjaWl9fHtlc2NhcGV9KSoNCi1zID0gWyBcdFxyXG5cZl0NCi13ID0ge3N9Kg0KLW5sID0gXG58XHJcbnxccnxcZg0KLXJhbmdlID0gXD97MSw2fXx7aH0oXD97MCw1fXx7aH0oXD97MCw0fXx7aH0oXD97MCwzfXx7aH0oXD97MCwyfXx7aH0oXD8/fHtofSkpKSkpDQotDQotaGFzaCA9ICIjIntuYW1lfQ0KLXVyaSA9ICgidXJsKCJ7d317c3RyaW5nfXt3fSIpInwidXJsKCJ7d317dXJsfXt3fSIpIikNCi1mdW5jdGlvbiA9IHtpZGVudH0iKCINCi11bmljb2RlX3JhbmdlID0gIlUiXCtbMC05YS1mQS1GP117MSw2fSgiLSJbMC05YS1mQS1GP117MSw2fSk/DQotDQotU1MgPSBbXHgyMFx4MDlceDBEXHgwQV0NCi1qc3BzdGFydCA9ICI8IntTU30qIiUie1NTfSoNCi1qc3BlbmQgPSAiJSJ7U1N9KiI+Ig0KLWVsc3RhcnQgPSAiJCJ7U1N9KiJ7Ig0KLWVsZW5kID0gIn0iDQotDQotJSUNCi0NCi0NCi0NCi08WVlJTklUSUFMPiB7DQotIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30NCi19DQotDQotPFNUX0pTUF9TQ1JJUFRMRVQ+IHsNCi0gIkAiCXt5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkUpOyByZXR1cm4gQ1NTX0pTUF9ESVJFQ1RJVkU7fQ0KLSAiPSIJe3l5YmVnaW4oU1RfSlNQX0VYUCk7IHJldHVybiBDU1NfSlNQX0VYUDt9DQotICIhIgl7eXliZWdpbihTVF9KU1BfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0pTUF9ERUNMO30NCi0ge2pzcGVuZH0ge3l5SnNwRW5kKCk7ICByZXR1cm4gQ1NTX0pTUF9FTkQ7fQ0KLSAiLS0iIHsgeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7IHJldHVybiBDU1NfSlNQX0NPTU1FTlQ7fQ0KLX0NCi0NCi0vKiBvdmVycmlkZSBnbG9iYWwgIn0iICovDQotPFNUX0pTUF9FTD4gew0KLSB7ZWxlbmR9IHt5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0VMX0VORDsgfQ0KLX0NCi0NCi08U1RfSlNQX0RJUkVDVElWRSwgU1RfSlNQX0VYUCwgU1RfSlNQX0RFQ0xBUkFUSU9OPiB7DQotIHtqc3BlbmR9IHt5eUpzcEVuZCgpOyAgcmV0dXJuIENTU19KU1BfRU5EO30NCi19DQotDQotPFNUX0pTUF9DT01NRU5UPiB7DQotIC0rLXtqc3BlbmR9IHsgeXlKc3BFbmQoKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVF9FTkQ7IH0NCi0gIn0iICAgICAgICAgeyByZXR1cm4gVU5ERUZJTkVEOyB9DQotfQ0KLQ0KLQ0KLS8qDQotICogKioqIGdsb2JhbCAqKioNCi0gKi8NCi0NCi17c30rIHsgcmV0dXJuIENTU19TOyB9DQotIjwhLS0iIHsgcmV0dXJuIENTU19DRE87IH0NCi0iLS0+IiB7IHJldHVybiBDU1NfQ0RDOyB9DQotIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLS8vXDxcJS0tW14tfV0qW31dKltefV0qLSstXCVcPiB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLQ0KLQ0KLS8vPFlZSU5JVElBTD4gew0KLS8vCSJAaW1wb3J0IiB7CXl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyB9DQotLy99DQotDQotLyoNCi0gKiAqKiogY2hhcnNldCBydWxlICoqKg0KLSAqIENIQVJTRVRfU1lNIFMqIFNUUklORyBTKiAnOycNCi0gKi8NCi0NCi0iQGNoYXJzZXQiIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7IH0NCi0NCi08U1RfQ0hBUlNFVF9OQU1FPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotfQ0KLQ0KLTxTVF9DSEFSU0VUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIGltcG9ydCBydWxlICoqKg0KLSAqIElNUE9SVF9TWU0gUyogW1NUUklOR3xVUkldIFMqIFsgbWVkaXVtIFsgQ09NTUEgUyogbWVkaXVtXSogXT8gJzsnIFMqDQotICovDQotDQotIkBpbXBvcnQiIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0NCi08U1RfSU1QT1JUX1VSST4gew0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotCS8vCSJ1cmwoInt3fXtzdHJpbmd9e3d9IikiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JLy8JInVybCgie3d9e3VybH17d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBtZWRpYSBydWxlICoqKg0KLSAqIE1FRElBX1NZTSBTKiBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW0gXSogTEJSQUNFIFMqIHJ1bGVzZXQqICd9JyBTKg0KLSAqLw0KLQ0KLSJAbWVkaWEiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOyB9DQotDQotLyogDQotICogbWVkaXVtDQotICogSURFTlQgUyoNCi0gKi8NCi08U1RfTUVESUFfTUVESVVNPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotfQ0KLQ0KLTxTVF9NRURJQV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIHBhZ2UgcnVsZSAqKg0KLSAqIFBBR0VfU1lNIFMqIHBzZXVkb19wYWdlPyBTKiBMQlJBQ0UgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gXSogJ30nIFMqDQotICovDQotDQotIkBwYWdlIiB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgfQ0KLSANCi0vKg0KLSAqIHBzZXVkb19wYWdlDQotICogJzonIElERU5UDQotICovDQotDQotPFNUX1BBR0VfUFNFVURPX1BBR0U+IHsNCi0JIjoiP3tpZGVudH0geyB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOyB9DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi08U1RfUEFHRV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogZm9udC1mYWNlDQotICogRk9OVF9GQUNFX1NZTSBTKiAneycgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gJyogJ30nIFMqDQotICovDQotDQotIkBmb250LWZhY2UiIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7IH0NCi0NCi08U1RfRk9OVF9GQUNFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBzZWxlY3Rvcg0KLSAqIHNpbXBsZV9zZWxlY3RvciBbIGNvbWJpbmF0b3Igc2ltcGxlX3NlbGVjdG9yIF0qDQotICovDQotDQotLyoNCi0gKiBzaW1wbGVfc2VsZWN0b3INCi0gKiBlbGVtZW50X25hbWUgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gXSogfCBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKw0KLSAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SX01PRElGSUVSLCBTVF9TRUxFQ1RPUj4gew0KLQkiKiIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7IH0NCi0Je2hhc2h9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7IH0NCi0vLwkiOiJ7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyB9DQotCSI6IntpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIi4ie25hbWV9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7IH0NCi0JIlsiIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOyB9DQotfQ0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX01PRElGSUVSPiB7DQotCSIsIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgfQ0KLQkvLyB1c2luZyBMT09LQUhFQUQNCi0Je3N9Ky9bXis+XHtdIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkiKyJ8Ij4iIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBhdHRyaWINCi0gKiAnWycgUyogSURFTlQgUyogWyBbICc9JyB8IElOQ0xVREVTIHwgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqIF0/ICddJw0KLSAqLw0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I+IHsNCi0JIj0ifCJ+PSJ8Inw9IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7IH0NCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFPiB7DQotCXtpZGVudH18e3N0cmluZ30geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORD4gew0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLS8qDQotICogZGVjbGFyYXRpb24NCi0gKiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPyB8IC8vIGVtcHR5IC8vDQotICovDQotDQotPFNUX0RFQ0xBUkFUSU9OPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fU0VQQVJBVE9SPiB7DQotCSI6IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1I7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fSAgICANCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIiEie3N9KiJpbXBvcnRhbnQiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyB9DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsgfQ0KLQkiKSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsgfQ0KLQl7bnVtfXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047IH0NCi0Je251bX0iJSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOyB9DQotCXtudW19IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOyB9DQotCXtmdW5jdGlvbn0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsgfQ0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgfQ0KLQkiIyJ7bmFtZX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIOyB9DQotCXt1bmljb2RlX3JhbmdlfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7IH0NCi0JWywvXSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30gICAgDQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQl7c30rL1teO31dIHsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OLCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IsIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIjsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOyB9DQotCS8vCSJ9IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7IH0NCi19DQotDQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotLy8Je3N9KyB7IHJldHVybiBDU1NfUzsgfQ0KLS8vCS4geyByZXR1cm4gVU5ERUZJTkVEOyB9DQotLy99DQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JW14gXHRcclxuXGZdKyB7IHJldHVybiBDU1NfVU5LTk9XTjsgfQ0KLS8vfQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLS4gew0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci5qRmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmOGVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotCi0lJQotCi0lewotCi0KLQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotICAgICAgICBwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotICAgICAgICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcigpIHsKLSAgICAgICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHl5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLSAgICAgICAgfQotIAotICAgICAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0gICAgICAgIH0KLQotCi0lfQotCi0lZW9mewotICAgICAgICBoYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIEpTUEhlYWRUb2tlbml6ZXIKLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuCi0ldHlwZSBTdHJpbmcKLSVjaGFyCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLS8vJWRlYnVnCi0lc3dpdGNoCi0lYnVmZmVyIDgxOTIKLQotCi1VVEYxNkJFID0gXHhGRVx4RkYKLVVURjE2TEUgPSBceEZGXHhGRQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGCi0KLS8vIFNwYWNlQ2hhciA9IFtceDIwXHgwOV0KLQotCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKwotUyA9IFtceDIwXHgwOVx4MERceDBBXQotCi1CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9KgotCi1MaW5lVGVybWluYXRvciA9IFxyfFxuCi0KLQotJXN0YXRlIFNUX1hNTERlY2wKLSVzdGF0ZSBTVF9QQUdFX0RJUkVDVElWRQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPgotewotCSAJLy8gZm9yY2UgdG8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIGxpbmUgKF4pIGFuZCBhdCBiZWdpbm5pbmcgb2YgZmlsZSAoeXljaGFyID09IDApCi0JCV4ge1VURjE2QkV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fX0KLQkJXiB7VVRGMTZMRX0gICAJCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9fQotCQleIHtVVEY4M0J5dGVCT019ICAgCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO319Ci0JCQotCQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCQleIHtTfSogIjxcP3htbCIge1N9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQotCi0gICAgICAgICI8JSIge1N9KiAiQCIge1N9KiAicGFnZSIge1N9KyAgIHt5eWJlZ2luKFNUX1BBR0VfRElSRUNUSVZFKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZVN0YXJ0O30KLSAgICAgICAgIjxqc3A6ZGlyZWN0aXZlLnBhZ2UiIHtTfSsgICAgICAgICAgIHt5eWJlZ2luKFNUX1BBR0VfRElSRUNUSVZFKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZVN0YXJ0O30KLQotCi19Ci0KLTxTVF9YTUxEZWNsPgotewotICAgICAgICAidmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQotICAgICAgICAiZW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30KLSAgICAgICAgLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0gICAgICAgIC8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzCi0gICAgICAgIC8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLgotICAgICAgICAvLyBCVVQsIHRoZSBoYXNNb3JlPWZhbHNlIHdhcyByZW1vdmVkIGZvciB0aGlzIEpTUCBjYXNlIChwcm9iYWJseSBzdGlsbCBvayBmb3IgcHVyZSBYTUwpIGJlY2F1c2UKLSAgICAgICAgLy8gaW4gYSBKU1AsIHdlIG11c3QgcGFyc2UgcGFzdCB4bWxEZWNsIHRvIGdldCBhdCBKU1AgcGFnZSBkaXJlY3RpdmUuCi0gICAgICAgIC8vIFdlJ2xsIGFzc3VtZSBhbGwgY2hhcnMgaW4gdGhpcyBhcmVhIGFyZSAicmVhZGFibGUiIGFzIGlzLgotICAgICAgICB7U30qICJcPz4iICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQotCi08U1RfUEFHRV9ESVJFQ1RJVkU+Ci17Ci0vLyAgcmVtb3ZlZCAnbGFuZ3VhZ2UnIHNpbmNlIGl0IHJlYWxseSBjYW4gYmUgaGFuZGxlZCBzZXBlcmF0ZWx5IGZyb20gZW5jb2RpbmcsIGJ1dCBtYXkgYWRkIGl0IGJhY2sgbGF0ZXIgZm9yIHNpbXBsZSByZS11c2UuCi0gICAgICAgICJsYW5ndWFnZSIgICAgIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZTt9Ci0gICAgICAgICJjb250ZW50VHlwZSIge0JlZ2luQXR0cmliZVZhbHVlfSAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VDb250ZW50VHlwZTt9Ci0gICAgICAgICJwYWdlRW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VFbmNvZGluZzt9Ci0gICAgICAgIC8vIG5vdGUgdGhlICJmb3JjZWQgZW5kIiAodmlhICdoYXNNb3JlPWZhbHNlJykgb25jZSB0aGUgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotICAgICAgICAvLyBUaGlzIGlzIHNpbmNlIG5vbi1hc2NpaSBjaGFycyBtYXkgZm9sbG93IGFuZCBtYXkgY2F1c2UgSU9FeGNlcHRpb25zIHdoaWNoIHdvdWxkIG5vdCBvY2N1ciBvbmNlIHN0cmVhbSBpcwotICAgICAgICAvLyByZWFkIGluIGNvcnJlY3QgZW5jb2RpbmcuCi0KLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQyMDUgZGVtb25zdHJhdGVzIGhvdyB3ZSBuZWVkIHRvIGtlZXAgcGFyc2luZywKLSAgICAgICAgLy8gZXZlbiBpZiBjb21lIHRvIGVuZCBvZiBvbmUgcGFnZSBkaXJlY3RpdmUsIHNvIGhhc01vcmU9ZmFsc2Ugd2FzIHJlbW92ZWQgZnJvbSB0aGVzZSBydWxlcy4KLSAgICAgICAgIiU+IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7fQotICAgICAgICAiXC8+IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDt9Ci19Ci0KLQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotICAgICAgICBcIiAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBcJyAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICAvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcKLSAgICAgICAge1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19Ci0KLQotPERRX1NUUklORz4KLXsKLQotICAgICAgICBcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgICAgICAge0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgICJcPz4iICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgJzwnICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0gICAgICAgICIlPiIgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotICAgICAgICBcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAgICAgICB7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgIiU+IiAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgICc8JyAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLSAgICAgICAgIiU+IiAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0KLQotfQotCi08VW5EZWxpbWl0ZWRTdHJpbmc+Ci17Ci0KLQotICAgICAgICB7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIHtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAiXD8+IiAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgJzwnICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgIC8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotICAgICAgICBcJyAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0KLSAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0gICAgICAgICIlPiIgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCi19Ci0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcKLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpCi08WVlJTklUSUFMLCBTVF9YTUxEZWNsLCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSwgU1RfUEFHRV9ESVJFQ1RJVkU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViZTE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idG9rZW5pemVyIiBkZWZhdWx0PSJIZWFkVG9rZW5pemVyIj4KLQkKLQk8IS0tIE5vdGU6IGZvciBFY2xpcHNlIGVudi4sIHRoZSBKRmxleCAxLjQgamFyIHNob3VsZCBiZSBhZGRlZCAKLQl0byB0aGUgYW50IGdsb2JhbCBlbnRyaWVzICAtLT4KLQk8dGFza2RlZiBjbGFzc25hbWU9IkpGbGV4LmFudHRhc2suSkZsZXhUYXNrIiBuYW1lPSJqZmxleCIgLz4KLQkJCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iSlNQSGVhZFRva2VuaXplci5qRmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IkhlYWRQYXJzZXJzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Ii4uL3NyYyIvPgotCQk8IS0tIHRvdWNoIGNhdXNlcyB0byBhbHdheXMgYnVpbGQsIHJlbW92ZSBmb3IgcmVhbCAnbWFrZScgYmVoYXZpb3IgLS0+Ci0JCTx0b3VjaCBmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9Ii8+Ci0JCQkJCQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJIZWFkVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGpmbGV4Ci0JICAgIAlmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9IgotCSAgICAJZGVzdGRpcj0iJHtkZXN0LmRpcn0iCi0JCQl2ZXJib3NlPSJ0cnVlIgotCQkJbm9iYWs9InRydWUiCi0JCQl0aW1lPSJvbiIKLQkgICAgLz4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmFhMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyejt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnNlcnZsZXQuYXBpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWU7IGV4Y2VwdGlvbnM9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxODdhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC8sXAotICAgICAgICAgICAgICAgc2NoZW1hLwotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjZjlhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmpzcCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iSUphclJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnRGlyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnbGliSW5kZXhMaXN0ZW5lciIgaW1wbGVtZW50PSJ0cnVlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYlJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnbGliUmVjb3JkRXZlbnQiIGltcGxlbWVudD0iZmFsc2UiIC8+IC0tPgotCQk8dHlwZSBuYW1lPSJJVExEUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVVJMUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJUYWdsaWJJbmRleCIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL2pzdC9jb21wb25lbnRzL2pzcC9vdmVydmlldy5odG1sIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2ZGZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBTb3VyY2UgSlNQIE1vZGVsCi1TdHJ1Y3R1cmVkX0pTUF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgSlNQIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1KU1BfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQCi1KU1BfVGFnX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBUYWcgRGVmaW5pdGlvbgotSlNQX1RMRF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1UYWcgTGlicmFyeSBEZWZpbml0aW9uCi1KU1BfRnJhZ21lbnRfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEZyYWdtZW50Ci1KU1BfU3ludGF4X1ZhbGlkYXRvci5uYW1lPUpTUCBTeW50YXggVmFsaWRhdG9yCi1KU1BfRGlyZWN0aXZlX1ZhbGlkYXRvci5uYW1lPUpTUCBEaXJlY3RpdmUgVmFsaWRhdG9yCi1FTF9TeW50YXhfVmFsaWRhdG9yLm5hbWU9RUwgU3ludGF4IFZhbGlkYXRvcgotU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZT1TdHJ1Y3R1cmVkIEpTUCBEb2N1bWVudCBTZXR1cCBQYXJ0aWNpcGFudAotCi1leHRlbnNpb24tcG9pbnQubmFtZS4wID0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVsdHJhbnNsYXRvcgotCi1jb250ZW50VHlwZUNTU0pTUE5hbWU9Q1NTIEpTUAotY29udGVudFR5cGVDU1NKU1BGTmFtZT1DU1MgSlNQIEZyYWdtZW50Ci0KLWNvbnRlbnRUeXBlQ1NTRG9jdW1lbnRGYWN0b3J5TmFtZT1Db250ZW50IFR5cGUgQ1NTIEpTUCBkb2N1bWVudCBmYWN0b3J5IGV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzMzNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsVHJhbnNsYXRvciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiIHNjaGVtYT0ic2NoZW1hL2VsdHJhbnNsYXRvci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1AiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJ0bGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuQ01Eb2N1bWVudEZhY3RvcnlUTEQiPgotCQk8L2ZhY3Rvcnk+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrcy5KU1BGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzLkpTUEZpbGVUYXNrU2Nhbm5lciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudFNldHVwIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmRvY3VtZW50c2V0dXAiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0pTUF9Eb2N1bWVudF9TZXR1cF9wYXJ0aWNpcGFudC5uYW1lIj4KLQkJPHBhcnRpY2lwYW50Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlciIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ianNwIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImpzcGYiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImpzcHgiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImpzZiI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3YiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ianRwbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ0bGQiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZyIgLz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0idGFneCIgLz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0idGFnZiIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQk8L3Byb2Nlc3Nvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8IS0tIGNyZWF0ZSBjb250ZW50IHR5cGUgZm9yIEpTUCBmaWxlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJqc3AsanN2LGp0cGwsanNweCIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUpTUF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJqc3Bzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJJU08tODg1OS0xIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JKU1AiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCQk8IS0tIGNyZWF0ZSBjb250ZW50IHR5cGUgZm9yIEpTUCBmcmFnbWVudCBmaWxlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJqc3BmLGpzZiIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUpTUF9GcmFnbWVudF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJqc3BmcmFnbWVudHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWRlZmF1bHQtY2hhcnNldD0iSVNPLTg4NTktMSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciBKU1AgMi4wIFRhZyBmaWxlIHR5cGVzIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InRhZyx0YWd4LHRhZ2YiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfVGFnX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9InRhZ3NvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiLz4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciAudGxkIGZpbGVzIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InRsZCIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUpTUF9UTERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0idGxkc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCIvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGpzcCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgRUwgYmF0Y2ggdmFsaWRhdG9yCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0iSlNQRUxWYWxpZGF0b3IiCi0JCW5hbWU9IiVFTF9TeW50YXhfVmFsaWRhdG9yLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotCQk8dmFsaWRhdG9yPgotCQkJPHByb2plY3ROYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNwIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcGYiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNmIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzdiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qdHBsIj4KLQkJCTwvZmlsdGVyPgotCQkJPGhlbHBlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQiPgotCQkJPC9oZWxwZXI+Ci0JCQk8cnVuCi0JCQkJZW5hYmxlZD0idHJ1ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRUxWYWxpZGF0b3IiPgotCQkJPC9ydW4+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgYmF0Y2ggdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0iSlNQSmF2YVZhbGlkYXRvciIKLQkJbmFtZT0iJUpTUF9TeW50YXhfVmFsaWRhdG9yLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotCQk8dmFsaWRhdG9yPgotCQkJPHByb2plY3ROYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3AiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNwZiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc2YiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanN2Ij4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmp0cGwiPgotCQkJPC9maWx0ZXI+Ci0JCQk8aGVscGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dCI+Ci0JCQk8L2hlbHBlcj4KLQkJCTxydW4KLQkJCQllbmFibGVkPSJ0cnVlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BKYXZhVmFsaWRhdG9yIj4KLQkJCTwvcnVuPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBkaXJlY3RpdmUgYmF0Y2ggdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJKU1BEaXJlY3RpdmVWYWxpZGF0b3IiCi0JCW5hbWU9IiVKU1BfRGlyZWN0aXZlX1ZhbGlkYXRvci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLQkJPHZhbGlkYXRvcj4KLQkJCTxwcm9qZWN0TmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNwIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcGYiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNmIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzdiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qdHBsIj4KLQkJCTwvZmlsdGVyPgotCQkJPGhlbHBlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQiPgotCQkJPC9oZWxwZXI+Ci0JCQk8cnVuCi0JCQkJZW5hYmxlZD0idHJ1ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRGlyZWN0aXZlVmFsaWRhdG9yIj4KLQkJCTwvcnVuPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIHNvdXJjZSAoYXMgeW91IHR5cGUpIHZhbGlkYXRpb24gZm9yIEpTUCBKYXZhCQkJCSAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEphdmFWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5qc3Bzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5ERUZBVUxUX0pTUCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5KQVZBIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULkRFTElNSVRFUiI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIHNvdXJjZSB2YWxpZGF0aW9uIGZvciBKU1AgRUwJCQkJICAgCQkJCQkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEVMVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuanNwZWxzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSlNQX0VMIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgZGlyZWN0aXZlCQkJICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRGlyZWN0aXZlVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudGxkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZWxUcmFuc2xhdG9yIj4KLSAgICAgICA8ZWxUcmFuc2xhdG9yCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMVHJhbnNsYXRvciIKLSAgICAgICAgICBuYW1lPSJEZWZhdWx0IEpTUCAyLjAgRUwgVHJhbnNsYXRvciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5kZWZhdWx0SlNQMjAiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gbWluaW1hbCBjb250ZW50LXR5cGUgY3NzIGpzcCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgICAgPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJqc3AiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVjb250ZW50VHlwZUNTU0pTUE5hbWUiCi0JCQlpZD0iY3NzanNwc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotICAgICAgICA8Y29udGVudC10eXBlCi0JICAgICAgICBmaWxlLWV4dGVuc2lvbnM9ImpzcGYiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVjb250ZW50VHlwZUNTU0pTUEZOYW1lIgotCQkJaWQ9ImNzc2pzcGZyYWdtZW50c291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1BlZENTUyIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1BlZENTUyIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlY29udGVudFR5cGVDU1NEb2N1bWVudEZhY3RvcnlOYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50U2V0dXAiCi0JCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmRvY3VtZW50c2V0dXAiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0pTUF9Eb2N1bWVudF9TZXR1cF9wYXJ0aWNpcGFudC5uYW1lIj4KLQkJPHBhcnRpY2lwYW50Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUGVkQ1NTVGFnbGliQ29udHJvbGxlciIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudGZhY3Rvcmllcy5mcmFnbWVudCIKLQkJbmFtZT0iJWNvbnRlbnRUeXBlQ1NTRG9jdW1lbnRGYWN0b3J5TmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4JCi0JLS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NjaGVtYS9lbHRyYW5zbGF0b3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NjaGVtYS9lbHRyYW5zbGF0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlNDEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zY2hlbWEvZWx0cmFuc2xhdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiIGlkPSJlbFRyYW5zbGF0b3IiIG5hbWU9IkpTUCBFTCBUcmFuc2xhdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBjdXN0b21lciBKU1AgRXhwcmVzc2lvbiBMYW5ndWFnZSBHZW5lcmF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVsVHJhbnNsYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZWxUcmFuc2xhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgRUwgVHJhbnNsYXRvci4gIE11c3QgYmUgYW4gaW1wbGVtZW50b3Igb2Ygb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLklKU1BFTFRyYW5zbGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgRUwgdHJhbnNsYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgYW4gRUwgVHJhbnNsYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmMwYzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0JY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQkJc3VwZXIoZGV0YWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzM1ZjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IEpTUCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0pTUF9WQUxJREFUSU5HX01FU1NBR0VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEluZGV4TWFuYWdlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEluZGV4TWFuYWdlcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9TZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRUxfU3ludGF4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMX1Rva2VuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERvY3VtZW50TG9hZGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nOwotCQotCXByaXZhdGUgSlNQQ29yZU1lc3NhZ2VzKCkgewotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpTUENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1NmJiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUEluZGV4TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliLlRhZ2xpYkhlbHBlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEpTUENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSlNQQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpTUENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gd2lsbCBiZSByZW1vdmVkLiBDdXJyZW50bHkgdXNlZCB0byBnZXQgIm1vZGVsCi0JICogICAgICAgICAgICAgcHJlZmVyZW5jZXMiLCBidXQgdGhlcmUgYXJlIG90aGVyLCBiZXR0ZXIgd2F5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpTUENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJVGFnbGliSW5kZXguc3RhcnR1cCgpOwotCQkvLyBKU1BJbmRleE1hbmFnZXIgZGVwZW5kcyBvbiBUYWdsaWJDb250cm9sbGVyLCBzbyBUYWdsaWJDb250cm9sbGVyCi0JCS8vIHNob3VsZCBiZSBzdGFydGVkIGZpcnN0Ci0JCVRhZ2xpYkNvbnRyb2xsZXIuc3RhcnR1cCgpOwotCi0JCS8vIGxpc3RlbiBmb3IgY2xhc3NwYXRoIGNoYW5nZXMKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihUYWdsaWJIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0KLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIGxpc3RlbiBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzIGtleXMKLQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zdGFydHVwKCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVubmluZyBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzCi0JCS8vIGtleXMKLQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCS8vIHN0b3AgYW55IGluZGV4aW5nCi0JCUpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNodXRkb3duKCk7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIGNsYXNzcGF0aCBjaGFuZ2VzCi0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoVGFnbGliSGVscGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpKTsKLQotCQkvLyBzdG9wIHRhZ2xpYiBjb250cm9sbGVyCi0JCVRhZ2xpYkNvbnRyb2xsZXIuc2h1dGRvd24oKTsKLQkJVGFnbGliSW5kZXguc2h1dGRvd24oKTsKLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGE5ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSlNQSW5kZXhNYW5hZ2VyXzA9VXBkYXRpbmcgSlNQIEluZGV4Ci1KU1BJbmRleE1hbmFnZXJfMj1KU1AgSW5kZXhlciBpbmRleGluZyB7MH0gZmlsZXMKLUpTUF9TZWFyY2g9SlNQIFNlYXJjaCAtIAotSlNQRG9jdW1lbnRMb2FkZXJfMT1Qcm9ncmFtIEVycm9yOiBzdHJ1Y3R1cmVkIG1vZGVsIGhhZCBubyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLUpTUEVMX1N5bnRheD1FTCBTeW50YXggRXJyb3IgCi1KU1BFTF9Ub2tlbj1VbmFibGUgdG8gYW5hbHlzZSBFTCBleHByZXNzaW9uIGR1ZSB0byBsZXhpY2FsIGFuYWx5c2lzIGVycm9yCi1NRVNTQUdFX0pTUF9WQUxJREFUSU5HX01FU1NBR0VfVUlfPUpTUCBWYWxpZGF0b3IgdmFsaWRhdGluZyB7MH0KLUpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc9VXBkYXRpbmcgSlNQIEZyYWdtZW50IENvbnRlbnQgU2V0dGluZ3MKLUpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc9UHJvYmxlbSBzYXZpbmcgSlNQIEZyYWdtZW50IENvbnRlbnQgU2V0dGluZ3MgZm9yIHswfQotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzA9UmVzZXJ2ZWQgcHJlZml4ICAnCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMj1EdXBsaWNhdGUgcHJlZml4ICAnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3YTlhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYgZGVzaXJlZCwKLSAqIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzIHBsdWdpbi4gT3RoZXIKLSAqIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiBAcGFyYW0gbGV2ZWwgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50V3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudFdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzk4MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50V3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNQ29udGVudFdyYXBwZXJJbXBsIGV4dGVuZHMgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTUNvbnRlbnQgewotCi0JcHJpdmF0ZSBDTUNvbnRlbnQgZkNNQ29udGVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUNvbnRlbnRXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50V3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQgbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCQlmQ01Db250ZW50ID0gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBmQ01Db250ZW50LmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gZkNNQ29udGVudC5nZXRNaW5PY2N1cigpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZDTUNvbnRlbnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRXcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjI3YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIENNRG9jdW1lbnRXcmFwcGVySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnQsIENNTm9kZVdyYXBwZXIgewotCi0JY2xhc3MgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0JCXByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlIYXNodGFibGUgZ2V0SGFzaHRhYmxlKCkgewotCQkJcmV0dXJuIHRhYmxlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gdGFibGUuc2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiAoQ01Ob2RlKSB0YWJsZS5nZXQobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCWludCBzaXplID0gdGFibGUuc2l6ZSgpOwotCQkJaWYgKGluZGV4IDwgc2l6ZSkgewotCQkJCUl0ZXJhdG9yIHZhbHVlcyA9IGl0ZXJhdG9yKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZXg7IGkrKykgewotCQkJCQlyZXN1bHQgPSB2YWx1ZXMubmV4dCgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoQ01Ob2RlKSByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGFOb2RlKSB7Ci0JCQlpZiAobmFtZSAhPSBudWxsICYmIGFOb2RlICE9IG51bGwpCi0JCQkJdGFibGUucHV0KG5hbWUsIGFOb2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDTU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cyBDTU5hbWVzcGFjZSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gQ01Eb2N1bWVudFdyYXBwZXJJbXBsLnRoaXMuZ2V0VVJJKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIENNTm9kZS5OQU1FX1NQQUNFOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCQlyZXR1cm4gQ01Eb2N1bWVudFdyYXBwZXJJbXBsLnRoaXMuZ2V0UHJlZml4KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCXJldHVybiBDTURvY3VtZW50V3JhcHBlckltcGwudGhpcy5nZXRVUkkoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBmZWF0dXJlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgQ01OYW1lZE5vZGVNYXAgZkVsZW1lbnRzID0gbnVsbDsKLQlwcml2YXRlIENNTmFtZWROb2RlTWFwIGZFbnRpdGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBDTU5hbWVzcGFjZSBmTmFtZXNwYWNlID0gbmV3IENNTmFtZXNwYWNlSW1wbCgpOwotCXByaXZhdGUgU3RyaW5nIGZQcmVmaXg7Ci0JcHJpdmF0ZSBTdHJpbmcgZlVSSTsKLQotCXB1YmxpYyBDTURvY3VtZW50V3JhcHBlckltcGwoU3RyaW5nIG5ld1VSSSwgU3RyaW5nIG5ld1ByZWZpeCwgQ01Eb2N1bWVudCB0bGQpIHsKLQkJZlVSSSA9IG5ld1VSSTsKLQkJZlByZWZpeCA9IG5ld1ByZWZpeDsKLQkJZkRvY3VtZW50ID0gdGxkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCWlmIChmRWxlbWVudHMgPT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50cygpLml0ZW0oaSkpOwotCQkJCWVsZW1lbnRzLnNldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpLCBlZCk7Ci0JCQl9Ci0JCQlmRWxlbWVudHMgPSBlbGVtZW50czsKLQkJfQotCQlyZXR1cm4gZkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIGdldEVudGl0aWVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCWlmIChmRW50aXRpZXMgPT0gbnVsbCkgewotCQkJZkVudGl0aWVzID0gZ2V0RG9jdW1lbnQoKS5nZXRFbnRpdGllcygpOwotCQl9Ci0JCXJldHVybiBmRW50aXRpZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZk5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5nZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIGZQcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCgpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiBmVVJJOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM2OGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsIGV4dGVuZHMgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0JcHJpdmF0ZSBDTUNvbnRlbnQgZkNNQ29udGVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZkVsZW1lbnREZWNsID0gbnVsbDsKLQotCS8qKgotCSAqIENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwcmVmaXggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgQ01FbGVtZW50RGVjbGFyYXRpb24gbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCQlmRWxlbWVudERlY2wgPSBub2RlOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDTUNvbnRlbnQgbWV0aG9kCi0JICogQHJldHVybiBDTUNvbnRlbnQKLQkgKgotCSAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQncyBjb250ZW50IG1vZGVsLgotCSAqIFRoaXMgY2FuIGJlIGFuIENNRWxlbWVudERlY2xhcmF0aW9uIG9yIGEgQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJaWYgKGZDTUNvbnRlbnQgPT0gbnVsbCkgewotCQkJQ01Db250ZW50IGNvbnRlbnQgPSBmRWxlbWVudERlY2wuZ2V0Q29udGVudCgpOwotCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cCkKLQkJCQlmQ01Db250ZW50ID0gbmV3IENNR3JvdXBXcmFwcGVySW1wbChmUHJlZml4LCAoQ01Hcm91cCkgY29udGVudCk7Ci0JCQllbHNlCi0JCQkJZkNNQ29udGVudCA9IG5ldyBDTUNvbnRlbnRXcmFwcGVySW1wbChmUHJlZml4LCBjb250ZW50KTsKLQkJfQotCQlyZXR1cm4gZkNNQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXREYXRhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbG9jYWxseSBkZWZpbmVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldExvY2FsRWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0TWF4T2NjdXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4KLQkgKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0TWluT2NjdXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2w7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cFdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNGM1NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNR3JvdXBXcmFwcGVySW1wbCBleHRlbmRzIENNQ29udGVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Hcm91cCB7Ci0JY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IHsKLQkJcHJpdmF0ZSBMaXN0IG5vZGVzID0gbnVsbDsKLQotCQkvKioKLQkJICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCQlub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhcHBlbmRJdGVtKENNTm9kZSBub2RlKSB7Ci0JCQlub2Rlcy5hZGQobm9kZSk7Ci0JCX0KLQotCQkvKioKLQkJICogZ2V0TGVuZ3RoIG1ldGhvZAotCQkgKiBAcmV0dXJuIGludAotCQkgKi8KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGl0ZW0gbWV0aG9kCi0JCSAqIEByZXR1cm4gQ01Ob2RlCi0JCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkJICovCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTU5vZGUpIG5vZGVzLmdldChpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNTm9kZUxpc3QgZkNoaWxkTm9kZXMgPSBudWxsOwotCXByaXZhdGUgQ01Hcm91cCBmR3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogQ01Hcm91cFdyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gcHJlZml4IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbm9kZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUdyb3VwV3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgQ01Hcm91cCBub2RlKSB7Ci0JCXN1cGVyKHByZWZpeCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hpbGROb2RlcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZUxpc3QKLQkgKgotCSAqIFJldHVybnMgY2hpbGQgQ01Ob2RlTGlzdCwgd2hpY2ggaW5jbHVkZXMgRWxlbWVudERlZmluaXRpb24gb3IgQ01FbGVtZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlDTU5vZGVMaXN0SW1wbCBjaGlsZE5vZGVzID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gZkdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ01Hcm91cCkKLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTUdyb3VwV3JhcHBlckltcGwoZlByZWZpeCwgKENNR3JvdXApIGNoaWxkKSk7Ci0JCQkJZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikKLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpKTsKLQkJCQllbHNlCi0JCQkJCS8vIGVycm9yPwotCQkJCQljaGlsZE5vZGVzLmFwcGVuZEl0ZW0obmV3IENNTm9kZVdyYXBwZXJJbXBsKGZQcmVmaXgsIGNoaWxkKSk7Ci0JCQl9Ci0JCQlmQ2hpbGROb2RlcyA9IGNoaWxkTm9kZXM7Ci0JCX0KLQkJcmV0dXJuIGZDaGlsZE5vZGVzOwotCX0KLQotCS8qKgotCSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFMT05FIChhKSwgU0VRVUVOQ0UgKGEsYiksIENIT0lDRSAoYXxiKSwgQUxMIChhJmIpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBmR3JvdXAuZ2V0T3BlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmR3JvdXA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjExN2ZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTU5vZGUsIENNTm9kZVdyYXBwZXIgewotCXByaXZhdGUgQ01Ob2RlIGZOb2RlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTm9kZU5hbWUgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBmUHJlZml4ID0gbnVsbDsKLQotCS8qKgotCSAqIENNTm9kZVdyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlV3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgQ01Ob2RlIG5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJZlByZWZpeCA9IHByZWZpeDsKLQkJZk5vZGUgPSBub2RlOwotCi0JCWZOb2RlTmFtZSA9IGZQcmVmaXggKyAiOiIgKyBmTm9kZS5nZXROb2RlTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGZOb2RlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIGZOb2RlLmdldE5vZGVUeXBlKCk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRPcmlnaW5Ob2RlKCkgewotCQlyZXR1cm4gZk5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmTm9kZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZOb2RlLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzVlMWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGZhY3RvcnkgZm9yIEpTUCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKU1BDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlzdGF0aWMgY2xhc3MgQ01Eb2NJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0JCXB1YmxpYyBDTURvY0ltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBqY20gPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUpOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gamNtLmdldE5vZGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIGpjbS5nZXROb2RlVHlwZSgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIGpjbS5nZXRFbGVtZW50cygpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQkJcmV0dXJuIGpjbS5nZXRFbnRpdGllcygpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJCXJldHVybiBqY20uZ2V0TmFtZXNwYWNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBteWNtOwotCi0JcHJpdmF0ZSBKU1BDTURvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJaWYgKG15Y20gPT0gbnVsbCkgewotCQkJbXljbSA9IG5ldyBDTURvY0ltcGwoKTsKLQkJfQotCQlyZXR1cm4gbXljbTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliQ29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ2xpYkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJJbmRleExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogUHJvdmlkZXMgYSBkaXJlY3QgbWFwcGluZyBmcm9tIElTdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gc3VwcG9ydGluZwotICogVExEQ01Eb2N1bWVudE1hbmFnZXIuCi0gKiAKLSAqIExpc3RlbnMgdG8gdGhlIGNyZWF0aW9uIG9mIEpTUCB0eXBlIFRleHRGaWxlQnVmZmVycyBhbmQgZm9yY2VzIGEgdGV4dC1sZXNzCi0gKiByZXBhcnNlIGFmdGVyIGNvbm5lY3RpbmcgdGFnbGliLXN1cHBvcnRpbmcgbGlzdGVuZXJzLiBDb25uZWN0aW5nIHRoZQotICogbGlzdGVuZXJzIGJlZm9yZSB0aGUgdGV4dCBpcyBzZXQgd291bGQgYmUgaWRlYWwsIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8KLSAqIGxvb2sgdXAgdGFnbGliIHJlZmVyZW5jZXMgc2luY2UgdGhlIGxvY2F0aW9uIGlzIG5vdCB5ZXQga25vd2FibGUuIFNpbmNlCi0gKiB0YWdsaWJzIGNhbiBhZmZlY3QgdGhlIHBhcnNpbmcgb2YgdGhlIGRvY3VtZW50LCBhIHJlcGFyc2UgaXMgY3VycmVudGx5Ci0gKiByZXF1aXJlZCB0byByZWFjdCB0byBjdXN0b20gdGFncyB3aXRoIHRhZ2RlcGVuZGVudCBjb250ZW50LgotICogCi0gKiBUT0RPOiBSZW1vdmUgdGhlIHJlcGFyc2UgcGVuYWx0eS4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkNvbnRyb2xsZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50IHsKLQotCWNsYXNzIERvY3VtZW50SW5mbyBpbXBsZW1lbnRzIElUYWdsaWJJbmRleExpc3RlbmVyIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudDsKLQkJSVRleHRGaWxlQnVmZmVyIHRleHRGaWxlQnVmZmVyOwotCQlUTERDTURvY3VtZW50TWFuYWdlciB0bGREb2N1bWVudE1hbmFnZXI7Ci0KLQkJcHVibGljIHZvaWQgaW5kZXhDaGFuZ2VkKElUYWdsaWJSZWNvcmRFdmVudCBldmVudCkgewotCQkJaW50IHR5cGUgPSBldmVudC5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBJVGFnbGliUmVjb3JkRXZlbnQuQ0hBTkdFRCB8fCB0eXBlID09IElUYWdsaWJSZWNvcmRFdmVudC5SRU1PVkVEKSB7Ci0JCQkJT2JqZWN0IGtleSA9IFRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFVuaXF1ZUlkZW50aWZpZXIoZXZlbnQuZ2V0VGFnbGliUmVjb3JkKCkpOwotCQkJCWlmICh0bGREb2N1bWVudE1hbmFnZXIuZ2V0RG9jdW1lbnRzKCkuY29udGFpbnNLZXkoa2V5KSkgewotCQkJCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgY2xlYXJlZCBpdHMgcHJpdmF0ZSBDTURvY3VtZW50IGNhY2hlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0bGREb2N1bWVudE1hbmFnZXIuZ2V0RG9jdW1lbnRzKCkucmVtb3ZlKGtleSk7Ci0JCQkJCXRsZERvY3VtZW50TWFuYWdlci5nZXRTb3VyY2VQYXJzZXIoKS5yZXNldEhhbmRsZXJzKCk7Ci0KLQkJCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5yZXBhcnNlKHRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGxkRG9jdW1lbnRNYW5hZ2VyLmluZGV4Q2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDYWNoZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQljbGFzcyBGaWxlQnVmZmVyTGlzdGVuZXIgaW1wbGVtZW50cyBJRmlsZUJ1ZmZlckxpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNidWZmZXJDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckNvbnRlbnRSZXBsYWNlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudFJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyQ3JlYXRlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVmZmVyQ3JlYXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpOwotCQkJCS8vIGlnbm9yZSBub24tSlNQIGRvY3VtZW50cwotCQkJCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCQkJaWYgKCFfaW5zdGFuY2UuZkpTUGRvY3VtZW50cy5jb250YWlucyhkb2N1bWVudCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUFzc2VydC5pc1RydWUoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50LCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgU2V0dXBQYXJ0aWNpcGFudCB3YXMgY2FsbGVkIGZvciBub24tSVN0cnVjdHVyZWREb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7Ci0JCQkJaW5mby5kb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQkJCQlpbmZvLnRleHRGaWxlQnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyID0gbmV3IFRMRENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaW5mby50bGREb2N1bWVudE1hbmFnZXIuc2V0U291cmNlUGFyc2VyKChKU1BTb3VyY2VQYXJzZXIpIGluZm8uZG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkJCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJCQlfaW5zdGFuY2UuZkRvY3VtZW50TWFwLnB1dChkb2N1bWVudCwgaW5mbyk7Ci0JCQkJfQotCQkJCVRhZ2xpYkluZGV4LmFkZFRhZ2xpYkluZGV4TGlzdGVuZXIoaW5mbyk7Ci0JCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnJlcGFyc2UodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyRGlzcG9zZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckRpc3Bvc2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9ICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCk7Ci0JCQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkpTUGRvY3VtZW50cykgewotCQkJCQlpZiAoIV9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzLnJlbW92ZShkb2N1bWVudCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJRG9jdW1lbnRJbmZvIGluZm8gPSBudWxsOwotCQkJc3luY2hyb25pemVkIChmRG9jdW1lbnRNYXApIHsKLQkJCQlPYmplY3RbXSBrZXlzID0gZkRvY3VtZW50TWFwLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoa2V5c1tpXSk7Ci0JCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby50ZXh0RmlsZUJ1ZmZlci5lcXVhbHMoYnVmZmVyKSkgewotCQkJCQkJZkRvY3VtZW50TWFwLnJlbW92ZShrZXlzW2ldKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyLmNsZWFyQ2FjaGUoKTsKLQkJCQlUYWdsaWJJbmRleC5yZW1vdmVUYWdsaWJJbmRleExpc3RlbmVyKGluZm8pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjZGlydHlTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlciwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlydHlTdGF0ZUNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzRGlydHkpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3N0YXRlQ2hhbmdlRmFpbGVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZUZhaWxlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3N0YXRlQ2hhbmdpbmcob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdpbmcoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNzdGF0ZVZhbGlkYXRpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXRlVmFsaWRhdGlvbkNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzU3RhdGVWYWxpZGF0ZWQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3VuZGVybHlpbmdGaWxlRGVsZXRlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVEZWxldGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjdW5kZXJseWluZ0ZpbGVNb3ZlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlTW92ZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBJUGF0aCBwYXRoKSB7Ci0JCX0KLQotCi0JfQotCi0Jc3RhdGljIFRhZ2xpYkNvbnRyb2xsZXIgX2luc3RhbmNlID0gbnVsbDsKLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGZJc1NodXRkb3duID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIElUZXh0RmlsZUJ1ZmZlciBnZXRGaWxlQnVmZmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgX2luc3RhbmNlLmZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCQlyZXR1cm4gaW5mby50ZXh0RmlsZUJ1ZmZlcjsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1hbmFnZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVGV4dEZpbGVCdWZmZXIgZ2V0RmlsZUJ1ZmZlcihUTERDTURvY3VtZW50TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCS8vIGlmIF9pbnN0YW5jZSBpcyBudWxsLCB3ZSBhcmUgYWxyZWFkeSBzaHV0dGluZyBkb253Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCUl0ZXJhdG9yIGRvY0luZm9zID0gX2luc3RhbmNlLmZEb2N1bWVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGRvY0luZm9zLmhhc05leHQoKSAmJiBidWZmZXIgPT0gbnVsbCkgewotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZG9jSW5mb3MubmV4dCgpOwotCQkJCWlmIChpbmZvLnRsZERvY3VtZW50TWFuYWdlci5lcXVhbHMobWFuYWdlcikpCi0JCQkJCWJ1ZmZlciA9IGluZm8udGV4dEZpbGVCdWZmZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZiBfaW5zdGFuY2UgaXMgbnVsbCwgd2UgYXJlIGFscmVhZHkgc2h1dHRpbmcgZG9udwotCQlpZiAoX2luc3RhbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJcmV0dXJuIGluZm8udGxkRG9jdW1lbnRNYW5hZ2VyOwotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2h1dGRvd24oKSB7Ci0JCXJldHVybiBmSXNTaHV0ZG93bjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTaHV0ZG93bihib29sZWFuIGlzU2h1dGRvd24pIHsKLQkJZklzU2h1dGRvd24gPSBpc1NodXRkb3duOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXNldFNodXRkb3duKHRydWUpOwotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5yZW1vdmVGaWxlQnVmZmVyTGlzdGVuZXIoX2luc3RhbmNlLmZCdWZmZXJMaXN0ZW5lcik7Ci0JCV9pbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBUYWdsaWJDb250cm9sbGVyKCk7Ci0JCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5hZGRGaWxlQnVmZmVyTGlzdGVuZXIoX2luc3RhbmNlLmZCdWZmZXJMaXN0ZW5lcik7Ci0JCX0KLQkJc2V0U2h1dGRvd24oZmFsc2UpOwotCX0KLQotCUlGaWxlQnVmZmVyTGlzdGVuZXIgZkJ1ZmZlckxpc3RlbmVyOwotCi0JTWFwIGZEb2N1bWVudE1hcDsKLQotCUxpc3QgZkpTUGRvY3VtZW50czsKLQotCS8qCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyBvbmx5IHRvIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBGaWxlQnVmZmVyCi0JICogZnJhbWV3b3JrCi0JICovCi0JcHVibGljIFRhZ2xpYkNvbnRyb2xsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZCdWZmZXJMaXN0ZW5lciA9IG5ldyBGaWxlQnVmZmVyTGlzdGVuZXIoKTsKLQkJZkpTUGRvY3VtZW50cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZEb2N1bWVudE1hcCA9IG5ldyBIYXNoTWFwKDEpOwotCX0KLQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHRvIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBGaWxlQnVmZmVyIGZyYW1ld29yawotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCNzZXR1cChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gaWYgd2UndmUgYWxyZWFkeSBzaHV0ZG93biwganVzdCBpZ25vcmUKLQkJaWYgKGlzU2h1dGRvd24oKSkKLQkJCXJldHVybjsKLQkJLy8gcmVmZXJlbmNlIHRoZSBzaGFyZWQgaW5zdGFuY2UncyBkb2N1bWVudHMgZGlyZWN0bHkKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkpTUGRvY3VtZW50cykgewotCQkJX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMuYWRkKGRvY3VtZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTk5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgaW1wbGVtZW50cyBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIENNRGF0YVR5cGUgYXR0clR5cGUgPSBuZXcgQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCQotCS8vCi0JcHJpdmF0ZSBib29sZWFuIGZJc0ZyYWdtZW50ID0gZmFsc2U7Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQ7Ci0JLy8gb3B0aW9uYWwgaWQKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0KLQkvLyByZXF1aXJlZCBuYW1lCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JLy8gb3B0aW9uYWwgInJlcXVpcmVkIiBlbGVtZW50IHByZXNlbnQsIGRlZmF1bHRzIHRvIG5vdCBwcmVzZW50Ci0JcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkID0gZmFsc2U7Ci0JCi0JLy8gb3B0aW9uYWwgcnVuLXRpbWUgKHNjcmlwbGV0IGRlcml2ZWQpIHZhbHVlIG9mIGF0dHJpYnV0ZXMsIGRlZmF1bHRzIHRvIG5vbmUvZmFsc2UKLQlwcml2YXRlIFN0cmluZyBydGV4cHJ2YWx1ZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIGF0dHJUeXBlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMREF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldE93bmVyRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmT3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZSAhPSBudWxsICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikpIHsKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOyAvLyByZXR1cm4gYXR0cmlidXRlIGRlc2NyaXB0aW9uCi0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSkgewotCQkJcmV0dXJuIFRMRERvY3VtZW50LkpTUF9UTEQ7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSkgewotCQkJcmV0dXJuIGdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJ0ZXhwcnZhbHVlKCkgewotCQlyZXR1cm4gcnRleHBydmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRVc2FnZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqIE9QVElPTkFMfFJFUVVJUkVECi0JICovCi0JcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkID8gUkVRVUlSRUQgOiBPUFRJT05BTDsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0ZyYWdtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCXJldHVybiBmSXNGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVxdWlyZWQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGlzRnJhZ21lbnQgVGhlIGlzRnJhZ21lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyYWdtZW50KGJvb2xlYW4gaXNGcmFnbWVudCkgewotCQlmSXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0lkIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJaWQgPSBuZXdJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCW5hbWUgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1JlcXVpcmVkIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIG5ld1JlcXVpcmVkKSB7Ci0JCXJlcXVpcmVkID0gbmV3UmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1JlcXVpcmVkIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZFN0cmluZyhTdHJpbmcgbmV3UmVxdWlyZWQpIHsKLQkJaWYgKG5ld1JlcXVpcmVkLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSB8fCBuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSkgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXNldFJlcXVpcmVkKHRydWUpOwotCQllbHNlIGlmIChuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpIHx8IG5ld1JlcXVpcmVkLmVxdWFsc0lnbm9yZUNhc2UoIm5vIikpIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlzZXRSZXF1aXJlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1J0ZXhwcnZhbHVlIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdGV4cHJ2YWx1ZShTdHJpbmcgbmV3UnRleHBydmFsdWUpIHsKLQkJcnRleHBydmFsdWUgPSBuZXdSdGV4cHJ2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVExERG9jdW1lbnQuQ01fS0lORCkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0ICIgKyBzdXBlci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROb2RlTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9vbGVhbi50b1N0cmluZyhib29sZWFuKSBpcyBpbnRyb2R1Y2VkIGluIDEuNAotCQkvL2J1ZmZlci5hcHBlbmQoIlxuXHQgcmVxdWlyZWQ6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShCb29sZWFuLnRvU3RyaW5nKGlzUmVxdWlyZWQoKSkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCByZXF1aXJlZDoiICsgU3RyaW5nVXRpbHMudG9TdHJpbmcoaXNSZXF1aXJlZCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBydGV4cHI6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRSdGV4cHJ2YWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGdldElkKCkgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHQgaWQ6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRJZCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmUwODE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01EYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGVOYW1lOwotCi0JcHVibGljIENNRGF0YVR5cGVJbXBsKFN0cmluZyBkYXRhVHlwZU5hbWUpIHsKLQkJdGhpcy5kYXRhVHlwZU5hbWUgPSBkYXRhVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICoKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotCSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0JICoKLQkgKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEltcGxpZWRWYWx1ZUtpbmQgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQsIElNUExJRURfVkFMVUVfREVGQVVMVC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKSB7Ci0JCXJldHVybiBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjcmliZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEZhY3RvcnlUTEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50RmFjdG9yeVRMRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmEzOGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50RmFjdG9yeVRMRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AyMFRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklKYXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVExEUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklVUkxSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIENNRG9jdW1lbnRCdWlsZGVyIGZvciBUYWdsaWIgRGVzY3JpcHRvcnMKLSAqIAotICogUmV0dXJucyBuYW1lc3BhY2UtbGVzcyBDTURvY3VtZW50cyBmb3IgYSB0YWdsaWIgZGVzY3JpcHRvciwgbG9hZGluZyBpdAotICogZGlyZWN0bHkgZnJvbSBhIGZpbGUgb3IgZXh0cmFjdGVkIGZyb20gYSBKQVIgYXJjaGl2ZS4gQ29udGVudCBNb2RlbCBvYmplY3RzCi0gKiB3aWxsIGltcGxlbWVudCB0aGUgVExEQ01Eb2N1bWVudCwgVExERWxlbWVudERlY2xhcmF0aW9uLCBhbmQKLSAqIFRMREF0dHJpYnV0ZURlY2xhcmF0aW9uIGludGVyZmFjZXMgZm9yIGV4dGVuZGVkIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVRMRCBpbXBsZW1lbnRzIENNRG9jdW1lbnRGYWN0b3J5IHsKLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9mYWN0b3J5IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIENNRG9jdW1lbnRGYWN0b3J5VExEIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnRGYWN0b3J5VExEKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5PVCBBUEkKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZWxvY2F0aW9uCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgYmFzZWxvY2F0aW9uLCBJbnB1dFN0cmVhbSBpbnB1dCkgewotCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZShKU1AxMVRMRE5hbWVzLlRBR0xJQik7Ci0JCXByb3ZpZGVyLnNldElucHV0U3RyZWFtKGlucHV0KTsKLQkJaWYgKGJhc2Vsb2NhdGlvbiAhPSBudWxsKQotCQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZShiYXNlbG9jYXRpb24pOwotCQlyZXR1cm4gbG9hZERvY3VtZW50KGJhc2Vsb2NhdGlvbiwgcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGltcGxlbWVudGVkOiB0YWdkaXIgbG9hZGluZyBmb3IgIiArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudEZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQkvLyBsb2FkIHRoZSB0YWdsaWIgZGVzY3JpcHRvciBmaWxlCi0JCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZShmaWxlTmFtZSk7Ci0JCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZShKU1AxMVRMRE5hbWVzLlRBR0xJQik7Ci0JCXByb3ZpZGVyLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJTm9kZSByb290RWxlbWVudCA9IHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCk7Ci0JCXJldHVybiBsb2FkRG9jdW1lbnQoZmlsZU5hbWUsIHJvb3RFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50IGFzc3VtaW5nIHRoZSBKU1AgdjEuMSBkZWZhdWx0IHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gamFyRmlsZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5pbmcgSkFSIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnRGcm9tSmFyKFN0cmluZyBqYXJGaWxlTmFtZSkgewotCQkvLyBsb2FkIHRoZSB0YWdsaWIgZGVzY3JpcHRvciBmaWxlCi0JCXJldHVybiBidWlsZENNRG9jdW1lbnRGcm9tSmFyKGphckZpbGVOYW1lLCBKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGphckZpbGVOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb250YWluaW5nIEpBUiBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnRGaWxlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgcGF0aCB3aXRoaW4gdGhlIEpBUiBmb3IgYSB2YWxpZCB0YWdsaWIgZGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoU3RyaW5nIGphckZpbGVOYW1lLCBTdHJpbmcgY29udGVudEZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGphckZpbGVOYW1lKTsKLQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKEpTUDExVExETmFtZXMuVEFHTElCKTsKLQkJcHJvdmlkZXIuc2V0SmFyRmlsZU5hbWUoamFyRmlsZU5hbWUpOwotCQlwcm92aWRlci5zZXRGaWxlTmFtZShjb250ZW50RmlsZU5hbWUpOwotCQlDTURvY3VtZW50IGRvY3VtZW50ID0gbG9hZERvY3VtZW50KCJqYXI6ZmlsZTovLyIgKyBqYXJGaWxlTmFtZSArICIhIiArIGNvbnRlbnRGaWxlTmFtZSwgcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyBUT0RPOiBBZGQgdGhlIHRhZ3MgZGVjbGFyZWQgaW4gTUVUQS1JTkYvdGFncywgc2VlIEpTUCAyLjAgc2VjdGlvbgotCQkvLyA4LjQuMQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIENNQXR0cmlidXRlRGVjbGFyYXRpb24gY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgTm9kZSBhdHRyTm9kZSkgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhdHRyID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKGRvY3VtZW50KTsKLQotCQlOb2RlIGNoaWxkID0gYXR0ck5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXROb2RlTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JRCkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0SWQoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLlJFUVVJUkVEKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRSZXF1aXJlZFN0cmluZyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuUlRFWFBSVkFMVUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldFJ0ZXhwcnZhbHVlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GUkFHTUVOVCkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0RnJhZ21lbnQoQm9vbGVhbi52YWx1ZU9mKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIGEgQ01Eb2N1bWVudCBmcm9tIGEgdGFnbGliIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdXJpIC0KLQkgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiBhIHZhbGlkIHRhZ2xpYiBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVDTURvY3VtZW50RnJvbUZpbGUodXJpKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgdXJsICE9IG51bGwpIHsKLQkJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gY3JlYXRlQ01Eb2N1bWVudEZyb21GaWxlKHVybC5nZXRGaWxlKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoqCi0JCQkJICogU2tpcCBhbnl0aGluZyBlbHNlIHNpbmNlIHRyeWluZyB0byBsb2FkIGEgVExEIGZyb20gYSByZW1vdGUKLQkJCQkgKiBsb2NhdGlvbiBoYXMgdW5wcmVkaWN0YWJsZSBwZXJmb3JtYW5jZSBpbXBhY3QuCi0JCQkJICovCi0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gbmV3IENNRG9jdW1lbnRJbXBsKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50RnJvbUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQl0cnkgewotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCXJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudEZyb21EaXJlY3RvcnkoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50RnJvbUphcihmaWxlTmFtZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnRGcm9tRmlsZShmaWxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgY21kb2N1bWVudCwgRWxlbWVudCB0YWdGaWxlTm9kZSwgU3RyaW5nIHBhdGgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uSW1wbChjbWRvY3VtZW50KTsKLQkJYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0KLQkJLy8gbG9hZCBpbmZvcm1hdGlvbiBkZWNsYXJlZCB3aXRoaW4gdGhlIC50bGQKLQkJTm9kZSBjaGlsZCA9IHRhZ0ZpbGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldERpc3BsYXlOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRVhBTVBMRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldEV4YW1wbGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0U21hbGxJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQkJaGFzTmFtZSA9IGVkLmdldE5vZGVOYW1lKCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuUEFUSCkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFBhdGgoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdfRVhURU5TSU9OKSkgewotCQkJCQllZC5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJaWYgKGhhc05hbWUpIHsKLQkJCS8vIGxvYWQgaW5mb3JtYXRpb24gZGVjbGFyZWQgd2l0aGluIHRoZSAudGFnKHgpIGZpbGUKLQkJCS8vIEpTUDJfVE9ETzogaW1wbGVtZW50IGZvciBKU1AgMi4wCi0JCQlyZXR1cm4gZWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBOb2RlIHRhZ05vZGUpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uSW1wbChkb2N1bWVudCk7Ci0KLQkJTm9kZSBjaGlsZCA9IHRhZ05vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyB0YWcgaW5mb3JtYXRpb24KLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0Tm9kZU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEFHQ0xBU1MpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRBR19DTEFTUykpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRUYWdjbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5URUlDTEFTUykgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVEVJX0NMQVNTKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFRlaWNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLkJPRFlDT05URU5UKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5CT0RZX0NPTlRFTlQpKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJU3RyaW5nIGJvZHljb250ZW50ID0gZ2V0Q29udGFpbmVkVGV4dChjaGlsZCk7Ci0JCQkJCS8vIEFwcGFyZW50bHksIEFwYWNoZSBUb21jYXQgaXMgbm90IGNhc2Ugc2Vuc2l0aXZlIGFib3V0Ci0JCQkJCS8vIHRoZXNlIHZhbHVlcwotCQkJCQlpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDExVExETmFtZXMuQ09OVEVOVF9KU1ApOwotCQkJCQllbHNlIGlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpKQotCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCk7Ci0JCQkJCWVsc2UgaWYgKGJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFUTEROYW1lcy5DT05URU5UX0VNUFRZKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWSk7Ci0JCQkJCWVsc2UgaWYgKGJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoSlNQMjBUTEROYW1lcy5DT05URU5UX1NDUklQVExFU1MpKQotCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoSlNQMjBUTEROYW1lcy5DT05URU5UX1NDUklQVExFU1MpOwotCQkJCX0KLQkJCQkvLyBpbmZvICgxLjEgb25seSkgb3IgZGVzY3JpcHRpb24gKDEuMiBvbmx5KQotCQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JTkZPKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCS8vIGF0dHJpYnV0ZXMKLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5BVFRSSUJVVEUpKSB7Ci0JCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9uKGRvY3VtZW50LCBjaGlsZCk7Ci0JCQkJCWVkLmZBdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShhdHRyLmdldEF0dHJOYW1lKCksIGF0dHIpOwotCQkJCX0KLQkJCQkvLyB2YXJpYWJsZXMKLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRSkpIHsKLQkJCQkJZWQuZ2V0VmFyaWFibGVzKCkuYWRkKGNyZWF0ZVZhcmlhYmxlKGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRMYXJnZUljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0U21hbGxJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuVEFHX0VYVEVOU0lPTikgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQllZC5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXByb3RlY3RlZCBUTERGdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBOb2RlIGZ1bmN0aW9uTm9kZSkgewotCQlUTERGdW5jdGlvbkltcGwgZnVuY3Rpb24gPSBuZXcgVExERnVuY3Rpb25JbXBsKGRvY3VtZW50KTsKLQkJYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0KLQkJTm9kZSBjaGlsZCA9IGZ1bmN0aW9uTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIHRhZyBpbmZvcm1hdGlvbgotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXROYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRVhBTVBMRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldEV4YW1wbGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9DTEFTUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldENsYXNzTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZVTkNUSU9OX0VYVEVOU0lPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9TSUdOQVRVUkUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRTaWduYXR1cmUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0SWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXROYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQkJaGFzTmFtZSA9IGZ1bmN0aW9uLmdldE5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpZiAoaGFzTmFtZSkgewotCQkJcmV0dXJuIGZ1bmN0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUTERJbml0UGFyYW0gY3JlYXRlSW5pdFBhcmFtKE5vZGUgaW5pdFBhcmFtTm9kZSkgewotCQlUTERJbml0UGFyYW1JbXBsIGluaXRQYXJhbSA9IG5ldyBUTERJbml0UGFyYW1JbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSBpbml0UGFyYW1Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX1BBUkFNX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbml0UGFyYW0uc2V0TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9QQVJBTV9WQUxVRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWluaXRQYXJhbS5zZXRWYWx1ZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW5pdFBhcmFtLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExETGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoTm9kZSBsaXN0ZW5lck5vZGUpIHsKLQkJVExETGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IFRMRExpc3RlbmVySW1wbCgpOwotCQlOb2RlIGNoaWxkID0gbGlzdGVuZXJOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTElTVEVORVJfQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlsaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBUTERWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKE5vZGUgdmFsaWRhdG9yTm9kZSkgewotCQlUTERWYWxpZGF0b3JJbXBsIHZhbGlkYXRvciA9IG5ldyBUTERWYWxpZGF0b3JJbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSB2YWxpZGF0b3JOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFsaWRhdG9yLnNldFZhbGlkYXRvckNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX0lOSVRfUEFSQU0pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YWxpZGF0b3IuZ2V0SW5pdFBhcmFtcygpLmFkZChjcmVhdGVJbml0UGFyYW0oY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExEVmFyaWFibGUgY3JlYXRlVmFyaWFibGUoTm9kZSB2YXJpYWJsZU5vZGUpIHsKLQkJVExEVmFyaWFibGVJbXBsIHZhcmlhYmxlID0gbmV3IFRMRFZhcmlhYmxlSW1wbCgpOwotCQlOb2RlIGNoaWxkID0gdmFyaWFibGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXRWYXJpYWJsZUNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfREVDTEFSRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldERlY2xhcmVTdHJpbmcoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0TmFtZUZyb21BdHRyaWJ1dGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0dJVkVOKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0TmFtZUdpdmVuKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfU0NPUEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXRTY29wZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gdmFyaWFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250YWluZWRUZXh0KE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCVN0cmluZyByZWZlcmVuY2UgPSAoKEVudGl0eVJlZmVyZW5jZSkgY2hpbGQpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlID0gIiYiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQlzLmFwcGVuZChyZWZlcmVuY2UudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKS50cmltKCkpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQnVpbGRlckZvckdyYW1tYXIoU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBncmFtbWFyRmlsZU5hbWUudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIGZpbGVOYW1lLmVuZHNXaXRoKCIudGxkIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgbG9hZERvY3VtZW50KFN0cmluZyBiYXNlTG9jYXRpb24sIE5vZGUgdGFnbGliKSB7Ci0JCU5vZGUgcm9vdCA9IHRhZ2xpYjsKLQotCQkvLyBjcmVhdGUgdGhlIENNRG9jdW1lbnQKLQkJQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQgPSBuZXcgQ01Eb2N1bWVudEltcGwoKTsKLQkJZG9jdW1lbnQuc2V0QmFzZUxvY2F0aW9uKGJhc2VMb2NhdGlvbik7Ci0KLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibnVsbCBcInRhZ2xpYlwiIGVsZW1lbnQgZm9yIFRMRCAiICsgYmFzZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGRvY3VtZW50OwotCQl9Ci0KLQkJLy8gcG9wdWxhdGUgdGhlIENNRG9jdW1lbnQKLQkJTm9kZSBjaGlsZCA9IHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJLy8gdGFnCi0JCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEFHKSkgewotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gY3JlYXRlRWxlbWVudERlY2xhcmF0aW9uKGRvY3VtZW50LCBjaGlsZCk7Ci0JCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnQuZkVsZW1lbnRzLnNldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpLCBlZCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGFnLWZpbGUKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR19GSUxFKSAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCUVsZW1lbnQgdGFnRmlsZUVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQkJU3RyaW5nIHBhdGggPSB0YWdGaWxlRWxlbWVudC5nZXRBdHRyaWJ1dGUoSlNQMjBUTEROYW1lcy5QQVRIKTsKLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgdGFnRmlsZUVsZW1lbnQsIHBhdGgpOwotCQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIG90aGVyIG9uZS1vZi1hLWtpbmQgY2hpbGRyZW4KLQkJCS8vIEpTUCB2ZXJzaW9uCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSlNQVkVSU0lPTikgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuSlNQX1ZFUlNJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRKc3B2ZXJzaW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHRhZyBsaWJyYXJ5IHZlcnNpb24KLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UTElCVkVSU0lPTikgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVExJQl9WRVJTSU9OKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0VGxpYnZlcnNpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gc2hvcnQgbmFtZQotCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlNIT1JUTkFNRSkgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU0hPUlRfTkFNRSkpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldFNob3J0bmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBVUkkvVVJOCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVVJJKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5VUk4pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWRvY3VtZW50LnNldFVyaShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBpbmZvCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JTkZPKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRJbmZvKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIE5ldyBKU1AgMS4yCi0JCQkvLyBkZXNjcmlwdGlvbgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKSB7Ci0JCQkJZG9jdW1lbnQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gZGlzcGxheSBuYW1lCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldERpc3BsYXlOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGxhcmdlIGljb24KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldExhcmdlSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBzbWFsbCBpY29uCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRTbWFsbEljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gdmFsaWRhdG9yCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQUxJREFUT1IpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0VmFsaWRhdG9yKGNyZWF0ZVZhbGlkYXRvcihjaGlsZCkpOwotCQkJfQotCQkJLy8gbGlzdGVuZXIKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxJU1RFTkVSKSkgewotCQkJCWRvY3VtZW50LmdldExpc3RlbmVycygpLmFkZChjcmVhdGVMaXN0ZW5lcihjaGlsZCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRlVOQ1RJT04pKSB7Ci0JCQkJVExERnVuY3Rpb24gZnVuY3Rpb24gPSBjcmVhdGVGdW5jdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCWlmIChmdW5jdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50LmdldEZ1bmN0aW9ucygpLmFkZChmdW5jdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuVEFHTElCX0VYVEVOU0lPTikpIHsKLQkJCQlkb2N1bWVudC5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCX0KLQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UpIHsKLQkJQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJSVJlc291cmNlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVjb3JkLmdldFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50ID0gKENNRG9jdW1lbnRJbXBsKSBidWlsZENNRG9jdW1lbnRGcm9tRmlsZShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChfZGVidWcgJiYgZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXRFbGVtZW50cygpLmdldExlbmd0aCgpID09IDApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmFpbHVyZSBwYXJzaW5nICIgKyByZWNvcmQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBpY29uUGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUoKChUTEREb2N1bWVudCkgZG9jdW1lbnQpLmdldFNtYWxsSWNvbigpLCBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OLCAiZmlsZToiICsgaWNvblBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGRvY3VtZW50LmdldExhcmdlSWNvbigpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBpY29uUGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUoKChUTEREb2N1bWVudCkgZG9jdW1lbnQpLmdldExhcmdlSWNvbigpLCBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLCAiZmlsZToiICsgaWNvblBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWRvY3VtZW50ID0gKENNRG9jdW1lbnRJbXBsKSBidWlsZENNRG9jdW1lbnRGcm9tSmFyKHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCWlmIChkb2N1bWVudC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpY29uUGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUoKChUTEREb2N1bWVudCkgZG9jdW1lbnQpLmdldFNtYWxsSWNvbigpLCByZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiFNRVRBLUlORi8iLCAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OLCAiamFyOmZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGFyZ2VJY29uKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRMYXJnZUljb24oKSwgcmVjb3JkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIhTUVUQS1JTkYvIiwgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTiwgImphcjpmaWxlOiIgKyBpY29uUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmFpbHVyZSBwYXJzaW5nICIgKyByZWNvcmQuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRBR0RJUikgOiB7Ci0JCQkJLy8gVGFnRGlyUmVjb3JkIHJlY29yZCA9IChUYWdEaXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQkvLyBkb2N1bWVudCA9Ci0JCQkJLy8gYnVpbGRDTURvY3VtZW50RnJvbURpcmVjdG9yeShyZWNvcmQuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCUlucHV0U3RyZWFtIHVybENvbnRlbnRzID0gbnVsbDsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbm5lY3Rpb24gPSByZWNvcmQuZ2V0VVJMKCkub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQkJdXJsQ29udGVudHMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50KHJlY29yZC5nZXRCYXNlTG9jYXRpb24oKSwgdXJsQ29udGVudHMpOwotCQkJCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgcmVjb3JkLmdldFVSTCgpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04sIGljb25QYXRoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChkb2N1bWVudC5nZXRMYXJnZUljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRVUkwoKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLCBpY29uUGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90IHVuY29tbW9uIGdpdmVuIGludmFsaWQgVVJMcwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHVybENvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdXJsQ29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQ3YzdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEltcGwgaW1wbGVtZW50cyBUTEREb2N1bWVudCB7Ci0JCi0JLyoqIENvbnRhaW5zIHRhZ2luZm8gYW5kL29yIGFueSBvdGhlciBtaXNjIHByb3BlcnRpZXMqLwotCXByaXZhdGUgQW5ub3RhdGlvbk1hcCBmQW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBNYXAgZlByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgwKTsKLQotCS8qKgotCSAqIFJlY29yZHMgZnJvbSB3aGVyZSB0aGlzIGRvY3VtZW50IHdhcyBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkJhc2VMb2NhdGlvbjsKLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkKLQlwcml2YXRlIFN0cmluZyBmRGlzcGxheU5hbWU7Ci0KLQkvKioKLQkgKiBOT1QgcHVibGljIEFQSQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZkVsZW1lbnRzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JcHJpdmF0ZSBMaXN0IGZGdW5jdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQotCS8vIGlkIG9mIHRoZSB0YWdsaWIKLQlwcml2YXRlIFN0cmluZyBmSWQgPSBudWxsOwotCS8qKgotCSAqIENoaWxkcmVuIG9mICJ0YWdsaWIiIHdpdGhpbiBhIC50bGQgZmlsZSBlYWNoIGFsbG93Ci0JICogb25lIFRleHQgbm9kZSAoI1BDREFUQSkgYmVuZWF0aCB0aGVtLiAgU3RvcmUgdGhlIHZhbHVlcwotCSAqIGhlcmUgZm9yIHNpbXBsaWNpdHkuCi0JICovCi0JLy8gVGhlIEpTUCBzcGVjaWZpY2F0aW9uIHJlcXVpcmVkIGZvciB0aGlzIHRhZ2xpYiB0byBmdW5jdGlvbgotCXByaXZhdGUgU3RyaW5nIGZKU1BWZXJzaW9uID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyBmTGFyZ2VJY29uOwotCi0JcHJpdmF0ZSBMaXN0IGZMaXN0ZW5lcnM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcmVudFVSSSA9IG51bGw7Ci0JLy8gQSBzaG9ydCBuYW1lIHN1Z2dlc3RlZCBhcyB0aGUgZGVmYXVsdCBwcmVmaXggZm9yIHRhZ3Mgd2l0aGluIHRoZSBsaWIKLQlwcml2YXRlIFN0cmluZyBmU2hvcnROYW1lID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyBmU21hbGxJY29uOwotCQotCS8qKgotCSAqIHNpbmNlIEpTUCAyLjAKLQkgKiAKLQkgKiBUaGUgZW50aXJlIGVsZW1lbnQgaXMgc3RvcmVkIGhlcmUgc2luY2UgaXRzIGxheW91dCBpcyB1bmRlZmluZWQgCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZUYWdsaWJFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkKLQkvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgdGFnbGliIGl0c2VsZgotCXByaXZhdGUgU3RyaW5nIGZUTGliVmVyc2lvbiA9IG51bGw7Ci0JCi0JLy8gQSB1bmlxdWUgcHVibGljIFVSSSBkZXNjcmliaW5nIHRoaXMgdGFnbGliLiAgUmVjb21tZW5kZWQgdG8gYmUgdGhlIFVSTAotCS8vIHRvIHRoZSBkZXNjcmlwdG9yCi0JcHJpdmF0ZSBTdHJpbmcgZlVSSSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgVExEVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkKLQkvKioKLQkgKiBDTURvY3VtZW50SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFubm90YXRpb24gbWFwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiAgTGF6aWx5IGNyZWF0ZXMKLQkgKiBhbmQgbG9hZHMgYW5ub3RhdGlvbiBtYXAuCi0JICogQHJldHVybiBBbm5vdGF0aW9uTWFwCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uTWFwIGdldEFubm90YXRpb25NYXAoKSB7Ci0JCS8vIGNyZWF0ZSBhIG5ldyBhbm5vdGF0aW9uIG1hcCBhbmQgbG9hZCBpdCB1cAotCQlpZiAoZkFubm90YXRpb25NYXAgPT0gbnVsbCkgewotCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCi0JCQlMaXN0IGFubm90YXRpb25GaWxlcyA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhnZXRVcmkoKSk7Ci0JCSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhbm5vdGF0aW9uRmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCSAgICAJdHJ5IHsKLQkJICAgIAkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gKEFubm90YXRpb25GaWxlSW5mbykgaS5uZXh0KCk7Ci0JCSAgICAJCUFubm90YXRpb25GaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBBbm5vdGF0aW9uRmlsZVBhcnNlcigpOwotCQkgICAgCQlwYXJzZXIucGFyc2UoZkFubm90YXRpb25NYXAsIGZpbGVJbmZvKTsKLQkJICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgICAgIAlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiRXhjZXB0aW9uIHRocm93biBpbiBDTURvY3VtZW50SW1wbCNnZXRBbm5vdGF0aW9uTWFwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIGZBbm5vdGF0aW9uTWFwOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJhc2VMb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGZCYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5TmFtZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZkRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIGdldEVudGl0aWVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZlRhZ2xpYkV4dGVuc2lvbnM7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVuY3Rpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZ1bmN0aW9ucygpIHsKLQkJcmV0dXJuIGZGdW5jdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaWQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwdmVyc2lvbigpIHsKLQkJcmV0dXJuIGZKU1BWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhcmdlSWNvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJcmV0dXJuIGZMYXJnZUljb247Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoZkxpc3RlbmVycyA9PSBudWxsKQotCQkJZkxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNjbWRvY3VtZW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudFVSSS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudFVSSSgpIHsKLQkJcmV0dXJuIGZQYXJlbnRVUkk7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpKSB7Ci0JCQlyZXR1cm4gVExERG9jdW1lbnQuSlNQX1RMRDsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJhbm5vdGF0aW9uTWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGdldEFubm90YXRpb25NYXAoKTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydG5hbWUoKSB7Ci0JCXJldHVybiBmU2hvcnROYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIGZTbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUbGlidmVyc2lvbigpIHsKLQkJcmV0dXJuIGZUTGliVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJcmV0dXJuIGZVUkk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFRMRERvY3VtZW50I2dldFZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIFRMRFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24gVGhlIGJhc2VMb2NhdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZUxvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24pIHsKLQkJZkJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZSBUaGUgZGlzcGxheU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0JCXRoaXMuZkRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaWQuCi0JICogQHBhcmFtIGlkIFRoZSBpZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5mSWQgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SW5mbyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgbmV3SW5mbykgewotCQlzZXREZXNjcmlwdGlvbihuZXdJbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SnNwdmVyc2lvbiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnNwdmVyc2lvbihTdHJpbmcgbmV3SnNwdmVyc2lvbikgewotCQlmSlNQVmVyc2lvbiA9IG5ld0pzcHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEBwYXJhbSBsYXJnZUljb24gVGhlIGxhcmdlSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIGxhcmdlSWNvbikgewotCQl0aGlzLmZMYXJnZUljb24gPSBsYXJnZUljb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJzKExpc3QgbGlzdGVuZXJzKSB7Ci0JCXRoaXMuZkxpc3RlbmVycyA9IGxpc3RlbmVyczsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHBhcmVudFVSSSBUaGUgcGFyZW50VVJJIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRVUkkoU3RyaW5nIHBhcmVudFVSSSkgewotCQlmUGFyZW50VVJJID0gcGFyZW50VVJJOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQlmUHJvcGVydGllcy5wdXQocHJvcGVydHksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2hvcnRuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydG5hbWUoU3RyaW5nIG5ld1Nob3J0bmFtZSkgewotCQlmU2hvcnROYW1lID0gbmV3U2hvcnRuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiBAcGFyYW0gc21hbGxJY29uIFRoZSBzbWFsbEljb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBzbWFsbEljb24pIHsKLQkJdGhpcy5mU21hbGxJY29uID0gc21hbGxJY29uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUbGlidmVyc2lvbiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGxpYnZlcnNpb24oU3RyaW5nIG5ld1RsaWJ2ZXJzaW9uKSB7Ci0JCWZUTGliVmVyc2lvbiA9IG5ld1RsaWJ2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdVcmkgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgbmV3VXJpKSB7Ci0JCWZVUkkgPSBuZXdVcmk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFRMRFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoVExERG9jdW1lbnQuQ01fS0lORC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCAiYW5ub3RhdGlvbk1hcCIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZlByb3BlcnRpZXMuY29udGFpbnNLZXkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IHNob3J0IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRTaG9ydG5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGlzcGxheSBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGlzcGxheU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVzY3JpcHRpb24gKGluZm8pOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgVVJJOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VXJpKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGpzcCB2ZXJzaW9uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0SnNwdmVyc2lvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB0YWdsaWIgdmVyc2lvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFRsaWJ2ZXJzaW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHNtYWxsIGljb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRTbWFsbEljb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbGFyZ2UgaWNvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldExhcmdlSWNvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGdldFZhbGlkYXRvcigpICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhbGlkYXRvcjoiICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXRWYWxpZGF0b3IoKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGxpc3RlbmVyczoiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldExpc3RlbmVycygpLnNpemUoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldExpc3RlbmVycygpLmdldChpKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZWxlbWVudHM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShlbGVtZW50cy5pdGVtKGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY2YmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLXB1YmxpYyBjbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgaW1wbGVtZW50cyBUTERFbGVtZW50RGVjbGFyYXRpb24gewotCi0JLy8gb3B0aW9uYWwgYXR0cmlidXRlcwotCUNNTmFtZWROb2RlTWFwSW1wbCBmQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkvLyAoZW1wdHl8SlNQfHRhZ2RlcGVuZGFudHxzY3JpcHRsZXNzKSAtIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBKU1AKLQlwcml2YXRlIFN0cmluZyBib2R5Y29udGVudCA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9KU1A7Ci0KLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqIAotCSAqIFVzYWdlIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCi0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKLQotCS8qKiAKLQkgKiBzaW5jZSBKU1AgMi4wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkV4YW1wbGU7Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlBhdGggPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IGZUYWdFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxhcmdlSWNvbjsKLQkKLQkKLQlwcml2YXRlIGludCBtYXhPY2N1ciA9IC0xOwotCXByaXZhdGUgaW50IG1pbk9jY3VyID0gMDsKLQotCS8vIHJlcXVpcmVkIHRhZyBuYW1lCi0JcHJpdmF0ZSBTdHJpbmcgbm9kZU5hbWUgPSBudWxsOwotCQotCS8qKiAKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc21hbGxJY29uOwotCQotCS8vIHRhZyBoYW5kbGVyIGNsYXNzIC0gcmVxdWlyZWQKLQlwcml2YXRlIFN0cmluZyB0YWdjbGFzcyA9IG51bGw7Ci0JCi0JLy8gdGFnIGV4dHJhIGluZm8gY2xhc3MgKHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLlRhZ0V4dHJhSW5mbykgLSBvcHRpb25hbAotCXByaXZhdGUgU3RyaW5nIHRlaWNsYXNzID0gbnVsbDsKLQotCS8qKiAKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBMaXN0IHZhcmlhYmxlczsKLQotCS8qKgotCSAqIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoQ01Eb2N1bWVudCBvd25lcikgewotCQlzdXBlcigpOwotCQlmT3duZXJEb2N1bWVudCA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb2R5Y29udGVudCgpIHsKLQkJcmV0dXJuIGJvZHljb250ZW50OwotCX0KLQotCS8qKgotCSAqIGdldENNQ29udGVudCBtZXRob2QKLQkgKiBAcmV0dXJuIENNQ29udGVudAotCSAqCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBjYW4gYmUgYW4gQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChib2R5Y29udGVudC5lcXVhbHMoSlNQMTFUTEROYW1lcy5DT05URU5UX0VNUFRZKSkKLQkJCXJldHVybiBFTVBUWTsKLQkJaWYgKGJvZHljb250ZW50LmVxdWFscyhKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKSkKLQkJCXJldHVybiBQQ0RBVEE7Ci0JCWVsc2UKLQkJCS8vIEpTUAotCQkJcmV0dXJuIEFOWTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIG5ldyBDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4YW1wbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZkV4YW1wbGU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZlRhZ0V4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvKCkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXJnZUljb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogZ2V0TG9jYWxFbGVtZW50cyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIG1pbk9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBub2RlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gZk93bmVyRG9jdW1lbnQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBmUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjcmliZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJ0YWdJbmZvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGdldFRhZ0luZm8oKTsJLy8gcmV0dXJuIHRhZyBpbmZvCi0JCQkvLyBidWc4ODMzNiBubyBuZWVkIHRvIHJlc3RvcmUgbWFya2VycyAKLQkJCS8vIHJldHVybiBTdHJpbmdVdGlscy5yZXN0b3JlTWFya2VycyhnZXRUYWdJbmZvKCkpOyAvLyByZXR1cm4gdGFnIGRlc2NyaXB0aW9uCi0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lICE9IG51bGwgJiYgcHJvcGVydHlOYW1lLmVxdWFscygiZGVzY3JpcHRpb24iKSkgewkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCS8vIGJ1Zzg4MzM2IG5vIG5lZWQgdG8gcmVzdG9yZSBtYXJrZXJzIAotCQkJLy8gcmV0dXJuIFN0cmluZ1V0aWxzLnJlc3RvcmVNYXJrZXJzKGdldERlc2NyaXB0aW9uKCkpOyAvLyByZXR1cm4gdGFnIGRlc2NyaXB0aW9uCi0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSkgewotCQkJcmV0dXJuIFRMRERvY3VtZW50LkpTUF9UTEQ7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSkgewotCQkJcmV0dXJuIGdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWFBhdGggb2YgdGhpcyBlbGVtZW50Ci0JICogKGN1cnJlbnRseSBqdXN0IHJldHVybnMgdGhlIG5vZGUgbmFtZSkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdjbGFzcygpIHsKLQkJcmV0dXJuIHRhZ2NsYXNzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHRhZ2luZm8gZm9yIHRoaXMgY3VycmVudCBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgdGFnaW5mbyBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnSW5mbygpIHsKLQkJaWYgKGdldE93bmVyRG9jdW1lbnQoKS5zdXBwb3J0cygiYW5ub3RhdGlvbk1hcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUFubm90YXRpb25NYXAgbWFwID0gKEFubm90YXRpb25NYXApZ2V0T3duZXJEb2N1bWVudCgpLmdldFByb3BlcnR5KCJhbm5vdGF0aW9uTWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBzcGVjID0gZ2V0U3BlYygpOwotCQkJU3RyaW5nIHJlc3VsdCA9IG1hcC5nZXRQcm9wZXJ0eShzcGVjLCAidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkJLy8gYnVnODgzMzYgbm8gbmVlZCB0byByZXN0b3JlIG1hcmtlcnMgCi0JCQkvLyByZXR1cm4gU3RyaW5nVXRpbHMucmVzdG9yZU1hcmtlcnMocmVzdWx0KTsgLy8gcmV0dXJuIHRhZyBpbmZvCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZWljbGFzcygpIHsKLQkJcmV0dXJuIHRlaWNsYXNzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZhcmlhYmxlcy4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VmFyaWFibGVzKCkgewotCQlpZiAodmFyaWFibGVzID09IG51bGwpCi0JCQl2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0JvZHljb250ZW50IGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb2R5Y29udGVudChTdHJpbmcgbmV3Qm9keWNvbnRlbnQpIHsKLQkJYm9keWNvbnRlbnQgPSBuZXdCb2R5Y29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZXhhbXBsZSBUaGUgZXhhbXBsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgZXhhbXBsZSkgewotCQlmRXhhbXBsZSA9IGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEBwYXJhbSBsYXJnZUljb24gVGhlIGxhcmdlSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIGxhcmdlSWNvbikgewotCQl0aGlzLmxhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCW5vZGVOYW1lID0gc3RyaW5nOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgewotCQlmUGF0aCA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEBwYXJhbSBzbWFsbEljb24gVGhlIHNtYWxsSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgewotCQl0aGlzLnNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFnY2xhc3MgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2NsYXNzKFN0cmluZyBuZXdUYWdjbGFzcykgewotCQl0YWdjbGFzcyA9IG5ld1RhZ2NsYXNzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZWljbGFzcyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVpY2xhc3MoU3RyaW5nIG5ld1RlaWNsYXNzKSB7Ci0JCXRlaWNsYXNzID0gbmV3VGVpY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFyaWFibGVzLgotCSAqIEBwYXJhbSB2YXJpYWJsZXMgVGhlIHZhcmlhYmxlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZXMoTGlzdCB2YXJpYWJsZXMpIHsKLQkJdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJ0YWdJbmZvIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCAiICsgc3VwZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Tm9kZU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGFnIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGFnY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGVpIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGVpY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYm9keSBjb250ZW50OiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Qm9keWNvbnRlbnQoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVzY3JpcHRpb24gKGluZm8pOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYXR0cmlidXRlczoiKTsgLy8kTk9OLU5MUy0xJAotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoYXR0cmlidXRlcy5pdGVtKGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YXJpYWJsZXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRWYXJpYWJsZXMoKS5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0VmFyaWFibGVzKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjEzZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQlwdWJsaWMgc3RhdGljIENNTmFtZWROb2RlTWFwSW1wbCBFTVBUWV9OQU1FRF9OT0RFX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyoqCi0JICogQ01OYW1lZE5vZGVNYXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlIYXNodGFibGUgZ2V0SGFzaHRhYmxlKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0YWJsZS5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoQ01Ob2RlKSB0YWJsZS5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpbnQgc2l6ZSA9IHRhYmxlLnNpemUoKTsKLQkJaWYgKGluZGV4IDwgc2l6ZSkgewotCQkJSXRlcmF0b3IgdmFsdWVzID0gaXRlcmF0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGV4OyBpKyspIHsKLQkJCQlyZXN1bHQgPSB2YWx1ZXMubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoQ01Ob2RlKSByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYU5vZGUgQ01Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgYU5vZGUpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBhTm9kZSAhPSBudWxsKQotCQkJdGFibGUucHV0KG5hbWUsIGFOb2RlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NmNmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IHsKLQlzdGF0aWMgQ01Ob2RlTGlzdEltcGwgRU1QVFlfTk9ERV9MSVNUID0gbmV3IENNTm9kZUxpc3RJbXBsKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCXByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoTGlzdCBsaXN0KSB7Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kSXRlbShDTU5vZGUgbm9kZSkgewotCQlsaXN0LmFkZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldExpc3QoKSB7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gKENNTm9kZSkgbGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEQ01Eb2N1bWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExNjFjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEQ01Eb2N1bWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMjBUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliSW5kZXhMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBUTERDTURvY3VtZW50TWFuYWdlciBpbXBsZW1lbnRzIElUYWdsaWJJbmRleExpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBjbGFzcyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGltcGxlbWVudHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiB7Ci0KLQkJLyoqCi0JCSAqIEFkZHMgYSBibG9jayB0YWduYW1lIChmdWxseSBuYW1lc3BhY2UgcXVhbGlmaWVkKSBpbnRvIHRoZSBsaXN0IG9mCi0JCSAqIGJsb2NrIHRhZyBuYW1lcyBmb3IgdGhlIHBhcnNlci4gVGhlIG1hcmtlcgotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFsb25nIHdpdGggcG9zaXRpb24gY3VlcyBkdXJpbmcgcmVwYXJzZXMKLQkJICogYWxsb3cgdGhlIEpTUFNvdXJjZVBhcnNlciB0byBlbmFibGUvaWdub3JlIHRoZSB0YWdzIGFzIGJsb2Nrcy4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkZEJsb2NrVGFnKFN0cmluZyB0YWduYW1lTlMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWFya2VyKSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZ2V0UGFyc2VyKCkuZ2V0QmxvY2tNYXJrZXIodGFnbmFtZU5TKSA9PSBudWxsKSB7Ci0JCQkJZ2V0UGFyc2VyKCkuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKHRhZ25hbWVOUywgbWFya2VyLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIHRydWUsIGZhbHNlKSk7Ci0JCQkJaWYgKF9kZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGFkZGVkIGJsb2NrIG1hcmtlcjogIiArIHRhZ25hbWVOUyArICJAIiArIG1hcmtlci5nZXRTdGFydE9mZnNldCgpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdsaWJUcmFja2VyKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBDTURvY3VtZW50IHRsZENNRG9jdW1lbnQpIHsKLQkJCWdldFRhZ2xpYlRyYWNrZXJzKCkuYWRkKG5ldyBUYWdsaWJUcmFja2VyKHVyaSwgcHJlZml4LCB0bGRDTURvY3VtZW50LCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbmFibGVzIGEgVExEIG93bmluZyB0aGUgZ2l2ZW4gcHJlZml4IGxvYWRlZCBmcm9tIHRoZSBnaXZlbiBVUkkgYXQKLQkJICogdGhlIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4gVGhlIGxpc3Qgb2YKLQkJICogYWRkaXRpb25hbENNRG9jdW1lbnRzIHdpbGwgY2xhaW0gdG8gbm90IGtub3cgYW55IG9mIGl0cyB0YWdzIGF0Ci0JCSAqIHBvc2l0aW9ucyBlYXJsaWVyIHRoYW4gdGhhdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uJ3MgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBGb3IgdGFnbGliIGRpcmVjdGl2ZXMsIHRoZSB0YWdsaWIgaXMgdGhlIGFuY2hvciB3aGlsZSB0YWdsaWJzCi0JCSAqIHJlZ2lzdGVyZWQgdGhyb3VnaCBpbmNsdWRlIGRpcmVjdGl2ZXMgdXNlIHRoZSBwYXJlbnQgZG9jdW1lbnQncwotCQkgKiBpbmNsdWRlIGRpcmVjdGl2ZSBhcyB0aGVpciBhbmNob3IuCi0JCSAqIAotCQkgKiBAcGFyYW0gcHJlZml4Ci0JCSAqIEBwYXJhbSB1cmkKLQkJICogQHBhcmFtIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZW5hYmxlVGFnbGliRnJvbVVSSShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJaWYgKHByZWZpeCA9PSBudWxsIHx8IHVyaSA9PSBudWxsIHx8IGJhbm5lZFByZWZpeGVzLmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJcmV0dXJuOwotCQkJLy8gVHJ5IHRvIGxvYWQgdGhlIENNRG9jdW1lbnQgZm9yIHRoaXMgVVJJCi0JCQlDTURvY3VtZW50IHRsZCA9IGdldENNRG9jdW1lbnQodXJpKTsKLQkJCWlmICh0bGQgPT0gbnVsbCB8fCAhKHRsZCBpbnN0YW5jZW9mIFRMRERvY3VtZW50KSkgewotCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBmYWlsZWQgdG8gY3JlYXRlIGEgQ01Eb2N1bWVudCBmb3IgIiArIHVyaSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcmVnaXN0ZXJUYWdsaWIocHJlZml4LCB1cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGxkKTsKLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlZ2lzdGVyZWQgYSB0cmFja2VyIGZvciAiICsgdXJpICsgIiB3aXRoIHByZWZpeCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBFbmFibGVzIGEgVExEIG93bmluZyB0aGUgZ2l2ZW4gcHJlZml4IGxvYWRlZCBmcm9tIHRoZSBnaXZlbiBVUkkgYXQKLQkJICogdGhlIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4gVGhlIGxpc3Qgb2YKLQkJICogYWRkaXRpb25hbENNRG9jdW1lbnRzIHdpbGwgY2xhaW0gdG8gbm90IGtub3cgYW55IG9mIGl0cyB0YWdzIGF0Ci0JCSAqIHBvc2l0aW9ucyBlYXJsaWVyIHRoYW4gdGhhdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uJ3MgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBGb3IgdGFnbGliIGRpcmVjdGl2ZXMsIHRoZSB0YWdsaWIgaXMgdGhlIGFuY2hvciB3aGlsZSB0YWdsaWJzCi0JCSAqIHJlZ2lzdGVyZWQgdGhyb3VnaCBpbmNsdWRlIGRpcmVjdGl2ZXMgdXNlIHRoZSBwYXJlbnQgZG9jdW1lbnQncwotCQkgKiBpbmNsdWRlIGRpcmVjdGl2ZSBhcyB0aGVpciBhbmNob3IuCi0JCSAqIAotCQkgKiBAcGFyYW0gcHJlZml4Ci0JCSAqIEBwYXJhbSB1cmkKLQkJICogQHBhcmFtIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZW5hYmxlVGFnc0luRGlyKFN0cmluZyBwcmVmaXgsIFN0cmluZyB0YWdkaXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlpZiAocHJlZml4ID09IG51bGwgfHwgdGFnZGlyID09IG51bGwgfHwgYmFubmVkUHJlZml4ZXMuY29udGFpbnMocHJlZml4KSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoX2RlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBlbmFibGluZyB0YWdzIGZyb20gZGlyZWN0b3J5IiArIHRhZ2RpciArICIgZm9yIHByZWZpeCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIFRyeSB0byBsb2FkIHRoZSBDTURvY3VtZW50IGZvciB0aGlzIFVSSQotCQkJQ01Eb2N1bWVudCB0bGQgPSBnZXRJbXBsaWNpdENNRG9jdW1lbnQodGFnZGlyKTsKLQkJCWlmICh0bGQgPT0gbnVsbCB8fCAhKHRsZCBpbnN0YW5jZW9mIFRMRERvY3VtZW50KSkgewotCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBmYWlsZWQgdG8gY3JlYXRlIGEgQ01Eb2N1bWVudCBmb3IgZGlyZWN0b3IgIiArIHRhZ2Rpcik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcmVnaXN0ZXJUYWdsaWIocHJlZml4LCB0YWdkaXIsIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGxkKTsKLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlZ2lzdGVyZWQgYSB0cmFja2VyIGZvciBkaXJlY3RvcnkiICsgdGFnZGlyICsgIiB3aXRoIHByZWZpeCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDggKDwlQCwKLQkJCS8vIHRhZ2xpYiwgdXJpLCA9LCB3aGVyZSwgcHJlZml4LCA9LCB3aGF0KSBbb3IgNCBmb3IgaW5jbHVkZXNdCi0JCQlpZiAoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiV2FybmluZzogcGFyc2VyIHRleHQgd2FzIHJlcXVlc3RlZCBieSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGJ1dCBub25lIHdhcyBhdmFpbGFibGU7IHRhZ2xpYiBzdXBwb3J0IGRpc2FibGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYm9vbGVhbiB0YWdsaWJEZXRlY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiB0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBpbmNsdWRlRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkID0gZmFsc2U7Ci0JCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKTsKLQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gbmFtZS5nZXRUZXh0TGVuZ3RoKCk7Ci0KLQkJCQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJdGFnbGliRGV0ZWN0ZWQgPSBnZXRQYXJzZXIoKS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJCQkJdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQgPSBnZXRQYXJzZXIoKS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJCQlpbmNsdWRlRGV0ZWN0ZWQgPSBnZXRQYXJzZXIoKS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLklOQ0xVREUpOwotCQkJCQkJCWluY2x1ZGVEaXJlY3RpdmVEZXRlY3RlZCA9IGdldFBhcnNlcigpLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5Ci0JCQkJCQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBnZXRQYXJzZXIoKS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKTsKLQkJCQkJCQl0YWdsaWJEZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQkJCQl0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQkJCWluY2x1ZGVEZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuSU5DTFVERSk7Ci0JCQkJCQkJaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0lOQ0xVREUpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRhZ2xpYkRldGVjdGVkIHx8IHRhZ2xpYkRpcmVjdGl2ZURldGVjdGVkKSB7Ci0JCQkJCQkJcHJvY2Vzc1RhZ2xpYihhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChpbmNsdWRlRGV0ZWN0ZWQgfHwgaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkKSB7Ci0JCQkJCQkJcHJvY2Vzc0luY2x1ZGUoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgNSAoPCwKLQkJCS8vIGpzcDpyb290LCB4bWxuczpwcmVmaXgsID0sIHdoZXJlKQotCQkJZWxzZSBpZiAoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSB7Ci0JCQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIldhcm5pbmc6IHBhcnNlciB0ZXh0IHdhcyByZXF1ZXN0ZWQgYnkgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBidXQgbm9uZSB3YXMgYXZhaWxhYmxlOyB0YWdsaWIgc3VwcG9ydCBkaXNhYmxlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByb2Nlc3NKU1BSb290KGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5jbHVkZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcm9jZXNzSW5jbHVkZShhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFBhcnNlcigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQcm9jZXNzIGFuIGluY2x1ZGUgZGlyZWN0aXZlIGZvdW5kIGJ5IHRoZSB0ZXh0U291cmNlIHBhcnNlciBhbmQKLQkJICogYW5jaG9yIGFueSB0YWdsaWJzIGZvdW5kIHdpdGhpbiBhdCB0aGUKLQkJICogYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLiBJbmNsdWRlcyB1c2UgdGhlIGluY2x1ZGluZyBmaWxlIGFzCi0JCSAqIHRoZSBwb2ludCBvZiByZWZlcmVuY2UsIG5vdCBuZWNlc3NhcmlseSB0aGUgInRvcCIgZmlsZS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmNsdWRlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5jbHVkZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIEpTUFNvdXJjZVBhcnNlciB0ZXh0U291cmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGluY2x1ZGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIGluY2x1ZGVkRmlsZSA9IG51bGw7Ci0JCQlib29sZWFuIGlzRmlsZW5hbWUgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCWlmICh0ZXh0U291cmNlLmdldFRleHQoaW5jbHVkZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5GSUxFKSkgewotCQkJCQkJCWlzRmlsZW5hbWUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaXNGaWxlbmFtZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzRmlsZW5hbWUgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlpbmNsdWRlZEZpbGUgPSB0ZXh0U291cmNlLmdldFRleHQoaW5jbHVkZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCWlzRmlsZW5hbWUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJaW5jbHVkZWRGaWxlID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGluY2x1ZGVkRmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gc3RyaXAgYW55IGV4dHJhbmVvdXMgcXVvdGVzIGFuZCB3aGl0ZSBzcGFjZQotCQkJCWluY2x1ZGVkRmlsZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGluY2x1ZGVkRmlsZSkudHJpbSgpOwotCQkJCUlQYXRoIGZpbGVQYXRoID0gbnVsbDsKLQkJCQlpZiAoaW5jbHVkZWRGaWxlLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlQYXRoIGNvbnRleHRSb290ID0gVGFnbGliSW5kZXguZ2V0Q29udGV4dFJvb3QoVGFnbGliQ29udHJvbGxlci5nZXRGaWxlQnVmZmVyKFRMRENNRG9jdW1lbnRNYW5hZ2VyLnRoaXMpLmdldExvY2F0aW9uKCkpOwotCQkJCQlmaWxlUGF0aCA9IGNvbnRleHRSb290LmFwcGVuZChpbmNsdWRlZEZpbGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGdldEluY2x1ZGVzKCkuaXNFbXB0eSgpKQotCQkJCQkJZmlsZVBhdGggPSBUYWdsaWJDb250cm9sbGVyLmdldEZpbGVCdWZmZXIoVExEQ01Eb2N1bWVudE1hbmFnZXIudGhpcykuZ2V0TG9jYXRpb24oKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKGluY2x1ZGVkRmlsZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWZpbGVQYXRoID0gKChJUGF0aCkgZ2V0SW5jbHVkZXMoKS5wZWVrKCkpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoaW5jbHVkZWRGaWxlKTsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgZm9yICJsb29wcyIKLQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCAmJiAhZ2V0SW5jbHVkZXMoKS5jb250YWlucyhmaWxlUGF0aCkgJiYgIWZpbGVQYXRoLmVxdWFscyhUYWdsaWJDb250cm9sbGVyLmdldEZpbGVCdWZmZXIoVExEQ01Eb2N1bWVudE1hbmFnZXIudGhpcykuZ2V0TG9jYXRpb24oKSkpIHsKLQkJCQkJLyoKLQkJCQkJICogUHJldmVudCBzbG93IHBlcmZvcm1hbmNlIHdoZW4gZWRpdGluZyBzY3JpcHRsZXQgcGFydCBvZgotCQkJCQkgKiB0aGUgSlNQIGJ5IG9ubHkgcHJvY2Vzc2luZyBpbmNsdWRlcyBpZiB0aGV5J3ZlIGJlZW4KLQkJCQkJICogbW9kaWZpZWQuIFRoZSBJbmNsdWRlSGVscGVyIHJlbWVtYmVycyBhbnkgQ01Eb2N1bWVudHMKLQkJCQkJICogY3JlYXRlZCBmcm9tIHRoZSBmaWxlcyBpdCBwYXJzZXMuIENhY2hpbmcgdGhlIFVSSSBhbmQKLQkJCQkJICogcHJlZml4L3RhZ2RpciBhbGxvd3MgdXMgdG8ganVzdCBlbmFibGUgdGhlIENNRG9jdW1lbnQKLQkJCQkJICogd2hlbiB0aGUgcHJldmlvdXNseSBwYXJzZWQgZmlsZXMuCi0JCQkJCSAqIAotCQkJCQkgKiBSRU1BSU5JTkcgUFJPQkxFTTogZlRMRENNUmVmZXJlbmNlc01hcCBkb2VzIG5vdCBtYXAKLQkJCQkJICogZnJvbSBhIGZyYWdtZW50J3MgcGF0aCBhbmQgYWxzbyBpbmNsdWRlIGFsbCBvZiB0aGUgQ00KLQkJCQkJICogcmVmZXJlbmNlcyBpbiBmcmFnbWVudHMgdGhhdCAqaXQqIGluY2x1ZGVzLiBUaGUKLQkJCQkJICogZnJhZ21lbnRzIHRoYXQgaXQgaW5jbHVkZXMgd29uJ3QgaGF2ZSBpdHMgQ00gcmVmZXJlbmNlcwotCQkJCQkgKiBsb2FkZWQsIGJ1dCB0aGVuIHdlJ2QgbmVlZCB0byByZWNvcmQgdGhlIFVSSSBhbmQKLQkJCQkJICogbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkIGZyYWdtZW50IHRvIHJlc29sdmUgdGhlbQotCQkJCQkgKiBjb3JyZWN0bHksIG1vZGlmeWluZyBlbmFibGVUYWdsaWIoKSB0byBhbHNvIHRha2UgYSBiYXNlCi0JCQkJCSAqIHBhdGggYW5kIHJlc29sdmUgdGhlIFVSSSBhcHByb3ByaWF0ZWx5LgotCQkJCQkgKi8KLQkJCQkJaWYgKGhhc0FueUluY2x1ZGVCZWVuTW9kaWZpZWQoZmlsZVBhdGgpKSB7Ci0JCQkJCQlnZXRJbmNsdWRlcygpLnB1c2goZmlsZVBhdGgpOwotCQkJCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCQkJCQlJbmNsdWRlSGVscGVyIGluY2x1ZGVIZWxwZXIgPSBuZXcgSW5jbHVkZUhlbHBlcihhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFBhcnNlcigpKTsKLQkJCQkJCQlpbmNsdWRlSGVscGVyLnBhcnNlKGZpbGVQYXRoKTsKLQkJCQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBpbmNsdWRlSGVscGVyLnRhZ2xpYlJlZmVyZW5jZXM7Ci0JCQkJCQkJZlRMRENNUmVmZXJlbmNlc01hcC5wdXQoZmlsZVBhdGgsIHJlZmVyZW5jZXMpOwotCQkJCQkJCS8qCi0JCQkJCQkJICogVE9ETzogd2FsayB1cCB0aGUgaW5jbHVkZSBoaWVyYXJjaHkgYW5kIGFkZAotCQkJCQkJCSAqIHRoZXNlIHJlZmVyZW5jZXMgdG8gZWFjaCBvZiB0aGUgcGFyZW50cy4KLQkJCQkJCQkgKi8KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiV2FybmluZzogcGFyc2VyIHRleHQgd2FzIHJlcXVlc3RlZCBieSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGJ1dCBub25lIHdhcyBhdmFpbGFibGU7IHRhZ2xpYiBzdXBwb3J0IGRpc2FibGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIEFkZCBmcm9tIHRoYXQgc2F2ZWQgbGlzdCBvZiB1cmlzL3ByZWZpeGVzL2RvY3VtZW50cwotCQkJCQkJTGlzdCByZWZlcmVuY2VzID0gKExpc3QpIGZUTERDTVJlZmVyZW5jZXNNYXAuZ2V0KGZpbGVQYXRoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyByZWZlcmVuY2VzICE9IG51bGwgJiYgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlUTERDTURvY3VtZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IChUTERDTURvY3VtZW50UmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIFRoZSB1cmkgbWlnaHQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5IGlmCi0JCQkJCQkJICogcmVsYXRpdmUgdG8gdGhlIEpTUCBmcmFnbWVudC4KLQkJCQkJCQkgKi8KLQkJCQkJCQllbmFibGVUYWdsaWJGcm9tVVJJKHJlZmVyZW5jZS5wcmVmaXgsIHJlZmVyZW5jZS51cmksIGluY2x1ZGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTE9PUCBJTiBASU5DTFVERVMgRk9VTkQ6ICIgKyBmaWxlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBQdWxscyB0aGUgVVJJIGFuZCBwcmVmaXggZnJvbSB0aGUgZ2l2ZW4ganNwOnJvb3QKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQKLQkJLy8gbWFrZXMgc3VyZSB0aGUgdGFncyBhcmUga25vd24uCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKU1BSb290KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ganNwUm9vdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJcHJvY2Vzc0pTUFJvb3QoanNwUm9vdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwganNwUm9vdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0UGFyc2VyKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0pTUFJvb3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCWJvb2xlYW4gdGFnbGliID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IHRleHRTb3VyY2UuZ2V0VGV4dCh0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKFhNTE5TKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoWE1MTlNfTEVOR1RIKTsKLQkJCQkJCQlpZiAoIWJhbm5lZFByZWZpeGVzLmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJCQkJCXRhZ2xpYiA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwcmVmaXggPSBudWxsOwotCQkJCQkJCXRhZ2xpYiA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRhZ2xpYiAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCXVyaSA9IHRleHRTb3VyY2UuZ2V0VGV4dCh0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQlpZiAodXJpICE9IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgKFN0cmluZ1V0aWxzLnN0cmlwKHVyaSkubGVuZ3RoKCkgPiAwKSAmJiAoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQkJaWYgKGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJCQkJCQllbmFibGVUYWdsaWJGcm9tVVJJKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHVyaSksIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQllbmFibGVUYWdsaWJGcm9tVVJJKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHVyaSksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJdXJpID0gbnVsbDsKLQkJCQkJCQlwcmVmaXggPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQl1cmkgPSBudWxsOwotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGFnbGliKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcm9jZXNzVGFnbGliKHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBnZXRQYXJzZXIoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUHVsbHMgdGhlIFVSSSBhbmQgcHJlZml4IGZyb20gdGhlIGdpdmVuIHRhZ2xpYiBkaXJlY3RpdmUKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQgbWFrZXMgc3VyZSB0aGUgdGFncyBhcmUga25vd24uCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGFnbGliKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSlNQU291cmNlUGFyc2VyIHRleHRTb3VyY2UpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQlTdHJpbmcgdGFnZGlyID0gbnVsbDsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJLy8gcmVtZW1iZXIgYXR0cmlidXRlIG5hbWUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWludCB0ZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkvLyBTdHJpbmcgbmFtZSA9IHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwKLQkJCQkJCS8vIHRleHRMZW5ndGgpOwotCQkJCQkJaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTFUTEROYW1lcy5QUkVGSVgpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AxMVRMRE5hbWVzLlBSRUZJWDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJUTEROYW1lcy5VUkkpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AxMVRMRE5hbWVzLlVSSTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMjBUTEROYW1lcy5UQUdESVIpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AyMFRMRE5hbWVzLlRBR0RJUjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWF0dHJOYW1lID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBwcm9jZXNzIHZhbHVlCi0JCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJaWYgKEpTUDExVExETmFtZXMuUFJFRklYLmVxdWFscyhhdHRyTmFtZSkpCi0JCQkJCQkJcHJlZml4ID0gdGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKTsKLQkJCQkJCWVsc2UgaWYgKEpTUDExVExETmFtZXMuVVJJLmVxdWFscyhhdHRyTmFtZSkpCi0JCQkJCQkJdXJpID0gdGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKTsKLQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuVEFHRElSLmVxdWFscyhhdHRyTmFtZSkpCi0JCQkJCQkJdGFnZGlyID0gdGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJdXJpID0gbnVsbDsKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQkJaWYgKHVyaSAhPSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIChTdHJpbmdVdGlscy5zdHJpcCh1cmkpLmxlbmd0aCgpID4gMCkgJiYgKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCWlmIChhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQkJZW5hYmxlVGFnbGliRnJvbVVSSShTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLCBTdHJpbmdVdGlscy5zdHJpcCh1cmkpLCB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCWVsc2UKLQkJCQkJZW5hYmxlVGFnbGliRnJvbVVSSShTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLCBTdHJpbmdVdGlscy5zdHJpcCh1cmkpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodGFnZGlyICE9IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgKFN0cmluZ1V0aWxzLnN0cmlwKHRhZ2RpcikubGVuZ3RoKCkgPiAwKSAmJiAoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJaWYgKGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJCQllbmFibGVUYWdzSW5EaXIoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KSwgU3RyaW5nVXRpbHMuc3RyaXAodGFnZGlyKSwgdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQllbHNlCi0JCQkJCWVuYWJsZVRhZ3NJbkRpcihTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLCBTdHJpbmdVdGlscy5zdHJpcCh0YWdkaXIpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyVGFnbGliKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBDTURvY3VtZW50IHRsZCkgewotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSB0bGQuZ2V0RWxlbWVudHMoKTsKLQkJCS8qCi0JCQkgKiBHbyB0aHJvdWdoIHRoZSBDTURvY3VtZW50IGZvciBhbnkgdGFncyB0aGF0IG11c3QgYmUgbWFya2VkIGFzCi0JCQkgKiBibG9jayB0YWdzIHN0YXJ0aW5nIGF0IHRoZSBhbmNob3JpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4KLQkJCSAqIEFzIHRoZSBkb2N1bWVudCBpcyBlZGl0ZWQgYW5kIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkgKiBtb3ZlZCBhcm91bmQsIHRoZSBibG9jayB0YWcgZW5hYmxlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkKLQkJCSAqIGZvbGxvdyBpdC4KLQkJCSAqLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJVExERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFRMREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuaXRlbShpKTsKLQkJCQlpZiAoZWQuZ2V0Qm9keWNvbnRlbnQoKSA9PSBKU1AxMlRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKQotCQkJCQlhZGRCbG9ja1RhZyhwcmVmaXggKyAiOiIgKyBlZC5nZXROb2RlTmFtZSgpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvKgotCQkJICogU2luY2UgbW9kaWZpY2F0aW9ucyB0byBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGFkamFjZW50IHRvIGEKLQkJCSAqIHRhZ2xpYiBkaXJlY3RpdmUgY2FuIGNhdXNlIHRoYXQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0byBiZQotCQkJICogcmVwb3J0ZWQsIGZpbHRlciBvdXQgYW55IGR1cGxpY2F0ZWQgVVJJcy4gV2hlbiB0aGUgdGFnbGliIGlzCi0JCQkgKiBhY3R1YWxseSBtb2RpZmllZCwgYSBmdWxsIHJlYnVpbGQgd2lsbCBvY2N1ciBhbmQgbm8gZHVwbGljYXRlcwotCQkJICogd2lsbC9zaG91bGQgYmUgZm91bmQuCi0JCQkgKi8KLQkJCWJvb2xlYW4gZG9UcmFjayA9IHRydWU7Ci0JCQlMaXN0IHRyYWNrZXJzID0gZ2V0VGFnbGliVHJhY2tlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgdHJhY2tlcnMuZ2V0KGkpOwotCQkJCWlmICh0cmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpICYmIHRyYWNrZXIuZ2V0VVJJKCkuZXF1YWxzKHVyaSkpIHsKLQkJCQkJZG9UcmFjayA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkb1RyYWNrKSB7Ci0JCQkJYWRkVGFnbGliVHJhY2tlcihwcmVmaXgsIHVyaSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0bGQpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlc2V0QmxvY2tUYWdzKCkgewotCQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSXRlcmF0b3IgbmFtZXMgPSBnZXRQYXJzZXIoKS5nZXRCbG9ja01hcmtlcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewotCQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcikgbmFtZXMubmV4dCgpOwotCQkJCWlmICghbWFya2VyLmlzR2xvYmFsKCkgJiYgbWFya2VyLmdldENvbnRleHQoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkJaWYgKF9kZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciByZW1vdmluZyBibG9jayB0YWcgbmFtZWQ6ICIgKyBtYXJrZXIuZ2V0VGFnTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW5hbWVzLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCQlpZiAoRGVidWcuZGVidWdUYWdsaWJzKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IHJlc2V0dGluZyIpOyAvLyROT04tTkxTLTEkCi0JCQlnZXRJbmNsdWRlcygpLmNsZWFyKCk7Ci0JCQlyZXNldEJsb2NrVGFncygpOwotCQkJcmVzZXRUYWdsaWJUcmFja2VycygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJCUFzc2VydC5pc1RydWUobmV3RG9jdW1lbnQgIT0gbnVsbCwgIm51bGwgZG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0LmlzVHJ1ZShuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSAhPSBudWxsLCAibnVsbCBkb2N1bWVudCBwYXJzZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0LmlzVHJ1ZShuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSBpbnN0YW5jZW9mIEpTUFNvdXJjZVBhcnNlciwgImNhbiBvbmx5IGxpc3RlbiB0byBkb2N1bWVudCB3aXRoIGEgSlNQU291cmNlUGFyc2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdldFNvdXJjZVBhcnNlcigpLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCQlzZXRTb3VyY2VQYXJzZXIoKEpTUFNvdXJjZVBhcnNlcikgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkJZ2V0U291cmNlUGFyc2VyKCkuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbmNsdWRlSGVscGVyIGV4dGVuZHMgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciB7Ci0JCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZBbmNob3IgPSBudWxsOwotCQlwcm90ZWN0ZWQgSlNQU291cmNlUGFyc2VyIGZMb2NhbFBhcnNlciA9IG51bGw7Ci0JCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZlBhcmVudFBhcnNlciA9IG51bGw7Ci0JCUxpc3QgdGFnbGliUmVmZXJlbmNlcyA9IG51bGw7Ci0KLQkJcHVibGljIEluY2x1ZGVIZWxwZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3IsIEpTUFNvdXJjZVBhcnNlciByb290UGFyc2VyKSB7Ci0JCQlzdXBlcigpOwotCQkJZkFuY2hvciA9IGFuY2hvcjsKLQkJCWZQYXJlbnRQYXJzZXIgPSByb290UGFyc2VyOwotCQkJdGFnbGliUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdsaWJUcmFja2VyKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBDTURvY3VtZW50IHRsZENNRG9jdW1lbnQpIHsKLQkJCXN1cGVyLmFkZFRhZ2xpYlRyYWNrZXIocHJlZml4LCB1cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGxkQ01Eb2N1bWVudCk7Ci0JCQlUTERDTURvY3VtZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBUTERDTURvY3VtZW50UmVmZXJlbmNlKCk7Ci0JCQlyZWZlcmVuY2UucHJlZml4ID0gcHJlZml4OwotCQkJcmVmZXJlbmNlLnVyaSA9IHVyaTsKLQkJCXRhZ2xpYlJlZmVyZW5jZXMuYWRkKHJlZmVyZW5jZSk7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBkZXRlY3RDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJCWlmIChmaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBvcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQlkID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkLmdldENoYXJzZXQoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUKLQkJCQkJLy8gY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGRlc2NyaXB0aW9uLmdldENoYXJzZXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyB3aWxsIHRyeSB0byBjbGVhbnVwIGluIGZpbmFsbHkKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoSVBhdGggZmlsZVBhdGgpIHsKLQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSUZpbGUgaUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJaWYgKGlGaWxlICE9IG51bGwgJiYgaUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgY2hhcnNldCA9IGRldGVjdENoYXJzZXQoaUZpbGUpOwotCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljb250ZW50cyA9IGlGaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29udGVudHMsIGNoYXJzZXQpOwotCQkJCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCQkJCQlpbnQgbiA9IHJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQl3aGlsZSAobiA+IDApIHsKLQkJCQkJCXMuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCQkJbiA9IHJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQW4gZXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgIiArIGZpbGVQYXRoLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBjID0gMDsKLQkJCQlpbnQgbGVuZ3RoID0gMDsKLQkJCQlpbnQgY291bnQgPSAwOwotCQkJCUZpbGUgZmlsZSA9IG51bGw7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoLnRvU3RyaW5nKCkpOwotCQkJCQlsZW5ndGggPSAoaW50KSBmaWxlLmxlbmd0aCgpOwotCQkJCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJCQl3aGlsZSAoKChjID0gZmlzLnJlYWQoKSkgPj0gMCkgJiYgKGNvdW50IDwgbGVuZ3RoKSkgewotCQkJCQkJY291bnQrKzsKLQkJCQkJCXMuYXBwZW5kKChjaGFyKSBjKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIiArIGZpbGVQYXRoICsgIlwiIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIHdyb25nOiBzcGVjaWZ5IGlucHV0ZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZmlzICE9IG51bGwpIHsKLQkJCQkJCQlmaXMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCS8vIGNvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA4ICg8JUAsCi0JCQkvLyB0YWdsaWIsIHVyaSwgPSwgd2hlcmUsIHByZWZpeCwgPSwgd2hhdCkKLQkJCWlmIChhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEgJiYgYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBmTG9jYWxQYXJzZXIuZ2V0VGV4dChhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSwgbmFtZS5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQlpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpKSB7Ci0JCQkJCQlwcm9jZXNzVGFnbGliKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBmQW5jaG9yLCBmTG9jYWxQYXJzZXIpOwotCQkJCQl9Ci0JCQkJCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLklOQ0xVREUpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKSkgewotCQkJCQkJcHJvY2Vzc0luY2x1ZGUoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGZBbmNob3IsIGZMb2NhbFBhcnNlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA1ICg8LAotCQkJLy8ganNwOnJvb3QsIHhtbG5zOnByZWZpeCwgPSwgd2hlcmUpCi0JCQllbHNlIGlmIChhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpIHsKLQkJCQlwcm9jZXNzSlNQUm9vdChhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZkFuY2hvciwgZkxvY2FsUGFyc2VyKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcGF0aCAtCi0JCSAqICAgICAgICAgICAgdGhlIGZ1bGxwYXRoIGZvciB0aGUgcmVzb3VyY2UgdG8gYmUgcGFyc2VkCi0JCSAqLwotCQl2b2lkIHBhcnNlKElQYXRoIHBhdGgpIHsKLQkJCUpTUFNvdXJjZVBhcnNlciBwID0gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCQkJZkxvY2FsUGFyc2VyID0gcDsKLQkJCUxpc3QgYmxvY2tUYWdzID0gZlBhcmVudFBhcnNlci5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCVN0cmluZyBzID0gZ2V0Q29udGVudHMocGF0aCk7Ci0JCQlmTG9jYWxQYXJzZXIuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJCWZMb2NhbFBhcnNlci5yZXNldChzKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tUYWdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKSBibG9ja1RhZ3MuZ2V0KGkpOwotCQkJCWZMb2NhbFBhcnNlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIobWFya2VyLmdldFRhZ05hbWUoKSwgbnVsbCwgbWFya2VyLmdldENvbnRleHQoKSwgbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSk7Ci0JCQl9Ci0JCQkvLyBmb3JjZSBwYXJzZQotCQkJZkxvY2FsUGFyc2VyLmdldERvY3VtZW50UmVnaW9ucygpOwotCQkJZkxvY2FsUGFyc2VyID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiBlbnRyeSBpbiB0aGUgc2hhcmVkIGNhY2hlIG1hcAotCSAqLwotCXN0YXRpYyBjbGFzcyBUTERDYWNoZUVudHJ5IHsKLQkJQ01Eb2N1bWVudCBkb2N1bWVudDsKLQkJaW50IHJlZmVyZW5jZUNvdW50OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRMRENNRG9jdW1lbnREZXNjcmlwdG9yIHsKLQkJT2JqZWN0IGNhY2hlS2V5OwotCQlDTURvY3VtZW50IGRvY3VtZW50OwotCi0JCVRMRENNRG9jdW1lbnREZXNjcmlwdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVExEQ01Eb2N1bWVudFJlZmVyZW5jZSB7Ci0JCVN0cmluZyBwcmVmaXg7Ci0JCVN0cmluZyB1cmk7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L21hbmFnZXIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z0NhY2hlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L2NhY2hlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLyB3aWxsIGhvbGQgdGhlIHByZWZpeGVzIGJhbm5lZCBieSB0aGUgc3BlY2lmaWNhdGlvbjsgdGFnbGlicyBtYXkgbm90IHVzZQotCS8vIHRoZW0KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgYmFubmVkUHJlZml4ZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGZDYWNoZSA9IG51bGw7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkIAotCi0Jc3RhdGljIGZpbmFsIGludCBYTUxOU19MRU5HVEggPSBYTUxOUy5sZW5ndGgoKTsKLQotCXN0YXRpYyB7Ci0JCWJhbm5lZFByZWZpeGVzID0gbmV3IEFycmF5TGlzdCg3KTsKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqc3AiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoImpzcHgiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoImphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoImphdmF4Iik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJzZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJzdW4iKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoInN1bnciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIG9mIHRoZSBrbm93biBkb2N1bWVudHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgSGFzaHRhYmxlIG9mIGVpdGhlciBUTERDYWNoZUVudHJ5cyBvciBXZWFrUmVmZXJlbmNlcwotCSAqICAgICAgICAgdG8gVExEIENNRG9jdW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNodGFibGUgZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpIHsKLQkJaWYgKGZDYWNoZSA9PSBudWxsKSB7Ci0JCQlmQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFVuaXF1ZUlkZW50aWZpZXIoSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UpIHsKLQkJT2JqZWN0IGlkZW50aWZpZXIgPSBudWxsOwotCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRQYXRoKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWlkZW50aWZpZXIgPSByZWNvcmQuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkvLyBUYWdEaXJSZWNvcmQgcmVjb3JkID0gKFRhZ0RpclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCS8vIGRvY3VtZW50ID0KLQkJCQkvLyBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KHJlY29yZC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRVUkwoKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWlkZW50aWZpZXIgPSByZWZlcmVuY2U7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGlkZW50aWZpZXI7Ci0JfQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlUTEQgZkNNRG9jdW1lbnRCdWlsZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBmRGlyZWN0aXZlSGFuZGxlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbG9jYWxseS1rbm93IGxpc3Qgb2YgQ01Eb2N1bWVudHMKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZSBmRG9jdW1lbnRzID0gbnVsbDsKLQotCS8vIHRpbWVzdGFtcCBjYWNoZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSByZXBhcnNpbmcKLQkvLyBvZiBpbmNsdWRlZCBmaWxlcwotCS8vIElQYXRoIChmaWxlcGF0aCkgPiBMb25nIChtb2RpZmljYXRpb24gc3RhbXApCi0JSGFzaE1hcCBmSW5jbHVkZTJUaW1lc3RhbXBNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBTdGFjayBmSW5jbHVkZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBKU1BTb3VyY2VQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3QgZlRhZ2xpYlRyYWNrZXJzID0gbnVsbDsKLQotCU1hcCBmVExEQ01SZWZlcmVuY2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBUTERDTURvY3VtZW50TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgY2xlYXJlZCBpdHMgcHJpdmF0ZSBDTURvY3VtZW50IGNhY2hlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREb2N1bWVudHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKLQkJCXN5bmNocm9uaXplZCAoZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBnZXRTaGFyZWREb2N1bWVudENhY2hlKCkuZ2V0KGtleSk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBUTERDYWNoZUVudHJ5KSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSAoVExEQ2FjaGVFbnRyeSkgbzsKLQkJCQkJZW50cnkucmVmZXJlbmNlQ291bnQtLTsKLQkJCQkJaWYgKGVudHJ5LnJlZmVyZW5jZUNvdW50IDw9IDApIHsKLQkJCQkJCWdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS5wdXQoa2V5LCBuZXcgV2Vha1JlZmVyZW5jZShlbnRyeS5kb2N1bWVudCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVyaXZlcyBhbiB1bmlxdWUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZSBVUkkuIFRoZSBVUkkgaXMgInJlc29sdmVkIgotCSAqIGFuZCBhIHVuaXF1ZSB2YWx1ZSBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0LiBUaGlzIGVuc3VyZXMgdGhhdCB0d28KLQkgKiBkaWZmZXJlbnQgcmVsYXRpdmUgcmVmZXJlbmNlcyBmcm9tIGRpZmZlcmVudCBmaWxlcyBkbyBub3QgaGF2ZSBvdmVybGFwcGluZwotCSAqIFRMRCByZWNvcmRzIGluIHRoZSBzaGFyZWQgY2FjaGUgaWYgdGhleSBkb24ndCByZXNvbHZlIHRvIHRoZSBzYW1lIFRMRC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q2FjaGVLZXkoU3RyaW5nIHVyaSkgewotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IFRhZ2xpYkluZGV4LnJlc29sdmUoZ2V0Q3VycmVudFBhcnNlclBhdGgoKS50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VW5pcXVlSWRlbnRpZmllcihyZWNvcmQpOwotCQl9Ci0JCVN0cmluZyBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkudG9TdHJpbmcoKSwgbnVsbCwgdXJpKTsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ01Eb2N1bWVudCBhdCB0aGUgdXJpIChjYWNoZWQpCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmZXJlbmNlID0gdXJpOwotCQkvKioKLQkJICogSlNQIDEuMiBTcGVjaWZpY2F0aW9uLCBzZWN0aW9uIDUuMi4yIGpzcC0xXzItZmNzLXNwZWMucGRmLCBwYWdlIDg3Ci0JCSAqLwotCQlTdHJpbmcgVVJOcHJlZml4ID0gInVybjpqc3B0bGQ6IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoVVJOcHJlZml4KSkgewotCQkJLyoqCi0JCQkgKiBAc2VlIHNlY3Rpb24gNy4zLjIKLQkJCSAqLwotCQkJaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA+IFVSTnByZWZpeC5sZW5ndGgoKSkKLQkJCQlyZWZlcmVuY2UgPSByZWZlcmVuY2Uuc3Vic3RyaW5nKDExKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qKgotCQkJICogQHNlZSBzZWN0aW9uIDcuMy42Ci0JCQkgKi8KLQkJfQotCQlPYmplY3QgY2FjaGVLZXkgPSBnZXRDYWNoZUtleShyZWZlcmVuY2UpOwotCQlDTURvY3VtZW50IGRvYyA9IChDTURvY3VtZW50KSBnZXREb2N1bWVudHMoKS5nZXQoY2FjaGVLZXkpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBJZiBoYXNuJ3QgYmVlbiBtb3ZlZCBpbnRvIHRoZSBsb2NhbCB0YWJsZSwgZG8gc28gYW5kIGluY3JlbWVudAotCQkJICogdGhlIGNvdW50LiBBIGxvY2FsIFVSSSByZWZlcmVuY2UgY2FuIGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24KLQkJCSAqIHRoZSBmaWxlIGZyb20gd2hpY2ggaXQgd2FzIHJlZmVyZW5jZWQuIFVzZSBhIGNvbXB1dGVkIGtleSB0bwotCQkJICoga2VlcCB0aGVtIHN0cmFpZ2h0LgotCQkJICovCi0JCQlPYmplY3QgbyA9IGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS5nZXQoY2FjaGVLZXkpOwotCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCWlmIChvIGluc3RhbmNlb2YgVExEQ2FjaGVFbnRyeSkgewotCQkJCQlUTERDYWNoZUVudHJ5IGVudHJ5ID0gKFRMRENhY2hlRW50cnkpIG87Ci0JCQkJCWlmIChfZGVidWdDYWNoZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50IGNhY2hlIGhpdCBvbiAiICsgY2FjaGVLZXkpOwotCQkJCQl9Ci0JCQkJCWRvYyA9IGVudHJ5LmRvY3VtZW50OwotCQkJCQllbnRyeS5yZWZlcmVuY2VDb3VudCsrOwotCQkJCX0KLQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgV2Vha1JlZmVyZW5jZSkgewotCQkJCQlkb2MgPSAoQ01Eb2N1bWVudCkgKChXZWFrUmVmZXJlbmNlKSBvKS5nZXQoKTsKLQkJCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJCQlUTERDYWNoZUVudHJ5IGVudHJ5ID0gbmV3IFRMRENhY2hlRW50cnkoKTsKLQkJCQkJCWVudHJ5LmRvY3VtZW50ID0gZG9jOwotCQkJCQkJZW50cnkucmVmZXJlbmNlQ291bnQgPSAxOwotCQkJCQkJZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnB1dChjYWNoZUtleSwgZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLyogTm8gZG9jdW1lbnQgd2FzIGZvdW5kIGNhY2hlZCwgY3JlYXRlIGEgbmV3IG9uZSBhbmQgc2hhcmUgaXQgKi8KLQkJCWlmIChkb2MgPT0gbnVsbCkgewotCQkJCWlmIChfZGVidWdDYWNoZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnQgY2FjaGUgbWlzcyBvbiAiICsgY2FjaGVLZXkpOwotCQkJCX0KLQkJCQlUTERDTURvY3VtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbG9hZFRhZ2xpYihyZWZlcmVuY2UpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJVExEQ2FjaGVFbnRyeSBlbnRyeSA9IG5ldyBUTERDYWNoZUVudHJ5KCk7Ci0JCQkJCWRvYyA9IGVudHJ5LmRvY3VtZW50ID0gZGVzY3JpcHRvci5kb2N1bWVudDsKLQkJCQkJZW50cnkucmVmZXJlbmNlQ291bnQgPSAxOwotCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGNhY2hlS2V5LCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJZ2V0RG9jdW1lbnRzKCkucHV0KGNhY2hlS2V5LCBkb2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY01Eb2N1bWVudEJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ01Eb2N1bWVudEZhY3RvcnlUTEQsIHNpbmNlIGl0IGhhcyBtb3JlIGJ1aWxkZXIKLQkgKiAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudEZhY3RvcnlUTEQgZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKSB7Ci0JCWlmIChmQ01Eb2N1bWVudEJ1aWxkZXIgPT0gbnVsbCkKLQkJCWZDTURvY3VtZW50QnVpbGRlciA9IG5ldyBDTURvY3VtZW50RmFjdG9yeVRMRCgpOwotCQlyZXR1cm4gZkNNRG9jdW1lbnRCdWlsZGVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRUcmFja2VycyhpbnQgb2Zmc2V0KSB7Ci0JCUxpc3QgdmFsaWREb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBhbGxkb2NzID0gZ2V0VGFnbGliVHJhY2tlcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWxsZG9jcy5oYXNOZXh0KCkpIHsKLQkJCVRhZ2xpYlRyYWNrZXIgYVRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgYWxsZG9jcy5uZXh0KCk7Ci0JCQlpZiAoYVRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSA8IG9mZnNldCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQkJdmFsaWREb2NzLmFkZChhVHJhY2tlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkRG9jczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50VHJhY2tlcnMoU3RyaW5nIHByZWZpeCwgaW50IG9mZnNldCkgewotCQlMaXN0IHZhbGlkRG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgYWxsZG9jcyA9IGdldFRhZ2xpYlRyYWNrZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbGRvY3MuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIGFUcmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGFsbGRvY3MubmV4dCgpOwotCQkJaWYgKChhVHJhY2tlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpIDwgb2Zmc2V0IHx8IG9mZnNldCA8IDApICYmIGFUcmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJdmFsaWREb2NzLmFkZChhVHJhY2tlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkRG9jczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbGVzeXN0ZW0gbG9jYXRpb24gaW4gdGhlIGN1cnJlbnQgcGFyc2VyLiBUaGlzIG1ldGhvZCBpcwotCSAqIGNhbGxlZCB3aGlsZSByZWN1cnNpbmcgdGhyb3VnaCBpbmNsdWRlZCBmcmFnbWVudHMsIHNvIGl0IG11Y2ggY2hlY2sgdGhlCi0JICogaW5jbHVkZSBzdGFjay4gVGhlIGZpbGVzeXN0ZW0gbG9jYXRpb24gaXMgbmVlZGVkIGZvciBjb21tb24gVVJJCi0JICogcmVzb2x1dGlvbiBpbiBjYXNlIHRoZSBUYWdsaWIgSW5kZXggZG9lc24ndCBrbm93IHRoZSBVUkkgYmVpbmcgbG9hZGVkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJUGF0aCBnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkgewotCQlJUGF0aCBiYXNlTG9jYXRpb24gPSBudWxsOwotCQlJUGF0aCBwYXRoID0gZ2V0Q3VycmVudFBhcnNlclBhdGgoKTsKLQkJYmFzZUxvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldExvY2F0aW9uKCk7Ci0JCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJYmFzZUxvY2F0aW9uID0gcGF0aDsKLQkJfQotCQlyZXR1cm4gYmFzZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB1c2VkIGluIHRoZSBjdXJyZW50IHBhcnNlci4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlCi0JICogcmVjdXJzaW5nIHRocm91Z2ggaW5jbHVkZWQgZnJhZ21lbnRzLCBzbyBpdCBtdWNoIGNoZWNrIHRoZSBpbmNsdWRlCi0JICogc3RhY2suCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlQYXRoIGdldEN1cnJlbnRQYXJzZXJQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJaWYgKCFnZXRJbmNsdWRlcygpLmlzRW1wdHkoKSkgewotCQkJcGF0aCA9IChJUGF0aCkgZ2V0SW5jbHVkZXMoKS5wZWVrKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gVGFnbGliQ29udHJvbGxlci5nZXRGaWxlQnVmZmVyKHRoaXMpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBnZXREaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkgewotCQlpZiAoZkRpcmVjdGl2ZUhhbmRsZXIgPT0gbnVsbCkKLQkJCWZEaXJlY3RpdmVIYW5kbGVyID0gbmV3IERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKTsKLQkJcmV0dXJuIGZEaXJlY3RpdmVIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRvY3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBqYXZhLnV0aWwuSGFzaHRhYmxlCi0JICovCi0JcHVibGljIEhhc2h0YWJsZSBnZXREb2N1bWVudHMoKSB7Ci0JCWlmIChmRG9jdW1lbnRzID09IG51bGwpCi0JCQlmRG9jdW1lbnRzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlyZXR1cm4gZkRvY3VtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENNRG9jdW1lbnQgYXQgdGhlIHRhZ2RpciAoY2FjaGVkKQotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGdldEltcGxpY2l0Q01Eb2N1bWVudChTdHJpbmcgdGFnZGlyKSB7Ci0JCWlmICh0YWdkaXIgPT0gbnVsbCB8fCB0YWdkaXIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmZXJlbmNlID0gdGFnZGlyOwotCQkvKioKLQkJICogSlNQIDEuMiBTcGVjaWZpY2F0aW9uLCBzZWN0aW9uIDUuMi4yIGpzcC0xXzItZmNzLXNwZWMucGRmLCBwYWdlIDg3Ci0JCSAqLwotCQlTdHJpbmcgVVJOcHJlZml4ID0gInVybjpqc3B0bGQ6IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoVVJOcHJlZml4KSkgewotCQkJLyoqCi0JCQkgKiBAc2VlIHNlY3Rpb24gNy4zLjIKLQkJCSAqLwotCQkJaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA+IFVSTnByZWZpeC5sZW5ndGgoKSkKLQkJCQlyZWZlcmVuY2UgPSByZWZlcmVuY2Uuc3Vic3RyaW5nKDExKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qKgotCQkJICogQHNlZSBzZWN0aW9uIDcuMy42Ci0JCQkgKi8KLQkJfQotCQlDTURvY3VtZW50IGRvYyA9IChDTURvY3VtZW50KSBnZXREb2N1bWVudHMoKS5nZXQocmVmZXJlbmNlKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlkb2MgPSBsb2FkVGFnRGlyKHJlZmVyZW5jZSk7Ci0JCQlpZiAoZG9jICE9IG51bGwpCi0JCQkJZ2V0RG9jdW1lbnRzKCkucHV0KHJlZmVyZW5jZSwgZG9jKTsKLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0YWNrCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrIGdldEluY2x1ZGVzKCkgewotCQlpZiAoZkluY2x1ZGVzID09IG51bGwpCi0JCQlmSW5jbHVkZXMgPSBuZXcgU3RhY2soKTsKLQkJcmV0dXJuIGZJbmNsdWRlczsKLQl9Ci0KLQlKU1BTb3VyY2VQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgSlNQU291cmNlUGFyc2VyIGdldFNvdXJjZVBhcnNlcigpIHsKLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIGdldERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VGFnbGliVHJhY2tlcnMoKSB7Ci0JCWlmIChmVGFnbGliVHJhY2tlcnMgPT0gbnVsbCkKLQkJCWZUYWdsaWJUcmFja2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZUYWdsaWJUcmFja2VyczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIGNoZWNrIGZvciBtb2RpZmljYXRpb24KLQkgKi8KLQlib29sZWFuIGhhc0FueUluY2x1ZGVCZWVuTW9kaWZpZWQoSVBhdGggZmlsZVBhdGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gY2hlY2sgdGhlIHRvcCBsZXZlbAotCQlpZiAoaGFzQmVlbk1vZGlmaWVkKGZpbGVQYXRoKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGNoZWNrIGFsbCBpbmNsdWRlZXMKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBmSW5jbHVkZTJUaW1lc3RhbXBNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCWlmIChoYXNCZWVuTW9kaWZpZWQoKElQYXRoKSBpdGVyLm5leHQoKSkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaGFzQmVlbk1vZGlmaWVkKElQYXRoIGZpbGVQYXRoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIHF1aWNrIGZpbGVuYW1lL3RpbWVzdGFtcCBjYWNoZSBjaGVjayBoZXJlLi4uCi0JCUlGaWxlIGYgPSBudWxsOwotCQlpZiAoZiA9PSBudWxsICYmIGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCX0KLQkJaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0JCQlMb25nIGN1cnJlbnRTdGFtcCA9IG5ldyBMb25nKGYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQlPYmplY3QgbyA9IGZJbmNsdWRlMlRpbWVzdGFtcE1hcC5nZXQoZmlsZVBhdGgpOwotCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCUxvbmcgcHJldmlvdXNTdGFtcCA9IChMb25nKSBvOwotCQkJCS8vIHN0YW1wcyBkb24ndCBtYXRjaCwgZmlsZSBjaGFuZ2VkCi0JCQkJaWYgKGN1cnJlbnRTdGFtcC5sb25nVmFsdWUoKSAhPSBwcmV2aW91c1N0YW1wLmxvbmdWYWx1ZSgpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCS8vIHN0b3JlIGZvciBuZXh0IHRpbWUKLQkJCQkJZkluY2x1ZGUyVGltZXN0YW1wTWFwLnB1dChmaWxlUGF0aCwgY3VycmVudFN0YW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyByZXR1cm4gdHJ1ZSwgc2luY2Ugd2UndmUgbm90IGVuY291bnRlcmVkIHRoaXMgZmlsZSB5ZXQuCi0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkvLyBzdG9yZSBmb3IgbmV4dCB0aW1lCi0JCQkJZkluY2x1ZGUyVGltZXN0YW1wTWFwLnB1dChmaWxlUGF0aCwgY3VycmVudFN0YW1wKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliUmVjb3JkRXZlbnQgZXZlbnQpIHt9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgdGFncyBmcm9tIHRoZSBzcGVjaWZpZWQgVVJJLiBJdCBtdXN0IHBvaW50IHRvIGEgVVJMIG9mIHZhbGlkCi0JICogdGFnIGZpbGVzIHRvIHdvcmsuCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgbG9hZFRhZ0RpcihTdHJpbmcgdXJpKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVmZXJlbmNlID0gVGFnbGliSW5kZXgucmVzb2x2ZShnZXRDdXJyZW50UGFyc2VyUGF0aCgpLnRvU3RyaW5nKCksIHVyaSwgZmFsc2UpOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRDTURvY3VtZW50QnVpbGRlcigpLmNyZWF0ZUNNRG9jdW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRvY3VtZW50OwotCQkJfQotCQl9Ci0JCS8vIEpTUDJfVE9ETzogaW1wbGVtZW50IGZvciBKU1AgMi4wCi0JCVN0cmluZyBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkudG9TdHJpbmcoKSwgbnVsbCwgdXJpKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKF9kZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIHRhZ3MgZnJvbSBkaXIiICsgdXJpICsgIiBhdCAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRDTURvY3VtZW50QnVpbGRlcigpLmNyZWF0ZUNNRG9jdW1lbnQobG9jYXRpb24pOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSB0YWdsaWIgZnJvbSB0aGUgc3BlY2lmaWVkIFVSSS4gSXQgbXVzdCBwb2ludCB0byBhIHZhbGlkCi0JICogdGFnbGliIGRlc2NyaXB0b3IgdG8gd29yay4KLQkgKi8KLQlwcm90ZWN0ZWQgVExEQ01Eb2N1bWVudERlc2NyaXB0b3IgbG9hZFRhZ2xpYihTdHJpbmcgdXJpKSB7Ci0JCVRMRENNRG9jdW1lbnREZXNjcmlwdG9yIGVudHJ5ID0gbnVsbDsKLQkJSVBhdGggY3VycmVudFBhdGggPSBnZXRDdXJyZW50UGFyc2VyUGF0aCgpOwotCQlpZiAoY3VycmVudFBhdGggIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IFRhZ2xpYkluZGV4LnJlc29sdmUoY3VycmVudFBhdGgudG9TdHJpbmcoKSwgdXJpLCBmYWxzZSk7Ci0JCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCQlkb2N1bWVudCA9IGdldENNRG9jdW1lbnRCdWlsZGVyKCkuY3JlYXRlQ01Eb2N1bWVudChyZWNvcmQpOwotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5ID0gbmV3IFRMRENNRG9jdW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCWVudHJ5LmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQkJCWVudHJ5LmNhY2hlS2V5ID0gZ2V0VW5pcXVlSWRlbnRpZmllcihyZWNvcmQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIE5vdCBhIHZlcnktb2Z0ZW4gdXNlZCBjb2RlIHBhdGggKHdlIGhvcGUpICovCi0JCQkJSVBhdGggY3VycmVudEJhc2VMb2NhdGlvbiA9IGdldEN1cnJlbnRCYXNlTG9jYXRpb24oKTsKLQkJCQlpZiAoY3VycmVudEJhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShjdXJyZW50QmFzZUxvY2F0aW9uLnRvU3RyaW5nKCksIG51bGwsIHVyaSk7Ci0JCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIHRhZ3MgZnJvbSAiICsgdXJpICsgIiBhdCAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZG9jdW1lbnQgPSBnZXRDTURvY3VtZW50QnVpbGRlcigpLmNyZWF0ZUNNRG9jdW1lbnQobG9jYXRpb24pOwotCQkJCQkJZW50cnkgPSBuZXcgVExEQ01Eb2N1bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJCWVudHJ5LmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQkJCQllbnRyeS5jYWNoZUtleSA9IGxvY2F0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFRhZ2xpYlRyYWNrZXJzKCkgewotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGNsZWFyZWQgaXRzIHRhZ2xpYiB0cmFja2Vyc1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlnZXRUYWdsaWJUcmFja2VycygpLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlUGFyc2VyKEpTUFNvdXJjZVBhcnNlciBwYXJzZXIpIHsKLQkJaWYgKGZQYXJzZXIgIT0gbnVsbCkKLQkJCWZQYXJzZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkpOwotCQlmUGFyc2VyID0gcGFyc2VyOwotCQlpZiAoZlBhcnNlciAhPSBudWxsKQotCQkJZlBhcnNlci5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjN2RlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExERnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUTERGdW5jdGlvbkltcGwgaW1wbGVtZW50cyBUTERGdW5jdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRGlzcGxheU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZFeGFtcGxlID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCXByaXZhdGUgU3RyaW5nIGZJY29uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZTaWduYXR1cmUgPSBudWxsOwotCi0JcHVibGljIFRMREZ1bmN0aW9uSW1wbChDTURvY3VtZW50IG93bmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lckRvY3VtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGFzc05hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkaXNwbGF5TmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZkRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhhbXBsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBmRXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEljb24oKSB7Ci0JCXJldHVybiBmSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvd25lckRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmT3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNpZ25hdHVyZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJcmV0dXJuIGZTaWduYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqICAgICAgICAgICAgVGhlIGNsYXNzTmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZkNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZQotCSAqICAgICAgICAgICAgVGhlIGRpc3BsYXlOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJZkRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4YW1wbGUKLQkgKiAgICAgICAgICAgIFRoZSBleGFtcGxlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGFtcGxlKFN0cmluZyBleGFtcGxlKSB7Ci0JCWZFeGFtcGxlID0gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWNvbgotCSAqICAgICAgICAgICAgVGhlIGljb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oU3RyaW5nIGljb24pIHsKLQkJZkljb24gPSBpY29uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNpZ25hdHVyZQotCSAqICAgICAgICAgICAgVGhlIHNpZ25hdHVyZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUpIHsKLQkJZlNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREluaXRQYXJhbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MWIyYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREluaXRQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERJbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERJbml0UGFyYW1JbXBsIGltcGxlbWVudHMgVExESW5pdFBhcmFtIHsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFRMREluaXRQYXJhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZXNjcmlwdGlvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERlc2NyaXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhbHVlOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRExpc3RlbmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRExpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTFhZTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERMaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFRMRExpc3RlbmVySW1wbCBpbXBsZW1lbnRzIFRMRExpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxpc3RlbmVyQ2xhc3M7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlsaXN0ZW5lckNsYXNzID0gY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbGlzdGVuZXIgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRMaXN0ZW5lckNsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI2ZjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFRMRFZhbGlkYXRvckltcGwgaW1wbGVtZW50cyBUTERWYWxpZGF0b3IgewotCXByb3RlY3RlZCBMaXN0IGluaXRQYXJhbXM7Ci0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0b3JDbGFzczsKLQotCXB1YmxpYyBMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpCi0JCQlpbml0UGFyYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdFBhcmFtcyhMaXN0IGluaXRQYXJhbXMpIHsKLQkJdGhpcy5pbml0UGFyYW1zID0gaW5pdFBhcmFtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JDbGFzcyhTdHJpbmcgdmFsaWRhdG9yQ2xhc3MpIHsKLQkJdGhpcy52YWxpZGF0b3JDbGFzcyA9IHZhbGlkYXRvckNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFsaWRhdG9yIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFsaWRhdG9yQ2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgaW5pdC1wYXJtczoiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldEluaXRQYXJhbXMoKS5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG4iICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXRJbml0UGFyYW1zKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OTgzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVExEVmFyaWFibGVJbXBsIGltcGxlbWVudHMgVExEVmFyaWFibGUgewotCS8vIG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gdHJ1ZQotCXByaXZhdGUgYm9vbGVhbiBkZWNsYXJlID0gdHJ1ZTsKLQkKLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0JLy8gcmVxdWlyZWQKLQlwcml2YXRlIFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZTsKLQkvLyByZXF1aXJlZAotCXByaXZhdGUgU3RyaW5nIG5hbWVHaXZlbjsKLQkvLyBvcHRpb25hbCAtIGRlZmF1bHRzIHRvIE5FU1RFRAotCXByaXZhdGUgU3RyaW5nIHNjb3BlID0gSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9TQ09QRV9ORVNURUQ7Ci0JLy8gcmVxdWlyZWQgLSBkZWZhdWx0cyB0byBhIFN0cmluZwotCXByaXZhdGUgU3RyaW5nIHZhcmlhYmxlQ2xhc3MgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBib29sZWFuIGdldERlY2xhcmUoKSB7Ci0JCXJldHVybiBkZWNsYXJlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVGcm9tQXR0cmlidXRlKCkgewotCQlyZXR1cm4gbmFtZUZyb21BdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lR2l2ZW4oKSB7Ci0JCXJldHVybiBuYW1lR2l2ZW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGVDbGFzcygpIHsKLQkJcmV0dXJuIHZhcmlhYmxlQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyZShib29sZWFuIGRlY2xhcmUpIHsKLQkJdGhpcy5kZWNsYXJlID0gZGVjbGFyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJlU3RyaW5nKFN0cmluZyBkZWNsKSB7Ci0JCXNldERlY2xhcmUoZGVjbC5lcXVhbHMoSlNQMTJUTEROYW1lcy5UUlVFKSB8fCBkZWNsLmVxdWFscyhKU1AxMlRMRE5hbWVzLllFUykpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZUZyb21BdHRyaWJ1dGUoU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlKSB7Ci0JCXRoaXMubmFtZUZyb21BdHRyaWJ1dGUgPSBuYW1lRnJvbUF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lR2l2ZW4oU3RyaW5nIG5hbWVHaXZlbikgewotCQl0aGlzLm5hbWVHaXZlbiA9IG5hbWVHaXZlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmxlQ2xhc3MoU3RyaW5nIHZhcmlhYmxlQ2xhc3MpIHsKLQkJdGhpcy52YXJpYWJsZUNsYXNzID0gdmFyaWFibGVDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWUgZ2l2ZW46IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROYW1lR2l2ZW4oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbmFtZSBmcm9tIGF0dHJpYnV0ZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE5hbWVGcm9tQXR0cmlidXRlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBCb29sZWFuLnRvU3RyaW5nKGJvb2xlYW4pIGlzIGludHJvZHVjZWQgaW4gSkRLIDEuNAotCQkvL2J1ZmZlci5hcHBlbmQoIlxuXHQgZGVjbGFyZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKEJvb2xlYW4udG9TdHJpbmcoZ2V0RGVjbGFyZSgpKSkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IGRlY2xhcmU6IiArIFN0cmluZ1V0aWxzLnRvU3RyaW5nKGdldERlY2xhcmUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgc2NvcGU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRTY29wZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YXJpYWJsZSBjbGFzczoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFZhcmlhYmxlQ2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RhZ2xpYlRyYWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDkwYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RhZ2xpYlRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50V3JhcHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLQotLyoqCi0gKiBUYWdsaWJUcmFja2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJUcmFja2VyIGV4dGVuZHMgQ01Eb2N1bWVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudFRyYWNrZXIgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQlwdWJsaWMgVGFnbGliVHJhY2tlcihTdHJpbmcgbmV3VVJJLCBTdHJpbmcgbmV3UHJlZml4LCBDTURvY3VtZW50IHRsZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCXN1cGVyKG5ld1VSSSwgbmV3UHJlZml4LCB0bGQpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gYVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFByZWZpeCgpICsgIkAiICsgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDExVExETmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMVRMRE5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDg0ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDExVExETmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTFUTEROYW1lcyB7Ci0KLQlTdHJpbmcgVEFHTElCID0gInRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBDT05URU5UX0pTUCA9ICJKU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRFTlRfRU1QVFkgPSAiZW1wdHkiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRFTlRfVEFHREVQRU5ERU5UID0gInRhZ2RlcGVuZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUcgPSAidGFnIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BWRVJTSU9OID0gImpzcHZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRMSUJWRVJTSU9OID0gInRsaWJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTSE9SVE5BTUUgPSAic2hvcnRuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUk4gPSAidXJuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBURUlDTEFTUyA9ICJ0ZWljbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHQ0xBU1MgPSAidGFnY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJPRFlDT05URU5UID0gImJvZHljb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUlRFWFBSVkFMVUUgPSAicnRleHBydmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBZRVMgPSAieWVzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBOTyA9ICJubyI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTJUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDEyVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3Mjk4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTJUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotcHVibGljIGludGVyZmFjZSBKU1AxMlRMRE5hbWVzIHsKLQotCVN0cmluZyBUQUdMSUIgPSBKU1AxMVRMRE5hbWVzLlRBR0xJQjsKLQotCVN0cmluZyBDT05URU5UX0pTUCA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9KU1A7Ci0JU3RyaW5nIENPTlRFTlRfRU1QVFkgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFk7Ci0JU3RyaW5nIENPTlRFTlRfVEFHREVQRU5ERU5UID0gSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVDsKLQotCVN0cmluZyBUQUcgPSBKU1AxMVRMRE5hbWVzLlRBRzsKLQlTdHJpbmcgSlNQX1ZFUlNJT04gPSAianNwLXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRMSUJfVkVSU0lPTiA9ICJ0bGliLXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNIT1JUX05BTUUgPSAic2hvcnQtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJJID0gSlNQMTFUTEROYW1lcy5VUkk7Ci0JU3RyaW5nIFVSTiA9IEpTUDExVExETmFtZXMuVVJOOwotCi0JU3RyaW5nIE5BTUUgPSBKU1AxMVRMRE5hbWVzLk5BTUU7Ci0JU3RyaW5nIFRFSV9DTEFTUyA9ICJ0ZWktY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR19DTEFTUyA9ICJ0YWctY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJPRFlfQ09OVEVOVCA9ICJib2R5LWNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJJQlVURSA9IEpTUDExVExETmFtZXMuQVRUUklCVVRFOwotCi0JU3RyaW5nIElEID0gSlNQMTFUTEROYW1lcy5JRDsKLQlTdHJpbmcgUkVRVUlSRUQgPSBKU1AxMVRMRE5hbWVzLlJFUVVJUkVEOwotCVN0cmluZyBSVEVYUFJWQUxVRSA9IEpTUDExVExETmFtZXMuUlRFWFBSVkFMVUU7Ci0KLQlTdHJpbmcgUFJFRklYID0gSlNQMTFUTEROYW1lcy5QUkVGSVg7Ci0KLQlTdHJpbmcgSU5DTFVERSA9IEpTUDExVExETmFtZXMuSU5DTFVERTsKLQlTdHJpbmcgRklMRSA9IEpTUDExVExETmFtZXMuRklMRTsKLQotCVN0cmluZyBUUlVFID0gSlNQMTFUTEROYW1lcy5UUlVFOwotCVN0cmluZyBGQUxTRSA9IEpTUDExVExETmFtZXMuRkFMU0U7Ci0JU3RyaW5nIFlFUyA9IEpTUDExVExETmFtZXMuWUVTOwotCVN0cmluZyBOTyA9IEpTUDExVExETmFtZXMuTk87Ci0KLQkvKgotCSAqIEBzZWUgRWNsaXBzZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTTUFMTF9JQ09OID0gInNtYWxsLWljb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExBUkdFX0lDT04gPSAibGFyZ2UtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JU3RyaW5nIFZBTElEQVRPUiA9ICJ2YWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9DTEFTUyA9ICJ2YWxpZGF0b3ItY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9JTklUX1BBUkFNID0gImluaXQtcGFyYW0iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9QQVJBTV9OQU1FID0gInBhcmFtLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9QQVJBTV9WQUxVRSA9ICJwYXJhbS12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JU3RyaW5nIExJU1RFTkVSID0gImxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBMSVNURU5FUl9DTEFTUyA9ICJsaXN0ZW5lci1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBWQVJJQUJMRSA9ICJ2YXJpYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfTkFNRV9HSVZFTiA9ICJuYW1lLWdpdmVuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFID0gIm5hbWUtZnJvbS1hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX0NMQVNTID0gInZhcmlhYmxlLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9ERUNMQVJFID0gImRlY2xhcmUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRV9ORVNURUQgPSAiTkVTVEVEIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRV9BVF9CRUdJTiA9ICJBVF9CRUdJTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEVfQVRfRU5EID0gIkFUX0VORCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMjBUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1MWUxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMjBUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotLypubHNYWFgqLwotcHVibGljIGludGVyZmFjZSBKU1AyMFRMRE5hbWVzIGV4dGVuZHMgSlNQMTJUTEROYW1lcyB7Ci0JU3RyaW5nIENPTlRFTlRfU0NSSVBUTEVTUyA9ICJzY3JpcHRsZXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFWEFNUExFID0gImV4YW1wbGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTiA9ICJmdW5jdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT05fQ0xBU1MgPSAiZnVuY3Rpb24tY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OX0VYVEVOU0lPTiA9ICJmdW5jdGlvbi1leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OX1NJR05BVFVSRSA9ICJmdW5jdGlvbi1zaWduYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIElDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdfRVhURU5TSU9OID0gInRhZy1leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR19GSUxFID0gInRhZy1maWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFRBR0RJUiA9ICJ0YWdkaXIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFRBR0xJQl9FWFRFTlNJT04gPSAidGFnbGliLWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzOGJmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZyb20gYSBUTEQKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBleHRlbmRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JLyoqCi0JICogdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQlDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUgYnkgYW4gZXhwcmVzc2lvbgotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0UnRleHBydmFsdWUoKTsKLQotCS8qKgotCSAqIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0ZyYWdtZW50KCk7Ci0JCi0JLyoqCi0JICogaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbAotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTEREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjFhNmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTEREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBUTEREb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnQgewotCi0JU3RyaW5nIENNX0tJTkQgPSAiQ29udGVudCBNb2RlbCBLaW5kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfVExEID0gIkpTUCBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHNlZSAgSlNQIDIuMAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJkZXNjcmlwdGlvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLCBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZS4KLQkgKiBAc2VlICBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImRpc3BsYXktbmFtZSIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgaXQgaXMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBMaXN0IC0gQSBsaXN0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSB0YWcgbGlicmFyeQotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKi8KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIExpc3QgLSBBIGxpc3Qgb2YgVExERnVuY3Rpb25zIGRlc2NyaWJpbmcgdGhlIGRlY2xhcmVkIGZ1bmN0aW9ucwotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKi8KLQlMaXN0IGdldEZ1bmN0aW9ucygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAiaW5mbyIgZWxlbWVudCBvZiBhIEpTUCAxLjEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLCBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZS4KLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEluZm8oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEpzcHZlcnNpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAibGFyZ2UtaWNvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgb3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKiBAcmV0dXJuIExpc3QgLSBhIExpc3Qgb2YgVExETGlzdGVuZXJzCi0JICovCi0JTGlzdCBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gQSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcnJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFNob3J0bmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJzbWFsbC1pY29uIiBlbGVtZW50IG9mIGEgSlNQIDEuMiB0YWcgbGlicmFyeSBkZXNjcmlwdG9yOyBvcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQkgKiBAc2VlICBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgKGl0J3MgaW1wbGVtZW50YXRpb24pCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRUbGlidmVyc2lvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgVVJJIGRlY2xhcmVkIHdpdGhpbiB0aGUgZGVzY3JpcHRvcgotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAc2VlICBKU1AgMS4yCi0JICovCi0JVExEVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERFbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERFbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxYWMzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVExERWxlbWVudERlY2xhcmF0aW9uIGV4dGVuZHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogVGhlIGJvZHkgY29udGVudCB0eXBlCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEJvZHljb250ZW50KCk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCSAqIAotCSAqIEBzZWUgSlNQIDIuMAotCSAqLwotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsCi0JICogZm9yIHRvb2wgY29uc3VtcHRpb24KLQkgKiAKLQkgKiBAc2VlIEpTUCAyLjAKLQkgKi8KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBzZWUgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRJbmZvKCk7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGFuIG9wdGlvbmFsIGxhcmdlIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCUNNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JLyoqCi0JICogV2hlcmUgdG8gZmluZCB0aGUgLnRhZyBmaWxlIGltcGxlbWVudGluZyB0aGlzIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlCi0JICogcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIG9yIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYSB0YWcKLQkgKiBsaWJyYXJ5IHBhY2thZ2VkIGluIGEgSkFSLiBUaGlzIG11c3QgYmVnaW4gd2l0aCAvV0VCLUlORi90YWdzIGlmIHRoZQotCSAqIC50YWcgZmlsZSByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZSAudGFnIGZpbGUKLQkgKiByZXNpZGVzIGluIGEgSkFSLgotCSAqIAotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIC50YWcoeCkgZmlsZSBhcyBkZWZpbmVkIGluIHRoZSAudGxkIGZpbGUsIG51bGwKLQkgKiAgICAgICAgIGlmIGludGVybmFsIHRvIHRoZSAudGxkCi0JICogQHNlZSBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldFBhdGgoKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgYW4gb3B0aW9uYWwgc21hbGwgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogCi0JICogQHNlZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZwotCSAqIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VGFnY2xhc3MoKTsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIGFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCi0JICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRUZWljbGFzcygpOwotCi0JLyoqCi0JICogQHNlZSBKU1AgMS4yCi0JICogQHJldHVybiBMaXN0IG9mIFRMRFZhcmlhYmxlcwotCSAqLwotCUxpc3QgZ2V0VmFyaWFibGVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyYjUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBUTERGdW5jdGlvbiB7Ci0KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0JCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQotCVN0cmluZyBnZXRJY29uKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREluaXRQYXJhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREluaXRQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTMzNjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERJbml0UGFyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLQotLyoqCi0gKiBBIG5hbWUvdmFsdWUgcGFpciBhcyBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBhbG9uZyB3aXRoIGEgZGVzY3JpcHRpb24KLSAqIEBzZWUgSlNQIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMREluaXRQYXJhbSB7Ci0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExETGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDkxNWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotCi0vKioKLSAqIERlZmluZXMgYW4gb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5Ci0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERMaXN0ZW5lciB7Ci0JU3RyaW5nIGdldExpc3RlbmVyQ2xhc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OGE4OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogRGVmaW5lcyBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5Ci0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERWYWxpZGF0b3IgewotCS8qKgotCSAqIEByZXR1cm4gTGlzdCAtIGEgTGlzdCBvZiBUTERJbml0UGFyYW1zCi0JICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQlTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEVmFyaWFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYXJpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVjYmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBJbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyBkZWZpbmVkIGJ5IHRoaXMgdGFnLgotICogQHNlZSAgSlNQIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMRFZhcmlhYmxlIHsKLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG9yIG5vdCwgdHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQkgKi8KLQlib29sZWFuIGdldERlY2xhcmUoKTsKLQotCS8qKgotCSAqIEByZXR1cm50aGUgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIHZhcmlhYmxlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUsIG9yIG51bGwgb2YgdGhlIG5hbWUgaXMgbm90IHRvIGJlIG9idGFpbmVkIHRoaXMgd2F5LgotCSAqLwotCVN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogVGhlIHZhcmlhYmxlIG5hbWUgZ2l2ZW4gYXMgYSBjb25zdGFudCwgb3IgbnVsbCBvZiB0aGUgbmFtZSBpcyBub3Qgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXROYW1lR2l2ZW4oKTsKLQkKLQkvKioKLQkgKiBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBkZWZpbmVkLgotCSAqLwotCVN0cmluZyBnZXRTY29wZSgpOwotCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLCBqYXZhLmxhbmcuU3RyaW5nIGlmIG51bGwKLQkgKi8KLQlTdHJpbmcgZ2V0VmFyaWFibGVDbGFzcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2U5MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcm9wZXJ0aWVzIGNvbnN0YW50cyB1c2VkIGJ5IEpTUCBGcmFnbWVudHMuIENsaWVudHMgc2hvdWxkIG9ubHkgcmVhZCBhbmQKLSAqIG1vZGlmeSB0aGUgSlNQIEZyYWdtZW50IHByb3BlcnRpZXMgcHJvZ3JhbW1hdGljYWxseSB1c2luZyB0aGlzIGNsYXNzLgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGQ29udGVudFByb3BlcnRpZXMgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQQ09SRV9JRCA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0tFWSA9ICI8cHJvamVjdD4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIG5hbWVkIGtleSB0aGF0IGNvbnRyb2xzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGZvciBKU1AgRnJhZ21lbnRzCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQTEFOR1VBR0UgPSAianNwLWxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEEgbmFtZWQga2V5IHRoYXQgY29udHJvbHMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlIGZvciBKU1AgRnJhZ21lbnRzCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQQ09OVEVOVFRZUEUgPSAianNwLWNvbnRlbnQtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgSlNQIGZyYWdtZW50cyBzaG91bGQgYmUgY29tcGlsZWQvdmFsaWRhdGVkLiBKU1AgZnJhZ21lbnRzCi0JICogd2lsbCBiZSB2YWxpZGF0ZWQgd2hlbiB0cnVlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0ZSQUdNRU5UUyA9ICJ2YWxpZGF0ZUZyYWdtZW50cyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdGhlIGtleSB3aWxsIGJlIGJhc2VkIG9mZiBvZgotCSAqIEByZXR1cm4gcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoIChiYXNpY2FsbHkgdGhlCi0JICogICAgICAgICByZXNvdXJjZVBhdGggd2l0aG91dCB0aGUgZmlsZW5hbWUpOyBQUk9KRUNUX0tFWSBpZiByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGlzIG51bGwKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEtleUZvcihJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJU3RyaW5nIGtleSA9IFBST0pFQ1RfS0VZOwotCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJa2V5ID0gcmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJlZmVyZW5jZXMgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogcHJlZmVyZW5jZSBrZXkgKHN1Yk5vZGUpIElmIGNyZWF0ZSBpcyB0cnVlLCB0aGUgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUKLQkgKiBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgdW5kZXIKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgdGhlIHN1Ym5vZGUvY2F0ZWdvcnkgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyBsb2NhdGVkIGluCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgYSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdAotCSAqICAgICAgICAgICAgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4gUHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqICAgICAgICAgcHJlZmVyZW5jZSBrZXkuIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBmb3VuZCBhbmQgY3JlYXRlIGlzCi0JICogICAgICAgICBmYWxzZQotCSAqLwotCXN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNyZWF0ZSkKLQkJCS8vIGNyZWF0ZSBhbGwgbm9kZXMgZG93biB0byB0aGUgb25lIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KS5nZXROb2RlKEpTUENPUkVfSUQpLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCS8vIGJlIGNhcmVmdWwgbG9va2luZyB1cCBmb3Igb3VyIG5vZGUgc28gbm90IHRvIGNyZWF0ZSBhbnkgbm9kZXMgYXMKLQkJLy8gc2lkZSBlZmZlY3QKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCkubm9kZShQcm9qZWN0U2NvcGUuU0NPUEUpOwotCQl0cnkgewotCQkJLy8gVE9ETyBvbmNlIGJ1ZyA5MDUwMCBpcyBmaXhlZCwgc2hvdWxkIGJlIGFzIHNpbXBsZSBhcyB0aGlzOgotCQkJLy8gU3RyaW5nIHBhdGggPSBwcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIEVOQ09ESU5HX1BSRUZfTk9ERTsKLQkJCS8vIHJldHVybiBub2RlLm5vZGVFeGlzdHMocGF0aCkgPyBub2RlLm5vZGUocGF0aCkgOiBudWxsOwotCQkJLy8gZm9yIG5vdywgdGFrZSB0aGUgbG9uZyB3YXkKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByb2plY3QuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMoSlNQQ09SRV9JRCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKEpTUENPUkVfSUQpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJlZmVyZW5jZUtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbm9kZS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm9kZUV4aXN0cyBmYWlsZWQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgcmV0cmlldmUgcHJlZmVyZW5jZSBub2RlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgaXMKLQkgKiAgICAgICAgICAgIGF2YWlsYWJsZSBhbmQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHNob3VsZCBiZSB0YWtlbi4gTm90ZQotCSAqICAgICAgICAgICAgdGhhdCBwYXNzaW5nIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBhdm9pZGVkLgotCSAqIEBwYXJhbSByZWN1cnNlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHF1ZXJpZWQgdGlsbCBwcm9wZXJ0eSBpcyBmb3VuZAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGtleS4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UpIHsKLQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsID0gaW50ZXJuYWxHZXRQcm9wZXJ0eShyZXNvdXJjZSwgcmVjdXJzZSwgcHJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBubyBwcmVmZXJlbmNlcyBmb3VuZCAtIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLAotCQkvLyBzaG9ydC1jaXJjdWl0Ci0JCS8vIGxvb2t1cCBieSBmYWxsaW5nIGJhY2sgdG8gd29ya3NwYWNlJ3MgZGVmYXVsdAotCQkvLyBzZXR0aW5nCi0JCWlmICh2YWwgPT0gbnVsbCAmJiByZWN1cnNlKQotCQkJdmFsID0gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQlyZXR1cm4gdmFsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhKU1BDT1JFX0lELCBrZXksIG51bGwsIG51bGwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBpbnRlcm5hbEdldFByb3BlcnR5KElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlLCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCBudWxsKTsKLQkJaWYgKHZhbHVlID09IG51bGwgJiYgcmVzb3VyY2UgIT0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpICYmIHJlY3Vyc2UpIHsKLQkJCXZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihudWxsKSwgbnVsbCk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dC4gTm90ZSBjb250ZXh0IGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUga2V5LiBJZiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgdGhlIGtleSBpcyByZW1vdmVkIGZyb20gcHJvcGVydGllcy4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCB0cnVlKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcHJlZmVyZW5jZXMucmVtb3ZlKGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJZWxzZQotCQkJCQlwcmVmZXJlbmNlcy5wdXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCB2YWx1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gc2F2ZSBjaGFuZ2VzCi0JCQkJCXByZWZlcmVuY2VzLmZsdXNoKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUENPUkVfSUQsIElTdGF0dXMuRVJST1IsICJVbmFibGUgdG8gc2V0IHByb3BlcnR5IiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIGp1c3Qgc2V0IGEgcHJlZmVyZW5jZSBpbiB0aGUgaW5zdGFuY2Ugc2NvcGUKLQkJLy8gaWYgKCFwcmVmZXJlbmNlRm91bmQpIHsKLQkJLy8gc2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQkvLyB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0pTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZDRjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0pTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciB7Ci0JcHVibGljIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJZkpvYiA9IG5ldyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyIF9pbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQlDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZkpvYjsKLQotCS8qKgotCSAqIFRoaXMgam9iIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lcgotCSAqIHRvIHNjaGVkdWxlIG9wZXJhdGlvbnMgdGhhdCBuZWVkIHRvIG1vZGlmeSB0aGUgd29ya3NwYWNlLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVNfVVBEQVRFX0RFTEFZID0gNTAwOwotCQlwcml2YXRlIExpc3QgYXN5bmNDaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKSB7Ci0JCQlzdXBlcihKU1BDb3JlTWVzc2FnZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZyk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQ2hhbmdlcyhTZXQgbmV3Q2hhbmdlcykgewotCQkJaWYgKG5ld0NoYW5nZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJYXN5bmNDaGFuZ2VzLmFkZEFsbChuZXdDaGFuZ2VzKTsKLQkJCQlhc3luY0NoYW5nZXMubm90aWZ5KCk7Ci0JCQl9Ci0JCQlzY2hlZHVsZShQUk9QRVJUSUVTX1VQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0TmV4dENoYW5nZSgpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuIGFzeW5jQ2hhbmdlcy5pc0VtcHR5KCkgPyBudWxsIDogKElQcm9qZWN0KSBhc3luY0NoYW5nZXMucmVtb3ZlKGFzeW5jQ2hhbmdlcy5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09SRV9JRCwgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIEpTUENvcmVNZXNzYWdlcy5KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBudWxsKTsKLQkJCW1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpIDogbW9uaXRvcjsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIGFzeW5jQ2hhbmdlcy5zaXplKCkpOwotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0IG5leHQ7Ci0JCQkJCXdoaWxlICgobmV4dCA9IGdldE5leHRDaGFuZ2UoKSkgIT0gbnVsbCkgewotCQkJCQkJLy8ganVzdCBleGl0IGlmIHRoZSBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biBvciBoYXMKLQkJCQkJCS8vIGJlZW4gc2h1dCBkb3duCi0JCQkJCQkvLyBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgdGhlIHdvcmtzcGFjZSBhdCB0aGlzCi0JCQkJCQkvLyBwb2ludCBhbnl3YXkKLQkJCQkJCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLm9zZ2kiKS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gc2F2ZSB0aGUgcHJlZmVyZW5jZXMgbm9kZXMKLQkJCQkJCQlpZiAobmV4dC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkvLyBzYXZlIGNvbnRlbnQgdHlwZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCQkJCQkJCQkvLyBzYXZlIGxhbmd1YWdlIHByZWZlcmVuY2VzCi0JCQkJCQkJCXByb2plY3RQcmVmcyA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhuZXh0LCBKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGZhbHNlKTsKLQkJCQkJCQkJaWYgKHByb2plY3RQcmVmcyAhPSBudWxsKQotCQkJCQkJCQkJcHJvamVjdFByZWZzLmZsdXNoKCk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB3ZSBnb3QgYW4gZXJyb3Igc2F2aW5nCi0JCQkJCQkJU3RyaW5nIGRldGFpbE1lc3NhZ2UgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZywgbmV4dC5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoMSA8PCAoSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQgJSAxMDAgLyAzMyksIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBkZXRhaWxNZXNzYWdlLCBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuICFhc3luY0NoYW5nZXMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeUNoYW5nZXMoSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCS8vIGNoZWNrIGVhY2ggcmVzb3VyY2Ugd2l0aCBqc3AgZnJhZ21lbnQgc2V0dGluZyB0byBzZWUgaWYgaXQgaGFzCi0JCQkvLyBiZWVuIG1vdmVkL2RlbGV0ZWQKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlczIgPSBmYWxzZTsKLQotCQkJLy8gcHJvamVjdCBhZmZlY3RlZAotCQkJSVByb2plY3QgY3VycmVudFByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3REZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCQlyZXNvdXJjZUNoYW5nZXMgPSBwcm9jZXNzUHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgcHJvamVjdERlbHRhLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlyZXNvdXJjZUNoYW5nZXMyID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCi0JCQkvLyBpZiB0aGVyZSB3YXMgYSBwcmVmZXJlbmNlIGtleSBjaGFuZ2UsIG5lZWQgdG8gc2F2ZSBwcmVmZXJlbmNlcwotCQkJaWYgKHJlc291cmNlQ2hhbmdlcyB8fCByZXNvdXJjZUNoYW5nZXMyKQotCQkJCXByb2plY3RzVG9TYXZlLmFkZChjdXJyZW50UHJvamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogR29lcyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UtZGVwZW5kZW50IHByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aAotCQkgKiBjdXJyZW50UHJvamVjdCAmIGtleSBhbmQgdXBkYXRlcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGlmIG5lZWRlZAotCQkgKiBiYXNlZCBvbiBwcm9qZWN0RGVsdGEKLQkJICogCi0JCSAqIEBwYXJhbSBjdXJyZW50UHJvamVjdAotCQkgKiAgICAgICAgICAgIGN1cnJlbnQgcHJvamVjdCBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkIGF0Ci0JCSAqIEBwYXJhbSBrZXkKLQkJICogICAgICAgICAgICBjdXJyZW50IGtleS9zdWJjYXRlZ29yeSBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkCi0JCSAqICAgICAgICAgICAgYXQKLQkJICogQHBhcmFtIHByb2plY3REZWx0YQotCQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VzIHRvIHByb2Nlc3MgdGhlIHByZWZlcmVuY2Uga2V5cyBhZ2FpbnN0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0c1RvU2F2ZQotCQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0cyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZC9zYXZlZAotCQkgKiBAcmV0dXJuIHRydWUgaWYgY3VycmVudFByb2plY3QncyBwcmVmZXJlbmNlcyB3ZXJlIG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1ByZWZlcmVuY2VzKElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LCBTdHJpbmcga2V5LCBJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gZ2V0IHRoZSBwcm9qZWN0LWtleSBwcmVmZXJlbmNlIG5vZGUKLQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQlpZiAocHJvamVjdFByZWZzID09IG51bGwpCi0JCQkJLy8gbm8gcHJlZmVyZW5jZXMgZm9yIHRoaXMgcHJvamVjdC1rZXksIGp1c3QgYmFpbAotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1tdIGFmZmVjdGVkUmVzb3VyY2VzOwotCQkJdHJ5IHsKLQkJCQlhZmZlY3RlZFJlc291cmNlcyA9IHByb2plY3RQcmVmcy5rZXlzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcm9ibGVtcyB3aXRoIHRoZSBwcm9qZWN0IHNjb3BlLi4uIHdlIGdvbm5hIG1pc3MgdGhlCi0JCQkJLy8gY2hhbmdlcyAoYnV0IHdpbGwgbG9nKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJQcm9ibGVtIHJldHJlaXZpbmcgSlNQIEZyYWdtZW50IHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBwcmVmZXJlbmNlIGtleSAod2hpY2ggaXMgcmVhbGx5IGEgZmlsZSBuYW1lKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZmZlY3RlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIHNlZSBpZiBwcmVmZXJlbmNlIGtleS9maWxlIG5hbWUgd2FzIGZpbGUgdGhhdCB3YXMgY2hhbmdlZAotCQkJCUlSZXNvdXJjZURlbHRhIG1lbWJlckRlbHRhID0gcHJvamVjdERlbHRhLmZpbmRNZW1iZXIobmV3IFBhdGgoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pKTsKLQkJCQkvLyBubyBjaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkJCQlpZiAobWVtYmVyRGVsdGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKG1lbWJlckRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCXJlc291cmNlQ2hhbmdlcyA9IHRydWU7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgc2V0dGluZyBmb3IgdGhlIG9yaWdpbmFsIGxvY2F0aW9uCi0JCQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBwcm9qZWN0UHJlZnMuZ2V0KGFmZmVjdGVkUmVzb3VyY2VzW2ldLCBudWxsKTsKLQkJCQkJcHJvamVjdFByZWZzLnJlbW92ZShhZmZlY3RlZFJlc291cmNlc1tpXSk7Ci0JCQkJCWlmICgobWVtYmVyRGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7Ci0JCQkJCQkvLyBpZiBtb3ZpbmcsIGNvcHkgdGhlIHNldHRpbmcgZm9yIHRoZSBuZXcgbG9jYXRpb24KLQkJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKS5zZWdtZW50KDApKTsKLQkJCQkJCVByZWZlcmVuY2VzIHRhcmdldFByZWZzID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKHRhcmdldFByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJCQl0YXJnZXRQcmVmcy5wdXQoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldEtleUZvcihtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpKSwgY3VycmVudFZhbHVlKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IGN1cnJlbnRQcm9qZWN0KQotCQkJCQkJCXByb2plY3RzVG9TYXZlLmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZUNoYW5nZXM7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGFueSBjaGFuZ2UgdG8gdGhlIGVuY29kaW5nIGZpbGUgb3IgYW55IHJlc291cmNlIHdpdGggZW5jb2RpbmcKLQkJICogc2V0LCBqdXN0IGRpc2NhcmQgdGhlIGNhY2hlIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIHByb2plY3REZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkvLyBwcm9jZXNzIGVhY2ggcHJvamVjdCBpbiB0aGUgZGVsdGEKLQkJCVNldCBwcm9qZWN0c1RvU2F2ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3REZWx0YXMubGVuZ3RoOyBpKyspCi0JCQkJLy8gbm90aGluZyB0byBkbyBpZiBhIHByb2plY3QgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZC9tb3ZlZAotCQkJCWlmIChwcm9qZWN0RGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIChwcm9qZWN0RGVsdGFzW2ldLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSA9PSAwKQotCQkJCQlwcm9jZXNzRW50cnlDaGFuZ2VzKHByb2plY3REZWx0YXNbaV0sIHByb2plY3RzVG9TYXZlKTsKLQkJCWZKb2IuYWRkQ2hhbmdlcyhwcm9qZWN0c1RvU2F2ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCV9pbnN0YW5jZSA9IG5ldyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKF9pbnN0YW5jZS5mUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKF9pbnN0YW5jZS5mUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCV9pbnN0YW5jZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxYjA4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlMjAyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckpTUCBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEV9OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQkvLyBpZiBkaXNjcmlwdGlvbiBpcyBudWxsLCB3ZSBhcmUganVzdCBiZWluZyBhc2tlZCB0bwotCQkvLyBhc3Nlc3MgY29udGVudHMgdmFsaWRpdHkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSW5wdXRTdHJlYW0gY29udGVudHMpIHsKLQkJLy8gVGhlcmUncyBsaXR0bGUgdG8gcHJvdmUsIHZpYSBjb250ZW50cywgdGhhdAotCQkvLyBhIGZpbGUgaXMgSlNQLCBzbyBhbHdheXMgcmV0dXJuIGludGVybWluYW50LCBhbmQKLQkJLy8gbGV0IGZpbGV0eXBlcyBkZWNpZGUuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KFJlYWRlciBjb250ZW50cykgewotCQkvLyBUaGVyZSdzIGxpdHRsZSB0byBwcm92ZSwgdmlhIGNvbnRlbnRzLCB0aGF0Ci0JCS8vIGEgZmlsZSBpcyBKU1AsIHNvIGFsd2F5cyByZXR1cm4gaW50ZXJtaW5hbnQsIGFuZAotCQkvLyBsZXQgZmlsZXR5cGVzIGRlY2lkZS4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkJcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gaGFuZGxlIHN0YW5kYXJkIG9uZXMgZmlyc3QsIHRvIGJlIHN1cmUgZGV0ZWN0b3IgcHJvY2Vzc2VzCi0JCWhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCS8vIG5vdyBkbyB0aG9zZSBzcGVjaWZpYyBmb3IgSlNQcwotCQkvLyBub3RlOiBkZXRlY3RvciBzaG91bGQgYWx3YXlzIGJlIG9mIGNvcnJlY3QgaW5zdGFuY2UsIGJ1dCB3ZSdsbAotCQkvLyBjaGVjaywgZm9yIG5vdy4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IganNwRGV0ZWN0b3IgPSAoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGpzcERldGVjdG9yLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgbGFuZ3VhZ2UpOwotCQkJfQotCQkJU3RyaW5nIGNvbnRlbnRUeXBlQXR0cmlidXRlID0ganNwRGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsKLQkJCWlmIChjb250ZW50VHlwZUF0dHJpYnV0ZSAhPSBudWxsICYmIGNvbnRlbnRUeXBlQXR0cmlidXRlLmxlbmd0aCgpID4gMCkgewotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgY29udGVudFR5cGVBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3RhbmRhcmRDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LgotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGRldGVjdG9yLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5M2UwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDRkMGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjQ2ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg1ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuNCBvbiA3LzUvMDUgMTI6MjcgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNAotICogb24gNy81LzA1IDEyOjI3IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PkQ6L2J1aWxkcy9Xb3Jrc3BhY2VzL1B1cmVIZWFkV1RQX003L29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSA4MTkyOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUV9TVFJJTkcgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1BBR0VfRElSRUNUSVZFID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0gIC8qKgotICAgKiBaWl9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBaWl9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgNwotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVw2XDFcMTFcMlwwXDFcMTBcMjJcMFwxXDZcMVwwXDFcNDVcMlwwIisKLSAgICAiXDFcMTdcMVwwXDFcNDZcNlwwXDFcMzZcMVw0NFwxMlwwXDFcMjdcMVwwXDFcMTIiKwotICAgICJcMVw3XDFcNDFcMVwxM1wxXDIwXDFcMjJcMVwwXDFcMzNcMVwzMFwxXDI0XDFcMCIrCi0gICAgIlwxXDIzXDFcMFwxXDMxXDFcMjVcMVwwXDFcMTZcMVwxNVwxXDQwXDFcMzdcMVwyMSIrCi0gICAgIlwxXDBcMVwzMlwxXDI2XDFcMzRcMVw0MlwxXDM1XDFcMFwxXDE0XDFcNDNcN1wwIisKLSAgICAiXDFcMjJcMVwwXDFcMzNcMVwzMFwxXDI0XDFcMFwxXDIzXDFcMFwxXDMxXDFcMjUiKwotICAgICJcMVwwXDFcMTZcMVwxNVwxXDQwXDFcMzdcMVwyMVwxXDBcMVwzMlwxXDI2XDFcMzQiKwotICAgICJcMVw0MlwxXDM1XDFcMFwxXDE0XDFcNDNcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMCIrCi0gICAgIlwxXDNcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMiIrCi0gICAgIlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMTBcMFwyMFwxXDJcMlwxXDFcMVwzXDFcNFwxXDVcMVw2IisKLSAgICAiXDJcNVwxXDdcMVw1XDFcN1wxXDEwXDJcMTFcMlwwXDFcMTIiKwotICAgICJcMVwxM1w2XDBcMVwxNFwzXDBcMVwxNVwyXDBcMVwxNlwxXDAiKwotICAgICJcMVwxN1wxXDIwXDNcMFwxXDIxXDMwXDBcMVwyMlwxNFwwXDFcMjMiKwotICAgICJcMlwwXDFcMjRcNFwwXDFcMjVcMVwyNlwxMlwwXDFcMjdcMVwwIisKLSAgICAiXDFcMzBcMlwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbMTI2XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgenpQdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6RU9GRG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCi0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0gICAgICAgIHByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0gICAgICAgIHB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKCkgewotICAgICAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gICAgICAgICAgICAgICAgeXlsaW5lID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5Y2hhciA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgICAgICAgICAgICAgICAgKi8KLS8vICAgICAgICAgICAgICAgIHl5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLSAgICAgICAgfQotIAotICAgICAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0gICAgICAgIH0KLQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTgyKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpQdXNoYmFja1Bvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPCAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotICAgIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3MgPSAwOwotICAgIC8veXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHl5Y2hhciA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHp6TGV4aWNhbFN0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6ekRvRU9GKCkgewotICAgIGlmICghenpFT0ZEb25lKSB7Ci0gICAgICB6ekVPRkRvbmUgPSB0cnVlOwotICAgICAgICAgICAgaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBpZiAoenpNYXJrZWRQb3NMID4genpTdGFydFJlYWQpIHsKLSAgICAgICAgc3dpdGNoICh6ekJ1ZmZlckxbenpNYXJrZWRQb3NMLTFdKSB7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgY2FzZSAnXHUwMDBDJzoKLSAgICAgICAgY2FzZSAnXHUwMDg1JzoKLSAgICAgICAgY2FzZSAnXHUyMDI4JzoKLSAgICAgICAgY2FzZSAnXHUyMDI5JzoKLSAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiAKLSAgICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpCi0gICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgICAgICAgICAgaWYgKGVvZikgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICBpZiAoenpBdEJPTCkKLSAgICAgICAgenpTdGF0ZSA9IFpaX0xFWFNUQVRFW3p6TGV4aWNhbFN0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGVdOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB6eklucHV0ID0genpDTWFwTFt6eklucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4genpJc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB6ek5vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB6ekZvck5leHQ6IHsgc3dpdGNoICh6elN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHp6U3RhdGUgPSA0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6U3RhdGUgPSA0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpTdGF0ZSA9IDY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpTdGF0ZSA9IDY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDY4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpTdGF0ZSA9IDY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gNzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB6elN0YXRlID0gNzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gNzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gNzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gODk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB6elN0YXRlID0gOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gOTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gOTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gOTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gOTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gOTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gOTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMTAwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAxMDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDEwNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6U3RhdGUgPSAxMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDEwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTAxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDExMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB6elN0YXRlID0gMTEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6U3RhdGUgPSAxMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDExNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMTE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6U3RhdGUgPSAxMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDExODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDExODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogenpTdGF0ZSA9IDEyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGV2ZXIgcmVhY2hlZCwgdGhlcmUgaXMgYSBzZXJpb3VzIGJ1ZyBpbiBKRmxleAotICAgICAgICAgICAgICB6elNjYW5FcnJvcihaWl9VTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHp6SXNGaW5hbCApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoIHp6Tm9Mb29rQWhlYWQgKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI2OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VFbmNvZGluZzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMzOiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzU6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlQ29udGVudFR5cGU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM4OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzk6IGJyZWFrOwotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1BBR0VfRElSRUNUSVZFKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZVN0YXJ0OwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ4OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHp6RG9FT0YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGZhNWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotcHVibGljIGludGVyZmFjZSBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzIGV4dGVuZHMgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyB7Ci0JU3RyaW5nIFBhZ2VEaXJlY3RpdmVTdGFydCA9ICJQYWdlRGlyZWN0aXZlU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VEaXJlY3RpdmVFbmQgPSAiUGFnZURpcmVjdGl2ZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUxhbmd1YWdlID0gIlBhZ2VMYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUVuY29kaW5nID0gIlBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUNvbnRlbnRUeXBlID0gIlBhZ2VDb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExMjdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZkNoYXJzZXQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVWYWx1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGZMYW5ndWFnZTsKLQotCXByaXZhdGUgU3RyaW5nIGZQYWdlRW5jb2RpbmdWYWx1ZTsKLQotCXByaXZhdGUgSlNQSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlhNTERlY0VuY29kaW5nTmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1bmljb2RlQ2FzZTsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0KLQotCS8qKgotCSAqIE5vIEFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCWNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIE51bGxNZW1lbnRvKCkgewotCQkJc3VwZXIoKTsKLQkJCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbiBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcgcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZSB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzIG5vdCBwcmVzZW50LgotCQl9Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLy8gdG8gZW5zdXJlIGNvbnNpc3Qgb3ZlcmFsbCBydWxlcyB1c2VkLCB3ZSdsbCBtYXJrIGFzCi0JLy8gZmluYWwsCi0JLy8gYW5kIHJlcXVpcmUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGNlcnRhaW4gcGllY2VzIG9mCi0JLy8gdGhlCi0JLy8gaW1wbGVtZW50YXRpb24KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZkxhbmd1YWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgSlNQIFNwZWMKLQkJZmluYWwgU3RyaW5nIGVuYyA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZSA9IGZhbHNlOwotCQlpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGUgPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZXJlIGNhbiBzb21ldGltZXMgYmUgbXVsaXRwbGUgJ2VuY29kaW5ncycgc3BlY2lmaWVkIGluIGEgZmlsZS4gVGhpcwotCSAqIGlzIGFuIGF0dGVtcHQgdG8gY2VudHJhbGl6ZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIGJldHdlZW4gdGhlbS4KLQkgKiBSZXR1cm5zIGVuY29kaW5nIGFjY29yZGluZyB0byBwcmlvcml0eTogMS4gWE1MIERlY2xhcmF0aW9uIDIuIHBhZ2UKLQkgKiBkaXJlY3RpdmUgcGFnZUVuY29kaW5nIG5hbWUgMy4gcGFnZSBkaXJlY3RpdmUgY29udGVudFR5cGUgY2hhcnNldCBuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVFbmNvZGluZygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChmWE1MRGVjRW5jb2RpbmdOYW1lICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmWE1MRGVjRW5jb2RpbmdOYW1lOwotCQllbHNlIGlmIChmUGFnZUVuY29kaW5nVmFsdWUgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZQYWdlRW5jb2RpbmdWYWx1ZTsKLQkJZWxzZSBpZiAoZkNoYXJzZXQgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZDaGFyc2V0OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEpTUEhlYWRUb2tlbml6ZXIgZ2V0VG9raW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IEpTUEhlYWRUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3BlY0RlZmF1bHQoKSB7Ci0JCVN0cmluZyBlbmNvZGluZ05hbWU7Ci0JCWVuY29kaW5nTmFtZSA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVnYWxTdHJpbmcoU3RyaW5nIHZhbHVlVG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICh2YWx1ZVRva2VuVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB3aGF0IGlzIGluIAotCSAqIEpTUEhlYWRUb2tlbml6ZXJUZXN0ZXIKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VDb250ZW50VHlwZVZhbHVlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIjtcXHMqY2hhcnNldFxccyo9XFxzKiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIHBhcnRzID0gcGF0dGVybi5zcGxpdChjb250ZW50VHlwZSk7Ci0JCWlmIChwYXJ0cy5sZW5ndGggPiAwKSB7Ci0JCQkvLyBpZiBvbmx5IG9uZSBpdGVtLCBpdCBjYW4gc3RpbGwgYmUgY2hhcnNldCBpbnN0ZWFkIG9mCi0JCQkvLyBjb250ZW50VHlwZQotCQkJaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJaWYgKHBhcnRzWzBdLmxlbmd0aCgpID4gNikgewotCQkJCQlTdHJpbmcgY2hlY2tGb3JDaGFyc2V0ID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDcpOwotCQkJCQlpZiAoY2hlY2tGb3JDaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoImNoYXJzZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpbnQgZXFwb3MgPSBwYXJ0c1swXS5pbmRleE9mKCc9Jyk7Ci0JCQkJCQllcXBvcyA9IGVxcG9zICsgMTsKLQkJCQkJCWlmIChlcXBvcyA8IHBhcnRzWzBdLmxlbmd0aCgpKSB7Ci0JCQkJCQkJZkNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoZXFwb3MpOwotCQkJCQkJCWZDaGFyc2V0ID0gZkNoYXJzZXQudHJpbSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZkNvbnRlbnRUeXBlID0gcGFydHNbMF07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ29udGVudFR5cGUgPSBwYXJ0c1swXTsKLQkJCX0KLQkJfQotCQlpZiAocGFydHMubGVuZ3RoID4gMSkgewotCQkJZkNoYXJzZXQgPSBwYXJ0c1sxXTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogTG9va3MgZm9yIHdoYXQgZXZlciBlbmNvZGluZyBwcm9wZXJ0aWVzIHRoZSB0b2tlbml6ZXIgcmV0dXJucy4gSXRzIHRoZQotCSAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB0b2tlbml6ZXIgdG8gc3RvcCB3aGVuIGFwcHJvcHJpYXRlIGFuZCBub3QgZ28gdG9vCi0JICogZmFyLgotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZUhlYWRlcihKU1BIZWFkVG9rZW5pemVyIHRva2VuaXplcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlBhZ2VFbmNvZGluZ1ZhbHVlID0gbnVsbDsKLQkJZkNoYXJzZXQgPSBudWxsOwotCi0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCWRvIHsKLQkJCS8vIGRvbid0IHVzZSAnZ2V0JyBoZXJlIChhdCBsZWFzdCB1bnRpbCByZXNldCBpc3N1ZSBmaXhlZCkKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJU3RyaW5nIHRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkKLQkJCQl1bmljb2RlQ2FzZSA9IHRydWU7Ci0JCQllbHNlIHsKLQotCQkJCWlmICh0b2tlblR5cGUgPT0gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZykgewotCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWVUb2tlblR5cGUgPSB2YWx1ZVRva2VuLmdldFR5cGUoKTsKLQkJCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJCWZYTUxEZWNFbmNvZGluZ05hbWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmUGFnZUVuY29kaW5nVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlQ29udGVudFR5cGUpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmQ29udGVudFR5cGVWYWx1ZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZSkgewotCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWVUb2tlblR5cGUgPSB2YWx1ZVRva2VuLmdldFR5cGUoKTsKLQkJCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJCWZMYW5ndWFnZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQkJaWYgKGZDb250ZW50VHlwZVZhbHVlICE9IG51bGwpIHsKLQkJCXBhcnNlQ29udGVudFR5cGVWYWx1ZShmQ29udGVudFR5cGVWYWx1ZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSlNQSGVhZFRva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tpbml6ZXIoKTsKLQkJZlJlYWRlci5yZXNldCgpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCXBhcnNlSGVhZGVyKHRva2VuaXplcik7Ci0JCS8vIHVuaWNvZGUgc3RyZWFtIGNhc2VzIGFyZSBjcmVhdGVkIGRpcmVjdGx5IGluIHBhcnNlSGVhZGVyCi0JCWlmICghdW5pY29kZUNhc2UpIHsKLQkJCVN0cmluZyBlbmMgPSBnZXRBcHByb3ByaWF0ZUVuY29kaW5nKCk7Ci0JCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLmxlbmd0aCgpID4gMCkgewotCQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5GT1VORF9FTkNPRElOR19JTl9DT05URU5UKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JCWZDaGFyc2V0ID0gbnVsbDsKLQkJZkNvbnRlbnRUeXBlVmFsdWUgPSBudWxsOwotCQlmUGFnZUVuY29kaW5nVmFsdWUgPSBudWxsOwotCQlmWE1MRGVjRW5jb2RpbmdOYW1lID0gbnVsbDsKLQkJdW5pY29kZUNhc2UgPSBmYWxzZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5Rm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDA1MGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5Rm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEZhY3RvcnlGb3JKU1AgaW1wbGVtZW50cyBJRG9jdW1lbnRGYWN0b3J5IHsKLQotCXB1YmxpYyBEb2N1bWVudEZhY3RvcnlGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudEZhY3RvcnkjY3JlYXRlRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShuZXcgSlNQU291cmNlUGFyc2VyKCkpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZW1lbWJlciwgdGhlIExvYWRlcgotCQkvLyB3aWxsIG5lZWQgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHBhcnNlcgotCQkvLyBiYXNlZCBvbiAiZW1iZWRkZWQgY29udGVudCIKLQkJSlNQU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJLy8gYWRkIGRlZmF1bHQgbmVzdGFibGUgdGFnIGxpc3QKLQkJYWRkTmVzdGFibGVQcmVmaXgocGFyc2VyLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KEpTUFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVRhZ01hcmtlciBibSA9IG5ldyBUYWdNYXJrZXIodGFnTmFtZSk7Ci0JCXBhcnNlci5hZGROZXN0YWJsZVByZWZpeChibSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzEyMTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGhhdmUgdHdvIHJlc3BvbnNpYmlsaXRpZXMuIAotICogT25lIGlzIHRvIHByb3ZpZGUKLSAqIGFuZCBlbWJlZGRlZCBmYWN0b3J5IHJlZ2lzdHJ5IGZvciBKU1AgQXdhcmUgSU5vZGVBZGFwdGVyIEZhY3RvcmllcwotICogdG8gdXNlLiBUaGUgb3RoZXIgaXMgdG8gbW9uaXRvciBwYWdlIGRpcmVjdGl2ZXMgYW5kIGlmIAotICogYSBjaGFuZ2UgaW4gZW1iZWRkZWQgdHlwZSBpcyBpcyBtYWRlLCBpdCB3aWxsIHNpZ25hbCAKLSAqIHRoZSBzdHJ1Y3R1cmVkTW9kZWwgdGhhdCBpdCBuZWVkcyB0byByZWluaXRpYWxpemUgaXRzZWxmLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKLQotCS8qKgotCSAqIFRoaXMgc2V0dGVyIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UsIHNob3J0bHkgYWZ0ZXIKLQkgKiBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQl2b2lkIHNldEVtYmVkZGVkVHlwZShFbWJlZGRlZFR5cGVIYW5kbGVyIGhhbmRsZXIpOwotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIGdpdmUgdGhpcyBhZGFwdGVyIGEgY2hhbmNlIHRvIHVzZQotCSAqIHRoZSBBZGFwdGVyRmFjdG9yZXMgZnJvbSB0aGUgRW1iZWRkZWRUeXBlSGFuZGxlcgotCSAqIHRvIGFkYXB0IHRoZSBub2RlLiBJdHMgdG8gYmUgdXNlZCBieSBKU1BBd2FyZUFkYXB0ZXJGYWN0b3JpZXMKLQkgKiB0byAocG90ZW50aWFsbHkpIGFkYXB0IG5vZGVzIGZyb20gdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpOwotCi0Jdm9pZCBhZGRFbWJlZGRlZEZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCS8qKgotCSAqIE1ldGhvZCBzZXRMYW5ndWFnZS4KLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKi8KLQl2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSk7Ci0KLQlJTm9kZU5vdGlmaWVyIGdldFRhcmdldCgpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA3MDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFkYXB0cyBkb2N1bWVudCAKLSAqIHdpdGggdGhlIGFuIGluc3RhbmNlIG9mIFBhZ2VEaXJlY3RpdmVBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQotCXByaXZhdGUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LgotCSAqIE5vdGU6IGl0cyBpbXBvcnRhbnQgbm90IHRvIGJlIGEgc2luZ2xldG9uLCBzaW5jZQotCSAqIHRoaXMgZmFjdG9yeSBuZWVkcyB0byB0cmFjayBpdHMgYWRhcHRlcihzKSBhbmQgcmVsZWFzZQotCSAqIHRoZW0gd2hlbiB0aGV5IGFyZSByZWxlYXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0JcHJvdGVjdGVkIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBhc3N1bWVzIGl0cyBhIAotCSAqIEZhY3RvcnkgZm9yIFBhZ2VEaXJlY3RpdmVBZGFwdGVyCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXN1bHQgPSBnZXRBZGFwdGVySW5zdGFuY2UodGFyZ2V0KTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgIT0gbnVsbCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgdGhpcyBpcyBvbmx5IGNhbGxlZCBmb3IgJ2RvY3VtZW50JyB0YXJnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgZ2V0QWRhcHRlckluc3RhbmNlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCS8vIGlmIG91ciBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50Ci0JCS8vIHRhcmdldCwgdGhlbiwgc29tZWhvdywgdGhlIGRvY3VtZW50IG5vZGUgbXVzdCAKLQkJLy8gaGF2ZSBjaGFuZ2VkIGZvciBhIG1vZGVsLCBzbyB3ZSBzaG91bGQgcmVsZWFzZSAKLQkJLy8gb2xkIGFkYXB0ZXIgYW5kIGNyZWF0ZSBuZXcgb25lIGZvciBuZXcgZG9jdW1lbnQgCi0JCS8vIG5vZGUuIFRoaXMgaXMgcHJvYmFibHkgYSBwcm9ncmFtbWluZyBlcnJvci4KLQkJaWYgKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgIT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCAhPSBwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlLmdldFRhcmdldCgpKSB7Ci0JCQkJcmVsZWFzZSgpOwotCQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKHRhcmdldCk7Ci0JCQl9Ci0JCQkvLyBlbHNlIHJldHVybiB0aGUgb25lIHdlIGhhdmUKLQkJfQotCQllbHNlIHsKLQkJCS8vIGlmIGlzIGVxdWFsIHRvIG51bGwsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKHRhcmdldCk7Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlLCAicGFnZURpcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSB3YXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0KLQkJcmV0dXJuIG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNDk5NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlU3RhdGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gcHJvdmlkZSBhbiBlbWJlZGRlZCBmYWN0b3J5IHJlZ2lzdHJ5Ci0gKiBmb3IgSlNQIEF3YXJlIElOb2RlQWRhcHRlciBGYWN0b3JpZXMgdG8gdXNlLgotICogCi0gKiBUeXBpY2FsbHksIHRoZSBlbWJlZGRlZCB0eXBlIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBmZWF0dXJlIG9mIHRoZSBkb2N1bWVudCwKLSAqIHNvIEpTUCBBd2FyZSBBZHBhdGVyRmFjdG9yaWVzIHNob3VsZCBjYWxsCi0gKiBnZXRBZGFwdGVyKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKSBkaXJlY3RveSBvbiB0aGUgZG9jdW1lbnQgKG9yIG93bmluZwotICogZG9jdW1lbnQpIG5vZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgaW1wbGVtZW50cyBQYWdlRGlyZWN0aXZlQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJfQ0hBUlNFVCA9ICJjaGFyc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBhZGFwdGVyVHlwZSA9IFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdeyJqYXZhc2NyaXB0IiwgImphdmFzY3JpcHQxLjAiLCAiamF2YXNjcmlwdDEuMV8zIiwgImphdmFzY3JpcHQxLjIiLCAiamF2YXNjcmlwdDEuMyIsICJqYXZhc2NyaXB0MS40IiwgImphdmFzY3JpcHQxLjUiLCAiamF2YXNjcmlwdDEuNiIsICJqc2NyaXB0IiwgInNhc2hzY3JpcHQifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gSkFWQV9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdeyJqYXZhIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbChJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlzdXBlcigpOwotCQlub3RpZmllckF0Q3JlYXRpb24gPSB0YXJnZXQ7Ci0JCS8vIHdlIG5lZWQgdG8gcmVtZW1iZXIgb3VyIGluc3RhbmNlIG9mIG1vZGVsLAotCQkvLyBpbiBjYXNlIHdlIG5lZWQgdG8gInNpZ25hbCIgYSByZS1pbml0IG5lZWRlZC4KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQltb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogcGFyc2VzIHRoZSBmdWxsIGNvbnRlbnRUeXBlIHZhbHVlIGludG8gaXRzIHR3byBwYXJ0cyB0aGUgY29udGVudFR5cGUsCi0JICogYW5kIHRoZSBjaGFyc2V0LCBpZiBwcmVzZW50LiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBhIGxpZ2h0bHkgbW9kaWZpZWQKLQkgKiB2ZXJzaW9uIG9mIGEgbWV0aG9kIGluIEFic3RyYWN0SGVhZFBhcnNlci4gVGhlcmUsIHdlJ3JlIG1vc3RseQotCSAqIGludGVyZXN0ZWQgaW4gdGhlIGNoYXJzZXQgcGFydCBvZiBjb250ZW50VHlwZVZhbHVlLiBIZXJlLCB3ZSdyZSBtb3N0bHkKLQkgKiBpbnRlcmVzdGVkIGluIHRoZSBtaW1lVHlwZSBwYXJ0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUoU3RyaW5nIGNvbnRlbnRUeXBlVmFsdWUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY2xlYW5Db250ZW50VHlwZVZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBOb25MZXR0ZXJEaWdpdHMoY29udGVudFR5cGVWYWx1ZSk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsZWFuQ29udGVudFR5cGVWYWx1ZSwgIjs9IFx0XG5cclxmIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHRMZW4gPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJLy8gaWYgY29udGFpbnMgZW5jb2Rpbmcgc2hvdWxkIGhhdmUgdGhyZWUgdG9rZW5zLCB0aGUgbWltZXR5cGUsIHRoZQotCQkvLyB3b3JkICdjaGFyc2V0JywgYW5kIHRoZSBlbmNvZGluZyB2YWx1ZQotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3RMZW5dOwotCQlpbnQgaiA9IDA7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQl0b2tlbnNbal0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlqKys7Ci0JCX0KLQkJLy8gCi0JCS8vIEZvbGxvd2luZyBpcyB0aGUgY29tbW9uIGZvcm0gZm9yIHRhcmdldCBleHByZXNzaW9uCi0JCS8vIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLQkJLy8gQnV0IGFwcGFycmVudGx5IGlzIGFsc28gdmFsaWQgd2l0aG91dCB0aGUgY29udGVudCB0eXBlIHRoZXJlLAotCQkvLyBqdXN0IHRoZSBjaGFyc2V0LCBhcyBmb2xsb3dzOgotCQkvLyA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImNoYXJzZXQ9VVRGLTgiPgotCQkvLyBTbyB3ZSdsbCBsb29wIHRocm91Z2ggdG9rZW5zIGFuZCBrZXkgb2ZmIG9mICdjaGFyc2V0JwotCi0JCWludCBjaGFyc2V0UG9zID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmVxdWFsc0lnbm9yZUNhc2UoU1RSX0NIQVJTRVQpKSB7Ci0JCQkJY2hhcnNldFBvcyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gU3RyaW5nIGNoYXJzZXQgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotCQlpZiAoY2hhcnNldFBvcyA+IC0xKSB7Ci0JCQkvLyBjYXNlIHdoZXJlIGNoYXJzZXQgd2FzIHByZXNlbnQKLQkJCS8vIGludCBjaGFyc2V0VmFsdWVQb3MgPSBjaGFyc2V0UG9zICsgMTsKLQkJCS8vIGlmIChjaGFyc2V0VmFsdWVQb3MgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkvLyBjaGFyc2V0ID0gdG9rZW5zW2NoYXJzZXRWYWx1ZVBvc107Ci0JCQkvLyB9Ci0JCQlpbnQgY29udGVudFR5cGVWYWx1ZVBvcyA9IGNoYXJzZXRQb3MgLSAxOwotCQkJaWYgKGNvbnRlbnRUeXBlVmFsdWVQb3MgPiAtMSkgewotCQkJCWNvbnRlbnRUeXBlID0gdG9rZW5zW2NvbnRlbnRUeXBlVmFsdWVQb3NdOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gY2hhcnNldCB3YXMgbm90IHByZXNlbnQsIHNvIGlmIHRoZXJlJ3MKLQkJCS8vIGEgdmFsdWUsIHdlIGFzc3VtZSBpdHMgdGhlIGNvbnRlbnRUeXBlIHZhbHVlCi0JCQlpZiAodG9rZW5zLmxlbmd0aCA+IDApIHsKLQkJCQljb250ZW50VHlwZSA9IHRva2Vuc1swXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudFR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0JcHJpdmF0ZSBMaXN0IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgU3RyaW5nIGNhY2hlZExhbmd1YWdlOwotCXByaXZhdGUgU3RyaW5nIGNhY2hlZENvbnRlbnRUeXBlOwotCXByaXZhdGUgSU5vZGVOb3RpZmllciBub3RpZmllckF0Q3JlYXRpb247Ci0KLQlwcml2YXRlIGludCBmaXJzdExhbmd1YWdlUG9zaXRpb24gPSAtMTsKLQlwcml2YXRlIGludCBmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPSAtMTsKLQotCS8qCi0JICogQHNlZSBJTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gYWRhcHRlclR5cGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyLCBpbnQsIE9iamVjdCwgT2JqZWN0LAotCSAqICAgICAgT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW1iZWRkZWRUeXBlKEVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQkvLyBpZiByZWFsbHkgdGhlIHNhbWUgaGFuZGxlciwgbm8gbmVlZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyID09IGhhbmRsZXIpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyB0aGVuIG9uZSBleGlzdHMsIGFuZCB0aGUgbmV3IG9uZSBpcyB0cnVlbHkgZGlmZmVyZW50LCBzbyB3ZSBuZWVkIHRvCi0JCS8vIHJlbGVhc2UgYW5kIHJlbW92ZSBjdXJyZW50IGZhY3RvcmllcwotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBsaXN0ID0gZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChsaXN0Lmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBsaXN0Lm5leHQoKTsKLQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCX0KLQotCQkJZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuY2xlYXIoKTsKLQkJfQotCi0JCWVtYmVkZGVkVHlwZUhhbmRsZXIgPSBoYW5kbGVyOwotCQkvLyB3aGVuIHRoZSBoYW5kbGVyIGlzIHNldCwgInRyYW5zZmVyIiBpdHMgZmFjdG9yaWVzIHRvIG91ciBvd24gbGlzdC4KLQkJLy8gbm90ZTogb3VyIG93biBsaXN0IG1heSBhbHNvIGJlIGFkZGVkIHRvIGVsc2Ugd2hlcmUsIHN1Y2ggYXMgb24KLQkJLy8gImVkaXRvciBzaWRlIi4KLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbWJlZGRlZFR5cGVIYW5kbGVyLmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuYWRkKGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQYWdlRGlyZWN0aXZlQWRhcHRlciNhZGFwdChJTm9kZU5vdGlmaWVyLCBPYmplY3QpCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlJTm9kZUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgZW1iZWRkZWRDb250ZW50VHlwZSBoYXNuJ3QgYmVlbiBzZXQsCi0JCS8vIHRoZW4gd2UgY2FuIG5vdCBhZGFwdCBpdC4KLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJaWYgKGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5Lml0ZXJhdG9yKCk7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBmYWN0b3J5LmFkYXB0KG5vdGlmaWVyKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyI2dldEVtYmVkZGVkVHlwZSgpCi0JICovCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRUeXBlKCkgewotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciA9PSBudWxsKSB7Ci0JCQllbWJlZGRlZFR5cGVIYW5kbGVyID0gZ2V0RGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQl9Ci0JCXJldHVybiBlbWJlZGRlZFR5cGVIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVtYmVkZGVkRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJLy8gc2hvdWxkIHdlIGNoZWNrIGlmIGFscmVhZHkgZXhpc3RzIGluIGxpc3Q/Ci0JCWVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5LmFkZChmYWN0b3J5KTsKLQl9Ci0KLQkvLyAvKioKLQkvLyAqIFVzZWQgYnkgUGFnZURpcmVjdGl2ZVdhdGNoZXJzIHRvIHNpZ25hbCB0aGF0IHNvbWUgaW1wb3J0YW50IGF0dHJpYnV0ZQotCS8vIGhhcyBjaGFuZ2VkLCBhbmQKLQkvLyAqIGFueSBjYWNoZWQgdmFsdWVzIHNob3VsZCBiZSByZS1jYWxjdWF0ZWQKLQkvLyAqLwotCS8vIHZvaWQgY2hhbmdlZCgpIHsKLQkvLyAvLyB3ZSB3b24ndCBhY3R1YWxseSBjaGVjayBpZiBjaGFuZ2UgaXMgbmVlZGVkLCBpZiB0aGUgbW9kZWwgc3RhdGUgaXMKLQkvLyBhbHJlYWR5IGNoYW5naW5nLgotCS8vIGlmICghbW9kZWwuaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkvLyAvLyBnbyB0aHJvdWdoIG91ciBsaXN0IG9mIHBhZ2Ugd2F0Y2hlciBhZGFwdGVycywgYW5kIHVwZGF0ZXMgdGhlCi0JLy8gYXR0cmlidXRlcwotCS8vIC8vIHdlJ3JlIGludGVyZXN0ZWQgaW4sIGlmIGFuZCBvbmx5IGlmIHRoZXkgYXJlIHRoZSBlYXJsaWVzdCBvY2N1cmFuY2UKLQkvLyBpbiB0aGUgcmVzb3VyY2UKLQkvLyBTdHJpbmcgcG90ZW50aWFsQ29udGVudFR5cGUgPSBudWxsOwotCS8vIFN0cmluZyBwb3RlbnRpYWxMYW5ndWFnZSA9IG51bGw7Ci0JLy8gaW50IGNvbnRlbnRUeXBlUG9zaXRpb24gPSAtMTsKLQkvLyBpbnQgbGFuZ3VhZ2VQb3NpdGlvbiA9IC0xOwotCS8vIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFnZURpcmVjdGl2ZVdhdGNoZXJzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCS8vIFBhZ2VEaXJlY3RpdmVXYXRjaGVyIHBkV2F0Y2hlciA9IChQYWdlRGlyZWN0aXZlV2F0Y2hlcikKLQkvLyBpdGVyYXRvci5uZXh0KCk7Ci0JLy8gU3RyaW5nIGNvbnRlbnRUeXBlID0gcGRXYXRjaGVyLmdldENvbnRlbnRUeXBlKCk7Ci0JLy8gU3RyaW5nIGxhbmd1YWdlID0gcGRXYXRjaGVyLmdldExhbmd1YWdlKCk7Ci0JLy8gaW50IG9mZnNldCA9IHBkV2F0Y2hlci5nZXRPZmZzZXQoKTsKLQkvLyBpZiAocG90ZW50aWFsQ29udGVudFR5cGUgPT0gbnVsbCB8fCAoaGFzVmFsdWUoY29udGVudFR5cGUpICYmIChvZmZzZXQgPAotCS8vIGNvbnRlbnRUeXBlUG9zaXRpb24pKSkgewotCS8vIHBvdGVudGlhbENvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0JLy8gY29udGVudFR5cGVQb3NpdGlvbiA9IG9mZnNldDsKLQkvLyB9Ci0JLy8gfQotCS8vIC8vIG5vdyB3ZSBoYXZlIHRoZSBiZXN0IGNhbmRpYXRlcyBmb3IgY2FjaGVkIHZhbHVlcywgbGV0J3Mgc2VlIGlmCi0JLy8gdGhleSd2ZSByZWFsbHkgY2hhbmdlZCBmcm9tCi0JLy8gLy8gd2hhdCB3ZSBoYWQuIElmIHNvLCBub3RlIHdlIGdvIHRocm91Z2ggdGhlIHNldHRlcnMgc28gc2lkZSBlZmZlY3RzCi0JLy8gY2FuIHRha2UgcGxhY2UgdGhlcmUuCi0JLy8gcG90ZW50aWFsQ29udGVudFR5cGUgPQotCS8vIGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUocG90ZW50aWFsQ29udGVudFR5cGUpOwotCS8vIGlmIChwb3RlbnRpYWxDb250ZW50VHlwZSA9PSBudWxsIHx8IHBvdGVudGlhbENvbnRlbnRUeXBlLmxlbmd0aCgpID09IDApCi0JLy8gewotCS8vIC8vcG90ZW50aWFsQ29udGVudFR5cGUgPSBnZXREZWZhdWx0Q29udGVudFR5cGUoKTsKLQkvLyB9IGVsc2UgewotCS8vIHNldENhY2hlZENvbnRlbnRUeXBlKHBvdGVudGlhbENvbnRlbnRUeXBlKTsKLQkvLyB9Ci0JLy8KLQkvLyBpZiAocG90ZW50aWFsTGFuZ3VhZ2UgIT0gbnVsbCAmJiBoYXNWYWx1ZShwb3RlbnRpYWxMYW5ndWFnZSkpIHsKLQkvLyBzZXRDYWNoZWRMYW5ndWFnZShwb3RlbnRpYWxMYW5ndWFnZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0Jdm9pZCBjaGFuZ2VkQ29udGVudFR5cGUoaW50IGVsZW1lbnRPZmZzZXQsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkvLyBvbmx5IG5lZWQgdG8gcHJvY2VzcyBpZiB0aGlzIG5ldyB2YWx1ZSBpcwotCQkvLyBlYXJsaWVyIGluIHRoZSBmaWxlIHRoYW4gb3VyIGN1cnJlbnQgdmFsdWUKLQkJaWYgKGZpcnN0Q29udGVudFR5cGVQb3NpdGlvbiA9PSAtMSB8fCBlbGVtZW50T2Zmc2V0IDw9IGZpcnN0Q29udGVudFR5cGVQb3NpdGlvbikgewotCQkJLy8gZHdfVE9ETzogdXBkYXRlIGVtYmVkZGVkIHBhcnRpdGlvbmVyIGluIEpTUCBkb2N1bWVudAotCQkJLy8gcGFydGl0aW9uZXIKLQkJCS8vIG5zZF9UT0RPOiB1cGRhdGUgZW1iZWRkZWQgcGFydGl0aW9uZXIgaW4gSlNQIGRvY3VtZW50Ci0JCQkvLyBwYXJ0aXRpb25lcgotCi0JCQkvLyBubyBuZWVkIHRvIGNoYW5nZSBjdXJyZW50IHZhbHVlLCBpZiB3ZSdyZSB0b2xkIHNvbWUKLQkJCS8vIGVhcmxpZXIgdmFsdWUgaXMgbnVsbCBvciBibGFuayAoc291bmRzIGxpa2UgYW4gZXJyb3IsIGFueXdheSkKLQkJCWlmIChoYXNWYWx1ZShuZXdWYWx1ZSkpIHsKLQkJCQlmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPSBlbGVtZW50T2Zmc2V0OwotCQkJCVN0cmluZyBwb3RlbnRpYWxDb250ZW50VHlwZSA9IGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUobmV3VmFsdWUpOwotCQkJCS8vIG9ubHkgZG8gdGhlIHNldCBwcm9jZXNzaW5nIGlmIGRpZmZlcmVudAotCQkJCS8vIGZyb20gd2hhdCBpdCBhbHJlYWR5IGlzCi0JCQkJLy8gaWYgKCFwb3RlbnRpYWxDb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKGNhY2hlZExhbmd1YWdlKSkKLQkJCQkvLyB7Ci0JCQkJc2V0Q2FjaGVkQ29udGVudFR5cGUocG90ZW50aWFsQ29udGVudFR5cGUpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgYnkgUGFnZURpcmVjdGl2ZVdhdGNoZXJzIHRvIHNpZ25hbCB0aGF0IHNvbWUgaW1wb3J0YW50IGF0dHJpYnV0ZQotCSAqIGhhcyBjaGFuZ2VkLCBhbmQgYW55IGNhY2hlZCB2YWx1ZXMgc2hvdWxkIGJlIHJlLWNhbGN1YXRlZAotCSAqLwotCXZvaWQgY2hhbmdlZExhbmd1YWdlKGludCBlbGVtZW50T2Zmc2V0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJLy8gb25seSBuZWVkIHRvIHByb2Nlc3MgaWYgdGhpcyBuZXcgdmFsdWUgaXMKLQkJLy8gZWFybGllciBpbiB0aGUgZmlsZSB0aGFuIG91ciBjdXJyZW50IHZhbHVlCi0JCS8vIGhhcyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8sIGluIGNhc2Ugb3VyIHByZXZpb3VzIGVhcmxpZXN0IG9uZSwKLQkJLy8gaXMgaXRzZWxmIGNoYW5naW5nIQotCQlpZiAoZmlyc3RMYW5ndWFnZVBvc2l0aW9uID09IC0xIHx8IGVsZW1lbnRPZmZzZXQgPD0gZmlyc3RMYW5ndWFnZVBvc2l0aW9uKSB7Ci0KLQkJCS8vIG5vIG5lZWQgdG8gY2hhbmdlIGN1cnJlbnQgdmFsdWUsIGlmIHdlJ3JlIHRvbGQgc29tZQotCQkJLy8gZWFybGllciB2YWx1ZSBpcyBudWxsIG9yIGJsYW5rIChzb3VuZHMgbGlrZSBhbiBlcnJvciwgYW55d2F5KQotCQkJaWYgKGhhc1ZhbHVlKG5ld1ZhbHVlKSkgewotCQkJCWZpcnN0TGFuZ3VhZ2VQb3NpdGlvbiA9IGVsZW1lbnRPZmZzZXQ7Ci0JCQkJLy8gb25seSBkbyB0aGUgc2V0IHByb2Nlc3NpbmcgaWYgZGlmZmVyZW50Ci0JCQkJLy8gZnJvbSB3aGF0IGl0IGFscmVhZHkgaXMKLQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoY2FjaGVkTGFuZ3VhZ2UpKSB7Ci0JCQkJCXNldENhY2hlZExhbmd1YWdlKG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGR3X1RPRE86IHNldCBsYW5ndWFnZSBpbiBkb2N1bWVudCBwYXJ0aXRpb25lcgotCQkJLy8gbnNkX1RPRE86IHNldCBsYW5ndWFnZSBpbiBkb2N1bWVudCBwYXJ0aXRpb25lcgotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlZCBieSBQYWdlRGlyZWN0aXZlV2F0Y2hlcnMgdG8gc2lnbmFsIHRoYXQgc29tZSBpbXBvcnRhbnQgYXR0cmlidXRlCi0JICogaGFzIGNoYW5nZWQsIGFuZCBhbnkgY2FjaGVkIHZhbHVlcyBzaG91bGQgYmUgcmUtY2FsY3VhdGVkCi0JICovCi0Jdm9pZCBjaGFuZ2VkUGFnZUVuY29kaW5nKGludCBlbGVtZW50T2Zmc2V0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQotCQkvLyB3ZSBkb24ndCBjdXJyZW50bHkgdHJhY2sgYWN0aXZlIHZhbHVlLCBzaW5jZQotCQkvLyBqdXN0IG5lZWQgZHVyaW5nIHJlYWQgYW5kIHdyaXRlICh3aGVyZSBpdHMKLQkJLy8gY2FsY3VsYXRlZC4gV2Ugd2lsbCBuZWVkIGluIGZ1dHVyZSwgdG8KLQkJLy8gYWN1cmF0ZWx5IGNsb25lIGEgbW9kZWwgYW5kIHRvIGRpc3BsYXkKLQkJLy8gImN1cnJlbnQgZW5jb2RpbmciIHRvIHVzZXIgaW4gc3RhdHVzIGJhci4KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaGFzVmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1ZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhY2hlZENvbnRlbnRUeXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGNhY2hlZENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNhY2hlZENvbnRlbnRUeXBlID0gZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0Q29udGVudFR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0Q29udGVudFR5cGUoKSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZmlsZSwgdHJ1ZSk7Ci0JCX0KLQkJLy8gQlVHMTM2NDY4Ci0JCWlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0eXBlID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FjaGVkTGFuZ3VhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlpZiAoY2FjaGVkTGFuZ3VhZ2UgPT0gbnVsbCkKLQkJCWNhY2hlZExhbmd1YWdlID0gZ2V0RGVmYXVsdExhbmd1YWdlKCk7Ci0JCXJldHVybiBjYWNoZWRMYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdExhbmd1YWdlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdExhbmd1YWdlKCkgewotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWxhbmd1YWdlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BMQU5HVUFHRSwgZmlsZSwgdHJ1ZSk7Ci0JCX0KLQkJLy8gQlVHMTM2NDY4Ci0JCWlmIChsYW5ndWFnZSA9PSBudWxsKQotCQkJbGFuZ3VhZ2UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNhY2hlZENvbnRlbnRUeXBlLgotCSAqIAotCSAqIEBwYXJhbSBjYWNoZWRDb250ZW50VHlwZQotCSAqICAgICAgICAgICAgVGhlIGNhY2hlZENvbnRlbnRUeXBlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlZENvbnRlbnRUeXBlKFN0cmluZyBuZXdDb250ZW50VHlwZSkgewotCQkvLyBpZiB0aGUgcGFzc2VkIGluIHZhbHVlIGlzIHRoZSBzYW1lIGFzIGV4aXN0aW5nLCB0aGVyZSdzIG5vdGhpbmcgdG8KLQkJLy8gZG8uCi0JCS8vIGlmIGl0cyBkaWZmZXJlbnQsIHRoZW4gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGNvbnRlbnRIYW5kbGVyIGFzIHdlbGwKLQkJLy8gYW5kLCBtb3JlIHRvIHRoZSBwb2ludCwgc2lnbmFsIGEgcmUtaW5pdGlhbGl6dGF0aW9uIGlzIG5lZWRlZC4KLQkJLy8gTm90ZTogaWYgdGhlIHZhbHVlIHdlJ3JlIGdldHRpbmcgc2V0IHRvIGRvZXMgbm90IGhhdmUgYSBoYW5kbGVyIGluCi0JCS8vIHRoZSByZWdpc3RyeSwKLQkJLy8gd2UnbGwgYWN0dWFsbHkgbm90IHNldCBpdCB0byBudWxsIG9yIGFueXRoaW5nLCB3ZSdsbCBqdXN0IGNvbnRpbnVlCi0JCS8vIG9uIHdpdGggdGhlIG9uZQotCQkvLyB3ZSBoYXZlLiBUaGlzIGlzIHByZXR0eSBpbXBvcnRhbnQgdG8gYXZvaWQgcmUtaW5pdGlhbGl6aW5nIG9uIGV2ZXJ5Ci0JCS8vIGtleSBzdHJva2UgaWYgc29tZW9uZQotCQkvLyBpcyB0eXBpbmcgaW4gYSBuZXcgY29udGVudCB0eXBlLCBidXQgaGF2ZW4ndCB5ZXQgZmluaXNoZWQgdGhlIHdob2xlCi0JCS8vICJ3b3JkIi4KLQkJLy8gSG93ZXZlciwgaWYgYW4gY29udGVudFR5cGUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSByZWdpc3RyeSByZXR1cm5zCi0JCS8vIHRoZSBvbmUKLQkJLy8gZm9yIFhNTC4KLQkJLy8gaWYgKHRoaXMuY2FjaGVkQ29udGVudFR5cGUgIT0gbnVsbCAmJgotCQkvLyB0aGlzLmNhY2hlZENvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UobmV3Q29udGVudFR5cGUpKSB7IC8vIHRoZW4KLQkJLy8gZG8gbm90aGluZwotCQkvLyB9IGVsc2UgewotCQl0aGlzLmNhY2hlZENvbnRlbnRUeXBlID0gbmV3Q29udGVudFR5cGU7Ci0JCS8vIHNlZSBpZiB3ZSBjYW4gdXBkYXRlIGVtYmVkZGVkIGhhbmRsZXIKLQkJLy8gaWYgKHRoaXMuY2FjaGVkQ29udGVudFR5cGUgPT0gbnVsbCB8fAotCQkvLyB0aGlzLmNhY2hlZENvbnRlbnRUeXBlLmxlbmd0aCgpID09IDApIHsgLy8gZG8gbm90aGluZywgZG9uJ3QgY2FuJ3QKLQkJLy8gZ2V0IGEgbmV3IGhhbmRsZXIsIHNvIHdlJ2xsIGtlZXAgd2hhdCB3ZSBoYXZlCi0JCS8vIH0gZWxzZSB7Ci0KLQkJLy8gZ2V0SGFuZGxlciBzaG91bGQgYWx3YXlzIHJldHVybiBzb21ldGhpbmcgKG5ldmVyIG51bGwpLCBiYXNlZAotCQkvLyBvbiB0aGUgcnVsZXMgaW4gdGhlIGZhY3RvcnkuCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXJGb3IodGhpcy5jYWNoZWRDb250ZW50VHlwZSk7Ci0JCS8vIHdlIGRvIHRoaXMgY2hlY2sgZm9yIHJlLWluaXQgaGVyZSwgaW5zdGVhZCBvZiBpbiBzZXRFbWJlZGRlZFR5cGUsCi0JCS8vIHNpbmNlIHNldEVtYmVkZGVkVHlwZSBpcyBjYWxsZWQgZHVyaW5nIHRoZSBub3JtYWwgaW5pdGlhbGl6dGlvbgotCQkvLyBwcm9jZXNzLCB3aGVuIHJlLWluaXQgaXMgbm90IG5lZWRlZCAoc2luY2UgdGhlcmUgaXMgbm8gY29udGVudCkKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCAmJiBoYW5kbGVyICE9IG51bGwgJiYgZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBoYW5kbGVyKSB7Ci0JCQkvLyBjaGFuZ2luZyB0aGlzIGVtYmVkZGVkIGhhbmRsZXIgaGVyZSBtYXkKLQkJCS8vIGJlIGluIHRoZSBtaWRkbGUgb2YgYW5vdGlmeSBsb29wLCBub3Qgc3VyZQotCQkJLy8gaWYgdGhhdCdsbCBjYXVzZSBwcm9ibGVtcy4KLQotCQkJLy8gYmUgc3VyZSB0byBob2xkIG9sZEhhbmRsZXIgaW4gdGVtcCB2YXIKLQkJCS8vIG9yIGVsc2Ugc2V0RW1iZWRkZWRUeXBlIHdpbGwgInJlc2V0IiBpdAotCQkJLy8gYmVmb3JlIG1vZGVsUmVpbml0TmVlZGVkKG9sZEhhbmRsZXIsIGhhbmRsZXIpIGlzIGNhbGxlZAotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyID0gZW1iZWRkZWRUeXBlSGFuZGxlcjsKLQkJCXNldEVtYmVkZGVkVHlwZShoYW5kbGVyKTsKLQkJCW1vZGVsUmVpbml0TmVlZGVkKG9sZEhhbmRsZXIsIGhhbmRsZXIpOwotCQl9Ci0JCS8vIH0KLQotCQkvLyB9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlLWluaXQgYmFzZWQgb24gZW1iZWRkZWRUeXBlSGFuZGxlciBjaGFuZ2luZy4KLQkgKiBJdCBpcyBnaXZlbiBwcmlvcml0eSBvdmVyIHRoZSBsYW5ndWFnZSBjaGFuZ2UsIHNpbmNlIHRoZXJlIGl0cyBtb3JlCi0JICogaW1wb3J0YW50IHRvIGhhdmUgb2xkIGFuZCBuZXcgaGFuZGxlcnMncyBpbiB0aGUgc3RhdGVEYXRhIGZpZWxkLgotCSAqLwotCXByaXZhdGUgdm9pZCBtb2RlbFJlaW5pdE5lZWRlZChFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEhhbmRsZXIsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlcikgewotCQlpZiAobW9kZWwuaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWxyZWFkeSBiZWluZyBpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQltb2RlbC5zZXRSZWluaXRpYWxpemVTdGF0ZURhdGEobmV3IEVtYmVkZGVkVHlwZVN0YXRlRGF0YShvbGRIYW5kbGVyLCBuZXdIYW5kbGVyKSk7Ci0JCQltb2RlbC5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBtb2RlbFJlaW5pdE5lZWRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kZWxSZWluaXROZWVkZWQoU3RyaW5nIG9sZGxhbmd1YWdlLCBTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJLy8gYml0IG9mIGEgc2hvcnQgY3V0IGZvciBub3cgLi4uLiB3ZSBkb250JyBuZWVkIGxhbmd1YWdlIGF0IHRoZQotCQkvLyBtb21lbnQsCi0JCS8vIGJ1dCBzaG91bGQgc2V0IHRoZSBzdGF0ZSBkYXRhCi0JCWlmIChtb2RlbC5pc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWxyZWFkeSBiZWluZyBpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCS8vIGlmIGFscmVhZHkgYmVpbmcgcmUtaW5pdGlhbGl6ZWQsIHdlIGRvbid0IHdhbnQgdG8KLQkJCQkvLyByZXNldCB0aGUgZGF0YSBpbiB0aGUgc3RhdGVEYXRhIGZpZWxkLgotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCW1vZGVsLnNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShuZXdMYW5ndWFnZSk7Ci0JCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWRMYW5ndWFnZShTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJaWYgKGNhY2hlZExhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2VTdGF0ZUNoYW5nZWQoY2FjaGVkTGFuZ3VhZ2UsIG5ld0xhbmd1YWdlKSkgeyAvLyBhCi0JCQkvLyBjb21wbGV0ZQotCQkJLy8gcmUtaW5pdAotCQkJLy8gb3ZlcmtpbGwKLQkJCS8vIGluCi0JCQkvLyBjdXJyZW50Ci0JCQkvLyBzeXN0ZW0sCi0JCQkvLyBzaW5jZQotCQkJLy8gcmVhbGx5Ci0JCQkvLyBqdXN0Ci0JCQkvLyBuZWVkCi0JCQkvLyBmb3IKLQkJCS8vIHRoZSBsaW5lIHN0eWxlIHByb3ZpZGVycywKLQkJCS8vIEJVVCwgYSBjaGFuZ2UgaW4gbGFuZ3VhZ2UgY291bGQgZWZmZWN0IG90aGVyIHRoaW5ncywKLQkJCS8vIGFuZCB3ZSBkb24ndCBleHBlY3QgdG8gaGFwcGVuIG9mdGVuIHNvIGEgbGl0dGxlIG92ZXJraWxsIGlzbid0Ci0JCQkvLyB0b28gYmFkLgotCQkJLy8gVGhlIGRlZXAgcHJvYmxlbSBpcyB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBnZXQgYXQgdGhlICJlZGl0Ci0JCQkvLyBzaWRlIiBhZHBhcHRlcnMKLQkJCS8vIHNwZWNpZmljYWxseSBoZXJlIGluIG1vZGVsIGNsYXNzLgotCQkJLy8gd2UgaGF2ZSB0byBkbyB0aGUgbW9kZWwgY2hhbmdlZCBzZXF1ZW5jZSB0byBnZXQgdGhlCi0JCQkvLyBzY3JlZW4gdG8gdXBkYXRlLgotCQkJLy8gZG8gbm90IHNpZ25hbCBhZ2FpbiwgaWYgc2lnbmFsZWQgb25jZSAodGhlIHJlaW5pdCBzdGF0ZSBkYXRhCi0JCQkvLyB3aWxsIGJlIHdyb25nLgotCQkJLy8gKHRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQgaW4gZnV0dXJlKQotCQkJaWYgKCFtb2RlbC5pc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCQkJCW1vZGVsUmVpbml0TmVlZGVkKGNhY2hlZExhbmd1YWdlLCBuZXdMYW5ndWFnZSk7Ci0JCQl9Ci0JCX0KLQkJc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgcHVibGljIGFjY2VzcyBtZXRob2QsIHVzZWQgZXNwZWNpYWxseSBmcm9tIGxvYWRlciwgZm9yIEpTUAotCSAqIEZyYWdtZW50IHN1cHBvcnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCXRoaXMuY2FjaGVkTGFuZ3VhZ2UgPSBuZXdMYW5ndWFnZTsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSAoKElEb2N1bWVudEV4dGVuc2lvbjMpIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpOwotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIHBhcnRpdGlvbmVyKS5zZXRMYW5ndWFnZShuZXdMYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbGFuZ3VhZ2VTdGF0ZUNoYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FjaGVkTGFuZ3VhZ2UKLQkgKiBAcGFyYW0gbmV3TGFuZ3VhZ2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGFuZ3VhZ2VTdGF0ZUNoYW5nZWQoU3RyaW5nIGNhY2hlZExhbmd1YWdlLCBTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgLy8gbGFuZ3VhZ2VzIGFyZSBlcXVhbCwgdGhlbiBubyBjaGFuZ2UgaW4KLQkJLy8gc3RhdGUKLQkJaWYgKCFjYWNoZWRMYW5ndWFnZS5lcXVhbHNJZ25vcmVDYXNlKG5ld0xhbmd1YWdlKSkgewotCQkJYm9vbGVhbiBvbGRMYW5ndWFnZUtub3duID0gbGFuZ3VhZ2VLbm93bihjYWNoZWRMYW5ndWFnZSk7Ci0JCQlib29sZWFuIG5ld0xhbmd1YWdlS25vd24gPSBsYW5ndWFnZUtub3duKG5ld0xhbmd1YWdlKTsKLQkJCXJlc3VsdCA9IG5ld0xhbmd1YWdlS25vd24gfHwgKCFuZXdMYW5ndWFnZUtub3duICYmIG9sZExhbmd1YWdlS25vd24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxhbmd1YWdlS25vd24uCi0JICogCi0JICogQHBhcmFtIGNhY2hlZExhbmd1YWdlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxhbmd1YWdlS25vd24oU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCXJldHVybiAoU3RyaW5nVXRpbHMuY29udGFpbnMoSkFWQV9MQU5HVUFHRV9LRVlTLCBsYW5ndWFnZSwgZmFsc2UpIHx8IFN0cmluZ1V0aWxzLmNvbnRhaW5zKEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUywgbGFuZ3VhZ2UsIGZhbHNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0SGFuZGxlckZvcihTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJRW1iZWRkZWRUeXBlUmVnaXN0cnkgcmVnID0gZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCk7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCWlmIChyZWcgIT0gbnVsbCkKLQkJCWhhbmRsZXIgPSByZWcuZ2V0VHlwZUZvcihjb250ZW50VHlwZSk7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEZvciBKU1AgZmlsZXMsIHRleHQvaHRtbCBpcyB0aGUgZGVmYXVsdCBjb250ZW50IHR5cGUuIFRoaXMgbWF5IHdhbnQKLQkgKiB0aGlzIGRpZmZlcmVudCBmb3IgdHlwZXMgbGlrZSBqc3YgKGpzcCBmb3Igdm9pY2UgeG1sKSBGb3Igbm93LCBoYXJkCi0JICogY29kZSB0byBuZXcgaW5zdGFuY2UuIEluIGZ1dHVyZSwgc2hvdWxkIGdldCBpbnN0YW5jZSBmcm9tIHJlZ2lzdHJ5LgotCSAqIAotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSFRNTCBhcyB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXREZWZhdWx0RW1iZWRkZWRUeXBlKCkgewotCQlyZXR1cm4gZ2V0SGFuZGxlckZvcihnZXREZWZhdWx0Q29udGVudFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIElOb2RlTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbm90aWZpZXJBdENyZWF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCWlmIChlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5pdGVyYXRvcigpOwotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gcGFfVE9ETzogcG9zc2libHkgbmVlZCB0byByZWxlYXNlIGhlcmUuLi4KLQkJCS8vIG9yICJ1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkiCi0JCQkvLyBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5IHdhcyBjYWxsZWQgZnJvbSBKU1BNb2RlbExvYWRlcgotCQkJZW1iZWRkZWRUeXBlSGFuZGxlciA9IG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM3MDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotaW50ZXJmYWNlIFBhZ2VEaXJlY3RpdmVXYXRjaGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCVN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0JU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0KLQlpbnQgZ2V0T2Zmc2V0KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3ZGY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkgZXh0ZW5kcyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KCkgewotCQl0aGlzKFBhZ2VEaXJlY3RpdmVXYXRjaGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCVBhZ2VEaXJlY3RpdmVXYXRjaGVyIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJSURPTUVsZW1lbnQgeG1sRWxlbWVudCA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQkJaWYgKHhtbEVsZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IHhtbEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKCJqc3A6ZGlyZWN0aXZlLnBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJlc3VsdCA9IG5ldyBQYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwoeG1sRWxlbWVudCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMyMTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQXR0ckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLQotLyoqIAotICogVGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgY2xhc3MgaXMgdG8gbW9uaXRvciBwYWdlIGRpcmVjdGl2ZXMgYW5kIGlmIAotICogYSBjaGFuZ2UgaW4gZW1iZWRkZWQgdHlwZSBpcyBpcyBtYWRlLCBpdCB3aWxsIHNpZ25hbCAKLSAqIHRoZSBzdHJ1Y3R1cmVkTW9kZWwgdGhhdCBpdCBuZWVkcyB0byByZWluaXRpYWxpemUgaXRzZWxmLgotICovCi1jbGFzcyBQYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwgaW1wbGVtZW50cyBQYWdlRGlyZWN0aXZlV2F0Y2hlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgYWRhcHRlclR5cGUgPSBQYWdlRGlyZWN0aXZlV2F0Y2hlci5jbGFzczsKLQlJRE9NRWxlbWVudCB0YXJnZXRFbGVtZW50OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC4KLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsKElET01FbGVtZW50IHRhcmdldCkgewotCQlzdXBlcigpOwotCQl0YXJnZXRFbGVtZW50ID0gdGFyZ2V0OwotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnRUeXBlVmFsdWUgIT0gbnVsbCkgewotCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQlQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKSAoKElET01Eb2N1bWVudCkgdGFyZ2V0RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZENvbnRlbnRUeXBlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgY29udGVudFR5cGVWYWx1ZSk7Ci0JCX0KLQkJU3RyaW5nIGxhbmd1YWdlVmFsdWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCJsYW5ndWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsYW5ndWFnZVZhbHVlICE9IG51bGwpIHsKLQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRMYW5ndWFnZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIGxhbmd1YWdlVmFsdWUpOwotCQl9Ci0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgYmUgYWRkZWQgdG8gcGFnZSBkaXJlY3RpdmVzLCBzbyBpZiB3ZSBzZWUgYSBwYWdlIGRpcmVjdGl2ZQotCQkvLyBjaGFuZ2UsIHdlIG5lZWQgdG8gY2hlY2sgaXRzIGF0dHJpYnV0ZXMsIGFuZCBub3RpZnkgdGhlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIHdoZW4gCi0JCS8vIGNlcnRhaW4gb25lcyBjaGFuZSwgc28gaXQgY2FuIG1ha2UgaXRzICJjZW50cmFsaXplZCIgZGVjaXNpb25zLgotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCi0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCQlpZiAoY2hhbmdlZEZlYXR1cmUgaW5zdGFuY2VvZiBBdHRySW1wbCkgewotCQkJCQkJQXR0ckltcGwgYXR0cmlidXRlID0gKEF0dHJJbXBsKSBjaGFuZ2VkRmVhdHVyZTsKLQkJCQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQkJCWlmIChuYW1lLmVxdWFscygiY29udGVudFR5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkQ29udGVudFR5cGUoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoImxhbmd1YWdlIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkTGFuZ3VhZ2UoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFIDoKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJlbW92ZWQiK25ldyBEYXRlKCkudG9TdHJpbmcoKSk7Ci0JCQkJCWJyZWFrOwotCi0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZVZhbHVlID0gdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnRUeXBlVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJU3RyaW5nIGxhbmd1YWdlVmFsdWUgPSB0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbGFuZ3VhZ2VWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRhcmdldEVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2M2NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9BdHRySW1wbEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEF0dHJJbXBsRm9ySlNQIGV4dGVuZHMgQXR0ckltcGwgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRMYW5ndWFnZU9wZW5pbmcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIuc2V0TmFtZShuYW1lKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJc3VwZXIuc2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZVVSSSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0NvbW1lbnRJbXBsRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0NvbW1lbnRJbXBsRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNmVhMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9Db21tZW50SW1wbEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsRm9ySlNQIGV4dGVuZHMgQ29tbWVudEltcGwgewotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudENsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTURvY3VtZW50Rm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTURvY3VtZW50Rm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGJjNjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NRG9jdW1lbnRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFN0eWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIERPTURvY3VtZW50Rm9ySlNQIGV4dGVuZHMgRG9jdW1lbnRTdHlsZUltcGwgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERPTURvY3VtZW50Rm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICovCi0JcHJvdGVjdGVkIERPTURvY3VtZW50Rm9ySlNQKERvY3VtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRE9NRG9jdW1lbnRGb3JKU1AgY2xvbmVkID0gbmV3IERPTURvY3VtZW50Rm9ySlNQKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lZC5pbXBvcnRDaGlsZE5vZGVzKHRoaXMsIHRydWUpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoZWNrVGFnTmFtZVZhbGlkaXR5KHRhZ05hbWUpOwotCi0JCUVsZW1lbnRJbXBsRm9ySlNQIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGxGb3JKU1AoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkvKioKLQkgKiBjcmVhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotCQlDb21tZW50SW1wbEZvckpTUCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsRm9ySlNQKCk7Ci0JCWNvbW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNvbW1lbnQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQXR0ckltcGxGb3JKU1AgYXR0ciA9IG5ldyBBdHRySW1wbEZvckpTUCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlBdHRySW1wbEZvckpTUCBhdHRyID0gbmV3IEF0dHJJbXBsRm9ySlNQKCk7Ci0JCWF0dHIuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQlhdHRyLnNldE5hbWVzcGFjZVVSSSh1cmkpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0JLyoqCi0JICogY3JlYXRlVGV4dE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0Tm9kZShTdHJpbmcgZGF0YSkgewotCQlUZXh0SW1wbEZvckpTUCB0ZXh0ID0gbmV3IFRleHRJbXBsRm9ySlNQKCk7Ci0JCXRleHQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJdGV4dC5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyLnNldE1vZGVsKG1vZGVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTU1vZGVsRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTU1vZGVsRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzYyN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Nb2RlbEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NU3R5bGVNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlhNTE1vZGVsUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBET01Nb2RlbEZvckpTUCBleHRlbmRzIERPTVN0eWxlTW9kZWxJbXBsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBET01Nb2RlbEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gcmVtZW1iZXIsIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIHN1cGVyIGNvbnN0cnVjdG9yLCAKLQkJLy8gdmlhIGludGVybmFsQ3JlYXRlRG9jdW1lbnQKLQl9Ci0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnQgbWV0aG9kCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCkgewotCQlET01Eb2N1bWVudEZvckpTUCBkb2N1bWVudCA9IG5ldyBET01Eb2N1bWVudEZvckpTUCgpOwotCQlkb2N1bWVudC5zZXRNb2RlbCh0aGlzKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxQYXJzZXIgY3JlYXRlTW9kZWxQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRE9NTW9kZWxQYXJzZXIodGhpcyk7Ci0JfQotCXByb3RlY3RlZCBYTUxNb2RlbFVwZGF0ZXIgY3JlYXRlTW9kZWxVcGRhdGVyKCkgewotCQlyZXR1cm4gbmV3IE5lc3RET01Nb2RlbFVwZGF0ZXIodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9FbGVtZW50SW1wbEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9FbGVtZW50SW1wbEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjZiY2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRWxlbWVudEltcGxGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRTdHlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbEZvckpTUCBleHRlbmRzIEVsZW1lbnRTdHlsZUltcGwgewotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFbGVtZW50SW1wbEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhhdAotCSAqLwotCXB1YmxpYyBFbGVtZW50SW1wbEZvckpTUChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkRW5kVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENsb3NlZChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkQ29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZWROZXN0ZWREaXJlY3RpdmUoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlzdXBlci5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVsZW1lbnRJbXBsIGNsb25lZCA9IG5ldyBFbGVtZW50SW1wbEZvckpTUCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RET01Nb2RlbFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI3MWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlhNTE1vZGVsVXBkYXRlcjsKLQotCi1wdWJsaWMgY2xhc3MgTmVzdERPTU1vZGVsVXBkYXRlciBleHRlbmRzIFhNTE1vZGVsVXBkYXRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgTmVzdERPTU1vZGVsVXBkYXRlcihET01Nb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RlZERPTU1vZGVsUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RlZERPTU1vZGVsUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2ViODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9OZXN0ZWRET01Nb2RlbFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbFBhcnNlcjsKLQotcHVibGljIGNsYXNzIE5lc3RlZERPTU1vZGVsUGFyc2VyIGV4dGVuZHMgWE1MTW9kZWxQYXJzZXIgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHVibGljIE5lc3RlZERPTU1vZGVsUGFyc2VyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRUZXh0KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ05hbWUoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ09wZW4oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlLCBTdHJpbmcgdGFnTmFtZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0VGFnTmFtZSA9IHRhZ05hbWU7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfU0NSSVBUTEVUOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfRVhQUkVTU0lPTjsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQlyZXN1bHRUYWdOYW1lID0gSlNQVGFnLkpTUF9ERUNMQVJBVElPTjsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfRElSRUNUSVZFOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQlyZXN1bHRUYWdOYW1lICs9ICcuJzsKLQkJCXJlc3VsdFRhZ05hbWUgKz0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0VGFnTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9UZXh0SW1wbEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9UZXh0SW1wbEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTkxYTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvVGV4dEltcGxGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGV4dEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0SW1wbEZvckpTUCBleHRlbmRzIFRleHRJbXBsIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdE5lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiODQ1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lKU1BIZWFkQ29udGVudERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BIZWFkQ29udGVudERldGVjdG9yIGV4dGVuZHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQlTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3OTAzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBhcnNlcyBiZWdpbm5pbmcgcG9ydGlvbiBvZiBKU1AgZmlsZSB0byBnZXQgYXR0cmlidXRlcyBpbiBwYWdlCi0gKiBkaXJlY3RpaXZlCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IgZXh0ZW5kcyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJSlNQSGVhZENvbnRlbnREZXRlY3RvciB7Ci0KLQlwdWJsaWMgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzRlZGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5CdWZmZXJlZExpbWl0ZWRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX01JTUVfVFlQRSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNQRUNfREVGQVVMVF9FTkNPRElORyA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBJRmlsZSBnZXRGaWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCU9iamVjdCBpZCA9IG1vZGVsLmdldElkKCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXBhdGggPSBpZC50b1N0cmluZygpOwotCQl9Ci0JCS8vIFRPRE8gbmVlZHMgcmV3b3JrIGZvciBsaW5rZWQgcmVzb3VyY2VzCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgSlNQRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoSlNQU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJVGFnTWFya2VyIGJtID0gbmV3IFRhZ01hcmtlcih0YWdOYW1lKTsKLQkJcGFyc2VyLmFkZE5lc3RhYmxlUHJlZml4KGJtKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVDb2RlZERvY3VtZW50KGlGaWxlKTsKLQotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUoaUZpbGUpOwotCQkJaWYgKGVtYmVkZGVkVHlwZSAhPSBudWxsKQotCQkJCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCi0JCQlmRnVsbFByZXBhcmVkUmVhZGVyLnJlc2V0KCk7Ci0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZUNvZGVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWdldENvZGVkUmVhZGVyQ3JlYXRvcigpLnNldChpRmlsZSk7Ci0KLQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldEVuY29kaW5nTWVtZW50bygpKTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCAmJiBpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGhhdmUgYm90aCBudWxsIGZpbGVuYW1lIGFuZCBpbnB1dHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoKTsKLQkJdHJ5IHsKLQkJCWNvZGVkUmVhZGVyQ3JlYXRvci5zZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGZFbmNvZGluZ01lbWVudG8pOwotCQkJLy8gdGhlIGZhY3QgdGhhdCBmaWxlIGlzIG51bGwgbWVhbnMgdGhpcyBtZXRob2QvY29kZSBwYXRoIGlzIG5vCi0JCQkvLyBnb29kIGZvciBKU1AgZnJhZ21lbnRzCi0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEVtYmVkZGVkVHlwZSgoSUZpbGUpIG51bGwpOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJaWYgKGVtYmVkZGVkVHlwZSAhPSBudWxsKQotCQkJCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuZ2V0UGFyc2VyKCkpOwotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCi0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB0aGUgTUlNRSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIGEgcGFnZSBkaXJlY3RpdmUuIFRoaXMKLQkgKiBzaG91bGQgYXBwZWFyICJhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgSlNQIHBhZ2UiIGFjY29yZGluZyB0byB0aGUKLQkgKiBKU1AgdjEuMiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSUZpbGUgZmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJaGFuZGxlciA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBtaW1lVHlwZSA9IG51bGw7Ci0KLQkJCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBqc3BQcm92aWRlciA9IGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpOwotCQkJUmVhZGVyIGZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldEZ1bGxQcmVwYXJlZFJlYWRlcigpOwotCQkJQnVmZmVyZWRMaW1pdGVkUmVhZGVyIGxpbWl0ZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRMaW1pdGVkUmVhZGVyKGZ1bGxQcmVwYXJlZFJlYWRlciwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQkJanNwUHJvdmlkZXIuc2V0KGxpbWl0ZWRSZWFkZXIpOwotCQkJaWYgKGpzcFByb3ZpZGVyIGluc3RhbmNlb2YgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IpIHsKLQkJCQltaW1lVHlwZSA9ICgoSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IpIGpzcFByb3ZpZGVyKS5nZXRDb250ZW50VHlwZSgpOwotCQkJCWZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJfQotCi0JCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLmxlbmd0aCgpID09IDApIHsKLQkJCQloYW5kbGVyID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaGFuZGxlciA9IHJlZy5nZXRUeXBlRm9yKG1pbWVUeXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzLCB0ZXh0L2h0bWwgaXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiBUaGlzIG1heSB3YW50Ci0JICogdGhpcyBkaWZmZXJlbnQgZm9yIHR5cGVzIGxpa2UganN2IChqc3AgZm9yIHZvaWNlIHhtbCkgRm9yIG5vdywgaGFyZAotCSAqIGNvZGUgdG8gbmV3IGluc3RhbmNlLiBJbiBmdXR1cmUsIHNob3VsZCBnZXQgaW5zdGFuY2UgZnJvbSByZWdpc3RyeS4KLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIEhUTUwgYXMgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IoZ2V0RGVmYXVsdE1pbWVUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZW1lbWJlciwgdGhlIExvYWRlcgotCQkvLyB3aWxsIG5lZWQgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHBhcnNlcgotCQkvLyBiYXNlZCBvbiAiZW1iZWRkZWQgY29udGVudCIKLQkJSlNQU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJLy8gYWRkIGRlZmF1bHQgbmVzdGFibGUgdGFnIGxpc3QKLQkJYWRkTmVzdGFibGVQcmVmaXgocGFyc2VyLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSVNPLTg4NTktMS9MYXRpbi0xIGFzIHRoZSBkZWZhdWx0IGNoYXJzZXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gU1BFQ19ERUZBVUxUX0VOQ09ESU5HOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxsIGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLiBJZiB0aGUKLQkgKiBwYXJzZXIgaXMgdG8gaGFuZGxlIHRhZyBsaWJyYXJpZXMsIGl0IG11c3QgaGF2ZSBhIFRhZ2xpYlN1cHBvcnQgb2JqZWN0Ci0JICogd2l0aCBhIHZhbGlkIFVSSVJlc29sdmVyIGFuZCB0aGlzIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYXR0YWNoZWQgdG8gaXQKLQkgKiBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgb24gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBKU1BSZVBhcnNlcigpKTsKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50LnNldERvY3VtZW50UGFydGl0aW9uZXIobmV3Ci0JCS8vIEpTUEphdmFEb2N1bWVudFBhcnRpb25lcigpKTsKLQkJLy8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhbiAiZW1wdHkgbW9kZWwiIC4uLiB3ZSB3YW50IGl0IHRvIGhhdmUgYXQKLQkJLy8gbGVhc3QKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQgZW1iZWRkZWRlZCBjb250ZW50IHR5cGUgaGFuZGxlcgotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vCi0JCS8vIGRvY3VtZW50IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciB0aGlzIHRvCi0JCS8vIHdvcmsuCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCwgSlNQQ29yZU1lc3NhZ2VzLkpTUERvY3VtZW50TG9hZGVyXzEpOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJLy8gVGhpcyAnZ2V0JyBjYXVzZXMgZmlyc3QgdG8gYmUgYmUgYXR0YWNoZWQuCi0JCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vIG1heSBtYWtlIHRoaXMgZWFzaWVyIHRvIHVzZSBpbiBmdXR1ZQotCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpKTsKLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjU1MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci0KLS8qKgotICogVG8gZW5zdXJlIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIFByb2JsZW1SZXF1ZXN0b3IgYW5kIFdvcmtpbmdDb3B5T3duZXIKLSAqIGZvciBKU1AgcGx1Z2lucy4gIFRoZXNlIHdlcmUgcmVtb3ZlZCBmcm9tIEpTUFRyYW5zbGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZQotICogSlNQVHJhbnNsYXRpb24gd2FzIG5vdCBoZWxkIGluIG1lbW9yeSBieSBhbnkgdHlwZSBvZiBKRFQgbGlzdHMgKGNhY2hpbmcKLSAqIHNlYXJjaCByZXN1bHRzLCBldGMuLi4pCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRIZWxwZXIgewotCi0gICAgcHJpdmF0ZSBKU1BQcm9ibGVtUmVxdWVzdG9yIGZQcm9ibGVtUmVxdWVzdG9yID0gbnVsbDsKLSAgICBwcml2YXRlIFdvcmtpbmdDb3B5T3duZXIgZldvcmtpbmdDb3B5T3duZXIgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIENvbXBpbGF0aW9uVW5pdEhlbHBlciBpbnN0YW5jZTsKLQotICAgIHByaXZhdGUgQ29tcGlsYXRpb25Vbml0SGVscGVyKCkgewotICAgICAgICAvLyBmb3JjZSB1c2Ugb2YgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblVuaXRIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBDb21waWxhdGlvblVuaXRIZWxwZXIoKTsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBKU1BQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0KLSAgICAgICAgaWYgKGZQcm9ibGVtUmVxdWVzdG9yID09IG51bGwpCi0gICAgICAgICAgICBmUHJvYmxlbVJlcXVlc3RvciA9IG5ldyBKU1BQcm9ibGVtUmVxdWVzdG9yKCk7Ci0gICAgICAgIHJldHVybiBmUHJvYmxlbVJlcXVlc3RvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV29ya2luZ0NvcHlPd25lciBnZXRXb3JraW5nQ29weU93bmVyKCkgewotCi0gICAgICAgIGlmIChmV29ya2luZ0NvcHlPd25lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmV29ya2luZ0NvcHlPd25lciA9IG5ldyBXb3JraW5nQ29weU93bmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiSlNQIFdvcmtpbmcgY29weSBvd25lciI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmV29ya2luZ0NvcHlPd25lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2YyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0VzY2FwZWRUZXh0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogY2xhc3MgdG8gaGFuZGxlIGNodW5rcyBvZiB0ZXh0L3JlZ2lvbnMKLSAqIHdpdGggZXNjYXBlZCBjaGFyYWN0ZXIgZGF0YQotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEVzY2FwZWRUZXh0VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZlhNTHRvSmF2YUxvb2t1cCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHVuZXNjYXBlZCBmdWxsIHRleHQgb2YgdGhhdCByZWdpb24sICIiIGlmIHRoZXJlIGlzIG5vIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmVzY2FwZWRUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiByKSB7Ci0JCVN0cmluZyB0ZXN0ID0gKHBhcmVudCAhPSByKSA/IHBhcmVudC5nZXRGdWxsVGV4dChyKSA6IHBhcmVudC5nZXRGdWxsVGV4dCgpOwotCQlyZXR1cm4gZ2V0VW5lc2NhcGVkVGV4dCh0ZXN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmVzY2FwZWRUZXh0KFN0cmluZyB0ZXN0KSB7Ci0JCWluaXRMb29rdXAoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRlc3QgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXN0LCAiJjsiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRvazEsIHRvazIsIHRvazMsIHRyYW5zU3RyaW5nOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXRvazEgPSB0b2syID0gdG9rMyA9IHRyYW5zU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl0b2sxID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHRvazEuZXF1YWxzKCImIikgJiYgc3QuaGFzTW9yZVRva2VucygpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQl0b2syID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXRvazMgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoISh0cmFuc1N0cmluZyA9IGZYTUx0b0phdmFMb29rdXAuZ2V0UHJvcGVydHkodG9rMSArIHRvazIgKyB0b2szLCAiIikpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0cmFuc1N0cmluZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlidWZmZXIuYXBwZW5kKHRvazEgKyB0b2syICsgdG9rMyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgbG9va3VwIHRhYmxlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdExvb2t1cCgpIHsKLQkJZlhNTHRvSmF2YUxvb2t1cCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZhcG9zOyIsICInIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImcXVvdDsiLCAiXCIiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZhbXA7IiwgIiYiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZsdDsiLCAiPCIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJmd0OyIsICI+Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImbmJzcDsiLCAiICIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnRpdHkgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYW5zbGF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgZW50aXR5KSB7Ci0JCXJldHVybiBmWE1MdG9KYXZhTG9va3VwLmdldFByb3BlcnR5KGVudGl0eSwgZW50aXR5KTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQVHJhbnNsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3OWYzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFRyYW5zbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLQotLyoqCi0gKiBBbiBvYmplY3QgdGhhdCBob2xkcyBhIHRyYW5zbGF0ZWQgSlNQIFN0cmluZyBhbG9uZyB3aXRoCi0gKiBwb3NpdGlvbiBtYXBwaW5nIGZyb20gSmF2YSB0byBKU1AsIGFuZCBKU1AgdG8gSmF2YS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BUcmFuc2xhdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2xhdGVkIGRvY3VtZW50LgotCSAqIEByZXR1cm4gIHRoZSBzdHJpbmcgY29udGVudHMgb2YgdGhlIHRyYW5zbGF0ZWQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpOwotCi0JLyoqCi0JICogVGhlIGNvcnJlc3BvbmRpbmcgamF2YSBvZmZzZXQgaW4gdGhlIHRyYW5zbGF0ZWQgZG9jdW1lbnQgZm9yIGEgZ2l2ZW4ganNwIG9mZnNldC4KLQkgKiBAcGFyYW0ganNwUG9zaXRpb24KLQkgKiBAcmV0dXJuIHRoZSBqYXZhIG9mZnNldCB0aGF0IG1hcHMgdG8ganNwT2Zmc2V0LCAtMSBpZiB0aGUgcG9zaXRpb24gaGFzIG5vIG1hcHBpbmcuCi0JICovCi0JcHVibGljIGludCBnZXRKYXZhT2Zmc2V0KGludCBqc3BPZmZzZXQpOwotCi0JLyoqCi0JICogVGhlIGNvcnJlc3BvbmRpbmcganNwIG9mZnNldCBpbiB0aGUgc291cmNlIGRvY3VtZW50IGZvciBhIGdpdmVuIGpzcCBvZmZzZXQgaW4gdGhlIHRyYW5zbGF0ZWQgZG9jdW1lbnQuCi0JICogQHBhcmFtIGphdmFQb3NpdGlvbgotCSAqIEByZXR1cm4gdGhlIGpzcCBvZmZzZXQgdGhhdCBtYXBzIHRvIGphdmFPZmZzZXQsIC0xIGlmIHRoZSBwb3NpdGlvbiBoYXMgbm8gbWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCk7Ci0KLQkvKioKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBDb21waWxhdGlvblVuaXQgZm9yIHRoZSB0cmFuc2xhdGVkIEpTUCBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gSUNvbXBpbGF0aW9uVW5pdCBvZiB0aGUgdHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElKYXZhRWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgSlNQIHJhbmdlIGluIHRoZSBKU1AgU3RydWN0dXJlZERvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGpzcFN0YXJ0IHN0YXJpbmcgb2Zmc2V0IGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKiBAcGFyYW0ganNwRW5kIGVuZGluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEByZXR1cm4gSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1Agc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElKYXZhRWxlbWVudFtdIGdldEVsZW1lbnRzRnJvbUpzcFJhbmdlKGludCBqc3BTdGFydCwgaW50IGpzcEVuZCk7Ci0KLQkvKioKLQkgKiBNdXN0IGJlIHNldCB0cnVlIGluIG9yZGVyIGZvciBwcm9ibGVtcyB0byBiZSBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBJZiBzZXQgZmFsc2UsIHByb2JsZW1zIHdpbGwgYmUgaWdub3JlZCBkdXJpbmcgcmVjb25jaWxlLgotCSAqIEBwYXJhbSBjb2xsZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbiBjb2xsZWN0KTsKLQotCS8qKgotCSAqIFJlY29uY2lsZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZm9yIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIExpc3Qgb2YgcHJvYmxlbXMgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9ibGVtcygpOwotCQotCS8vIGFkZCB0aGVzZSBBUEkgb25jZSBmaW5hbGl6ZWQKLQkvLyBnZXRKc3BFZGl0cyhUZXh0RWRpdCBqYXZhRWRpdCkKLQkvLyBnZXRKYXZhUmFuZ2VzKCkKLSAgICAvLyBnZXRKYXZhRG9jdW1lbnQoKQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1AyU2VydmxldE5hbWVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2RmYmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1AyU2VydmxldE5hbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQMlNlcnZsZXROYW1lVXRpbCB7Ci0JCi0JLyoqCi0JICogV0FTIG1hbmdsZXMgVG9tJkplcnJ5IGFzOiBfVG9tXzI2X0plcnJ5OyB0aGlzIHRha2VzIGluIHRoZSBtYW5nbGVkIG5hbWUKLQkgKiBhbmQgcmV0dXJucyB0aGUgb3JpZ2luYWwgbmFtZS4KLQkgKiAKLQkgKiBVbm1hbmdsZXMgdGhlIHF1YWxpZmllZCB0eXBlIG5hbWUuICBJZiBhbiB1bmRlcnNjb3JlIGlzIGZvdW5kCi0JICogaXQgaXMgYXNzdW1lZCB0byBiZSBhIG1hbmdsZWQgcmVwcmVzZW50YXRpb24gb2YgYSBub24tYWxwaGEsIAotCSAqIG5vbi1kaWdpdCBjaGFyYWN0ZXIgb2YgdGhlIGZvcm0gX05OXywgd2hlcmUgTk4gYXJlIGhleCBkaWdpdHMKLQkgKiByZXByZXNlbnRpbmcgdGhlIGVuY29kZWQgY2hhcmFjdGVyLiAgVGhpcyByb3V0aW5lIGNvbnZlcnRzIGl0Ci0JICogYmFjayB0byB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIHVubWFuZ2xlKFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSkgewotCQlpZihxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoMCkgIT0gJ18nKQotCQkJcmV0dXJuIHF1YWxpZmllZFR5cGVOYW1lOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHBvc3NpYmxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJLy8gcmVtb3ZlIHRoZSAuamF2YSBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lCi0JCWlmKHF1YWxpZmllZFR5cGVOYW1lLmVuZHNXaXRoKCIuamF2YSIpKS8vJE5PTi1OTFMtMSQKLQkJCXF1YWxpZmllZFR5cGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKDAsIHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQotCQlmb3IoaW50IGkgPSAxOyBpIDwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCk7IGkrKykgeyAgLy8gc3RhcnQgYXQgaW5kZXggMSBiL2MgMXN0IGNoYXIgaXMgYWx3YXlzICdfJwotCQkJY2hhciBjID0gcXVhbGlmaWVkVHlwZU5hbWUuY2hhckF0KGkpOwotCQkJaWYoYyA9PSAnXycpIHsKLQkJCQlpbnQgZW5kSW5kZXggPSBxdWFsaWZpZWRUeXBlTmFtZS5pbmRleE9mKCdfJywgaSsxKTsKLQkJCQlpZihlbmRJbmRleCA9PSAtMSkKLQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQllbHNlIHsKLQkJCQkJY2hhciB1bm1hbmdsZWQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3NzaWJsZSA9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZyhpKzEsIGVuZEluZGV4KTsgCi0JCQkJCSAgICBpZihpc1ZhbGlkKHBvc3NpYmxlKSkgewotCQkJCQkJCXVubWFuZ2xlZCA9IChjaGFyKUludGVnZXIuZGVjb2RlKCIweCIgKyBwb3NzaWJsZSkuaW50VmFsdWUoKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJaSA9IGVuZEluZGV4OwotCQkJCQkgICAgfQotCQkJCQkgICAgZWxzZSB7IAotCQkJCQkgICAgICAgIHVubWFuZ2xlZCA9IGM7Ci0JCQkJCSAgICB9Ci0JCQkJCQkKLQkJCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJdW5tYW5nbGVkID0gYzsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHVubWFuZ2xlZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgSGV4IHJlcHJlc2VudGF0aW9uIG9mIGFuIEFTQ0lJIGNoYXJhY3RlciAoZWcuIDJGIC0+IC8pCi0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcG9zc2libGUpIHsKLQkgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkgICAgaWYocG9zc2libGUubGVuZ3RoKCkgPT0gMil7CSAgICAKLQkgICAgICAgIGNoYXIgYzEgPSBwb3NzaWJsZS5jaGFyQXQoMCk7Ci0JICAgICAgICBjaGFyIGMyID0gcG9zc2libGUuY2hhckF0KDEpOwotCSAgICAgICAgLy8gMXN0IGNoYXJhY3RlciBtdXN0IGJlIGEgZGlnaXQKLQkgICAgICAgIGlmKENoYXJhY3Rlci5pc0RpZ2l0KGMxKSkgewotCSAgICAgICAgICAgIC8vIDJuZCBjaGFyYWN0ZXIgbXVzdCBiZSBkaWdpdCBvciB1cHBlciBjYXNlIGxldHRlciBBLUYKLQkgICAgICAgICAgICBpZihDaGFyYWN0ZXIuaXNEaWdpdChjMikpIHsKLQkgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZihDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzIpICYmIChjMiA9PSAnQScgfHwgYzIgPT0gJ0InIHx8IGMyID09ICAnQyd8fCBjMiA9PSAgJ0QnfHwgYzIgPT0gICdFJ3x8IGMyID09ICdGJykpIHsKLQkgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogTWFuZ2xlIHN0cmluZyB0byBXQVMtbGlrZSBzcGVjaWZpY2F0aW9ucwotCSAqCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbWFuZ2xlKFN0cmluZyBuYW1lKSB7CSAgCi0JICBTdHJpbmdCdWZmZXIgbW9kaWZpZWROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgCi0JICAvLyBleHRlbnNpb24gKC5qc3AsIC5qc3BmLCAuanNweCwgZXRjLi4uKSBzaG91bGQgYWxyZWFkeSBiZSBlbmNvZGVkIGluIG5hbWUKLQkgIAotCSAgaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0JICAvLyBpbiBjYXNlIG5hbWUgaXMgZm9yYmlkZGVuIChhIG51bWJlciwgY2xhc3MsIGZvciwgZXRjLi4uKQotCSAgbW9kaWZpZWROYW1lLmFwcGVuZCgnXycpOwotCQotCSAgLy8gZW5zdXJlIHJlc3Qgb2YgY2hhcmFjdGVycyBhcmUgdmFsaWQJCi0JICBmb3IgKGludCBpPTA7IGk8IGxlbmd0aDsgaSsrKSB7Ci0JCSAgY2hhciBjdXJyZW50Q2hhciA9IG5hbWUuY2hhckF0KGkpOwotCQkgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXIpID09IHRydWUgICkgeyAKLQkJCSAgbW9kaWZpZWROYW1lLmFwcGVuZChjdXJyZW50Q2hhcik7Ci0JCSAgfSBlbHNlIHsKLQkJCSAgbW9kaWZpZWROYW1lLmFwcGVuZChtYW5nbGVDaGFyKGN1cnJlbnRDaGFyKSk7Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIG1vZGlmaWVkTmFtZS50b1N0cmluZygpOwotCSAgCi0JfQotCi0JLyoqCi0JICogdGFrZSBhIGNoYXJhY3RlciBhbmQgcmV0dXJuIGl0cyBoZXggZXF1aXZhbGVudAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGVDaGFyKGNoYXIgY2gpIHsKLQkgIGlmICggY2ggPT0gRmlsZS5zZXBhcmF0b3JDaGFyICkgewotCQkgIGNoID0gJy8nOwotCSAgfQotCQotCSAgaWYgKCBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSA9PSB0cnVlICkgewotCQkgIHJldHVybiAiIiArIGNoOyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICByZXR1cm4gIl8iICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkudG9VcHBlckNhc2UoKSArICJfIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BJbmNsdWRlUmVnaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjcyMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBFeHRlbnNpb24gb2YgWE1MSlNQUmVnaW9uSGVscGVyIGludGVkZWQgdG8gcGFyc2UgZW50aXJlIGluY2x1ZGVkIEpTUCBmaWxlcy4KLSAqIEJhc2ljYWxseSBpdCBleHBhbmRzIHRoZSBydWxlcyBmb3Igd2hhdCB0YWdzIGFyZSBwYXJzZWQgYXMgSlNQLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyIGV4dGVuZHMgWE1MSlNQUmVnaW9uSGVscGVyIHsKLQkvKioKLQkgKiBAcGFyYW0gSlNQVHJhbnNsYXRvcgotCSAqLwotCXB1YmxpYyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKEpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcih0cmFuc2xhdG9yKTsKLQl9Ci0KLQkvLyB0aGVzZSBtZXRob2RzIGRldGVybWluZSB3aGF0IGNvbnRlbnQgZ2V0cyBhZGRlZCB0byB0aGUgbG9jYWwgc2NyaXBsZXQsIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMKLQkvKgotCSAqIHJldHVybiB0cnVlIGZvciBlbGVtZW50cyB3aG9zZSBjb250ZW50cyB3ZSBtaWdodCB3YW50IHRvIGFkZCB0byB0aGUgamF2YSBmaWxlIHdlIGFyZSBidWlsZGluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSlNQU3RhcnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpOwotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlY2xhcmF0aW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkZWNsYXJhdGlvbiIpIC8vJE5PTi1OTFMtMSQJCQotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIjwlISIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cHJlc3Npb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmV4cHJlc3Npb24iKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JT0iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2NyaXB0bGV0KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUuaW5jbHVkZSIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhZ2xpYkRpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0YWdsaWIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnBhZ2UiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gZGlmZmVyZW50IGJ0d24gWE1MLUpTUCBhbmQgSlNQIHRhZ3MJCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVnaW9uTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQlTdHJpbmcgbmFtZVN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBzaXplID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaWYgKHNpemUgPiAxKSB7Ci0JCQkvLyBwcmVzdW1hYmx5IFhNTC1KU1AgPGpzcDpzY3JpcHRsZXQ+IHwgPGpzcDpleHByZXNzaW9uPiB8IDxqc3A6ZGVjbGFyYXRpb24+Ci0JCQluYW1lUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJfQotCQllbHNlIGlmIChzaXplID09IDEpIHsKLQkJCS8vIHByZXN1bWFibHkgSlNQIG9wZW4gPCUgfCA8JT0gfCA8JSEKLQkJCW5hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQl9Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQluYW1lU3RyID0gZlRleHRUb1BhcnNlLnN1YnN0cmluZyhzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChuYW1lUmVnaW9uKSk7Ci0JCXJldHVybiBuYW1lU3RyLnRyaW0oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3RoZXJSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoc2RSZWdpb24pOwotCQlwcm9jZXNzUGFnZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQUHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ3NjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLQotY2xhc3MgSlNQUHJvYmxlbVJlcXVlc3RvciBpbXBsZW1lbnRzIElQcm9ibGVtUmVxdWVzdG9yIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNBY3RpdmUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNSdW5uaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIExpc3QgZkNvbGxlY3RlZFByb2JsZW1zOwotCi0gICAgcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0KLSAgICAgICAgZklzUnVubmluZyA9IHRydWU7Ci0gICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkKLSAgICAgICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCi0gICAgICAgIGZJc1J1bm5pbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQotICAgICAgICByZXR1cm4gZklzQWN0aXZlICYmIGZDb2xsZWN0ZWRQcm9ibGVtcyAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpc0FjdGl2ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGl2ZShib29sZWFuIGlzQWN0aXZlKSB7Ci0KLSAgICAgICAgaWYgKGZJc0FjdGl2ZSAhPSBpc0FjdGl2ZSkgewotICAgICAgICAgICAgZklzQWN0aXZlID0gaXNBY3RpdmU7Ci0gICAgICAgICAgICBpZiAoZklzQWN0aXZlKQotICAgICAgICAgICAgICAgIHN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIGNvbGxlY3QgdGVtcG9yYXJ5IHByb2JsZW1zIGZyb20gbm93IG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICBmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIG5vIGxvbmdlciBjb2xsZWN0IHRlbXBvcmFyeSBwcm9ibGVtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2xsZWN0ZWQgcHJvYmxlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb2xsZWN0ZWRQcm9ibGVtcygpIHsKLQotICAgICAgICByZXR1cm4gZkNvbGxlY3RlZFByb2JsZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQotICAgICAgICByZXR1cm4gZklzUnVubmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2E0NWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIDxwPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSUpTUFRyYW5zbGF0aW9uLiAgCi0gKiA8YnI+Ci0gKiBUaGlzIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBqYXZhIHRyYW5zbGF0aW9uIG9mIAotICogYSBKU1AgZmlsZSBhcyB3ZWxsIGFzIGEgbWFwcGluZyBvZiByYW5nZXMgZnJvbSB0aGUgdHJhbnNsYXRlZCBKYXZhIHRvIHRoZSBKU1Agc291cmNlLCAKLSAqIGFuZCBtYXBwaW5nIGZyb20gSlNQIHNvdXJjZSBiYWNrIHRvIHRoZSB0cmFuc2xhdGVkIEphdmEuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogWW91IG1heSBhbHNvIHVzZSBKU1BUcmFuc2xhdGlvbiB0byBkbyBDb21waWxhdGlvblVuaXQtZXNxdWUgdGhpbmdzIHN1Y2ggYXM6Ci0gKiA8dWw+Ci0gKiAJPGxpPmNvZGUgc2VsZWN0IChnZXQgamF2YSBlbGVtZW50cyBmb3IganNwIHNlbGVjdGlvbik8L2xpPgotICogIDxsaT5yZWNvbmNpbGU8L2xpPgotICogIDxsaT5nZXQgamF2YSByZWdpb25zIGZvciBqc3Agc2VsZWN0aW9uPC9saT4KLSAqICA8bGk+Z2V0IGEgSlNQIHRleHQgZWRpdCBiYXNlZCBvbiBhIEphdmEgdGV4dCBlZGl0PC9saT4KLSAqICA8bGk+ZGV0ZXJtaW5lIGlmIGEgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIGEganNwOnVzZUJlYW4gcmFuZ2U8L2xpPgotICogIDxsaT5kZXRlcm1pbmUgaWYgYSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gYSBqc3AgaW1wb3J0IHN0YXRtZW50PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvbiBpbXBsZW1lbnRzIElKU1BUcmFuc2xhdGlvbiB7Ci0JCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyAody9vdXQgZXh0ZW5zaW9uKSAqKi8KLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElKYXZhUHJvamVjdCBmSmF2YVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSnNwMkphdmFNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BJbXBvcnRzTWFwID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwVXNlQmVhbk1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcEluZGlyZWN0TWFwID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkVMUHJvYmxlbXMgPSBudWxsOwotCQotCS8vIGRvbid0IHdhbnQgdG8gaG9sZCBvbnRvIG1vZGVsICh2aWEgdHJhbnNsYXRvcikKLQkvLyBhbGwgcmVsZXZhbnQgaW5mbyBpcyBleHRyYWN0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotCS8vcHJpdmF0ZSBKU1BUcmFuc2xhdG9yIGZUcmFuc2xhdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmSmF2YVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZKc3BUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZkNvbXBpbGF0aW9uVW5pdCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCS8qKiBsb2NrIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgY29tcGlsYXRpb24gdW5pdCAqKi8KLQlwcml2YXRlIGJ5dGVbXSBmTG9jayA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1hbmdsZWROYW1lOwotCXByaXZhdGUgU3RyaW5nIGZKc3BOYW1lOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uKElKYXZhUHJvamVjdCBqYXZhUHJvaiwgSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0KLQkJZkxvY2sgPSBuZXcgYnl0ZVswXTsKLQkJZkphdmFQcm9qZWN0ID0gamF2YVByb2o7Ci0JCS8vZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCQkKLQkJLy8gY2FuIGJlIG51bGwgaWYgaXQncyBhbiBlbXB0eSBkb2N1bWVudCAody8gTnVsbEpTUFRyYW5zbGF0aW9uKQotCQlpZih0cmFuc2xhdG9yICE9IG51bGwpIHsKLQkJICAgIGZKYXZhVGV4dCA9IHRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb24oKS50b1N0cmluZygpOwotCQkgICAgZkpzcFRleHQgPSB0cmFuc2xhdG9yLmdldEpzcFRleHQoKTsKLQkJCWZDbGFzc25hbWUgPSB0cmFuc2xhdG9yLmdldENsYXNzbmFtZSgpOwotCQkJZkphdmEySnNwTWFwID0gdHJhbnNsYXRvci5nZXRKYXZhMkpzcFJhbmdlcygpOwotCQkJZkpzcDJKYXZhTWFwID0gdHJhbnNsYXRvci5nZXRKc3AySmF2YVJhbmdlcygpOwotCQkJZkphdmEySnNwSW1wb3J0c01hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BJbXBvcnRSYW5nZXMoKTsKLQkJCWZKYXZhMkpzcFVzZUJlYW5NYXAgPSB0cmFuc2xhdG9yLmdldEphdmEySnNwVXNlQmVhblJhbmdlcygpOwotCQkJZkphdmEySnNwSW5kaXJlY3RNYXAgPSB0cmFuc2xhdG9yLmdldEphdmEySnNwSW5kaXJlY3RSYW5nZXMoKTsKLQkJCWZFTFByb2JsZW1zID0gdHJhbnNsYXRvci5nZXRFTFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGZKYXZhUHJvamVjdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb24jZ2V0SmF2YVRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCS8vcmV0dXJuIChmVHJhbnNsYXRvciAhPSBudWxsKSA/IGZUcmFuc2xhdG9yLmdldFRyYW5zbGF0aW9uKCkudG9TdHJpbmcoKSA6ICIiOyAgLy8kTk9OLU5MUy0xJCAKLQkJcmV0dXJuIGZKYXZhVGV4dDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKc3BUZXh0KCkgewotCQkvL3JldHVybiAoZlRyYW5zbGF0b3IgIT0gbnVsbCkgPyBmVHJhbnNsYXRvci5nZXRKc3BUZXh0KCkgOiAiIjsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZKc3BUZXh0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYXRoKCkgewotCQkvLyBjcmVhdGUgaWYgbmVjZXNzYXJ5Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJcmV0dXJuIChjdSAhPSBudWxsKSA/IGN1LmdldFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBKYXZhIG9mZnNldCBmb3IgYSBnaXZlIEpTUCBvZmZzZXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEphdmFPZmZzZXQoaW50IGpzcE9mZnNldCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLQkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLQotCQkvLyBpdGVyYXRlIGFsbCBtYXBwZWQganNwIHJhbmdlcwotCQlJdGVyYXRvciBpdCA9IGZKc3AySmF2YU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlqc3BQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCS8vIG5lZWQgdG8gY291bnQgdGhlIGxhc3QgcG9zaXRpb24gYXMgaW5jbHVkZWQKLQkJCWlmICghanNwUG9zLmluY2x1ZGVzKGpzcE9mZnNldCkgJiYgIShqc3BQb3Mub2Zmc2V0K2pzcFBvcy5sZW5ndGggPT0ganNwT2Zmc2V0KSkKLQkJCQljb250aW51ZTsKLQotCQkJb2Zmc2V0SW5SYW5nZSA9IGpzcE9mZnNldCAtIGpzcFBvcy5vZmZzZXQ7Ci0JCQlqYXZhUG9zID0gKFBvc2l0aW9uKSBmSnNwMkphdmFNYXAuZ2V0KGpzcFBvcyk7Ci0JCQlpZihqYXZhUG9zICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gamF2YVBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotCQkJZWxzZSAgewotCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJKYXZhUG9zaXRpb24gd2FzIG51bGwhIiArIGpzcE9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBKU1Agb2Zmc2V0IGZvciBhIGdpdmUgSmF2YSBvZmZzZXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLQkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLQotCQkvLyBpdGVyYXRlIGFsbCBtYXBwZWQgamF2YSByYW5nZXMKLQkJSXRlcmF0b3IgaXQgPSBmSmF2YTJKc3BNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJLy8gbmVlZCB0byBjb3VudCB0aGUgbGFzdCBwb3NpdGlvbiBhcyBpbmNsdWRlZAotCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQramF2YVBvcy5sZW5ndGggPT0gamF2YU9mZnNldCkpCi0JCQkJY29udGludWU7Ci0KLQkJCW9mZnNldEluUmFuZ2UgPSBqYXZhT2Zmc2V0IC0gamF2YVBvcy5vZmZzZXQ7Ci0JCQlqc3BQb3MgPSAoUG9zaXRpb24pIGZKYXZhMkpzcE1hcC5nZXQoamF2YVBvcyk7Ci0JCQkKLQkJCWlmKGpzcFBvcyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGpzcFBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotCQkJZWxzZSAgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAianNwUG9zaXRpb24gd2FzIG51bGwhIiArIGphdmFPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBQb3NpdGlvbnMgaW4gdGhlIEphdmEgZG9jdW1lbnQgdG8gY29ycmVzcG9uZGluZyBQb3NpdGlvbnMgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwTWFwKCkgewotCQlyZXR1cm4gZkphdmEySnNwTWFwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgUG9zaXRpb25zIGluIHRoZSBKU1AgZG9jdW1lbnQgdG8gY29ycmVzcG9uZGluZyBQb3NpdGlvbnMgaW4gdGhlIEphdmEgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRKc3AySmF2YU1hcCgpIHsKLQkJcmV0dXJuIGZKc3AySmF2YU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBqYXZhIHJhbmdlIGNvdmVycyBtb3JlIHRoYW4gb25lIHBhcnRpdGlvbiBpbiB0aGUgSlNQIGZpbGUuCi0JICogCi0JICogPHA+Ci0JICogZXguCi0JICogPGNvZGU+Ci0JICogPCUKLQkgKiAJaWYoc3VibWl0KQotCSAqICB7Ci0JICogJT4KLQkgKiAgICA8cD4gcHJpbnQgdGhpcy4uLjwvcD4KLQkgKiAKLQkgKiA8JQotCSAqICB9Ci0JICogIGVsc2UKLQkgKiAgewotCSAqICU+Ci0JICogCSAgIDxwPiBwcmludCB0aGF0Li4uPC9wPgotCSAqIDwlCi0JICogIH0KLQkgKiAlPgotCSAqIDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogdGhlIGlmIGVsc2Ugc3RhdGVtZW50IGFib3ZlIHNwYW5zIDMgSlNQIHBhcnRpdGlvbnMsIHNvIGl0IHdvdWxkIHJldHVybiB0cnVlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgamF2YSBjb2RlIHNwYW5zIG11bHRpcGxlIEpTUCBwYXJ0aXRpb25zLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gamF2YVNwYW5zTXVsdGlwbGVKc3BQYXJ0aXRpb25zKGludCBqYXZhT2Zmc2V0LCBpbnQgamF2YUxlbmd0aCkgewotCQlIYXNoTWFwIGphdmEyanNwID0gZ2V0SmF2YTJKc3BNYXAoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBudWxsOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCWphdmFSYW5nZSA9IChQb3NpdGlvbilpdC5uZXh0KCk7Ci0JCQlpZihqYXZhUmFuZ2Uub3ZlcmxhcHNXaXRoKGphdmFPZmZzZXQsIGphdmFMZW5ndGgpKQotCQkJCWNvdW50Kys7Ci0JCQlpZihjb3VudCA+IDEpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHBvc2l0aW9ucyBmb3IgdGhlIGdpdmVuIHJhbmdlIGluIHRoZSBKYXZhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEphdmFSYW5nZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXRKYXZhMkpzcE1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVBvc2l0aW9uIHAgPSBudWxsOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCXAgPSAoUG9zaXRpb24paXQubmV4dCgpOwotCQkJaWYocC5vdmVybGFwc1dpdGgob2Zmc2V0LCBsZW5ndGgpKQotCQkJCXJlc3VsdHMuYWRkKHApOwotCQl9Ci0JCXJldHVybiAoUG9zaXRpb25bXSlyZXN1bHRzLnRvQXJyYXkobmV3IFBvc2l0aW9uW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgamF2YSBPZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2VyIGltcG9ydCByYW5nZXMKLQkgKiBAcGFyYW0gamF2YU9mZnNldAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgamF2YSBPZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2VyIGltcG9ydCByYW5nZXMsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wb3J0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIGZKYXZhMkpzcEltcG9ydHNNYXApOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2UgYmVhbiByYW5nZXMKLQkgKiBAcGFyYW0gamF2YU9mZnNldAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2VyIGltcG9ydCByYW5nZXMsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlQmVhbihpbnQgamF2YU9mZnNldCkgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCBmSmF2YTJKc3BVc2VCZWFuTWFwKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGphdmFQb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmRpcmVjdChpbnQgamF2YU9mZnNldCkgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCBmSmF2YTJKc3BJbmRpcmVjdE1hcCwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNJblJhbmdlcyhpbnQgamF2YU9mZnNldCwgSGFzaE1hcCByYW5nZXMpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgcmFuZ2VzLCB0cnVlKTsKLQl9Ci0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBnaXZlbiBvZmZzZXQgaXMgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSByYW5nZXMgKFBvc2l0aW9ucykgcGFzc2VkIGluLgotCSAqIGluY2x1ZGVFbmRPZmZzZXQgdGVsbHMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgZW5kIG9mZnNldCBvZiBlYWNoIHJhbmdlIGluIHRoZSB0ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHBhcmFtIHJhbmdlcwotCSAqIEBwYXJhbSBpbmNsdWRlRW5kT2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luUmFuZ2VzKGludCBqYXZhT2Zmc2V0LCBIYXNoTWFwIHJhbmdlcywgYm9vbGVhbiBpbmNsdWRlRW5kT2Zmc2V0KSB7Ci0JCQotCQlJdGVyYXRvciBpdCA9IHJhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCVBvc2l0aW9uIGphdmFQb3MgPSAoUG9zaXRpb24paXQubmV4dCgpOwotCQkJLy8gYWxzbyBpbmNsdWRlIHRoZSBzdGFydCBhbmQgZW5kIG9mZnNldCAob25seSBpZiByZXF1ZXN0ZWQpCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE2ODcKLQkJCWlmKGphdmFQb3MuaW5jbHVkZXMoamF2YU9mZnNldCkgfHwgKGluY2x1ZGVFbmRPZmZzZXQgJiYgamF2YVBvcy5vZmZzZXQramF2YVBvcy5sZW5ndGggPT0gamF2YU9mZnNldCkpIAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgQ29tcGlsYXRpb25Vbml0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEpTUFRyYW5zbGF0aW9uICh0aGlzIHBhcnRpY3VsYXIgbW9kZWwpCi0JICogV2hlbiB1c2luZyBtZXRob2RzIG9uIHRoZSBDVSwgaXQncyByZWNjb21lbmRlZCB0byBzeW5jaHJvbml6ZSBvbiB0aGUgQ1UgZm9yIHJlbGlhYmxlCi0JICogcmVzdWx0cy4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzIHN5bmNocm9uaXplZCB0byBlbnN1cmUgdGhhdCA8Y29kZT5jcmVhdGVDb21wbGlsYXRpb25Vbml0PC9jb2RlPiBkb2Vzbid0Ci0JICogZ2V0IGVudGVyZWQgMiBvciBtb3JlIHRpbWVzIHNpbXVsdGFuZW91c2x5LiAgQSBzaWRlIGVmZmVjdCBvZiB0aGF0IGlzIDIgY29tcGlsYXRpb24gdW5pdHMKLQkgKiBjYW4gYmUgY3JlYXRlZCBpbiB0aGUgSmF2YU1vZGVsTWFuYWdlciwgYnV0IHdlIG9ubHkgaG9sZCBvbmUgcmVmZXJlbmNlIHRvIGl0IGluIAotCSAqIGZDb21waWxhdGlvblVuaXQuICBUaGlzIHdvdWxkIGxlYWQgdG8gYSBsZWFrIHNpbmNlIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBDVSBpcwotCSAqIGRpc2NhcmRlZCBpbiB0aGUgPGNvZGU+cmVsZWFzZSgpPC9jb2RlPiBtZXRob2QuCi0JICogCi0JICogQHJldHVybiBhIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJCQlmQ29tcGlsYXRpb25Vbml0ID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlpZihERUJVRykKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgY3JlYXRpbmcgSlNQIHdvcmtpbmcgY29weS4uLiAiLCBqbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb21waWxhdGlvblVuaXQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWFuZ2xlZE5hbWUoKSB7Ci0JCXJldHVybiBmTWFuZ2xlZE5hbWU7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRNYW5nbGVkTmFtZShTdHJpbmcgbWFuZ2xlZE5hbWUpIHsKLQkJZk1hbmdsZWROYW1lID0gbWFuZ2xlZE5hbWU7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldEpzcE5hbWUoKSB7Ci0JCXJldHVybiBmSnNwTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SnNwTmFtZShTdHJpbmcganNwTmFtZSkgewotCQlmSnNwTmFtZSA9IGpzcE5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgbWFuZ2xlZCAoc2VydmxldCkgbmFtZSB3aXRoIGpzcCBmaWxlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXlTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBmaXh1cE1hbmdsZWROYW1lKFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCQotCQlpZihkaXNwbGF5U3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmKGdldEpzcE5hbWUoKSA9PSBudWxsIHx8IGdldE1hbmdsZWROYW1lKCkgPT0gbnVsbCkgewotCQkJLy8gbmFtZXMgbm90IHNldCB5ZXQKLQkJCWluaXRKc3BBbmRTZXJ2bGV0TmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheVN0cmluZy5yZXBsYWNlQWxsKGdldE1hbmdsZWROYW1lKCksIGdldEpzcE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRKc3BBbmRTZXJ2bGV0TmFtZXMoKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYoY3UgIT0gbnVsbCkgewotCQkJU3RyaW5nIGN1TmFtZSA9IG51bGw7Ci0JCQlzeW5jaHJvbml6ZWQoY3UpIHsKLQkJCQkvLyBzZXQgc29tZSBuYW1lcyBmb3IgZml4aW5nIHVwIG1hbmdsZWQgbmFtZSBpbiBwcm9wb3NhbHMKLQkJCQkvLyBzZXQgbWFuZ2xlZCAoc2VydmxldCkgbmFtZQotCQkJCSBjdU5hbWUgPSBjdS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCX0KLQkJCWlmKGN1TmFtZSAhPSBudWxsKSB7Ci0JCQkJc2V0TWFuZ2xlZE5hbWUoY3VOYW1lLnN1YnN0cmluZygwLCBjdU5hbWUubGFzdEluZGV4T2YoJy4nKSkpOwotCQkJCS8vIHNldCBuYW1lIG9mIGpzcCBmaWxlCi0JCQkJU3RyaW5nIHVubWFuZ2xlZCA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwudW5tYW5nbGUoY3VOYW1lKTsKLQkJCQlzZXRKc3BOYW1lKHVubWFuZ2xlZC5zdWJzdHJpbmcodW5tYW5nbGVkLmxhc3RJbmRleE9mKCcvJykgKyAxLCB1bm1hbmdsZWQubGFzdEluZGV4T2YoJy4nKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogT3JpZ2luYWxseSBmcm9tIFJlY29uY2lsZVN0ZXBGb3JKYXZhLiAgQ3JlYXRlcyBhbiBJQ29tcGlsYXRpb25Vbml0IGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBKU1AgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBhbiBJQ29tcGlsYXRpb25Vbml0IGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBKU1AgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IG51bGw7Ci0JCUlKYXZhRWxlbWVudCBqZSA9IGdldEphdmFQcm9qZWN0KCk7Ci0KLQkJaWYgKGplID09IG51bGwgfHwgIWplLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc3dpdGNoIChqZS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKLQkJCQlqZSA9IGplLmdldFBhcmVudCgpOwotCQkJLy8gZmFsbCB0aHJvdWdoCi0KLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgamU7Ci0JCQkJcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCQlJSmF2YVByb2plY3QgalByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBqZTsKLQotCQkJCWlmICghalByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKiogQWJvcnQgY3JlYXRlIHdvcmtpbmcgY29weTogY2Fubm90IGNyZWF0ZSB3b3JraW5nIGNvcHk6IEpTUCBpcyBub3QgaW4gYSBKYXZhIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSBudWxsOwotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHBhY2thZ2VGcmFnbWVudFJvb3RzLmxlbmd0aCkgewotCQkJCQlpZiAoIXBhY2thZ2VGcmFnbWVudFJvb3RzW2ldLmlzQXJjaGl2ZSgpICYmICFwYWNrYWdlRnJhZ21lbnRSb290c1tpXS5pc0V4dGVybmFsKCkpIHsKLQkJCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCkgewotCQkJCQlpZihERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBBYm9ydCBjcmVhdGUgd29ya2luZyBjb3B5OiBjYW5ub3QgY3JlYXRlIHdvcmtpbmcgY29weTogSlNQIGlzIG5vdCBpbiBhIEphdmEgcHJvamVjdCB3aXRoIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50Um9vdC5ERUZBVUxUX1BBQ0tBR0VST09UX1BBVEgpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBhY2thZ2VGcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXQoZ2V0Q2xhc3NuYW1lKCkgKyAiLmphdmEiKS5nZXRXb3JraW5nQ29weShnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2JsZW1SZXF1ZXN0b3IoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCXNldENvbnRlbnRzKGN1KTsKLQotCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFRyYW5zbGF0aW9uIFsiKyB0aGlzICsgIl0gZmluaXNoZWQgY3JlYXRpbmcgQ29tcGlsYXRpb25Vbml0OiAiICsgY3UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBjdTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ibGVtIHJlcXVlc3RvciBmb3IgdGhlIENvbXBpbGF0aW9uVW5pdCBpbiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBKU1BQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0JICAgIHJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgSVdvcmtpbmdDb3B5T3duZXIgZm9yIHRoaXMgQ29tcGlsYXRpb25Vbml0IGluIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgV29ya2luZ0NvcHlPd25lciBnZXRXb3JraW5nQ29weU93bmVyKCkgewotCSAgICByZXR1cm4gQ29tcGlsYXRpb25Vbml0SGVscGVyLmdldEluc3RhbmNlKCkuZ2V0V29ya2luZ0NvcHlPd25lcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCBpbiBsb25nIG9wZXJhdGlvbnMgKHJlY29uY2lsZSwgY3JlYXRpbmcgdGhlIENvbXBpbGF0aW9uVW5pdC4uLikgaW4gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgTGlzdCBvZiBwcm9ibGVtcyBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2JsZW1zKCkgewotCQlMaXN0IHByb2JsZW1zID0gZ2V0UHJvYmxlbVJlcXVlc3RvcigpLmdldENvbGxlY3RlZFByb2JsZW1zKCk7Ci0JCXJldHVybiBwcm9ibGVtcyAhPSBudWxsID8gcHJvYmxlbXMgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIExpc3Qgb2YgcHJvYmxlbXMgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFTFByb2JsZW1zKCkgewotCQlyZXR1cm4gZkVMUHJvYmxlbXMgIT0gbnVsbCA/IGZFTFByb2JsZW1zIDogbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCi0JLyoqCi0JICogTXVzdCBiZSBzZXQgdHJ1ZSBpbiBvcmRlciBmb3IgcHJvYmxlbXMgdG8gYmUgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUuCi0JICogSWYgc2V0IGZhbHNlLCBwcm9ibGVtcyB3aWxsIGJlIGlnbm9yZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBAcGFyYW0gY29sbGVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKGJvb2xlYW4gY29sbGVjdCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmKGN1ICE9IG51bGwpIHsJCi0JCQlnZXRQcm9ibGVtUmVxdWVzdG9yKCkuc2V0SXNBY3RpdmUoY29sbGVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWNvbmNpbGVzIHRoZSBjb21waWxhdGlvbiB1bml0IGZvciB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXN5bmNocm9uaXplZChjdSkgewotCQkJCQljdS5tYWtlQ29uc2lzdGVudChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWN1LnJlY29uY2lsZShJQ29tcGlsYXRpb25Vbml0Lk5PX0FTVCwgdHJ1ZSwgZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBjb250ZW50cyBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCB0byB0aGUgdHJhbnNsYXRlZCBqc3AgdGV4dC4KLQkgKiBAcGFyYW0gdGhlIElDb21waWxhdGlvblVuaXQgb24gd2hpY2ggdG8gc2V0IHRoZSBidWZmZXIgY29udGVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q29udGVudHMoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXN5bmNocm9uaXplZCAoY3UpIHsKLQkJCUlCdWZmZXIgYnVmZmVyOwotCQkJdHJ5IHsKLQkJCQkKLQkJCQlidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJYnVmZmVyID0gbnVsbDsKLQkJCX0KLQkKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkKLQkJCQlidWZmZXIuc2V0Q29udGVudHMoZ2V0SmF2YVRleHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCByYW5nZSBpbiB0aGUgSlNQIFN0cnVjdHVyZWREb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBqc3BTdGFydCBzdGFyaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHBhcmFtIGpzcEVuZCBlbmRpbmcgb2Zmc2V0IGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIElKYXZhRWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgSlNQIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShpbnQganNwU3RhcnQsIGludCBqc3BFbmQpIHsKLQotCQlpbnQgamF2YVBvc2l0aW9uU3RhcnQgPSBnZXRKYXZhT2Zmc2V0KGpzcFN0YXJ0KTsKLQkJaW50IGphdmFQb3NpdGlvbkVuZCA9IGdldEphdmFPZmZzZXQoanNwRW5kKTsKLQotCQlJSmF2YUVsZW1lbnRbXSBFTVRQWV9SRVNVTFRfU0VUID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJSUphdmFFbGVtZW50W10gcmVzdWx0ID0gRU1UUFlfUkVTVUxUX1NFVDsKLQkJdHJ5IHsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCWlmIChjdSAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkIChjdSkgewotCQkJCQlpbnQgY3VEb2NMZW5ndGggPSBjdS5nZXRCdWZmZXIoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaW50IGphdmFMZW5ndGggPSBqYXZhUG9zaXRpb25FbmQgLSBqYXZhUG9zaXRpb25TdGFydDsKLQkJCQkJaWYgKGN1RG9jTGVuZ3RoID4gMCAmJiBqYXZhUG9zaXRpb25TdGFydCA+PSAwICYmIGphdmFMZW5ndGggPj0gMCAmJiBqYXZhUG9zaXRpb25FbmQgPCBjdURvY0xlbmd0aCkgewotCQkJCQkJcmVzdWx0ID0gY3UuY29kZVNlbGVjdChqYXZhUG9zaXRpb25TdGFydCwgamF2YUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiB4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc25hbWU7Ci0JfQotCi0JLyoqCi0JICogTXVzdCBkaXNjYXJkIGNvbXBpbGF0aW9uIHVuaXQsIG9yIGVsc2UgdGhleSBjYW4gbGVhayBpbiB0aGUgSmF2YU1vZGVsTWFuYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCQotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCWlmKGZDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKU1BUcmFuc2xhdGlvbiBbIiArIHRoaXMgKyJdIGRpc2NhcmRpbmcgQ29tcGlsYXRpb25Vbml0OiAiICsgZkNvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZDb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQotCQkJCX0gCi0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdlJ3JlIGRvbmUgdy8gaXQgYW55d2F5Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyYjUwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIGZvciBnZXR0aW5nIGEgSlNQVHJhbnNsYXRpb24gb2YgdGhlIGRvY3VtZW50LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25BZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGZKc3BEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkphdmFEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBmSlNQVHJhbnNsYXRpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmRG9jdW1lbnRJc0RpcnR5ID0gdHJ1ZTsKLQlwcml2YXRlIElET01Nb2RlbCBmWE1MTW9kZWw7Ci0JcHJpdmF0ZSBKU1BUcmFuc2xhdG9yIGZUcmFuc2xhdG9yID0gbnVsbDsKLQlwcml2YXRlIE51bGxQcm9ncmVzc01vbml0b3IgZlRyYW5zbGF0aW9uTW9uaXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb25BZGFwdGVyKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlzZXRYTUxNb2RlbCh4bWxNb2RlbCk7Ci0JCWluaXRpYWxpemVKYXZhUGx1Z2lucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHJlcXVpcmVkIEphdmEgUGx1Z2lucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXZhUGx1Z2lucygpIHsKLQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqIEF1dG9tYXRpY2FsbHkgc2V0IHRocm91Z2ggdGhlIHNldFhNTE1vZGVsKFhNTE1vZGVsKQotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvYykgewotCQlpZiAoZkpzcERvY3VtZW50ICE9IG51bGwpCi0JCQlmSnNwRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQlkb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJCWZKc3BEb2N1bWVudCA9IGRvYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBtYXJrIHRyYW5zbGF0aW9uIGZvciByZWJ1aWxkaW5nCi0JCWZEb2N1bWVudElzRGlydHkgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0KLQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKQotCQkJZkpzcERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJaWYgKGZUcmFuc2xhdGlvbk1vbml0b3IgIT0gbnVsbCkKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0KLQkJaWYgKGZKU1BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0KLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUFRyYW5zbGF0aW9uQWRhcHRlciByZWxlYXNpbmc6IiArIGZKU1BUcmFuc2xhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZkpTUFRyYW5zbGF0aW9uLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpTUFRyYW5zbGF0aW9uIGZvciB0aGlzIGFkYXB0ZXIuCi0JICogCi0JICogQHJldHVybiBhIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRKU1BUcmFuc2xhdGlvbigpIHsKLQotCQlpZiAoZkpTUFRyYW5zbGF0aW9uID09IG51bGwgfHwgZkRvY3VtZW50SXNEaXJ0eSkgewotCQkJSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbnVsbDsKLQkJCWlmIChnZXRYTUxNb2RlbCgpICE9IG51bGwgJiYgZ2V0WE1MTW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKDApICE9IG51bGwpIHsKLQkJCQl0cmFuc2xhdG9yID0gZ2V0VHJhbnNsYXRvcigoSURPTU5vZGUpIGdldFhNTE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbigwKSk7Ci0JCQkJdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKLQkJCQlTdHJpbmdCdWZmZXIgamF2YUNvbnRlbnRzID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpOwotCQkJCWZKYXZhRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoamF2YUNvbnRlbnRzLnRvU3RyaW5nKCkpOwotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBlbXB0eSBkb2N1bWVudCBjYXNlCi0JCQkJdHJhbnNsYXRvciA9IG5ldyBKU1BUcmFuc2xhdG9yKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGVtcHR5Q29udGVudHMgPSB0cmFuc2xhdG9yLmdldEVtcHR5VHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YURvY3VtZW50ID0gbmV3IERvY3VtZW50KGVtcHR5Q29udGVudHMudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQkvLyBpdCdzIGdvaW5nIHRvIGJlIHJlYnVpbHQsIHNvIHdlIHJlbGVhc2UgaXQgaGVyZQotCQkJaWYgKGZKU1BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUFRyYW5zbGF0aW9uQWRhcHRlciByZWxlYXNpbmc6IiArIGZKU1BUcmFuc2xhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmSlNQVHJhbnNsYXRpb24ucmVsZWFzZSgpOwotCQkJfQotCQkJZkpTUFRyYW5zbGF0aW9uID0gbmV3IEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKGdldFhNTE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGZKYXZhRG9jdW1lbnQsIGdldEphdmFQcm9qZWN0KCksIHRyYW5zbGF0b3IpOwotCQkJZkRvY3VtZW50SXNEaXJ0eSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBmSlNQVHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlNQVHJhbnNsYXRvciBmb3IgdGhpcyBhZGFwdGVyLiBJZiBpdCdzIG51bGwsIGEgbmV3Ci0JICogdHJhbnNsYXRvciBpcyBjcmVhdGVkIHdpdGggdGhlIHhtbE5vZGUuIE90aGVyd2lzZSB0aGUKLQkgKiB0cmFuc2xhdG9yLnJlc2V0KHhtbE5vZGUpIGlzIGNhbGxlZCB0byByZXNldCB0aGUgY3VycmVudCBsb2NhbAotCSAqIHRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIHhtbE5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlIG9mIHRoZSBKU1AgZG9jdW1lbnQgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEByZXR1cm4gdGhlIEpTUFRyYW5zbGF0b3IgZm9yIHRoaXMgYWRhcHRlciAoY3JlYXRlcyBpZiBudWxsKQotCSAqLwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKElET01Ob2RlIHhtbE5vZGUpIHsKLQkJaWYgKGZUcmFuc2xhdG9yID09IG51bGwpIHsKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJZlRyYW5zbGF0b3IgPSBuZXcgSlNQVHJhbnNsYXRvcigpOwotCQkJZlRyYW5zbGF0b3IucmVzZXQoeG1sTm9kZSwgZlRyYW5zbGF0aW9uTW9uaXRvcik7Ci0JCX0KLQkJZWxzZQotCQkJZlRyYW5zbGF0b3IucmVzZXQoeG1sTm9kZSwgZlRyYW5zbGF0aW9uTW9uaXRvcik7Ci0JCXJldHVybiBmVHJhbnNsYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIFhNTE1vZGVsIGZvciB0aGlzIGFkYXB0ZXIuIE11c3QgYmUgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSB4bWxNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlmWE1MTW9kZWwgPSB4bWxNb2RlbDsKLQkJc2V0RG9jdW1lbnQoZlhNTE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBYTUxNb2RlbCBmb3IgdGhpcyBhZGFwdGVyLgotCSAqLwotCXByaXZhdGUgSURPTU1vZGVsIGdldFhNTE1vZGVsKCkgewotCQlyZXR1cm4gZlhNTE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEdldHMgKG9yIGNyZWF0ZXMgdmlhIEphdmFDb3JlKSBhIEphdmFQcm9qZWN0IGJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZgotCSAqIHRoaXMgYWRhcHRlcidzIFhNTE1vZGVsLiBSZXR1cm5zIG51bGwgZm9yIG5vbiBJRmlsZSBiYXNlZCBtb2RlbHMuCi0JICogCi0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IHdoZXJlCi0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGdldFhNTE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkvLyAyMDA0MTEyOSAocGEpIHRoZSBiYXNlIGxvY2F0aW9uIGNoYW5nZWQgZm9yIFhNTCBtb2RlbAotCQkJLy8gYmVjYXVzZSBvZiBGaWxlQnVmZmVycywgc28gdGhpcyBjb2RlIGhhZCB0byBiZSB1cGRhdGVkCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk2ODYKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLS8vCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoYmFzZUxvY2F0aW9uKSk7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBwcm9qZWN0ID09IG51bGwgJiYgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQlpZiAoZmlsZXNbaV0uZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0vLwkJCQkJcHJvamVjdCA9IGZpbGVzW2ldLmdldFByb2plY3QoKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJfQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCWphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChnZXRYTUxNb2RlbCgpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgcHJvYmxlbSBnZXR0aW5nIGphdmEgcHJvamVjdCBmcm9tIHRoZSBYTUxNb2RlbCdzIGJhc2VMb2NhdGlvbiA+ICIgKyBnZXRYTUxNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCIoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBwcm9ibGVtIGdldHRpbmcgamF2YSBwcm9qZWN0IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0YjE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICogIAotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgZkFkYXB0ZXIgPSBudWxsOwotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcihJSlNQVHJhbnNsYXRpb24uY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXIgPSBuZXcgSlNQVHJhbnNsYXRpb25BZGFwdGVyKCgoSURPTU5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKSk7Ci0JCQlpZihERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gY3JlYXRlZCBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkFkYXB0ZXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIHJlbGVhc2luZyBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDExY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlVuZG9FZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBBZGRzIHRoZSBub3Rpb24gb2YgSURvY3VtZW50cyAoanNwIERvY3VtZW50IGFuZCBqYXZhIERvY3VtZW50KSBVc2VkIGZvcgotICogVGV4dEVkaXQgdHJhbnNsYXRpb24KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGV4dGVuZHMgSlNQVHJhbnNsYXRpb24gewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBqdXN0IGEgY29udmVuaWVuY2UgZGF0YSBzdHJ1Y3R1cmUKLQkvLyB0byBrZWVwIHRyYWNrIG9mIGphdmEgcG9zaXRpb24gZGVsdGFzCi0JcHJpdmF0ZSBjbGFzcyBQb3NpdGlvbkRlbHRhIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQgPSBmYWxzZTsKLQkJcHVibGljIGludCBwcmVPZmZzZXQgPSAwOwotCQlwdWJsaWMgaW50IHByZUxlbmd0aCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdE9mZnNldCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdExlbmd0aCA9IDA7Ci0KLQkJcHVibGljIFBvc2l0aW9uRGVsdGEoaW50IHByZU9mZnNldCwgaW50IHByZUxlbmd0aCkgewotCQkJdGhpcy5wcmVPZmZzZXQgPSBwcmVPZmZzZXQ7Ci0JCQl0aGlzLnByZUxlbmd0aCA9IHByZUxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBvc3RFZGl0RGF0YShpbnQgcG9zdE9mZnNldCwgaW50IHBvc3RMZW5ndGgsIGJvb2xlYW4gaXNEZWxldGVkKSB7Ci0JCQl0aGlzLnBvc3RPZmZzZXQgPSBwb3N0T2Zmc2V0OwotCQkJdGhpcy5wb3N0TGVuZ3RoID0gcG9zdExlbmd0aDsKLQkJCXRoaXMuaXNEZWxldGVkID0gaXNEZWxldGVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmSmF2YURvY3VtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbihJRG9jdW1lbnQganNwRG9jdW1lbnQsIElEb2N1bWVudCBqYXZhRG9jdW1lbnQsIElKYXZhUHJvamVjdCBqYXZhUHJvaiwgSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKGphdmFQcm9qLCB0cmFuc2xhdG9yKTsKLQkJZkpzcERvY3VtZW50ID0ganNwRG9jdW1lbnQ7Ci0JCWZKYXZhRG9jdW1lbnQgPSBqYXZhRG9jdW1lbnQ7Ci0KLQkJLy8gbWFrZSBzdXJlIHBvc2l0aW9ucyBhcmUgYWRkZWQgdG8gSmF2YSBhbmQgSlNQIGRvY3VtZW50cwotCQkvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGV4dCBlZGl0cwotCQlhZGRQb3NpdGlvbnNUb0RvY3VtZW50cygpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SnNwRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSnNwRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXRKYXZhRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSmF2YURvY3VtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBnZXRKYXZhRG9jdW1lbnQoKSAhPSBudWxsID8gZ2V0SmF2YURvY3VtZW50KCkuZ2V0KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb3JyZXNwb25kaW5nIFRleHRFZGl0IGZvciB0aGUgSlNQIGZpbGUgZ2l2ZW4gYSBUZXh0RWRpdCBmb3IKLQkgKiBhIEphdmEgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUVkaXQKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBlZGl0cyAobm90IGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50IHlldCkKLQkgKi8KLQlwdWJsaWMgVGV4dEVkaXQgZ2V0SnNwRWRpdChUZXh0RWRpdCBqYXZhRWRpdCkgewotCi0JCWlmIChqYXZhRWRpdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTGlzdCBqc3BFZGl0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpbnQgb2Zmc2V0ID0gamF2YUVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBqYXZhRWRpdC5nZXRMZW5ndGgoKTsKLQotCQlpZiAoamF2YUVkaXQgaW5zdGFuY2VvZiBNdWx0aVRleHRFZGl0ICYmIGphdmFFZGl0LmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCi0JCQlJUmVnaW9uIHIgPSBUZXh0RWRpdC5nZXRDb3ZlcmFnZShnZXRBbGxFZGl0cyhqYXZhRWRpdCkpOwotCQkJb2Zmc2V0ID0gci5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHIuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvLyBnZXQgamF2YSByYW5nZXMgdGhhdCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHRoZSBlZGl0Ci0JCVBvc2l0aW9uW10gamF2YVBvc2l0aW9ucyA9IGdldEphdmFSYW5nZXMob2Zmc2V0LCBsZW5ndGgpOwotCi0JCS8vIHJlY29yZCBwb3NpdGlvbiBkYXRhIGJlZm9yZSB0aGUgY2hhbmdlCi0JCVBvc2l0aW9uW10ganNwUG9zaXRpb25zID0gbmV3IFBvc2l0aW9uW2phdmFQb3NpdGlvbnMubGVuZ3RoXTsKLQkJUG9zaXRpb25EZWx0YVtdIGRlbHRhcyA9IG5ldyBQb3NpdGlvbkRlbHRhW2phdmFQb3NpdGlvbnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWx0YXNbaV0gPSBuZXcgUG9zaXRpb25EZWx0YShqYXZhUG9zaXRpb25zW2ldLm9mZnNldCwgamF2YVBvc2l0aW9uc1tpXS5sZW5ndGgpOwotCQkJLy8gaXNJbmRpcmVjdCBtZWFucyB0aGUgcG9zaXRpb24gZG9lc24ndCBhY3R1YWxseSBleGlzdCBhcyBleGFjdAotCQkJLy8gdGV4dAotCQkJLy8gbWFwcGluZyBmcm9tIGphdmEgPC0+IGpzcCAoZWcuIGFuIGltcG9ydCBzdGF0ZW1lbnQpCi0JCQlpZiAoIWlzSW5kaXJlY3QoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQpKQotCQkJCWpzcFBvc2l0aW9uc1tpXSA9IChQb3NpdGlvbikgZ2V0SmF2YTJKc3BNYXAoKS5nZXQoamF2YVBvc2l0aW9uc1tpXSk7Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVsdGFzOiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgamF2YVRleHQgPSBnZXRKYXZhVGV4dCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwb3NbIiArIGRlbHRhc1tpXS5wcmVPZmZzZXQgKyAiOiIgKyBkZWx0YXNbaV0ucHJlTGVuZ3RoICsgIl0iICsgamF2YVRleHQuc3Vic3RyaW5nKGRlbHRhc1tpXS5wcmVPZmZzZXQsIGRlbHRhc1tpXS5wcmVPZmZzZXQgKyBkZWx0YXNbaV0ucHJlTGVuZ3RoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlVbmRvRWRpdCB1bmRvID0gbnVsbDsKLQkJLy8gYXBwbHkgdGhlIGVkaXQgdG8gdGhlIGphdmEgZG9jdW1lbnQKLQkJdHJ5IHsKLQkJCXVuZG8gPSBqYXZhRWRpdC5hcHBseShnZXRKYXZhRG9jdW1lbnQoKSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQkvLyBub3cgYXQgdGhpcyBwb2ludCBKYXZhIHBvc2l0aW9ucyBhcmUgdW5yZWxpYWJsZSBzaW5jZSB0aGV5IHdlcmUKLQkJLy8gdXBkYXRlZCBhZnRlciBhcHBseWluZyBqYXZhIGVkaXQuCi0KLQkJU3RyaW5nIG5ld0phdmFUZXh0ID0gZ2V0SmF2YURvY3VtZW50KCkuZ2V0KCk7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiamF2YSBwb3N0IGZvcm1hdCB0ZXh0OlxuIiArIG5ld0phdmFUZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJlY29yZCBwb3N0IGVkaXQgZGF0YQotCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFQb3NpdGlvbnMubGVuZ3RoOyBpKyspCi0JCQlkZWx0YXNbaV0uc2V0UG9zdEVkaXREYXRhKGphdmFQb3NpdGlvbnNbaV0ub2Zmc2V0LCBqYXZhUG9zaXRpb25zW2ldLmxlbmd0aCwgamF2YVBvc2l0aW9uc1tpXS5pc0RlbGV0ZWQpOwotCi0JCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSB0ZXh0IGVkaXRzIGZvciBkZWx0YXMKLQkJUG9zaXRpb24ganNwUG9zID0gbnVsbDsKLQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCWpzcFBvcyA9IGpzcFBvc2l0aW9uc1tpXTsKLQkJCS8vIGNhbiBiZSBudWxsIGlmIGl0J3MgYW4gaW5kaXJlY3QgbWFwcGluZyBwb3NpdGlvbgotCQkJLy8gb3IgaWYgc29tZXRoaW5nIHdhcyBhZGRlZCBpbnRvIGphdmEgdGhhdCB3YXMgbm90IG9yaWdpbmFsbHkgaW4KLQkJCS8vIEpTUCAobGlrZSBhIG5ldyBpbXBvcnQuLi4pCi0KLQkJCWlmIChqc3BQb3MgIT0gbnVsbCkgewotCQkJCWlmIChkZWx0YXNbaV0uaXNEZWxldGVkKSB7Ci0JCQkJCWpzcEVkaXRzLmFkZChuZXcgRGVsZXRlRWRpdChqc3BQb3Mub2Zmc2V0LCBqc3BQb3MubGVuZ3RoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXBsYWNlVGV4dCA9IG5ld0phdmFUZXh0LnN1YnN0cmluZyhkZWx0YXNbaV0ucG9zdE9mZnNldCwgZGVsdGFzW2ldLnBvc3RPZmZzZXQgKyBkZWx0YXNbaV0ucG9zdExlbmd0aCk7Ci0KLQkJCQkJLy8gZ2V0IHJpZCBvZiBwcmUgYW5kIHBvc3Qgd2hpdGUgc3BhY2Ugb3IgZmluZSB0dW5lZAotCQkJCQkvLyBhZGp1c3RtZW50IGxhdGVyLgotCQkJCQkvLyBmaXggdGV4dCBoZXJlLi4uCi0JCQkJCXJlcGxhY2VUZXh0ID0gZml4SnNwUmVwbGFjZVRleHQocmVwbGFjZVRleHQsIGpzcFBvcy5vZmZzZXQpOwotCi0JCQkJCWpzcEVkaXRzLmFkZChuZXcgUmVwbGFjZUVkaXQoanNwUG9zLm9mZnNldCwganNwUG9zLmxlbmd0aCwgcmVwbGFjZVRleHQpKTsKLQkJCQl9Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1Z1JlcGxhY2UoZGVsdGFzLCBqc3BQb3MsIHJlcGxhY2VUZXh0LCBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoZSBuZXcgSmF2YSB0ZXh0IGhhcyBubyBjb3JyZXNwb25kaW5nIEpTUCBwb3NpdGlvbgotCQkJCS8vIHBvc3NpYmxlIG5ldyBpbXBvcnQ/Ci0JCQkJaWYgKGlzSW1wb3J0KGphdmFQb3NpdGlvbnNbaV0uZ2V0T2Zmc2V0KCkpICYmIHJlcGxhY2VUZXh0Lmxhc3RJbmRleE9mKCJpbXBvcnQgIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXBsYWNlVGV4dCA9IG5ld0phdmFUZXh0LnN1YnN0cmluZyhkZWx0YXNbaV0ucG9zdE9mZnNldCwgZGVsdGFzW2ldLnBvc3RPZmZzZXQgKyBkZWx0YXNbaV0ucG9zdExlbmd0aCk7Ci0JCQkJCVN0cmluZyBpbXBvcnRUZXh0ID0gcmVwbGFjZVRleHQuc3Vic3RyaW5nKHJlcGxhY2VUZXh0Lmxhc3RJbmRleE9mKCJpbXBvcnQgIiksIHJlcGxhY2VUZXh0LmluZGV4T2YoIjsiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkvLyBldmVudXRhbGx5IG5lZWQgdG8gY2hlY2sgaWYgaXQncyBYTUwtSlNQCi0JCQkJCWltcG9ydFRleHQgPSAiPCVAcGFnZSBpbXBvcnQ9XCIiICsgaW1wb3J0VGV4dCArICJcIiAlPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWpzcEVkaXRzLmFkZChuZXcgSW5zZXJ0RWRpdCgwLCBpbXBvcnRUZXh0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVRleHRFZGl0IGFsbEpzcEVkaXRzID0gY3JlYXRlTXVsdGlUZXh0RWRpdCgoVGV4dEVkaXRbXSkganNwRWRpdHMudG9BcnJheShuZXcgVGV4dEVkaXRbanNwRWRpdHMuc2l6ZSgpXSkpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU2MzIKLQkJLy8gdW5kbyB0aGUgamF2YSBlZGl0Ci0JCS8vIChzbyB0aGUgdW5kZXJseWluZyBKYXZhIGRvY3VtZW50IHN0aWxsIHJlcHJlc2VudHMgd2hhdCdzIGluIHRoZQotCQkvLyBlZGl0b3IpCi0JCWlmICh1bmRvICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdW5kby5hcHBseShnZXRKYXZhRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhbGxKc3BFZGl0czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhKc3BSZXBsYWNlVGV4dChTdHJpbmcgcmVwbGFjZVRleHQsIGludCBqc3BPZmZzZXQpIHsKLQotCQkvLyByZXN1bHQgaXMgdGhlIHRleHQgaW5iZXR3ZWVuIHRoZSBkZWxpbWl0ZXJzCi0JCS8vIGVnLgotCQkvLyAKLQkJLy8gPCUgcmVzdWx0Ci0JCS8vICU+Ci0JCVN0cmluZyByZXN1bHQgPSByZXBsYWNlVGV4dC50cmltKCk7Ci0JCVN0cmluZyBwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJRG9jdW1lbnQganNwRG9jID0gZ2V0SnNwRG9jdW1lbnQoKTsKLQkJaWYgKGpzcERvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSBqc3BEb2M7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gcmVnaW9ucyA9IHNEb2MuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygwLCBqc3BPZmZzZXQpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdOwotCi0JCQkvLyBvbmx5IHNwZWNpZmljYWxseSBtb2RpZnkgc2NyaXB0bGV0cwotCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCAmJiBsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnNbaV07Ci0KLQkJCQkJLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGNoZWNrIHdoaXRlc3BhY2U/Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgJiYgcmVnaW9uLmdldEZ1bGxUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcHJlRGVsaW1pdGVyV2hpdGVzcGFjZS5yZXBsYWNlQWxsKCJcciIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcHJlRGVsaW1pdGVyV2hpdGVzcGFjZS5yZXBsYWNlQWxsKCJcbiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIG5lZWQgdG8gZGV0ZXJtaW5lIGluZGVudCBmb3IgdGhhdCBmaXJzdCBsaW5lLi4uCi0JCQkJCQlTdHJpbmcgaW5pdGlhbEluZGVudCA9IGdldEluaXRpYWxJbmRlbnQocmVzdWx0KTsKLQotCQkJCQkJLy8gZml4IHRoZSBmaXJzdCBsaW5lIG9mIGphdmEgY29kZQotCQkJCQkJcmVzdWx0ID0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSArIGluaXRpYWxJbmRlbnQgKyByZXN1bHQ7Ci0KLQkJCQkJCXJlc3VsdCA9IGFkanVzdEluZGVudChyZXN1bHQsIHByZURlbGltaXRlcldoaXRlc3BhY2UsIFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoc0RvYykpOwotCi0JCQkJCQkvLyBhZGQgd2hpdGVzcGFjZSBiZWZvcmUgbGFzdCBkZWxpbWl0ZXIgdG8gbWF0Y2gKLQkJCQkJCS8vIGl0IHcvIHRoZSBvcGVuaW5nIGRlbGltaXRlcgotCQkJCQkJcmVzdWx0ID0gcmVzdWx0ICsgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSArIHByZURlbGltaXRlcldoaXRlc3BhY2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGFkanVzdEluZGVudChTdHJpbmcgdGV4dEJlZm9yZSwgU3RyaW5nIGluZGVudCwgU3RyaW5nIGRlbGltKSB7Ci0KLQkJLy8gZmlyc3QgcmVwbGFjZSBtdWx0aXBsZSBpbmRlbnQgd2l0aCBzaW5nbGUgaW5kZW50Ci0JCS8vIHRoZSB0cmlwbGUgaW5kZW50IG9jY3VycyBiZWNhdXNlIHRoZSBzY3JpcHRsZXQgY29kZQotCQkvLyBhY3R1YWxseSBvY2N1cnMgdW5kZXI6Ci0JCS8vIAotCQkvLyBjbGFzcwotCQkvLyBtZXRob2QKLQkJLy8gY29kZQotCQkvLyAKLQkJLy8gaW4gdGhlIHRyYW5zbGF0ZWQgamF2YSBkb2N1bWVudAotCi0JCXRleHRCZWZvcmUgPSB0ZXh0QmVmb3JlLnJlcGxhY2VBbGwoIlx0XHRcdCIsICJcdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBnZXQgaW5kZW50IGFmdGVyIDJuZCBsaW5lIGJyZWFrCi0JCVN0cmluZ0J1ZmZlciB0ZXh0QWZ0ZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIHdpbGwgdGhpcyB3b3JrIG9uIG1hYz8KLQkJdGV4dEJlZm9yZSA9IHRleHRCZWZvcmUucmVwbGFjZUFsbCgiXHIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHRCZWZvcmUsICJcbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2sgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2suZXF1YWxzKCJcbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0ZXh0QWZ0ZXIuYXBwZW5kKGRlbGltKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHByZXBlbmQgZWFjaCBsaW5lIHcvIHNwZWNpZmllZCBpbmRlbnQKLQkJCQl0ZXh0QWZ0ZXIuYXBwZW5kKGluZGVudCk7Ci0JCQkJdGV4dEFmdGVyLmFwcGVuZCh0b2spOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0QWZ0ZXIudG9TdHJpbmcoKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluaXRpYWxJbmRlbnQoU3RyaW5nIHJlc3VsdCkgewotCi0JCS8vIGdldCBpbmRlbnQgYWZ0ZXIgMm5kIGxpbmUgYnJlYWsKLQkJU3RyaW5nIGluZGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVzdWx0LCAiXHJcbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3QuY291bnRUb2tlbnMoKSA+IDEpIHsKLQkJCVN0cmluZyB0b2sgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCXRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWlmICh0b2sgIT0gbnVsbCkgewotCQkJCXdoaWxlICh0b2suY2hhckF0KGluZGV4KSA9PSAnICcgfHwgdG9rLmNoYXJBdChpbmRleCkgPT0gJ1x0JykgewotCQkJCQlpbmRlbnQgKz0gdG9rLmNoYXJBdChpbmRleCk7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnQ7Ci0JfQotCi0KLQkvKioKLQkgKiBDb21iaW5lcyBhbiBhcnJheSBvZiBlZGl0cyBpbnRvIG9uZSBNdWx0aVRleHRFZGl0ICh3aXRoIHRoZSBhcHByb3ByaWF0ZQotCSAqIGNvdmVyYWdlIHJlZ2lvbikKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZXh0RWRpdCBjcmVhdGVNdWx0aVRleHRFZGl0KFRleHRFZGl0W10gZWRpdHMpIHsKLQotCQlpZiAoZWRpdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQotCQlJUmVnaW9uIHJlZ2lvbiA9IFRleHRFZGl0LmdldENvdmVyYWdlKGVkaXRzKTsKLQkJTXVsdGlUZXh0RWRpdCBtdWx0aUVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdHMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZFRvTXVsdGlFZGl0KGVkaXRzW2ldLCBtdWx0aUVkaXQpOwotCQl9Ci0JCXJldHVybiBtdWx0aUVkaXQ7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkVG9NdWx0aUVkaXQoVGV4dEVkaXQgZWRpdCwgTXVsdGlUZXh0RWRpdCBtdWx0aUVkaXQpIHsKLQotCQkvLyBjaGVjayBmb3Igb3ZlcmxhcCBoZXJlCi0JCS8vIGRpc2NhcmQgb3ZlcmxhcHBpbmcgZWRpdHMuLgotCQkvLyBwb3NzaWJsZSBleHBvbmVudGlhbCBwZXJmb3JtYW5jZSBoaXQuLi4gbmVlZCBhIGJldHRlciB3YXkuLi4KLQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9IG11bHRpRWRpdC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0uY292ZXJzKGVkaXQpKQotCQkJCS8vIGRvbid0IGFkZAotCQkJCXJldHVybjsKLQkJfQotCQltdWx0aUVkaXQuYWRkQ2hpbGQoZWRpdCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUG9zaXRpb25zVG9Eb2N1bWVudHMoKSB7Ci0KLQkJLy8gY2FuIGJlIG51bGwgaWYgaXQncyBhIE51bGxKU1BUcmFuc2xhdGlvbgotCQlpZiAoZ2V0SmF2YURvY3VtZW50KCkgIT0gbnVsbCAmJiBnZXRKc3BEb2N1bWVudCgpICE9IG51bGwpIHsKLQotCQkJSGFzaE1hcCBqYXZhMmpzcCA9IGdldEphdmEySnNwTWFwKCk7Ci0JCQlJdGVyYXRvciBpdCA9IGphdmEyanNwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlQb3NpdGlvbiBqYXZhUG9zID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlqYXZhUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQotCQkJCQlmSmF2YURvY3VtZW50LmFkZFBvc2l0aW9uKGphdmFQb3MpOwotCi0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0eXJpbmcgdG8gYWRkIEphdmEgUG9zaXRpb246WyIgKyBqYXZhUG9zLm9mZnNldCArICI6IiArIGphdmFQb3MubGVuZ3RoICsgIl0gdG8gIiArIGdldEphdmFQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAkJCQkJCi0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN1YnN0cmluZyA6WyIgKwotCQkJCQkJLy8gZkphdmFEb2N1bWVudC5nZXQoKS5zdWJzdHJpbmcoamF2YVBvcy5vZmZzZXQpICsKLQkJCQkJCS8vICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyeSB7Ci0KLQkJCQkJZkpzcERvY3VtZW50LmFkZFBvc2l0aW9uKChQb3NpdGlvbikgamF2YTJqc3AuZ2V0KGphdmFQb3MpKTsKLQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHlyaW5nIHRvIGFkZCBKU1AgUG9zaXRpb246WyIgKyAoKFBvc2l0aW9uKSBqYXZhMmpzcC5nZXQoamF2YVBvcykpLm9mZnNldCArICI6IiArICgoUG9zaXRpb24pIGphdmEyanNwLmdldChqYXZhUG9zKSkubGVuZ3RoICsgIl0gdG8gIiArIGdldEphdmFQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGdldHMgYWxsIGNoaWxkIGVkaXRzCi0JICogCi0JICogQHBhcmFtIGphdmFFZGl0Ci0JICogQHJldHVybiBhbGwgY2hpbGQgZWRpdHMKLQkgKi8KLQlwcml2YXRlIFRleHRFZGl0W10gZ2V0QWxsRWRpdHMoVGV4dEVkaXQgamF2YUVkaXQpIHsKLQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGphdmFFZGl0IGluc3RhbmNlb2YgTXVsdGlUZXh0RWRpdCkgewotCQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9IGphdmFFZGl0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRBbGxFZGl0cyhjaGlsZHJlbltpXSkpKTsKLQkJfQotCQllbHNlCi0JCQlyZXN1bHQuYWRkKGphdmFFZGl0KTsKLQkJcmV0dXJuIChUZXh0RWRpdFtdKSByZXN1bHQudG9BcnJheShuZXcgVGV4dEVkaXRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWx0YXMKLQkgKiBAcGFyYW0ganNwUG9zCi0JICogQHBhcmFtIHJlcGxhY2VUZXh0Ci0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAcGFyYW0gaQotCSAqLwotCXByaXZhdGUgdm9pZCBkZWJ1Z1JlcGxhY2UoUG9zaXRpb25EZWx0YVtdIGRlbHRhcywgUG9zaXRpb24ganNwUG9zLCBTdHJpbmcgcmVwbGFjZVRleHQsIGludCBpKSB7Ci0JCVN0cmluZyBqc3BDaHVuazsKLQkJanNwQ2h1bmsgPSBnZXRKc3BEb2N1bWVudCgpLmdldCgpLnN1YnN0cmluZyhqc3BQb3Mub2Zmc2V0LCBqc3BQb3Mub2Zmc2V0ICsganNwUG9zLmxlbmd0aCk7Ci0JCWlmICghZGVsdGFzW2ldLmlzRGVsZXRlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXBsYWNpbmc6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigianNwOlsiICsganNwQ2h1bmsgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidy8gOlsiICsgcmVwbGFjZVRleHQgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjY0YzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkNvcHlTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuQ29weVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1vdmVTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTW92ZVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvblV0aWwgewotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZlRyYW5zbGF0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvblV0aWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCB0cmFuc2xhdGVUZXh0RWRpdChUZXh0RWRpdCB0ZXh0RWRpdCkgewotCQlUZXh0RWRpdCB0cmFuc2xhdGVkVGV4dEVkaXQgPSBudWxsOwotCi0JCWludCBqYXZhT2Zmc2V0ID0gdGV4dEVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBqc3BPZmZzZXQgPSBnZXRUcmFuc2xhdGlvbigpLmdldEpzcE9mZnNldCh0ZXh0RWRpdC5nZXRPZmZzZXQoKSk7Ci0JCWludCBsZW5ndGggPSB0ZXh0RWRpdC5nZXRMZW5ndGgoKTsKLQotCQlpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNdWx0aVRleHRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9ICgoTXVsdGlUZXh0RWRpdCkgdGV4dEVkaXQpLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dEVkaXQgdHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgPSB0cmFuc2xhdGVUZXh0RWRpdChjaGlsZHJlbltpXSk7Ci0JCQkJaWYgKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0ICE9IG51bGwpCi0JCQkJCSgoTXVsdGlUZXh0RWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5hZGRDaGlsZCh0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBSZXBsYWNlRWRpdCkgewotCQkJaWYgKGpzcE9mZnNldCA9PSAtMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaWYgKCFnZXRUcmFuc2xhdGlvbigpLmphdmFTcGFuc011bHRpcGxlSnNwUGFydGl0aW9ucyhqYXZhT2Zmc2V0LCBsZW5ndGgpKQotCQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBSZXBsYWNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCwgKChSZXBsYWNlRWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgSW5zZXJ0RWRpdChqc3BPZmZzZXQsICgoSW5zZXJ0RWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBEZWxldGVFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgRGVsZXRlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQlUZXh0RWRpdFtdIGNoaWxkcmVuID0gKChEZWxldGVFZGl0KSB0ZXh0RWRpdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlUZXh0RWRpdCB0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCA9IHRyYW5zbGF0ZVRleHRFZGl0KGNoaWxkcmVuW2ldKTsKLQkJCQlpZiAodHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgIT0gbnVsbCkKLQkJCQkJKChEZWxldGVFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLmFkZENoaWxkKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIENvcHlTb3VyY2VFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgQ29weVNvdXJjZUVkaXQoanNwT2Zmc2V0LCBsZW5ndGgpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRUYXJnZXRFZGl0KCgoQ29weVNvdXJjZUVkaXQpIHRleHRFZGl0KS5nZXRUYXJnZXRFZGl0KCkpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRTb3VyY2VNb2RpZmllcigoKENvcHlTb3VyY2VFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlTW9kaWZpZXIoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBDb3B5VGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IENvcHlUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKENvcHlUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKENvcHlUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgTW92ZVNvdXJjZUVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBNb3ZlU291cmNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQkoKE1vdmVTb3VyY2VFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLnNldFRhcmdldEVkaXQoKChNb3ZlU291cmNlRWRpdCkgdGV4dEVkaXQpLmdldFRhcmdldEVkaXQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNb3ZlVGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IE1vdmVUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKE1vdmVUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKE1vdmVUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOZWVkIHRvIHRyYW5zbGF0ZSAiICsgdGV4dEVkaXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdHJhbnNsYXRlZFRleHRFZGl0OwotCX0KLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJaWYgKGZUcmFuc2xhdGlvbiA9PSBudWxsKSB7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmICh0cmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0aW9uKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZTI3MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWIuVGFnbGliSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWIuVGFnbGliSGVscGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliLlRhZ2xpYlZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5JSlNQRUxUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudFRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBUcmFuc2xhdGVzIGEgSlNQIGRvY3VtZW50IGludG8gYSBIdHRwU2VydmxldC4gS2VlcHMgdHdvIHdheSBtYXBwaW5nIGZyb20KLSAqIGphdmEgdHJhbnNsYXRpb24gdG8gdGhlIG9yaWdpbmFsIEpTUCBzb3VyY2UsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCB0aHJvdWdoCi0gKiBnZXRKYXZhMkpzcFJhbmdlcygpIGFuZCBnZXRKc3AySmF2YVJhbmdlcygpLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRvciB7Ci0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1RSQU5TTEFUT1JfRVhURU5TSU9OX05BTUUgPSAiZWxUcmFuc2xhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMVFJBTlNMQVRPUl9QUk9QX05BTUUgPSAiRUxUcmFuc2xhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRGVmYXVsdCBFTCBUcmFuc2xhdG9yCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSlNQX0VMX1RSQU5TTEFUT1JfSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5kZWZhdWx0SlNQMjAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBoYW5keSBwbHVnaW4gSUQgY29uc3RhbnQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPUkVfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCi0JcHJpdmF0ZSBJSlNQRUxUcmFuc2xhdG9yIGZFTFRyYW5zbGF0b3IgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BqYXZhbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyBfSlNQU2VydmxldCBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NuYW1lID0gIl9KU1BTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZkltcGxpY2l0SW1wb3J0cyA9ICJpbXBvcnQgamF2YXguc2VydmxldC4qOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCSJpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOyIgKyBFTkRMICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZlNlcnZpY2VIZWFkZXIgPSAicHVibGljIHZvaWQgX2pzcFNlcnZpY2UoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCIgKyAvLyROT04tTkxTLTEkCi0JCQkJIiBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkiXHRcdHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24geyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dCBwYWdlQ29udGV4dCA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbiA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyBjb25maWcgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkiamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyIG91dCA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJIk9iamVjdCBwYWdlID0gbnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZkZvb3RlciA9ICJ9fSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmRXhjZXB0aW9uID0gIlRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1BSRUZJWCA9ICJvdXQucHJpbnQoXCJcIisiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9TVUZGSVggPSAiKTsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZlN1cGVyY2xhc3MgPSAiamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZlRyeUNhdGNoU3RhcnQgPSBFTkRMICsgInRyeSB7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmVHJ5Q2F0Y2hFbmQgPSAiIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkge30gIiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBmU291cmNlUG9zaXRpb24gPSBwb3NpdGlvbiBpbiBKU1Agc291cmNlICovCi0JcHJpdmF0ZSBpbnQgZlNvdXJjZVBvc2l0aW9uID0gLTE7Ci0JLyoqIGZSZWxhdGl2ZU9mZmVzdCA9IG9mZnNldCBpbiB0aGUgYnVmZmVyIHRoZXJlIHRoZSBjdXJzb3IgaXMgKi8KLQlwcml2YXRlIGludCBmUmVsYXRpdmVPZmZzZXQgPSAtMTsKLQkvKiogZkN1cnNvclBvc2l0aW9uID0gb2Zmc2V0IGluIHRoZSB0cmFuc2xhdGVkIGphdmEgZG9jdW1lbnQgKi8KLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQkvKiogc29tZSBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Vycm9yUGFnZSwgZkN1cnNvckluRXhwcmVzc2lvbiA9IGZhbHNlOwotCi0JLyoqIHVzZXIgamF2YSBjb2RlIGluIGJvZHkgb2YgdGhlIHNlcnZpY2UgbWV0aG9kICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJDb2RlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8qKiB1c2VyIEVMIEV4cHJlc3Npb24gKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmVXNlckVMRXhwcmVzc2lvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLyoqIHVzZXIgZGVmaW5lZCB2YXJzIGRlY2xhcmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsYXNzICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJEZWNsYXJhdGlvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkvKiogdXNlciBkZWZpbmVkIGltcG9ydHMgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmVXNlckltcG9ydHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmUmVzdWx0OyAvLyB0aGUgZmluYWwgdHJhc2xhdGVkIGphdmEgZG9jdW1lbnQKLQkvLyBzdHJpbmcgYnVmZmVyCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkN1cnNvck93bmVyID0gbnVsbDsgLy8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgY3Vyc29yCi0JLy8gaXMKLQotCXByaXZhdGUgSURPTU1vZGVsIGZTdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5Db2RlUmVnaW9uID0gZmFsc2U7IC8vIGZsYWcgZm9yIGlmIGN1cnNvciBpcyBpbiB0aGUKLQkvLyBjdXJyZW50IHJlZ2lvbiBiZWluZyB0cmFuc2xhdGVkCi0KLQkvKioKLQkgKiB0aGVzZSBjb25zdGFudHMgYXJlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgY29kZSBpbiBxdWVzdGlvbiBpcwotCSAqIGVtYmVkZGVkIChKU1AgYXMgYW4gYXR0cmlidXRlIG9yIHdpdGhpbiBjb21tZW50IHRhZ3MpIG9yIGlzIGp1c3QKLQkgKiBzdGFuZGFyZCBKU1AgY29kZSwgb3IgaWRlbnRpZmllcyBpZiBpdCdzIGFuIGV4cHJlc3Npb24KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTVEFOREFSRF9KU1AgPSAwOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEVNQkVEREVEX0pTUCA9IDE7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgREVDTEFSQVRJT04gPSAyOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEVYUFJFU1NJT04gPSA0OwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNDUklQVExFVCA9IDg7Ci0KLQkvKiogdXNlZCB0byBhdm9pZCBpbmZpbml0ZSBsb29waW5nIGluY2x1ZGUgZmlsZXMgKi8KLQlwcml2YXRlIFN0YWNrIGZJbmNsdWRlcyA9IG51bGw7Ci0JLyoqIG1vc3RseSBmb3IgaGVscGVyIGNsYXNzZXMsIHNvIHRoZXkgcGFyc2UgY29ycmVjdGx5ICovCi0JcHJpdmF0ZSBBcnJheUxpc3QgZkJsb2NrTWFya2VycyA9IG51bGw7Ci0JLyoqCi0JICogZm9yIGtlZXBpbmcgdHJhY2sgb2Ygb2Zmc2V0IGluIHVzZXIgYnVmZmVycyB3aGlsZSBkb2N1bWVudCBpcyBiZWluZwotCSAqIGJ1aWx0Ci0JICovCi0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckltcG9ydHMgPSAwOwotCXByaXZhdGUgaW50IGZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgPSAwOwotCXByaXZhdGUgaW50IGZPZmZzZXRJblVzZXJDb2RlID0gMDsKLQotCS8qKiBjb3JyZWxhdGVzIHJhbmdlcyAocG9zaXRpb25zKSBpbiBqYXZhIHRvIHJhbmdlcyBpbiBqc3AgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIG1hcCBvZiByYW5nZXMgaW4gZlVzZXJJbXBvcnRzIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcikgdG8KLQkgKiByYW5nZXMgaW4gc291cmNlIEpTUCBidWZmZXIuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbXBvcnRSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCS8qKgotCSAqIG1hcCBvZiByYW5nZXMgaW4gZlVzZXJDb2RlIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcikgdG8KLQkgKiByYW5nZXMgaW4gc291cmNlIEpTUCBidWZmZXIuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZDb2RlUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkvKioKLQkgKiBtYXAgb2YgcmFuZ2VzIGluIGZVc2VyRGVjbGFyYXRpb25zIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0JICogYnVmZmVyKSB0byByYW5nZXMgaW4gc291cmNlIEpTUCBidWZmZXIuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZEZWNsYXJhdGlvblJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZlVzZUJlYW5SYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIGZVc2VyRUxSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogcmFuZ2VzIHRoYXQgZG9uJ3QgZGlyZWN0bHkgbWFwIGZyb20gamF2YSBjb2RlIHRvIEpTUCBjb2RlIChlZy4KLQkgKiA8JUBpbmNsdWRlIGZpbGU9ImluY2x1ZGVkLmpzcCIlPgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmSW5kaXJlY3RSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCi0JLyoqCi0JICogc2F2ZSBKU1AgZG9jdW1lbnQgdGV4dCBmb3IgbGF0ZXIgdXNlIG1heSBqdXN0IHdhbnQgdG8gcmVhZCB0aGlzIGZyb20KLQkgKiB0aGUgZmlsZSBvciBzdHJ1Y2R0dXJlZCBkb2N1bWVudCBkZXBlbmRpbmcgd2hhdCBpcyBhdmFpbGFibGUKLQkgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmSnNwVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCi0JLyoqCi0JICogTGlzdCBvZiBFTCBwcm9ibGVtcyB0byBiZSB0cmFuc2xhdGVkCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3QgZkVMUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBFTCBUcmFuc2xhdG9yIElECi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkVMVHJhbnNsYXRvcklEOwotCi0JLyoqCi0JICogY29uZmlndXJlIHVzaW5nIGFuIFhNTE5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRE9NTm9kZSBub2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQkJZlN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0KLQkJZkVMVHJhbnNsYXRvcklEID0gZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoYmFzZUxvY2F0aW9uKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY3JlYXRlQ2xhc3NuYW1lKG5vZGUpOwotCQlpZiAoY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJc2V0Q2xhc3NuYW1lKGNsYXNzTmFtZSk7Ci0JCQlmQ2xhc3NIZWFkZXIgPSAicHVibGljIGNsYXNzICIgKyBjbGFzc05hbWUgKyAiIGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtZW1vcnkgc2F2aW5nIGNvbmZpZ3VyZSAobm8gU3RydWN0dXJlZERvY3VtZW50IGluIG1lbW9yeSkgY3VycmVudGx5Ci0JICogZG9lc24ndCBoYW5kbGUgaW5jbHVkZWQgZmlsZXMKLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmlsZSBqc3BGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gd2hlbiBjb25maWd1cmVkIG9uIGEgZmlsZQotCQkvLyBmU3RydWN0dXJlZE1vZGVsLCBmUG9zaXRpb25Ob2RlLCBmTW9kZWxRdWVyeSwgZlN0cnVjdHVyZWREb2N1bWVudAotCQkvLyBhcmUgYWxsIG51bGwKLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0KLQkJZkVMVHJhbnNsYXRvcklEID0gZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoanNwRmlsZSk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShqc3BGaWxlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBqc3AgdGV4dCBmcm9tIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SnNwVGV4dChJRmlsZSBqc3BGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oanNwRmlsZS5nZXRDb250ZW50cygpKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJZkpzcFRleHRCdWZmZXIuYXBwZW5kKGxpbmUpOwotCQkJCWZKc3BUZXh0QnVmZmVyLmFwcGVuZChFTkRMKTsKLQkJCX0KLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhIHdvcmtzcGFjZSByZWxhdGl2ZQotCSAqIHBhdGggc3RyaW5nCi0JICogCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbgotCSAqICAgICAgICAgICAgV29ya3NwYWNlLXJlbGF0aXZlIHN0cmluZyBwYXRoCi0JICogQHJldHVybiBWYWx1ZSBvZiB0aGUgRUxUcmFuc2xhdG9yIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFTFRyYW5zbGF0b3JQcm9wZXJ0eShTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKG5ldyBQYXRoKGJhc2VMb2NhdGlvbikpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQllbFRyYW5zbGF0b3JWYWx1ZSA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGZpbGUpOwotCQl9Ci0JCXJldHVybiBlbFRyYW5zbGF0b3JWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhbiBJRmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBJRmlsZQotCSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIEVMVHJhbnNsYXRvciBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUoSlNQX0NPUkVfUExVR0lOX0lELCBFTFRSQU5TTEFUT1JfUFJPUF9OQU1FKSk7Ci0JCQkJCWlmIChudWxsID09IGVsVHJhbnNsYXRvclZhbHVlKSB7Ci0KLQkJCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKEpTUF9DT1JFX1BMVUdJTl9JRCwgRUxUUkFOU0xBVE9SX1BST1BfTkFNRSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSVNTVUU6IHdoeSBkbyB3ZSBsb2cgdGhpcyBoZXJlPyBJbnN0ZWFkIG9mIGFsbG93aW5nIHRvIHRocm93dXA/Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsVHJhbnNsYXRvclZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUNsYXNzbmFtZShJRE9NTm9kZSBub2RlKSB7Ci0KLQkJU3RyaW5nIGNsYXNzbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyBiYXNlID0gbm9kZS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQkJY2xhc3NuYW1lID0gSlNQMlNlcnZsZXROYW1lVXRpbC5tYW5nbGUoYmFzZSk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVDbGFzc25hbWUoSUZpbGUganNwRmlsZSkgewotCi0JCVN0cmluZyBjbGFzc25hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoanNwRmlsZSAhPSBudWxsKSB7Ci0JCQljbGFzc25hbWUgPSBKU1AyU2VydmxldE5hbWVVdGlsLm1hbmdsZShqc3BGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgewotCQl0aGlzLmZDbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZDbGFzc25hbWUgIT0gbnVsbCA/IHRoaXMuZkNsYXNzbmFtZSA6ICJHZW5lcmljSnNwU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTbyB0aGF0IHRoZSBKU1BUcmFuc2xhdG9yIGNhbiBiZSByZXVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoSURPTU5vZGUgbm9kZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCi0JCS8vIGluaXRpYWxpemUgc29tZSB0aGluZ3Mgb24gbm9kZQotCQljb25maWd1cmUobm9kZSwgcHJvZ3Jlc3MpOwotCQlyZXNldCgpOwotCQkvLyBzZXQgdGhlIGpzcCB0ZXh0IGJ1ZmZlcgotCQlmSnNwVGV4dEJ1ZmZlci5hcHBlbmQoZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc2VydmF0aXZlIHZlcnNpb24gKG5vIFN0cnVjdHVyZWREb2N1bWVudC9Nb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBwcm9ncmVzcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElGaWxlIGpzcEZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKLQotCQkvLyBpbml0aWFsaXplIHNvbWUgdGhpbmdzIG9uIG5vZGUKLQkJY29uZmlndXJlKGpzcEZpbGUsIHByb2dyZXNzKTsKLQkJcmVzZXQoKTsKLQkJLy8gc2V0IHRoZSBqc3AgdGV4dCBidWZmZXIKLQkJc2V0SnNwVGV4dChqc3BGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWluaXRpYWxpemUgc29tZSBmaWVsZHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0KLQkJLy8gcmVzZXQgcHJvZ3Jlc3MgbW9uaXRvcgotCQlpZiAoZlByb2dyZXNzTW9uaXRvciAhPSBudWxsKQotCQkJZlByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZChmYWxzZSk7Ci0KLQkJLy8gcmVpbml0IGZpZWxkcwotCQlmU291cmNlUG9zaXRpb24gPSAtMTsKLQkJZlJlbGF0aXZlT2Zmc2V0ID0gLTE7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IC0xOwotCi0JCWZJc0Vycm9yUGFnZSA9IGZDdXJzb3JJbkV4cHJlc3Npb24gPSBmYWxzZTsKLQotCQlmVXNlckNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZVc2VyRGVjbGFyYXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmVXNlckltcG9ydHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZVc2VyRUxFeHByZXNzaW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmUmVzdWx0ID0gbnVsbDsKLQkJZkN1cnNvck93bmVyID0gbnVsbDsgLy8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgY3Vyc29yIGlzCi0KLQkJZkN1cnJlbnROb2RlID0gbnVsbDsKLQkJZkluQ29kZVJlZ2lvbiA9IGZhbHNlOyAvLyBmbGFnIGZvciBpZiBjdXJzb3IgaXMgaW4gdGhlIGN1cnJlbnQgcmVnaW9uCi0JCS8vIGJlaW5nIHRyYW5zbGF0ZWQKLQotCQlpZiAoZkluY2x1ZGVzICE9IG51bGwpCi0JCQlmSW5jbHVkZXMuY2xlYXIoKTsKLQotCQlmQmxvY2tNYXJrZXJzID0gbnVsbDsKLQotCQlmT2Zmc2V0SW5Vc2VySW1wb3J0cyA9IDA7Ci0JCWZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgPSAwOwotCQlmT2Zmc2V0SW5Vc2VyQ29kZSA9IDA7Ci0KLQkJZkphdmEySnNwUmFuZ2VzLmNsZWFyKCk7Ci0JCWZJbXBvcnRSYW5nZXMuY2xlYXIoKTsKLQkJZkNvZGVSYW5nZXMuY2xlYXIoKTsKLQkJZlVzZUJlYW5SYW5nZXMuY2xlYXIoKTsKLQkJZkRlY2xhcmF0aW9uUmFuZ2VzLmNsZWFyKCk7Ci0JCWZVc2VyRUxSYW5nZXMuY2xlYXIoKTsKLQkJZkluZGlyZWN0UmFuZ2VzLmNsZWFyKCk7Ci0KLQkJZkpzcFRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZkVMUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGp1c3QgdGhlICJzaGVsbCIgb2YgYSBzZXJ2bGV0LCBub3RoaW5nIGNvbnRyaWJ1dGVkIGZyb20gdGhlIEpTUAotCSAqICAgICAgICAgZG9jCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBnZXRFbXB0eVRyYW5zbGF0aW9uKCkgewotCQlyZXNldCgpOwotCQlidWlsZFJlc3VsdCgpOwotCQlyZXR1cm4gZ2V0VHJhbnNsYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBwdXQgdGhlIGZpbmFsIGphdmEgZG9jdW1lbnQgdG9nZXRoZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYnVpbGRSZXN1bHQoKSB7Ci0JCS8vIHRvIGJ1aWxkIHRoZSBqYXZhIGRvY3VtZW50IHRoaXMgaXMgdGhlIG9yZGVyOgotCQkvLyAKLQkJLy8gKyBkZWZhdWx0IGltcG9ydHMKLQkJLy8gKyB1c2VyIGltcG9ydHMKLQkJLy8gKyBjbGFzcyBoZWFkZXIKLQkJLy8gWysgZXJyb3IgcGFnZV0KLQkJLy8gKyB1c2VyIGRlY2xhcmF0aW9ucwotCQkvLyArIHNlcnZpY2UgbWV0aG9kIGhlYWRlcgotCQkvLyArIHRyeS9jYXRjaCBzdGFydAotCQkvLyArIHVzZXIgY29kZQotCQkvLyArIHRyeS9jYXRjaCBlbmQKLQkJLy8gKyBzZXJ2aWNlIG1ldGhvZCBmb290ZXIKLQkJZlJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZkltcGxpY2l0SW1wb3J0cy5sZW5ndGgoKSArIGZVc2VySW1wb3J0cy5sZW5ndGgoKSArIGZDbGFzc0hlYWRlci5sZW5ndGgoKSArIGZVc2VyRGVjbGFyYXRpb25zLmxlbmd0aCgpICsgZlNlcnZpY2VIZWFkZXIubGVuZ3RoKCkgKyBmVHJ5Q2F0Y2hTdGFydC5sZW5ndGgoKSAvLyB0cnkvY2F0Y2gKLQkJCQkJLy8gc3RhcnQKLQkJCQkJKyBmVXNlckNvZGUubGVuZ3RoKCkgKyBmVHJ5Q2F0Y2hFbmQubGVuZ3RoKCkgLy8gdHJ5L2NhdGNoCi0JCQkJCS8vIGVuZAotCQkJCQkrIGZGb290ZXIubGVuZ3RoKCkpOwotCi0JCWludCBqYXZhT2Zmc2V0ID0gMDsKLQotCQlmUmVzdWx0LmFwcGVuZChmSW1wbGljaXRJbXBvcnRzKTsKLQkJamF2YU9mZnNldCArPSBmSW1wbGljaXRJbXBvcnRzLmxlbmd0aCgpOwotCi0JCS8vIHVwZGF0ZVJhbmdlcyhmSW5kaXJlY3RJbXBvcnRzLCBqYXZhT2Zmc2V0KTsKLQkJdXBkYXRlUmFuZ2VzKGZJbXBvcnRSYW5nZXMsIGphdmFPZmZzZXQpOwotCQkvLyB1c2VyIGltcG9ydHMKLQkJYXBwZW5kKGZVc2VySW1wb3J0cyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJJbXBvcnRzLmxlbmd0aCgpOwotCi0JCS8vIGNsYXNzIGhlYWRlcgotCQlmUmVzdWx0LmFwcGVuZChmQ2xhc3NIZWFkZXIpOyAvLyROT04tTkxTLTEkCi0JCWphdmFPZmZzZXQgKz0gZkNsYXNzSGVhZGVyLmxlbmd0aCgpOwotCQlmUmVzdWx0LmFwcGVuZChmU3VwZXJjbGFzcyArICJ7IiArIEVOREwpOyAvLyROT04tTkxTLTEkCi0JCWphdmFPZmZzZXQgKz0gZlN1cGVyY2xhc3MubGVuZ3RoKCkgKyAyOwotCi0JCXVwZGF0ZVJhbmdlcyhmRGVjbGFyYXRpb25SYW5nZXMsIGphdmFPZmZzZXQpOwotCQkvLyB1c2VyIGRlY2xhcmF0aW9ucwotCQlhcHBlbmQoZlVzZXJEZWNsYXJhdGlvbnMpOwotCQlqYXZhT2Zmc2V0ICs9IGZVc2VyRGVjbGFyYXRpb25zLmxlbmd0aCgpOwotCi0JCXVwZGF0ZVJhbmdlcyhmVXNlckVMUmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJYXBwZW5kKGZVc2VyRUxFeHByZXNzaW9ucyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJFTEV4cHJlc3Npb25zLmxlbmd0aCgpOwotCi0JCWZSZXN1bHQuYXBwZW5kKGZTZXJ2aWNlSGVhZGVyKTsKLQkJamF2YU9mZnNldCArPSBmU2VydmljZUhlYWRlci5sZW5ndGgoKTsKLQkJLy8gZXJyb3IgcGFnZQotCQlpZiAoZklzRXJyb3JQYWdlKSB7Ci0JCQlmUmVzdWx0LmFwcGVuZChmRXhjZXB0aW9uKTsKLQkJCWphdmFPZmZzZXQgKz0gZkV4Y2VwdGlvbi5sZW5ndGgoKTsKLQkJfQotCi0KLQkJZlJlc3VsdC5hcHBlbmQoZlRyeUNhdGNoU3RhcnQpOwotCQlqYXZhT2Zmc2V0ICs9IGZUcnlDYXRjaFN0YXJ0Lmxlbmd0aCgpOwotCi0JCXVwZGF0ZVJhbmdlcyhmQ29kZVJhbmdlcywgamF2YU9mZnNldCk7Ci0KLQkJLy8gdXNlciBjb2RlCi0JCWFwcGVuZChmVXNlckNvZGUpOwotCQlqYXZhT2Zmc2V0ICs9IGZVc2VyQ29kZS5sZW5ndGgoKTsKLQotCi0JCWZSZXN1bHQuYXBwZW5kKGZUcnlDYXRjaEVuZCk7Ci0JCWphdmFPZmZzZXQgKz0gZlRyeUNhdGNoRW5kLmxlbmd0aCgpOwotCi0JCS8vIGZvb3RlcgotCQlmUmVzdWx0LmFwcGVuZChmRm9vdGVyKTsKLQkJamF2YU9mZnNldCArPSBmRm9vdGVyLmxlbmd0aCgpOwotCi0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZkltcG9ydFJhbmdlcyk7Ci0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZkRlY2xhcmF0aW9uUmFuZ2VzKTsKLQkJZkphdmEySnNwUmFuZ2VzLnB1dEFsbChmQ29kZVJhbmdlcyk7Ci0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZlVzZXJFTFJhbmdlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gamF2YVJhbmdlcwotCSAqIEBwYXJhbSBvZmZzZXRJbkphdmEKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUmFuZ2VzKEhhc2hNYXAgcmFuZ2VNYXAsIGludCBvZmZzZXRJbkphdmEpIHsKLQkJLy8ganVzdCBuZWVkIHRvIHVwZGF0ZSBqYXZhIHJhbmdlcyB3LyB0aGUgb2Zmc2V0IHdlIG5vdyBrbm93Ci0JCUl0ZXJhdG9yIGl0ID0gcmFuZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkKLQkJCSgoUG9zaXRpb24pIGl0Lm5leHQoKSkub2Zmc2V0ICs9IG9mZnNldEluSmF2YTsKLQl9Ci0KLQkvKioKLQkgKiBtYXAgb2YgcmFuZ2VzIChwb3NpdGlvbnMpIGluIGphdmEgZG9jdW1lbnQgdG8gcmFuZ2VzIGluIGpzcCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgamF2YSBwb3NpdGlvbnMgdG8ganNwIHBvc2l0aW9ucy4KLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcFJhbmdlcygpIHsKLQkJcmV0dXJuIGZKYXZhMkpzcFJhbmdlczsKLQl9Ci0KLQkvKioKLQkgKiBtYXAgb2YgcmFuZ2VzIGluIGpzcCBkb2N1bWVudCB0byByYW5nZXMgaW4gamF2YSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGpzcCBwb3NpdGlvbnMgdG8gamF2YSBwb3NpdGlvbnMsIG9yIG51bGwgaWYgbm8KLQkgKiAgICAgICAgIHRyYW5zbGF0aW9uIGhhcyBvY2N1cmVkIHlldCAodGhlIG1hcCBoYXNuJ3QgYmVlbiBidWlsdCkuCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SnNwMkphdmFSYW5nZXMoKSB7Ci0JCWlmIChmSmF2YTJKc3BSYW5nZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlIYXNoTWFwIGZsaXBGbG9wcGVkID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZKYXZhMkpzcFJhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlPYmplY3QgcmFuZ2UgPSBudWxsOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCXJhbmdlID0ga2V5cy5uZXh0KCk7Ci0JCQlmbGlwRmxvcHBlZC5wdXQoZkphdmEySnNwUmFuZ2VzLmdldChyYW5nZSksIHJhbmdlKTsKLQkJfQotCQlyZXR1cm4gZmxpcEZsb3BwZWQ7Ci0JfQotCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BJbXBvcnRSYW5nZXMoKSB7Ci0JCXJldHVybiBmSW1wb3J0UmFuZ2VzOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwVXNlQmVhblJhbmdlcygpIHsKLQkJcmV0dXJuIGZVc2VCZWFuUmFuZ2VzOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwSW5kaXJlY3RSYW5nZXMoKSB7Ci0JCXJldHVybiBmSW5kaXJlY3RSYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUganNwPC0+amF2YSBtYXAgYnkgZGVmYXVsdAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0cyhTdHJpbmcgdmFsdWUpIHsKLQkJYWRkSW1wb3J0cyh2YWx1ZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUGFzcyBpbiBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGltcG9ydCB2YWx1ZXMsIGFwcGVuZHMgZWFjaCB0byB0aGUKLQkgKiBmaW5hbCByZXN1bHQgYnVmZmVyCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGltcG9ydHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBvcnRzKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhZGRUb01hcCkgewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE2ODcKLQkJLy8gYWRkZWQgdGhlICJhZGRUb01hcCIgcGFyYW1ldGVyIHRvIGV4Y2x1ZGUgaW1wb3J0cyBvcmlnaW5hdGluZwotCQkvLyBmcm9tIGluY2x1ZGVkIEpTUCBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUganNwPC0+amF2YSBtYXBwaW5nCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b2sgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBTdHJpbmcgYXBwZW5kYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJdG9rID0gc3QubmV4dFRva2VuKCk7Ci0JCQlhcHBlbmRJbXBvcnRUb0J1ZmZlcih0b2ssIGZDdXJyZW50Tm9kZSwgYWRkVG9NYXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogLyoga2VlcCB0cmFjayBvZiBjdXJzb3IgcG9zaXRpb24gaW5zaWRlIHRoZSBidWZmZXIgLyogYXBwZW5kcyBidWZmZXIgdG8KLQkgKiB0aGUgZmluYWwgcmVzdWx0IGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZChTdHJpbmdCdWZmZXIgYnVmKSB7Ci0JCWlmIChnZXRDdXJzb3JPd25lcigpID09IGJ1ZikgewotCQkJZkN1cnNvclBvc2l0aW9uID0gZlJlc3VsdC5sZW5ndGgoKSArIGdldFJlbGF0aXZlT2Zmc2V0KCk7Ci0JCX0KLQkJZlJlc3VsdC5hcHBlbmQoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdmFsaWQgYWZ0ZXIgYSBjb25maWd1cmUoLi4uKSwgdHJhbnNsYXRlKC4uLikgb3IKLQkgKiB0cmFuc2xhdGVGcm9tRmlsZSguLi4pIGNhbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJlc3VsdCAoamF2YSB0cmFuc2xhdGlvbikgYnVmZmVyCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBnZXRUcmFuc2xhdGlvbigpIHsKLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXRyeSB7Ci0JCQkJSXRlcmF0b3IgaXQgPSBmSmF2YTJKc3BSYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVBvc2l0aW9uIGphdmEgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJKYXZhIHJhbmdlOlsiICsgamF2YS5vZmZzZXQgKyAiOiIgKyBqYXZhLmxlbmd0aCArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJbIiArIGZSZXN1bHQudG9TdHJpbmcoKS5zdWJzdHJpbmcoamF2YS5vZmZzZXQsIGphdmEub2Zmc2V0ICsgamF2YS5sZW5ndGgpICsgIl1cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJ8bWFwcyB0by4uLnxcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVBvc2l0aW9uIGpzcCA9IChQb3NpdGlvbikgZkphdmEySnNwUmFuZ2VzLmdldChqYXZhKTsKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJKU1AgcmFuZ2U6WyIgKyBqc3Aub2Zmc2V0ICsgIjoiICsganNwLmxlbmd0aCArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJbIiArIGZKc3BUZXh0QnVmZmVyLnRvU3RyaW5nKCkuc3Vic3RyaW5nKGpzcC5vZmZzZXQsIGpzcC5vZmZzZXQgKyBqc3AubGVuZ3RoKSArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BUcmFuc2xhdGlvbiBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCBkZWJ1Z1N0cmluZy50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiBmUmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE9ubHkgdmFsaWQgYWZ0ZXIgYSBjb25maWd1cmUoLi4uKSwgdHJhbnNsYXRlKC4uLikgb3IKLQkgKiB0cmFuc2xhdGVGcm9tRmlsZSguLi4pIGNhbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGluIHRoZSBKU1AgZmlsZQotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SnNwVGV4dCgpIHsKLQkJcmV0dXJuIGZKc3BUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnbGliVmFyaWFibGVzKFN0cmluZyB0YWdUb0FkZCkgewotCQlJRmlsZSBmID0gZ2V0RmlsZSgpOwotCi0JCWlmIChmID09IG51bGwgfHwgIWYuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJVGFnbGliSGVscGVyIGhlbHBlciA9IFRhZ2xpYkhlbHBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRUYWdsaWJIZWxwZXIoZik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VzdG9tVGFnID0gZ2V0Q3VycmVudE5vZGUoKTsKLQkJVGFnbGliVmFyaWFibGVbXSB0YWdsaWJWYXJzID0gaGVscGVyLmdldFRhZ2xpYlZhcmlhYmxlcyh0YWdUb0FkZCwgZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGN1c3RvbVRhZyk7Ci0JCVN0cmluZyBkZWNsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdsaWJWYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWNsID0gdGFnbGliVmFyc1tpXS5nZXREZWNsYXJhdGlvblN0cmluZygpOwotCQkJYXBwZW5kVG9CdWZmZXIoZGVjbCwgZlVzZXJDb2RlLCBmYWxzZSwgZkN1cnJlbnROb2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSUZpbGUgZiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJZiA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKG5ldyBQYXRoKHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gZjsKLQl9Ci0KLQkvKgotCSAqIHVzZWQgYnkgaW5uZXIgaGVscGVyIGNsYXNzIChYTUxKU1BSZWdpb25IZWxwZXIsIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlpZiAoZkJsb2NrTWFya2VycyA9PSBudWxsKQotCQkJZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCi0JLyoqCi0JICogLyogdGhlIG1haW4gY29udHJvbCBsb29wIGZvciB0cmFuc2xhdGluZyB0aGUgZG9jdW1lbnQsIGRyaXZlbiBieSB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgbm9kZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGUoKSB7Ci0JCXNldEN1cnJlbnROb2RlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0KLQkJd2hpbGUgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0KLQkJCS8vIGludGVyY2VwdCBIVE1MIGNvbW1lbnQgZmxhdCBub2RlCi0JCQkvLyBhbHNvIGhhbmRsZXMgVU5ERUZJTkVEICh3aGljaCBpcyB3aGF0IENEQVRBIGNvbWVzIGluIGFzKQotCQkJLy8gYmFzaWNhbGx5IHRoaXMgcGFydCB3aWxsIGhhbmRsZSBhbnkgImVtYmVkZGVkIiBKU1AgY29udGFpbmVycwotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCBnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJdHJhbnNsYXRlWE1MQ29tbWVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCByZWdpb24gaW4gdGhlIGZsYXQgbm9kZQotCQkJCXRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcihnZXRDdXJyZW50Tm9kZSgpLCBTVEFOREFSRF9KU1ApOwotCQkJfQotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCQlhZHZhbmNlTmV4dE5vZGUoKTsKLQkJfQotCQlidWlsZFJlc3VsdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGFyc2V0KSB7Ci0JCVJlYWRlciBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29udGVudFN0cmVhbSwgY2hhcnNldCksIDIwNDgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjA0OCk7Ci0JCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCX0KLQkJCWRvY3VtZW50LnNldChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zbGF0b3IncyBwcm9ncnNzIG1vbml0b3IsIGZhbHNlIGlmIHRoZQotCSAqICAgICAgICAgbW9uaXRvciBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsKSA/IGZhbHNlIDogZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkdmFuY2VOZXh0Tm9kZSgpIHsKLQkJc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKSB7Ci0JCWlmIChpc0pTUChnZXRDdXJyZW50Tm9kZSgpLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBnZXRDdXJyZW50Tm9kZSgpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJciA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCQlicmVhazsKLQkJCQllbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dChyKS50cmltKCkuZXF1YWxzKCJpbXBvcnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYSByZWdpb24gY29udGFpbmVyIChhbmQgWE1MIEpTUCBjb250YWluZXIsIG9yIDwlIEpTUAotCSAqIGNvbnRhaW5lcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVSZWdpb25Db250YWluZXIoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgaW50IEpTUFR5cGUpIHsKLQotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uID0gY29udGFpbmVyOwotCi0JCS8vIGN1c3RvbSB0YWdzIG5lZWQgdGhlaXIgb3duIHNjb3BlIHt9Ci0JCWhhbmRsZVNjb3BpbmdJZk5lY2Vzc2FyeShjb250YWluZXJSZWdpb24pOwotCi0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCi0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCi0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0KLQkJCS8vIGNvbnRlbnQgYXNzaXN0IHdhcyBub3Qgc2hvd2luZyB1cCBpbiBKU1AgaW5zaWRlIGEgamF2YXNjcmlwdAotCQkJLy8gcmVnaW9uCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkvLyBjaGVjayBpZiBpdCdzIG5lc3RlZCBqc3AgaW4gYSBzY3JpcHQgdGFnLi4uCi0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYW5zbGF0ZUpTUE5vZGUocmVnaW9uLCByZWdpb25zLCB0eXBlLCBFTUJFRERFRF9KU1ApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJCQkJLy8gVEhJUyBFTUJFRERFRCBKU1AgVEVYVCBXSUxMIENPTUUgT1VUIExBVEVSIFdIRU4KLQkJCQkJLy8gUEFSVElUSU9OSU5HIEhBUwotCQkJCQkvLyBTVVBQT1JUIEZPUiBORVNURUQgWE1MLUpTUAotCQkJCQkvLyBDTVZDIDI0MTg4MgotCQkJCQlkZWNvZGVTY3JpcHRCbG9jayhjb250YWluZXJSZWdpb24uZ2V0RnVsbFRleHQocmVnaW9uKSwgY29udGFpbmVyUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJCX0KLQkJCX0KLQkJCWlmICh0eXBlICE9IG51bGwgJiYgaXNKU1AodHlwZSkpIC8vIDwlLCA8JT0sIDwlISwgPCVACi0JCQl7Ci0JCQkJLy8gdHJhbnNsYXRlSlNQTm9kZShyZWdpb24sIHJlZ2lvbnMsIHR5cGUsIEpTUFR5cGUpOwotCQkJCXRyYW5zbGF0ZUpTUE5vZGUoY29udGFpbmVyUmVnaW9uLCByZWdpb25zLCB0eXBlLCBKU1BUeXBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJdHJhbnNsYXRlWE1MTm9kZShjb250YWluZXJSZWdpb24sIHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JCS8vIH0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2NvcGluZ0lmTmVjZXNzYXJ5KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQkJLy8gY29kZSB3aXRoaW4gYSBjdXN0b20gdGFnIGdldHMgaXRzIG93biBzY29wZQotCQkvLyBzbyBpZiB3ZSBlbmNvdW50ZXIgYSBzdGFydCBvZiBhIGN1c3RvbSB0YWcsIHdlIGFkZCAneycKLQkJLy8gYW5kIGZvciB0aGUgZW5kIG9mIGEgY3VzdG9tIHRhZyB3ZSBhZGQgJ30nCi0JCWlmIChjb250YWluZXJSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCS8vIGRvbid0IGFkZCAneycgaWYgaXQncyBhIHNlbGYgY2xvc2luZyB0YWcKLQkJCWlmICghaXNTZWxmQ2xvc2luZ1RhZyhjb250YWluZXJSZWdpb24pKSB7Ci0JCQkJaWYgKGlzQ3VzdG9tVGFnKGNvbnRhaW5lclJlZ2lvbikpIHsKLQkJCQkJc3RhcnRTY29wZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChjb250YWluZXJSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlpZiAoaXNDdXN0b21UYWcoY29udGFpbmVyUmVnaW9uKSkgewotCQkJCWVuZFNjb3BlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRTY29wZSgpIHsKLQkJLy8gZlNjb3BlRGVwdGgrKzsKLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGZvcihpbnQgaT0wOyBpPGZTY29wZURlcHRoOyBpKyspIHRleHQuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5hcHBlbmQoInsgLy8gPCIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKGdldFJlZ2lvbk5hbWUoZkN1cnJlbnROb2RlKSk7Ci0JCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQlhcHBlbmRUb0J1ZmZlcih0ZXh0LnRvU3RyaW5nKCksIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kU2NvcGUoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0ZXh0LmFwcGVuZCgifSAvLyA8LyIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKGdldFJlZ2lvbk5hbWUoZkN1cnJlbnROb2RlKSk7Ci0JCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQlhcHBlbmRUb0J1ZmZlcih0ZXh0LnRvU3RyaW5nKCksIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxmQ2xvc2luZ1RhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0KLQkJaWYgKGNvbnRhaW5lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCXJldHVybiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3VzdG9tVGFnKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRSZWdpb25OYW1lKGNvbnRhaW5lclJlZ2lvbik7Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAodGFnTmFtZS5pbmRleE9mKCI6IikgPiAwICYmICF0YWdOYW1lLnN0YXJ0c1dpdGgoImpzcCIpKSAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVnaW9uTmFtZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmFtZVJlZ2lvbiA9IHI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVSZWdpb24gIT0gbnVsbCA/IGNvbnRhaW5lclJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pLnRyaW0oKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICoqCi0JICogVEVNUCBXT1JLQVJPVU5EIEZPUiBDTVZDIDI0MTg4MiBUYWtlcyBhIFN0cmluZyBhbmQgYmxvY2tzIG91dAotCSAqIGpzcDpzY3JpcHRsZXQsIGpzcDpleHByZXNzaW9uLCBhbmQganNwOmRlY2xhcmF0aW9uIEBwYXJhbSBibG9ja1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVNjcmlwdEJsb2NrKFN0cmluZyBibG9ja1RleHQsIGludCBzdGFydE9mQmxvY2spIHsKLQkJWE1MSlNQUmVnaW9uSGVscGVyIGhlbHBlciA9IG5ldyBYTUxKU1BSZWdpb25IZWxwZXIodGhpcyk7Ci0JCWhlbHBlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpzY3JpcHRsZXQiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZXhwcmVzc2lvbiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpkZWNsYXJhdGlvbiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpkaXJlY3RpdmUuaW5jbHVkZSIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpkaXJlY3RpdmUudGFnbGliIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLnJlc2V0KGJsb2NrVGV4dCwgc3RhcnRPZkJsb2NrKTsKLQkJLy8gZm9yY2UgcGFyc2UKLQkJaGVscGVyLmZvcmNlUGFyc2UoKTsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgc3RyaW5nIG1pbnVzIENEQVRBIG9wZW4gYW5kIGNsb3NlIHRleHQKLQkgKi8KLQlmaW5hbCBwdWJsaWMgU3RyaW5nIHN0cmlwQ0RBVEEoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIHJlc3VsdFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ0RBVEFfT1BFTiA9ICI8IVtDREFUQVsiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDREFUQV9DTE9TRSA9ICJdXT4iOyAvLyROT04tTkxTLTEkCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBlbmQgPSB0ZXh0Lmxlbmd0aCgpOwotCQl3aGlsZSAoc3RhcnQgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0JCQlpZiAodGV4dC5pbmRleE9mKENEQVRBX09QRU4sIHN0YXJ0KSA+IC0xKSB7Ci0JCQkJZW5kID0gdGV4dC5pbmRleE9mKENEQVRBX09QRU4sIHN0YXJ0KTsKLQkJCQlyZXN1bHRUZXh0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCXN0YXJ0ID0gZW5kICsgQ0RBVEFfT1BFTi5sZW5ndGgoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuaW5kZXhPZihDREFUQV9DTE9TRSwgc3RhcnQpID4gLTEpIHsKLQkJCQllbmQgPSB0ZXh0LmluZGV4T2YoQ0RBVEFfQ0xPU0UsIHN0YXJ0KTsKLQkJCQlyZXN1bHRUZXh0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCXN0YXJ0ID0gZW5kICsgQ0RBVEFfQ0xPU0UubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbmQgPSB0ZXh0Lmxlbmd0aCgpOwotCQkJCXJlc3VsdFRleHQgKz0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFRleHQ7Ci0JfQotCi0JLy8gRU5EIE9GIFdPUktBUk9VTkQgQ09ERS4uLgotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvKioKLQkgKiBkZXRlcm1pbmVzIGlmIHRoZSB0eXBlIGlzIGEgcHVyZSBKU1AgdHlwZSAobm90IFhNTCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pICYmIHR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pOwotCQkvLyBjaGVja2luZyBYTUxfVEFHX09QRU4gc28gPGpzcDpkaXJlY3RpdmUueHh4Lz4gZ2V0cyB0cmVhdGVkIGxpa2UKLQkJLy8gb3RoZXIgWE1MIGpzcCB0YWdzCi0JfQotCi0JLyoqCi0JICogdHJhbnNsYXRlcyB0aGUgdmFyaW91cyBYTUxKU1AgdHlwZSBub2RlcwotCSAqIAotCSAqIEBwYXJhbSByZWdpb25zCi0JICogICAgICAgICAgICB0aGUgcmVnaW9ucyBvZiB0aGUgWE1MTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVhNTE5vZGUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgSXRlcmF0b3IgcmVnaW9ucykgewotCQkvLyBjb250ZW50cyBtdXN0IGJlIHZhbGlkIFhIVE1MLCB0cmFuc2xhdGUgZXNjYXBlZCBDREFUQSBpbnRvIHdoYXQgaXQKLQkJLy8gcmVhbGx5IGlzLi4uCi0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJLy8gPGpzcDpkaXJlY3RpdmUueHh4ID4gY29tZXMgaW4gYXMgdGhpcwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IHIuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkKLQotCQkJewotCQkJCVN0cmluZyBmdWxsVGFnTmFtZSA9IGNvbnRhaW5lci5nZXRGdWxsVGV4dChyKS50cmltKCk7Ci0JCQkJaWYgKGZ1bGxUYWdOYW1lLmluZGV4T2YoJzonKSA+IC0xKSB7Ci0JCQkJCWFkZFRhZ2xpYlZhcmlhYmxlcyhmdWxsVGFnTmFtZSk7IC8vIGl0IG1heSBiZSBhIHRhZ2xpYgotCQkJCX0KLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZ1bGxUYWdOYW1lLCAiOi4iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpICYmIHN0Lm5leHRUb2tlbigpLmVxdWFscygianNwIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCVN0cmluZyBqc3BUYWdOYW1lID0gc3QubmV4dFRva2VuKCk7Ci0KLQkJCQkJCWlmIChqc3BUYWdOYW1lLmVxdWFscygic2NyaXB0bGV0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cmFuc2xhdGVYTUxKU1BDb250ZW50KFNDUklQVExFVCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZXhwcmVzc2lvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJdHJhbnNsYXRlWE1MSlNQQ29udGVudChFWFBSRVNTSU9OKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJkZWNsYXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJdHJhbnNsYXRlWE1MSlNQQ29udGVudChERUNMQVJBVElPTik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZGlyZWN0aXZlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCQkJCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidGFnbGliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJaGFuZGxlVGFnbGliKCk7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJCQkvLyBza2lwIHRvIHJlcXVpcmVkICJmaWxlIiBhdHRyaWJ1dGUsCi0JCQkJCQkJCQkvLyBzaG91bGQgYmUgc2FmZSBiZWNhdXNlCi0JCQkJCQkJCQkvLyAiZmlsZSIgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGZvciB0aGUKLQkJCQkJCQkJCS8vIGluY2x1ZGUgZGlyZWN0aXZlCi0JCQkJCQkJCQl3aGlsZSAociAhPSBudWxsICYmIHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQkJCQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZmlsZUxvY2F0aW9uID0gZ2V0QXR0cmlidXRlVmFsdWUociwgcmVnaW9ucyk7Ci0JCQkJCQkJCQlpZiAoZmlsZUxvY2F0aW9uICE9IG51bGwpCi0JCQkJCQkJCQkJaGFuZGxlSW5jbHVkZUZpbGUoZmlsZUxvY2F0aW9uKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygicGFnZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQkJLy8gYmFkIGlmIGN1cnJlbnROb2RlIGlzIHJlZmVyZW5jZWQgYWZ0ZXIKLQkJCQkJCQkJCS8vIGhlcmUgdy8gdGhlIGN1cnJlbnQgbGlzdAotCQkJCQkJCQkJLy8gc2VlOgotCQkJCQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzUKLQkJCQkJCQkJCS8vIHNldEN1cnJlbnROb2RlKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpKTsKLQkJCQkJCQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJCQkvLyAncmVnaW9ucycgY29udGFpbiB0aGUgYXR0cnMKLQkJCQkJCQkJCQl0cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhyZWdpb25zKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIDxqc3A6aW5jbHVkZSBwYWdlPSJmaWxlbmFtZSIpIC8+Ci0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZm9yd2FyZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJwYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJwYXJhbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygic2V0UHJvcGVydHkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoInVzZUJlYW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWNoZWNrQXR0cmlidXRlVmFsdWVDb250YWluZXIocmVnaW9ucywgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwMDQKLQkJCQkJCQkvLyBhZHZhbmNlTmV4dE5vZGUoKTsgLy8gZ2V0IHRoZSBjb250ZW50Ci0JCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCQl0cmFuc2xhdGVVc2VCZWFuKGNvbnRhaW5lcik7IC8vICdyZWdpb25zJwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0FsbEF0dHJpYnV0ZVZhbHVlQ29udGFpbmVycyhyZWdpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGVtYmVkZGVkIGNvbnRhaW5lcnMgZm9yIEFMTCBhdHRyaWJ1dGUgdmFsdWVzCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBbGxBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcnMoSXRlcmF0b3IgcmVnaW9ucykgewotCQkvLyB0YWcgbmFtZSBpcyBub3QganNwCi0JCS8vIGhhbmRsZSBlbWJlZGRlZCBqc3AgYXR0cmlidXRlcy4uLgotCQlJVGV4dFJlZ2lvbiBlbWJlZGRlZCA9IG51bGw7Ci0JCS8vSXRlcmF0b3IgYXR0clJlZ2lvbnMgPSBudWxsOwotCQkvL0lUZXh0UmVnaW9uIGF0dHJDaHVuayA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJZW1iZWRkZWQgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKGVtYmVkZGVkIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkvLyBwYXJzZSBvdXQgY29udGFpbmVyCi0JCQkJCi0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDYwNgotCQkJCS8vIGZpeCBleHBvbmVudGlhbCBpdGVyYXRpb24gcHJvYmxlbSB3LyBlbWJlZGRlZCBleHByZXNzaW9ucwotCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBlbWJlZGRlZCk7Ci0vLwkJCQlhdHRyUmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGVtYmVkZGVkKS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLS8vCQkJCXdoaWxlIChhdHRyUmVnaW9ucy5oYXNOZXh0KCkpIHsKLS8vCQkJCQlhdHRyQ2h1bmsgPSAoSVRleHRSZWdpb24pIGF0dHJSZWdpb25zLm5leHQoKTsKLS8vCQkJCQlTdHJpbmcgdHlwZSA9IGF0dHJDaHVuay5nZXRUeXBlKCk7Ci0vLwkJCQkJLy8gZW1iZWRkZWQgSlNQIGluIGF0dHJpYnV0ZSBzdXBwb3J0IG9ubHkgd2FudCB0bwotLy8JCQkJCS8vIHRyYW5zbGF0ZSBvbmUgdGltZSBwZXIKLS8vCQkJCQkvLyBlbWJlZGRlZCByZWdpb24gc28gd2Ugb25seSB0cmFuc2xhdGUgb24gdGhlIEpTUCBvcGVuCi0vLwkJCQkJLy8gdGFncyAobm90IGNvbnRlbnQpCi0vLwkJCQkJaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLS8vCQkJCQkJLy8gbm93IGNhbGwganNwdHJhbnNsYXRlCi0vLwkJCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBlbWJlZGRlZCk7Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgZW1iZWRkZWQgY29udGFpbmVyIGZvciBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihJdGVyYXRvciByZWdpb25zLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKS5lcXVhbHMoYXR0ck5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBza2lwIHRvIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwpIHsKLQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gZm9yY2VzIGVtYmVkZGVkIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JCQkJaWYgKHIgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoKENvbnRleHRSZWdpb25Db250YWluZXIpIHIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogZXhhbXBsZToKLQkgKiAKLQkgKiA8anNwOnNjcmlwdGxldD5zY3JpcHRsZXQganNwLWphdmEgY29udGVudCA8IVtDREFUQVsgbW9yZSBqc3AgamF2YSBdXT4KLQkgKiBqc3AtamF2YSBjb250ZW50Li4uIDwhW0NEQVRBWyBtb3JlIGpzcCBqYXZhIF1dPiA8L2pzcDpzY3JpcHRsZXQ+Ci0JICogCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMzY2Ci0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NTkwIHRyYW5zbGF0ZQotCSAqIGV2ZXJ5dGhpbmcgaW5iZXR3ZWVuIDxzY3JpcHRsZXQ+IHRhZ3MsIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4gb25lCi0JICogcmVnaW9uIChlc3AuIENEQVRBKQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVYTUxKU1BDb250ZW50KGludCB0eXBlKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKTsKLQkJaW50IHN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCVN0cmluZyBzZHJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByZWFkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyB1bnRpbAotCQkvLyA8L2pzcDpzY3JpcHRsZXQ+IG9yIEVPRgotCQl3aGlsZSAoc2RyICE9IG51bGwgJiYgc2RyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCi0JCQkvLyBzZXR1cCBmb3IgbmV4dCByZWdpb24KLQkJCXN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlzZHJUZXh0ID0gc2RyLmdldFRleHQoKTsKLQotCQkJaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCi0JCQkJLy8ganVzdCB0byBiZSBzYWZlLCBtYWtlIHN1cmUgQ0RBVEEgc3RhcnQgJiBlbmQgYXJlIHRoZXJlCi0JCQkJaWYgKHNkclRleHQuc3RhcnRzV2l0aCgiPCFbQ0RBVEFbIikgJiYgc2RyVGV4dC5lbmRzV2l0aCgiXV0+IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJc3RhcnQgPSBzZHIuZ2V0U3RhcnRPZmZzZXQoKSArIDk7IC8vIDwhW0NEQVRBWwotCQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCkgLSAzOyAvLyBdXT4KLQkJCQkJc2RyVGV4dCA9IHNkclRleHQuc3Vic3RyaW5nKDksIHNkclRleHQubGVuZ3RoKCkgLSAzKTsKLQkJCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQotCQkJCS8vIGhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcwotCQkJCXNkclRleHQgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChzZHJUZXh0KTsKLQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCX0KLQkJCXNkciA9IHNkci5nZXROZXh0KCk7Ci0JCX0KLQkJc2V0Q3VycmVudE5vZGUoc2RyKTsKLQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVUb0J1ZmZlcihpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnQsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgU0NSSVBUTEVUIDoKLQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVhQUkVTU0lPTiA6Ci0JCQkJdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhjb250ZW50LCBnZXRDdXJyZW50Tm9kZSgpLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBERUNMQVJBVElPTiA6Ci0JCQkJdHJhbnNsYXRlRGVjbGFyYXRpb25TdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0KTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdvZXMgdGhyb3VnaCBjb21tZW50IHJlZ2lvbnMsIGNoZWNrcyBpZiBhbnkgYXJlIGFuIGVtYmVkZGVkIEpTUAotCSAqIGNvbnRhaW5lciBpZiBpdCBmaW5kcyBvbmUsIGl0J3Mgc2VuZHMgdGhlIGNvbnRhaW5lciBpbnRvIHRoZQotCSAqIHRyYW5zbGF0aW9uIHJvdXRpbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVYTUxDb21tZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50UmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7Ci0JCQljb21tZW50UmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29tbWVudFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhbnNsYXRlUmVnaW9uQ29udGFpbmVyKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29tbWVudFJlZ2lvbiwgRU1CRURERURfSlNQKTsgLy8gaXQncwotCQkJCS8vIGVtYmVkZGVkCi0JCQkJLy8ganNwLi4uaXRlcmF0ZQotCQkJCS8vIHJlZ2lvbnMuLi4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGRldGVybWluZXMgd2hpY2ggdHlwZSBvZiBKU1Agbm9kZSB0byB0cmFuc2xhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVKU1BOb2RlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSXRlcmF0b3IgcmVnaW9ucywgU3RyaW5nIHR5cGUsIGludCBKU1BUeXBlKSB7Ci0JCWlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJiByZWdpb25zICE9IG51bGwpIHsKLQkJCXRyYW5zbGF0ZURpcmVjdGl2ZShyZWdpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250ZW50UmVnaW9uID0gbnVsbDsKLQkJCWlmIChKU1BUeXBlID09IFNUQU5EQVJEX0pTUCAmJiAoc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpKSAhPSBudWxsKSB7Ci0JCQkJY29udGVudFJlZ2lvbiA9IGdldEN1cnJlbnROb2RlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChKU1BUeXBlID09IEVNQkVEREVEX0pTUCAmJiByZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQotCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5CbG9jaygoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24pOwotCQkJCS8vIGVuc3VyZSB0aGUgcmVzdCBvZiB0aGlzIG1ldGhvZCB3b24ndCBiZSBjYWxsZWQKLQkJCQljb250ZW50UmVnaW9uID0gbnVsbDsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB7Ci0JCQkJCXRyYW5zbGF0ZUV4cHJlc3Npb24oY29udGVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCQkJdHJhbnNsYXRlRGVjbGFyYXRpb24oY29udGVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJdHJhbnNsYXRlU2NyaXB0bGV0KGNvbnRlbnRSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2Ugb2YgYW4gYXR0cmlidXRlIHcvIG5vIHJlZ2lvbiA8cAotCQkJCS8vIGFsaWduPSI8JSU+Ij4KLQkJCQlzZXRDdXJzb3JPd25lcihnZXRKU1BUeXBlRm9yUmVnaW9uKHJlZ2lvbikpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlRUwoU3RyaW5nIGVsVGV4dCwgU3RyaW5nIGRlbGltLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBpbnQgY29udGVudFN0YXJ0LCBpbnQgY29udGVudExlbmd0aCkgewotCQlJSlNQRUxUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBnZXRFTFRyYW5zbGF0b3IoKTsKLQkJaWYgKG51bGwgIT0gdHJhbnNsYXRvcikgewotCQkJdHJhbnNsYXRvci50cmFuc2xhdGVFTChlbFRleHQsIGRlbGltLCBjdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50TGVuZ3RoLCBmVXNlckVMRXhwcmVzc2lvbnMsIGZVc2VyRUxSYW5nZXMsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY292ZXIgYW5kIGluc3RhbnRpYXRlIGFuIEVMIHRyYW5zbGF0b3IuCi0JICovCi0JcHVibGljIElKU1BFTFRyYW5zbGF0b3IgZ2V0RUxUcmFuc2xhdG9yKCkgewotCQlpZiAoZkVMVHJhbnNsYXRvciA9PSBudWxsKSB7Ci0KLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSlNQX0NPUkVfUExVR0lOX0lELCAvLyBuYW1lCi0JCQkJCQkvLyBvZgotCQkJCQkJLy8gcGx1Z2luCi0JCQkJCQkvLyB0aGF0Ci0JCQkJCQkvLyBleHBvc2VzCi0JCQkJCQkvLyB0aGlzCi0JCQkJCQkvLyBleHRlbnNpb24KLQkJCQkJCS8vIHBvaW50Ci0JCQkJCQlFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FKTsgLy8gLSBleHRlbnNpb24gaWQKLQotCQkJLy8gSXRlcmF0ZSBvdmVyIGFsbCBkZWNsYXJlZCBleHRlbnNpb25zIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50LgotCQkJLy8gQSBzaW5nbGUgcGx1Z2luIG1heSBleHRlbmQgdGhlIGV4dGVuc2lvbiBwb2ludCBtb3JlIHRoYW4gb25jZSwKLQkJCS8vIGFsdGhvdWdoIGl0J3Mgbm90IHJlY29tbWVuZGVkLgotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGJlc3RUcmFuc2xhdG9yID0gbnVsbDsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgY3VyRXh0ZW5zaW9uID0gMDsgY3VyRXh0ZW5zaW9uIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGN1ckV4dGVuc2lvbisrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2N1ckV4dGVuc2lvbl07Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0cmFuc2xhdG9ycyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBjdXJUcmFuc2xhdG9yID0gMDsgY3VyVHJhbnNsYXRvciA8IHRyYW5zbGF0b3JzLmxlbmd0aDsgY3VyVHJhbnNsYXRvcisrKSB7Ci0KLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsVHJhbnNsYXRvciA9IHRyYW5zbGF0b3JzW2N1clRyYW5zbGF0b3JdOwotCi0JCQkJCWlmICghRUxfVFJBTlNMQVRPUl9FWFRFTlNJT05fTkFNRS5lcXVhbHMoZWxUcmFuc2xhdG9yLmdldE5hbWUoKSkpIHsgLy8gLQotCQkJCQkJLy8gbmFtZQotCQkJCQkJLy8gb2YKLQkJCQkJCS8vIGNvbmZpZ0VsZW1lbnQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIGlkU3RyaW5nID0gZWxUcmFuc2xhdG9yLmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobnVsbCAhPSBpZFN0cmluZyAmJiBpZFN0cmluZy5lcXVhbHMoZkVMVHJhbnNsYXRvcklEKSB8fCAobnVsbCA9PSBiZXN0VHJhbnNsYXRvciAmJiBERUZBVUxUX0pTUF9FTF9UUkFOU0xBVE9SX0lELmVxdWFscyhpZFN0cmluZykpKSB7Ci0JCQkJCQliZXN0VHJhbnNsYXRvciA9IGVsVHJhbnNsYXRvcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG51bGwgIT0gYmVzdFRyYW5zbGF0b3IpIHsKLQkJCQl0cnkgewotCQkJCQlPYmplY3QgZXhlY0V4dCA9IGJlc3RUcmFuc2xhdG9yLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGV4ZWNFeHQgaW5zdGFuY2VvZiBJSlNQRUxUcmFuc2xhdG9yKSB7Ci0JCQkJCQlyZXR1cm4gZkVMVHJhbnNsYXRvciA9IChJSlNQRUxUcmFuc2xhdG9yKSBleGVjRXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZFTFRyYW5zbGF0b3I7Ci0JfQotCi0JLyoqCi0JICogUGFzcyB0aGUgSVRleHRSZWdpb25Db2xsZWN0aW9uIHdoaWNoIGlzIHRoZSBlbWJlZGRlZCByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gaXRlcmF0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkJsb2NrKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb2xsZWN0aW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoaXNKU1AocmVnaW9uLmdldFR5cGUoKSkpCi0JCQkJYnJlYWs7Ci0JCQlyZWdpb24gPSBudWxsOwotCQl9Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZShjb2xsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogZm9yIGV4YW1wbGU6IDxhIGhyZWY9ImluZGV4LmpzcD9wPTwlPWFiYyU+Yj08JT14eXolPiI+YWJjPC9hPgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lcikgewotCQkvLyBUSElTIE1FVEhPRCBJUyBBIEZJWCBGT1IKLQkJLy8ganNwIGVtYmVkZGVkIGluIGF0dHJpYnV0ZSByZWdpb25zCi0JCS8vIGxvb3AgYWxsIHJlZ2lvbnMKLQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gZGVsaW0gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBjb250ZW50ID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVtYmVkZGVkUmVnaW9ucy5zaXplKCk7IGkrKykgewotCi0JCQkvLyBwb3NzaWJsZSBkZWxpbWl0ZXIsIGNoZWNrIGxhdGVyCi0JCQlkZWxpbSA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSk7Ci0JCQl0eXBlID0gZGVsaW0uZ2V0VHlwZSgpOwotCi0JCQkvLyBjaGVjayBuZXh0IHJlZ2lvbiB0byBzZWUgaWYgaXQncyBjb250ZW50Ci0JCQlpZiAoaSArIDEgPCBlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBlbWJlZGRlZFJlZ2lvbnMuZ2V0KGkgKyAxKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkKLQkJCQkJY29udGVudCA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSArIDEpOwotCi0JCQl9Ci0KLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgY29udGVudFN0YXJ0ID0gZW1iZWRkZWRDb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoY29udGVudCk7Ci0JCQkJaW50IHJTdGFydCA9IGZDdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgY29udGVudFN0YXJ0OwotCQkJCWludCByRW5kID0gZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBlbWJlZGRlZENvbnRhaW5lci5nZXRFbmRPZmZzZXQoY29udGVudCk7Ci0KLQkJCQlib29sZWFuIGluVGhpc1JlZ2lvbiA9IHJTdGFydCA8PSBmU291cmNlUG9zaXRpb24gJiYgckVuZCA+PSBmU291cmNlUG9zaXRpb247Ci0JCQkJLy8gaW50IGpzcFBvc2l0aW9uU3RhcnQgPSBmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArCi0JCQkJLy8gY29udGVudFN0YXJ0OwotCi0JCQkJaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgewotCQkJCQlmTGFzdEpTUFR5cGUgPSBFWFBSRVNTSU9OOwotCQkJCQkvLyB0cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksCi0JCQkJCS8vIGZDdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQkJdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLCBlbWJlZGRlZENvbnRhaW5lciwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gU0NSSVBUTEVUOwotCQkJCQkvLyB0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwKLQkJCQkJLy8gZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gREVDTEFSQVRJT047Ci0JCQkJCS8vIHRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksCi0JCQkJCS8vIGZDdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQkJdHJhbnNsYXRlRGVjbGFyYXRpb25TdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gRVhQUkVTU0lPTjsKLQkJCQkJdHJhbnNsYXRlRUwoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChkZWxpbSksIGZDdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQl9Ci0KLQkJCQkvLyBjYWxjdWxhdGUgcmVsYXRpdmUgb2Zmc2V0IGluIGJ1ZmZlcgotCQkJCWlmIChpblRoaXNSZWdpb24pIHsKLQkJCQkJc2V0Q3Vyc29yT3duZXIoZkxhc3RKU1BUeXBlKTsKLQkJCQkJaW50IGN1cnJlbnRCdWZmZXJMZW5ndGggPSBnZXRDdXJzb3JPd25lcigpLmxlbmd0aCgpOwotCQkJCQlzZXRSZWxhdGl2ZU9mZnNldCgoZlNvdXJjZVBvc2l0aW9uIC0gY29udGVudFN0YXJ0KSArIGN1cnJlbnRCdWZmZXJMZW5ndGgpOwotCQkJCQlpZiAoZkxhc3RKU1BUeXBlID09IEVYUFJFU1NJT04pIHsKLQkJCQkJCS8vIGlmIGFuIGV4cHJlc3Npb24sIGFkZCB0aGVuIGxlbmd0aCBvZiB0aGUgZW5jbG9zaW5nCi0JCQkJCQkvLyBwYXJlbi4uCi0JCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCQlzZXRSZWxhdGl2ZU9mZnNldChnZXRSZWxhdGl2ZU9mZnNldCgpICsgRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHlwZSA9IG51bGw7Ci0JCQkJY29udGVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBmTGFzdEpTUFR5cGUgPSBTQ1JJUFRMRVQ7Ci0KLQkvKioKLQkgKiBKU1BUeXBlIGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5IGluIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdHllIHR5cGUgb2YKLQkgKiByZWdpb24gdG8gYmUgdHJhbnNsYXRlZAotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXByaXZhdGUgaW50IGdldEpTUFR5cGVGb3JSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaW50IHR5cGUgPSBTQ1JJUFRMRVQ7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikKLQkJCXR5cGUgPSBTQ1JJUFRMRVQ7Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikKLQkJCXR5cGUgPSBFWFBSRVNTSU9OOwotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKQotCQkJdHlwZSA9IERFQ0xBUkFUSU9OOwotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKQotCQkJdHlwZSA9IGZMYXN0SlNQVHlwZTsKLQkJLy8gcmVtZW1iZXIgdGhlIGxhc3QgdHlwZSwgaW4gY2FzZSB0aGUgbmV4dCB0eXBlIHRoYXQgY29tZXMgaW4gaXMKLQkJLy8gSlNQX0NPTlRFTlQKLQkJZkxhc3RKU1BUeXBlID0gdHlwZTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogLyogPCVAICU+IC8qIG5lZWQgdG8gcGFzcyBpbiB0aGUgZGlyZWN0aXZlIHRhZyByZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVEaXJlY3RpdmUoSXRlcmF0b3IgcmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIHJlZ2lvblRleHQsIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7IC8vIGNvdWxkCi0JCQkvLyBiZQotCQkJLy8gWE1MX0NPTlRFTlQKLQkJCS8vID0KLQkJCS8vICIiLAotCQkJLy8gc2tpcHMKLQkJCS8vIGF0dHJzPwotCQkJcmVnaW9uVGV4dCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKTsKLQkJCWlmIChyZWdpb25UZXh0LmluZGV4T2YoInRhZ2xpYiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGFkZCBjdXN0b20gdGFnIGJsb2NrIG1hcmtlcnMgaGVyZQotCQkJCWhhbmRsZVRhZ2xpYigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIENNVkMgMjU4MzExCi0JCQkJLy8gUE1SIDE4MzY4LCBCNjYzCi0JCQkJLy8gc2tpcCB0byByZXF1aXJlZCAiZmlsZSIgYXR0cmlidXRlLCBzaG91bGQgYmUgc2FmZSBiZWNhdXNlCi0JCQkJLy8gImZpbGUiIGlzIHRoZSBvbmx5IGF0dHJpYnV0ZSBmb3IgdGhlIGluY2x1ZGUgZGlyZWN0aXZlCi0JCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiByZWdpb25zLmhhc05leHQoKSAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJfQotCQkJCWZpbGVMb2NhdGlvbiA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJaGFuZGxlSW5jbHVkZUZpbGUoZmlsZUxvY2F0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblRleHQuaW5kZXhPZigicGFnZSIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgaWRlYWxseSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBydW4gdGhyb3VnaAotCSAqIEpTUFRyYW5zbGF0b3IgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGlubmVyIGhlbHBlciBjbGFzc2VzIHRoYXQKLQkgKiBuZWVkIHRvIGFkZCBibG9jayBtYXJrZXJzIHRvIHRoZWlyIG93biBwYXJzZXJzLiBUaGlzIG1ldGhvZCBvbmx5IGFkZHMKLQkgKiBtYXJrZXJzIHRoYXQgY2FtZSBmcm9tIDxAdGFnbGliPiBkaXJlY3RpdmVzLCAobm90IDxAaW5jbHVkZT4pLCBzaW5jZQotCSAqIGluY2x1ZGUgZmlsZSB0YWdsaWJzIGFyZSBoYW5kbGVkIG9uIHRoZSBmbHkgd2hlbiB0aGV5IGFyZSBlbmNvdW50ZXJlZC4gKgotCSAqIEBwYXJhbSByZWdpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVGFnbGliKCkgewotCQkvLyBnZXQvY3JlYXRlIFRMRENNRG9jdW1lbnQKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhnZXRDdXJyZW50Tm9kZSgpLmdldEVuZCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnRUcmFja2VyIHRyYWNrZXIgPSBudWxsOwotCQkJSXRlcmF0b3IgdGFnbGliUmVnaW9ucyA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXRyYWNrZXIgPSAoQ01Eb2N1bWVudFRyYWNrZXIpIGl0Lm5leHQoKTsKLQkJCQlzZFJlZ2lvbiA9IHRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJLy8gc2luY2UgbWF5IGJlIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZCAobGlrZSBhIGJhY2tncm91bmQKLQkJCQkvLyBqb2IpCi0JCQkJLy8gdGhpcyBjaGVjayBpcyB0byBiZSBzYWZlcgotCQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsICYmICFzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQl0YWdsaWJSZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsICYmICFzZFJlZ2lvbi5pc0RlbGV0ZWQoKSAmJiB0YWdsaWJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJciA9IChJVGV4dFJlZ2lvbikgdGFnbGliUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkpIHsKLQkJCQkJCQlpZiAoc2RSZWdpb24uZ2V0VGV4dChyKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpKSB7Ci0JCQkJCQkJCWFkZEJsb2NrTWFya2Vycyh0cmFja2VyLmdldERvY3VtZW50KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogYWRkcyBibG9jayBtYXJrZXJzIHRvIEpTUFRyYW5zbGF0b3IncyBibG9jayBtYXJrZXIgbGlzdCBmb3IgYWxsCi0JICogZWxlbWVudHMgaW4gZG9jIEBwYXJhbSBkb2MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCbG9ja01hcmtlcnMoQ01Eb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYy5nZXRFbGVtZW50cygpLmdldExlbmd0aCgpID4gMCkgewotCQkJSXRlcmF0b3IgZWxlbWVudHMgPSBkb2MuZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJQ01Ob2RlIG5vZGUgPSBudWxsOwotCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCW5vZGUgPSAoQ01Ob2RlKSBlbGVtZW50cy5uZXh0KCk7Ci0JCQkJZ2V0QmxvY2tNYXJrZXJzKCkuYWRkKG5ldyBCbG9ja01hcmtlcihub2RlLmdldE5vZGVOYW1lKCksIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCB0cnVlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiByIGlzIGFuIGF0dHJpYnV0ZSBuYW1lIHJlZ2lvbiwgdGhpcyBtZXRob2Qgd2lsbCBzYWZlbHkgcmV0dXJuIHRoZQotCSAqIHZhbHVlIGZvciB0aGF0IGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcgotCSAqIEBwYXJhbSByZW1haW5pbmdSZWdpb25zCi0JICogQHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZSAociksIG9yIG51bGwgaWYgaXNuJ3Qgb25lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShJVGV4dFJlZ2lvbiByLCBJdGVyYXRvciByZW1haW5pbmdSZWdpb25zKSB7Ci0JCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJaWYgKHJlbWFpbmluZ1JlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZW1haW5pbmdSZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChyZW1haW5pbmdSZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVtYWluaW5nUmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQlyZXR1cm4gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGFrZXMgYW4gZW1udW1lcmF0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZGlyZWN0aXZlIHRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSwgYXR0clZhbHVlOwotCQkvLyBpdGVyYXRlIGFsbCBhdHRyaWJ1dGVzCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQotCQkJCWF0dHJOYW1lID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJCQlpZiAoYXR0ck5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCi0JCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXAoZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQkJfQotCQkJCQlzZXREaXJlY3RpdmVBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0cyB0aGUgYXBwcm9wcmlhdGUgcGFnZSBkaXJlY3RpdmUgYXR0cmlidXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGlyZWN0aXZlQXR0cmlidXRlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJWYWx1ZSkgewotCQlpZiAoYXR0clZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIHVzZXMgZGVmYXVsdCAoaWYgdGhlcmUgd2FzIG9uZSkKLQkJaWYgKGF0dHJOYW1lLmVxdWFscygiZXh0ZW5kcyIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWZTdXBlcmNsYXNzID0gYXR0clZhbHVlOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaW1wb3J0IikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJYWRkSW1wb3J0cyhhdHRyVmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygic2Vzc2lvbiIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGZTZXNzaW9uID0gKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJidWZmZXIiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQkvLyBpZ25vcmUgZm9yIG5vdwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiYXV0b0ZsdXNoIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gaWdub3JlIGZvciBub3cKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImlzVGhyZWFkU2FmZSIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGZUaHJlYWRTYWZlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoYXR0clZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaXNFcnJvclBhZ2UiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmSXNFcnJvclBhZ2UgPSBCb29sZWFuLnZhbHVlT2YoYXR0clZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUluY2x1ZGVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQlpZiAoZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0JCQkJZmlsZUxvY2F0aW9uID0gKGdldEluY2x1ZGVzKCkuZW1wdHkoKSkgPyBnZXRSZXNvbHZlcigpLmdldExvY2F0aW9uQnlVUkkoU3RyaW5nVXRpbHMuc3RyaXAoZmlsZW5hbWUpKSA6IGdldFJlc29sdmVyKCkuZ2V0TG9jYXRpb25CeVVSSShTdHJpbmdVdGlscy5zdHJpcChmaWxlbmFtZSksIChTdHJpbmcpIGdldEluY2x1ZGVzKCkucGVlaygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4KLQkJCQlmaWxlTG9jYXRpb24gPSBTdHJpbmdVdGlscy5zdHJpcChmaWxlbmFtZSk7Ci0JCQl9Ci0JCQkvLyBob3BlZnVsbHksIGEgcmVzb2x2ZXIgaXMgcHJlc2VudCBhbmQgaGFzIHJldHVybmVkIGEgY2Fub25pY2FsCi0JCQkvLyBmaWxlIHBhdGgKLQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhmaWxlTG9jYXRpb24pICYmIGdldEJhc2VMb2NhdGlvbigpICE9IG51bGwgJiYgIWZpbGVMb2NhdGlvbi5lcXVhbHMoZ2V0QmFzZUxvY2F0aW9uKCkpKSB7Ci0JCQkJZ2V0SW5jbHVkZXMoKS5wdXNoKGZpbGVMb2NhdGlvbik7Ci0JCQkJSlNQSW5jbHVkZVJlZ2lvbkhlbHBlciBoZWxwZXIgPSBuZXcgSlNQSW5jbHVkZVJlZ2lvbkhlbHBlcih0aGlzKTsKLQkJCQloZWxwZXIucGFyc2UoZmlsZUxvY2F0aW9uKTsKLQkJCQlnZXRJbmNsdWRlcygpLnBvcCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBVUklSZXNvbHZlciBnZXRSZXNvbHZlcigpIHsKLQkJcmV0dXJuIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpID8gZlN0cnVjdHVyZWRNb2RlbC5nZXRSZXNvbHZlcigpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlTG9jYXRpb24oKSB7Ci0JCWlmIChnZXRSZXNvbHZlcigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldFJlc29sdmVyKCkuZ2V0RmlsZUJhc2VMb2NhdGlvbigpOwotCX0KLQotCXByaXZhdGUgU3RhY2sgZ2V0SW5jbHVkZXMoKSB7Ci0JCWlmIChmSW5jbHVkZXMgPT0gbnVsbCkKLQkJCWZJbmNsdWRlcyA9IG5ldyBTdGFjaygpOwotCQlyZXR1cm4gZkluY2x1ZGVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoU3RyaW5nIG5ld1RleHQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lciwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCkgewotCQlhcHBlbmRUb0J1ZmZlcihFWFBSRVNTSU9OX1BSRUZJWCwgZlVzZXJDb2RlLCBmYWxzZSwgZW1iZWRkZWRDb250YWluZXIpOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fU1VGRklYLCBmVXNlckNvZGUsIGZhbHNlLCBlbWJlZGRlZENvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRGVjbGFyYXRpb25TdHJpbmcoU3RyaW5nIG5ld1RleHQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lciwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCkgewotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckRlY2xhcmF0aW9ucywgdHJ1ZSwgZW1iZWRkZWRDb250YWluZXIsIGpzcFBvc2l0aW9uU3RhcnQsIGpzcFBvc2l0aW9uTGVuZ3RoKTsKLQkJYXBwZW5kVG9CdWZmZXIoRU5ETCwgZlVzZXJEZWNsYXJhdGlvbnMsIGZhbHNlLCBlbWJlZGRlZENvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogdXNlZCBieSBYTUxKU1BSZWdpb25IZWxwZXIgZm9yIGluY2x1ZGVkIEpTUCBmaWxlcwotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGVtYmVkZGVkQ29udGFpbmVyCi0JICogQHBhcmFtIGpzcFBvc2l0aW9uU3RhcnQKLQkgKiBAcGFyYW0ganNwUG9zaXRpb25MZW5ndGgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoU3RyaW5nIG5ld1RleHQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lciwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCkgewotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyAzIG1ldGhvZHMgZGV0ZXJtaW5lIHRoZSBjdXJzb3IgcG9zaXRpb24KLQkvLyA8JT0gJT4KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVFeHByZXNzaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBnZXRVbmVzY2FwZWRSZWdpb25UZXh0KHJlZ2lvbiwgRVhQUkVTU0lPTik7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fUFJFRklYLCBmVXNlckNvZGUsIGZhbHNlLCBmQ3VycmVudE5vZGUpOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGZDdXJyZW50Tm9kZSk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fU1VGRklYLCBmVXNlckNvZGUsIGZhbHNlLCBmQ3VycmVudE5vZGUpOwotCX0KLQotCS8vCi0JLy8gPCUhICU+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRGVjbGFyYXRpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlTdHJpbmcgbmV3VGV4dCA9IGdldFVuZXNjYXBlZFJlZ2lvblRleHQocmVnaW9uLCBERUNMQVJBVElPTik7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyRGVjbGFyYXRpb25zLCB0cnVlLCBmQ3VycmVudE5vZGUpOwotCQlhcHBlbmRUb0J1ZmZlcihFTkRMLCBmVXNlckRlY2xhcmF0aW9ucywgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JfQotCi0JLy8KLQkvLyA8JSAlPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVNjcmlwdGxldChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChyZWdpb24sIFNDUklQVExFVCk7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgZkN1cnJlbnROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdXNpbmcgYSByZWdpb24sIHByb2JhYmx5IGluZGlyZWN0IG1hcHBpbmcgKGVnLiA8JUBwYWdlCi0JICogaW5jbHVkZT0iIiU+KQotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGJ1ZmZlcgotCSAqIEBwYXJhbSBhZGRUb01hcAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24pIHsKLQkJaW50IHN0YXJ0ID0gMCwgbGVuZ3RoID0gMDsKLQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydCA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJbGVuZ3RoID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldExlbmd0aCgpOwotCQl9Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGJ1ZmZlciwgYWRkVG9NYXAsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgc3RhcnQsIGxlbmd0aCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBlbmRUb0J1ZmZlcihTdHJpbmcgbmV3VGV4dCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBhZGRUb01hcCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCkgewotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBidWZmZXIsIGFkZFRvTWFwLCBqc3BSZWZlcmVuY2VSZWdpb24sIGpzcFBvc2l0aW9uU3RhcnQsIGpzcFBvc2l0aW9uTGVuZ3RoLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIG5ld1RleHQgdG8gdGhlIGJ1ZmZlciBwYXNzZWQgaW4sIGFuZCBhZGRzIHRvIHRyYW5zbGF0aW9uIG1hcHBpbmcKLQkgKiBhcyBzcGVjaWZpZWQgYnkgdGhlIGFkZFRvTWFwIGZsYWcuIHNvbWUgc3BlY2lhbCBjYXNlcyB0byBjb25zaWRlciAodGhhdAotCSAqIG1heSBiZSBhZmZlY3RlZCBieSBjaGFuZ2VzIHRvIHRoaXMgbWV0aG9kKTogaW5jbHVkZWQgZmlsZXMgc2NyaXBsZXRzIGluCi0JICogYW4gYXR0cmlidXRlIHZhbHVlIHJlZmFjdG9yaW5nCi0JICogCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcGFyYW0gYnVmZmVyCi0JICogQHBhcmFtIGFkZFRvTWFwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBib29sZWFuIGFkZFRvTWFwLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoLCBib29sZWFuIGlzSW5kaXJlY3QpIHsKLQotCQlpbnQgb3JpZ05ld1RleHRMZW5ndGggPSBuZXdUZXh0Lmxlbmd0aCgpOwotCi0JCS8vIG5vdGhpbmcgdG8gYXBwZW5kCi0JCWlmIChqc3BSZWZlcmVuY2VSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBhZGQgYSBuZXdsaW5lIHNvIHRyYW5zbGF0aW9uIGxvb2tzIGNsZWFuZXIKLQkJaWYgKCFuZXdUZXh0LmVuZHNXaXRoKEVOREwpKQotCQkJbmV3VGV4dCArPSBFTkRMOwotCi0JCWlmIChidWZmZXIgPT0gZlVzZXJDb2RlKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5ld1RleHQpOwotCQkJaWYgKGFkZFRvTWFwKSB7Ci0JCQkJaWYgKGlzVXNlYmVhblRhZyhqc3BSZWZlcmVuY2VSZWdpb24pKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyByZXF1aXJlcyBzcGVjaWFsIG1hcHBpbmcKLQkJCQkJCWFwcGVuZFVzZUJlYW5Ub0J1ZmZlcihuZXdUZXh0LCBqc3BSZWZlcmVuY2VSZWdpb24sIGlzSW5kaXJlY3QpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gc3RpbGwgd29ya2luZyBvdXQga2lua3MKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFsbCBvdGhlciBjYXNlcwotCQkJCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUsIG9yaWdOZXdUZXh0TGVuZ3RoKTsKLQkJCQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCi0JCQkJCWZDb2RlUmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWZPZmZzZXRJblVzZXJDb2RlICs9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoYnVmZmVyID09IGZVc2VyRGVjbGFyYXRpb25zKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5ld1RleHQpOwotCQkJaWYgKGFkZFRvTWFwKSB7Ci0JCQkJUG9zaXRpb24gamF2YVJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMsIG5ld1RleHQubGVuZ3RoKCkpOwotCQkJCVBvc2l0aW9uIGpzcFJhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFBvc2l0aW9uU3RhcnQsIGpzcFBvc2l0aW9uTGVuZ3RoKTsKLQotCQkJCWZEZWNsYXJhdGlvblJhbmdlcy5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJCWZJbmRpcmVjdFJhbmdlcy5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCQl9Ci0JCQlmT2Zmc2V0SW5Vc2VyRGVjbGFyYXRpb25zICs9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1VzZWJlYW5UYWcoSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlib29sZWFuIGlzVXNlQmVhbiA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjg0OTAKLQkJCS8vIGxlbmd0aCBvZiAxMSBpcyB0aGUgbGVuZ3RoIG9mIGpzcDp1c2VCZWFuCi0JCQkvLyBhbmQgc2F2ZXMgdGhlIGV4cGVuc2l2ZSBnZXRUZXh0LmVxdWFscyBjYWxsCi0JCQlpZihyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCWlmIChyLmdldFRleHRMZW5ndGgoKSA9PSAxMSAmJiBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0VGV4dChyKS5lcXVhbHMoImpzcDp1c2VCZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc1VzZUJlYW4gPSB0cnVlOwotCQkJCX0KLQkJCQkvLyBicmVhayBubyBtYXR0ZXIgd2hhdCBpZiB5b3UgaGl0IHRhZ25hbWUKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNVc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbXBvcnROYW1lCi0JICogICAgICAgICAgICBzaG91bGQgYmUganVzdCB0aGUgcGFja2FnZSBwbHVzIHRoZSB0eXBlIGVnLiBqYXZhLnV0aWwuTGlzdAotCSAqICAgICAgICAgICAgb3IgamF2YS51dGlsLioKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgdGhlIDwlQCBwYWdlIGltcG9ydCA9ICJqYXZhLnV0aWwuTGlzdCIlPiByZWdpb24KLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSW1wb3J0VG9CdWZmZXIoU3RyaW5nIGltcG9ydE5hbWUsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJU3RyaW5nIGphdmFJbXBvcnRTdHJpbmcgPSAiaW1wb3J0ICIgKyBpbXBvcnROYW1lICsgIjsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZVc2VySW1wb3J0cy5hcHBlbmQoamF2YUltcG9ydFN0cmluZyk7Ci0JCWlmIChhZGRUb01hcCkgewotCQkJYWRkSW1wb3J0VG9NYXAoaW1wb3J0TmFtZSwganNwUmVmZXJlbmNlUmVnaW9uKTsKLQkJfQotCQlmT2Zmc2V0SW5Vc2VySW1wb3J0cyArPSBqYXZhSW1wb3J0U3RyaW5nLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIG5ldyB0ZXh0IGNhbiBiZSBzb21ldGhpbmcgbGlrZTogImltcG9ydCBqYXZhLmxhbmcuT2JqZWN0O1xuIgotCSAqIAotCSAqIGJ1dCB0aGUgcmVmZXJlbmNlIHJlZ2lvbiBjb3VsZCBoYXZlIGJlZW4gc29tZXRoaW5nIGxpa2U6IDwlQHBhZ2UKLQkgKiBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsIGphdmEuaW8uKiwgamF2YS51dGlsLkxpc3QiJT4KLQkgKiAKLQkgKiBzbyB0aGUgZXhhY3QgbWFwcGluZyBoYXMgdG8gYmUgY2FsY3VsYXRlZCBjYXJlZnVsbHkuCi0JICogCi0JICogaXNJbmRpcmVjdCBtZWFucyB0aGF0IHRoZSBpbXBvcnQgY2FtZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUgKGlmIHRydWUpCi0JICogCi0JICogQHBhcmFtIGltcG9ydE5hbWUKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEltcG9ydFRvTWFwKFN0cmluZyBpbXBvcnROYW1lLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0KLQkJLy8gbWFzc2FnZSB0ZXh0Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcoaW1wb3J0TmFtZS5pbmRleE9mKCJpbXBvcnQgIikKLQkJLy8gKyA3LCBpbXBvcnROYW1lLmluZGV4T2YoJzsnKSk7Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS50cmltKCk7Ci0KLQkJLy8gdGhlc2UgcG9zaXRpb25zIHdpbGwgYmUgdXBkYXRlZCBiZWxvdwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckltcG9ydHMgKyA3LCAxKTsKLQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0KCksIGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gY2FsY3VsYXRlIEpTUCByYW5nZSBieSBmaW5kaW5nICJpbXBvcnQiIGF0dHJpYnV0ZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBzaXplID0gcmVnaW9ucy5zaXplKCk7Ci0KLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBsZW5ndGggPSAtMTsKLQotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpLnRyaW0oKS5lcXVhbHMoImltcG9ydCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZ2V0IHRoZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQlpZiAoc2l6ZSA+IGkgKyAyKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSArIDIpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQotCQkJCQkJCVN0cmluZyBqc3BJbXBvcnRUZXh0ID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJCQkvLyB0aGUgcG9zaXRpb24gaW4gcXVlc3Rpb24gKGluIHRoZSBKU1ApIGlzIHdoYXQKLQkJCQkJCQkvLyBpcyBicmFja2V0ZWQgYmVsb3cKLQkJCQkJCQkvLyBpbmNsdWRlcyB3aGl0ZXNwYWNlCi0JCQkJCQkJLy8gPCVAcGFnZSBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsWyBqYXZhLmlvLiogXSwKLQkJCQkJCQkvLyBqYXZhLnV0aWwuTGlzdCIlPgotCi0JCQkJCQkJLy8gaW4gdGhlIGphdmEgZmlsZQotCQkJCQkJCS8vIGltcG9ydCBbIGphdmEuaW8uKiBdOwotCi0JCQkJCQkJc3RhcnQgPSBqc3BJbXBvcnRUZXh0LmluZGV4T2YoaW1wb3J0TmFtZSk7Ci0JCQkJCQkJbGVuZ3RoID0gaW1wb3J0TmFtZS5sZW5ndGgoKTsKLQotCQkJCQkJCS8vIHNhZmV0eSwgZG9uJ3QgYWRkIHRvIG1hcCBpZiBiYWQgcG9zaXRpb25pbmcKLQkJCQkJCQlpZiAoc3RhcnQgPT0gLTEgfHwgbGVuZ3RoIDwgMSkKLQkJCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCQkvLyB1cGRhdGUganNwIHJhbmdlCi0JCQkJCQkJanNwUmFuZ2Uuc2V0T2Zmc2V0KGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHN0YXJ0KTsKLQkJCQkJCQlqc3BSYW5nZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJCS8vIHVwZGF0ZSBqYXZhIHJhbmdlCi0JCQkJCQkJamF2YVJhbmdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQotCQkvLyBzYWZldHkgZm9yIGJhZCByYW5nZXMKLQkJaWYgKHN0YXJ0ICE9IC0xICYmIGxlbmd0aCA+IDEpIHsKLQkJCS8vIHB1dCByYW5nZXMgaW4gamF2YSAtPiBqc3AgcmFuZ2UgbWFwCi0JCQlmSW1wb3J0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRlbXAgZml4IGZvciAyODIyOTUgdW50aWwgYmV0dGVyIG1hcHBpbmcgaXMgaW4gcGxhY2UKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVXNlQmVhblRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBib29sZWFuIGlzSW5kaXJlY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBqYXZhIHN0cmluZyBsb29rcyBsaWtlIHRoaXMgKHRva2VuaXplZCkKLQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUoKTtcbgotCQkvLyAwIDEgMiAzIDQKLQkJLy8gb3IKLQkJLy8gVHlwZSBpZCA9IG51bGw7XG4gLy8gaWYgdGhlcmUgaXMgbm8gY2xhc3NuYW1lCi0JCS8vIDAgMSAyIDMKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIGNhbGN1bGF0ZSBqYXZhIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3VGV4dCwgIiAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlTdHJpbmdbXSBwYXJzZWRKYXZhID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCXBhcnNlZEphdmFbaSsrXSA9IHN0Lm5leHRUb2tlbigpOwotCi0JCVN0cmluZyB0eXBlID0gcGFyc2VkSmF2YVswXSAhPSBudWxsID8gcGFyc2VkSmF2YVswXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZCA9IHBhcnNlZEphdmFbMV0gIT0gbnVsbCA/IHBhcnNlZEphdmFbMV0gOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lID0gcGFyc2VkSmF2YS5sZW5ndGggPiA0ID8gcGFyc2VkSmF2YVs0XSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJUG9zaXRpb24gamF2YVR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgdHlwZS5sZW5ndGgoKSk7Ci0JCVBvc2l0aW9uIGphdmFJZFJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEsIGlkLmxlbmd0aCgpKTsKLQkJUG9zaXRpb24gamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgMCk7Ci0JCWlmIChjbGFzc05hbWUubGVuZ3RoKCkgPj0gNCkgewotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MTMyCi0JCQlpbnQgY2xhc3NOYW1lTGVuZ3RoID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUuaW5kZXhPZignKCcpKS5sZW5ndGgoKTsKLQkJCWphdmFDbGFzc1JhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEgKyBpZC5sZW5ndGgoKSArIDcsIGNsYXNzTmFtZUxlbmd0aCk7Ci0JCX0KLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gY2FsY3VsYXRlIGpzcCByYW5nZXMKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiLCBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBxdW90ZU9mZnNldCA9IDA7Ci0JCVBvc2l0aW9uIGpzcFR5cGVSYW5nZSA9IG51bGw7Ci0JCVBvc2l0aW9uIGpzcElkUmFuZ2UgPSBudWxsOwotCQlQb3NpdGlvbiBqc3BDbGFzc1JhbmdlID0gbnVsbDsKLQotCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChqKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlhdHRyTmFtZSA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCWlmIChyZWdpb25zLnNpemUoKSA+PSBqICsgMiAmJiByZWdpb25zLmdldChqICsgMikuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJLy8gZ2V0IGF0dHIgdmFsdWUKLQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGogKyAyKTsKLQkJCQkJYXR0clZhbHVlID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJLy8gbWF5IGhhdmUgcXVvdGVzCi0JCQkJCXF1b3RlT2Zmc2V0ID0gKGF0dHJWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGF0dHJWYWx1ZS5zdGFydHNXaXRoKCInIikpID8gMSA6IDA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoInR5cGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJanNwVHlwZVJhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHF1b3RlT2Zmc2V0LCBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UoYXR0clZhbHVlKS5sZW5ndGgoKSk7Ci0JCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJanNwSWRSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BSZWZlcmVuY2VSZWdpb24uZ2V0U3RhcnRPZmZzZXQocikgKyBxdW90ZU9mZnNldCwgU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKGF0dHJWYWx1ZSkubGVuZ3RoKCkpOwotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImNsYXNzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcENsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgcXVvdGVPZmZzZXQsIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShhdHRyVmFsdWUpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBwdXQgcmFuZ2VzIGluIGphdmEgLT4ganNwIHJhbmdlIG1hcAotCQlpZiAoIXR5cGUuZXF1YWxzKCIiKSAmJiBqc3BUeXBlUmFuZ2UgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlmQ29kZVJhbmdlcy5wdXQoamF2YVR5cGVSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJCS8vIG5vdGU6IGRvbid0IHVwZGF0ZSBvZmZzZXRzIGZvciB0aGlzIG1hcCB3aGVuIHJlc3VsdCBpcyBidWlsdAotCQkJLy8gdGhleSdsbCBiZSB1cGRhdGVkIHdoZW4gY29kZSByYW5nZXMgb2Zmc2V0cyBhcmUgdXBkYXRlZAotCQkJZlVzZUJlYW5SYW5nZXMucHV0KGphdmFUeXBlUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFUeXBlUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCX0KLQkJaWYgKCFpZC5lcXVhbHMoIiIpICYmIGpzcElkUmFuZ2UgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlmQ29kZVJhbmdlcy5wdXQoamF2YUlkUmFuZ2UsIGpzcElkUmFuZ2UpOwotCQkJLy8gbm90ZTogZG9uJ3QgdXBkYXRlIG9mZnNldHMgZm9yIHRoaXMgbWFwIHdoZW4gcmVzdWx0IGlzIGJ1aWx0Ci0JCQkvLyB0aGV5J2xsIGJlIHVwZGF0ZWQgd2hlbiBjb2RlIHJhbmdlcyBvZmZzZXRzIGFyZSB1cGRhdGVkCi0JCQlmVXNlQmVhblJhbmdlcy5wdXQoamF2YUlkUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JCWlmICghY2xhc3NOYW1lLmVxdWFscygiIikgJiYganNwQ2xhc3NSYW5nZSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb2RlUmFuZ2VzLnB1dChqYXZhQ2xhc3NSYW5nZSwganNwQ2xhc3NSYW5nZSk7Ci0JCQkvLyBub3RlOiBkb24ndCB1cGRhdGUgb2Zmc2V0cyBmb3IgdGhpcyBtYXAgd2hlbiByZXN1bHQgaXMgYnVpbHQKLQkJCS8vIHRoZXknbGwgYmUgdXBkYXRlZCB3aGVuIGNvZGUgcmFuZ2VzIG9mZnNldHMgYXJlIHVwZGF0ZWQKLQkJCWZVc2VCZWFuUmFuZ2VzLnB1dChqYXZhQ2xhc3NSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJCWlmIChpc0luZGlyZWN0KQotCQkJCWZJbmRpcmVjdFJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJ1ZmZlciB0byB0aGUgY3VycmVudCBKU1BUeXBlOiBTVEFOREFSRF9KU1AsIEVNQkVEREVEX0pTUCwKLQkgKiBERUNMQVJBVElPTiwgRVhQUkVTU0lPTiwgU0NSSVBUTEVUIChmb3Iga2VlcHRpbmcgdHJhY2sgb2YgY3Vyc29yCi0JICogcG9zaXRpb24gd2hlbiB0aGUgZmluYWwgZG9jdW1lbnQgaXMgYnVpbHQpCi0JICogCi0JICogQHBhcmFtIEpTUFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBKU1AgdHlwZSB0aGF0IHRoZSBjdXJzb3IgaXMgaW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXJzb3JPd25lcihpbnQgSlNQVHlwZSkgewotCQlzd2l0Y2ggKEpTUFR5cGUpIHsKLQkJCWNhc2UgREVDTEFSQVRJT04gOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyRGVjbGFyYXRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVhQUkVTU0lPTiA6Ci0JCQljYXNlIFNDUklQVExFVCA6Ci0JCQkJc2V0Q3Vyc29yT3duZXIoZlVzZXJDb2RlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyQ29kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHBpZWNlIG9mIGNvZGUgaXRlcmF0ZXMgdGhyb3VnaCBmQ3VycmVudE5vZGVzIGFuZCBjbHVtcHMgdGhlbQotCSAqIHRvZ2V0aGVyIGluIGEgYmlnIHRleHQgc3RyaW5nIC0gdW5lc2NhcGluZyBjaGFyYWN0ZXJzIGlmIHRoZXkgYXJlIG5vdAotCSAqIENEQVRBIC0gc2ltcGx5IGFwcGVuZGluZyBpZiB0aGV5IGFyZSBDREFUQSBpdCBzdG9wcyBpdGVyYXRpb24gd2hlbiBpdAotCSAqIGhpdHMgYSBub2RlIHRoYXQgaXMgYW4gWE1MX1RBR19OQU1FICh3aGljaCBzaG91bGQgYmUgdGhlIHJlZ2lvbiBjbG9zaW5nCi0JICogdGFnKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gc3RSZWdpb24sIGludCBKU1BUeXBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBzdGFydCA9IHN0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzdFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJLy8gYWRqdXN0bWVudCBuZWNlc3NhcnkgZm9yIGVtYmVkZGVkIHJlZ2lvbiBjb250YWluZXJzCi0JCWlmIChzdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyICYmIHN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCWlmIChzdFJlZ2lvbi5nZXRSZWdpb25zKCkgIT0gbnVsbCAmJiBzdFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkgewotCQkJCUlUZXh0UmVnaW9uIGpzcENvbnRlbnQgPSBzdFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOyAvLyBzaG91bGQKLQkJCQkvLyBiZQotCQkJCS8vIGpzcENvbnRlbnQKLQkJCQkvLyByZWdpb24KLQkJCQlzdGFydCA9IHN0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGpzcENvbnRlbnQpOwotCQkJCWVuZCA9IHN0UmVnaW9uLmdldEVuZE9mZnNldChqc3BDb250ZW50KTsKLQkJCX0KLQkJfQotCQlpbnQgQ0RBVEFPZmZzZXQgPSAwOyAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyBsb3N0IGluIGNvbnZlcnNpb24KLQkJaW50IGJ1ZmZlclNpemUgPSAwOwotCQlpZiAoc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UIHx8IHN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgLy8gbmVlZAotCQkJCQkvLyB0aGlzCi0JCQkJCS8vIGZvcgotCQkJCQkvLyBlbWJlZGRlZAotCQkJCQkvLyBKU1AKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQl8fCBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIC8vIG5lZWQKLQkJLy8gdGhpcwotCQkvLyBpbgotCQkvLyBjYXNlCi0JCS8vIHRoZXJlJ3MKLQkJLy8gbm8KLQkJLy8gcmVnaW9uLi4uCi0JCXsKLQkJCWZJbkNvZGVSZWdpb24gPSAoc3RhcnQgPD0gZlNvdXJjZVBvc2l0aW9uICYmIGZTb3VyY2VQb3NpdGlvbiA8PSBlbmQpOwotCQkJaWYgKGZJbkNvZGVSZWdpb24pIHsKLQkJCQlzZXRDdXJzb3JPd25lcihKU1BUeXBlKTsKLQkJCQlzZXRSZWxhdGl2ZU9mZnNldCgoZlNvdXJjZVBvc2l0aW9uIC0gc3RhcnQpICsgZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSk7Ci0JCQkJaWYgKEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQkvLyBpZiBhbiBleHByZXNzaW9uLCBhZGQgdGhlbiBsZW5ndGggb2YgdGhlIGVuY2xvc2luZwotCQkJCQkvLyBwYXJlbi4uCi0JCQkJCXNldEN1cnNvckluRXhwcmVzc2lvbih0cnVlKTsKLQkJCQkJc2V0UmVsYXRpdmVPZmZzZXQoZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEVYUFJFU1NJT05fUFJFRklYLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbiBqc3BDb250ZW50ID0gbnVsbDsKLQkJCWlmIChzdFJlZ2lvbi5nZXRSZWdpb25zKCkgIT0gbnVsbCAmJiBzdFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkKLQkJCQlqc3BDb250ZW50ID0gc3RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCXJldHVybiAoanNwQ29udGVudCAhPSBudWxsKSA/IHN0UmVnaW9uLmdldEZ1bGxUZXh0KGpzcENvbnRlbnQpIDogc3RSZWdpb24uZ2V0RnVsbFRleHQoKTsgLy8gZG9uJ3QKLQkJCS8vIHVuZXNjYXBlCi0JCQkvLyBpZgotCQkJLy8gaXQncwotCQkJLy8gbm90Ci0JCQkvLyBhbgotCQkJLy8gWE1MSlNQCi0JCQkvLyB0YWcKLQkJfQotCQllbHNlIGlmIChzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQkvLyBuZWVkIHRvIGRldGVybWluZSBjdXJzb3Igb3duZXIgc28gdGhhdCB0aGUgZkN1cm9zb3JQb3NpdGlvbgotCQkJLy8gd2lsbCBiZQotCQkJLy8gY29ycmVjdCBldmVuIGlmIHRoZXJlIGlzIG5vIHJlZ2lvbiBhZnRlciB0aGUgY3Vyc29yIGluIHRoZSBKU1AKLQkJCS8vIGZpbGUKLQkJCXNldEN1cnNvck93bmVyKEpTUFR5cGUpOwotCQl9Ci0JCS8vIGl0ZXJhdGUgWE1MQ09OVEVOVCBhbmQgQ0RBVEEgcmVnaW9ucwotCQkvLyBsb29wIGZDdXJyZW50Tm9kZSB1bnRpbCB5b3UgaGl0IDwvanNwOnNjcmlwdGxldD4gKG9yIG90aGVyIGNsb3NpbmcKLQkJLy8gdGFnIG5hbWUpCi0JCXdoaWxlIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwgJiYgZ2V0Q3VycmVudE5vZGUoKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIC8vIG5lZWQKLQkJLy8gdG8KLQkJLy8gc3RvcAotCQkvLyBvbgotCQkvLyB0aGUKLQkJLy8gZW5kaW5nCi0JCS8vIHRhZwotCQkvLyBuYW1lLi4uCi0JCXsKLQkJCXN0YXJ0ID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWJ1ZmZlclNpemUgPSBidWZmZXIubGVuZ3RoKCk7Ci0JCQlDREFUQU9mZnNldCA9IHVuZXNjYXBlUmVnaW9uKGdldEN1cnJlbnROb2RlKCksIGJ1ZmZlcik7Ci0JCQlmSW5Db2RlUmVnaW9uID0gKHN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiBmU291cmNlUG9zaXRpb24gPD0gZW5kKTsKLQkJCWlmIChmSW5Db2RlUmVnaW9uKSB7Ci0JCQkJc2V0Q3Vyc29yT3duZXIoSlNQVHlwZSk7Ci0JCQkJLy8gdGhpcyBvZmZzZXQgaXMgc29ydCBvZiBjb21wbGljYXRlZC4uLgotCQkJCS8vIGl0J3MgY29tcG9zZWQgb2Y6Ci0JCQkJLy8gMS4gdGhlIGxlbmd0aCBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcmVnaW9uIHVwIHRpbGwKLQkJCQkvLyB3aGVyZSB0aGUgY3Vyc29yIGlzCi0JCQkJLy8gMi4gbWludXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxvc3QgaW4gQ0RBVEEgdHJhbnNsYXRpb24KLQkJCQkvLyAzLiBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGVzY2FwZWQgYnVmZmVyIGJlZm9yZSB0aGUgY3VycmVudAotCQkJCS8vIHJlZ2lvbiwgYnV0Ci0JCQkJLy8gaXMgc3RpbGwgd2l0aGluIHRoZSBqc3AgdGFnCi0JCQkJc2V0UmVsYXRpdmVPZmZzZXQoKGZTb3VyY2VQb3NpdGlvbiAtIGdldEN1cnJlbnROb2RlKCkuZ2V0U3RhcnRPZmZzZXQoKSkgKyBnZXRDdXJzb3JPd25lcigpLmxlbmd0aCgpIC0gQ0RBVEFPZmZzZXQgKyBidWZmZXJTaXplKTsKLQkJCQlpZiAoSlNQVHlwZSA9PSBFWFBSRVNTSU9OKSB7Ci0JCQkJCXNldEN1cnNvckluRXhwcmVzc2lvbih0cnVlKTsKLQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJLy8gcGFyZW4uLgotCQkJCQlzZXRSZWxhdGl2ZU9mZnNldChnZXRSZWxhdGl2ZU9mZnNldCgpICsgRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpCi0JCQkJYWR2YW5jZU5leHROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIHRvIGJlIHVuZXNjYXBlZCAoWE1MQ29udGVudCwgWE1MIEVOVElUWQotCSAqICAgICAgICAgICAgUkVGRVJFTkNFLCBvciBDREFUQSkKLQkgKiBAcGFyYW0gc2IKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmdidWZmZXIgdG8gYXBwZW5kIHRoZSB0ZXh0IHRvCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtb3ZlZCBpbiB1bmVzY2FwaW5nIHRoaXMgdGV4dAotCSAqLwotCXByb3RlY3RlZCBpbnQgdW5lc2NhcGVSZWdpb24oSVRleHRSZWdpb24gciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aEJlZm9yZSA9IDAsIGxlbmd0aEFmdGVyID0gMCwgY2RhdGFfdGFnc19sZW5ndGggPSAwOwotCQlpZiAociAhPSBudWxsICYmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpKSB7Ci0JCQlsZW5ndGhCZWZvcmUgPSAoZ2V0Q3VycmVudE5vZGUoKSAhPSByKSA/IGdldEN1cnJlbnROb2RlKCkuZ2V0RnVsbFRleHQocikubGVuZ3RoKCkgOiBnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KCkubGVuZ3RoKCk7Ci0JCQlzID0gRXNjYXBlZFRleHRVdGlsLmdldFVuZXNjYXBlZFRleHQoZ2V0Q3VycmVudE5vZGUoKSwgcik7Ci0JCQlsZW5ndGhBZnRlciA9IHMubGVuZ3RoKCk7Ci0JCQlzYi5hcHBlbmQocyk7Ci0JCX0KLQkJZWxzZSBpZiAociAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIC8vIG9ubHkgaW50ZXJlc3RlZCBpbgotCQkJLy8gY29udGVudHMKLQkJCXsKLQkJCQkvLyBuYXZpZ2F0ZSB0byBuZXh0IHJlZ2lvbiBjb250YWluZXIgKHdoaWNoIHNob3VsZCBiZSBhIEpTUAotCQkJCS8vIHJlZ2lvbikKLQkJCQlJdGVyYXRvciBpdCA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHIpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyIHx8IHRlbXAuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCQkJCXNiLmFwcGVuZChnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KHRlbXApKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0ZW1wLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHRlbXAuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB7Ci0JCQkJCQljZGF0YV90YWdzX2xlbmd0aCArPSB0ZW1wLmdldExlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAobGVuZ3RoQmVmb3JlIC0gbGVuZ3RoQWZ0ZXIgKyBjZGF0YV90YWdzX2xlbmd0aCk7Ci0JfQotCi0JLy8KLQkvLyA8anNwOnVzZUJlYW4+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlVXNlQmVhbihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgYXR0clZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLQotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIChyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgci5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCi0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyTmFtZSA9IGNvbnRhaW5lci5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoY29udGFpbmVyLmdldFRleHQocikpOwotCQkJCQl9Ci0JCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQl9Ci0JCQkJLy8gYW4gYXR0cmlidXRlIHdpdGggbm8gZXF1YWxzPwotCQkJfQotCQkJLy8gKHBhKSBtaWdodCBuZWVkIGRpZmZlcmVudCBsb2dpYyBoZXJlIGlmIHdlIHdhbm5hIHN1cHBvcnQgbW9yZQotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWlkID0gYXR0clZhbHVlOwotCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQljbGFzc05hbWUgPSBhdHRyVmFsdWU7Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJ0eXBlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdHlwZSA9IGF0dHJWYWx1ZTsKLQkJCX0KLQotCQl9Ci0JCS8vIGhhcyBpZCB3LyB0eXBlIGFuZC9vciBjbGFzc25hbWUKLQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUoKTsKLQkJLy8gb3IKLQkJLy8gVHlwZSBpZCA9IG51bGw7IC8vIGlmIHRoZXJlIGlzIG5vIGNsYXNzbmFtZQotCQlpZiAoaWQgIT0gbnVsbCAmJiAodHlwZSAhPSBudWxsIHx8IGNsYXNzTmFtZSAhPSBudWxsKSkgewotCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQl0eXBlID0gY2xhc3NOYW1lOwotCQkJU3RyaW5nIHByZWZpeCA9IHR5cGUgKyAiICIgKyBpZCArICIgPSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBzdWZmaXggPSAibnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJCXN1ZmZpeCA9ICJuZXcgIiArIGNsYXNzTmFtZSArICIoKTsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWFwcGVuZFRvQnVmZmVyKHByZWZpeCArIHN1ZmZpeCwgZlVzZXJDb2RlLCB0cnVlLCBmQ3VycmVudE5vZGUpOwotCQl9Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckluRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JJbkV4cHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29ySW5FeHByZXNzaW9uKGJvb2xlYW4gaW4pIHsKLQkJZkN1cnNvckluRXhwcmVzc2lvbiA9IGluOwotCX0KLQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldFNvdXJjZUN1cnNvcihpbnQgaSkgewotCQlmU291cmNlUG9zaXRpb24gPSBpOwotCX0KLQotCWZpbmFsIHB1YmxpYyBpbnQgZ2V0U291cmNlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmU291cmNlUG9zaXRpb247Ci0JfQotCi0JZmluYWwgcHVibGljIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCkgewotCQlyZXR1cm4gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZU9mZnNldChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKLQkJdGhpcy5mUmVsYXRpdmVPZmZzZXQgPSByZWxhdGl2ZU9mZnNldDsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgaW50IGdldFJlbGF0aXZlT2Zmc2V0KCkgewotCQlyZXR1cm4gZlJlbGF0aXZlT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDdXJzb3JPd25lcihTdHJpbmdCdWZmZXIgY3Vyc29yT3duZXIpIHsKLQkJdGhpcy5mQ3Vyc29yT3duZXIgPSBjdXJzb3JPd25lcjsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEN1cnNvck93bmVyKCkgewotCQlyZXR1cm4gZkN1cnNvck93bmVyOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRDdXJyZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlKSB7Ci0JCXJldHVybiB0aGlzLmZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwotCX0KLQotCWZpbmFsIHB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEN1cnJlbnROb2RlKCkgewotCQlyZXR1cm4gZkN1cnJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RUxQcm9ibGVtcygpIHsKLQkJcmV0dXJuIGZFTFByb2JsZW1zOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZWM4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvWE1MSlNQUmVnaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQYXJzZXIvaGVscGVyIGNsYXNzIGZvciBKU1BUcmFuc2xhdG9yLiAgVXNlZCBmb3IgcGFyc2luZyBYTUwtSlNQIHJlZ2lvbnMgKGluIGEgc2NyaXB0IGJsb2NrKQotICogQSBsb3Qgb2YgbG9naWMgYm9ycm93ZWQgZnJvbSBUTERDTURvY3VtZW50TWFuYWdlci4gIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBYTUxKU1BSZWdpb25IZWxwZXIgcGVyIHRleHQgZmlsZQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBYTUxKU1BSZWdpb25IZWxwZXIgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQlwcml2YXRlIGZpbmFsIEpTUFRyYW5zbGF0b3IgZlRyYW5zbGF0b3I7Ci0JcHJvdGVjdGVkIEpTUFNvdXJjZVBhcnNlciBmTG9jYWxQYXJzZXIgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlRleHRUb1BhcnNlID0gbnVsbDsKLQkvLyBuZWVkIHRoaXMgaWYgbm90IGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgKGVnLiBwYXJzaW5nIGp1c3QgYSBzY3JpcHQgYmxvY2spCi0JcHJvdGVjdGVkIGludCBmU3RhcnRPZlRleHRUb1BhcnNlID0gMDsKLQkvLyBuYW1lIG9mIHRoZSBvcGVuIHRhZyB0aGF0IHdhcyBsYXN0IGhhbmRsZWQgKGlmIHdlIGFyZSBpbnRlcmVzdGVkIGluIGl0KQotCXByb3RlY3RlZCBTdHJpbmcgZlRhZ25hbWUgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlRleHRCZWZvcmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgZlVuZXNjYXBlZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgZlN0cmlwcGVkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JLy8gZm9yIHJlY29uY2lsaW5nIGN1cnNvciBwb3NpdGlvbiBsYXRlcgotCWludCBmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuU0NSSVBUTEVUOwotCi0JcHVibGljIFhNTEpTUFJlZ2lvbkhlbHBlcihKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQl0aGlzLmZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlNQU291cmNlUGFyc2VyIGdldExvY2FsUGFyc2VyKCkgewotCQlpZiAoZkxvY2FsUGFyc2VyID09IG51bGwpCi0JCQlmTG9jYWxQYXJzZXIgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCXJldHVybiBmTG9jYWxQYXJzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWZMb2NhbFBhcnNlci5hZGRCbG9ja01hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyB0ZXh0VG9QYXJzZSkgewotCQlyZXNldCh0ZXh0VG9QYXJzZSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHRleHRUb1BhcnNlLCBpbnQgc3RhcnQpIHsKLQkJZlN0YXJ0T2ZUZXh0VG9QYXJzZSA9IHN0YXJ0OwotCQlnZXRMb2NhbFBhcnNlcigpLnJlc2V0KHRleHRUb1BhcnNlKTsKLQkJZlRleHRUb1BhcnNlID0gdGV4dFRvUGFyc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9yY2VQYXJzZSgpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJZkxvY2FsUGFyc2VyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHBhcnNlIGFuIGVudGlyZSBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCS8vIGZyb20gb3V0ZXIgY2xhc3MKLQkJTGlzdCBibG9ja01hcmtlcnMgPSB0aGlzLmZUcmFuc2xhdG9yLmdldEJsb2NrTWFya2VycygpOwotCQlyZXNldChnZXRDb250ZW50cyhmaWxlbmFtZSkpOwotCQkvLyB0aGlzIGFkZHMgdGhlIGN1cnJlbnQgbWFya2VycyBmcm9tIHRoZSBvdXRlciBjbGFzcyBsaXN0Ci0JCS8vIHRvIHRoaXMgcGFyc2VyIHNvIHBhcnNpbmcgd29ya3MgY29ycmVjdGx5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlhZGRCbG9ja01hcmtlcigoQmxvY2tNYXJrZXIpIGJsb2NrTWFya2Vycy5nZXQoaSkpOwotCQl9Ci0JCWZvcmNlUGFyc2UoKTsKLQl9Ci0KLQotCS8qCi0JICogbGlzdGVucyB0byBwYXJzZXIgbm9kZSBwYXJzZWQgZXZlbnRzCi0JICogYWRkcyB0byBsb2NhbCBzY3JpcGxldCwgZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24gYnVmZmVycwotCSAqIGRldGVybWluZXMgd2hpY2ggdHlwZSBvZiByZWdpb24gdGhlIGN1cnNvciBpcyBpbiwgYW5kIGFkanVzdHMgY3Vyc29yIG9mZnNldCBhY2NvcmRpbmdseSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQl0cnkgewotCQkJCi0JCQloYW5kbGVTY29waW5nSWZOZWNlc3Nhcnkoc2RSZWdpb24pOwotCQkJCi0JCQlpZiAoaXNKU1BTdGFydFJlZ2lvbihzZFJlZ2lvbikpIHsKLQkJCQlTdHJpbmcgbmFtZVN0ciA9IGdldFJlZ2lvbk5hbWUoc2RSZWdpb24pOwotCQkJCWlmIChpc0pTUFJlZ2lvbihuYW1lU3RyKSkKLQkJCQkJZlRhZ25hbWUgPSBuYW1lU3RyOwotCQkJCWVsc2UKLQkJCQkJZlRhZ25hbWUgPSBudWxsOwotCQkJCQotCi0JCQkJLy8gdGhpcyBzZWN0aW9uIGFzc3VtZXMgaW1wb3J0YW50IGNvbnRlbnQgKHRvIHRyYW5zbGF0ZSkKLQkJCQkvLyBJUyB0aGUgb3BlbmluZyB0YWcKLQkJCQkKLQkJCQkvLyBoYW5kbGUgaW5jbHVkZSBhbmQgZGlyZWN0aXZlCi0JCQkJaWYoZlRhZ25hbWUgIT0gbnVsbCAmJiBzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHsKLQkJCQkJcHJvY2Vzc090aGVyUmVnaW9ucyhzZFJlZ2lvbik7CQotCQkJCX0KLQkJCQkvLyBoYW5kbGUganNwOnVzZUJlYW4KLQkJCQlpZihmVGFnbmFtZSAhPSBudWxsICYmIGZUYWduYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKSkgewotCQkJCQlwcm9jZXNzVXNlQmVhbihzZFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCS8vIHRoaXMgc2VjdGlvbiBhc3N1bWVzIGltcG9ydGFudCBjb250ZW50ICh0byB0cmFuc2xhdGUpCi0JCQkJLy8gaXMgQUZURVIgdGhlIG9wZW5pbmcgdGFnCi0JCQkJaWYgKGZUYWduYW1lICE9IG51bGwpIHsKLQkJCQkJLy8gYXNzaWduIGNvbnRlbnRzIHRvIG9uZSBvZiB0aGUgdGFibGVzCi0JCQkJCWlmIChpc1NjcmlwdGxldChmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NTY3JpcHRsZXQoc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzRXhwcmVzc2lvbihmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NFeHByZXNzaW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0RlY2xhcmF0aW9uKGZUYWduYW1lKSkgewotCQkJCQkJcHJvY2Vzc0RlY2xhcmF0aW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUYWduYW1lID0gbnVsbDsKLQkJCX0KLQkJCS8vIHRoaXMgdXBkYXRlcyBjdXJzb3IgcG9zaXRpb24KLQkJCWNoZWNrQ3Vyc29ySW5SZWdpb24oc2RSZWdpb24pOwotCQl9Ci0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2dnaW5nIHRoaXMgZXhjZXB0aW9uIHRoYXQgSSd2ZSBzZWVuIGEgY291cGxlIG9mIHRpbWVzLi4uCi0JCQkvLyBzZWVtcyB0byBoYXBwZW4gZHVyaW5nIHNodXRkb3duIG9mIHVuaXQgdGVzdHMsIGF0IHdoaWNoIAotCQkJLy8gcG9pbnQgTG9nZ2VyIGhhcyBhbHJlYWR5IGJlZW4gdW5sb2FkZWQKLQkJCXRyeSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJYTUxKU1BSZWdpb25IZWxwZXI6IGV4Y2VwdGlvbiBpbiBub2RlIHBhcnNpbmciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4KSB7Ci0JCQkJLy8gZG8gbm90aGluZywgc2luY2Ugd2UncmUganVzdCBlbmRpbmcKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTY29waW5nSWZOZWNlc3NhcnkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCi0JCS8vIGZpeCB0byBtYWtlIHN1cmUgY3VzdG9tIHRhZyBibG9jayBoYXZlIHRoZWlyIG93biBzY29wZQotCQkvLyB3ZSBhZGQgJ3snIGZvciBjdXN0b20gdGFnIG9wZW4gYW5kICd9JyBmb3IgY3VzdG9tIHRhZyBjbG9zZQotCQkvLyBpbiB0aGUgdHJhbnNsYXRpb24KLQkJaWYoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCWlmKCFpc1NlbGZDbG9zaW5nVGFnKHNkUmVnaW9uKSkgewotCQkJCVN0cmluZyBuYW1lU3RyID0gZ2V0UmVnaW9uTmFtZShzZFJlZ2lvbik7Ci0JCQkJaWYoaXNQb3NzaWJsZUN1c3RvbVRhZyhuYW1lU3RyKSkgewotCQkJCQlzdGFydFNjb3BlKG5hbWVTdHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJU3RyaW5nIG5hbWVTdHIgPSBnZXRSZWdpb25OYW1lKHNkUmVnaW9uKTsKLQkJCWlmKGlzUG9zc2libGVDdXN0b21UYWcobmFtZVN0cikpIHsKLQkJCQllbmRTY29wZShuYW1lU3RyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxmQ2xvc2luZ1RhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0JCQotCQlpZihjb250YWluZXJSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpLTEpOwotCQlyZXR1cm4gci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNjb3BlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBmVHJhbnNsYXRvci5nZXRDdXJyZW50Tm9kZSgpOwotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdGV4dC5hcHBlbmQoInsgLy8gPCIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKHRhZ05hbWUpOwotCQl0ZXh0LmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcodGV4dC50b1N0cmluZygpLCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kU2NvcGUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCk7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0ZXh0LmFwcGVuZCgifSAvLyA8LyIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKHRhZ05hbWUpOwotCQl0ZXh0LmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcodGV4dC50b1N0cmluZygpLCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ3Vyc29ySW5SZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQkvLyBpZiBjdXJzb3IgaXMgaW4gdGhpcyByZWdpb24uLi4KLQkJaWYgKHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSA+PSBmU3RhcnRPZlRleHRUb1BhcnNlICsgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSAmJiB0aGlzLmZUcmFuc2xhdG9yLmdldFNvdXJjZVBvc2l0aW9uKCkgPD0gZlN0YXJ0T2ZUZXh0VG9QYXJzZSArIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKSB7Ci0JCQlpbnQgZW5kT2ZOYW1lVGFnID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBvZmZzZXQgPSBmVGV4dEJlZm9yZS5sZW5ndGgoKSAtIGZTdHJpcHBlZFRleHQubGVuZ3RoKCk7Ci0JCQkvLyBvZmZzZXQgaW4gYWRkdGlvbiB0byB3aGF0J3MgYWxyZWFkeSBpbiB0aGUgYnVmZmVyCi0JCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSAtIChmU3RhcnRPZlRleHRUb1BhcnNlICsgZW5kT2ZOYW1lVGFnKSAtIG9mZnNldCk7Ci0JCQkvLyBvdXRlciBjbGFzcyBtZXRob2QKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0Q3Vyc29yT3duZXIoZlBvc3NpYmxlT3duZXIpOwotCQkJLy8gYWRkIGxlbmd0aCBvZiB3aGF0J3MgYWxyZWFkeSBpbiB0aGUgYnVmZmVyCi0JCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0UmVsYXRpdmVPZmZzZXQoKSArIHRoaXMuZlRyYW5zbGF0b3IuZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSk7Ci0JCQlpZiAoZlBvc3NpYmxlT3duZXIgPT0gSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OKSB7Ci0JCQkJLy8gYWRkIGxlbmd0aCBvZiBleHByZXNzaW9uIHByZWZpeCBpZiBuZWNlc3NhcnkuLi4KLQkJCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEpTUFRyYW5zbGF0b3IuRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlY2xhcmF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhmU3RyaXBwZWRUZXh0LCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCkpOwotCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuREVDTEFSQVRJT047Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4cHJlc3Npb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBmVHJhbnNsYXRvci5nZXRDdXJyZW50Tm9kZSgpOwotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoZlN0cmlwcGVkVGV4dCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpKTsKLQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLkVYUFJFU1NJT047Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1NjcmlwdGxldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXByZXBhcmVUZXh0KHNkUmVnaW9uKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCk7Ci0JCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKGZTdHJpcHBlZFRleHQsIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSk7Ci0JCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5TQ1JJUFRMRVQ7Ci0JfQotCi0JLyoKLQkgKiBTdWJzdGl0dXRlcyB2YWx1ZXMgZm9yIGVudGl0eSByZWZlcmVuY2VzLCBzdHJpcHMgQ0RBVEEgdGFncywgYW5kIGtlZXBzCi0JICogdHJhY2sgb2Ygc3RyaW5nIGxlbmd0aChzKSBmb3IgY3Vyc29yIHBvc2l0aW9uIGNhbGN1bGF0aW9uIGxhdGVyLgotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJZlRleHRCZWZvcmUgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJZlVuZXNjYXBlZFRleHQgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChmVGV4dEJlZm9yZSk7Ci0JCWZTdHJpcHBlZFRleHQgPSB0aGlzLmZUcmFuc2xhdG9yLnN0cmlwQ0RBVEEoZlVuZXNjYXBlZFRleHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NVc2VCZWFuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGZUYWduYW1lICE9IG51bGwgJiYgaXNVc2VCZWFuKGZUYWduYW1lKSkgewotCi0JCQlTdHJpbmcgYmVhbkNsYXNzLCBiZWFuVHlwZSwgYmVhbklkLCBiZWFuRGVjbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQliZWFuQ2xhc3MgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3MiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5UeXBlID0gZ2V0QXR0cmlidXRlVmFsdWUoInR5cGUiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5JZCA9IGdldEF0dHJpYnV0ZVZhbHVlKCJpZCIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpZiAoYmVhbklkICE9IG51bGwgJiYgKGJlYW5UeXBlICE9IG51bGwgfHwgYmVhbkNsYXNzICE9IG51bGwpKSB7Ci0JCQkJaWYgKGJlYW5UeXBlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkgICAgYmVhblR5cGUgPSBiZWFuQ2xhc3M7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGJlYW5UeXBlICsgIiAiICsgYmVhbklkICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBzdWZmaXggPSAibnVsbDtcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYmVhbkNsYXNzICE9IG51bGwpCi0JCQkJCXN1ZmZpeCA9ICJuZXcgIiArIGJlYW5DbGFzcyArICIoKTtcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWJlYW5EZWNsID0gcHJlZml4ICsgc3VmZml4OwotCQkJfQkKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCk7Ci0JCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyhiZWFuRGVjbCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpKTsKLQkJCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5TQ1JJUFRMRVQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3RoZXJSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoc2RSZWdpb24pOwotCQlwcm9jZXNzUGFnZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoaXNJbmNsdWRlRGlyZWN0aXZlKGZUYWduYW1lKSkgewotCQkJLy8gdGhlIGRpcmVjdGl2ZSBuYW1lIHJlZ2lvbiBpdHNlbGYgY29udGFpbnMgdGhlIGF0dHJzLi4uCi0JCQlpZiAoc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkKLQkJCQlzZFJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gZ2V0QXR0cmlidXRlVmFsdWUoImZpbGUiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuZlRyYW5zbGF0b3IuaGFuZGxlSW5jbHVkZUZpbGUoZmlsZUxvY2F0aW9uKTsKLQkJfQotCQllbHNlIGlmIChpc1Bvc3NpYmxlQ3VzdG9tVGFnKGZUYWduYW1lKSkgewotCQkJLy8gdGhpcyBjdXN0b20gdGFnIG1heSBkZWZpbmUgdmFyaWFibGVzCi0JCQl0aGlzLmZUcmFuc2xhdG9yLmFkZFRhZ2xpYlZhcmlhYmxlcyhmVGFnbmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNUYWdsaWJEaXJlY3RpdmUoZlRhZ25hbWUpKSB7Ci0JCQkvLyBhbHNvIGFkZCB0aGUgb25lcyBjcmVhdGVkIGhlcmUgdG8gdGhlIHBhcmVudCBkb2N1bWVudAotCQkJU3RyaW5nIHByZWZpeCA9IGdldEF0dHJpYnV0ZVZhbHVlKCJwcmVmaXgiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3QgZG9jcyA9IHRoaXMuZlRyYW5zbGF0b3IuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoKS5nZXRDTURvY3VtZW50VHJhY2tlcnMocHJlZml4LCB0aGlzLmZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCkuZ2V0RW5kKCkpOwotCQkJSXRlcmF0b3IgaXQgPSBkb2NzLml0ZXJhdG9yKCk7Ci0JCQlJdGVyYXRvciBlbGVtZW50cyA9IG51bGw7Ci0JCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQlDTURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWRvYyA9IChDTURvY3VtZW50KSBpdC5uZXh0KCk7Ci0JCQkJZWxlbWVudHMgPSBkb2MuZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQkJbm9kZSA9IChDTU5vZGUpIGVsZW1lbnRzLm5leHQoKTsKLQkJCQkJbWFya2VyID0gbmV3IEJsb2NrTWFya2VyKG5vZGUuZ2V0Tm9kZU5hbWUoKSwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIHRydWUpOwotCQkJCQkvLyBnbG9iYWwgc2NvcGUgaXMgT0sgYmVjYXVzZSB3ZSBoYXZlIGVuY291bnRlcmVkIHRoaXMgPEB0YWdsaWI+IGRpcmVjdGl2ZQotCQkJCQkvLyBzbyBpdCBhbGwgbWFya2VycyBmcm9tIGl0IHNob3VsZCB3aWxsIGJlIGluIHNjb3BlCi0JCQkJCS8vIGFkZCB0byB0aGlzIGxvY2FsIHBhcnNlcgotCQkJCQlhZGRCbG9ja01hcmtlcihtYXJrZXIpOwotCQkJCQkvLyBhZGQgdG8gb3V0ZXIgY2xhc3MgbWFya2VyIGxpc3QsIGZvciAKLQkJCQkJdGhpcy5mVHJhbnNsYXRvci5nZXRCbG9ja01hcmtlcnMoKS5hZGQobWFya2VyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGFnZURpcmVjdGl2ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWlmIChpc1BhZ2VEaXJlY3RpdmUoZlRhZ25hbWUpKSB7Ci0JCQl3aGlsZSAoc2RSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChzZFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKQotCQkJCQlicmVhazsKLQkJCQlzZFJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgaW1wb3J0VmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgiaW1wb3J0Iiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW1wb3J0VmFsdWUgIT0gIiIpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGhhZCB0byBhZGQgImZhbHNlIiBwYXJhbWV0ZXIgdG8gZW5zdXJlIHRoZXNlIAotCQkJCS8vIGltcG9ydHMgZG9uJ3QgZ2V0IGFkZGVkIHRvIGpzcCA8LT4gamF2YSBtYXAgKHNpbmNlIHRoZXkgYXJlIGZyb20gYW4gaW5jbHVkZWQgZmlsZSkKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE2ODcKLQkJCQl0aGlzLmZUcmFuc2xhdG9yLmFkZEltcG9ydHMoaW1wb3J0VmFsdWUsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0JCi0KLQkvKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYW4gYXR0cmlidXRlIHZhbHVlIGZyb20gYXR0cmlidXRlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhdHRyTmFtZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgc2RSZWdpb25UZXh0ID0gZlRleHRUb1BhcnNlLnN1YnN0cmluZyhzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBzZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSk7Ci0JCVN0cmluZyB0ZXh0UmVnaW9uVGV4dCwgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSXRlcmF0b3IgaXQgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiwgdmFsdWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQluYW1lUmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAobmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJdGV4dFJlZ2lvblRleHQgPSBzZFJlZ2lvblRleHQuc3Vic3RyaW5nKG5hbWVSZWdpb24uZ2V0U3RhcnQoKSwgbmFtZVJlZ2lvbi5nZXRUZXh0RW5kKCkpOwotCQkJCWlmICh0ZXh0UmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCQl2YWx1ZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCQkJaWYgKHZhbHVlUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJYXR0clZhbHVlID0gc2RSZWdpb25UZXh0LnN1YnN0cmluZyh2YWx1ZVJlZ2lvbi5nZXRTdGFydCgpLCB2YWx1ZVJlZ2lvbi5nZXRFbmQoKSk7Ci0JCQkJCQkJYnJlYWs7IC8vIGlubmVyCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7IC8vIG91dGVyCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBTdHJpbmdVdGlscy5zdHJpcFF1b3RlcyhhdHRyVmFsdWUpOwotCX0KLQotCS8vIHRoZXNlIG1ldGhvZHMgZGV0ZXJtaW5lIHdoYXQgY29udGVudCBnZXRzIGFkZGVkIHRvIHRoZSBsb2NhbCBzY3JpcGxldCwgZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24gYnVmZmVycwotCS8qCi0JICogcmV0dXJuIHRydWUgZm9yIGVsZW1lbnRzIHdob3NlIGNvbnRlbnRzIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHRvIHRoZSBqYXZhIGZpbGUgd2UgYXJlIGJ1aWxkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BTdGFydFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXJldHVybiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUFJlZ2lvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gaXNEZWNsYXJhdGlvbih0YWdOYW1lKSB8fCBpc0V4cHJlc3Npb24odGFnTmFtZSkgfHwgaXNTY3JpcHRsZXQodGFnTmFtZSkgfHwgaXNVc2VCZWFuKHRhZ05hbWUpIHx8IGlzSW5jbHVkZURpcmVjdGl2ZSh0YWdOYW1lKSB8fCBpc1Bvc3NpYmxlQ3VzdG9tVGFnKHRhZ05hbWUpIHx8IGlzVGFnbGliRGlyZWN0aXZlKHRhZ05hbWUpIHx8IGlzUGFnZURpcmVjdGl2ZSh0YWdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlY2xhcmF0aW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkZWNsYXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cHJlc3Npb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTY3JpcHRsZXQoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOnNjcmlwdGxldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVc2VCZWFuKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDp1c2VCZWFuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS5pbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bvc3NpYmxlQ3VzdG9tVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmluZGV4T2YoIjoiKSA+IDAgJiYgIXRhZ05hbWUuc3RhcnRzV2l0aCgianNwIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhZ2xpYkRpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWdlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWdpb25OYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQlTdHJpbmcgbmFtZVN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlmb3IoaW50IGk9MDsgaTxyZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZihyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCW5hbWVTdHIgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZVN0ci50cmltKCk7Ci0JfQotCi0JLyoKLQkgKiBnZXQgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhcyBhIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgYyA9IDA7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZU5hbWUpOwotCQkJSUZpbGUgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQlpZihmICE9IG51bGwgJiYgIWYuZXhpc3RzKCkpIHsKLQkJCQlmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJfQotICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0gICAgCQkJaXMgPSBmLmdldENvbnRlbnRzKCk7Ci0gICAgCQkJd2hpbGUgKChjID0gaXMucmVhZCgpKSAhPSAtMSkgewotICAgIAkJCQljb3VudCsrOwotICAgIAkJCQlzLmFwcGVuZCgoY2hhcikgYyk7Ci0gICAgCQkJfQotICAgICAgICAgICAgfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJfQotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M2YTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQWRkRXhwcmVzcy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBZGRFeHByZXNzIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFkZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiNmVhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQWRkRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFuZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZTQwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFuZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQW5kRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVENob2ljZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MDc5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENob2ljZUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2hvaWNlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA2MTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXF1YWxpdHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5M2YzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNURXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNhZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RGdW5jdGlvbkludm9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbkludm9jYXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIFN0cmluZyBmdWxsRnVuY3Rpb25OYW1lOyAKLSAgCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkludm9jYXRpb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uSW52b2NhdGlvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotCi1wdWJsaWMgU3RyaW5nIGdldEZ1bGxGdW5jdGlvbk5hbWUoKSB7Ci0JcmV0dXJuIGZ1bGxGdW5jdGlvbk5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEZ1bGxGdW5jdGlvbk5hbWUoU3RyaW5nIGZ1bGxGdW5jdGlvbk5hbWUpIHsKLQl0aGlzLmZ1bGxGdW5jdGlvbk5hbWUgPSBmdWxsRnVuY3Rpb25OYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAwMDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RHVE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RHVE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUR1ROb2RlIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RHVE5vZGUoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEdUTm9kZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEltcGxpY2l0T2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0OWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbXBsaWNpdE9iamVjdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbXBsaWNpdE9iamVjdCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUSW1wbGljaXRPYmplY3QoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEltcGxpY2l0T2JqZWN0KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVExpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzMzRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExpdGVyYWwuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTGl0ZXJhbCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUTGl0ZXJhbChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTGl0ZXJhbChKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhmNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTXVsdGlwbHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVE11bHRpcGx5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTXVsdGlwbHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTZiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotCXByb3RlY3RlZCBBcnJheUxpc3Qgb3BlcmF0b3JUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKGludCBpKSB7Ci0JCXN1cGVyKGkpOwotCX0KLQkKLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpKSB7Ci0JCXRoaXMoaSk7Ci0JCXBhcnNlciA9IHA7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0b3JUb2tlbihUb2tlbiBvcFRva2VuKSB7Ci0JCW9wZXJhdG9yVG9rZW5zLmFkZChvcFRva2VuKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0T3BlcmF0b3JUb2tlbnMoKSB7Ci0JCXJldHVybiBvcGVyYXRvclRva2VuczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmI3NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE9yRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RPckV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUT3JFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RPckV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjM4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUU3RhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTExN2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogR29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFN0YXJ0IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RTdGFydChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3RhcnQoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4NzBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFVuYXJ5RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVW5hcnlFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVbmFyeUV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmEzNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFsdWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFsdWUgZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVFZhbHVlKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYWx1ZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlUHJlZml4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYmYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYWx1ZVByZWZpeC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYWx1ZVByZWZpeCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVmFsdWVQcmVmaXgoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhbHVlUHJlZml4KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVTdWZmaXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE3MjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhbHVlU3VmZml4LmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFZhbHVlU3VmZml4IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0JCi0gIHByb3RlY3RlZCBUb2tlbiBwcm9wZXJ0eU5hbWVUb2tlbjsKLSAgCi0gIHB1YmxpYyBBU1RWYWx1ZVN1ZmZpeChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFsdWVTdWZmaXgoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotcHVibGljIFRva2VuIGdldFByb3BlcnR5TmFtZVRva2VuKCkgewotCXJldHVybiBwcm9wZXJ0eU5hbWVUb2tlbjsKLX0KLQotcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lVG9rZW4oVG9rZW4gcHJvcGVydHlOYW1lVG9rZW4pIHsKLQl0aGlzLnByb3BlcnR5TmFtZVRva2VuID0gcHJvcGVydHlOYW1lVG9rZW47Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJhZTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGUgY29kZSBjaGVja2VyIGZvciB0aGUganNmL2pzcCBFTC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVMR2VuZXJhdG9yIHsKLQkvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdG9yIEEgdmFsaWQgRUxMb2NhdG9yIGluc3RhbmNlLCBtYXkgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIEVMR2VuZXJhdG9yKCkgewotICAgIH0gLy8gY29uc3RydWN0b3IKLQkKLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBuZXR1aWVsIEFTVCBhbmQgc2V0IGRpYWdub3N0aWNzIGFzIG5lY2Vzc2FyeS4KLSAgICAgKiBAcGFyYW0gdHJhbnNsYXRvciBUT0RPCi0gICAgICogQHBhcmFtIGpzcFJlZmVyZW5jZVJlZ2lvbiBUT0RPCi0gICAgICogQHBhcmFtIGNvbnRlbnRTdGFydCAKLSAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShBU1RFeHByZXNzaW9uIHJvb3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIFN0cmluZ0J1ZmZlciByZXN1bHQsIE1hcCBjb2RlTWFwLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQgY29udGVudFN0YXJ0LCBpbnQgY29udGVudExlbmd0aCkgewotCQlFTEdlbmVyYXRvclZpc2l0b3IgdmlzaXRvciA9IG5ldyBFTEdlbmVyYXRvclZpc2l0b3IocmVzdWx0LCBjdXJyZW50Tm9kZSwgY29kZU1hcCwgZG9jdW1lbnQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgY29udGVudFN0YXJ0KTsKLQkJcm9vdC5qanRBY2NlcHQodmlzaXRvciwgbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTMxOTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgQnVnIDE1NDQ3NCBFTDogJ2FuZCcsICdvcicsIC4uLiBvcGVyYXRvcgotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0NzQKLSAqICAgICBCZXJuaGFyZCBIdWVtZXIgPGJlcm5oYXJkLmh1ZW1lckBnbWFpbC5jb20+Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIEVMR2VuZXJhdG9yVmlzaXRvciBpbXBsZW1lbnRzIEpTUEVMUGFyc2VyVmlzaXRvciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMSA9ICJwdWJsaWMgU3RyaW5nIF9lbEV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMiA9ICIoKSIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJcdFx0dGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiB7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBwYXJhbSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgcGFyYW1WYWx1ZXMgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIGhlYWRlciA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkIAotCSJqYXZhLnV0aWwuTWFwIGhlYWRlclZhbHVlcyA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgY29va2llID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JImphdmEudXRpbC5NYXAgaW5pdFBhcmFtID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBwYWdlU2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIHJlcXVlc3RTY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgc2Vzc2lvblNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBhcHBsaWNhdGlvblNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkicmV0dXJuIFwiXCIrIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmSnNwSW1wbGljaXRPYmplY3RzW10gPSB7ICJwYWdlQ29udGV4dCIgfTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmSnNwSW1wbGljaXRNYXBzW10gPSB7IAkicGFyYW0iLCAicGFyYW1WYWx1ZXMiLCAiaGVhZGVyIiwgImhlYWRlclZhbHVlcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCQkJCQkJCQkJImNvb2tpZSIsICJpbml0UGFyYW0iLCAicGFnZVNjb3BlIiwgInJlcXVlc3RTY29wZSIsICJzZXNzaW9uU2NvcGUiLCAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQkJCQkJCQkJCSJhcHBsaWNhdGlvblNjb3BlIiB9OyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBmSlNQSW1wbGljaXRPYmplY3RNYXAgPSBuZXcgSGFzaE1hcChmSnNwSW1wbGljaXRPYmplY3RzLmxlbmd0aCk7Ci0Jc3RhdGljIHsKLQkJZm9yKGludCBpID0gMDsgaSA8IGZKc3BJbXBsaWNpdE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWZKU1BJbXBsaWNpdE9iamVjdE1hcC5wdXQoZkpzcEltcGxpY2l0T2JqZWN0c1tpXSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQl9Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkpzcEltcGxpY2l0TWFwcy5sZW5ndGg7IGkrKykgewotCQkJZkpTUEltcGxpY2l0T2JqZWN0TWFwLnB1dChmSnNwSW1wbGljaXRNYXBzW2ldLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmRm9vdGVyID0gIiA7IiArIEVOREwgKyAifSIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZSZXN1bHQ7Ci0JcHJpdmF0ZSBNYXAgZkNvZGVNYXA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckNvZGU7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IG1ldGhvZENvdW50ZXIgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgaW50IGZDb250ZW50U3RhcnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZPcGVyYXRvck1hcDsKLQkKLQkvLyB0aGlzIGZsYWcgbGV0cyB1cyBrbm93IGlmIHdlIHdlcmUgdW5hYmxlIHRvIGdlbmVyYXRlIGZvciBzb21lIHJlYXNvbi4gIE9uZSBwb3NzaWJsZSByZWFzb24gaXMgdGhhdCB0aGUgZXhwcmVzc2lvbiAKLQkvLyBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIGZvciB3aGljaCBpbmZvcm1hdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBhdCBydW50aW1lLgotCXByaXZhdGUgYm9vbGVhbiBmQ2FuR2VuZXJhdGUgPSB0cnVlOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZTsKLQotCS8qKgotCSAqIFRyYW5sc2F0aW9uIG9mIFhNTC1zdHlsZSBvcGVyYXRvcnMgdG8gamF2YQotCSAqLwotCXN0YXRpYyB7Ci0JCWZPcGVyYXRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZPcGVyYXRvck1hcC5wdXQoImd0IiwgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImx0IiwgIjwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImdlIiwgIj49Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJsZSIsICI8PSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgibW9kIiwgIiUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImVxIiwgIj09Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJhbmQiLCAiJiYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoIm9yIiwgInx8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJub3QiLCAiISIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yIHNxdWlycmVscyBhd2F5IGEgZmV3IHRoaW5ncyB3ZSdsbCBuZWVkIGxhdGVyCi0JICogCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBjb2RlTWFwCi0JICogQHBhcmFtIHRyYW5zbGF0b3IKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogQHBhcmFtIGNvbnRlbnRTdGFydAotCSAqLwotCXB1YmxpYyBFTEdlbmVyYXRvclZpc2l0b3IoU3RyaW5nQnVmZmVyIHJlc3VsdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSwgTWFwIGNvZGVNYXAsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGludCBjb250ZW50U3RhcnQpCi0JewotCQlmUmVzdWx0ID0gcmVzdWx0OwotCQlmQ29kZU1hcCA9IGNvZGVNYXA7Ci0JCWZPZmZzZXRJblVzZXJDb2RlID0gcmVzdWx0Lmxlbmd0aCgpOwotCQlmQ29udGVudFN0YXJ0ID0gY29udGVudFN0YXJ0OwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkN1cnJlbnROb2RlID0gY3VycmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgdG9rZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uICBBdXRvbWF0aWNhbGx5IGNhbGN1bGF0aW5nIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChUb2tlbiB0b2tlbikKLQl7Ci0JCWFwcGVuZCh0b2tlbi5pbWFnZSwgdG9rZW4uYmVnaW5Db2x1bW4gLSAxLCB0b2tlbi5lbmRDb2x1bW4pOwotCX0KLQkKLQkvKioKLQkgKiBBcHBlbmQgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgdG9rZW4uCi0JICogCi0JICogQHBhcmFtIHRyYW5zbGF0ZWQKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kKFN0cmluZyB0cmFuc2xhdGVkLCBUb2tlbiB0b2tlbikKLQl7Ci0JCWFwcGVuZCh0cmFuc2xhdGVkLCB0b2tlbi5iZWdpbkNvbHVtbiAtIDEsIHRva2VuLmVuZENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgc3RyaW5nIGV4cGxpY2l0bHkgZ2l2aW5nIHRoZSBpbnB1dCBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uU3RhcnQKLQkgKiBAcGFyYW0ganNwUG9zaXRpb25FbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kKFN0cmluZyBuZXdUZXh0LCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uRW5kKQotCXsKLQkJZlJlc3VsdC5hcHBlbmQobmV3VGV4dCk7Ci0JCVBvc2l0aW9uIGphdmFSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgbmV3VGV4dC5sZW5ndGgoKSk7Ci0JCVBvc2l0aW9uIGpzcFJhbmdlID0gbmV3IFBvc2l0aW9uKGZDb250ZW50U3RhcnQgKyBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkVuZCAtIGpzcFBvc2l0aW9uU3RhcnQpOwotCi0JCWZDb2RlTWFwLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRleHQgdGhhdCB3aWxsIGJlIHVubWFwcGVkIGFuZCB0aGVyZWZvcmUgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGZvciBjb21wbGV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgbmV3VGV4dCkKLQl7Ci0JCWZSZXN1bHQuYXBwZW5kKG5ld1RleHQpOwotCQlmT2Zmc2V0SW5Vc2VyQ29kZSArPSBuZXdUZXh0Lmxlbmd0aCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZSBhIGZ1bmN0aW9uIGludm9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZ1bGxGdW5jdGlvbk5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5GdW5jdGlvbihTdHJpbmcgZnVsbEZ1bmN0aW9uTmFtZSkgewotCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGZEb2N1bWVudCk7Ci0JCWludCBjb2xvbkluZGV4ID0gZnVsbEZ1bmN0aW9uTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCVN0cmluZyBwcmVmaXggPSBmdWxsRnVuY3Rpb25OYW1lLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KTsKLQkJU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IGZ1bGxGdW5jdGlvbk5hbWUuc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxKTsKLQkJaWYgKGRvY01nciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJdGVyYXRvciB0YWdsaWJzID0gZG9jTWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHRhZ2xpYnMuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcil0YWdsaWJzLm5leHQoKTsKLQkJCWlmKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlDTURvY3VtZW50SW1wbCBkb2MgPSAoQ01Eb2N1bWVudEltcGwpdHJhY2tlci5nZXREb2N1bWVudCgpOwotCQkJCQotCQkJCUxpc3QgZnVuY3Rpb25zID0gZG9jLmdldEZ1bmN0aW9ucygpOwotCQkJCWZvcihJdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQlUTERGdW5jdGlvbiBmdW5jdGlvbiA9IChUTERGdW5jdGlvbilpdC5uZXh0KCk7Ci0JCQkJCWlmKGZ1bmN0aW9uLmdldE5hbWUoKS5lcXVhbHMoZnVuY3Rpb25OYW1lKSkgewotCQkJCQkJcmV0dXJuIGZ1bmN0aW9uLmdldENsYXNzTmFtZSgpICsgIi4iICsgZnVuY3Rpb24uZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgc2ltcGxlIG5vZGUgLS0gZmFsbGJhY2sKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuKG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSkpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1ldGhvZENvdW50ZXIoKSB7Ci0JCXJldHVybiBtZXRob2RDb3VudGVyKys7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0b3AtbGV2ZWwgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlpbnQgc3RhcnQgPSBub2RlLmdldEZpcnN0VG9rZW4oKS5iZWdpbkNvbHVtbiAtIDE7Ci0JCWludCBlbmQgPSBub2RlLmxhc3RUb2tlbi5lbmRDb2x1bW4gLSAxOwotCQlhcHBlbmQoZkV4cHJlc3Npb25IZWFkZXIxLCBzdGFydCwgc3RhcnQpOwotCQlhcHBlbmQoSW50ZWdlci50b1N0cmluZyhnZXRNZXRob2RDb3VudGVyKCkpLCBzdGFydCwgc3RhcnQpOwotCQlhcHBlbmQoZkV4cHJlc3Npb25IZWFkZXIyLCBzdGFydCwgc3RhcnQpOwotCQkKLQkJT2JqZWN0IHJldHZhbCA9IG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0KLQkJYXBwZW5kKGZGb290ZXIsIGVuZCwgZW5kKTsKLQkJCi0JCS8vIHNvbWV0aGluZyBpcyBwcmV2ZW50aW5nIGdvb2QgY29kZSBnZW5lcmF0aW9uIHNvIGVtcHR5IG91dCB0aGUgcmVzdWx0IGFuZCB0aGUgbWFwLgotCQlpZighZkNhbkdlbmVyYXRlKSB7Ci0JCQlmUmVzdWx0LmRlbGV0ZSgwLCBmUmVzdWx0Lmxlbmd0aCgpKTsKLQkJCWZDb2RlTWFwLmNsZWFyKCk7CQkJCi0JCX0KLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmljYWxseSBnZW5lcmF0ZSBhbiBvcGVyYXRvciBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRhdGEKLQkgKi8KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVPcGVyYXRvck5vZGUoQVNUT3BlcmF0b3JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlub2RlLmNoaWxkcmVuW2ldLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWlmKCBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIGkgPiAxKSB7Ci0JCQkJYXBwZW5kT3BlcmF0b3IoKFRva2VuKW5vZGUuZ2V0T3BlcmF0b3JUb2tlbnMoKS5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFwcGVuZCBhbiBvcGVyYXRvciB0byB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciB0cmFuc2xhdGlvbiAoaWYgYW55KQotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBhcHBlbmRPcGVyYXRvcihUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdG9rZW5JbWFnZSA9IHRva2VuLmltYWdlLnRyaW0oKTsKLQkJU3RyaW5nIHRyYW5zbGF0ZWQgPSAoU3RyaW5nKWZPcGVyYXRvck1hcC5nZXQodG9rZW5JbWFnZSk7Ci0JCWlmKG51bGwgIT0gdHJhbnNsYXRlZCkgewotCQkJYXBwZW5kKHRyYW5zbGF0ZWQsIHRva2VuKTsKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCh0b2tlbik7Ci0JCX0KLQkJcmV0dXJuKHRyYW5zbGF0ZWQpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBvciBFeHByZXNzaW9uCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RPckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBhbmQgZXhwcmVzc2lvbiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFuZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBlcXVhbGl0eQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgUmVsYXRpb25hbAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBhZGRpdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIG11bHRpcGx5Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWx0aXBseUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKiAKLQkgKiBDaG9pY2UgRXhwcmVzc2lvbiAodGVybmFyeSBvcGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENob2ljZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJbm9kZS5jaGlsZHJlblswXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCWFwcGVuZCgiPyIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuY2hpbGRyZW5bMV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQlhcHBlbmQoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLmNoaWxkcmVuWzJdLmpqdEFjY2VwdCh0aGlzLGRhdGEpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSB1bmFyeQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLkVNUFRZID09IG5vZGUuZmlyc3RUb2tlbi5raW5kKSB7Ci0JCQlhcHBlbmQoIigobnVsbCA9PSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWFwcGVuZCgiKSB8fCAoIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCQlhcHBlbmQoIikuaXNFbXB0eSgpKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZihKU1BFTFBhcnNlckNvbnN0YW50cy5OT1QxID09IG5vZGUuZmlyc3RUb2tlbi5raW5kIHx8IEpTUEVMUGFyc2VyQ29uc3RhbnRzLk5PVDIgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQpIHsKLQkJCWFwcGVuZCgiKCEiKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZihKU1BFTFBhcnNlckNvbnN0YW50cy5NSU5VUyA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCkgewotCQkJYXBwZW5kKCIoLSIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBWYWx1ZSBub2RlCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZSBub2RlLCBPYmplY3QgZGF0YSkgewotCQlpZihub2RlLmpqdEdldE51bUNoaWxkcmVuKCkgPj0gMikgewotCQkJaWYobm9kZS5qanRHZXRDaGlsZCgwKSBpbnN0YW5jZW9mIEFTVFZhbHVlUHJlZml4ICYmIG5vZGUuamp0R2V0Q2hpbGQoMSkgaW5zdGFuY2VvZiBBU1RWYWx1ZVN1ZmZpeCkgewotCQkJCUFTVFZhbHVlUHJlZml4IHByZWZpeCA9IChBU1RWYWx1ZVByZWZpeCkgbm9kZS5qanRHZXRDaGlsZCgwKTsKLQkJCQlBU1RWYWx1ZVN1ZmZpeCBzdWZmaXggPSAoQVNUVmFsdWVTdWZmaXgpIG5vZGUuamp0R2V0Q2hpbGQoMSk7Ci0JCQkJaWYocHJlZml4LmZpcnN0VG9rZW4uaW1hZ2UuZXF1YWxzKCJwYWdlQ29udGV4dCIpICYmIHN1ZmZpeC5nZXRQcm9wZXJ0eU5hbWVUb2tlbigpLmltYWdlLmVxdWFscygicmVxdWVzdCIpKSB7Ci0JCQkJCWFwcGVuZCgiKChIVFRQU2VydmxldFJlcXVlc3QpIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwkKLQl9Ci0KLQotCS8qKgotCSAqIFZhbHVlIFByZWZpeAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVQcmVmaXggbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJLy8gdGhpcyBpcyBhIHJhdyBpZGVudGlmaWVyLiAgTWF5IHN1cmUgaXQncyBhbiBpbXBsaWNpdCBvYmplY3QuCi0JCS8vIFRoaXMgaXMgdGhlIHByaW1hcnkgcGxhZSB3aGVyZSBtb2RpZmljYXRpb24gaXMgbmVlZGVkIHRvIAotCQkvLyBzdXBwb3J0IEpTRiBiYWNraW5nIGJlYW5zLgotCQlpZihudWxsID09IG5vZGUuY2hpbGRyZW4pIHsKLQkJCWlmKGlzQ29tcGxldGluZ09iamVjdChub2RlLmZpcnN0VG9rZW4uaW1hZ2UpKSB7Ci0JCQkJYXBwZW5kKG5vZGUuZmlyc3RUb2tlbik7Ci0JCQl9IGVsc2UgewotCQkJCWZDYW5HZW5lcmF0ZSA9IGZhbHNlOwotCQkJfQotCQkJcmV0dXJuKG51bGwpOwotCQl9Ci0JCXJldHVybiBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCX0KLQotCi0JLyoqCi0JICogRnVuY3Rpb24gZm9yIHRlc3RpbmcgaW1wbGljaXQgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGluZ09iamVjdChTdHJpbmcgaW1hZ2UpIHsKLQkJQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKWZKU1BJbXBsaWNpdE9iamVjdE1hcC5nZXQoaW1hZ2UpOwotCQlyZXR1cm4gbnVsbCA9PSB2YWx1ZSA/IGZhbHNlIDogdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogVmFsdWUgc3VmZml4Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVN1ZmZpeCBub2RlLCBPYmplY3QgZGF0YSkgewotCQlpZihKU1BFTFBhcnNlckNvbnN0YW50cy5MQlJBQ0tFVCA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCkgewotCQkJZkNhbkdlbmVyYXRlID0gZmFsc2U7Ci0JCX0gZWxzZSBpZihudWxsICE9IG5vZGUuZ2V0UHJvcGVydHlOYW1lVG9rZW4oKSkgewotCQkJVG9rZW4gc3VmZml4ID0gbm9kZS5nZXRQcm9wZXJ0eU5hbWVUb2tlbigpOwotCQkJU3RyaW5nIHVjYXNlTmFtZSA9IHN1ZmZpeC5pbWFnZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHN1ZmZpeC5pbWFnZS5zdWJzdHJpbmcoMSwgc3VmZml4LmltYWdlLmxlbmd0aCgpKTsgCi0KLQkJCS8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuICBOb3RlIHRoYXQgdGhlIHR5cGUgc3lzdGVtLCBubyBtYXR0ZXIgaG93IG11Y2ggdHlwZSBpbmZvcm1hdGlvbgotCQkJLy8gd2Ugd291bGQgaGF2ZSB3b3VsZG4ndCBnaXZlIHVzIHRoZSBjb3JyZWN0IHJlc3VsdC4gIFdlJ3JlIGxvb2tpbmcgZm9yICJwYWdlQ29udGV4dC5yZXF1ZXN0IiAKLQkJCS8vIGhlcmUgYW5kIHdpbGwgYWRkIGEgZG93bmNhc3QgdG8gKEhUVFBTZXJ2bGV0UmVxdWVzdCkKLQkJCQotCQkJYXBwZW5kKG5vZGUuZmlyc3RUb2tlbik7Ci0JCQlhcHBlbmQoImdldCIgKyB1Y2FzZU5hbWUgKyAiKCkiLCBzdWZmaXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJU2ltcGxlTm9kZSBwYXJlbnQgPSAoU2ltcGxlTm9kZSkgbm9kZS5qanRHZXRQYXJlbnQoKTsKLQkJCWlmKHN1ZmZpeC5pbWFnZS5lcXVhbHMoInJlcXVlc3QiKSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBBU1RWYWx1ZSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCXBhcmVudC5qanRHZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFTVFVuYXJ5RXhwcmVzc2lvbiAmJiBwYXJlbnQuZmlyc3RUb2tlbi5pbWFnZS5lcXVhbHMoInBhZ2VDb250ZXh0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZCgiKSIpOwotCQkJfSAKLQotCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEZ1bmN0aW9uIGludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlTdHJpbmcgZnVuY3Rpb25UcmFuc2xhdGlvbiA9IGdlbkZ1bmN0aW9uKG5vZGUuZ2V0RnVsbEZ1bmN0aW9uTmFtZSgpKTsKLQkJaWYobnVsbCAhPSBmdW5jdGlvblRyYW5zbGF0aW9uKQotCQl7Ci0JCQlhcHBlbmQoZnVuY3Rpb25UcmFuc2xhdGlvbiArICIoIiwgbm9kZS5nZXRGaXJzdFRva2VuKCkpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IoaW50IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCW5vZGUuY2hpbGRyZW5baV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJCWlmKCBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIGkgPiAxKXsKLQkJCQkJYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlhcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExpdGVyYWwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBhbnkgZnVydGhlciB0cmFuc2xhdGlvbiBuZWVkZWQ/Ci0JCWFwcGVuZChub2RlLmZpcnN0VG9rZW4pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVjNTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yIGltcGxlbWVudHMgSlNQRUxQYXJzZXJWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgaW50IGZDdXJzb3JQb3NpdGlvbjsKLQkKLQlwdWJsaWMgRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IoaW50IGN1cnNvclBvc2l0aW9uKQotCXsKLQkJZkN1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5jbG9zaW5nKFNpbXBsZU5vZGUgbm9kZSkgewotCQlyZXR1cm4obm9kZS5maXJzdFRva2VuLmJlZ2luQ29sdW1uIDwgZkN1cnNvclBvc2l0aW9uICYmIG5vZGUubGFzdFRva2VuLmVuZENvbHVtbiA+PSBmQ3Vyc29yUG9zaXRpb24pOwotCX0KLQotCQotCXByb3RlY3RlZCBPYmplY3QgdmlzaXRFbmNsb3NpbmdDaGlsZChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKQl7Ci0JCWlmKG51bGwgPT0gbm9kZS5jaGlsZHJlbikKLQkJCXJldHVybiBudWxsOwotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGlzRW5jbG9zaW5nKG5vZGUpKSAKLQkJCQlyZXR1cm4gbm9kZS5jaGlsZHJlbltpXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE9yRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFuZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWx0aXBseUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RDaG9pY2VFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWUgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVByZWZpeCBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlU3VmZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25JbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCU9iamVjdCBuZXN0ZWRJbnZvY2F0aW9uID0gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQkJaWYobnVsbCAhPSBuZXN0ZWRJbnZvY2F0aW9uKQotCQkJcmV0dXJuIG5lc3RlZEludm9jYXRpb247Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSkpUSlNQRUxQYXJzZXJTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pKVEpTUEVMUGFyc2VyU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3NDM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSkpUSlNQRUxQYXJzZXJTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKSlRKU1BFTFBhcnNlclN0YXRlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotY2xhc3MgSkpUSlNQRUxQYXJzZXJTdGF0ZSB7Ci0gIHByaXZhdGUgamF2YS51dGlsLlN0YWNrIG5vZGVzOwotICBwcml2YXRlIGphdmEudXRpbC5TdGFjayBtYXJrczsKLQotICBwcml2YXRlIGludCBzcDsJCS8vIG51bWJlciBvZiBub2RlcyBvbiBzdGFjawotICBwcml2YXRlIGludCBtazsJCS8vIGN1cnJlbnQgbWFyawotICBwcml2YXRlIGJvb2xlYW4gbm9kZV9jcmVhdGVkOwotCi0gIEpKVEpTUEVMUGFyc2VyU3RhdGUoKSB7Ci0gICAgbm9kZXMgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgbWFya3MgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBub2RlIHdhcyBhY3R1YWxseSBjbG9zZWQgYW5kCi0gICAgIHB1c2hlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBmaW5hbCB1c2VyIGFjdGlvbiBvZiBhCi0gICAgIG5vZGUgc2NvcGUuICAqLwotICBib29sZWFuIG5vZGVDcmVhdGVkKCkgewotICAgIHJldHVybiBub2RlX2NyZWF0ZWQ7Ci0gIH0KLQotICAvKiBDYWxsIHRoaXMgdG8gcmVpbml0aWFsaXplIHRoZSBub2RlIHN0YWNrLiAgSXQgaXMgY2FsbGVkCi0gICAgIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBhcnNlcidzIFJlSW5pdCgpIG1ldGhvZC4gKi8KLSAgdm9pZCByZXNldCgpIHsKLSAgICBub2Rlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIG1hcmtzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgQVNULiAgSXQgb25seSBtYWtlcyBzZW5zZSB0byBjYWxsCi0gICAgIHRoaXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhcnNlLiAqLwotICBOb2RlIHJvb3ROb2RlKCkgewotICAgIHJldHVybiAoTm9kZSlub2Rlcy5lbGVtZW50QXQoMCk7Ci0gIH0KLQotICAvKiBQdXNoZXMgYSBub2RlIG9uIHRvIHRoZSBzdGFjay4gKi8KLSAgdm9pZCBwdXNoTm9kZShOb2RlIG4pIHsKLSAgICBub2Rlcy5wdXNoKG4pOwotICAgICsrc3A7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlCi0gICAgIHN0YWNrLiAgKi8KLSAgTm9kZSBwb3BOb2RlKCkgewotICAgIGlmICgtLXNwIDwgbWspIHsKLSAgICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gKE5vZGUpbm9kZXMucG9wKCk7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIGN1cnJlbnRseSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gKi8KLSAgTm9kZSBwZWVrTm9kZSgpIHsKLSAgICByZXR1cm4gKE5vZGUpbm9kZXMucGVlaygpOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9uIHRoZSBzdGFjayBpbiB0aGUgY3VycmVudCBub2RlCi0gICAgIHNjb3BlLiAqLwotICBpbnQgbm9kZUFyaXR5KCkgewotICAgIHJldHVybiBzcCAtIG1rOwotICB9Ci0KLQotICB2b2lkIGNsZWFyTm9kZVNjb3BlKE5vZGUgbikgewotICAgIHdoaWxlIChzcCA+IG1rKSB7Ci0gICAgICBwb3BOb2RlKCk7Ci0gICAgfQotICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICB9Ci0KLQotICB2b2lkIG9wZW5Ob2RlU2NvcGUoTm9kZSBuKSB7Ci0gICAgbWFya3MucHVzaChuZXcgSW50ZWdlcihtaykpOwotICAgIG1rID0gc3A7Ci0gICAgbi5qanRPcGVuKCk7Ci0gIH0KLQotCi0gIC8qIEEgZGVmaW5pdGUgbm9kZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgc3BlY2lmaWVkIG51bWJlciBvZgotICAgICBjaGlsZHJlbi4gIFRoYXQgbnVtYmVyIG9mIG5vZGVzIGFyZSBwb3BwZWQgZnJvbSB0aGUgc3RhY2sgYW5kCi0gICAgIG1hZGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWZpbml0ZSBub2RlLiAgVGhlbiB0aGUgZGVmaW5pdGUgbm9kZQotICAgICBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrLiAqLwotICB2b2lkIGNsb3NlTm9kZVNjb3BlKE5vZGUgbiwgaW50IG51bSkgewotICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgIHdoaWxlIChudW0tLSA+IDApIHsKLSAgICAgIE5vZGUgYyA9IHBvcE5vZGUoKTsKLSAgICAgIGMuamp0U2V0UGFyZW50KG4pOwotICAgICAgbi5qanRBZGRDaGlsZChjLCBudW0pOwotICAgIH0KLSAgICBuLmpqdENsb3NlKCk7Ci0gICAgcHVzaE5vZGUobik7Ci0gICAgbm9kZV9jcmVhdGVkID0gdHJ1ZTsKLSAgfQotCi0KLSAgLyogQSBjb25kaXRpb25hbCBub2RlIGlzIGNvbnN0cnVjdGVkIGlmIGl0cyBjb25kaXRpb24gaXMgdHJ1ZS4gIEFsbAotICAgICB0aGUgbm9kZXMgdGhhdCBoYXZlIGJlZW4gcHVzaGVkIHNpbmNlIHRoZSBub2RlIHdhcyBvcGVuZWQgYXJlCi0gICAgIG1hZGUgY2hpbGRyZW4gb2YgdGhlIHRoZSBjb25kaXRpb25hbCBub2RlLCB3aGljaCBpcyB0aGVuIHB1c2hlZAotICAgICBvbiB0byB0aGUgc3RhY2suICBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBub2RlIGlzIG5vdAotICAgICBjb25zdHJ1Y3RlZCBhbmQgdGhleSBhcmUgbGVmdCBvbiB0aGUgc3RhY2suICovCi0gIHZvaWQgY2xvc2VOb2RlU2NvcGUoTm9kZSBuLCBib29sZWFuIGNvbmRpdGlvbikgewotICAgIGlmIChjb25kaXRpb24pIHsKLSAgICAgIGludCBhID0gbm9kZUFyaXR5KCk7Ci0gICAgICBtayA9ICgoSW50ZWdlciltYXJrcy5wb3AoKSkuaW50VmFsdWUoKTsKLSAgICAgIHdoaWxlIChhLS0gPiAwKSB7Ci0JTm9kZSBjID0gcG9wTm9kZSgpOwotCWMuamp0U2V0UGFyZW50KG4pOwotCW4uamp0QWRkQ2hpbGQoYywgYSk7Ci0gICAgICB9Ci0gICAgICBuLmpqdENsb3NlKCk7Ci0gICAgICBwdXNoTm9kZShuKTsKLSAgICAgIG5vZGVfY3JlYXRlZCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgICAgbm9kZV9jcmVhdGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamogYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzgzYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotICogICAgIA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qQGJnZW4oamp0cmVlKSBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMLmpqICovDQotLypAZWdlbiovLyogSSBrbm93IHRoYXQgaGFpbmcgc29tZSBvZiB0aGVzZSBvcHRpb25zIG9uIG9uZSBsaW5lIGlzIHJ1ZGUgYnV0IA0KLSAqIGlmIHdlIGRvbid0IGRvIHRoYXQgdGhlIGxpbmUgbnVtYmVyIHJlcG9ydGVkIGZyb20gamF2YWNjIGFyZSBvZmYNCi0gKiB3aGljaCwgdHJ1c3QgbWUsIGlzIGZhciBtb3JlIGFubm95aW5nLiAgLS10Y2Fycm9sbEBiZWEuY29tDQotICovDQotb3B0aW9ucyB7DQotICBKQVZBX1VOSUNPREVfRVNDQVBFID0gZmFsc2U7DQotICBVTklDT0RFX0lOUFVUID0gdHJ1ZTsNCi0gIFNUQVRJQyA9IGZhbHNlOw0KLSAgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfQ0KLQ0KLVBBUlNFUl9CRUdJTihKU1BFTFBhcnNlcikNCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBKU1BFTFBhcnNlci8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMvKkBlZ2VuKi8gey8qQGJnZW4oamp0cmVlKSovDQotICBwcm90ZWN0ZWQgSkpUSlNQRUxQYXJzZXJTdGF0ZSBqanRyZWUgPSBuZXcgSkpUSlNQRUxQYXJzZXJTdGF0ZSgpOw0KLQ0KLS8qQGVnZW4qLw0KLSAgDQotICB2b2lkIGpqdHJlZU9wZW5Ob2RlU2NvcGUoTm9kZSBuKQ0KLSAgew0KLSAgICAgICAgICAoKFNpbXBsZU5vZGUpbikuc2V0Rmlyc3RUb2tlbihnZXRUb2tlbigxKSk7DQotICB9DQotDQotICB2b2lkIGpqdHJlZUNsb3NlTm9kZVNjb3BlKE5vZGUgbikNCi0gIHsNCi0gICAgKChTaW1wbGVOb2RlKW4pLnNldExhc3RUb2tlbihnZXRUb2tlbigwKSk7DQotICB9DQotICANCi0gIHB1YmxpYyBzdGF0aWMgSlNQRUxQYXJzZXIgY3JlYXRlUGFyc2VyKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgcmV0dXJuIG5ldyBKU1BFTFBhcnNlcihyZWFkZXIpOw0KLSAgfQ0KLSAgDQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgIFJlSW5pdChyZWFkZXIpOw0KLSAgfQ0KLSAgDQotfQ0KLQ0KLVBBUlNFUl9FTkQoSlNQRUxQYXJzZXIpDQotDQotU0tJUCA6DQotew0KLSAgIiAiDQotfCAiXHQiDQotfCAiXG4iDQotfCAiXHIiDQotfQ0KLQ0KLVRPS0VOIDoNCi17DQotLyogTGl0ZXJhbHMgKi8NCi0gIDwgSU5URUdFUl9MSVRFUkFMOiBbIjAiLSI5Il0gKFsiMCItIjkiXSkqID4NCi18DQotICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6DQotICAgICAgICAoWyIwIi0iOSJdKSsgIi4iIChbIjAiLSI5Il0pKiAoPEVYUE9ORU5UPik/DQotICAgICAgfCAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8NCi0gICAgICB8IChbIjAiLSI5Il0pKyA8RVhQT05FTlQ+DQotICA+DQotfA0KLSAgPCAjRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4NCi18DQotICA8IFNUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICgoflsiXCIiLCJcXCJdKSB8ICgiXFwiICggWyJcXCIsIlwiIl0gKSkpKiAiXCIiKSB8DQotICAgICAgKCJcJyIgKCh+WyJcJyIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCciXSApKSkqICJcJyIpDQotICA+DQotfA0KLSAgPCBCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICh+WyJcIiIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCIiXSApKSkgfA0KLSAgICAgICgiXCciICh+WyJcJyIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCciXSApKSkNCi0gID4NCi0NCi0vKiBSZXNlcnZlZCBXb3JkcyBhbmQgU3ltYm9scyAqLw0KLXwgPCBUUlVFOiAidHJ1ZSIgPg0KLXwgPCBGQUxTRTogImZhbHNlIiA+DQotfCA8IE5VTEw6ICJudWxsIiA+DQotfCA8IERPVDogIi4iID4NCi18IDwgR1QxOiAiPiIgPg0KLXwgPCBHVDI6ICJndCIgPg0KLXwgPCBMVDE6ICI8IiA+DQotfCA8IExUMjogImx0IiA+DQotfCA8IEVRMTogIj09IiA+DQotfCA8IEVRMjogImVxIiA+DQotfCA8IExFMTogIjw9IiA+DQotfCA8IExFMjogImxlIiA+DQotfCA8IEdFMTogIj49IiA+DQotfCA8IEdFMjogImdlIiA+DQotfCA8IE5FUTE6ICIhPSIgPg0KLXwgPCBORVEyOiAibmUiID4NCi18IDwgTFBBUkVOOiAiKCIgPg0KLXwgPCBSUEFSRU46ICIpIiA+DQotfCA8IENPTU1BOiAiLCIgPg0KLXwgPCBDT0xPTjogIjoiID4NCi18IDwgTEJSQUNLRVQ6ICJbIiA+DQotfCA8IFJCUkFDS0VUOiAiXSIgPg0KLXwgPCBQTFVTOiAiKyIgPg0KLXwgPCBNSU5VUzogIi0iID4NCi18IDwgTVVMVElQTFk6ICIqIiA+DQotfCA8IERJVklERTE6ICIvIiA+DQotfCA8IERJVklERTI6ICJkaXYiID4NCi18IDwgTU9EVUxVUzE6ICIlIiA+DQotfCA8IE1PRFVMVVMyOiAibW9kIiA+DQotfCA8IE5PVDE6ICJub3QiID4NCi18IDwgTk9UMjogIiEiID4NCi18IDwgQU5EMTogImFuZCIgPg0KLXwgPCBBTkQyOiAiJiYiID4NCi18IDwgT1IxOiAib3IiID4NCi18IDwgT1IyOiAifHwiID4NCi18IDwgRU1QVFk6ICJlbXB0eSIgPg0KLXwgPCBDT05EOiAiPyIgPg0KLQ0KLS8qIElkZW50aWZpZXJzICovDQotDQotfCA8IElERU5USUZJRVI6ICg8TEVUVEVSPnw8SU1QTF9PQkpfU1RBUlQ+KSAoPExFVFRFUj58PERJR0lUPikqID4NCi18IDwgI0lNUExfT0JKX1NUQVJUOiAiIyIgPg0KLXwNCi0gIDwgI0xFVFRFUjoNCi0gICAgICBbDQotICAgICAgICIkIiwNCi0gICAgICAgIkEiLSJaIiwNCi0gICAgICAgIl8iLA0KLSAgICAgICAiYSItInoiLA0KLSAgICAgICAiXHUwMGMwIi0iXHUwMGQ2IiwNCi0gICAgICAgIlx1MDBkOCItIlx1MDBmNiIsDQotICAgICAgICJcdTAwZjgiLSJcdTAwZmYiLA0KLSAgICAgICAiXHUwMTAwIi0iXHUxZmZmIiwNCi0gICAgICAgIlx1MzA0MCItIlx1MzE4ZiIsDQotICAgICAgICJcdTMzMDAiLSJcdTMzN2YiLA0KLSAgICAgICAiXHUzNDAwIi0iXHUzZDJkIiwNCi0gICAgICAgIlx1NGUwMCItIlx1OWZmZiIsDQotICAgICAgICJcdWY5MDAiLSJcdWZhZmYiDQotICAgICAgXQ0KLSAgPg0KLXwNCi0gIDwgI0RJR0lUOg0KLSAgICAgIFsNCi0gICAgICAgIjAiLSI5IiwNCi0gICAgICAgIlx1MDY2MCItIlx1MDY2OSIsDQotICAgICAgICJcdTA2ZjAiLSJcdTA2ZjkiLA0KLSAgICAgICAiXHUwOTY2Ii0iXHUwOTZmIiwNCi0gICAgICAgIlx1MDllNiItIlx1MDllZiIsDQotICAgICAgICJcdTBhNjYiLSJcdTBhNmYiLA0KLSAgICAgICAiXHUwYWU2Ii0iXHUwYWVmIiwNCi0gICAgICAgIlx1MGI2NiItIlx1MGI2ZiIsDQotICAgICAgICJcdTBiZTciLSJcdTBiZWYiLA0KLSAgICAgICAiXHUwYzY2Ii0iXHUwYzZmIiwNCi0gICAgICAgIlx1MGNlNiItIlx1MGNlZiIsDQotICAgICAgICJcdTBkNjYiLSJcdTBkNmYiLA0KLSAgICAgICAiXHUwZTUwIi0iXHUwZTU5IiwNCi0gICAgICAgIlx1MGVkMCItIlx1MGVkOSIsDQotICAgICAgICJcdTEwNDAiLSJcdTEwNDkiDQotICAgICAgXQ0KLSAgPg0KLX0NCi0NCi1BU1RFeHByZXNzaW9uIEV4cHJlc3Npb24oKSA6IHsvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvbiAqLw0KLSAgQVNURXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb24oSkpURVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoTE9PS0FIRUFEKCI/IikgQ2hvaWNlRXhwcmVzc2lvbigpIHwgT3JFeHByZXNzaW9uKCkpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8geyByZXR1cm4gamp0bjAwMDsgfS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgT3JFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgOiANCi17LypAYmdlbihqanRyZWUpICNPckV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUT3JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUT3JFeHByZXNzaW9uKEpKVE9SRVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjT3JFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBbmRFeHByZXNzaW9uKCkgKCh0ID0gPE9SMT4gfCB0ID0gPE9SMj4pIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBBbmRFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQW5kRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI0FuZEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUQW5kRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFuZEV4cHJlc3Npb24oSkpUQU5ERVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjQW5kRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKCh0ID0gPEFORDE+IHwgdCA9IDxBTkQyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLyAgICAgICAgDQotfQ0KLQ0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgICAgICAgOiANCi17LypAYmdlbihqanRyZWUpICNFcXVhbGl0eUV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjRXF1YWxpdHlFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIA0KLSAgICAgICAgKCh0ID0gPEVRMT4gfCB0ID0gPEVRMj4gfCB0ID0gPE5FUTE+IHwgdCA9IDxORVEyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgICAgICAgIDoNCi17LypAYmdlbihqanRyZWUpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpKVFJFTEFUSU9OQUxFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQWRkRXhwcmVzc2lvbigpIA0KLSAgICAgICAgKA0KLSAgICAgICAgICAgICAgICAodCA9IDxMVDE+IHwgdCA9IDxMVDI+IHwgdCA9IDxHVDE+IHwgdCA9IDxHVDI+IHwgdCA9IDxHRTE+IHwgdCA9IDxHRTI+IHwgdCA9IDxMRTE+IHwgdCA9IDxMRTI+KSAgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgICAgICAgICAgQWRkRXhwcmVzc2lvbigpDQotICAgICAgICApKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQWRkRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI0FkZEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUQWRkRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFkZEV4cHJlc3Npb24oSkpUQURERVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjQWRkRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCkgKCh0ID0gPFBMVVM+IHwgdCA9IDxNSU5VUz4pIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBNdWx0aXBseUV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI011bHRpcGx5RXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RNdWx0aXBseUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBseUV4cHJlc3Npb24oSkpUTVVMVElQTFlFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNNdWx0aXBseUV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpICgNCi0gICAgICAgICAgICAgICAgKCB0ID0gPE1VTFRJUExZPiB8IHQgPSA8RElWSURFMT4gfCB0ID0gPERJVklERTI+IHwgdCA9IDxNT0RVTFVTMT4gfCB0ID0gPE1PRFVMVVMyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgICAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgICAgICAgIA0KLSAgICAgICAgKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIENob2ljZUV4cHJlc3Npb24oKSA6IHsvKkBiZ2VuKGpqdHJlZSkgQ2hvaWNlRXhwcmVzc2lvbiAqLw0KLSAgQVNUQ2hvaWNlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVENob2ljZUV4cHJlc3Npb24oSkpUQ0hPSUNFRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENob2ljZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBPckV4cHJlc3Npb24oKSA8Q09ORD4gT3JFeHByZXNzaW9uKCkgPENPTE9OPiBPckV4cHJlc3Npb24oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVW5hcnlFeHByZXNzaW9uKCkgOiB7LypAYmdlbihqanRyZWUpIFVuYXJ5RXhwcmVzc2lvbiAqLw0KLSAgQVNUVW5hcnlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUVW5hcnlFeHByZXNzaW9uKEpKVFVOQVJZRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFVuYXJ5RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgICgoPE5PVDE+IHwgPE5PVDI+IHwgPE1JTlVTPiB8IDxFTVBUWT4pIFVuYXJ5RXhwcmVzc2lvbigpKQ0KLSAgICAgICAgfCBWYWx1ZSgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi0gICAgICAgIA0KLX0NCi0NCi12b2lkIFZhbHVlKCkgOiB7LypAYmdlbihqanRyZWUpIFZhbHVlICovDQotICBBU1RWYWx1ZSBqanRuMDAwID0gbmV3IEFTVFZhbHVlKEpKVFZBTFVFKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWUgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBWYWx1ZVByZWZpeCgpIChWYWx1ZVN1ZmZpeCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhbHVlUHJlZml4KCkgOiB7LypAYmdlbihqanRyZWUpIFZhbHVlUHJlZml4ICovDQotICBBU1RWYWx1ZVByZWZpeCBqanRuMDAwID0gbmV3IEFTVFZhbHVlUHJlZml4KEpKVFZBTFVFUFJFRklYKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVQcmVmaXggKi8NCi0gICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgTGl0ZXJhbCgpIHwgKDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPikgfCBMT09LQUhFQUQoMykgRnVuY3Rpb25JbnZvY2F0aW9uKCkgfCA8SURFTlRJRklFUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICB9IGZpbmFsbHkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICB9DQotICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLXZvaWQgVmFsdWVTdWZmaXgoKSA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVTdWZmaXggKi8NCi0gICAgICAgIEFTVFZhbHVlU3VmZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVTdWZmaXgoSkpUVkFMVUVTVUZGSVgpOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQgPSBudWxsOw0KLX0NCi17LypAYmdlbihqanRyZWUpIFZhbHVlU3VmZml4ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKDxET1Q+ICh0ID0gPElERU5USUZJRVI+KT8pLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotLypAZWdlbiovIHsgamp0bjAwMC5zZXRQcm9wZXJ0eU5hbWVUb2tlbih0KTsgfQ0KLSAgICAgICAgfCAoPExCUkFDS0VUPiBFeHByZXNzaW9uKCkgPFJCUkFDS0VUPikvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEZ1bmN0aW9uSW52b2NhdGlvbigpIDogDQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkludm9jYXRpb24gKi8NCi0gICAgICAgIEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uSW52b2NhdGlvbihKSlRGVU5DVElPTklOVk9DQVRJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHByZWZpeCA9IG51bGwsIG5hbWUgPSBudWxsOw0KLX0NCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uSW52b2NhdGlvbiAqLw0KLSAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAocHJlZml4ID0gPElERU5USUZJRVI+IDxDT0xPTj4pIHsgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6Iik7IH0NCi0gICAgICAgIChuYW1lID0gPElERU5USUZJRVI+KT8gew0KLSAgICAgICAgICAgIGlmKG51bGwgIT0gcHJlZml4ICYmIG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7DQotICAgICAgICAgICAgZWxzZSBpZihudWxsICE9IG5hbWUpDQotICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUobmFtZS5pbWFnZSk7DQotICAgICAgICB9DQotICAgICAgICAoPExQQVJFTj4gRXhwcmVzc2lvbigpICg8Q09NTUE+IEV4cHJlc3Npb24oKSkqIHRyeSAgeyAoPFJQQVJFTj4pIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSApPy8qQGJnZW4oamp0cmVlKSovDQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgIH0gZmluYWxseSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgIH0NCi0gICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExpdGVyYWwoKSA6IHsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbCAqLw0KLSAgQVNUTGl0ZXJhbCBqanRuMDAwID0gbmV3IEFTVExpdGVyYWwoSkpUTElURVJBTCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExpdGVyYWwgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8VFJVRT4gfCA8RkFMU0U+IHwgPElOVEVHRVJfTElURVJBTD4gfCA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gfCA8U1RSSU5HX0xJVEVSQUw+IHwgPE5VTEw+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qanQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamp0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQ0MGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qanQKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogSSBrbm93IHRoYXQgaGF2aW5nIHNvbWUgb2YgdGhlc2Ugb3B0aW9ucyBvbiBvbmUgbGluZSBpcyBydWRlIGJ1dCANCi0gKiBpZiB3ZSBkb24ndCBkbyB0aGF0IHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBmcm9tIGphdmFjYyBhcmUgb2ZmDQotICogd2hpY2gsIHRydXN0IG1lLCBpcyBmYXIgbW9yZSBhbm5veWluZy4gIC0tdGNhcnJvbGxAYmVhLmNvbQ0KLSAqLw0KLW9wdGlvbnMgew0KLSAgSkFWQV9VTklDT0RFX0VTQ0FQRSA9IGZhbHNlOw0KLSAgVU5JQ09ERV9JTlBVVCA9IHRydWU7DQotICBTVEFUSUMgPSBmYWxzZTsNCi0gIE9QVElNSVpFX1RPS0VOX01BTkFHRVIgPSB0cnVlOyBNVUxUSSA9IHRydWU7IFZJU0lUT1IgPSB0cnVlOyBOT0RFX1BBQ0tBR0UgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwiOyBOT0RFX1NDT1BFX0hPT0sgPSB0cnVlOw0KLX0NCi0NCi1QQVJTRVJfQkVHSU4oSlNQRUxQYXJzZXIpDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsNCi0NCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXIgew0KLSAgDQotICB2b2lkIGpqdHJlZU9wZW5Ob2RlU2NvcGUoTm9kZSBuKQ0KLSAgew0KLSAgICAgICAgICAoKFNpbXBsZU5vZGUpbikuc2V0Rmlyc3RUb2tlbihnZXRUb2tlbigxKSk7DQotICB9DQotDQotICB2b2lkIGpqdHJlZUNsb3NlTm9kZVNjb3BlKE5vZGUgbikNCi0gIHsNCi0gICAgKChTaW1wbGVOb2RlKW4pLnNldExhc3RUb2tlbihnZXRUb2tlbigwKSk7DQotICB9DQotICANCi0gIHB1YmxpYyBzdGF0aWMgSlNQRUxQYXJzZXIgY3JlYXRlUGFyc2VyKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgcmV0dXJuIG5ldyBKU1BFTFBhcnNlcihyZWFkZXIpOw0KLSAgfQ0KLSAgDQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgIFJlSW5pdChyZWFkZXIpOw0KLSAgfQ0KLSAgDQotfQ0KLQ0KLVBBUlNFUl9FTkQoSlNQRUxQYXJzZXIpDQotDQotU0tJUCA6DQotew0KLSAgIiAiDQotfCAiXHQiDQotfCAiXG4iDQotfCAiXHIiDQotfQ0KLQ0KLVRPS0VOIDoNCi17DQotLyogTGl0ZXJhbHMgKi8NCi0gIDwgSU5URUdFUl9MSVRFUkFMOiBbIjAiLSI5Il0gKFsiMCItIjkiXSkqID4NCi18DQotICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6DQotICAgICAgICAoWyIwIi0iOSJdKSsgIi4iIChbIjAiLSI5Il0pKiAoPEVYUE9ORU5UPik/DQotICAgICAgfCAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8NCi0gICAgICB8IChbIjAiLSI5Il0pKyA8RVhQT05FTlQ+DQotICA+DQotfA0KLSAgPCAjRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4NCi18DQotICA8IFNUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICgoflsiXCIiLCJcXCJdKSB8ICgiXFwiICggWyJcXCIsIlwiIl0gKSkpKiAiXCIiKSB8DQotICAgICAgKCJcJyIgKCh+WyJcJyIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCciXSApKSkqICJcJyIpDQotICA+DQotfA0KLSAgPCBCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICh+WyJcIiIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCIiXSApKSkgfA0KLSAgICAgICgiXCciICh+WyJcJyIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCciXSApKSkNCi0gID4NCi0NCi0vKiBSZXNlcnZlZCBXb3JkcyBhbmQgU3ltYm9scyAqLw0KLXwgPCBUUlVFOiAidHJ1ZSIgPg0KLXwgPCBGQUxTRTogImZhbHNlIiA+DQotfCA8IE5VTEw6ICJudWxsIiA+DQotfCA8IERPVDogIi4iID4NCi18IDwgR1QxOiAiPiIgPg0KLXwgPCBHVDI6ICJndCIgPg0KLXwgPCBMVDE6ICI8IiA+DQotfCA8IExUMjogImx0IiA+DQotfCA8IEVRMTogIj09IiA+DQotfCA8IEVRMjogImVxIiA+DQotfCA8IExFMTogIjw9IiA+DQotfCA8IExFMjogImxlIiA+DQotfCA8IEdFMTogIj49IiA+DQotfCA8IEdFMjogImdlIiA+DQotfCA8IE5FUTE6ICIhPSIgPg0KLXwgPCBORVEyOiAibmUiID4NCi18IDwgTFBBUkVOOiAiKCIgPg0KLXwgPCBSUEFSRU46ICIpIiA+DQotfCA8IENPTU1BOiAiLCIgPg0KLXwgPCBDT0xPTjogIjoiID4NCi18IDwgTEJSQUNLRVQ6ICJbIiA+DQotfCA8IFJCUkFDS0VUOiAiXSIgPg0KLXwgPCBQTFVTOiAiKyIgPg0KLXwgPCBNSU5VUzogIi0iID4NCi18IDwgTVVMVElQTFk6ICIqIiA+DQotfCA8IERJVklERTE6ICIvIiA+DQotfCA8IERJVklERTI6ICJkaXYiID4NCi18IDwgTU9EVUxVUzE6ICIlIiA+DQotfCA8IE1PRFVMVVMyOiAibW9kIiA+DQotfCA8IE5PVDE6ICJub3QiID4NCi18IDwgTk9UMjogIiEiID4NCi18IDwgQU5EMTogImFuZCIgPg0KLXwgPCBBTkQyOiAiJiYiID4NCi18IDwgT1IxOiAib3IiID4NCi18IDwgT1IyOiAifHwiID4NCi18IDwgRU1QVFk6ICJlbXB0eSIgPg0KLXwgPCBDT05EOiAiPyIgPg0KLQ0KLS8qIElkZW50aWZpZXJzICovDQotDQotfCA8IElERU5USUZJRVI6ICg8TEVUVEVSPnw8SU1QTF9PQkpfU1RBUlQ+KSAoPExFVFRFUj58PERJR0lUPikqID4NCi18IDwgI0lNUExfT0JKX1NUQVJUOiAiIyIgPg0KLXwNCi0gIDwgI0xFVFRFUjoNCi0gICAgICBbDQotICAgICAgICJcdTAwMjQiLA0KLSAgICAgICAiXHUwMDQxIi0iXHUwMDVhIiwNCi0gICAgICAgIlx1MDA1ZiIsDQotICAgICAgICJcdTAwNjEiLSJcdTAwN2EiLA0KLSAgICAgICAiXHUwMGMwIi0iXHUwMGQ2IiwNCi0gICAgICAgIlx1MDBkOCItIlx1MDBmNiIsDQotICAgICAgICJcdTAwZjgiLSJcdTAwZmYiLA0KLSAgICAgICAiXHUwMTAwIi0iXHUxZmZmIiwNCi0gICAgICAgIlx1MzA0MCItIlx1MzE4ZiIsDQotICAgICAgICJcdTMzMDAiLSJcdTMzN2YiLA0KLSAgICAgICAiXHUzNDAwIi0iXHUzZDJkIiwNCi0gICAgICAgIlx1NGUwMCItIlx1OWZmZiIsDQotICAgICAgICJcdWY5MDAiLSJcdWZhZmYiDQotICAgICAgXQ0KLSAgPg0KLXwNCi0gIDwgI0RJR0lUOg0KLSAgICAgIFsNCi0gICAgICAgIlx1MDAzMCItIlx1MDAzOSIsDQotICAgICAgICJcdTA2NjAiLSJcdTA2NjkiLA0KLSAgICAgICAiXHUwNmYwIi0iXHUwNmY5IiwNCi0gICAgICAgIlx1MDk2NiItIlx1MDk2ZiIsDQotICAgICAgICJcdTA5ZTYiLSJcdTA5ZWYiLA0KLSAgICAgICAiXHUwYTY2Ii0iXHUwYTZmIiwNCi0gICAgICAgIlx1MGFlNiItIlx1MGFlZiIsDQotICAgICAgICJcdTBiNjYiLSJcdTBiNmYiLA0KLSAgICAgICAiXHUwYmU3Ii0iXHUwYmVmIiwNCi0gICAgICAgIlx1MGM2NiItIlx1MGM2ZiIsDQotICAgICAgICJcdTBjZTYiLSJcdTBjZWYiLA0KLSAgICAgICAiXHUwZDY2Ii0iXHUwZDZmIiwNCi0gICAgICAgIlx1MGU1MCItIlx1MGU1OSIsDQotICAgICAgICJcdTBlZDAiLSJcdTBlZDkiLA0KLSAgICAgICAiXHUxMDQwIi0iXHUxMDQ5Ig0KLSAgICAgIF0NCi0gID4NCi19DQotDQotQVNURXhwcmVzc2lvbiBFeHByZXNzaW9uKCkgOiB7fQ0KLXsNCi0gICAgICAgIChMT09LQUhFQUQoIj8iKSBDaG9pY2VFeHByZXNzaW9uKCkgfCBPckV4cHJlc3Npb24oKSkgeyByZXR1cm4gamp0VGhpczsgfQ0KLX0NCi0NCi12b2lkIE9yRXhwcmVzc2lvbigpICNPckV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpICgodCA9IDxPUjE+IHwgdCA9IDxPUjI+KSB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpKSoNCi19DQotDQotdm9pZCBBbmRFeHByZXNzaW9uKCkgI0FuZEV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKCh0ID0gPEFORDE+IHwgdCA9IDxBTkQyPikgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpKSogICAgICAgIA0KLX0NCi0NCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpICNFcXVhbGl0eUV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSANCi0gICAgICAgICgodCA9IDxFUTE+IHwgdCA9IDxFUTI+IHwgdCA9IDxORVExPiB8IHQgPSA8TkVRMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpKSoNCi19DQotDQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+MSkgOg0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIEFkZEV4cHJlc3Npb24oKSANCi0gICAgICAgICgNCi0gICAgICAgICAgICAgICAgKHQgPSA8TFQxPiB8IHQgPSA8TFQyPiB8IHQgPSA8R1QxPiB8IHQgPSA8R1QyPiB8IHQgPSA8R0UxPiB8IHQgPSA8R0UyPiB8IHQgPSA8TEUxPiB8IHQgPSA8TEUyPikgIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIEFkZEV4cHJlc3Npb24oKQ0KLSAgICAgICAgKSoNCi19DQotDQotdm9pZCBBZGRFeHByZXNzaW9uKCkgI0FkZEV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCkgKCh0ID0gPFBMVVM+IHwgdCA9IDxNSU5VUz4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSkqDQotfQ0KLQ0KLXZvaWQgTXVsdGlwbHlFeHByZXNzaW9uKCkgI011bHRpcGx5RXhwcmVzc2lvbig+MSkgOiANCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoDQotICAgICAgICAgICAgICAgICggdCA9IDxNVUxUSVBMWT4gfCB0ID0gPERJVklERTE+IHwgdCA9IDxESVZJREUyPiB8IHQgPSA8TU9EVUxVUzE+IHwgdCA9IDxNT0RVTFVTMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpICAgICAgICANCi0gICAgICAgICkqDQotfQ0KLQ0KLXZvaWQgQ2hvaWNlRXhwcmVzc2lvbigpIDoge30NCi17DQotICAgICAgICBPckV4cHJlc3Npb24oKSA8Q09ORD4gT3JFeHByZXNzaW9uKCkgPENPTE9OPiBPckV4cHJlc3Npb24oKQ0KLX0NCi0NCi12b2lkIFVuYXJ5RXhwcmVzc2lvbigpIDoge30NCi17DQotICAgICAgICAoKDxOT1QxPiB8IDxOT1QyPiB8IDxNSU5VUz4gfCA8RU1QVFk+KSBVbmFyeUV4cHJlc3Npb24oKSkNCi0gICAgICAgIHwgVmFsdWUoKQ0KLSAgICAgICAgDQotfQ0KLQ0KLXZvaWQgVmFsdWUoKSA6IHt9DQotew0KLSAgICAgICAgVmFsdWVQcmVmaXgoKSAoVmFsdWVTdWZmaXgoKSkqDQotfQ0KLQ0KLXZvaWQgVmFsdWVQcmVmaXgoKSA6IHt9DQotew0KLSAgICBMaXRlcmFsKCkgfCAoPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+KSB8IExPT0tBSEVBRCgzKSBGdW5jdGlvbkludm9jYXRpb24oKSB8IDxJREVOVElGSUVSPiANCi19DQotDQotdm9pZCBWYWx1ZVN1ZmZpeCgpIDogDQotew0KLSAgICAgICAgVG9rZW4gdCA9IG51bGw7DQotfQ0KLXsNCi0gICAgICAgICg8RE9UPiAodCA9IDxJREVOVElGSUVSPik/KSB7IGpqdFRoaXMuc2V0UHJvcGVydHlOYW1lVG9rZW4odCk7IH0NCi0gICAgICAgIHwgKDxMQlJBQ0tFVD4gRXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4pDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25JbnZvY2F0aW9uKCkgOiANCi17DQotICAgICAgICBUb2tlbiBwcmVmaXggPSBudWxsLCBuYW1lID0gbnVsbDsNCi19DQotew0KLSAgICAocHJlZml4ID0gPElERU5USUZJRVI+IDxDT0xPTj4pIHsgamp0VGhpcy5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6Iik7IH0NCi0gICAgICAgIChuYW1lID0gPElERU5USUZJRVI+KT8gew0KLSAgICAgICAgICAgIGlmKG51bGwgIT0gcHJlZml4ICYmIG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdFRoaXMuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7DQotICAgICAgICAgICAgZWxzZSBpZihudWxsICE9IG5hbWUpDQotICAgICAgICAgICAgICAgICAgICBqanRUaGlzLnNldEZ1bGxGdW5jdGlvbk5hbWUobmFtZS5pbWFnZSk7DQotICAgICAgICB9DQotICAgICAgICAoPExQQVJFTj4gRXhwcmVzc2lvbigpICg8Q09NTUE+IEV4cHJlc3Npb24oKSkqIHRyeSAgeyAoPFJQQVJFTj4pIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSApPw0KLX0NCi0NCi12b2lkIExpdGVyYWwoKSA6IHt9DQotew0KLSAgICAgICAgPFRSVUU+IHwgPEZBTFNFPiB8IDxJTlRFR0VSX0xJVEVSQUw+IHwgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IHwgPFNUUklOR19MSVRFUkFMPiB8IDxOVUxMPg0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzAxYmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWUmSmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTFBhcnNlci8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMsIEpTUEVMUGFyc2VyQ29uc3RhbnRzIHsvKkBiZ2VuKGpqdHJlZSkqLwotICBwcm90ZWN0ZWQgSkpUSlNQRUxQYXJzZXJTdGF0ZSBqanRyZWUgPSBuZXcgSkpUSlNQRUxQYXJzZXJTdGF0ZSgpOwotICB2b2lkIGpqdHJlZU9wZW5Ob2RlU2NvcGUoTm9kZSBuKQotICB7Ci0gICAgICAgICAgKChTaW1wbGVOb2RlKW4pLnNldEZpcnN0VG9rZW4oZ2V0VG9rZW4oMSkpOwotICB9Ci0KLSAgdm9pZCBqanRyZWVDbG9zZU5vZGVTY29wZShOb2RlIG4pCi0gIHsKLSAgICAoKFNpbXBsZU5vZGUpbikuc2V0TGFzdFRva2VuKGdldFRva2VuKDApKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSlNQRUxQYXJzZXIgY3JlYXRlUGFyc2VyKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOwotICAgICAgICAgIHJldHVybiBuZXcgSlNQRUxQYXJzZXIocmVhZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7Ci0gICAgICAgICAgIFJlSW5pdChyZWFkZXIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEFTVEV4cHJlc3Npb24gRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvbiAqLwotICBBU1RFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXhwcmVzc2lvbihKSlRFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzEoMjE0NzQ4MzY0NykpIHsKLSAgICAgICAgQ2hvaWNlRXhwcmVzc2lvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgY2FzZSBOT1QxOgotICAgICAgICBjYXNlIE5PVDI6Ci0gICAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBPckV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gamp0bjAwMDt9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBPckV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjT3JFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUT3JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUT3JFeHByZXNzaW9uKEpKVE9SRVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIEFuZEV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzE6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBPUjE6Ci0gICAgICAgIGNhc2UgT1IyOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE9SMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihPUjEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9SMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihPUjIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBBbmRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQW5kRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNBbmRFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUQW5kRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFuZEV4cHJlc3Npb24oSkpUQU5ERVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFORDE6Ci0gICAgICAgIGNhc2UgQU5EMjoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbM10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBBTkQxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEFORDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFORDI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oQU5EMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzRdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjRXF1YWxpdHlFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8zOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRVExOgotICAgICAgICBjYXNlIEVRMjoKLSAgICAgICAgY2FzZSBORVExOgotICAgICAgICBjYXNlIE5FUTI6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzVdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzM7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRVExOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEVRMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVEyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEVRMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkVRMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihORVExKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBORVEyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE5FUTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs2XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBBZGRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF80OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgR1QxOgotICAgICAgICBjYXNlIEdUMjoKLSAgICAgICAgY2FzZSBMVDE6Ci0gICAgICAgIGNhc2UgTFQyOgotICAgICAgICBjYXNlIExFMToKLSAgICAgICAgY2FzZSBMRTI6Ci0gICAgICAgIGNhc2UgR0UxOgotICAgICAgICBjYXNlIEdFMjoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbN10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNDsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBMVDE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTFQxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVDI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTFQyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHVDE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR1QxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHVDI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR1QyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHRTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR0UxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHRTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR0UyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMRTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTEUxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMRTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTEUyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIEFkZEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBZGRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI0FkZEV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RBZGRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQWRkRXhwcmVzc2lvbihKSlRBRERFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF81OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKFBMVVMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1JTlVTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTBdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTXVsdGlwbHlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI011bHRpcGx5RXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVE11bHRpcGx5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE11bHRpcGx5RXhwcmVzc2lvbihKSlRNVUxUSVBMWUVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzY6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBNVUxUSVBMWToKLSAgICAgICAgY2FzZSBESVZJREUxOgotICAgICAgICBjYXNlIERJVklERTI6Ci0gICAgICAgIGNhc2UgTU9EVUxVUzE6Ci0gICAgICAgIGNhc2UgTU9EVUxVUzI6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzExXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF82OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE1VTFRJUExZOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1VTFRJUExZKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESVZJREUxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKERJVklERTEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJVklERTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oRElWSURFMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTU9EVUxVUzE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTU9EVUxVUzEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1PRFVMVVMyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1PRFVMVVMyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTJdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENob2ljZUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIENob2ljZUV4cHJlc3Npb24gKi8KLSAgQVNUQ2hvaWNlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVENob2ljZUV4cHJlc3Npb24oSkpUQ0hPSUNFRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBPckV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09ORCk7Ci0gICAgICBPckV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVW5hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIFVuYXJ5RXhwcmVzc2lvbiAqLwotICBBU1RVbmFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RVbmFyeUV4cHJlc3Npb24oSkpUVU5BUllFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBNSU5VUzoKLSAgICAgIGNhc2UgTk9UMToKLSAgICAgIGNhc2UgTk9UMjoKLSAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE5PVDE6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOT1QyOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihNSU5VUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihFTVBUWSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEzXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFZhbHVlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzE0XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhbHVlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgVmFsdWUgKi8KLSAgQVNUVmFsdWUgamp0bjAwMCA9IG5ldyBBU1RWYWx1ZShKSlRWQUxVRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBWYWx1ZVByZWZpeCgpOwotICAgICAgbGFiZWxfNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIERPVDoKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTVdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzc7Ci0gICAgICAgIH0KLSAgICAgICAgVmFsdWVTdWZmaXgoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYWx1ZVByZWZpeCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIFZhbHVlUHJlZml4ICovCi0gIEFTVFZhbHVlUHJlZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVQcmVmaXgoSkpUVkFMVUVQUkVGSVgpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgICBMaXRlcmFsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgRXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzE2XSA9IGpqX2dlbjsKLSAgICAgICAgaWYgKGpqXzJfMigzKSkgewotICAgICAgICAgIEZ1bmN0aW9uSW52b2NhdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzE3XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgfQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhbHVlU3VmZml4KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFsdWVTdWZmaXggKi8KLSAgICAgICAgQVNUVmFsdWVTdWZmaXggamp0bjAwMCA9IG5ldyBBU1RWYWx1ZVN1ZmZpeChKSlRWQUxVRVNVRkZJWCk7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRE9UOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE4XSA9IGpqX2dlbjsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0UHJvcGVydHlOYW1lVG9rZW4odCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7Ci0gICAgICAgIEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzE5XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bmN0aW9uSW52b2NhdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bmN0aW9uSW52b2NhdGlvbiAqLwotICAgICAgICBBU1RGdW5jdGlvbkludm9jYXRpb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkludm9jYXRpb24oSkpURlVOQ1RJT05JTlZPQ0FUSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gcHJlZml4ID0gbnVsbCwgbmFtZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgIHByZWZpeCA9IGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6Iik7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgbmFtZSA9IGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzIwXSA9IGpqX2dlbjsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICAgICAgICBpZihudWxsICE9IHByZWZpeCAmJiBudWxsICE9IG5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7Ci0gICAgICAgICAgICBlbHNlIGlmKG51bGwgIT0gbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKG5hbWUuaW1hZ2UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBFeHByZXNzaW9uKCk7Ci0gICAgICAgIGxhYmVsXzg6Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsyMV0gPSBqal9nZW47Ci0gICAgICAgICAgICBicmVhayBsYWJlbF84OwotICAgICAgICAgIH0KLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgICBFeHByZXNzaW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyMl0gPSBqal9nZW47Ci0gICAgICAgIAotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXRlcmFsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBMaXRlcmFsICovCi0gIEFTVExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsKEpKVExJVEVSQUwpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJVRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5URUdFUl9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOVUxMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0NykpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTAoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgewotICAgIGlmIChqal8zUl85KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09ORCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBKU1BFTFBhcnNlclRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7Ci0gIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOwotICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OwotICBwcml2YXRlIGludCBqal9udGs7Ci0gIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKLSAgcHJpdmF0ZSBpbnQgampfbGE7Ci0gIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBaGVhZCA9IGZhbHNlOwotLy8gIHByaXZhdGUgYm9vbGVhbiBqal9zZW1MQTsKLSAgcHJpdmF0ZSBpbnQgampfZ2VuOwotICBmaW5hbCBwcml2YXRlIGludFtdIGpqX2xhMSA9IG5ldyBpbnRbMjRdOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMDsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzE7Ci0gIHN0YXRpYyB7Ci0gICAgICBqal9sYTFfMCgpOwotICAgICAgampfbGExXzEoKTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzAoKSB7Ci0gICAgICBqal9sYTFfMCA9IG5ldyBpbnRbXSB7MHg0MDAxZDYwLDB4MCwweDAsMHgwLDB4MCwweDMwYzAwMDAsMHgzMGMwMDAwLDB4ZjNjMDAwLDB4ZjNjMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0MDAxZDYwLDB4NDAwMDIwMDAsMHg0MDAxZDYwLDB4MCwweDAsMHg0MDAwMjAwMCwweDAsMHgxMDAwMDAwMCwweDQwMDAwMDAsMHgxZDYwLH07Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8xKCkgewotICAgICAgampfbGExXzEgPSBuZXcgaW50W10gezB4YTE4MiwweDE4MDAsMHgxODAwLDB4NjAwLDB4NjAwLDB4MCwweDAsMHgwLDB4MCwweDMsMHgzLDB4N2MsMHg3YywweDIxODIsMHhhMTgyLDB4MCwweDAsMHg4MDAwLDB4ODAwMCwweDAsMHg4MDAwLDB4MCwweDAsMHgwLH07Ci0gICB9Ci0gIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzJdOwotICBwcml2YXRlIGJvb2xlYW4gampfcmVzY2FuID0gZmFsc2U7Ci0gIHByaXZhdGUgaW50IGpqX2djID0gMDsKLQotICBwdWJsaWMgSlNQRUxQYXJzZXIoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqdHJlZS5yZXNldCgpOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBKU1BFTFBhcnNlcihqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgSlNQRUxQYXJzZXIoSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChKU1BFTFBhcnNlclRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBUb2tlbiBqal9jb25zdW1lX3Rva2VuKGludCBraW5kKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIG9sZFRva2VuOwotICAgIGlmICgob2xkVG9rZW4gPSB0b2tlbikubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgaWYgKHRva2VuLmtpbmQgPT0ga2luZCkgewotICAgICAgampfZ2VuKys7Ci0gICAgICBpZiAoKytqal9nYyA+IDEwMCkgewotICAgICAgICBqal9nYyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgSkpDYWxscyBjID0gampfMl9ydG5zW2ldOwotICAgICAgICAgIHdoaWxlIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjLmdlbiA8IGpqX2dlbikgYy5maXJzdCA9IG51bGw7Ci0gICAgICAgICAgICBjID0gYy5uZXh0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLSAgICB0b2tlbiA9IG9sZFRva2VuOwotICAgIGpqX2tpbmQgPSBraW5kOwotICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsgCi0gIH0KLSAgZmluYWwgcHJpdmF0ZSBMb29rYWhlYWRTdWNjZXNzIGpqX2xzID0gbmV3IExvb2thaGVhZFN1Y2Nlc3MoKTsKLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqX3NjYW5fdG9rZW4oaW50IGtpbmQpIHsKLSAgICBpZiAoampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB7Ci0gICAgICBqal9sYS0tOwotICAgICAgaWYgKGpqX3NjYW5wb3MubmV4dCA9PSBudWxsKSB7Ci0gICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgfQotICAgIGlmIChqal9yZXNjYW4pIHsKLSAgICAgIGludCBpID0gMDsgVG9rZW4gdG9rID0gdG9rZW47Ci0gICAgICB3aGlsZSAodG9rICE9IG51bGwgJiYgdG9rICE9IGpqX3NjYW5wb3MpIHsgaSsrOyB0b2sgPSB0b2submV4dDsgfQotICAgICAgaWYgKHRvayAhPSBudWxsKSBqal9hZGRfZXJyb3JfdG9rZW4oa2luZCwgaSk7Ci0gICAgfQotICAgIGlmIChqal9zY2FucG9zLmtpbmQgIT0ga2luZCkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX2xhID09IDAgJiYgampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB0aHJvdyBqal9sczsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgewotICAgIGlmICh0b2tlbi5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKLSAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4rKzsKLSAgICByZXR1cm4gdG9rZW47Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oaW50IGluZGV4KSB7Ci0gICAgVG9rZW4gdCA9IGxvb2tpbmdBaGVhZCA/IGpqX3NjYW5wb3MgOiB0b2tlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLSAgICAgIGlmICh0Lm5leHQgIT0gbnVsbCkgdCA9IHQubmV4dDsKLSAgICAgIGVsc2UgdCA9IHQubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHQ7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGludCBqal9udGsoKSB7Ci0gICAgaWYgKChqal9udD10b2tlbi5uZXh0KSA9PSBudWxsKQotICAgICAgcmV0dXJuIChqal9udGsgPSAodG9rZW4ubmV4dD10b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCkpLmtpbmQpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoampfbnRrID0gampfbnQua2luZCk7Ci0gIH0KLQotICBwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgampfZXhwZW50cmllcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gIHByaXZhdGUgaW50W10gampfZXhwZW50cnk7Ci0gIHByaXZhdGUgaW50IGpqX2tpbmQgPSAtMTsKLSAgcHJpdmF0ZSBpbnRbXSBqal9sYXN0dG9rZW5zID0gbmV3IGludFsxMDBdOwotICBwcml2YXRlIGludCBqal9lbmRwb3M7Ci0KLSAgcHJpdmF0ZSB2b2lkIGpqX2FkZF9lcnJvcl90b2tlbihpbnQga2luZCwgaW50IHBvcykgewotICAgIGlmIChwb3MgPj0gMTAwKSByZXR1cm47Ci0gICAgaWYgKHBvcyA9PSBqal9lbmRwb3MgKyAxKSB7Ci0gICAgICBqal9sYXN0dG9rZW5zW2pqX2VuZHBvcysrXSA9IGtpbmQ7Ci0gICAgfSBlbHNlIGlmIChqal9lbmRwb3MgIT0gMCkgewotICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50W2pqX2VuZHBvc107Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2VuZHBvczsgaSsrKSB7Ci0gICAgICAgIGpqX2V4cGVudHJ5W2ldID0gampfbGFzdHRva2Vuc1tpXTsKLSAgICAgIH0KLSAgICAgIGJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0gICAgICBmb3IgKGphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gampfZXhwZW50cmllcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICBpbnRbXSBvbGRlbnRyeSA9IChpbnRbXSkoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKG9sZGVudHJ5Lmxlbmd0aCA9PSBqal9leHBlbnRyeS5sZW5ndGgpIHsKLSAgICAgICAgICBleGlzdHMgPSB0cnVlOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cnkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChvbGRlbnRyeVtpXSAhPSBqal9leHBlbnRyeVtpXSkgewotICAgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChleGlzdHMpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWV4aXN0cykgampfZXhwZW50cmllcy5hZGRFbGVtZW50KGpqX2V4cGVudHJ5KTsKLSAgICAgIGlmIChwb3MgIT0gMCkgampfbGFzdHRva2Vuc1soampfZW5kcG9zID0gcG9zKSAtIDFdID0ga2luZDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpIHsKLSAgICBqal9leHBlbnRyaWVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgYm9vbGVhbltdIGxhMXRva2VucyA9IG5ldyBib29sZWFuWzUxXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDUxOyBpKyspIHsKLSAgICAgIGxhMXRva2Vuc1tpXSA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAoampfa2luZCA+PSAwKSB7Ci0gICAgICBsYTF0b2tlbnNbampfa2luZF0gPSB0cnVlOwotICAgICAgampfa2luZCA9IC0xOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIHsKLSAgICAgIGlmIChqal9sYTFbaV0gPT0gampfZ2VuKSB7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7IGorKykgewotICAgICAgICAgIGlmICgoampfbGExXzBbaV0gJiAoMTw8aikpICE9IDApIHsKLSAgICAgICAgICAgIGxhMXRva2Vuc1tqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgoampfbGExXzFbaV0gJiAoMTw8aikpICE9IDApIHsKLSAgICAgICAgICAgIGxhMXRva2Vuc1szMitqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTE7IGkrKykgewotICAgICAgaWYgKGxhMXRva2Vuc1tpXSkgewotICAgICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGpqX2V4cGVudHJ5WzBdID0gaTsKLSAgICAgICAgampfZXhwZW50cmllcy5hZGRFbGVtZW50KGpqX2V4cGVudHJ5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgampfZW5kcG9zID0gMDsKLSAgICBqal9yZXNjYW5fdG9rZW4oKTsKLSAgICBqal9hZGRfZXJyb3JfdG9rZW4oMCwgMCk7Ci0gICAgaW50W11bXSBleHB0b2tzZXEgPSBuZXcgaW50W2pqX2V4cGVudHJpZXMuc2l6ZSgpXVtdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cmllcy5zaXplKCk7IGkrKykgewotICAgICAgZXhwdG9rc2VxW2ldID0gKGludFtdKWpqX2V4cGVudHJpZXMuZWxlbWVudEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuLCBleHB0b2tzZXEsIHRva2VuSW1hZ2UpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZW5hYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBkaXNhYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIHZvaWQgampfcmVzY2FuX3Rva2VuKCkgewotICAgIGpqX3Jlc2NhbiA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpXTsKLSAgICAgIGRvIHsKLSAgICAgICAgaWYgKHAuZ2VuID4gampfZ2VuKSB7Ci0gICAgICAgICAgampfbGEgPSBwLmFyZzsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBwLmZpcnN0OwotICAgICAgICAgIHN3aXRjaCAoaSkgewotICAgICAgICAgICAgY2FzZSAwOiBqal8zXzEoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IGpqXzNfMigpOyBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IHAubmV4dDsKLSAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7Ci0gICAgfQotICAgIGpqX3Jlc2NhbiA9IGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3NhdmUoaW50IGluZGV4LCBpbnQgeGxhKSB7Ci0gICAgSkpDYWxscyBwID0gampfMl9ydG5zW2luZGV4XTsKLSAgICB3aGlsZSAocC5nZW4gPiBqal9nZW4pIHsKLSAgICAgIGlmIChwLm5leHQgPT0gbnVsbCkgeyBwID0gcC5uZXh0ID0gbmV3IEpKQ2FsbHMoKTsgYnJlYWs7IH0KLSAgICAgIHAgPSBwLm5leHQ7Ci0gICAgfQotICAgIHAuZ2VuID0gampfZ2VuICsgeGxhIC0gampfbGE7IHAuZmlyc3QgPSB0b2tlbjsgcC5hcmcgPSB4bGE7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgY2xhc3MgSkpDYWxscyB7Ci0gICAgaW50IGdlbjsKLSAgICBUb2tlbiBmaXJzdDsKLSAgICBpbnQgYXJnOwotICAgIEpKQ2FsbHMgbmV4dDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRlM2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGludGVyZmFjZSBKU1BFTFBhcnNlckNvbnN0YW50cyB7Ci0KLSAgaW50IEVPRiA9IDA7Ci0gIGludCBJTlRFR0VSX0xJVEVSQUwgPSA1OwotICBpbnQgRkxPQVRJTkdfUE9JTlRfTElURVJBTCA9IDY7Ci0gIGludCBFWFBPTkVOVCA9IDc7Ci0gIGludCBTVFJJTkdfTElURVJBTCA9IDg7Ci0gIGludCBCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMID0gOTsKLSAgaW50IFRSVUUgPSAxMDsKLSAgaW50IEZBTFNFID0gMTE7Ci0gIGludCBOVUxMID0gMTI7Ci0gIGludCBET1QgPSAxMzsKLSAgaW50IEdUMSA9IDE0OwotICBpbnQgR1QyID0gMTU7Ci0gIGludCBMVDEgPSAxNjsKLSAgaW50IExUMiA9IDE3OwotICBpbnQgRVExID0gMTg7Ci0gIGludCBFUTIgPSAxOTsKLSAgaW50IExFMSA9IDIwOwotICBpbnQgTEUyID0gMjE7Ci0gIGludCBHRTEgPSAyMjsKLSAgaW50IEdFMiA9IDIzOwotICBpbnQgTkVRMSA9IDI0OwotICBpbnQgTkVRMiA9IDI1OwotICBpbnQgTFBBUkVOID0gMjY7Ci0gIGludCBSUEFSRU4gPSAyNzsKLSAgaW50IENPTU1BID0gMjg7Ci0gIGludCBDT0xPTiA9IDI5OwotICBpbnQgTEJSQUNLRVQgPSAzMDsKLSAgaW50IFJCUkFDS0VUID0gMzE7Ci0gIGludCBQTFVTID0gMzI7Ci0gIGludCBNSU5VUyA9IDMzOwotICBpbnQgTVVMVElQTFkgPSAzNDsKLSAgaW50IERJVklERTEgPSAzNTsKLSAgaW50IERJVklERTIgPSAzNjsKLSAgaW50IE1PRFVMVVMxID0gMzc7Ci0gIGludCBNT0RVTFVTMiA9IDM4OwotICBpbnQgTk9UMSA9IDM5OwotICBpbnQgTk9UMiA9IDQwOwotICBpbnQgQU5EMSA9IDQxOwotICBpbnQgQU5EMiA9IDQyOwotICBpbnQgT1IxID0gNDM7Ci0gIGludCBPUjIgPSA0NDsKLSAgaW50IEVNUFRZID0gNDU7Ci0gIGludCBDT05EID0gNDY7Ci0gIGludCBJREVOVElGSUVSID0gNDc7Ci0gIGludCBJTVBMX09CSl9TVEFSVCA9IDQ4OwotICBpbnQgTEVUVEVSID0gNDk7Ci0gIGludCBESUdJVCA9IDUwOwotCi0gIGludCBERUZBVUxUID0gMDsKLQotICBTdHJpbmdbXSB0b2tlbkltYWdlID0gewotICAgICI8RU9GPiIsCi0gICAgIlwiIFwiIiwKLSAgICAiXCJcXHRcIiIsCi0gICAgIlwiXFxuXCIiLAotICAgICJcIlxcclwiIiwKLSAgICAiPElOVEVHRVJfTElURVJBTD4iLAotICAgICI8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4iLAotICAgICI8RVhQT05FTlQ+IiwKLSAgICAiPFNUUklOR19MSVRFUkFMPiIsCi0gICAgIjxCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMPiIsCi0gICAgIlwidHJ1ZVwiIiwKLSAgICAiXCJmYWxzZVwiIiwKLSAgICAiXCJudWxsXCIiLAotICAgICJcIi5cIiIsCi0gICAgIlwiPlwiIiwKLSAgICAiXCJndFwiIiwKLSAgICAiXCI8XCIiLAotICAgICJcImx0XCIiLAotICAgICJcIj09XCIiLAotICAgICJcImVxXCIiLAotICAgICJcIjw9XCIiLAotICAgICJcImxlXCIiLAotICAgICJcIj49XCIiLAotICAgICJcImdlXCIiLAotICAgICJcIiE9XCIiLAotICAgICJcIm5lXCIiLAotICAgICJcIihcIiIsCi0gICAgIlwiKVwiIiwKLSAgICAiXCIsXCIiLAotICAgICJcIjpcIiIsCi0gICAgIlwiW1wiIiwKLSAgICAiXCJdXCIiLAotICAgICJcIitcIiIsCi0gICAgIlwiLVwiIiwKLSAgICAiXCIqXCIiLAotICAgICJcIi9cIiIsCi0gICAgIlwiZGl2XCIiLAotICAgICJcIiVcIiIsCi0gICAgIlwibW9kXCIiLAotICAgICJcIm5vdFwiIiwKLSAgICAiXCIhXCIiLAotICAgICJcImFuZFwiIiwKLSAgICAiXCImJlwiIiwKLSAgICAiXCJvclwiIiwKLSAgICAiXCJ8fFwiIiwKLSAgICAiXCJlbXB0eVwiIiwKLSAgICAiXCI/XCIiLAotICAgICI8SURFTlRJRklFUj4iLAotICAgICJcIiNcIiIsCi0gICAgIjxMRVRURVI+IiwKLSAgICAiPERJR0lUPiIsCi0gIH07Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMWU3MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgaW1wbGVtZW50cyBKU1BFTFBhcnNlckNvbnN0YW50cwotewotICBwdWJsaWMgIGphdmEuaW8uUHJpbnRTdHJlYW0gZGVidWdTdHJlYW0gPSBTeXN0ZW0ub3V0OwotICBwdWJsaWMgIHZvaWQgc2V0RGVidWdTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSBkcykgeyBkZWJ1Z1N0cmVhbSA9IGRzOyB9Ci1wcml2YXRlIGZpbmFsIGludCBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoaW50IHBvcywgbG9uZyBhY3RpdmUwKQotewotICAgc3dpdGNoIChwb3MpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDJhZDAwMmFhOWMwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ3OwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMmQwMDAwMDFjMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDJhYTgwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDFjMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7Ci0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MmQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAzOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDA4MDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTQwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIHJldHVybiAtMTsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTApCi17Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKHBvcywgYWN0aXZlMCksIHBvcyArIDEpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wQXRQb3MoaW50IHBvcywgaW50IGtpbmQpCi17Ci0gICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKLSAgIHJldHVybiBwb3MgKyAxOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYVdpdGhTdGF0ZXNfMChpbnQgcG9zLCBpbnQga2luZCwgaW50IHN0YXRlKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gcG9zICsgMTsgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKHN0YXRlLCBwb3MgKyAxKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKQotewotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDMzOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDQwOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDAwTCk7Ci0gICAgICBjYXNlIDM3OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDM3KTsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDQwOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI2KTsKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjcpOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNCk7Ci0gICAgICBjYXNlIDQzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMyKTsKLSAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjgpOwotICAgICAgY2FzZSA0NToKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzMyk7Ci0gICAgICBjYXNlIDQ2OgotICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMCwgMTMsIDEpOwotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNSk7Ci0gICAgICBjYXNlIDU4OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI5KTsKLSAgICAgIGNhc2UgNjA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTY7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDBMKTsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTQ7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMEwpOwotICAgICAgY2FzZSA2MzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0Nik7Ci0gICAgICBjYXNlIDkxOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMwKTsKLSAgICAgIGNhc2UgOTM6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzEpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDgwMDAwTCk7Ci0gICAgICBjYXNlIDEwMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwMzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODA4MDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjIwMDAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDIwMDEwMDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMEwpOwotICAgICAgY2FzZSAxMjQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDAwMDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoMCwgMCk7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCkKLXsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMCwgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAzODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0Mik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTgpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDIwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAyMik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDI0KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyMSwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyMywgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMjUsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4YzAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAxOSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgNDMsIDYpOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAxNSwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDE3LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDBMKTsKLSAgICAgIGNhc2UgMTI0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0NCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDAsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBvbGQwKTsgCi0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDEsIGFjdGl2ZTApOwotICAgICAgcmV0dXJuIDI7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzOCwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDQxLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDE4MDBMKTsKLSAgICAgIGNhc2UgMTEyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzOSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MDBMKTsKLSAgICAgIGNhc2UgMTE4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzNiwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDEsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBvbGQwKTsgCi0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDIsIGFjdGl2ZTApOwotICAgICAgcmV0dXJuIDM7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDEwLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDEyLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgYWN0aXZlMCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDIsIG9sZDApOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMywgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gNDsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMTEsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEyMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCA0NSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDMsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkKGludCBzdGF0ZSkKLXsKLSAgIGlmIChqanJvdW5kc1tzdGF0ZV0gIT0gampyb3VuZCkKLSAgIHsKLSAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IHN0YXRlOwotICAgICAgampyb3VuZHNbc3RhdGVdID0gampyb3VuZDsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICBkbyB7Ci0gICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBqam5leHRTdGF0ZXNbc3RhcnRdOwotICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKGludCBzdGF0ZTEsIGludCBzdGF0ZTIpCi17Ci0gICBqakNoZWNrTkFkZChzdGF0ZTEpOwotICAgampDaGVja05BZGQoc3RhdGUyKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICBkbyB7Ci0gICAgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLS8vcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCkKLS8vewotLy8gICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKLS8vICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0ICsgMV0pOwotLy99Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMCA9IHsKLSAgIDB4MWZmMDAwMDBmZmZmZmZmZUwsIDB4ZmZmZmZmZmZmZmZmYzAwMEwsIDB4ZmZmZmZmZmZMLCAweDYwMDAwMDAwMDAwMDAwMEwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMiA9IHsKLSAgIDB4MEwsIDB4MEwsIDB4MEwsIDB4ZmY3ZmZmZmZmZjdmZmZmZkwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMyA9IHsKLSAgIDB4MEwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNCA9IHsKLSAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZkwsIDB4MEwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNSA9IHsKLSAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4MEwsIDB4MEwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNiA9IHsKLSAgIDB4M2ZmZmZmZmZmZmZmTCwgMHgwTCwgMHgwTCwgMHgwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM3ID0gewotICAgMHhmZmZmZmZmZmZmZmZmZmZlTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM4ID0gewotICAgMHgwTCwgMHgwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKQotewotICAgaW50IHN0YXJ0c0F0ID0gMDsKLSAgIGpqbmV3U3RhdGVDbnQgPSAzNTsKLSAgIGludCBpID0gMTsKLSAgIGpqc3RhdGVTZXRbMF0gPSBzdGFydFN0YXRlOwotICAgaW50IGtpbmQgPSAweDdmZmZmZmZmOwotICAgZm9yICg7OykKLSAgIHsKLSAgICAgIGlmICgrK2pqcm91bmQgPT0gMHg3ZmZmZmZmZikKLSAgICAgICAgIFJlSW5pdFJvdW5kcygpOwotICAgICAgaWYgKGN1ckNoYXIgPCA2NCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IGN1ckNoYXI7Ci0gICAgICAgIC8vIE1hdGNoTG9vcDogCi0gICAgICAgIAkgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCA0KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgweDE4MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNSwgOSk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM0KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTAsIDE0KTsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxLCAyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTgwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAxMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg5LCAxMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMSwgMTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMSwgMTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE1LCAxNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwLCAxNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzNCAmJiBraW5kID4gOCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA4OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygyNCwgMjUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmZmZmZMICYgbCkgIT0gMEwgJiYga2luZCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNSwgOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmN2ZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSAmJiBraW5kID4gOCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA4OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzMiwgMzMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmZmZmZMICYgbCkgIT0gMEwgJiYga2luZCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICAvL01hdGNoTG9vcDogCi0gICAgICAgIAkgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjEsIDIyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjMsIDI0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjUsIDI2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTUsIDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI3LCAyOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDMwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyOSwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzNDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBoaUJ5dGUgPSBjdXJDaGFyID4+IDg7Ci0gICAgICAgICBpbnQgaTEgPSBoaUJ5dGUgPj4gNjsKLSAgICAgICAgIGxvbmcgbDEgPSAxTCA8PCAoaGlCeXRlICYgMDc3KTsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICAvL01hdGNoTG9vcDogCi0gICAgICAgIAkgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoIWpqQ2FuTW92ZV8wKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8xKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjcsIDI4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikgJiYga2luZCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyOSwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgIHsKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOwotICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICB9Ci0gICAgICArK2N1clBvczsKLSAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDM1IC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQotICAgICAgICAgcmV0dXJuIGN1clBvczsKLSAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBjdXJQb3M7IH0KLSAgIH0KLX0KLXN0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7Ci0gICA4LCA5LCAxMCwgMTUsIDE2LCAyOCwgMjksIDMxLCAzMiwgMzMsIDIwLCAyMSwgMjMsIDI0LCAyNSwgMjAsIAotICAgMjEsIDIzLCAyOCwgMjksIDMxLCAzLCA0LCAxMywgMTQsIDE3LCAxOCwgMjQsIDI1LCAzMiwgMzMsIAotfTsKLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gampDYW5Nb3ZlXzAoaW50IGhpQnl0ZSwgaW50IGkxLCBpbnQgaTIsIGxvbmcgbDEsIGxvbmcgbDIpCi17Ci0gICBzd2l0Y2goaGlCeXRlKQotICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyW2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDQ4OgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzW2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDQ5OgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDUxOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBkZWZhdWx0IDogCi0gICAgICAgICBpZiAoKGpqYml0VmVjMFtpMV0gJiBsMSkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLX0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gampDYW5Nb3ZlXzEoaW50IGhpQnl0ZSwgaW50IGkxLCBpbnQgaTIsIGxvbmcgbDEsIGxvbmcgbDIpCi17Ci0gICBzd2l0Y2goaGlCeXRlKQotICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM4W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBkZWZhdWx0IDogCi0gICAgICAgICBpZiAoKGpqYml0VmVjN1tpMV0gJiBsMSkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gampzdHJMaXRlcmFsSW1hZ2VzID0gewotIiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJcMTY0XDE2MlwxNjVcMTQ1IiwgCi0iXDE0NlwxNDFcMTU0XDE2M1wxNDUiLCAiXDE1NlwxNjVcMTU0XDE1NCIsICJcNTYiLCAiXDc2IiwgIlwxNDdcMTY0IiwgIlw3NCIsICJcMTU0XDE2NCIsICJcNzVcNzUiLCAKLSJcMTQ1XDE2MSIsICJcNzRcNzUiLCAiXDE1NFwxNDUiLCAiXDc2XDc1IiwgIlwxNDdcMTQ1IiwgIlw0MVw3NSIsICJcMTU2XDE0NSIsICJcNTAiLCAKLSJcNTEiLCAiXDU0IiwgIlw3MiIsICJcMTMzIiwgIlwxMzUiLCAiXDUzIiwgIlw1NSIsICJcNTIiLCAiXDU3IiwgIlwxNDRcMTUxXDE2NiIsIAotIlw0NSIsICJcMTU1XDE1N1wxNDQiLCAiXDE1NlwxNTdcMTY0IiwgIlw0MSIsICJcMTQxXDE1NlwxNDQiLCAiXDQ2XDQ2IiwgIlwxNTdcMTYyIiwgCi0iXDE3NFwxNzQiLCAiXDE0NVwxNTVcMTYwXDE2NFwxNzEiLCAiXDc3IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgfTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV4U3RhdGVOYW1lcyA9IHsKLSAgICJERUZBVUxUIiwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7Ci0gICAweGZmZmZmZmZmZmY2MUwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1NraXAgPSB7Ci0gICAweDFlTCwgCi19OwotcHJvdGVjdGVkIFNpbXBsZUNoYXJTdHJlYW0gaW5wdXRfc3RyZWFtOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanJvdW5kcyA9IG5ldyBpbnRbMzVdOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanN0YXRlU2V0ID0gbmV3IGludFs3MF07Ci1wcm90ZWN0ZWQgY2hhciBjdXJDaGFyOwotcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKQotewotICAgaWYgKFNpbXBsZUNoYXJTdHJlYW0uc3RhdGljRmxhZykKLSAgICAgIHRocm93IG5ldyBFcnJvcigiRVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLiIpOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotfQotcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCi17Ci0gICB0aGlzKHN0cmVhbSk7Ci0gICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pCi17Ci0gICBqam1hdGNoZWRQb3MgPSBqam5ld1N0YXRlQ250ID0gMDsKLSAgIGN1ckxleFN0YXRlID0gZGVmYXVsdExleFN0YXRlOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotICAgUmVJbml0Um91bmRzKCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgUmVJbml0Um91bmRzKCkKLXsKLSAgIGludCBpOwotICAgampyb3VuZCA9IDB4ODAwMDAwMDE7Ci0gICBmb3IgKGkgPSAzNTsgaS0tID4gMDspCi0gICAgICBqanJvdW5kc1tpXSA9IDB4ODAwMDAwMDA7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKLXsKLSAgIFJlSW5pdChzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotcHVibGljIHZvaWQgU3dpdGNoVG8oaW50IGxleFN0YXRlKQotewotICAgaWYgKGxleFN0YXRlID49IDEgfHwgbGV4U3RhdGUgPCAwKQotICAgICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoIkVycm9yOiBJZ25vcmluZyBpbnZhbGlkIGxleGljYWwgc3RhdGUgOiAiICsgbGV4U3RhdGUgKyAiLiBTdGF0ZSB1bmNoYW5nZWQuIiwgVG9rZW5NZ3JFcnJvci5JTlZBTElEX0xFWElDQUxfU1RBVEUpOwotICAgZWxzZQotICAgICAgY3VyTGV4U3RhdGUgPSBsZXhTdGF0ZTsKLX0KLQotcHJvdGVjdGVkIFRva2VuIGpqRmlsbFRva2VuKCkKLXsKLSAgIFRva2VuIHQgPSBUb2tlbi5uZXdUb2tlbihqam1hdGNoZWRLaW5kKTsKLSAgIHQua2luZCA9IGpqbWF0Y2hlZEtpbmQ7Ci0gICBTdHJpbmcgaW0gPSBqanN0ckxpdGVyYWxJbWFnZXNbamptYXRjaGVkS2luZF07Ci0gICB0LmltYWdlID0gKGltID09IG51bGwpID8gaW5wdXRfc3RyZWFtLkdldEltYWdlKCkgOiBpbTsKLSAgIHQuYmVnaW5MaW5lID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luTGluZSgpOwotICAgdC5iZWdpbkNvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkNvbHVtbigpOwotICAgdC5lbmRMaW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKLSAgIHQuZW5kQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOwotICAgcmV0dXJuIHQ7Ci19Ci0KLWludCBjdXJMZXhTdGF0ZSA9IDA7Ci1pbnQgZGVmYXVsdExleFN0YXRlID0gMDsKLWludCBqam5ld1N0YXRlQ250OwotaW50IGpqcm91bmQ7Ci1pbnQgamptYXRjaGVkUG9zOwotaW50IGpqbWF0Y2hlZEtpbmQ7Ci0KLXB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSAKLXsKLSAgVG9rZW4gbWF0Y2hlZFRva2VuOwotICBpbnQgY3VyUG9zID0gMDsKLQotICBFT0ZMb29wIDoKLSAgZm9yICg7OykKLSAgeyAgIAotICAgdHJ5ICAgCi0gICB7ICAgICAKLSAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOwotICAgfSAgICAgCi0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCi0gICB7ICAgICAgICAKLSAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOwotICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICB9Ci0KLSAgIHRyeSB7IGlucHV0X3N0cmVhbS5iYWNrdXAoMCk7Ci0gICAgICB3aGlsZSAoY3VyQ2hhciA8PSAzMiAmJiAoMHgxMDAwMDI2MDBMICYgKDFMIDw8IGN1ckNoYXIpKSAhPSAwTCkKLSAgICAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOwotICAgfQotICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsgY29udGludWUgRU9GTG9vcDsgfQotICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7Ci0gICBqam1hdGNoZWRQb3MgPSAwOwotICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOwotICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgIHsKLSAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQotICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKLSAgICAgIGlmICgoamp0b1Rva2VuW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCi0gICAgICB7Ci0gICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGNvbnRpbnVlIEVPRkxvb3A7Ci0gICAgICB9Ci0gICB9Ci0gICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICBpbnQgZXJyb3JfY29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOwotICAgU3RyaW5nIGVycm9yX2FmdGVyID0gbnVsbDsKLSAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOwotICAgdHJ5IHsgaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7IH0KLSAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICBFT0ZTZWVuID0gdHJ1ZTsKLSAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOwotICAgICAgaWYgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdccicpIHsKLSAgICAgICAgIGVycm9yX2xpbmUrKzsKLSAgICAgICAgIGVycm9yX2NvbHVtbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBlcnJvcl9jb2x1bW4rKzsKLSAgIH0KLSAgIGlmICghRU9GU2VlbikgewotICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKLSAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOwotICAgfQotICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoRU9GU2VlbiwgY3VyTGV4U3RhdGUsIGVycm9yX2xpbmUsIGVycm9yX2NvbHVtbiwgZXJyb3JfYWZ0ZXIsIGN1ckNoYXIsIFRva2VuTWdyRXJyb3IuTEVYSUNBTF9FUlJPUik7Ci0gIH0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE2ZTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cwotewotICBwdWJsaWMgaW50IEpKVEVYUFJFU1NJT04gPSAwOwotICBwdWJsaWMgaW50IEpKVE9SRVhQUkVTU0lPTiA9IDE7Ci0gIHB1YmxpYyBpbnQgSkpUQU5ERVhQUkVTU0lPTiA9IDI7Ci0gIHB1YmxpYyBpbnQgSkpURVFVQUxJVFlFWFBSRVNTSU9OID0gMzsKLSAgcHVibGljIGludCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTiA9IDQ7Ci0gIHB1YmxpYyBpbnQgSkpUQURERVhQUkVTU0lPTiA9IDU7Ci0gIHB1YmxpYyBpbnQgSkpUTVVMVElQTFlFWFBSRVNTSU9OID0gNjsKLSAgcHVibGljIGludCBKSlRDSE9JQ0VFWFBSRVNTSU9OID0gNzsKLSAgcHVibGljIGludCBKSlRVTkFSWUVYUFJFU1NJT04gPSA4OwotICBwdWJsaWMgaW50IEpKVFZBTFVFID0gOTsKLSAgcHVibGljIGludCBKSlRWQUxVRVBSRUZJWCA9IDEwOwotICBwdWJsaWMgaW50IEpKVFZBTFVFU1VGRklYID0gMTE7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05JTlZPQ0FUSU9OID0gMTI7Ci0gIHB1YmxpYyBpbnQgSkpUTElURVJBTCA9IDEzOwotCi0KLSAgcHVibGljIFN0cmluZ1tdIGpqdE5vZGVOYW1lID0gewotICAgICJFeHByZXNzaW9uIiwKLSAgICAiT3JFeHByZXNzaW9uIiwKLSAgICAiQW5kRXhwcmVzc2lvbiIsCi0gICAgIkVxdWFsaXR5RXhwcmVzc2lvbiIsCi0gICAgIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwKLSAgICAiQWRkRXhwcmVzc2lvbiIsCi0gICAgIk11bHRpcGx5RXhwcmVzc2lvbiIsCi0gICAgIkNob2ljZUV4cHJlc3Npb24iLAotICAgICJVbmFyeUV4cHJlc3Npb24iLAotICAgICJWYWx1ZSIsCi0gICAgIlZhbHVlUHJlZml4IiwKLSAgICAiVmFsdWVTdWZmaXgiLAotICAgICJGdW5jdGlvbkludm9jYXRpb24iLAotICAgICJMaXRlcmFsIiwKLSAgfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjZjQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGludGVyZmFjZSBKU1BFTFBhcnNlclZpc2l0b3IKLXsKLSAgcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RPckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFuZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGx5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2hvaWNlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVQcmVmaXggbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlU3VmZml4IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkludm9jYXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmE1ZWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWwuRUxQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5JSlNQRUxUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCQotcHVibGljIGNsYXNzIEpTUEVMVHJhbnNsYXRvciBpbXBsZW1lbnRzIElKU1BFTFRyYW5zbGF0b3IgewotCS8qKgotCSAqIEpTUCBFeHByZXNzaW9uIExhbmd1YWdlIFBhcnNlci4KLQkgKi8KLQlwcml2YXRlIEpTUEVMUGFyc2VyIGVsUGFyc2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgTGlzdCB0cmFuc2xhdGVFTChTdHJpbmcgZWxUZXh0LCBTdHJpbmcgZGVsaW0sCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBpbnQgY29udGVudFN0YXJ0LAotCQkJaW50IGNvbnRlbnRMZW5ndGgsIFN0cmluZ0J1ZmZlciBmVXNlckVMRXhwcmVzc2lvbnMsCi0JCQlIYXNoTWFwIGZVc2VyRUxSYW5nZXMsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCi0JCUFycmF5TGlzdCBlbFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkJaWYobnVsbCA9PSBlbFBhcnNlcikgewotCQkJCQllbFBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVsUGFyc2VyLlJlSW5pdChlbFRleHQpOwotCQkJCX0KLQkJCQotCQkJCUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGVsUGFyc2VyLkV4cHJlc3Npb24oKTsKLQkJCQlFTEdlbmVyYXRvciBnZW4gPSBuZXcgRUxHZW5lcmF0b3IoKTsKLQkJCQlnZW4uZ2VuZXJhdGUoZXhwcmVzc2lvbiwgY3VycmVudE5vZGUsIGZVc2VyRUxFeHByZXNzaW9ucywgZlVzZXJFTFJhbmdlcywgZG9jdW1lbnQsIGN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnRMZW5ndGgpOwotCQkJfQotCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUb2tlbiBjdXJUb2sgPSBlLmN1cnJlbnRUb2tlbjsKLQkJCWludCBwcm9ibGVtU3RhcnRPZmZzZXQ7Ci0JCQlpbnQgcHJvYmxlbUVuZE9mZnNldDsKLQkJCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCQlwcm9ibGVtU3RhcnRPZmZzZXQgPSAgY29udGVudFN0YXJ0ICsgY3VyVG9rLmJlZ2luQ29sdW1uOwotCQkJcHJvYmxlbUVuZE9mZnNldCA9IGNvbnRlbnRTdGFydCArIGN1clRvay5lbmRDb2x1bW47Ci0JCQkKLQkJCXBvcyA9IG5ldyBQb3NpdGlvbihwcm9ibGVtU3RhcnRPZmZzZXQsIHByb2JsZW1FbmRPZmZzZXQgLSBwcm9ibGVtU3RhcnRPZmZzZXQgKyAxKTsKLQkJCWVsUHJvYmxlbXMuYWRkKG5ldyBFTFByb2JsZW0ocG9zLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSkpOwotCQl9IGNhdGNoIChUb2tlbk1nckVycm9yIHRlKSB7Ci0JCQlQb3NpdGlvbiBwb3MgPSBuZXcgUG9zaXRpb24oY29udGVudFN0YXJ0LCBjb250ZW50TGVuZ3RoKTsKLQkJCWVsUHJvYmxlbXMuYWRkKG5ldyBFTFByb2JsZW0ocG9zLCBKU1BDb3JlTWVzc2FnZXMuSlNQRUxfVG9rZW4pKTsKLQkJfQotCQlyZXR1cm4gZWxQcm9ibGVtczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMTg2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKiBBbGwgQVNUIG5vZGVzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgSXQgcHJvdmlkZXMgYmFzaWMKLSAgIG1hY2hpbmVyeSBmb3IgY29uc3RydWN0aW5nIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHJlbGF0aW9uc2hpcHMKLSAgIGJldHdlZW4gbm9kZXMuICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZSB7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgbm9kZSBoYXMgYmVlbiBtYWRlIHRoZSBjdXJyZW50Ci0gICAgbm9kZS4gIEl0IGluZGljYXRlcyB0aGF0IGNoaWxkIG5vZGVzIGNhbiBub3cgYmUgYWRkZWQgdG8gaXQuICovCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKTsKLQotICAvKiogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgY2hpbGQgbm9kZXMgaGF2ZSBiZWVuCi0gICAgYWRkZWQuICovCi0gIHB1YmxpYyB2b2lkIGpqdENsb3NlKCk7Ci0KLSAgLyoqIFRoaXMgcGFpciBvZiBtZXRob2RzIGFyZSB1c2VkIHRvIGluZm9ybSB0aGUgbm9kZSBvZiBpdHMKLSAgICBwYXJlbnQuICovCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pOwotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKTsKLQotICAvKiogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG5vZGUgdG8gYWRkIGl0cyBhcmd1bWVudCB0byB0aGUgbm9kZSdzCi0gICAgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgY2hpbGQgbm9kZS4gIFRoZSBjaGlsZHJlbiBhcmUgbnVtYmVyZWQKLSAgICAgZnJvbSB6ZXJvLCBsZWZ0IHRvIHJpZ2h0LiAqLwotICBwdWJsaWMgTm9kZSBqanRHZXRDaGlsZChpbnQgaSk7Ci0KLSAgLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoZSBub2RlIGhhcy4gKi8KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpOwotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkNTA4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgotICogWW91IGNhbiBleHBsaWNpdGx5IGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgZXhjZXB0aW9uIHR5cGUgYnkKLSAqIGNhbGxpbmcgdGhlIG1ldGhvZCBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIGluIHRoZSBnZW5lcmF0ZWQKLSAqIHBhcnNlci4KLSAqCi0gKiBZb3UgY2FuIG1vZGlmeSB0aGlzIGNsYXNzIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIHJlcG9ydGluZwotICogbWVjaGFuaXNtcyBzbyBsb25nIGFzIHlvdSByZXRhaW4gdGhlIHB1YmxpYyBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0vKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCi0gICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcwotICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCi0gICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0Ci0gICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKLSAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bwotICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKLSAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+Ci0gICAqLwotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAotICAgICAgICAgICAgICAgICAgICAgICApCi0gIHsKLSAgICBzdXBlcigiIik7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7Ci0gICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7Ci0gICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgotICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCi0gICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCi0gICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCi0gICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgotICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCi0gICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KLSAgICovCi0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKCk7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCi0gICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCi0gICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgotICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgotICAgKi8KLSAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKLQotICAvKioKLSAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQotICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCi0gICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KLSAgICovCi0gIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCi0gICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcwotICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KLSAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCi0gICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQotICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAotICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCi0gICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKLSAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQotICAgKiBnZXRzIGRpc3BsYXllZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgewotICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgU3RyaW5nIGV4cGVjdGVkID0gIiI7Ci0gICAgaW50IG1heFNpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKG1heFNpemUgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCkgewotICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgZXhwZWN0ZWQgKz0gdG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSArICIgIjsKLSAgICAgIH0KLSAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgewotICAgICAgICBleHBlY3RlZCArPSAiLi4uIjsKLSAgICAgIH0KLSAgICAgIGV4cGVjdGVkICs9IGVvbCArICIgICAgIjsKLSAgICB9Ci0gICAgU3RyaW5nIHJldHZhbCA9ICJFbmNvdW50ZXJlZCBcIiI7Ci0gICAgVG9rZW4gdG9rID0gY3VycmVudFRva2VuLm5leHQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHJldHZhbCArPSAiICI7Ci0gICAgICBpZiAodG9rLmtpbmQgPT0gMCkgewotICAgICAgICByZXR2YWwgKz0gdG9rZW5JbWFnZVswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKLSAgICAgIHRvayA9IHRvay5uZXh0OyAKLSAgICB9Ci0gICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOwotICAgIHJldHZhbCArPSAiLiIgKyBlb2w7Ci0gICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKLSAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7Ci0gICAgfQotICAgIHJldHZhbCArPSBleHBlY3RlZDsKLSAgICByZXR1cm4gcmV0dmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotIAotICAvKioKLSAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgotICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKLSAgICogc3RyaW5nIGxpdGVyYWwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBjaGFyIGNoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOwotICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlQ2hhclN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZUNoYXJTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyMWI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTaW1wbGVDaGFyU3RyZWFtLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIENoYXJTdHJlYW0sIHdoZXJlIHRoZSBzdHJlYW0gaXMgYXNzdW1lZCB0bwotICogY29udGFpbiBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgKHdpdGhvdXQgdW5pY29kZSBwcm9jZXNzaW5nKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ2hhclN0cmVhbQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOwotICBpbnQgYnVmc2l6ZTsKLSAgaW50IGF2YWlsYWJsZTsKLSAgaW50IHRva2VuQmVnaW47Ci0gIHB1YmxpYyBpbnQgYnVmcG9zID0gLTE7Ci0gIHByb3RlY3RlZCBpbnQgYnVmbGluZVtdOwotICBwcm90ZWN0ZWQgaW50IGJ1ZmNvbHVtbltdOwotCi0gIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKLSAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOwotCi0gIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOwotICBwcm90ZWN0ZWQgaW50IG1heE5leHRDaGFySW5kID0gMDsKLSAgcHJvdGVjdGVkIGludCBpbkJ1ZiA9IDA7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgRXhwYW5kQnVmZihib29sZWFuIHdyYXBBcm91bmQpCi0gIHsKLSAgICAgY2hhcltdIG5ld2J1ZmZlciA9IG5ldyBjaGFyW2J1ZnNpemUgKyAyMDQ4XTsKLSAgICAgaW50IG5ld2J1ZmxpbmVbXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotICAgICBpbnQgbmV3YnVmY29sdW1uW10gPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKLQotICAgICB0cnkKLSAgICAgewotICAgICAgICBpZiAod3JhcEFyb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgdG9rZW5CZWdpbiwgbmV3YnVmZmVyLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBuZXdidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIDAsIG5ld2J1ZmxpbmUsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCAwLCBuZXdidWZjb2x1bW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47Ci0KLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgPSAoYnVmcG9zICs9IChidWZzaXplIC0gdG9rZW5CZWdpbikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgdG9rZW5CZWdpbiwgbmV3YnVmZmVyLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47Ci0KLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgPSAoYnVmcG9zIC09IHRva2VuQmVnaW4pOwotICAgICAgICB9Ci0gICAgIH0KLSAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgIH0KLQotCi0gICAgIGJ1ZnNpemUgKz0gMjA0ODsKLSAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKLSAgICAgdG9rZW5CZWdpbiA9IDA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBGaWxsQnVmZigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgaWYgKG1heE5leHRDaGFySW5kID09IGF2YWlsYWJsZSkKLSAgICAgewotICAgICAgICBpZiAoYXZhaWxhYmxlID09IGJ1ZnNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKHRva2VuQmVnaW4gPiAyMDQ4KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmICh0b2tlbkJlZ2luIDwgMCkKLSAgICAgICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIEV4cGFuZEJ1ZmYoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF2YWlsYWJsZSA+IHRva2VuQmVnaW4pCi0gICAgICAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgICAgIGVsc2UgaWYgKCh0b2tlbkJlZ2luIC0gYXZhaWxhYmxlKSA8IDIwNDgpCi0gICAgICAgICAgIEV4cGFuZEJ1ZmYodHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgfQotCi0gICAgIGludCBpOwotICAgICB0cnkgewotICAgICAgICBpZiAoKGkgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgbWF4TmV4dENoYXJJbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgLSBtYXhOZXh0Q2hhckluZCkpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICBtYXhOZXh0Q2hhckluZCArPSBpOwotICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC0tYnVmcG9zOwotICAgICAgICBiYWNrdXAoMCk7Ci0gICAgICAgIGlmICh0b2tlbkJlZ2luID09IC0xKQotICAgICAgICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOwotICAgICAgICB0aHJvdyBlOwotICAgICB9Ci0gIH0KLQotICBwdWJsaWMgY2hhciBCZWdpblRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgICB0b2tlbkJlZ2luID0gLTE7Ci0gICAgIGNoYXIgYyA9IHJlYWRDaGFyKCk7Ci0gICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0KLSAgICAgcmV0dXJuIGM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBVcGRhdGVMaW5lQ29sdW1uKGNoYXIgYykKLSAgewotICAgICBjb2x1bW4rKzsKLQotICAgICBpZiAocHJldkNoYXJJc0xGKQotICAgICB7Ci0gICAgICAgIHByZXZDaGFySXNMRiA9IGZhbHNlOwotICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICAgfQotICAgICBlbHNlIGlmIChwcmV2Q2hhcklzQ1IpCi0gICAgIHsKLSAgICAgICAgcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgICAgIGlmIChjID09ICdcbicpCi0gICAgICAgIHsKLSAgICAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOwotICAgICB9Ci0KLSAgICAgc3dpdGNoIChjKQotICAgICB7Ci0gICAgICAgIGNhc2UgJ1xyJyA6Ci0gICAgICAgICAgIHByZXZDaGFySXNDUiA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbicgOgotICAgICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnIDoKLSAgICAgICAgICAgY29sdW1uLS07Ci0gICAgICAgICAgIGNvbHVtbiArPSAoOCAtIChjb2x1bW4gJiAwNykpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKLSAgICAgYnVmY29sdW1uW2J1ZnBvc10gPSBjb2x1bW47Ci0gIH0KLQotICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgaWYgKGluQnVmID4gMCkKLSAgICAgewotICAgICAgICAtLWluQnVmOwotCi0gICAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQotICAgICAgICAgICBidWZwb3MgPSAwOwotCi0gICAgICAgIHJldHVybiBidWZmZXJbYnVmcG9zXTsKLSAgICAgfQotCi0gICAgIGlmICgrK2J1ZnBvcyA+PSBtYXhOZXh0Q2hhckluZCkKLSAgICAgICAgRmlsbEJ1ZmYoKTsKLQotICAgICBjaGFyIGMgPSBidWZmZXJbYnVmcG9zXTsKLQotICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOwotICAgICByZXR1cm4gKGMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIAotICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KLSAgICovCi0KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7Ci0gICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICogQHNlZSAjZ2V0RW5kTGluZQotICAgKi8KLQotICBwdWJsaWMgaW50IGdldExpbmUoKSB7Ci0gICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRCZWdpbkNvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtblt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJhY2t1cChpbnQgYW1vdW50KSB7Ci0KLSAgICBpbkJ1ZiArPSBhbW91bnQ7Ci0gICAgaWYgKChidWZwb3MgLT0gYW1vdW50KSA8IDApCi0gICAgICAgYnVmcG9zICs9IGJ1ZnNpemU7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlcnNpemUgIT0gYnVmZmVyLmxlbmd0aCkKLSAgICB7Ci0gICAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKLSAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIH0KLSAgICBwcmV2Q2hhcklzTEYgPSBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgICB0b2tlbkJlZ2luID0gaW5CdWYgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgYnVmcG9zID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgR2V0SW1hZ2UoKQotICB7Ci0gICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZwb3MgLSB0b2tlbkJlZ2luICsgMSk7Ci0gICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZzaXplIC0gdG9rZW5CZWdpbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhidWZmZXIsIDAsIGJ1ZnBvcyArIDEpOwotICB9Ci0KLSAgcHVibGljIGNoYXJbXSBHZXRTdWZmaXgoaW50IGxlbikKLSAgewotICAgICBjaGFyW10gcmV0ID0gbmV3IGNoYXJbbGVuXTsKLQotICAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnBvcyAtIGxlbiArIDEsIHJldCwgMCwgbGVuKTsKLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZzaXplIC0gKGxlbiAtIGJ1ZnBvcyAtIDEpLCByZXQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gYnVmcG9zIC0gMSk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCByZXQsIGxlbiAtIGJ1ZnBvcyAtIDEsIGJ1ZnBvcyArIDEpOwotICAgICB9Ci0KLSAgICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIERvbmUoKQotICB7Ci0gICAgIGJ1ZmZlciA9IG51bGw7Ci0gICAgIGJ1ZmxpbmUgPSBudWxsOwotICAgICBidWZjb2x1bW4gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBhZGp1c3QgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgZm9yIHRoZSBzdGFydCBvZiBhIHRva2VuLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRqdXN0QmVnaW5MaW5lQ29sdW1uKGludCBuZXdMaW5lLCBpbnQgbmV3Q29sKQotICB7Ci0gICAgIGludCBzdGFydCA9IHRva2VuQmVnaW47Ci0gICAgIGludCBsZW47Ci0KLSAgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQotICAgICB7Ci0gICAgICAgIGxlbiA9IGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyBpbkJ1ZiArIDE7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIGxlbiA9IGJ1ZnNpemUgLSB0b2tlbkJlZ2luICsgYnVmcG9zICsgMSArIGluQnVmOwotICAgICB9Ci0KLSAgICAgaW50IGkgPSAwLCBqID0gMCwgayA9IDA7Ci0gICAgIGludCBuZXh0Q29sRGlmZiA9IDAsIGNvbHVtbkRpZmYgPSAwOwotCi0gICAgIHdoaWxlIChpIDwgbGVuICYmCi0gICAgICAgICAgICBidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdID09IGJ1ZmxpbmVbayA9ICsrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgewotICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZTsKLSAgICAgICAgbmV4dENvbERpZmYgPSBjb2x1bW5EaWZmICsgYnVmY29sdW1uW2tdIC0gYnVmY29sdW1uW2pdOwotICAgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotICAgICAgICBjb2x1bW5EaWZmID0gbmV4dENvbERpZmY7Ci0gICAgICAgIGkrKzsKLSAgICAgfSAKLQotICAgICBpZiAoaSA8IGxlbikKLSAgICAgewotICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotCi0gICAgICAgIHdoaWxlIChpKysgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gIT0gYnVmbGluZVsrK3N0YXJ0ICUgYnVmc2l6ZV0pCi0gICAgICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICAgIH0KLSAgICAgfQotCi0gICAgIGxpbmUgPSBidWZsaW5lW2pdOwotICAgICBjb2x1bW4gPSBidWZjb2x1bW5bal07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzQ3M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlTm9kZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVOb2RlIGltcGxlbWVudHMgTm9kZSB7Ci0gIHByb3RlY3RlZCBOb2RlIHBhcmVudDsKLSAgcHJvdGVjdGVkIE5vZGVbXSBjaGlsZHJlbjsKLSAgcHJvdGVjdGVkIGludCBpZDsKLSAgcHJvdGVjdGVkIEpTUEVMUGFyc2VyIHBhcnNlcjsKLSAgcHJvdGVjdGVkIFRva2VuIGZpcnN0VG9rZW47Ci0gIHByb3RlY3RlZCBUb2tlbiBsYXN0VG9rZW47Ci0KLSAgcHVibGljIFNpbXBsZU5vZGUoaW50IGkpIHsKLSAgICBpZCA9IGk7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlTm9kZShKU1BFTFBhcnNlciBwLCBpbnQgaSkgewotICAgIHRoaXMoaSk7Ci0gICAgcGFyc2VyID0gcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKSB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBqanRDbG9zZSgpIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgamp0U2V0UGFyZW50KE5vZGUgbikgeyBwYXJlbnQgPSBuOyB9Ci0gIHB1YmxpYyBOb2RlIGpqdEdldFBhcmVudCgpIHsgcmV0dXJuIHBhcmVudDsgfQotCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpIHsKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgY2hpbGRyZW4gPSBuZXcgTm9kZVtpICsgMV07Ci0gICAgfSBlbHNlIGlmIChpID49IGNoaWxkcmVuLmxlbmd0aCkgewotICAgICAgTm9kZSBjW10gPSBuZXcgTm9kZVtpICsgMV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCAwLCBjLCAwLCBjaGlsZHJlbi5sZW5ndGgpOwotICAgICAgY2hpbGRyZW4gPSBjOwotICAgIH0KLSAgICBjaGlsZHJlbltpXSA9IG47Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBqanRHZXRDaGlsZChpbnQgaSkgewotICAgIHJldHVybiBjaGlsZHJlbltpXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgamp0R2V0TnVtQ2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIChjaGlsZHJlbiA9PSBudWxsKSA/IDAgOiBjaGlsZHJlbi5sZW5ndGg7Ci0gIH0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBjaGlsZHJlbkFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgICBjaGlsZHJlbltpXS5qanRBY2NlcHQodmlzaXRvciwgZGF0YSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgLyogWW91IGNhbiBvdmVycmlkZSB0aGVzZSB0d28gbWV0aG9kcyBpbiBzdWJjbGFzc2VzIG9mIFNpbXBsZU5vZGUgdG8KLSAgICAgY3VzdG9taXplIHRoZSB3YXkgdGhlIG5vZGUgYXBwZWFycyB3aGVuIHRoZSB0cmVlIGlzIGR1bXBlZC4gIElmCi0gICAgIHlvdXIgb3V0cHV0IHVzZXMgbW9yZSB0aGFuIG9uZSBsaW5lIHlvdSBzaG91bGQgb3ZlcnJpZGUKLSAgICAgdG9TdHJpbmcoU3RyaW5nKSwgb3RoZXJ3aXNlIG92ZXJyaWRpbmcgdG9TdHJpbmcoKSBpcyBwcm9iYWJseSBhbGwKLSAgICAgeW91IG5lZWQgdG8gZG8uICovCi0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qanROb2RlTmFtZVtpZF07IH0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgcHJlZml4KSB7IHJldHVybiBwcmVmaXggKyB0b1N0cmluZygpOyB9Ci0KLSAgLyogT3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8gY3VzdG9taXplIGhvdyB0aGUgbm9kZSBkdW1wcwotICAgICBvdXQgaXRzIGNoaWxkcmVuLiAqLwotCi0gIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b1N0cmluZyhwcmVmaXgpKTsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCVNpbXBsZU5vZGUgbiA9IChTaW1wbGVOb2RlKWNoaWxkcmVuW2ldOwotCWlmIChuICE9IG51bGwpIHsKLQkgIG4uZHVtcChwcmVmaXggKyAiICIpOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4gZ2V0Rmlyc3RUb2tlbigpIHsKLSAgICByZXR1cm4gZmlyc3RUb2tlbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpcnN0VG9rZW4oVG9rZW4gZmlyc3RUb2tlbikgewotICAgIHRoaXMuZmlyc3RUb2tlbiA9IGZpcnN0VG9rZW47Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4gZ2V0TGFzdFRva2VuKCkgewotICAgIHJldHVybiBsYXN0VG9rZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYXN0VG9rZW4oVG9rZW4gbGFzdFRva2VuKSB7Ci0gICAgdGhpcy5sYXN0VG9rZW4gPSBsYXN0VG9rZW47Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1OTgyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgotICovCi0KLXB1YmxpYyBjbGFzcyBUb2tlbiB7Ci0KLSAgLyoqCi0gICAqIEFuIGludGVnZXIgdGhhdCBkZXNjcmliZXMgdGhlIGtpbmQgb2YgdGhpcyB0b2tlbi4gIFRoaXMgbnVtYmVyaW5nCi0gICAqIHN5c3RlbSBpcyBkZXRlcm1pbmVkIGJ5IEphdmFDQ1BhcnNlciwgYW5kIGEgdGFibGUgb2YgdGhlc2UgbnVtYmVycyBpcwotICAgKiBzdG9yZWQgaW4gdGhlIGZpbGUgLi4uQ29uc3RhbnRzLmphdmEuCi0gICAqLwotICBwdWJsaWMgaW50IGtpbmQ7Ci0KLSAgLyoqCi0gICAqIGJlZ2luTGluZSBhbmQgYmVnaW5Db2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhpcyB0b2tlbjsgZW5kTGluZSBhbmQgZW5kQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUKLSAgICogbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uOwotCi0gIC8qKgotICAgKiBUaGUgc3RyaW5nIGltYWdlIG9mIHRoZSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgaW1hZ2U7Ci0KLSAgLyoqCi0gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbiBmcm9tIHRoZSBpbnB1dAotICAgKiBzdHJlYW0uICBJZiB0aGlzIGlzIHRoZSBsYXN0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3IgaWYgdGhlCi0gICAqIHRva2VuIG1hbmFnZXIgaGFzIG5vdCByZWFkIHRva2VucyBiZXlvbmQgdGhpcyBvbmUsIHRoaXMgZmllbGQgaXMKLSAgICogc2V0IHRvIG51bGwuICBUaGlzIGlzIHRydWUgb25seSBpZiB0aGlzIHRva2VuIGlzIGFsc28gYSByZWd1bGFyCi0gICAqIHRva2VuLiAgT3RoZXJ3aXNlLCBzZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCi0gICAqIHRoaXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gbmV4dDsKLQotICAvKioKLSAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGFjY2VzcyBzcGVjaWFsIHRva2VucyB0aGF0IG9jY3VyIHByaW9yIHRvIHRoaXMKLSAgICogdG9rZW4sIGJ1dCBhZnRlciB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbi4KLSAgICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggc3BlY2lhbCB0b2tlbnMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIG51bGwuCi0gICAqIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgc3VjaCBzcGVjaWFsIHRva2VuLCB0aGlzIGZpZWxkIHJlZmVycwotICAgKiB0byB0aGUgbGFzdCBvZiB0aGVzZSBzcGVjaWFsIHRva2Vucywgd2hpY2ggaW4gdHVybiByZWZlcnMgdG8gdGhlIG5leHQKLSAgICogcHJldmlvdXMgc3BlY2lhbCB0b2tlbiB0aHJvdWdoIGl0cyBzcGVjaWFsVG9rZW4gZmllbGQsIGFuZCBzbyBvbgotICAgKiB1bnRpbCB0aGUgZmlyc3Qgc3BlY2lhbCB0b2tlbiAod2hvc2Ugc3BlY2lhbFRva2VuIGZpZWxkIGlzIG51bGwpLgotICAgKiBUaGUgbmV4dCBmaWVsZHMgb2Ygc3BlY2lhbCB0b2tlbnMgcmVmZXIgdG8gb3RoZXIgc3BlY2lhbCB0b2tlbnMgdGhhdAotICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgaXQgKHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgcmVndWxhciB0b2tlbikuICBJZiB0aGVyZQotICAgKiBpcyBubyBzdWNoIHRva2VuLCB0aGlzIGZpZWxkIGlzIG51bGwuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gc3BlY2lhbFRva2VuOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFRva2VuIG9iamVjdCwgYnkgZGVmYXVsdC4gSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdQotICAgKiBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLgotICAgKiBTaW1wbHkgYWRkIHRoZSBjYXNlcyB0byB0aGUgc3dpdGNoIGZvciBhbGwgdGhvc2Ugc3BlY2lhbCBjYXNlcy4KLSAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc3ViY2xhc3Mgb2YgVG9rZW4gY2FsbGVkIElEVG9rZW4gdGhhdAotICAgKiB5b3Ugd2FudCB0byBjcmVhdGUgaWYgb2ZLaW5kIGlzIElELCBzaW1scHkgYWRkIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbigpOwotICAgKgotICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgotICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIGl0IGluIHlvdXIgbGV4aWNhbCBhY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kKQotICB7Ci0gICAgIHN3aXRjaChvZktpbmQpCi0gICAgIHsKLSAgICAgICBkZWZhdWx0IDogcmV0dXJuIG5ldyBUb2tlbigpOwotICAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuTWdyRXJyb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbk1nckVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTNkYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuTWdyRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW5NZ3JFcnJvci5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgVG9rZW5NZ3JFcnJvciBleHRlbmRzIEVycm9yCi17Ci0gICAvKgotICAgICogT3JkaW5hbHMgZm9yIHZhcmlvdXMgcmVhc29ucyB3aHkgYW4gRXJyb3Igb2YgdGhpcyB0eXBlIGNhbiBiZSB0aHJvd24uCi0gICAgKi8KLQotICAgLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0vKioKLSAgICAqIExleGljYWwgZXJyb3Igb2NjdXJlZC4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBMRVhJQ0FMX0VSUk9SID0gMDsKLQotICAgLyoqCi0gICAgKiBBbiBhdHRlbXB0IHdhc3MgbWFkZSB0byBjcmVhdGUgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgYSBzdGF0aWMgdG9rZW4gbWFuYWdlci4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTEVYRVJfRVJST1IgPSAxOwotCi0gICAvKioKLSAgICAqIFRyaWVkIHRvIGNoYW5nZSB0byBhbiBpbnZhbGlkIGxleGljYWwgc3RhdGUuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFID0gMjsKLQotICAgLyoqCi0gICAgKiBEZXRlY3RlZCAoYW5kIGJhaWxlZCBvdXQgb2YpIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIHRva2VuIG1hbmFnZXIuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9ERVRFQ1RFRCA9IDM7Ci0KLSAgIC8qKgotICAgICogSW5kaWNhdGVzIHRoZSByZWFzb24gd2h5IHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBJdCB3aWxsIGhhdmUKLSAgICAqIG9uZSBvZiB0aGUgYWJvdmUgNCB2YWx1ZXMuCi0gICAgKi8KLSAgIGludCBlcnJvckNvZGU7Ci0KLSAgIC8qKgotICAgICogUmVwbGFjZXMgdW5wcmludGFibGUgY2hhcmFjdGVycyBieSB0aGVpciBlc3BhY2VkIChvciB1bmljb2RlIGVzY2FwZWQpCi0gICAgKiBlcXVpdmFsZW50cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAgKi8KLSAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGFkZEVzY2FwZXMoU3RyaW5nIHN0cikgewotICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGNoYXIgY2g7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgewotICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogUmV0dXJucyBhIGRldGFpbGVkIG1lc3NhZ2UgZm9yIHRoZSBFcnJvciB3aGVuIGl0IGlzIHRocm93biBieSB0aGUKLSAgICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgotICAgICogUGFyYW1ldGVycyA6IAotICAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNsIGVycm9yCi0gICAgKiAgICBjdXJMZXhTdGF0ZSA6IGxleGljYWwgc3RhdGUgaW4gd2hpY2ggdGhpcyBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckxpbmUgICA6IGxpbmUgbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckFmdGVyICA6IHByZWZpeCB0aGF0IHdhcyBzZWVuIGJlZm9yZSB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGN1cmNoYXIgICAgIDogdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIKLSAgICAqIE5vdGU6IFlvdSBjYW4gY3VzdG9taXplIHRoZSBsZXhpY2FsIGVycm9yIG1lc3NhZ2UgYnkgbW9kaWZ5aW5nIHRoaXMgbWV0aG9kLgotICAgICovCi0gICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBMZXhpY2FsRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhcikgewotICAgICAgcmV0dXJuKCJMZXhpY2FsIGVycm9yIGF0IGxpbmUgIiArCi0gICAgICAgICAgIGVycm9yTGluZSArICIsIGNvbHVtbiAiICsKLSAgICAgICAgICAgZXJyb3JDb2x1bW4gKyAiLiAgRW5jb3VudGVyZWQ6ICIgKwotICAgICAgICAgICAoRU9GU2VlbiA/ICI8RU9GPiAiIDogKCJcIiIgKyBhZGRFc2NhcGVzKFN0cmluZy52YWx1ZU9mKGN1ckNoYXIpKSArICJcIiIpICsgIiAoIiArIChpbnQpY3VyQ2hhciArICIpLCAiKSArCi0gICAgICAgICAgICJhZnRlciA6IFwiIiArIGFkZEVzY2FwZXMoZXJyb3JBZnRlcikgKyAiXCIiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBZb3UgY2FuIGFsc28gbW9kaWZ5IHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIG1lc3NhZ2VzLgotICAgICogRm9yIGV4YW1wbGUsIGNhc2VzIGxpa2UgTE9PUF9ERVRFQ1RFRCBhbmQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFIGFyZSBub3QKLSAgICAqIG9mIGVuZC11c2VycyBjb25jZXJuLCBzbyB5b3UgY2FuIHJldHVybiBzb21ldGhpbmcgbGlrZSA6IAotICAgICoKLSAgICAqICAgICAiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgLi4uLiAiCi0gICAgKgotICAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgotICAgICovCi0gICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICAgfQotCi0gICAvKgotICAgICogQ29uc3RydWN0b3JzIG9mIHZhcmlvdXMgZmxhdm9ycyBmb2xsb3cuCi0gICAgKi8KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoKSB7Ci0gICB9Ci0KLSAgIHB1YmxpYyBUb2tlbk1nckVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgcmVhc29uKSB7Ci0gICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKLSAgIH0KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhciwgaW50IHJlYXNvbikgewotICAgICAgdGhpcyhMZXhpY2FsRXJyb3IoRU9GU2VlbiwgbGV4U3RhdGUsIGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIGVycm9yQWZ0ZXIsIGN1ckNoYXIpLCByZWFzb24pOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHBhcnNlci5zZWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4cGFyc2VyLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhNWU2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4cGFyc2VyLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMhL3Vzci9iaW4vc2VkDQotDQotIw0KLSMgVGhlIFNTRSBnZW5lcmFsbHkgdXNlcyBjb21waWxlciBzZXR0aW5nIHRvIHR1cm4gIG1vc3Qgd2FybmluZ3MgaW50byBlcnJvcnMuICANCi0jIFRoaXMgaXMgYSBsaXR0bGUgcHJvYmxlbWF0aWMgZm9yIEphdmFDQyBnZW5lcmF0ZWQgZmlsZXMuICBXZSBkb24ndCB3YW50IA0KLSMgdG8gZGlzdHJpYnV0ZSBhIGN1c3RvbWl6ZWQgdmVyc2lvbiBvZiBKYXZhQ0Mgbm9yIGlzIHRoZXJlIGFueSAidGVtcGxhdGUiIA0KLSMgbWVjaGFuaXNtLiAgU28sIHRoaXMgc2ltcGxlIHNlZCBzY3JpcHQgZ29lcyB0aHJvdWdoIHRoZSBnZW5lcmF0ZWQgdG9rZW4NCi0jIG1hbmFnZXIgYW5kIGZpeGVzIGEgZmV3IHRoaW5ncy4gIElmIEphdmFDQyBjaGFuZ2VzIHRoZSBnZW5lcmF0ZWQgY29kZSwgDQotIyBpdCdzIGxpa2VseSB0aGF0IHRoaXMgc2NyaXB0IHdpbGwgbm8gbG9uZ2VyIGRvIHRoZSByaWdodCB0aGluZy4gIERpdHRvIHdpdGgNCi0jIGFueSB2ZXJzaW9uIG9mIEphdmFDQyBiZXNpZGVzIDMuMi4gQWxzbywgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIA0KLSMgc2NyaXB0IHdpbGwgZXZlbiB3b3JrIHdpdGggYW4gYXJiaXRyYXJ5IEphdmFDQyBncmFtbWFyLiAgSXQncyBvbmx5IGJlZW4gdGVzdGVkDQotIyB3aXRoIHRoZSBjdXJyZW50IEpTUCBFTCBncmFtbWFyLg0KLSMNCi0jIEF1dGhvcjogVGVkIEEuIENhcnJvbGwgKHRjYXJyb2xsQGJlYS5jb20pDQotIw0KLQ0KLXMvc3RhdGljIHByaXZhdGUgZmluYWwgY2xhc3MgTG9va2FoZWFkU3VjY2VzcyBleHRlbmRzIGphdmEubGFuZy5FcnJvciB7IH0vc3RhdGljIHByaXZhdGUgZmluYWwgY2xhc3MgTG9va2FoZWFkU3VjY2VzcyBleHRlbmRzIGphdmEubGFuZy5FcnJvciB7IFxuICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyBcbiAgfS9nDQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHRtLnNlZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXh0bS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMWRlYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHRtLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMhL3Vzci9iaW4vc2VkDQotDQotIw0KLSMgVGhlIFNTRSBnZW5lcmFsbHkgdXNlcyBjb21waWxlciBzZXR0aW5nIHRvIHR1cm4gIG1vc3Qgd2FybmluZ3MgaW50byBlcnJvcnMuICANCi0jIFRoaXMgaXMgYSBsaXR0bGUgcHJvYmxlbWF0aWMgZm9yIEphdmFDQyBnZW5lcmF0ZWQgZmlsZXMuICBXZSBkb24ndCB3YW50IA0KLSMgdG8gZGlzdHJpYnV0ZSBhIGN1c3RvbWl6ZWQgdmVyc2lvbiBvZiBKYXZhQ0Mgbm9yIGlzIHRoZXJlIGFueSAidGVtcGxhdGUiIA0KLSMgbWVjaGFuaXNtLiAgU28sIHRoaXMgc2ltcGxlIHNlZCBzY3JpcHQgZ29lcyB0aHJvdWdoIHRoZSBnZW5lcmF0ZWQgdG9rZW4NCi0jIG1hbmFnZXIgYW5kIGZpeGVzIGEgZmV3IHRoaW5ncy4gIElmIEphdmFDQyBjaGFuZ2VzIHRoZSBnZW5lcmF0ZWQgY29kZSwgDQotIyBpdCdzIGxpa2VseSB0aGF0IHRoaXMgc2NyaXB0IHdpbGwgbm8gbG9uZ2VyIGRvIHRoZSByaWdodCB0aGluZy4gIERpdHRvIHdpdGgNCi0jIGFueSB2ZXJzaW9uIG9mIEphdmFDQyBiZXNpZGVzIDMuMi4gQWxzbywgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIA0KLSMgc2NyaXB0IHdpbGwgZXZlbiB3b3JrIHdpdGggYW4gYXJiaXRyYXJ5IEphdmFDQyBncmFtbWFyLiAgSXQncyBvbmx5IGJlZW4gdGVzdGVkDQotIyB3aXRoIHRoZSBjdXJyZW50IEpTUCBFTCBncmFtbWFyLg0KLSMNCi0jIEF1dGhvcjogVGVkIEEuIENhcnJvbGwgKHRjYXJyb2xsQGJlYS5jb20pDQotIw0KLQ0KLXMvKGludCkoY3VyQ2hhciA+PiA4KS9jdXJDaGFyID4+IDgvZw0KLQ0KLS9ecHVibGljIFRva2VuIGdldE5leHRUb2tlbigpLywgL0VPRkxvb3Avew0KLQkvaW50IGtpbmQ7LyB7ZH0NCi0JL1Rva2VuIHNwZWNpYWxUb2tlbiA9IG51bGw7L3tkfQ0KLX0NCi0NCi0vXnByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKS8sIC9mb3IoOzspL3sNCi0Jcy9pbnQgaiwga2luZCA9IDB4N2ZmZmZmZmY7L2ludCBraW5kID0gMHg3ZmZmZmZmZjsvZw0KLQkvaW50XFtcXSBuZXh0U3RhdGVzOy97ZH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2dvLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2dvLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q1YWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9nby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyEvdXNyL2Jpbi9zaA0KLQ0KLSMgU2V0IEpBVkFDQ19IT01FIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGphdmFjYyAzLjINCi0kSkFWQUNDX0hPTUUvYmluL2pqdHJlZS5iYXQgSlNQRUwuamp0DQotJEpBVkFDQ19IT01FL2Jpbi9qYXZhY2MuYmF0IEpTUEVMLmpqDQotc2VkIC1mIGZpeHRtLnNlZCAtaS5iYWsgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQ0KLWRpZmYgLXcgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhLmJhaw0KLXNlZCAtZiBmaXhwYXJzZXIuc2VkIC1pLmJhayBKU1BFTFBhcnNlci5qYXZhDQotZGlmZiAtdyBKU1BFTFBhcnNlci5qYXZhIEpTUEVMUGFyc2VyLmphdmEuYmFrDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjlhYzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci0KLS8qKgotICogUmUtaW5kZXhlcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4KLSAqIEVuc3VyZXMgdGhlIEpTUCBJbmRleCBpcyBpbiBhIHN0YWJsZSBzdGF0ZSBiZWZvcmUgcGVyZm9ybWluZyBhIHNlYXJjaC4KLSAqIChsaWtlIGFmdGVyIGEgY3Jhc2ggb3IgaWYgcHJldmlvdXMgaW5kZXhpbmcgd2FzIGNhbmNlbGVkKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhXb3Jrc3BhY2VKb2IgZXh0ZW5kcyBKb2IgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BpbmRleG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLAotCSAqIGFuZCBhZGRzIHRoZSBmaWxlcyB0byBiZSBpbmRleGVkIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JICAgIHByaXZhdGUgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQotCQkvLyBtb25pdG9yIGZyb20gdGhlIEpvYgotCQlJUHJvZ3Jlc3NNb25pdG9yIGZJbm5lck1vbml0b3IgPSBudWxsOwotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0aGlzLmZJbm5lck1vbml0b3IgPSBtb25pdG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCi0JCQkvLyBjaGVjayBqb2IgY2FuY2VsZWQKLQkJCWlmICh0aGlzLmZJbm5lck1vbml0b3IgIT0gbnVsbCAmJiB0aGlzLmZJbm5lck1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCi0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCQkvLyBjaGVjayB0aGlzIGJlZm9yZSBkZXNjcmlwdGlvbgotCQkJCS8vIGNoZWNrIG5hbWUgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgdGhlIGZpbGUgKGxlc3Mgd29yaykKLQkJCQlpZihnZXRKc3BDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCi0JCQkJCQlpZihERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBJbmRleFdvcmtzcGFjZUpvYiBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gdGhpcyBjYWxsIHdpbGwgY2hlY2sgdGhlIENvbnRlbnRUeXBlRGVzY3JpcHRpb24sIHNvIGRvbid0IG5lZWQgdG8gZG8gaXQgaGVyZS4KLQkJCQkJCS8vSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmFkZEpzcEZpbGUoZmlsZSk7Ci0JCQkJCQl0aGlzLmZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCXRoaXMuZklubmVyTW9uaXRvci5zdWJUYXNrKHByb3h5LmdldE5hbWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCSAgICByZXR1cm4gKElGaWxlW10pdGhpcy5maWxlcy50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmZpbGVzLnNpemUoKV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZUpTUCA9IG51bGw7Ci0JCi0JcHVibGljIEluZGV4V29ya3NwYWNlSm9iKCkgewotCQkvLyBwYV9UT0RPIG1heSB3YW50IHRvIHNheSBzb21ldGhpbmcgbGlrZSAiUmVidWlsZGluZyBKU1AgSW5kZXgiIHRvIGJlIG1vcmUKLQkJLy8gZGVzY3JpcHRpdmUgaW5zdGVhZCBvZiAiVXBkYXRpbmcgSlNQIEluZGV4IiBzaW5jZSB0aGV5IGFyZSAyIGRpZmZlcmVudCB0aGluZ3MKLQkJc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8wKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JfQotCi0JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotCQlpZih0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZyBlY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIAotCSAqIGZvciBzaW1pbGFyIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBzdGFydGVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJdHJ5IHsKLQkJICAgIEpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IobW9uaXRvcik7Ci0JCSAgICAvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkvLyByZXF1ZXN0IGluZGV4aW5nCi0JCQkvLyB0aGlzIGlzIHByZXR0eSBtdWNoIGxpa2UgZmFraW5nIGFuIGVudGlyZSB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGEKLQkJCUpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluZGV4RmlsZXModmlzaXRvci5nZXRGaWxlcygpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihERUJVRykKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBmaW5pc2hlZFxuICAgdG90YWwgdGltZSBydW5uaW5nOiAiICsgKGZpbmlzaCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5kZXhTdGF0ZShKU1BJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQSW5kZXhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmZiZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0aGUgSlNQIGluZGV4IHVwIHRvIGRhdGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbmRleE1hbmFnZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCS8vIFRPRE8gbW92ZSB0aGlzIHRvIExvZ2dlciwgYXMgd2UgaGF2ZSBpbiBTU0UKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtFWV9JTkRFWF9TVEFURSA9ICJqc3BJbmRleFN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbmRleFdvcmtzcGFjZUpvYiBpbmRleGluZ0pvYiA9IG5ldyBJbmRleFdvcmtzcGFjZUpvYigpOwotCi0KLQotCS8vIFRPRE86IGNvbnNpZGVyIGVudW1lcmF0aW9uIGZvciB0aGVzZSBpbnQgY29uc3RhbnRzCi0JLy8gc2V0IHRvIFNfVVBEQVRJTkcgb25jZSBhIHJlc291cmNlIGNoYW5nZSBjb21lcyBpbgotCS8vIHNldCB0byBTX1NUQUJMRSBpZjoKLQkvLyAtIHdlIGtub3cgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlIGNoYW5nZQotCS8vIC0gb3IgdGhlIFByb2Nlc3NGaWxlc0pvYiBjb21wbGV0ZXMKLQkvLyBzZXQgdG8gU19DQU5DRUxFRCBpZiBhbiBpbmRleGluZyBqb2IgaXMgY2FuY2VsZWQKLQkvLyBzZXQgdG8gU19SRUJVSUxESU5HIGlmIHJlLWluZGV4aW5nIHRoZSBlbnRpcmUgd29ya3NwYWNlCi0KLQkvLyB0aGUgaW50ICcwJyBpcyByZXNlcnZlZCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBwcmVmZXJlbmNlIGlzIG5vdAotCS8vIHRoZXJlCi0JLyoqIGluZGV4IGlzIHJlbGlhYmxlIHRvIHVzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfU1RBQkxFID0gMTsKLQkvKiogaW5kZXggaXMgYmVpbmcgdXBkYXRlZCAoZnJvbSBhIHJlc291cmNlIGRlbHRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqCi0JICogaW5kZXhpbmcgam9iIHdhcyBjYW5jZWxlZCBpbiB0aGUgbWlkZGxlIG9mIGl0LCBpbmRleCBuZWVkcyB0byBiZQotCSAqIHJlYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0NBTkNFTEVEID0gNDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBKU1AgZmlsZXMgZnJvbSBhIHJlc291cmNlIGRlbHRhLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gdXNpbmcgaGFzaCBtYXAgZW5zdXJlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJLy8gbXVzdCBiZSByZXNldCBiZWZvcmUgZXZlcnkgdXNlCi0JCXByaXZhdGUgSGFzaE1hcCBqc3BGaWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIEpTUFJlc291cmNlVmlzaXRvcigpIHsKLQkJCXRoaXMuanNwRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc0hpZGRlblJlc291cmNlKGRlbHRhLmdldEZ1bGxQYXRoKCkpKSB7Ci0KLQkJCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQkJYm9vbGVhbiBpc0ludGVyZXN0aW5nQ2hhbmdlID0gZmFsc2U7Ci0JCQkJCWlmICgoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCQkvLyBpZ25vcmUgdGhpbmdzIGxpa2UgbWFya2VyIGNoYW5nZXMKLQkJCQkJCWlzSW50ZXJlc3RpbmdDaGFuZ2UgPSAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UIHx8IChmbGFncyAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRDsKLQkJCQkJfQotCQkJCQlib29sZWFuIHJlbW92ZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQkJCWlmIChhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0KLQkJCQkJCXZpc2l0QWRkZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlbW92ZWQpIHsKLQkJCQkJCXZpc2l0UmVtb3ZlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCWlmIChERUJVRykKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRGVsdGEgYW5hbHlzaXMgbWF5IG5vdCBiZSBjb21wbGV0ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBpZiB0aGUgZGVsdGEgaGFzIGNoaWxkcmVuLCBjb250aW51ZSB0byBhZGQvcmVtb3ZlIGZpbGVzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdFJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIGhhbmRsZSBjbGVhbnVwCi0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICYmIHIuZXhpc3RzKCkpIHsKLQkJCQkJZGVsZXRlSW5kZXgoKElGaWxlKSByKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXRBZGRlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCS8vIHF1aWNrIGNoZWNrIGlmIGl0J3MgZXZlbiBKU1AgcmVsYXRlZCB0byBpbXByb3ZlCi0JCQkvLyBwZXJmb3JtYW5jZQotCQkJLy8gY2hlY2tpbmcgbmFtZSBmcm9tIHRoZSBkZWx0YSBiZWZvcmUgZ2V0dGluZwotCQkJLy8gcmVzb3VyY2UgYmVjYXVzZSBpdCdzIGxpZ2h0ZXIKLQkJCWludCBudW1TZWdtZW50cyA9IGRlbHRhLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBkZWx0YS5nZXRGdWxsUGF0aCgpLnNlZ21lbnQobnVtU2VnbWVudHMgLSAxKTsKLQkJCWlmIChnZXRKc3BDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZW5hbWUpKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyICE9IG51bGwgJiYgci5leGlzdHMoKSAmJiByLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQl0aGlzLmpzcEZpbGVzLnB1dChyLmdldEZ1bGxQYXRoKCksIHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzQ2MwotCQlwcml2YXRlIGJvb2xlYW4gaXNIaWRkZW5SZXNvdXJjZShJUGF0aCBwKSB7Ci0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHAuc2VnbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VnbWVudHNbaV0uc3RhcnRzV2l0aCgiLiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlbGV0ZUluZGV4KElGaWxlIGZvbGRlcikgewotCQkJLy8gY2xlYW51cCBpbmRleAotCQkJSW5kZXhNYW5hZ2VyIGltID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCQlJUGF0aCBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQlJUGF0aCBpbmRleExvY2F0aW9uID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmNvbXB1dGVJbmRleExvY2F0aW9uKGZvbGRlclBhdGgpOwotCQkJaW0ucmVtb3ZlSW5kZXgoaW5kZXhMb2NhdGlvbik7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVLZXkoZm9sZGVyUGF0aCk7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVWYWx1ZShpbmRleExvY2F0aW9uKTsKLQkJCUZpbGUgZiA9IGluZGV4TG9jYXRpb24udG9GaWxlKCk7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIHRoaXMuanNwRmlsZXMudmFsdWVzKCkudG9BcnJheShuZXcgSUZpbGVbdGhpcy5qc3BGaWxlcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJdGhpcy5qc3BGaWxlcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLy8gZW5kIGNsYXNzIEpTUFJlc291cmNlVmlzaXRvcgotCi0JLyoqCi0JICogc2NoZWR1bGVzIEpTUCBmaWxlcyBmb3IgaW5kZXhpbmcgYnkgSmF2YSBjb3JlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzRmlsZXNKb2IgZXh0ZW5kcyBKb2IgewotCQlMaXN0IGZpbGVMaXN0ID0gbnVsbDsKLQkJLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBmaWxlcyB3ZSd2ZSBpbmRleGVkCi0JCWludCBsYXN0RmlsZUN1cnNvciA9IDA7Ci0KLQkJUHJvY2Vzc0ZpbGVzSm9iKFN0cmluZyB0YXNrTmFtZSkgewotCQkJc3VwZXIodGFza05hbWUpOwotCQkJZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzKElGaWxlW10gZmlsZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaWxlTGlzdC5hZGQoZmlsZXNbaV0pOwotCQkJfQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgcXVldWluZyAiICsgZmlsZXMubGVuZ3RoICsgIiBmaWxlcyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN5bmNocm9uaXplZCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlTGlzdC50b0FycmF5KG5ldyBJRmlsZVtmaWxlTGlzdC5zaXplKCldKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyRmlsZXMoKSB7Ci0JCQlmaWxlTGlzdC5jbGVhcigpOwotCQkJbGFzdEZpbGVDdXJzb3IgPSAwOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNsZWFyZWQgZmlsZXMiKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhlciBtb25pdG9yIiArIG1vbml0b3IpOwotCQkJaWYgKGlzQ2FuY2VsZWQobW9uaXRvcikgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0KLQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJdHJ5IHsKLQkJCQlJRmlsZVtdIGZpbGVzVG9CZVByb2Nlc3NlZCA9IGdldEZpbGVzKCk7Ci0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgaW5kZXhpbmcgIiArIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGggKyAiIGZpbGVzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyBBUEkgaW5kaWNhdGVzIHRoYXQgbW9uaXRvciBpcyBuZXZlciBudWxsCi0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJSlNQU2VhcmNoU3VwcG9ydCBzcyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCQlTdHJpbmcgcHJvY2Vzc2luZ05GaWxlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQkJCWZvciAoO2xhc3RGaWxlQ3Vyc29yIDwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aDsgbGFzdEZpbGVDdXJzb3IrKykgewotCi0JCQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJc3MuYWRkSnNwRmlsZShmaWxlc1RvQmVQcm9jZXNzZWRbbGFzdEZpbGVDdXJzb3JdKTsKLQkJCQkJCS8vIEpTUCBJbmRleGVyIHByb2Nlc3NpbmcgbiBmaWxlcwotCQkJCQkJcHJvY2Vzc2luZ05GaWxlcyA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMiwgbmV3IFN0cmluZ1tde0ludGVnZXIudG9TdHJpbmcoKGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGggLSBsYXN0RmlsZUN1cnNvcikpfSk7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2socHJvY2Vzc2luZ05GaWxlcyArICIgLSAiICsgZmlsZXNUb0JlUHJvY2Vzc2VkW2xhc3RGaWxlQ3Vyc29yXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgSm9iIGFkZGVkIGZpbGU6ICIgKyBmaWxlc1RvQmVQcm9jZXNzZWRbbGFzdEZpbGVDdXJzb3JdLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFJBVExDMDAyODQ3NzYKLQkJCQkJCS8vIElTU1VFOiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2F0Y2hpbmcgRVZFUlkKLQkJCQkJCS8vIGV4Y2VwdGlvbiwgYnV0Ci0JCQkJCQkvLyB0aGUgZnJhbWV3b3JrIG9ubHkgYWxsb3dzIHRvIHJldHVybiBJU3RhdHVzIGluCi0JCQkJCQkvLyBvcmRlciB0byBjb21tdW5pY2F0ZQotCQkJCQkJLy8gdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hpY2ggbWVhbnMgdGhlIGxvb3AKLQkJCQkJCS8vIHdvbid0IGNvbXBsZXRlLCBhbmQgd2Ugd291bGQgaGl0IHRoZSBzYW1lIHByb2JsZW0KLQkJCQkJCS8vIHRoZSBuZXh0IHRpbWUuCi0JCQkJCQkvLyAKLQkJCQkJCS8vIGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUKLQkJCQkJCS8vIGV4Y2VwdGlvbnMgbG9nZ2VkCi0JCQkJCQkvLyBhbmQgb25seSBsb2cgYSBjZXJ0YWluIGFtdCBvZiB0aGUgc2FtZSBvbmUsCi0JCQkJCQkvLyBvdGhlcndpc2Ugc2tpcCBpdC4KLQkJCQkJCWlmICghZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVzVG9CZVByb2Nlc3NlZFtsYXN0RmlsZUN1cnNvcl0gIT0gbnVsbCA/IGZpbGVzVG9CZVByb2Nlc3NlZFtsYXN0RmlsZUN1cnNvcl0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BJbmRleGVyIHByb2JsZW0gaW5kZXhpbmc6IiArIGZpbGVuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgZm9yCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGRpZG4ndCBmb2xsb3cgQVBJIChtb25pdG9yIGlzIG51bGwpCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0KLQkJCS8vIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgY2xlYXIgZmlsZXMgbGlzdAotCQkJY2xlYXJGaWxlcygpOwotCQkJCi0JCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJbG9uZyBkaWZmID0gZmluaXNoIC0gc3RhcnQ7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlmVG90YWxUaW1lICs9IGRpZmY7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoaXMgdGltZTogIiArIGRpZmYgKyAiIGN1bXVsYXRpdmUgdGltZSBmb3IgcmVzb3VyY2UgY2hhbmdlZDogIiArIGZUb3RhbFRpbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIHJ1bk1vbml0b3IpIHsKLQotCQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOwotCQkJLy8gY2hlY2sgc3BlY2lmaWMgbW9uaXRvciBwYXNzZWQgaW50byBydW4gbWV0aG9kICh0aGUgcHJvZ3Jlc3MKLQkJCS8vIGdyb3VwIGluIHRoaXMgY2FzZSkKLQkJCS8vIGNoZWNrIG1haW4gc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmIChydW5Nb25pdG9yICE9IG51bGwgJiYgcnVuTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJZWxzZSBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCQlpZiAocnVuTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCXJ1bk1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhbmNlbGVkOwotCQl9Ci0JCQotCX0KLQotCS8vIGVuZCBjbGFzcyBQcm9jZXNzRmlsZXNKb2IKLQotCXByaXZhdGUgc3RhdGljIEpTUEluZGV4TWFuYWdlciBmU2luZ2xldG9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemluZyA9IHRydWU7Ci0KLQlwcml2YXRlIEluZGV4Sm9iQ29vcmRpbmF0b3IgaW5kZXhKb2JDb29yZGluYXRvcjsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIEpTUFJlc291cmNlVmlzaXRvciBmVmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlSlNQID0gbnVsbDsKLQotCXN0YXRpYyBsb25nIGZUb3RhbFRpbWUgPSAwOwotCi0JLy8gSm9iIGZvciBwcm9jZXNzaW5nIHJlc291cmNlIGRlbHRhCi0JcHJpdmF0ZSBQcm9jZXNzRmlsZXNKb2IgcHJvY2Vzc0ZpbGVzSm9iID0gbnVsbDsKLQotCXByaXZhdGUgSlNQSW5kZXhNYW5hZ2VyKCkgewotCQlwcm9jZXNzRmlsZXNKb2IgPSBuZXcgUHJvY2Vzc0ZpbGVzSm9iKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMCk7Ci0JCS8vIG9ubHkgc2hvdyBpbiB2ZXJib3NlIG1vZGUKLQkJcHJvY2Vzc0ZpbGVzSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLnNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5kb25lKGV2ZW50KTsKLQkJCQlzZXRTdGFibGVTdGF0ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BJbmRleE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGZTaW5nbGV0b24gPT0gbnVsbCkKLQkJCWZTaW5nbGV0b24gPSBuZXcgSlNQSW5kZXhNYW5hZ2VyKCk7Ci0JCXJldHVybiBmU2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJSlNQSW5kZXhNYW5hZ2VyIHNpbmdsZUluc3RhbmNlID0gZ2V0SW5zdGFuY2UoKTsKLQotCi0JCWlmICghc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQpIHsKLQkJCXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkJc2luZ2xlSW5zdGFuY2UuaW5kZXhKb2JDb29yZGluYXRvciA9IG5ldyBJbmRleEpvYkNvb3JkaW5hdG9yKCk7Ci0JCQlzaW5nbGVJbnN0YW5jZS5qc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQotCQkJLy8gYWRkZWQgYXMgSm9iQ2hhbmdlIGxpc3RlbmVyIHNvIEpTUEluZGV4TWFuYWdlciBjYW4gYmUgc21hcnRlcgotCQkJLy8gYWJvdXQgd2hlbiBpdCBydW5zCi0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoc2luZ2xlSW5zdGFuY2UuaW5kZXhKb2JDb29yZGluYXRvcik7Ci0KLQkJCS8vIGFkZCBKU1BJbmRleE1hbmFnZXIgdG8ga2VlcCBKU1AgSW5kZXggdXAgdG8gZGF0ZQotCQkJLy8gbGlzdGVuaW5nIGZvciBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIGFuZAotCQkJLy8gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwOTEKLQkJCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0JCQlzYXZlSW5kZXhlcygpOwotCQkJc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0KLQkJfQotCi0JfQotCQotCXN5bmNocm9uaXplZCB2b2lkIHNldEluZGV4U3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgc2V0dGluZyBpbmRleCBzdGF0ZSB0bzogIiArIHN0YXRlMlN0cmluZyhzdGF0ZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJUGx1Z2luIGpzcE1vZGVsUGx1Z2luID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWpzcE1vZGVsUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoUEtFWV9JTkRFWF9TVEFURSwgc3RhdGUpOwotCQlqc3BNb2RlbFBsdWdpbi5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHN0YXRlMlN0cmluZyhpbnQgc3RhdGUpIHsKLQkJU3RyaW5nIHMgPSAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSAoU19TVEFCTEUpIDoKLQkJCQlzID0gIlNfU1RBQkxFIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19VUERBVElORykgOgotCQkJCXMgPSAiU19VUERBVElORyI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfQ0FOQ0VMRUQpIDoKLQkJCQlzID0gIlNfQ0FOQ0VMRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX1JFQlVJTERJTkcpIDoKLQkJCQlzID0gIlNfUkVCVUlMRElORyI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlpbnQgZ2V0SW5kZXhTdGF0ZSgpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KFBLRVlfSU5ERVhfU1RBVEUpOwotCX0KLQotCXZvaWQgc2V0VXBkYXRpbmdTdGF0ZSgpIHsKLQkJLy9pZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfQ0FOQ0VMRUQpCi0JCXNldEluZGV4U3RhdGUoU19VUERBVElORyk7Ci0JfQotCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlzZXRJbmRleFN0YXRlKEpTUEluZGV4TWFuYWdlci5TX0NBTkNFTEVEKTsKLQl9Ci0KLQl2b2lkIHNldFN0YWJsZVN0YXRlKCkgewotCQkvL2lmIChnZXRJbmRleFN0YXRlKCkgIT0gU19DQU5DRUxFRCkKLQkJc2V0SW5kZXhTdGF0ZShTX1NUQUJMRSk7Ci0JfQotCi0Jdm9pZCBzZXRSZWJ1aWxkaW5nU3RhdGUoKSB7Ci0JCXNldEluZGV4U3RhdGUoU19SRUJVSUxESU5HKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkSW5kZXhJZk5lZWRlZCgpIHsKLQkJaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX1NUQUJMRSkgewotCQkJcmVidWlsZEluZGV4KCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlYnVpbGRJbmRleCgpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBKU1AgSW5kZXggdW5zdGFibGUsIHJlcXVlc3RpbmcgcmUtaW5kZXhpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEluZGV4aW5nSm9iKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmFib3V0VG9SdW4oZXZlbnQpOwotCQkJCXNldFJlYnVpbGRpbmdTdGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQkJZ2V0SW5kZXhpbmdKb2IoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCS8vIHdlJ3JlIGFib3V0IHRvIHJlaW5kZXggZXZlcnl0aGluZyBhbnl3YXkKLQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuY2xlYXJGaWxlcygpOwotCQlnZXRJbmRleGluZ0pvYigpLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBzY2hlZHVsZXMgYSBKb2IgdG8gcHJvY2VzcyBjb2xsZWN0ZWQgZmlsZXMuIEFsbCBKU1AKLQkgKiBpbmRleGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIHRoaXMgbWV0aG9kIG9yIHByb2Nlc3NGaWxlcyhJRmlsZSBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlcwotCSAqLwotCWZpbmFsIHZvaWQgaW5kZXhGaWxlcyhJRmlsZVtdIGZpbGVzKSB7Ci0JCS8vIGRvbid0IHVzZSB0aGlzIHJ1bGUKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MzEKLQkJLy8gcHJvY2Vzc0ZpbGVzLnNldFJ1bGUobmV3IEluZGV4RmlsZVJ1bGUoKSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5wcm9jZXNzKGZpbGVzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGZvciBhY2Nlc3MgYnkgaW5uZXIgSm9iIGNsYXNzIGluIHJlc291cmNlQ2hhbmdlZCguLi4pCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUpTUFJlc291cmNlVmlzaXRvciBnZXRWaXNpdG9yKCkgewotCi0JCWlmICh0aGlzLmZWaXNpdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZlZpc2l0b3IgPSBuZXcgSlNQUmVzb3VyY2VWaXNpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZlZpc2l0b3I7Ci0JfQotCi0JLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwOTEKLQkvLyBtYWtlcyBzdXJlIEluZGV4TWFuYWdlciBpcyBhd2FyZSBvZiBvdXIgaW5kZXhlcwotCXZvaWQgc2F2ZUluZGV4ZXMoKSB7Ci0JCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKTsKLQkJSVBhdGgganNwTW9kZWxXb3JraW5nTG9jYXRpb24gPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsKLQotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZm9sZGVyLmxpc3QoKTsKLQkJU3RyaW5nIGxvY2F5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW5kZXggaW5kZXggPSBudWxsOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F5ID0ganNwTW9kZWxXb3JraW5nTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIGZpbGVzW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJldXNlIGluZGV4IGZpbGUKLQkJCQkJaW5kZXggPSBuZXcgSW5kZXgobG9jYXksICJJbmRleCBmb3IgIiArIGxvY2F5LCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJaWYgKERFQlVHKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlJQ29udGVudFR5cGUgZ2V0SnNwQ29udGVudFR5cGUoKSB7Ci0JCWlmICh0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChERUJVRyAmJiBzaHV0dGluZ0Rvd24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyOiBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQotCQkvLyBzdG9wIGxpc3RlbmluZwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCi0JCS8vIHN0b3AgYW55IHNlYXJjaGluZwotCQlKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gam9icwotCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIoaW5kZXhKb2JDb29yZGluYXRvcik7Ci0KLQotCQlpbnQgbWF4d2FpdCA9IDUwMDA7Ci0JCWlmIChwcm9jZXNzRmlsZXNKb2IgIT0gbnVsbCkgewotCQkJcHJvY2Vzc0ZpbGVzSm9iLmNhbmNlbCgpOwotCQl9Ci0JCS8vIGF0dGVtcHQgdG8gbWFrZSBzdXJlIHRoaXMgaW5kZXhpbmcgam9iIGlzIGxpdHRlcmFsbHkKLQkJLy8gZG9uZSBiZWZvcmUgY29udGludWluZywgc2luY2Ugd2UgYXJlIHNodXR0aW5nIGRvd24KLQkJd2FpdFRpbGxOb3RSdW5uaW5nKG1heHdhaXQsIHByb2Nlc3NGaWxlc0pvYik7Ci0KLQkJaWYgKGluZGV4aW5nSm9iICE9IG51bGwpIHsKLQkJCWluZGV4aW5nSm9iLmNhbmNlbCgpOwotCQl9Ci0JCXdhaXRUaWxsTm90UnVubmluZyhtYXh3YWl0LCBwcm9jZXNzRmlsZXNKb2IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3YWl0VGlsbE5vdFJ1bm5pbmcoaW50IG1heFNlY29uZHMsIEpvYiBqb2IpIHsKLQkJaW50IHBhdXNlVGltZSA9IDEwOwotCQlpbnQgbWF4dHJpZXMgPSBtYXhTZWNvbmRzIC8gcGF1c2VUaW1lOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoY291bnQrKyA8IG1heHRyaWVzICYmIGpvYi5nZXRTdGF0ZSgpID09IEpvYi5SVU5OSU5HKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChwYXVzZVRpbWUpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY291bnQ6ICIgKyBjb3VudCArICIgbWF4OiAiICsKLQkJCQkvLyBtYXh0cmllcyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEluZGV4Sm9iQ29vcmRpbmF0b3IgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlKb2Igam9iVG9Db29yZGluYXRlID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQlpZiAoaXNKb2JUb0F2b2lkKGpvYlRvQ29vcmRpbmF0ZSkpIHsKLQkJCQkvLyBqb2Igd2lsbCBiZSByZXNjaGVkdWxlZCB3aGVuIHRoZSBqb2Igd2UKLQkJCQkvLyBhcmUgYXZvaWRpbmcgKGVnLiBidWlsZCkgaXMgZG9uZQotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLmNhbmNlbCgpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5jZWw6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJaWYgKGdldFByb2Nlc3NGaWxlc0pvYigpLmdldEZpbGVzKCkubGVuZ3RoID4gMCkgewotCQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGU6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkJCi0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pvYlRvQXZvaWQoSm9iIGpvYlRvQ29vcmRpbmF0ZSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChqb2JUb0Nvb3JkaW5hdGUuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fUkVGUkVTSCkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGlzSW5pdGlhbGl6aW5nKCkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBpZ25vcmUgcmVzb3VyY2UgY2hhbmdlcyBpZiBhbHJlYWR5IHJlYnVpbGRpbmcKLQkJCWlmIChnZXRJbmRleFN0YXRlKCkgPT0gU19SRUJVSUxESU5HKQotCQkJCXJldHVybjsKLQkJCS8vIHByZXZpb3VzbHkgY2FuY2VsZWQsIG5lZWRzIGVudGlyZSBpbmRleCByZWJ1aWxkCi0JCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpID09IFNfQ0FOQ0VMRUQpIHsKLQkJCQkvLyByZWJ1aWxkSW5kZXgoKTsKLQkJCQkvLyBqdXN0IHJlc3VtZSBpbmRleGluZwotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLnNjaGVkdWxlKDUwMCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlOiByZXNvdXJjZSBjaGFuZ2VkLCBwcmV2aW91c2x5IGNhbmNlbGVkIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJCS8vIG9ubHkgY2FyZSBhYm91dCBhZGRzIG9yIGNoYW5nZXMgcmlnaHQgbm93Li4uCi0JCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJYm9vbGVhbiBhZGRlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJCWJvb2xlYW4gY2hhbmdlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKLQkJCQlpZiAoYWRkZWQgfHwgY2hhbmdlZCkgewotCi0JCQkJCS8vIG9ubHkgYW5hbHl6ZSB0aGUgZnVsbCAoc3RhcnRpbmcgYXQgcm9vdCkgZGVsdGEKLQkJCQkJLy8gaGllcmFyY2h5Ci0JCQkJCWlmIChkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKU1BSZXNvdXJjZVZpc2l0b3IgdiA9IGdldFZpc2l0b3IoKTsKLQkJCQkJCQkvLyBjbGVhciBmcm9tIGxhc3QgcnVuCi0JCQkJCQkJdi5yZXNldCgpOwotCQkJCQkJCS8vIGNvdW50IGZpbGVzLCBwb3NzaWJseSBkbyB0aGlzIGluIGEgam9iIHRvby4uLgotCQkJCQkJCS8vIGRvbid0IGluY2x1ZGUgUEhBTlRPTSByZXNvdXJjZXMKLQkJCQkJCQlkZWx0YS5hY2NlcHQodiwgZmFsc2UpOwotCi0JCQkJCQkJLy8gcHJvY2VzcyBmaWxlcyBmcm9tIHRoaXMgZGVsdGEKLQkJCQkJCQlJRmlsZVtdIGZpbGVzID0gdi5nZXRGaWxlcygpOwotCQkJCQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCS8qCi0JCQkJCQkJCSAqIEpvYiBjaGFuZ2UgbGlzdGVuZXIgc2hvdWxkIHNldCBiYWNrIHRvCi0JCQkJCQkJCSAqIHN0YWJsZSB3aGVuIGZpbmlzaGVkCi0JCQkJCQkJCSAqLwotCQkJCQkJCQlzZXRVcGRhdGluZ1N0YXRlKCk7Ci0JCQkJCQkJCS8vIHByb2Nlc3NGaWxlcyhmaWxlcyk7Ci0JCQkJCQkJCWluZGV4RmlsZXMoZmlsZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5lZWQgdG8gc2V0IHN0YXRlIGhlcmUgc29tZWhvdywgYW5kIHJlaW5kZXgKLQkJCQkJCQkvLyBvdGhlcndpc2UgaW5kZXggd2lsbCBiZSB1bnJlbGlhYmxlCi0JCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCX0KLQotCUluZGV4V29ya3NwYWNlSm9iIGdldEluZGV4aW5nSm9iKCkgewotCQlyZXR1cm4gaW5kZXhpbmdKb2I7Ci0JfQotCi0JUHJvY2Vzc0ZpbGVzSm9iIGdldFByb2Nlc3NGaWxlc0pvYigpIHsKLQkJcmV0dXJuIHByb2Nlc3NGaWxlc0pvYjsKLQl9Ci0KLQlib29sZWFuIGlzSW5pdGlhbGl6aW5nKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6aW5nOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxOWY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFBhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci0KLS8qKgotICogcGFfVE9ETyBTdGlsbCBuZWVkIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uOgotICogCS0gZm9jdXMgaW4gd29ya3NwYWNlCi0gKiAgLSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGF0aEluZGV4ZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLy8gdmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlCi0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQkvLyBoYXNoIG1hcCBmb3JjZXMgb25seSBvbmUgb2YgZWFjaCBmaWxlCi0JCXByaXZhdGUgSGFzaE1hcCBmUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCQlJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0JCVNlYXJjaFBhdHRlcm4gZlBhdHRlcm4gPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuZlBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJdGhpcy5mU2NvcGUgPSBzY29wZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0KLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCWlmKGNvbnRlbnRUeXBlSlNQLmlzQXNzb2NpYXRlZFdpdGgocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQkKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlTdHJpbmcgY3RJZCA9IG51bGw7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJY3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AuZXF1YWxzKGN0SWQpKSB7Ci0JCQkJCQlpZiAodGhpcy5mU2NvcGUuZW5jbG9zZXMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpIHsKLQkKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIHNlbGVjdGVkIGluZGV4IHBhdGg6IiArIGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCWZQYXRocy5wdXQoZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLCBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aFtdIGdldFBhdGhzKCkgewotCQkJcmV0dXJuIChJUGF0aFtdKSBmUGF0aHMudmFsdWVzKCkudG9BcnJheShuZXcgSVBhdGhbZlBhdGhzLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JcHVibGljIElQYXRoW10gZ2V0VmlzaWJsZUpzcFBhdGhzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCi0JCUpTUEZpbGVWaXNpdG9yIGpzcEZpbGVWaXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKHBhdHRlcm4sIHNjb3BlKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KGpzcEZpbGVWaXNpdG9yLCAwKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlVmlzaXRvci5nZXRQYXRocygpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM4MjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi0vKioKLSAqIENyZWF0ZWQgd2l0aCBhIC5qc3AgZmlsZSwgYnV0IHNob3VsZCBhcHBlYXIgdG8gYmUgYSAuamF2YSBmaWxlIGZvciBpbmRleGluZwotICogYW5kIHNlYXJjaGluZyBwdXJwb3Nlcy4gVGhlcmUgYXJlIHB1cnBvc2VseSBmZXcgZmllbGRzIGluIHRoaXMgY2xhc3MsIGFuZAotICogdGhvc2UgZmllbGRzIGFyZSBsaWdodHdlaWdodCBzaW5jZSBpdCdzIHBvc3NpYmxlIGZvciBtYW55IEpTUCBzZWFyY2gKLSAqIGRvY3VtZW50cyB0byBleGlzdCBpbiBtZW1vcnkgYXQgb25lIHRpbWUgKGVnLiBhZnRlciBpbXBvcnRpbmcgYSBwcm9qZWN0Ci0gKiB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEpTUCBmaWxlcykKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaERvY3VtZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIFVOS05PV05fUEFUSCA9ICIqKnBhdGggdW5rbm93bioqIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZKU1BQYXRoU3RyaW5nID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU3RyaW5nIGZDVVBhdGggPSBVTktOT1dOX1BBVEg7Ci0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCXByaXZhdGUgbG9uZyBmTGFzdE1vZGlmaWVkU3RhbXA7Ci0JcHJpdmF0ZSBjaGFyW10gZkNhY2hlZENoYXJDb250ZW50czsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBKU1BTZWFyY2hEb2N1bWVudChTdHJpbmcgZmlsZVBhdGgsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJdGhpcy5mSlNQUGF0aFN0cmluZyA9IGZpbGVQYXRoOwotCQl0aGlzLmZQYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRQYXJ0aWNpcGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldENoYXJDb250ZW50cygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlpZihmQ2FjaGVkQ2hhckNvbnRlbnRzID09IG51bGwgfHwgaXNEaXJ0eSgpKSB7Ci0JCSAgICBKU1BUcmFuc2xhdGlvbiB0cmFucyA9IGdldEpTUFRyYW5zbGF0aW9uKCk7ICAgIAotCQkgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zICE9IG51bGwgPyB0cmFucy5nZXRKYXZhVGV4dCgpLnRvQ2hhckFycmF5KCkgOiBuZXcgY2hhclswXTsKLQkJICAgIGZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkQ2hhckNvbnRlbnRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGdldENoYXJDb250ZW50cygpKTsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCdzIG5vdCByZWNvbW1lbmRlZCBmb3IgY2xpZW50cyB0byBob2xkIG9uIHRvIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKiBzaW5jZSBpdCdzIGtpbmQgb2YgbGFyZ2UuIElmIHBvc3NpYmxlLCBob2xkIG9uIHRvIHRoZQotCSAqIEpTUFNlYXJjaERvY3VtZW50LCB3aGljaCBpcyBtb3JlIG9mIGEgbGlnaHR3ZWlnaHQgcHJveHkuCi0JICogCi0JICogQHJldHVybiB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoZSBqc3AgZmlsZSwgb3IgbnVsbCBpZiBpdCdzIGFuCi0JICogICAgICAgICB1bnN1cHBvcnRlZCBmaWxlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRKU1BUcmFuc2xhdGlvbigpIHsKLQkJSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlJRmlsZSBqc3BGaWxlID0gZ2V0RmlsZSgpOwotCQlpZiAoIUpTUFNlYXJjaFN1cHBvcnQuaXNKc3AoanNwRmlsZSkpCi0JCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgZXhpc3RpbmcgbW9kZWwgZm9yIHJlYWQsIHRoZW4gZ2V0IGRvY3VtZW50IGZyb20gaXQKLQkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRNb2RlbEZvclJlYWQoanNwRmlsZSk7Ci0JCQl9Ci0JCQkvLyBoYW5kbGUgdW5zdXBwb3J0ZWQKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpbW9kZWw7Ci0JCQkJc2V0dXBBZGFwdGVyRmFjdG9yeSh4bWxNb2RlbCk7Ci0JCQkJSURPTURvY3VtZW50IGRvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBkb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCXRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJLy8gbm8gbmVlZCB0byBsb2cgdGhpcy4gSnVzdCBjb25zaWRlciBpdCBhbiBpbnZhbGlkIGZpbGUgZm9yIG91cgotCQkJLy8gcHVycG9zZXMuCi0JCQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGFkZCB0aGUgZmFjdG9yeSBmb3IgSlNQVHJhbnNsYXRpb25BZGFwdGVyIGhlcmUKLQkgKiAKLQkgKiBAcGFyYW0gc20KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBBZGFwdGVyRmFjdG9yeShJU3RydWN0dXJlZE1vZGVsIHNtKSB7Ci0JCUpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHBhdGggdG8gdGhlIEphdmEgY29tcGlsYXRpb24gdW5pdAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkgICAgLy8gY2FjaGluZyB0aGUgcGF0aCBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBnZXQgdHJhbnNsYXRpb24KLQkJLy8gaW1wb3J0YW50IHRoYXQgaXNEaXJ0eSgpIGNoZWNrIGlzIHNlY29uZCB0byBjYWNoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgICAgaWYodGhpcy5mQ1VQYXRoID09IG51bGwgfHwgaXNEaXJ0eSgpIHx8IHRoaXMuZkNVUGF0aCA9PSBVTktOT1dOX1BBVEgpIHsKLQkgICAgICAgIEpTUFRyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkgICAgICAgIGlmKHRyYW5zICE9IG51bGwpIHsKLQkgICAgICAgICAgICB0aGlzLmZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCSAgICAgICAgICAgIC8vIHNhdmUgc2luY2UgaXQncyBleHBlbnNpdmUgdG8gY2FsY3VsYXRlIGFnYWluIGxhdGVyCi0JICAgICAgICAgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zLmdldEphdmFUZXh0KCkudG9DaGFyQXJyYXkoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCQlyZXR1cm4gZkNVUGF0aCAhPSBudWxsID8gZkNVUGF0aCA6IFVOS05PV05fUEFUSDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BUcmFuc2xhdGlvbgotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLQkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCQlpZiAodHJhbnMgIT0gbnVsbCkgewotCQkJSGFzaE1hcCBqYXZhMmpzcE1hcCA9IHRyYW5zLmdldEphdmEySnNwTWFwKCk7Ci0KLQkJCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqYXZhIHJhbmdlcwotCQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0JCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQgKyBqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlvZmZzZXRJblJhbmdlID0gamF2YU9mZnNldCAtIGphdmFQb3Mub2Zmc2V0OwotCQkJCWpzcFBvcyA9IChQb3NpdGlvbikgamF2YTJqc3BNYXAuZ2V0KGphdmFQb3MpOwotCi0JCQkJaWYgKGpzcFBvcyAhPSBudWxsKQotCQkJCQlyZXN1bHQgPSBqc3BQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIGpzcFBhdGggPSBuZXcgUGF0aCh0aGlzLmZKU1BQYXRoU3RyaW5nKTsKLQkJSUZpbGUganNwRmlsZSA9IHJvb3QuZ2V0RmlsZShqc3BQYXRoKTsKLQkJaWYgKCFqc3BGaWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBwb3NzaWJseSBvdXRzaWRlIHdvcmtzcGFjZQotCQkJanNwRmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGpzcFBhdGgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCUlGaWxlIGYgPSBnZXRGaWxlKCk7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlpZihjdXJyZW50U3RhbXAgIT0gZkxhc3RNb2RpZmllZFN0YW1wKQotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCWZMYXN0TW9kaWZpZWRTdGFtcCA9IGN1cnJlbnRTdGFtcDsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gbm93IHNpbmNlIEpTUFRyYW5zbGF0aW9uIGlzIGNyZWF0ZWQgb24gdGhlIGZseQotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIltKU1BTZWFyY2hEb2N1bWVudDoiICsgdGhpcy5mSlNQUGF0aFN0cmluZyArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRFbmNvZGluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRCeXRlQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTNkNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogSW50ZWdyYXRpb24gb2YgSlNQIHcvIGphdmEgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGNhbGN1bGF0ZVZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZVZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVidWcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVidWc7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0YW50IHRvIG5ldmVyIHJldHVybiBudWxsIGhlcmUgb3IgZWxzZSBKYXZhIHNlYXJjaCBwYXJ0aWNpcGF0aW9uCi0JICogd2lsbCBicmVhay4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQlTZWFyY2hEb2N1bWVudCBzRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0KLQkJaWYgKHNEb2MgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuIGEgZHVtbXkgZG9jIGhlcmUgc28gc2VhcmNoIHBhcnRpY2lwYXRpb24gZG9lc24ndCBicmVhawotCQkJcmV0dXJuIG5ldyBOdWxsU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnRQYXRoKTsKLQkJfQotCQlyZXR1cm4gc0RvYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIkpTUCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBzZWxlY3RJbmRleGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCQlKU1BQYXRoSW5kZXhlciBpbmRleGVyID0gbmV3IEpTUFBhdGhJbmRleGVyKCk7Ci0JCXJldHVybiBpbmRleGVyLmdldFZpc2libGVKc3BQYXRocyhwYXR0ZXJuLCBzY29wZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgSVBhdGggaW5kZXhQYXRoKSB7Ci0JCWlmICghKGRvY3VtZW50IGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpKQotCQkJcmV0dXJuOwotCi0JCS8vIHVzZSBKYXZhIHNlYXJjaCBpbmRleGluZwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkuaW5kZXhEb2N1bWVudChkb2N1bWVudCwgaW5kZXhQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaERvY3VtZW50W10gaW5kZXhNYXRjaGVzLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlsdGVyIG91dCBudWxsIG1hdGNoZXMKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2VhcmNoRG9jdW1lbnQgbWF0Y2ggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4TWF0Y2hlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcG9zc2libGUgbWF0Y2hpbmcgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU6ICIgKyBpbmRleE1hdGNoZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQltYXRjaCA9IGluZGV4TWF0Y2hlc1tpXTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJLy8gc29tZSBtYXRjaGVzIG1heSBiZSBudWxsLCBvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUsCi0JCQkJLy8gdGhlIGZpbGUgbWF5IG5vdCBldmVuIGV4aXN0Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgJiYgKChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgbWF0Y2gpLmdldEZpbGUoKS5leGlzdHMoKSkKLQkJCQkJZmlsdGVyZWQuYWRkKG1hdGNoKTsKLQkJCX0KLQkJfQotCi0JCWluZGV4TWF0Y2hlcyA9IChTZWFyY2hEb2N1bWVudFtdKSBmaWx0ZXJlZC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtmaWx0ZXJlZC5zaXplKCldKTsKLQkJU2VhcmNoRW5naW5lLmdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLmxvY2F0ZU1hdGNoZXMoaW5kZXhNYXRjaGVzLCBwYXR0ZXJuLCBzY29wZSwgcmVxdWVzdG9yLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNnZXREb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBuZXZlciBnZXRzIGNhbGxlZD8KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYzI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotCi0vKioKLSAqIFVzZWQgdG8gY29uc3RyYWluIEpTUC9qYXZhIHNlYXJjaCB0byBjZXJ0YWluIHBhdGhzIGFuZCBlbGVtZW50cy4KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTZWFyY2hTY29wZSBpbXBsZW1lbnRzIElKYXZhU2VhcmNoU2NvcGUgewotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmNsb3Nlc0FsbCA9IGZhbHNlOwotCXByaXZhdGUgTGlzdCBmUmVzb3VyY2VQYXRocyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZKYXZhRWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIEpTUFNlYXJjaFNjb3BlKCkgewotCQkvLyBlbXB0eSBjb25zdHJ1Y3RvciBqdXN0IHJldHVybnMgdHJ1ZSBmb3IgZXZlcnl0aGluZwotCQkvLyBldmVyeXRoaW5nIGlzIGluIHNjb3BlCi0JCXRoaXMuZkVuY2xvc2VzQWxsID0gdHJ1ZTsKLQkJaW5pdCgpOwotCX0KLQotCXB1YmxpYyBKU1BTZWFyY2hTY29wZShTdHJpbmdbXSByZXNvdXJjZVN0cmluZ1BhdGgpIHsKLQkJaW5pdCgpOwotCQlmUmVzb3VyY2VQYXRocy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZVN0cmluZ1BhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgSlNQU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10gamF2YUVsZW1lbnQpIHsKLQkJaW5pdCgpOwotCQlmSmF2YUVsZW1lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGphdmFFbGVtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMuZkphdmFFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoU3RyaW5nKSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGVuY2xvc2VzUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJLy8gcGFfVE9EIGltcGxlbWVudAotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJUmVzb3VyY2VQcm94eSBlbGVtZW50KSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGVuY2xvc2VzUGF0aChlbGVtZW50LnJlcXVlc3RGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMuYWRkKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5mSmF2YUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5jbG9zZXNQYXRoKFN0cmluZyBwb3NzaWJsZSkgewotCi0JCVN0cmluZ1tdIHBhdGhzID0gKFN0cmluZ1tdKSBmUmVzb3VyY2VQYXRocy50b0FycmF5KG5ldyBTdHJpbmdbZlJlc291cmNlUGF0aHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwb3NzaWJsZS5lcXVhbHMocGF0aHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCi0JCXJldHVybiAiSlNQU2VhcmNoU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgewotCi0JCS8vIHBhX1RPRE8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0NsYXNzcGF0aHMoYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY4ZGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1AyU2VydmxldE5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotCi0vKioKLSAqIENlbnRyYWwgYWNjZXNzIHRvIGphdmEgaW5kZXhpbmcgYW5kIHNlYXJjaC4gQWxsIGNvbnRhY3QgYmV0d2VlbiBKRFQgaW5kZXhpbmcKLSAqIGFuZCBTZWFyY2hpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCBoZXJlLgotICogCi0gKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZSB2aWEKLSAqIDxjb2RlPmdldEluc3RhbmNlKCk8L2NvZGU+LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoU3VwcG9ydCB7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSlNQU2VhcmNoU3VwcG9ydCBzaW5nbGV0b24gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBKU1BTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBmSnNwUGx1Z2luTG9jYXRpb24gPSBudWxsOwotCi0gICAgLy8gcGFfVE9ETyBtYXkgYmUgc2xvdyAoZXNwIGZvciBpbmRleGluZyBlbnRpcmUgd29ya3NwYWNlKQotICAgIHByaXZhdGUgZmluYWwgQ1JDMzIgZkNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotCi0gICAgLyoqIG1haW4gY2FuY2VsIG1vbnRpb3IgZm9yIGFsbCBzZWFyY2ggc3VwcG9ydCAqLwotICAgIHByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBmTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIEpTUFNlYXJjaFN1cHBvcnQoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBzaW5nbGUgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxpdmUgcmVzb3VyY2UncyBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluCi0gICAgICogdGhlIG9wZW4gZWRpdG9yLiBJdCBhbHNvIGFsbG93cyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGEgUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hKb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSmF2YVNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKU1BDb3JlTWVzc2FnZXMuSlNQX1NlYXJjaCArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICB0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBzZWFyY2ggdGV4dAotICAgICAgICBwdWJsaWMgU2VhcmNoSm9iKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUF9TZWFyY2ggKyBzZWFyY2hUZXh0KTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLSAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgICAgICAgICAgdGhpcy5mTWF0Y2hNb2RlID0gbWF0Y2hNb2RlOwotICAgICAgICAgICAgdGhpcy5mSXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3Igam9iTW9uaXRvcikgewotCi0gICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsICYmIGpvYk1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgICAgIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgdGhpcy5mTGltaXRUbyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mU2VhcmNoVGV4dCwgdGhpcy5mU2VhcmNoRm9yLCB0aGlzLmZMaW1pdFRvLCB0aGlzLmZNYXRjaE1vZGUpOwotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpTUFNlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0geyBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIH07Ci0gICAgICAgICAgICAgICAgU2VhcmNoRW5naW5lIGVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCB0aGlzLmZTY29wZSwgdGhpcy5mUmVxdWVzdG9yLCBqb2JNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBlbmQgU2VhcmNoSm9iCi0gICAgLyoqCi0gICAgICogUnVubmFibGUgZm9yY2VzIGNhbGxlciB0byB3YWl0IHVudGlsIGZpbmlzaGVkIChhcyBvcHBvc2VkIHRvIHVzaW5nIGEgSm9iKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUsIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKLQotICAgICAgICBTdHJpbmcgZlNlYXJjaFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIElKYXZhU2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQotICAgICAgICBpbnQgZlNlYXJjaEZvciA9IEZJRUxEOwotCi0gICAgICAgIGludCBmTGltaXRUbyA9IEFMTF9PQ0NVUlJFTkNFUzsKLQotICAgICAgICBpbnQgZk1hdGNoTW9kZSA9IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIOwotCi0gICAgICAgIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YUVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mU2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mU2VhcmNoRm9yID0gc2VhcmNoRm9yOwotICAgICAgICAgICAgdGhpcy5mTGltaXRUbyA9IGxpbWl0VG87Ci0gICAgICAgICAgICB0aGlzLmZNYXRjaE1vZGUgPSBtYXRjaE1vZGU7Ci0gICAgICAgICAgICB0aGlzLmZJc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBTZWFyY2hQYXR0ZXJuIGphdmFTZWFyY2hQYXR0ZXJuID0gbnVsbDsKLSAgICAgICAgICAgIC8vIGlmIGFuIGVsZW1lbnQgaXMgYXZhaWxhYmxlLCB1c2UgdGhhdCB0byBjcmVhdGUgc2VhcmNoIHBhdHRlcm4KLSAgICAgICAgICAgIC8vIChlZy4gTG9jYWxWYXJpYWJsZSkKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIHRleHQgYW5kIG90aGVyIHBhcmFtdGVycwotICAgICAgICAgICAgaWYgKHRoaXMuZkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybih0aGlzLmZFbGVtZW50LCBmTGltaXRUbyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oZlNlYXJjaFRleHQsIGZTZWFyY2hGb3IsIGZMaW1pdFRvLCBmTWF0Y2hNb2RlKTsKLQotICAgICAgICAgICAgaWYgKGphdmFTZWFyY2hQYXR0ZXJuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHsgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB9OwotICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBlbmdpbmUuc2VhcmNoKGphdmFTZWFyY2hQYXR0ZXJuLCBwYXJ0aWNpcGFudHMsIGZTY29wZSwgZlJlcXVlc3RvciwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaFJ1bm5hYmxlCi0KLSAgICAvKioKLSAgICAgKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZQotICAgICAqIHZpYSBnZXRJbnN0YW5jZSgpCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpTUFNlYXJjaFN1cHBvcnQgZ2V0SW5zdGFuY2UoKSB7Ci0KLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotICAgICAgICAgICAgc2luZ2xldG9uID0gbmV3IEpTUFNlYXJjaFN1cHBvcnQoKTsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBjaGVjayBpZiBhIGZpbGUgaXMgYSBqc3AgZmlsZSAoc2luY2UgdGhpcyBpcyBkb25lCi0gICAgICogZnJlcXVlbnRseSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKc3AoSUZpbGUgZmlsZSkgewotICAgIAkvLyAocGEpIDIwMDUxMDI1IHJlbW92aW5nIGRlZXAgY29udGVudCB0eXBlIGNoZWNrCi0gICAgCS8vIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyZXF1ZW50bHkKLSAgICAJLy8gYW5kIElPIGlzIGV4cGVuc2l2ZQotICAgICAgICBib29sZWFuIGlzSnNwID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIElDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotICAgICAgICAgICAgLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24sIGl0J3MgbGVzcyBleHBlbnNpdmUKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZUpTUC5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgCWlzSnNwID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0pzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlZHVsZXMgYSBzZWFyY2ggZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoaXMgSlNQIGZpbGUgZm9yIGluZGV4aW5nIChieQotICAgICAqIHRoZSBqYXZhIGluZGV4ZXIpCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBKU1AgZmlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbmRleGluZyB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGFkZEpzcEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCAhZmlsZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBKU1AgZmlsZToiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGZpbGUpOwotICAgICAgICAvLyBudWxsIGlmIG5vdCBhIGpzcCBmaWxlCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldFNlYXJjaFBhcnRpY2lwYW50KCkuc2NoZWR1bGVEb2N1bWVudEluZGV4aW5nKGRlbGVnYXRlLCBjb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZmFpbHVyZSBoZXJlIGRvZXNuJ3Qga2VlcCBvdGhlciBkb2N1bWVudHMgZnJvbQotICAgICAgICAgICAgICAgIC8vIGJlaW5nIGluZGV4ZWQKLSAgICAgICAgICAgICAgICAvLyBpZiBwZWZvcm1lZCBpbiBhIGJhdGNoIGNhbGwgKGxpa2UgSlNQSW5kZXhNYW5hZ2VyKQotICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGVkIiArIGRlbGVnYXRlICsgImZvciBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSBqYXZhIHNlYXJjaCB3LyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gUnVucyBpbiBhIGJhY2tncm91bmQgSm9iCi0gICAgICogKHJlc3VsdHMgbWF5IHN0aWxsIGNvbWUgaW4gYWZ0ZXIgdGhpcyBtZXRob2QgY2FsbCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoVGV4dAotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBvZiB0ZXh0IHRvIHNlYXJjaCBvbgotICAgICAqIEBwYXJhbSBzZWFyY2hGb3IKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIE1FVEhPRCwgRklFTEQsIFBBQ0tBR0UsIGV0Yy4uLgotICAgICAqIEBwYXJhbSBsaW1pdFRvCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMsCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTLCBvcgotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTCi0gICAgICogQHBhcmFtIG1hdGNoTW9kZQotICAgICAqICAgICAgICAgICAgYWxsb3cgKiB3aWxkY2FyZHMgb3Igbm90Ci0gICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKiAgICAgICAgICAgIHBhc3NlZCBpbiB0byBhY2NlcHQgc2VhcmNoIG1hdGNoZXMgKGFuZCBkbyAic29tZXRoaW5nIiB3aXRoCi0gICAgICogICAgICAgICAgICB0aGVtKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihzZWFyY2hUZXh0LCBzY29wZSwgc2VhcmNoRm9yLCBsaW1pdFRvLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy8gcG9wcyB1cCB1c2VyIG9wZXJhdGlvbiBibG9ja2VkIGRpYWxvZyBpZiB5b3UgcGVyZm9ybSBhIGxvbmcgc2VhcmNoLAotICAgICAgICAvLyB0aGVuIG9wZW4gYSBmaWxlIGJlY2F1c2UgaXQgbG9ja3MgdGhlIHdvcmtzcGFjZQotICAgICAgICAvL2pvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIGFuIElKYXZhRWxlbWVudCwgY29uc3RyYWluZWQgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4KLSAgICAgKiBhIGJhY2tncm91bmQgSm9iIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YUVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYW4gSVdvcmtzcGFjZSBydW5uYWJsZSAocmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIGJ5IHRoZSBlbmQgb2YgdGhpcwotICAgICAqIG1ldGhvZCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hSdW5uYWJsZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoUnVubmFibGUgc2VhcmNoUnVubmFibGUgPSBuZXcgU2VhcmNoUnVubmFibGUoZWxlbWVudCwgc2NvcGUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRDYW5jZWxlZChmYWxzZSk7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHNlYXJjaFJ1bm5hYmxlLCBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ganNwRmlsZQotICAgICAqIEByZXR1cm4gU2VhcmNoRG9jdW1lbnQgaWYgdGhlIGZpbGUgaXMgbm90IG51bGwsIGV4aXN0cywgYW5kIGlzIGEgSlNQCi0gICAgICogICAgICAgICBmaWxlLCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KElGaWxlIGpzcEZpbGUpIHsKLQotICAgICAgICBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIGlmIChqc3BGaWxlICE9IG51bGwgJiYganNwRmlsZS5leGlzdHMoKSAmJiBpc0pzcChqc3BGaWxlKSkgewotCi0gICAgICAgICAgICBkZWxlZ2F0ZSA9IG5ldyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShuZXcgSlNQU2VhcmNoRG9jdW1lbnQoanNwRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGdldFNlYXJjaFBhcnRpY2lwYW50KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDZW50cmFsaXplZCBwbGFjZSB0byBhY2Nlc3MgSlNQU2VhcmNoRG9jdW1lbnRzICh1c2VkIGJ5Ci0gICAgICogSlNQU2VhcmNoUGFydGljaXBhbnQgYW5kIEpTUFNlYXJjaFJlcXVlc3RvcikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoRG9jUGF0aAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIHRoZSBKU1BTZWFyY2hEb2N1bWVudCBvciBudWxsIGlmIG9uZSBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0U2VhcmNoRG9jdW1lbnQoU3RyaW5nIHNlYXJjaERvY1BhdGgpIHsKLSAgICAgICAgIAotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIElGaWxlIGYgPSBmaWxlRm9yQ1VQYXRoKHNlYXJjaERvY1BhdGgpOwotICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaGFuZGxlIGZhaWx1cmUgY2FzZS4uLiAoZmlsZSBkZWxldGVkIG1heWJlPykKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5tYW5nbGVzIHRoZSBzZWFyY2hEb2NQYXRoIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hEb2NQYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRmlsZSBmaWxlRm9yQ1VQYXRoKFN0cmluZyBzZWFyY2hEb2NQYXRoKSB7Ci0gICAgCi0gICAgICAgIFN0cmluZ1tdIHNwbGl0ID0gc2VhcmNoRG9jUGF0aC5zcGxpdCgiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBzcGxpdFtzcGxpdC5sZW5ndGggLSAxXTsKLQotICAgICAgICAvLyBpZ25vcmUgYW55dGhpbmcgYnV0IC5qYXZhIG1hdGNoZXMgKGxpa2UgLmNsYXNzIGJpbmFyeSBtYXRjaGVzKQotICAgICAgICBpZighc2VhcmNoRG9jUGF0aC5lbmRzV2l0aCgiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwudW5tYW5nbGUoY2xhc3NuYW1lKTsKLSAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFic29sdXRlIHBhdGgKLSAgICAgICAgSUZpbGUgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVQYXRoKSk7Ci0gICAgICAgIC8vIHdvcmtzcGFjZSByZWxhdGl2ZSB0aGVuCi0gICAgICAgIGlmKGYgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MDA5Ci0gICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBwcm9qZWN0IG5hbWUgYXMgd2VsbAotICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgbWVhbiA+PSAyIHBhdGggc2VnbWVudHMKLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0gICAgICAgICAgICBpZihwYXRoLnNlZ21lbnRDb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICBmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmOwotICAgIH0KLQotICAgIEpTUFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgewotCi0gICAgICAgIGlmICh0aGlzLmZQYXJ0aWNpcGFudCA9PSBudWxsKQotICAgICAgICAgICAgdGhpcy5mUGFydGljaXBhbnQgPSBuZXcgSlNQU2VhcmNoUGFydGljaXBhbnQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gSlNQUGF0aEluZGV4ZXIKLSAgICAvLyBwYV9UT0RPCi0gICAgLy9ob3cgY2FuIHdlIG1ha2Ugc3VyZSBwYXJ0aWNpcGFudCBpbmRleExvY2F0aW9ucyBhcmUgdXBkYXRlZCBhdCBzdGFydHVwPwotICAgIHB1YmxpYyBmaW5hbCBJUGF0aCBjb21wdXRlSW5kZXhMb2NhdGlvbihJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0KLSAgICAgICAgU3RyaW5nIGluZGV4TG9jYXRpb24gPSBudWxsOwotICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGluYWR2ZXJ0ZW50bHkgdXNlIGEgSkRUIEluZGV4Ci0gICAgICAgIC8vIHdlIHdhbnQgdG8gYmUgc3VyZSB0byB1c2UgdGhlIEluZGV4IGZyb20gdGhlIEpTUCBsb2NhdGlvbgotICAgICAgICAvL09iamVjdCBvYmogPSBpbmRleExvY2F0aW9ucy5nZXQoY29udGFpbmVyUGF0aCk7Ci0gICAgICAgIC8vaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgIC8vICAgIGluZGV4TG9jYXRpb24gPSAoU3RyaW5nKSBvYmo7Ci0gICAgICAgIC8vfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBpbmRleCBlbnRyeQotICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSBjb250YWluZXJQYXRoLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgIHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnVwZGF0ZShwYXRoU3RyaW5nLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gTG9uZy50b1N0cmluZyh0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSkgKyAiLmluZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGZyb20KLSAgICAgICAgICAgIC8vIEluZGV4TWFuYWdlciNjb21wdXRlSW5kZXhMb2NhdGlvbiguLi4pCi0gICAgICAgICAgICBpbmRleExvY2F0aW9uID0gZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKS5hcHBlbmQoZmlsZU5hbWUpLnRvT1NTdHJpbmcoKTsKLQotICAgICAgICAgICAgLy8gcGFfVE9ETyBuZWVkIHRvIGFkZCB0byBqYXZhIHBhdGggdG9vLCBzbyBKRFQgc2VhcmNoIHN1cHBvcnQga25vd3MKLSAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBhIG5vbiBpbnRlcm5hbCB3YXkgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzU2NAotICAgICAgICAgICAgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCkuaW5kZXhMb2NhdGlvbnMucHV0KGNvbnRhaW5lclBhdGgsIGluZGV4TG9jYXRpb24pOwotICAgICAgICAvL30KLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoKGluZGV4TG9jYXRpb24pOwotICAgIH0KLQotICAgIC8vIGNvcGllZCBmcm9tIEpEVCBJbmRleE1hbmFnZXIKLSAgICBwdWJsaWMgSVBhdGggZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5mSnNwUGx1Z2luTG9jYXRpb247Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBmb2xkZXIgbmFtZSAianNwc2VhcmNoIiB0byBrZWVwIHRoZSBzdGF0ZSBsb2NhdGlvbiBhcmVhIGNsZWFuZXIKLSAgICAgICAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoImpzcHNlYXJjaCIpOwotCi0gICAgICAgIC8vIHBhX1RPRE8gd29ya2Fyb3VuZCBmb3IKLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyMjY3Ci0gICAgICAgIC8vIGNvcGllZCBmcm9tIEluZGV4TWFuYWdlcgotICAgICAgICBTdHJpbmcgZGV2aWNlID0gc3RhdGVMb2NhdGlvbi5nZXREZXZpY2UoKTsKLSAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmIGRldmljZS5jaGFyQXQoMCkgPT0gJy8nKQotICAgICAgICAgICAgc3RhdGVMb2NhdGlvbiA9IHN0YXRlTG9jYXRpb24uc2V0RGV2aWNlKGRldmljZS5zdWJzdHJpbmcoMSkpOwotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IGl0IGV4aXN0cyBvbiBkaXNrCi0gICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoc3RhdGVMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0gICAgICAgIHJldHVybiB0aGlzLmZKc3BQbHVnaW5Mb2NhdGlvbiA9IHN0YXRlTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGNhbmNlbCkgewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigic2VhcmNoIHN1cHBvcnQgbW9uaXRvciIgKyBmTW9uaXRvcik7Ci0gICAgICAgIGZNb25pdG9yLnNldENhbmNlbGVkKGNhbmNlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCi0gICAgICAgIHJldHVybiBmTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy5mTW9uaXRvcjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2YxM2QxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uOwotCi0KLS8qKgotICogV3JhcHBlciBtZXRob2QgdG8gc2V0IGdldFBhdGgoKSBwYXRoIHRvIGJlIHRoZSBwYXRoIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IAotICogZm9yIHRoZSBqc3AgZmlsZS4gKHNpbmNlIGl0J3MgYSBmaW5hbCBtZXRob2QsIGl0IG5lZWRzIHRvIGJlIHNldCB2aWEgY29uc3RydWN0b3IpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlwcml2YXRlIEpTUFNlYXJjaERvY3VtZW50IGZKU1BTZWFyY2hEb2MgPSBudWxsOwotCQotCXB1YmxpYyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShKU1BTZWFyY2hEb2N1bWVudCBqc3BTZWFyY2hEb2MpIHsKLQkJCi0JCXN1cGVyKGpzcFNlYXJjaERvYy5nZXRQYXRoKCksIGpzcFNlYXJjaERvYy5nZXRQYXJ0aWNpcGFudCgpKTsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jID0ganNwU2VhcmNoRG9jOwotCX0KLQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRCeXRlQ29udGVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Q2hhckNvbnRlbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRFbmNvZGluZygpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0SnNwVHJhbnNsYXRpb24oKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpzcE9mZnNldChqYXZhT2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5OWExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRvcjsKLQotCi0KLS8qKgotICogQW4gZW1wdHkgc2VydmxldCwgc2FmZSBmb3IgSmF2YSBzZWFyY2ggcGFydGljaXBhdGlvbgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTnVsbFNlYXJjaERvY3VtZW50IGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCVN0cmluZ0J1ZmZlciBmRW1wdHlTZXJ2bGV0QnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgTnVsbFNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQkJc3VwZXIoZG9jdW1lbnRQYXRoLCBuZXcgSlNQU2VhcmNoUGFydGljaXBhbnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyID0gbmV3IEpTUFRyYW5zbGF0b3IoKS5nZXRFbXB0eVRyYW5zbGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmZFbXB0eVNlcnZsZXRCdWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVN0YXRlRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlU3RhdGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDc2YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlU3RhdGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHJlbWVtYmVyaW5nIG9sZCBhbmQgbmV3IGVtYmVkZGVkIGhhbmRsZXJzLCAKLSAqIGluIHRoZSBldmVudCBhIHJlLWluaXQgaXMgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUeXBlU3RhdGVEYXRhIHsKLQotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyOwotCUVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlcjsKLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEoRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJdGhpcy5vbGRIYW5kbGVyID0gb2xkSGFuZGxlcjsKLQkJdGhpcy5uZXdIYW5kbGVyID0gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXROZXdIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRPbGRIYW5kbGVyKCkgewotCQlyZXR1cm4gb2xkSGFuZGxlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSlNQTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMDc2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQuRE9NTW9kZWxGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLklKU1BIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LkpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Eb2N1bWVudElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5EZWJ1Z0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyA9IDIwMDAwMDsKLQotCS8qKgotCSAqIERNVyAtIE5vdGU6IEkgdGhpbmsgdGhlIGVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluIElNb2RlbE1hbmFnZXIgY2FuIGJlCi0JICogcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX01JTUVfVFlQRSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTEFOR1VBR0UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBKU1BNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5Ci0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5ID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJRE9NTW9kZWxGb3JKU1AgbW9kZWwgPSBuZXcgRE9NTW9kZWxGb3JKU1AoKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEZvciBKU1AgZmlsZXMsIHRleHQvaHRtbCBpcyB0aGUgZGVmYXVsdCBjb250ZW50IHR5cGUuIFRoaXMgbWF5IHdhbnQKLQkgKiB0aGlzIGRpZmZlcmVudCBmb3IgdHlwZXMgbGlrZSBqc3YgKGpzcCBmb3Igdm9pY2UgeG1sKSBGb3Igbm93LCBoYXJkCi0JICogY29kZSB0byBuZXcgaW5zdGFuY2UuIEluIGZ1dHVyZSwgc2hvdWxkIGdldCBpbnN0YW5jZSBmcm9tIHJlZ2lzdHJ5LgotCSAqIAotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSFRNTCBhcyB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCi0JCVN0cmluZyBtaW1lVHlwZSA9IG51bGw7Ci0JCS8vIGRlZmF1bHQgZW1iZWRkZWQgdHlwZSBmb3IgZnJhZ21lbnRzCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJbWltZVR5cGUgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBmaWxlLCB0cnVlKTsKLQkJCX0KLQkJfQotCQltaW1lVHlwZSA9IG1pbWVUeXBlID09IG51bGwgPyBnZXREZWZhdWx0TWltZVR5cGUoKSA6IG1pbWVUeXBlOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IobWltZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJU3RydWN0dXJlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbCBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKiAKLQkgKiBJZiB0aGUgcGFyc2VyIGlzIHRvIGhhbmRsZSB0YWcgbGlicmFyaWVzLCBpdCBtdXN0IGhhdmUgYSBUYWdsaWJTdXBwb3J0Ci0JICogb2JqZWN0IHdpdGggYSB2YWxpZCBVUklSZXNvbHZlciBhbmQgdGhpcyBJU3RydWN0dXJlZERvY3VtZW50IGF0dGFjaGVkCi0JICogdG8gaXQgYmVmb3JlIHRoZSBjb250ZW50cyBhcmUgc2V0IG9uIHRoZSBJU3RydWN0dXJlZERvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgSlNQUmVQYXJzZXIoKSk7Ci0JCS8vIHN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKG5ldwotCQkvLyBKU1BKYXZhRG9jdW1lbnRQYXJ0aW9uZXIoKSk7Ci0JCS8vIGV2ZW4gdGhvdWdoIHRoaXMgaXMgYW4gImVtcHR5IG1vZGVsIiAuLi4gd2Ugd2FudCBpdCB0byBoYXZlIGF0Ci0JCS8vIGxlYXN0IHRoZQotCQkvLyBkZWZhdWx0IGVtYmVkZGVkZWQgY29udGVudCB0eXBlIGhhbmRsZXIKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKG51bGwpOwotCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBMb2FkZXIKLQkJLy8gd2lsbCBuZWVkIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBwYXJzZXIKLQkJLy8gYmFzZWQgb24gImVtYmVkZGVkIGNvbnRlbnQiCi0JCXJldHVybiBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vCi0JCS8vIGRvY3VtZW50IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciB0aGlzIHRvCi0JCS8vIHdvcmsuCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkvLyBUaGlzICdnZXQnIGNhdXNlcyBmaXJzdCB0byBiZSBiZSBhdHRhY2hlZC4KLQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gbWF5IG1ha2UgdGhpcyBlYXNpZXIgdG8gdXNlIGluIGZ1dHVlCi0JCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KCkpOwotCQlpZiAoRGVidWcuZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMpIHsKLQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgRGVidWdBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQkvLyBGb3IgSlNQcywgdGhlIE1vZGVsUXVlcnlBZGFwdGVyIG11c3QgYmUgImF0dGFjaGVkIiB0byB0aGUgZG9jdW1lbnQKLQkJLy8gYmVmb3JlIGNvbnRlbnQgaXMgc2V0IGluIHRoZSBtb2RlbCwgc28gdGFnbGliIGluaXRpemF0aW9uIGNhbgotCQkvLyB0YWtlIHBsYWNlLgotCQkoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJLy8KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQkvLwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBJSlNQSGVhZENvbnRlbnREZXRlY3RvciBnZXRIZWFkUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCX0KLQotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oSURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRJbnB1dFN0cmVhbSBpbiA9IG5ldyBEb2N1bWVudElucHV0U3RyZWFtKGRvYyk7Ci0JCXJldHVybiBnZXRDb250ZW50RGVzY3JpcHRpb24oaW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBmaWxlUGF0aAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24sIG9yIG51bGwgaWYgdGhlcmUncyBubyBidWZmZXIgZm9yIHRoZQotCSAqICAgICAgICAgZmlsZXBhdGgKLQkgKi8KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBmaWxlUGF0aCkgewotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlJVGV4dEZpbGVCdWZmZXIgYnVmID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuZ2V0VGV4dEZpbGVCdWZmZXIobmV3IFBhdGgoZmlsZVBhdGgpKTsKLQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQlkb2MgPSBidWYuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gKGRvYyAhPSBudWxsKSA/IGdldENvbnRlbnREZXNjcmlwdGlvbihkb2MpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBBc3N1bWVzIGl0J3MgSlNQCi0JICogY29udGVudC4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gd2hlbiBmaW5pc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiBAcmV0dXJuIHRoZSBJQ29udGVudERlc2NyaXB0aW9uIGZvciBpbiwgb3IgbnVsbCBpZiBpbiBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudERlc2NyaXB0aW9uIGdldENvbnRlbnREZXNjcmlwdGlvbihJbnB1dFN0cmVhbSBpbikgewotCi0JCWlmIChpbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKLQkJdHJ5IHsKLQotCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCQlkZXNjID0gY29udGVudFR5cGVKU1AuZ2V0RGVzY3JpcHRpb25Gb3IoaW4sIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2M7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0TGFuZ3VhZ2UuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYW5ndWFnZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBmaXJzdCBjaGVjayB0aGUgbW9kZWwgKGRvY3VtZW50IGl0c2VsZikgdG8gc2VlIGlmIGNvbnRhaW5zCi0JCXJlc3VsdCA9IGdldExhbmd1YWdlRnJvbVN0cnVjdHVyZWREb2N1bWVudChtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIE5vdGU6IGlmIG1vZGVsIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkCi0JCS8vIGxhbmd1YWdlLCB3ZSdsbCBldmVuIHJldHVybiBpdCwKLQkJLy8gc2luY2Ugd2hvIGtub3dzIHdoYXQgZnV0dXJlIGhvbGRzLgotCi0JCS8vIGdldCBkZWZhdWx0IGxhbmd1YWdlIHNwZWNpZmllZCBpbiBwcm9wZXJ0aWVzIHBhZ2UKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCQlyZXN1bHQgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBmaWxlLCB0cnVlKTsKLQotCQkvLyBhbHdheXMgcmV0dXJuIHNvbWV0aGluZwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IERFRkFVTFRfTEFOR1VBR0U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlRnJvbVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGJhc2NpYWxseSBzYW1lIGFsZ29yaXRobSBhcyBnZXQgZW5jb2Rpbmcgb3IKLQkJLy8gZ2V0IGNvbnRlbnQgdHlwZSBmcm9tIHN0cnVjdHVyZWREb2N1bWVudC4KLQkJSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgbG9jYWxIZWFkUGFyc2VyID0gZ2V0SGVhZFBhcnNlcigpOwotCQkvLyB3ZSBjYW4gYmUgYXNzdXJlZCB0aGF0IGl0cyBhbHJlYWR5IGJlZW4KLQkJLy8gcGFyc2VkLiBJZiBub3QgY2FsbCBwYXJzZUhlYWRlckZvclBhZ2VEaXJlY3RpdmUoKQotCQkvLyBiZWZvcmUgY2FsbGluZyBnZXRMYW5ndWFnZTsKLQkJbG9jYWxIZWFkUGFyc2VyLnNldChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gbG9jYWxIZWFkUGFyc2VyLmdldExhbmd1YWdlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUKLQkJCS8vIFRPRE8gbmVlZCB0byByZWNvbnNpZGVyIGRlc2lnbiB0byBhdm9pZAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyAicmVpbml0aWFsaXplIiBzaW5jZSB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IHRoZQotCSAqIGRlZmF1bHQgb25lIGFzc2lnbmVkLCBiZWZvcmUgd2Ugc3RhcnQgY2hlY2tpbmcgdGhlIHN0cmVhbQotCSAqLwotCXByaXZhdGUgdm9pZCByZUluaXRpYWxpemVFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRFbWJlZGRlZENvbnRlbnRUeXBlLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUpIHsKLQkJLy8gY2hlY2sgcHJvZ3JhbSBsb2dpYwotCQlBc3NlcnQuaXNOb3ROdWxsKG9sZEVtYmVkZGVkQ29udGVudFR5cGUsICJQcm9ncmFtIGVycm9yOiBpbnZhbGlkIGNhbGwgZHVyaW5nIG1vZGVsIGluaXRpYWxpemF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb25jZSB3ZSBrbm93IHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUsIHdlIG5lZWQgdG8gc2V0IGl0IGluIHRoZQotCQkvLyBQYWdlRGlyZWN0aXZlQWRhcHRlciAuLi4gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNyaXRpY2FsIGhlcmUsIHRoZSBkb2MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYnV0IGl0cyBjb250ZW50cyBub3QKLQkJLy8gc2V0IHlldCwKLQkJLy8gYW5kIGFsbCBmYWN0b3JpZXMgbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGFsc28uCi0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0RXhpc3RpbmdBZGFwdGVyKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIFByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpCi0JCS8vIGRvY3VtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIE1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpCi0JCS8vIGRvY3VtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyBzaW5jZSAnZG9jdW1lbnQnIGlzIG5vdCByZWNyZWF0ZWQgaW4gdGhpcwotCQkvLyByZWluaXQgcGF0aCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIGFkYXB0ZXJzLAotCQkvLyBleGNlcHQgZm9yIHRoZSBwcm9wYWdhdGVkIGFkYXB0ZXJzIChpbmNsdWRpbmcgcGFnZQotCQkvLyBkaXJlY3RpdmUgYWRhcHRlciwgYW5kIG1vZGVsIHF1ZXJ5IGFkYXB0ZXIpLgotCQkvLyB0byBhY2NvbXBsaXNoIHRoaXMsIHdlJ2xsIGp1c3QgcmVtb3ZlIGFsbCwgdGhlbgotCQkvLyBhZGQgYmFjayB3aXRoIGEgY2FsbCB0byBwcmUtbG9hZCBhZGFwdC4KLQkJLy8gbGV0IGNsaWVudHMgZGVjaWRlIHRvIHVubG9hZCBhZGFwdGVycyBmcm9tIGRvY3VtZW50Ci0JCS8vIENvbGxlY3Rpb24gb2xkQWRhcHRlcnMgPSBkb2N1bWVudC5nZXRBZGFwdGVycygpOwotCQkvLyBJdGVyYXRvciBvbGRBZGFwdGVyc0l0ZXJhdG9yID0gb2xkQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJLy8gd2hpbGUgKG9sZEFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCS8vIElOb2RlQWRhcHRlciBvbGRBZGFwdGVyID0gKElOb2RlQWRhcHRlcikKLQkJLy8gb2xkQWRhcHRlcnNJdGVyYXRvci5uZXh0KCk7Ci0JCS8vIGlmIChvbGRBZGFwdGVyICE9IHBhZ2VEaXJlY3RpdmVBZGFwdGVyICYmIG9sZEFkYXB0ZXIgIT0KLQkJLy8gcHJvcGFnYXRpbmdBZGFwdGVyICYmIG9sZEFkYXB0ZXIgIT0gbW9kZWxRdWVyeUFkYXB0ZXIpIHsKLQkJLy8gLy8gRE8gTk9UIHJlbW92ZSBkaXJlY3RseSEKLQkJLy8gLy8gY2FuIGNoYW5nZSBjb250ZW50cyB3aGlsZSBpbiBub3RpZml0eSBsb29wIQotCQkvLyAvL29sZEFkYXB0ZXJzSXRlcmF0b3IucmVtb3ZlKCk7Ci0JCS8vIGRvY3VtZW50LnJlbW92ZUFkYXB0ZXIob2xkQWRhcHRlcik7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBETVc6IEkgYmVsaWV2ZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGlzIG5lZWRlZCwKLQkJLy8gc2luY2UgcmVsZWFzZXMgY2FjaGVkIGFkYXB0ZXJzCi0JCS8vIGlmIChkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50SW1wbCkgewotCQkvLyAoKERvY3VtZW50SW1wbCkgZG9jdW1lbnQpLnJlbGVhc2VEb2N1bWVudFR5cGUoKTsKLQkJLy8gKChEb2N1bWVudEltcGwpIGRvY3VtZW50KS5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJLy8gfQotCQkvLyByZW1lbWJlciwgZW1iZWRkZWQgdHlwZSBmYWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB3aGVuCi0JCS8vIGVtYmVkZWRUeXBlIGNoYW5nZWQKLQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKG5ld0VtYmVkZGVkQ29udGVudFR5cGUpOwotCQkvLyAvLyBidXQgc3RpbGwgbmVlZCB0byBjbGVhciB0aGUgcGFnZSBkaXJlY3RpdmUgd2F0Y2hlcnMsIGFuZCBsZXQKLQkJLy8gdGhlbSBiZSByZWRpc2NvdmVyZWQgKHdpdGggbmV3LCBhY2N1cmF0ZSBub2RlIGFzIHRhcmdldCkKLQkJLy8gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xlYXJQYWdlV2F0Y2hlcnMoKTsKLQkJaWYgKG5ld0VtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCi0JCQkvLyBuZWVkIHRvIG51bGwgb3V0IG9yIGVsc2UgTW9kZWxQYXJzZXJBZGFwdGVyCi0JCQkvLyB3b24ndCBnZXQgcmVpbml0aWFsaXplZAotCQkJKChET01Nb2RlbEltcGwpIG1vZGVsKS5zZXRNb2RlbFBhcnNlcihudWxsKTsKLQotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQotCQkJLy8gcGFydGl0aW9uZXIgc2V0dXAgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgbG9hZGVyCi0JCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBkb2N1bWVudFBhcnRpdGlvbmVyID0gc3RydWN0dXJlZERvY3VtZW50LmdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCS8vIElTU1VFOiB0aGlzIGxvZ2ljIGlzIGZsYXdlZCwgbm90IHN1cmUgb2Ygb3JpZ2luYWwgaW50ZW50LCBidXQKLQkJCS8vIGFkZGVkIG51bGwvdHlwZSBjaGVja3MgZm9yIHNhZmV0eS4KLQkJCWlmIChkb2N1bWVudFBhcnRpdGlvbmVyICE9IG51bGwgJiYgZG9jdW1lbnRQYXJ0aXRpb25lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIHsKLQkJCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZS5nZXRGYW1pbHlJZCgpLmVxdWFscyhDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKSkgewotCQkJCQkoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIGRvY3VtZW50UGFydGl0aW9uZXIpLnNldEVtYmVkZGVkUGFydGl0aW9uZXIobmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5ld0VtYmVkZGVkQ29udGVudFR5cGUuZ2V0RmFtaWx5SWQoKS5lcXVhbHMoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKSkgewotCQkJCQkoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIGRvY3VtZW50UGFydGl0aW9uZXIpLnNldEVtYmVkZGVkUGFydGl0aW9uZXIobmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBhZGRpbmcgbGFuZ3VhZ2UgaGVyZSwgaW4gdGhpcyBjb252aWVuZW50IGNlbnRyYWwKLQkJLy8gbG9jYXRpb24sIGJ1dCBzb21lIG9idmlvdXMgcmVuYW1pbmcgb3IgcmVmYWN0b3JpbmcKLQkJLy8gd291bGRuJ3QgaHVydCwgaW4gZnV0dXJlLgotCQkvLyBJIG5lZWRlZCB0byBhZGQgdGhpcyBsYW5ndWFnZSBzZXR0aW5nIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydAotCQkvLyBOb3RlOiB0aGlzIGlzIHRoZSBvbmUgdGhhdCBjb3VudHMsIHNpbmNlIGF0IHRoaXMgcG9pbnQsCi0JCS8vIHRoZSBtb2RlbCBoYXMgYW4gSUQsIHNvIHdlIGNhbiBsb29rIHVwIElGaWxlLCBldGMuCi0JCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1vZGVsKTsKLQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkRW1iZWRkZWRDb250ZW50VHlwZSwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKSB7Ci0JCS8vIGNoZWNrIHByb2dyYW0gbG9naWMKLQkJQXNzZXJ0LmlzTm90TnVsbChvbGRFbWJlZGRlZENvbnRlbnRUeXBlLCAiUHJvZ3JhbSBlcnJvcjogaW52YWxpZCBjYWxsIGR1cmluZyBtb2RlbCBpbml0aWFsaXphdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIG9uY2Ugd2Uga25vdyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLCB3ZSBuZWVkIHRvIHNldCBpdCBpbiB0aGUKLQkJLy8gUGFnZURpcmVjdGl2ZUFkYXB0ZXIgLi4uIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbiBpcwotCQkvLyBjcml0aWNhbCBoZXJlLCB0aGUgZG9jIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGJ1dCBpdHMgY29udGVudHMgbm90Ci0JCS8vIHNldCB5ZXQsCi0JCS8vIGFuZCBhbGwgZmFjdG9yaWVzIG11c3QgaGF2ZSBiZWVuIHNldCB1cCBhbHNvLgotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIE1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJLy8gYmVjYXVzZSwgZXZlbiBpbiB0aGUgY2xvbmUgY2FzZSwgdGhlIG1vZGVsIGhhcyBiZWVuIHBhcml0YWxseQotCQkvLyBpbnRpYWxpemVkIHdpdGgKLQkJLy8gdGhlIG9sZCBlbWJlZGRlZCB0eXBlIChkdXJpbmcgY3JlYXRlTW9kZWwpLCB3ZSBuZWVkIHRvIHVuaXRpYWxpemUKLQkJLy8gcGFydHMgb2YgaXQsIGJhc2VkIG9uIHRoZSBvbGQgKG9yIGRlZmF1bHQpIG9uZXMKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJLy8gcmVtZW1iZXIsIGVtYmVkZGVkIHR5cGUgZmFjdG9yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgd2hlbgotCQkvLyBlbWJlZGVkVHlwZSBjaGFuZ2VkCi0JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShuZXdFbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJaWYgKG5ld0VtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJfQotCQkvLyBhZGRpbmcgbGFuZ3VhZ2UgaGVyZSwgaW4gdGhpcyBjb252aWVuZW50IGNlbnRyYWwKLQkJLy8gbG9jYXRpb24sIGJ1dCBzb21lIG9idmlvdXMgcmVuYW1pbmcgb3IgcmVmYWN0b3JpbmcKLQkJLy8gd291bGRuJ3QgaHVydCwgaW4gZnV0dXJlLgotCQkvLyBJIG5lZWRlZCB0byBhZGQgdGhpcyBsYW5ndWFnZSBzZXR0aW5nIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydAotCQkvLyBOb3RlOiB0aGlzIGlzIHRoZSBvbmUgdGhhdCBjb3VudHMsIHNpbmNlIGF0IHRoaXMgcG9pbnQsCi0JCS8vIHRoZSBtb2RlbCBoYXMgYW4gSUQsIHNvIHdlIGNhbiBsb29rIHVwIElGaWxlLCBldGMuCi0JCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1vZGVsKTsKLQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJRG9jdW1lbnQgZG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2MpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkSGFuZGxlciA9IHBhZ2VEaXJlY3RpdmVBZGFwdGVyLmdldEVtYmVkZGVkVHlwZSgpOwotCQlyZXR1cm4gZW1iZWRkZWRIYW5kbGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGVQcmUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCS8vIG5vdGU6IHRoaXMgd2lsbCBjdXJyZW50bHkgb25seSB3b3JrIGZvciBtb2RlbHMgYmFja2VkIGJ5IGZpbGVzCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSA9IG51bGw7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCi0JCVN0cmluZyBwb3NzaWJsZUZpbGVCYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjID0gZ2V0Q29udGVudERlc2NyaXB0aW9uKHBvc3NpYmxlRmlsZUJhc2VMb2NhdGlvbik7Ci0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCU9iamVjdCBwcm9wID0gbnVsbDsKLQkJCXByb3AgPSBkZXNjLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSk7Ci0JCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJZW1iZWRkZWRDb250ZW50VHlwZSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3IoKFN0cmluZykgcHJvcCk7Ci0JCQl9Ci0JCX0KLQotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0KLQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVzZSBkZWZhdWx0IGVtYmVkZGVkVHlwZSBpZiBpdCBjb3VsZG4ndCBkZXRlcm1pbmUgb25lCi0JCQllbWJlZGRlZENvbnRlbnRUeXBlID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShtb2RlbCk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUoZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQllbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVBvc3QoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkvLyBzaG91bGQgYWxyZWFkeSBiZSBpbml0aWFsaXplZCAoZnJvbSBpbml0RW1iZWRkZWRUeXBlUHJlKQotCQkvLyB2aWEgSUNvbnRlbnREZXNjcmlwdGlvbgotCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZXhpc3RpbmdFbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUob2xkTW9kZWwpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUgPSBleGlzdGluZ0VtYmVkZGVkVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlpZiAoZXhpc3RpbmdFbWJlZGRlZFR5cGUgPT0gbnVsbCkgewotCQkJaW5pdEVtYmVkZGVkVHlwZVByZShuZXdNb2RlbCk7Ci0JCQlpbml0RW1iZWRkZWRUeXBlUG9zdChuZXdNb2RlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpbml0RW1iZWRkZWRUeXBlKG5ld01vZGVsKTsKLQkJCWluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKG5ld01vZGVsLCBleGlzdGluZ0VtYmVkZGVkVHlwZSwgbmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShuZXdNb2RlbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCWlmIChuZXdNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG5ld01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobmV3TW9kZWwpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyID0gbnVsbDsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdIYW5kbGVyID0gbnVsbDsKLQkJT2JqZWN0IHJlaW5pdFN0YXRlRGF0YSA9IG1vZGVsLmdldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YSgpOwotCQlpZiAocmVpbml0U3RhdGVEYXRhIGluc3RhbmNlb2YgRW1iZWRkZWRUeXBlU3RhdGVEYXRhKSB7Ci0JCQlFbWJlZGRlZFR5cGVTdGF0ZURhdGEgb2xkU3RhdGVEYXRhID0gKEVtYmVkZGVkVHlwZVN0YXRlRGF0YSkgcmVpbml0U3RhdGVEYXRhOwotCQkJb2xkSGFuZGxlciA9IG9sZFN0YXRlRGF0YS5nZXRPbGRIYW5kbGVyKCk7Ci0JCQluZXdIYW5kbGVyID0gb2xkU3RhdGVEYXRhLmdldE5ld0hhbmRsZXIoKTsKLQkJCS8vIG5vdGUuIFdlIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIG5ldyBoYW5kbGVyIGluIHRoZSBtb2RlbCdzCi0JCQkvLyAoZG9jdW1lbnRzKSBhZGFwdGVycywKLQkJCS8vIHNvIG5lZWQgbmVlZCB0byB1c2UgdGhlIG9sZCBvbmUgdG8gdW5kbyB0aGUgb2xkIHN0YXRlIGRhdGEKLQkJCXJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShtb2RlbCwgb2xkSGFuZGxlciwgbmV3SGFuZGxlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBmb3IgbGFuZ3VhZ2UgLi4uIHdlIHNvbWVkYXkgTUlHSFQgaGF2ZSB0byBkbyBzb21ldGhpbmcKLQkJCS8vIGhlcmUsIGJ1dCBmb3Igbm93LCB3ZSBkb24ndCBoYXZlIGFueSBtb2RlbC1zaWRlIGxhbmd1YWdlCi0JCQkvLyBzZW5zaXRpdmUgYWRhcHRlcnMuCi0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlaW5pdGlhbGl6ZShtb2RlbCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYW4gSW5wdXRTdHJlYW0gaGFzIG1hcmsvcmVzZXQgc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsLm1hcmtTdXBwb3J0ZWQoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG9yaWdpbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldEJ5dGVzKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgbWF4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gc21hbGxCdWZmZXIgPSBuZXcgYnl0ZVttYXhdOwotCQlieXRlW10gcmV0dXJuQnVmZmVyID0gbnVsbDsKLQkJaW50IG5SZWFkID0gaW5wdXRTdHJlYW0ucmVhZChzbWFsbEJ1ZmZlciwgMCwgbWF4KTsKLQkJaWYgKG5SZWFkIDwgbWF4KSB7Ci0JCQkvLyBlbXB0eSBmaWxlIHdpbGwgcmV0dXJuIC0xOwotCQkJaWYgKG5SZWFkIDwgMCkKLQkJCQluUmVhZCA9IDA7Ci0JCQlieXRlW10gc21hbGxlckJ1ZmZlciA9IG5ldyBieXRlW25SZWFkXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc21hbGxCdWZmZXIsIDAsIHNtYWxsZXJCdWZmZXIsIDAsIG5SZWFkKTsKLQkJCXJldHVybkJ1ZmZlciA9IHNtYWxsZXJCdWZmZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm5CdWZmZXIgPSBzbWFsbEJ1ZmZlcjsKLQkJfQotCQlyZXR1cm4gcmV0dXJuQnVmZmVyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHN1cGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJLy8gSW4gdGhpcyAiY2xvbmUgbW9kZWwiIGNhc2UsIHdlIGNyZWF0ZSBhIE1vZGVsUXVlcnkgYWRhcHRlcgotCQkvLyBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSB0aGUgb2xkIGRhdGEuIE5vdGU6IEkgdGhpbmsgdGhpcwotCQkvLyAiZm9yY2VkIGZpdCIgb25seSB3b3JrcyBoZXJlIHNpbmNlIHRoZSBpbXBsaW1lbnRhaXRvbiBvZgotCQkvLyBNb2RlbFF1ZXJ5QWRhdHBlciBkb2VzIG5vdAotCQkvLyBoYXZlIHRvIGJlIHJlbGVhc2VkLgotCi0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobW9kZWwpOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXIgPSBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihvbGRNb2RlbCk7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlkb2N1bWVudC5hZGRBZGFwdGVyKG5ldyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwobW9kZWxRdWVyeUFkYXB0ZXIuZ2V0Q01Eb2N1bWVudENhY2hlKCksIG1vZGVsUXVlcnlBZGFwdGVyLmdldE1vZGVsUXVlcnkoKSwgbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0SWRSZXNvbHZlcigpKSk7Ci0KLQkJfQotCi0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbFF1ZXJ5QWRhcHRlciBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQ1NWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSlNQVGFnTmFtZShKU1BTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZTAyYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwgewotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKGNtRG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjEyNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWxRdWVyeUNNUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIobmV3IEpTUE1vZGVsUXVlcnlDTVByb3ZpZGVyKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgzNjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4gb3IgbnVsbCBpZiBubwotCSAqIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpIHsKLQkJQ01Eb2N1bWVudCBqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0KLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQotCQkJCS8vIHRlc3QgdG8gc2VlIGlmIHRoaXMgbm9kZSBiZWxvbmdzIHRvIEpTUCdzIENNRG9jdW1lbnQgKGNhc2UKLQkJCQkvLyBzZW5zaXRpdmUpCi0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBqY21kb2MuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCQkJCWlmIChkZWMgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBqY21kb2M7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgcHJlZml4ID0gbm9kZS5nZXRQcmVmaXgoKTsKLQotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJLy8gY2hlY2sgcG9zaXRpb24gZGVwZW5kZW50Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQlUTERDTURvY3VtZW50TWFuYWdlciB0bGRtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHhtbE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCWlmICh0bGRtZ3IgIT0gbnVsbCkgewotCQkJCQlMaXN0IGRvY3VtZW50cyA9IHRsZG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnMobm9kZS5nZXRQcmVmaXgoKSwgeG1sTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJLy8gdGhlcmUgc2hvdWxkbid0IGJlIG1vcmUgdGhhbiBvbmUgY21kb2N1bWVudCByZXR1cm5lZAotCQkJCQlpZiAoZG9jdW1lbnRzICE9IG51bGwgJiYgZG9jdW1lbnRzLnNpemUoKSA+IDApCi0JCQkJCQlyZXN1bHQgPSAoQ01Eb2N1bWVudCkgZG9jdW1lbnRzLmdldCgwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZjI5ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwganNwTW9kZWwgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBlbWJlZGRlZE1vZGVsUXVlcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHVibGljIEpTUE1vZGVsUXVlcnlJbXBsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBKU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcigpKTsKLQkJanNwTW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kZWxRdWVyeSNnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50KQotCSAqLwotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShlbGVtZW50KTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kZWxRdWVyeSNnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlKQotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlDTURvY3VtZW50IGRvYyA9IHN1cGVyLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkobm9kZSk7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCWRvYyA9IHF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsUXVlcnkjZ2V0Q01Ob2RlKE5vZGUpCi0JICovCi0JcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKSB7Ci0JCUNNTm9kZSByZXN1bHQgPSBzdXBlci5nZXRDTU5vZGUobm9kZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShub2RlKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVlcnkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlQ29udGVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMpIHsKLQkJTW9kZWxRdWVyeSBlbXEgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoZWxlbWVudCk7Ci0JCWlmIChlbXEgIT0gbnVsbCkKLQkJCXJldHVybiBlbXEuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCX0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldEVtYmVkZGVkTW9kZWxRdWVyeShOb2RlIG5vZGUpIHsKLQkgICAgTW9kZWxRdWVyeSBlbXEgPSBudWxsOwotCQkgICAKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCU5vZGUgb3duZXJOb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4gbXVzdCBiZSB0aGUgZG9jdW1lbnQgaXRzZWxmCi0JCQkJCW93bmVyTm9kZSA9IG5vZGU7Ci0JCQkJfQotCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHR5cGVhZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyTm9kZSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKHR5cGVhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkgICAgCi0JCQkJICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHR5cGVhZGFwdGVyLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJICAgIE9iamVjdCBvID0gZW1iZWRkZWRNb2RlbFF1ZXJpZXMuZ2V0KGNvbnRlbnRUeXBlKTsKLQkJCQkgICAgaWYobyA9PSBudWxsKSB7Ci0JCQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBlbWJlZGRlZEFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpIHR5cGVhZGFwdGVyLmFkYXB0KChJTm9kZU5vdGlmaWVyKSBub2RlLCBNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoZW1iZWRkZWRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCSAgICAvLyB3ZSB3aWxsIGNhY2hlIG9uZSBtb2RlbCBxdWVyeSBwZXIgY29udGVudCB0eXBlCi0JCQkJCQkgICAgZW1xID0gZW1iZWRkZWRBZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsKLQkJCQkJCSAgICBlbWJlZGRlZE1vZGVsUXVlcmllcy5wdXQoY29udGVudFR5cGUsIGVtcSk7Ci0JCQkJCQl9Ci0JCQkJICAgIH0KLQkJCQkJZWxzZSB7Ci0JCQkJCSAgICBlbXEgPSAoTW9kZWxRdWVyeSlvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVtcTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeSNnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKG9yZy53M2MuZG9tLkF0dHIpCi0JICovCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpIHsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoYXR0cik7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1ZXJ5LmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I3MjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5YTUxDYXRhbG9nSWRSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIHN0YXRlTm90aWZpZXIgPSBudWxsOwotCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCgpIHsKLQkJdGhpcyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoT2JqZWN0IGtleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGtleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCi0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuY3JlYXRlQWRhcHRlciIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgPT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkvLyBjb250aW51ZSBvbmx5IGlmIHRoZSBsb2NhdGlvbiBpcyBrbm93bgotCQkJCWlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSA9IG5ldyBDTURvY3VtZW50Q2FjaGUoKTsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpLnRvRmlsZSgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCQkJSVBhdGggZGVyaXZlZFBhdGggPSBudWxsOwotCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQlkZXJpdmVkUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkZXJpdmVkUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQoYmFzZVBhdGgpOwotCQkJCQkJaWYgKGRlcml2ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBkZXJpdmVkUGF0aC50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbW9kZWwuZ2V0UmVzb2x2ZXIoKSk7Ci0KLQkJCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gbmV3IEpTUE1vZGVsUXVlcnlJbXBsKG1vZGVsLCByZXNvbHZlcik7Ci0JCQkJCW1vZGVsUXVlcnkuc2V0RWRpdE1vZGUoTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRCk7Ci0JCQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbCA9IG5ldyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwoY21Eb2N1bWVudENhY2hlLCBtb2RlbFF1ZXJ5LCByZXNvbHZlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsLAotCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkvLyBpZiBvbGRNb2RlbCAhPSBuZXdNb2RlbCwgYmFkIHRoaW5ncyBtaWdodCBoYXBwZW4gd2l0aCB0aGUgYWRhcHRlcgotCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJc3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQl1cGRhdGVSZXNvbHZlcihzdGF0ZU5vdGlmaWVyKTsKLQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWlmIChzdGF0ZU5vdGlmaWVyICE9IG51bGwpIHsKLQkJCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXN0YXRlTm90aWZpZXIgPSBudWxsOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsICE9IG51bGwpIHsKLQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXVwZGF0ZVJlc29sdmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMmM0OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQuWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQkvKioKLQkgKiBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIFRoaXMgaXMgYSBsYW5ndWFnZSBzcGVjaWZpYyBtZXRob2QgKGUuZy4gSFRNTCwgSmF2YSwgUHJvbG9nLCBldGMuKSBzbwotCS8vIGNvdWxkL3Nob3VsZCBiZSBtYWRlIGNvbmZpZ3VyYWJsZS4KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDYzNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUFJlUGFyc2VyIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JLyoqCi0JICogQWxsb3cgYSByZXBhcnNlciB0byBjaGVjayBmb3IgZXh0cmEgc3ludGFjdGljIGNhc2VzIHRoYXQgcmVxdWlyZQotCSAqIHBhcnNpbmcgYmV5b25kIHRoZSBmbGF0Tm9kZSBib3VuZGFyeS4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgSlNQIGxhbmd1YWdlIG1hcmtlcnMgKGNvbW1lbnRzIGFyZSBoYW5kbGVkCi0JICogZWxzZXdoZXJlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpOwotCQkvLyBOb25lIG9mIHRoZSBzdXBlcmNsYXNzJyBjYXNlcyB3ZXJlIHZhbGlkLCBzbyBjaGVjayBmb3IgSlNQIGNhc2VzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JKU1AoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEEgY2hhbmdlIHRvIGEgSlNQIHRhZyBjYW4gcmVzdWx0IGluIGFsbCBiZWluZyByZXBhcnNlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9ySlNQKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlPSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlISIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIiU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIGEgY29tbWVudCBzdGFydCBvciBlbmQgdGFnIGlzIGJlaW5nIGFkZGVkIG9yIGRlbGV0ZWQsIHdlJ2xsIHJlc2NhbgotCSAqIHRoZSB3aG9sZSBkb2N1bWVudC4gVGhlIHJlYXNvbiBpcyB0aGF0IGNvbnRlbnQgdGhhdCBpcyByZXZlYWxlZCBvcgotCSAqIGNvbW1lbnRlZCBvdXQgY2FuIGVmZmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlc3Qgb2YgdGhlCi0JICogZG9jdW1lbnQuIE5vdGU6IGZvciBub3cgdGhpcyBpcyB2ZXJ5IFhNTC9KU1Agc3BlY2lmaWMsIGNhbgotCSAqIHJlZmFjdG9yL2ltcHJvdmUgbGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ29tbWVudHMoKSB7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDb21tZW50cygpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCItLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gd2UnbGwgYWxzbyBjaGVjayBmb3IgdGhlc2UgZGVnZW5lcmF0ZSBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JS0tLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBjb3JlIHJlcGFyc2luZyBtZXRob2QgLi4uIGFmdGVyIHRoZSBkaXJ0eSBzdGFydCBhbmQgZGlydHkgZW5kIGhhdmUKLQkgKiBiZWVuIGNhbGN1bGF0ZWQgZWxzZXdoZXJlLiAtIHRoaXMgbWV0aG9kIG92ZXJyaWRlcywgZG9lcyBub3QgZXh0ZW5kCi0JICogc3VwZXIncyBtZXRob2QuIGNoYW5nZXMvZml4ZXMgdG8gc3VwZXIgbWF5IGhhdmUgdG8gYmUgbWFkZSBoZXJlIGFzCi0JICogd2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHJlc2NhblN0YXJ0ID0gLTE7Ci0JCWludCByZXNjYW5FbmQgPSAtMTsKLQkJYm9vbGVhbiBmaXJzdFRpbWUgPSBmYWxzZTsKLQkJYm9vbGVhbiBkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gZmFsc2U7Ci0KLQkJLy8KLQkJLy8gInNhdmUiIHRoZSBvbGROb2RlcyAodGhhdCBtYXkgYmUgcmVwbGFjZWQpIGluIGEgbGlzdAotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCi0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSB8fCBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXBhcnNlOiBpcyB0YWdsaWIgb3IgaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gdHJ1ZTsKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJY2xlYXJUYWdsaWJJbmZvKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZGlydHlTdGFydCA9PSBudWxsIHx8IGRpcnR5RW5kID09IG51bGwpIHsKLQkJCS8vIGRpcnR5U3RhcnQgb3IgZGlydHkgZW5kIGFyZSBudWxsLCB0aGVuIHRoYXQgbWVhbnMgd2UgZGlkbid0Ci0JCQkvLyBoYXZlIGEKLQkJCS8vIGNhY2hlZCBub2RlLCB3aGljaCBtZWFucyB3ZSBoYXZlIGFuIGVtcHR5IGRvY3VtZW50LCBzbyB3ZQotCQkJLy8ganVzdCBuZWVkIHRvIHJlc2NhbiB0aGUgY2hhbmdlcwotCQkJcmVzY2FuU3RhcnQgPSAwOwotCQkJcmVzY2FuRW5kID0gZkNoYW5nZXMubGVuZ3RoKCk7Ci0JCQlmaXJzdFRpbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCXJlc2NhblN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQkJLy8KLQkJCS8vIHNldCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJLy8gbm90aWNlIHdlIHVzZSB0aGUgc2FtZSByYXRpb25hbGUgYXMgZm9yIHRoZSByZXNjYW5TdGFydCwKLQkJCS8vIHdpdGggdGhlIGFkZGVkIGNhdmVhdCB0aGF0IGxlbmd0aCBoYXMgdG8gYmUgYWRkZWQgdG8gaXQsCi0JCQkvLyB0byBjb21wZW5zYXRlIGZvciB0aGUgbmV3IHRleHQgd2hpY2ggaGFzIGJlZW4gYWRkZWQgb3IgZGVsZXRlZC4KLQkJCS8vIElmIGNoYW5nZXMgaGFzIHplcm8gbGVuZ3RoLCB0aGVuICJsZW5ndGgiIHdpbGwgYmUgbmVnYXRpdmUsCi0JCQkvLyBzaW5jZQotCQkJLy8gd2UgYXJlIGRlbGV0aW5nIHRleHQuIE90aGVyd2lzZSwgdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJCS8vIHdoYXQncyBzZWxlY3RlZCB0byBiZSByZXBsYWNlZCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IHRleHQuCi0JCQlyZXNjYW5FbmQgPSBkaXJ0eUVuZC5nZXRFbmQoKSArIGZMZW5ndGhEaWZmZXJlbmNlOwotCQl9Ci0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgb2xkIHN0dWZmICJzYXZlZCIgYXdheSwgdXBkYXRlIHRoZSBkb2N1bWVudAotCQkvLyB3aXRoIHRoZSBjaGFuZ2VzLgotCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tIG5vdyB0aGUgcmVhbCB3b3JrCi0JCXJlc3VsdCA9IGNvcmVfcmVwYXJzZShyZXNjYW5TdGFydCwgcmVzY2FuRW5kLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJLy8KLQotCQkvLyBpZiB3ZSBkaWQgbm90IGRldGVjdCBhIGJyZWFraW5nIHR5cGUgb2YgY2hhbmdlIGF0IHRoZSBiZWdpbm5pbmcsCi0JCS8vIGJ1dAotCQkvLyBkbyBub3csIHRoZW4gcmVwYXJzZSBhbGwhIElmIHdlIGRpZCBkZXRlY3QgdGhlbSwgdGhlbiB3ZSBtYXkgb3IgbWF5Ci0JCS8vIG5vdCBkZXRlY3QgYWdhaW4sIGJ1dCBwcmVzdW1hYmx5IHdlJ3ZlIGFscmVhZHkgc2V0IHVwIHRvIHJlLXBhcnNlZAotCQkvLyBldmVydGhpbmcsIHNvIG5vIG5lZWQgdG8gZG8gYWdhaW4uCi0JCWlmICgoIWRldGVjdGVkQnJlYWtpbmdDaGFuZ2UpICYmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSkpIHsKLQkJCWNsZWFyVGFnbGliSW5mbygpOwotCQkJLy8gcmVwYXJzZSBhbGwKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKDAsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQl9Ci0KLQkJLy8gZXZlbnQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW5jYXNlIHRoZXJlIGlzCi0JCS8vIHNvbWUgb3B0aW1pemF0aW9uIHRoZXkgY2FuIGRvCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgY29udGFpbiByZWdpb25zIHRoYXQgY291bGQgYWx0ZXIgdGhlCi0JICogYmVoYXZpb3Igb2YgdGhlIHBhcnNlciBvciB0aGUgcGFyc2luZyBvZiBhcmVhcyBvdXRzaWRlIG9mIHRoZSByZWdpb25zCi0JICogZ2l2ZW4uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdDaGFuZ2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gaXNUYWdsaWJPckluY2x1ZGUobm9kZSwgcmVnaW9ucykgfHwgaXNKc3BSb290KHJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgcmVnaW9ucyB0b3VjaGVkIGJ5IGEKLQkgKiB0ZXh0IGNoYW5nZSBoYXZlOiAxKSAuLi5hbiBpbnNlcnRpb24gYXQgdGhlIHRleHRFbmRPZmZzZXQgb2YgYW4KLQkgKiBYTUxfVEFHX09QRU4gdGhhdCdzIGluIGl0J3Mgb3duIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIHByZWNlZGVkCi0JICogYnkgYW4gdW5lbmRlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIDIpIC4uLmEgZGVsZXRpb24gaGFwcGVuaW5nIGluCi0JICogYW4gWE1MX0VNUFRZX1RBR19DTE9TRSB0aGF0IGVuZHMgYSBJVGV4dFJlZ2lvbkNvbnRhaW5lciAzKSAuLi5hbgotCSAqIGluc2VydGlvbiBoYXBwZW5pbmcgd2l0aCBhICcgPCcgY2hhcmFjdGVyIHNvbWV3aGVyZSBpbiBhbiBYTUwgYXR0cmlidXRlCi0JICogbmFtZSBvciB2YWx1ZSA0KSAuLi5hIGRlbGV0aW9uIG9mIGEgbm9ybWFsIFhNTF9UQUdfQ0xPU0Ugc2luY2UKLQkgKiBzdWJzZXF1ZW50IHRhZ3MgYmVjb21lIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKi8KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhib29sZWFuIGNoYW5nZXNJbmNsdWRlQV9sdCwgYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gcGFyZW50LmdldFByZXZpb3VzKCk7Ci0JCS8vIGNhc2UgMSB0ZXN0Ci0JCWlmIChwYXJlbnQuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgKHByZXZpb3VzID09IG51bGwgfHwgKCFwcmV2aW91cy5pc0VuZGVkKCkgfHwgcHJldmlvdXMuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQkvLyBjYXNlIDIgdGVzdAotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uOwotCQkJSVRleHRSZWdpb24gaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFICYmIGNvbnRhaW5lci5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDIpCi0JCQkJaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDIpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGNhc2UgMyB0ZXN0Ci0JCWlmIChjaGFuZ2VzSW5jbHVkZUFfbHQgJiYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJLy8gY2FzZSA0IHRlc3QKLQkJaWYgKGRlbHNJbmNsdWRlQV9ndCAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgYQotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGluY2x1ZGVzIGEganNwOnJvb3QgdGFnCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSnNwUm9vdChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gcmVnaW9ucy5zaXplKCkgPiAxICYmIHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiByZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUU7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaW5jbHVkZXMgYSB2YWxpZCB0YWdsaWIgZGlyZWN0aXZlIG9yIGluY2x1ZGUKLQkgKiBkaXJlY3RpdmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUYWdsaWJPckluY2x1ZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlib29sZWFuIHNpemVBbmRUeXBlc01hdGNoID0gKHJlZ2lvbnMuc2l6ZSgpID4gMSkgJiYgKHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpICYmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTik7Ci0JCWlmICghc2l6ZUFuZFR5cGVzTWF0Y2gpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IG5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlyZXR1cm4gc2l6ZUFuZFR5cGVzTWF0Y2ggJiYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEFHTElCKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklOQ0xVREUpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVGFnbGliSW5mbygpIHsKLQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJpbmcgdGFnbGliIGluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikKLQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBwYXJzZXIpLnJlc2V0SGFuZGxlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNCcmVha2luZ0NoYW5nZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBsaXN0KSB7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCWlmIChpc0JyZWFraW5nQ2hhbmdlKG5vZGUsIG5vZGUuZ2V0UmVnaW9ucygpKSkgewotCQkJCWNvbnRhaW5zID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IHN1cGVyLmZpbmREaXJ0eUVuZChlbmQpOwotCi0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiBpdHMgbm90IG51bGwKLQotCQkvLyBub3csIGlmIGFueSBvZiB0by1iZS1zY2FubmVkIGZsYXRub2RlcyBhcmUgdGhlIHN0YXJ0IG9mIGEganNwCi0JCS8vIHJlZ2lvbiwgd2UnbGwKLQkJLy8gcmVwYXJzZSBhbGwgdGhlIHdheSB0byB0aGUgZW5kLCB0byBiZSBzdXJlIHdlIGRldGVjdCBlbWJlZGRlZAotCQkvLyByZWdpb25zIChvciBub3QtZW1iZWRkZWQgcmVnaW9ucykgY29ycmVjdGx5LgotCQkvLyBub3RpY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBpZiB3ZSdyZSBvbmx5IHByb2Nlc3Npbmcgb25lIG5vZGUuCi0JCS8vIG5vdGljZSB0b28gd2UgaGF2ZSBhIHN0cm9uZyBhc3N1bXB0aW9uIGhlcmUgdGhhdCBkaXJ0eVN0YXJ0IGhhcwotCQkvLyBhbHJlYWR5IGJlZW4gZm91bmQhCi0JCS8vCi0JCS8vIG5vdGUgdGhhdCBkaXJ0eUVuZCBpcyBub3QgY2hlY2tlZCBpbiB0aGUgZG8tYmxvY2sgYmVsb3csIHNvIHdlJ2xsCi0JCS8vIGNoZWNrIGl0IGZpcnN0LgotCQlpZiAoaXNKU1BFbWJlZGRlZFN0YXJ0T3JFbmQocmVzdWx0KSkgewotCQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3aGVuIGVuZCBub2RlIGFuZCBzdGFydCBub2RlIGFyZSB0aGUgc2FtZSwgd2Ugb25seSBuZWVkIHRoZQotCQkJLy8gYWJvdmUKLQkJCS8vIGNoZWNrLCBvdGhlcndpc2UsIHRoZXJlJ3MgYSBmZXcgY2FzZXMgdGhhdCB3ZSdsbCBzZWFyY2ggdGhlCi0JCQkvLyByZXN0IG9mIHRoZQotCQkJLy8gZmxhdG5vZGVzIG5lZWRsZXNzbHkuCi0JCQlpZiAocmVzdWx0ICE9IGRpcnR5U3RhcnQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNlYXJjaE5vZGUgPSBkaXJ0eVN0YXJ0OwotCQkJCWRvIHsKLQkJCQkJaWYgKGlzSlNQRW1iZWRkZWRTdGFydE9yRW5kKHNlYXJjaE5vZGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2VhcmNoTm9kZSA9IHNlYXJjaE5vZGUuZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHdlIGdldCB0byB0aGUgY3VycmVudCBkaXJ0eSBlbmQsIG9yIGVuZCBvZgotCQkJCQkvLyBmbGF0bm9kZXMsIHdpdGhvdXQgZmluZGluZyBKU1AgcmVnaW9uIHRoZW4gd2UKLQkJCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmdXJ0aGVyCi0JCQkJfQotCQkJCXdoaWxlICgoc2VhcmNoTm9kZSAhPSByZXN1bHQpICYmIChzZWFyY2hOb2RlICE9IG51bGwpKTsKLQkJCX0KLQkJfQotCQkvLyByZXN1bHQgc2hvdWxkIG5ldmVyIGJlIG51bGwsIGJ1dCBjYWNoZWROb2RlIG5lZWRzIHRvIGJlIHByb3RlY3RlZAotCQkvLyBmcm9tIGJlaW5nIGNoYW5nZWQgdG8gbnVsbAotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWJvb2xlYW4gY2hhbmdlc0luY2x1ZGVBX2x0ID0gZkNoYW5nZXMgIT0gbnVsbCAmJiBmQ2hhbmdlcy5pbmRleE9mKCc8JykgPj0gMDsKLQkJYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QgPSBmRGVsZXRlZFRleHQgIT0gbnVsbCAmJiBmRGVsZXRlZFRleHQuaW5kZXhPZignPicpID49IDA7Ci0KLQkJLy8gTGlzdCByZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdGFydDsKLQkJaW50IGVuZFJlcGxhY2UgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlOwotCQl3aGlsZSAoZW5kICE9IG51bGwgJiYgbm9kZSAhPSBlbmQuZ2V0TmV4dCgpKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGludGVyc2VjdHMobm9kZSwgcmVnaW9uLCBmU3RhcnQsIGVuZFJlcGxhY2UpKSB7Ci0KLQkJCQkJcmVzdWx0ID0gaXNCcmVha2luZ1dpdGhOZXN0ZWRUYWcoY2hhbmdlc0luY2x1ZGVBX2x0LCBkZWxzSW5jbHVkZUFfZ3QsIG5vZGUsIHJlZ2lvbik7Ci0KLQkJCQkJaWYgKHJlc3VsdCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50ZXJzZWN0cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQlpbnQgZW5kID0gbm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJcmV0dXJuIChlbmQgPj0gbG93ICYmIHN0YXJ0IDw9IGhpZ2gpIHx8IChzdGFydCA8PSBsb3cgJiYgZW5kID49IGxvdykgfHwgKHN0YXJ0IDw9IGhpZ2ggJiYgZW5kID49IGhpZ2gpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBwb3RlbnRpYWxseSBjb3VsZCBiZSBhIGpzcCBlbWJlZGRlZCByZWdpb24uIFRoaW5ncyBsaWtlCi0JICogSlNQIERlY2xhcmF0aW9uIGNhbid0IGJlIGVtYmVkZGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUEVtYmVkZGVkU3RhcnRPckVuZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGV4dGVuZHMgc3VwZXIgY2xhc3MgYmVoYXZpb3IKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRPZkJsb2NrUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCXJlc3VsdCA9ICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB8fCBzdXBlci5pc1BhcnRPZkJsb2NrUmVnaW9uKGZsYXROb2RlKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUFJlUGFyc2VyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHF1aWNrQ2hlY2soKSB7Ci0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG5ldyBDb3JlTm9kZUxpc3QoZGlydHlTdGFydCwgZGlydHlFbmQpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc3VwZXIucXVpY2tDaGVjaygpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFNvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjFkYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsLkpTUFRva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBUYWtlcyBpbnB1dCBmcm9tIHRoZSBKU1BUb2tlbml6ZXIgYW5kIGNyZWF0ZXMgYSB0YWcgbGlzdAotICovCi0KLXB1YmxpYyBjbGFzcyBKU1BTb3VyY2VQYXJzZXIgZXh0ZW5kcyBYTUxTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBKU1BDYXBhYmxlUGFyc2VyIHsKLQlwcm90ZWN0ZWQgY2xhc3MgTmVzdGFibGVQcmVmaXhIYW5kbGVyIGltcGxlbWVudHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICogRW5hYmxlcyBhIFRMRCBvd25pbmcgdGhlIGdpdmVuIHByZWZpeCBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gVVJJIGF0Ci0JCSAqIHRoZSBhbmNob3JGbGF0Tm9kZS4gVGhlIGxpc3Qgb2YgYWRkaXRpb25hbENNRG9jdW1lbnRzIHdpbGwgY2xhaW0gdG8KLQkJICogbm90IGtub3cgYW55IG9mIGl0cyB0YWdzIGF0IHBvc2l0aW9ucyBlYXJsaWVyIHRoYW4gdGhhdAotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uJ3MgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBGb3IgdGFnbGliIGRpcmVjdGl2ZXMsIHRoZSB0YWdsaWIgaXMgdGhlIGFuY2hvciB3aGlsZSB0YWdsaWJzCi0JCSAqIHJlZ2lzdGVyZWQgdGhyb3VnaCBpbmNsdWRlIGRpcmVjdGl2ZXMgdXNlIHRoZSBwcmltYXJ5IGluY2x1ZGUKLQkJICogZGlyZWN0aXZlIGFzIHRoZWlyIGFuY2hvci4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGVuYWJsZUZvclRhZ2xpYihTdHJpbmcgcHJlZml4LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvckZsYXROb2RlKSB7Ci0JCQlpZiAocHJlZml4ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJTGlzdCB0YWdtYXJrZXJzID0gKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ21hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoKChUYWdNYXJrZXIpIHRhZ21hcmtlcnMuZ2V0KGkpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHByZWZpeCkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCSgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpLmFkZChuZXcgVGFnTWFya2VyKHByZWZpeCwgYW5jaG9yRmxhdE5vZGUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhQ29yZUZsYXROb2RlKSB7Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgOCAoPCVALAotCQkJLy8gdGFnbGliLCB1cmksID0sIHdoZXJlLCBwcmVmaXgsID0sIHdoYXQpIFtvciA0IGZvciBpbmNsdWRlc10KLQkJCWlmIChhQ29yZUZsYXROb2RlLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiBhQ29yZUZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBhQ29yZUZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IG9mZnNldCA9IGFDb3JlRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQobmFtZSk7Ci0JCQkJCWludCBsZW5ndGggPSBuYW1lLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJYm9vbGVhbiB0YWdsaWJkZXRlY3RlZCA9IGZhbHNlOwotCQkJCQlib29sZWFuIHRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkID0gZmFsc2U7Ci0JCQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCQkJCXRhZ2xpYmRldGVjdGVkID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIGxlbmd0aCwgSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJCQkJdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5Ci0JCQkJCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGdldFRleHQob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJdGFnbGliZGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJCQl0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gcHJvY2Vzc0RpcmVjdGl2ZU5hbWUgPSB0YWdsaWJkZXRlY3RlZCB8fCB0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZDsKLQkJCQkJaWYgKHByb2Nlc3NEaXJlY3RpdmVOYW1lKSB7Ci0JCQkJCQlwcm9jZXNzVGFnbGliKGFDb3JlRmxhdE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgNSAoPCwKLQkJCS8vIGpzcDpyb290LCB4bWxuczpwcmVmaXgsID0sIHdoZXJlKQotCQkJZWxzZSBpZiAoYUNvcmVGbGF0Tm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgKGFDb3JlRmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSB7Ci0JCQkJcHJvY2Vzc0pTUFJvb3QoYUNvcmVGbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSlNQUm9vdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYkZsYXROb2RlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYkZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJYm9vbGVhbiB0YWdsaWIgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCWludCBvZmZzZXQgPSB0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJaW50IGxlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0KLQkJCQkJCVN0cmluZyBuYW1lID0gZ2V0VGV4dChvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKFhNTE5TKSAmJiBuYW1lLmxlbmd0aCgpID4gWE1MTlMubGVuZ3RoKCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDYpOwotCQkJCQkJCXRhZ2xpYiA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwcmVmaXggPSBudWxsOwotCQkJCQkJCXRhZ2xpYiA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRhZ2xpYiAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCXByZWZpeCA9IFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCk7Ci0JCQkJCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWVuYWJsZUZvclRhZ2xpYihwcmVmaXgsIHRhZ2xpYkZsYXROb2RlKTsKLQkJCQkJCQlwcmVmaXggPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFB1bGxzIHRoZSBwcmVmaXggZnJvbSB0aGUgZ2l2ZW4gdGFnbGliIGRpcmVjdGl2ZQotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZCBtYWtlcyBzdXJlIHRoZSBwcmVmaXggaXMgbmVzdGFibGUuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGFnbGliKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliRmxhdE5vZGUpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnbGliRmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQlib29sZWFuIHByZWZpeG5hbWUgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwgJiYgZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQkJCQkJaW50IG9mZnNldCA9IHRhZ2xpYkZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQkJaW50IGxlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQkJcHJlZml4bmFtZSA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIEpTUDEyVExETmFtZXMuUFJFRklYKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5Ci0JCQkJCQkJcHJlZml4bmFtZSA9IChnZXRUZXh0KHRhZ2xpYkZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlBSRUZJWCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHByZWZpeG5hbWUgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlwcmVmaXggPSBnZXRUZXh0KHRhZ2xpYkZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQkJcHJlZml4ID0gU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZW5hYmxlRm9yVGFnbGliKHByZWZpeCwgdGFnbGliRmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCUl0ZXJhdG9yIHRhZ21hcmtlcnMgPSAoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHRhZ21hcmtlcnMuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCEoKFRhZ01hcmtlcikgdGFnbWFya2Vycy5uZXh0KCkpLmlzR2xvYmFsKCkpCi0JCQkJCXRhZ21hcmtlcnMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJcmVzZXROb2RlcygpOwotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQlpZiAobmV3RG9jdW1lbnQgIT0gbnVsbCAmJiBuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgewotCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSkuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEpTUFNvdXJjZVBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKU1BTb3VyY2VQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgewotCQkoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsKLQkJcmV0dXJuICgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpOwotCX0KLQotCXByb3RlY3RlZCBCbG9ja1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgSlNQVG9rZW5pemVyKCk7Ci0JCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpLmFkZChuZXcgTmVzdGFibGVQcmVmaXhIYW5kbGVyKCkpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJSlNQU291cmNlUGFyc2VyIG5ld0luc3RhbmNlID0gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCQluZXdJbnN0YW5jZS5zZXRUb2tlbml6ZXIoZ2V0VG9rZW5pemVyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJzZU5vZGVzKCkgewotCQkvLyByZWdpb25zIGFyZSBpbml0aWFsbHkgcmVwb3J0ZWQgYXMgY29tcGxldGUgb2Zmc2V0cyB3aXRoaW4gdGhlCi0JCS8vIHNjYW5uZWQgaW5wdXQKLQkJLy8gdGhleSBhcmUgYWRqdXN0ZWQgaGVyZSB0byBiZSBpbmRleGVzIGZyb20gdGhlIGN1cnJlbnROb2RlJ3Mgc3RhcnQKLQkJLy8gb2Zmc2V0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJLy8gRE1XOiAyLzEyLzAzLiBNYWRlIGN1cnJlbnQgbm9kZSBsb2NhbCB2YXJpYWJsZSwgc2luY2UKLQkJLy8gd2UgY2hhbmdlZCBjbGFzcyB0byBub3QgcmVxdWlyZSBzdGF0ZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCXdoaWxlICgocmVnaW9uID0gZ2V0TmV4dFJlZ2lvbigpKSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIHRoZXNlIHR5cGVzIChtaWdodCkgZGVtYW5kIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmb3IgZWFjaAotCQkJLy8gb2YgdGhlbQotCQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkJLy8gbXVsdGlwbGUgYmxvY2sgdGV4dHMgaW5kaWNhdGVkIGVtYmVkZGVkIGNvbnRhaW5lcnM7IG5vCi0JCQkJCS8vIG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3QgY29udGludWluZyBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0Ci0JCQkJCQkvLyB0ZXJtaW5hdGVkCi0JCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCQl9Ci0JCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIE9QRU4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCWVsc2UgaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdCB0ZXJtaW5hdGVkCi0JCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJfQotCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCX0KLQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIE5FSVRIRVIgb3BlbiBub3IgY2xvc2UKLQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7IGp1c3QgYWRkIHRvIHRoZW0KLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKSB7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBjbG9zZSBvZmYgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJLy8gY2xlYW5seQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NMT1NFKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhpcyBpcyBleHRyZW1lbHkgcmFyZSwgYnV0IHZhbGlkCi0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCS8vIHBhY2sgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciB3aXRoIHRoaXMgcmVnaW9uCi0JCQkJaWYgKGxhc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGxhc3RSZWdpb247Ci0JCQkJCWNvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKHJlZ2lvbik7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgY29udGFpbmVyIHJlZ2lvbnMgaGF2ZSBwYXJlbnQuIFByb2JhYmx5IGEKLQkJCQkJLy8gYmV0dGVyIHBsYWNlIHRvIHNldCwKLQkJCQkJLy8gYnV0IGZvciBub3csIHdpbGwgKHJlKXNldCBlYWNoIHRpbWUgdGhyb3VnaAotCQkJCQljb250YWluZXIuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjb250YWluZXIpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoY29udGFpbmVyLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBza2lwIG9uIGEgdmVyeS1maXJzdCByZWdpb24gc2l0dWF0aW9uIGFzIHRoZSBkZWZhdWx0Ci0JCQkJLy8gYmVoYXZpb3IgaXMgZ29vZCBlbm91Z2gKLQkJCQkvLyBjb21iaW5lIHdpdGggcHJldmlvdXMgaWYgYWxzbyB1bmRlZmluZWQKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkvLyBwcmV2aW91cyB3YXNuJ3QgdW5kZWZpbmVkCi0JCQkJZWxzZSB7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBhbiB1bmtub3duIHR5cGUgaXMgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQsCi0JCQkJLy8gZW5zdXJlIHRoYXQgYSBub2RlIGV4aXN0cwotCQkJCWlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCByZWdpb24gb2Ygbm90IHNwZWNpZmljYWxseSBoYW5kbGVkIHR5cGUgIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiIEAgIiArIHJlZ2lvbi5nZXRTdGFydCgpICsgIlsiICsgcmVnaW9uLmdldExlbmd0aCgpICsgIl0iKTsvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJCX0KLQotCQkJLy8gdGhlc2UgcmVnaW9ucyBhbHNvIGdldCB0aGVpciBvd24gbm9kZSwgc28gY2xvc2UgdGhlbSBjbGVhbmx5Ci0JCQkvLyBOT1RFOiB0aGVzZSByZWdpb25zIGhhdmUgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgY3JlYXRlZAotCQkJLy8gZm9yIHRoZW0gYWJvdmU7IGl0IG1heQotCQkJLy8gYmUgbW9yZSByZWFkYWJsZSBpZiB0aGF0IGlzIGhhbmRsZWQgaGVyZSBhcyB3ZWxsLCBidXQgdGhlCi0JCQkvLyBjdXJyZW50IGxheW91dAotCQkJLy8gZW5zdXJlcyB0aGF0IHRoZXkgb3BlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHRoZSBzYW1lIHdheQotCQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJfQotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKSB7Ci0JCSgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkucmVtb3ZlTmVzdGFibGVQcmVmaXgodGFnTmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VlMjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuRm9yZWlnblJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoY29udGV4dCA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IEZvcmVpZ25SZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZQotCQkJbmV3UmVnaW9uID0gc3VwZXIuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbGFuZywgc3Vycm91bmRpbmdUYWcpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiZTQyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5OwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiBTdHJ1Y3R1cmVkUmVnaW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBKU1BfRElSRUNUSVZFIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWluc3RhbmNlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKHR5cGUpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ5ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwNiArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiA2LzcvMDYgMTo0NiBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qbmxzWFhYKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuSW50U3RhY2s7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gNi83LzA2IDE6NDYgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NSlNQUmVnaW9uQ29udGV4dHMgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVMgPSA1MjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTID0gNTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfU1FVT1RFU19FTkQgPSA1MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX1NRVU9URVNfRU5EID0gNDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTID0gNDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTCA9IDQzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDM2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFUyA9IDQ0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCA9IDQxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkwgPSA1MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1NRVU9URURfVkJMID0gNTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCA9IDQwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT05URU5UID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDMxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDMyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMgPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCA9IDU0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRFFVT1RFRF9FTCA9IDQ4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMzM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMzQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTX0VORCA9IDQ3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9FTCA9IDQ5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVF9FTkQgPSAzOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX1ZCTCA9IDU1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9BQk9SVF9FTUJFRERFRCA9IDQyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVCA9IDM4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4gPSAzNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjZcMlwwXDFcMTdcMjJcMFwxXDE3XDFcMjVcMVwxMlwxXDYzIisKLSAgICAiXDFcMTVcMVwyMlwxXDEzXDFcMTRcMVwyNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDIwXDFcMTFcMVw3MFwxXDFcMVw1MFwxXDJcMVw0XDFcMjEiKwotICAgICJcMVwzN1wxXDcxXDFcMzVcMVwzNlwxXDU0XDFcNjZcMVw2MFwxXDYwXDFcNjFcMVw2MCIrCi0gICAgIlwxXDYwXDFcMzJcMVwzMVwxXDYyXDFcNTFcMVw1M1wxXDYwXDFcNjVcMVw2NFwxXDQwIisKLSAgICAiXDFcNjdcMlw2MFwxXDI3XDFcNTJcMVw2MFwxXDM0XDFcMTAyXDFcMjNcMVwwXDFcMTAiKwotICAgICJcMVwwXDFcNTZcMVwxMDFcMVw3MlwxXDU3XDFcNDJcMVw2NlwxXDczXDFcNjBcMVw0NSIrCi0gICAgIlwxXDc2XDFcNjBcMVwzM1wxXDMxXDFcNDdcMVw0NlwxXDc3XDFcNjBcMVw0M1wxXDQ0IisKLSAgICAiXDFcNTVcMVwxMDBcMVw0MVwxXDYwXDFcMzBcMVw1MlwxXDYwXDFcMTZcMVwwXDFcMTAzIisKLSAgICAiXDcxXDBcMVw3NVwxMFwwXDI3XDc0XDFcMFwzN1w3NFwxXDBcNzJcNzRcMlwwXDEzXDc0IisKLSAgICAiXDJcMFwxMFw3NFwxXDBcNjVcNzRcMVwwXDEwNFw3NFwxMVwwXDQ0XDc0XDNcMFwyXDc0IisKLSAgICAiXDRcMFwzNlw3NFw3MFwwXDEzMVw3NFwyMlwwXDdcNzRcMTZcMFwyXDc1XDU2XDBcMTA2XDc1IisKLSAgICAiXDMyXDBcMlw3NVw0NFwwXDFcNzRcMVw3NVwzXDc0XDFcMFwxXDc0XDFcMFwyNFw3NCIrCi0gICAgIlwxXDBcNTRcNzRcMVwwXDdcNzRcM1wwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzQiKwotICAgICJcMVwwXDFcNzRcMVwwXDIyXDc0XDE1XDBcMTRcNzRcMVwwXDEwMlw3NFwxXDBcMTRcNzQiKwotICAgICJcMVwwXDQ0XDc0XDFcMFw0XDc1XDExXDBcNjVcNzRcMlwwXDJcNzRcMlwwXDJcNzQiKwotICAgICJcM1wwXDM0XDc0XDJcMFwxMFw3NFwyXDBcMlw3NFw2N1wwXDQ2XDc0XDJcMFwxXDc0IisKLSAgICAiXDdcMFw0Nlw3NFwxMlwwXDIxXDc1XDFcMFwyN1w3NVwxXDBcM1w3NVwxXDBcMVw3NSIrCi0gICAgIlwxXDBcMlw3NVwxXDBcMVw3NVwxM1wwXDMzXDc0XDVcMFwzXDc0XDU2XDBcMzJcNzQiKwotICAgICJcNVwwXDFcNzVcMTJcNzRcMTBcNzVcMTVcMFwxMlw3NVw2XDBcMVw3NVwxMDdcNzRcMlwwIisKLSAgICAiXDVcNzRcMVwwXDE3XDc0XDFcMFw0XDc0XDFcMFwxXDc0XDE3XDc1XDJcNzRcMlw3NSIrCi0gICAgIlwxXDBcNFw3NVwyXDBcMTJcNzVcdTAyMDdcMFwzXDc1XDFcMFw2NVw3NFwyXDBcMVw3NSIrCi0gICAgIlwxXDc0XDIwXDc1XDNcMFw0XDc1XDNcMFwxMlw3NFwyXDc1XDJcMFwxMlw3NVwyMVwwIisKLSAgICAiXDNcNzVcMVwwXDEwXDc0XDJcMFwyXDc0XDJcMFwyNlw3NFwxXDBcN1w3NFwxXDAiKwotICAgICJcMVw3NFwzXDBcNFw3NFwyXDBcMVw3NVwxXDBcN1w3NVwyXDBcMlw3NVwyXDAiKwotICAgICJcM1w3NVwxMVwwXDFcNzVcNFwwXDJcNzRcMVwwXDNcNzRcMlw3NVwyXDBcMTJcNzUiKwotICAgICJcMlw3NFwyMFwwXDFcNzVcMlwwXDZcNzRcNFwwXDJcNzRcMlwwXDI2XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwyXDc0XDFcMFwyXDc0XDFcMFwyXDc0XDJcMFwxXDc1XDFcMCIrCi0gICAgIlw1XDc1XDRcMFwyXDc1XDJcMFwzXDc1XDEzXDBcNFw3NFwxXDBcMVw3NFw3XDAiKwotICAgICJcMTJcNzVcMlw3NVwzXDc0XDE0XDBcM1w3NVwxXDBcN1w3NFwxXDBcMVw3NFwxXDAiKwotICAgICJcM1w3NFwxXDBcMjZcNzRcMVwwXDdcNzRcMVwwXDJcNzRcMVwwXDVcNzRcMlwwIisKLSAgICAiXDFcNzVcMVw3NFwxMFw3NVwxXDBcM1w3NVwxXDBcM1w3NVwyMlwwXDFcNzRcNVwwIisKLSAgICAiXDEyXDc1XDIxXDBcM1w3NVwxXDBcMTBcNzRcMlwwXDJcNzRcMlwwXDI2XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwyXDc0XDJcMFw0XDc0XDJcMFwxXDc1XDFcNzRcNlw3NVwzXDAiKwotICAgICJcMlw3NVwyXDBcM1w3NVwxMFwwXDJcNzVcNFwwXDJcNzRcMVwwXDNcNzRcNFwwIisKLSAgICAiXDEyXDc1XDIyXDBcMlw3NVwxXDBcNlw3NFwzXDBcM1w3NFwxXDBcNFw3NFwzXDAiKwotICAgICJcMlw3NFwxXDBcMVw3NFwxXDBcMlw3NFwzXDBcMlw3NFwzXDBcM1w3NFwzXDAiKwotICAgICJcMTBcNzRcMVwwXDNcNzRcNFwwXDVcNzVcM1wwXDNcNzVcMVwwXDRcNzVcMTFcMCIrCi0gICAgIlwxXDc1XDE3XDBcMTFcNzVcMjFcMFwzXDc1XDFcMFwxMFw3NFwxXDBcM1w3NFwxXDAiKwotICAgICJcMjdcNzRcMVwwXDEyXDc0XDFcMFw1XDc0XDRcMFw3XDc1XDFcMFwzXDc1XDFcMCIrCi0gICAgIlw0XDc1XDdcMFwyXDc1XDExXDBcMlw3NFw0XDBcMTJcNzVcMjJcMFwyXDc1XDFcMCIrCi0gICAgIlwxMFw3NFwxXDBcM1w3NFwxXDBcMjdcNzRcMVwwXDEyXDc0XDFcMFw1XDc0XDRcMCIrCi0gICAgIlw3XDc1XDFcMFwzXDc1XDFcMFw0XDc1XDdcMFwyXDc1XDdcMFwxXDc0XDFcMCIrCi0gICAgIlwyXDc0XDRcMFwxMlw3NVwyMlwwXDJcNzVcMVwwXDEwXDc0XDFcMFwzXDc0XDFcMCIrCi0gICAgIlwyN1w3NFwxXDBcMjBcNzRcNFwwXDZcNzVcMlwwXDNcNzVcMVwwXDRcNzVcMTFcMCIrCi0gICAgIlwxXDc1XDEwXDBcMlw3NFw0XDBcMTJcNzVcMjIxXDBcNTZcNzRcMVwwXDFcNzRcMVw3NSIrCi0gICAgIlwyXDc0XDdcNzVcNVwwXDZcNzRcMVw3NVwxMFw3NVwxXDBcMTJcNzVcNDdcMFwyXDc0IisKLSAgICAiXDFcMFwxXDc0XDJcMFwyXDc0XDFcMFwxXDc0XDJcMFwxXDc0XDZcMFw0XDc0IisKLSAgICAiXDFcMFw3XDc0XDFcMFwzXDc0XDFcMFwxXDc0XDFcMFwxXDc0XDJcMFwyXDc0IisKLSAgICAiXDFcMFwyXDc0XDFcMFwxXDc0XDFcNzVcMlw3NFw2XDc1XDFcMFwyXDc1XDFcNzQiKwotICAgICJcMlwwXDVcNzRcMVwwXDFcNzVcMVwwXDZcNzVcMlwwXDEyXDc1XDc2XDBcMlw3NSIrCi0gICAgIlw2XDBcMTJcNzVcMTNcMFwxXDc1XDFcMFwxXDc1XDFcMFwxXDc1XDRcMFwyXDc1IisKLSAgICAiXDEwXDc0XDFcMFw0MVw3NFw3XDBcMjRcNzVcMVwwXDZcNzVcNFwwXDZcNzVcMVwwIisKLSAgICAiXDFcNzVcMVwwXDI1XDc1XDNcMFw3XDc1XDFcMFwxXDc1XDM0NlwwXDQ2XDc0XDEyXDAiKwotICAgICJcNDdcNzRcMTFcMFwxXDc0XDFcMFwyXDc0XDFcMFwzXDc0XDFcMFwxXDc0XDFcMCIrCi0gICAgIlwyXDc0XDFcMFw1XDc0XDUxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxM1wwIisKLSAgICAiXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcM1wwXDJcNzRcM1wwXDFcNzRcNVwwIisKLSAgICAiXDNcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcM1wwIisKLSAgICAiXDJcNzRcM1wwXDJcNzRcMVwwXDFcNzRcNTBcMFwxXDc0XDExXDBcMVw3NFwyXDAiKwotICAgICJcMVw3NFwyXDBcMlw3NFw3XDBcMlw3NFwxXDBcMVw3NFwxXDBcN1w3NFw1MFwwIisKLSAgICAiXDFcNzRcNFwwXDFcNzRcMTBcMFwxXDc0XHUwYzA2XDBcMjM0XDc0XDRcMFwxMzJcNzRcNlwwIisKLSAgICAiXDI2XDc0XDJcMFw2XDc0XDJcMFw0Nlw3NFwyXDBcNlw3NFwyXDBcMTBcNzRcMVwwIisKLSAgICAiXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDM3XDc0XDJcMFw2NVw3NFwxXDAiKwotICAgICJcN1w3NFwxXDBcMVw3NFwzXDBcM1w3NFwxXDBcN1w3NFwzXDBcNFw3NFwyXDAiKwotICAgICJcNlw3NFw0XDBcMTVcNzRcNVwwXDNcNzRcMVwwXDdcNzRcMzIzXDBcMTVcNzVcNFwwIisKLSAgICAiXDFcNzVcMTA0XDBcMVw3NFwzXDBcMlw3NFwyXDBcMVw3NFwxMjFcMFwzXDc0XHUwZTgyXDAiKwotICAgICJcMVw3NVwxXDBcMVw3NFwzMVwwXDExXDc0XDZcNzVcMVwwXDVcNzVcMTNcMFwxMjRcNzQiKwotICAgICJcNFwwXDJcNzVcMlwwXDJcNzVcMlwwXDEzMlw3NFwxXDBcM1w3NVw2XDBcNTBcNzQiKwotICAgICJcdTFjZDNcMFx1NTFhNlw3NFx1MGM1YVwwXHUyYmE0XDc0XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNjgsICAgMTM2LCAgIDIwNCwgICAyNzIsICAgMzQwLCAgIDQwOCwgICA0NzYsICAgNTQ0LCAgIDYxMiwgCi0gICAgICA2ODAsICAgNzQ4LCAgIDgxNiwgICA4ODQsICAgOTUyLCAgMTAyMCwgIDEwODgsICAxMTU2LCAgMTIyNCwgIDEyOTIsIAotICAgICAxMzYwLCAgMTQyOCwgIDE0OTYsICAxNTY0LCAgMTYzMiwgIDE3MDAsICAxNzY4LCAgMTgzNiwgIDE5MDQsICAxOTcyLCAKLSAgICAgMjA0MCwgIDIxMDgsICAyMTc2LCAgMjI0NCwgIDIzMTIsICAyMzgwLCAgMjQ0OCwgIDI1MTYsICAyNTg0LCAgMjY1MiwgCi0gICAgIDI3MjAsICAyNzg4LCAgMjg1NiwgIDI5MjQsICAyOTkyLCAgMzA2MCwgIDMxMjgsICAzMTk2LCAgMzI2NCwgIDMzMzIsIAotICAgICAzNDAwLCAgMzQ2OCwgIDM1MzYsICAzNjA0LCAgMzY3MiwgIDM3NDAsICAzODA4LCAgMzg3NiwgIDM5NDQsICA0MDEyLCAKLSAgICAgNDA4MCwgIDQxNDgsICA0MjE2LCAgNDI4NCwgIDQzNTIsICA0Mjg0LCAgNDM1MiwgIDQ0MjAsICA0Mjg0LCAgNDI4NCwgCi0gICAgIDQzNTIsICA0NDg4LCAgNDU1NiwgIDQ2MjQsICA0NjkyLCAgNDc2MCwgIDQ4MjgsICA0ODk2LCAgNDI4NCwgIDQzNTIsIAotICAgICA0OTY0LCAgNTAzMiwgIDUxMDAsICA0Mjg0LCAgNTE2OCwgIDUxNjgsICA1MjM2LCAgNTMwNCwgIDUzNzIsICA0OTY0LCAKLSAgICAgNDI4NCwgIDU0NDAsICA1NTA4LCAgNDI4NCwgIDU1NzYsICA1NjQ0LCAgNTcxMiwgIDU3ODAsICA0Mjg0LCAgNDM1MiwgCi0gICAgIDU4NDgsICA1OTE2LCAgNTk4NCwgIDYwNTIsICA2MTIwLCAgNjE4OCwgIDQyODQsICA2MjU2LCAgNjI1NiwgIDYzMjQsIAotICAgICA2MzkyLCAgNjQ2MCwgIDY1MjgsICA2NTk2LCAgNDI4NCwgIDY2NjQsICA2NzMyLCAgNjgwMCwgIDY4NjgsICA2OTM2LCAKLSAgICAgNzAwNCwgIDQyODQsICA3MDcyLCAgNzE0MCwgIDcyMDgsICA3Mjc2LCAgNzM0NCwgIDc0MTIsICA3NDgwLCAgNzU0OCwgCi0gICAgIDQyODQsICA3NjE2LCAgNzY4NCwgIDc3NTIsICA3ODIwLCAgNzg4OCwgIDc5NTYsICA4MDI0LCAgODA5MiwgIDgwOTIsIAotICAgICA4MTYwLCAgODIyOCwgIDgyOTYsICA4MzY0LCAgODM2NCwgIDg0MzIsICA4NTAwLCAgODU2OCwgIDg2MzYsICA4NjM2LCAKLSAgICAgODcwNCwgIDg3NzIsICA4ODQwLCAgODkwOCwgIDQyODQsICA4OTc2LCAgODk3NiwgIDkwNDQsICA5MTEyLCAgOTE4MCwgCi0gICAgIDkyNDgsICA0Mjg0LCAgNDI4NCwgIDQzNTIsICA5MzE2LCAgNDI4NCwgIDQzNTIsICA5Mzg0LCAgOTQ1MiwgIDk1MjAsIAotICAgICA5NTg4LCAgNDI4NCwgIDk2NTYsICA5NzI0LCAgOTc5MiwgIDk4NjAsICA0Mjg0LCAgOTkyOCwgIDk5OTYsIDEwMDY0LCAKLSAgICAxMDEzMiwgIDQyODQsICA0Mjg0LCAxMDIwMCwgIDQyODQsIDEwMjY4LCAxMDMzNiwgMTAyNjgsIDEwNDA0LCAxMDQ3MiwgCi0gICAgMTA0MDQsICA0Mjg0LCAgNDI4NCwgMTA1NDAsIDEwNjA4LCAxMDY3NiwgIDQyODQsIDEwNzQ0LCAxMDgxMiwgMTA4ODAsIAotICAgIDEwOTQ4LCAxMTAxNiwgIDQyODQsICA0Mjg0LCAxMTA4NCwgIDQyODQsIDExMTUyLCAxMTIyMCwgMTExNTIsIDExMjg4LCAKLSAgICAxMTM1NiwgMTEyODgsICA0Mjg0LCAgNDI4NCwgMTE0MjQsIDExNDkyLCAxMTU2MCwgIDQyODQsIDExNjI4LCAxMTY5NiwgCi0gICAgMTE3NjQsICA0Mjg0LCAgNDI4NCwgMTE4MzIsIDExOTAwLCAxMTk2OCwgMTIwMzYsIDEyMTA0LCAgNDI4NCwgMTIxNzIsIAotICAgIDEyMjQwLCAxMjMwOCwgMTIzNzYsIDEyNDQ0LCAxMjUxMiwgMTI1ODAsIDEyNjQ4LCAxMjcxNiwgIDQyODQsIDEyNzg0LCAKLSAgICAxMjg1MiwgIDQyODQsICA0Mjg0LCAgNTE2OCwgIDUzMDQsICA0Mjg0LCAxMjkyMCwgIDUzNzIsIDEyOTg4LCAgNTQ0MCwgCi0gICAgIDU1NzYsICA1NjQ0LCAxMzA1NiwgIDU3MTIsICA0Mjg0LCAxMzEyNCwgMTMxOTIsICA1NzgwLCAxMzI2MCwgIDQyODQsIAotICAgIDExOTAwLCAgNDI4NCwgIDYyNTYsICA2MzI0LCAgNDI4NCwgMTMzMjgsICA2MzkyLCAxMzM5NiwgIDQyODQsIDEzNDY0LCAKLSAgICAxMzUzMiwgIDcwNzIsIDEzNjAwLCAgNzI3NiwgIDQyODQsIDEzNjY4LCAgNzM0NCwgMTM3MzYsIDEzODA0LCAxMzg3MiwgCi0gICAgMTM5NDAsIDE0MDA4LCAxNDA3NiwgIDc4MjAsICA0Mjg0LCAxNDE0NCwgMTQyMTIsICA4MDkyLCAgODE2MCwgIDQyODQsIAotICAgIDE0MjgwLCAxNDM0OCwgMTQ0MTYsIDE0NDg0LCAxNDU1MiwgIDgyOTYsICA4MDkyLCAgODM2NCwgIDg0MzIsICA0Mjg0LCAKLSAgICAgODUwMCwgIDg1NjgsICA4MzY0LCAgODYzNiwgIDg3MDQsICA0Mjg0LCAxNDYyMCwgMTQ2ODgsIDE0NzU2LCAxNDgyNCwgCi0gICAgMTQ4OTIsIDE0OTYwLCAxNTAyOCwgIDg5NzYsICA5MDQ0LCAgNDI4NCwgMTUwOTYsIDE1MTY0LCAxNTIzMiwgMTUzMDAsIAotICAgIDE1MzY4LCAxNTQzNiwgMTU1MDQsIDE1NTcyLCAxNTY0MCwgIDQyODQsICA0Mjg0LCAgNDI4NCwgMTU3MDgsICA0Mjg0LCAKLSAgICAgNDI4NCwgMTU3NzYsIDE1ODQ0LCAxNTkxMiwgMTU5ODAsIDEwMjY4LCAgNDI4NCwgMTYwNDgsIDE2MTE2LCAxMDQwNCwgCi0gICAgIDQyODQsIDE2MTg0LCAxNjI1MiwgMTYzMjAsIDE2Mzg4LCAxNjQ1NiwgMTY1MjQsIDE2NTkyLCAxNjY2MCwgMTY3MjgsIAotICAgIDEwOTQ4LCAxMTE1MiwgIDQyODQsIDE2Nzk2LCAxNjg2NCwgMTEyODgsICA0Mjg0LCAxNjkzMiwgMTcwMDAsIDE3MDY4LCAKLSAgICAxNzEzNiwgMTcyMDQsIDE3MjcyLCAxNzM0MCwgMTc0MDgsIDE3NDc2LCAgNDI4NCwgIDQyODQsICA0Mjg0LCAxNzU0NCwgCi0gICAgMTc2MTIsIDE3NjgwLCAxNzc0OCwgMTc4MTYsICA0Mjg0LCAxNzg4NCwgMTc5NTIsICA0Mjg0LCAgNDI4NCwgIDQyODQsIAotICAgICA0Mjg0LCAgNDI4NCwgIDQ2OTIsIDE4MDIwLCAxODA4OCwgMTgxNTYsIDE4MjI0LCAxODI5MiwgMTgzNjAsIDE4MjkyLCAKLSAgICAxODQyOCwgMTg0OTYsIDE4NDI4LCAxODU2NCwgMTg2MzIsIDE4NzAwLCAxODc2OCwgMTg4MzYsIDE4OTA0LCAxODk3MiwgCi0gICAgMTg5NzIsIDE5MDQwLCAxOTEwOCwgMTkxMDgsIDE5MTc2LCAgODg0MCwgIDg4NDAsIDE5MjQ0LCAxOTMxMiwgMTkzODAsIAotICAgIDE5MzgwLCAxOTQ0OCwgIDkxODAsICA5MTgwLCAxOTUxNiwgMTk1ODQsIDE1OTEyLCAxOTY1MiwgMTAwNjQsIDEwMDY0LCAKLSAgICAxOTcyMCwgMTk3ODgsIDEwMjY4LCAxMDI2OCwgMTk4NTYsIDE5OTI0LCAxMDQwNCwgMTA0MDQsIDE5OTkyLCAyMDA2MCwgCi0gICAgMTA1NDAsIDEwNTQwLCAxNjQ1NiwgMjAxMjgsIDIwMTk2LCAxMDc0NCwgMTA3NDQsIDE2NjYwLCAyMDI2NCwgMjAzMzIsIAotICAgIDEwOTQ4LCAxMDk0OCwgMjA0MDAsIDExMTUyLCAxMTE1MiwgMjA0NjgsIDIwNTM2LCAxMTI4OCwgMTEyODgsIDIwNjA0LCAKLSAgICAyMDY3MiwgMTE0MjQsIDExNDI0LCAxNzIwNCwgMjA3NDAsIDIwODA4LCAxMTYyOCwgMTE2MjgsIDE3NDA4LCAyMDg3NiwgCi0gICAgIDQyODQsICA0Mjg0LCAyMDk0NCwgMjEwMTIsICA0Mjg0LCAyMTA4MCwgMjExNDgsIDIxMjE2LCAgNzA3MiwgIDQyODQsIAotICAgICA0Mjg0LCAyMTI4NCwgMjEzNTIsIDIxNDIwLCAyMTQ4OCwgMjE1NTYsIDE0NDg0LCAxNDgyNCwgIDg4NDAsIDIxNjI0LCAKLSAgICAxNTMwMCwgIDkxODAsIDIxNjkyLCAgNDI4NCwgMTAwNjQsIDEwMjY4LCAyMTc2MCwgMTA0MDQsIDIxODI4LCAxMDU0MCwgCi0gICAgMjE4OTYsICA0Mjg0LCAxMDc0NCwgMjE5NjQsIDEwOTQ4LCAxMTE1MiwgMjIwMzIsIDExMjg4LCAyMjEwMCwgMTE0MjQsIAotICAgIDIyMTY4LCAgNDI4NCwgMTE2MjgsIDIyMjM2LCAyMjMwNCwgMjIzNzIsIDIyNDQwLCAyMjUwOCwgMjI1NzYsIDIyNjQ0LCAKLSAgICAyMjcxMiwgMjI3ODAsIDIyODQ4LCAyMjkxNiwgMjI5ODQsIDIzMDUyLCAyMzEyMCwgMjMxODgsIDIzMjU2LCAyMzMyNCwgCi0gICAgMjMzOTIsIDIzNDYwLCAyMzUyOCwgMjM1OTYsICA0NjkyLCAyMzY2NCwgMjM3MzIsIDIzODAwLCAyMzg2OCwgMjM5MzYsIAotICAgICA0Mjg0LCAgNDI4NCwgMjQwMDQsIDI0MDcyLCAyNDE0MCwgMjQyMDgsIDE2NDU2LCAxNjY2MCwgMjQyNzYsIDI0MzQ0LCAKLSAgICAxNzIwNCwgMTc0MDgsIDI0NDEyLCAyNDQ4MCwgMjQ1NDgsICA0Mjg0LCAgNDI4NCwgIDQyODQsIDI0NjE2LCAyNDY4NCwgCi0gICAgMjQ3NTIsIDI0ODIwLCAyNDg4OCwgMjQ5NTYsIDI1MDI0LCAgNjgwMCwgMjUwOTIsIDI1MTYwLCAyNTIyOCwgMjUyOTYsIAotICAgIDI1MzY0LCAyNTQzMiwgMjU1MDAsICA0Mjg0LCAyNTU2OCwgIDg4NDAsICA5MTgwLCAxMDI2OCwgMTA0MDQsIDExMTUyLCAKLSAgICAxMTI4OCwgMjU2MzYsIDI1NzA0LCAyNTc3MiwgMjU4NDAsIDI1OTA4LCAyNTk3NiwgMjYwNDQsIDI2MTEyLCAyNjE4MCwgCi0gICAgMjYyNDgsIDI2MzE2LCAyNjM4NCwgMjY0NTIsIDI2NTIwLCAyNjU4OCwgMjY2NTYsIDI2NzI0LCAyNjc5MiwgMjY4NjAsIAotICAgIDI2OTI4LCAyNjk5NiwgMjcwNjQsIDI3MTMyLCAyNzIwMCwgMjcyNjgsIDI3MzM2LCAyNzQwNCwgMjc0NzIsIDI3NTQwLCAKLSAgICAyNzYwOCwgMjc2NzYsIDI3NzQ0LCAyNzgxMiwgMjc4ODAsIDI3OTQ4LCAyODAxNiwgMjgwODQsIDI4MTUyLCAyODIyMCwgCi0gICAgMjgyODgsICA0Mjg0LCAyODM1NiwgMjg0MjQsIDI4NDkyLCAyODU2MCwgIDY4MDAsIDI4NjI4LCAyODY5NiwgMjg3NjQsIAotICAgIDI4ODMyLCAyODkwMCwgMjg5NjgsIDI5MDM2LCAyOTEwNCwgMjkxNzIsIDI5MjQwLCAyOTMwOCwgMjkzNzYsIDI5NDQ0LCAKLSAgICAyOTUxMgotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNzJcMVw3M1wxMVw3MlwxXDc0XDFcNzJcMVw3NVw0XDcyXDFcNzYiKwotICAgICJcNDBcNzJcMVw3N1wyMFw3MlwxXDEwMFwxXDEwMVwxMDJcMTAwXDFcMTAyXDFcMTAzIisKLSAgICAiXDIxXDEwMlwxXDEwNFwyXDEwMlwxXDEwNVw1NVwxMDJcMVwxMDZcMVwxMDdcMTAyXDEwNiIrCi0gICAgIlwxXDEwMlwxXDEwM1w1XDEwMlwxXDExMFwxNlwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzIisKLSAgICAiXDJcMTAyXDFcMTExXDFcMTEyXDJcMTAyXDJcMTEzXDVcMTAyXDFcMTEyXDZcMTAyIisKLSAgICAiXDFcMTEyXDJcMTE0XDNcMTEzXDFcMTAyXDEwXDExM1wxXDExNVwyXDExM1wxXDEwMiIrCi0gICAgIlwxMFwxMTNcMVwxMTVcMVwxMTNcMVwxMDJcNFwxMTNcMVwxMDJcNFwxMTNcMVwxMDIiKwotICAgICJcNFwxMTNcM1wxMDJcMVwxMDNcMlwxMDJcMVwxMTFcMVwxMTZcMTFcMTAyXDFcMTE2IisKLSAgICAiXDZcMTAyXDFcMTE2XDU1XDEwMlwxXDExN1wxXDEyMFwyXDExN1wxXDEyMVwyMVwxMTciKwotICAgICJcMVwxMDVcNTVcMTE3XDFcMTAyXDFcMTAzXDJcMTAyXDFcMTIyXDFcMTEyXDJcMTAyIisKLSAgICAiXDJcMTIzXDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTIzXDFcMTAyXDEzXDEyMyIrCi0gICAgIlwxXDEwMlwxMlwxMjNcMVwxMDJcNFwxMjNcMVwxMDJcNFwxMjNcMVwxMDJcNFwxMjMiKwotICAgICJcM1wxMDJcMVwxMDNcMlwxMDJcMVwxMjJcMVwxMTJcMlwxMDJcMlwxMjNcNVwxMDIiKwotICAgICJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMjNcMVwxMDJcMTNcMTIzXDFcMTI0XDEyXDEyMyIrCi0gICAgIlwxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wyXDEwMlwxXDEyNSIrCi0gICAgIlwxXDEwM1wxXDEwMlwxXDEyNlwxXDEyN1wxXDExMlw0XDEyNVwxXDEzMFwxXDEyNSIrCi0gICAgIlwxXDEzMVwyXDEyNVwxXDExMlw2XDEyNVwxXDExMlw1NVwxMjVcMVwxMDJcMVwxMDMiKwotICAgICJcMlwxMDJcMVwxMzJcMjFcMTAyXDFcMTA1XDU2XDEwMlwxXDEwM1wxXDEzM1wxXDEzNCIrCi0gICAgIlwxXDEwMlwxXDExMlwyXDEwMlwyXDEzNVw1XDEwMlwxXDExMlw2XDEwMlwxXDExMiIrCi0gICAgIlw1XDEzNVwxXDEwMlwxM1wxMzVcMVwxMDJcMTJcMTM1XDFcMTAyXDRcMTM1XDFcMTAyIisKLSAgICAiXDRcMTM1XDFcMTAyXDRcMTM1XDNcMTAyXDFcMTAzXDFcMTMzXDFcMTM0XDFcMTAyIisKLSAgICAiXDFcMTEyXDJcMTAyXDJcMTM1XDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTM1IisKLSAgICAiXDFcMTAyXDEzXDEzNVwxXDEzNlwxMlwxMzVcMVwxMDJcNFwxMzVcMVwxMDJcNFwxMzUiKwotICAgICJcMVwxMDJcNFwxMzVcMlwxMDJcMVwxMzdcMVwxMDNcMVwxMzNcMVwxNDBcMVwxMzciKwotICAgICJcMVwxMTJcNFwxMzdcMVwxNDFcMVwxMzdcMVwxNDJcMlwxMzdcMVwxMTJcNlwxMzciKwotICAgICJcMVwxMTJcNTVcMTM3XDFcMTAyXDFcMTAzXDNcMTAyXDFcMTEyXDExXDEwMlwxXDExMiIrCi0gICAgIlw2XDEwMlwxXDExMlw1NVwxMDJcMVwxNDNcMVwxNDRcMjBcMTQzXDFcMTQ1XDYxXDE0MyIrCi0gICAgIlwxXDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE0N1w1XDEwMlwxXDExMiIrCi0gICAgIlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE0N1wxXDEwMlwxM1wxNDdcMVwxMDIiKwotICAgICJcMTJcMTQ3XDFcMTAyXDRcMTQ3XDFcMTAyXDRcMTQ3XDFcMTAyXDRcMTQ3XDNcMTAyIisKLSAgICAiXDFcMTQ2XDNcMTAyXDFcMTUxXDExXDEwMlwxXDE1MVwyXDEwMlwxXDE1MFwzXDEwMiIrCi0gICAgIlwxXDE1MVw1NlwxMDJcMVwxNDZcM1wxMDJcMVwxMTJcMlwxMDJcMlwxNTJcNVwxMDIiKwotICAgICJcMVwxMTJcMlwxMDJcMVwxNTBcM1wxMDJcMVwxMTJcNVwxNTJcMVwxMDJcMTNcMTUyIisKLSAgICAiXDFcMTAyXDEyXDE1MlwxXDEwMlw0XDE1MlwxXDEwMlw0XDE1MlwxXDEwMlw0XDE1MiIrCi0gICAgIlwzXDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE1Mlw1XDEwMlwxXDExMiIrCi0gICAgIlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE1MlwxXDEwMlwxM1wxNTJcMVwxNTMiKwotICAgICJcMTJcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyXDJcMTAyIisKLSAgICAiXDFcMTU0XDFcMTQ2XDFcMTAyXDFcMTU1XDFcMTU0XDFcMTEyXDRcMTU0XDFcMTU2IisKLSAgICAiXDFcMTU0XDFcMTU3XDJcMTU0XDFcMTEyXDJcMTU0XDFcMTYwXDNcMTU0XDFcMTEyIisKLSAgICAiXDU1XDE1NFwxXDE2MVwxXDE2MlwxXDE2M1wxXDE2NFw0XDE2MVwyXDE2NVwxNVwxNjEiKwotICAgICJcNVwxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDEyXDE2NlwxXDE2MVw0XDE2NlwxXDE2MSIrCi0gICAgIlw0XDE2NlwxXDE2MVwxXDE2N1wzXDE2NlwyXDE2MVwxXDEwMlwxXDE3MFwxXDE2MyIrCi0gICAgIlwxXDE2NFwxXDEwMlwxXDExMlwyXDEwMlwyXDE3MVw1XDEwMlwxXDExMlw2XDEwMiIrCi0gICAgIlwxXDExMlw1XDE3MVwxXDEwMlwxM1wxNzFcMVwxMDJcMTJcMTcxXDFcMTAyXDRcMTcxIisKLSAgICAiXDFcMTAyXDRcMTcxXDFcMTAyXDRcMTcxXDNcMTAyXDFcMTcwXDFcMTYzXDFcMTY0IisKLSAgICAiXDFcMTAyXDFcMTEyXDJcMTAyXDJcMTcxXDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyIisKLSAgICAiXDVcMTcxXDFcMTAyXDEzXDE3MVwxXDE3MlwxMlwxNzFcMVwxMDJcNFwxNzFcMVwxMDIiKwotICAgICJcNFwxNzFcMVwxMDJcNFwxNzFcMlwxMDJcMVwxNzNcMVwxNzRcMVwxNjNcMVwxNzUiKwotICAgICJcMVwxNzNcMVwxMTJcNFwxNzNcMVwxNzZcMVwxNzNcMVwxNzdcMVwyMDBcMVwxNzMiKwotICAgICJcMVwxMTJcNlwxNzNcMVwxMTJcMzRcMTczXDFcMjAxXDIwXDE3M1wxXDEwMlwxXDIwMiIrCi0gICAgIlwxXDIwM1wyXDEwMlwxXDExMlwxMVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcN1wxMDIiKwotICAgICJcMVwyMDRcMVwyMDVcMlwxMDJcMVwyMDZcMTFcMTAyXDFcMjA2XDFcMTAyXDFcMjA1IisKLSAgICAiXDFcMjA0XDI1XDEwMlwxXDEwM1wxXDIwM1wyXDEwMlwxXDExMlwxMVwxMDJcMVwxMTIiKwotICAgICJcNlwxMDJcMVwxMTJcNVwxMDJcMVwyMDdcNTBcMTAyXDFcMTAzXDFcMjAzXDJcMTAyIisKLSAgICAiXDFcMTEyXDJcMTAyXDJcMjEwXDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMjEwIisKLSAgICAiXDFcMjA3XDEzXDIxMFwxXDEwMlwxMlwyMTBcMVwxMDJcNFwyMTBcMVwxMDJcNFwyMTAiKwotICAgICJcMVwxMDJcNFwyMTBcM1wxMDJcMVwxMDNcMVwyMDNcMlwxMDJcMVwxMTJcMTFcMTAyIisKLSAgICAiXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTAyXDFcMjA3XDdcMTAyXDFcMjExXDZcMTAyIisKLSAgICAiXDFcMjEyXDEwXDEwMlwxXDIxMVwxMlwxMDJcMVwyMTJcNFwxMDJcMVwyMTNcMVwxMDMiKwotICAgICJcMVwyMDNcMVwyMTRcMVwyMTNcMVwxMTJcNFwyMTNcMVwyMTVcMVwyMTNcMVwyMTYiKwotICAgICJcMlwyMTNcMVwxMTJcNlwyMTNcMVwxMTJcNVwyMTNcMVwyMTdcNDdcMjEzXDFcMjIwIisKLSAgICAiXDFcMTAzXDFcMjAzXDFcMjIxXDFcMjIwXDFcMTEyXDRcMjIwXDFcMjIyXDFcMjIwIisKLSAgICAiXDFcMjIzXDJcMjIwXDFcMTEyXDZcMjIwXDFcMTEyXDVcMjIwXDFcMjI0XDQ3XDIyMCIrCi0gICAgIlwxXDIyNVwxXDEwM1wxXDIwM1wxXDIyNlwxXDIyNVwxXDExMlw0XDIyNVwxXDIyNyIrCi0gICAgIlwxXDIyNVwxXDIzMFwyXDIyNVwxXDExMlw2XDIyNVwxXDExMlw1NVwyMjVcMVwyMzEiKwotICAgICJcMVwyMzJcMVwyMzNcMTAxXDIzMVwxXDIzNFwxXDEwM1wxXDIwM1wxXDIzNVwxXDIzNCIrCi0gICAgIlwxXDExMlw0XDIzNFwxXDIzNlwxXDIzNFwxXDIzN1wyXDIzNFwxXDExMlw2XDIzNCIrCi0gICAgIlwxXDExMlw1NVwyMzRcMVwyNDBcMVwyNDFcMVwyNDJcMTAxXDI0MFwxXDI0M1wxXDI0NCIrCi0gICAgIlwxMDJcMjQzXDFcMTAyXDFcMjQ1XDI0XDEwMlwxXDEwNVw1NVwxMDJcMVwyNDZcMVwyNDciKwotICAgICJcMTAyXDI0NlwxXDEwMlwxXDEwM1w1XDEwMlwxXDI1MFwxNlwxMDJcMVwxMDVcNTVcMTAyIisKLSAgICAiXDFcMjUxXDFcMjUyXDNcMjUxXDFcMjUzXDZcMjUxXDFcMjU0XDFcMjU1XDFcMjUxIisKLSAgICAiXDFcMjUzXDZcMjUxXDFcMjUzXDM0XDI1MVwxXDI1NlwyMFwyNTFcMVwyNTdcMVwyNTIiKwotICAgICJcM1wyNTdcMVwyNjBcNFwyNTdcMVwyNjFcMlwyNTdcMVwyNjJcMVwyNTdcMVwyNjAiKwotICAgICJcNlwyNTdcMVwyNjBcMzRcMjU3XDFcMjYzXDIwXDI1N1wxXDEwMlwxXDEwM1wyNFwxMDIiKwotICAgICJcMVwxMDVcNTVcMTAyXDFcMjY0XDFcMjY1XDEwXDI2NFwxXDI2NlwxXDI2NFwxXDI2NyIrCi0gICAgIlwxXDI3MFw2NVwyNjRcMVwyNzFcMVwyNzJcMVwyNzNcMTJcMjcyXDFcMTAyXDExXDI3MiIrCi0gICAgIlwxXDI3NFw1NVwyNzJcMVwyNzVcMVwyNzZcMTBcMjc1XDFcMTAyXDEzXDI3NVwxXDI3NyIrCi0gICAgIlw1NVwyNzVcMVwxMDJcMVwxMDNcMTJcMTAyXDFcMzAwXDExXDEwMlwxXDEwNVw1NlwxMDIiKwotICAgICJcMVwxMDNcMTBcMTAyXDFcMzAxXDEzXDEwMlwxXDEwNVw1NVwxMDJcMVwzMDJcMVwzMDMiKwotICAgICJcMTBcMzAyXDFcMjYxXDY3XDMwMlwxXDMwNFwxXDMwNVwxXDMwNlwxXDMwN1wxMlwzMDYiKwotICAgICJcMVwyNTRcNjVcMzA2XDFcMzEwXDFcMzA1XDFcMzExXDFcMzEyXDEwXDMxMVwxXDMxMyIrCi0gICAgIlwxXDMxMVwxXDMxNFw0NlwzMTFcMVwzMTVcMTdcMzExXDFcMzE2XDFcMzE3XDFcMzIwIisKLSAgICAiXDEyXDMxN1wxXDEwMlwxMVwzMTdcMVwzMjFcNTVcMzE3XDFcMzIyXDFcMzIzXDEwXDMyMiIrCi0gICAgIlwxXDEwMlwxM1wzMjJcMVwzMjRcNTVcMzIyXDFcMTAyXDFcMTAzXDEyXDEwMlwxXDMyNSIrCi0gICAgIlwxMVwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzXDEwXDEwMlwxXDMyNlwxM1wxMDJcMVwxMDUiKwotICAgICJcNTVcMTAyXDFcMzI3XDFcMzMwXDEwXDMyN1wxXDI2MVw2N1wzMjdcMVwzMzFcMVwzMzIiKwotICAgICJcMVwzMzNcMVwzMzRcMTJcMzMzXDFcMjU0XDY1XDMzM1wxXDMzNVwxXDMzMlwxXDcyIisKLSAgICAiXDFcMFwxMVw3MlwxXDBcMVw3MlwxXDBcNFw3MlwxXDBcNDBcNzIiKwotICAgICJcMVwwXDIwXDcyXDNcMFwxXDMzNlwxXDMzN1wxNVwwXDFcMzQwXDJcMCIrCi0gICAgIlwxXDM0MVw2M1wwXDFcMzQyXDJcMFwyXDM0M1w1XDBcMVwzNDJcNlwwIisKLSAgICAiXDFcMzQyXDVcMzQzXDFcMFwxM1wzNDNcMVwwXDEyXDM0M1wxXDM0NFw0XDM0MyIrCi0gICAgIlwxXDBcNFwzNDNcMVwwXDRcMzQzXDJcMFwxXDM0NVwxXDBcMTFcMzQ1IisKLSAgICAiXDFcMFwxXDM0NVwxXDM0NlwxXDM0N1wzXDM0NVwxXDBcNjFcMzQ1XDVcMCIrCi0gICAgIlwxXDM0MlwyXDBcMlwzNTBcNVwwXDFcMzQyXDZcMFwxXDM0Mlw1XDM1MCIrCi0gICAgIlwxXDBcMTNcMzUwXDFcMFwxMlwzNTBcMVwwXDRcMzUwXDFcMFw0XDM1MCIrCi0gICAgIlwxXDBcNFwzNTBcMlwwXDFcMzQ1XDFcMFwxMVwzNDVcMVwwXDJcMzQ1IisKLSAgICAiXDFcMzUxXDNcMzQ1XDFcMFw0MFwzNDVcMVwzNTJcMjBcMzQ1XDEyNlwwXDFcMzUzIisKLSAgICAiXDJcMFwxXDM1NFwxMDFcMFwxXDM1NVw2N1wwXDFcMzU2XDc2XDBcMVwzNTciKwotICAgICJcMTA2XDBcMVwxMTJcMTFcMFwxXDExMlw2XDBcMVwxMTJcNjNcMFw0XDExMyIrCi0gICAgIlw2XDBcMVwxMTNcNlwwXDVcMTEzXDFcMFwxM1wxMTNcMVwwXDEyXDExMyIrCi0gICAgIlwxXDBcNFwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTEzXDZcMFwxXDExMyIrCi0gICAgIlw2XDBcMlwxMTNcMVwzNjBcMlwxMTNcMVwwXDEzXDExM1wxXDBcMTJcMTEzIisKLSAgICAiXDFcMFw0XDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxMTNcNlwwXDFcMTEzIisKLSAgICAiXDZcMFwyXDExM1wxXDM2MVwyXDExM1wxXDBcMTNcMTEzXDFcMFwxMlwxMTMiKwotICAgICJcMVwwXDRcMTEzXDFcMFwxMVwxMTNcN1wwXDFcMTE2XDExXDBcMVwxMTYiKwotICAgICJcNlwwXDFcMTE2XDU3XDBcMVwzNjJcMTAzXDBcMVwzNjNcMTA3XDBcNFwxMjMiKwotICAgICJcNlwwXDFcMTIzXDZcMFw1XDEyM1wxXDBcMTNcMTIzXDFcMFwxMlwxMjMiKwotICAgICJcMVwwXDRcMTIzXDFcMFwxMVwxMjNcMlwwXDFcMTI1XDJcMFwxXDM2NCIrCi0gICAgIlwxXDEyNVwxXDBcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNVwxXDAiKwotICAgICJcNlwxMjVcMVwwXDU2XDEyNVwxXDBcMVwzNjNcMVwzNjRcMVwxMjVcMVwwIisKLSAgICAiXDRcMTI1XDFcMFwxXDEyNVwxXDBcMlwxMjVcMVwwXDZcMTI1XDFcMCIrCi0gICAgIlw1NVwxMjVcMVwzNjVcMVwwXDEwXDM2NVwxXDM2NlwyXDM2NVwxXDM2N1w0NVwzNjUiKwotICAgICJcMVwzNjdcMjBcMzY1XDFcMzcwXDFcMFwxMlwzNzBcMVwzNjZcMVwzNzFcNDVcMzcwIisKLSAgICAiXDFcMzcxXDIwXDM3MFwyXDBcMVwxMzNcMVwzNzJcMTA2XDBcNFwxMzVcNlwwIisKLSAgICAiXDFcMTM1XDZcMFw1XDEzNVwxXDBcMTNcMTM1XDFcMFwxMlwxMzVcMVwwIisKLSAgICAiXDRcMTM1XDFcMFwxMVwxMzVcMlwwXDFcMTM3XDJcMFwxXDM3M1wxXDEzNyIrCi0gICAgIlwxXDBcNFwxMzdcMVwwXDFcMTM3XDFcMFwyXDEzN1wxXDBcNlwxMzciKwotICAgICJcMVwwXDU2XDEzN1wxXDBcMVwxMzNcMVwzNzRcMVwxMzdcMVwwXDRcMTM3IisKLSAgICAiXDFcMFwxXDEzN1wxXDBcMlwxMzdcMVwwXDZcMTM3XDFcMFw1NVwxMzciKwotICAgICJcMVwxNDFcMVwwXDFcMzc1XDFcMzc2XDFcMTQxXDFcMzc1XDRcMTQxXDFcMzc3IisKLSAgICAiXDFcMTQxXDFcMzc1XDFcdTAxMDBcMVwxNDFcMVwzNzVcNlwxNDFcMVwzNzVcMzRcMTQxIisKLSAgICAiXDFcdTAxMDBcMjBcMTQxXDFcMTQyXDFcMFwxXHUwMTAxXDFcdTAxMDJcMVwxNDJcMVx1MDEwMSIrCi0gICAgIlw0XDE0MlwxXHUwMTAxXDFcMTQyXDFcMzc3XDFcdTAxMDNcMVwxNDJcMVx1MDEwMVw2XDE0MiIrCi0gICAgIlwxXHUwMTAxXDM0XDE0MlwxXHUwMTAzXDIwXDE0MlwyXDBcMVx1MDEwNFwxMjNcMFwxXDM1MyIrCi0gICAgIlwyXDBcMVx1MDEwNVw2NFwwXDRcMTQ3XDZcMFwxXDE0N1w2XDBcNVwxNDciKwotICAgICJcMVwwXDEzXDE0N1wxXDBcMTJcMTQ3XDFcMFw0XDE0N1wxXDBcMTFcMTQ3IisKLSAgICAiXDRcMFwxXHUwMTA2XDEwNlwwXDFcMTUxXDExXDBcMVwxNTFcNlwwXDFcMTUxIisKLSAgICAiXDYzXDBcNFwxNTJcNlwwXDFcMTUyXDZcMFw1XDE1MlwxXDBcMTNcMTUyIisKLSAgICAiXDFcMFwxMlwxNTJcMVwwXDRcMTUyXDFcMFwxMVwxNTJcMlwwXDFcMTU0IisKLSAgICAiXDJcMFwxXHUwMTA3XDFcMTU0XDFcMFw0XDE1NFwxXDBcMVwxNTRcMVwwIisKLSAgICAiXDJcMTU0XDFcMFw2XDE1NFwxXDBcNTVcMTU0XDFcdTAxMDhcMVwwXDEwXHUwMTA4IisKLSAgICAiXDFcdTAxMDlcMlx1MDEwOFwxXHUwMTBhXDQ1XHUwMTA4XDFcdTAxMGFcMjBcdTAxMDhcMVx1MDEwYlwxXDAiKwotICAgICJcMTJcdTAxMGJcMVx1MDEwOVwxXHUwMTBjXDQ1XHUwMTBiXDFcdTAxMGNcMjBcdTAxMGJcMVwxNTRcMVwwIisKLSAgICAiXDFcdTAxMDZcMVx1MDEwN1wxXDE1NFwxXDBcNFwxNTRcMVwwXDFcMTU0XDFcMCIrCi0gICAgIlwyXDE1NFwxXDBcNlwxNTRcMVwwXDU1XDE1NFwxXDE2MVwzXDBcMjNcMTYxIisKLSAgICAiXDVcMFwxXDE2MVwxM1wwXDFcMTYxXDEyXDBcMVwxNjFcNFwwXDFcMTYxIisKLSAgICAiXDRcMFwxXDE2MVw0XDBcMlwxNjFcM1wwXDFcMzM2XDE2XDBcMVwzNTMiKwotICAgICJcMlwwXDFcMzQxXDYwXDBcMVx1MDEwZFwxMDFcMFwxXDE2MVwzXDBcMlwxNjEiKwotICAgICJcNFwxNjVcNlwxNjFcMVwxNjVcNlwxNjFcNVwxNjZcMVwxNjFcMTNcMTY2XDFcMTYxIisKLSAgICAiXDEyXDE2NlwxXDE2MVw0XDE2NlwxXDE2MVw0XDE2NlwxXDE2NVw0XDE2NlwyXDE2MSIrCi0gICAgIlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw3XDE2NlwxXHUwMTBlXDNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNVwwXDFcMzM2IisKLSAgICAiXDRcMFwyXHUwMTBmXDEwXDBcMVwzNTNcMlwwXDFcMzQxXDFcMFw1XHUwMTBmIisKLSAgICAiXDFcMFwxM1x1MDEwZlwxXDBcMTJcdTAxMGZcMVwwXDRcdTAxMGZcMVwwXDRcdTAxMGYiKwotICAgICJcMVwwXDRcdTAxMGZcMTBcMFw0XDE3MVw2XDBcMVwxNzFcNlwwXDVcMTcxIisKLSAgICAiXDFcMFwxM1wxNzFcMVwwXDEyXDE3MVwxXDBcNFwxNzFcMVwwXDExXDE3MSIrCi0gICAgIlwyXDBcMVwxNzNcMlwwXDFcdTAxMTBcMVwxNzNcMVwwXDRcMTczXDFcMCIrCi0gICAgIlwxXDE3M1wxXDBcMlwxNzNcMVwwXDZcMTczXDFcMFw1NVwxNzNcM1wwIisKLSAgICAiXDFcMzM2XDRcMFwyXHUwMTExXDEwXDBcMVwzNTNcMlwwXDFcMzQxXDFcMCIrCi0gICAgIlw1XHUwMTExXDFcMFwxM1x1MDExMVwxXDBcMTJcdTAxMTFcMVwwXDRcdTAxMTFcMVwwIisKLSAgICAiXDRcdTAxMTFcMVwwXDRcdTAxMTFcMlwwXDFcMTczXDFcMFwxXHUwMTBkXDFcdTAxMTAiKwotICAgICJcMVwxNzNcMVwwXDRcMTczXDFcMFwxXDE3M1wxXDBcMlwxNzNcMVwwIisKLSAgICAiXDZcMTczXDFcMFw1NVwxNzNcMVx1MDExMlwxXDBcMTBcdTAxMTJcMVx1MDExM1wyXHUwMTEyIisKLSAgICAiXDFcdTAxMTRcNDVcdTAxMTJcMVx1MDExNFwyMFx1MDExMlwxXHUwMTE1XDFcMFwxMlx1MDExNVwxXHUwMTEzIisKLSAgICAiXDFcdTAxMTZcNDVcdTAxMTVcMVx1MDExNlwyMFx1MDExNVwxXDE3M1wyXDBcMVx1MDExMFwxXDE3MyIrCi0gICAgIlwxXDBcNFwxNzNcMVwwXDFcMTczXDFcMFwxXDE3M1wxXHUwMTE3XDFcMCIrCi0gICAgIlw2XDE3M1wxXDBcNTZcMTczXDJcMFwxXHUwMTEwXDFcMTczXDFcMFw0XDE3MyIrCi0gICAgIlwxXDBcMVwxNzNcMVwwXDFcMTczXDFcdTAxMThcMVwwXDZcMTczXDFcMCIrCi0gICAgIlw1NVwxNzNcM1wwXDFcMzM2XDE2XDBcMVwzNTNcMlwwXDFcdTAxMDVcMTI0XDAiKwotICAgICJcMVx1MDExOVwyXDBcMVx1MDExOVw3MlwwXDFcdTAxMWFcMTRcMFwxXHUwMTFhXDYwXDAiKwotICAgICJcMlx1MDExYlw1MFwwXDIzXHUwMTFjXDFcdTAxMWRcNjBcdTAxMWNcNlwwXDRcMjEwXDZcMCIrCi0gICAgIlwxXDIxMFw2XDBcNVwyMTBcMVwwXDEzXDIxMFwxXDBcMTJcMjEwXDFcMCIrCi0gICAgIlw0XDIxMFwxXDBcMTFcMjEwXDU0XDBcMVx1MDExZVwxMjBcMFwxXHUwMTFmXDEwXDAiKwotICAgICJcMVx1MDExZlwzXDBcMVwyMTNcMlwwXDFcdTAxMjBcMVwyMTNcMVwwXDRcMjEzIisKLSAgICAiXDFcMFwxXDIxM1wxXDBcMlwyMTNcMVwwXDZcMjEzXDFcMFw1NVwyMTMiKwotICAgICJcMVx1MDEyMVwxXDBcMTBcdTAxMjFcMVx1MDEyMlwyXHUwMTIxXDFcdTAxMjNcNDVcdTAxMjFcMVx1MDEyMyIrCi0gICAgIlwyMFx1MDEyMVwxXHUwMTI0XDFcMFwxXHUwMTI0XDJcdTAxMjVcMVx1MDEyNFw0XHUwMTI1XDJcdTAxMjQiKwotICAgICJcMVx1MDEyNlwxXHUwMTI3XDFcdTAxMjRcNFx1MDEyNVwxXHUwMTI0XDEwXHUwMTI1XDFcdTAxMjRcMjZcdTAxMjUiKwotICAgICJcMVx1MDEyN1wxMFx1MDEyNVwyXHUwMTI0XDRcdTAxMjVcMlx1MDEyNFwxXDIxN1wyXHUwMTFjXDFcdTAxMjgiKwotICAgICJcMVwyMTdcMVx1MDExY1w0XDIxN1wxXHUwMTFjXDFcMjE3XDFcdTAxMWNcMlwyMTdcMVx1MDExYyIrCi0gICAgIlwzXDIxN1wxXHUwMTI5XDJcMjE3XDFcdTAxMWNcNTVcMjE3XDFcMjIwXDJcMFwxXHUwMTJhIisKLSAgICAiXDFcMjIwXDFcMFw0XDIyMFwxXDBcMVwyMjBcMVwwXDJcMjIwXDFcMCIrCi0gICAgIlw2XDIyMFwxXDBcNTVcMjIwXDEyXHUwMTJiXDFcdTAxMmNcNzFcdTAxMmJcMTRcdTAxMmRcMVx1MDEyYyIrCi0gICAgIlw2N1x1MDEyZFwxXDIyNFwyXHUwMTFjXDFcdTAxMmVcMVwyMjRcMVx1MDExY1w0XDIyNFwxXHUwMTFjIisKLSAgICAiXDFcMjI0XDFcdTAxMWNcMlwyMjRcMVx1MDExY1wzXDIyNFwxXHUwMTJmXDJcMjI0XDFcdTAxMWMiKwotICAgICJcNTVcMjI0XDFcMjI1XDJcMFwxXHUwMTMwXDFcMjI1XDFcMFw0XDIyNVwxXDAiKwotICAgICJcMVwyMjVcMVwwXDJcMjI1XDFcMFw2XDIyNVwxXDBcNTVcMjI1XDFcdTAxMzEiKwotICAgICJcMVwwXDEwXHUwMTMxXDFcdTAxMzJcMlx1MDEzMVwxXHUwMTMzXDQ1XHUwMTMxXDFcdTAxMzNcMjBcdTAxMzEiKwotICAgICJcMVx1MDEzNFwxXDBcMVx1MDEzNFwyXHUwMTM1XDFcdTAxMzRcNFx1MDEzNVwyXHUwMTM0XDFcdTAxMzYiKwotICAgICJcMVx1MDEzN1wxXHUwMTM0XDRcdTAxMzVcMVx1MDEzNFwxMFx1MDEzNVwxXHUwMTM0XDI2XHUwMTM1XDFcdTAxMzciKwotICAgICJcMTBcdTAxMzVcMlx1MDEzNFw0XHUwMTM1XDJcdTAxMzRcMlwyMzFcMVwwXDEwM1wyMzFcMVwwIisKLSAgICAiXDE3XDIzMVwxXHUwMTM4XDJcMjMxXDFcdTAxMzlcNTZcMjMxXDFcMjM0XDJcMFwxXHUwMTNhIisKLSAgICAiXDFcMjM0XDFcMFw0XDIzNFwxXDBcMVwyMzRcMVwwXDJcMjM0XDFcMCIrCi0gICAgIlw2XDIzNFwxXDBcNTVcMjM0XDFcdTAxM2JcMVwwXDEwXHUwMTNiXDFcdTAxM2NcMlx1MDEzYiIrCi0gICAgIlwxXHUwMTNkXDQ1XHUwMTNiXDFcdTAxM2RcMjBcdTAxM2JcMVx1MDEzZVwxXDBcMVx1MDEzZVwyXHUwMTNmIisKLSAgICAiXDFcdTAxM2VcNFx1MDEzZlwyXHUwMTNlXDFcdTAxNDBcMVx1MDE0MVwxXHUwMTNlXDRcdTAxM2ZcMVx1MDEzZSIrCi0gICAgIlwxMFx1MDEzZlwxXHUwMTNlXDI2XHUwMTNmXDFcdTAxNDFcMTBcdTAxM2ZcMlx1MDEzZVw0XHUwMTNmXDJcdTAxM2UiKwotICAgICJcMlwyNDBcMVwwXDEwM1wyNDBcMVwwXDE3XDI0MFwxXHUwMTQyXDJcMjQwXDFcdTAxNDMiKwotICAgICJcNTZcMjQwXDIyXDBcMVwzNDBcMlwwXDFcMzU0XDY1XDBcMVx1MDE0NFw3NFwwIisKLSAgICAiXDFcMjUxXDFcMFwxMlwyNTFcMVwwXDFcdTAxNDVcNDVcMjUxXDFcdTAxNDVcMjBcMjUxIisKLSAgICAiXDNcMFwxXHUwMTQ2XDE2XDBcMVwzNTNcMlwwXDFcMzU0XDU2XDBcMVwyNTEiKwotICAgICJcMVwwXDNcMjUxXDFcMjUzXDZcMjUxXDFcMFwxXHUwMTQ1XDFcMjUxXDFcMjUzIisKLSAgICAiXDZcMjUxXDFcMjUzXDM0XDI1MVwxXHUwMTQ1XDM2XDI1MVwxXHUwMTQ3XDEwM1wyNTFcMVx1MDE0OCIrCi0gICAgIlw2NVwyNTFcMVwyNTdcMVwwXDEwXDI1N1wxXDBcMlwyNTdcMVx1MDE0OVw0NVwyNTciKwotICAgICJcMVx1MDE0OVwyMVwyNTdcMVwwXDNcMjU3XDFcMjYwXDRcMjU3XDFcMFwyXDI1NyIrCi0gICAgIlwxXHUwMTQ5XDFcMjU3XDFcMjYwXDZcMjU3XDFcMjYwXDM0XDI1N1wxXHUwMTQ5XDM2XDI1NyIrCi0gICAgIlwxXHUwMTRhXDEwM1wyNTdcMVx1MDE0Ylw2NVwyNTdcMTJcMjY0XDFcMFwxXDI2NFwxXDAiKwotICAgICJcMVx1MDE0Y1w2NVwyNjRcMVwwXDEyXDI2NFwxXDBcMVwyNjRcMVwwXDFcdTAxNGMiKwotICAgICJcNFwyNjRcMVx1MDE0ZFw2MFwyNjRcMVwwXDEyXDI2NFwxXDBcMVwyNjRcMVwwIisKLSAgICAiXDFcMjY0XDFcdTAxNGVcNjRcMjY0XDFcdTAxNGZcMTRcdTAxNTBcMVx1MDE1MVwxMDNcdTAxNTBcMVx1MDE1MSIrCi0gICAgIlw1XHUwMTUwXDFcdTAxNTJcMlx1MDE1MFwxXHUwMTUzXDU2XHUwMTUwXDEyXHUwMTU0XDFcdTAxNTVcMTAzXHUwMTU0IisKLSAgICAiXDFcdTAxNTVcN1x1MDE1NFwxXHUwMTU2XDJcdTAxNTRcMVx1MDE1N1w1Nlx1MDE1NFwxMlwzMDJcMVwwIisKLSAgICAiXDY3XDMwMlwxXHUwMTU4XDFcMFwxMlwzMDJcMVwwXDdcMzAyXDFcdTAxNTlcNTdcMzAyIisKLSAgICAiXDFcdTAxNThcMVwwXDEyXDMwMlwxXHUwMTVhXDcxXDMwMlwxNFwzMDZcMVwwXDY1XDMwNiIrCi0gICAgIlwxXHUwMTViXDFcMFwxNFwzMDZcMVwwXDVcMzA2XDFcdTAxNWNcNTdcMzA2XDFcdTAxNWIiKwotICAgICJcMVwwXDE0XDMwNlwxXHUwMTVkXDY3XDMwNlwxMlwzMTFcMVwwXDFcMzExXDFcMCIrCi0gICAgIlw2NlwzMTFcMVwwXDEyXDMxMVwxXDBcMVwzMTFcMVwwXDVcMzExXDFcdTAxNWUiKwotICAgICJcNjBcMzExXDFcMFwxMlwzMTFcMVwwXDFcMzExXDFcMFwxXDMxMVwxXHUwMTVmIisKLSAgICAiXDY0XDMxMVwxXDBcMTRcdTAxNjBcMVx1MDE2MVwxMDNcdTAxNjBcMVx1MDE2MVw1XHUwMTYwXDFcdTAxNjIiKwotICAgICJcMlx1MDE2MFwxXHUwMTYzXDU2XHUwMTYwXDEyXHUwMTY0XDFcdTAxNjVcMTAzXHUwMTY0XDFcdTAxNjVcN1x1MDE2NCIrCi0gICAgIlwxXHUwMTY2XDJcdTAxNjRcMVx1MDE2N1w1Nlx1MDE2NFwxMlwzMjdcMVwwXDY3XDMyN1wxXHUwMTY4IisKLSAgICAiXDFcMFwxMlwzMjdcMVwwXDdcMzI3XDFcdTAxNjlcNTdcMzI3XDFcdTAxNjhcMVwwIisKLSAgICAiXDEyXDMyN1wxXHUwMTZhXDcxXDMyN1wxNFwzMzNcMVwwXDY1XDMzM1wxXHUwMTZiXDFcMCIrCi0gICAgIlwxNFwzMzNcMVwwXDVcMzMzXDFcdTAxNmNcNTdcMzMzXDFcdTAxNmJcMVwwXDE0XDMzMyIrCi0gICAgIlwxXHUwMTZkXDY3XDMzM1w3XDBcMVx1MDE2ZVwxMVwwXDFcdTAxNmZcM1wwXDFcdTAxNzAiKwotICAgICJcMjJcMFwxXHUwMTcxXDQyXDBcMVx1MDE3MlwyNFwwXDFcdTAxNzNcNTRcMFwxXDM0MiIrCi0gICAgIlwyXDBcMlx1MDE3NFw1XDBcMVwzNDJcNlwwXDFcMzQyXDVcdTAxNzRcMVwwIisKLSAgICAiXDEzXHUwMTc0XDFcMFwxMlx1MDE3NFwxXDBcNFx1MDE3NFwxXDBcNFx1MDE3NFwxXDAiKwotICAgICJcNFx1MDE3NFwyXDBcMVx1MDE3NVwxXDBcM1x1MDE3NVwxXHUwMTc2XDRcMzQzXDFcdTAxNzUiKwotICAgICJcMVwwXDNcdTAxNzVcMVx1MDE3NlwxXDM0M1wxXHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzYiKwotICAgICJcNVwzNDNcMVx1MDE3NVwxM1wzNDNcMVx1MDE3NVwxMlwzNDNcMVx1MDE3NVw0XDM0M1wxXHUwMTc3IisKLSAgICAiXDExXDM0M1wyXHUwMTc1XDIwXDBcMVx1MDE3OFw3XDBcMVx1MDE3OVw3MFwwXDFcMzQ2IisKLSAgICAiXDY2XDBcMTAzXDM0N1wxXHUwMTdhXDFcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3Nlw0XDM1MCIrCi0gICAgIlwxXHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzZcMVwzNTBcMVx1MDE3NVwxXDBcM1x1MDE3NSIrCi0gICAgIlwxXHUwMTc2XDVcMzUwXDFcdTAxNzVcMTNcMzUwXDFcdTAxNzVcMTJcMzUwXDFcdTAxNzVcNFwzNTAiKwotICAgICJcMVx1MDE3YlwxMVwzNTBcMlx1MDE3NVwxMDNcMzUxXDFcdTAxN2NcNjNcMFwxXDM1MlwyN1wwIisKLSAgICAiXDFcdTAxNmVcMTVcMFwxXHUwMTcwXDIyXDBcMVx1MDE3MVw2N1wwXDFcdTAxNzNcNTFcMCIrCi0gICAgIlwxXHUwMTdkXDEwM1wwXDFcdTAxN2VcMTA3XDBcNFwxMTNcNlwwXDFcMTEzXDZcMCIrCi0gICAgIlwzXDExM1wyXHUwMTdmXDFcMFwxM1wxMTNcMVwwXDEyXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDExXDExM1wxMFwwXDRcMTEzXDZcMFwxXDExM1w2XDBcNVwxMTMiKwotICAgICJcMVwwXDEzXDExM1wxXDBcMlwxMTNcMVx1MDE4MFw3XDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDZcMTEzXDFcdTAxODBcMlwxMTNcMlwwXDEyXDM2NVwxXDM2NlwzXDM2NSIrCi0gICAgIlwxXDBcNjVcMzY1XDE0XDM3MFwxXDM2NlwxXDM3MFwxXDBcNjVcMzcwXDFcMzc1IisKLSAgICAiXDFcMFwxMFwzNzVcMVwzNzdcMlwzNzVcMVx1MDE4MVw0NVwzNzVcMVx1MDE4MVwyMFwzNzUiKwotICAgICJcMVwxNDFcMlwzNzVcMVwzNzZcMVwxNDFcMVwzNzVcNFwxNDFcMVwzNzdcMVwxNDEiKwotICAgICJcMVwzNzVcMVwxNDFcMVwxMzdcMVwzNzVcNlwxNDFcMVwzNzVcNTVcMTQxXDFcdTAxMDEiKwotICAgICJcMVwwXDEyXHUwMTAxXDFcMzc3XDFcdTAxODJcNDVcdTAxMDFcMVx1MDE4MlwyMFx1MDEwMVwxXDE0MiIrCi0gICAgIlwyXHUwMTAxXDFcdTAxMDJcMVwxNDJcMVx1MDEwMVw0XDE0MlwxXHUwMTAxXDFcMTQyXDFcMzc3IisKLSAgICAiXDFcMTQyXDFcMTM3XDFcdTAxMDFcNlwxNDJcMVx1MDEwMVw1NVwxNDJcMTJcdTAxMDhcMVx1MDEwOSIrCi0gICAgIlwzXHUwMTA4XDFcMFw2NVx1MDEwOFwxNFx1MDEwYlwxXHUwMTA5XDFcdTAxMGJcMVwwXDY1XHUwMTBiIisKLSAgICAiXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDZcMTY2XDFcdTAxODNcMlwxNjYiKwotICAgICJcMTBcMFw0XHUwMTBmXDZcMFwxXHUwMTBmXDZcMFw1XHUwMTBmXDFcMFwxM1x1MDEwZiIrCi0gICAgIlwxXDBcMTJcdTAxMGZcMVwwXDRcdTAxMGZcMVwwXDExXHUwMTBmXDEwXDBcNFx1MDExMSIrCi0gICAgIlw2XDBcMVx1MDExMVw2XDBcNVx1MDExMVwxXDBcMTNcdTAxMTFcMVwwXDEyXHUwMTExIisKLSAgICAiXDFcMFw0XHUwMTExXDFcMFwxMVx1MDExMVwyXDBcMTJcdTAxMTJcMVx1MDExM1wzXHUwMTEyIisKLSAgICAiXDFcMFw2NVx1MDExMlwxNFx1MDExNVwxXHUwMTEzXDFcdTAxMTVcMVwwXDY1XHUwMTE1XDFcdTAxODQiKwotICAgICJcMlx1MDE4NVwxXHUwMTg2XDFcdTAxODRcMVx1MDE4NVw0XHUwMTg0XDFcdTAxODVcMVx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDJcdTAxODRcMVx1MDE4NVw2XHUwMTg0XDFcdTAxODVcNTRcdTAxODRcMVwxNzNcMVx1MDE4N1wyXHUwMTg4IisKLSAgICAiXDFcdTAxODlcMVx1MDE4N1wxXHUwMTg4XDRcdTAxODdcMVx1MDE4OFwxXHUwMTg3XDFcdTAxODhcMlx1MDE4NyIrCi0gICAgIlwxXHUwMTg4XDZcdTAxODdcMVx1MDE4OFw1NFx1MDE4N1wxXDE3M1wzNVwwXDFcdTAxOGFcMzRcMCIrCi0gICAgIlwxXHUwMThhXDUxXDBcMVx1MDE4YlwxNFwwXDFcdTAxOGJcNzBcMFwxXHUwMThjXDExXDAiKwotICAgICJcMVx1MDE4Y1w3M1wwXDFcdTAxOGRcMTdcMFwxXHUwMThkXDExMFwwXDFcdTAxOGVcN1wwIisKLSAgICAiXDFcdTAxOGVcMlwwXDEyXHUwMTIxXDFcdTAxMjJcM1x1MDEyMVwxXDBcNjVcdTAxMjFcMVx1MDEyNCIrCi0gICAgIlwxXDBcMTJcdTAxMjRcMVx1MDEyMlwxXHUwMThmXDQ1XHUwMTI0XDFcdTAxOGZcMjFcdTAxMjRcMVwwIisKLSAgICAiXDEyXHUwMTI0XDFcdTAxOTBcMVx1MDE4Zlw0NVx1MDEyNFwxXHUwMThmXDIwXHUwMTI0XDE0XDBcMVx1MDE5MSIrCi0gICAgIlw2N1wwXDE0XHUwMTI0XDFcdTAxOTBcMVx1MDEyNFwxXDBcNjVcdTAxMjRcMTJcdTAxMzFcMVx1MDEzMiIrCi0gICAgIlwzXHUwMTMxXDFcMFw2NVx1MDEzMVwxXHUwMTM0XDFcMFwxMlx1MDEzNFwxXHUwMTMyXDFcdTAxOTIiKwotICAgICJcNDVcdTAxMzRcMVx1MDE5MlwyMVx1MDEzNFwxXDBcMTJcdTAxMzRcMVx1MDE5M1wxXHUwMTkyXDQ1XHUwMTM0IisKLSAgICAiXDFcdTAxOTJcMjBcdTAxMzRcMTRcMFwxXHUwMTk0XDY3XDBcMTRcdTAxMzRcMVx1MDE5M1wxXHUwMTM0IisKLSAgICAiXDFcMFw2NVx1MDEzNFwyXDIzMVwxXDBcNFwyMzFcMVx1MDE5NVwxNVwyMzFcMVx1MDE5NiIrCi0gICAgIlwyMlwyMzFcMVx1MDE5N1wzNVwyMzFcMVwwXDMxXDIzMVwxXHUwMTk4XDQ3XDIzMVwxMlx1MDEzYiIrCi0gICAgIlwxXHUwMTNjXDNcdTAxM2JcMVwwXDY1XHUwMTNiXDFcdTAxM2VcMVwwXDEyXHUwMTNlXDFcdTAxM2MiKwotICAgICJcMVx1MDE5OVw0NVx1MDEzZVwxXHUwMTk5XDIxXHUwMTNlXDFcMFwxMlx1MDEzZVwxXHUwMTlhXDFcdTAxOTkiKwotICAgICJcNDVcdTAxM2VcMVx1MDE5OVwyMFx1MDEzZVwxNFwwXDFcdTAxOWJcNjdcMFwxNFx1MDEzZVwxXHUwMTlhIisKLSAgICAiXDFcdTAxM2VcMVwwXDY1XHUwMTNlXDJcMjQwXDFcMFw0XDI0MFwxXHUwMTljXDE1XDI0MCIrCi0gICAgIlwxXHUwMTlkXDIyXDI0MFwxXHUwMTllXDM1XDI0MFwxXDBcMzFcMjQwXDFcdTAxOWZcNDdcMjQwIisKLSAgICAiXDIyXDBcMVx1MDFhMFw2MVwwXDE2XDI1MVwxXDBcNjVcMjUxXDE2XDI1N1wxXDAiKwotICAgICJcNjVcMjU3XDEyXDI2NFwxXDBcMVwyNjRcMVwwXDFcMjY0XDFcdTAxYTFcNjRcMjY0IisKLSAgICAiXDFcdTAxNGZcN1wyNjRcMVx1MDFhMlwyXDI2NFwxXDBcMVwyNjRcMVwwXDFcdTAxNGMiKwotICAgICJcN1wyNjRcMVx1MDFhM1wyMlwyNjRcMVx1MDFhNFwzMlwyNjRcMVwwXDEyXHUwMWExXDFcMCIrCi0gICAgIlwxXHUwMWExXDFcMFw2Nlx1MDFhMVwxXDBcMTJcdTAxNGZcMVwwXDFcdTAxNGZcMVwwIisKLSAgICAiXDFcdTAxYTVcNjVcdTAxNGZcMVwwXDdcdTAxNTBcMVx1MDFhNlw0XHUwMTUwXDFcdTAxNTFcMTBcdTAxNTAiKwotICAgICJcMVx1MDFhN1wyMlx1MDE1MFwxXHUwMWE4XDQ3XHUwMTUwXDFcdTAxNTFcMTdcdTAxNTBcMVx1MDFhOVw0N1x1MDE1MCIrCi0gICAgIlw3XHUwMTU0XDFcdTAxYWFcMlx1MDE1NFwxXHUwMTU1XDEyXHUwMTU0XDFcdTAxYWJcMjJcdTAxNTRcMVx1MDFhYyIrCi0gICAgIlw0NVx1MDE1NFwxXHUwMTU1XDIxXHUwMTU0XDFcdTAxYWRcNDdcdTAxNTRcMTJcMzAyXDFcMFwxMDBcMzAyIisKLSAgICAiXDFcdTAxYWVcMlwzMDJcMVwwXDEyXDMwMlwxXHUwMWFmXDIyXDMwMlwxXHUwMWIwXDMxXDMwMiIrCi0gICAgIlwxXHUwMTU4XDFcMFwxMDJcdTAxYjFcMVx1MDFiMlwxXHUwMWIxXDE0XDMwNlwxXDBcNzZcMzA2IisKLSAgICAiXDFcdTAxYjNcNFwzMDZcMVwwXDEwXDMwNlwxXHUwMWI0XDIyXDMwNlwxXHUwMWI1XDMxXDMwNiIrCi0gICAgIlwxXHUwMTViXDFcMFwxMDJcdTAxYjZcMVx1MDFiN1wxXHUwMWI2XDdcMzExXDFcdTAxYjhcMlwzMTEiKwotICAgICJcMVwwXDFcMzExXDFcMFwxMFwzMTFcMVx1MDFiOVwyMlwzMTFcMVx1MDFiYVwzMlwzMTEiKwotICAgICJcMVwwXDdcdTAxNjBcMVx1MDFiYlw0XHUwMTYwXDFcdTAxNjFcMTBcdTAxNjBcMVx1MDFiY1wyMlx1MDE2MCIrCi0gICAgIlwxXHUwMWJkXDQ3XHUwMTYwXDFcdTAxNjFcMTdcdTAxNjBcMVx1MDFiZVw0N1x1MDE2MFw3XHUwMTY0XDFcdTAxYmYiKwotICAgICJcMlx1MDE2NFwxXHUwMTY1XDEyXHUwMTY0XDFcdTAxYzBcMjJcdTAxNjRcMVx1MDFjMVw0NVx1MDE2NFwxXHUwMTY1IisKLSAgICAiXDIxXHUwMTY0XDFcdTAxYzJcNDdcdTAxNjRcMTJcMzI3XDFcMFwxMDBcMzI3XDFcdTAxYzNcMlwzMjciKwotICAgICJcMVwwXDEyXDMyN1wxXHUwMWM0XDIyXDMyN1wxXHUwMWM1XDMxXDMyN1wxXHUwMTY4XDFcMCIrCi0gICAgIlwxMDJcdTAxYzZcMVx1MDFjN1wxXHUwMWM2XDE0XDMzM1wxXDBcNzZcMzMzXDFcdTAxYzhcNFwzMzMiKwotICAgICJcMVwwXDEwXDMzM1wxXHUwMWM5XDIyXDMzM1wxXHUwMWNhXDMxXDMzM1wxXHUwMTZiXDFcMCIrCi0gICAgIlwxMDJcdTAxY2JcMVx1MDFjY1wxXHUwMWNiXDdcMFwxXHUwMWNkXDEwM1wwXDFcdTAxY2VcMTMxXDAiKwotICAgICJcMVx1MDFjZlw0NlwwXDFcdTAxNzRcMVwwXDExXHUwMTc0XDFcMFw2XHUwMTc0XDFcMCIrCi0gICAgIlw2MVx1MDE3NFwxXHUwMTc1XDFcMFwxMVx1MDE3NVwxXDBcNlx1MDE3NVwxXDBcNDVcdTAxNzUiKwotICAgICJcMVwwXDE0XHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzZcNVx1MDE3NVwxXDBcM1x1MDE3NSIrCi0gICAgIlwxXHUwMTc2XDJcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3Nlw0MVx1MDE3NVwxXHUwMWQwXDEzXHUwMTc1IisKLSAgICAiXDIwXDBcMVx1MDE3OFw0N1wwXDFcdTAxZDFcMzNcMFwxXHUwMWQyXDE0XDBcM1x1MDFkMiIrCi0gICAgIlwyXDBcMVx1MDFkMlwxMVwwXDFcdTAxZDJcMVwwXDJcdTAxZDJcNlwwXDFcdTAxZDIiKwotICAgICJcMlwwXDJcdTAxZDJcNlwwXDFcdTAxZDJcMTBcMFw0XDExM1w2XDBcMVwxMTMiKwotICAgICJcNlwwXDVcMTEzXDFcMFwxMVwxMTNcMVx1MDFkM1wxXDExM1wxXDBcMVx1MDFkMyIrCi0gICAgIlwxMVwxMTNcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMlwwXDEyXDM3NVwxXDM3NyIrCi0gICAgIlwzXDM3NVwxXDBcNjVcMzc1XDE0XHUwMTAxXDFcMzc3XDFcdTAxMDFcMVwwXDY1XHUwMTAxIisKLSAgICAiXDZcMFwzXDE2NlwxXHUwMWQ0XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXHUwMTg0XDJcdTAxODVcMVx1MDE4NlwxXHUwMTg0XDFcdTAxODVcNFx1MDE4NFwxXHUwMTg1XDFcdTAxODQiKwotICAgICJcMVx1MDE4NVwyXHUwMTg0XDFcdTAxODVcNlx1MDE4NFwxXHUwMTg1XDU0XHUwMTg0XDFcdTAxZDVcMTAzXHUwMTg1IisKLSAgICAiXDFcdTAxZDZcMVx1MDE4N1wyXHUwMTg4XDFcdTAxODlcMVx1MDE4N1wxXHUwMTg4XDRcdTAxODdcMVx1MDE4OCIrCi0gICAgIlwxXHUwMTg3XDFcdTAxODhcMlx1MDE4N1wxXHUwMTg4XDZcdTAxODdcMVx1MDE4OFw1NFx1MDE4N1wxXHUwMWQ1IisKLSAgICAiXDEwM1x1MDE4OFwxXHUwMWQ3XDQwXDBcMVx1MDFkOFwxNFwwXDFcdTAxZDhcNjBcMFwyXHUwMWQ5IisKLSAgICAiXDEwMVwwXDFcdTAxZGFcMTEyXDBcMVx1MDFkYlwxNFwwXDFcdTAxZGJcNjBcMFwyXHUwMWRjIisKLSAgICAiXDUwXDBcMTRcdTAxMjRcMVx1MDEyMlwxXHUwMTI0XDFcMFw2NVx1MDEyNFwzXDBcMlx1MDFkZCIrCi0gICAgIlwxXDBcNFx1MDFkZFwyXDBcMVx1MDEyNlwxXHUwMWRkXDFcMFw0XHUwMWRkXDFcMCIrCi0gICAgIlwxMFx1MDFkZFwxXDBcMzdcdTAxZGRcMlwwXDRcdTAxZGRcMlwwXDE0XHUwMTM0XDFcdTAxMzIiKwotICAgICJcMVx1MDEzNFwxXDBcNjVcdTAxMzRcM1wwXDJcdTAxZGVcMVwwXDRcdTAxZGVcMlwwIisKLSAgICAiXDFcdTAxMzZcMVx1MDFkZVwxXDBcNFx1MDFkZVwxXDBcMTBcdTAxZGVcMVwwXDM3XHUwMWRlIisKLSAgICAiXDJcMFw0XHUwMWRlXDJcMFwyXDIzMVwxXDBcNFwyMzFcMVx1MDFkZlw3NlwyMzEiKwotICAgICJcMVwwXDMyXDIzMVwxXHUwMWUwXDQ2XDIzMVwxNFx1MDEzZVwxXHUwMTNjXDFcdTAxM2VcMVwwIisKLSAgICAiXDY1XHUwMTNlXDNcMFwyXHUwMWUxXDFcMFw0XHUwMWUxXDJcMFwxXHUwMTQwXDFcdTAxZTEiKwotICAgICJcMVwwXDRcdTAxZTFcMVwwXDEwXHUwMWUxXDFcMFwzN1x1MDFlMVwyXDBcNFx1MDFlMSIrCi0gICAgIlwyXDBcMlwyNDBcMVwwXDRcMjQwXDFcdTAxZTJcNzZcMjQwXDFcMFwzMlwyNDAiKwotICAgICJcMVx1MDFlM1w0NlwyNDBcMlwwXDFcdTAxZTRcMTAxXDBcN1wyNjRcMVx1MDFlNVwyXDI2NCIrCi0gICAgIlwxXDBcMVwyNjRcMVwwXDFcdTAxNGNcNjVcMjY0XDFcMFwxMlx1MDE0ZlwxXDAiKwotICAgICJcMVx1MDE0ZlwxXDBcMVx1MDE0ZlwxXDBcNjVcdTAxNGZcN1x1MDE1MFwxXHUwMWU2XDRcdTAxNTAiKwotICAgICJcMVx1MDE1MVwxMDNcdTAxNTBcMVx1MDE1MVwyMFx1MDE1MFwxXHUwMWU3XDQ2XHUwMTUwXDdcdTAxNTRcMVx1MDFlOCIrCi0gICAgIlwyXHUwMTU0XDFcdTAxNTVcMTAzXHUwMTU0XDFcdTAxNTVcMjJcdTAxNTRcMVx1MDFlOVw0Nlx1MDE1NFw3XDMwMiIrCi0gICAgIlwxXHUwMWVhXDJcMzAyXDFcMFw2N1wzMDJcMVx1MDE1OFwxXDBcMTJcdTAxZWJcMVx1MDFlYyIrCi0gICAgIlw3MFx1MDFlYlwxXDBcN1wzMDZcMVx1MDFlZFw0XDMwNlwxXDBcNjVcMzA2XDFcdTAxNWIiKwotICAgICJcMVwwXDE0XHUwMWVlXDFcdTAxZWNcNjZcdTAxZWVcMVwwXDdcMzExXDFcdTAxZWZcMlwzMTEiKwotICAgICJcMVwwXDFcMzExXDFcMFw2NlwzMTFcMVwwXDdcdTAxNjBcMVx1MDFmMFw0XHUwMTYwIisKLSAgICAiXDFcdTAxNjFcMTAzXHUwMTYwXDFcdTAxNjFcMjBcdTAxNjBcMVx1MDFmMVw0Nlx1MDE2MFw3XHUwMTY0XDFcdTAxZjIiKwotICAgICJcMlx1MDE2NFwxXHUwMTY1XDEwM1x1MDE2NFwxXHUwMTY1XDIyXHUwMTY0XDFcdTAxZjNcNDZcdTAxNjRcN1wzMjciKwotICAgICJcMVx1MDFmNFwyXDMyN1wxXDBcNjdcMzI3XDFcdTAxNjhcMVwwXDEyXHUwMWY1XDFcdTAxZjYiKwotICAgICJcNzBcdTAxZjVcMVwwXDdcMzMzXDFcdTAxZjdcNFwzMzNcMVwwXDY1XDMzM1wxXHUwMTZiIisKLSAgICAiXDFcMFwxNFx1MDFmOFwxXHUwMWY2XDY2XHUwMWY4XDM3XDBcMVx1MDFmOVwxMzVcMFwxXHUwMWQwIisKLSAgICAiXDMzXDBcMVx1MDFkMlwxNFwwXDNcdTAxZDJcMlwwXDFcdTAxZDJcMTFcMFwxXHUwMWQyIisKLSAgICAiXDFcMFwyXHUwMWQyXDZcMFwxXHUwMWQyXDFcMFwxXHUwMWQxXDJcdTAxZDJcNlwwIisKLSAgICAiXDFcdTAxZDJcMTBcMFw0XDExM1w2XDBcMVwxMTNcNlwwXDVcMTEzXDFcMCIrCi0gICAgIlw2XDExM1wxXHUwMWZhXDRcMTEzXDFcMFwxMlwxMTNcMVwwXDFcMTEzXDFcdTAxZmEiKwotICAgICJcMlwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDZcMTY2XDFcdTAxZmJcNFwxNjZcMVwwXDZcMTY2XDFcdTAxZmMiKwotICAgICJcM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNTRcMFwxXHUwMWZkXDc2XDAiKwotICAgICJcMVx1MDFmZVwxM1wwXDFcdTAxZmVcNjRcMFwxXHUwMWZmXDExXDBcMVx1MDFmZlw3MVwwIisKLSAgICAiXDFcdTAyMDBcMTFcMFwxXHUwMjAwXDc0XDBcMVx1MDIwMVwxM1wwXDFcdTAyMDFcMjJcMCIrCi0gICAgIlwyXDIzMVwxXDBcMzNcMjMxXDFcdTAyMDJcNDVcMjMxXDJcMjQwXDFcMFwzM1wyNDAiKwotICAgICJcMVx1MDIwM1w0NVwyNDBcMTRcdTAxNTBcMVx1MDE1MVwyMVx1MDE1MFwxXHUwMjA0XDQ1XHUwMTUwXDEyXHUwMTU0IisKLSAgICAiXDFcdTAxNTVcMjNcdTAxNTRcMVx1MDIwNVw0NVx1MDE1NFwxMlx1MDFlYlwxXHUwMWIxXDY3XHUwMWViXDFcdTAyMDYiKwotICAgICJcMVx1MDFiMVwxNFx1MDFlZVwxXHUwMWI2XDY1XHUwMWVlXDFcdTAyMDdcMVx1MDFiNlwxNFx1MDE2MFwxXHUwMTYxIisKLSAgICAiXDIxXHUwMTYwXDFcdTAyMDhcNDVcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyM1x1MDE2NFwxXHUwMjA5XDQ1XHUwMTY0IisKLSAgICAiXDEyXHUwMWY1XDFcdTAxYzZcNjdcdTAxZjVcMVx1MDIwYVwxXHUwMWM2XDE0XHUwMWY4XDFcdTAxY2JcNjVcdTAxZjgiKwotICAgICJcMVx1MDIwYlwxXHUwMWNiXDM3XDBcMVx1MDIwY1w1MlwwXDRcMTEzXDZcMFwxXDExMyIrCi0gICAgIlw2XDBcNVwxMTNcMVwwXDNcMTEzXDFcdTAyMGRcN1wxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcdTAyMGRcNVwxMTNcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMVwxNjZcMVx1MDIwZVwxXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyMGZcMlwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw1NVwwXDFcdTAyMTAiKwotICAgICJcMjNcMFwxXHUwMjEwXDUwXDBcMVx1MDIxMVwxN1wwXDFcdTAyMTFcNjZcMFwxXHUwMjEyIisKLSAgICAiXDEyXDBcMVx1MDIxMlw1MlwwXDFcdTAyMTNcMTA3XDBcMVx1MDIxNFwzNFwwXDFcdTAyMTQiKwotICAgICJcMTFcMFwyXDIzMVwxXDBcMzRcMjMxXDFcdTAyMTVcNDRcMjMxXDJcMjQwXDFcMCIrCi0gICAgIlwzNFwyNDBcMVx1MDIxNlw0NFwyNDBcMTRcdTAxNTBcMVx1MDE1MVwyMlx1MDE1MFwxXHUwMjE3XDQ0XHUwMTUwIisKLSAgICAiXDEyXHUwMTU0XDFcdTAxNTVcMjRcdTAxNTRcMVx1MDIxOFw0NFx1MDE1NFwxMlx1MDFlYlwxXHUwMjE5XDY3XHUwMWViIisKLSAgICAiXDFcdTAyMDZcMVx1MDFiMVwxNFx1MDFlZVwxXHUwMjFhXDY1XHUwMWVlXDFcdTAyMDdcMVx1MDFiNlwxNFx1MDE2MCIrCi0gICAgIlwxXHUwMTYxXDIyXHUwMTYwXDFcdTAyMWJcNDRcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyNFx1MDE2NFwxXHUwMjFjIisKLSAgICAiXDQ0XHUwMTY0XDEyXHUwMWY1XDFcdTAyMWRcNjdcdTAxZjVcMVx1MDIwYVwxXHUwMWM2XDE0XHUwMWY4XDFcdTAyMWUiKwotICAgICJcNjVcdTAxZjhcMVx1MDIwYlwxXHUwMWNiXDQwXDBcMVx1MDIxZlw1MVwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDExXDE2NlwxXHUwMjIwXDFcMTY2XDFcMCIrCi0gICAgIlwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDVcMTY2XDFcMFw2XDE2NlwxXHUwMjIxXDRcMTY2XDFcMCIrCi0gICAgIlwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNDRcMFwxXHUwMjIyXDExXDAiKwotICAgICJcMVx1MDIyMlw2N1wwXDFcdTAyMjNcMTRcMFwxXHUwMjIzXDY2XDBcMVx1MDIyNFwxNFwwIisKLSAgICAiXDFcdTAyMjRcMjZcMFwyXDIzMVwxXDBcMzVcMjMxXDFcdTAyMjVcNDNcMjMxXDJcMjQwIisKLSAgICAiXDFcMFwzNVwyNDBcMVx1MDIyNlw0M1wyNDBcMTRcdTAxNTBcMVx1MDE1MVwyM1x1MDE1MFwxXHUwMjI3IisKLSAgICAiXDQzXHUwMTUwXDEyXHUwMTU0XDFcdTAxNTVcMjVcdTAxNTRcMVx1MDIyOFw0M1x1MDE1NFwxNFx1MDE2MFwxXHUwMTYxIisKLSAgICAiXDIzXHUwMTYwXDFcdTAyMjlcNDNcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyNVx1MDE2NFwxXHUwMjJhXDQzXHUwMTY0IisKLSAgICAiXDM3XDBcMVx1MDIyYlw1MlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDIyY1w1XDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDVcMTY2XDFcdTAyMmRcNVwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwyXDBcMlwyMzFcMVwwXDM0XDIzMVwxXHUwMjJlXDQ0XDIzMSIrCi0gICAgIlwyXDI0MFwxXDBcMzRcMjQwXDFcdTAyMmZcNDRcMjQwXDE0XHUwMTUwXDFcdTAxNTFcMjJcdTAxNTAiKwotICAgICJcMVx1MDIzMFw0NFx1MDE1MFwxMlx1MDE1NFwxXHUwMTU1XDI0XHUwMTU0XDFcdTAyMzFcNDRcdTAxNTRcMTRcdTAxNjAiKwotICAgICJcMVx1MDE2MVwyMlx1MDE2MFwxXHUwMjMyXDQ0XHUwMTYwXDEyXHUwMTY0XDFcdTAxNjVcMjRcdTAxNjRcMVx1MDIzMyIrCi0gICAgIlw0NFx1MDE2NFwzNFwwXDFcdTAyMzRcNTVcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDFcMTY2XDFcdTAyMzVcN1wxNjZcMlwwXDJcMjMxXDFcMFwzMVwyMzFcMVx1MDIzNiIrCi0gICAgIlw0N1wyMzFcMlwyNDBcMVwwXDMxXDI0MFwxXHUwMjM3XDQ3XDI0MFwxNFx1MDE1MFwxXHUwMTUxIisKLSAgICAiXDE3XHUwMTUwXDFcdTAyMzhcNDdcdTAxNTBcMTJcdTAxNTRcMVx1MDE1NVwyMVx1MDE1NFwxXHUwMjM5XDQ3XHUwMTU0IisKLSAgICAiXDE0XHUwMTYwXDFcdTAxNjFcMTdcdTAxNjBcMVx1MDIzYVw0N1x1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDIxXHUwMTY0IisKLSAgICAiXDFcdTAyM2JcNDdcdTAxNjRcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDIzY1w1XDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDEwXDE2NlwxXHUwMjNkXDJcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXHUwMjNlXDZcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFw1XDE2NlwxXHUwMjNmXDVcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMlwwXDZcdTAyNDBcNFx1MDI0MVw2XHUwMjQwXDFcdTAyNDFcNVx1MDI0MCIrCi0gICAgIlwxXDBcNVx1MDI0MVwxXHUwMjQwXDEzXHUwMjQxXDFcdTAyNDBcMTJcdTAyNDFcMVx1MDI0MFw0XHUwMjQxIisKLSAgICAiXDFcdTAyNDBcMTFcdTAyNDFcMlx1MDI0MFw0MVwwXDFcdTAyNDJcM1wwXDFcdTAyNDNcN1wwIisKLSAgICAiXDFcdTAyNDRcMVx1MDI0NVwyMFwwXDFcdTAyNDZcMTJcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFw0XDE2NlwxXHUwMjQ3XDNcMTY2XDFcdTAyNDhcMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcdTAyNDlcMVx1MDI0YVw0XDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDZcMTY2XDFcdTAyNGJcMlwxNjZcNjBcMFwxXHUwMjRjXDc0XDBcMVx1MDI0ZFwxMTJcMCIrCi0gICAgIlwxXHUwMjRlXDEwMlwwXDFcdTAyNGZcMTA0XDBcMVx1MDI1MFwzM1wwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI1MSIrCi0gICAgIlw0XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEyXDE2NlwxXHUwMjUyXDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2XDFcdTAyNTNcNFwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNTRcNVwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2XDFcdTAyNTVcNFwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNDVcMFwxXHUwMjU2XDEzMlwwXDFcdTAyNTciKwotICAgICJcMTA0XDBcMVx1MDI1OFw2NVwwXDFcdTAyNTlcMTIxXDBcMVx1MDI1YVwxNlwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDZcMTY2XDFcdTAyNWJcNFwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMVwxNjZcMVx1MDI1Y1w3XDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMlwxNjZcMVx1MDI1ZFw2XDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVx1MDI1ZVw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMlwxNjZcMVx1MDI1Zlw2XDE2Nlw0N1wwXDFcdTAyNjAiKwotICAgICJcNzFcMFwxXHUwMjYxXDEwM1wwXDFcdTAyNjJcMTEzXDBcMVx1MDI2M1wxMDJcMFwxXHUwMjY0IisKLSAgICAiXDQ3XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2IisKLSAgICAiXDFcdTAyNjVcMlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNFwxNjZcMVx1MDI2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDRcMTY2XDFcdTAyNjdcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNlwxNjZcMVx1MDI2OFw0XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNVwxNjZcMVx1MDI2OVw1XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDYwXDBcMVx1MDI2YSIrCi0gICAgIlwxMjVcMFwxXHUwMjZiXDUwXDBcMVx1MDI2Y1wxMDNcMFwxXHUwMjZkXDQ0XDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw1XDE2NiIrCi0gICAgIlwxXHUwMjZlXDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFw3XDE2NlwxXHUwMjZmXDFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyNzBcMlwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEwXDE2NlwxXHUwMjcxXDJcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTAzXDBcMVx1MDI3MiIrCi0gICAgIlw2MVwwXDFcdTAyNWFcMTI1XDBcMVx1MDI2NFwxMDNcMFwxXHUwMjczXDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMFwxNjZcMVx1MDI3NFwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNlwxNjZcMVx1MDI1ZiIrCi0gICAgIlwzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTBcMTY2XDFcdTAyNjlcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDEwXDE2NlwxXHUwMjc1XDM1XDBcMVx1MDI1YVwxNTBcMFwxXHUwMjc2XDExXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw0XDE2NlwxXHUwMjVmXDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcN1wxNjZcMVx1MDI3N1wxXDE2Nlw1N1wwXDFcdTAyNWEiKwotICAgICJcMzRcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcdTAyNWZcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwIjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDksICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgOSwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsIAotICAgICAzLCAgMywgIDMsICAzLCAgOSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDksICAxLCAgMiwgIDEsICAyLCAgMSwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsIAotICAgICAwLCAgMCwgIDEsICA5LCAgMCwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDksICAwLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMiwgCi0gICAgMTMsICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIAotICAgIDEzLCAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDksICA5LCAKLSAgICAgOSwgIDAsICAwLCAgMSwgIDEsICAxLCAgOSwgIDAsICAwLCAxMywgIDksIDEzLCAgOSwgIDksICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDMsICAyLCAgMiwgIDMsICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAyLCAgMywgIDMsICAyLCAgMiwgIDMsICAzLCAgMiwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAyLCAgMywgIDMsICAyLCAgMiwgIDMsIAotICAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDAsICAxLCAKLSAgICAgOSwgIDAsICAxLCAgMSwgIDUsIDEzLCAxMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDksICAxLCAgMywgIDIsICAzLCAgMiwgIDEsICAwLCAgOSwgIDEsICAwLCAgMSwgIDMsIAotICAgICAyLCAgMywgIDIsICAxLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDEsICAxLCAgMiwgIDIsICAwLCAgMCwgIDIsICAyLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgCi0gICAgIDAsICAwLCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgMCwgIDEsIAotICAgICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMCwgIDEsICAxLCAgMSwgIDEsICAyLCAKLSAgICAgMiwgIDIsICAyLCAgOSwgIDEsICAxLCAgMSwgIDMsICAzLCAgMywgIDMsICAxLCAgMSwgIDEsICAxLCAgMCwgCi0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7Ci0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkCi0JcHJpdmF0ZSBTdHJpbmcgZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IHN0YXRlIHRvIGVudGVyIG9uY2UgYW4gZW1iZWRkZWQgcmVnaW9uIGhhcwotCS8vICAgYmVlbiBjb21wbGV0ZWQKLQlwcml2YXRlIGludCBmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JLy8gdGhlIGNvbnRhaW5lciB1c2VkIHRvIGNyZWF0ZSBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTlRFWFQgPSAiUFJPWFlfQ09OVEVYVCI7Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncwotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOwotCQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGluc2lkZSBvZiBhbiBlbWJlZGRlZCByZWdpb24KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGludGVybmFsQ29udGV4dCA9IG51bGw7Ci0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMKLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JcHJpdmF0ZSBMaXN0IGZOZXN0YWJsZVByZWZpeGVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkKLQkvLyB3aGVyZSB0aGUgbGFzdCBpbnRlcm5hbCBjb250YWluZXIgYmxvY2sgd2FzIGZvdW5kCi0JcHJpdmF0ZSBpbnQgZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsKLQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcKLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGZGb3JiaWRKU1AgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGludCBmRUxsZXZlbCA9IDA7Ci0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJCXJldHVybjsKLQkJZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7Ci0JCWZOZXN0YWJsZVByZWZpeGVzLmFkZChtYXJrZXIpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0YWJsZShTdHJpbmcgdGFnTmFtZSkgewotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQkvLwlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcilibG9ja3MubmV4dCgpOwotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7Ci0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7Ci0JCS8vCQlyZXR1cm4gbWFya2VyLmlzR2xvYmFsKCkgfHwgZ2V0T2Zmc2V0KCkgPj0gbWFya2VyLmdldE1hcmtlcigpLmdldFN0YXJ0KCk7Ci0JCS8vCX0KLQkJLy99Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlTmVzdGFibGVQcmVmaXgoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmVzdGFibGVzLmhhc05leHQoKSkgewotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQkJYmxvY2tzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIGVuZFR5cGVzLCBudWxsKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVHlwZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsKLQl9Ci0JLyoqCi0JICogIHVzZXIgbWV0aG9kIAotCSAqIAotCSAqIEFzc2VtYmxlcyBhbiBlbWJlZGRlZCBjb250YWluZXIgYmVnaW5uaW5nIHdpdGggdGhlIGdpdmVuIHN0YXJ0VHlwZSBhcwotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bAotCSAqIGV4aXQuICBVc2Ugb2YgdGhlIGVuZFRhZ05hbWUgcGFyYW1ldGVyIGFsdGVycyB0aGlzIGJlaGF2aW9yIHRvIGZvcmNlIGFuCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQKLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlCi0JICogaW5zaWduaWZpY2FudCwgYW5kIHllcywgdGhpcyBtZWFucyBjb21tZW50cyBhcmUgYWxsb3dlZCBpbnNpZGUuCi0JICoqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQkvLyB0aGUgY29udGV4dCBvZiB0aGUgcmVnaW9uIGJlaW5nIGFkZGVkIHRvIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zCi0JCWludCBjb250YWluZXJTdGFydCA9IHl5Y2hhcjsKLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkCi0JCWJvb2xlYW4gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7Ci0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiCi0JCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KGNvbnRhaW5lclN0YXJ0KTsKLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIAotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsKLQkJfQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOwotCQl3aGlsZSAobm90RmluaXNoZWQpIHsKLQkJCS8vIGFkZCB0aGUgcmVnaW9uIHRvIHRoZSBjb250YWluZXIKLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQlib29sZWFuIGxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJLy8gc2F2ZSB0aGUgdG9rZW5pemVyIHN0YXRlIGluIGNhc2Ugb2YgYSBibG9jayB0YWcgc2NhbgotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQkJCVN0cmluZyBwcmV2aW91c0N1cnJlbnRUYWdOYW1lID0gZkN1cnJlbnRUYWdOYW1lOwotCQkJCWludCBwcmV2aW91c1Bvc3RTdGF0ZSA9IGZFbWJlZGRlZFBvc3RTdGF0ZTsKLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50OwotCQkJCS8vIGRldGVybWluZSBpZiBhIGJsb2NrIHRhZyBzY2FuIGlzIG5lY2Vzc2FyeQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCQlpZighaXNOZXN0YWJsZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlCi0JCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCQkJCW5vdEZpbmlzaGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfT1BFTiB8fCBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCX0KLQkJCQkvLyBkbyB1cGtlZXAgZm9yIGVuZFRhZ05hbWUgdXNhZ2U7IG11c3QgYmUgaGVyZSBzaW5jZSB0aGUgbmV4dCB0b2tlbiBjb3VsZCBiZSB0aGUgY2xvc2UKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaXNJbkVuZFRhZyA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgewotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkgCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY29udGFpbnNUYWdOYW1lKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCQlsb25nc2NhbiA9IHRydWU7Ci0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvbmdzY2FuKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBpbnRlcm5hbFRhZ05hbWU7Ci0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQKLQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYgKGxvbmdzY2FuKSB7Ci0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzCi0JCQkJCS8vIGFzIHdlbGwgYXMgaGFuZGxpbmcgdGhlIGJsb2NrIHJlZ2lvbiBhbmQgc2V0dGluZyB1cCBmb3Igbm9ybWFsIHNjYW5uaW5nCi0JCQkJCS8vIGluc2lkZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyBuZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gcHJldmlvdXNQb3N0U3RhdGU7Ci0JCQkJCWZFbWJlZGRlZEhpbnQgPSBwcmV2aW91c0VtYmVkZGVkSGludDsKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsKLQkJCQkJeXliZWdpbihwcmV2aW91c1N0YXRlKTsKLQkJCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcmltR2V0TmV4dFRva2VuKCkgY2FsbHMgbWF5IHRocm93IGFuIElPRXhjZXB0aW9uCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93Ci0JCQkJLy8gd2lsbCBwcm9wZXJseSBleGl0IGlmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZikgewotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGYpOwotCQkJfQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQlpZighaXNFbmRpbmdUeXBlKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGVuZGluZyBjb250ZXh0Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpc0VuZGluZ1R5cGUgPSBpc0VuZGluZ1R5cGUgfHwgKGludGVybmFsQ29udGV4dCA9PSBlbmRUeXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsKLQkJfQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQKLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQl9Ci0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBCTE9DS19URVhUOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotCSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotCSAqCi0JICogRXhhbXBsZTogCi0JICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotCSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IAotCSAqCi0JICogUmV0dXJuczoKLQkgKglCTE9DS19URVhUOiAwLTQwCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLQkgKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0JICoJWE1MX1RBR19DTE9TRTogNDktNDkKLQkgKglYTUxfQ09OVEVOVDogNTAtNTcKLQkgKgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBhbGxvd0pTUCAtIGNoZWNrIGZvciBhbmQgYWxsb3cgZm9yIEpTUCBtYXJrdXAgPCUlPgotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQotCWJvb2xlYW4gY2hlY2tKU1BzID0gYWxsb3dKU1AgJiYgIWZGb3JiaWRKU1A7Ci0JYm9vbGVhbiBjaGVja2VkRm9ySlNQc09uY2UgPSAhY2hlY2tKU1BzOwotCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOwotCQotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLS8vCQljID0gKGNoYXIpIG47Ci0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuCi0JCWlmIChuID09IFlZRU9GICYmIGNoZWNrZWRGb3JKU1BzT25jZSkgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiCi0JCQkgKi8KLQkJCWNoZWNrZWRGb3JKU1BzT25jZSA9IHRydWU7Ci0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcwotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotCQkJaWYoY2hlY2tKU1BzICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiAhY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCi0KLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyIKLQkJCSAqLwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgQ0RBVEEKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPFshQ0RBVEFbXV0+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0vKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCWNoYXJzTWF0Y2goY2RhdGFTdGFydGVyLCB5eV9idWZmZXIsIDAsIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGgpKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZAotCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7Ci0JCQkJfQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCVN0cmluZyBjb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgewotCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOwotCQkJCX0KLQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovLyoKLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmICFjaGVja2VkRm9yQ0RBVEFPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLwotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXIKLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotCQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2FtZSA9IHRydWU7Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcwotCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJCWVsc2UgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkvLyAiPC9zY3JpcHRTIgotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107Ci0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCXl5X2N1cnJlbnRQb3MrKzsKLQl9Ci0JeXliZWdpbihleGl0U3RhdGUpOwotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7Ci0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOwotfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLQkgKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4KLQkgKgotCSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLgotCSAqCi0JICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQotCQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjb250YWluZXIgPSBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lcjsKLQkJCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQl9Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlyZXR1cm4gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCWVsc2UKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJCX0KLQkJCXN0YXJ0ID0geXljaGFyOwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQlpZiAoeXlfYXRFT0YpIHsKLQkJCQlmVG9rZW5Db3VudCsrOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQllbHNlCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0OwotCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQl9Ci0JCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCS8vIEVPRgotCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZlRva2VuQ291bnQrKzsKLQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcigpewotCQlzdXBlcigpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCQlyZXNldChpbiwgMCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kICoKLQkgKgotCSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLQkgKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0JCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCQotCQkvKiogCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0IAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0JCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWxpbmUgPSAwOwotCQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQkKLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQkKLQkKLQkJLyogdXNlciB2YXJzOiAqLwotCQlmVG9rZW5Db3VudCA9IDA7Ci0JIAotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JCi0JCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0JCi0JCWNvbnRleHQgPSBudWxsOwotCQlzdGFydCA9IDA7Ci0JCXRleHRMZW5ndGggPSAwOwotCQlsZW5ndGggPSAwOwotCQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkKLQkJZkVMbGV2ZWwgPSAwOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlKU1BUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZOZXN0YWJsZVByZWZpeGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcikgZk5lc3RhYmxlUHJlZml4ZXMuZ2V0KGkpOwotCQkJaWYobWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkTmVzdGFibGVQcmVmaXgobWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhbkpTUENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tJT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIEpTUF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX0pTUF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLSU+IiwgZmFsc2UsIGZhbHNlLCB0cnVlLCBKU1BfQ09NTUVOVF9URVhULCBTVF9KU1BfQ09NTUVOVF9FTkQsIFNUX0pTUF9DT01NRU5UX0VORCk7Ci0JfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbMjk1ODBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDczNDYpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzc2KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgeXlfcHVzaGJhY2tQb3MgPSAtMTsKLSAgICBib29sZWFuIHl5X3dhc19wdXNoYmFjazsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDU5OTogCi0gICAgICAgIGNhc2UgNjA0OiAKLSAgICAgICAgY2FzZSA2MTE6IAotICAgICAgICBjYXNlIDYxNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDYzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYzOiAKLSAgICAgICAgY2FzZSA1NjU6IAotICAgICAgICBjYXNlIDU2NjogCi0gICAgICAgIGNhc2UgNTY3OiAKLSAgICAgICAgY2FzZSA1Njg6IAotICAgICAgICBjYXNlIDU2OTogCi0gICAgICAgIGNhc2UgNTcwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjMzOiBicmVhazsKLSAgICAgICAgY2FzZSA1NTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ST09UX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU0NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDYzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjM2OiBicmVhazsKLSAgICAgICAgY2FzZSA1NDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDUzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSA2Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDUzMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSA2Mzk6IGJyZWFrOwotICAgICAgICBjYXNlIDUyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTAxOiAKLSAgICAgICAgY2FzZSA1NDA6IAotICAgICAgICBjYXNlIDU0MTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQxOiBicmVhazsKLSAgICAgICAgY2FzZSA0OTE6IAotICAgICAgICBjYXNlIDUzNjogCi0gICAgICAgIGNhc2UgNTM3OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gSlNQX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDcwOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlZCTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JZkVMbGV2ZWwrKzsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQ0OiBicmVhazsKLSAgICAgICAgY2FzZSA0Njk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiRUwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JZkVMbGV2ZWwrKzsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQ2OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTU1FTlRfVEVYVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQ09NTUVOVDsKLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjQ3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjA6IAotICAgICAgICBjYXNlIDQ3ODogCi0gICAgICAgIGNhc2UgNDgxOiAKLSAgICAgICAgY2FzZSA0ODQ6IAotICAgICAgICBjYXNlIDQ4NTogCi0gICAgICAgIGNhc2UgNDg3OiAKLSAgICAgICAgY2FzZSA0ODk6IAotICAgICAgICBjYXNlIDQ5MjogCi0gICAgICAgIGNhc2UgNDk0OiAKLSAgICAgICAgY2FzZSA0OTU6IAotICAgICAgICBjYXNlIDQ5NzogCi0gICAgICAgIGNhc2UgNDk5OiAKLSAgICAgICAgY2FzZSA1MDI6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGNvbW1lbnQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soNCk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgIHsKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQkvLyB0aGUgY29tbWVudCBjb250YWluZXIgaXRzZWxmIHdpbGwgYWN0IGFzIGNvbW1lbnQgdGV4dAotCQlmRW1iZWRkZWRIaW50ID0gSlNQX0NPTU1FTlRfVEVYVDsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvKgotCQkgKiByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnM7IG1hcmsgdGhpcyBvbmUgYXMgYQotCQkgKiBjb21tZW50IHNvIGl0IHdpbGwgYmUgb3RoZXJ3aXNlIGlnbm9yZWQgYnV0IHByZXNlcnZlZCAod2hpY2ggaXMgd2h5Ci0JCSAqIHdlIGNhbid0IHVzZSB3aGl0ZS1zcGFjZSkKLQkJICovCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NDg6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQ5OiBicmVhazsKLSAgICAgICAgY2FzZSAzODE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjUwOiBicmVhazsKLSAgICAgICAgY2FzZSAzODA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NTE6IGJyZWFrOwotICAgICAgICBjYXNlIDM3OTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIEpTUF9WQkxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY1MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBKU1BfRUxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY4OiAKLSAgICAgICAgY2FzZSA0MDY6IAotICAgICAgICBjYXNlIDQxMzogCi0gICAgICAgIGNhc2UgNDE5OiAKLSAgICAgICAgY2FzZSA0MjM6IAotICAgICAgICBjYXNlIDQyNzogCi0gICAgICAgIGNhc2UgNDMxOiAKLSAgICAgICAgY2FzZSA0MzY6IAotICAgICAgICBjYXNlIDQ0MTogCi0gICAgICAgIGNhc2UgNDQ0OiAKLSAgICAgICAgY2FzZSA0NDg6IAotICAgICAgICBjYXNlIDQ1MjogCi0gICAgICAgIGNhc2UgNDU3OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBleHByZXNzaW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGFuIGV4cHJlc3Npb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9FWFBSRVNTSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NzogCi0gICAgICAgIGNhc2UgNDA1OiAKLSAgICAgICAgY2FzZSA0MTI6IAotICAgICAgICBjYXNlIDQxODogCi0gICAgICAgIGNhc2UgNDIyOiAKLSAgICAgICAgY2FzZSA0MjY6IAotICAgICAgICBjYXNlIDQzMDogCi0gICAgICAgIGNhc2UgNDM1OiAKLSAgICAgICAgY2FzZSA0NDA6IAotICAgICAgICBjYXNlIDQ0MzogCi0gICAgICAgIGNhc2UgNDQ3OiAKLSAgICAgICAgY2FzZSA0NTE6IAotICAgICAgICBjYXNlIDQ1NjogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGVjbGFyYXRpb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSBkZWNsYXJhdGlvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9ERUNMQVJBVElPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ERUNMQVJBVElPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NjogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIEpTUF9ESVJFQ1RJVkVfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RJUkVDVElWRV9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0RJUkVDVElWRV9DTE9TRSwgSlNQX0NMT1NFfSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU2OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUwOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX1ZCTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjYxOiBicmVhazsKLSAgICAgICAgY2FzZSAzNDA6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM2OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNDogCi0gICAgICAgICAgeyAKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihKU1BfRUxfQ09OVEVOVCsgIjpbIiArIHl5dGV4dCgpICsgIl0iKTsKLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMzOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX0VMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzMDogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY2OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjk6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY3OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjc6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI2OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI1OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX0VORF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjcwOiBicmVhazsKLSAgICAgICAgY2FzZSAyODQ6IAotICAgICAgICBjYXNlIDI5NjogCi0gICAgICAgIGNhc2UgMzAyOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDY3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjczOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggZG91YmxlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIHRhZyBlbWJlZGRlZCBuYW1lIHN0YXJ0IC0gc3RhcnQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICBjYXNlIDI3ODogCi0gICAgICAgIGNhc2UgMjc5OiAKLSAgICAgICAgY2FzZSAzODc6IAotICAgICAgICBjYXNlIDM5MDogCi0gICAgICAgIGNhc2UgNDY4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA2Nzc6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICBjYXNlIDM4NjogCi0gICAgICAgIGNhc2UgNDY3OiAKLSAgICAgICAgY2FzZSA1MDY6IAotICAgICAgICBjYXNlIDUwNzogCi0gICAgICAgIGNhc2UgNTI1OiAKLSAgICAgICAgY2FzZSA1MjY6IAotICAgICAgICBjYXNlIDU0MzogCi0gICAgICAgIGNhc2UgNTQ0OiAKLSAgICAgICAgY2FzZSA1NTY6IAotICAgICAgICBjYXNlIDU2NDogCi0gICAgICAgIGNhc2UgNTcxOiAKLSAgICAgICAgY2FzZSA1NzI6IAotICAgICAgICBjYXNlIDU3MzogCi0gICAgICAgIGNhc2UgNTc0OiAKLSAgICAgICAgY2FzZSA1NzY6IAotICAgICAgICBjYXNlIDU4MjogCi0gICAgICAgIGNhc2UgNTgzOiAKLSAgICAgICAgY2FzZSA1ODQ6IAotICAgICAgICBjYXNlIDU4NTogCi0gICAgICAgIGNhc2UgNTg2OiAKLSAgICAgICAgY2FzZSA1OTI6IAotICAgICAgICBjYXNlIDU5MzogCi0gICAgICAgIGNhc2UgNTk0OiAKLSAgICAgICAgY2FzZSA1OTU6IAotICAgICAgICBjYXNlIDU5NjogCi0gICAgICAgIGNhc2UgNjAyOiAKLSAgICAgICAgY2FzZSA2MDM6IAotICAgICAgICBjYXNlIDYwNTogCi0gICAgICAgIGNhc2UgNjA2OiAKLSAgICAgICAgY2FzZSA2MTI6IAotICAgICAgICBjYXNlIDYxMzogCi0gICAgICAgIGNhc2UgNjE0OiAKLSAgICAgICAgY2FzZSA2MTU6IAotICAgICAgICBjYXNlIDYyMTogCi0gICAgICAgIGNhc2UgNjIyOiAKLSAgICAgICAgY2FzZSA2MjM6IAotICAgICAgICBjYXNlIDYyNDogCi0gICAgICAgIGNhc2UgNjI3OiAKLSAgICAgICAgY2FzZSA2Mjg6IAotICAgICAgICBjYXNlIDYzMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2ODA6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0JCWZFbWJlZGRlZEhpbnQgPSBnZXRCbG9ja01hcmtlckNvbnRleHQoKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQkxPQ0tfVEFHX1NDQU47Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMjY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2ODM6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg1OiBicmVhazsKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZG9TY2FuKCIlPiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIEpTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQpOwotIH0KLSAgICAgICAgY2FzZSA2ODY6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjU1OiAKLSAgICAgICAgY2FzZSAyNTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNjg4OiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg5OiBicmVhazsKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2OTA6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgMjQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2OTI6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgIGNhc2UgMjE4OiAKLSAgICAgICAgY2FzZSAyMTk6IAotICAgICAgICBjYXNlIDM2MTogCi0gICAgICAgIGNhc2UgMzY0OiAKLSAgICAgICAgY2FzZSA0Mzk6IAotICAgICAgICBjYXNlIDQ1MDogCi0gICAgICAgIGNhc2UgNDU1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDE3OTogCi0gICAgICAgIGNhc2UgMTgwOiAKLSAgICAgICAgY2FzZSAxODM6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMzMxOiAKLSAgICAgICAgY2FzZSAzNDU6IAotICAgICAgICBjYXNlIDM0ODogCi0gICAgICAgIGNhc2UgNDE2OiAKLSAgICAgICAgY2FzZSA0MTc6IAotICAgICAgICBjYXNlIDQyOTogCi0gICAgICAgIGNhc2UgNDM0OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDMyMjogCi0gICAgICAgIGNhc2UgNDExOiAKLSAgICAgICAgY2FzZSA0MTQ6IAotICAgICAgICBjYXNlIDQ4MjogCi0gICAgICAgIGNhc2UgNTE0OiAKLSAgICAgICAgY2FzZSA1MzM6IAotICAgICAgICBjYXNlIDU0OTogCi0gICAgICAgIGNhc2UgNTU4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAzMTI6IAotICAgICAgICBjYXNlIDQwNDogCi0gICAgICAgIGNhc2UgNDA3OiAKLSAgICAgICAgY2FzZSA0Nzk6IAotICAgICAgICBjYXNlIDUxMzogCi0gICAgICAgIGNhc2UgNTMyOiAKLSAgICAgICAgY2FzZSA1NDg6IAotICAgICAgICBjYXNlIDU1NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCktMSk7Ci0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQl9Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDY5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk5OiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgY2FzZSAyMjY6IAotICAgICAgICBjYXNlIDIyODogCi0gICAgICAgIGNhc2UgMjI5OiAKLSAgICAgICAgY2FzZSAyMzE6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgIGNhc2UgMzcxOiAKLSAgICAgICAgY2FzZSAzNzI6IAotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgIGNhc2UgNDYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzAwOiBicmVhazsKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDcwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgY2FzZSAxMzQ6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgY2FzZSAxNDk6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMTUxOiAKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICBjYXNlIDE1NzogCi0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNjQ6IAotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxNzM6IAotICAgICAgICBjYXNlIDE3NzogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxODU6IAotICAgICAgICBjYXNlIDE4NjogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgIGNhc2UgMjIwOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDcwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCVN0cmluZyByZXR1cm5lZENvbnRleHQgPSBkb1NjYW4oIl1dPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5ELCAgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYocmV0dXJuZWRDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIHJldHVybmVkQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgNzAzOiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgMTg3OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgNzA1OiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMzgzOiAKLSAgICAgICAgY2FzZSA0NjY6IAotICAgICAgICBjYXNlIDUwNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA2OiBicmVhazsKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MDc6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICAgIHsgCi0JCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgNzA4OiBicmVhazsKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDk6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDcxMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MTE6IGJyZWFrOwotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MTI6IGJyZWFrOwotICAgICAgICBjYXNlIDEzODogCi0gICAgICAgIGNhc2UgMTQyOiAKLSAgICAgICAgY2FzZSAyODk6IAotICAgICAgICBjYXNlIDI5MzogCi0gICAgICAgIGNhc2UgMzk5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDcxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgY2FzZSAxNDc6IAotICAgICAgICBjYXNlIDI5OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotIH0KLSAgICAgICAgY2FzZSA3MTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgIGNhc2UgMzA1OiAKLSAgICAgICAgY2FzZSAzMDk6IAotICAgICAgICBjYXNlIDQwMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU1OiAKLSAgICAgICAgY2FzZSAzMTU6IAotICAgICAgICBjYXNlIDMxOTogCi0gICAgICAgIGNhc2UgNDA5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MTc6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDcxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MjA6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbnNpZGUgb2YgSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDcyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVMpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzI1OiBicmVhazsKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9FTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MjY6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzI5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzMwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDM6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzMxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDU6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0JfQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDczMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzM0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDczNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzM2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMzogCi0gICAgICAgIGNhc2UgMjM0OiAKLSAgICAgICAgY2FzZSAzMTE6IAotICAgICAgICBjYXNlIDMyMTogCi0gICAgICAgIGNhc2UgMzMyOiAKLSAgICAgICAgY2FzZSAzMzc6IAotICAgICAgICBjYXNlIDM0MTogCi0gICAgICAgIGNhc2UgMzQ0OiAKLSAgICAgICAgY2FzZSAzNDc6IAotICAgICAgICBjYXNlIDM0OTogCi0gICAgICAgIGNhc2UgMzUzOiAKLSAgICAgICAgY2FzZSAzNTc6IAotICAgICAgICBjYXNlIDM2MDogCi0gICAgICAgIGNhc2UgMzYzOiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMSk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1NDUklQVExFVF9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA3Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDczOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQxOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIEpTUF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjI6IAotICAgICAgICBjYXNlIDE2MzogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSA3NDU6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjAwOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIEpTUCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0JCS8vIGNvbXBpbGVyL3ZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB0cnVlKTsKLQotCQkvLyBjb2RlIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gIklTTy04ODU5LTEiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeXN0ZW1FbmMgIT0gbnVsbCkgewotCQkJZGVmYXVsdEVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRQcmVmZXJyZWREZWZhdWx0SWFuYU5hbWUoc3lzdGVtRW5jLCAiSVNPLTg4NTktMSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZGVmYXVsdEVuYyk7Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoaXMgY291bGQgYmUgbWFkZSBzbWFydGVyIGJ5IGFjdHVhbGx5IGxvb2tpbmcgdXAgdGhlIGNvbnRlbnQKLQkJLy8gdHlwZSdzIHZhbGlkIGV4dGVuc2lvbnMKLQkJbm9kZS5wdXQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgImpzcCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhNDQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBKU1AgY29yZQotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEpTUCBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBKU1AgZnJhZ21lbnRzIHNob3VsZCBiZSBjb21waWxlZC92YWxpZGF0ZWQuIEpTUCBmcmFnbWVudHMKLQkgKiB3aWxsIGJlIHZhbGlkYXRlZCB3aGVuIHRydWUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRlJBR01FTlRTID0gInZhbGlkYXRlRnJhZ21lbnRzIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDExTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDExTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMTc5YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMU5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogSlNQIDEuMSBOYW1lc3BhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMU5hbWVzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCS8vIEVsZW1lbnQgbmFtZXMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT04gPSAianNwOmV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OID0gImpzcDpkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfSU5DTFVERSA9ICJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9UQUdMSUIgPSAianNwOmRpcmVjdGl2ZS50YWdsaWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUJFQU4gPSAianNwOnVzZUJlYW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFBST1BFUlRZID0gImpzcDpzZXRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUUFJPUEVSVFkgPSAianNwOmdldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImpzcDppbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEID0gImpzcDpmb3J3YXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU4gPSAianNwOnBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1TID0gImpzcDpwYXJhbXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLID0gImpzcDpmYWxsYmFjayI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAianNwOnBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gImpzcDpyb290IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gImpzcDp0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUDExX1VSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RBR19QUkVGSVggPSAianNwIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSBuYW1lcwotCS8vICAgZGlyZWN0aXZlLnBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VYVEVORFMgPSAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRVNTSU9OID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JVRkZFUiA9ICJidWZmZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9GTFVTSCA9ICJhdXRvRmx1c2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFID0gImlzVGhyZWFkU2FmZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJPUl9QQUdFID0gImVycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfRVJST1JfUEFHRSA9ICJpc0Vycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFHRV9FTkNPRElORyA9ICJwYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUuaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUudGFnbGliCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JLy8gICB1c2VCZWFuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFQU5fTkFNRSA9ICJiZWFuTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgc2V0UHJvcGVydHkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBUkFNID0gInBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZMVVNIID0gImZsdXNoIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcGx1Z2luCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERUJBU0UgPSAiY29kZWJhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BUkNISVZFID0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9ICJoc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0pSRVZFUlNJT04gPSAianJldmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVlNQQUNFID0gInZzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05TUExVR0lOVVJMID0gIm5zcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRVBMVUdJTlVSTCA9ICJpZXBsdWdpbnVybCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHJvb3QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfWE1MTlNfSlNQID0gInhtbG5zOmpzcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSB2YWx1ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI7Ly9EMTk1MzY2IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JVRlNJWl9ERUZBVUxUID0gIjhrYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFUVVFU1QgPSAicmVxdWVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQkVBTiA9ICJiZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTEVUID0gImFwcGxldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlZFUjExID0gIjEuMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1hNTE5TX0pTUCA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTJOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTJOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0YjI0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDEyTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBOYW1lcyBmb3IgSlNQIDEuMiBzcGVjLgotICogQ3VycmVudGx5LCBpdCBpcyBqdXN0IHRoZSBzYW1lIGFzIEpTUDExTmFtZXNwYWNlIGluIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMk5hbWVzcGFjZSBleHRlbmRzIEpTUDExTmFtZXNwYWNlIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1MmM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDIwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBOZXcgbmFtZXMgZm9yIEpTUCAyLjAgc3BlYy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDIwTmFtZXNwYWNlIGV4dGVuZHMgSlNQMTJOYW1lc3BhY2UgewotCS8qKgotCSAqIE5ldyBlbGVtZW50cyBmb3IgSlNQIDIuMCBzcGVjLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIGV4dGVuZHMgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCQlTdHJpbmcgRElSRUNUSVZFX1RBRyA9ICJqc3A6ZGlyZWN0aXZlLnRhZyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERJUkVDVElWRV9BVFRSSUJVVEUgPSAianNwOmRpcmVjdGl2ZS5hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBESVJFQ1RJVkVfVkFSSUFCTEUgPSAianNwOmRpcmVjdGl2ZS52YXJpYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NjE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JKU1AgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfSlNQID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0pTUEZSQUdNRU5UID0gZ2V0RnJhZ21lbnRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGdldEZyYWdtZW50Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWVlMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29kZWRSZXNvdXJjZVBsdWdpbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AgewotCS8qKgotCSAqIEV4dHJhIHByb3BlcnRpZXMgYXMgcGFydCBvZiBDb250ZW50RGVzY3JpcHRpb24sIGlmIHRoZSBjb250ZW50IGlzIEpTUC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQ09OVEVOVF9UWVBFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiY29udGVudFR5cGVBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBMQU5HVUFHRV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImxhbmd1YWdlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSlNQUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSlNQUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5ZTNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBKU1AuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSUpTUFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJSlNQUGFydGl0aW9uVHlwZXMgewotCi0JU3RyaW5nIEpTUF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEpTUF9TQ1JJUFRfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfREVMSU1JVEVSID0gSlNQX1NDUklQVF9QUkVGSVggKyAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQVNDUklQVCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkFTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTDIgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKU1BfRUwyIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfRElSRUNUSVZFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTUpTUFJlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYWEyMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTUpTUFJlZ2lvbkNvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBET01KU1BSZWdpb25Db250ZXh0cyBleHRlbmRzIERPTVJlZ2lvbkNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfQ0xPU0UgPSAiSlNQX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9PUEVOID0gIkpTUF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAiSlNQX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfTkFNRSA9ICJKU1BfRElSRUNUSVZFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9DTE9TRSA9ICJKU1BfRUxfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0NPTlRFTlQgPSAiSlNQX0VMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0RRVU9URSA9ICJKU1BfRUxfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX09QRU4gPSAiSlNQX0VMX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX1FVT1RFRF9DT05URU5UID0gIkpTUF9FTF9RVU9URURfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfU1FVT1RFID0gIkpTUF9FTF9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX09QRU4gPSAiSlNQX1NDUklQVExFVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfQ0xPU0UgPSAiSlNQX1ZCTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX0NPTlRFTlQgPSAiSlNQX1ZCTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfRFFVT1RFID0gIkpTUF9WQkxfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfT1BFTiA9ICJKU1BfVkJMX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9RVU9URURfQ09OVEVOVCA9ICJKU1BfVkJMX1FVT1RFRF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfU1FVT1RFID0gIkpTUF9WQkxfU1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSA9ICJYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUgPSAiWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliQ2xhc3NMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkNsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjMxMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliQ2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7Ci0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzbG9hZGVyIHdoaWNoIGFsbG93cyB5b3UgdG8gYWRkIHNvdXJjZSBkaXJlY3RvcmllcyAoZm9sZGVycwotICogY29udGFpbmluZyAuY2xhc3MgZmlsZXMpIGFuZCBqYXJzIHRvIHRoZSBjbGFzc3BhdGguCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGFnbGliY2xhc3Nsb2FkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBMaXN0IGphcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBkaXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgdXNlZEphcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IHVzZWREaXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IGZhaWxlZENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIENMOiBhZGRlZCB0byBvcHRpbWl6ZQotCQkJCQkJCQkJCQkJCS8vIGZhaWxlZCBsb2FkaW5nCi0KLQkvLyBwcml2YXRlIExpc3QgbG9hZGVkQ2xhc3NGaWxlbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgVGFnbGliQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyKSB7Ci0JCXN1cGVyKHBhcmVudExvYWRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBqYXIgdG8gY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtCi0JICogICAgICAgICAgICBmdWxsIHBhdGggdG8gdGhlIGphciBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInRyeWluZyB0byBhZGQ6IFsiICsgZmlsZW5hbWUgKyAiXSB0byBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIGRvbid0IGFkZCB0aGUgc2FtZSBlbnRyeSB0d2ljZSwgb3Igc2VhcmNoIHRpbWVzIHdpbGwgZ2V0IGV2ZW4gd29yc2UKLQkJaWYgKCFqYXJzTGlzdC5jb250YWlucyhmaWxlbmFtZSkpIHsKLQkJCWphcnNMaXN0LmFkZChmaWxlbmFtZSk7Ci0JCQlmYWlsZWRDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICsgWyIgKyBmaWxlbmFtZSArICJdIGFkZGVkIHRvIGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBqYXIgZnJvbSB0aGUgY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtCi0JICogICAgICAgICAgICBmdWxsIHBhdGggdG8gdGhlIGphciBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSmFyKFN0cmluZyBmaWxlbmFtZSkgewotCQlqYXJzTGlzdC5yZW1vdmUoZmlsZW5hbWUpOwotCQlmYWlsZWRDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbW92ZWQ6IFsiICsgZmlsZW5hbWUgKyAiXSBmcm9tIGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoU3RyaW5nIGRpclBhdGgpIHsKLQkJaWYgKCFkaXJzTGlzdC5jb250YWlucyhkaXJQYXRoKSkgewotCQkJZGlyc0xpc3QuYWRkKGRpclBhdGgpOwotCQkJZmFpbGVkQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkOiBbIiArIGRpclBhdGggKyAiXSB0byBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgZGlyZWN0b3J5IGZyb20gdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyUGF0aCAtCi0JICogICAgICAgICAgICBmdWxsIHBhdGggb2YgdGhlIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURpcmVjdG9yeShTdHJpbmcgZGlyUGF0aCkgewotCQlkaXJzTGlzdC5yZW1vdmUoZGlyUGF0aCk7Ci0JCWZhaWxlZENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZlZDogWyIgKyBkaXJQYXRoICsgIl0gZnJvbSBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBKQVJzIG9uIHRoaXMgbG9hZGVyJ3MgY2xhc3NwYXRoIHRoYXQgY29udGFpbgotCSAqIGNsYXNzZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCAtIHRoZSBsaXN0IG9mIEpBUnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRKYXJzSW5Vc2UoKSB7Ci0JCXJldHVybiB1c2VkSmFyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBkaXJlY3RvcmllcyBvbiB0aGlzIGxvYWRlcidzIGNsYXNzcGF0aCB0aGF0IGNvbnRhaW4KLQkgKiBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgLSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyAoZnVsbHktcXVhbGlmaWVkIGZpbGVuYW1lCi0JICogICAgICAgICBTdHJpbmdzKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpcmVjdG9yaWVzSW5Vc2UoKSB7Ci0JCXJldHVybiB1c2VkRGlyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBmaWxlbmFtZXMgZm9yIGxvb3NlIGNsYXNzZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIG91dAotCSAqIG9mIGRpcmVjdG9yaWVzLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCAtIHRoZSBsaXN0IG9mIGNsYXNzIGZpbGVuYW1lcwotCSAqLwotCS8vIHB1YmxpYyBMaXN0IGdldENsYXNzRmlsZW5hbWVzRnJvbURpcmVjdG9yaWVzKCkgewotCS8vIHJldHVybiBsb2FkZWRDbGFzc0ZpbGVuYW1lczsKLQkvLyB9Ci0JLyoqCi0JICogU2VhcmNoZXMgZm9yIHRoZSBnaXZlbiBjbGFzcyBuYW1lIG9uIHRoZSBkZWZpbmVkIGNsYXNzcGF0aCAtCi0JICogZGlyZWN0b3JpZXMgYXJlIGNoZWNrZWQgYmVmb3JlIEpBUnMuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gZmluZAotCSAqIEByZXR1cm4gQ2xhc3MgLSB0aGUgbG9hZGVkIGNsYXNzCi0JICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlDbGFzcyBvbGRDbGFzcyA9IGZpbmRMb2FkZWRDbGFzcyhjbGFzc05hbWUpOwotCQlpZiAob2xkQ2xhc3MgIT0gbnVsbCkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gVGFnbGliQ2xhc3NMb2FkZXIgIiArIHRoaXMgKyAiIHJldHVybmluZyBleGlzdGluZyBjbGFzczogIiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIG9sZENsYXNzOwotCQl9Ci0JCWlmIChmYWlsZWRDbGFzc2VzLmNvbnRhaW5zKGNsYXNzTmFtZSkpIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFRhZ2xpYkNsYXNzTG9hZGVyICIgKyB0aGlzICsgIiBrbm93biBtaXNzaW5nIGNsYXNzOiAiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBUYWdsaWJDbGFzc0xvYWRlciAiICsgdGhpcyArICIgZmluZGluZyBjbGFzczogIiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCUNsYXNzIG5ld0NsYXNzID0gbnVsbDsKLQkJSmFyRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJSmFyRW50cnkgZW50cnkgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgY29ycmVjdCBuYW1lIG9mIHRoZSBhY3R1YWwgLmNsYXNzIGZpbGUgdG8gc2VhcmNoIGZvcgotCQlTdHJpbmcgZmlsZU5hbWUgPSBjYWxjdWxhdGVDbGFzc0ZpbGVuYW1lKGNsYXNzTmFtZSk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBmaXJzdCB0cnkgc2VhcmNoaW5nIHRoZSBjbGFzc3BhdGggZGlyZWN0b3JpZXMKLQkJCUl0ZXJhdG9yIGRpcnMgPSBkaXJzTGlzdC5pdGVyYXRvcigpOwotCQkJRmlsZSBmOwotCQkJU3RyaW5nIGRpck5hbWU7Ci0JCQlTdHJpbmcgZmlsZVRvRmluZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoZGlycy5oYXNOZXh0KCkpIHsKLQkJCQlkaXJOYW1lID0gKFN0cmluZykgZGlycy5uZXh0KCk7Ci0JCQkJZmlsZVRvRmluZCA9IGRpck5hbWUgKyAiLyIgKyBmaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJZiA9IG5ldyBGaWxlKGZpbGVUb0ZpbmQpOwotCQkJCWlmIChmLmV4aXN0cygpKSB7Ci0JCQkJCXN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0JCQkJCXVzZWREaXJzLmFkZChkaXJOYW1lKTsKLQkJCQkJLy8gbG9hZGVkQ2xhc3NGaWxlbmFtZXMuYWRkKGZpbGVUb0ZpbmQpOwotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGFkZGVkIGZpbGUgZnJvbSBkaXI6ICIgKyBkaXJOYW1lICsgIi8iICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJCS8vIGZvdW5kIGEgY2xhc3MgZnJvbSBhIGRpcmVjdG9yeQotCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCXdoaWxlIChzdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJCWJ5dGVTdHJlYW0ud3JpdGUoc3RyZWFtLnJlYWQoKSk7Ci0JCQkJfQotCi0JCQkJYnl0ZVtdIGJ5dGVBcnJheSA9IGJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGRlZmluaW5nIG5ld0NsYXNzOiIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld0NsYXNzID0gZGVmaW5lQ2xhc3MoY2xhc3NOYW1lLCBieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5sZW5ndGgpOwotCQkJCQlyZXNvbHZlQ2xhc3MobmV3Q2xhc3MpOwotCQkJCX0KLQkJCQljYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQotCQkJCQkvLyBqOSBjYW4gZ2l2ZSBDbGFzc0NpcmN1bGFyaXR5RXJyb3IKLQkJCQkJLy8gcGFyZW50IHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIGNsYXNzIHRoZW4KLQkJCQkJLy8gdHJ5IHBhcmVudCBsb2FkZXIKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGMgPSBnZXRQYXJlbnQoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGxvYWRlZDogIiArIGNsYXNzTmFtZSArICIgd2l0aDogIiArIGdldFBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlyZXR1cm4gYzsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmYpIHsKLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQljbmYucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0KLQkJCWlmIChzdHJlYW0gPT0gbnVsbCkgewotCQkJCS8vIHN0aWxsIGhhdmVuJ3QgZm91bmQgdGhlIGNsYXNzLCBzbyBub3cgdHJ5IHNlYXJjaGluZyB0aGUKLQkJCQkvLyBqYXJzCi0JCQkJLy8gc2VhcmNoIGVhY2ggb2YgdGhlIGphcnMgdW50aWwgd2UgZmluZCBhbiBlbnRyeSBtYXRjaGluZyB0aGUKLQkJCQkvLyBjbGFzc25hbWUKLQkJCQlJdGVyYXRvciBqYXJzID0gamFyc0xpc3QuaXRlcmF0b3IoKTsKLQkJCQlTdHJpbmcgamFyTmFtZTsKLQkJCQl3aGlsZSAoamFycy5oYXNOZXh0KCkpIHsKLQkJCQkJamFyTmFtZSA9IChTdHJpbmcpIGphcnMubmV4dCgpOwotCi0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBleGlzdHMgb3IgIm5ldyBKYXJGaWxlKCkiIHdpbGwgdGhyb3cKLQkJCQkJLy8gYW4gZXhjZXB0aW9uCi0JCQkJCWYgPSBuZXcgRmlsZShqYXJOYW1lKTsKLQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJamFyZmlsZSA9IG5ldyBKYXJGaWxlKGphck5hbWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiYmFkIGphciBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoamFyZmlsZSA9PSBudWxsKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWVudHJ5ID0gamFyZmlsZS5nZXRKYXJFbnRyeShmaWxlTmFtZSk7Ci0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb29raW5nIGZvciBmaWxlbmFtZTogIiArIGZpbGVOYW1lICsgIiBpbjogIiArIGphcmZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCB0aGUgZW50cnk6ICIgKyBlbnRyeSArICIgZm9yIGZpbGVuYW1lOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS8vIGZvdW5kIHRoZSBjbGFzcwotCQkJCQkJaWYgKCF1c2VkSmFycy5jb250YWlucyhqYXJOYW1lKSkgewotCQkJCQkJCS8vIGFkZCB0aGUgamFyIHRvIHRoZSBsaXN0IG9mIGluLXVzZSBqYXJzCi0JCQkJCQkJdXNlZEphcnMuYWRkKGphck5hbWUpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJamFyZmlsZS5jbG9zZSgpOwotCQkJCX0KLQotCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCS8vIHdlJ3ZlIGZvdW5kIGFuIGVudHJ5IGZvciB0aGUgZGVzaXJlZCBjbGFzcwotCQkJCQlzdHJlYW0gPSBqYXJmaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCWxvbmcgYnl0ZUxlbmd0aCA9IGVudHJ5LmdldFNpemUoKTsKLQkJCQkJbG9uZyB0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0JCQkJCWludCBieXRlc1JlYWQ7Ci0JCQkJCWJ5dGVbXSBieXRlQnVmZmVyID0gbmV3IGJ5dGVbMTAwMDBdOwotCQkJCQl3aGlsZSAodG90YWxCeXRlc1JlYWQgPCBieXRlTGVuZ3RoKSB7Ci0JCQkJCQlieXRlc1JlYWQgPSBzdHJlYW0ucmVhZChieXRlQnVmZmVyKTsKLQkJCQkJCWlmIChieXRlc1JlYWQgPT0gLTEpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRvdGFsQnl0ZXNSZWFkID0gdG90YWxCeXRlc1JlYWQgKyBieXRlc1JlYWQ7Ci0JCQkJCQlieXRlU3RyZWFtLndyaXRlKGJ5dGVCdWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0JCQkJCX0KLQotCQkJCQlieXRlW10gYnl0ZUFycmF5ID0gYnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gZGVmaW5pbmcgbmV3Q2xhc3M6IiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGRlZmluZSB0aGUgY2xhc3MgZnJvbSB0aGUgYnl0ZSBhcnJheQotCQkJCQkJbmV3Q2xhc3MgPSBkZWZpbmVDbGFzcyhjbGFzc05hbWUsIGJ5dGVBcnJheSwgMCwgYnl0ZUFycmF5Lmxlbmd0aCk7Ci0JCQkJCQlyZXNvbHZlQ2xhc3MobmV3Q2xhc3MpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQkJLy8gajkgY2FuIGdpdmUgQ2xhc3NDaXJjdWxhcml0eUVycm9yCi0JCQkJCQkvLyBwYXJlbnQgc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgY2xhc3MgdGhlbgotCi0JCQkJCQkvLyB0cnkgcGFyZW50Ci0JCQkJCQl0cnkgewotCQkJCQkJCUNsYXNzIGMgPSBnZXRQYXJlbnQoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gbG9hZGVkOiAiICsgY2xhc3NOYW1lICsgIiB3aXRoOiAiICsgZ2V0UGFyZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlyZXR1cm4gYzsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZikgewotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJY25mLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQlqYXJmaWxlLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJZmFpbGVkQ2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWlmIChqYXJmaWxlICE9IG51bGwpIHsKLQkJCQkJamFyZmlsZS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkvLyBpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJLy8ganVzdCB0cnlpbmcgdG8gY2xvc2UgZG93biBhbnl3YXkgLSBpZ25vcmUKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdDbGFzcyAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBsb2FkZWQ6ICIgKyBuZXdDbGFzcyArICIgd2l0aDogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBuZXdDbGFzczsKLQkJfQotCi0JCWZhaWxlZENsYXNzZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgJy4nIGluIHRoZSBjbGFzc25hbWUgd2l0aCAnLycgYW5kIGFwcGVuZHMgJy5jbGFzcycgaWYgbmVlZGVkLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHByb3Blcmx5LWZvcm1lZCBjbGFzcyBuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY3VsYXRlQ2xhc3NGaWxlbmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLnJlcGxhY2UoJy4nLCAnLycpKTsKLQkJaWYgKCFuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxNWY0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRGF0YTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5SW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFyaWFibGVJbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UYWdsaWJUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhlbHBzIGZpbmQgVGFnbGliVmFyaWFibGVzIGluIGEgSlNQIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJIZWxwZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJ2YXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3QgPSBudWxsOwotCXByaXZhdGUgVGFnbGliQ2xhc3NMb2FkZXIgZkxvYWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIFNldCBmUHJvamVjdEVudHJpZXMgPSBudWxsOwotCXByaXZhdGUgU2V0IGZDb250YWluZXJFbnRyaWVzID0gbnVsbDsKLQotCXB1YmxpYyBUYWdsaWJIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlmUHJvamVjdEVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmQ29udGFpbmVyRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhZ1RvQWRkCi0JICogICAgICAgICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgdGFnIHdob3NlIHZhcmlhYmxlcyB3ZSB3YW50Ci0JICogQHBhcmFtIHN0cnVjdHVyZWREb2MKLQkgKiAgICAgICAgICAgIGlzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IHdoZXJlIHRoZSB0YWcgaXMgZm91bmQKLQkgKiBAcGFyYW0gY3VzdG9tVGFnCi0JICogICAgICAgICAgICBpcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuaW5nIHRhZyBmb3IgdGhlIGN1c3RvbQotCSAqICAgICAgICAgICAgdGFnCi0JICovCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlW10gZ2V0VGFnbGliVmFyaWFibGVzKFN0cmluZyB0YWdUb0FkZCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1c3RvbVRhZykgewotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTW9kZWxRdWVyeSBtcSA9IGdldE1vZGVsUXVlcnkoc3RydWN0dXJlZERvYyk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHN0cnVjdHVyZWREb2MpOwotCi0JCQkvLyBUYWdsaWJTdXBwb3J0IHN1cHBvcnQgPSAoKFRhZ2xpYk1vZGVsUXVlcnkpCi0JCQkvLyBtcSkuZ2V0VGFnbGliU3VwcG9ydCgpOwotCQkJaWYgKG1nciA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgVGFnbGliVmFyaWFibGVbMF07Ci0KLQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGN1c3RvbVRhZy5nZXRFbmRPZmZzZXQoKSk7Ci0JCQlJdGVyYXRvciB0YWdsaWJzID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQotCQkJLy8gVGFnbGliU3VwcG9ydCBzdXBwb3J0ID0gKChUYWdsaWJNb2RlbFF1ZXJ5KQotCQkJLy8gbXEpLmdldFRhZ2xpYlN1cHBvcnQoKTsKLQkJCS8vIGlmIChzdXBwb3J0ID09IG51bGwpCi0JCQkvLyByZXR1cm4gbmV3IFRhZ2xpYlZhcmlhYmxlWzBdOwotCQkJLy8KLQkJCS8vIEl0ZXJhdG9yIHRhZ2xpYnMgPQotCQkJLy8gc3VwcG9ydC5nZXRDTURvY3VtZW50cyhjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoKSkuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gbnVsbDsKLQkJCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJCWRvYyA9IChDTURvY3VtZW50KSB0YWdsaWJzLm5leHQoKTsKLQkJCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQkJaWYgKChlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpKSAhPSBudWxsICYmIChub2RlID0gZWxlbWVudHMuZ2V0TmFtZWRJdGVtKHRhZ1RvQWRkKSkgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQkJCW5vZGUgPSAoKENNTm9kZVdyYXBwZXIpIG5vZGUpLmdldE9yaWdpbk5vZGUoKTsKLQkJCQkJfQotCi0JCQkJCS8vIDEuMisgdGFnbGliIHN0eWxlCi0JCQkJCWFkZFZhcmlhYmxlcyhyZXN1bHRzLCBub2RlLCBjdXN0b21UYWcpOwotCi0JCQkJCS8vIGZvciAxLjEgbmVlZCBtb3JlIGluZm8gZnJvbSB0YWdsaWIgdHJhY2tlcgotCQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgVGFnbGliVHJhY2tlcikgewotCQkJCQkJU3RyaW5nIHVyaSA9ICgoVGFnbGliVHJhY2tlcikgZG9jKS5nZXRVUkkoKTsKLQkJCQkJCVN0cmluZyBwcmVmaXggPSAoKFRhZ2xpYlRyYWNrZXIpIGRvYykuZ2V0UHJlZml4KCk7Ci0JCQkJCQkvLyBvbmx5IGZvciAxLjEgdGFnbGlicwotCQkJCQkJYWRkVEVJVmFyaWFibGVzKGN1c3RvbVRhZywgcmVzdWx0cywgKFRMREVsZW1lbnREZWNsYXJhdGlvbikgbm9kZSwgcHJlZml4LCB1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChUYWdsaWJWYXJpYWJsZVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IFRhZ2xpYlZhcmlhYmxlW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyAxLjIgc3R5bGUgVGFnbGliVmFyaWFibGVzIHRvIHRoZSByZXN1bHRzIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdHMKLQkgKiAgICAgICAgICAgIGxpc3Qgd2hlcmUgdGhlIDxjb2RlPlRhZ2xpYlZhcmlhYmxlPC9jb2RlPiBzIGFyZSBhZGRlZAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlcyhMaXN0IHJlc3VsdHMsIENNTm9kZSBub2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1c3RvbVRhZykgewotCi0JCUxpc3QgbGlzdCA9ICgoVExERWxlbWVudERlY2xhcmF0aW9uKSBub2RlKS5nZXRWYXJpYWJsZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVRMRFZhcmlhYmxlIHZhciA9IChUTERWYXJpYWJsZSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIHZhck5hbWUgPSB2YXIuZ2V0TmFtZUdpdmVuKCk7Ci0JCQlpZiAodmFyTmFtZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gdmFyLmdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0JCQkJLyoKLQkJCQkgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGRvY3VtZW50IHJlZ2lvbiB0byBmaW5kIHRoZQotCQkJCSAqIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG5hbWUsIGFuZCB0aGVuIHVzZSBpdHMgdmFsdWUKLQkJCQkgKi8KLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGN1c3RvbVRhZy5nZXRSZWdpb25zKCk7Ci0JCQkJYm9vbGVhbiBhdHRyTmFtZUZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJYXR0ck5hbWVGb3VuZCA9IGF0dHJOYW1lLmVxdWFscyhjdXN0b21UYWcuZ2V0VGV4dChyZWdpb24pKTsKLQkJCQkJfQotCQkJCQlpZiAoYXR0ck5hbWVGb3VuZCAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJdmFyTmFtZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGN1c3RvbVRhZy5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHZhck5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB2YXJDbGFzcyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJCAvLyB0aGUgZGVmYXVsdCBjbGFzcy4uLgotCQkJCWlmICh2YXIuZ2V0VmFyaWFibGVDbGFzcygpICE9IG51bGwpIHsKLQkJCQkJdmFyQ2xhc3MgPSB2YXIuZ2V0VmFyaWFibGVDbGFzcygpOwotCQkJCX0KLQkJCQlyZXN1bHRzLmFkZChuZXcgVGFnbGliVmFyaWFibGUodmFyQ2xhc3MsIHZhck5hbWUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgMS4xIHN0eWxlIFRhZ2xpYlZhcmlhYmxlcyAoZGVmaW5lZCBpbiBhIFRhZ0V4dHJhSW5mbyBjbGFzcykgdG8gdGhlCi0JICogcmVzdWx0cyBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcGFyYW0gcmVzdWx0cwotCSAqICAgICAgICAgICAgbGlzdCB3aGVyZSB0aGUgPGNvZGU+VGFnbGliVmFyaWFibGU8L2NvZGU+IHMgYXJlIGFkZGVkCi0JICogQHBhcmFtIGRlY2wKLQkgKiAgICAgICAgICAgIFRMREVsZW1lbnREZWxjYXJhdGlvbiBmb3IgdGhlIGN1c3RvbSB0YWcKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogICAgICAgICAgICBjdXN0b20gdGFnIHByZWZpeAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFVSSSB3aGVyZSB0aGUgdGxkIGNhbiBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRURUlWYXJpYWJsZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXN0b21UYWcsIExpc3QgcmVzdWx0cywgVExERWxlbWVudERlY2xhcmF0aW9uIGRlY2wsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQotCQlTdHJpbmcgdGVpQ2xhc3NuYW1lID0gZGVjbC5nZXRUZWljbGFzcygpOwotCQlpZiAodGVpQ2xhc3NuYW1lID09IG51bGwgfHwgdGVpQ2xhc3NuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3Nsb2FkZXIoKTsKLQotCQlDbGFzcyB0ZWlDbGFzcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0ZWlDbGFzcyA9IENsYXNzLmZvck5hbWUodGVpQ2xhc3NuYW1lLCB0cnVlLCBsb2FkZXIpOwotCQkJaWYgKHRlaUNsYXNzICE9IG51bGwpIHsKLQkJCQlPYmplY3QgdGVpT2JqZWN0ID0gdGVpQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCQlpZiAoVGFnRXh0cmFJbmZvLmNsYXNzLmlzSW5zdGFuY2UodGVpT2JqZWN0KSkgewotCQkJCQlUYWdFeHRyYUluZm8gdGVpID0gKFRhZ0V4dHJhSW5mbykgdGVpT2JqZWN0OwotCQkJCQlIYXNodGFibGUgdGFnRGF0YVRhYmxlID0gZXh0cmFjdFRhZ0RhdGEoY3VzdG9tVGFnKTsKLQkJCQkJVGFnSW5mbyBpbmZvID0gZ2V0VGFnSW5mbyhkZWNsLCB0ZWksIHByZWZpeCwgdXJpKTsKLQkJCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkJdGVpLnNldFRhZ0luZm8oaW5mbyk7Ci0KLQkJCQkJCS8vIGFkZCB0byByZXN1bHRzCi0JCQkJCQlUYWdEYXRhIHRkID0gbmV3IFRhZ0RhdGEodGFnRGF0YVRhYmxlKTsKLQkJCQkJCWlmICh0ZWkuaXNWYWxpZCh0ZCkpIHsKLQkJCQkJCQlWYXJpYWJsZUluZm9bXSB2SW5mb3MgPSB0ZWkuZ2V0VmFyaWFibGVJbmZvKHRkKTsKLQkJCQkJCQlpZiAodkluZm9zICE9IG51bGwpIHsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2SW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCXJlc3VsdHMuYWRkKG5ldyBUYWdsaWJWYXJpYWJsZSh2SW5mb3NbaV0uZ2V0Q2xhc3NOYW1lKCksIHZJbmZvc1tpXS5nZXRWYXJOYW1lKCkpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBURUkgY2xhc3Mgd2Fzbid0IG9uIGNsYXNzcGF0aAotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBURUkgY2xhc3Mgd2Fzbid0IHJlYWxseSBhIHN1YmNsYXNzIG9mIFRhZ0V4dHJhSW5mbwotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyAzcmQgcGFydHkgY29kZSwgbmVlZCB0byBjYXRjaCBhbGwgZXhjZXB0aW9ucwotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWNhdGNoIChFcnJvciBlKSB7Ci0JCQkvLyB0aGlzIGlzIDNyZCBwYXJ0eSBjb2RlLCBuZWVkIHRvIGNhdGNoIGFsbCBlcnJvcnMKLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9sZExvYWRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVjbAotCSAqIEByZXR1cm4gdGhlIFRhZ0luZm8gZm9yIHRoZSBUTERFTGVtZW50RGVjbGFyYXRpb24gaWYgdGhlIGRlY2xhcmF0aW9uIGlzCi0JICogICAgICAgICB2YWxpZCwgb3RoZXJ3aXNlIG51bGwKLQkgKi8KLQlwcml2YXRlIFRhZ0luZm8gZ2V0VGFnSW5mbyhUTERFbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgVGFnRXh0cmFJbmZvIHRlaSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCi0JCVRhZ0xpYnJhcnlJbmZvIGxpYkluZm8gPSBuZXcgVGFnTGlicmFyeUluZm8ocHJlZml4LCB1cmkpIHsgLyoKLQkJCQkJCQkJCQkJCQkJCQkJICogZHVtbXkKLQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbAotCQkJCQkJCQkJCQkJCQkJCQkgKi8KLQkJfTsKLQotCQlDTU5hbWVkTm9kZU1hcCBhdHRycyA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlUYWdBdHRyaWJ1dGVJbmZvW10gYXR0ckluZm9zID0gbmV3IFRhZ0F0dHJpYnV0ZUluZm9bYXR0cnMuZ2V0TGVuZ3RoKCldOwotCQlUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJCAKLQotCQkvLyBnZXQgdGFnIGF0dHJpYnV0ZSBpbmZvcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWF0dHIgPSAoVExEQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQl0eXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0JCQkvLyBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIGlzIFN0cmluZwotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpID09IG51bGwgfHwgYXR0ci5nZXRUeXBlKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQl0eXBlID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkIAotCQkJYXR0ckluZm9zW2ldID0gbmV3IFRhZ0F0dHJpYnV0ZUluZm8oYXR0ci5nZXRBdHRyTmFtZSgpLCBhdHRyLmlzUmVxdWlyZWQoKSwgdHlwZSwgZmFsc2UpOwotCQl9Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBkZWNsLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZyB0YWdDbGFzcyA9IGRlY2wuZ2V0VGFnY2xhc3MoKTsKLQkJU3RyaW5nIGJvZHlDb250ZW50ID0gZGVjbC5nZXRCb2R5Y29udGVudCgpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ0NsYXNzICE9IG51bGwgJiYgYm9keUNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVGFnSW5mbyh0YWdOYW1lLCB0YWdDbGFzcywgYm9keUNvbnRlbnQsIGRlY2wuZ2V0SW5mbygpLCBsaWJJbmZvLCB0ZWksIGF0dHJJbmZvcyk7Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyB0ZWlDbGFzc25hbWUsIFRocm93YWJsZSBlKSB7Ci0KLQkJU3RyaW5nIG1lc3NhZ2UgPSAidGVpQ2xhc3NuYW1lOiBbIjsgLy8kTk9OLU5MUy0xJCAKLQkJaWYgKHRlaUNsYXNzbmFtZSAhPSBudWxsKQotCQkJbWVzc2FnZSArPSB0ZWlDbGFzc25hbWU7Ci0JCW1lc3NhZ2UgKz0gIl0iOyAvLyROT04tTkxTLTEkCi0JCUxvZ2dlci5sb2dFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgYXR0cmlidXRlIC0+IHZhbHVlIHBhaXJzIGZvciB0aGUgdGFnIGluIGEgSGFzaHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBIYXNodGFibGUgZXh0cmFjdFRhZ0RhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXN0b21UYWcpIHsKLQotCQlIYXNodGFibGUgdGFnRGF0YVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGN1c3RvbVRhZy5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkvLyBjaGVjayBpZiBhdHRyIG5hbWUKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlhdHRyTmFtZSA9IGN1c3RvbVRhZy5nZXRUZXh0KHIpOwotCQkJCS8vIGNoZWNrIGVxdWFscyBpcyBuZXh0IHJlZ2lvbgotCQkJCWlmIChyZWdpb25zLnNpemUoKSA+ICsraSkgewotCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyAmJiByZWdpb25zLnNpemUoKSA+ICsraSkgewotCQkJCQkJLy8gZ2V0IGF0dHIgdmFsdWUKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCS8vIGF0dHJpYnV0ZXMgaW4gb3VyIGRvY3VtZW50IGhhdmUgcXVvdGVzLCBzbyB3ZQotCQkJCQkJCS8vIG5lZWQgdG8gc3RyaXAgdGhlbQotCQkJCQkJCWF0dHJWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGN1c3RvbVRhZy5nZXRUZXh0KHIpKTsKLQkJCQkJCQl0YWdEYXRhVGFibGUucHV0KGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0YWdEYXRhVGFibGU7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRDbGFzc2xvYWRlcigpIHsKLQotCQlpZiAoZkxvYWRlciA9PSBudWxsKSB7Ci0JCQlmTG9hZGVyID0gbmV3IFRhZ2xpYkNsYXNzTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCWZQcm9qZWN0RW50cmllcy5jbGVhcigpOwotCQkJZkNvbnRhaW5lckVudHJpZXMuY2xlYXIoKTsKLQkJCWFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KGdldFByb2plY3QoKSwgZkxvYWRlcik7Ci0JCX0KLQkJcmV0dXJuIGZMb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyaWVzRm9yUHJvamVjdChJUHJvamVjdCBwLCBUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQotCQkvLyBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gYW5kIGNsb3NlZCBwcm9qZWN0Ci0JCWlmICghcC5pc0FjY2Vzc2libGUoKSB8fCBmUHJvamVjdEVudHJpZXMuY29udGFpbnMocC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKQotCQkJcmV0dXJuOwotCQlmUHJvamVjdEVudHJpZXMuYWRkKHAuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQotCQkvLyBhZGQgdGhpbmdzIG9uIGNsYXNzcGF0aCB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCWlmIChwICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHAuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQotCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwKTsKLQkJCQkJSVBhdGggd2tzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQkJYWRkRGVmYXVsdERpckVudHJ5KGxvYWRlciwgcHJvamVjdCwgd2tzcGFjZVJvb3QpOwotCQkJCQkJYWRkQ2xhc3NwYXRoRW50cmllcyhsb2FkZXIsIHByb2plY3QsIHdrc3BhY2VSb290LCBlbnRyaWVzKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyaWVzKFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIHdrc3BhY2VSb290LCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQotCQkJZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudCBlbnRyeSBpczogIiArIGVudHJ5KTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJCWFkZFNvdXJjZUVudHJ5KGxvYWRlciwgd2tzcGFjZVJvb3QsIGVudHJ5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCQlhZGRMaWJyYXJ5RW50cnkobG9hZGVyLCB3a3NwYWNlUm9vdCwgZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJCWFkZFByb2plY3RFbnRyeShsb2FkZXIsIGVudHJ5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQkJYWRkVmFyaWFibGVFbnRyeShsb2FkZXIsIHdrc3BhY2VSb290LCBlbnRyeSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgotCQkJCQlhZGRDb250YWluZXJFbnRyeShsb2FkZXIsIHByb2plY3QsIHdrc3BhY2VSb290LCBlbnRyeSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWYXJpYWJsZUVudHJ5KFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSVBhdGggd2tzcGFjZVJvb3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0+IGFkZGluZyB2YXJpYWJsZSBlbnRyeTogWyIgKyBlbnRyeSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIHZhcmlhYmxlIHNob3VsZCBlaXRoZXIgYmUgYSBwcm9qZWN0IG9yIGEgbGlicmFyeSBlbnRyeQotCi0JCVN0cmluZyB2YXJpYWJsZU5hbWUgPSBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJSVBhdGggdmFyaWFibGVQYXRoID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lKTsKLQotCQkvLyBSQVRMQzAxMDc2ODU0Ci0JCS8vIHZhcmlhYmxlIHBhdGhzIG1heSBub3QgZXhpc3QKLQkJLy8gaW4gdGhhdCBjYXNlIG51bGwgd2lsbCBiZSByZXR1cm5lZAotCQlpZiAodmFyaWFibGVQYXRoICE9IG51bGwpIHsKLQkJCWlmICh2YXJpYWJsZVBhdGguc2VnbWVudHMoKS5sZW5ndGggPT0gMSkgewotCQkJCUlQcm9qZWN0IHZhclByb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodmFyaWFibGVQYXRoLnRvU3RyaW5nKCkpOwotCQkJCWlmICh2YXJQcm9qICE9IG51bGwgJiYgdmFyUHJvai5leGlzdHMoKSkgewotCQkJCQlhZGRDbGFzc3BhdGhFbnRyaWVzRm9yUHJvamVjdCh2YXJQcm9qLCBsb2FkZXIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJYWRkTGlicmFyeUVudHJ5KGxvYWRlciwgd2tzcGFjZVJvb3QsIHZhcmlhYmxlUGF0aC50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2FkZXIKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB3a3NwYWNlUm9vdAotCSAqIEBwYXJhbSBlbnRyeQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnRhaW5lckVudHJ5KFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIHdrc3BhY2VSb290LCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKGVudHJ5LmdldFBhdGgoKSwgcHJvamVjdCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJLy8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uCi0JCQlpZiAoIWZDb250YWluZXJFbnRyaWVzLmNvbnRhaW5zKGNvbnRhaW5lci5nZXRQYXRoKCkudG9TdHJpbmcoKSkpIHsKLQkJCQlmQ29udGFpbmVyRW50cmllcy5hZGQoY29udGFpbmVyLmdldFBhdGgoKS50b1N0cmluZygpKTsKLQotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNwZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCS8vIHJlY3Vyc2l2ZSBjYWxsIGhlcmUKLQkJCQlhZGRDbGFzc3BhdGhFbnRyaWVzKGxvYWRlciwgcHJvamVjdCwgd2tzcGFjZVJvb3QsIGNwZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcm9qZWN0RW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtPiBwcm9qZWN0IGVudHJ5OiBbIiArIGVudHJ5ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJSVByb2plY3QgcmVmZXJlY2VQcm9qID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWZlcmVjZVByb2ogIT0gbnVsbCAmJiByZWZlcmVjZVByb2ouZXhpc3RzKCkpCi0JCQlhZGRDbGFzc3BhdGhFbnRyaWVzRm9yUHJvamVjdChyZWZlcmVjZVByb2osIGxvYWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHdrc3BhY2VSb290Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRGVmYXVsdERpckVudHJ5KFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIHdrc3BhY2VSb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQkvLyBhZGQgZGVmYXVsdCBiaW4gZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdAotCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJaWYgKCFvdXRwdXRMb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJb3V0cHV0TG9jYXRpb24gPSB3a3NwYWNlUm9vdC5hcHBlbmQob3V0cHV0TG9jYXRpb24pOwotCQl9Ci0JCWxvYWRlci5hZGREaXJlY3Rvcnkob3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSB3a3NwYWNlUm9vdAotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaWJyYXJ5RW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJUGF0aCB3a3NwYWNlUm9vdCwgU3RyaW5nIGxpYlBhdGgpIHsKLQotCQlTdHJpbmcgamFyUGF0aCA9IGxpYlBhdGg7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGphclBhdGgpOwotCi0JCS8vIGlmIG5vdCBhYnNvbHV0ZSBwYXRoLCBpdCdzIHdvcmtzcGFjZSByZWxhdGl2ZQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCWphclBhdGggPSB3a3NwYWNlUm9vdC5hcHBlbmQoamFyUGF0aCkudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChqYXJQYXRoLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCWxvYWRlci5hZGRKYXIoamFyUGF0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvLyBpdCdzIGFjdHVhbGx5IGEgZm9sZGVyIGNvbnRhaW5pbmcgYmluYXJpZXMKLQkJCWxvYWRlci5hZGREaXJlY3RvcnkoamFyUGF0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIHdrc3BhY2VSb290Ci0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNvdXJjZUVudHJ5KFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSVBhdGggd2tzcGFjZVJvb3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCi0JCS8vIGFkZCBiaW4gZGlyZWN0b3J5IGZvciBzcGVjaWZpYyBlbnRyeSBpZiBpdCBoYXMKLQkJLy8gb25lCi0JCWlmIChlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCVN0cmluZyBvdXRwdXRQYXRoID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJRmlsZSBmaWxlID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCS8vIGlmIG5vdCBhYnNvbHV0ZSBwYXRoLCBpdCdzIHdvcmtzcGFjZSByZWxhdGl2ZQotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJb3V0cHV0UGF0aCA9IHdrc3BhY2VSb290LmFwcGVuZChlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpKS50b1N0cmluZygpOwotCQkJfQotCQkJbG9hZGVyLmFkZERpcmVjdG9yeShvdXRwdXRQYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZk1vZGVsUXVlcnkuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShJRG9jdW1lbnQgZG9jKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlNb2RlbFF1ZXJ5IG1xID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBtcTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkZpbGUuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0KLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgZkZpbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCkgewotCQlmUHJvamVjdCA9IHA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyQ2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlckNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Zjk1Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEEgc2ltcGxlIGNhY2hlIGZvciBUYWdsaWJIZWxwZXJzIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBjcmVhdGlvbiBvZiBUYWdsaWJDbGFzc0xvYWRlcnMKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIFRhZ2xpYkhlbHBlckNhY2hlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJ2YXJzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVudHJ5IGZvciB0aGUgY2FjaGUgKHByb2plY3RQYXRoIHN0cmluZyAmIFRhZ2xpYkhlbHBlcikKLSAgICAgKi8KLSAgICBjbGFzcyBFbnRyeSB7Ci0gICAgICAgIHByaXZhdGUgVGFnbGliSGVscGVyIGZIZWxwZXI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGZQcm9qZWN0UGF0aDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBFbnRyeShTdHJpbmcgcHJvamVjdFBhdGgsIFRhZ2xpYkhlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgICAgIHNldFByb2plY3RQYXRoKHByb2plY3RQYXRoKTsKLSAgICAgICAgICAgIHNldEhlbHBlcihoZWxwZXIpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBUYWdsaWJIZWxwZXIgZ2V0SGVscGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIGZIZWxwZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SGVscGVyKFRhZ2xpYkhlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgICAgIGZIZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0UGF0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmUHJvamVjdFBhdGg7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdFBhdGgoU3RyaW5nIHByb2plY3RQYXRoKSB7Ci0gICAgICAgICAgICBmUHJvamVjdFBhdGggPSBwcm9qZWN0UGF0aDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJUYWdsaWIgSGVscGVyIEVudHJ5IFsiICsgZ2V0UHJvamVjdFBhdGgoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGZIZWxwZXJzOwotICAgIC8vIG1heCBzaXplIGZvciB0aGUgY2FjaGUKLSAgICBwcml2YXRlIGludCBNQVhfU0laRTsKLQotICAgIC8qKgotICAgICAqIE5vdCBpbnRlbmRlZCB0byBiZSBsYXJnZSBzaW5jZSB1bmRlcmx5aW5nIGltcGxtZW1lbnRhdGlvbiB1c2VzCi0gICAgICogYSBMaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBUYWdsaWJIZWxwZXJDYWNoZShpbnQgc2l6ZSkgewotICAgICAgICBNQVhfU0laRSA9IHNpemU7Ci0gICAgICAgIGZIZWxwZXJzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0KE1BWF9TSVpFKSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0UGF0aAotICAgICAqIEBwYXJhbSBmCi0gICAgICogQHBhcmFtIG1xCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgVGFnbGliSGVscGVyIGdldEhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIFRhZ2xpYkhlbHBlciBoZWxwZXIgPSBudWxsOwotICAgICAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICBpbnQgc2l6ZSA9IGZIZWxwZXJzLnNpemUoKTsKLSAgICAgICAgLy8gZmlzdCBjaGVjayBmb3IgZXhpc3RpbmcKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotICAgICAgICAgICAgZW50cnkgPSAoRW50cnkpZkhlbHBlcnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYoZW50cnkuZ2V0UHJvamVjdFBhdGgoKS5lcXVhbHMocHJvamVjdFBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXhpc3RzCi0gICAgICAgICAgICAgICAgaGVscGVyID0gZW50cnkuZ2V0SGVscGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBtb3ZlIHRvIGZyb250IGlmIGl0J3Mgbm90IHRoZSBmaXJzdCBlbnRyeQotICAgICAgICAgICAgICAgIGlmKGk+MCkgewotICAgICAgICAgICAgICAgICAgICBmSGVscGVycy5yZW1vdmUoZW50cnkpOwotCSAgICAgICAgICAgICAgICBmSGVscGVycy5hZGQoMSwgZW50cnkpOwotCSAgICAgICAgICAgICAgICBpZihERUJVRykgewotCSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIigtPikgVGFnbGliSGVscGVyQ2FjaGUgbW92ZWQ6ICIgKyBlbnRyeSArICIgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICAgICAgICAgICAgICAgICAgcHJpbnRDYWNoZUNvbnRlbnRzKCk7Ci0JICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZGlkbid0IGV4aXN0Ci0gICAgICAgIGlmKGhlbHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoZWxwZXIgPSBjcmVhdGVOZXdIZWxwZXIocHJvamVjdFBhdGgsIHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWxwZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcm9qZWN0UGF0aAotICAgICAqIEBwYXJhbSBmCi0gICAgICogQHBhcmFtIG1xCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgVGFnbGliSGVscGVyIGNyZWF0ZU5ld0hlbHBlcihTdHJpbmcgcHJvamVjdFBhdGgsIElQcm9qZWN0IHByb2plY3QpIHsKLQotICAgICAgICBUYWdsaWJIZWxwZXIgaGVscGVyOwotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgaGVscGVyID0gbmV3IFRhZ2xpYkhlbHBlcihwcm9qZWN0KTsKLSAgICAgICAgRW50cnkgbmV3RW50cnkgPSBuZXcgRW50cnkocHJvamVjdFBhdGgsIGhlbHBlcik7Ci0gICAgICAgIGZIZWxwZXJzLmFkZCgwLCBuZXdFbnRyeSk7Ci0gICAgICAgIGlmKERFQlVHKSB7Ci0gICAgICAgIAlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiKCspIFRhZ2xpYkhlbHBlckNhY2hlIGFkZGVkOiAiICsgbmV3RW50cnkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwcmludENhY2hlQ29udGVudHMoKTsKLSAgICAgICAgfQotICAgICAgICBpZihmSGVscGVycy5zaXplKCkgPiBNQVhfU0laRSkgewotICAgICAgICAgICAgLy8gb25lIHRvbyBtYW55LCByZW1vdmUgbGFzdAotICAgICAgICAgICAgT2JqZWN0IHJlbW92ZWQgPSBmSGVscGVycy5yZW1vdmUoZkhlbHBlcnMuc2l6ZSgpLTEpOwotICAgICAgICAgICAgaWYoREVCVUcpIHsKLSAgICAgICAgICAgIAlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiKC0pIFRhZ2xpYkhlbHBlckNhY2hlIHJlbW92ZWQ6ICIgKyByZW1vdmVkKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWxwZXI7Ci0gICAgfQotIAotICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVIZWxwZXIoU3RyaW5nIHByb2plY3RQYXRoKSB7Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBmSGVscGVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGVudHJ5ID0gKEVudHJ5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmKGVudHJ5LmdldFByb2plY3RQYXRoKCkuZXF1YWxzKHByb2plY3RQYXRoKSkgewotICAgICAgICAgICAgICAgIGZIZWxwZXJzLnJlbW92ZShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgaWYoREVCVUcpIHsgCi0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLklORk8sICIoLSkgVGFnbGliSGVscGVyQ2FjaGUgcmVtb3ZlZDogIiArIGVudHJ5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBwcmludENhY2hlQ29udGVudHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50Q2FjaGVDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGRlYnVnU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuY2FjaGUgY29udGVudHM6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZIZWxwZXJzLnNpemUoKTsgaSsrKQkKLSAgICAgICAgCWRlYnVnU3RyaW5nLmFwcGVuZCgiXG4gLSIgKyBpICsgIi0gIiArIGZIZWxwZXJzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBkZWJ1Z1N0cmluZy50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDNlY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLQotLyoqCi0gKiBNYW5hZ2VzIGNyZWF0aW9uIGFuZCBjYWNoaW5nIChvcmRlcmVkIE1SVSkgb2YgVGFnbGliSGVscGVycy4KLSAqIFJlbW92ZXMgaGVscGVycyB3aGVuIHRoZWlyIGNsYXNzcGF0aCBjaGFuZ2VzIChzbyB0aGV5IGFyZSByZWJ1aWx0KS4KLSAqIFRoZXJlIGlzIG9uZSBoZWxwZXIgcGVyIHByb2plY3QgKHdpdGggYSBzcGVjaWZpYyBjbGFzc3BhdGggZW50cnkpLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliSGVscGVyTWFuYWdlciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLSAgIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGFnbGliSGVscGVyTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0gICAgLy8gdXNpbmcgYSBjYWNoZSBvZiBqdXN0IDMgbG9hZGVycwotICAgIHByaXZhdGUgVGFnbGliSGVscGVyQ2FjaGUgZkNhY2hlID0gbmV3IFRhZ2xpYkhlbHBlckNhY2hlKDMpOwotCi0gICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXJNYW5hZ2VyKCkgewotICAgICAgICAvLyB1c2UgaW5zdGFuY2UKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgVGFnbGliSGVscGVyTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFRhZ2xpYkhlbHBlck1hbmFnZXIoKTsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGFnbGliSGVscGVyIGdldFRhZ2xpYkhlbHBlcihJRmlsZSBmKSB7Ci0gICAgICAgIElQcm9qZWN0IHAgPSBmLmdldFByb2plY3QoKTsKLSAgICAgICAgcmV0dXJuIGdldEhlbHBlckZyb21DYWNoZShwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByb2plY3RQYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXIgZ2V0SGVscGVyRnJvbUNhY2hlKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIGZDYWNoZS5nZXRIZWxwZXIocHJvamVjdCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZSBjbGFzc3BhdGggZm9yIGFwcHJvcHJpYXRlIGxvYWRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyI2VsZW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCi0gICAgICAgIC8vIGhhbmRsZSBjbGFzc3BhdGggY2hhbmdlcwotICAgICAgICBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgICAgIGlmKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0gICAgICAgICAgICBJSmF2YUVsZW1lbnREZWx0YVtdIGNoYW5nZWQgPSBkZWx0YS5nZXRDaGFuZ2VkQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmKChjaGFuZ2VkW2ldLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIElKYXZhRWxlbWVudCBwcm9qID0gY2hhbmdlZFtpXS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsYXNzcGF0aENoYW5nZShjaGFuZ2VkLCBpLCBwcm9qKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gaQotICAgICAqIEBwYXJhbSBwcm9qCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzcGF0aENoYW5nZShJSmF2YUVsZW1lbnREZWx0YVtdIGNoYW5nZWQsIGludCBpLCBJSmF2YUVsZW1lbnQgcHJvaikgewotCi0gICAgICAgIGlmKHByb2ouZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdFBhdGggPSBwcm9qLmdldFBhdGgoKS50b1N0cmluZygpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgICAgIGZDYWNoZS5yZW1vdmVIZWxwZXIocHJvamVjdFBhdGgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYlZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGNlY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi0vKioKLSAqIENvbnRhaW5zIGluZm8gYWJvdXQgYSBUYWdsaWJWYXJpYWJsZTogY2xhc3NuYW1lLCB2YXJpYWJsZW5hbWUuCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliVmFyaWFibGUgewotICAgIAotCXByaXZhdGUgU3RyaW5nIGZWYXJDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZhck5hbWUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlKFN0cmluZyB2YXJDbGFzcywgU3RyaW5nIHZhck5hbWUpIHsKLQkJc2V0VmFyQ2xhc3ModmFyQ2xhc3MpOwotCQlzZXRWYXJOYW1lKHZhck5hbWUpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZWYXJDbGFzcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhckNsYXNzKCkgewotCQlyZXR1cm4gZlZhckNsYXNzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gdmFyQ2xhc3MgVGhlIGZWYXJDbGFzcyB0byBzZXQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0VmFyQ2xhc3MoU3RyaW5nIHZhckNsYXNzKSB7Ci0JCWZWYXJDbGFzcyA9IHZhckNsYXNzOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZWYXJOYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFyTmFtZSgpIHsKLQkJcmV0dXJuIGZWYXJOYW1lOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gdmFyTmFtZSBUaGUgZlZhck5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhck5hbWUoU3RyaW5nIHZhck5hbWUpIHsKLQkJZlZhck5hbWUgPSB2YXJOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGVjbGFyYXRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRWYXJDbGFzcygpICsgIiAiICsgZ2V0VmFyTmFtZSgpICsgIiA9IG51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Rhc2tzL0pTUEZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2FiNTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lcjsKLQotcHVibGljIGNsYXNzIEpTUEZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFhNTEZpbGVUYXNrU2Nhbm5lciB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiBzdXBlci5pc0NvbW1lbnRSZWdpb24ocmVnaW9uLCB0ZXh0UmVnaW9uKSB8fCB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MmFkZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQkvLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHY1LjEuMCwgd2UnbGwgcmV1c2UgU1RfSlNQX0RJUkVDVElWRSBmb3IgYWN0aW9uCi0JLy8gdGFncwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZkVuYWJsZUpTUEFjdGlvblBhcnRpdGlvbnMgPSB0cnVlOwotCS8vIGxpc3Qgb2YgdmFsaWQgSlNQIDEuMiB0YWcgYW5kIGFjdGlvbiBuYW1lcwotCXByaXZhdGUgc3RhdGljIExpc3QgZkpTUEFjdGlvblRhZ05hbWVzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9NSU1FX1RZUEUgPSAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSFRNTF9NSU1FX1RZUEUgPSAidGV4dC94aHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX01JTUVfVFlQRSA9ICJ0ZXh0L3htbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk5EX1dBUF9XTUwgPSAidGV4dC92bmQud2FwLndtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCwgSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwyLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIsIElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEsIElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQsIElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UfTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGZFbWJlZGRlZFBhcnRpdGlvbmVyID0gbnVsbDsKLQkvKgotCSAqIFNhdmUgbGFzdCB0YWdsaWIgcHJlZml4IHRoYXQgd2FzIGNoZWNrZWQgKHNlZSBpc0FjdGlvbigpKSBmb3IgYmV0dGVyCi0JICogcGVyZm9ybWFuY2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdENoZWNrZWRQcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQXNzdW1lIGxhbmd1YWdlPWphdmEgYnkgZGVmYXVsdCAuLi4gY2xpZW50LCBzdWNoIGFzCi0JICogUGFnZURpcmVjdGl2ZUFkYXB0ZXIsIG11c3Qgc2V0IGxhbmd1YWdlIG9mIGRvY3VtZW50IHBhcnRpdGlvbmVyLAotCSAqIGlmL3doZW4gaXQgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFuZ3VhZ2UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKU1BEb2N1bWVudFBhcnRpb25lci4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGZKU1BBY3Rpb25UYWdOYW1lcyA9PSBudWxsKSB7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHVzZXMgLmVxdWFscygpIGZvcgotCQkJLy8gY29udGFpbnMoKQotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JCQkvLyBmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJLy8gZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTik7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5DTFVERSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Nvbm5lY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuY29ubmVjdChkb2N1bWVudCk7Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHJlc3VsdCA9IG51bGw7Ci0JCUpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvciBqc3BIZWFkQ29udGVudERldGVjdG9yID0gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCQlqc3BIZWFkQ29udGVudERldGVjdG9yLnNldChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlTdHJpbmcgY29udGVudFR5cGU7Ci0JCXRyeSB7Ci0JCQljb250ZW50VHlwZSA9IGpzcEhlYWRDb250ZW50RGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIGJlIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyB3ZSBjdXJyZW50bHkgb25seSBoYXZlIHR3byAuLi4gZXZlbnR1YWxseSBzaG91bGQKLQkJLy8gbWFrZSBvciB0aWUtaW4gdG8gZXhpc3RpbmcgcmVnaXN0cnkuCi0JCWlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUxfTUlNRV9UWVBFKSB8fCBjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFZORF9XQVBfV01MKSkgewotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWEhUTUxfTUlNRV9UWVBFKSkgewotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWE1MX01JTUVfVFlQRSkgfHwgY29udGVudFR5cGUuZW5kc1dpdGgoIit4bWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZGlzY29ubmVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJaWYgKGZFbWJlZGRlZFBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmRpc2Nvbm5lY3QoKTsKLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTA5Ci0JCQkvKioKLQkJCSAqIGZvcmNlIHJlY3JlYXRpb24gd2hlbiByZWNvbm5lY3RlZAotCQkJICovCi0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lciA9IG51bGw7Ci0JCX0KLQkJLy8gc3VwZXIuZGlzY29ubmVjdCBzaG91bGQgY29tZSBhdCBlbmQsIHNpbmNlIGl0IChtYXkpIHNldAotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gbnVsbAotCQlzdXBlci5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVtYmVkZGVkUGFydGl0aW9uZXIuCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkgewotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIuY29ubmVjdChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCi0JCXJldHVybiBmRW1iZWRkZWRQYXJ0aXRpb25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldExvY2FsTGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGNvbmZpZ3VyZWRUeXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkVHlwZXMubGVuZ3RoOyBpKyspCi0JCQl0eXBlcy5hZGQoY29uZmlndXJlZFR5cGVzW2ldKTsKLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcmVudE5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsICYmIGlzVmFsaWRKc3BBY3Rpb25SZWdpb25UeXBlKHNkUmVnaW9uLmdldFR5cGUoKSkpCi0JCQlzZFJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0KLQkJaWYgKHNkUmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJLy8gb25seSBmaW5kIHBhcmVudCBuYW1lcyBmcm9tIGEgc3RhcnQgdGFnCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWlmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiByLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpKSB7Ci0JCQkJCXJlc3VsdCA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgcmVnaW9uX3R5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkU7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUjsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NPTlRFTlQgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NMT1NFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9EUVVPVEUgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX1NRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfUVVPVEVEX0NPTlRFTlQpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfQ09OVEVOVCB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0NMT1NFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfRFFVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfU1FVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfUVVPVEVEX0NPTlRFTlQpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTDI7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCS8vIEJVRzEzMTQ2MzogcG9zc2libHkgYmV0d2VlbiA8anNwOnNjcmlwdGxldD4sIDxqc3A6ZXhwcmVzc2lvbj4sCi0JCQkvLyA8anNwOmRlY2xhcmF0aW9uPgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IHRoaXMuZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGlzSnNwSmF2YUFjdGlvbk5hbWUoZ2V0UGFyZW50TmFtZShzZFJlZ2lvbikpKQotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCS8vIHBvc3NpYmx5IGJldHdlZW4gPGpzcDpzY3JpcHRsZXQ+LCA8anNwOmV4cHJlc3Npb24+LAotCQkJLy8gPGpzcDpkZWNsYXJhdGlvbj4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSB0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpc0pzcEphdmFBY3Rpb25OYW1lKGdldFBhcmVudE5hbWUoc2RSZWdpb24pKSkKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlRm9yRG9jdW1lbnRMYW5ndWFnZSgpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4ocHJldmlvdXNOb2RlLCBuZXh0Tm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUZvckRvY3VtZW50TGFuZ3VhZ2UoKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0JCWlmIChmTGFuZ3VhZ2UgPT0gbnVsbCB8fCBmTGFuZ3VhZ2UuZXF1YWxzSWdub3JlQ2FzZSgiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkE7Ci0JCX0KLQkJZWxzZSBpZiAoZkxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFzY3JpcHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX1NDUklQVF9QUkVGSVggKyBnZXRMYW5ndWFnZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJTGlzdCBjb21iaW5lZFR5cGVzID0gZ2V0TG9jYWxMZWdhbENvbnRlbnRUeXBlcygpOwotCQlpZiAoZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIG1vcmVUeXBlcyA9IGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXRMZWdhbENvbnRlbnRUeXBlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb3JlVHlwZXMubGVuZ3RoOyBpKyspCi0JCQkJY29tYmluZWRUeXBlcy5hZGQobW9yZVR5cGVzW2ldKTsKLQkJfQotCQlmU3VwcG9ydGVkVHlwZXMgPSBuZXcgU3RyaW5nWzBdOwotCQljb21iaW5lZFR5cGVzLnRvQXJyYXkoZlN1cHBvcnRlZFR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0FjdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICghc2RSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8qCi0JCSAqIHNob3VsZG4ndCBnZXQgYSB0YWcgbmFtZSByZWdpb24gdHlwZSB1bmxlc3MgYSB0YWcgbmFtZSByZWdpb24KLQkJICogZXhpc3RzIGF0IFsxXQotCQkgKi8KLQkJSVRleHRSZWdpb24gdGFnTmFtZVJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCVN0cmluZyB0YWdOYW1lID0gc2RSZWdpb24uZ2V0VGV4dCh0YWdOYW1lUmVnaW9uKTsKLQotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIEpTUFNvdXJjZVBhcnNlcikgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKGZMYXN0Q2hlY2tlZFByZWZpeCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlMaXN0IGZDdXN0b21BY3Rpb25QcmVmaXhlcyA9ICgoSlNQU291cmNlUGFyc2VyKSBwYXJzZXIpLmdldE5lc3RhYmxlUHJlZml4ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkN1c3RvbUFjdGlvblByZWZpeGVzLnNpemUoKTsgaSsrKQotCQkJCWlmICh0YWdOYW1lLnN0YXJ0c1dpdGgoKChUYWdNYXJrZXIpIGZDdXN0b21BY3Rpb25QcmVmaXhlcy5nZXQoaSkpLmdldFRhZ05hbWUoKSkpIHsKLQkJCQkJZkxhc3RDaGVja2VkUHJlZml4ID0gdGFnTmFtZTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RvY3VtZW50UmVnaW9uQmFzZWRQYXJ0aXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVRleHRSZWdpb24gY29udGFpbmVkQ2hpbGRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIGRvY3VtZW50UmVnaW9uQ29udGV4dCA9IHNkUmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKGNvbnRhaW5lZENoaWxkUmVnaW9uICE9IG51bGwpIHsKLQkJCWlmIChkb2N1bWVudFJlZ2lvbkNvbnRleHQuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgZG9jdW1lbnRSZWdpb25Db250ZXh0LmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGNvbnRhaW5lZENoaWxkUmVnaW9uLmdldExlbmd0aCgpLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTMzNDYKLQkJCWlmIChmRW5hYmxlSlNQQWN0aW9uUGFydGl0aW9ucyAmJiBpc0FjdGlvbihzZFJlZ2lvbiwgb2Zmc2V0KSAmJiAhKGNvbnRhaW5lZENoaWxkUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJLy8gaWYgKGZFbmFibGVKU1BBY3Rpb25QYXJ0aXRpb25zICYmIGlzQWN0aW9uKHNkUmVnaW9uLAotCQkJCS8vIG9mZnNldCkpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGNvbnRhaW5lZENoaWxkUmVnaW9uLmdldExlbmd0aCgpLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKHNkUmVnaW9uLCBjb250YWluZWRDaGlsZFJlZ2lvbiwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcG9zc2libGVKc3BKYXZhQWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pzcEphdmFBY3Rpb25OYW1lKFN0cmluZyBwb3NzaWJsZUpzcEphdmFBY3Rpb24pIHsKLQkJcmV0dXJuIHBvc3NpYmxlSnNwSmF2YUFjdGlvbi5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKSB8fCBwb3NzaWJsZUpzcEphdmFBY3Rpb24uZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pIHx8IHBvc3NpYmxlSnNwSmF2YUFjdGlvbi5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSnNwQWN0aW9uUmVnaW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQkvLyB0cnVlIGZvciBhbnl0aGluZyB0aGF0IGNhbiBiZSB3aXRoaW4gPGpzcDpzY3JpcHRsZXQ+LAotCQkvLyA8anNwOmV4cHJlc3Npb24+LCA8anNwOmRlY2xhcmF0aW9uPgotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpOwotCQlpbnN0YW5jZS5zZXRFbWJlZGRlZFBhcnRpdGlvbmVyKGNyZWF0ZVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoZlN0cnVjdHVyZWREb2N1bWVudCkpOwotCQlpbnN0YW5jZS5zZXRMYW5ndWFnZShmTGFuZ3VhZ2UpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW1iZWRkZWRQYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcGFyYW0gZW1iZWRkZWRQYXJ0aXRpb25lcgotCSAqICAgICAgICAgICAgVGhlIGVtYmVkZGVkUGFydGl0aW9uZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBlbWJlZGRlZFBhcnRpdGlvbmVyKSB7Ci0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTA5Ci0JCS8qKgotCQkgKiBtYW5hZ2UgY29ubmVjdGVkIHN0YXRlIG9mIGVtYmVkZGVkIHBhcnRpdGlvbmVyCi0JCSAqLwotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmRpc2Nvbm5lY3QoKTsKLQkJfQotCi0JCXRoaXMuZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBlbWJlZGRlZFBhcnRpdGlvbmVyOwotCi0JCWlmIChmRW1iZWRkZWRQYXJ0aXRpb25lciAhPSBudWxsICYmIGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIuY29ubmVjdChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gY2FycnkgdGhpcyBzaW5nbGUgaW5zdGFuY2UgaWRlYSBmdXJ0aGVyIHRvIGJlCi0JCS8vIGNvbXBsZXRlLAotCQkvLyBidXQgaG9wZWZ1bGx5IHRoaXMgd2lsbCBiZSBsZXNzIGdhcmJhZ2UgdGhhbiBiZWZvcmUgKGVzcGVjaWFsbHkgZm9yCi0JCS8vIEhUTUwsIFhNTCwKLQkJLy8gbmF0dXJhbGx5ISkKLQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UgPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuY3JlYXRlUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhbmd1YWdlLgotCSAqIAotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqICAgICAgICAgICAgVGhlIGxhbmd1YWdlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQl0aGlzLmZMYW5ndWFnZSA9IGxhbmd1YWdlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25YTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25YTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxYzI0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIENvbW1vblhNTCB7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgewotCQlEb2N1bWVudEJ1aWxkZXIgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcihib29sZWFuIHZhbGlkYXRpbmcpIHsKLQkJRG9jdW1lbnRCdWlsZGVyIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGluc3RhbmNlID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJaW5zdGFuY2Uuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKLQkJCWluc3RhbmNlLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZmFsc2UpOwotCQkJaW5zdGFuY2Uuc2V0Q29hbGVzY2luZyh0cnVlKTsKLQkJCXJlc3VsdCA9IGluc3RhbmNlLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKERvY3VtZW50IGRvY3VtZW50LCBPdXRwdXRTdHJlYW0gb3N0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cnkgewotCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTE2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIHVuc3VwcG9ydGVkIHByb3BlcnRpZXMKLQkJCX0KLQkJCXNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvc3RyZWFtKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVlMzEwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIFhNTCBDcmVhdG9yL1JlYWRlci9Xcml0ZXIgdGhhdCAxKSBJZ25vcmVzIGFueSBEb2N1bWVudFR5cGUgTm9kZXMgZm91bmQKLSAqIHdpdGhpbiB0aGUgZG9jdW1lbnQgKGFzIHdlbGwgYXMgYW55IGVudGl0aWVzKSAyKSBJZ25vcmVzIGFueQotICogZXJyb3JzL2V4Y2VwdGlvbnMgZnJvbSBYZXJjZXMgd2hlbiBsb2FkaW5nIGEgZG9jdW1lbnQgMykgQ2FuIGxvYWQgRG9jdW1lbnRzCi0gKiBmcm9tIHdpdGhpbiBhIC5KQVIgZmlsZSAoKioqcmVhZC1vbmx5KioqKQotICovCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFByb3ZpZGVyIHsKLQlwcml2YXRlIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZCYXNlUmVmZXJlbmNlOwotCXByaXZhdGUgU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlZhbGlkYXRpbmcgPSBmYWxzZTsKLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBqYXJGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0KLQlwcml2YXRlIE5vZGUgcm9vdEVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSA9IG51bGw7Ci0KLQlwdWJsaWMgRG9jdW1lbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBfZ2V0RmlsZU5hbWUoKSB7Ci0JCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGlzSkFSKCkpIHsKLQkJCXJldHVybiBnZXRKYXJGaWxlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBnZXRGaWxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgX2dldFBhcnNlZERvY3VtZW50RE9NMigpIHsKLQkJRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGdldERvY3VtZW50QnVpbGRlcigpOwotCQkJLy8gRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLQkJCS8vIHBhcnNlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLAotCQkJLy8gZmFsc2UpOy8vJE5PTi1OTFMtMSQKLQkJCS8vIHBhcnNlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvbm9udmFsaWRhdGluZy9sb2FkLWR0ZC1ncmFtbWFyIiwKLQkJCS8vIGZhbHNlKTsvLyROT04tTkxTLTEkCi0JCQkvLyBwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGdldE51bGxFcnJvckhhbmRsZXIoKSk7Ci0JCQkvLyBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZ2V0TnVsbEVudGl0eVJlc29sdmVyKCkpOwotCQkJLy8gaXMgPSBnZXRJbnB1dFN0cmVhbSgpOwotCQkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihnZXRFbnRpdHlSZXNvbHZlcigpKTsKLQkJCWJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGdldE51bGxFcnJvckhhbmRsZXIoKSk7Ci0JCQlpcyA9IGdldElucHV0U3RyZWFtKCk7Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBidWlsZGVyLnBhcnNlKGlzLCBnZXRCYXNlUmVmZXJlbmNlKCkpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gbnVsbDsKLQkJCS8vIHBhcnNpbmcgZXhjZXB0aW9uLCBub3RpZnkgdGhlIHVzZXI/Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvciAiICsgX2dldEZpbGVOYW1lKCkgKyAiICIgKyBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBOT1QgYW4gImV4Y2VwdGlvbmFsIGNhc2UiOyBkbyBub3QgTG9nCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJJT0V4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3IgIiArIF9nZXRGaWxlTmFtZSgpICsgIiAiICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gd2hhdCBjYW4gYmUgZG9uZT8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZkJhc2VSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBEb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KHRydWUpOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudChib29sZWFuIGNyZWF0ZUVtcHR5T25GYWlsdXJlKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJbG9hZChjcmVhdGVFbXB0eU9uRmFpbHVyZSk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7Ci0JCXJldHVybiBDb21tb25YTUwuZ2V0RG9jdW1lbnRCdWlsZGVyKGlzVmFsaWRhdGluZygpKTsKLQl9Ci0KLQlwcml2YXRlIERPTUltcGxlbWVudGF0aW9uIGdldERvbUltcGxlbWVudGF0aW9uKCkgewotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlMSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCX0KLQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IGJ1aWxkZXIuZ2V0RE9NSW1wbGVtZW50YXRpb24oKTsKLQkJcmV0dXJuIGltcGw7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUYWtlcyBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gImEvYi9jIiBhbmQgZW5zdXJlcyB0aGF0IHRoYXQKLQkgKiBzdHJ1Y3R1cmUgZXhpc3RzIGJlbG93IHRoZSBoZWFkIGVsZW1lbnQsIGRvd24gdGhyb3VnaCAnYycsIGFuZCByZXR1cm5zCi0JICogYSA8ZW0+c2luZ2xlPC9lbT4gZWxlbWVudCAnYycuIEZvciBtdWx0aXBsZSBlbGVtZW50cyAoc3VjaCBhcwotCSAqIG11bHRpcGxlICZsdDttYWNybyZndDsgZWxlbWVudHMgY29udGFpbmVkIHdpdGhpbiBhIHNpbmdsZQotCSAqICZsdDttYWNyb3MmZ3Q7IGVsZW1lbnQsIGZ1bGwgRE9NIGFjY2VzcyBpcyByZXF1aXJlZCBmb3Igc2VhcmNoaW5nIGFuZAotCSAqIGNoaWxkIGVsZW1lbnQgbWFuaXB1bGF0aW9uLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudChTdHJpbmcgbmFtZSkgewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJbG9hZChmYWxzZSk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoRWxlbWVudCkgZ2V0Tm9kZShnZXRSb290RWxlbWVudCgpLCBuYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRW50aXR5UmVzb2x2ZXIgdGhhdCB3b24ndCB0cnkgdG8gbG9hZCBhbmQgcmVzb2x2ZSBBTlkKLQkgKiBlbnRpdGllcwotCSAqLwotCXByaXZhdGUgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQlyZXNvbHZlciA9IG5ldyBFbnRpdHlSZXNvbHZlcigpIHsKLQkJCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJCQlJbnB1dFNvdXJjZSByZXN1bHQgPSBudWxsOwotCQkJCQlpZiAoaXNWYWxpZGF0aW5nKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVVJMIHNwZWMgPSBuZXcgVVJMKCJmaWxlOi8vIiArIGdldEJhc2VSZWZlcmVuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlVUkwgdXJsID0gbmV3IFVSTChzcGVjLCBzeXN0ZW1JRCk7Ci0JCQkJCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJCQkJcmVzdWx0ID0gbmV3IElucHV0U291cmNlKHN5c3RlbUlEICE9IG51bGwgPyBzeXN0ZW1JRCA6ICIvXyIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSUQpOwotCQkJCQkJCQlyZXN1bHQuc2V0Qnl0ZVN0cmVhbShjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCQkJCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJRCk7Ci0JCQkJCQlyZXN1bHQuc2V0U3lzdGVtSWQoc3lzdGVtSUQgIT0gbnVsbCA/IHN5c3RlbUlEIDogIi9fIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW5kIGlucHV0IHN0cmVhbSB0byB1c2UgYXMgdGhlIHNvdXJjZSBvZiB0aGUgRG9jdW1lbnQgMSkgZnJvbQotCSAqIGFuIElucHV0U3RyZWFtIHNldCBvbiB0aGlzIGluc3RhbmNlIDIpIGZyb20gYSBKQVIgZmlsZSB3aXRoIHRoZSBnaXZlbgotCSAqIGVudHJ5IG5hbWUgMykgZnJvbSBhIG5vcm1hbCBmaWxlCi0JICogCi0JICogQHJldHVybiBJbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dFN0cmVhbTsKLQkJZWxzZSBpZiAoaXNKQVIoKSkgewotCQkJcmV0dXJuIEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShnZXRKYXJGaWxlTmFtZSgpLCBnZXRGaWxlTmFtZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZpbGVOYW1lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXJGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGphckZpbGVOYW1lOwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXROYW1lZENoaWxkKE5vZGUgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3QgY2hpbGRMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkTGlzdC5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpCi0JCQkJcmV0dXJuIGNoaWxkTGlzdC5pdGVtKGkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0TmV3RG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXREb21JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCBnZXRSb290RWxlbWVudE5hbWUoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gcmVzdWx0LmdldENoaWxkTm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCXJlc3VsdC5yZW1vdmVDaGlsZChjaGlsZHJlbi5pdGVtKGkpKTsKLQkJCX0KLQkJCS8vIHdlJ3JlIGdvaW5nIHRocm91Z2ggdGhpcyBlZmZvcnQgdG8gYXZvaWQgYSBOUyBlbGVtZW50Ci0JCQlFbGVtZW50IHNldHRpbmdzID0gcmVzdWx0LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgZ2V0Um9vdEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuYXBwZW5kQ2hpbGQoc2V0dGluZ3MpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUYWtlcyBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gImEvYi9jIiBhbmQgZW5zdXJlcyB0aGF0IHRoYXQKLQkgKiBzdHJ1Y3R1cmUgZXhpc3RzIGJlbG93IHRoZSBoZWFkIGVsZW1lbnQsIGRvd24gdGhyb3VnaCAnYycsIGFuZCByZXR1cm5zCi0JICogdGhlIGVsZW1lbnQgJ2MnLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHJpdmF0ZSBOb2RlIGdldE5vZGUoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSkgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b2tlbiA9IG51bGw7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmIChnZXROYW1lZENoaWxkKG5vZGUsIHRva2VuKSA9PSBudWxsKQotCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b2tlbikpOwotCQkJbm9kZSA9IGdldE5hbWVkQ2hpbGQobm9kZSwgdG9rZW4pOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRXJyb3JIYW5kbGVyIHRoYXQgd2lsbCBub3Qgc3RvcCB0aGUgcGFyc2VyIG9uIHJlcG9ydGVkCi0JICogZXJyb3JzCi0JICovCi0JcHJpdmF0ZSBFcnJvckhhbmRsZXIgZ2V0TnVsbEVycm9ySGFuZGxlcigpIHsKLQkJaWYgKGVycm9ySGFuZGxlciA9PSBudWxsKSB7Ci0JCQllcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJTQVhQYXJzZUV4Y2VwdGlvbiB3aXRoICIgKyBnZXRKYXJGaWxlTmFtZSgpICsgIi8iICsgZ2V0RmlsZU5hbWUoKSArICIgKGVycm9yKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJTQVhQYXJzZUV4Y2VwdGlvbiB3aXRoICIgKyBnZXRKYXJGaWxlTmFtZSgpICsgIi8iICsgZ2V0RmlsZU5hbWUoKSArICIgKGZhdGFsRXJyb3IpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGdldEphckZpbGVOYW1lKCkgKyAiLyIgKyBnZXRGaWxlTmFtZSgpICsgIiAod2FybmluZykgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZXJyb3JIYW5kbGVyOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0UGFyc2VkRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQlGaWxlIGV4aXN0ZW5jZVRlc3RlciA9IG51bGw7Ci0JCQlpZiAoaXNKQVIoKSkKLQkJCQlleGlzdGVuY2VUZXN0ZXIgPSBuZXcgRmlsZShnZXRKYXJGaWxlTmFtZSgpKTsKLQkJCWVsc2UKLQkJCQlleGlzdGVuY2VUZXN0ZXIgPSBuZXcgRmlsZShnZXRGaWxlTmFtZSgpKTsKLQkJCWlmICghZXhpc3RlbmNlVGVzdGVyLmV4aXN0cygpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmVzdWx0ID0gX2dldFBhcnNlZERvY3VtZW50RE9NMigpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IEVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRSb290RWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldFJvb3RFbGVtZW50KGdldERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlL2Egcm9vdCBFbGVtZW50IGZvciB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXRyeSB7Ci0JCQlFbGVtZW50IG5ld1Jvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoZ2V0Um9vdEVsZW1lbnROYW1lKCkpOwotCQkJZG9jLmFwcGVuZENoaWxkKG5ld1Jvb3RFbGVtZW50KTsKLQkJCXJldHVybiBuZXdSb290RWxlbWVudDsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Um9vdEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gcm9vdEVsZW1lbnROYW1lOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0pBUigpIHsKLQkJcmV0dXJuIGdldEphckZpbGVOYW1lKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkgewotCQlyZXR1cm4gZlZhbGlkYXRpbmc7Ci0JfQotCi0Jdm9pZCBsb2FkKGJvb2xlYW4gY3JlYXRlRW1wdHlPbkZhaWx1cmUpIHsKLQkJLy8gcm9vdEVsZW1lbnROYW1lIGFuZCBmaWxlTmFtZSBhcmUgZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBhdCB0aGlzCi0JCS8vIHBvaW50Ci0JCWRvY3VtZW50ID0gZ2V0UGFyc2VkRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmIChyb290RWxlbWVudE5hbWUgIT0gbnVsbCkKLQkJCQlyb290RWxlbWVudCA9IGdldFJvb3RFbGVtZW50KGRvY3VtZW50KTsKLQkJCWVsc2UKLQkJCQlyb290RWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQl9Ci0KLQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgcm9vdEVsZW1lbnQgPT0gbnVsbCkgewotCQkJaWYgKGNyZWF0ZUVtcHR5T25GYWlsdXJlKSB7Ci0JCQkJZG9jdW1lbnQgPSBnZXROZXdEb2N1bWVudCgpOwotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscyhnZXRSb290RWxlbWVudE5hbWUoKSkpCi0JCQkJCQkJcm9vdEVsZW1lbnQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCQl9Ci0JCQkJCWlmIChyb290RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkJCXJvb3RFbGVtZW50ID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhc2VSZWZlcmVuY2UoU3RyaW5nIHN0cmluZykgewotCQlmQmFzZVJlZmVyZW5jZSA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld0ZpbGVOYW1lKSB7Ci0JCWZpbGVOYW1lID0gbmV3RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5wdXRTdHJlYW0gZm9yIHdoaWNoIHRvIHByb3ZpZGUgYSBEb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLQkgKiAgICAgICAgICAgIFRoZSBpbnB1dFN0cmVhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpU3RyZWFtKSB7Ci0JCXRoaXMuaW5wdXRTdHJlYW0gPSBpU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdKYXJGaWxlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphckZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3SmFyRmlsZU5hbWUpIHsKLQkJamFyRmlsZU5hbWUgPSBuZXdKYXJGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Um9vdEVsZW1lbnROYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9vdEVsZW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3Um9vdEVsZW1lbnROYW1lKSB7Ci0JCXJvb3RFbGVtZW50TmFtZSA9IG5ld1Jvb3RFbGVtZW50TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoYm9vbGVhbiBiKSB7Ci0JCWZWYWxpZGF0aW5nID0gYjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUERpcmVjdGl2ZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUERpcmVjdGl2ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M4Zjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BEaXJlY3RpdmVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogQ2hlY2tzIGZvcjogLSBkdXBsaWNhdGUgdGFnbGliIHByZWZpeCB2YWx1ZXMgYW5kIHJlc2VydmVkIHRhZ2xpYiBwcmVmaXgKLSAqIHZhbHVlcyBpbiB0aGUgc2FtZSBmaWxlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpTUERpcmVjdGl2ZVZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZlJlc2VydmVkUHJlZml4ZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSGFzaE1hcCBmVGFnbGliUHJlZml4ZXNJblVzZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZUZXh0UmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgSlNQRGlyZWN0aXZlVmFsaWRhdG9yKCkgewotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoImpzcCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgianNweCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgiamF2YSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgiamF2YXgiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJzZXJ2bGV0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgic3VuIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgic3VudyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCQlmVGV4dFJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29sbGVjdFByZWZpeChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiwgU3RyaW5nIHRhZ2xpYlByZWZpeCkgewotCQlmVGV4dFJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAucHV0KHZhbHVlUmVnaW9uLCBkb2N1bWVudFJlZ2lvbik7Ci0KLQkJT2JqZWN0IG8gPSBmVGFnbGliUHJlZml4ZXNJblVzZS5nZXQodGFnbGliUHJlZml4KTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gcHJlZml4IGRvZXNuJ3QgZXhpc3QsIHJlbWVtYmVyIGl0Ci0JCQlmVGFnbGliUHJlZml4ZXNJblVzZS5wdXQodGFnbGliUHJlZml4LCB2YWx1ZVJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IHJlZ2lvbkxpc3QgPSBudWxsOwotCQkJLy8gYWxyZWFkeSBhIExpc3QKLQkJCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJlZ2lvbkxpc3QgPSAoTGlzdCkgbzsKLQkJCX0KLQkJCS8qCi0JCQkgKiBhIHNpbmdsZSB2YWx1ZSByZWdpb24sIGNyZWF0ZSBhIG5ldyBMaXN0IGFuZCBhZGQgcHJldmlvdXMKLQkJCSAqIHZhbHVlUmVnaW9uCi0JCQkgKi8KLQkJCWVsc2UgewotCQkJCXJlZ2lvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVnaW9uTGlzdC5hZGQobyk7Ci0JCQkJZlRhZ2xpYlByZWZpeGVzSW5Vc2UucHV0KHRhZ2xpYlByZWZpeCwgcmVnaW9uTGlzdCk7Ci0JCQl9Ci0JCQlyZWdpb25MaXN0LmFkZCh2YWx1ZVJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNSZXNlcnZlZFByZWZpeChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlJlc2VydmVkUHJlZml4ZXMuZ2V0KG5hbWUpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaXJlY3RpdmUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IHNEb2MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBnZXREaXJlY3RpdmVOYW1lKGRvY3VtZW50UmVnaW9uKTsKLQkJLy8gd2Ugb25seSBjYXJlIGFib3V0IHRhZ2xpYiBkaXJlY3RpdmUKLQkJaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QUkVGSVgpOwotCQkJaWYgKHZhbHVlUmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlTdHJpbmcgdGFnbGliUHJlZml4ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh2YWx1ZVJlZ2lvbik7Ci0JCQl0YWdsaWJQcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlcyh0YWdsaWJQcmVmaXgpOwotCi0JCQljb2xsZWN0UHJlZml4KGRvY3VtZW50UmVnaW9uLCB2YWx1ZVJlZ2lvbiwgdGFnbGliUHJlZml4KTsKLQotCQkJLy8gY2hlY2sgZm9yIHRoZSB1c2Ugb2YgcmVzZXJ2ZWQgcHJlZml4ZXMKLQkJCWlmIChpc1Jlc2VydmVkUHJlZml4KHRhZ2xpYlByZWZpeCkpIHsKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMCArIHRhZ2xpYlByZWZpeCArICInIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJaW50IHNldiA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gKGZpbGUgPT0gbnVsbCA/IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgbXNnVGV4dCkgOiBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIG1zZ1RleHQsIGZpbGUpKTsKLQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbik7Ci0JCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gc0RvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydER1cGxpY2F0ZVByZWZpeGVzKElGaWxlIGZpbGUsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmdbXSBwcmVmaXhlcyA9IChTdHJpbmdbXSkgZlRhZ2xpYlByZWZpeGVzSW5Vc2Uua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJZm9yIChpbnQgcHJlZml4TnVtYmVyID0gMDsgcHJlZml4TnVtYmVyIDwgcHJlZml4ZXMubGVuZ3RoOyBwcmVmaXhOdW1iZXIrKykgewotCQkJT2JqZWN0IG8gPSBmVGFnbGliUHJlZml4ZXNJblVzZS5nZXQocHJlZml4ZXNbcHJlZml4TnVtYmVyXSk7Ci0JCQkvKgotCQkJICogT25seSBjYXJlIGlmIGl0J3MgYSBMaXN0IChiZWNhdXNlIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lCi0JCQkgKiBkaXJlY3RpdmUgd2l0aCB0aGF0IHByZWZpeCkKLQkJCSAqLwotCQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJTGlzdCB2YWx1ZVJlZ2lvbnMgPSAoTGlzdCkgbzsKLQotCQkJCWludCBzZXYgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJCVN0cmluZyBtc2dUZXh0ID0gSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8yICsgcHJlZml4ZXNbcHJlZml4TnVtYmVyXSArICInIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBSZXBvcnQgYW4gZXJyb3IgaW4gYWxsIGRpcmVjdGl2ZXMgdXNpbmcgdGhpcyBwcmVmaXgKLQkJCQlmb3IgKGludCByZWdpb25OdW1iZXIgPSAwOyByZWdpb25OdW1iZXIgPCB2YWx1ZVJlZ2lvbnMuc2l6ZSgpOyByZWdpb25OdW1iZXIrKykgewotCQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgdmFsdWVSZWdpb25zLmdldChyZWdpb25OdW1iZXIpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGZUZXh0UmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5nZXQodmFsdWVSZWdpb24pOwotCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSAoZmlsZSA9PSBudWxsID8gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBtc2dUZXh0KSA6IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgbXNnVGV4dCwgZmlsZSkpOwotCQkJCQltZXNzYWdlID0gKGZpbGUgPT0gbnVsbCA/IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgbXNnVGV4dCkgOiBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIG1zZ1RleHQsIGZpbGUpKTsKLQotCQkJCQkvLyBpZiB0aGVyZSdzIGEgbWVzc2FnZSwgdGhlcmUgd2FzIGFuIGVycm9yIGZvdW5kCi0JCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKTsKLQkJCQkJCWludCBsZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogYmF0Y2ggdmFsaWRhdGlvbiBjYWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyB3aGVuIHZhbGlkYXRpbmcgYW4gZW50aXJlIGZpbGUKLQkJLy8gbmVlZCB0byBjbGVhciBkdXBlcyBvciBlbHNlIHlvdSdyZSBjb21wYXJpbmcgYmV0d2VlbiBmaWxlcwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzKTsKLQotCQkvLyBmb3IgYmF0Y2ggdmFsaWRhdGlvbgotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCS8vIGl0ZXJhdGUgYWxsIGRvY3VtZW50IHJlZ2lvbnMKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCXdoaWxlIChyZWdpb24gIT0gbnVsbCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCQkvLyBvbmx5IGNoZWNraW5nIGRpcmVjdGl2ZXMKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCQlwcm9jZXNzRGlyZWN0aXZlKHJlcG9ydGVyLCBmLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJcmVnaW9uID0gcmVnaW9uLmdldE5leHQoKTsKLQkJCQl9Ci0KLQkJCQlpZighcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlyZXBvcnREdXBsaWNhdGVQcmVmaXhlcyhmLCByZXBvcnRlciwgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BFTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDMyZWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BFTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50LkRPTU1vZGVsRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlRva2VuTWdyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBKU1BFTFZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGZpbGUsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJRE9NTW9kZWxGb3JKU1AganNwTW9kZWwgPSAoRE9NTW9kZWxGb3JKU1ApIG1vZGVsOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYyA9IGpzcE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyTm9kZSA9IHN0cnVjdHVyZWREb2MuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQl3aGlsZSAobnVsbCAhPSBjdXJOb2RlICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJCWlmIChjdXJOb2RlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgJiYgY3VyTm9kZS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCAmJiBjdXJOb2RlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCQkJdmFsaWRhdGVSZWdpb25Db250YWluZXIoY3VyTm9kZSwgcmVwb3J0ZXIsIGZpbGUpOwotCQkJCQl9Ci0JCQkJCWN1ck5vZGUgPSBjdXJOb2RlLmdldE5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobnVsbCAhPSBtb2RlbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZ2lvbkNvbnRhaW5lcihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUpIHsKLQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lclJlZ2lvbiA9IGNvbnRhaW5lcjsKLQkJSXRlcmF0b3IgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCAmJiByZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50UmVnaW9uID0gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbik7Ci0JCQkJSXRlcmF0b3IgY2hpbGRSZWdpb25zID0gcGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChjaGlsZFJlZ2lvbnMuaGFzTmV4dCgpICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIGNoaWxkUmVnaW9uID0gKElUZXh0UmVnaW9uKSBjaGlsZFJlZ2lvbnMubmV4dCgpOwotCQkJCQlpZiAoY2hpbGRSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKQotCQkJCQkJdmFsaWRhdGVYTUxOb2RlKHBhcmVudFJlZ2lvbiwgY2hpbGRSZWdpb24sIHJlcG9ydGVyLCBmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhNTE5vZGUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgSVRleHRSZWdpb24gcmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGVsVGV4dCA9IGNvbnRhaW5lci5nZXRUZXh0KHJlZ2lvbik7Ci0JCUpTUEVMUGFyc2VyIGVsUGFyc2VyID0gSlNQRUxQYXJzZXIuY3JlYXRlUGFyc2VyKGVsVGV4dCk7Ci0JCWludCBjb250ZW50U3RhcnQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJaW50IGNvbnRlbnRMZW5ndGggPSBjb250YWluZXIuZ2V0TGVuZ3RoKCk7Ci0JCXRyeSB7Ci0JCQllbFBhcnNlci5FeHByZXNzaW9uKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCVRva2VuIGN1clRvayA9IGUuY3VycmVudFRva2VuOwotCQkJaW50IHByb2JsZW1TdGFydE9mZnNldCA9IGNvbnRlbnRTdGFydCArIGN1clRvay5iZWdpbkNvbHVtbjsKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgSlNQQ29yZU1lc3NhZ2VzLkpTUEVMX1N5bnRheCk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChwcm9ibGVtU3RhcnRPZmZzZXQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgoY3VyVG9rLmVuZENvbHVtbiAtIGN1clRvay5iZWdpbkNvbHVtbiArIDEpOwotCQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QoZmlsZSk7Ci0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQl9Ci0JCWNhdGNoIChUb2tlbk1nckVycm9yIHRlKSB7Ci0JCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9Ub2tlbik7Ci0JCQltZXNzYWdlLnNldE9mZnNldChjb250ZW50U3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgoY29udGVudExlbmd0aCk7Ci0JCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChmaWxlKTsKLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQSmF2YVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEphdmFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwNGY5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQSmF2YVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25FeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSlNQSmF2YVZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGdldCBqc3AgbW9kZWwsIGdldCB0cmFubHNhdGlvbgotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQotCQkJCQlzZXR1cEFkYXB0ZXJGYWN0b3J5KGRvbU1vZGVsKTsKLQkJCQkJSURPTURvY3VtZW50IHhtbERvYyA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCi0JCQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCQkJdHJhbnNsYXRpb24uc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUodHJ1ZSk7Ci0JCQkJCQl0cmFuc2xhdGlvbi5yZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJCUxpc3QgcHJvYmxlbXMgPSB0cmFuc2xhdGlvbi5nZXRQcm9ibGVtcygpOwotCQkJCQkJLy8gcmVtb3ZlIG9sZCBtZXNzYWdlcwotCQkJCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgZik7Ci0JCQkJCQkvLyBhZGQgbmV3IG1lc3NhZ2VzCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLnNpemUoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCQkJSU1lc3NhZ2UgbSA9IGNyZWF0ZU1lc3NhZ2VGcm9tUHJvYmxlbSgoSVByb2JsZW0pIHByb2JsZW1zLmdldChpKSwgZiwgdHJhbnNsYXRpb24sIGRvbU1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJCQlpZiAobSAhPSBudWxsKQotCQkJCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGxvYWRpbmcgbW9kZWwgZnJvbSBhIGZpbGUsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgYWRkIGFkYXB0ZXIKLQkgKiBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJaWYgKHNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQkJc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIElNZXNzYWdlIGZyb20gYW4gSVByb2JsZW0KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmxlbQotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2MKLQkgKiBAcmV0dXJuIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2JsZW0sIG9yIG51bGwgaWYgaXQgY291bGQgbm90Ci0JICogICAgICAgICBjcmVhdGUgb25lCi0JICovCi0JcHJpdmF0ZSBJTWVzc2FnZSBjcmVhdGVNZXNzYWdlRnJvbVByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSwgSUZpbGUgZiwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYykgewotCi0JCWludCBzb3VyY2VTdGFydCA9IHRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpOwotCQlpbnQgc291cmNlRW5kID0gdHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHByb2JsZW0uZ2V0U291cmNlRW5kKCkpOwotCQlpZiAoc291cmNlU3RhcnQgPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIGxpbmUgbnVtYmVyIGZvciBtYXJrZXIgc3RhcnRzIEAgMQotCQkvLyBsaW5lIG51bWJlciBmcm9tIGRvY3VtZW50IHN0YXJ0cyBAIDAKLQkJaW50IGxpbmVObyA9IHN0cnVjdHVyZWREb2MuZ2V0TGluZU9mT2Zmc2V0KHNvdXJjZVN0YXJ0KSArIDE7Ci0KLQkJaW50IHNldiA9IHByb2JsZW0uaXNFcnJvcigpID8gSU1lc3NhZ2UuSElHSF9TRVZFUklUWSA6IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQotCQlJTWVzc2FnZSBtID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBwcm9ibGVtLmdldE1lc3NhZ2UoKSwgZik7Ci0KLQkJbS5zZXRMaW5lTm8obGluZU5vKTsKLQkJbS5zZXRPZmZzZXQoc291cmNlU3RhcnQpOwotCQltLnNldExlbmd0aChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCArIDEpOwotCi0JCS8vIG5lZWQgYWRkaXRpb25hbCBhZGp1c3RtZW50IGZvciBwcm9ibGVtcyBmcm9tCi0JCS8vIGluZGlyZWN0IChpbmNsdWRlZCkgZmlsZXMKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTYzMwotCQlpZih0cmFuc2xhdGlvbi5pc0luZGlyZWN0KHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSkpIHsKLQkJCWFkanVzdEluZGlyZWN0UG9zaXRpb24obSwgdHJhbnNsYXRpb24pOwotCQl9Ci0JCQotCQlyZXR1cm4gbTsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bWVkIHRoZSBtZXNzYWdlIG9mZnNldCBpcyBhbiBpbmRpcmVjdCBwb3NpdGlvbi4KLQkgKiBJbiBvdGhlciB3b3JkcywgYW4gZXJyb3IgZnJvbSBhbiBpbmNsdWRlZCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBtCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdEluZGlyZWN0UG9zaXRpb24oSU1lc3NhZ2UgbSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJCi0JCWlmKCEodHJhbnNsYXRpb24gaW5zdGFuY2VvZiBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbikpCi0JCQlyZXR1cm47Ci0JCQotCQlJRG9jdW1lbnQganNwRG9jID0gKChKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbil0cmFuc2xhdGlvbikuZ2V0SnNwRG9jdW1lbnQoKTsKLQkJaWYoIShqc3BEb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCXJldHVybjsKLQkJCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KWpzcERvYzsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSBzRG9jLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoMCwgbS5nZXRPZmZzZXQoKSArIG0uZ2V0TGVuZ3RoKCkpOwotCQkvLyBpdGVyYXRlIGJhY2t3YXJkcyB1bnRpbCB5b3UgaGl0IHRoZSBpbmNsdWRlIGRpcmVjdGl2ZQotCQlmb3IoaW50IGk9cmVnaW9ucy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7Ci0JCQkKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gcmVnaW9uc1tpXTsKLQkJCWlmKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJaWYoZ2V0RGlyZWN0aXZlTmFtZShyZWdpb24pLmVxdWFscygiaW5jbHVkZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSVRleHRSZWdpb24gZmlsZVZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24ocmVnaW9uLCAiZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW0uc2V0T2Zmc2V0KHJlZ2lvbi5nZXRTdGFydE9mZnNldChmaWxlVmFsdWVSZWdpb24pKTsKLQkJCQkJbS5zZXRMZW5ndGgoZmlsZVZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkZWVhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBQZXJmb3JtcyBzb21lIGNvbW1vbiBKU1AgdmFsaWRhdGlvbiB0YXNrcwotICovCi1wdWJsaWMgY2xhc3MgSlNQVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEX0pTUF9DT1JFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElDb250ZW50VHlwZSBmSlNQRkNvbnRlbnRUeXBlID0gbnVsbDsKLQotCXByb3RlY3RlZCBjbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JCX0KLQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCV9tZXNzYWdlID0gbWVzc2FnZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBfbWVzc2FnZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEpTUEZpbGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQotCQlwcml2YXRlIExpc3QgZkZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcml2YXRlIElDb250ZW50VHlwZVtdIGZDb250ZW50VHlwZXMgPSBudWxsOwotCQlwcml2YXRlIElSZXBvcnRlciBmUmVwb3J0ZXIgPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJCWZSZXBvcnRlciA9IHJlcG9ydGVyOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gY2hlY2sgdmFsaWRhdGlvbgotCQkJaWYgKGZSZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCi0JCQkJaWYgKGlzSlNQVHlwZShwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCi0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVmFsaWRhdG9yIGFkZGluZyBmaWxlOiAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmRmlsZXMuYWRkKGZpbGUpOwotCi0JCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgZkZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZGaWxlcy5zaXplKCldKTsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIGxpc3Qgb2YgY29udGVudCB0eXBlcyB0aGlzIHZpc2l0b3IgaXMgaW50ZXJlc3RlZCBpbgotCQkgKiBAcmV0dXJuIEFsbCBKU1AtcmVsYXRlZCBjb250ZW50IHR5cGVzCi0JCSAqLwotCQlwcml2YXRlIElDb250ZW50VHlwZVtdIGdldFZhbGlkQ29udGVudFR5cGVzKCkgewotCQkJaWYgKGZDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnRseSAiaGFyZC1jb2RlZCIgdG8gYmUganNwICYganNwZgotCQkJCWZDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117UGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCksIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCl9OwotCQkJfQotCQkJcmV0dXJuIGZDb250ZW50VHlwZXM7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDaGVja3MgaWYgZmlsZU5hbWUgaXMgc29tZSB0eXBlIG9mIEpTUCAoaW5jbHVkaW5nIEpTUCBmcmFnbWVudHMpCi0JCSAqIEBwYXJhbSBmaWxlTmFtZQotCQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZW5hbWUgaW5kaWNhdGVzIHNvbWUgdHlwZSBvZiBKU1AsIGZhbHNlIG90aGVyd2lzZQotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGlzSlNQVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJCQotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBnZXRWYWxpZENvbnRlbnRUeXBlcygpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGVOYW1lKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHVyaXMgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlpZiAodXJpcy5sZW5ndGggPiAwKSB7Ci0JCQlJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKG5ldyBQYXRoKHVyaXNbaV0pKTsKLQkJCQlpZiAoY3VycmVudEZpbGUgIT0gbnVsbCAmJiBjdXJyZW50RmlsZS5leGlzdHMoKSkgewotCQkJCQlpZihzaG91bGRWYWxpZGF0ZShjdXJyZW50RmlsZSkgJiYgZnJhZ21lbnRDaGVjayhjdXJyZW50RmlsZSkpIHsKLQotCQkJCQkgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXywgbmV3IFN0cmluZ1tde2N1cnJlbnRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pKTsKLQkJCQkJICAgIHJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkgICAgCi0JCQkJCQl2YWxpZGF0ZUZpbGUoY3VycmVudEZpbGUsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRpbmc6IFsiICsgdXJpc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCQotCQkJLy8gaWYgdXJpc1tdIGxlbmd0aCAwIC0+IHZhbGlkYXRlKCkgZ2V0cyBjYWxsZWQgZm9yIGVhY2ggcHJvamVjdAotCQkJaWYoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCQkKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCQkJSlNQRmlsZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihyZXBvcnRlcik7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY29sbGVjdCBhbGwganNwIGZpbGVzIGZvciB0aGUgcHJvamVjdAotCQkJCQlwcm9qZWN0LmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUlGaWxlW10gZmlsZXMgPSB2aXNpdG9yLmdldEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCQlpZihzaG91bGRWYWxpZGF0ZShmaWxlc1tpXSkgJiYgZnJhZ21lbnRDaGVjayhmaWxlc1tpXSkpIHsKLQkJCQkJCQotCQkJCQkgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXywgbmV3IFN0cmluZ1tde2ZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pKTsKLQkJCQkJICAgIHJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkgICAgCi0JCQkJCQl2YWxpZGF0ZUZpbGUoZmlsZXNbaV0sIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRpbmc6IFsiICsgZmlsZXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBvbmUgZmlsZS4gSXQncyBhc3N1bWVkIHRoYXQgdGhlIGZpbGUgaGFzIEpTUCBjb250ZW50IHR5cGUuCi0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCAoZm9yIGJhdGNoIHZhbGlkYXRpb24pCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZHIKLQkgKiBAcmV0dXJuIHRoZSBqc3AgZGlyZWN0aXZlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpcmVjdGl2ZU5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJVGV4dFJlZ2lvbkxpc3Qgc3ViUmVnaW9ucyA9IHNkci5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc3ViUmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJSVRleHRSZWdpb24gc3ViUmVnaW9uID0gc3ViUmVnaW9ucy5nZXQoaik7Ci0JCQlpZihzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCW5hbWUgPSBzZHIuZ2V0VGV4dChzdWJSZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2RyCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogQHJldHVybiB0aGUgSVRleHRSZWdpb24gZm9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLCBjYXNlIHNlbnNpdGl2ZSwgbnVsbCBpZiBubyBtYXRjaGluZyBhdHRyaWJ1dGUgaXMgZm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIsIFN0cmluZyBhdHRyTmFtZSkgewotCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCBzdWJSZWdpb25zID0gc2RyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzdWJSZWdpb24gPSBzdWJSZWdpb25zLmdldChpKTsKLQkJCWlmKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIHNkci5nZXRUZXh0KHN1YlJlZ2lvbikuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCWZvcihpbnQgaj1pOyBqPHN1YlJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJc3ViUmVnaW9uID0gc3ViUmVnaW9ucy5nZXQoaik7Ci0JCQkJCWlmKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJdmFsdWVSZWdpb24gPSBzdWJSZWdpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWVSZWdpb247Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIsIFN0cmluZyBhdHRyTmFtZSkgewotCQlJVGV4dFJlZ2lvbiByID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oc2RyLCBhdHRyTmFtZSk7Ci0JCWlmKHIgIT0gbnVsbCkKLQkJCXJldHVybiBzZHIuZ2V0VGV4dChyKS50cmltKCk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQgb3Igbm90IChkb2VzIGEgZGVlcCwgCi0JICogaW5kZXB0aCBjaGVjaywgbG9va2luZyBpbnRvIGNvbnRlbnRzIG9mIGZpbGUpCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZmlsZSBpcyBub3QgbnVsbCBhbmQgZXhpc3RzCi0JICogQHJldHVybiB0cnVlIGlmIGZpbGUgaXMganNwIGZyYWdtZW50LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNGcmFnbWVudChJRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IGZhbHNlOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCS8vIGl0IGNhbiBiZSBudWxsCi0JCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWlzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQkJfQotCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCQlpc0ZyYWdtZW50ID0gKGZpbGVDdElkICE9IG51bGwgJiYgQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5ULmVxdWFscyhmaWxlQ3RJZCkpOwotCQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIG11c3QgY2xvc2UgaW5wdXQgc3RyZWFtIGluIGNhc2Ugb3RoZXJzIG5lZWQgaXQKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc0ZyYWdtZW50OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JIAotCS8qKgotCSAqIENoZWNrcyBpZiBmaWxlIGlzIGEganNwIGZyYWdtZW50IG9yIG5vdC4gIElmIHNvLCBjaGVjayBpZiB0aGUgCi0JICogZnJhZ21lbnQgc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotCSAqIEByZXR1cm4gZmFsc2UgaWYgZmlsZSBpcyBhIGZyYWdtZW50IGFuZCBpdCBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgCi0JICogdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZnJhZ21lbnRDaGVjayhJRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGUgPSB0cnVlOwotCQkvLyBxdWljayBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBwb3NzaWJseSBhIGpzcCBmcmFnbWVudAotCQlpZiAoZ2V0SlNQRkNvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSkpIHsKLQkJCS8vIGdldCBwcmVmZXJlbmNlIGZvciB2YWxpZGF0ZSBqc3AgZnJhZ21lbnRzCi0JCQlib29sZWFuIHNob3VsZFZhbGlkYXRlRnJhZ21lbnRzID0gQm9vbGVhbi52YWx1ZU9mKEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuVkFMSURBVEVfRlJBR01FTlRTLCBmaWxlLCB0cnVlKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkvKgotCQkJICogaWYganNwIGZyYWdtZW50cyBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgY2hlY2sgaWYgZmlsZSBpcyByZWFsbHkKLQkJCSAqIGpzcCBmcmFnbWVudAotCQkJICovCi0JCQlpZiAoIXNob3VsZFZhbGlkYXRlRnJhZ21lbnRzKSB7Ci0JCQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gaXNGcmFnbWVudChmaWxlKTsKLQkJCQlzaG91bGRWYWxpZGF0ZSA9ICFpc0ZyYWdtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRWYWxpZGF0ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBKU1AgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JICogQHJldHVybiBqc3BmIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldEpTUEZDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZKU1BGQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZkpTUEZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGZKU1BGQ29udGVudFR5cGU7Ci0JfQotCSAKLQkgcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkgCi0JIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5ewotCQkJdmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQkJY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSl7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSURfSlNQX0NPUkUsIElTdGF0dXMuRVJST1IsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCAgZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9FTFByb2JsZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTkwM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9FTFByb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFTFByb2JsZW0gewotCXByaXZhdGUgUG9zaXRpb24gZlBvczsKLQlwcml2YXRlIFN0cmluZyBmTWVzc2FnZTsKLQkKLQlwdWJsaWMgRUxQcm9ibGVtKFBvc2l0aW9uIHBvcywgU3RyaW5nIG1lc3NhZ2UpCXsKLQkJZlBvcyA9IHBvczsKLQkJZk1lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmTWVzc2FnZTsKLQl9Ci0JCi0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvSUpTUEVMVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9JSlNQRUxUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTYyZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9JSlNQRUxUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGludGVyZmFjZSBJSlNQRUxUcmFuc2xhdG9yIHsKLQotCS8qKgotCSAqIFRvIG92ZXJyaWRlIHRoZSBFTCB0cmFuc2xhdGlvbiwgcGxlYXNlIHNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50IAotCSAqIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5lbHRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIGVsVGV4dCAgVGhlIHRleHQgdG8gYmUgdHJhbnNsYXRlZC4KLQkgKiBAcGFyYW0gZGVsaW0JVGhlIHN0YXJ0aW5nIGRlbGltaXRlcgotCSAqIEBwYXJhbSBjdXJyZW50Tm9kZSBUaGUgY3VycmVudCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbnRlbnRTdGFydCBUaGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBFTCB0byBiZSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgRUwgY29udGVudCB0byBiZSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIGZVc2VyRUxFeHByZXNzaW9ucyBBIHN0cmluZyBidWZmZXIgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgY2FuIGJlIGFwcGVuZGVkLgotCSAqCQlUaGUgdGV4dCBhcHBlbmRlZCBoZXJlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGF0IHRoZSB0b3AgbGV2ZWwgCi0JICoJCW5vdCBhdCB0aGUgcG9pbnQgaW4gdGhlIEpTUCB0cmFuc2xhdGlvbiB3aGVyZSB0aGUgRUwgd2FzIGZvdW5kLiAKLQkgKiAKLQkgKiBAcGFyYW0gZlVzZXJFTFJhbmdlcyAgTWFwIG9mIGxvY2F0aW9uIHJhbmdlcyBmcm9tIEpTUCBFTCBvZmZzZXRzIHRvIGdlbmVyYXRlZCBKYXZhIGNvZGUuCi0JICogQHBhcmFtIGRvY3VtZW50IFRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIEVMUHJvYmxlbXMgdGhhdCBkZXNjcmliZXMgYW55IHN5bnRhY3RpYyBpc3N1ZXMgZm91bmQuCi0JICovCi0JcHVibGljIExpc3QgdHJhbnNsYXRlRUwoU3RyaW5nIGVsVGV4dCwKLQkJCVN0cmluZyBkZWxpbSwKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIAotCQkJaW50IGNvbnRlbnRTdGFydCwKLQkJCWludCBjb250ZW50TGVuZ3RoLAotCQkJU3RyaW5nQnVmZmVyIHVzZXJFTEV4cHJlc3Npb25zLAotCQkJSGFzaE1hcCB1c2VyRUxSYW5nZXMsCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lKYXJSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lKYXJSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNTVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JSmFyUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQSByZWNvcmQgdG8gYSAuamFyIGZpbGUgZGlyZWN0bHkgcmVmZXJlbmNhYmxlIGFzIGEgdGFnIGxpYnJhcnkuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXJSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSAuamFyIGluIHRoZSBmaWxlLXN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRMRFJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRMRFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzE5MjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUTERSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSBzdGFuZGFsb25lIC50bGQgZmlsZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVExEUmVjb3JkIGV4dGVuZHMgSVRhZ2xpYlJlY29yZCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JSVBhdGggZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCBpZiBvbmUgd2FzIGdpdmVuLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpLgotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ0RpclJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ0RpclJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njg0MTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdEaXJSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotLyoqCi0gKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSBmb2xkZXIgb2YgLnRhZy8udGFneCBmaWxlcwotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdEaXJSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjhmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotCi0vKioKLSAqIEEgbGlzdGVuZXIgZm9yIGNoYW5nZXMgaW4gdGhlIGluZGV4J3MgcmVjb3Jkcy4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFnbGliSW5kZXhMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYW4gSVRhZ2xpYlJlY29yZEV2ZW50IGhhcyBvY2N1cnJlZAotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXZvaWQgaW5kZXhDaGFuZ2VkKElUYWdsaWJSZWNvcmRFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzY5NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvci4gVGhpcwotICogaW50ZXJmYWNlIGlzIGNvbW1vbiB0byBhbGwgcmVjb3JkIHR5cGVzLgotICogCi0gKiAKLSAqIEBzZWUgSUphclJlY29yZAotICogQHNlZSBJVGFnRGlyUmVjb3JkCi0gKiBAc2VlIElUTERSZWNvcmQKLSAqIEBzZWUgSVVSTFJlY29yZAotICogICAgICA8cD4KLSAqICAgICAgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAgICAgIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdsaWJSZWNvcmQgewotCS8qKgotCSAqIEEgcmVjb3JkIHRvIGEgLmphciBmaWxlIHJlZmVycmFibGUgZGlyZWN0bHksIDEuMSBzdHlsZSwgb3IgbWVudGlvbmVkIGluCi0JICogYSB3ZWIueG1sIGZpbGUuCi0JICovCi0JaW50IEpBUiA9IDEgPDwgMTsKLQotCS8qKgotCSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIGZvbGRlciBvZiAudGFnLy50YWd4IGZpbGVzCi0JICovCi0JaW50IFRBR0RJUiA9IDEgPDwgMzsKLQotCS8qKgotCSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIHN0YW5kYWxvbmUgLnRsZCBmaWxlCi0JICovCi0JaW50IFRMRCA9IDE7Ci0KLQkvKioKLQkgKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSAudGxkIHRoYXQgaXMgbm90IGEgc3RhbmRhbG9uZSBmaWxlCi0JICovCi0JaW50IFVSTCA9IDEgPDwgMjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyByZWNvcmQuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIG9uZSBvZgotCSAqIDxjb2RlPlVSTDwvY29kZT4sIDxjb2RlPlRBR0RJUjwvY29kZT4sIDxjb2RlPlRMRDwvY29kZT4sIG9yCi0JICogPGNvZGU+SkFSPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiA8dWw+Ci0JICogPGxpPiBBbGwgcmVjb3JkcyBvZiB0eXBlIDxjb2RlPkpBUjwvY29kZT4gaW1wbGVtZW50Ci0JICogPGNvZGU+SUphclJlY29yZDwvY29kZT4uPC9saT4KLQkgKiA8bGk+IEFsbCByZWNvcmRzIG9mIHR5cGUgPGNvZGU+VEFHRElSPC9jb2RlPiBpbXBsZW1lbnQKLQkgKiA8Y29kZT5JVGFnRGlyUmVjb3JkPC9jb2RlPi48L2xpPgotCSAqIDxsaT4gQWxsIHJlY29yZHMgb2YgdHlwZSA8Y29kZT5UTEQ8L2NvZGU+IGltcGxlbWVudAotCSAqIDxjb2RlPklUTERSZWNvcmQ8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVjb3JkcyBvZiB0eXBlIDxjb2RlPlVSTDwvY29kZT4gaW1wbGVtZW50Ci0JICogPGNvZGU+SVVSTFJlY29yZDwvY29kZT4uPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UKLQkgKiBAc2VlICNKQVIKLQkgKiBAc2VlICNUQUdESVIKLQkgKiBAc2VlICNUTEQKLQkgKiBAc2VlICNVUkwKLQkgKi8KLQlpbnQgZ2V0UmVjb3JkVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkMTdjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIERlc2NyaWJlcyBjaGFuZ2VzIHRvIHRoZSBrbm93biByZWNvcmRzIHdpdGhpbiB0aGUgVGFnbGliSW5kZXguCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYlJlY29yZEV2ZW50IHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJlY29yZCB0aGF0IHdhcyBjaGFuZ2VkCi0JICovCi0JSVRhZ2xpYlJlY29yZCBnZXRUYWdsaWJSZWNvcmQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgY2hhbmdlLCBvbmUgb2YgQURERUQsIENIQU5HRUQsIG9yIFJFTU9WRUQKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotCi0JaW50IEFEREVEID0gSVJlc291cmNlRGVsdGEuQURERUQ7Ci0JaW50IENIQU5HRUQgPSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOwotCWludCBSRU1PVkVEID0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lVUkxSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lVUkxSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3ODYxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSAudGxkIHRoYXQgaXMgbm90IGEgc3RhbmRhbG9uZSBmaWxlCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSTFJlY29yZCBleHRlbmRzIElUYWdsaWJSZWNvcmQgewotCi0JLyoqCi0JICogQHJldHVybiB0aGUgYmFzZSBsb2NhdGlvbiB0byB1c2UgZm9yIGZ1cnRoZXIgcmVzb2x1dGlvbiBvZiByZXNvdXJjZXMKLQkgKiAgICAgICAgIGZyb20gdGhlIFRMRAotCSAqLwotCVN0cmluZyBnZXRCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2hvcnQtbmFtZSAobm9ybWFsbHkgdHJlYXRlZCBhcyB0aGUKLQkgKiAgICAgICAgIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4KSwgaWYgb25lIHdhcyBzcGVjaWZpZWQgd2l0aGluIHRoaXMKLQkgKiAgICAgICAgIFRMRCdzIGNvbnRlbnRzLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpIHNwZWNpZmllZCB3aXRoaW4gdGhpcyBUTEQncyBjb250ZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIFVSTCB0byB0aGlzIFRMRCdzIGNvbnRlbnRzLgotCSAqLwotCVVSTCBnZXRVUkwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1Byb2plY3REZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGFkOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotY2xhc3MgUHJvamVjdERlc2NyaXB0aW9uIHsKLQotCWNsYXNzIERlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChyZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlVExEKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZVRMRChyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlSkFSKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZUpBUihyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi50YWciKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi50YWd4IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlVGFnRGlyKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZVRhZ0RpcihyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKFdFQl9YTUwpICYmIHJlc291cmNlLmdldFBhcmVudCgpLmdldE5hbWUoKS5lcXVhbHMoV0VCX0lORikpIHsKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQlyZW1vdmVXZWJYTUwocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlV2ViWE1MKHJlc291cmNlLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc291cmNlLmdldE5hbWUoKS5sZW5ndGgoKSAhPSAwICYmIHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgIT0gJy4nOwotCQl9Ci0JfQotCi0JY2xhc3MgSW5kZXhlciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJaWYgKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdXBkYXRlVExEKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXVwZGF0ZUpBUihwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgSVRhZ2xpYlJlY29yZEV2ZW50LkFEREVEKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGFnIikgfHwgcHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGFneCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl1cGRhdGVUYWdEaXIocHJveHkucmVxdWVzdFJlc291cmNlKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByb3h5LmdldE5hbWUoKS5lcXVhbHMoV0VCX1hNTCkgJiYgcHJveHkucmVxdWVzdFJlc291cmNlKCkuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLmVxdWFscyhXRUJfSU5GKSkgewotCQkJCQl1cGRhdGVXZWJYTUwocHJveHkucmVxdWVzdFJlc291cmNlKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIG5hbWUgPSBwcm94eS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZS5sZW5ndGgoKSAhPSAwICYmIG5hbWUuY2hhckF0KDApICE9ICcuJzsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBKYXJSZWNvcmQgaW1wbGVtZW50cyBJSmFyUmVjb3JkIHsKLQkJYm9vbGVhbiBoYXMxMVRMRDsKLQkJYm9vbGVhbiBpc01hcHBlZEluV2ViWE1MOwotCi0JCVRhZ2xpYkluZm8gaW5mbzsKLQkJSVBhdGggbG9jYXRpb247Ci0JCUxpc3QgdXJsUmVjb3JkczsKLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSmFyUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChKYXJSZWNvcmQpIG9iaikubG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSAmJiAoKEphclJlY29yZCkgb2JqKS5oYXMxMVRMRCA9PSBoYXMxMVRMRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRSZWNvcmRUeXBlKCkgewotCQkJcmV0dXJuIElUYWdsaWJSZWNvcmQuSkFSOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnVyaTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldFVSTFJlY29yZHMoKSB7Ci0JCQlyZXR1cm4gdXJsUmVjb3JkczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkphclJlY29yZDogIiArIGxvY2F0aW9uICsgIiA8LT4gIiArIHVybFJlY29yZHM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRhZ0RpclJlY29yZCBpbXBsZW1lbnRzIElUYWdEaXJSZWNvcmQgewotCQlJUGF0aCBsb2NhdGlvbjsKLQkJU3RyaW5nIHNob3J0TmFtZTsKLQkJLy8gYSBMaXN0IGhvbGRpbmcgU3RyaW5ncyBvZiAudGFnIGFuZCAudGFneCBmaWxlbmFtZXMgcmVsYXRpdmUgdG8gdGhlCi0JCS8vIHRhZ2RpcidzIGxvY2F0aW9uCi0JCUxpc3QgdGFncyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRhZ0RpclJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoVGFnRGlyUmVjb3JkKSBvYmopLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLQkJCXJldHVybiBsb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlRBR0RJUjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0TmFtZS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJcmV0dXJuIHNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhZ3MuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VGFncygpIHsKLQkJCXJldHVybiAoU3RyaW5nW10pIHRhZ3MudG9BcnJheShuZXcgU3RyaW5nW3RhZ3Muc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUYWdkaXJSZWNvcmQ6ICIgKyBsb2NhdGlvbiArICIgPC0+ICIgKyBzaG9ydE5hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBicmllZiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gaW4gYSBUTEQuCi0JICovCi0Jc3RhdGljIGNsYXNzIFRhZ2xpYkluZm8gewotCQkvLyBleHRyYWN0IG9ubHkgd2hlbiBhc2tlZD8KLQkJU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JCWZsb2F0IGpzcFZlcnNpb247Ci0JCVN0cmluZyBsYXJnZUljb247Ci0JCVN0cmluZyBzaG9ydE5hbWU7Ci0JCVN0cmluZyBzbWFsbEljb247Ci0JCVN0cmluZyB0bGliVmVyc2lvbjsKLQkJU3RyaW5nIHVyaTsKLQotCQlwdWJsaWMgVGFnbGliSW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUYWdsaWJJbmZvfCIgKyBzaG9ydE5hbWUgKyAifCIgKyB0bGliVmVyc2lvbiArICJ8IiArIHNtYWxsSWNvbiArICJ8IiArIGxhcmdlSWNvbiArICJ8IiArIGpzcFZlcnNpb24gKyAifCIgKyB1cmkgKyAifCIgKyBkZXNjcmlwdGlvbjsKLQkJfQotCX0KLQotCWNsYXNzIFRhZ2xpYlJlY29yZEV2ZW50IGltcGxlbWVudHMgSVRhZ2xpYlJlY29yZEV2ZW50IHsKLQkJSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkID0gbnVsbDsKLQkJaW50IGZUeXBlID0gLTE7Ci0KLQkJVGFnbGliUmVjb3JkRXZlbnQoSVRhZ2xpYlJlY29yZCByZWNvcmQsIGludCB0eXBlKSB7Ci0JCQlmVGFnbGliUmVjb3JkID0gcmVjb3JkOwotCQkJZlR5cGUgPSB0eXBlOwotCQl9Ci0KLQkJcHVibGljIElUYWdsaWJSZWNvcmQgZ2V0VGFnbGliUmVjb3JkKCkgewotCQkJcmV0dXJuIGZUYWdsaWJSZWNvcmQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGZUYWdsaWJSZWNvcmQudG9TdHJpbmcoKTsKLQkJCXN3aXRjaCAoZlR5cGUpIHsKLQkJCQljYXNlIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCA6Ci0JCQkJCXN0cmluZyA9ICIgQURERUQgKCIgKyBzdHJpbmcgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElUYWdsaWJSZWNvcmRFdmVudC5DSEFOR0VEIDoKLQkJCQkJc3RyaW5nID0gIiBDSEFOR0VEICgiICsgc3RyaW5nICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJVGFnbGliUmVjb3JkRXZlbnQuUkVNT1ZFRCA6Ci0JCQkJCXN0cmluZyA9ICIgUkVNT1ZFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdHJpbmcgPSAiIG90aGVyOiIgKyBmVHlwZSArICIgKCIgKyBzdHJpbmcgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUTERSZWNvcmQgaW1wbGVtZW50cyBJVExEUmVjb3JkIHsKLQkJVGFnbGliSW5mbyBpbmZvOwotCQlJUGF0aCBwYXRoOwotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUTERSZWNvcmQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKFRMRFJlY29yZCkgb2JqKS5wYXRoLmVxdWFscyhwYXRoKSAmJiAoKFRMRFJlY29yZCkgb2JqKS5nZXRVUkkoKS5lcXVhbHMoZ2V0VVJJKCkpOwotCQl9Ci0KLQkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlRMRDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnVyaTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRMRFJlY29yZDogIiArIGdldFVSSSgpICsgIiA8LT4gIiArIHBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFVSTFJlY29yZCBpbXBsZW1lbnRzIElVUkxSZWNvcmQgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uOwotCQlUYWdsaWJJbmZvIGluZm87Ci0JCVVSTCB1cmw7Ci0KLQkJcHVibGljIFVSTFJlY29yZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVVJMUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChVUkxSZWNvcmQpIG9iaikuYmFzZUxvY2F0aW9uLmVxdWFscyhiYXNlTG9jYXRpb24pICYmICgoVVJMUmVjb3JkKSBvYmopLnVybC5lcXVhbHModXJsKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQkJcmV0dXJuIGJhc2VMb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlVSTDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaW5mby51cmk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBVUkwuCi0JCSAqLwotCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJVUkxSZWNvcmQ6ICIgKyBiYXNlTG9jYXRpb24gKyAiIDwtPiAiICsgZ2V0VVJJKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFdlYlhNTFJlY29yZCB7Ci0JCVRhZ2xpYkluZm8gaW5mbzsKLQkJSVBhdGggcGF0aDsKLQkJTGlzdCB0bGRSZWNvcmRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV2ViWE1MUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChXZWJYTUxSZWNvcmQpIG9iaikucGF0aC5lcXVhbHMocGF0aCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCBpZiBvbmUgd2FzIGdpdmVuLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGluZm8uc2hvcnROYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0VExEUmVjb3JkcygpIHsKLQkJCXJldHVybiB0bGRSZWNvcmRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2VieG1sLgotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldFdlYlhNTCgpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiV2ViWE1MUmVjb3JkOiAiICsgcGF0aCArICIgIiArIHRsZFJlY29yZHM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnSW5kZXhDcmVhdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0luZGV4VGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4dGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdFQl9JTkZfUEFUSCA9IG5ldyBQYXRoKFdFQl9JTkYpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfWE1MID0gIndlYi54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRk9STUFUX1ZFUlNJT04gPSAiMS4wLjEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRFBBVEhfRElSVFkgPSAiQlVJTERQQVRIX0RJUlRZIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBSZWNvcmRzIGFjdGl2ZSBKQVJzIG9uIHRoZSBjbGFzc3BhdGguIFRhZ2xpYiBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLQkgKiB1c2FibGUsIGJ1dCB0aGUgamFycyBieSB0aGVtc2VsdmVzIGFyZSBub3QuCi0JICovCi0JSGFzaHRhYmxlIGZDbGFzc3BhdGhKYXJzOwotCi0JLyoqCi0JICogTm90ZXMgdGhhdCB0aGUgYnVpbGQgcGF0aCBpbmZvcm1hdGlvbiBpcyBzdGFsZS4gU29tZSBvcGVyYXRpb25zIGNhbiBub3cKLQkgKiBiZSBza2lwcGVkIHVudGlsIGEgcmVzb2x2ZS9nZXRBdmFpbGFibGUgY2FsbCBpcyBtYWRlLgotCSAqLwotCWJvb2xlYW4gZkJ1aWxkUGF0aElzRGlydHkgPSBmYWxzZTsKLQotCVN0YWNrIGZDbGFzc3BhdGhQcm9qZWN0cyA9IG51bGw7Ci0KLQkvLyBob2xkcyByZWZlcmVuY2VzIGJ5IFVSSSB0byBKQVJzCi0JSGFzaHRhYmxlIGZDbGFzc3BhdGhSZWZlcmVuY2VzOwotCi0JLy8gdGhpcyB0YWJsZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQgaG9sZHMgdGFibGVzIG9mIHJlZmVyZW5jZXMgYWNjb3JkaW5nCi0JLy8gdG8gbG9jYWwgcm9vdHMKLQlIYXNodGFibGUgZkltcGxpY2l0UmVmZXJlbmNlczsKLQotCUhhc2h0YWJsZSBmSkFSUmVmZXJlbmNlczsKLQotCUlQcm9qZWN0IGZQcm9qZWN0OwotCi0JSGFzaHRhYmxlIGZUYWdEaXJSZWZlcmVuY2VzOwotCi0JSGFzaHRhYmxlIGZUTERSZWZlcmVuY2VzOwotCi0JSVJlc291cmNlRGVsdGFWaXNpdG9yIGZWaXNpdG9yOwotCi0JSGFzaHRhYmxlIGZXZWJYTUxSZWZlcmVuY2VzOwotCi0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCXByaXZhdGUgU3RyaW5nIGZTYXZlU3RhdGVGaWxlbmFtZTsKLQotCVByb2plY3REZXNjcmlwdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc2F2ZVN0YXRlRmlsZSkgewotCQlzdXBlcigpOwotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JCWZTYXZlU3RhdGVGaWxlbmFtZSA9IHNhdmVTdGF0ZUZpbGU7Ci0KLQkJZkNsYXNzcGF0aEphcnMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmSkFSUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZUYWdEaXJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRMRFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmV2ViWE1MUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZJbXBsaWNpdFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0KLQkJcmVzdG9yZVJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gX2dldEpTUDExQW5kV2ViWE1MSmFyUmVmZXJlbmNlcyhDb2xsZWN0aW9uIGFsbEpBUnMpIHsKLQkJTGlzdCBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdChhbGxKQVJzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGkgPSBhbGxKQVJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJSmFyUmVjb3JkIHJlY29yZCA9IChKYXJSZWNvcmQpIGkubmV4dCgpOwotCQkJaWYgKHJlY29yZC5oYXMxMVRMRCB8fCByZWNvcmQuaXNNYXBwZWRJbldlYlhNTCkgewotCQkJCWNvbGxlY3Rpb24uYWRkKHJlY29yZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogRXJhc2VzIGFsbCBrbm93biB0YWJsZXMKLQkgKi8KLQl2b2lkIGNsZWFyKCkgewotCQlmQ2xhc3NwYXRoSmFycyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZKQVJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRhZ0RpclJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVExEUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkltcGxpY2l0UmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZDbGFzc3BhdGhSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQl9Ci0KLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgY3JlYXRlQ2F0YWxvZ1JlY29yZChTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJaWYgKHVybFN0cmluZy50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLmVuZHNXaXRoKCgiLmphciIpKSAmJiB1cmxTdHJpbmcuc3RhcnRzV2l0aCgiZmlsZToiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQkJCWZpbGVMb2NhdGlvbiA9IHVybC5nZXRGaWxlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3Qgd29ydGggcmVwb3J0aW5nCi0JCQl9Ci0JCQlpZiAoZmlsZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGZpbGVMb2NhdGlvbik7Ci0JCQkJU3RyaW5nW10gZW50cmllcyA9IEphclV0aWxpdGllcy5nZXRFbnRyeU5hbWVzKGZpbGVMb2NhdGlvbik7Ci0JCQkJZm9yIChpbnQgakVudHJ5ID0gMDsgakVudHJ5IDwgZW50cmllcy5sZW5ndGg7IGpFbnRyeSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2pFbnRyeV0uZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoZW50cmllc1tqRW50cnldLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQkJCWphclJlY29yZC5oYXMxMVRMRCA9IHRydWU7Ci0JCQkJCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oZmlsZUxvY2F0aW9uLCBlbnRyaWVzW2pFbnRyeV0pOwotCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKGZpbGVMb2NhdGlvbiwgY29udGVudHMpOwotCQkJCQkJCQlqYXJSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJfQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChqYXJSZWNvcmQuaGFzMTFUTEQpIHsKLQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCBjYXRhbG9nIHJlY29yZCBmb3IgIiArIHVybFN0cmluZyArICJAIiArIGphclJlY29yZC5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXJlY29yZCA9IGphclJlY29yZDsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVVSTCB1cmwgPSBudWxsOwotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2FjaGVkQ29udGVudHMgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gdGxkU3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWNvbm5lY3Rpb24uc2V0RGVmYXVsdFVzZUNhY2hlcyhmYWxzZSk7Ci0JCQkJdGxkU3RyZWFtID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJfQotCi0JCQlpbnQgYzsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKChjID0gdGxkU3RyZWFtLnJlYWQoYnl0ZXMpKSA+PSAwKSB7Ci0JCQkJCWJ1ZmZlci53cml0ZShieXRlcywgMCwgYyk7Ci0JCQkJfQotCQkJCWNhY2hlZENvbnRlbnRzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQl0bGRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSBudWxsOwotCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8odXJsU3RyaW5nLCBjYWNoZWRDb250ZW50cyk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJdXJsUmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCXVybFJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQl1cmxSZWNvcmQuYmFzZUxvY2F0aW9uID0gdXJsU3RyaW5nOwotCQkJCXVybFJlY29yZC51cmwgPSB1cmw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJdHJ5IHsKLQkJCQljYWNoZWRDb250ZW50cy5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJlY29yZCA9IHVybFJlY29yZDsKLQkJfQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEphclJlY29yZCBjcmVhdGVKQVJSZWNvcmQoSVJlc291cmNlIGphcikgewotCQlyZXR1cm4gY3JlYXRlSkFSUmVjb3JkKGphci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSmFyUmVjb3JkIGNyZWF0ZUpBUlJlY29yZChTdHJpbmcgZmlsZUxvY2F0aW9uKSB7Ci0JCUphclJlY29yZCByZWNvcmQgPSBuZXcgSmFyUmVjb3JkKCk7Ci0JCXJlY29yZC5sb2NhdGlvbiA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0JCXJlY29yZC51cmxSZWNvcmRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JVGFnRGlyUmVjb3JkIGNyZWF0ZVRhZ2RpclJlY29yZChJUmVzb3VyY2UgdGFnRmlsZSkgewotCQlJQ29udGFpbmVyIHRhZ2RpciA9IHRhZ0ZpbGUuZ2V0UGFyZW50KCk7Ci0JCVN0cmluZyB0YWdkaXJMb2NhdGlvbiA9IHRhZ2Rpci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCVRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQodGFnZGlyTG9jYXRpb24pOwotCQlpZiAocmVjb3JkID09IG51bGwpIHsKLQkJCXJlY29yZCA9IG5ldyBUYWdEaXJSZWNvcmQoKTsKLQkJCXJlY29yZC5sb2NhdGlvbiA9IHRhZ2Rpci5nZXRGdWxsUGF0aCgpOwotCQkJLy8gSlNQIDIuMCBzZWN0aW9uIDguNC4zCi0JCQlpZiAodGFnZGlyLmdldE5hbWUoKS5lcXVhbHMoInRhZ3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJlY29yZC5zaG9ydE5hbWUgPSAidGFncyI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgewotCQkJCUlQYXRoIHRhZ2RpclBhdGggPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKTsKLQkJCQlTdHJpbmdbXSBzZWdtZW50cyA9IHRhZ2RpclBhdGguc2VnbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMTsgcmVjb3JkLnNob3J0TmFtZSA9PSBudWxsICYmIGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VnbWVudHNbaSAtIDFdLmVxdWFscygiV0VCLUlORiIpICYmIHNlZ21lbnRzW2ldLmVxdWFscygidGFncyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJSVBhdGggdGFnZGlyTG9jYWxQYXRoID0gdGFnZGlyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGkgKyAxKTsKLQkJCQkJCXJlY29yZC5zaG9ydE5hbWUgPSB0YWdkaXJMb2NhbFBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKCcvJywgJy0nKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVExEUmVjb3JkIGNyZWF0ZVRMRFJlY29yZChJUmVzb3VyY2UgdGxkKSB7Ci0JCVRMRFJlY29yZCByZWNvcmQgPSBuZXcgVExEUmVjb3JkKCk7Ci0JCXJlY29yZC5wYXRoID0gdGxkLmdldEZ1bGxQYXRoKCk7Ci0JCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh0bGQuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJY29udGVudHMgPSAoKElGaWxlKSB0bGQpLmdldENvbnRlbnRzKHRydWUpOwotCQkJCVN0cmluZyBiYXNlUGF0aCA9IHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8oYmFzZVBhdGgsIGNvbnRlbnRzKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVVwVG9kYXRlKCkgewotCQlpZiAoZkJ1aWxkUGF0aElzRGlydHkpIHsKLQkJCWluZGV4Q2xhc3NwYXRoKCk7Ci0JCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUYWdsaWJJbmZvIGV4dHJhY3RJbmZvKFN0cmluZyBiYXNlUGF0aCwgSW5wdXRTdHJlYW0gdGxkQ29udGVudHMpIHsKLQkJVGFnbGliSW5mbyBpbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJaWYgKHRsZENvbnRlbnRzICE9IG51bGwpIHsKLQkJCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQkJcHJvdmlkZXIuc2V0SW5wdXRTdHJlYW0odGxkQ29udGVudHMpOwotCQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZShiYXNlUGF0aCk7Ci0JCQlOb2RlIGNoaWxkID0gcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUgfHwgIWNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHTElCKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlVSSSkpIHsKLQkJCQkJCWluZm8udXJpID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNIT1JUX05BTUUpIHx8IGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuU0hPUlROQU1FKSkgewotCQkJCQkJaW5mby5zaG9ydE5hbWUgPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pIHx8IGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuSU5GTykpIHsKLQkJCQkJCWluZm8uZGVzY3JpcHRpb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuSlNQX1ZFUlNJT04pIHx8IGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuSlNQVkVSU0lPTikpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5mby5qc3BWZXJzaW9uID0gRmxvYXQucGFyc2VGbG9hdChnZXRUZXh0Q29udGVudHMoY2hpbGQpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJCWluZm8uanNwVmVyc2lvbiA9IDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UTElCX1ZFUlNJT04pIHx8IGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuVExJQlZFUlNJT04pKSB7Ci0JCQkJCQlpbmZvLnRsaWJWZXJzaW9uID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pKSB7Ci0JCQkJCQlpbmZvLnNtYWxsSWNvbiA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSkgewotCQkJCQkJaW5mby5sYXJnZUljb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgTGlzdCBnZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIHBhdGgpIHsKLQkJZW5zdXJlVXBUb2RhdGUoKTsKLQotCQlDb2xsZWN0aW9uIGltcGxpY2l0UmVmZXJlbmNlcyA9IGdldEltcGxpY2l0UmVmZXJlbmNlcyhwYXRoLnRvU3RyaW5nKCkpLnZhbHVlcygpOwotCQlMaXN0IHJlY29yZHMgPSBuZXcgQXJyYXlMaXN0KGZUTERSZWZlcmVuY2VzLnNpemUoKSArIGZUYWdEaXJSZWZlcmVuY2VzLnNpemUoKSArIGZKQVJSZWZlcmVuY2VzLnNpemUoKSArIGZXZWJYTUxSZWZlcmVuY2VzLnNpemUoKSk7Ci0JCXJlY29yZHMuYWRkQWxsKGZUTERSZWZlcmVuY2VzLnZhbHVlcygpKTsKLQkJcmVjb3Jkcy5hZGRBbGwoZlRhZ0RpclJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQlyZWNvcmRzLmFkZEFsbChfZ2V0SlNQMTFBbmRXZWJYTUxKYXJSZWZlcmVuY2VzKGZKQVJSZWZlcmVuY2VzLnZhbHVlcygpKSk7Ci0JCXJlY29yZHMuYWRkQWxsKGZDbGFzc3BhdGhSZWZlcmVuY2VzLnZhbHVlcygpKTsKLQkJcmVjb3Jkcy5hZGRBbGwoaW1wbGljaXRSZWZlcmVuY2VzKTsKLQotCQlJQ2F0YWxvZyBjYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IGNyZWF0ZUNhdGFsb2dSZWNvcmQoZW50cmllc1tpXS5nZXRVUkkoKSk7Ci0JCQkJcmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWNvcmRzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW1wbGljaXRSZWZlcmVuY2VzIGZvciB0aGUgZ2l2ZW4gcGF0aAotCSAqLwotCUhhc2h0YWJsZSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIGxvY2FsUm9vdCA9IGdldExvY2FsUm9vdChwYXRoKTsKLQkJSGFzaHRhYmxlIGltcGxpY2l0UmVmZXJlbmNlcyA9IChIYXNodGFibGUpIGZJbXBsaWNpdFJlZmVyZW5jZXMuZ2V0KGxvY2FsUm9vdCk7Ci0JCWlmIChpbXBsaWNpdFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJaW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgxKTsKLQkJCWZJbXBsaWNpdFJlZmVyZW5jZXMucHV0KGxvY2FsUm9vdCwgaW1wbGljaXRSZWZlcmVuY2VzKTsKLQkJfQotCQlyZXR1cm4gaW1wbGljaXRSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEByZXR1cm4gdGhlIGFwcGxpY2FibGUgV2ViIGNvbnRleHQgcm9vdCBwYXRoLCBpZiBvbmUgZXhpc3RzCi0JICovCi0JSVBhdGggZ2V0TG9jYWxSb290KElQYXRoIGJhc2VQYXRoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCS8vIGV4aXN0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgLSB0aGlzIGlzIHRoZSA5MyUgY2FzZQotCQlJUmVzb3VyY2UgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGJhc2VQYXRoKTsKLQotCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdAotCQlpZiAoZmlsZSA9PSBudWxsICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGJhc2VQYXRoKTsKLQkJfQotCQkvLyBJZiBub3QgYSBmb2xkZXIsIHRoZW4gdHJ5IGJhc2UgcGF0aCBhcyBhIGZpbGUKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZVBhdGgpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkKLQkJCSAqIAotCQkJICogVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBsZXNzIGFjY3VyYXRlIHJlc3VsdCwgYnV0IGRvZXNuJ3QKLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuCi0JCQkgKi8KLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGJhc2VQYXRoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQotCQkJCWZpbGUgPSBmaWxlc1swXTsKLQkJfQotCi0JCXdoaWxlIChmaWxlICE9IG51bGwpIHsKLQkJCS8qKgotCQkJICogVHJlYXQgYW55IHBhcmVudCBmb2xkZXIgd2l0aCBhIFdFQi1JTkYgc3ViZm9sZGVyIGFzIGEgd2ViLWFwcAotCQkJICogcm9vdAotCQkJICovCi0JCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7Ci0JCQlpZiAoKGZpbGUuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgIT0gMCkgewotCQkJCWZvbGRlciA9IChJQ29udGFpbmVyKSBmaWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9sZGVyID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCS8vIGdldEZvbGRlciBvbiBhIHdvcmtzcGFjZSByb290IG11c3QgdXNlIGEgZnVsbCBwYXRoLCBza2lwCi0JCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgKGZvbGRlci5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUk9PVCkgPT0gMCkgewotCQkJCUlGb2xkZXIgd2ViaW5mID0gZm9sZGVyLmdldEZvbGRlcihXRUJfSU5GX1BBVEgpOwotCQkJCWlmICh3ZWJpbmYgIT0gbnVsbCAmJiB3ZWJpbmYuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbGUgPSBmaWxlLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIGZQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2FsUm9vdChTdHJpbmcgYmFzZVBhdGgpIHsKLQkJcmV0dXJuIGdldExvY2FsUm9vdChuZXcgUGF0aChiYXNlUGF0aCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dENvbnRlbnRzKE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCVN0cmluZyByZWZlcmVuY2UgPSAoKEVudGl0eVJlZmVyZW5jZSkgY2hpbGQpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlID0gIiYiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQlzLmFwcGVuZChyZWZlcmVuY2UudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKS50cmltKCkpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlzaXRvci4KLQkgKi8KLQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgZ2V0VmlzaXRvcigpIHsKLQkJaWYgKGZWaXNpdG9yID09IG51bGwpIHsKLQkJCWZWaXNpdG9yID0gbmV3IERlbHRhVmlzaXRvcigpOwotCQl9Ci0JCXJldHVybiBmVmlzaXRvcjsKLQl9Ci0KLQl2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChmQnVpbGRQYXRoSXNEaXJ0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIklKYXZhRWxlbWVudERlbHRhOiAiICsgZGVsdGEpOwotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UICYmICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmlzQXJjaGl2ZSgpKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3RyaW5nIGxpYlBhdGggPSBudWxsOwotCQkJaW50IHRhZ2xpYlJlY29yZEV2ZW50S2luZCA9IC0xOwotCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpID4gMCkgewotCQkJCXRhZ2xpYlJlY29yZEV2ZW50S2luZCA9IElUYWdsaWJSZWNvcmRFdmVudC5BRERFRDsKLQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGVsZW1lbnQuZ2V0UGF0aCgpKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQkJbGliUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCWVsc2UKLQkJCQkJbGliUGF0aCA9IGVsZW1lbnQuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgPiAwKSB7Ci0JCQkJdGFnbGliUmVjb3JkRXZlbnRLaW5kID0gSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRUQ7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShlbGVtZW50LmdldFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJCQlsaWJQYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQlsaWJQYXRoID0gZWxlbWVudC5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCkgPiAwKSB7Ci0JCQkJdGFnbGliUmVjb3JkRXZlbnRLaW5kID0gSVRhZ2xpYlJlY29yZEV2ZW50LkNIQU5HRUQ7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShlbGVtZW50LmdldFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJCWxpYlBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQllbHNlCi0JCQkJCWxpYlBhdGggPSBlbGVtZW50LmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGxpYlBhdGggIT0gbnVsbCkgewotCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliUGF0aCwgdGFnbGliUmVjb3JkRXZlbnRLaW5kKTsKLQkJCX0KLQkJCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInByb2Nlc3NlZCBidWlsZCBwYXRoIGRlbHRhIGZvciAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIigiICsgZWxlbWVudC5nZXRQYXRoKCkgKyAiKSBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQl2b2lkIGluZGV4KCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWZUTERSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCWZKQVJSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCWZUYWdEaXJSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzLmNsZWFyKCk7Ci0KLQkJdHJ5IHsKLQkJCWZQcm9qZWN0LmFjY2VwdChuZXcgSW5kZXhlcigpLCAwKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJpbmRleGVkICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGNvbnRlbnRzIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQl2b2lkIGluZGV4Q2xhc3NwYXRoKCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlmQ2xhc3NwYXRoUHJvamVjdHMgPSBuZXcgU3RhY2soKTsKLQotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmQ2xhc3NwYXRoSmFycy5jbGVhcigpOwotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmUHJvamVjdCk7Ci0JCWluZGV4Q2xhc3NwYXRoKGphdmFQcm9qZWN0KTsKLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImluZGV4ZWQgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgY2xhc3NwYXRoIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW50cnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOiB7Ci0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSAoSUNsYXNzcGF0aENvbnRhaW5lcikgZW50cnk7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVkRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZGV4Q2xhc3NwYXRoKGNvbnRhaW5lZEVudHJpZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDogewotCQkJCS8qCi0JCQkJICogSWdub3JlIGxpYnMgaW4gcmVxdWlyZWQgcHJvamVjdHMgdGhhdCBhcmUgbm90IGV4cG9ydGVkCi0JCQkJICovCi0JCQkJaWYgKGZDbGFzc3BhdGhQcm9qZWN0cy5zaXplKCkgPCAyIHx8IGVudHJ5LmlzRXhwb3J0ZWQoKSkgewotCQkJCQlJUGF0aCBsaWJQYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQlpZiAoIWZDbGFzc3BhdGhKYXJzLmNvbnRhaW5zS2V5KGxpYlBhdGgudG9TdHJpbmcoKSkpIHsKLQkJCQkJCWlmIChsaWJQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJQYXRoLnRvU3RyaW5nKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIE5vdGU6IC5qYXJzIG9uIHRoZSBjbGFzc3BhdGggaW5zaWRlIG9mIHRoZQotCQkJCQkJCSAqIHByb2plY3Qgd2lsbCBoYXZlIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBKQVIKLQkJCQkJCQkgKiByZWZlcmVuY2VzIHRhYmxlIHRoYXQgd2lsbCBlIHJldHVybmVkIHRvCi0JCQkJCQkJICogZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcygpLgotCQkJCQkJCSAqLwotCQkJCQkJCUlGaWxlIGxpYkZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobGliUGF0aCk7Ci0JCQkJCQkJaWYgKGxpYkZpbGUgIT0gbnVsbCAmJiBsaWJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOiB7Ci0JCQkJLyoKLQkJCQkgKiBJZ25vcmUgcmVxdWlyZWQgcHJvamVjdHMgb2YgcmVxdWlyZWQgcHJvamVjdHMgdGhhdCBhcmUgbm90Ci0JCQkJICogZXhwb3J0ZWQKLQkJCQkgKi8KLQkJCQlpZiAoZkNsYXNzcGF0aFByb2plY3RzLnNpemUoKSA8IDIgfHwgZW50cnkuaXNFeHBvcnRlZCgpKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpOwotCQkJCQlpZiAocHJvamVjdCAhPSBudWxsICYmICFmQ2xhc3NwYXRoUHJvamVjdHMuY29udGFpbnMocHJvamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpbmRleENsYXNzcGF0aChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgcmVtb3ZlQ2xhc3NwYXRoTGlicmFyeShTdHJpbmcgbGlicmFyeUxvY2F0aW9uKSB7IEphclJlY29yZAotCSAqIHJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOyBpZiAocmVjb3JkICE9Ci0JICogbnVsbCkgeyBVUkxSZWNvcmRbXSByZWNvcmRzID0gKFVSTFJlY29yZFtdKQotCSAqIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsgZm9yIChpbnQgaSA9IDA7IGkgPAotCSAqIHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkgKiBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUocmVjb3Jkc1tpXS5nZXRVUkkoKSk7IH0KLQkgKiBUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwKLQkgKiBJVGFnbGliUmVjb3JkRXZlbnQuUkVNT1ZFRCkpOyB9IH0KLQkgKi8KLQotCS8qKgotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwgJiYgamF2YVByb2plY3QuZXhpc3RzKCkgJiYgIWZDbGFzc3BhdGhQcm9qZWN0cy5jb250YWlucyhqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJZkNsYXNzcGF0aFByb2plY3RzLnB1c2goamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl0cnkgewotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW5kZXhDbGFzc3BhdGgoZW50cmllc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3Igc2VhcmNoaW5nIEphdmEgQnVpbGQgUGF0aCArICgiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIikgZm9yIHRhZyBsaWJyYXJpZXMiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlmQ2xhc3NwYXRoUHJvamVjdHMucG9wKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkVGV4dG9mQ2hpbGQoTm9kZSBub2RlLCBTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jdm9pZCByZW1vdmVKQVIoSVJlc291cmNlIGphcikgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyByZWNvcmRzIGZvciBKQVIgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlKYXJSZWNvcmQgcmVjb3JkID0gKEphclJlY29yZCkgZkpBUlJlZmVyZW5jZXMucmVtb3ZlKGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCVVSTFJlY29yZFtdIHJlY29yZHMgPSAoVVJMUmVjb3JkW10pIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3Jkc1tpXSwgSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRUQpKTsKLQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucmVtb3ZlKHJlY29yZHNbaV0uZ2V0VVJJKCkpOwotCQkJfQotCQkJaWYgKHJlY29yZC5oYXMxMVRMRCkgewotCQkJCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3JkLCBJVGFnbGliUmVjb3JkRXZlbnQuUkVNT1ZFRCkpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYWdEaXIoSVJlc291cmNlIHRhZ0ZpbGUpIHsKLQkJLy8gSUNvbnRhaW5lciB0YWdkaXIgPSB0YWdGaWxlLmdldFBhcmVudCgpOwotCQkvLyBTdHJpbmcgdGFnZGlyTG9jYXRpb24gPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkvLyBmVGFnRGlyUmVmZXJlbmNlcy5yZW1vdmUodGFnZGlyTG9jYXRpb24pOwotCX0KLQotCXZvaWQgcmVtb3ZlVExEKElSZXNvdXJjZSB0bGQpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgcmVjb3JkIGZvciAiICsgdGxkLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCVRMRFJlY29yZCByZWNvcmQgPSAoVExEUmVjb3JkKSBmVExEUmVmZXJlbmNlcy5yZW1vdmUodGxkLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCWlmIChyZWNvcmQuZ2V0VVJJKCkgIT0gbnVsbCkgewotCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh0bGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5yZW1vdmUocmVjb3JkLmdldFVSSSgpKTsKLQkJCX0KLQkJCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3JkLCBJVGFnbGliUmVjb3JkRXZlbnQuUkVNT1ZFRCkpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVXZWJYTUwoSVJlc291cmNlIHdlYnhtbCkgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyByZWNvcmRzIGZvciAiICsgd2VieG1sLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCVdlYlhNTFJlY29yZCByZWNvcmQgPSAoV2ViWE1MUmVjb3JkKSBmV2ViWE1MUmVmZXJlbmNlcy5yZW1vdmUod2VieG1sLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJVExEUmVjb3JkW10gcmVjb3JkcyA9IChUTERSZWNvcmRbXSkgcmVjb3JkLmdldFRMRFJlY29yZHMoKS50b0FycmF5KG5ldyBUTERSZWNvcmRbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmVkIHJlY29yZCBmb3IgIiArIHJlY29yZHNbaV0uZ2V0VVJJKCkgKyAiQCIgKyByZWNvcmRzW2ldLnBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMod2VieG1sLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucmVtb3ZlKHJlY29yZHNbaV0uZ2V0VVJJKCkpOwotCQkJCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3Jkc1tpXSwgSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRUQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQllbnN1cmVVcFRvZGF0ZSgpOwotCi0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCi0JCS8qKgotCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGluIFVSSUhlbHBlcjsgdXJpcyBzdGFydGluZyB3aXRoICcvJyBhcmUKLQkJICogcmV0dXJuZWQgYXMtaXMuCi0JCSAqLwotCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwYXRoID0gZ2V0TG9jYWxSb290KGJhc2VQYXRoKSArIHJlZmVyZW5jZTsKLQkJfQotCQllbHNlIHsKLQkJCXBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKHJlZmVyZW5jZSwgYmFzZVBhdGgsIGdldExvY2FsUm9vdChiYXNlUGF0aCkpOwotCQl9Ci0JCS8vIG9yZGVyIGRpY3RhdGVkIGJ5IEpTUCBzcGVjIDIuMCBzZWN0aW9uIDcuMi4zCi0JCS8vIGlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkvLyByZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZldlYlhNTFJlZmVyZW5jZXMuZ2V0KHBhdGgpOwotCQkvLyB9Ci0JCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZKQVJSZWZlcmVuY2VzLmdldChwYXRoKTsKLQkJCS8vIG9ubHkgaWYgMS4xIFRMRCB3YXMgZm91bmQKLQkJCWlmIChyZWNvcmQgaW5zdGFuY2VvZiBKYXJSZWNvcmQgJiYgISgoSmFyUmVjb3JkKSByZWNvcmQpLmhhczExVExEKSB7Ci0JCQkJcmVjb3JkID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAocmVjb3JkID09IG51bGwpIHsKLQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmVExEUmVmZXJlbmNlcy5nZXQocGF0aCk7Ci0JCX0KLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKGJhc2VQYXRoKS5nZXQocmVmZXJlbmNlKTsKLQkJfQotCi0KLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMuZ2V0KHBhdGgpOwotCQl9Ci0KLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZkNsYXNzcGF0aFJlZmVyZW5jZXMuZ2V0KHJlZmVyZW5jZSk7Ci0JCX0KLQotCQkvLyBDaGVjayB0aGUgWE1MIENhdGFsb2cKLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlJQ2F0YWxvZyBjYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIENoZWNrIGFzIHN5c3RlbSByZWZlcmVuY2UgZmlyc3QKLQkJCQkJcmVzb2x2ZWRTdHJpbmcgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0ocmVmZXJlbmNlKTsKLQkJCQkJLy8gQ2hlY2sgYXMgVVJJCi0JCQkJCWlmIChyZXNvbHZlZFN0cmluZyA9PSBudWxsIHx8IHJlc29sdmVkU3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlyZXNvbHZlZFN0cmluZyA9IGNhdGFsb2cucmVzb2x2ZVVSSShyZWZlcmVuY2UpOwotCQkJCQl9Ci0JCQkJCS8vIENoZWNrIGFzIHB1YmxpYyBJRAotCQkJCQlpZiAocmVzb2x2ZWRTdHJpbmcgPT0gbnVsbCB8fCByZXNvbHZlZFN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJcmVzb2x2ZWRTdHJpbmcgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMocmVmZXJlbmNlLCBiYXNlUGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCWlmIChyZXNvbHZlZFN0cmluZyAhPSBudWxsICYmIHJlc29sdmVkU3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcmVjb3JkID0gY3JlYXRlQ2F0YWxvZ1JlY29yZChyZXNvbHZlZFN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gSWYgbm8gcmVjb3JkcyB3ZXJlIGZvdW5kIGFuZCBubyBsb2NhbC1yb290IGFwcGxpZXMsIGNoZWNrIEFMTCBvZgotCQkvLyB0aGUgd2ViLnhtbCBmaWxlcyBhcyBhIGZhbGxiYWNrCi0JCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBmUHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKGdldExvY2FsUm9vdChiYXNlUGF0aCkpKSB7Ci0JCQlXZWJYTUxSZWNvcmRbXSB3ZWJ4bWxzID0gKFdlYlhNTFJlY29yZFtdKSBmV2ViWE1MUmVmZXJlbmNlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBXZWJYTUxSZWNvcmRbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWJ4bWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlY29yZCAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHdlYnhtbHNbaV0ucGF0aC50b1N0cmluZygpKS5nZXQocmVmZXJlbmNlKTsKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyBhbnkgc2F2ZWQgcmVmZXJlbmNlIHRhYmxlcwotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlUmVmZXJlbmNlcygpIHsKLQkJaWYgKFRhZ2xpYkluZGV4LkVOQUJMRUQpIHsKLQkJCS8vIHJlc291cmNlcyBmaXJzdAotCQkJaW5kZXgoKTsKLQkJCS8vIG5vdyBidWlsZCBwYXRoCi0JCQkKLQkJCS8vID09PT09PT09PT09PT09PT0gdGVzdCByZWxvYWQgdGltZSA9PT09PT09PT09PT09PT09PT09PT09PT0KLQkJCWJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsKLQkJCUZpbGUgc2F2ZWRTdGF0ZSA9IG5ldyBGaWxlKGZTYXZlU3RhdGVGaWxlbmFtZSk7Ci0JCQlpZiAoc2F2ZWRTdGF0ZS5leGlzdHMoKSkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgdGV4dEZpbGVCdWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCQkJUGF0aCBzYXZlZFN0YXRlUGF0aCA9IG5ldyBQYXRoKGZTYXZlU3RhdGVGaWxlbmFtZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJdGV4dEZpbGVCdWZmZXJNYW5hZ2VyLmNvbm5lY3Qoc2F2ZWRTdGF0ZVBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gdGV4dEZpbGVCdWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHNhdmVkU3RhdGVQYXRoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQkJCQlpbnQgbGluZXMgPSBkb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQkJCQlpZiAobGluZXMgPiAwKSB7Ci0JCQkJCQlJUmVnaW9uIGxpbmUgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKDApOwotCQkJCQkJU3RyaW5nIGxpbmVUZXh0ID0gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJCQkJCUphclJlY29yZCBsaWJyYXJ5UmVjb3JkID0gbnVsbDsKLQkJCQkJCWlmIChTQVZFX0ZPUk1BVF9WRVJTSU9OLmVxdWFscyhsaW5lVGV4dCkpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzOyBpKyspIHsKLQkJCQkJCQkJbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCQkJCWxpbmVUZXh0ID0gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJCQkJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lVGV4dCwgInwiKTsKLQkJCQkJCQkJaWYgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQkJU3RyaW5nIHRva2VuVHlwZSA9IHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJaWYgKCJKQVIiLmVxdWFsc0lnbm9yZUNhc2UodG9rZW5UeXBlKSkgewotCQkJCQkJCQkJCWJvb2xlYW4gaGFzMTFUTEQgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJCS8vIG1ha2UgdGhlIHJlc3QgdGhlIGxpYnJhcnlMb2NhdGlvbgotCQkJCQkJCQkJCVN0cmluZyBsaWJyYXJ5TG9jYXRpb24gPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCQkJCWxpYnJhcnlMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbiArICJ8IiArIHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlsaWJyYXJ5TG9jYXRpb24gPSBsaWJyYXJ5TG9jYXRpb24udHJpbSgpOwotCQkJCQkJCQkJCWlmIChsaWJyYXJ5UmVjb3JkICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChsaWJyYXJ5UmVjb3JkLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy8gQ3JlYXRlIGEgbmV3IEphclJlY29yZAotCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQobGlicmFyeUxvY2F0aW9uKTsKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLmhhczExVExEID0gaGFzMTFUTEQ7Ci0KLQkJCQkJCQkJCQkvLyBBZGQgYSBVUkxSZWNvcmQgZm9yIHRoZSAxLjEgVExECi0JCQkJCQkJCQkJaWYgKGhhczExVExEKSB7Ci0JCQkJCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGxpYnJhcnlMb2NhdGlvbiwgSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQik7Ci0JCQkJCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhsaWJyYXJ5TG9jYXRpb24sIGNvbnRlbnRzKTsKLQotCQkJCQkJCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJCQkJCVVSTFJlY29yZCByZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQkJCQkJCQkJcmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJCQkJCXJlY29yZC5iYXNlTG9jYXRpb24gPSBsaWJyYXJ5TG9jYXRpb247Ci0JCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQkJcmVjb3JkLnVybCA9IG5ldyBVUkwoImphcjpmaWxlOiIgKyBsaWJyYXJ5TG9jYXRpb24gKyAiIS8iICsgSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLnVybFJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJCQkJCQkJCQkJCWZDbGFzc3BhdGhSZWZlcmVuY2VzLnB1dChyZWNvcmQuZ2V0VVJJKCksIHJlY29yZCk7Ci0JCQkJCQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgcmVjb3JkIGZvciAiICsgcmVjb3JkLmdldFVSSSgpICsgIkAiICsgcmVjb3JkLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQkJCQkvLyBkb24ndCByZWNvcmQgdGhpcwotCQkJCQkJCQkJCQkJCQkvLyBVUkkKLQkJCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJZkNsYXNzcGF0aEphcnMucHV0KGxpYnJhcnlMb2NhdGlvbiwgbGlicmFyeVJlY29yZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmICgiVVJMIi5lcXVhbHNJZ25vcmVDYXNlKHRva2VuVHlwZSkpIHsKLQkJCQkJCQkJCQkvLyBtYWtlIHRoZSByZXN0IHRoZSBVUkwKLQkJCQkJCQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gdG9rZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJCQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQkJCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcgKyAifCIgKyB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJdXJsU3RyaW5nID0gdXJsU3RyaW5nLnRyaW0oKTsKLQkJCQkJCQkJCQkvLyBBcHBlbmQgYSBVUkxyZWNvcmQKLQkJCQkJCQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQkJCQkJCXVybFJlY29yZC51cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCXVybFJlY29yZC5iYXNlTG9jYXRpb24gPSBsaWJyYXJ5UmVjb3JkLmxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQkJbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLmFkZCh1cmxSZWNvcmQpOwotCi0JCQkJCQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2FjaGVkQ29udGVudHMgPSBudWxsOwotCQkJCQkJCQkJCUlucHV0U3RyZWFtIHRsZFN0cmVhbSA9IG51bGw7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdXJsUmVjb3JkLnVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCQkJCQkJCQljb25uZWN0aW9uLnNldERlZmF1bHRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQkJCQkJCQl0bGRTdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQlpbnQgYzsKLQkJCQkJCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQkJCQkJCS8vIGFycmF5IGRpbSByZXN0cmljdGlvbj8KLQkJCQkJCQkJCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQl3aGlsZSAoKGMgPSB0bGRTdHJlYW0ucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJCQkJCQkJCWJ5dGVBcnJheU91dHB1dC53cml0ZShieXRlcywgMCwgYyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJY2FjaGVkQ29udGVudHMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZUFycmF5T3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQl0bGRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8odXJsUmVjb3JkLnVybC50b1N0cmluZygpLCBjYWNoZWRDb250ZW50cyk7Ci0JCQkJCQkJCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkJCQkJCQl1cmxSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCWNhY2hlZENvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWZDbGFzc3BhdGhSZWZlcmVuY2VzLnB1dCh1cmxSZWNvcmQuZ2V0VVJJKCksIHVybFJlY29yZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkvLyBsYXN0IHNpbmNlIG9ubHkgb2NjdXJzIG9uY2UKLQkJCQkJCQkJCWVsc2UgaWYgKEJVSUxEUEFUSF9ESVJUWS5lcXVhbHNJZ25vcmVDYXNlKHRva2VuVHlwZSkpIHsKLQkJCQkJCQkJCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IEJvb2xlYW4udmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgewotCQkJCQkJCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KGxpYnJhcnlSZWNvcmQsIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXN0b3JlZCA9IHRydWU7Ci0JCQkJCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAidGltZSBzcGVudCByZWxvYWRpbmcgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgYnVpbGQgcGF0aDogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlyZXN0b3JlZCA9IGZhbHNlOwotCQkJCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImZhaWx1cmUgcmVsb2FkaW5nICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGJ1aWxkIHBhdGggaW5kZXgiLCBlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0ZXh0RmlsZUJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChzYXZlZFN0YXRlUGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gPT09PT09PT09PT09PT09PSB0ZXN0IHJlbG9hZCB0aW1lIChlbmQpID09PT09PT09PT09PT09PT09PQotCi0KLQkJCWlmICghcmVzdG9yZWQpIHsKLQkJCQlzZXRCdWlsZFBhdGhJc0RpcnR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhbnkgc3RvcmFibGUgcmVmZXJlbmNlcyB0byBkaXNrLiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlCi0JICogZGVzY3JpcHRpb24gaXMgYmVpbmcgY2xlYXJlZCBhbmQgbm90IGFmdGVyIGV2ZXJ5IHVwZGF0ZS4KLQkgKi8KLQl2b2lkIHNhdmVSZWZlcmVuY2VzKCkgewotCQkvLyB0aGUgYnVpbGQgcGF0aCBpbmZvcm1hdGlvbiBpcyBvdXQgb2YgZGF0ZSwgcmVtZW1iZXIgdGhhdAotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotCQkvKioKLQkJICogPHByZT4KLQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wCi0JCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgY2xhc3NwYXRoIGluZm9ybWF0aW9uICh8IGlzIGZpZWxkIGRlbGltaXRlcikKLQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFycyBhcmUgc2F2ZWQgYXMgJnF1b3Q7SkFSOiZxdW90OysgaGFzMTFUTEQgKyBqYXIgcGF0aCAKLQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMUmVjb3JkcyBhcyAmcXVvdDtVUkw6JnF1b3Q7K1VSTAotCQkgKiA8L3ByZT4KLQkJICovCi0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZTYXZlU3RhdGVGaWxlbmFtZSksICJ1dGY4Iik7Ci0JCQl3cml0ZXIud3JpdGUoU0FWRV9GT1JNQVRfVkVSU0lPTik7Ci0JCQl3cml0ZXIud3JpdGUoJ1xuJyk7Ci0JCQl3cml0ZXIud3JpdGUoQlVJTERQQVRIX0RJUlRZICsgInwiICsgZkJ1aWxkUGF0aElzRGlydHkpOwotCQkJd3JpdGVyLndyaXRlKCdcbicpOwotCi0JCQlFbnVtZXJhdGlvbiBqYXJzID0gZkNsYXNzcGF0aEphcnMua2V5cygpOwotCQkJd2hpbGUgKGphcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgamFyUGF0aCA9IGphcnMubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCUphclJlY29yZCBqYXJSZWNvcmQgPSAoSmFyUmVjb3JkKSBmQ2xhc3NwYXRoSmFycy5nZXQoamFyUGF0aCk7Ci0JCQkJd3JpdGVyLndyaXRlKCJKQVJ8Iik7Ci0JCQkJd3JpdGVyLndyaXRlKEJvb2xlYW4udG9TdHJpbmcoamFyUmVjb3JkLmhhczExVExEKSk7Ci0JCQkJd3JpdGVyLndyaXRlKCd8Jyk7Ci0JCQkJd3JpdGVyLndyaXRlKGphclBhdGgpOwotCQkJCXdyaXRlci53cml0ZSgnXG4nKTsKLQkJCQlJdGVyYXRvciBpID0gamFyUmVjb3JkLnVybFJlY29yZHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJSVVSTFJlY29yZCB1cmxSZWNvcmQgPSAoSVVSTFJlY29yZCkgaS5uZXh0KCk7Ci0JCQkJCXdyaXRlci53cml0ZSgiVVJMfCIpOwotCQkJCQl3cml0ZXIud3JpdGUodXJsUmVjb3JkLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCQl3cml0ZXIud3JpdGUoJ1xuJyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAidGltZSBzcGVudCBzYXZpbmcgaW5kZXggZm9yICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApKTsKLQl9Ci0JCi0Jdm9pZCBzZXRCdWlsZFBhdGhJc0RpcnR5KCkgewotCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IHRydWU7Ci0JfQotCi0Jdm9pZCB1cGRhdGVDbGFzc3BhdGhMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TG9jYXRpb24sIGludCBkZWx0YUtpbmQpIHsKLQkJSmFyUmVjb3JkIGxpYnJhcnlSZWNvcmQgPSBudWxsOwotCQlpZiAoZGVsdGFLaW5kID09IElUYWdsaWJSZWNvcmRFdmVudC5SRU1PVkVEIHx8IGRlbHRhS2luZCA9PSBJVGFnbGliUmVjb3JkRXZlbnQuQ0hBTkdFRCkgewotCQkJbGlicmFyeVJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOwotCQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgewotCQkJCUlVUkxSZWNvcmRbXSB1cmxSZWNvcmRzID0gKElVUkxSZWNvcmRbXSkgbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLnRvQXJyYXkobmV3IElVUkxSZWNvcmRbMF0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsUmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUodXJsUmVjb3Jkc1tpXS5nZXRVUkkoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWx0YUtpbmQgPT0gSVRhZ2xpYlJlY29yZEV2ZW50LkFEREVEIHx8IGRlbHRhS2luZCA9PSBJVGFnbGliUmVjb3JkRXZlbnQuQ0hBTkdFRCkgewotCQkJU3RyaW5nW10gZW50cmllcyA9IEphclV0aWxpdGllcy5nZXRFbnRyeU5hbWVzKGxpYnJhcnlMb2NhdGlvbik7Ci0KLQkJCWxpYnJhcnlSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQobGlicmFyeUxvY2F0aW9uKTsKLQkJCWZDbGFzc3BhdGhKYXJzLnB1dChsaWJyYXJ5TG9jYXRpb24sIGxpYnJhcnlSZWNvcmQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVudHJpZXNbaV0uZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChlbnRyaWVzW2ldLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQkJbGlicmFyeVJlY29yZC5oYXMxMVRMRCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0obGlicmFyeUxvY2F0aW9uLCBlbnRyaWVzW2ldKTsKLQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKGxpYnJhcnlMb2NhdGlvbiwgY29udGVudHMpOwotCi0JCQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8udXJpICE9IG51bGwgJiYgaW5mby51cmkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJVVJMUmVjb3JkIHJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJCQlyZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJcmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZWNvcmQudXJsID0gbmV3IFVSTCgiamFyOmZpbGU6IiArIGxpYnJhcnlMb2NhdGlvbiArICIhLyIgKyBlbnRyaWVzW2ldKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCWxpYnJhcnlSZWNvcmQudXJsUmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHJlY29yZC5nZXRVUkkoKSwgcmVjb3JkKTsKLQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCByZWNvcmQgZm9yICIgKyByZWNvcmQuZ2V0VVJJKCkgKyAiQCIgKyByZWNvcmQuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIGRvbid0IHJlY29yZCB0aGlzIFVSSQotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgewotCQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChsaWJyYXJ5UmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlSkFSKElSZXNvdXJjZSBqYXIsIGludCBkZWx0YUtpbmQpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRpbmcgcmVjb3JkcyBmb3IgSkFSICIgKyBqYXIuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgamFyTG9jYXRpb25TdHJpbmcgPSBqYXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMoamFyKTsKLQkJSmFyUmVjb3JkIGphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChqYXIpOwotCQlmSkFSUmVmZXJlbmNlcy5wdXQoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgamFyUmVjb3JkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZW50cmllc1tpXS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZW50cmllc1tpXS5lcXVhbHMoSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQikpIHsKLQkJCQkJamFyUmVjb3JkLmhhczExVExEID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oamFyLCBlbnRyaWVzW2ldKTsKLQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhqYXJMb2NhdGlvblN0cmluZywgY29udGVudHMpOwotCi0JCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby51cmkgIT0gbnVsbCAmJiBpbmZvLnVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCVVSTFJlY29yZCByZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQlyZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQlyZWNvcmQuYmFzZUxvY2F0aW9uID0gamFyTG9jYXRpb25TdHJpbmc7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJlY29yZC51cmwgPSBuZXcgVVJMKCJqYXI6ZmlsZToiICsgamFyTG9jYXRpb25TdHJpbmcgKyAiIS8iICsgZW50cmllc1tpXSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWphclJlY29yZC51cmxSZWNvcmRzLmFkZChyZWNvcmQpOwotCQkJCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyhqYXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5wdXQocmVjb3JkLmdldFVSSSgpLCByZWNvcmQpOwotCQkJCQkJCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3JkLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQpKTsKLQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgcmVjb3JkIGZvciAiICsgcmVjb3JkLmdldFVSSSgpICsgIkAiICsgcmVjb3JkLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBkb24ndCByZWNvcmQgdGhpcyBVUkkKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICJjb3VsZCBub3QgcmVhZCByZXNvdXJjZSAiICsgamFyLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChqYXJSZWNvcmQuaGFzMTFUTEQpIHsKLQkJCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQoamFyUmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlVGFnRGlyKElSZXNvdXJjZSB0YWdGaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCXJldHVybjsKLQkJLyoqCi0JCSAqIE1ha2Ugc3VyZSB0aGUgdGFnIGZpbGUgaXMgbiBhIFdFQi1JTkYvdGFncyBmb2xkZXIgYmVjYXVzZSBvZiB0aGUKLQkJICogc2hvcnRuYW1lIGNvbXB1dGF0aW9uIHJlcXVpcmVtZW50cwotCQkgKi8KLQkJLy8gaWYgKCh0YWdGaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpID4gMCB8fAotCQkvLyB0YWdGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5pbmRleE9mKCJXRUItSU5GL3RhZ3MiKSA8IDApCi0JCS8vIHJldHVybjsKLQkJLy8gVGFnRGlyUmVjb3JkIHJlY29yZCA9IGNyZWF0ZVRhZ2RpclJlY29yZCh0YWdGaWxlKTsKLQkJLy8gaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCS8vIHJlY29yZC50YWdzLmFkZCh0YWdGaWxlLmdldE5hbWUoKSk7Ci0JCS8vIH0KLQl9Ci0KLQl2b2lkIHVwZGF0ZVRMRChJUmVzb3VyY2UgdGxkLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0aW5nIHJlY29yZCBmb3IgIiArIHRsZC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlUTERSZWNvcmQgcmVjb3JkID0gY3JlYXRlVExEUmVjb3JkKHRsZCk7Ci0JCWZUTERSZWZlcmVuY2VzLnB1dCh0bGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCByZWNvcmQpOwotCQlpZiAocmVjb3JkLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh0bGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5wdXQocmVjb3JkLmdldFVSSSgpLCByZWNvcmQpOwotCQl9Ci0JCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3JkLCBkZWx0YUtpbmQpKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVdlYlhNTChJUmVzb3VyY2Ugd2VieG1sLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCWlmICh3ZWJ4bWwuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuOwotCQlJbnB1dFN0cmVhbSB3ZWJ4bWxDb250ZW50cyA9IG51bGw7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdlYnhtbENvbnRlbnRzID0gKChJRmlsZSkgd2VieG1sKS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQkJcHJvdmlkZXIuc2V0SW5wdXRTdHJlYW0od2VieG1sQ29udGVudHMpOwotCQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoIndlYi1hcHAiKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZSh3ZWJ4bWwuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCWRvY3VtZW50ID0gcHJvdmlkZXIuZ2V0RG9jdW1lbnQoZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCAiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh3ZWJ4bWxDb250ZW50cyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXdlYnhtbENvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0aW5nIHJlY29yZHMgZm9yICIgKyB3ZWJ4bWwuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlXZWJYTUxSZWNvcmQgd2VieG1sUmVjb3JkID0gbmV3IFdlYlhNTFJlY29yZCgpOwotCQl3ZWJ4bWxSZWNvcmQucGF0aCA9IHdlYnhtbC5nZXRGdWxsUGF0aCgpOwotCQlmV2ViWE1MUmVmZXJlbmNlcy5wdXQod2VieG1sUmVjb3JkLmdldFdlYlhNTCgpLnRvU3RyaW5nKCksIHdlYnhtbFJlY29yZCk7Ci0JCU5vZGVMaXN0IHRhZ2xpYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCWZvciAoaW50IGlUYWdsaWIgPSAwOyBpVGFnbGliIDwgdGFnbGlicy5nZXRMZW5ndGgoKTsgaVRhZ2xpYisrKSB7Ci0JCQlTdHJpbmcgdGFnbGliVXJpID0gcmVhZFRleHRvZkNoaWxkKHRhZ2xpYnMuaXRlbShpVGFnbGliKSwgInRhZ2xpYi11cmkiKS50cmltKCk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHNwZWNpZmllZCBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byByb290IG9mIHRoZSB3ZWJhcHAKLQkJCVN0cmluZyB0YWdsaWJMb2NhdGlvbiA9IHJlYWRUZXh0b2ZDaGlsZCh0YWdsaWJzLml0ZW0oaVRhZ2xpYiksICJ0YWdsaWItbG9jYXRpb24iKS50cmltKCk7IC8vJE5PTi1OTFMtMSQKLQkJCUlQYXRoIHBhdGggPSBudWxsOwotCQkJaWYgKHRhZ2xpYkxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcGF0aCA9IG5ldyBQYXRoKGdldExvY2FsUm9vdCh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSArIHRhZ2xpYkxvY2F0aW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhdGggPSBuZXcgUGF0aChVUklIZWxwZXIubm9ybWFsaXplKHRhZ2xpYkxvY2F0aW9uLCB3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBnZXRMb2NhbFJvb3Qod2VieG1sLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsKLQkJCX0KLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCUlGaWxlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCWlmIChyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IG51bGw7Ci0JCQkJCS8qCi0JCQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjU5NjAKLQkJCQkJICogCi0JCQkJCSAqIEFsc28gc3VwcG9ydCBtYXBwaW5ncyB0byAuamFyIGZpbGVzCi0JCQkJCSAqLwotCQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoKCJqYXIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSmFyUmVjb3JkIGphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChyZXNvdXJjZSk7Ci0JCQkJCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMocmVzb3VyY2UpOwotCQkJCQkJZm9yIChpbnQgakVudHJ5ID0gMDsgakVudHJ5IDwgZW50cmllcy5sZW5ndGg7IGpFbnRyeSsrKSB7Ci0JCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lcXVhbHMoSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQikpIHsKLQkJCQkJCQkJCWphclJlY29yZC5oYXMxMVRMRCA9IHRydWU7Ci0JCQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShyZXNvdXJjZSwgZW50cmllc1tqRW50cnldKTsKLQkJCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8ocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBjb250ZW50cyk7Ci0JCQkJCQkJCQkJamFyUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJlY29yZCA9IGphclJlY29yZDsKLQkJCQkJCS8vIHRoZSBzdG9yZWQgVVJJIHNob3VsZCByZWZsZWN0IHRoZSB3ZWIueG1sJ3MgdmFsdWUKLQkJCQkJCWphclJlY29yZC5pbmZvLnVyaSA9IHRhZ2xpYlVyaTsKLQkJCQkJCWphclJlY29yZC5pc01hcHBlZEluV2ViWE1MID0gdHJ1ZTsKLQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHdlYi54bWwgcmVjb3JkIGZvciAiICsgdGFnbGliVXJpICsgIkAiICsgamFyUmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVRMRFJlY29yZCB0bGRSZWNvcmQgPSBjcmVhdGVUTERSZWNvcmQocmVzb3VyY2UpOwotCQkJCQkJcmVjb3JkID0gdGxkUmVjb3JkOwotCQkJCQkJLy8gdGhlIHN0b3JlZCBVUkkgc2hvdWxkIHJlZmxlY3QgdGhlIHdlYi54bWwncyB2YWx1ZQotCQkJCQkJdGxkUmVjb3JkLmluZm8udXJpID0gdGFnbGliVXJpOwotCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgd2ViLnhtbCByZWNvcmQgZm9yICIgKyB0YWdsaWJVcmkgKyAiQCIgKyB0bGRSZWNvcmQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJd2VieG1sUmVjb3JkLnRsZFJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5wdXQodGFnbGliVXJpLCByZWNvcmQpOwotCQkJCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwgZGVsdGFLaW5kKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1RhZ2xpYkluZGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjI1N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBIG5vbi1leHRlbmRhYmxlIGluZGV4IG1hbmFnZXIgZm9yIHRhZ2xpYnMgc2ltaWxhciB0byB0aGUgcHJldmlvdXMgSjJFRQotICogSVRhZ2xpYlJlZ2lzdHJ5IGJ1dCBsYWNraW5nIGFueSB0aWVzIHRvIHByb2plY3QgbmF0dXJlcy4gRWFjaCByZWNvcmQKLSAqIHJldHVybmVkIGZyb20gdGhlIGluZGV4IHJlcHJlc2VudHMgYSBzaW5nbGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvci4KLSAqIAotICogSW5kZXhpbmcgaXMgb25seSBwZXJzaXN0ZWQgYmV0d2VlbiBzZXNzaW9ucyBmb3IgZW50cmllcyBvbiB0aGUgSmF2YSBCdWlsZAotICogUGF0aC4gTmV3IEFERCBldmVudHMgd2lsbCBiZSBzZW50IHRvIElUYWdsaWJJbmRleExpc3RlbmVycyBkdXJpbmcgZWFjaAotICogd29ya2JlbmNoIHNlc3Npb24gZm9yIGJvdGggY2FjaGVkIGFuZCBuZXdseSBmb3VuZCByZWNvcmRzLiBSRU1PVkUgZXZlbnRzCi0gKiBhcmUgbm90IGZpcmVkIG9uIHdvcmtiZW5jaCBzaHV0ZG93bi4gVGhlIHJlY29yZCdzIGNvbnRlbnRzIHNob3VsZCBiZQotICogZXhhbWluZWQgZm9yIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWdsaWJJbmRleCB7Ci0JY2xhc3MgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCVN0YWNrIGNsYXNzcGF0aFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCUxpc3QgcHJvamVjdHNJbmRleGVkID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWlzSW5kZXhBdmFpbGFibGUoKSkKLQkJCQlyZXR1cm47Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJCWNsYXNzcGF0aFN0YWNrLmNsZWFyKCk7Ci0JCQkJcHJvamVjdHNJbmRleGVkLmNsZWFyKCk7Ci0JCQkJZWxlbWVudENoYW5nZWQoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlMT0NLLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBlbGVtZW50Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwpIHsKLQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoYW5nZWQgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWVsZW1lbnRDaGFuZ2VkKGNoYW5nZWRbaV0pOwotCQkJCX0KLQkJCX0KLQkJCS8vIEhhbmRsZSBhbnkgY2hhbmdlcyBhdCB0aGUgcHJvamVjdCBsZXZlbAotCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7Ci0JCQkJCUlKYXZhRWxlbWVudCBwcm9qID0gZWxlbWVudDsKLQkJCQkJaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKChJSmF2YVByb2plY3QpIHByb2opOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQllbGVtZW50Q2hhbmdlZChkZWx0YXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIE90aGVyIG1vZGlmaWNhdGlvbiB0byB0aGUgY2xhc3NwYXRoIChzdWNoIGFzIHdpdGhpbiBhIGNsYXNzcGF0aAotCQkJICogY29udGFpbmVyIGxpa2UgIldlYiBBcHAgTGlicmFyaWVzIikgZ28gdG8gdGhlIGRlc2NyaXB0aW9uCi0JCQkgKiBpdHNlbGYKLQkJCSAqLwotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgIT0gMCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCkgewotCQkJCUlKYXZhUHJvamVjdCBhZmZlY3RlZFByb2plY3QgPSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0JCQkJaWYgKGFmZmVjdGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZSBhZmZlY3RlZCBwcm9qZWN0IGhhcyBhbiBpbmRleCBvbi1kaXNrLCBpdCdzCi0JCQkJCSAqIGdvaW5nIHRvIGJlIGludmFsaWQtLXdlIG5lZWQgdG8gY3JlYXRlL2xvYWQgdGhlCi0JCQkJCSAqIGRlc2NyaXB0aW9uIHNvIGl0IHdpbGwgYmUgdXAgdG8gZGF0ZSBbbG9hZGluZyBub3cgYW5kCi0JCQkJCSAqIHVwZGF0aW5nIGlzIHVzdWFsbHkgZmFzdGVyIHRoYW4gcmVnZW5lcmF0aW5nIHRoZSBlbnRpcmUKLQkJCQkJICogaW5kZXhdLiBJZiB0aGVyZSBpcyBubyBpbmRleCBvbiBkaXNrLCBkbyBub3RoaW5nIG1vcmUuCi0JCQkJCSAqLwotCQkJCQlGaWxlIGluZGV4RmlsZSA9IG5ldyBGaWxlKGNvbXB1dGVJbmRleExvY2F0aW9uKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCQlpZiAoaW5kZXhGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gYWZmZWN0ZWREZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJaWYgKGFmZmVjdGVkRGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJCWFmZmVjdGVkRGVzY3JpcHRpb24uaGFuZGxlRWxlbWVudENoYW5nZWQoZGVsdGEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzcGF0aENoYW5nZShJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQkJcmV0dXJuOwotCi0JCQkvKgotCQkJICogTG9vcHMgaW4gdGhlIGJ1aWxkIHBhdGhzIGNvdWxkIGNhdXNlIHVzIHRvIHBvcCBtb3JlIHRoYW4gd2UKLQkJCSAqIHB1c2gKLQkJCSAqLwotCQkJaWYgKGNsYXNzcGF0aFN0YWNrLmNvbnRhaW5zKHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSkpCi0JCQkJcmV0dXJuOwotCi0JCQljbGFzc3BhdGhTdGFjay5wdXNoKHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl0cnkgewotCQkJCS8qIEhhbmRsZSBsYXJnZSBjaGFuZ2VzIHRvIHRoaXMgcHJvamVjdCdzIGJ1aWxkIHBhdGggKi8KLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgJiYgIXByb2plY3RzSW5kZXhlZC5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQlwcm9qZWN0c0luZGV4ZWQuYWRkKHJlc291cmNlKTsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkUGF0aElzRGlydHkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvKgotCQkJCSAqIFVwZGF0ZSBpbmRlY2VzIGZvciBwcm9qZWN0cyB3aG8gaW5jbHVkZSB0aGlzIHByb2plY3QgaW4KLQkJCQkgKiB0aGVpciBidWlsZCBwYXRoIChlLmcuIHRvZ2dsaW5nIHRoZSAiZXhwb3J0YXRpb24iIG9mIGEKLQkJCQkgKiB0YWdsaWIgSkFSIGluIHRoaXMgcHJvamVjdCBhZmZlY3RzIHRoZSBKQVIncyB2aXNpYmlsaXR5IGluCi0JCQkJICogb3RoZXIgcHJvamVjdHMpCi0JCQkJICovCi0JCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBwcm9qZWN0LmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUphdmFQcm9qZWN0IG90aGVyUHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCQlpZiAoU3RyaW5nVXRpbHMuY29udGFpbnMob3RoZXJQcm9qZWN0LmdldFJlcXVpcmVkUHJvamVjdE5hbWVzKCksIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSwgZmFsc2UpICYmICFjbGFzc3BhdGhTdGFjay5jb250YWlucyhvdGhlclByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSkgJiYgIWZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCWhhbmRsZUNsYXNzcGF0aENoYW5nZShvdGhlclByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNsYXNzcGF0aFN0YWNrLnBvcCgpOwotCi0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmICghaXNJbmRleEF2YWlsYWJsZSgpKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOgotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgOiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHBhaXIgZGVsdGFzIHdpdGggcHJvamVjdHMKLQkJCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVtde2V2ZW50LmdldERlbHRhKCl9OwotCQkJCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBudWxsOwotCi0JCQkJCQkJaWYgKGRlbHRhcyAhPSBudWxsICYmIGRlbHRhcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJCWlmIChkZWx0YXNbMF0gIT0gbnVsbCkgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBkZWx0YXNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKSB7Ci0JCQkJCQkJCQkJZGVsdGFzID0gZGVsdGFzWzBdLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtkZWx0YXMubGVuZ3RoXTsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlpZiAoZGVsdGFzW2ldLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCQlwcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgZGVsdGFzW2ldLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFsxXTsKLQkJCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCXByb2plY3RzWzBdID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCBub3RpY2VkICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCkgKyAiIGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQvY2xvc2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pIHsKLQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWRlc2NyaXB0aW9uLmNsZWFyKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBkZWxldGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gcGFpciBkZWx0YXMgd2l0aCBwcm9qZWN0cwotCQkJCQkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW117ZXZlbnQuZ2V0RGVsdGEoKX07Ci0JCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0KLQkJCQkJCQlpZiAoZGVsdGFzICE9IG51bGwgJiYgZGVsdGFzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQkJCQkJaWYgKGRlbHRhc1swXSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGRlbHRhc1swXS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJCQkJCQlkZWx0YXMgPSBkZWx0YXNbMF0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W2RlbHRhcy5sZW5ndGhdOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJCXByb2plY3RzW2ldID0gKElQcm9qZWN0KSBkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0WzFdOwotCQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlwcm9qZWN0c1swXSA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaWYgKGRlbHRhc1tpXSAhPSBudWxsICYmIGRlbHRhc1tpXS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCAmJiBwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbihwcm9qZWN0c1tpXSk7Ci0JCQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQkJCQkJCQlkZWx0YXNbaV0uYWNjZXB0KGRlc2NyaXB0aW9uLmdldFZpc2l0b3IoKSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaWYgKCFwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSB8fCAoZGVsdGFzW2ldICE9IG51bGwgJiYgZGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSkgewotCQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IG5vdGljZWQgIiArIHByb2plY3RzW2ldLmdldE5hbWUoKSArICIgd2FzIHJlbW92ZWQgb3IgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKSB7Ci0JCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlkZXNjcmlwdGlvbi5jbGVhcigpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDaGFuZ2VMaXN0ZW5lciA9IGZhbHNlOwotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnRXZlbnRzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvZXZlbnRzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0luZGV4Q3JlYXRpb24gPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1Jlc29sdXRpb24gPSAidHJ1ZSIuZXF1YWxzKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL3Jlc29sdmUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIFRhZ2xpYkluZGV4IF9pbnN0YW5jZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENSQzMyIGNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOID0gIkNMRUFOIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSVFkgPSAiRElSVFkiOwotCXN0YXRpYyBib29sZWFuIEVOQUJMRUQgPSBmYWxzZTsKLQlzdGF0aWMgSUxvY2sgTE9DSyA9IG51bGw7Ci0KLQkvKioKLQkgKiBOT1QgQVBJLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJX2luc3RhbmNlLmludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXN0YXRpYyB2b2lkIGZpcmVUYWdsaWJSZWNvcmRFdmVudChJVGFnbGliUmVjb3JkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKF9kZWJ1Z0V2ZW50cykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IGZpcmVkIGV2ZW50OiIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvKgotCQkgKiBGbHVzaCBhbnkgc2hhcmVkIGNhY2hlIGVudHJpZXMsIHRoZSBUYWdsaWJDb250cm9sbGVycyBzaG91bGQgaGFuZGxlCi0JCSAqIHVwZGF0aW5nIHRoZWlyIGRvY3VtZW50cyBhcyBuZWVkZWQuCi0JCSAqLwotCQlUTERDTURvY3VtZW50TWFuYWdlci5nZXRTaGFyZWREb2N1bWVudENhY2hlKCkucmVtb3ZlKFRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFVuaXF1ZUlkZW50aWZpZXIoZXZlbnQuZ2V0VGFnbGliUmVjb3JkKCkpKTsKLQotCQlJVGFnbGliSW5kZXhMaXN0ZW5lcltdIGxpc3RlbmVycyA9IF9pbnN0YW5jZS5mVGFnbGliSW5kZXhMaXN0ZW5lcnM7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlsaXN0ZW5lcnNbaV0uaW5kZXhDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhbGwgb2YgdGhlIHZpc2libGUgSVRhZ2xpYlJlY29yZHMgZm9yIHRoZSBnaXZlbiBwYXRoIGluIHRoZQotCSAqIHdvcmtzcGFjZS4gVGFnbGliIG1hcHBpbmdzIGZyb20gd2ViLnhtbCBmaWxlcyBhcmUgb25seSB2aXNpYmxlIHRvIHBhdGhzCi0JICogd2l0aGluIHRoZSB3ZWIueG1sJ3MgY29ycmVzcG9uZGluZyB3ZWIgY29udGVudCBmb2xkZXIuCi0JICogPHA+Ci0JICogVmFsdWVzIGRlZmluZWQgd2l0aGluIHRoZSBYTUwgQ2F0YWxvZyB3aWxsIG5vdCBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZ1bGxQYXRoIC0KLQkgKiAgICAgICAgICAgIGEgcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQWxsIG9mIHRoZSB2aXNpYmxlIElUYWdsaWJSZWNvcmRzIGZyb20gdGhlIGdpdmVuIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBJVGFnbGliUmVjb3JkW10gZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhJUGF0aCBmdWxsUGF0aCkgewotCQlJVGFnbGliUmVjb3JkW10gcmVjb3JkcyA9IF9pbnN0YW5jZS5pbnRlcm5hbEdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoZnVsbFBhdGgpOwotCQlyZXR1cm4gcmVjb3JkczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUGF0aCBjb25zaWRlcmVkIHRvIGJlIHRoZSB3ZWItYXBwIHJvb3QgZm9yIHRoZSBnaXZlbiBwYXRoLgotCSAqIEFsbCByZXNvbHV0aW9uIGZyb20gdGhlIGdpdmVuIHBhdGggYmVnaW5uaW5nIHdpdGggJy8nIHdpbGwgYmUgcmVsYXRpdmUKLQkgKiB0byB0aGUgY29tcHV0ZWQgd2ViLWFwcCByb290LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gaXMgbm90IGNvcnJlY3QgaW4gZmxleGlibGUgcHJvamVjdHMKLQkgKiBAcGFyYW0gcGF0aCAtCi0JICogICAgICAgICAgICBhIHBhdGggdW5kZXIgdGhlIHdlYi1hcHAgcm9vdAotCSAqIEByZXR1cm4gdGhlIElQYXRoIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHdlYi1hcHAncyByb290IGZvciB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldENvbnRleHRSb290KElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJcmV0dXJuIF9pbnN0YW5jZS5pbnRlcm5hbEdldENvbnRleHRSb290KHBhdGgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdGF0ZSgpIHsKLQkJU3RyaW5nIHN0YXRlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVGFnbGliSW5kZXguY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCS8qKgotCSAqIE5PVCBBUEkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVUYWdsaWJJbmRleExpc3RlbmVyKElUYWdsaWJJbmRleExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCV9pbnN0YW5jZS5pbnRlcm5hbFJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhIG1hdGNoaW5nIElUYWdsaWJSZWNvcmQgZ2l2ZW4gdGhlIHJlZmVyZW5jZS4gVHlwaWNhbGx5IHRoZQotCSAqIHJlc3VsdCB3aWxsIGhhdmUgdG8gYmUgY2FzdCB0byBhIHN1YmlpbnRlcmZhY2Ugb2YgSVRhZ2xpYlJlY29yZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIGZvciBJUmVzb3VyY2VzLCBmdWxsIGZpbGVzeXN0ZW0KLQkgKiAgICAgICAgICAgIHBhdGggb3RoZXJ3aXNlCi0JICogQHBhcmFtIHJlZmVyZW5jZSAtCi0JICogICAgICAgICAgICB0aGUgVVJJIHRvIGxvb2t1cCwgZm9yIGV4YW1wbGUgdGhlIHVyaSB2YWx1ZSBmcm9tIGEgdGFnbGliCi0JICogICAgICAgICAgICBkaXJlY3RpdmUKLQkgKiBAcGFyYW0gY3Jvc3NQcm9qZWN0cyAtCi0JICogICAgICAgICAgICB3aGV0aGVyIHRvIHNlYXJjaCBhY3Jvc3MgcHJvamVjdHMgKGN1cnJlbnRseSBpZ25vcmVkKQotCSAqIAotCSAqIEByZXR1cm4gYSB2aXNpYmxlIElUYWdsaWJSZWNvcmQgb3IgbnVsbCBpZiB0aGUgcmVmZXJlbmNlIHBvaW50cyB0byBubwotCSAqICAgICAgICAga25vd24gdGFnIGxpYnJhcnkgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBTZWUgSVRhZ2xpYlJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSwgYm9vbGVhbiBjcm9zc1Byb2plY3RzKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJcmVzdWx0ID0gX2luc3RhbmNlLmludGVybmFsUmVzb2x2ZShiYXNlUGF0aCwgcmVmZXJlbmNlLCBjcm9zc1Byb2plY3RzKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JCWlmIChfZGVidWdSZXNvbHV0aW9uKSB7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggY291bGQgbm90IHJlc29sdmUgXCIiICsgcmVmZXJlbmNlICsgIlwiIGZyb20gIiArIGJhc2VQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzd2l0Y2ggKHJlc3VsdC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UTEQpIDogewotCQkJCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVzdWx0OwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJCQlJSmFyUmVjb3JkIHJlY29yZCA9IChJSmFyUmVjb3JkKSByZXN1bHQ7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzb2x2ZWQgIiArIGJhc2VQYXRoICsgIjoiICsgcmVmZXJlbmNlICsgIiA9ICIgKyByZWNvcmQuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRBR0RJUikgOiB7Ci0JCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSByZXN1bHQ7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzb2x2ZWQgIiArIGJhc2VQYXRoICsgIjoiICsgcmVmZXJlbmNlICsgIiA9ICIgKyByZWNvcmQuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGluZGV4IGZpbGVzLiBVc2VkIGZvciBtYWludGVuYW5jZSBhbmQga2VlcGluZyB0aGUgaW5kZXggZm9sZGVyCi0JICogYSBtYW5hZ2VhYmxlIHNpemUuCi0JICogCi0JICogQHBhcmFtIHN0YWxlT25seSAtCi0JICogICAgICAgICAgICBpZiA8Yj50cnVlPC9iPiwgcmVtb3ZlcyBvbmx5IHRoZSBpbmRleGVzIGZvciBwcm9qZWN0cyBub3QKLQkgKiAgICAgICAgICAgIG9wZW4gaW4gdGhlIHdvcmtzcGFjZSwgaWYgPGI+ZmFsc2U8L2I+LCByZW1vdmVzIGFsbCBvZiB0aGUKLQkgKiAgICAgICAgICAgIGluZGV4ZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlSW5kZXhlcyhib29sZWFuIHN0YWxlT25seSkgewotCQlTdHJpbmcgb3NQYXRoID0gZ2V0VGFnbGliSW5kZXhTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKG9zUGF0aCk7Ci0JCWlmICghZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZm9sZGVyLm1rZGlyKCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIGFueSBleHRyYW5lb3VzIGluZGV4IGZpbGVzCi0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCUxpc3QgaW5kZXhOYW1lcyA9IG5ldyBBcnJheUxpc3QocHJvamVjdHMubGVuZ3RoKTsKLQkJaWYgKHN0YWxlT25seSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlpbmRleE5hbWVzLmFkZChjb21wdXRlSW5kZXhOYW1lKHByb2plY3RzW2ldLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGZvbGRlci5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBmaWxlcyAhPSBudWxsICYmIGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghaW5kZXhOYW1lcy5jb250YWlucyhmaWxlc1tpXS5nZXROYW1lKCkpKQotCQkJCQlmaWxlc1tpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc3RydWN0cyB0aGUgaW5kZXggdG8gc3RvcCBsaXN0ZW5pbmcgZm9yIHJlc291cmNlIGFuZCBjbGFzc3BhdGgKLQkgKiBjaGFuZ2VzLCBhbmQgdG8gZm9yZ2V0IGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChfaW5zdGFuY2UgIT0gbnVsbCkgewotCQkJX2luc3RhbmNlLnN0b3AoKTsKLQkJfQotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc3RydWN0cyB0aGUgaW5kZXggdG8gYmVnaW4gbGlzdGVuaW5nIGZvciByZXNvdXJjZSBhbmQgY2xhc3NwYXRoCi0JICogY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0dXAoKSB7Ci0JCUVOQUJMRUQgPSAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eShUYWdsaWJJbmRleC5jbGFzcy5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlfaW5zdGFuY2UgPSBuZXcgVGFnbGliSW5kZXgoKTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzcGF0aENoYW5nZUxpc3RlbmVyIGZDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0KLQlNYXAgZlByb2plY3REZXNjcmlwdGlvbnM7Ci0KLQlwcml2YXRlIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElUYWdsaWJJbmRleExpc3RlbmVyW10gZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gbnVsbDsKLQkvKiogc3ltYm9saWMgbmFtZSBmb3IgT1NHSSBmcmFtZXdvcmsgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPU0dJX0ZSQU1FV09SS19JRCA9ICJvcmcuZWNsaXBzZS5vc2dpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYWdsaWJJbmRleCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvKgotCQkgKiBPbmx5IGNvbnNpZGVyIGEgY3Jhc2ggaWYgYSB2YWx1ZSBleGlzdHMgYW5kIGlzIERJUlRZIChub3QgYSBuZXcKLQkJICogd29ya3NwYWNlKQotCQkgKi8KLQkJaWYgKERJUlRZLmVxdWFsc0lnbm9yZUNhc2UoZ2V0U3RhdGUoKSkpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiQSB3b3Jrc3BhY2UgY3Jhc2ggd2FzIGRldGVjdGVkLiBUaGUgcHJldmlvdXMgc2Vzc2lvbiBkaWQgbm90IGV4aXQgbm9ybWFsbHkuIE5vdCB1c2luZyBzYXZlZCB0YWdsaWIgaW5kZXhlcyIpOyAvLyROT04tTkxTLTMkCi0JCQlyZW1vdmVJbmRleGVzKGZhbHNlKTsKLQkJfQotCi0JCUxPQ0sgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCQlmUHJvamVjdERlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgPSBuZXcgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIoKTsKLQkJaWYgKEVOQUJMRUQpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGZDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lclBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGNvbXB1dGVJbmRleExvY2F0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gY29tcHV0ZUluZGV4TmFtZShjb250YWluZXJQYXRoKTsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiLT4gaW5kZXggbmFtZSBmb3IgIiArIGNvbnRhaW5lclBhdGggKyAiIGlzICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgaW5kZXhMb2NhdGlvbiA9IGdldFRhZ2xpYkluZGV4U3RhdGVMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSkudG9PU1N0cmluZygpOwotCQlyZXR1cm4gaW5kZXhMb2NhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgY29tcHV0ZUluZGV4TmFtZShJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JCWNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpLmdldEJ5dGVzKCkpOwotCQkvLyB1c2UgIi5kYXQiIHNvIHdlJ3JlIG5vdCBjb25mdXNlZCB3aXRoIEpEVCBpbmRleGVzCi0JCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5kYXQiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlQcm9qZWN0RGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQlkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLmdldChwcm9qZWN0KTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCS8vIE9uY2Ugd2UndmUgc3RhcnRlZCBpbmRleGluZywgd2UncmUgZGlydHkgYWdhaW4KLQkJCWlmIChmUHJvamVjdERlc2NyaXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlzZXRTdGF0ZShESVJUWSk7Ci0JCQl9Ci0JCQlkZXNjcmlwdGlvbiA9IG5ldyBQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdCwgY29tcHV0ZUluZGV4TG9jYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpKSk7Ci0JCQlmUHJvamVjdERlc2NyaXB0aW9ucy5wdXQocHJvamVjdCwgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMKLQkgKiAgICAgICAgIHNodXR0aW5nIGRvd24pCi0JICovCi0JYm9vbGVhbiBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHsKLQkJLy8gaW4gdGhlIEZyYW1ld29yayBjbGFzcyB0aGVyZSdzIGEgbm90ZToKLQkJLy8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3lzdGVtIEJ1bmRsZSB0byBTVE9QUElORy4KLQkJLy8gdGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QgYWNjb3JkaW5nIHRvIHNlY3Rpb24gNC4xOS4yIGZyb20gdGhlIE9TR2kKLQkJLy8gUjMgc3BlYy4KLQkJYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSAhUGxhdGZvcm0uaXNSdW5uaW5nKCkgfHwgUGxhdGZvcm0uZ2V0QnVuZGxlKE9TR0lfRlJBTUVXT1JLX0lEKS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVE9QUElORzsKLQkJcmV0dXJuIHNodXR0aW5nRG93bjsKLQl9Ci0KLQlQcm9qZWN0RGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQlkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLmdldChwcm9qZWN0KTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0VGFnbGliSW5kZXhTdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgidGFnbGliaW5kZXgvIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZlRhZ2xpYkluZGV4TGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZUYWdsaWJJbmRleExpc3RlbmVycyA9IG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lcltde2xpc3RlbmVyfTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYWdsaWJJbmRleExpc3RlbmVycykpOwotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQlmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPSAoSVRhZ2xpYkluZGV4TGlzdGVuZXJbXSkgbGlzdGVuZXJzLnRvQXJyYXkobmV3IElUYWdsaWJJbmRleExpc3RlbmVyWzBdKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVRhZ2xpYlJlY29yZFtdIGludGVybmFsR2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhJUGF0aCBwYXRoKSB7Ci0JCUlUYWdsaWJSZWNvcmRbXSByZWNvcmRzID0gbmV3IElUYWdsaWJSZWNvcmRbMF07Ci0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24ocHJvamVjdCk7Ci0JCQlMaXN0IGF2YWlsYWJsZVJlY29yZHMgPSBkZXNjcmlwdGlvbi5nZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKHBhdGgpOwotCi0vLwkJCUlDYXRhbG9nIGNhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotLy8JCQl3aGlsZSAoY2F0YWxvZyAhPSBudWxsKSB7Ci0vLwkJCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLS8vCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotLy8JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzW2ldLmdldFVSSSgpKTsKLS8vCQkJCX0KLS8vCQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGNhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0vLwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotLy8JCQkJCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzMiA9IG5leHRDYXRhbG9nc1tpXS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0vLwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzMi5sZW5ndGg7IGorKykgewotLy8JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZW50cmllczJbal0uZ2V0VVJJKCkpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCi0JCQlyZWNvcmRzID0gKElUYWdsaWJSZWNvcmRbXSkgYXZhaWxhYmxlUmVjb3Jkcy50b0FycmF5KHJlY29yZHMpOwotCQl9Ci0JCXJldHVybiByZWNvcmRzOwotCX0KLQotCXByaXZhdGUgSVBhdGggaW50ZXJuYWxHZXRDb250ZXh0Um9vdChJUGF0aCBwYXRoKSB7Ci0JCUlGaWxlIGJhc2VSZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKHBhdGgpOwotCQlpZiAoYmFzZVJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBiYXNlUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gX2luc3RhbmNlLmNyZWF0ZURlc2NyaXB0aW9uKHByb2plY3QpOwotCQkJSVBhdGggcm9vdFBhdGggPSBkZXNjcmlwdGlvbi5nZXRMb2NhbFJvb3QoYmFzZVJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQkJcmV0dXJuIHJvb3RQYXRoOwotCQl9Ci0JCS8vIHRyeSB0byBoYW5kbGUgb3V0LW9mLXdvcmtzcGFjZSBwYXRocwotCQlJUGF0aCByb290ID0gcGF0aDsKLQkJd2hpbGUgKHJvb3QgIT0gbnVsbCAmJiAhcm9vdC5pc1Jvb3QoKSkKLQkJCXJvb3QgPSByb290LnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJvb3QgPSBwYXRoOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZW1vdmVUYWdsaWJJbmRleExpc3RlbmVyKElUYWdsaWJJbmRleExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmVGFnbGliSW5kZXhMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZlRhZ2xpYkluZGV4TGlzdGVuZXJzKSk7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWZUYWdsaWJJbmRleExpc3RlbmVycyA9IChJVGFnbGliSW5kZXhMaXN0ZW5lcltdKSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVRhZ2xpYkluZGV4TGlzdGVuZXJbMF0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkIGludGVybmFsUmVzb2x2ZShTdHJpbmcgYmFzZVBhdGgsIGZpbmFsIFN0cmluZyByZWZlcmVuY2UsIGJvb2xlYW4gY3Jvc3NQcm9qZWN0cykgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJSVRhZ2xpYlJlY29yZCByZXNvbHZlZCA9IG51bGw7Ci0KLQkJUGF0aCBiYXNlSVBhdGggPSBuZXcgUGF0aChiYXNlUGF0aCk7Ci0JCUlSZXNvdXJjZSBiYXNlUmVzb3VyY2UgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlSVBhdGgpOwotCi0JCWlmIChiYXNlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdAotCQkJaWYgKGJhc2VSZXNvdXJjZSA9PSBudWxsICYmIGJhc2VJUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQliYXNlUmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihiYXNlSVBhdGgpOwotCQkJfQotCQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlCi0JCQlpZiAoYmFzZVJlc291cmNlICE9IG51bGwgJiYgIWJhc2VSZXNvdXJjZS5leGlzdHMoKSAmJiBiYXNlSVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJYmFzZVJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGJhc2VJUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZVJlc291cmNlID09IG51bGwgJiYgYmFzZUlQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKLQkJCQliYXNlUmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoYmFzZUlQYXRoLnNlZ21lbnQoMCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJhc2VSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjUyOQotCQkJICogCi0JCQkgKiBUaGlzIG1ldGhvZCBwcm9kdWNlcyBhIGxlc3MgYWNjdXJhdGUgcmVzdWx0LCBidXQgZG9lc24ndAotCQkJICogcmVxdWlyZSB0aGF0IHRoZSBmaWxlIGV4aXN0IHlldC4KLQkJCSAqLwotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oYmFzZUlQYXRoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQotCQkJCWJhc2VSZXNvdXJjZSA9IGZpbGVzWzBdOwotCQl9Ci0JCWlmIChiYXNlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcHJvamVjdCA9IGJhc2VSZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbihwcm9qZWN0KTsKLQkJCXJlc29sdmVkID0gZGVzY3JpcHRpb24ucmVzb2x2ZShiYXNlUGF0aCwgcmVmZXJlbmNlKTsKLQkJfQotCi0JCXJldHVybiByZXNvbHZlZDsKLQl9Ci0KLQlib29sZWFuIGlzSW5kZXhBdmFpbGFibGUoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2UgIT0gbnVsbCAmJiBFTkFCTEVEOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTdGF0ZShTdHJpbmcgc3RhdGUpIHsKLQkJaWYgKCFzdGF0ZS5lcXVhbHMoZ2V0U3RhdGUoKSkpIHsKLQkJCUpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVGFnbGliSW5kZXguY2xhc3MuZ2V0TmFtZSgpLCBzdGF0ZSk7Ci0JCQlKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyKTsKLQotCQkvKgotCQkgKiBDbGVhcmluZyB0aGUgZXhpc3Rpbmcgc2F2ZWQgc3RhdGVzIGhlbHBzIHBydW5lIGRlYWQgZGF0YSBmcm9tIHRoZQotCQkgKiBpbmRleCBmb2xkZXIuCi0JCSAqLwotCQlyZW1vdmVJbmRleGVzKHRydWUpOwotCi0JCUl0ZXJhdG9yIGkgPSBmUHJvamVjdERlc2NyaXB0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGkubmV4dCgpOwotCQkJZGVzY3JpcHRpb24uc2F2ZVJlZmVyZW5jZXMoKTsKLQkJfQotCi0JCWZQcm9qZWN0RGVzY3JpcHRpb25zLmNsZWFyKCk7Ci0KLQkJc2V0U3RhdGUoQ0xFQU4pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGV4dC9JSlNQUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90ZXh0L0lKU1BQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzdhYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90ZXh0L0lKU1BQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBKU1AuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIEpTUF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEpTUF9TQ1JJUFRfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfREVMSU1JVEVSID0gSlNQX1NDUklQVF9QUkVGSVggKyAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQVNDUklQVCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkFTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTDIgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKU1BfRUwyIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfRElSRUNUSVZFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0YTVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQZWRDU1NUYWdsaWJDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50IHsKLQotCXB1YmxpYyB2b2lkIHNldHVwKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZ25vcmUgVExEIGluIGNvbnRlbnQgdHlwZSBjc3MganNwCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGFmYTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuTEFOR1VBR0VfQVRUUklCVVRFfTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCS8vIGlmIGRpc2NyaXB0aW9uIGlzIG51bGwsIHdlIGFyZSBqdXN0IGJlaW5nIGFza2VkIHRvCi0JCS8vIGFzc2VzcyBjb250ZW50cyB2YWxpZGl0eQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCQlyZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGhhbmRsZSBzdGFuZGFyZCBvbmVzIGZpcnN0LCB0byBiZSBzdXJlIGRldGVjdG9yIHByb2Nlc3NlcwotCQloYW5kbGVTdGFuZGFyZENhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkvLyBub3cgZG8gdGhvc2Ugc3BlY2lmaWMgZm9yIEpTUHMKLQkJLy8gbm90ZTogZGV0ZWN0b3Igc2hvdWxkIGFsd2F5cyBiZSBvZiBjb3JyZWN0IGluc3RhbmNlLCBidXQgd2UnbGwKLQkJLy8gY2hlY2ssIGZvciBub3cuCi0JCWlmIChkZXRlY3RvciBpbnN0YW5jZW9mIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgewotCQkJSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGpzcERldGVjdG9yID0gKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3I7Ci0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBqc3BEZXRlY3Rvci5nZXRMYW5ndWFnZSgpOwotCQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEUsIGxhbmd1YWdlKTsKLQkJCX0KLQkJCVN0cmluZyBjb250ZW50VHlwZUF0dHJpYnV0ZSA9IGpzcERldGVjdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCQlpZiAoY29udGVudFR5cGVBdHRyaWJ1dGUgIT0gbnVsbCAmJiBjb250ZW50VHlwZUF0dHJpYnV0ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUsIGNvbnRlbnRUeXBlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdC4KLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBkZXRlY3Rvci5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoUmVhZGVyIHJlYWRlcikgewotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc0Yjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUENTU0ltcG9ydFJ1bGUgZXh0ZW5kcyBJQ1NTSW1wb3J0UnVsZSwgSUpTUENTU05vZGUgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSUpTUENTU05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyNjc1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BDU1NOb2RlIGV4dGVuZHMgSUNTU05vZGUgewotCXNob3J0IEpTUF9OT0RFID0gMTY7Ci0JU3RyaW5nIGdldENzc1RleHQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BDU1NJbXBvcnRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTlkZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTSW1wb3J0UnVsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BDU1NJbXBvcnRSdWxlSW1wbCBleHRlbmRzIENTU0ltcG9ydFJ1bGVJbXBsIGltcGxlbWVudHMgSUpTUENTU0ltcG9ydFJ1bGUgewotCi0JSlNQQ1NTSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUpTUENTU0ltcG9ydFJ1bGVJbXBsKEpTUENTU0ltcG9ydFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJSlNQQ1NTSW1wb3J0UnVsZUltcGwgY2xvbmVkID0gbmV3IEpTUENTU0ltcG9ydFJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEhSRUYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChIUkVGLmVxdWFscyhuYW1lKSl7Ci0JCQl2YWx1ZSA9IENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKHZhbHVlKTsKLQkJfQotCQlzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BDU1NOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmJhNzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLWNsYXNzIEpTUENTU05vZGVJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUpTUENTU05vZGUgewotCi0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQotCUpTUENTU05vZGVJbXBsKEpTUENTU05vZGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQl9Ci0KLQlKU1BDU1NOb2RlSW1wbChTdHJpbmcgdGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUpTUENTU05vZGVJbXBsIGNsb25lZCA9IG5ldyBKU1BDU1NOb2RlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gSlNQX05PREU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQZWRDU1NNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYTBmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU01vZGVsSW1wbCBleHRlbmRzIENTU01vZGVsSW1wbCB7Ci0JcHJpdmF0ZSBKU1BlZENTU01vZGVsUGFyc2VyIGZQYXJzZXI7Ci0JCi0JcHJvdGVjdGVkIENTU01vZGVsUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKGZQYXJzZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCWZQYXJzZXIgPSBuZXcgSlNQZWRDU1NNb2RlbFBhcnNlcihnZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNzIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouSlNQZWRDU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NOb2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgSlNQZWRDU1NNb2RlbFBhcnNlciBleHRlbmRzIENTU01vZGVsUGFyc2VyIHsKLQotCXB1YmxpYyBKU1BlZENTU01vZGVsUGFyc2VyKElDU1NEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoZG9jKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJaWYgKGNyZWF0aW9uQ29udGV4dCA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKS5nZXRUeXBlKCk7Ci0JCUNTU05vZGVJbXBsIG1vZGlmaWVkID0gbnVsbDsKLQotCQkvL0lDU1NOb2RlIHRhcmdldCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQkKLQkJaWYgKHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0RJUkVDVElWRSl7Ci0JCQkKLQkJCWJvb2xlYW4gaXNJbmNsdWRlID0gcmVnaW9uLmdldFRleHQoKS5pbmRleE9mKCJpbmNsdWRlIikgIT0gLTE7Ci0JCQlpZiAoaXNJbmNsdWRlKXsKLQkJCQltb2RpZmllZCA9IGluc2VydFVua25vd25JbXBvcnQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRVbmtub3duUnVsZShyZWdpb24pOwkJCQkJCi0JCQl9Ci0JCX0KLQotCQkvLyBwb3N0IHByb2Nlc3MKLQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCWlmIChtb2RpZmllZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBtb2RpZmllZCkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZCAhPSBudWxsID8gbW9kaWZpZWQgOiBzdXBlci5pbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFVua25vd25JbXBvcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgY3JlYXRpb25Db250ZXh0ID0gZ2V0Q3JlYXRpb25Db250ZXh0KCk7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCUlDU1NEb2N1bWVudCBzaGVldCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiICIpOwotCSAgICBTdHJpbmdbXSBzdHJzID0gcGF0dGVybi5zcGxpdCh0ZXh0KTsKLQkgICAgU3RyaW5nIGhyZWZWYWx1ZSA9IG51bGw7Ci0JICAgIGZvciAoaW50IGk9MDtpPHN0cnMubGVuZ3RoO2krKykgewotCSAgICAJU3RyaW5nIGhyZWZTdHIgPSAiZmlsZT1cIiI7Ci0JICAgICAgaWYgKHN0cnNbaV0uc3RhcnRzV2l0aChocmVmU3RyKSl7Ci0JCQkJaW50IGhyZWZTdHJfbGVuZ3RoID0gaHJlZlN0ci5sZW5ndGgoKTsKLQkJCQkvLyBtaW51cyAxIHRvIGF2b2lkIHF1b3RlPwotCQkJCWludCBocmVmVmFsdWVfbGVuZ3RoID0gc3Ryc1tpXS5sZW5ndGgoKSAtIDE7Ci0JCQkJaWYgKGhyZWZWYWx1ZV9sZW5ndGggPiBocmVmU3RyX2xlbmd0aCkgewotCQkJCQlocmVmVmFsdWUgPSBzdHJzW2ldLnN1YnN0cmluZyhocmVmU3RyX2xlbmd0aCwgaHJlZlZhbHVlX2xlbmd0aCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBJU1NVRTogdGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlLCBlLmcuICJmaWxlPSIgaGFzIG5vCi0JCQkJCSAqIHN1YnNlcXVlbnQgJ3ZhbHVlJyAuLi4gYW5kIGZyb20gY29kZSBpbiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJICogSSBiZWxpZXZlIHNob3VsZCByZXR1cm4gbnVsbCwgcmF0aGVyIHRoYW4gZW1wdHkgc3RyaW5nLCBidXQsIHRoaXMgbWF5IAotCQkJCQkgKiBuZWVkIHNvbWUgZmluZSB0dW5pbmcgZXZlbnR1YWxseS4KLQkJCQkJICovCi0JCQkJCWhyZWZWYWx1ZSA9IG51bGw7Ci0JCQkJfQotCSAgICAJICBicmVhazsKLQkgICAgICB9Ci0JICAgIH0KLQkJCi0JCWlmIChocmVmVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKU1BDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gbmV3IEpTUENTU0ltcG9ydFJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudChzaGVldCk7Ci0JCXJ1bGUuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKXNoZWV0LmNyZWF0ZU1lZGlhTGlzdCgpKTsKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24sIHJlZ2lvbik7Ci0KLQkJCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0SHJlZihocmVmVmFsdWUpOy8vQXR0cmlidXRlKElDU1NJbXBvcnRSdWxlLkhSRUYsIGhyZWZWYWx1ZSk7Ci0JCX0KLQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCS8vcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQoc2hlZXQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCSgoQ1NTTm9kZUltcGwpc2hlZXQpLmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCSgoQ1NTTm9kZUltcGwpc2hlZXQpLmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0JCS8vY3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCXJldHVybiBydWxlOwotCX0KLQotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0VW5rbm93blJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gY3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFpc1BhcnNlRmxvYXRpbmcoKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKU1BDU1NOb2RlSW1wbCBydWxlID0gbmV3IEpTUENTU05vZGVJbXBsKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudChwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZSk7Ci0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWlzVXBkYXRlQ29udGV4dEFjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQkvL2NyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3Y2E3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BlZENTU0RvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5KU1BlZENTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU0RvY3VtZW50TG9hZGVyIGV4dGVuZHMgQ1NTRG9jdW1lbnRMb2FkZXIgewotcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JcmV0dXJuIG5ldyBKU1BlZENTU1NvdXJjZVBhcnNlcigpOwotfQotcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSlNQZWRDU1NNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDkxNGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5KU1BlZENTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUGVkQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5DU1NNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTTW9kZWxMb2FkZXIgZXh0ZW5kcyBDU1NNb2RlbExvYWRlciB7Ci1wdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3IEpTUGVkQ1NTTW9kZWxJbXBsKCk7Ci0JcmV0dXJuIG1vZGVsOwotfQotcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTTW9kZWxMb2FkZXIoKTsKLX0KLXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0JcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUGVkQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMWMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUGVkQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JKU1BlZENTUygpewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0JCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BlZENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQZWRDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BlZENTU1NvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzljNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5KU1BlZENTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLklDU1NUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1NvdXJjZVBhcnNlciBleHRlbmRzIENTU1NvdXJjZVBhcnNlciB7Ci0KLQlwcml2YXRlIEpTUGVkQ1NTVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlU3RhcnQoU3RyaW5nIHR5cGUsIFN0cmluZyBkb2NSZWdpb25UeXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0NPTU1FTlQgfHwgdHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRElSRUNUSVZFIHx8IHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0VORCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB8fCAoZG9jUmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgfHwgKCFDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKGRvY1JlZ2lvblR5cGUpICYmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlRW5kKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfQ09NTUVOVCB8fCB0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9ESVJFQ1RJVkUgfHwgdHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRU5EIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCQotCXB1YmxpYyBJQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BlZENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQkKLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUGVkQ1NTU291cmNlUGFyc2VyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiNzVmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNzUgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40LjEgb24gMDYvMDQvMzAgMTU6NDkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5KU1BlZENTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLklDU1NUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjEKLSAqIG9uIDA2LzA0LzMwIDE1OjQ5IGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICovCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NUb2tlbml6ZXIgaW1wbGVtZW50cyBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLCBJQ1NTVG9rZW5pemVyIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gMTYzODQ7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9FWFAgPSAyMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX0RJUkVDVElWRSA9IDIxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9JTVBPUlRfREVMSU1JVEVSID0gNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFID0gMTg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0NIQVJTRVRfREVMSU1JVEVSID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT05fVkFMVUUgPSAxOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfUEFHRV9QU0VVRE9fUEFHRSA9IDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9VUkkgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EID0gMTU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9FTCA9IDIyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAxMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX0RFQ0xBUkFUSU9OID0gMjE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0RFQ0xBUkFUSU9OID0gMTY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1BBR0VfREVMSU1JVEVSID0gOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFID0gMTQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX01FRElBX01FRElVTSA9IDY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9TQ1JJUFRMRVQgPSAyMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfQ0hBUlNFVF9OQU1FID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX0NPTU1FTlQgPSAyMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSU1QT1JUX01FRElVTSA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiA9IDE3OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSID0gOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfTUVESUFfREVMSU1JVEVSID0gNzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfTU9ESUZJRVIgPSAxMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxMVwwXDFcMTFcMVwxN1wxXDBcMVw0XDFcMjBcMjJcMFwxXDZcMVw0MFwxXDEwIisKLSAgICAiXDFcMjJcMVwzM1wxXDMxXDFcMTZcMVw1XDFcMjZcMVwxMlwxXDQyXDFcMTRcMVw2MSIrCi0gICAgIlwxXDEzXDFcMTVcMVw0MVwxMlwxXDFcNjVcMVw1NFwxXDMwXDFcMzdcMVwzMlwxXDIxIisKLSAgICAiXDFcMzZcMVw0N1wxXDI3XDFcNDRcMVw2M1wxXDUyXDFcNjdcMVw2NFwxXDQ1XDFcNTUiKwotICAgICJcMlwyXDFcMjVcMVw1NlwxXDcwXDFcNjBcMVw1N1wxXDJcMVwyNFwxXDUwXDFcNTMiKwotICAgICJcMVwyM1w1XDJcMVw3MVwxXDNcMVw3M1wxXDE2XDFcMlwxXDE2XDFcNDZcMVw3IisKLSAgICAiXDFcNDNcMVw2MlwxXDUxXDFcNjZcMVw2NFwxXDQ1XDFcNTVcMlwyXDFcMjVcMVw1NiIrCi0gICAgIlwxXDcwXDFcNjBcMVw1N1wxXDJcMVwyNFwxXDUwXDFcNTNcMVwyM1w1XDJcMVwzNCIrCi0gICAgIlwxXDcyXDFcMzVcMVw3MlwxXDBcdWZmODBcMiI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDMwXDBcMVwxXDFcMlwxXDFcMVwzXDFcMlw0XDFcMVw0IisKLSAgICAiXDJcMVwxXDVcMVwxXDFcNlw0XDFcMVw3XDNcMVwxXDEwIisKLSAgICAiXDFcMVwxXDEwXDFcMTFcMVwxMlwxXDFcMVwxMlwxXDEzXDFcMTQiKwotICAgICJcMVwxNVwxXDFcMVwxNVwxXDE2XDFcMVwxXDNcMVwxN1wxXDIwIisKLSAgICAiXDFcMjFcMVwxXDFcMjFcMVwyMlwxXDFcMVwyM1wxXDI0XDNcMSIrCi0gICAgIlwxXDI0XDFcMjVcMVwxXDFcMjVcMVwyNlwxXDI3XDFcMzBcMVwzMSIrCi0gICAgIlwzXDFcMVwzMlwxXDMxXDNcMVwxXDMxXDFcMVwyXDMzXDFcMyIrCi0gICAgIlwyXDFcMVwzNFwxXDM1XDFcMzZcMVwzN1wxXDFcMVwwXDJcMiIrCi0gICAgIlwxXDQwXDFcMFwxXDQxXDJcMFwxXDQyXDJcMFwxXDQzXDZcMCIrCi0gICAgIlwxXDQ0XDNcMFwxXDQ1XDVcMFwxXDQ2XDRcMFwyXDEwXDFcMCIrCi0gICAgIlwyXDEyXDFcMFwyXDE1XDFcMTdcMVwwXDJcMjFcMVwwXDFcMjQiKwotICAgICJcMlwwXDFcMjRcMlwwXDFcMjRcMVwwXDJcMjVcMVw0N1wyXDAiKwotICAgICJcMVw1MFwxXDBcMVw1MVwxXDMxXDJcMFwxXDUyXDJcMFwyXDMxIisKLSAgICAiXDFcMzBcMVw1M1wyXDBcMVwzMVwyXDBcMVw1NFwxXDU1XDFcMCIrCi0gICAgIlwxXDU2XDFcMFwxXDJcMVw1N1wxXDQwXDFcNDFcMTBcMFwxXDQ0IisKLSAgICAiXDFcMFwxXDQ1XDJcMFwxXDQ1XDJcMFwxXDQ2XDJcMFwxXDQ2IisKLSAgICAiXDJcMFwxXDEwXDFcMTJcMVwxNVwxXDIxXDFcMjRcMVwwXDFcMjQiKwotICAgICJcMlwwXDFcMjRcMVwwXDFcMjVcMVw0N1wxXDMxXDFcMFwxXDUyIisKLSAgICAiXDJcMFwxXDUyXDFcMFwxXDUzXDFcNjBcMVwzMVwzXDBcMVwyIisKLSAgICAiXDFcNDBcMVw0MVwxXDYxXDVcMFwxXDYyXDJcMFwxXDQ0XDVcMCIrCi0gICAgIlwxXDEwXDFcMTJcMVwxNVwxXDIxXDFcMjRcMlwwXDFcMjVcMVw0NyIrCi0gICAgIlwxXDMxXDJcMFwxXDUzXDFcNjBcMVwwXDFcNTFcMVwwXDFcNjMiKwotICAgICJcMVwyXDFcNDBcMVw0MVwzXDBcMVw2NFwyXDBcMVw0NFwxXDAiKwotICAgICJcMVw0NFwxMFwwXDFcNjVcMVwxMFwxXDEyXDFcMTVcMVwyMVwxXDI0IisKLSAgICAiXDJcMFwxXDI1XDFcNDdcMVwzMVwyXDBcMVw1M1wyXDYwXDVcMCIrCi0gICAgIlwxXDY2XDFcMFwxXDJcMVw0MFwxXDQxXDJcMFwxXDY3XDJcMCIrCi0gICAgIlwxXDQ0XDZcMFwxXDY1XDJcMFwxXDEwXDFcMTJcMVwxNVwxXDIxIisKLSAgICAiXDFcMjRcMlwwXDFcMjVcMVw0N1wxXDMxXDJcMFwxXDUzXDJcNjAiKwotICAgICJcMlwwXDFcNjZcM1wwXDFcMlwxXDQwXDFcNDFcMVwwXDFcNzAiKwotICAgICJcMlwwXDFcNDRcMTNcMFwxXDEwXDFcMTJcMVwxNVwxXDIxXDFcMjQiKwotICAgICJcMlwwXDFcMjVcMVw0N1wxXDMxXDJcMFwxXDUzXDJcNjBcMTBcMCIrCi0gICAgIlwxXDQwXDFcNDFcMVw3MVwyXDBcMVw0NFw2XDBcMVw2NVwxXDAiKwotICAgICJcMVw2NVwyXDBcMVw0N1wyXDBcMVw1M1wyXDYwXDJcMFwxXDY2IisKLSAgICAiXDFcMFwxXDY2XDZcMFwxXDYwXDRcMFwxXDcyXDRcMFwxXDYwIisKLSAgICAiXDNcMFwxXDczXDEyXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0NTVdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9ST1dNQVAgPSB6elVucGFja1Jvd01hcCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPQotICAgICJcMFwwXDBcNzRcMFwxNzBcMFwyNjRcMFwzNjBcMFx1MDEyY1wwXHUwMTY4XDBcdTAxYTQiKwotICAgICJcMFx1MDFlMFwwXHUwMjFjXDBcdTAyNThcMFx1MDI5NFwwXHUwMmQwXDBcdTAzMGNcMFx1MDM0OFwwXHUwMzg0IisKLSAgICAiXDBcdTAzYzBcMFx1MDNmY1wwXHUwNDM4XDBcdTA0NzRcMFx1MDRiMFwwXHUwNGVjXDBcdTA1MjhcMFx1MDU2NCIrCi0gICAgIlwwXHUwNWEwXDBcdTA1ZGNcMFx1MDYxOFwwXHUwNjU0XDBcdTA2OTBcMFx1MDZjY1wwXHUwNzA4XDBcdTA3NDQiKwotICAgICJcMFx1MDc4MFwwXHUwNWEwXDBcdTA3YmNcMFx1MDdmOFwwXHUwNWEwXDBcdTA4MzRcMFx1MDVhMFwwXHUwODcwIisKLSAgICAiXDBcdTA4YWNcMFx1MDhlOFwwXHUwOTI0XDBcdTA1YTBcMFx1MDk2MFwwXHUwOTljXDBcdTA5ZDhcMFx1MGExNCIrCi0gICAgIlwwXHUwYTUwXDBcdTBhOGNcMFx1MDVhMFwwXHUwYWM4XDBcdTBiMDRcMFx1MGI0MFwwXHUwNWEwXDBcdTA1YTAiKwotICAgICJcMFx1MGI3Y1wwXHUwYmI4XDBcdTBiZjRcMFx1MDVhMFwwXHUwYzMwXDBcdTBjNmNcMFx1MDVhMFwwXHUwNWEwIisKLSAgICAiXDBcdTBjYThcMFx1MGNlNFwwXHUwZDIwXDBcdTA1YTBcMFx1MGQ1Y1wwXHUwNWEwXDBcdTBkOThcMFx1MGRkNCIrCi0gICAgIlwwXHUwZTEwXDBcdTBlNGNcMFx1MGU4OFwwXHUwZWM0XDBcdTBmMDBcMFx1MGYzY1wwXHUwNWEwXDBcdTA1YTAiKwotICAgICJcMFx1MGY3OFwwXHUwZmI0XDBcdTBmZjBcMFx1MTAyY1wwXHUxMDY4XDBcdTA1YTBcMFx1MTBhNFwwXHUxMGUwIisKLSAgICAiXDBcdTExMWNcMFx1MTE1OFwwXHUxMTk0XDBcdTExZDBcMFx1MDdmOFwwXHUwNWEwXDBcdTEyMGNcMFx1MTI0OCIrCi0gICAgIlwwXHUxMjg0XDBcdTA3YmNcMFx1MDVhMFwwXHUwNWEwXDBcdTA1YTBcMFx1MTJjMFwwXHUwNjE4XDBcdTEyZmMiKwotICAgICJcMFx1MTMzOFwwXHUwNmNjXDBcdTEzNzRcMFx1MDcwOFwwXHUxM2IwXDBcdTEzZWNcMFx1MTQyOFwwXHUxNDY0IisKLSAgICAiXDBcdTA3ODBcMFx1MDVhMFwwXHUxNGEwXDBcdTE0ZGNcMFx1MTUxOFwwXHUxNTU0XDBcdTE1OTBcMFx1MTVjYyIrCi0gICAgIlwwXHUxNjA4XDBcdTE2NDRcMFx1MDg3MFwwXHUxNjgwXDBcdTA1YTBcMFx1MDhhY1wwXHUxNmJjXDBcdTE2ZjgiKwotICAgICJcMFx1MDk2MFwwXHUxNzM0XDBcdTA1YTBcMFx1MDk5Y1wwXHUxNzcwXDBcdTE3YWNcMFx1MGE1MFwwXHUxN2U4IisKLSAgICAiXDBcdTE4MjRcMFx1MGIwNFwwXHUxODYwXDBcdTE4OWNcMFx1MGJiOFwwXHUxOGQ4XDBcdTE5MTRcMFx1MDVhMCIrCi0gICAgIlwwXHUwY2U0XDBcdTE5NTBcMFx1MTk4Y1wwXHUwZGQ0XDBcdTE5YzhcMFx1MGUxMFwwXHUxYTA0XDBcdTA1YTAiKwotICAgICJcMFx1MGU0Y1wwXHUxYTQwXDBcdTFhN2NcMFx1MGYwMFwwXHUxYWI4XDBcdTFhZjRcMFx1MWIzMFwwXHUxYjZjIisKLSAgICAiXDBcdTExMWNcMFx1MDVhMFwwXHUwZmYwXDBcdTA1YTBcMFx1MWJhOFwwXHUxMDJjXDBcdTFiZTRcMFx1MDVhMCIrCi0gICAgIlwwXHUxMDY4XDBcdTFjMjBcMFx1MWM1Y1wwXHUxYzk4XDBcdTFjZDRcMFx1MTE1OFwwXHUxZDEwXDBcdTFkNGMiKwotICAgICJcMFx1MWQ4OFwwXHUxMWQwXDBcdTFkYzRcMFx1MDVhMFwwXHUxNmY4XDBcdTEyODRcMFx1MDVhMFwwXHUxZTAwIisKLSAgICAiXDBcdTFlM2NcMFx1MDVhMFwwXHUxZTc4XDBcdTFlYjRcMFx1MWVmMFwwXHUxZjJjXDBcdTFmNjhcMFx1MWZhNCIrCi0gICAgIlwwXHUxZmUwXDBcdTIwMWNcMFx1MjA1OFwwXHUyMDk0XDBcdTIwZDBcMFx1MjEwY1wwXHUwODcwXDBcdTIxNDgiKwotICAgICJcMFx1MjE4NFwwXHUwOGFjXDBcdTIxYzBcMFx1MjFmY1wwXHUwOTYwXDBcdTIyMzhcMFx1MjI3NFwwXHUwOTljIisKLSAgICAiXDBcdTIyYjBcMFx1MjJlY1wwXHUyMzI4XDBcdTIzNjRcMFx1MjNhMFwwXHUyM2RjXDBcdTI0MThcMFx1MjQ1NCIrCi0gICAgIlwwXHUwZTEwXDBcdTI0OTBcMFx1MjRjY1wwXHUwZTRjXDBcdTI1MDhcMFx1MjU0NFwwXHUyNTgwXDBcdTI1YmMiKwotICAgICJcMFx1MjVmOFwwXHUxMDJjXDBcdTI2MzRcMFx1MjY3MFwwXHUxMDY4XDBcdTI2YWNcMFx1MjZlOFwwXHUyNzI0IisKLSAgICAiXDBcdTI3NjBcMFx1Mjc5Y1wwXHUyN2Q4XDBcdTI4MTRcMFx1Mjg1MFwwXHUyODhjXDBcdTI4YzhcMFx1MDVhMCIrCi0gICAgIlwwXHUyOTA0XDBcdTI5NDBcMFx1Mjk3Y1wwXHUyOWI4XDBcdTI5ZjRcMFx1MDVhMFwwXHUyYTMwXDBcdTJhNmMiKwotICAgICJcMFx1MmFhOFwwXHUyYWU0XDBcdTJiMjBcMFx1MmI1Y1wwXHUyYjk4XDBcdTJiZDRcMFx1MmMxMFwwXHUyYzRjIisKLSAgICAiXDBcdTJjODhcMFx1MmNjNFwwXHUyZDAwXDBcdTJkM2NcMFx1MmQ3OFwwXHUyZGI0XDBcdTJkZjBcMFx1MmUyYyIrCi0gICAgIlwwXHUyZTY4XDBcdTJlYTRcMFx1MmVlMFwwXHUyZjFjXDBcdTJmNThcMFx1MmY5NFwwXHUyZmQwXDBcdTA1YTAiKwotICAgICJcMFx1MzAwY1wwXHUzMDQ4XDBcdTMwODRcMFx1MzBjMFwwXHUzMGZjXDBcdTMxMzhcMFx1MDVhMFwwXHUzMTc0IisKLSAgICAiXDBcdTMxYjBcMFx1MDVhMFwwXHUzMWVjXDBcdTMyMjhcMFx1MzI2NFwwXHUzMmEwXDBcdTMyZGNcMFx1MzMxOCIrCi0gICAgIlwwXHUzMzU0XDBcdTMzOTBcMFx1MzNjY1wwXHUzNDA4XDBcdTA1YTBcMFx1MzQ0NFwwXHUzNDgwXDBcdTM0YmMiKwotICAgICJcMFx1MzRmOFwwXHUzNTM0XDBcdTM1NzBcMFx1MzVhY1wwXHUzNWU4XDBcdTM2MjRcMFx1MzY2MFwwXHUzNjljIisKLSAgICAiXDBcdTM2ZDhcMFx1MzcxNFwwXHUzNzUwXDBcdTM3OGNcMFx1MzdjOFwwXHUzODA0XDBcdTJmOTRcMFx1Mzg0MCIrCi0gICAgIlwwXHUzODdjXDBcdTA1YTBcMFx1MzhiOFwwXHUzOGY0XDBcdTM5MzBcMFx1Mzk2Y1wwXHUzOWE4XDBcdTM5ZTQiKwotICAgICJcMFx1MDVhMFwwXHUzYTIwXDBcdTNhNWNcMFx1M2E5OFwwXHUzYWQ0XDBcdTNiMTBcMFx1M2I0Y1wwXHUzYjg4IisKLSAgICAiXDBcdTNiYzRcMFx1M2MwMFwwXHUzMzU0XDBcdTNjM2NcMFx1M2M3OFwwXHUzY2I0XDBcdTNjZjBcMFx1M2QyYyIrCi0gICAgIlwwXHUzZDY4XDBcdTNkYTRcMFx1M2RlMFwwXHUzZTFjXDBcdTNlNThcMFx1M2U5NFwwXHUzZWQwXDBcdTNmMGMiKwotICAgICJcMFx1M2Y0OFwwXHUzZjg0XDBcdTNmYzBcMFx1M2ZmY1wwXHU0MDM4XDBcdTQwNzRcMFx1MzdjOFwwXHU0MGIwIisKLSAgICAiXDBcdTQwZWNcMFx1NDEyOFwwXHU0MTY0XDBcdTQxYTBcMFx1NDFkY1wwXHU0MjE4XDBcdTA1YTBcMFx1NDI1NCIrCi0gICAgIlwwXHU0MjkwXDBcdTQyY2NcMFx1NDMwOFwwXHU0MzQ0XDBcdTQzODBcMFx1NDNiY1wwXHU0M2Y4XDBcdTQ0MzQiKwotICAgICJcMFx1NDQ3MFwwXHU0NGFjXDBcdTQ0ZThcMFx1NDUyNFwwXHU0NTYwXDBcdTQ1OWNcMFx1NDVkOFwwXHU0NjE0IisKLSAgICAiXDBcdTQ2NTBcMFx1NDY4Y1wwXHU0NmM4XDBcdTQ3MDRcMFx1NDc0MFwwXHU0NzdjXDBcdTQ3YjhcMFx1NDdmNCIrCi0gICAgIlwwXHU0ODMwXDBcdTQ4NmNcMFx1NDhhOFwwXHU0OGU0XDBcdTQ5MjBcMFx1NDk1Y1wwXHU0OTk4XDBcdTQ5ZDQiKwotICAgICJcMFx1NGExMFwwXHU0YTRjXDBcdTRhODhcMFx1NGFjNFwwXHU0YjAwXDBcdTRiM2NcMFx1MDVhMFwwXHU0Yjc4IisKLSAgICAiXDBcdTRiYjRcMFx1NGJmMFwwXHU0YzJjXDBcdTRjNjhcMFx1NGNhNFwwXHU0Y2UwXDBcdTRkMWNcMFx1NGQ1OCIrCi0gICAgIlwwXHUzM2NjXDBcdTRkOTRcMFx1MzQwOFwwXHU0ZGQwXDBcdTRlMGNcMFx1NGU0OFwwXHU0ZTg0XDBcdTRlYzAiKwotICAgICJcMFx1NGVmY1wwXHU0ZjM4XDBcdTRmNzRcMFx1NGZiMFwwXHU0ZmVjXDBcdTM4NDBcMFx1NTAyOFwwXHUzODdjIisKLSAgICAiXDBcdTUwNjRcMFx1NTBhMFwwXHU1MGRjXDBcdTUxMThcMFx1NTE1NFwwXHU1MTkwXDBcdTUxY2NcMFx1NTIwOCIrCi0gICAgIlwwXHU1MjQ0XDBcdTUyODBcMFx1NTJiY1wwXHUwNWEwXDBcdTUyZjhcMFx1NTMzNFwwXHU1MzcwXDBcdTUzYWMiKwotICAgICJcMFx1MDVhMFwwXHU1M2U4XDBcdTU0MjRcMFx1NTQ2MFwwXHUwNWEwXDBcdTU0OWNcMFx1NTRkOFwwXHU1NTE0IisKLSAgICAiXDBcdTU1NTBcMFx1NTU4Y1wwXHU1NWM4XDBcdTU2MDRcMFx1NTY0MFwwXHU1NjdjXDBcdTU2YjgiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0NTVdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrUm93TWFwKFpaX1JPV01BUF9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tSb3dNYXAoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGhpZ2ggPSBwYWNrZWQuY2hhckF0KGkrKykgPDwgMTY7Ci0gICAgICByZXN1bHRbaisrXSA9IGhpZ2ggfCBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfVFJBTlMgPSB6elVucGFja1RyYW5zKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1RSQU5TX1BBQ0tFRF8wID0KLSAgICAiXDJcMzFcMVwzMlwxXDMzXDFcMzRcMVwzMVwxXDM0XDFcMzJcMVwzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNVwxXDMxXDFcMzZcMVwzMVwyXDM0XDFcMzEiKwotICAgICJcMVwzN1wzXDMyXDFcMzFcMVwzMlwxXDQwXDJcMzFcMVw0MVwxXDMxIisKLSAgICAiXDFcNDJcMVw0M1wyXDMxXDFcNDRcMVw0NVwxMVwzMlwxXDMxXDRcMzIiKwotICAgICJcMVwzMVwzXDMyXDFcNDZcM1wzMlwxXDQ3XDZcMzFcMVwzNFwxXDUwIisKLSAgICAiXDFcMzRcMVwzMVwxXDUxXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNCIrCi0gICAgIlw3XDMxXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDM2XDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcNTJcM1wzMSIrCi0gICAgIlwyXDM0XDdcMzFcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDQiKwotICAgICJcMTJcMzFcMVw1NFwyM1wzMVwxXDM0XDFcNTVcMVwzNFwxXDMxXDFcNTYiKwotICAgICJcMVwzNFwxXDMxXDFcNTJcM1wzMVwyXDM0XDJcMzFcMVw1N1w0XDMxIisKLSAgICAiXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDEyXDMxXDFcNTQiKwotICAgICJcMjFcMzFcMVw2MFwxXDYxXDFcMzRcMVwzMVwxXDM0XDFcNjBcMVwzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVw2MlwzXDMxXDJcMzRcMlwzMVwzXDYwXDFcMzEiKwotICAgICJcMVw2MFwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwxXDMxIisKLSAgICAiXDExXDYwXDFcNTRcNFw2MFwxXDMxXDNcNjBcMVwzMVwzXDYwXDdcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxIisKLSAgICAiXDJcMzRcN1wzMVwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NCIrCi0gICAgIlwxMlwzMVwxXDU0XDRcMzFcMVw2M1wxNFwzMVwxXDY0XDFcNjVcMVwzNCIrCi0gICAgIlwxXDMxXDFcMzRcMVw2NFwxXDMxXDFcMzRcMVwzMVwxXDY2XDNcMzEiKwotICAgICJcMlwzNFwyXDMxXDNcNjRcMVwzMVwxXDY0XDFcNTNcNFwzMVwxXDQyIisKLSAgICAiXDFcNDNcMlwzMVwxXDQ0XDFcMzFcMTFcNjRcMVwzMVw0XDY0XDFcMzEiKwotICAgICJcM1w2NFwxXDMxXDNcNjRcN1wzMVwxXDM0XDFcMzFcMVwzNFwyXDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNFw3XDMxXDFcNTNcM1wzMSIrCi0gICAgIlwxXDY3XDFcNDJcMVw0M1wyXDMxXDFcNDRcMTdcMzFcMVw3MFwxNFwzMSIrCi0gICAgIlwxXDcxXDFcNzJcMVwzNFwxXDMxXDFcMzRcMVw3MVwxXDMxXDFcMzQiKwotICAgICJcMVwzMVwxXDczXDNcMzFcMlwzNFwyXDMxXDNcNzFcMVwzMVwxXDcxIisKLSAgICAiXDFcNTNcM1wzMVwxXDc0XDFcNDJcMVw0M1wyXDMxXDFcNDRcMVwzMSIrCi0gICAgIlwxMVw3MVwxXDMxXDRcNzFcMVwzMVwzXDcxXDFcNzVcM1w3MVw3XDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcNTJcM1wzMSIrCi0gICAgIlwyXDM0XDdcMzFcMVw1M1wzXDMxXDFcNzRcMVw0MlwxXDQzXDJcMzEiKwotICAgICJcMVw0NFwzNFwzMVwxXDMyXDFcMzNcMVwzNFwxXDMxXDFcMzRcMVwzMiIrCi0gICAgIlwxXDMxXDFcMzRcMVwzMVwxXDM1XDFcMzFcMVwzNlwxXDMxXDJcMzQiKwotICAgICJcMVwzMVwxXDM3XDNcMzJcMVwzMVwxXDMyXDFcNTNcNFwzMVwxXDQyIisKLSAgICAiXDFcNDNcMlwzMVwxXDQ0XDFcNDVcMTFcMzJcMVwzMVw0XDMyXDFcMzEiKwotICAgICJcM1wzMlwxXDQ2XDNcMzJcMVw0N1w2XDMxXDFcNzZcMVwzMVwxXDc2IisKLSAgICAiXDJcMzFcMVw3NlwxXDMxXDFcNTJcMVw3N1wxXDM2XDFcMzFcMlw3NiIrCi0gICAgIlwxXDMxXDFcMzdcNVwzMVwxXDUzXDFcMzFcMVw3N1wxXDMxXDFcNzQiKwotICAgICJcMVw0MlwxXDQzXDJcMzFcMVw0NFwxXDQ1XDE2XDMxXDFcMTAwXDNcMzEiKwotICAgICJcMVw0NlwzXDMxXDFcNDdcNFwzMVwxXDEwMVwxXDEwMlwxXDM0XDFcMzEiKwotICAgICJcMVwzNFwxXDEwMVwxXDMxXDFcMzRcMVwzMVwxXDEwM1wzXDMxXDJcMzQiKwotICAgICJcMlwzMVwzXDEwMVwxXDMxXDFcMTAxXDFcNTNcNFwzMVwxXDQyXDFcNDMiKwotICAgICJcMlwzMVwxXDQ0XDFcMzFcMTFcMTAxXDFcMzFcNFwxMDFcMVwzMVwzXDEwMSIrCi0gICAgIlwxXDMxXDNcMTAxXDdcMzFcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0IisKLSAgICAiXDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDUzXDRcMzFcMVw0MiIrCi0gICAgIlwxXDQzXDFcMTA0XDFcMzFcMVw0NFwzMFwzMVwxXDEwNVwxXDEwNlwyXDMxIisKLSAgICAiXDFcMTA3XDFcMTEwXDFcMzRcMVwxMTFcMVwzNFwxXDEwN1wxXDExMlwxXDM0IisKLSAgICAiXDFcMzFcMVwxMTNcM1wzMVwyXDM0XDJcMzFcM1wxMDdcMVwzMVwxXDEwNyIrCi0gICAgIlwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwxXDMxXDExXDEwNyIrCi0gICAgIlwxXDMxXDRcMTA3XDFcMzFcM1wxMDdcMVwzMVwzXDEwN1w3XDMxXDFcMzQiKwotICAgICJcMVwzMVwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcNTJcM1wzMVwyXDM0IisKLSAgICAiXDdcMzFcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMzFcMzEiKwotICAgICJcMVwxMDZcMlwzMVwxXDExNFwxXDExNVwxXDM0XDFcMzFcMVwzNFwxXDExNCIrCi0gICAgIlwxXDMxXDFcMzRcMVwzMVwxXDExNlwzXDMxXDJcMzRcMlwzMVwzXDExNCIrCi0gICAgIlwxXDMxXDFcMTE0XDFcNDBcMlwzMVwxXDQxXDFcMzFcMVw0MlwxXDQzIisKLSAgICAiXDJcMzFcMVw0NFwxXDMxXDExXDExNFwxXDExN1w0XDExNFwxXDMxXDNcMTE0IisKLSAgICAiXDFcMzFcM1wxMTRcN1wzMVwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzQiKwotICAgICJcMVwzMVwxXDUyXDNcMzFcMlwzNFw3XDMxXDFcNDBcMlwzMVwxXDQxIisKLSAgICAiXDFcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwxMlwzMVwxXDExN1wxMFwzMSIrCi0gICAgIlwxXDEyMFw3XDMxXDFcMTIxXDFcMTIyXDFcMTIzXDFcMzRcMVwxMjRcMVwzNCIrCi0gICAgIlwxXDEyMlwxXDEyNVwxXDM0XDFcMTI2XDFcMTI3XDFcMTMwXDFcMTMxXDFcMzEiKwotICAgICJcMlwzNFwxXDMxXDFcMTMyXDFcMTMzXDJcMTIyXDFcMzFcMVwxMjJcMVw0MCIrCi0gICAgIlwyXDMxXDFcNDFcMVwzMVwxXDQyXDFcNDNcMVwzMVwxXDEzNFwxXDEzNSIrCi0gICAgIlwxXDMxXDExXDEyMlwxXDExN1w0XDEyMlwxXDEzNlwzXDEyMlwxXDMxXDNcMTIyIisKLSAgICAiXDRcMzFcMVwxMjFcMVwxMjJcMVwxMjNcMVwxMzdcMVwxMjRcMVwxMzdcMVwxMjIiKwotICAgICJcMVwxMjVcMVwxMzdcMVwxMjZcMVwxMjdcMVwxMzBcMVwxMzFcMVwzMVwyXDEzNyIrCi0gICAgIlwxXDMxXDFcMTMyXDFcMTMzXDJcMTIyXDFcMzFcMVwxMjJcMVw0MFwyXDMxIisKLSAgICAiXDFcNDFcMVwzMVwxXDQyXDFcNDNcMVwzMVwxXDEzNFwxXDEzNVwxXDMxIisKLSAgICAiXDExXDEyMlwxXDExN1w0XDEyMlwxXDEzNlwzXDEyMlwxXDMxXDNcMTIyXDdcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVwxNDBcM1wzMSIrCi0gICAgIlwyXDM0XDdcMzFcMVw1M1wxXDE0MVwzXDMxXDFcNDJcMVwxNDJcMVwxNDMiKwotICAgICJcMVwxNDRcMVw0NFwzNlwzMVwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzQiKwotICAgICJcMVwzMVwxXDUyXDNcMzFcMlwzNFw3XDMxXDFcNTNcMVwxNDFcM1wzMSIrCi0gICAgIlwxXDQyXDFcNDNcMlwzMVwxXDQ0XDM2XDMxXDFcMzRcMVwzMVwxXDM0IisKLSAgICAiXDJcMzFcMVwzNFwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw1MyIrCi0gICAgIlw0XDMxXDFcMTQ1XDFcNDNcMlwzMVwxXDQ0XDM2XDMxXDFcMzRcMVwzMSIrCi0gICAgIlwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcMTQ2XDNcMzFcMlwzNFw3XDMxIisKLSAgICAiXDFcNTNcNVwzMVwxXDQzXDJcMzFcMVw0NFwzMlwzMVw3NVwwXDJcMzIiKwotICAgICJcMVwxNDdcM1wwXDFcMzJcM1wwXDFcMzJcN1wwXDNcMzJcMVwwIisKLSAgICAiXDFcMzJcMTNcMFwxMVwzMlwxXDBcNFwzMlwxXDBcM1wzMlwxXDAiKwotICAgICJcM1wzMlw0XDBcMVwxNTBcMlwzMlwxXDBcMlwzMlwxXDE1MFwxXDMyIisKLSAgICAiXDFcMFw1XDMyXDJcMFwyMlwzMlwxXDE1MFwyXDMyXDFcMTUwXDJcMzIiKwotICAgICJcMVwxNTBcMTBcMzJcMVwxNTBcM1wzMlwxXDE1MFw1XDMyXDRcMFwxXDM0IisKLSAgICAiXDFcMFwxXDM0XDJcMFwxXDM0XDVcMFwyXDM0XDU0XDBcMlwzMiIrCi0gICAgIlwxXDE0N1wzXDBcMVwzMlwzXDBcMVwxNTFcN1wwXDNcMzJcMVwwIisKLSAgICAiXDFcMzJcMTNcMFwxMVwzMlwxXDBcNFwzMlwxXDBcM1wzMlwxXDAiKwotICAgICJcM1wzMlw0XDBcMlwxNTJcMVwxNTNcM1wwXDFcMTUyXDNcMFwxXDE1MiIrCi0gICAgIlw3XDBcM1wxNTJcMVwwXDFcMTUyXDEzXDBcMTFcMTUyXDFcMFw0XDE1MiIrCi0gICAgIlwxXDBcM1wxNTJcMVwwXDNcMTUyXDRcMFwyXDE1NFwxXDE1NVwzXDAiKwotICAgICJcMVwxNTRcM1wwXDFcMTU0XDdcMFwzXDE1NFwxXDBcMVwxNTRcMTNcMCIrCi0gICAgIlwxMVwxNTRcMVwwXDRcMTU0XDFcMFwzXDE1NFwxXDBcM1wxNTRcMTFcMCIrCi0gICAgIlwxXDE1NlwyXDBcMVwxNTZcNVwwXDJcMTU2XDEwXDBcMVwxNTdcNlwwIisKLSAgICAiXDFcMTYwXDQxXDBcMVwxNjFcMlwwXDFcMTYxXDVcMFwyXDE2MVwxM1wwIisKLSAgICAiXDFcMTYyXDEwMlwwXDJcMTYzXDEwXDBcMVwxNjRcMVwxNjVcMVwxNjZcNlwwIisKLSAgICAiXDJcMTY3XDQ2XDBcMVwxNzBcMzNcMFwxXDE3MVwxXDE3MlwzXDBcMVwxNzEiKwotICAgICJcM1wwXDFcMTcxXDdcMFwzXDE3MVwxXDBcMVwxNzFcMTNcMFwxMVwxNzEiKwotICAgICJcMVwwXDRcMTcxXDFcMFwzXDE3MVwxXDBcM1wxNzFcNFwwXDJcMTczIisKLSAgICAiXDFcMTc0XDFcMFwxXDE3NVwxMVwxNzNcMlwwXDUzXDE3M1wxXDBcMlwxNzYiKwotICAgICJcMVwxNzdcMVwwXDNcMTc2XDFcMTc1XDZcMTc2XDJcMFw1M1wxNzZcMTNcMCIrCi0gICAgIlwxXDIwMFwxMjBcMFwxXDE2MFwzNFwwXDJcMjAxXDFcMjAyXDFcMFwxXDIwMyIrCi0gICAgIlwxMVwyMDFcMlwwXDUzXDIwMVwxXDBcMlwyMDRcMVwyMDVcMVwwXDNcMjA0IisKLSAgICAiXDFcMjAzXDZcMjA0XDJcMFw1M1wyMDRcMjRcMFwxXDIwNlw1MFwwXDJcNjAiKwotICAgICJcMVwyMDdcM1wwXDFcNjBcM1wwXDFcNjBcN1wwXDNcNjBcMVwwIisKLSAgICAiXDFcNjBcMTNcMFwxMVw2MFwxXDBcNFw2MFwxXDBcM1w2MFwxXDAiKwotICAgICJcM1w2MFw0XDBcMVwyMTBcMlw2MFwxXDBcMlw2MFwxXDIxMFwxXDYwIisKLSAgICAiXDFcMFw1XDYwXDJcMFwyMlw2MFwxXDIxMFwyXDYwXDFcMjEwXDJcNjAiKwotICAgICJcMVwyMTBcMTBcNjBcMVwyMTBcM1w2MFwxXDIxMFw1XDYwXDFcMFwyXDYwIisKLSAgICAiXDFcMjA3XDNcMFwxXDYwXDNcMFwxXDIxMVw3XDBcM1w2MFwxXDAiKwotICAgICJcMVw2MFwxM1wwXDExXDYwXDFcMFw0XDYwXDFcMFwzXDYwXDFcMCIrCi0gICAgIlwzXDYwXDRcMFwyXDY0XDFcMjEyXDNcMFwxXDY0XDNcMFwxXDY0IisKLSAgICAiXDdcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMTFcNjRcMVwwXDRcNjQiKwotICAgICJcMVwwXDNcNjRcMVwwXDNcNjRcNFwwXDFcMjEzXDJcNjRcMVwwIisKLSAgICAiXDJcNjRcMVwyMTNcMVw2NFwxXDBcNVw2NFwyXDBcMjJcNjRcMVwyMTMiKwotICAgICJcMlw2NFwxXDIxM1wyXDY0XDFcMjEzXDEwXDY0XDFcMjEzXDNcNjRcMVwyMTMiKwotICAgICJcNVw2NFwxXDBcMlw2NFwxXDIxMlwzXDBcMVw2NFwzXDBcMVwyMTQiKwotICAgICJcN1wwXDNcNjRcMVwwXDFcNjRcMTNcMFwxMVw2NFwxXDBcNFw2NCIrCi0gICAgIlwxXDBcM1w2NFwxXDBcM1w2NFw0XDBcMlw3MVwxXDIxNVwzXDAiKwotICAgICJcMVw3MVwzXDBcMVw3MVw3XDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDExXDcxXDFcMFw0XDcxXDFcMFwzXDcxXDFcMFwzXDcxXDRcMCIrCi0gICAgIlwxXDIxNlwyXDcxXDFcMFwyXDcxXDFcMjE2XDFcNzFcMVwwXDVcNzEiKwotICAgICJcMlwwXDIyXDcxXDFcMjE2XDJcNzFcMVwyMTZcMlw3MVwxXDIxNlwxMFw3MSIrCi0gICAgIlwxXDIxNlwzXDcxXDFcMjE2XDVcNzFcMVwwXDJcNzFcMVwyMTVcM1wwIisKLSAgICAiXDFcNzFcM1wwXDFcMjE3XDdcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMTFcNzFcMVwwXDRcNzFcMVwwXDNcNzFcMVwwXDNcNzFcNVwwIisKLSAgICAiXDFcNzFcMVwyMTVcM1wwXDFcNzFcM1wwXDFcNzFcN1wwXDNcNzEiKwotICAgICJcMVwwXDFcNzFcMTNcMFwxMVw3MVwxXDBcNFw3MVwxXDBcM1w3MSIrCi0gICAgIlwxXDBcM1w3MVwzXDBcNFwyMjBcMVw3NlwxXDIyMFwxXDc2XDJcMjIwIisKLSAgICAiXDFcNzZcMlwyMjBcMVwwXDJcMjIwXDJcNzZcMTFcMjIwXDFcMFwxXDIyMCIrCi0gICAgIlwxXDBcMzdcMjIwXDFcMFwyXDEwMVwxXDIyMVwzXDBcMVwxMDFcM1wwIisKLSAgICAiXDFcMTAxXDdcMFwzXDEwMVwxXDBcMVwxMDFcMTNcMFwxMVwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwzXDEwMVwxXDBcM1wxMDFcNFwwXDFcMjIyXDJcMTAxIisKLSAgICAiXDFcMFwyXDEwMVwxXDIyMlwxXDEwMVwxXDBcNVwxMDFcMlwwXDIyXDEwMSIrCi0gICAgIlwxXDIyMlwyXDEwMVwxXDIyMlwyXDEwMVwxXDIyMlwxMFwxMDFcMVwyMjJcM1wxMDEiKwotICAgICJcMVwyMjJcNVwxMDFcMVwwXDJcMTAxXDFcMjIxXDNcMFwxXDEwMVwzXDAiKwotICAgICJcMVwyMjNcN1wwXDNcMTAxXDFcMFwxXDEwMVwxM1wwXDExXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDNcMTAxXDFcMFwzXDEwMVw0MlwwXDFcMTA0XDM1XDAiKwotICAgICJcMlwxMDdcMVwyMjRcM1wwXDFcMTA3XDNcMFwxXDEwN1w3XDBcM1wxMDciKwotICAgICJcMVwwXDFcMTA3XDEzXDBcMTFcMTA3XDFcMFw0XDEwN1wxXDBcM1wxMDciKwotICAgICJcMVwwXDNcMTA3XDRcMFwxXDIyNVwyXDEwN1wxXDBcMlwxMDdcMVwyMjUiKwotICAgICJcMVwxMDdcMVwwXDVcMTA3XDJcMFwyMlwxMDdcMVwyMjVcMlwxMDdcMVwyMjUiKwotICAgICJcMlwxMDdcMVwyMjVcMTBcMTA3XDFcMjI1XDNcMTA3XDFcMjI1XDVcMTA3XDFcMCIrCi0gICAgIlwyXDIyNlwxXDIyN1wxXDBcMVwyMzBcMTFcMjI2XDJcMFw1M1wyMjZcMVwwIisKLSAgICAiXDJcMjMxXDFcMjMyXDFcMFwzXDIzMVwxXDIzMFw2XDIzMVwyXDBcNTNcMjMxIisKLSAgICAiXDFcMFwyXDEwN1wxXDIyNFwzXDBcMVwxMDdcM1wwXDFcMjMzXDdcMCIrCi0gICAgIlwzXDEwN1wxXDBcMVwxMDdcMTNcMFwxMVwxMDdcMVwwXDRcMTA3XDFcMCIrCi0gICAgIlwzXDEwN1wxXDBcM1wxMDdcNFwwXDJcMTE0XDFcMjM0XDNcMFwxXDExNCIrCi0gICAgIlwzXDBcMVwxMTRcN1wwXDNcMTE0XDFcMFwxXDExNFwxM1wwXDExXDExNCIrCi0gICAgIlwxXDBcNFwxMTRcMVwwXDNcMTE0XDFcMFwzXDExNFw0XDBcMVwyMzUiKwotICAgICJcMlwxMTRcMVwwXDJcMTE0XDFcMjM1XDFcMTE0XDFcMFw1XDExNFwyXDAiKwotICAgICJcMjJcMTE0XDFcMjM1XDJcMTE0XDFcMjM1XDJcMTE0XDFcMjM1XDEwXDExNFwxXDIzNSIrCi0gICAgIlwzXDExNFwxXDIzNVw1XDExNFwxXDBcMlwxMTRcMVwyMzRcM1wwXDFcMTE0IisKLSAgICAiXDNcMFwxXDIzNlw3XDBcM1wxMTRcMVwwXDFcMTE0XDEzXDBcMTFcMTE0IisKLSAgICAiXDFcMFw0XDExNFwxXDBcM1wxMTRcMVwwXDNcMTE0XDRcMFwxXDEyMSIrCi0gICAgIlwxXDIzN1wxXDI0MFwzXDBcMVwyMzdcM1wwXDFcMjM3XDFcMFwxXDI0MSIrCi0gICAgIlw1XDBcM1wyMzdcMVwwXDFcMjM3XDFcMFwxXDI0MlwxMVwwXDExXDIzNyIrCi0gICAgIlwxXDBcNFwyMzdcMVwwXDNcMjM3XDFcMFwzXDIzN1w0XDBcMlwxMjIiKwotICAgICJcMVwyNDNcM1wwXDFcMTIyXDNcMFwxXDEyMlw3XDBcM1wxMjJcMVwyNDQiKwotICAgICJcMVwxMjJcMTNcMFwxMVwxMjJcMVwwXDRcMTIyXDFcMFwzXDEyMlwxXDAiKwotICAgICJcM1wxMjJcNFwwXDFcMjQ1XDJcMTIyXDFcMFwyXDEyMlwxXDI0NVwxXDEyMiIrCi0gICAgIlwxXDBcNVwxMjJcMlwwXDIyXDEyMlwxXDI0NVwyXDEyMlwxXDI0NVwyXDEyMiIrCi0gICAgIlwxXDI0NVwxMFwxMjJcMVwyNDVcM1wxMjJcMVwyNDVcNVwxMjJcMVwwXDJcMjQ2IisKLSAgICAiXDFcMjQ3XDFcMFwxXDI1MFwxMVwyNDZcMlwwXDUzXDI0NlwxXDBcMlwyNTEiKwotICAgICJcMVwyNTJcMVwwXDNcMjUxXDFcMjUwXDZcMjUxXDJcMFw1M1wyNTFcMVwwIisKLSAgICAiXDFcMjUzXDFcMTIyXDFcMjQzXDNcMFwxXDEyMlwzXDBcMVwyNTRcMVwwIisKLSAgICAiXDFcMjQxXDVcMFwzXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDExXDEyMlwxXDAiKwotICAgICJcNFwxMjJcMVwwXDNcMTIyXDFcMFwzXDEyMlw0XDBcMVwxMjFcMTNcMCIrCi0gICAgIlwxXDI0MVw1N1wwXDFcMjU1XDczXDBcMlwyNTZcMVwyNTdcM1wwXDFcMjU2IisKLSAgICAiXDNcMFwxXDI1Nlw3XDBcM1wyNTZcMVwwXDFcMjU2XDEzXDBcMTFcMjU2IisKLSAgICAiXDFcMFw0XDI1NlwxXDBcM1wyNTZcMVwwXDNcMjU2XDRcMFwyXDEyMiIrCi0gICAgIlwxXDI0M1wzXDBcMVwxMjJcM1wwXDFcMTIyXDFcMjYwXDZcMFwxXDEyMiIrCi0gICAgIlwxXDI2MVwxXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDExXDEyMlwxXDBcNFwxMjIiKwotICAgICJcMVwwXDNcMTIyXDFcMFwzXDEyMlw3XDBcMVwyNjJcMVwwXDFcMjYyIisKLSAgICAiXDJcMFwxXDI2Mlw1XDBcMlwyNjJcMzRcMFwxXDI2M1wxNlwwXDRcMjY0IisKLSAgICAiXDFcMTM3XDFcMjY0XDFcMTM3XDJcMjY0XDFcMTM3XDVcMjY0XDJcMTM3XDE0XDI2NCIrCi0gICAgIlwxXDBcMTZcMjY0XDFcMFwxN1wyNjRcMTNcMFwxXDI2NVw2NlwwXDFcMjY2IisKLSAgICAiXDJcMFwxXDI2Nlw1XDBcMlwyNjZcMTFcMFwxXDI2N1w1NFwwXDFcMjcwIisKLSAgICAiXDYxXDBcMVwyNzFcMVwzMlwxXDE0N1wxXDMyXDFcMFwxXDMyXDFcMjcxIisKLSAgICAiXDFcMFwxXDMyXDFcMFwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyIisKLSAgICAiXDFcMFwxXDMyXDEzXDBcMVwyNzFcMlwzMlwxXDI3MVwyXDMyXDFcMjcxIisKLSAgICAiXDJcMzJcMVwwXDRcMzJcMVwwXDFcMjcxXDJcMzJcMVwwXDFcMjcxIisKLSAgICAiXDJcMzJcNFwwXDJcMzJcMVwxNDdcM1wwXDFcMzJcM1wwXDFcMzIiKwotICAgICJcN1wwXDNcMzJcMVwwXDFcMzJcMlwwXDFcMjcyXDEwXDBcMTFcMzIiKwotICAgICJcMVwwXDRcMzJcMVwwXDNcMzJcMVwwXDNcMzJcNFwwXDFcMjczIisKLSAgICAiXDJcMTUyXDFcMFwyXDE1MlwxXDI3M1wxXDE1MlwxXDBcNVwxNTJcMlwwIisKLSAgICAiXDIyXDE1MlwxXDI3M1wyXDE1MlwxXDI3M1wyXDE1MlwxXDI3M1wxMFwxNTJcMVwyNzMiKwotICAgICJcM1wxNTJcMVwyNzNcNVwxNTJcMVwwXDFcMjc0XDJcMTU0XDFcMFwyXDE1NCIrCi0gICAgIlwxXDI3NFwxXDE1NFwxXDBcNVwxNTRcMlwwXDIyXDE1NFwxXDI3NFwyXDE1NCIrCi0gICAgIlwxXDI3NFwyXDE1NFwxXDI3NFwxMFwxNTRcMVwyNzRcM1wxNTRcMVwyNzRcNVwxNTQiKwotICAgICJcNlwwXDFcMTU2XDJcMFwxXDE1Nlw1XDBcMlwxNTZcMTBcMFwxXDE1NyIrCi0gICAgIlw1MFwwXDFcMTU3XDJcMFwxXDE1N1w1XDBcMlwxNTdcNjZcMFwxXDI3NSIrCi0gICAgIlwxMjVcMFwxXDI3NlwxMDRcMFwxXDI3N1w2NlwwXDJcMzAwXDY3XDBcMlwzMDEiKwotICAgICJcMTA0XDBcMVwzMDJcMTNcMFw0MlwxNzBcMVwzMDNcMzFcMTcwXDFcMFwyXDE3MSIrCi0gICAgIlwxXDE3MlwzXDBcMVwxNzFcM1wwXDFcMTcxXDdcMFwzXDE3MVwxXDMwNCIrCi0gICAgIlwxXDE3MVwxM1wwXDExXDE3MVwxXDBcNFwxNzFcMVwwXDNcMTcxXDFcMCIrCi0gICAgIlwzXDE3MVw0XDBcMVwzMDVcMlwxNzFcMVwwXDJcMTcxXDFcMzA1XDFcMTcxIisKLSAgICAiXDFcMFw1XDE3MVwyXDBcMjJcMTcxXDFcMzA1XDJcMTcxXDFcMzA1XDJcMTcxIisKLSAgICAiXDFcMzA1XDEwXDE3MVwxXDMwNVwzXDE3MVwxXDMwNVw1XDE3MVwxXDBcMVwzMDYiKwotICAgICJcMVwxNzNcMVwxNzRcMVwxNzNcMVwzMDdcMVwxNzNcMVwzMDZcMTBcMTczXDFcMzEwIisKLSAgICAiXDIyXDE3M1wxXDMwNlwyXDE3M1wxXDMwNlwyXDE3M1wxXDMwNlwxMFwxNzNcMVwzMDYiKwotICAgICJcM1wxNzNcMVwzMDZcNVwxNzNcMVwwXDFcMzExXDFcMTc2XDFcMTc3XDNcMTc2IisKLSAgICAiXDFcMzExXDFcMzEyXDdcMTc2XDFcMzEzXDIyXDE3NlwxXDMxMVwyXDE3NlwxXDMxMSIrCi0gICAgIlwyXDE3NlwxXDMxMVwxMFwxNzZcMVwzMTFcM1wxNzZcMVwzMTFcNVwxNzZcMzJcMCIrCi0gICAgIlwxXDI3Mlw0MlwwXDFcMzE0XDFcMjAxXDFcMjAyXDFcMjAxXDFcMzE1XDFcMjAxIisKLSAgICAiXDFcMzE0XDEwXDIwMVwxXDMxNlwyMlwyMDFcMVwzMTRcMlwyMDFcMVwzMTRcMlwyMDEiKwotICAgICJcMVwzMTRcMTBcMjAxXDFcMzE0XDNcMjAxXDFcMzE0XDVcMjAxXDFcMFwxXDMxNyIrCi0gICAgIlwxXDIwNFwxXDIwNVwzXDIwNFwxXDMxN1wxXDMyMFw3XDIwNFwxXDMyMVwyMlwyMDQiKwotICAgICJcMVwzMTdcMlwyMDRcMVwzMTdcMlwyMDRcMVwzMTdcMTBcMjA0XDFcMzE3XDNcMjA0IisKLSAgICAiXDFcMzE3XDVcMjA0XDI1XDBcMVwzMjJcNDdcMFwxXDMyM1wxXDYwXDFcMjA3IisKLSAgICAiXDFcNjBcMVwwXDFcNjBcMVwzMjNcMVwwXDFcNjBcMVwwXDFcNjAiKwotICAgICJcM1wwXDJcNjBcMlwwXDNcNjBcMVwwXDFcNjBcMTNcMFwxXDMyMyIrCi0gICAgIlwyXDYwXDFcMzIzXDJcNjBcMVwzMjNcMlw2MFwxXDBcNFw2MFwxXDAiKwotICAgICJcMVwzMjNcMlw2MFwxXDBcMVwzMjNcMlw2MFw0XDBcMlw2MFwxXDIwNyIrCi0gICAgIlwzXDBcMVw2MFwzXDBcMVw2MFw3XDBcM1w2MFwxXDBcMVw2MCIrCi0gICAgIlwyXDBcMVwyNzJcMTBcMFwxMVw2MFwxXDBcNFw2MFwxXDBcM1w2MCIrCi0gICAgIlwxXDBcM1w2MFw0XDBcMVwzMjRcMVw2NFwxXDIxMlwxXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMzI0XDFcMFwxXDY0XDFcMFwxXDY0XDNcMFwyXDY0IisKLSAgICAiXDJcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMVwzMjRcMlw2NFwxXDMyNCIrCi0gICAgIlwyXDY0XDFcMzI0XDJcNjRcMVwwXDRcNjRcMVwwXDFcMzI0XDJcNjQiKwotICAgICJcMVwwXDFcMzI0XDJcNjRcNFwwXDJcNjRcMVwyMTJcM1wwXDFcNjQiKwotICAgICJcM1wwXDFcNjRcN1wwXDNcNjRcMVwwXDFcNjRcMlwwXDFcMjcyIisKLSAgICAiXDEwXDBcMTFcNjRcMVwwXDRcNjRcMVwwXDNcNjRcMVwwXDNcNjQiKwotICAgICJcNFwwXDFcMzI1XDFcNzFcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXDMyNSIrCi0gICAgIlwxXDBcMVw3MVwxXDBcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MSIrCi0gICAgIlwxXDBcMVw3MVwxM1wwXDFcMzI1XDJcNzFcMVwzMjVcMlw3MVwxXDMyNSIrCi0gICAgIlwyXDcxXDFcMFw0XDcxXDFcMFwxXDMyNVwyXDcxXDFcMFwxXDMyNSIrCi0gICAgIlwyXDcxXDRcMFwyXDcxXDFcMjE1XDNcMFwxXDcxXDNcMFwxXDcxIisKLSAgICAiXDdcMFwzXDcxXDFcMFwxXDcxXDJcMFwxXDI3MlwxMFwwXDExXDcxIisKLSAgICAiXDFcMFw0XDcxXDFcMFwzXDcxXDFcMFwzXDcxXDRcMFwxXDMyNiIrCi0gICAgIlwxXDEwMVwxXDIyMVwxXDEwMVwxXDBcMVwxMDFcMVwzMjZcMVwwXDFcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxM1wwXDFcMzI2XDJcMTAxXDFcMzI2XDJcMTAxXDFcMzI2XDJcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcMVwzMjZcMlwxMDFcMVwwXDFcMzI2XDJcMTAxXDRcMCIrCi0gICAgIlwyXDEwMVwxXDIyMVwzXDBcMVwxMDFcM1wwXDFcMTAxXDdcMFwzXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcMlwwXDFcMjcyXDEwXDBcMTFcMTAxXDFcMFw0XDEwMSIrCi0gICAgIlwxXDBcM1wxMDFcMVwwXDNcMTAxXDRcMFwxXDMyN1wxXDEwN1wxXDIyNCIrCi0gICAgIlwxXDEwN1wxXDBcMVwxMDdcMVwzMjdcMVwwXDFcMTA3XDFcMFwxXDEwNyIrCi0gICAgIlwzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMFwxXDEwN1wxM1wwXDFcMzI3IisKLSAgICAiXDJcMTA3XDFcMzI3XDJcMTA3XDFcMzI3XDJcMTA3XDFcMFw0XDEwN1wxXDAiKwotICAgICJcMVwzMjdcMlwxMDdcMVwwXDFcMzI3XDJcMTA3XDRcMFwxXDMzMFwxXDIyNiIrCi0gICAgIlwxXDIyN1wxXDIyNlwxXDMzMVwxXDIyNlwxXDMzMFwxMFwyMjZcMVwzMzJcMjJcMjI2IisKLSAgICAiXDFcMzMwXDJcMjI2XDFcMzMwXDJcMjI2XDFcMzMwXDEwXDIyNlwxXDMzMFwzXDIyNiIrCi0gICAgIlwxXDMzMFw1XDIyNlwxXDBcMVwzMzNcMVwyMzFcMVwyMzJcM1wyMzFcMVwzMzMiKwotICAgICJcMVwzMzRcN1wyMzFcMVwzMzVcMjJcMjMxXDFcMzMzXDJcMjMxXDFcMzMzXDJcMjMxIisKLSAgICAiXDFcMzMzXDEwXDIzMVwxXDMzM1wzXDIzMVwxXDMzM1w1XDIzMVwxXDBcMlwxMDciKwotICAgICJcMVwyMjRcM1wwXDFcMTA3XDNcMFwxXDEwN1w3XDBcM1wxMDdcMVwwIisKLSAgICAiXDFcMTA3XDJcMFwxXDI3MlwxMFwwXDExXDEwN1wxXDBcNFwxMDdcMVwwIisKLSAgICAiXDNcMTA3XDFcMFwzXDEwN1w0XDBcMVwzMzZcMVwxMTRcMVwyMzRcMVwxMTQiKwotICAgICJcMVwwXDFcMTE0XDFcMzM2XDFcMFwxXDExNFwxXDBcMVwxMTRcM1wwIisKLSAgICAiXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMFwxXDMzNlwyXDExNCIrCi0gICAgIlwxXDMzNlwyXDExNFwxXDMzNlwyXDExNFwxXDBcNFwxMTRcMVwwXDFcMzM2IisKLSAgICAiXDJcMTE0XDFcMFwxXDMzNlwyXDExNFw0XDBcMlwxMTRcMVwyMzRcM1wwIisKLSAgICAiXDFcMTE0XDNcMFwxXDExNFw3XDBcM1wxMTRcMVwwXDFcMTE0XDJcMCIrCi0gICAgIlwxXDI3MlwxMFwwXDExXDExNFwxXDBcNFwxMTRcMVwwXDNcMTE0XDFcMCIrCi0gICAgIlwzXDExNFw0XDBcMlwyMzdcMVwyNDBcM1wwXDFcMjM3XDNcMFwxXDIzNyIrCi0gICAgIlw3XDBcM1wyMzdcMVwwXDFcMjM3XDEzXDBcMTFcMjM3XDFcMFw0XDIzNyIrCi0gICAgIlwxXDBcM1wyMzdcMVwwXDNcMjM3XDRcMFwxXDMzN1wyXDIzN1wxXDAiKwotICAgICJcMlwyMzdcMVwzMzdcMVwyMzdcMVwwXDVcMjM3XDJcMFwyMlwyMzdcMVwzMzciKwotICAgICJcMlwyMzdcMVwzMzdcMlwyMzdcMVwzMzdcMTBcMjM3XDFcMzM3XDNcMjM3XDFcMzM3IisKLSAgICAiXDVcMjM3XDFcMFwxXDM0MFwxXDEyMlwxXDI0M1wxXDEyMlwxXDBcMVwxMjIiKwotICAgICJcMVwzNDBcMVwwXDFcMTIyXDFcMFwxXDEyMlwzXDBcMlwxMjJcMlwwIisKLSAgICAiXDNcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMVwzNDBcMlwxMjJcMVwzNDBcMlwxMjIiKwotICAgICJcMVwzNDBcMlwxMjJcMVwwXDRcMTIyXDFcMFwxXDM0MFwyXDEyMlwxXDAiKwotICAgICJcMVwzNDBcMlwxMjJcNFwwXDFcMzQxXDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMzQyIisKLSAgICAiXDFcMjQ2XDFcMzQxXDEwXDI0NlwxXDM0M1wyMlwyNDZcMVwzNDFcMlwyNDZcMVwzNDEiKwotICAgICJcMlwyNDZcMVwzNDFcMTBcMjQ2XDFcMzQxXDNcMjQ2XDFcMzQxXDVcMjQ2XDFcMCIrCi0gICAgIlwxXDM0NFwxXDI1MVwxXDI1MlwzXDI1MVwxXDM0NFwxXDM0NVw3XDI1MVwxXDM0NiIrCi0gICAgIlwyMlwyNTFcMVwzNDRcMlwyNTFcMVwzNDRcMlwyNTFcMVwzNDRcMTBcMjUxXDFcMzQ0IisKLSAgICAiXDNcMjUxXDFcMzQ0XDVcMjUxXDFcMFwxXDI1M1wxXDEyMlwxXDI0M1wzXDAiKwotICAgICJcMVwxMjJcM1wwXDFcMTIyXDFcMFwxXDI0MVw1XDBcM1wxMjJcMVwyNDQiKwotICAgICJcMVwxMjJcMVwwXDFcMjQyXDExXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDAiKwotICAgICJcM1wxMjJcMVwwXDNcMTIyXDRcMFwyXDEyMlwxXDI0M1wzXDBcMVwxMjIiKwotICAgICJcM1wwXDFcMTIyXDdcMFwzXDEyMlwxXDI0NFwxXDEyMlwyXDBcMVwyNzIiKwotICAgICJcMTBcMFwxMVwxMjJcMVwwXDRcMTIyXDFcMFwzXDEyMlwxXDBcM1wxMjIiKwotICAgICJcNFwwXDFcMjU1XDFcMjM3XDFcMjQwXDNcMFwxXDIzN1wzXDBcMVwyMzciKwotICAgICJcN1wwXDNcMjM3XDFcMFwxXDIzN1wxXDBcMVwyNDJcMTFcMFwxMVwyMzciKwotICAgICJcMVwwXDRcMjM3XDFcMFwzXDIzN1wxXDBcM1wyMzdcNFwwXDFcMzQ3IisKLSAgICAiXDJcMjU2XDFcMFwyXDI1NlwxXDM0N1wxXDI1NlwxXDBcNVwyNTZcMlwwIisKLSAgICAiXDIyXDI1NlwxXDM0N1wyXDI1NlwxXDM0N1wyXDI1NlwxXDM0N1wxMFwyNTZcMVwzNDciKwotICAgICJcM1wyNTZcMVwzNDdcNVwyNTZcMVwwXDFcMzUwXDVcMFwxXDM1MFwxMVwwIisKLSAgICAiXDFcMzUwXDVcMFwxXDM1MFwxM1wwXDJcMzUwXDFcMFwyXDM1MFwxXDAiKwotICAgICJcMlwzNTBcN1wwXDJcMzUwXDJcMFwyXDM1MFw1XDBcMlwxMjJcMVwyNDMiKwotICAgICJcM1wwXDFcMTIyXDNcMFwxXDEyMlw3XDBcMlwxMjJcMVwzNTFcMVwyNDQiKwotICAgICJcMVwxMjJcMTNcMFwxMVwxMjJcMVwwXDRcMTIyXDFcMFwzXDEyMlwxXDAiKwotICAgICJcM1wxMjJcNjFcMFwxXDM1MlwzMFwwXDFcMzUzXDE1XDBcMVwzNTRcMVwyNzIiKwotICAgICJcNDJcMFwxXDM1NVwxXDMyXDFcMTQ3XDFcMzJcMVwwXDFcMzJcMVwzNTUiKwotICAgICJcMVwwXDFcMzJcMVwwXDFcMzJcM1wwXDJcMzJcMlwwXDNcMzIiKwotICAgICJcMVwwXDFcMzJcMTNcMFwxXDM1NVwyXDMyXDFcMzU1XDJcMzJcMVwzNTUiKwotICAgICJcMlwzMlwxXDBcNFwzMlwxXDBcMVwzNTVcMlwzMlwxXDBcMVwzNTUiKwotICAgICJcMlwzMlw0XDBcMVwzNTZcMVwxNTJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyIisKLSAgICAiXDFcMzU2XDFcMFwxXDE1MlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMCIrCi0gICAgIlwzXDE1MlwxXDBcMVwxNTJcMTNcMFwxXDM1NlwyXDE1MlwxXDM1NlwyXDE1MiIrCi0gICAgIlwxXDM1NlwyXDE1MlwxXDBcNFwxNTJcMVwwXDFcMzU2XDJcMTUyXDFcMCIrCi0gICAgIlwxXDM1NlwyXDE1Mlw0XDBcMVwzNTdcMVwxNTRcMVwxNTVcMVwxNTRcMVwwIisKLSAgICAiXDFcMTU0XDFcMzU3XDFcMFwxXDE1NFwxXDBcMVwxNTRcM1wwXDJcMTU0IisKLSAgICAiXDJcMFwzXDE1NFwxXDBcMVwxNTRcMTNcMFwxXDM1N1wyXDE1NFwxXDM1NyIrCi0gICAgIlwyXDE1NFwxXDM1N1wyXDE1NFwxXDBcNFwxNTRcMVwwXDFcMzU3XDJcMTU0IisKLSAgICAiXDFcMFwxXDM1N1wyXDE1NFwxNlwwXDFcMzYwXDEyNlwwXDJcMzYxXDEwM1wwIisKLSAgICAiXDFcMzYyXDc2XDBcMlwzNjNcNzRcMFwxXDM2NFw3N1wwXDFcMzY1XDNcMCIrCi0gICAgIlw0MVwxNzBcMVwzNjZcMVwzMDNcMzFcMTcwXDJcMFwxXDM2N1wxXDM3MFwxXDMwNCIrCi0gICAgIlwxXDBcMVwzMDRcMVwzNjdcMVwwXDFcMzA0XDFcMFwxXDM2N1wzXDAiKwotICAgICJcMlwzMDRcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwXDExXDM2N1wxXDAiKwotICAgICJcNFwzNjdcMVwwXDNcMzY3XDFcMFwzXDM2N1w0XDBcMVwzNzFcMVwxNzEiKwotICAgICJcMVwxNzJcMVwxNzFcMVwwXDFcMTcxXDFcMzcxXDFcMFwxXDE3MVwxXDAiKwotICAgICJcMVwxNzFcM1wwXDJcMTcxXDJcMFwzXDE3MVwxXDMwNFwxXDE3MVwxM1wwIisKLSAgICAiXDFcMzcxXDJcMTcxXDFcMzcxXDJcMTcxXDFcMzcxXDJcMTcxXDFcMFw0XDE3MSIrCi0gICAgIlwxXDBcMVwzNzFcMlwxNzFcMVwwXDFcMzcxXDJcMTcxXDRcMFwxXDM3MiIrCi0gICAgIlwxXDE3M1wxXDE3NFwxXDE3M1wxXDE3NVwxXDE3M1wxXDM3MlwzM1wxNzNcMVwzNzIiKwotICAgICJcMlwxNzNcMVwzNzJcMlwxNzNcMVwzNzJcMTBcMTczXDFcMzcyXDNcMTczXDFcMzcyIisKLSAgICAiXDVcMTczXDFcMFwyXDE3M1wxXDE3NFwxXDBcMVwxNzVcMTJcMTczXDFcMCIrCi0gICAgIlw1M1wxNzNcMVwwXDFcMzczXDFcMTc2XDFcMTc3XDNcMTc2XDFcMzczXDFcMTc1IisKLSAgICAiXDMyXDE3NlwxXDM3M1wyXDE3NlwxXDM3M1wyXDE3NlwxXDM3M1wxMFwxNzZcMVwzNzMiKwotICAgICJcM1wxNzZcMVwzNzNcNVwxNzZcMVwwXDJcMTc2XDFcMTc3XDFcMFwzXDE3NiIrCi0gICAgIlwxXDE3NVw3XDE3NlwxXDBcNTNcMTc2XDFcMFwxXDM3NFwxXDIwMVwxXDIwMiIrCi0gICAgIlwxXDIwMVwxXDIwM1wxXDIwMVwxXDM3NFwzM1wyMDFcMVwzNzRcMlwyMDFcMVwzNzQiKwotICAgICJcMlwyMDFcMVwzNzRcMTBcMjAxXDFcMzc0XDNcMjAxXDFcMzc0XDVcMjAxXDFcMCIrCi0gICAgIlwyXDIwMVwxXDIwMlwxXDBcMVwyMDNcMTJcMjAxXDFcMFw1M1wyMDFcMVwwIisKLSAgICAiXDFcMzc1XDFcMjA0XDFcMjA1XDNcMjA0XDFcMzc1XDFcMjAzXDMyXDIwNFwxXDM3NSIrCi0gICAgIlwyXDIwNFwxXDM3NVwyXDIwNFwxXDM3NVwxMFwyMDRcMVwzNzVcM1wyMDRcMVwzNzUiKwotICAgICJcNVwyMDRcMVwwXDJcMjA0XDFcMjA1XDFcMFwzXDIwNFwxXDIwM1w3XDIwNCIrCi0gICAgIlwxXDBcNTNcMjA0XDI2XDBcMVwzNzZcNDZcMFwxXDM3N1wxXDYwXDFcMjA3IisKLSAgICAiXDFcNjBcMVwwXDFcNjBcMVwzNzdcMVwwXDFcNjBcMVwwXDFcNjAiKwotICAgICJcM1wwXDJcNjBcMlwwXDNcNjBcMVwwXDFcNjBcMTNcMFwxXDM3NyIrCi0gICAgIlwyXDYwXDFcMzc3XDJcNjBcMVwzNzdcMlw2MFwxXDBcNFw2MFwxXDAiKwotICAgICJcMVwzNzdcMlw2MFwxXDBcMVwzNzdcMlw2MFw0XDBcMVx1MDEwMFwxXDY0IisKLSAgICAiXDFcMjEyXDFcNjRcMVwwXDFcNjRcMVx1MDEwMFwxXDBcMVw2NFwxXDAiKwotICAgICJcMVw2NFwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwIisKLSAgICAiXDFcdTAxMDBcMlw2NFwxXHUwMTAwXDJcNjRcMVx1MDEwMFwyXDY0XDFcMFw0XDY0IisKLSAgICAiXDFcMFwxXHUwMTAwXDJcNjRcMVwwXDFcdTAxMDBcMlw2NFw0XDBcMVx1MDEwMSIrCi0gICAgIlwxXDcxXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVx1MDEwMVwxXDBcMVw3MSIrCi0gICAgIlwxXDBcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MVwxXDBcMVw3MSIrCi0gICAgIlwxM1wwXDFcdTAxMDFcMlw3MVwxXHUwMTAxXDJcNzFcMVx1MDEwMVwyXDcxXDFcMCIrCi0gICAgIlw0XDcxXDFcMFwxXHUwMTAxXDJcNzFcMVwwXDFcdTAxMDFcMlw3MVw0XDAiKwotICAgICJcMVx1MDEwMlwxXDEwMVwxXDIyMVwxXDEwMVwxXDBcMVwxMDFcMVx1MDEwMlwxXDAiKwotICAgICJcMVwxMDFcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwIisKLSAgICAiXDFcMTAxXDEzXDBcMVx1MDEwMlwyXDEwMVwxXHUwMTAyXDJcMTAxXDFcdTAxMDJcMlwxMDEiKwotICAgICJcMVwwXDRcMTAxXDFcMFwxXHUwMTAyXDJcMTAxXDFcMFwxXHUwMTAyXDJcMTAxIisKLSAgICAiXDRcMFwxXHUwMTAzXDFcMTA3XDFcMjI0XDFcMTA3XDFcMFwxXDEwN1wxXHUwMTAzIisKLSAgICAiXDFcMFwxXDEwN1wxXDBcMVwxMDdcM1wwXDJcMTA3XDJcMFwzXDEwNyIrCi0gICAgIlwxXDBcMVwxMDdcMTNcMFwxXHUwMTAzXDJcMTA3XDFcdTAxMDNcMlwxMDdcMVx1MDEwMyIrCi0gICAgIlwyXDEwN1wxXDBcNFwxMDdcMVwwXDFcdTAxMDNcMlwxMDdcMVwwXDFcdTAxMDMiKwotICAgICJcMlwxMDdcNFwwXDFcdTAxMDRcMVwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcMVwyMjYiKwotICAgICJcMVx1MDEwNFwzM1wyMjZcMVx1MDEwNFwyXDIyNlwxXHUwMTA0XDJcMjI2XDFcdTAxMDRcMTBcMjI2IisKLSAgICAiXDFcdTAxMDRcM1wyMjZcMVx1MDEwNFw1XDIyNlwxXDBcMlwyMjZcMVwyMjdcMVwwIisKLSAgICAiXDFcMjMwXDEyXDIyNlwxXDBcNTNcMjI2XDFcMFwxXHUwMTA1XDFcMjMxXDFcMjMyIisKLSAgICAiXDNcMjMxXDFcdTAxMDVcMVwyMzBcMzJcMjMxXDFcdTAxMDVcMlwyMzFcMVx1MDEwNVwyXDIzMSIrCi0gICAgIlwxXHUwMTA1XDEwXDIzMVwxXHUwMTA1XDNcMjMxXDFcdTAxMDVcNVwyMzFcMVwwXDJcMjMxIisKLSAgICAiXDFcMjMyXDFcMFwzXDIzMVwxXDIzMFw3XDIzMVwxXDBcNTNcMjMxXDFcMCIrCi0gICAgIlwxXHUwMTA2XDFcMTE0XDFcMjM0XDFcMTE0XDFcMFwxXDExNFwxXHUwMTA2XDFcMCIrCi0gICAgIlwxXDExNFwxXDBcMVwxMTRcM1wwXDJcMTE0XDJcMFwzXDExNFwxXDAiKwotICAgICJcMVwxMTRcMTNcMFwxXHUwMTA2XDJcMTE0XDFcdTAxMDZcMlwxMTRcMVx1MDEwNlwyXDExNCIrCi0gICAgIlwxXDBcNFwxMTRcMVwwXDFcdTAxMDZcMlwxMTRcMVwwXDFcdTAxMDZcMlwxMTQiKwotICAgICJcNFwwXDFcdTAxMDdcMVwyMzdcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxMDciKwotICAgICJcMVwwXDFcMjM3XDFcMFwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3IisKLSAgICAiXDFcMFwxXDIzN1wxM1wwXDFcdTAxMDdcMlwyMzdcMVx1MDEwN1wyXDIzN1wxXHUwMTA3IisKLSAgICAiXDJcMjM3XDFcMFw0XDIzN1wxXDBcMVx1MDEwN1wyXDIzN1wxXDBcMVx1MDEwNyIrCi0gICAgIlwyXDIzN1w0XDBcMVx1MDEwOFwxXDEyMlwxXDI0M1wxXDEyMlwxXDBcMVwxMjIiKwotICAgICJcMVx1MDEwOFwxXDBcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDAiKwotICAgICJcM1wxMjJcMVwyNDRcMVwxMjJcMTNcMFwxXHUwMTA4XDJcMTIyXDFcdTAxMDhcMlwxMjIiKwotICAgICJcMVx1MDEwOFwyXDEyMlwxXDBcNFwxMjJcMVwwXDFcdTAxMDhcMlwxMjJcMVwwIisKLSAgICAiXDFcdTAxMDhcMlwxMjJcNFwwXDFcdTAxMDlcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTAiKwotICAgICJcMVwyNDZcMVx1MDEwOVwzM1wyNDZcMVx1MDEwOVwyXDI0NlwxXHUwMTA5XDJcMjQ2XDFcdTAxMDkiKwotICAgICJcMTBcMjQ2XDFcdTAxMDlcM1wyNDZcMVx1MDEwOVw1XDI0NlwxXDBcMlwyNDZcMVwyNDciKwotICAgICJcMVwwXDFcMjUwXDEyXDI0NlwxXDBcNTNcMjQ2XDFcMFwxXHUwMTBhXDFcMjUxIisKLSAgICAiXDFcMjUyXDNcMjUxXDFcdTAxMGFcMVwyNTBcMzJcMjUxXDFcdTAxMGFcMlwyNTFcMVx1MDEwYSIrCi0gICAgIlwyXDI1MVwxXHUwMTBhXDEwXDI1MVwxXHUwMTBhXDNcMjUxXDFcdTAxMGFcNVwyNTFcMVwwIisKLSAgICAiXDJcMjUxXDFcMjUyXDFcMFwzXDI1MVwxXDI1MFw3XDI1MVwxXDBcNTNcMjUxIisKLSAgICAiXDFcMFwxXHUwMTBiXDFcMjU2XDFcMjU3XDFcMjU2XDFcMFwxXDI1NlwxXHUwMTBiIisKLSAgICAiXDFcMFwxXDI1NlwxXDBcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NiIrCi0gICAgIlwxXDBcMVwyNTZcMTNcMFwxXHUwMTBiXDJcMjU2XDFcdTAxMGJcMlwyNTZcMVx1MDEwYiIrCi0gICAgIlwyXDI1NlwxXDBcNFwyNTZcMVwwXDFcdTAxMGJcMlwyNTZcMVwwXDFcdTAxMGIiKwotICAgICJcMlwyNTZcNFwwXDFcdTAxMGNcNVwwXDFcdTAxMGNcM1wwXDFcdTAxMGRcNVwwIisKLSAgICAiXDFcdTAxMGNcNVwwXDFcdTAxMGNcMTNcMFwyXHUwMTBjXDFcMFwyXHUwMTBjXDFcMCIrCi0gICAgIlwyXHUwMTBjXDdcMFwyXHUwMTBjXDJcMFwyXHUwMTBjXDVcMFwyXDEyMlwxXDI0MyIrCi0gICAgIlwzXDBcMVwxMjJcM1wwXDFcMTIyXDdcMFwzXDEyMlwxXHUwMTBlXDFcMTIyIisKLSAgICAiXDEzXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwXDNcMTIyIisKLSAgICAiXDYyXDBcMVx1MDEwZlwyN1wwXDFcMzUzXDE1XDBcMVwzNTRcNTBcMFwxXDM1NCIrCi0gICAgIlwyXDBcMVwzNTRcNVwwXDJcMzU0XDExXDBcMVx1MDExMFw0MlwwXDFcdTAxMTEiKwotICAgICJcMVwzMlwxXDE0N1wxXDMyXDFcMFwxXDMyXDFcdTAxMTFcMVwwXDFcMzIiKwotICAgICJcMVwwXDFcMzJcM1wwXDJcMzJcMlwwXDNcMzJcMVwwXDFcMzIiKwotICAgICJcMTNcMFwxXHUwMTExXDJcMzJcMVx1MDExMVwyXDMyXDFcdTAxMTFcMlwzMlwxXDAiKwotICAgICJcNFwzMlwxXDBcMVx1MDExMVwyXDMyXDFcMFwxXHUwMTExXDJcMzJcNFwwIisKLSAgICAiXDFcdTAxMTJcMVwxNTJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyXDFcdTAxMTJcMVwwIisKLSAgICAiXDFcMTUyXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyXDFcMCIrCi0gICAgIlwxXDE1MlwxM1wwXDFcdTAxMTJcMlwxNTJcMVx1MDExMlwyXDE1MlwxXHUwMTEyXDJcMTUyIisKLSAgICAiXDFcMFw0XDE1MlwxXDBcMVx1MDExMlwyXDE1MlwxXDBcMVx1MDExMlwyXDE1MiIrCi0gICAgIlw0XDBcMVx1MDExM1wxXDE1NFwxXDE1NVwxXDE1NFwxXDBcMVwxNTRcMVx1MDExMyIrCi0gICAgIlwxXDBcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDBcM1wxNTQiKwotICAgICJcMVwwXDFcMTU0XDEzXDBcMVx1MDExM1wyXDE1NFwxXHUwMTEzXDJcMTU0XDFcdTAxMTMiKwotICAgICJcMlwxNTRcMVwwXDRcMTU0XDFcMFwxXHUwMTEzXDJcMTU0XDFcMFwxXHUwMTEzIisKLSAgICAiXDJcMTU0XDI3XDBcMVx1MDExNFwxMjdcMFwxXHUwMTE1XDcwXDBcMVx1MDExNlw2N1wwIisKLSAgICAiXDJcdTAxMTdcNzRcMFwxXHUwMTE4XDIxXDBcMlwzNjdcMVwzNzBcMVx1MDExOVwxXDAiKwotICAgICJcMVx1MDExOVwxXDM2N1wxXDBcMVx1MDExOVwxXHUwMTFhXDFcMzY3XDNcMFwyXHUwMTE5IisKLSAgICAiXDJcMFwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxMVwzNjdcMVwwXDRcMzY3IisKLSAgICAiXDFcMFwzXDM2N1wxXDBcM1wzNjdcNFwwXDFcdTAxMWJcMlwzNjdcMVwwIisKLSAgICAiXDJcMzY3XDFcdTAxMWJcMVwzNjdcMVwwXDVcMzY3XDJcMFwyMlwzNjdcMVx1MDExYiIrCi0gICAgIlwyXDM2N1wxXHUwMTFiXDJcMzY3XDFcdTAxMWJcMTBcMzY3XDFcdTAxMWJcM1wzNjdcMVx1MDExYiIrCi0gICAgIlw1XDM2N1wxXDBcMVx1MDExY1wxXDE3MVwxXDE3MlwxXDE3MVwxXDBcMVwxNzEiKwotICAgICJcMVx1MDExY1wxXDBcMVwxNzFcMVwwXDFcMTcxXDNcMFwyXDE3MVwyXDAiKwotICAgICJcM1wxNzFcMVwzMDRcMVwxNzFcMTNcMFwxXHUwMTFjXDJcMTcxXDFcdTAxMWNcMlwxNzEiKwotICAgICJcMVx1MDExY1wyXDE3MVwxXDBcNFwxNzFcMVwwXDFcdTAxMWNcMlwxNzFcMVwwIisKLSAgICAiXDFcdTAxMWNcMlwxNzFcNFwwXDFcdTAxMWRcMVwxNzNcMVwxNzRcMVwxNzNcMVwxNzUiKwotICAgICJcMVwxNzNcMVx1MDExZFwzM1wxNzNcMVx1MDExZFwyXDE3M1wxXHUwMTFkXDJcMTczXDFcdTAxMWQiKwotICAgICJcMTBcMTczXDFcdTAxMWRcM1wxNzNcMVx1MDExZFw1XDE3M1wxXDBcMVx1MDExZVwxXDE3NiIrCi0gICAgIlwxXDE3N1wzXDE3NlwxXHUwMTFlXDFcMTc1XDMyXDE3NlwxXHUwMTFlXDJcMTc2XDFcdTAxMWUiKwotICAgICJcMlwxNzZcMVx1MDExZVwxMFwxNzZcMVx1MDExZVwzXDE3NlwxXHUwMTFlXDVcMTc2XDFcMCIrCi0gICAgIlwxXHUwMTFmXDFcMjAxXDFcMjAyXDFcMjAxXDFcMjAzXDFcMjAxXDFcdTAxMWZcMzNcMjAxIisKLSAgICAiXDFcdTAxMWZcMlwyMDFcMVx1MDExZlwyXDIwMVwxXHUwMTFmXDEwXDIwMVwxXHUwMTFmXDNcMjAxIisKLSAgICAiXDFcdTAxMWZcNVwyMDFcMVwwXDFcdTAxMjBcMVwyMDRcMVwyMDVcM1wyMDRcMVx1MDEyMCIrCi0gICAgIlwxXDIwM1wzMlwyMDRcMVx1MDEyMFwyXDIwNFwxXHUwMTIwXDJcMjA0XDFcdTAxMjBcMTBcMjA0IisKLSAgICAiXDFcdTAxMjBcM1wyMDRcMVx1MDEyMFw1XDIwNFwxXDBcMlx1MDEyMVwxXHUwMTIyXDFcMzc2IisKLSAgICAiXDFcdTAxMjNcMVwzNzZcMVx1MDEyMVwxXHUwMTI0XDFcMzc2XDFcdTAxMjVcNFx1MDEyMVwyXDM3NiIrCi0gICAgIlw1XHUwMTIxXDFcMFw0NVx1MDEyMVwxXDBcMVx1MDEyNlwxXDYwXDFcMjA3XDFcNjAiKwotICAgICJcMVwwXDFcNjBcMVx1MDEyNlwxXDBcMVw2MFwxXDBcMVw2MFwzXDAiKwotICAgICJcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcdTAxMjZcMlw2MCIrCi0gICAgIlwxXHUwMTI2XDJcNjBcMVx1MDEyNlwyXDYwXDFcMFw0XDYwXDFcMFwxXHUwMTI2IisKLSAgICAiXDJcNjBcMVwwXDFcdTAxMjZcMlw2MFw0XDBcMVx1MDEyN1wxXDY0XDFcMjEyIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVx1MDEyN1wxXDBcMVw2NFwxXDBcMVw2NCIrCi0gICAgIlwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwXDFcdTAxMjciKwotICAgICJcMlw2NFwxXHUwMTI3XDJcNjRcMVx1MDEyN1wyXDY0XDFcMFw0XDY0XDFcMCIrCi0gICAgIlwxXHUwMTI3XDJcNjRcMVwwXDFcdTAxMjdcMlw2NFw0XDBcMVx1MDEyOFwxXDcxIisKLSAgICAiXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVx1MDEyOFwxXDBcMVw3MVwxXDAiKwotICAgICJcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDFcdTAxMjhcMlw3MVwxXHUwMTI4XDJcNzFcMVx1MDEyOFwyXDcxXDFcMFw0XDcxIisKLSAgICAiXDFcMFwxXHUwMTI4XDJcNzFcMVwwXDFcdTAxMjhcMlw3MVw0XDBcMVx1MDEyOSIrCi0gICAgIlwxXDEwMVwxXDIyMVwxXDEwMVwxXDBcMVwxMDFcMVx1MDEyOVwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMVx1MDEyOVwyXDEwMVwxXHUwMTI5XDJcMTAxXDFcdTAxMjlcMlwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwxXHUwMTI5XDJcMTAxXDFcMFwxXHUwMTI5XDJcMTAxXDRcMCIrCi0gICAgIlwxXHUwMTJhXDFcMTA3XDFcMjI0XDFcMTA3XDFcMFwxXDEwN1wxXHUwMTJhXDFcMCIrCi0gICAgIlwxXDEwN1wxXDBcMVwxMDdcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDAiKwotICAgICJcMVwxMDdcMTNcMFwxXHUwMTJhXDJcMTA3XDFcdTAxMmFcMlwxMDdcMVx1MDEyYVwyXDEwNyIrCi0gICAgIlwxXDBcNFwxMDdcMVwwXDFcdTAxMmFcMlwxMDdcMVwwXDFcdTAxMmFcMlwxMDciKwotICAgICJcNFwwXDFcdTAxMmJcMVwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcMVwyMjZcMVx1MDEyYiIrCi0gICAgIlwzM1wyMjZcMVx1MDEyYlwyXDIyNlwxXHUwMTJiXDJcMjI2XDFcdTAxMmJcMTBcMjI2XDFcdTAxMmIiKwotICAgICJcM1wyMjZcMVx1MDEyYlw1XDIyNlwxXDBcMVx1MDEyY1wxXDIzMVwxXDIzMlwzXDIzMSIrCi0gICAgIlwxXHUwMTJjXDFcMjMwXDMyXDIzMVwxXHUwMTJjXDJcMjMxXDFcdTAxMmNcMlwyMzFcMVx1MDEyYyIrCi0gICAgIlwxMFwyMzFcMVx1MDEyY1wzXDIzMVwxXHUwMTJjXDVcMjMxXDFcMFwxXHUwMTJkXDFcMTE0IisKLSAgICAiXDFcMjM0XDFcMTE0XDFcMFwxXDExNFwxXHUwMTJkXDFcMFwxXDExNFwxXDAiKwotICAgICJcMVwxMTRcM1wwXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMCIrCi0gICAgIlwxXHUwMTJkXDJcMTE0XDFcdTAxMmRcMlwxMTRcMVx1MDEyZFwyXDExNFwxXDBcNFwxMTQiKwotICAgICJcMVwwXDFcdTAxMmRcMlwxMTRcMVwwXDFcdTAxMmRcMlwxMTRcNFwwXDFcdTAxMmUiKwotICAgICJcMVwyMzdcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxMmVcMVwwXDFcMjM3IisKLSAgICAiXDFcMFwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzNyIrCi0gICAgIlwxM1wwXDFcdTAxMmVcMlwyMzdcMVx1MDEyZVwyXDIzN1wxXHUwMTJlXDJcMjM3XDFcMCIrCi0gICAgIlw0XDIzN1wxXDBcMVx1MDEyZVwyXDIzN1wxXDBcMVx1MDEyZVwyXDIzN1w0XDAiKwotICAgICJcMVx1MDEyZlwxXDEyMlwxXDI0M1wxXDEyMlwxXDBcMVwxMjJcMVx1MDEyZlwxXDAiKwotICAgICJcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDBcM1wxMjJcMVwyNDQiKwotICAgICJcMVwxMjJcMTNcMFwxXHUwMTJmXDJcMTIyXDFcdTAxMmZcMlwxMjJcMVx1MDEyZlwyXDEyMiIrCi0gICAgIlwxXDBcNFwxMjJcMVwwXDFcdTAxMmZcMlwxMjJcMVwwXDFcdTAxMmZcMlwxMjIiKwotICAgICJcNFwwXDFcdTAxMzBcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTBcMVwyNDZcMVx1MDEzMCIrCi0gICAgIlwzM1wyNDZcMVx1MDEzMFwyXDI0NlwxXHUwMTMwXDJcMjQ2XDFcdTAxMzBcMTBcMjQ2XDFcdTAxMzAiKwotICAgICJcM1wyNDZcMVx1MDEzMFw1XDI0NlwxXDBcMVx1MDEzMVwxXDI1MVwxXDI1MlwzXDI1MSIrCi0gICAgIlwxXHUwMTMxXDFcMjUwXDMyXDI1MVwxXHUwMTMxXDJcMjUxXDFcdTAxMzFcMlwyNTFcMVx1MDEzMSIrCi0gICAgIlwxMFwyNTFcMVx1MDEzMVwzXDI1MVwxXHUwMTMxXDVcMjUxXDFcMFwxXHUwMTMyXDFcMjU2IisKLSAgICAiXDFcMjU3XDFcMjU2XDFcMFwxXDI1NlwxXHUwMTMyXDFcMFwxXDI1NlwxXDAiKwotICAgICJcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMCIrCi0gICAgIlwxXHUwMTMyXDJcMjU2XDFcdTAxMzJcMlwyNTZcMVx1MDEzMlwyXDI1NlwxXDBcNFwyNTYiKwotICAgICJcMVwwXDFcdTAxMzJcMlwyNTZcMVwwXDFcdTAxMzJcMlwyNTZcNFwwXDFcdTAxMzMiKwotICAgICJcNVwwXDFcdTAxMzNcM1wwXDFcdTAxMGRcNVwwXDFcdTAxMzNcNVwwXDFcdTAxMzMiKwotICAgICJcMTNcMFwyXHUwMTMzXDFcMFwyXHUwMTMzXDFcMFwyXHUwMTMzXDdcMFwyXHUwMTMzIisKLSAgICAiXDJcMFwyXHUwMTMzXDVcMFwxXHUwMTM0XDVcMFwxXHUwMTM0XDExXDBcMVx1MDEzNCIrCi0gICAgIlw1XDBcMVx1MDEzNFwxM1wwXDJcdTAxMzRcMVwwXDJcdTAxMzRcMVwwXDJcdTAxMzQiKwotICAgICJcN1wwXDJcdTAxMzRcMlwwXDJcdTAxMzRcNVwwXDJcdTAxMzVcMVx1MDEzNlwxXHUwMTM3IisKLSAgICAiXDFcdTAxMzhcMVx1MDEzN1wxXHUwMTM1XDFcdTAxMzlcMVx1MDEzN1wxXHUwMTNhXDRcdTAxMzVcMlx1MDEzNyIrCi0gICAgIlw1XHUwMTM1XDFcMFw0NVx1MDEzNVw2MFwwXDFcdTAxM2JcMTRcMFwxXHUwMTNjXDFcMzIiKwotICAgICJcMVwxNDdcMVwzMlwxXDBcMVwzMlwxXHUwMTNjXDFcMFwxXDMyXDFcMCIrCi0gICAgIlwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyXDFcMFwxXDMyXDEzXDAiKwotICAgICJcMVx1MDEzY1wyXDMyXDFcdTAxM2NcMlwzMlwxXHUwMTNjXDJcMzJcMVwwXDRcMzIiKwotICAgICJcMVwwXDFcdTAxM2NcMlwzMlwxXDBcMVx1MDEzY1wyXDMyXDRcMFwxXHUwMTNkIisKLSAgICAiXDFcMTUyXDFcMTUzXDFcMTUyXDFcMFwxXDE1MlwxXHUwMTNkXDFcMFwxXDE1MiIrCi0gICAgIlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MlwxXDBcMVwxNTIiKwotICAgICJcMTNcMFwxXHUwMTNkXDJcMTUyXDFcdTAxM2RcMlwxNTJcMVx1MDEzZFwyXDE1MlwxXDAiKwotICAgICJcNFwxNTJcMVwwXDFcdTAxM2RcMlwxNTJcMVwwXDFcdTAxM2RcMlwxNTJcNFwwIisKLSAgICAiXDFcdTAxM2VcMVwxNTRcMVwxNTVcMVwxNTRcMVwwXDFcMTU0XDFcdTAxM2VcMVwwIisKLSAgICAiXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwXDNcMTU0XDFcMCIrCi0gICAgIlwxXDE1NFwxM1wwXDFcdTAxM2VcMlwxNTRcMVx1MDEzZVwyXDE1NFwxXHUwMTNlXDJcMTU0IisKLSAgICAiXDFcMFw0XDE1NFwxXDBcMVx1MDEzZVwyXDE1NFwxXDBcMVx1MDEzZVwyXDE1NCIrCi0gICAgIlw1M1wwXDFcdTAxM2ZcNDdcMFwxXHUwMTQwXDExNVwwXDJcdTAxNDFcMzdcMFwxXHUwMTQyIisKLSAgICAiXDY0XDBcMVx1MDExOVwxXDBcMVx1MDExOVwyXDBcMVx1MDExOVwxXHUwMTFhXDRcMCIrCi0gICAgIlwyXHUwMTE5XDU0XDBcMVx1MDE0M1wxXDM2N1wxXDM3MFwxXDM2N1wxXDBcMVwzNjciKwotICAgICJcMVx1MDE0M1wxXDBcMVwzNjdcMVx1MDExYVwxXDM2N1wzXDBcMlwzNjdcMlwwIisKLSAgICAiXDNcMzY3XDFcMFwxXDM2N1wxM1wwXDFcdTAxNDNcMlwzNjdcMVx1MDE0M1wyXDM2NyIrCi0gICAgIlwxXHUwMTQzXDJcMzY3XDFcMFw0XDM2N1wxXDBcMVx1MDE0M1wyXDM2N1wxXDAiKwotICAgICJcMVx1MDE0M1wyXDM2N1w0XDBcMVx1MDE0NFwxXDE3MVwxXDE3MlwxXDE3MVwxXDAiKwotICAgICJcMVwxNzFcMVx1MDE0NFwxXDBcMVwxNzFcMVwwXDFcMTcxXDNcMFwyXDE3MSIrCi0gICAgIlwyXDBcM1wxNzFcMVwzMDRcMVwxNzFcMTNcMFwxXHUwMTQ0XDJcMTcxXDFcdTAxNDQiKwotICAgICJcMlwxNzFcMVx1MDE0NFwyXDE3MVwxXDBcNFwxNzFcMVwwXDFcdTAxNDRcMlwxNzEiKwotICAgICJcMVwwXDFcdTAxNDRcMlwxNzFcNFwwXDFcdTAxNDVcMVwxNzNcMVwxNzRcMVwxNzMiKwotICAgICJcMVwxNzVcMVwxNzNcMVx1MDE0NVwzM1wxNzNcMVx1MDE0NVwyXDE3M1wxXHUwMTQ1XDJcMTczIisKLSAgICAiXDFcdTAxNDVcMTBcMTczXDFcdTAxNDVcM1wxNzNcMVx1MDE0NVw1XDE3M1wxXDBcMVx1MDE0NiIrCi0gICAgIlwxXDE3NlwxXDE3N1wzXDE3NlwxXHUwMTQ2XDFcMTc1XDMyXDE3NlwxXHUwMTQ2XDJcMTc2IisKLSAgICAiXDFcdTAxNDZcMlwxNzZcMVx1MDE0NlwxMFwxNzZcMVx1MDE0NlwzXDE3NlwxXHUwMTQ2XDVcMTc2IisKLSAgICAiXDFcMFwxXHUwMTQ3XDFcMjAxXDFcMjAyXDFcMjAxXDFcMjAzXDFcMjAxXDFcdTAxNDciKwotICAgICJcMzNcMjAxXDFcdTAxNDdcMlwyMDFcMVx1MDE0N1wyXDIwMVwxXHUwMTQ3XDEwXDIwMVwxXHUwMTQ3IisKLSAgICAiXDNcMjAxXDFcdTAxNDdcNVwyMDFcMVwwXDFcdTAxNDhcMVwyMDRcMVwyMDVcM1wyMDQiKwotICAgICJcMVx1MDE0OFwxXDIwM1wzMlwyMDRcMVx1MDE0OFwyXDIwNFwxXHUwMTQ4XDJcMjA0XDFcdTAxNDgiKwotICAgICJcMTBcMjA0XDFcdTAxNDhcM1wyMDRcMVx1MDE0OFw1XDIwNFwxXDBcMlx1MDEyMVwxXHUwMTIyIisKLSAgICAiXDFcdTAxNDlcMVwwXDJcdTAxMjFcMVwwXDFcdTAxNDlcMVx1MDEyNVw0XHUwMTIxXDJcdTAxNDkiKwotICAgICJcNVx1MDEyMVwxXDBcNDVcdTAxMjFcMVwwXDFcdTAxNGFcMVx1MDEyMVwxXHUwMTIyXDFcdTAxNDkiKwotICAgICJcMlx1MDEyMVwxXHUwMTRhXDFcdTAxMjFcMVx1MDE0OVwxXHUwMTRiXDRcdTAxMjFcMlx1MDE0OVwyMlx1MDEyMSIrCi0gICAgIlwxXHUwMTRhXDJcdTAxMjFcMVx1MDE0YVwyXHUwMTIxXDFcdTAxNGFcMTBcdTAxMjFcMVx1MDE0YVwzXHUwMTIxIisKLSAgICAiXDFcdTAxNGFcNVx1MDEyMVwxXDBcMlx1MDEyM1wxXHUwMTRjXDFcMFwxXHUwMTQ5XDExXHUwMTIzIisKLSAgICAiXDJcMFw1M1x1MDEyM1wxXDBcMlx1MDEyNFwxXHUwMTRkXDFcMFwzXHUwMTI0XDFcdTAxNDkiKwotICAgICJcNlx1MDEyNFwyXDBcNTNcdTAxMjRcMVwwXDFcdTAxNGVcMVw2MFwxXDIwN1wxXDYwIisKLSAgICAiXDFcMFwxXDYwXDFcdTAxNGVcMVwwXDFcNjBcMVwwXDFcNjBcM1wwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMVwwXDFcNjBcMTNcMFwxXHUwMTRlXDJcNjAiKwotICAgICJcMVx1MDE0ZVwyXDYwXDFcdTAxNGVcMlw2MFwxXDBcNFw2MFwxXDBcMVx1MDE0ZSIrCi0gICAgIlwyXDYwXDFcMFwxXHUwMTRlXDJcNjBcNFwwXDFcdTAxNGZcMVw2NFwxXDIxMiIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcdTAxNGZcMVwwXDFcNjRcMVwwXDFcNjQiKwotICAgICJcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMFwxXHUwMTRmIisKLSAgICAiXDJcNjRcMVx1MDE0ZlwyXDY0XDFcdTAxNGZcMlw2NFwxXDBcNFw2NFwxXDAiKwotICAgICJcMVx1MDE0ZlwyXDY0XDFcMFwxXHUwMTRmXDJcNjRcNFwwXDFcdTAxNTBcMVw3MSIrCi0gICAgIlwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcdTAxNTBcMVwwXDFcNzFcMVwwIisKLSAgICAiXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxXHUwMTUwXDJcNzFcMVx1MDE1MFwyXDcxXDFcdTAxNTBcMlw3MVwxXDBcNFw3MSIrCi0gICAgIlwxXDBcMVx1MDE1MFwyXDcxXDFcMFwxXHUwMTUwXDJcNzFcNFwwXDFcdTAxNTEiKwotICAgICJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcdTAxNTFcMVwwXDFcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxM1wwXDFcdTAxNTFcMlwxMDFcMVx1MDE1MVwyXDEwMVwxXHUwMTUxXDJcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcMVx1MDE1MVwyXDEwMVwxXDBcMVx1MDE1MVwyXDEwMVw0XDAiKwotICAgICJcMVx1MDE1MlwxXDEwN1wxXDIyNFwxXDEwN1wxXDBcMVwxMDdcMVx1MDE1MlwxXDAiKwotICAgICJcMVwxMDdcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwIisKLSAgICAiXDFcMTA3XDEzXDBcMVx1MDE1MlwyXDEwN1wxXHUwMTUyXDJcMTA3XDFcdTAxNTJcMlwxMDciKwotICAgICJcMVwwXDRcMTA3XDFcMFwxXHUwMTUyXDJcMTA3XDFcMFwxXHUwMTUyXDJcMTA3IisKLSAgICAiXDRcMFwxXHUwMTUzXDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2XDFcdTAxNTMiKwotICAgICJcMzNcMjI2XDFcdTAxNTNcMlwyMjZcMVx1MDE1M1wyXDIyNlwxXHUwMTUzXDEwXDIyNlwxXHUwMTUzIisKLSAgICAiXDNcMjI2XDFcdTAxNTNcNVwyMjZcMVwwXDFcdTAxNTRcMVwyMzFcMVwyMzJcM1wyMzEiKwotICAgICJcMVx1MDE1NFwxXDIzMFwzMlwyMzFcMVx1MDE1NFwyXDIzMVwxXHUwMTU0XDJcMjMxXDFcdTAxNTQiKwotICAgICJcMTBcMjMxXDFcdTAxNTRcM1wyMzFcMVx1MDE1NFw1XDIzMVwxXDBcMVx1MDE1NVwxXDExNCIrCi0gICAgIlwxXDIzNFwxXDExNFwxXDBcMVwxMTRcMVx1MDE1NVwxXDBcMVwxMTRcMVwwIisKLSAgICAiXDFcMTE0XDNcMFwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDAiKwotICAgICJcMVx1MDE1NVwyXDExNFwxXHUwMTU1XDJcMTE0XDFcdTAxNTVcMlwxMTRcMVwwXDRcMTE0IisKLSAgICAiXDFcMFwxXHUwMTU1XDJcMTE0XDFcMFwxXHUwMTU1XDJcMTE0XDRcMFwxXHUwMTU2IisKLSAgICAiXDFcMjM3XDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTU2XDFcMFwxXDIzNyIrCi0gICAgIlwxXDBcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzN1wxXDBcMVwyMzciKwotICAgICJcMTNcMFwxXHUwMTU2XDJcMjM3XDFcdTAxNTZcMlwyMzdcMVx1MDE1NlwyXDIzN1wxXDAiKwotICAgICJcNFwyMzdcMVwwXDFcdTAxNTZcMlwyMzdcMVwwXDFcdTAxNTZcMlwyMzdcNFwwIisKLSAgICAiXDFcdTAxNTdcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyXDFcdTAxNTdcMVwwIisKLSAgICAiXDFcMTIyXDFcMFwxXDEyMlwzXDBcMlwxMjJcMlwwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMVx1MDE1N1wyXDEyMlwxXHUwMTU3XDJcMTIyXDFcdTAxNTdcMlwxMjIiKwotICAgICJcMVwwXDRcMTIyXDFcMFwxXHUwMTU3XDJcMTIyXDFcMFwxXHUwMTU3XDJcMTIyIisKLSAgICAiXDRcMFwxXHUwMTU4XDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjUwXDFcMjQ2XDFcdTAxNTgiKwotICAgICJcMzNcMjQ2XDFcdTAxNThcMlwyNDZcMVx1MDE1OFwyXDI0NlwxXHUwMTU4XDEwXDI0NlwxXHUwMTU4IisKLSAgICAiXDNcMjQ2XDFcdTAxNThcNVwyNDZcMVwwXDFcdTAxNTlcMVwyNTFcMVwyNTJcM1wyNTEiKwotICAgICJcMVx1MDE1OVwxXDI1MFwzMlwyNTFcMVx1MDE1OVwyXDI1MVwxXHUwMTU5XDJcMjUxXDFcdTAxNTkiKwotICAgICJcMTBcMjUxXDFcdTAxNTlcM1wyNTFcMVx1MDE1OVw1XDI1MVwxXDBcMVx1MDE1YVwxXDI1NiIrCi0gICAgIlwxXDI1N1wxXDI1NlwxXDBcMVwyNTZcMVx1MDE1YVwxXDBcMVwyNTZcMVwwIisKLSAgICAiXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTZcMVwwXDFcMjU2XDEzXDAiKwotICAgICJcMVx1MDE1YVwyXDI1NlwxXHUwMTVhXDJcMjU2XDFcdTAxNWFcMlwyNTZcMVwwXDRcMjU2IisKLSAgICAiXDFcMFwxXHUwMTVhXDJcMjU2XDFcMFwxXHUwMTVhXDJcMjU2XDRcMFwxXHUwMTViIisKLSAgICAiXDVcMFwxXHUwMTViXDNcMFwxXHUwMTBkXDVcMFwxXHUwMTViXDVcMFwxXHUwMTViIisKLSAgICAiXDEzXDBcMlx1MDE1YlwxXDBcMlx1MDE1YlwxXDBcMlx1MDE1Ylw3XDBcMlx1MDE1YiIrCi0gICAgIlwyXDBcMlx1MDE1Ylw1XDBcMVx1MDE1Y1w1XDBcMVx1MDE1Y1wxMVwwXDFcdTAxNWMiKwotICAgICJcNVwwXDFcdTAxNWNcMTNcMFwyXHUwMTVjXDFcMFwyXHUwMTVjXDFcMFwyXHUwMTVjIisKLSAgICAiXDdcMFwyXHUwMTVjXDJcMFwyXHUwMTVjXDVcMFwyXHUwMTM1XDFcdTAxMzZcMVx1MDE1ZCIrCi0gICAgIlwxXDBcMlx1MDEzNVwxXDBcMVx1MDE1ZFwxXHUwMTNhXDRcdTAxMzVcMlx1MDE1ZFw1XHUwMTM1IisKLSAgICAiXDFcMFw0NVx1MDEzNVwxXDBcMVx1MDE1ZVwxXHUwMTM1XDFcdTAxMzZcMVx1MDE1ZFwyXHUwMTM1IisKLSAgICAiXDFcdTAxNWVcMVx1MDEzNVwxXHUwMTVkXDFcdTAxNWZcNFx1MDEzNVwyXHUwMTVkXDIyXHUwMTM1XDFcdTAxNWUiKwotICAgICJcMlx1MDEzNVwxXHUwMTVlXDJcdTAxMzVcMVx1MDE1ZVwxMFx1MDEzNVwxXHUwMTVlXDNcdTAxMzVcMVx1MDE1ZSIrCi0gICAgIlw1XHUwMTM1XDFcMFwyXHUwMTM4XDFcdTAxNjBcMVwwXDFcdTAxNWRcMTFcdTAxMzhcMlwwIisKLSAgICAiXDUzXHUwMTM4XDFcMFwyXHUwMTM5XDFcdTAxNjFcMVwwXDNcdTAxMzlcMVx1MDE1ZFw2XHUwMTM5IisKLSAgICAiXDJcMFw1M1x1MDEzOVwyNFwwXDFcdTAxNjJcNTBcMFwxXHUwMTYzXDFcMzJcMVwxNDciKwotICAgICJcMVwzMlwxXDBcMVwzMlwxXHUwMTYzXDFcMFwxXDMyXDFcMFwxXDMyIisKLSAgICAiXDNcMFwyXDMyXDJcMFwzXDMyXDFcMFwxXDMyXDEzXDBcMVx1MDE2MyIrCi0gICAgIlwyXDMyXDFcdTAxNjNcMlwzMlwxXHUwMTYzXDJcMzJcMVwwXDRcMzJcMVwwIisKLSAgICAiXDFcdTAxNjNcMlwzMlwxXDBcMVx1MDE2M1wyXDMyXDRcMFwxXHUwMTY0XDFcMTUyIisKLSAgICAiXDFcMTUzXDFcMTUyXDFcMFwxXDE1MlwxXHUwMTY0XDFcMFwxXDE1MlwxXDAiKwotICAgICJcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MlwxXDBcMVwxNTJcMTNcMCIrCi0gICAgIlwxXHUwMTY0XDJcMTUyXDFcdTAxNjRcMlwxNTJcMVx1MDE2NFwyXDE1MlwxXDBcNFwxNTIiKwotICAgICJcMVwwXDFcdTAxNjRcMlwxNTJcMVwwXDFcdTAxNjRcMlwxNTJcNFwwXDFcdTAxNjUiKwotICAgICJcMVwxNTRcMVwxNTVcMVwxNTRcMVwwXDFcMTU0XDFcdTAxNjVcMVwwXDFcMTU0IisKLSAgICAiXDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwXDNcMTU0XDFcMFwxXDE1NCIrCi0gICAgIlwxM1wwXDFcdTAxNjVcMlwxNTRcMVx1MDE2NVwyXDE1NFwxXHUwMTY1XDJcMTU0XDFcMCIrCi0gICAgIlw0XDE1NFwxXDBcMVx1MDE2NVwyXDE1NFwxXDBcMVx1MDE2NVwyXDE1NFw1NFwwIisKLSAgICAiXDJcdTAxNjZcNzRcMFwxXHUwMTY3XDEwNlwwXDJcdTAxNjhcNVwwXDFcdTAxNjlcMVwzNjciKwotICAgICJcMVwzNzBcMVwzNjdcMVwwXDFcMzY3XDFcdTAxNjlcMVwwXDFcMzY3XDFcdTAxMWEiKwotICAgICJcMVwzNjdcM1wwXDJcMzY3XDJcMFwzXDM2N1wxXDBcMVwzNjdcMTNcMCIrCi0gICAgIlwxXHUwMTY5XDJcMzY3XDFcdTAxNjlcMlwzNjdcMVx1MDE2OVwyXDM2N1wxXDBcNFwzNjciKwotICAgICJcMVwwXDFcdTAxNjlcMlwzNjdcMVwwXDFcdTAxNjlcMlwzNjdcNFwwXDFcdTAxNmEiKwotICAgICJcMVwxNzFcMVwxNzJcMVwxNzFcMVwwXDFcMTcxXDFcdTAxNmFcMVwwXDFcMTcxIisKLSAgICAiXDFcMFwxXDE3MVwzXDBcMlwxNzFcMlwwXDNcMTcxXDFcMzA0XDFcMTcxIisKLSAgICAiXDEzXDBcMVx1MDE2YVwyXDE3MVwxXHUwMTZhXDJcMTcxXDFcdTAxNmFcMlwxNzFcMVwwIisKLSAgICAiXDRcMTcxXDFcMFwxXHUwMTZhXDJcMTcxXDFcMFwxXHUwMTZhXDJcMTcxXDRcMCIrCi0gICAgIlwxXHUwMTZiXDFcMTczXDFcMTc0XDFcMTczXDFcMTc1XDFcMTczXDFcdTAxNmJcMzNcMTczIisKLSAgICAiXDFcdTAxNmJcMlwxNzNcMVx1MDE2YlwyXDE3M1wxXHUwMTZiXDEwXDE3M1wxXHUwMTZiXDNcMTczIisKLSAgICAiXDFcdTAxNmJcNVwxNzNcMVwwXDFcdTAxNmNcMVwxNzZcMVwxNzdcM1wxNzZcMVx1MDE2YyIrCi0gICAgIlwxXDE3NVwzMlwxNzZcMVx1MDE2Y1wyXDE3NlwxXHUwMTZjXDJcMTc2XDFcdTAxNmNcMTBcMTc2IisKLSAgICAiXDFcdTAxNmNcM1wxNzZcMVx1MDE2Y1w1XDE3NlwxXDBcMVx1MDE2ZFwxXDIwMVwxXDIwMiIrCi0gICAgIlwxXDIwMVwxXDIwM1wxXDIwMVwxXHUwMTZkXDMzXDIwMVwxXHUwMTZkXDJcMjAxXDFcdTAxNmQiKwotICAgICJcMlwyMDFcMVx1MDE2ZFwxMFwyMDFcMVx1MDE2ZFwzXDIwMVwxXHUwMTZkXDVcMjAxXDFcMCIrCi0gICAgIlwxXHUwMTZlXDFcMjA0XDFcMjA1XDNcMjA0XDFcdTAxNmVcMVwyMDNcMzJcMjA0XDFcdTAxNmUiKwotICAgICJcMlwyMDRcMVx1MDE2ZVwyXDIwNFwxXHUwMTZlXDEwXDIwNFwxXHUwMTZlXDNcMjA0XDFcdTAxNmUiKwotICAgICJcNVwyMDRcNFwwXDFcdTAxNDlcMVwwXDFcdTAxNDlcMlwwXDFcdTAxNDlcMVx1MDEyNSIrCi0gICAgIlw0XDBcMlx1MDE0OVw1NFwwXDFcdTAxNmZcMVx1MDEyMVwxXHUwMTIyXDFcdTAxMjFcMVwwIisKLSAgICAiXDFcdTAxMjFcMVx1MDE2ZlwxXDBcMVx1MDEyMVwxXHUwMTI1XDEzXHUwMTIxXDFcMFwxNFx1MDEyMSIrCi0gICAgIlwxXHUwMTZmXDJcdTAxMjFcMVx1MDE2ZlwyXHUwMTIxXDFcdTAxNmZcMTBcdTAxMjFcMVx1MDE2ZlwzXHUwMTIxIisKLSAgICAiXDFcdTAxNmZcNVx1MDEyMVwxXDBcMVx1MDE3MFwxXHUwMTIzXDFcdTAxNGNcMVx1MDEyM1wxXHUwMTcxIisKLSAgICAiXDFcdTAxMjNcMVx1MDE3MFwxMFx1MDEyM1wxXHUwMTcyXDIyXHUwMTIzXDFcdTAxNzBcMlx1MDEyM1wxXHUwMTcwIisKLSAgICAiXDJcdTAxMjNcMVx1MDE3MFwxMFx1MDEyM1wxXHUwMTcwXDNcdTAxMjNcMVx1MDE3MFw1XHUwMTIzXDFcMCIrCi0gICAgIlwxXHUwMTczXDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxNzNcMVx1MDE3NFw3XHUwMTI0XDFcdTAxNzUiKwotICAgICJcMjJcdTAxMjRcMVx1MDE3M1wyXHUwMTI0XDFcdTAxNzNcMlx1MDEyNFwxXHUwMTczXDEwXHUwMTI0XDFcdTAxNzMiKwotICAgICJcM1x1MDEyNFwxXHUwMTczXDVcdTAxMjRcMVwwXDFcdTAxNzZcMVw2MFwxXDIwN1wxXDYwIisKLSAgICAiXDFcMFwxXDYwXDFcdTAxNzZcMVwwXDFcNjBcMVwwXDFcNjBcM1wwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMVwwXDFcNjBcMTNcMFwxXHUwMTc2XDJcNjAiKwotICAgICJcMVx1MDE3NlwyXDYwXDFcdTAxNzZcMlw2MFwxXDBcNFw2MFwxXDBcMVx1MDE3NiIrCi0gICAgIlwyXDYwXDFcMFwxXHUwMTc2XDJcNjBcNFwwXDFcdTAxNzdcMVw2NFwxXDIxMiIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcdTAxNzdcMVwwXDFcNjRcMVwwXDFcNjQiKwotICAgICJcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMFwxXHUwMTc3IisKLSAgICAiXDJcNjRcMVx1MDE3N1wyXDY0XDFcdTAxNzdcMlw2NFwxXDBcNFw2NFwxXDAiKwotICAgICJcMVx1MDE3N1wyXDY0XDFcMFwxXHUwMTc3XDJcNjRcNFwwXDFcdTAxNzhcMVw3MSIrCi0gICAgIlwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcdTAxNzhcMVwwXDFcNzFcMVwwIisKLSAgICAiXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxXHUwMTc4XDJcNzFcMVx1MDE3OFwyXDcxXDFcdTAxNzhcMlw3MVwxXDBcNFw3MSIrCi0gICAgIlwxXDBcMVx1MDE3OFwyXDcxXDFcMFwxXHUwMTc4XDJcNzFcNFwwXDFcdTAxNzkiKwotICAgICJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcdTAxNzlcMVwwXDFcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxM1wwXDFcdTAxNzlcMlwxMDFcMVx1MDE3OVwyXDEwMVwxXHUwMTc5XDJcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcMVx1MDE3OVwyXDEwMVwxXDBcMVx1MDE3OVwyXDEwMVw0XDAiKwotICAgICJcMVx1MDE3YVwxXDEwN1wxXDIyNFwxXDEwN1wxXDBcMVwxMDdcMVx1MDE3YVwxXDAiKwotICAgICJcMVwxMDdcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwIisKLSAgICAiXDFcMTA3XDEzXDBcMVx1MDE3YVwyXDEwN1wxXHUwMTdhXDJcMTA3XDFcdTAxN2FcMlwxMDciKwotICAgICJcMVwwXDRcMTA3XDFcMFwxXHUwMTdhXDJcMTA3XDFcMFwxXHUwMTdhXDJcMTA3IisKLSAgICAiXDRcMFwxXHUwMTdiXDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2XDFcdTAxN2IiKwotICAgICJcMzNcMjI2XDFcdTAxN2JcMlwyMjZcMVx1MDE3YlwyXDIyNlwxXHUwMTdiXDEwXDIyNlwxXHUwMTdiIisKLSAgICAiXDNcMjI2XDFcdTAxN2JcNVwyMjZcMVwwXDFcdTAxN2NcMVwyMzFcMVwyMzJcM1wyMzEiKwotICAgICJcMVx1MDE3Y1wxXDIzMFwzMlwyMzFcMVx1MDE3Y1wyXDIzMVwxXHUwMTdjXDJcMjMxXDFcdTAxN2MiKwotICAgICJcMTBcMjMxXDFcdTAxN2NcM1wyMzFcMVx1MDE3Y1w1XDIzMVwxXDBcMVx1MDE3ZFwxXDExNCIrCi0gICAgIlwxXDIzNFwxXDExNFwxXDBcMVwxMTRcMVx1MDE3ZFwxXDBcMVwxMTRcMVwwIisKLSAgICAiXDFcMTE0XDNcMFwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDAiKwotICAgICJcMVx1MDE3ZFwyXDExNFwxXHUwMTdkXDJcMTE0XDFcdTAxN2RcMlwxMTRcMVwwXDRcMTE0IisKLSAgICAiXDFcMFwxXHUwMTdkXDJcMTE0XDFcMFwxXHUwMTdkXDJcMTE0XDRcMFwxXHUwMTdlIisKLSAgICAiXDFcMjM3XDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTdlXDFcMFwxXDIzNyIrCi0gICAgIlwxXDBcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzN1wxXDBcMVwyMzciKwotICAgICJcMTNcMFwxXHUwMTdlXDJcMjM3XDFcdTAxN2VcMlwyMzdcMVx1MDE3ZVwyXDIzN1wxXDAiKwotICAgICJcNFwyMzdcMVwwXDFcdTAxN2VcMlwyMzdcMVwwXDFcdTAxN2VcMlwyMzdcNFwwIisKLSAgICAiXDFcdTAxN2ZcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyXDFcdTAxN2ZcMVwwIisKLSAgICAiXDFcMTIyXDFcMFwxXDEyMlwzXDBcMlwxMjJcMlwwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMVx1MDE3ZlwyXDEyMlwxXHUwMTdmXDJcMTIyXDFcdTAxN2ZcMlwxMjIiKwotICAgICJcMVwwXDRcMTIyXDFcMFwxXHUwMTdmXDJcMTIyXDFcMFwxXHUwMTdmXDJcMTIyIisKLSAgICAiXDRcMFwxXHUwMTgwXDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjUwXDFcMjQ2XDFcdTAxODAiKwotICAgICJcMzNcMjQ2XDFcdTAxODBcMlwyNDZcMVx1MDE4MFwyXDI0NlwxXHUwMTgwXDEwXDI0NlwxXHUwMTgwIisKLSAgICAiXDNcMjQ2XDFcdTAxODBcNVwyNDZcMVwwXDFcdTAxODFcMVwyNTFcMVwyNTJcM1wyNTEiKwotICAgICJcMVx1MDE4MVwxXDI1MFwzMlwyNTFcMVx1MDE4MVwyXDI1MVwxXHUwMTgxXDJcMjUxXDFcdTAxODEiKwotICAgICJcMTBcMjUxXDFcdTAxODFcM1wyNTFcMVx1MDE4MVw1XDI1MVwxXDBcMVx1MDE4MlwxXDI1NiIrCi0gICAgIlwxXDI1N1wxXDI1NlwxXDBcMVwyNTZcMVx1MDE4MlwxXDBcMVwyNTZcMVwwIisKLSAgICAiXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTZcMVwwXDFcMjU2XDEzXDAiKwotICAgICJcMVx1MDE4MlwyXDI1NlwxXHUwMTgyXDJcMjU2XDFcdTAxODJcMlwyNTZcMVwwXDRcMjU2IisKLSAgICAiXDFcMFwxXHUwMTgyXDJcMjU2XDFcMFwxXHUwMTgyXDJcMjU2XDRcMFwxXHUwMTgzIisKLSAgICAiXDVcMFwxXHUwMTgzXDNcMFwxXHUwMTBkXDVcMFwxXHUwMTgzXDVcMFwxXHUwMTgzIisKLSAgICAiXDEzXDBcMlx1MDE4M1wxXDBcMlx1MDE4M1wxXDBcMlx1MDE4M1w3XDBcMlx1MDE4MyIrCi0gICAgIlwyXDBcMlx1MDE4M1w1XDBcMVx1MDE4NFw1XDBcMVx1MDE4NFwxMVwwXDFcdTAxODQiKwotICAgICJcNVwwXDFcdTAxODRcMTNcMFwyXHUwMTg0XDFcMFwyXHUwMTg0XDFcMFwyXHUwMTg0IisKLSAgICAiXDdcMFwyXHUwMTg0XDJcMFwyXHUwMTg0XDEwXDBcMVx1MDE1ZFwxXDBcMVx1MDE1ZCIrCi0gICAgIlwyXDBcMVx1MDE1ZFwxXHUwMTNhXDRcMFwyXHUwMTVkXDU0XDBcMVx1MDE4NVwxXHUwMTM1IisKLSAgICAiXDFcdTAxMzZcMVx1MDEzNVwxXDBcMVx1MDEzNVwxXHUwMTg1XDFcMFwxXHUwMTM1XDFcdTAxM2EiKwotICAgICJcMTNcdTAxMzVcMVwwXDE0XHUwMTM1XDFcdTAxODVcMlx1MDEzNVwxXHUwMTg1XDJcdTAxMzVcMVx1MDE4NSIrCi0gICAgIlwxMFx1MDEzNVwxXHUwMTg1XDNcdTAxMzVcMVx1MDE4NVw1XHUwMTM1XDFcMFwxXHUwMTg2XDFcdTAxMzgiKwotICAgICJcMVx1MDE2MFwxXHUwMTM4XDFcdTAxODdcMVx1MDEzOFwxXHUwMTg2XDEwXHUwMTM4XDFcdTAxODhcMjJcdTAxMzgiKwotICAgICJcMVx1MDE4NlwyXHUwMTM4XDFcdTAxODZcMlx1MDEzOFwxXHUwMTg2XDEwXHUwMTM4XDFcdTAxODZcM1x1MDEzOCIrCi0gICAgIlwxXHUwMTg2XDVcdTAxMzhcMVwwXDFcdTAxODlcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDE4OSIrCi0gICAgIlwxXHUwMThhXDdcdTAxMzlcMVx1MDE4YlwyMlx1MDEzOVwxXHUwMTg5XDJcdTAxMzlcMVx1MDE4OVwyXHUwMTM5IisKLSAgICAiXDFcdTAxODlcMTBcdTAxMzlcMVx1MDE4OVwzXHUwMTM5XDFcdTAxODlcNVx1MDEzOVw1M1wwXDFcdTAxOGMiKwotICAgICJcMjFcMFwyXDMyXDFcMTQ3XDFcMzJcMVwwXDJcMzJcMVwwXDFcMzIiKwotICAgICJcMVwwXDFcMzJcM1wwXDJcMzJcMlwwXDNcMzJcMVwwXDFcMzIiKwotICAgICJcMTNcMFwxMVwzMlwxXDBcNFwzMlwxXDBcM1wzMlwxXDBcM1wzMiIrCi0gICAgIlw0XDBcMVx1MDE4ZFwxXDE1MlwxXDE1M1wxXDE1MlwxXDBcMVwxNTJcMVx1MDE4ZCIrCi0gICAgIlwxXDBcMVwxNTJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTIiKwotICAgICJcMVwwXDFcMTUyXDEzXDBcMVx1MDE4ZFwyXDE1MlwxXHUwMThkXDJcMTUyXDFcdTAxOGQiKwotICAgICJcMlwxNTJcMVwwXDRcMTUyXDFcMFwxXHUwMThkXDJcMTUyXDFcMFwxXHUwMThkIisKLSAgICAiXDJcMTUyXDRcMFwxXHUwMThlXDFcMTU0XDFcMTU1XDFcMTU0XDFcMFwxXDE1NCIrCi0gICAgIlwxXHUwMThlXDFcMFwxXDE1NFwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMCIrCi0gICAgIlwzXDE1NFwxXDBcMVwxNTRcMTNcMFwxXHUwMThlXDJcMTU0XDFcdTAxOGVcMlwxNTQiKwotICAgICJcMVx1MDE4ZVwyXDE1NFwxXDBcNFwxNTRcMVwwXDFcdTAxOGVcMlwxNTRcMVwwIisKLSAgICAiXDFcdTAxOGVcMlwxNTRcNTZcMFwxXHUwMThmXDY2XDBcMlx1MDE5MFwyNVwwXDFcdTAxOTEiKwotICAgICJcMVwzNjdcMVwzNzBcMVwzNjdcMVwwXDFcMzY3XDFcdTAxOTFcMVwwXDFcMzY3IisKLSAgICAiXDFcdTAxMWFcMVwzNjdcM1wwXDJcMzY3XDJcMFwzXDM2N1wxXDBcMVwzNjciKwotICAgICJcMTNcMFwxXHUwMTkxXDJcMzY3XDFcdTAxOTFcMlwzNjdcMVx1MDE5MVwyXDM2N1wxXDAiKwotICAgICJcNFwzNjdcMVwwXDFcdTAxOTFcMlwzNjdcMVwwXDFcdTAxOTFcMlwzNjdcNFwwIisKLSAgICAiXDFcdTAxOTJcMVwxNzFcMVwxNzJcMVwxNzFcMVwwXDFcMTcxXDFcdTAxOTJcMVwwIisKLSAgICAiXDFcMTcxXDFcMFwxXDE3MVwzXDBcMlwxNzFcMlwwXDNcMTcxXDFcMzA0IisKLSAgICAiXDFcMTcxXDEzXDBcMVx1MDE5MlwyXDE3MVwxXHUwMTkyXDJcMTcxXDFcdTAxOTJcMlwxNzEiKwotICAgICJcMVwwXDRcMTcxXDFcMFwxXHUwMTkyXDJcMTcxXDFcMFwxXHUwMTkyXDJcMTcxIisKLSAgICAiXDRcMFwxXHUwMTkzXDFcMTczXDFcMTc0XDFcMTczXDFcMTc1XDFcMTczXDFcdTAxOTMiKwotICAgICJcMzNcMTczXDFcdTAxOTNcMlwxNzNcMVx1MDE5M1wyXDE3M1wxXHUwMTkzXDEwXDE3M1wxXHUwMTkzIisKLSAgICAiXDNcMTczXDFcdTAxOTNcNVwxNzNcMVwwXDFcdTAxOTRcMVwxNzZcMVwxNzdcM1wxNzYiKwotICAgICJcMVx1MDE5NFwxXDE3NVwzMlwxNzZcMVx1MDE5NFwyXDE3NlwxXHUwMTk0XDJcMTc2XDFcdTAxOTQiKwotICAgICJcMTBcMTc2XDFcdTAxOTRcM1wxNzZcMVx1MDE5NFw1XDE3NlwxXDBcMVx1MDE5NVwxXDIwMSIrCi0gICAgIlwxXDIwMlwxXDIwMVwxXDIwM1wxXDIwMVwxXHUwMTk1XDMzXDIwMVwxXHUwMTk1XDJcMjAxIisKLSAgICAiXDFcdTAxOTVcMlwyMDFcMVx1MDE5NVwxMFwyMDFcMVx1MDE5NVwzXDIwMVwxXHUwMTk1XDVcMjAxIisKLSAgICAiXDFcMFwxXHUwMTk2XDFcMjA0XDFcMjA1XDNcMjA0XDFcdTAxOTZcMVwyMDNcMzJcMjA0IisKLSAgICAiXDFcdTAxOTZcMlwyMDRcMVx1MDE5NlwyXDIwNFwxXHUwMTk2XDEwXDIwNFwxXHUwMTk2XDNcMjA0IisKLSAgICAiXDFcdTAxOTZcNVwyMDRcMVwwXDFcdTAxOTdcMVx1MDEyMVwxXHUwMTIyXDFcdTAxMjFcMVwwIisKLSAgICAiXDFcdTAxMjFcMVx1MDE5N1wxXDBcMVx1MDEyMVwxXHUwMTI1XDEzXHUwMTIxXDFcMFwxNFx1MDEyMSIrCi0gICAgIlwxXHUwMTk3XDJcdTAxMjFcMVx1MDE5N1wyXHUwMTIxXDFcdTAxOTdcMTBcdTAxMjFcMVx1MDE5N1wzXHUwMTIxIisKLSAgICAiXDFcdTAxOTdcNVx1MDEyMVwxXDBcMVx1MDE5OFwxXHUwMTIzXDFcdTAxNGNcMVx1MDEyM1wxXHUwMTQ5IisKLSAgICAiXDFcdTAxMjNcMVx1MDE5OFwzM1x1MDEyM1wxXHUwMTk4XDJcdTAxMjNcMVx1MDE5OFwyXHUwMTIzXDFcdTAxOTgiKwotICAgICJcMTBcdTAxMjNcMVx1MDE5OFwzXHUwMTIzXDFcdTAxOThcNVx1MDEyM1wxXDBcMlx1MDEyM1wxXHUwMTRjIisKLSAgICAiXDJcdTAxNDlcMVx1MDE3MVwyXHUwMTIzXDFcdTAxNzFcMVx1MDE5OVw0XHUwMTIzXDJcdTAxNDlcNTNcdTAxMjMiKwotICAgICJcMVwwXDJcdTAxMjNcMVx1MDE0Y1wxXDBcMVx1MDE0OVwxMlx1MDEyM1wxXDBcNTNcdTAxMjMiKwotICAgICJcMVwwXDFcdTAxOWFcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDE5YVwxXHUwMTQ5XDMyXHUwMTI0IisKLSAgICAiXDFcdTAxOWFcMlx1MDEyNFwxXHUwMTlhXDJcdTAxMjRcMVx1MDE5YVwxMFx1MDEyNFwxXHUwMTlhXDNcdTAxMjQiKwotICAgICJcMVx1MDE5YVw1XHUwMTI0XDFcMFwyXHUwMTI0XDFcdTAxNGRcMVx1MDE0OVwxXHUwMTI0XDFcdTAxNzQiKwotICAgICJcMVx1MDEyNFwxXHUwMTQ5XDFcdTAxNzRcMVx1MDE5Ylw0XHUwMTI0XDJcdTAxNDlcNTNcdTAxMjRcMVwwIisKLSAgICAiXDJcdTAxMjRcMVx1MDE0ZFwxXDBcM1x1MDEyNFwxXHUwMTQ5XDdcdTAxMjRcMVwwXDUzXHUwMTI0IisKLSAgICAiXDFcMFwyXDYwXDFcMjA3XDFcNjBcMVwwXDJcNjBcMVwwXDFcNjAiKwotICAgICJcMVwwXDFcNjBcM1wwXDJcNjBcMlwwXDNcNjBcMVwwXDFcNjAiKwotICAgICJcMTNcMFwxMVw2MFwxXDBcNFw2MFwxXDBcM1w2MFwxXDBcM1w2MCIrCi0gICAgIlw0XDBcMlw2NFwxXDIxMlwxXDY0XDFcMFwyXDY0XDFcMFwxXDY0IisKLSAgICAiXDFcMFwxXDY0XDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0IisKLSAgICAiXDEzXDBcMTFcNjRcMVwwXDRcNjRcMVwwXDNcNjRcMVwwXDNcNjQiKwotICAgICJcNFwwXDJcNzFcMVwyMTVcMVw3MVwxXDBcMlw3MVwxXDBcMVw3MSIrCi0gICAgIlwxXDBcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MVwxXDBcMVw3MSIrCi0gICAgIlwxM1wwXDExXDcxXDFcMFw0XDcxXDFcMFwzXDcxXDFcMFwzXDcxIisKLSAgICAiXDRcMFwyXDEwMVwxXDIyMVwxXDEwMVwxXDBcMlwxMDFcMVwwXDFcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxM1wwXDExXDEwMVwxXDBcNFwxMDFcMVwwXDNcMTAxXDFcMFwzXDEwMSIrCi0gICAgIlw0XDBcMlwxMDdcMVwyMjRcMVwxMDdcMVwwXDJcMTA3XDFcMFwxXDEwNyIrCi0gICAgIlwxXDBcMVwxMDdcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDBcMVwxMDciKwotICAgICJcMTNcMFwxMVwxMDdcMVwwXDRcMTA3XDFcMFwzXDEwN1wxXDBcM1wxMDciKwotICAgICJcNFwwXDFcdTAxOWNcMVwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcMVwyMjZcMVx1MDE5YyIrCi0gICAgIlwzM1wyMjZcMVx1MDE5Y1wyXDIyNlwxXHUwMTljXDJcMjI2XDFcdTAxOWNcMTBcMjI2XDFcdTAxOWMiKwotICAgICJcM1wyMjZcMVx1MDE5Y1w1XDIyNlwxXDBcMVx1MDE5ZFwxXDIzMVwxXDIzMlwzXDIzMSIrCi0gICAgIlwxXHUwMTlkXDFcMjMwXDMyXDIzMVwxXHUwMTlkXDJcMjMxXDFcdTAxOWRcMlwyMzFcMVx1MDE5ZCIrCi0gICAgIlwxMFwyMzFcMVx1MDE5ZFwzXDIzMVwxXHUwMTlkXDVcMjMxXDFcMFwyXDExNFwxXDIzNCIrCi0gICAgIlwxXDExNFwxXDBcMlwxMTRcMVwwXDFcMTE0XDFcMFwxXDExNFwzXDAiKwotICAgICJcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwXDExXDExNFwxXDAiKwotICAgICJcNFwxMTRcMVwwXDNcMTE0XDFcMFwzXDExNFw0XDBcMVx1MDE5ZVwxXDIzNyIrCi0gICAgIlwxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDE5ZVwxXDBcMVwyMzdcMVwwIisKLSAgICAiXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3XDEzXDAiKwotICAgICJcMVx1MDE5ZVwyXDIzN1wxXHUwMTllXDJcMjM3XDFcdTAxOWVcMlwyMzdcMVwwXDRcMjM3IisKLSAgICAiXDFcMFwxXHUwMTllXDJcMjM3XDFcMFwxXHUwMTllXDJcMjM3XDRcMFwyXDEyMiIrCi0gICAgIlwxXDI0M1wxXDEyMlwxXDBcMlwxMjJcMVwwXDFcMTIyXDFcMFwxXDEyMiIrCi0gICAgIlwzXDBcMlwxMjJcMlwwXDNcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMTFcMTIyIisKLSAgICAiXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwXDNcMTIyXDRcMFwxXHUwMTlmIisKLSAgICAiXDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjUwXDFcMjQ2XDFcdTAxOWZcMzNcMjQ2XDFcdTAxOWYiKwotICAgICJcMlwyNDZcMVx1MDE5ZlwyXDI0NlwxXHUwMTlmXDEwXDI0NlwxXHUwMTlmXDNcMjQ2XDFcdTAxOWYiKwotICAgICJcNVwyNDZcMVwwXDFcdTAxYTBcMVwyNTFcMVwyNTJcM1wyNTFcMVx1MDFhMFwxXDI1MCIrCi0gICAgIlwzMlwyNTFcMVx1MDFhMFwyXDI1MVwxXHUwMWEwXDJcMjUxXDFcdTAxYTBcMTBcMjUxXDFcdTAxYTAiKwotICAgICJcM1wyNTFcMVx1MDFhMFw1XDI1MVwxXDBcMVx1MDFhMVwxXDI1NlwxXDI1N1wxXDI1NiIrCi0gICAgIlwxXDBcMVwyNTZcMVx1MDFhMVwxXDBcMVwyNTZcMVwwXDFcMjU2XDNcMCIrCi0gICAgIlwyXDI1NlwyXDBcM1wyNTZcMVwwXDFcMjU2XDEzXDBcMVx1MDFhMVwyXDI1NiIrCi0gICAgIlwxXHUwMWExXDJcMjU2XDFcdTAxYTFcMlwyNTZcMVwwXDRcMjU2XDFcMFwxXHUwMWExIisKLSAgICAiXDJcMjU2XDFcMFwxXHUwMWExXDJcMjU2XDRcMFwxXHUwMWEyXDVcMFwxXHUwMWEyIisKLSAgICAiXDNcMFwxXHUwMTBkXDVcMFwxXHUwMWEyXDVcMFwxXHUwMWEyXDEzXDBcMlx1MDFhMiIrCi0gICAgIlwxXDBcMlx1MDFhMlwxXDBcMlx1MDFhMlw3XDBcMlx1MDFhMlwyXDBcMlx1MDFhMiIrCi0gICAgIlw1XDBcMVx1MDFhM1w1XDBcMVx1MDFhM1wxMVwwXDFcdTAxYTNcNVwwXDFcdTAxYTMiKwotICAgICJcMTNcMFwyXHUwMWEzXDFcMFwyXHUwMWEzXDFcMFwyXHUwMWEzXDdcMFwyXHUwMWEzIisKLSAgICAiXDJcMFwyXHUwMWEzXDVcMFwxXHUwMWE0XDFcdTAxMzVcMVx1MDEzNlwxXHUwMTM1XDFcMCIrCi0gICAgIlwxXHUwMTM1XDFcdTAxYTRcMVwwXDFcdTAxMzVcMVx1MDEzYVwxM1x1MDEzNVwxXDBcMTRcdTAxMzUiKwotICAgICJcMVx1MDFhNFwyXHUwMTM1XDFcdTAxYTRcMlx1MDEzNVwxXHUwMWE0XDEwXHUwMTM1XDFcdTAxYTRcM1x1MDEzNSIrCi0gICAgIlwxXHUwMWE0XDVcdTAxMzVcMVwwXDFcdTAxYTVcMVx1MDEzOFwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZCIrCi0gICAgIlwxXHUwMTM4XDFcdTAxYTVcMzNcdTAxMzhcMVx1MDFhNVwyXHUwMTM4XDFcdTAxYTVcMlx1MDEzOFwxXHUwMWE1IisKLSAgICAiXDEwXHUwMTM4XDFcdTAxYTVcM1x1MDEzOFwxXHUwMWE1XDVcdTAxMzhcMVwwXDJcdTAxMzhcMVx1MDE2MCIrCi0gICAgIlwyXHUwMTVkXDFcdTAxODdcMlx1MDEzOFwxXHUwMTg3XDFcdTAxYTZcNFx1MDEzOFwyXHUwMTVkXDUzXHUwMTM4IisKLSAgICAiXDFcMFwyXHUwMTM4XDFcdTAxNjBcMVwwXDFcdTAxNWRcMTJcdTAxMzhcMVwwXDUzXHUwMTM4IisKLSAgICAiXDFcMFwxXHUwMWE3XDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYTdcMVx1MDE1ZFwzMlx1MDEzOSIrCi0gICAgIlwxXHUwMWE3XDJcdTAxMzlcMVx1MDFhN1wyXHUwMTM5XDFcdTAxYTdcMTBcdTAxMzlcMVx1MDFhN1wzXHUwMTM5IisKLSAgICAiXDFcdTAxYTdcNVx1MDEzOVwxXDBcMlx1MDEzOVwxXHUwMTYxXDFcdTAxNWRcMVx1MDEzOVwxXHUwMThhIisKLSAgICAiXDFcdTAxMzlcMVx1MDE1ZFwxXHUwMThhXDFcdTAxYThcNFx1MDEzOVwyXHUwMTVkXDUzXHUwMTM5XDFcMCIrCi0gICAgIlwyXHUwMTM5XDFcdTAxNjFcMVwwXDNcdTAxMzlcMVx1MDE1ZFw3XHUwMTM5XDFcMFw1M1x1MDEzOSIrCi0gICAgIlw0NlwwXDJcdTAxYTlcMjVcMFwyXDE1MlwxXDE1M1wxXDE1MlwxXDBcMlwxNTIiKwotICAgICJcMVwwXDFcMTUyXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyIisKLSAgICAiXDFcMFwxXDE1MlwxM1wwXDExXDE1MlwxXDBcNFwxNTJcMVwwXDNcMTUyIisKLSAgICAiXDFcMFwzXDE1Mlw0XDBcMlwxNTRcMVwxNTVcMVwxNTRcMVwwXDJcMTU0IisKLSAgICAiXDFcMFwxXDE1NFwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMFwzXDE1NCIrCi0gICAgIlwxXDBcMVwxNTRcMTNcMFwxMVwxNTRcMVwwXDRcMTU0XDFcMFwzXDE1NCIrCi0gICAgIlwxXDBcM1wxNTRcNDZcMFwyXHUwMWFhXDMwXDBcMVx1MDFhYlwxXDM2N1wxXDM3MCIrCi0gICAgIlwxXDM2N1wxXDBcMVwzNjdcMVx1MDFhYlwxXDBcMVwzNjdcMVx1MDExYVwxXDM2NyIrCi0gICAgIlwzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwXDFcdTAxYWIiKwotICAgICJcMlwzNjdcMVx1MDFhYlwyXDM2N1wxXHUwMWFiXDJcMzY3XDFcMFw0XDM2N1wxXDAiKwotICAgICJcMVx1MDFhYlwyXDM2N1wxXDBcMVx1MDFhYlwyXDM2N1w0XDBcMlwxNzFcMVwxNzIiKwotICAgICJcMVwxNzFcMVwwXDJcMTcxXDFcMFwxXDE3MVwxXDBcMVwxNzFcM1wwIisKLSAgICAiXDJcMTcxXDJcMFwzXDE3MVwxXDMwNFwxXDE3MVwxM1wwXDExXDE3MVwxXDAiKwotICAgICJcNFwxNzFcMVwwXDNcMTcxXDFcMFwzXDE3MVw0XDBcMlwxNzNcMVwxNzQiKwotICAgICJcMVwxNzNcMVwxNzVcNjZcMTczXDFcMFwyXDE3NlwxXDE3N1w0XDE3NlwxXDE3NSIrCi0gICAgIlw2M1wxNzZcMVwwXDJcMjAxXDFcMjAyXDFcMjAxXDFcMjAzXDY2XDIwMVwxXDAiKwotICAgICJcMlwyMDRcMVwyMDVcNFwyMDRcMVwyMDNcNjNcMjA0XDFcMFwxXHUwMWFjXDFcdTAxMjEiKwotICAgICJcMVx1MDEyMlwxXHUwMTIxXDFcMFwxXHUwMTIxXDFcdTAxYWNcMVwwXDFcdTAxMjFcMVx1MDEyNSIrCi0gICAgIlwxM1x1MDEyMVwxXDBcMTRcdTAxMjFcMVx1MDFhY1wyXHUwMTIxXDFcdTAxYWNcMlx1MDEyMVwxXHUwMWFjIisKLSAgICAiXDEwXHUwMTIxXDFcdTAxYWNcM1x1MDEyMVwxXHUwMWFjXDVcdTAxMjFcMVwwXDFcdTAxYWRcMVx1MDEyMyIrCi0gICAgIlwxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OVwxXHUwMTIzXDFcdTAxYWRcMzNcdTAxMjNcMVx1MDFhZFwyXHUwMTIzIisKLSAgICAiXDFcdTAxYWRcMlx1MDEyM1wxXHUwMWFkXDEwXHUwMTIzXDFcdTAxYWRcM1x1MDEyM1wxXHUwMWFkXDVcdTAxMjMiKwotICAgICJcMVwwXDFcdTAxYWVcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDFhZVwxXHUwMTQ5XDMyXHUwMTI0IisKLSAgICAiXDFcdTAxYWVcMlx1MDEyNFwxXHUwMWFlXDJcdTAxMjRcMVx1MDFhZVwxMFx1MDEyNFwxXHUwMWFlXDNcdTAxMjQiKwotICAgICJcMVx1MDFhZVw1XHUwMTI0XDFcMFwyXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFw2NlwyMjYiKwotICAgICJcMVwwXDJcMjMxXDFcMjMyXDRcMjMxXDFcMjMwXDYzXDIzMVwxXDBcMlwyMzciKwotICAgICJcMVwyNDBcMVwyMzdcMVwwXDJcMjM3XDFcMFwxXDIzN1wxXDBcMVwyMzciKwotICAgICJcM1wwXDJcMjM3XDJcMFwzXDIzN1wxXDBcMVwyMzdcMTNcMFwxMVwyMzciKwotICAgICJcMVwwXDRcMjM3XDFcMFwzXDIzN1wxXDBcM1wyMzdcNFwwXDJcMjQ2IisKLSAgICAiXDFcMjQ3XDFcMjQ2XDFcMjUwXDY2XDI0NlwxXDBcMlwyNTFcMVwyNTJcNFwyNTEiKwotICAgICJcMVwyNTBcNjNcMjUxXDFcMFwyXDI1NlwxXDI1N1wxXDI1NlwxXDBcMlwyNTYiKwotICAgICJcMVwwXDFcMjU2XDFcMFwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2IisKLSAgICAiXDFcMFwxXDI1NlwxM1wwXDExXDI1NlwxXDBcNFwyNTZcMVwwXDNcMjU2IisKLSAgICAiXDFcMFwzXDI1NlwxNlwwXDFcdTAxMGRcNjFcMFwxXHUwMWFmXDVcMFwxXHUwMWFmIisKLSAgICAiXDExXDBcMVx1MDFhZlw1XDBcMVx1MDFhZlwxM1wwXDJcdTAxYWZcMVwwXDJcdTAxYWYiKwotICAgICJcMVwwXDJcdTAxYWZcN1wwXDJcdTAxYWZcMlwwXDJcdTAxYWZcNVwwXDFcdTAxYjAiKwotICAgICJcMVx1MDEzNVwxXHUwMTM2XDFcdTAxMzVcMVwwXDFcdTAxMzVcMVx1MDFiMFwxXDBcMVx1MDEzNSIrCi0gICAgIlwxXHUwMTNhXDEzXHUwMTM1XDFcMFwxNFx1MDEzNVwxXHUwMWIwXDJcdTAxMzVcMVx1MDFiMFwyXHUwMTM1IisKLSAgICAiXDFcdTAxYjBcMTBcdTAxMzVcMVx1MDFiMFwzXHUwMTM1XDFcdTAxYjBcNVx1MDEzNVwxXDBcMVx1MDFiMSIrCi0gICAgIlwxXHUwMTM4XDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkXDFcdTAxMzhcMVx1MDFiMVwzM1x1MDEzOFwxXHUwMWIxIisKLSAgICAiXDJcdTAxMzhcMVx1MDFiMVwyXHUwMTM4XDFcdTAxYjFcMTBcdTAxMzhcMVx1MDFiMVwzXHUwMTM4XDFcdTAxYjEiKwotICAgICJcNVx1MDEzOFwxXDBcMVx1MDFiMlwxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWIyXDFcdTAxNWQiKwotICAgICJcMzJcdTAxMzlcMVx1MDFiMlwyXHUwMTM5XDFcdTAxYjJcMlx1MDEzOVwxXHUwMWIyXDEwXHUwMTM5XDFcdTAxYjIiKwotICAgICJcM1x1MDEzOVwxXHUwMWIyXDVcdTAxMzlcNzBcMFwxXHUwMWIzXDU0XDBcMlx1MDFiNFwyMlwwIisKLSAgICAiXDFcdTAxYjVcMVwzNjdcMVwzNzBcMVwzNjdcMVwwXDFcMzY3XDFcdTAxYjVcMVwwIisKLSAgICAiXDFcMzY3XDFcdTAxMWFcMVwzNjdcM1wwXDJcMzY3XDJcMFwzXDM2N1wxXDAiKwotICAgICJcMVwzNjdcMTNcMFwxXHUwMWI1XDJcMzY3XDFcdTAxYjVcMlwzNjdcMVx1MDFiNVwyXDM2NyIrCi0gICAgIlwxXDBcNFwzNjdcMVwwXDFcdTAxYjVcMlwzNjdcMVwwXDFcdTAxYjVcMlwzNjciKwotICAgICJcNFwwXDFcdTAxYjZcMVx1MDEyMVwxXHUwMTIyXDFcdTAxMjFcMVwwXDFcdTAxMjFcMVx1MDFiNiIrCi0gICAgIlwxXDBcMVx1MDEyMVwxXHUwMTI1XDEzXHUwMTIxXDFcMFwxNFx1MDEyMVwxXHUwMWI2XDJcdTAxMjEiKwotICAgICJcMVx1MDFiNlwyXHUwMTIxXDFcdTAxYjZcMTBcdTAxMjFcMVx1MDFiNlwzXHUwMTIxXDFcdTAxYjZcNVx1MDEyMSIrCi0gICAgIlwxXDBcMVx1MDFiN1wxXHUwMTIzXDFcdTAxNGNcMVx1MDEyM1wxXHUwMTQ5XDFcdTAxMjNcMVx1MDFiNyIrCi0gICAgIlwzM1x1MDEyM1wxXHUwMWI3XDJcdTAxMjNcMVx1MDFiN1wyXHUwMTIzXDFcdTAxYjdcMTBcdTAxMjNcMVx1MDFiNyIrCi0gICAgIlwzXHUwMTIzXDFcdTAxYjdcNVx1MDEyM1wxXDBcMVx1MDFiOFwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNCIrCi0gICAgIlwxXHUwMWI4XDFcdTAxNDlcMzJcdTAxMjRcMVx1MDFiOFwyXHUwMTI0XDFcdTAxYjhcMlx1MDEyNFwxXHUwMWI4IisKLSAgICAiXDEwXHUwMTI0XDFcdTAxYjhcM1x1MDEyNFwxXHUwMWI4XDVcdTAxMjRcMVwwXDFcdTAxYjlcNVwwIisKLSAgICAiXDFcdTAxYjlcMTFcMFwxXHUwMWI5XDVcMFwxXHUwMWI5XDEzXDBcMlx1MDFiOVwxXDAiKwotICAgICJcMlx1MDFiOVwxXDBcMlx1MDFiOVw3XDBcMlx1MDFiOVwyXDBcMlx1MDFiOVw1XDAiKwotICAgICJcMVx1MDFiYVwxXHUwMTM1XDFcdTAxMzZcMVx1MDEzNVwxXDBcMVx1MDEzNVwxXHUwMWJhXDFcMCIrCi0gICAgIlwxXHUwMTM1XDFcdTAxM2FcMTNcdTAxMzVcMVwwXDE0XHUwMTM1XDFcdTAxYmFcMlx1MDEzNVwxXHUwMWJhIisKLSAgICAiXDJcdTAxMzVcMVx1MDFiYVwxMFx1MDEzNVwxXHUwMWJhXDNcdTAxMzVcMVx1MDFiYVw1XHUwMTM1XDFcMCIrCi0gICAgIlwxXHUwMWJiXDFcdTAxMzhcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWRcMVx1MDEzOFwxXHUwMWJiXDMzXHUwMTM4IisKLSAgICAiXDFcdTAxYmJcMlx1MDEzOFwxXHUwMWJiXDJcdTAxMzhcMVx1MDFiYlwxMFx1MDEzOFwxXHUwMWJiXDNcdTAxMzgiKwotICAgICJcMVx1MDFiYlw1XHUwMTM4XDFcMFwxXHUwMWJjXDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYmMiKwotICAgICJcMVx1MDE1ZFwzMlx1MDEzOVwxXHUwMWJjXDJcdTAxMzlcMVx1MDFiY1wyXHUwMTM5XDFcdTAxYmNcMTBcdTAxMzkiKwotICAgICJcMVx1MDFiY1wzXHUwMTM5XDFcdTAxYmNcNVx1MDEzOVw1M1wwXDFcdTAxYmRcMjFcMFwyXDM2NyIrCi0gICAgIlwxXDM3MFwxXDM2N1wxXDBcMlwzNjdcMVwwXDFcMzY3XDFcdTAxMWFcMVwzNjciKwotICAgICJcM1wwXDJcMzY3XDJcMFwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxMVwzNjciKwotICAgICJcMVwwXDRcMzY3XDFcMFwzXDM2N1wxXDBcM1wzNjdcNFwwXDFcdTAxYmUiKwotICAgICJcMVx1MDEyMVwxXHUwMTIyXDFcdTAxMjFcMVwwXDFcdTAxMjFcMVx1MDFiZVwxXDBcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTI1XDEzXHUwMTIxXDFcMFwxNFx1MDEyMVwxXHUwMWJlXDJcdTAxMjFcMVx1MDFiZVwyXHUwMTIxIisKLSAgICAiXDFcdTAxYmVcMTBcdTAxMjFcMVx1MDFiZVwzXHUwMTIxXDFcdTAxYmVcNVx1MDEyMVwxXDBcMVx1MDFiZiIrCi0gICAgIlwxXHUwMTIzXDFcdTAxNGNcMVx1MDEyM1wxXHUwMTQ5XDFcdTAxMjNcMVx1MDFiZlwzM1x1MDEyM1wxXHUwMWJmIisKLSAgICAiXDJcdTAxMjNcMVx1MDFiZlwyXHUwMTIzXDFcdTAxYmZcMTBcdTAxMjNcMVx1MDFiZlwzXHUwMTIzXDFcdTAxYmYiKwotICAgICJcNVx1MDEyM1wxXDBcMVx1MDFjMFwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMWMwXDFcdTAxNDkiKwotICAgICJcMzJcdTAxMjRcMVx1MDFjMFwyXHUwMTI0XDFcdTAxYzBcMlx1MDEyNFwxXHUwMWMwXDEwXHUwMTI0XDFcdTAxYzAiKwotICAgICJcM1x1MDEyNFwxXHUwMWMwXDVcdTAxMjRcMVwwXDFcdTAxYzFcMVx1MDEzNVwxXHUwMTM2XDFcdTAxMzUiKwotICAgICJcMVwwXDFcdTAxMzVcMVx1MDFjMVwxXDBcMVx1MDEzNVwxXHUwMTNhXDEzXHUwMTM1XDFcMCIrCi0gICAgIlwxNFx1MDEzNVwxXHUwMWMxXDJcdTAxMzVcMVx1MDFjMVwyXHUwMTM1XDFcdTAxYzFcMTBcdTAxMzVcMVx1MDFjMSIrCi0gICAgIlwzXHUwMTM1XDFcdTAxYzFcNVx1MDEzNVwxXDBcMVx1MDFjMlwxXHUwMTM4XDFcdTAxNjBcMVx1MDEzOCIrCi0gICAgIlwxXHUwMTVkXDFcdTAxMzhcMVx1MDFjMlwzM1x1MDEzOFwxXHUwMWMyXDJcdTAxMzhcMVx1MDFjMlwyXHUwMTM4IisKLSAgICAiXDFcdTAxYzJcMTBcdTAxMzhcMVx1MDFjMlwzXHUwMTM4XDFcdTAxYzJcNVx1MDEzOFwxXDBcMVx1MDFjMyIrCi0gICAgIlwxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWMzXDFcdTAxNWRcMzJcdTAxMzlcMVx1MDFjM1wyXHUwMTM5IisKLSAgICAiXDFcdTAxYzNcMlx1MDEzOVwxXHUwMWMzXDEwXHUwMTM5XDFcdTAxYzNcM1x1MDEzOVwxXHUwMWMzXDVcdTAxMzkiKwotICAgICJcMVwwXDJcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMFwyXHUwMTIxXDFcMFwxXHUwMTIxIisKLSAgICAiXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDQ1XHUwMTIxXDFcMFwxXHUwMWM0XDFcdTAxMjNcMVx1MDE0YyIrCi0gICAgIlwxXHUwMTIzXDFcdTAxNDlcMVx1MDEyM1wxXHUwMWM0XDMzXHUwMTIzXDFcdTAxYzRcMlx1MDEyM1wxXHUwMWM0IisKLSAgICAiXDJcdTAxMjNcMVx1MDFjNFwxMFx1MDEyM1wxXHUwMWM0XDNcdTAxMjNcMVx1MDFjNFw1XHUwMTIzXDFcMCIrCi0gICAgIlwxXHUwMWM1XDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxYzVcMVx1MDE0OVwzMlx1MDEyNFwxXHUwMWM1IisKLSAgICAiXDJcdTAxMjRcMVx1MDFjNVwyXHUwMTI0XDFcdTAxYzVcMTBcdTAxMjRcMVx1MDFjNVwzXHUwMTI0XDFcdTAxYzUiKwotICAgICJcNVx1MDEyNFwxXDBcMlx1MDEzNVwxXHUwMTM2XDFcdTAxMzVcMVwwXDJcdTAxMzVcMVwwIisKLSAgICAiXDFcdTAxMzVcMVx1MDEzYVwxM1x1MDEzNVwxXDBcNDVcdTAxMzVcMVwwXDFcdTAxYzZcMVx1MDEzOCIrCi0gICAgIlwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZFwxXHUwMTM4XDFcdTAxYzZcMzNcdTAxMzhcMVx1MDFjNlwyXHUwMTM4IisKLSAgICAiXDFcdTAxYzZcMlx1MDEzOFwxXHUwMWM2XDEwXHUwMTM4XDFcdTAxYzZcM1x1MDEzOFwxXHUwMWM2XDVcdTAxMzgiKwotICAgICJcMVwwXDFcdTAxYzdcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFjN1wxXHUwMTVkXDMyXHUwMTM5IisKLSAgICAiXDFcdTAxYzdcMlx1MDEzOVwxXHUwMWM3XDJcdTAxMzlcMVx1MDFjN1wxMFx1MDEzOVwxXHUwMWM3XDNcdTAxMzkiKwotICAgICJcMVx1MDFjN1w1XHUwMTM5XDFcMFwyXHUwMTIzXDFcdTAxNGNcMVx1MDEyM1wxXHUwMTQ5XDY2XHUwMTIzIisKLSAgICAiXDFcMFwyXHUwMTI0XDFcdTAxNGRcNFx1MDEyNFwxXHUwMTQ5XDYzXHUwMTI0XDFcMFwyXHUwMTM4IisKLSAgICAiXDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkXDY2XHUwMTM4XDFcMFwyXHUwMTM5XDFcdTAxNjFcNFx1MDEzOSIrCi0gICAgIlwxXHUwMTVkXDYzXHUwMTM5IjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tUcmFucygpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFsyMjI2MF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tUcmFucyhaWl9UUkFOU19QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tUcmFucyhTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQVRUUklCVVRFID0genpVbnBhY2tBdHRyaWJ1dGUoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQVRUUklCVVRFX1BBQ0tFRF8wID0KLSAgICAiXDMwXDBcMVwxMVwxMFwxXDFcMTFcMlwxXDFcMTFcMVwxXDFcMTEiKwotICAgICJcNFwxXDFcMTFcNlwxXDFcMTFcM1wxXDJcMTFcM1wxXDFcMTEiKwotICAgICJcMVwxXDFcM1wyXDExXDNcMVwxXDExXDFcMVwxXDExXDEwXDEiKwotICAgICJcMlwxMVw1XDFcMVwxMVw3XDFcMVwxMVwxXDNcM1wxXDNcMTEiKwotICAgICJcMVwxXDFcMFwzXDFcMVwwXDFcMVwyXDBcMVwxXDJcMCIrCi0gICAgIlwxXDExXDZcMFwxXDFcM1wwXDFcMTFcNVwwXDFcMTFcNFwwIisKLSAgICAiXDJcMVwxXDBcMlwxXDFcMFwyXDFcMVwxNVwxXDBcMlwxIisKLSAgICAiXDFcMFwxXDFcMlwwXDFcMTFcMlwwXDFcMVwxXDBcM1wxIisKLSAgICAiXDJcMFwxXDExXDFcMFwxXDExXDFcMVwyXDBcMVwxMVwyXDAiKwotICAgICJcNFwxXDJcMFwxXDFcMlwwXDFcMTVcMVwxXDFcMFwxXDExIisKLSAgICAiXDFcMFwxXDFcMVwxMVwyXDFcMTBcMFwxXDFcMVwwXDFcMSIrCi0gICAgIlwyXDBcMVwxXDJcMFwxXDFcMlwwXDFcMVwyXDBcNVwxIisKLSAgICAiXDFcMFwxXDFcMlwwXDFcMVwxXDBcM1wxXDFcMFwxXDEiKwotICAgICJcMlwwXDFcMVwxXDBcM1wxXDNcMFwzXDFcMVwxMVw1XDAiKwotICAgICJcMVwxMVwyXDBcMVwxXDVcMFw1XDFcMlwwXDNcMVwyXDAiKwotICAgICJcMlwxXDFcMFwxXDFcMVwwXDFcMTFcM1wxXDNcMFwxXDExIisKLSAgICAiXDJcMFwxXDExXDFcMFwxXDFcMTBcMFwxXDExXDVcMVwyXDAiKwotICAgICJcM1wxXDJcMFwzXDFcNVwwXDFcMTFcMVwwXDNcMVwyXDAiKwotICAgICJcMVwxMVwyXDBcMVwxXDZcMFwxXDFcMlwwXDVcMVwyXDAiKwotICAgICJcM1wxXDJcMFwzXDFcMlwwXDFcMVwzXDBcM1wxXDFcMCIrCi0gICAgIlwxXDExXDJcMFwxXDFcMTNcMFw1XDFcMlwwXDNcMVwyXDAiKwotICAgICJcM1wxXDEwXDBcMlwxXDFcMTFcMlwwXDFcMVw2XDBcMVwxIisKLSAgICAiXDFcMFwxXDFcMlwwXDFcMVwyXDBcM1wxXDJcMFwxXDEiKwotICAgICJcMVwwXDFcMVw2XDBcMVwxXDRcMFwxXDExXDRcMFwxXDExIisKLSAgICAiXDNcMFwxXDExXDEyXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0F0dHJpYnV0ZSgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0NTVdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQXR0cmlidXRlKFpaX0FUVFJJQlVURV9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBdHRyaWJ1dGUoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB6elB1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvL3ByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVTkRFRklORUQgPSAidW5kZWZpbmVkIjsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsKLS8vCXByaXZhdGUgaW50IGZCdWZmZXJlZFRleHRMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoOwotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IENTU1RleHRSZWdpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9TTUFMTCA9IDI1NjsKLQlwcml2YXRlIGludCBmSW5pdGlhbEJ1ZmZlclNpemUgPSBCVUZGRVJfU0laRV9OT1JNQUw7Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IHN0YXRlKSB7Ci0JCWZJbml0aWFsU3RhdGUgPSBzdGF0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbEJ1ZmZlclNpemUoaW50IHNpemUpIHsKLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotICAJcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0OwotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsKLQkJYm9vbGVhbiBzcGFjZUZvbGxvd3M7Ci0vLwkJU3RyaW5nQnVmZmVyIHRleHQ7Ci0JCWludCBzdGFydDsKLQkJaW50IHRleHRMZW5ndGg7Ci0JCWludCBsZW5ndGg7Ci0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsKLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0OwotLy8JCQl0ZXh0ID0gZkJ1ZmZlcmVkVGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCXN0YXJ0ID0geXljaGFyOwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCB8fCBjb250ZXh0ID09IENTU19KU1BfRUwpewotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgIT0gQ1NTX0pTUF9FTkQgJiYgbmV4dFRva2VuVHlwZSAhPSBDU1NfRUxfRU5EICYmIG5leHRUb2tlblR5cGUgIT0gQ1NTX0pTUF9DT01NRU5UKSB7Ci0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCWlmIChjb250ZXh0LmVxdWFscyhDU1NfSlNQX1NDUklQVExFVCkgJiYgKHl5c3RhdGUoKSA9PSBTVF9KU1BfRElSRUNUSVZFIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfRVhQIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfREVDTEFSQVRJT04pKXsKLQkJCQkJCWNvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotCQkJCQl9Ci0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJaWYgKG5leHRUb2tlblR5cGUgPT0gbnVsbCl7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCl7Ci0JCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfQ09NTUVOVF9FTkQpIHsKLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJCQkJCWlmIChjb250ZXh0LmVxdWFscyhDU1NfSlNQX1NDUklQVExFVCkgJiYgeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKXsKLQkJCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkJCX0KLQotCQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJCWlmIChuZXh0VG9rZW5UeXBlID09IG51bGwpewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9CQkJCQotCQkJCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX0NPTU1FTlQpewotCQkJCQkJY29udGV4dCA9IENTU19DT01NRU5UOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQotCQkJfQotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncwotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgPT0gVU5ERUZJTkVEKSB7Ci0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOwotCQkJCXNwYWNlRm9sbG93cyA9IGZhbHNlOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX1MpOwotCQkJCX0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQKLQkJCQkJaWYgKHNwYWNlRm9sbG93cykgewotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQKLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQkJbGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZgotCQkJCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0vLwkJCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsKLQkJCX0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAJfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8KLSAgCXB1YmxpYyBmaW5hbCBMaXN0IHBhcnNlVGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gIAkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgCQlDU1NUZXh0VG9rZW4gdG9rZW47Ci0JCWZvciAoU3RyaW5nIGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCk7IGtpbmQgIT0gbnVsbDsga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKSkgewotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7Ci0JCQl0b2tlbi5raW5kID0ga2luZDsgIAkJCQkKLQkJCXRva2VuLnN0YXJ0ID0geXljaGFyOwotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCXRva2VuLmltYWdlID0geXl0ZXh0KCk7Ci0JCQl0b2tlbnMuYWRkKHRva2VuKTsKLQkJfQotCi0gIAkJcmV0dXJuIHRva2VuczsKLSAgCX0KLSAgCQotICAJLyogdXNlciBtZXRob2QgKi8KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsKLSAgCQlpZiAodHlwZSA9PSBDU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLSAgCQkJcmV0dXJuIGZhbHNlOwotICAJCX0gZWxzZSB7Ci0gIAkJCXJldHVybiB0cnVlOwotICAJCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB5eWNoYXI7Ci0JfQotCQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB6ekF0RU9GOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJenpSZWFkZXIgPSBpbjsKLQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl6elN0YXRlID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl6ekxleGljYWxTdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vWVlJTklUSUFMOwotCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJaWYgKHp6QnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsKLQkJCXp6QnVmZmVyID0gbmV3IGNoYXJbZkluaXRpYWxCdWZmZXJTaXplXTsKLQkJfQotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl6ek1hcmtlZFBvcyA9IDA7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXp6UHVzaGJhY2tQb3MgPSAwOwotCi0JCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJenpDdXJyZW50UG9zID0gMDsKLQotCQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXp6U3RhcnRSZWFkID0gMDsKLQotCQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCQlmcm9tIGlucHV0ICovCi0JCXp6RW5kUmVhZCA9IDA7Ci0KLQkJLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWxpbmUgPSAwOwotCi0JCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQotCQkvKioKLQkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotCQkgKiBtYXRjaGVkIHRleHQKLQkJICovCi0JCS8veXljb2x1bW4gPSAwOyAKLQotCQkvKiogCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCQkgKi8KLQkJLy96ekF0Qk9MID0gZmFsc2U7Ci0JCQotCQkvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl6ekF0RU9GID0gZmFsc2U7Ci0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8KLQkJLy8JCWZVbmRlZmluZWQuZGVsZXRlKDAsIGZVbmRlZmluZWQubGVuZ3RoKCkpOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcml2YXRlIGludCBmSlNQUHJldmlvdXNTdGF0ZSA9IGZJbml0aWFsU3RhdGU7Ci0JcHJpdmF0ZSB2b2lkIHl5SnNwQmVnaW4oaW50IG5ld3N0YXRlKXsKLQkJZkpTUFByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCXl5YmVnaW4obmV3c3RhdGUpOwotCX0KLQlwcml2YXRlIHZvaWQgeXlKc3BFbmQoKXsKLQkJeXliZWdpbihmSlNQUHJldmlvdXNTdGF0ZSk7Ci0JfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy56elJlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQZWRDU1NUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTcwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpQdXNoYmFja1Bvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPCAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotICAgLy8genpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0genpQdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0gMDsvL3l5Y29sdW1uID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpNYXJrZWRQb3MtenpTdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgcHVibGljIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB6ek1hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLSAgICBpbnQgenpQdXNoYmFja1Bvc0wgPSB6elB1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB6eldhc1B1c2hiYWNrOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB5eWNoYXIrPSB6ek1hcmtlZFBvc0wtenpTdGFydFJlYWQ7Ci0KLSAgICAgIGJvb2xlYW4genpSID0gZmFsc2U7Ci0gICAgICBmb3IgKHp6Q3VycmVudFBvc0wgPSB6elN0YXJ0UmVhZDsgenpDdXJyZW50UG9zTCA8IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3NMKyspIHsKLSAgICAgICAgc3dpdGNoICh6ekJ1ZmZlckxbenpDdXJyZW50UG9zTF0pIHsKLSAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgY2FzZSAnXHUwMDBDJzoKLSAgICAgICAgY2FzZSAnXHUwMDg1JzoKLSAgICAgICAgY2FzZSAnXHUyMDI4JzoKLSAgICAgICAgY2FzZSAnXHUyMDI5JzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB6elIgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHp6UiA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoenpSKQotICAgICAgICAgICAgenpSID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgenpSID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHp6UikgewotICAgICAgICAvLyBwZWVrIG9uZSBjaGFyYWN0ZXIgYWhlYWQgaWYgaXQgaXMgXG4gKGlmIHdlIGhhdmUgY291bnRlZCBvbmUgbGluZSB0b28gbXVjaCkKLSAgICAgICAgYm9vbGVhbiB6elBlZWs7Ci0gICAgICAgIGlmICh6ek1hcmtlZFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgIHp6UGVlayA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdID09ICdcbic7Ci0gICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpCi0gICAgICAgICAgenpQZWVrID0gZmFsc2U7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotICAgICAgICAgIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgICAgICAgIGlmIChlb2YpIAotICAgICAgICAgICAgenpQZWVrID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIHp6UGVlayA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdID09ICdcbic7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHp6UGVlaykgeXlsaW5lLS07Ci0gICAgICB9Ci0gICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0gIAotICAgICAgenpTdGF0ZSA9IHp6TGV4aWNhbFN0YXRlOwotCi0gICAgICB6eldhc1B1c2hiYWNrID0gZmFsc2U7Ci0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IHp6UHVzaGJhY2tQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICB6elB1c2hiYWNrUG9zTCA9IHp6UHVzaGJhY2tQb3M7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgenpOZXh0ID0genpUcmFuc0xbIHp6Um93TWFwTFt6elN0YXRlXSArIHp6Q01hcExbenpJbnB1dF0gXTsKLSAgICAgICAgICBpZiAoenpOZXh0ID09IC0xKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB6elN0YXRlID0genpOZXh0OwotCi0gICAgICAgICAgaW50IHp6QXR0cmlidXRlcyA9IHp6QXR0ckxbenpTdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgMikgPT0gMiApCi0gICAgICAgICAgICB6elB1c2hiYWNrUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0KLSAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiAxKSA9PSAxICkgewotICAgICAgICAgICAgenpXYXNQdXNoYmFjayA9ICh6ekF0dHJpYnV0ZXMgJiA0KSA9PSA0OwotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDgpID09IDggKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICBpZiAoenpXYXNQdXNoYmFjaykKLSAgICAgICAgenpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1NUUklORzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjA6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjI6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgcmV0dXJuIFVOREVGSU5FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY2OiBicmVhazsKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY3OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjg6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19MQlJBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY5OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDcwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzI6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDczOiBicmVhazsKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfQ0hBUlNFVF9OQU1FKTsgcmV0dXJuIENTU19DSEFSU0VUOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgeXlKc3BFbmQoKTsgcmV0dXJuIENTU19FTF9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc2OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgICAgeyB5eUpzcEVuZCgpOyAgcmV0dXJuIENTU19KU1BfRU5EOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc4OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19DREM7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgxOiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODI6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19DRE87Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg0OiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg2OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsgcmV0dXJuIENTU19QQUdFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg5OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0NIQVJTRVRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgICAgeyB5eUpzcEJlZ2luKFNUX0pTUF9FTCk7ICByZXR1cm4gQ1NTX0pTUF9FTDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTE6IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTI6IGJyZWFrOwotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkzOiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTU6IGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk4OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ09NTUVOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAwOiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19TOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgICB7IHl5SnNwRW5kKCk7IHJldHVybiBDU1NfSlNQX0NPTU1FTlRfRU5EOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDY6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSlNQX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19KU1BfREVDTDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA3OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9VUkkpOyByZXR1cm4gQ1NTX0lNUE9SVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA4OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA5OiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9KU1BfRVhQKTsgcmV0dXJuIENTU19KU1BfRVhQOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTE6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTEyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOyByZXR1cm4gQ1NTX0pTUF9DT01NRU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTU6IGJyZWFrOwotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgICB7IHl5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTc6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRSk7IHJldHVybiBDU1NfSlNQX0RJUkVDVElWRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE4OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovSlNQZWRDU1NSZWdpb25Db250ZXh0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9KU1BlZENTU1JlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMWIxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9KU1BlZENTU1JlZ2lvbkNvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMgZXh0ZW5kcyBDU1NSZWdpb25Db250ZXh0cyB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfRVhQID0gIkNTU19KU1BfRVhQIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfRUwgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9SRUlHTl9FTEVNRU5UOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9TQ1JJUFRMRVQgPSAiQ1NTX0pTUF9TQ1JJUFRMRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9ESVJFQ1RJVkUgPSAiQ1NTX0pTUF9ESVJFQ1RJVkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9ERUNMID0gIkNTU19KU1BfREVDTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0VORCA9ICJDU1NfSlNQX0VORCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfRUxfRU5EID0gIkNTU19FTF9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9DT01NRU5UX0VORCA9ICJDU1NfSlNQX0NPTU1FTlRfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfQ09NTUVOVCA9ICJDU1NfSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzk0ZTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNscHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBjMjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWpzcGVkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS5qc3QuanNwLnVpXzYuMC4wLmphcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzRkNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2RlYnVnL2pzcGNvbnRlbnRhc3Npc3Q9ZmFsc2UKLW9yZy5lY2xpcHNlLmpzdC5qc3AudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDJlNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmpzcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM0MzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNg0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyMWRjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmpzcC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qc3AudWksCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5kZXJpdmVkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmZvcm1hdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmRlYnVnO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zZWFyY2g7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzM2FlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3anNwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjliMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk0NGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMTE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZGVmYXVsdF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhMTQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyOWQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9kZWZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTA2NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJpdmF0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3N2IxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I0MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQ0YTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5MmYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA1NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMmE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjFiNTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX2RlZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjYmZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcml2YXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcm90ZWN0ZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThlZWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHVibGljX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYzQ2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkY2U5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWMyOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJpdmF0ZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4ODFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm90ZWN0ZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgzYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNDcwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3B1YmxpY19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWY1ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZjUxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NDYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmODFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2pzcGZpbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNTk3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWY0OGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BkZWNsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BleHAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGQ3NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODRjMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGluY2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHNjci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1M2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3B0YWdsaWIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRkZTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwZGU3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVNTRSBKU1AgU291cmNlIEVkaXRvcgotSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUpTUCBFZGl0b3IKLUNTU19KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9Q1NTIEpTUCBFZGl0b3IKLUpTUF9GaWxlcy5uYW1lPUpTUCBGaWxlcwotSlNQX1NvdXJjZS5uYW1lPUpTUCBTb3VyY2UKLUpTUF9UZW1wbGF0ZXMubmFtZT1KU1AgVGVtcGxhdGVzCi1KU1BfU3R5bGVzLm5hbWU9SlNQIFN0eWxlcwotCi0jIFNuaXBwZXRzIGNvbnRyaWJ1dGlvbnMgZm9yIGhlbHBpbmcgd2l0aCBKU1Agc3ludGF4Ci1qc3Bfc2NyaXB0bGV0PTwlLi4lPiBzY3JpcHRsZXQKLWpzcF9zY3JfY29udGVudD08JSAgJT4KLWpzcF9oaWRkZW5fY29tbWVudD08JS0tLi4tLSU+IGNvbW1lbnQKLWpzcF9oaWRkZW5fY29tbWVudF9jb250ZW50PTwlLS0gIC0tJT4KLWpzcF9kZWNsYXJhdGlvbj08JSEuLiU+IGRlY2xhcmF0aW9uCi1qc3BfZGVjbGFyYXRpb25fY29udGVudD08JSEgICU+Ci1qc3BfZXhwcmVzc2lvbj08JT0uLiU+IGV4cHJlc3Npb24KLWpzcF9leHByZXNzaW9uX2NvbnRlbnQ9PCU9ICAlPgotanNwX2luY2x1ZGVfZGlyZWN0aXZlPWluY2x1ZGUgZGlyZWN0aXZlCi1qc3BfaW5jbHVkZV9kaXJlY3RpdmVfY29udGVudD08JUAgaW5jbHVkZSBmaWxlPSIiICU+Ci1qc3BfcGFnZV9kaXJlY3RpdmU9cGFnZSBkaXJlY3RpdmUKLWpzcF9wYWdlX2RpcmVjdGl2ZV9jb250ZW50PTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9IiAlPgotanNwX3RhZ2xpYl9kaXJlY3RpdmU9dGFnbGliIGRpcmVjdGl2ZQotanNwX3RhZ2xpYl9kaXJlY3RpdmVfY29udGVudD08JUAgdGFnbGliIHVyaT0iJHt1cml9IiBwcmVmaXg9IiR7cHJlZml4fSIgJT4KLWpzcF90YWdsaWJfZGlyZWN0aXZlX3VyaT1VUkkgdG8gdGhlIGNvbnRhaW5pbmcgSkFSIGZpbGUgb3IgdGFnbGliIGRlc2NyaXB0b3IgKC50bGQpCi1qc3BfdGFnbGliX2RpcmVjdGl2ZV9wcmVmaXg9TmFtZXNwYWNlIHByZWZpeCBmb3IgdGFncyBmcm9tIHRoaXMgbGlicmFyeQotSlNQRnJhZ21lbnRDb250ZW50U2V0dGluZ3MubmFtZT1KU1AgRnJhZ21lbnQKLWNvbW1hbmQuanNwLnJlZmFjdG9yLnJlbmFtZS5uYW1lPVJlbmFtZQotY29tbWFuZC5qc3AucmVmYWN0b3IucmVuYW1lLmRlc2NyaXB0aW9uPVJlbmFtZSBhIEphdmEgRWxlbWVudAotY29tbWFuZC5qc3AucmVmYWN0b3IubW92ZS5uYW1lPU1vdmUKLWNvbW1hbmQuanNwLnJlZmFjdG9yLm1vdmUuZGVzY3JpcHRpb249TW92ZSBhIEphdmEgRWxlbWVudCB0byBhbm90aGVyIHBhY2thZ2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLm5hbWU9RWRpdGluZyBKU1AgU291cmNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5kZXNjcmlwdGlvbj1FZGl0aW5nIEpTUCBTb3VyY2UKLUpTUF9UeXBlX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBUeXBlIFJlbmFtZSBQYXJ0aWNpcGFudAotSlNQX01ldGhvZF9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgTWV0aG9kIFJlbmFtZSBQYXJ0aWNpcGFudAotSlNQX1BhY2thZ2VfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFBhY2thZ2UgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfVHlwZV9Nb3ZlX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFR5cGUgTW92ZSBQYXJ0aWNpcGFudAotQWxsX0pTUF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1BbGwgSlNQCi1KU1BfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBKU1AKLUpTUF9UYWdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFRhZwotSlNQX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgQXR0cmlidXRlCi1KU1BfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBBdHRyaWJ1dGUgdmFsdWUKLUpTUF9RdWVyeV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBRdWVyeSBQYXJ0aWNpcGFudAotSlNQX0V4dGVuc2lvbl9FbGVtZW50LmxhYmVsPUpTUAotI29yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMgZXh0ZW5zaW9uIHBvaW50Ci1fVUlfV0laQVJEX05BTUUgPSBKU1AKLV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFID0gQ3JlYXRlIGEgbmV3IEphdmFTZXJ2ZXIgUGFnZQotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjIEVMIEVycm9yIE1lc3NhZ2UKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotUmVuYW1lRWxlbWVudF9sYWJlbD1SZW5hbWUKLU1vdmVFbGVtZW50X2xhYmVsPU1vdmUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDJlNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUpTUF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLQkJCWljb249IiRubCQvaWNvbnMvL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWV4dGVuc2lvbnM9ImpzcCwganNmLCBqc3BmLCBqc3B4LCB0YWcsIHRhZ2YiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5BY3Rpb25Db250cmlidXRvckpTUCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVDU1NfSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy8vZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuQWN0aW9uQ29udHJpYnV0b3JKU1AiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiIC8+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5wcm9wZXJ0aWVzLlhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzb3VyY2VlZGl0aW5ndGV4dHRvb2xzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dC5KU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc291cmNlLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic2hvd2ludGFyZ2V0IgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC51aS5QYWNrYWdlRXhwbG9yZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0icGFydGlhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5tYXJrdXB2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJwYXJ0aWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb24uSFRNTFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uaHRtbHN5bnRheHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCi0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCQk8IS0tIEpTUCBQUkVGRVJFTkNFIFBBR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQkJPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUEZpbGVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3AiIC8+Ci0KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3AiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UiIC8+Ci0KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3AiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcyIgLz4KLQotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9TdHlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUENvbG9yUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zdHlsZXMiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRk9SIEpTUC9KQVZBIFJFTkFNRSBQQVJUSUNJUEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9UeXBlX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfTWV0aG9kX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfUGFja2FnZV9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5yZWZhY3RvcmluZy5KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEZPUiBKU1AvSkFWQSBNT1ZFIFBBUlRJQ0lQQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5tb3ZlUGFydGljaXBhbnRzIj4KLQotCQk8bW92ZVBhcnRpY2lwYW50Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVNb3ZlUGFydGljaXBhbnQiCi0JCQluYW1lPSIlSlNQX1R5cGVfTW92ZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlTW92ZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIgLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9tb3ZlUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIGZvciBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnQiPgotCQk8YnJlYWtwb2ludENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm92aWRlcnMiPgotCQkJPCEtLSAKLQkJCQk8cHJvdmlkZXIKLQkJCQlleHRlbnNpb25zPSJqc3AsIGpzcGYsIGpzZiIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIiPgotCQkJCTwvcHJvdmlkZXI+Ci0JCQktLT4KLQkJCTxwcm92aWRlcgotCQkJCWNvbnRlbnRUeXBlcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyOipqc3AsanNwX3NlcnZsZXQuXyoiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVycy5KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlciIgLz4KLQkJPC9icmVha3BvaW50Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBTbmlwcGV0IFZpZXcgY29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zbmlwcGV0cy5TbmlwcGV0Q29udHJpYnV0aW9ucyI+Ci0JCTxjYXRlZ29yeQotCQkJbGFiZWw9IiVKU1BfRXh0ZW5zaW9uX0VsZW1lbnQubGFiZWwiCi0JCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuY2F0ZWdvcnkwIgotCQkJY29udGVudHR5cGVzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfaGlkZGVuX2NvbW1lbnQiCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy90YWctZ2VuZXJpYy5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX2hpZGRlbl9jb21tZW50Ij4KLQkJCQk8Y29udGVudD4lanNwX2hpZGRlbl9jb21tZW50X2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX3NjcmlwdGxldCIKLQkJCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL2pzcHNjci5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX3NjcmlwdGxldCI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9zY3JfY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfZXhwcmVzc2lvbiIKLQkJCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX2V4cHJlc3Npb24iPgotCQkJCTxjb250ZW50PiVqc3BfZXhwcmVzc2lvbl9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9kZWNsYXJhdGlvbiIKLQkJCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9kZWNsYXJhdGlvbiI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9kZWNsYXJhdGlvbl9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9pbmNsdWRlX2RpcmVjdGl2ZSIKLQkJCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL2pzcGluY2wuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9pbmNsdWRlX2RpcmVjdGl2ZSI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9pbmNsdWRlX2RpcmVjdGl2ZV9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9wYWdlX2RpcmVjdGl2ZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfcGFnZV9kaXJlY3RpdmUiPgotCQkJCTxjb250ZW50PiVqc3BfcGFnZV9kaXJlY3RpdmVfY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfdGFnbGliX2RpcmVjdGl2ZSIKLQkJCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX3RhZ2xpYl9kaXJlY3RpdmUiPgotCQkJCTxjb250ZW50PiVqc3BfdGFnbGliX2RpcmVjdGl2ZV9jb250ZW50PC9jb250ZW50PgotCQkJCTx2YXJpYWJsZQotCQkJCQlkZXNjcmlwdGlvbj0iJWpzcF90YWdsaWJfZGlyZWN0aXZlX3VyaSIKLQkJCQkJaWQ9InVyaSIgLz4KLQotCQkJCTx2YXJpYWJsZQotCQkJCQlkZWZhdWx0PSJteWxpYiIKLQkJCQkJZGVzY3JpcHRpb249IiVqc3BfdGFnbGliX2RpcmVjdGl2ZV9wcmVmaXgiCi0JCQkJCWlkPSJwcmVmaXgiIC8+Ci0KLQkJCTwvaXRlbT4KLQkJPC9jYXRlZ29yeT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgRWRpdG9yIHNwZWNpZmljIGFjdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8IS0tIHJlbmFtZSByZWZhY3RvciAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5qc3AucmVmYWN0b3IucmVuYW1lLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIgLz4KLQotCQk8IS0tIG1vdmUgcmVmYWN0b3IgLS0+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5qc3AucmVmYWN0b3IubW92ZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXliaW5kaW5nIHNjb3BlIGZvciBqc3Agc291cmNlIGVkaXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS51aS50ZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiPgotCQk8L2NvbnRleHQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXliaW5kaW5ncyBmb3IganNwIHNvdXJjZSBlZGl0b3IgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotCSAgICA8IS0tICB3aW4zMjogIE0xPUNUUkwsIE0yPVNISUZULCBNMz1BTFQgLS0+Ci0JCTwhLS0gcmVuYW1lIHJlZmFjdG9yIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrUiIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5yZW5hbWUiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCi0JCTwhLS0gbW92ZSByZWZhY3RvciAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK1YiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IubW92ZSIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIFRlbXBsYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUFsbF9KU1BfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUpTUCIKLQkJCWlkPSJqc3BfYWxsIiAvPgotCi0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUpTUF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUpTUCIKLQkJCWlkPSJqc3BfbmV3IiAvPgotCi0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUpTUF9UYWdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUpTUCIKLQkJCWlkPSJqc3BfdGFnIiAvPgotCi0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUpTUF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUpTUCIKLQkJCWlkPSJqc3BfYXR0cmlidXRlIiAvPgotCi0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUpTUF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUpTUCIKLQkJCWlkPSJqc3BfYXR0cmlidXRlX3ZhbHVlIiAvPgotCi0JCTxpbmNsdWRlCi0JCQlmaWxlPSJ0ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotCQkJdHJhbnNsYXRpb25zPSIkbmwkL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIiAvPgotCi0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIHF1ZXJ5UGFydGljaXBhbnQgdG8gcGFydGljaXBhdGUgaW4gamF2YSBzZXJhY2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkucXVlcnlQYXJ0aWNpcGFudHMiPgotCQk8cXVlcnlQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9RdWVyeV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJbmF0dXJlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWkuSlNQUXVlcnlQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmphdmEuc2VhcmNoLnVpLkpTUFF1ZXJ5UGFydGljaXBhbnQiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIGluaXRpYWxpemUgeG1sIHVpIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIERvY3VtZW50IHByb3ZpZGVyIGZvciBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmRvY3VtZW50UHJvdmlkZXJzIj4KLQkJPHByb3ZpZGVyCi0JCQlpbnB1dFR5cGVzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEZpbGVEb2N1bWVudFByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuRXh0ZXJuYWxGaWxlRG9jdW1lbnRQcm92aWRlciIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBOZXcgSlNQIHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTUFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05BTUUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3SlNQV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdqc3Bfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEFkZCBuZXcgSlNQIHdpemFyZCB0byBKMkVFIFByb2plY3QgTmF2aWdhdG9yIC0tPgotCTxleHRlbnNpb24KLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29tbW9uV2l6YXJkLm5ld0pTUCIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3SlNQV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQk8dGVzdAotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkNsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW5hbWVFbGVtZW50IgotCQkJCWxhYmVsPSIlUmVuYW1lRWxlbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW5hbWVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJNb3ZlRWxlbWVudCIKLQkJCQlsYWJlbD0iJU1vdmVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iTW92ZUVsZW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkZpbmRPY2N1cnJlbmNlcyIKLQkJCQlsYWJlbD0iJUZpbmRPY2N1cnJlbmNlc19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkZpbmRPY2N1cnJlbmNlcyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5Ij4KLQkJCTwvYWN0aW9uPgotCQk8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gSlNQIEZyYWdtZW50IFByb3BlcnR5IFBhZ2UgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0JCTwhLS0gZm9yIGoyZWUgd2ViIHByb2plY3QgLS0+Ci0JCTxwYWdlCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0JCQlhZGFwdGFibGU9InRydWUiCi0JCQluYW1lPSIlSlNQRnJhZ21lbnRDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLlByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+IAotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJYWRhcHRhYmxlPSJ0cnVlIgotCQkJbmFtZT0iJUpTUEZyYWdtZW50Q29udGVudFNldHRpbmdzLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSI+Ci0gICAgICAgICAJPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCQk8b3I+IAotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+CQotCTwhLS0gIGpzcC1mb3ItY3NzIGVkaXRvciBjb25maWd1cmF0aW9ucyAtLT4JCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy5KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQuQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3MsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkJPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM3ODI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkNTU1Byb3BlcnR5U291cmNlOwotCi0KLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTUHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBDU1NQcm9wZXJ0eVNvdXJjZSB7Ci0KLQlwdWJsaWMgSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZShJQ1NTTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIHdvcmthcm91bmQgdG8gYXZvaWQgRE9NRXhjZXB0aW9uOiBpZiB2YWx1ZSBjb250YWlucyBqc3AgZWxlbWVudCwgbm90aGluZyBoYXBwZW4uCi0JCVN0cmluZyB2ID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJaWYgKHYuaW5kZXhPZigiJHsiKSAhPSAtMSB8fCB2LmluZGV4T2YoIjwlPSIpICE9IC0xKXsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCVN0cmluZyB0aXRsZSA9IEpTUFVJTWVzc2FnZXMuVGl0bGVfSW52YWxpZFZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbWVzc2FnZSA9IEpTUFVJTWVzc2FnZXMuTWVzc2FnZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcod2luZG93LmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5ZTg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUGVkQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUyBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MgewotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDM4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllcy5KU1BlZENTU1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElDU1NOb2RlIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJQ1NTTm9kZSlvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbmV3IEpTUGVkQ1NTUHJvcGVydHlTb3VyY2UoZlNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU291cmNlID0gbnVsbDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydGllc1JlZnJlc2hKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDIwMDsKLQotCQlwcml2YXRlIFNldCBwcm9wZXJ0eVNoZWV0UGFnZXMgPSBudWxsOwotCi0JCXB1YmxpYyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuSkZhY2VOb2RlQWRhcHRlcl8xKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMgPSBuZXcgSGFzaFNldCgxKTsKLQkJfQotCi0JCXZvaWQgYWRkUHJvcGVydHlTaGVldFBhZ2UoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5hZGQocGFnZSk7Ci0JCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU9iamVjdFtdIHBhZ2VzID0gcHJvcGVydHlTaGVldFBhZ2VzLnRvQXJyYXkoKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5jbGVhcigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChQcm9wZXJ0eVNoZWV0UGFnZSkgcGFnZXNbaV07Ci0JCQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIXBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQlwYWdlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzUmVmcmVzaEpvYiBmUHJvcGVydGllc1JlZnJlc2hKb2IgPSBudWxsOwotCi0JSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCXByaXZhdGUgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXIgZlJlZnJlc2hBZGFwdGVyID0gbmV3IENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyW10gZlNlbGVjdGVkTm90aWZpZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBKU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldElucHV0U2VsZWN0aW9uKElXb3JrYmVuY2hQYXJ0IHNlbGVjdGluZ1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHJlbW92ZSBVSSByZWZyZXNoIGFkYXB0ZXJzCi0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCi0JCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gc3VwZXIuZ2V0SW5wdXRTZWxlY3Rpb24oc2VsZWN0aW5nUGFydCwgc2VsZWN0aW9uKTsKLQkJaWYgKHByZWZlcnJlZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSBuZXcgT2JqZWN0WygoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCksIDAsIHNlbGVjdGVkT2JqZWN0cywgMCwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJCXdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFKSB7Ci0JCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogQWRkIFVJIHJlZnJlc2ggYWRhcHRlcnMgYW5kIHJlbWVtYmVyIG5vdGlmaWVycyBmb3IgbGF0ZXIKLQkJCSAqIHJlbW92YWwKLQkJCSAqLwotCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZE5vdGlmaWVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCXNlbGVjdGVkTm90aWZpZXJzLmFkZChzZWxlY3RlZE9iamVjdHNbaV0pOwotCQkJCQkJKChJTm9kZU5vdGlmaWVyKSBzZWxlY3RlZE9iamVjdHNbaV0pLmFkZEFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmU2VsZWN0ZWROb3RpZmllcnMgPSAoSU5vZGVOb3RpZmllcltdKSBzZWxlY3RlZE5vdGlmaWVycy50b0FycmF5KG5ldyBJTm9kZU5vdGlmaWVyW3NlbGVjdGVkTm90aWZpZXJzLnNpemUoKV0pOwotCQkJfQotCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRPYmplY3RzKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCVByb3BlcnRpZXNSZWZyZXNoSm9iIGdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQlpZiAoZlByb3BlcnRpZXNSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG5ldyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllc1JlZnJlc2hKb2I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJaWYgKGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbmV3IENTU1Byb3BlcnR5U291cmNlUHJvdmlkZXIoKTsKLQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlzdXBlci51bmNvbmZpZ3VyZSgpOwotCQlpZiAoZlNlbGVjdGVkTm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkTm90aWZpZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzW2ldLnJlbW92ZUFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCX0KLQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTQ3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LklKYXZhUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5KYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5NdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUEVMQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmZvcm1hdC5Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTUEphdmFIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5UYWdsaWJIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5YTUxIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YS5MaW5lU3R5bGVQcm92aWRlckZvckphdmE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbC5MaW5lU3R5bGVQcm92aWRlckZvckpTUEVMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mby5KU1BJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mby5KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mby5KU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvLkpTUFRhZ0luZm9Ib3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uVGV4dEhvdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSlNQIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMOwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGZKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3RyYXRlZ2llcyA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSB7Ci0JCQkvLyB4bWwgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJc3RyYXRlZ2llcyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkgewotCQkJLy8ganNwIGphdmEgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBqYXZhU3RyYXRlZ2llcyA9IGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChqYXZhU3RyYXRlZ2llc1tpXSk7Ci0JCQl9Ci0JCQkvLyBiZSBzdXJlIHRoaXMgaXMgYWRkZWQgbGFzdCwgYWZ0ZXIgb3RoZXJzLCBzbyBpdCBjYW4gbW9kaWZ5Ci0JCQkvLyByZXN1bHRzIGZyb20gZWFybGllciBzdGVwcy4KLQkJCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMoKSk7Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCS8vIGh0bWwgYW5kIGpzcCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQkvLyBhZGQgdGhlIGpzcCBhdXRvZWRpdCBzdHJhdGVneSBmaXJzdCB0aGVuIGFkZCBhbGwgaHRtbCdzCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AoKSk7Ci0KLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gaHRtbFN0cmF0ZWdpZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbFN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChodG1sU3RyYXRlZ2llc1tpXSk7Ci0JCQl9Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZGVmYXVsdCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJCX0KLQotCQkJLy8gYmUgc3VyZSB0aGlzIGlzIGFkZGVkIGxhc3QsIGFmdGVyIG90aGVycywgc28gaXQgY2FuIG1vZGlmeQotCQkJLy8gcmVzdWx0cyBmcm9tIGVhcmxpZXIgc3RlcHMuCi0JCQkvLyBhZGQgYXV0byBlZGl0IHN0cmF0ZWd5IHRoYXQgaGFuZGxlcyB3aGVuIHRhYiBrZXkgaXMgcHJlc3NlZAotCQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCQlzdHJhdGVnaWVzID0gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQkJfQotCi0JCXJldHVybiBzdHJhdGVnaWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogQSBsaXR0bGUgYml0IG9mIGNoZWF0aW5nIGJlY2F1c2UgYXNzdW1pbmcgaHRtbCdzIGNvbmZpZ3VyZWQKLQkJCSAqIGNvbnRlbnQgdHlwZXMgd2lsbCBhZGQgZGVmYXVsdCwgdW5rbm93biwgYW5kIGFsbCB4bWwgY29uZmlndXJlZAotCQkJICogY29udGVudCB0eXBlcwotCQkJICovCi0JCQlTdHJpbmdbXSBodG1sVHlwZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCVN0cmluZ1tdIGpzcFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbaHRtbFR5cGVzLmxlbmd0aCArIGpzcFR5cGVzLmxlbmd0aF07Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGh0bWxUeXBlcywgMCwgZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMsIGluZGV4LCBodG1sVHlwZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoanNwVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSBodG1sVHlwZXMubGVuZ3RoLCBqc3BUeXBlcy5sZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCS8vIEhUTUwgSmF2YVNjcmlwdAotCQkJSUNvbnRlbnRBc3Npc3RhbnQgaHRtbENvbnRlbnRBc3Npc3RhbnQgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbnRlbnRBc3Npc3RhbnQoc291cmNlVmlld2VyKTsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGh0bWxDb250ZW50QXNzaXN0YW50LmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCk7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117cHJvY2Vzc29yfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQkvLyBIVE1MIENTUwotCQkJSUNvbnRlbnRBc3Npc3RhbnQgaHRtbENvbnRlbnRBc3Npc3RhbnQgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbnRlbnRBc3Npc3RhbnQoc291cmNlVmlld2VyKTsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGh0bWxDb250ZW50QXNzaXN0YW50LmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUNTU1BhcnRpdGlvbnMuU1RZTEUpOwotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JCX0KLQkJLy8gLy8ganNwY29udGVudGFzc2lzdHByb2Nlc3NvciBoYW5kbGVzIHRoaXM/Ci0JCS8vIGVsc2UgaWYgKChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9uVHlwZXMuSFRNTF9ERUZBVUxUKSB8fAotCQkvLyAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvblR5cGVzLkhUTUxfQ09NTUVOVCkpIHsKLQkJLy8gcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldwotCQkvLyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJLy8gfQotCQllbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUikgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQpKSB7Ci0JCQkvLyBqc3AKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpKSB7Ci0JCQkvLyBqc3AgamF2YQotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMKSB7Ci0JCQkvLyBqc3AgZWwKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OKSB7Ci0JCQkvLyB1bmtub3duCi0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCU11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlciksIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQotCQlmb3JtYXR0ZXIuc2V0TWFzdGVyU3RyYXRlZ3kobmV3IFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kobmV3IEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsKCkpKTsKLQkJZm9ybWF0dGVyLnNldFNsYXZlU3RyYXRlZ3kobmV3IEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGdldERvdWJsZUNsaWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgc3RyYXRlZ3kgPSBudWxsOwotCi0JCS8vIGh0bWwgb3IgamF2YXNjcmlwdAotCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEgfHwgY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkKLQkJCS8vIEpTUCBKYXZhIG9yIEpTUCBKYXZhU2NyaXB0Ci0JCQlzdHJhdGVneSA9IGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpCi0JCQkvLyBKU1AgKGp1c3QgdHJlYXQgbGlrZSBodG1sKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJZWxzZQotCQkJc3RyYXRlZ3kgPSBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCi0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCQl9Ci0JCXJldHVybiBmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIElIeXBlcmxpbmtEZXRlY3RvcltdIGdldEh5cGVybGlua0RldGVjdG9ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbCB8fCAhZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0hZUEVSTElOS1NfRU5BQkxFRCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlMaXN0IGFsbERldGVjdG9ycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWFsbERldGVjdG9ycy5hZGQobmV3IEpTUEphdmFIeXBlcmxpbmtEZXRlY3RvcigpKTsKLQkJYWxsRGV0ZWN0b3JzLmFkZChuZXcgVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IoKSk7Ci0JCWFsbERldGVjdG9ycy5hZGQobmV3IFhNTEh5cGVybGlua0RldGVjdG9yKCkpOwotCi0JCUlIeXBlcmxpbmtEZXRlY3RvcltdIHN1cGVyRGV0ZWN0b3JzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKHNvdXJjZVZpZXdlcik7Ci0JCWZvciAoaW50IG0gPSAwOyBtIDwgc3VwZXJEZXRlY3RvcnMubGVuZ3RoOyBtKyspIHsKLQkJCUlIeXBlcmxpbmtEZXRlY3RvciBkZXRlY3RvciA9IHN1cGVyRGV0ZWN0b3JzW21dOwotCQkJaWYgKCFhbGxEZXRlY3RvcnMuY29udGFpbnMoZGV0ZWN0b3IpKSB7Ci0JCQkJYWxsRGV0ZWN0b3JzLmFkZChkZXRlY3Rvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJSHlwZXJsaW5rRGV0ZWN0b3JbXSkgYWxsRGV0ZWN0b3JzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtEZXRlY3RvclswXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJU3RyaW5nW10gaW5kZW50YXRpb25zID0gbnVsbDsKLQotCQlpZiAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpCi0JCQlpbmRlbnRhdGlvbnMgPSBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWluZGVudGF0aW9ucyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0KLQkJcmV0dXJuIGluZGVudGF0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUluZm9ybWF0aW9uUHJvdmlkZXIgZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUluZm9ybWF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSB7Ci0JCQkvLyBIVE1MCi0JCQlJSW5mb3JtYXRpb25QcmVzZW50ZXIgaHRtbFByZXNlbnRlciA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXIoc291cmNlVmlld2VyKTsKLQkJCXByb3ZpZGVyID0gaHRtbFByZXNlbnRlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyKElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJLy8gSFRNTCBKYXZhU2NyaXB0Ci0JCQlJSW5mb3JtYXRpb25QcmVzZW50ZXIgaHRtbFByZXNlbnRlciA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXIoc291cmNlVmlld2VyKTsKLQkJCXByb3ZpZGVyID0gaHRtbFByZXNlbnRlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpIHsKLQkJCS8vIFhNTAotCQkJSUluZm9ybWF0aW9uUHJlc2VudGVyIHhtbFByZXNlbnRlciA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRJbmZvcm1hdGlvblByZXNlbnRlcihzb3VyY2VWaWV3ZXIpOwotCQkJcHJvdmlkZXIgPSB4bWxQcmVzZW50ZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAoKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpKSB7Ci0JCQkvLyBKU1AgdGFncwotCQkJcHJvdmlkZXIgPSBuZXcgSlNQSW5mb3JtYXRpb25Qcm92aWRlcigpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkgewotCQkJLy8gSlNQIGphdmEKLQkJCXByb3ZpZGVyID0gbmV3IEpTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJLyoKLQkJCSAqIE5PVEU6IG51bGwgdGV4dCBlZGl0b3IgaXMgYmVpbmcgcGFzc2VkIHRvCi0JCQkgKiBKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBiZWNhdXNlCi0JCQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZG9lcyBub3Qga25vdyBjdXJyZW50IGVkaXRvci4KLQkJCSAqIHRoaXMgaXMgb2theSBiZWNhdXNlIGVkaXRvciBpcyBub3QgbmVlZGVkIGluIHRoZSBjYXNlcyB3ZSBhcmUKLQkJCSAqIHVzaW5nIGphdmFzb3VyY2V2aWV3ZXJjb25maWd1cmF0aW9uLgotCQkJICovCi0JCQlmSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oSmF2YVVJLmdldENvbG9yTWFuYWdlcigpLCBzdG9yZSwgbnVsbCwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCXByb3ZpZGVycyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgewotCQkJcHJvdmlkZXJzID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm92aWRlcnMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIElDU1NQYXJ0aXRpb25zLlNUWUxFKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04gfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfUEkpIHsKLQkJCXByb3ZpZGVycyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckphdmEgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckphdmE7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckpTUCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUw7Ci0JfQotCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUsIGludCBzdGF0ZU1hc2spIHsKLQkJSVRleHRIb3ZlciBob3ZlciA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJLy8gaHRtbCBhbmQgamF2YXNjcmlwdCByZWdpb25zCi0JCQlob3ZlciA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUsIHN0YXRlTWFzayk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpIHsKLQkJCS8vIHhtbCByZWdpb25zCi0JCQlob3ZlciA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSwgc3RhdGVNYXNrKTsKLQkJfQotCQllbHNlIGlmICgoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpIHx8IChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB8fCAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkpIHsKLQkJCVRleHRIb3Zlck1hbmFnZXIgbWFuYWdlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCk7Ci0JCQlUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3JbXSBob3ZlckRlc2NzID0gbWFuYWdlci5nZXRUZXh0SG92ZXJzKCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IGhvdmVyRGVzY3MubGVuZ3RoICYmIGhvdmVyID09IG51bGwpIHsKLQkJCQlpZiAoaG92ZXJEZXNjc1tpXS5pc0VuYWJsZWQoKSAmJiBFZGl0b3JVdGlsaXR5LmNvbXB1dGVTdGF0ZU1hc2soaG92ZXJEZXNjc1tpXS5nZXRNb2RpZmllclN0cmluZygpKSA9PSBzdGF0ZU1hc2spIHsKLQkJCQkJU3RyaW5nIGhvdmVyVHlwZSA9IGhvdmVyRGVzY3NbaV0uZ2V0SWQoKTsKLQkJCQkJaWYgKFRleHRIb3Zlck1hbmFnZXIuQ09NQklOQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKSB7Ci0JCQkJCQlpZiAoKGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUKSB8fCAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkpIHsKLQkJCQkJCQkvLyBKU1AKLQkJCQkJCQlob3ZlciA9IG1hbmFnZXIuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEpTUFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIEpTUCBKYXZhCi0JCQkJCQkJaG92ZXIgPSBtYW5hZ2VyLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFRleHRIb3Zlck1hbmFnZXIuRE9DVU1FTlRBVElPTl9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpIHsKLQkJCQkJCWlmICgoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpIHx8IChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSkgewotCQkJCQkJCS8vIEpTUAotCQkJCQkJCWhvdmVyID0gbmV3IEpTUFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gSlNQIEphdmEKLQkJCQkJCQlob3ZlciA9IG5ldyBKU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJLy8gbm8gYXBwcm9wcmlhdGUgdGV4dCBob3ZlcnMgZm91bmQsIHRyeSBzdXBlcgotCQlpZiAoaG92ZXIgPT0gbnVsbCkKLQkJCWhvdmVyID0gc3VwZXIuZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUsIHN0YXRlTWFzayk7Ci0JCXJldHVybiBob3ZlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDAwNzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uQ29uc3RhbnRzSlNQIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCA9ICJSZW5hbWVFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCA9ICJNb3ZlRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDYwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5JSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uRGVmaW5pdGlvbklkc0pTUCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVOQU1FX0VMRU1FTlQgPSBJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuUkVOQU1FX0VMRU1FTlQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9WRV9FTEVNRU5UID0gSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLk1PVkVfRUxFTUVOVDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhiMjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgSlNQIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpTUFVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfSlNQX2RvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmYWN0b3JfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lRWxlbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZUVsZW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbGVtZW50V2l6YXJkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9jaGFuZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGlvbkNvbnRyaWJ1dG9ySlNQXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUE1vdmVFbGVtZW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsJLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZV9tZXRob2RfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGl0bGVfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VfSW52YWxpZFZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhZWJhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEpTUFVJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsJCi0JCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvci4gCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCQotCS8qKiAKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIGVkaXRvci4gCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCi0JcHVibGljIEpTUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKU1BVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSlNQVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZT0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BTEwpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5UQUcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEUpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEVfVkFMVUUpOwotCQkJCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeT0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjZmUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBKU1AgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjEKLSMjIFdlbGNvbWUhCi0jIyBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4yCi0jIyBXZWxjb21lIQotU2FtcGxlX0pTUF9kb2M9PCVAIHBhZ2UgXG5cdGxhbmd1YWdlPVwiamF2YVwiIFxuXHRjb250ZW50VHlwZT1cInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xXCJcbiU+XG48anNwOmluY2x1ZGUgZmx1c2g9XCJ0cnVlXCIgcGFnZT1cInRpdGxlQmFyLmpzcFwiLz5cblxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xIC0tJT5cbjwlXG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuJT5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMiAtLSU+XG48anNwOnNjcmlwdGxldD5cblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG48L2pzcDpzY3JpcHRsZXQ+Ci1KU1BfRGVsaW1pdGVyc19VSV89SlNQIERlbGltaXRlcnMKLVJlZmFjdG9yX2xhYmVsPVJlZmFjdG9yCi1SZW5hbWVFbGVtZW50X2xhYmVsPVJlbmFtZQotTW92ZUVsZW1lbnRfbGFiZWw9TW92ZQotTW92ZUVsZW1lbnRXaXphcmQ9TW92ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMKLSMKLU9LPU9LCi1KU1BfY2hhbmdlcz1KU1AgY2hhbmdlcwotQWN0aW9uQ29udHJpYnV0b3JKU1BfMD1SZWZhJmN0b3IKLUpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMD1FZGl0b3Igc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gYSByZW5hbWFibGUgSmF2YSBlbGVtZW50Ci1KU1BNb3ZlRWxlbWVudEFjdGlvbl8wPUVkaXRvciBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBtb3ZhYmxlIEphdmEgZWxlbWVudHMKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMD1KU1AgUmVuYW1lCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE9aW4gZmlsZTogezB9IGxpbmU6IHsxfQotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yPU1vdmUgVHlwZSAnJ3swfScnIHRvIHBhY2thZ2UgJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zPVJlbmFtZSBNZXRob2QgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ9UmVuYW1lIFR5cGUgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU9UmVuYW1lIFBhY2thZ2UgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzY9SlNQIFJlbmFtZSBDaGFuZ2UKLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgSmF2YVNlcnZlciBQYWdlLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uIAotX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1QgPSBKYXZhU2VydmVyIFBhZ2VzIGNyZWF0ZWQgaW4gcHJvamVjdHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBKYXZhIG1pZ2h0IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiAKLV9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCA9IEZpbGVzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHlvdXIgZGVwbG95ZWQgV2ViIGFwcGxpY2F0aW9uLiAKLVJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgSlNQIHBhZ2UuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXcKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgSlNQJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkpTUCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLSMgQ29waWVkIGZyb20gc3NlLnVpCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IE9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLUNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXz1Db250ZW50IEFzc2lzdCBub3QgYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uCi1KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV89SmF2YSBDb250ZW50IEFzc2lzdCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBjdXJzb3IgbG9jYXRpb24KLSMKLU92ZXJyaWRlX21ldGhvZF9pbj1PdmVycmlkZSBtZXRob2QgaW4gJwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotIwotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMD1KU1AgU291cmNlIHByZWZlcmVuY2VzIGFyZSBiYXNlZCBvbiB0aGUgY29udGVudCB3aXRoaW4gdGhlIEpTUC4KLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBKU1Agd2l0aCBIVE1MIGNvbnRlbnQuCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yPVNlZSA8YT4nJ3swfScnPC9hPiBmb3IgSlNQIHdpdGggWE1MIGNvbnRlbnQuCi1KU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ9SlNQIENvbnRlbnQKLUpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMD1WYWxpZGF0aW5nIGZpbGVzCi1KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzE9VmFsaWRhdGUgSlNQIGZyYWdtZW50cwotIyBKU1AgRnJhZ21lbnRzCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9bm9uZQotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xPVRoZSBwcm9wZXJ0aWVzIHVzZWQgaW5zdGVhZCBvZiB0aGUgcGFnZSBkaXJlY3RpdmUgdGhhdCBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEpTUCBmcmFnbWVudCBmaWxlcy4gIFRoZSBwcm9qZWN0IHNldHRpbmcgaXMgdXNlZCBpZiB5b3Ugc3BlY2lmeSAibm9uZS4iCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzI9TGFuZ3VhZ2U6Ci1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzM9Q29udGVudCBUeXBlOgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV80PUVuYWJsZSBzcGVjaWZpYyBzZXR0aW5nOgotUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGUgcHJvcGVydGllcyBmb3IgSjJFRSBXZWIgcHJvamVjdHMgYWN0IGFzICJwcm9qZWN0IiBkZWZhdWx0IHRvIGJlIGxvb2tlZCB1cCB3aGVuIG5vIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEpTUCBmcmFnbWVudCBmaWxlLgotIyBDU1MgSlNQCi1UaXRsZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBWYWx1ZQotTWVzc2FnZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBwcm9wZXJ0eSB2YWx1ZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNDIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYgZGVzaXJlZCwKLSAqIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzIHBsdWdpbi4gT3RoZXIKLSAqIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiBAcGFyYW0gbGV2ZWwgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzljOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogQXV0b0VkaXRTdHJhdGVneSB0byBoYW5kbGUgY2hhcmFjdGVycyBpbnNlcnRlZCB3aGVuIFRhYiBrZXkgaXMgcHJlc3NlZAotICovCi1wdWJsaWMgY2xhc3MgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFCX0NIQVJBQ1RFUiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGlmIG5vdCBpbiBzbWFydCBpbnNlcnQgbW9kZSBqdXN0IGlnbm9yZQotCQlpZiAoIWlzU21hcnRJbnNlcnRNb2RlKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmIChjb21tYW5kLmxlbmd0aCA9PSAwICYmIGNvbW1hbmQudGV4dCAhPSBudWxsICYmIGNvbW1hbmQudGV4dC5sZW5ndGgoKSA+IDAgJiYgY29tbWFuZC50ZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUikgIT0gLTEpCi0JCQlzbWFydEluc2VydEZvclRhYihjb21tYW5kLCBkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHNwYWNlcyBmb3IgdGFicwotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yVGFiKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gdGFiIGtleSB3YXMgcHJlc3NlZC4gbm93IGNoZWNrIHByZWZlcmVuY2VzIHRvIHNlZSBpZiBuZWVkIHRvIGluc2VydAotCQkvLyBzcGFjZXMgaW5zdGVhZCBvZiB0YWIKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBnZXRJbmRlbnRhdGlvbldpZHRoKCk7Ci0JCWlmIChpbmRlbnRhdGlvbldpZHRoID4gLTEpIHsKLQkJCVN0cmluZyBvcmlnaW5hbFRleHQgPSBjb21tYW5kLnRleHQ7Ci0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIob3JpZ2luYWxUZXh0KTsKLQotCQkJLy8gZGV0ZXJtaW5lIHdoZXJlIGluIGxpbmUgdGhpcyBjb21tYW5kIGJlZ2lucwotCQkJaW50IGxpbmVPZmZzZXQgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKLQkJCQlsaW5lT2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0KLQkJCUlMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IGdldExpbmVUcmFja2VyKGRvY3VtZW50LCBvcmlnaW5hbFRleHQpOwotCi0JCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCQlpbnQgaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUik7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudGF0aW9uV2lkdGgsIGxpbmVPZmZzZXQsIGxpbmVUcmFja2VyLCBpbmRleCk7Ci0KLQkJCQkvLyByZXBsYWNlIFx0IGNoYXJhY3RlciB3aXRoIHNwYWNlcwotCQkJCW5ld1RleHQucmVwbGFjZShpbmRleCwgaW5kZXggKyAxLCBpbmRlbnQpOwotCQkJCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lVHJhY2tlci5yZXBsYWNlKGluZGV4LCAxLCBpbmRlbnQpOwotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHJlcGxhY2luZyB0ZXh0LCBqdXN0Ci0JCQkJCQkvLyByZXNldCB0byBjdXJyZW50IHN0cmluZwotCQkJCQkJbGluZVRyYWNrZXIuc2V0KG5ld1RleHQudG9TdHJpbmcoKSk7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzdGFydEluZGV4ID0gaW5kZXggKyBpbmRlbnQubGVuZ3RoKCk7Ci0JCQkJaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUiwgc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCQljb21tYW5kLnRleHQgPSBuZXdUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHNwYWNlcyBmb3IgbmV4dCB0YWIgc3RvcAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZyhpbnQgaW5kZW50YXRpb25XaWR0aCwgaW50IGxpbmVPZmZzZXQsIElMaW5lVHJhY2tlciBsaW5lVHJhY2tlciwgaW50IGluZGV4KSB7Ci0JCWludCBpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aDsKLQkJaW50IG9mZnNldEluTGluZSA9IC0xOwotCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gbGluZVRyYWNrZXIuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaW5kZXgpOwotCQkJCWlmIChsaW5lSW5mby5nZXRPZmZzZXQoKSA9PSAwICYmIGxpbmVPZmZzZXQgPiAtMSkKLQkJCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJCWVsc2UKLQkJCQkJb2Zmc2V0SW5MaW5lID0gaW5kZXggLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobGluZU9mZnNldCA+IC0xKSB7Ci0JCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJfQotCQl9Ci0JCWlmIChvZmZzZXRJbkxpbmUgPiAtMSAmJiBpbmRlbnRhdGlvbldpZHRoID4gMCkgewotCQkJaW50IHJlbWFpbmRlciA9IG9mZnNldEluTGluZSAlIGluZGVudGF0aW9uV2lkdGg7Ci0JCQlpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aCAtIHJlbWFpbmRlcjsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKQotCQkJaW5kZW50LmFwcGVuZCgnICcpOwotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGEgbGluZSB0cmFja2VyIGZvciB0ZXh0IHdpdGhpbiBjb21tYW5kIGlmIHRleHQgaXMgbXVsdGktbGluZQotCSAqLwotCXByaXZhdGUgSUxpbmVUcmFja2VyIGdldExpbmVUcmFja2VyKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIG9yaWdpbmFsVGV4dCkgewotCQlDb25maWd1cmFibGVMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IG51bGw7Ci0JCWludFtdIGRlbGltcyA9IFRleHRVdGlsaXRpZXMuaW5kZXhPZihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIG9yaWdpbmFsVGV4dCwgMCk7Ci0JCWlmIChkZWxpbXNbMF0gIT0gLTEgfHwgZGVsaW1zWzFdICE9IC0xKSB7Ci0JCQlsaW5lVHJhY2tlciA9IG5ldyBDb25maWd1cmFibGVMaW5lVHJhY2tlcihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkpOwotCQkJbGluZVRyYWNrZXIuc2V0KG9yaWdpbmFsVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVUcmFja2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUoKSB7Ci0JCWJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUgPSBmYWxzZTsKLQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHNtYXJ0IGluc2VydCBtb2RlCi0JCWlmICh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkKLQkJCWlzU21hcnRJbnNlcnRNb2RlID0gdHJ1ZTsKLQkJcmV0dXJuIGlzU21hcnRJbnNlcnRNb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCXJldHVybiB3aWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjY4OGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUCBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWFuZC50ZXh0ICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBzY3JpcHRsZXQgLSBhZGQgZW5kICU+Ci0JCQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0KTsKLQkJCQkJCWlmIChwcmVmaXhlZFdpdGgoZG9jdW1lbnQsIGNvbW1hbmQub2Zmc2V0LCAiPCIpICYmICFub2RlLmdldFNvdXJjZSgpLmVuZHNXaXRoKCIlPiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWNvbW1hbmQudGV4dCArPSAiICU+IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWNvbW1hbmQuc2hpZnRzQ2FyZXQgPSBmYWxzZTsKLQkJCQkJCQljb21tYW5kLmNhcmV0T2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgKyAxOwotCQkJCQkJCWNvbW1hbmQuZG9pdCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCJ7IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJCQlpZiAoKHByZWZpeGVkV2l0aChkb2N1bWVudCwgY29tbWFuZC5vZmZzZXQsICIkIikgfHwgcHJlZml4ZWRXaXRoKGRvY3VtZW50LCBjb21tYW5kLm9mZnNldCwgIiMiKSkgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkhbm9kZS5nZXRTb3VyY2UoKS5lbmRzV2l0aCgifSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWNvbW1hbmQudGV4dCArPSAiIH0iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDE7Ci0JCQkJCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcmVmaXhlZFdpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSBzdHJpbmcubGVuZ3RoKCkgJiYgZG9jdW1lbnQuZ2V0KG9mZnNldCAtIHN0cmluZy5sZW5ndGgoKSwgc3RyaW5nLmxlbmd0aCgpKS5lcXVhbHMoc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9BYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvQWJzdHJhY3RCcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3NDc3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9BYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEFic3RyYWN0IGJyZWFrcG9pbnQgcHJvdmlkZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBicmVha3BvaW50IHByb3ZpZGVyCi0gKiBpbnRlcmZhY2UuCi0gKiAKLSAqIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgZm9yIEphdmFCcmVha3BvaW50UHJvdmlkZXIgYW5kCi0gKiBKYXZhU2NyaXB0QnJlYWtwb2ludFByb3ZpZGVyLCBhbmQgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gc2VwYXJhdGUgSmF2YSBhbmQKLSAqIEphdmFTY3JpcHQgcGFydHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlciBpbXBsZW1lbnRzIElCcmVha3BvaW50UHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX0xJTkUgPSAtMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBKQVZBID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBKQVZBU0NSSVBUID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmFzY3JpcHQiLCAiamF2YXNjcmlwdDEuMCIsICJqYXZhc2NyaXB0MS4xXzMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSJqYXZhc2NyaXB0MS4yIiwgImphdmFzY3JpcHQxLjMiLCAiamF2YXNjcmlwdDEuNCIsICJqYXZhc2NyaXB0MS41IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCSJqYXZhc2NyaXB0MS42IiwgImpzY3JpcHQiLCAic2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfQ09OVEVOVCA9IC0yOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEID0gMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSBoYXlzdGFjaywgU3RyaW5nIG5lZWRsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGhheXN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaGF5c3RhY2tbaV0uZXF1YWxzKG5lZWRsZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHBhZ2UgbGFuZ3VhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRQYWdlTGFuZ3VhZ2UoRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBVTlNVUFBPUlRFRDsKLQotCQlOb2RlTGlzdCBwYWdlRGlyZWN0aXZlcyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1BfRElSRUNUSVZFX1BBR0UpOwotCQkvLyBTZWFyY2ggZm9yIGZpcnN0IGxhbmd1YWdlIGRpcmVjdGl2ZQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VEaXJlY3RpdmVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBwYWdlRGlyZWN0aXZlcy5pdGVtKGkpOwotCQkJTm9kZSBsYW5ndWFnZUF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJsYW5ndWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobGFuZ3VhZ2VBdHRyICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcGFnZUxhbmd1YWdlID0gbGFuZ3VhZ2VBdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChwYWdlTGFuZ3VhZ2UgPT0gbnVsbCB8fCBwYWdlTGFuZ3VhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcmV0dXJuIFVOU1VQUE9SVEVEOwotCQkJCXBhZ2VMYW5ndWFnZSA9IHBhZ2VMYW5ndWFnZS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChjb250YWlucyhKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMsIHBhZ2VMYW5ndWFnZSkpCi0JCQkJCXJldHVybiBKQVZBU0NSSVBUOwotCQkJCWVsc2UgaWYgKHBhZ2VMYW5ndWFnZS5lcXVhbHMoImphdmEiKSkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBKQVZBOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIFVOU1VQUE9SVEVEOwotCQkJfQotCQl9Ci0JCXJldHVybiBKQVZBOyAvLyBKYXZhIGlzIGRlZmF1bHQgaWYgbm8gbGFuZ3VhZ2UgZGlyZWN0aXZlCi0JfQotCi0JLyoKLQkgKiBTZWFyY2ggdGhlIFJlZ2lvbkNvbnRhaW5lcidzIHJlZ2lvbnMgbG9va2luZyBmb3IgSlNQIGNvbnRlbnQuIElmIHZhbGlkCi0JICogY29udGVudCBpcyBmb3VuZCwgcmV0dXJuIHRoZSBwb3NpdGlvbiA+PSAwIElmIG5vIHZhbGlkIGNvbnRlbnQgaXMKLQkgKiBmb3VuZCwgcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQuIElmIGEgcmVnaW9uIHN0YXJ0cyBhZnRlciB0aGUgbGluZSdzCi0JICogZW5kT2Zmc2V0LCByZXR1cm4gRU5EX09GX0xJTkUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFZhbGlkUmVnaW9uUG9zaXRpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbnRhaW5lciwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSByZWdpb25Db250YWluZXIuZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCWludCB2YWxpZFBvc2l0aW9uID0gZ2V0VmFsaWRSZWdpb25Qb3NpdGlvbihtb2RlbCwgKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJCQlpZiAodmFsaWRQb3NpdGlvbiA9PSBFTkRfT0ZfTElORSB8fCB2YWxpZFBvc2l0aW9uID49IDApCi0JCQkJCXJldHVybiB2YWxpZFBvc2l0aW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmVnaW9uIG11c3QgYmUgYXQgbGVhc3QgcGFydGlhbGx5IG9uIHNlbGVjdGVkIGxpbmUKLQkJCQlpZiAocmVnaW9uQ29udGFpbmVyLmdldEVuZE9mZnNldChyZWdpb24pID4gc3RhcnRPZmZzZXQpIHsKLQotCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSByZWdpb25Db250YWluZXIuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJLy8gaWYgcmVnaW9uIHN0YXJ0cyBhZnRlciBsaW5lJ3MgZW5kT2Zmc2V0LCB3ZSdyZSBkb25lCi0JCQkJCS8vIHNlYXJjaGluZwotCQkJCQlpZiAocmVnaW9uU3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpCi0JCQkJCQlyZXR1cm4gRU5EX09GX0xJTkU7Ci0KLQkJCQkJLy8gSWYgcmVnaW9uIGlzIEpTUCBjb250ZW50LCBtYWtlIHN1cmUgdGhlIGxhbmd1YWdlIGlzCi0JCQkJCS8vIEphdmEgbm90IEphdmFzY3JpcHQgYnkKLQkJCQkJLy8gY2hlY2tpbmcgdGhlIGNvbnRlbnQgYXNzaXN0IGFkYXB0ZXIncyB0eXBlLgotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpKSB7Ci0JCQkJCQkvLyBEV006IHRoaXMgbG9naWMgaXMgbm90IGluY29ycmVjdCAuLi4gZ2l2ZW4gY2hhbmdlcwotCQkJCQkJLy8gdG8gYWRhcHRlcnMsIGV0Yy4KLQkJCQkJCS8vIGJ1dCBwcm9iYWJseSBkb24ndCBuZWVkIGFueXRoaW5nIGhlcmUsIHNpbmNlIGJvdGgKLQkJCQkJCS8vIEphdmEgYW5kIEphdmFTY3JpcHQKLQkJCQkJCS8vIGFyZSBzdXBwb3J0ZWQgaW4gVjUuCi0KLQkJCQkJCS8vIG5zZF9UT0RPOiB2ZXJpZnkgdGhpcyEhIQotCi0JCQkJCQkvLyBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0KLQkJCQkJCS8vIChJTm9kZU5vdGlmaWVyKW1vZGVsLmdldE5vZGUocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJLy8gSUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPQotCQkJCQkJLy8gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihDb250ZW50QXNzaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkvLyBpZihmYWN0b3J5IGluc3RhbmNlb2YKLQkJCQkJCS8vIEhUTUxDb250ZW50QXNzaXN0QWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCS8vIElOb2RlQWRhcHRlciBhZGFwdGVyID0KLQkJCQkJCS8vICgoSFRNTENvbnRlbnRBc3Npc3RBZGFwdGVyRmFjdG9yeSlmYWN0b3J5KS5jcmVhdGVBZGFwdGVyKG5vdGlmaWVyLAotCQkJCQkJLy8gcmVnaW9uKTsKLQkJCQkJCS8vIGlmKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyIGluc3RhbmNlb2YKLQkJCQkJCS8vIEpTUEphdmFDb250ZW50QXNzaXN0QWRhcHRlcikKLQotCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJcmV0dXJuIHJlZ2lvblN0YXJ0T2Zmc2V0OwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJCS8vIH0KLQkJCQkJfQotCQkJCQkvLyBhIGN1c3RvbSB0YWcsIGpzcDp1c2VCZWFuLCBnZXRwcm9wZXJ0eSBvciBzZXRwcm9wZXJ0eQotCQkJCQkvLyBzdGF0ZW1lbnQgaXMgYWxzbyBhIHZhbGlkIGJyZWFrcG9pbnQgbG9jYXRpb24KLQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpICYmIChpc0N1c3RvbVRhZ1JlZ2lvbihtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvblN0YXJ0T2Zmc2V0KSkgfHwgcmVnaW9uQ29udGFpbmVyLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTikgfHwgcmVnaW9uQ29udGFpbmVyLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFkpIHx8IHJlZ2lvbkNvbnRhaW5lci5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKSkpIHsKLQotCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJcmV0dXJuIHJlZ2lvblN0YXJ0T2Zmc2V0OwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIERlZmVjdCAjMjQxMDkwLCB0aGUgVGV4dCBOb2RlcyBpbnNpZGUgb2YgSlNQCi0JCQkJCQkvLyBzY3JpcHRsZXRzLCBleHByZXNzaW9ucywgYW5kIGRlY2xhcmF0aW9ucyBhcmUgdmFsaWQKLQkJCQkJCS8vIGJyZWFrcG9pbnQtYWJsZSBsb2NhdGlvbnMKLQkJCQkJCWJvb2xlYW4gaXNDb2RlTm9kZSA9IGZhbHNlOwotCQkJCQkJSW5kZXhlZFJlZ2lvbiBub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb25TdGFydE9mZnNldCk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQkJTm9kZSBkb21Ob2RlID0gKE5vZGUpIG5vZGU7Ci0JCQkJCQkJTm9kZSByb290ID0gZG9tTm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByb290LmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpICYmIGRvbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBkb21Ob2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBwYXJlbnROYW1lID0gZG9tTm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJaXNDb2RlTm9kZSA9IHBhcmVudE5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCkgfHwgcGFyZW50TmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTikgfHwgcGFyZW50TmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpc0NvZGVOb2RlKSB7Ci0JCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJCXJldHVybiByZWdpb25TdGFydE9mZnNldDsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ3VzdG9tVGFnUmVnaW9uKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJRWxlbWVudCB4bWxFbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh4bWxFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sRWxlbWVudCk7Ci0JCQlpZiAoZGVjbCBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQlDTU5vZGUgY21Ob2RlID0gKChDTU5vZGVXcmFwcGVyKSBkZWNsKS5nZXRPcmlnaW5Ob2RlKCk7Ci0JCQkJcmV0dXJuIGNtTm9kZSBpbnN0YW5jZW9mIFRMREVsZW1lbnREZWNsYXJhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBJU291cmNlRWRpdGluZ1RleHRUb29scyBmU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRFZGl0b3JJbnB1dFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpIHsKLQkJcmV0dXJuIGZTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VmFsaWRQb3NpdGlvbihJRG9jdW1lbnQgaWRvYywgaW50IGxpbmVOdW1iZXIpIHsKLQkJaWYgKCEoZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpIGluc3RhbmNlb2YgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpKSB7Ci0JCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJfQotCQlpZiAoaWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JCXRyeSB7Ci0JCQlzdGFydE9mZnNldCA9IGlkb2MuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyIC0gMSk7Ci0JCQllbmRPZmZzZXQgPSBpZG9jLmdldExpbmVPZmZzZXQobGluZU51bWJlcikgLSAxOwotCi0JCQlpZiAoaWRvYyA9PSBudWxsKQotCQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQkJU3RyaW5nIGxpbmVUZXh0ID0gaWRvYy5nZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KS50cmltKCk7Ci0KLQkJCS8vIGJsYW5rIGxpbmVzIG9yIGxpbmVzIHdpdGggb25seSBhbiBvcGVuIG9yIGNsb3NlIGJyYWNlIG9yCi0JCQkvLyBzY3JpcHRsZXQgdGFnIGNhbm5vdCBoYXZlIGEgYnJlYWtwb2ludAotCQkJaWYgKGxpbmVUZXh0LmVxdWFscygiIikgfHwgbGluZVRleHQuZXF1YWxzKCJ7IikgfHwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxpbmVUZXh0LmVxdWFscygifSIpIHx8IGxpbmVUZXh0LmVxdWFscygiPCUiKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGlkb2MpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJLy8gZ28gdGhyb3VnaCB0aGUgbm9kZSdzIHJlZ2lvbnMgbG9va2luZyBmb3IgSlNQIGNvbnRlbnQKLQkJLy8gdW50aWwgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgbGluZQotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJaW50IHZhbGlkUG9zaXRpb24gPSBnZXRWYWxpZFJlZ2lvblBvc2l0aW9uKCgoSURPTURvY3VtZW50KSAoKElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkpLmdldERPTURvY3VtZW50KCkpLmdldE1vZGVsKCksIGZsYXROb2RlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQotCQkJaWYgKHZhbGlkUG9zaXRpb24gPT0gRU5EX09GX0xJTkUpCi0JCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0KLQkJCWlmICh2YWxpZFBvc2l0aW9uID49IDApCi0JCQkJcmV0dXJuIHZhbGlkUG9zaXRpb247Ci0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgc291cmNlRWRpdGluZ1RleHRUb29scykgewotCQlmU291cmNlRWRpdGluZ1RleHRUb29scyA9IHNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YUJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDM2MDcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcuY29yZS5KRElEZWJ1Z01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBIEJyZWFrcG9pbnRQcm92aWRlciBzdXBwb3J0aW5nIHNlcnZlci1zaWRlIEphdmEgYXMgYSBKU1AgbGFuZ3VhZ2UKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFCcmVha3BvaW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlciB7Ci0KLQkvKgotCSAqIEBwYXJhbSByZXMgQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZU5hbWUoSVJlc291cmNlIHJlcykgewotCQlJUGF0aCBwYXRoID0gcmVzLmdldEZ1bGxQYXRoKCk7Ci0JCS8vIEFzc3VtZSB1bmRlciBXZWIgQ29udGVudCBmb2xkZXIgaWYgbW9yZSB0aGFuIDIgc2VnbWVudHMKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAyKSB7Ci0JCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJfQotCQlTdHJpbmcgdHlwZU5hbWUgPSBwYXRoLnRvU3RyaW5nKCkucmVwbGFjZShJUGF0aC5TRVBBUkFUT1IsICcuJyk7Ci0JCWlmIChyZXMuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLQkJCXR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCQl9Ci0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0KLQotCi0JcHVibGljIElTdGF0dXMgYWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW50IHBvcyA9IGdldFZhbGlkUG9zaXRpb24oZG9jdW1lbnQsIGxpbmVOdW1iZXIpOwotCQlpZiAocG9zICE9IE5PX1ZBTElEX0NPTlRFTlQpIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKHJlcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJSkRJRGVidWdNb2RlbC5jcmVhdGVMaW5lQnJlYWtwb2ludChyZXMsIHR5cGVOYW1lLCBsaW5lTnVtYmVyLCBwb3MsIHBvcywgMCwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCBKU1BVSU1lc3NhZ2VzLk9LLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFkZEJyZWFrcG9pbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgaW5wdXQsIE5vZGUgbm9kZSwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHsKLQkJSVJlc291cmNlIHJlcyA9IGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCA/ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKSA6IG51bGw7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmIChnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgaW5zdGFuY2VvZiBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scykgewotCQkJZG9jID0gKChJRE9NU291cmNlRWRpdGluZ1RleHRUb29scykgZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpKS5nZXRET01Eb2N1bWVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlcyAhPSBudWxsICYmICFpc0JyZWFrcG9pbnRFeGlzdChyZXMsIGxpbmVOdW1iZXIpICYmIGlzVmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcikgJiYgKGdldFBhZ2VMYW5ndWFnZShkb2MpID09IEpBVkEpOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSByZXMgQHBhcmFtIGxpbmVOdW1iZXIgQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtwb2ludEV4aXN0KElSZXNvdXJjZSByZXMsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSkRJRGVidWdNb2RlbC5saW5lQnJlYWtwb2ludEV4aXN0cyhnZXRUeXBlTmFtZShyZXMpLCBsaW5lTnVtYmVyKSAhPSBudWxsOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogQHBhcmFtIGRvYyBAcGFyYW0gaWRvYyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gZ2V0VmFsaWRQb3NpdGlvbihpZG9jLCBsaW5lTnVtYmVyKSAhPSBOT19WQUxJRF9DT05URU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyMjk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU2NyaXB0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQSBJQnJlYWtwb2ludFByb3ZpZGVyIHN1cHBvcnRpbmcgc2VydmVyLXNpZGUgSmF2YVNjcmlwdCBhcyBhIEpTUCBsYW5ndWFnZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU2NyaXB0QnJlYWtwb2ludFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RCcmVha3BvaW50UHJvdmlkZXIgewotCXB1YmxpYyBib29sZWFuIGNhbkFkZEJyZWFrcG9pbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgaW5wdXQsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlSZXNvdXJjZSByZXMgPSBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJcmV0dXJuIHJlcyAhPSBudWxsICYmICFpc0JyZWFrcG9pbnRFeGlzdChyZXMsIGxpbmVOdW1iZXIpICYmIGlzVmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcikgJiYgKGdldFBhZ2VMYW5ndWFnZShkb2MpICE9IEpBVkEpOwotCX0KLQotCi0JcHVibGljIElTdGF0dXMgYWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHsKLQkJaW50IHBvcyA9IGdldFZhbGlkUG9zaXRpb24oZG9jdW1lbnQsIGxpbmVOdW1iZXIpOwotCQlpZiAocG9zICE9IE5PX1ZBTElEX0NPTlRFTlQgJiYgY2FuQWRkQnJlYWtwb2ludChkb2N1bWVudCwgaW5wdXQsIGxpbmVOdW1iZXIsIG9mZnNldCkpIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCW5ldyBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQocmVzLCBsaW5lTnVtYmVyLCBwb3MsIHBvcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIEpTUFVJTWVzc2FnZXMuT0ssIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAcGFyYW0gcmVzIEBwYXJhbSBsaW5lTnVtYmVyIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFrcG9pbnRFeGlzdChJUmVzb3VyY2UgcmVzLCBpbnQgbGluZU51bWJlcikgewotCQlJQnJlYWtwb2ludE1hbmFnZXIgbWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gbWFuYWdlci5nZXRCcmVha3BvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIShicmVha3BvaW50c1tpXSBpbnN0YW5jZW9mIEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCkpCi0JCQkJY29udGludWU7Ci0JCQlKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IChKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQpIGJyZWFrcG9pbnRzW2ldOwotCQkJdHJ5IHsKLQkJCQlpZiAoYnJlYWtwb2ludC5nZXRSZXNvdXJjZSgpLmVxdWFscyhyZXMpICYmIGJyZWFrcG9pbnQuZ2V0TGluZU51bWJlcigpID09IGxpbmVOdW1iZXIpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBkb2MgQHBhcmFtIGlkb2MgQHBhcmFtIGxpbmVOdW1iZXIgQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQb3NpdGlvbihJRG9jdW1lbnQgaWRvYywgaW50IGxpbmVOdW1iZXIpIHsKLQkJcmV0dXJuIGdldFZhbGlkUG9zaXRpb24oaWRvYywgbGluZU51bWJlcikgIT0gTk9fVkFMSURfQ09OVEVOVDsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gZ2V0RWRpdG9ySW5wdXRSZXNvdXJjZShpbnB1dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWVkYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcuY29yZS5KRElEZWJ1Z01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludFByb3ZpZGVyOwotCi0vKioKLSAqIEEgSUJyZWFrcG9pbnRQcm92aWRlciBzdXBwb3J0aW5nIEpTUCBicmVha3BvaW50cyBmb3IgYSBOb24tSmF2YSBMYW5ndWFnZQotICogU291cmNlIEpTUCBwYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlciBpbXBsZW1lbnRzIElCcmVha3BvaW50UHJvdmlkZXIsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NQYXR0ZXJuID0gbnVsbDsKLQotCXB1YmxpYyBJU3RhdHVzIGFkZEJyZWFrcG9pbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgaW5wdXQsIGludCBlZGl0b3JMaW5lTnVtYmVyLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdmFsaWQgcG9zaXRpb24gdG8gc2V0IGJyZWFrcG9pbnQKLQkJaW50IHBvcyA9IGdldFZhbGlkUG9zaXRpb24oZG9jdW1lbnQsIGVkaXRvckxpbmVOdW1iZXIpOwotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChwb3MgPj0gMCkgewotCQkJSVJlc291cmNlIHJlcyA9IGdldFJlc291cmNlRnJvbUlucHV0KGlucHV0KTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwYXRoID0gbnVsbDsgLy9yZXMuZ2V0TmFtZSgpOy8vIHJlcy5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMikudG9TdHJpbmcoKTsKLQkJCQlJQnJlYWtwb2ludCBwb2ludCA9IEpESURlYnVnTW9kZWwuY3JlYXRlU3RyYXR1bUJyZWFrcG9pbnQocmVzLCAiSlNQIiwgcmVzLmdldE5hbWUoKSwgcGF0aCwgZ2V0Q2xhc3NQYXR0ZXJuKCksIGVkaXRvckxpbmVOdW1iZXIsIHBvcywgcG9zLCAwLCB0cnVlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwb2ludCA9PSBudWxsKSB7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsICJ1bnN1cHBvcnRlZCBpbnB1dCB0eXBlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQkvLyBGb3Igbm9uLXJlc291cmNlcywgdXNlIHRoZSB3b3Jrc3BhY2Ugcm9vdCBhbmQgYSBjb29yZGluYXRlZAotCQkJCS8vIGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgdG8KLQkJCQkvLyBwcmV2ZW50IHVud2FudGVkIChicmVha3BvaW50KSBtYXJrZXJzIGZyb20gYmVpbmcgbG9hZGVkCi0JCQkJLy8gaW50byB0aGUgZWRpdG9ycy4KLQkJCQlyZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCVN0cmluZyBpZCA9IGlucHV0LmdldE5hbWUoKTsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0ICYmICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFN0b3JhZ2UoKSAhPSBudWxsICYmICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpICE9IG51bGwpIHsKLQkJCQkJaWQgPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJYXR0cmlidXRlcy5wdXQoU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsLlNFQ09OREFSWV9JRF9LRVksIGlkKTsKLQkJCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQkJSUJyZWFrcG9pbnQgcG9pbnQgPSBKRElEZWJ1Z01vZGVsLmNyZWF0ZVN0cmF0dW1CcmVha3BvaW50KHJlcywgIkpTUCIsIGlucHV0LmdldE5hbWUoKSwgcGF0aCwgZ2V0Q2xhc3NQYXR0ZXJuKCksIGVkaXRvckxpbmVOdW1iZXIsIHBvcywgcG9zLCAwLCB0cnVlLCBhdHRyaWJ1dGVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwb2ludCA9PSBudWxsKSB7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsICJ1bnN1cHBvcnRlZCBpbnB1dCB0eXBlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCBKU1BVSU1lc3NhZ2VzLk9LLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENsYXNzUGF0dGVybigpIHsKLQkJcmV0dXJuIGZDbGFzc1BhdHRlcm47Ci0JfQotCi0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VGcm9tSW5wdXQoaW5wdXQpOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlRnJvbUlucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhIHZhbGlkIHBvc2l0aW9uIHNvbWV3aGVyZSBvbiBsaW5lTnVtYmVyIGluIGRvY3VtZW50LCBpZG9jLCB3aGVyZQotCSAqIGEgYnJlYWtwb2ludCBjYW4gYmUgc2V0IGFuZCByZXR1cm5zIHRoYXQgcG9zaXRpb24uIC0xIGlzIHJldHVybmVkIGlmIGEKLQkgKiBwb3NpdGlvbiBjb3VsZCBub3QgYmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIGlkb2MKLQkgKiBAcGFyYW0gZWRpdG9yTGluZU51bWJlcgotCSAqIEByZXR1cm4gcG9zaXRpb24gdG8gc2V0IGJyZWFrcG9pbnQgb3IgLTEgaWYgbm8gcG9zaXRpb24gY291bGQgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgZWRpdG9yTGluZU51bWJlcikgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChpZG9jICE9IG51bGwpIHsKLQotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCWludCBlbmRPZmZzZXQgPSAwOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmUgPSBpZG9jLmdldExpbmVJbmZvcm1hdGlvbihlZGl0b3JMaW5lTnVtYmVyIC0gMSk7Ci0JCQkJc3RhcnRPZmZzZXQgPSBsaW5lLmdldE9mZnNldCgpOwotCQkJCWVuZE9mZnNldCA9IE1hdGgubWF4KGxpbmUuZ2V0T2Zmc2V0KCksIGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpKTsKLQotCQkJCVN0cmluZyBsaW5lVGV4dCA9IGlkb2MuZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCkudHJpbSgpOwotCi0JCQkJLy8gYmxhbmsgbGluZXMgb3IgbGluZXMgd2l0aCBvbmx5IGFuIG9wZW4gb3IgY2xvc2UgYnJhY2Ugb3IKLQkJCQkvLyBzY3JpcHRsZXQgdGFnIGNhbm5vdCBoYXZlIGEgYnJlYWtwb2ludAotCQkJCWlmIChsaW5lVGV4dC5lcXVhbHMoIiIpIHx8IGxpbmVUZXh0LmVxdWFscygieyIpIHx8IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWxpbmVUZXh0LmVxdWFscygifSIpIHx8IGxpbmVUZXh0LmVxdWFscygiPCUiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGdldCBhbGwgcGFydGl0aW9ucyBmb3IgY3VycmVudCBsaW5lCi0JCQkJCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBudWxsOwotCi0JCQkJCXBhcnRpdGlvbnMgPSBpZG9jLmNvbXB1dGVQYXJ0aXRpb25pbmcoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQkJU3RyaW5nIHR5cGUgPSBwYXJ0aXRpb25zW2ldLmdldFR5cGUoKTsKLQkJCQkJCS8vIGlmIGZvdW5kIGpzcCBqYXZhIGNvbnRlbnQsIGpzcCBkaXJlY3RpdmUgdGFncywKLQkJCQkJCS8vIGN1c3RvbQotCQkJCQkJLy8gdGFncywKLQkJCQkJCS8vIHJldHVybiB0aGF0IHBvc2l0aW9uCi0JCQkJCQlpZiAodHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBIHx8IHR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgewotCQkJCQkJCXJlc3VsdCA9IHBhcnRpdGlvbnNbaV0uZ2V0T2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlc3VsdCA9IC0xOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nICYmIGRhdGEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlmQ2xhc3NQYXR0ZXJuID0gKFN0cmluZykgZGF0YTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMpIHsKLQkJLy8gbm90IHVzZWQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFzY3JpcHRMaW5lQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODU4MGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFzY3JpcHRMaW5lQnJlYWtwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVsIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQgewotCi0JLyoqCi0JICogQHBhcmFtIHJlcwotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogQHBhcmFtIHBvcwotCSAqIEBwYXJhbSBwb3MxCi0JICovCi0JcHVibGljIEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludChJUmVzb3VyY2UgcmVzLCBpbnQgbGluZU51bWJlciwgaW50IHBvcywgaW50IHBvczEpIHsKLQotCQkvLyBUT0RPIFNob3VsZCBiZSBkZWxldGVkPyBBbG9uZyB3aXRoIGNhbGxpbmcgY2xhc3M/Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdXRvSW1wb3J0UHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F1dG9JbXBvcnRQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQ4YzE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F1dG9JbXBvcnRQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQXV0b0ltcG9ydFByb3Bvc2FsIGV4dGVuZHMgSlNQQ29tcGxldGlvblByb3Bvc2FsIHsKLQkKLQkvLyB0aGUgaW1wb3J0IHN0cmluZywgbm8gcXVvdGVzIG9yIGNvbG9ucwotCVN0cmluZyBmSW1wb3J0RGVjbGFyYXRpb247Ci0JCi0JcHVibGljIEF1dG9JbXBvcnRQcm9wb3NhbChTdHJpbmcgaW1wb3J0RGVjbGFyYXRpb24sIFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiwgU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIGludCByZWxldmFuY2UsIGJvb2xlYW4gdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGN1cnNvclBvc2l0aW9uLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSk7Ci0JCXNldEltcG9ydERlY2xhcmF0aW9uKGltcG9ydERlY2xhcmF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJc3VwZXIuYXBwbHkodmlld2VyLCB0cmlnZ2VyLCBzdGF0ZU1hc2ssIG9mZnNldCk7Ci0JCWFkZEltcG9ydERlY2xhcmF0aW9uKHZpZXdlcik7Ci0JfQotCS8qKgotCSAqIGFkZHMgdGhlIGltcG9ydCBkZWNsYXJhdGlvbiB0byB0aGUgZG9jdW1lbnQgaW4gdGhlIHZpZXdlciBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24KLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEltcG9ydERlY2xhcmF0aW9uKElUZXh0Vmlld2VyIHZpZXdlcikgewotCQkKLQkJSURvY3VtZW50IGRvYyA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkKLQkJLy8gY2FsY3VsYXRlIG9uY2UgYW5kIHBhc3MgYWxvbmcKLQkJYm9vbGVhbiBpc1htbCA9IGlzWG1sRm9ybWF0KGRvYyk7Ci0JCQotCQlpbnQgaW5zZXJ0UG9zaXRpb24gPSBnZXRJbnNlcnRQb3NpdGlvbihkb2MsIGlzWG1sKTsKLQkJU3RyaW5nIGluc2VydFRleHQgPSBjcmVhdGVJbXBvcnREZWNsYXJhdGlvbihkb2MsIGlzWG1sKTsKLQkJSW5zZXJ0RWRpdCBpbnNlcnQgPSBuZXcgSW5zZXJ0RWRpdChpbnNlcnRQb3NpdGlvbiwgaW5zZXJ0VGV4dCk7Ci0JCXRyeSB7Ci0JCQlpbnNlcnQuYXBwbHkoZG9jKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGN1cnNvciBwb3NpdGlvbiBhZnRlciBpcyBjb3JyZWN0Ci0JCXNldEN1cnNvclBvc2l0aW9uKGdldEN1cnNvclBvc2l0aW9uKCkgKyBpbnNlcnRUZXh0Lmxlbmd0aCgpKTsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBpc1htbAotCSAqIEByZXR1cm4gcG9zaXRpb24gYWZ0ZXIgPGpzcDpyb290PiBpZiB4bWwsIG90aGVyd2lzZSByaWdodCBiZWZvcmUgdGhlIGRvY3VtZW50IGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRJbnNlcnRQb3NpdGlvbihJRG9jdW1lbnQgZG9jLCBib29sZWFuIGlzWG1sKSB7Ci0JCWludCBwb3MgPSAwOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jKTsKLQkJdHJ5IHsKLQkJCWlmKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYoc01vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb2N1bWVudE5vZGUgPSAoKElET01Nb2RlbClzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCU5vZGUgZG9jRWxlbWVudCA9IGRvY3VtZW50Tm9kZS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJaWYoZG9jRWxlbWVudCAhPSBudWxsICYmIGRvY0VsZW1lbnQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9ICgoSURPTUVsZW1lbnQpZG9jRWxlbWVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWlmKGlzWG1sKSB7Ci0JCQkJCQkJLy8gaW5zZXJ0IHJpZ2h0IGFmdGVyIGRvY3VtZW50IGVsZW1lbnQKLQkJCQkJCQlwb3MgPSBzZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGluc2VydCBiZWZvcmUgZG9jdW1lbnQgZWxlbWVudAotCQkJCQkJCXBvcyA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGRvY3VtZW50IGlzIHhtbC1qc3Agc3ludGF4LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYbWxGb3JtYXQoSURvY3VtZW50IGRvYykgewotCQlib29sZWFuIGlzWG1sID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQl0cnkgewotCQkJaWYoc01vZGVsICE9IG51bGwpIHsKLQkJCQlpZighaXNYbWwpIHsKLQkJCQkJaWYoc01vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnROb2RlID0gKChJRE9NTW9kZWwpc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZG9jdW1lbnROb2RlLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaXNYbWwgPSBkb2NFbGVtZW50ICE9IG51bGwgJiYgKChkb2NFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJqc3A6cm9vdCIpKSB8fCAoKCgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCAmJiAoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBpc1htbDsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBpc1htbAotCSAqIEByZXR1cm4gYXBwcm9wcmlhdGUgaW1wb3J0IGRlY2xhcmF0aW9uIHN0cmluZyBkZXBlbmRpbmcgaWYgZG9jdW1lbnQgaXMgeG1sIG9yIG5vdAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKElEb2N1bWVudCBkb2MsIGJvb2xlYW4gaXNYbWwpIHsKLQkJU3RyaW5nIGRlbGltID0gKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpID8gKChJU3RydWN0dXJlZERvY3VtZW50KWRvYykuZ2V0TGluZURlbGltaXRlcigpIDogVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2MpOwotCQlpZihpc1htbCkKLQkJCXJldHVybiBkZWxpbSArICI8anNwOmRpcmVjdGl2ZS5wYWdlIGltcG9ydD1cIiIrZ2V0SW1wb3J0RGVjbGFyYXRpb24oKSsiXCIvPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gIjwlQHBhZ2UgaW1wb3J0PVwiIiArIGdldEltcG9ydERlY2xhcmF0aW9uKCkgKyAiXCIlPiIgKyBkZWxpbTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbXBvcnREZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIGZJbXBvcnREZWNsYXJhdGlvbjsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SW1wb3J0RGVjbGFyYXRpb24oU3RyaW5nIGltcG9ydERlY2xhcmF0aW9uKSB7Ci0JCWZJbXBvcnREZWNsYXJhdGlvbiA9IGltcG9ydERlY2xhcmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0JlYW5JbmZvUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0JlYW5JbmZvUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkZWQ2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9CZWFuSW5mb1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogTmF2aWdhdGVzIHRoZSBJSmF2YVByb2plY3QgY2xhc3NwYXRoIChpbmNsLiBzb3VyY2UpIG9uIGEgZ2l2ZW4gcmVzb3VyY2UgYW5kIGluZmVycyBiZWFuIHByb3BlcnRpZXMKLSAqIGdpdmVuIGEgZnVsbHkgcXVhbGlmaWVkIGJlYW5uYW1lLiBCZWFuIHByb3BlcnRpZXMgY2FuIGJlIHJldHJpZXZlZCB1c2luZzoKLSAqIDxjb2RlPmdldFJ1bnRpbWVQcm9wZXJ0aWVzKElSZXNvdXJjZSBiYXNlUmVzb3VyY2UsIFN0cmluZyB0eXBlTmFtZSk8L2NvZGU+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkluZm9Qcm92aWRlciBpbXBsZW1lbnRzIElCZWFuSW5mb1Byb3ZpZGVyIHsKLQotCXB1YmxpYyBjbGFzcyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yIGltcGxlbWVudHMgSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IgewotCQlTdHJpbmcgZlR5cGUgPSBudWxsOwotCQlTdHJpbmcgZk5hbWUgPSBudWxsOwotCQlib29sZWFuIGZSZWFkYWJsZSA9IHRydWU7Ci0JCWJvb2xlYW4gZldyaXRhYmxlID0gdHJ1ZTsKLQotCQlwdWJsaWMgSmF2YVByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIGJvb2xlYW4gcmVhZGFibGUsIGJvb2xlYW4gd3JpdGFibGUpIHsKLQkJCWZOYW1lID0gbmFtZTsKLQkJCWZUeXBlID0gdHlwZTsKLQkJCWZSZWFkYWJsZSA9IHJlYWRhYmxlOwotCQkJZldyaXRhYmxlID0gd3JpdGFibGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmVkVHlwZSgpIHsKLQkJCXJldHVybiBmVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCQlyZXR1cm4gZk5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZk5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXRSZWFkYWJsZSgpIHsKLQkJCXJldHVybiBmUmVhZGFibGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXRXcml0ZWFibGUoKSB7Ci0JCQlyZXR1cm4gZldyaXRhYmxlOwotCQl9Ci0JfQotCi0JLy8gbG9va3MgdXAgZW5jb2RlZCB0eXBlIChzZWUgQ2xhc3MuZ2V0TmFtZSksIGFuZCBnaXZlcyB5b3UgYSBkaXNwbGF5YWJsZSBzdHJpbmcKLQlwcml2YXRlIEhhc2hNYXAgZkVuY29kZWRUeXBlTWFwID0gbnVsbDsKLQkvLyB0byBhdm9pZCByZXBlYXQgcHJvcGVydGllcyBmcm9tIHNob3dpbmcgdXAKLQlwcml2YXRlIEhhc2hTZXQgZlJlcGVhdE1ldGhvZHMgPSBudWxsOwotCi0JcHVibGljIEJlYW5JbmZvUHJvdmlkZXIoKSB7Ci0JCWZSZXBlYXRNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZlcnJlZCBwcm9wZXJ0aWVzIG9mIGEgYmVhbiBiYXNlZCBvbiB0aGUgcHJvamVjdCBmcm9tIHRoZSBiYXNlUmVzb3VyY2UsCi0JICogYW5kIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYmVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVJlc291cmNlIHRoZSBiYXNlIHJlc291cmNlIHdoZXJlIHRoZSBiZWFuIGlzIGJlaW5nIHVzZWQKLQkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIDxpPmZ1bGx5IHF1YWxpZmllZDwvaT4gdHlwZSBuYW1lIChlZy4gamF2YXguc3dpbmcuSkJ1dHRvbikgb2YgdGhlIGJlYW4KLQkgKi8KLQlwdWJsaWMgSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRSdW50aW1lUHJvcGVydGllcyhJUmVzb3VyY2UgYmFzZVJlc291cmNlLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGJhc2VSZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlRdWFsaWZpZWROYW1lIHR5cGVRdWFsaWZpZWROYW1lID0gZ2V0VHlwZVF1YWxpZmllZE5hbWUodHlwZU5hbWUpOwotCQlMaXN0IGdldE1ldGhvZFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaXNNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHNldE1ldGhvZFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZGVzY3JpcHRvclJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUodHlwZVF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCkgKyAiLiIgKyB0eXBlUXVhbGlmaWVkTmFtZS5nZXRMb2NhbE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHR5cGUgbXVzdCBleGlzdAotCQkJaWYodHlwZSAhPSBudWxsKSB7Ci0JCQkJSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCQkJCUlUeXBlW10gc3VwZXJzID0gaGllcmFyY2h5LmdldEFsbFN1cGVyY2xhc3Nlcyh0eXBlKTsKLQkKLQkJCQlJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotCQkJCS8vIGl0ZXJhdGUgdGhlIGJlYW4ncyBtZXRob2RzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKQotCQkJCQlhY2NlcHRNZXRob2QoZ2V0TWV0aG9kUmVzdWx0cywgaXNNZXRob2RSZXN1bHRzLCBzZXRNZXRob2RSZXN1bHRzLCBtZXRob2RzW2ldKTsKLQkJCQkvLyB0aGUgYmVhbiBoaWVyYXJjaHkncyBtZXRob2RzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbWV0aG9kcyA9IHN1cGVyc1tpXS5nZXRNZXRob2RzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykKLQkJCQkJCWFjY2VwdE1ldGhvZChnZXRNZXRob2RSZXN1bHRzLCBpc01ldGhvZFJlc3VsdHMsIHNldE1ldGhvZFJlc3VsdHMsIG1ldGhvZHNbal0pOwotCQkJCX0KLQkJCQlhZGFwdE1ldGhvZHNUb1Byb3BlcnR5RGVzY3JpcHRvcnMoZ2V0TWV0aG9kUmVzdWx0cywgaXNNZXRob2RSZXN1bHRzLCBzZXRNZXRob2RSZXN1bHRzLCBkZXNjcmlwdG9yUmVzdWx0cyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ibGVtIG5hdmlnYXRpbmcgSmF2YVByb2plY3QgaW4gQmVhbkluZm9Qcm92aWRlciIsIGptZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltdIGZpbmFsUmVzdWx0cyA9IG5ldyBJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9yUmVzdWx0cy5zaXplKCldOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRlc2NyaXB0b3JSZXN1bHRzLnRvQXJyYXkoKSwgMCwgZmluYWxSZXN1bHRzLCAwLCBkZXNjcmlwdG9yUmVzdWx0cy5zaXplKCkpOwotCQlyZXR1cm4gZmluYWxSZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZyb20gbWV0aG9kIGRlY2xhcmF0aW9uIGxpc3RzLCBjcmVhdGVzIGFuZCBmaWxscyBhIGxpc3Qgb2YgSmF2YVByb3BlcnR5RGVzY3JpcHRvcnMuCi0JICogQHBhcmFtIGdldE1ldGhvZHMKLQkgKiBAcGFyYW0gaXNNZXRob2RzCi0JICogQHBhcmFtIHNldE1ldGhvZHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRvclJlc3VsdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRhcHRNZXRob2RzVG9Qcm9wZXJ0eURlc2NyaXB0b3JzKExpc3QgZ2V0TWV0aG9kcywgTGlzdCBpc01ldGhvZHMsIExpc3Qgc2V0TWV0aG9kcywgTGlzdCBkZXNjcmlwdG9ycykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVhZGFibGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUhhc2hNYXAgdHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGl0ZXJhdGUgdGhyb3VnaCBnZXQqIGFuZCBpcyogbWV0aG9kcywgdXBkYXRpbmcgJ3JlYWRhYmxlJyBsaXN0IGFuZCAndHlwZXMnIG1hcAotCQlmaWx0ZXJHZXRNZXRob2RzKGdldE1ldGhvZHMsIHJlYWRhYmxlLCB0eXBlcyk7Ci0JCWZpbHRlcklzTWV0aG9kcyhpc01ldGhvZHMsIHJlYWRhYmxlLCB0eXBlcyk7Ci0KLQkJLy8gaXRlcmF0ZSBzZXQqIG1ldGhvZHMsIGNoZWNraW5nIG92ZXJsYXAgdy8gcmVhZGFibGUKLQkJSXRlcmF0b3IgaXQgPSBzZXRNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCUlNZXRob2QgdGVtcCA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBlbmNvZGVkUGFyYW1zID0gbnVsbDsKLQkJU3RyaW5nIHJldHVyblR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcGFyYW0wID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl0ZW1wID0gKElNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW5hbWUgPSBjcmVhdGVQcm9wZXJ0eU5hbWVGcm9tTWV0aG9kKHRlbXApOwotCQkJLy8gaW52YWxpZCBuYW1pbmcgY29udmVudGlvbgotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJcmV0dXJuVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZSh0ZW1wLmdldFJldHVyblR5cGUoKSk7Ci0JCQkvLyBzZXR0ZXIgc2hvdWxkIGhhdmUgbm8gcmV0dXJuIHR5cGUKLQkJCWlmICghcmV0dXJuVHlwZS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBuZWVkIHRvIGdldCB0eXBlIGZyb20gcGFyYW1ldGVyCi0JCQllbmNvZGVkUGFyYW1zID0gdGVtcC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKGVuY29kZWRQYXJhbXMgIT0gbnVsbCAmJiBlbmNvZGVkUGFyYW1zLmxlbmd0aCA+IDApIHsKLQkJCQlpZiAoZW5jb2RlZFBhcmFtcy5sZW5ndGggPiAxKSB7Ci0JCQkJCS8vIG11bHRpcGxlIHBhcmFtcwotCQkJCQlwYXJhbTAgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFBhcmFtc1swXSk7Ci0JCQkJCWlmICghcGFyYW0wLmVxdWFscygiaW50IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIG5vdCBhIHZhbGlkIGluZGV4ZWQgcHJvcGVydHkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJdHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzFdKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG9uZSBwYXJhbSwgcmVndWxhciBzZXR0ZXIKLQkJCQkJaWYgKGlzQXJyYXkoZW5jb2RlZFBhcmFtc1swXSkpCi0JCQkJCQl0eXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlYWRhYmxlLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJLy8gd3JpdGFibGUgYW5kIHJlYWRhYmxlCi0JCQkJaWYgKCFmUmVwZWF0TWV0aG9kcy5jb250YWlucyhuYW1lKSkgewotCQkJCQlkZXNjcmlwdG9ycy5hZGQobmV3IEphdmFQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgKFN0cmluZykgdHlwZXMuZ2V0KG5hbWUpLCB0cnVlLCB0cnVlKSk7Ci0JCQkJCXJlYWRhYmxlLnJlbW92ZShuYW1lKTsKLQkJCQkJZlJlcGVhdE1ldGhvZHMuYWRkKG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdhc24ndCByZWFkYWJsZSwganVzdCB3cml0YWJsZQotCQkJCVN0cmluZ1tdIHBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQkvLyBjYW4ndCBiZSBzZXRQcm9wZXJ0eSBpZiBubyBwYXJhbWV0ZXJzCi0JCQkJaWYgKCEocGFyYW1zLmxlbmd0aCA+IDApKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIWZSZXBlYXRNZXRob2RzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJCXR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUocGFyYW1zWzBdKTsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIHR5cGUsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJCWZSZXBlYXRNZXRob2RzLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIGxlZnRvdmVyIGZyb20gcmVhZGFibGUsIGdldCogYW5kIGlzKiBtZXRob2RzIChyZWFkYWJsZSA9IHRydWUsIHdyaXRhYmxlID0gZmFsc2UpCi0JCWl0ID0gcmVhZGFibGUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJbmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobmFtZSkpIHsKLQkJCQlkZXNjcmlwdG9ycy5hZGQobmV3IEphdmFQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgKFN0cmluZykgdHlwZXMuZ2V0KG5hbWUpLCB0cnVlLCBmYWxzZSkpOwotCQkJCWZSZXBlYXRNZXRob2RzLmFkZChuYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWx0ZXJHZXRNZXRob2RzKExpc3QgZ2V0TWV0aG9kcywgTGlzdCByZWFkYWJsZSwgSGFzaE1hcCB0eXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZXRob2QgdGVtcDsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZyBlbmNvZGVkUmV0dXJuVHlwZTsKLQkJU3RyaW5nIHJldHVyblR5cGU7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0TWV0aG9kcy5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBlbmNvZGVkUGFyYW1zOwotCQlTdHJpbmcgcGFyYW1UeXBlOwotCQkvLyBpdGVyYXRlIGdldCogbWV0aG9kcwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl0ZW1wID0gKElNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW5hbWUgPSBjcmVhdGVQcm9wZXJ0eU5hbWVGcm9tTWV0aG9kKHRlbXApOwotCQkJLy8gaW52YWxpZCBiZWFuIG5hbWluZyBjb252ZW50aW9uCi0JCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQllbmNvZGVkUmV0dXJuVHlwZSA9IHRlbXAuZ2V0UmV0dXJuVHlwZSgpOwotCQkJcmV0dXJuVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUmV0dXJuVHlwZSk7Ci0KLQkJCS8vICBjYW4ndCBnZXQgYmUgYSBnZXRQcm9wZXJ0eSBpZiByZXR1cm5zIHZvaWQKLQkJCWlmIChyZXR1cm5UeXBlLmVxdWFscygidm9pZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGNoZWNrIHBhcmFtcyBpbiBjYXNlIGl0J3MgaW5kZXhlZCBwcm9wZXR5Ci0JCQllbmNvZGVkUGFyYW1zID0gdGVtcC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKGVuY29kZWRQYXJhbXMgIT0gbnVsbCAmJiBlbmNvZGVkUGFyYW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJcGFyYW1UeXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCS8vIHN5bnRheCBpcyA+IFR5cGUgZ2V0dGVyKGludCk7Ci0JCQkJaWYgKCFwYXJhbVR5cGUuZXF1YWxzKCJpbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vaXQncyBub3QgYW4gaW5kZXhlZCBwcm9wZXJ0eQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gaXQgaXMgaW5kZXhlZCwgcHJvcCB0eXBlIGlzIGFuIEFSUkFZCi0JCQkJcmV0dXJuVHlwZSArPSAiW10iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXJlYWRhYmxlLmFkZChuYW1lKTsKLQkJCXR5cGVzLnB1dChuYW1lLCByZXR1cm5UeXBlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbHRlcklzTWV0aG9kcyhMaXN0IGlzTWV0aG9kUmVzdWx0cywgTGlzdCByZWFkYWJsZSwgSGFzaE1hcCB0eXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZXRob2QgdGVtcDsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZyBlbmNvZGVkUmV0dXJuVHlwZTsKLQkJU3RyaW5nIHJldHVyblR5cGU7Ci0JCVN0cmluZ1tdIGVuY29kZWRQYXJhbXM7Ci0JCVN0cmluZyBwYXJhbVR5cGU7Ci0JCS8vIGl0ZXJhdGUgaXMqIG1ldGhvZHMKLQkJSXRlcmF0b3IgaXQgPSBpc01ldGhvZFJlc3VsdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgYmVhbiBuYW1pbmcgY29udmVudGlvbgotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWVuY29kZWRSZXR1cm5UeXBlID0gdGVtcC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlyZXR1cm5UeXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRSZXR1cm5UeXBlKTsKLQotCQkJLy8gaXNQcm9wZXJ0eSBvbmx5IHZhbGlkIGZvciBib29sZWFuCi0JCQlpZiAoIXJldHVyblR5cGUuZXF1YWxzKCJib29sZWFuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJLy8gY2hlY2sgcGFyYW1zIGluIGNhc2UgaXQncyBpbmRleGVkIHByb3BldHkKLQkJCWVuY29kZWRQYXJhbXMgPSB0ZW1wLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlpZiAoZW5jb2RlZFBhcmFtcyAhPSBudWxsICYmIGVuY29kZWRQYXJhbXMubGVuZ3RoID09IDEpIHsKLQkJCQlwYXJhbVR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFBhcmFtc1swXSk7Ci0JCQkJLy8gc3ludGF4IGlzID4gVHlwZSBnZXR0ZXIoaW50KTsKLQkJCQlpZiAoIXBhcmFtVHlwZS5lcXVhbHMoImludCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy9pdCdzIG5vdCBhIHZhbGlkIGluZGV4ZWQgcHJvcGVydHkKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQlyZWFkYWJsZS5hZGQobmFtZSk7Ci0JCQl0eXBlcy5wdXQobmFtZSwgcmV0dXJuVHlwZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXNzIGluIGEgZ2V0KnxzZXQqfGlzKiBtZXRob2QgYW5kIGl0IHdpbGwgcmV0dXJuIGFuIGluZmVycmVkIHByb3BlcnR5IG5hbWUgdXNpbmcgPGNvZGU+SW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShTdHJpbmcpPC9jb2RlPgotCSAqIEBwYXJhbSB0ZW1wCi0JICogQHJldHVybiBhbiBpbmZlcnJlZCBwcm9wZXJ0eSBuYW1lIGJhc2VkIG9uIHRoZSBJTWV0aG9kIG5hbWUsIG51bGwgaWYgdGhlIG5hbWUgaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byBiZWFuIHNwZWMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVQcm9wZXJ0eU5hbWVGcm9tTWV0aG9kKElNZXRob2QgdGVtcCkgewotCQlTdHJpbmcgbmFtZSA9IHRlbXAuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobmFtZS5zdWJzdHJpbmcoMikpOwotCQllbHNlCi0JCQkvLyBtdXN0IGJlIGdldCBvciBzZXQKLQkJCW5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDMpKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbCBmaWx0ZXJpbmcgb2YgbWV0aG9kcy4gIENoZWNrcyBwcmVmaXggaWYgaXQncyB2YWxpZCBsZW5ndGguICBJZiB0aGUgcHJlZml4IGlzICJnZXQiIHRoZSAgbWV0aG9kIG5hbWUgCi0JICogaXMgcGxhY2VkIGluIHRoZSBnZXRNZXRob2RSZXN1bHRzIExpc3QuICBJZiB0aGUgcHJlZml4IGlzICJpcyIsIHRoZSBuYW1lIGlzIGFkZGVkIHRvIHRoZSBpc01ldGhvZFJlc3VsdHMgbGlzdC4gIElmIHRoZQotCSAqIHByZWZpeCBpcyAic2V0IiwgaXQncyBhZGRlZCB0byB0aGUgc2V0TWV0aG9kUmVzdWx0c0xpc3QuCi0JICogCi0JICogQHBhcmFtIGdldE1ldGhvZFJlc3VsdHMKLQkgKiBAcGFyYW0gaXNNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIHNldE1ldGhvZFJlc3VsdHMKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFjY2VwdE1ldGhvZChMaXN0IGdldE1ldGhvZFJlc3VsdHMsIExpc3QgaXNNZXRob2RSZXN1bHRzLCBMaXN0IHNldE1ldGhvZFJlc3VsdHMsIElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKCFmUmVwZWF0TWV0aG9kcy5jb250YWlucyhtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCWZSZXBlYXRNZXRob2RzLmFkZChtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQlpbnQgZmxhZ3MgPSBtZXRob2QuZ2V0RmxhZ3MoKTsKLQkJCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlpZiAoRmxhZ3MuaXNQdWJsaWMoZmxhZ3MpKSB7Ci0JCQkJaWYgKG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAzICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0TWV0aG9kUmVzdWx0cy5hZGQobWV0aG9kKTsKLQkJCQllbHNlIGlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMiAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNNZXRob2RSZXN1bHRzLmFkZChtZXRob2QpOwotCQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAzICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgic2V0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0TWV0aG9kUmVzdWx0cy5hZGQobWV0aG9kKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqIEByZXR1cm4gYSBRdWFsaWZpZWQgbmFtZSB3aXRoIHRoZSBwYWNrYWdlIGFzIHRoZSBxdWFsaWZpZXIsIGFuZCBjbGFzcyBuYW1lIGFzIExvY2FsTmFtZQotCSAqLwotCXByaXZhdGUgUXVhbGlmaWVkTmFtZSBnZXRUeXBlUXVhbGlmaWVkTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0eXBlTmFtZSwgIi4iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IHN0LmNvdW50VG9rZW5zKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciByb290ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoY291bnQrKyA8IGxlbmd0aCAtIDEpIHsKLQkJCXJvb3QuYXBwZW5kKHN0Lm5leHRUb2tlbigpKTsKLQkJCWlmIChjb3VudCA8IGxlbmd0aCAtIDEpCi0JCQkJcm9vdC5hcHBlbmQoJy4nKTsKLQkJfQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUocm9vdC50b1N0cmluZygpLCBzdC5uZXh0VG9rZW4oKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGVuY29kZWRUeXBlTmFtZSBpcyBhbiBhcnJheQotCSAqIEBwYXJhbSBlbmNvZGVkVHlwZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZW5jb2RlZFR5cGVOYW1lIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXJyYXkoU3RyaW5nIGVuY29kZWRUeXBlTmFtZSkgewotCQlpZiAoZW5jb2RlZFR5cGVOYW1lICE9IG51bGwgJiYgZW5jb2RlZFR5cGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGVuY29kZWRUeXBlTmFtZS5jaGFyQXQoMCkgPT0gJ1snKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWNvZGVkIChkaXNwbGF5YWJsZSkgbmFtZSBmbyB0aGUgdHlwZS4KLQkgKiBFaXRoZXIgYSBwcmltaXRpdmUgdHlwZSAoaW50LCBsb25nLCBmbG9hdC4uLikgT2JqZWN0IChTdHJpbmcpCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIGRlY29kZWQgbmFtZSBmb3IgdGhlIGVuY29kZWQgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVjb2RlZFR5cGVOYW1lKFN0cmluZyBlbmNvZGVkKSB7Ci0JCUhhc2hNYXAgbWFwID0gZ2V0RW5jb2RlZFR5cGVNYXAoKTsKLQotCQlTdHJpbmdCdWZmZXIgZGVjb2RlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciBCUkFDS0VUID0gJ1snOwotCQlTdHJpbmcgQlJBQ0tFVFMgPSAiW10iOyAvLyROT04tTkxTLTEkCi0JCWNoYXIgaWRlbnRpZmllciA9ICcgJzsKLQkJaW50IGxhc3QgPSAwOwotCQkvLyBjb3VudCBicmFja2V0cwotCQl3aGlsZSAoZW5jb2RlZC5pbmRleE9mKEJSQUNLRVQsIGxhc3QpICE9IC0xKSB7Ci0JCQlsYXN0Kys7Ci0JCX0KLQkJaWRlbnRpZmllciA9IGVuY29kZWQuY2hhckF0KGxhc3QpOwotCQlPYmplY3QgcHJpbWl0aXZlVHlwZSA9IG1hcC5nZXQoU3RyaW5nLnZhbHVlT2YoaWRlbnRpZmllcikpOwotCQkvLyBMID4gYmluYXJ5IHR5cGUgbmFtZSwgUSA+IHNvdXJjZSB0eXBlIG5hbWUKLQkJaWYgKGlkZW50aWZpZXIgPT0gJ0wnIHx8IGlkZW50aWZpZXIgPT0gJ1EnKSB7Ci0JCQkvLyBoYW5kbGUgb2JqZWN0Ci0JCQlTdHJpbmcgY2xhc3NuYW1lID0gZW5jb2RlZC5zdWJzdHJpbmcobGFzdCArIDEsIGVuY29kZWQubGVuZ3RoKCkgLSAxKTsKLQkJCWRlY29kZWQuYXBwZW5kKGNsYXNzbmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBoYW5kbGUgcHJpbWl0aXZlIHR5cGUgKGZyb20gSUZpZWxkLmdldFNpZ25hdHVyZSgpKQotCQkJZGVjb2RlZC5hcHBlbmQoKFN0cmluZykgcHJpbWl0aXZlVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBoYW5kbGUgcHJpbWl0aXZlIHR5cGUgKGZyb20gQ2xhc3MuZ2V0TmFtZSgpKQotCQkJZGVjb2RlZC5hcHBlbmQoZW5jb2RlZCk7Ci0JCX0KLQkJLy8gaGFuZGxlIGFycmF5cwotCQlpZiAobGFzdCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7Ci0JCQkJZGVjb2RlZC5hcHBlbmQoQlJBQ0tFVFMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWNvZGVkLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICoJZnJvbSBDbGFzcy5nZXROYW1lKCkgamF2YWRvYwotCSAqCWFsc28gc2VlIFNpZ25hdHVyZSBpbiBqZHQuY29yZSBhcGkKLQkgKjxwcmU+Ci0JICoJCQlCICAgICAgICAgICAgYnl0ZQotCSAqCQkJQyAgICAgICAgICAgIGNoYXIKLQkgKgkJCUQgICAgICAgICAgICBkb3VibGUKLQkgKgkJCUYgICAgICAgICAgICBmbG9hdAotCSAqCQkJSSAgICAgICAgICAgIGludAotCSAqCQkJSiAgICAgICAgICAgIGxvbmcKLQkgKgkJCUxjbGFzc25hbWU7ICBjbGFzcyBvciBpbnRlcmZhY2UKLQkgKgkJCVFzb3VyY2VuYW1lOyBzb3VyY2UKLQkgKgkJCVMgICAgICAgICAgICBzaG9ydAotCSAqCQkJWiAgICAgICAgICAgIGJvb2xlYW4KLQkgKgkJCVYJICAgCQkgdm9pZAotCSAqPC9wcmU+Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSAiZW5jb2RpbmcgbGV0dGVyIiB0byAidHlwZSIgbWFwLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRFbmNvZGVkVHlwZU1hcCgpIHsKLQkJaWYgKGZFbmNvZGVkVHlwZU1hcCA9PSBudWxsKSB7Ci0JCQlmRW5jb2RlZFR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiQiIsICJieXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiQyIsICJjaGFyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiRCIsICJkb3VibGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmRW5jb2RlZFR5cGVNYXAucHV0KCJGIiwgImZsb2F0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiSSIsICJpbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmRW5jb2RlZFR5cGVNYXAucHV0KCJKIiwgImxvbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmRW5jb2RlZFR5cGVNYXAucHV0KCJTIiwgInNob3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiWiIsICJib29sZWFuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiViIsICJ2b2lkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBmRW5jb2RlZFR5cGVNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTgwYmQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1ha2UgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbyBpbnRvIGNvbnRlbnQKLSAqIGZpdCBmb3IgYW4gSFRNTCB2aWV3ZXIgKGJ5IGVzY2FwaW5nIGNoYXJhY3RlcnMpCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1jbGFzcyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsIGV4dGVuZHMgVGVtcGxhdGVQcm9wb3NhbCBpbXBsZW1lbnRzIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQotCXB1YmxpYyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIEltYWdlIGltYWdlLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXN1cGVyKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGltYWdlLCByZWxldmFuY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlyZXR1cm4gU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQoYWRkaXRpb25hbEluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lCZWFuSW5mb1Byb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JQmVhbkluZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDg3ZTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lCZWFuSW5mb1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmVhbkluZm9Qcm92aWRlciB7Ci0JSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRSdW50aW1lUHJvcGVydGllcyhJUmVzb3VyY2UgYmFzZVJlc291cmNlLCBTdHJpbmcgdHlwZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lKYXZhUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDZhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yIHsKLQotCVN0cmluZyBnZXREZWNsYXJlZFR5cGUoKTsKLQotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCWJvb2xlYW4gZ2V0UmVhZGFibGUoKTsKLQotCWJvb2xlYW4gZ2V0V3JpdGVhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDFlNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciwgSVJlbGVhc2FibGUgewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpEVF9DT1JFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBpbnQgZkpzcFNvdXJjZVBvc2l0aW9uLCBmSmF2YVBvc2l0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGZWaWV3ZXIgPSBudWxsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRpb25BZGFwdGVyIGZUcmFuc2xhdGlvbkFkYXB0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBsb2NhdGlvbgotCSAqIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KLQkgKiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbXBsZXRpb25zIHNob3VsZAotCSAqICAgICAgICAgICAgYmUgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgICAgICBwcm9wb3NhbHMgYXJlIHBvc3NpYmxlCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBwb3MpIHsKLQkJaW5pdGlhbGl6ZShwb3MpOwotCi0JCUpTUFByb3Bvc2FsQ29sbGVjdG9yIGNvbGxlY3RvciA9IG51bGw7Ci0JCQotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKQotCQkJCWZWaWV3ZXIgPSAoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcjsKLQotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgPT0gbnVsbCkKLQkJCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQotCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gZlRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCWZKYXZhUG9zaXRpb24gPSB0cmFuc2xhdGlvbi5nZXRKYXZhT2Zmc2V0KGdldERvY3VtZW50UG9zaXRpb24oKSk7Ci0KLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkZWJ1Zyh0cmFuc2xhdGlvbikpOwotCi0JCQkJdHJ5IHsKLQotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQkJCQkJLy8gY2FuJ3QgZ2V0IGphdmEgcHJvcG9zYWxzIHcvb3V0IGEgY29tcGlsYXRpb24gdW5pdAotCQkJCQkvLyBvciB3aXRob3V0IGEgdmFsaWQgcG9zaXRpb24KLQkJCQkJaWYgKGN1ID09IG51bGwgfHwgLTEgPT0gZkphdmFQb3NpdGlvbikKLQkJCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQkJCi0JCQkJCWNvbGxlY3RvciA9IGdldFByb3Bvc2FsQ29sbGVjdG9yKGN1LCB0cmFuc2xhdGlvbik7Ci0JCQkJCXN5bmNocm9uaXplZCAoY3UpIHsKLQkJCQkJCWN1LmNvZGVDb21wbGV0ZShmSmF2YVBvc2l0aW9uLCBjb2xsZWN0b3IsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmVFeCkgewotCQkJCQkvLyBhIHBvc3NpYmxlIEphdmEgTW9kZWwgRXhjZXB0aW9uIGR1ZSB0byBub3QgYmVpbmcgYSBXZWIKLQkJCQkJLy8gKEphdmEpIFByb2plY3QKLQkJCQkJY29yZUV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy8gdGhyb3cgb3V0IGV4Y2VwdGlvbnMgb24gY29kZSBhc3Npc3QuCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmKGNvbGxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXN1bHRzID0gY29sbGVjdG9yLmdldEpTUENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCWlmIChyZXN1bHRzID09IG51bGwgfHwgcmVzdWx0cy5sZW5ndGggPCAxKQotCQkJCWZFcnJvck1lc3NhZ2UgPSBKU1BVSU1lc3NhZ2VzLkphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpTUFByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKElDb21waWxhdGlvblVuaXQgY3UsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSlNQUHJvcG9zYWxDb2xsZWN0b3IoY3UsIHRyYW5zbGF0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogRm9yIGRlYnVnZ2luZyB0cmFuc2xhdGlvbiBtYXBwaW5nIG9ubHkuCi0JICogCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVidWcoSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJU3RyaW5nQnVmZmVyIGRlYnVnU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlIYXNoTWFwIGpzcDJqYXZhID0gdHJhbnNsYXRpb24uZ2V0SnNwMkphdmFNYXAoKTsKLQkJU3RyaW5nIGphdmFUZXh0ID0gdHJhbnNsYXRpb24uZ2V0SmF2YVRleHQoKTsKLQkJU3RyaW5nIGpzcFRleHQgPSBmVmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCk7Ci0JCWRlYnVnU3RyaW5nLmFwcGVuZCgiW2pzcDJKYXZhTWFwIGluIEpTUENvbXBsZXRpb25Qcm9jZXNzb3JdXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWRlYnVnU3RyaW5nLmFwcGVuZCgianNwIGN1cnNvciBwb3NpdGlvbiA+PiAiICsgZlZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSXRlcmF0b3IgaXQgPSBqc3AyamF2YS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl0cnkgewotCQkJCVBvc2l0aW9uIGpzcFBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJCVBvc2l0aW9uIGphdmFQb3MgPSAoUG9zaXRpb24pIGpzcDJqYXZhLmdldChqc3BQb3MpOwotCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgianNwID4gIiArIGpzcFBvcy5vZmZzZXQgKyAiOiIgKyBqc3BQb3MubGVuZ3RoICsgIjoiICsganNwVGV4dC5zdWJzdHJpbmcoanNwUG9zLm9mZnNldCwganNwUG9zLm9mZnNldCArIGpzcFBvcy5sZW5ndGgpICsgIjpcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJqYXZhID4gIiArIGphdmFQb3Mub2Zmc2V0ICsgIjoiICsgamF2YVBvcy5sZW5ndGggKyAiOiIgKyBqYXZhVGV4dC5zdWJzdHJpbmcoamF2YVBvcy5vZmZzZXQsIGphdmFQb3Mub2Zmc2V0ICsgamF2YVBvcy5sZW5ndGgpICsgIjpcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJZGVidWdTdHJpbmcuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZWF0IGV4Y2VwdGlvbnMsIGl0J3Mgb25seSBmb3IgZGVidWcKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVidWdTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHBvc3NpYmxlIGNvbnRleHRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcG9zc2libGUKLQkgKiAgICAgICAgICAgIGNvbnRleHRzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRleHQgaW5mb3JtYXRpb24gb2JqZWN0cyBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgbm8gY29udGV4dCBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBwcmVzc2VkIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0JICogZGlzcGxheSBjb250ZW50LWFzc2lzdCBwcm9wb3NhbHMuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2YgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dG9Qcm9wb3NhbEludm9jYXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBwcmVzc2VkIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0JICogZGlzcGxheSBhIGNvbnRlbnQtYXNzaXN0IHRpcC4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0b1RpcEludm9jYXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgcHJlc2VudGluZyBjb250ZXh0Ci0JICogICAgICAgICBpbmZvcm1hdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMKLQkgKiAgICAgICAgIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbGlkYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGVuIGRpc3BsYXllZCBjb250ZXh0Ci0JICogaW5mb3JtYXRpb24gc2hvdWxkIGJlIGRpc21pc3NlZC4gTWF5IG9ubHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERvY3VtZW50UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmSnNwU291cmNlUG9zaXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCS8vIFRPRE86IGdldCBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlCi0JCS8vIGlmIChmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwgJiYKLQkJLy8gZkNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0JCS8vIHJldHVybiBmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gZkVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjb2RlIGFzc2lzdCBwcm9jZXNzb3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShpbnQgcG9zKSB7Ci0JCWluaXRpYWxpemVKYXZhUGx1Z2lucygpOwotCi0JCWZKc3BTb3VyY2VQb3NpdGlvbiA9IHBvczsKLQkJZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgSmF2YSBQbHVnaW5zIHRoYXQgdGhlIEpTUCBwcm9jZXNzb3IgcmVxdWlyZXMuCi0JICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM3NjUKLQkgKiBXZSBzaG91bGQgbm90IGNhbGwgInN0YXJ0IiwgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UgdGhhdCAKLQkgKiBzdGF0ZSB0byBiZSByZW1lbWJlcmVkLCBhbmQgcmUtc3RhcnRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyAKLQkgKiB0aGUgbmV4dCBib290IHVwIHNlcXVlbmNlLiAKLQkgKiAKLQkgKiBJU1NVRTogd2UgbWF5IGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGlzIGFsbCB0b2dldGhlciwgaW4gZnV0dXJlLCAKLQkgKiBzaW5jZSA5OSUgd2UgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHVzZWQgc29tZSBKRFQgY2xhc3MgYnkgdGhlIHRpbWUgCi0JICogd2UgbmVlZCBKRFQgdG8gYmUgYWN0aXZlIC4uLiBidXQgLi4uIHRoaXMgaXMgdGhlIHNhZmVzdCBmaXggZm9yIAotCSAqIHRoaXMgcG9pbnQgaW4gMS41IHN0cmVhbS4gTmV4dCByZWxlYXNlLCBsZXQncyBqdXN0IHJlbW92ZSB0aGlzLCAKLQkgKiByZS1kaXNjb3ZlciB3aGF0IGV2ZXIgYnVnIHRoaXMgd2FzIGZpeGluZyAoaWYgYW55KSBhbmQgaWYgdGhlcmUgaXMgCi0JICogb25lLCB0aGVuIHdlJ2xsIGVpdGhlciBwdXQgYmFjayBpbiwgYXMgaXMsIG9yIGNvbWUgdXAgd2l0aCBhIAotCSAqIG1vcmUgYXBwcm9wcmlhdGUgZml4LiAKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmF2YVBsdWdpbnMoKSB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEpEVF9DT1JFX1BMVUdJTl9JRCk7Ci0JCQlidW5kbGUubG9hZENsYXNzKCJkdW1teUNsYXNzTmFtZVRoYXRTaG91bGROZXZlckV4aXN0Iik7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LCB3ZSBqdXN0IHdhbnQgdG8gCi0JCQkvLyBudWRnZSB0aGUgYnVuZGxlIHRvIGJlIHN1cmUgaXRzIGFjdGl2YXRlZC4gCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyOWQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSAqIEltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgZm9yIHVzZSB3aXRoIEpTUFByb3Bvc2FsQ29sbGVjdG9yLgotICoKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgIHsKLQotCS8qCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCSAqIAotCSAqIFRoaXMgaXMgYSB3cmFwcGVkIHByb3Bvc2FsIHNvIHdlIGRvbid0IG5lZWQgdG8gCi0JICogbWFrZSAic2xvdyIgY2FsbHMgdG8gdGhlIGphdmEgcHJvcG9zYWwgdXAgZnJvbnQsIG9ubHkgd2hlbiBuZWVkZWQKLQkgKiBmb3IgZXhhbXBsZSwgZ2V0QWRkaXRpb25hbEluZm8oKSByZWFkcyBleHRlcm5hbCBqYXZhZG9jLCBhbmQgaXQgbWFrZXMKLQkgKiBubyBzZW5zZQotCSAqLyAKLQlJQ29tcGxldGlvblByb3Bvc2FsIGZKYXZhQ29tcGxldGlvblByb3Bvc2FsID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNQQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiwgU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIGludCByZWxldmFuY2UsIGJvb2xlYW4gdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGN1cnNvclBvc2l0aW9uLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGFwcGx5aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCX0KLQotCWZpbmFsIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsIGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoKSB7Ci0JCXJldHVybiBmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKElDb21wbGV0aW9uUHJvcG9zYWwgamF2YUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQlmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCA9IGphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJCi0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCk7Ci0JCWlmKGphdmFQcm9wb3NhbCAhPSBudWxsKQotCQkJYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQkKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1ZjUzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmNvbW1vbi5jb250ZW50YXNzaXN0LkphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Ob25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQWRkcyBwcm9wb3NhbHMgbm90IG5vcm1hbGx5IGNvdmVyZWQgYnkgdGhlIGdlbmVyaWMgYmVoYXZpb3Igd2l0aCB0aGUKLSAqIGNvbnRlbnQgbW9kZWwKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBpbnQgZGVwdGhDb3VudCA9IDA7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZWaWV3ZXIgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIHVzZUVtYmVkZGVkUmVzdWx0cyA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcm5hbEFkYXB0ZXIgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBmTmFtZVRvUHJvY2Vzc29yTWFwID0gbnVsbDsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByaXZhdGUgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIEVNUFRZX1BST1BPU0FMX1NFVCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCXByaXZhdGUgSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUZW1wbGF0ZUNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQkJaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogaW5pdCBtYXAgZm9yIGV4dHJhIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgKHVzZUJlYW4sCi0JICogZ2V0L3NldFByb3BlcnR5KS4gcG9pbnRzIFt0YWduYW1lID4gcHJvY2Vzc29yXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwUHJvcGVydHlDQVAgPSBuZXcgSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZLCBqc3BQcm9wZXJ0eUNBUCk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZLCBqc3BQcm9wZXJ0eUNBUCk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4sIG5ldyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnQgbWFwIHRoYXQgcG9pbnRzIFtwYXJ0aXRpb24gPiBwcm9jZXNzb3JdLiBUaGlzIHRha2VzIHBsYWNlIG9mCi0JICogZW1iZWRkZWQgYWRhcHRlcnMgZm9yIG5vdy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwSmF2YVByb2Nlc3NvciA9IG5ldyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIHhtbFByb2Nlc3NvciA9IG5ldyBYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCUphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGphdmFzY3JpcHRQcm9jZXNzb3IgPSBuZXcgSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIGh0bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCB4bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwgaHRtbFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQsIGpzcEphdmFQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUsIHhtbFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCwgaHRtbFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCwgamF2YXNjcmlwdFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwsIGpzcEphdmFQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIGphdmFzY3JpcHRQcm9jZXNzb3IpOyAvLyBkZWZhdWx0Ci0JCS8vIHRvCi0JCS8vIGphdmFzY3JpcHQKLQkJLy8gZm9yCi0JCS8vIGFsbAotCQkvLyBzY3JpcHQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21tZW50UHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERvY1R5cGVQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQotCQlzdXBlci5hZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCAwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQQ0RBVEFQcm9wb3NhbChTdHJpbmcgbm9kZU5hbWUsIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWE1MUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ1Byb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQVRUUklCVVRFKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgcHJvcG9zYWxzIGZvciB0YWdzIGluIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQVRUUklCVVRFX1ZBTFVFKTsKLQotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0KLQkJLy8gYWRkIEpTUCBleHRyYSBwcm9wb3NhbHMgZnJvbSBKU1BCZWFuSW5mb0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLQkJLy8gSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0KLQkJLy8gMi4xCi0JCS8vIGdldCByZXN1bHRzIGZyb20gSlNQVXNlQmVhbiBhbmQgSlNQUHJvcGVydHkgaGVyZQotCQkvLyAobG9vayB1cCBwcm9jZXNzb3IgaW4gYSBtYXAgYmFzZWQgb24gbm9kZSBuYW1lKQotCQlKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0cmFQcm9jZXNzb3IgPSAoSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBmTmFtZVRvUHJvY2Vzc29yTWFwLmdldChub2RlLmdldE5vZGVOYW1lKCkpOwotCQlpZiAoZXh0cmFQcm9jZXNzb3IgIT0gbnVsbCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdCAhPSBudWxsKSB7Ci0JCQlleHRyYVByb2Nlc3Nvci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGRvYyA9IG1xLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQkJLy8gdGhpcyBzaG91bGRuJ3QgaGF2ZSB0byBoYXZlIHRoZSBwcmVmaXggY29kZWQgaW4KLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBKU1BDTURvY3VtZW50IHx8IGRvYyBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIgfHwgbm9kZS5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoImpzcDoiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGkgPj0gMCkgewotCQkJbmFtZVJlZ2lvbiA9IG9wZW5SZWdpb25zLmdldChpLS0pOwotCQkJaWYgKG5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0JCVN0cmluZyBjdXJyZW50VmFsdWUgPSBudWxsOwotCQlpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsKQotCQkJY3VycmVudFZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCi0JCS8vIG9uIGFuIGVtcHR5IHZhbHVlLCBhZGQgYWxsIHRoZSBKU1AgYW5kIHRhZ2xpYiB0YWdzCi0JCWlmICgoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCkgPT0gMCkgfHwgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIChjdXJyZW50VmFsdWUgPT0gbnVsbCB8fCBjdXJyZW50VmFsdWUubGVuZ3RoKCkgPT0gMCkpKSB7Ci0JCQlMaXN0IHJlamVjdEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTik7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0spOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JXQVJEKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QTFVHSU4pOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTVMpOwotCi0JCQlMaXN0IGFkZGl0aW9uYWxFbGVtZW50cyA9IGdldEFkZGl0aW9uYWxDaGlsZHJlbihuZXcgQXJyYXlMaXN0KCksIG5vZGUsIC0xKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBhZGRpdGlvbmFsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRkaXRpb25hbEVsZW1lbnRzLmdldChpKTsKLQkJCQlpZiAocmVqZWN0RWxlbWVudHMuY29udGFpbnMoZWQuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFJlcXVpcmVkTmFtZShub2RlLCBlZCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhub2RlLCBlZCwgY29udGVudHMpOwotCQkJCWNvbnRlbnRzLmFwcGVuZCgnIicpOwotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoY29udGVudHMudG9TdHJpbmcoKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGNvbnRlbnRzLmxlbmd0aCgpLCBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgdGFnbmFtZSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJfQotCQl9Ci0KLQkJZWxzZSBpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gQ3JlYXRlIGEgbmV3IG1vZGVsIGZvciBDb250ZW50IEFzc2lzdCB0byBvcGVyYXRlIG9uLiBUaGlzCi0JCQkJLy8gd2lsbCBzaW11bGF0ZQotCQkJCS8vIGEgZnVsbCBEb2N1bWVudCBhbmQgdGhlbiBhZGp1c3QgdGhlIG9mZnNldCBudW1iZXJzIGluIHRoZQotCQkJCS8vIGxpc3Qgb2YgcmVzdWx0cy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBudWxsOwotCQkJCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQkJCWludGVybmFsTW9kZWwgPSBtbWFuYWdlci5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IG51bGw7Ci0JCQkJSURPTU1vZGVsIHhtbE91dGVyTW9kZWwgPSBudWxsOwotCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQl4bWxOb2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQkJCXhtbE91dGVyTW9kZWwgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJCWludGVybmFsTW9kZWwuc2V0UmVzb2x2ZXIoeG1sT3V0ZXJNb2RlbC5nZXRSZXNvbHZlcigpKTsKLQkJCQkJaW50ZXJuYWxNb2RlbC5zZXRCYXNlTG9jYXRpb24oeG1sT3V0ZXJNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJfQotCQkJCVN0cmluZyBjb250ZW50cyA9IFN0cmluZ1V0aWxzLnN0cmlwKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKSk7Ci0JCQkJaWYgKHhtbE5vZGUgIT0gbnVsbCAmJiBjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWludCBhZGRpdGlvbmFsU2hpZnRzID0gMDsKLQkJCQkJLy8gQmUgc3VyZSB0aGF0IGN1c3RvbSB0YWdzIGZyb20gdGFnbGlicyBhbHNvIHNob3cgdXAKLQkJCQkJLy8gYnkKLQkJCQkJLy8gYWRkaW5nIHRhZ2xpYiBkZWNsYXJhdGlvbnMgdG8gdGhlIGludGVybmFsIG1vZGVsLgotCQkJCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHhtbE91dGVyTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQkJCQkJCWlmICh0cmFja2VycyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpID0gMDsgaSA8IHRyYWNrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCUNNRG9jdW1lbnRUcmFja2VyIHRyYWNrZXIgPSAoQ01Eb2N1bWVudFRyYWNrZXIpIHRyYWNrZXJzLmdldChpKTsKLQkJCQkJCQkJU3RyaW5nIGRlY2xhcmF0aW9uID0gdHJhY2tlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCQkJCQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQljb250ZW50cyA9IGRlY2xhcmF0aW9uICsgY29udGVudHM7Ci0JCQkJCQkJCQlhZGRpdGlvbmFsU2hpZnRzICs9IGRlY2xhcmF0aW9uLmxlbmd0aCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIEFsc28gY29weSBhbnkganNwOnVzZUJlYW4gdGFncyBzbyB0aGF0Ci0JCQkJCS8vIGpzcDpbZ3NdZXRQcm9wZXJ0eSB3aWxsIGZ1bmN0aW9uCi0JCQkJCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlkb2MgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCQkJCWVsc2UKLQkJCQkJCWRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCQlOb2RlTGlzdCB1c2VCZWFucyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB1c2VCZWFucy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJCQlJRE9NTm9kZSB1c2VCZWFuID0gKElET01Ob2RlKSB1c2VCZWFucy5pdGVtKGspOwotCQkJCQkJaWYgKHVzZUJlYW4uZ2V0U3RhcnRPZmZzZXQoKSA8IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSB7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIHVzZUJlYW5UZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigiPGpzcDp1c2VCZWFuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVzZUJlYW4uZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQkJQXR0ciBhdHRyID0gKEF0dHIpIHVzZUJlYW4uZ2V0QXR0cmlidXRlcygpLml0ZW0oaik7Ci0JCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZCgnICcpOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoYXR0ci5nZXROYW1lKCkpOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoIj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoJyInKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYWRkaXRpb25hbFNoaWZ0cyArPSB1c2VCZWFuVGV4dC5sZW5ndGgoKTsKLQkJCQkJCQljb250ZW50cyA9IHVzZUJlYW5UZXh0LnRvU3RyaW5nKCkgKyBjb250ZW50czsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbnRlcm5hbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldChjb250ZW50cyk7Ci0JCQkJCWludCBpbnRlcm5hbE9mZnNldCA9IDA7Ci0JCQkJCWJvb2xlYW4gcXVvdGVkID0gZmFsc2U7Ci0JCQkJCS8vIGlmIHF1b3RlZCwgdXNlIHBvc2l0aW9uIGluc2lkZSBhbmQgc2hpZnQgYnkgb25lCi0JCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCAmJiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5jaGFyQXQoMCkgPT0gJ1wnJyB8fCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmNoYXJBdCgwKSA9PSAnIicpKSB7Ci0JCQkJCQlpbnRlcm5hbE9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgLSAxICsgYWRkaXRpb25hbFNoaWZ0czsKLQkJCQkJCXF1b3RlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gaWYgdW5xdW90ZWQsIHVzZSBwb3NpdGlvbiBpbnNpZGUKLQkJCQkJZWxzZSBpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDAgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5jaGFyQXQoMCkgPT0gJzwnKQotCQkJCQkJaW50ZXJuYWxPZmZzZXQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpICsgYWRkaXRpb25hbFNoaWZ0czsKLQkJCQkJZWxzZQotCQkJCQkJaW50ZXJuYWxPZmZzZXQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSAtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCkgKyBhZGRpdGlvbmFsU2hpZnRzOwotCQkJCQlkZXB0aENvdW50Kys7Ci0JCQkJCUluZGV4ZWRSZWdpb24gaW50ZXJuYWxOb2RlID0gbnVsbDsKLQkJCQkJaW50IHRtcE9mZnNldCA9IGludGVybmFsT2Zmc2V0OwotCQkJCQl3aGlsZSAoaW50ZXJuYWxOb2RlID09IG51bGwgJiYgdG1wT2Zmc2V0ID49IDApCi0JCQkJCQlpbnRlcm5hbE5vZGUgPSBpbnRlcm5hbE1vZGVsLmdldEluZGV4ZWRSZWdpb24odG1wT2Zmc2V0LS0pOwotCi0JCQkJCWlmIChpbnRlcm5hbE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIHNldCB1cCB0aGUgaW50ZXJuYWwgbW9kZWwKLQkJCQkJCWlmIChpbnRlcm5hbE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCQkJCQlpbnRlcm5hbE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCX0KLQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIG91dGVyRW1iZWRkZWRUeXBlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgeG1sT3V0ZXJNb2RlbC5nZXREb2N1bWVudCgpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgaW50ZXJuYWxFbWJlZGRlZFR5cGVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpICgoTm9kZSkgaW50ZXJuYWxOb2RlKS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaW50ZXJuYWxFbWJlZGRlZFR5cGVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShvdXRlckVtYmVkZGVkVHlwZUFkYXB0ZXIuZ2V0RW1iZWRkZWRUeXBlKCkpOwotCQkJCQl9Ci0KLQkJCQkJQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBhZGFwdGVyUmVnaXN0cnkgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpOwotCQkJCQlJdGVyYXRvciBhZGFwdGVyTGlzdCA9IGFkYXB0ZXJSZWdpc3RyeS5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCQkJCS8vIEFuZCBhbGwgdGhvc2UgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciB0eXBlCi0JCQkJCS8vIG9mIGNvbnRlbnQKLQkJCQkJd2hpbGUgKGFkYXB0ZXJMaXN0Lmhhc05leHQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHByb3ZpZGVyID0gKEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpIGFkYXB0ZXJMaXN0Lm5leHQoKTsKLQkJCQkJCQlpZiAocHJvdmlkZXIuaXNGb3IoaW50ZXJuYWxNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKSkpIHsKLQkJCQkJCQkJcHJvdmlkZXIuYWRkQWRhcHRlckZhY3RvcmllcyhpbnRlcm5hbE1vZGVsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIHRoZSBpbnRlcm5hbCBhZGFwdGVyIGRvZXMgYWxsIHRoZSByZWFsIHdvcmsgb2YgdXNpbmcKLQkJCQkJICogdGhlIEpTUCBjb250ZW50IG1vZGVsIHRvIGZvcm0gcHJvcG9zYWxzCi0JCQkJCSAqLwotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0cyA9IG51bGw7Ci0JCQkJCWRlcHRoQ291bnQtLTsKLQkJCQkJaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRSZXBsYWNlbWVudFN0cmluZygpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSAtIGFkZGl0aW9uYWxTaGlmdHMgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRTdGFydE9mZnNldCgpICsgKHF1b3RlZCA/IDEgOiAwKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldFJlcGxhY2VtZW50TGVuZ3RoKCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRDdXJzb3JQb3NpdGlvbigpLCByZXN1bHRzW2ldLmdldEltYWdlKCksIHJlc3VsdHNbaV0uZ2V0RGlzcGxheVN0cmluZygpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCksIChyZXN1bHRzW2ldIGluc3RhbmNlb2YgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgPyAoKElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldFJlbGV2YW5jZSgpIDogSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGluIGVtYmVkZGVkIEpTUCBDb250ZW50IEFzc2lzdCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEFkZGl0aW9uYWxDaGlsZHJlbihMaXN0IGVsZW1lbnREZWNscywgTm9kZSBub2RlLCBpbnQgY2hpbGRJbmRleCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkvKgotCQkJICogZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIGludGVuZGVkIGluc2VydGlvbiBhcyBpdCB3aWxsIGdpdmUgdXMKLQkJCSAqIHRoZSBjb3JyZWN0IG9mZnNldCBmb3IgY2hlY2tpbmcgcG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnRzCi0JCQkgKi8KLQkJCWludCB0ZXh0SW5zZXJ0aW9uT2Zmc2V0ID0gMDsKLQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpZiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgPj0gY2hpbGRJbmRleCAmJiBjaGlsZEluZGV4ID49IDApIHsKLQkJCQlOb2RlIG5vZGVBbHJlYWR5QXRJbmRleCA9IGNoaWxkcmVuLml0ZW0oY2hpbGRJbmRleCk7Ci0JCQkJaWYgKG5vZGVBbHJlYWR5QXRJbmRleCBpbnN0YW5jZW9mIElET01Ob2RlKQotCQkJCQl0ZXh0SW5zZXJ0aW9uT2Zmc2V0ID0gKChJRE9NTm9kZSkgbm9kZUFscmVhZHlBdEluZGV4KS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRleHRJbnNlcnRpb25PZmZzZXQgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcigoKElET01Ob2RlKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQlMaXN0IG1vcmVDTURvY3VtZW50cyA9IG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnModGV4dEluc2VydGlvbk9mZnNldCk7Ci0JCQkJaWYgKG1vcmVDTURvY3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9yZUNNRG9jdW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlDTURvY3VtZW50IGRvYyA9IChDTURvY3VtZW50KSBtb3JlQ01Eb2N1bWVudHMuZ2V0KGkpOwotCQkJCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBkb2MuZ2V0RWxlbWVudHMoKTsKLQkJCQkJCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5pdGVtKGopOwotCQkJCQkJCQllbGVtZW50RGVjbHMuYWRkKGVkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBwb3NpdGlvbiBkZXBlbmRlbnQgQ01Eb2N1bWVudHMgYW5kIGluc2VydCB0aGVpciB0YWdzIGFzCi0JCQkvLyBwcm9wb3NhbHMKLQotCQkJTW9kZWxRdWVyeUFkYXB0ZXIgbXFBZGFwdGVyID0gbnVsbDsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCW1xQWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJRE9NTm9kZSkgbm9kZSkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCQllbHNlCi0JCQkJbXFBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Ob2RlKSBub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0KLQkJCWlmIChtcUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCUNNRG9jdW1lbnQgZG9jID0gbXFBZGFwdGVyLmdldE1vZGVsUXVlcnkoKS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLQkJCQlpZiAoZG9jICE9IG51bGwpIHsKLQotCQkJCQlDTURvY3VtZW50IEpDTURvYyA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5KU1AxMV9ET0NfVFlQRSk7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGpzcGVsZW1lbnRzID0gSkNNRG9jLmdldEVsZW1lbnRzKCk7Ci0KLQkJCQkJaWYgKGpzcGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCUxpc3QgcmVqZWN0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQkJCS8vIGRldGVybWluZSBpZiB0aGUgZG9jdW1lbnQgaXMgaW4gWE1MIGZvcm0KLQkJCQkJCURvY3VtZW50IGRvbURvYyA9IG51bGw7Ci0JCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCQlkb21Eb2MgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZG9tRG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJCQkKLQkJCQkJCS8vIFNob3cgWE1MIHRhZyBmb3JtcyBvZiBKU1AgbWFya2VycyBpZiBqc3A6cm9vdCBpcwotCQkJCQkJLy8gdGhlIGRvY3VtZW50IGVsZW1lbnQgT1IgaXQncyBIVE1MIGJ1dAotCQkJCQkJLy8gaXNuJ3QgcmVhbGx5IGluIHRoZSB0ZXh0LgotCQkJCQkJLy8gSWYgdGhlIGRvY3VtZW50IGlzbid0IHN0cmljdGx5IFhNTCwgcHVsbCBvdXQgdGhlCi0JCQkJCQkvLyBYTUwgdGFnIGZvcm1zIGl0IGlzIHhtbCBmb3JtYXQKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFQpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQkJCQotCQkJCQkJaWYgKGlzWE1MRm9ybWF0KGRvbURvYykpIHsKLQotCQkJCQkJCS8vIGpzcCBhY3Rpb25zCi0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFkpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTkNMVURFKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRCk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTik7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU0pOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTVMpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkKLQkJCQkJCS8vIGRvbid0IHNob3cganNwOnJvb3QgaWYgYSBkb2N1bWVudCBlbGVtZW50IGFscmVhZHkKLQkJCQkJCS8vIGV4aXN0cwotCQkJCQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZG9tRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaWYgKGRvY0VsZW1lbnQgIT0gbnVsbCAmJiAoKGRvY0VsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpyb290IikpIHx8ICgoKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsIHx8ICgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCk7Ci0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwganNwZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBqc3BlbGVtZW50cy5pdGVtKGopOwotCQkJCQkJCWlmIChyZWplY3RFbGVtZW50cy5jb250YWlucyhlZC5nZXROb2RlTmFtZSgpKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJZWxlbWVudERlY2xzLmFkZChlZCk7Ci0JCQkJCQl9Ci0JCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50RGVjbHM7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KEVsZW1lbnQgcGFyZW50LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhZGRpdGlvbmFsRWxlbWVudHMgPSBnZXRBZGRpdGlvbmFsQ2hpbGRyZW4obmV3IEFycmF5TGlzdCgpLCBwYXJlbnQsIGluZGV4KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gaW5zZXJ0QWN0aW9uID0gbmV3IE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRkaXRpb25hbEVsZW1lbnRzLmdldChpKSwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIDAsIHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCksIG51bGwpOwotCQkJbGlzdC5hZGQoaW5zZXJ0QWN0aW9uKTsKLQkJfQotCi0JCS8vIGFkZCBhbGxvd2VkIGNoaWxkcmVuIG9mIGltcGxpY2l0IHRhZ3MgdGhhdCBkb24ndCBhbHJlYWR5IGV4aXN0Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJTGlzdCBjaGlsZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNoaWxkTmFtZXMuYWRkKGNoaWxkLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBhbGxBY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJYWxsQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJCWlmIChhY3Rpb24uZ2V0Q01Ob2RlKCkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBhY3Rpb24uZ2V0Q01Ob2RlKCk7Ci0JCQkJU3RyaW5nIG9tbWlzc2lvbiA9IChTdHJpbmcpIGVkLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJCQlpZiAoIWNoaWxkTmFtZXMuY29udGFpbnMoZWQuZ2V0Tm9kZU5hbWUoKS50b0xvd2VyQ2FzZSgpKSAmJiAoKG9tbWlzc2lvbiAhPSBudWxsKSAmJiAob21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0JPVEgpKSkpIHsKLQkJCQkJTGlzdCBpbXBsaWNpdFZhbGlkQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgZWQsIDAsIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUywgTW9kZWxRdWVyeS5WQUxJRElUWV9OT05FLCBpbXBsaWNpdFZhbGlkQWN0aW9ucyk7Ci0JCQkJCWlmIChpbXBsaWNpdFZhbGlkQWN0aW9ucyAhPSBudWxsKSB7Ci0JCQkJCQlJdGVyYXRvciBpbXBsaWNpdFZhbGlkQWN0aW9uc0l0ZXJhdG9yID0gaW1wbGljaXRWYWxpZEFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlIChpbXBsaWNpdFZhbGlkQWN0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCU1vZGVsUXVlcnlBY3Rpb24gaW5zZXJ0QWN0aW9uID0gbmV3IE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uKCgoTW9kZWxRdWVyeUFjdGlvbikgaW1wbGljaXRWYWxpZEFjdGlvbnNJdGVyYXRvci5uZXh0KCkpLmdldENNTm9kZSgpLCBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgMCwgcGFyZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSwgbnVsbCk7Ci0JCQkJCQkJYWxsQWN0aW9ucy5hZGQoaW5zZXJ0QWN0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWxsQWN0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjaGlsZEluZGV4KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpc1hNTEZvcm1hdChkb2N1bWVudCkpCi0JCQlnZXRBZGRpdGlvbmFsQ2hpbGRyZW4obGlzdCwgZG9jdW1lbnQsIGNoaWxkSW5kZXgpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJaWYgKGRlcHRoQ291bnQgPT0gMCkKLQkJCWZFcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgYWN0aW5nIGFzIGEgImNhdGNoIGFsbCIgZm9yIHB1bGxpbmcgdG9nZXRoZXIgY29udGVudAotCSAqIGFzc2lzdCBwcm9wb3NhbHMgZnJvbSBkaWZmZXJlbnQgUHJvY2Vzc29ycyB3aGVuIGRvY3VtZW50IHBhcnRpdGlvbmluZwotCSAqIGFsb25lIGNvdWxkbid0IGRldGVybWluZSBkZWZpbml0aXZlbHkgd2hhdCBjb250ZW50IGFzc2lzdCBzaG91bGQgc2hvdwotCSAqIHVwIGF0IHRoYXQgcGFydGljdWxhciBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZlRlbXBsYXRlQ29udGV4dHMuY2xlYXIoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlmVmlld2VyID0gdmlld2VyOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10ganNwUmVzdWx0cyA9IEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGVtYmVkZGVkUmVzdWx0cyA9IEVNUFRZX1BST1BPU0FMX1NFVDsKLQotCQkvLyBjaGVjayB0aGUgYWN0dWFsIHBhcnRpdGlvbiB0eXBlCi0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBBTk9USEVSIFdPUktBUk9VTkQgVU5USUwgUEFSVElUSU9OSU5HIFRBS0VTIENBUkUgT0YgVEhJUwotCQkvLyBjaGVjayBmb3IgeG1sLWpzcCB0YWdzLi4uCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUgJiYgZm4gIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwb3NzaWJsZVhNTEpTUCA9ICgoZm4uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpICYmIGZuLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgPyBmbi5nZXRQcmV2aW91cygpIDogZm47Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHBvc3NpYmxlWE1MSlNQLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQkvLyBjaGVjayBib3VuZHMgY2FzZXMKLQkJCQlJVGV4dFJlZ2lvbiB4bWxPcGVuT3JDbG9zZSA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJCWlmICh4bWxPcGVuT3JDbG9zZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgZG9jdW1lbnRQb3NpdGlvbiA9PSBwb3NzaWJsZVhNTEpTUC5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCS8vIGRvIHJlZ3VsYXIganNwIGNvbnRlbnQgYXNzaXN0Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHhtbE9wZW5PckNsb3NlLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gJiYgZG9jdW1lbnRQb3NpdGlvbiA+IHBvc3NpYmxlWE1MSlNQLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJLy8gZG8gcmVndWxhciBqc3AgY29udGVudCBhc3Npc3QKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHBvc3NpYmxlIHhtbC1qc3AKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCQlTdHJpbmcgbmFtZSA9IHBvc3NpYmxlWE1MSlNQLmdldFRleHQobmFtZVJlZ2lvbik7Ci0JCQkJCWlmIChuYW1lLmVxdWFscygianNwOnNjcmlwdGxldCIpIHx8IG5hbWUuZXF1YWxzKCJqc3A6ZXhwcmVzc2lvbiIpIHx8IG5hbWUuZXF1YWxzKCJqc3A6ZGVjbGFyYXRpb24iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vICoqIFRISVMgSVMgQSBURU1QIEZJWCBVTlRJTCBQQVJUSVRJT05JTkcgVEFLRVMgQ0FSRSBPRiBUSElTLi4uCi0JCS8vIGNoZWNrIGZvciBYTUwtSlNQIGluIGEgPHNjcmlwdD4gcmVnaW9uCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQkvLyBmbiBzaG91bGQgYmUgYmxvY2sgdGV4dAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkZWNvZGVkU0RSZWdpb24gPSBkZWNvZGVTY3JpcHRCbG9jayhmbi5nZXRGdWxsVGV4dCgpKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZGVjb2RlZCA+ICIgKwotCQkJLy8gYmxvY2tPZlRleHQuc3Vic3RyaW5nKGRlY29kZWRTRFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLAotCQkJLy8gZGVjb2RlZFNEUmVnaW9uLmdldEVuZE9mZnNldCgpKSk7Ci0JCQlpZiAoZGVjb2RlZFNEUmVnaW9uICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkciA9IGRlY29kZWRTRFJlZ2lvbjsKLQkJCQl3aGlsZSAoc2RyICE9IG51bGwpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZHIgIiArIHNkci5nZXRUeXBlKCkpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNkciA+ICIgKwotCQkJCQkvLyBibG9ja09mVGV4dC5zdWJzdHJpbmcoc2RyLmdldFN0YXJ0T2Zmc2V0KCksCi0JCQkJCS8vIHNkci5nZXRFbmRPZmZzZXQoKSkpOwotCQkJCQlpZiAoc2RyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPD0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPCBmbi5nZXRTdGFydE9mZnNldCgpICsgc2RyLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQkJcmV0dXJuIEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSAmJiBzZHIuZ2V0TmV4dCgpICE9IG51bGwgJiYgc2RyLmdldE5leHQoKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQkJCQkvLyB0aGUgZW5kIG9mIGFuIG9wZW4gdGFnIDxzY3JpcHQ+Ci0JCQkJCQkJLy8gPGpzcDpzY3JpcHRsZXQ+fCBibGFoIDwvanNwOnNjcmlwdGxldD4KLQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIHNkci5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgc2RyLmdldFByZXZpb3VzKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2RyID0gc2RyLmdldE5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBjaGVjayBzcGVjaWFsIEpTUCBkZWxpbWl0ZXIgY2FzZXMKLQkJaWYgKGZuICE9IG51bGwgJiYgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm5EZWxpbSA9IGZuOwotCi0JCQkvLyBpZiBpdCdzIGEgbmVzdGVkIEpTUCByZWdpb24sIG5lZWQgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGNoZWNrIHdhcyB0aGVyZS4uLgotCQkJLy8gaWYgKGZuRGVsaW0uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJSXRlcmF0b3IgYmxvY2tSZWdpb25zID0gZm5EZWxpbS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJSVRleHRSZWdpb25Db250YWluZXIgdHJjOwotCQkJd2hpbGUgKGJsb2NrUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0ZW1wID0gKElUZXh0UmVnaW9uKSBibG9ja1JlZ2lvbnMubmV4dCgpOwotCQkJCS8vIHdlIGhpdCBhIG5lc3RlZAotCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJdHJjID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0ZW1wOwotCQkJCQkvLyBpdCdzIGluIHRoaXMgcmVnaW9uCi0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHRyYy5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPCB0cmMuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCUl0ZXJhdG9yIG5lc3RlZEpTUFJlZ2lvbnMgPSB0cmMuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAobmVzdGVkSlNQUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCQl0ZW1wID0gKElUZXh0UmVnaW9uKSBuZXN0ZWRKU1BSZWdpb25zLm5leHQoKTsKLQkJCQkJCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUE9wZW5EZWxpbWl0ZXIodGVtcC5nZXRUeXBlKCkpICYmIGRvY3VtZW50UG9zaXRpb24gPT0gdHJjLmdldFN0YXJ0T2Zmc2V0KHRlbXApKSB7Ci0JCQkJCQkJCS8vIEhUTUwgY29udGVudCBhc3Npc3QKLQkJCQkJCQkJLy8gd2UgYWN0dWFsbHkgd2FudCBjb250ZW50IGFzc2lzdCBmb3IgdGhlCi0JCQkJCQkJCS8vIHByZXZpb3VzIHR5cGUgb2YgcmVnaW9uLAotCQkJCQkJCQkvLyB3ZWxsIGdldCB0aG9zZSBwcm9wb3NhbHMgZnJvbSB0aGUgZW1iZWRkZWQKLQkJCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IDApIHsKLQkJCQkJCQkJCXBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQQ2xvc2VEZWxpbWl0ZXIodGVtcC5nZXRUeXBlKCkpICYmIGRvY3VtZW50UG9zaXRpb24gPT0gdHJjLmdldFN0YXJ0T2Zmc2V0KHRlbXApKSB7Ci0JCQkJCQkJCS8vIEpTUCBjb250ZW50IGFzc2lzdAotCQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gfQotCQkJfQotCi0JCQkvLyB0YWtlIGNhcmUgb2YgWE1MLUpTUCBkZWxpbXRlciBjYXNlcwotCQkJaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNYTUxKU1BEZWxpbWl0ZXIoZm5EZWxpbSkpIHsKLQkJCQkvLyBzaW5jZSBpdCdzIGEgZGVsaW1pdGVyLCB3ZSBrbm93IGl0J3MgYSBJVGV4dFJlZ2lvbkNvbnRhaW5lcgotCQkJCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gZm5EZWxpbS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQkJCWlmIChmbkRlbGltLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbiAmJiAoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSkgewotCQkJCQkvLyB8PGpzcDpzY3JpcHRsZXQ+IDwvanNwOnNjcmlwdGxldD4KLQkJCQkJLy8gKHBhKSBjb21tZW50ZWQgb3V0IHNvIHRoYXQgd2UgZ2V0IHJlZ3VsYXIgYmVoYXZpb3IgSlNQCi0JCQkJCS8vIG1hY3JvcyBldGMuLi4KLQkJCQkJLy8gcmV0dXJuIGdldEhUTUxDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwKLQkJCQkJLy8gZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZuRGVsaW0uZ2V0U3RhcnRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uICYmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkgewotCQkJCQkvLyA8anNwOnNjcmlwdGxldD4gfDwvanNwOnNjcmlwdGxldD4KLQkJCQkJLy8gY2hlY2sgcHJldmlvdXMgcGFydGl0aW9uIHR5cGUgdG8gc2VlIGlmIGl0J3MgSkFWQVNDUklQVAotCQkJCQkvLyBpZiBpdCBpcywgd2UncmUganVzdCBnb25uYSBsZXQgdGhlIGVtYmVkZGVkIEpBVkFTQ1JJUFQKLQkJCQkJLy8gYWRhcHRlciBnZXQgdGhlIHByb3Bvc2FscwotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IDApIHsKLQkJCQkJCVN0cmluZyBjaGVja1R5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQlpZiAoY2hlY2tUeXBlICE9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQpIHsgLy8gdGhpcwotCQkJCQkJCS8vIGNoZWNrCi0JCQkJCQkJLy8gaXMKLQkJCQkJCQkvLyBmYWlsaW5nCi0JCQkJCQkJLy8gZm9yCi0JCQkJCQkJLy8gWE1MLUpTUAotCQkJCQkJCS8vIChyZWdpb24KLQkJCQkJCQkvLyBpcwotCQkJCQkJCS8vIG5vdAotCQkJCQkJCS8vIGphdmFzY3JpcHQuLi4pCi0JCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCQlwYXJ0aXRpb25UeXBlID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiBkb2N1bWVudFBvc2l0aW9uID49IGZuRGVsaW0uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJLy8gYW55dGhpbmcgZWxzZSBpbmJldHdlZW4KLQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUERlbGltaXRlcihmbkRlbGltKSkgewotCQkJCS8vIHRoZSBkZWxpbWl0ZXIgPCUsIDwlPSwgPCUhLCAuLi4KLQkJCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUENsb3NlRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuRGVsaW0uZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJLy8gY2hlY2sgcHJldmlvdXMgcGFydGl0aW9uIHR5cGUgdG8gc2VlIGlmIGl0J3MKLQkJCQkJCS8vIEpBVkFTQ1JJUFQKLQkJCQkJCS8vIGlmIGl0IGlzLCB3ZSdyZSBqdXN0IGdvbm5hIGxldCB0aGUgZW1iZWRkZWQKLQkJCQkJCS8vIEpBVkFTQ1JJUFQgYWRhcHRlciBnZXQgdGhlIHByb3Bvc2FscwotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQkJU3RyaW5nIGNoZWNrVHlwZSA9IGdldFBhcnRpdGlvblR5cGUoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQkJCQlpZiAoY2hlY2tUeXBlICE9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQpIHsKLQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJCXBhcnRpdGlvblR5cGUgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BPcGVuRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJCS8vIGlmIGl0J3MgdGhlIGZpcnN0IHBvc2l0aW9uIG9mIG9wZW4gZGVsaW1pdGVyCi0JCQkJCS8vIHVzZSBlbWJlZGRlZCBIVE1MIHJlc3VsdHMKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQllbWJlZGRlZFJlc3VsdHMgPSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJLy8gaXQncyBhdCB0aGUgRU9GIDwlfAotCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgSlNQIHJlZ2lvbiBpbnNpZGUgb2YgQ0RBVEEgdy8gbm8gcmVnaW9uCi0JCS8vIDwhW0NEQVRBWyA8JXwlPiBdXT4KLQkJLy8gb3IgYSBjb21tZW50IHJlZ2lvbgotCQkvLyA8IS0tIDwlIHwlPiAtLT4KLQkJaWYgKGZuICE9IG51bGwgJiYgKGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpKSB7Ci0JCQlpZiAoZm4gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCU9iamVjdFtdIGNkYXRhUmVnaW9ucyA9IGZuLmdldFJlZ2lvbnMoKS50b0FycmF5KCk7Ci0JCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb24ganNwUmVnaW9uID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNkYXRhUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlyID0gKElUZXh0UmVnaW9uKSBjZGF0YVJlZ2lvbnNbaV07Ci0JCQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCS8vIENEQVRBIGVtYmVkZGVkIGNvbnRhaW5lciwgb3IgY29tbWVudCBjb250YWluZXIKLQkJCQkJCU9iamVjdFtdIGpzcFJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByKS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBqc3BSZWdpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJanNwUmVnaW9uID0gKElUZXh0UmVnaW9uKSBqc3BSZWdpb25zW2pdOwotCQkJCQkJCWlmIChqc3BSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJCQkJCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoanNwUmVnaW9uKSA9PSBkb2N1bWVudFBvc2l0aW9uKQotCQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBpdCdzIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgaWYgc28sIGRvbid0IGFkZCBDREFUQQotCQkvLyBwcm9wb3NhbAotCQlJVGV4dFJlZ2lvbiBhdHRyQ29udGFpbmVyID0gKGZuICE9IG51bGwpID8gZm4uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikgOiBudWxsOwotCQlpZiAoYXR0ckNvbnRhaW5lciAhPSBudWxsICYmIGF0dHJDb250YWluZXIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJaWYgKGF0dHJDb250YWluZXIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkvLyB0ZXN0IGxvY2F0aW9uIG9mIHRoZSBjdXJzb3IKLQkJCQkvLyByZXR1cm4gbnVsbCBpZiBpdCdzIGluIHRoZSBtaWRkbGUgb2YgYW4gb3Blbi9jbG9zZQotCQkJCS8vIGRlbGltZXRlcgotCQkJCUl0ZXJhdG9yIGF0dHJSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgYXR0ckNvbnRhaW5lcikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJSVRleHRSZWdpb24gdGVzdFJlZ2lvbiA9IG51bGw7Ci0JCQkJd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQl0ZXN0UmVnaW9uID0gKElUZXh0UmVnaW9uKSBhdHRyUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCS8vIG5lZWQgdG8gY2hlY2sgZm9yIG90aGVyIHZhbGlkIGF0dHJpYnV0ZSByZWdpb25zCi0JCQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQT3BlbkRlbGltaXRlcih0ZXN0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWlmICghKCgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldEVuZE9mZnNldCh0ZXN0UmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BDbG9zZURlbGltaXRlcih0ZXN0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWlmICghKCgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldFN0YXJ0T2Zmc2V0KHRlc3RSZWdpb24pID49IGRvY3VtZW50UG9zaXRpb24pKQotCQkJCQkJCXJldHVybiBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gVE9ETzogaGFuZGxlIG5vbi1KYXZhIGNvZGUgc3VjaCBhcyBuZXN0ZWQgdGFncwotCQkJCWlmICh0ZXN0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpKQotCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJfQotCQl9Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChwYXJ0aXRpb25UeXBlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJZW1iZWRkZWRSZXN1bHRzID0gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJLy8gZ2V0IGJlYW4gbWV0aG9kcywgb2JqZWN0cywgYW5kIGNvbnN0YW50cyBpZiB0aGVyZSBhcmUgYW55Li4uCi0JCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBiZWFuUmVzdWx0cyA9IGdldEpTUEphdmFCZWFuUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGJlYW5SZXN1bHRzICE9IG51bGwgJiYgYmVhblJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYWRkZWQgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtiZWFuUmVzdWx0cy5sZW5ndGggKyBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShiZWFuUmVzdWx0cywgMCwgYWRkZWQsIDAsIGJlYW5SZXN1bHRzLmxlbmd0aCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZW1iZWRkZWRSZXN1bHRzLCAwLCBhZGRlZCwgYmVhblJlc3VsdHMubGVuZ3RoLCBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoKTsKLQkJCQkJZW1iZWRkZWRSZXN1bHRzID0gYWRkZWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdGhlIHBhcnRpdGlvbiB0eXBlIGlzIHByb2JhYmx5IG5vdCBtYXBwZWQKLQkJfQotCi0JCS8vIGZpeCBmb3I6Ci0JCS8vIEhUTUwgY29udGVudCBhc3Npc3QgZ2l2ZSBKU1AgdGFncyBpbiBiZXR3ZWVuIGVtcHR5IHNjcmlwdCB0YWdzCi0JCWlmICghKHAgaW5zdGFuY2VvZiBKYXZhU2NyaXB0Q29udGVudEFzc2lzdFByb2Nlc3NvciB8fCBwIGluc3RhbmNlb2YgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcikpIHsKLQkJCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0JCQlqc3BSZXN1bHRzID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJfQotCQlpZiAodXNlRW1iZWRkZWRSZXN1bHRzKSB7Ci0JCQlpZiAoZW1iZWRkZWRSZXN1bHRzICE9IG51bGwgJiYgZW1iZWRkZWRSZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoOyBpKyspCi0JCQkJCXJlc3VsdHMuYWRkKGVtYmVkZGVkUmVzdWx0c1tpXSk7Ci0JCQkJaWYgKGpzcFJlc3VsdHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpzcFJlc3VsdHMubGVuZ3RoOyBpKyspCi0JCQkJCQlyZXN1bHRzLmFkZChqc3BSZXN1bHRzW2ldKTsKLQkJCQl9Ci0JCQkJanNwUmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMuc2l6ZSgpXTsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLnNpemUoKTsgaSsrKQotCQkJCQlqc3BSZXN1bHRzW2ldID0gKElDb21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHMuZ2V0KGkpOwotCi0JCQl9Ci0JCX0KLQkJaWYgKGpzcFJlc3VsdHMgPT0gbnVsbCkKLQkJCWpzcFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCXNldEVycm9yTWVzc2FnZShqc3BSZXN1bHRzLmxlbmd0aCA9PSAwID8gVU5LTk9XTl9DT05URVhUIDogbnVsbCk7Ci0KLQkJLy8gZml4IGZvcjoKLQkJLy8gY2hlY2sgZm9yIHw8JS0tIC0tJT4gZmlyc3QgcG9zaXRpb24gb2YganNwIGNvbW1lbnQKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQpIHsKLQkJCWlmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gaHRtbFJlc3VsdHMgPSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWpzcFJlc3VsdHMgPSBtZXJnZShqc3BSZXN1bHRzLCBodG1sUmVzdWx0cyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY2NTYKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgewotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGltcG9ydFByb3Bvc2FscyA9IGdldEltcG9ydFByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKGltcG9ydFByb3Bvc2Fscy5sZW5ndGggPiAwKQotCQkJCWpzcFJlc3VsdHMgPSBtZXJnZShqc3BSZXN1bHRzLCBpbXBvcnRQcm9wb3NhbHMpOwotCQl9Ci0JCXJldHVybiBqc3BSZXN1bHRzOwotCX0KLQotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEltcG9ydFByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUxpc3QgaW1wb3J0UHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwcm9wb3NhbHNbaV0gaW5zdGFuY2VvZiBKU1BDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgaW1wb3J0UHJvcG9zYWwgPSBhZGp1c3RJbXBvcnRQcm9wb3NhbCgoSlNQQ29tcGxldGlvblByb3Bvc2FsKSBwcm9wb3NhbHNbaV0pOwotCQkJCWltcG9ydFByb3Bvc2Fscy5hZGQoaW1wb3J0UHJvcG9zYWwpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBpbXBvcnRQcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtpbXBvcnRQcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWwgYWRqdXN0SW1wb3J0UHJvcG9zYWwoSlNQQ29tcGxldGlvblByb3Bvc2FsIGltcG9ydFByb3Bvc2FsKSB7Ci0KLQkJLy8ganVzdCBuZWVkIHRvIHJlbW92ZSB0aGUgIjsiCi0JCS8vIGFuZCBhZGp1c3Qgb2Zmc2V0cyBmb3IgdGhlIGNoYW5nZQotCQlTdHJpbmcgbmV3UmVwbGFjZSA9IGltcG9ydFByb3Bvc2FsLmdldFJlcGxhY2VtZW50U3RyaW5nKCkucmVwbGFjZUFsbCgiOyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VtZW50U3RyaW5nKG5ld1JlcGxhY2UpOwotCi0JCVN0cmluZyBuZXdEaXNwbGF5ID0gaW1wb3J0UHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpLnJlcGxhY2VBbGwoIjsiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbXBvcnRQcm9wb3NhbC5zZXREaXNwbGF5U3RyaW5nKG5ld0Rpc3BsYXkpOwotCi0JCWludCBuZXdSZXBsYWNlbWVudExlbmd0aCA9IGltcG9ydFByb3Bvc2FsLmdldFJlcGxhY2VtZW50TGVuZ3RoKCkgLSAxOwotCQlpbXBvcnRQcm9wb3NhbC5zZXRSZXBsYWNlbWVudExlbmd0aChuZXdSZXBsYWNlbWVudExlbmd0aCk7Ci0KLQkJaW50IG5ld0N1cnNvclBvc2l0aW9uID0gaW1wb3J0UHJvcG9zYWwuZ2V0Q3Vyc29yUG9zaXRpb24oKSAtIDE7Ci0JCWltcG9ydFByb3Bvc2FsLnNldEN1cnNvclBvc2l0aW9uKG5ld0N1cnNvclBvc2l0aW9uKTsKLQotCQlyZXR1cm4gaW1wb3J0UHJvcG9zYWw7Ci0JfQotCi0JLyoqCi0JICogQWRkcyAyIGFycmF5cyBvZiBJQ29tcGxldGlvblByb3Bvc2FscyBhbmQgc29ydHMgdGhlbSB3aXRoIGEKLQkgKiBQcm9wb3NhbENvbXBhcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGpzcFJlc3VsdHMKLQkgKiBAcGFyYW0gaHRtbFJlc3VsdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gbWVyZ2UoSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGpzcFJlc3VsdHMsIElDb21wbGV0aW9uUHJvcG9zYWxbXSBodG1sUmVzdWx0cykgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QganNwcyA9IEFycmF5cy5hc0xpc3QoanNwUmVzdWx0cyk7Ci0JCUxpc3QgaHRtbHMgPSBBcnJheXMuYXNMaXN0KGh0bWxSZXN1bHRzKTsKLQotCQlyZXN1bHRzLmFkZEFsbChqc3BzKTsKLQkJcmVzdWx0cy5hZGRBbGwoaHRtbHMpOwotCi0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0cywgbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHJlc3VsdHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gSlNQSmF2YSBQcm9wb3NhbHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gYW55IGphdmEKLQkgKiBiZWFucyB0aGF0IGluIHNjb3BlIGF0IHRoZSBkb2N1bWVudFBvc2l0aW9uCi0JICogCi0JICogVE9ETyAocGEpIGFyZSB0YWdsaWIgdmFycyBnZXR0aW5nIGZpbHRlcmVkPwotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgQHBhcmFtIGRvY3VtZW50UG9zaXRpb24gQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsW10KLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BKYXZhQmVhblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZWd1bGFySlNQUmVzdWx0cyA9IGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCVZlY3RvciBmaWx0ZXJlZFByb3Bvc2FscyA9IG5ldyBWZWN0b3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGZpbmFsUmVzdWx0cyA9IEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWd1bGFySlNQUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCB0ZXN0ID0gcmVndWxhckpTUFJlc3VsdHNbaV07Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicHJvcG9zYWwgPiAiICsgdGVzdC5nZXREaXNwbGF5U3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbGV2YW5jZSA+ICIgKyAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgdGVzdCkuZ2V0UmVsZXZhbmNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChpc1JlbGV2YW5jZUFsbG93ZWQoKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHRlc3QpLmdldFJlbGV2YW5jZSgpKSkgewotCQkJCWZpbHRlcmVkUHJvcG9zYWxzLmFkZCh0ZXN0KTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyZWRQcm9wb3NhbHMuc2l6ZSgpID4gMCkgewotCQkJZmluYWxSZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbZmlsdGVyZWRQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJCUl0ZXJhdG9yIGl0ID0gZmlsdGVyZWRQcm9wb3NhbHMuaXRlcmF0b3IoKTsKLQkJCWludCBqID0gMDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlmaW5hbFJlc3VsdHNbaisrXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBpdC5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbmFsUmVzdWx0czsKLQl9Ci0KLQkvLyBUaGVzZSBhcmUgdGhlIG9ubHkgdGhpbmdzIEknbSBhbGxvd2luZyBmb3IgdXNlIGJlYW4gaWYgdGhlIGxhbmd1YWdlIGlzCi0JLy8gSkFWQVNDUklQVAotCS8vIEknbSBmaWx0ZXJpbmcgYmFzZWQgb24gSmF2YUNvbnRlbnRBc3Npc3RQcm9wb3NhbCByZWxldmFuY2UKLQkvLwotCS8vIDQ4NSA+IG1ldGhvZCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGJlYW4KLQkvLyA0ODYgPiBiZWFuIG9iamVjdAotCS8vIDM4NiA+IGJlYW4gQ09OU1RBTlQKLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmFuY2VBbGxvd2VkKGludCByZWxldmFuY2UpIHsKLQkJcmV0dXJuIChyZWxldmFuY2UgPT0gNDg1IHx8IHJlbGV2YW5jZSA9PSA0ODYgfHwgcmVsZXZhbmNlID09IDMyNik7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWxbXQotCSAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEhUTUxDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAuZ2V0KElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCQlyZXR1cm4gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbFtdCi0JICovCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQoSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpOwotCQlyZXR1cm4gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJcGFydGl0aW9uVHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUodmlld2VyLmdldERvY3VtZW50KCksIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIHZpZXdlci5tb2RlbE9mZnNldDJXaWRnZXRPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbiksIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcGFydGl0aW9uVHlwZSA9IElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRTsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQkvKgotCSAqICoqIFRFTVAgV09SS0FST1VORCBGT1IgQ01WQyAyNDE4ODIgVGFrZXMgYSBTdHJpbmcgYW5kIGJsb2NrcyBvdXQKLQkgKiBqc3A6c2NyaXB0bGV0LCBqc3A6ZXhwcmVzc2lvbiwgYW5kIGpzcDpkZWNsYXJhdGlvbiBAcGFyYW0gYmxvY2tUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkZWNvZGVTY3JpcHRCbG9jayhTdHJpbmcgYmxvY2tUZXh0KSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBwYXJzZXIgPSBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JCS8vIHVzZSBKU1BfQ09OVEVOVCBmb3IgcmVnaW9uIHR5cGUKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOnNjcmlwdGxldCIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZXhwcmVzc2lvbiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGVjbGFyYXRpb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLnJlc2V0KGJsb2NrVGV4dCk7Ci0JCXJldHVybiBwYXJzZXIuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRBc3Npc3RBZGFwdGVyI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIsIGludCwKLQkgKiAgICAgIEluZGV4ZWRSZWdpb24pCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0LCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JfQotCi0KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIGtleSA9IEpTUFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFOwotCi0JCVN0cmluZyBjaGFycyA9IHN0b3JlLmdldFN0cmluZyhrZXkpOwotCQlyZXR1cm4gKGNoYXJzICE9IG51bGwpID8gY2hhcnMudG9DaGFyQXJyYXkoKSA6IG5ldyBjaGFyWzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzWE1MRm9ybWF0KERvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJcmV0dXJuIGRvY0VsZW1lbnQgIT0gbnVsbCAmJiAoKGRvY0VsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpyb290IikpIHx8ICgoKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmICgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQkvLyByZWxlYXNlICpDb250ZW50QXNzaXN0UHJvY2Vzc29ycyBpbiBtYXBzCi0JCS8vIENNVkMgMjU0MDIzCi0JCXJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQlyZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU5hbWVUb1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmTmFtZVRvUHJvY2Vzc29yTWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTWFwKEhhc2hNYXAgbWFwKSB7Ci0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJaWYgKCFtYXAuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgaXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQlPYmplY3Qga2V5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWtleSA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG1hcC5nZXQoa2V5KSBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJCQkoKElSZWxlYXNhYmxlKSBtYXAuZ2V0KGtleSkpLnJlbGVhc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1hcC5jbGVhcigpOwotCQkJbWFwID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCwKLQkgKiAgICAgIFN0cmluZywgSVRleHRSZWdpb24sIElET01Ob2RlLCBJRE9NTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZlRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCi0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmICh4bWxub2RlICE9IG51bGwpIHsKLQkJCWlmICh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCWRvYyA9IChEb2N1bWVudCkgeG1sbm9kZTsKLQkJCWVsc2UKLQkJCQlkb2MgPSB4bWxub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJfQotCQlTdHJpbmdbXSBkaXJlY3RpdmVOYW1lcyA9IHsicGFnZSIsICJpbmNsdWRlIiwgInRhZ2xpYiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkvLyBzdWdnZXN0IEpTUCBFeHByZXNzaW9uIGluc2lkZSBvZiBYTUwgY29tbWVudHMKLQkJaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiAhaXNYTUxGb3JtYXQoZG9jKSkgewotCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQlyZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QodHJlZU5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCU9ICAlPiIsIGRvY3VtZW50UG9zaXRpb24sIDAsIDQsIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCAianNwOmV4cHJlc3Npb24iLCBudWxsLCAiJmx0OyU9ICUmZ3Q7IiwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQkvLyBoYW5kbGUgcHJvcG9zYWxzIGluIGFuZCBhcm91bmQgSlNQX0RJUkVDVElWRV9PUEVOIGFuZAotCQkvLyBKU1BfRElSRUNUSVZFX05BTUUKLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJiBkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHx8IChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgewotCQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJCXJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh4bWxub2RlLCB4bWxub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQlTdHJpbmcgbmFtZVN0cmluZyA9IG51bGw7Ci0JCQkJaW50IGJlZ2luID0gcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQlpbnQgbGVuZ3RoID0gcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQkJCW5hbWVTdHJpbmcgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCQliZWdpbiA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQlsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5hbWVTdHJpbmcgPT0gbnVsbCkKLQkJCQkJbmFtZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RpdmVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGlyZWN0aXZlTmFtZXNbaV0uc3RhcnRzV2l0aChuYW1lU3RyaW5nKSB8fCBkb2N1bWVudFBvc2l0aW9uIDw9IGJlZ2luKQotCQkJCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGRpcmVjdGl2ZU5hbWVzW2ldLCBiZWdpbiwgbGVuZ3RoLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsgLy8gYnkgZGVmYXVsdCwgSlNQX0RJUkVDVElWRV9OQU1FCi0JCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQkJcmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbG5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChkaXJlY3RpdmVOYW1lc1tpXS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkKLQkJCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSAmJiBkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgfHwgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkpIHsKLQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJcmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCXN1cGVyLmFkZFRhZ0Nsb3NlUHJvcG9zYWxzKHJlcXVlc3QpOwotCQkJLy8gQ01WQyAyNzQwMzMsIHRoaXMgaXMgYmVpbmcgYWRkZWQgZm9yIGFsbCA8anNwOiogdGFncwotCQkJLy8gaW4gYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCkKLQkJCS8vIHN1cGVyLmFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMocmVxdWVzdCk7Ci0JCX0KLQkJLy8gbm8gbmFtZT86IDwlQCAlPgotCQllbHNlIGlmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFICYmIGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCWlmIChyZXF1ZXN0ICE9IG51bGwpCi0JCQkJcmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZyBuYW1lU3RyaW5nID0gbnVsbDsKLQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCW5hbWVTdHJpbmcgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuYW1lU3RyaW5nID09IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBidWcxMTU5MjcgdXNlIG9yaWdpbmFsIGRvY3VtZW50IHBvc2l0aW9uIGZvciBhbGwvYW55IHJlZ2lvbiB0ZW1wbGF0ZXMKLQkJYWRkVGVtcGxhdGVzKHJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQUxMLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydE9mZnNldCkgewotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBpZiBhbHJlYWR5IGFkZGluZyB0ZW1wbGF0ZSBwcm9wb3NhbHMgZm9yIGEgY2VydGFpbiBjb250ZXh0IHR5cGUsIGRvCi0JCS8vIG5vdCBhZGQgYWdhaW4KLQkJaWYgKCFmVGVtcGxhdGVDb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuYWRkKGNvbnRleHQpOwotCQkJYm9vbGVhbiB1c2VQcm9wb3NhbExpc3QgPSAhY29udGVudEFzc2lzdFJlcXVlc3Quc2hvdWxkU2VwYXJhdGUoKTsKLQotCQkJaWYgKGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpICE9IG51bGwpIHsKLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShjb250ZXh0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZlRleHRWaWV3ZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAodXNlUHJvcG9zYWxMaXN0KQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWxzW2ldKTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkTWFjcm8ocHJvcG9zYWxzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuVEFHKTsKLQotCQlzdXBlci5hZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCQlpZiAoaXNJbnRlcm5hbEFkYXB0ZXIpCi0JCQl1c2VFbWJlZGRlZFJlc3VsdHMgPSBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmMmFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhICJudWxsIiB2ZXJzaW9uIG9mIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21tZW50UHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkQ29tbWVudFByb3Bvc2FsKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnQoTGlzdCBjb250ZW50TGlzdCwgQ01Db250ZW50IGNvbnRlbnQpIHsKLQkJc3VwZXIuYWRkQ29udGVudChjb250ZW50TGlzdCwgY29udGVudCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREb2NUeXBlUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkRG9jVHlwZVByb3Bvc2FsKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkRW1wdHlEb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSkgewotCQlzdXBlci5hZGRFbnRpdHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGRvY3VtZW50UG9zaXRpb24sIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhWZWN0b3IgcHJvcG9zYWxzLCBQcm9wZXJ0aWVzIG1hcCwgU3RyaW5nIGtleSwgaW50IG5vZGVPZmZzZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uKSB7Ci0JCXN1cGVyLmFkZEVudGl0eVByb3Bvc2Fscyhwcm9wb3NhbHMsIG1hcCwga2V5LCBub2RlT2Zmc2V0LCBwYXJlbnQsIGNvbXBsZXRpb25SZWdpb24pOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUENEQVRBUHJvcG9zYWwoU3RyaW5nIG5vZGVOYW1lLCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRQQ0RBVEFQcm9wb3NhbChub2RlTmFtZSwgY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0Nsb3NlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCXN1cGVyLmFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGF0dHJpYnV0ZUluTGlzdChJRE9NTm9kZSBub2RlLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuYXR0cmlidXRlSW5MaXN0KG5vZGUsIHBhcmVudCwgY21ub2RlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGJlZ2luc1dpdGgoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIHN1cGVyLmJlZ2luc1dpdGgoYVN0cmluZywgcHJlZml4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JfQotCi0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29udGVudFByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb250ZW50UHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlRW5kVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUVudGl0eVJlZmVyZW5jZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlRXF1YWxzUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUVxdWFsc1Byb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlU3RhcnREb2N1bWVudFByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ0Nsb3NlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVRhZ0Nsb3NlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnTmFtZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVUYWdOYW1lUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnT3BlblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVUYWdPcGVuUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oQ01Ob2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFkZGl0aW9uYWxJbmZvKHBhcmVudE9yT3duZXIsIGNtbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KEVsZW1lbnQgcGFyZW50LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LCBpbmRleCwgdmFsaWRpdHlDaGVja2luZyk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKERvY3VtZW50IGRvY3VtZW50LCBpbnQgY2hpbGRJbmRleCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKGRvY3VtZW50LCBjaGlsZEluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXRDb21wbGV0aW9uUmVnaW9uKGludCBvZmZzZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbXBsZXRpb25SZWdpb24ob2Zmc2V0LCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IGRvY3VtZW50UG9zaXRpb24sIE5vZGUgZG9tbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tcGxldGlvblJlZ2lvbihkb2N1bWVudFBvc2l0aW9uLCBkb21ub2RlKTsKLQl9Ci0KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50R2VuZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEVsZW1lbnRQb3NpdGlvbihOb2RlIGNoaWxkKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFbGVtZW50UG9zaXRpb24oY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hdGNoU3RyaW5nKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNYXRjaFN0cmluZyhwYXJlbnQsIGFSZWdpb24sIG9mZnNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TmFtZVJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKE5vZGUgbm9kZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhub2RlLCBhZCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkTmFtZShOb2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlcXVpcmVkTmFtZShwYXJlbnRPck93bmVyLCBjbW5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRUZXh0KE5vZGUgcGFyZW50T3JPd25lciwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVxdWlyZWRUZXh0KHBhcmVudE9yT3duZXIsIGF0dHJEZWNsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkVGV4dChOb2RlIHBhcmVudE9yT3duZXIsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXF1aXJlZFRleHQocGFyZW50T3JPd25lciwgZWxlbWVudERlY2wpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKEVsZW1lbnQgcGFyZW50LCBpbnQgY2hpbGRQb3NpdGlvbiwgaW50IGtpbmRPZkFjdGlvbikgewotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBraW5kT2ZBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gc3VwZXIuaXNDbG9zZVJlZ2lvbihyZWdpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzTmFtZVJlZ2lvbihyZWdpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUXVvdGUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3VwZXIuaXNRdW90ZShzdHJpbmcpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIG1hcFRvUHJvcGVydGllcyhDTU5hbWVkTm9kZU1hcCBtYXApIHsKLQkJcmV0dXJuIHN1cGVyLm1hcFRvUHJvcGVydGllcyhtYXApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCXN1cGVyLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgYXBwZW5kKSB7Ci0JCXN1cGVyLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UsIGFwcGVuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBwcmVwZW5kLCBTdHJpbmcgYXBwZW5kKSB7Ci0JCXN1cGVyLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UsIHByZXBlbmQsIGFwcGVuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlyZXR1cm4gc3VwZXIuc3RyaW5nc0VxdWFsKGEsIGIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjRiNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTENvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BFTFByb3Bvc2FsQ29sbGVjdG9yKGN1LCB0cmFuc2xhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0YjgwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuQ01Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVGFnbGliVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5BU1RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkFTVEZ1bmN0aW9uSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFBhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFBhcnNlclRva2VuTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5TaW1wbGVDaGFyU3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUEVMQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgY2hhciBlbENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbmV3IGNoYXJbXXsnLicsICc6J307Ci0KLQlwcm90ZWN0ZWQgSlNQQ29tcGxldGlvblByb2Nlc3NvciBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0KLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1AgY29tcGxldGlvbiBwcm9jZXNzb3IKLQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZkVycm9yTWVzc2FnZSA9IGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLmdldEVycm9yTWVzc2FnZSgpOwotCQlpZiAocmVzdWx0cy5sZW5ndGggPT0gMCAmJiAoZkVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGZFcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWZFcnJvck1lc3NhZ2UgPSBVTktOT1dOX0NPTlRFWFQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXQgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQotCQlpZiAoZmxhdCAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJzb3JSZWdpb24gPSBmbGF0LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgPT0gY3Vyc29yUmVnaW9uLmdldFR5cGUoKSkgewotCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY3Vyc29yUmVnaW9uOwotCQkJCWN1cnNvclJlZ2lvbiA9IGNvbnRhaW5lci5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAoY3Vyc29yUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkgewotCQkJCQlTdHJpbmcgZWxUZXh0ID0gY29udGFpbmVyLmdldFRleHQoY3Vyc29yUmVnaW9uKS50cmltKCk7Ci0JCQkJCVN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgoZG9jdW1lbnRQb3NpdGlvbiAtIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChjdXJzb3JSZWdpb24pIC0gMSwgZWxUZXh0KTsKLQkJCQkJaWYgKG51bGwgIT0gcHJlZml4KSB7Ci0JCQkJCQlMaXN0IHByb3Bvc2FscyA9IGdldEZ1bmN0aW9uUHJvcG9zYWxzKHByZWZpeCwgKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJcmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldOwotCQkJCQkJcHJvcG9zYWxzLnRvQXJyYXkocmVzdWx0cyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZml4KGludCByZWxhdGl2ZVBvc2l0aW9uLCBTdHJpbmcgZWxUZXh0KSB7Ci0JCWphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihlbFRleHQpOwotCQlKU1BFTFBhcnNlclRva2VuTWFuYWdlciBzY2FubmVyID0gbmV3IEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKG5ldyBTaW1wbGVDaGFyU3RyZWFtKHJlYWRlciwgMSwgMSkpOwotCQlUb2tlbiBjdXJUb2tlbiA9IG51bGwsIGxhc3RJZGVudGlmaWVyID0gbnVsbDsKLQkJd2hpbGUgKEpTUEVMUGFyc2VyQ29uc3RhbnRzLkVPRiAhPSAoY3VyVG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKS5raW5kKSB7Ci0JCQlpZiAoSlNQRUxQYXJzZXJDb25zdGFudHMuQ09MT04gPT0gY3VyVG9rZW4ua2luZCAmJiBjdXJUb2tlbi5lbmRDb2x1bW4gPT0gcmVsYXRpdmVQb3NpdGlvbiAmJiBudWxsICE9IGxhc3RJZGVudGlmaWVyKSB7Ci0JCQkJcmV0dXJuIChsYXN0SWRlbnRpZmllci5pbWFnZSk7Ci0JCQl9Ci0KLQkJCWlmIChKU1BFTFBhcnNlckNvbnN0YW50cy5JREVOVElGSUVSID09IGN1clRva2VuLmtpbmQpIHsKLQkJCQlsYXN0SWRlbnRpZmllciA9IGN1clRva2VuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbGFzdElkZW50aWZpZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBBU1RGdW5jdGlvbkludm9jYXRpb24gZ2V0SW52b2NhdGlvbihpbnQgcmVsYXRpdmVQb3NpdGlvbiwgU3RyaW5nIGVsVGV4dCkgewotCQlGaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvciB2aXNpdG9yID0gbmV3IEZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yKHJlbGF0aXZlUG9zaXRpb24pOwotCQlKU1BFTFBhcnNlciBwYXJzZXIgPSBKU1BFTFBhcnNlci5jcmVhdGVQYXJzZXIoZWxUZXh0KTsKLQkJdHJ5IHsKLQkJCUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlci5FeHByZXNzaW9uKCk7Ci0JCQlyZXR1cm4gKEFTVEZ1bmN0aW9uSW52b2NhdGlvbikgZXhwcmVzc2lvbi5qanRBY2NlcHQodmlzaXRvciwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsgLyogcGFyc2UgZXhjZXB0aW9uID0gbm8gY29tcGxldGlvbiAqLwotCQl9Ci0JCXJldHVybiAobnVsbCk7Ci0JfQotCi0KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGVsQ29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEZ1bmN0aW9uUHJvcG9zYWxzKFN0cmluZyBwcmVmaXgsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJQXJyYXlMaXN0IGNvbXBsZXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZG9jTWdyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJdGVyYXRvciB0YWdsaWJzID0gZG9jTWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhvZmZzZXQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIHRhZ2xpYnMubmV4dCgpOwotCQkJaWYgKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlDTURvY3VtZW50SW1wbCBkb2MgPSAoQ01Eb2N1bWVudEltcGwpIHRyYWNrZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCUxpc3QgZnVuY3Rpb25zID0gZG9jLmdldEZ1bmN0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlUTERGdW5jdGlvbiBmdW5jdGlvbiA9IChUTERGdW5jdGlvbikgaXQubmV4dCgpOwotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGZ1bmN0aW9uLmdldE5hbWUoKSArICIoKSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJb2Zmc2V0LCAwLCBmdW5jdGlvbi5nZXROYW1lKCkubGVuZ3RoKCkgKyAxLCBudWxsLCBmdW5jdGlvbi5nZXROYW1lKCkgKyAiIC0gIiArIGZ1bmN0aW9uLmdldFNpZ25hdHVyZSgpLCBudWxsLCBudWxsLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWNvbXBsZXRpb25MaXN0LmFkZChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wbGV0aW9uTGlzdDsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTFByb3Bvc2FsQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZmU1ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxQcm9wb3NhbENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEpTUEVMUHJvcG9zYWxDb2xsZWN0b3IgZXh0ZW5kcyBKU1BQcm9wb3NhbENvbGxlY3RvciB7Ci0KLQlwdWJsaWMgSlNQRUxQcm9wb3NhbENvbGxlY3RvcihJQ29tcGlsYXRpb25Vbml0IGN1LCBKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlzdXBlcihjdSwgdHJhbnNsYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQlKU1BDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWwgPSBudWxsOwotCQkKLQkJaWYobnVsbCA9PSBwcm9wb3NhbCB8fCBudWxsID09IHByb3Bvc2FsLmdldE5hbWUoKSkKLQkJCXJldHVybihudWxsKTsKLQkJCi0JCVN0cmluZyByYXdOYW1lID0gbmV3IFN0cmluZyhwcm9wb3NhbC5nZXROYW1lKCkpOwotCQlTdHJpbmcgY29tcGxldGlvbiA9IG51bGw7Ci0JCQotCQlpZihwcm9wb3NhbC5nZXRLaW5kKCkgPT0gQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYgJiYgcHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpLmxlbmd0aCA9PSAwKSB7Ci0JCQlpZihyYXdOYW1lLmxlbmd0aCgpID4gMyAmJiByYXdOYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb21wbGV0aW9uID0gcmF3TmFtZS5zdWJzdHJpbmcoMyw0KS50b0xvd2VyQ2FzZSgpICsgcmF3TmFtZS5zdWJzdHJpbmcoNCwgcmF3TmFtZS5sZW5ndGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBqYXZhIG9mZnNldAotCQkJaW50IG9mZnNldCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpICsgMTsKLQkJCQotCQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCQlpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0ICsgMTsKLQkJCQotCQkJLy8gdHJhbnNsYXRlIG9mZnNldCBmcm9tIEphdmEgPiBKU1AKLQkJCW9mZnNldCA9IGdldFRyYW5zbGF0aW9uKCkuZ2V0SnNwT2Zmc2V0KG9mZnNldCk7Ci0JCQkKLQkJCS8vIGN1cnNvciBwb3NpdGlvbiBhZnRlciBtdXN0IGJlIGNhbGN1bGF0ZWQKLQkJCWludCBwb3NpdGlvbkFmdGVyID0gb2Zmc2V0ICsgY29tcGxldGlvbi5sZW5ndGgoKTsKLQkJCQkKLQkJCS8vIGZyb20gamF2YSBwcm9wb3NhbAotCQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gc3VwZXIuY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQlTdHJpbmcgbG9uZ0Rpc3BsYXlTdHJpbmcgPSBqYXZhUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotCQkJaW50IGZpc3RTcGFjZUluZGV4ID0gbG9uZ0Rpc3BsYXlTdHJpbmcuaW5kZXhPZignICcpOwotCQkJU3RyaW5nIHNob3J0RGlzcGxheVN0cmluZyA9IGxvbmdEaXNwbGF5U3RyaW5nOwotCQkJCi0JCQlpZihmaXN0U3BhY2VJbmRleCAhPSAtMSkgewotCQkJCXNob3J0RGlzcGxheVN0cmluZyA9IGxvbmdEaXNwbGF5U3RyaW5nLnN1YnN0cmluZyhmaXN0U3BhY2VJbmRleCk7Ci0JCQl9Ci0JCQkJCi0JCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGNvbXBsZXRpb24gKyAiICIgKyBzaG9ydERpc3BsYXlTdHJpbmc7IC8vJE5PTi1OTFMtMSQKLQkJCUlDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uID0gamF2YVByb3Bvc2FsLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCQkKLQkJCWJvb2xlYW4gdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHRydWU7Ci0JCQkKLQkJCWpzcFByb3Bvc2FsID0gbmV3IEpTUENvbXBsZXRpb25Qcm9wb3NhbChjb21wbGV0aW9uLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbEluZm8sIHJlbGV2YW5jZSwgdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSk7Ci0JCQkKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkJCS8vIHNldCB3cmFwcGVkIGphdmEgcHJvcG9zYWwgc28gYWRkaXRpb25hbCBpbmZvIGNhbiBiZSBjYWxjdWxhdGVkIG9uIGRlbWFuZAotCQkJanNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotCQkJCi0JCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotLy8JcHJvdGVjdGVkIHZvaWQgYWNjZXB0TWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgY2hhcltdIG5hbWUsIGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSwgY2hhcltdIHJldHVyblR5cGVOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBtb2RpZmllcnMsIGludCBzdGFydCwgaW50IGVuZCwgaW50IHJlbGV2YW5jZSkgewotLy8JCVN0cmluZyByYXdOYW1lID0gU3RyaW5nLnZhbHVlT2YobmFtZSk7Ci0vLwkJaWYocGFyYW1ldGVyTmFtZXMubGVuZ3RoID09IDAgJiYgcmF3TmFtZS5sZW5ndGgoKSA+IDMgJiYgcmF3TmFtZS5zdGFydHNXaXRoKCJnZXQiKSkKLS8vCQl7Ci0vLwkJCVN0cmluZyBtYW5nbGVkTmFtZSA9IHJhd05hbWUuc3Vic3RyaW5nKDMsNCkudG9Mb3dlckNhc2UoKSArIHJhd05hbWUuc3Vic3RyaW5nKDQsIHJhd05hbWUubGVuZ3RoKCkpOwotLy8JCQlzdXBlci5hY2NlcHRGaWVsZChkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGRlY2xhcmluZ1R5cGVOYW1lLCBtYW5nbGVkTmFtZS50b0NoYXJBcnJheSgpLCByZXR1cm5UeXBlUGFja2FnZU5hbWUsIHJldHVyblR5cGVOYW1lLCBtYW5nbGVkTmFtZS50b0NoYXJBcnJheSgpLCBtb2RpZmllcnMsIHN0YXJ0LCBlbmQsIHJlbGV2YW5jZSk7Ci0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmMyMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0JcHJvdGVjdGVkIGNoYXIgY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBuZXcgY2hhcltdeycuJ307Ci0JcHJvdGVjdGVkIGNoYXIgY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQ09OVEVYVCA9IEpTUFVJTWVzc2FnZXMuQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBudWxsOwotCi0JcHVibGljIEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUKLQkgKiBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzCi0JICogdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uIGEgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29kZS1hc3Npc3QgaXRlbXMgCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQkvLyBnZXQgcmVzdWx0cyBmcm9tIEpTUCBjb21wbGV0aW9uIHByb2Nlc3NvcgkKLQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZkVycm9yTWVzc2FnZSA9IGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLmdldEVycm9yTWVzc2FnZSgpOwotCQlpZiAocmVzdWx0cy5sZW5ndGggPT0gMCAmJiAoZkVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGZFcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWZFcnJvck1lc3NhZ2UgPSBVTktOT1dOX0NPTlRFWFQ7Ci0JCX0KLQotCQlJRE9NTm9kZSB4Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCA9IG51bGw7Ci0JCWlmICh0cmVlTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQl4Tm9kZSA9IChJRE9NTm9kZSkgdHJlZU5vZGU7Ci0JCQlmbGF0ID0geE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0ICE9IG51bGwgJiYgZmxhdC5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQlmbGF0ID0gZmxhdC5nZXRQcmV2aW91cygpOwotCQkJfQotCQl9Ci0KLQkJLy8gdGhpcyBpcyBpbiBjYXNlIGl0J3MgYSA8JUAsIGl0IHdpbGwgYmUgYSByZWdpb24gY29udGFpbmVyLi4uCi0JCUlUZXh0UmVnaW9uIG9wZW5SZWdpb24gPSBudWxsOwotCQlpZiAoZmxhdCAhPSBudWxsICYmIGZsYXQgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJSVRleHRSZWdpb25MaXN0IHYgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBmbGF0KS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAodi5zaXplKCkgPiAwKQotCQkJCW9wZW5SZWdpb24gPSB2LmdldCgwKTsKLQkJfQotCi0JCS8vIEFERCBDREFUQSBQUk9QT1NBTCBJRiBJVCdTIEFOIFhNTC1KU1AgVEFHICAKLQkJaWYgKGZsYXQgIT0gbnVsbCAmJiBmbGF0LmdldFR5cGUoKSAhPSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiAmJiBmbGF0LmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgJiYgKG9wZW5SZWdpb24gIT0gbnVsbCAmJiBvcGVuUmVnaW9uLmdldFR5cGUoKSAhPSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pICYmICFpbkF0dHJpYnV0ZVJlZ2lvbihmbGF0LCBkb2N1bWVudFBvc2l0aW9uKSkgewotCi0JCQkvLyBkZXRlcm1pbmUgaWYgY3Vyc29yIGlzIGJlZm9yZSBvciBhZnRlciBzZWxlY3RlZCByYW5nZQotCQkJaW50IGFkanVzdGVkRG9jUG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQkJaW50IHJlYWxDYXJldFBvc2l0aW9uID0gdmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRDYXJldE9mZnNldCgpOwotCQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueTsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gcmVhbENhcmV0UG9zaXRpb24pIHsKLQkJCQlhZGp1c3RlZERvY1Bvc2l0aW9uIC09IHNlbGVjdGlvbkxlbmd0aDsKLQkJCX0KLQotCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGNkYXRhUHJvcG9zYWwgPSBjcmVhdGVDREFUQVByb3Bvc2FsKGFkanVzdGVkRG9jUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gbmV3UmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHMsIDAsIG5ld1Jlc3VsdHMsIDAsIHJlc3VsdHMubGVuZ3RoKTsKLQkJCW5ld1Jlc3VsdHNbcmVzdWx0cy5sZW5ndGhdID0gY2RhdGFQcm9wb3NhbDsKLQkJCXJlc3VsdHMgPSBuZXdSZXN1bHRzOwotCQl9Ci0KLQkJLy8gKHBhKSAqKiB0aGlzIGlzIGNvZGUgaW4gcHJvZ3Jlc3MuLi4KLQkJLy8gYWRkIGVuZGluZyAlPiBwcm9wb3NhbCBmb3Igbm9uIGNsb3NlZCBKU1AgdGFncwotCQkvLwkJU3RyaW5nIHRhZ1RleHQgPSBmbGF0LmdldFRleHQoKTsKLQkJLy8JCS8vIFRPRE8gbmVlZCBhIG11Y2ggYmV0dGVyIGNvbXBhcmUgKHVzaW5nIGNvbnN0YW50cz8pCi0JCS8vCQlpZih0YWdUZXh0LmVxdWFscygiPCUiKSB8fCB0YWdUZXh0LmVxdWFscygiPCU9IikgfHwgdGFnVGV4dC5lcXVhbHMoIjwlISIpKTsKLQkJLy8JCXsKLQkJLy8JCQlJQ29tcGxldGlvblByb3Bvc2FsIHRlc3RhaCA9IENvbnRlbnRBc3Npc3RVdGlscy5jb21wdXRlSlNQRW5kVGFnUHJvcG9zYWwodmlld2VyLGRvY3VtZW50UG9zaXRpb24sIHRyZWVOb2RlLCAiPCUiICwgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCS8vCQkJaWYodGVzdGFoICE9IG51bGwpCi0JCS8vCQkJewotCQkvLwkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gbmV3UmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMubGVuZ3RoICsgMV07Ci0JCS8vCQkJCVN5c3RlbS5hcnJheWNvcHkoIHJlc3VsdHMsIDAsIG5ld1Jlc3VsdHMsIDAsIHJlc3VsdHMubGVuZ3RoKTsKLQkJLy8JCQkJbmV3UmVzdWx0c1tyZXN1bHRzLmxlbmd0aF0gPSB0ZXN0YWg7Ci0JCS8vCQkJCXJlc3VsdHMgPSBuZXdSZXN1bHRzOwotCQkvLwkJCX0KLQkJLy8JCX0KLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVDREFUQVByb3Bvc2FsKGludCBhZGp1c3RlZERvY1Bvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IVtDREFUQVtdXT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWFkanVzdGVkRG9jUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCwgLy8gc2hvdWxkIGJlIHRoZSBzZWxlY3Rpb24gbGVuZ3RoCi0JCQkJCTksIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQ0RBVEFTRUNUSU9OKSwgCi0JCQkJCSJDREFUQSBTZWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluQXR0cmlidXRlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSVRleHRSZWdpb24gYXR0ckNvbnRhaW5lciA9IGZsYXQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChhdHRyQ29udGFpbmVyICE9IG51bGwgJiYgYXR0ckNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlpZiAoYXR0ckNvbnRhaW5lci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICoJCWlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKgkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkgY29tcGxldGlvbnMuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiAgIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IucmVsZWFzZSgpOwotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0SnNwQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEpTUENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gbmVlZCB0byBjb21wdXRlIGNvbnRleHQgaW5mbyBoZXJlLCBpZiBpdCdzIEpTUCwgY2FsbCBqYXZhIGNvbXB1dGVyCi0JCUlEb2N1bWVudCBkb2MgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgZHAgPSBudWxsOwotCQlpZihkb2MgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24zKSB7Ci0JCQlkcCA9ICgoSURvY3VtZW50RXh0ZW5zaW9uMylkb2MpLmdldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJaWYoZHAgIT0gbnVsbCkgewotCQkJLy9JRG9jdW1lbnRQYXJ0aXRpb25lciBkcCA9IHZpZXdlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCVN0cmluZyB0eXBlID0gZHAuZ2V0UGFydGl0aW9uKGRvY3VtZW50T2Zmc2V0KS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCB8fCB0eXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpIHsKLQkJCQkvLyBnZXQgY29udGV4dCBpbmZvIGZyb20gY29tcGxldGlvbiByZXN1bHRzLi4uCi0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb250ZXh0SW5mb3JtYXRpb24gY2kgPSBwcm9wb3NhbHNbaV0uZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCQkJCWlmIChjaSAhPSBudWxsKQotCQkJCQkJcmVzdWx0cy5hZGQoY2kpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb250ZXh0SW5mb3JtYXRpb25bXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJQ29udGV4dEluZm9ybWF0aW9uW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbGlkYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGVuIGRpc3BsYXllZCBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogc2hvdWxkIGJlIGRpc21pc3NlZC4gTWF5IG9ubHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9jZXNzb3IgaXMKLQkgKiBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9jZXNzb3IKLQkgKiAJCQlpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NzE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb21wdXRlcyBhdHRyaWJ1dGUgdmFsdWUgY29tcGxldGlvbiBwcm9wb3NhbHMgZm9yICZsdDtqc3A6W2dzXWV0UHJvcGVydHkmZ3Q7IHRhZ3MuCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHVibGljIEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0KLQkJLy8gRmluZCB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHdoaWNoIHRoaXMgcG9zaXRpb24gc2hvdWxkIGhhdmUgYSB2YWx1ZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQlpbnQgaSA9IG9wZW5SZWdpb25zLmluZGV4T2YoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkpOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IHRoZSBhdHRyaWJ1dGUgaW4gcXVlc3Rpb24gKGZpcnN0IGF0dHIgbmFtZSB0byB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yKQotCQlJVGV4dFJlZ2lvbiBhdHRyTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQkJd2hpbGUgKGkgPj0gMCkgewotCQkJYXR0ck5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChhdHRyTmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdHRyTmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJYXR0cmlidXRlTmFtZSA9IG9wZW4uZ2V0VGV4dChhdHRyTmFtZVJlZ2lvbik7Ci0KLQkJLy8gZGV0ZXJtaW5lIGdldCBvciBzZXQKLQkJSVRleHRSZWdpb24gdGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCWJvb2xlYW4gaXNHZXRQcm9wZXJ0eSA9IHRydWU7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgb3BlblJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCXRhZ05hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaik7Ci0JCQlpZiAodGFnTmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgJiYgb3Blbi5nZXRUZXh0KHRhZ05hbWVSZWdpb24pLnRyaW0oKS5lcXVhbHMoImpzcDpzZXRQcm9wZXJ0eSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpc0dldFByb3BlcnR5ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJY3VycmVudFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0VGV4dCgpOwotCQllbHNlCi0JCQljdXJyZW50VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBudWxsOwotCQkvLyBmaXh1cHMgc2luY2UgdGhlIG1hdGNoU3RyaW5nIGNvbXB1dGF0aW9ucyBkb24ndCBjYXJlIGlmIHRoZXJlIGFyZSBxdW90ZXMgYXJvdW5kIHRoZSB2YWx1ZQotCQlpZiAoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gU3RyaW5nVXRpbHMuc3RyaXAoY3VycmVudFZhbHVlKS5sZW5ndGgoKSAmJiAoY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIiciKSkgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDEsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCQllbHNlCi0JCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0KLQkJLy8gZm9yIG5vdyB3ZSBpZ25vcmUgY29tcGxpY2F0ZWQgdmFsdWVzIHN1Y2ggYXMganNwIGVtYmVkZGVkIGluIGFuIGF0dHJpYnV0ZQotCQlib29sZWFuIGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpICE9IG51bGwgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLQkJaWYgKGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuY2xlYXIoKTsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hY3JvcygpLmNsZWFyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkJYWRkQmVhbk5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIG5vZGUsIG1hdGNoU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9QRVJUWSkpIHsKLQkJCQlhZGRCZWFuUHJvcGVydHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIG5vZGUsIGlzR2V0UHJvcGVydHksIG1hdGNoU3RyaW5nKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRCZWFuUHJvcGVydHlQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIElET01Ob2RlIG5vZGUsIGJvb2xlYW4gaXNHZXRQcm9wZXJ0eSwgU3RyaW5nIG1hdGNoU3RyaW5nKSB7Ci0JCS8vIGFzc3VtZXMgdGhhdCB0aGUgbm9kZSBpcyB0aGUgW2dzXWV0UHJvcGVydHkgdGFnCi0JCVN0cmluZyB1c2VCZWFuTmFtZSA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKTsKLQkJLy8gcHJvcGVydGllcyBjYW4gb25seSBiZSBwcm92aWRlZCBpZiBhIGNsYXNzL3R5cGUvYmVhbk5hbWUgaGFzIGJlZW4gZGVjbGFyZWQKLQkJaWYgKHVzZUJlYW5OYW1lICE9IG51bGwgJiYgdXNlQmVhbk5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlOb2RlTGlzdCB1c2VCZWFucyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQkJaWYgKHVzZUJlYW5zICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdXNlQmVhbnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQlpZiAodXNlQmVhbnMuaXRlbShqKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJY29udGludWU7Ci0JCQkJCUVsZW1lbnQgdXNlQmVhbiA9IChFbGVtZW50KSB1c2VCZWFucy5pdGVtKGopOwotCQkJCQlpZiAodXNlQmVhbiBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24gJiYgKChJbmRleGVkUmVnaW9uKSB1c2VCZWFuKS5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQlpZiAodXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lEKS5lcXVhbHModXNlQmVhbk5hbWUpKSB7Ci0JCQkJCQkJdHlwZU5hbWUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1MpOwotCQkJCQkJCWlmICh0eXBlTmFtZSA9PSBudWxsIHx8IHR5cGVOYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJCQkJCQl0eXBlTmFtZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHR5cGVOYW1lID09IG51bGwgfHwgdHlwZU5hbWUubGVuZ3RoKCkgPCAxKSB7Ci0JCQkJCQkJCXR5cGVOYW1lID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0JFQU5fTkFNRSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0eXBlTmFtZSAhPSBudWxsICYmIHR5cGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkvLyBmaW5kIHRoZSBjbGFzcy90eXBlL2JlYW5OYW1lIGRlZmluaXRpb24gYW5kIG9idGFpbiB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzCi0JCQkJCUlCZWFuSW5mb1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEJlYW5JbmZvUHJvdmlkZXIoKTsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQlJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcHJvdmlkZXIuZ2V0UnVudGltZVByb3BlcnRpZXMocmVzb3VyY2UsIHR5cGVOYW1lKTsKLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbnVsbDsKLQkJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJSmF2YVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IGRlc2NyaXB0b3JzW2pdOwotCQkJCQkJLy8gY2hlY2sgd2hldGhlciBpdCdzIGdldCBvciBzZXQga2luZGEgcHJvcGVydHkKLQkJCQkJCWlmIChwZC5nZXRSZWFkYWJsZSgpICYmIGlzR2V0UHJvcGVydHkgfHwgcGQuZ2V0V3JpdGVhYmxlKCkgJiYgIWlzR2V0UHJvcGVydHkpIHsKLQkJCQkJCQkvLyBmaWx0ZXIgYXR0ciB2YWx1ZSBuYW1lCi0JCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcGQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSkgewotCQkJCQkJCQlkaXNwbGF5U3RyaW5nID0gcGQuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQkJCQkJaWYgKHBkLmdldERlY2xhcmVkVHlwZSgpICE9IG51bGwgJiYgcGQuZ2V0RGVjbGFyZWRUeXBlKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJCQkJZGlzcGxheVN0cmluZyArPSAiIC0gIiArIHBkLmdldERlY2xhcmVkVHlwZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgcGQuZ2V0TmFtZSgpICsgIlwiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBwZC5nZXROYW1lKCkubGVuZ3RoKCkgKyAyLCBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0FUVFJJQlVURSksCi0JCQkJCQkJCQkJCWRpc3BsYXlTdHJpbmcsIG51bGwsIHBkLmdldERlY2xhcmVkVHlwZSgpLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRCZWFuTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgSURPTU5vZGUgbm9kZSwgU3RyaW5nIG1hdGNoU3RyaW5nKSB7Ci0JCS8vIHdpbGwgbm90IGNhdGNoIHVzZUJlYW5zIHNwZWNpZmllZCB1c2luZyBvdGhlciB0aGFuIGFjdHVhbCBET00gTm9kZXMKLQkJTm9kZUxpc3QgdXNlQmVhbnMgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJaWYgKHVzZUJlYW5zICE9IG51bGwpIHsKLQkJCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NPclR5cGUgPSBudWxsOwotCQkJU3RyaW5nIGltYWdlTmFtZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NMQVNTX09CSjsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgdXNlQmVhbnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCWlmICh1c2VCZWFucy5pdGVtKGopLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUVsZW1lbnQgdXNlQmVhbiA9IChFbGVtZW50KSB1c2VCZWFucy5pdGVtKGopOwotCQkJCWlmICh1c2VCZWFuIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbiAmJiAoKEluZGV4ZWRSZWdpb24pIHVzZUJlYW4pLmdldFN0YXJ0T2Zmc2V0KCkgPCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJaWQgPSBTdHJpbmdVdGlscy5zdHJpcCh1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfSUQpKTsKLQkJCQkJZGlzcGxheVN0cmluZyA9IG51bGw7Ci0JCQkJCWNsYXNzT3JUeXBlID0gbnVsbDsKLQkJCQkJaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0xBU1NfT0JKOwotCQkJCQkvLyBzZXQgdGhlIEltYWdlIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGNsYXNzLCB0eXBlLCBvciBiZWFuTmFtZSBhdHRyaWJ1dGUgaXMgcHJlc2VudAotCQkJCQljbGFzc09yVHlwZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEFTUyk7Ci0JCQkJCWlmIChjbGFzc09yVHlwZSA9PSBudWxsIHx8IGNsYXNzT3JUeXBlLmxlbmd0aCgpIDwgMSkgewotCQkJCQkJY2xhc3NPclR5cGUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCQkJCQlpbWFnZU5hbWUgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QVUJMSUM7Ci0JCQkJCX0KLQkJCQkJaWYgKGNsYXNzT3JUeXBlID09IG51bGwgfHwgY2xhc3NPclR5cGUubGVuZ3RoKCkgPCAxKSB7Ci0JCQkJCQljbGFzc09yVHlwZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUFOX05BTUUpOwotCQkJCQkJaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFVCTElDOwotCQkJCQl9Ci0JCQkJCWlmIChjbGFzc09yVHlwZSAhPSBudWxsICYmIGNsYXNzT3JUeXBlLmxlbmd0aCgpID4gMCkKLQkJCQkJCWRpc3BsYXlTdHJpbmcgPSBpZCArICIgLSAiICsgY2xhc3NPclR5cGU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJZGlzcGxheVN0cmluZyA9IGlkOwotCi0JCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yMzQxCi0JCQkJCWlmKGlkICE9IG51bGwpIHsKLQkJCQkJICAgIC8vIGZpbHRlcgotCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgaWQuc3RhcnRzV2l0aChtYXRjaFN0cmluZykpIHsKLQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBpZCArICJcIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5sZW5ndGgoKSArIDIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0cmluZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgcHJvamVjdCByZXF1ZXN0IGlzIGluCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgYmFzZWxvY2F0aW9uID0gbnVsbDsKLQotCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQliYXNlbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGJhc2Vsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBjb3BpZWQgZnJvbSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIjZ2V0SmF2YVByb2plY3QKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlbG9jYXRpb24pOwotCQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlmaWxlID0gcm9vdC5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJCX0KLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZSA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcG9zYWxDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNmEzZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcG9zYWxDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBQYXNzZWQgaW50byBJQ29kZUNvbXBsZXRlI2NvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikuCi0gKiBBZGFwdHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxzIHRvIEpTUENvbXBsZXRpb24gcHJvcG9zYWxzLgotICogVGhpcyBpbmNsdWRlczoKLSAqICAtIHRyYW5zbGF0aW5nIG9mZnNldHMKLSAqICAtICJmaXhpbmciIHVwIGRpc3BsYXkgc3RyaW5ncwotICogIC0gZmlsdGVyaW5nIHNvbWUgdW53YW50ZWQgcHJvcG9zYWxzCi0gKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wb3NhbENvbGxlY3RvciBleHRlbmRzIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvciB7Ci0KLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uIGZUcmFuc2xhdGlvbjsKLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0JCi0JcHVibGljIEpTUFByb3Bvc2FsQ29sbGVjdG9yKElDb21waWxhdGlvblVuaXQgY3UsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCXN1cGVyKGN1KTsKLQkKLQkJaWYodHJhbnNsYXRpb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkpTUFRyYW5zbGF0aW9uIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZUcmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB3ZSBvbmx5IHJldHVybiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzLgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSlNQQ29tcGxldGlvblByb3Bvc2FscwotCSAqLwotCXB1YmxpYyBKU1BDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gamF2YVByb3Bvc2FscyA9IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCS8vIG5lZWQgdG8gZmlsdGVyIG91dCBub24gSlNQQ29tcGxldGlvblByb3Bvc2FscwotCQkvLyBiZWNhdXNlIHRoZWlyIG9mZnNldHMgaGF2ZW4ndCBiZWVuIHRyYW5zbGF0ZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihqYXZhUHJvcG9zYWxzW2ldIGluc3RhbmNlb2YgSlNQQ29tcGxldGlvblByb3Bvc2FsKQotCQkJCXJlc3VsdHMuYWRkKGphdmFQcm9wb3NhbHNbaV0pOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0cywgZ2V0Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIChKU1BDb21wbGV0aW9uUHJvcG9zYWxbXSlyZXN1bHRzLnRvQXJyYXkobmV3IEpTUENvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYoZkNvbXBhcmF0b3IgPT0gbnVsbCkKLQkJCWZDb21wYXJhdG9yID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIGZDb21wYXJhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvOgotCSAqICAtIHRyYW5zbGF0ZSBKYXZhIC0+IEpTUCBvZmZzZXRzCi0JICogIC0gZml4IGN1cnNvci1wb3NpdGlvbi1hZnRlcgotCSAqICAtIGZpeCBtYW5nbGVkIHNlcnZsZXQgbmFtZSBpbiBkaXNwbGF5IHN0cmluZwotCSAqICAtIHJlbW92ZSB1bndhbnRlZCBwcm9wb3NhbHMgKHNlcnZsZXQgY29uc3RydWN0b3IpCi0JICovCi0JcHJvdGVjdGVkIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCQotCQlKU1BDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWwgPSBudWxsOwotCQkKLQkJLy8gaWdub3JlIGNvbnN0cnVjdG9yIHByb3Bvc2FscyAodGhleSdyZSBub3QgcmVsZXZhbnQgZm9yIG91ciBKU1AgcHJvcG9zYWwgbGlzdCkKLQkJaWYoIXByb3Bvc2FsLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCi0JCQlpZihwcm9wb3NhbC5nZXRLaW5kKCkgPT0gQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB7Ci0JCQkJU3RyaW5nIHNpZ25hdHVyZSA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpOwotCQkJCVN0cmluZyBjb21wbGV0aW9uID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLQkJCQlpZihjb21wbGV0aW9uLmluZGV4T2Yoc2lnbmF0dXJlKSAhPSAtMSkgewotCQkJCQlqc3BQcm9wb3NhbCA9IGNyZWF0ZUF1dG9JbXBvcnRQcm9wb3NhbChwcm9wb3NhbCk7CQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBkZWZhdWx0IGJlaGF2aW9yCi0JCQlpZihqc3BQcm9wb3NhbCA9PSBudWxsKQotCQkJCWpzcFByb3Bvc2FsID0gY3JlYXRlSnNwUHJvcG9zYWwocHJvcG9zYWwpOwkJCi0JCX0KLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQotCQotCQotCXByaXZhdGUgSlNQQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUF1dG9JbXBvcnRQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJCi0JCUpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbCA9IG51bGw7Ci0KLQkJU3RyaW5nIHNpZ25hdHVyZSA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSk7Ci0JCVN0cmluZyBjb21wbGV0aW9uID0gbmV3IFN0cmluZyhwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotCQkKLQkJLy8gaXQncyBmdWxseSBxdWFsaWZpZWQgc28gd2Ugc2hvdWxkCi0JCS8vIGFkZCBhbiBpbXBvcnQgc3RhdGVtZW50Ci0JCS8vIGNyZWF0ZSBhbiBhdXRvaW1wb3J0IHByb3Bvc2FsCi0JCVN0cmluZyBuZXdDb21wbGV0aW9uID0gY29tcGxldGlvbi5yZXBsYWNlQWxsKHNpZ25hdHVyZSArICIuIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCS8vIGphdmEgb2Zmc2V0Ci0JCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCWludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQ7Ci0JCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCW9mZnNldCA9IGZUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLQkJLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIocHJvcG9zYWwsIG5ld0NvbXBsZXRpb24sIG9mZnNldCk7Ci0JCQotCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gc3VwZXIuY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCk7Ci0JCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCk7Ci0JCUltYWdlIGltYWdlID0gamF2YVByb3Bvc2FsLmdldEltYWdlKCk7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJZGlzcGxheVN0cmluZyA9IGdldFRyYW5zbGF0aW9uKCkuZml4dXBNYW5nbGVkTmFtZShkaXNwbGF5U3RyaW5nKTsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCS8vIGRvbid0IGRvIHRoaXMsIGl0J3Mgc2xvdwotCQkvLyBTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotCQkKLQkJYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLQkJCi0JCWpzcFByb3Bvc2FsID0gbmV3IEF1dG9JbXBvcnRQcm9wb3NhbChjb21wbGV0aW9uLCBuZXdDb21wbGV0aW9uLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLQkJCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkJLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24gZGVtYW5kCi0JCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJCi0JCXJldHVybiBqc3BQcm9wb3NhbDsKLQl9Ci0KLQlwcml2YXRlIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKc3BQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJCi0JCUpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbDsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotCQkvLyBqYXZhIG9mZnNldAotCQlpbnQgb2Zmc2V0ID0gcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCk7Ci0JCS8vIHJlcGxhY2VtZW50IGxlbmd0aAotCQlpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0OwotCQkvLyB0cmFuc2xhdGUgb2Zmc2V0IGZyb20gSmF2YSA+IEpTUAotCQlvZmZzZXQgPSBmVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KG9mZnNldCk7Ci0JCS8vIGN1cnNvciBwb3NpdGlvbiBhZnRlciBtdXN0IGJlIGNhbGN1bGF0ZWQKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKHByb3Bvc2FsLCBjb21wbGV0aW9uLCBvZmZzZXQpOwotCQkKLQkJLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGphdmFQcm9wb3NhbC5nZXRJbWFnZSgpOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCWRpc3BsYXlTdHJpbmcgPSBnZXRUcmFuc2xhdGlvbigpLmZpeHVwTWFuZ2xlZE5hbWUoZGlzcGxheVN0cmluZyk7Ci0JCUlDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uID0gamF2YVByb3Bvc2FsLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQkvLyBTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotCQkKLQkJYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLQkJCi0JCWpzcFByb3Bvc2FsID0gbmV3IEpTUENvbXBsZXRpb25Qcm9wb3NhbChjb21wbGV0aW9uLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLQkJCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkJLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24gZGVtYW5kCi0JCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJCi0JCXJldHVybiBqc3BQcm9wb3NhbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWNsdWF0ZXMgdGhlIHdoZXJlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGFmdGVyIGFwcGx5aW5nIHRoaXMgcHJvcG9zYWwuCi0JICogZWcuIG1ldGhvZCh8KSBpZiB0aGUgbWV0aG9kIHByb3Bvc2FsIGNob3NlbiBoYWQgcGFyYW1zLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wb3NhbAotCSAqIEBwYXJhbSBjb21wbGV0aW9uCi0JICogQHBhcmFtIGN1cnJlbnRDdXJzb3JPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlUG9zaXRpb25BZnRlcihDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwsIFN0cmluZyBjb21wbGV0aW9uLCBpbnQgY3VycmVudEN1cnNvck9mZnNldCkgewotCQkvLyBjYWxjdWxhdGUgY3Vyc29yIHBvc2l0aW9uIGFmdGVyCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTgzOTgKLQkJLy9pbnQgcG9zaXRpb25BZnRlciA9IGN1cnJlbnRDdXJzb3JPZmZzZXQrY29tcGxldGlvbi5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjb21wbGV0aW9uLmxlbmd0aCgpOwotCQkKLQkJaW50IGtpbmQgPSBwcm9wb3NhbC5nZXRLaW5kKCk7Ci0JCQotCQkvLyBtYXkgbmVlZCBiZXR0ZXIgbG9naWMgaGVyZS4uLgotCQkvLyBwdXQgY3Vyc29yIGluc2lkZSBwYXJlbnRoZXNpcyBpZiB0aGVyZSdzIHBhcmFtcwotCQkvLyBvbmx5IGNoZWNraW5nIGZvciBhbnkga2luZCBvZiBkZWNsYXJhdGlvbgotCQlpZihraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLlBPVEVOVElBTF9NRVRIT0RfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikgewotCQkJU3RyaW5nW10gcGFyYW1zID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSk7Ci0JCQlpZihjb21wbGV0aW9uLmxlbmd0aCgpID4gMCAmJiBwYXJhbXMubGVuZ3RoID4gMCkKLQkJCQlwb3NpdGlvbkFmdGVyLS07Ci0JCX0KLQkJcmV0dXJuIHBvc2l0aW9uQWZ0ZXI7Ci0JfQotCQotCXN0YXRpYyBjaGFyW10gZ2V0VHlwZVRyaWdnZXJzKCkgewotCQlyZXR1cm4gVFlQRV9UUklHR0VSUzsKLQl9Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oKSB7Ci0JCXJldHVybiBmVHJhbnNsYXRpb247Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2EyMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgSlNQIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUgYnkKLSAqIHRoZSBKU1AgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIEpTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIGpzcCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIEpTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCVN0cmluZyBwcmVmaXggPSBleHRyYWN0UHJlZml4KHZpZXdlciwgb2Zmc2V0KTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0IC0gcHJlZml4Lmxlbmd0aCgpLCBwcmVmaXgubGVuZ3RoKCkpOwotCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCk7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0KLQkJLy8gbmFtZSBvZiB0aGUgc2VsZWN0aW9uIHZhcmlhYmxlcyB7bGluZSwgd29yZH1fc2VsZWN0aW9uCi0JCWNvbnRleHQuc2V0VmFyaWFibGUoInNlbGVjdGlvbiIsIHNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGVbXSB0ZW1wbGF0ZXMgPSBnZXRUZW1wbGF0ZXMoY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpOwotCi0JCUxpc3QgbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVzW2ldOwotCQkJdHJ5IHsKLQkJCQljb250ZXh0LmdldENvbnRleHRUeXBlKCkudmFsaWRhdGUodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJCX0KLQkJCWNhdGNoIChUZW1wbGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodGVtcGxhdGUubWF0Y2hlcyhwcmVmaXgsIGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKSkKLQkJCQltYXRjaGVzLmFkZChjcmVhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgKElSZWdpb24pIHJlZ2lvbiwgZ2V0UmVsZXZhbmNlKHRlbXBsYXRlLCBwcmVmaXgpKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KG1hdGNoZXMsIGZnUHJvcG9zYWxDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbWF0Y2hlcy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW21hdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbmNyZXRlIHRlbXBsYXRlIGNvbnRleHQgZm9yIHRoZSBnaXZlbiByZWdpb24gaW4gdGhlCi0JICogZG9jdW1lbnQuIFRoaXMgaW52b2x2ZXMgZmluZGluZyBvdXQgd2hpY2ggY29udGV4dCB0eXBlIGlzIHZhbGlkIGF0IHRoZQotCSAqIGdpdmVuIGxvY2F0aW9uLCBhbmQgdGhlbiBjcmVhdGluZyBhIGNvbnRleHQgb2YgdGhpcyB0eXBlLiBUaGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSA8Y29kZT5TbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQ8L2NvZGU+IGZvcgotCSAqIHRoZSBjb250ZXh0IHR5cGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBUaGlzIHRha2VzIHRoZSBvZmZzZXQgYXQgd2hpY2gKLQkgKiBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZCBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciBmb3Igd2hpY2ggdGhlIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gaW50byA8Y29kZT5kb2N1bWVudDwvY29kZT4gZm9yIHdoaWNoIHRoZQotCSAqICAgICAgICAgICAgY29udGV4dCBpcyBjcmVhdGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9mZnNldCB3aGVyZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZAotCSAqIEByZXR1cm4gYSB0ZW1wbGF0ZSBjb250ZXh0IHRoYXQgY2FuIGhhbmRsZSB0ZW1wbGF0ZSBpbnNlcnRpb24gYXQgdGhlCi0JICogICAgICAgICBnaXZlbiBsb2NhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlQ29udGV4dCBjcmVhdGVDb250ZXh0KElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJLy8gcHJldHR5IG11Y2ggc2FtZSBjb2RlIGFzIHN1cGVyLmNyZWF0ZUNvbnRleHQgZXhjZXB0IGNyZWF0ZQotCQkvLyBTbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IGdldENvbnRleHRUeXBlKHZpZXdlciwgcmVnaW9uKTsKLQkJaWYgKGNvbnRleHRUeXBlICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJcmV0dXJuIG5ldyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIGludCByZWxldmFuY2UpIHsKLQkJcmV0dXJuIG5ldyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGdldEltYWdlKHRlbXBsYXRlKSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZShJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uKSB7Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSA9IG51bGw7Ci0KLQkJQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJdHlwZSA9IHJlZ2lzdHJ5LmdldENvbnRleHRUeXBlKGZDb250ZXh0VHlwZUlkKTsKLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoVGVtcGxhdGUgdGVtcGxhdGUpIHsKLQkJLy8ganVzdCByZXR1cm4gdGhlIHNhbWUgaW1hZ2UgZm9yIG5vdwotCQlyZXR1cm4gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSlNQKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCX0KLQotCXZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJZkNvbnRleHRUeXBlSWQgPSBjb250ZXh0VHlwZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRiMjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXB1YmxpYyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IG9wZW5SZWdpb25zID0gb3Blbi5nZXRSZWdpb25zKCk7Ci0JCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCi0JCVN0cmluZyBjdXJyZW50VmFsdWUgPSBudWxsOwotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQljdXJyZW50VmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRUZXh0KCk7Ci0JCWVsc2UKLQkJCWN1cnJlbnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtYXRjaFN0cmluZyA9IG51bGw7Ci0JCS8vIGZpeHVwcwotCQlpbnQgc3RhcnQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJaW50IGxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCWlmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiBTdHJpbmdVdGlscy5zdHJpcChjdXJyZW50VmFsdWUpLmxlbmd0aCgpICYmIChjdXJyZW50VmFsdWUuc3RhcnRzV2l0aCgiXCIiKSB8fCBjdXJyZW50VmFsdWUuc3RhcnRzV2l0aCgiJyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygxLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJCXN0YXJ0Kys7Ci0JCQlsZW5ndGggPSBtYXRjaFN0cmluZy5sZW5ndGgoKTsKLQkJfSBlbHNlCi0JCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCWJvb2xlYW4gZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgIT0gbnVsbCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQlpZiAoZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQcm9wb3NhbHMoKS5jbGVhcigpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWFjcm9zKCkuY2xlYXIoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1MpKSB7Ci0JCQkJLy8gY2xhc3MgaXMgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBjbGFzc1Byb3Bvc2FscyA9IEphdmFUeXBlRmluZGVyLmdldENsYXNzUHJvcG9zYWxzKHJlc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQlpZiAoY2xhc3NQcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzUHJvcG9zYWxzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgY2xhc3NQcm9wb3NhbHNbal07Ci0JCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBwcm9wb3NhbC5nZXRRdWFsaWZpZWROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpIHx8IHByb3Bvc2FsLmdldFNob3J0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSkKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKSkgewotCQkJCS8vIHR5cGUgaXMgdGhlIG1vcmUgZ2VuZXJhbCB0eXBlIGZvciB0aGUgYmVhbgotCQkJCS8vIHdoaWNoIG1lYW5zIGl0IG1heSBiZSBhbiBpbnRlcmZhY2UKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHR5cGVQcm9wb3NhbHMgPSBKYXZhVHlwZUZpbmRlci5nZXRUeXBlUHJvcG9zYWxzKHJlc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQlpZiAodHlwZVByb3Bvc2FscyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdHlwZVByb3Bvc2Fscy5sZW5ndGg7IGorKykgewotCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIHR5cGVQcm9wb3NhbHNbal07Ci0JCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBwcm9wb3NhbC5nZXRRdWFsaWZpZWROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpIHx8IHByb3Bvc2FsLmdldFNob3J0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSkKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUFOX05BTUUpKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBiZWFuTmFtZVByb3Bvc2FscyA9IEphdmFUeXBlRmluZGVyLmdldEJlYW5Qcm9wb3NhbHMocmVzb3VyY2UsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCWlmIChiZWFuTmFtZVByb3Bvc2FscyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYmVhbk5hbWVQcm9wb3NhbHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChiZWFuTmFtZVByb3Bvc2Fsc1tqXSBpbnN0YW5jZW9mIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJCQkJCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSBiZWFuTmFtZVByb3Bvc2Fsc1tqXTsKLQkJCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9IGVsc2UgaWYgKGJlYW5OYW1lUHJvcG9zYWxzW2pdIGluc3RhbmNlb2YgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJCQkJCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgYmVhbk5hbWVQcm9wb3NhbHNbal07Ci0JCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0UXVhbGlmaWVkTmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSB8fCBwcm9wb3NhbC5nZXRTaG9ydE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcHJvamVjdCByZXF1ZXN0IGlzIGluCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgYmFzZWxvY2F0aW9uID0gbnVsbDsKLQotCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQliYXNlbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGJhc2Vsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBjb3BpZWQgZnJvbSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIjZ2V0SmF2YVByb2plY3QKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlbG9jYXRpb24pOwotCQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlmaWxlID0gcm9vdC5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJCX0KLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZSA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhUGFyYW1ldGVyTGlzdFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViMWY1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhUGFyYW1ldGVyTGlzdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci0KLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciwgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZlBvc2l0aW9uOwotICAgIHByaXZhdGUgSVRleHRWaWV3ZXIgZlZpZXdlcjsKLSAgICBwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb24gZkluZm9ybWF0aW9uOwotICAgIAotICAgIHByaXZhdGUgaW50IGZDdXJyZW50UGFyYW1ldGVyOwotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24sIElUZXh0Vmlld2VyLCBpbnQpCi0gICAgICogQHNlZSBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI2luc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiwgSVRleHRWaWV3ZXIsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotICAgICAgICBmUG9zaXRpb249IGRvY3VtZW50UG9zaXRpb247Ci0gICAgICAgIGZWaWV3ZXI9IHZpZXdlcjsKLSAgICAgICAgZkluZm9ybWF0aW9uPSBpbmZvOwotICAgICAgICAKLSAgICAgICAgZkN1cnJlbnRQYXJhbWV0ZXI9IC0xOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRDb21tZW50RW5kKElEb2N1bWVudCBkLCBpbnQgcG9zLCBpbnQgZW5kKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAocG9zIDwgZW5kKSB7Ci0gICAgICAgICAgICBjaGFyIGN1cnI9IGQuZ2V0Q2hhcihwb3MpOwotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICBpZiAoY3VyciA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zIDwgZW5kICYmIGQuZ2V0Q2hhcihwb3MpID09ICcvJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRTdHJpbmdFbmQoSURvY3VtZW50IGQsIGludCBwb3MsIGludCBlbmQsIGNoYXIgY2gpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChwb3MgPCBlbmQpIHsKLSAgICAgICAgICAgIGNoYXIgY3Vycj0gZC5nZXRDaGFyKHBvcyk7Ci0gICAgICAgICAgICBwb3MrKzsKLSAgICAgICAgICAgIGlmIChjdXJyID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnIgPT0gY2gpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldENoYXJDb3VudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGVuZCwgY2hhciBpbmNyZW1lbnQsIGNoYXIgZGVjcmVtZW50LCBib29sZWFuIGNvbnNpZGVyTmVzdGluZykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5pc1RydWUoKGluY3JlbWVudCAhPSAwIHx8IGRlY3JlbWVudCAhPSAwKSAmJiBpbmNyZW1lbnQgIT0gZGVjcmVtZW50KTsKLSAgICAgICAgCi0gICAgICAgIGludCBuZXN0aW5nTGV2ZWw9IDA7Ci0gICAgICAgIGludCBjaGFyQ291bnQ9IDA7Ci0gICAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgY2hhciBjdXJyPSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KyspOwotICAgICAgICAgICAgc3dpdGNoIChjdXJyKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnLyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0PSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ9IGdldENvbW1lbnRFbmQoZG9jdW1lbnQsIHN0YXJ0ICsgMSwgZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnLy8nLWNvbW1lbnQ6IG5vdGhpbmcgdG8gZG8gYW55bW9yZSBvbiB0aGlzIGxpbmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ9IGVuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICcqJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHQ9IGRvY3VtZW50LmdldENoYXIoc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBiZWVuIGluIGEgY29tbWVudDogZm9yZ2V0IHdoYXQgd2UgcmVhZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ291bnQ9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKysgc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICAgICAgICBzdGFydD0gZ2V0U3RyaW5nRW5kKGRvY3VtZW50LCBzdGFydCwgZW5kLCBjdXJyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlck5lc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcoJyA9PSBjdXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrIG5lc3RpbmdMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCcpJyA9PSBjdXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIG5lc3RpbmdMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXN0aW5nTGV2ZWwgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluY3JlbWVudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PSBpbmNyZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKysgY2hhckNvdW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoZGVjcmVtZW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09IGRlY3JlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBjaGFyQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNoYXJDb3VudDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2lzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50IHBvc2l0aW9uKSB7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gPCBmUG9zaXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50PSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBJUmVnaW9uIGxpbmU9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGZQb3NpdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGxpbmUuZ2V0T2Zmc2V0KCkgfHwgcG9zaXRpb24gPj0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIChnZXRDaGFyQ291bnQoZG9jdW1lbnQsIGZQb3NpdGlvbiwgcG9zaXRpb24sICcoJywgJyknLCBmYWxzZSkgPj0gMCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciN1cGRhdGVQcmVzZW50YXRpb24oaW50LCBUZXh0UHJlc2VudGF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVByZXNlbnRhdGlvbihpbnQgcG9zaXRpb24sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0gICAgICAgIAotICAgICAgICBpbnQgY3VycmVudFBhcmFtZXRlcj0gLTE7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgY3VycmVudFBhcmFtZXRlcj0gZ2V0Q2hhckNvdW50KGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgZlBvc2l0aW9uLCBwb3NpdGlvbiwgJywnLCAoY2hhcikgMCwgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGZDdXJyZW50UGFyYW1ldGVyICE9IC0xKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBhcmFtZXRlciA9PSBmQ3VycmVudFBhcmFtZXRlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByZXNlbnRhdGlvbi5jbGVhcigpOwotICAgICAgICBmQ3VycmVudFBhcmFtZXRlcj0gY3VycmVudFBhcmFtZXRlcjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzPSBmSW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCk7Ci0gICAgICAgIGludCBzdGFydD0gMDsKLSAgICAgICAgaW50IG9jY3VycmVuY2VzPSAwOwotICAgICAgICB3aGlsZSAob2NjdXJyZW5jZXMgPCBmQ3VycmVudFBhcmFtZXRlcikgewotICAgICAgICAgICAgaW50IGZvdW5kPSBzLmluZGV4T2YoJywnLCBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoZm91bmQgPT0gLTEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBzdGFydD0gZm91bmQgKyAxOwotICAgICAgICAgICAgKysgb2NjdXJyZW5jZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChvY2N1cnJlbmNlcyA8IGZDdXJyZW50UGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZSgwLCBzLmxlbmd0aCgpLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHN0YXJ0ID09IC0xKQotICAgICAgICAgICAgc3RhcnQ9IDA7Ci0gICAgICAgIAotICAgICAgICBpbnQgZW5kPSBzLmluZGV4T2YoJywnLCBzdGFydCk7Ci0gICAgICAgIGlmIChlbmQgPT0gLTEpCi0gICAgICAgICAgICBlbmQ9IHMubGVuZ3RoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHN0YXJ0ID4gMCkgIAotICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoMCwgc3RhcnQsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChlbmQgPiBzdGFydCkKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCwgbnVsbCwgbnVsbCwgU1dULkJPTEQpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChlbmQgPCBzLmxlbmd0aCgpKQotICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoZW5kLCBzLmxlbmd0aCgpIC0gZW5kLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI0ZGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJQ29tcGxldGlvblByb3Bvc2FsIHdob3NlIHZhbHVlcyBjYW4gYmUKLSAqIHJlYWQgYWZ0ZXIgY3JlYXRpb24uCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgZXh0ZW5kcyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCXByaXZhdGUgaW50IGZDdXJzb3JQb3NpdGlvbiA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxvY2FsRGlzcGxheVN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBmU2hvcnROYW1lOwotCXByaXZhdGUgU3RyaW5nIGZRdWFsaWZpZWROYW1lOwotCXByaXZhdGUgU3RyaW5nIGZDb250YWluZXJOYW1lOwotCi0JcHVibGljIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBxdWFsaWZpZWROYW1lLCBJbWFnZSBpbWFnZSwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgY29udGFpbmVyTmFtZSwgIGludCByZWxldmVuY2UsICBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBxdWFsaWZpZWROYW1lLmxlbmd0aCgpICsgMiwgaW1hZ2UsIAotICAgICAgICAgICAgICAgIChjb250YWluZXJOYW1lICE9IG51bGwgJiYgY29udGFpbmVyTmFtZS5sZW5ndGgoKSA+IDApID8gdHlwZU5hbWUgKyAiIC0gIiArIGNvbnRhaW5lck5hbWUgOiB0eXBlTmFtZSwgbnVsbCwgbnVsbCwgcmVsZXZlbmNlLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBDTVZDIDI0MzgxNywgc3VwZXJjbGFzcyB3YXMgY29tcGFyaW5nIGluY29ycmVjdCBkaXNwbGF5IHN0cmluZyBpbiB2YWxpZGF0ZSBtZXRob2QuLi4KLQkJLy9zdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBpbWFnZSwgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCAmJiBjb250YWluZXJOYW1lLmxlbmd0aCgpID4gMCk/IHR5cGVOYW1lICsgIiAtICIgKyBjb250YWluZXJOYW1lOnR5cGVOYW1lLypxdWFsaWZpZWROYW1lKi8sIHJlbGV2ZW5jZSk7Ci0JCWZTaG9ydE5hbWUgPSB0eXBlTmFtZTsKLQkJZlF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lOwotCQlmQ29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGZRdWFsaWZpZWROYW1lLmxlbmd0aCgpICsgMjsKLQkJLy9mUHJvcG9zYWxJbmZvID0gcHJvcG9zYWxJbmZvOwotCQlpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsICYmIGNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPiAwKQotCQkJZkxvY2FsRGlzcGxheVN0cmluZyA9IHR5cGVOYW1lICsgIiAtICIgKyBjb250YWluZXJOYW1lOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWZMb2NhbERpc3BsYXlTdHJpbmcgPSB0eXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBmTG9jYWxEaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ3Vyc29yUG9zaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCXN1cGVyLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJZkN1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gZlF1YWxpZmllZE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQkvLwkJU3RyaW5nIGluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCS8vCQlpZiAoaW5mbyA9PSBudWxsIHx8IGluZm8ubGVuZ3RoKCkgPT0gMCAmJiBmUHJvcG9zYWxJbmZvICE9IG51bGwpCi0JCS8vCQkJcmV0dXJuIGZQcm9wb3NhbEluZm8uZ2V0SW5mbygpOwotCQkvLwkJcmV0dXJuIGluZm87Ci0JCXJldHVybiBudWxsOyAvLyB1bmV4cGxhaW5lZCBOUEUKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIGZTaG9ydE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbXBvcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJU3RyaW5nIGltcG9ydFNwZWMgPSBudWxsOwotCQlib29sZWFuIGlzSW1wb3J0ID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfSU1QT1JUKSkgewotCQkJCQlpc0ltcG9ydCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpc0ltcG9ydCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGlzSW1wb3J0ICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWltcG9ydFNwZWMgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltcG9ydFNwZWM7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGltcG9ydCBwYWdlIGRpcmVjdGl2ZSBmb3IgdGhlIGN1cnJlbnQgdHlwZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGludCBhcHBseUltcG9ydChJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsKSB7Ci0JCS8vIGlmIHRoZSB0eXBlIGlzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2Ugb3IgamF2YS5sYW5nLCBza2lwIGl0Ci0JCWlmIChmQ29udGFpbmVyTmFtZSA9PSBudWxsIHx8IGZDb250YWluZXJOYW1lLmxlbmd0aCgpID09IDAgfHwgZkNvbnRhaW5lck5hbWUuZXF1YWxzKCJqYXZhLmxhbmciKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIDA7Ci0JCS8vIGNvbGxlY3QgcGFnZSBkaXJlY3RpdmVzIGFuZCBzdG9yZSB0aGVpciBpbXBvcnQgdmFsdWVzCi0JCUxpc3QgaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbW9kZWwuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkvLyB1c2UgdGhlIGxhc3QgcG9zaXRpb24gb2YgYSBwYWdlIGRpcmVjdGl2ZSBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdG8gYWRkCi0JCS8vIGEgbmV3IG9uZQotCQlpbnQgaGludCA9IDA7Ci0JCS8vIHdhdGNoIGZvciBqc3A6cm9vdCBzbyB0aGF0IHdlIHVzZSB0aGUgcmlnaHQgWE1ML0pTUCBmb3JtYXQgZm9yIHRoZSBkaXJlY3RpdmUKLQkJYm9vbGVhbiB1c2VYTUwgPSBmYWxzZTsKLQotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBDYW4ndCBqdXN0IGxvb2sgZm9yIGFsbCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHN0YXJ0aW5nIHdpdGggSlNQX0RJUkVDVElWRV9PUEVOCi0JCQkvLyBzaW5jZSB0aGUgWE1MIGZvcm0gaXMgcmVxdWlyZWQsIHRvbwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJLy8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIEpTUCBkaXJlY3RpdmUKLQkJCQlpZiAobmFtZS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCS8vIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSAqcGFnZSogZGlyZWN0aXZlCi0JCQkJCWlmIChub2RlLmdldFRleHQobmFtZSkuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QQUdFKSB8fCBub2RlLmdldFRleHQobmFtZSkuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKSkgewotCQkJCQkJaWYgKG5vZGUuZ2V0RW5kT2Zmc2V0KCkgPCBnZXRSZXBsYWNlbWVudE9mZnNldCgpKQotCQkJCQkJCWhpbnQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQkJU3RyaW5nIGltcG9ydFNwZWMgPSBnZXRJbXBvcnQobm9kZSk7Ci0JCQkJCQlpZiAoaW1wb3J0U3BlYyAhPSBudWxsKSB7Ci0JCQkJCQkJaW1wb3J0cy5hZGQoaW1wb3J0U3BlYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGlmIHRoaXMgaXMgYSBqc3A6cm9vdCB0YWcsIHVzZSB0aGUgWE1MIGZvcm0KLQkJCQkJdXNlWE1MID0gdXNlWE1MIHx8IG5hbWUuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCi0JCS8vIGV2YWx1YXRlIHJlcXVpcmVtZW50cyBmb3IgYSAibmV3IiBpbXBvcnQgZGlyZWN0aXZlCi0JCWJvb2xlYW4gbmVlZHNJbXBvcnQgPSAhaW1wb3J0SGFuZGxlcyhmUXVhbGlmaWVkTmFtZSwgaW1wb3J0cyk7Ci0JCWludCBhZGp1c3RtZW50TGVuZ3RoID0gMDsKLQkJLy8gaW5zZXJ0ICJuZXciIGltcG9ydCBkaXJlY3RpdmUKLQkJaWYgKG5lZWRzSW1wb3J0KSB7Ci0JCQlTdHJpbmcgZGlyZWN0aXZlID0gbnVsbDsKLQotCQkJLy8gdmFyeSB0aGUgWE1MIGJlaGF2aW9yCi0JCQlpZiAodXNlWE1MKSB7Ci0JCQkJZGlyZWN0aXZlID0gIjxqc3A6ZGlyZWN0aXZlLnBhZ2UgaW1wb3J0PVwiIiArIGZRdWFsaWZpZWROYW1lICsgIlwiLz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRpcmVjdGl2ZSA9ICI8JUAgcGFnZSBpbXBvcnQ9XCIiICsgZlF1YWxpZmllZE5hbWUgKyAiXCIgJT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmUgPSBtb2RlbC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChoaW50KTsKLQkJCQlib29sZWFuIHByZXBlbmROZXdMaW5lID0gbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkgPT0gaGludDsKLQkJCQlib29sZWFuIGFwcGVuZE5ld0xpbmUgPSBoaW50ID09IDA7Ci0JCQkJaWYgKHByZXBlbmROZXdMaW5lKQotCQkJCQlkaXJlY3RpdmUgPSBtb2RlbC5nZXRMaW5lRGVsaW1pdGVyKCkgKyBkaXJlY3RpdmU7Ci0JCQkJaWYgKGFwcGVuZE5ld0xpbmUpCi0JCQkJCWRpcmVjdGl2ZSA9IGRpcmVjdGl2ZSArIG1vZGVsLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCQlhZGp1c3RtZW50TGVuZ3RoID0gZGlyZWN0aXZlLmxlbmd0aCgpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQltb2RlbC5yZXBsYWNlKGhpbnQsIDAsIGRpcmVjdGl2ZSk7Ci0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gTm90IHRoYXQgd2Ugc2hvdWxkIGV2ZXIgZ2V0IGEgQkxFLCBidXQgaWYgc28sIG91cgotCQkJCS8vIHJlcGxhY2VtZW50IG9mZnNldCBmcm9tIHRoZSBDb250ZW50IEFzc2lzdCBjYWxsIHNob3VsZAotCQkJCS8vIHdvcmsKLQkJCQl0cnkgewotCQkJCQltb2RlbC5yZXBsYWNlKGdldFJlcGxhY2VtZW50T2Zmc2V0KCksIDAsIGRpcmVjdGl2ZSk7Ci0JCQkJCWFkanVzdG1lbnRMZW5ndGggPSBkaXJlY3RpdmUubGVuZ3RoKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMikgewotCQkJCQkvLyBub3cgd2hhdD8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkanVzdG1lbnRMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogU2VlIGlmIHRoZSBpbXBvcnQgc3BlY2lmaWNhdGlvbiBpcyBhIHdpbGRjYXJkIGltcG9ydCwgYW5kIGlmIHNvLCB0aGF0Ci0JICogaXQgYXBwbGllcyB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dpbGRjYXJkTWF0Y2goU3RyaW5nIGltcG9ydFNwZWMsIFN0cmluZyB0eXBlKSB7Ci0JCWludCBzcGVjTGVuZ3RoID0gaW1wb3J0U3BlYy5sZW5ndGgoKTsKLQkJaWYgKGltcG9ydFNwZWMuZW5kc1dpdGgoIioiKSAmJiBzcGVjTGVuZ3RoID4gMiAmJiB0eXBlLmxlbmd0aCgpID49IHNwZWNMZW5ndGgpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gcHVsbCBvdXQgdGhlIHBhY2thZ2UgbmFtZSBpbmNsdWRpbmcgdGhlIGZpbmFsICcuJwotCQkJU3RyaW5nIGNvbnRhaW5lciA9IGltcG9ydFNwZWMuc3Vic3RyaW5nKDAsIHNwZWNMZW5ndGggLSAxKTsKLQkJCS8vIHZlcmlmeSB0aGF0IHRoZSB0eXBlIGlzIGluIHRoZSBjb250YWluZXIncyBoaWVyYXJjaHkgYW5kIHRoYXQKLQkJCS8vIHRoZXJlIGFyZSBubyBvdGhlciBwYWNrYWdlIHNlcGFyYXRvcnMgYWZ0ZXJ3YXJkcwotCQkJaWYgKHR5cGUuc3RhcnRzV2l0aChjb250YWluZXIpICYmIHR5cGUuaW5kZXhPZignLicsIHNwZWNMZW5ndGggLSAxKSA8IDApIHsKLQkJCQkvLyBjb250YWluZXIgbWF0Y2hlcwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRIYW5kbGVzKFN0cmluZyB0eXBlLCBMaXN0IGxpc3RPZkltcG9ydHMpIHsKLQkJSXRlcmF0b3IgaW1wb3J0cyA9IGxpc3RPZkltcG9ydHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGltcG9ydHMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgaW1wb3J0U3BlYyA9IFN0cmluZ1V0aWxzLnN0cmlwKGltcG9ydHMubmV4dCgpLnRvU3RyaW5nKCkpOwotCQkJaWYgKGltcG9ydFNwZWMuZXF1YWxzKHR5cGUpIHx8IGlzV2lsZGNhcmRNYXRjaChpbXBvcnRTcGVjLCB0eXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLQkJLy8gSWYgd2UgaGF2ZSBhIHBhcnNlZCBJU3RydWN0dXJlZERvY3VtZW50LCBpbnNlcnQgdGhlIHNob3J0IG5hbWUgaW5zdGVhZCBvZiB0aGUKLQkJLy8gZnVsbHkgcXVhbGlmaWVkIG5hbWUgYW5kIGEgaW1wb3J0IHBhZ2UgZGlyZWN0aXZlIGlmCi0JCS8vIG5lZWRlZC4gIERvIHRoZSBpbXBvcnQgZmlyc3Qgc28gdGhlIGN1cnNvciBnb2VzIHRvIHRoZSByaWdodCBsb2NhdGlvbgotCQkvLyBhbmQgd2UgZG9uJ3Qgc3VycHJpc2UgdGhlIHVzZXIuCi0KLQkJYm9vbGVhbiBhZGRTaG9ydEZvcm0gPSBmYWxzZTsgLy9kb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZkNvbnRhaW5lck5hbWUgIT0gbnVsbCAmJiBmQ29udGFpbmVyTmFtZS5sZW5ndGgoKSA+IDA7Ci0JCWlmIChhZGRTaG9ydEZvcm0pIHsKLQkJCXNldFJlcGxhY2VtZW50U3RyaW5nKCciJyArIGZTaG9ydE5hbWUgKyAnIicpOwotCQkJaW50IGltcG9ydExlbmd0aCA9IGFwcGx5SW1wb3J0KChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCQlzZXRSZXBsYWNlbWVudE9mZnNldChnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgaW1wb3J0TGVuZ3RoKTsKLQkJfQotCi0JCXNldEN1cnNvclBvc2l0aW9uKGdldFJlcGxhY2VtZW50U3RyaW5nKCkubGVuZ3RoKCkpOwotCQlzdXBlci5hcHBseShkb2N1bWVudCwgdHJpZ2dlciwgb2Zmc2V0KTsKLQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjEjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJLy8gQ01WQyAyNDM4MTUKLQkJLy8gKHBhKSB0aGlzIGlzIG92ZXJyaWRkZW4gdG8gZ2V0IGFyb3VuZCByZXBsYWNlbWVudCBsZW5ndGggbW9kaWZpY2F0aW9uCi0JCS8vIHdoaWNoIGlzIGRvbmUgaW4gdGhlIHN1cGVyIChzaW5jZSBlY2xpcHNlIDIuMSkKLQkJYXBwbHkodmlld2VyLmdldERvY3VtZW50KCksIHRyaWdnZXIsIG9mZnNldCk7Ci0JfQotCi0JLy8gY29kZSBpcyBib3Jyb3dlZCBmcm9tIEphdmFDb21wbGV0aW9uUHJvcG9zYWwKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydHNXaXRoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgU3RyaW5nIHdvcmQpIHsKLQkJaW50IHdvcmRMZW5ndGggPSB3b3JkID09IG51bGwgPyAwIDogd29yZC5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyB3b3JkTGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlpbnQgbGVuZ3RoID0gb2Zmc2V0IC0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKTsKLQkJCS8vIENNVkMgMjQzODE3Ci0JCQkvLyBzbGlnaHRseSBtb2RpZmllZCB0byBiZSBhIGxpdHRsZSBtb3JlIGZsZXhpYmxlIGZvciBhdHRyaWJ1dGUgdmFsdWUgc3RyaW5nIG1hdGNoaW5nLi4KLQkJCVN0cmluZyBzdGFydCA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGRvY3VtZW50LmdldChnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBsZW5ndGgpKTsKLQkJCXJldHVybiB3b3JkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChzdGFydC50b0xvd2VyQ2FzZSgpKSB8fCBmUXVhbGlmaWVkTmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoc3RhcnQudG9Mb3dlckNhc2UoKSk7Ci0JCQkvL3JldHVybiB3b3JkLnN1YnN0cmluZygwLCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RhcnQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWwjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAvLwkgKi8KLQkvLwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCBldmVudCkgewotCS8vCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUoZG9jdW1lbnQsIG9mZnNldCwgZXZlbnQpOwotCS8vCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWwjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQkJLy8gKHBhKSB3ZSBjdXJyZW50bHkgZG9uJ3QgdXNlIHNtYXJ0IHRvZ2dsZS4uLgotCQlzdXBlci5zZWxlY3RlZCh2aWV3ZXIsIGZhbHNlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxMjBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFUeXBlRmluZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEJlYW5Qcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSB0eXBlUHJvcG9zYWxzID0gZ2V0VHlwZVByb3Bvc2FscyhyZXNvdXJjZSwgcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gc2VyaWFsUHJvcG9zYWxzID0gZ2V0U2VyaWFsaXplZFByb3Bvc2FscyhyZXNvdXJjZSwgcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYmVhblByb3Bvc2FscyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3R5cGVQcm9wb3NhbHMubGVuZ3RoICsgc2VyaWFsUHJvcG9zYWxzLmxlbmd0aF07Ci0KLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzZXJpYWxQcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWJlYW5Qcm9wb3NhbHNbaV0gPSBzZXJpYWxQcm9wb3NhbHNbaV07Ci0JCX0KLQkJZm9yIChpID0gc2VyaWFsUHJvcG9zYWxzLmxlbmd0aDsgaSA8IHNlcmlhbFByb3Bvc2Fscy5sZW5ndGggKyB0eXBlUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQliZWFuUHJvcG9zYWxzW2ldID0gdHlwZVByb3Bvc2Fsc1tpIC0gc2VyaWFsUHJvcG9zYWxzLmxlbmd0aF07Ci0JCX0KLQkJcmV0dXJuIGJlYW5Qcm9wb3NhbHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRNZW1iZXJzKElDb250YWluZXIgY29udGFpbmVyLCBMaXN0IG1lbWJlcnNMaXN0KSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnModHJ1ZSk7Ci0JCQlpZiAobWVtYmVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtZW1iZXJzW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJCW1lbWJlcnNMaXN0LmFkZChtZW1iZXJzW2ldKTsKLQkJCQkJZWxzZSBpZiAobWVtYmVyc1tpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQkJCWdldE1lbWJlcnMoKElDb250YWluZXIpIG1lbWJlcnNbaV0sIG1lbWJlcnNMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFNlcmlhbGl6ZWRQcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRNZW1iZXJzKHJlc291cmNlLmdldFByb2plY3QoKSwgcmVzb3VyY2VzKTsKLQkJSVJlc291cmNlIG1lbWJlclJlc291cmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCW1lbWJlclJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChtZW1iZXJSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgbWVtYmVyUmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuc2VyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShtZW1iZXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQluYW1lcy5hZGQobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgcGF0aCArICJcIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlyZXBsYWNlbWVudFN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgcGF0aC5sZW5ndGgoKSArIDIsIG51bGwsIHBhdGgsIG51bGwsIG51bGwsIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBuYW1lcy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW25hbWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIHJlcGxhY2VtZW50U3RhcnQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gc2VhcmNoRm9yIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBmaW5kUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgaW50IHNlYXJjaEZvciwgYm9vbGVhbiBpZ25vcmVBYnN0cmFjdENsYXNzZXMpIHsKLQotCQlKYXZhVHlwZU5hbWVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEphdmFUeXBlTmFtZVJlcXVlc3RvcigpOwotCQlyZXF1ZXN0b3Iuc2V0SlNQT2Zmc2V0KHJlcGxhY2VtZW50U3RhcnQpOwotCQlyZXF1ZXN0b3Iuc2V0UmVwbGFjZW1lbnRMZW5ndGgocmVwbGFjZW1lbnRMZW5ndGgpOwotCQlyZXF1ZXN0b3Iuc2V0SWdub3JlQWJzdHJhY3RDbGFzc2VzKGlnbm9yZUFic3RyYWN0Q2xhc3Nlcyk7Ci0KLQkJdHJ5IHsKLQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtde2dldEphdmFQcm9qZWN0KHJlc291cmNlKX07Ci0JCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsIG51bGwsIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIIHwgU2VhcmNoUGF0dGVybi5SX1BSRUZJWF9NQVRDSCwgc2VhcmNoRm9yLCBzY29wZSwgcmVxdWVzdG9yLCBJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbCk7Ci0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgeyAKLQkJCS8vIEphdmFNb2RlbAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGMpOwotCQl9Ci0JCXJldHVybiByZXF1ZXN0b3IuZ2V0UHJvcG9zYWxzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VHlwZVByb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJcmV0dXJuIGZpbmRQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldENsYXNzUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlyZXR1cm4gZmluZFByb3Bvc2FscyhyZXNvdXJjZSwgcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlQcm9qZWN0IHByb2ogPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qKTsKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZU5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlTmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjU0ZDE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlTmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlR5cGVOYW1lUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmNvbW1vbi5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci0KLS8qKgotICogVXNlIHcvIEpEVCBzZWFyY2ggZW5naW5lIHRvIGZpbmQgYWxsIHR5cGUgbmFtZXMuCi0gKiBDcmVhdGVzIHByb3Bvc2FscyBmcm9tIG1hdGNoZXMgcmVwb3J0ZWQuCi0gKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZU5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBUeXBlTmFtZVJlcXVlc3RvciB7Ci0JCi0JcHJpdmF0ZSBpbnQgZkpTUE9mZnNldCA9IC0xOwotCXByaXZhdGUgaW50IGZSZXBsYWNlbWVudExlbmd0aCA9IC0xOwotCXByaXZhdGUgTGlzdCBmUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQWJzdHJhY3RDbGFzc2VzID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBDb21wbGV0aW9uUHJvcG9zYWxMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbExhYmVsUHJvdmlkZXIoKTsKLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoKSB7Ci0KLSAgICAgICAgaW50IG9mZnNldCA9IGdldEpTUE9mZnNldCgpOwotICAgICAgICBpbnQgbGVuZ3RoID0gZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJCi0JCS8vIHNvbWVob3cgb2Zmc2V0IG9yIGxlbmd0aCB3YXMgc2V0IGluY29ycmVjdGx5Ci0JCWlmKG9mZnNldCA9PSAtMSB8fCBsZW5ndGggPT0gLTEpCi0JCQlyZXR1cm47Ci0JCS8vIGlnbm9yZSBhYnN0cmFjdCBjbGFzc2VzPwotCQlpZihpZ25vcmVBYnN0cmFjdENsYXNzZXMoKSAmJiBGbGFncy5pc0Fic3RyYWN0KG1vZGlmaWVycykpCi0JCQlyZXR1cm47Ci0JCQotCQlJbWFnZSBpbWFnZSA9IGNhbGN1bGF0ZUltYWdlKG1vZGlmaWVycyk7Ci0JCQotICAgICAgICBTdHJpbmcgY29udGFpbmVyTmFtZVN0cmluZyA9IG5ldyBTdHJpbmcocGFja2FnZU5hbWUpOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWVTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihzaW1wbGVUeXBlTmFtZSk7Ci0JCQkKLSAgICAgICAgLy8gY29udGFpbmVybmFtZSBjYW4gYmUgbnVsbAotICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBjb25jYXRlbmF0ZU5hbWUoY29udGFpbmVyTmFtZVN0cmluZywgdHlwZU5hbWVTdHJpbmcpOwotCi0gICAgICAgIFN0cmluZyBzaW1wbGVOYW1lID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUoZnVsbE5hbWUpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzaW1wbGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIHR5cGVRdWFsaWZpZXIgPSBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKGZ1bGxOYW1lKTsKLSAgICAgICAgaWYgKHR5cGVRdWFsaWZpZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCIgLSAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnVmLmFwcGVuZCh0eXBlUXVhbGlmaWVyKTsKLSAgICAgICAgfQotCQkKLSAgICAgICAgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoZnVsbE5hbWUsIG9mZnNldCwgbGVuZ3RoLCBmdWxsTmFtZSwgaW1hZ2UsIHR5cGVOYW1lU3RyaW5nLCB0eXBlUXVhbGlmaWVyLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSwgdHJ1ZSk7Ci0gICAgICAgIHByb3Bvc2FsLnNldFRyaWdnZXJDaGFyYWN0ZXJzKEpTUFByb3Bvc2FsQ29sbGVjdG9yLmdldFR5cGVUcmlnZ2VycygpKTsKLQkJZlByb3Bvc2Fscy5hZGQocHJvcG9zYWwpOwotCX0KLQotCi0JcHJpdmF0ZSBJbWFnZSBjYWxjdWxhdGVJbWFnZShpbnQgbW9kaWZpZXJzKSB7Ci0JCUNvbXBsZXRpb25Qcm9wb3NhbCBwID0gQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIGdldEpTUE9mZnNldCgpKTsKLQkJcC5zZXRGbGFncyhtb2RpZmllcnMpOwotCQkKLQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMjA2Ci0JCWNoYXJbXSBzaWcgPSBuZXcgY2hhcltde1NpZ25hdHVyZS5DX1VOUkVTT0xWRUR9OwotCQlwLnNldFNpZ25hdHVyZShzaWcpOwotCQkKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBmTGFiZWxQcm92aWRlci5jcmVhdGVJbWFnZURlc2NyaXB0b3IocCk7Ci0JCUltYWdlIGltYWdlID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShkZXNjcmlwdG9yKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBDb25jYXRlbmF0ZXMgdHdvIG5hbWVzLiBVc2VzIGEgZG90IGZvciBzZXBhcmF0aW9uLiBCb3RoIHN0cmluZ3MgY2FuIGJlCi0gICAgICogZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb25jYXRlbmF0ZU5hbWUoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKG5hbWUxICE9IG51bGwgJiYgbmFtZTEubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZTIgIT0gbnVsbCAmJiBuYW1lMi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnLicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lMik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQkKLQlpbnQgZ2V0SlNQT2Zmc2V0KCkgewotCQlyZXR1cm4gZkpTUE9mZnNldDsKLQl9Ci0KLQl2b2lkIHNldEpTUE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWZKU1BPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JaW50IGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgewotCQlyZXR1cm4gZlJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCWZSZXBsYWNlbWVudExlbmd0aCA9IHJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQl2b2lkIHNldElnbm9yZUFic3RyYWN0Q2xhc3Nlcyhib29sZWFuIGlnbm9yZSkgewotCQlmSWdub3JlQWJzdHJhY3RDbGFzc2VzID0gaWdub3JlOwotCX0KLQlib29sZWFuIGlnbm9yZUFic3RyYWN0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIGZJZ25vcmVBYnN0cmFjdENsYXNzZXM7Ci0JfQotCQotCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKCkgewotCQlyZXR1cm4gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsW10pZlByb3Bvc2Fscy50b0FycmF5KG5ldyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbFtmUHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjI5MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQIGV4dGVuZHMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZKU1BDb250ZXh0cyA9IG51bGw7Ci0KLQlwdWJsaWMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQKCkgewotCQlzdXBlcigpOwotCQlpbml0SlNQQ29udGV4dHMoKTsKLQl9Ci0KLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCNpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJc3VwZXIuaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCi0JCS8vIEpTUAotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUiwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc3BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSwganNwSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpIHsKLQkJc3VwZXIuaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCQlKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwUHJvcGVydHlDQVAgPSBuZXcgSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZE5hbWVQcm9jZXNzb3IoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFksIGpzcFByb3BlcnR5Q0FQKTsKLQkJYWRkTmFtZVByb2Nlc3NvcihKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlhZGROYW1lUHJvY2Vzc29yKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4sIG5ldyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEpTUENvbnRleHRzKCkgewotCQlmSlNQQ29udGV4dHMgPSBuZXcgU3RyaW5nW117RE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4sIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4sIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTn07Ci0JfQotCi0JLyoqCi0JICogUXVpY2sgY2hlY2sgdG8gc2VlIGlmIGNvbnRleHQgKFN0cmluZykgc2hvdWxkIG1hcCB0bwotCSAqIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcmV0dXJuIGlmIGl0J3MgYSBKU1AgUmVnaW9uIChmb3Igd2hpY2ggd2UgbmVlZCBKU1AgQ29udGVudCBhc3Npc3QpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBzZFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkpTUENvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBmSlNQQ29udGV4dHNbaV0pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IHN1cGVyLmd1ZXNzQ29udGVudEFzc2lzdFByb2Nlc3Nvcih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdmlld2VyLmdldERvY3VtZW50KCkpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50T2Zmc2V0KTsKLQkJCWlmIChpc0pTUFJlZ2lvbihzZFJlZ2lvbikpCi0JCQkJcCA9IGdldFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGU5ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotCi0vKioKLSAqIEp1c3QgbGlrZSBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCBleGNlcHQgaWYgYW4gaW5zZXJ0IG9mZnNldCBpcyBwYXNzZWQgaW4sCi0gKiBkdXJpbmcgZXZhbHVhdGlvbiwgdGhlICJwcmVmaXgiIGJlZm9yZSB0aGUgdGVtcGxhdGUgd2lsbCBiZSBjaGVja2VkIHRvIHNlZQotICogaWYgaXQgbWF0Y2hlcyB0aGUgdGVtcGxhdGUgbmFtZS4gSWYgc28sIG92ZXJ3cml0ZSB0aGUgdGVtcGxhdGUgbmFtZS4KLSAqIE90aGVyd2lzZSwganVzdCBpbnNlcnQgdGhlIHRlbXBsYXRlIGF0IHRoZSBpbnNlcnQgb2Zmc2V0IGxvY2F0aW9uIChieSBub3QKLSAqIG92ZXJ3cml0aW5nIHRoZSBwcmVmaXggdGV4dCkKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0IGV4dGVuZHMgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgewotCXByaXZhdGUgaW50IGZJbnNlcnRPZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuIFRoZSBzdXBwbGllZCA8Y29kZT5Qb3NpdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHF1ZXJpZWQgdG8gY29tcHV0ZSB0aGUgPGNvZGU+Z2V0U3RhcnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmdldEVuZDwvY29kZT4gbWV0aG9kcywgd2hpY2ggd2lsbCB0aGVyZWZvcmUgYW5zd2VyIHVwZGF0ZWQKLQkgKiBwb3NpdGlvbiBkYXRhIGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGRlc2NyaWJpbmcgdGhlIGFyZWEgb2YgdGhlIGRvY3VtZW50IHdoaWNoIGZvcm1zCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgY29udGV4dAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXN1cGVyKHR5cGUsIGRvY3VtZW50LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBpbnNlcnRPZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbiB3aGVyZSBpbnNlcnQgd2FzCi0JICogICAgICAgICAgICBvcmlnaW5hbGx5IHJlcXVlc3RlZAotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGluc2VydE9mZnNldCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQkJZkluc2VydE9mZnNldCA9IGluc2VydE9mZnNldDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0I2V2YWx1YXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlKQotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZUJ1ZmZlciBldmFsdWF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBUZW1wbGF0ZUV4Y2VwdGlvbiB7Ci0JCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IHN1cGVyLmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAoZkluc2VydE9mZnNldCA+IC0xICYmIGZJbnNlcnRPZmZzZXQgPiBnZXRTdGFydCgpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldERvY3VtZW50KCkuZ2V0KGdldFN0YXJ0KCksIGZJbnNlcnRPZmZzZXQgLSBnZXRTdGFydCgpKTsKLQkJCQlpZiAoIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgYSBuZXcgYnVmZmVyIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlCi0JCQkJCS8vIHRleHQgdGhhdCB3YXMgZ29pbmcgdG8gYmUgb3ZlcndyaXR0ZW4KLQkJCQkJYnVmZmVyID0gbmV3IFRlbXBsYXRlQnVmZmVyKHByZWZpeCArIGJ1ZmZlci5nZXRTdHJpbmcoKSwgYnVmZmVyLmdldFZhcmlhYmxlcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0pTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhNDE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci0KLS8qKgotICogSlNQIEZyYWdtZW50IFByb3BlcnR5IFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTk9ORSA9IEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCi0JLy8gVE9ETzogRmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggdGhlc2Ugc3RyaW5ncy92YXJpYWJsZXMKLQlwcml2YXRlIFN0cmluZ1tdIGZMYW5ndWFnZXMgPSB7U0VMRUNUX05PTkUsICJqYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0In07IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZ1tdIGZDb250ZW50VHlwZXMgPSB7U0VMRUNUX05PTkUsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJImFwcGxpY2F0aW9uL3htbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkidGV4dC9odG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L3htbCIsICAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvY3NzIn07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgY2xhc3MgQnV0dG9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJYm9vbGVhbiBzcGVjaWZpYyA9IGZTcGVjaWZpY1NldHRpbmcuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl1cGRhdGVCdXR0b25zKHNwZWNpZmljKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tYm8gZkxhbmd1YWdlQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBmQ29udGVudFR5cGVDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBmVmFsaWRhdGVGcmFnbWVudHM7Ci0JQnV0dG9uIGZTcGVjaWZpY1NldHRpbmc7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmU3BlY2lmaWNMaXN0ZW5lcjsKLQotCXB1YmxpYyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwcm9wZXJ0eVBhZ2UgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQotCQkvLyBmcmFnbWVudCBsYW5ndWFnZSBjb250cm9sCi0JCVRleHQgbGFuZ3VhZ2VMYWJlbCA9IG5ldyBUZXh0KHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCWxhbmd1YWdlTGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMik7Ci0JCWZMYW5ndWFnZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZkxhbmd1YWdlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZkxhbmd1YWdlQ29tYm8uc2V0SXRlbXMoZkxhbmd1YWdlcyk7Ci0KLQkJLy8gZnJhZ21lbnQgY29udGVudCB0eXBlIGNvbnRyb2wKLQkJVGV4dCBjb250ZW50VHlwZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJY29udGVudFR5cGVMYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zKTsKLQkJZkNvbnRlbnRUeXBlQ29tYm8gPSBuZXcgQ29tYm8ocHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmQ29udGVudFR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmQ29udGVudFR5cGVDb21iby5zZXRJdGVtcyhmQ29udGVudFR5cGVzKTsKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIHNwZWNpZmljIHNldHRpbmcKLQkJZlNwZWNpZmljU2V0dGluZyA9IG5ldyBCdXR0b24ocHJvcGVydHlQYWdlLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JCWZTcGVjaWZpY1NldHRpbmcuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfNCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlNwZWNpZmljU2V0dGluZy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZTcGVjaWZpY0xpc3RlbmVyID0gbmV3IEJ1dHRvbkxpc3RlbmVyKCk7Ci0JCWZTcGVjaWZpY1NldHRpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZlNwZWNpZmljTGlzdGVuZXIpOwotCi0JCS8vIHZhbGlkYXRlIGZpbGUKLQkJZlZhbGlkYXRlRnJhZ21lbnRzID0gbmV3IEJ1dHRvbihwcm9wZXJ0eVBhZ2UsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLkpTUF9GUkFHTUVOVF9IRUxQSUQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCXZvaWQgdXBkYXRlQnV0dG9ucyhib29sZWFuIGVuYWJsZWQpIHsKLQkJZlNwZWNpZmljU2V0dGluZy5zZXRTZWxlY3Rpb24oZW5hYmxlZCk7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKGxhbmd1YWdlID09IG51bGwgfHwgbGFuZ3VhZ2UubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gaWYgbnVsbCwgdXNlIG5vbmUKLQkJCWxhbmd1YWdlID0gU0VMRUNUX05PTkU7Ci0JCX0KLQkJLyoKLQkJICogSWYgaXRlbSBpcyBhbHJlYWR5IHBhcnQgb2YgY29tYm8sIHNlbGVjdCBpdC4gT3RoZXJ3aXNlLCBhZGQgdG8gdGhlCi0JCSAqIGNvbWJvYm94LgotCQkgKi8KLQkJaW50IGluZGV4ID0gZkxhbmd1YWdlQ29tYm8uaW5kZXhPZihsYW5ndWFnZSk7Ci0JCWlmIChpbmRleCA+IC0xKQotCQkJZkxhbmd1YWdlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQkJZWxzZQotCQkJZkxhbmd1YWdlQ29tYm8uc2V0VGV4dChsYW5ndWFnZSk7Ci0KLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZ2V0UmVzb3VyY2UoKSwgZmFsc2UpOwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkvLyBpZiBudWxsLCB1c2Ugbm9uZQotCQkJY29udGVudFR5cGUgPSBTRUxFQ1RfTk9ORTsKLQkJfQotCQkvKgotCQkgKiBJZiBpdGVtIGlzIGFscmVhZHkgcGFydCBvZiBjb21ibywgc2VsZWN0IGl0LiBPdGhlcndpc2UsIGFkZCB0byB0aGUKLQkJICogY29tYm9ib3guCi0JCSAqLwotCQlpbmRleCA9IGZDb250ZW50VHlwZUNvbWJvLmluZGV4T2YoY29udGVudFR5cGUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZDb250ZW50VHlwZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCWVsc2UKLQkJCWZDb250ZW50VHlwZUNvbWJvLnNldFRleHQoY29udGVudFR5cGUpOwotCi0JCVN0cmluZyB2YWxpZGF0ZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuVkFMSURBVEVfRlJBR01FTlRTLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCVN0cmluZyB2YWxpZGF0ZTIgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZ2V0UmVzb3VyY2UoKSwgdHJ1ZSk7Ci0JCWlmICh2YWxpZGF0ZSA9PSBudWxsIHx8IHZhbGlkYXRlLmxlbmd0aCgpID09IDApIHsKLQkJCXVwZGF0ZUJ1dHRvbnMoZmFsc2UpOwotCQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldFNlbGVjdGlvbihCb29sZWFuLnZhbHVlT2YodmFsaWRhdGUyKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVCdXR0b25zKHRydWUpOwotCQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldFNlbGVjdGlvbihCb29sZWFuLnZhbHVlT2YodmFsaWRhdGUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaW50IGluZGV4ID0gZkxhbmd1YWdlQ29tYm8uaW5kZXhPZihTRUxFQ1RfTk9ORSk7Ci0JCWlmIChpbmRleCA+IC0xKQotCQkJZkxhbmd1YWdlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQlpbmRleCA9IGZDb250ZW50VHlwZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZDb250ZW50VHlwZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJdXBkYXRlQnV0dG9ucyhmYWxzZSk7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQl0cnkgewotCQkJLy8gc2F2ZSB0aGUgZnJhZ21lbnQgbGFuZ3VhZ2UKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGZMYW5ndWFnZUNvbWJvLmdldFRleHQoKTsKLQkJCWlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlLmxlbmd0aCgpID09IDAgfHwgbGFuZ3VhZ2UuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1RfTk9ORSkpIHsKLQkJCQkvLyBpZiBub25lLCB1c2UgbnVsbAotCQkJCWxhbmd1YWdlID0gbnVsbDsKLQkJCX0KLQkJCUpTUEZDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGdldFJlc291cmNlKCksIGxhbmd1YWdlKTsKLQotCQkJLy8gc2F2ZSBmcmFnbWVudCBjb250ZW50IHR5cGUKLQkJCVN0cmluZyBjb250ZW50VHlwZSA9IGZDb250ZW50VHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IGNvbnRlbnRUeXBlLmxlbmd0aCgpID09IDAgfHwgY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1RfTk9ORSkpIHsKLQkJCQkvLyBpZiBub25lLCB1c2UgbnVsbAotCQkJCWNvbnRlbnRUeXBlID0gbnVsbDsKLQkJCX0KLQkJCUpTUEZDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIGdldFJlc291cmNlKCksIGNvbnRlbnRUeXBlKTsKLQotCQkJU3RyaW5nIHZhbGlkYXRlID0gbnVsbDsKLQkJCWlmIChmU3BlY2lmaWNTZXR0aW5nLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJdmFsaWRhdGUgPSBCb29sZWFuLnRvU3RyaW5nKGZWYWxpZGF0ZUZyYWdtZW50cy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQlKU1BGQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZ2V0UmVzb3VyY2UoKSwgdmFsaWRhdGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG1heWJlIGluIGZ1dHVyZSwgbGV0IHVzZXIga25vdyB0aGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZyBmaWxlCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5NzZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSB7Ci0JcHVibGljIFByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLlByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5OGUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuamF2YWRvYy5TaW5nbGVDaGFyUmVhZGVyLgotICogTW9kaWZpY2F0aW9uIHdhcyBtYWRlIHRvIGZpeCBzdGF0ZW1lbnQgdW5uZWNlc3NhcmlseSBuZXN0ZWQgd2l0aGluIGVsc2UKLSAqIGNsYXVzZSB3YXJuaW5nIGluIHJlYWQoLi4pLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50IGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCXdoaWxlICgoY2ggPSByZWFkKCkpICE9IC0xKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0YWY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLklBY3Rpb25Db25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5JQWN0aW9uRGVmaW5pdGlvbklkc0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQWN0aW9uQ29udHJpYnV0b3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBBY3Rpb25Db250cmlidXRvckpTUAotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckpTUCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9ySFRNTCB7Ci0KLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiByZW5hbWVFbGVtZW50QWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBtb3ZlRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJTWVudU1hbmFnZXIgcmVmYWN0b3JNZW51ID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgQWN0aW9uQ29udHJpYnV0b3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gSlNQVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgSUFjdGlvbkNvbnN0YW50c0pTUC5BQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRPVCk7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUFjdGlvbkRlZmluaXRpb25JZHNKU1AuUkVOQU1FX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkpTUF9SRUZBQ1RPUlJFTkFNRV9IRUxQSUQpOwotCi0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgSUFjdGlvbkNvbnN0YW50c0pTUC5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5NT1ZFX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24sIElIZWxwQ29udGV4dElkcy5KU1BfUkVGQUNUT1JNT1ZFX0hFTFBJRCk7Ci0KLQkJLy8gdGhlIHJlZmFjdG9yIG1lbnUsIGFkZCB0aGUgbWVudSBpdHNlbGYgdG8gYWRkIGFsbCByZWZhY3RvciBhY3Rpb25zCi0JCXRoaXMucmVmYWN0b3JNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKEpTUFVJTWVzc2FnZXMuQWN0aW9uQ29udHJpYnV0b3JKU1BfMCwgUmVmYWN0b3JBY3Rpb25Hcm91cC5NRU5VX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbik7Ci0JCXJlZmFjdG9yTWVudS5hZGQodGhpcy5tb3ZlRWxlbWVudEFjdGlvbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5hZGRUb01lbnUobWVudSk7Ci0KLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgdGhpcy5yZWZhY3Rvck1lbnUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCi0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQpKTsKLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKGdldFRleHRFZGl0b3IoZ2V0QWN0aXZlRWRpdG9yUGFydCgpKSwgSUFjdGlvbkNvbnN0YW50c0pTUC5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlYzU5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIEpTUCBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKU1BVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gSlNQIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCArIl9zb3VyY2VfSGVscElkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSlNQIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNTAiOyAvLyROT04tTkxTLTEkCi0JLy8gSlNQIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA1MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDUyIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyBKU1AgRnJhZ21lbnQgUHJvcGVydHkgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9GUkFHTUVOVF9IRUxQSUQgPSBQUkVGSVggKyAianNwZjEwMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBKU1AgU291cmNlIEVkaXRvciBDb250ZXh0IE1lbnUKLQkvLyBSZWZhY3RvciBSZW5hbWUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUkVGQUNUT1JSRU5BTUVfSEVMUElEID0gUFJFRklYICsgImpzcHIwMDEwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gUmVmYWN0b3IgTW92ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9SRUZBQ1RPUk1PVkVfSEVMUElEID0gUFJFRklYICsgImpzcHIwMDIwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSlNQIE5ldyBGaWxlIFdpemFyZCAtIFRlbXBsYXRlIFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCA9IFBSRUZJWCArICJqc3B3MDAxMCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTliOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gSlNQVUlQbHVnaW4uSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLSAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgSW1hZ2UgYXNzb2NpYXRlZCB3aXRoIEltYWdlRGVzY3JpcHRvciBmcm9tIHRoZSBpbWFnZQotICAgICAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBJbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBpdCBpcyBjcmVhdGVkCi0gICAgICogZnJvbSB0aGUgSW1hZ2VEZXNjcmlwdG9yCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gSW1hZ2UgdGhlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSW1hZ2VEZXNjcmlwdG9yIG9yCi0gICAgICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotICAgICAgICAgICAgZGVzY3JpcHRvcj0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICBJbWFnZSByZXN1bHQ9IChJbWFnZSlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChkZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdD0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChkZXNjcmlwdG9yLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkKLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZSByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2YzA0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgSlNQIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgSlNQRWRpdG9yUGx1Z2luSW1hZ2VzIHsgCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0xBU1NfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfb2JqLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUMgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19KU1AgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX1RFTVBMQVRFID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUFVCTElDID0gImljb25zL2Z1bGwvb2JqMTYvcHVibGljLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1BST1RFQ1RFRF9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9QVUJMSUNfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfREVGQVVMVF9PQko9ICJpY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9QUklWQVRFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2ZpZWxkX3ByaXZhdGVfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPID0gImljb25zL2Z1bGwvb2JqMTYvZGVmYXVsdF9jby5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVEVDVEVEX0NPID0gImljb25zL2Z1bGwvb2JqMTYvcHJvdGVjdGVkX2NvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfQ08gPSAiaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWNfY28uZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSVZBVEVfQ08gPSAiaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUkNMQVNTX0RFRkFVTFRfT0JKPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX2RlZmF1bHRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUkNMQVNTX1BSSVZBVEVfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcml2YXRlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJDTEFTU19QUk9URUNURURfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcm90ZWN0ZWRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUkNMQVNTX1BVQkxJQ19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSSU5URVJGQUNFX0RFRkFVTFRfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSSU5URVJGQUNFX1BSSVZBVEVfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHJpdmF0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSSU5URVJGQUNFX1BST1RFQ1RFRF9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcm90ZWN0ZWRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUklOVEVSRkFDRV9QVUJMSUNfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHVibGljX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfVkFSSUFCTEVfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfV0laQkFOX05FV0pTUEZJTEUgPSAiaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxY2IzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEltcGxlbWVudHMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGV4dGVuZHMgWE1MU291cmNlRWRpdGluZ1RleHRUb29scyB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VMYW5ndWFnZShOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWRvYyA9IChEb2N1bWVudCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCWRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQl9Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIGFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBkb2MpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWxhbmd1YWdlID0gYWRhcHRlci5nZXRMYW5ndWFnZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcGFnZSBkaXJlY3RpdmVzCi0JCQkJTm9kZUxpc3QgcGFnZURpcmVjdGl2ZXMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZURpcmVjdGl2ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlFbGVtZW50IHBhZ2VEaXJlY3RpdmUgPSAoRWxlbWVudCkgcGFnZURpcmVjdGl2ZXMuaXRlbShpKTsKLQkJCQkJU3RyaW5nIGxhbmdWYWx1ZSA9IHBhZ2VEaXJlY3RpdmUuZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSk7Ci0JCQkJCS8vIGxhc3Qgb25lIHRvIGRlY2xhcmUgYSBsYW5ndWFnZSB3aW5zCi0JCQkJCWlmIChsYW5nVmFsdWUgIT0gbnVsbCkKLQkJCQkJCWxhbmd1YWdlID0gbGFuZ1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiBubyBsYW5ndWFnZSB3YXMgc3BlY2lmaWVkIGFueXdoZXJlLCBhc3N1bWUgSmF2YQotCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCkKLQkJCWxhbmd1YWdlID0gSlNQMTFOYW1lc3BhY2UuQVRUUl9WQUxVRV9KQVZBOwotCQlyZXR1cm4gbGFuZ3VhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5YjAyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YSBleHRlbmRzIENvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSB7Ci0KLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGphdmEgZm9ybWF0dGluZyBzdHJhdGVneS4KLQkgKi8KLQlwdWJsaWMgRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdCgpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KCkgewotCQlzdXBlci5mb3JtYXQoKTsKLQotCQlmaW5hbCBJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSBmRG9jdW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JCWZpbmFsIFR5cGVkUG9zaXRpb24gcGFydGl0aW9uID0gKFR5cGVkUG9zaXRpb24pIGZQYXJ0aXRpb25zLnJlbW92ZUZpcnN0KCk7Ci0KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgcGFydGl0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0KLQkJCQlKU1BUcmFuc2xhdGlvblV0aWwgdHJhbnNsYXRpb25VdGlsID0gbmV3IEpTUFRyYW5zbGF0aW9uVXRpbChkb2N1bWVudCk7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRyYW5zbGF0aW9uVXRpbC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY3VTb3VyY2UgPSBjdS5nZXRTb3VyY2UoKTsKLQkJCQkJVGV4dEVkaXQgdGV4dEVkaXQgPSBmb3JtYXRTdHJpbmcoQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQsIGN1U291cmNlLCAwLCBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KSwgZ2V0UHJlZmVyZW5jZXMoKSk7Ci0KLQkJCQkJVGV4dEVkaXQganNwRWRpdCA9IHRyYW5zbGF0aW9uVXRpbC5nZXRUcmFuc2xhdGlvbigpLmdldEpzcEVkaXQodGV4dEVkaXQpOwotCQkJCQlpZiAoanNwRWRpdCAhPSBudWxsICYmIGpzcEVkaXQuaGFzQ2hpbGRyZW4oKSkKLQkJCQkJCWpzcEVkaXQuYXBwbHkoZG9jdW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vIENhbiBvbmx5IGhhcHBlbiBvbiBjb25jdXJyZW50IGRvY3VtZW50IG1vZGlmaWNhdGlvbiAtIGxvZwotCQkJCS8vIGFuZCBiYWlsIG91dAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0KLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0b3BzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdG9wcygpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RvcHMoKTsKLQotCQlmUGFydGl0aW9ucy5jbGVhcigpOwotCQlmRG9jdW1lbnRzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdFN0cmluZyhpbnQga2luZCwgU3RyaW5nIHN0cmluZywgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBNYXAgb3B0aW9ucykgewotCQlyZXR1cm4gVG9vbEZhY3RvcnkuY3JlYXRlQ29kZUZvcm1hdHRlcihvcHRpb25zKS5mb3JtYXQoa2luZCwgc3RyaW5nLCAwLCBzdHJpbmcubGVuZ3RoKCksIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MDI2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSAqIEVkaXRvcklucHV0IGZvciBleHRlcm5hbCBmaWxlcy4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmVkaXRvcnMudGV4dC5KYXZhRmlsZUVkaXRvcklucHV0Ci0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggYWRhcHRlciB3aGljaCBzaW1wbHkgcHJvdmlkZXMgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBzZWUgIEVjbGlwc2UgMy4xCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBXb3JrYmVuY2hBZGFwdGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQkJcmV0dXJuICgoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG8pLmdldE5hbWUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBXb3JrYmVuY2hBZGFwdGVyIGZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChGaWxlIGZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGUgPSBmaWxlOwotCQlmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZGaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKElMb2NhdGlvblByb3ZpZGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCXJldHVybiB0aGlzOwotCQlpZiAoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIGZXb3JrYmVuY2hBZGFwdGVyOwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXIjZ2V0UGF0aChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGlucHV0LmZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQjZ2V0UGF0aCgpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIH0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG8gaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG87Ci0JCQlyZXR1cm4gZkZpbGUuZXF1YWxzKGlucHV0LmZGaWxlKTsKLQkJfQotCQkKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBJUGF0aEVkaXRvcklucHV0IGlucHV0PSAoSVBhdGhFZGl0b3JJbnB1dClvOwotICAgICAgICAgICAgcmV0dXJuIGdldFBhdGgoKS5lcXVhbHMoaW5wdXQuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNWQ5MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgZXh0ZXJuYWwgZmlsZXMuCi0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkKLQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbjsKLQlwcml2YXRlIEZpbGUgZkh5cGVybGlua0ZpbGU7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBGaWxlIGZpbGUpIHsKLQkJZkh5cGVybGlua0ZpbGUgPSBmaWxlOwotCQlmSHlwZXJsaW5rUmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmSHlwZXJsaW5rRmlsZSAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoZkh5cGVybGlua0ZpbGUpOwotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQkJCXRyeSB7Ci0JCQkJZGVzY3JpcHRvciA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGlucHV0LmdldE5hbWUoKSwgdHJ1ZSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGlucHV0LCBkZXNjcmlwdG9yLmdldElkKCksIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5Zjk1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIEpTUCBKYXZhIGVsZW1lbnRzCi0gKi8KLWNsYXNzIEpTUEphdmFIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElKYXZhRWxlbWVudCBmRWxlbWVudDsKLQotCXB1YmxpYyBKU1BKYXZhSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1JlZ2lvbigpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQl0cnkgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSmF2YVVJLm9wZW5JbkVkaXRvcihmRWxlbWVudCk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlKYXZhVUkucmV2ZWFsSW5FZGl0b3IoZWRpdG9yLCBmRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5Y2FmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgaW4gSlNQIEphdmEgY29udGVudAotICovCi1wdWJsaWMgY2xhc3MgSlNQSmF2YUh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudHMgSUh5cGVybGlua0RldGVjdG9yIHsKLQotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoSUphdmFFbGVtZW50IGVsZW1lbnQsIElSZWdpb24gcmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBvcGVuIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBKU1AgZmlsZS4uLgotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU291cmNlUmVmZXJlbmNlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCQkJaW50IGpzcE9mZnNldCA9IDA7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCi0JCQkJLy8gdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JCQkJdHJ5IHsKLQkJCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHVyaVN0cmluZyA9IHNNb2RlbC5nZXRSZXNvbHZlcigpLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQkJCQkJCWZpbGUgPSBnZXRGaWxlKHVyaVN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0KLQkJCQkvLyBnZXQgSmF2YSByYW5nZSwgdHJhbnNsYXRlIGNvb3JkaW5hdGUgdG8gSlNQCi0KLQkJCQl0cnkgewotCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQkJCQlJSlNQVHJhbnNsYXRpb24ganNwVHJhbnNsYXRpb24gPSBnZXRKU1BUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQkJCWlmIChqc3BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBsaW5rIHRvIGxvY2FsIHZhcmlhYmxlIGRlZmluaXRpb25zCi0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMb2NhbFZhcmlhYmxlKSB7Ci0JCQkJCQkJcmFuZ2UgPSAoKElMb2NhbFZhcmlhYmxlKSBlbGVtZW50KS5nZXROYW1lUmFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGxpbmtpbmcgdG8gZmllbGRzIG9mIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLQkJCQkJCQlPYmplY3QgY3UgPSAoKElGaWVsZCkgZWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCQkJaWYgKGN1ICE9IG51bGwgJiYgY3UuZXF1YWxzKGpzcFRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpKSkKLQkJCQkJCQkJcmFuZ2UgPSAoKElTb3VyY2VSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIG1ldGhvZHMgb2YgdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdAotCQkJCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLQkJCQkJCQlPYmplY3QgY3UgPSAoKElNZXRob2QpIGVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJCWlmIChjdSAhPSBudWxsICYmIGN1LmVxdWFscyhqc3BUcmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKSkpCi0JCQkJCQkJCXJhbmdlID0gKChJU291cmNlUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHJhbmdlICE9IG51bGwgJiYgZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlqc3BPZmZzZXQgPSBqc3BUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQocmFuZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCQkJaWYgKGpzcE9mZnNldCA+PSAwKSB7Ci0JCQkJCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKHJlZ2lvbiwgZmlsZSwgbmV3IFJlZ2lvbihqc3BPZmZzZXQsIHJhbmdlLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgam1lLmdldE1lc3NhZ2UoKSwgam1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQkJbGluayA9IG5ldyBKU1BKYXZhSHlwZXJsaW5rKHJlZ2lvbiwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3IjZGV0ZWN0SHlwZXJsaW5rcyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCQkvLyBjaGVjayBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBKYXZhIHR5cGUKLQkJCUpTUFRyYW5zbGF0aW9uIGpzcFRyYW5zbGF0aW9uID0gZ2V0SlNQVHJhbnNsYXRpb24oZG9jdW1lbnQpOwotCQkJaWYgKGpzcFRyYW5zbGF0aW9uICE9IG51bGwpIHsKLQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW4gSlNQIEphdmEgY29udGVudAotCQkJCWludCBqYXZhT2Zmc2V0ID0ganNwVHJhbnNsYXRpb24uZ2V0SmF2YU9mZnNldChyZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWlmIChqYXZhT2Zmc2V0ID4gLTEpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB3ZSBhcmUgbm90IGluIGluZGlyZWN0IEphdmEgY29udGVudCAobGlrZQotCQkJCQkvLyBpbmNsdWRlZCBmaWxlcykKLQkJCQkJaWYgKCFqc3BUcmFuc2xhdGlvbi5pc0luZGlyZWN0KGphdmFPZmZzZXQpKSB7Ci0JCQkJCQkvLyBnZXQgSmF2YSBlbGVtZW50cwotCQkJCQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBqc3BUcmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJLy8gY3JlYXRlIGEgSlNQSmF2YUh5cGVybGluayBmb3IgZWFjaCBKYXZhIGVsZW1lbnQKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJCQkJCQkJLy8gZmluZCBoeXBlcmxpbmsgcmFuZ2UgZm9yIEphdmEgZWxlbWVudAotCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IHNlbGVjdFdvcmQoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCQkJCUlIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUh5cGVybGluayhlbGVtZW50LCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50KTsKLQkJCQkJCQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJCQkJCQkJaHlwZXJsaW5rcy5hZGQobGluayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgaHlwZXJsaW5rcy50b0FycmF5KG5ldyBJSHlwZXJsaW5rWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZAotCSAqIGZpbGUgZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykKLQkJCQlpZiAoZmlsZXNbaV0uZXhpc3RzKCkpCi0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJfQotCi0JCXJldHVybiBmaWxlOwotCX0KLQkvKioKLQkgKiBHZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gSlNQVHJhbnNsYXRpb24gaWYgb25lIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0KLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCXRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiB0cmFuc2xhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBKYXZhIGFsd2F5cyBzZWxlY3RzIHdvcmQgd2hlbiBkZWZpbmluZyByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gYW5jaG9yCi0JICogQHJldHVybiBJUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBJUmVnaW9uIHNlbGVjdFdvcmQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYW5jaG9yKSB7Ci0KLQkJdHJ5IHsKLQkJCWludCBvZmZzZXQgPSBhbmNob3I7Ci0JCQljaGFyIGM7Ci0KLQkJCXdoaWxlIChvZmZzZXQgPj0gMCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCS0tb2Zmc2V0OwotCQkJfQotCi0JCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0KLQkJCW9mZnNldCA9IGFuY2hvcjsKLQkJCWludCBsZW5ndGggPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQotCQkJd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCSsrb2Zmc2V0OwotCQkJfQotCi0JCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCQlpZiAoc3RhcnQgPT0gZW5kKQotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCAwKTsKLQotCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTYzNGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLlVSTEh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVExEUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIERldGVjdHMgaHlwZXJsaW5rcyBmb3IgdGFnbGlicy4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudHMgSUh5cGVybGlua0RldGVjdG9yIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gbnVsbDsKLQotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsICYmIHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY2hlY2sgaWYganNwIHRhZy9kaXJlY3RpdmUgZmlyc3QKLQkJCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IFRleHRVdGlsaXRpZXMuZ2V0UGFydGl0aW9uKGRvYywgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgcmVnaW9uLmdldE9mZnNldCgpLCBmYWxzZSk7Ci0JCQkJCWlmIChwYXJ0aXRpb24gIT0gbnVsbCAmJiBwYXJ0aXRpb24uZ2V0VHlwZSgpID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHsKLQkJCQkJCS8vIGNoZWNrIGlmIGpzcCB0YWdsaWIgZGlyZWN0aXZlCi0JCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gZ2V0Q3VycmVudE5vZGUoZG9jLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCQkvLyBnZXQgdGhlIHVyaSBhdHRyaWJ1dGUKLQkJCQkJCQlBdHRyIHRhZ2xpYk5vZGUgPSAoKEVsZW1lbnQpIGN1cnJlbnROb2RlKS5nZXRBdHRyaWJ1dGVOb2RlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9VUkkpOwotCQkJCQkJCUlUYWdsaWJSZWNvcmQgcmVmZXJlbmNlID0gVGFnbGliSW5kZXgucmVzb2x2ZShnZXRCYXNlTG9jYXRpb25Gb3JUYWdsaWIoZG9jKSwgdGFnbGliTm9kZS5nZXRWYWx1ZSgpLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIGhhbmRsZSB0YWdsaWJzCi0JCQkJCQkJCXN3aXRjaCAocmVmZXJlbmNlLmdldFJlY29yZFR5cGUoKSkgewotCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UTEQpIDogewotCQkJCQkJCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQkJCQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gcmVjb3JkLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKHRhZ2xpYk5vZGUpOwotCQkJCQkJCQkJCWh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayh1cmlTdHJpbmcsIGh5cGVybGlua1JlZ2lvbiwgZG9jLCB0YWdsaWJOb2RlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6Ci0JCQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24odGFnbGliTm9kZSk7Ci0JCQkJCQkJCQkJaHlwZXJsaW5rID0gbmV3IFRhZ2xpYkphclVyaUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHJlZmVyZW5jZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IElIeXBlcmxpbmtbXXtoeXBlcmxpbmt9OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJhc2UgbG9jYXRpb24gZnJvbSB0aGUgY3VycmVudCBtb2RlbCAoaWYgd2l0aGluIHdvcmtzcGFjZSwKLQkgKiBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB3b3Jrc3BhY2UsIG90aGVyd2lzZSwgZmlsZSBzeXN0ZW0gcGF0aCkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlTG9jYXRpb25Gb3JUYWdsaWIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQotCQkvLyBnZXQgdGhlIGJhc2UgbG9jYXRpb24gZnJvbSB0aGUgY3VycmVudCBtb2RlbAotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCWJhc2VMb2MgPSBzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJhc2VMb2M7Ci0JfQotCi0JLy8gdGhlIGJlbG93IG1ldGhvZHMgd2VyZSBjb3BpZWQgZnJvbSBVUklIeXBlcmxpbmtEZXRlY3RvcgotCi0JcHJpdmF0ZSBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihOb2RlIG5vZGUpIHsKLQkJSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQkJCUlET01Ob2RlIGRvY05vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9jTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlcwotCQkJCUlET01BdHRyIGF0dCA9IChJRE9NQXR0cikgbm9kZTsKLQkJCQkvLyBkbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCWludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQlpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKSB7Ci0JCQkJCQkrK3JlZ09mZnNldDsKLQkJCQkJCXJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0JCQkJCX0KLQkJCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGh5cGVyUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCB0byBhbiBleGlzdGluZyBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIHJldHVybnMgZXhpc3RpbmcgSUZpbGUKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJLyoKLQkJICogTm90ZSBhdCB0aGlzIHBvaW50LCBmaWxlU3RyaW5nIGlzIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSBwb2ludGluZwotCQkgKiB0byBhbiBleGlzdGluZyBmaWxlIGluIHRoZSB3b3Jrc3BhY2UsIHNvIHdlIGNhbiBqdXN0IGNhbGwgZ2V0RmlsZS4KLQkJICovCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cmluZykpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgaHlwZXJsaW5rCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEBwYXJhbSBoeXBlcmxpbmtSZWdpb24KLQkgKiBAcmV0dXJuIElIeXBlcmxpbmsKLQkgKi8KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKFN0cmluZyB1cmlTdHJpbmcsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgbm9kZSkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCi0JCWlmICh1cmlTdHJpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRlbXAgPSB1cmlTdHJpbmcudG9Mb3dlckNhc2UoKTsKLQkJCWlmICh0ZW1wLnN0YXJ0c1dpdGgoSFRUUF9QUk9UT0NPTCkpIHsKLQkJCQkvLyB0aGlzIGlzIGEgVVJMSHlwZXJsaW5rIHNpbmNlIHRoaXMgaXMgYSB3ZWIgYWRkcmVzcwotCQkJCWxpbmsgPSBuZXcgVVJMSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgdXJpU3RyaW5nKTsKLQkJCX0KLQotCQkJLy8gdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSh1cmlTdHJpbmcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCS8vIHRoaXMgaXMgYSBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZXhpc3RzIGluCi0JCQkJLy8gd29ya3NwYWNlCi0JCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIGFuIEV4dGVybmFsRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGRvZXMgbm90IGV4aXN0Ci0JCQkJLy8gaW4gd29ya3NwYWNlCi0JCQkJRmlsZSBleHRlcm5hbEZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgZXh0ZXJuYWxGaWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQlpZiAoaW5vZGUgPT0gbnVsbCkKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCi0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoTm9kZSkgaW5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFySHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjI5MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciB0YWdsaWIgZmlsZXMgaW4gamFycy4KLSAqLwotY2xhc3MgVGFnbGliSmFySHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0Jc3RhdGljIGNsYXNzIFppcFN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZSB7Ci0JCUZpbGUgZkZpbGUgPSBudWxsOwotCQlTdHJpbmcgZkVudHJ5TmFtZSA9IG51bGw7Ci0KLQkJWmlwU3RvcmFnZShGaWxlIGZpbGUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJCWZGaWxlID0gZmlsZTsKLQkJCWZFbnRyeU5hbWUgPSBlbnRyeU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlaaXBGaWxlIGZpbGUgPSBuZXcgWmlwRmlsZShmRmlsZSk7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSBmaWxlLmdldEVudHJ5KGZFbnRyeU5hbWUpOwotCQkJCXN0cmVhbSA9IGZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsIGdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSkpOwotCQkJfQotCQkJcmV0dXJuIHN0cmVhbTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArIElQYXRoLlNFUEFSQVRPUiArIGZFbnRyeU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZFbnRyeU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElQYXRoIGZaaXBGaWxlUGF0aDsKLQotCXB1YmxpYyBUYWdsaWJKYXJIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElQYXRoIHppcEZpbGVQYXRoKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZaaXBGaWxlUGF0aCA9IHppcEZpbGVQYXRoOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgVVJMRmlsZUh5cGVybGluay5TdG9yYWdlRWRpdG9ySW5wdXQobmV3IFppcFN0b3JhZ2UoZlppcEZpbGVQYXRoLnRvRmlsZSgpLCAiTUVUQS1JTkYvdGFnbGliLnRsZCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQl0cnkgewotCQkJZGVzY3JpcHRvciA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGlucHV0LmdldE5hbWUoKSk7Ci0JCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGlucHV0LCBkZXNjcmlwdG9yLmdldElkKCksIHRydWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphclVyaUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJVcmlIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmNzA4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphclVyaUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgdGFnbGliIGZpbGVzIGluIGphcnMgb3Igc3BlY2lmaWVkIGJ5IHVybHMuCi0gKi8KLWNsYXNzIFRhZ2xpYkphclVyaUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkOwotCXByaXZhdGUgSUh5cGVybGluayBmSHlwZXJsaW5rOwotCi0JcHVibGljIFRhZ2xpYkphclVyaUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSVRhZ2xpYlJlY29yZCByZWNvcmQpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZlRhZ2xpYlJlY29yZCA9IHJlY29yZDsKLQl9Ci0KLQlwcml2YXRlIElIeXBlcmxpbmsgZ2V0SHlwZXJsaW5rKCkgewotCQlpZiAoZkh5cGVybGluayA9PSBudWxsICYmIGZUYWdsaWJSZWNvcmQgIT0gbnVsbCkgewotCQkJc3dpdGNoIChmVGFnbGliUmVjb3JkLmdldFJlY29yZFR5cGUoKSkgewotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgZlRhZ2xpYlJlY29yZDsKLQkJCQkJZkh5cGVybGluayA9IG5ldyBUYWdsaWJKYXJIeXBlcmxpbmsoZlJlZ2lvbiwgcmVjb3JkLmdldExvY2F0aW9uKCkpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSBmVGFnbGliUmVjb3JkOwotCQkJCQlmSHlwZXJsaW5rID0gbmV3IFVSTEZpbGVIeXBlcmxpbmsoZlJlZ2lvbiwgcmVjb3JkLmdldFVSTCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZIeXBlcmxpbms7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlJUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0KLQkJSUh5cGVybGluayBsaW5rID0gZ2V0SHlwZXJsaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IGxpbmsuZ2V0SHlwZXJsaW5rUmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IGdldEh5cGVybGluaygpOwotCQlpZiAobGluayAhPSBudWxsKSB7Ci0JCQlsaW5rLm9wZW4oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTAxNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBVUkxzIChvcGVucyBpbiByZWFkLW9ubHkgbW9kZSkKLSAqLwotY2xhc3MgVVJMRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXN0YXRpYyBjbGFzcyBTdG9yYWdlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJU3RvcmFnZUVkaXRvcklucHV0IHsKLQkJSVN0b3JhZ2UgZlN0b3JhZ2UgPSBudWxsOwotCi0JCVN0b3JhZ2VFZGl0b3JJbnB1dChJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCQlmU3RvcmFnZSA9IHN0b3JhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiBmU3RvcmFnZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBmU3RvcmFnZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpICE9IG51bGwgPyBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgOiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIFVSTFN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZSB7Ci0JCVVSTCBmVVJMID0gbnVsbDsKLQotCQlVUkxTdG9yYWdlKFVSTCB1cmwpIHsKLQkJCWZVUkwgPSB1cmw7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0gPSBmVVJMLm9wZW5TdHJlYW0oKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBmVVJMLnRvU3RyaW5nKCksIGUpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJlYW07Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC50b1N0cmluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLmdldEZpbGUoKSkubGFzdFNlZ21lbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBVUkwgZlVSTDsKLQotCXB1YmxpYyBVUkxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBVUkwgdXJsKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZlVSTCAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgU3RvcmFnZUVkaXRvcklucHV0KG5ldyBVUkxTdG9yYWdlKGZVUkwpKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCkpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhYWEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIGZpbGVzIHdpdGhpbiB0aGUgd29ya3NwYWNlLiAoQXMgbG9uZyBhcyB0aGVyZSBpcyBhbiBJRmlsZSwKLSAqIHRoaXMgY2FuIGJlIHVzZWQpIE9wZW5zIHRoZSBkZWZhdWx0IGVkaXRvciBmb3IgdGhlIGZpbGUuCi0gKi8KLWNsYXNzIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElGaWxlIGZGaWxlOwotCXByaXZhdGUgSVJlZ2lvbiBmSGlnaGxpZ2h0UmFuZ2U7Ci0KLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUsIElSZWdpb24gcmFuZ2UpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCQlmSGlnaGxpZ2h0UmFuZ2UgPSByYW5nZTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZGaWxlICE9IG51bGwgJiYgZkZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZGaWxlLCB0cnVlKTsKLQkJCQkvLyBoaWdobGlnaHQgcmFuZ2UgaW4gZWRpdG9yIGlmIHBvc3NpYmxlCi0JCQkJaWYgKGZIaWdobGlnaHRSYW5nZSAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCSgoSVRleHRFZGl0b3IpIGVkaXRvcikuc2V0SGlnaGxpZ2h0UmFuZ2UoZkhpZ2hsaWdodFJhbmdlLmdldE9mZnNldCgpLCBmSGlnaGxpZ2h0UmFuZ2UuZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBwaWUuZ2V0TWVzc2FnZSgpLCBwaWUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZWU4OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLlVSTEh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGluIFhNTCB0YWdzLiBJbmNsdWRlcyBkZXRlY3Rpb24gaW4gRE9DVFlQRSBhbmQgYXR0cmlidXRlCi0gKiB2YWx1ZXMuIFJlc29sdmVzIHJlZmVyZW5jZXMgdG8gc2NoZW1hcywgZHRkcywgZXRjIHVzaW5nIHRoZSBDb21tb24gVVJJCi0gKiBSZXNvbHZlci4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MSHlwZXJsaW5rRGV0ZWN0b3IgaW1wbGVtZW50cyBJSHlwZXJsaW5rRGV0ZWN0b3IgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiaHR0cDovLyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04gPSAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNJX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGh5cGVybGluawotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcGFyYW0gaHlwZXJsaW5rUmVnaW9uCi0JICogQHJldHVybiBJSHlwZXJsaW5rCi0JICovCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhTdHJpbmcgdXJpU3RyaW5nLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50LCBOb2RlIG5vZGUpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQotCQlpZiAoaXNIdHRwKHVyaVN0cmluZykpIHsKLQkJCWxpbmsgPSBuZXcgVVJMSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgdXJpU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJRmlsZSBzeXN0ZW1GaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChzeXN0ZW1GaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3lzdGVtUGF0aCA9IHN5c3RlbUZpbGUuZ2V0UGF0aCgpOwotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHN5c3RlbVBhdGgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBleGlzdHMgaW4KLQkJCQkJLy8gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGZpbGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGhpcyBpcyBhbiBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBkb2VzIG5vdAotCQkJCQkvLyBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCQkJbGluayA9IG5ldyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBzeXN0ZW1GaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJLy8gZm9yIG5vdywgb25seSBjYXBhYmxlIG9mIGNyZWF0aW5nIDEgaHlwZXJsaW5rCi0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCQkvLyBkb2N0eXBlIG5vZGVzCi0JCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50Tm9kZSwgZG9jdW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCS8vIGVsZW1lbnQgbm9kZXMKLQkJCQkJQXR0ciBjdXJyZW50QXR0ciA9IGdldEN1cnJlbnRBdHRyTm9kZShjdXJyZW50Tm9kZSwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGxpbmsgZm9yIGN1cnJlbnQgYXR0cmlidXRlCi0JCQkJCQkvLyByZXNvbHZlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnRBdHRyLCBkb2N1bWVudCk7Ci0JCQkJCQkvLyB2ZXJpZnkgdmFsaWRpdHkgb2YgdXJpIHN0cmluZwotCQkJCQkJaWYgKHVyaVN0cmluZyA9PSBudWxsIHx8ICFpc1ZhbGlkVVJJKHVyaVN0cmluZykpCi0JCQkJCQkJLy8gcmVzZXQgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCQljdXJyZW50QXR0ciA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRBdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGEgbGlua2FibGUgYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50Ci0JCQkJCQljdXJyZW50QXR0ciA9IGdldExpbmthYmxlQXR0cigoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnRBdHRyOwotCQkJCX0KLQkJCQkvLyB0cnkgdG8gY3JlYXRlIGh5cGVybGluayBmcm9tIGluZm9ybWF0aW9uIGdhdGhlcmVkCi0JCQkJaWYgKHVyaVN0cmluZyAhPSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwgJiYgaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGN1cnJlbnROb2RlKTsKLQkJCQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsodXJpU3RyaW5nLCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50LCBjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChoeXBlcmxpbmsgIT0gbnVsbCkgewotCQkJCQkJaHlwZXJsaW5rcy5hZGQoaHlwZXJsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgaHlwZXJsaW5rcy50b0FycmF5KG5ldyBJSHlwZXJsaW5rWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJhc2UgbG9jYXRpb24gZnJvbSB0aGUgY3VycmVudCBtb2RlbCAobG9jYWwgZmlsZSBzeXN0ZW0pCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJaWYgKGxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhc2VMb2MgPSBsb2NhdGlvbi50b1N0cmluZygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGxvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobG9jYXRpb24pLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJZWxzZQotCQkJCQkJYmFzZUxvYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQobG9jYXRpb24pLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTG9jOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5vZGUgd2l0aGluIG5vZGUgYXQgb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBBdHRyCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldEN1cnJlbnRBdHRyTm9kZShOb2RlIG5vZGUsIGludCBvZmZzZXQpIHsKLQkJaWYgKChub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5jb250YWlucyhvZmZzZXQpICYmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIGF0dHJpYnV0ZSBpbiBub2RlIGFuZCBpZiBhdHRyaWJ1dGUgY29udGFpbnMKLQkJCS8vIG9mZnNldCwgcmV0dXJuIHRoYXQgYXR0cmlidXRlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCQkvLyBhc3N1bXB0aW9uIHRoYXQgaWYgcGFyZW50IG5vZGUgaXMgb2YgdHlwZSBJbmRleGVkUmVnaW9uLAotCQkJCS8vIHRoZW4gaXRzIGF0dHJpYnV0ZXMgd2lsbCBhbHNvIGJlIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbgotCQkJCUluZGV4ZWRSZWdpb24gYXR0UmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dFJlZ2lvbi5jb250YWlucyhvZmZzZXQpKSB7Ci0JCQkJCXJldHVybiAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm9kZSB0aGUgY3Vyc29yIGlzIGN1cnJlbnRseSBvbiBpbiB0aGUgZG9jdW1lbnQuIG51bGwgaWYgbm8KLQkgKiBub2RlIGlzIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gTm9kZSBlaXRoZXIgZWxlbWVudCwgZG9jdHlwZSwgdGV4dCwgb3IgbnVsbAotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRDdXJyZW50Tm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJLy8gZ2V0IHRoZSBjdXJyZW50IG5vZGUgYXQgdGhlIG9mZnNldCAocmV0dXJucyBlaXRoZXI6IGVsZW1lbnQsCi0JCS8vIGRvY3R5cGUsIHRleHQpCi0JCUluZGV4ZWRSZWdpb24gaW5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJCWlmIChpbm9kZSA9PSBudWxsKQotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0KLQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIChOb2RlKSBpbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZAotCSAqIGZpbGUgZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykKLQkJCQlpZiAoZmlsZXNbaV0uZXhpc3RzKCkpCi0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJfQotCi0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB1cmlTdHJpbmcgaXMgbm90IGh0dHA6Ly8KLQkgKiBAcmV0dXJuIEZpbGUgY3JlYXRlZCBmcm9tIHVyaVN0cmluZyBpZiBwb3NzaWJsZSwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0RmlsZUZyb21VcmlTdHJpbmcoU3RyaW5nIHVyaVN0cmluZykgewotCQlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZmlyc3QganVzdCB0cnkgdG8gY3JlYXRlIGEgZmlsZSBkaXJlY3RseSBmcm9tIHVyaVN0cmluZyBhcwotCQkJLy8gZGVmYXVsdCBpbiBjYXNlIGNyZWF0ZSBmaWxlIGZyb20gdXJpIGRvZXMgbm90IHdvcmsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCi0JCQkvLyB0cnkgdG8gY3JlYXRlIGZpbGUgZnJvbSB1cmkKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHVyaVN0cmluZyk7Ci0JCQlmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBGaWxlIGp1c3QgaWdub3JlCi0JCQkvLyBhbmQgZmlsZSB3aWxsIGJlIG51bGwKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKE5vZGUgbm9kZSkgewotCQlJUmVnaW9uIGh5cGVyUmVnaW9uID0gbnVsbDsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEVuZE9mZnNldCgpIC0gZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGVzCi0JCQkJSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotCQkJCS8vIGRvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uCi0JCQkJaW50IHJlZ09mZnNldCA9IGF0dC5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlTdHJpbmcgYXR0VmFsdWUgPSBhdHQuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpIHsKLQkJCQkJCSsrcmVnT2Zmc2V0OwotCQkJCQkJcmVnTGVuZ3RoID0gcmVnTGVuZ3RoIC0gMjsKLQkJCQkJfQotCQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24ocmVnT2Zmc2V0LCByZWdMZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gZmluZCBhbiBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQgdGhhdCBpcyBvcGVuYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gQXR0ciBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBmb3Igb3BlbiBvbiwgbnVsbCBpZiBubwotCSAqICAgICAgICAgYXR0cmlidXRlIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldExpbmthYmxlQXR0cihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbm9kZQotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiCi0JCQlBdHRyIGF0dCA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKGlzTGlua2FibGVBdHRyKGF0dCwgZWQpKSB7Ci0JCQkJcmV0dXJuIGF0dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBsb2NhdGlvbiBoaW50IGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlVVJJIGlmIGl0IGV4aXN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Tm9kZSAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIGxvY2F0aW9uIGhpbnQgKHN5c3RlbUlkKSBpZiBpdCB3YXMgZm91bmQsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25IaW50KEVsZW1lbnQgZWxlbWVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJQXR0ciBzY2hlbWFMb2NOb2RlID0gZWxlbWVudE5vZGUuZ2V0QXR0cmlidXRlTm9kZU5TKFhTSV9OQU1FU1BBQ0VfVVJJLCBTQ0hFTUFfTE9DQVRJT04pOwotCQlpZiAoc2NoZW1hTG9jTm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNjaGVtYUxvY05vZGUuZ2V0VmFsdWUoKSk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkvLyBmb3VuZCBsb2NhdGlvbiBoaW50Ci0JCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHNJZ25vcmVDYXNlKHB1YmxpY0lkKSkKLQkJCQkJcmV0dXJuIHN5c3RlbUlkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSSSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJU3RyaW5nKE5vZGUgbm9kZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyByZXNvbHZlZFVSSSA9IG51bGw7Ci0JCS8vIG5lZWQgdGhlIGJhc2UgbG9jYXRpb24sIHB1YmxpY0lkLCBhbmQgc3lzdGVtSWQgZm9yIFVSSVJlc29sdmVyCi0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQkJCXB1YmxpY0lkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZQotCQkJQXR0ciBhdHRyTm9kZSA9IChBdHRyKSBub2RlOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ck5vZGUuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGF0dHJOb2RlLmdldFZhbHVlKCk7Ci0JCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChhdHRyVmFsdWUpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmIGF0dHJWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQotCQkJCS8vIGhhbmRsZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLQkJCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJCQlpZiAoKFhNTE5TLmVxdWFscyhwcmVmaXgpKSB8fCAoWE1MTlMuZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCQkJcHVibGljSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCXN5c3RlbUlkID0gZ2V0TG9jYXRpb25IaW50KGF0dHJOb2RlLmdldE93bmVyRWxlbWVudCgpLCBwdWJsaWNJZCk7Ci0JCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0ck5vZGUpKSkgJiYgKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQkvLyBmb3Igbm93IGp1c3QgdXNlIHRoZSBmaXJzdCBwYWlyCi0JCQkJCS8vIG5lZWQgdG8gbG9vayBpbnRvIGJlaW5nIG1vcmUgcHJlY2lzZQotCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCXB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQlzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkJLy8gZWxzZSBjaGVjayBpZiB4bWxucyBwdWJsaWNJZCA9IHZhbHVlCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXNvbHZlZFVSSSA9IHJlc29sdmVVUkkoYmFzZUxvYywgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJcmV0dXJuIHJlc29sdmVkVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHVyaVN0cmluZyBpcyBhbiBodHRwIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIHRydWUgaWYgdXJpU3RyaW5nIGlzIGh0dHAgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNIdHRwKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc0h0dHAgPSBmYWxzZTsKLQkJaWYgKHVyaVN0cmluZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVtcFN0cmluZyA9IHVyaVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRlbXBTdHJpbmcuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkKLQkJCQlpc0h0dHAgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBpc0h0dHA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIG9wZW5hYmxlLiBBdHRyaWJ1dGUgaXMgb3BlbmFibGUKLQkgKiBpZiBpdCBpcyBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgb3IgaWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCSAqIG9mIHR5cGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBjbUVsZW1lbnQKLQkgKiAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIChjYW4gYmUKLQkgKiAgICAgICAgICAgIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTGlua2FibGVBdHRyKEF0dHIgYXR0ciwgQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50KSB7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgY29udGFpbnMgc2NoZW1hIGxvY2F0aW9uCi0JCWlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0cikpKSAmJiAoKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSB8fCAoTk9fTkFNRVNQQUNFX1NDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgVVJJCi0JCWlmIChjbUVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQlpZiAoKGF0dHJEZWNsICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLlVSSS5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB1cmlTdHJpbmcgaXMgcmVhbGx5IHBvaW50aW5nIHRvIGEgZmlsZQotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFVSSShTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCi0JCWlmIChpc0h0dHAodXJpU3RyaW5nKSkKLQkJCWlzVmFsaWQgPSB0cnVlOwotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCWlzVmFsaWQgPSBmaWxlLmlzRmlsZSgpOwotCQl9Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybiBTdHJpbmcgcmVzb2x2ZWQgdXJpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZG9udCByZXNvbHZlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byByZXNvbHZlCi0JCWlmICgoYmFzZUxvY2F0aW9uID09IG51bGwpICYmIChwdWJsaWNJZCA9PSBudWxsKSAmJiAoc3lzdGVtSWQgPT0gbnVsbCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTA1ZjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Eb2N1bWVudENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci0KLS8qKgotICogQ3JlYXRlcyBkb2N1bWVudCBjaGFuZ2UocykgZm9yIGFuIElKYXZhRWxlbWVudCByZW5hbWUuCi0gKiBDaGFuZ2VzIGFyZSBjcmVhdGVkIGZvciBldmVyeSB0eXBlICJtYXRjaCIgaW4gdGhlIHdvcmtzcGFjZQotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCQotCS8qKgotCSAqIFdvcmtzcGFjZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBzYXZlIG9uIG1vZGVsIGZvciB1cGRhdGVkIGRvY3VtZW50cy4KLQkgKiBTaG91bGQgb25seSBiZSBkb25lIG9uIG1vZGVscyBub3Qgb3BlbiBpbiBhbiBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTYXZlSnNwRmlsZU9wIGV4dGVuZHMgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQkJCi0JCXByaXZhdGUgSURvY3VtZW50IGZKU1BEb2MgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBTYXZlSnNwRmlsZU9wKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjUKLQkJCS8vIHNhdmUgZmlsZSB3LyBubyBpbnRlcm1lZGlhdGUgbW9kZWwgY3JlYXRpb24KLQkJCQotCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgRG9jdW1lbnRSZWFkZXIodGhpcy5mSlNQRG9jKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXQodGhpcy5mSlNQRmlsZSwgcmVhZGVyKTsKLQkJCQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNvZGVkQnl0ZVN0cmVhbSA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvZGVkQnl0ZVN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQlpZiAodGhpcy5mSlNQRmlsZS5leGlzdHMoKSkKLQkJCQkJdGhpcy5mSlNQRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmZKU1BGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoY29kZWRCeXRlU3RyZWFtICE9IG51bGwpCi0JCQkJCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCQkJaWYoY29kZWRTdHJlYW0gIT0gbnVsbCkKLQkJCQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCQkJLy8gdW5saWtlbHkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gZW5kIGlubmVyIGNsYXNzIFNhdmVKc3BGaWxlT3AKLQkKLQkvKioKLQkgKiBDaGFuZ2UgY2xhc3MgdGhhdCB3cmFwcyBhIHRleHQgZWRpdCBvbiB0aGUganNwIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBEb2N1bWVudENoYW5nZSB7Ci0KLQkJcHJpdmF0ZSBUZXh0RWRpdCBmRWRpdCA9IG51bGw7Ci0JCXByaXZhdGUgSUZpbGUgZkpTUEZpbGUgPSBudWxsOwotCQlwcml2YXRlIElEb2N1bWVudCBmSlNQRG9jID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA7Ci0JCQotCQlwdWJsaWMgUmVuYW1lQ2hhbmdlKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MsIFRleHRFZGl0IGVkaXQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJc3VwZXIoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzYsIGpzcERvYyk7Ci0JCQl0aGlzLmZFZGl0ID0gZWRpdDsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQkJdGhpcy5mSlNQRG9jID0ganNwRG9jOwotCQkJdGhpcy5mRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJRG9jdW1lbnQgZ2V0UHJldmlld0RvY3VtZW50KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlEb2N1bWVudCBjb3B5RG9jID0gbmV3IERvY3VtZW50KGZKU1BEb2MuZ2V0KCkpOwotCQkJdHJ5IHsKLQkJCQlmRWRpdC5hcHBseShjb3B5RG9jKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlyZXR1cm4gY29weURvYzsKLQkJfQotCQkKLQkJcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVJlbmFtZUNoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJCi0JCQkJaWYoIWlzT3BlbkluRWRpdG9yKHRoaXMuZkpTUERvYykpIHsKLQkJCQkJLy8gYXBwbHkgZWRpdCB0byBKU1AgZG9jIEFORCBzYXZlIG1vZGVsCi0JCQkJCXVuZG9DaGFuZ2UgPSBuZXcgUmVuYW1lQ2hhbmdlKHRoaXMuZkpTUEZpbGUsIHRoaXMuZkpTUERvYywgdGhpcy5mRWRpdC5hcHBseShmSlNQRG9jKSwgdGhpcy5mRGVzY3JpcHRpb24pOwotCQkJCQlzYXZlRmlsZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8ganVzdCBhcHBseSBlZGl0IHRvIEpTUCBkb2N1bWVudAotCQkJCQl1bmRvQ2hhbmdlID0gbmV3IFJlbmFtZUNoYW5nZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MsIHRoaXMuZkVkaXQuYXBwbHkoZkpTUERvYyksIHRoaXMuZkRlc2NyaXB0aW9uKTsKLQkJCQl9Ci0JCQkJCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdW5kb0NoYW5nZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFBlcmZvcm1lZCBpbiBhbiBvcGVyYXRpb24gc2luY2UgaXQgbW9kaWZpZXMgcmVzb3VyY2VzIGluIHRoZSB3b3Jrc3BhY2UKLQkJICogQHBhcmFtIGpzcERvYwotCQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzYXZlRmlsZShJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQkKLQkJCVNhdmVKc3BGaWxlT3Agb3AgID0gbmV3IFNhdmVKc3BGaWxlT3AoanNwRmlsZSwganNwRG9jKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlvcC5ydW4oSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDaGVja3MgaWYgYSBkb2N1bWVudCBpcyBvcGVuIGluIGFuIGVkaXRvcgotCQkgKiBAcGFyYW0ganNwRG9jCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc09wZW5JbkVkaXRvcihJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQkJSVdvcmtiZW5jaFdpbmRvdyB3ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCi0JCQkJdyA9IHdpbmRvd3NbaV07Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQotCQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQkJCQlPYmplY3QgbyA9IG51bGw7Ci0JCQkJCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLQotCQkJCQkJZWRpdG9yID0gcmVmZXJlbmNlc1tqXS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NAotCQkJCQkJLy8gdXNlIGFkYXB0ZXIgdG8gZ2V0IElUZXh0RWRpdG9yIChmb3IgdGhpbmdzIGxpa2UKLQkJCQkJCS8vIHBhZ2UgZGVzaWduZXIpCi0JCQkJCQlvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQotCQkJCQkJCWRvYyA9ICgoSVRleHRFZGl0b3IpIG8pLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYy5lcXVhbHMoanNwRG9jKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mRGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCX0KLQkvLyBlbmQgaW5uZXIgY2xhc3MgUmVuYW1lQ2hhbmdlCi0JCi0JCi0JLyoqIFRoZSB0eXBlIGJlaW5nIHJlbmFtZWQgKHRoZSBvbGQgdHlwZSkqLwotCUlKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JLyoqIFRoZSBuZXcgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyByZW5hbWVkKi8KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JLyoqIG1hcHMgYSBKU1BTZWFyY2hEb2N1bWVudCBwYXRoIC0+IE11bHRpVGV4dEVkaXQgZm9yIHRoZSBqYXZhIGZpbGUqLwotCXByaXZhdGUgSGFzaE1hcCBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG51bGw7Ci0JCi0JcHVibGljIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMuZk5ld05hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmV3IG5hbWUgZm9yIHRoZSBUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mTmV3TmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IGphdmFNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJU2VhcmNoRG9jdW1lbnQgc2VhcmNoRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCi0JCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldFJlbmFtZVRleHQoKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKXNlYXJjaERvYywgamF2YU1hdGNoKTsKLQkJCQotCQkJLy8gYWRkIGl0IGZvciB0aGUgY29ycmVjdCBkb2N1bWVudAotCQkJYWRkSmF2YUVkaXQoc2VhcmNoRG9jLmdldFBhdGgoKSwgbmV3IFJlcGxhY2VFZGl0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldExlbmd0aCgpLCByZW5hbWVUZXh0KSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJcmV0dXJuIGdldE5ld05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRvIHRoZSBtdWx0aSBlZGl0IGZvciBhIGdpdmUgamF2YSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gamF2YURvY3VtZW50Ci0JICogQHBhcmFtIGphdmFFZGl0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFFZGl0KFN0cmluZyBzZWFyY2hEb2NQYXRoLCBSZXBsYWNlRWRpdCBqYXZhRWRpdCkgewotCQkKLQkJT2JqZWN0IG8gPSB0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJaWYobyAhPSBudWxsKSB7Ci0KLQkJCU11bHRpVGV4dEVkaXQgbXVsdGkgPSAoTXVsdGlUZXh0RWRpdClvOwotCQkJbXVsdGkuYWRkQ2hpbGQoamF2YUVkaXQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdXNlIGEgbXVsdGkgZWRpdCBzbyBkb2MgcG9zaXRpb24gb2Zmc2V0cyBnZXQgdXBkYXRlZCBhdXRvbWF0aWNhbGx5Ci0JCQkvLyB3aGVuIGFkZGluZyBtdWx0aXBsZSBjaGlsZCBlZGl0cwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCQl0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLnB1dChzZWFyY2hEb2NQYXRoLCBtdWx0aSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhbGwgSlNQIGNoYW5nZXMgZm9yIHRoZSBzZWFyY2ggbWF0Y2hlcyBmb3IgdGhlIGdpdmVuIFR5cGUKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gZ2V0Q2hhbmdlcygpIHsKLQkJCi0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJTGlzdCBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBrZXlzID0gZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHNlYXJjaERvY1BhdGggPSBudWxsOwotCQlTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0JCQotCQl3aGlsZShrZXlzLmhhc05leHQoKSkgewotCQkJLy8gY3JlYXRlIG9uIHRoZSBmbHkKLQkJCXNlYXJjaERvY1BhdGggPSAoU3RyaW5nKWtleXMubmV4dCgpOwotCQkJTXVsdGlUZXh0RWRpdCBqYXZhRWRpdCA9IChNdWx0aVRleHRFZGl0KWZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJCWRlbGVnYXRlID0gc3VwcG9ydC5nZXRTZWFyY2hEb2N1bWVudChzZWFyY2hEb2NQYXRoKTsKLQkJCQotCQkJaWYoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZSBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQkJSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgamF2YURlbGVnYXRlID0gKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKWRlbGVnYXRlOwotCQkJCWNoYW5nZXMuYWRkKGNyZWF0ZUNoYW5nZShqYXZhRGVsZWdhdGUsIGphdmFEZWxlZ2F0ZS5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEpzcEVkaXQoamF2YUVkaXQpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChDaGFuZ2VbXSljaGFuZ2VzLnRvQXJyYXkobmV3IENoYW5nZVtjaGFuZ2VzLnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZSBjcmVhdGVDaGFuZ2UoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBUZXh0RWRpdCBlZGl0KSB7Ci0JCQotCQlJRG9jdW1lbnQgZG9jID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SnNwRG9jdW1lbnQoKTsKLQkJU3RyaW5nIGZpbGUgPSBzZWFyY2hEb2MuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIGRvY3VtZW50IGxpbmVzIGFyZSAwIGJhc2VkCi0JCQlTdHJpbmcgbGluZU51bWJlciA9IEludGVnZXIudG9TdHJpbmcoZG9jLmdldExpbmVPZk9mZnNldChlZGl0LmdldE9mZnNldCgpKSArIDEpOwotCQkJZGVzY3JpcHRpb24gKz0gIiAiICsgTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzEsIG5ldyBTdHJpbmdbXXtmaWxlLCBsaW5lTnVtYmVyfSk7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZW5hbWVDaGFuZ2Uoc2VhcmNoRG9jLmdldEZpbGUoKSwgZG9jLCBlZGl0LCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMjA1Ci0JLy8gb25seSByZWxldmFudCBmb3IgSVR5cGUgcmVmYWN0b3JpbmdzCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGdWxseVF1YWxpZmllZChTdHJpbmcgbWF0Y2hUZXh0KSB7Ci0JCWlmKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQlTdHJpbmcgcGtnID0gKChJVHlwZSlnZXRFbGVtZW50KCkpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlyZXR1cm4gbWF0Y2hUZXh0LnN0YXJ0c1dpdGgocGtnKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYmV0dGVyIGRlc2NyaWJlIHRoZSBjaGFuZ2UuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGYyZGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotY2xhc3MgSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyIHsKLQlzdGF0aWMgSUphdmFFbGVtZW50W10gZ2V0U2VsZWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBudWxsOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCS8vIGdldCB0aGUgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyBlZGl0b3IncyBkb2N1bWVudAotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOyAKLQkJCXRyeSB7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpbW9kZWw7Ci0JCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQkJCQllbGVtZW50cyA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzcFJhbmdlKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50WzBdOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NWZmMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSU1ldGhvZCBtZXRob2QsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQkKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKG1ldGhvZCwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUobWV0aG9kLCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gcGFfVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYWM5YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCQotCXByaXZhdGUgSU1ldGhvZCBmTWV0aG9kID0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0JCQl0aGlzLmZNZXRob2QgPSAoSU1ldGhvZCkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYodGhpcy5mTWV0aG9kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbmFtZSA9IHRoaXMuZk1ldGhvZC5nZXRTb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQTWV0aG9kUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mTWV0aG9kLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOyAKLQkJCWlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJCQltdWx0aUNoYW5nZSAgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQ3MjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JcHVibGljIEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQkKLQkJU3RyaW5nIGphdmFUZXh0ID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SmF2YVRleHQoKTsKLQkJU3RyaW5nIG1ldGhvZFRleHQgPSBqYXZhVGV4dC5zdWJzdHJpbmcoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkgKyBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCkpOwotCQlTdHJpbmcgbWV0aG9kU3VmZml4ID0gbWV0aG9kVGV4dC5zdWJzdHJpbmcobWV0aG9kVGV4dC5pbmRleE9mKCIoIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBnZXROZXdOYW1lKCkgKyBtZXRob2RTdWZmaXg7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zLCBuZXcgU3RyaW5nW117bWV0aG9kTmFtZSwgbmV3TmFtZX0pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWQ0YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi0vKioKLSAqIEFuIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IGxhdW5jaGVzIEpEVCBtb3ZlIGVsZW1lbnQgd2l6YXJkCi0gKiAKLSAqIFN0aWxsIHJlbGllcyBoZWF2aWx5IG9uIGludGVybmFsIEFQSQotICogd2lsbCBjaGFuZ2UgcG9zdCAzLjAgd2l0aCBwdWJsaWMgbW92ZSBzdXBwb3J0Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQkvL3ByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCS8vZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJLy9mRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkKLQkJLy8gbm8tb3AgdW50aWwgd2Uga25vdyBob3cgd2UncmUgc3VwcG9zZWQgdG8gdXNlIHRoaXMgCi0JCS8vIGVjbGlwc2UgMy4yTTUKLQkJLy8gcHVibGljIG1vdmUgc3VwcG9ydDogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3Ci0JCQotLy8JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cygpOwotLy8JCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0vLwotLy8JCQkvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgbW92YWJsZQotLy8JCQl0cnkgewotLy8JCQkJSmF2YU1vdmVQcm9jZXNzb3IgcHJvY2Vzc29yID0gSmF2YU1vdmVQcm9jZXNzb3IuY3JlYXRlKGdldFJlc291cmNlcyhlbGVtZW50cyksIGVsZW1lbnRzKTsKLS8vCQkJCQotLy8JCQkJU2hlbGwgcGFyZW50ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotLy8JCQkJTW92ZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IE1vdmVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotLy8KLS8vCQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZChyZWZhY3RvcmluZyk7Ci0vLwotLy8JCQkJLyoKLS8vCQkJCSAqIFdlIHdhbnQgdG8gZ2V0IHRoZSBzaGVsbCBmcm9tIHRoZSByZWZhY3RvcmluZyBkaWFsb2cgYnV0Ci0vLwkJCQkgKiBpdCdzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LCBzbyB3ZSBwYXNzIHRoZSB3aXphcmQgYW5kCi0vLwkJCQkgKiB0aGVuLCBvbmNlIHRoZSBkaWFsb2cgaXMgb3Blbiwgd2Ugd2lsbCBoYXZlIGFjY2VzcyB0byBpdHMKLS8vCQkJCSAqIHNoZWxsLgotLy8JCQkJICovCi0vLwotLy8JCQkJcHJvY2Vzc29yLnNldENyZWF0ZVRhcmdldFF1ZXJpZXMobmV3IENyZWF0ZVRhcmdldFF1ZXJpZXMod2l6YXJkKSk7Ci0vLwkJCQlwcm9jZXNzb3Iuc2V0UmVvcmdRdWVyaWVzKG5ldyBSZW9yZ1F1ZXJpZXMod2l6YXJkKSk7Ci0vLwkJCQkvLyBTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0KLS8vCQkJCS8vIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJPcGVuUmVmYWN0b3JpbmdXaXphcmRBY3Rpb24ucmVmYWN0b3JpbmciKTsKLS8vCQkJCS8vIC8vJE5PTi1OTFMtMSQKLS8vCQkJCVN0cmluZyBvcGVuUmVmYWN0b3JpbmdXaXpNc2cgPSBKU1BVSU1lc3NhZ2VzLk1vdmVFbGVtZW50V2l6YXJkOyAvLyAiTW92ZQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNlbGVjdGVkCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZWxlbWVudHMiOwotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLS8vCQkJCW5ldyBSZWZhY3RvcmluZ1N0YXJ0ZXIoKS5hY3RpdmF0ZShyZWZhY3RvcmluZywgd2l6YXJkLCBwYXJlbnQsIG9wZW5SZWZhY3RvcmluZ1dpek1zZywgdHJ1ZSk7Ci0vLwotLy8JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLS8vCi0vLwkJCX0KLS8vCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BNb3ZlRWxlbWVudEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTVlMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVBhY2thZ2VGcmFnbWVudCBwa2csIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvL3N1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCQotCQlCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yKHBrZywgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUocGtnLCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJCi0JCS8vcmV0dXJuIHRoaXMucGtnOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwM2QzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci0KLS8qKgotICogUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBwbHVnaW4ueG1sIGZpbGUgaWYgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGZQa2cgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCXRoaXMuZlBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZQa2cgIT0gbnVsbCkgewotCQkJbmFtZSA9IHRoaXMuZlBrZy5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJIENoYW5nZVtdIGNoYW5nZXMgPSBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mUGtnLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQkgQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJIGlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmZhMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogT3ZlcnJpZGVzIGdldCBkZXNjcmlwdGlvbgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQkKLQkvKioKLQkgKiBFbGVtZW50IGlzIHRoZSBvbGQgcGFja2FnZS4gIG5ld05hbWUgaXMgdGhlIG5ldyBwYWNrYWdlIG5hbWUuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdOYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81LCAobmV3IFN0cmluZ1tde3BhY2thZ2VOYW1lLCBuZXdOYW1lfSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDg3ZmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5yZWZhY3RvcmluZy5SZW5hbWVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi0vKioKLSAqIEFuIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IGxhdW5jaGVzIEpEVCByZW5hbWUgZWxlbWVudCB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIEpTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZFZGl0b3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChKU1BVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KEpTUFVJTWVzc2FnZXMuUmVuYW1lRWxlbWVudF9sYWJlbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKLQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHJlbmFtZVN1cHBvcnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzd2l0Y2goZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVR5cGUpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSU1ldGhvZCllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVBhY2thZ2VGcmFnbWVudCllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKHJlbmFtZVN1cHBvcnQgIT0gbnVsbCkgewotCQkJCQlyZW5hbWVTdXBwb3J0Lm9wZW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQllbHNlICB7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BSZW5hbWVFbGVtZW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIElKYXZhRWxlbWVudCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKChJVGV4dEVkaXRvcilmRWRpdG9yKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMSkKLQkJCQllbGVtZW50ID0gZWxlbWVudHNbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhY2Q2ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQkKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJCi0JCUpTUFR5cGVNb3ZlUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlTW92ZVJlcXVlc3Rvcih0eXBlLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZSh0eXBlLCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjODBiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZU1vdmVQYXJ0aWNpcGFudCBleHRlbmRzIE1vdmVQYXJ0aWNpcGFudCB7Ci0JCi0JSVR5cGUgZlR5cGUgPSBudWxsOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCXRoaXMuZlR5cGUgPSAoSVR5cGUpZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmKHRoaXMuZlR5cGUgIT0gbnVsbCkKLQkJCW5hbWUgPSB0aGlzLmZUeXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlpZihwbSAhPSBudWxsICYmIHBtLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsgCi0JCU9iamVjdCBkZXN0ID0gZ2V0QXJndW1lbnRzKCkuZ2V0RGVzdGluYXRpb24oKTsKLQkJCi0JCWlmKGRlc3QgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7CQkKLQkJCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BUeXBlTW92ZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKGZUeXBlLCAoKElQYWNrYWdlRnJhZ21lbnQpZGVzdCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQlpZihjaGFuZ2VzLmxlbmd0aCA+IDApCi0JCQkJbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkMDJmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZU1vdmVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQVHlwZU1vdmVSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdQYWNrYWdlKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld1BhY2thZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJCi0JCVN0cmluZyByZW5hbWVUZXh0ID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0KLQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkJU3RyaW5nIG1hdGNoVGV4dCA9IHRyYW5zLmdldEphdmFUZXh0KCkuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vIGlmIGl0J3MgYW4gaW1wb3J0IG9yIGpzcDp1c2VCZWFuLCB3ZSBuZWVkIHRvIGFkZCB0aGUgcGFja2FnZSBuYW1lIGFzIHdlbGwKLQkJaWYodHJhbnMuaXNJbXBvcnQoamF2YU1hdGNoLmdldE9mZnNldCgpKSB8fCB0cmFucy5pc1VzZUJlYW4oamF2YU1hdGNoLmdldE9mZnNldCgpKSB8fCBpc0Z1bGx5UXVhbGlmaWVkKG1hdGNoVGV4dCkpIHsKLQkJCWlmKCFnZXROZXdOYW1lKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGdldE5ld05hbWUoKSBpcyB0aGUgcGtnIG5hbWUKLQkJCQlyZW5hbWVUZXh0ID0gZ2V0TmV3TmFtZSgpICsgIi4iICsgcmVuYW1lVGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZW5hbWVUZXh0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzIsIG5ldyBTdHJpbmdbXXt0eXBlTmFtZSwgbmV3TmFtZX0pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjE2NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLQotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkKLQkJCi0JCUpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IodHlwZSwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUodHlwZSwgbmV3IEpTUFNlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTE2ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci0KLS8qKgotICogUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBwbHVnaW4ueG1sIGZpbGUgaWYgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCi0JcHJpdmF0ZSBJVHlwZSBmVHlwZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCXRoaXMuZlR5cGUgPSAoSVR5cGUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmKHRoaXMuZlR5cGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluYW1lID0gdGhpcy5mVHlwZS5nZXRTb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSAgSlNQVHlwZVJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKGZUeXBlLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQlpZihjaGFuZ2VzLmxlbmd0aCA+IDApCi0JCQltdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5M2NjZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENyZWF0ZXMgZG9jdW1lbnQgY2hhbmdlKHMpIGZvciBhIHR5cGUgcmVuYW1lLgotICogQ2hhbmdlcyBhcmUgY3JlYXRlZCBmb3IgZXZlcnkgdHlwZSAibWF0Y2giIGluIHRoZSB3b3Jrc3BhY2UKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0KLQlwdWJsaWMgSlNQVHlwZVJlbmFtZVJlcXVlc3RvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcih0eXBlLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gKElUeXBlKWdldEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCQotCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKTsKLQkJCi0JCVN0cmluZyBwa2cgPSBnZXRUeXBlKCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkJU3RyaW5nIG1hdGNoVGV4dCA9IHRyYW5zLmdldEphdmFUZXh0KCkuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vIGlmIGl0J3MgYW4gaW1wb3J0IG9yIGpzcDp1c2VCZWFuIG9yIGZ1bGx5IHF1YWxpZmllZCB0eXBlLCB3ZSBuZWVkIHRvIGFkZCB0aGUgcGFja2FnZSBuYW1lIGFzIHdlbGwKLQkJaWYodHJhbnMuaXNJbXBvcnQoamF2YU1hdGNoLmdldE9mZnNldCgpKSB8fCAvKnRyYW5zLmlzVXNlQmVhbihqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8Ki8gaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0JCQlpZighcGtnLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZW5hbWVUZXh0ID0gcGtnICsgIi4iICsgcmVuYW1lVGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZW5hbWVUZXh0OwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNCwgbmV3IFN0cmluZ1tde3R5cGVOYW1lLCBuZXdOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0Jhc2ljSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlM2RiYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0Jhc2ljSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci0KLS8qKgotICogQWNjZXB0cyBtYXRjaGVzIGZyb20gSlNQU2VhcmNoU3VwcG9ydC5zZWFyY2goLi4uKSByZXF1ZXN0LgotICogQWRhcHRzIHRoZSByZXN1bHRzIGZyb20gamF2YSB0byBKU1AgYW5kIGRpc3BsYXlzIGluIHRoZSBTZWFyY2hSZXN1bHRWaWV3LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBNYXBzIGphdmEgc2VhcmNoIGNvb3JkaW5hdGVzIHRvIGNvcnJlc3BvbmRpbmcgSlNQIGNvb3JkaW5hdGVzLgotCSAqIEFkZHMgdGhlIG1hdGNoZXMgdG8gdGhlIFNlYXJjaCBSZXN1bHRzIHZpZXcuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCQkJCi0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IG1hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2MgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0U2VhcmNoRG9jdW1lbnQobWF0Y2hEb2N1bWVudFBhdGgpOwotCQkKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQlKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBqYXZhU2VhcmNoRG9jID0gKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKXNlYXJjaERvYzsKLQkJCWludCBqc3BTdGFydCA9IGphdmFTZWFyY2hEb2MuZ2V0SnNwT2Zmc2V0KG1hdGNoLmdldE9mZnNldCgpKTsKLQkJCWludCBqc3BFbmQgPSBqYXZhU2VhcmNoRG9jLmdldEpzcE9mZnNldChtYXRjaC5nZXRPZmZzZXQoKSArIG1hdGNoLmdldExlbmd0aCgpKTsKLQotCQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBqYXZhU2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCQlTdHJpbmcganNwVGV4dCA9IHRyYW5zLmdldEpzcFRleHQoKTsKLQkJCVN0cmluZyBqYXZhVGV4dCA9IGphdmFTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQotCQkJaWYgKERFQlVHKSAKLQkJCQlkaXNwbGF5RGVidWdJbmZvKG1hdGNoLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0LCBqYXZhVGV4dCk7Ci0JCQotCQkJaWYgKGpzcFN0YXJ0ID4gLTEgJiYganNwRW5kID4gLTEpCi0JCQkJYWRkU2VhcmNoTWF0Y2gobmV3IERvY3VtZW50KHRyYW5zLmdldEpzcFRleHQoKSksIGphdmFTZWFyY2hEb2MuZ2V0RmlsZSgpLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWFyY2hEb2MKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRyYW5zbGF0aW9uCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJLy8gaW1wbGVtZW50IGluIHN1YmNsYXNzCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2JlZ2luUmVwb3J0aW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBiZWdpblJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZW5kUmVwb3J0aW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW5kUmVwb3J0aW5nKCkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbnRlclBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRlclBhcnRpY2lwYW50KFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW50ZXJQYXJ0aWNpcGFudCgpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZXhpdFBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGl0UGFydGljaXBhbnQoU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBleGl0UGFydGljaXBhbnQoKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnLgotCSAqIEBwYXJhbSBvcmlnTWF0Y2gKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAcGFyYW0gamF2YVRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcGxheURlYnVnSW5mbyhTZWFyY2hNYXRjaCBvcmlnTWF0Y2gsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQsIFN0cmluZyBqYXZhVGV4dCkgewotCi0JCWlmIChvcmlnTWF0Y2ggPT0gbnVsbCB8fCBqc3BTdGFydCA9PSAtMSB8fCBqc3BFbmQgPT0gLTEgfHwganNwRW5kIDwganNwU3RhcnQgfHwganNwVGV4dCA9PSBudWxsIHx8IGphdmFUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJhY2NlcHQgcG9zc2libGUgbWF0Y2ggW2pzcERvYzogIiArIG9yaWdNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpICsgIiAiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgIjoiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpICsgIl0/Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXRjaCBpbmZvOiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigidGhlIGphdmEgdGV4dCBpczoiICsgamF2YVRleHQuc3Vic3RyaW5nKG9yaWdNYXRjaC5nZXRPZmZzZXQoKSwgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIHNlYXJjaCBtYXRjaCB0cmFuc2xhdGVzIHRvIGpzcCBjb29yZHMgW3N0YXJ0OiAiICsganNwU3RhcnQgKyAiIGVuZDoiICsganNwRW5kICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgdGhlIGpzcCB0ZXh0IGlzOiIgKyBqc3BUZXh0LnN1YnN0cmluZyhqc3BTdGFydCwganNwRW5kKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhZWVjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaC5IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIFNldHMgdXAgRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZm9yIGpzcCBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcnMKLSAqLwotcHVibGljIGNsYXNzIEpTUEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgTGlzdCBmUHJvY2Vzc29yczsKLQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0vLwkJCSB0ZW1wb3JhcnksIHdvcmthcm91bmQgdG8gZGlzYWJsZSBmdW5jdGlvbiwgc2luY2UgdXNpbmcgdGhlIGZ1bmN0aW9uIAotLy8JCQkgY2FuIGVhc2lseSBjYXVzZSBkZWFkbG9jayB0byBvY2N1ci4KLS8vCQkJCQkgU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM2NjIKLS8vCQkJSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGpzcFByb2Nlc3NvciA9IG5ldyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLS8vCQkJZlByb2Nlc3NvcnMuYWRkKGpzcFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmMTVjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBDb25maWd1cmVzIGEgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHdpdGggSlNQIHBhcnRpdGlvbnMgYW5kIHJlZ2lvbnMKLSAqLwotcHVibGljIGNsYXNzIEpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQsIElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkF9OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVNlYXJjaFF1ZXJ5IGdldFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZWdpb25UZXh0LCBTdHJpbmcgcmVnaW9uVHlwZSwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IEpTUFNlYXJjaFF1ZXJ5KGZpbGUsIGdldEphdmFFbGVtZW50KGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0SmF2YUVsZW1lbnRzRm9yQ3VycmVudFNlbGVjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCXJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwID8gZWxlbWVudHNbMF0gOiBudWxsOwotCX0KLQotCS8qKgotCSAqIHVzZXMgSlNQVHJhbnNsYXRpb24gdG8gZ2V0IGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudGx5IHNlbGVjdGVkIElKYXZhRWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIElKYXZhRWxlbWVudFtdIGdldEphdmFFbGVtZW50c0ZvckN1cnJlbnRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50WzBdOwotCQkvLyBnZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyB2aWV3ZXIncyBkb2N1bWVudAotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjIxMQotCQkJCQllbGVtZW50cyA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzcFJhbmdlKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkNGY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQ7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IGV4dGVuZHMgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgewotCQotCXB1YmxpYyBKU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJc3VwZXIocXVlcnkpOwotCX0KLQkKLQlwdWJsaWMgTWF0Y2hbXSBnZXRNYXRjaGVzKCkgewotCQlyZXR1cm4gKChKU1BTZWFyY2hRdWVyeSlnZXRRdWVyeSgpKS5nZXRNYXRjaGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5NjE0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVNlYXJjaFF1ZXJ5PC9jb2RlPiBmb3IgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPnMgaW4gSlNQIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQkKLQkvKiogdGhlIElKYXZhRWxlbWVudCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZmlsZSAqKi8KLQlwcml2YXRlIElKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JCi0JcHVibGljIEpTUFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGZpbGUpOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCQotCS8vIGZvciBhY2Nlc3MgYnkgaW5uZXIgY2xhc3MKLQlwdWJsaWMgSlNQU2VhcmNoUXVlcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1F1ZXJ5KCkgewotCQkKLQkJY2xlYXJNYXRjaGVzKCk7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkvLyBpbmRleCB0aGUgZmlsZQotCQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSAgc3VwcG9ydC5hZGRKc3BGaWxlKGdldEZpbGUoKSk7Ci0JCQkKLQkJCVN0cmluZyBzY29wZVBhdGggPSBkZWxlZ2F0ZS5nZXRQYXRoKCk7Ci0JCQlKU1BTZWFyY2hTY29wZSBzaW5nbGVGaWxlU2NvcGUgPSBuZXcgSlNQU2VhcmNoU2NvcGUobmV3IFN0cmluZ1tde2dldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHNjb3BlUGF0aH0pOwotCQkJCi0JCQkvLyBwZXJmb3JtIGEgc2VhcmNocwotCQkJLy8gYnkgcGFzc2luZyBpbiB0aGlzIGpzcCBzZWFyY2ggcXVlcnksIHJlcXVzdG9yIGNhbiBhZGQgbWF0Y2hlcwotCQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShnZXRKYXZhRWxlbWVudCgpLCBzaW5nbGVGaWxlU2NvcGUsIG5ldyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIsIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmdbXSBhcmdzID0ge2dldFNlYXJjaFRleHQoKSwgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSwgZ2V0RmlsZW5hbWUoKX07Ci0JCXJldHVybiBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMCwgYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IEpTUFVJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCQlpZihnZXRGaWxlKCkgIT0gbnVsbCkKLQkJCWZpbGVuYW1lID0gZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRPY2N1cnJlbmNlc0NvdW50VGV4dCgpIHsKLQkJU3RyaW5nIGNvdW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcGFfVE9ETyBtYWtlIGR5bmFtaWMKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKLQkJcmV0dXJuIGZFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNjYW5SdW5JbkJhY2tncm91bmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQkKLQkJcmV0dXJuIG5ldyBKU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5YmYxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotCi0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaFJlcXVlc3RvciBleHRlbmRzIEJhc2ljSlNQU2VhcmNoUmVxdWVzdG9yIHsKLQkKLQlwcml2YXRlIElTZWFyY2hSZXF1ZXN0b3IgZkphdmFSZXF1ZXN0b3IgPSBudWxsOwotCQotCXB1YmxpYyBKU1BTZWFyY2hSZXF1ZXN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBKU1BTZWFyY2hSZXF1ZXN0b3IoSVNlYXJjaFJlcXVlc3RvciBqYXZhUmVxdWVzdG9yKSB7Ci0JCS8vIG5lZWQgdG8gcmVwb3J0IG1hdGNoZXMgdG8gamF2YVJlcXVlc3RvcgotCQl0aGlzLmZKYXZhUmVxdWVzdG9yID0gamF2YVJlcXVlc3RvcjsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJCi0JCWlmKCFqc3BGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCXRyeSB7Ci0JCQlsaW5lTnVtYmVyID0ganNwRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGpzcFN0YXJ0KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigib2Zmc2V0OiAiICsgSW50ZWdlci50b1N0cmluZyhqc3BTdGFydCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY3JlYXRlU2VhcmNoTWFya2VyKGpzcEZpbGUsIGpzcFN0YXJ0LCBqc3BFbmQsIGxpbmVOdW1iZXIpOwotCQkKLQkJaWYodGhpcy5mSmF2YVJlcXVlc3RvciAhPSBudWxsKSB7Ci0JCQlNYXRjaCBtYXRjaCA9IG5ldyBNYXRjaChqc3BGaWxlLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQpOwotCQkJdGhpcy5mSmF2YVJlcXVlc3Rvci5yZXBvcnRNYXRjaChtYXRjaCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VhcmNoTWFya2VyKElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgaW50IGxpbmVOdW1iZXIpIHsKLQkJCi0JCXRyeSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IGpzcEZpbGUuY3JlYXRlTWFya2VyKE5ld1NlYXJjaFVJLlNFQVJDSF9NQVJLRVIpOwotCQkJSGFzaE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoNCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKGpzcFN0YXJ0KSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcihqc3BFbmQpKTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGxpbmVOdW1iZXIpKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzNWQ4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIFNwZWNpYWwgcmVxdWVzdG9yIHRoYXQgYWRkcyBzZWFyY2ggcmVzdWx0cyBmb3Igc2luZ2xlIGZpbGUgc2VhcmNoCi0gKiAoVXNlZCBmb3IgSlNQRmluZE9jY3VycmVuY2VzIGFjdGlvbikuCi0gKiBJdCBncm91cHMgZWFjaCBtYXRjaCBhcyBpdCdzIG93biByZXN1bHQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgewotCi0JcHJpdmF0ZSBKU1BTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCQotCXB1YmxpYyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKEpTUFNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXRoaXMuZlF1ZXJ5ID0gcXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkvLyBhZGQgbWF0Y2ggdG8gSlNQIHF1ZXJ5Li4uCi0JCXRoaXMuZlF1ZXJ5LmFkZE1hdGNoKGpzcERvY3VtZW50LCBqc3BTdGFydCwganNwRW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUE1hdGNoUHJlc2VudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQTWF0Y2hQcmVzZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiMWEyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQTWF0Y2hQcmVzZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNYXRjaFByZXNlbnRhdGlvbiBpbXBsZW1lbnRzIElNYXRjaFByZXNlbnRhdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uI2NyZWF0ZUxhYmVsUHJvdmlkZXIoKQotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uI3Nob3dNYXRjaChvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaCwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd01hdGNoKE1hdGNoIG1hdGNoLCBpbnQgY3VycmVudE9mZnNldCwgaW50IGN1cnJlbnRMZW5ndGgsIGJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0vLwkJT2JqZWN0IG9iaiA9IG1hdGNoLmdldEVsZW1lbnQoKTsKLQkJLy8gc2hvdyBtYXRjaCBpbiBKU1AgZWRpdG9yCi0JCWlmKGFjdGl2YXRlKSB7Ci0JCQkvLyB1c2Ugc2hvdyBpbiB0YXJnZXQ/Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBqdXN0IHNlbGVjdAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUFF1ZXJ5UGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BRdWVyeVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGJmMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUFF1ZXJ5UGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLkVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5QYXR0ZXJuUXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guUXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFJlcXVlc3RvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeSAKLSAqLwotcHVibGljIGNsYXNzIEpTUFF1ZXJ5UGFydGljaXBhbnQgaW1wbGVtZW50cyBJUXVlcnlQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNzZWFyY2gob3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoKElTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBRdWVyeVNwZWNpZmljYXRpb24gcXVlcnlTcGVjaWZpY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCS8vaW5kZXhJZk5lZWRlZCgpOwotCQkKLQkJLy8gZG8gc2VhcmNoIGJhc2VkIG9uIHRoZSBwYXJ0aWN1bGFyIEphdmEgcXVlcnkKLQkJaWYocXVlcnlTcGVjaWZpY2F0aW9uIGluc3RhbmNlb2YgRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbikgewotCQkJLy8gZWxlbWVudCBzZWFyY2ggKGVnLiBmcm9tIGdsb2JhbCBmaW5kIHJlZmVyZW5jZXMgaW4gSmF2YSBmaWxlKQotCQkJRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbiBlbGVtZW50UXVlcnkgPSAoRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbilxdWVyeVNwZWNpZmljYXRpb247Ci0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRRdWVyeS5nZXRFbGVtZW50KCk7Ci0JCQkKLQkJCWlmKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFF1ZXJ5IFBhcnRpY2lwYW50IHNlYXJjaGluZyBvbiBFTEVNRU5UOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJU2VhcmNoUmVxdWVzdG9yIGpzcFJlcXVlc3RvciA9IG5ldyBKU1BTZWFyY2hSZXF1ZXN0b3IocmVxdWVzdG9yKTsKLQkJCQotCQkJLy8gcGFfVE9ETyBuZWVkIHRvIGFkYXB0IEphdmFTZWFyY2hTY29wZSB0byBhIEpTUFNlYXJjaFNjb3BlCi0JCQlKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuc2VhcmNoKGVsZW1lbnQsIG5ldyBKU1BTZWFyY2hTY29wZSgpLCBqc3BSZXF1ZXN0b3IpOwotCQkJCi0JCX0KLQkJZWxzZSBpZihxdWVyeVNwZWNpZmljYXRpb24gaW5zdGFuY2VvZiBQYXR0ZXJuUXVlcnlTcGVjaWZpY2F0aW9uKSB7Ci0JCQkKLQkJCS8vIHBhdHRlcm4gc2VhcmNoIChlZy4gZnJvbSBKYXZhIHNlYXJjaCBwYWdlKQotCQkJUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbiBwYXR0ZXJuUXVlcnkgPSAoUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbilxdWVyeVNwZWNpZmljYXRpb247Ci0JCQlTdHJpbmcgcGF0dGVybiA9IHBhdHRlcm5RdWVyeS5nZXRQYXR0ZXJuKCk7Ci0JCQkKLQkJCWlmKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFF1ZXJ5IFBhcnRpY2lwYW50IHNlYXJjaGluZyBvbiBQQVRURVJOOiAiICsgcGF0dGVybik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJU2VhcmNoUmVxdWVzdG9yIGpzcFJlcXVlc3RvciA9IG5ldyBKU1BTZWFyY2hSZXF1ZXN0b3IocmVxdWVzdG9yKTsKLQkJCQotCQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChwYXR0ZXJuLCAKLQkJCQkJCQkJCQkJCQluZXcgSlNQU2VhcmNoU2NvcGUoKSwgCi0JCQkJCQkJCQkJCQkJcGF0dGVyblF1ZXJ5LmdldFNlYXJjaEZvcigpLCAKLQkJCQkJCQkJCQkJCQlwYXR0ZXJuUXVlcnkuZ2V0TGltaXRUbygpLCAKLQkJCQkJCQkJCQkJCQlTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCwgCi0JCQkJCQkJCQkJCQkJZmFsc2UsIAotCQkJCQkJCQkJCQkJCWpzcFJlcXVlc3Rvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZXN0aW1hdGVUaWNrcyhvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGVzdGltYXRlVGlja3MoUXVlcnlTcGVjaWZpY2F0aW9uIGRhdGEpIHsKLQkJLy8gcGFfVE9ETyB1c2UgcHJvamVjdCBmaWxlIGNvdW50ZXIgZnJvbSBKU1BTZWFyY2hTdXBwb3J0Li4uCi0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNnZXRVSVBhcnRpY2lwYW50KCkKLQkgKi8KLQlwdWJsaWMgSU1hdGNoUHJlc2VudGF0aW9uIGdldFVJUGFydGljaXBhbnQoKSB7Ci0JCXJldHVybiBuZXcgSlNQTWF0Y2hQcmVzZW50YXRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMjY0OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIEpTUCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgSlNQVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIHNldHRpbmcgdGhlIHNhbWUgYXMgSFRNTAotCQlzdG9yZS5zZXREZWZhdWx0KEpTUFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUsICI8Iik7Ly8kTk9OLU5MUy0xJAotCi0JCS8vIEpTUCBTdHlsZSBQcmVmZXJlbmNlcwotCQlTdHJpbmcgTk9CQUNLR1JPVU5EQk9MRCA9ICIgfCBudWxsIHwgZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTI3LCAwLCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNDIsIDAsIDI1NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDE5MSwgOTUsIDYzKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5ULCBzdHlsZVZhbHVlKTsKLQkJCi0JCS8vIHNldCBkZWZhdWx0IG5ldyBqc3AgZmlsZSB0ZW1wbGF0ZSB0byB1c2UgaW4gbmV3IGZpbGUgd2l6YXJkCi0JCS8qCi0JCSAqIE5lZWQgdG8gZmluZCB0ZW1wbGF0ZSBuYW1lIHRoYXQgZ29lcyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgaWQgKG5hbWUKLQkJICogbWF5IGNoYW5nZSBmb3IgZGlmZmVybnQgbGFuZ3VhZ2UpCi0JCSAqLwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpLmZpbmRUZW1wbGF0ZUJ5SWQoIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NTA2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIEpTUCBVSQotICovCi1wdWJsaWMgY2xhc3MgSlNQVUlQcmVmZXJlbmNlTmFtZXMgewotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIGNvZGUgYXNzaXN0IGdldHMgYXV0byBhY3RpdmF0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFID0gZ2V0QXV0b1Byb3Bvc2VLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0JICogYXNzaXN0LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0JICogYXV0byBjb2RlIGFzc2lzdC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFX0NPREUgPSBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2VDb2RlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSBjdXN0b21pemVkIHRlbXBsYXRlcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19LRVkgPSBnZXRUZW1wbGF0ZXNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wbGF0ZXNLZXkoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jdXN0b21fdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIG5ldyBKU1AgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWViODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BDb2xvclBhZ2UgZXh0ZW5kcyBYTUxDb2xvclBhZ2UgewotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBzZXQgdXAgU3R5bGVkVGV4dENvbG9yUGlja2VyIGRpZmZlcmVudGx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JQaWNrZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGNvbG9yIHBpY2tlcgotCQlmUGlja2VyID0gbmV3IEpTUFN0eWxlZFRleHRDb2xvclBpY2tlcihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlmUGlja2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZlBpY2tlci5zZXRQcmVmZXJlbmNlU3RvcmUoZk92ZXJsYXlTdG9yZSk7Ci0JCXNldHVwUGlja2VyKGZQaWNrZXIpOwotCi0JCWZQaWNrZXIuc2V0VGV4dChnZXRTYW1wbGVUZXh0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUFycmF5TGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKWkubmV4dCgpKSk7CQotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5TYW1wbGVfSlNQX2RvYzsgLy8kTk9OLU5MUy0xJCA9ICI8JUAgcGFnZSBcblx0bGFuZ3VhZ2U9XCJqYXZhXCIgXG5cdGNvbnRlbnRUeXBlPVwidGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTFcIlxuJT5cbjxqc3A6aW5jbHVkZSBmbHVzaD1cInRydWVcIiBwYWdlPVwidGl0bGVCYXIuanNwXCIvPlxuXG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjEgLS0lPlxuPCVcblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG4lPlxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4yIC0tJT5cbjxqc3A6c2NyaXB0bGV0PlxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbjwvanNwOnNjcmlwdGxldD4iCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCi0JCWluaXRDb21tb25Db250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJY29udGV4dFN0eWxlTWFwLnJlbW92ZShET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKTsgLy8gbGVhdmUgY29udGVudCBiZXR3ZWVuIHRhZ3MgYWxvbmUKLQkJY29udGV4dFN0eWxlTWFwLnJlbW92ZShET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJY29udGV4dFN0eWxlTWFwLnJlbW92ZShET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQotCQkvLwljb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBIVE1MQ29sb3JNYW5hZ2VyLlNDUklQVF9BUkVBKTsKLQkJLy8JY29udGV4dFN0eWxlTWFwLnB1dChYTUxKU1BSZWdpb25Db250ZXh0cy5CTE9DS19URVhULCBIVE1MQ29sb3JNYW5hZ2VyLlNDUklQVF9BUkVBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCQkKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCQlpbml0Q29tbW9uRGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCWRlc2NyaXB0aW9ucy5yZW1vdmUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsgLy8gbGVhdmUgY29udGVudCBiZXR3ZWVuIHRhZ3MgYWxvbmUKLQkJZGVzY3JpcHRpb25zLnJlbW92ZShJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCBKU1BVSU1lc3NhZ2VzLkpTUF9EZWxpbWl0ZXJzX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiSlNQIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5ULCBKU1BVSU1lc3NhZ2VzLkpTUENvbG9yUGFnZV9qc3BfY29udGVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCQlpbml0Q29tbW9uU3R5bGVMaXN0KGxpc3QpOwotCQlsaXN0LnJlbW92ZShJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOyAvLyBsZWF2ZSBjb250ZW50IGJldHdlZW4gdGFncyBhbG9uZQotCQlsaXN0LnJlbW92ZShJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcikgewotCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcGlja2VyLnNldFBhcnNlcihtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCkuZ2V0UGFyc2VyKCkpOwotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbnMgZm9yIGhpZ2hsaWdodGluZyB0eXBlcwotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCS8vIG1hcCByZWdpb24gdHlwZXMgdG8gaGlnaGxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuSlNQX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2Ujc2F2ZVByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkNzFiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgQnV0dG9uIGZWYWxpZGF0ZUZyYWdtZW50czsKLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0KLQkJR3JvdXAgZyA9IGNyZWF0ZUdyb3VwKChDb21wb3NpdGUpIGMsIDEpOwotCQlnLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzApOwotCQlmVmFsaWRhdGVGcmFnbWVudHMgPSBjcmVhdGVDaGVja0JveChnLCBKU1BVSU1lc3NhZ2VzLkpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMSk7Ci0JCWJvb2xlYW4gdmFsaWRhdGVGcmFnbWVudHMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRFX0ZSQUdNRU5UUyk7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRTZWxlY3Rpb24odmFsaWRhdGVGcmFnbWVudHMpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCQkKLQkJc2V0U2l6ZSgoQ29tcG9zaXRlKWMpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnVpLkhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzRm9yTG9hZGluZ0dyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckxvYWRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIG5vIGxvYWRpbmcgcHJlZmVyZW5jZXMKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkgewotCQkvLyBubyBsb2FkaW5nIHByZWZlcmVuY2VzCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQlib29sZWFuIHZhbGlkYXRlRnJhZ21lbnRzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTKTsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldFNlbGVjdGlvbih2YWxpZGF0ZUZyYWdtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHNGb3JMb2FkaW5nR3JvdXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJLy8gbm8gbG9hZGluZyBwcmVmZXJlbmNlcwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlib29sZWFuIHZhbGlkYXRlRnJhZ21lbnRzID0gZlZhbGlkYXRlRnJhZ21lbnRzLmdldFNlbGVjdGlvbigpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHZhbGlkYXRlRnJhZ21lbnRzKTsKLQkJc3VwZXIuc3RvcmVWYWx1ZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnVpLkhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlI3N0b3JlVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJLy8gbm8gbG9hZGluZyBwcmVmZXJlbmNlcwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzBjZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCi0JCVRleHQgbGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlsYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCVByZWZlcmVuY2VMaW5rQXJlYSBmaWxlRWRpdG9yc0FyZWEgPSBuZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULk5PTkUsICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiLCBKU1BVSU1lc3NhZ2VzLkpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzEsLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCWZpbGVFZGl0b3JzQXJlYS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlQcmVmZXJlbmNlTGlua0FyZWEgY29udGVudFR5cGVBcmVhID0gbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5OT05FLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlIiwgSlNQVUlNZXNzYWdlcy5KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQljb250ZW50VHlwZUFyZWEuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2Nyb2xsYmFycyBmb3IgdGhpcyBwYXJlbnQgd2hlbiBuZWVkZWQKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHNjMSk7Ci0JCXNjMS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbm90IGNhbGxpbmcgc2V0U2l6ZSBmb3IgY29tcG9zaXRlIHdpbGwgcmVzdWx0IGluIGEgYmxhbmsgY29tcG9zaXRlLAotCQkvLyBzbyBjYWxsaW5nIGl0IGhlcmUgaW5pdGlhbGx5Ci0JCS8vIHNldFNpemUgYWN0dWFsbHkgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGFsbCBjb250cm9scyBhcmUgY3JlYXRlZCwKLQkJLy8gc28gc2Nyb2xsZWRDb21wb3NpdGUKLQkJLy8gaGFzIGNvcnJlY3QgbWluU2l6ZQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IFRoZSBmb250IGlzIHNldCBoZXJlIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBjbGFzcyBpbmhlcml0aW5nCi0JCQkvLyAgICAgICB0aGlzIGJhc2UgY2xhc3MgbWF5IGFkZCB3aWRnZXRzIHRvIHRoZSBkaWFsb2cuICAgc2V0U2l6ZQotCQkJLy8gICAgICAgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgd2UgZ28gbGl2ZS4KLQkJCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJUG9pbnQgbWluU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJY29tcG9zaXRlLnNldFNpemUobWluU2l6ZSk7Ci0JCQkvLyBzZXQgc2Nyb2xsYmFyIGNvbXBvc2l0ZSdzIG1pbiBzaXplIHNvIHBhZ2UgaXMgZXhwYW5kYWJsZSBidXQKLQkJCS8vIGhhcyBzY3JvbGxiYXJzIHdoZW4gbmVlZGVkCi0JCQlpZiAoY29tcG9zaXRlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQkJCQlzYzEuc2V0TWluU2l6ZShtaW5TaXplKTsKLQkJCQlzYzEuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJCQlzYzEuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFN0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFN0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWJkODA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi0vKioKLSogT3ZlcnJpZGVzIFN0eWxlZFRleHRDb2xvclBpY2tlciBmb3Igc3BlY2lhbCBlbmFibGVtZW50IGJlaGF2aW9yIAotKiBmb3IgSlNQQ29udGVudCAob25seSBiYWNrZ3JvdW5kIHNldHRhYmxlKQotKiovCi1wdWJsaWMgY2xhc3MgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyIGV4dGVuZHMgU3R5bGVkVGV4dENvbG9yUGlja2VyIHsKLQkKLQlwdWJsaWMgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUuCi0JICogT3ZlcnJpZGRlbiB0byBkaXNhYmxlIGZvcmVncm91bmQgY29sb3IsIGJvbGQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJc3VwZXIuYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQotCQlpZihuYW1lZFN0eWxlID09IElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCkgewotCQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmIChzaG93SXRhbGljKQotCQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDE1MWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIEpTUCB0ZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEpTUFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBKU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlKU1BVSVBsdWdpbiBqc3BFZGl0b3JQbHVnaW4gPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoanNwRWRpdG9yUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShqc3BFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVTdG9yZSgpKTsKLQkJc2V0Q29udGV4dFR5cGVSZWdpc3RyeShqc3BFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAJICBib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0gIAkgIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkgIHJldHVybiBvazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTU4ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb250YWlucyBhIHNldCBvZiBwcm9qZWN0aW9uIG1vZGVsIGFkZGl0aW9ucy9kZWxldGlvbnMvbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBOb2RlIGZOb2RlOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZEZWxldGlvbnM7Ci0JcHJpdmF0ZSBNYXAgZkFkZGl0aW9uczsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmTW9kaWZpY2F0aW9uczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxMmVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogbW9kZWwgbm9kZSBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZQcm9qZWN0aW9uVmlld2VyczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJc3VwZXIoYWRhcHRlcktleSk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKSB7Ci0JCXRoaXMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSBwYXJlbnQgb2YgdGFyZ2V0IGlmIHRhcmdldCBpcyB0aGUKLQkgKiAiYWRhcHQtYWJsZSIgbm9kZQotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAoKGlzQWN0aXZlKCkpICYmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSAmJiAoKE5vZGUpIHRhcmdldCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCi0JCQkJLy8gYWN0dWFsbHkgd29yayB3aXRoIHRoZSBwYXJlbnQgbm9kZSB0byBsaXN0ZW4gZm9yIGFkZCwKLQkJCQkvLyBkZWxldGUgZXZlbnRzCi0JCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIHBhcmVudE5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHBhcmVudDsKLQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIHBhcmVudEFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKSBwYXJlbnROb3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCQkJaWYgKHBhcmVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IGFkYXB0ZXIgZm9yIHBhcmVudAotCQkJCQkJcGFyZW50QWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwodGhpcyk7Ci0JCQkJCQlwYXJlbnROb3RpZmllci5hZGRBZGFwdGVyKHBhcmVudEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJCS8vIGNhbGwgdXBkYXRlIG9uIHBhcmVudCBiZWNhdXNlIGEgbmV3IG5vZGUgaGFzIGp1c3QgYmVlbgotCQkJCQkvLyBhZGRlZAotCQkJCQlwYXJlbnRBZGFwdGVyLnVwZGF0ZUFkYXB0ZXIocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJLy8gbm9kZSBpcyBvbmx5IHByb2plY3RhYmxlIGlmIGl0IGlzIGhlYWQsIGJvZHksIHNjcmlwdCwgc3R5bGUsCi0JCQkvLyB0YWJsZSwgdWwsIG9sIHRhZ3MKLQkJCWlmIChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZhY3RvcnkgaXMgY3VycmVudGx5IGFjdGl2ZWx5IG1hbmFnaW5nIHByb2plY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCAmJiAhZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0aW9uIHZpZXdlciBpZgotCSAqIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkCi0JICogd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucywgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gY3JlYXRlIGEgY2hhbmdlIG9iamVjdCBmb3IgbGF0ZXN0IGNoYW5nZSBhbmQgYWRkIHRvIHF1ZXVlCi0JCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSA9IG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucyk7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMuZ2V0KHZpZXdlcik7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnbyB0aHJvdWdoIGV2ZXJ5IHByb2plY3Rpb252aWV3ZXIgYW5kIGNhbGwKLQkJLy8gcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQkJaW5mb3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHZpZXdlciB0byBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzIGZhY3RvcnkgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdmlld2VyJ3MgZG9jdW1lbnQgYW5kIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCSAqICAgICAgICAgICAgYXJlIG5vdCBudWxsCi0JICovCi0Jdm9pZCBhZGRQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHJlbW92ZSBvbGQgZW50cnkgaWYgaXQgZXhpc3RzCi0JCXJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzID09IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgbmV3IG9iamVjdCBjb250YWluaW5nIHByb2plY3Rpb24gdmlld2VyIGFuZCBpdHMgaW5mbwotCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IG5ldyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24odmlld2VyKTsKLQkJZlByb2plY3Rpb25WaWV3ZXJzLnB1dCh2aWV3ZXIsIGluZm8pOwotCQlpbmZvLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiB2aWV3ZXIgZnJvbSB0aGUgbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcwotCSAqIGZhY3RvciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCByZW1vdmVQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBvZiB2aWV3ZXJzCi0JCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5yZW1vdmUodmlld2VyKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vIGlmIHJlbW92aW5nIGxhc3QgcHJvamVjdGlvbiB2aWV3ZXIsIGNsZWFyIG91dCBldmVyeXRoaW5nCi0JCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFlZGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGV4dGVuZHMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCB7Ci0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCgpIHsKLQkJdGhpcyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJc3VwZXIoYWRhcHRlcktleSk7Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgcGFyZW50IG9mIHRhcmdldCBpZiB0YXJnZXQgaXMgdGhlCi0JICogImFkYXB0LWFibGUiIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKChOb2RlKSB0YXJnZXQpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkpIHsKLQotCQkJCS8vIGFjdHVhbGx5IHdvcmsgd2l0aCB0aGUgcGFyZW50IG5vZGUgdG8gbGlzdGVuIGZvciBhZGQsCi0JCQkJLy8gZGVsZXRlIGV2ZW50cwotCQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJSU5vZGVOb3RpZmllciBwYXJlbnROb3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBwYXJlbnQ7Ci0JCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQIHBhcmVudEFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1ApIHBhcmVudE5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQkJCWlmIChwYXJlbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhZGFwdGVyIGZvciBwYXJlbnQKLQkJCQkJCXBhcmVudEFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AodGhpcyk7Ci0JCQkJCQlwYXJlbnROb3RpZmllci5hZGRBZGFwdGVyKHBhcmVudEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJCS8vIGNhbGwgdXBkYXRlIG9uIHBhcmVudCBiZWNhdXNlIGEgbmV3IG5vZGUgaGFzIGp1c3QgYmVlbgotCQkJCQkvLyBhZGRlZAotCQkJCQlwYXJlbnRBZGFwdGVyLnVwZGF0ZUFkYXB0ZXIocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJLy8gbm9kZSBpcyBvbmx5IHByb2plY3RhYmxlIGlmIGl0IGlzIGpzcCBzY3JpcHRsZXQgdGFnCi0JCQlpZiAoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVULmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NjIxYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIHdpdGggcHJvamVjdGlvbiBhbm5vdGF0aW9ucyBmb3IgdGhpcwotICogYWRhcHRlciBub2RlJ3MgY2hpbGRyZW4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgY2xhc3MgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXh0ZW5kcyBQcm9qZWN0aW9uQW5ub3RhdGlvbiB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmSXNWaXNpYmxlID0gZmFsc2U7IC8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCXByaXZhdGUgTm9kZSBmTm9kZTsKLQotCQlwdWJsaWMgVGFnUHJvamVjdGlvbkFubm90YXRpb24oTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIGZOb2RlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBEb2VzIG5vdCBwYWludCBoaWRkZW4gYW5ub3RhdGlvbnMuIEFubm90YXRpb25zIGFyZSBoaWRkZW4gd2hlbiB0aGV5Ci0JCSAqIG9ubHkgc3BhbiBvbmUgbGluZS4KLQkJICogCi0JCSAqIEBzZWUgUHJvamVjdGlvbkFubm90YXRpb24jcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIENhbnZhcyBjYW52YXMsIFJlY3RhbmdsZSByZWN0YW5nbGUpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvKgotCQkJICogb25seSBuZWVkIHRvIGNoZWNrIGFubm90YXRpb25zIHRoYXQgYXJlIGV4cGFuZGVkIGJlY2F1c2UgaGlkZGVuCi0JCQkgKiBhbm5vdGF0aW9ucyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGdpdmVuIHRoZSBjaGFuY2UgdG8KLQkJCSAqIGNvbGxhcHNlLgotCQkJICovCi0JCQlpZiAoIWlzQ29sbGFwc2VkKCkpIHsKLQkJCQkvLyB3b3JraW5nIHdpdGggcmVjdGFuZ2xlLCBzbyBsaW5lIGhlaWdodAotCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJCWlmIChtZXRyaWNzICE9IG51bGwpIHsKLQkJCQkJLy8gZG8gbm90IGRyYXcgYW5ub3RhdGlvbnMgdGhhdCBvbmx5IHNwYW4gb25lIGxpbmUgYW5kCi0JCQkJCS8vIG1hcmsgdGhlbSBhcyBub3QgdmlzaWJsZQotCQkJCQlpZiAoKHJlY3RhbmdsZS5oZWlnaHQgLyBtZXRyaWNzLmdldEhlaWdodCgpKSA8PSAxKSB7Ci0JCQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmSXNWaXNpYmxlID0gdHJ1ZTsKLQkJCXN1cGVyLnBhaW50KGdjLCBjYW52YXMsIHJlY3RhbmdsZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb24jbWFya0NvbGxhcHNlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtYXJrQ29sbGFwc2VkKCkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8vIGRvIG5vdCBtYXJrIGNvbGxhcHNlZCBpZiBhbm5vdGF0aW9uIGlzIG5vdCB2aXNpYmxlCi0JCQlpZiAoZklzVmlzaWJsZSkKLQkJCQlzdXBlci5tYXJrQ29sbGFwc2VkKCk7Ci0JCX0KLQl9Ci0KLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZkFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIGZUYWdBbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeSkgewotCQlmQWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJUG9zaXRpb24gcG9zID0gbnVsbDsKLQkJaWYgKGZBZGFwdGVyRmFjdG9yeS5pc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkvLyByZWdpb24tYmFzZWQKLQkJCQkvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uCi0JCQkJLy8gaW5jcmVhc2Ugd2hlbiBhZGQgbmV3bGluZQotCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyAvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gSVJlZ2lvbiBzdGFydExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBJUmVnaW9uIGVuZExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnRMaW5lUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBlbmRMaW5lUmVnaW9uLmdldE9mZnNldCgpICsKLQkJCQkvLyBlbmRMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIGlmIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0KLQkJCQkvLyBzdGFydE9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIG5vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCByZWdpb24gaW5jcmVhc2UKLQkJCQkvLyAvLyB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpZiAoZW5kTGluZSArIDEgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkpIHsKLQkJCQkvLyBpbnQgb2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzdGFydExpbmUpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUgKyAxKTsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBudWxsLCB4KTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQkJLy8gfQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIEZpbmQgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUgaW4gdGhlIGN1cnJlbnQgbGlzdCBvZiBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbnMgZm9yIHRoaXMgYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKE5vZGUgbm9kZSkgewotCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gbnVsbDsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgYW5ubyA9PSBudWxsKSB7Ci0JCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYSA9IChUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJCU5vZGUgbiA9IGEuZ2V0Tm9kZSgpOwotCQkJCWlmIChub2RlLmVxdWFscyhuKSkgewotCQkJCQlhbm5vID0gYTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpICYmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChOb2RlKSBub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBvZiBhbGwgdGhlIG5vZGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCB1cGRhdGVBZGFwdGVyKE5vZGUgbm9kZSkgewotCQl1cGRhdGVBZGFwdGVyKG5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlIGFuZCBhZGRzIGFsbCBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIHZpZXdlciAoZm9yIG5ld2x5IGFkZGVkCi0JICogdmlld2VycykKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihjaGlsZE5vZGUpOwotCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleGlzdGluZyA9IGdldEV4aXN0aW5nQW5ub3RhdGlvbihjaGlsZE5vZGUpOwotCQkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCQkJYWRkaXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChleGlzdGluZywgbmV3UG9zKTsKLQkJCQkJCS8vIHJlbW92ZSBmcm9tIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGRlbGV0ZQotCQkJCQkJZlRhZ0Fubm90YXRpb25zLnJlbW92ZShleGlzdGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGluIHRoZSBlbmQsIHdhbnQgdG8gZGVsZXRlIGFueXRoaW5nIGxlZnRvdmVyIGluIG9sZCBsaXN0LCBhZGQKLQkJCS8vIGV2ZXJ5dGhpbmcgaW4gYWRkaXRpb25zLCBhbmQgdXBkYXRlIGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHByb2plY3Rpb25Bbm5vdGF0aW9ucwotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBvbGRMaXN0ID0gbnVsbDsKLQkJCWlmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW9sZExpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gbW9kaWZ5TGlzdCA9IG51bGw7Ci0JCQlpZiAoIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZnlMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIHByb2plY3Rpb25Bbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0KLQkJCS8vIHNwZWNpZmljYWxseSBhZGQgYWxsIGFubm90YXRpb25zIHRvIHZpZXdlcgotCQkJaWYgKHZpZXdlciAhPSBudWxsICYmICFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBudWxsLCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMsIG51bGwsIHZpZXdlcik7Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgdXBkYXRlIHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHRvIHVwZGF0ZQotCQkJaWYgKChvbGRMaXN0ICE9IG51bGwgJiYgb2xkTGlzdC5sZW5ndGggPiAwKSB8fCAoIWFkZGl0aW9ucy5pc0VtcHR5KCkpIHx8IChtb2RpZnlMaXN0ICE9IG51bGwgJiYgbW9kaWZ5TGlzdC5sZW5ndGggPiAwKSkKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG9sZExpc3QsIGFkZGl0aW9ucywgbW9kaWZ5TGlzdCk7Ci0JCX0KLQotCQkvLyBzYXZlIG5ldyBsaXN0IG9mIGFubm90YXRpb25zCi0JCWZUYWdBbm5vdGF0aW9ucyA9IHByb2plY3Rpb25Bbm5vdGF0aW9uczsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUgIT0gbnVsbCA/IG5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwudXBkYXRlQWRhcHRlciAoIiArIG5vZGVOYW1lICsgIik6IiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk1MzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotLyoqCi0gKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCB3aXRoIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgZm9yIHRoaXMKLSAqIGFkYXB0ZXIgbm9kZSdzIGNoaWxkcmVuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCBleHRlbmRzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCB7Ci0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBmYWN0b3J5KSB7Ci0JCXN1cGVyKGZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuY2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NGQxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGFsc28gbWFuYWdlcyB1cGRhdGluZwotICogdGhlIHZpZXdlcidzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotICovCi1jbGFzcyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uICYmIGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCQlpZiAoZkluZm8uaGFzQ2hhbmdlc1F1ZXVlZCgpKQotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW5mbykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXNzZW50aWFsbHkgYSBwb3N0IGRvY3VtZW50IGNoYW5nZWQgbGlzdGVuZXIgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYWZ0ZXIKLQkgKiBkb2N1bWVudGNoYW5nZWQgaGFzIGJlZW4gZmlyZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtKElEb2N1bWVudCBkb2N1bWVudCwgSURvY3VtZW50TGlzdGVuZXIgb3duZXIpIHsKLQkJCWZJbmZvLmFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjdXJyZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci0JLyoqCi0JICogRG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKgotCSAqIExpc3RlbmVyIHRvIGZQcm9qZWN0aW9uVmlld2VyJ3MgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZEb2N1bWVudExpc3RlbmVyOwotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBkb2N1bWVudCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0RvY3VtZW50Q2hhbmdpbmcgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24oUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJZkRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsID0gdmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQl9Ci0KLQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID09IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCX0KLQotCXZvaWQgc2V0SXNEb2N1bWVudENoYW5naW5nKGJvb2xlYW4gY2hhbmdpbmcpIHsKLQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IGNoYW5naW5nOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Q2hhbmdpbmcoKSB7Ci0JCXJldHVybiBmSXNEb2N1bWVudENoYW5naW5nOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHBlbmRpbmcgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdG8gdGhlCi0JICogcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXZvaWQgYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCkgewotCQlMaXN0IHF1ZXVlZENoYW5nZXMgPSBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpOwotCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGVuZGluZyBhbm5vdGF0aW9uIGNoYW5nZXMgYW5kIGFwcGx5Ci0JCS8vIHRoZW0gdG8KLQkJLy8gdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCQl3aGlsZSAoIXF1ZXVlZENoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBjaGFuZ2VzID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKSBxdWV1ZWRDaGFuZ2VzLnJlbW92ZSgwKTsKLQkJCXRyeSB7Ci0JCQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwubW9kaWZ5QW5ub3RhdGlvbnMoY2hhbmdlcy5nZXREZWxldGlvbnMoKSwgY2hhbmdlcy5nZXRBZGRpdGlvbnMoKSwgY2hhbmdlcy5nZXRNb2RpZmljYXRpb25zKCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgbG9nIGl0IGJlIGNvbnRpbnVlCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbm5vdGF0aW9uIGNoYW5nZXMgcXVldWVkIHVwLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZXNRdWV1ZWQoKSB7Ci0JCXJldHVybiAhZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UpIHsKLQkJLyoKLQkJICogZnV0dXJlX1RPRE86IG1heWJlIGltcHJvdmUgYnkgY2hlY2tpbmcgaWYgYW5ub3RhdGlvbiBwcm9qZWN0aW9uCi0JCSAqIG1vZGVsIGNoYW5nZSBhbHJlYWR5IGV4aXN0cyBmb3Igbm9kZS4gaWYgc28sIHRocm93IG91dCBvbGQgY2hhbmdlLgotCQkgKi8KLQkJZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5hZGQobmV3Q2hhbmdlKTsKLQotCQkvLyBpZiBkb2N1bWVudCBpc24ndCBjaGFuZ2luZywgZ28gYWhlYWQgYW5kIGFwcGx5IGl0Ci0JCWlmICghaXNEb2N1bWVudENoYW5naW5nKCkpIHsKLQkJCWFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gYWRkIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWdldERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gcmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXREb2N1bWVudCgpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgcXVldWVkIGNoYW5nZXMgc2luY2UgaXQgbWF5IG5vIGxvbmdlcgotCQkvLyBiZSBhY2N1cmF0ZQotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzICE9IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcy5jbGVhcigpOwotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY2NmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgSlNQLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBjaGlsZCBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvciBwZXJmb3JtYW5jZQotCSAqIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0NISUxEUkVOID0gMTA7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2Ygc2libGluZyBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvcgotCSAqIHBlcmZvcm1hbmNlIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJQkxJTkdTID0gMTAwMDsKLQotCS8qKgotCSAqIEFkZHMgYW4gYWRhcHRlciB0byBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjaGlsZExldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBjaGlsZExldmVsKSB7Ci0JCS8vIHN0b3AgYWRkaW5nIGluaXRpYWwgYWRhcHRlcnMgTUFYX0NISUxEUkVOIGxldmVscyBkZWVwIGZvcgotCQkvLyBwZXJmb3JtYW5jZSBzYWtlCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllciAmJiBjaGlsZExldmVsIDwgTUFYX0NISUxEUkVOKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCB1cGRhdGUgdGhlCi0JCQkvLyBhZGFwdGVyIHdpdGggcHJvamVjdGlvbiBpbmZvcm1hdGlvbgotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AgYWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCkgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIobm9kZSwgZlZpZXdlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IGNhbGwgZ2V0YWRhcHRlciBzbyB0aGUgYWRhcHRlciBpcyBjcmVhdGVkIGFuZAotCQkJCS8vIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQKLQkJCQlub3RpZmllci5nZXRBZGFwdGVyRm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBhZGFwdGVyMiA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyMi51cGRhdGVBZGFwdGVyKG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZCBhbmQKLQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJfQotCQkJaW50IHNpYmxpbmdMZXZlbCA9IDA7Ci0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsICYmIHNpYmxpbmdMZXZlbCA8IE1BWF9TSUJMSU5HUykgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgY2hpbGRMZXZlbCArIDEpOwotCQkJCSsrc2libGluZ0xldmVsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIGFkZHMgYW4gYWRhcHRlciBvbnRvIGVhY2ggZm9yIHRyYWNraW5nCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCQkrK3NpYmxpbmdMZXZlbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgdG8gdXNlIHdpdGggdGhpcwotCSAqIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTAotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBnZXRBZGFwdGVyRmFjdG9yeUhUTUwoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBuZXdGYWN0b3J5ID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwpIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuZ2V0QWRhcHRlckZhY3RvcnlIVE1MOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCB0byB1c2Ugd2l0aCB0aGlzIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZ2V0QWRhcHRlckZhY3RvcnlKU1AoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc01vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JCQkJCS8vIGdldHRpbmcgdGhlIHByb2plY3Rpb25tb2RlbG5vZGVhZGFwdGVyIGZvciB0aGUgZmlyc3QKLQkJCQkJLy8gdGltZQotCQkJCQkvLyBzbyBkbyBzb21lIGluaXRpYWxpemluZwotCQkJCQlpZiAoIWZhY3RvcnlSZWdpc3RyeS5jb250YWlucyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcykgJiYgY3JlYXRlSWZOZWVkZWQpIHsKLQkJCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBuZXdGYWN0b3J5ID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCgpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBmYWN0b3J5IHJlZ2lzdHJ5Ci0JCQkJCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShuZXdGYWN0b3J5KTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gcHJvcG9nYXRpbmcgYWRhcHRlcgotCQkJCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc01vZGVsOwotCQkJCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChwcm9wYWdhdGluZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXdGYWN0b3J5KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBmYWN0b3J5Ci0JCQkJCWZhY3RvcnkgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQKSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuZ2V0QWRhcHRlckZhY3RvcnlKU1A6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gY2xlYXIgb3V0IG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkvLyBzZXQgcHJvamVjdGlvbiB2aWV3ZXIgb24gbmV3IGRvY3VtZW50J3MgYWRhcHRlciBmYWN0b3J5Ci0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5SlNQKHRydWUpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeTIgPSBnZXRBZGFwdGVyRmFjdG9yeUhUTUwodHJ1ZSk7Ci0JCQlpZiAoZmFjdG9yeTIgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkyLmFkZFByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCQl9Ci0KLQkJCWFkZEFsbEFkYXB0ZXJzKCk7Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnlKU1AoZmFsc2UpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5MiA9IGdldEFkYXB0ZXJGYWN0b3J5SFRNTChmYWxzZSk7Ci0JCWlmIChmYWN0b3J5MiAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5Mi5yZW1vdmVQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGFsbCBhbm5vdGF0aW9ucwotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkKLQkJCWZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLnJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0KLQkJcmVtb3ZlQWxsQWRhcHRlcnMoKTsKLQotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRW5hYmxlZCgpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gYWRhcHRlciBmcm9tIG5vZGUgYW5kIGl0cyBjaGlsZHJlbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGxldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKE5vZGUgbm9kZSwgaW50IGxldmVsKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgcmVtb3ZlIGl0Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJbm90aWZpZXIucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCX0KLQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlcjIgIT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcjIpOwotCQkJfQotCi0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGxldmVsICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgcmVtb3ZlcyBhZGFwdGVyIGZyb20gZWFjaCBmb3IgY2xlYW51cAotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDhjMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQIGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0KLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyB0aGVzZSBhcmUgdGhlIG1haW4gZmFjdG9yaWVzLCBvbiBtb2RlbCdzIGZhY3RvcnkgcmVnaXN0cnkKLQkJYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIC0tLS0tLS0KLQkJLy8gTXVzdCB1cGRhdGUvYWRkIHRvIHByb3BhZ2F0aW5nIGFkYXB0ZXJzIGhlcmUgdG9vCi0JCWFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IG5ldyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChwcm9wYWdhdGluZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCS8vIHdoYXQgdG8gZG8/Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNpc0ZvcihDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9ySlNQKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODFiZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSlNQIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJqc3BfY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmNjNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckpTUCBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlcnsKLQotCXByaXZhdGUgU3RyaW5nIGZMYW5ndWFnZSA9IG51bGw7Ci0KLQkvLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXSB7Ci0JLy8gImphdmFzY3JpcHQiLCAiamF2YXNjcmlwdDEuMCIsICJqYXZhc2NyaXB0MS4xXzMiLCAiamF2YXNjcmlwdDEuMiIsCi0JLy8gImphdmFzY3JpcHQxLjMiLCAiamF2YXNjcmlwdDEuNCIsICJqYXZhc2NyaXB0MS41IiwgImphdmFzY3JpcHQxLjYiLAotCS8vICJqc2NyaXB0IiwgInNhc2hzY3JpcHQiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JLy8gLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JLy8gLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJAotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLyoqCi0JCSAqIGEgbWV0aG9kIHRvIGNlbnRyYWxpemUgYWxsIHRoZSAic3l0bGUgcnVsZXMiIGZvciByZWdpb25zCi0JCSAqLwotCQlUZXh0QXR0cmlidXRlIHJlc3VsdCA9IG51bGw7Ci0JCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGNvbWluZyB0aHJvdWdoIG51bGwsIGJ1dCBqdXN0IHRvIGNhdGNoIGl0Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJfQotCQllbHNlIHsKLQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UpKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkJCX0KLQkJCQkvLyA9PT09PT09PT09PT0gVGhlc2UgYXJlIGluIGNvbW1vbiB3aXRoIFhNTCAtLS0gKGZvciBYTUwgZm9ybQotCQkJCS8vIG9mIHRhZ3MpCi0JCQkJLy8gICAgICAgICAgICAgIE5vdGU6IHRoaXMgYXNzdW1lJ3MgdGhpcyBwcm92aWRlciBpcyBvbmx5IGNhbGxlZCBmb3IKLQkJCQkvLyAgICAgICAgICAgICAgdHJ1ZSBKU1AgTm9kZXMuIElmIGl0cyBjYWxsZWQgZm9yIG90aGVycywgdGhlbiB0aGlzIHdpbGwKLQkJCQkvLyAgICAgICAgICAgICAgY2F1c2UgdGhlaXIgdGFnIG5hbWVzIHRvIGJlIGhpZ2hsaWdodGVkIHRvbyEKLQkJCQkvLyAgICAgICAgICAgICAgRnVydGhlciBjaGVja3MgY291bGQgYmUgZG9uZSB0byBwcmV2ZW50IHRoYXQsIGJ1dCBkb2Vzbid0Ci0JCQkJLy8gICAgICAgICAgICAgIHNlZW0gd29ydGggaXQsIHNpbmNlIGlmIGFkcGF0ZXJzIGZhY3RvcmllcyBhcmUgd29ya2luZwotCQkJCS8vIHJpZ2h0LAotCQkJCS8vICAgICAgICAgICAgICB0aGVuIHdvdWxkbid0IGJlIG5lZWRlZC4KLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkJCX0KLQkJCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJCX0KLQkJCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJCQl9Ci0KLQkJCQkvLyBETVc6IGFkZGVkIDkvMS8yMDAyIFVuZGVmaW5lZCBjb2xvciBtYXkgbmVlZCBhZGRqdXN0bWVudCA6KQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpCi0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCi0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKQotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJCQkvLyBETVcgYWRkZWQgOC8zMC8yMDAyIC0tIHNob3VsZCBwcm92aWRlIEpTUCBzcGVjaWZpYwotCQkJCS8vIHByZWZlcmVuY2UgZm9yICJjdXN0b20gdGFnIGNvbnRlbnQiIChib3RoIHRhZyBkZXBlbmRlbnQsCi0JCQkJLy8gQkxPQ0tFRF9URVhULCBhbmQgbm90LCBYTUwgQ09OVEVOVCkKLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpCi0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKQotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQkJfQotCQl9Ci0JCS8vIGRlZmF1bHQsIHJldHVybiBudWxsIHRvIHNpZ25hbCAibm90IGhhbmRsZWQiCi0JCS8vIGluIHdoaWNoIGNhc2UsIG90aGVyIGZhY3RvcmllcyBzaG91bGQgYmUgdHJpZWQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFuZ3VhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlyZXR1cm4gZkxhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhbmd1YWdlLgotCSAqIAotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqICAgICAgICAgICAgVGhlIGxhbmd1YWdlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQl0aGlzLmZMYW5ndWFnZSA9IGxhbmd1YWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTUEphdmEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTUEphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNTAyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9JU3R5bGVDb25zdGFudHNKU1BKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pTUEphdmEgewotCVN0cmluZyBKQVZBX0tFWVdPUkQgPSAia2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9TSU5HTEVfTElORV9DT01NRU5UID0gInNpbmdsZV9saW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29kZVNjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2RlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjhlZDY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2RlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkVuZE9mTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5TaW5nbGVMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV29yZFJ1bGU7Ci0KLS8qKgotICogQSBKYXZhIGNvZGUgc2Nhbm5lci4KLSAqLwotY2xhc3MgSmF2YUNvZGVTY2FubmVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRTY2FubmVyIHsKLQlwcml2YXRlIElUb2tlbiBmS2V5d29yZFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZUeXBlVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlN0cmluZ1Rva2VuOwotCXByaXZhdGUgSVRva2VuIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZEZWZhdWx0VG9rZW47Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0tleXdvcmRzID0geyJhYnN0cmFjdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiYnJlYWsiLCAvLyROT04tTkxTLTEkCi0JCQkJImNhc2UiLCAiY2F0Y2giLCAiY2xhc3MiLCAiY29udGludWUiLCAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImRlZmF1bHQiLCAiZG8iLCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJlbHNlIiwgImV4dGVuZHMiLCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJmaW5hbCIsICJmaW5hbGx5IiwgImZvciIsIC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbnN0YW5jZW9mIiwgImludGVyZmFjZSIsIC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJIm5hdGl2ZSIsICJuZXciLCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJwYWNrYWdlIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkicmV0dXJuIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzdGF0aWMiLCAic3VwZXIiLCAic3dpdGNoIiwgInN5bmNocm9uaXplZCIsIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkidGhpcyIsICJ0aHJvdyIsICJ0aHJvd3MiLCAidHJhbnNpZW50IiwgInRyeSIsIC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJInZvbGF0aWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ3aGlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkic3RyaWN0ZnAiLC8vJE5PTi1OTFMtMSQKLQl9OwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnVHlwZXMgPSB7InZvaWQiLCAiYm9vbGVhbiIsICJjaGFyIiwgImJ5dGUiLCAic2hvcnQiLCAiaW50IiwgImxvbmciLCAiZmxvYXQiLCAiZG91YmxlIn07Ly8kTk9OLU5MUy05JC8vJE5PTi1OTFMtOCQvLyROT04tTkxTLTckLy8kTk9OLU5MUy02JC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdDb25zdGFudHMgPSB7ImZhbHNlIiwgIm51bGwiLCAidHJ1ZSJ9Oy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIEphdmEgY29kZSBzY2FubmVyCi0JICovCi0JcHVibGljIEphdmFDb2RlU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJ1bGVzKCkgewotCQlMaXN0IHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEFkZCBydWxlIGZvciBtdWx0aXBsZSBsaW5lIGNvbW1lbnRzLgotCQlydWxlcy5hZGQobmV3IE11bHRpTGluZVJ1bGUoIi8qIiwgIiovIiwgZlNpbmdsZUxpbmVDb21tZW50VG9rZW4pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBBZGQgcnVsZSBmb3Igc2luZ2xlIGxpbmUgY29tbWVudHMuCi0JCXJ1bGVzLmFkZChuZXcgRW5kT2ZMaW5lUnVsZSgiLy8iLCBmU2luZ2xlTGluZUNvbW1lbnRUb2tlbikpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBBZGQgcnVsZSBmb3Igc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4KLQkJcnVsZXMuYWRkKG5ldyBTaW5nbGVMaW5lUnVsZSgiXCIiLCAiXCIiLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlydWxlcy5hZGQobmV3IFNpbmdsZUxpbmVSdWxlKCInIiwgIiciLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCS8vIEFkZCBnZW5lcmljIHdoaXRlc3BhY2UgcnVsZS4KLQkJLy9ydWxlcy5hZGQobmV3IFdoaXRlc3BhY2VSdWxlKG5ldyBKYXZhV2hpdGVzcGFjZURldGVjdG9yKCkpKTsKLQotCQkvLyBBZGQgd29yZCBydWxlIGZvciBrZXl3b3JkcywgdHlwZXMsIGFuZCBjb25zdGFudHMuCi0JCVdvcmRSdWxlIHdvcmRSdWxlID0gbmV3IFdvcmRSdWxlKG5ldyBKYXZhV29yZERldGVjdG9yKCksIGZEZWZhdWx0VG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnS2V5d29yZHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnS2V5d29yZHNbaV0sIGZLZXl3b3JkVG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnVHlwZXMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnVHlwZXNbaV0sIGZUeXBlVG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnQ29uc3RhbnRzLmxlbmd0aDsgaSsrKQotCQkJd29yZFJ1bGUuYWRkV29yZChmZ0NvbnN0YW50c1tpXSwgZlR5cGVUb2tlbik7Ci0JCXJ1bGVzLmFkZCh3b3JkUnVsZSk7Ci0KLQotCQlJUnVsZVtdIHJlc3VsdCA9IG5ldyBJUnVsZVtydWxlcy5zaXplKCldOwotCQlydWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXNldFJ1bGVzKHJlc3VsdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRva2VuRGF0YShTdHJpbmcgdG9rZW5LZXksIE9iamVjdCBkYXRhKSB7Ci0JCWlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRCkgewotCQkJZktleXdvcmRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJCWZUeXBlVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NUUklORykgewotCQkJZlN0cmluZ1Rva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UKSB7Ci0JCQlmU2luZ2xlTGluZUNvbW1lbnRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCkgewotCQkJZkRlZmF1bHRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2xvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29sb3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQzNTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2xvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIENvbG9ycyB1c2VkIGluIHRoZSBKYXZhIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNvbG9yUHJvdmlkZXIgewotCQotCS8vIHBlb3BsZSBzaG91bGQgbm90IGJlIHNldHRpbmcgdGhlc2UsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGN1cnJlbnRseSBub3QgZmluYWwKLQlwdWJsaWMgc3RhdGljIFJHQiBNVUxUSV9MSU5FX0NPTU1FTlQgPSBuZXcgUkdCKDEyOCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEtFWVdPUkQgPSBuZXcgUkdCKDAsIDAsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgVFlQRSA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTVFJJTkcgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgREVGQVVMVCA9IG5ldyBSR0IoMCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19LRVlXT1JEID0gbmV3IFJHQigwLCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfVEFHID0gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0xJTksgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfREVGQVVMVCA9IG5ldyBSR0IoMCwgMTI4LCAxMjgpOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IE1VTFRJX0xJTkVfQ09NTUVOVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEtFWVdPUkRfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFRZUEVfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFNUUklOR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19UQUdfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19MSU5LX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfREVGQVVMVF9CT0xEID0gU1dULk5PUk1BTDsKLQkKLQlwcml2YXRlIHN0YXRpYyBKYXZhQ29sb3JQcm92aWRlciBmSW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgSmF2YUNvbG9yUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEphdmFDb2xvclByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0JCi0JLyoqCi0JICogVXNlIGNvbG9ycyBmcm9tIEpEVCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkSmF2YUNvbG9ycygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBqZHRTdG9yZSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCU1VTFRJX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCVNJTkdMRV9MSU5FX0NPTU1FTlQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJS0VZV09SRCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCVRZUEUgPSBLRVlXT1JEOwotCQlTVFJJTkcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IpOwotCQlERUZBVUxUID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJSkFWQURPQ19LRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19LRVlXT1JEX0NPTE9SKTsKLQkJSkFWQURPQ19UQUcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19DT0xPUik7Ci0JCUpBVkFET0NfTElOSyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQ09MT1IpOwotCQlKQVZBRE9DX0RFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQ09MT1IpOwotCQkKLQkJTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlLRVlXT1JEX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJVFlQRV9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVNUUklOR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCURFRkFVTFRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX1RBR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19MSU5LX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODE4OTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi0KLQotLyoqCi0gKiBBIGphdmEgYXdhcmUgd2hpdGUgc3BhY2UgZGV0ZWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV2hpdGVzcGFjZURldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yI2lzV2hpdGVzcGFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZShjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZlNzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi0KLS8qKgotICogQSBKYXZhIGF3YXJlIHdvcmQgZGV0ZWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV29yZERldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJQYXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyU3RhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwOTM2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLy8gTm90ZTogbWFueSBvZiB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHdlcmUgYmFzZWQgb24gKG9yIGNvcGllZCBmcm9tKSB0aG9zZQotLy8gZm91bmQgaW4gdGhlIGV4YW1wbGUgSmF2YSBFZGl0b3IKLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckphdmEgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlcnsKLQlwcml2YXRlIGNsYXNzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5IHNvIG90aGVycyBjYW4gb3ZlcnJpZGUgdGhlIG1ldGhvZAotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgSGlnaGxpZ2h0ZXIgZkhpZ2hsaWdodGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSXNJbml0aWFsaXplZCA9IGZhbHNlOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJlZmVyZW5jZUxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkvKiogVGhlIHNjYW5uZXIgaXQgdXNlcyAqLwotCXByaXZhdGUgSmF2YUNvZGVTY2FubmVyIGZTY2FubmVyOwotCS8qKiBDb250YWlucyBhbGwgdGV4dCBhdHRyaWJ1dGVzIHByZXRhaW5pbmcgdG8gdGhpcyBsaW5lIHN0eWxlIHByb3ZpZGVyICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZUZXh0QXR0cmlidXRlcyA9IG51bGw7Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhKCkgewotCQlzdXBlcigpOwotCQlmU2Nhbm5lciA9IG5ldyBKYXZhQ29kZVNjYW5uZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHN0eWxlIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0ZXh0IHByZXNlbnRhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwcmVzZW50YXRpb24gdGhlIHRleHQgcHJlc2VudGF0aW9uIHRvIGJlIGV4dGVuZGVkCi0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBhdHRyIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmluZyB0aGUgc3R5bGUgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSYW5nZShDb2xsZWN0aW9uIHByZXNlbnRhdGlvbiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgVGV4dEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCS8vIHN1cHBvcnQgZm9yIHVzZXIgZGVmaW5lZCBiYWNrZ3JvdWQgZm9yIEpTUCBzY3JpcHRsZXQgcmVnaW9ucwotCQlTdHJpbmcgc3R5bGVTdHJpbmcgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCVN0cmluZ1tdIHByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVN0cmluZyk7Ci0JCUNvbG9yIGJnQ29sb3IgPSAocHJlZnMgIT0gbnVsbCAmJiBwcmVmcy5sZW5ndGggPT0gMyAmJiBwcmVmc1sxXS5zdGFydHNXaXRoKCIjIikgJiYgRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCT8gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBDb2xvckhlbHBlci50b1JHQihwcmVmc1sxXSkpCi0JCQkJCQkJOiBhdHRyLmdldEJhY2tncm91bmQoKTsKLQkJCQkJCQkKLQkJcHJlc2VudGF0aW9uLmFkZChuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGJnQ29sb3IsIGF0dHIuZ2V0U3R5bGUoKSkpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCWlmIChnZXRDb2xvclByZWZlcmVuY2VzKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRDb2xvclByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKGNvbG9yS2V5KTsKLQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQkJUkdCIGJhY2tncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzFdKTsKLQkJCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFUZXh0QXR0cmlidXRlKFN0cmluZyBjb2xvcktleSkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwgJiYgY29sb3JLZXkgIT0gbnVsbCkgeyAKLQkJCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQkJaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEKSB7Ci0JCQkJLy8ga2V5d29yZAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMpOwotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBib2xkLCBpdGFsaWNzKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NUUklORykgewotCQkJCS8vIHN0cmluZwotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMpOwotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBib2xkLCBpdGFsaWNzKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCQkvLyBzaW5nbGUgbGluZSBjb21tZW50Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0lUQUxJQyk7Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIGJvbGQsIGl0YWxpY3MpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCkgewotCQkJCS8vIGRlZmF1bHQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDKTsKLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgYm9sZCwgaXRhbGljcyk7Ci0JCQl9Ci0JCQlpZiAodGEgIT0gbnVsbCkgewotCQkJCWdldFRleHRBdHRyaWJ1dGVzKCkucHV0KGNvbG9yS2V5LCB0YSk7Ci0JCQkJZlNjYW5uZXIuc2V0VG9rZW5EYXRhKGNvbG9yS2V5LCB0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShSR0IgZm9yZWdyb3VuZCwgUkdCIGJhY2tncm91bmQsIGJvb2xlYW4gYm9sZCkgewotCQlyZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgYm9sZCA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCk7Ci0JfQotCQotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlKFJHQiBmb3JlZ3JvdW5kLCBSR0IgYmFja2dyb3VuZCwgYm9vbGVhbiBib2xkLCBib29sZWFuIGl0YWxpY3MpIHsKLQkJaW50IHN0eWxlID0gYm9sZCA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJaWYgKGl0YWxpY3MpCi0JCQlzdHlsZSB8PSBTV1QuSVRBTElDOwotCQkKLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaHRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSB0ZXh0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGluZQotCSAqIHN0eWxlIHByb3ZpZGVyLiBMYXppbHkgY3JlYXRlcyBhIGhhc2h0YWJsZSBpZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4KLQkgKiBjcmVhdGVkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0VGV4dEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChmVGV4dEF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJZlRleHRBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWxvYWRDb2xvcnMoKTsKLQkJfQotCQlyZXR1cm4gZlRleHRBdHRyaWJ1dGVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgdGV4dCBhdHRyaWJ1dGUgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gdG9rZW4uIElmIHRoZSB0b2tlbidzCi0JICogZGF0YSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gYW5kIGEgdGV4dCBhdHRyaWJ1dGUgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JICogaXQgaXMgdGhlIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUuIEl0IHJldHVybnMgdGhlIGRlZmF1bHQgdGV4dCBhdHRyaWJ1dGUKLQkgKiBpZiB0aGVyZSBpcyBubyBlbmNvZGVkIHRleHQgYXR0cmlidXRlIGZvdW5kLgotCSAqCi0JICogQHBhcmFtIHRva2VuIHRoZSB0b2tlbiB3aG9zZSB0ZXh0IGF0dHJpYnV0ZSBpcyB0byBiZSBkZXRlcm1pbmVkCi0JICogQHJldHVybiB0aGUgdG9rZW4ncyB0ZXh0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRUb2tlblRleHRBdHRyaWJ1dGUoSVRva2VuIHRva2VuKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQkKLQkJT2JqZWN0IGRhdGEgPSB0b2tlbi5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgVGV4dEF0dHJpYnV0ZSkKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpZGF0YTsKLQkJZWxzZSB7Ci0JCQl0YSA9IChUZXh0QXR0cmlidXRlKWdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQkJfQotCQlyZXR1cm4gdGE7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmSGlnaGxpZ2h0ZXIgPSBoaWdobGlnaHRlcjsKLQkJCi0JCWlmIChmSXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQotCQlyZWdpc3RlclByZWZlcmVuY2VMaXN0ZW5lcigpOwotCi0JCWZJc0luaXRpYWxpemVkID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQkKLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HKTsKLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCk7Ci0JCQotCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0JCVN0cmluZyBqYXZhU3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQuZXF1YWxzKHByZWZLZXkpKXx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0JPTEQuZXF1YWxzKHByZWZLZXkpKXx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xELmVxdWFscyhwcmVmS2V5KSl8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRC5lcXVhbHMocHJlZktleSkpfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJfQotCQlpZiAoamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShqYXZhU3R5bGVLZXkpOwotCQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JCX0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwgfHwgamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIGZvcmNlIGEgZnVsbCB1cGRhdGUgb2YgdGhlIHRleHQgdmlld2VyCi0JCQlmSGlnaGxpZ2h0ZXIucmVmcmVzaERpc3BsYXkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IHNzc3NyZXF1ZXN0ZWRTdGFydCwgaW50IHNzc3NyZXF1ZXN0ZWRMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl0cnkgewotCQkJLy8gaWRlYWxseSwgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSBhICJ2aXJ0dWFsRG9jdW1lbnQiIHdlIGNhbiAKLQkJCS8vIHJlZmVyIHRvLCBidXQgZm9yIG5vdyAuLi4gd2UnbGwgc2ltcGxlIHJlc2NhbiB0aGUgb25lIHJlZ2lvbi4KLQkJCS8vIHVzZSBzaW1wbGUgYWRqdXN0bWVudCAoc2luY2UgInN1Yi1jb250ZW50IiBzdGFydHMgYXQgMAotCQkJaW50IG9mZnNldEFkanVzdG1lbnQgPSB0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCVN0cmluZyBjb250ZW50ID0gZkRvY3VtZW50LmdldCh0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKSwgdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KGNvbnRlbnQpOwotCi0JCQlpbnQgbGFzdFN0YXJ0ID0gMDsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJSVRva2VuIGxhc3RUb2tlbiA9IFRva2VuLlVOREVGSU5FRDsKLQotCQkJaW50IHJlbWFpbmluZ0xlbmd0aCA9IHR5cGVkUmVnaW9uLmdldExlbmd0aCgpOwotCQkJZlNjYW5uZXIuc2V0UmFuZ2UoZG9jdW1lbnQsIGxhc3RTdGFydCwgcmVtYWluaW5nTGVuZ3RoKTsKLQotCQkJd2hpbGUgKHRydWUpIHsKLQotCQkJCUlUb2tlbiB0b2tlbiA9IGZTY2FubmVyLm5leHRUb2tlbigpOwotCi0JCQkJaWYgKHRva2VuLmlzRU9GKCkpIHsKLQkJCQkJaWYgKCFsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSAmJiBsZW5ndGggIT0gMCkKLQkJCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQgKyBvZmZzZXRBZGp1c3RtZW50LCBsZW5ndGgsIGdldFRva2VuVGV4dEF0dHJpYnV0ZShsYXN0VG9rZW4pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKHRva2VuLmlzV2hpdGVzcGFjZSgpKSB7Ci0JCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAobGFzdFRva2VuLmlzVW5kZWZpbmVkKCkpIHsKLQkJCQkJbGFzdFRva2VuID0gdG9rZW47Ci0JCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodG9rZW4gIT0gbGFzdFRva2VuKSB7Ci0JCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQgKyBvZmZzZXRBZGp1c3RtZW50LCBsZW5ndGgsIGdldFRva2VuVGV4dEF0dHJpYnV0ZShsYXN0VG9rZW4pKTsKLQkJCQkJbGFzdFRva2VuID0gdG9rZW47Ci0JCQkJCWxhc3RTdGFydCA9IGZTY2FubmVyLmdldFRva2VuT2Zmc2V0KCk7Ci0JCQkJCWxlbmd0aCA9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0byBzdG9wIG90aGVyIGhpZ2hsaWdodGluZywgaWYgaXQgZG9lcy4KLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWdpc3RlclByZWZlcmVuY2VMaXN0ZW5lcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJdW5yZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCWlmIChmVGV4dEF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJZlRleHRBdHRyaWJ1dGVzLmNsZWFyKCk7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0lTdHlsZUNvbnN0YW50c0pTUEVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSVN0eWxlQ29uc3RhbnRzSlNQRUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5ODg0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSVN0eWxlQ29uc3RhbnRzSlNQRUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pTUEVMIHsKLQlTdHJpbmcgRUxfS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2RlU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29kZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmN2NjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2RlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5XaGl0ZXNwYWNlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLldvcmRSdWxlOwotCi0vKioKLSAqIEEgSmF2YSBjb2RlIHNjYW5uZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTENvZGVTY2FubmVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRTY2FubmVyIHsKLQlwcml2YXRlIElUb2tlbiBmS2V5d29yZFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZUeXBlVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZkRlZmF1bHRUb2tlbjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0tleXdvcmRzID0gewotCQkJCSJhbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJImRpZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZGl2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJlbXB0eSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZXEiLCAvLyROT04tTkxTLTEkCi0JCQkJImdlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJndCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3IiLCAvLyROT04tTkxTLTEkCi0JCQkJImxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJsdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkibW9kIiwgLy8kTk9OLU5MUy0xJAotIAkJCQkibmUiLCAvLyROT04tTkxTLTEkCi0gCQkJCSJub3QiICAvLyROT04tTkxTLTEkCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0NvbnN0YW50cyA9IHsiZmFsc2UiLCAidHJ1ZSJ9Oy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgSmF2YSBjb2RlIHNjYW5uZXIKLQkgKi8KLQlwdWJsaWMgSlNQRUxDb2RlU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJ1bGVzKCkgewotCQlMaXN0IHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEFkZCBnZW5lcmljIHdoaXRlc3BhY2UgcnVsZS4KLQkJcnVsZXMuYWRkKG5ldyBXaGl0ZXNwYWNlUnVsZShuZXcgSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IoKSkpOwotCi0JCS8vIEFkZCB3b3JkIHJ1bGUgZm9yIGtleXdvcmRzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KLQkJV29yZFJ1bGUgd29yZFJ1bGUgPSBuZXcgV29yZFJ1bGUobmV3IEpTUEVMV29yZERldGVjdG9yKCksIGZEZWZhdWx0VG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnS2V5d29yZHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnS2V5d29yZHNbaV0sIGZLZXl3b3JkVG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnQ29uc3RhbnRzLmxlbmd0aDsgaSsrKQotCQkJd29yZFJ1bGUuYWRkV29yZChmZ0NvbnN0YW50c1tpXSwgZlR5cGVUb2tlbik7Ci0JCXJ1bGVzLmFkZCh3b3JkUnVsZSk7Ci0KLQkJSVJ1bGVbXSByZXN1bHQgPSBuZXcgSVJ1bGVbcnVsZXMuc2l6ZSgpXTsKLQkJcnVsZXMudG9BcnJheShyZXN1bHQpOwotCQlzZXRSdWxlcyhyZXN1bHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUb2tlbkRhdGEoU3RyaW5nIHRva2VuS2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfS0VZV09SRCkgewotCQkJZktleXdvcmRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJCWZUeXBlVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfREVGQVVMVCkgewotCQkJZkRlZmF1bHRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvbG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvbG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2MDcxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2xvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogQ29sb3JzIHVzZWQgaW4gdGhlIEphdmEgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTENvbG9yUHJvdmlkZXIgewotCQotCS8vIHBlb3BsZSBzaG91bGQgbm90IGJlIHNldHRpbmcgdGhlc2UsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGN1cnJlbnRseSBub3QgZmluYWwKLQlwdWJsaWMgc3RhdGljIFJHQiBNVUxUSV9MSU5FX0NPTU1FTlQgPSBuZXcgUkdCKDEyOCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEtFWVdPUkQgPSBuZXcgUkdCKDAsIDAsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgVFlQRSA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTVFJJTkcgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgREVGQVVMVCA9IG5ldyBSR0IoMCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19LRVlXT1JEID0gbmV3IFJHQigwLCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfVEFHID0gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0xJTksgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfREVGQVVMVCA9IG5ldyBSR0IoMCwgMTI4LCAxMjgpOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IE1VTFRJX0xJTkVfQ09NTUVOVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEtFWVdPUkRfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFRZUEVfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFNUUklOR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19UQUdfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19MSU5LX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfREVGQVVMVF9CT0xEID0gU1dULk5PUk1BTDsKLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBhbGwgZWRpdG9ycyB1c2Ugc2FtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkdCIEVESVRPUl9CQUNLR1JPVU5EID0gbmV3IFJHQigyNTUsIDI1NSwgMjU1KTsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBhbGwgZWRpdG9ycyB1c2Ugc2FtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBFRElUT1JfQ1VSUkVOVF9MSU5FID0gdHJ1ZTsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBhbGwgZWRpdG9ycyB1c2Ugc2FtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkdCIEVESVRPUl9DVVJSRU5UX0xJTkVfQ09MT1IgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCQotCXByaXZhdGUgc3RhdGljIEpTUEVMQ29sb3JQcm92aWRlciBmSW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgSlNQRUxDb2xvclByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBKU1BFTENvbG9yUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQkKLQkvKioKLQkgKiBVc2UgY29sb3JzIGZyb20gSkRUIHBsdWdpbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRKYXZhQ29sb3JzKCkgewotCQkKLQkJSVByZWZlcmVuY2VTdG9yZSBqZHRTdG9yZSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCU1VTFRJX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCVNJTkdMRV9MSU5FX0NPTU1FTlQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJS0VZV09SRCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCVRZUEUgPSBLRVlXT1JEOwotCQlTVFJJTkcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IpOwotCQlERUZBVUxUID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJSkFWQURPQ19LRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19LRVlXT1JEX0NPTE9SKTsKLQkJSkFWQURPQ19UQUcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19DT0xPUik7Ci0JCUpBVkFET0NfTElOSyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQ09MT1IpOwotCQlKQVZBRE9DX0RFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQ09MT1IpOwotCQkKLQkJTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlLRVlXT1JEX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJVFlQRV9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVNUUklOR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCURFRkFVTFRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX1RBR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19MSU5LX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCQotLy8JCUVESVRPUl9CQUNLR1JPVU5EID0gbmV3IFJHQigyNTUsIDI1NSwgMjU1KTsKLQkJCi0vLwkJSVByZWZlcmVuY2VTdG9yZSBzc2VTdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLS8vCQlFRElUT1JfQ1VSUkVOVF9MSU5FID0gc3NlU3RvcmUuZ2V0Qm9vbGVhbihBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DVVJSRU5UX0xJTkUpOwotLy8JCUVESVRPUl9DVVJSRU5UX0xJTkVfQ09MT1IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHNzZVN0b3JlLCBBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DVVJSRU5UX0xJTkVfQ09MT1IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV2hpdGVzcGFjZURldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjM0NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV2hpdGVzcGFjZURldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLQotCi0vKioKLSAqIEEgamF2YSBhd2FyZSB3aGl0ZSBzcGFjZSBkZXRlY3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEpTUEVMV2hpdGVzcGFjZURldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yI2lzV2hpdGVzcGFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZShjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV29yZERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXb3JkRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3NmUyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXb3JkRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotCi0vKioKLSAqIEEgSmF2YSBhd2FyZSB3b3JkIGRldGVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgSlNQRUxXb3JkRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJTdGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwMDBhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmEuSVN0eWxlQ29uc3RhbnRzSlNQSmF2YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLy8gTm90ZTogbWFueSBvZiB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHdlcmUgYmFzZWQgb24gKG9yIGNvcGllZCBmcm9tKQotLy8gdGhvc2UKLS8vIGZvdW5kIGluIHRoZSBleGFtcGxlIEphdmEgRWRpdG9yCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwcml2YXRlIGNsYXNzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5IHNvIG90aGVycyBjYW4gb3ZlcnJpZGUgdGhlIG1ldGhvZAotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgSGlnaGxpZ2h0ZXIgZkhpZ2hsaWdodGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSXNJbml0aWFsaXplZCA9IGZhbHNlOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJlZmVyZW5jZUxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkvKiogVGhlIHNjYW5uZXIgaXQgdXNlcyAqLwotCXByaXZhdGUgSlNQRUxDb2RlU2Nhbm5lciBmU2Nhbm5lcjsKLQkvKiogQ29udGFpbnMgYWxsIHRleHQgYXR0cmlidXRlcyBwcmV0YWluaW5nIHRvIHRoaXMgbGluZSBzdHlsZSBwcm92aWRlciAqLwotCXByaXZhdGUgSGFzaE1hcCBmVGV4dEF0dHJpYnV0ZXMgPSBudWxsOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTY2FubmVyID0gbmV3IEpTUEVMQ29kZVNjYW5uZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHN0eWxlIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0ZXh0IHByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwcmVzZW50YXRpb24gdG8gYmUgZXh0ZW5kZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBzdHlsZSBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJhbmdlKENvbGxlY3Rpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBUZXh0QXR0cmlidXRlIGF0dHIpIHsKLQkJLy8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGJhY2tncm91ZCBmb3IgSlNQIHNjcmlwdGxldCByZWdpb25zCi0JCVN0cmluZyBzdHlsZVN0cmluZyA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQkJU3RyaW5nW10gcHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlU3RyaW5nKTsKLQkJQ29sb3IgYmdDb2xvciA9IChwcmVmcyAhPSBudWxsICYmIHByZWZzLmxlbmd0aCA9PSAzICYmIHByZWZzWzFdLnN0YXJ0c1dpdGgoIiMiKSAmJiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCT8gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBDb2xvckhlbHBlci50b1JHQihwcmVmc1sxXSkpIDogYXR0ci5nZXRCYWNrZ3JvdW5kKCk7Ci0KLQkJcHJlc2VudGF0aW9uLmFkZChuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGJnQ29sb3IsIGF0dHIuZ2V0U3R5bGUoKSkpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCWlmIChnZXRDb2xvclByZWZlcmVuY2VzKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRDb2xvclByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKGNvbG9yS2V5KTsKLQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQkJUkdCIGJhY2tncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzFdKTsKLQkJCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YVRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCAmJiBjb2xvcktleSAhPSBudWxsKSB7Ci0JCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJCWlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9LRVlXT1JEKSB7Ci0JCQkJLy8ga2V5d29yZAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMpOwotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBib2xkLCBpdGFsaWNzKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfREVGQVVMVCkgewotCQkJCS8vIGRlZmF1bHQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDKTsKLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgYm9sZCwgaXRhbGljcyk7Ci0JCQl9Ci0JCQlpZiAodGEgIT0gbnVsbCkgewotCQkJCWdldFRleHRBdHRyaWJ1dGVzKCkucHV0KGNvbG9yS2V5LCB0YSk7Ci0JCQkJZlNjYW5uZXIuc2V0VG9rZW5EYXRhKGNvbG9yS2V5LCB0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShSR0IgZm9yZWdyb3VuZCwgUkdCIGJhY2tncm91bmQsIGJvb2xlYW4gYm9sZCkgewotCQlyZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgYm9sZCA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBib29sZWFuIGJvbGQsIGJvb2xlYW4gaXRhbGljcykgewotCQlpbnQgc3R5bGUgPSBib2xkID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlpZiAoaXRhbGljcykKLQkJCXN0eWxlIHw9IFNXVC5JVEFMSUM7Ci0KLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNodGFibGUgY29udGFpbmluZyBhbGwgdGhlIHRleHQgYXR0cmlidXRlcyBmb3IgdGhpcyBsaW5lCi0JICogc3R5bGUgcHJvdmlkZXIuIExhemlseSBjcmVhdGVzIGEgaGFzaHRhYmxlIGlmIG9uZSBoYXMgbm90IGFscmVhZHkgYmVlbgotCSAqIGNyZWF0ZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRUZXh0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbG9hZENvbG9ycygpOwotCQl9Ci0JCXJldHVybiBmVGV4dEF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHRleHQgYXR0cmlidXRlIGVuY29kZWQgaW4gdGhlIGdpdmVuIHRva2VuLiBJZiB0aGUgdG9rZW4ncwotCSAqIGRhdGEgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBhIHRleHQgYXR0cmlidXRlIGl0IGlzIGFzc3VtZWQgdGhhdAotCSAqIGl0IGlzIHRoZSBlbmNvZGVkIHRleHQgYXR0cmlidXRlLiBJdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRleHQgYXR0cmlidXRlCi0JICogaWYgdGhlcmUgaXMgbm8gZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIHRoZSB0b2tlbiB3aG9zZSB0ZXh0IGF0dHJpYnV0ZSBpcyB0byBiZSBkZXRlcm1pbmVkCi0JICogQHJldHVybiB0aGUgdG9rZW4ncyB0ZXh0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRUb2tlblRleHRBdHRyaWJ1dGUoSVRva2VuIHRva2VuKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCi0JCU9iamVjdCBkYXRhID0gdG9rZW4uZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFRleHRBdHRyaWJ1dGUpCi0JCQl0YSA9IChUZXh0QXR0cmlidXRlKSBkYXRhOwotCQllbHNlIHsKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkhpZ2hsaWdodGVyID0gaGlnaGxpZ2h0ZXI7Ci0KLQkJaWYgKGZJc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCi0JCXJlZ2lzdGVyUHJlZmVyZW5jZUxpc3RlbmVyKCk7Ci0KLQkJZklzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0KLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCk7Ci0KLQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCQlTdHJpbmcgamF2YVN0eWxlS2V5ID0gbnVsbDsKLQotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVI7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9LRVlXT1JEOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9ERUZBVUxUOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJfQotCQlpZiAoamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShqYXZhU3R5bGVLZXkpOwotCQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JCX0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwgfHwgamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIGZvcmNlIGEgZnVsbCB1cGRhdGUgb2YgdGhlIHRleHQgdmlld2VyCi0JCQlmSGlnaGxpZ2h0ZXIucmVmcmVzaERpc3BsYXkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IHNzc3NyZXF1ZXN0ZWRTdGFydCwgaW50IHNzc3NyZXF1ZXN0ZWRMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl0cnkgewotCQkJLy8gaWRlYWxseSwgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSBhICJ2aXJ0dWFsRG9jdW1lbnQiIHdlIGNhbgotCQkJLy8gcmVmZXIgdG8sIGJ1dCBmb3Igbm93IC4uLiB3ZSdsbCBzaW1wbGUgcmVzY2FuIHRoZSBvbmUgcmVnaW9uLgotCQkJLy8gdXNlIHNpbXBsZSBhZGp1c3RtZW50IChzaW5jZSAic3ViLWNvbnRlbnQiIHN0YXJ0cyBhdCAwCi0JCQlpbnQgb2Zmc2V0QWRqdXN0bWVudCA9IHR5cGVkUmVnaW9uLmdldE9mZnNldCgpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSBmRG9jdW1lbnQuZ2V0KHR5cGVkUmVnaW9uLmdldE9mZnNldCgpLCB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoY29udGVudCk7Ci0KLQkJCWludCBsYXN0U3RhcnQgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlJVG9rZW4gbGFzdFRva2VuID0gVG9rZW4uVU5ERUZJTkVEOwotCi0JCQlpbnQgcmVtYWluaW5nTGVuZ3RoID0gdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlmU2Nhbm5lci5zZXRSYW5nZShkb2N1bWVudCwgbGFzdFN0YXJ0LCByZW1haW5pbmdMZW5ndGgpOwotCi0JCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkJSVRva2VuIHRva2VuID0gZlNjYW5uZXIubmV4dFRva2VuKCk7Ci0KLQkJCQlpZiAodG9rZW4uaXNFT0YoKSkgewotCQkJCQlpZiAoIWxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpICYmIGxlbmd0aCAhPSAwKQotCQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCArIG9mZnNldEFkanVzdG1lbnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAodG9rZW4uaXNXaGl0ZXNwYWNlKCkpIHsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSkgewotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0b2tlbiAhPSBsYXN0VG9rZW4pIHsKLQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCArIG9mZnNldEFkanVzdG1lbnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGFzdFN0YXJ0ID0gZlNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIHN0b3Agb3RoZXIKLQkJCS8vIGhpZ2hsaWdodGluZywgaWYgaXQgZG9lcy4KLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWdpc3RlclByZWZlcmVuY2VMaXN0ZW5lcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCWlmIChmVGV4dEF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJZlRleHRBdHRyaWJ1dGVzLmNsZWFyKCk7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuUmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEphdmFDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkZmI0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGEgc2V0IG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nIEhUTUwgcGFnZXMuCi0gKiAKLSAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkhUTUxQcmludGVyCi0gKi8KLWNsYXNzIEhUTUxQcmludGVyIHsKLQotCXN0YXRpYyBSR0IgQkdfQ09MT1JfUkdCID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlCR19DT0xPUl9SR0IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpLmdldFJHQigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQljYXRjaCAoU1dURXJyb3IgZXJyKSB7Ci0JCQkJLy8gc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDUyOTQKLQkJCQlpZiAoZXJyLmNvZGUgIT0gU1dULkVSUk9SX0RFVklDRV9ESVNQT1NFRCkKLQkJCQkJdGhyb3cgZXJyOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBIVE1MUHJpbnRlcigpIHsKLQkJLy8gbm90aGluZwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyB0ZXh0LCBjaGFyIGMsIFN0cmluZyBzKSB7Ci0KLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IGN1cnJlbnQgPSB0ZXh0LmluZGV4T2YoYywgcHJldmlvdXMpOwotCi0JCWlmIChjdXJyZW50ID09IC0xKQotCQkJcmV0dXJuIHRleHQ7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKGN1cnJlbnQgPiAtMSkgewotCQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhwcmV2aW91cywgY3VycmVudCkpOwotCQkJYnVmZmVyLmFwcGVuZChzKTsKLQkJCXByZXZpb3VzID0gY3VycmVudCArIDE7Ci0JCQljdXJyZW50ID0gdGV4dC5pbmRleE9mKGMsIHByZXZpb3VzKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHByZXZpb3VzKSk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0hUTUxDb250ZW50KFN0cmluZyBjb250ZW50KSB7Ci0JCWNvbnRlbnQgPSByZXBsYWNlKGNvbnRlbnQsICcmJywgIiZhbXA7Iik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgJyInLCAiJnF1b3Q7Iik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgJzwnLCAiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXBsYWNlKGNvbnRlbnQsICc+JywgIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBTdHJpbmcgcmVhZChSZWFkZXIgcmQpIHsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCi0JCXRyeSB7Ci0JCQlpbnQgbiA9IHJkLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW4gPSByZC5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBuZXZlciBleHBlY3RlZAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgeC5nZXRNZXNzYWdlKCksIHgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBSR0IgYmdSR0IsIFVSTCBzdHlsZVNoZWV0VVJMKSB7Ci0KLQkJaWYgKGJnUkdCID09IG51bGwpCi0JCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIHN0eWxlU2hlZXRVUkwpOwotCQllbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBwYWdlUHJvbG9nID0gbmV3IFN0cmluZ0J1ZmZlcigzMDApOwotCi0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGh0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJYXBwZW5kU3R5bGVTaGVldExpbmsocGFnZVByb2xvZywgc3R5bGVTaGVldFVSTCk7Ci0KLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCI8Ym9keSB0ZXh0PVwiIzAwMDAwMFwiIGJnY29sb3I9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXBwZW5kQ29sb3IocGFnZVByb2xvZywgYmdSR0IpOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIlwiPjxmb250IHNpemU9LTE+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgcGFnZVByb2xvZy50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbiwgUkdCIGJnUkdCKSB7Ci0JCWlmIChiZ1JHQiA9PSBudWxsKQotCQkJaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uKTsKLQkJZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgcGFnZVByb2xvZyA9IG5ldyBTdHJpbmdCdWZmZXIoNjApOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIjxodG1sPjxib2R5IHRleHQ9XCIjMDAwMDAwXCIgYmdjb2xvcj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRDb2xvcihwYWdlUHJvbG9nLCBiZ1JHQik7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiXCI+PGZvbnQgc2l6ZT0tMT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgcGFnZVByb2xvZy50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kU3R5bGVTaGVldExpbmsoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVVJMIHN0eWxlU2hlZXRVUkwpIHsKLQkJaWYgKHN0eWxlU2hlZXRVUkwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlidWZmZXIuYXBwZW5kKCI8aGVhZD4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWJ1ZmZlci5hcHBlbmQoIjxMSU5LIFJFTD1cInN0eWxlc2hlZXRcIiBIUkVGPSBcIiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoc3R5bGVTaGVldFVSTCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlwiIENIQVJTRVQ9XCJJU08tODg1OS0xXCIgVFlQRT1cInRleHQvY3NzXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlidWZmZXIuYXBwZW5kKCI8L2hlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZENvbG9yKFN0cmluZ0J1ZmZlciBidWZmZXIsIFJHQiByZ2IpIHsKLQkJYnVmZmVyLmFwcGVuZCgnIycpOwotCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcocmdiLnJlZCkpOwotCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcocmdiLmdyZWVuKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IuYmx1ZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbikgewotCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIGdldEJnQ29sb3IoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBVUkwgc3R5bGVTaGVldFVSTCkgewotCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIGdldEJnQ29sb3IoKSwgc3R5bGVTaGVldFVSTCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUkdCIGdldEJnQ29sb3IoKSB7Ci0JCWlmIChCR19DT0xPUl9SR0IgIT0gbnVsbCkKLQkJCXJldHVybiBCR19DT0xPUl9SR0I7Ci0JCS8vIFJHQiB2YWx1ZSBvZiBpbmZvIGJnIGNvbG9yIG9uIFdpbmRvd3NYUAotCQlyZXR1cm4gbmV3IFJHQigyNTUsIDI1NSwgMjI1KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBidWZmZXIubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYWdlRXBpbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPC9mb250PjwvYm9keT48L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRCdWxsZXRMaXN0KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPHVsPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuZEJ1bGxldExpc3QoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlidWZmZXIuYXBwZW5kKCI8L3VsPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEJ1bGxldChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgYnVsbGV0KSB7Ci0JCWlmIChidWxsZXQgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPGxpPiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGJ1bGxldCk7Ci0JCQlidWZmZXIuYXBwZW5kKCI8L2xpPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkU21hbGxIZWFkZXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGhlYWRlcikgewotCQlpZiAoaGVhZGVyICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIjxoNT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChoZWFkZXIpOwotCQkJYnVmZmVyLmFwcGVuZCgiPC9oNT4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhcmFncmFwaChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgcGFyYWdyYXBoKSB7Ci0JCWlmIChwYXJhZ3JhcGggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPHA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQocGFyYWdyYXBoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYXJhZ3JhcGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgUmVhZGVyIHBhcmFncmFwaFJlYWRlcikgewotCQlpZiAocGFyYWdyYXBoUmVhZGVyICE9IG51bGwpCi0JCQlhZGRQYXJhZ3JhcGgoYnVmZmVyLCByZWFkKHBhcmFncmFwaFJlYWRlcikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmNjgwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZXh0IGhlbHAgZm9yIEpTUCB0YWdzIChTaG93IHRvb2x0aXAgZGVzY3JpcHRpb24pCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbmZvcm1hdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUluZm9ybWF0aW9uUHJvdmlkZXIsIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uIHsKLQlwcml2YXRlIElUZXh0SG92ZXIgZlRleHRIb3ZlciA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQSW5mb3JtYXRpb25Qcm92aWRlcigpIHsKLQkJZlRleHRIb3ZlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCkuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEpTUFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SW5mb3JtYXRpb24yKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM2MDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YWRvY0NvbnRlbnRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQWJzdHJhY3RIb3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotICogUHJvdmlkZXMgamF2YWRvYyBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gZm9yIGphdmEgY29kZSBpbnNpZGUgSlNQcwotICovCi1wdWJsaWMgY2xhc3MgSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCS8qCi0JICogQnVsayBvZiB0aGUgd29yayB3YXMgY29waWVkIGZyb20KLQkgKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLmhvdmVyLkphdmFkb2NIb3ZlcgotCSAqLwotCXByaXZhdGUgZmluYWwgbG9uZyBMQUJFTF9GTEFHUyA9IEphdmFFbGVtZW50TGFiZWxzLkFMTF9GVUxMWV9RVUFMSUZJRUQgfCBKYXZhRWxlbWVudExhYmVscy5NX1BSRV9SRVRVUk5UWVBFIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfVFlQRVMgfCBKYXZhRWxlbWVudExhYmVscy5NX1BBUkFNRVRFUl9OQU1FUyB8IEphdmFFbGVtZW50TGFiZWxzLk1fRVhDRVBUSU9OUyB8IEphdmFFbGVtZW50TGFiZWxzLkZfUFJFX1RZUEVfU0lHTkFUVVJFIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9QUkVfVFlQRV9QQVJBTUVURVJTIHwgSmF2YUVsZW1lbnRMYWJlbHMuVF9UWVBFX1BBUkFNRVRFUlMgfCBKYXZhRWxlbWVudExhYmVscy5VU0VfUkVTT0xWRUQ7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nIExPQ0FMX1ZBUklBQkxFX0ZMQUdTID0gTEFCRUxfRkxBR1MgJiB+SmF2YUVsZW1lbnRMYWJlbHMuRl9GVUxMWV9RVUFMSUZJRUQgfCBKYXZhRWxlbWVudExhYmVscy5GX1BPU1RfUVVBTElGSUVEOwotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SG92ZXJJbmZvKElKYXZhRWxlbWVudFtdIHJlc3VsdCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgblJlc3VsdHMgPSByZXN1bHQubGVuZ3RoOwotCQlpZiAoblJlc3VsdHMgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuUmVzdWx0cyA+IDEpIHsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCQlIVE1MUHJpbnRlci5zdGFydEJ1bGxldExpc3QoYnVmZmVyKTsKLQkJCQlJSmF2YUVsZW1lbnQgY3VyciA9IHJlc3VsdFtpXTsKLQkJCQlpZiAoY3VyciBpbnN0YW5jZW9mIElNZW1iZXIgfHwgY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkKLQkJCQkJSFRNTFByaW50ZXIuYWRkQnVsbGV0KGJ1ZmZlciwgZ2V0SW5mb1RleHQoY3VycikpOwotCQkJCUhUTUxQcmludGVyLmVuZEJ1bGxldExpc3QoYnVmZmVyKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgewotCi0JCQlJSmF2YUVsZW1lbnQgY3VyciA9IHJlc3VsdFswXTsKLQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSU1lbWJlcikgewotCQkJCUlNZW1iZXIgbWVtYmVyID0gKElNZW1iZXIpIGN1cnI7Ci0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChtZW1iZXIpKTsKLQkJCQlSZWFkZXIgcmVhZGVyOwotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlciA9IEphdmFkb2NDb250ZW50QWNjZXNzLmdldEhUTUxDb250ZW50UmVhZGVyKG1lbWJlciwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCByZWFkZXIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUgfHwgY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUikKLQkJCQlIVE1MUHJpbnRlci5hZGRTbWFsbEhlYWRlcihidWZmZXIsIGdldEluZm9UZXh0KGN1cnIpKTsKLQkJfQotCi0JCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgMCk7Ci0JCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlckluZm8ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCS8vIGdldCBKU1AgdHJhbnNsYXRpb24gb2JqZWN0IGZvciB0aGlzIHZpZXdlcidzIGRvY3VtZW50Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQkJCQotCQkJCQlJSmF2YUVsZW1lbnRbXSByZXN1bHQgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSwgaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCkgKyBob3ZlclJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCXJldHVybiB0cmFuc2xhdGlvbi5maXh1cE1hbmdsZWROYW1lKGdldEhvdmVySW5mbyhyZXN1bHQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlclJlZ2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIEphdmFXb3JkRmluZGVyLmZpbmRXb3JkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmZvVGV4dChJSmF2YUVsZW1lbnQgbWVtYmVyKSB7Ci0JCWxvbmcgZmxhZ3MgPSBtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUgPyBMT0NBTF9WQVJJQUJMRV9GTEFHUyA6IExBQkVMX0ZMQUdTOwotCQlTdHJpbmcgbGFiZWwgPSBKYXZhRWxlbWVudExhYmVscy5nZXRFbGVtZW50TGFiZWwobWVtYmVyLCBmbGFncyk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWwubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IGxhYmVsLmNoYXJBdChpKTsKLQkJCWlmIChjaCA9PSAnPCcpIHsKLQkJCQlidWYuYXBwZW5kKCImbHQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCWJ1Zi5hcHBlbmQoIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChjaCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MGY1YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBQcm92aWRlcyBqYXZhZG9jIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIGphdmEgY29kZSBpbnNpZGUgSlNQcyAoU2hvd3MKLSAqIHRvb2x0aXAgZGVzY3JpcHRpb24pCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBKU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbjIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVySW5mbyh0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTIzNGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mby5IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIFByb3ZpZGVzIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgSlNQIHRhZ3MKLSAqLwotcHVibGljIGNsYXNzIEpTUFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlUmVnaW9uSGVscChJbmRleGVkUmVnaW9uIHRyZWVOb2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVKU1BEaXJIZWxwKChJRE9NTm9kZSkgdHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHN1cGVyLmNvbXB1dGVSZWdpb25IZWxwKHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUganNwIGRpcmVjdGl2ZSBuYW1lCi0JICogZm9yIG5vdywgdHJlYXQganNwIGRpcmVjdGl2ZXMgbGlrZSBhbnkgb3RoZXIgdGFnIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVKU1BEaXJIZWxwKElET01Ob2RlIHhtbG5vZGUsIElET01Ob2RlIHBhcmVudE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gY29tcHV0ZVRhZ05hbWVIZWxwKHhtbG5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSmF2YVdvcmRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0phdmFXb3JkRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzViNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSmF2YVdvcmRGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci0KLS8qKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YVdvcmRGaW5kZXIKLSAqLwotY2xhc3MgSmF2YVdvcmRGaW5kZXIgewotCQotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBmaW5kV29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJCi0JCWludCBzdGFydD0gLTE7Ci0JCWludCBlbmQ9IC0xOwotCQkKLQkJCi0JCXRyeSB7Ci0JCQkKLQkJCWludCBwb3M9IG9mZnNldDsKLQkJCWNoYXIgYzsKLQkJCQotCQkJd2hpbGUgKHBvcyA+PSAwKSB7Ci0JCQkJYz0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotCQkJCQlicmVhazsKLQkJCQktLXBvczsKLQkJCX0KLQkJCQotCQkJc3RhcnQ9IHBvczsKLQkJCQotCQkJcG9zPSBvZmZzZXQ7Ci0JCQlpbnQgbGVuZ3RoPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJCQotCQkJd2hpbGUgKHBvcyA8IGxlbmd0aCkgewotCQkJCWM9IGRvY3VtZW50LmdldENoYXIocG9zKTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLQkJCQkJYnJlYWs7Ci0JCQkJKytwb3M7Ci0JCQl9Ci0JCQkKLQkJCWVuZD0gcG9zOwotCQkJCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQkKLQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gLTEpIHsKLQkJCWlmIChzdGFydCA9PSBvZmZzZXQgJiYgZW5kID09IG9mZnNldCkKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihvZmZzZXQsIDApOwotCQkJZWxzZSBpZiAoc3RhcnQgPT0gb2Zmc2V0KQotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjEwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AgZXh0ZW5kcyBTaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19UWVBFID0gZ2V0RW5jb2RpbmdUeXBlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmdUeXBlKCkgewotCQlyZXR1cm4gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW5jb2RpbmcgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AoKSB7Ci0JCXN1cGVyKEVOQ09ESU5HX1RZUEUsIEpTUFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXNfZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShUZW1wbGF0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWQ5ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9IGdldEFsbCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFID0gZ2V0QXR0cmlidXRlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXID0gZ2V0TmV3KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBnZXRUYWcoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBbGwoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYWxsIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGVfdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ldygpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9uZXciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuICJqc3AiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhZygpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl90YWciOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwN2QyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEpTUCB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gSlNQIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVKU1AgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZUpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0pTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0pTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxMjY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dC5Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXJbXSBCUkFDS0VUUyA9IHsneycsICd9JywgJygnLCAnKScsICdbJywgJ10nfTsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIEpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JCXN1cGVyKG5ldyBTdHJpbmdbXXtET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhULCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UfSwgbmV3IEphdmFQYWlyTWF0Y2hlcihCUkFDS0VUUykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgzZGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmRlcml2ZWQuU2luZ2xlQ2hhclJlYWRlcjsKLQotCi0vKioKLSAqIFJlYWRzIGZyb20gYSBkb2N1bWVudCBlaXRoZXIgZm9yd2FyZHMgb3IgYmFja3dhcmRzLiBNYXkgYmUgY29uZmlndXJlZCB0bwotICogc2tpcCBjb21tZW50cyBhbmQgc3RyaW5ncy4KLSAqIAotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQgc28gd2UgZG9uJ3QgaGF2ZSB0bwotICogZGVwZW5kIG9uIHRoZSBvcmcuZWNsaXBzZS5qZHQudWkgcGx1Z2luLgotICogCi0gKiBObyBtb2RpZmljYXRpb25zIHdlcmUgbWFkZS4KLSAqLwotY2xhc3MgSmF2YUNvZGVSZWFkZXIgZXh0ZW5kcyBTaW5nbGVDaGFyUmVhZGVyIHsKLQotCS8qKiBUaGUgRU9GIGNoYXJhY3RlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRiA9IC0xOwotCi0JcHJpdmF0ZSBib29sZWFuIGZTa2lwQ29tbWVudHMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNraXBTdHJpbmdzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3J3YXJkID0gZmFsc2U7Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQotCXByaXZhdGUgaW50IGZFbmQgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU51bWJlciA9IC0xOwotCXByaXZhdGUgaW50IGZDYWNoZWRMaW5lT2Zmc2V0ID0gLTE7Ci0KLQotCXB1YmxpYyBKYXZhQ29kZVJlYWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgcmVhZCBjaGFyYWN0ZXIuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciByZWFkIGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZGb3J3YXJkID8gZk9mZnNldCAtIDEgOiBmT2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gdHJ1ZTsKLQkJZkVuZCA9IE1hdGgubWluKGZEb2N1bWVudC5nZXRMZW5ndGgoKSwgZk9mZnNldCArIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJlQmFja3dhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNpbmdsZUNoYXJSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmRm9yd2FyZCA/IHJlYWRGb3J3YXJkcygpIDogcmVhZEJhY2t3YXJkcygpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50RW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonKSB7Ci0JCQkJaWYgKGZPZmZzZXQgPCBmRW5kICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykgewotCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ0VuZChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJ1xcJykgewotCQkJCS8vIGlnbm9yZSBlc2NhcGVkIGNoYXJhY3RlcnMKLQkJCQkrK2ZPZmZzZXQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvTGluZUVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJZk9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUgKyAxKTsKLQl9Ci0KLQlwcml2YXRlIGludCByZWFkRm9yd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0KLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nIDoKLQotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0IDwgZkVuZCkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IGVuZAotCQkJCQkJCSsrZk9mZnNldDsKLQkJCQkJCQlnb3RvQ29tbWVudEVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBsaW5lIGVuZAotCQkJCQkJCWdvdG9MaW5lRW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCWdvdG9TdHJpbmdFbmQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCi0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCi0JCXJldHVybiBFT0Y7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQlpZiAobGluZSA8IGZDYWNoZWRMaW5lTnVtYmVyKSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGxpbmU7Ci0JCQlmQ2FjaGVkTGluZU9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJaW50IG9mZnNldCA9IGZPZmZzZXQ7Ci0JCQl3aGlsZSAoZkNhY2hlZExpbmVPZmZzZXQgPCBvZmZzZXQpIHsKLQkJCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQtLSk7Ci0JCQkJaWYgKGN1cnJlbnQgPT0gJy8nICYmIGZDYWNoZWRMaW5lT2Zmc2V0IDw9IG9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpID09ICcvJykgewotCQkJCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50U3RhcnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQtLSk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicgJiYgMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ1N0YXJ0KGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKCEoMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKSA9PSAnXFwnKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJLS1mT2Zmc2V0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVhZEJhY2t3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQktLWZPZmZzZXQ7Ci0KLQkJCWhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCk7Ci0KLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLycgOgotCi0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPiAxKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgZW5kcywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBzdGFydAotCQkJCQkJCWZPZmZzZXQgLT0gMjsKLQkJCQkJCQlnb3RvQ29tbWVudFN0YXJ0KCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCS0tZk9mZnNldDsKLQkJCQkJCWdvdG9TdHJpbmdTdGFydChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0KLQkJcmV0dXJuIEVPRjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1NWU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hdGNoIHBhaXJzIG9mIGNoYXJhY3RlcnMuCi0gKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQgc28gd2UgZG9uJ3QgaGF2ZSB0bwotICogZGVwZW5kIG9uIHRoZSBvcmcuZWNsaXBzZS5qZHQudWkgcGx1Z2luLgotICogCi0gKiBObyBtb2RpZmljYXRpb25zIHdlcmUgbWFkZS4KLSAqLwotY2xhc3MgSmF2YVBhaXJNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0UG9zOwotCXByb3RlY3RlZCBpbnQgZkVuZFBvczsKLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKYXZhQ29kZVJlYWRlcigpOwotCi0KLQlwdWJsaWMgSmF2YVBhaXJNYXRjaGVyKGNoYXJbXSBwYWlycykgewotCQlmUGFpcnMgPSBwYWlyczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjbWF0Y2gob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCi0JCWlmIChmT2Zmc2V0IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBtYXRjaFBhaXJzQXQoKSAmJiBmU3RhcnRQb3MgIT0gZkVuZFBvcykKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY2xlYXIoKTsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlJlYWRlciA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChmUmVhZGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZlJlYWRlci5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoUGFpcnNBdCgpIHsKLQotCQlpbnQgaTsKLQkJaW50IHBhaXJJbmRleDEgPSBmUGFpcnMubGVuZ3RoOwotCQlpbnQgcGFpckluZGV4MiA9IGZQYWlycy5sZW5ndGg7Ci0KLQkJZlN0YXJ0UG9zID0gLTE7Ci0JCWZFbmRQb3MgPSAtMTsKLQotCQkvLyBnZXQgdGhlIGNoYXJzIHByZWNlZGluZyBhbmQgZm9sbG93aW5nIHRoZSBzdGFydCBwb3NpdGlvbgotCQl0cnkgewotCi0JCQljaGFyIHByZXZDaGFyID0gZkRvY3VtZW50LmdldENoYXIoTWF0aC5tYXgoZk9mZnNldCAtIDEsIDApKTsKLQkJCS8vIG1vZGlmaWVkIGJlaGF2aW9yIGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5CQkJCi0JCQkvLwkJCWNoYXIgbmV4dENoYXI9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCi0JCQkvLyBzZWFyY2ggZm9yIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMDsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCS8vCQkJCWlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLwkJCQkJZlN0YXJ0UG9zPSBmT2Zmc2V0OwotCQkJCS8vCQkJCQlwYWlySW5kZXgxPSBpOwotCQkJCS8vCQkJCX0gZWxzZSAKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZTdGFydFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgxID0gaTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLwkJCQllbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLwkJCQkJZkVuZFBvcz0gZk9mZnNldDsKLQkJCQkvLwkJCQkJcGFpckluZGV4Mj0gaTsKLQkJCQkvLwkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmRW5kUG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gUklHSFQ7Ci0JCQkJZlN0YXJ0UG9zID0gc2VhcmNoRm9yT3BlbmluZ1BlZXIoZkVuZFBvcywgZlBhaXJzW3BhaXJJbmRleDIgLSAxXSwgZlBhaXJzW3BhaXJJbmRleDJdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmU3RhcnRQb3MgPiAtMSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmRW5kUG9zID0gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBMRUZUOwotCQkJCWZFbmRQb3MgPSBzZWFyY2hGb3JDbG9zaW5nUGVlcihmU3RhcnRQb3MsIGZQYWlyc1twYWlySW5kZXgxXSwgZlBhaXJzW3BhaXJJbmRleDEgKyAxXSwgZkRvY3VtZW50KTsKLQkJCQlpZiAoZkVuZFBvcyA+IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWZTdGFydFBvcyA9IC0xOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yQ2xvc2luZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IG9wZW5pbmdQZWVyICYmIGMgIT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNlYXJjaEZvck9wZW5pbmdQZWVyKGludCBvZmZzZXQsIGludCBvcGVuaW5nUGVlciwgaW50IGNsb3NpbmdQZWVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJZlJlYWRlci5jb25maWd1cmVCYWNrd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0LCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IGNsb3NpbmdQZWVyICYmIGMgIT0gb3BlbmluZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gb3BlbmluZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BGaWxlV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BGaWxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhhYWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1jbGFzcyBOZXdKU1BGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCXB1YmxpYyBOZXdKU1BGaWxlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IHRoZSBzZWxlY3RlZCBmb2xkZXIgdG8gd2ViIGNvbnRlbnRzCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpIHsKLQkJc3VwZXIuaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCk7Ci0KLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQotCQlpZiAod2ViQ29udGVudFBhdGggIT0gbnVsbCAmJiAhd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCXNldENvbnRhaW5lckZ1bGxQYXRoKHdlYkNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIGpzcAotCSAqIGZpbGVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChKU1BVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9KU1AsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgdGhlIElQcm9qZWN0IGZvciB0aGUgc2VsZWN0aW9uIHBhdGgKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCWlmICghaXNKYXZhUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQlzZXRNZXNzYWdlKEpTUFVJTWVzc2FnZXMuX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1QsIFdBUk5JTkcpOwotCQkJCX0KLQkJCQkvLyBpZiBpbnNpZGUgd2ViIHByb2plY3QsIGNoZWNrIGlmIGluc2lkZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCWlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHBhdGggaXMgaW5zaWRlIHRoZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkJCQlpZiAoIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQkJCQlzZXRNZXNzYWdlKEpTUFVJTWVzc2FnZXMuX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5ULCBXQVJOSU5HKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGV4dCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgSlNQIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIGZpbGVOYW1lIGlzIHZhbGlkIG5hbWUgZm9yIGNvbnRlbnQgdHlwZS4gVGFrZXMgYmFzZSBjb250ZW50Ci0JICogdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCQl2YWxpZCA9IHR5cGVzW2ldLmlzS2luZE9mKHR5cGUpOwotCQkJCSsraTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB3aGljaCBwcm9qZWN0IGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVByb2plY3Qgb2JqZWN0LiBJZiBwYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSByZXR1cm4KLQkgKiAgICAgICAgIHZhbHVlIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVBhdGgoSVBhdGggcGF0aCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuUFJPSkVDVCkuaXNPSygpKSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgd2ViIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyB3ZWIgcHJvamVjdCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRHluYW1pY1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCWlmIChmYWNldGVkICE9IG51bGwgJiYgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBhIHR5cGUgb2YgamF2YSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBwcm9qZWN0IHRvIGJlIGNoZWNrZWQgKGNhbm5vdCBiZSBudWxsKQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhIHR5cGUgb2YgamF2YSBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNKYXZhID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpc0phdmEgPSBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBpc0phdmE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlciBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3Qgd2hpY2ggd2ViIGNvbnRlbnRzIHBhdGggaXMgbmVlZGVkCi0JICogQHJldHVybiBJUGF0aCBvZiB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlcgotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0V2ViQ29udGVudFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQotCQlyZXR1cm4gcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWVjZThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSIsIEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIEpTUCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5KU1BfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQl2aWV3ZXIuY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IERvY3VtZW50VGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgMCwgMCk7Ci0JCQl0cnkgewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBqc3AiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgSlNQIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKEpTUFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBKU1AgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEpTUFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIHBpY2sgdGhlIGxhc3QgdXNlZCB0ZW1wbGF0ZQotCQkJdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCX0KLQotCQkvLyBubyByZWNvcmQgb2YgbGFzdCB1c2VkIHRlbXBsYXRlIHNvIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCWlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7Ci0JCQkvLyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQkJdGVtcGxhdGUgPSBmVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApOwotCQl9Ci0KLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlbXBsYXRlKTsKLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHBhdHRlcm4gdmlld2VyLgotCSAqLwotCXZvaWQgdXBkYXRlVmlld2VySW5wdXQoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTIwNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgTmV3SlNQV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JcHJpdmF0ZSBOZXdKU1BGaWxlV2l6YXJkUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0pTUEZpbGVXaXphcmRQYWdlKCJKU1BXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpOyAvLyROT04tTkxTLTEkIAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoSlNQVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19IRUFESU5HKTsKLQkJZk5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShKU1BVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX1RJVExFKTsKLQotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1dJWkJBTl9ORVdKU1BGSUxFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcGVyZm9ybWVkT0sgPSBmYWxzZTsKLQotCQkvLyBzYXZlIHVzZXIgb3B0aW9ucyBmb3IgbmV4dCB1c2UKLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLnNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBhZGQgZGVmYXVsdCBleHRlbnNpb24KLQkJU3RyaW5nIGZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQlmTmV3RmlsZVBhZ2Uuc2V0RmlsZU5hbWUobmV3RmlsZU5hbWUpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgbmV3IGVtcHR5IGZpbGUKLQkJSUZpbGUgZmlsZSA9IGZOZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8gaWYgdGhlcmUgd2FzIHByb2JsZW0gd2l0aCBjcmVhdGluZyBmaWxlLCBpdCB3aWxsIGJlIG51bGwsIHNvIG1ha2UKLQkJLy8gc3VyZSB0byBjaGVjawotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBwdXQgdGVtcGxhdGUgY29udGVudHMgaW50byBmaWxlCi0JCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2UuZ2V0VGVtcGxhdGVTdHJpbmcoKTsKLQkJCWlmICh0ZW1wbGF0ZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBKU1AgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBvcGVuIHRoZSBmaWxlIGluIGVkaXRvcgotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQkJLy8gZXZlcnl0aGluZydzIGZpbmUKLQkJCXBlcmZvcm1lZE9LID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkT0s7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWExNTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS92aWV3cy9jb250ZW50b3V0bGluZS9KU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3Igb3V0bGluZSB2aWV3IHBhZ2Ugd2hpY2ggc2hvd3MgSlNQIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRPRE86IEF1dG9tYXRlIHRoZSBsb2FkaW5nIG9mIGEgcmVhbCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBtb2RlbAotCS8vIHR5cGUgYXQKLQkvLyBjcmVhdGlvbiB0aW1lOyBjbGVhciBvbiB1bkNvbmZpZ3VyZSBzbyB0aGF0IGEgbmV3IGVtYmVkZGVkCi0JLy8gY29uZmlndXJhdGlvbiBjYW4KLQkvLyBiZSB1c2VkCi0JLy8gcHJpdmF0ZSBTdHJ1Y3R1cmVkQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGZFbWJlZGRlZENvbmZpZ3VyYXRpb24gPQotCS8vIG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIEpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZWZmNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQubmFtZT1KU1Agc2NyaXB0bGV0Ci1UZW1wbGF0ZXMuanNwc2NyaXB0bGV0LmRlc2M9SlNQIHNjcmlwdGxldCA8JS4uJT4KLVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQuY29udGVudD08JSAke2N1cnNvcn0gJT4KLVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50Lm5hbWU9SlNQIGhpZGRlbiBjb21tZW50Ci1UZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5kZXNjPUpTUCBoaWRkZW4gY29tbWVudCA8JS0tIC0tJT4KLVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmNvbnRlbnQ9PCUtLSAke2N1cnNvcn0gLS0lPgotVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLm5hbWU9SlNQIGRlY2xhcmF0aW9uKHMpCi1UZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24uZGVzYz1KU1AgZGVjbGFyYXRpb24ocykgPCUhLi4lPgotVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLmNvbnRlbnQ9PCUhICR7Y3Vyc29yfSAlPgotVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24ubmFtZT1KU1AgZXhwcmVzc2lvbgotVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24uZGVzYz1KU1AgZXhwcmVzc2lvbiA8JT0uLiU+Ci1UZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5jb250ZW50PTwlPSAke2N1cnNvcn0gJT4KLVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLm5hbWU9SlNQIGluY2x1ZGUgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5kZXNjPUpTUCBpbmNsdWRlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUuY29udGVudD08JUAgaW5jbHVkZSBmaWxlPSIke2N1cnNvcn0iICU+Ci1UZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5uYW1lPUpTUCBwYWdlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuZGVzYz1KU1AgcGFnZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgJT4KLVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUubmFtZT1KU1AgdGFnbGliIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5kZXNjPUpTUCB0YWdsaWIgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIHRhZ2xpYiB1cmk9IiIgcHJlZml4PSIke2N1cnNvcn0iICU+Ci1UZW1wbGF0ZXMuanNwaHRtbC5uYW1lPU5ldyBKU1AgRmlsZSAoaHRtbCkKLVRlbXBsYXRlcy5qc3BodG1sLmRlc2M9SlNQIHdpdGggaHRtbCBtYXJrdXAKLVRlbXBsYXRlcy5qc3BodG1sLmNvbnRlbnQ9PCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iXG4gICAgcGFnZUVuY29kaW5nPSIke2VuY29kaW5nfSIlPlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMuanNweGh0bWwubmFtZT1OZXcgSlNQIEZpbGUgKHhodG1sKQotVGVtcGxhdGVzLmpzcHhodG1sLmRlc2M9SlNQIHdpdGggeGh0bWwgbWFya3VwCi1UZW1wbGF0ZXMuanNweGh0bWwuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IlxuICAgIHBhZ2VFbmNvZGluZz0iJHtlbmNvZGluZ30iJT5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5uYW1lPU5ldyBKU1AgRmlsZSAoeGh0bWwsIHhtbCBzeW50YXgpCi1UZW1wbGF0ZXMuanNweGh0bWx4bWwuZGVzYz1KU1Agd2l0aCB4aHRtbCBtYXJrdXAgYW5kIHhtbCBzdHlsZSBzeW50YXgKLVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMi4wIj5cbiAgICA8anNwOmRpcmVjdGl2ZS5wYWdlIGxhbmd1YWdlPSJqYXZhIlxuICAgICAgICBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiAvPlxuICAgIDxqc3A6dGV4dD5cbiAgICAgICAgPCFbQ0RBVEFbIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PiBdXT5cbiAgICA8L2pzcDp0ZXh0PlxuICAgIDxqc3A6dGV4dD5cbiAgICAgICAgPCFbQ0RBVEFbIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4gXV0+XG4gICAgPC9qc3A6dGV4dD5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD5cbjwvanNwOnJvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzOTYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dGVtcGxhdGVzPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwc2NyaXB0bGV0LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BzY3JpcHRsZXQiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwc2NyaXB0bGV0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24ubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24uZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24uZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGV4cHJlc3Npb24iIGNvbnRleHQ9ImpzcF9hbGwiIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZSIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BodG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcGh0bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGh0bWwiIGNvbnRleHQ9ImpzcF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwaHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNweGh0bWwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNweGh0bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHhodG1sIiBjb250ZXh0PSJqc3BfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHhodG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNweGh0bWx4bWwiIGNvbnRleHQ9ImpzcF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNweGh0bWx4bWwuY29udGVudDwvdGVtcGxhdGU+Ci08L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ5NDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiBraW5kPSJjb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvY29yZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9ImJpbiIga2luZD0ib3V0cHV0Ii8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJmNjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWNzc21vZGVsLmphcgotYnVpbGQueG1sCi1kZXYucHJvcGVydGllcwotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTc1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjA0NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDJhNzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSNTdW4gQXVnIDIwIDAwOjQ5OjExIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDA0OTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyejt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZTsgZXhjZXB0aW9ucz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTFmODA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBjc3Nwcm9maWxlLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzYwMzNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzIj4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvY3NzL292ZXJ2aWV3Lmh0bWwiPjwvZGVzY3JpcHRpb24+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3MtcHJvZmlsZS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzcy1wcm9maWxlLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1MzVhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzcy1wcm9maWxlLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08IS0tIERURCBmb3IgQ1NTIE1ldGEgTW9kZWwgUHJvZmlsZSAtLT4KLQotPCEtLSBFbnRpdGllcyAtLT4KLQotPCEtLSBuYW1lLWRlZmluaXRpb24JOiBJbiBkZWZpbmluZyBtZXRhIG1vZGVsIG9iamVjdCwgb2JqZWN0IG5hbWUgLS0+Ci08IS0tIGlzIGdpdmVuIGJ5IHVzaW5nIHRoaXMgYXR0cmlidXRlLiAtLT4KLQotPCFFTlRJVFkgJSBuYW1lLWRlZmluaXRpb24gJ25hbWUgQ0RBVEEgI1JFUVVJUkVEJyA+Ci0KLTwhLS0gbmFtZS1yZWZlcmVuY2UJCTogdXNlZCB0byByZWZlciBtZXRhIG1vZGVsIG9iamVjdCB0aGF0IGRlZmluZWQgLS0+Ci08IS0tIGJ5IG5hbWUtZGVmaW5pdGlvbiAtLT4KLQotPCFFTlRJVFkgJSBuYW1lLXJlZmVyZW5jZSAnbmFtZSBDREFUQSAjUkVRVUlSRUQnID4KLQotPCEtLSBhdmFpbGFiaWxpdHkJCTogQ1NTIE1ldGEgTW9kZWwgUHJvZmlsZSBwZXJtaXQgaW1wb3J0aW5nIC0tPgotPCEtLSBvdGhlciBwcm9maWxlIGFuZCBkZXNjcmliZSBkaWZmZXJlbmNlIGZvciBpdC4gLS0+Ci0KLTwhRU5USVRZICUgYXZhaWxhYmlsaXR5ICdlbmFibGVkICh0cnVlIHwgZmFsc2UpICJ0cnVlIicgPgotPCFFTlRJVFkgJSBvdmVyd3JpdGUgJ292ZXJ3cml0ZSAodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiJyA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKiogLS0+Ci08IS0tICBlbG1lbnRzL2F0dHJpYnV0ZXMgIC0tPgotPCEtLSAqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPCFFTEVNRU5UIGNzcy1wcm9maWxlIChwcm9maWxlLWltcG9ydD8gLCAoc3R5bGVzaGVldC1kZWYgfCBjaGFyc2V0LXJ1bGUtZGVmIHwgaW1wb3J0LXJ1bGUtZGVmIHwgcGFnZS1ydWxlLWRlZiB8IG1lZGlhLXJ1bGUtZGVmIHwgZm9udGZhY2UtcnVsZS1kZWYgfCBzdHlsZS1ydWxlLWRlZiB8IHByb3BlcnR5LWRlZiB8IGRlc2NyaXB0b3ItZGVmIHwgY29udGFpbmVyLWRlZiB8IGZ1bmN0aW9uLWRlZiB8IG51bWJlci1kZWYgfCB1bml0LWRlZiB8IGtleXdvcmQtZGVmIHwgY2F0ZWdvcnktZGVmIHwgcHNldWRvLWVsZW1lbnQtZGVmIHwgcHNldWRvLWNsYXNzLWRlZikqKSA+Ci0KLTwhLS0gYSBwcm9maWxlIGNhbiBpbmNsdWRlIG90aGVyIHByb2ZpbGUgLS0+Ci0KLTwhRUxFTUVOVCBwcm9maWxlLWltcG9ydCBFTVBUWSA+Ci08IUFUVExJU1QgcHJvZmlsZS1pbXBvcnQgbmFtZSBDREFUQSAjUkVRVUlSRUQgPgotCi08IS0tIHdoaWNoIHR5cGUgb2YgcnVsZSBjYW4gYmUgdXNlZD8gLS0+Ci0KLTwhRUxFTUVOVCBzdHlsZXNoZWV0LWRlZiAoZGVzY3JpcHRpb24/ICwgKGNoYXJzZXQtcnVsZSB8IGltcG9ydC1ydWxlIHwgcGFnZS1ydWxlIHwgbWVkaWEtcnVsZSB8IGZvbnRmYWNlLXJ1bGUgfCBzdHlsZS1ydWxlKSopID4KLTwhQVRUTElTVCBzdHlsZXNoZWV0LWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBjaGFyc2V0LXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIGNoYXJzZXQtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgaW1wb3J0LXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIGltcG9ydC1ydWxlICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBwYWdlLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIHBhZ2UtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgbWVkaWEtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1QgbWVkaWEtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgZm9udGZhY2UtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1QgZm9udGZhY2UtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgc3R5bGUtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1Qgc3R5bGUtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci0KLTwhRUxFTUVOVCBjaGFyc2V0LXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8pID4KLTwhQVRUTElTVCBjaGFyc2V0LXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGltcG9ydC1ydWxlLWRlZiAoZGVzY3JpcHRpb24/KSA+Ci08IUFUVExJU1QgaW1wb3J0LXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIHBhZ2UtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPyAsIChwcm9wZXJ0eSB8IHBzZXVkby1jbGFzcykqKSA+Ci08IUFUVExJU1QgcGFnZS1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBtZWRpYS1ydWxlLWRlZiAoZGVzY3JpcHRpb24/KSA+Ci08IUFUVExJU1QgbWVkaWEtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgZm9udGZhY2UtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPyAsIGRlc2NyaXB0b3IqKSA+Ci08IUFUVExJU1QgZm9udGZhY2UtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgc3R5bGUtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPyAsIChwcm9wZXJ0eSB8IHNlbGVjdG9yLWV4cHJlc3Npb24gfCBwc2V1ZG8tY2xhc3MgfCBwc2V1ZG8tZWxlbWVudCkqKSA+Ci08IUFUVExJU1Qgc3R5bGUtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgc2VsZWN0b3ItZXhwcmVzc2lvbiBFTVBUWSA+Ci08IUFUVExJU1Qgc2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lIChkZXNjZW5kYW50IHwgY2hpbGQgfCBhZGphY2VudCB8IHVuaXZlcnNhbCB8IGF0dHJpYnV0ZSkgI1JFUVVJUkVEICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHBzZXVkby1jbGFzcyBFTVBUWSA+Ci08IUFUVExJU1QgcHNldWRvLWNsYXNzICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgcHNldWRvLWVsZW1lbnQgRU1QVFkgPgotPCFBVFRMSVNUIHBzZXVkby1lbGVtZW50ICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgcHNldWRvLWNsYXNzLWRlZiAoZGVzY3JpcHRpb24/LCBzZWxlY3Rvci12YWx1ZSkgPgotPCFBVFRMSVNUIHBzZXVkby1jbGFzcy1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIHNlbGVjdG9yLXZhbHVlICgjUENEQVRBKSA+Ci0KLTwhRUxFTUVOVCBwc2V1ZG8tZWxlbWVudC1kZWYgKGRlc2NyaXB0aW9uPywgc2VsZWN0b3ItdmFsdWUpID4KLTwhQVRUTElTVCBwc2V1ZG8tZWxlbWVudC1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQga2V5d29yZC1kZWYgKGRlc2NyaXB0aW9uPyAsIGtleXdvcmQtdmFsdWUpID4KLTwhQVRUTElTVCBrZXl3b3JkLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQga2V5d29yZC12YWx1ZSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKSA+Ci0KLTwhRUxFTUVOVCBmdW5jdGlvbi1kZWYgKGRlc2NyaXB0aW9uPyAsIGZ1bmN0aW9uLXZhbHVlKSA+Ci08IUFUVExJU1QgZnVuY3Rpb24tZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCBmdW5jdGlvbi12YWx1ZSAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgbnVtYmVyLWRlZiAoZGVzY3JpcHRpb24/ICwgdW5pdCopID4KLTwhQVRUTElTVCBudW1iZXItZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCB1bml0IEVNUFRZID4KLTwhQVRUTElTVCB1bml0ICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgdW5pdC1kZWYgKGRlc2NyaXB0aW9uPyAsIHVuaXQtdmFsdWUpID4KLTwhQVRUTElTVCB1bml0LWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgdW5pdC12YWx1ZSAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgY29udGFpbmVyLWRlZiAoZGVzY3JpcHRpb24/ICwgKG51bWJlciB8IGtleXdvcmQgfCBmdW5jdGlvbiB8IGNvbnRhaW5lcikqKSA+Ci08IUFUVExJU1QgY29udGFpbmVyLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBjYXRlZ29yeS1kZWYgKGRlc2NyaXB0aW9uPywgY2FwdGlvbikgPgotPCFBVFRMSVNUIGNhdGVnb3J5LWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgY2FwdGlvbiAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgcHJvcGVydHktZGVmIChkZXNjcmlwdGlvbj8gLCAobnVtYmVyIHwga2V5d29yZCB8IGZ1bmN0aW9uIHwgY29udGFpbmVyIHwgc3RyaW5nIHwgc2VwYXJhdG9yIHwgcHJvcGVydHkpKikgPgotPCFBVFRMSVNUIHByb3BlcnR5LWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOwotCQkJCQkgICBpbmhlcml0ZWQgKHllcyB8IG5vIHwgbmEpICJuYSIKLQkJCQkJICAgbWVkaWFncm91cCBDREFUQSAjSU1QTElFRAotCQkJCQkgICBjYXRlZ29yeSBDREFUQSAjSU1QTElFRCA+Ci08IUVMRU1FTlQgZGVzY3JpcHRvci1kZWYgKGRlc2NyaXB0aW9uPywgKG51bWJlciB8IGtleXdvcmQgfCBmdW5jdGlvbiB8IGNvbnRhaW5lciB8IHN0cmluZyB8IHNlcGFyYXRvciB8IHByb3BlcnR5KSopID4KLTwhQVRUTElTVCBkZXNjcmlwdG9yLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBudW1iZXIgRU1QVFkgPgotPCFBVFRMSVNUIG51bWJlciAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQga2V5d29yZCBFTVBUWSA+Ci08IUFUVExJU1Qga2V5d29yZCAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQgZnVuY3Rpb24gRU1QVFkgPgotPCFBVFRMSVNUIGZ1bmN0aW9uICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIGNvbnRhaW5lciBFTVBUWSA+Ci08IUFUVExJU1QgY29udGFpbmVyICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPiAKLTwhRUxFTUVOVCBzdHJpbmcgRU1QVFkgPgotPCFBVFRMSVNUIHN0cmluZyAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBzZXBhcmF0b3IgRU1QVFkgPgotPCFBVFRMSVNUIHNlcGFyYXRvciBuYW1lIChjb21tYSB8IHNsYXNoKSAjUkVRVUlSRUQgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIHByb3BlcnR5IEVNUFRZID4KLTwhQVRUTElTVCBwcm9wZXJ0eSAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQgZGVzY3JpcHRvciBFTVBUWSA+Ci08IUFUVExJU1QgZGVzY3JpcHRvciAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjE3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0JPHN0eWxlc2hlZXQtZGVmPgotCQk8ZGVzY3JpcHRpb24+JWNzczEuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8aW1wb3J0LXJ1bGUvPgotCQk8c3R5bGUtcnVsZS8+Ci0JPC9zdHlsZXNoZWV0LWRlZj4KLQotCTxpbXBvcnQtcnVsZS1kZWY+Ci0JPC9pbXBvcnQtcnVsZS1kZWY+Ci0KLQk8c3R5bGUtcnVsZS1kZWY+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImRlc2NlbmRhbnQiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxpbmUiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxldHRlciIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxpbmsiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJ2aXNpdGVkIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iYWN0aXZlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcmVwZWF0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsZWFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlzcGxheSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZmxvYXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtZmFtaWx5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtdmFyaWFudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC13ZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGV0dGVyLXNwYWNpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLWltYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZyIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtYWxpZ24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtZGVjb3JhdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1pbmRlbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtdHJhbnNmb3JtIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIvPgotCQk8cHJvcGVydHkgbmFtZT0id2hpdGUtc3BhY2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciLz4KLQk8L3N0eWxlLXJ1bGUtZGVmPgotCi0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0ibGluayI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5saW5rPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0idmlzaXRlZCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT52aXNpdGVkPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iYWN0aXZlIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmFjdGl2ZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCi0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJmaXJzdC1saW5lIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxpbmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGV0dGVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxldHRlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0KLQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0cmFuc3BhcmVudCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgIDwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQteCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQteSIvPgotCQk8a2V5d29yZCBuYW1lPSJuby1yZXBlYXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlciIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItY29sb3IiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItc3R5bGUiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRvdHRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJkYXNoZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic29saWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZG91YmxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imdyb292ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWRnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbnNldCIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzZXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3AiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3Atd2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNsZWFyIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvbG9yIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZmxvYXQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8c2VwYXJhdG9yIG5hbWU9InNsYXNoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LWZhbWlseSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc2l6ZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJhYnNvbHV0ZS1zaXplIi8+Ci0JCTxjb250YWluZXIgbmFtZT0icmVsYXRpdmUtc2l6ZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc3R5bGUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJpdGFsaWMiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2JsaXF1ZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC12YXJpYW50IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGwtY2FwcyIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC13ZWlnaHQiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsaWdodGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjEwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIyMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjQwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI1MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjcwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI4MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iOTAwIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJoZWlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGV0dGVyLXNwYWNpbmciIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGluZS1oZWlnaHQiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imluc2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzaWRlIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9Imluc2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzaWRlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXRvcCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tcmlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLWJvdHRvbSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tbGVmdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLXRvcCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1yaWdodCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1ib3R0b20iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctbGVmdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1kZWNvcmF0aW9uIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im92ZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpbmUtdGhyb3VnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJibGluayIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1pbmRlbnQiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC10cmFuc2Zvcm0iIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNhcGl0YWxpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXJjYXNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyY2FzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtdG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1pZGRsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC1ib3R0b20iLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aGl0ZS1zcGFjZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJwcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm93cmFwIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3b3JkLXNwYWNpbmciIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCi0JPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0JSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotICAgIDxjb250YWluZXItZGVmIG5hbWU9ImFic29sdXRlLXNpemUiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4eC1zbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4LXNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsYXJnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4LWxhcmdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Inh4LWxhcmdlIi8+Ci0gICAgPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIj4KLQkJPGtleXdvcmQgbmFtZT0iYXF1YSIvPgotCQk8a2V5d29yZCBuYW1lPSJibGFjayIvPgotCQk8a2V5d29yZCBuYW1lPSJibHVlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZ1Y2hzaWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JheSIvPgotCQk8a2V5d29yZCBuYW1lPSJncmVlbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW1lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hcm9vbiIvPgotCQk8a2V5d29yZCBuYW1lPSJuYXZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9saXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InB1cnBsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJyZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2lsdmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRlYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0id2hpdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ieWVsbG93Ii8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJyZ2IiLz4KLQkJPG51bWJlciBuYW1lPSJoYXNoIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ij4KLQkJPGtleXdvcmQgbmFtZT0ic2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2Fucy1zZXJpZiIvPgotCQk8a2V5d29yZCBuYW1lPSJjdXJzaXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZhbnRhc3kiLz4KLQkJPGtleXdvcmQgbmFtZT0ibW9ub3NwYWNlIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InJlbGF0aXZlLXNpemUiPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxhcmdlciIvPgotCTwvY29udGFpbmVyLWRlZj4KLQotCTwhLS0gY2F0ZWdvcnkgZGVmaW5pdGlvbiA6IFRoaXMgaXMgdXNlZCB0byBjYXRlZ29yaXplIHByb3BlcnRpZXMKLQlpbiBQcm9wZXJ0aWVzIFZpZXcuIC0tPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iYm94Ij4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY2xhc3NpZmljYXRpb24iPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYuY2xhc3NpZmljYXRpb24uY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImZvbnQiPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idGV4dCI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InJnYiI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5yZ2I8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0idXJpIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPnVybDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JCi0JPCEtLSBudW1iZXIgZGVmaW5pdGlvbiA6IFdoYXQgdW5pdCB0eXBlcyBiZSBhY2NlcHRhYmxlIGZvciBlYWNoCi0JbnVtYmVyIHR5cGU/IC0tPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imhhc2giPgotICAgICAgICA8dW5pdCBuYW1lPSJoYXNoIi8+Ci0gICAgPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imxlbmd0aCI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImVtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImV4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImluIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImNtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9Im1tIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB0Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InBjIi8+Ci0gICAgPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9Im51bWJlciI+Ci0JPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdCBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9udW1iZXItZGVmPgotCi0JPHVuaXQtZGVmIG5hbWU9ImNtIj4KLQkJPHVuaXQtdmFsdWU+Y208L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZW0iPgotCQk8dW5pdC12YWx1ZT5lbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJleCI+Ci0JCTx1bml0LXZhbHVlPmV4PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Imhhc2giPgotCQk8dW5pdC12YWx1ZT4jPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImluIj4KLQkJPHVuaXQtdmFsdWU+aW48L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ibW0iPgotCQk8dW5pdC12YWx1ZT5tbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwYyI+Ci0JCTx1bml0LXZhbHVlPnBjPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdC12YWx1ZT4lPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB0Ij4KLQkJPHVuaXQtdmFsdWU+cHQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icHgiPgotCQk8dW5pdC12YWx1ZT5weDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCi0gICAgPCEtLSBrZXl3b3JkcyA6IHN0cmluZyBjb25zdGFudHMgKHRoaXMgaXMgbGFzdCBwYXJ0Li4pIC0tPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIxMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4xMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMjAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MjAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjMwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjMwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI0MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT40MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjYwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjYwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI3MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT43MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iODAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ODAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjkwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjkwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcXVhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXF1YTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhdXRvIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXV0bzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiYXNlbGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJhc2VsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsYWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmxhY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxpbmsiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibGluazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibG9jayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsdWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibHVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvbGRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3RoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90aDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3R0b20iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FwaXRhbGl6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcGl0YWxpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNpcmNsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNpcmNsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdXJzaXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Vyc2l2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkYXNoZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kYXNoZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVjaW1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlY2ltYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGlzYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRpc2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG90dGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG90dGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYW50YXN5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFudGFzeTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmaXhlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZpeGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZ1Y2hzaWEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mdWNoc2lhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyYXkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncmF5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyZWVuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JlZW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3Jvb3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3Jvb3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImlubGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmlubGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnNldCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imluc2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpdGFsaWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pdGFsaWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ianVzdGlmeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmp1c3RpZnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYXJnZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGlnaHRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpZ2h0ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGltZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGluZS10aHJvdWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGluZS10aHJvdWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxpc3QtaXRlbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpc3QtaXRlbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLXJvbWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItcm9tYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXJjYXNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXJjYXNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hcm9vbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hcm9vbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZWRpdW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tZWRpdW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWlkZGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWlkZGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1vbm9zcGFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1vbm9zcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuYXZ5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmF2eTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuby1yZXBlYXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uby1yZXBlYXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9uZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9ybWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm9ybWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vd3JhcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vd3JhcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvYmxpcXVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b2JsaXF1ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvbGl2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9saXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im91dHNldCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm91dHNldDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdXRzaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3V0c2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdmVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm92ZXJsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InByZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnByZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwdXJwbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wdXJwbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC14PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC15Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlkZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWRnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNhbnMtc2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zYW5zLXNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNjcm9sbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNjcm9sbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZXJpZiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNpbHZlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNpbHZlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXBzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvbGlkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c29saWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3F1YXJlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3F1YXJlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN1YiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN1Yjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdXBlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN1cGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRlYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQtdG9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dC10b3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dC1ib3R0b20iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0LWJvdHRvbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0aGljayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRoaWNrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRoaW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50aGluPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0cmFuc3BhcmVudCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRyYW5zcGFyZW50PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVuZGVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVuZGVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLXJvbWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItcm9tYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXJjYXNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXJjYXNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndoaXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2hpdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1sYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtbGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtc21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4eC1sYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnh4LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InllbGxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnllbGxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZmMwODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8c3R5bGVzaGVldC1kZWY+Ci0JCTxkZXNjcmlwdGlvbj4lY3NzMi5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTxjaGFyc2V0LXJ1bGUvPgotCQk8aW1wb3J0LXJ1bGUvPgotCQk8cGFnZS1ydWxlLz4KLQkJPG1lZGlhLXJ1bGUvPgotCQk8Zm9udGZhY2UtcnVsZS8+Ci0JCTxzdHlsZS1ydWxlLz4KLQk8L3N0eWxlc2hlZXQtZGVmPgotCi0JPGNoYXJzZXQtcnVsZS1kZWY+Ci0JPC9jaGFyc2V0LXJ1bGUtZGVmPgotCTxpbXBvcnQtcnVsZS1kZWY+Ci0JPC9pbXBvcnQtcnVsZS1kZWY+Ci0JPG1lZGlhLXJ1bGUtZGVmPgotCTwvbWVkaWEtcnVsZS1kZWY+Ci0KLQk8cGFnZS1ydWxlLWRlZj4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsZWZ0Ii8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0icmlnaHQiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmaXJzdCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWluc2lkZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3JwaGFucyIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkb3dzIi8+Ci0JPC9wYWdlLXJ1bGUtZGVmPgotCi0JPGZvbnRmYWNlLXJ1bGUtZGVmPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJhc2NlbnQiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iYmFzZWxpbmUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iYmJveCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJjYXAtaGVpZ2h0Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImNlbnRlcmxpbmUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZGVmaW5pdGlvbi1zcmMiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZGVzY2VudCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXNpemUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC1zdHJldGNoIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtc3R5bGUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9Im1hdGhsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InBhbm9zZS0xIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InNsb3BlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InNsb3BlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InNyYyIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzdGVtaCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzdGVtdiIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ0b3BsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InVuaWNvZGUtcmFuZ2UiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0idW5pdHMtcGVyLWVtIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9IndpZHRocyIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ4LWhlaWdodCIvPgotCTwvZm9udGZhY2UtcnVsZS1kZWY+Ci0KLQk8IS0tIFdoaWNoIHByb3BlcnRpZXMgY2FuIHN0eWxlIHJ1bGUgaW5jbHVkZSA/IC0tPgotCi0JPHN0eWxlLXJ1bGUtZGVmPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJkZXNjZW5kYW50Ii8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImNoaWxkIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImFkamFjZW50Ii8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9InVuaXZlcnNhbCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhdHRyaWJ1dGUiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxpbmUiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxldHRlciIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iYmVmb3JlIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJhZnRlciIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImZpcnN0LWNoaWxkIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGluayIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9InZpc2l0ZWQiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJob3ZlciIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImFjdGl2ZSIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImZvY3VzIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGFuZyIvPgotCQk8cHJvcGVydHkgbmFtZT0iYXppbXV0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sbGFwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXNwYWNpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNhcHRpb24tc2lkZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2xlYXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsaXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb250ZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLWluY3JlbWVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1yZXNldCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYWZ0ZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1cnNvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkaXNwbGF5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbGV2YXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVtcHR5LWNlbGxzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmbG9hdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplLWFkanVzdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHJldGNoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJoZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS10eXBlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtlci1vZmZzZXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3JwaGFucyIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3ZlcmZsb3ciLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1hZnRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaXRjaCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2gtcmFuZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsYXktZHVyaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0icXVvdGVzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWNobmVzcyIvPgotCQk8cHJvcGVydHkgbmFtZT0icmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1oZWFkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLW51bWVyYWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVlY2gtcmF0ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3RyZXNzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YWJsZS1sYXlvdXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtYWxpZ24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtZGVjb3JhdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1pbmRlbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtc2hhZG93Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXRyYW5zZm9ybSIvPgotCQk8cHJvcGVydHkgbmFtZT0idG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ1bmljb2RlLWJpZGkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnRpY2FsLWFsaWduIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmlsaXR5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2ljZS1mYW1pbHkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZvbHVtZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id2hpdGUtc3BhY2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZG93cyIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmQtc3BhY2luZyIvPgotCQk8cHJvcGVydHkgbmFtZT0iei1pbmRleCIvPgotCTwvc3R5bGUtcnVsZS1kZWY+Ci0KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJmaXJzdC1jaGlsZCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1jaGlsZDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxpbmsiPgotCQk8c2VsZWN0b3ItdmFsdWU+bGluazwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9InZpc2l0ZWQiPgotCQk8c2VsZWN0b3ItdmFsdWU+dmlzaXRlZDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImhvdmVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmhvdmVyPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iYWN0aXZlIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmFjdGl2ZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImZvY3VzIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZvY3VzPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0ibGFuZyI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5sYW5nPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0ibGVmdCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5sZWZ0PC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0icmlnaHQiPgotCQk8c2VsZWN0b3ItdmFsdWU+cmlnaHQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJmaXJzdCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCi0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJmaXJzdC1saW5lIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxpbmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGV0dGVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxldHRlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJiZWZvcmUiPgotCQk8c2VsZWN0b3ItdmFsdWU+YmVmb3JlPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImFmdGVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmFmdGVyPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQotCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLQotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYXppbXV0aCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwcm92aWRlcyBzcGF0aWFsIGF1ZGlvIHByb3BlcnR5IGZvciBhdXJhbAotICAgICAgICBwcmVzZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bnVtYmVyIG5hbWU9ImFuZ2xlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnQtc2lkZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJmYXItbGVmdCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImNlbnRlci1sZWZ0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXItcmlnaHQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFyLXJpZ2h0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0LXNpZGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iYmVoaW5kIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnR3YXJkcyIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodHdhcmRzIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0idHJhbnNwYXJlbnQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtcmVwZWF0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXgiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tcmVwZWF0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWNvbGxhcHNlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0iY29sbGFwc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VwYXJhdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRyYW5zcGFyZW50Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1zcGFjaW5nIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcC1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbS1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdC1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQtc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20tc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0LXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY2FwdGlvbi1zaWRlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNsZWFyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjbGlwIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8Y29udGFpbmVyIG5hbWU9InNoYXBlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY29sb3IiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvbnRlbnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImFueSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJjb3VudGVyIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJhdHRyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9wZW4tcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2xvc2UtcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tb3Blbi1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuby1jbG9zZS1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb3VudGVyLWluY3JlbWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iY291bnRlci1pZGVudGlmaWVyIi8+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvdW50ZXItcmVzZXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImNvdW50ZXItaWRlbnRpZmllciIvPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1ZS1hZnRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUtYmVmb3JlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1cnNvciIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3NzaGFpciIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWZhdWx0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InBvaW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibW92ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJlLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuZS1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibnctcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im4tcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0icy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJ3YWl0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhlbHAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXJlY3Rpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJsdHIiLz4KLQkJPGtleXdvcmQgbmFtZT0icnRsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJibG9jayIvPgotCQk8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLQkJPGtleXdvcmQgbmFtZT0icnVuLWluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbXBhY3QiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWFya2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZS10YWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1yb3ctZ3JvdXAiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtaGVhZGVyLWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWZvb3Rlci1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1yb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtY29sdW1uLWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNvbHVtbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jZWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJlbGV2YXRpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJhbmdsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJiZWxvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJsZXZlbCIvPgotCQk8a2V5d29yZCBuYW1lPSJhYm92ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWdoZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZW1wdHktY2VsbHMiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJzaG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZmxvYXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8a2V5d29yZCBuYW1lPSJjYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imljb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVudSIvPgotCQk8a2V5d29yZCBuYW1lPSJtZXNzYWdlLWJveCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN0YXR1cy1iYXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9InNsYXNoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LWZhbWlseSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8c3RyaW5nIG5hbWU9ImZhbWlseS1uYW1lIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXNpemUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJhYnNvbHV0ZS1zaXplIi8+Ci0JCTxjb250YWluZXIgbmFtZT0icmVsYXRpdmUtc2l6ZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zaXplLWFkanVzdCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc3RyZXRjaCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0id2lkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibmFycm93ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJjb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXN0eWxlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJpdGFsaWMiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2JsaXF1ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXZhcmlhbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsLWNhcHMiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC13ZWlnaHQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpZ2h0ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iMTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjIwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIzMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNDAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjUwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI2MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjgwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI5MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iaGVpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsZXR0ZXItc3BhY2luZyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGluZS1oZWlnaHQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLWltYWdlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXBvc2l0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxrZXl3b3JkIG5hbWU9Imluc2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsLWxlYWRpbmctemVybyIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1ncmVlayIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1sYXRpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1sYXRpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJoZWJyZXciLz4KLQkJPGtleXdvcmQgbmFtZT0iYXJtZW5pYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iZ2VvcmdpYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iY2prLWlkZW9ncmFwaGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpcmFnYW5hIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImthdGFrYW5hIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpcmFnYW5hLWlyb2hhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImthdGFrYW5hLWlyb2hhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tdG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tcmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0ibWFyZ2luLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1ib3R0b20iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0ibWFyZ2luLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1sZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJrZXItb2Zmc2V0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJrcyIKLQkJaW5oZXJpdGVkPSJuYSIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3AiLz4KLQkJPGtleXdvcmQgbmFtZT0iY3Jvc3MiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXgtaGVpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXgtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1pbi1oZWlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1pbi13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3JwaGFucyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdXRsaW5lLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW52ZXJ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUtc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZS13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdmVyZmxvdyIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0idmlzaWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWRkZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZyIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctdG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1yaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1sZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8c3RyaW5nIG5hbWU9InBhZ2UtaWRlbnRpZmllciIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJhbHdheXMiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXZvaWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx3YXlzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPGtleXdvcmQgbmFtZT0iYXZvaWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYXVzZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0idGltZSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGF1c2UtYWZ0ZXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhdXNlLWJlZm9yZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0idGltZSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGl0Y2giCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJmcmVxdWVuY3kiLz4KLQkJPGtleXdvcmQgbmFtZT0ieC1sb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWdoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtaGlnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwaXRjaC1yYW5nZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwbGF5LWR1cmluZyIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWl4Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icG9zaXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InN0YXRpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJyZWxhdGl2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhYnNvbHV0ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmaXhlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJxdW90ZXMiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHN0cmluZyBuYW1lPSJhbnkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJyaWNobmVzcyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJyaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic2l6ZSIKLQkJaW5oZXJpdGVkPSJuYSIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0icG9ydHJhaXQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGFuZHNjYXBlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNwZWxsLW91dCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhay1oZWFkZXIiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9Im9uY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx3YXlzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrLW51bWVyYWwiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGtleXdvcmQgbmFtZT0iZGlnaXRzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbnRpbnVvdXMiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlYWstcHVuY3R1YXRpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGtleXdvcmQgbmFtZT0iY29kZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWVjaC1yYXRlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Ingtc2xvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJzbG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJmYXN0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtZmFzdCIvPgotCQk8a2V5d29yZCBuYW1lPSJmYXN0ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2xvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InN0cmVzcyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0YWJsZS1sYXlvdXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iZml4ZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0JCTxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im92ZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpbmUtdGhyb3VnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJibGluayIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWluZGVudCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1zaGFkb3ciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LXRyYW5zZm9ybSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJjYXBpdGFsaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyY2FzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0b3AiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InVuaWNvZGUtYmlkaSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImVtYmVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJpZGktb3ZlcnJpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImJhc2VsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1YiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdXBlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC10b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWlkZGxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZXh0LWJvdHRvbSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmlzaWJpbGl0eSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0idmlzaWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWRkZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iY29sbGFwc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idm9pY2UtZmFtaWx5IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxzdHJpbmcgbmFtZT0ic3BlY2lmaWMtdm9pY2UiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJnZW5lcmljLXZvaWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZvbHVtZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2lsZW50Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Ingtc29mdCIvPgotCQk8a2V5d29yZCBuYW1lPSJzb2Z0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtbG91ZCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aGl0ZS1zcGFjZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0icHJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vd3JhcCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aWRvd3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3b3JkLXNwYWNpbmciCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InotaW5kZXgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQotCTwhLS0gZGVzY3JpcHRvciBkZWZpbml0aW9uIDogVGhlc2UgYXJlIGZvciBAZm9udC1mYWNlIC0tPgotCi0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImFzY2VudCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iYmFzZWxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImJib3giPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iY2FwLWhlaWdodCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iY2VudGVybGluZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZGVmaW5pdGlvbi1zcmMiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZGVzY2VudCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1mYW1pbHkiPgotCQk8c3RyaW5nIG5hbWU9ImZhbWlseS1uYW1lIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtc2l6ZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1zdHJldGNoIj4KLQkJPGtleXdvcmQgbmFtZT0iYWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXh0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzZW1pLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzZW1pLWV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVsdHJhLWV4cGFuZGVkIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXN0eWxlIj4KLQkJPGtleXdvcmQgbmFtZT0iYWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJpdGFsaWMiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2JsaXF1ZSIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC12YXJpYW50Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsLWNhcHMiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtd2VpZ2h0Ij4KLQkJPGtleXdvcmQgbmFtZT0iYWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjEwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIyMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjQwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI1MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjcwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI4MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iOTAwIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJtYXRobGluZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0icGFub3NlLTEiPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJzbG9wZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic3JjIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0iZm9ybWF0Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0iZm9udC1mYWNlLW5hbWUiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJzdGVtaCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic3RlbXYiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InRvcGxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InVuaWNvZGUtcmFuZ2UiPgotCQk8c3RyaW5nIG5hbWU9InVyYW5nZSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InVuaXRzLXBlci1lbSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0id2lkdGhzIj4KLQkJPHN0cmluZyBuYW1lPSJ1cmFuZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ4LWhlaWdodCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQotCTwhLS0gY29udGFpbmVyIGRlZmluaXRpb24gOiBDb250YWluZXIgaXMgdGhlIGx1bXAgb2YgdmFsdWVzLgotCUl0IGNhbiBiZSB1c2VkIGxpa2UgbWFjcm9zLiAtLT4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhYnNvbHV0ZS1zaXplIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1zbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1sYXJnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4eC1sYXJnZSIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJib3JkZXItc3R5bGUiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImhpZGRlbiIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJkb3R0ZWQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZGFzaGVkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNvbGlkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImRvdWJsZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJncm9vdmUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0icmlkZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5zZXQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ib3V0c2V0Ii8+Ci0gICAgPC9jb250YWluZXItZGVmPgotICAgIDxjb250YWluZXItZGVmIG5hbWU9ImJvcmRlci13aWR0aCI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0gICAgICAgIDxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIj4KLQkJPGtleXdvcmQgbmFtZT0iYXF1YSIvPgotCQk8a2V5d29yZCBuYW1lPSJibGFjayIvPgotCQk8a2V5d29yZCBuYW1lPSJibHVlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZ1Y2hzaWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JheSIvPgotCQk8a2V5d29yZCBuYW1lPSJncmVlbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW1lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hcm9vbiIvPgotCQk8a2V5d29yZCBuYW1lPSJuYXZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9saXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InB1cnBsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJyZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2lsdmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRlYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0id2hpdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ieWVsbG93Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0ic3lzdGVtLWNvbG9yIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJyZ2IiLz4KLQkJPG51bWJlciBuYW1lPSJoYXNoIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ij4KLQkJPGtleXdvcmQgbmFtZT0ic2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2Fucy1zZXJpZiIvPgotCQk8a2V5d29yZCBuYW1lPSJjdXJzaXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZhbnRhc3kiLz4KLQkJPGtleXdvcmQgbmFtZT0ibW9ub3NwYWNlIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImZvbnQtZmFjZS1uYW1lIj4KLQkJPGZ1bmN0aW9uIG5hbWU9ImxvY2FsIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImdlbmVyaWMtdm9pY2UiPgotCQk8a2V5d29yZCBuYW1lPSJtYWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZlbWFsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJjaGlsZCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJtYXJnaW4td2lkdGgiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJwYWRkaW5nLXdpZHRoIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InJlbGF0aXZlLXNpemUiPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxhcmdlciIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJzaGFwZSI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJyZWN0Ii8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InN5c3RlbS1jb2xvciI+Ci0JCTxrZXl3b3JkIG5hbWU9IkFjdGl2ZUJvcmRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJBY3RpdmVDYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkFwcFdvcmtzcGFjZSIvPgotCQk8a2V5d29yZCBuYW1lPSJCYWNrZ3JvdW5kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvbkZhY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uSGlnaGxpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvblNoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkNhcHRpb25UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkdyYXlUZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkhpZ2hsaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJIaWdobGlnaHRUZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluYWN0aXZlQm9yZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluYWN0aXZlQ2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmFjdGl2ZUNhcHRpb25UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluZm9CYWNrZ3JvdW5kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluZm9UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Ik1lbnUiLz4KLQkJPGtleXdvcmQgbmFtZT0iTWVudVRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iU2Nyb2xsYmFyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlRERhcmtTaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVERmFjZSIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURIaWdobGlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVETGlnaHRTaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVEU2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IldpbmRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJXaW5kb3dGcmFtZSIvPgotCQk8a2V5d29yZCBuYW1lPSJXaW5kb3dUZXh0Ii8+Ci0JPC9jb250YWluZXItZGVmPgotCi0JPCEtLSBjYXRlZ29yeSBkZWZpbml0aW9uIDogVGhpcyBpcyB1c2VkIHRvIGNhdGVnb3JpemUgcHJvcGVydGllcwotCWluIFByb3BlcnRpZXMgVmlldy4gLS0+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJhdXJhbCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5hdXJhbC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iYm94Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY29udGVudCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5jb250ZW50LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJmb250Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InBhZ2UiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYucGFnZS5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idGFibGVzIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnRhYmxlcy5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idGV4dCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ1aSI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi51aS5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idmlzdWFsIj4KLTwhLS0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi52aXN1YWwuY2FwdGlvbjwvY2FwdGlvbj4tLT4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnZpc3VhbC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCQotCTwhLS0gZnVuY3Rpb24gZGVmaW5pdGlvbiAtLT4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImF0dHIiPgotCQk8ZnVuY3Rpb24tdmFsdWU+YXR0cjwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJjb3VudGVyIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPmNvdW50ZXI8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0icmVjdCI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5yZWN0PC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InJnYiI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5yZ2I8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0idXJpIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPnVybDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJmb3JtYXQiPgotCQk8ZnVuY3Rpb24tdmFsdWU+Zm9ybWF0PC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImxvY2FsIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPmxvY2FsPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQotCTwhLS0gbnVtYmVyIGRlZmluaXRpb24gOiBXaGF0IHVuaXQgdHlwZXMgYmUgYWNjZXB0YWJsZSBmb3IgZWFjaAotCW51bWJlciB0eXBlPyAtLT4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJhbmdsZSI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImRlZyIvPgotICAgICAgICA8dW5pdCBuYW1lPSJncmFkIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9InJhZCIvPgotICAgIDwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJmcmVxdWVuY3kiPgotICAgICAgICA8dW5pdCBuYW1lPSJoeiIvPgotICAgICAgICA8dW5pdCBuYW1lPSJraHoiLz4KLSAgICA8L251bWJlci1kZWY+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0iaGFzaCI+Ci0gICAgICAgIDx1bml0IG5hbWU9Imhhc2giLz4KLSAgICA8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0iaW50ZWdlciI+Ci0JPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imxlbmd0aCI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImVtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImV4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImluIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImNtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9Im1tIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB0Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InBjIi8+Ci0gICAgPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9Im51bWJlciI+Ci0JPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdCBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9InRpbWUiPgotCQk8dW5pdCBuYW1lPSJtcyIvPgotCQk8dW5pdCBuYW1lPSJzIi8+Ci0JPC9udW1iZXItZGVmPgotCi0JPHVuaXQtZGVmIG5hbWU9ImNtIj4KLQkJPHVuaXQtdmFsdWU+Y208L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZGVnIj4KLQkJPHVuaXQtdmFsdWU+ZGVnPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImVtIj4KLQkJPHVuaXQtdmFsdWU+ZW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZXgiPgotCQk8dW5pdC12YWx1ZT5leDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJncmFkIj4KLQkJPHVuaXQtdmFsdWU+Z3JhZDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJoYXNoIj4KLQkJPHVuaXQtdmFsdWU+IzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJoeiI+Ci0JCTx1bml0LXZhbHVlPkh6PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImluIj4KLQkJPHVuaXQtdmFsdWU+aW48L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ia2h6Ij4KLQkJPHVuaXQtdmFsdWU+a0h6PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Im1tIj4KLQkJPHVuaXQtdmFsdWU+bW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ibXMiPgotCQk8dW5pdC12YWx1ZT5tczwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwYyI+Ci0JCTx1bml0LXZhbHVlPnBjPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdC12YWx1ZT4lPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB0Ij4KLQkJPHVuaXQtdmFsdWU+cHQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icHgiPgotCQk8dW5pdC12YWx1ZT5weDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJyYWQiPgotCQk8dW5pdC12YWx1ZT5yYWQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icyI+Ci0JCTx1bml0LXZhbHVlPnM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQotICAgIDwhLS0ga2V5d29yZHMgOiBzdHJpbmcgY29uc3RhbnRzICh0aGlzIGlzIGxhc3QgcGFydC4uKSAtLT4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjIwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjIwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIzMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4zMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNDAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NDAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjUwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjUwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI2MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT42MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNzAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NzAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjgwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjgwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI5MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT45MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWJvdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hYm92ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhYnNvbHV0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFic29sdXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkFjdGl2ZUJvcmRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkFjdGl2ZUJvcmRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJBY3RpdmVDYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QWN0aXZlQ2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWx3YXlzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWx3YXlzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkFwcFdvcmtzcGFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkFwcFdvcmtzcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcXVhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXF1YTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcm1lbmlhbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFybWVuaWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImF1dG8iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hdXRvPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImF2b2lkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXZvaWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJhY2tncm91bmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmFzZWxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iYXNlbGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiZWhpbmQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iZWhpbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmVsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iZWxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiaWRpLW92ZXJyaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmlkaS1vdmVycmlkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibGFjayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsYWNrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsaW5rIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymxpbms8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxvY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibG9jazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibHVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymx1ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym9sZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90aCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvdGg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvbkZhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25GYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvbkhpZ2hsaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvbkhpZ2hsaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25TaGFkb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25TaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvblRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FwaXRhbGl6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcGl0YWxpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQ2FwdGlvblRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5DYXB0aW9uVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjZW50ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jZW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyLWxlZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jZW50ZXItbGVmdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjZW50ZXItcmlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jZW50ZXItcmlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2hpbGQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jaGlsZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjaXJjbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jaXJjbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2prLWlkZW9ncmFwaGljIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2prLWlkZW9ncmFwaGljPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNsb3NlLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2xvc2UtcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29kZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbGxhcHNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29sbGFwc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29tcGFjdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbXBhY3Q8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29udGludW91cyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbnRpbnVvdXM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3JvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNyb3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Jvc3MiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jcm9zczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjcm9zc2hhaXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jcm9zc2hhaXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Vyc2l2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmN1cnNpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGFzaGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGFzaGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlY2ltYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWNpbWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlY2ltYWwtbGVhZGluZy16ZXJvIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVjaW1hbC1sZWFkaW5nLXplcm88L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVmYXVsdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlZmF1bHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGlnaXRzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGlnaXRzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRpc2MiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kaXNjPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdHRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdHRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3VibGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3VibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZS1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5lLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlbWJlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmVtYmVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImV4cGFuZGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXh0cmEtY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZXh0cmEtY29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImV4dHJhLWV4cGFuZGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZXh0cmEtZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFudGFzeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhbnRhc3k8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFyLWxlZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXItbGVmdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXItcmlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXItcmlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFzdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhc3Q8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFzdGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFzdGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZlbWFsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZlbWFsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmaXhlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZpeGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZ1Y2hzaWEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mdWNoc2lhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imdlb3JnaWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z2VvcmdpYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3JheSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyYXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iR3JheVRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5HcmF5VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmVlbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyZWVuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imdyb292ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyb292ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoZWJyZXciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oZWJyZXc8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGVscCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhlbHA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlkZGVuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlkZGVuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZ2giPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkhpZ2hsaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkhpZ2hsaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJIaWdobGlnaHRUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SGlnaGxpZ2h0VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWdoZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWdoZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlyYWdhbmEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaXJhZ2FuYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaXJhZ2FuYS1pcm9oYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpcmFnYW5hLWlyb2hhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imljb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pY29uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluYWN0aXZlQm9yZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5hY3RpdmVCb3JkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5hY3RpdmVDYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5hY3RpdmVDYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluYWN0aXZlQ2FwdGlvblRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmFjdGl2ZUNhcHRpb25UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluZm9CYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5mb0JhY2tncm91bmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5mb1RleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmZvVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmhlcml0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5oZXJpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5saW5lLXRhYmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5saW5lLXRhYmxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imluc2V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zZXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5zaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImludmVydCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmludmVydDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpdGFsaWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pdGFsaWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ianVzdGlmeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmp1c3RpZnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ia2F0YWthbmEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5rYXRha2FuYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJrYXRha2FuYS1pcm9oYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmthdGFrYW5hLWlyb2hhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhbmRzY2FwZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhbmRzY2FwZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhcmdlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhcmdlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZWZ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGVmdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZWZ0LXNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sZWZ0LXNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdHdhcmRzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGVmdHdhcmRzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxldmVsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGV2ZWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGlnaHRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpZ2h0ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGltZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGluZS10aHJvdWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGluZS10aHJvdWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxpc3QtaXRlbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpc3QtaXRlbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG91ZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLWdyZWVrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItZ3JlZWs8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItbGF0aW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1sYXRpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsdHIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sdHI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFya2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWFya2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hcm9vbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hcm9vbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZWRpdW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tZWRpdW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iTWVudSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPk1lbnU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iTWVudVRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5NZW51VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZXNzYWdlLWJveCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1lc3NhZ2UtYm94PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1pZGRsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1pZGRsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtaXgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5taXg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibW9ub3NwYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bW9ub3NwYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1vdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tb3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im4tcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bi1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmFycm93ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uYXJyb3dlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuYXZ5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmF2eTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuZS1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uZS1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tY2xvc2UtcXVvdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uby1jbG9zZS1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuby1vcGVuLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tb3Blbi1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuby1yZXBlYXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uby1yZXBlYXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9uZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9ybWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm9ybWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vd3JhcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vd3JhcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJudy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5udy1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2JsaXF1ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9ibGlxdWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2xpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vbGl2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvbmNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b25jZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvcGVuLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3Blbi1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdXRzZXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzZXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm91dHNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3ZlcmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdmVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwb2ludGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cG9pbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwb3J0cmFpdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnBvcnRyYWl0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InByZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnByZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwdXJwbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wdXJwbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlbGF0aXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVsYXRpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC14Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0LXkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQteTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWRnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZGdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlnaHQtc2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0LXNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlnaHR3YXJkcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0d2FyZHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icnRsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cnRsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJ1bi1pbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJ1bi1pbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnMtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNhbnMtc2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zYW5zLXNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNjcm9sbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNjcm9sbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJTY3JvbGxiYXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5TY3JvbGxiYXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2UtcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2UtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlbWktY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VtaS1jb25kZW5zZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VtaS1leHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlbWktZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VwYXJhdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZXBhcmF0ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZXJpZiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNob3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNpbGVudCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNpbGVudDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaWx2ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaWx2ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2xvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2xvd2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2xvd2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwtY2FwcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsLWNhcHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwtY2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsLWNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGxlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic29mdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNvZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic29saWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zb2xpZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzcGVsbC1vdXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zcGVsbC1vdXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3F1YXJlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3F1YXJlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN0YXRpYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN0YXRpYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdGF0dXMtYmFyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3RhdHVzLWJhcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdWIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdWI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3VwZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdXBlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdy1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1jYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1jZWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY2VsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1jb2x1bW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1jb2x1bW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY29sdW1uLWdyb3VwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY29sdW1uLWdyb3VwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWZvb3Rlci1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWZvb3Rlci1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1oZWFkZXItZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1oZWFkZXItZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtcm93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtcm93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLXJvdy1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLXJvdy1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGVhbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LXRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtdG9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQtYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dC1ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50aGljazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0aGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZUREYXJrU2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVERGFya1NoYWRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZURGYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVERmFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZURIaWdobGlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZURIaWdobGlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVETGlnaHRTaGFkb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZURMaWdodFNoYWRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZURTaGFkb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZURTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idG9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dG9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRyYW5zcGFyZW50Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dHJhbnNwYXJlbnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idWx0cmEtY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dWx0cmEtY29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVsdHJhLWV4cGFuZGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dWx0cmEtZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idW5kZXJsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dW5kZXJsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLWFscGhhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItYWxwaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItbGF0aW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1sYXRpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ2aXNpYmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dmlzaWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3LXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnctcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndhaXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53YWl0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndoaXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2hpdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0id2lkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53aWRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJXaW5kb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5XaW5kb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93RnJhbWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5XaW5kb3dGcmFtZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJXaW5kb3dUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWZhc3QiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWZhc3Q8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1oaWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1oaWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtbG91ZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtbG91ZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ingtc2xvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc2xvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNvZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNvZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtc21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4eC1sYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnh4LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InllbGxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnllbGxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I2YzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotCTxwcm9maWxlLWltcG9ydCBuYW1lPSJjc3Nwcm9maWxlLWNzczIueG1sIi8+Ci0JPHN0eWxlc2hlZXQtZGVmPgotCQk8ZGVzY3JpcHRpb24+JW1vYmlsZTFfMC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTxjaGFyc2V0LXJ1bGUvPgotCQk8aW1wb3J0LXJ1bGUvPgotCQk8bWVkaWEtcnVsZS8+Ci0JCTxzdHlsZS1ydWxlLz4KLQk8L3N0eWxlc2hlZXQtZGVmPgotCi0JPCEtLSBXaGljaCBwcm9wZXJ0aWVzIGNhbiBzdHlsZSBydWxlIGluY2x1ZGUgPyAtLT4KLQk8IS0tIHVzaW5nICJvdmVyd3JpdGUiIG1ldGhvZDogb25seSBkaXNhYmxlZCBwcm9wZXJ0aWVzIGFyZSB3cml0dGVuLiAtLT4KLQotCTxzdHlsZS1ydWxlLWRlZiBvdmVyd3JpdGU9InRydWUiPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJjaGlsZCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iYWRqYWNlbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImF0dHJpYnV0ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmaXJzdC1jaGlsZCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsaW5rIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImFjdGl2ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsYW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYXppbXV0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xsYXBzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm90dG9tIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2FwdGlvbi1zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2xpcCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbnRlbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLWluY3JlbWVudCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvdW50ZXItcmVzZXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3Vyc29yIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZWxldmF0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZW1wdHktY2VsbHMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUtYWRqdXN0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHJldGNoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGVmdCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrZXItb2Zmc2V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWluLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3ZlcmZsb3ciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaXRjaC1yYW5nZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsYXktZHVyaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJxdW90ZXMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWNobmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic2l6ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstaGVhZGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstbnVtZXJhbCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlZWNoLXJhdGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzdHJlc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YWJsZS1sYXlvdXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXNoYWRvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRvcCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InVuaWNvZGUtYmlkaSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZvaWNlLWZhbWlseSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZvbHVtZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZG93cyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmQtc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InotaW5kZXgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JPC9zdHlsZS1ydWxlLWRlZj4KLQotCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLQk8IS0tIHVzaW5nICJyZWRpZmluZSIgbWV0aG9kOiBpZiAib3ZlcndyaXRlIiBhdHRyaWJ1dGUgaXMgc2V0IHRvCi0JImZhbHNlIglvciBub3Qgc2V0LCBpdCBtZWFucyB0aGUgbm9kZSBpcyBjbGVhbmx5IHJlZGlmaW5lZCAtLT4KLQotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzY3JvbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlzcGxheSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0iaW5saW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxpc3QtaXRlbSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItZ3JlZWsiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWFsaWduIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imp1c3RpZnkiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1kZWNvcmF0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bmRlcmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImJhc2VsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1YiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdXBlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0KLQk8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLQlJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iY29sb3IiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCTxjb250YWluZXIgbmFtZT0ic3lzdGVtLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxYmNhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGUtaW1wb3J0IG5hbWU9ImNzc3Byb2ZpbGUtY3NzMi54bWwiLz4KLSAgICAgICAgPHN0eWxlc2hlZXQtZGVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4ld2FwLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8Y2hhcnNldC1ydWxlLz4KLSAgICAgICAgICAgICAgICA8aW1wb3J0LXJ1bGUvPgotICAgICAgICAgICAgICAgIDxtZWRpYS1ydWxlLz4KLSAgICAgICAgICAgICAgICA8c3R5bGUtcnVsZS8+Ci0gICAgICAgIDwvc3R5bGVzaGVldC1kZWY+Ci0KLSAgICAgICAgPCEtLSBXaGljaCBwcm9wZXJ0aWVzIGNhbiBzdHlsZSBydWxlIGluY2x1ZGUgPyAtLT4KLSAgICAgICAgPCEtLSB1c2luZyAib3ZlcndyaXRlIiBtZXRob2Q6IG9ubHkgZGlzYWJsZWQgcHJvcGVydGllcyBhcmUgd3JpdHRlbi4gLS0+Ci0KLSAgICAgICAgPHN0eWxlLXJ1bGUtZGVmIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF6aW11dGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xsYXBzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FwdGlvbi1zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGlwIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb250ZW50IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImN1ZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3Vyc29yIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXJlY3Rpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZXZhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZW1wdHktY2VsbHMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQtc3RyZXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGV0dGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXJrZXItb2Zmc2V0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXJrcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4LWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4LXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW4taGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW4td2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im92ZXJmbG93IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWdlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhdXNlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGF1c2UtYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGl0Y2gtcmFuZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsYXktZHVyaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icXVvdGVzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWNobmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNpemUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWFrIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhay1oZWFkZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWFrLW51bWVyYWwiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVlY2gtcmF0ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RyZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWJsZS1sYXlvdXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQtc2hhZG93IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3AiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVuaWNvZGUtYmlkaSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idm9pY2UtZmFtaWx5IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2b2x1bWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndpZG93cyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id29yZC1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ6LWluZGV4IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLW1hcnF1ZWUtc3R5bGUiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLWxvb3AiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLWRpciIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLW1hcnF1ZWUtc3BlZWQiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1hY2Nlc3NrZXkiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1pbnB1dC1mb3JtYXQiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1pbnB1dC1yZXF1aXJlZCIvPgotICAgICAgICA8L3N0eWxlLXJ1bGUtZGVmPgotCi0gICAgICAgIDwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLSAgICAgICAgPCEtLSB1c2luZyAicmVkaWZpbmUiIG1ldGhvZDogaWYgIm92ZXJ3cml0ZSIgYXR0cmlidXRlIGlzIHNldCB0bwotICAgICAgICAiZmFsc2UiIG9yIG5vdCBzZXQsIGl0IG1lYW5zIHRoZSBub2RlIGlzIGNsZWFubHkgcmVkaWZpbmVkIC0tPgotCi0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlzcGxheSIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iLXdhcC1tYXJxdWVlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWFsaWduIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJsaW5rIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJhc2VsaW5lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3ViIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtaWRkbGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLXN0eWxlIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic2xpZGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhbHRlcm5hdGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLWxvb3AiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmZpbml0ZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUtZGlyIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibHRyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icnRsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1zcGVlZCIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNsb3ciLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmYXN0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtYWNjZXNza2V5IgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImludGVyYWN0aXZlIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImtleWNvbWJpbmF0aW9uIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtaW5wdXQtZm9ybWF0IgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImludGVyYWN0aXZlIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImZvcm1hdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWlucHV0LXJlcXVpcmVkIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImludGVyYWN0aXZlIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotCi0gICAgICAgIDwhLS0gY29udGFpbmVyIGRlZmluaXRpb24gOiBDb250YWluZXIgaXMgdGhlIGx1bXAgb2YgdmFsdWVzLgotICAgICAgICBJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ic3lzdGVtLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImZvcm1hdCI+Ci0gICAgICAgICAgICAgICAgPHN0cmluZyBuYW1lPSJhbnkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJrZXljb21iaW5hdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJrZXkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSItIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ia2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzcGFjZSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ic3BlY2lhbGtleSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InNwZWNpYWxrZXkiPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ibW9kaWZpZXJrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImZ1bmN0aW9ua2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJuYXZpZ2F0aW9ua2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJlZGl0a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJtaXNja2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJ2b2x1bWVjb250cm9sa2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJhcHBsaWNhdGlvbmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0icGhvbmVrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InZlbmRvcmtleSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im1vZGlmaWVya2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhY2Nlc3NrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImNtZGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ib3B0a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJjdHJsa2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJzaGlmdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iYWx0a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJ3aW5rZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im1ldGFrZXkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImZjbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNhcHMiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJjbWRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNtZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJjbWQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsY21kIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ib3B0a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJvcHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyb3B0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibG9wdCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImN0cmxrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImN0cmwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyY3RybCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxjdHJsIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ic2hpZnRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNoaWZ0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icnNoaWZ0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibHNoaWZ0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYWx0a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhbHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyYWx0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGFsdCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9IndpbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0id2luIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icndpbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imx3aW4iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJtZXRha2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtZXRhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icm1ldGEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsbWV0YSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImZ1bmN0aW9ua2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmNCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY1Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjYiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmNyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY4Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTUiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJuYXZpZ2F0aW9ua2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0YWIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJlc2MiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJlbnRlciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJldHVybiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lbnUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJoZWxwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibmFtZW1lbnUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyY2wiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhcnJvd2tleSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBhZ2VrZXkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhcnJvd2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idXAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkb3duIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0icGFnZWtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaG9tZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImVuZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBndXAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwZ2RuIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iZWRpdGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYnMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkZWwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbnMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1bmRvIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY3V0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY29weSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBhc3RlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2xyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3RvIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ibWlzY2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icHJ0c2MiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzeXNycSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcmxvY2siLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwYXVzZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJyayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im51bWxvY2siLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwd3IiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJ2b2x1bWVjb250cm9sa2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ2b2x1bWV1cCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InZvbHVtZWRvd24iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhcHBsaWNhdGlvbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVtbyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InRvZG8iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjYWxlbmRhciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1haWwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhZGRyZXNzIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0icGhvbmVrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBob25lLXNlbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwaG9uZS1lbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwaG9uZS1hY2NlcHQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJ2ZW5kb3JrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InZuZC4iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotCi0gICAgICAgIDxjYXRlZ29yeS1kZWYgbmFtZT0id2FwIj4KLSAgICAgICAgICAgICAgICA8Y2FwdGlvbj4ld2FwLmNhdGVnb3J5LWRlZi53YXAuY2FwdGlvbjwvY2FwdGlvbj4KLSAgICAgICAgPC9jYXRlZ29yeS1kZWY+Ci0KLSAgICAgICAgPG51bWJlci1kZWYgbmFtZT0ibGVuZ3RoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iZW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iZXgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHgiLz4KLSAgICAgICAgPC9udW1iZXItZGVmPgotCi0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ii13YXAtbWFycXVlZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPi13YXAtbWFycXVlZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2xpZGUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNsaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWx0ZXJuYXRlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hbHRlcm5hdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmZpbml0ZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5maW5pdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSItIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT4tPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3BhY2UiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNwYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWNjZXNza2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hY2Nlc3NrZXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Zm48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmY24iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmZjbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcHMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjbWQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNtZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJjbWQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJjbWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsY21kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sY21kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3B0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5vcHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyb3B0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yb3B0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG9wdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bG9wdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImN0cmwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmN0cmw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyY3RybCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmN0cmw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsY3RybCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bGN0cmw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaGlmdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c2hpZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyc2hpZnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJzaGlmdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxzaGlmdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bHNoaWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWx0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hbHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyYWx0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yYWx0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFsdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFsdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9IndpbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+d2luPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icndpbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cndpbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Imx3aW4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmx3aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZXRhIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5tZXRhPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icm1ldGEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJtZXRhPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG1ldGEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxtZXRhPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY1PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjYiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY2PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjciPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY3PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjgiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY4PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjEwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxMTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxMiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjEyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjEzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxNDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxNSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjE1PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFiIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT50YWI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlc2MiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmVzYzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImVudGVyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5lbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJldHVybiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmV0dXJuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmFtZW1lbnUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm5hbWVtZW51PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmNsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yY2w8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNuZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFycm93a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hcnJvd2tleTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBhZ2VrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBhZ2VrZXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3duIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3duPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iaG9tZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+aG9tZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImVuZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZW5kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGd1cCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGd1cDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBnZG4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBnZG48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJicyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YnM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlbDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImlucyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idW5kbyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dW5kbzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImN1dCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3V0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29weSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29weTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBhc3RlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wYXN0ZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNsciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2xyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3RvIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zdG88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcnRzYyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cHJ0c2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzeXNycSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c3lzcnE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzY3Jsb2NrIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zY3Jsb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYnJrIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5icms8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJudW1sb2NrIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5udW1sb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icHdyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wd3I8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ2b2x1bWV1cCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dm9sdW1ldXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ2b2x1bWVkb3duIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT52b2x1bWVkb3duPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVtbyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bWVtbzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InRvZG8iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnRvZG88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYWxlbmRhciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2FsZW5kYXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYWlsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5tYWlsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWRkcmVzcyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWRkcmVzczwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBob25lLXNlbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBob25lLXNlbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1lbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBob25lLWVuZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBob25lLWFjY2VwdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGhvbmUtYWNjZXB0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idm5kLiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dm5kLjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InRydWUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnRydWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFsc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwYXVzZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGF1c2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3ZTM5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNzc3Byb2ZpbGUtY3NzMS54bWwKLWNzczEuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249Q2FzY2FkaW5nIFN0eWxlIFNoZWV0cywgbGV2ZWwgMQotY3NzMS5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb249Qm94IG1vZGVsCi1jc3MxLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbj1Db2xvcnMgYW5kIEJhY2tncm91bmRzCi1jc3MxLmNhdGVnb3J5LWRlZi5jbGFzc2lmaWNhdGlvbi5jYXB0aW9uPUNsYXNzaWZpY2F0aW9uCi1jc3MxLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb249Rm9udAotY3NzMS5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPVRleHQKLSMgY3NzcHJvZmlsZS1jc3MyLnhtbAotY3NzMi5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1DYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAyCi1jc3MyLmNhdGVnb3J5LWRlZi5hdXJhbC5jYXB0aW9uPUF1cmFsCi1jc3MyLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbj1Cb3ggbW9kZWwKLWNzczIuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPUNvbG9ycyBhbmQgQmFja2dyb3VuZHMKLWNzczIuY2F0ZWdvcnktZGVmLmNvbnRlbnQuY2FwdGlvbj1HZW5lcmF0ZWQgY29udGVudC9MaXN0Ci1jc3MyLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb249Rm9udHMKLWNzczIuY2F0ZWdvcnktZGVmLnBhZ2UuY2FwdGlvbj1QYWdlZCBtZWRpYQotY3NzMi5jYXRlZ29yeS1kZWYudGFibGVzLmNhcHRpb249VGFibGVzCi1jc3MyLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb249VGV4dAotY3NzMi5jYXRlZ29yeS1kZWYudmlzdWFsLmNhcHRpb249VmlzdWFsCi1jc3MyLmNhdGVnb3J5LWRlZi51aS5jYXB0aW9uPVVzZXIgaW50ZXJmYWNlCi0jIGNzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbAotbW9iaWxlMV8wLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPUNTUyBNb2JpbGUgUHJvZmlsZSAxLjAKLSMgY3NzcHJvZmlsZS13YXAueG1sCi13YXAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249V0NTUyAxLjAKLXdhcC5jYXRlZ29yeS1kZWYud2FwLmNhcHRpb249V0NTUyBFeHRlbnNpb25zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Rlc2NyaXB0aW9uLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvZGVzY3JpcHRpb24udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMxZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvZGVzY3JpcHRpb24udHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQotICogTm9uZSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgCi0gKiBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQgCi0gKiBleGNlcHQgZm9yIGNzc3Byb2ZpbGUucHJvcGVydGllcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyN2FhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBTb3VyY2UgQ1NTIE1vZGVsCi1jc3Nwcm9maWxlX2NzczIubmFtZT1DU1MyOiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAyCi1jc3Nwcm9maWxlX2NzczEubmFtZT1DU1MxOiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAxCi1jc3Nwcm9maWxlX21vYmlsZTFfMC5uYW1lPUNTUyBNb2JpbGUgUHJvZmlsZSAxLjAKLWNzc3Byb2ZpbGVfd2FwLm5hbWU9V0NTUyAxLjAKLVN0cnVjdHVyZWRfQ1NTX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBDU1MgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLUNTU19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1DU1MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmM3Y2QxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Nwcm9maWxlIj4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX2NzczIubmFtZSIKLQkJCWRlZmF1bHQ9InRydWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5jc3MyIj4KLQkJPC9wcm9maWxlPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfY3NzMS5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUuY3NzMSI+Ci0JCTwvcHJvZmlsZT4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX21vYmlsZTFfMC5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5tb2JpbGUxXzAiPgotCQk8L3Byb2ZpbGU+Ci0JCTxwcm9maWxlCi0JCQluYW1lPSIlY3NzcHJvZmlsZV93YXAubmFtZSIKLQkJCXVyaT0iY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUud2FwIj4KLQkJPC9wcm9maWxlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUyIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzLkNTU0ZpbGVUYXNrU2Nhbm5lciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3MuQ1NTRmlsZVRhc2tTY2FubmVyIgotCQkJY29udGVudFR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0NTU19Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJjc3MiPgotCQk8L2ZpbGVUeXBlcz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzIj4KLQkJPHByb2Nlc3NvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yQ1NTIgotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI+Ci0JCTwvcHJvY2Vzc29yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iY3NzIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlQ1NTX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9ImNzc3NvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckNTUyIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUgY3NzIGNvcmUgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc2MWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBDU1MgQ29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIENTU0NvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBZb3VfY2Fubm90X3VzZV9DU1NTdHlsZVNoZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzFjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yY29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfM2NvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzRjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yNWNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI2Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMjdjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yOGNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzVjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF82Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfN2NvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzhjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1NTQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjkzMjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENTU0NvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDU1NDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU0NvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMga2V5cwotCQlDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuc3RhcnR1cCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5uaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJLy8ga2V5cwotCQlDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuc2h1dGRvd24oKTsKLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmY1N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Zb3VfY2Fubm90X3VzZV9DU1NTdHlsZVNoZV9VSV89WW91IGNhbm5vdCB1c2UgQ1NTU3R5bGVTaGVldC5nZXRPd25lclJ1bGUoKSBiZWNhdXNlIG9mIG1hbnkgcmVmZXJlbmNlcnMgb2YgdGhpcyBydWxlXG5QbGVhc2UgdXNlIGdldE9ud2VyUnVsZXMoKQotXzFjb25jYXRfRVJST1JfPXswfWZpcnN0IGZsYXQgbm9kZSBpcyBudWxsLgotXzJjb25jYXRfRVJST1JfPXswfWZpcnN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuCi1fM2NvbmNhdF9FUlJPUl89ezB9bGFzdCBmbGF0IG5vZGUgaXMgbnVsbC4KLV80Y29uY2F0X0VSUk9SXz17MH1sYXN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuCi1fMjVjb25jYXRfRVJST1JfPXswfWZpcnN0IHJlZ2lvbiBpcyBudWxsLgotXzI2Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotXzI3Y29uY2F0X0VSUk9SXz17MH1sYXN0IHJlZ2lvbiBpcyBudWxsLgotXzI4Y29uY2F0X0VSUk9SXz17MH1sYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuCi1fNWNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuCi1fNmNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4KLV83Y29uY2F0X0VSUk9SXz17MH1sYXN0IHJlZ2lvbiBpcyBudWxsLgotXzhjb25jYXRfRVJST1JfPXswfWxhc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4KLSMKLUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZz1VcGRhdGluZyBDU1MgQ29udGVudCBTZXR0aW5ncwotQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nPVByb2JsZW0gc2F2aW5nIENTUyBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkNWY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjQ4MjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0NsZWFudXBTdHJhdGVneSB7Ci0KLQlzdGF0aWMgZmluYWwgc2hvcnQgQVNJUyA9IDA7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IExPV0VSID0gMTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBQRVIgPSAyOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldElkZW50Q2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFByb3BOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFByb3BWYWx1ZUNhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRTZWxlY3RvclRhZ0Nhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNRdW90ZVZhbHVlcygpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRJZGVudENhc2Uoc2hvcnQgaWRlbnRDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRQcm9wTmFtZUNhc2Uoc2hvcnQgcHJvcE5hbWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0UHJvcFZhbHVlQ2FzZShzaG9ydCBwcm9wVmFsdWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZVZhbHVlcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcyk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0U2VsZWN0b3JUYWdDYXNlKHNob3J0IHNlbGVjdG9yVGFnQ2FzZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTNlNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotCi0KLQotcHVibGljIGNsYXNzIENTU0NsZWFudXBTdHJhdGVneUltcGwgaW1wbGVtZW50cyBDU1NDbGVhbnVwU3RyYXRlZ3kgewotCi0Jc3RhdGljIHByaXZhdGUgQ1NTQ2xlYW51cFN0cmF0ZWd5IGluc3RhbmNlID0gbnVsbDsKLQkvLyBpbml0aWFsaXplIHdpdGggZGVmYXVsdHMKLQlwcm90ZWN0ZWQgc2hvcnQgZklkZW50Q2FzZSA9IEFTSVM7Ci0JcHJvdGVjdGVkIHNob3J0IGZQcm9wTmFtZUNhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmUHJvcFZhbHVlQ2FzZSA9IEFTSVM7Ci0JcHJvdGVjdGVkIHNob3J0IGZTZWxlY3RvclRhZ0Nhc2UgPSBVUFBFUjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmUXVvdGVWYWx1ZXMgPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIGZGb3JtYXRTb3VyY2UgPSB0cnVlOwotCi0JLyoqCi0JICogQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRJZGVudENhc2UoKSB7Ci0JCXJldHVybiBmSWRlbnRDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTQ2xlYW51cFN0cmF0ZWd5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IENTU0NsZWFudXBTdHJhdGVneUltcGwoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0UHJvcE5hbWVDYXNlKCkgewotCQlyZXR1cm4gZlByb3BOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFByb3BWYWx1ZUNhc2UoKSB7Ci0JCXJldHVybiBmUHJvcFZhbHVlQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFNlbGVjdG9yVGFnQ2FzZSgpIHsKLQkJcmV0dXJuIGZTZWxlY3RvclRhZ0Nhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZklkZW50Q2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX0lERU5USUZJRVIpKTsKLQkJZlByb3BOYW1lQ2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUpKTsKLQkJZlByb3BWYWx1ZUNhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9WQUxVRSkpOwotCQlmU2VsZWN0b3JUYWdDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IpKTsKLQkJZlF1b3RlVmFsdWVzID0gcHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKTsKLQkJZkZvcm1hdFNvdXJjZSA9IHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENTU0NsZWFudXBTdHJhdGVneSBlcXVpdmFsZW50IGNhc2Ugc2hvcnQgdmFsdWUgd2hlbiBnaXZlbiBhbgotCSAqIGludAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZXF1aXZhbGVudCBjYXNlIHNob3J0IG9yIEFTSVMgaWYgY2Fubm90IGJlIGRldGVybWluZWQKLQkgKi8KLQlwcml2YXRlIHNob3J0IGdldENsZWFudXBDYXNlVmFsdWUoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUiA6Ci0JCQkJcmV0dXJuIExPV0VSOwotCQkJY2FzZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDoKLQkJCQlyZXR1cm4gVVBQRVI7Ci0JCX0KLQkJcmV0dXJuIEFTSVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKSB7Ci0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUXVvdGVWYWx1ZXMoKSB7Ci0JCXJldHVybiBmUXVvdGVWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRDYXNlKHNob3J0IGlkZW50Q2FzZSkgewotCQlmSWRlbnRDYXNlID0gaWRlbnRDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcE5hbWVDYXNlKHNob3J0IHByb3BOYW1lQ2FzZSkgewotCQlmUHJvcE5hbWVDYXNlID0gcHJvcE5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BWYWx1ZUNhc2Uoc2hvcnQgcHJvcFZhbHVlQ2FzZSkgewotCQlmUHJvcFZhbHVlQ2FzZSA9IHByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcykgewotCQlmUXVvdGVWYWx1ZXMgPSBxdW90ZVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGFnQ2FzZShzaG9ydCBzZWxlY3RvclRhZ0Nhc2UpIHsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IHNlbGVjdG9yVGFnQ2FzZTsKLQl9Ci0KLQkvLyBUT0RPOiBhIHNhdmVPcHRpb25zIHNob3VsZCBiZSBhZGRlZCB0byBDU1NDbGVhbnVwU3RyYXRlZ3kgaW50ZXJmYWNlCi0JcHVibGljIHZvaWQgc2F2ZU9wdGlvbnMoKSB7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUiwgZklkZW50Q2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgZlByb3BOYW1lQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIGZQcm9wVmFsdWVDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9TRUxFQ1RPUiwgZlNlbGVjdG9yVGFnQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgZlF1b3RlVmFsdWVzKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIGZGb3JtYXRTb3VyY2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDgwN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTRm9ybWF0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENsZWFudXBQcm9jZXNzb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUNTU0Zvcm1hdFV0aWwgZm9ybWF0VXRpbCA9IENTU0Zvcm1hdFV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJSUNTU0RvY3VtZW50IGRvYyA9ICgoSUNTU01vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgZG9jKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuY2xlYW51cChkb2MpOwotCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UoZG9jLmdldE1vZGVsKCksIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJTGlzdCBjc3Nub2RlcyA9IGZvcm1hdFV0aWwuY29sbGVjdENTU05vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQlpZiAoY3Nzbm9kZXMgIT0gbnVsbCAmJiAhY3Nzbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzc25vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIGNzc25vZGVzLmdldChpKTsKLQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIG5vZGUpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmNsZWFudXAobm9kZSk7Ci0JCQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJCQkJCW1vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkJCX0KLQkJCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShtb2RlbCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQotCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHNob3VsZCBpbXBsZW1lbnQsIG9yIGRlbGV0ZT8KLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBzaG91bGQgaW1wbGVtZW50LCBvciBkZWxldGU/Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSU1lZGlhR3JvdXBJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSU1lZGlhR3JvdXBJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDAyYWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lNZWRpYUdyb3VwSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lZGlhR3JvdXBJRCB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0NPTlRJTlVPVVMgPSAiY29udGludW91cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1BBR0VEID0gInBhZ2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9WSVNVQUwgPSAidmlzdWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQVVSQUwgPSAiYXVyYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9UQUNUSUxFID0gInRhY3RpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0dSSUQgPSAiZ3JpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0JJVE1BUCA9ICJiaXRtYXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0lOVEVSQUNUSVZFID0gImludGVyYWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVmFsSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lWYWxJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDljMWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lWYWxJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbElEIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfMTAwID0gIjEwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzIwMCA9ICIyMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl8zMDAgPSAiMzAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNDAwID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzUwMCA9ICI1MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl82MDAgPSAiNjAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNzAwID0gIjcwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzgwMCA9ICI4MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl85MDAgPSAiOTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUJPVkUgPSAiYWJvdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQlNPTFVURSA9ICJhYnNvbHV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FDVElWRUJPUkRFUiA9ICJBY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQ1RJVkVDQVBUSU9OID0gIkFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUxXQVlTID0gImFsd2F5cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FQUFdPUktTUEFDRSA9ICJBcHBXb3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BUVVBID0gImFxdWEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BUk1FTklBTiA9ICJhcm1lbmlhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FVVE8gPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FWT0lEID0gImF2b2lkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkFDS0dST1VORCA9ICJCYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CRUhJTkQgPSAiYmVoaW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkVMT1cgPSAiYmVsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CSURJX09WRVJSSURFID0gImJpZGktb3ZlcnJpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTEFDSyA9ICJibGFjayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMSU5LID0gImJsaW5rIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxPQ0sgPSAiYmxvY2siOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTFVFID0gImJsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT0xERVIgPSAiYm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9USCA9ICJib3RoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTkZBQ0UgPSAiQnV0dG9uRmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTkhJR0hMSUdIVCA9ICJCdXR0b25IaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05TSEFET1cgPSAiQnV0dG9uU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9OVEVYVCA9ICJCdXR0b25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0FQSVRBTElaRSA9ICJjYXBpdGFsaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0FQVElPTlRFWFQgPSAiQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DRU5URVIgPSAiY2VudGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0VOVEVSX0xFRlQgPSAiY2VudGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DRU5URVJfUklHSFQgPSAiY2VudGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0hJTEQgPSAiY2hpbGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSVJDTEUgPSAiY2lyY2xlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0pLX0lERU9HUkFQSElDID0gImNqay1pZGVvZ3JhcGhpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NMT1NFX1FVT1RFID0gImNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09OREVOU0VEID0gImNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTExBUFNFID0gImNvbGxhcHNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1JPUCA9ICJjcm9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1JPU1MgPSAiY3Jvc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9TU0hBSVIgPSAiY3Jvc3NoYWlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1VSU0lWRSA9ICJjdXJzaXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREFTSEVEID0gImRhc2hlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RFQ0lNQUwgPSAiZGVjaW1hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RFQ0lNQUxfTEVBRElOR19aRVJPID0gImRlY2ltYWwtbGVhZGluZy16ZXJvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRElHSVRTID0gImRpZ2l0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RJU0MgPSAiZGlzYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RPVFRFRCA9ICJkb3R0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRV9SRVNJWkUgPSAiZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FTUJFRCA9ICJlbWJlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VYUEFOREVEID0gImV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhUUkFfQ09OREVOU0VEID0gImV4dHJhLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VYVFJBX0VYUEFOREVEID0gImV4dHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFOVEFTWSA9ICJmYW50YXN5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFSX0xFRlQgPSAiZmFyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVJfUklHSFQgPSAiZmFyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFTVCA9ICJmYXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFTVEVSID0gImZhc3RlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZFTUFMRSA9ICJmZW1hbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GSVhFRCA9ICJmaXhlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZVQ0hTSUEgPSAiZnVjaHNpYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dFT1JHSUFOID0gImdlb3JnaWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JBWSA9ICJncmF5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JBWVRFWFQgPSAiR3JheVRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkVFTiA9ICJncmVlbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dST09WRSA9ICJncm9vdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9IRUJSRVcgPSAiaGVicmV3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSEVMUCA9ICJoZWxwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElEREVOID0gImhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJREUgPSAiaGlkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0ggPSAiaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hMSUdIVCA9ICJIaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdITElHSFRURVhUID0gIkhpZ2hsaWdodFRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdIRVIgPSAiaGlnaGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElSQUdBTkEgPSAiaGlyYWdhbmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISVJBR0FOQV9JUk9IQSA9ICJoaXJhZ2FuYS1pcm9oYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOQUNUSVZFQk9SREVSID0gIkluYWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVDQVBUSU9OID0gIkluYWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOQUNUSVZFQ0FQVElPTlRFWFQgPSAiSW5hY3RpdmVDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lORk9CQUNLR1JPVU5EID0gIkluZm9CYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5GT1RFWFQgPSAiSW5mb1RleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkxJTkUgPSAiaW5saW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5MSU5FX1RBQkxFID0gImlubGluZS10YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOU0VUID0gImluc2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5TSURFID0gImluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOVkVSVCA9ICJpbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfS0FUQUtBTkEgPSAia2F0YWthbmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9LQVRBS0FOQV9JUk9IQSA9ICJrYXRha2FuYS1pcm9oYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBTkRTQ0FQRSA9ICJsYW5kc2NhcGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MQVJHRSA9ICJsYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBUkdFUiA9ICJsYXJnZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUX1NJREUgPSAibGVmdC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVGVFdBUkRTID0gImxlZnR3YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFVkVMID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElHSFRFUiA9ICJsaWdodGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElNRSA9ICJsaW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElORV9USFJPVUdIID0gImxpbmUtdGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJU1RfSVRFTSA9ICJsaXN0LWl0ZW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1VEID0gImxvdWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1cgPSAibG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9BTFBIQSA9ICJsb3dlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX0dSRUVLID0gImxvd2VyLWdyZWVrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfTEFUSU4gPSAibG93ZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9ST01BTiA9ICJsb3dlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSQ0FTRSA9ICJsb3dlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MVFIgPSAibHRyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFMRSA9ICJtYWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFSS0VSID0gIm1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01BUk9PTiA9ICJtYXJvb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRURJVU0gPSAibWVkaXVtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVOVVRFWFQgPSAiTWVudVRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRVNTQUdFX0JPWCA9ICJtZXNzYWdlLWJveCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NSVggPSAibWl4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTU9OT1NQQUNFID0gIm1vbm9zcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05fUkVTSVpFID0gIm4tcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTkFSUk9XRVIgPSAibmFycm93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OQVZZID0gIm5hdnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ORV9SRVNJWkUgPSAibmUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9fQ0xPU0VfUVVPVEUgPSAibm8tY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19PUEVOX1FVT1RFID0gIm5vLW9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19SRVBFQVQgPSAibm8tcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9ORSA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PV1JBUCA9ICJub3dyYXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OV19SRVNJWkUgPSAibnctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT0JMSVFVRSA9ICJvYmxpcXVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT0xJVkUgPSAib2xpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PTkNFID0gIm9uY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PUEVOX1FVT1RFID0gIm9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PVVRTRVQgPSAib3V0c2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1VUU0lERSA9ICJvdXRzaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1ZFUkxJTkUgPSAib3ZlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QT0lOVEVSID0gInBvaW50ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QT1JUUkFJVCA9ICJwb3J0cmFpdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BSRSA9ICJwcmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QVVJQTEUgPSAicHVycGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVEID0gInJlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFTEFUSVZFID0gInJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVQRUFUID0gInJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVF9YID0gInJlcGVhdC14IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVQRUFUX1kgPSAicmVwZWF0LXkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSURHRSA9ICJyaWRnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklHSFRfU0lERSA9ICJyaWdodC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklHSFRXQVJEUyA9ICJyaWdodHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUlRMID0gInJ0bCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JVTl9JTiA9ICJydW4taW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TX1JFU0laRSA9ICJzLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NBTlNfU0VSSUYgPSAic2Fucy1zZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NDUk9MTCA9ICJzY3JvbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQ1JPTExCQVIgPSAiU2Nyb2xsYmFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VfUkVTSVpFID0gInNlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFTUlfQ09OREVOU0VEID0gInNlbWktY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VNSV9FWFBBTkRFRCA9ICJzZW1pLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VQQVJBVEUgPSAic2VwYXJhdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRVJJRiA9ICJzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NIT1cgPSAic2hvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NJTEVOVCA9ICJzaWxlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSUxWRVIgPSAic2lsdmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0xPVyA9ICJzbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0xPV0VSID0gInNsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMID0gInNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTExfQ0FQUyA9ICJzbWFsbC1jYXBzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTExfQ0FQVElPTiA9ICJzbWFsbC1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTExFUiA9ICJzbWFsbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU09GVCA9ICJzb2Z0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU09MSUQgPSAic29saWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TUEVMTF9PVVQgPSAic3BlbGwtb3V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1FVQVJFID0gInNxdWFyZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NUQVRJQyA9ICJzdGF0aWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVEFUVVNfQkFSID0gInN0YXR1cy1iYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVUIgPSAic3ViIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1VQRVIgPSAic3VwZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TV19SRVNJWkUgPSAic3ctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEUgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DQVBUSU9OID0gInRhYmxlLWNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DT0xVTU4gPSAidGFibGUtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ09MVU1OX0dST1VQID0gInRhYmxlLWNvbHVtbi1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0ZPT1RFUl9HUk9VUCA9ICJ0YWJsZS1mb290ZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9IRUFERVJfR1JPVVAgPSAidGFibGUtaGVhZGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfUk9XID0gInRhYmxlLXJvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX1JPV19HUk9VUCA9ICJ0YWJsZS1yb3ctZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URUFMID0gInRlYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URVhUX1RPUCA9ICJ0ZXh0LXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFWFRfQk9UVE9NID0gInRleHQtYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhJQ0sgPSAidGhpY2siOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USElOID0gInRoaW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRUREQVJLU0hBRE9XID0gIlRocmVlRERhcmtTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURGQUNFID0gIlRocmVlREZhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURISUdITElHSFQgPSAiVGhyZWVESGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVETElHSFRTSEFET1cgPSAiVGhyZWVETGlnaHRTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURTSEFET1cgPSAiVGhyZWVEU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RSQU5TUEFSRU5UID0gInRyYW5zcGFyZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVUxUUkFfQ09OREVOU0VEID0gInVsdHJhLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VMVFJBX0VYUEFOREVEID0gInVsdHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSX0FMUEhBID0gInVwcGVyLWFscGhhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJfTEFUSU4gPSAidXBwZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUl9ST01BTiA9ICJ1cHBlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSQ0FTRSA9ICJ1cHBlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9WSVNJQkxFID0gInZpc2libGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XX1JFU0laRSA9ICJ3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dBSVQgPSAid2FpdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dISVRFID0gIndoaXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lERVIgPSAid2lkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSU5ET1cgPSAiV2luZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XRlJBTUUgPSAiV2luZG93RnJhbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSU5ET1dURVhUID0gIldpbmRvd1RleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0ZBU1QgPSAieC1mYXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9ISUdIID0gIngtaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfTEFSR0UgPSAieC1sYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfTE9VRCA9ICJ4LWxvdWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xPVyA9ICJ4LWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfU0xPVyA9ICJ4LXNsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX1NNQUxMID0gIngtc21hbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX1NPRlQgPSAieC1zb2Z0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWFhfU01BTEwgPSAieHgtc21hbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YWF9MQVJHRSA9ICJ4eC1sYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1lFTExPVyA9ICJ5ZWxsb3ciOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxM2Y3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01Db250YWluZXIgZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0FCU09MVVRFX1NJWkUgPSAiYWJzb2x1dGUtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQ09MT1IgPSAiY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfU1lTVEVNX0NPTE9SID0gInN5c3RlbS1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9HRU5FUklDX0ZBTUlMWSA9ICJnZW5lcmljLWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9HRU5FUklDX1ZPSUNFID0gImdlbmVyaWMtdm9pY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfTUFSR0lOX1dJRFRIID0gIm1hcmdpbi13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9QQURESU5HX1dJRFRIID0gInBhZGRpbmctd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfUkVMQVRJVkVfU0laRSA9ICJyZWxhdGl2ZS1zaXplIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNQ29udGFpbmVyKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCU9iamVjdCBhcHBlbmRDaGlsZChPYmplY3Qgbm9kZSkgewotCQlpZiAoIW5vZGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJbm9kZXMuYWRkKG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCWludCBuQ2hpbGQgPSBnZXROdW1DaGlsZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZDsgaSsrKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU3RyaW5nICYmIGlkZW50aWZpZXIuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBjaGlsZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBQcm9wQ01Db250YWluZXIgJiYgKChQcm9wQ01Db250YWluZXIpIGNoaWxkKS5jYW5IYXZlKGlkZW50aWZpZXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkQXQoaW50IGluZGV4KSB7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IGluZGV4IDwgMCB8fCBub2Rlcy5zaXplKCkgPD0gaW5kZXgpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIFByb3BDTUNvbnRhaW5lciBnZXRDb250SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDIwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Db250YWluZXIpIG5vZGU7Ci0KLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCS8vIHJlZ2lzdGVyCi0JCQlub2RlID0gbmV3IFByb3BDTUNvbnRhaW5lcihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTUNvbnRhaW5lcikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpZGVudHMpIHsKLQkJaWYgKGlkZW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbkNoaWxkcmVuID0gbm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7Ci0JCQlPYmplY3Qgbm9kZSA9IG5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNTm9kZSkKLQkJCQkoKFByb3BDTU5vZGUpIG5vZGUpLmdldElkZW50aWZpZXJzKGlkZW50cyk7Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCWlkZW50cy5hZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bUNoaWxkKCkgewotCQlpZiAobm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX0NPTlRBSU5FUjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBuQ2hpbGRyZW4gPSBub2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpKyspIHsKLQkJCU9iamVjdCBub2RlID0gbm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9wQ01Ob2RlKQotCQkJCSgoUHJvcENNTm9kZSkgbm9kZSkuZ2V0VmFsdWVzKHZhbHVlcyk7Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJaWYgKCF2YWx1ZXMuY29udGFpbnMobm9kZSkpCi0JCQkJCXZhbHVlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgcmVtb3ZlQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJbm9kZXMucmVtb3ZlKG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Gb250UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4ZTIxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Gb250UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01Gb250UHJvcGVydHkgZXh0ZW5kcyBQcm9wQ01Qcm9wZXJ0eSB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgY2FjaGVkSWRNYXAgPSBudWxsOwotCS8vIHNlbGVjdGluZyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1NUWUxFID0gImZvbnQtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1NUUkVUQ0ggPSAiZm9udC1zdHJldGNoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TSVpFID0gImZvbnQtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCS8vIHF1YWxpZmljYXRpb24gcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1VOSUNPREVfUkFOR0UgPSAidW5pY29kZS1yYW5nZSI7Ly8kTk9OLU5MUy0xJAotCS8vIG51bWVyaWMgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1VOSVRTX1BFUl9FTSA9ICJ1bml0cy1wZXItZW0iOy8vJE5PTi1OTFMtMSQKLQkvLyByZWZlcmVuY2luZyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU1JDID0gInNyYyI7Ly8kTk9OLU5MUy0xJAotCS8vIG1hdGNoaW5nIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9QQU5PU0VfMSA9ICJwYW5vc2UtMSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NURU1WID0gInN0ZW12IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU1RFTUggPSAic3RlbWgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TTE9QRSA9ICJzbG9wZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0NBUF9IRUlHSFQgPSAiY2FwLWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1hfSEVJR0hUID0gIngtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQVNDRU5UID0gImFzY2VudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0RFU0NFTlQgPSAiZGVzY2VudCI7Ly8kTk9OLU5MUy0xJAotCS8vIHN5bnRoZXNpcyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfV0lEVEhTID0gIndpZHRocyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0JCT1ggPSAiYmJveCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0RFRklOSVRJT05fU1JDID0gImRlZmluaXRpb24tc3JjIjsvLyROT04tTkxTLTEkCi0JLy8gYWxpZ25tZW50IHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9CQVNFTElORSA9ICJiYXNlbGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0NFTlRFUkxJTkUgPSAiY2VudGVybGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX01BVEhMSU5FID0gIm1hdGhsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfVE9QTElORSA9ICJ0b3BsaW5lIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNRm9udFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcENNUHJvcGVydHkgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTUZvbnRQcm9wZXJ0eShuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9GT05UUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBuYW1lcyhPYmplY3QgbWVkaWFHcm91cCkgewotCQlpZiAobWVkaWFHcm91cCA9PSBudWxsKQotCQkJcmV0dXJuIG5hbWVzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCVZlY3RvciBwcm9wZXJ0aWVzID0gbmV3IFZlY3RvcigpOwotCi0JCUl0ZXJhdG9yIGl0ID0gaW5zdGFuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm9wLmdldE1lZGlhR3JvdXBzKCkuY29udGFpbnMobWVkaWFHcm91cCkpCi0JCQkJcHJvcGVydGllcy5hZGQocHJvcC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgaXRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBwcm9wZXJ0aWVzRm9yKFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIHNob3J0aGFuZHMpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIGlmIGlkZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMudmFsdWVzKCkpOwotCi0JCWlmIChjYWNoZWRJZE1hcCA9PSBudWxsKSB7Ci0JCQkvLyBzdGFydCBjYWNoZWluZwotCQkJY2FjaGVkSWRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggY2FjaGVkCi0JCQlPYmplY3QgcmV0ID0gY2FjaGVkSWRNYXAuZ2V0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSk7Ci0JCQlpZiAocmV0ICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBWZWN0b3IoKENvbGxlY3Rpb24pIHJldCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUKLQkJRW51bWVyYXRpb24gcHJvcGVydGllcyA9IGdldFByb3BlcnR5RW51bSgpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXNob3J0aGFuZHMgJiYgcHJvcC5pc1Nob3J0aGFuZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHByb3AuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlzZXQuYWRkKHByb3ApOwotCQl9Ci0KLQkJLy8gY2FjaGUKLQkJY2FjaGVkSWRNYXAucHV0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSwgc2V0KTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihzZXQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01GdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlZmM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01GdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTUZ1bmN0aW9uIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0FUVFIgPSAiYXR0ciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9DT1VOVEVSID0gImNvdW50ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfUkdCID0gInJnYiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9TSEFQRSA9ICJyZWN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1VSSSA9ICJ1cmwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfRk9STUFUID0gImZvcm1hdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9MT0NBTCA9ICJsb2NhbCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUZ1bmN0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHVibGljIFByb3BDTUZ1bmN0aW9uIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNRnVuY3Rpb24pIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNRnVuY3Rpb24obmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01GdW5jdGlvbikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9GVU5DOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE4NGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BDTU5vZGUgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfSURFTlRJRklFUiA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfUFJPUEVSVFkgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX05VTUJFUiA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfU1RSSU5HID0gMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9GVU5DID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9DT05UQUlORVIgPSA1OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1NVQlBST1BFUlRZID0gNjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9GT05UUFJPUEVSVFkgPSA3OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1VOSUNPREVfUkFOR0UgPSA4OwotCXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIHNob3J0IExPQURJTkcgPSAwOyAvLyAwIDogbm90IGluaXRpYWxpemVkLCAxIDogdW5kZXIKLQkJCQkJCQkJCQkvLyBpbml0aWFsaXppbmcsIDIgOiBpbml0aWFsaXplLWRvbmUKLQkJCQkJCQkJCQkvLyBhbmQgZml4IERCCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUHJvcENNTm9kZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0SWRlbnRpZmllcnMoKSB7Ci0JCUhhc2hTZXQgaWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZ2V0SWRlbnRpZmllcnMoaWRzKTsKLQkJcmV0dXJuIGlkczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGFic3RyYWN0IHNob3J0IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFZhbHVlcygpIHsKLQkJVmVjdG9yIHZhbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWdldFZhbHVlcyh2YWxzKTsKLQkJcmV0dXJuIHZhbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRQcm9wZXJ0eUNNKCkgewotCQlpZiAoIWlzTmVlZEluaXRpYWxpemUoKSkKLQkJCXJldHVybjsKLQkJTE9BRElORyA9IDE7Ci0KLQkJUHJvcENNTnVtYmVyLmluaXROdW1iZXJDTURpbSgpOwotCi0JCS8vIGF6aW11dGgKLQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9BWklNVVRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0FOR0xFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVF9TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQVJfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFSX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVF9TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CRUhJTkQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlRXQVJEUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFRXQVJEUyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0KLQkJLy8gYmFja2dyb3VuZAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNik7Ci0KLQkJLy8gYmFja2dyb3VuZC1hdHRhY2htZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0NST0xMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVFJBTlNQQVJFTlQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1pbWFnZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcG9zaXRpb24gLS0tLSBzdWItcHJvcGVydGllcyBob3Jpem9udGFsCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcG9zaXRpb24gLS0tLSBzdWItcHJvcGVydGllcyB2ZXJ0aWNhbAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1yZXBlYXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUX1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVF9ZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT19SRVBFQVQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSkpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoOSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItY29sbGFwc2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MTEFQU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRVBBUkFURSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UUkFOU1BBUkVOVCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1zcGFjaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NQQUNJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3Atc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3Atd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2FwdGlvbi1zaWRlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0FQVElPTl9TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xlYXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTEVBUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NUQVRJQyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgdG9wCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIHJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgYm90dG9tCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIGxlZnQKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1NIQVBFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY29udGVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTlRFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQU5ZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfQ09VTlRFUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0FUVFIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PUEVOX1FVT1RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DTE9TRV9RVU9URSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9fT1BFTl9RVU9URSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9fQ0xPU0VfUVVPVEUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOyAvLyBpbmZpbml0ZQotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gY291bnRlci1pbmNyZW1lbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX0lOQ1JFTUVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9DT1VOVEVSX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjb3VudGVyLXJlc2V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9SRVNFVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9DT1VOVEVSX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjdWUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1ZS1hZnRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1ZS1iZWZvcmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gY3Vyc29yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VSU09SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DUk9TU0hBSVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFRkFVTFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BPSU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01PVkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ORV9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05XX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTl9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1dfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfV19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RFWFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1dBSVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hFTFApOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOyAvLyBpbmZpbml0ZQotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIGRpcmVjdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJUkVDVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTFRSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SVEwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZGlzcGxheQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJU1BMQVkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxPQ0spOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xJU1RfSVRFTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUlVOX0lOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT01QQUNUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NQVJLRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkxJTkVfVEFCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX1JPV19HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfSEVBREVSX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9GT09URVJfR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX1JPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ09MVU1OX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DT0xVTU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NFTEwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NBUFRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gZWxldmF0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0FOR0xFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkVMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFVkVMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQk9WRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGVtcHR5LWNlbGxzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRU1QVFlfQ0VMTFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NIT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZmxvYXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GTE9BVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JQ09OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRU5VKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRVNTQUdFX0JPWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVFVTX0JBUik7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LWZhbWlseQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0ZPTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX0ZBTUlMWSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zaXplCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXNpemUtYWRqdXN0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc3RyZXRjaAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSURFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkFSUk9XRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JVEFMSUMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09CTElRVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXZhcmlhbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMX0NBUFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXdlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8xMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzIwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl80MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzUwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl83MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzgwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfOTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSUdIVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBoZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsZWZ0dAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsZXR0ZXItc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFVFRFUl9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaW5lLWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLWltYWdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLXBvc2l0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVVRTSURFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUtdHlwZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRElTQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0lSQ0xFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TUVVBUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFQ0lNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFQ0lNQUxfTEVBRElOR19aRVJPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9ST01BTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJfUk9NQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX0dSRUVLKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9BTFBIQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfTEFUSU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSX0FMUEhBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUl9MQVRJTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSEVCUkVXKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUk1FTklBTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfR0VPUkdJQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NKS19JREVPR1JBUEhJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElSQUdBTkEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0tBVEFLQU5BKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISVJBR0FOQV9JUk9IQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfS0FUQUtBTkFfSVJPSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJrZXItb2Zmc2V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmtzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1NTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIG1heC1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWF4LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWluLWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtaW4td2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBvcnBoYW5zCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1JQSEFOUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gb3V0bGluZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5WRVJUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdXRsaW5lLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG92ZXJmbG93Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1ZFUkZMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1ZJU0lCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0NST0xMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX1BBR0VfSUQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWFmdGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxXQVlTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhZ2UtYnJlYWstYmVmb3JlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19CRUZPUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMV0FZUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVZPSUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWluc2lkZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGF1c2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGF1c2UtYWZ0ZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBhdXNlLWJlZm9yZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0JFRk9SRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBpdGNoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfRlJFUVVFTkNZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9MT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0hJR0gpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwaXRjaC1yYW5nZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIX1JBTkdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwbGF5LWR1cmluZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NSVgpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcG9zaXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUJTT0xVVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFTEFUSVZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVElDKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHF1b3RlcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1FVT1RFUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHJpY2huZXNzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklDSE5FU1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBzaXplCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QT1JUUkFJVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFORFNDQVBFKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHNwZWFrCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1BFTExfT1VUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstaGVhZGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfSEVBREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PTkNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTFdBWVMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVhay1udW1lcmFsCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfTlVNRVJBTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRElHSVRTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05USU5VT1VTKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstcHVuY3R1YXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19QVU5DVFVBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09ERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWVjaC1yYXRlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBU1QpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfRkFTVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHN0cmVzcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NUUkVTUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gdGFibGUtbGF5b3V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEFCTEVfTEFZT1VUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LWFsaWduCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSlVTVElGWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtZGVjb3JhdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfREVDT1JBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVU5ERVJMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVkVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElORV9USFJPVUdIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTElOSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtaW5kZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LXNoYWRvdwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfU0hBRE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LXRyYW5zZm9ybQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBJVEFMSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUkNBU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSQ0FTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB1bmljb2RlLWJpZGkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRU1CRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JJRElfT1ZFUlJJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdmVydGljYWwtYWxpZ24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WRVJUSUNBTF9BTElHTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1VCKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CQVNFTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUlERExFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVVBFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVYVF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZpc2liaWxpdHkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9WSVNJQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURERU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZvaWNlLWZhbWlseQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9WT0lDRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfVk9JQ0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gdm9sdW1lCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9MVU1FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NJTEVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TT0ZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TT0ZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPVUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTE9VRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHdoaXRlLXNwYWNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUFJFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1dSQVApOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gd2lkb3dzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lET1dTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyB3aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gd29yZC1zcGFjaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB6LWluZGV4Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfWl9JTkRFWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvKiogKioqKioqKiogZm9udCBwcm9wZXJ0aWVzICoqKioqKioqKiAqLwotCQkvLyBmb250LWZhbWlseQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfRkFNSUxZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0ZPTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX0ZBTUlMWSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JVEFMSUMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09CTElRVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXZhcmlhbnQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1ZBUklBTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMX0NBUFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC13ZWlnaHQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1dFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9MRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8yMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzMwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNDAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl81MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzYwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl84MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzkwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtc3RyZXRjaAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU1RSRVRDSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXNpemUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1NJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0FCU09MVVRFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9SRUxBVElWRV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIHVuaWNvZGUtcmFuZ2UKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9VTklDT0RFX1JBTkdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01VUmFuZ2UuZ2V0SW5zdGFuY2VPZihQcm9wQ01VUmFuZ2UuVkFMX1VSQU5HRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIHVuaXRzLXBlci1lbQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1VOSVRTX1BFUl9FTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBzcmMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TUkMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0ZPUk1BVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0xPQ0FMKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gcGFub3NlLTEKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9QQU5PU0VfMSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgxMCk7Ci0KLQkJLy8gc3RlbXYKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TVEVNVik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBzdGVtaAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NURU1IKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHNsb3BlCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU0xPUEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gY2FwLWhlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0NBUF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8geC1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9YX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBhc2NlbnQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9BU0NFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gZGVzY2VudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0RFU0NFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gd2lkdGhzCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfV0lEVEhTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVVSYW5nZS5nZXRJbnN0YW5jZU9mKFByb3BDTVVSYW5nZS5WQUxfVVJBTkdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gYmJveAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0JCT1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCi0JCS8vIGRlZmluaXRpb24tc3JjCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfREVGSU5JVElPTl9TUkMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCi0JCS8vIGJhc2VsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQkFTRUxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gY2VudGVybGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0NFTlRFUkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gbWF0aGxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9NQVRITElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB0b3BsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfVE9QTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvKiogKioqKioqKiogY29udGFpbmVycyAqKioqKioqKiogKi8KLQotCQkvLyBhYnNvbHV0ZS1zaXplCi0JCVByb3BDTUNvbnRhaW5lciBjb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQUJTT0xVVEVfU0laRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWFhfU01BTEwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hfU01BTEwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0xBUkdFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0xBUkdFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YWF9MQVJHRSk7Ci0KLQkJLy8gYm9yZGVyLXN0eWxlCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NPTElEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9EQVNIRUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0RPVFRFRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRE9VQkxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUk9PVkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1JJREdFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTlNFVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1VUU0VUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURERU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCi0JCS8vIGJvcmRlci13aWR0aAotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USElOKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RISUNLKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCi0JCS8vIGNvbG9yCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVFVQSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxBQ0spOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JMVUUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0ZVQ0hTSUEpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dSQVkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dSRUVOKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSU1FKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NQVJPT04pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX05BVlkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX09MSVZFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QVVJQTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1JFRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0lMVkVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URUFMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSElURSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWUVMTE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9TWVNURU1fQ09MT1IpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9SR0IpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0hBU0gpKTsKLQotCQkvLyBzeXN0ZW0gY29sb3IKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1NZU1RFTV9DT0xPUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUNUSVZFQk9SREVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQ1RJVkVDQVBUSU9OKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUFBXT1JLU1BBQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JBQ0tHUk9VTkQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTkZBQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTkhJR0hMSUdIVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9OU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBUSU9OVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JBWVRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0hMSUdIVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSExJR0hUVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5BQ1RJVkVCT1JERVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQ0FQVElPTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5BQ1RJVkVDQVBUSU9OVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5GT0JBQ0tHUk9VTkQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lORk9URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRU5VKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRU5VVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0NST0xMQkFSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRUREQVJLU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURGQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFRExJR0hUU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURTSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dJTkRPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lORE9XRlJBTUUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dJTkRPV1RFWFQpOwotCi0JCS8vIGdlbmVyaWMtZmFtaWx5Ci0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX0ZBTUlMWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VSSUYpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NBTlNfU0VSSUYpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0NVUlNJVkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBTlRBU1kpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01PTk9TUEFDRSk7Ci0KLQkJLy8gZ2VuZXJpYy12b2ljZQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19WT0lDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUFMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkVNQUxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DSElMRCk7Ci0KLQkJLy8gbWFyZ2luLXdpZHRoCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0KLQkJLy8gcGFkZGluZy13aWR0aAotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQotCQkvLyByZWxhdGl2ZS1zaXplCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9SRUxBVElWRV9TSVpFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTEVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MQVJHRVIpOwotCi0JCUxPQURJTkcgPSAyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0xvYWRpbmcoKSB7Ci0JCXJldHVybiBMT0FESU5HID09IDE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTmVlZEluaXRpYWxpemUoKSB7Ci0JCXJldHVybiBMT0FESU5HID09IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01OdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjY2NiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01OdW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTU51bWJlciBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfQU5HTEUgPSAiYW5nbGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0ZSRVFVRU5DWSA9ICJmcmVxdWVuY3kiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0lOVEVHRVIgPSAiaW50ZWdlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfTEVOR1RIID0gImxlbmd0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfUEVSQ0VOVEFHRSA9ICJwZXJjZW50YWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9USU1FID0gInRpbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0hBU0ggPSAiaGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fQ00gPSAiY20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fREVHID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9FTVMgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fRVhTID0gImV4IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0dSQUQgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9IQVNIID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSFogPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU4gPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU5URUdFUiA9ICJJTlRFR0VSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0tIWiA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTU0gPSAibW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTVMgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTlVNQkVSID0gIk5VTUJFUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QQyA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QRVJDRU5UQUdFID0gIiUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFQgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFggPSAicHgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUkFEID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9TID0gInMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgZkRpbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNTnVtYmVyKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpbWVuc2lvbihzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN3aXRjaCAocHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCXJldHVybiBESU1fQ007Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCXJldHVybiBESU1fREVHOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQlyZXR1cm4gRElNX0VNUzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJcmV0dXJuIERJTV9FWFM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQlyZXR1cm4gRElNX0dSQUQ7Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJcmV0dXJuIERJTV9IQVNIOyAvLyBwcmVmaXggZGltZW5zaW9uIC4uLi4KLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQlyZXR1cm4gRElNX0haOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCXJldHVybiBESU1fSU47Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJcmV0dXJuIERJTV9LSFo7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJcmV0dXJuIERJTV9NTTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQlyZXR1cm4gRElNX01TOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCXJldHVybiBESU1fUEM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQlyZXR1cm4gRElNX1BFUkNFTlRBR0U7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJcmV0dXJuIERJTV9QVDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQlyZXR1cm4gRElNX1BYOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQlyZXR1cm4gRElNX1JBRDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCXJldHVybiBESU1fUzsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGltZW5zaW9ucygpIHsKLQkJSGFzaFNldCB2YWxzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXQgPSBmRGltcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl2YWxzLmFkZChpdC5uZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNTnVtYmVyIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNTnVtYmVyKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTU51bWJlcihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTU51bWJlcikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9OVU1CRVI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXROdW1iZXJDTURpbSgpIHsKLQkJUHJvcENNTnVtYmVyIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX0FOR0xFKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fREVHKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fR1JBRCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1JBRCk7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfRlJFUVVFTkNZKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fSFopOwotCQludW0uZkRpbXMuYWRkKERJTV9LSFopOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX0hBU0gpOwotCQludW0uZkRpbXMuYWRkKERJTV9IQVNIKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9JTlRFR0VSKTsKLQkJLy8gbnVtLmZEaW1zLmFkZChESU1fSU5URUdFUik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfTEVOR1RIKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fQ00pOwotCQludW0uZkRpbXMuYWRkKERJTV9FTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9FWFMpOwotCQludW0uZkRpbXMuYWRkKERJTV9JTik7Ci0JCW51bS5mRGltcy5hZGQoRElNX01NKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUEMpOwotCQludW0uZkRpbXMuYWRkKERJTV9QVCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BYKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9OVU1CRVIpOwotCQkvLyBudW0uZkRpbXMuYWRkKERJTV9OVU1CRVIpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX1BFUkNFTlRBR0UpOwotCQludW0uZkRpbXMuYWRkKERJTV9QRVJDRU5UQUdFKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9USU1FKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9TKTsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhYjM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01Qcm9wZXJ0eSBleHRlbmRzIFByb3BDTUNvbnRhaW5lciB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgY2FjaGVkSWRNYXAgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQVpJTVVUSCA9ICJhemltdXRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CRyA9ICJiYWNrZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19BVFRBQ0hNRU5UID0gImJhY2tncm91bmQtYXR0YWNobWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQ09MT1IgPSAiYmFja2dyb3VuZC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfSU1BR0UgPSAiYmFja2dyb3VuZC1pbWFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUE9TSVRJT04gPSAiYmFja2dyb3VuZC1wb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUkVQRUFUID0gImJhY2tncm91bmQtcmVwZWF0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVIgPSAiYm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MTEFQU0UgPSAiYm9yZGVyLWNvbGxhcHNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MT1IgPSAiYm9yZGVyLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1BBQ0lORyA9ICJib3JkZXItc3BhY2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUCA9ICJib3JkZXItdG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFQgPSAiYm9yZGVyLXJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NID0gImJvcmRlci1ib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX0NPTE9SID0gImJvcmRlci10b3AtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9DT0xPUiA9ICJib3JkZXItcmlnaHQtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fQ09MT1IgPSAiYm9yZGVyLWJvdHRvbS1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfQ09MT1IgPSAiYm9yZGVyLWxlZnQtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfU1RZTEUgPSAiYm9yZGVyLXRvcC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1NUWUxFID0gImJvcmRlci1yaWdodC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9TVFlMRSA9ICJib3JkZXItYm90dG9tLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9TVFlMRSA9ICJib3JkZXItbGVmdC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9XSURUSCA9ICJib3JkZXItdG9wLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfV0lEVEggPSAiYm9yZGVyLXJpZ2h0LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1dJRFRIID0gImJvcmRlci1ib3R0b20td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1dJRFRIID0gImJvcmRlci1sZWZ0LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1RUT00gPSAiYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DQVBUSU9OX1NJREUgPSAiY2FwdGlvbi1zaWRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTEVBUiA9ICJjbGVhciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xJUCA9ICJjbGlwIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT0xPUiA9ICJjb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09OVEVOVCA9ICJjb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX0lOQ1JFTUVOVCA9ICJjb3VudGVyLWluY3JlbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9SRVNFVCA9ICJjb3VudGVyLXJlc2V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUUgPSAiY3VlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQUZURVIgPSAiY3VlLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQkVGT1JFID0gImN1ZS1iZWZvcmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVUlNPUiA9ICJjdXJzb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0RJU1BMQVkgPSAiZGlzcGxheSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRUxFVkFUSU9OID0gImVsZXZhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRU1QVFlfQ0VMTFMgPSAiZW1wdHktY2VsbHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZMT0FUID0gImZsb2F0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UID0gImZvbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkVfQURKVVNUID0gImZvbnQtc2l6ZS1hZGp1c3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0hFSUdIVCA9ICJoZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xFRlQgPSAibGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVUVEVSX1NQQUNJTkcgPSAibGV0dGVyLXNwYWNpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJTkVfSEVJR0hUID0gImxpbmUtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFID0gImxpc3Qtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfSU1BR0UgPSAibGlzdC1zdHlsZS1pbWFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9QT1NJVElPTiA9ICJsaXN0LXN0eWxlLXBvc2l0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1RZUEUgPSAibGlzdC1zdHlsZS10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU4gPSAibWFyZ2luIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fVE9QID0gIm1hcmdpbi10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9SSUdIVCA9ICJtYXJnaW4tcmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0xFRlQgPSAibWFyZ2luLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktFUl9PRkZTRVQgPSAibWFya2VyLW9mZnNldCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS1MgPSAibWFya3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX0hFSUdIVCA9ICJtaW4taGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fV0lEVEggPSAibWluLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PUlBIQU5TID0gIm9ycGhhbnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkUgPSAib3V0bGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9DT0xPUiA9ICJvdXRsaW5lLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1NUWUxFID0gIm91dGxpbmUtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfV0lEVEggPSAib3V0bGluZS13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1ZFUkZMT1cgPSAib3ZlcmZsb3ciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkcgPSAicGFkZGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19UT1AgPSAicGFkZGluZy10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfUklHSFQgPSAicGFkZGluZy1yaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19CT1RUT00gPSAicGFkZGluZy1ib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfTEVGVCA9ICJwYWRkaW5nLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0UgPSAicGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19BRlRFUiA9ICJwYWdlLWJyZWFrLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0JFRk9SRSA9ICJwYWdlLWJyZWFrLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19JTlNJREUgPSAicGFnZS1icmVhay1pbnNpZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFID0gInBhdXNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9BRlRFUiA9ICJwYXVzZS1hZnRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQkVGT1JFID0gInBhdXNlLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0ggPSAicGl0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIX1JBTkdFID0gInBpdGNoLXJhbmdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QTEFZX0RVUklORyA9ICJwbGF5LWR1cmluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUE9TSVRJT04gPSAicG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1FVT1RFUyA9ICJxdW90ZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1JJQ0hORVNTID0gInJpY2huZXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUdIVCA9ICJyaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU0laRSA9ICJzaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBSyA9ICJzcGVhayI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfSEVBREVSID0gInNwZWFrLWhlYWRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfTlVNRVJBTCA9ICJzcGVhay1udW1lcmFsIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19QVU5DVFVBVElPTiA9ICJzcGVhay1wdW5jdHVhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFRUNIX1JBVEUgPSAic3BlZWNoLXJhdGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NUUkVTUyA9ICJzdHJlc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RBQkxFX0xBWU9VVCA9ICJ0YWJsZS1sYXlvdXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9ERUNPUkFUSU9OID0gInRleHQtZGVjb3JhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9JTkRFTlQgPSAidGV4dC1pbmRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfU0hBRE9XID0gInRleHQtc2hhZG93IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1RSQU5TRk9STSA9ICJ0ZXh0LXRyYW5zZm9ybSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVE9QID0gInRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVU5JQ09ERV9CSURJID0gInVuaWNvZGUtYmlkaSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVkVSVElDQUxfQUxJR04gPSAidmVydGljYWwtYWxpZ24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1ZJU0lCSUxJVFkgPSAidmlzaWJpbGl0eSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9JQ0VfRkFNSUxZID0gInZvaWNlLWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9MVU1FID0gInZvbHVtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0hJVEVfU1BBQ0UgPSAid2hpdGUtc3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRE9XUyA9ICJ3aWRvd3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRFRIID0gIndpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XT1JEX1NQQUNJTkcgPSAid29yZC1zcGFjaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9aX0lOREVYID0gInotaW5kZXgiOy8vJE5PTi1OTFMtMSQKLQkvLyBpbnN0YW5jZSBmaWVsZHMKLQlwcml2YXRlIGludCBmTWluVmFsdWVDb3VudCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZk1heFZhbHVlQ291bnQgPSAxOwotCXByaXZhdGUgT2JqZWN0W10gbWVkaWFHcm91cHM7Ci0JcHJvdGVjdGVkIExpc3QgY29udGFpbmVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01Qcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgYXBwZW5kQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJT2JqZWN0IHJldCA9IHN1cGVyLmFwcGVuZENoaWxkKG5vZGUpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5KSB7Ci0JCQkvLyByZWdpc3RlciBzaG9ydGhhbmQgY29udGFpbmVyCi0JCQlQcm9wQ01Qcm9wZXJ0eSBjbSA9IChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQkJCWlmIChjbS5jb250YWluZXJzID09IG51bGwpCi0JCQkJY20uY29udGFpbmVycyA9IG5ldyBWZWN0b3IoKTsKLQkJCWlmICghY20uY29udGFpbmVycy5jb250YWlucyh0aGlzKSkKLQkJCQljbS5jb250YWluZXJzLmFkZCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwZW5kTWVkaWFHcm91cChPYmplY3QgbWcpIHsKLQkJaWYgKG1lZGlhR3JvdXBzID09IG51bGwpCi0JCQltZWRpYUdyb3VwcyA9IG5ldyBPYmplY3RbMV07Ci0JCWVsc2UgewotCQkJT2JqZWN0W10gb2xkTWVkaWFHcm91cHMgPSBtZWRpYUdyb3VwczsKLQkJCW1lZGlhR3JvdXBzID0gbmV3IE9iamVjdFtvbGRNZWRpYUdyb3Vwcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkTWVkaWFHcm91cHMsIDAsIG1lZGlhR3JvdXBzLCAwLCBvbGRNZWRpYUdyb3Vwcy5sZW5ndGgpOwotCQl9Ci0JCW1lZGlhR3JvdXBzW21lZGlhR3JvdXBzLmxlbmd0aCAtIDFdID0gbWc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMDApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTVByb3BlcnR5KG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNYXhWYWx1ZUNvdW50KCkgewotCQlyZXR1cm4gZk1heFZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVkaWFHcm91cHMoKSB7Ci0JCWlmIChtZWRpYUdyb3VwcyAhPSBudWxsKQotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QobWVkaWFHcm91cHMpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluVmFsdWVDb3VudCgpIHsKLQkJcmV0dXJuIGZNaW5WYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgewotCQlyZXR1cm4gKGNvbnRhaW5lcnMgPT0gbnVsbCkgPyAwIDogY29udGFpbmVycy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG9ydGhhbmQoKSB7Ci0JCWludCBuQ2hpbGQgPSBnZXROdW1DaGlsZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZ2V0Q2hpbGRBdChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSAmJiAhKG9iaiBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBuYW1lcyhPYmplY3QgbWVkaWFHcm91cCkgewotCQlpZiAobWVkaWFHcm91cCA9PSBudWxsKQotCQkJcmV0dXJuIG5hbWVzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCVZlY3RvciBwcm9wZXJ0aWVzID0gbmV3IFZlY3RvcigpOwotCi0JCUl0ZXJhdG9yIGl0ID0gaW5zdGFuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm9wLmdldE1lZGlhR3JvdXBzKCkuY29udGFpbnMobWVkaWFHcm91cCkpCi0JCQkJcHJvcGVydGllcy5hZGQocHJvcC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBwcm9wZXJ0aWVzRm9yKFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIHNob3J0aGFuZHMpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIGlmIGlkZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMudmFsdWVzKCkpOwotCi0JCWlmIChjYWNoZWRJZE1hcCA9PSBudWxsKSB7Ci0JCQkvLyBzdGFydCBjYWNoZWluZwotCQkJY2FjaGVkSWRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggY2FjaGVkCi0JCQlPYmplY3QgcmV0ID0gY2FjaGVkSWRNYXAuZ2V0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSk7Ci0JCQlpZiAocmV0ICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBWZWN0b3IoKENvbGxlY3Rpb24pIHJldCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUKLQkJRW51bWVyYXRpb24gcHJvcGVydHlFbnVtID0gZ2V0UHJvcGVydHlFbnVtKCk7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKHByb3BlcnR5RW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgcHJvcGVydHlFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXNob3J0aGFuZHMgJiYgcHJvcC5pc1Nob3J0aGFuZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHByb3AuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlzZXQuYWRkKHByb3ApOwotCQl9Ci0KLQkJLy8gY2FjaGUKLQkJY2FjaGVkSWRNYXAucHV0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSwgc2V0KTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1heFZhbHVlQ291bnQoaW50IG5ld01heFZhbHVlQ291bnQpIHsKLQkJZk1heFZhbHVlQ291bnQgPSBuZXdNYXhWYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1pblZhbHVlQ291bnQoaW50IG5ld01pblZhbHVlQ291bnQpIHsKLQkJZk1pblZhbHVlQ291bnQgPSBuZXdNaW5WYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Qcm9wZXJ0eSBzaG9ydGhhbmRDb250YWluZXJBdChpbnQgaSkgewotCQlpZiAoY29udGFpbmVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpIDwgMCB8fCBjb250YWluZXJzLnNpemUoKSA8PSBpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIGNvbnRhaW5lcnMuZ2V0KGkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBzaG9ydGhhbmRDb250YWluZXJJdGVyYXRvcigpIHsKLQkJaWYgKGNvbnRhaW5lcnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gY29udGFpbmVycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIzMGMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVN0cmluZyBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfRk9OVCA9ICJmb250IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9DT1VOVEVSX0lEID0gImNvdW50ZXJJZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfUEFHRV9JRCA9ICJwYWdlSWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1ZPSUNFID0gInZvaWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9BTlkgPSAiYW55IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHB1YmxpYyBQcm9wQ01TdHJpbmcgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01TdHJpbmcpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJbm9kZSA9IG5ldyBQcm9wQ01TdHJpbmcobmFtZSk7Ci0JCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0KLQkJcmV0dXJuIChQcm9wQ01TdHJpbmcpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfU1RSSU5HOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN1YlByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWJiMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVN1YlByb3BlcnR5IGV4dGVuZHMgUHJvcENNUHJvcGVydHkgewotCi0JLy8gc3RhdGljIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0JHX1BPU0lUSU9OX1ggPSAiYmFja2dyb3VuZC1wb3NpdGlvbkgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0JHX1BPU0lUSU9OX1kgPSAiYmFja2dyb3VuZC1wb3NpdGlvblYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfVE9QID0gImNsaXBUb3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfUklHSFQgPSAiY2xpcFJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX0JPVFRPTSA9ICJjbGlwQm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX0xFRlQgPSAiY2xpcExlZnQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01TdWJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUHJvcENNUHJvcGVydHkgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gc2hvcnRoYW5kQ29udGFpbmVyQXQoMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNU3ViUHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldE5hbWVFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfU1VCUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChjb250YWluZXJzID09IG51bGwpCi0JCQljb250YWluZXJzID0gbmV3IFZlY3RvcigpOwotCQljb250YWluZXJzLmNsZWFyKCk7Ci0JCWNvbnRhaW5lcnMuYWRkKHByb3ApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VUmFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc1NzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVVSYW5nZSBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9VUkFOR0UgPSAidXJhbmdlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNVVJhbmdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVVSYW5nZSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVVSYW5nZSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlub2RlID0gbmV3IFByb3BDTVVSYW5nZShuYW1lKTsKLQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQotCQlyZXR1cm4gKFByb3BDTVVSYW5nZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9VTklDT0RFX1JBTkdFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZiYTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01VdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtaW51cyhDb2xsZWN0aW9uIHNyYywgQ29sbGVjdGlvbiByZWYpIHsKLQkJSXRlcmF0b3IgaXQgPSByZWYuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChzcmMuY29udGFpbnMob2JqKSkKLQkJCQlzcmMucmVtb3ZlKG9iaik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwbHVzKENvbGxlY3Rpb24gc3JjLCBDb2xsZWN0aW9uIHJlZikgewotCQlJdGVyYXRvciBpdCA9IHJlZi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCFzcmMuY29udGFpbnMob2JqKSkKLQkJCQlzcmMuYWRkKG9iaik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYmM1ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByb3BlcnRpZXMgY29uc3RhbnRzIHVzZWQgYnkgQ1NTLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kIG1vZGlmeSB0aGUKLSAqIENTUyBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudFByb3BlcnRpZXMgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTQ09SRV9JRCA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0tFWSA9ICI8cHJvamVjdD4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjc3MgcHJvZmlsZSB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QUk9GSUxFID0gImNzcy1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdGhlIGtleSB3aWxsIGJlIGJhc2VkIG9mZiBvZgotCSAqIEByZXR1cm4gcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoIChiYXNpY2FsbHkgdGhlCi0JICogICAgICAgICByZXNvdXJjZVBhdGggd2l0aG91dCB0aGUgZmlsZW5hbWUpOyBQUk9KRUNUX0tFWSBpZiByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGlzIG51bGwKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEtleUZvcihJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJU3RyaW5nIGtleSA9IFBST0pFQ1RfS0VZOwotCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJa2V5ID0gcmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJlZmVyZW5jZXMgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogcHJlZmVyZW5jZSBrZXkgKHN1Yk5vZGUpIElmIGNyZWF0ZSBpcyB0cnVlLCB0aGUgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUKLQkgKiBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgdW5kZXIKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgdGhlIHN1Ym5vZGUvY2F0ZWdvcnkgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyBsb2NhdGVkIGluCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgYSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdAotCSAqICAgICAgICAgICAgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4gUHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqICAgICAgICAgcHJlZmVyZW5jZSBrZXkuIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBmb3VuZCBhbmQgY3JlYXRlIGlzCi0JICogICAgICAgICBmYWxzZQotCSAqLwotCXN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNyZWF0ZSkKLQkJCS8vIGNyZWF0ZSBhbGwgbm9kZXMgZG93biB0byB0aGUgb25lIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KS5nZXROb2RlKENTU0NPUkVfSUQpLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCS8vIGJlIGNhcmVmdWwgbG9va2luZyB1cCBmb3Igb3VyIG5vZGUgc28gbm90IHRvIGNyZWF0ZSBhbnkgbm9kZXMgYXMKLQkJLy8gc2lkZSBlZmZlY3QKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCkubm9kZShQcm9qZWN0U2NvcGUuU0NPUEUpOwotCQl0cnkgewotCQkJLy8gVE9ETyBvbmNlIGJ1ZyA5MDUwMCBpcyBmaXhlZCwgc2hvdWxkIGJlIGFzIHNpbXBsZSBhcyB0aGlzOgotCQkJLy8gU3RyaW5nIHBhdGggPSBwcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIEVOQ09ESU5HX1BSRUZfTk9ERTsKLQkJCS8vIHJldHVybiBub2RlLm5vZGVFeGlzdHMocGF0aCkgPyBub2RlLm5vZGUocGF0aCkgOiBudWxsOwotCQkJLy8gZm9yIG5vdywgdGFrZSB0aGUgbG9uZyB3YXkKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByb2plY3QuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMoQ1NTQ09SRV9JRCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKENTU0NPUkVfSUQpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJlZmVyZW5jZUtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbm9kZS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm9kZUV4aXN0cyBmYWlsZWQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgcmV0cmlldmUgcHJlZmVyZW5jZSBub2RlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgaXMKLQkgKiAgICAgICAgICAgIGF2YWlsYWJsZSBhbmQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHNob3VsZCBiZSB0YWtlbi4gTm90ZQotCSAqICAgICAgICAgICAgdGhhdCBwYXNzaW5nIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBhdm9pZGVkLgotCSAqIEBwYXJhbSByZWN1cnNlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHF1ZXJpZWQgdGlsbCBwcm9wZXJ0eSBpcyBmb3VuZAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGtleS4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UpIHsKLQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gcHJlZmVyZW5jZUZvdW5kID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsID0gaW50ZXJuYWxHZXRQcm9wZXJ0eShyZXNvdXJjZSwgcmVjdXJzZSwgcHJlZmVyZW5jZXMpOwotCQkJCQkvLyBwcmVmZXJlbmNlRm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBubyBwcmVmZXJlbmNlcyBmb3VuZCAtIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLAotCQkvLyAvLyBzaG9ydC1jaXJjdWl0Ci0JCS8vIC8vIGxvb2t1cCBieSBmYWxsaW5nIGJhY2sgdG8gd29ya3NwYWNlJ3MgZGVmYXVsdAotCQkvLyAvLyBzZXR0aW5nCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKQotCQkvLyB2YWwgPSBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGludGVybmFsR2V0UHJvcGVydHkoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UsIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIG51bGwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiByZXNvdXJjZSAhPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkgJiYgcmVjdXJzZSkgewotCQkJdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKG51bGwpLCBudWxsKTsKLQkJfQotCi0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIGVuc3VyZSB3ZSBkZWZhdWx0IHRvIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZSBpZiBub25lIGlzIGZvdW5kCi0JCS8vIHJldHVybiB2YWx1ZSA9PSBudWxsID8gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpIDogdmFsdWU7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0LiBOb3RlIGNvbnRleHQgY2Fubm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBrZXkuIElmIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICB0aGUga2V5IGlzIHJlbW92ZWQgZnJvbSBwcm9wZXJ0aWVzLgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCQlwcmVmZXJlbmNlcy5yZW1vdmUoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQllbHNlCi0JCQkJCXByZWZlcmVuY2VzLnB1dChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIHZhbHVlKTsKLQkJCQl0cnkgewotCQkJCQkvLyBzYXZlIGNoYW5nZXMKLQkJCQkJcHJlZmVyZW5jZXMuZmx1c2goKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1NTQ09SRV9JRCwgSVN0YXR1cy5FUlJPUiwgIlVuYWJsZSB0byBzZXQgcHJvcGVydHkiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8ganVzdCBzZXQgYSBwcmVmZXJlbmNlIGluIHRoZSBpbnN0YW5jZSBzY29wZQotCQkvLyBpZiAoIXByZWZlcmVuY2VGb3VuZCkgewotCQkvLyBzZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCS8vIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhNGI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJZkpvYiA9IG5ldyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIgX2luc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCUNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBmSm9iOwotCi0JLyoqCi0JICogVGhpcyBqb2IgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBhbGxvdyB0aGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0JICogdG8gc2NoZWR1bGUgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gbW9kaWZ5IHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19VUERBVEVfREVMQVkgPSA1MDA7Ci0JCXByaXZhdGUgTGlzdCBhc3luY0NoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpIHsKLQkJCXN1cGVyKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTQ09SRV9JRCwgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIG51bGwpOwotCQkJbW9uaXRvciA9IG1vbml0b3IgPT0gbnVsbCA/IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgOiBtb25pdG9yOwotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhDU1NDb3JlTWVzc2FnZXMuQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjc3MgcHJvZmlsZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhuZXh0LCBDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHdlIGdvdCBhbiBlcnJvciBzYXZpbmcKLQkJCQkJCQlTdHJpbmcgZGV0YWlsTWVzc2FnZSA9IE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGggY3NzIGNvbnRlbnQgc2V0dGluZyB0byBzZWUgaWYgaXQgaGFzCi0JCQkvLyBiZWVuIG1vdmVkL2RlbGV0ZWQKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgcHJvamVjdERlbHRhLCBwcm9qZWN0c1RvU2F2ZSk7Ci0KLQkJCS8vIGlmIHRoZXJlIHdhcyBhIHByZWZlcmVuY2Uga2V5IGNoYW5nZSwgbmVlZCB0byBzYXZlIHByZWZlcmVuY2VzCi0JCQlpZiAocmVzb3VyY2VDaGFuZ2VzKQotCQkJCXByb2plY3RzVG9TYXZlLmFkZChjdXJyZW50UHJvamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogR29lcyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UtZGVwZW5kZW50IHByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aAotCQkgKiBjdXJyZW50UHJvamVjdCAmIGtleSBhbmQgdXBkYXRlcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGlmIG5lZWRlZAotCQkgKiBiYXNlZCBvbiBwcm9qZWN0RGVsdGEKLQkJICogCi0JCSAqIEBwYXJhbSBjdXJyZW50UHJvamVjdAotCQkgKiAgICAgICAgICAgIGN1cnJlbnQgcHJvamVjdCBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkIGF0Ci0JCSAqIEBwYXJhbSBrZXkKLQkJICogICAgICAgICAgICBjdXJyZW50IGtleS9zdWJjYXRlZ29yeSBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkCi0JCSAqICAgICAgICAgICAgYXQKLQkJICogQHBhcmFtIHByb2plY3REZWx0YQotCQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VzIHRvIHByb2Nlc3MgdGhlIHByZWZlcmVuY2Uga2V5cyBhZ2FpbnN0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0c1RvU2F2ZQotCQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0cyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZC9zYXZlZAotCQkgKiBAcmV0dXJuIHRydWUgaWYgY3VycmVudFByb2plY3QncyBwcmVmZXJlbmNlcyB3ZXJlIG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1ByZWZlcmVuY2VzKElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LCBTdHJpbmcga2V5LCBJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gZ2V0IHRoZSBwcm9qZWN0LWtleSBwcmVmZXJlbmNlIG5vZGUKLQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCWlmIChwcm9qZWN0UHJlZnMgPT0gbnVsbCkKLQkJCQkvLyBubyBwcmVmZXJlbmNlcyBmb3IgdGhpcyBwcm9qZWN0LWtleSwganVzdCBiYWlsCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gYWZmZWN0ZWRSZXNvdXJjZXM7Ci0JCQl0cnkgewotCQkJCWFmZmVjdGVkUmVzb3VyY2VzID0gcHJvamVjdFByZWZzLmtleXMoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHByb2JsZW1zIHdpdGggdGhlIHByb2plY3Qgc2NvcGUuLi4gd2UgZ29ubmEgbWlzcyB0aGUKLQkJCQkvLyBjaGFuZ2VzIChidXQgd2lsbCBsb2cpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlByb2JsZW0gcmV0cmVpdmluZyBKU1AgRnJhZ21lbnQgcHJlZmVyZW5jZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIHByZWZlcmVuY2Uga2V5ICh3aGljaCBpcyByZWFsbHkgYSBmaWxlIG5hbWUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gc2VlIGlmIHByZWZlcmVuY2Uga2V5L2ZpbGUgbmFtZSB3YXMgZmlsZSB0aGF0IHdhcyBjaGFuZ2VkCi0JCQkJSVJlc291cmNlRGVsdGEgbWVtYmVyRGVsdGEgPSBwcm9qZWN0RGVsdGEuZmluZE1lbWJlcihuZXcgUGF0aChhZmZlY3RlZFJlc291cmNlc1tpXSkpOwotCQkJCS8vIG5vIGNoYW5nZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQotCQkJCWlmIChtZW1iZXJEZWx0YSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobWVtYmVyRGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJcmVzb3VyY2VDaGFuZ2VzID0gdHJ1ZTsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBzZXR0aW5nIGZvciB0aGUgb3JpZ2luYWwgbG9jYXRpb24KLQkJCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByb2plY3RQcmVmcy5nZXQoYWZmZWN0ZWRSZXNvdXJjZXNbaV0sIG51bGwpOwotCQkJCQlwcm9qZWN0UHJlZnMucmVtb3ZlKGFmZmVjdGVkUmVzb3VyY2VzW2ldKTsKLQkJCQkJaWYgKChtZW1iZXJEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCQkJCS8vIGlmIG1vdmluZywgY29weSB0aGUgc2V0dGluZyBmb3IgdGhlIG5ldyBsb2NhdGlvbgotCQkJCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCQkJUHJlZmVyZW5jZXMgdGFyZ2V0UHJlZnMgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldEtleUZvcihtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpKSwgY3VycmVudFZhbHVlKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IGN1cnJlbnRQcm9qZWN0KQotCQkJCQkJCXByb2plY3RzVG9TYXZlLmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZUNoYW5nZXM7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGFueSBjaGFuZ2UgdG8gdGhlIGVuY29kaW5nIGZpbGUgb3IgYW55IHJlc291cmNlIHdpdGggZW5jb2RpbmcKLQkJICogc2V0LCBqdXN0IGRpc2NhcmQgdGhlIGNhY2hlIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIHByb2plY3REZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkvLyBwcm9jZXNzIGVhY2ggcHJvamVjdCBpbiB0aGUgZGVsdGEKLQkJCVNldCBwcm9qZWN0c1RvU2F2ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3REZWx0YXMubGVuZ3RoOyBpKyspCi0JCQkJLy8gbm90aGluZyB0byBkbyBpZiBhIHByb2plY3QgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZC9tb3ZlZAotCQkJCWlmIChwcm9qZWN0RGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIChwcm9qZWN0RGVsdGFzW2ldLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSA9PSAwKQotCQkJCQlwcm9jZXNzRW50cnlDaGFuZ2VzKHByb2plY3REZWx0YXNbaV0sIHByb2plY3RzVG9TYXZlKTsKLQkJCWZKb2IuYWRkQ2hhbmdlcyhwcm9qZWN0c1RvU2F2ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCV9pbnN0YW5jZSA9IG5ldyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJX2luc3RhbmNlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDZjYzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgewotCQl0aGlzLmZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiB0aGlzLmZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSB0aGlzLmZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCh0aGlzLmZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSB0aGlzLmZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmRhOGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA0IDY6NDIgUE0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IDxhCi0gKiBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4IDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDQgNjo0MiBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgQ1NTSGVhZFRva2VuaXplciB7Ci0KLQkvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0JLyoqIGxleGljYWwgc3RhdGVzICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENIQVJTRVRfUlVMRSA9IDQ7Ci0KLQkvKioKLQkgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotCSAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwgYXQgdGhlCi0JICogYmVnaW5uaW5nIG9mIGEgbGluZSBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0gezAsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDd9OwotCi0JLyoqCi0JICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAiXDExXDBcMVw2XDFcMTFcMlwwXDFcMTBcMjJcMFwxXDZcMVwwXDFcMzZcMlwwIiArICJcMVw0MVwxXDBcMVwzN1w3XDBcMVw0MFwxM1wwXDFcMzVcMVwxMlwxXDdcMVwzNCIgKyAiXDFcMTNcMVwxN1wxXDIyXDFcMFwxXDIwXDFcMzFcMVwyNVwxXDBcMVwzM1wxXDIxIiArICJcMVwzMlwyXDBcMVwxNlwxXDE1XDFcMjdcMVwzMFwyXDBcMVwyM1wxXDI0XDFcMjYiICsgIlwzXDBcMVwxNFwxMFwwXDFcMjJcMVwwXDFcMjBcMVwzMVwxXDI1XDFcMFwxXDMzIiArICJcMVwyMVwxXDMyXDJcMFwxXDE2XDFcMTVcMVwyN1wxXDMwXDJcMFwxXDIzXDFcMjQiICsgIlwxXDI2XDNcMFwxXDE0XDEwMlwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDAiICsgIlwxXDFcMjBcMFwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXJbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0JLyogZXJyb3IgY29kZXMgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0JLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLCAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLCAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSJ9OwotCi0JLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQlwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKioKLQkgKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzIHRoZSBzb3VyY2UKLQkgKiBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLQkvKioKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbQotCSAqIGlucHV0Ci0JICovCi0JcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotCi0JLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXByaXZhdGUgaW50IHl5Y2hhcjsKLQotCi0JLyoqCi0JICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhCi0JICogbGluZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLQkvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0JLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0KLQlwdWJsaWMgQ1NTSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgaW4pIHsKLQkJLyogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkJLyoKLQkJICogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcyB0aGUKLQkJICogc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcKLQkJICovCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKSAwKTsKLQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLQkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0Ci0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQotCi0JCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0KLQkJLyoqCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+dGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYQotCQkgKiBsaW5lCi0JCSAqLwotCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0JCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLQkJaGFzTW9yZSA9IHRydWU7Ci0KLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotCi0KLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lciBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mCi0JICogdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLQkJdGhpcy55eV9yZWFkZXIgPSBpbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzCi0JICogY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCQl0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0JfQotCi0JLyoqCi0JICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhY2tlZAotCSAqICAgICAgICAgICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKiBAcmV0dXJuIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotCQljaGFyW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0JCWludCBpID0gMDsgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAqLwotCQlpbnQgaiA9IDA7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCXdoaWxlIChpIDwgMTU4KSB7Ci0JCQlpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQljaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJZG8KLQkJCQltYXBbaisrXSA9IHZhbHVlOwotCQkJd2hpbGUgKC0tY291bnQgPiAwKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICBzdHJlYW0gaXMgcmVhY2hlZC4KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLQkgKi8KLQlwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0JCS8qIHN0YW5kYXJkIGNhc2UgKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKQotCQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0JCS8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8KLQkJaWYgKHl5X2F0RU9GKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCS8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0JCS8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0JCWlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9idWZmZXIsIDAsIHl5X2VuZFJlYWQgLSB5eV9zdGFydFJlYWQpOwotCi0JCQkvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotCQkJeXlfZW5kUmVhZCAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9jdXJyZW50UG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X21hcmtlZFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9wdXNoYmFja1BvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9zdGFydFJlYWQgPSAwOwotCQl9Ci0KLQkJLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotCQlpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLQkJCWNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLQkJCXl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLQkJfQotCi0JCS8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotCQlpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgeXlfYnVmZmVyLmxlbmd0aCAtIHl5X2VuZFJlYWQpOwotCi0JCWlmIChudW1SZWFkID09IC0xKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCXl5X2VuZFJlYWQgKz0gbnVtUmVhZDsKLQotCQlyZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0JfQotCi0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl5eV9hdEVPRiA9IHRydWU7IC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0JCXl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7IC8qIGludmFsaWRhdGUgYnVmZmVyICovCi0JCXl5X3JlYWRlci5jbG9zZSgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotCSAqLwotCWZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLQkJcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0JfQotCi0JLyoqCi0JICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3RhdGUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0JCXl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MgLSB5eV9zdGFydFJlYWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotCQlyZXR1cm4geXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkOwotCX0KLQotCi0JLyoqCi0JICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0JICogCi0JICogQHBhcmFtIGVycm9yQ29kZQotCSAqICAgICAgICAgICAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotCQl9Ci0JCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0JCX0KLQotCQlTeXN0ZW0uZXhpdCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotCSAqIAotCSAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbnVtYmVyCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4gVGhpcyBudW1iZXIgbXVzdAotCSAqICAgICAgICAgICAgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotCSAqLwotCXByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLQkJaWYgKG51bWJlciA+IHl5bGVuZ3RoKCkpCi0JCQl5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLQkJeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLQl9Ci0KLQotCS8qKgotCSAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLCB3aGVuIHRoZQotCSAqIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotCQlpZiAoIXl5X2VvZl9kb25lKSB7Ci0JCQl5eV9lb2ZfZG9uZSA9IHRydWU7Ci0JCQloYXNNb3JlID0gZmFsc2U7Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwgdGhlIGVuZAotCSAqIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCB0b2tlbgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaW50IHl5X2lucHV0OwotCQlpbnQgeXlfYWN0aW9uOwotCi0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJeXljaGFyICs9IHl5bGVuZ3RoKCk7Ci0KLQkJCXl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcyAtIDFdID09ICdcbic7Ci0JCQlpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXSA9PSAnXHInKSB7Ci0JCQkJeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLQkJCQlpZiAoIXl5X2F0RU9GKQotCQkJCQl5eV9jdXJyZW50UG9zLS07Ci0JCQl9Ci0KLQkJCXl5X2FjdGlvbiA9IC0xOwotCi0JCQl5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0JCQlpZiAoeXlfYXRCT0wpCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlICsgMV07Ci0JCQllbHNlCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0JCQl5eV9mb3JBY3Rpb24gOiB7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQotCQkJCQl5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YpCi0JCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0JCQkJCWJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotCQkJCQlib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLQkJCQkJeXlfZm9yTmV4dCA6IHsKLQkJCQkJCXN3aXRjaCAoeXlfc3RhdGUpIHsKLQkJCQkJCQljYXNlIDAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzAgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJY2FzZSAyOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzAgOgotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDI2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoeXlfaXNGaW5hbCkgewotCQkJCQkJeXlfYWN0aW9uID0geXlfc3RhdGU7Ci0JCQkJCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQkJCQkJaWYgKHl5X25vTG9va0FoZWFkKQotCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCi0KLQkJCXN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLQkJCQljYXNlIDQ1IDogewotCQkJCQl5eXB1c2hiYWNrKDIpOwotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJfQotCQkJCWNhc2UgNjUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI1IDogewotCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJfQotCQkJCWNhc2UgNjYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE5IDoKLQkJCQljYXNlIDIwIDogewotCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQl5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsKLQkJCQkJc3RyaW5nLnNldExlbmd0aCgwKTsKLQkJCQl9Ci0JCQkJY2FzZSA2NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTggOiB7Ci0JCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQlyZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5SdWxlRW5kOwotCQkJCX0KLQkJCQljYXNlIDY4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMiA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDY5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0NCA6IHsKLQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDcwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MSA6IHsKLQkJCQkJaWYgKHl5Y2hhciA9PSAwKSB7Ci0JCQkJCQl5eWJlZ2luKENIQVJTRVRfUlVMRSk7Ci0JCQkJCQlyZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2FzZSA3MSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTYgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJeXliZWdpbihTVF9YTUxEZWNsKTsKLQkJCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXNlIDcyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4IDoKLQkJCQljYXNlIDkgOgotCQkJCWNhc2UgMTAgOgotCQkJCWNhc2UgMTEgOgotCQkJCWNhc2UgMTIgOgotCQkJCWNhc2UgMTMgOgotCQkJCWNhc2UgMTQgOgotCQkJCWNhc2UgMTUgOgotCQkJCWNhc2UgMTYgOgotCQkJCWNhc2UgMjEgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikgewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhc2UgNzMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQxIDogewotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7Ci0JCQkJfQotCQkJCWNhc2UgNzQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDYzIDogewotCQkJCQlwdXNoQ3VycmVudFN0YXRlKCk7Ci0JCQkJCXl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOwotCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsKLQkJCQl9Ci0JCQkJY2FzZSA3NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMyA6Ci0JCQkJY2FzZSAxNyA6IHsKLQkJCQkJcHVzaEN1cnJlbnRTdGF0ZSgpOwotCQkJCQl5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsKLQkJCQl9Ci0JCQkJY2FzZSA3NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDYgOiB7Ci0JCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsKLQkJCQl9Ci0JCQkJY2FzZSA3NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzMgOiB7Ci0JCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7Ci0JCQkJfQotCQkJCWNhc2UgNzggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDM0IDogewotCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOwotCQkJCX0KLQkJCQljYXNlIDc5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNCA6Ci0JCQkJY2FzZSAyNiA6Ci0JCQkJY2FzZSAyOSA6IHsKLQkJCQkJc3RyaW5nLmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJfQotCQkJCWNhc2UgODAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIzIDogewotCQkJCQl5eWJlZ2luKFNRX1NUUklORyk7Ci0JCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWNhc2UgODEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIyIDogewotCQkJCQl5eWJlZ2luKERRX1NUUklORyk7Ci0JCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWNhc2UgODIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI3IDogewotCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJfQotCQkJCWNhc2UgODMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI4IDogewotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDg0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMCA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDg1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMSA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDg2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotCQkJCQkJeXlfYXRFT0YgPSB0cnVlOwotCQkJCQkJeXlfZG9fZW9mKCk7Ci0JCQkJCQl7Ci0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotCSAqIAotCSAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4gSXQgcHJpbnRzCi0JICogZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLCBvcgotCSAqIGFuIGVycm9yIG9jY3VyZWQuCi0JICogCi0JICogQHBhcmFtIGFyZ3YKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuIHRoZSBzY2FubmVyCi0JICogICAgICAgICAgICBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJQ1NTSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2Nhbm5lciA9IG5ldyBDU1NIZWFkVG9rZW5pemVyKG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiICsgYXJndltpXSArICJcIiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWRvIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDQ2YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCi0JU3RyaW5nIFJ1bGVFbmQgPSAiUnVsZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0hBUlNFVF9SVUxFID0gIkNIQVJTRVRfUlVMRSI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmI2ZTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCWNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIE51bGxNZW1lbnRvKCkgewotCQkJc3VwZXIoKTsKLQkJCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBDU1NIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQlwcml2YXRlIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gc3BlYyBkZWZpbmVkIGVuY29kaW5nIGZvciBDU1MsIHNvIE51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBzaG91bGQgbWF0Y2ggd2hhdCdzIGluIHBsdWdpbi54bWwgKG9yIGxvb2sgaXQgdXAgZnJvbSB0aGVyZSkuCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IGZhbHNlOwotCQlpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuaXplci4KLQkgKi8KLQlwcml2YXRlIENTU0hlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU0hlYWRUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrSW5Db250ZW50cygpOwotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQljaGVja0hldXJpc3RpY3MoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luQ29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDU1NIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCS8vIHNpZGUgZWZmZWN0IG9mIGNhbkhhbmRsZSBpcyB0byBjcmVhdGUgYXBwcm9wcmlhdGUgbWVtZW50bwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFKSB7Ci0JCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byh2YWx1ZVRva2VuLmdldFRleHQoKSwgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSGV1cmlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbm9IZXVyaXN0aWMgPSBmYWxzZTsKLQkJU3RyaW5nIGhldXJpc3RpY0VuY29kaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzNdOwotCQkJaW50IG5SZWFkID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZlJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCWludCBvbmVCeXRlID0gZlJlYWRlci5yZWFkKCk7Ci0JCQkJCW5SZWFkKys7Ci0JCQkJCWlmIChvbmVCeXRlIDw9IDB4RkYpIHsKLQkJCQkJCWJ5dGVzW2ldID0gKGJ5dGUpIG9uZUJ5dGU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlub0hldXJpc3RpYyA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vSGV1cmlzdGljID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFub0hldXJpc3RpYyAmJiBuUmVhZCA9PSAzKSB7Ci0JCQkJaGV1cmlzdGljRW5jb2RpbmcgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhieXRlcywgMyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGFueSBJTyBleGNlcHRpb24sIHRoZW4gbm90IGEgaGV1cmlzdGljIGNhc2UKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJfQotCQlpZiAoaGV1cmlzdGljRW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGhldXJpc3RpY0VuY29kaW5nLCBFbmNvZGluZ01lbWVudG8uR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMDY1NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckNTUyBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGdldERldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsCi0JCS8vIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIHRoZXJlJ3MgZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMKLQkJLy8gZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJLy8gZWxzZSBpZgotCQkvLyAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pKQotCQkvLyByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmNmU1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIAotICogVGhpcyBpcyBwb3J0ZWQgZnJvbSBQYWdlRGVzaWduZXIncyBocGJjb20vS2FuamkuY3BwJ3MKLSAqIEthbmppOjpndWVzc19rYW5qaV9jb2RlKCksCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ0d1ZXNzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSSA9IDA7IC8vIEFTQ0lJCi0JLy8gSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfSU4gPSA4OyAvLyBUaGlzIGlzIGFmdGVyIElTTzIwMjIncyBjaGFuZ2UKLQkvLyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0hBTEZLQU5BID0gNjsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4gRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19KUCA9IDM7IC8vIFRoaXMgaXMgRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzIwMjJfSlAgPSA0OyAvLyBUaGlzIGlzIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpJU19IQUxGS0FOQSA9IDc7IC8vIFRIaXMgaXMgSGFsZiBLYW5hIGluCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMxID0gMHg0MDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzIgPSAoYnl0ZSkgMHg4MDsKLQkvLyBBU0NJSQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklOID0gMHgwMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pPVVQgPSAweDAyOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVNDID0gMHgwNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJUyA9IDB4MDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQxID0gMHgxMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDIgPSAweDIwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga3R5cGVbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAwMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDEwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgLyogISIjJCUmJyAqLy8qICIgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAoKSorLC0uLyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDAxMjM0NTY3ICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogODk6OyA8PT4/ICovCi0JMHgyOSwgMHgyOCwgMHgyYiwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogQEFCQ0RFRkcgKi8KLQkweDJhLCAweDI4LCAweDJhLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBISUpLTE1OTyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFBRUlNUVVZXICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogWFlaW1xdXl8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBhYmNkZWZnICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogaGlqa2xtbm8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBwcXJzdHV2dyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MDAsIC8qIHh5ent8fX4gKi8KLQkweDIwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA4MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDkwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgyMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEEwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEIwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEMwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEQwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEUwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEYwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzAsIDB4MDAsfTsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPODg1OV8xID0gMTsgLy8gSVNPLTEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hJRlRfSklTID0gMjsgLy8gVGhpcyBpcyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0pJU19IQUxGS0FOQSA9IDU7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluCi0KLQkvKioKLQkgKiBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAtMTsgLy8gVW5rbm93bgotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIENvbnZlcnQgcHJpdmF0ZSBpbnQgdG8gSUFOQSBFbmNvZGluZyBuYW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGludCBjb2RlKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0KLQkJc3dpdGNoIChjb2RlKSB7Ci0JCQljYXNlIFNISUZUX0pJUyA6Ci0JCQljYXNlIFNKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIlNoaWZ0X0pJUyI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBFVUNfSlAgOgotCQkJY2FzZSBFVUNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIkVVQy1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJJU08tMjAyMi1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGd1ZXNzZWQgSmF2YSBFbmNvZGluZyBuYW1lIHRhcmdldDogYnl0ZXMgdG8gYmUgaW5zcGVjdGVkIGxlbmd0aDoKLQkgKiBsZW5ndGggb2YgdGFyZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NFbmNvZGluZyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBjb2RlID0gVU5LTk9XTjsKLQotCQkvLyBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgaXMgc3VwcG9ydGVkLgotCQlTdHJpbmcgc3lzdGVtX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGpwX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpOwotCQlpZiAoc3lzdGVtX2N0eXBlLmNvbXBhcmVUbyhqcF9jdHlwZSkgPT0gMCkgewotCQkJLy8gT2ssIEknbSB1bmRlciBqYV9KUC4KLQkJCWNvZGUgPSBBU0NJSTsKLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKChjb2RlID09IEFTQ0lJKSAmJiAobGVuZ3RoID4gMCkpIHsKLQkJCQlpbnQgY2gxID0gdGFyZ2V0W3Bvc107Ci0JCQkJY2gxID0gY2gxICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gyID0gKGxlbmd0aCA+PSAyKSA/IHRhcmdldFtwb3MgKyAxXSA6IDA7Ci0JCQkJY2gyID0gY2gyICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gzID0gKGxlbmd0aCA+PSAzKSA/IHRhcmdldFtwb3MgKyAyXSA6IDA7Ci0JCQkJY2gzID0gY2gzICYgMHgwMDAwMDBGRjsKLQkJCQljb2RlID0gZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShjaDEsIGNoMiwgY2gzLCAwKTsKLQkJCQlwb3MrKzsKLQkJCQlsZW5ndGgtLTsKLQkJCX0KLQkJCXN3aXRjaCAoY29kZSkgewotCQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCQljb2RlID0gSVNPMjAyMl9KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBFVUNfSlAgOgotCQkJCQljb2RlID0gRVVDX0pQOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29kZSA9IFNISUZUX0pJUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoY29kZSkpOwotCX0KLQotCS8qKgotCSAqIEd1ZXNzIHRoZSBlbmNvZGluZy4gaGFsZmthbmFfZmxhZyA9IDB4MDEgKCBkZXRlY3QgU0pJUyBoYWxmIGthbmEgKQotCSAqIGhhbGZrYW5hX2ZsYWcgPSAweDAyICggZGV0ZWN0IEVVQyBoYWxmIGthbmEgKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBndWVzc0phcGFuZXNlS2FuamlDb2RlKGludCBjaDEsIGludCBjaDIsIGludCBjaDMsIGludCBoYWxma2FuYV9mbGFnKSB7Ci0JCWJvb2xlYW4gc2ppc19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAxKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQkJYm9vbGVhbiBldWNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMikgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0KLQkJaWYgKGNoMSA9PSAwKQotCQkJcmV0dXJuIFVOS05PV047Ci0JCWlmIChzamlzX2hhbmtha3VfZmxhZyAmJiBjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChldWNfaGFua2FrdV9mbGFnICYmIGNoMSA9PSAweDhlICYmIGNoMiA+PSAweGExICYmIGNoMiA8PSAweGRmKQotCQkJcmV0dXJuIEVVQ19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfU0ZUMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfU0ZUMikgIT0gMCkpCi0JCQlyZXR1cm4gU0hJRlRfSklTOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9FVUMxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9FVUMyKSAhPSAwKSkKLQkJCXJldHVybiBFVUNfSlA7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmICgoa3R5cGVbY2gyXSAmIEtUX0pJTikgIT0gMCkpCi0JCQlyZXR1cm4gSVNPMjAyMl9KUDsKLQkJZWxzZSBpZiAoY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiBjaDMgPT0gMHg0OS8qICdJJyAqLykKLQkJCXJldHVybiBKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgKChrdHlwZVtjaDNdICYgS1RfSk9VVCkgIT0gMCkpCi0JCQlyZXR1cm4gQVNDSUlfSU47Ci0KLQkJcmV0dXJuIEFTQ0lJOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ0d1ZXNzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjE0MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgY2xhc3MgSGVhZFBhcnNlclRva2VuIHsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBIZWFkUGFyc2VyVG9rZW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEhlYWRQYXJzZXJUb2tlbihTdHJpbmcgdHlwZSwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0ID0gdGV4dDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoInRleHQ6ICIgKyBmVGV4dCArICIgb2Zmc2V0OiAiICsgZlN0YXJ0ICsgIiB0eXBlOiAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3MTM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBsaXN0Lmxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3RDU1NOb2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk0OWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3RDU1NOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTTm9kZUxpc3QgewotCi0JcHJvdGVjdGVkIFZlY3RvciBub2RlcyA9IG51bGw7Ci0KLQlJQ1NTTm9kZSBhcHBlbmROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJdGhpcy5ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5ub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiB0aGlzLm5vZGVzLnNpemUoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJQ1NTTm9kZSBpdGVtSW1wbChpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSUNTU05vZGUpIHRoaXMubm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQotCUlDU1NOb2RlIHJlbW92ZU5vZGUoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gbm9kZQotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJSUNTU05vZGUgcmVtb3ZlZCA9IChJQ1NTTm9kZSkgdGhpcy5ub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLm5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0F0dHJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0F0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWI0NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NBdHRySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NBdHRySW1wbCBleHRlbmRzIENTU1JlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NBdHRyIHsKLQotCXByaXZhdGUgU3RyaW5nIGZOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgb3duZXJDU1NOb2RlID0gbnVsbDsKLQotCUNTU0F0dHJJbXBsKENTU0F0dHJJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZk5hbWUgPSB0aGF0LmZOYW1lOwotCQl0aGlzLnNldFZhbHVlKHRoYXQuZlZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NBdHRyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTQXR0ckltcGwoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJcmV0dXJuIG5ldyBDU1NBdHRySW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEFUVFJfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0T3duZXJDU1NOb2RlKCkgewotCQlyZXR1cm4gb3duZXJDU1NOb2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gLyogKHRoaXMubmFtZSA9PSBudWxsKSAqL2ZhbHNlOwotCQlpZiAodGhpcy5mTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5mTmFtZS5lcXVhbHMobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5VmFsdWVDaGFuZ2VkKFN0cmluZyBvbGRWYWx1ZSkgewotCQlpZiAodGhpcy5vd25lckNTU05vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IG93bmVyQ1NTTm9kZS5nZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNTU01vZGVsSW1wbCBtb2RlbCA9IChDU1NNb2RlbEltcGwpIGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMsIG9sZFZhbHVlKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJdGhpcy5vd25lckNTU05vZGUubm90aWZ5KENIQU5HRSwgdGhpcywgb2xkVmFsdWUsIHZhbHVlLCB0aGlzLm93bmVyQ1NTTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdOYW1lKSB7Ci0JCWZOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckNTU05vZGUoQ1NTTm9kZUltcGwgbmV3T3duZXJDU1NOb2RlKSB7Ci0JCW93bmVyQ1NTTm9kZSA9IG5ld093bmVyQ1NTTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IGZWYWx1ZTsKLQkJZlZhbHVlID0gbmV3VmFsdWU7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKG9sZFZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzVkNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTQ2hhcnNldFJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTQ2hhcnNldFJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU0NoYXJzZXRSdWxlSW1wbChDU1NDaGFyc2V0UnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NDaGFyc2V0UnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0NoYXJzZXRSdWxlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoZSBlbmNvZGluZyBpbmZvcm1hdGlvbiB1c2VkIGluIHRoaXMgPGNvZGU+QGNoYXJzZXQ8L2NvZGU+IHJ1bGUuCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZyB2YWx1ZSBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZW5jb2RpbmcKLQkgKiAgICAgICAgICAgICAgICBydWxlIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRBdHRyaWJ1dGUoRU5DT0RJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ0hBUlNFVFJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBDSEFSU0VUX1JVTEU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHF1b3RlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQlTdHJpbmcgZW5jID0gQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZW5jb2RpbmcpOwotCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoZW5jLCBxdW90ZSk7Ci0JCXNldEF0dHJpYnV0ZShFTkNPRElORywgcXVvdGUgKyBlbmMgKyBxdW90ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzViN2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlmaW5hbCBjbGFzcyBGbG9hdEluZm8gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlGbG9hdEluZm8oU3RyaW5nIHRleHQpIHsKLQkJCXBhcnNlKHRleHQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJdm9pZCBwYXJzZShTdHJpbmcgdGV4dCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZlZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZklkZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBiTnVtID0gdHJ1ZTsKLQkJCWludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJCWlmIChiTnVtKSB7Ci0JCQkJCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JyB8fCBjID09ICcuJyB8fCBjID09ICcrJyB8fCBjID09ICctJykgewotCQkJCQkJYnVmVmFsdWUuYXBwZW5kKGMpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYnVmSWRlbnQuYXBwZW5kKGMpOwotCQkJCQkJYk51bSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlidWZJZGVudC5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHZhbHVlU3RyID0gYnVmVmFsdWUudG9TdHJpbmcoKTsKLQkJCWZWYWx1ZSA9IEZsb2F0LnZhbHVlT2YodmFsdWVTdHIpLmZsb2F0VmFsdWUoKTsKLQkJCWZJZGVudGlmaWVyID0gYnVmSWRlbnQudG9TdHJpbmcoKTsKLQkJCWZUeXBlID0gZ2V0RmxvYXRWYWx1ZVR5cGUodmFsdWVTdHIsIGZJZGVudGlmaWVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCWZsb2F0IGdldFZhbHVlKCkgewotCQkJcmV0dXJuIGZWYWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCVN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQkJcmV0dXJuIGZJZGVudGlmaWVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJc2hvcnQgZ2V0VmFsdWVUeXBlKCkgewotCQkJcmV0dXJuIGZUeXBlOwotCQl9Ci0KLQkJcHJpdmF0ZSBmbG9hdCBmVmFsdWUgPSAwLjBmOwotCQlwcml2YXRlIFN0cmluZyBmSWRlbnRpZmllciA9IG51bGw7Ci0JCXByaXZhdGUgc2hvcnQgZlR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVU5LTk9XTjsKLQl9Ci0KLQlmaW5hbCBzdGF0aWMgaW50IFNfTk9STUFMID0gMDsKLQlmaW5hbCBzdGF0aWMgaW50IFNfRlVOQ1RJT04gPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgU19GT05UX1NMQVNIID0gMjsKLQlmaW5hbCBzdGF0aWMgaW50IFNfQ09NTUFfU0VQQVJBVElPTiA9IDM7Ci0JcHJpdmF0ZSBJQ1NTRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlBhcmVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZUZW1wU3RydWN0dXJlZERvY3VtZW50ID0gZmFsc2U7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKElDU1NEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUF0dHJWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiYXR0ciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoMCk7Ci0JCXZhbHVlLnNldFZhbHVlKGdldFRleHQocmVnaW9uKSk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUNvdW50ZXJzVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImNvdW50ZXJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWludCBzaXplID0gdmFsdWVSZWdpb25zLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMiAmJiBzaXplICE9IDMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ291bnRlckltcGwgdmFsdWUgPSBnZXRDb3VudGVyKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KHJlZ2lvbik7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXZhbHVlLnNldElkZW50aWZpZXIodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLklERU5USUZJRVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQl2YWx1ZS5zZXRTZXBhcmF0b3IodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLlNFUEFSQVRPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCXZhbHVlLnNldExpc3RTdHlsZSh0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUNvdW50ZXJWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiY291bnRlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlR9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpbnQgc2l6ZSA9IHZhbHVlUmVnaW9ucy5zaXplKCk7Ci0JCWlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvdW50ZXJJbXBsIHZhbHVlID0gZ2V0Q291bnRlcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQl2YWx1ZS5zZXRJZGVudGlmaWVyKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJdmFsdWUuc2V0TGlzdFN0eWxlKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5MSVNUU1RZTEUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xJdGVtSW1wbCBjcmVhdGVEZWNsYXJhdGlvbkl0ZW0oSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5TmFtZShub2RlUmVnaW9ucyk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWl0ZW0gPSBnZXRDU1NTdHlsZURlY2xJdGVtKG5hbWUpOwotCQl9Ci0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUZsb2F0VmFsdWUoU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCUZsb2F0SW5mbyBpbmZvID0gbmV3IEZsb2F0SW5mbyh0ZXh0KTsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoaW5mby5nZXRWYWx1ZVR5cGUoKSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZS5zZXRWYWx1ZShpbmZvLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVGb3JtYXRWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiZm9ybWF0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJLy8gZm9ybWF0IGNhbiB0YWtlIHZhcmlhYmxlIGFyZ3MuCi0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRUZXh0KHJlZ2lvbikpKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVMb2NhbFZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJsb2NhbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoMCk7Ci0JCXZhbHVlLnNldFZhbHVlKENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGdldFRleHQocmVnaW9uKSkpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVQcmltaXRpdmVWYWx1ZShJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQlpZiAoaXNCbGFuayh0eXBlKSkgewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJdmFsdWUgPSBjcmVhdGVGbG9hdFZhbHVlKHRleHQsIHR5cGUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHRleHQsIHR5cGUpOwotCQl9Ci0KLQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUHJpbWl0aXZlVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UocmVnaW9ucyk7Ci0JCWlmIChyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGV4dC5lcXVhbHMoInJnYigiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVSZ2JWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJjb3VudGVyKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUNvdW50ZXJWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJjb3VudGVycygiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVDb3VudGVyc1ZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImF0dHIoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlQXR0clZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImZvcm1hdCgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVGb3JtYXRWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJsb2NhbCgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVMb2NhbFZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoInJlY3QoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlUmVjdFZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZShyZWdpb25zKTsKLQkJfQotCi0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9ucy5nZXQoMCksIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVJlY3RWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygicmVjdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsgLy8gSURFTlQ6Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYXV0bycKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gNCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlSZWN0SW1wbCB2YWx1ZSA9IGdldFJlY3QoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2hpbGRWYWx1ZSA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0VG9wKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRSaWdodCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0Qm90dG9tKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMyA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRMZWZ0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZFZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJc2V0U3RyaW5nVmFsdWUoY2hpbGRWYWx1ZSwgdGV4dCwgdHlwZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRGbG9hdFZhbHVlKGNoaWxkVmFsdWUsIHRleHQsIHR5cGUpOwotCQkJfQotCQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCWNoaWxkVmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVJnYlZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJyZ2IiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gMykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlSR0JDb2xvckltcGwgdmFsdWUgPSBnZXRSR0JDb2xvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjaGlsZFZhbHVlID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRSZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldEdyZWVuKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRCbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZFZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXNldEZsb2F0VmFsdWUoY2hpbGRWYWx1ZSwgZ2V0VGV4dChyZWdpb24pLCByZWdpb24uZ2V0VHlwZSgpKTsKLQkJCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQljaGlsZFZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVTdHJpbmdWYWx1ZShTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlID0gZ2V0U3RyaW5nVmFsdWVUeXBlKHRleHQsIHR5cGUpOwotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZSh2YWx1ZVR5cGUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKHZhbHVlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJKSB7Ci0JCQkJdGV4dCA9IENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKHRleHQpOwotCQkJfQotCQkJZWxzZSBpZiAodmFsdWVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkcpIHsKLQkJCQl0ZXh0ID0gQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHModGV4dCk7Ci0JCQl9Ci0JCQl2YWx1ZS5zZXRWYWx1ZSh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlU3RyaW5nVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIHR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVTdHJpbmdWYWx1ZShtYWtlU3RyaW5nKHJlZ2lvbnMpLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENvdW50ZXJJbXBsIGdldENvdW50ZXIoKSB7Ci0JCUNvdW50ZXJJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDb3VudGVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENvdW50ZXJJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHR5cGUpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NQcmltaXRpdmVWYWx1ZSh0eXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xJdGVtSW1wbCBnZXRDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1N0eWxlRGVjbEl0ZW0ocHJvcGVydHlOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHNob3J0IGdldEZsb2F0VmFsdWVUeXBlKFN0cmluZyBpZGVudCkgewotCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCXNob3J0IHZhbHVlVHlwZTsKLQkJaWYgKGlkZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVI7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0U7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJweCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJjbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJkZWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInJhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZ3JhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJraHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTjsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBzaG9ydCBnZXRGbG9hdFZhbHVlVHlwZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpZGVudCkgewotCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCXNob3J0IHZhbHVlVHlwZTsKLQkJaWYgKGlkZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCWlmICgwIDw9IHZhbHVlLmluZGV4T2YoJy4nKSkgewotCQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0U7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJweCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJjbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJkZWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInJhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZ3JhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJraHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTjsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEZ1bmN0aW9uTmFtZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpIDwgMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJaWYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoZmlyc3RSZWdpb24pOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGhhcyBubyB2YWxpZGF0aW9uIGNoZWNrLCB0aGVuIHJlZ2lvbnMgbXVzdCBiZSBwYXNzZWQKLQkgKiBnZXRGdW5jdGlvbk5hbWUoKS4uLgotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucywgU3RyaW5nW10gYWNjZXB0cykgewotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQkJaW50IG5BY2NlcHRzID0gKGFjY2VwdHMgIT0gbnVsbCkgPyBhY2NlcHRzLmxlbmd0aCA6IDA7Ci0JCUl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCWkubmV4dCgpOyAvLyBza2lwIEZVTkNUSU9OCi0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzQmxhbmsodHlwZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChuQWNjZXB0cyA9PSAwKSB7Ci0JCQkJbmV3UmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGlBY2NlcHQgPSAwOyBpQWNjZXB0IDwgbkFjY2VwdHM7IGlBY2NlcHQrKykgewotCQkJCQlpZiAodHlwZSA9PSBhY2NlcHRzW2lBY2NlcHRdKSB7Ci0JCQkJCQluZXdSZWdpb25zLmFkZChyZWdpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkvLyBWZWN0b3Igbm9kZVJlZ2lvbnMgPSBuZXcgVmVjdG9yKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JLy8gcmV0dXJuIGdldFByb3BlcnR5TmFtZShub2RlUmVnaW9ucyk7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJSVRleHRSZWdpb25MaXN0IG5hbWVSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXdoaWxlICghbm9kZVJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlUmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShuYW1lUmVnaW9ucyk7Ci0JCQkJbmFtZSA9IG1ha2VTdHJpbmcobmFtZVJlZ2lvbnMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmFtZVJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSZWN0SW1wbCBnZXRSZWN0KCkgewotCQlSZWN0SW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0UmVjdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChSZWN0SW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFJHQkNvbG9ySW1wbCBnZXRSR0JDb2xvcigpIHsKLQkJUkdCQ29sb3JJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRSR0JDb2xvcigpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChSR0JDb2xvckltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc2hvcnQgZ2V0U3RyaW5nVmFsdWVUeXBlKFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJpbmhlcml0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTkhFUklUX1BSSU1JVElWRTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0ZXh0LmVxdWFscygiLCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUE7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdGV4dC5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UpIHsKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UOwotCQl9Ci0JCXJldHVybiB2YWx1ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVN0cmluZyhJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIGJTcGFjZSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICghYlNwYWNlICYmIGlzQmxhbmsodHlwZSkpIHsKLQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQliU3BhY2UgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChnZXRUZXh0KHJlZ2lvbikpOwotCQkJCWJTcGFjZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50VGVtcG9yYXJ5KGJvb2xlYW4gYlRlbXApIHsKLQkJZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBiVGVtcDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmxvYXRWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUsIFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlGbG9hdEluZm8gaW5mbyA9IG5ldyBGbG9hdEluZm8odGV4dCk7Ci0JCXZhbHVlLnNldEZsb2F0VmFsdWUoaW5mby5nZXRWYWx1ZVR5cGUoKSwgaW5mby5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U3RyaW5nVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlID0gZ2V0U3RyaW5nVmFsdWVUeXBlKHRleHQsIHR5cGUpOwotCQl2YWx1ZS5zZXRTdHJpbmdWYWx1ZSh2YWx1ZVR5cGUsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpdGVtCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBwYXJhbSBub2RlUmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEltcG9ydGFudEF0dHJpYnV0ZShJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtLCBJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJaWYgKGl0ZW0gPT0gbnVsbCB8fCBub2RlUmVnaW9ucyA9PSBudWxsIHx8IG5vZGVSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGVSZWdpb25zLmdldChub2RlUmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCkgewotCQkJaXRlbS5zZXRQcmlvcml0eShnZXRUZXh0KHJlZ2lvbikpOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9ICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGl0ZW0pLmdldEF0dHJpYnV0ZU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKTsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJbm9kZVJlZ2lvbnMucmVtb3ZlKHJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZUNvbnRleHQoQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHVwZGF0ZUNvbnRleHQpIHsKLQkJZlVwZGF0ZUNvbnRleHQgPSB1cGRhdGVDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb2xvblNlcGFyYXRvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbCBzZXR1cERlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWhhc0NvbG9uU2VwYXJhdG9yKGZsYXROb2RlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmUGFyZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0KLQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOyAvLyBtYWtlCi0JCS8vIGNvcHkKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgbmV3SXRlbSA9IGNyZWF0ZURlY2xhcmF0aW9uSXRlbShub2RlUmVnaW9ucyk7Ci0JCWlmIChuZXdJdGVtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJbmV3SXRlbS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgZmxhdE5vZGUpOwotCQl9Ci0KLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uobm9kZVJlZ2lvbnMpOwotCQlzZXR1cEltcG9ydGFudEF0dHJpYnV0ZShuZXdJdGVtLCBub2RlUmVnaW9ucyk7Ci0JCS8vIE5vdywgbm9kZVJlZ2lvbnMganVzdCBoYXMgcmVnaW9ucyBmb3IgdmFsdWUuCi0JCXNldHVwVmFsdWVzKG5ld0l0ZW0sIG5vZGVSZWdpb25zKTsKLQkJcmV0dXJuIG5ld0l0ZW07Ci0JfQotCi0Jdm9pZCBzZXR1cFZhbHVlcyhJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWZQYXJlbnRSZWdpb24gPSBwYXJlbnRSZWdpb247Ci0JCXNldHVwVmFsdWVzKGl0ZW0sIG5vZGVSZWdpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBub2RlUmVnaW9ucyBtdXN0IGJlIGJyb2tlbi4gSWYgeW91IG5lZWQgYWZ0ZXIsIG1ha2UgY29weSBvZiB0aGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cFZhbHVlcyhJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtLCBJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uQnVmID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBpdGVtLmdldFByb3BlcnR5TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0JCWJvb2xlYW4gYkZvbnQgPSAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpKTsKLQkJLy8gKHNob3J0LWhhbmQpIGZvbnQKLQkJaW50IHN0YXR1cyA9IChwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpKSA/IFNfQ09NTUFfU0VQQVJBVElPTiA6IFNfTk9STUFMOwotCQl3aGlsZSAoIW5vZGVSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJdmFsdWUgPSBudWxsOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZVJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSIHx8IHR5cGUKLQkJCS8vID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCS8vIGJyZWFrOwotCQkJLy8gfQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCQljYXNlIFNfTk9STUFMIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCQlzdGF0dXMgPSBTX0ZVTkNUSU9OOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGJGb250ICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIGZQYXJlbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJCXN0YXR1cyA9IFNfRk9OVF9TTEFTSDsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19GVU5DVElPTiA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb25CdWYpOwotCQkJCQkJcmVnaW9uQnVmLmNsZWFyKCk7Ci0JCQkJCQlzdGF0dXMgPSBTX05PUk1BTDsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19GT05UX1NMQVNIIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTikgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQkJc3RhdHVzID0gU19DT01NQV9TRVBBUkFUSU9OOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTX0NPTU1BX1NFUEFSQVRJT04gOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgZlBhcmVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKCIsIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb25CdWYpOwotCQkJCQkJcmVnaW9uQnVmLmNsZWFyKCk7Ci0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCWlmIChmVXBkYXRlQ29udGV4dCA9PSBudWxsIHx8ICFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWlmIChmVXBkYXRlQ29udGV4dCA9PSBudWxsIHx8ICFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIXJlZ2lvbkJ1Zi5pc0VtcHR5KCkpIHsKLQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCWlmIChmVXBkYXRlQ29udGV4dCA9PSBudWxsIHx8ICFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQkJaXRlbS5hcHBlbmRWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKGZQYXJlbnRSZWdpb24gIT0gbnVsbCkgPyBmUGFyZW50UmVnaW9uLmdldFRleHQocmVnaW9uKSA6ICIiOyAvLyROT04tTkxTLTEkIAotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCbGFuayhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhNjg4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NEb2N1bWVudEltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTRG9jdW1lbnQgewotCi0JcHJpdmF0ZSBDU1NNb2RlbEltcGwgZk1vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0RvY3VtZW50SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0RvY3VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCUNTU0RvY3VtZW50SW1wbChDU1NEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlJQ1NTTm9kZSBjcmVhdGVDU1NBdHRyKFN0cmluZyBuYW1lKSB7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBuZXcgQ1NTQXR0ckltcGwobmFtZSk7Ci0JCWF0dHIuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCXB1YmxpYyBDU1NGb250RmFjZVJ1bGUgY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlCi0JICovCi0JcHVibGljIElDU1NJbXBvcnRSdWxlIGNyZWF0ZUNTU0ltcG9ydFJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLklDU1NNZWRpYVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU01lZGlhUnVsZSBjcmVhdGVDU1NNZWRpYVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlCi0JICovCi0JcHVibGljIElDU1NQYWdlUnVsZSBjcmVhdGVDU1NQYWdlUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIGNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpCi0JCQl2YWx1ZSA9IG5ldyBDb3VudGVySW1wbCgpOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUKQotCQkJdmFsdWUgPSBuZXcgUmVjdEltcGwoKTsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpCi0JCQl2YWx1ZSA9IG5ldyBSR0JDb2xvckltcGwoKTsKLQkJZWxzZQotCQkJdmFsdWUgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHByaW1pdGl2ZVR5cGUpOwotCQl2YWx1ZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKFN0cmluZyBydWxlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIGNyZWF0ZUNTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gbmV3IENTU1N0eWxlRGVjbEl0ZW1JbXBsKHByb3BlcnR5TmFtZSk7Ci0JCWl0ZW0uc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlUnVsZSBjcmVhdGVDU1NTdHlsZVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlCi0JICovCi0JcHVibGljIENTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgY3JlYXRlTWVkaWFMaXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gZk1vZGVsOwotCX0KLQotCXZvaWQgc2V0TW9kZWwoQ1NTTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXRoaXMuZk1vZGVsID0gbW9kZWw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NGb250RmFjZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2RjMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NGb250RmFjZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NGb250RmFjZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBDU1NGb250RmFjZVJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NGb250RmFjZVJ1bGVJbXBsKENTU0ZvbnRGYWNlUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NGb250RmFjZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJcmV0dXJuICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEZPTlRGQUNFUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEZPTlRfRkFDRV9SVUxFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ltcG9ydFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ltcG9ydFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxN2RjYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NJbXBvcnRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlVSTE1vZGVsUHJvdmlkZXJDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTSW1wb3J0UnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIElDU1NJbXBvcnRSdWxlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmRGlydHkgPSB0cnVlOwotCXByaXZhdGUgSUNTU1N0eWxlU2hlZXQgZlN0eWxlU2hlZXQ7Ci0KLQkvKioKLSAgICAgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICAgICAqLwotCXB1YmxpYyBDU1NJbXBvcnRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTSW1wb3J0UnVsZUltcGwoQ1NTSW1wb3J0UnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTSW1wb3J0UnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2xvc2VTdHlsZVNoZWV0KCkgewotCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkgewotCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSBmU3R5bGVTaGVldDsKLQkJCWZTdHlsZVNoZWV0ID0gbnVsbDsgLy8gdG8gcHJldmVudCBsb29wLCB3ZSBtdXN0IHJlc2V0IGZTdHlsZVNoZWV0Ci0JCQkJCQkJCS8vIGJlZm9yZSBhbGwgY2xvc2luZyBhY3Rpb24KLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkvLyBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZSBTVFlMRSB0YWcKLQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIH0KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQoc2hlZXQuZ2V0TW9kZWwoKSk7Ci0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHN0eWxlIHNoZWV0IHRvIGJlIGltcG9ydGVkLiBUaGUgYXR0cmlidXRlIHdpbGwgbm90Ci0JICogY29udGFpbiB0aGUgPGNvZGU+InVybCguLi4pIjwvY29kZT4gc3BlY2lmaWVyIGFyb3VuZCB0aGUgVVJJLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKGdldEF0dHJpYnV0ZShIUkVGKSk7Ci0JfQotCi0JLyoqCi0JICogQSBsaXN0IG9mIG1lZGlhIHR5cGVzIGZvciB3aGljaCB0aGlzIHN0eWxlIHNoZWV0IG1heSBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QgZ2V0TWVkaWEoKSB7Ci0JCUlDU1NOb2RlIG1lZGlhID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAobWVkaWEgIT0gbnVsbCkgewotCQkJaWYgKG1lZGlhIGluc3RhbmNlb2YgTWVkaWFMaXN0KSB7Ci0JCQkJcmV0dXJuIChNZWRpYUxpc3QpIG1lZGlhOwotCQkJfQotCQl9Ci0KLQkJLy8gVEhJUyBDQVNFIElTIEVSUk9SIENBU0UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIElNUE9SVFJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3R5bGUgc2hlZXQgcmVmZXJyZWQgdG8gYnkgdGhpcyBydWxlLCBpZiBpdCBoYXMgYmVlbiBsb2FkZWQuIFRoZQotCSAqIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdHlsZSBzaGVldCBoYXMKLQkgKiBub3QgeWV0IGJlZW4gbG9hZGVkIG9yIGlmIGl0IHdpbGwgbm90IGJlIGxvYWRlZCAoZS5nLiBpZiB0aGUgc3R5bGUKLQkgKiBzaGVldCBpcyBmb3IgYSBtZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVzZXIgYWdlbnQpLgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZVNoZWV0IGdldFN0eWxlU2hlZXQoKSB7Ci0KLQkJaWYgKGZEaXJ0eSkgewotCQkJLy8gTk9URTogdHJ5L2NhdGNoIGJsb2NrIGlzIGEgVEVNUCBmaXggdG8gYXZvaWQgY29tcGlsZSBlcnJvcnM6Ci0JCQl0cnkgewotCQkJCWNsb3NlU3R5bGVTaGVldCgpOwotCi0JCQkJaWYgKGdldEhyZWYoKSA9PSBudWxsIHx8IGdldEhyZWYoKS5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWZEaXJ0eSA9IGZhbHNlOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgeyAvLyBjYXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBTVFlMRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGFnCi0JCQkJCWJhc2VNb2RlbCA9ICgoSURPTU5vZGUpIGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldE93bmVyRE9NTm9kZSgpKS5nZXRNb2RlbCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkJLy8gYWRhcHRlciA9IChNb2RlbFByb3ZpZGVBZGFwdGVyKQotCQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBsb2FkIG1vZGVsIGZyb20gSU1vZGVsTWFuYWdlcgotCQkJCVVSTE1vZGVsUHJvdmlkZXJDU1MgcHJvdmlkZXIgPSBuZXcgVVJMTW9kZWxQcm92aWRlckNTUygpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBwcm92aWRlci5nZXRNb2RlbEZvclJlYWQoYmFzZU1vZGVsLCBnZXRIcmVmKCkpOwotCQkJCWZEaXJ0eSA9IGZhbHNlOwotCi0JCQkJaWYgKG5ld01vZGVsID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmICghKG5ld01vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSkgewotCQkJCQluZXdNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUHJvdmlkZWQobmV3TW9kZWwpOwotCi0JCQkJZlN0eWxlU2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpICgoSUNTU01vZGVsKSBuZXdNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkKLQkJCQkJZlN0eWxlU2hlZXQuZ2V0TW9kZWwoKS5hZGRTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmU3R5bGVTaGVldDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJTVBPUlRfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoU3R5bGVTaGVldCgpIHsKLQkJaWYgKCFmRGlydHkpIHsKLQkJCWNsb3NlU3R5bGVTaGVldCgpOwotCQkJZkRpcnR5ID0gdHJ1ZTsKLQkJCW5vdGlmeShJTm9kZU5vdGlmaWVyLkNIQU5HRSwgZ2V0QXR0cmlidXRlTm9kZShIUkVGKSwgbnVsbCwgbnVsbCwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2VSdWxlKCkgewotCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkgewotCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSBmU3R5bGVTaGVldDsKLQkJCWZTdHlsZVNoZWV0ID0gbnVsbDsgLy8gdG8gcHJldmVudCBsb29wLCB3ZSBtdXN0IHJlc2V0IGZTdHlsZVNoZWV0Ci0JCQkJCQkJCS8vIGJlZm9yZSBhbGwgY2xvc2luZyBhY3Rpb24KLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkvLyBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZSBTVFlMRSB0YWcKLQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIH0KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFJlbGVhc2VkKHNoZWV0LmdldE1vZGVsKCkpOwotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZkRpcnR5ID0gdHJ1ZTsKLQkJc2V0QXR0cmlidXRlKEhSRUYsIENTU0xpbmtDb252ZXJ0ZXIuYWRkRnVuYyhocmVmKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmM4MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01lZGlhUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIElDU1NNZWRpYVJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NNZWRpYVJ1bGVJbXBsKENTU01lZGlhUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBhcHBlbmRSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NNZWRpYVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRlbGV0ZSBhIHJ1bGUgZnJvbSB0aGUgbWVkaWEgYmxvY2suCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUKLQkgKiAgICAgICAgICAgIHJ1bGUgdG8gcmVtb3ZlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGRvZXMgbm90Ci0JICogICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBhIHJ1bGUgaW4gdGhlIG1lZGlhIHJ1bGUgbGlzdC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgcnVsZQotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJ1bGUoaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldEluZGV4ZWRSdWxlKGluZGV4KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBhbGwgQ1NTIHJ1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrLgotCSAqLwotCXB1YmxpYyBDU1NSdWxlTGlzdCBnZXRDc3NSdWxlcygpIHsKLQkJQ1NTUnVsZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkKLQkJCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlDU1NSdWxlSW1wbCBnZXRJbmRleGVkUnVsZShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBpID0gMDsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCWlmIChpKysgPT0gaW5kZXgpCi0JCQkJCXJldHVybiAoQ1NTUnVsZUltcGwpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQSBsaXN0IG9mIG1lZGlhIHR5cGVzIGZvciB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIE1lZGlhTGlzdCBnZXRNZWRpYSgpIHsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkKLQkJCQlyZXR1cm4gKE1lZGlhTGlzdCkgbm9kZTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBNRURJQVJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBNRURJQV9SVUxFOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gaW5zZXJ0IGEgbmV3IHJ1bGUgaW50byB0aGUgbWVkaWEgYmxvY2suCi0JICogCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIFRoZSBwYXJzYWJsZSB0ZXh0IHJlcHJlc2VudGluZyB0aGUgcnVsZS4gRm9yIHJ1bGUgc2V0cyB0aGlzCi0JICogICAgICAgICAgICBjb250YWlucyBib3RoIHRoZSBzZWxlY3RvciBhbmQgdGhlIHN0eWxlIGRlY2xhcmF0aW9uLiBGb3IKLQkgKiAgICAgICAgICAgIGF0LXJ1bGVzLCB0aGlzIHNwZWNpZmllcyBib3RoIHRoZSBhdC1pZGVudGlmaWVyIGFuZCB0aGUgcnVsZQotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZQotCSAqICAgICAgICAgICAgcnVsZSBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBzcGVjaWZpZWQgcnVsZS4gSWYgdGhlCi0JICogICAgICAgICAgICBzcGVjaWZpZWQgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgbWVkaWEgYmxvY2tzJ3MKLQkgKiAgICAgICAgICAgIHJ1bGUgY29sbGVjdGlvbiwgdGhlIHJ1bGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgbWVkaWEgYmxvY2suCi0JICogQHJldHVybiBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUgbmV3bHkKLQkgKiAgICAgICAgIGluc2VydGVkIHJ1bGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgcnVsZSBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgICAgICBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBlLmcuLCBpZiBhbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkBpbXBvcnQ8L2NvZGU+IHJ1bGUgaXMgaW5zZXJ0ZWQgYWZ0ZXIgYSBzdGFuZGFyZCBydWxlIHNldCBvciBvdGhlcgotCSAqICAgICAgICAgYXQtcnVsZS4gPGJyPgotCSAqICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzIG5vdCBhIHZhbGlkCi0JICogICAgICAgICBpbnNlcnRpb24gcG9pbnQuIDxicj4KLQkgKiAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgcnVsZSBpcwotCSAqICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJ1bGUgaGFzIGEgc3ludGF4IGVycm9yIGFuZAotCSAqICAgICAgICAgaXMgdW5wYXJzYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydFJ1bGUoU3RyaW5nIHJ1bGUsIGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBnZXRDc3NSdWxlcygpLmdldExlbmd0aCgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGxlbmd0aCA8IGluZGV4KQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJQ1NTUnVsZUltcGwgcmVmUnVsZSA9IChsZW5ndGggIT0gaW5kZXgpID8gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpIDogbnVsbDsKLQotCQlDU1NSdWxlSW1wbCBuZXdSdWxlID0gKENTU1J1bGVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUnVsZShydWxlKTsKLQotCQkvLyBwcmV2ZW50IGZyb20gbmVzdGluZyBAbWVkaWEgcnVsZQotCQlpZiAobmV3UnVsZS5nZXRUeXBlKCkgPT0gQ1NTUnVsZS5NRURJQV9SVUxFKQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uU1lOVEFYX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQlpbnNlcnRCZWZvcmUobmV3UnVsZSwgcmVmUnVsZSk7Ci0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3UnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcmVmUnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgaW5zZXJ0UnVsZUJlZm9yZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZWZSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiByZWZSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSBpbnNlcnRCZWZvcmUoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIHJlZlJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlbW92ZVJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIHJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVwbGFjZVJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgb2xkUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgb2xkUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVwbGFjZUNoaWxkKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSBvbGRSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbENyZWF0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbENyZWF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTZkZDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCB7Ci0KLQlwcml2YXRlIENTU05vZGVJbXBsIGZSb290Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmVGFyZ2V0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmTmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGZSZXBhcnNlU3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmUmVwYXJzZUVuZCA9IC0xOwotCi0JLyoqCi0JICogQ1NTTW9kZWxDb250ZXh0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQoQ1NTTm9kZUltcGwgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQlmUm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsZWFyKCkgewotCQlmTmV4dE5vZGUgPSBudWxsOwotCQlmVGFyZ2V0Tm9kZSA9IG51bGw7Ci0JCXJlc2V0UmVwYXJzZVJhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgZ2V0TmV4dE5vZGUoKSB7Ci0JCXJldHVybiBmTmV4dE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlcGFyc2VFbmQoKSB7Ci0JCXJldHVybiBmUmVwYXJzZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVwYXJzZVN0YXJ0KCkgewotCQlyZXR1cm4gZlJlcGFyc2VTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NOb2RlSW1wbCBnZXRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIGZSb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NOb2RlSW1wbCBnZXRUYXJnZXROb2RlKCkgewotCQlyZXR1cm4gZlRhcmdldE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc1RvUmVwYXJzZSgpIHsKLQkJcmV0dXJuICgwIDw9IGdldFJlcGFyc2VTdGFydCgpICYmIDAgPD0gZ2V0UmVwYXJzZUVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlc2V0UmVwYXJzZVJhbmdlKCkgewotCQlmUmVwYXJzZVN0YXJ0ID0gZlJlcGFyc2VFbmQgPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldExhc3QoKSB7Ci0JCWZOZXh0Tm9kZSA9IG51bGw7Ci0KLQkJaWYgKCEoZlJvb3ROb2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJZlRhcmdldE5vZGUgPSBmUm9vdE5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlJvb3ROb2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gZlJvb3ROb2RlOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCUlDU1NOb2RlIGxhc3RDaGlsZCA9IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJaWYgKGxhc3RDaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbGFzdENoaWxkKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlub2RlID0gKENTU05vZGVJbXBsKSBsYXN0Q2hpbGQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldE5leHROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJZk5leHROb2RlID0gKENTU05vZGVJbXBsKSBub2RlOwotCQlpZiAoZk5leHROb2RlICE9IG51bGwpIHsKLQkJCWZUYXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBmTmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRSZXBhcnNlRW5kKGludCBlbmQpIHsKLQkJZlJlcGFyc2VFbmQgPSBlbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRSZXBhcnNlU3RhcnQoaW50IHN0YXJ0KSB7Ci0JCWZSZXBhcnNlU3RhcnQgPSBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFRhcmdldE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlmVGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZTsKLQkJaWYgKGZOZXh0Tm9kZSAhPSBudWxsICYmIGZOZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gZlRhcmdldE5vZGUpIHsKLQkJCWZOZXh0Tm9kZSA9IG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbERlbGV0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbERlbGV0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU4ZTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsRGVsZXRpb25Db250ZXh0IHsKLQotCXByaXZhdGUgaW50IGZPbGRTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZPbGRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGZOZXdTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZOZXdMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGZMZW5ndGhEaWZmZXJlbmNlID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gbnVsbDsKLQkvLyBwcml2YXRlIElDU1NOb2RlIGZSb290Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlbW92ZWRSYW5nZUJlZ2luID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlJlbW92ZWRSYW5nZUVuZCA9IC0xOwotCXByaXZhdGUgQ1NTTm9kZUxpc3RJbXBsIGZOb2Rlc1RvQmVSZW1vdmVkID0gbmV3IENTU05vZGVMaXN0SW1wbCgpOwotCi0JLyoqCi0JICogQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbERlbGV0aW9uQ29udGV4dChJQ1NTTm9kZSByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCS8vIGZSb290Tm9kZSA9IHJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gYWRkTm9kZVRvQmVSZW1vdmVkKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG5Ob2RlcyA9IGZOb2Rlc1RvQmVSZW1vdmVkLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Ob2RlczsgaSsrKSB7Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSBmTm9kZXNUb0JlUmVtb3ZlZC5pdGVtKGkpOwotCQkJaWYgKENTU01vZGVsVXRpbC5pc1BhcmVudE9mKHBhcmVudCwgbm9kZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZk5vZGVzVG9CZVJlbW92ZWQuYXBwZW5kTm9kZShub2RlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBleHBhbmRSZW1vdmVkUmFuZ2VCZWdpbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IG5ld0JlZ2luID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsgLy8gZk9sZFN0YXJ0ID09IGZOZXdTdGFydCwgcmlnaHQ/PwotCQlpZiAoZlJlbW92ZWRSYW5nZUJlZ2luIDwgMCB8fCBuZXdCZWdpbiA8IGZSZW1vdmVkUmFuZ2VCZWdpbikgewotCQkJZlJlbW92ZWRSYW5nZUJlZ2luID0gbmV3QmVnaW47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGV4cGFuZFJlbW92ZWRSYW5nZUVuZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IG5ld0VuZCA9IGZsYXROb2RlLmdldEVuZCgpICsgKChpc09sZE5vZGUoZmxhdE5vZGUpKSA/IGZMZW5ndGhEaWZmZXJlbmNlIDogMCk7Ci0JCWlmIChmUmVtb3ZlZFJhbmdlRW5kIDwgMCB8fCBmUmVtb3ZlZFJhbmdlRW5kIDwgbmV3RW5kKSB7Ci0JCQlmUmVtb3ZlZFJhbmdlRW5kID0gbmV3RW5kOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZmluZENvbnRhaW5lcihDU1NOb2RlSW1wbCBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJLy8gQW0gaSBhIGNvbnRhaW5lciBvZiBmbGF0Tm9kZT8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnQgZmlyc3RTdGFydCA9IGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSk7Ci0JCQlpbnQgbGFzdFN0YXJ0ID0gZ2V0T3JpZ2luYWxPZmZzZXQobGFzdE5vZGUpOwotCQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQotCQkJaWYgKGZpcnN0U3RhcnQgPD0gc3RhcnQgJiYgc3RhcnQgPD0gbGFzdFN0YXJ0KSB7Ci0JCQkJLy8gSSBhbSBhIGNvbnRhaW5lciwgaXMgbXkgY2hpbGQgYSBjb250YWluZXIgPwotCQkJCWZvciAoSUNTU05vZGUgbm9kZSA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQkJCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gZmluZENvbnRhaW5lcigoQ1NTTm9kZUltcGwpIG5vZGUsIGZsYXROb2RlKTsKLQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBmaW5kRGVsZXRpb25UYXJnZXQoQ1NTTm9kZUltcGwgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQgPSBmaW5kQ29udGFpbmVyKHBhcmVudCwgZmxhdE5vZGUpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludChmbGF0Tm9kZS50b1N0cmluZygpICsgIjogIik7Ci0KLQkJLy8gY2hpbGQgYSg9PT09PSliKD09PT09KWMKLQkJLy8gcGFyZW50ICg9PT09PT09PT09PT09PT09KSBhLGMgY2FuIHJlbW92ZSBwYXJlbnQsIGJ1dCBiIGNhbm5vdC4KLQotCQlJQ1NTTm9kZSBjaGlsZDsKLQotCQlmb3IgKGNoaWxkID0gdGFyZ2V0LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKTsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkvLyBqdXN0IGFkdmFuY2luZwotCQl9Ci0KLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGFyZ2V0IGhhcyBubyBjaGlsZHJlbi4iKTsgLy8gVEVTVEJZQ09aWQotCQkJcmV0dXJuIHRhcmdldDsgLy8gaGFzIG5vIGNoaWxkIGNvbnRhaW5lcnMuCi0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRTdGFydCgpIDwgZ2V0T3JpZ2luYWxPZmZzZXQoZmlyc3ROb2RlKSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmxhdE5vZGUgaXMgaW4gZnJvbnQgb2YgZmlyc3QgY2hpbGQiKTsKLQkJCQkvLyAvLyBURVNUQllDT1pZCi0JCQkJcmV0dXJuIHRhcmdldDsgLy8gYQotCQkJfQotCQl9Ci0KLQkJZm9yIChjaGlsZCA9IHRhcmdldC5nZXRMYXN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKTsgY2hpbGQgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSkgewotCQkJLy8ganVzdCBhZHZhbmNpbmcKLQkJfQotCi0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldCBoYXMgbm8gY2hpbGRyZW4uIik7IC8vIFRFU1RCWUNPWlkKLQkJCXJldHVybiB0YXJnZXQ7IC8vIGhhcyBubyBjaGlsZCBjb250YWluZXJzLgotCQl9Ci0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZ2V0T3JpZ2luYWxPZmZzZXQoZmlyc3ROb2RlKSA8IGZsYXROb2RlLmdldFN0YXJ0KCkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZsYXROb2RlIGlzIGluIGFmdGVyIG9mIGxhc3QgY2hpbGQiKTsKLQkJCQkvLyAvLyBURVNUQllDT1pZCi0JCQkJcmV0dXJuIHRhcmdldDsgLy8gYwotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmbGF0Tm9kZSBpbm5lciBvZiBjaGlsZHJlbiIpOyAvLyBURVNUQllDT1pZCi0JCXJldHVybiBudWxsOyAvLyBiCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0Tm9kZXNUb0JlUmVtb3ZlZCgpIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IG5Ob2RlcyA9IGZOb2Rlc1RvQmVSZW1vdmVkLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Ob2RlczsgaSsrKSB7Ci0JCQlub2Rlcy5hZGQoZk5vZGVzVG9CZVJlbW92ZWQuaXRlbShpKSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0T3JpZ2luYWxPZmZzZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQlpZiAoMCA8PSBmTGVuZ3RoRGlmZmVyZW5jZSkgewotCQkJCWlmIChmTmV3U3RhcnQgKyBmTmV3TGVuZ3RoIDwgb2Zmc2V0KSB7Ci0JCQkJCW9mZnNldCAtPSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZk9sZFN0YXJ0ICsgZk9sZExlbmd0aCA8PSBvZmZzZXQgfHwgKGZOZXdTdGFydCA8IDAgJiYgZk9sZFN0YXJ0IDw9IG9mZnNldCAmJiAhaXNPbGROb2RlKGZsYXROb2RlKSkgfHwgKDAgPD0gZk5ld1N0YXJ0ICYmIGZOZXdTdGFydCArIGZOZXdMZW5ndGggPD0gb2Zmc2V0ICYmICFpc09sZE5vZGUoZmxhdE5vZGUpKSkgewotCQkJCQlvZmZzZXQgLT0gZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVtb3ZlZFJhbmdlQmVnaW4oKSB7Ci0JCXJldHVybiBmUmVtb3ZlZFJhbmdlQmVnaW47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlbW92ZWRSYW5nZUVuZCgpIHsKLQkJcmV0dXJuIGZSZW1vdmVkUmFuZ2VFbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzT2xkTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCWlmIChlLm5leHRFbGVtZW50KCkgPT0gZmxhdE5vZGUpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0dXBDb250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWZPbGRMZW5ndGggPSBDU1NVdGlsLmdldFRleHRMZW5ndGgob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgJiYgKGZsYXROb2RlID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKSAhPSBudWxsKSB7Ci0JCQlmT2xkU3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZk9sZFN0YXJ0ID0gLTE7Ci0JCX0KLQkJZk5ld0xlbmd0aCA9IENTU1V0aWwuZ2V0VGV4dExlbmd0aChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSAmJiAoZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpICE9IG51bGwpIHsKLQkJCWZOZXdTdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQlmUmVtb3ZlZFJhbmdlQmVnaW4gPSBmTmV3U3RhcnQ7Ci0JCQlmUmVtb3ZlZFJhbmdlRW5kID0gZk5ld1N0YXJ0ICsgZk5ld0xlbmd0aDsKLQkJfQotCQllbHNlIHsKLQkJCWZOZXdTdGFydCA9IC0xOwotCQkJZlJlbW92ZWRSYW5nZUJlZ2luID0gZlJlbW92ZWRSYW5nZUVuZCA9IC0xOwotCQl9Ci0JCWZMZW5ndGhEaWZmZXJlbmNlID0gZk5ld0xlbmd0aCAtIGZPbGRMZW5ndGg7Ci0JCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQotCQkvLyBjbGVhbnVwIG5vZGVzCi0JCXdoaWxlICgwIDwgZk5vZGVzVG9CZVJlbW92ZWQuZ2V0TGVuZ3RoKCkpIHsKLQkJCWZOb2Rlc1RvQmVSZW1vdmVkLnJlbW92ZU5vZGUoMCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzE1MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsLkNTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbC5DU1NTdHlsZU5vdGlmeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0UnVsZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRlZENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5TZWxlY3RvcnNDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwgaW1wbGVtZW50cyBJQ1NTTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIENTU0RvY3VtZW50SW1wbCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBvcmcudzNjLmRvbS5Ob2RlIG93bmVyTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgc3R5bGVOb3RpZmllciA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFBhcnNlciBmUGFyc2VyID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsVXBkYXRlciBmVXBkYXRlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSURfTk9OX0VYVEVSTkFMX0NTUyA9ICIqKl9OT05fRVhURVJOQUxfQ1NTXyoqKiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ1NTTW9kZWxJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JcHVibGljIENTU01vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5DU1NTdHlsZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuYWRkU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBhdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci5hdHRyUmVwbGFjZWQocGFyZW50Tm9kZSwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JCX0KLQotCQlJQ1NTU2VsZWN0b3IgcmVtb3ZlZFtdID0gbnVsbCwgYWRkZWRbXSA9IG51bGw7Ci0JCWlmIChvbGRBdHRyICE9IG51bGwgJiYgb2xkQXR0ci5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBvbGRBdHRyKS5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBvbGRBdHRyOwotCQkJLy8gY29sbGVjdCBjaGFuZ2VkIHNlbGVjdG9yCi0JCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChhdHRyLmdldFZhbHVlKCkpOwotCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQlyZW1vdmVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQkJfQotCQlpZiAobmV3QXR0ciAhPSBudWxsICYmIG5ld0F0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbmV3QXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSkgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgbmV3QXR0cjsKLQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCWFkZGVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsIHx8IGFkZGVkICE9IG51bGwgfHwgZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJZ2V0U3R5bGVOb3RpZmllcigpLmZpcmUocmVtb3ZlZCwgYWRkZWQsIG51bGwpOwotCQl9Ci0JCS8vIGZvciBocmVmIGF0dHJpYnV0ZQotCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsICYmIGdldFN0eWxlTGlzdGVuZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJYm9vbGVhbiB1cGRhdGUgPSBmYWxzZTsKLQkJCWlmIChvbGRBdHRyICE9IG51bGwgJiYgb2xkQXR0ci5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBvbGRBdHRyKS5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJdXBkYXRlID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChuZXdBdHRyICE9IG51bGwgJiYgbmV3QXR0ci5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBuZXdBdHRyKS5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJdXBkYXRlID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICh1cGRhdGUpCi0JCQkJKChJQ1NTSW1wb3J0UnVsZSkgcGFyZW50Tm9kZSkuZ2V0U3R5bGVTaGVldCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLmJlZ2luUmVjb3JkaW5nKCk7Ci0KLQkJTm9kZSBub2RlID0gZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCBvbGRDaGlsZCkgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci5jaGlsZFJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCX0KLQotCQkvLyBhbHdheXMgY2hlY2sgYW5kIHNlbmQgc2VsZWN0b3IgZXZlbnQKLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSB8fCBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUpIHsKLQkJCS8vIGNvbGxlY3Qgb2xkIHNlbGVjdG9ycwotCQkJU2VsZWN0b3JzQ29sbGVjdG9yIHNlbFRyYXYgPSBuZXcgU2VsZWN0b3JzQ29sbGVjdG9yKCk7Ci0JCQlzZWxUcmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQlpZiAoblNlbCA+IDApIHsKLQkJCQlyZW1vdmVkID0gbmV3IElDU1NTZWxlY3RvcltuU2VsXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5TZWw7IGkrKykKLQkJCQkJcmVtb3ZlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCQkJfQotCQkJLy8gY29sbGVjdCBuZXcgc2VsZWN0b3JzCi0JCQlzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJc2VsVHJhdi5hcHBseShuZXdDaGlsZCk7Ci0JCQluU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQlpZiAoblNlbCA+IDApIHsKLQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCWFkZGVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBtb2RpZmljYXRpb24KLQkJCUlDU1NOb2RlIHJ1bGUgPSBwYXJlbnROb2RlOwotCQkJd2hpbGUgKHJ1bGUgIT0gbnVsbCkgewotCQkJCWlmIChydWxlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkKLQkJCQkJYnJlYWs7Ci0JCQkJcnVsZSA9IHJ1bGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9ICgoSUNTU1N0eWxlUnVsZSkgcnVsZSkuZ2V0U2VsZWN0b3JzKCk7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCB8fCBhZGRlZCAhPSBudWxsIHx8IGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCS8vIHNlbmQgc2VsZWN0b3IgY2hhbmdlZCBldmVudAotCQkJZ2V0U3R5bGVOb3RpZmllcigpLmZpcmUocmVtb3ZlZCwgYWRkZWQsIG51bGwpOwotCQl9Ci0JCS8vIGNsb3NlIHJlbW92ZWQgaW1wb3J0LXJ1bGUncyBleHRlcm5hbCBzdHlsZSBzaGVldHMKLQkJewotCQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IoKTsKLQkJCXRyYXYuYXBwbHkob2xkQ2hpbGQpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkoKENTU0ltcG9ydFJ1bGVJbXBsKSBpdC5uZXh0KCkpLmNsb3NlU3R5bGVTaGVldCgpOwotCQkJfQotCQl9Ci0JCS8vIHNlbmQgZXZlbnRzIHRvIGxpc3RlbmVyIGZvciBuZXcgaW1wb3J0LXJ1bGVzCi0JCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwgJiYgZ2V0U3R5bGVMaXN0ZW5lcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG5ld0NoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZUltcG9ydGVkKCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCS8vIHJlbGVhc2UgbGlzdGVuZXJzCi0JCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSB7Ci0JCQkJVmVjdG9yIHRvUmVtb3ZlID0gbmV3IFZlY3RvcihnZXRTdHlsZUxpc3RlbmVycygpKTsKLQkJCQlJdGVyYXRvciBpdCA9IHRvUmVtb3ZlLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlyZW1vdmVTdHlsZUxpc3RlbmVyKChJQ1NTU3R5bGVMaXN0ZW5lcikgaXQubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjbG9zZSBpbXBvcnQgcnVsZXMKLQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KGdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQyID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQyLmhhc05leHQoKSkgewotCQkJCSgoQ1NTSW1wb3J0UnVsZUltcGwpIGl0Mi5uZXh0KCkpLnJlbGVhc2VSdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENTU0RvY3VtZW50SW1wbCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJQ1NTRG9jdW1lbnRJbXBsIGRvYyA9IG51bGw7Ci0JCWludCBwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfU1RZTEVTSEVFVDsKLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGNhc2UgaXMgZXh0ZXJuYWwgQ1NTIGZpbGUKLQkJCWRvYyA9IChDU1NTdHlsZVNoZWV0SW1wbCkgRE9NQ1NTSW1wbC5jcmVhdGVDU1NTdHlsZVNoZWV0KG51bGwsIG51bGwpOyAvLyBwYXJhbWV0ZXJzCi0JCQkvLyBhcmUKLQkJCS8vIGZvcgotCQkJLy8gU1RZTEUtdGFnCi0JCQlwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfU1RZTEVTSEVFVDsKLQkJfQotCQllbHNlIGlmIChvd25lck5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50ICYmICgoRWxlbWVudCkgb3duZXJOb2RlKS5nZXRUYWdOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNUWUxFIikpIHsvLyROT04tTkxTLTEkCi0JCQkvLyB0aGlzIGNhc2UgaXMgU1RZTEUtdGFnCi0JCQlFbGVtZW50IHN0eWxlID0gKEVsZW1lbnQpIG93bmVyTm9kZTsKLQkJCWRvYyA9IChDU1NTdHlsZVNoZWV0SW1wbCkgRE9NQ1NTSW1wbC5jcmVhdGVDU1NTdHlsZVNoZWV0KHN0eWxlLmdldEF0dHJpYnV0ZSgiVElUTEUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3R5bGUuZ2V0QXR0cmlidXRlKCJNRURJQSIpKTsvLyROT04tTkxTLTEkCi0JCQlwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfU1RZTEVTSEVFVDsKLQkJfQotCQllbHNlIGlmIChvd25lck5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50IHx8IG93bmVyTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkF0dHIpIHsKLQkJCS8vIElubGluZSBhdHRyaWJ1dGVzCi0JCQlkb2MgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OOwotCQl9Ci0JCVJlZ2lvblBhcnNlciByZWdpb25QYXJzZXIgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRQYXJzZXIoKTsKLQkJaWYgKHJlZ2lvblBhcnNlciBpbnN0YW5jZW9mIENTU1NvdXJjZVBhcnNlcikgewotCQkJKChDU1NTb3VyY2VQYXJzZXIpIHJlZ2lvblBhcnNlcikuc2V0UGFyc2VyTW9kZShwYXJzZXJNb2RlKTsKLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCU5vZGUgbm9kZSA9IGdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQotCQlnZXRTdHlsZU5vdGlmaWVyKCkuZW5kUmVjb3JkaW5nKCk7Ci0JfQotCi0JcHVibGljIElDU1NEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCgpOwotCQkJdGhpcy5kb2N1bWVudC5zZXRNb2RlbCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJc3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkJLy8gdGhlIGZpcnN0IHRpbWUKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXRNb2RlbEhhbmRsZXIoKSk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBnZXRNb2RlbEhhbmRsZXIoKS5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldE5vZGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KSB7Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXREb2N1bWVudCgpKS5nZXRDb250YWluZXJOb2RlKG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0T3duZXJET01Ob2RlKCkgewotCQlyZXR1cm4gb3duZXJOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvd25lck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgaWYgdGhlIGNhc2Ugb2YgZXh0ZXJuYWwgQ1NTIG1vZGVsLCB5b3UKLQkgKiAgICAgICAgICAgIHNob3VsZCBzZXQgbnVsbCwgZWxzZSBpZiBpbnRlcm5hbCBjc3MsIHlvdSBzaG91bGQgc2V0Ci0JICogICAgICAgICAgICBTVFlMRS10YWcgbm9kZSwgZWxzZSBpZiBpbmxpbmUgY3NzLCB5b3Ugc2hvdWxkIHNldCB0aGUKLQkgKiAgICAgICAgICAgIGVsZW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2Ygc3R5bGUtYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyRE9NTm9kZShOb2RlIG5vZGUpIHsKLQkJLy8gcHJvaGliaXQgb3duZXIgY2hhbmdlCi0JCUFzc2VydC5pc1RydWUob3duZXJOb2RlID09IG51bGwpOwotCQlvd25lck5vZGUgPSBub2RlOwotCQlpZiAob3duZXJOb2RlICE9IG51bGwpIHsgLy8gZm9yIGludGVybmFsL2lubGluZSBDU1MgY29udGV4dAotCQkJdHJ5IHsKLQkJCQlzZXRJZChJRF9OT05fRVhURVJOQUxfQ1NTKTsKLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQkvLyBpbXBvc3NpYmxlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBDU1NNb2RlbFBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChmUGFyc2VyID09IG51bGwpIHsKLQkJCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlmUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKGRvY3VtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBnZXRTdHlsZU5vdGlmaWVyKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRTdHlsZVNoZWV0VHlwZSgpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXJldHVybiBJTkxJTkU7Ci0JCWlmIChnZXRPd25lckRPTU5vZGUoKSAhPSBudWxsKQotCQkJcmV0dXJuIEVNQkVEREVEOwotCQllbHNlCi0JCQlyZXR1cm4gRVhURVJOQUw7Ci0JfQotCi0JcHJpdmF0ZSBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgZ2V0U3R5bGVOb3RpZmllcigpIHsKLQkJaWYgKHN0eWxlTm90aWZpZXIgPT0gbnVsbCkgewotCQkJc3R5bGVOb3RpZmllciA9IChvd25lck5vZGUgIT0gbnVsbCkgPyBuZXcgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlcih0aGlzKSA6IG5ldyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHN0eWxlTm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZXIgZ2V0VXBkYXRlcigpIHsKLQkJaWYgKGZVcGRhdGVyID09IG51bGwpIHsKLQkJCWZVcGRhdGVyID0gbmV3IENTU01vZGVsVXBkYXRlcih0aGlzKTsKLQkJCWZVcGRhdGVyLnNldFBhcnNlcihnZXRQYXJzZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGZVcGRhdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjb3JkaW5nKCkgewotCQlyZXR1cm4gZ2V0U3R5bGVOb3RpZmllcigpLmlzUmVjb3JkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSAmJiBzdXBlci5pc1NoYXJlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGZvciB0aGUgY2FzZQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpKQotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogbm9DaGFuZ2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkvLyBub3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGNsZWFudXAgLT4gcmVidWlsZCBDU1MgTm9kZXMgVGhpcyBpcyBwcmUtYmV0YSBmaXggZm9yIDE3ODE3Ni4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoTm9kZXMoKSB7Ci0JCS8vIGNsZWFudXAgb2xkIG5vZGVzCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkucmVtb3ZlQ2hpbGROb2RlcygpOwotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0KLQkJZ2V0UGFyc2VyKCkuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlTdHJpbmcgc291cmNlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFRleHQoKTsKLQotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywgMCwgc291cmNlLmxlbmd0aCgpLCBudWxsKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIDAsIHNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPbGRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQlpZiAob2xkUmVnaW9ucyA9PSBudWxsICYmIG5ld1JlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VSZWdpb25zKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0JCWNsb3NlSW1wb3J0ZWQoKTsKLQkJaWYgKGdldFN0eWxlU2hlZXRUeXBlKCkgPT0gRVhURVJOQUwpIHsKLQkJCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQljbG9zZUltcG9ydGVkKCk7Ci0JCWlmIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSB7Ci0JCQlzdXBlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmV2ZW50LkNTU1N0eWxlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdXBlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlyZXR1cm47IC8vIG5vdGluZyB0byBkbwotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQluZXdNb2RlbChuZXcgTmV3RG9jdW1lbnRFdmVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoaXMpKTsKLQkJCX0KLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwKLQkgKiAgICAgICAgICAgIGNvbS5pbWIuc2VkLmNzcy5tb2RlLmludGVmYWNlcy5JQ1NTTW9kZWwKLQkgKiBAcGFyYW0gcmVtb3ZlZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKiBAcGFyYW0gYWRkZWQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTZWxlY3RvcltdCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuc3R5bGVDaGFuZ2VkKHNyY01vZGVsLCByZW1vdmVkLCBhZGRlZCwgbWVkaWEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5zdHlsZVVwZGF0ZShzcmNNb2RlbCk7Ci0JfQotCi0Jdm9pZCB2YWx1ZUNoYW5nZWQoQ1NTTm9kZUltcGwgbm9kZSwgU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCWlmICghZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSkgewotCQkJQ1NTTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRVcGRhdGVyKCk7Ci0JCQl1cGRhdGVyLnZhbHVlQ2hhbmdlZChub2RlLCBvbGRWYWx1ZSk7Ci0JCX0KLQotCQlJQ1NTU2VsZWN0b3IgcmVtb3ZlZFtdID0gbnVsbCwgYWRkZWRbXSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5vZGUpLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBub2RlOwotCQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0KLQkJCQkvLyBnZXQgb2xkIHZhbHVlCi0JCQkJbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKG9sZFZhbHVlKTsKLQkJCQlyZW1vdmVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJcmVtb3ZlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJSUNTU05vZGUgcnVsZSA9IG5vZGU7Ci0JCQkJd2hpbGUgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlpZiAocnVsZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpCi0JCQkJCQlicmVhazsKLQkJCQkJcnVsZSA9IHJ1bGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAocnVsZSAhPSBudWxsKSB7Ci0JCQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9ICgoSUNTU1N0eWxlUnVsZSkgcnVsZSkuZ2V0U2VsZWN0b3JzKCk7Ci0JCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZW1vdmVkICE9IG51bGwgfHwgYWRkZWQgIT0gbnVsbCB8fCBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBmb3IgaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCAmJiBnZXRTdHlsZUxpc3RlbmVycygpLnNpemUoKSA+IDApIHsKLQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBub2RlKS5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJKChJQ1NTSW1wb3J0UnVsZSkgKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCkpLmdldFN0eWxlU2hlZXQoKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsTm9kZUZlZWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxMDVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsTm9kZUZlZWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbE5vZGVGZWVkZXIgewotCS8qKgotCSAqIGN1cnJlbnRseSBJQ1NTRG9jdW1lbnQgaXMgdXNlZCBidXQgbWF5IGdvIGJhY2sgdG8gQ1NTRG9jdW1lbnRJbXBsIGluIGZ1dHVyZS4KLQkgKi8KLQlJQ1NTRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTTW9kZWxOb2RlRmVlZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxOb2RlRmVlZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU01vZGVsTm9kZUZlZWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIGN1cnJlbnRseSBJQ1NTRG9jdW1lbnQgaXMgdXNlZCBidXQgbWF5IGdvIGJhY2sgdG8gQ1NTRG9jdW1lbnRJbXBsIGluIGZ1dHVyZS4KLQkgKi8KLQlDU1NNb2RlbE5vZGVGZWVkZXIoSUNTU0RvY3VtZW50IGRvY3VtZW50LCBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgdXBkYXRlQ29udGV4dCkgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZlVwZGF0ZUNvbnRleHQgPSB1cGRhdGVDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCBnZXRDU1NDaGFyc2V0UnVsZSgpIHsKLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTQ2hhcnNldFJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTQ2hhcnNldFJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsIGdldENTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU0ZvbnRGYWNlUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NGb250RmFjZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTSW1wb3J0UnVsZUltcGwgZ2V0Q1NTSW1wb3J0UnVsZSgpIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NJbXBvcnRSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU0ltcG9ydFJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTSW1wb3J0UnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwgZ2V0Q1NTTWVkaWFSdWxlKCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTTWVkaWFSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU01lZGlhUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NNZWRpYVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwgZ2V0Q1NTUGFnZVJ1bGUoKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1BhZ2VSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1BhZ2VSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1BhZ2VSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVSdWxlSW1wbCBnZXRDU1NTdHlsZVJ1bGUoKSB7Ci0JCUNTU1N0eWxlUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NTdHlsZVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTU3R5bGVSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1N0eWxlUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyODI5Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbFBhcnNlciB7Ci0KLQlwcml2YXRlIElDU1NEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgZkNyZWF0aW9uQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCBmRGVsZXRpb25Db250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsVXBkYXRlQ29udGV4dCBmVXBkYXRlQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbE5vZGVGZWVkZXIgZkZlZWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZQYXJzZUZsb2F0aW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHByb3ZkZWQgdGhpcyBtZXRob2QgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnNlRmxvYXRpbmcoKXsKLQkJcmV0dXJuIGZQYXJzZUZsb2F0aW5nOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHJvdmRlZCB0aGlzIG1ldGhvZCBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBnZXRDcmVhdGlvbkNvbnRleHQoKXsKLQkJcmV0dXJuIGZDcmVhdGlvbkNvbnRleHQ7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwcm92ZGVkIHRoaXMgbWV0aG9kIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGVDb250ZXh0QWN0aXZlKCl7Ci0JCXJldHVybiBmVXBkYXRlQ29udGV4dCAhPSBudWxsID8gZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSA6IGZhbHNlOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NNb2RlbFBhcnNlcihJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQkJZkNyZWF0aW9uQ29udGV4dCA9IG5ldyBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCgoQ1NTTm9kZUltcGwpZG9jKTsKLQkJZkRlbGV0aW9uQ29udGV4dCA9IG5ldyBDU1NNb2RlbERlbGV0aW9uQ29udGV4dChkb2MpOwotCQlmVXBkYXRlQ29udGV4dCA9IG5ldyBDU1NNb2RlbFVwZGF0ZUNvbnRleHQoKTsKLQkJZkZlZWRlciA9IG5ldyBDU1NNb2RlbE5vZGVGZWVkZXIoZG9jLCBmVXBkYXRlQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXcgQ29yZU5vZGVMaXN0KGZsYXROb2RlLCBmbGF0Tm9kZSksIG5ldyBDb3JlTm9kZUxpc3QoZmxhdE5vZGUsIGZsYXROb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja05leHROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dCA9IENTU1V0aWwuZmluZE5leHRTaWduaWZpY2FudE5vZGUoZmxhdE5vZGUpOwotCQlpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5leHQpID09IHR5cGUpIHsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZVN0YXJ0KGZsYXROb2RlLmdldEVuZCgpKTsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZUVuZChuZXh0LmdldEVuZCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhbnVwRGVsZXRpb25Db250ZXh0KCkgewotCQkvLyBzZXR1cERlbGV0aW9uQ29udGV4dChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGNsZWFudXBGaXJzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUsIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQpIHsKLQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmlyc3ROb2RlID09IHRhcmdldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXROZXh0Tm9kZUluQ3VycmVudChmaXJzdE5vZGUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobGFzdE5vZGUgPT0gbnVsbCB8fCBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShsYXN0Tm9kZSkgfHwgbmV4dE5vZGUgPT0gbnVsbCB8fCBsYXN0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDwgbmV4dE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCXRhcmdldC5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldC5zZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXh0Tm9kZSk7Ci0JCQl9Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNsZWFudXBGaXJzdE5vZGUoZmlyc3ROb2RlLCAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gY2xlYW51cExhc3ROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUsIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQpIHsKLQkJaWYgKGxhc3ROb2RlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChsYXN0Tm9kZSA9PSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRQcmV2Tm9kZUluQ3VycmVudChsYXN0Tm9kZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IHRhcmdldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsIHx8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGZpcnN0Tm9kZSkgfHwgcHJldk5vZGUgPT0gbnVsbCB8fCBwcmV2Tm9kZS5nZXRTdGFydE9mZnNldCgpIDwgZmlyc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQl0YXJnZXQuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXQuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihwcmV2Tm9kZSk7Ci0JCQl9Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNsZWFudXBMYXN0Tm9kZShsYXN0Tm9kZSwgKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgY2xlYW51cFVwZGF0ZUNvbnRleHQoKSB7Ci0JCWludCByZW1haW5zID0gZlVwZGF0ZUNvbnRleHQuZ2V0Tm9kZUNvdW50KCk7Ci0JCWZVcGRhdGVDb250ZXh0LmNsZWFudXBDb250ZXh0KCk7Ci0JCXJldHVybiByZW1haW5zOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBmbG9hdGluZyBDU1MgcnVsZSAob3duZXIgZG9jdW1lbnQgd2lsbCBiZSBzZXQpIHRoaXMgaXMgZm9yCi0JICogQ1NTU3R5bGVTaGVldC5jcmVhdGVDU1NSdWxlKFN0cmluZykKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZlBhcnNlRmxvYXRpbmcgPSB0cnVlOwotCi0JCS8vIHNldHVwIGNyZWF0aW9uIGNvbnRleHQKLQkJZkNyZWF0aW9uQ29udGV4dC5jbGVhcigpOwotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUobnVsbCk7Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUobnVsbCk7Ci0JCUNTU1J1bGVJbXBsIHBhcmVudFJ1bGUgPSBudWxsOwotCi0JCWZvciAoRW51bWVyYXRpb24gZSA9IGZsYXROb2Rlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgbW9kaWZpZWQgPSBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJaWYgKHBhcmVudFJ1bGUgPT0gbnVsbCAmJiBtb2RpZmllZCBpbnN0YW5jZW9mIENTU1J1bGVJbXBsKSB7Ci0JCQkJcGFyZW50UnVsZSA9IChDU1NSdWxlSW1wbCkgbW9kaWZpZWQ7Ci0JCQl9Ci0JCX0KLQotCQlmUGFyc2VGbG9hdGluZyA9IGZhbHNlOwotCi0JCWlmIChwYXJlbnRSdWxlICE9IG51bGwpIHsKLQkJCUNTU01vZGVsVXRpbC5jbGVhbnVwQ29udGFpbmVyKHBhcmVudFJ1bGUpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudFJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRCcmFjZUNsb3NlKGludCBkZXB0aCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgYm9vbGVhbiBiQnJlYWtTaWJsaW5nKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaW50IGJyYWNlTGV2ZWwgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzdGFydC5nZXROZXh0KCk7Ci0JCWZvciAoOyByZWdpb24gIT0gbnVsbDsgcmVnaW9uID0gcmVnaW9uLmdldE5leHQoKSkgewotCQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCUNTU05vZGVJbXBsIG5vZGUgPSBnZXROb2RlQXQob2Zmc2V0KTsKLQkJCWludCBkZXB0aEhpdCA9IChub2RlICE9IG51bGwpID8gQ1NTTW9kZWxVdGlsLmdldERlcHRoKG5vZGUpIDogLTE7Ci0JCQlpZiAoZGVwdGggPD0gZGVwdGhIaXQpIHsKLQkJCQkvLyBzaWJsaW5nIGlzIGZvdW5kIGJlZm9yZSAifSIKLQkJCQlpZiAoYkJyZWFrU2libGluZykgewotCQkJCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl3aGlsZSAoZGVwdGggPD0gQ1NTTW9kZWxVdGlsLmdldERlcHRoKHBhcmVudCkpIHsKLQkJCQkJCW5vZGUgPSBwYXJlbnQ7Ci0JCQkJCQlwYXJlbnQgPSAoQ1NTTm9kZUltcGwpIHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIG5vZGUgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBwcmV2Tm9kZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUocmVnaW9uKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQlicmFjZUxldmVsKys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJYnJhY2VMZXZlbC0tOwotCQkJCWlmIChicmFjZUxldmVsIDwgMCkgewotCQkJCQlyZXN1bHQgPSByZWdpb247Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXByZXZOb2RlID0gcmVnaW9uOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkvLyByZWFjaCB0aGUgZW5kIG9mIGRvY3VtZW50Ci0JCQlyZXN1bHQgPSBwcmV2Tm9kZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0KGludCBzdGFydCwgaW50IGVuZCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBub2RlTGlzdCA9IG51bGw7Ci0JCWlmICgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGVuZCkgewotCQkJSUNTU01vZGVsIG1vZGVsID0gZkRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBDU1NNb2RlbEltcGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9ICgoQ1NTTW9kZWxJbXBsKSBtb2RlbCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCAtIDEpOwotCQkJCQlpZiAoc3RhcnROb2RlICE9IG51bGwgJiYgZW5kTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlub2RlTGlzdCA9IG5ldyBDb3JlTm9kZUxpc3Qoc3RhcnROb2RlLCBlbmROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBub2RlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCUNTU05vZGVJbXBsIHJvb3ROb2RlID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlJQ1NTTm9kZSB0YXJnZXQgPSByb290Tm9kZS5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU05vZGVJbXBsKSB0YXJnZXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0QnJhY2VDbG9zZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlJQ1NTTm9kZSB0YXJnZXQgPSBDU1NNb2RlbFV0aWwuZmluZEJyYWNlQ29udGFpbmVyKGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpKTsKLQotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0YXJnZXQ7Ci0JCWlmIChDU1NNb2RlbFV0aWwuaXNJbnRlcnJ1cHRpb24ocGFyZW50LCByZWdpb24pKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VTdGFydChwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlRW5kKHBhcmVudC5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJKChDU1NOb2RlSW1wbCkgbm9kZSkucmVtb3ZlQ2hpbGQocGFyZW50KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDU1NQYWdlUnVsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTTWVkaWFSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQlDU1NNb2RlbFV0aWwuZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKHBhcmVudCwgcmVnaW9uKTsKLQkJCWlmICghQ1NTTW9kZWxVdGlsLmlzQnJhY2VDbG9zZWQodGFyZ2V0KSkgewotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKHBhcmVudC5nZXROZXh0U2libGluZygpKTsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRCcmFjZU9wZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBrZXlSZWdpb24gPSBDU1NVdGlsLmZpbmRQcmV2aW91c1NpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQlpZiAoa2V5UmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcpIHsKLQkJCUNTU05vZGVJbXBsIG5vZGUgPSBnZXROb2RlQXQoa2V5UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShrZXlSZWdpb24pOwotCi0JCUNTU05vZGVJbXBsIGluc2VydGVkID0gbnVsbDsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0UGFnZVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydE1lZGlhUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydEZvbnRGYWNlUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAoQ1NTVXRpbC5pc1NlbGVjdG9yVGV4dChrZXlSZWdpb24pKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydFN0eWxlUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlpZiAoaW5zZXJ0ZWQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCS8vIENTU01vZGVsVXRpbC5leHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilpbnNlcnRlZCwKLQkJCS8vIGZsYXROb2RlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VDbG9zZSA9IGZpbmRCcmFjZUNsb3NlKENTU01vZGVsVXRpbC5nZXREZXB0aChpbnNlcnRlZCksIHJlZ2lvbiwgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKSk7Ci0JCQlpZiAoYnJhY2VDbG9zZSAhPSBudWxsKSB7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlU3RhcnQocmVnaW9uLmdldEVuZCgpKTsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VFbmQoYnJhY2VDbG9zZS5nZXRFbmQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zZXJ0ZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRDaGFyc2V0UnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJlZ2luRG9jUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZERvY1JlZ2lvbikgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoYmVnaW5Eb2NSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJcmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBjaGFyc2V0IgotCQlJVGV4dFJlZ2lvbiBlbmNvZGluZ1JlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlICghcmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSByZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmICh0ZXh0UmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HKSB7Ci0JCQkJZW5jb2RpbmdSZWdpb24gPSB0ZXh0UmVnaW9uOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVuY29kaW5nUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU0NoYXJzZXRSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlydWxlLnNldEF0dHJpYnV0ZShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcsIGJlZ2luRG9jUmVnaW9uLmdldFRleHQoZW5jb2RpbmdSZWdpb24pKTsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGVuZERvY1JlZ2lvbik7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5jb2RpbmdSZWdpb24sIGVuY29kaW5nUmVnaW9uKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoZkNyZWF0aW9uQ29udGV4dCA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKS5nZXRUeXBlKCk7Ci0JCUNTU05vZGVJbXBsIG1vZGlmaWVkID0gbnVsbDsKLQotCQlJQ1NTTm9kZSB0YXJnZXQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQotCQlpZiAoKGZQYXJzZUZsb2F0aW5nICYmIHRhcmdldCA9PSBudWxsKSB8fCB0YXJnZXQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikgewotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0U2VtaUNvbG9uRm9yUnVsZShyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRCcmFjZU9wZW4ocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0QnJhY2VDbG9zZShyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgQ1NTVXRpbC5pc1NlbGVjdG9yVGV4dChyZWdpb24pKSB7Ci0JCQkJY2hlY2tOZXh0Tm9kZShyZWdpb24sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQpIHsKLQkJCQljaGVja05leHROb2RlKHJlZ2lvbiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKHRhcmdldCBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyIHx8IHRhcmdldCBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKSB7Ci0JCQltb2RpZmllZCA9IGluc2VydFN0eWxlRGVjbGFyYXRpb25JdGVtKHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0gJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQltb2RpZmllZCA9IGluc2VydFNlbWlDb2xvbkZvclN0eWxlRGVjbGFyYXRpb25JdGVtKHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQltb2RpZmllZCA9IGluc2VydEJyYWNlQ2xvc2UocmVnaW9uKTsKLQkJfQotCi0JCS8vIHBvc3QgcHJvY2VzcwotCQlpZiAobW9kaWZpZWQgIT0gbnVsbCkgewotCQkJaWYgKG1vZGlmaWVkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG1vZGlmaWVkKS5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IHJlZ2lvbkxpc3QpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gcmVnaW9uTGlzdC5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uKTsKLQkJCWlmIChmQ3JlYXRpb25Db250ZXh0LmlzVG9SZXBhcnNlKCkpIHsKLQkJCQlpbnQgb3JpZ1N0YXJ0ID0gcmVnaW9uLmdldEVuZCgpOwotCQkJCWludCBvcmlnRW5kID0gcmVnaW9uTGlzdC5pdGVtKHJlZ2lvbkxpc3QuZ2V0TGVuZ3RoKCkgLSAxKS5nZXRFbmQoKTsKLQkJCQlpbnQgbmV3U3RhcnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFJlcGFyc2VTdGFydCgpOwotCQkJCWludCBuZXdFbmQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFJlcGFyc2VFbmQoKTsKLQkJCQlpZiAobmV3U3RhcnQgPCBvcmlnU3RhcnQgfHwgb3JpZ0VuZCA8IG5ld0VuZCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdOb2RlTGlzdCA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QobmV3U3RhcnQsIG5ld0VuZCk7Ci0JCQkJCXNldHVwQ3JlYXRpb25Db250ZXh0KG5ld05vZGVMaXN0Lml0ZW0oMCkpOwotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld05vZGVMaXN0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZkNyZWF0aW9uQ29udGV4dC5yZXNldFJlcGFyc2VSYW5nZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0Rm9udEZhY2VSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NGb250RmFjZVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU0ZvbnRGYWNlUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uLCBicmFjZU5vZGUpOwotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRJbXBvcnRSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYmVnaW5Eb2NSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kRG9jUmVnaW9uKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChiZWdpbkRvY1JlZ2lvbi5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQGltcG9ydCIKLQkJSVRleHRSZWdpb24gaHJlZlJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlICghcmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSByZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmICh0ZXh0UmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORykgewotCQkJCWhyZWZSZWdpb24gPSB0ZXh0UmVnaW9uOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGhyZWZSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NJbXBvcnRSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UocmVnaW9ucyk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWFMaXN0ID0gKE1lZGlhTGlzdEltcGwpIHJ1bGUuZ2V0TWVkaWEoKTsKLQkJc2V0TWVkaWFMaXN0KG1lZGlhTGlzdCwgYmVnaW5Eb2NSZWdpb24sIHJlZ2lvbnMpOwotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJcnVsZS5zZXRBdHRyaWJ1dGUoSUNTU0ltcG9ydFJ1bGUuSFJFRiwgYmVnaW5Eb2NSZWdpb24uZ2V0VGV4dChocmVmUmVnaW9uKSk7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBlbmREb2NSZWdpb24pOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NJbXBvcnRSdWxlLkhSRUYpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBocmVmUmVnaW9uLCBocmVmUmVnaW9uKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0TWVkaWFSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU01lZGlhUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTTWVkaWFSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JCXJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAbWVkaWEiCi0KLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UocmVnaW9ucyk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWFMaXN0ID0gKE1lZGlhTGlzdEltcGwpIHJ1bGUuZ2V0TWVkaWEoKTsKLQkJc2V0TWVkaWFMaXN0KG1lZGlhTGlzdCwgZmxhdE5vZGUsIHJlZ2lvbnMpOwotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGJyYWNlTm9kZSk7Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFBhZ2VSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGdldCBzZWxlY3RvciByZWdpb25zCi0JCUlUZXh0UmVnaW9uTGlzdCBzZWxlY3RvclJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JCXNlbGVjdG9yUmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBwYWdlIgotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShzZWxlY3RvclJlZ2lvbnMpOwotCi0JCUNTU1BhZ2VSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NQYWdlUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJU3RyaW5nIHNlbGVjdG9yU3RyID0gQ1NTVXRpbC5nZXRSZWdpb25UZXh0KGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMpOwotCQkJaWYgKDAgPCBzZWxlY3RvclN0ci5sZW5ndGgoKSkgewotCQkJCXJ1bGUuc2V0U2VsZWN0b3JUZXh0KHNlbGVjdG9yU3RyKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGJyYWNlTm9kZSk7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBzZWxlY3RvclJlZ2lvbnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zLmdldCgwKSwgc2VsZWN0b3JSZWdpb25zLmdldChzZWxlY3RvclJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFNlbWlDb2xvbkZvclJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBrZXlSZWdpb24gPSBDU1NVdGlsLmZpbmRQcmV2aW91c1NpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShrZXlSZWdpb24pOwotCi0JCUNTU05vZGVJbXBsIGluc2VydGVkID0gbnVsbDsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRJbXBvcnRSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydENoYXJzZXRSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCi0JCXJldHVybiBpbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFNlbWlDb2xvbkZvclN0eWxlRGVjbGFyYXRpb25JdGVtKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIG9ubHkgdGFyZ2V0L25ldCBub2RlIGlzIGNoYW5nZWQuIG5vdGhpbmcgdG8gZG8uCi0KLQkJQ1NTTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gdGFyZ2V0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJLy8gd2lkZW4gZG9jdW1lbnQgcmVnaW9uIHJhbmdlCi0JCQkvLyAoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKXRhcmdldE5vZGUpLnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uKTsKLQkJCUNTU01vZGVsVXRpbC5leHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSB0YXJnZXROb2RlLCByZWdpb24pOwotCQkJLy8gcHNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5kaWNhdGVzIENTU1N0eWxlRGVjbEl0ZW0KLQkJCUlDU1NOb2RlIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShwYXJlbnROb2RlKTsKLQkJCUlDU1NOb2RlIG5leHQgPSBudWxsOwotCQkJaWYgKHBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyICYmIG9mZnNldCA8ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJbmV4dCA9IGNoaWxkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCi0JCQlyZXR1cm4gdGFyZ2V0Tm9kZTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U3R5bGVEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24pIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgcGFyZW50ID0gbnVsbDsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSB7Ci0JCQlDU1NSdWxlRGVjbENvbnRhaW5lciBkZWNsQ29udGFpbmVyID0gKENTU1J1bGVEZWNsQ29udGFpbmVyKSBub2RlOwotCQkJcGFyZW50ID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBkZWNsQ29udGFpbmVyLmdldFN0eWxlKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSB7Ci0JCQlwYXJlbnQgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIG5vZGU7Ci0JCX0KLQotCQlDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIgaXRlbVBhcnNlciA9IG5ldyBDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWl0ZW1QYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50VGVtcG9yYXJ5KGZhbHNlKTsKLQkJaXRlbVBhcnNlci5zZXRVcGRhdGVDb250ZXh0KGZVcGRhdGVDb250ZXh0KTsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgZGVjbEl0ZW0gPSBpdGVtUGFyc2VyLnNldHVwRGVjbGFyYXRpb25JdGVtKGRvY1JlZ2lvbik7Ci0JCWlmIChkZWNsSXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCWRlY2xJdGVtLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY1JlZ2lvbiwgZG9jUmVnaW9uKTsKLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgZGVjbEl0ZW0pOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGRlY2xJdGVtLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChkZWNsSXRlbSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUoZGVjbEl0ZW0pOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gZGVjbEl0ZW07Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTdHlsZVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gZ2V0IHNlbGVjdG9yIHJlZ2lvbnMKLQkJSVRleHRSZWdpb25MaXN0IHNlbGVjdG9yUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uoc2VsZWN0b3JSZWdpb25zKTsKLQotCQlDU1NTdHlsZVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU1N0eWxlUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJU3RyaW5nIHNlbGVjdG9yU3RyID0gQ1NTVXRpbC5nZXRSZWdpb25UZXh0KGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMpOwotCQkJaWYgKHNlbGVjdG9yU3RyICE9IG51bGwgJiYgMCA8IHNlbGVjdG9yU3RyLmxlbmd0aCgpKSB7Ci0JCQkJcnVsZS5zZXRTZWxlY3RvclRleHQoc2VsZWN0b3JTdHIpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgYnJhY2VOb2RlKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmIHNlbGVjdG9yUmVnaW9ucyAhPSBudWxsICYmICFzZWxlY3RvclJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KDApLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KHNlbGVjdG9yUmVnaW9ucy5zaXplKCkgLSAxKSk7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwcmV0ZW5kUmVtb3ZlTm9kZSgpIHsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmVXBkYXRlQ29udGV4dC5nZXREZWxldGlvblRhcmdldCgpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUJlZ2luKGZpcnN0Tm9kZSk7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VFbmQobGFzdE5vZGUpOwotCQl9Ci0KLQkJc2hyaW5rQ29udGFpbmVyKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZVcGRhdGVDb250ZXh0LmdldERlbGV0aW9uVGFyZ2V0UGFyZW50KCksIG5vZGUpOwotCX0KLQotCS8qKgotCSAqCWN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KENTU05vZGVJbXBsIHBhcmVudCwgQ1NTTm9kZUltcGwgY2hpbGQpIHsKLQkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudENvbnRhaW5lciA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNoaWxkQ29udGFpbmVyID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQ7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gY2hpbGRDb250YWluZXIuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IGNoaWxkQ29udGFpbmVyLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gYk1vZGlmaWVkID0gcGFyZW50Q29udGFpbmVyLmluY2x1ZGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmaXJzdE5vZGUsIGxhc3ROb2RlKTsKLQkJaWYgKGJNb2RpZmllZCkgewotCQkJcGFyZW50Q29udGFpbmVyLnByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJZG8gewotCQkJCWZsYXROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRQcmV2Tm9kZShmbGF0Tm9kZSk7Ci0JCQkJdHlwZSA9IChmbGF0Tm9kZSAhPSBudWxsKSA/IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSkgOiBudWxsOwotCQkJfQotCQkJd2hpbGUgKHR5cGUgIT0gbnVsbCAmJiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIChmRGVsZXRpb25Db250ZXh0LmlzSW5SZW1vdmVkUmFuZ2UoZmxhdE5vZGUpKSB7IC8vIGFscmVhZHkKLQkJLy8gcmVtb3ZlZAotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgbm9kZSA9IGZEZWxldGlvbkNvbnRleHQuZmluZERlbGV0aW9uVGFyZ2V0KChDU1NOb2RlSW1wbClmRG9jdW1lbnQsIGZsYXROb2RlKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlID09IGZEb2N1bWVudCkgewotCQkJcmV0dXJuOyAvLyBub3QgYXR0YWNoZWQgd2l0aCBhbnkgdHJlZU5vZGUKLQkJfQotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIHsKLQkJCUlDU1NOb2RlIHJ1bGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChydWxlIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlSW1wbCkgewotCQkJCW5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBydWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gSUNTU05vZGUgcCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkvLyBpZiAocCA9PSBudWxsIHx8ICEgKHAgaW5zdGFuY2VvZgotCQkvLyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCQkvLyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0KLQkJLy8gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilwOwotCi0JCWlmIChmRGVsZXRpb25Db250ZXh0LmFkZE5vZGVUb0JlUmVtb3ZlZChub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3ROb2RlICE9IG51bGwpIHsKLQkJCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUJlZ2luKGZpcnN0Tm9kZSk7Ci0JCQl9Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNocmlua0NvbnRhaW5lcihub2RlKTsKLQkJLy8gcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBmbGF0Tm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQotCQlJdGVyYXRvciBpID0gZkRlbGV0aW9uQ29udGV4dC5nZXROb2Rlc1RvQmVSZW1vdmVkKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IChDU1NOb2RlSW1wbCkgaS5uZXh0KCk7Ci0JCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXNocmlua0NvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpOwotCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCB8fCBmQ3JlYXRpb25Db250ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwRGVsZXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJc2hvcnQgdXBkYXRlTW9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFVwZGF0ZU1vZGUoKTsKLQkJCWlmICh1cGRhdGVNb2RlID09IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRSkgewotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcmV0ZW5kUmVtb3ZlTm9kZSgpOwotCQkJfQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QoZkRlbGV0aW9uQ29udGV4dC5nZXRSZW1vdmVkUmFuZ2VCZWdpbigpLCBmRGVsZXRpb25Db250ZXh0LmdldFJlbW92ZWRSYW5nZUVuZCgpKTsKLQkJCWNsZWFudXBEZWxldGlvbkNvbnRleHQoKTsKLQkJfQotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwQ3JlYXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQl9Ci0KLQkJLy8gbWFrZSBkb2N1bWVudCBob2xkIHdob2xlIHN0cnVjdHVyZWREb2N1bWVudAotCQkvKgotCQkgKiBib29sZWFuIGJVcGRhdGUgPSBmYWxzZTsgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJICogZmxhdE5vZGUgPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgYlVwZGF0ZSA9Ci0JCSAqIGJVcGRhdGUgfHwgKGZsYXROb2RlID09IG51bGwgfHwKLQkJICogZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmxhdE5vZGUpIHx8Ci0JCSAqIGZsYXROb2RlLmdldFByZXZpb3VzKCkgIT0gbnVsbCk7IGZsYXROb2RlID0KLQkJICogZkRvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgYlVwZGF0ZSA9IGJVcGRhdGUgfHwKLQkJICogKGZsYXROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmxhdE5vZGUpIHx8Ci0JCSAqIGZsYXROb2RlLmdldE5leHQoKSAhPSBudWxsKTsKLQkJICovCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpZkRvY3VtZW50KS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCS8qIH0gKi8KLQotCQkvLyByZW1vdmUgaW4gb2ZmaWNpYWwgcmVsZWFzZQotCQkvLyBDU1NNb2RlbFV0aWwuZGlhZ25vc2VUcmVlKGZEb2N1bWVudCwKLQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobmV3UmVnaW9ucyA9PSBudWxsIHx8IG9sZFJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRDcmVhdGlvblRhcmdldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgfHwgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPD0gMCkgewotCQkJLy8gdG9wIG9mIGRvY3VtZW50Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUoZkRvY3VtZW50KTsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUoZkRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUNTU05vZGVJbXBsIGN1cnNvck5vZGUgPSBnZXROb2RlQXQoY3Vyc29yUG9zKTsKLQkJaWYgKGN1cnNvck5vZGUgPT0gbnVsbCkgeyAvLyBlbmQgb2YgZG9jdW1lbnQKLQkJCWN1cnNvck5vZGUgPSAoQ1NTTm9kZUltcGwpZkRvY3VtZW50OwotCQl9Ci0KLQkJLy8gZmluZCBlZGdlIG9mIHRyZWUgbm9kZQotCQlDU1NOb2RlSW1wbCBub2RlID0gbnVsbDsKLQkJLy8gYm9vbGVhbiBiT3ZlclNlbWlDb2xvbiA9IGZhbHNlOwotCQlib29sZWFuIGJPdmVyT3BlbkJyYWNlID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCWZvciAoZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247IGZsYXROb2RlICE9IG51bGw7IGZsYXROb2RlID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKSkgewotCQkJbm9kZSA9IGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlub2RlID0gKENTU05vZGVJbXBsKWZEb2N1bWVudDsKLQkJCX0KLQkJCWlmIChub2RlICE9IGN1cnNvck5vZGUgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChmbGF0Tm9kZSAhPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCQkJLy8gaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fAotCQkJCS8vIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCS8vIGJPdmVyU2VtaUNvbG9uID0gdHJ1ZTsKLQkJCQkvLyB9IGVsc2UKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCWJPdmVyT3BlbkJyYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCB0YXJnZXROb2RlID0gbnVsbDsKLQotCQkvLyBpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkvLyB2PC0tfAotCQkvLyBBQUFBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkEgLCBub2RlOkIgLT4gdGFyZ2V0IGlzIEEKLQkJLy8gdGFyZ2V0Tm9kZSA9IChub2RlID09IG51bGwpID8gZkRvY3VtZW50IDogbm9kZTsKLQkJLy8gfSBlbHNlCi0JCWlmIChjdXJzb3JOb2RlID09IG5vZGUpIHsKLQkJCS8vIHY8LS18Ci0JCQkvLyBBQUFBQUEKLQkJCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCQlpZiAoYk92ZXJPcGVuQnJhY2UgJiYgY3Vyc29yTm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgKChDU1NSdWxlRGVjbENvbnRhaW5lcikgY3Vyc29yTm9kZSkuZ2V0U3R5bGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldE5vZGUgPSBjdXJzb3JOb2RlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdjwtLXwKLQkJCS8vIEFBQQotCQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkIgLCBub2RlOkEgLT4gZGVwZW5kIG9uIEEncyBub2RlIHR5cGUKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJCS8vIHRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpKChiT3ZlclNlbWlDb2xvbikgPwotCQkJCS8vIG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSk7IC8vIE5QCi0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJCXRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXROb2RlID0gbm9kZTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZSh0YXJnZXROb2RlKTsKLQkJSUNTU05vZGUgbmV4dCA9IG51bGw7Ci0JCWlmICh0YXJnZXROb2RlLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgJiYgY3Vyc29yUG9zIDwgKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCW5leHQgPSBjaGlsZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRSZXBhcnNlUmFuZ2UoKSB7Ci0JCWZDcmVhdGlvbkNvbnRleHQuY2xlYXIoKTsKLQl9Ci0KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyID09IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKCk7Ci0JCX0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pbml0aWFsaXplKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiByZWdpb25zOiBzdXJyb3VuZGluZyBzcGFjZXMgc2hvdWxkIGJlIHJlbW92ZWQuIFEuIFdoeSBkaWQgeW91IHNldAotCSAqIG1lZGlhVGFibGUgPyBBLiBNZWRpYUxpc3QgbWF5IGhhdmUgdHdvIG9yIG1vcmUgbWVkaXVtIHRoYXQgaGF2ZSBzYW1lCi0JICogdmFsdWUsIHRoZW4gc2VhcmNpbmcgaW4gTWVkaWFMaXN0IGlzIG5vdCBwZXJmZWN0LiBRLgotCSAqIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgaXMgbm90IGNhcmUuIEFyZSB5b3UgT0s/IEEuIE9LLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZWRpYUxpc3QoTWVkaWFMaXN0SW1wbCBtZWRpYUxpc3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMpIHsKLQkJaWYgKG1lZGlhTGlzdCA9PSBudWxsIHx8IHRleHRSZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDb2xsZWN0aW9uIG1lZGlhVGFibGUgPSBuZXcgSGFzaFNldCgpOwotCQlDU1NOb2RlTGlzdEltcGwgYXR0cnMgPSBtZWRpYUxpc3QuZ2V0TWVkaWEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJbWVkaWFUYWJsZS5hZGQoYXR0cnMuaXRlbShpKSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBzdGFydCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGVuZCA9IG51bGw7Ci0KLQkJSXRlcmF0b3IgaSA9IHRleHRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSAoSVRleHRSZWdpb24pICgoaS5oYXNOZXh0KCkpID8gaS5uZXh0KCkgOiBudWxsKTsKLQkJd2hpbGUgKHRleHRSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJVU0pIHsKLQkJCQlTdHJpbmcgbWVkaXVtU3RyID0gcmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCQkJaWYgKDAgPCBtZWRpdW1TdHIubGVuZ3RoKCkpIHsKLQkJCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQkJCS8vIGlzIHRoZSBtZWRpdW0gYWxyZWFkeSBzZXQgPwotCQkJCQlJdGVyYXRvciBpVGFibGUgPSBtZWRpYVRhYmxlLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpVGFibGUuaGFzTmV4dCgpKSB7Ci0JCQkJCQlDU1NBdHRySW1wbCBjYWkgPSAoQ1NTQXR0ckltcGwpIGlUYWJsZS5uZXh0KCk7Ci0JCQkJCQlpZiAobWVkaXVtU3RyLmVxdWFsc0lnbm9yZUNhc2UoY2FpLmdldFZhbHVlKCkpKSB7Ci0JCQkJCQkJYXR0ciA9IGNhaTsKLQkJCQkJCQltZWRpYVRhYmxlLnJlbW92ZShjYWkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIGlzIG5vdCBzZXQuIGNyZWF0ZSBuZXcgYXR0cmlidXRlCi0JCQkJCQlTdHJpbmcga2V5ID0gIm1lZGl1bVAiICsgbWVkaWFMaXN0Lm1lZGl1bUNvdW50ZXIrKzsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWVkaWFMaXN0LnNldEF0dHJpYnV0ZShrZXksIG1lZGl1bVN0cik7Ci0JCQkJCQlhdHRyID0gbWVkaWFMaXN0LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJCQkJfQotCQkJCQlhdHRyLnNldFJhbmdlUmVnaW9uKHJlZ2lvbiwgdGV4dFJlZ2lvbiwgdGV4dFJlZ2lvbik7Ci0JCQkJCWlmIChzdGFydCA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydCA9IHRleHRSZWdpb247Ci0JCQkJCX0KLQkJCQkJZW5kID0gdGV4dFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSAoKGkuaGFzTmV4dCgpKSA/IGkubmV4dCgpIDogbnVsbCk7Ci0JCX0KLQotCQlpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJbWVkaWFMaXN0LnNldFJhbmdlUmVnaW9uKHJlZ2lvbiwgc3RhcnQsIGVuZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBDcmVhdGlvbkNvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJcmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQkJcmVzZXRDcmVhdGlvblRhcmdldChyZWdpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cERlbGV0aW9uQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWZEZWxldGlvbkNvbnRleHQuc2V0dXBDb250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0dXBVcGRhdGVDb250ZXh0KHNob3J0IHVwZGF0ZU1vZGUsIElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIHRhcmdldE5vZGUpIHsKLQkJZlVwZGF0ZUNvbnRleHQuc2V0dXBDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIHRhcmdldE5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2hyaW5rQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQkJYk1vZGlmaWVkID0gYk1vZGlmaWVkIHx8IGNsZWFudXBMYXN0Tm9kZShjaGlsZC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHBhcmVudCk7Ci0JCWJNb2RpZmllZCA9IGJNb2RpZmllZCB8fCBjbGVhbnVwRmlyc3ROb2RlKGNoaWxkLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHBhcmVudCk7Ci0KLQkJaWYgKGJNb2RpZmllZCkgewotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChjaGlsZCAhPSBub2RlICYmIG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJY2hpbGQuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ0OTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHsKLQotCi0JY2xhc3MgQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQkJcHVibGljIENTU05vZGVVcGRhdGVUcmF2ZXJzZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JCQlzZXRUcmF2ZXJzZUltcG9ydEZpcnN0KGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBMaW5rZWRMaXN0IGdldE5vZGVMaXN0KCkgewotCQkJcmV0dXJuIGZUcmF2Tm9kZUxpc3Q7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCQlmVHJhdk5vZGVMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU0F0dHJJbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB7Ci0JCQkJLy8gc2tpcAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlRyYXZOb2RlTGlzdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZUNvbnRhaW5lcikgewotCQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJCX0KLQkJfQotCi0JCUxpbmtlZExpc3QgZlRyYXZOb2RlTGlzdCA9IG51bGw7Ci0JfQotCi0JSUNTU05vZGUgZkxhc3ROb2RlID0gbnVsbDsKLQlJQ1NTTm9kZSBmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBudWxsOwotCUlDU1NOb2RlIGZEZWxldGlvblRhcmdldCA9IG51bGw7Ci0JTGlua2VkTGlzdCBmTm9kZUxpc3QgPSBudWxsOwotCXByaXZhdGUgc2hvcnQgZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lETEUgPSAwOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSID0gMTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSID0gMjsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUiA9IDM7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9SRU1PVkVfUkNPTlRBSU5FUiA9IDQ7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUiA9IDU7Ci0KLQkvKioKLQkgKiBDU1NOb2RlVXBkYXRlUXVldWUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjbGVhbnVwQ29udGV4dCgpIHsKLQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVySW1wbCBnZXRDb3VudGVyKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENvdW50ZXJJbXBsKSB7Ci0JCQlyZXR1cm4gKENvdW50ZXJJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ291bnRlckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCBnZXRDU1NDaGFyc2V0UnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NDaGFyc2V0UnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTQ2hhcnNldFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTQ2hhcnNldFJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsIGdldENTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ZvbnRGYWNlUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NGb250RmFjZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbCBnZXRDU1NJbXBvcnRSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ltcG9ydFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTSW1wb3J0UnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwgZ2V0Q1NTTWVkaWFSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTTWVkaWFSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU01lZGlhUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCBnZXRDU1NQYWdlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQYWdlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTUGFnZVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUGFnZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgdHlwZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSAoKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZSkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IHR5cGUgfHwgKChub2RlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIHx8IG5vZGVUeXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikgJiYgKHR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiB8fCB0eXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikpKSB7Ci0JCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZTsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBbIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiXSBpcyBleHBlY3RlZCwgYnV0IHR5cGUgaXMgWyIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgKyAiXTogXCIiICsgdmFsdWUuZ2VuZXJhdGVTb3VyY2UoKSArICJcIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwoIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJfQotCi0JCXVuZ2V0Tm9kZSgpOwotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlQW55KCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGdldENTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsICYmICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGUpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIChDU1NTdHlsZURlY2xJdGVtSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlRGVjbEl0ZW1JbXBsKCIgKyBwcm9wZXJ0eU5hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsvLyROT04tTkxTLTEkCi0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwgZ2V0Q1NTU3R5bGVSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTU3R5bGVSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlJQ1NTTm9kZSBnZXREZWxldGlvblRhcmdldCgpIHsKLQkJcmV0dXJuIGZEZWxldGlvblRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0RGVsZXRpb25UYXJnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25UYXJnZXRQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXROb2RlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGZOb2RlTGlzdCAhPSBudWxsICYmIDAgPCBmTm9kZUxpc3Quc2l6ZSgpKSB7Ci0JCQlub2RlID0gKElDU1NOb2RlKSBmTm9kZUxpc3QucmVtb3ZlRmlyc3QoKTsKLQkJfQotCQlmTGFzdE5vZGUgPSBub2RlOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0Tm9kZUNvdW50KCkgewotCQlpZiAoZk5vZGVMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBmTm9kZUxpc3Quc2l6ZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkvLyByZXR1cm4gZlBhcmVudE5vZGU7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCVJlY3RJbXBsIGdldFJlY3QoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUmVjdEltcGwpIHsKLQkJCXJldHVybiAoUmVjdEltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSZWN0SW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JUkdCQ29sb3JJbXBsIGdldFJHQkNvbG9yKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJHQkNvbG9ySW1wbCkgewotCQkJcmV0dXJuIChSR0JDb2xvckltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSR0JDb2xvckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRVcGRhdGVNb2RlKCkgewotCQlyZXR1cm4gZlVwZGF0ZU1vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmTm9kZUxpc3QgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cENvbnRleHQoc2hvcnQgdXBkYXRlTW9kZSwgSUNTU05vZGUgcGFyZW50Tm9kZSwgSUNTU05vZGUgdGFyZ2V0Tm9kZSkgewotCQlmVXBkYXRlTW9kZSA9IHVwZGF0ZU1vZGU7Ci0KLQkJSUNTU05vZGUgdHJhdmVyc2VSb290OwotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIpIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHBhcmVudE5vZGU7Ci0JCQl3aGlsZSAodHJhdmVyc2VSb290IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhdmVyc2VSb290ID0gdHJhdmVyc2VSb290LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHRhcmdldE5vZGU7Ci0JCX0KLQotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmbGF0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUikgewotCQkJZkRlbGV0aW9uVGFyZ2V0ID0gdHJhdmVyc2VSb290OwotCQkJaWYgKGZEZWxldGlvblRhcmdldCA9PSB0YXJnZXROb2RlKSB7Ci0JCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gcGFyZW50Tm9kZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IGZEZWxldGlvblRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmRGVsZXRpb25UYXJnZXQgPSBudWxsOwotCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJfQotCi0JCWlmICh1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfRk5DT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlbW92ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA9PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZS1pbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxhdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSKSB7Ci0JCQlDU1NOb2RlVXBkYXRlVHJhdmVyc2VyIHRyYXZlcnNlciA9IG5ldyBDU1NOb2RlVXBkYXRlVHJhdmVyc2VyKCk7Ci0JCQl0cmF2ZXJzZXIuYXBwbHkodHJhdmVyc2VSb290KTsKLQkJCWZOb2RlTGlzdCA9IHRyYXZlcnNlci5nZXROb2RlTGlzdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmdldE5vZGUoKSB7Ci0JCWlmIChmTm9kZUxpc3QgIT0gbnVsbCAmJiBmTGFzdE5vZGUgIT0gbnVsbCkgewotCQkJZk5vZGVMaXN0LmFkZEZpcnN0KGZMYXN0Tm9kZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDgwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkF0dHJDaGFuZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVcGRhdGVyIHsKLQotCXByaXZhdGUgQ1NTTW9kZWxJbXBsIGZNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFBhcnNlciBmUGFyc2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENTU01vZGVsVXBkYXRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsVXBkYXRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZXIoQ1NTTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGF0dHJJbnNlcnRlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NBdHRySW1wbCBhdHRyKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHBhcmVudE5vZGUpOwotCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ2Fubm90IGdldCBmb3JtYXQgYWRhcHRlciA6ICIgKyBwYXJlbnROb2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSU5TRVJUX1JDT05UQUlORVI7Ci0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIGF0dHIpOwotCi0JCS8vIGdldCBmb3JtYXR0ZWQgaW5mbwotCQlBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24gPSBuZXcgQXR0ckNoYW5nZUNvbnRleHQoKTsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGZvcm1hdHRlci5mb3JtYXRBdHRyQ2hhbmdlZChwYXJlbnROb2RlLCBhdHRyLCB0cnVlLCByZWdpb24pKTsKLQotCQkvLyBzZXQgdGV4dAotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBpbnNlcnRUZXh0KHJlZ2lvbi5zdGFydCwgcmVnaW9uLmVuZCAtIHJlZ2lvbi5zdGFydCwgdGV4dCk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRyUmVtb3ZlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NBdHRySW1wbCBhdHRyKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHBhcmVudE5vZGUpOwotCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ2Fubm90IGdldCBmb3JtYXQgYWRhcHRlciA6ICIgKyBwYXJlbnROb2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfUkVNT1ZFX1JDT05UQUlORVI7Ci0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIGF0dHIpOwotCi0JCS8vIGdldCBmb3JtYXR0ZWQgaW5mbwotCQlBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24gPSBuZXcgQXR0ckNoYW5nZUNvbnRleHQoKTsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGZvcm1hdHRlci5mb3JtYXRBdHRyQ2hhbmdlZChwYXJlbnROb2RlLCBhdHRyLCBmYWxzZSwgcmVnaW9uKSk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gaW5zZXJ0VGV4dChyZWdpb24uc3RhcnQsIHJlZ2lvbi5lbmQgLSByZWdpb24uc3RhcnQsIHRleHQpOwotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2xkQXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyUmVtb3ZlZChwYXJlbnROb2RlLCAoQ1NTQXR0ckltcGwpIG9sZEF0dHIpOwotCQl9Ci0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJYXR0ckluc2VydGVkKHBhcmVudE5vZGUsIChDU1NBdHRySW1wbCkgbmV3QXR0cik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hpbGRJbnNlcnRlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lETEU7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9GTkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JTlNFUlRfUkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIldoYXQncyB0aGlzIG5vZGU/IDogIiArIG5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBub2RlKTsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBkZWZhdWx0SW5zZXJ0ZWQocGFyZW50Tm9kZSwgbm9kZSk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hpbGRSZW1vdmVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfUkVNT1ZFX0ZOQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiV2hhdCdzIHRoaXMgbm9kZT8gOiAiICsgbm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIG5vZGUpOwotCi0JCUNTU05vZGVJbXBsIHByZXYgPSBnZXRPbGRQcmV2aW91cyhwYXJlbnROb2RlLCBub2RlKTsKLQkJQ1NTTm9kZUltcGwgbmV4dCA9IGdldE9sZE5leHQocGFyZW50Tm9kZSwgbm9kZSk7Ci0JCWludCBpbnNlcnRQb3MgPSAtMSwgZW5kUG9zID0gLTE7Ci0JCVN0cmluZyBzb3VyY2UgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCWluc2VydFBvcyA9IHByZXYuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRQb3MgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnNlcnRQb3MgLT0gbmVhcmVzdFNwYWNlTGVuZ3RoQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJZW5kUG9zID0gbmV4dC5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZW5kUG9zID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCWVuZFBvcyArPSBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihwYXJlbnROb2RlLCBlbmRQb3MpOwotCQl9Ci0JCXNvdXJjZSA9IGdldFNwYWNlQmVmb3JlKHBhcmVudE5vZGUsIG5leHQsIG5vZGUpOwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0JCWlmIChzb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSBpbnNlcnRUZXh0KGluc2VydFBvcywgZW5kUG9zIC0gaW5zZXJ0UG9zLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gcmVtb3ZlVGV4dChpbnNlcnRQb3MsIGVuZFBvcyAtIGluc2VydFBvcyk7Ci0JCX0KLQotCQlpbnQgblJlbWFpbnMgPSBmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJaWYgKDAgPCBuUmVtYWlucyAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCQkKLQkJfQotCi0JCS8qCi0JCSAqIGludCByZW1vdmVTdGFydCA9IC0xOyBpbnQgcmVtb3ZlRW5kID0gLTE7IGlmIChub2RlIGluc3RhbmNlb2YKLQkJICogQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCSAqIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPQotCQkgKiAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKW5vZGU7Ci0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0KLQkJICogY29udGFpbmVyLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPQotCQkgKiBjb250YWluZXIuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBpZiAoZmlyc3ROb2RlICE9IG51bGwgJiYKLQkJICogbGFzdE5vZGUgIT0gbnVsbCkgeyByZW1vdmVTdGFydCA9IGZpcnN0Tm9kZS5nZXRTdGFydCgpOyByZW1vdmVFbmQgPQotCQkgKiBsYXN0Tm9kZS5nZXRFbmQoKTsgfSB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJICogQ1NTUmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChDU1NSZWdpb25Db250YWluZXIpbm9kZTsKLQkJICogSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSBjb250YWluZXIuZ2V0Rmlyc3RSZWdpb24oKTsgSVRleHRSZWdpb24KLQkJICogbGFzdFJlZ2lvbiA9IGNvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCk7IGlmIChmaXJzdFJlZ2lvbiAhPSBudWxsICYmCi0JCSAqIGxhc3RSZWdpb24gIT0gbnVsbCkgeyByZW1vdmVTdGFydCA9IGZpcnN0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCSAqIHJlbW92ZUVuZCA9IGxhc3RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7IH0gfSBpZiAoMCA8PSByZW1vdmVTdGFydCAmJgotCQkgKiAwIDw9IHJlbW92ZUVuZCkgeyByZW1vdmVUZXh0KHJlbW92ZVN0YXJ0LCByZW1vdmVFbmQgLSByZW1vdmVTdGFydCArCi0JCSAqIDEpOyB9Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2hpbGRSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9sZENoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkUmVtb3ZlZChwYXJlbnROb2RlLCBvbGRDaGlsZCk7Ci0JCX0KLQotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGRJbnNlcnRlZChwYXJlbnROb2RlLCBuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGRlZmF1bHRJbnNlcnRlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCWludCBpbnNlcnRQb3MgPSAtMTsKLQkJSUNTU05vZGUgc2libGluZzsKLQkJU3RyaW5nIHByZVNwYWNlID0gIiIsIHBvc3RTcGFjZSA9ICIiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSAwOwotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQlpZiAoKHNpYmxpbmcgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpKSAhPSBudWxsKSB7Ci0JCQkJLy8gYWZ0ZXIgcHJldmlvdXMgY2hpbGQKLQkJCQlpbnNlcnRQb3MgPSBnZXRUZXh0RW5kKHNpYmxpbmcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCWlmICgoc2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgIT0gbnVsbCkgewotCQkJCS8vIGJlZm9yZSBuZXh0IGNoaWxkCi0JCQkJaW5zZXJ0UG9zID0gZ2V0VGV4dFN0YXJ0KHNpYmxpbmcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCS8vIHBvc2l0aW9uIG9mIHBhcmVudAotCQkJaW5zZXJ0UG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3MocGFyZW50Tm9kZSk7Ci0JCX0KLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJLy8gZmlyc3R0aW1lCi0JCQlpbnNlcnRQb3MgPSAwOwotCQl9Ci0KLQkJLy8gZm9ybWF0IHByZXZpb3VzIHNwYWNlcwotCQlsZW5ndGggPSBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0UG9zKTsKLQkJaW5zZXJ0UG9zIC09IGxlbmd0aDsKLQkJcHJlU3BhY2UgPSBnZXRTcGFjZUJlZm9yZShwYXJlbnROb2RlLCBub2RlLCBudWxsKTsKLQkJLy8gZm9ybWF0IHBvc3Qgc3BhY2VzCi0JCWxlbmd0aCArPSBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihwYXJlbnROb2RlLCBpbnNlcnRQb3MgKyBsZW5ndGgpOwotCQlwb3N0U3BhY2UgPSBnZXRTcGFjZUJlZm9yZShwYXJlbnROb2RlLCBub2RlLmdldE5leHRTaWJsaW5nKCksIG51bGwpOwotCi0JCS8vIHNldCB0ZXh0Ci0JCVN0cmluZyB0ZXh0ID0gcHJlU3BhY2UgKyBub2RlLmdlbmVyYXRlU291cmNlKCkudHJpbSgpICsgcG9zdFNwYWNlOwotCQlyZXR1cm4gaW5zZXJ0VGV4dChpbnNlcnRQb3MsIGxlbmd0aCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGZvcm1hdHRlci5nZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZ2V0T2xkTmV4dChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCUNTU05vZGVJbXBsIGNoaWxkID0gKENTU05vZGVJbXBsKSBwYXJlbnROb2RlLmdldExhc3RDaGlsZCgpOwotCQlDU1NOb2RlSW1wbCByZXQgPSBudWxsOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0RW5kT2Zmc2V0KCkgPCBjaGlsZC5nZXRFbmRPZmZzZXQoKSkKLQkJCQlyZXQgPSBjaGlsZDsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJCWNoaWxkID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGdldE9sZFByZXZpb3VzKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgY2hpbGQgPSAoQ1NTTm9kZUltcGwpIHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlDU1NOb2RlSW1wbCByZXQgPSBudWxsOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpCi0JCQkJcmV0ID0gY2hpbGQ7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljaGlsZCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3BhY2VCZWZvcmUoSUNTU05vZGUgcGFyZW50Tm9kZSwgSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgdG9SZW1vdmUpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIHBhcmVudE5vZGUpOwotCi0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGV4Y2VwdEZvciA9IG51bGw7Ci0JCQlpZiAodG9SZW1vdmUgIT0gbnVsbCkgewotCQkJCUNTU05vZGVJbXBsIHJlbW92ZSA9IChDU1NOb2RlSW1wbCkgdG9SZW1vdmU7Ci0JCQkJZXhjZXB0Rm9yID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uKHJlbW92ZS5nZXRTdGFydE9mZnNldCgpLCByZW1vdmUuZ2V0RW5kT2Zmc2V0KCkgLSByZW1vdmUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZm9ybWF0dGVyLmZvcm1hdEJlZm9yZShwYXJlbnROb2RlLCBub2RlLCBleGNlcHRGb3IpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBnZXRUZXh0RW5kKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IGVuZCA9IC0xOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWVuZCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCQllbmQgPSAoKENTU1JlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBnZXRUZXh0U3RhcnQoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgc3RhcnQgPSAtMTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlzdGFydCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJCXN0YXJ0ID0gKChDU1NSZWdpb25Db250YWluZXIpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgaW5zZXJ0VGV4dChpbnQgc3RhcnQsIGludCBvbGRMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUJhc2ljU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgMCA8IG9sZExlbmd0aCAmJiBzdGFydCArIG9sZExlbmd0aCA8PSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkvLyBtaW5pbWl6ZSB0ZXh0IGNoYW5nZQotCQkJCVN0cmluZyBkZWxUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldChzdGFydCwgb2xkTGVuZ3RoKTsKLQkJCQlpbnQgbmV3TGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLQkJCQlpbnQgc2hvcnRlckxlbiA9IE1hdGgubWluKG9sZExlbmd0aCwgbmV3TGVuZ3RoKTsKLQkJCQlpbnQgc3RNYXRjaExlbjsKLQkJCQlmb3IgKHN0TWF0Y2hMZW4gPSAwOyBzdE1hdGNoTGVuIDwgc2hvcnRlckxlbiAmJiB0ZXh0LmNoYXJBdChzdE1hdGNoTGVuKSA9PSBkZWxUZXh0LmNoYXJBdChzdE1hdGNoTGVuKTsgc3RNYXRjaExlbisrKSB7Ci0JCQkJCS8vIAotCQkJCX0KLQkJCQlpZiAoMCA8IHN0TWF0Y2hMZW4gJiYgc3RNYXRjaExlbiA8IHNob3J0ZXJMZW4gJiYgdGV4dC5jaGFyQXQoc3RNYXRjaExlbiAtIDEpID09IDB4MDAwZCAmJiAodGV4dC5jaGFyQXQoc3RNYXRjaExlbikgPT0gMHgwMDBhIHx8IGRlbFRleHQuY2hhckF0KHN0TWF0Y2hMZW4pID09IDB4MDAwYSkpIHsKLQkJCQkJLy8gbXVzdCBub3QgZGl2aWRlIDBkLT4wYSBzZXF1ZW5jZQotCQkJCQlzdE1hdGNoTGVuLS07Ci0JCQkJfQotCQkJCWlmIChzdE1hdGNoTGVuID09IHNob3J0ZXJMZW4pIHsKLQkJCQkJaWYgKG9sZExlbmd0aCA8IG5ld0xlbmd0aCkgeyAvLyBqdXN0IGluc2VydAotCQkJCQkJb2xkTGVuZ3RoID0gMDsKLQkJCQkJCXN0YXJ0ICs9IHN0TWF0Y2hMZW47Ci0JCQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RNYXRjaExlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobmV3TGVuZ3RoIDwgb2xkTGVuZ3RoKSB7IC8vIGp1c3QgcmVtb3ZlCi0JCQkJCQlvbGRMZW5ndGggLT0gc3RNYXRjaExlbjsKLQkJCQkJCXN0YXJ0ICs9IHN0TWF0Y2hMZW47Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCQllbHNlIHsgLy8gbm90aGluZyB0byBkbwotCQkJCQkJb2xkTGVuZ3RoID0gMDsKLQkJCQkJCXRleHQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnQgZWRNYXRjaExlbjsKLQkJCQkJZm9yIChlZE1hdGNoTGVuID0gMDsgc3RNYXRjaExlbiArIGVkTWF0Y2hMZW4gPCBzaG9ydGVyTGVuICYmIHRleHQuY2hhckF0KG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4gLSAxKSA9PSBkZWxUZXh0LmNoYXJBdChvbGRMZW5ndGggLSBlZE1hdGNoTGVuIC0gMSk7IGVkTWF0Y2hMZW4rKykgewotCQkJCQkJLy8KLQkJCQkJfQotCQkJCQlpZiAoMCA8IGVkTWF0Y2hMZW4gJiYgdGV4dC5jaGFyQXQobmV3TGVuZ3RoIC0gZWRNYXRjaExlbikgPT0gMHgwMDBhICYmICgoZWRNYXRjaExlbiA8IG5ld0xlbmd0aCAmJiB0ZXh0LmNoYXJBdChuZXdMZW5ndGggLSBlZE1hdGNoTGVuIC0gMSkgPT0gMHgwMDBkKSB8fCAoZWRNYXRjaExlbiA8IG9sZExlbmd0aCAmJiBkZWxUZXh0LmNoYXJBdChvbGRMZW5ndGggLSBlZE1hdGNoTGVuIC0gMSkgPT0gMHgwMDBkKSkpIHsKLQkJCQkJCS8vIG11c3Qgbm90IGRpdmlkZSAwZC0+MGEgc2VxdWVuY2UKLQkJCQkJCWVkTWF0Y2hMZW4tLTsKLQkJCQkJfQotCQkJCQlvbGRMZW5ndGggLT0gc3RNYXRjaExlbiArIGVkTWF0Y2hMZW47Ci0JCQkJCXN0YXJ0ICs9IHN0TWF0Y2hMZW47Ci0JCQkJCWlmIChzdE1hdGNoTGVuICsgZWRNYXRjaExlbiA8IG5ld0xlbmd0aCkgewotCQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0TWF0Y2hMZW4sIG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoMCA8IG9sZExlbmd0aCB8fCB0ZXh0ICE9IG51bGwpIHsKLQkJCQkvLyBTdHJpbmcgZGVsVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIG9sZExlbmd0aCk7Ci0JCQkJcmVzdWx0ID0gc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGZNb2RlbCwgc3RhcnQsIG9sZExlbmd0aCwgdGV4dCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByaXZhdGUgaW50IG5lYXJlc3RTcGFjZUxlbmd0aEFmdGVyKENTU05vZGVJbXBsIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm9kZSk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZSwgaW5zZXJ0UG9zKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByaXZhdGUgaW50IG5lYXJlc3RTcGFjZUxlbmd0aEJlZm9yZShDU1NOb2RlSW1wbCBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vZGUpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLCBpbnNlcnRQb3MpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVtb3ZlVGV4dChpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGZNb2RlbCwgc3RhcnQsIGxlbmd0aCwgbmV3IFN0cmluZygiIikpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0UGFyc2VyKENTU01vZGVsUGFyc2VyIHBhcnNlcikgewotCQlmUGFyc2VyID0gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgdmFsdWVDaGFuZ2VkKENTU05vZGVJbXBsIG5vZGUsIFN0cmluZyBvbGRWYWx1ZSkgewotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSkgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiVG9vIEJhZC4uIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSgobm9kZSA9PSBudWxsKSA/ICJudWxsIiA6IG5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlOwotCQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIGF0dHIuZ2V0T3duZXJDU1NOb2RlKCkpOwotCQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKQotCQkJCXN0YXJ0ID0gZm9ybWF0dGVyLmdldEF0dHJJbnNlcnRQb3MoYXR0ci5nZXRPd25lckNTU05vZGUoKSwgYXR0ci5nZXROYW1lKCkpOwotCQl9Ci0KLQkJaW50IG9sZExlbmd0aCA9IChvbGRWYWx1ZSA9PSBudWxsKSA/IDAgOiBvbGRWYWx1ZS5sZW5ndGgoKTsKLQkJLy8gZmxhc2ggb2xkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24vSVRleHRSZWdpb24KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5zZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCSgoQ1NTUmVnaW9uQ29udGFpbmVyKSBub2RlKS5zZXRSYW5nZVJlZ2lvbihudWxsLCBudWxsLCBudWxsKTsKLQkJfQotCQkvLyBnZW5lcmF0ZSBuZXcgc291cmNlCi0JCVN0cmluZyBuZXdWYWx1ZSA9IG5vZGUuZ2VuZXJhdGVTb3VyY2UoKTsKLQotCQlJQ1NTTm9kZSBwYXJlbnQ7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFKSB7Ci0JCQlwYXJlbnQgPSAoKElDU1NBdHRyKSBub2RlKS5nZXRPd25lckNTU05vZGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0KLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQoQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9DSEFOR0VfUkNPTlRBSU5FUiwgcGFyZW50LCBub2RlKTsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBpbnNlcnRUZXh0KHN0YXJ0LCBvbGRMZW5ndGgsIG5ld1ZhbHVlKTsKLQotCQlpbnQgblJlbWFpbnMgPSBmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJaWYgKDAgPCBuUmVtYWlucyAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCQkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0ZTVkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUnVsZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGNhbkNvbnRhaW5CcmFjZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIChub2RlIGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlzdGF0aWMgdm9pZCBjbGVhbnVwQ29udGFpbmVyKElDU1NOb2RlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQljbGVhbnVwQ29udGFpbmVyKGNoaWxkKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCSgoQ1NTUmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLnNldFJhbmdlUmVnaW9uKG51bGwsIG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gZGlhZ25vc2VOb2RlKElDU1NOb2RlIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJLy8gY2hlY2sgdGhpcwotCQlWZWN0b3IgZXJyb3JzID0gbmV3IFZlY3RvcigpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiOiAiOy8vJE5PTi1OTFMtMSQKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8xY29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgZmxhdCBub2RlIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBtb2RlbE5vZGUpIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzJjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fM2NvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgZmxhdCBub2RlIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBtb2RlbE5vZGUpIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzRjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCUNTU1JlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1JlZ2lvbkNvbnRhaW5lcikgcGFyZW50OwotCQkJU3RyaW5nIG5vZGVUZXh0ID0gQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSArICI6ICI7Ly8kTk9OLU5MUy0xJAotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24gPSBub2RlLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIE1lZGlhTGlzdEltcGwpIHx8IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzI1Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzI2Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQkJcmVnaW9uID0gbm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIE1lZGlhTGlzdEltcGwpIHx8IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzI3Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCByZWdpb24gaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fMjhjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlDU1NOb2RlTGlzdCBhdHRycyA9IHBhcmVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBuQXR0cnMgPSBhdHRycy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCUNTU1JlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1JlZ2lvbkNvbnRhaW5lcikgYXR0cjsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiKCIgKyBhdHRyLmdldE5hbWUoKSArICIpOiAiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiA9IG5vZGUuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAwIDwgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzVjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCByZWdpb24gaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fNmNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmIDAgPCBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fN2NvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzhjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaSA9IGVycm9ycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTVXRpbC5kZWJ1Z091dCgoU3RyaW5nKSBpLm5leHQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXN0YXRpYyBib29sZWFuIGRpYWdub3NlVHJlZShJQ1NTTm9kZSBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGNoZWNrIGNoaWxkcmVuCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWRpYWdub3NlVHJlZShjaGlsZCwgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCi0JCWRpYWdub3NlTm9kZShwYXJlbnQsIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSWYgbmVlZGVkLCBtb2RpZnkgbGFzdCBmbGF0IG5vZGUKLQkgKi8KLQlzdGF0aWMgdm9pZCBleHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChsYXN0Tm9kZSA9PSBmbGF0Tm9kZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlLmdldFN0YXJ0KCkgPCBmbGF0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQl0YXJnZXQuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXN0YXRpYyBJQ1NTTm9kZSBmaW5kQnJhY2VDb250YWluZXIoSUNTU05vZGUgbm9kZSkgewotCQlmb3IgKElDU1NOb2RlIGkgPSBub2RlOyBpICE9IG51bGw7IGkgPSBpLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKENTU01vZGVsVXRpbC5jYW5Db250YWluQnJhY2UoaSkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgaW50IGdldERlcHRoKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IGRlcHRoID0gLTE7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWRlcHRoKys7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzQnJhY2VDbG9zZWQoSUNTU05vZGUgbm9kZSkgewotCQlib29sZWFuIGJDbG9zZWQgPSB0cnVlOwotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdCA9PSBudWxsIHx8IGxhc3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQkJaWYgKGxhc3QuZ2V0U3RhcnQoKSA8IGZpcnN0LmdldFN0YXJ0KCkpIHsKLQkJCXJldHVybiBiQ2xvc2VkOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZpcnN0OwotCQlpbnQgbk9wZW4gPSAwOwotCQlpbnQgbkNsb3NlID0gMDsKLQkJZG8gewotCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCW5PcGVuKys7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQluQ2xvc2UrKzsKLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlICE9IGxhc3QpOwotCi0JCWlmICgobk9wZW4gPT0gMCAmJiBuQ2xvc2UgPT0gMCkgfHwgbkNsb3NlIDwgbk9wZW4pIHsKLQkJCWJDbG9zZWQgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBiQ2xvc2VkOwotCX0KLQotCS8qKgotCSAqIG9ubHkgZm9yIGluc2VydGlvbi4uCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNJbnRlcnJ1cHRpb24oQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3ROb2RlICE9IG51bGwgJiYgZmlyc3ROb2RlLmdldFN0YXJ0KCkgPCBzdGFydCAmJiBsYXN0Tm9kZSAhPSBudWxsICYmIHN0YXJ0IDwgbGFzdE5vZGUuZ2V0U3RhcnQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzUGFyZW50T2YoSUNTU05vZGUgcGFyZW50LCBJQ1NTTm9kZSBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gY2hpbGQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50ID09IG5vZGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkNTEyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTmFtZWROb2RlTWFwSW1wbCBleHRlbmRzIENTU05vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIElDU1NOYW1lZE5vZGVNYXAgewotCi0JLyoqCi0JICogQ1NTTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU05hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIElDU1NOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdCA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ1NTQXR0ckltcGwgJiYgKChDU1NBdHRySW1wbCkgb2JqKS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIChJQ1NTTm9kZSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2M5YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0UnVsZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1NTTm9kZUltcGwgZXh0ZW5kcyBBYnN0cmFjdE5vdGlmaWVyIGltcGxlbWVudHMgSUNTU05vZGUsIEluZGV4ZWRSZWdpb24gewotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgZk93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZlBhcmVudE5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZk5leHRTaWJsaW5nID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZQcmV2aW91c1NpYmxpbmcgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZkZpcnN0Q2hpbGQgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZkxhc3RDaGlsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIENTU05hbWVkTm9kZU1hcEltcGwgZkF0dHJzID0gbnVsbDsKLQotCS8qKgotCSAqIENTU05vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTTm9kZUltcGwoQ1NTTm9kZUltcGwgdGhhdCkgewotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmZPd25lckRvY3VtZW50ID0gdGhhdC5mT3duZXJEb2N1bWVudDsKLQkJCWlmICh0aGF0LmZBdHRycyAhPSBudWxsKSB7Ci0JCQkJaW50IG5BdHRycyA9IHRoYXQuZkF0dHJzLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgdGhhdC5mQXR0cnMuaXRlbShpKTsKLQkJCQkJc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NOb2RlSW1wbCBhcHBlbmRDaGlsZChDU1NOb2RlSW1wbCBuZXdDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG51bGwpOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb25lQ2hpbGROb2RlcyhJQ1NTTm9kZSBuZXdQYXJlbnQsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50ID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTTm9kZUltcGwgY29udGFpbmVyID0gKENTU05vZGVJbXBsKSBuZXdQYXJlbnQ7Ci0JCWNvbnRhaW5lci5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlDU1NOb2RlSW1wbCBjbG9uZWQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmNsb25lTm9kZShkZWVwKTsKLQkJCWlmIChjbG9uZWQgIT0gbnVsbCkKLQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIChnZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCAmJiBvZmZzZXQgPCBnZXRFbmRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZVNvdXJjZSgpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIodGhpcyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHRoaXMpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlDU1NBdHRySW1wbCBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDU1NBdHRySW1wbCBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmQXR0cnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBuQXR0cnMgPSBmQXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIGZBdHRycy5pdGVtKGkpOwotCQkJaWYgKGF0dHIubWF0Y2hOYW1lKG5hbWUpKQotCQkJCXJldHVybiBhdHRyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBJQ1NTTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChmQXR0cnMgPT0gbnVsbCkKLQkJCWZBdHRycyA9IG5ldyBDU1NOYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCXJldHVybiBmQXR0cnM7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlDU1NOb2RlTGlzdEltcGwgbGlzdCA9IG5ldyBDU1NOb2RlTGlzdEltcGwoKTsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWxpc3QuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlJQ1NTTm9kZSBnZXRDb21tb25BbmNlc3RvcihJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKElDU1NOb2RlIG5hID0gbm9kZTsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoSUNTU05vZGUgdGEgPSB0aGlzOyB0YSAhPSBudWxsOyB0YSA9IHRhLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmICh0YSA9PSBuYSkKLQkJCQkJcmV0dXJuIHRhOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCUNTU0RvY3VtZW50SW1wbCBnZXRDb250YWluZXJEb2N1bWVudCgpIHsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gdGhpczsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTRG9jdW1lbnRJbXBsKSB7Ci0JCQkJQ1NTRG9jdW1lbnRJbXBsIGRvYyA9IChDU1NEb2N1bWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGRvYy5pc0RvY3VtZW50KCkpCi0JCQkJCXJldHVybiBkb2M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQ1NTTm9kZUltcGwgZ2V0Q29udGFpbmVyTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmICghY29udGFpbnMob2Zmc2V0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJSUNTU05vZGUgZm91bmQgPSAoKENTU05vZGVJbXBsKSBjaGlsZCkuZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQkJcmV0dXJuIChDU1NOb2RlSW1wbCkgZm91bmQ7Ci0JCX0KLQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlZzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMuZkZpcnN0Q2hpbGQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldExhc3RDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMuZkxhc3RDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmZOZXh0U2libGluZzsKLQl9Ci0KLQlJQ1NTTm9kZSBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQkvLyB0aGUgc2FtZSBhcyBnZXRDb250YWluZXJOb2RlKCkKLQkJcmV0dXJuIGdldENvbnRhaW5lck5vZGUob2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU0RvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZPd25lckRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5mUGFyZW50Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5mUHJldmlvdXNTaWJsaW5nOwotCX0KLQotCUlDU1NOb2RlIGdldFJvb3ROb2RlKCkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSAoQ1NTTm9kZUltcGwpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Um9vdE5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuZkZpcnN0Q2hpbGQgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NOb2RlSW1wbCBpbnNlcnRCZWZvcmUoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIHJlZkNoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IG5ld0NoaWxkOwotCQlDU1NOb2RlSW1wbCBuZXh0ID0gcmVmQ2hpbGQ7Ci0JCUNTU05vZGVJbXBsIHByZXYgPSBudWxsOwotCQlpZiAobmV4dCA9PSBudWxsKSB7Ci0JCQlwcmV2ID0gdGhpcy5mTGFzdENoaWxkOwotCQkJdGhpcy5mTGFzdENoaWxkID0gY2hpbGQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmV2ID0gKENTU05vZGVJbXBsKSBuZXh0LmdldFByZXZpb3VzU2libGluZygpOwotCQkJbmV4dC5zZXRQcmV2aW91c1NpYmxpbmcoY2hpbGQpOwotCQl9Ci0KLQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCXRoaXMuZkZpcnN0Q2hpbGQgPSBjaGlsZDsKLQkJZWxzZQotCQkJcHJldi5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0JCWNoaWxkLnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0JCWNoaWxkLnNldFBhcmVudE5vZGUodGhpcyk7Ci0KLQkJbm90aWZ5Q2hpbGRSZXBsYWNlZChjaGlsZCwgbnVsbCk7Ci0KLQkJcmV0dXJuIG5ld0NoaWxkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUF0dHJSZXBsYWNlZChDU1NOb2RlSW1wbCBuZXdBdHRyLCBDU1NOb2RlSW1wbCBvbGRBdHRyKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmF0dHJSZXBsYWNlZCh0aGlzLCBuZXdBdHRyLCBvbGRBdHRyKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJaW50IHR5cGUgPSBDSEFOR0U7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQl0eXBlID0gUkVNT1ZFOwotCQllbHNlIGlmIChvbGRBdHRyID09IG51bGwpCi0JCQl0eXBlID0gQUREOwotCQlub3RpZnkodHlwZSwgb2xkQXR0ciwgb2xkQXR0ciwgbmV3QXR0ciwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hpbGRSZXBsYWNlZChDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHsKLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNTU01vZGVsSW1wbCBtb2RlbCA9IChDU1NNb2RlbEltcGwpIGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuY2hpbGRSZXBsYWNlZCh0aGlzLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlpbnQgdHlwZSA9IENIQU5HRTsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwpCi0JCQl0eXBlID0gUkVNT1ZFOwotCQllbHNlIGlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IEFERDsKLQkJbm90aWZ5KHR5cGUsIG9sZENoaWxkLCBvbGRDaGlsZCwgbmV3Q2hpbGQsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCXZvaWQgcmVtb3ZlQXR0cmlidXRlTm9kZShDU1NOb2RlSW1wbCBhdHRyKSB7Ci0JCS8vIGZpbmQKLQkJaW50IG5BdHRycyA9IGZBdHRycy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJaWYgKGZBdHRycy5pdGVtKGkpID09IGF0dHIpIHsKLQkJCQlmQXR0cnMucmVtb3ZlTm9kZShpKTsKLQkJCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIHJlbW92ZUNoaWxkKENTU05vZGVJbXBsIG9sZENoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9sZENoaWxkLmdldFBhcmVudE5vZGUoKSAhPSB0aGlzKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2xvc2UgaW1wb3J0IHJ1bGVzCi0JCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCXRyYXYuYXBwbHkob2xkQ2hpbGQpOwotCQlJdGVyYXRvciBpdCA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkoKENTU0ltcG9ydFJ1bGVJbXBsKSBpdC5uZXh0KCkpLmNsb3NlU3R5bGVTaGVldCgpOwotCQl9Ci0KLQkJQ1NTTm9kZUltcGwgY2hpbGQgPSBvbGRDaGlsZDsKLQkJQ1NTTm9kZUltcGwgcHJldiA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCUNTU05vZGVJbXBsIG5leHQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCXRoaXMuZkZpcnN0Q2hpbGQgPSBuZXh0OwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKG5leHQpOwotCi0JCWlmIChuZXh0ID09IG51bGwpCi0JCQl0aGlzLmZMYXN0Q2hpbGQgPSBwcmV2OwotCQllbHNlCi0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcobnVsbCk7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKG51bGwpOwotCi0JCW5vdGlmeUNoaWxkUmVwbGFjZWQobnVsbCwgY2hpbGQpOwotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlbW92ZUNoaWxkTm9kZXMoKSB7Ci0JCUlDU1NOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV4dENoaWxkKSB7Ci0JCQluZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgcmVwbGFjZUNoaWxkKENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCBvbGRDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG5ld0NoaWxkOwotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkKLQkJCWluc2VydEJlZm9yZShuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQlyZXR1cm4gcmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotCX0KLQotCS8qKgotCSAqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NBdHRySW1wbCBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJU3RyaW5nIG9sZFZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChmQXR0cnMgPT0gbnVsbCkKLQkJCQlmQXR0cnMgPSBuZXcgQ1NTTmFtZWROb2RlTWFwSW1wbCgpOwotCQkJQ1NTRG9jdW1lbnRJbXBsIGRvYyA9IChDU1NEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlhdHRyID0gKENTU0F0dHJJbXBsKSBkb2MuY3JlYXRlQ1NTQXR0cihuYW1lKTsKLQkJCWF0dHIuc2V0T3duZXJDU1NOb2RlKHRoaXMpOwotCQkJZkF0dHJzLmFwcGVuZE5vZGUoYXR0cik7Ci0JCQlub3RpZnlBdHRyUmVwbGFjZWQoYXR0ciwgbnVsbCk7Ci0JCX0KLQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNzc1RleHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NUZXh0KFN0cmluZyBjc3NUZXh0KSB7Ci0JCS8vIFRPRE8gOiBjYWxsIGZsYXQgbW9kZWwgcGFyc2VyIGFuZCByZXBsYWNlIG15c2VsZiB3aXRoIG5ldyB0aHJlZSEhCi0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmV4dFNpYmxpbmcoSUNTU05vZGUgbmV4dFNpYmxpbmcpIHsKLQkJdGhpcy5mTmV4dFNpYmxpbmcgPSAoQ1NTTm9kZUltcGwpIG5leHRTaWJsaW5nOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyRG9jdW1lbnQoSUNTU0RvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJdGhpcy5mT3duZXJEb2N1bWVudCA9IChDU1NEb2N1bWVudEltcGwpIG93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmVudE5vZGUoSUNTU05vZGUgcGFyZW50Tm9kZSkgewotCQl0aGlzLmZQYXJlbnROb2RlID0gKENTU05vZGVJbXBsKSBwYXJlbnROb2RlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcmV2aW91c1NpYmxpbmcoSUNTU05vZGUgcHJldmlvdXNTaWJsaW5nKSB7Ci0JCXRoaXMuZlByZXZpb3VzU2libGluZyA9IChDU1NOb2RlSW1wbCkgcHJldmlvdXNTaWJsaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBzdGFydCA9IGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoZW5kID49IDApIHsKLQkJCQlyZXN1bHQgPSBlbmQgLSBzdGFydDsKLQkJCQlpZiAocmVzdWx0IDwgLTEpIHsKLQkJCQkJcmVzdWx0ID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDFjNDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLQotY2xhc3MgQ1NTTm9kZUxpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIElDU1NOb2RlTGlzdCB7Ci0KLQlDU1NOb2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiBpdGVtSW1wbChpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUGFnZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1BhZ2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMxOTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUGFnZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NQYWdlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NQYWdlUnVsZSB7Ci0KLQlJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChudWxsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NQYWdlUnVsZUltcGwoQ1NTUGFnZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NQYWdlUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcHJlU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigiQHBhZ2UgIik7Ly8kTk9OLU5MUy0xJAotCQlwcmVTdHIuYXBwZW5kKGdldFNlbGVjdG9yVGV4dCgpKTsKLQotCQlyZXR1cm4gcHJlU3RyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFBBR0VSVUxFX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gZlNlbGVjdG9yTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFyc2FibGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFnZSBzZWxlY3RvciBmb3IgdGhlIHJ1bGUuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBDU1Mgc3RyaW5nIHZhbHVlIGhhcwotCSAqICAgICAgICAgICAgICAgIGEgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBydWxlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclRleHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VMRUNUT1IpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFBBR0VfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclRleHQoU3RyaW5nIHNlbGVjdG9yVGV4dCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShTRUxFQ1RPUiwgc2VsZWN0b3JUZXh0KTsKLQkJZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKHNlbGVjdG9yVGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg2NWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NQcmltaXRpdmVDb250YWluZXIgZXh0ZW5kcyBDU1NQcmltaXRpdmVWYWx1ZUltcGwgewotCi0JQ1NTUHJpbWl0aXZlQ29udGFpbmVyKENTU1ByaW1pdGl2ZUNvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCUNTU1ByaW1pdGl2ZUNvbnRhaW5lcihzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN1cGVyKHByaW1pdGl2ZVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRQcmltaXRpdmVzKCk7Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRvY3VtZW50KElDU1NEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0KLQkJaW5pdFByaW1pdGl2ZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMmNhODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ291bnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUkdCQ29sb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJlY3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1ByaW1pdGl2ZVZhbHVlIHsKLQotCXByb3RlY3RlZCBzaG9ydCBmUHJpbWl0aXZlVHlwZSA9IENTU19VTktOT1dOOwotCXByaXZhdGUgZmxvYXQgZkZsb2F0VmFsdWUgPSAwLjBmOwotCXByaXZhdGUgU3RyaW5nIGZTdHJpbmdWYWx1ZSA9IG51bGw7Ci0KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJdGhpcy5mUHJpbWl0aXZlVHlwZSA9IHRoYXQuZlByaW1pdGl2ZVR5cGU7Ci0JCXRoaXMuZkZsb2F0VmFsdWUgPSB0aGF0LmZGbG9hdFZhbHVlOwotCQl0aGlzLmZTdHJpbmdWYWx1ZSA9IHRoYXQuZlN0cmluZ1ZhbHVlOwotCX0KLQotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbChzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcmltaXRpdmVUeXBlID0gcHJpbWl0aXZlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2xvbmVkID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBDb3VudGVyIHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIGNvdW50ZXIgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5Db3VudGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgQ291bnRlciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBDb3VudGVyIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX0NPVU5URVI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ291bnRlciBnZXRDb3VudGVyVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpIHsKLQkJcmV0dXJuIGdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGNvZGUgZGVmaW5pbmcgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGFzIGRlZmluZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGdldENzc1ZhbHVlVHlwZSgpIHsKLQkJaWYgKGdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NfSU5IRVJJVF9QUklNSVRJVkUpIHsKLQkJCXJldHVybiBDU1NfSU5IRVJJVDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDU1NfUFJJTUlUSVZFX1ZBTFVFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgYSBmbG9hdCB2YWx1ZSBpbiBhIHNwZWNpZmllZCB1bml0LiBJZiB0aGlzCi0JICogQ1NTIHZhbHVlIGRvZXNuJ3QgY29udGFpbiBhIGZsb2F0IHZhbHVlIG9yIGNhbid0IGJlIGNvbnZlcnRlZCBpbnRvIHRoZQotCSAqIHNwZWNpZmllZCB1bml0LCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0VHlwZQotCSAqICAgICAgICAgICAgQSB1bml0IGNvZGUgdG8gZ2V0IHRoZSBmbG9hdCB2YWx1ZS4gVGhlIHVuaXQgY29kZSBjYW4gb25seQotCSAqICAgICAgICAgICAgYmUgYSBmbG9hdCB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX05VTUJFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEVSQ0VOVEFHRTwvY29kZT4sPGNvZGU+Q1NTX0VNUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRVhTPC9jb2RlPiw8Y29kZT5DU1NfUFg8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0NNPC9jb2RlPiw8Y29kZT5DU1NfTU08L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0lOPC9jb2RlPiw8Y29kZT5DU1NfUFQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BDPC9jb2RlPiw8Y29kZT5DU1NfREVHPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19SQUQ8L2NvZGU+LDxjb2RlPkNTU19HUkFEPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19NUzwvY29kZT4sPGNvZGU+Q1NTX1M8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0haPC9jb2RlPiw8Y29kZT5DU1NfS0haPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19ESU1FTlNJT048L2NvZGU+KS4KLQkgKiBAcmV0dXJuIFRoZSBmbG9hdCB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgZmxvYXQgdmFsdWUgb3IgaWYgdGhlIGZsb2F0IHZhbHVlIGNhbid0IGJlCi0JICogICAgICAgICAgICAgICAgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCB1bml0LgotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKHNob3J0IHVuaXRUeXBlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChmUHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NfTlVNQkVSIDoKLQkJCWNhc2UgQ1NTX1BFUkNFTlRBR0UgOgotCQkJY2FzZSBDU1NfRU1TIDoKLQkJCWNhc2UgQ1NTX0VYUyA6Ci0JCQljYXNlIENTU19QWCA6Ci0JCQljYXNlIENTU19DTSA6Ci0JCQljYXNlIENTU19NTSA6Ci0JCQljYXNlIENTU19JTiA6Ci0JCQljYXNlIENTU19QVCA6Ci0JCQljYXNlIENTU19QQyA6Ci0JCQljYXNlIENTU19ERUcgOgotCQkJY2FzZSBDU1NfUkFEIDoKLQkJCWNhc2UgQ1NTX0dSQUQgOgotCQkJY2FzZSBDU1NfTVMgOgotCQkJY2FzZSBDU1NfUyA6Ci0JCQljYXNlIENTU19IWiA6Ci0JCQljYXNlIENTU19LSFogOgotCQkJY2FzZSBDU1NfRElNRU5TSU9OIDoKLQkJCWNhc2UgQ1NTX0lOVEVHRVIgOgotCQkJY2FzZSBDU1NfSEFTSCA6Ci0JCQkJcmV0dXJuIGZGbG9hdFZhbHVlOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8xNwotCSAqIDEyOjEyOjE4KQotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQUklNSVRJVkVWQUxVRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSBjb25zdGFudHMgc3BlY2lmaWVkIGFib3ZlLgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcmltaXRpdmVUeXBlKCkgewotCQlyZXR1cm4gZlByaW1pdGl2ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIFJlY3QgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgcmVjdCB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPlJlY3Q8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBSZWN0IHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIFJlY3QgdmFsdWUuIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX1JFQ1Q8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgUmVjdCBnZXRSZWN0VmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBSR0IgY29sb3IuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgUkdCIGNvbG9yIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+UkdCQ29sb3I8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBSR0IgY29sb3IgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgYXR0YWNoZWQgcHJvcGVydHkKLQkgKiAgICAgICAgICAgICAgICBjYW4ndCByZXR1cm4gYSBSR0IgY29sb3IgdmFsdWUgKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfUkdCQ09MT1I8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgUkdCQ29sb3IgZ2V0UkdCQ29sb3JWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHN0cmluZyB2YWx1ZS4gSWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIHN0cmluZyB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4gU29tZQotCSAqIHByb3BlcnRpZXMgKGxpa2UgJ2ZvbnQtZmFtaWx5JyBvciAndm9pY2UtZmFtaWx5JykgY29udmVydCBhIHdoaXRlc3BhY2UKLQkgKiBzZXBhcmF0ZWQgbGlzdCBvZiBpZGVudHMgdG8gYSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIHZhbHVlIGluIHRoZSBjdXJyZW50IHVuaXQuIFRoZSBjdXJyZW50Ci0JICogICAgICAgICA8Y29kZT5wcmltaXRpdmVUeXBlPC9jb2RlPiBjYW4gb25seSBiZSBhIHN0cmluZyB1bml0IHR5cGUKLQkgKiAgICAgICAgIChpLmUuIDxjb2RlPkNTU19TVFJJTkc8L2NvZGU+LDxjb2RlPkNTU19VUkk8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Q1NTX0lERU5UPC9jb2RlPiBhbmQgPGNvZGU+Q1NTX0FUVFI8L2NvZGU+KS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKGZQcmltaXRpdmVUeXBlKSB7Ci0JCQljYXNlIENTU19TVFJJTkcgOgotCQkJY2FzZSBDU1NfVVJJIDoKLQkJCWNhc2UgQ1NTX0lERU5UIDoKLQkJCWNhc2UgQ1NTX0FUVFIgOgotCQkJY2FzZSBDU1NfVVJBTkdFIDoKLQkJCWNhc2UgQ1NTX0ZPUk1BVCA6Ci0JCQljYXNlIENTU19MT0NBTCA6Ci0JCQljYXNlIENTU19IQVNIIDoKLQkJCWNhc2UgQ1NTX0NPTU1BIDoKLQkJCWNhc2UgQ1NTX1NMQVNIIDoKLQkJCWNhc2UgQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQlyZXR1cm4gZlN0cmluZ1ZhbHVlOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5VmFsdWVDaGFuZ2VkKFN0cmluZyBvbGRWYWx1ZSkgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcywgb2xkVmFsdWUpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlub3RpZnkoQ0hBTkdFLCBuZXcgU2hvcnQoZlByaW1pdGl2ZVR5cGUpLCBudWxsLCBudWxsLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0byBzZXQgdGhlIGZsb2F0IHZhbHVlIHdpdGggYSBzcGVjaWZpZWQgdW5pdC4gSWYgdGhlIHByb3BlcnR5Ci0JICogYXR0YWNoZWQgd2l0aCB0aGlzIHZhbHVlIGNhbiBub3QgYWNjZXB0IHRoZSBzcGVjaWZpZWQgdW5pdCBvciB0aGUgZmxvYXQKLQkgKiB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgdW5jaGFuZ2VkIGFuZCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHJhaXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdW5pdFR5cGUKLQkgKiAgICAgICAgICAgIEEgdW5pdCBjb2RlIGFzIGRlZmluZWQgYWJvdmUuIFRoZSB1bml0IGNvZGUgY2FuIG9ubHkgYmUgYQotCSAqICAgICAgICAgICAgZmxvYXQgdW5pdCB0eXBlIChpLmUuIDxjb2RlPkNTU19OVU1CRVI8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BFUkNFTlRBR0U8L2NvZGU+LDxjb2RlPkNTU19FTVM8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0VYUzwvY29kZT4sPGNvZGU+Q1NTX1BYPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19DTTwvY29kZT4sPGNvZGU+Q1NTX01NPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19JTjwvY29kZT4sPGNvZGU+Q1NTX1BUPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QQzwvY29kZT4sPGNvZGU+Q1NTX0RFRzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUkFEPC9jb2RlPiw8Y29kZT5DU1NfR1JBRDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfTVM8L2NvZGU+LDxjb2RlPkNTU19TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19IWjwvY29kZT4sPGNvZGU+Q1NTX0tIWjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRElNRU5TSU9OPC9jb2RlPikuCi0JICogQHBhcmFtIGZsb2F0VmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgZmxvYXQgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgYXR0YWNoZWQgcHJvcGVydHkKLQkgKiAgICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgdGhlIGZsb2F0IHZhbHVlIG9yIHRoZSB1bml0IHR5cGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmxvYXRWYWx1ZShzaG9ydCB1bml0VHlwZSwgZmxvYXQgZmxvYXRWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAodW5pdFR5cGUpIHsKLQkJCWNhc2UgQ1NTX05VTUJFUiA6Ci0JCQljYXNlIENTU19QRVJDRU5UQUdFIDoKLQkJCWNhc2UgQ1NTX0VNUyA6Ci0JCQljYXNlIENTU19FWFMgOgotCQkJY2FzZSBDU1NfUFggOgotCQkJY2FzZSBDU1NfQ00gOgotCQkJY2FzZSBDU1NfTU0gOgotCQkJY2FzZSBDU1NfSU4gOgotCQkJY2FzZSBDU1NfUFQgOgotCQkJY2FzZSBDU1NfUEMgOgotCQkJY2FzZSBDU1NfREVHIDoKLQkJCWNhc2UgQ1NTX1JBRCA6Ci0JCQljYXNlIENTU19HUkFEIDoKLQkJCWNhc2UgQ1NTX01TIDoKLQkJCWNhc2UgQ1NTX1MgOgotCQkJY2FzZSBDU1NfSFogOgotCQkJY2FzZSBDU1NfS0haIDoKLQkJCWNhc2UgQ1NTX0RJTUVOU0lPTiA6Ci0JCQljYXNlIENTU19JTlRFR0VSIDoKLQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBnZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlmUHJpbWl0aXZlVHlwZSA9IHVuaXRUeXBlOwotCQkJCWZGbG9hdFZhbHVlID0gZmxvYXRWYWx1ZTsKLQkJCQlub3RpZnlWYWx1ZUNoYW5nZWQob2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gc2V0IHRoZSBzdHJpbmcgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXQuIElmIHRoZQotCSAqIHByb3BlcnR5IGF0dGFjaGVkIHRvIHRoaXMgdmFsdWUgY2FuJ3QgYWNjZXB0IHRoZSBzcGVjaWZpZWQgdW5pdCBvciB0aGUKLQkgKiBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgYQotCSAqIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHN0cmluZ1R5cGUKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIGNvZGUgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIHN0cmluZyBjb2RlIGNhbiBvbmx5IGJlCi0JICogICAgICAgICAgICBhIHN0cmluZyB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX1NUUklORzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfVVJJPC9jb2RlPiw8Y29kZT5DU1NfSURFTlQ8L2NvZGU+LCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19BVFRSPC9jb2RlPikuCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHN0cmluZyB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUgb3IgaWYgdGhlIHN0cmluZyB2YWx1ZSBjYW4ndCBiZQotCSAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgdW5pdC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShzaG9ydCBzdHJpbmdUeXBlLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKHN0cmluZ1R5cGUpIHsKLQkJCWNhc2UgQ1NTX1NUUklORyA6Ci0JCQljYXNlIENTU19VUkkgOgotCQkJY2FzZSBDU1NfSURFTlQgOgotCQkJY2FzZSBDU1NfQVRUUiA6Ci0JCQljYXNlIENTU19VUkFOR0UgOgotCQkJY2FzZSBDU1NfRk9STUFUIDoKLQkJCWNhc2UgQ1NTX0xPQ0FMIDoKLQkJCWNhc2UgQ1NTX0hBU0ggOgotCQkJY2FzZSBDU1NfQ09NTUEgOgotCQkJY2FzZSBDU1NfU0xBU0ggOgotCQkJY2FzZSBDU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCVN0cmluZyBvbGRWYWx1ZSA9IGdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWZQcmltaXRpdmVUeXBlID0gc3RyaW5nVHlwZTsKLQkJCQlmU3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKLQkJCQlub3RpZnlWYWx1ZUNoYW5nZWQob2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8yNAotCSAqIDE1OjA2OjI1KQotCSAqIAotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBmbG9hdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0RmxvYXRWYWx1ZShnZXRQcmltaXRpdmVUeXBlKCksIGZsb2F0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMjQKLQkgKiAxNTowNjoyNSkKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyBzdHJpbmdWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldFN0cmluZ1ZhbHVlKGdldFByaW1pdGl2ZVR5cGUoKSwgc3RyaW5nVmFsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1JlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyNTZlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1JlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSZWdpb25Db250YWluZXIgZXh0ZW5kcyBDU1NOb2RlSW1wbCB7Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGZGaXJzdFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmTGFzdFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZQYXJlbnRSZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ1NTUmVnaW9uQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTUmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1JlZ2lvbkNvbnRhaW5lcihDU1NSZWdpb25Db250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc1RleHQoKSB7Ci0JCWlmIChmRmlyc3RSZWdpb24gPT0gbnVsbCB8fCBmTGFzdFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGdlbmVyYXRlU291cmNlKCk7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBiSW4gPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50ID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoYkluKSB7Ci0JCQkJc291cmNlLmFwcGVuZChmUGFyZW50UmVnaW9uLmdldFRleHQoY3VycmVudCkpOwotCQkJCWlmIChjdXJyZW50ID09IGZMYXN0UmVnaW9uKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjdXJyZW50ID09IGZGaXJzdFJlZ2lvbikgewotCQkJCQliSW4gPSB0cnVlOwotCQkJCQlzb3VyY2UuYXBwZW5kKGZQYXJlbnRSZWdpb24uZ2V0VGV4dChjdXJyZW50KSk7Ci0JCQkJCWlmIChjdXJyZW50ID09IGZMYXN0UmVnaW9uKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TGFzdFJlZ2lvbigpOwotCQlpZiAoIShyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBmUGFyZW50UmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZQYXJlbnRSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXJldHVybiBmRmlyc3RSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZMYXN0UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGdldEZpcnN0UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZQYXJlbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJaWYgKHJlZ2lvbnMuZ2V0KGkpID09IGdldEZpcnN0UmVnaW9uKCkpIHsKLQkJCQlpZiAoaSArIGluZGV4IDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJSVRleHRSZWdpb24gdGFyZ2V0ID0gcmVnaW9ucy5nZXQoaSArIGluZGV4KTsKLQkJCQkJaWYgKHRhcmdldC5nZXRTdGFydCgpIDw9IGdldExhc3RSZWdpb24oKS5nZXRTdGFydCgpKQotCQkJCQkJcmV0dXJuIHRhcmdldDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVnaW9uQ291bnQoKSB7Ci0JCXZhbGlkYXRlUmFuZ2UoKTsKLQotCQlpZiAoZ2V0Rmlyc3RSZWdpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChnZXRGaXJzdFJlZ2lvbigpID09IGdldExhc3RSZWdpb24oKSkKLQkJCXJldHVybiAxOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZQYXJlbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50ID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoaiAhPSAwIHx8IGN1cnJlbnQgPT0gZ2V0Rmlyc3RSZWdpb24oKSkKLQkJCQlqKys7Ci0JCQlpZiAoY3VycmVudCA9PSBnZXRMYXN0UmVnaW9uKCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGo7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldEZpcnN0UmVnaW9uKCk7Ci0JCWlmICghKHJlZ2lvbiA9PSBudWxsIHx8IGZQYXJlbnRSZWdpb24gPT0gbnVsbCkpIHsKLQkJCXJlc3VsdCA9IGZQYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIHNldEZpcnN0UmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IHJlZ2lvbjsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIHNldExhc3RSZWdpb24oSVRleHRSZWdpb24gbGFzdFJlZ2lvbikgewotCQl0aGlzLmZMYXN0UmVnaW9uID0gbGFzdFJlZ2lvbjsKLQkJcmV0dXJuIGxhc3RSZWdpb247Ci0JfQotCi0Jdm9pZCBzZXRSYW5nZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiwgSVRleHRSZWdpb24gZmlyc3RSZWdpb24sIElUZXh0UmVnaW9uIGxhc3RSZWdpb24pIHsKLQkJdGhpcy5mUGFyZW50UmVnaW9uID0gcGFyZW50UmVnaW9uOwotCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IGZpcnN0UmVnaW9uOwotCQl0aGlzLmZMYXN0UmVnaW9uID0gbGFzdFJlZ2lvbjsKLQotCQlpZiAoZmlyc3RSZWdpb24gPT0gbnVsbCAmJiBsYXN0UmVnaW9uID09IG51bGwpIHsKLQkJCXNldEZpcnN0UmVnaW9uKG51bGwpOwotCQkJc2V0TGFzdFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIHsgLy8gcmFuZ2UgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVSYW5nZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmFuZ2UoKSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJaWYgKHRoaXMuZkZpcnN0UmVnaW9uICE9IG51bGwgfHwgdGhpcy5mTGFzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5mRmlyc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZkZpcnN0UmVnaW9uID0gdGhpcy5mTGFzdFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5mTGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5mTGFzdFJlZ2lvbiA9IHRoaXMuZkZpcnN0UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmZGaXJzdFJlZ2lvbi5nZXRTdGFydCgpID4gdGhpcy5mTGFzdFJlZ2lvbi5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gbmVlZCB0byBzd2FwIGZpcnN0IGZvciBsYXN0Ci0JCQkJSVRleHRSZWdpb24gcmVnID0gZkZpcnN0UmVnaW9uOwotCQkJCWZGaXJzdFJlZ2lvbiA9IGZMYXN0UmVnaW9uOwotCQkJCWZMYXN0UmVnaW9uID0gcmVnOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQ5MTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZURlY2xDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSdWxlRGVjbENvbnRhaW5lciBleHRlbmRzIENTU1J1bGVJbXBsIHsKLQotCS8qKgotCSAqIENTU1J1bGVEZWNsQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTUnVsZURlY2xDb250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ1NTUnVsZURlY2xDb250YWluZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NSdWxlRGVjbENvbnRhaW5lcihDU1NSdWxlRGVjbENvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCWFic3RyYWN0IFN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKSB7Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCQlyZXR1cm4gKENTU1N0eWxlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDdkMzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSdWxlSW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIENTU1J1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTUnVsZUltcGwoQ1NTUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJ1bGUgaXMgY29udGFpbmVkIGluc2lkZSBhbm90aGVyIHJ1bGUgKGUuZy4gYSBzdHlsZSBydWxlIGluc2lkZQotCSAqIGFuCi0JICogCi0JICogQG1lZGlhIGJsb2NrKSwgdGhpcyBpcyB0aGUgY29udGFpbmluZyBydWxlLiBJZiB0aGlzIHJ1bGUgaXMgbm90IG5lc3RlZAotCSAqICAgICAgICBpbnNpZGUgYW55IG90aGVyIHJ1bGVzLCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0UGFyZW50UnVsZSgpIHsKLQkJSUNTU05vZGUgcnVsZSA9IGdldFBhcmVudE5vZGUoKTsKLQotCQkvLyBwYXJlbnQgcnVsZSBpcyB1c2VkIG9ubHkgaWYgcGFyZW50IGlzIG1lZGlhIHJ1bGUKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGVJbXBsKQotCQkJcmV0dXJuIChDU1NSdWxlKSBydWxlOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHlsZSBzaGVldCB0aGF0IGNvbnRhaW5zIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRQYXJlbnRTdHlsZVNoZWV0KCkgewotCQlJQ1NTTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKQotCQkJCXJldHVybiAoQ1NTU3R5bGVTaGVldCkgcGFyZW50OwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHNob3J0IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMTVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTUnVsZUxpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIENTU1J1bGVMaXN0IHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1J1bGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIGEgQ1NTIHJ1bGUgYnkgb3JkaW5hbCBpbmRleC4gVGhlIG9yZGVyIGluIHRoaXMKLQkgKiBjb2xsZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yZGVyIG9mIHRoZSBydWxlcyBpbiB0aGUgQ1NTIHN0eWxlIHNoZWV0LiBJZgotCSAqIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHJ1bGVzIGluIHRoZSBsaXN0LCB0aGlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhJbmRleAotCSAqICAgICAgICAgICAgaW50byB0aGUgY29sbGVjdGlvbgotCSAqIEByZXR1cm4gVGhlIHN0eWxlIHJ1bGUgYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBwb3NpdGlvbiBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPkNTU1J1bGVMaXN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdCBpcwotCSAqICAgICAgICAgbm90IGEgdmFsaWQgaW5kZXguCi0JICovCi0JcHVibGljIENTU1J1bGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChDU1NSdWxlKSBpdGVtSW1wbChpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwOWMwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2VsZWN0b3JBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2VsZWN0b3IgaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3IgewotCi0JcHJpdmF0ZSBpbnQgZlNwZWNpZmljaXR5ID0gLTE7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUb2tlbnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSXRlbXMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmUGFyc2VFcnJvcnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmTmFtZUVycm9ycyA9IG51bGw7Ci0KLQlDU1NTZWxlY3RvcihMaXN0IHRva2VucykgewotCQlmVG9rZW5zID0gbmV3IEFycmF5TGlzdCh0b2tlbnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yIGZvcmVpZ24gPSAoQ1NTU2VsZWN0b3IpIG9iajsKLQotCQkvLyBpZiAoZlNwZWNpZmljaXR5ICE9IGZvcmVpZ24uZlNwZWNpZmljaXR5KSByZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdldExlbmd0aCgpICE9IGZvcmVpZ24uZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIWdldEl0ZW0oaSkuZXF1YWxzKGZvcmVpZ24uZ2V0SXRlbShpKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlmSXRlbXMgPSBwYXJzZVNlbGVjdG9yKGZUb2tlbnMpOwotCQl9Ci0JCWlmIChmSXRlbXMgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkl0ZW1zLnNpemUoKSkgewotCQkJcmV0dXJuIChJQ1NTU2VsZWN0b3JJdGVtKSBmSXRlbXMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJZkl0ZW1zID0gcGFyc2VTZWxlY3RvcihmVG9rZW5zKTsKLQkJfQotCQlyZXR1cm4gKGZJdGVtcyAhPSBudWxsKSA/IGZJdGVtcy5pdGVyYXRvcigpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCWZJdGVtcyA9IHBhcnNlU2VsZWN0b3IoZlRva2Vucyk7Ci0JCX0KLQkJcmV0dXJuIChmSXRlbXMgIT0gbnVsbCkgPyBmSXRlbXMuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gY2FzdCBlcnJvciBvciBudWxsIHBvaW50ZXIgLi4uCi0JCQllbGVtZW50ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UHJldmlvdXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlFbGVtZW50IHAgPSBudWxsOwotCQlmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlwID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGEgc2VsZWN0b3IncyBzcGVjaWZpY2l0eSBhID0gdGhlIG51bWJlciBvZiBJRCBhdHRyaWJ1dGVzIGluCi0JICogdGhlIHNlbGVjdG9yIGIgPSB0aGUgbnVtYmVyIG9mIG90aGVyIGF0dHJpYnV0ZXMgYW5kIHBzZXVkby1jbGFzc2VzIGluCi0JICogdGhlIHNlbGVjdG9yIGMgPSB0aGUgbnVtYmVyIG9mIGVsZW1lbnQgbmFtZXMgaW4gdGhlIHNlbGVjdG9yIChpZ25vcmUKLQkgKiBwc2V1ZG8tZWxlbWVudHMpIENvbmNhdGVuYXRpbmcgdGhlIHRocmVlIG51bWJlcnMgYS1iLWMgKGluIGEgbnVtYmVyCi0JICogc3lzdGVtIHdpdGggYSBsYXJnZSBiYXNlKSBnaXZlcyB0aGUgc3BlY2lmaWNpdHkuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwZWNpZmljaXR5KCkgewotCQlpZiAoZlNwZWNpZmljaXR5IDwgMCkgewotCQkJaW50IG5JRHMgPSAwOwotCQkJaW50IG5BdHRyaWJ1dGVzID0gMDsKLQkJCWludCBuRWxlbWVudHMgPSAwOwotCQkJSXRlcmF0b3IgaSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IChDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQkJbklEcyArPSBzZWxlY3Rvci5nZXROdW1PZklEcygpOwotCQkJCQluQXR0cmlidXRlcyArPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKTsKLQkJCQkJbkF0dHJpYnV0ZXMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCQkJCW5BdHRyaWJ1dGVzICs9IHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKTsKLQkJCQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpKSB7Ci0JCQkJCQluRWxlbWVudHMrKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZTcGVjaWZpY2l0eSA9IG5JRHMgKiAxMDAwMCArIG5BdHRyaWJ1dGVzICogMTAwICsgbkVsZW1lbnRzOwotCQl9Ci0KLQkJcmV0dXJuIGZTcGVjaWZpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUl0ZXJhdG9yIGkgPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGkubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJCS8vIElmIGl0ZW0gaXMgREVTQ0VOREFOVCBjb21iaW5hdG9yLCBpdCBpcyBqdXN0IHNpbmdsZQotCQkJCQkvLyBzcGFjZS4KLQkJCQkJLy8gVGhlbiwgeW91IGRvbnQgaGF2ZSB0byBhcHBlbmQgc3RyaW5nLi4KLQkJCQkJaWYgKCgoQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBpdGVtKS5nZXRDb21iaW5hdG9yVHlwZSgpICE9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCkgewotCQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChvcmcudzNjLmRvbS5FbGVtZW50IGVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcgcHNldWRvTmFtZSkgewotCQlFbGVtZW50IHRhcmdldCA9IGVsZW1lbnQ7Ci0JCWNoYXIgY29tYmluYXRvclR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLlVOS05PV047Ci0JCUVsZW1lbnQgY2h1bmtTdGFydEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgQ0hJTEQgYW5kIEFESkFDRU5UCi0JCQkJCQkJCQkJCS8vIGNvbWJpbmF0b3IKLQkJaW50IGNodW5rU3RhcnRJdGVtID0gLTE7IC8vIGZvciBDSElMRCBhbmQgQURKQUNFTlQgY29tYmluYXRvcgotCQlpbnQgbnVtSXRlbXMgPSBnZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaUl0ZW0gPSBudW1JdGVtcyAtIDE7IGlJdGVtID49IDA7IGlJdGVtLS0pIHsKLQkJCS8vIENoZWNrIFNlbGVjdG9yIEl0ZW1zCi0JCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBnZXRJdGVtKGlJdGVtKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJLy8gU2ltcGxlIFNlbGVjdG9yCi0JCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSkgewotCQkJCQlzd2l0Y2ggKGNvbWJpbmF0b3JUeXBlKSB7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCA6Ci0JCQkJCQkJZG8gewotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJd2hpbGUgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQgOgotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UIDoKLQkJCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgIT0gbnVsbCAmJiBjaHVua1N0YXJ0RWxlbWVudCAhPSBlbGVtZW50KSB7Ci0JCQkJCQkJCS8vIHByZXZpb3VzIGNvbmJpbmF0b3IgbXVzdCBiZSBERVNDRU5ERU5ULgotCQkJCQkJCQkvLyBnb3RvIHBhcmVudAotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KGNodW5rU3RhcnRFbGVtZW50KTsKLQkJCQkJCQkJaUl0ZW0gPSBjaHVua1N0YXJ0SXRlbSArIDE7Ci0JCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gbnVsbDsKLQkJCQkJCQkJY2h1bmtTdGFydEl0ZW0gPSAtMTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJLy8gb3RoZXIgY29tYmluYXRvcnMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJLy8gQ29tYmluYXRvciAoICIrIiwgIj4iLCAiICIsIC4uLikKLQkJCQlpZiAoaUl0ZW0gPT0gbnVtSXRlbXMgLSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGxhc3QgaXRlbSBpcyBjb21iaW5hdG9yCi0KLQkJCQlJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIHNjID0gKElDU1NTZWxlY3RvckNvbWJpbmF0b3IpIGl0ZW07Ci0JCQkJY29tYmluYXRvclR5cGUgPSBzYy5nZXRDb21iaW5hdG9yVHlwZSgpOwotCQkJCXN3aXRjaCAoY29tYmluYXRvclR5cGUpIHsKLQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQgOgotCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCA6Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVCA6Ci0JCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gdGFyZ2V0OwotCQkJCQkJCWNodW5rU3RhcnRJdGVtID0gaUl0ZW0gKyAxOyAvLyBzYWZlIGJlY2F1c2UgdGhpcwotCQkJCQkJCQkJCQkJCQkvLyBpcyBub3QgYSBsYXN0IGl0ZW0uCi0JCQkJCQl9Ci0JCQkJCQlpZiAoY29tYmluYXRvclR5cGUgPT0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCkgewotCQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRhcmdldCA9IGdldFByZXZpb3VzRWxlbWVudCh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2hhdCBpcyB0aGlzIGl0ZW0gPz8/Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIE9LIHRoaXMgc2VsZWN0b3IgbWFjaGVzIHRoZSBlbGVtZW50LgotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaEV4YWN0bHkoSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUlTdHlsZVNlbGVjdG9yQWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNlbGVjdG9yQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLm1hdGNoKHNlbGVjdG9yLCBlbGVtZW50LCBwc2V1ZG9OYW1lKTsKLQkJfQotCi0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpOwotCQlTdHJpbmcga2V5OwotCi0JCS8vIFRPRE86IFBzZXVkb05hbWUKLQotCQkvLyBjaGVjayB0YWcgbmFtZQotCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkgJiYgIWVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoc2VsZWN0b3IuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZAotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAoaSA+IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGtleSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghc2VsZWN0b3IuZ2V0SUQoMCkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgY2xhc3MKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihrZXkpOwotCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWlmIChzZWxlY3Rvci5nZXRDbGFzcyhpKS5lcXVhbHModG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFvaykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgYXR0cmlidXRlcwotCQlmb3IgKGkgPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWxlY3Rvci5nZXRBdHRyaWJ1dGUoaSksICI9fnwgXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQlpbnQgY291bnRUb2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWlmIChjb3VudFRva2VucyA+IDApIHsKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpZiAoYXR0clZhbHVlID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY291bnRUb2tlbnMgPiAxKSB7Ci0JCQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oIj0gXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBhdHRyVmFsdWVUb2tlbml6ZXIgPSBudWxsOwotCQkJCQlpZiAodG9rZW4uZXF1YWxzKCJ+IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ8IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSwgIi0iKTsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGF0dHJWYWx1ZVRva2VuaXplciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQkJCQl3aGlsZSAoYXR0clZhbHVlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQlpZiAodG9rZW4uZXF1YWxzKGF0dHJWYWx1ZVRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghb2spCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmICghYXR0clZhbHVlLmVxdWFscyh0b2tlbikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHBhcnNlU2VsZWN0b3IoTGlzdCB0b2tlbnMpIHsKLQkJQ1NTU2VsZWN0b3JQYXJzZXIgcGFyc2VyID0gbmV3IENTU1NlbGVjdG9yUGFyc2VyKHRva2Vucyk7Ci0JCUxpc3Qgc2VsZWN0b3IgPSBwYXJzZXIuZ2V0U2VsZWN0b3IoKTsKLQkJSXRlcmF0b3IgaSA9IHBhcnNlci5nZXRFcnJvcnMoKTsKLQkJZlBhcnNlRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWZQYXJzZUVycm9ycy5hZGQoaS5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RXJyb3JzKCkgewotCQlpZiAoZk5hbWVFcnJvcnMgPT0gbnVsbCkgewotCQkJZk5hbWVFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpSXRlbSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaUl0ZW0uaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGlJdGVtLm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlpZiAoISgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtKS5pc1VuaXZlcnNhbCgpKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtKS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkgewotCQkJCQkJCWZOYW1lRXJyb3JzLmFkZChpdGVtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoZlBhcnNlRXJyb3JzKTsKLQkJZXJyb3JzLmFkZEFsbChmTmFtZUVycm9ycyk7Ci0JCXJldHVybiBlcnJvcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ1NTU2VsZWN0b3IjZ2V0RXJyb3JDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQlpbnQgbkVycm9ycyA9IDA7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRFcnJvcnMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQluRXJyb3JzKys7Ci0JCQlpLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbkVycm9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjI1OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTZWxlY3RvckNvbWJpbmF0b3IgZXh0ZW5kcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIHsKLQotCWNoYXIgZlR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLlVOS05PV047Ci0KLQkvKioKLQkgKiBDU1NTZWxlY3RvckNvbWJpbmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKGNoYXIgdHlwZSkgewotCQlzdXBlcigpOwotCQlzZXRDb21iaW5hdG9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTZWxlY3RvckNvbWJpbmF0b3IgZm9yZWlnbiA9IChDU1NTZWxlY3RvckNvbWJpbmF0b3IpIG9iajsKLQotCQlyZXR1cm4gKGdldENvbWJpbmF0b3JUeXBlKCkgPT0gZm9yZWlnbi5nZXRDb21iaW5hdG9yVHlwZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGNoYXIgZ2V0Q29tYmluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbVR5cGUoKSB7Ci0JCXJldHVybiBDT01CSU5BVE9SOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGZUeXBlKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXZvaWQgc2V0Q29tYmluYXRvclR5cGUoY2hhciB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzRiY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCS8qKgotCSAqIENTU1NlbGVjdG9ySXRlbSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NTZWxlY3Rvckl0ZW0oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNWM3ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NlbGVjdG9yTGlzdEltcGwgaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JMaXN0IHsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkU3RyaW5nID0gbnVsbDsgLy8gbm9ybWFsaXplZCBzdHJpbmcKLQlwcml2YXRlIExpc3QgZlNlbGVjdG9ycyA9IG51bGw7Ci0KLQlwdWJsaWMgQ1NTU2VsZWN0b3JMaXN0SW1wbChTdHJpbmcgY3NzVGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IGNzc1RleHQ7Ci0JCXBhcnNlU2VsZWN0b3JUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2VsZWN0b3JMaXN0SW1wbCBmb3JlaWduID0gKENTU1NlbGVjdG9yTGlzdEltcGwpIG9iajsKLQotCQlpZiAoZ2V0TGVuZ3RoKCkgIT0gZm9yZWlnbi5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghZ2V0U2VsZWN0b3IoaSkuZXF1YWxzKGZvcmVpZ24uZ2V0U2VsZWN0b3IoaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3IgZ2V0U2VsZWN0b3IoaW50IGluZGV4KSB7Ci0JCUxpc3Qgc2VsZWN0b3JzID0gZ2V0U2VsZWN0b3JzKCk7Ci0JCWlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgc2VsZWN0b3JzLnNpemUoKSkgewotCQkJcmV0dXJuIChJQ1NTU2VsZWN0b3IpIHNlbGVjdG9ycy5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlpZiAoZlNlbGVjdG9ycyA9PSBudWxsKSB7Ci0JCQlwYXJzZVNlbGVjdG9yVGV4dCgpOwotCQl9Ci0JCXJldHVybiBmU2VsZWN0b3JzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlpZiAoZkNhY2hlZFN0cmluZyA9PSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBiRmlyc3QgPSB0cnVlOwotCQkJLy8gZ3JvdXBzIGlzIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHNlbGVjdG9ycwotCQkJSXRlcmF0b3IgaSA9IGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIWJGaXJzdCkgewotCQkJCQlidWYuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJSUNTU1NlbGVjdG9yIGl0ZW0gPSAoSUNTU1NlbGVjdG9yKSBpLm5leHQoKTsKLQkJCQlidWYuYXBwZW5kKGl0ZW0uZ2V0U3RyaW5nKCkpOwotCQkJCWJGaXJzdCA9IGZhbHNlOwotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlpbnQgblNlbGVjdG9ycyA9IGdldExlbmd0aCgpOwotCQlmb3IgKGludCBpU2VsZWN0b3IgPSAwOyBpU2VsZWN0b3IgPCBuU2VsZWN0b3JzOyBpU2VsZWN0b3IrKykgewotCQkJLy8gQ2hlY2sgZWFjaCBTZWxlY3RvciBMaXN0cwotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoaVNlbGVjdG9yKTsKLQkJCWlmIChzZWxlY3Rvci5tYXRjaChlbGVtZW50LCBwc2V1ZG9OYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0b3JUZXh0KCkgewotCQlmU2VsZWN0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZlRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfU1RZTEVTSEVFVCwgZlRleHQpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgdG9rZW5Hcm91cCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IHRva2Vuc1tpXTsKLQkJCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IgJiYgMCA8IHRva2VuR3JvdXAuc2l6ZSgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENTU1NlbGVjdG9yKHRva2VuR3JvdXApOwotCQkJCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQkJCWZTZWxlY3RvcnMuYWRkKHNlbGVjdG9yKTsKLQkJCQl9Ci0JCQkJdG9rZW5Hcm91cC5jbGVhcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdG9rZW5Hcm91cC5hZGQodG9rZW5zW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAoMCA8IHRva2VuR3JvdXAuc2l6ZSgpKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgQ1NTU2VsZWN0b3IodG9rZW5Hcm91cCk7Ci0JCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJCWZTZWxlY3RvcnMuYWRkKHNlbGVjdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RXJyb3JzKCkgewotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaVNlbGVjdG9yID0gZ2V0U2VsZWN0b3JzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlTZWxlY3Rvci5oYXNOZXh0KCkpIHsKLQkJCUl0ZXJhdG9yIGlFcnJvciA9ICgoSUNTU1NlbGVjdG9yKSBpU2VsZWN0b3IubmV4dCgpKS5nZXRFcnJvcnMoKTsKLQkJCXdoaWxlIChpRXJyb3IuaGFzTmV4dCgpKSB7Ci0JCQkJZXJyb3JzLmFkZChpRXJyb3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQlpbnQgbkVycm9ycyA9IDA7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRFcnJvcnMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQluRXJyb3JzKys7Ci0JCQlpLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbkVycm9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjAwMzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yQ29tYmluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU2VsZWN0b3JQYXJzZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElETEUgPSAwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEUgPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSU1QTEUgPSAyOwotCi0JcHJpdmF0ZSBMaXN0IGZUb2tlbnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSXRlbXMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmRXJyb3JzID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1NlbGVjdG9yUGFyc2VyKExpc3QgdG9rZW5zKSB7Ci0JCXN1cGVyKCk7Ci0JCWZUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KHRva2Vucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvcigpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlwYXJzZVNlbGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VTZWxlY3RvcigpIHsKLQkJZkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3QgYXR0ckJ1ZiA9IG51bGw7Ci0JCUNTU1NpbXBsZVNlbGVjdG9yIGl0ZW0gPSBudWxsOwotCi0JCWludCBzdGF0dXMgPSBJRExFOwotCQlJdGVyYXRvciBpID0gZlRva2Vucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJaWYgKHRva2VuID09IG51bGwgfHwgdG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJCWNhc2UgSURMRSA6Ci0JCQkJCWlmIChpc1RhZyh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZFRhZyhpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNJRCh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZElEKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NsYXNzKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kQ2xhc3MoaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzUHNldWRvKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kUHNldWRvKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0F0dHJpYnV0ZUJlZ2luKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJc3RhdHVzID0gQVRUUklCVVRFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU0lNUExFIDoKLQkJCQkJaWYgKGlzSUQodG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRJRChpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNDbGFzcyh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZENsYXNzKGl0ZW0sIHRva2VuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc1BzZXVkbyh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZFBzZXVkbyhpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNBdHRyaWJ1dGVCZWdpbih0b2tlbikpIHsKLQkJCQkJCXN0YXR1cyA9IEFUVFJJQlVURTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NvbWJpbmF0b3IodG9rZW4pKSB7IC8vIGNvbWJpbmF0b3IKLQkJCQkJCWNsb3NlSXRlbShpdGVtKTsKLQkJCQkJCWNsb3NlSXRlbShjcmVhdGVDb21iaW5hdG9yKHRva2VuKSk7Ci0JCQkJCQlzdGF0dXMgPSBJRExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQVRUUklCVVRFIDoKLQkJCQkJaWYgKGlzQXR0cmlidXRlRW5kKHRva2VuKSkgewotCQkJCQkJYXBwZW5kQXR0cmlidXRlKGl0ZW0sIGF0dHJCdWYpOwotCQkJCQkJYXR0ckJ1ZiA9IG51bGw7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoYXR0ckJ1ZiA9PSBudWxsKSB7Ci0JCQkJCQkJYXR0ckJ1ZiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCX0KLQkJCQkJCWF0dHJCdWYuYWRkKHRva2VuKTsKLQkJCQkJCWlmICghaXNBdHRyaWJ1dGVDb250ZW50KHRva2VuKSkgewotCQkJCQkJCWFkZEVycm9yKHRva2VuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQljbG9zZUl0ZW0oaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUNvbnRlbnQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0cmlidXRlRW5kKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUJlZ2luKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tYmluYXRvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQc2V1ZG8oQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDbGFzcyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSUQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1RhZyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTik7Ci0JfQotCi0JcHJpdmF0ZSBDU1NTaW1wbGVTZWxlY3RvciBjcmVhdGVTaW1wbGUoKSB7Ci0JCXJldHVybiBuZXcgQ1NTU2ltcGxlU2VsZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBpZiAiICIgb3IgIisiIG9yICI+IiBhcHBlYXJlZCwgY2xvc2Ugc2ltcGxlc2VsZWN0b3IgYW5kIGFkZCBuZXcKLQkgKiBjb21iaW5hdG9yCi0JICovCi0JcHJpdmF0ZSBDU1NTZWxlY3RvckNvbWJpbmF0b3IgY3JlYXRlQ29tYmluYXRvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJY2hhciB0eXBlID0gMDsKLQotCQlTdHJpbmcgc3RyID0gdG9rZW4uaW1hZ2U7Ci0JCWlmIChzdHIudHJpbSgpLmxlbmd0aCgpID09IDApIHsgLy8gc3BhY2UKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQ7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyLmVxdWFscygiKyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UOwotCQl9Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoIj4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0eXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRDsKLQkJfQotCi0JCWlmICgwIDwgdHlwZSkgewotCQkJcmV0dXJuIG5ldyBDU1NTZWxlY3RvckNvbWJpbmF0b3IodHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZUl0ZW0oSUNTU1NlbGVjdG9ySXRlbSBpdGVtKSB7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWZJdGVtcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwZW5kVGFnKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlpdGVtLnNldE5hbWUodG9rZW4uaW1hZ2UpOwotCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJYWRkRXJyb3IodG9rZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaWYgIiN4eHh4IiBhcHBlYXJlZCwgYWRkIElEIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSUQoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIGlkQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZElEKGlkQ29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogaWYgIi54eHh4IiBhcHBlYXJlZCwgYWRkIENsYXNzIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2xhc3MoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIGNsYXNzQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZENsYXNzKGNsYXNzQ29udGVudCk7Ci0JCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc0NvbnRlbnQuY2hhckF0KDApKSkgewotCQkJYWRkRXJyb3IodG9rZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaWYgIjp4eHh4IiBhcHBlYXJlZCwgYWRkIFBzZXVkbyhlbGVtZW50L2NsYXNzKSB0byBjdXJyZW50IHNlbGVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFBzZXVkbyhDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRleHQgPSB0b2tlbi50b1N0cmluZygpOwotCQlTdHJpbmcgcHNldWRvQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZFBzZXVkb05hbWUocHNldWRvQ29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZEF0dHJpYnV0ZShDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBMaXN0IHRva2VucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUNTU1RleHRUb2tlbiB0b2tlbjsKLQkJSXRlcmF0b3IgaSA9IHRva2Vucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCXRva2VuID0gKENTU1RleHRUb2tlbikgaS5uZXh0KCk7Ci0JCQlidWYuYXBwZW5kKHRva2VuLmltYWdlKTsKLQkJfQotCi0JCWl0ZW0uYWRkQXR0cmlidXRlKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFNlbGVjdG9yVGFncygpIHsKLQkJTGlzdCB0YWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gdGFnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRXJyb3IoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWlmIChmRXJyb3JzID09IG51bGwpIHsKLQkJCWZFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZkVycm9ycy5hZGQodG9rZW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJcmV0dXJuIChmRXJyb3JzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpIDogZkVycm9ycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NpbXBsZVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NpbXBsZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzZlYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2ltcGxlU2VsZWN0b3IgZXh0ZW5kcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2ltcGxlU2VsZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZTdHJpbmdCdWYgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmUHNldWRvTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZBdHRyaWJ1dGUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmQ2xhc3MgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSUQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTU2ltcGxlU2VsZWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2ltcGxlU2VsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgewotCQlpZiAoZkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZBdHRyaWJ1dGUuYWRkKGF0dHJpYnV0ZSk7Ci0JCWFkZFRvQnVmKCJbIik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihhdHRyaWJ1dGUpOwotCQlhZGRUb0J1ZigiXSIpOy8vJE5PTi1OTFMtMSQKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRDbGFzcyhTdHJpbmcgY2xzKSB7Ci0JCWlmIChmQ2xhc3MgPT0gbnVsbCkgewotCQkJZkNsYXNzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZDbGFzcy5hZGQoY2xzKTsKLQkJYWRkVG9CdWYoIi4iKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGNscyk7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkSUQoU3RyaW5nIGlkKSB7Ci0JCWlmIChmSUQgPT0gbnVsbCkgewotCQkJZklEID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZJRC5hZGQoaWQpOwotCQlhZGRUb0J1ZigiIyIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoaWQpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZFBzZXVkb05hbWUoU3RyaW5nIGNscykgewotCQlpZiAoZlBzZXVkb05hbWUgPT0gbnVsbCkgewotCQkJZlBzZXVkb05hbWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZlBzZXVkb05hbWUuYWRkKGNscyk7Ci0JCWFkZFRvQnVmKCI6Iik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihjbHMpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9CdWYoU3RyaW5nIHN0cikgewotCQlpZiAoZlN0cmluZ0J1ZiA9PSBudWxsKSB7Ci0JCQlmU3RyaW5nQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWZTdHJpbmdCdWYuYXBwZW5kKHN0cik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2ltcGxlU2VsZWN0b3IgZm9yZWlnbiA9IChDU1NTaW1wbGVTZWxlY3Rvcikgb2JqOwotCi0JCWlmIChnZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldE5hbWUoKSkgIT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaTsKLQotCQkvLyBjb21wYXJlIHBzZXVkby1jbGFzc2VzIC8gcHNldWRvLWVsZW1lbnRzCi0JCWlmIChnZXROdW1PZlBzZXVkb05hbWVzKCkgIT0gZm9yZWlnbi5nZXROdW1PZlBzZXVkb05hbWVzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZlBzZXVkb05hbWVzKCk7IGkrKykgewotCQkJaWYgKGdldFBzZXVkb05hbWUoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldFBzZXVkb05hbWUoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBjbGFzc2VzCi0JCWlmIChnZXROdW1PZkNsYXNzZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQ2xhc3NlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZDbGFzc2VzKCk7IGkrKykgewotCQkJaWYgKGdldENsYXNzKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRDbGFzcyhpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjb21wYXJlIElEcwotCQlpZiAoZ2V0TnVtT2ZJRHMoKSAhPSBmb3JlaWduLmdldE51bU9mSURzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZklEcygpOyBpKyspIHsKLQkJCWlmIChnZXRJRChpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0SUQoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBBdHRyaWJ1dGVzCi0JCWlmIChnZXROdW1PZkF0dHJpYnV0ZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQXR0cmlidXRlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7IGkrKykgewotCQkJaWYgKGdldEF0dHJpYnV0ZShpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0QXR0cmlidXRlKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKGludCBpbmRleCkgewotCQlpZiAoZkF0dHJpYnV0ZSAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmQXR0cmlidXRlLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZBdHRyaWJ1dGUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3MoaW50IGluZGV4KSB7Ci0JCWlmIChmQ2xhc3MgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkNsYXNzLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZDbGFzcy5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRChpbnQgaW5kZXgpIHsKLQkJaWYgKGZJRCAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmSUQuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZklELmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gU0lNUExFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChmTmFtZSAhPSBudWxsKSA/IGZOYW1lIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKGZBdHRyaWJ1dGUgIT0gbnVsbCkgPyBmQXR0cmlidXRlLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZkNsYXNzZXMoKSB7Ci0JCXJldHVybiAoZkNsYXNzICE9IG51bGwpID8gZkNsYXNzLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZklEcygpIHsKLQkJcmV0dXJuIChmSUQgIT0gbnVsbCkgPyBmSUQuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mUHNldWRvTmFtZXMoKSB7Ci0JCXJldHVybiAoZlBzZXVkb05hbWUgIT0gbnVsbCkgPyBmUHNldWRvTmFtZS5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQc2V1ZG9OYW1lKGludCBpbmRleCkgewotCQlpZiAoZlBzZXVkb05hbWUgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZlBzZXVkb05hbWUuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZlBzZXVkb05hbWUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TmFtZSgpKTsKLQkJCWlmIChmU3RyaW5nQnVmICE9IG51bGwpIHsKLQkJCQlidWYuYXBwZW5kKGZTdHJpbmdCdWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmQ2FjaGVkU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbml2ZXJzYWwoKSB7Ci0JCXJldHVybiAoZk5hbWUgPT0gbnVsbCB8fCBmTmFtZS5lcXVhbHMoIioiKSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIENTU05vZGVJbXBsIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ1NTQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlpZiAoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIGdlbmVyYXRlU291cmNlKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCkpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCXdoaWxlIChub2RlICE9IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQkJc3RyLmFwcGVuZChub2RlLmdldFRleHQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IGluZGV4KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPiAwOyBpLS0pIHsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSB7Ci0JCWlmIChmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWludCBpID0gMDsKLQkJZm9yICg7IG5vZGUgIT0gbnVsbDsgaSsrKQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQlyZXR1cm4gaTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlib29sZWFuIGluY2x1ZGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQkvLyB2YWxpZGF0ZSByYW5nZSBvZiBwYXJhbWV0ZXJzCi0JCWlmIChmaXJzdCAhPSBudWxsICYmIGxhc3QgIT0gbnVsbCkgewotCQkJaWYgKGZpcnN0LmdldFN0YXJ0KCkgPiBsYXN0LmdldFN0YXJ0KCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdDsKLQkJCQlmaXJzdCA9IGxhc3Q7Ci0JCQkJbGFzdCA9IG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQkvLyB2YWxpZGF0ZSBtaW5lCi0JCWJvb2xlYW4gYiA9IHZhbGlkYXRlUmFuZ2UoKTsKLQkJYk1vZGlmaWVkID0gYiB8fCBiTW9kaWZpZWQ7Ci0KLQkJaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCWlmIChnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgfHwgZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydCgpID4gZmlyc3QuZ2V0U3RhcnQoKSkgewotCQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZpcnN0KTsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGxhc3QgIT0gbnVsbCkgewotCQkJaWYgKGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsIHx8IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydCgpIDwgbGFzdC5nZXRTdGFydCgpKSB7Ci0JCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihsYXN0KTsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmUtdmFsaWRhdGUKLQkJaWYgKGJNb2RpZmllZCkKLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQotCQlyZXR1cm4gYk1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBiTW9kaWZpZWQ7Ci0KLQkJYm9vbGVhbiBiID0gcGFyZW50LmluY2x1ZGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQliTW9kaWZpZWQgPSBiIHx8IGJNb2RpZmllZDsKLQotCQlpZiAoYikKLQkJCXBhcmVudC5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyBlbHNlIG5lZWQgbm90IHVwZGF0ZSByYW5nZSBvZiBhbmNlc3RvcnMKLQotCQlyZXR1cm4gYk1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0RW5kT2Zmc2V0KCkgLSBnZXRTdGFydE9mZnNldCgpLCBjc3NUZXh0KTsKLQkJfQotCQllbHNlCi0JCQlzdXBlci5zZXRDc3NUZXh0KGNzc1RleHQpOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUpIHsKLQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsKQotCQkJc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmlyc3ROb2RlKTsKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpCi0JCQlzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGxhc3ROb2RlKTsKLQotCQlpZiAoZmlyc3ROb2RlID09IG51bGwgJiYgbGFzdE5vZGUgPT0gbnVsbCkgewotCQkJc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQlzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgeyAvLyByYW5nZSB2YWxpZGF0aW9uCi0JCQl2YWxpZGF0ZVJhbmdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVSYW5nZSgpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCB8fCBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSA+IHRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gbmVlZCB0byBzd2FwIGZpcnN0IGZvciBsYXN0Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYk1vZGlmaWVkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDZiZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xJdGVtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLlN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZURlY2xJdGVtSW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NTdHlsZURlY2xJdGVtIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBmUHJvcGVydHlOYW1lOwotCi0JLyoqCi0JICogQ1NTU3R5bGVEZWNsSXRlbUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbChDU1NTdHlsZURlY2xJdGVtSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZQcm9wZXJ0eU5hbWUgPSB0aGF0LmZQcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ1NTU3R5bGVEZWNsSXRlbUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZlByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0VmFsdWVCZWZvcmUodmFsdWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlRGVjbEl0ZW1JbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVWYWx1ZVNvdXJjZSgpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIodGhpcyk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCAmJiBmb3JtYXR0ZXIgaW5zdGFuY2VvZiBTdHlsZURlY2xJdGVtRm9ybWF0dGVyKQotCQkJcmV0dXJuICgoU3R5bGVEZWNsSXRlbUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRWYWx1ZSh0aGlzKS50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlCi0JICovCi0JcHVibGljIENTU1ZhbHVlIGdldENTU1ZhbHVlKCkgewotCQlpbnQgblZhbHVlID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmIChuVmFsdWUgPD0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChuVmFsdWUgPT0gMSkKLQkJCXJldHVybiBpdGVtKDApOwotCQllbHNlCi0JCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDU1NWYWx1ZVRleHQoKSB7Ci0JCWlmIChnZXRGaXJzdENoaWxkKCkgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCS8vIGNoZWNrIHdoZXRoZXIgY2hpbGRyZW4gaGFzIGZsYXRub2RlcwotCQlJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJCXJldHVybiBnZW5lcmF0ZVZhbHVlU291cmNlKCk7Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIC0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlyZXR1cm4gbm9kZS5nZXRUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Q3NzVmFsdWVUeXBlKCkgewotCQlyZXR1cm4gQ1NTX1ZBTFVFX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpCi0JCQkJaSsrOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRURFQ0xJVEVNX05PREU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSU1QT1JUQU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBmUHJvcGVydHlOYW1lLnRyaW0oKTsKLQkJcmV0dXJuIFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YobmFtZSkgIT0gbnVsbCA/IGZQcm9wZXJ0eU5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gcmVmVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBpbnNlcnRWYWx1ZUJlZm9yZShJQ1NTUHJpbWl0aXZlVmFsdWUgbmV3VmFsdWUsIElDU1NQcmltaXRpdmVWYWx1ZSByZWZWYWx1ZSkgewotCQlJQ1NTTm9kZSBub2RlID0gaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3VmFsdWUsIChDU1NOb2RlSW1wbCkgcmVmVmFsdWUpOwotCQlyZXR1cm4gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIENTU1ZhbHVlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NWYWx1ZSkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSByZW1vdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTTm9kZSBub2RlID0gcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSB2YWx1ZSk7Ci0JCXJldHVybiAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVwbGFjZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIG9sZFZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3VmFsdWU7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsKQotCQkJaW5zZXJ0VmFsdWVCZWZvcmUobmV3VmFsdWUsIG9sZFZhbHVlKTsKLQkJcmV0dXJuIHJlbW92ZVZhbHVlKG9sZFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVmFsdWVUZXh0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJSUNTU05vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCQlyZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIGNoaWxkKTsKLQkJCX0KLQkJCWNoaWxkID0gbmV4dDsKLQkJfQotCQlzZXRDc3NWYWx1ZVRleHRDb3JlKHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q3NzVmFsdWVUZXh0Q29yZShTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyB1c2UgdGVtcG9yYXJ5IGRvY3VtZW50Ci0JCXN5bmNocm9uaXplZCAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuY2xhc3MpIHsKLQkJCWlmIChzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJCQlzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCSgoQ1NTU291cmNlUGFyc2VyKSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpLnNldFBhcnNlck1vZGUoQ1NTU291cmNlUGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUpOwotCi0JCQl9Ci0JCQlzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KHZhbHVlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKG5vZGUuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBpdGVtUGFyc2VyID0gbmV3IENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihnZXRPd25lckRvY3VtZW50KCkpOwotCQkJaXRlbVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRUZW1wb3JhcnkodHJ1ZSk7Ci0JCQkvLyBtYWtlIGEgY29weSBvZiBub2RlbGlzdCBiZWNhdXNlIHNldHVwVmFsdWVzIHdpbGwgZGVzdHJveSBsaXN0Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgbm9kZUxpc3QgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKG5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJCWl0ZW1QYXJzZXIuc2V0dXBWYWx1ZXModGhpcywgbm9kZSwgbm9kZUxpc3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudCBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3UHJpb3JpdHkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eShqYXZhLmxhbmcuU3RyaW5nIG5ld1ByaW9yaXR5KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKElNUE9SVEFOVCwgbmV3UHJpb3JpdHkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2MTQyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0IHsKLQotCXByb3RlY3RlZCBJQ1NTRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVDaGlsZE5vZGVzKElDU1NOb2RlIHNyYywgSUNTU05vZGUgZGVzdCkgewotCQlpZiAoZk93bmVyRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKGRlc3QgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU05vZGVJbXBsIGNvbnRhaW5lciA9IChDU1NOb2RlSW1wbCkgZGVzdDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gc3JjLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCS8vIGV4dHJhY3Qgc2hvcnRoYW5kIHByb3BlcnR5IC4uCi0JCQkJLy8gLS0+IFRlbXAKLQkJCQlJQ1NTTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCWlmIChjbG9uZWQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkoKENTU05vZGVJbXBsKSBjbG9uZWQpLnNldE93bmVyRG9jdW1lbnQoZk93bmVyRG9jdW1lbnQpOwotCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBjbG9uZWQpOwotCQkJCQljbG9uZUNoaWxkTm9kZXMoY2hpbGQsIGNsb25lZCk7Ci0JCQkJfQotCQkJCS8vIDwtLSBUZW1wCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQ1NTTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCWlmIChjbG9uZWQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkoKENTU05vZGVJbXBsKSBjbG9uZWQpLnNldE93bmVyRG9jdW1lbnQoZk93bmVyRG9jdW1lbnQpOwotCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBjbG9uZWQpOwotCQkJCQljbG9uZUNoaWxkTm9kZXMoY2hpbGQsIGNsb25lZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBkZWNsID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKHRydWUpOwotCQlkZWNsLnNldE93bmVyRG9jdW1lbnQoZGVjbCk7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhN2YxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgQ1NTRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgSUNTU1N0eWxlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0RvY3VtZW50OwotCi0JQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJdGhpcy5mSXNEb2N1bWVudCA9IHRoYXQuZklzRG9jdW1lbnQ7Ci0JCWlmIChmSXNEb2N1bWVudCkgewotCQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJfQotCX0KLQotCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsKGJvb2xlYW4gaXNEb2N1bWVudCkgewotCQlzdXBlcigpOwotCQlmSXNEb2N1bWVudCA9IGlzRG9jdW1lbnQ7Ci0JCWlmIChmSXNEb2N1bWVudCkgewotCQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIGdldERlY2xJdGVtTm9kZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXRMYXN0Q2hpbGQoKTsKLQkJcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnRyaW0oKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSAoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGU7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkudHJpbSgpKSA9PSAwKQotCQkJCQlyZXR1cm4gaXRlbTsKLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCBpID0gMDsKLQkJSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkKLQkJCQlpKys7Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRURFQ0xBUkFUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIENTUyBydWxlIHRoYXQgY29udGFpbnMgdGhpcyBkZWNsYXJhdGlvbiBibG9jayBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIHRoaXMgPGNvZGU+Q1NTU3R5bGVEZWNsYXJhdGlvbjwvY29kZT4gaXMgbm90IGF0dGFjaGVkIHRvIGEKLQkgKiA8Y29kZT5DU1NSdWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRQYXJlbnRSdWxlKCkgewotCQlJQ1NTTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NSdWxlKQotCQkJcmV0dXJuIChDU1NSdWxlKSBwYXJlbnQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgYSBDU1MKLQkgKiBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBhIHNob3J0aGFuZAotCSAqIHByb3BlcnR5LiBTaG9ydGhhbmQgcHJvcGVydHkgdmFsdWVzIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZAotCSAqIGFzIHN0cmluZ3MsIHVzaW5nIHRoZSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5zZXRQcm9wZXJ0eTwvY29kZT4gbWV0aG9kcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldAotCSAqICAgICAgICAgZm9yIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0LgotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBnZXRQcm9wZXJ0eUNTU1ZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJcmV0dXJuIGl0ZW0uZ2V0Q1NTVmFsdWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgcHJpb3JpdHkgb2YgYSBDU1MgcHJvcGVydHkgKGUuZy4gdGhlCi0JICogPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+IHF1YWxpZmllcikgaWYgdGhlIHByb3BlcnR5IGhhcyBiZWVuCi0JICogZXhwbGljaXRseSBzZXQgaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJpb3JpdHkgKGUuZy4KLQkgKiAgICAgICAgIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPikgaWYgb25lIGV4aXN0cy4gVGhlIGVtcHR5IHN0cmluZyBpZgotCSAqICAgICAgICAgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVByaW9yaXR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJcmV0dXJuIGl0ZW0uZ2V0UHJpb3JpdHkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBDU1MgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseQotCSAqIHNldCB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldAotCSAqICAgICAgICAgZm9yIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUKLQkgKiAgICAgICAgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJQ1NTVmFsdWUgdmFsdWUgPSBnZXRQcm9wZXJ0eUNTU1ZhbHVlKHByb3BlcnR5TmFtZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmV0dXJuICgoSUNTU1ZhbHVlKSB2YWx1ZSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSXNEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgc2V0IGluIHRoaXMKLQkgKiBkZWNsYXJhdGlvbiBibG9jay4gVGhlIG9yZGVyIG9mIHRoZSBwcm9wZXJ0aWVzIHJldHJpZXZlZCB1c2luZyB0aGlzCi0JICogbWV0aG9kIGRvZXMgbm90IGhhdmUgdG8gYmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBzZXQuIFRoaXMKLQkgKiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGFsbCBwcm9wZXJ0aWVzIGluIHRoaXMgZGVjbGFyYXRpb24KLQkgKiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IG9mIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHJldHJpZXZlLgotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGF0IHRoaXMgb3JkaW5hbCBwb3NpdGlvbi4gVGhlIGVtcHR5Ci0JICogICAgICAgICBzdHJpbmcgaWYgbm8gcHJvcGVydHkgZXhpc3RzIGF0IHRoaXMgcG9zaXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsKSB7Ci0JCQkJaWYgKGkgIT0gaW5kZXgpCi0JCQkJCWkrKzsKLQkJCQllbHNlIHsKLQkJCQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgaXRlbSA9IChDU1NTdHlsZURlY2xJdGVtSW1wbCkgbm9kZTsKLQkJCQkJcmV0dXJuIGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gcmVtb3ZlRGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG9sZERlY2wpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gKElDU1NTdHlsZURlY2xJdGVtKSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIG9sZERlY2wpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmVtb3ZlIGEgQ1NTIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHdpdGhpbiB0aGlzCi0JICogZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0IG9yIHRoZSBwcm9wZXJ0eSBuYW1lIGRvZXMgbm90Ci0JICogICAgICAgICBjb3JyZXNwb25kIHRvIGEga25vd24gQ1NTIHByb3BlcnR5LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkZWNsYXJhdGlvbgotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5IG9yIHRoZSBwcm9wZXJ0eSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgaXRlbSk7Ci0JCQlyZXR1cm4gaXRlbS5nZXRDc3NUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIHNldERlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBuZXdEZWNsKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0RlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUobmV3RGVjbC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQlyZXR1cm4gKElDU1NTdHlsZURlY2xJdGVtKSByZXBsYWNlQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdEZWNsLCAoQ1NTTm9kZUltcGwpIGl0ZW0pOwotCQllbHNlCi0JCQlyZXR1cm4gKElDU1NTdHlsZURlY2xJdGVtKSBhcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld0RlY2wpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWUgYW5kIHByaW9yaXR5IHdpdGhpbiB0aGlzIGRlY2xhcmF0aW9uCi0JICogYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKiBAcGFyYW0gcHJpb3JpdHkKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgcHJpb3JpdHkgb2YgdGhlIHByb3BlcnR5IChlLmcuCi0JICogICAgICAgICAgICA8Y29kZT4iaW1wb3J0YW50IjwvY29kZT4pLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaGFzIGEgc3ludGF4Ci0JICogICAgICAgICAgICAgICAgZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGRlY2xhcmF0aW9uCi0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkgb3IgdGhlIHByb3BlcnR5IGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHByaW9yaXR5KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFlvdSBjYW4gdXNlIHRoaXMgb25seSBpZiBDU1NWYWx1ZS5zZXRDc3NUZXh0KCkgaXMgaW1wbGVtZW50ZWQKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgaXRlbSA9IChDU1NTdHlsZURlY2xJdGVtSW1wbCkgZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCWl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCQlhcHBlbmRDaGlsZChpdGVtKTsKLQkJfQotCi0JCS8vIElDU1NOb2RlIG5leHQgPSBpdGVtLmdldE5leHRTaWJsaW5nKCk7Ci0JCS8vIHJlbW92ZUNoaWxkKGl0ZW0pOwotCi0JCWl0ZW0uc2V0Q3NzVmFsdWVUZXh0KHZhbHVlKTsKLQkJaXRlbS5zZXRQcmlvcml0eShwcmlvcml0eSk7Ci0KLQkJLy8gaW5zZXJ0QmVmb3JlKGl0ZW0sIChDU1NOb2RlSW1wbCluZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhZGQxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVEZWNsQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1N0eWxlUnVsZSB7Ci0KLQlJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChudWxsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTU3R5bGVSdWxlSW1wbChDU1NTdHlsZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RvclRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVSVUxFX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gZlNlbGVjdG9yTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VsZWN0b3IgZm9yIHRoZSBydWxlIHNldC4gVGhlCi0JICogaW1wbGVtZW50YXRpb24gbWF5IGhhdmUgc3RyaXBwZWQgb3V0IGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSB3aGlsZQotCSAqIHBhcnNpbmcgdGhlIHNlbGVjdG9yLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgQ1NTIHN0cmluZyB2YWx1ZSBoYXMKLQkgKiAgICAgICAgICAgICAgICBhIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRV9SVUxFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGV4dChTdHJpbmcgc2VsZWN0b3JUZXh0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNFTEVDVE9SLCBzZWxlY3RvclRleHQpOwotCQlmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoc2VsZWN0b3JUZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVNoZWV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVNoZWV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjJhMmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0UnVsZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVTaGVldEltcGwgZXh0ZW5kcyBDU1NEb2N1bWVudEltcGwgaW1wbGVtZW50cyBJQ1NTU3R5bGVTaGVldCB7Ci0KLQotCWNsYXNzIEludGVybmFsTm9kZUxpc3QgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0KLQkJVmVjdG9yIG5vZGVzID0gbmV3IFZlY3RvcigpOwotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJaWYgKG5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGkpIHsKLQkJCWlmIChub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGkgPCAwIHx8IG5vZGVzLnNpemUoKSA8PSBpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChOb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbnRlcm5hbFN0eWxlU2hlZXRMaXN0IGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIFN0eWxlU2hlZXRMaXN0IHsKLQotCQlwdWJsaWMgSUNTU05vZGUgYXBwZW5kTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCQlpZiAobm9kZXMgPT0gbnVsbCB8fCAhbm9kZXMuY29udGFpbnMobm9kZSkpCi0JCQkJcmV0dXJuIHN1cGVyLmFwcGVuZE5vZGUobm9kZSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgU3R5bGVTaGVldCBpdGVtKGludCBpKSB7Ci0JCQlyZXR1cm4gKFN0eWxlU2hlZXQpIGl0ZW1JbXBsKGkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZEaXNhYmxlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVTaGVldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JQ1NTU3R5bGVTaGVldEltcGwoQ1NTU3R5bGVTaGVldEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBhcHBlbmRSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZVNoZWV0SW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlCi0JICovCi0JcHVibGljIElDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpIHsKLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTQ2hhcnNldFJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JcHVibGljIENTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NGb250RmFjZVJ1bGVJbXBsKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHN0eWxlID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChzdHlsZSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlCi0JICovCi0JcHVibGljIElDU1NJbXBvcnRSdWxlIGNyZWF0ZUNTU0ltcG9ydFJ1bGUoKSB7Ci0JCUNTU0ltcG9ydFJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTSW1wb3J0UnVsZUltcGwoKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYSA9IChNZWRpYUxpc3RJbXBsKSBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKG1lZGlhKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLklDU1NNZWRpYVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU01lZGlhUnVsZSBjcmVhdGVDU1NNZWRpYVJ1bGUoKSB7Ci0JCUNTU01lZGlhUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NNZWRpYVJ1bGVJbXBsKCk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWEgPSAoTWVkaWFMaXN0SW1wbCkgY3JlYXRlTWVkaWFMaXN0KCk7Ci0KLQkJcnVsZS5pbnNlcnRCZWZvcmUobWVkaWEsIChDU1NOb2RlSW1wbCkgcnVsZS5nZXRGaXJzdENoaWxkKCkpOyAvLyBtZWRpYQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gdG9wCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2hpbGRyZW4KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxpc3QKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlCi0JICovCi0JcHVibGljIElDU1NQYWdlUnVsZSBjcmVhdGVDU1NQYWdlUnVsZSgpIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTUGFnZVJ1bGVJbXBsKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHN0eWxlID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChzdHlsZSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKFN0cmluZyBydWxlKSB7Ci0JCUNTU0RvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXQocnVsZSk7Ci0KLQkJLy9DU1NNb2RlbFBhcnNlciBtb2RlbFBhcnNlciA9IG5ldyBDU1NNb2RlbFBhcnNlcigoQ1NTRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCkpOwotCQlDU1NNb2RlbFBhcnNlciBtb2RlbFBhcnNlciA9IG5ldyBDU1NNb2RlbFBhcnNlcihnZXRPd25lckRvY3VtZW50KCkpOwotCQlyZXR1cm4gbW9kZWxQYXJzZXIuY3JlYXRlQ1NTUnVsZShzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGRlY2wgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwoZmFsc2UpOwotCQlkZWNsLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlCi0JICovCi0JcHVibGljIElDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCkgewotCQlDU1NTdHlsZVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTU3R5bGVSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTVW5rbm93blJ1bGUgY3JlYXRlQ1NTVW5rbm93blJ1bGUoKSB7Ci0JCUNTU1Vua25vd25SdWxlSW1wbCBydWxlID0gbmV3IENTU1Vua25vd25SdWxlSW1wbCgpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QKLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGNyZWF0ZU1lZGlhTGlzdCgpIHsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYSA9IG5ldyBNZWRpYUxpc3RJbXBsKCk7Ci0JCW1lZGlhLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIG1lZGlhOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gZGVsZXRlIGEgcnVsZSBmcm9tIHRoZSBzdHlsZSBzaGVldC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBsaXN0IG9mIHRoZSBydWxlIHRvCi0JICogICAgICAgICAgICByZW1vdmUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggZG9lcyBub3QKLQkgKiAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIGEgcnVsZSBpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgc3R5bGUgc2hlZXQKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVSdWxlKGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUNTU05vZGVJbXBsIG5vZGUgPSBnZXRJbmRleGVkUnVsZShpbmRleCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBhbGwgQ1NTIHJ1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0LiBUaGlzCi0JICogaW5jbHVkZXMgYm90aCBydWxlIHNldHMgYW5kIGF0LXJ1bGVzLgotCSAqLwotCXB1YmxpYyBDU1NSdWxlTGlzdCBnZXRDc3NSdWxlcygpIHsKLQkJQ1NTUnVsZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCWxpc3QuYXBwZW5kTm9kZShub2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaXMgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQuCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgbm90LiBNb2RpZnlpbmcgdGhpcyBhdHRyaWJ1dGUgbWF5IGNhdXNlIGEKLQkgKiBuZXcgcmVzb2x1dGlvbiBvZiBzdHlsZSBmb3IgdGhlIGRvY3VtZW50LiBBIHN0eWxlc2hlZXQgb25seSBhcHBsaWVzIGlmCi0JICogYm90aCBhbiBhcHByb3ByaWF0ZSBtZWRpdW0gZGVmaW5pdGlvbiBpcyBwcmVzZW50IGFuZCB0aGUgZGlzYWJsZWQKLQkgKiBhdHRyaWJ1dGUgaXMgZmFsc2UuIFNvLCBpZiB0aGUgbWVkaWEgZG9lc24ndCBhcHBseSB0byB0aGUgY3VycmVudCB1c2VyCi0JICogYWdlbnQsIHRoZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4gYXR0cmlidXRlIGlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCXJldHVybiBmRGlzYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHN0eWxlIHNoZWV0IGlzIGEgbGlua2VkIHN0eWxlIHNoZWV0LCB0aGUgdmFsdWUgb2YgaXRzIGF0dHJpYnV0ZQotCSAqIGlzIGl0cyBsb2NhdGlvbi4gRm9yIGlubGluZSBzdHlsZSBzaGVldHMsIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBTZWUgdGhlIGhyZWYgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZQotCSAqIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsIGFuZCB0aGUgaHJlZiBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQlyZXR1cm4gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkvKgotCQkJICogT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsgaWYgKGlkICE9IG51bGwpIHsgaWYgKGlkIGluc3RhbmNlb2YKLQkJCSAqIElSZXNvdXJjZSkgeyAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBjb3JyZWN0IG9yCi0JCQkgKiBub3QsIGxhdGVyLiByZXR1cm4gKChJUmVzb3VyY2UpaWQpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsgfQotCQkJICogcmV0dXJuIGlkLnRvU3RyaW5nKCk7IH0KLQkJCSAqL30KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQ1NTUnVsZUltcGwgZ2V0SW5kZXhlZFJ1bGUoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQlpZiAoaSsrID09IGluZGV4KQotCQkJCQlyZXR1cm4gKENTU1J1bGVJbXBsKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiBtZWRpYSBmb3Igc3R5bGUgaW5mb3JtYXRpb24uIFRoZSBtZWRpYSBpcwotCSAqIG9mdGVuIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gSWYgbm8gbWVkaWEgaGFzIGJlZW4KLQkgKiBzcGVjaWZpZWQsIHRoZSA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+IHdpbGwgYmUgZW1wdHkuIFNlZSB0aGUgbWVkaWEKLQkgKiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsCi0JICogYW5kIHRoZSBtZWRpYSBwc2V1ZG8tYXR0cmlidXRlIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcKLQkgKiBpbnN0cnVjdGlvbiAuIE1vZGlmeWluZyB0aGUgbWVkaWEgbGlzdCBtYXkgY2F1c2UgYSBjaGFuZ2UgdG8gdGhlCi0JICogYXR0cmlidXRlIDxjb2RlPmRpc2FibGVkPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVTSEVFVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSBub2RlIHRoYXQgYXNzb2NpYXRlcyB0aGlzIHN0eWxlIHNoZWV0IHdpdGggdGhlIGRvY3VtZW50LiBGb3IgSFRNTCwKLQkgKiB0aGlzIG1heSBiZSB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5MSU5LPC9jb2RlPiBvciA8Y29kZT5TVFlMRTwvY29kZT4KLQkgKiBlbGVtZW50LiBGb3IgWE1MLCBpdCBtYXkgYmUgdGhlIGxpbmtpbmcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gRm9yCi0JICogc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IG90aGVyIHN0eWxlIHNoZWV0cywgdGhlIHZhbHVlIG9mIHRoaXMKLQkgKiBhdHRyaWJ1dGUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIE5vZGUgZ2V0T3duZXJOb2RlKCkgewotCQkvLyBmb3IgPExJTks+IHRhZyBvciA8U1RZTEU+IHRhZwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCXJldHVybiBtb2RlbC5nZXRPd25lckRPTU5vZGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRPd25lck5vZGVzKCkgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbE5vZGVMaXN0IG5vZGVzID0gbmV3IEludGVybmFsTm9kZUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJbm9kZXMubm9kZXMuYWRkKCgoSVN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkKLQkJCXJldHVybiBub2RlczsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldE93bmVyTm9kZXMoRG9jdW1lbnQgZG9jKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsTm9kZUxpc3Qgbm9kZXMgPSBuZXcgSW50ZXJuYWxOb2RlTGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpIHsKLQkJCQlFbGVtZW50IGVsZSA9ICgoSVN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlLmdldE93bmVyRG9jdW1lbnQoKSA9PSBkb2MpCi0JCQkJCW5vZGVzLm5vZGVzLmFkZChlbGUpOwotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gbm9kZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgc3R5bGUgc2hlZXQgY29tZXMgZnJvbSBhbiA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbAotCSAqICAgICAgICAgY29udGFpbiB0aGUgPGNvZGU+Q1NTSW1wb3J0UnVsZTwvY29kZT4uIEluIHRoYXQgY2FzZSwgdGhlCi0JICogICAgICAgICA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZSBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXQ8L2NvZGU+IGludGVyZmFjZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqICAgICAgICAgSWYgdGhlIHN0eWxlIHNoZWV0IGNvbWVzIGZyb20gYW4gZWxlbWVudCBvciBhIHByb2Nlc3NpbmcKLQkgKiAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbCBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZQotCSAqICAgICAgICAgd2lsbCBjb250YWluIHRoZSA8Y29kZT5Ob2RlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRPd25lclJ1bGUoKSB7Ci0JCUFzc2VydC5pc1RydWUoZmFsc2UsIENTU0NvcmVNZXNzYWdlcy5Zb3VfY2Fubm90X3VzZV9DU1NTdHlsZVNoZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIllvdSBjYW5ub3QgdXNlIENTU1N0eWxlU2hlZXQuZ2V0T3duZXJSdWxlKCkgYmVjYXVzZSBvZiBtYW55IHJlZmVyZW5jZXJzIG9mIHRoaXMgcnVsZVxuUGxlYXNlIHVzZSBnZXRPbndlclJ1bGVzKCkiCi0JCS8vIGZvciBAaW1wb3J0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0Ci0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdCBnZXRPd25lclJ1bGVzKCkgewotCQlTdHlsZVNoZWV0TGlzdCBsaXN0ID0gZ2V0UGFyZW50U3R5bGVTaGVldHMoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NSdWxlTGlzdEltcGwgcnVsZUxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3Rvcih0aGlzKTsKLQkJCXRyYXYuYXBwbHkoKElDU1NTdHlsZVNoZWV0KSBsaXN0Lml0ZW0oaSkpOwotCQkJcnVsZUxpc3Qubm9kZXMuYWRkQWxsKHRyYXYuZ2V0UnVsZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJ1bGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEZvciBzdHlsZSBzaGVldCBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHRoZSBjb25jZXB0IG9mIHN0eWxlIHNoZWV0Ci0JICogaW5jbHVzaW9uLCB0aGlzIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBpbmNsdWRpbmcgc3R5bGUgc2hlZXQsIGlmIG9uZQotCSAqIGV4aXN0cy4gSWYgdGhlIHN0eWxlIHNoZWV0IGlzIGEgdG9wLWxldmVsIHN0eWxlIHNoZWV0LCBvciB0aGUgc3R5bGUKLQkgKiBzaGVldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGluY2x1c2lvbiwgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0UGFyZW50U3R5bGVTaGVldCgpIHsKLQkJQ1NTUnVsZSBvd25lciA9IGdldE93bmVyUnVsZSgpOwotCQlpZiAob3duZXIgIT0gbnVsbCkKLQkJCXJldHVybiBvd25lci5nZXRQYXJlbnRTdHlsZVNoZWV0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QgZ2V0UGFyZW50U3R5bGVTaGVldHMoKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsU3R5bGVTaGVldExpc3Qgc2hlZXRzID0gbmV3IEludGVybmFsU3R5bGVTaGVldExpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkJc2hlZXRzLmFwcGVuZE5vZGUoKChJQ1NTTW9kZWwpIG9iaikuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNoZWV0cy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc2hlZXRzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWR2aXNvcnkgdGl0bGUuIFRoZSB0aXRsZSBpcyBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlCi0JICogPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gU2VlIHRoZSB0aXRsZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwgYW5kIHRoZSB0aXRsZSBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRJVExFIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIHRoZSBzdHlsZSBzaGVldCBsYW5ndWFnZSBmb3IgdGhpcyBzdHlsZSBzaGVldC4gVGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGFzIGEgY29udGVudCB0eXBlIChlLmcuICJ0ZXh0L2NzcyIpLiBUaGUKLQkgKiBjb250ZW50IHR5cGUgaXMgb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+LiBBbHNvCi0JICogc2VlIHRoZSB0eXBlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudAotCSAqIGluIEhUTUwgNC4wLCBhbmQgdGhlIHR5cGUgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldAotCSAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRZUEUiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBpbnNlcnQgYSBuZXcgcnVsZSBpbnRvIHRoZSBzdHlsZSBzaGVldC4gVGhlIG5ldyBydWxlIG5vdwotCSAqIGJlY29tZXMgcGFydCBvZiB0aGUgY2FzY2FkZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgVGhlIHBhcnNhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBydWxlLiBGb3IgcnVsZSBzZXRzIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIHNlbGVjdG9yIGFuZCB0aGUgc3R5bGUgZGVjbGFyYXRpb24uIEZvcgotCSAqICAgICAgICAgICAgYXQtcnVsZXMsIHRoaXMgc3BlY2lmaWVzIGJvdGggdGhlIGF0LWlkZW50aWZpZXIgYW5kIHRoZSBydWxlCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIHNwZWNpZmllZCBydWxlLiBJZiB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICAgICBpbmRleCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24sIHRoZSBydWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3R5bGUKLQkgKiAgICAgICAgICAgIHNoZWV0LgotCSAqIEByZXR1cm4gVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlIG5ld2x5Ci0JICogICAgICAgICBpbnNlcnRlZCBydWxlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIHJ1bGUgY2Fubm90IGJlCi0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBlLmcuIGlmIGFuCi0JICogICAgICAgICAgICAgICAgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyBpbnNlcnRlZCBhZnRlciBhIHN0YW5kYXJkIHJ1bGUgc2V0IG9yIG90aGVyCi0JICogICAgICAgICBhdC1ydWxlLiA8YnI+Ci0JICogICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgbm90IGEgdmFsaWQKLQkgKiAgICAgICAgIGluc2VydGlvbiBwb2ludC4gPGJyPgotCSAqICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldCBpcwotCSAqICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJ1bGUgaGFzIGEgc3ludGF4IGVycm9yIGFuZAotCSAqICAgICAgICAgaXMgdW5wYXJzYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydFJ1bGUoU3RyaW5nIHJ1bGUsIGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBnZXRDc3NSdWxlcygpLmdldExlbmd0aCgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGxlbmd0aCA8IGluZGV4KQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NSdWxlSW1wbCByZWZSdWxlID0gKGxlbmd0aCAhPSBpbmRleCkgPyBnZXRJbmRleGVkUnVsZShpbmRleCkgOiBudWxsOwotCQlpbnQgb2Zmc2V0ID0gKHJlZlJ1bGUgIT0gbnVsbCkgPyByZWZSdWxlLmdldFN0YXJ0T2Zmc2V0KCkgOiBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCWRvYy5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIHJ1bGUpOwotCi0JCS8vIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIGNyZWF0ZUNTU1J1bGUocnVsZSkscmVmUnVsZSk7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVmUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgcmVmUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSByZWZSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZW1vdmVSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlcGxhY2VSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIG9sZFJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgb2xkUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogc2V0RGlzYWJsZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkgewotCQl0aGlzLmZEaXNhYmxlZCA9IGRpc2FibGVkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NVbmtub3duUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZGE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NVbmtub3duUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIENTU1Vua25vd25SdWxlIHsKLQotCS8vIFRPRE86IFRoaXMgZmllbGQgaXMgbmV2ZXIgcmVhZAotCVN0cmluZyBmQ3NzVGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NVbmtub3duUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTVW5rbm93blJ1bGVJbXBsKENTU1Vua25vd25SdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1Vua25vd25SdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTVW5rbm93blJ1bGVJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFVOS05PV05SVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVU5LTk9XTl9SVUxFOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQl0aGlzLmZDc3NUZXh0ID0gY3NzVGV4dDsKLQotCQlzdXBlci5zZXRDc3NUZXh0KGNzc1RleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNmFlNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db3VudGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNvdW50ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENvdW50ZXJJbXBsIGV4dGVuZHMgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGltcGxlbWVudHMgSUNvdW50ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JQ291bnRlckltcGwoKSB7Ci0JCXN1cGVyKENTU19DT1VOVEVSKTsKLQl9Ci0KLQlDb3VudGVySW1wbChDb3VudGVySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNvdW50ZXJJbXBsIGNsb25lZCA9IG5ldyBDb3VudGVySW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIENvdW50ZXIgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgY291bnRlciB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPkNvdW50ZXI8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBDb3VudGVyIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIENvdW50ZXIgdmFsdWUgKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfQ09VTlRFUjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBDb3VudGVyIGdldENvdW50ZXJWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgaWRlbnRpZmllciBvZiB0aGUgY291bnRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSURFTlRJRklFUik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHN0eWxlIG9mIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJU1RTVFlMRSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHNlcGFyYXRvciBvZiB0aGUgbmVzdGVkIGNvdW50ZXJzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VwYXJhdG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFUEFSQVRPUik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByaW1pdGl2ZXMoKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKElERU5USUZJRVIsIGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0U3R5bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlKFN0cmluZyBsaXN0U3R5bGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoTElTVFNUWUxFLCBsaXN0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBTZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBTZXBhcmF0b3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VQQVJBVE9SLCBTZXBhcmF0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NQ1NTSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDI4YTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NQ1NTSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBET01DU1NJbXBsIHsKLQotCS8qKgotCSAqIERPTUNTU0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRE9NQ1NTSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZG9jdW1lbnQgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodHJ1ZSk7Ci0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbWVkaWEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBDU1NTdHlsZVNoZWV0IGNyZWF0ZUNTU1N0eWxlU2hlZXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVkaWEpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IENTU1N0eWxlU2hlZXRJbXBsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWVkaWFMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZmZiNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgTWVkaWFMaXN0SW1wbCBleHRlbmRzIENTU1JlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIE1lZGlhTGlzdCB7Ci0KLQlpbnQgbWVkaXVtQ291bnRlcjsKLQotCS8qKgotCSAqIE1lZGlhTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlNZWRpYUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1lZGlhTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlNZWRpYUxpc3RJbXBsKE1lZGlhTGlzdEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBtZWRpdW0gPGNvZGU+bmV3TWVkaXVtPC9jb2RlPiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBJZiB0aGUKLQkgKiA8Y29kZT5uZXdNZWRpdW08L2NvZGU+IGlzIGFscmVhZHkgdXNlZCwgaXQgaXMgZmlyc3QgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWVkaXVtVGhlCi0JICogICAgICAgICAgICBuZXcgbWVkaXVtIHRvIGFkZC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogSWYgdGhlIG1lZGl1bSBjb250YWlucyBjaGFyYWN0ZXJzCi0JICogICAgICAgICAgICAgICAgdGhhdCBhcmUgaW52YWxpZCBpbiB0aGUgdW5kZXJseWluZyBzdHlsZSBsYW5ndWFnZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbGlzdCBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZE1lZGl1bShTdHJpbmcgbmV3TWVkaXVtKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld01lZGl1bSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNTU05vZGVMaXN0SW1wbCBtID0gZ2V0TWVkaWEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gbS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAobmV3TWVkaXVtLmVxdWFscyhpdGVtKGkpKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRBdHRyaWJ1dGUoIm1lZGl1bSIgKyBJbnRlZ2VyLnRvU3RyaW5nKG1lZGl1bUNvdW50ZXIrKyksIG5ld01lZGl1bSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCU1lZGlhTGlzdEltcGwgY2xvbmVkID0gbmV3IE1lZGlhTGlzdEltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgbWVkaXVtIGluZGljYXRlZCBieSA8Y29kZT5vbGRNZWRpdW08L2NvZGU+IGZyb20gdGhlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIG9sZE1lZGl1bVRoZQotCSAqICAgICAgICAgICAgbWVkaXVtIHRvIGRlbGV0ZSBpbiB0aGUgbWVkaWEgbGlzdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbGlzdCBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9sZE1lZGl1bTwvY29kZT4gaXMgbm90Ci0JICogICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlTWVkaXVtKFN0cmluZyBvbGRNZWRpdW0pIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSAhPSBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAob2xkTWVkaXVtLmVxdWFscyhpdGVtKGkpKSkgewotCQkJCXJlbW92ZUF0dHJpYnV0ZU5vZGUoKENTU0F0dHJJbXBsKSBmQXR0cnMuaXRlbShpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIG1lZGlhIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgbWVkaWEgaXMKLQkgKiA8Y29kZT4wPC9jb2RlPiB0byA8Y29kZT5sZW5ndGgtMTwvY29kZT4gaW5jbHVzaXZlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TWVkaWEoKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIENTU05vZGVMaXN0SW1wbAotCSAqLwotCUNTU05vZGVMaXN0SW1wbCBnZXRNZWRpYSgpIHsKLQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJcmV0dXJuIGZBdHRyczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFyc2FibGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgbGlzdC4gVGhpcyBpcyBhCi0JICogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgdmFsdWUgaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1lZGlhIGxpc3QKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lZGlhVGV4dCgpIHsKLQkJcmV0dXJuIGdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzE3Ci0JICogMTg6NTA6MjkpCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBTElTVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiB0aCBpbiB0aGUgbGlzdC4gSWYgPGNvZGU+aW5kZXg8L2NvZGU+Ci0JICogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgbWVkaWEgaW4gdGhlIGxpc3QsIHRoaXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgSW5kZXggaW50byB0aGUgY29sbGVjdGlvbi4KLQkgKiBAcmV0dXJuIFRoZSBtZWRpdW0gYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiB0aCBwb3NpdGlvbiBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPk1lZGlhTGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMKLQkgKiAgICAgICAgIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBnZXRMZW5ndGgoKSA8PSBpbmRleCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoKENTU0F0dHJJbXBsKSBnZXRNZWRpYSgpLml0ZW0oaW5kZXgpKS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIHNldE1lZGlhVGV4dCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZWRpYVRleHQoU3RyaW5nIG1lZGlhVGV4dCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldENzc1RleHQobWVkaWFUZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUkdCQ29sb3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDRiODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SR0JDb2xvcjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBSR0JDb2xvckltcGwgZXh0ZW5kcyBDU1NQcmltaXRpdmVDb250YWluZXIgaW1wbGVtZW50cyBSR0JDb2xvciB7Ci0KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmUmVkOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZHcmVlbjsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmQmx1ZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVJHQkNvbG9ySW1wbCgpIHsKLQkJc3VwZXIoQ1NTX1JHQkNPTE9SKTsKLQl9Ci0KLQlSR0JDb2xvckltcGwoUkdCQ29sb3JJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJZlJlZCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mUmVkKTsKLQkJYXBwZW5kQ2hpbGQoZlJlZCk7Ci0KLQkJZkdyZWVuID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZHcmVlbik7Ci0JCWFwcGVuZENoaWxkKGZHcmVlbik7Ci0KLQkJZkJsdWUgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkJsdWUpOwotCQlhcHBlbmRDaGlsZChmQmx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJUkdCQ29sb3JJbXBsIGNsb25lZCA9IG5ldyBSR0JDb2xvckltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgYmx1ZSB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRCbHVlKCkgewotCQlyZXR1cm4gZkJsdWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGdyZWVuIHZhbHVlIG9mIHRoZSBSR0IgY29sb3IuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEdyZWVuKCkgewotCQlyZXR1cm4gZkdyZWVuOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSByZWQgdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0UmVkKCkgewotCQlyZXR1cm4gZlJlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5SR0JDb2xvcgotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgUkdCQ29sb3IgZ2V0UkdCQ29sb3JWYWx1ZSgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UHJpbWl0aXZlcygpIHsKLQotCQlmUmVkID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmUmVkKTsKLQotCQlmR3JlZW4gPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZHcmVlbik7Ci0KLQkJZkJsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZCbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNjMmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SZWN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIFJlY3RJbXBsIGV4dGVuZHMgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGltcGxlbWVudHMgUmVjdCB7Ci0KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmVG9wOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZSaWdodDsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmQm90dG9tOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZMZWZ0OwotCi0JLyoqCi0JICogCi0JICovCi0JUmVjdEltcGwoKSB7Ci0JCXN1cGVyKENTU19SRUNUKTsKLQl9Ci0KLQlSZWN0SW1wbChSZWN0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWZUb3AgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlRvcCk7Ci0JCWFwcGVuZENoaWxkKGZUb3ApOwotCi0JCWZSaWdodCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mUmlnaHQpOwotCQlhcHBlbmRDaGlsZChmUmlnaHQpOwotCi0JCWZCb3R0b20gPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkJvdHRvbSk7Ci0JCWFwcGVuZENoaWxkKGZCb3R0b20pOwotCi0JCWZMZWZ0ID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZMZWZ0KTsKLQkJYXBwZW5kQ2hpbGQoZkxlZnQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVJlY3RJbXBsIGNsb25lZCA9IG5ldyBSZWN0SW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBib3R0b20gb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEJvdHRvbSgpIHsKLQkJcmV0dXJuIGZCb3R0b207Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGxlZnQgb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldExlZnQoKSB7Ci0JCXJldHVybiBmTGVmdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5SZWN0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBSZWN0IGdldFJlY3RWYWx1ZSgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgcmlnaHQgb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFJpZ2h0KCkgewotCQlyZXR1cm4gZlJpZ2h0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSB0b3Agb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFRvcCgpIHsKLQkJcmV0dXJuIGZUb3A7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByaW1pdGl2ZXMoKSB7Ci0KLQkJZlRvcCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlRvcCk7Ci0KLQkJZlJpZ2h0ID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmUmlnaHQpOwotCi0JCWZCb3R0b20gPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZCb3R0b20pOwotCi0JCWZMZWZ0ID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmTGVmdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3R5bGVTaGVldExpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWExYmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3R5bGVTaGVldExpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIAotICovCi1jbGFzcyBTdHlsZVNoZWV0TGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgU3R5bGVTaGVldExpc3QgewotCi0JLyoqCi0JICogU3R5bGVTaGVldExpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JU3R5bGVTaGVldExpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgYSBzdHlsZSBzaGVldCBieSBvcmRpbmFsIGluZGV4LiBJZiBpbmRleCBpcyBncmVhdGVyCi0JICogdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHN0eWxlIHNoZWV0cyBpbiB0aGUgbGlzdCwgdGhpcyByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4SW5kZXgKLQkgKiAgICAgICAgICAgIGludG8gdGhlIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBzdHlsZSBzaGVldCBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHBvc2l0aW9uIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+U3R5bGVTaGVldExpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0Ci0JICogICAgICAgICBpcyBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBpdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gKFN0eWxlU2hlZXQpIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNmNzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgZG9jdW1lbnQgaXMgZW1wdHksIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBub2RlcywKLQkJLy8gc28gbm8gbmVlZCB0byBjb250aW51ZS4KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgbm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBudWxsOwotCQkJLy8gc2tpcCBhbnkgaW5pdGlhbCB3aGl0ZXNwYWNlCi0JCQkvLyBOb3RlIHRoYXQgQGNoYXJzZXQgImVuY29kaW5nbmFtZSI7Ci0JCQkvLyBtdXN0IGFwcGVhciBhdCB2ZXJ5IGJlZ2lubmluZyBvZiBkb2N1bWVudCwKLQkJCS8vIHRvIGJlIHZhbGlkLgotCQkJLy8gTWF5IGhhdmUgdG8gdGVzdCB3aXRoICJkYW1hZ2VkIiBmaWxlcyAoZS5nLgotCQkJLy8gYmVnaW5uaW5nIEVPTHMsIGV0Yy4sIHRvIHZlcmlmeSB0aGlzIHdvcmtzCi0JCQkvLyBhcyBleHBlY3RlZC4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCW5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCWlmIChnZXRUeXBlKG5vZGUpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgcmVnaW9ucyk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgcmVnaW9ucyk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gaWYgZGlkbid0IGZpbmQgdGhlIHJlZ2lvbiwgaXRzIHByb2JhYmx5IGR1ZSB0byBpbGwKLQkJCQkJLy8gZm9ybWVkIGlucHV0LCBzdWNoIGFzCi0JCQkJCS8vIEBjaGFyc2V0ICJJU08tODg1OS02OwotCQkJCQkvLyBzbyB3ZSdsbCB0cnkgYWdhaW4gZm9yICJ1bmtub3duIiByZWdpb24uCi0JCQkJCS8vIElmIHRoYXQgZmFpbHMsIHdlJ2xsIGdpdmUgdXA/Ci0JCQkJCXJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCQlyZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCByZWdpb25zKTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZVJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04sIHJlZ2lvbnMpOwotCQkJCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQlyZXN1bHQgPSBub2RlLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBub2RlLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJCX0KLQkJCQlyZXN1bHQgPSBTdHJpbmdVdGlscy5zdHJpcE5vbkxldHRlckRpZ2l0cyhyZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZ05hbWUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQllbmMgPSBnZXRFbmNvZGluZ05hbWUoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRPRE8gSW1wb3J0YW50OiBuZWVkIHRvIGltcGxlbWVudCBzb21lICJyYXciIHBhcnNlciBmb3IKLQkJCS8vIElEb2N1bWVudCBsZXZlbAotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCVN0cmluZyByZXN1bHQgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbk9mVHlwZShTdHJpbmcgdHlwZSwgSXRlcmF0b3IgcmVnaW9ucykgewotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gdHlwZSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDEyZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nR3Vlc3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDU1NfSUQgPSBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTOwotCXByaXZhdGUgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQotCi0JcHVibGljIENTU0RvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lQnlHdWVzcyhieXRlW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyBpYW5hRW5jID0gbnVsbDsKLQkJaWFuYUVuYyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKHN0cmluZywgbGVuZ3RoKTsKLQkJcmV0dXJuIGlhbmFFbmM7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBlbmNvZGluZy4gRm9yIENTUyB0aGVyZSBpcyBubyBzcGVjJ2QgZGVmYXVsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJLy8gRE1XOiBJIGNvcGllZCB0aGlzIGZyb20gQ1NTTW9kZWxJbXBsZSAuLi4KLQkJLy8gYnV0IGFtIG5vdCBzdXJlIGl0cyByaWdodAotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciByZVBhcnNlciA9IG5ldyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQlyZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihyZVBhcnNlcik7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCS8vIHJldHVybiBuZXcgQ1NTUmVnaW9uUGFyc2VyKCk7Ci0JCXJldHVybiBuZXcgQ1NTU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENTU19JRCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUygpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NGU5NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY1NWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZU5vdGlmaWVyIGV4dGVuZHMgSUNTU1N0eWxlTGlzdGVuZXIgewotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUxpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNSZWNvcmRpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmJjMjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIgZXh0ZW5kcyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgewotCi0JLyoqCi0JICogQ1NTRW1iZWRkZWRTdHlsZU5vdGlmeUFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyBDU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyKElDU1NNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVMaXN0ZW5lcikgewotCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVDaGFuZ2VkKHNyY01vZGVsLCByZW1vdmVkLCBhZGRlZCwgbWVkaWEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZVVwZGF0ZShzcmNNb2RlbCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVFdmVudERlbGl2ZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVFdmVudERlbGl2ZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJiOWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyIHsKLQotCXByaXZhdGUgVmVjdG9yIGZWaXNpdGVkID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgSUNTU01vZGVsIGZTcmNNb2RlbDsKLQlwcml2YXRlIElDU1NTZWxlY3RvcltdIGZSZW1vdmVkOwotCXByaXZhdGUgSUNTU1NlbGVjdG9yW10gZkFkZGVkOwotCXByaXZhdGUgU3RyaW5nIGZNZWRpYTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmUoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCQl0aGlzLmZSZW1vdmVkID0gcmVtb3ZlZDsKLQkJdGhpcy5mQWRkZWQgPSBhZGRlZDsKLQkJdGhpcy5mTWVkaWEgPSBtZWRpYTsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCWZWaXNpdGVkLmFkZChzcmNNb2RlbCk7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJdmlzaXQoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRvKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQkJdGhpcy5mUmVtb3ZlZCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZkFkZGVkID0gYWRkZWQ7Ci0JCXRoaXMuZk1lZGlhID0gbWVkaWE7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQkvLyB2aXNpdGVkLmFkZChzcmNNb2RlbCk7IDogYmVjYXVzZSBsb29waW5nIHByb2JsZW0KLQkJdmlzaXQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJZlZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2aXNpdFVwZGF0ZSgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVXBkYXRlVG8oSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlpZiAoc3JjTW9kZWwgPT0gbnVsbCB8fCBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCS8vIHZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJdmlzaXRVcGRhdGUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0KElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsIHx8IGZWaXNpdGVkLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCXJldHVybjsKLQotCQkvLyBmaXJlIGV2ZW50IHRvIGxpc3RlbmVyCi0JCWxpc3RlbmVyLnN0eWxlQ2hhbmdlZChmU3JjTW9kZWwsIGZSZW1vdmVkLCBmQWRkZWQsIGZNZWRpYSk7Ci0JCWZWaXNpdGVkLmFkZChsaXN0ZW5lcik7Ci0KLQkJLy8gdHJhdmVyc2Ugbm90aWZpZXIKLQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTm90aWZpZXIpIHsKLQkJCUlDU1NTdHlsZU5vdGlmaWVyIG5vdGlmaWVyID0gKElDU1NTdHlsZU5vdGlmaWVyKSBsaXN0ZW5lcjsKLQkJCWlmIChub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpIHsKLQkJCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdCgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXRVcGRhdGUoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwgfHwgZlZpc2l0ZWQuY29udGFpbnMobGlzdGVuZXIpKQotCQkJcmV0dXJuOwotCi0JCS8vIGZpcmUgZXZlbnQgdG8gbGlzdGVuZXIKLQkJbGlzdGVuZXIuc3R5bGVVcGRhdGUoZlNyY01vZGVsKTsKLQkJZlZpc2l0ZWQuYWRkKGxpc3RlbmVyKTsKLQotCQkvLyB0cmF2ZXJzZSBub3RpZmllcgotCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVOb3RpZmllcikgewotCQkJSUNTU1N0eWxlTm90aWZpZXIgbm90aWZpZXIgPSAoSUNTU1N0eWxlTm90aWZpZXIpIGxpc3RlbmVyOwotCQkJaWYgKG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXZpc2l0VXBkYXRlKChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjNGU0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0ZWRDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0b3JzQ29sbGVjdG9yOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVOb3RpZmllciB7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBsaXN0ZW5lcnM7Ci0JcHJvdGVjdGVkIGZpbmFsIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkaW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyKElDU1NNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCi0JCQkvLyBzZW5kIG5ldyBzZWxlY3RvcnMgZXZlbnQgdG8gbGlzdGVuZXIKLQkJCUltcG9ydGVkQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0ZWRDb2xsZWN0b3IoKTsKLQkJCXRyYXYuYXBwbHkobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IHRyYXYuZ2V0RXh0ZXJuYWxzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU3R5bGVTaGVldCBzaGVldCA9IChJQ1NTU3R5bGVTaGVldCkgaXQubmV4dCgpOwotCQkJCS8vIGNvbGxlY3Qgc2VsZWN0b3JzCi0JCQkJU2VsZWN0b3JzQ29sbGVjdG9yIHNlbFRyYXYgPSBuZXcgU2VsZWN0b3JzQ29sbGVjdG9yKCk7Ci0JCQkJc2VsVHJhdi5hcHBseShzaGVldCk7Ci0JCQkJaW50IG5TZWwgPSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLnNpemUoKTsKLQkJCQlJQ1NTU2VsZWN0b3JbXSBhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCWFkZGVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0KLQkJCQkvLyBmaXJlIGV2ZW50Ci0JCQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdmVyZXIgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQkJCWRlbGl2ZXJlci5maXJlVG8obGlzdGVuZXIsIHNoZWV0LmdldE1vZGVsKCksIG51bGwsIGFkZGVkLCBudWxsLyoKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogbWVkaWEKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogd2lsbAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBpbXBsZW1lbnRlZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBpbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogZnV0dXJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqLyk7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBsaXN0ZW5lcgotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZygpIHsKLQkJcmVjb3JkaW5nID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKSB7Ci0JCXJlY29yZGluZyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmUoSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdiA9IG5ldyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCk7Ci0JCWRlbGl2LmZpcmUobW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRTdHlsZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlY29yZGluZygpIHsKLQkJcmV0dXJuIHJlY29yZGluZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQkJLy8gc2VuZCBvbGQgc2VsZWN0b3JzIGV2ZW50IHRvIGxpc3RlbmVyCi0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldEV4dGVybmFscygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBjb2xsZWN0IHNlbGVjdG9ycwotCQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJCXNlbFRyYXYuYXBwbHkoc2hlZXQpOwotCQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQkJSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQotCQkJCS8vIGZpcmUgZXZlbnQKLQkJCQlDU1NTdHlsZUV2ZW50RGVsaXZlcmVyIGRlbGl2ZXJlciA9IG5ldyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCk7Ci0JCQkJZGVsaXZlcmVyLmZpcmVUbyhsaXN0ZW5lciwgc2hlZXQuZ2V0TW9kZWwoKSwgcmVtb3ZlZCwgbnVsbCwgbnVsbC8qCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHdpbGwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbGVtZW50ZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGZ1dHVyZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWwgc3JjTW9kZWwsIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yW10gYWRkZWQsIGphdmEubGFuZy5TdHJpbmcgbWVkaWEpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZmU2NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDU1NTb3VyY2VGb3JtYXR0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24KLQkgKi8KLQlTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmODY2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU0Zvcm1hdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBGb3JtYXRQcm9jZXNzb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiY3NzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUNTU0Zvcm1hdFV0aWwgZm9ybWF0VXRpbCA9IENTU0Zvcm1hdFV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJLy9CVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KXN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCX0KLQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOgotCQkJCWRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURUQpOwotCQkJCi0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gKChJQ1NTTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBkb2MpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5mb3JtYXQoZG9jKTsKLQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKGRvYy5nZXRNb2RlbCgpLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCX0KLQkJCQotCQkJLy9CVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCWRvY0V4dDQuc3RvcFJld3JpdGVTZXNzaW9uKHJld3JpdGVTZXNzaW9uKTsKLQkJfQotCQllbHNlIGlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUxpc3QgY3Nzbm9kZXMgPSBmb3JtYXRVdGlsLmNvbGxlY3RDU1NOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJaWYgKGNzc25vZGVzICE9IG51bGwgJiYgIWNzc25vZGVzLmlzRW1wdHkoKSkgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCi0JCQkJLy9CVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KXN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IChkb2NFeHQ0ID09IG51bGwpID8gbnVsbCA6Ci0JCQkJCWRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURUQpOwotCQkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3Nzbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgY3Nzbm9kZXMuZ2V0KGkpOwotCQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgbm9kZSk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuZm9ybWF0KG5vZGUpOwotCQkJCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkJCQltb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCQl9Ci0JCQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UobW9kZWwsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCQlpZiAoZG9jRXh0NCAhPSBudWxsICYmIHJld3JpdGVTZXNzaW9uICE9IG51bGwpCi0JCQkJCWRvY0V4dDQuc3RvcFJld3JpdGVTZXNzaW9uKHJld3JpdGVTZXNzaW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Fic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWU4NDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Fic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0TGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciBpbXBsZW1lbnRzIENTU1NvdXJjZUdlbmVyYXRvciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIHNob3J0IEdFTkVSQVRFID0gMDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIHNob3J0IEZPUk1BVCA9IDE7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBzaG9ydCBDTEVBTlVQID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIHNob3J0IHN0cmF0ZWd5OwotCi0JLyoqCi0JICogCi0JICovCi0JQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kRGVsaW1CZWZvcmUoSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQotCQlib29sZWFuIG5lZWRJbmRlbnQgPSAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCk7Ci0JCWlmICh0b0FwcGVuZCA9PSBudWxsKSB7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCWlmIChuZWVkSW5kZW50KQotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHR5cGUgPSB0b0FwcGVuZC5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCksIHRvQXBwZW5kLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCB8fCAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCAwKVswXSA+PSAwKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQuZ2V0VGV4dCgpLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcih0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLCB0b0FwcGVuZC5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCWl0LnByZXYoKTsKLQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KSwgMClbMF0gPj0gMCkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCQlpZiAobGVuZ3RoICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU3BhY2VCZWZvcmUoSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCB0b0FwcGVuZCA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCQlTdHJpbmcgdHlwZSA9IHRvQXBwZW5kLmdldFR5cGUoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJYm9vbGVhbiBuZWVkSW5kZW50ID0gIShub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJLy8gY2hlY2sgd2hldGhlciBwcmV2aW91cyByZWdpb24gaXMgJ1MnIGFuZCBoYXMgQ1ItTEYKLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcih0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLCB0b0FwcGVuZC5nZXRUZXh0UmVnaW9uKCkpOwotCQkJaXQucHJldigpOwotCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApWzBdID49IDApIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQuZ2V0VGV4dCgpLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFKSkgewotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJLy8gfSBlbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DVVJMWV9CUkFDRV9DTE9TRSkgewotCQkJLy8gfSBlbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTkNMVURFUyB8fCB0eXBlID09Ci0JCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfREFTSE1BVENIKSB7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SICYmIG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaW50IG4gPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCWlmIChsZW5ndGggKyBuICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCQluID0gMDsgLy8gbm8gc3BhY2UgaXMgbmVjZXNzYXJ5Ci0JCQkJfQotCQkJfQotCQkJLy8gbm8gZGVsaW1pdGVyIGNhc2UKLQkJCXdoaWxlIChuLS0gPiAwKQotCQkJCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJaWYgKGxlbmd0aCArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPUkVJR05fRUxFTUVOVCA9PSB0eXBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQuZ2V0VGV4dCgpLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNwYWNlQmVmb3JlKElDU1NOb2RlIG5vZGUsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHRvQXBwZW5kICE9IG51bGwgJiYgdG9BcHBlbmQuc3RhcnRzV2l0aCgieyIpICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpKSB7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlIGlmICgvKiAhIG1nci5pc09uZVByb3BlcnR5UGVyTGluZSgpICYmICovcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQlpbnQgbiA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQlpbnQgYXBwZW5kID0gKHRvQXBwZW5kICE9IG51bGwpID8gVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCB0b0FwcGVuZCwgMClbMF0gOiAwOwotCQkJaWYgKHRvQXBwZW5kICE9IG51bGwpCi0JCQkJYXBwZW5kID0gKGFwcGVuZCA8IDApID8gdG9BcHBlbmQubGVuZ3RoKCkgOiBhcHBlbmQ7Ci0JCQlpZiAobiArIGFwcGVuZCArIDEgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gQ0xFQU5VUDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSk7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBDTEVBTlVQOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlLCByZWdpb24pOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRJZGVudFJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJU3RyaW5nIHRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAwLCBzdGd5KTsKLQotCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCWlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHRleHQ7Ci0JCQllbHNlIGlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZWxzZQotCQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJcmV0dXJuIHRleHQ7Ci0JCWVsc2UgaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRQcm9wTmFtZVJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJU3RyaW5nIHRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAxLCBzdGd5KTsKLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyB8fCByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkKLQkJCQlyZXR1cm4gdGV4dDsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKQotCQkJcmV0dXJuIHRleHQ7Ci0JCWVsc2UgaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAyLCBzdGd5KTsKLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkgIT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpIHsKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQkJCXRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgaW50IHR5cGUsIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkpIHsKLQkJCVN0cmluZyB1cmkgPSBDU1NMaW5rQ29udmVydGVyLnN0cmlwRnVuYyh0ZXh0KTsKLQotCQkJYm9vbGVhbiBwcmVmSXNVcHBlciA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJCWJvb2xlYW4gdXBwZXIgPSAodHlwZSA9PSAwKSA/IHByZWZJc1VwcGVyIDogKCh0eXBlID09IDEpID8gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDogcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCQlTdHJpbmcgZnVuYyA9IHRleHQuc3Vic3RyaW5nKDAsIDQpOwotCQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQkJdXBwZXIgPSAoKHR5cGUgPT0gMCkgPyBzdGd5LmdldElkZW50Q2FzZSgpIDogKCh0eXBlID09IDEpID8gc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA6IHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpKSkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSOwotCQkJCWZ1bmMgPSAoKHR5cGUgPT0gMCkgPyBzdGd5LmdldElkZW50Q2FzZSgpIDogKCh0eXBlID09IDEpID8gc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA6IHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpKSkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMgPyB0ZXh0LnN1YnN0cmluZygwLCA0KSA6ICh1cHBlciA/ICJVUkwoIiA6ICJ1cmwoIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoIWlzQ2xlYW51cCgpICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKSkgfHwgKGlzQ2xlYW51cCgpICYmIHN0Z3kuaXNRdW90ZVZhbHVlcygpKSkgewotCQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHVyaSwgcXVvdGUpOwotCQkJCXRleHQgPSBmdW5jICsgcXVvdGUgKyB1cmkgKyBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChpc0NsZWFudXAoKSAmJiAhc3RneS5pc1F1b3RlVmFsdWVzKCkpIHsKLQkJCQl0ZXh0ID0gZnVuYyArIENTU0xpbmtDb252ZXJ0ZXIucmVtb3ZlRnVuYyh0ZXh0KSArICIpIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZXh0ID0gZnVuYyArIHVyaSArICIpIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HICYmICghaXNDbGVhbnVwKCkgfHwgc3RneS5pc1F1b3RlVmFsdWVzKCkpKSB7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJLy8gYmVnZ2lubmluZwotCQkJaWYgKCF0ZXh0LnN0YXJ0c1dpdGgocXVvdGUpKSB7Ci0JCQkJaWYgKHRleHQuc3RhcnRzV2l0aCgiXCIiKSB8fCB0ZXh0LnN0YXJ0c1dpdGgoIlwnIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0ZXh0ID0gcXVvdGUgKyB0ZXh0LnN1YnN0cmluZygxKTsKLQkJCQllbHNlCi0JCQkJCXRleHQgPSBxdW90ZSArIHRleHQ7Ci0JCQl9Ci0JCQkvLyBlbmRpbmcKLQkJCWlmICghdGV4dC5lbmRzV2l0aChxdW90ZSkpIHsKLQkJCQlpZiAodGV4dC5lbmRzV2l0aCgiXCIiKSB8fCB0ZXh0LmVuZHNXaXRoKCJcJyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAxKSArIHF1b3RlOwotCQkJCWVsc2UKLQkJCQkJdGV4dCA9IHRleHQgKyBxdW90ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gRk9STUFUOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gRk9STUFUOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlLCByZWdpb24pOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihpbnNlcnQgJiYgKGF0dHIgIT0gbnVsbCkgPyBhdHRyLmdldFZhbHVlKCkgOiAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmV0d2VlbiBjaGlsZHJlbignY2hpbGQnIGFuZCBpdHMgcHJldmlvdXMKLQkgKiBzaWJsaW5nKSBhbmQgYXBwZW5kIHRvIHN0cmluZyBidWZmZXIKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZXR3ZWVuIGNoaWxkcmVuKCdjaGlsZCcgYW5kIGl0cyBwcmV2aW91cwotCSAqIHNpYmxpbmcpIGFuZCBhcHBlbmQgdG8gc3RyaW5nIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlBc3NlcnQuaXNUcnVlKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0UGFyZW50Tm9kZSgpID09IG5vZGUpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIC8qIChjaGlsZCAhPSBudWxsKSA/IChjaGlsZC5nZXRDc3NUZXh0KCkpIDogKi8iIiwgYnVmLCBleGNlcHRGb3IpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJldHdlZW4gY2hpbGRyZW4oJ2NoaWxkJyBhbmQgaXRzIHByZXZpb3VzCi0JICogc2libGluZykgYW5kIGFwcGVuZCB0byBzdHJpbmcgYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcm1hdENoaWxkcmVuKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkvLyBhcHBlbmQgY2hpbGQKLQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSAoKElOb2RlTm90aWZpZXIpIGNoaWxkKS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBjaGlsZCk7Ci0JCQl9Ci0JCQlTdHJpbmdCdWZmZXIgY2hpbGRTb3VyY2UgPSAoKEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFByb2MoY2hpbGQpOwotCQkJaWYgKCFmaXJzdCkgewotCQkJCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgbmV3IFN0cmluZyhjaGlsZFNvdXJjZSksIHNvdXJjZSwgbnVsbCk7Ci0JCQl9Ci0JCQlzb3VyY2UuYXBwZW5kKGNoaWxkU291cmNlKTsKLQkJCS8vIGFwcGVuZCBiZXR3ZWVuIGNoaWxkcmVuCi0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlmaXJzdCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZm9ybWF0Q2hpbGRyZW4oSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gcmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgZW5kID0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWludCBjdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCVN0cmluZ0J1ZmZlciBjaGlsZFNvdXJjZSA9IG51bGw7Ci0JCQlib29sZWFuIHRvRmluaXNoID0gZmFsc2U7Ci0JCQlpZiAoc3RhcnQgPCBjdXJFbmQpIHsKLQkJCQlpbnQgY3VyU3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWlmIChjdXJTdGFydCA8IGVuZCkgewotCQkJCQkvLyBhcHBlbmQgY2hpbGQKLQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpICgoSU5vZGVOb3RpZmllcikgY2hpbGQpLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJCQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQkJCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCQljaGlsZFNvdXJjZSA9ICgoQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0UHJvYyhjaGlsZCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNoaWxkU291cmNlID0gKChBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRQcm9jKGNoaWxkLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXRvRmluaXNoID0gdHJ1ZTsKLQkJCX0KLQkJCS8vIGFwcGVuZCBiZXR3ZWVuIGNoaWxkcmVuCi0JCQlpZiAoIWZpcnN0KSB7Ci0JCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsgLy8gY2hhbmdlCi0JCQkJLy8gb25seQotCQkJCS8vIHN0YXJ0Ci0JCQkJaWYgKHN0YXJ0IDwgY3VyRW5kKSB7Ci0JCQkJCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLmdldEVuZE9mZnNldCgpOwotCQkJCQlpZiAoY3VyU3RhcnQgPCBlbmQpIHsKLQkJCQkJCVN0cmluZyB0b0FwcGVuZCA9IChjaGlsZFNvdXJjZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcoY2hpbGRTb3VyY2UpIDogIiI7Ly8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCB0b0FwcGVuZCwgc291cmNlLCBudWxsKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGRTb3VyY2UgIT0gbnVsbCkgewotCQkJCXNvdXJjZS5hcHBlbmQoY2hpbGRTb3VyY2UpOwotCQkJfQotCQkJZmlyc3QgPSBmYWxzZTsKLQkJCWlmICh0b0ZpbmlzaCkKLQkJCQlicmVhazsKLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBhZnRlciB0aGUgbGFzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZWZvcmUgdGhlIGZpcnN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZWZvcmUgdGhlIGZpcnN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0UHJvYyhJQ1NTTm9kZSBub2RlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQlmb3JtYXRDaGlsZHJlbihub2RlLCBzb3VyY2UpOwotCQlmb3JtYXRQb3N0KG5vZGUsIHNvdXJjZSk7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXRQcm9jKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFByZShub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCQljdXJTdGFydCA9IGN1ckVuZDsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRDaGlsZHJlbihub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQkJY3VyU3RhcnQgPSBjdXJFbmQ7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQljdXJFbmQgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJCWN1clN0YXJ0ID0gY3VyRW5kOwotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JcHJvdGVjdGVkIENTU0NsZWFudXBTdHJhdGVneSBnZXRDbGVhbnVwU3RyYXRlZ3koSUNTU05vZGUgbm9kZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgY3VycmVudFN0cmF0ZWd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBjdXJyZW50U3RyYXRlZ3k7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBjdXJyZW50U3RyYXRlZ3k7Ci0JCWlmIChtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJLy8gVE9ETyAtIFRSQU5TSVRJT04gTmFrYW1vcmktc2FuLCBvciBLaXQsIGhvdyBjYW4gd2UgbW92ZSB0bwotCQkJLy8gIkhUTUwiIHBsdWdpbj8KLQkJCS8vIGNhbiB3ZSBzdWJjbGFzcz8KLQkJCS8vIGN1cnJlbnRTdHJhdGVneSA9IENTU0luSFRNTENsZWFudXBTdHJhdGVneUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5kZW50KElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NBdHRyKQotCQkJcGFyZW50ID0gKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChub2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBwYXJlbnRJbmRlbnQgPSBnZXRJbmRlbnQocGFyZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlKQotCQkJcmV0dXJuIHBhcmVudEluZGVudCArIGdldEluZGVudFN0cmluZygpOwotCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXJldHVybiBwYXJlbnRJbmRlbnQgKyBnZXRJbmRlbnRTdHJpbmcoKTsKLQkJcmV0dXJuIHBhcmVudEluZGVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldExhc3RMaW5lTGVuZ3RoKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQlTdHJpbmcgc3RyID0gbmV3IFN0cmluZyhzb3VyY2UpOwotCQlpbnQgbiA9IHN0ci5sYXN0SW5kZXhPZihkZWxpbSk7Ci0JCWlmIChuIDwgMCkKLQkJCXJldHVybiBzdHIubGVuZ3RoKCk7Ci0KLQkJcmV0dXJuIHN0ci5sZW5ndGgoKSAtIG4gLSBkZWxpbS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPCAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MpKQotCQkJcmV0dXJuIDA7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCS8vIGlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWludCBwb3MgPSAoZm91bmQgPyBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pIDogaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSAtIGluc2VydFBvczsKLQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MgLSAxKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zIC0gMSk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQlyZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkvLyBpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9Ci0JCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgcG9zID0gaW5zZXJ0UG9zIC0gKGZvdW5kID8gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pIDogaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSk7Ci0JCS8vIGZsYXROb2RlID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIGlmIChmb3VuZCkgewotCQkvLyBpZiAocmVnaW9uLmdldExlbmd0aCgpICE9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpIHsKLQkJLy8gcG9zID0gaW5zZXJ0UG9zIC0gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pOwotCQkvLyB9IGVsc2UgewotCQkvLyBwb3MgPSBpbnNlcnRQb3MgLSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJLy8gfQotCQkvLyB9IGVsc2UgewotCQkvLyBwb3MgPSBpbnNlcnRQb3MgLSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkvLyB9Ci0JCXJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0TGluZURlbGltaXRlcihJQ1NTTm9kZSBub2RlKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IChub2RlICE9IG51bGwpID8gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCXJldHVybiAobW9kZWwgIT0gbnVsbCkgPyBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCkgOiAiXG4iOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVE9ETyA6IGNoZWNrIHdoZXRoZXIgdG8gdXNlIG1vZGVsLmdldExpbmVEZWxpbWl0ZXIoKSBvcgotCQkvLyBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCkKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRPdXRzaWRlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsLCBJUmVnaW9uIHJlZykgewotCQlDb21wb3VuZFJlZ2lvbltdIHJldCA9IG5ldyBDb21wb3VuZFJlZ2lvblsyXTsKLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IobW9kZWwsIHJlZy5nZXRPZmZzZXQoKSk7Ci0JCWl0LnByZXYoKTsKLQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJldFswXSA9IG5ldyBDb21wb3VuZFJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgdGV4dFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXRbMF0gPSBudWxsOwotCQl9Ci0JCWl0LnJlc2V0KG1vZGVsLCByZWcuZ2V0T2Zmc2V0KCkgKyByZWcuZ2V0TGVuZ3RoKCkpOwotCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gaXQubmV4dCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmV0WzFdID0gbmV3IENvbXBvdW5kUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldFsxXSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTU291cmNlR2VuZXJhdG9yIGdldFBhcmVudEZvcm1hdHRlcihJQ1NTTm9kZSBub2RlKSB7Ci0JCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlR2VuZXJhdG9yKSAoKElOb2RlTm90aWZpZXIpIHBhcmVudCkuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgcGFyZW50KTsKLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uW10gZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsLCBJUmVnaW9uIHJlZywgSVJlZ2lvbiBleGNlcHRGb3IsIFN0cmluZyBwaWNrdXBUeXBlKSB7Ci0JCWludCBzdGFydCA9IHJlZy5nZXRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKTsKLQkJaW50IHN0YXJ0RSA9IChleGNlcHRGb3IgIT0gbnVsbCkgPyBleGNlcHRGb3IuZ2V0T2Zmc2V0KCkgOiAtMTsKLQkJaW50IGVuZEUgPSAoZXhjZXB0Rm9yICE9IG51bGwpID8gZXhjZXB0Rm9yLmdldE9mZnNldCgpICsgZXhjZXB0Rm9yLmdldExlbmd0aCgpIDogMDsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG1vZGVsLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJYm9vbGVhbiBwaWNrdXBlZCA9IGZhbHNlOwotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDwgZW5kKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVnaW9uTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pIDwgc3RhcnQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChlbmQgPD0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHN0YXJ0RSA+PSAwICYmIHN0YXJ0RSA8PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pICYmIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pIDw9IGVuZEUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8pCi0JCQkJCWxpc3QuYWRkKG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKSk7Ci0JCQkJZWxzZSBpZiAoIXBpY2t1cGVkICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gcGlja3VwVHlwZSkgewotCQkJCQlsaXN0LmFkZChuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbikpOwotCQkJCQlwaWNrdXBlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbmV3IENvbXBvdW5kUmVnaW9uW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShyZWdpb25zKTsKLQkJCXJldHVybiByZWdpb25zOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb25bMF07Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uW10gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsLCBJUmVnaW9uIHJlZywgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaW50IHN0YXJ0ID0gcmVnLmdldE9mZnNldCgpOwotCQlpbnQgZW5kID0gcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpIC0gMTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBtb2RlbC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZW5kKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVnaW9uTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pIDwgc3RhcnQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChlbmQgPCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCAoaXNDbGVhbnVwKCkgJiYgIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkpIC8vIGZvcgotCQkJCQkvLyBub3QKLQkJCQkJLy8gZm9ybWF0dGluZwotCQkJCQkvLyBjYXNlCi0JCQkJCS8vIG9uCi0JCQkJCS8vIGNsZWFudXAKLQkJCQkJLy8gYWN0aW9uCi0JCQkJCWxpc3QuYWRkKG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKSk7Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBuZXcgQ29tcG91bmRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHJlZ2lvbnMpOwotCQkJcmV0dXJuIHJlZ2lvbnM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvblswXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5jbHVkZXMoSVJlZ2lvbiByZWdpb24sIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChyZWdpb24uZ2V0T2Zmc2V0KCkgPD0gc3RhcnQpICYmIChlbmQgPD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNDbGVhbnVwKCkgewotCQlyZXR1cm4gc3RyYXRlZ3kgPT0gQ0xFQU5VUDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNGb3JtYXQoKSB7Ci0JCXJldHVybiBzdHJhdGVneSA9PSBGT1JNQVQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlc1ByZUVuZChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA9PSAocmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHByb3RlY3RlZCBib29sZWFuIG5lZWRTKENvbXBvdW5kUmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBvdmVybGFwcGVkUmVnaW9uKElSZWdpb24gcmVnaW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgc3RhcnQsIGVuZCkpIHsKLQkJCWludCBvZmZzZXQgPSAocmVnaW9uLmdldE9mZnNldCgpIDw9IHN0YXJ0KSA/IHN0YXJ0IDogcmVnaW9uLmdldE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9ICgoZW5kIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgPyBlbmQgOiByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIC0gb2Zmc2V0OwotCQkJcmV0dXJuIG5ldyBGb3JtYXRSZWdpb24ob2Zmc2V0LCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvdmVybGFwcyhJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKHN0YXJ0IDwgcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSAmJiAocmVnaW9uLmdldE9mZnNldCgpIDwgZW5kKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJDaGFuZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNGE3M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyQ2hhbmdlQ29udGV4dCB7Ci0KLQlwdWJsaWMgaW50IHN0YXJ0LCBlbmQ7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXR0ckNoYW5nZUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN0YXJ0ID0gZW5kID0gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDAxZDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEF0dHJGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEF0dHJGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlBdHRyRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGU7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSB8fCBhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORykpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkgPT0gbnVsbCB8fCBhdHRyLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjb3VudGVyIGF0dHJpYnV0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCi0JCQlTdHJpbmcgdmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQl2YWx1ZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikgfHwgYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NQYWdlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCVN0cmluZyB1cmkgPSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NMaW5rQ29udmVydGVyLnN0cmlwRnVuYyh2YWx1ZSk7Ci0JCQkJU3RyaW5nIGZ1bmMgPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSID8gIlVSTCgiIDogInVybCgiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKSkgewotCQkJCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUodXJpLCBxdW90ZSk7Ci0JCQkJCXZhbHVlID0gZnVuYyArIHF1b3RlICsgdXJpICsgcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdmFsdWUgPSBmdW5jICsgdXJpICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKSkgewotCQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQkJaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJcIiIpICYmICF2YWx1ZS5zdGFydHNXaXRoKCJcJyIpKS8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gcXVvdGUgKyB2YWx1ZTsKLQkJCQlpZiAoIXZhbHVlLmVuZHNXaXRoKCJcIiIpICYmICF2YWx1ZS5lbmRzV2l0aCgiXCciKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IHZhbHVlICsgcXVvdGU7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKSkgewotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKSA9PSBudWxsIHx8IGF0dHIuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCXZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQlzb3VyY2UuYXBwZW5kKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBBdHRyRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQXR0ckZvcm1hdHRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDJkYzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU0Zvcm1hdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NGb3JtYXRVdGlsIHsKLQlwdWJsaWMgTGlzdCBjb2xsZWN0Q1NTTm9kZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0KTsKLQkJSW5kZXhlZFJlZ2lvbiBlbmROb2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydCArIGxlbmd0aCAtIDEpOwotCi0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCB8fCBlbmROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBub2RlczsKLQkJfQotCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCAmJiBzdGFydE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSAmJiBlbmROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCS8vIENTUyBtb2RlbAotCQkJSUNTU05vZGUgY2EgPSBnZXRDb21tb25BbmNlc3RvcigoSUNTU05vZGUpIHN0YXJ0Tm9kZSwgKElDU1NOb2RlKSBlbmROb2RlKTsKLQkJCWlmIChjYSAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gY2EuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGwgJiYgc3RhcnQgKyBsZW5ndGggPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKHN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsICYmIHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlICYmIGVuZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlzdGFydE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChUZXh0KSBzdGFydE5vZGUpLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChlbmROb2RlIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCWVuZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChUZXh0KSBlbmROb2RlKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQkvLyBIVE1MIG1vZGVsLCBtYXliZQotCQkJSURPTU5vZGUgY2EgPSAoSURPTU5vZGUpIGdldENvbW1vbkFuY2VzdG9yKChOb2RlKSBzdGFydE5vZGUsIChOb2RlKSBlbmROb2RlKTsKLQkJCWZpbmRDU1Mobm9kZXMsIGNhKTsKLQkJfQotCi0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb21tb25BbmNlc3RvciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRDb21tb25BbmNlc3RvcihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCWlmIChub2RlMSA9PSBudWxsIHx8IG5vZGUyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKE5vZGUgbmEgPSBub2RlMjsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoTm9kZSB0YSA9IG5vZGUxOyB0YSAhPSBudWxsOyB0YSA9IHRhLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmICh0YSA9PSBuYSkKLQkJCQkJcmV0dXJuIHRhOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZENTUyhMaXN0IGNzc05vZGVzLCBJRE9NTm9kZSBub2RlKSB7Ci0JCUlDU1NNb2RlbEFkYXB0ZXIgYWRhcHRlcjsKLQkJYWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJSUNTU01vZGVsIG1vZGVsID0gYWRhcHRlci5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCQljc3NOb2Rlcy5hZGQobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElDU1NNb2RlbEFkYXB0ZXIpIG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9IGFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5JTkxJTkUpIHsKLQkJCQkJY3NzTm9kZXMuYWRkKG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZvciAoSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJZmluZENTUyhjc3NOb2RlcywgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXRDb21tb25BbmNlc3RvcihJQ1NTTm9kZSBub2RlQSwgSUNTU05vZGUgbm9kZUIpIHsKLQkJaWYgKG5vZGVBID09IG51bGwgfHwgbm9kZUIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKElDU1NOb2RlIG5hID0gbm9kZUE7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIHRhID0gbm9kZUI7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKSB7Ci0JCQkJCXJldHVybiB0YTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVNvdXJjZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChvZmZzZXQgPj0gMCAmJiBsZW5ndGggPj0gMCAmJiBvZmZzZXQgKyBsZW5ndGggPD0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpKQotCQkJCXJldHVybjsKLQkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCQkvLyBXZSB1c2UgJ3N0cnVjdHVyZWREb2N1bWVudCcgYXMgdGhlIHJlcXVlc3RlciBvYmplY3QganVzdCBzbwotCQkJLy8gdGhpcyBhbmQgdGhlIG90aGVyCi0JCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZQotCQkJLy8gc2FtZSByZXF1ZXN0ZXIuCi0JCQkvLyBPdGhlcndpc2UsIGlmIHJlcXVlc3RlciBpcyBub3QgaWRlbnRpY2FsLAotCQkJLy8gdGhlIHVuZG8gZ3JvdXAgZ2V0cyAiYnJva2VuIiBpbnRvIG11bHRpcGxlIHBpZWNlcyBiYXNlZAotCQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwKLQkJCS8vIGNvbW1vbgotCQkJLy8gcmVxdWVzdGVyIG9iamVjdCB3b3VsZCB3b3JrLgotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NGb3JtYXRVdGlsIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NGb3JtYXRVdGlsKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIENTU0Zvcm1hdFV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTRm9ybWF0VXRpbCBmSW5zdGFuY2U7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5YWYwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiZjU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTb3VyY2VHZW5lcmF0b3IgZ2V0U291cmNlRm9ybWF0dGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHRhcmdldDsKLQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgOgotCQkJCXJldHVybiBDaGFyc2V0UnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIEZvbnRGYWNlUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgOgotCQkJCXJldHVybiBJbXBvcnRSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLk1FRElBTElTVF9OT0RFIDoKLQkJCQlyZXR1cm4gTWVkaWFMaXN0Rm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLk1FRElBUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gTWVkaWFSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQkJaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpCi0JCQkJCXJldHVybiBDb3VudGVyRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQkJZWxzZSBpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCkKLQkJCQkJcmV0dXJuIFJlY3RGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQllbHNlIGlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUikKLQkJCQkJcmV0dXJuIFJHQkZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCXJldHVybiBQYWdlUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUgOgotCQkJCXJldHVybiBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJCXJldHVybiBTdHlsZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVTaGVldEZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5BVFRSX05PREUgOgotCQkJCXJldHVybiBBdHRyRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gVW5rbm93blJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgZkluc3RhbmNlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmU4Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBDU1NTb3VyY2VHZW5lcmF0b3IgZXh0ZW5kcyBDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiBleGNlcHRGb3IpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTBmYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFyc2V0UnVsZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIENIQVJTRVQgPSAiQGNoYXJzZXQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBDaGFyc2V0UnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNoYXJzZXRSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpICsgMTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZm9ybWF0UHJlKG5vZGUsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc291cmNlKTsKLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQlTdHJpbmcgc3RyID0gQ0hBUlNFVDsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gQ0hBUlNFVC50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJU3RyaW5nIGVuYyA9ICgoSUNTU0NoYXJzZXRSdWxlKSBub2RlKS5nZXRFbmNvZGluZygpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGVuYywgcXVvdGUpOwotCQkJc3RyID0gcXVvdGUgKyAoKGVuYyAhPSBudWxsKSA/IGVuYyA6ICIiKSArIHF1b3RlICsgIjsiOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkgJiYgIXJlZ2lvbnNbaV0uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmICghSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlDb21wb3VuZFJlZ2lvbiByZWdpb25zW10gPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKSwgc3RneSk7Ci0JCWZvciAoaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDaGFyc2V0UnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDaGFyc2V0UnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvbXBvdW5kUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjNjOGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvbXBvdW5kUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1jbGFzcyBDb21wb3VuZFJlZ2lvbiB7Ci0KLQlDb21wb3VuZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZkRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0JCXRoaXMuZlRleHRSZWdpb24gPSB0ZXh0UmVnaW9uOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0VGV4dFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZUZXh0UmVnaW9uOwotCX0KLQotCVN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlRleHRSZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCVN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uLmdldFRleHQoZlRleHRSZWdpb24pOwotCX0KLQotCWludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbik7Ci0JfQotCi0JaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoZlRleHRSZWdpb24pOwotCX0KLQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZEb2N1bWVudFJlZ2lvbjsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGZUZXh0UmVnaW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ291bnRlckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ291bnRlckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFkZDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNvdW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvdW50ZXJGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIENvdW50ZXJGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVyRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCi0JCWlmICghSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSAmJiAhSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpICYmICFJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gc291cmNlOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWNvbnRleHQuc3RhcnQgPSBpTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQljb250ZXh0LmVuZCA9IGlOb2RlLmdldEVuZE9mZnNldCgpOwotCi0JCUlDb3VudGVyIGNvdW50ZXIgPSAoSUNvdW50ZXIpIG5vZGU7Ci0JCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCVN0cmluZyBzZXAgPSBjb3VudGVyLmdldFNlcGFyYXRvcigpOwotCQlTdHJpbmcgaWRlbnQgPSBjb3VudGVyLmdldElkZW50aWZpZXIoKTsKLQkJU3RyaW5nIHN0eWxlID0gY291bnRlci5nZXRMaXN0U3R5bGUoKTsKLQotCQlpZiAoSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGluc2VydCkKLQkJCQlpZGVudCA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWVsc2UKLQkJCQlpZGVudCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJc3R5bGUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJc3R5bGUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGluc2VydCkKLQkJCQlzZXAgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJc2VwID0gbnVsbDsKLQkJfQotCi0JCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzZXAsIHF1b3RlKTsKLQkJc2VwID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiAocXVvdGUgKyBzZXAgKyBxdW90ZSk7Ci0KLQkJU3RyaW5nIGZ1bmMgPSAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApID8gImNvdW50ZXIoIiA6ICJjb3VudGVycygiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQlpZGVudCA9IGlkZW50LnRvVXBwZXJDYXNlKCk7Ci0JCQlzdHlsZSA9IHN0eWxlLnRvVXBwZXJDYXNlKCk7Ci0JCQlmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQkJc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWlmIChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgewotCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzZXAsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHNlcCk7Ci0JCX0KLQotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3R5bGUsIHNvdXJjZSk7Ci0JCX0KLQkJc291cmNlLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQotCQkvKgotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9Ci0JCSAqIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCSAqIElUZXh0UmVnaW9uW10gcmVnaW9ucyA9Ci0JCSAqIGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcKLQkJICogRm9ybWF0UmVnaW9uKGNvbnRleHQuc3RhcnQsIGNvbnRleHQuZW5kIC0gY29udGV4dC5zdGFydCArIDEpKTsgaW50Ci0JCSAqIGNvbW1hc1syXTsgaW50IG51bUNvbW1hID0gMDsgZm9yKGludCBqID0gMDsgaiA8cmVnaW9ucy5sZW5ndGg7IGorKykgewotCQkgKiBpZiAocmVnaW9uc1tqXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ09NTUEpIHsKLQkJICogY29tbWFzW251bUNvbW1hKytdID0gajsgaWYgKG51bUNvbW1hID4gMSkgYnJlYWs7IH0gfQotCQkgKiAKLQkJICogaWYgKElDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsgfSBlbHNlCi0JCSAqIGlmIChJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsgfSBlbHNlCi0JCSAqIGlmIChJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsgYm9vbGVhbgotCQkgKiBza2lwU3BhY2UgPSBmYWxzZTsgU3RyaW5nIGZ1bmMgPSBpbnNlcnQgPyAiY291bnRlcnMoIiA6ICJjb3VudGVyKCI7Ci0JCSAqIGlmIChtZ3IuaXNQcm9wVmFsdWVVcHBlckNhc2UoKSkgZnVuYyA9IGZ1bmMudG9VcHBlckNhc2UoKTsKLQkJICogCi0JCSAqIGZvcihpbnQgaT0wOyBpIDxyZWdpb25zLmxlbmd0aDsgaSsrKSB7IGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PQotCQkgKiBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCSAqIHNvdXJjZS5hcHBlbmQoZnVuYyk7IGVsc2UgeyBpZiAobnVtQ29tbWEgPT0gMiAmJiBjb21tYXNbMV0gPCBpKSB7Ci0JCSAqICB9IGVsc2UgaWYgKG51bUNvbW1hID09IDEgJiYgY29tbWFzWzBdIDwgaSAmJiBpbnNlcnQpIHsKLQkJICogIH0gZWxzZSBpZiAobnVtQ29tbWEgPT0gMSAmJiBjb21tYXNbMF0gPCBpICYmICEgaW5zZXJ0KSB7IH0gZWxzZSBpZgotCQkgKiAobnVtQ29tbWEgPT0gMCAmJiBpbnNlcnQgJiYgcmVnaW9uc1tpXS5nZXRUeXBlID09Ci0JCSAqIENTU1JlZ2lvbkNvbnRleHRzLlBBUkVOVEhFU0lTX0NMT1NFKSB7IHNvdXJjZS5hcHBlbmQoIiwiKTsKLQkJICogYXBwZW5kU3BhY2VCZWZvcmUobm9kZSxhdHRyLmdldFZhbHVlKCksc291cmNlKTsKLQkJICogc291cmNlLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOyB9Ci0JCSAqIAotCQkgKiBpZiAoaSAhPSAwICYmICFza2lwU3BhY2UpCi0JCSAqIGFwcGVuZFNwYWNlQmVmb3JlKG5vZGUscmVnaW9uc1tpXSxzb3VyY2UpOwotCQkgKiBzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldKSk7IH0gc2tpcFNwYWNlID0KLQkJICogZmFsc2U7Ci0JCSAqIAotCQkgKiBpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0KLQkJICogQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSBza2lwU3BhY2UgPSB0cnVlOyB9IH0KLQkJICovCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJYm9vbGVhbiBza2lwU3BhY2UgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgJiYgIXNraXBTcGFjZSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlza2lwU3BhY2UgPSBmYWxzZTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJc2tpcFNwYWNlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlJQ291bnRlciBjb3VudGVyID0gKElDb3VudGVyKSBub2RlOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCVN0cmluZyBzZXBhcmF0b3IgPSBjb3VudGVyLmdldFNlcGFyYXRvcigpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHNlcGFyYXRvciwgcXVvdGUpOwotCQkJU3RyaW5nIHNlcCA9IChzZXBhcmF0b3IgPT0gbnVsbCB8fCBzZXBhcmF0b3IubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogKHF1b3RlICsgc2VwYXJhdG9yICsgcXVvdGUpOwotCQkJU3RyaW5nIGlkZW50ID0gY291bnRlci5nZXRJZGVudGlmaWVyKCk7Ci0JCQlTdHJpbmcgc3R5bGUgPSBjb3VudGVyLmdldExpc3RTdHlsZSgpOwotCQkJU3RyaW5nIGZ1bmMgPSAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApID8gImNvdW50ZXIoIiA6ICJjb3VudGVycygiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkvLyBub3JtYWxpemUKLQkJCWlmIChpZGVudCA9PSBudWxsKQotCQkJCWlkZW50ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHN0eWxlID09IG51bGwpCi0JCQkJc3R5bGUgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQkJaWRlbnQgPSBpZGVudC50b1VwcGVyQ2FzZSgpOwotCQkJCXN0eWxlID0gc3R5bGUudG9VcHBlckNhc2UoKTsKLQkJCQlmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQkJCXN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCWlmIChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc2VwLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc2VwKTsKLQkJCX0KLQotCQkJaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUubGVuZ3RoKCkgIT0gMCkgewotCQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3R5bGUsIHNvdXJjZSk7Ci0JCQl9Ci0JCQlzb3VyY2UuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDb3VudGVyLklERU5USUZJRVIpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSkpOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDb3VudGVyLkxJU1RTVFlMRSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ291bnRlci5TRVBBUkFUT1IpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSkpOwotCQkJYm9vbGVhbiBoYXNDb21tYSA9IGZhbHNlOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IpIHsKLQkJCQkJaWYgKCFoYXNDb21tYSkKLQkJCQkJCWhhc0NvbW1hID0gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENvdW50ZXJGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ291bnRlckZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlY2xDb250YWluZXJGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlY2xDb250YWluZXJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmZjQ0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVjbENvbnRhaW5lckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRGVjbENvbnRhaW5lckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ29tcG91bmRSZWdpb24gcHJldlJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJU3RyaW5nIHRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiB0ZXh0OwotCi0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKSB7Ci0JCQlzaG9ydCBzZWxDYXNlID0gc3RneS5nZXRTZWxlY3RvclRhZ0Nhc2UoKTsKLQkJCWlmIChzZWxDYXNlID09IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneS5VUFBFUikgewotCQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZWxDYXNlID09IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneS5MT1dFUikgewotCQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCi0JCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAwLCBzdGd5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCXNvdXJjZS5hcHBlbmQoIn0iKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpCi0JCQkJcmV0dXJuIG4gLSAxOwotCQkJZWxzZQotCQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWFlZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNwYWNlQmV0d2VlbihJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiBwcmV2LCBDb21wb3VuZFJlZ2lvbiBuZXh0LCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0KLQkJLy8gaW4gc2VsZWN0b3IKLQkJU3RyaW5nIHByZXZUeXBlID0gcHJldi5nZXRUeXBlKCk7Ci0JCVN0cmluZyBuZXh0VHlwZSA9IG5leHQuZ2V0VHlwZSgpOwotCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShwcmV2VHlwZSkgJiYgQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShuZXh0VHlwZSkpIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03Mzk5MAotCQkJLy8gRm9ybWF0dGluZyBDU1MgZmlsZSBzcGxpdHMgZWxlbWVudC5jbGFzcyBpbnRvIGVsZW1lbnQgLiBjbGFzcwotCQkJaWYgKChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FICYmIChuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEKSkgfHwgKChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUykgJiYgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykpIHsKLQkJCQkvLyBJbmRpdmlkdWFsbHksIFNFTEVDVE9SX0VMRU1FTlRfTkFNRSwgU0VMRUNUT1JfQ0xBU1MsIGFuZCBTRUxFQ1RPUl9JRCBjYW4gYWxsIGJlIGJlZ2lubmluZyB0eXBlcy4KLQkJCQkvLyBCdXQsIHdlIHNob3VsZCBub3QgaW5zZXJ0IGEgc3BhY2UgaW4gYmV0d2VlbiB3aGVuIFNFTEVDVE9SX0VMRU1FTlRfTkFNRSBpcyBmb2xsb3dlZCBieSBTRUxFQ1RPUl9DTEFTUywgb3Igd2hlbgotCQkJCS8vIFNFTEVDVE9SX0VMRU1FTlRfTkFNRSBpcyBmb2xsb3dlZCBieSBTRUxFQ1RPUl9JRC4KLQkJCQkvLyBGb3IgZXhhbXBsZTogSDEucGFzdG9yYWwgYW5kIEgxI3o5OHkKLQkJCQkvLwotCQkJCS8vIEFsc28sIHNwYWNlIGlzIG5vdyBub3QgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB3aGVuIFNFTEVDVE9SX0VMRU1FTlRfTkFNRSBpcyBmb2xsb3dlZCBieSBTRUxFQ1RPUl9QU0VVRE8sIG9yIHdoZW4KLQkJCQkvLyBTRUxFQ1RPUl9DTEFTUyBpcyBmb2xsb3dlZCBieSBTRUxFQ1RPUl9QU0VVRE8uCi0JCQkJLy8gRm9yIGV4YW1wbGU6IFA6Zmlyc3QtbGV0dGVyIGFuZCBBLmV4dGVybmFsOnZpc2l0ZWQKLQkJCX0KLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiAmJiBuZXh0VHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJaWYgKHByZXYuZ2V0RW5kT2Zmc2V0KCkgIT0gbmV4dC5nZXRTdGFydE9mZnNldCgpKSB7IC8vIG5vdAotCQkJCQkJCQkJCQkJCQkJCS8vIHNlcXVlbnRpYWwKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKQotCQkJcmV0dXJuIG47Ci0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb250RmFjZVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNjdkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb250RmFjZVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBGT05UX0ZBQ0UgPSAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUZvbnRGYWNlUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBzdHIgPSBGT05UX0ZBQ0U7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gRk9OVF9GQUNFLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjBjOWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgRm9ybWF0UmVnaW9uIGltcGxlbWVudHMgSVJlZ2lvbiB7Ci0KLQlwcml2YXRlIGludCBmT2Zmc2V0LCBmTGVuZ3RoOwotCi0JLyoqCi0JICogCi0JICovCi0JRm9ybWF0UmVnaW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMuZk9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5mTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJZkxlbmd0aCA9IG5ld0xlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldE9mZnNldChpbnQgbmV3T2Zmc2V0KSB7Ci0JCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Z1bmN0aW9uRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9GdW5jdGlvbkZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ5OWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Z1bmN0aW9uRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRnVuY3Rpb25Gb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGdW5jdGlvbkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIGJldHdlZW4KLQkJCS8vIHBhcmFtZXRlcnMKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZSBub2RlLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJc291cmNlLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIGZ1bmMgPSBnZXRGdW5jKCk7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEZ1bmMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZDNlZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvSW1wb3J0UnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UnVsZUZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBJTVBPUlQgPSAiQGltcG9ydCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEltcG9ydFJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJbXBvcnRSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU0ltcG9ydFJ1bGUuSFJFRi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJaXQubmV4dCgpOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgLSAxKTsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSAtIDEpOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCAmJiBhdHRyLmdldFZhbHVlKCkgIT0gbnVsbCAmJiBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJLy8gZm9yIG1lZGlhLXR5cGUKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUjsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogPz8/PwotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9IGVsc2UgaWYgKGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYmV0d2VlbiAndXJsKCknIGFuZAotCQkJLy8gbWVkaWEgdHlwZXMKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QgYmUKLQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc291cmNlLmFwcGVuZCgiOyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkgJiYgIXJlZ2lvbnNbaV0uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgc3RyID0gcmVnaW9uc1tpXS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpCi0JCQkJCXN0ciA9IGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpOwotCQkJCWVsc2UKLQkJCQkJc3RyID0gZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpOwotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkJU3RyaW5nIHN0ciA9IElNUE9SVDsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gSU1QT1JULnRvVXBwZXJDYXNlKCk7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJc3RyID0gInVybCgiOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IHN0ci50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nIGhyZWYgPSAoKElDU1NJbXBvcnRSdWxlKSBub2RlKS5nZXRIcmVmKCk7Ci0JCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoaHJlZiwgcXVvdGUpOwotCQkJc3RyID0gc3RyICsgcXVvdGUgKyBocmVmICsgcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgJiYgKChvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHN0ciA9IHJlZ2lvbnNbaV0uZ2V0VGV4dCgpOwotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpCi0JCQkJc3RyID0gZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQllbHNlCi0JCQkJc3RyID0gZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpOwotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU0ltcG9ydFJ1bGUuSFJFRi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU0ltcG9ydFJ1bGUuSFJFRik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUZvcm1hdFJlZ2lvbiBmb3JtYXRSZWdpb24gPSBudWxsOwotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlmb3JtYXRSZWdpb24gPSBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJZWxzZQotCQkJZm9ybWF0UmVnaW9uID0gbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQlDb21wb3VuZFJlZ2lvbiByZWdpb25zW10gPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGZvcm1hdFJlZ2lvbiwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpKTsKLQotCQlib29sZWFuIGF0cnVsZSA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKSB7Ci0JCQkJYXRydWxlID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoIWF0cnVsZSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlyZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiAoY2hpbGQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IGlOb2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSW1wb3J0UnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBJbXBvcnRSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1MjZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhTGlzdEZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTWVkaWFMaXN0Rm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JTWVkaWFMaXN0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWJvb2xlYW4gZmlyc3QgPSBmYWxzZSwgbGFzdCA9IGZhbHNlOwotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0LnN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWZpcnN0ID0gdHJ1ZTsKLQotCQkJCX0KLQkJCQlpdC5yZXNldChmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IgfHwgbmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIDwgY29udGV4dC5lbmQpIHsKLQkJCQkJY29udGV4dC5lbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJCQlsYXN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxhc3QgPSB0cnVlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0LnN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghZmlyc3QpCi0JCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlpZiAoIWxhc3QpIHsKLQkJCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgaWYgKCFmaXJzdCAmJiAhbGFzdCkgewotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJTWVkaWFMaXN0IGxpc3QgPSAoTWVkaWFMaXN0KSBub2RlOwotCQkJaW50IG4gPSBsaXN0LmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlTdHJpbmcgbWVkaXVtID0gbGlzdC5pdGVtKGkpOwotCQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJbWVkaXVtID0gbWVkaXVtLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQltZWRpdW0gPSBtZWRpdW0udG9Mb3dlckNhc2UoKTsKLQotCQkJCWlmIChpICE9IDApIHsKLQkJCQkJc291cmNlLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG1lZGl1bSwgc291cmNlKTsKLQkJCQl9Ci0JCQkJc291cmNlLmFwcGVuZChtZWRpdW0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCi0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCS8qCi0JCSAqIElUZXh0UmVnaW9uIHJlZ2lvbnNbXSA9Ci0JCSAqIGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwKLQkJICogbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtCi0JCSAqIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxKSk7IGZvcihpbnQgaT1yZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsKLQkJICogaS0tKSB7IGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5JTVBPUlRBTlRfU1lNKQotCQkgKiByZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOyB9Ci0JCSAqLwotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTWVkaWFMaXN0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IE1lZGlhTGlzdEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NTI1MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSdWxlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE1FRElBID0gIkBtZWRpYSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1lZGlhUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCU1lZGlhUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJaWYgKChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB8fCAocHJldiA9PSBudWxsICYmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSkgewotCQkJCQlwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRTsKLQkJCQl9Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gIkBtZWRpYSIKLQkJCQkvLyBhbmQKLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCS8vIGJlCi0JCQkJCS8vIGNvbW1lbnRzCi0JCQkJfQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsIHx8IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSB7IC8vIGJldHdlZW4KLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQkvLyBhbmQKLQkJCQkvLyB0aGUKLQkJCQkvLyBmaXJzdAotCQkJCS8vIHN0eWxlCi0JCQkJLy8gcnVsZQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJLy8gYmUKLQkJCQkJLy8gY29tbWVudHMKLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSB7IC8vIGJldHdlZW4gc3R5bGVzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkvLyBiZQotCQkJCQkvLyBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgcHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBhZnRlcgotCQkJCS8vIHRoZQotCQkJCS8vIGxhc3QKLQkJCQkvLyBzdHlsZQotCQkJCS8vIHJ1bGUKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCQkvLyAiQG1lZGlhIgotCQkJCS8vIGFuZAotCQkJCS8vIG1lZGlhdHlwZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQkvLyBhbmQKLQkJCQkvLyB0aGUKLQkJCQkvLyBmaXJzdAotCQkJCS8vIHN0eWxlCi0JCQkJLy8gcnVsZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBudWxsLCBzb3VyY2UpOwotCQkJfSBlbHNlIHsgLy8gbm9ybWFsIGNhc2UKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCS8vICJAbWVkaWEiCi0JCQkvLyBhbmQKLQkJCS8vIG1lZGlhdHlwZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsIHx8IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSB7IC8vIGJldHdlZW4KLQkJCS8vIG1lZGlhdHlwZQotCQkJLy8gYW5kCi0JCQkvLyB0aGUKLQkJCS8vIGZpcnN0Ci0JCQkvLyBzdHlsZQotCQkJLy8gcnVsZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBiZXR3ZWVuIHN0eWxlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gc291cmNlIGZvcm1hdHRpbmcKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWlmIChub2RlLmdldExhc3RDaGlsZCgpID09IG51bGwgfHwgbm9kZS5nZXRMYXN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gYkluQ3VybHlCcmFjZSA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWJJbkN1cmx5QnJhY2UpCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQllbHNlCi0JCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCQkJYkluQ3VybHlCcmFjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCWlmIChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgbm9kZS5nZXRMYXN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCXNvdXJjZS5hcHBlbmQoIn0iKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJU3RyaW5nIHN0ciA9IE1FRElBOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IE1FRElBLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCX0KLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKGNoaWxkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSAmJiAoKG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgY2hpbGQpLmdldExlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWVkaWFSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlLmdldExhc3RDaGlsZCgpKSB7IC8vIGluc2VydGVkCi0JCQkvLyBmaXJzdAotCQkJLy8gc3R5bGUKLQkJCS8vIHJ1bGUKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gMDsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWludCBwb3MgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pIC0gaW5zZXJ0UG9zOwotCQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLCBpbnNlcnRQb3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlLmdldExhc3RDaGlsZCgpKSB7IC8vIGluc2VydGVkCi0JCQkvLyBmaXJzdAotCQkJLy8gc3R5bGUKLQkJCS8vIHJ1bGUKLQkJCWludCBwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChwb3MgPD0gMCkKLQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkgKyA2IC8qCi0JCQkJCQkJCQkJCQkJCQkJCSAqIGxlbmd0aAotCQkJCQkJCQkJCQkJCQkJCQkgKiBvZgotCQkJCQkJCQkJCQkJCQkJCQkgKiAiQG1lZGlhIgotCQkJCQkJCQkJCQkJCQkJCQkgKi87Ci0JCQlyZXR1cm4gaW5zZXJ0UG9zIC0gcG9zOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QYWdlUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2RlOTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGFnZVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBQQUdFID0gIkBwYWdlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUGFnZVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlQYWdlUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NQYWdlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgcG9zID0gZ2V0QXR0ckluc2VydFBvcyhub2RlLCBhdHRyLmdldE5hbWUoKSk7Ci0JCQkJY29udGV4dC5zdGFydCA9IHBvczsKLQkJCQljb250ZXh0LmVuZCA9IHBvczsKLQkJCQkvKgotCQkJCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPQotCQkJCSAqIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Tm9kZUF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbilub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkgKiBJVGV4dFJlZ2lvbiByZWdpb24gPQotCQkJCSAqIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbilub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkgKiBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5TKSB7Ci0JCQkJICogY29udGV4dC5zdGFydCA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOyBjb250ZXh0LmVuZCA9Ci0JCQkJICogcmVnaW9uLmdldEVuZE9mZnNldCgpOyB9IGVsc2UgeyBjb250ZXh0LnN0YXJ0ID0KLQkJCQkgKiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSArIDE7IGNvbnRleHQuZW5kID0KLQkJCQkgKiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsgfQotCQkJCSAqL30KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQpIHsKLQkJCVN0cmluZyB2YWwgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQodmFsKTsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBzdHIgPSBQQUdFOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IFBBR0UudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCXN0ciA9ICgoSUNTU1BhZ2VSdWxlKSBub2RlKS5nZXRTZWxlY3RvclRleHQoKTsKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCAoaSA9PSAwKSA/IG91dHNpZGVbMF0gOiByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0sIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1BhZ2VSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJZWxzZSBpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSA+PSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFBhZ2VSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFBhZ2VSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTVlOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWJvb2xlYW4gYXBwZW5kUXVvdGUgPSByZWdpb25zLmxlbmd0aCA+IDEgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSAmJiBpc0NsZWFudXAoKSAmJiBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNRdW90ZVZhbHVlcygpICYmICgoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVCkgfHwgKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSB8fCAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSk7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCi0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBza2lwU3BhY2UgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgJiYgIXNraXBTcGFjZSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc3RyQnVmKTsKLQkJCQlza2lwU3BhY2UgPSBmYWxzZTsKLQkJCQlzdHJCdWYuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJc2tpcFNwYWNlID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFwcGVuZFF1b3RlKSB7Ci0JCQkJc291cmNlLmFwcGVuZChxdW90ZSk7Ci0JCQkJU3RyaW5nIHN0ciA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJCXN0ciA9IHN0ci5yZXBsYWNlKCdcJycsICcgJyk7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2UoJ1wiJywgJyAnKTsKLQkJCQlzdHIgPSBzdHIudHJpbSgpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHF1b3RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoc3RyQnVmKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCQkJc2hvcnQgdHlwZSA9IHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0KLQkJCVN0cmluZyBzdHIgPSBudWxsOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT04gOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQkJaWYgKHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkgPT0gKChpbnQpIHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkpKSB7Ci0JCQkJCQlzdHIgPSBJbnRlZ2VyLnRvU3RyaW5nKChpbnQpIHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3RyID0gRmxvYXQudG9TdHJpbmcodmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19IQVNIIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCQlzdHIgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOwotCQkJCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQkJCXN0ciA9IHN0ci50b1VwcGVyQ2FzZSgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXN0ci50b0xvd2VyQ2FzZSgpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19BVFRSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRk9STUFUIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTE9DQUwgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQSA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIIDoKLQkJCQkJc3RyID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCX0KLQotCQkJU3RyaW5nIHByZVN0ciA9IG51bGwsIHBvc3RTdHIgPSBudWxsOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUiA6Ci0JCQkJCXByZVN0ciA9ICJhdHRyKCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCQlwb3N0U3RyID0gImNtIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCS8vIGNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJCXBvc3RTdHIgPSAiZGVnIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUyA6Ci0JCQkJCXBvc3RTdHIgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTIDoKLQkJCQkJcG9zdFN0ciA9ICJleCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQkJcG9zdFN0ciA9ICJncmFkIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQkJcG9zdFN0ciA9ICJIeiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTiA6Ci0JCQkJCXBvc3RTdHIgPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQkJcG9zdFN0ciA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCQlwb3N0U3RyID0gIm1tIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQkJcG9zdFN0ciA9ICJtcyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJCXBvc3RTdHIgPSAicGMiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJCXBvc3RTdHIgPSAiJSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJCXBvc3RTdHIgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCQlwb3N0U3RyID0gInB4IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JBRCA6Ci0JCQkJCXBvc3RTdHIgPSAicmFkIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCS8vIGNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUOgotCQkJCS8vIGNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUjoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TIDoKLQkJCQkJcG9zdFN0ciA9ICJzIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORyA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gcXVvdGU7Ci0JCQkJCXBvc3RTdHIgPSBxdW90ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSAidXJsKCIgKyBxdW90ZTsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCS8vIHRoZSBmb2xsb3dpbmdzIGFyZSBvcmlnaW5hbCBwcmltaXRpdmUgdmFsdWVzCi0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VOS05PV04gOgotCQkJCS8vIHVzZSBzdHIKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT04gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSQU5HRSA6Ci0JCQkJCXByZVN0ciA9ICJVKyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRk9STUFUIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSAiZm9ybWF0KCIgKyBxdW90ZTsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gImxvY2FsKCIgKyBxdW90ZTsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlpZiAocHJlU3RyICE9IG51bGwpCi0JCQkJCXByZVN0ciA9IHByZVN0ci50b1VwcGVyQ2FzZSgpOwotCQkJCWlmIChwb3N0U3RyICE9IG51bGwpCi0JCQkJCXBvc3RTdHIgPSBwb3N0U3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAocHJlU3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChwcmVTdHIpOwotCQkJaWYgKHN0ciAhPSBudWxsKQotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWlmIChwb3N0U3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChwb3N0U3RyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUkdCRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTA5ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUkdCRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUkdCRm9ybWF0dGVyIGV4dGVuZHMgRnVuY3Rpb25Gb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUkdCRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUkdCRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVuYygpIHsKLQkJcmV0dXJuICJyZ2IoIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUkdCRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFJHQkZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JlY3RGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JlY3RGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlYzgzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVjdEZvcm1hdHRlciBleHRlbmRzIEZ1bmN0aW9uRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlY3RGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSZWN0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVuYygpIHsKLQkJcmV0dXJuICJyZWN0KCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJlY3RGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUmVjdEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVEZWNsSXRlbUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQWZ0ZXJDb2xvblNwYWNlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgbiA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOwotCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJaW50IGFwcGVuZCA9IGdldEZpcnN0Q2hpbGRSZWdpb25MZW5ndGgobm9kZSk7Ci0JCQlpZiAobGVuZ3RoICsgbiArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJbiA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJfQotCQl9Ci0JCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCXdoaWxlIChuLS0gPiAwKQotCQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBnZXRGaXJzdENoaWxkUmVnaW9uTGVuZ3RoKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU05vZGUgZmlyc3RDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgZmlyc3RDaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIHN0YXJ0KTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZyA9IGl0ci5uZXh0KCk7Ci0JCQlpZiAocmVnICE9IG51bGwgJiYgcmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQlyZXR1cm4gcmVnLmdldFRleHRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVC5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCAmJiBhdHRyLmdldFZhbHVlKCkgIT0gbnVsbCAmJiBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBudWxsKTsKLQkJCX0KLQkJCS8vIGdlbmVyYXRlIHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCWlmICgoKElDU1NQcmltaXRpdmVWYWx1ZSkgY2hpbGQpLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BKQotCQkJCXRvQXBwZW5kID0gIiwiOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKCgoSUNTU1ByaW1pdGl2ZVZhbHVlKSBjaGlsZCkuZ2V0UHJpbWl0aXZlVHlwZSgpID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0gpCi0JCQkJdG9BcHBlbmQgPSAiLyI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIHRvQXBwZW5kICE9IG51bGwgJiYgIXRvQXBwZW5kLmVxdWFscygiLCIpICYmICF0b0FwcGVuZC5lcXVhbHMoIi8iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsgLy8gbXVzdCBiZQotCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCWlmICh0b0FwcGVuZCAhPSAiLCIgJiYgdG9BcHBlbmQgIT0gIi8iKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJLy8gYXBwZW5kICIhaW1wb3J0YW50IgotCQkJU3RyaW5nIHByaW9yaXR5ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJpb3JpdHkoKTsKLQkJCWlmIChwcmlvcml0eSAhPSBudWxsICYmIHByaW9yaXR5Lmxlbmd0aCgpID4gMCkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHByaW9yaXR5LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQocHJpb3JpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wTmFtZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRvZSBzb3VyY2UKLQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSAoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGU7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXNvdXJjZS5hcHBlbmQoaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b1VwcGVyQ2FzZSgpKTsKLQkJCWVsc2UKLQkJCQlzb3VyY2UuYXBwZW5kKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkpOwotCi0JCQlpbnQgayA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJaWYgKGxlbmd0aCArIGsgKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCQlrID0gMDsgLy8gbm8gc3BhY2UgaXMgbmVjZXNzYXJ5Ci0JCQkJfQotCQkJfQotCQkJLy8gbm8gZGVsaW1pdGVyIGNhc2UKLQkJCXdoaWxlIChrLS0gPiAwKQotCQkJCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCI6Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghaXNDbGVhbnVwKCkgfHwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpIHsKLQkJCWFwcGVuZEFmdGVyQ29sb25TcGFjZShub2RlLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikgJiYgKCFpc0NsZWFudXAoKSB8fCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkpIHsKLQkJCQlhcHBlbmRBZnRlckNvbG9uU3BhY2Uobm9kZSwgc291cmNlKTsKLQkJCX0gZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdFZhbHVlKElDU1NOb2RlIG5vZGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCk7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkpOwotCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJbiAtPSBmbGF0Tm9kZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCVN0cmluZyBpbXBvcnRhbnQgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcmlvcml0eSgpOwotCQkJaWYgKGltcG9ydGFudCAhPSBudWxsICYmIGltcG9ydGFudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBmaW5kIGJlZm9yZSAiIWltcG9ydGFudCIgcG9zaXRpb24KLQkJCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gZmxhdE5vZGUpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCkKLQkJCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNraXAgbGFzdCBzcGFjZQotCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCW4gLT0gcmVnaW9uLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVEZWNsSXRlbUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwNjYzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0KLQkJLy8gY2hlY2sgbm8gY2hpbGQKLQkJaWYgKGNoaWxkID09IG51bGwgJiYgcHJldiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJCQlwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBwaWNrdXBUeXBlKTsKLQkJCX0KLQkJCS8vIGV4dHJhY3Qgc291cmNlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCS8vIGJlCi0JCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJfSBlbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOgotCQkJLy8gYmV0d2VlbiB0d28KLQkJCS8vIGRlY2xhcmF0aW9ucwotCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcmV2ID09IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYmVmb3JlIHRoZSBmaXJzdAotCQkJLy8gZGVjbGFyYXRpb24KLQkJCW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yIGl0ID0gbnVsbDsKLQkJCWlmIChlbmQgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgZW5kIC0gMSk7Ci0JCQl9IGVsc2UgewotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvcyAtIDEpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpdCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbWl0ID0gKChJbmRleGVkUmVnaW9uKSAoKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpID8gbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBub2RlKSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIGN1clJlZyA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCBjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChjdXJSZWcpIDw9IGxpbWl0KQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGNoaWxkID09IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYWZ0ZXIgdGhlIGxhc3QKLQkJCS8vIGRlY2xhcmF0aW9uCi0JCQlvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvciBpdCA9IG51bGw7Ci0JCQlpZiAoc3RhcnQgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3MpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpdCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbWl0ID0gKChJbmRleGVkUmVnaW9uKSAoKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpID8gbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBub2RlKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjdXJSZWcgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAobGltaXQgPD0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGN1clJlZykpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCQkvLyBnZXQgbmV4dCByZWdpb24KLQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJQ29tcG91bmRSZWdpb24gdG9BcHBlbmRSZWdpb24gPSBudWxsOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zKTsKLQkJCQkJdG9BcHBlbmRSZWdpb24gPSBuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvcykpOwotCQkJCX0KLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgdG9BcHBlbmRSZWdpb24sIHNvdXJjZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHByZXYgIT0gbnVsbCB8fCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIDw9IDApKSB7Ci0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSAmJiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkgIT0gbm9kZSB8fCAhcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikpKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlIGlmIChwcmV2ICE9IG51bGwgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkgIT0gbm9kZSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QgYmUKLQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSAmJiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkgIT0gbm9kZSB8fCAhcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpbnQgcG9zID0gc3VwZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChwb3MgPCAwKSB7Ci0JCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJcmV0dXJuIChmb3JtYXR0ZXIgIT0gbnVsbCkgPyBmb3JtYXR0ZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZS5nZXRQYXJlbnROb2RlKCkpIDogLTE7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcykpIHsKLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsICYmIG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCQlDU1NTb3VyY2VHZW5lcmF0b3IgcG50Rm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJCWlmIChwbnRGb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBudEZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZS5nZXRQYXJlbnROb2RlKCksIGluc2VydFBvcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8PSAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MgLSAxKSkgewotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwgJiYgbm5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJCUNTU1NvdXJjZUdlbmVyYXRvciBwbnRGb3JtYXR0ZXIgPSBnZXRQYXJlbnRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKHBudEZvcm1hdHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gcG50Rm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIGluc2VydFBvcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLCBpbnNlcnRQb3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTkzNTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NTdHlsZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQpIHsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkU2VsZWN0b3JSZWdpb24ocmVnaW9uc1tpXSwgKGkgIT0gMCkgPyByZWdpb25zW2kgLSAxXSA6IG51bGwsIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgc3RyID0gKChJQ1NTU3R5bGVSdWxlKSBub2RlKS5nZXRTZWxlY3RvclRleHQoKTsKLQkJCS8vIGFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsc3RyLHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgKGkgPT0gMCkgPyBvdXRzaWRlWzBdIDogcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKHJlZ2lvbnNbaV0sIChpICE9IDApID8gcmVnaW9uc1tpIC0gMV0gOiBudWxsLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbcmVnaW9ucy5sZW5ndGggLSAxXSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3R5bGVSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlU2hlZXRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlU2hlZXRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjMTk4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVTaGVldEZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlU2hlZXRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChwcmV2ID09IG51bGwgJiYgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVI7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCAocmVnaW9ucy5sZW5ndGggPiAwKSA/IHJlZ2lvbnNbMF0gOiBudWxsLCBzb3VyY2UpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQkJCQkJCQkJCQkJCQkJCQkJLy8gb3IKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNlbWlfY29sb24KLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJCQkvLyBhcHBlbmQgZGVsaW0gYWZ0ZXIKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJldiAhPSBudWxsKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gc291cmNlIGdlbmVyYXRpb24gOgotCQkJCQkJCQkJCQkJCS8vIGJldHdlZW4gdHdvIHJ1bGVzCi0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWVsc2UgaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAocHJldiA9PSBudWxsKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nIDogYmVmb3JlIHRoZSBmaXJzdCBydWxlCi0JCQkJSUNTU05vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChuZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBuZXh0KS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJCXBvcyA9ICgoSW5kZXhlZFJlZ2lvbikgbmV4dCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAocG9zICE9IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlDb21wb3VuZFJlZ2lvbltdIHByZXZSZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oMCwgcG9zKSwgbnVsbCwgbnVsbCk7Ci0JCQkJCWlmIChwcmV2UmVnaW9ucyAhPSBudWxsICYmIHByZXZSZWdpb25zLmxlbmd0aCA+IDApCi0JCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkID09IG51bGwpIHsgLy8gc291cmNlIGZvcm1hdHRpbmcgOiBhZnRlciB0aGUgbGFzdAotCQkJCQkJCQkJCS8vIHJ1bGUKLQkJCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDw9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoc3RhcnQgPD0gMCkgewotCQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJCWlmIChwb3MgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QgYmUKLQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJfQotCQkJaWYgKChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5sZW5ndGggPiAwICYmIHJlZ2lvbnNbcmVnaW9ucy5sZW5ndGggLSAxXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJaWYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkgIT0gbnVsbCAmJiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQlyZXR1cm47IC8vIG5vdGhpbmcKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGUgbm9kZSwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDApIHsKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgcmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJCWlmIChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKHNvdXJjZS5sZW5ndGgoKSA+IDAgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkgIT0gbnVsbCAmJiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7Ci0JCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJLy8gc291cmNlLmFwcGVuZCgiPCEtLSIpOwotCQkJLy8gYXBwZW5kRGVsaW1CZWZvcmUobm9kZSxudWxsLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybjsgLy8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkgfHwgcmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKSB7Ci0JCQkJaWYgKHNvdXJjZS5sZW5ndGgoKSA+IDAgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnID0gaXQucHJldigpOwotCQkJCWlmIChyZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWcpOwotCQkJfQotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlU2hlZXRGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVTaGVldEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1Vua25vd25SdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDZhNDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1Vua25vd25SdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25SdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBVbmtub3duUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVVua25vd25SdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJQ1NTVW5rbm93blJ1bGUgcnVsZSA9IChDU1NVbmtub3duUnVsZSkgbm9kZTsKLQkJCXNvdXJjZS5hcHBlbmQocnVsZS5nZXRDc3NUZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFVua25vd25SdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFVua25vd25SdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DYXRlZ29yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmNkNDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTUNhdGVnb3J5IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRDYXB0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdmY2RjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1DaGFyc2V0UnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjgzNzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NQ29udGFpbmVyIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiYTcyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1EZXNjcmlwdG9yIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCUl0ZXJhdG9yIGdldFZhbHVlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQ1ZGMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRm9udEZhY2VSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmRmMjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1GdW5jdGlvbiBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0RnVuY3Rpb25TdHJpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZkMTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NSW1wb3J0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUltcG9ydFJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NS2V5d29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQ1YjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NS2V5d29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUtleXdvcmQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldEtleXdvcmRTdHJpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYWEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTU1lZGlhUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWUyZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NTm9kZSB7Ci0JU3RyaW5nIGdldFR5cGUoKTsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCVN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOwotCi0JSXRlcmF0b3IgZ2V0Q2hpbGROb2RlcygpOwotCi0JSXRlcmF0b3IgZ2V0RGVzY2VuZGFudHMoKTsKLQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBfUFJFRklYID0gIkNTU01NLiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfS0VZV09SRCA9IF9QUkVGSVggKyAiS2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfVU5JVCA9IF9QUkVGSVggKyAiVW5pdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRlVOQ1RJT04gPSBfUFJFRklYICsgIkZ1bmN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFJJTkcgPSBfUFJFRklYICsgIlN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RZTEVfU0hFRVQgPSBfUFJFRklYICsgIlN0eWxlU2hlZXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BST1BFUlRZID0gX1BSRUZJWCArICJQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVTQ1JJUFRPUiA9IF9QUkVGSVggKyAiRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ09OVEFJTkVSID0gX1BSRUZJWCArICJDb250YWluZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05VTUJFUiA9IF9QUkVGSVggKyAiTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TRVBBUkFUT1IgPSBfUFJFRklYICsgIlNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0hBUlNFVF9SVUxFID0gX1BSRUZJWCArICJDaGFyc2V0UnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU1QT1JUX1JVTEUgPSBfUFJFRklYICsgIkltcG9ydFJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUWUxFX1JVTEUgPSBfUFJFRklYICsgIlN0eWxlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVESUFfUlVMRSA9IF9QUkVGSVggKyAiTWVkaWFSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QQUdFX1JVTEUgPSBfUFJFRklYICsgIlBhZ2VSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GT05UX0ZBQ0VfUlVMRSA9IF9QUkVGSVggKyAiRm9udEZhY2VSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DQVRFR09SWSA9IF9QUkVGSVggKyAiQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FVEFfTU9ERUwgPSBfUFJFRklYICsgIk1ldGFNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUT1IgPSBfUFJFRklYICsgIlNlbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU51bWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhMWIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTU51bWJlciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmOTllOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NUGFnZVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDE0NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTVByb3BlcnR5IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRDYXRlZ29yeU5hbWUoKTsKLQotCUl0ZXJhdG9yIGdldFZhbHVlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3YWMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TZWxlY3RvciBleHRlbmRzIENTU01NTm9kZSB7Ci0JU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpOwotCi0JU3RyaW5nIGdldFNlbGVjdG9yU3RyaW5nKCk7Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FWFBSRVNTSU9OID0gIkV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BTRVVET19DTEFTUyA9ICJQc2V1ZG9DbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUFNFVURPX0VMRU1FTlQgPSAiUHNldWRvRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGVtYmVkZGVkIGV4cHJlc3Npb24gdHlwZQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9ERVNDRU5EQU5UID0gImRlc2NlbmRhbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9BREpBQ0VOVCA9ICJhZGphY2VudCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fVU5JVkVSU0FMID0gInVuaXZlcnNhbCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkZGY4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0cmluZyBleHRlbmRzIENTU01NTm9kZSB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0MTRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0eWxlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZGM2N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU3R5bGVTaGVldCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTEwYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NVW5pdCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0VW5pdFN0cmluZygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTWV0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGMyNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTWV0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01ldGFNb2RlbCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQkvLyBwdWJsaWMgaW50ZXJmYWNlIENTU01ldGFNb2RlbCB7Ci0JQ1NTTU1TdHlsZVNoZWV0IGdldFN0eWxlU2hlZXQoKTsKLQotCS8qCi0JICogU2hvcnRjdXQgdG8gYWNjZXNzIHByb3BlcnR5IG5vZGUKLQkgKi8KLQkvLyBJdGVyYXRvciBnZXRQcm9wZXJ0aWVzKCk7Ci0JLy8gSXRlcmF0b3IgZ2V0RGVzY3JpcHRvcnMoKTsKLQkvLyBDU1NNTVByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCS8qCi0JICogYWNjZXNzIHRvIGNhdGVnb3J5IGluZm9ybWF0aW9uCi0JICovCi0JSXRlcmF0b3IgZ2V0Q2F0ZWdvcmllcygpOwotCi0JLyoKLQkgKiBVdGlsaXRpZXMKLQkgKi8KLQkvLyBJdGVyYXRvciBjb2xsZWN0Tm9kZXNCeVR5cGUoU3RyaW5nIHR5cGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1ZmI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUHJvZmlsZSB7Ci0KLQlTdHJpbmcgZ2V0UHJvZmlsZUlEKCk7Ci0KLQlTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKTsKLQotCVVSTCBnZXRQcm9maWxlVVJMKCk7Ci0KLQlDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCk7Ci0KLQlib29sZWFuIGlzRGVmYXVsdCgpOwotCi0JU3RyaW5nIGdldE93bmVyUGx1Z2luSUQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjJiNGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsLlJlZ2lzdHJ5UmVhZGVyOwotCi0KLQotcHVibGljIGNsYXNzIENTU1Byb2ZpbGVSZWdpc3RyeSB7Ci0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTUHJvZmlsZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcm9maWxlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRQcm9maWxlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oZlByb2ZpbGVzLnZhbHVlcygpKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGdldFByb2ZpbGUoU3RyaW5nIHByb2ZpbGVJRCkgewotCQlyZXR1cm4gKENTU1Byb2ZpbGUpIGZQcm9maWxlcy5nZXQocHJvZmlsZUlEKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBnZXREZWZhdWx0UHJvZmlsZSgpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJaWYgKHByb2ZpbGUuaXNEZWZhdWx0KCkpIHsKLQkJCQlyZXR1cm4gcHJvZmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTUHJvZmlsZVJlZ2lzdHJ5LgotCSAqLwotCXByaXZhdGUgQ1NTUHJvZmlsZVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQlmUHJvZmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlJdGVyYXRvciBpID0gbmV3IFJlZ2lzdHJ5UmVhZGVyKCkuZW51bVByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHByb2ZpbGUgPSBpLm5leHQoKTsKLQkJCWlmIChwcm9maWxlIGluc3RhbmNlb2YgQ1NTUHJvZmlsZSkgewotCQkJCWZQcm9maWxlcy5wdXQoKChDU1NQcm9maWxlKSBwcm9maWxlKS5nZXRQcm9maWxlSUQoKSwgcHJvZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIENTU1Byb2ZpbGVSZWdpc3RyeSBmSW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgTWFwIGZQcm9maWxlcyA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkNjdiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0Z1bmN0aW9uSUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0FUVFIgPSAiYXR0ciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfQ09VTlRFUiA9ICJjb3VudGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SR0IgPSAicmdiIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SRUNUID0gInJlY3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0ZPUk1BVCA9ICJmb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0xPQ0FMID0gImxvY2FsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTS2V5d29yZElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTZiMzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTS2V5d29yZElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTS2V5d29yZElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18xMDAgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18yMDAgPSAiMjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18zMDAgPSAiMzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS180MDAgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS181MDAgPSAiNTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS182MDAgPSAiNjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS183MDAgPSAiNzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS184MDAgPSAiODAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS185MDAgPSAiOTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQk9WRSA9ICJhYm92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUJTT0xVVEUgPSAiYWJzb2x1dGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUJPUkRFUiA9ICJBY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUNBUFRJT04gPSAiQWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxXQVlTID0gImFsd2F5cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVBQV09SS1NQQUNFID0gIkFwcFdvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVFVQSA9ICJhcXVhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BUk1FTklBTiA9ICJhcm1lbmlhbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BVk9JRCA9ICJhdm9pZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkFDS0dST1VORCA9ICJCYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVISU5EID0gImJlaGluZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVMT1cgPSAiYmVsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JJRElfT1ZFUlJJREUgPSAiYmlkaS1vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxBQ0sgPSAiYmxhY2siOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMSU5LID0gImJsaW5rIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CTE9DSyA9ICJibG9jayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxVRSA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPTERFUiA9ICJib2xkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9ORkFDRSA9ICJCdXR0b25GYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05ISUdITElHSFQgPSAiQnV0dG9uSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05TSEFET1cgPSAiQnV0dG9uU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05URVhUID0gIkJ1dHRvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NBUElUQUxJWkUgPSAiY2FwaXRhbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DQVBUSU9OVEVYVCA9ICJDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSID0gImNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSX0xFRlQgPSAiY2VudGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUl9SSUdIVCA9ICJjZW50ZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSVJDTEUgPSAiY2lyY2xlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSktfSURFT0dSQVBISUMgPSAiY2prLWlkZW9ncmFwaGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DTE9TRV9RVU9URSA9ICJjbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05ERU5TRUQgPSAiY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT0xMQVBTRSA9ICJjb2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1AgPSAiY3JvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ1JPU1MgPSAiY3Jvc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1NTSEFJUiA9ICJjcm9zc2hhaXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NVUlNJVkUgPSAiY3Vyc2l2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREFTSEVEID0gImRhc2hlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVDSU1BTCA9ICJkZWNpbWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ERUNJTUFMX0xFQURJTkdfWkVSTyA9ICJkZWNpbWFsLWxlYWRpbmctemVybyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESUdJVFMgPSAiZGlnaXRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESVNDID0gImRpc2MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVFRFRCA9ICJkb3R0ZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VfUkVTSVpFID0gImUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FTUJFRCA9ICJlbWJlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0NPTkRFTlNFRCA9ICJleHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0VYUEFOREVEID0gImV4dHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQU5UQVNZID0gImZhbnRhc3kiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBUl9MRUZUID0gImZhci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVJfUklHSFQgPSAiZmFyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVNUID0gImZhc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBU1RFUiA9ICJmYXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZFTUFMRSA9ICJmZW1hbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GVUNIU0lBID0gImZ1Y2hzaWEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dFT1JHSUFOID0gImdlb3JnaWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkFZID0gImdyYXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dSQVlURVhUID0gIkdyYXlUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkVFTiA9ICJncmVlbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JPT1ZFID0gImdyb292ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVCUkVXID0gImhlYnJldyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVMUCA9ICJoZWxwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURFID0gImhpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0ggPSAiaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUID0gIkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUVEVYVCA9ICJIaWdobGlnaHRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISUdIRVIgPSAiaGlnaGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISVJBR0FOQSA9ICJoaXJhZ2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElSQUdBTkFfSVJPSEEgPSAiaGlyYWdhbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5BQ1RJVkVCT1JERVIgPSAiSW5hY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTiA9ICJJbmFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTlRFWFQgPSAiSW5hY3RpdmVDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5GT0JBQ0tHUk9VTkQgPSAiSW5mb0JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lORk9URVhUID0gIkluZm9UZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkUgPSAiaW5saW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkVfVEFCTEUgPSAiaW5saW5lLXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTlNFVCA9ICJpbnNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5TSURFID0gImluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5WRVJUID0gImludmVydCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19LQVRBS0FOQSA9ICJrYXRha2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfS0FUQUtBTkFfSVJPSEEgPSAia2F0YWthbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBTkRTQ0FQRSA9ICJsYW5kc2NhcGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBUkdFID0gImxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQVJHRVIgPSAibGFyZ2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRfU0lERSA9ICJsZWZ0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRXQVJEUyA9ICJsZWZ0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFVkVMID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MSUdIVEVSID0gImxpZ2h0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJTUUgPSAibGltZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElORV9USFJPVUdIID0gImxpbmUtdGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElTVF9JVEVNID0gImxpc3QtaXRlbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9VRCA9ICJsb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1cgPSAibG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUiA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfQUxQSEEgPSAibG93ZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX0dSRUVLID0gImxvd2VyLWdyZWVrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUl9MQVRJTiA9ICJsb3dlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfUk9NQU4gPSAibG93ZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSQ0FTRSA9ICJsb3dlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xUUiA9ICJsdHIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BTEUgPSAibWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFSS0VSID0gIm1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFST09OID0gIm1hcm9vbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVESVVNID0gIm1lZGl1bSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NRU5VVEVYVCA9ICJNZW51VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVTU0FHRV9CT1ggPSAibWVzc2FnZS1ib3giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JWCA9ICJtaXgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PTk9TUEFDRSA9ICJtb25vc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTl9SRVNJWkUgPSAibi1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05BUlJPV0VSID0gIm5hcnJvd2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OQVZZID0gIm5hdnkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05FX1JFU0laRSA9ICJuZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX0NMT1NFX1FVT1RFID0gIm5vLWNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19PUEVOX1FVT1RFID0gIm5vLW9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX1JFUEVBVCA9ICJuby1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9XUkFQID0gIm5vd3JhcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTldfUkVTSVpFID0gIm53LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT0JMSVFVRSA9ICJvYmxpcXVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PTElWRSA9ICJvbGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT05DRSA9ICJvbmNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PUEVOX1FVT1RFID0gIm9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNFVCA9ICJvdXRzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNJREUgPSAib3V0c2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT1ZFUkxJTkUgPSAib3ZlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BPSU5URVIgPSAicG9pbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUE9SVFJBSVQgPSAicG9ydHJhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BSRSA9ICJwcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BVUlBMRSA9ICJwdXJwbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFRCA9ICJyZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFTEFUSVZFID0gInJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVQgPSAicmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVRfWCA9ICJyZXBlYXQteCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUX1kgPSAicmVwZWF0LXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JJREdFID0gInJpZGdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFRfU0lERSA9ICJyaWdodC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVFdBUkRTID0gInJpZ2h0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JUTCA9ICJydGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JVTl9JTiA9ICJydW4taW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NfUkVTSVpFID0gInMtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQU5TX1NFUklGID0gInNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTCA9ICJzY3JvbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTEJBUiA9ICJTY3JvbGxiYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFX1JFU0laRSA9ICJzZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFTUlfQ09OREVOU0VEID0gInNlbWktY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRU1JX0VYUEFOREVEID0gInNlbWktZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFUEFSQVRFID0gInNlcGFyYXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRVJJRiA9ICJzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0hPVyA9ICJzaG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxWRVIgPSAic2lsdmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTE9XID0gInNsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NMT1dFUiA9ICJzbG93ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMID0gInNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTF9DQVBTID0gInNtYWxsLWNhcHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMX0NBUFRJT04gPSAic21hbGwtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU01BTExFUiA9ICJzbWFsbGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TT0ZUID0gInNvZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NPTElEID0gInNvbGlkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUEVMTF9PVVQgPSAic3BlbGwtb3V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUVVBUkUgPSAic3F1YXJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUVVNfQkFSID0gInN0YXR1cy1iYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVUEVSID0gInN1cGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TV19SRVNJWkUgPSAic3ctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEVfQ0FQVElPTiA9ICJ0YWJsZS1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTl9HUk9VUCA9ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0ZPT1RFUl9HUk9VUCA9ICJ0YWJsZS1mb290ZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0hFQURFUl9HUk9VUCA9ICJ0YWJsZS1oZWFkZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPVyA9ICJ0YWJsZS1yb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPV19HUk9VUCA9ICJ0YWJsZS1yb3ctZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFQUwgPSAidGVhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19URVhUX1RPUCA9ICJ0ZXh0LXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVF9CT1RUT00gPSAidGV4dC1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RISUNLID0gInRoaWNrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USElOID0gInRoaW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFRERBUktTSEFET1cgPSAiVGhyZWVERGFya1NoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVERkFDRSA9ICJUaHJlZURGYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURISUdITElHSFQgPSAiVGhyZWVESGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURMSUdIVFNIQURPVyA9ICJUaHJlZURMaWdodFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVEU0hBRE9XID0gIlRocmVlRFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVFJBTlNQQVJFTlQgPSAidHJhbnNwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0NPTkRFTlNFRCA9ICJ1bHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0VYUEFOREVEID0gInVsdHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUl9BTFBIQSA9ICJ1cHBlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJfTEFUSU4gPSAidXBwZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VQUEVSX1JPTUFOID0gInVwcGVyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUkNBU0UgPSAidXBwZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19WSVNJQkxFID0gInZpc2libGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dfUkVTSVpFID0gInctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XQUlUID0gIndhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dISVRFID0gIndoaXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSURFUiA9ICJ3aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XRlJBTUUgPSAiV2luZG93RnJhbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPV1RFWFQgPSAiV2luZG93VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9GQVNUID0gIngtZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9ISUdIID0gIngtaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MQVJHRSA9ICJ4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVUQgPSAieC1sb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVyA9ICJ4LWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTE9XID0gIngtc2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTUFMTCA9ICJ4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX1NPRlQgPSAieC1zb2Z0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YWF9TTUFMTCA9ICJ4eC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWFhfTEFSR0UgPSAieHgtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1lFTExPVyA9ICJ5ZWxsb3ciOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTU1UeXBlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmFmNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTTU1UeXBlQ29sbGVjdG9yIGV4dGVuZHMgQ1NTTWV0YU1vZGVsVHJhdmVyc2VyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUeXBlQ29sbGVjdG9yLgotCSAqLwotCXB1YmxpYyBDU1NNTVR5cGVDb2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoQ1NTTU1Ob2RlIG5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZk5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhcHBseShub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0TmVzdGVkVHlwZShib29sZWFuIG5lc3RlZCkgewotCQlmTmVzdGVkID0gbmVzdGVkOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJjID0gVFJBVl9DT05UOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoZlR5cGUgPT0gbm9kZS5nZXRUeXBlKCkpIHsKLQkJCQlpZiAoIWZOb2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJCQlmTm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCQlpZiAoIWZOZXN0ZWQpIHsKLQkJCQkJcmMgPSBUUkFWX1BSVU5FOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldE5vZGVzKCkgewotCQlyZXR1cm4gZk5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gZk5lc3RlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gbnVsbDsKLQlMaXN0IGZOb2RlcyA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmRhNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01lZGlhR3JvdXBJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9QQUdFRCA9ICJwYWdlZCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9WSVNVQUwgPSAidmlzdWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BVVJBTCA9ICJhdXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVEFDVElMRSA9ICJ0YWN0aWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0dSSUQgPSAiZ3JpZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQklUTUFQID0gImJpdG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9JTlRFUkFDVElWRSA9ICJpbnRlcmFjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdkODRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTTWV0YU1vZGVsRmluZGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsRmluZGVyLgotCSAqLwotCXByaXZhdGUgQ1NTTWV0YU1vZGVsRmluZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU01ldGFNb2RlbEZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTTWV0YU1vZGVsRmluZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKG5vZGUpLmdldE1ldGFNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IobW9kZWwpLmdldE1ldGFNb2RlbCgpOwotCi0JfQotCi0JLy8gZmluZE1ldGFNb2RlbEZvcihOb2RlKSBpcyBub3QgdXNlZC4KLQkvLyBFdmVuIGlmIGl0IGlzIHVzZWQsIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoCi0JLy8gZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsKSBlYXNpbHkKLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKS5nZXRNZXRhTW9kZWwoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NNZXRhTW9kZWxGaW5kZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhNmY0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ1NTTWV0YU1vZGVsVHJhdmVyc2VyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUcmF2ZXJzZXIuCi0JICovCi0JcHVibGljIENTU01ldGFNb2RlbFRyYXZlcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShDU1NNTU5vZGUgbm9kZSkgewotCQlmVHJhdlN0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLQkJYmVnaW4obm9kZSk7Ci0JCXRyYXZlcnNlKG5vZGUpOwotCQllbmQobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzaG9ydCB0cmF2ZXJzZShDU1NNTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0KLQkJZlRyYXZTdGFjay5wdXNoKG5vZGUpOwotCi0JCXNob3J0IHJjOwotCQlyYyA9IHByZU5vZGUobm9kZSk7Ci0KLQkJaWYgKHJjID09IFRSQVZfQ09OVCkgewotCQkJSXRlcmF0b3IgaSA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlIGNoaWxkID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQkJc2hvcnQgcmNDaGlsZCA9IHRyYXZlcnNlKGNoaWxkKTsKLQkJCQlpZiAocmNDaGlsZCA9PSBUUkFWX1NUT1ApIHsKLQkJCQkJZlRyYXZTdGFjay5wb3AoKTsKLQkJCQkJcmV0dXJuIFRSQVZfU1RPUDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmMgPT0gVFJBVl9TVE9QKSB7Ci0JCQlmVHJhdlN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIFRSQVZfU1RPUDsKLQkJfQotCi0JCXJjID0gcG9zdE5vZGUobm9kZSk7Ci0KLQkJZlRyYXZTdGFjay5wb3AoKTsKLQkJcmV0dXJuIChyYyA9PSBUUkFWX1BSVU5FKSA/IFRSQVZfQ09OVCA6IHJjOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJlZ2luKENTU01NTm9kZSBub2RlKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoQ1NTTU1Ob2RlIG5vZGUpIHsKLQotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0KLQlTdGFjayBmVHJhdlN0YWNrID0gbnVsbDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgVFJBVl9DT05UID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFRSQVZfU1RPUCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBUUkFWX1BSVU5FID0gMjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDBiMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NNZXRhTW9kZWxVdGlsIHsKLQlwdWJsaWMgQ1NTTWV0YU1vZGVsVXRpbChDU1NNZXRhTW9kZWwgbWV0YW1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBjb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgY29sbGVjdE5vZGVzQnlUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCUNTU01NVHlwZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgQ1NTTU1UeXBlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5hcHBseShmTWV0YU1vZGVsLCB0eXBlKTsKLQkJcmV0dXJuIGNvbGxlY3Rvci5nZXROb2RlcygpOwotCX0KLQotCXB1YmxpYyBDU1NNTVByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSXRlcmF0b3IgaVByb3BlcnR5ID0gZ2V0UHJvcGVydGllcygpOwotCQl3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydHkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiAoQ1NTTU1Qcm9wZXJ0eSkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JOYW1lKSB7Ci0JCUl0ZXJhdG9yIGlEZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcnMoKTsKLQkJd2hpbGUgKGlEZXNjcmlwdG9yLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpRGVzY3JpcHRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShkZXNjcmlwdG9yTmFtZSkpIHsKLQkJCQlyZXR1cm4gKENTU01NRGVzY3JpcHRvcikgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1Ob2RlIGdldE1ldGFNb2RlbE5vZGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydHkoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0b3IoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQl9Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGZUeXBlTWFwID09IG51bGwpIHsKLQkJCWZUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuU1RZTEVSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9TVFlMRV9SVUxFKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9GT05UX0ZBQ0VfUlVMRSk7Ci0JCQlmVHlwZU1hcC5wdXQobmV3IFNob3J0KElDU1NOb2RlLlBBR0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9QQUdFX1JVTEUpOwotCQl9Ci0KLQkJU3RyaW5nIG5vZGVUeXBlID0gKFN0cmluZykgZlR5cGVNYXAuZ2V0KG5ldyBTaG9ydChub2RlLmdldE5vZGVUeXBlKCkpKTsKLQkJaWYgKG5vZGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSXRlcmF0b3IgaU5vZGVzID0gY29sbGVjdE5vZGVzQnlUeXBlKG5vZGVUeXBlKTsKLQkJaWYgKGlOb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSB0YXJnZXROb2RlID0gKENTU01NTm9kZSkgaU5vZGVzLm5leHQoKTsKLQkJCWlmICghaU5vZGVzLmhhc05leHQoKSkgeyAvLyBpdCdzIG9ubHkgb25lCi0JCQkJcmV0dXJuIHRhcmdldE5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0KLQlwcml2YXRlIENTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVHlwZU1hcCA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NOdW1iZXJJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NOdW1iZXJJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM2N2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU051bWJlcklEIHsKLQotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fQU5HTEUgPSAiYW5nbGUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0ZSRVFVRU5DWSA9ICJmcmVxdWVuY3kiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0lOVEVHRVIgPSAiaW50ZWdlciI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fTEVOR1RIID0gImxlbmd0aCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fUEVSQ0VOVEFHRSA9ICJwZXJjZW50YWdlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9USU1FID0gInRpbWUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0hBU0ggPSAiaGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb2ZpbGVGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmIwZjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ1NTQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIENTU1Byb2ZpbGVGaW5kZXIgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NQcm9maWxlRmluZGVyLgotCSAqLwotCXByaXZhdGUgQ1NTUHJvZmlsZUZpbmRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NQcm9maWxlRmluZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcm9maWxlRmluZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBmaW5kUHJvZmlsZUZvcihJQ1NTTm9kZSBub2RlKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlDU1NEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCW1vZGVsID0gZG9jLmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbmRQcm9maWxlRm9yKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBmaW5kUHJvZmlsZUZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBudWxsOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCU9iamVjdCBtb2RlbFR5cGUgPSAoKElDU1NNb2RlbCkgbW9kZWwpLmdldFN0eWxlU2hlZXRUeXBlKCk7Ci0JCQlpZiAobW9kZWxUeXBlID09IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAobW9kZWxUeXBlID09IElDU1NNb2RlbC5FTUJFRERFRCB8fCBtb2RlbFR5cGUgPT0gSUNTU01vZGVsLklOTElORSkgewotCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOyAvLyBtYXkgYmUgbnVsbAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCXJldHVybiBmaW5kUHJvZmlsZUZvcihiYXNlTG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGZpbmRQcm9maWxlRm9yKFN0cmluZyBiYXNlTG9jYXRpb24pIHsKLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlDU1NQcm9maWxlIHByb2ZpbGUgPSBudWxsOwotCi0JCWlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJCXJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJvZmlsZUlEID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIHJlc291cmNlLCB0cnVlKTsKLQkJCQlpZiAocHJvZmlsZUlEICE9IG51bGwgJiYgMCA8IHByb2ZpbGVJRC5sZW5ndGgoKSkgewotCQkJCQlwcm9maWxlID0gcmVnLmdldFByb2ZpbGUocHJvZmlsZUlEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKHByb2ZpbGUgIT0gbnVsbCkgPyBwcm9maWxlIDogcmVnLmdldERlZmF1bHRQcm9maWxlKCk7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgQ1NTUHJvZmlsZUZpbmRlciBmSW5zdGFuY2UgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9wZXJ0eUlELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjZjZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9wZXJ0eUlELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUHJvcGVydHlJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQVpJTVVUSCA9ICJhemltdXRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CRyA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19BVFRBQ0hNRU5UID0gImJhY2tncm91bmQtYXR0YWNobWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQ09MT1IgPSAiYmFja2dyb3VuZC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfSU1BR0UgPSAiYmFja2dyb3VuZC1pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUE9TSVRJT04gPSAiYmFja2dyb3VuZC1wb3NpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUkVQRUFUID0gImJhY2tncm91bmQtcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVIgPSAiYm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MTEFQU0UgPSAiYm9yZGVyLWNvbGxhcHNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MT1IgPSAiYm9yZGVyLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1BBQ0lORyA9ICJib3JkZXItc3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUCA9ICJib3JkZXItdG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFQgPSAiYm9yZGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NID0gImJvcmRlci1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX0NPTE9SID0gImJvcmRlci10b3AtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9DT0xPUiA9ICJib3JkZXItcmlnaHQtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fQ09MT1IgPSAiYm9yZGVyLWJvdHRvbS1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfQ09MT1IgPSAiYm9yZGVyLWxlZnQtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfU1RZTEUgPSAiYm9yZGVyLXRvcC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1NUWUxFID0gImJvcmRlci1yaWdodC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9TVFlMRSA9ICJib3JkZXItYm90dG9tLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9TVFlMRSA9ICJib3JkZXItbGVmdC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9XSURUSCA9ICJib3JkZXItdG9wLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfV0lEVEggPSAiYm9yZGVyLXJpZ2h0LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1dJRFRIID0gImJvcmRlci1ib3R0b20td2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1dJRFRIID0gImJvcmRlci1sZWZ0LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DQVBUSU9OX1NJREUgPSAiY2FwdGlvbi1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTEVBUiA9ICJjbGVhciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xJUCA9ICJjbGlwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT0xPUiA9ICJjb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09OVEVOVCA9ICJjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX0lOQ1JFTUVOVCA9ICJjb3VudGVyLWluY3JlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9SRVNFVCA9ICJjb3VudGVyLXJlc2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUUgPSAiY3VlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQUZURVIgPSAiY3VlLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQkVGT1JFID0gImN1ZS1iZWZvcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVUlNPUiA9ICJjdXJzb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0RJU1BMQVkgPSAiZGlzcGxheSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRUxFVkFUSU9OID0gImVsZXZhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRU1QVFlfQ0VMTFMgPSAiZW1wdHktY2VsbHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZMT0FUID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UID0gImZvbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkVfQURKVVNUID0gImZvbnQtc2l6ZS1hZGp1c3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVUVEVSX1NQQUNJTkcgPSAibGV0dGVyLXNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJTkVfSEVJR0hUID0gImxpbmUtaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFID0gImxpc3Qtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfSU1BR0UgPSAibGlzdC1zdHlsZS1pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9QT1NJVElPTiA9ICJsaXN0LXN0eWxlLXBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1RZUEUgPSAibGlzdC1zdHlsZS10eXBlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU4gPSAibWFyZ2luIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fVE9QID0gIm1hcmdpbi10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9SSUdIVCA9ICJtYXJnaW4tcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0xFRlQgPSAibWFyZ2luLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktFUl9PRkZTRVQgPSAibWFya2VyLW9mZnNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS1MgPSAibWFya3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX0hFSUdIVCA9ICJtaW4taGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fV0lEVEggPSAibWluLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PUlBIQU5TID0gIm9ycGhhbnMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkUgPSAib3V0bGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9DT0xPUiA9ICJvdXRsaW5lLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1NUWUxFID0gIm91dGxpbmUtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfV0lEVEggPSAib3V0bGluZS13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1ZFUkZMT1cgPSAib3ZlcmZsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkcgPSAicGFkZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19UT1AgPSAicGFkZGluZy10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfUklHSFQgPSAicGFkZGluZy1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19CT1RUT00gPSAicGFkZGluZy1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfTEVGVCA9ICJwYWRkaW5nLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19BRlRFUiA9ICJwYWdlLWJyZWFrLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0JFRk9SRSA9ICJwYWdlLWJyZWFrLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19JTlNJREUgPSAicGFnZS1icmVhay1pbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFID0gInBhdXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9BRlRFUiA9ICJwYXVzZS1hZnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQkVGT1JFID0gInBhdXNlLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0ggPSAicGl0Y2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIX1JBTkdFID0gInBpdGNoLXJhbmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QTEFZX0RVUklORyA9ICJwbGF5LWR1cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUE9TSVRJT04gPSAicG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1FVT1RFUyA9ICJxdW90ZXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1JJQ0hORVNTID0gInJpY2huZXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU0laRSA9ICJzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBSyA9ICJzcGVhayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfSEVBREVSID0gInNwZWFrLWhlYWRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfTlVNRVJBTCA9ICJzcGVhay1udW1lcmFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19QVU5DVFVBVElPTiA9ICJzcGVhay1wdW5jdHVhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFRUNIX1JBVEUgPSAic3BlZWNoLXJhdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NUUkVTUyA9ICJzdHJlc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RBQkxFX0xBWU9VVCA9ICJ0YWJsZS1sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9ERUNPUkFUSU9OID0gInRleHQtZGVjb3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9JTkRFTlQgPSAidGV4dC1pbmRlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfU0hBRE9XID0gInRleHQtc2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1RSQU5TRk9STSA9ICJ0ZXh0LXRyYW5zZm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVU5JQ09ERV9CSURJID0gInVuaWNvZGUtYmlkaSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVkVSVElDQUxfQUxJR04gPSAidmVydGljYWwtYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1ZJU0lCSUxJVFkgPSAidmlzaWJpbGl0eSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9JQ0VfRkFNSUxZID0gInZvaWNlLWZhbWlseSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9MVU1FID0gInZvbHVtZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0hJVEVfU1BBQ0UgPSAid2hpdGUtc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRE9XUyA9ICJ3aWRvd3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRFRIID0gIndpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XT1JEX1NQQUNJTkcgPSAid29yZC1zcGFjaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9aX0lOREVYID0gInotaW5kZXgiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NTdHJpbmdJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NTdHJpbmdJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjI1MTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTU3RyaW5nSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1N0cmluZ0lEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19BTlkgPSAiYW55IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19DT1VOVEVSX0lERU5USUZJRVIgPSAiY291bnRlci1pZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19GQU1JTFlfTkFNRSA9ICJmYW1pbHktbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfRk9OVF9GQUNFX05BTUUgPSAiZm9udC1mYWNlLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX1BBR0VfSURFTlRJRklFUiA9ICJwYWdlLWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX1NQRUNJRklDX1ZPSUNFID0gInNwZWNpZmljLXZvaWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19VUkFOR0UgPSAidXJhbmdlIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1VuaXRJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTJiNWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NVbml0SUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0NNID0gImNtIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0RFRyA9ICJkZWciOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfRU1TID0gImVtIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0VYUyA9ICJleCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9HUkFEID0gImdyYWQiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSEFTSCA9ICIjIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0haID0gIkh6IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0lOID0gImluIjsvLyROT04tTkxTLTEkCi0JLy8gZmluYWwgc3RhdGljIFN0cmluZyBVX0lOVEVHRVIgPSAiSU5URUdFUiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9LSFogPSAia0h6IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX01NID0gIm1tIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX01TID0gIm1zIjsvLyROT04tTkxTLTEkCi0JLy8gZmluYWwgc3RhdGljIFN0cmluZyBVX05VTUJFUiA9ICJOVU1CRVIiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUEMgPSAicGMiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUEVSQ0VOVEFHRSA9ICIlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BUID0gInB0IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BYID0gInB4IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1JBRCA9ICJyYWQiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUyA9ICJzIjsvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MWE2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ2F0ZWdvcnkgewotCi0JcHVibGljIENTU01NQ2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ0FURUdPUlk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb24oKSB7Ci0JCXJldHVybiBmQ2FwdGlvbjsKLQl9Ci0KLQl2b2lkIHNldENhcHRpb24oU3RyaW5nIGNhcHRpb24pIHsKLQkJZkNhcHRpb24gPSBjYXB0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENhcHRpb24oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDYXB0aW9uKCk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmQ2FwdGlvbiA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DaGFyc2V0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3ZGViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DaGFyc2V0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ2hhcnNldFJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ2hhcnNldFJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1DaGFyc2V0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9DSEFSU0VUX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNGM1ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ29udGFpbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ29udGFpbmVySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUNvbnRhaW5lciB7Ci0KLQotCXB1YmxpYyBDU1NNTUNvbnRhaW5lckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9DT05UQUlORVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX05VTUJFUiB8fCB0eXBlID09IFRZUEVfS0VZV09SRCB8fCB0eXBlID09IFRZUEVfRlVOQ1RJT04gfHwgdHlwZSA9PSBUWVBFX0NPTlRBSU5FUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjZjMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi1jbGFzcyBDU1NNTURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NRGVzY3JpcHRvciB7Ci0KLQotCXB1YmxpYyBDU1NNTURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfTlVNQkVSIHx8IHR5cGUgPT0gVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IFRZUEVfQ09OVEFJTkVSIHx8IHR5cGUgPT0gVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBUWVBFX1NFUEFSQVRPUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NRGVzY3JpcHRvciNnZXRWYWx1ZXMoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRWYWx1ZXMoKSB7Ci0JCVZhbHVlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBWYWx1ZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuYXBwbHkodGhpcyk7Ci0JCXJldHVybiBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Gb250RmFjZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Gb250RmFjZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDU2MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Gb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NRm9udEZhY2VSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUZvbnRGYWNlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUZvbnRGYWNlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9GT05UX0ZBQ0VfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0VHlwZSgpID09IFRZUEVfREVTQ1JJUFRPUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZ1bmN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmIwOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUZ1bmN0aW9uSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUZ1bmN0aW9uIHsKLQotCXB1YmxpYyBDU1NNTUZ1bmN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0ZVTkNUSU9OOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdW5jdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNwb3N0U2V0QXR0cmlidXRlKCkKLQkgKi8KLQkvLyB2b2lkIHBvc3RTZXRBdHRyaWJ1dGUoKSB0aHJvd3MgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gewotCS8vIHN1cGVyLnBvc3RTZXRBdHRyaWJ1dGUoKTsKLQkvLyBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkvLyBpZiAobmFtZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8KLQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX0FUVFIpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9DT1VOVEVSKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfUkdCKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfUkVDVCk7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1VSSSk7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX0ZPUk1BVCk7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX0xPQ0FMKTsKLQkvLwotCS8vIGlmICghIGxpc3QuY29udGFpbnMobmFtZS50b0xvd2VyQ2FzZSgpKSkgewotCS8vIHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOwotCS8vIH0KLQkvLyB9Ci0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldEZ1bmN0aW9uU3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRGdW5jdGlvblN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0RnVuY3Rpb25TdHJpbmcoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyZWE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1JbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NSW1wb3J0UnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUltcG9ydFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfSU1QT1JUX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NS2V5d29yZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUtleXdvcmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjA0MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NS2V5d29yZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NS2V5d29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1LZXl3b3JkSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUtleXdvcmQgewotCi0JcHVibGljIENTU01NS2V5d29yZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9LRVlXT1JEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NS2V5d29yZCNnZXRLZXl3b3JkU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleXdvcmRTdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldEtleXdvcmRTdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldEtleXdvcmRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0S2V5d29yZFN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkZWM3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1NZWRpYVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU1lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1NZWRpYVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NTWVkaWFSdWxlIHsKLQotCi0JcHVibGljIENTU01NTWVkaWFSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX01FRElBX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxNDRkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLWFic3RyYWN0IGNsYXNzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU5vZGUgewotCi0JcHVibGljIENTU01NTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZykgZkF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZE5vZGVzKCkgewotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGZDaGlsZE5vZGVzKS5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCkgewotCQlMaXN0IGRlc2NlbmRhbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpQ2hpbGQgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpQ2hpbGQuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgY2hpbGQgPSAoQ1NTTU1Ob2RlKSBpQ2hpbGQubmV4dCgpOwotCQkJSXRlcmF0b3IgaURlc2NlbmRhbnQgPSBjaGlsZC5nZXREZXNjZW5kYW50cygpOwotCQkJaWYgKGlEZXNjZW5kYW50Lmhhc05leHQoKSkgewotCQkJCXdoaWxlIChpRGVzY2VuZGFudC5oYXNOZXh0KCkpIHsKLQkJCQkJQ1NTTU1Ob2RlIGRlc2NlbmRhbnQgPSAoQ1NTTU1Ob2RlKSBpRGVzY2VuZGFudC5uZXh0KCk7Ci0JCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoZGVzY2VuZGFudCkpIHsKLQkJCQkJCWRlc2NlbmRhbnRzLmFkZChkZXNjZW5kYW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJCWRlc2NlbmRhbnRzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGRlc2NlbmRhbnRzKS5pdGVyYXRvcigpOwotCX0KLQotCXZvaWQgYXBwZW5kQ2hpbGQoQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCWZDaGlsZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICghZkNoaWxkTm9kZXMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQlmQ2hpbGROb2Rlcy5hZGQoY2hpbGQpOwotCQkJKChDU1NNTU5vZGVJbXBsKSBjaGlsZCkuZlJlZkNvdW50Kys7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUNoaWxkKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKGkubmV4dCgpID09IGNoaWxkKSB7Ci0JCQkJaS5yZW1vdmUoKTsKLQkJCQkoKENTU01NTm9kZUltcGwpIGNoaWxkKS5mUmVmQ291bnQtLTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUFsbENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJKChDU1NNTU5vZGVJbXBsKSBpLm5leHQoKSkuZlJlZkNvdW50LS07Ci0JCX0KLQkJZkNoaWxkTm9kZXMuY2xlYXIoKTsKLQl9Ci0KLQlhYnN0cmFjdCBib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZShNYXAgYXR0cmlidXRlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZkF0dHJpYnV0ZXMucHV0QWxsKGF0dHJpYnV0ZXMpOwotCQlwb3N0U2V0QXR0cmlidXRlKCk7Ci0JfQotCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0Jdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCS8vIGRlZmF1bHQgOiBub3AKLQl9Ci0KLQlhYnN0cmFjdCBzaG9ydCBnZXRFcnJvcigpOwotCi0JaW50IGdldENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiAoZkNoaWxkTm9kZXMgIT0gbnVsbCkgPyBmQ2hpbGROb2Rlcy5zaXplKCkgOiAwOwotCX0KLQotCWludCBnZXRSZWZlcmVuY2VDb3VudCgpIHsKLQkJcmV0dXJuIGZSZWZDb3VudDsKLQl9Ci0KLQotCXByaXZhdGUgTGlzdCBmQ2hpbGROb2RlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlZkNvdW50ID0gMDsgLy8gZm9yIGVycm9yIGNoZWNrCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OT1RfQVZBSUxBQkxFID0gIiI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1OdW1iZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1OdW1iZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmE5ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTnVtYmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1OdW1iZXI7Ci0KLWNsYXNzIENTU01NTnVtYmVySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU51bWJlciB7Ci0KLQotCXB1YmxpYyBDU1NNTU51bWJlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9OVU1CRVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXRUeXBlKCkgPT0gVFlQRV9VTklUKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1QYWdlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzkzNTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1QYWdlUnVsZTsKLQotY2xhc3MgQ1NTTU1QYWdlUnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1QYWdlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTVBhZ2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BBR0VfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9QUk9QRVJUWSB8fCB0eXBlID09IFRZUEVfU0VMRUNUT1IpOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTA5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotCi0KLWNsYXNzIENTU01NUHJvcGVydHlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUHJvcGVydHkgewotCXB1YmxpYyBDU1NNTVByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BST1BFUlRZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIgfHwgdHlwZSA9PSBUWVBFX1NUUklORyB8fCB0eXBlID09IFRZUEVfU0VQQVJBVE9SIHx8IHR5cGUgPT0gVFlQRV9QUk9QRVJUWSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NUHJvcGVydHkjZ2V0Q2F0ZWdvcnlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShBVFRSX0NBVEVHT1JZKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0VmFsdWVzKCkgewotCQlWYWx1ZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgVmFsdWVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmFwcGx5KHRoaXMpOwotCQlyZXR1cm4gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0NsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGNhYjlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0NsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotY2xhc3MgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwgZXh0ZW5kcyBDU1NNTVNlbGVjdG9ySW1wbCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVBzZXVkb0NsYXNzSW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFNFVURPX0NMQVNTOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0b3JTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9ICI6IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZTkwNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLXB1YmxpYyBjbGFzcyBDU1NNTVBzZXVkb0VsZW1lbnRJbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9QU0VVRE9fRUxFTUVOVDsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdG9yU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSAiOiIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OGJlNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotY2xhc3MgQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0JcHVibGljIENTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9FWFBSRVNTSU9OOwotCX0KLQotCXZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FESkFDRU5ULnRvTG93ZXJDYXNlKCksICIrIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FUVFJJQlVURS50b0xvd2VyQ2FzZSgpLCAiW10iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fQ0hJTEQudG9Mb3dlckNhc2UoKSwgIj4iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fREVTQ0VOREFOVC50b0xvd2VyQ2FzZSgpLCAiJyAnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX1VOSVZFUlNBTC50b0xvd2VyQ2FzZSgpLCAiKiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlZhbHVlID0gKFN0cmluZykgbWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoZlZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVNlbGVjdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E4MmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVNlbGVjdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TZWxlY3RvcjsKLQotCi1hYnN0cmFjdCBjbGFzcyBDU1NNTVNlbGVjdG9ySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVNlbGVjdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVNlbGVjdG9ySW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1TZWxlY3RvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGUjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TRUxFQ1RPUjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclN0cmluZygpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JTdHJpbmcoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Mzc1OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3RyaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TdHJpbmc7Ci0KLWNsYXNzIENTU01NU3RyaW5nSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0cmluZyB7Ci0KLQotCXB1YmxpYyBDU1NNTVN0cmluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFJJTkc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNwb3N0U2V0QXR0cmlidXRlKCkKLQkgKi8KLQkvLyB2b2lkIHBvc3RTZXRBdHRyaWJ1dGUoKSB0aHJvd3MgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gewotCS8vIHN1cGVyLnBvc3RTZXRBdHRyaWJ1dGUoKTsKLQkvLyBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkvLyBpZiAobmFtZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8KLQkvLyBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfQU5ZLnRvTG93ZXJDYXNlKCksICI8YW55PiIpOyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0NPVU5URVJfSURFTlRJRklFUi50b0xvd2VyQ2FzZSgpLCAiPGNvdW50ZXI+Iik7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19GQU1JTFlfTkFNRS50b0xvd2VyQ2FzZSgpLCAiPGZhbWlseS1uYW1lPiIpOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfRk9OVF9GQUNFX05BTUUudG9Mb3dlckNhc2UoKSwKLQkvLyAiPGZvbnQtZmFjZS1uYW1lPiIpOyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX1BBR0VfSURFTlRJRklFUi50b0xvd2VyQ2FzZSgpLAotCS8vICI8cGFnZS1pZGVudGlmaWVyPiIpOyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX1NQRUNJRklDX1ZPSUNFLnRvTG93ZXJDYXNlKCksCi0JLy8gIjxzcGVjaWZpYy12b2ljZT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19VUkFOR0UudG9Mb3dlckNhc2UoKSwgIjx1cmFuZ2U+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLwotCS8vIGZWYWx1ZSA9IChTdHJpbmcpbWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCS8vIGlmIChmVmFsdWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vIH0KLQkvLwotCS8vIC8qCi0JLy8gKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JLy8gKi8KLQkvLyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCS8vIHJldHVybiBmVmFsdWU7Ci0JLy8gfQotCS8vCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNmNmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TdHlsZVJ1bGU7Ci0KLWNsYXNzIENTU01NU3R5bGVSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0eWxlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTVN0eWxlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFlMRV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gVFlQRV9TRUxFQ1RPUik7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVTaGVldEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlU2hlZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZGU5OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVTaGVldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3R5bGVTaGVldDsKLQotY2xhc3MgQ1NTTU1TdHlsZVNoZWV0SW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0eWxlU2hlZXQgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHlsZVNoZWV0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NUWUxFX1NIRUVUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX0NIQVJTRVRfUlVMRSB8fCB0eXBlID09IFRZUEVfSU1QT1JUX1JVTEUgfHwgdHlwZSA9PSBUWVBFX1BBR0VfUlVMRSB8fCB0eXBlID09IFRZUEVfTUVESUFfUlVMRSB8fCB0eXBlID09IFRZUEVfRk9OVF9GQUNFX1JVTEUgfHwgdHlwZSA9PSBUWVBFX1NUWUxFX1JVTEUpOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Vbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGYzZjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Vbml0OwotCi0vKioKLSAqIENTU01NVW5pdCA6IGVtYmVkZGVkIHR5cGUKLSAqLwotY2xhc3MgQ1NTTU1Vbml0SW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVVuaXQgewotCi0JcHVibGljIENTU01NVW5pdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9VTklUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NVW5pdCNnZXRVbml0U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaXRTdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfQ00udG9Mb3dlckNhc2UoKSwgImNtIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfREVHLnRvTG93ZXJDYXNlKCksICJkZWciKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9FTVMudG9Mb3dlckNhc2UoKSwgImVtIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfRVhTLnRvTG93ZXJDYXNlKCksICJleCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0dSQUQudG9Mb3dlckNhc2UoKSwgImdyYWQiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9IQVNILnRvTG93ZXJDYXNlKCksICIjIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfSFoudG9Mb3dlckNhc2UoKSwgIkh6Iik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfSU4udG9Mb3dlckNhc2UoKSwgImluIik7Ly8kTk9OLU5MUy0xJAotCS8vIC8vIG1hcC5wdXQoQ1NTVW5pdElELlVfSU5URUdFUi50b0xvd2VyQ2FzZSgpLAotCS8vICIoaW50ZWdlcikiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9LSFoudG9Mb3dlckNhc2UoKSwgImtIeiIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX01NLnRvTG93ZXJDYXNlKCksICJtbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX01TLnRvTG93ZXJDYXNlKCksICJtcyIpOy8vJE5PTi1OTFMtMSQKLQkvLyAvLyBtYXAucHV0KENTU1VuaXRJRC5VX05VTUJFUi50b0xvd2VyQ2FzZSgpLCAiKG51bWJlcikiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9QQy50b0xvd2VyQ2FzZSgpLCAicGMiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9QRVJDRU5UQUdFLnRvTG93ZXJDYXNlKCksICIlIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUFQudG9Mb3dlckNhc2UoKSwgInB0Iik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUFgudG9Mb3dlckNhc2UoKSwgInB4Iik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUkFELnRvTG93ZXJDYXNlKCksICJyYWQiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9TLnRvTG93ZXJDYXNlKCksICJzIik7Ly8kTk9OLU5MUy0xJAotCS8vIGZWYWx1ZSA9IChTdHJpbmcpbWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCS8vIGlmIChmVmFsdWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vIH0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VW5pdFN0cmluZygpOwotCX0KLQotCXZvaWQgc2V0VW5pdFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gdmFsdWU7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRVbml0U3RyaW5nKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTcyNWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLQotCi1jbGFzcyBDU1NNZXRhTW9kZWxJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JLy8gY2xhc3MgQ1NTTWV0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JcHVibGljIENTU01ldGFNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlUG9vbCA9IG5ldyBOb2RlUG9vbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTUVUQV9NT0RFTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9TVFlMRV9TSEVFVCB8fCB0eXBlID09IFRZUEVfQ0FURUdPUlkpOwotCX0KLQotCXB1YmxpYyBDU1NNTVN0eWxlU2hlZXQgZ2V0U3R5bGVTaGVldCgpIHsKLQkJSXRlcmF0b3IgaSA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFRZUEVfU1RZTEVfU0hFRVQpIHsKLQkJCQlyZXR1cm4gKENTU01NU3R5bGVTaGVldCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJLy8gcmV0dXJuIGZTdHlsZVNoZWV0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDYXRlZ29yaWVzKCkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBUWVBFX0NBVEVHT1JZKSB7Ci0JCQkJY2F0ZWdvcmllcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIGxvYWRDb21wbGV0ZWQoKSB7Ci0JCWZOb2RlUG9vbCA9IG51bGw7Ci0JfQotCi0JLy8gTGlzdCBmQ2F0ZWdvcmllcyA9IG51bGw7Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjaXNWYWxpZCgpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRTdHlsZVNoZWV0KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQlOb2RlUG9vbCBnZXROb2RlUG9vbCgpIHsKLQkJcmV0dXJuIGZOb2RlUG9vbDsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmRmNTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0KLWNsYXNzIENTU1Byb2ZpbGVJbXBsIGltcGxlbWVudHMgQ1NTUHJvZmlsZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm9JbXBsLgotCSAqLwotCXByaXZhdGUgQ1NTUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJvZmlsZUltcGwoU3RyaW5nIGlkLCBVUkwgdXJsKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJRCA9IGlkOwotCQlmVVJMID0gdXJsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxQcm9maWxlSW5mb0ltcGwuCi0JICovCi0JQ1NTUHJvZmlsZUltcGwoU3RyaW5nIGlkLCBVUkwgdXJsLCBTdHJpbmcgcmVsYXRpdmVVUkkpIHsKLQkJc3VwZXIoKTsKLQkJZklEID0gaWQ7Ci0JCWZVUkwgPSB1cmw7Ci0JCWZSZWxhdGl2ZVVSSSA9IHJlbGF0aXZlVVJJOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZUlEKCkgewotCQlyZXR1cm4gZklEOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuIChmTmFtZSA9PSBudWxsKSA/IGZJRCA6IGZOYW1lOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlpZiAoZk1ldGFNb2RlbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gZ2V0UHJvZmlsZVVSTCgpLm9wZW5TdHJlYW0oKTsKLQkJCQlQcm9maWxlTG9hZGVyIGxvYWRlciA9IG5ldyBQcm9maWxlTG9hZGVyKGdldFJlc291cmNlQnVuZGxlKCksIGdldExvZ2dpbmcoKSk7Ci0JCQkJZk1ldGFNb2RlbCA9IGxvYWRlci5sb2FkUHJvZmlsZShpbnB1dCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0cmVhbSBmb3IgcHJvZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0JCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQlTdHJpbmcgcGx1Z2luSUQgPSBnZXRPd25lclBsdWdpbklEKCk7Ci0JCWlmIChwbHVnaW5JRCAhPSBudWxsKSB7Ci0JCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJLy8gbmVlZGVkIHRvIHdvcmsgYXJvdW5kIEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0gbm90IGxvb2tpbmcgZm9yCi0JCQkJLy8gZmlsZXMgd2l0aCBKYXZhIG5hbWluZyBjb252ZW50aW9ucyAoQlVHMTAzMzQ1KQotCQkJCUlQYXRoW10gcGF0aHMgPSBnZXRSZXNvdXJjZUJ1bmRsZVBhdGhzKCk7Ci0JCQkJaWYgKHBhdGhzICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCXdoaWxlIChpIDwgcGF0aHMubGVuZ3RoICYmIGluU3RyZWFtID09IG51bGwpIHsKLQkJCQkJCUlQYXRoIHBhdGggPSBwYXRoc1tpXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5TdHJlYW0gPSBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKGJ1bmRsZSwgcGF0aCwgdHJ1ZSk7Ci0JCQkJCQkJaWYgKGluU3RyZWFtICE9IG51bGwpCi0JCQkJCQkJCXJlc291cmNlQnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoaW5TdHJlYW0pOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJKytpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB1bmFibGUgdG8gb3BlbiBzdHJlYW0gd2l0aCBjdXJyZW50IHBhdGggc28ganVzdAotCQkJCQkJCS8vIHRyeSBuZXh0IHBhdGgKLQkJCQkJCQkrK2k7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBvdGVudGlhbCByZXNvdXJjZSBidW5kbGUgcGF0aHMgb3IgbnVsbCBpZiB0aGVyZQotCSAqIGFyZSBub25lCi0JICogCi0JICogQHJldHVybiBJUGF0aFtdIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIElQYXRoW10gZ2V0UmVzb3VyY2VCdW5kbGVQYXRocygpIHsKLQkJSVBhdGhbXSBwYXRocyA9IG5ldyBJUGF0aFswXTsKLQotCQlpZiAoZlJlbGF0aXZlVVJJICE9IG51bGwpIHsKLQkJCS8vIG9yaWdpbmFsIHBhdGggPSBsb2NhdGlvbiBvZiBwcm9maWxlLnhtbCAtIHByb2ZpbGUueG1sCi0JCQlJUGF0aCBvcmlnaW5hbFBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhmUmVsYXRpdmVVUkkpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQotCQkJU3RyaW5nIGJhc2VOYW1lID0gImNzc3Byb2ZpbGUiOyAvLyROT04tTkxTLTEkIAotCQkJVmVjdG9yIG5hbWVzID0gY2FsY3VsYXRlQnVuZGxlTmFtZXMoYmFzZU5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0JCQlpbnQgYSA9IDA7Ci0JCQlwYXRocyA9IG5ldyBJUGF0aFtuYW1lcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IG5hbWVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotCQkJCVN0cmluZyBidW5kbGVOYW1lID0gKFN0cmluZykgbmFtZXMuZ2V0KGkgLSAxKTsKLQkJCQlJUGF0aCBwYXRoID0gb3JpZ2luYWxQYXRoLmFwcGVuZChidW5kbGVOYW1lKS5hZGRGaWxlRXh0ZW5zaW9uKCJwcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoc1thXSA9IHBhdGg7Ci0JCQkJKythOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGJ1bmRsZXMgYWxvbmcgdGhlIHNlYXJjaCBwYXRoIGZyb20gdGhlIGJhc2UgYnVuZGxlIHRvIHRoZQotCSAqIGJ1bmRsZSBzcGVjaWZpZWQgYnkgYmFzZU5hbWUgYW5kIGxvY2FsZS48YnIgLz4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIGJ1bmRsZSBuYW1lCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgdGhlIGxvY2FsZQotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgdGhlIHZlY3RvciB1c2VkIHRvIHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGJ1bmRsZXMgYWxvbmcgdGhlCi0JICogICAgICAgICAgICBzZWFyY2ggcGF0aC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFZlY3RvciBjYWxjdWxhdGVCdW5kbGVOYW1lcyhTdHJpbmcgYmFzZU5hbWUsIExvY2FsZSBsb2NhbGUpIHsKLQkgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGRlbGV0ZWQgYWZ0ZXIgQlVHMTAzMzQ1IGlzIGZpeGVkCi0JCWZpbmFsIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKDQpOyAvLyBkZWZhdWx0IHNpemUgNAotCQlmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJZmluYWwgaW50IGxhbmd1YWdlTGVuZ3RoID0gbGFuZ3VhZ2UubGVuZ3RoKCk7Ci0JCWZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLQkJZmluYWwgaW50IGNvdW50cnlMZW5ndGggPSBjb3VudHJ5Lmxlbmd0aCgpOwotCQlmaW5hbCBTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0JCWZpbmFsIGludCB2YXJpYW50TGVuZ3RoID0gdmFyaWFudC5sZW5ndGgoKTsKLQotCQlyZXN1bHQuYWRkRWxlbWVudChiYXNlTmFtZSk7IC8vIGF0IGxlYXN0IGFkZCBiYXNlIG5hbWUKLQkJaWYgKGxhbmd1YWdlTGVuZ3RoICsgY291bnRyeUxlbmd0aCArIHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJLy8gVGhlIGxvY2FsZSBpcyAiIiwgIiIsICIiLgotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmaW5hbCBTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZU5hbWUpOwotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZChsYW5ndWFnZSk7Ci0JCWlmIChsYW5ndWFnZUxlbmd0aCA+IDApIHsKLQkJCXJlc3VsdC5hZGRFbGVtZW50KHRlbXAudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAoY291bnRyeUxlbmd0aCArIHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZChjb3VudHJ5KTsKLQkJaWYgKGNvdW50cnlMZW5ndGggPiAwKSB7Ci0JCQlyZXN1bHQuYWRkRWxlbWVudCh0ZW1wLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZCh2YXJpYW50KTsKLQkJcmVzdWx0LmFkZEVsZW1lbnQodGVtcC50b1N0cmluZygpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlVVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFByb2ZpbGVVUkwoKSB7Ci0JCXJldHVybiBmVVJMOwotCX0KLQotCXZvaWQgc2V0UHJvZmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0OwotCX0KLQotCXZvaWQgc2V0RGVmYXVsdChib29sZWFuIGlzRGVmYXVsdCkgewotCQlmRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE93bmVyUGx1Z2luSUQoKSB7Ci0JCXJldHVybiBmT3duZXJQbHVnaW5JRDsKLQl9Ci0KLQl2b2lkIHNldE93bmVyUGx1Z2luSUQoU3RyaW5nIHBsdWdpbklEKSB7Ci0JCWZPd25lclBsdWdpbklEID0gcGx1Z2luSUQ7Ci0JfQotCi0JLyoqCi0JICogaGlkZGVuIG9wdGlvbiA6IGxvZ2dpbmcKLQkgKi8KLQl2b2lkIHNldExvZ2dpbmcoYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCWZMb2dnaW5nID0gbG9nZ2luZzsKLQl9Ci0KLQlib29sZWFuIGdldExvZ2dpbmcoKSB7Ci0JCXJldHVybiBmTG9nZ2luZzsKLQl9Ci0KLQotCVN0cmluZyBmSUQgPSBudWxsOwotCVN0cmluZyBmTmFtZSA9IG51bGw7Ci0JVVJMIGZVUkwgPSBudWxsOwotCUNTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlTdHJpbmcgZk93bmVyUGx1Z2luSUQgPSBudWxsOwotCWJvb2xlYW4gZkRlZmF1bHQgPSBmYWxzZTsKLQlib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZlJlbGF0aXZlVVJJID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzExNTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLQotCi1jbGFzcyBDU1NQcm9maWxlVGVzdCB7Ci0KLQotCS8qKgotCSAqIFRlc3QgdXNlIG9ubHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlDU1NNZXRhTW9kZWwgbWV0YW1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IG5ldyBDU1NQcm9maWxlSW1wbCgidGVzdCIsIG5ldyBVUkwoYXJnc1swXSkpOyAvLyROT04tTkxTLTEkCi0JCQltZXRhbW9kZWwgPSBwcm9maWxlLmdldE1ldGFNb2RlbCgpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAobWV0YW1vZGVsID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvKgotCQkgKiBDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQkgKiBjb2xsZWN0b3IuYXBwbHkobWV0YW1vZGVsLCBDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSk7IEl0ZXJhdG9yCi0JCSAqIGlQcm9wZXJ0eSA9IGNvbGxlY3Rvci5nZXROb2RlcygpOyB3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkgKiBDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpaVByb3BlcnR5Lm5leHQoKTsKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXJ0eSAiICsgbm9kZS5nZXROYW1lKCkgKyAiIGNhbiBjb250YWluOiIpOwotCQkgKiAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgSXRlcmF0b3IgaVZhbHVlID0KLQkJICogbm9kZS5nZXREZXNjZW5kYW50cygpOyB3aGlsZSAoaVZhbHVlLmhhc05leHQoKSkgewotCQkgKiBkZWJ1Z091dCgoQ1NTTU1Ob2RlKWlWYWx1ZS5uZXh0KCksIDAsIGZhbHNlKTsgfSB9Ci0JCSAqLwotCQlkZWJ1Z091dChtZXRhbW9kZWwsIDAsIHRydWUpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRlYnVnT3V0KENTU01NTm9kZSBub2RlLCBpbnQgZGVwdGgsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCVN0cmluZyB0eXBlID0gbm9kZS5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnQoIlsgIiArIG5vZGUuZ2V0TmFtZSgpICsgIigiICsgdHlwZSArICIpIF0iKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJaWYgKHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfVU5JVCB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgLT4gIiArIG5vZGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQlpZiAocmVjdXJzaXZlKSB7Ci0JCQlqYXZhLnV0aWwuSXRlcmF0b3IgaU5vZGUgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCXdoaWxlIChpTm9kZS5oYXNOZXh0KCkpIHsKLQkJCQlkZWJ1Z091dCgoQ1NTTU1Ob2RlKSBpTm9kZS5uZXh0KCksIGRlcHRoICsgMSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjhjNThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9NZXRhTW9kZWxFcnJvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWludGVyZmFjZSBNZXRhTW9kZWxFcnJvcnMgewotCi0Jc3RhdGljIGZpbmFsIHNob3J0IE5PX0VSUk9SID0gMDsKLQotCS8vIE1BU0sKLQlzdGF0aWMgZmluYWwgc2hvcnQgTUFTS19XQVJOSU5HID0gMHgxMDAwOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBNQVNLX0VSUk9SID0gMHgyMDAwOwotCi0JLy8gRVJST1IKLQlzdGF0aWMgZmluYWwgc2hvcnQgRVJST1JfTk9UX0RFRklORUQgPSBNQVNLX0VSUk9SICsgMHgwMTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgRVJST1JfSU5WQUxJRF9OQU1FID0gTUFTS19FUlJPUiArIDB4MDQ7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX0lOVkFJTERfQ0hJTEQgPSBNQVNLX0VSUk9SICsgMHgwMjsKLQlzdGF0aWMgZmluYWwgc2hvcnQgRVJST1JfTk9fQ0hJTEQgPSBNQVNLX0VSUk9SICsgMHgwODsKLQkvLyBzdGF0aWMgZmluYWwgc2hvcnQgRVJST1JfTk9fRVNTRU5USUFMX0NISUxEID0gTUFTS19FUlJPUiArIDB4MTAKLQotCS8vIFdBUk5JTkcKLQlzdGF0aWMgZmluYWwgc2hvcnQgV0FSTklOR19IQVNfTk9fQ0hJTEQgPSBNQVNLX1dBUk5JTkcgKyAweDAxOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL05vZGVQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWRkMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL05vZGVQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotY2xhc3MgTm9kZVBvb2wgewotCi0JTm9kZVBvb2woKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemVDbGFzc05hbWVUYWJsZSgpOwotCX0KLQotCUNTU01NTm9kZUltcGwgZ2V0Tm9kZShTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWlmIChub2RlTmFtZSAhPSBudWxsKSB7Ci0JCQlub2RlTmFtZSA9IG5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzTmFtZXMuZ2V0KHRhZ05hbWUpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU1hcCBub2RlcyA9IChNYXApIG5vZGVSZWdpc3RyeS5nZXQoY2xhc3NOYW1lKTsKLQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCW5vZGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCW5vZGVSZWdpc3RyeS5wdXQoY2xhc3NOYW1lLCBub2Rlcyk7Ci0JCX0KLQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gKENTU01NTm9kZUltcGwpIG5vZGVzLmdldChub2RlTmFtZSk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCW5vZGUgPSBjcmVhdGVOZXdOb2RlKGNsYXNzTmFtZSk7Ci0JCQlub2Rlcy5wdXQobm9kZU5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgQ1NTTU1Ob2RlSW1wbCBjcmVhdGVOZXdOb2RlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gbnVsbDsKLQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQljbGFzc05hbWUgPSBnZXRQYWNrYWdlTmFtZSgpICsgIi4iICsgY2xhc3NOYW1lOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCW5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSArICIgaXMgQ3JlYXRlZCIpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBFcnJvciBjaGVjayBmdW5jdGlvbjogZmluZCBub2RlcyB0aGF0IGFyZSBub3QgcmVmZXJyZWQgYnkgYW55IG5vZGUKLQkgKi8KLQlJdGVyYXRvciBnZXRTdHJheU5vZGVzKCkgewotCQlMaXN0IHN0cmF5Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlNYXAgPSBub2RlUmVnaXN0cnkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlNYXAuaGFzTmV4dCgpKSB7Ci0JCQlNYXAgbm9kZXMgPSAoTWFwKSBpTWFwLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGlOb2RlID0gbm9kZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpTm9kZS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgaU5vZGUubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFJlZmVyZW5jZUNvdW50KCkgPT0gMCkgewotCQkJCQlzdHJheU5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cmF5Tm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvLyBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGlubmVyIGNsYXNzIDopCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCWlmIChmUGFja2FnZU5hbWUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJaW50IHBvcyA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKDAgPCBwb3MpIHsKLQkJCQlmUGFja2FnZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmUGFja2FnZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmUGFja2FnZU5hbWU7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplQ2xhc3NOYW1lVGFibGUoKSB7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRVNIRUVUX0RFRiwgQ0xBU1NfU1RZTEVfU0hFRVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0hBUlNFVF9SVUxFX0RFRiwgQ0xBU1NfQ0hBUlNFVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRSwgQ0xBU1NfQ0hBUlNFVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZPTlRGQUNFX1JVTEVfREVGLCBDTEFTU19GT05UX0ZBQ0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFLCBDTEFTU19GT05UX0ZBQ0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRV9ERUYsIENMQVNTX0lNUE9SVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLklNUE9SVF9SVUxFLCBDTEFTU19JTVBPUlRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5NRURJQV9SVUxFX0RFRiwgQ0xBU1NfTUVESUFfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5NRURJQV9SVUxFLCBDTEFTU19NRURJQV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBBR0VfUlVMRV9ERUYsIENMQVNTX1BBR0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEUsIENMQVNTX1BBR0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFX0RFRiwgQ0xBU1NfU1RZTEVfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFLCBDTEFTU19TVFlMRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZX0RFRiwgQ0xBU1NfUFJPUEVSVFkpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFJPUEVSVFksIENMQVNTX1BST1BFUlRZKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1JfREVGLCBDTEFTU19ERVNDUklQVE9SKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1IsIENMQVNTX0RFU0NSSVBUT1IpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSX0RFRiwgQ0xBU1NfQ09OVEFJTkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNPTlRBSU5FUiwgQ0xBU1NfQ09OVEFJTkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk5VTUJFUl9ERUYsIENMQVNTX05VTUJFUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVIsIENMQVNTX05VTUJFUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5LRVlXT1JEX0RFRiwgQ0xBU1NfS0VZV09SRCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5LRVlXT1JELCBDTEFTU19LRVlXT1JEKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlVOSVQsIENMQVNTX1VOSVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuVU5JVF9ERUYsIENMQVNTX1VOSVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRlVOQ1RJT04sIENMQVNTX0ZVTkNUSU9OKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OX0RFRiwgQ0xBU1NfRlVOQ1RJT04pOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU0VMRUNUT1JfRVhQUkVTU0lPTiwgQ0xBU1NfU0VMRUNUT1JfRVhQUkVTU0lPTik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fRUxFTUVOVCwgQ0xBU1NfUFNFVURPX0VMRU1FTlQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlRfREVGLCBDTEFTU19QU0VVRE9fRUxFTUVOVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1MsIENMQVNTX1BTRVVET19DTEFTUyk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1NfREVGLCBDTEFTU19QU0VVRE9fQ0xBU1MpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RSSU5HLCBDTEFTU19TVFJJTkcpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0FURUdPUllfREVGLCBDTEFTU19DQVRFR09SWSk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmUGFja2FnZU5hbWU7Ci0JLyoKLQkgKiBDb252ZXJzaW9uIFRhYmxlcyBub2RlUmVnaXN0cnkgOiBjbGFzcyBuYW1lIC0+IGhhc2ggb2Ygbm9kZSBpbnN0YW5jZXMKLQkgKiBjbGFzc05hbWVzIDogUHJvZmlsZSBUYWcgbmFtZSAtPiBqYXZhIGNsYXNzIG5hbWUKLQkgKi8KLQlwcml2YXRlIE1hcCBub2RlUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGNsYXNzTmFtZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NUWUxFX1NIRUVUID0gIkNTU01NU3R5bGVTaGVldEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0NIQVJTRVRfUlVMRSA9ICJDU1NNTUNoYXJzZXRSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRk9OVF9GQUNFX1JVTEUgPSAiQ1NTTU1Gb250RmFjZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19JTVBPUlRfUlVMRSA9ICJDU1NNTUltcG9ydFJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19NRURJQV9SVUxFID0gIkNTU01NTWVkaWFSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUEFHRV9SVUxFID0gIkNTU01NUGFnZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFlMRV9SVUxFID0gIkNTU01NU3R5bGVSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFJPUEVSVFkgPSAiQ1NTTU1Qcm9wZXJ0eUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0RFU0NSSVBUT1IgPSAiQ1NTTU1EZXNjcmlwdG9ySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ09OVEFJTkVSID0gIkNTU01NQ29udGFpbmVySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTlVNQkVSID0gIkNTU01NTnVtYmVySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfS0VZV09SRCA9ICJDU1NNTUtleXdvcmRJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19VTklUID0gIkNTU01NVW5pdEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0ZVTkNUSU9OID0gIkNTU01NRnVuY3Rpb25JbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFJJTkcgPSAiQ1NTTU1TdHJpbmdJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DQVRFR09SWSA9ICJDU1NNTUNhdGVnb3J5SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU0VMRUNUT1JfRVhQUkVTU0lPTiA9ICJDU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BTRVVET19DTEFTUyA9ICJDU1NNTVBzZXVkb0NsYXNzSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFNFVURPX0VMRU1FTlQgPSAiQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmI5MGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLQotY2xhc3MgUHJvZmlsZUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQlwdWJsaWMgUHJvZmlsZUhhbmRsZXIoQ1NTTWV0YU1vZGVsSW1wbCBtZXRhbW9kZWwsIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBib29sZWFuIGxvZ2dpbmcpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQkJZk5vZGVQb29sID0gbWV0YW1vZGVsLmdldE5vZGVQb29sKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGxvZ2dpbmc7Ci0JfQotCi0JcHVibGljIFByb2ZpbGVIYW5kbGVyKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSkgewotCQlzdXBlcigpOwotCQlmTWV0YU1vZGVsID0gbWV0YW1vZGVsOwotCQlmTm9kZVBvb2wgPSBtZXRhbW9kZWwuZ2V0Tm9kZVBvb2woKTsKLQkJZlJlc291cmNlQnVuZGxlID0gcmVzb3VyY2VCdW5kbGU7Ci0JCWZMb2dnaW5nID0gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQkJaWYgKCFrZXkuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQkJaWYgKGtleS5zdGFydHNXaXRoKCIlJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXkuc3Vic3RyaW5nKDEpOwotCQl9Ci0KLQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnREb2N1bWVudCIpOwotCQkvLyBmTm9kZVN0YWNrLnB1c2gobWV0YW1vZGVsKTsKLQkJLy8gZkN1cnJlbnROb2RlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQluZXcgRXJyb3JDb3JyZWN0b3IoKS5kb0NvcnJlY3QoZk1ldGFNb2RlbCk7Ci0JCWlmIChmTG9nZ2luZykgewotCQkJSXRlcmF0b3IgaSA9IGZOb2RlUG9vbC5nZXRTdHJheU5vZGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJCVN0cmluZyBzdHIgPSAiW0NTU1Byb2ZpbGUgV2FybmluZ10gIiArIG5vZGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RyICs9ICIoIiArIG5vZGUuZ2V0VHlwZSgpICsgIikgaXMgbm90IHJlZmVycmVkIGJ5IGFueSBub2RlLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsIHN0cik7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlUYWdOb2RlIHRhZ05vZGUgPSBudWxsOwotCQlDU1NNTU5vZGVJbXBsIHBhcmVudE5vZGUgPSBudWxsOwotCQlpZiAoMCA8IGZOb2RlU3RhY2suc2l6ZSgpKSB7Ci0JCQl0YWdOb2RlID0gKFRhZ05vZGUpIGZOb2RlU3RhY2sucGVlaygpOwotCQkJcGFyZW50Tm9kZSA9IHRhZ05vZGUubm9kZTsKLQkJfQotCi0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCWlmIChxTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBST0ZJTEVfSU1QT1JUKSkgeyAvLyBpbXBvcnQKLQkJCVN0cmluZyBwcm9maWxlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX1JFRkVSRU5DRSk7Ci0JCQlpbXBvcnRQcm9maWxlKHByb2ZpbGVOYW1lKTsKLQkJfQotCQllbHNlIGlmIChpc0RlZmluaXRpb24ocU5hbWUpKSB7IC8vIG5vZGUgY3JlYXRpb24KLQkJCVN0cmluZyBub2RlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX0RFRklOSVRJT04pOwotCQkJbm9kZSA9IGZOb2RlUG9vbC5nZXROb2RlKHFOYW1lLCBub2RlTmFtZSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG92ZXJ3cml0ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9PVkVSV1JJVEUpOwotCQkJCWlmIChvdmVyd3JpdGUgPT0gbnVsbCB8fCBvdmVyd3JpdGUuZXF1YWxzKEFUVFJfVkFMVUVfT1ZFUldSSVRFX0ZBTFNFKSkgewotCQkJCQlub2RlLnJlbW92ZUFsbENoaWxkTm9kZXMoKTsKLQkJCQl9Ci0JCQkJTWFwIGF0dHJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWF0dHJNYXAucHV0KGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSksIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlub2RlLmluaXRpYWxpemVBdHRyaWJ1dGUoYXR0ck1hcCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlID09IG51bGwpIHsgLy8gbm9kZSByZWZlcmVuY2UKLQkJCVN0cmluZyBub2RlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX1JFRkVSRU5DRSk7Ci0JCQlub2RlID0gZk5vZGVQb29sLmdldE5vZGUocU5hbWUsIG5vZGVOYW1lKTsKLQkJfQotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5jYW5Db250YWluKG5vZGUpKSB7Ci0JCQkJU3RyaW5nIGVuYWJsZWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfRU5BQkxFRCk7Ci0JCQkJaWYgKGVuYWJsZWQgIT0gbnVsbCAmJiBlbmFibGVkLmVxdWFscyhBVFRSX1ZBTFVFX0VOQUJMRURfRkFMU0UpKSB7Ci0JCQkJCXBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NUWUxFX1NIRUVUIHx8IG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0NBVEVHT1JZKSB7Ci0JCQkJZk1ldGFNb2RlbC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmTG9nZ2luZyAmJiBwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIHBhcmVudE5vZGUuZ2V0VHlwZSgpICsgIiBjYW5ub3QgY29udGFpbiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlub2RlLmdldFR5cGUoKSArICIgKCIgKyBxTmFtZSArICIpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZk5vZGVTdGFjay5wdXNoKG5ldyBUYWdOb2RlKHFOYW1lLCAobm9kZSAhPSBudWxsKSA/IG5vZGUgOiBwYXJlbnROb2RlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlmTm9kZVN0YWNrLnBvcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlUYWdOb2RlIHRhZ05vZGUgPSAoVGFnTm9kZSkgZk5vZGVTdGFjay5wZWVrKCk7Ci0JCVN0cmluZyB0YWdOYW1lID0gdGFnTm9kZS50YWc7Ci0JCWlmICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX1ZBTFVFKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRJT04pIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DQVBUSU9OKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWYuYXBwZW5kKGNoW3N0YXJ0ICsgaV0pOwotCQkJfQotCQkJU3RyaW5nIHZhbHVlID0gZ2V0UmVzb3VyY2VTdHJpbmcoYnVmLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCUNTU01NTm9kZUltcGwgbm9kZSA9IHRhZ05vZGUubm9kZTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfS0VZV09SRCAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTUtleXdvcmRJbXBsKSBub2RlKS5zZXRLZXl3b3JkU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfVU5JVCAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuVU5JVF9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTVVuaXRJbXBsKSBub2RlKS5zZXRVbml0U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04gJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OX1ZBTFVFKSkgewotCQkJCQkoKENTU01NRnVuY3Rpb25JbXBsKSBub2RlKS5zZXRGdW5jdGlvblN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SICYmICgoQ1NTTU1TZWxlY3Rvcikgbm9kZSkuZ2V0U2VsZWN0b3JUeXBlKCkgPT0gQ1NTTU1TZWxlY3Rvci5UWVBFX1BTRVVET19FTEVNRU5UKSB7Ci0JCQkJCSgoQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCkgbm9kZSkuc2V0U2VsZWN0b3JTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUiAmJiAoKENTU01NU2VsZWN0b3IpIG5vZGUpLmdldFNlbGVjdG9yVHlwZSgpID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fQ0xBU1MpIHsKLQkJCQkJKChDU1NNTVBzZXVkb0NsYXNzSW1wbCkgbm9kZSkuc2V0U2VsZWN0b3JTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9DQVRFR09SWSAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FQVElPTikpIHsKLQkJCQkJKChDU1NNTUNhdGVnb3J5SW1wbCkgbm9kZSkuc2V0Q2FwdGlvbih2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5ERVNDUklQVElPTikpIHsKLQkJCQkJbm9kZS5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmaW5pdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gKHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFlMRVNIRUVUX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuTUVESUFfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNUWUxFX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVJfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFJPUEVSVFlfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRPUl9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DT05UQUlORVJfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuVU5JVF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFJJTkcpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DQVRFR09SWV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1NfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU0VMRUNUT1JfRVhQUkVTU0lPTikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFUEFSQVRPUikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRQcm9maWxlKFN0cmluZyBwcm9maWxlTmFtZSkgewotCQlVUkwgcHJvZmlsZVVSTCA9IG51bGw7Ci0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gcmVnLmdldFByb2ZpbGUocHJvZmlsZU5hbWUpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBmaXJzdDogZmluZCBVUkwgYnkgSUQKLQkJCXByb2ZpbGVVUkwgPSBwcm9maWxlLmdldFByb2ZpbGVVUkwoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlY29uZDogZmluZCBVUkwgYnkgZmlsZW5hbWUgb2YgcHJvZmlsZSBVUkwKLQkJCUl0ZXJhdG9yIGkgPSByZWcuZ2V0UHJvZmlsZXMoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCXByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQkJVVJMIHVybCA9IHByb2ZpbGUuZ2V0UHJvZmlsZVVSTCgpOwotCQkJCWlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKHByb2ZpbGVOYW1lKSkgewotCQkJCQlwcm9maWxlVVJMID0gdXJsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2ZpbGVVUkwgPT0gbnVsbCkgewotCQkJLy8gZmluYWw6IGl0IG1heSBiZSB1cmwgaXRzZWxmCi0JCQl0cnkgewotCQkJCXByb2ZpbGVVUkwgPSBuZXcgVVJMKHByb2ZpbGVOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2ZpbGVVUkwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlQcm9maWxlTG9hZGVyLmxvYWRQcm9maWxlKGZNZXRhTW9kZWwsIHByb2ZpbGVVUkwub3BlblN0cmVhbSgpLCBmUmVzb3VyY2VCdW5kbGUsIGZMb2dnaW5nKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ2Fubm90IG9wZW4gc3RyZWFtIGZvciBwcm9maWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVGFnTm9kZSB7Ci0KLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0KLQkJVGFnTm9kZShTdHJpbmcgdGFnLCBDU1NNTU5vZGVJbXBsIG5vZGUpIHsKLQkJCXRoaXMudGFnID0gdGFnOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJfQotCX0KLQotCWNsYXNzIEVycm9yQ29ycmVjdG9yIHsKLQotCQl2b2lkIGRvQ29ycmVjdChDU1NNTU5vZGVJbXBsIG5vZGUpIHsKLQkJCUl0ZXJhdG9yIGkgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCUFycmF5TGlzdCBlcnJvck5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlSW1wbCBjaGlsZCA9IChDU1NNTU5vZGVJbXBsKSBpLm5leHQoKTsKLQkJCQlkb0NvcnJlY3QoY2hpbGQpOwotCQkJCXNob3J0IGVycm9yID0gY2hpbGQuZ2V0RXJyb3IoKTsKLQkJCQlpZiAoZXJyb3IgIT0gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SKSB7Ci0JCQkJCS8vIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQllcnJvck5vZGVzLmFkZChjaGlsZCk7Ci0KLQkJCQkJU3RyaW5nIHN0ciA9ICJbQ1NTUHJvZmlsZSBFcnJvcl0gIiArIG5vZGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGNvbnRhaW5zIGVycm9yIG5vZGU6ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlzdHIgKz0gY2hpbGQuZ2V0TmFtZSgpICsgIigiICsgY2hpbGQuZ2V0VHlwZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3RyICs9ICIgLSBlcnJvciBjb2RlID0gIiArIGVycm9yOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChmTG9nZ2luZykgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIHN0cik7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBlcnJvclNpemUgPSBlcnJvck5vZGVzLnNpemUoKTsKLQkJCWlmIChlcnJvclNpemUgPiAwKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlcnJvclNpemU7IGorKykgewotCQkJCQlDU1NNTU5vZGVJbXBsIGVycm9yTm9kZSA9IChDU1NNTU5vZGVJbXBsKSBlcnJvck5vZGVzLmdldChqKTsKLQkJCQkJbm9kZS5yZW1vdmVDaGlsZChlcnJvck5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBDU1NNZXRhTW9kZWxJbXBsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLQlwcml2YXRlIFN0YWNrIGZOb2RlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQlib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTkFNRV9ERUZJTklUSU9OID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTkFNRV9SRUZFUkVOQ0UgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9PVkVSV1JJVEUgPSAib3ZlcndyaXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9WQUxVRV9PVkVSV1JJVEVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVkFMVUVfRU5BQkxFRF9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ODMxNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVLZXl3b3Jkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW50ZXJmYWNlIFByb2ZpbGVLZXl3b3JkcyB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19QUk9GSUxFID0gImNzcy1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPRklMRV9JTVBPUlQgPSAicHJvZmlsZS1pbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRVNIRUVUX0RFRiA9ICJzdHlsZXNoZWV0LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENIQVJTRVRfUlVMRSA9ICJjaGFyc2V0LXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBJTVBPUlRfUlVMRSA9ICJpbXBvcnQtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfUlVMRSA9ICJwYWdlLXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNRURJQV9SVUxFID0gIm1lZGlhLXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGT05URkFDRV9SVUxFID0gImZvbnRmYWNlLXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9SVUxFID0gInN0eWxlLXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDSEFSU0VUX1JVTEVfREVGID0gImNoYXJzZXQtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBJTVBPUlRfUlVMRV9ERUYgPSAiaW1wb3J0LXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9SVUxFX0RFRiA9ICJwYWdlLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTUVESUFfUlVMRV9ERUYgPSAibWVkaWEtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGT05URkFDRV9SVUxFX0RFRiA9ICJmb250ZmFjZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX1JVTEVfREVGID0gInN0eWxlLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRlVOQ1RJT05fREVGID0gImZ1bmN0aW9uLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZVTkNUSU9OX1ZBTFVFID0gImZ1bmN0aW9uLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRF9ERUYgPSAia2V5d29yZC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLRVlXT1JEX1ZBTFVFID0gImtleXdvcmQtdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTUJFUl9ERUYgPSAibnVtYmVyLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSVQgPSAidW5pdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSVRfREVGID0gInVuaXQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVU5JVF9WQUxVRSA9ICJ1bml0LXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX0RFRiA9ICJjb250YWluZXItZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfREVGID0gImNhdGVnb3J5LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENBUFRJT04gPSAiY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX0RFRiA9ICJwcm9wZXJ0eS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVE9SX0RFRiA9ICJkZXNjcmlwdG9yLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFTEVDVE9SX0VYUFJFU1NJT04gPSAic2VsZWN0b3ItZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBTRVVET19DTEFTUyA9ICJwc2V1ZG8tY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fRUxFTUVOVCA9ICJwc2V1ZG8tZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBTRVVET19DTEFTU19ERUYgPSAicHNldWRvLWNsYXNzLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBTRVVET19FTEVNRU5UX0RFRiA9ICJwc2V1ZG8tZWxlbWVudC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RPUl9WQUxVRSA9ICJzZWxlY3Rvci12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTUJFUiA9ICJudW1iZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLRVlXT1JEID0gImtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGVU5DVElPTiA9ICJmdW5jdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUiA9ICJjb250YWluZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkcgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VQQVJBVE9SID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRPUiA9ICJkZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI2MmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLQotCi1jbGFzcyBQcm9maWxlTG9hZGVyIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFByb2ZpbGVMb2FkZXIuCi0JICovCi0JcHJpdmF0ZSBQcm9maWxlTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCVByb2ZpbGVMb2FkZXIoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIGJvb2xlYW4gbG9nZ2luZykgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCXN0YXRpYyB2b2lkIGxvYWRQcm9maWxlKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBJbnB1dFN0cmVhbSBpbnB1dCwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIGJvb2xlYW4gbG9nZ2luZykgewotCQl0cnkgewotCQkJWE1MUmVhZGVyIHhtbFJlYWRlciA9IFhNTFJlYWRlclV0aWwuY3JlYXRlWE1MUmVhZGVyKFBBUlNFUl9OQU1FKTsKLQkJCS8vIFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKFBBUlNFUl9OQU1FKTsKLQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUHJvZmlsZUhhbmRsZXIobWV0YW1vZGVsLCByZXNvdXJjZUJ1bmRsZSwgbG9nZ2luZykpOwotCQkJeG1sUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCUNTU01ldGFNb2RlbCBsb2FkUHJvZmlsZShJbnB1dFN0cmVhbSBpbnB1dCkgewotCQlpZiAoZk1ldGFNb2RlbCA9PSBudWxsKSB7Ci0JCQlmTWV0YU1vZGVsID0gbmV3IENTU01ldGFNb2RlbEltcGwoKTsKLQkJfQotCQlsb2FkUHJvZmlsZShmTWV0YU1vZGVsLCBpbnB1dCwgZlJlc291cmNlQnVuZGxlLCBmTG9nZ2luZyk7Ci0JCWZNZXRhTW9kZWwubG9hZENvbXBsZXRlZCgpOwotCQlyZXR1cm4gZk1ldGFNb2RlbDsKLQl9Ci0KLQotCUNTU01ldGFNb2RlbEltcGwgZk1ldGFNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUlNFUl9OQU1FID0gIm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkxvZ2dpbmcgPSBmYWxzZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWVjYzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLQotcHVibGljIGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCS8vCi0JcHJpdmF0ZSBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY3NzcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBUQUdfTkFNRSA9ICJwcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0xPR0dJTkcgPSAibG9nZ2luZyI7IC8vIEhpZGRlbiBPcHRpb24gLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFJlZ2lzdHJ5UmVhZGVyLgotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTUHJvZmlsZSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlDU1NQcm9maWxlSW1wbCBpbmZvID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBzdHJJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQlTdHJpbmcgc3RyTkFNRSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLQkJCVN0cmluZyBzdHJVUkkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVVJJKTsKLQotCQkJaWYgKHN0cklEICE9IG51bGwgfHwgc3RyVVJJICE9IG51bGwpIHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKHN0clVSSSk7Ci0JCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl1cmwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwodXJsKTsKLQkJCQkJCQlpbmZvID0gbmV3IENTU1Byb2ZpbGVJbXBsKHN0cklELCB1cmwsIHN0clVSSSk7Ci0JCQkJCQkJaW5mby5zZXRQcm9maWxlTmFtZShzdHJOQU1FKTsKLQkJCQkJCQlpbmZvLnNldERlZmF1bHQoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZBVUxUKSAhPSBudWxsKSk7Ci0JCQkJCQkJaW5mby5zZXRMb2dnaW5nKChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTE9HR0lORykgIT0gbnVsbCkpOwotCQkJCQkJCWluZm8uc2V0T3duZXJQbHVnaW5JRChwbHVnaW5JZCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gdGhyb3VnaAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFcnJvciByZWFkaW5nIENTUyBQcm9maWxlOiAiICsgc3RySUQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogV2Ugc2ltcGx5IHJlcXVpcmUgYW4gJ2FkZCcgbWV0aG9kLCBvZiB3aGF0IGV2ZXIgaXQgaXMgd2UgYXJlIHRvIHJlYWQKLQkgKiBpbnRvCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGVudW1Qcm9maWxlcygpIHsKLQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ1NTUHJvZmlsZSBpbmZvID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJCQkvLyBlbGVtZW50Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlzZXQuYWRkKGluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2V0Lml0ZXJhdG9yKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1ZhbHVlQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvVmFsdWVDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyZGVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvVmFsdWVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxUcmF2ZXJzZXI7Ci0KLQotCi1jbGFzcyBWYWx1ZUNvbGxlY3RvciBleHRlbmRzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0JcHVibGljIHZvaWQgYmVnaW4oQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJZk5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJjID0gVFJBVl9DT05UOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfQ09OVEFJTkVSKSB7Ci0JCQkJcmMgPSBUUkFWX0NPTlQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZOb2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJCQlmTm9kZXMuYWRkKG5vZGUpOwotCQkJCQlyYyA9IFRSQVZfUFJVTkU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBmTm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQotCXByaXZhdGUgTGlzdCBmTm9kZXMgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvWE1MUmVhZGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTg5NGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0KLWNsYXNzIFhNTFJlYWRlclV0aWwgewotCi0Jc3RhdGljIHB1YmxpYyBYTUxSZWFkZXIgY3JlYXRlWE1MUmVhZGVyKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0NTU01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDRlN2Q3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0NTU01vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQkvKioKLQkgKiBDU1NMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb2RlbExvYWRlciNuZXdNb2RlbCgpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXcgQ1NTTW9kZWxJbXBsKCk7Ci0JCS8vIG5vdyBkb25lIGluIGNyZWF0ZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkvLyBtb2RlbC5zZXRGYWN0b3J5UmVnaXN0cnkoZGVmYXVsdEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMmQ4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckNTUyBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50VHlwZURlc2NyaXB0aW9uI2dldE1vZGVsTG9hZGVyKCkKLQkgKi8KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWNhNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1JlZ2lvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NSZWdpb25VdGlsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlY2xhcmF0aW9uVmFsdWVUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0ggfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSB0eXBlIGNhbiBiZSBiZWdnaW5pbmcgb2Ygc2VsZWN0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVjbGFyYXRpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SIHx8IGlzRGVjbGFyYXRpb25WYWx1ZVR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVzZSB0eXBlcyBjb25zaXN0IHNlbGVjdG9yIHJlZ2lvbgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbGVjdG9yVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ09NQklOQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkM2FjODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU1RZTEVTSEVFVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ERUNMQVJBVElPTiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ERUNMQVJBVElPTl9WQUxVRSA9IDI7Ci0KLQlwcml2YXRlIGxvbmcgZlN0YXJ0VGltZTsKLQlwcml2YXRlIGxvbmcgZlN0b3BUaW1lOwotCXByaXZhdGUgSUNTU1Rva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyTW9kZShpbnQgbW9kZSkgewotCQlpbnQgaW5pdGlhbFN0YXRlOwotCQlpbnQgYnVmc2l6ZTsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCQljYXNlIE1PREVfU1RZTEVTSEVFVCA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLllZSU5JVElBTDsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTiA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfU01BTEw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKDAgPCBpbml0aWFsU3RhdGUpIHsKLQkJCUlDU1NUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZSk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbEJ1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZG5vZGUgPSBudWxsOwotCQlpZiAoaGVhZG5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJZlN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJaGVhZG5vZGUgPSBwYXJzZU5vZGVzKCk7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlmU3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtLSBjcmVhdGluZyBub2RlcyBvZiBJU3RydWN0dXJlZERvY3VtZW50IC0tICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgVGltZSBwYXJzZSBhbmQgaW5pdCBhbGwgcmVnaW9uczogIiArIChmU3RvcFRpbWUgLSBmU3RhcnRUaW1lKSArICIgKG1zZWNzKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGZvciAiICsgZlJlZ2lvbnMuc2l6ZSgpICsgIgotCQkJCS8vIFJlZ2lvbnMiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgYW5kICIgKyBfY291bnROb2RlcyhoZWFkbm9kZSkgKyAiIE5vZGVzIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlYWRub2RlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlpZiAoIWdldFRva2VuaXplcigpLmlzRU9GKCkpIHsKLQkJCWhlYWROb2RlID0gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYXJzaW5nIGhhcyBub3QgZmluaXNoZWQiKTsKLQkJfQotCQkvLyBmb3IgbWVtb3J5IHJlY292ZXJ5LCB3ZSBhc3N1bWUgaWYgc29tZW9uZQotCQkvLyByZXF1ZXN0cyBhbGwgcmVnaW9ucywgd2UgY2FuIHJlc2V0IG91ciBiaWcKLQkJLy8gbWVtb3J5IGNvbnN1bWluZyBvYmplY3RzCi0JCS8vIGJ1dCB0aGUgbmV3ICJnZXRSZWdpb25zIiBtZXRob2QgaXMgdGhlbiBtb3JlIGV4cGVuc2l2ZS4KLQkJLy8gSSBkb24ndCB0aGluayBpdHMgdXNlZCBtdWNoLCB0aG91Z2guCi0JCUxpc3QgbG9jYWxSZWdpb25zTGlzdCA9IGdldFJlZ2lvbnMoaGVhZE5vZGUpOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGxvY2FsUmVnaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIGhlYWROb2RlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlKSB7Ci0JCUxpc3QgYWxsUmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gY3VycmVudE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCWFsbFJlZ2lvbnMuYWRkKG5vZGVSZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXByaW1SZXNldCgpOwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChyZWFkZXIsIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQocmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJcmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCwgaW50IG9mZnNldCkgewotCQlyZXNldChpbnB1dCk7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBjdXJyZW50UmVnaW9uVHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKG11c3RCZVN0YXJ0KHR5cGUsIGN1cnJlbnRSZWdpb25UeXBlKSAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8IGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiAhY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCX0KLQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWN1cnJlbnRSZWdpb25UeXBlID0gdHlwZTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQotCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0KLQkJCWlmIChtdXN0QmVFbmQodHlwZSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiAhY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJfQotCi0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24odHlwZSk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlU3RhcnQoU3RyaW5nIHR5cGUsIFN0cmluZyBkb2NSZWdpb25UeXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0FUS0VZV09SRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IChkb2NSZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB8fCAoIUNTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUoZG9jUmVnaW9uVHlwZSkgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCkpKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0QmVFbmQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpOwotCX0KLQotCXByaXZhdGUgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbigpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldFRva2VuaXplcigpLmdldE5leHRUb2tlbigpOwotCQkJLy8gRE1XOiAyLzEyLzAzIFJlbW92ZWQgc3RhdGUKLQkJCS8vIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZlJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpICsgIiAoIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIikiLCBlKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1SZXNldCgpIHsKLQotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChuZXcgY2hhclswXSk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIElDU1NUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IHRvIGNvdW50IG5vZGVzLiBVc2VkIG9ubHkgZm9yIGRlYnVnCi0JICogc3RhdGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIGludCBfY291bnROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGVzKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IG5vZGVzOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3YTI0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQllbHNlIHsKLQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzYjE3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MDUgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNi83LzA2IDU6MjMgUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA2LzcvMDYgNToyMyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9idWlsZHMvV29ya3NwYWNlcy9wdXJlSGVhZFdUUC9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUb2tlbml6ZXIgaW1wbGVtZW50cyBDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0lNUE9SVF9ERUxJTUlURVIgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1IgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DSEFSU0VUX0RFTElNSVRFUiA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BBR0VfUFNFVURPX1BBR0UgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9JTVBPUlRfVVJJID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT04gPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEFHRV9ERUxJTUlURVIgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVESUFfTUVESVVNID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0hBUlNFVF9OQU1FID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX01FRElVTSA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVESUFfREVMSU1JVEVSID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfTU9ESUZJRVIgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVwxMlwxXDE3XDFcMFwxXDRcMVwyMFwyMlwwXDFcNlwxXDMxXDFcMTEiKwotICAgICJcMVwyMVwxXDE2XDFcNzJcMVwxNlwxXDVcMVwyNVwxXDEzXDFcMzVcMVwxNFwxXDU1IisKLSAgICAiXDFcMTBcMVwxNVwxXDM0XDEyXDFcMVw2MlwxXDUwXDFcMzBcMVw2N1wxXDMyXDFcMjciKwotICAgICJcMVwzNlwxXDQzXDFcMjZcMVw0MFwxXDU3XDFcNDZcMVw2NFwxXDYxXDFcNDFcMVw1MSIrCi0gICAgIlwyXDJcMVwyNFwxXDUyXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0NyIrCi0gICAgIlwxXDIyXDVcMlwxXDY2XDFcM1wxXDcxXDFcMTZcMVwyXDFcMTZcMVw0MlwxXDciKwotICAgICJcMVwzN1wxXDU2XDFcNDVcMVw2M1wxXDYxXDFcNDFcMVw1MVwyXDJcMVwyNFwxXDUyIisKLSAgICAiXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0N1wxXDIyXDVcMlwxXDYwIisKLSAgICAiXDFcNzBcMVwzM1wxXDcwXDFcMFx1ZmY4MFwyIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDU5LCAgIDExOCwgICAxNzcsICAgMjM2LCAgIDI5NSwgICAzNTQsICAgNDEzLCAgIDQ3MiwgICA1MzEsIAotICAgICAgNTkwLCAgIDY0OSwgICA3MDgsICAgNzY3LCAgIDgyNiwgICA4ODUsICAgOTQ0LCAgMTAwMywgIDEwNjIsICAxMTIxLCAKLSAgICAgMTE4MCwgIDEyMzksICAxMjk4LCAgMTM1NywgIDE0MTYsICAxNDc1LCAgMTUzNCwgIDExMjEsICAxNTkzLCAgMTEyMSwgCi0gICAgIDE2NTIsICAxNzExLCAgMTEyMSwgIDE3NzAsICAxODI5LCAgMTg4OCwgIDExMjEsICAxOTQ3LCAgMjAwNiwgIDIwNjUsIAotICAgICAyMTI0LCAgMjE4MywgIDIyNDIsICAxMTIxLCAgMjMwMSwgIDIzNjAsICAyNDE5LCAgMTEyMSwgIDExMjEsICAyNDc4LCAKLSAgICAgMjUzNywgIDI1OTYsICAxMTIxLCAgMjY1NSwgIDI3MTQsICAxMTIxLCAgMTEyMSwgIDI3NzMsICAyODMyLCAgMjg5MSwgCi0gICAgIDExMjEsICAyOTUwLCAgMTEyMSwgIDMwMDksICAzMDY4LCAgMzEyNywgIDMxODYsICAzMjQ1LCAgMzMwNCwgIDMzNjMsIAotICAgICAzNDIyLCAgMTEyMSwgIDExMjEsICAzNDgxLCAgMzU0MCwgIDM1OTksICAzNjU4LCAgMzcxNywgIDM3NzYsICAxMTIxLCAKLSAgICAgMzgzNSwgIDM4OTQsICAzOTUzLCAgNDAxMiwgIDQwNzEsICAxNTkzLCAgMTEyMSwgIDQxMzAsICAxMjM5LCAgNDE4OSwgCi0gICAgIDQyNDgsICAxNDE2LCAgNDMwNywgIDE0NzUsICA0MzY2LCAgNDQyNSwgIDQ0ODQsICA0NTQzLCAgNDYwMiwgIDQ2NjEsIAotICAgICA0NzIwLCAgNDc3OSwgIDQ4MzgsICA0ODk3LCAgNDk1NiwgIDE3NzAsICA1MDE1LCAgMTEyMSwgIDE4ODgsICA1MDc0LCAKLSAgICAgMTk0NywgIDUxMzMsICAxMTIxLCAgMjAwNiwgIDUxOTIsICA1MjUxLCAgMjE4MywgIDUzMTAsICAyMzYwLCAgNTM2OSwgCi0gICAgIDI1MzcsICA1NDI4LCAgNTQ4NywgIDExMjEsICAyNzE0LCAgMjgzMiwgIDU1NDYsICAzMDY4LCAgNTYwNSwgIDMxMjcsIAotICAgICA1NjY0LCAgMTEyMSwgIDMyNDUsICA1NzIzLCAgMzM2MywgIDU3ODIsICA1ODQxLCAgNTkwMCwgIDU5NTksICAzODk0LCAKLSAgICAgMTEyMSwgIDM1OTksICAxMTIxLCAgNjAxOCwgIDM2NTgsICA2MDc3LCAgMTEyMSwgIDM3NzYsICA2MTM2LCAgNjE5NSwgCi0gICAgIDM5NTMsICA2MjU0LCAgNjMxMywgIDYzNzIsICA0MDcxLCAgNjQzMSwgIDExMjEsICA0MTMwLCAgNjQ5MCwgIDExMjEsIAotICAgICA2NTQ5LCAgNjYwOCwgIDY2NjcsICA2NzI2LCAgNjc4NSwgIDY4NDQsICA2OTAzLCAgNjk2MiwgIDcwMjEsICA3MDgwLCAKLSAgICAgNzEzOSwgIDcxOTgsICAxNzcwLCAgNzI1NywgIDczMTYsICAxODg4LCAgNzM3NSwgIDc0MzQsICAxOTQ3LCAgNzQ5MywgCi0gICAgIDc1NTIsICAyMDA2LCAgNzYxMSwgIDc2NzAsICA3NzI5LCAgNzc4OCwgIDc4NDcsICA3OTA2LCAgNzk2NSwgIDgwMjQsIAotICAgICAzMTI3LCAgODA4MywgIDgxNDIsICAzMjQ1LCAgODIwMSwgIDgyNjAsICA4MzE5LCAgODM3OCwgIDg0MzcsICAzNjU4LCAKLSAgICAgODQ5NiwgIDg1NTUsICAzNzc2LCAgODYxNCwgIDg2NzMsICA4NzMyLCAgODc5MSwgIDg4NTAsICA4OTA5LCAgODk2OCwgCi0gICAgIDkwMjcsICAxMTIxLCAgMTEyMSwgIDkwODYsICA5MTQ1LCAgOTIwNCwgIDkyNjMsICA5MzIyLCAgOTM4MSwgIDk0NDAsIAotICAgICA5NDk5LCAgOTU1OCwgIDk2MTcsICA5Njc2LCAgOTczNSwgIDk3OTQsICA5ODUzLCAgOTkxMiwgIDk5NzEsIDEwMDMwLCAKLSAgICAxMDA4OSwgMTAxNDgsIDEwMjA3LCAxMDI2NiwgMTAzMjUsIDEwMzg0LCAxMDQ0MywgMTA1MDIsIDEwNTYxLCAxMDYyMCwgCi0gICAgMTA2NzksIDEwNzM4LCAxMDc5NywgMTA4NTYsIDEwOTE1LCAxMDk3NCwgMTEwMzMsIDExMDkyLCAxMTE1MSwgMTEyMTAsIAotICAgICAxMTIxLCAxMTI2OSwgMTEzMjgsICAxMTIxLCAxMTM4NywgMTE0NDYsIDExNTA1LCAxMTU2NCwgMTE2MjMsIDExNjgyLCAKLSAgICAxMTc0MSwgMTE4MDAsIDExODU5LCAxMTkxOCwgIDExMjEsIDExOTc3LCAxMjAzNiwgMTIwOTUsIDEyMTU0LCAxMjIxMywgCi0gICAgMTIyNzIsIDEyMzMxLCAxMjM5MCwgMTI0NDksIDEyNTA4LCAxMjU2NywgMTI2MjYsIDEyNjg1LCAxMjc0NCwgMTI4MDMsIAotICAgIDEyODYyLCAxMjkyMSwgMTA3OTcsIDEyOTgwLCAxMzAzOSwgIDExMjEsIDEzMDk4LCAxMzE1NywgMTMyMTYsIDEzMjc1LCAKLSAgICAxMzMzNCwgMTMzOTMsICAxMTIxLCAxMzQ1MiwgMTM1MTEsIDEzNTcwLCAxMzYyOSwgMTM2ODgsIDEzNzQ3LCAxMzgwNiwgCi0gICAgMTM4NjUsIDEzOTI0LCAxMTc0MSwgMTM5ODMsIDE0MDQyLCAxNDEwMSwgMTQxNjAsIDE0MjE5LCAxNDI3OCwgMTQzMzcsIAotICAgIDE0Mzk2LCAxNDQ1NSwgMTQ1MTQsIDE0NTczLCAxNDYzMiwgMTQ2OTEsIDE0NzUwLCAxNDgwOSwgMTQ4NjgsIDE0OTI3LCAKLSAgICAxNDk4NiwgMTUwNDUsIDEyODYyLCAxNTEwNCwgMTUxNjMsIDE1MjIyLCAxNTI4MSwgMTUzNDAsIDE1Mzk5LCAxNTQ1OCwgCi0gICAgIDExMjEsIDE1NTE3LCAxNTU3NiwgMTU2MzUsIDE1Njk0LCAxNTc1MywgMTU4MTIsIDE1ODcxLCAxNTkzMCwgMTU5ODksIAotICAgIDE2MDQ4LCAxNjEwNywgMTYxNjYsIDE2MjI1LCAxNjI4NCwgMTYzNDMsIDE2NDAyLCAxNjQ2MSwgMTY1MjAsIDE2NTc5LCAKLSAgICAxNjYzOCwgMTY2OTcsIDE2NzU2LCAxNjgxNSwgMTY4NzQsIDE2OTMzLCAxNjk5MiwgMTcwNTEsIDE3MTEwLCAxNzE2OSwgCi0gICAgMTcyMjgsIDE3Mjg3LCAxNzM0NiwgMTc0MDUsIDE3NDY0LCAxNzUyMywgMTc1ODIsIDE3NjQxLCAxNzcwMCwgMTc3NTksIAotICAgICAxMTIxLCAxNzgxOCwgMTc4NzcsIDE3OTM2LCAxNzk5NSwgMTgwNTQsIDE4MTEzLCAxODE3MiwgMTgyMzEsIDE4MjkwLCAKLSAgICAxMTg1OSwgMTgzNDksIDExOTE4LCAxODQwOCwgMTg0NjcsIDE4NTI2LCAxODU4NSwgMTg2NDQsIDE4NzAzLCAxODc2MiwgCi0gICAgMTg4MjEsIDE4ODgwLCAxODkzOSwgMTI5ODAsIDE4OTk4LCAxMzAzOSwgMTkwNTcsIDE5MTE2LCAxOTE3NSwgMTkyMzQsIAotICAgIDE5MjkzLCAxOTM1MiwgMTk0MTEsIDE5NDcwLCAxOTUyOSwgMTk1ODgsIDE5NjQ3LCAgMTEyMSwgMTk3MDYsIDE5NzY1LCAKLSAgICAxOTgyNCwgMTk4ODMsICAxMTIxLCAxOTk0MiwgMjAwMDEsIDIwMDYwLCAgMTEyMSwgMjAxMTksIDIwMTc4LCAyMDIzNywgCi0gICAgMjAyOTYsIDIwMzU1LCAyMDQxNCwgMjA0NzMsIDIwNTMyLCAyMDU5MSwgMjA2NTAKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkID0gCi0gICAgIlwyXDI0XDFcMjVcMVwyNlwxXDI3XDFcMjRcMVwyN1wxXDI1XDFcMzAiKwotICAgICJcMVwyNFwxXDI3XDJcMjRcMVwzMVwxXDI0XDJcMjdcMVwzMlwzXDI1IisKLSAgICAiXDFcMjRcMVwyNVwxXDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwzNiIrCi0gICAgIlwxXDM3XDExXDI1XDFcMjRcNFwyNVwxXDI0XDJcMjVcMVwyNFwxXDI1IisKLSAgICAiXDFcNDBcM1wyNVwxXDQxXDEwXDI0XDFcMjdcMVw0MlwxXDI3XDFcMjQiKwotICAgICJcMVw0M1wxXDQ0XDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzM1wyXDI0IisKLSAgICAiXDFcMzRcMVwzNVwxXDI0XDFcMzdcNDBcMjRcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwyNFwxXDQ1XDI2XDI0IisKLSAgICAiXDFcMjdcMVw0NlwxXDI3XDFcMjRcMVw0M1wxXDQ3XDFcMjdcNFwyNCIrCi0gICAgIlwyXDI3XDFcMjRcMVw1MFw1XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzUiKwotICAgICJcMVwyNFwxXDM3XDExXDI0XDFcNDVcMjRcMjRcMVw1MVwxXDUyXDFcMjciKwotICAgICJcMVwyNFwxXDI3XDFcNTFcMVw1M1wxXDI0XDFcMjdcNFwyNFwyXDI3IisKLSAgICAiXDFcMjRcM1w1MVwxXDI0XDFcNTFcMVwyNFwxXDMzXDJcMjRcMVwzNCIrCi0gICAgIlwxXDM1XDFcMjRcMVwzN1wxMVw1MVwxXDQ1XDRcNTFcMVwyNFwyXDUxIisKLSAgICAiXDFcMjRcMVw1MVwxXDI0XDNcNTFcMTFcMjRcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwyNFwxXDQ1XDRcMjQiKwotICAgICJcMVw1NFwxN1wyNFwxXDU1XDFcNTZcMVwyN1wxXDI0XDFcMjdcMVw1NSIrCi0gICAgIlwxXDU3XDFcMjRcMVwyN1w0XDI0XDJcMjdcMVwyNFwzXDU1XDFcMjQiKwotICAgICJcMVw1NVwxXDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDExXDU1XDFcMjRcNFw1NVwxXDI0XDJcNTVcMVwyNFwxXDU1XDFcMjQiKwotICAgICJcM1w1NVwxMVwyNFwxXDI3XDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNCIrCi0gICAgIlwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzUiKwotICAgICJcMVwyNFwxXDM3XDE2XDI0XDFcNjBcMlwyNFwxXDYxXDE0XDI0XDFcNjIiKwotICAgICJcMVw2M1wxXDI3XDFcMjRcMVwyN1wxXDYyXDFcNjRcMVwyNFwxXDI3IisKLSAgICAiXDRcMjRcMlwyN1wxXDI0XDNcNjJcMVwyNFwxXDYyXDFcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcNjJcMVwyNFw0XDYyIisKLSAgICAiXDFcMjRcMlw2MlwxXDY1XDFcNjJcMVw2NlwzXDYyXDExXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNFwyXDI3IisKLSAgICAiXDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMjFcMjQiKwotICAgICJcMVw2NVwxNlwyNFwxXDY3XDFcMjRcMVw2N1wxXDI0XDFcNDNcMVwyNCIrCi0gICAgIlwxXDY3XDFcMjRcMVw3MFwxXDMxXDFcMjRcMlw2N1wxXDMyXDZcMjQiKwotICAgICJcMVwzM1wxXDI0XDFcNzBcMVwzNFwxXDM1XDFcMzZcMVwzN1wxNlwyNCIrCi0gICAgIlwxXDcxXDJcMjRcMVw2NVwxXDI0XDFcNDBcM1wyNFwxXDQxXDZcMjQiKwotICAgICJcMVw3MlwxXDczXDFcMjdcMVwyNFwxXDI3XDFcNzJcMVw3NFwxXDI0IisKLSAgICAiXDFcMjdcNFwyNFwyXDI3XDFcMjRcM1w3MlwxXDI0XDFcNzJcMVwyNCIrCi0gICAgIlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVw3MlwxXDI0IisKLSAgICAiXDRcNzJcMVwyNFwyXDcyXDFcMjRcMVw3MlwxXDI0XDNcNzJcMTFcMjQiKwotICAgICJcMVwyN1wxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0IisKLSAgICAiXDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzNyIrCi0gICAgIlwzMFwyNFwxXDc1XDFcNzZcMVw3N1wzXDI0XDFcMTAwXDFcMTAxXDFcMjciKwotICAgICJcMVwxMDJcMVwyN1wxXDEwMFwxXDEwM1wxXDEwNFwxXDI3XDRcMjRcMlwyNyIrCi0gICAgIlwxXDI0XDNcMTAwXDFcMjRcMVwxMDBcMVwyNFwxXDMzXDJcMjRcMVwzNCIrCi0gICAgIlwxXDM1XDFcMjRcMVwzN1wxMVwxMDBcMVwyNFw0XDEwMFwxXDI0XDJcMTAwIisKLSAgICAiXDFcMjRcMVwxMDBcMVwyNFwzXDEwMFwxMVwyNFwxXDI3XDFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzMiKwotICAgICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDMyXDI0XDFcNzdcM1wyNCIrCi0gICAgIlwxXDEwNVwxXDEwNlwxXDI3XDFcMjRcMVwyN1wxXDEwNVwxXDEwN1wxXDI0IisKLSAgICAiXDFcMjdcNFwyNFwyXDI3XDFcMjRcM1wxMDVcMVwyNFwxXDEwNVwxXDI0IisKLSAgICAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDEwNVwxXDExMCIrCi0gICAgIlw0XDEwNVwxXDI0XDJcMTA1XDFcMjRcMVwxMDVcMVwyNFwzXDEwNVwxMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjQiKwotICAgICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDExXDI0XDFcMTEwXDExXDI0XDFcMTExXDExXDI0XDFcMTEyXDFcMTEzXDFcMTE0IisKLSAgICAiXDFcMjdcMVwxMTVcMVwyN1wxXDExM1wxXDExNlwxXDExN1wxXDI3XDFcMTIwIisKLSAgICAiXDFcMTIxXDFcMTIyXDFcMjRcMlwyN1wxXDEyM1wxXDEyNFwyXDExM1wxXDI0IisKLSAgICAiXDFcMTEzXDFcMjRcMVwzM1wxXDEyNVwxXDI0XDFcMzRcMVwxMjZcMVwyNCIrCi0gICAgIlwxXDM3XDExXDExM1wxXDExMFw0XDExM1wxXDEyN1wyXDExM1wxXDI0XDFcMTEzIisKLSAgICAiXDFcMjRcM1wxMTNcNlwyNFwxXDExMlwxXDExM1wxXDExNFwxXDEzMFwxXDExNSIrCi0gICAgIlwxXDEzMFwxXDExM1wxXDExNlwxXDExN1wxXDEzMFwxXDEyMFwxXDEyMVwxXDEyMiIrCi0gICAgIlwxXDI0XDJcMTMwXDFcMTIzXDFcMTI0XDJcMTEzXDFcMjRcMVwxMTNcMVwyNCIrCi0gICAgIlwxXDMzXDFcMTI1XDFcMjRcMVwzNFwxXDEyNlwxXDI0XDFcMzdcMTFcMTEzIisKLSAgICAiXDFcMTEwXDRcMTEzXDFcMTI3XDJcMTEzXDFcMjRcMVwxMTNcMVwyNFwzXDExMyIrCi0gICAgIlw1XDI0XDc0XDBcMlwyNVwxXDEzMVwzXDBcMlwyNVwxMVwwXDNcMjUiKwotICAgICJcMVwwXDFcMjVcMTBcMFwxMVwyNVwxXDBcNFwyNVwxXDBcMlwyNSIrCi0gICAgIlwxXDBcMVwyNVwxXDBcM1wyNVw2XDBcMVwxMzJcMlwyNVwxXDAiKwotICAgICJcMlwyNVwxXDEzMlwyXDI1XDFcMFw0XDI1XDJcMFwxNlwyNVwxXDEzMiIrCi0gICAgIlwyXDI1XDFcMTMyXDJcMjVcMVwxMzJcMTBcMjVcMVwxMzJcNFwyNVwxXDEzMiIrCi0gICAgIlw3XDI1XDRcMFwxXDI3XDFcMFwxXDI3XDNcMFwxXDI3XDRcMCIrCi0gICAgIlwyXDI3XDU0XDBcMVwyNVwxXDEzMVwzXDBcMVwyNVwxXDEzM1wxMVwwIisKLSAgICAiXDNcMjVcMVwwXDFcMjVcMTBcMFwxMVwyNVwxXDBcNFwyNVwxXDAiKwotICAgICJcMlwyNVwxXDBcMVwyNVwxXDBcM1wyNVw2XDBcMlwxMzRcMVwxMzUiKwotICAgICJcM1wwXDJcMTM0XDExXDBcM1wxMzRcMVwwXDFcMTM0XDEwXDBcMTFcMTM0IisKLSAgICAiXDFcMFw0XDEzNFwxXDBcMlwxMzRcMVwwXDFcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlw2XDBcMlwxMzZcMVwxMzdcM1wwXDJcMTM2XDExXDBcM1wxMzZcMVwwIisKLSAgICAiXDFcMTM2XDEwXDBcMTFcMTM2XDFcMFw0XDEzNlwxXDBcMlwxMzZcMVwwIisKLSAgICAiXDFcMTM2XDFcMFwzXDEzNlwzNlwwXDFcMTQwXDc2XDBcMVwxNDFcNzRcMCIrCi0gICAgIlwyXDE0MlwxMFwwXDFcMTQzXDFcMTQ0XDFcMTQ1XDdcMFwyXDE0NlwxMFwwIisKLSAgICAiXDFcMTQ3XDFcMTUwXDNcMFwxXDE0N1wxXDE1MVwxMVwwXDNcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1wxMFwwXDExXDE0N1wxXDBcNFwxNDdcMVwwXDJcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1wxXDBcM1wxNDdcNlwwXDJcMTUyXDFcMTUzXDFcMFwxXDE1NCIrCi0gICAgIlwxMVwxNTJcMlwwXDUyXDE1MlwxMFwwXDFcMTMzXDYzXDBcMlwxNTVcMVwxNTYiKwotICAgICJcMVwwXDRcMTU1XDFcMTU0XDVcMTU1XDJcMFw1MlwxNTVcMVwwXDJcMTU3IisKLSAgICAiXDFcMTYwXDFcMFwxXDE2MVwxMVwxNTdcMlwwXDUyXDE1N1wxXDBcMlwxNjIiKwotICAgICJcMVwxNjNcMVwwXDRcMTYyXDFcMTYxXDVcMTYyXDJcMFw1MlwxNjJcMjNcMCIrCi0gICAgIlwxXDE2NFw1MFwwXDJcNTFcMVwxNjVcM1wwXDJcNTFcMTFcMFwzXDUxIisKLSAgICAiXDFcMFwxXDUxXDEwXDBcMTFcNTFcMVwwXDRcNTFcMVwwXDJcNTEiKwotICAgICJcMVwwXDFcNTFcMVwwXDNcNTFcNlwwXDFcMTY2XDJcNTFcMVwwIisKLSAgICAiXDJcNTFcMVwxNjZcMlw1MVwxXDBcNFw1MVwyXDBcMTZcNTFcMVwxNjYiKwotICAgICJcMlw1MVwxXDE2NlwyXDUxXDFcMTY2XDEwXDUxXDFcMTY2XDRcNTFcMVwxNjYiKwotICAgICJcN1w1MVwyXDBcMVw1MVwxXDE2NVwzXDBcMVw1MVwxXDEzM1wxMVwwIisKLSAgICAiXDNcNTFcMVwwXDFcNTFcMTBcMFwxMVw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMlw1MVwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMlw1NVwxXDE2NyIrCi0gICAgIlwzXDBcMlw1NVwxMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxMVw1NSIrCi0gICAgIlwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDBcM1w1NSIrCi0gICAgIlw2XDBcMVwxNzBcMlw1NVwxXDBcMlw1NVwxXDE3MFwyXDU1XDFcMCIrCi0gICAgIlw0XDU1XDJcMFwxNlw1NVwxXDE3MFwyXDU1XDFcMTcwXDJcNTVcMVwxNzAiKwotICAgICJcMTBcNTVcMVwxNzBcNFw1NVwxXDE3MFw3XDU1XDJcMFwxXDU1XDFcMTY3IisKLSAgICAiXDNcMFwxXDU1XDFcMTMzXDExXDBcM1w1NVwxXDBcMVw1NVwxMFwwIisKLSAgICAiXDExXDU1XDFcMFw0XDU1XDFcMFwyXDU1XDFcMFwxXDU1XDFcMCIrCi0gICAgIlwzXDU1XDZcMFwyXDYyXDFcMTcxXDNcMFwyXDYyXDExXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxMFwwXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwzXDYyXDZcMFwxXDE3MlwyXDYyXDFcMCIrCi0gICAgIlwyXDYyXDFcMTcyXDJcNjJcMVwwXDRcNjJcMlwwXDE2XDYyXDFcMTcyIisKLSAgICAiXDJcNjJcMVwxNzJcMlw2MlwxXDE3MlwxMFw2MlwxXDE3Mlw0XDYyXDFcMTcyIisKLSAgICAiXDdcNjJcMlwwXDFcNjJcMVwxNzFcM1wwXDFcNjJcMVwxMzNcMTFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDEwXDBcMTFcNjJcMVwwXDRcNjJcMVwwIisKLSAgICAiXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjJcN1wwXDFcNjJcMVwxNzEiKwotICAgICJcM1wwXDFcNjJcMVwxNzNcMTFcMFwzXDYyXDFcMFwxXDYyXDEwXDAiKwotICAgICJcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcNVwwXDRcMTc0XDFcMTc1XDFcMTc0XDFcMTc1XDNcMTc0XDFcMTc1IisKLSAgICAiXDFcMTc0XDFcMFwyXDE3NFwyXDE3NVwxMVwxNzRcMVwwXDI1XDE3NFwxXDAiKwotICAgICJcMTJcMTc0XDFcMFwyXDcyXDFcMTc2XDNcMFwyXDcyXDExXDBcM1w3MiIrCi0gICAgIlwxXDBcMVw3MlwxMFwwXDExXDcyXDFcMFw0XDcyXDFcMFwyXDcyIisKLSAgICAiXDFcMFwxXDcyXDFcMFwzXDcyXDZcMFwxXDE3N1wyXDcyXDFcMCIrCi0gICAgIlwyXDcyXDFcMTc3XDJcNzJcMVwwXDRcNzJcMlwwXDE2XDcyXDFcMTc3IisKLSAgICAiXDJcNzJcMVwxNzdcMlw3MlwxXDE3N1wxMFw3MlwxXDE3N1w0XDcyXDFcMTc3IisKLSAgICAiXDdcNzJcMlwwXDFcNzJcMVwxNzZcM1wwXDFcNzJcMVwxMzNcMTFcMCIrCi0gICAgIlwzXDcyXDFcMFwxXDcyXDEwXDBcMTFcNzJcMVwwXDRcNzJcMVwwIisKLSAgICAiXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNzRcMFwxXDc1XDRcMCIrCi0gICAgIlwyXDEwMFwxXDIwMFwzXDBcMlwxMDBcMTFcMFwzXDEwMFwxXDBcMVwxMDAiKwotICAgICJcMTBcMFwxMVwxMDBcMVwwXDRcMTAwXDFcMFwyXDEwMFwxXDBcMVwxMDAiKwotICAgICJcMVwwXDNcMTAwXDZcMFwxXDIwMVwyXDEwMFwxXDBcMlwxMDBcMVwyMDEiKwotICAgICJcMlwxMDBcMVwwXDRcMTAwXDJcMFwxNlwxMDBcMVwyMDFcMlwxMDBcMVwyMDEiKwotICAgICJcMlwxMDBcMVwyMDFcMTBcMTAwXDFcMjAxXDRcMTAwXDFcMjAxXDdcMTAwXDFcMCIrCi0gICAgIlwyXDIwMlwxXDIwM1wxXDBcMVwyMDRcMTFcMjAyXDJcMFw1MlwyMDJcMlwwIisKLSAgICAiXDFcMTAwXDFcMjAwXDNcMFwxXDEwMFwxXDEzM1wxMVwwXDNcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxMFwwXDExXDEwMFwxXDBcNFwxMDBcMVwwXDJcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxXDBcM1wxMDBcNlwwXDJcMjA1XDFcMjA2XDFcMFw0XDIwNSIrCi0gICAgIlwxXDIwNFw1XDIwNVwyXDBcNTJcMjA1XDFcMFwyXDEwNVwxXDIwN1wzXDAiKwotICAgICJcMlwxMDVcMTFcMFwzXDEwNVwxXDBcMVwxMDVcMTBcMFwxMVwxMDVcMVwwIisKLSAgICAiXDRcMTA1XDFcMFwyXDEwNVwxXDBcMVwxMDVcMVwwXDNcMTA1XDZcMCIrCi0gICAgIlwxXDIxMFwyXDEwNVwxXDBcMlwxMDVcMVwyMTBcMlwxMDVcMVwwXDRcMTA1IisKLSAgICAiXDJcMFwxNlwxMDVcMVwyMTBcMlwxMDVcMVwyMTBcMlwxMDVcMVwyMTBcMTBcMTA1IisKLSAgICAiXDFcMjEwXDRcMTA1XDFcMjEwXDdcMTA1XDJcMFwxXDEwNVwxXDIwN1wzXDAiKwotICAgICJcMVwxMDVcMVwxMzNcMTFcMFwzXDEwNVwxXDBcMVwxMDVcMTBcMFwxMVwxMDUiKwotICAgICJcMVwwXDRcMTA1XDFcMFwyXDEwNVwxXDBcMVwxMDVcMVwwXDNcMTA1IisKLSAgICAiXDZcMFwxXDExMlwxXDIxMVwxXDIxMlwzXDBcMVwyMTFcMVwyMTNcNFwwIisKLSAgICAiXDFcMjE0XDRcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxMVwyMTFcMVwwIisKLSAgICAiXDRcMjExXDFcMFwyXDIxMVwxXDBcMVwyMTFcMVwwXDNcMjExXDRcMCIrCi0gICAgIlwxXDIxNVwxXDBcMlwxMTNcMVwyMTZcM1wwXDJcMTEzXDExXDBcM1wxMTMiKwotICAgICJcMVwyMTdcMVwxMTNcMTBcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXDIyMFwyXDExM1wxXDAiKwotICAgICJcMlwxMTNcMVwyMjBcMlwxMTNcMVwwXDRcMTEzXDJcMFwxNlwxMTNcMVwyMjAiKwotICAgICJcMlwxMTNcMVwyMjBcMlwxMTNcMVwyMjBcMTBcMTEzXDFcMjIwXDRcMTEzXDFcMjIwIisKLSAgICAiXDdcMTEzXDFcMFwyXDIyMVwxXDIyMlwxXDBcMVwyMjNcMTFcMjIxXDJcMCIrCi0gICAgIlw1MlwyMjFcMVwwXDFcMTEyXDFcMTEzXDFcMjE2XDNcMFwxXDExM1wxXDEzMyIrCi0gICAgIlw0XDBcMVwyMTRcNFwwXDNcMTEzXDFcMFwxXDExM1wxMFwwXDExXDExMyIrCi0gICAgIlwxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTMiKwotICAgICJcNlwwXDJcMjI0XDFcMjI1XDFcMFw0XDIyNFwxXDIyM1w1XDIyNFwyXDAiKwotICAgICJcNTJcMjI0XDFcMFwxXDExMlwxM1wwXDFcMjE0XDU2XDBcMVwyMjZcNzJcMCIrCi0gICAgIlwyXDIyN1wxXDIzMFwzXDBcMlwyMjdcMTFcMFwzXDIyN1wxXDBcMVwyMjciKwotICAgICJcMTBcMFwxMVwyMjdcMVwwXDRcMjI3XDFcMFwyXDIyN1wxXDBcMVwyMjciKwotICAgICJcMVwwXDNcMjI3XDZcMFwyXDExM1wxXDIxNlwzXDBcMlwxMTNcM1wwIisKLSAgICAiXDFcMjMxXDVcMFwxXDExM1wxXDIzMlwxXDExM1wxXDIxN1wxXDExM1wxMFwwIisKLSAgICAiXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDAiKwotICAgICJcM1wxMTNcMTFcMFwxXDIzM1wxXDBcMVwyMzNcM1wwXDFcMjMzXDRcMCIrCi0gICAgIlwyXDIzM1wzMFwwXDFcMjM0XDIxXDBcNFwyMzVcMVwyMzZcMVwyMzVcMVwyMzYiKwotICAgICJcM1wyMzVcMVwyMzZcNFwyMzVcMlwyMzZcMTJcMjM1XDFcMFwxNFwyMzVcMVwwIisKLSAgICAiXDIyXDIzNVwxXDBcMVwyMzdcMVwyNVwxXDEzMVwxXDI1XDFcMFwxXDI1IisKLSAgICAiXDFcMjM3XDFcMjVcMVwwXDFcMjVcNFwwXDJcMjVcMVwwXDNcMjUiKwotICAgICJcMVwwXDFcMjVcMTBcMFwxXDIzN1wyXDI1XDFcMjM3XDJcMjVcMVwyMzciKwotICAgICJcMlwyNVwxXDBcNFwyNVwxXDBcMVwyMzdcMVwyNVwxXDBcMVwyNSIrCi0gICAgIlwxXDBcMVwyMzdcMlwyNVwzN1wwXDFcMjQwXDQxXDBcMVwyNDFcMlwxMzQiKwotICAgICJcMVwwXDJcMTM0XDFcMjQxXDJcMTM0XDFcMFw0XDEzNFwyXDBcMTZcMTM0IisKLSAgICAiXDFcMjQxXDJcMTM0XDFcMjQxXDJcMTM0XDFcMjQxXDEwXDEzNFwxXDI0MVw0XDEzNCIrCi0gICAgIlwxXDI0MVw3XDEzNFwxXDBcMVwyNDJcMlwxMzZcMVwwXDJcMTM2XDFcMjQyIisKLSAgICAiXDJcMTM2XDFcMFw0XDEzNlwyXDBcMTZcMTM2XDFcMjQyXDJcMTM2XDFcMjQyIisKLSAgICAiXDJcMTM2XDFcMjQyXDEwXDEzNlwxXDI0Mlw0XDEzNlwxXDI0Mlw3XDEzNlwxMFwwIisKLSAgICAiXDFcMjQzXDYyXDBcMzVcMTQxXDFcMjQ0XDM1XDE0MVw0MVwwXDFcMjQ1XDEwM1wwIisKLSAgICAiXDFcMjQ2XDY1XDBcMlwyNDdcNjZcMFwyXDI1MFwxMDNcMFwxXDI1MVwxN1wwIisKLSAgICAiXDJcMTQ3XDFcMTUwXDNcMFwyXDE0N1wxMVwwXDNcMTQ3XDFcMjUyXDFcMTQ3IisKLSAgICAiXDEwXDBcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDFcMFwzXDE0N1w2XDBcMVwyNTNcMlwxNDdcMVwwXDJcMTQ3XDFcMjUzIisKLSAgICAiXDJcMTQ3XDFcMFw0XDE0N1wyXDBcMTZcMTQ3XDFcMjUzXDJcMTQ3XDFcMjUzIisKLSAgICAiXDJcMTQ3XDFcMjUzXDEwXDE0N1wxXDI1M1w0XDE0N1wxXDI1M1w3XDE0N1wyXDAiKwotICAgICJcMVwxNDdcMVwxNTBcM1wwXDFcMTQ3XDEyXDBcM1wxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDEwXDBcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDFcMFwzXDE0N1w2XDBcMVwyNTRcMVwxNTJcMVwxNTNcMVwxNTJcMVwyNTUiKwotICAgICJcMVwxNTJcMVwyNTRcMTBcMTUyXDFcMjU2XDE2XDE1MlwxXDI1NFwyXDE1MlwxXDI1NCIrCi0gICAgIlwyXDE1MlwxXDI1NFwxMFwxNTJcMVwyNTRcNFwxNTJcMVwyNTRcN1wxNTJcMVwwIisKLSAgICAiXDFcMjU3XDFcMTU1XDFcMTU2XDNcMTU1XDFcMjU3XDFcMTU1XDFcMjYwXDZcMTU1IisKLSAgICAiXDFcMjYxXDE2XDE1NVwxXDI1N1wyXDE1NVwxXDI1N1wyXDE1NVwxXDI1N1wxMFwxNTUiKwotICAgICJcMVwyNTdcNFwxNTVcMVwyNTdcN1wxNTVcMVwwXDFcMjYyXDFcMTU3XDFcMTYwIisKLSAgICAiXDFcMTU3XDFcMjYzXDFcMTU3XDFcMjYyXDEwXDE1N1wxXDI2NFwxNlwxNTdcMVwyNjIiKwotICAgICJcMlwxNTdcMVwyNjJcMlwxNTdcMVwyNjJcMTBcMTU3XDFcMjYyXDRcMTU3XDFcMjYyIisKLSAgICAiXDdcMTU3XDFcMFwxXDI2NVwxXDE2MlwxXDE2M1wzXDE2MlwxXDI2NVwxXDE2MiIrCi0gICAgIlwxXDI2Nlw2XDE2MlwxXDI2N1wxNlwxNjJcMVwyNjVcMlwxNjJcMVwyNjVcMlwxNjIiKwotICAgICJcMVwyNjVcMTBcMTYyXDFcMjY1XDRcMTYyXDFcMjY1XDdcMTYyXDI0XDBcMVwyNzAiKwotICAgICJcNDdcMFwxXDI3MVwxXDUxXDFcMTY1XDFcNTFcMVwwXDFcNTFcMVwyNzEiKwotICAgICJcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MVwxXDAiKwotICAgICJcMVw1MVwxMFwwXDFcMjcxXDJcNTFcMVwyNzFcMlw1MVwxXDI3MVwyXDUxIisKLSAgICAiXDFcMFw0XDUxXDFcMFwxXDI3MVwxXDUxXDFcMFwxXDUxXDFcMCIrCi0gICAgIlwxXDI3MVwyXDUxXDZcMFwxXDI3MlwxXDU1XDFcMTY3XDFcNTVcMVwwIisKLSAgICAiXDFcNTVcMVwyNzJcMVw1NVwxXDBcMVw1NVw0XDBcMlw1NVwxXDAiKwotICAgICJcM1w1NVwxXDBcMVw1NVwxMFwwXDFcMjcyXDJcNTVcMVwyNzJcMlw1NSIrCi0gICAgIlwxXDI3MlwyXDU1XDFcMFw0XDU1XDFcMFwxXDI3MlwxXDU1XDFcMCIrCi0gICAgIlwxXDU1XDFcMFwxXDI3MlwyXDU1XDZcMFwxXDI3M1wxXDYyXDFcMTcxIisKLSAgICAiXDFcNjJcMVwwXDFcNjJcMVwyNzNcMVw2MlwxXDBcMVw2Mlw0XDAiKwotICAgICJcMlw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwXDFcMjczXDJcNjIiKwotICAgICJcMVwyNzNcMlw2MlwxXDI3M1wyXDYyXDFcMFw0XDYyXDFcMFwxXDI3MyIrCi0gICAgIlwxXDYyXDFcMFwxXDYyXDFcMFwxXDI3M1wyXDYyXDdcMFwxXDYyIisKLSAgICAiXDFcMTcxXDNcMFwxXDYyXDEyXDBcM1w2MlwxXDBcMVw2MlwxMFwwIisKLSAgICAiXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDZcMFwxXDI3NFwxXDcyXDFcMTc2XDFcNzJcMVwwXDFcNzIiKwotICAgICJcMVwyNzRcMVw3MlwxXDBcMVw3Mlw0XDBcMlw3MlwxXDBcM1w3MiIrCi0gICAgIlwxXDBcMVw3MlwxMFwwXDFcMjc0XDJcNzJcMVwyNzRcMlw3MlwxXDI3NCIrCi0gICAgIlwyXDcyXDFcMFw0XDcyXDFcMFwxXDI3NFwxXDcyXDFcMFwxXDcyIisKLSAgICAiXDFcMFwxXDI3NFwyXDcyXDZcMFwxXDI3NVwxXDEwMFwxXDIwMFwxXDEwMCIrCi0gICAgIlwxXDBcMVwxMDBcMVwyNzVcMVwxMDBcMVwwXDFcMTAwXDRcMFwyXDEwMCIrCi0gICAgIlwxXDBcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMVwyNzVcMlwxMDBcMVwyNzUiKwotICAgICJcMlwxMDBcMVwyNzVcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXDI3NVwxXDEwMCIrCi0gICAgIlwxXDBcMVwxMDBcMVwwXDFcMjc1XDJcMTAwXDZcMFwxXDI3NlwxXDIwMiIrCi0gICAgIlwxXDIwM1wxXDIwMlwxXDI3N1wxXDIwMlwxXDI3NlwxMFwyMDJcMVwzMDBcMTZcMjAyIisKLSAgICAiXDFcMjc2XDJcMjAyXDFcMjc2XDJcMjAyXDFcMjc2XDEwXDIwMlwxXDI3Nlw0XDIwMiIrCi0gICAgIlwxXDI3Nlw3XDIwMlwxXDBcMVwzMDFcMVwyMDVcMVwyMDZcM1wyMDVcMVwzMDEiKwotICAgICJcMVwyMDVcMVwzMDJcNlwyMDVcMVwzMDNcMTZcMjA1XDFcMzAxXDJcMjA1XDFcMzAxIisKLSAgICAiXDJcMjA1XDFcMzAxXDEwXDIwNVwxXDMwMVw0XDIwNVwxXDMwMVw3XDIwNVwxXDAiKwotICAgICJcMVwzMDRcMVwxMDVcMVwyMDdcMVwxMDVcMVwwXDFcMTA1XDFcMzA0XDFcMTA1IisKLSAgICAiXDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNSIrCi0gICAgIlwxMFwwXDFcMzA0XDJcMTA1XDFcMzA0XDJcMTA1XDFcMzA0XDJcMTA1XDFcMCIrCi0gICAgIlw0XDEwNVwxXDBcMVwzMDRcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXDMwNCIrCi0gICAgIlwyXDEwNVw2XDBcMlwyMTFcMVwyMTJcM1wwXDJcMjExXDExXDBcM1wyMTEiKwotICAgICJcMVwwXDFcMjExXDEwXDBcMTFcMjExXDFcMFw0XDIxMVwxXDBcMlwyMTEiKwotICAgICJcMVwwXDFcMjExXDFcMFwzXDIxMVw2XDBcMVwzMDVcMlwyMTFcMVwwIisKLSAgICAiXDJcMjExXDFcMzA1XDJcMjExXDFcMFw0XDIxMVwyXDBcMTZcMjExXDFcMzA1IisKLSAgICAiXDJcMjExXDFcMzA1XDJcMjExXDFcMzA1XDEwXDIxMVwxXDMwNVw0XDIxMVwxXDMwNSIrCi0gICAgIlw3XDIxMVwyXDBcMVwyMTFcMVwyMTJcM1wwXDFcMjExXDEyXDBcM1wyMTEiKwotICAgICJcMVwwXDFcMjExXDEwXDBcMTFcMjExXDFcMFw0XDIxMVwxXDBcMlwyMTEiKwotICAgICJcMVwwXDFcMjExXDFcMFwzXDIxMVw2XDBcMVwzMDZcMVwxMTNcMVwyMTYiKwotICAgICJcMVwxMTNcMVwwXDFcMTEzXDFcMzA2XDFcMTEzXDFcMFwxXDExM1w0XDAiKwotICAgICJcMlwxMTNcMVwwXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDBcMVwzMDZcMlwxMTMiKwotICAgICJcMVwzMDZcMlwxMTNcMVwzMDZcMlwxMTNcMVwwXDRcMTEzXDFcMFwxXDMwNiIrCi0gICAgIlwxXDExM1wxXDBcMVwxMTNcMVwwXDFcMzA2XDJcMTEzXDZcMFwxXDMwNyIrCi0gICAgIlwxXDIyMVwxXDIyMlwxXDIyMVwxXDMxMFwxXDIyMVwxXDMwN1wxMFwyMjFcMVwzMTEiKwotICAgICJcMTZcMjIxXDFcMzA3XDJcMjIxXDFcMzA3XDJcMjIxXDFcMzA3XDEwXDIyMVwxXDMwNyIrCi0gICAgIlw0XDIyMVwxXDMwN1w3XDIyMVwxXDBcMVwzMTJcMVwyMjRcMVwyMjVcM1wyMjQiKwotICAgICJcMVwzMTJcMVwyMjRcMVwzMTNcNlwyMjRcMVwzMTRcMTZcMjI0XDFcMzEyXDJcMjI0IisKLSAgICAiXDFcMzEyXDJcMjI0XDFcMzEyXDEwXDIyNFwxXDMxMlw0XDIyNFwxXDMxMlw3XDIyNCIrCi0gICAgIlwxXDBcMVwyMjZcMVwyMTFcMVwyMTJcM1wwXDFcMjExXDFcMjEzXDExXDAiKwotICAgICJcM1wyMTFcMVwwXDFcMjExXDEwXDBcMTFcMjExXDFcMFw0XDIxMVwxXDAiKwotICAgICJcMlwyMTFcMVwwXDFcMjExXDFcMFwzXDIxMVw0XDBcMVwyMTVcMVwwIisKLSAgICAiXDFcMzE1XDJcMjI3XDFcMFwyXDIyN1wxXDMxNVwyXDIyN1wxXDBcNFwyMjciKwotICAgICJcMlwwXDE2XDIyN1wxXDMxNVwyXDIyN1wxXDMxNVwyXDIyN1wxXDMxNVwxMFwyMjciKwotICAgICJcMVwzMTVcNFwyMjdcMVwzMTVcN1wyMjdcMVwwXDFcMzE2XDVcMFwxXDMxNiIrCi0gICAgIlwxNlwwXDJcMzE2XDdcMFwyXDMxNlwxXDBcMlwzMTZcMVwwXDJcMzE2IisKLSAgICAiXDdcMFwyXDMxNlwzXDBcMlwzMTZcN1wwXDJcMTEzXDFcMjE2XDNcMCIrCi0gICAgIlwyXDExM1wxMVwwXDJcMTEzXDFcMzE3XDFcMjE3XDFcMTEzXDEwXDBcMTFcMTEzIisKLSAgICAiXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwXDFcMTEzXDFcMFwzXDExMyIrCi0gICAgIlw1N1wwXDFcMzIwXDIxXDBcMVwzMjFcMVwyNVwxXDEzMVwxXDI1XDFcMCIrCi0gICAgIlwxXDI1XDFcMzIxXDFcMjVcMVwwXDFcMjVcNFwwXDJcMjVcMVwwIisKLSAgICAiXDNcMjVcMVwwXDFcMjVcMTBcMFwxXDMyMVwyXDI1XDFcMzIxXDJcMjUiKwotICAgICJcMVwzMjFcMlwyNVwxXDBcNFwyNVwxXDBcMVwzMjFcMVwyNVwxXDAiKwotICAgICJcMVwyNVwxXDBcMVwzMjFcMlwyNVw2XDBcMVwzMjJcMVwxMzRcMVwxMzUiKwotICAgICJcMVwxMzRcMVwwXDFcMTM0XDFcMzIyXDFcMTM0XDFcMFwxXDEzNFw0XDAiKwotICAgICJcMlwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwXDFcMzIyXDJcMTM0IisKLSAgICAiXDFcMzIyXDJcMTM0XDFcMzIyXDJcMTM0XDFcMFw0XDEzNFwxXDBcMVwzMjIiKwotICAgICJcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXDMyMlwyXDEzNFw2XDBcMVwzMjMiKwotICAgICJcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcMzIzXDFcMTM2XDFcMCIrCi0gICAgIlwxXDEzNlw0XDBcMlwxMzZcMVwwXDNcMTM2XDFcMFwxXDEzNlwxMFwwIisKLSAgICAiXDFcMzIzXDJcMTM2XDFcMzIzXDJcMTM2XDFcMzIzXDJcMTM2XDFcMFw0XDEzNiIrCi0gICAgIlwxXDBcMVwzMjNcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXDMyM1wyXDEzNiIrCi0gICAgIlwxNVwwXDFcMzI0XDYyXDBcMzRcMTQxXDFcMzI1XDFcMjQ0XDM1XDE0MVw0MlwwIisKLSAgICAiXDJcMzI2XDEwMlwwXDFcMzI3XDc1XDBcMlwzMzBcNzRcMFwxXDMzMVw3NlwwIisKLSAgICAiXDFcMzMyXDdcMFwxXDMzM1wxXDMzNFwxXDI1MlwxXDBcMVwyNTJcMVwzMzMiKwotICAgICJcMVwzMzVcMVwwXDFcMjUyXDRcMFwyXDI1MlwxXDBcM1wzMzNcMVwwIisKLSAgICAiXDFcMzMzXDEwXDBcMTFcMzMzXDFcMFw0XDMzM1wxXDBcMlwzMzNcMVwwIisKLSAgICAiXDFcMzMzXDFcMFwzXDMzM1w2XDBcMVwzMzZcMVwxNDdcMVwxNTBcMVwxNDciKwotICAgICJcMVwwXDFcMTQ3XDFcMzM2XDFcMTQ3XDFcMFwxXDE0N1w0XDBcMlwxNDciKwotICAgICJcMVwwXDNcMTQ3XDFcMjUyXDFcMTQ3XDEwXDBcMVwzMzZcMlwxNDdcMVwzMzYiKwotICAgICJcMlwxNDdcMVwzMzZcMlwxNDdcMVwwXDRcMTQ3XDFcMFwxXDMzNlwxXDE0NyIrCi0gICAgIlwxXDBcMVwxNDdcMVwwXDFcMzM2XDJcMTQ3XDZcMFwxXDMzN1wxXDE1MiIrCi0gICAgIlwxXDE1M1wxXDE1MlwxXDE1NFwxXDE1MlwxXDMzN1wyN1wxNTJcMVwzMzdcMlwxNTIiKwotICAgICJcMVwzMzdcMlwxNTJcMVwzMzdcMTBcMTUyXDFcMzM3XDRcMTUyXDFcMzM3XDdcMTUyIisKLSAgICAiXDFcMFwyXDE1MlwxXDE1M1wxXDBcMVwxNTRcMTJcMTUyXDFcMFw1MlwxNTIiKwotICAgICJcMVwwXDFcMzQwXDFcMTU1XDFcMTU2XDNcMTU1XDFcMzQwXDFcMTU1XDFcMTU0IisKLSAgICAiXDI1XDE1NVwxXDM0MFwyXDE1NVwxXDM0MFwyXDE1NVwxXDM0MFwxMFwxNTVcMVwzNDAiKwotICAgICJcNFwxNTVcMVwzNDBcN1wxNTVcMVwwXDJcMTU1XDFcMTU2XDFcMFw0XDE1NSIrCi0gICAgIlwxXDE1NFw2XDE1NVwxXDBcNTJcMTU1XDFcMFwxXDM0MVwxXDE1N1wxXDE2MCIrCi0gICAgIlwxXDE1N1wxXDE2MVwxXDE1N1wxXDM0MVwyN1wxNTdcMVwzNDFcMlwxNTdcMVwzNDEiKwotICAgICJcMlwxNTdcMVwzNDFcMTBcMTU3XDFcMzQxXDRcMTU3XDFcMzQxXDdcMTU3XDFcMCIrCi0gICAgIlwyXDE1N1wxXDE2MFwxXDBcMVwxNjFcMTJcMTU3XDFcMFw1MlwxNTdcMVwwIisKLSAgICAiXDFcMzQyXDFcMTYyXDFcMTYzXDNcMTYyXDFcMzQyXDFcMTYyXDFcMTYxXDI1XDE2MiIrCi0gICAgIlwxXDM0MlwyXDE2MlwxXDM0MlwyXDE2MlwxXDM0MlwxMFwxNjJcMVwzNDJcNFwxNjIiKwotICAgICJcMVwzNDJcN1wxNjJcMVwwXDJcMTYyXDFcMTYzXDFcMFw0XDE2MlwxXDE2MSIrCi0gICAgIlw2XDE2MlwxXDBcNTJcMTYyXDI1XDBcMVwzNDNcNDZcMFwxXDM0NFwxXDUxIisKLSAgICAiXDFcMTY1XDFcNTFcMVwwXDFcNTFcMVwzNDRcMVw1MVwxXDBcMVw1MSIrCi0gICAgIlw0XDBcMlw1MVwxXDBcM1w1MVwxXDBcMVw1MVwxMFwwXDFcMzQ0IisKLSAgICAiXDJcNTFcMVwzNDRcMlw1MVwxXDM0NFwyXDUxXDFcMFw0XDUxXDFcMCIrCi0gICAgIlwxXDM0NFwxXDUxXDFcMFwxXDUxXDFcMFwxXDM0NFwyXDUxXDZcMCIrCi0gICAgIlwxXDM0NVwxXDU1XDFcMTY3XDFcNTVcMVwwXDFcNTVcMVwzNDVcMVw1NSIrCi0gICAgIlwxXDBcMVw1NVw0XDBcMlw1NVwxXDBcM1w1NVwxXDBcMVw1NSIrCi0gICAgIlwxMFwwXDFcMzQ1XDJcNTVcMVwzNDVcMlw1NVwxXDM0NVwyXDU1XDFcMCIrCi0gICAgIlw0XDU1XDFcMFwxXDM0NVwxXDU1XDFcMFwxXDU1XDFcMFwxXDM0NSIrCi0gICAgIlwyXDU1XDZcMFwxXDM0NlwxXDYyXDFcMTcxXDFcNjJcMVwwXDFcNjIiKwotICAgICJcMVwzNDZcMVw2MlwxXDBcMVw2Mlw0XDBcMlw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxMFwwXDFcMzQ2XDJcNjJcMVwzNDZcMlw2MlwxXDM0NiIrCi0gICAgIlwyXDYyXDFcMFw0XDYyXDFcMFwxXDM0NlwxXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDM0NlwyXDYyXDZcMFwxXDM0N1wxXDcyXDFcMTc2XDFcNzIiKwotICAgICJcMVwwXDFcNzJcMVwzNDdcMVw3MlwxXDBcMVw3Mlw0XDBcMlw3MiIrCi0gICAgIlwxXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDFcMzQ3XDJcNzJcMVwzNDciKwotICAgICJcMlw3MlwxXDM0N1wyXDcyXDFcMFw0XDcyXDFcMFwxXDM0N1wxXDcyIisKLSAgICAiXDFcMFwxXDcyXDFcMFwxXDM0N1wyXDcyXDZcMFwxXDM1MFwxXDEwMCIrCi0gICAgIlwxXDIwMFwxXDEwMFwxXDBcMVwxMDBcMVwzNTBcMVwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMVwzNTAiKwotICAgICJcMlwxMDBcMVwzNTBcMlwxMDBcMVwzNTBcMlwxMDBcMVwwXDRcMTAwXDFcMCIrCi0gICAgIlwxXDM1MFwxXDEwMFwxXDBcMVwxMDBcMVwwXDFcMzUwXDJcMTAwXDZcMCIrCi0gICAgIlwxXDM1MVwxXDIwMlwxXDIwM1wxXDIwMlwxXDIwNFwxXDIwMlwxXDM1MVwyN1wyMDIiKwotICAgICJcMVwzNTFcMlwyMDJcMVwzNTFcMlwyMDJcMVwzNTFcMTBcMjAyXDFcMzUxXDRcMjAyIisKLSAgICAiXDFcMzUxXDdcMjAyXDFcMFwyXDIwMlwxXDIwM1wxXDBcMVwyMDRcMTJcMjAyIisKLSAgICAiXDFcMFw1MlwyMDJcMVwwXDFcMzUyXDFcMjA1XDFcMjA2XDNcMjA1XDFcMzUyIisKLSAgICAiXDFcMjA1XDFcMjA0XDI1XDIwNVwxXDM1MlwyXDIwNVwxXDM1MlwyXDIwNVwxXDM1MiIrCi0gICAgIlwxMFwyMDVcMVwzNTJcNFwyMDVcMVwzNTJcN1wyMDVcMVwwXDJcMjA1XDFcMjA2IisKLSAgICAiXDFcMFw0XDIwNVwxXDIwNFw2XDIwNVwxXDBcNTJcMjA1XDFcMFwxXDM1MyIrCi0gICAgIlwxXDEwNVwxXDIwN1wxXDEwNVwxXDBcMVwxMDVcMVwzNTNcMVwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDRcMFwyXDEwNVwxXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDAiKwotICAgICJcMVwzNTNcMlwxMDVcMVwzNTNcMlwxMDVcMVwzNTNcMlwxMDVcMVwwXDRcMTA1IisKLSAgICAiXDFcMFwxXDM1M1wxXDEwNVwxXDBcMVwxMDVcMVwwXDFcMzUzXDJcMTA1IisKLSAgICAiXDZcMFwxXDM1NFwxXDIxMVwxXDIxMlwxXDIxMVwxXDBcMVwyMTFcMVwzNTQiKwotICAgICJcMVwyMTFcMVwwXDFcMjExXDRcMFwyXDIxMVwxXDBcM1wyMTFcMVwwIisKLSAgICAiXDFcMjExXDEwXDBcMVwzNTRcMlwyMTFcMVwzNTRcMlwyMTFcMVwzNTRcMlwyMTEiKwotICAgICJcMVwwXDRcMjExXDFcMFwxXDM1NFwxXDIxMVwxXDBcMVwyMTFcMVwwIisKLSAgICAiXDFcMzU0XDJcMjExXDZcMFwxXDM1NVwxXDExM1wxXDIxNlwxXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVwzNTVcMVwxMTNcMVwwXDFcMTEzXDRcMFwyXDExM1wxXDAiKwotICAgICJcM1wxMTNcMVwyMTdcMVwxMTNcMTBcMFwxXDM1NVwyXDExM1wxXDM1NVwyXDExMyIrCi0gICAgIlwxXDM1NVwyXDExM1wxXDBcNFwxMTNcMVwwXDFcMzU1XDFcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcMVwzNTVcMlwxMTNcNlwwXDFcMzU2XDFcMjIxXDFcMjIyIisKLSAgICAiXDFcMjIxXDFcMjIzXDFcMjIxXDFcMzU2XDI3XDIyMVwxXDM1NlwyXDIyMVwxXDM1NiIrCi0gICAgIlwyXDIyMVwxXDM1NlwxMFwyMjFcMVwzNTZcNFwyMjFcMVwzNTZcN1wyMjFcMVwwIisKLSAgICAiXDJcMjIxXDFcMjIyXDFcMFwxXDIyM1wxMlwyMjFcMVwwXDUyXDIyMVwxXDAiKwotICAgICJcMVwzNTdcMVwyMjRcMVwyMjVcM1wyMjRcMVwzNTdcMVwyMjRcMVwyMjNcMjVcMjI0IisKLSAgICAiXDFcMzU3XDJcMjI0XDFcMzU3XDJcMjI0XDFcMzU3XDEwXDIyNFwxXDM1N1w0XDIyNCIrCi0gICAgIlwxXDM1N1w3XDIyNFwxXDBcMlwyMjRcMVwyMjVcMVwwXDRcMjI0XDFcMjIzIisKLSAgICAiXDZcMjI0XDFcMFw1MlwyMjRcMVwwXDFcMzYwXDFcMjI3XDFcMjMwXDFcMjI3IisKLSAgICAiXDFcMFwxXDIyN1wxXDM2MFwxXDIyN1wxXDBcMVwyMjdcNFwwXDJcMjI3IisKLSAgICAiXDFcMFwzXDIyN1wxXDBcMVwyMjdcMTBcMFwxXDM2MFwyXDIyN1wxXDM2MCIrCi0gICAgIlwyXDIyN1wxXDM2MFwyXDIyN1wxXDBcNFwyMjdcMVwwXDFcMzYwXDFcMjI3IisKLSAgICAiXDFcMFwxXDIyN1wxXDBcMVwzNjBcMlwyMjdcNlwwXDFcMzYxXDVcMCIrCi0gICAgIlwxXDM2MVwxXDM2MlwxNVwwXDJcMzYxXDdcMFwyXDM2MVwxXDBcMlwzNjEiKwotICAgICJcMVwwXDJcMzYxXDdcMFwyXDM2MVwzXDBcMlwzNjFcN1wwXDJcMTEzIisKLSAgICAiXDFcMjE2XDNcMFwyXDExM1wxMVwwXDNcMTEzXDFcMzYzXDFcMTEzXDEwXDAiKwotICAgICJcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwXDFcMTEzXDFcMCIrCi0gICAgIlwzXDExM1w2MFwwXDFcMzY0XDIwXDBcMVwzNjVcMVwyNVwxXDEzMVwxXDI1IisKLSAgICAiXDFcMFwxXDI1XDFcMzY1XDFcMjVcMVwwXDFcMjVcNFwwXDJcMjUiKwotICAgICJcMVwwXDNcMjVcMVwwXDFcMjVcMTBcMFwxXDM2NVwyXDI1XDFcMzY1IisKLSAgICAiXDJcMjVcMVwzNjVcMlwyNVwxXDBcNFwyNVwxXDBcMVwzNjVcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVwxXDBcMVwzNjVcMlwyNVw2XDBcMVwzNjZcMVwxMzQiKwotICAgICJcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcMzY2XDFcMTM0XDFcMFwxXDEzNCIrCi0gICAgIlw0XDBcMlwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwXDFcMzY2IisKLSAgICAiXDJcMTM0XDFcMzY2XDJcMTM0XDFcMzY2XDJcMTM0XDFcMFw0XDEzNFwxXDAiKwotICAgICJcMVwzNjZcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXDM2NlwyXDEzNFw2XDAiKwotICAgICJcMVwzNjdcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcMzY3XDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlw0XDBcMlwxMzZcMVwwXDNcMTM2XDFcMFwxXDEzNiIrCi0gICAgIlwxMFwwXDFcMzY3XDJcMTM2XDFcMzY3XDJcMTM2XDFcMzY3XDJcMTM2XDFcMCIrCi0gICAgIlw0XDEzNlwxXDBcMVwzNjdcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXDM2NyIrCi0gICAgIlwyXDEzNlwzMFwwXDFcMzcwXDEyM1wwXDFcMzcxXDY3XDBcMVwzNzJcNjZcMCIrCi0gICAgIlwyXDM3M1w3M1wwXDFcMzc0XDI0XDBcMlwzMzNcMVwzMzRcMVwzNzVcMVwwIisKLSAgICAiXDFcMzc1XDJcMzMzXDFcMFwxXDM3NVwxXDM3NlwzXDBcMlwzNzVcMVwwIisKLSAgICAiXDNcMzMzXDFcMFwxXDMzM1wxMFwwXDExXDMzM1wxXDBcNFwzMzNcMVwwIisKLSAgICAiXDJcMzMzXDFcMFwxXDMzM1wxXDBcM1wzMzNcNlwwXDFcMzc3XDJcMzMzIisKLSAgICAiXDFcMFwyXDMzM1wxXDM3N1wyXDMzM1wxXDBcNFwzMzNcMlwwXDE2XDMzMyIrCi0gICAgIlwxXDM3N1wyXDMzM1wxXDM3N1wyXDMzM1wxXDM3N1wxMFwzMzNcMVwzNzdcNFwzMzMiKwotICAgICJcMVwzNzdcN1wzMzNcMlwwXDFcMzMzXDFcMzM0XDNcMFwxXDMzM1wxMlwwIisKLSAgICAiXDNcMzMzXDFcMFwxXDMzM1wxMFwwXDExXDMzM1wxXDBcNFwzMzNcMVwwIisKLSAgICAiXDJcMzMzXDFcMFwxXDMzM1wxXDBcM1wzMzNcNlwwXDFcdTAxMDBcMVwxNDciKwotICAgICJcMVwxNTBcMVwxNDdcMVwwXDFcMTQ3XDFcdTAxMDBcMVwxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDRcMFwyXDE0N1wxXDBcM1wxNDdcMVwyNTJcMVwxNDdcMTBcMFwxXHUwMTAwIisKLSAgICAiXDJcMTQ3XDFcdTAxMDBcMlwxNDdcMVx1MDEwMFwyXDE0N1wxXDBcNFwxNDdcMVwwIisKLSAgICAiXDFcdTAxMDBcMVwxNDdcMVwwXDFcMTQ3XDFcMFwxXHUwMTAwXDJcMTQ3XDZcMCIrCi0gICAgIlwxXHUwMTAxXDFcMTUyXDFcMTUzXDFcMTUyXDFcMTU0XDFcMTUyXDFcdTAxMDFcMjdcMTUyIisKLSAgICAiXDFcdTAxMDFcMlwxNTJcMVx1MDEwMVwyXDE1MlwxXHUwMTAxXDEwXDE1MlwxXHUwMTAxXDRcMTUyIisKLSAgICAiXDFcdTAxMDFcN1wxNTJcMVwwXDFcdTAxMDJcMVwxNTVcMVwxNTZcM1wxNTVcMVx1MDEwMiIrCi0gICAgIlwxXDE1NVwxXDE1NFwyNVwxNTVcMVx1MDEwMlwyXDE1NVwxXHUwMTAyXDJcMTU1XDFcdTAxMDIiKwotICAgICJcMTBcMTU1XDFcdTAxMDJcNFwxNTVcMVx1MDEwMlw3XDE1NVwxXDBcMVx1MDEwM1wxXDE1NyIrCi0gICAgIlwxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTAzXDI3XDE1N1wxXHUwMTAzXDJcMTU3IisKLSAgICAiXDFcdTAxMDNcMlwxNTdcMVx1MDEwM1wxMFwxNTdcMVx1MDEwM1w0XDE1N1wxXHUwMTAzXDdcMTU3IisKLSAgICAiXDFcMFwxXHUwMTA0XDFcMTYyXDFcMTYzXDNcMTYyXDFcdTAxMDRcMVwxNjJcMVwxNjEiKwotICAgICJcMjVcMTYyXDFcdTAxMDRcMlwxNjJcMVx1MDEwNFwyXDE2MlwxXHUwMTA0XDEwXDE2MlwxXHUwMTA0IisKLSAgICAiXDRcMTYyXDFcdTAxMDRcN1wxNjJcMVwwXDJcdTAxMDVcMVx1MDEwNlwxXDM0M1wxXHUwMTA3IisKLSAgICAiXDFcMzQzXDJcdTAxMDVcMVx1MDEwOFwxXDM0M1wxXHUwMTA5XDNcdTAxMDVcMlwzNDNcNFx1MDEwNSIrCi0gICAgIlwxXDBcNDVcdTAxMDVcMVwwXDFcdTAxMGFcMVw1MVwxXDE2NVwxXDUxXDFcMCIrCi0gICAgIlwxXDUxXDFcdTAxMGFcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDAiKwotICAgICJcM1w1MVwxXDBcMVw1MVwxMFwwXDFcdTAxMGFcMlw1MVwxXHUwMTBhXDJcNTEiKwotICAgICJcMVx1MDEwYVwyXDUxXDFcMFw0XDUxXDFcMFwxXHUwMTBhXDFcNTFcMVwwIisKLSAgICAiXDFcNTFcMVwwXDFcdTAxMGFcMlw1MVw2XDBcMVx1MDEwYlwxXDU1XDFcMTY3IisKLSAgICAiXDFcNTVcMVwwXDFcNTVcMVx1MDEwYlwxXDU1XDFcMFwxXDU1XDRcMCIrCi0gICAgIlwyXDU1XDFcMFwzXDU1XDFcMFwxXDU1XDEwXDBcMVx1MDEwYlwyXDU1IisKLSAgICAiXDFcdTAxMGJcMlw1NVwxXHUwMTBiXDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxMGIiKwotICAgICJcMVw1NVwxXDBcMVw1NVwxXDBcMVx1MDEwYlwyXDU1XDZcMFwxXHUwMTBjIisKLSAgICAiXDFcNjJcMVwxNzFcMVw2MlwxXDBcMVw2MlwxXHUwMTBjXDFcNjJcMVwwIisKLSAgICAiXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMCIrCi0gICAgIlwxXHUwMTBjXDJcNjJcMVx1MDEwY1wyXDYyXDFcdTAxMGNcMlw2MlwxXDBcNFw2MiIrCi0gICAgIlwxXDBcMVx1MDEwY1wxXDYyXDFcMFwxXDYyXDFcMFwxXHUwMTBjXDJcNjIiKwotICAgICJcNlwwXDFcdTAxMGRcMVw3MlwxXDE3NlwxXDcyXDFcMFwxXDcyXDFcdTAxMGQiKwotICAgICJcMVw3MlwxXDBcMVw3Mlw0XDBcMlw3MlwxXDBcM1w3MlwxXDAiKwotICAgICJcMVw3MlwxMFwwXDFcdTAxMGRcMlw3MlwxXHUwMTBkXDJcNzJcMVx1MDEwZFwyXDcyIisKLSAgICAiXDFcMFw0XDcyXDFcMFwxXHUwMTBkXDFcNzJcMVwwXDFcNzJcMVwwIisKLSAgICAiXDFcdTAxMGRcMlw3Mlw2XDBcMVx1MDEwZVwxXDEwMFwxXDIwMFwxXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMVx1MDEwZVwxXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMCIrCi0gICAgIlwzXDEwMFwxXDBcMVwxMDBcMTBcMFwxXHUwMTBlXDJcMTAwXDFcdTAxMGVcMlwxMDAiKwotICAgICJcMVx1MDEwZVwyXDEwMFwxXDBcNFwxMDBcMVwwXDFcdTAxMGVcMVwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDFcMFwxXHUwMTBlXDJcMTAwXDZcMFwxXHUwMTBmXDFcMjAyXDFcMjAzIisKLSAgICAiXDFcMjAyXDFcMjA0XDFcMjAyXDFcdTAxMGZcMjdcMjAyXDFcdTAxMGZcMlwyMDJcMVx1MDEwZiIrCi0gICAgIlwyXDIwMlwxXHUwMTBmXDEwXDIwMlwxXHUwMTBmXDRcMjAyXDFcdTAxMGZcN1wyMDJcMVwwIisKLSAgICAiXDFcdTAxMTBcMVwyMDVcMVwyMDZcM1wyMDVcMVx1MDExMFwxXDIwNVwxXDIwNFwyNVwyMDUiKwotICAgICJcMVx1MDExMFwyXDIwNVwxXHUwMTEwXDJcMjA1XDFcdTAxMTBcMTBcMjA1XDFcdTAxMTBcNFwyMDUiKwotICAgICJcMVx1MDExMFw3XDIwNVwxXDBcMVx1MDExMVwxXDEwNVwxXDIwN1wxXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMVx1MDExMVwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMCIrCi0gICAgIlwzXDEwNVwxXDBcMVwxMDVcMTBcMFwxXHUwMTExXDJcMTA1XDFcdTAxMTFcMlwxMDUiKwotICAgICJcMVx1MDExMVwyXDEwNVwxXDBcNFwxMDVcMVwwXDFcdTAxMTFcMVwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDFcMFwxXHUwMTExXDJcMTA1XDZcMFwxXHUwMTEyXDFcMjExXDFcMjEyIisKLSAgICAiXDFcMjExXDFcMFwxXDIxMVwxXHUwMTEyXDFcMjExXDFcMFwxXDIxMVw0XDAiKwotICAgICJcMlwyMTFcMVwwXDNcMjExXDFcMFwxXDIxMVwxMFwwXDFcdTAxMTJcMlwyMTEiKwotICAgICJcMVx1MDExMlwyXDIxMVwxXHUwMTEyXDJcMjExXDFcMFw0XDIxMVwxXDBcMVx1MDExMiIrCi0gICAgIlwxXDIxMVwxXDBcMVwyMTFcMVwwXDFcdTAxMTJcMlwyMTFcNlwwXDFcdTAxMTMiKwotICAgICJcMVwxMTNcMVwyMTZcMVwxMTNcMVwwXDFcMTEzXDFcdTAxMTNcMVwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDRcMFwyXDExM1wxXDBcM1wxMTNcMVwyMTdcMVwxMTNcMTBcMCIrCi0gICAgIlwxXHUwMTEzXDJcMTEzXDFcdTAxMTNcMlwxMTNcMVx1MDExM1wyXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDFcdTAxMTNcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXHUwMTEzXDJcMTEzIisKLSAgICAiXDZcMFwxXHUwMTE0XDFcMjIxXDFcMjIyXDFcMjIxXDFcMjIzXDFcMjIxXDFcdTAxMTQiKwotICAgICJcMjdcMjIxXDFcdTAxMTRcMlwyMjFcMVx1MDExNFwyXDIyMVwxXHUwMTE0XDEwXDIyMVwxXHUwMTE0IisKLSAgICAiXDRcMjIxXDFcdTAxMTRcN1wyMjFcMVwwXDFcdTAxMTVcMVwyMjRcMVwyMjVcM1wyMjQiKwotICAgICJcMVx1MDExNVwxXDIyNFwxXDIyM1wyNVwyMjRcMVx1MDExNVwyXDIyNFwxXHUwMTE1XDJcMjI0IisKLSAgICAiXDFcdTAxMTVcMTBcMjI0XDFcdTAxMTVcNFwyMjRcMVx1MDExNVw3XDIyNFwxXDBcMVx1MDExNiIrCi0gICAgIlwxXDIyN1wxXDIzMFwxXDIyN1wxXDBcMVwyMjdcMVx1MDExNlwxXDIyN1wxXDAiKwotICAgICJcMVwyMjdcNFwwXDJcMjI3XDFcMFwzXDIyN1wxXDBcMVwyMjdcMTBcMCIrCi0gICAgIlwxXHUwMTE2XDJcMjI3XDFcdTAxMTZcMlwyMjdcMVx1MDExNlwyXDIyN1wxXDBcNFwyMjciKwotICAgICJcMVwwXDFcdTAxMTZcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXHUwMTE2XDJcMjI3IisKLSAgICAiXDZcMFwxXHUwMTE3XDVcMFwxXHUwMTE3XDFcMzYyXDE1XDBcMlx1MDExN1w3XDAiKwotICAgICJcMlx1MDExN1wxXDBcMlx1MDExN1wxXDBcMlx1MDExN1w3XDBcMlx1MDExN1wzXDAiKwotICAgICJcMlx1MDExN1w3XDBcMVx1MDExOFw1XDBcMVx1MDExOFwxNlwwXDJcdTAxMThcN1wwIisKLSAgICAiXDJcdTAxMThcMVwwXDJcdTAxMThcMVwwXDJcdTAxMThcN1wwXDJcdTAxMThcM1wwIisKLSAgICAiXDJcdTAxMThcN1wwXDJcdTAxMTlcMVx1MDExYVwxXHUwMTFiXDFcdTAxMWNcMVx1MDExYlwyXHUwMTE5IisKLSAgICAiXDFcdTAxMWRcMVx1MDExYlwxXHUwMTFlXDNcdTAxMTlcMlx1MDExYlw0XHUwMTE5XDFcMFw0NVx1MDExOSIrCi0gICAgIlw1NFwwXDFcdTAxMWZcMTdcMFwxXHUwMTIwXDFcMjVcMVwxMzFcMVwyNVwxXDAiKwotICAgICJcMVwyNVwxXHUwMTIwXDFcMjVcMVwwXDFcMjVcNFwwXDJcMjVcMVwwIisKLSAgICAiXDNcMjVcMVwwXDFcMjVcMTBcMFwxXHUwMTIwXDJcMjVcMVx1MDEyMFwyXDI1IisKLSAgICAiXDFcdTAxMjBcMlwyNVwxXDBcNFwyNVwxXDBcMVx1MDEyMFwxXDI1XDFcMCIrCi0gICAgIlwxXDI1XDFcMFwxXHUwMTIwXDJcMjVcNlwwXDFcdTAxMjFcMVwxMzRcMVwxMzUiKwotICAgICJcMVwxMzRcMVwwXDFcMTM0XDFcdTAxMjFcMVwxMzRcMVwwXDFcMTM0XDRcMCIrCi0gICAgIlwyXDEzNFwxXDBcM1wxMzRcMVwwXDFcMTM0XDEwXDBcMVx1MDEyMVwyXDEzNCIrCi0gICAgIlwxXHUwMTIxXDJcMTM0XDFcdTAxMjFcMlwxMzRcMVwwXDRcMTM0XDFcMFwxXHUwMTIxIisKLSAgICAiXDFcMTM0XDFcMFwxXDEzNFwxXDBcMVx1MDEyMVwyXDEzNFw2XDBcMVx1MDEyMiIrCi0gICAgIlwxXDEzNlwxXDEzN1wxXDEzNlwxXDBcMVwxMzZcMVx1MDEyMlwxXDEzNlwxXDAiKwotICAgICJcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzZcMTBcMCIrCi0gICAgIlwxXHUwMTIyXDJcMTM2XDFcdTAxMjJcMlwxMzZcMVx1MDEyMlwyXDEzNlwxXDBcNFwxMzYiKwotICAgICJcMVwwXDFcdTAxMjJcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXHUwMTIyXDJcMTM2IisKLSAgICAiXDUxXDBcMVx1MDEyM1w1MVwwXDFcdTAxMjRcMTExXDBcMlx1MDEyNVwzN1wwXDFcdTAxMjYiKwotICAgICJcNjZcMFwxXDM3NVwxXDBcMVwzNzVcM1wwXDFcMzc1XDFcMzc2XDNcMCIrCi0gICAgIlwyXDM3NVw1M1wwXDFcdTAxMjdcMVwzMzNcMVwzMzRcMVwzMzNcMVwwXDFcMzMzIisKLSAgICAiXDFcdTAxMjdcMVwzMzNcMVwwXDFcMzMzXDFcMzc2XDNcMFwyXDMzM1wxXDAiKwotICAgICJcM1wzMzNcMVwwXDFcMzMzXDEwXDBcMVx1MDEyN1wyXDMzM1wxXHUwMTI3XDJcMzMzIisKLSAgICAiXDFcdTAxMjdcMlwzMzNcMVwwXDRcMzMzXDFcMFwxXHUwMTI3XDFcMzMzXDFcMCIrCi0gICAgIlwxXDMzM1wxXDBcMVx1MDEyN1wyXDMzM1w2XDBcMVx1MDEyOFwxXDE0N1wxXDE1MCIrCi0gICAgIlwxXDE0N1wxXDBcMVwxNDdcMVx1MDEyOFwxXDE0N1wxXDBcMVwxNDdcNFwwIisKLSAgICAiXDJcMTQ3XDFcMFwzXDE0N1wxXDI1MlwxXDE0N1wxMFwwXDFcdTAxMjhcMlwxNDciKwotICAgICJcMVx1MDEyOFwyXDE0N1wxXHUwMTI4XDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVx1MDEyOCIrCi0gICAgIlwxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxMjhcMlwxNDdcNlwwXDFcdTAxMjkiKwotICAgICJcMVwxNTJcMVwxNTNcMVwxNTJcMVwxNTRcMVwxNTJcMVx1MDEyOVwyN1wxNTJcMVx1MDEyOSIrCi0gICAgIlwyXDE1MlwxXHUwMTI5XDJcMTUyXDFcdTAxMjlcMTBcMTUyXDFcdTAxMjlcNFwxNTJcMVx1MDEyOSIrCi0gICAgIlw3XDE1MlwxXDBcMVx1MDEyYVwxXDE1NVwxXDE1NlwzXDE1NVwxXHUwMTJhXDFcMTU1IisKLSAgICAiXDFcMTU0XDI1XDE1NVwxXHUwMTJhXDJcMTU1XDFcdTAxMmFcMlwxNTVcMVx1MDEyYVwxMFwxNTUiKwotICAgICJcMVx1MDEyYVw0XDE1NVwxXHUwMTJhXDdcMTU1XDFcMFwxXHUwMTJiXDFcMTU3XDFcMTYwIisKLSAgICAiXDFcMTU3XDFcMTYxXDFcMTU3XDFcdTAxMmJcMjdcMTU3XDFcdTAxMmJcMlwxNTdcMVx1MDEyYiIrCi0gICAgIlwyXDE1N1wxXHUwMTJiXDEwXDE1N1wxXHUwMTJiXDRcMTU3XDFcdTAxMmJcN1wxNTdcMVwwIisKLSAgICAiXDFcdTAxMmNcMVwxNjJcMVwxNjNcM1wxNjJcMVx1MDEyY1wxXDE2MlwxXDE2MVwyNVwxNjIiKwotICAgICJcMVx1MDEyY1wyXDE2MlwxXHUwMTJjXDJcMTYyXDFcdTAxMmNcMTBcMTYyXDFcdTAxMmNcNFwxNjIiKwotICAgICJcMVx1MDEyY1w3XDE2MlwxXDBcMlx1MDEwNVwxXHUwMTA2XDFcdTAxMmRcMVwwXDNcdTAxMDUiKwotICAgICJcMVwwXDFcdTAxMmRcMVx1MDEwOVwzXHUwMTA1XDJcdTAxMmRcNFx1MDEwNVwxXDBcNDVcdTAxMDUiKwotICAgICJcMVwwXDFcdTAxMmVcMVx1MDEwNVwxXHUwMTA2XDFcdTAxMmRcMlx1MDEwNVwxXHUwMTJlXDJcdTAxMDUiKwotICAgICJcMVx1MDEyZFwxXHUwMTJmXDNcdTAxMDVcMlx1MDEyZFwxNlx1MDEwNVwxXHUwMTJlXDJcdTAxMDVcMVx1MDEyZSIrCi0gICAgIlwyXHUwMTA1XDFcdTAxMmVcMTBcdTAxMDVcMVx1MDEyZVw0XHUwMTA1XDFcdTAxMmVcN1x1MDEwNVwxXDAiKwotICAgICJcMlx1MDEwN1wxXHUwMTMwXDFcMFwxXHUwMTJkXDExXHUwMTA3XDJcMFw1Mlx1MDEwN1wxXDAiKwotICAgICJcMlx1MDEwOFwxXHUwMTMxXDFcMFw0XHUwMTA4XDFcdTAxMmRcNVx1MDEwOFwyXDBcNTJcdTAxMDgiKwotICAgICJcMVwwXDFcdTAxMzJcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcdTAxMzIiKwotICAgICJcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MVwxXDAiKwotICAgICJcMVw1MVwxMFwwXDFcdTAxMzJcMlw1MVwxXHUwMTMyXDJcNTFcMVx1MDEzMlwyXDUxIisKLSAgICAiXDFcMFw0XDUxXDFcMFwxXHUwMTMyXDFcNTFcMVwwXDFcNTFcMVwwIisKLSAgICAiXDFcdTAxMzJcMlw1MVw2XDBcMVx1MDEzM1wxXDU1XDFcMTY3XDFcNTVcMVwwIisKLSAgICAiXDFcNTVcMVx1MDEzM1wxXDU1XDFcMFwxXDU1XDRcMFwyXDU1XDFcMCIrCi0gICAgIlwzXDU1XDFcMFwxXDU1XDEwXDBcMVx1MDEzM1wyXDU1XDFcdTAxMzNcMlw1NSIrCi0gICAgIlwxXHUwMTMzXDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxMzNcMVw1NVwxXDAiKwotICAgICJcMVw1NVwxXDBcMVx1MDEzM1wyXDU1XDZcMFwxXHUwMTM0XDFcNjJcMVwxNzEiKwotICAgICJcMVw2MlwxXDBcMVw2MlwxXHUwMTM0XDFcNjJcMVwwXDFcNjJcNFwwIisKLSAgICAiXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMFwxXHUwMTM0XDJcNjIiKwotICAgICJcMVx1MDEzNFwyXDYyXDFcdTAxMzRcMlw2MlwxXDBcNFw2MlwxXDBcMVx1MDEzNCIrCi0gICAgIlwxXDYyXDFcMFwxXDYyXDFcMFwxXHUwMTM0XDJcNjJcNlwwXDFcdTAxMzUiKwotICAgICJcMVw3MlwxXDE3NlwxXDcyXDFcMFwxXDcyXDFcdTAxMzVcMVw3MlwxXDAiKwotICAgICJcMVw3Mlw0XDBcMlw3MlwxXDBcM1w3MlwxXDBcMVw3MlwxMFwwIisKLSAgICAiXDFcdTAxMzVcMlw3MlwxXHUwMTM1XDJcNzJcMVx1MDEzNVwyXDcyXDFcMFw0XDcyIisKLSAgICAiXDFcMFwxXHUwMTM1XDFcNzJcMVwwXDFcNzJcMVwwXDFcdTAxMzVcMlw3MiIrCi0gICAgIlw2XDBcMVx1MDEzNlwxXDEwMFwxXDIwMFwxXDEwMFwxXDBcMVwxMDBcMVx1MDEzNiIrCi0gICAgIlwxXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMFwzXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMTBcMFwxXHUwMTM2XDJcMTAwXDFcdTAxMzZcMlwxMDBcMVx1MDEzNlwyXDEwMCIrCi0gICAgIlwxXDBcNFwxMDBcMVwwXDFcdTAxMzZcMVwxMDBcMVwwXDFcMTAwXDFcMCIrCi0gICAgIlwxXHUwMTM2XDJcMTAwXDZcMFwxXHUwMTM3XDFcMjAyXDFcMjAzXDFcMjAyXDFcMjA0IisKLSAgICAiXDFcMjAyXDFcdTAxMzdcMjdcMjAyXDFcdTAxMzdcMlwyMDJcMVx1MDEzN1wyXDIwMlwxXHUwMTM3IisKLSAgICAiXDEwXDIwMlwxXHUwMTM3XDRcMjAyXDFcdTAxMzdcN1wyMDJcMVwwXDFcdTAxMzhcMVwyMDUiKwotICAgICJcMVwyMDZcM1wyMDVcMVx1MDEzOFwxXDIwNVwxXDIwNFwyNVwyMDVcMVx1MDEzOFwyXDIwNSIrCi0gICAgIlwxXHUwMTM4XDJcMjA1XDFcdTAxMzhcMTBcMjA1XDFcdTAxMzhcNFwyMDVcMVx1MDEzOFw3XDIwNSIrCi0gICAgIlwxXDBcMVx1MDEzOVwxXDEwNVwxXDIwN1wxXDEwNVwxXDBcMVwxMDVcMVx1MDEzOSIrCi0gICAgIlwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMFwzXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMTBcMFwxXHUwMTM5XDJcMTA1XDFcdTAxMzlcMlwxMDVcMVx1MDEzOVwyXDEwNSIrCi0gICAgIlwxXDBcNFwxMDVcMVwwXDFcdTAxMzlcMVwxMDVcMVwwXDFcMTA1XDFcMCIrCi0gICAgIlwxXHUwMTM5XDJcMTA1XDZcMFwxXHUwMTNhXDFcMjExXDFcMjEyXDFcMjExXDFcMCIrCi0gICAgIlwxXDIxMVwxXHUwMTNhXDFcMjExXDFcMFwxXDIxMVw0XDBcMlwyMTFcMVwwIisKLSAgICAiXDNcMjExXDFcMFwxXDIxMVwxMFwwXDFcdTAxM2FcMlwyMTFcMVx1MDEzYVwyXDIxMSIrCi0gICAgIlwxXHUwMTNhXDJcMjExXDFcMFw0XDIxMVwxXDBcMVx1MDEzYVwxXDIxMVwxXDAiKwotICAgICJcMVwyMTFcMVwwXDFcdTAxM2FcMlwyMTFcNlwwXDFcdTAxM2JcMVwxMTNcMVwyMTYiKwotICAgICJcMVwxMTNcMVwwXDFcMTEzXDFcdTAxM2JcMVwxMTNcMVwwXDFcMTEzXDRcMCIrCi0gICAgIlwyXDExM1wxXDBcM1wxMTNcMVwyMTdcMVwxMTNcMTBcMFwxXHUwMTNiXDJcMTEzIisKLSAgICAiXDFcdTAxM2JcMlwxMTNcMVx1MDEzYlwyXDExM1wxXDBcNFwxMTNcMVwwXDFcdTAxM2IiKwotICAgICJcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXHUwMTNiXDJcMTEzXDZcMFwxXHUwMTNjIisKLSAgICAiXDFcMjIxXDFcMjIyXDFcMjIxXDFcMjIzXDFcMjIxXDFcdTAxM2NcMjdcMjIxXDFcdTAxM2MiKwotICAgICJcMlwyMjFcMVx1MDEzY1wyXDIyMVwxXHUwMTNjXDEwXDIyMVwxXHUwMTNjXDRcMjIxXDFcdTAxM2MiKwotICAgICJcN1wyMjFcMVwwXDFcdTAxM2RcMVwyMjRcMVwyMjVcM1wyMjRcMVx1MDEzZFwxXDIyNCIrCi0gICAgIlwxXDIyM1wyNVwyMjRcMVx1MDEzZFwyXDIyNFwxXHUwMTNkXDJcMjI0XDFcdTAxM2RcMTBcMjI0IisKLSAgICAiXDFcdTAxM2RcNFwyMjRcMVx1MDEzZFw3XDIyNFwxXDBcMVx1MDEzZVwxXDIyN1wxXDIzMCIrCi0gICAgIlwxXDIyN1wxXDBcMVwyMjdcMVx1MDEzZVwxXDIyN1wxXDBcMVwyMjdcNFwwIisKLSAgICAiXDJcMjI3XDFcMFwzXDIyN1wxXDBcMVwyMjdcMTBcMFwxXHUwMTNlXDJcMjI3IisKLSAgICAiXDFcdTAxM2VcMlwyMjdcMVx1MDEzZVwyXDIyN1wxXDBcNFwyMjdcMVwwXDFcdTAxM2UiKwotICAgICJcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXHUwMTNlXDJcMjI3XDZcMFwxXHUwMTNmIisKLSAgICAiXDVcMFwxXHUwMTNmXDFcMzYyXDE1XDBcMlx1MDEzZlw3XDBcMlx1MDEzZlwxXDAiKwotICAgICJcMlx1MDEzZlwxXDBcMlx1MDEzZlw3XDBcMlx1MDEzZlwzXDBcMlx1MDEzZlw3XDAiKwotICAgICJcMVx1MDE0MFw1XDBcMVx1MDE0MFwxNlwwXDJcdTAxNDBcN1wwXDJcdTAxNDBcMVwwIisKLSAgICAiXDJcdTAxNDBcMVwwXDJcdTAxNDBcN1wwXDJcdTAxNDBcM1wwXDJcdTAxNDBcN1wwIisKLSAgICAiXDJcdTAxMTlcMVx1MDExYVwxXHUwMTQxXDFcMFwzXHUwMTE5XDFcMFwxXHUwMTQxXDFcdTAxMWUiKwotICAgICJcM1x1MDExOVwyXHUwMTQxXDRcdTAxMTlcMVwwXDQ1XHUwMTE5XDFcMFwxXHUwMTQyXDFcdTAxMTkiKwotICAgICJcMVx1MDExYVwxXHUwMTQxXDJcdTAxMTlcMVx1MDE0MlwyXHUwMTE5XDFcdTAxNDFcMVx1MDE0M1wzXHUwMTE5IisKLSAgICAiXDJcdTAxNDFcMTZcdTAxMTlcMVx1MDE0MlwyXHUwMTE5XDFcdTAxNDJcMlx1MDExOVwxXHUwMTQyXDEwXHUwMTE5IisKLSAgICAiXDFcdTAxNDJcNFx1MDExOVwxXHUwMTQyXDdcdTAxMTlcMVwwXDJcdTAxMWNcMVx1MDE0NFwxXDAiKwotICAgICJcMVx1MDE0MVwxMVx1MDExY1wyXDBcNTJcdTAxMWNcMVwwXDJcdTAxMWRcMVx1MDE0NVwxXDAiKwotICAgICJcNFx1MDExZFwxXHUwMTQxXDVcdTAxMWRcMlwwXDUyXHUwMTFkXDIzXDBcMVx1MDE0Nlw1MFwwIisKLSAgICAiXDFcdTAxNDdcMVwyNVwxXDEzMVwxXDI1XDFcMFwxXDI1XDFcdTAxNDdcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVw0XDBcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNSIrCi0gICAgIlwxMFwwXDFcdTAxNDdcMlwyNVwxXHUwMTQ3XDJcMjVcMVx1MDE0N1wyXDI1XDFcMCIrCi0gICAgIlw0XDI1XDFcMFwxXHUwMTQ3XDFcMjVcMVwwXDFcMjVcMVwwXDFcdTAxNDciKwotICAgICJcMlwyNVw2XDBcMVx1MDE0OFwxXDEzNFwxXDEzNVwxXDEzNFwxXDBcMVwxMzQiKwotICAgICJcMVx1MDE0OFwxXDEzNFwxXDBcMVwxMzRcNFwwXDJcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcMTBcMFwxXHUwMTQ4XDJcMTM0XDFcdTAxNDhcMlwxMzRcMVx1MDE0OCIrCi0gICAgIlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcdTAxNDhcMVwxMzRcMVwwXDFcMTM0IisKLSAgICAiXDFcMFwxXHUwMTQ4XDJcMTM0XDZcMFwxXHUwMTQ5XDFcMTM2XDFcMTM3XDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwxXHUwMTQ5XDFcMTM2XDFcMFwxXDEzNlw0XDBcMlwxMzYiKwotICAgICJcMVwwXDNcMTM2XDFcMFwxXDEzNlwxMFwwXDFcdTAxNDlcMlwxMzZcMVx1MDE0OSIrCi0gICAgIlwyXDEzNlwxXHUwMTQ5XDJcMTM2XDFcMFw0XDEzNlwxXDBcMVx1MDE0OVwxXDEzNiIrCi0gICAgIlwxXDBcMVwxMzZcMVwwXDFcdTAxNDlcMlwxMzZcNTJcMFwyXHUwMTRhXDczXDAiKwotICAgICJcMVx1MDE0YlwxMDZcMFwyXHUwMTRjXDdcMFwxXHUwMTRkXDFcMzMzXDFcMzM0XDFcMzMzIisKLSAgICAiXDFcMFwxXDMzM1wxXHUwMTRkXDFcMzMzXDFcMFwxXDMzM1wxXDM3NlwzXDAiKwotICAgICJcMlwzMzNcMVwwXDNcMzMzXDFcMFwxXDMzM1wxMFwwXDFcdTAxNGRcMlwzMzMiKwotICAgICJcMVx1MDE0ZFwyXDMzM1wxXHUwMTRkXDJcMzMzXDFcMFw0XDMzM1wxXDBcMVx1MDE0ZCIrCi0gICAgIlwxXDMzM1wxXDBcMVwzMzNcMVwwXDFcdTAxNGRcMlwzMzNcNlwwXDFcdTAxNGUiKwotICAgICJcMVwxNDdcMVwxNTBcMVwxNDdcMVwwXDFcMTQ3XDFcdTAxNGVcMVwxNDdcMVwwIisKLSAgICAiXDFcMTQ3XDRcMFwyXDE0N1wxXDBcM1wxNDdcMVwyNTJcMVwxNDdcMTBcMCIrCi0gICAgIlwxXHUwMTRlXDJcMTQ3XDFcdTAxNGVcMlwxNDdcMVx1MDE0ZVwyXDE0N1wxXDBcNFwxNDciKwotICAgICJcMVwwXDFcdTAxNGVcMVwxNDdcMVwwXDFcMTQ3XDFcMFwxXHUwMTRlXDJcMTQ3IisKLSAgICAiXDZcMFwxXHUwMTRmXDFcMTUyXDFcMTUzXDFcMTUyXDFcMTU0XDFcMTUyXDFcdTAxNGYiKwotICAgICJcMjdcMTUyXDFcdTAxNGZcMlwxNTJcMVx1MDE0ZlwyXDE1MlwxXHUwMTRmXDEwXDE1MlwxXHUwMTRmIisKLSAgICAiXDRcMTUyXDFcdTAxNGZcN1wxNTJcMVwwXDFcdTAxNTBcMVwxNTVcMVwxNTZcM1wxNTUiKwotICAgICJcMVx1MDE1MFwxXDE1NVwxXDE1NFwyNVwxNTVcMVx1MDE1MFwyXDE1NVwxXHUwMTUwXDJcMTU1IisKLSAgICAiXDFcdTAxNTBcMTBcMTU1XDFcdTAxNTBcNFwxNTVcMVx1MDE1MFw3XDE1NVwxXDBcMVx1MDE1MSIrCi0gICAgIlwxXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTUxXDI3XDE1N1wxXHUwMTUxIisKLSAgICAiXDJcMTU3XDFcdTAxNTFcMlwxNTdcMVx1MDE1MVwxMFwxNTdcMVx1MDE1MVw0XDE1N1wxXHUwMTUxIisKLSAgICAiXDdcMTU3XDFcMFwxXHUwMTUyXDFcMTYyXDFcMTYzXDNcMTYyXDFcdTAxNTJcMVwxNjIiKwotICAgICJcMVwxNjFcMjVcMTYyXDFcdTAxNTJcMlwxNjJcMVx1MDE1MlwyXDE2MlwxXHUwMTUyXDEwXDE2MiIrCi0gICAgIlwxXHUwMTUyXDRcMTYyXDFcdTAxNTJcN1wxNjJcNFwwXDFcdTAxMmRcMVwwXDFcdTAxMmQiKwotICAgICJcM1wwXDFcdTAxMmRcMVx1MDEwOVwzXDBcMlx1MDEyZFw1M1wwXDFcdTAxNTNcMVx1MDEwNSIrCi0gICAgIlwxXHUwMTA2XDFcdTAxMDVcMVwwXDFcdTAxMDVcMVx1MDE1M1wxXHUwMTA1XDFcMFwxXHUwMTA1IisKLSAgICAiXDFcdTAxMDlcMTFcdTAxMDVcMVwwXDExXHUwMTA1XDFcdTAxNTNcMlx1MDEwNVwxXHUwMTUzXDJcdTAxMDUiKwotICAgICJcMVx1MDE1M1wxMFx1MDEwNVwxXHUwMTUzXDRcdTAxMDVcMVx1MDE1M1w3XHUwMTA1XDFcMFwxXHUwMTU0IisKLSAgICAiXDFcdTAxMDdcMVx1MDEzMFwxXHUwMTA3XDFcdTAxNTVcMVx1MDEwN1wxXHUwMTU0XDEwXHUwMTA3XDFcdTAxNTYiKwotICAgICJcMTZcdTAxMDdcMVx1MDE1NFwyXHUwMTA3XDFcdTAxNTRcMlx1MDEwN1wxXHUwMTU0XDEwXHUwMTA3XDFcdTAxNTQiKwotICAgICJcNFx1MDEwN1wxXHUwMTU0XDdcdTAxMDdcMVwwXDFcdTAxNTdcMVx1MDEwOFwxXHUwMTMxXDNcdTAxMDgiKwotICAgICJcMVx1MDE1N1wxXHUwMTA4XDFcdTAxNThcNlx1MDEwOFwxXHUwMTU5XDE2XHUwMTA4XDFcdTAxNTdcMlx1MDEwOCIrCi0gICAgIlwxXHUwMTU3XDJcdTAxMDhcMVx1MDE1N1wxMFx1MDEwOFwxXHUwMTU3XDRcdTAxMDhcMVx1MDE1N1w3XHUwMTA4IisKLSAgICAiXDFcMFwxXHUwMTVhXDFcNTFcMVwxNjVcMVw1MVwxXDBcMVw1MVwxXHUwMTVhIisKLSAgICAiXDFcNTFcMVwwXDFcNTFcNFwwXDJcNTFcMVwwXDNcNTFcMVwwIisKLSAgICAiXDFcNTFcMTBcMFwxXHUwMTVhXDJcNTFcMVx1MDE1YVwyXDUxXDFcdTAxNWFcMlw1MSIrCi0gICAgIlwxXDBcNFw1MVwxXDBcMVx1MDE1YVwxXDUxXDFcMFwxXDUxXDFcMCIrCi0gICAgIlwxXHUwMTVhXDJcNTFcNlwwXDFcdTAxNWJcMVw1NVwxXDE2N1wxXDU1XDFcMCIrCi0gICAgIlwxXDU1XDFcdTAxNWJcMVw1NVwxXDBcMVw1NVw0XDBcMlw1NVwxXDAiKwotICAgICJcM1w1NVwxXDBcMVw1NVwxMFwwXDFcdTAxNWJcMlw1NVwxXHUwMTViXDJcNTUiKwotICAgICJcMVx1MDE1YlwyXDU1XDFcMFw0XDU1XDFcMFwxXHUwMTViXDFcNTVcMVwwIisKLSAgICAiXDFcNTVcMVwwXDFcdTAxNWJcMlw1NVw2XDBcMVx1MDE1Y1wxXDYyXDFcMTcxIisKLSAgICAiXDFcNjJcMVwwXDFcNjJcMVx1MDE1Y1wxXDYyXDFcMFwxXDYyXDRcMCIrCi0gICAgIlwyXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDEwXDBcMVx1MDE1Y1wyXDYyIisKLSAgICAiXDFcdTAxNWNcMlw2MlwxXHUwMTVjXDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxNWMiKwotICAgICJcMVw2MlwxXDBcMVw2MlwxXDBcMVx1MDE1Y1wyXDYyXDZcMFwxXHUwMTVkIisKLSAgICAiXDFcNzJcMVwxNzZcMVw3MlwxXDBcMVw3MlwxXHUwMTVkXDFcNzJcMVwwIisKLSAgICAiXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMCIrCi0gICAgIlwxXHUwMTVkXDJcNzJcMVx1MDE1ZFwyXDcyXDFcdTAxNWRcMlw3MlwxXDBcNFw3MiIrCi0gICAgIlwxXDBcMVx1MDE1ZFwxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTVkXDJcNzIiKwotICAgICJcNlwwXDFcdTAxNWVcMVwxMDBcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcdTAxNWUiKwotICAgICJcMVwxMDBcMVwwXDFcMTAwXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwIisKLSAgICAiXDFcMTAwXDEwXDBcMVx1MDE1ZVwyXDEwMFwxXHUwMTVlXDJcMTAwXDFcdTAxNWVcMlwxMDAiKwotICAgICJcMVwwXDRcMTAwXDFcMFwxXHUwMTVlXDFcMTAwXDFcMFwxXDEwMFwxXDAiKwotICAgICJcMVx1MDE1ZVwyXDEwMFw2XDBcMVx1MDE1ZlwxXDIwMlwxXDIwM1wxXDIwMlwxXDIwNCIrCi0gICAgIlwxXDIwMlwxXHUwMTVmXDI3XDIwMlwxXHUwMTVmXDJcMjAyXDFcdTAxNWZcMlwyMDJcMVx1MDE1ZiIrCi0gICAgIlwxMFwyMDJcMVx1MDE1Zlw0XDIwMlwxXHUwMTVmXDdcMjAyXDFcMFwxXHUwMTYwXDFcMjA1IisKLSAgICAiXDFcMjA2XDNcMjA1XDFcdTAxNjBcMVwyMDVcMVwyMDRcMjVcMjA1XDFcdTAxNjBcMlwyMDUiKwotICAgICJcMVx1MDE2MFwyXDIwNVwxXHUwMTYwXDEwXDIwNVwxXHUwMTYwXDRcMjA1XDFcdTAxNjBcN1wyMDUiKwotICAgICJcMVwwXDFcdTAxNjFcMVwxMDVcMVwyMDdcMVwxMDVcMVwwXDFcMTA1XDFcdTAxNjEiKwotICAgICJcMVwxMDVcMVwwXDFcMTA1XDRcMFwyXDEwNVwxXDBcM1wxMDVcMVwwIisKLSAgICAiXDFcMTA1XDEwXDBcMVx1MDE2MVwyXDEwNVwxXHUwMTYxXDJcMTA1XDFcdTAxNjFcMlwxMDUiKwotICAgICJcMVwwXDRcMTA1XDFcMFwxXHUwMTYxXDFcMTA1XDFcMFwxXDEwNVwxXDAiKwotICAgICJcMVx1MDE2MVwyXDEwNVw2XDBcMVx1MDE2MlwxXDIxMVwxXDIxMlwxXDIxMVwxXDAiKwotICAgICJcMVwyMTFcMVx1MDE2MlwxXDIxMVwxXDBcMVwyMTFcNFwwXDJcMjExXDFcMCIrCi0gICAgIlwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxXHUwMTYyXDJcMjExXDFcdTAxNjJcMlwyMTEiKwotICAgICJcMVx1MDE2MlwyXDIxMVwxXDBcNFwyMTFcMVwwXDFcdTAxNjJcMVwyMTFcMVwwIisKLSAgICAiXDFcMjExXDFcMFwxXHUwMTYyXDJcMjExXDZcMFwxXHUwMTYzXDFcMTEzXDFcMjE2IisKLSAgICAiXDFcMTEzXDFcMFwxXDExM1wxXHUwMTYzXDFcMTEzXDFcMFwxXDExM1w0XDAiKwotICAgICJcMlwxMTNcMVwwXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDBcMVx1MDE2M1wyXDExMyIrCi0gICAgIlwxXHUwMTYzXDJcMTEzXDFcdTAxNjNcMlwxMTNcMVwwXDRcMTEzXDFcMFwxXHUwMTYzIisKLSAgICAiXDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDE2M1wyXDExM1w2XDBcMVx1MDE2NCIrCi0gICAgIlwxXDIyMVwxXDIyMlwxXDIyMVwxXDIyM1wxXDIyMVwxXHUwMTY0XDI3XDIyMVwxXHUwMTY0IisKLSAgICAiXDJcMjIxXDFcdTAxNjRcMlwyMjFcMVx1MDE2NFwxMFwyMjFcMVx1MDE2NFw0XDIyMVwxXHUwMTY0IisKLSAgICAiXDdcMjIxXDFcMFwxXHUwMTY1XDFcMjI0XDFcMjI1XDNcMjI0XDFcdTAxNjVcMVwyMjQiKwotICAgICJcMVwyMjNcMjVcMjI0XDFcdTAxNjVcMlwyMjRcMVx1MDE2NVwyXDIyNFwxXHUwMTY1XDEwXDIyNCIrCi0gICAgIlwxXHUwMTY1XDRcMjI0XDFcdTAxNjVcN1wyMjRcMVwwXDFcdTAxNjZcMVwyMjdcMVwyMzAiKwotICAgICJcMVwyMjdcMVwwXDFcMjI3XDFcdTAxNjZcMVwyMjdcMVwwXDFcMjI3XDRcMCIrCi0gICAgIlwyXDIyN1wxXDBcM1wyMjdcMVwwXDFcMjI3XDEwXDBcMVx1MDE2NlwyXDIyNyIrCi0gICAgIlwxXHUwMTY2XDJcMjI3XDFcdTAxNjZcMlwyMjdcMVwwXDRcMjI3XDFcMFwxXHUwMTY2IisKLSAgICAiXDFcMjI3XDFcMFwxXDIyN1wxXDBcMVx1MDE2NlwyXDIyN1w2XDBcMVx1MDE2NyIrCi0gICAgIlw1XDBcMVx1MDE2N1wxXDM2MlwxNVwwXDJcdTAxNjdcN1wwXDJcdTAxNjdcMVwwIisKLSAgICAiXDJcdTAxNjdcMVwwXDJcdTAxNjdcN1wwXDJcdTAxNjdcM1wwXDJcdTAxNjdcN1wwIisKLSAgICAiXDFcdTAxNjhcNVwwXDFcdTAxNjhcMTZcMFwyXHUwMTY4XDdcMFwyXHUwMTY4XDFcMCIrCi0gICAgIlwyXHUwMTY4XDFcMFwyXHUwMTY4XDdcMFwyXHUwMTY4XDNcMFwyXHUwMTY4XDEyXDAiKwotICAgICJcMVx1MDE0MVwxXDBcMVx1MDE0MVwzXDBcMVx1MDE0MVwxXHUwMTFlXDNcMFwyXHUwMTQxIisKLSAgICAiXDUzXDBcMVx1MDE2OVwxXHUwMTE5XDFcdTAxMWFcMVx1MDExOVwxXDBcMVx1MDExOVwxXHUwMTY5IisKLSAgICAiXDFcdTAxMTlcMVwwXDFcdTAxMTlcMVx1MDExZVwxMVx1MDExOVwxXDBcMTFcdTAxMTlcMVx1MDE2OSIrCi0gICAgIlwyXHUwMTE5XDFcdTAxNjlcMlx1MDExOVwxXHUwMTY5XDEwXHUwMTE5XDFcdTAxNjlcNFx1MDExOVwxXHUwMTY5IisKLSAgICAiXDdcdTAxMTlcMVwwXDFcdTAxNmFcMVx1MDExY1wxXHUwMTQ0XDFcdTAxMWNcMVx1MDE2YlwxXHUwMTFjIisKLSAgICAiXDFcdTAxNmFcMTBcdTAxMWNcMVx1MDE2Y1wxNlx1MDExY1wxXHUwMTZhXDJcdTAxMWNcMVx1MDE2YVwyXHUwMTFjIisKLSAgICAiXDFcdTAxNmFcMTBcdTAxMWNcMVx1MDE2YVw0XHUwMTFjXDFcdTAxNmFcN1x1MDExY1wxXDBcMVx1MDE2ZCIrCi0gICAgIlwxXHUwMTFkXDFcdTAxNDVcM1x1MDExZFwxXHUwMTZkXDFcdTAxMWRcMVx1MDE2ZVw2XHUwMTFkXDFcdTAxNmYiKwotICAgICJcMTZcdTAxMWRcMVx1MDE2ZFwyXHUwMTFkXDFcdTAxNmRcMlx1MDExZFwxXHUwMTZkXDEwXHUwMTFkXDFcdTAxNmQiKwotICAgICJcNFx1MDExZFwxXHUwMTZkXDdcdTAxMWRcNDdcMFwxXHUwMTcwXDI0XDBcMlwyNVwxXDEzMSIrCi0gICAgIlwxXDI1XDFcMFwzXDI1XDFcMFwxXDI1XDRcMFwyXDI1XDFcMCIrCi0gICAgIlwzXDI1XDFcMFwxXDI1XDEwXDBcMTFcMjVcMVwwXDRcMjVcMVwwIisKLSAgICAiXDJcMjVcMVwwXDFcMjVcMVwwXDNcMjVcNlwwXDFcdTAxNzFcMVwxMzQiKwotICAgICJcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcdTAxNzFcMVwxMzRcMVwwXDFcMTM0IisKLSAgICAiXDRcMFwyXDEzNFwxXDBcM1wxMzRcMVwwXDFcMTM0XDEwXDBcMVx1MDE3MSIrCi0gICAgIlwyXDEzNFwxXHUwMTcxXDJcMTM0XDFcdTAxNzFcMlwxMzRcMVwwXDRcMTM0XDFcMCIrCi0gICAgIlwxXHUwMTcxXDFcMTM0XDFcMFwxXDEzNFwxXDBcMVx1MDE3MVwyXDEzNFw2XDAiKwotICAgICJcMVx1MDE3MlwxXDEzNlwxXDEzN1wxXDEzNlwxXDBcMVwxMzZcMVx1MDE3MlwxXDEzNiIrCi0gICAgIlwxXDBcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzYiKwotICAgICJcMTBcMFwxXHUwMTcyXDJcMTM2XDFcdTAxNzJcMlwxMzZcMVx1MDE3MlwyXDEzNlwxXDAiKwotICAgICJcNFwxMzZcMVwwXDFcdTAxNzJcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXHUwMTcyIisKLSAgICAiXDJcMTM2XDU0XDBcMVx1MDE3M1w2NVwwXDJcdTAxNzRcMzBcMFwxXHUwMTc1XDFcMzMzIisKLSAgICAiXDFcMzM0XDFcMzMzXDFcMFwxXDMzM1wxXHUwMTc1XDFcMzMzXDFcMFwxXDMzMyIrCi0gICAgIlwxXDM3NlwzXDBcMlwzMzNcMVwwXDNcMzMzXDFcMFwxXDMzM1wxMFwwIisKLSAgICAiXDFcdTAxNzVcMlwzMzNcMVx1MDE3NVwyXDMzM1wxXHUwMTc1XDJcMzMzXDFcMFw0XDMzMyIrCi0gICAgIlwxXDBcMVx1MDE3NVwxXDMzM1wxXDBcMVwzMzNcMVwwXDFcdTAxNzVcMlwzMzMiKwotICAgICJcNlwwXDFcdTAxNzZcMVwxNDdcMVwxNTBcMVwxNDdcMVwwXDFcMTQ3XDFcdTAxNzYiKwotICAgICJcMVwxNDdcMVwwXDFcMTQ3XDRcMFwyXDE0N1wxXDBcM1wxNDdcMVwyNTIiKwotICAgICJcMVwxNDdcMTBcMFwxXHUwMTc2XDJcMTQ3XDFcdTAxNzZcMlwxNDdcMVx1MDE3NlwyXDE0NyIrCi0gICAgIlwxXDBcNFwxNDdcMVwwXDFcdTAxNzZcMVwxNDdcMVwwXDFcMTQ3XDFcMCIrCi0gICAgIlwxXHUwMTc2XDJcMTQ3XDZcMFwxXHUwMTc3XDFcMTUyXDFcMTUzXDFcMTUyXDFcMTU0IisKLSAgICAiXDFcMTUyXDFcdTAxNzdcMjdcMTUyXDFcdTAxNzdcMlwxNTJcMVx1MDE3N1wyXDE1MlwxXHUwMTc3IisKLSAgICAiXDEwXDE1MlwxXHUwMTc3XDRcMTUyXDFcdTAxNzdcN1wxNTJcMVwwXDFcdTAxNzhcMVwxNTUiKwotICAgICJcMVwxNTZcM1wxNTVcMVx1MDE3OFwxXDE1NVwxXDE1NFwyNVwxNTVcMVx1MDE3OFwyXDE1NSIrCi0gICAgIlwxXHUwMTc4XDJcMTU1XDFcdTAxNzhcMTBcMTU1XDFcdTAxNzhcNFwxNTVcMVx1MDE3OFw3XDE1NSIrCi0gICAgIlwxXDBcMVx1MDE3OVwxXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTc5IisKLSAgICAiXDI3XDE1N1wxXHUwMTc5XDJcMTU3XDFcdTAxNzlcMlwxNTdcMVx1MDE3OVwxMFwxNTdcMVx1MDE3OSIrCi0gICAgIlw0XDE1N1wxXHUwMTc5XDdcMTU3XDFcMFwxXHUwMTdhXDFcMTYyXDFcMTYzXDNcMTYyIisKLSAgICAiXDFcdTAxN2FcMVwxNjJcMVwxNjFcMjVcMTYyXDFcdTAxN2FcMlwxNjJcMVx1MDE3YVwyXDE2MiIrCi0gICAgIlwxXHUwMTdhXDEwXDE2MlwxXHUwMTdhXDRcMTYyXDFcdTAxN2FcN1wxNjJcMVwwXDFcdTAxN2IiKwotICAgICJcMVx1MDEwNVwxXHUwMTA2XDFcdTAxMDVcMVwwXDFcdTAxMDVcMVx1MDE3YlwxXHUwMTA1XDFcMCIrCi0gICAgIlwxXHUwMTA1XDFcdTAxMDlcMTFcdTAxMDVcMVwwXDExXHUwMTA1XDFcdTAxN2JcMlx1MDEwNVwxXHUwMTdiIisKLSAgICAiXDJcdTAxMDVcMVx1MDE3YlwxMFx1MDEwNVwxXHUwMTdiXDRcdTAxMDVcMVx1MDE3Ylw3XHUwMTA1XDFcMCIrCi0gICAgIlwxXHUwMTdjXDFcdTAxMDdcMVx1MDEzMFwxXHUwMTA3XDFcdTAxMmRcMVx1MDEwN1wxXHUwMTdjXDI3XHUwMTA3IisKLSAgICAiXDFcdTAxN2NcMlx1MDEwN1wxXHUwMTdjXDJcdTAxMDdcMVx1MDE3Y1wxMFx1MDEwN1wxXHUwMTdjXDRcdTAxMDciKwotICAgICJcMVx1MDE3Y1w3XHUwMTA3XDFcMFwyXHUwMTA3XDFcdTAxMzBcMlx1MDEyZFwxXHUwMTU1XDNcdTAxMDciKwotICAgICJcMVx1MDE1NVwxXHUwMTdkXDNcdTAxMDdcMlx1MDEyZFw1Mlx1MDEwN1wxXDBcMlx1MDEwN1wxXHUwMTMwIisKLSAgICAiXDFcMFwxXHUwMTJkXDEyXHUwMTA3XDFcMFw1Mlx1MDEwN1wxXDBcMVx1MDE3ZVwxXHUwMTA4IisKLSAgICAiXDFcdTAxMzFcM1x1MDEwOFwxXHUwMTdlXDFcdTAxMDhcMVx1MDEyZFwyNVx1MDEwOFwxXHUwMTdlXDJcdTAxMDgiKwotICAgICJcMVx1MDE3ZVwyXHUwMTA4XDFcdTAxN2VcMTBcdTAxMDhcMVx1MDE3ZVw0XHUwMTA4XDFcdTAxN2VcN1x1MDEwOCIrCi0gICAgIlwxXDBcMlx1MDEwOFwxXHUwMTMxXDFcdTAxMmRcMVx1MDEwOFwxXHUwMTU4XDJcdTAxMDhcMVx1MDEyZCIrCi0gICAgIlwxXHUwMTU4XDFcdTAxN2ZcM1x1MDEwOFwyXHUwMTJkXDUyXHUwMTA4XDFcMFwyXHUwMTA4XDFcdTAxMzEiKwotICAgICJcMVwwXDRcdTAxMDhcMVx1MDEyZFw2XHUwMTA4XDFcMFw1Mlx1MDEwOFwxXDBcMlw1MSIrCi0gICAgIlwxXDE2NVwxXDUxXDFcMFwzXDUxXDFcMFwxXDUxXDRcMFwyXDUxIisKLSAgICAiXDFcMFwzXDUxXDFcMFwxXDUxXDEwXDBcMTFcNTFcMVwwXDRcNTEiKwotICAgICJcMVwwXDJcNTFcMVwwXDFcNTFcMVwwXDNcNTFcNlwwXDJcNTUiKwotICAgICJcMVwxNjdcMVw1NVwxXDBcM1w1NVwxXDBcMVw1NVw0XDBcMlw1NSIrCi0gICAgIlwxXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDExXDU1XDFcMFw0XDU1IisKLSAgICAiXDFcMFwyXDU1XDFcMFwxXDU1XDFcMFwzXDU1XDZcMFwyXDYyIisKLSAgICAiXDFcMTcxXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcNFwwXDJcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMFwxMVw2MlwxXDBcNFw2MiIrCi0gICAgIlwxXDBcMlw2MlwxXDBcMVw2MlwxXDBcM1w2Mlw2XDBcMlw3MiIrCi0gICAgIlwxXDE3NlwxXDcyXDFcMFwzXDcyXDFcMFwxXDcyXDRcMFwyXDcyIisKLSAgICAiXDFcMFwzXDcyXDFcMFwxXDcyXDEwXDBcMTFcNzJcMVwwXDRcNzIiKwotICAgICJcMVwwXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNlwwXDJcMTAwIisKLSAgICAiXDFcMjAwXDFcMTAwXDFcMFwzXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwIisKLSAgICAiXDFcMFwzXDEwMFwxXDBcMVwxMDBcMTBcMFwxMVwxMDBcMVwwXDRcMTAwIisKLSAgICAiXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMFwxXHUwMTgwIisKLSAgICAiXDFcMjAyXDFcMjAzXDFcMjAyXDFcMjA0XDFcMjAyXDFcdTAxODBcMjdcMjAyXDFcdTAxODAiKwotICAgICJcMlwyMDJcMVx1MDE4MFwyXDIwMlwxXHUwMTgwXDEwXDIwMlwxXHUwMTgwXDRcMjAyXDFcdTAxODAiKwotICAgICJcN1wyMDJcMVwwXDFcdTAxODFcMVwyMDVcMVwyMDZcM1wyMDVcMVx1MDE4MVwxXDIwNSIrCi0gICAgIlwxXDIwNFwyNVwyMDVcMVx1MDE4MVwyXDIwNVwxXHUwMTgxXDJcMjA1XDFcdTAxODFcMTBcMjA1IisKLSAgICAiXDFcdTAxODFcNFwyMDVcMVx1MDE4MVw3XDIwNVwxXDBcMlwxMDVcMVwyMDdcMVwxMDUiKwotICAgICJcMVwwXDNcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1IisKLSAgICAiXDFcMFwxXDEwNVwxMFwwXDExXDEwNVwxXDBcNFwxMDVcMVwwXDJcMTA1IisKLSAgICAiXDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwXDFcdTAxODJcMVwyMTFcMVwyMTIiKwotICAgICJcMVwyMTFcMVwwXDFcMjExXDFcdTAxODJcMVwyMTFcMVwwXDFcMjExXDRcMCIrCi0gICAgIlwyXDIxMVwxXDBcM1wyMTFcMVwwXDFcMjExXDEwXDBcMVx1MDE4MlwyXDIxMSIrCi0gICAgIlwxXHUwMTgyXDJcMjExXDFcdTAxODJcMlwyMTFcMVwwXDRcMjExXDFcMFwxXHUwMTgyIisKLSAgICAiXDFcMjExXDFcMFwxXDIxMVwxXDBcMVx1MDE4MlwyXDIxMVw2XDBcMlwxMTMiKwotICAgICJcMVwyMTZcMVwxMTNcMVwwXDNcMTEzXDFcMFwxXDExM1w0XDBcMlwxMTMiKwotICAgICJcMVwwXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDBcMTFcMTEzXDFcMFw0XDExMyIrCi0gICAgIlwxXDBcMlwxMTNcMVwwXDFcMTEzXDFcMFwzXDExM1w2XDBcMVx1MDE4MyIrCi0gICAgIlwxXDIyMVwxXDIyMlwxXDIyMVwxXDIyM1wxXDIyMVwxXHUwMTgzXDI3XDIyMVwxXHUwMTgzIisKLSAgICAiXDJcMjIxXDFcdTAxODNcMlwyMjFcMVx1MDE4M1wxMFwyMjFcMVx1MDE4M1w0XDIyMVwxXHUwMTgzIisKLSAgICAiXDdcMjIxXDFcMFwxXHUwMTg0XDFcMjI0XDFcMjI1XDNcMjI0XDFcdTAxODRcMVwyMjQiKwotICAgICJcMVwyMjNcMjVcMjI0XDFcdTAxODRcMlwyMjRcMVx1MDE4NFwyXDIyNFwxXHUwMTg0XDEwXDIyNCIrCi0gICAgIlwxXHUwMTg0XDRcMjI0XDFcdTAxODRcN1wyMjRcMVwwXDFcdTAxODVcMVwyMjdcMVwyMzAiKwotICAgICJcMVwyMjdcMVwwXDFcMjI3XDFcdTAxODVcMVwyMjdcMVwwXDFcMjI3XDRcMCIrCi0gICAgIlwyXDIyN1wxXDBcM1wyMjdcMVwwXDFcMjI3XDEwXDBcMVx1MDE4NVwyXDIyNyIrCi0gICAgIlwxXHUwMTg1XDJcMjI3XDFcdTAxODVcMlwyMjdcMVwwXDRcMjI3XDFcMFwxXHUwMTg1IisKLSAgICAiXDFcMjI3XDFcMFwxXDIyN1wxXDBcMVx1MDE4NVwyXDIyN1w2XDBcMVx1MDE4NiIrCi0gICAgIlw1XDBcMVx1MDE4NlwxXDM2MlwxNVwwXDJcdTAxODZcN1wwXDJcdTAxODZcMVwwIisKLSAgICAiXDJcdTAxODZcMVwwXDJcdTAxODZcN1wwXDJcdTAxODZcM1wwXDJcdTAxODZcN1wwIisKLSAgICAiXDFcdTAxODdcNVwwXDFcdTAxODdcMTZcMFwyXHUwMTg3XDdcMFwyXHUwMTg3XDFcMCIrCi0gICAgIlwyXHUwMTg3XDFcMFwyXHUwMTg3XDdcMFwyXHUwMTg3XDNcMFwyXHUwMTg3XDdcMCIrCi0gICAgIlwxXHUwMTg4XDFcdTAxMTlcMVx1MDExYVwxXHUwMTE5XDFcMFwxXHUwMTE5XDFcdTAxODhcMVx1MDExOSIrCi0gICAgIlwxXDBcMVx1MDExOVwxXHUwMTFlXDExXHUwMTE5XDFcMFwxMVx1MDExOVwxXHUwMTg4XDJcdTAxMTkiKwotICAgICJcMVx1MDE4OFwyXHUwMTE5XDFcdTAxODhcMTBcdTAxMTlcMVx1MDE4OFw0XHUwMTE5XDFcdTAxODhcN1x1MDExOSIrCi0gICAgIlwxXDBcMVx1MDE4OVwxXHUwMTFjXDFcdTAxNDRcMVx1MDExY1wxXHUwMTQxXDFcdTAxMWNcMVx1MDE4OSIrCi0gICAgIlwyN1x1MDExY1wxXHUwMTg5XDJcdTAxMWNcMVx1MDE4OVwyXHUwMTFjXDFcdTAxODlcMTBcdTAxMWNcMVx1MDE4OSIrCi0gICAgIlw0XHUwMTFjXDFcdTAxODlcN1x1MDExY1wxXDBcMlx1MDExY1wxXHUwMTQ0XDJcdTAxNDFcMVx1MDE2YiIrCi0gICAgIlwzXHUwMTFjXDFcdTAxNmJcMVx1MDE4YVwzXHUwMTFjXDJcdTAxNDFcNTJcdTAxMWNcMVwwXDJcdTAxMWMiKwotICAgICJcMVx1MDE0NFwxXDBcMVx1MDE0MVwxMlx1MDExY1wxXDBcNTJcdTAxMWNcMVwwXDFcdTAxOGIiKwotICAgICJcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWRcMVx1MDE4YlwxXHUwMTFkXDFcdTAxNDFcMjVcdTAxMWRcMVx1MDE4YiIrCi0gICAgIlwyXHUwMTFkXDFcdTAxOGJcMlx1MDExZFwxXHUwMThiXDEwXHUwMTFkXDFcdTAxOGJcNFx1MDExZFwxXHUwMThiIisKLSAgICAiXDdcdTAxMWRcMVwwXDJcdTAxMWRcMVx1MDE0NVwxXHUwMTQxXDFcdTAxMWRcMVx1MDE2ZVwyXHUwMTFkIisKLSAgICAiXDFcdTAxNDFcMVx1MDE2ZVwxXHUwMThjXDNcdTAxMWRcMlx1MDE0MVw1Mlx1MDExZFwxXDBcMlx1MDExZCIrCi0gICAgIlwxXHUwMTQ1XDFcMFw0XHUwMTFkXDFcdTAxNDFcNlx1MDExZFwxXDBcNTJcdTAxMWRcNDJcMCIrCi0gICAgIlwyXHUwMThkXDMwXDBcMlwxMzRcMVwxMzVcMVwxMzRcMVwwXDNcMTM0XDFcMCIrCi0gICAgIlwxXDEzNFw0XDBcMlwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwIisKLSAgICAiXDExXDEzNFwxXDBcNFwxMzRcMVwwXDJcMTM0XDFcMFwxXDEzNFwxXDAiKwotICAgICJcM1wxMzRcNlwwXDJcMTM2XDFcMTM3XDFcMTM2XDFcMFwzXDEzNlwxXDAiKwotICAgICJcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzZcMTBcMCIrCi0gICAgIlwxMVwxMzZcMVwwXDRcMTM2XDFcMFwyXDEzNlwxXDBcMVwxMzZcMVwwIisKLSAgICAiXDNcMTM2XDQ0XDBcMlx1MDE4ZVwzM1wwXDFcdTAxOGZcMVwzMzNcMVwzMzRcMVwzMzMiKwotICAgICJcMVwwXDFcMzMzXDFcdTAxOGZcMVwzMzNcMVwwXDFcMzMzXDFcMzc2XDNcMCIrCi0gICAgIlwyXDMzM1wxXDBcM1wzMzNcMVwwXDFcMzMzXDEwXDBcMVx1MDE4ZlwyXDMzMyIrCi0gICAgIlwxXHUwMThmXDJcMzMzXDFcdTAxOGZcMlwzMzNcMVwwXDRcMzMzXDFcMFwxXHUwMThmIisKLSAgICAiXDFcMzMzXDFcMFwxXDMzM1wxXDBcMVx1MDE4ZlwyXDMzM1w2XDBcMlwxNDciKwotICAgICJcMVwxNTBcMVwxNDdcMVwwXDNcMTQ3XDFcMFwxXDE0N1w0XDBcMlwxNDciKwotICAgICJcMVwwXDNcMTQ3XDFcMjUyXDFcMTQ3XDEwXDBcMTFcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMlwxNDdcMVwwXDFcMTQ3XDFcMFwzXDE0N1w2XDBcMlwxNTIiKwotICAgICJcMVwxNTNcMVwxNTJcMVwxNTRcNjVcMTUyXDFcMFwyXDE1NVwxXDE1Nlw1XDE1NSIrCi0gICAgIlwxXDE1NFw2MVwxNTVcMVwwXDJcMTU3XDFcMTYwXDFcMTU3XDFcMTYxXDY1XDE1NyIrCi0gICAgIlwxXDBcMlwxNjJcMVwxNjNcNVwxNjJcMVwxNjFcNjFcMTYyXDFcMFwxXHUwMTkwIisKLSAgICAiXDFcdTAxMDVcMVx1MDEwNlwxXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxOTBcMVx1MDEwNVwxXDAiKwotICAgICJcMVx1MDEwNVwxXHUwMTA5XDExXHUwMTA1XDFcMFwxMVx1MDEwNVwxXHUwMTkwXDJcdTAxMDVcMVx1MDE5MCIrCi0gICAgIlwyXHUwMTA1XDFcdTAxOTBcMTBcdTAxMDVcMVx1MDE5MFw0XHUwMTA1XDFcdTAxOTBcN1x1MDEwNVwxXDAiKwotICAgICJcMVx1MDE5MVwxXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTJkXDFcdTAxMDdcMVx1MDE5MVwyN1x1MDEwNyIrCi0gICAgIlwxXHUwMTkxXDJcdTAxMDdcMVx1MDE5MVwyXHUwMTA3XDFcdTAxOTFcMTBcdTAxMDdcMVx1MDE5MVw0XHUwMTA3IisKLSAgICAiXDFcdTAxOTFcN1x1MDEwN1wxXDBcMVx1MDE5MlwxXHUwMTA4XDFcdTAxMzFcM1x1MDEwOFwxXHUwMTkyIisKLSAgICAiXDFcdTAxMDhcMVx1MDEyZFwyNVx1MDEwOFwxXHUwMTkyXDJcdTAxMDhcMVx1MDE5MlwyXHUwMTA4XDFcdTAxOTIiKwotICAgICJcMTBcdTAxMDhcMVx1MDE5Mlw0XHUwMTA4XDFcdTAxOTJcN1x1MDEwOFwxXDBcMlwyMDJcMVwyMDMiKwotICAgICJcMVwyMDJcMVwyMDRcNjVcMjAyXDFcMFwyXDIwNVwxXDIwNlw1XDIwNVwxXDIwNCIrCi0gICAgIlw2MVwyMDVcMVwwXDJcMjExXDFcMjEyXDFcMjExXDFcMFwzXDIxMVwxXDAiKwotICAgICJcMVwyMTFcNFwwXDJcMjExXDFcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMCIrCi0gICAgIlwxMVwyMTFcMVwwXDRcMjExXDFcMFwyXDIxMVwxXDBcMVwyMTFcMVwwIisKLSAgICAiXDNcMjExXDZcMFwyXDIyMVwxXDIyMlwxXDIyMVwxXDIyM1w2NVwyMjFcMVwwIisKLSAgICAiXDJcMjI0XDFcMjI1XDVcMjI0XDFcMjIzXDYxXDIyNFwxXDBcMlwyMjdcMVwyMzAiKwotICAgICJcMVwyMjdcMVwwXDNcMjI3XDFcMFwxXDIyN1w0XDBcMlwyMjdcMVwwIisKLSAgICAiXDNcMjI3XDFcMFwxXDIyN1wxMFwwXDExXDIyN1wxXDBcNFwyMjdcMVwwIisKLSAgICAiXDJcMjI3XDFcMFwxXDIyN1wxXDBcM1wyMjdcMTVcMFwxXDM2Mlw2M1wwIisKLSAgICAiXDFcdTAxOTNcNVwwXDFcdTAxOTNcMTZcMFwyXHUwMTkzXDdcMFwyXHUwMTkzXDFcMCIrCi0gICAgIlwyXHUwMTkzXDFcMFwyXHUwMTkzXDdcMFwyXHUwMTkzXDNcMFwyXHUwMTkzXDdcMCIrCi0gICAgIlwxXHUwMTk0XDFcdTAxMTlcMVx1MDExYVwxXHUwMTE5XDFcMFwxXHUwMTE5XDFcdTAxOTRcMVx1MDExOSIrCi0gICAgIlwxXDBcMVx1MDExOVwxXHUwMTFlXDExXHUwMTE5XDFcMFwxMVx1MDExOVwxXHUwMTk0XDJcdTAxMTkiKwotICAgICJcMVx1MDE5NFwyXHUwMTE5XDFcdTAxOTRcMTBcdTAxMTlcMVx1MDE5NFw0XHUwMTE5XDFcdTAxOTRcN1x1MDExOSIrCi0gICAgIlwxXDBcMVx1MDE5NVwxXHUwMTFjXDFcdTAxNDRcMVx1MDExY1wxXHUwMTQxXDFcdTAxMWNcMVx1MDE5NSIrCi0gICAgIlwyN1x1MDExY1wxXHUwMTk1XDJcdTAxMWNcMVx1MDE5NVwyXHUwMTFjXDFcdTAxOTVcMTBcdTAxMWNcMVx1MDE5NSIrCi0gICAgIlw0XHUwMTFjXDFcdTAxOTVcN1x1MDExY1wxXDBcMVx1MDE5NlwxXHUwMTFkXDFcdTAxNDVcM1x1MDExZCIrCi0gICAgIlwxXHUwMTk2XDFcdTAxMWRcMVx1MDE0MVwyNVx1MDExZFwxXHUwMTk2XDJcdTAxMWRcMVx1MDE5NlwyXHUwMTFkIisKLSAgICAiXDFcdTAxOTZcMTBcdTAxMWRcMVx1MDE5Nlw0XHUwMTFkXDFcdTAxOTZcN1x1MDExZFw2NVwwXDFcdTAxOTciKwotICAgICJcNTJcMFwyXHUwMTk4XDI1XDBcMVx1MDE5OVwxXDMzM1wxXDMzNFwxXDMzM1wxXDAiKwotICAgICJcMVwzMzNcMVx1MDE5OVwxXDMzM1wxXDBcMVwzMzNcMVwzNzZcM1wwXDJcMzMzIisKLSAgICAiXDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxXHUwMTk5XDJcMzMzXDFcdTAxOTkiKwotICAgICJcMlwzMzNcMVx1MDE5OVwyXDMzM1wxXDBcNFwzMzNcMVwwXDFcdTAxOTlcMVwzMzMiKwotICAgICJcMVwwXDFcMzMzXDFcMFwxXHUwMTk5XDJcMzMzXDZcMFwxXHUwMTlhXDFcdTAxMDUiKwotICAgICJcMVx1MDEwNlwxXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxOWFcMVx1MDEwNVwxXDBcMVx1MDEwNSIrCi0gICAgIlwxXHUwMTA5XDExXHUwMTA1XDFcMFwxMVx1MDEwNVwxXHUwMTlhXDJcdTAxMDVcMVx1MDE5YVwyXHUwMTA1IisKLSAgICAiXDFcdTAxOWFcMTBcdTAxMDVcMVx1MDE5YVw0XHUwMTA1XDFcdTAxOWFcN1x1MDEwNVwxXDBcMVx1MDE5YiIrCi0gICAgIlwxXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTJkXDFcdTAxMDdcMVx1MDE5YlwyN1x1MDEwN1wxXHUwMTliIisKLSAgICAiXDJcdTAxMDdcMVx1MDE5YlwyXHUwMTA3XDFcdTAxOWJcMTBcdTAxMDdcMVx1MDE5Ylw0XHUwMTA3XDFcdTAxOWIiKwotICAgICJcN1x1MDEwN1wxXDBcMVx1MDE5Y1wxXHUwMTA4XDFcdTAxMzFcM1x1MDEwOFwxXHUwMTljXDFcdTAxMDgiKwotICAgICJcMVx1MDEyZFwyNVx1MDEwOFwxXHUwMTljXDJcdTAxMDhcMVx1MDE5Y1wyXHUwMTA4XDFcdTAxOWNcMTBcdTAxMDgiKwotICAgICJcMVx1MDE5Y1w0XHUwMTA4XDFcdTAxOWNcN1x1MDEwOFwxXDBcMVx1MDE5ZFw1XDBcMVx1MDE5ZCIrCi0gICAgIlwxNlwwXDJcdTAxOWRcN1wwXDJcdTAxOWRcMVwwXDJcdTAxOWRcMVwwXDJcdTAxOWQiKwotICAgICJcN1wwXDJcdTAxOWRcM1wwXDJcdTAxOWRcN1wwXDFcdTAxOWVcMVx1MDExOVwxXHUwMTFhIisKLSAgICAiXDFcdTAxMTlcMVwwXDFcdTAxMTlcMVx1MDE5ZVwxXHUwMTE5XDFcMFwxXHUwMTE5XDFcdTAxMWUiKwotICAgICJcMTFcdTAxMTlcMVwwXDExXHUwMTE5XDFcdTAxOWVcMlx1MDExOVwxXHUwMTllXDJcdTAxMTlcMVx1MDE5ZSIrCi0gICAgIlwxMFx1MDExOVwxXHUwMTllXDRcdTAxMTlcMVx1MDE5ZVw3XHUwMTE5XDFcMFwxXHUwMTlmXDFcdTAxMWMiKwotICAgICJcMVx1MDE0NFwxXHUwMTFjXDFcdTAxNDFcMVx1MDExY1wxXHUwMTlmXDI3XHUwMTFjXDFcdTAxOWZcMlx1MDExYyIrCi0gICAgIlwxXHUwMTlmXDJcdTAxMWNcMVx1MDE5ZlwxMFx1MDExY1wxXHUwMTlmXDRcdTAxMWNcMVx1MDE5Zlw3XHUwMTFjIisKLSAgICAiXDFcMFwxXHUwMWEwXDFcdTAxMWRcMVx1MDE0NVwzXHUwMTFkXDFcdTAxYTBcMVx1MDExZFwxXHUwMTQxIisKLSAgICAiXDI1XHUwMTFkXDFcdTAxYTBcMlx1MDExZFwxXHUwMWEwXDJcdTAxMWRcMVx1MDFhMFwxMFx1MDExZFwxXHUwMWEwIisKLSAgICAiXDRcdTAxMWRcMVx1MDFhMFw3XHUwMTFkXDQ3XDBcMVx1MDFhMVwyNFwwXDJcMzMzXDFcMzM0IisKLSAgICAiXDFcMzMzXDFcMFwzXDMzM1wxXDBcMVwzMzNcMVwzNzZcM1wwXDJcMzMzIisKLSAgICAiXDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxMVwzMzNcMVwwXDRcMzMzIisKLSAgICAiXDFcMFwyXDMzM1wxXDBcMVwzMzNcMVwwXDNcMzMzXDZcMFwxXHUwMWEyIisKLSAgICAiXDFcdTAxMDVcMVx1MDEwNlwxXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxYTJcMVx1MDEwNVwxXDAiKwotICAgICJcMVx1MDEwNVwxXHUwMTA5XDExXHUwMTA1XDFcMFwxMVx1MDEwNVwxXHUwMWEyXDJcdTAxMDVcMVx1MDFhMiIrCi0gICAgIlwyXHUwMTA1XDFcdTAxYTJcMTBcdTAxMDVcMVx1MDFhMlw0XHUwMTA1XDFcdTAxYTJcN1x1MDEwNVwxXDAiKwotICAgICJcMVx1MDFhM1wxXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTJkXDFcdTAxMDdcMVx1MDFhM1wyN1x1MDEwNyIrCi0gICAgIlwxXHUwMWEzXDJcdTAxMDdcMVx1MDFhM1wyXHUwMTA3XDFcdTAxYTNcMTBcdTAxMDdcMVx1MDFhM1w0XHUwMTA3IisKLSAgICAiXDFcdTAxYTNcN1x1MDEwN1wxXDBcMVx1MDFhNFwxXHUwMTA4XDFcdTAxMzFcM1x1MDEwOFwxXHUwMWE0IisKLSAgICAiXDFcdTAxMDhcMVx1MDEyZFwyNVx1MDEwOFwxXHUwMWE0XDJcdTAxMDhcMVx1MDFhNFwyXHUwMTA4XDFcdTAxYTQiKwotICAgICJcMTBcdTAxMDhcMVx1MDFhNFw0XHUwMTA4XDFcdTAxYTRcN1x1MDEwOFwxXDBcMVx1MDFhNVwxXHUwMTE5IisKLSAgICAiXDFcdTAxMWFcMVx1MDExOVwxXDBcMVx1MDExOVwxXHUwMWE1XDFcdTAxMTlcMVwwXDFcdTAxMTkiKwotICAgICJcMVx1MDExZVwxMVx1MDExOVwxXDBcMTFcdTAxMTlcMVx1MDFhNVwyXHUwMTE5XDFcdTAxYTVcMlx1MDExOSIrCi0gICAgIlwxXHUwMWE1XDEwXHUwMTE5XDFcdTAxYTVcNFx1MDExOVwxXHUwMWE1XDdcdTAxMTlcMVwwXDFcdTAxYTYiKwotICAgICJcMVx1MDExY1wxXHUwMTQ0XDFcdTAxMWNcMVx1MDE0MVwxXHUwMTFjXDFcdTAxYTZcMjdcdTAxMWNcMVx1MDFhNiIrCi0gICAgIlwyXHUwMTFjXDFcdTAxYTZcMlx1MDExY1wxXHUwMWE2XDEwXHUwMTFjXDFcdTAxYTZcNFx1MDExY1wxXHUwMWE2IisKLSAgICAiXDdcdTAxMWNcMVwwXDFcdTAxYTdcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWRcMVx1MDFhN1wxXHUwMTFkIisKLSAgICAiXDFcdTAxNDFcMjVcdTAxMWRcMVx1MDFhN1wyXHUwMTFkXDFcdTAxYTdcMlx1MDExZFwxXHUwMWE3XDEwXHUwMTFkIisKLSAgICAiXDFcdTAxYTdcNFx1MDExZFwxXHUwMWE3XDdcdTAxMWRcMVwwXDJcdTAxMDVcMVx1MDEwNlwxXHUwMTA1IisKLSAgICAiXDFcMFwzXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxMDlcMTFcdTAxMDVcMVwwXDQ1XHUwMTA1IisKLSAgICAiXDFcMFwxXHUwMWE4XDFcdTAxMDdcMVx1MDEzMFwxXHUwMTA3XDFcdTAxMmRcMVx1MDEwN1wxXHUwMWE4IisKLSAgICAiXDI3XHUwMTA3XDFcdTAxYThcMlx1MDEwN1wxXHUwMWE4XDJcdTAxMDdcMVx1MDFhOFwxMFx1MDEwN1wxXHUwMWE4IisKLSAgICAiXDRcdTAxMDdcMVx1MDFhOFw3XHUwMTA3XDFcMFwxXHUwMWE5XDFcdTAxMDhcMVx1MDEzMVwzXHUwMTA4IisKLSAgICAiXDFcdTAxYTlcMVx1MDEwOFwxXHUwMTJkXDI1XHUwMTA4XDFcdTAxYTlcMlx1MDEwOFwxXHUwMWE5XDJcdTAxMDgiKwotICAgICJcMVx1MDFhOVwxMFx1MDEwOFwxXHUwMWE5XDRcdTAxMDhcMVx1MDFhOVw3XHUwMTA4XDFcMFwyXHUwMTE5IisKLSAgICAiXDFcdTAxMWFcMVx1MDExOVwxXDBcM1x1MDExOVwxXDBcMVx1MDExOVwxXHUwMTFlXDExXHUwMTE5IisKLSAgICAiXDFcMFw0NVx1MDExOVwxXDBcMVx1MDFhYVwxXHUwMTFjXDFcdTAxNDRcMVx1MDExY1wxXHUwMTQxIisKLSAgICAiXDFcdTAxMWNcMVx1MDFhYVwyN1x1MDExY1wxXHUwMWFhXDJcdTAxMWNcMVx1MDFhYVwyXHUwMTFjXDFcdTAxYWEiKwotICAgICJcMTBcdTAxMWNcMVx1MDFhYVw0XHUwMTFjXDFcdTAxYWFcN1x1MDExY1wxXDBcMVx1MDFhYlwxXHUwMTFkIisKLSAgICAiXDFcdTAxNDVcM1x1MDExZFwxXHUwMWFiXDFcdTAxMWRcMVx1MDE0MVwyNVx1MDExZFwxXHUwMWFiXDJcdTAxMWQiKwotICAgICJcMVx1MDFhYlwyXHUwMTFkXDFcdTAxYWJcMTBcdTAxMWRcMVx1MDFhYlw0XHUwMTFkXDFcdTAxYWJcN1x1MDExZCIrCi0gICAgIlwxXDBcMlx1MDEwN1wxXHUwMTMwXDFcdTAxMDdcMVx1MDEyZFw2NVx1MDEwN1wxXDBcMlx1MDEwOCIrCi0gICAgIlwxXHUwMTMxXDVcdTAxMDhcMVx1MDEyZFw2MVx1MDEwOFwxXDBcMlx1MDExY1wxXHUwMTQ0XDFcdTAxMWMiKwotICAgICJcMVx1MDE0MVw2NVx1MDExY1wxXDBcMlx1MDExZFwxXHUwMTQ1XDVcdTAxMWRcMVx1MDE0MVw2MVx1MDExZCI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotLy8gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLS8vICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsICAxLCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDMsICA5LCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDMsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgMTMsICA3LCAgMCwgIDEsICAwLCAKLSAgICAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgIDAsICA5LCAgMSwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgMTMsICA3LCAgMSwgIDksIAotICAgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgCi0gICAgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICA5LCAgMCwgIDEsIAotICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDksICAwLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsIAotICAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMSwgIDEsICA5LCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgCi0gICAgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLS8vICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQ7Ci0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsKLS8vCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7Ci0JCWZJbml0aWFsQnVmZmVyU2l6ZSA9IHNpemU7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0OwotCQlpbnQgc3RhcnQ7Ci0JCWludCB0ZXh0TGVuZ3RoOwotCQlpbnQgbGVuZ3RoOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCAhPSBudWxsKSB7Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQotCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotLy8JCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncwotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgPT0gVU5ERUZJTkVEKSB7Ci0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOwotCQkJCXNwYWNlRm9sbG93cyA9IGZhbHNlOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX1MpOwotCQkJCX0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQKLQkJCQkJaWYgKHNwYWNlRm9sbG93cykgewotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQKLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQkJbGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZgotCQkJCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0vLwkJCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsKLQkJCX0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAJfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8KLSAgCXB1YmxpYyBmaW5hbCBMaXN0IHBhcnNlVGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gIAkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgCQlDU1NUZXh0VG9rZW4gdG9rZW47Ci0JCWZvciAoU3RyaW5nIGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCk7IGtpbmQgIT0gbnVsbDsga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKSkgewotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7Ci0JCQl0b2tlbi5raW5kID0ga2luZDsgIAkJCQkKLQkJCXRva2VuLnN0YXJ0ID0geXljaGFyOwotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCXRva2VuLmltYWdlID0geXl0ZXh0KCk7Ci0JCQl0b2tlbnMuYWRkKHRva2VuKTsKLQkJfQotCi0gIAkJcmV0dXJuIHRva2VuczsKLSAgCX0KLSAgCQotICAJLyogdXNlciBtZXRob2QgKi8KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsKLSAgCQlpZiAodHlwZSA9PSBDU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLSAgCQkJcmV0dXJuIGZhbHNlOwotICAJCX0gZWxzZSB7Ci0gIAkJCXJldHVybiB0cnVlOwotICAJCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB5eWNoYXI7Ci0JfQotCQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7Ci0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07Ci0JCX0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQotCQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCQlmcm9tIGlucHV0ICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLQkJICogbWF0Y2hlZCB0ZXh0Ci0JCSAqLwotLy8JCXl5Y29sdW1uID0gMDsgCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkJICovCi0vLwkJeXlfYXRCT0wgPSBmYWxzZTsKLQkJCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8KLQkJLy8JCWZVbmRlZmluZWQuZGVsZXRlKDAsIGZVbmRlZmluZWQubGVuZ3RoKCkpOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIENTU1Rva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzIwNzA5XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzM5MikgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0vLyAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotLy8gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLS8vICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotLy8KLS8vICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotICAgICAgeXlfd2FzX3B1c2hiYWNrID0gZmFsc2U7Ci0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDQxNjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyAgfQotICAgICAgICBjYXNlIDQyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsgIH0KLSAgICAgICAgY2FzZSA0Mjk6IGJyZWFrOwotICAgICAgICBjYXNlIDM3MDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7ICB9Ci0gICAgICAgIGNhc2UgNDMwOiBicmVhazsKLSAgICAgICAgY2FzZSAzMzA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyAgfQotICAgICAgICBjYXNlIDQzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjkyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7ICB9Ci0gICAgICAgIGNhc2UgNDMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyODU6IAotICAgICAgICBjYXNlIDMyMjogCi0gICAgICAgIGNhc2UgMzkzOiAKLSAgICAgICAgY2FzZSAzOTU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgIH0KLSAgICAgICAgY2FzZSA0MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2NDogCi0gICAgICAgIGNhc2UgMzAyOiAKLSAgICAgICAgY2FzZSAzODA6IAotICAgICAgICBjYXNlIDM4MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7ICB9Ci0gICAgICAgIGNhc2UgNDM0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgIH0KLSAgICAgICAgY2FzZSA0MzU6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAgcmV0dXJuIENTU19DT01NRU5UOyAgfQotICAgICAgICBjYXNlIDQzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0NETzsgIH0KLSAgICAgICAgY2FzZSA0Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgY2FzZSAyNzg6IAotICAgICAgICBjYXNlIDI3OTogCi0gICAgICAgIGNhc2UgMzE4OiAKLSAgICAgICAgY2FzZSAzMTk6IAotICAgICAgICBjYXNlIDM1ODogCi0gICAgICAgIGNhc2UgMzU5OiAKLSAgICAgICAgY2FzZSAzODk6IAotICAgICAgICBjYXNlIDM5MDogCi0gICAgICAgIGNhc2UgNDAyOiAKLSAgICAgICAgY2FzZSA0MTI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7ICB9Ci0gICAgICAgIGNhc2UgNDM4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTk6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfQ0RDOyAgfQotICAgICAgICBjYXNlIDQzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7ICB9Ci0gICAgICAgIGNhc2UgNDQwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDIwNDogCi0gICAgICAgIGNhc2UgMjM5OiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICBjYXNlIDMxNzogCi0gICAgICAgIGNhc2UgMzU3OiAKLSAgICAgICAgY2FzZSAzODg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7ICB9Ci0gICAgICAgIGNhc2UgNDQxOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7ICB9Ci0gICAgICAgIGNhc2UgNDQyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDIzMDogCi0gICAgICAgIGNhc2UgMjY4OiAKLSAgICAgICAgY2FzZSAzMDg6IAotICAgICAgICBjYXNlIDM0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyAgfQotICAgICAgICBjYXNlIDQ0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDQ1OiBicmVhazsKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyAgfQotICAgICAgICBjYXNlIDQ0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAyMjk6IAotICAgICAgICBjYXNlIDI2NzogCi0gICAgICAgIGNhc2UgMzA3OiAKLSAgICAgICAgY2FzZSAzNDc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDQ3OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgIH0KLSAgICAgICAgY2FzZSA0NDg6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgY2FzZSAyMjg6IAotICAgICAgICBjYXNlIDI2NjogCi0gICAgICAgIGNhc2UgMzA2OiAKLSAgICAgICAgY2FzZSAzNDY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07ICB9Ci0gICAgICAgIGNhc2UgNDUwOiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDUxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyNDQ6IAotICAgICAgICBjYXNlIDI4NzogCi0gICAgICAgIGNhc2UgMzI2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7ICB9Ci0gICAgICAgIGNhc2UgNDUyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDE1NzogCi0gICAgICAgICAgeyAgcmV0dXJuIENTU19TOyAgfQotICAgICAgICBjYXNlIDQ1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7ICB9Ci0gICAgICAgIGNhc2UgNDU0OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMOyAgfQotICAgICAgICBjYXNlIDQ1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVDsgIH0KLSAgICAgICAgY2FzZSA0NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyAgfQotICAgICAgICBjYXNlIDQ1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAyMjc6IAotICAgICAgICBjYXNlIDI2NTogCi0gICAgICAgIGNhc2UgMzA1OiAKLSAgICAgICAgY2FzZSAzNDU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyAgfQotICAgICAgICBjYXNlIDQ1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDU5OiBicmVhazsKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgIH0KLSAgICAgICAgY2FzZSA0NjA6IGJyZWFrOwotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICBjYXNlIDMwOTogCi0gICAgICAgIGNhc2UgMzQ5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsgIH0KLSAgICAgICAgY2FzZSA0NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMjM0OiAKLSAgICAgICAgY2FzZSAyNzI6IAotICAgICAgICBjYXNlIDMxMjogCi0gICAgICAgIGNhc2UgMzUyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7ICB9Ci0gICAgICAgIGNhc2UgNDYyOiBicmVhazsKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOyAgfQotICAgICAgICBjYXNlIDQ2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDY0OiBicmVhazsKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgMTQ5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVI7ICB9Ci0gICAgICAgIGNhc2UgNDY1OiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICBjYXNlIDE0MzogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDIwNjogCi0gICAgICAgIGNhc2UgMjM2OiAKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICBjYXNlIDMxNDogCi0gICAgICAgIGNhc2UgMzU0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsgIH0KLSAgICAgICAgY2FzZSA0NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsgIH0KLSAgICAgICAgY2FzZSA0Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDY4OiBicmVhazsKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgMTYwOiAKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICBjYXNlIDI0NTogCi0gICAgICAgIGNhc2UgMjg4OiAKLSAgICAgICAgY2FzZSAzMjc6IAotICAgICAgICBjYXNlIDM2ODogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7ICB9Ci0gICAgICAgIGNhc2UgNDY5OiBicmVhazsKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgMTYxOiAKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICBjYXNlIDI0NjogCi0gICAgICAgIGNhc2UgMjg5OiAKLSAgICAgICAgY2FzZSAzMjg6IAotICAgICAgICBjYXNlIDM2OTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7ICB9Ci0gICAgICAgIGNhc2UgNDcwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgY2FzZSAyNTM6IAotICAgICAgICBjYXNlIDI1NTogCi0gICAgICAgIGNhc2UgMjk1OiAKLSAgICAgICAgY2FzZSAzMzM6IAotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyAgfQotICAgICAgICBjYXNlIDQ3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyAgfQotICAgICAgICBjYXNlIDQ3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE4MTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7ICB9Ci0gICAgICAgIGNhc2UgNDczOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzY6IAotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgIGNhc2UgMjM1OiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICBjYXNlIDMxMzogCi0gICAgICAgIGNhc2UgMzUzOiAKLSAgICAgICAgY2FzZSAzODU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsgIH0KLSAgICAgICAgY2FzZSA0NzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRTsgIH0KLSAgICAgICAgY2FzZSA0NzU6IGJyZWFrOwotICAgICAgICBjYXNlIDE0MjogCi0gICAgICAgIGNhc2UgMjQyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsgIH0KLSAgICAgICAgY2FzZSA0NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgNDc3OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0gICAqCi0gICAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4KLSAgICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0gICAqIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotICAgKiAgICAgICAgICAgICAgIHRoZSBzY2FubmVyIG9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotICAgICAgQ1NTVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBDU1NUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBDU1NUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotICAgICAgICB9IHdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE1ZWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0lDU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBjdXJyZW50bHkgcHJvdmlkZSB0aGlzIGludGVyZmFjZSBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NUb2tlbml6ZXIgewotCi0Jdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IGluaXRpYWxTdGF0ZSk7Ci0KLQl2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBidWZzaXplKTsKLQotCWJvb2xlYW4gaXNFT0YoKTsKLQotCXZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IGkpOwotCi0JSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVzZXQoY2hhcltdIGNzKTsKLQotCWludCBnZXRPZmZzZXQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmRjZGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1RleHRSZWdpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NUZXh0UmVnaW9uRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVJlZ2lvbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlyZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIENTU1RleHRSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU1RleHRSZWdpb25GYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTUmVnaW9uQ29udGV4dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjOGFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTUmVnaW9uQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1JlZ2lvbkNvbnRleHRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ09NTUVOVCA9ICJDT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DRE8gPSAiQ0RPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DREMgPSAiQ0RDIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TID0gIlMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVMSU1JVEVSID0gIkRFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTEJSQUNFID0gIkxCUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUkJSQUNFID0gIlJCUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19JTVBPUlQgPSAiSU1QT1JUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QQUdFID0gIlBBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX01FRElBID0gIk1FRElBIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19GT05UX0ZBQ0UgPSAiRk9OVF9GQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DSEFSU0VUID0gIkNIQVJTRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0FUS0VZV09SRCA9ICJBVEtFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU1RSSU5HID0gIlNUUklORyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVVJJID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESVVNID0gIk1FRElVTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESUFfU0VQQVJBVE9SID0gIk1FRElBX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DSEFSU0VUX05BTUUgPSAiQ0hBUlNFVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BBR0VfU0VMRUNUT1IgPSAiQ1NTX1BBR0VfU0VMRUNUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FID0gIlNFTEVDVE9SX0VMRU1FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMID0gIlNFTEVDVE9SX1VOSVZFUlNBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfUFNFVURPID0gIlNFTEVDVE9SX1BTRVVETyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQ0xBU1MgPSAiU0VMRUNUT1JfQ0xBU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0lEID0gIlNFTEVDVE9SX0lEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SID0gIlNFTEVDVE9SX0NPTUJJTkFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiA9ICJTRUxFQ1RPUl9TRVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUID0gIlNFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFID0gIlNFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SID0gIlNFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWSA9ICJERUNMQVJBVElPTl9QUk9QRVJUWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gIkRFQ0xBUkFUSU9OX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSID0gIkRFQ0xBUkFUSU9OX0RFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgPSAiREVDTEFSQVRJT05fVkFMVUVfSURFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiA9ICJERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgPSAiREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04gPSAiREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgPSAiREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkgPSAiREVDTEFSQVRJT05fVkFMVUVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0hBU0giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UgPSAiREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UID0gIkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9TID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVU5LTk9XTiA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRm9yIG51bGwgb2JqZWN0IDogQ1NTVG9rZW5pemVyIG5ldmVyIHNldCB0aGlzIHZhbHVlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1VOREVGSU5FRCA9ICJVTkRFRklORUQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0gCSAqIGN1cnJlbnRseSBwcm92aWRlZCB0aGlzIGZpZWxkIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0ZPUkVJR05fRUxFTUVOVCA9ICJGT1JFSUdOX0VMRU1FTlQiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmMzZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1Rva2VuaXplcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UGFyc2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NUWUxFU0hFRVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT04gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT05fVkFMVUUgPSAyOwotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JfQotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUsIFJlYWRlciByZWFkZXIpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUsIFN0cmluZyBpbnB1dCkgewotCQlpbml0aWFsaXplUGFyc2VyTW9kZShwYXJzZXJNb2RlKTsKLQkJcmVzZXQoaW5wdXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCksIDApOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0VG9rZW5bXSBnZXRUb2tlbnMoKSB7Ci0JCUxpc3QgdG9rZW5MaXN0ID0gZ2V0VG9rZW5MaXN0KCk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IG5ldyBDU1NUZXh0VG9rZW5bdG9rZW5MaXN0LnNpemUoKV07Ci0JCXJldHVybiAoQ1NTVGV4dFRva2VuW10pIHRva2VuTGlzdC50b0FycmF5KHRva2Vucyk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VG9rZW5MaXN0KCkgewotCQlMaXN0IHRva2VuczsKLQkJdHJ5IHsKLQkJCXRva2VucyA9IGdldFRva2VuaXplcigpLnBhcnNlVGV4dCgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0b2tlbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYXJzZXJNb2RlKGludCBwYXJzZXJNb2RlKSB7Ci0JCWludCBpbml0aWFsU3RhdGU7Ci0JCWludCBidWZzaXplOwotCQlzd2l0Y2ggKHBhcnNlck1vZGUpIHsKLQkJCWNhc2UgTU9ERV9TVFlMRVNIRUVUIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuWVlJTklUSUFMOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT047Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVfREVDTEFSQVRJT05fVkFMVUUgOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5TVF9ERUNMQVJBVElPTl9QUkVfVkFMVUU7Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9TTUFMTDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybjsKLQkJfQotCQlpZiAoMCA8IGluaXRpYWxTdGF0ZSkgewotCQkJQ1NTVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxTdGF0ZShpbml0aWFsU3RhdGUpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxCdWZmZXJTaXplKGJ1ZnNpemUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDU1NUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGZUb2tlbml6ZXIgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZjAxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0VG9rZW4gewotCXB1YmxpYyBTdHJpbmcga2luZDsKLQlwdWJsaWMgU3RyaW5nIGltYWdlOwotCXB1YmxpYyBpbnQgc3RhcnQ7Ci0JcHVibGljIGludCBsZW5ndGg7Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKGltYWdlICE9IG51bGwpID8gaW1hZ2UgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU2Mjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBDU1MgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQotCQkvLyBmb3JtYXR0aW5nIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgNzIpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMsIGZhbHNlKTsKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSwgMSk7Ci0KLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIHRydWUpOwotCi0JCS8vIGNvZGUgZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VULCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlZmF1bHRFbmMgPSAiVVRGLTgiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeXN0ZW1FbmMgIT0gbnVsbCkgewotCQkJZGVmYXVsdEVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRQcmVmZXJyZWREZWZhdWx0SWFuYU5hbWUoc3lzdGVtRW5jLCAiVVRGLTgiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsIGRlZmF1bHRFbmMpOwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJjc3MiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGFkZGl0aW9uYWwgY3NzIGNvcmUgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0sIDApOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0sIDEpOwotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSwgIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9CRVRXRUVOX1ZBTFVFLCAiICIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSwgZmFsc2UpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQkvLyBDU1MgY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9WQUxVRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZhMDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENTUyBjb3JlIHByZWZlcmVuY2Uga2V5cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9JREVOVElGSUVSID0gImlkZW50aWZpZXJDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJPUEVSVFlfTkFNRSA9ICJwcm9wTmFtZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9QUk9QRVJUWV9WQUxVRSA9ICJwcm9wVmFsdWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9CRVRXRUVOX1ZBTFVFID0gImJldHdlZW5WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QT1NUX0RFTElNID0gInBvc3REZWxpbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QUkVfREVMSU0gPSAicHJlRGVsaW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1FVT1RFID0gInF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9RVU9URV9JTl9VUkkgPSAicXVvdGVJblVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UgPSAibmV3TGluZU9uT3BlbkJyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQSU5HX09ORV9QRVJfTElORSA9ICJvbmVQcm9wZXJ0eVBlckxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSID0gInByb2hpYml0V3JhcE9uQXR0ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfSURFTlRJRklFUiA9ICJjbGVhbnVwSWRlbnRpZmllckNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUgPSAiY2xlYW51cFByb3BOYW1lQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUgPSAiY2xlYW51cFByb3BWYWx1ZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1NFTEVDVE9SID0gImNsZWFudXBTZWxlY3RvckNhc2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHRlbnNpb24gdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIE5ldyBDU1MgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIG1heGltdW0gd2lkdGggb2YgYSBsaW5lIGJlZm9yZSBhIGxpbmUgc3BsaXQgaXMgbmVlZGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfV0lEVEggPSAibGluZVdpZHRoIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgYWxsIGJsYW5rcyBsaW5lcyBzaG91bGQgYmUgY2xlYXJlZCBkdXJpbmcgZm9ybWF0dGluZy4KLQkgKiBCbGFuayBsaW5lcyB3aWxsIGJlIGtlcHQgd2hlbiBmYWxzZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9BTExfQkxBTktfTElORVMgPSAiY2xlYXJBbGxCbGFua0xpbmVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mICNJTkRFTlRBVElPTl9DSEFSIGZvciAxIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX1NJWkUgPSAiaW5kZW50YXRpb25TaXplIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIHVzZWQgZm9yIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUQUIsIFNQQUNFfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9DSEFSID0gImluZGVudGF0aW9uQ2hhciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogdGFiIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjU1BBQ0UKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gInRhYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHNwYWNlIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjVEFCCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFID0gInNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHF1b3RlIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGNhc2UgcHJlZmVyZW5jZXMgSW5kaWNhdGVzIHRvIGxlYXZlIGNhc2UgYXMgaXMuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNVUFBFUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTSVMgPSAwOwotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBjYXNlIHByZWZlcmVuY2VzIEluZGljYXRlcyB0byBtYWtlIG5hbWUKLQkgKiBsb3dlcmNhc2UuCi0JICogCi0JICogQHNlZSAjQVNJUwotCSAqIEBzZWUgI1VQUEVSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XRVIgPSAxOwotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBjYXNlIHByZWZlcmVuY2VzIEluZGljYXRlcyB0byBtYWtlIG5hbWUKLQkgKiB1cHBlcmNhc2UuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNBU0lTCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVIgPSAyOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lDU1NNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4YWUwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lDU1NNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTW9kZWxBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyYWMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lNb2RlbFByb3ZpZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFByb3ZpZGVBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgbW9kZWxQcm92aWRlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLQotCS8qKgotCSAqLwotCXZvaWQgbW9kZWxSZWxlYXNlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLQotCS8qKgotCSAqLwotCXZvaWQgbW9kZWxSZW1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdmMWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJQ1NTTW9kZWxBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NzgzNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2VsZWN0b3JBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHBzZXVkb05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlib29sZWFuIG1hdGNoKElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTgyNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2hlZXRBZGFwdGVyIGV4dGVuZHMgSUNTU01vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEhUTUwvWE1MIGVsZW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBhZGFwdGVyCi0JICovCi0JRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIENTUyBkb2N1bWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhpcyBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0U2hlZXQoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSB0aW1lIG9mIHJlbGVhc2luZyBIVE1ML1hNTCBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgdGltZSBvZiByZW1vdmluZyB0aGlzIEVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyNzc0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2hlZXRMaXN0QWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlFbnVtZXJhdGlvbiBnZXRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXRMaXN0IGdldFN0eWxlU2hlZXRzKCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTYyMmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBvbmUgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckNTUyB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9DU1MgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODRjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NBY2Nlc3MgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0JVmVjdG9yIGdldENsYXNzTmFtZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBdHRyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBdHRyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMWU0YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NBdHRyIGV4dGVuZHMgSUNTU05vZGUgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlJQ1NTTm9kZSBnZXRPd25lckNTU05vZGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0NoYXJzZXRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njg3ZWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0NoYXJzZXRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0NoYXJzZXRSdWxlIGV4dGVuZHMgSUNTU05vZGUsIENTU0NoYXJzZXRSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgRU5DT0RJTkcgPSAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NTYyYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTRG9jdW1lbnQgZXh0ZW5kcyBJQ1NTTm9kZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCUlDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlIGNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCUlDU1NJbXBvcnRSdWxlIGNyZWF0ZUNTU0ltcG9ydFJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLklDU1NNZWRpYVJ1bGUKLQkgKi8KLQlJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHByaW1pdGl2ZVR5cGUpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKFN0cmluZyBydWxlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCUlDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCUNTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCU1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0RvY3VtZW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTSW1wb3J0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTE0YWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0ltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NJbXBvcnRSdWxlIGV4dGVuZHMgSUNTU05vZGUsIENTU0ltcG9ydFJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBIUkVGID0gImhyZWYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlZnJlc2hTdHlsZVNoZWV0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHJlZgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTWVkaWFSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmOTVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NNZWRpYVJ1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU01lZGlhUnVsZSBleHRlbmRzIElDU1NOb2RlLCBJQ1NTUnVsZUNvbnRhaW5lciwgQ1NTTWVkaWFSdWxlIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDU3Y2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NNb2RlbCBleHRlbmRzIElDU1NTdHlsZU5vdGlmaWVyLCBJU3RydWN0dXJlZE1vZGVsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMID0gImV4dGVybmFsQ1NTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEID0gImVtYmVkZGVkQ1NTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTElORSA9ICJpbmxpbmVDU1MiOyAvLyROT04tTkxTLTEkCi0KLQlJQ1NTRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0T3duZXJET01Ob2RlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlPYmplY3QgZ2V0U3R5bGVTaGVldFR5cGUoKTsKLQotCS8qKgotCSAqIGNsZWFudXAgLT4gcmVidWlsZCBDU1MgTm9kZXMgVGhpcyBpcyBwcmUtYmV0YSBmaXggZm9yIDE3ODE3Ni4KLQkgKi8KLQl2b2lkIHJlZnJlc2hOb2RlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTmFtZWROb2RlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YzEzNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTmFtZWROb2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU05hbWVkTm9kZU1hcCBleHRlbmRzIElDU1NOb2RlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlJQ1NTTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2OTFiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU05vZGUgewotCi0Jc2hvcnQgQVRUUl9OT0RFID0gLTE7Ci0Jc2hvcnQgVU5LTk9XTlJVTEVfTk9ERSA9IDA7Ci0Jc2hvcnQgU1RZTEVSVUxFX05PREUgPSAxOwotCXNob3J0IENIQVJTRVRSVUxFX05PREUgPSAyOwotCXNob3J0IElNUE9SVFJVTEVfTk9ERSA9IDM7Ci0Jc2hvcnQgTUVESUFSVUxFX05PREUgPSA0OwotCXNob3J0IEZPTlRGQUNFUlVMRV9OT0RFID0gNTsKLQlzaG9ydCBQQUdFUlVMRV9OT0RFID0gNjsKLQlzaG9ydCBTVFlMRVNIRUVUX05PREUgPSA3OwotCXNob3J0IFNUWUxFREVDTEFSQVRJT05fTk9ERSA9IDg7Ci0Jc2hvcnQgU1RZTEVERUNMSVRFTV9OT0RFID0gOTsKLQlzaG9ydCBWQUxVRUxJU1RfTk9ERSA9IDEwOwotCXNob3J0IFBSSU1JVElWRVZBTFVFX05PREUgPSAxMTsKLQlzaG9ydCBNRURJQUxJU1RfTk9ERSA9IDEyOwotCXNob3J0IERPQ1VNRU5UQ1NTU1RZTEVfTk9ERSA9IDEzOwotCXNob3J0IExJTktTVFlMRV9OT0RFID0gMTQ7Ci0Jc2hvcnQgRUxFTUVOVENTU0lOTElORVNUWUxFX05PREUgPSAxNTsKLQotCUlDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTmFtZWROb2RlTWFwCi0JICovCi0JSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCk7Ci0KLQlJQ1NTTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpOwotCi0JSUNTU05vZGUgZ2V0Rmlyc3RDaGlsZCgpOwotCi0JSUNTU05vZGUgZ2V0TGFzdENoaWxkKCk7Ci0KLQlJQ1NTTm9kZSBnZXROZXh0U2libGluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldE5vZGVUeXBlKCk7Ci0KLQlJQ1NTRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpOwotCi0JSUNTU05vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoaWxkTm9kZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0MzIzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOb2RlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCUlDU1NOb2RlIGl0ZW0oaW50IGluZGV4KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQYWdlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyNjg3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQYWdlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQYWdlUnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NQYWdlUnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIFNFTEVDVE9SID0gInNlbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JSUNTU1NlbGVjdG9yTGlzdCBnZXRTZWxlY3RvcnMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQcmltaXRpdmVWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhMGViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQcmltaXRpdmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQcmltaXRpdmVWYWx1ZSBleHRlbmRzIElDU1NOb2RlLCBJQ1NTVmFsdWUsIENTU1ByaW1pdGl2ZVZhbHVlIHsKLQotCXNob3J0IENTU19JTlRFR0VSID0gMjY7Ci0Jc2hvcnQgQ1NTX0hBU0ggPSAyNzsKLQlzaG9ydCBDU1NfVVJBTkdFID0gMjg7Ci0Jc2hvcnQgQ1NTX0ZPUk1BVCA9IDI5OwotCXNob3J0IENTU19MT0NBTCA9IDMwOwotCXNob3J0IENTU19TTEFTSCA9IDMxOwotCXNob3J0IENTU19DT01NQSA9IDMyOwotCXNob3J0IENTU19JTkhFUklUX1BSSU1JVElWRSA9IDMzOwotCi0JLyoqCi0JICogQHBhcmFtIGZsb2F0VmFsdWUKLQkgKiAgICAgICAgICAgIGZsb2F0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoZmxvYXQgZmxvYXRWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyBzdHJpbmdWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NSdWxlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NSdWxlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmUxZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NSdWxlQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JQ1NTUnVsZSBhcHBlbmRSdWxlKENTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3UnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcmVmUnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlDU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUoQ1NTUnVsZSBuZXdSdWxlLCBDU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgcmVtb3ZlUnVsZShDU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JQ1NTUnVsZSByZXBsYWNlUnVsZShDU1NSdWxlIG5ld1J1bGUsIENTU1J1bGUgb2xkUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlN2JlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3IgewotCi0JSUNTU1NlbGVjdG9ySXRlbSBnZXRJdGVtKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCUl0ZXJhdG9yIGdldEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFNwZWNpZmljaXR5KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCWJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXRFcnJvcnMoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRFcnJvckNvdW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlMjVhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGV4dGVuZHMgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgREVTQ0VOREFOVCA9ICcgJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hJTEQgPSAnPic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEFESkFDRU5UID0gJysnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBVTktOT1dOID0gJz8nOyAvLyBlcnJvciBjYXNlCi0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWNoYXIgZ2V0Q29tYmluYXRvclR5cGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9ySXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM1ODViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9ySXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5BVE9SID0gMjsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEl0ZW1UeXBlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxNGNlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCUl0ZXJhdG9yIGdldEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLlZlY3RvcgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSUNTU1NlbGVjdG9yIGdldFNlbGVjdG9yKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0RXJyb3JDb3VudCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCWJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTc3OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2ltcGxlU2VsZWN0b3IgZXh0ZW5kcyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3MoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldElEKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mSURzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0UHNldWRvTmFtZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc1VuaXZlcnNhbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbEl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNzBjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlRGVjbEl0ZW0gZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1ZhbHVlTGlzdCB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIElNUE9SVEFOVCA9ICJpbXBvcnRhbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqLwotCUNTU1ZhbHVlIGdldENTU1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0UHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVwbGFjZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIG9sZFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRQcmlvcml0eShTdHJpbmcgcHJpb3JpdHkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ODdmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBleHRlbmRzIElDU1NEb2N1bWVudCwgQ1NTU3R5bGVEZWNsYXJhdGlvbiB7Ci0KLQlJQ1NTU3R5bGVEZWNsSXRlbSBnZXREZWNsSXRlbU5vZGUoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQlJQ1NTU3R5bGVEZWNsSXRlbSByZW1vdmVEZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gb2xkRGVjbCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCUlDU1NTdHlsZURlY2xJdGVtIHNldERlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBuZXdEZWNsKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDQxNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTU3R5bGVSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgU0VMRUNUT1IgPSAic2VsZWN0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlU2hlZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlU2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4NmQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlU2hlZXQgZXh0ZW5kcyBJQ1NTRG9jdW1lbnQsIElDU1NSdWxlQ29udGFpbmVyLCBDU1NTdHlsZVNoZWV0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlOb2RlTGlzdCBnZXRPd25lck5vZGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIGRvYwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlOb2RlTGlzdCBnZXRPd25lck5vZGVzKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdAotCSAqLwotCUNTU1J1bGVMaXN0IGdldE93bmVyUnVsZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QKLQkgKi8KLQlTdHlsZVNoZWV0TGlzdCBnZXRQYXJlbnRTdHlsZVNoZWV0cygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzMyMzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1ZhbHVlIGV4dGVuZHMgQ1NTVmFsdWUgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NmU0NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWVMaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NWYWx1ZUxpc3QgZXh0ZW5kcyBJQ1NTVmFsdWUsIENTU1ZhbHVlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGFwcGVuZFZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ291bnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVhMTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb3VudGVyIGV4dGVuZHMgSUNTU05vZGUsIENvdW50ZXIgewotCi0JamF2YS5sYW5nLlN0cmluZyBJREVOVElGSUVSID0gImlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JamF2YS5sYW5nLlN0cmluZyBMSVNUU1RZTEUgPSAibGlzdHN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWphdmEubGFuZy5TdHJpbmcgU0VQQVJBVE9SID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0U3R5bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRMaXN0U3R5bGUoU3RyaW5nIGxpc3RTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBTZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHNlcGFyYXRvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbkNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4ODkxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbkNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkRPTUltcGxlbWVudGF0aW9uQ1NTOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01JbXBsZW1lbnRhdGlvbkNTUyBleHRlbmRzIERPTUltcGxlbWVudGF0aW9uQ1NTIHsKLQotCUlDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkYmVkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5Eb2N1bWVudFN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50U3R5bGUgZXh0ZW5kcyBEb2N1bWVudFN0eWxlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IGFwcGVuZFNoZWV0KFN0eWxlU2hlZXQgbmV3U2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gbmV3U2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gcmVmU2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCBpbnNlcnRTaGVldEJlZm9yZShTdHlsZVNoZWV0IG5ld1NoZWV0LCBTdHlsZVNoZWV0IHJlZlNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG9sZFNoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgcmVtb3ZlU2hlZXQoU3R5bGVTaGVldCBvbGRTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBvbGRTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IHJlcGxhY2VTaGVldChTdHlsZVNoZWV0IG5ld1NoZWV0LCBTdHlsZVNoZWV0IG9sZFNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wcmVmZXJlbmNlcy9DU1NQcmVmZXJlbmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTAwNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wcmVmZXJlbmNlcy9DU1NQcmVmZXJlbmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBqdXN0IGFjY2VzcyBwcmVmZXJlbmNlcyBkaXJlY3RseQotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJlZmVyZW5jZUhlbHBlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NQcmVmZXJlbmNlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcmVmZXJlbmNlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJldHdlZW5WYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0JFVFdFRU5fVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNYXhMaW5lV2lkdGgoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVvdGVTdHJpbmcoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCS8vIG5ha2Ftb3JpX1RPRE8gY3NzIHByZWYgdHJhbnNpdGlvbgotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BhY2VzUG9zdERlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZXNQcmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudFVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmVPbk9wZW5CcmFjZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmVQcm9wZXJ0eVBlckxpbmUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvaGliaXRXcmFwT25BdHRyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BOYW1lVXBwZXJDYXNlKCkgewotCQlpZiAoZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcFZhbHVlVXBwZXJDYXNlKCkgewotCQlpZiAoZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1F1b3RlSW5VUkkoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCZXR3ZWVuVmFsdWVTdHJpbmcoU3RyaW5nIG5ld0JldHdlZW5WYWx1ZVN0cmluZykgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0JFVFdFRU5fVkFMVUUsIG5ld0JldHdlZW5WYWx1ZVN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWRlbnRVcHBlckNhc2UoYm9vbGVhbiBuZXdJZGVudFVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdJZGVudFVwcGVyQ2FzZSkKLQkJCXRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSLCB0aGVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPbmVQcm9wZXJ0eVBlckxpbmUoYm9vbGVhbiBuZXdPbmVQcm9wZXJ0eVBlckxpbmUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSwgbmV3T25lUHJvcGVydHlQZXJMaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9oaWJpdFdyYXBPbkF0dHIoYm9vbGVhbiBuZXdQcm9oaWJpdFdyYXBPbkF0dHIpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgbmV3UHJvaGliaXRXcmFwT25BdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wTmFtZVVwcGVyQ2FzZShib29sZWFuIG5ld1Byb3BOYW1lVXBwZXJDYXNlKSB7Ci0JCWludCB0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJaWYgKG5ld1Byb3BOYW1lVXBwZXJDYXNlKQotCQkJdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb3BWYWx1ZVVwcGVyQ2FzZShib29sZWFuIG5ld1Byb3BWYWx1ZVVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdQcm9wVmFsdWVVcHBlckNhc2UpCi0JCQl0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlU3RyaW5nKFN0cmluZyBxdW90ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BhY2VzUG9zdERlbGltaXRlcihpbnQgbnVtKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNLCBudW0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwYWNlc1ByZURlbGltaXRlcihpbnQgbnVtKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0sIG51bSk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJQ1NTQ29yZVBsdWdpbiBjc3NNb2RlbFBsdWdpbiA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gY3NzTW9kZWxQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIENTU1ByZWZlcmVuY2VIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTUHJlZmVyZW5jZUhlbHBlciBmSW5zdGFuY2UgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JQ1NTUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JQ1NTUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5NWM3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUNTU1BhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlczsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlCi0gKiBwYXJ0aXRpb25pbmcgZm9yIENTUyBhbmQgYWxsIGl0cyBwYXJ0aXRpb25zLiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlCi0gKiBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUGFydGl0aW9uVHlwZXMgZXh0ZW5kcyBJU3RydWN0dXJlZFBhcnRpdGlvblR5cGVzIHsKLQotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90YXNrcy9DU1NGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTVmZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90YXNrcy9DU1NGaWxlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyOwotCi1wdWJsaWMgY2xhc3MgQ1NTRmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciB7Ci0JcHVibGljIENTU0ZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1lbnRlZFRleHQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYmVnaW4sIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXh0ID0gc3VwZXIuZ2V0Q29tbWVudGVkVGV4dChkb2N1bWVudCwgYmVnaW4sIGxlbmd0aCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5lbmRzV2l0aCgiKi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDIpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1OGY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgcGxhY2UgdG8gcHV0ICJyZXBhcnNpbmciIGxvZ2ljLiBUaGlzIGlzCi0gKiB0aGUgbG9naWMgdGhhdCByZXBhcnNlcyB0aGUgdGV4dCBpbmNyZW1lbnRhbGx5LCBhcyBhIHVzZXIgdHlwZXMgaW4gbmV3Ci0gKiBjaGFyYWN0ZXJzLCBvciBET00gbm9kZXMgYXJlIGluc2VydGVkIG9yIGRlbGV0ZWQuIE5vdGU6IGl0IGlzIG5vdCBhIHRocmVhZAotICogc2FmZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JY2xhc3MgUmVwYXJzZVJhbmdlIHsKLQkJUmVwYXJzZVJhbmdlKCkgewotCQkJcmVzZXQoKTsKLQkJfQotCi0JCVJlcGFyc2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCX0KLQotCQl2b2lkIHNldFN0YXJ0KGludCBzdGFydCkgewotCQkJZlJhbmdlU3RhcnQgPSBzdGFydDsKLQkJfQotCi0JCXZvaWQgc2V0RW5kKGludCBlbmQpIHsKLQkJCWZSYW5nZUVuZCA9IGVuZDsKLQkJfQotCi0JCWludCBnZXRTdGFydCgpIHsKLQkJCXJldHVybiBmUmFuZ2VTdGFydDsKLQkJfQotCi0JCWludCBnZXRFbmQoKSB7Ci0JCQlyZXR1cm4gZlJhbmdlRW5kOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1ZhbGlkKCkgewotCQkJcmV0dXJuICgwIDwgZlJhbmdlRW5kIC0gZlJhbmdlU3RhcnQpID8gdHJ1ZSA6IGZhbHNlOwotCQl9Ci0KLQkJdm9pZCByZXNldCgpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQlmUmFuZ2VFbmQgPSAwOwotCQl9Ci0KLQkJdm9pZCBleHBhbmQoUmVwYXJzZVJhbmdlIHJhbmdlKSB7Ci0JCQlpZiAocmFuZ2UgPT0gbnVsbCB8fCAhcmFuZ2UuaXNWYWxpZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IHN0YXJ0ID0gcmFuZ2UuZ2V0U3RhcnQoKTsKLQkJCWlmIChzdGFydCA8IGZSYW5nZVN0YXJ0KSB7Ci0JCQkJZlJhbmdlU3RhcnQgPSBzdGFydDsKLQkJCX0KLQkJCWludCBlbmQgPSByYW5nZS5nZXRFbmQoKTsKLQkJCWlmIChmUmFuZ2VFbmQgPCBlbmQpIHsKLQkJCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGludCBmUmFuZ2VTdGFydDsKLQkJcHJpdmF0ZSBpbnQgZlJhbmdlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQkvLyBwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkvLyBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzMigpIHsKLQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBzcGVjaWFsUG9zaXRpb25VcGRhdGUoZlN0YXJ0LCBmU3RhcnQgKwotCS8vIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkvLyBpZiAocmVzdWx0ID09IG51bGwpIHsKLQkvLyByZXN1bHQgPSBjaGVja0luc2lkZUJyYWNlKCk7Ci0JLy8gfQotCS8vIHJldHVybiByZXN1bHQ7Ci0JLy8gfQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCkgewotCQlpbnQgY2hlY2tTdGFydCA9IGZTdGFydDsKLQkJaW50IGNoZWNrRW5kID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZSAtIDE7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChjaGVja0VuZCk7Ci0JCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJY2hlY2tFbmQgPSBlbmRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKGNoZWNrU3RhcnQsIGNoZWNrRW5kKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JEZWxpbWl0ZXIocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yVW5rbm93blJlZ2lvbihyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclF1b3RlcyhyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JDb21tZW50cyhyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JCcmFjZXMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0KLQkJcmVzdWx0ID0gY2hlY2tJbnNpZGVCcmFjZShyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXBhcnNlKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JVbmtub3duUmVnaW9uKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpbnQgbmV3U3RhcnQgPSBzdGFydDsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQgLSAxKTsKLQkJaWYgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJaXRlcmF0b3IucHJldigpOyAvLyBza2lwIG15c2VsZgotCQl9Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLnByZXYoKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQkJbmV3U3RhcnQgPSBpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhcnQgIT0gbmV3U3RhcnQpIHsKLQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKG5ld1N0YXJ0LCBlbmQpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JEZWxpbWl0ZXIoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwgJiYgZGlydHlTdGFydC5nZXRTdGFydCgpIDwgc3RhcnQpIHsKLQkJCXN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGRvY1JlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2UmVnaW9uID0gZG9jUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZXBhcnNlUmFuZ2UocHJldlJlZ2lvbi5nZXRTdGFydCgpLCBlbmQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JRdW90ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICJcIiIsICJcIiIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiXCciLCAiXCciKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yQ29tbWVudHMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICIvKiIsICIqLyIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiPCUiLCAiJT4iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yQnJhY2VzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiWyIsICJdIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICIoIiwgIikiKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgInsiLCAifSIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKHJhbmdlLmlzVmFsaWQoKSkgPyByYW5nZSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0luc2lkZUJyYWNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWJvb2xlYW4gYkRlY2xhcmF0aW9uID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJYkRlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWJEZWNsYXJhdGlvbikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQl0eXBlID0gcHJldlJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCWJEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghYkRlY2xhcmF0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRSZWdpb24gPSBDU1NVdGlsLmZpbmROZXh0U2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IG5leHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCQliRGVjbGFyYXRpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiRGVjbGFyYXRpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSBmaW5kUnVsZVN0YXJ0KHJlZ2lvbik7Ci0JCQlpZiAoc3RhcnRSZWdpb24gIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXBhcnNlKHN0YXJ0UmVnaW9uLCBlbmRSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kUnVsZVN0YXJ0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzdGFydFJlZ2lvbjsKLQkJLy8gZmluZCAneycKLQkJd2hpbGUgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJcmVnaW9uID0gcmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJLy8gaWYgKHJlZ2lvbiA9PSBzdGFydFJlZ2lvbikgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyBlbHNlCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgeyAvLyAneycgaXMgZm91bmQKLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKGlzTGVhZGluZ0RlY2xhcmF0aW9uVHlwZShyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVhZGluZ0RlY2xhcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvclR5cGUodHlwZSkpOwotCX0KLQotCS8vIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCS8vIGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKSB7Ci0JLy8gcmV0dXJuIHNwZWNpYWxQb3NpdGlvblVwZGF0ZShmU3RhcnQsIGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkvLyB9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIG9wZW5lciwgU3RyaW5nIGNsb3NlcikgewotCQlTdHJpbmdCdWZmZXIgZGVsZXRpb25CdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ0J1ZmZlciBpbnNlcnRpb25CdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBxdW90ZUxlbiA9IE1hdGgubWF4KG9wZW5lci5sZW5ndGgoKSwgY2xvc2VyLmxlbmd0aCgpKTsKLQkJaWYgKDEgPCBxdW90ZUxlbikgewotCQkJLyoqCi0JCQkgKiBleCkgb3BlbmVyID0gIkFCQyIsIGNsb3NlciA9ICJYWVoiIG1vZGVsOiBBQkNERUYuLi4uLi4uVVZXWFlaCi0JCQkgKiBkZWxldGlvbjogQ0RFRi4uLi4uLi5VVldYIHByZS9wb3N0OiBBQiAvIFlaCi0JCQkgKi8KLQkJCWludCBhZGRTdGFydCA9IHN0YXJ0IC0gKHF1b3RlTGVuIC0gMSk7Ci0JCQlpZiAoMCA8PSBhZGRTdGFydCkgewotCQkJCVN0cmluZyBhZGRTdHIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChhZGRTdGFydCwgcXVvdGVMZW4gLSAxKTsKLQkJCQlkZWxldGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCQlpbnNlcnRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQl9Ci0JCQlkZWxldGlvbkJ1Zi5hcHBlbmQoZkRlbGV0ZWRUZXh0KTsKLQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoZkNoYW5nZXMpOwotCQkJaWYgKGVuZCArIChxdW90ZUxlbiAtIDEpIDwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCVN0cmluZyBhZGRTdHIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChlbmQgKyAxLCBxdW90ZUxlbiAtIDEpOwotCQkJCWRlbGV0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWRlbGV0aW9uQnVmLmFwcGVuZChmRGVsZXRlZFRleHQpOwotCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChmQ2hhbmdlcyk7Ci0JCX0KLQkJU3RyaW5nIGRlbGV0aW9uID0gZGVsZXRpb25CdWYudG9TdHJpbmcoKTsKLQkJU3RyaW5nIGluc2VydGlvbiA9IGluc2VydGlvbkJ1Zi50b1N0cmluZygpOwotCi0JCWludCByYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCWludCByYW5nZUVuZCA9IGVuZDsKLQotCQlpZiAoMCA8PSBkZWxldGlvbi5pbmRleE9mKG9wZW5lcikgfHwgMCA8PSBkZWxldGlvbi5pbmRleE9mKGNsb3NlcikgfHwgMCA8PSBpbnNlcnRpb24uaW5kZXhPZihvcGVuZXIpIHx8IDAgPD0gaW5zZXJ0aW9uLmluZGV4T2YoY2xvc2VyKSkgewotCQkJaW50IHMsIGU7Ci0JCQl0cnkgewotCQkJCWlmIChzdGFydCA8PSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCUlSZWdpb24gc3RhcnRSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoc3RhcnQgLSAxLCBvcGVuZXIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJaWYgKHN0YXJ0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXMgPSBzdGFydFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXMgPSAtMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcyA9IC0xOwotCQkJCX0KLQkJCQlpZiAoZW5kIDwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpIHsKLQkJCQkJSVJlZ2lvbiBlbmRSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZW5kICsgMSwgY2xvc2VyLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQllID0gZW5kUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZSA9IC0xOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllID0gLTE7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoMCA8PSBzKSB7Ci0JCQkJcmFuZ2VTdGFydCA9IE1hdGgubWluKHJhbmdlU3RhcnQsIHMpOwotCQkJfQotCQkJaWYgKDAgPD0gZSkgewotCQkJCXJhbmdlRW5kID0gTWF0aC5tYXgocmFuZ2VFbmQsIGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJhbmdlU3RhcnQgPCBzdGFydCB8fCBlbmQgPCByYW5nZUVuZCkgewotCQkJcmV0dXJuIG5ldyBSZXBhcnNlUmFuZ2UocmFuZ2VTdGFydCwgcmFuZ2VFbmQpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzRiYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1NTX0dFTkVSSUMgPSAxMDExMDk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQ1NTX0dFTkVSSUMgOgotCQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2ZjczZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFdhbGtlciB7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCA9IG51bGw7Ci0JSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQlTdHJpbmcgZk9yaWdpbmFsQ2hhbmdlcyA9IG51bGw7Ci0JaW50IGZPcmlnaW5hbE9mZnNldCA9IDA7Ci0JaW50IGZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IDA7Ci0JaW50IGZMZW5ndGhEaWZmZXJlbmNlID0gMDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFdhbGtlcihTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpbml0aWFsaXplKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPMSAtPiBPdXRwdXQ6IE8yIElucHV0OiBPMiAtPiBPdXRwdXQ6IE8zIElucHV0OiBPMyAtPiBPdXRwdXQ6IEM0Ci0JICogSW5wdXQ6IENuIC0+IE91dHB1dDogQ24rMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJbmV4dE5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCWlmIChuZXh0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzT2xkTm9kZShub2RlKSkgewotCQkJCQkvLyB0aGlzIG1heSBiZSB0aGUgZW5kIG9mIG9sZCBmbGF0bm9kZXMKLQkJCQkJaW50IG5ld1N0YXJ0ID0gbm9kZS5nZXRFbmQoKSAtIGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJCQluZXh0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3U3RhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV4dE5vZGU7Ci0JfQotCi0JLyoqCi0JICogT2xkIE5vZGVzOiAtLVtPMV0tLVtPMl0tLVtPM10tLS0gOiAvIFwgQ3VycmVudCBOb2RlczoKLQkgKiAtLS1bQzFdLS0tLS1bQzJdLS0tLS1bQzNdLS0tLS1bQzRdLS0tCi0JICogCi0JICogSW5wdXQ6IE8qIC0+IE91dHB1dDogQzQgSW5wdXQ6IENuIC0+IE91dHB1dDogQ24rMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHROb2RlSW5DdXJyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlID0gbnVsbDsKLQkJaWYgKGlzT2xkTm9kZShub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRFbmROb2RlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuaXRlbShmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5nZXRMZW5ndGgoKSAtIDEpOwotCQkJaW50IG5ld1N0YXJ0ID0gb2xkRW5kTm9kZS5nZXRFbmQoKSAtIGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld1N0YXJ0KTsKLQkJfQotCQllbHNlIGlmIChub2RlICE9IG51bGwpIHsKLQkJCW5leHROb2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPMSAtPiBPdXRwdXQ6IEMxIElucHV0OiBPMiAtPiBPdXRwdXQ6IE8xIElucHV0OiBPMyAtPiBPdXRwdXQ6IE8yCi0JICogSW5wdXQ6IENuIC0+IE91dHB1dDogQ24tMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcHJldk5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldk5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCQkJLy8gdGhpcyBtYXkgYmUgdGhlIHN0YXJ0IG9mIG9sZCBmbGF0bm9kZXMKLQkJCQkJaW50IG5ld0VuZCA9IG5vZGUuZ2V0U3RhcnQoKSAtIDE7Ci0JCQkJCXByZXZOb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdFbmQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJldk5vZGU7Ci0JfQotCi0JLyoqCi0JICogT2xkIE5vZGVzOiAtLVtPMV0tLVtPMl0tLVtPM10tLS0gOiAvIFwgQ3VycmVudCBOb2RlczoKLQkgKiAtLS1bQzFdLS0tLS1bQzJdLS0tLS1bQzNdLS0tLS1bQzRdLS0tCi0JICogCi0JICogSW5wdXQ6IE8qIC0+IE91dHB1dDogQzEgSW5wdXQ6IENuIC0+IE91dHB1dDogQ24tMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZOb2RlSW5DdXJyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gbnVsbDsKLQkJaWYgKGlzT2xkTm9kZShub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdGFydE5vZGUgPSBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5pdGVtKDApOwotCQkJaW50IG5ld0VuZCA9IG9sZFN0YXJ0Tm9kZS5nZXRTdGFydCgpIC0gMTsKLQkJCXByZXZOb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdFbmQpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcHJldk5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJcmV0dXJuIHByZXZOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlmT3JpZ2luYWxDaGFuZ2VzID0gZXZlbnQuZ2V0VGV4dCgpOwotCQlmT3JpZ2luYWxPZmZzZXQgPSBldmVudC5nZXRPZmZzZXQoKTsKLQkJZk9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWZMZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoZk9yaWdpbmFsQ2hhbmdlcywgZk9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlKTsKLQotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgewotCQkJZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSBldmVudCkuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQl9Ci0JCWVsc2UgewotCQkJZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbGROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlib29sZWFuIGJPbGQgPSBmYWxzZTsKLQkJaWYgKGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZS5uZXh0RWxlbWVudCgpID09IG5vZGUpIHsKLQkJCQkJYk9sZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYk9sZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDUxY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUyBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gbGVnYWxUeXBlcyA9IG5ldyBTdHJpbmdbXXtJQ1NTUGFydGl0aW9ucy5TVFlMRSwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OfTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBsZWdhbFR5cGVzOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0Fic3RyYWN0Q3NzVHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOWY5YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0Fic3RyYWN0Q3NzVHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9DT05UID0gMDsKLQlwdWJsaWMgc3RhdGljIHNob3J0IFRSQVZfUFJVTkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9TVE9QID0gMjsKLQlwcm90ZWN0ZWQgamF2YS51dGlsLlN0YWNrIHRyYXZTdGFjazsKLQlwcml2YXRlIGJvb2xlYW4gZlRyYXZlcnNlSW1wb3J0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlRyYXZlcnNlSW1wb3J0Rmlyc3QgPSBmYWxzZTsKLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgdHJhdmVyc2VkU2hlZXRzOwotCi0JLyoqCi0JICogQ3NzUHJvcENNTm9kZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENzc1RyYXZlcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KElDU1NNb2RlbCBtb2RlbCkgewotCQlhcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShJQ1NTTm9kZSByb290KSB7Ci0JCXRyYXZTdGFjayA9IG5ldyBTdGFjaygpOwotCQlpZiAoZlRyYXZlcnNlSW1wb3J0ZWQpIHsKLQkJCXRyYXZlcnNlZFNoZWV0cyA9IG5ldyBWZWN0b3IoKTsKLQkJCWlmIChyb290ICE9IG51bGwgJiYgcm9vdC5nZXRPd25lckRvY3VtZW50KCkgIT0gbnVsbCAmJiByb290LmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJCXRyYXZlcnNlZFNoZWV0cy5hZGQocm9vdC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmlyc3QgY2FsbCBiZWdpbigpCi0JCWJlZ2luKHJvb3QpOwotCi0JCS8vIHRyYXZlcnNlCi0JCXRyYXZlcnNlKHJvb3QpOwotCi0JCS8vIGxhc3QgY2FsbCBlbmQoKQotCQllbmQocm9vdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoSUNTU05vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVHJhdmVyc2VJbXBvcnRlZCgpIHsKLQkJcmV0dXJuIGZUcmF2ZXJzZUltcG9ydGVkOwotCX0KLQotCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0ZWQoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydGVkKSB7Ci0JCWZUcmF2ZXJzZUltcG9ydGVkID0gbmV3VHJhdmVyc2VJbXBvcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0Rmlyc3QoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydEZpcnN0KSB7Ci0JCWZUcmF2ZXJzZUltcG9ydEZpcnN0ID0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdDsKLQl9Ci0KLQotCXByaXZhdGUgZmluYWwgc2hvcnQgdHJhdmVyc2UoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQotCQl0cmF2U3RhY2sucHVzaChub2RlKTsKLQotCQkvLyBwcmUtYWN0aW9uCi0JCXNob3J0IHJldCA9IHByZU5vZGUobm9kZSk7Ci0KLQkJaWYgKHJldCA9PSBUUkFWX0NPTlQpIHsKLQkJCWlmIChmVHJhdmVyc2VJbXBvcnRlZCAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkpIHsKLQkJCQlJQ1NTSW1wb3J0UnVsZSBydWxlID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJCS8vIHRyYXZlcnNlIGV4dGVybmFsIHN0eWxlLXNoZWV0Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIHJ1bGUuZ2V0U3R5bGVTaGVldCgpOwotCQkJCWlmIChzaGVldCAhPSBudWxsICYmICF0cmF2ZXJzZWRTaGVldHMuY29udGFpbnMoc2hlZXQpKSB7IC8vIHByZXZlbnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb29wCi0JCQkJCXRyYXZlcnNlZFNoZWV0cy5hZGQoc2hlZXQpOwotCQkJCQlzaG9ydCByZXRFeHQgPSB0cmF2ZXJzZShzaGVldCk7Ci0JCQkJCWlmIChyZXRFeHQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCQl0cmF2U3RhY2sucG9wKCk7Ci0JCQkJCQlyZXR1cm4gcmV0RXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjb2xsZWN0IGNoaWxkcmVuCi0JCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGZUcmF2ZXJzZUltcG9ydEZpcnN0KSB7Ci0JCQkJQXJyYXlMaXN0IG90aGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkKLQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW90aGVycy5hZGQoY2hpbGQpOwotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWNoaWxkcmVuLmFkZEFsbChvdGhlcnMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdHJhdmVyc2UgY2hpbGRyZW4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQljaGlsZCA9IChJQ1NTTm9kZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJCXNob3J0IHJldENoaWxkID0gdHJhdmVyc2UoY2hpbGQpOwotCQkJCWlmIChyZXRDaGlsZCA9PSBUUkFWX1NUT1ApIHsKLQkJCQkJdHJhdlN0YWNrLnBvcCgpOwotCQkJCQlyZXR1cm4gcmV0Q2hpbGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJldCA9PSBUUkFWX1NUT1ApIHsKLQkJCXRyYXZTdGFjay5wb3AoKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvLyBwb3N0LWFjdGlvbgotCQlyZXQgPSBwb3N0Tm9kZShub2RlKTsKLQotCQl0cmF2U3RhY2sucG9wKCk7Ci0JCXJldHVybiAocmV0ID09IFRSQVZfUFJVTkUpID8gVFJBVl9DT05UIDogcmV0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTQ2xhc3NUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NDbGFzc1RyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzU3NGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NDbGFzc1RyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDbGFzc1RyYXZlcnNlciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCUFycmF5TGlzdCBmQ2xhc3NOYW1lczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NDbGFzc1RyYXZlcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lcyhJQ1NTU3R5bGVSdWxlIHJ1bGUpIHsKLQkJSUNTU1NlbGVjdG9yTGlzdCBzZWxlY3Rvckxpc3QgPSBydWxlLmdldFNlbGVjdG9ycygpOwotCQlJdGVyYXRvciBpU2VsZWN0b3IgPSBzZWxlY3Rvckxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlTZWxlY3Rvci5oYXNOZXh0KCkpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IChJQ1NTU2VsZWN0b3IpIGlTZWxlY3Rvci5uZXh0KCk7Ci0JCQlJdGVyYXRvciBpSXRlbSA9IHNlbGVjdG9yLmdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaUl0ZW0uaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGlJdGVtLm5leHQoKTsKLQkJCQlpZiAoaXRlbS5nZXRJdGVtVHlwZSgpID09IElDU1NTZWxlY3Rvckl0ZW0uU0lNUExFKSB7Ci0JCQkJCUlDU1NTaW1wbGVTZWxlY3RvciBzZWwgPSAoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtOwotCQkJCQlpbnQgbkNsYXNzZXMgPSBzZWwuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCQkJCWZvciAoaW50IGlDbGFzcyA9IDA7IGlDbGFzcyA8IG5DbGFzc2VzOyBpQ2xhc3MrKykgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNlbC5nZXRDbGFzcyhpQ2xhc3MpOwotCQkJCQkJaWYgKCFmQ2xhc3NOYW1lcy5jb250YWlucyhjbGFzc05hbWUpKQotCQkJCQkJCWZDbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlpZiAoZkNsYXNzTmFtZXMgPT0gbnVsbCkKLQkJCWZDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIChmQ2xhc3NOYW1lcyAhPSBudWxsKSA/IGZDbGFzc05hbWVzIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJc2hvcnQgcmV0OwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCWFkZENsYXNzTmFtZXMoKElDU1NTdHlsZVJ1bGUpIG5vZGUpOwotCQkJcmV0ID0gVFJBVl9QUlVORTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQgfHwgbm9kZSBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgfHwgbm9kZSBpbnN0YW5jZW9mIElDU1NJbXBvcnRSdWxlKSB7Ci0JCQlyZXQgPSBUUkFWX0NPTlQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXQgPSBUUkFWX1BSVU5FOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQzNjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU0xpbmtDb252ZXJ0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9CRUdJTiA9ICJ1cmwoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EID0gIikiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRF9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19RVU9URSA9ICJcJyI7IC8vJE5PTi1OTFMtMSQKLQotCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU0xpbmtDb252ZXJ0ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQliYXNlTW9kZWwgPSBtb2RlbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmICgoSUNTU01vZGVsKSBtb2RlbCkuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpICgoSUNTU01vZGVsKSBtb2RlbCkuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCQliYXNlTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRGdW5jKFN0cmluZyB2YWx1ZSkgewotCQlpZiAoIXZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJMX0JFR0lOKSkgewotCQkJLy8gcGFfVE9ETyBjc3MgcHJlZgotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJdmFsdWUgPSBDU1NVdGlsLnN0cmlwUXVvdGVzKHZhbHVlKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh2YWx1ZSwgcXVvdGUpOwotCQkJU3RyaW5nIHN0ciA9IFVSTF9CRUdJTjsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IHN0ci50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyKTsKLQkJCWJ1Zi5hcHBlbmQocXVvdGUpOwotCQkJYnVmLmFwcGVuZCh2YWx1ZSk7Ci0JCQlidWYuYXBwZW5kKHF1b3RlKTsKLQkJCWJ1Zi5hcHBlbmQoVVJMX0VORCk7Ci0JCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChiYXNlTW9kZWwgPT0gbnVsbCkgewotCQkJYmFzZU1vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCWlmIChiYXNlTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwgJiYgKChJQ1NTTW9kZWwpIGJhc2VNb2RlbCkuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSAoKElDU1NNb2RlbCkgYmFzZU1vZGVsKS5nZXRPd25lckRPTU5vZGUoKTsKLQkJCQliYXNlTW9kZWwgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXJsKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlzb3VyY2UgPSBzb3VyY2UudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBzb3VyY2Uuc3RhcnRzV2l0aChVUkxfQkVHSU4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFKSB7Ci0JCQl0b0Fic29sdXRlKChDU1NWYWx1ZSkgbm9kZSk7Ci0JCX0gZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJSUNTU0ltcG9ydFJ1bGUgaVJ1bGUgPSAoSUNTU0ltcG9ydFJ1bGUpIG5vZGU7Ci0JCQlpUnVsZS5zZXRIcmVmKHRvQWJzb2x1dGUoYWRkRnVuYyhpUnVsZS5nZXRIcmVmKCkpKSk7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVGdW5jKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWTsKLQkJU3RyaW5nIGZpZWxkID0gdmFsdWUudHJpbSgpOwotCQkvLyBmaXJzdCA6IHRlYXIgInVybCguLi4uKSIKLQkJaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUkxfQkVHSU4pKSB7Ci0JCQlpbnQgdXJsID0gZmllbGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKFVSTF9CRUdJTik7Ci0JCQlpbnQgZW5kUGFyZW50aGVzaXMgPSBmaWVsZC5sYXN0SW5kZXhPZihVUkxfRU5EKTsKLQkJCWlmIChlbmRQYXJlbnRoZXNpcyA+IHVybCkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHVybCArIDQsIGVuZFBhcmVudGhlc2lzKTsKLQkJCX0gZWxzZQotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHVybCArIDQpOwotCQl9Ci0JCXJldHVybiBmaWVsZC50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBGdW5jKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWTsKLQkJLy8gZmlyc3QgOiB0ZWFyICJ1cmwoLi4uLikiCi0JCVN0cmluZyBmaWVsZCA9IHJlbW92ZUZ1bmModmFsdWUpOwotCQkvLyBzZWNvbmQgOiB0ZWFyIHF1b3RhdGlvbnMKLQkJaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChEX1FVT1RFKSkgewotCQkJaW50IHF1b3RlID0gZmllbGQuaW5kZXhPZihEX1FVT1RFKTsKLQkJCWludCBlbmQgPSBmaWVsZC5sYXN0SW5kZXhPZihEX1FVT1RFKTsKLQkJCWlmIChlbmQgPiBxdW90ZSkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSwgZW5kKTsKLQkJCX0gZWxzZQotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSk7Ci0JCX0gZWxzZSBpZiAoZmllbGQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFNfUVVPVEUpKSB7Ci0JCQlpbnQgcXVvdGUgPSBmaWVsZC5pbmRleE9mKFNfUVVPVEUpOwotCQkJaW50IGVuZCA9IGZpZWxkLmxhc3RJbmRleE9mKFNfUVVPVEUpOwotCQkJaWYgKGVuZCA+IHF1b3RlKSB7Ci0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxLCBlbmQpOwotCQkJfSBlbHNlCi0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxKTsKLQkJfQotCi0JCXJldHVybiBmaWVsZC50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b0Fic29sdXRlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKGlzVXJsKHNvdXJjZSkpIHsKLQkJCVN0cmluZyB1cmwgPSBDU1NQYXRoU2VydmljZS5nZXRBYnNvbHV0ZVVSTChiYXNlTW9kZWwsIHN0cmlwRnVuYyhzb3VyY2UpKTsKLQkJCXJldHVybiAodXJsICE9IG51bGwpID8gYWRkRnVuYyh1cmwpIDogKFVSTF9CRUdJTiArIFVSTF9FTkQpOwotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gdG9BYnNvbHV0ZShDU1NWYWx1ZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCQkJaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJKSB7Ci0JCQkJdmFsdWUuc2V0VmFsdWUoc3RyaXBGdW5jKHRvQWJzb2x1dGUoVVJMX0JFR0lOICsgdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKSArIFVSTF9FTkQpKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NQYXRoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmE4NDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NQYXRoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTUGF0aFNlcnZpY2UgewotCi0JLy8gQ29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVVUkxTQ0hFTUUgPSAiZmlsZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxDT0xPTiA9ICI6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFVVJMUFJFRklYID0gRklMRVVSTFNDSEVNRSArIFVSTENPTE9OICsgIi8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTFNFUEFSQVRPUiA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWJzb2x1dGVVUkwoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHsKLQkJU3RyaW5nIGFic0xpbmsgPSBVUkxNb2RlbFByb3ZpZGVyQ1NTLnJlc29sdmVVUkkoYmFzZU1vZGVsLCByZWYsIHRydWUpOwotCQlTdHJpbmcgdXJsID0gYWJzTGluazsKLQkJaWYgKGFic0xpbmsgIT0gbnVsbCkgeyAvLyBpZiBpdCBoYXMgbm90IHNjaGVtZSwgd2UgbXVzdCBhZGQgImZpbGUiCi0JCQkJCQkJCS8vIHNjaGVtZQotCQkJdHJ5IHsKLQkJCQluZXcgamF2YS5uZXQuVVJMKGFic0xpbmspOwotCQkJfQotCQkJY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGFic0xpbmspOwotCQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJCXVybCA9IHRvVVJMKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZQotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgbG9jYXRpb24yRmlsZShTdHJpbmcgbG9jYXRpb24pIHsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChmaWxlID09IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgZmlsZSBVUkwgZm9yIHRoZSBwYXRoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1VSTChJUGF0aCBwYXRoKSB7Ci0JCXBhdGggPSBuZXcgUGF0aChwYXRoLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJaWYgKHBhdGguaXNVTkMoKSA9PSB0cnVlKSB7Ci0JCQkvLyBpdCdzIFVOQy4gcmV0dXJuIGZpbGU6Ly9ob3N0L2Zvby9iYXIvYmF6Lmh0bWwKLQkJCXJldHVybiBGSUxFVVJMU0NIRU1FICsgVVJMQ09MT04gKyBwYXRoLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIEZJTEVVUkxQUkVGSVggKyBVUkxTRVBBUkFUT1IgKyBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTZWxlY3Rvckxpc3RGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGI5N2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTZWxlY3Rvckxpc3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1NlbGVjdG9yTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkgewotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1NlbGVjdG9yTGlzdEZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JMaXN0IGNyZWF0ZVNlbGVjdG9yTGlzdChTdHJpbmcgc2VsZWN0b3JTdHJpbmcpIHsKLQkJcmV0dXJuIG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKHNlbGVjdG9yU3RyaW5nKTsKLQl9Ci0KLQotCXByaXZhdGUgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IGZJbnN0YW5jZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODVhY2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgZXh0ZW5kcyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTdHlsZURlY2xhcmF0aW9uCi0JICogQHBhcmFtIGRlY2wKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBuZXdOb2RlID0gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZPd25lckRvY3VtZW50ID0gbmV3Tm9kZTsKLQkJY2xvbmVDaGlsZE5vZGVzKGRlY2wsIG5ld05vZGUpOwotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4Mzg1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTVXRpbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWdPdXQoU3RyaW5nIHN0cikgewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiY3NzIHdhcm5pbmc6ICIgKyBzdHIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHVibGljIHN0YXRpYyBWZWN0b3IgZXh0cmFjdE1lZGlhQ29udGVudHMoVmVjdG9yIHJlZ2lvbnMpIHsKLQkvLyBWZWN0b3IgbWVkaWEgPSBuZXcgVmVjdG9yKCk7Ci0JLy8gaWYgKHJlZ2lvbnMgPT0gbnVsbCkgeyByZXR1cm4gbWVkaWE7IH0KLQkvLwotCS8vIGJvb2xlYW4gYlJlYWR5ID0gdHJ1ZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkvLyBJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24paS5uZXh0KCk7Ci0JLy8gaWYgKHJlZ2lvbiA9PSBudWxsKSB7IGNvbnRpbnVlOyB9Ci0JLy8gU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCS8vIGlmIChiUmVhZHkpIHsKLQkvLyBpZiAodHlwZSA9PSBJREVOVCkgewotCS8vIG1lZGlhLmFkZEVsZW1lbnQocmVnaW9uLmdldFRleHQoKSk7Ci0JLy8gYlJlYWR5ID0gZmFsc2U7Ci0JLy8gfQotCS8vIH0gZWxzZSB7Ci0JLy8gaWYgKHR5cGUgPT0gQ09NTUEpIHsKLQkvLyBiUmVhZHkgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gcmV0dXJuIG1lZGlhOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0U3RyaW5nQ29udGVudHMoU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHN0cmlwUXVvdGVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RVcmlDb250ZW50cyhTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LnRyaW0oKTsKLQkJaWYgKGNvbnRlbnRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgidXJsKCIpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGVudHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiKSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gc3RyaXAgInVybCgiLCAiKSIKLQkJCWNvbnRlbnRzID0gY29udGVudHMuc3Vic3RyaW5nKDQsIGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJY29udGVudHMgPSBzdHJpcFF1b3Rlcyhjb250ZW50cyk7Ci0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTmV4dFNpZ25pZmljYW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSkgewotCQlpZiAoc3RhcnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0KCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUJhY2t3YXJkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZTsKLQkJZm9yIChub2RlID0gc3RhcnROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFByZXZpb3VzKCkpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBlbmROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlub2RlID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSkgPT0gdHlwZSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUZvcndhcmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kTm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlOwotCQlmb3IgKG5vZGUgPSBzdGFydE5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dCgpKSB7Ci0JCQlpZiAoZW5kTm9kZS5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpID09IHR5cGUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlKSB7Ci0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc3RhcnROb2RlLmdldFByZXZpb3VzKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS50b1N0cmluZygpOwotCQkJaW50IGxhc3RQZXJpb2QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdFBlcmlvZCArIDEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGVuZ3RoRGlmZmVyZW5jZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdOb2RlcywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMpIHsKLQkJaW50IG5ld0xlbiA9IGdldFRleHRMZW5ndGgobmV3Tm9kZXMpOwotCQlpbnQgb2xkTGVuID0gZ2V0VGV4dExlbmd0aChvbGROb2Rlcyk7Ci0JCXJldHVybiBuZXdMZW4gLSBvbGRMZW47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnaW9uVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlidWYuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dExlbmd0aChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBub2RlcykgewotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gbm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsZW5ndGggKz0gZmxhdE5vZGUuZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlbmd0aChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaWYgKHRva2VuID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJZG91YmxlIG51bWJlciA9IERvdWJsZS5wYXJzZURvdWJsZSh0b2tlbi5pbWFnZSk7Ci0JCQlpZiAobnVtYmVyID09IDAuMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShyZWdpb24pOwotCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZSh0eXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJLy8gU3RyaW5nIHRleHQgPSBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCQkvLyBpZiAodGV4dCAhPSBudWxsICYmIHRleHQuaW5kZXhPZignLicpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQkJLy8gfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRzID0gdGV4dC50cmltKCk7Ci0JCWlmICgyIDw9IGNvbnRlbnRzLmxlbmd0aCgpKSB7Ci0JCQljaGFyIGZpcnN0ID0gY29udGVudHMuY2hhckF0KDApOwotCQkJY2hhciBsYXN0ID0gY29udGVudHMuY2hhckF0KGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInKSB8fCAoZmlyc3QgPT0gJ1wnJyAmJiBsYXN0ID09ICdcJycpKSB7Ci0JCQkJY29udGVudHMgPSBjb250ZW50cy5zdWJzdHJpbmcoMSwgY29udGVudHMubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZWN0UXVvdGUoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlZmF1bHRRdW90ZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdFF1b3RlOwotCQlmaW5hbCBTdHJpbmcgRF9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFNfUVVPVEUgPSAiXCciOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGRJbmRleCA9IHNvdXJjZS5pbmRleE9mKERfUVVPVEUpOwotCQlpbnQgc0luZGV4ID0gc291cmNlLmluZGV4T2YoU19RVU9URSk7Ci0JCWlmIChkSW5kZXggPCAwICYmIHNJbmRleCA8IDApIHsKLQkJCXJldHVybiBkZWZhdWx0UXVvdGU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgMCkgewotCQkJcmV0dXJuIERfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoc0luZGV4IDwgMCkgewotCQkJcmV0dXJuIFNfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgc0luZGV4KSB7Ci0JCQlyZXR1cm4gU19RVU9URTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBEX1FVT1RFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0cmlwU3Vycm91bmRpbmdTcGFjZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCXJlZ2lvbnMucmVtb3ZlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydFJ1bGVDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNGVjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJ1bGVDb2xsZWN0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBydWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgSUNTU1N0eWxlU2hlZXQgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbXBvcnRSdWxlQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UnVsZUNvbGxlY3RvcihJQ1NTU3R5bGVTaGVldCBzaGVldCkgewotCQlzdXBlcigpOwotCQl0YXJnZXQgPSBzaGVldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLlZlY3RvciBnZXRSdWxlcygpIHsKLQkJcmV0dXJuIHJ1bGVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQlJQ1NTSW1wb3J0UnVsZSBpbXAgPSAoSUNTU0ltcG9ydFJ1bGUpIG5vZGU7Ci0JCQkJaWYgKGltcC5nZXRTdHlsZVNoZWV0KCkgIT0gdGFyZ2V0KQotCQkJCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJCX0KLQkJCWlmICghcnVsZXMuY29udGFpbnMobm9kZSkpCi0JCQkJcnVsZXMuYWRkKG5vZGUpOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQ3NTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRlZENvbGxlY3RvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIGV4dGVybmFscyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbXBvcnRlZENvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlcm5hbHMoKSB7Ci0JCXJldHVybiBleHRlcm5hbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlpZiAoIWV4dGVybmFscy5jb250YWlucyhub2RlKSkgewotCQkJCWV4dGVybmFscy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9SZWdpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI2MjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9SZWdpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgaW50IGN1cnJlbnQgPSAtMTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJcmVzZXQoc3RydWN0dXJlZERvY3VtZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcigpOwotCQlyZXNldChmbGF0Tm9kZSwgcmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBjdXJEb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGN1cnJlbnQgPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY3VycmVudCA8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ByZXYoKSB7Ci0JCS8vIHRoZSBzYW1lIGFzIGhhc05leHQoKQotCQlyZXR1cm4gaGFzTmV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBuZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY3VycmVudCA8IDAgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpID09IG51bGwgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA8PSBjdXJyZW50KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldChjdXJyZW50KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQotCQlpZiAoY3VycmVudCA+PSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQljdXJyZW50ID0gLTE7Ci0JCX0KLQkJY3VycmVudCsrOwotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIHByZXYoKSB7Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjdXJyZW50IDwgMCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkgPT0gbnVsbCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIDw9IGN1cnJlbnQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KGN1cnJlbnQpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCi0JCWlmIChjdXJyZW50ID09IDApIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCWN1cnJlbnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZWxzZQotCQkJCWN1cnJlbnQgPSAwOwotCQl9Ci0JCWN1cnJlbnQtLTsKLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJZG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQkJY3VycmVudCA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5pbmRleE9mKHJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJCWN1ckRvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0JCQljdXJyZW50ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmluZGV4T2YocmVnaW9uKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjM5MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JaW50IHN0YXJ0LCBlbmQ7Ci0JTGlzdCBzZWxlY3RlZE5vZGVzOwotCi0JLyoqCi0JICogU2VsZWN0aW9uQ29sbGVjdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlbGVjdGlvbkNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCXNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLQkJaWYgKHNlbGVjdGVkTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkTm9kZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8PSBlbmQgJiYgc3RhcnQgPCBpTm9kZS5nZXRFbmRPZmZzZXQoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCQlJbmRleGVkUmVnaW9uIGlGaXJzdENoaWxkID0gKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCUluZGV4ZWRSZWdpb24gaUxhc3RDaGlsZCA9IChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJCWlmIChpRmlyc3RDaGlsZCA9PSBudWxsIHx8IHN0YXJ0IDwgaUZpcnN0Q2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSB8fCBpTGFzdENoaWxkLmdldEVuZE9mZnNldCgpIDw9IGVuZCkKLQkJCQkJc2VsZWN0ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChpTm9kZS5nZXRTdGFydE9mZnNldCgpID4gZW5kKQotCQkJcmV0dXJuIFRSQVZfU1RPUDsKLQkJZWxzZQotCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9uKGludCBuZXdTdGFydCwgaW50IG5ld0VuZCkgewotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQllbmQgPSBuZXdFbmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTJhYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTZWxlY3Rvckxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3JWYWxpZGF0b3IgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFNlbGVjdG9yVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBTZWxlY3RvclZhbGlkYXRvcihTdHJpbmcgdGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGNvbnNpc3RzIG9mIG9uZSBDTEFTUyBzZWxlY3Rvci4gc3ludGF4IGNoZWNrCi0JICogaXMgYSBsaXR0bGUgbG9vc2UgKC4xMjMgaXMgcGFzc2VkKQotCSAqIAotCSAqICIuY2xhc3MiIC0+IHRydWUgIi4xMjMiIC0+IHRydWUgIi5jbGFzcyAsIC5jbGFzczIiIC0+IGZhbHNlCi0JICogIi5jbGFzcy5jbGFzczIiIC0+IGZhbHNlICIuMTIze30iIC0+IGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKLQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yID0gZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCk7Ci0JCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHNlbGVjdG9yLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCkgPT0gMSAmJiBzZWxlY3Rvci5nZXROdW1PZklEcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpID09IDApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29uc2lzdHMgb2Ygb25lIElEIHNlbGVjdG9yLgotCSAqIAotCSAqICIjSUQiIC0+IHRydWUgIkgxI215SUQiIC0+IGZhbHNlICIjYWJje30iIC0+IGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJRCgpIHsKLQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yID0gZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCk7Ci0JCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHNlbGVjdG9yLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZklEcygpID09IDEgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpID09IDApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBvdmVyYWxsIGNoZWNrCi0JICogCi0JICogIlAjaG9nZTk4ICsgKjpob3ZlciA+IEE6bGluaywgQS5leHRlcm5hbDp2aXNpdGVkIiAtPiB0cnVlICJIMSBIMiB7fSIgLT4KLQkgKiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXBhcnNlKCk7Ci0JCXJldHVybiAoZlNlbGVjdG9yTGlzdCAhPSBudWxsICYmIGZTZWxlY3Rvckxpc3QuZ2V0RXJyb3JDb3VudCgpID09IDApOwotCX0KLQotCXByaXZhdGUgSUNTU1NpbXBsZVNlbGVjdG9yIGdldE9ubHlPbmVTaW1wbGVTZWxlY3RvcigpIHsKLQkJcGFyc2UoKTsKLQkJaWYgKGZTZWxlY3Rvckxpc3QgIT0gbnVsbCAmJiBmU2VsZWN0b3JMaXN0LmdldExlbmd0aCgpID09IDEpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGZTZWxlY3Rvckxpc3QuZ2V0U2VsZWN0b3IoMCk7Ci0JCQlpbnQgbkl0ZW0gPSBzZWxlY3Rvci5nZXRMZW5ndGgoKTsKLQkJCWlmIChuSXRlbSA9PSAxKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gc2VsZWN0b3IuZ2V0SXRlbSgwKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlyZXR1cm4gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKCkgewotCQlpZiAoZlNlbGVjdG9yTGlzdCA9PSBudWxsKSB7Ci0JCQlpZiAoZlRleHQgIT0gbnVsbCkgewotCQkJCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChmVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0ID0gbnVsbDsKLQlwcml2YXRlIElDU1NTZWxlY3Rvckxpc3QgZlNlbGVjdG9yTGlzdCA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yc0NvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yc0NvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2FhMzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdG9yc0NvbGxlY3RvciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzVG9Bdm9pZCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2VsZWN0b3JzQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RvclRvQXZvaWQoSUNTU1NlbGVjdG9yIHNlbFRvQXZvaWQpIHsKLQkJaWYgKHNlbFRvQXZvaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgPT0gbnVsbCkKLQkJCXNlbGVjdG9yc1RvQXZvaWQgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKCFzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKHNlbFRvQXZvaWQpKQotCQkJc2VsZWN0b3JzVG9Bdm9pZC5hZGQoc2VsVG9Bdm9pZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0b3JUb0F2b2lkKElDU1NTdHlsZVJ1bGUgcnVsZSkgewotCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBydWxlLmdldFNlbGVjdG9ycygpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbCA9IChJQ1NTU2VsZWN0b3IpIGl0Lm5leHQoKTsKLQkJCWFkZFNlbGVjdG9yVG9Bdm9pZChzZWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIHNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVSVUxFX05PREUpIHsKLQkJCUlDU1NTdHlsZVJ1bGUgcnVsZSA9IChJQ1NTU3R5bGVSdWxlKSBub2RlOwotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gbGlzdC5nZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgIT0gbnVsbCAmJiBzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKG9iaikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICghc2VsZWN0b3JzLmNvbnRhaW5zKG9iaikpCi0JCQkJCXNlbGVjdG9ycy5hZGQob2JqKTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JzVG9Bdm9pZChqYXZhLnV0aWwuVmVjdG9yIG5ld1NlbGVjdG9yc1RvQXZvaWQpIHsKLQkJc2VsZWN0b3JzVG9Bdm9pZCA9IG5ld1NlbGVjdG9yc1RvQXZvaWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNDYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlBhdGhIZWxwZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIG1hbmFnZXIuIFByb3ZlZCB1c2VmdWwgc2VydmljZXMgbGlrZSBsaW5rIGNvbnZlcnNpb24gQW4gdXRpbGl0eQotICogY2xhc3MgdG8gaGVscCBvdGhlciBwYXJzcmUgbW9kdWxlcyB0byBjb252ZXJ0IGxpbmtzCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRyA9ICJmaWxlOi8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9TSUcgPSAiZmlsZTovLy8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVMQVRJVkVfUEFUSF9TSUcgPSAiLi4iOy8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfU0xBU0ggPSAiLyI7Ly8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIFVSTCBmQmFzZVVybCA9IG51bGw7IC8vIGJhc2UgdXJsLiBhc3N1bWVkIHRvIGEgYWJzdWx1dGUgdXJsCi0JcHJpdmF0ZSBTdHJpbmcgZkJhc2VVcmxTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgVVJMIGZEb2NSb290ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRG9jUm9vdFN0cmluZyA9IG51bGw7Ci0KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsKSB7Ci0JCWluaXRpYWxpemUoYmFzZVVybCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRvY1Jvb3QpIHsKLQkJaW5pdGlhbGl6ZShiYXNlVXJsLCBkb2NSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWFsIGFkdWp1c3QgZm9yIGZpbGUgdXJsCi0JICovCi0JcHVibGljIFN0cmluZyBhZGp1c3RGaWxlUHJvdG9jb2xVcmwoU3RyaW5nIHVybCkgewotCQlpZiAodXJsLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTF9TRUFSQ0hfU0lHKSkgewotCQkJdXJsID0gRklMRV9QUk9UT0NPTF9TSUcgKyB1cmwuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRy5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0KFN0cmluZyB1cmwsIFVSTCBiYXNlVXJsLCBTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCVN0cmluZyBhYnNVcmwgPSB1cmw7Ci0JCWlmIChiYXNlVXJsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gZG8gc3BlY2lhbCB0aGluZyBmaWxlIHByb3RvY29sCi0JCQkJaWYgKGJhc2VVcmwuZ2V0UHJvdG9jb2woKS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikpIHsvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJlbW92ZSB0aGUgZmlzdAotCQkJCQlpZiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDEpOwotCQkJCQkvLyBlbXB0eSBzdHJpbmcgY2F1c2VzIG1hbGZvcm1lZCBleGNlcHRpb24KLQkJCQkJU3RyaW5nIHRlbXBVcmwgPSB1cmw7Ci0JCQkJCWlmICgiIi5lcXVhbHModXJsKSkvLyROT04tTkxTLTEkCi0JCQkJCQl0ZW1wVXJsID0gIiAiOy8vJE5PTi1OTFMtMSQKLQkJCQkJVVJMIG5ld1VybCA9IG5ldyBVUkwoYmFzZVVybCwgdGVtcFVybCk7Ci0JCQkJCS8vIGRvIGV4dHJhIG1hdGggZm9yIGZpbGUgcHJvdG9jb2wgdG8gc3VwcG9ydCBpZSBiYXNlZAotCQkJCQlhYnNVcmwgPSBhZGp1c3RGaWxlUHJvdG9jb2xVcmwobmV3VXJsLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJVVJMIG5ld1VybCA9IG5ldyBVUkwoZkJhc2VVcmwsIHVybCk7Ci0JCQkJCWFic1VybCA9IG5ld1VybC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJCX0KLQkJCS8vIGNvbnZlcnQgZXZlcnl0aGluZyB0byBmb3J3YXJkIHNsYXNoCi0JCQlhYnNVcmwgPSBQYXRoSGVscGVyLnN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoYWJzVXJsKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBnaXZlbiBtYXkgYmUgYmFzZWQgb24gZmlsZQotCQkJaWYgKHVybFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJLy8gc3dpY2ggdGhlIHVybCB0byBwcm9wZXIgZGlyZWN0aW9uCi0JCQkJdXJsID0gUGF0aEhlbHBlci5yZW1vdmVMZWFkaW5nU2VwYXJhdG9yKHVybCk7Ci0JCQkJRmlsZSBmbGUgPSBuZXcgRmlsZSh1cmxTdHJpbmcsIHVybCk7Ci0JCQkJYWJzVXJsID0gZmxlLmdldFBhdGgoKTsKLQotCQkJfQotCQkJLy8gY29udmVydCBldmVyeXRoaW5nIHRvIGZvcndhcmQgc2xhc2gKLQkJCWFic1VybCA9IFBhdGhIZWxwZXIuc3dpdGNoVG9Gb3J3YXJkU2xhc2hlcyhhYnNVcmwpOwotCi0JCQkvLyBpZiB0aGUgcGF0aCBlbmRzIHdpdGggIi4uIiB3ZSBuZWVkIHRvIGFkZCBhIHRlcm1pbmF0aW5nIHNsYXNoCi0JCQkvLyBvcgotCQkJLy8gZWxzZSB0aGUgbGluayB3aWxsIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkuIChpdCB3aWxsIGxvb2sKLQkJCS8vIGxpa2UKLQkJCS8vIC91cmwvcGF0aC90by9zb21ld2hlcmUvLi4gaW5zdGVhZCBvZiAvdXJsL3BhdGgvdG8vCi0JCQlpZiAoYWJzVXJsLmVuZHNXaXRoKEZPUldBUkRfU0xBU0ggKyBSRUxBVElWRV9QQVRIX1NJRykpIHsKLQkJCQlhYnNVcmwgKz0gRk9SV0FSRF9TTEFTSDsKLQkJCX0KLQkJfQotCi0JCS8vIHJlc29sdmUgcmVsYXRpdmUgcGF0aCB0byBhYnNvbHV0ZQotCQlhYnNVcmwgPSBQYXRoSGVscGVyLmFkanVzdFBhdGgoYWJzVXJsKTsKLQkJcmV0dXJuIGFic1VybDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRvY1Jvb3QpIHsKLQkJLy8KLQkJLy8gRmluZCBvdXQgd2hldGhlciBiYWVzIHVybCBpcyBhIHVybCBvciBmaWxlIG5hbWUKLQkJLy8KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZW1wID0gUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGJhc2VVcmwpOwotCQkJZkJhc2VVcmwgPSBuZXcgVVJMKHRlbXApOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCX0KLQkJaWYgKGZCYXNlVXJsID09IG51bGwpIHsKLQkJCS8vIGl0IGlzIGEgZmlsZSBiYXNlZCB1cmwKLQkJCWZCYXNlVXJsU3RyaW5nID0gYmFzZVVybDsKLQkJfQotCi0JCS8vIGRvIHRoZSBzYW1lIGZvciBkb2Mgcm9vdAotCQlpZiAoZG9jUm9vdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB0ZW1wID0gUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGRvY1Jvb3QpOwotCQkJCWZEb2NSb290ID0gbmV3IFVSTCh0ZW1wKTsKLQotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCX0KLQkJCWlmIChmRG9jUm9vdCA9PSBudWxsKSB7Ci0JCQkJLy8gaXQgaXMgYSBmaWxlIGJhc2VkIHVybAotCQkJCWZEb2NSb290U3RyaW5nID0gZG9jUm9vdDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGdpdmVuIHVybCB0byBhIGFib2x1dGUgdXJsIHVzaW5nIHRoZSBiYXNlIHVybCBJbnB1dCB1cmwgY2FuCi0JICogYmUgb2YgYW55IG90aGUgZm9sbG93aW5nIGZvcm1hdCBBYnNvbHV0ZSB1cmxzIC0tLS0tLS0tLS0tLS0tIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vIC4gaHR0cDovL3d3dy5mb28uY29tIC4gaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlciAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci8gLiBodHRwOi8vd3d3LmZvby5jb20vaW5kZXguaHRtbCAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci9pbmRleC5odG1sIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vZm9sZGVyLy4uL2luZGV4Lmh0bWwgVXJsIHJlbGF0aXZlIG9uIGRvY3VtZW50IHJvb3QKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC4gLyAuIC9mb2xkZXIgLiAvaW5kZXguaHRtbCAuCi0JICogL2ZvbGRlci9pbmRleC5odG1sIC4gL2ZvbGRlci8uLi9pbmRleC5odG1sCi0JICogCi0JICogU2VsZiByZWxhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC4gaW5kZXguaHRtbCAuIC4vaW5kZXguaHRtbCAuCi0JICogLi4vaW5kZXguaHRtbCAuIGZvbGRlci9pbmRleC5odG1sIC4gZm9sZGVyLy4uL2luZGV4Lmh0bWwKLQkgKiAKLQkgKiBmaWxlIGJhc2VkIHVybCBhZGRzIGFub3RoZXIgZGltZW5zaW9uIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBhIGRvY3VtZW50Ci0JICogcm9vdCBTbyB1c2VzIGZEb2NSb290IGlmIHByb3ZpZGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b0Fic29sdXRlKFN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIGFic1VybCA9IHVybDsKLQotCQlVUkwgbmV3VXJsID0gbnVsbDsKLQkJLy8gdHJ5IHRvIHNlZSBpdCBpcyBhIGFic29sdXRlIHVybAotCQl0cnkgewotCQkJbmV3VXJsID0gbmV3IFVSTCh1cmwpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJfQotCQkvLyBpZiBkb2N1bWVudCByb290IGlzIHByb3ZpZGVkCi0JCS8vIGRvIHNwZWNpYWwgY2FzZQotCQlpZiAobmV3VXJsID09IG51bGwpIHsKLQkJCWlmIChmRG9jUm9vdCA9PSBudWxsICYmIGZEb2NSb290U3RyaW5nID09IG51bGwpIHsKLQkJCQkvLyB0cnkgdG8gY2hlY2sgcmVsYXRpdmUgdXJsCi0JCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZCYXNlVXJsLCBmQmFzZVVybFN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBkb2Mgcm9vdCBpcyBwcm92aWRlZAotCQkJCS8vIGlmIHRoZSB1cmwgaXMgYSBkb2Mgcm9vdCBiYXNlZCB1c2UgZG9jIHJvb3QKLQotCQkJCWlmICh1cmwuc3RhcnRzV2l0aCgiLyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZEb2NSb290LCBmRG9jUm9vdFN0cmluZyk7Ci0JCQkJZWxzZQotCQkJCQlhYnNVcmwgPSBjb252ZXJ0KHVybCwgZkJhc2VVcmwsIGZCYXNlVXJsU3RyaW5nKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBhYnNVcmw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBmcm9tIGFuIGFic29sdXRlIHVybCB0byByZWxhdGl2ZSB1cmwgYmFzZWQgb24gdGhlIGdpdmVuIHVybAotCSAqIEJvdGggYXJlIGFzc3VtZWQgdG8gYmUgYWJsc3V0ZSB1cmwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvUmVsYXRpdmUoU3RyaW5nIHVybCwgU3RyaW5nIGRvY3VtZW50VXJsKSB7Ci0JCVN0cmluZyBvdXRwdXQgPSB1cmw7Ci0JCS8vIGFzc3VtaW5nIGJvdGggdXJscyBhcmUgYWJzb2x1dGUKLQkJdHJ5IHsKLQkJCVVSTCBpbnB1dFVybCA9IG5ldyBVUkwodXJsKTsKLQkJCVVSTCBkb2NVcmwgPSBuZXcgVVJMKGRvY3VtZW50VXJsKTsKLQkJCS8vIGZpbHRlciBvdXQgaWYgdGhlIHVybHMgYXJlIG5vdCBmcm8gdGhlIHNhbWUgZG9tYWluCi0JCQlpZiAoIWlucHV0VXJsLmdldFByb3RvY29sKCkuZXF1YWxzKGRvY1VybC5nZXRQcm90b2NvbCgpKSB8fCAhaW5wdXRVcmwuZ2V0SG9zdCgpLmVxdWFscyhkb2NVcmwuZ2V0SG9zdCgpKSB8fCBpbnB1dFVybC5nZXRQb3J0KCkgIT0gZG9jVXJsLmdldFBvcnQoKSkKLQkJCQlyZXR1cm4gb3V0cHV0OwotCQkJLy8gYm90aCB1cmwgYXJlIGNvbWluZyBmb3JtIHRoZSBzYW1lIHBsYWNlCi0JCQkvLyBzdHJpcCBvZmYgdGhlIGRvbWFpbiBwYXJ0cwotCQkJU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0VXJsLmdldEZpbGUoKTsKLQkJCVN0cmluZyBkb2NOYW1lID0gZG9jVXJsLmdldEZpbGUoKTsKLQkJCW91dHB1dCA9IFBhdGhIZWxwZXIuY29udmVydFRvUmVsYXRpdmUoaW5wdXROYW1lLCBkb2NOYW1lKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCQlvdXRwdXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJiYjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUHJvamVjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVSTE1vZGVsUHJvdmlkZXJDU1MgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfUkVBRCA9IDE7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX1JFQUQgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX0VESVQgPSAzOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9FRElUID0gNDsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0JLy8gSU1vZGVsTWFuYWdlcgotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVSTE1vZGVsUHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gb2J0YWluIG1vZGVsIG1hbmFnZXIKLQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgSUQgZnJvbSBhIGZpbGVuYW1lLiBUaGlzIG11c3QgYmUgc2FtZSBhcwotCSAqIEZpbGVNb2RlbFByb3ZpZGVyLmNhbGN1bGF0ZUlkKElGaWxlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVJZChJUGF0aCBmdWxsSVBhdGgpIHsKLQkJcmV0dXJuIGZ1bGxJUGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDb21tb25Nb2RlbEZvcihmaW5hbCBJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgZmluYWwgU3RyaW5nIHJlZiwgZmluYWwgaW50IHdoaWNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBmaXJzdCwgY3JlYXRlIGFic29sdXRlIHVybAotCQlTdHJpbmcgYWJzVVJMID0gcmVzb2x2ZVVSSShiYXNlTW9kZWwsIHJlZiwgdHJ1ZSk7Ci0JCWlmICgoYWJzVVJMID09IG51bGwpIHx8IChhYnNVUkwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbmVlZCB0byByZW1vdmUgZmlsZTovLyBzY2hlbWUgaWYgbmVjZXNzYXJ5Ci0JCXRyeSB7Ci0JCQlmaW5hbCBVUkwgYVVSTCA9IG5ldyBVUkwoYWJzVVJMKTsKLQkJCS8vIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBvbmx5IGZpbGU6Ly8vIGlzIHN1cHBvcnRlZAotCQkJLy8gcmVzb2x2ZSBpdCBieSBmaW5kaW5nIHRoZSBmaWxlIGl0IHBvaW50cyB0bwotCQkJaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpICYmIChhVVJMLmdldEhvc3QoKS5lcXVhbHMoImxvY2FsaG9zdCIpIHx8IGFVUkwuZ2V0SG9zdCgpLmxlbmd0aCgpID09IDApKSB7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCWFic1VSTCA9IGFVUkwuZ2V0RmlsZSgpOwotCQkJCQlmaW5hbCBJUGF0aCBpcGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCQkJCS8vIGlmIHBhdGggaGFzIGEgZGV2aWNlLCBhbmQgaWYgaXQgYmVnaW5zIHdpdGgKLQkJCQkJLy8gSVBhdGguU0VQQVJBVE9SLCByZW1vdmUgaXQKLQkJCQkJZmluYWwgU3RyaW5nIGRldmljZSA9IGlwYXRoLmdldERldmljZSgpOwotCQkJCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCQkJCWFic1VSTCA9IGlwYXRoLnNldERldmljZShuZXdEZXZpY2UpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgewotCQl9Ci0KLQkJLy8gbmV4dCwgZGVjaWRlIHByb2plY3QKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWZpbmFsIElQYXRoIGZ1bGxJUGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvY2F0aW9uKGZ1bGxJUGF0aCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJLy8gZnVsbElQYXRoIGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JCQlwcm9qZWN0ID0gY29udGFpbmVyLmdldFByb2plY3QoKTsKLQkJfQotCi0JCS8vIElmIEhUTUwgZG9jdW1lbnQgaGFzIGEgbGluayB0byBhbiBleHRlcm4gQ1NTIHdoaWNoIGlzIG5vdCBpbgotCQkvLyBJUHJvamVjdAotCQkvLyB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9hdGlvbigpIG1heSByZXR1cm4gbnVsbC4gV2UgbmVlZCB0byB0YWtlCi0JCS8vIGNhcmUKLQkJLy8gb2YgdGhpcyBjYXNlCi0KLQkJLy8gbm93LCBnZXQgYWJzVVJMJ3MgSUZpbGUKLQkJaWYgKChwcm9qZWN0ICE9IG51bGwpICYmIChwcm9qZWN0LmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihmdWxsSVBhdGgpID09IGZhbHNlKSkgewotCQkJLy8gaXQncyBhdCBvdXRzaWRlIG9mIFByb2plY3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlQYXRoIGZpbGVQYXRoID0gZnVsbElQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocHJvamVjdC5nZXRMb2NhdGlvbigpLnNlZ21lbnRDb3VudCgpKTsKLQkJCUlGaWxlIGZpbGUgPSAoZmlsZVBhdGggIT0gbnVsbCAmJiAhZmlsZVBhdGguaXNFbXB0eSgpKSA/IHByb2plY3QuZ2V0RmlsZShmaWxlUGF0aCkgOiBudWxsOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJfQotCi0JCQkvLyBzZXR0aW5nIHN5bmNocm9uaXphdGlvbiBzdGFtcCBpcyBJTW9kZWxNYW5hZ2VyJ3MgY2xpZW50J3MKLQkJCS8vIHJlc3BvbnNpYmlsaXR5Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKQotCQkJCW1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgaWQgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQkJLy8gb2J0YWluIHJlc29sdmVyCi0JCQlVUklSZXNvbHZlciByZXNvbHZlciA9IChwcm9qZWN0ICE9IG51bGwpID8gKFVSSVJlc29sdmVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpIDogbnVsbDsKLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJLy8gUHJvamVjdFJlc29sdmVyIGNhbiB0YWtlIGNhcmUgb2YgdGhlIGNhc2UgaWYgcHJvamVjdCBpcwotCQkJCS8vIG51bGwuCi0JCQkJcmVzb2x2ZXIgPSBuZXcgUHJvamVjdFJlc29sdmVyKHByb2plY3QpOwotCQkJfQotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gdGhlcmUgaXMgbm8gcHJvamVjdC4gd2UgY2FuJ3QgZXhwZWN0IElQcm9qZWN0IGhlbHAgdG8gY3JlYXRlCi0JCQkvLyBpZC9pbnB1dFN0cmVhbQotCQkJRmlsZSBmaWxlID0gZnVsbElQYXRoLnRvRmlsZSgpOwotCi0JCQkvLyBvYmF0aW4gaWQKLQkJCWlkID0gY2FsY3VsYXRlSWQoZnVsbElQYXRoKTsKLQotCQkJLy8gb2J0YWluIElucHV0U3RyZWFtCi0JCQl0cnkgewotCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJCS8vIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciB3ZSBkb24ndCBoYXZlIHJlYWQgcGVybWlzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCXRyeSB7Ci0JCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlKSB7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBjbG9zZSBub3cgIQotCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IGxvY2F0aW9uaWQKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkgPT0gbnVsbCkgewotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGZ1bGxJUGF0aC50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9FRElUKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfUkVBRCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqIDxjb2RlPnJlc29sdmVDcm9zc1Byb2plY3RMaW5rczwvY29kZT46IElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcwotCSAqIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzCi0JICogYSB2YWxpZCBVUkkgcG9pbnRpbmcgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVSSShJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZiwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gZ2V0IHJlc29sdmVyIGluIE1vZGVsCi0JCWZpbmFsIFVSSVJlc29sdmVyIHJlc29sdmVyID0gYmFzZU1vZGVsLmdldFJlc29sdmVyKCk7Ci0KLQkJLy8gcmVzb2x2ZSB0byBhYnNvbHV0ZSB1cmwKLQkJZmluYWwgU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIDogbnVsbDsKLQkJaWYgKChyZXNvbHZlciAhPSBudWxsKSAmJiAoYWJzdXJsID09IG51bGwpICYmIChyZWYgIT0gbnVsbCkgJiYgKHJlZi50cmltKCkubGVuZ3RoKCkgPiAwKSAmJiAocmVmLnRyaW0oKS5jaGFyQXQoMCkgPT0gJy8nKSkgewotCQkJLy8gdG8gcmVhY2ggaGVyZSBtZWFucyA6Ci0JCQkvLyByZWYgaXMgYSBEb2Nyb290IHJlbGF0aXZlCi0JCQkvLyByZXNvbHZlciBjYW4ndCByZXNvbHZlIHJlZgotCQkJLy8gc28gdGhhdCBocmVmIGlzIGEgYnJva2VuIGFuZCBzaG91bGQgbm90IGNyZWF0ZSBtb2RlbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKChhYnN1cmwgIT0gbnVsbCkgJiYgKGFic3VybC5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gYWJzdXJsOwotCQl9Ci0KLQkJLy8gbWF5YmUgcmVmIGlzIGF0IG91dHNpZGUgb2YgdGhlIFByb2plY3QKLQkJLy8gb2J0YWluIGRvY3Jvb3Q7Ci0JCWZpbmFsIElDb250YWluZXIgY29udGFpbmVyID0gKHJlc29sdmVyICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0Um9vdExvY2F0aW9uKCkgOiBudWxsOwotCQlTdHJpbmcgZG9jcm9vdCA9IG51bGw7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGNvbnRhaW5lci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQkvLyBzaG91bGQgbm90IGJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG9idGFpbiBkb2N1bWVudCB1cmwKLQkJU3RyaW5nIG1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZmFsbGJhY2suLi4KLQkJCW1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldElkKCk7Ci0JCX0KLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGkgY2FuJ3QgcmVzb2x2ZSB1cmkgIQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyByZXNvbHZlIHVybAotCQlVUkxIZWxwZXIgaGVscGVyID0gbmV3IFVSTEhlbHBlcihQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKG1vZGVsQmFzZUxvY2F0aW9uKSwgUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChQYXRoSGVscGVyLmFwcGVuZFRyYWlsaW5nVVJMU2xhc2goZG9jcm9vdCkpKTsKLQkJcmV0dXJuIGhlbHBlci50b0Fic29sdXRlKHJlZik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWI5M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiBmb3IgaG9yaXpvbnRhbCB2YWx1ZSBvZiAnYmFja2dyb3VuZC1wb3NpdGlvbicKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NUZXh0VG9rZW5bXSBjb3JyZWN0TWVhbmluZ1Rva2VuKENTU1RleHRUb2tlbltdIHNyYykgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWxpc3QuYWRkKHNyY1tpXSk7Ci0JCX0KLQkJQ1NTVGV4dFRva2VuW10gcmV0ID0gbmV3IENTU1RleHRUb2tlbltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7Ci0JCQkJSUNTU1ZhbHVlTGlzdCBsaXN0ID0gKElDU1NWYWx1ZUxpc3QpIG9iajsKLQkJCQlJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsKLQkJCQkJaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgewotCQkJCQkJLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20KLQkJCQkJCWlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkJCS8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4gaG9yaXpvbnRhbAotCQkJCQkJCXZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ciA9IHZhbHVlLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJaWYgKHN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHN0cik7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCi0JCQkJdG9rZW5zID0gY29ycmVjdE1lYW5pbmdUb2tlbih0b2tlbnMpOwotCQkJCWlmICh0b2tlbnMubGVuZ3RoID09IDApCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmICh0b2tlbnMubGVuZ3RoID09IDEgJiYgKHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgdG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCXN0ciA9IHRva2Vuc1swXS5pbWFnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB2YWxIID0gdmFsdWU7Ci0JCVN0cmluZyB2YWxWID0gcHJvcGVydGllcy5nZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7Ci0JCWlmICh2YWxWID09IG51bGwgfHwgdmFsVi5sZW5ndGgoKSA9PSAwKQotCQkJbmV3VmFsdWUgPSB2YWxIOwotCQllbHNlIGlmICh2YWxIID09IG51bGwgfHwgdmFsSC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlDb2xsZWN0aW9uIHZhbFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCQlDb2xsZWN0aW9uIHZhbFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCQlQcm9wQ01VdGlsLm1pbnVzKHZhbFksIHZhbFgpOwotCQkJSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJLy8gbmVlZCBub3QgY29tcGVuc2F0ZSBmb3IgLi4uCi0JCQkJCW5ld1ZhbHVlID0gdmFsVjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gY29tcGVuc2F0ZSBmb3IgSG9yaXpvbnRhbCB2YWx1ZQotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayB2YWxWIGlzIGxlbmd0aCBvciBub3QKLQkJCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgdmFsVi50cmltKCkpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5zICE9IG51bGwgJiYgdG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCW5ld1ZhbHVlID0gSVZhbElELlZfTEVGVCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlCi0JCQkJCW5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlCi0JCQluZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJcHJvcGVydGllcy5zZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5ZTlhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIGZvciB2ZXJ0aWNhbCB2YWx1ZSBvZiAnYmFja2dyb3VuZC1wb3NpdGlvbicKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NUZXh0VG9rZW5bXSBjb3JyZWN0TWVhbmluZ1Rva2VuKENTU1RleHRUb2tlbltdIHNyYykgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWxpc3QuYWRkKHNyY1tpXSk7Ci0JCX0KLQkJQ1NTVGV4dFRva2VuW10gcmV0ID0gbmV3IENTU1RleHRUb2tlbltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7Ci0JCQkJSUNTU1ZhbHVlTGlzdCBsaXN0ID0gKElDU1NWYWx1ZUxpc3QpIG9iajsKLQkJCQlpbnQgaW5kZXggPSAxOwotCQkJCUlDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgwKTsKLQkJCQlpZiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgewotCQkJCQlJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOwotCQkJCQlpZiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7Ci0JCQkJCQkvLyBjaGVjayBub3QgdG9wIG9yIGJvdHRvbQotCQkJCQkJaWYgKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYgcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7Ci0JCQkJCQkJLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPiBob3Jpem9udGFsCi0JCQkJCQkJaW5kZXggPSAwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oaW5kZXgpKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWlmICghc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQk9UVE9NKSAmJiAhc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHN0cik7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCi0JCQkJdG9rZW5zID0gY29ycmVjdE1lYW5pbmdUb2tlbih0b2tlbnMpOwotCQkJCWlmICh0b2tlbnMubGVuZ3RoID09IDEgJiYgKHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgdG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkpCi0JCQkJCXN0ciA9IHRva2Vuc1swXS5pbWFnZTsKLQkJCQllbHNlIGlmICh0b2tlbnMubGVuZ3RoID4gMSkKLQkJCQkJc3RyID0gdG9rZW5zWzFdLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIHZhbEggPSBwcm9wZXJ0aWVzLmdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQkJU3RyaW5nIHZhbFYgPSB2YWx1ZTsKLQkJaWYgKHZhbEggIT0gbnVsbCAmJiAodmFsSC50cmltKCkuZXF1YWxzKCIwJSIpIC8qIGRlZmF1bHQgdmFsdWUgKi98fCAvLyROT04tTkxTLTEkCi0JCQkJCXZhbEgudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfTEVGVCkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiBhbm90aGVyCi0JCQkJCQkJCQkJCQkJCQkJICogZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCSAqIHZhbHVlCi0JCQkJCQkJCQkJCQkJCQkJICovKSkKLQkJCXZhbEggPSBudWxsOwotCQlpZiAodmFsViA9PSBudWxsIHx8IHZhbFYubGVuZ3RoKCkgPT0gMCkKLQkJCW5ld1ZhbHVlID0gdmFsSDsKLQkJZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8IHZhbEgubGVuZ3RoKCkgPT0gMCkgewotCQkJQ29sbGVjdGlvbiB2YWxYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkJQ29sbGVjdGlvbiB2YWxZID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkJUHJvcENNVXRpbC5taW51cyh2YWxZLCB2YWxYKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCS8vIG5lZWQgbm90IGNvbXBlbnNhdGUgZm9yIC4uLgotCQkJCQluZXdWYWx1ZSA9IHZhbFY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvbXBlbnNhdGUgZm9yIEhvcml6b250YWwgdmFsdWUKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgdmFsViBpcyBsZW5ndGggb3Igbm90Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHZhbFYudHJpbSgpKTsKLQkJCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCQkJaWYgKHRva2VucyAhPSBudWxsICYmIHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQluZXdWYWx1ZSA9IElWYWxJRC5WX0xFRlQgKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQluZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCXByb3BlcnRpZXMuc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNWZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JhY2tncm91bmQnIHByb3BlcnR5ICdiYWNrZ3JvdW5kJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYmFja2dyb3VuZC1hdHRhY2htZW50JywgJ2JhY2tncm91bmQtY29sb3InLCAnYmFja2dyb3VuZC1pbWFnZScsCi0gKiAnYmFja2dyb3VuZC1wb3NpdGlvbicsICdiYWNrZ3JvdW5kLXJlcGVhdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBpbWFnZSA9ICIiLCByZXBlYXQgPSAiIiwgYXR0YWNoID0gIiIsIHBvcyA9ICIiOy8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BSZXBlYXQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEF0dGFjaCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFJlcGVhdC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXJlcGVhdCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQXR0YWNoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJYXR0YWNoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCWlmIChwb3MgPT0gbnVsbCB8fCBwb3MubGVuZ3RoKCkgPD0gMCkKLQkJCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCWlmIChwb3MgPT0gbnVsbCB8fCBwb3MubGVuZ3RoKCkgPD0gMCkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wSW1hZ2UuZ2V0TmFtZSgpLCBpbWFnZSk7Ci0JCWRlc3Quc2V0KHByb3BSZXBlYXQuZ2V0TmFtZSgpLCByZXBlYXQpOwotCQlkZXN0LnNldChwcm9wQXR0YWNoLmdldE5hbWUoKSwgYXR0YWNoKTsKLQkJZGVzdC5zZXQocHJvcFBvcy5nZXROYW1lKCksIHBvcyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIGltYWdlID0gbnVsbCwgcmVwZWF0ID0gbnVsbCwgYXR0YWNoID0gbnVsbCwgcG9zID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFJlcGVhdCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQXR0YWNoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUmVwZWF0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcmVwZWF0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BBdHRhY2guY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlhdHRhY2ggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJaWYgKHBvcyA9PSBudWxsKQotCQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJaWYgKHBvcyA9PSBudWxsKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZQotCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wSW1hZ2UgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCWVsc2UgaWYgKHByb3BSZXBlYXQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gcmVwZWF0OwotCQllbHNlIGlmIChwcm9wQXR0YWNoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGF0dGFjaDsKLQkJZWxzZSBpZiAocHJvcFBvcyA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBwb3M7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliNTA1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWJvdHRvbScgcHJvcGVydHkgJ2JvcmRlci1ib3R0b20nIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItYm90dG9tLWNvbG9yJywgJ2JvcmRlci1ib3R0b20tc3R5bGUnLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTQwMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWNvbG9yJyBwcm9wZXJ0eSAnYm9yZGVyLWNvbG9yJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1jb2xvcicsICdib3JkZXItcmlnaHQtY29sb3InLCAnYm9yZGVyLWJvdHRvbS1jb2xvcicsCi0gKiAnYm9yZGVyLWxlZnQtY29sb3InLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQlpZGVudHNbaisrXSA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUiwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUiwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUiwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJaWRlbnRzW2orK10gPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjNzkzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1sZWZ0JyBwcm9wZXJ0eSAnYm9yZGVyLWxlZnQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItbGVmdC1jb2xvcicsICdib3JkZXItbGVmdC1zdHlsZScsICdib3JkZXItbGVmdC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0ZTQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItcmlnaHQnIHByb3BlcnR5ICdib3JkZXItcmlnaHQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItcmlnaHQtY29sb3InLCAnYm9yZGVyLXJpZ2h0LXN0eWxlJywgJ2JvcmRlci1yaWdodC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTMzMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlcicgcHJvcGVydHkgJ2JvcmRlcicgd2lsbCBiZSBleHBhbmRlZCB0byAnYm9yZGVyLWNvbG9yJywKLSAqICdib3JkZXItc3R5bGUnLCAnYm9yZGVyLXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmYjk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItc3R5bGUnIHByb3BlcnR5ICdib3JkZXItc3R5bGUnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLXN0eWxlJywgJ2JvcmRlci1yaWdodC1zdHlsZScsICdib3JkZXItYm90dG9tLXN0eWxlJywKLSAqICdib3JkZXItbGVmdC1zdHlsZScsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjgzOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci10b3AnIHByb3BlcnR5ICdib3JkZXItdG9wJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1jb2xvcicsICdib3JkZXItdG9wLXN0eWxlJywgJ2JvcmRlci10b3Atd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGEwOWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci13aWR0aCcgcHJvcGVydHkgJ2JvcmRlci13aWR0aCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3Atd2lkdGgnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJywgJ2JvcmRlci1ib3R0b20td2lkdGgnLAotICogJ2JvcmRlci1sZWZ0LXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDA3MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1Byb3BlcnR5Q29udGV4dCBpbXBsZW1lbnRzIElDU1MyUHJvcGVydGllcyB7Ci0KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCUhhc2hTZXQgZk1vZGlmaWVkID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIHN1YlByb3BlcnR5QWRhcHRlcnM7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBzaG9ydGhhbmRBZGFwdGVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NQcm9wZXJ0eUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRTaG9ydGhhbmRBZGFwdGVycygpOwotCQlpbml0U3ViUHJvcGVydHlBZGFwdGVycygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NQcm9wZXJ0eUNvbnRleHQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlzdXBlcigpOwotCQlpbml0U2hvcnRoYW5kQWRhcHRlcnMoKTsKLQkJaW5pdFN1YlByb3BlcnR5QWRhcHRlcnMoKTsKLQkJaW5pdGlhbGl6ZShkZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cG9ydHMgYWxsIHByb3BlcnR5L3ZhbHVlIHBhaXJzIHRvICdkZWNsJyBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBmUHJvcGVydGllcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJT2JqZWN0IHZhbCA9IGZQcm9wZXJ0aWVzLmdldChrZXkpOwotCQkJU3RyaW5nIHZhbHVlID0gKHZhbCBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgPyAoKElDU1NWYWx1ZSkgdmFsKS5nZXRDU1NWYWx1ZVRleHQoKSA6IHZhbC50b1N0cmluZygpOwotCi0JCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCWRlY2wucmVtb3ZlUHJvcGVydHkoa2V5LnRvU3RyaW5nKCkpOwotCQkJZWxzZQotCQkJCWRlY2wuc2V0UHJvcGVydHkoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRyaW0oKSwgKHZhbCBpbnN0YW5jZW9mIFZhbHVlRGF0YSAmJiAoKFZhbHVlRGF0YSkgdmFsKS5pbXBvcnRhbnQpID8gIiFpbXBvcnRhbnQiIDogIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cG9ydHMgbW9kaWZpZWQgcHJvcGVydHkvdmFsdWUgcGFpcnMgdG8gJ2RlY2wnCi0JICogZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseU1vZGlmaWVkKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCB8fCBmTW9kaWZpZWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBmTW9kaWZpZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQkJCVN0cmluZyB2YWx1ZSA9ICh2YWwgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpID8gKChJQ1NTVmFsdWUpIHZhbCkuZ2V0Q1NTVmFsdWVUZXh0KCkgOiAoKHZhbCAhPSBudWxsKSA/IHZhbC50b1N0cmluZygpIDogbnVsbCk7Ci0KLQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJZGVjbC5yZW1vdmVQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSk7Ci0JCQllbHNlCi0JCQkJZGVjbC5zZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUudHJpbSgpLCAodmFsIGluc3RhbmNlb2YgVmFsdWVEYXRhICYmICgoVmFsdWVEYXRhKSB2YWwpLmltcG9ydGFudCkgPyAiIWltcG9ydGFudCIgOiAiIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBjbG9uZSBvZiB0aGlzIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlDU1NQcm9wZXJ0eUNvbnRleHQgY2xvbmUgPSBuZXcgQ1NTUHJvcGVydHlDb250ZXh0KCk7Ci0JCWlmICh0aGlzLmZNb2RpZmllZCAhPSBudWxsKQotCQkJY2xvbmUuZk1vZGlmaWVkID0gKEhhc2hTZXQpIHRoaXMuZk1vZGlmaWVkLmNsb25lKCk7Ci0JCWVsc2UKLQkJCWNsb25lLmZNb2RpZmllZCA9IG51bGw7Ci0JCWNsb25lLmZQcm9wZXJ0aWVzID0gKEhhc2h0YWJsZSkgdGhpcy5mUHJvcGVydGllcy5jbG9uZSgpOwotCQlyZXR1cm4gY2xvbmU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgc2hvcnQtaGFuZCBwcm9wZXJ0eSdzIHZhbHVlIHRvIGVhY2ggbGVhZgotCSAqIHByb3BlcnR5J3MgdmFsdWUgYW5kIHNldCB0aGVtIHRvICdmb3JlaWduJwotCSAqIAotCSAqIEZvciBleGFtcGxlLCBnaXZlbiBbcHJvcD1ib3JkZXItdG9wLCB2YWx1ZT0ic29saWQgMXB4IHllbGxvdyJdIHdpbGwgYmUKLQkgKiBleHBhbmRlZCB0byBbYm9yZGVyLXRvcC1jb2xvcj15ZWxsb3csIGJvcmRlci10b3Atc3R5bGU9c29saWQsCi0JICogYm9yZGVyLXRvcC13aWR0aD0xcHhdIGFuZCB0aGV5IGFyZSBzdG9yZWQgdG8gJ2ZvcmVpZ24nIGNvbnRleHQuCi0JICogCi0JICogTm90ZSB0aGF0IHJlY3Vyc2l2ZWx5IHNob3J0aGFuZGVkIHByb3BlcnR5IGxpa2UgJ2JvcmRlcicgd2lsbCBiZQotCSAqIGV4cGFuZGVkIHRvIGFsbCBkZXNjZW5kYW50IGxlYWYgcHJvcGVydGllcyBsaWtlCi0JICogJ2JvcmRlci1bdG9wL3JpZ2h0L2JvdHRvbS9sZWZ0XS1bY29sb3Ivc3R5bGUvd2lkdGhdJwotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGZvcmVpZ24KLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uLkNTU1Byb3BlcnR5Q29udGV4dAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBleHBhbmRUb0xlYWYoUHJvcENNUHJvcGVydHkgcHJvcCwgU3RyaW5nIHZhbHVlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZm9yZWlnbikgewotCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCUlTaG9ydGhhbmRBZGFwdGVyIGFkYXB0ZXIgPSAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLmV4cGFuZCh2YWx1ZSwgZm9yZWlnbik7Ci0JCQkJZm9yZWlnbi5zZXQocHJvcC5nZXROYW1lKCksICIiKTsvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldE51bUNoaWxkKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gcHJvcC5nZXRDaGlsZEF0KGkpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkgJiYgIShvYmogaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkpIHsKLQkJCQkJCVByb3BDTVByb3BlcnR5IGV4cGFuZGVkUHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgb2JqOwotCQkJCQkJdmFsdWUgPSBmb3JlaWduLmdldChleHBhbmRlZFByb3AuZ2V0TmFtZSgpKTsKLQkJCQkJCWV4cGFuZFRvTGVhZihleHBhbmRlZFByb3AsIHZhbHVlLCBmb3JlaWduKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCF2YWx1ZS5lcXVhbHMoZm9yZWlnbi5nZXQocHJvcC5nZXROYW1lKCkpKSkgewotCQkJCWZvcmVpZ24uc2V0KHByb3AuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgb2YgJ3Byb3AnLiBRdWVyeWluZyB2YWx1ZSBtZWNoYW5pc20gY2hlY2tzCi0JICogc2hvcnQtaGFuZCBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlLCBnaXZlbiAiYmFja2dyb3VuZD1maXhlZCB3aGl0ZSIgaXMgc2V0IGluIHRoaXMgaW5zYXRuY2UgYW5kCi0JICogcGFyYW0gInByb3A9YmFja2dyb3VuZC1jb2xvciIsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAid2hpdGUiLgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkgewotCQkJSVN1YlByb3BlcnR5QWRhcHRlciBhZGFwdGVyID0gKElTdWJQcm9wZXJ0eUFkYXB0ZXIpIHN1YlByb3BlcnR5QWRhcHRlcnMuZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0KHRoaXMpOwotCQl9Ci0JCVN0cmluZyBzdHIgPSBnZXQocHJvcC5nZXROYW1lKCkpOwotCQlpZiAoKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSAmJiBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgPiAwKSB7Ci0JCQkvLyBnZXQgZXhwYW5kZWQgcHJvcGVydHkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUGFyZW50ID0gcHJvcC5zaG9ydGhhbmRDb250YWluZXJBdChpKTsKLQkJCQlTdHJpbmcgc3RyUGFyZW50ID0gZ2V0KHByb3BQYXJlbnQpOwotCQkJCWlmIChzdHJQYXJlbnQgIT0gbnVsbCAmJiBzdHJQYXJlbnQudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlJU2hvcnRoYW5kQWRhcHRlciBhZGFwdGVyID0gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcFBhcmVudCk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBleHRyYWN0ZWRWYWx1ZSA9IGFkYXB0ZXIuZXh0cmFjdChzdHJQYXJlbnQsIHByb3ApOwotCQkJCQkJcmV0dXJuIChleHRyYWN0ZWRWYWx1ZSAhPSBudWxsKSA/IGV4dHJhY3RlZFZhbHVlIDogIiI7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIG9mICdwcm9wJy4gUXVlcnlpbmcgdmFsdWUgbWVjaGFuaXNtIGRvZXMKLQkgKiBub3QgY2FyZSBzaG9ydGhhbmQgcHJvcGVydGllcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldChTdHJpbmcgcHJvcE5hbWUpIHsKLQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCU9iamVjdCBvYmogPSBmUHJvcGVydGllcy5nZXQocHJvcE5hbWUpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpCi0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQllbHNlCi0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBhemltdXRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXppbXV0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQVpJTVVUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kQXR0YWNobWVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1pbWFnZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZEltYWdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1wb3NpdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpKTsKLQkJLyoKLQkJICogU3RyaW5nIHN0ciA9IG51bGw7IE9iamVjdCBvYmogPQotCQkgKiBmUHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7IGlmIChvYmogIT0gbnVsbCkgewotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCSAqIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7IElDU1NWYWx1ZUxpc3QgbGlzdCA9Ci0JCSAqIChJQ1NTVmFsdWVMaXN0KSBvYmo7IElDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgwKTsgaWYKLQkJICogKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJICogSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsgaWYKLQkJICogKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgeyAvLyBjaGVjawotCQkgKiBub3QgdG9wIG9yIGJvdHRvbSBpZiAoIXByb3BYLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSAmJgotCQkgKiBwcm9wWS5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkpIHsgLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPgotCQkgKiBob3Jpem9udGFsIHZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDEpOyB9IH0gfSBzdHIgPQotCQkgKiB2YWx1ZS5nZXRDU1NWYWx1ZVRleHQoKTsgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsgc3RyID0KLQkJICogKChJQ1NTVmFsdWUpb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsgfSBlbHNlIHN0ciA9IG9iai50b1N0cmluZygpOyB9Ci0JCSAqIHJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpKTsKLQkJLyoKLQkJICogU3RyaW5nIHN0ciA9IG51bGw7IE9iamVjdCBvYmogPQotCQkgKiBmUHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7IGlmIChvYmogIT0gbnVsbCkgewotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCSAqIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7IElDU1NWYWx1ZUxpc3QgbGlzdCA9Ci0JCSAqIChJQ1NTVmFsdWVMaXN0KSBvYmo7IGludCBpbmRleCA9IDE7IElDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpCi0JCSAqIGxpc3QuaXRlbSgwKTsgaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09Ci0JCSAqIENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsgSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPQotCQkgKiAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsgaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09Ci0JCSAqIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgeyAvLyBjaGVjayBub3QgdG9wIG9yIGJvdHRvbSBpZgotCQkgKiAoIXByb3BYLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSAmJgotCQkgKiBwcm9wWS5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkpIHsgLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPgotCQkgKiBob3Jpem9udGFsIGluZGV4ID0gMDsgfSB9IH0gc3RyID0KLQkJICogKChJQ1NTVmFsdWUpbGlzdC5pdGVtKGluZGV4KSkuZ2V0Q1NTVmFsdWVUZXh0KCk7IH0gZWxzZSBpZiAob2JqCi0JCSAqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7IC8vIGRvIG5vdGhpbmcgLS0tIHZhbHVlIGlzIG51bGwgfSBlbHNlIHN0ciA9Ci0JCSAqIG9iai50b1N0cmluZygpOyB9IHJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1yZXBlYXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kUmVwZWF0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbS1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20tc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbVN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b21XaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWNvbGxhcHNlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJDb2xsYXBzZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTExBUFNFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckNvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItc3BhY2luZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyU3BhY2luZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NQQUNJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3BDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3Atd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlcldpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNhcHRpb24tc2lkZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwdGlvblNpZGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NBUFRJT05fU0lERSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY2xlYXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsZWFyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTEVBUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY2xpcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcEJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcFRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvbnRlbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTlRFTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvdW50ZXItaW5jcmVtZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3VudGVySW5jcmVtZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX0lOQ1JFTUVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY291bnRlci1yZXNldCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q291bnRlclJlc2V0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX1JFU0VUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmbG9hdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3NzRmxvYXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZMT0FUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdWUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdWUtYWZ0ZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZUFmdGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZS1iZWZvcmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZUJlZm9yZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3Vyc29yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJzb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVUlNPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZGlyZWN0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJUkVDVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZGlzcGxheSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElTUExBWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZWxldmF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGV2YXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VMRVZBVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZW1wdHktY2VsbHMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVtcHR5Q2VsbHMoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VNUFRZX0NFTExTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LWZhbWlseSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udEZhbWlseSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc2l6ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFNpemUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zaXplLWFkanVzdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFNpemVBZGp1c3QoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRV9BREpVU1QpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc3RyZXRjaCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFN0cmV0Y2goKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXZhcmlhbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRWYXJpYW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtd2VpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250V2VpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgaGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGV0dGVyLXNwYWNpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExldHRlclNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFVFRFUl9TUEFDSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaW5lLWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZUhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZS1pbWFnZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlSW1hZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUtcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZVBvc2l0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlLXR5cGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZVR5cGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW4oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLWJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi1yaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLXRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJrZXItb2Zmc2V0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJrZXJPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktFUl9PRkZTRVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmtzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJrcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1heC1oZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1heEhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWF4LXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXhXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtaW4taGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW5IZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1pbi13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWluV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3JwaGFucyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JwaGFucygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1JQSEFOUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZS1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZUNvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3ZlcmZsb3cgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE92ZXJmbG93KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVkVSRkxPVykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlLWJyZWFrLWFmdGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlQnJlYWtBZnRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19BRlRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1iZWZvcmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VCcmVha0JlZm9yZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19CRUZPUkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UtYnJlYWstaW5zaWRlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlQnJlYWtJbnNpZGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYXVzZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYXVzZS1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2VBZnRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQUZURVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhdXNlLWJlZm9yZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2VCZWZvcmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0JFRk9SRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGl0Y2ggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBpdGNoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGl0Y2gtcmFuZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBpdGNoUmFuZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIX1JBTkdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwbGF5LWR1cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxheUR1cmluZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUExBWV9EVVJJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBvc2l0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUE9TSVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHF1b3RlcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVvdGVzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9RVU9URVMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHJpY2huZXNzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaWNobmVzcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklDSE5FU1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uLklTaG9ydGhhbmRBZGFwdGVyCi0JICogQHBhcmFtIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTaG9ydGhhbmRBZGFwdGVyIGdldFNob3J0aGFuZEFkYXB0ZXIoUHJvcENNUHJvcGVydHkgcHJvcCkgewotCQlyZXR1cm4gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcCk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzaXplIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TSVpFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhayBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWsoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhay1oZWFkZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrSGVhZGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19IRUFERVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrLW51bWVyYWwgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrTnVtZXJhbCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfTlVNRVJBTCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstcHVuY3R1YXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrUHVuY3R1YXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX1BVTkNUVUFUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVlY2gtcmF0ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlZWNoUmF0ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHN0cmVzcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyZXNzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TVFJFU1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRhYmxlLWxheW91dCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVMYXlvdXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RBQkxFX0xBWU9VVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1hbGlnbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEFsaWduKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0FMSUdOKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LWRlY29yYXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHREZWNvcmF0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0RFQ09SQVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtaW5kZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0SW5kZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0lOREVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1zaGFkb3cgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRTaGFkb3coKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfU0hBRE9XKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LXRyYW5zZm9ybSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFRyYW5zZm9ybSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9UUkFOU0ZPUk0pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHVuaWNvZGUtYmlkaSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pY29kZUJpZGkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1VOSUNPREVfQklESSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdmVydGljYWwtYWxpZ24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnRpY2FsQWxpZ24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZFUlRJQ0FMX0FMSUdOKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2aXNpYmlsaXR5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2b2ljZS1mYW1pbHkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZvaWNlRmFtaWx5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZvbHVtZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vm9sdW1lKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0xVTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdoaXRlLXNwYWNlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaGl0ZVNwYWNlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSElURV9TUEFDRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2lkb3dzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaWRvd3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRE9XUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd29yZC1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXb3JkU3BhY2luZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB6LWluZGV4IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRaSW5kZXgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1pfSU5ERVgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJZlByb3BlcnRpZXMuY2xlYXIoKTsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKQotCQkJZk1vZGlmaWVkLmNsZWFyKCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG5Qcm9wZXJ0aWVzID0gZGVjbC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJvcGVydGllczsgaSsrKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWUgPSBkZWNsLml0ZW0oaSk7Ci0JCQlpZiAocHJvcE5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9wTiA9IHByb3BOYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChwcm9wTi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCUNTU1ZhbHVlIHZhbCA9IGRlY2wuZ2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wTmFtZSk7Ci0JCQkJCWlmICh2YWwgIT0gbnVsbCkKLQkJCQkJCWZQcm9wZXJ0aWVzLnB1dChwcm9wTiwgdmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0U2hvcnRoYW5kQWRhcHRlcnMoKSB7Ci0JCWlmIChzaG9ydGhhbmRBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCS8vIHJlZ2lzdGVyCi0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKSwgbmV3IEJhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpLCBuZXcgQm9yZGVyU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSwgbmV3IEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSwgbmV3IEJvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSwgbmV3IEJvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCksIG5ldyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpLCBuZXcgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSwgbmV3IEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKSwgbmV3IEJvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKSwgbmV3IEZvbnRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSwgbmV3IExpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTiksIG5ldyBNYXJnaW5TaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSwgbmV3IFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyKCkpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0U3ViUHJvcGVydHlBZGFwdGVycygpIHsKLQkJaWYgKHN1YlByb3BlcnR5QWRhcHRlcnMgPT0gbnVsbCkgewotCQkJc3ViUHJvcGVydHlBZGFwdGVycyA9IG5ldyBIYXNodGFibGUoKTsKLQotCQkJLy8gcmVnaXN0ZXIKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCwgbmV3IEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1ksIG5ldyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCwgbmV3IENsaXBUb3BTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQsIG5ldyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NLCBuZXcgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZULCBuZXcgQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gKGZNb2RpZmllZCAhPSBudWxsICYmIGZNb2RpZmllZC5zaXplKCkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIHByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmUHJvcGVydGllcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIHByb3BlcnRpZXNNb2RpZmllZCgpIHsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBmTW9kaWZpZWQuY2xvbmUoKSkuaXRlcmF0b3IoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyB0aGUgdmFsdWUgb2Ygc2hvcnRoYW5kICdwcm9wJyB0byAnZm9yZWlnbicKLQkgKiBjb250ZXh0LiBOb3RlIHRoYXQgaWYgdGhpcyBoYXMgcGFyZW50IHNob3J0aGFuZCBwcm9wZXJ0aWVzIG9mICdwcm9wJywKLQkgKiB0aGV5IGFyZSBhbGwgZXhwYW5kZWQgdG8gJ2ZvcmVpZ24nIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRXh0cmFjdChQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBDU1NQcm9wZXJ0eUNvbnRleHQgZm9yZWlnbikgewotCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCXJlY3Vyc2l2ZUV4dHJhY3QocHJvcC5zaG9ydGhhbmRDb250YWluZXJBdChpKSwgZm9yZWlnbik7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9IGdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlzdHIgPSBmb3JlaWduLmdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJSVNob3J0aGFuZEFkYXB0ZXIgYWRhcHRlciA9IChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3ApOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuZXhwYW5kKHN0ciwgZm9yZWlnbik7Ci0JCQkJZm9yZWlnbi5zZXQocHJvcC5nZXROYW1lKCksICIiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZXNjZW5kYW50cyhQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChwcm9wLmlzU2hvcnRoYW5kKCkpIHsKLQkJCS8vIHJlbW92ZSBwcm9wZXJ0aWVzCi0JCQlpbnQgbiA9IHByb3AuZ2V0TnVtQ2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IHByb3AuZ2V0Q2hpbGRBdChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkpIHsKLQkJCQkJcmVtb3ZlRGVzY2VuZGFudHMoKFByb3BDTVByb3BlcnR5KSBvYmopOwotCi0JCQkJCVN0cmluZyBzdHIgPSBnZXQob2JqLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJCXNldChvYmoudG9TdHJpbmcoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldE1vZGlmaWVkKCkgewotCQlpZiAoZk1vZGlmaWVkICE9IG51bGwpCi0JCQlmTW9kaWZpZWQuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBhaXIgb2YgJ3Byb3AnLyd2YWx1ZScuIElmIHNob3J0aGFuZCBwcm9wZXJ0aWVzCi0JICogcmVsYXRlZCB0byAncHJvcCcgYXJlIGFscmVhZHkgZGVmaW5lZCwgdGhleSB3aWxsIGJlIGV4cGFuZGVkIHRvIGF2b2lkCi0JICogcHJvcGVydHkgY29uZmxpY3Rpb24uIElmIGRlc2NlbmRhbnQgcHJvcGVydGllcyBvZiAncHJvcCcgYXJlIGFscmVhZHkKLQkgKiBkZWZpbmVkLCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCB0byBhdm9pZCBwcm9wZXJ0eSBjb25mbGljdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eSBwcm9wLCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkgewotCQkJSVN1YlByb3BlcnR5QWRhcHRlciBhZGFwdGVyID0gKElTdWJQcm9wZXJ0eUFkYXB0ZXIpIHN1YlByb3BlcnR5QWRhcHRlcnMuZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldCh0aGlzLCB2YWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgPiAwKSB7Ci0JCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCQlDU1NQcm9wZXJ0eUNvbnRleHQgY29udGV4dCA9IG5ldyBDU1NQcm9wZXJ0eUNvbnRleHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCQlyZWN1cnNpdmVFeHRyYWN0KHByb3Auc2hvcnRoYW5kQ29udGFpbmVyQXQoaSksIGNvbnRleHQpOwotCQkJfQotCQkJRW51bWVyYXRpb24gcHJvcGVydGllcyA9IGNvbnRleHQucHJvcGVydGllcygpOwotCQkJd2hpbGUgKHByb3BlcnRpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgcHJvcEZvcmVpZ24gPSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlzZXQocHJvcEZvcmVpZ24sIGNvbnRleHQuZ2V0KHByb3BGb3JlaWduKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVEZXNjZW5kYW50cyhwcm9wKTsKLQotCQlzZXQocHJvcC5nZXROYW1lKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBhaXIgb2YgJ3Byb3BOYW1lJy8ndmFsdWUnIHJlZ2FyZGxlc3Mgb2YgaXRzCi0JICogc2hvcnRoYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0KFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGtleSA9IHByb3BOYW1lOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCWZQcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwotCQllbHNlCi0JCQlmUHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCWlmIChmTW9kaWZpZWQgPT0gbnVsbCkKLQkJCWZNb2RpZmllZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZNb2RpZmllZC5hZGQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBemltdXRoKFN0cmluZyBhemltdXRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9BWklNVVRIKSwgYXppbXV0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgYmFja2dyb3VuZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpLCBiYWNrZ3JvdW5kKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQXR0YWNobWVudChTdHJpbmcgYmFja2dyb3VuZEF0dGFjaG1lbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpLCBiYWNrZ3JvdW5kQXR0YWNobWVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKFN0cmluZyBiYWNrZ3JvdW5kQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSwgYmFja2dyb3VuZENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2UoU3RyaW5nIGJhY2tncm91bmRJbWFnZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpLCBiYWNrZ3JvdW5kSW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvbihTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTiksIGJhY2tncm91bmRQb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWChqYXZhLmxhbmcuU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvblgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLCBiYWNrZ3JvdW5kUG9zaXRpb25YKTsKLQkJLyoKLQkJICogU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsgU3RyaW5nIHZhbEggPSBiYWNrZ3JvdW5kUG9zaXRpb25YOyBTdHJpbmcKLQkJICogdmFsViA9IGdldEJhY2tncm91bmRQb3NpdGlvblkoKTsgaWYgKHZhbFYgPT0gbnVsbCB8fAotCQkgKiB2YWxWLmxlbmd0aCgpPT0gMCkgbmV3VmFsdWUgPSB2YWxIOyBlbHNlIGlmICh2YWxIID09IG51bGwgfHwKLQkJICogdmFsSC5sZW5ndGgoKSA9PSAwKSB7IENvbGxlY3Rpb24gdmFsWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJICogQ29sbGVjdGlvbiB2YWxZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkgKiBQcm9wQ01VdGlsLm1pbnVzKHZhbFksdmFsWCk7IEl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkgKiB3aGlsZShpdC5oYXNOZXh0KCkpIHsgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsgaWYKLQkJICogKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7IC8vIG5lZWQgbm90Ci0JCSAqIGNvbXBlbnNhdGUgZm9yIC4uLiBuZXdWYWx1ZSA9IHZhbFY7IGJyZWFrOyB9IH0gLy8gY29tcGVuc2F0ZSBmb3IKLQkJICogSG9yaXpvbnRhbCB2YWx1ZSBpZiAobmV3VmFsdWUgPT0gbnVsbCkgbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7IH0KLQkJICogZWxzZSBuZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOyBzZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKGphdmEubGFuZy5TdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uWSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSksIGJhY2tncm91bmRQb3NpdGlvblkpOwotCQkvKgotCQkgKiBTdHJpbmcgbmV3VmFsdWUgPSBudWxsOyBTdHJpbmcgdmFsSCA9IGdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQkJICogU3RyaW5nIHZhbFYgPSBiYWNrZ3JvdW5kUG9zaXRpb25ZOyBpZiAodmFsViA9PSBudWxsIHx8Ci0JCSAqIHZhbFYubGVuZ3RoKCk9PSAwKSBuZXdWYWx1ZSA9IHZhbEg7IGVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fAotCQkgKiB2YWxILmxlbmd0aCgpID09IDApIHsgQ29sbGVjdGlvbiB2YWxYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkgKiBDb2xsZWN0aW9uIHZhbFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCSAqIFByb3BDTVV0aWwubWludXModmFsWSx2YWxYKTsgSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCSAqIHdoaWxlKGl0Lmhhc05leHQoKSkgeyBPYmplY3Qgb2JqID0gaXQubmV4dCgpOyBpZgotCQkgKiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsgLy8gbmVlZCBub3QKLQkJICogY29tcGVuc2F0ZSBmb3IgLi4uIG5ld1ZhbHVlID0gdmFsVjsgYnJlYWs7IH0gfSAvLyBjb21wZW5zYXRlIGZvcgotCQkgKiBIb3Jpem9udGFsIHZhbHVlIGlmIChuZXdWYWx1ZSA9PSBudWxsKSBuZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsgfQotCQkgKiBlbHNlIG5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7IHNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRSZXBlYXQoU3RyaW5nIGJhY2tncm91bmRSZXBlYXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCksIGJhY2tncm91bmRSZXBlYXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpLCBib3JkZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbShTdHJpbmcgYm9yZGVyQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSwgYm9yZGVyQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21Db2xvcihTdHJpbmcgYm9yZGVyQm90dG9tQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpLCBib3JkZXJCb3R0b21Db2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tU3R5bGUoU3RyaW5nIGJvcmRlckJvdHRvbVN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSwgYm9yZGVyQm90dG9tU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbVdpZHRoKFN0cmluZyBib3JkZXJCb3R0b21XaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCksIGJvcmRlckJvdHRvbVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xsYXBzZShTdHJpbmcgYm9yZGVyQ29sbGFwc2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xMQVBTRSksIGJvcmRlckNvbGxhcHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xvcihTdHJpbmcgYm9yZGVyQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUiksIGJvcmRlckNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0KFN0cmluZyBib3JkZXJMZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCksIGJvcmRlckxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRDb2xvcihTdHJpbmcgYm9yZGVyTGVmdENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUiksIGJvcmRlckxlZnRDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdFN0eWxlKFN0cmluZyBib3JkZXJMZWZ0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSwgYm9yZGVyTGVmdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0V2lkdGgoU3RyaW5nIGJvcmRlckxlZnRXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpLCBib3JkZXJMZWZ0V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0KFN0cmluZyBib3JkZXJSaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKSwgYm9yZGVyUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0Q29sb3IoU3RyaW5nIGJvcmRlclJpZ2h0Q29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUiksIGJvcmRlclJpZ2h0Q29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0U3R5bGUoU3RyaW5nIGJvcmRlclJpZ2h0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSksIGJvcmRlclJpZ2h0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0V2lkdGgoU3RyaW5nIGJvcmRlclJpZ2h0V2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCksIGJvcmRlclJpZ2h0V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclNwYWNpbmcoU3RyaW5nIGJvcmRlclNwYWNpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKSwgYm9yZGVyU3BhY2luZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyU3R5bGUoU3RyaW5nIGJvcmRlclN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpLCBib3JkZXJTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wKFN0cmluZyBib3JkZXJUb3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApLCBib3JkZXJUb3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcENvbG9yKFN0cmluZyBib3JkZXJUb3BDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUiksIGJvcmRlclRvcENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BTdHlsZShTdHJpbmcgYm9yZGVyVG9wU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpLCBib3JkZXJUb3BTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wV2lkdGgoU3RyaW5nIGJvcmRlclRvcFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSwgYm9yZGVyVG9wV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlcldpZHRoKFN0cmluZyBib3JkZXJXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSwgYm9yZGVyV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvdHRvbShTdHJpbmcgYm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1RUT00pLCBib3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhcHRpb25TaWRlKFN0cmluZyBjYXB0aW9uU2lkZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0FQVElPTl9TSURFKSwgY2FwdGlvblNpZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsZWFyKFN0cmluZyBjbGVhcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpLCBjbGVhcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcChTdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBCb3R0b20oamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBMZWZ0KGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcFJpZ2h0KGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBUb3AoamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09MT1IpLCBjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09OVEVOVCksIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvdW50ZXJJbmNyZW1lbnQoU3RyaW5nIGNvdW50ZXJJbmNyZW1lbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfSU5DUkVNRU5UKSwgY291bnRlckluY3JlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q291bnRlclJlc2V0KFN0cmluZyBjb3VudGVyUmVzZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfUkVTRVQpLCBjb3VudGVyUmVzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc0Zsb2F0KFN0cmluZyBjc3NGbG9hdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRkxPQVQpLCBjc3NGbG9hdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlKFN0cmluZyBjdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRSksIGN1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlQWZ0ZXIoU3RyaW5nIGN1ZUFmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpLCBjdWVBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlQmVmb3JlKFN0cmluZyBjdWVCZWZvcmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpLCBjdWVCZWZvcmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnNvcihTdHJpbmcgY3Vyc29yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVVJTT1IpLCBjdXJzb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihTdHJpbmcgZGlyZWN0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pLCBkaXJlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXkoU3RyaW5nIGRpc3BsYXkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJU1BMQVkpLCBkaXNwbGF5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGV2YXRpb24oU3RyaW5nIGVsZXZhdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKSwgZWxldmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbXB0eUNlbGxzKFN0cmluZyBlbXB0eUNlbGxzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTVBUWV9DRUxMUyksIGVtcHR5Q2VsbHMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnQoU3RyaW5nIGZvbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpLCBmb250KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250RmFtaWx5KFN0cmluZyBmb250RmFtaWx5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSksIGZvbnRGYW1pbHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplKFN0cmluZyBmb250U2l6ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKSwgZm9udFNpemUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplQWRqdXN0KFN0cmluZyBmb250U2l6ZUFkanVzdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCksIGZvbnRTaXplQWRqdXN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U3RyZXRjaChTdHJpbmcgZm9udFN0cmV0Y2gpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCksIGZvbnRTdHJldGNoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U3R5bGUoU3RyaW5nIGZvbnRTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSksIGZvbnRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFZhcmlhbnQoU3RyaW5nIGZvbnRWYXJpYW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpLCBmb250VmFyaWFudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFdlaWdodChTdHJpbmcgZm9udFdlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpLCBmb250V2VpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfSEVJR0hUKSwgaGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0KFN0cmluZyBsZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRUZUKSwgbGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV0dGVyU3BhY2luZyhTdHJpbmcgbGV0dGVyU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVUVEVSX1NQQUNJTkcpLCBsZXR0ZXJTcGFjaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5lSGVpZ2h0KFN0cmluZyBsaW5lSGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCksIGxpbmVIZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSwgbGlzdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVJbWFnZShTdHJpbmcgbGlzdFN0eWxlSW1hZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpLCBsaXN0U3R5bGVJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlUG9zaXRpb24oU3RyaW5nIGxpc3RTdHlsZVBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKSwgbGlzdFN0eWxlUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZVR5cGUoU3RyaW5nIGxpc3RTdHlsZVR5cGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSksIGxpc3RTdHlsZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbihTdHJpbmcgbWFyZ2luKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pLCBtYXJnaW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbkJvdHRvbShTdHJpbmcgbWFyZ2luQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKSwgbWFyZ2luQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5MZWZ0KFN0cmluZyBtYXJnaW5MZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCksIG1hcmdpbkxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpblJpZ2h0KFN0cmluZyBtYXJnaW5SaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKSwgbWFyZ2luUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpblRvcChTdHJpbmcgbWFyZ2luVG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKSwgbWFyZ2luVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXJPZmZzZXQoU3RyaW5nIG1hcmtlck9mZnNldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCksIG1hcmtlck9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFya3MoU3RyaW5nIG1hcmtzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLUyksIG1hcmtzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhIZWlnaHQoU3RyaW5nIG1heEhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX0hFSUdIVCksIG1heEhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4V2lkdGgoU3RyaW5nIG1heFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfV0lEVEgpLCBtYXhXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWluSGVpZ2h0KFN0cmluZyBtaW5IZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpLCBtaW5IZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbldpZHRoKFN0cmluZyBtaW5XaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX1dJRFRIKSwgbWluV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9ycGhhbnMoU3RyaW5nIG9ycGhhbnMpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09SUEhBTlMpLCBvcnBoYW5zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lKFN0cmluZyBvdXRsaW5lKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FKSwgb3V0bGluZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZUNvbG9yKFN0cmluZyBvdXRsaW5lQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpLCBvdXRsaW5lQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVTdHlsZShTdHJpbmcgb3V0bGluZVN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKSwgb3V0bGluZVN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lV2lkdGgoU3RyaW5nIG91dGxpbmVXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCksIG91dGxpbmVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcmZsb3coU3RyaW5nIG92ZXJmbG93KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVkVSRkxPVyksIG92ZXJmbG93KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nKFN0cmluZyBwYWRkaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSwgcGFkZGluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ0JvdHRvbShTdHJpbmcgcGFkZGluZ0JvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pLCBwYWRkaW5nQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nTGVmdChTdHJpbmcgcGFkZGluZ0xlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCksIHBhZGRpbmdMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmlnaHQoU3RyaW5nIHBhZGRpbmdSaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCksIHBhZGRpbmdSaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ1RvcChTdHJpbmcgcGFkZGluZ1RvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApLCBwYWRkaW5nVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlKFN0cmluZyBwYWdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKSwgcGFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrQWZ0ZXIoU3RyaW5nIHBhZ2VCcmVha0FmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0FGVEVSKSwgcGFnZUJyZWFrQWZ0ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0JlZm9yZShTdHJpbmcgcGFnZUJyZWFrQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0JFRk9SRSksIHBhZ2VCcmVha0JlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrSW5zaWRlKFN0cmluZyBwYWdlQnJlYWtJbnNpZGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKSwgcGFnZUJyZWFrSW5zaWRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZShTdHJpbmcgcGF1c2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFKSwgcGF1c2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdXNlQWZ0ZXIoU3RyaW5nIHBhdXNlQWZ0ZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0FGVEVSKSwgcGF1c2VBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF1c2VCZWZvcmUoU3RyaW5nIHBhdXNlQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9CRUZPUkUpLCBwYXVzZUJlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGl0Y2goU3RyaW5nIHBpdGNoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSCksIHBpdGNoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaXRjaFJhbmdlKFN0cmluZyBwaXRjaFJhbmdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSF9SQU5HRSksIHBpdGNoUmFuZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYXlEdXJpbmcoU3RyaW5nIHBsYXlEdXJpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKSwgcGxheUR1cmluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zaXRpb24oU3RyaW5nIHBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTiksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZXMoU3RyaW5nIHF1b3RlcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUVVPVEVTKSwgcXVvdGVzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWNobmVzcyhTdHJpbmcgcmljaG5lc3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJQ0hORVNTKSwgcmljaG5lc3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpZ2h0KFN0cmluZyByaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpLCByaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrKFN0cmluZyBzcGVhaykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspLCBzcGVhayk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtIZWFkZXIoU3RyaW5nIHNwZWFrSGVhZGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19IRUFERVIpLCBzcGVha0hlYWRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtOdW1lcmFsKFN0cmluZyBzcGVha051bWVyYWwpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX05VTUVSQUwpLCBzcGVha051bWVyYWwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrUHVuY3R1YXRpb24oU3RyaW5nIHNwZWFrUHVuY3R1YXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX1BVTkNUVUFUSU9OKSwgc3BlYWtQdW5jdHVhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlZWNoUmF0ZShTdHJpbmcgc3BlZWNoUmF0ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpLCBzcGVlY2hSYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJlc3MoU3RyaW5nIHN0cmVzcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1RSRVNTKSwgc3RyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZUxheW91dChTdHJpbmcgdGFibGVMYXlvdXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RBQkxFX0xBWU9VVCksIHRhYmxlTGF5b3V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QWxpZ24oU3RyaW5nIHRleHRBbGlnbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTiksIHRleHRBbGlnbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlY29yYXRpb24oU3RyaW5nIHRleHREZWNvcmF0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0RFQ09SQVRJT04pLCB0ZXh0RGVjb3JhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEluZGVudChTdHJpbmcgdGV4dEluZGVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpLCB0ZXh0SW5kZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U2hhZG93KFN0cmluZyB0ZXh0U2hhZG93KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1NIQURPVyksIHRleHRTaGFkb3cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRUcmFuc2Zvcm0oU3RyaW5nIHRleHRUcmFuc2Zvcm0pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKSwgdGV4dFRyYW5zZm9ybSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wKFN0cmluZyB0b3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RPUCksIHRvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pY29kZUJpZGkoU3RyaW5nIHVuaWNvZGVCaWRpKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpLCB1bmljb2RlQmlkaSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVydGljYWxBbGlnbihTdHJpbmcgdmVydGljYWxBbGlnbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVkVSVElDQUxfQUxJR04pLCB2ZXJ0aWNhbEFsaWduKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmlsaXR5KFN0cmluZyB2aXNpYmlsaXR5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKSwgdmlzaWJpbGl0eSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vm9pY2VGYW1pbHkoU3RyaW5nIHZvaWNlRmFtaWx5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpLCB2b2ljZUZhbWlseSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vm9sdW1lKFN0cmluZyB2b2x1bWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPTFVNRSksIHZvbHVtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2hpdGVTcGFjZShTdHJpbmcgd2hpdGVTcGFjZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpLCB3aGl0ZVNwYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWRvd3MoU3RyaW5nIHdpZG93cykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lET1dTKSwgd2lkb3dzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRFRIKSwgd2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmRTcGFjaW5nKFN0cmluZyB3b3JkU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKSwgd29yZFNwYWNpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFpJbmRleChTdHJpbmcgekluZGV4KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKSwgekluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjA2ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgYm90dG9tIHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldEJvdHRvbSgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgbGVmdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCByaWdodCwgdmFsdWUsIGxlZnQsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwTGVmdFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YmE4NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIGxlZnQgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRMZWZ0KCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgdG9wID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JCVN0cmluZyByaWdodCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCByaWdodCwgYm90dG9tLCB2YWx1ZSwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTYwYWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgcmlnaHQgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldFJpZ2h0KCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgdG9wID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgdmFsdWUsIGJvdHRvbSwgbGVmdCwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTlhMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBjbGlwIHN1Yi1wcm9wZXJ0aWVzCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDbGlwU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5SZWN0KSB7Ci0JCQkJc3RyID0gZ2V0KChvcmcudzNjLmRvbS5jc3MuUmVjdCkgb2JqKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJc3RyID0gc3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWludCBwb3MgPSBzdHIuaW5kZXhPZigicmVjdCgiKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCVN0cmluZyBzdWJTdHIgPSBudWxsOwotCQkJCQlwb3MgKz0gNTsKLQkJCQkJaW50IGkgPSAwOwotCQkJCQlkbyB7Ci0JCQkJCQlpbnQgcG9zRW5kID0gc3RyLmluZGV4T2YoIiwiLCBwb3MpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwb3NFbmQgPCAwKQotCQkJCQkJCXBvc0VuZCA9IHN0ci5pbmRleE9mKCIpIiwgcG9zKTsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zRW5kIDwgMCAmJiBwb3MgPCBzdHIubGVuZ3RoKCkpCi0JCQkJCQkJcG9zRW5kID0gc3RyLmxlbmd0aCgpOwotCQkJCQkJaWYgKHBvc0VuZCA+PSBwb3MpIHsKLQkJCQkJCQlzdWJTdHIgPSBzdHIuc3Vic3RyaW5nKHBvcywgcG9zRW5kKTsKLQkJCQkJCQlwb3MgPSBwb3NFbmQgKyAxOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXBvcyA9IC0xOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpKysgPCBpbmRleCgpICYmIHBvcyA+IDApOwotCi0JCQkJCWlmIChwb3MgPiAwKQotCQkJCQkJc3RyID0gc3ViU3RyLnRyaW0oKTsKLQkJCQkJZWxzZQotCQkJCQkJc3RyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXQoUmVjdCByZWN0KTsKLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IGludCBpbmRleCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMTAvMDQKLQkgKiAxOToyNTo0NikKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uSUNTUzJQcm9wZXJ0aWVzCi0JICogQHBhcmFtIHRvcAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByaWdodAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBib3R0b20KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZW1vdmVDaGVjawotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdG9wLCBTdHJpbmcgcmlnaHQsIFN0cmluZyBib3R0b20sIFN0cmluZyBsZWZ0LCBib29sZWFuIHJlbW92ZUNoZWNrKSB7Ci0JCWlmICh0b3AgPT0gbnVsbCB8fCB0b3AubGVuZ3RoKCkgPT0gMCkKLQkJCXRvcCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChyaWdodCA9PSBudWxsIHx8IHJpZ2h0Lmxlbmd0aCgpID09IDApCi0JCQlyaWdodCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChib3R0b20gPT0gbnVsbCB8fCBib3R0b20ubGVuZ3RoKCkgPT0gMCkKLQkJCWJvdHRvbSA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgbGVmdC5sZW5ndGgoKSA9PSAwKQotCQkJbGVmdCA9IElWYWxJRC5WX0FVVE87Ci0KLQkJaWYgKHJlbW92ZUNoZWNrICYmIHRvcC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiByaWdodC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiBib3R0b20udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgbGVmdC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSkgewotCQkJcHJvcGVydGllcy5zZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCBudWxsKTsKLQkJfQotCQllbHNlCi0JCQlwcm9wZXJ0aWVzLnNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksICJyZWN0KCIgKyB0b3AgKyAiLCAiICsgcmlnaHQgKyAiLCAiICsgYm90dG9tICsgIiwgIiArIGxlZnQgKyAiKSIpOy8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFRvcFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWI1ZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIHRvcCB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBUb3BTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRUb3AoKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByaWdodCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHZhbHVlLCByaWdodCwgYm90dG9tLCBsZWZ0LCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQ0OWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnZm9udCcgcHJvcGVydHkgJ2ZvbnQnIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsCi0gKiAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnbGluZS1oZWlnaHQnLAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRm9udFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgc3R5bGUgPSBudWxsLCB2YXJpYW50ID0gbnVsbCwgd2VpZ2h0ID0gbnVsbCwgc2l6ZSA9IG51bGwsIGhlaWdodCA9IG51bGwsIGZhbWlseSA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BGb250ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BWYXJpYW50ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU2l6ZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpOwotCQlib29sZWFuIGJOb3JtYWxTcGVjaWZpZWQgPSBmYWxzZTsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJLy8gZmlyc3Qgb2YgYWxsLCBjaGVjayBmb250IGlkZW50cwotCQkJCWlmIChpID09IDApIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wRm9udC5nZXROdW1DaGlsZCgpOyBqKyspIHsKLQkJCQkJCU9iamVjdCBvYmogPSBwcm9wRm9udC5nZXRDaGlsZEF0KGkpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZyAmJiB0b2tlbnNbaV0uaW1hZ2UuY29tcGFyZVRvSWdub3JlQ2FzZShvYmoudG9TdHJpbmcoKSkgPT0gMCkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdmFsdWUgIm5vcm1hbCIgaXMgc2hhcmVkICEhCi0JCQkJaWYgKHRva2Vuc1tpXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX05PUk1BTCkpIHsKLQkJCQkJYk5vcm1hbFNwZWNpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wVmFyaWFudC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl2YXJpYW50ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFNpemUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgJiYgd2VpZ2h0ID09IG51bGwgJiYgcHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCX0KLQkJfQotCi0JCWlmIChiTm9ybWFsU3BlY2lmaWVkKSB7Ci0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh2YXJpYW50ID09IG51bGwpCi0JCQkJdmFyaWFudCA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh3ZWlnaHQgPT0gbnVsbCkKLQkJCQl3ZWlnaHQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCX0KLQotCQkvLyBza2lwIHdoaXRlc3BhY2UKLQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUykKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGxpbmUtaGVpZ2h0ID8KLQkJaWYgKGkgPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCWhlaWdodCA9IHRva2Vuc1tpKytdLmltYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBmb250LWZhbWlseQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQl9Ci0JCWZhbWlseSA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUsIHN0eWxlKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQsIHZhcmlhbnQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hULCB3ZWlnaHQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSwgc2l6ZSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQsIGhlaWdodCk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFksIGZhbWlseSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBzdHlsZSA9IG51bGwsIHZhcmlhbnQgPSBudWxsLCB3ZWlnaHQgPSBudWxsLCBzaXplID0gbnVsbCwgaGVpZ2h0ID0gbnVsbCwgZmFtaWx5ID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEZvbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFZhcmlhbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdlaWdodCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTaXplID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BIZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wRmFtaWx5ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKTsKLQkJYm9vbGVhbiBiTm9ybWFsU3BlY2lmaWVkID0gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCS8vIGZpcnN0IG9mIGFsbCwgY2hlY2sgZm9udCBpZGVudHMKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcEZvbnQuZ2V0TnVtQ2hpbGQoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gcHJvcEZvbnQuZ2V0Q2hpbGRBdChpKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcgJiYgdG9rZW5zW2ldLmltYWdlLmNvbXBhcmVUb0lnbm9yZUNhc2Uob2JqLnRvU3RyaW5nKCkpID09IDApCi0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdmFsdWUgIm5vcm1hbCIgaXMgc2hhcmVkICEhCi0JCQkJaWYgKHRva2Vuc1tpXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX05PUk1BTCkpIHsKLQkJCQkJYk5vcm1hbFNwZWNpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wVmFyaWFudC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl2YXJpYW50ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFNpemUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgJiYgd2VpZ2h0ID09IG51bGwgJiYgcHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCX0KLQkJfQotCi0JCWlmIChiTm9ybWFsU3BlY2lmaWVkKSB7Ci0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh2YXJpYW50ID09IG51bGwpCi0JCQkJdmFyaWFudCA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh3ZWlnaHQgPT0gbnVsbCkKLQkJCQl3ZWlnaHQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCX0KLQotCQkvLyBza2lwIHdoaXRlc3BhY2UKLQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUykKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGxpbmUtaGVpZ2h0ID8KLQkJaWYgKGkgPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCWhlaWdodCA9IHRva2Vuc1tpKytdLmltYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBmb250LWZhbWlseQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQl9Ci0JCWZhbWlseSA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLQotCQlpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wVmFyaWFudCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB2YXJpYW50OwotCQllbHNlIGlmIChwcm9wV2VpZ2h0ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdlaWdodDsKLQkJZWxzZSBpZiAocHJvcFNpemUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc2l6ZTsKLQkJZWxzZSBpZiAocHJvcEhlaWdodCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBoZWlnaHQ7Ci0JCWVsc2UgaWYgKHByb3BGYW1pbHkgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gZmFtaWx5OwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lDU1MyUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lDU1MyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQ1MThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTMlByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTMlByb3BlcnRpZXMgZXh0ZW5kcyBDU1MyUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwbHlNb2RpZmllZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQoUHJvcENNUHJvcGVydHkgcHJvcCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblkoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwQm90dG9tKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcExlZnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwUmlnaHQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwVG9wKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzTW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUVudW1lcmF0aW9uIHByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIHByb3BlcnRpZXNNb2RpZmllZCgpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXNldE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblgoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWShTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwQm90dG9tKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBMZWZ0KFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBSaWdodChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwVG9wKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5MWYwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODdiNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdWJQcm9wZXJ0eUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9MaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjAyMDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9MaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdsaXN0LXN0eWxlJyBwcm9wZXJ0eSAnbGlzdC1zdHlsZScgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2xpc3Qtc3R5bGUtaW1hZ2UnLCAnbGlzdC1zdHlsZS1wb3NpdGlvbicsICdsaXN0LXN0eWxlLXR5cGUnLAotICovCi1wdWJsaWMgY2xhc3MgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGltYWdlID0gIiIsIHBvcyA9ICIiLCB0eXBlID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BUeXBlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgeyAvLyB2YWx1ZT0ibm9uZSIgaXMgc2hhcmVkICEhCi0JCQkJCWlmIChwcm9wVHlwZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl0eXBlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQlpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BQb3MuZ2V0TmFtZSgpLCBwb3MpOwotCQlkZXN0LnNldChwcm9wVHlwZS5nZXROYW1lKCksIHR5cGUpOwotCQlkZXN0LnNldChwcm9wSW1hZ2UuZ2V0TmFtZSgpLCBpbWFnZSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBpbWFnZSA9IG51bGwsIHBvcyA9IG51bGwsIHR5cGUgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVHlwZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIHsgLy8gdmFsdWU9Im5vbmUiIGlzIHNoYXJlZCAhIQotCQkJCQlpZiAocHJvcFR5cGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdHlwZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcFBvcyA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBwb3M7Ci0JCWVsc2UgaWYgKHByb3BUeXBlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHR5cGU7Ci0JCWVsc2UgaWYgKHByb3BJbWFnZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBpbWFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTWFyZ2luU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTNhZmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdtYXJnaW4nIHByb3BlcnR5ICdtYXJnaW4nIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ21hcmdpbi10b3AnLAotICogJ21hcmdpbi1yaWdodCcsICdtYXJnaW4tYm90dG9tJywgJ21hcmdpbi1sZWZ0JywKLSAqLwotcHVibGljIGNsYXNzIE1hcmdpblNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTWFyZ2luU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hULCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZULCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1AgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGU0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdwYWRkaW5nJyBwcm9wZXJ0eSAncGFkZGluZycgd2lsbCBiZSBleHBhbmRlZCB0byAncGFkZGluZy10b3AnLAotICogJ3BhZGRpbmctcmlnaHQnLCAncGFkZGluZy1ib3R0b20nLCAncGFkZGluZy1sZWZ0JywKLSAqLwotcHVibGljIGNsYXNzIFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1AsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hULCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00sIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1AgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9WYWx1ZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9WYWx1ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0ZjNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlRGF0YSB7Ci0KLQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCXB1YmxpYyBib29sZWFuIGltcG9ydGFudCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFZhbHVlRGF0YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wKSB7Ci0JCXN1cGVyKCk7Ci0JCXZhbHVlID0gdmFsOwotCQlpbXBvcnRhbnQgPSBpbXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3RleHQvSUNTU1BhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdGV4dC9JQ1NTUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzg2YjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdGV4dC9JQ1NTUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUKLSAqIHBhcnRpdGlvbmluZyBmb3IgQ1NTIGFuZCBhbGwgaXRzIHBhcnRpdGlvbnMuIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUKLSAqIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1BhcnRpdGlvbnMgewotCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuU1RZTEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFkOWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYyIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIga2luZD0iY29uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIga2luZD0iY29uIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvdWkvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvY29yZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC91aS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9ImJpbiIga2luZD0ib3V0cHV0Ii8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzdmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWNzc2VkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWRldi5wcm9wZXJ0aWVzCi1iaW4KLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMGI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjAzNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNzcy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjdiYWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDVjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jc3MudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmF1dG9lZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0LnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzNTc4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3Y3NzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2Nzc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRmNzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3Y3NzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjc3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyODdhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE3MDRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2F1cmFsX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTBmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9ib3htb2RlbF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hhcnNldF9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5Mzg0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI0ZDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzX3NlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbGJhY2tfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTIzMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb250ZW50X3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMzZGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5bmFtZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHluYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNThhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHluYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMTJkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9mdW5jdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9pZGVudGlmaWVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWRiZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfdW5pdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4YTNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTVmODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250ZmFjZV9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY1OWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg1N2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2lkX3NlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4OWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3NlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODViNzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWVkaWFfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5MWYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwYzIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9vdGhlcl9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZV9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1ZjY0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZWRtZWRpYV9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlZG1lZGlhX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MzViMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlZG1lZGlhX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BzZXVkby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2V1ZG8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZhNmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BzZXVkby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M1ZDBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzZmZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZXNoZWV0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGZkZTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2M3NmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhYmxlX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmODFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4NTBmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0X3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNjNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0X3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhOGI5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91aV9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdW5rbm93bl9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ZTRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmlzdWFsX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Zpc3VhbF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYThiMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmlzdWFsX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3Y3NzZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGNmMDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGU0YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TU0UgQ1NTIFNvdXJjZSBFZGl0b3IKLUNTU19Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1DU1MgRWRpdG9yCi1DU1NfRmlsZXMubmFtZT1DU1MgRmlsZXMKLUNTU19Tb3VyY2UubmFtZT1DU1MgU291cmNlCi1DU1NfU3R5bGVzLm5hbWU9Q1NTIFN0eWxlcwotQ1NTX1RlbXBsYXRlcy5uYW1lPUNTUyBUZW1wbGF0ZXMKLVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lPVdlYiBDb250ZW50IFNldHRpbmdzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBmb2xsb3dpbmcgcHJvcGVydHkga2V5cyBtYXliZSB1bnVzZWQuIENvbW1lbnRlZCBvdXQgb24gMTIvNy8yMDA0LiBVbmNvbW1lbnQgaWYgbmVlZGVkLgotI0NTU19Bbm5vdGF0aW9ucy5uYW1lPUNTUyBBbm5vdGF0aW9ucwotCi0KLSNvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIGV4dGVuc2lvbiBwb2ludAotX1VJX1dJWkFSRF9OQU1FID0gQ1NTCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBDYXNjYWRpbmcgU3R5bGUgU2hlZXQuCi0jIwotQWRkVGFzay5sYWJlbD1BZGQgJlRhc2suLi4KLUFkZFRhc2sudG9vbHRpcD1BZGQgVGFzay4uLgotQWRkQm9va21hcmsubGFiZWw9QWRkIEJvbyZrbWFyay4uLgotQWRkQm9va21hcmsudG9vbHRpcD1BZGQgQm9va21hcmsuLi4KLVNlbGVjdFJ1bGVyLmxhYmVsPVNlbGVjdCBSdWxlcgotIyMKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9RW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD1OZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD1QcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsPVJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcD1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi0jIwotQWxsX0NTU19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1BbGwgQ1NTCi1DU1NfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBDU1MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTNiMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUNTU19Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5BY3Rpb25Db250cmlidXRvckNTUyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZS5DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MucHJvcGVydGllcy5DU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZXh0LkNTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbi5TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zdHlsZXMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfRmlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcyI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zb3VyY2UiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX1RlbXBsYXRlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfU3R5bGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5DU1NDb2xvclBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc3R5bGVzIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBDU1MgQ29udGVudCBTZXR0aW5ncyBQcm9wZXJ0eSBQYWdlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCQk8cGFnZQotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJYWRhcHRhYmxlPSJ0cnVlIgotCQkJbmFtZT0iJVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmNzcyI+Ci0JCQk8ZmlsdGVyCi0JCQkJbmFtZT0iY29udGVudFR5cGVJZCIKLQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI+Ci0JCQk8L2ZpbHRlcj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIj48L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIj48L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGNzcyB1aSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkNTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBOZXcgQ1NTIHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwud2l6YXJkLk5ld0NTU1dpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05BTUUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQuTmV3Q1NTV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjc3Nfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUFsbF9DU1NfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUNTUyIKLQkJCWlkPSJjc3NfYWxsIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQ1NTX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlQ1NTIgotCQkJaWQ9ImNzc19uZXciPgotCQk8L2NvbnRleHRUeXBlPgotCQk8aW5jbHVkZQotCQkJZmlsZT0idGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyI+Ci0JCTwvaW5jbHVkZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gQ1NTIGVkaXRvciBhY3Rpb25zIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3ROZXh0Q1NTQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5Ij4KLQkJCTwvYWN0aW9uPgotCQk8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDRiNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBDU1MuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JDU1M7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlclN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKHN1cGVyU3RyYXRlZ2llc1tpXSk7Ci0JCX0KLQotCQlpZiAoY29udGVudFR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUygpKTsKLQkJfQotCi0JCXJldHVybiAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVswXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lDU1NQYXJ0aXRpb25zLlNUWUxFLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04sIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTn07Ci0JCX0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBudWxsOwotCi0JCWlmICgocGFydGl0aW9uVHlwZSA9PSBJQ1NTUGFydGl0aW9ucy5TVFlMRSkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OKSkgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJZmluYWwgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSUNTU1BhcnRpdGlvbnMuU1RZTEUpOwotCi0JCWZvcm1hdHRlci5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgRm9ybWF0UHJvY2Vzc29yQ1NTKCkpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJLy8gcHJlZml4WzBdIGlzIGVpdGhlciAnXHQnIG9yICcgJyB4IHRhYldpZHRoLCBkZXBlbmRpbmcgb24gcHJlZmVyZW5jZQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQlib29sZWFuIHVzZVNwYWNlcyA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKGluZGVudENoYXJQcmVmKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCVN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIGFwcGVuZFRhYiA9IGZhbHNlOwotCi0JCQlpZiAodXNlU3BhY2VzKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogKyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQotCQkJCWlmIChpICE9IGluZGVudGF0aW9uV2lkdGgpCi0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChhcHBlbmRUYWIpIHsKLQkJCQlwcmVmaXguYXBwZW5kKCdcdCcpOwotCQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQkJCS8vIHJlbW92ZSB0aGUgdGFiIHNvIHRoYXQgaW5kZW50YXRpb24gLSB0YWIgaXMgYWxzbyBhbiBpbmRlbnQKLQkJCQkvLyBwcmVmaXgKLQkJCQlwcmVmaXguZGVsZXRlQ2hhckF0KHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQl2ZWN0b3IuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAoU3RyaW5nW10pIHZlY3Rvci50b0FycmF5KG5ldyBTdHJpbmdbdmVjdG9yLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckNTUygpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckNTUygpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckNTUyA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQWN0aW9uQ29udHJpYnV0b3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9BY3Rpb25Db250cmlidXRvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzU4Y2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9BY3Rpb25Db250cmlidXRvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIEFjdGlvbkNvbnRyaWJ1dG9yQ1NTCi0gKiAKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBtdWx0aSBwYWdlIGVkaXRvcidzCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciwgc2luY2UgY2FzY2FkZWQgaW5pdCgpIGNhbGwgZnJvbSB0aGUKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yIHdpbGwgY2F1c2VzIGV4Y2VwdGlvbiBhbmQgaXQgbGVhZHMgdG8gbG9zZSB3aG9sZQotICogdG9vbGJhcnMuCi0gKiAKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yIG9mCi0gKiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9yQ1NTIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb250ZW50QXNzaXN0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDbGVhbnVwRG9jdW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBmRm9ybWF0TWVudSA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmRm9ybWF0RG9jdW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBBY3Rpb25Db250cmlidXRvckNTUygpIHsKLQkJc3VwZXIoKTsKLQotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IENTU1VJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQotCQkvLyBlZGl0IGNvbW1hbmRzCi0JCWZDb250ZW50QXNzaXN0ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZDb250ZW50QXNzaXN0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJZkNsZWFudXBEb2N1bWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmQ2xlYW51cERvY3VtZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkNMRUFOVVBfRE9DVU1FTlQpOwotCi0JCWZGb3JtYXREb2N1bWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmRm9ybWF0RG9jdW1lbnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0RPQ1VNRU5UKTsKLQotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpOwotCi0JCWZGb3JtYXRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKENTU1VJTWVzc2FnZXMuRm9ybWF0TWVudV9sYWJlbCk7Ci0JCWZGb3JtYXRNZW51LmFkZChmRm9ybWF0RG9jdW1lbnQpOwotCQlmRm9ybWF0TWVudS5hZGQoZkZvcm1hdEFjdGl2ZUVsZW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbnRlbnRBc3Npc3QpOwotCQkJZWRpdE1lbnUuYWRkKGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCQl9Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCVN0cmluZyBzb3VyY2VNZW51TGFiZWwgPSBDU1NVSU1lc3NhZ2VzLlNvdXJjZU1lbnVfbGFiZWw7Ci0JCVN0cmluZyBzb3VyY2VNZW51SWQgPSAic291cmNlTWVudUlkIjsgLy8kTk9OLU5MUy0xJAotCQlJTWVudU1hbmFnZXIgc291cmNlTWVudSA9IG5ldyBNZW51TWFuYWdlcihzb3VyY2VNZW51TGFiZWwsIHNvdXJjZU1lbnVJZCk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHNvdXJjZU1lbnUpOwotCQlpZiAoc291cmNlTWVudSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0UmlnaHQpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0TGVmdCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ2xlYW51cERvY3VtZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZGb3JtYXRNZW51KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUykpOwotCi0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DTEVBTlVQX0RPQ1VNRU5UKSk7Ci0JCWZGb3JtYXREb2N1bWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKSk7Ci0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0RG9jdW1lbnQuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0ZmIyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDU1NVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDU1NVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElORk9fTm90X0NhdGVnb3JpemVkXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9XcmFwcGluZ1dpdGhvdXRBdHRyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfV3JhcHBpbmdJbnNlcnRMaW5lQnJlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlSWRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50VXBwZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlSWRlbnRMb3dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZVVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BOYW1lTG93ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlVXBwZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVVcHBlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JTYW1wbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvck5vcm1hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQXRtYXJrUnVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvck1lZGlhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDb21tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5VmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclVyaTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDb2xvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2VtaUNvbG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDdXJseUJyYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfQ1NTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXRsZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0TWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTX0NsZWFudXBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkZW50aWZpZXJfY2FzZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5X25hbWVfY2FzZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3Rvcl90YWdfbmFtZV9jYXNlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfdmFsdWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRfc291cmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc19pc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG93ZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwcGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdHRpbmdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmVfd2lkdGhfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRfdXNpbmdfdGFic187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3NwYWNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudGF0aW9uX3NpemVfdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODY4OGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUzsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENTU1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy51aSI7IC8vJE5PTi1OTFMtMSQKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTVUlQbHVnaW4gcGx1Z2luOwkKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBjc3MgdWkuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgY3NzIHVpLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ1NTVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBjc3MgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGNzcyBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIENTU1VJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBjc3MgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGNzcyBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5BTEwpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5ORVcpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTJkMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1JTkZPX05vdF9DYXRlZ29yaXplZF8xPU5vdCBDYXRlZ29yaXplZAotCi0jIyBDU1MgUHJlZmVyZW5jZXMgLS0gc291cmNlICMjCi1QcmVmc0xhYmVsX1dyYXBwaW5nV2l0aG91dEF0dHI9RGlzYWJsZSB3cmFwcGluZyBpbiBzdHlsZSAmYXR0cmlidXRlIG9mIEhUTUwKLVByZWZzTGFiZWxfV3JhcHBpbmdJbnNlcnRMaW5lQnJlYWs9SW5zZXJ0ICZsaW5lIGJyZWFrIGJldHdlZW4gcHJvcGVydGllcwotCi1QcmVmc0xhYmVsX0Nhc2VHcm91cD1DYXBpdGFsaXphdGlvbiBzdHlsZQotUHJlZnNMYWJlbF9DYXNlSWRlbnQ9SWRlbnRpZmllcjoKLVByZWZzTGFiZWxfQ2FzZVByb3BOYW1lPVByb3BlcnR5IG5hbWU6Ci1QcmVmc0xhYmVsX0Nhc2VQcm9wVmFsdWU9UHJvcGVydHkgdmFsdWU6Ci1QcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZT1TZWxlY3RvciB0YWcgbmFtZToKLQotUHJlZnNMYWJlbF9DYXNlSWRlbnRVcHBlcj0mVXBwZXJjYXNlCi1QcmVmc0xhYmVsX0Nhc2VJZGVudExvd2VyPUwmb3dlcmNhc2UKLVByZWZzTGFiZWxfQ2FzZVByb3BOYW1lVXBwZXI9VSZwcGVyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVMb3dlcj1MbyZ3ZXJjYXNlCi1QcmVmc0xhYmVsX0Nhc2VQcm9wVmFsdWVVcHBlcj1VcHAmZXJjYXNlCi1QcmVmc0xhYmVsX0Nhc2VQcm9wVmFsdWVMb3dlcj1Mb3dlJnJjYXNlCi1QcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZVVwcGVyPVVwcGVyJmNhc2UKLVByZWZzTGFiZWxfU2VsZWN0b3JUYWdOYW1lTG93ZXI9TG93ZXJjYSZzZQotCi0jIyBDU1MgUHJlZmVyZW5jZXMgLS0gY29sb3IgIyMKLQotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIENTUyBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgU2FtcGxlIFN0eWxlcwotUHJlZnNMYWJlbF9Db2xvclNhbXBsZT1AaW1wb3J0IHVybCgiLi4vc2FtcGxlMi5jc3MiKTtcblxuLyogU2FtcGxlIFN0eWxlcyAqL1xuXG5CT0RZIHtcblx0Y29sb3IgOiBibGFjaztcblx0YmFja2dyb3VuZC1jb2xvciA6IHJnYigxODEsIDI1MywgMjExKTtcblx0dGV4dC1hbGlnbiA6IGNlbnRlcjtcblx0Zm9udC1mYW1pbHkgOiAiSGVpc2VpIE1pbmNobyBXMyIsIHNlcmlmXG59XG5cbkBwYWdlIDpsZWZ0IHsgbWFyZ2luLWxlZnQgOiA0Y20gfVxuXG5AbWVkaWEgYXVyYWwge1xuXHRQLmhlaWRpIHtcblx0XHRhemltdXRoIDogY2VudGVyLWxlZnQ7XG5cdFx0ZWxldmF0aW9uIDogMTIuM2RlZztcblx0XHRwYXVzZSA6IDMwbXMgMS42c1xuXHR9XG59XG4KLQotUHJlZnNMYWJlbF9Db2xvck5vcm1hbD1EZWZhdWx0Ci1QcmVmc0xhYmVsX0NvbG9yQXRtYXJrUnVsZT1BdC1SdWxlCi1QcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3I9U2VsZWN0b3IKLVByZWZzTGFiZWxfQ29sb3JNZWRpYT1NZWRpYSBOYW1lCi1QcmVmc0xhYmVsX0NvbG9yQ29tbWVudD1Db21tZW50Ci1QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lPVByb3BlcnR5IE5hbWUKLVByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eVZhbHVlPVByb3BlcnR5IFZhbHVlCi1QcmVmc0xhYmVsX0NvbG9yVXJpPVVSSQotUHJlZnNMYWJlbF9Db2xvclN0cmluZz1RdW90ZWQgU3RyaW5nCi1QcmVmc0xhYmVsX0NvbG9yQ29sb249UHJvcGVydHkgRGVsaW1pdGVyCi1QcmVmc0xhYmVsX0NvbG9yU2VtaUNvbG9uPVNlbWlDb2xvbgotUHJlZnNMYWJlbF9Db2xvckN1cmx5QnJhY2U9Q3VybHkgQnJhY2UKLVByZWZzTGFiZWxfQ29sb3JFcnJvcj1FcnJvcgotIwotU29ydEFjdGlvbl8wPVNvcnQKLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IENhc2NhZGluZyBTdHlsZSBTaGVldAotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IENhc2NhZGluZyBTdHlsZSBTaGVldAotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgQ1NTIGZpbGUuCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfQ1NTID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4KLV9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCA9IEZpbGVzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHlvdXIgZGVwbG95ZWQgV2ViIGFwcGxpY2F0aW9uLiAKLSMKLVRpdGxlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIFZhbHVlCi1NZXNzYWdlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIHByb3BlcnR5IHZhbHVlLgotIyBDb3BpZWQgZnJvbSBzc2UudWkKLUZvcm1hdE1lbnVfbGFiZWw9RiZvcm1hdAotQ2xlYW51cERvY3VtZW50X2xhYmVsPUMmbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotVUlfbm9uZT1ub25lCi1DbGVhbnVwX1VJXz1DbGVhbnVwCi1DU1NfQ2xlYW51cF9VSV89Q1NTIENsZWFudXAKLUlkZW50aWZpZXJfY2FzZV9fVUlfPUlkZW50aWZpZXIgY2FzZToKLVByb3BlcnR5X25hbWVfY2FzZV9fVUlfPVByb3BlcnR5IG5hbWUgY2FzZToKLVByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXz1Qcm9wZXJ0eSB2YWx1ZSBjYXNlOgotU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfPVNlbGVjdG9yIHRhZyBuYW1lIGNhc2U6Ci1RdW90ZV92YWx1ZXNfVUlfPVF1b3RlIHZhbHVlcwotRm9ybWF0X3NvdXJjZV9VSV89JkZvcm1hdCBzb3VyY2UKLUFzX2lzX1VJXz1Bcy1pcwotTG93ZXJfVUlfPUxvd2VyCi1VcHBlcl9VSV89VXBwZXIKLVNvdXJjZU1lbnVfbGFiZWw9JlNvdXJjZQotRm9ybWF0dGluZ19VSV89Rm9ybWF0dGluZwotTGluZV93aWR0aF9fVUlfPUxpbmUgJndpZHRoOgotSW5kZW50X3VzaW5nX3RhYnNfPSZJbmRlbnQgdXNpbmcgdGFicwotSW5kZW50X3VzaW5nX3NwYWNlcz1JJm5kZW50IHVzaW5nIHNwYWNlcwotSW5kZW50YXRpb25fc2l6ZT1JbiZkZW50YXRpb24gc2l6ZToKLUluZGVudGF0aW9uX3NpemVfdGlwPUluZGVudGF0aW9uIHNpemUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD0mRW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD0mTmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD0mUHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLSMjCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBDU1MgVGVtcGxhdGUKLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIENTUyBwYWdlLgotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV80PVVzZSBDU1MgVGVtcGxhdGUKLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNT1QcmV2aWV3OgotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBDU1MnIHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgPGE+Q1NTIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotIyBDU1MgQ29udGVudCBTZXR0aW5ncwotQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9VGhlIHR5cGUgb2YgQ1NTIHRvIHVzZS4gIFRoZSBwcm9qZWN0IHNldHRpbmcgaXMgdXNlZCBpZiB5b3Ugc3BlY2lmeSAibm9uZS4iCi1DU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMT1DU1MgUHJvZmlsZToKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4ODY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQzMjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCi0JY2xhc3MgQ29tcG91bmRSZWdpb24gewotCi0JCUNvbXBvdW5kUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0JCQl0aGlzLnRleHRSZWdpb24gPSB0ZXh0UmVnaW9uOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJCXJldHVybiBkb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIGdldFRleHRSZWdpb24oKSB7Ci0JCQlyZXR1cm4gdGV4dFJlZ2lvbjsKLQkJfQotCi0JCWludCBnZXRTdGFydCgpIHsKLQkJCXJldHVybiB0ZXh0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCX0KLQotCQlpbnQgZ2V0RW5kKCkgewotCQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0RW5kKCk7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJfQotCi0JCVN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCX0KLQotCQlpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCQlyZXR1cm4gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCX0KLQotCQlpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJfQotCi0JCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbjsKLQkJcHJpdmF0ZSBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXV0b0luZGVudEFmdGVyQ2xvc2UoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWlmICghc2V0UmFuZ2VGb3JDbG9zZShjb21tYW5kKSkKLQkJCXJldHVybjsKLQotCQlpbnQgcG9zaXRpb24gPSBjb21tYW5kLm9mZnNldCArIGNvbW1hbmQubGVuZ3RoOwotCi0JCWlmIChwb3NpdGlvbiA9PSAtMSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2V0IG9wZW4gYnJhY2UgcmVnaW9uCi0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbiA9IHByZXZDb3JyZXNwb25kZW5jZShwb3NpdGlvbiwgcmVnaW9uVHlwZSk7Ci0KLQkJLy8gZ2V0IGluZGVudGF0aW9uCi0JCVN0cmluZyBzdHIgPSBnZXRJbmRlbnRGb3IocmVnaW9uLCBmYWxzZSk7Ci0KLQkJLy8gYXBwZW5kIHRvIGlucHV0Ci0JCWlmIChzdHIgIT0gbnVsbCkKLQkJCWNvbW1hbmQudGV4dCA9IHN0ciArIGNvbW1hbmQudGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBsaW5lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF1dG9JbmRlbnRBZnRlck5ld0xpbmUoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gc2VsZWN0IG5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2Ugd2l0aCBuZXctbGluZQotCQlzZXRSYW5nZUZvck5ld0xpbmUoY29tbWFuZCk7Ci0KLQkJLy8gZ2V0IHBvc2l0aW9uCi0JCWludCBwb3NpdGlvbiA9IGNvbW1hbmQub2Zmc2V0OwotCi0JCWlmIChwb3NpdGlvbiA9PSAtMSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2V0IGN1cnJlbnQgcmVnaW9uCi0JCUNvbXBvdW5kUmVnaW9uIGN1cnJlbnRSZWdpb24gPSBnZXRSZWdpb24oY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aCk7Ci0KLQkJLy8gZ2V0IGtleSByZWdpb24KLQkJQ29tcG91bmRSZWdpb24ga2V5UmVnaW9uID0gZ2V0UHJldktleVJlZ2lvbihwb3NpdGlvbiwgY3VycmVudFJlZ2lvbik7Ci0KLQkJLy8gZ2V0IGluZGVudCBzdHJpbmcKLQkJU3RyaW5nIHN0ciA9IGdldEluZGVudEZvcihrZXlSZWdpb24sIHRydWUpOwotCi0JCS8vIGNoZWNrIGFub3RoZXIgaW5kZW50YXRpb24KLQkJaW50IHNoaWZ0ID0gbmVlZFNoaWZ0KGtleVJlZ2lvbiwgY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aCk7Ci0KLQkJLy8gY3JlYXRlIHRleHQgdG8gcmVwbGFjZQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihjb21tYW5kLnRleHQpOwotCQlpZiAoc3RyICE9IG51bGwpCi0JCQlidWYuYXBwZW5kKHN0cik7Ci0JCXdoaWxlIChzaGlmdC0tICE9IDApCi0JCQlidWYuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJY29tbWFuZC50ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCS8vIHJldHVybjsKLQkJLy8gLyoKLQkJc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCi0JCWlmIChjb21tYW5kLmxlbmd0aCA9PSAwICYmIGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZW5kc1dpdGgoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBjb21tYW5kLnRleHQpICE9IC0xKSB7Ci0JCQkJYXV0b0luZGVudEFmdGVyTmV3TGluZShjb21tYW5kKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZC50ZXh0LmVxdWFscygifSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCWF1dG9JbmRlbnRBZnRlckNsb3NlKGNvbW1hbmQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpOwotCQkJfSBlbHNlIGlmIChjb21tYW5kLnRleHQuZXF1YWxzKCJdIikpIHsvLyROT04tTkxTLTEkCi0JCQkJYXV0b0luZGVudEFmdGVyQ2xvc2UoY29tbWFuZCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOwotCQkJfSBlbHNlIGlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIpIikpIHsvLyROT04tTkxTLTEkCi0JCQkJYXV0b0luZGVudEFmdGVyQ2xvc2UoY29tbWFuZCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKTsKLQkJCX0KLQkJfQotCQkvLyAqLwotCQkKLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5jaGFyQXQoMCkgPT0gJ1x0JykKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudEZvcihDb21wb3VuZFJlZ2lvbiByZWdpb24sIGJvb2xlYW4gaW5kZW50Rm9yTmV4dFJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHJlZ2lvbi5nZXREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkvLyBnZXQgbWVhbmZ1bCBmbGF0IG5vZGUKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gciA9IGl0LnByZXYoKTsKLQkJCQkJcmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZmxhdE5vZGUgPSByZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCQkvLyBnZXQgaW5kZW50IHN0cmluZwotCQkJCWludCBwb3NpdGlvbiA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgZW5kID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0LCBwb3NpdGlvbik7Ci0JCQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCX0gZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8Ci0JCQkvLyByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19PUEVOIHx8Ci0JCQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlpbnQgcG9zaXRpb24gPSBmbGF0Tm9kZS5nZXRTdGFydCgpICsgcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgZW5kID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0LCBwb3NpdGlvbik7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RydWN0dXJlZERvY3VtZW50LmdldChzdGFydCwgZW5kIC0gc3RhcnQpKTsKLQkJCQlwb3NpdGlvbiArPSByZWdpb24uZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJCWlmIChpbmRlbnRGb3JOZXh0UmVnaW9uKSB7Ci0JCQkJCWludCB0b2tlblN0YXJ0ID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uLCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKSArIHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lTGVuZ3RoKGxpbmUpIC0gMSk7Ci0JCQkJCWlmICh0b2tlblN0YXJ0IDwgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChsaW5lKSAtIDEpIHsKLQkJCQkJCXBvc2l0aW9uID0gdG9rZW5TdGFydDsKLQkJCQkJfQotCQkJCX0KLQkJCQl3aGlsZSAocG9zaXRpb24gLSBlbmQgPiAwKSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJCWVuZCsrOwotCQkJCX0KLQkJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNwKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y3ApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbiBnZXRQcmV2S2V5UmVnaW9uKGludCBwb3NpdGlvbiwgQ29tcG91bmRSZWdpb24gY3VycmVudFJlZ2lvbikgewotCQlpZiAoY3VycmVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGN1cnJlbnRSZWdpb24gIT0gbnVsbCAmJiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gcHJldkNvcnJlc3BvbmRlbmNlKGN1cnJlbnRSZWdpb24pOwotCQl9Ci0KLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbiAtIDEpOwotCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gaXQucHJldigpOwotCQkJQ29tcG91bmRSZWdpb24gcmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8Ci0JCQkJCQkvLyByZWdpb24uZ2V0VHlwZSgpID09Ci0JCQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfQlJBQ0tFVF9DTE9TRSB8fAotCQkJCQkJLy8gLy8gcmVnaW9uLmdldFR5cGUoKSA9PQotCQkJCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBUkVOVEhFU0lTX09QRU4gfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19DTE9TRSB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fAotCQkJCQkJLy8gcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09MT04gfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQKLQkJCQkJCS8vIHx8Ci0JCQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQkJLy8gc2tpcCB0byBMQlJBQ0UKLQkJCQlDb21wb3VuZFJlZ2lvbiBwYyA9IHByZXZDb3JyZXNwb25kZW5jZShyZWdpb24pOwotCQkJCS8vIGd1YXJkIGZvciBOUEUKLQkJCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEzMTgKLQkJCQlpZiAocGMgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJaXQucmVzZXQocGMuZ2V0RG9jdW1lbnRSZWdpb24oKSwgcGMuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORykgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0VG1wID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24pOwotCQkJCWlmIChyZWdpb24gPT0gaXRUbXAucHJldigpKQotCQkJCQlyZXR1cm4gcmVnaW9uOyAvLyBwb3NpdGlvbiBpcyBpbnNpZGUgb2Ygc3RyaW5nCi0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdFRtcCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCQlpZiAocmVnaW9uID09IGl0VG1wLnByZXYoKSkKLQkJCQkJcmV0dXJuIHJlZ2lvbjsgLy8gcG9zaXRpb24gaXMgaW5zaWRlIG9mIGNvbW1lbnQKLQkJCX0gZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJCVN0cmluZyBzdHIgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkJCWlmIChzdHIuY2hhckF0KHN0ci5sZW5ndGgoKSAtIDEpID09ICdcXCcpCi0JCQkJCXJldHVybiByZWdpb247Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0UHJldiA9IG5ldyBSZWdpb25JdGVyYXRvcihyZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKSwgcmVnaW9uLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJd2hpbGUgKGl0UHJldi5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uUHJldiA9IGl0UHJldi5wcmV2KCk7Ci0JCQkJCWlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIGlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJCXJldHVybiByZWdpb247Ci0JCQkJCX0gZWxzZSBpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQkJd2hpbGUgKGl0UHJldi5oYXNQcmV2KCkpIHsKLQkJCQkJCQlyZWdpb25QcmV2ID0gaXRQcmV2LnByZXYoKTsKLQkJCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCByZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCQkJCX0KLQkJCQkJCWlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gZ2V0UmVnaW9uKGludCBwb3NpdGlvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbikpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG5lZWRTaGlmdChDb21wb3VuZFJlZ2lvbiByZWdpb24sIGludCBwb3NpdGlvbikgewotCQlpbnQgc2hpZnQgPSAwOwotCQlpZiAocmVnaW9uID09IG51bGwgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCS8vIGdldCBub24gc3BhY2UgcmVnaW9uCi0JCQlDb21wb3VuZFJlZ2lvbiBjciA9IGdldFJlZ2lvbihwb3NpdGlvbiAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoY3IuZ2V0RG9jdW1lbnRSZWdpb24oKSwgY3IuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCUlUZXh0UmVnaW9uIG5lYXJlc3RSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCW5lYXJlc3RSZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChuZWFyZXN0UmVnaW9uICE9IG51bGwgJiYgKG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgbmVhcmVzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCBuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpKQotCQkJCXNoaWZ0LS07Ci0JCQllbHNlIGlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQlzaGlmdC0tOwotCQkJc2hpZnQrKzsKLQkJfQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCWlmICghaXQuaGFzUHJldigpIHx8IGl0LnByZXYoKS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQlzaGlmdCsrOwotCQkJZWxzZQotCQkJCXNoaWZ0ID0gMDsKLQkJfQotCQlyZXR1cm4gc2hpZnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uIHByZXZDb3JyZXNwb25kZW5jZShpbnQgcG9zaXRpb24sIFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24gLSAxKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IG5lc3QgPSAxOwotCQlpZiAocmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkvLyBza2lwIHRvIExCUkFDRQotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpIHsKLQkJCS8vIHNraXAgdG8gQlJBQ0tFVF9PUEVOCi0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpCi0JCQkJCW5lc3QtLTsKLQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQkvLyBza2lwIHRvIFBBUkVOVEhFU0lTX09QRU4KLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKC8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFSRU5USEVTSVNfT1BFTiB8fAotCQkJCXJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCW5lc3QrKzsKLQkJCQlpZiAobmVzdCA8PSAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChuZXN0ID09IDApCi0JCQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvbihpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gcHJldkNvcnJlc3BvbmRlbmNlKENvbXBvdW5kUmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcmVnaW9uLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBwb3NpdGlvbiA9IGZsYXROb2RlLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIHByZXZDb3JyZXNwb25kZW5jZShwb3NpdGlvbiwgcmVnaW9uLmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNldFJhbmdlRm9yQ2xvc2UoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQ7Ci0KLQkJaWYgKHBvc2l0aW9uID09IC0xIHx8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gZmluZCBzdGFydCBvZiBsaW5lCi0JCQlpbnQgcCA9IChwb3NpdGlvbiA9PSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPyBwb3NpdGlvbiAtIDEgOiBwb3NpdGlvbik7Ci0KLQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwKTsKLQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCk7Ci0JCQlib29sZWFuIGFsbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIHdoZXRoZXIgdGhlIHRleHQgZnJvbSBsU3RhcnQgdG8gcG9zaXRpb24gaXMgd2hpdGUgc3BhY2UKLQkJCS8vIG9yIG5vdAotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pID4gcCkgewotCQkJCQlhbGxXaGl0ZVNwYWNlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFsbFdoaXRlU3BhY2UpIHsKLQkJCQljb21tYW5kLmxlbmd0aCA9IGNvbW1hbmQubGVuZ3RoIC0gKHN0YXJ0IC0gY29tbWFuZC5vZmZzZXQpOwotCQkJCWNvbW1hbmQub2Zmc2V0ID0gc3RhcnQ7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y3ApIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjcCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhbmdlRm9yTmV3TGluZShEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlpbnQgcG9zaXRpb24gPSBjb21tYW5kLm9mZnNldDsKLQotCQlpZiAocG9zaXRpb24gPT0gLTEgfHwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBhZGQgcHJlLW5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2UgdGFyZ2V0Ci0JCQlpZiAocG9zaXRpb24gPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbiAtIDEpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uIC0gMSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCQlpbnQgZW5kID0gY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aDsKLQkJCQkJCWludCBuTGluZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24pOwotCQkJCQkJaW50IG5TdGFydFBvcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KG5MaW5lKTsKLQkJCQkJCWlmIChuU3RhcnRQb3MgPCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQkJCW5TdGFydFBvcyA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQljb21tYW5kLm9mZnNldCA9IG5TdGFydFBvczsKLQkJCQkJCWNvbW1hbmQubGVuZ3RoID0gZW5kIC0gY29tbWFuZC5vZmZzZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCBwb3N0LW5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2UgdGFyZ2V0Ci0JCQlpZiAocG9zaXRpb24gPCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCQlpbnQgbkxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQkJCVN0cmluZyBjdXJyZW50TGluZURlbGltID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIobkxpbmUpOwotCQkJCQkJaW50IG5FbmRQb3MgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChuTGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChuTGluZSkgLSAoKGN1cnJlbnRMaW5lRGVsaW0gIT0gbnVsbCkgPyBjdXJyZW50TGluZURlbGltLmxlbmd0aCgpIDogMCk7Ci0JCQkJCQlpZiAobkVuZFBvcyA+IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKQotCQkJCQkJCW5FbmRQb3MgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWNvbW1hbmQubGVuZ3RoID0gbkVuZFBvcyAtIGNvbW1hbmQub2Zmc2V0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3QgY3VzdG9taXplIGNvbW1hbmQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGVuZHNXaXRoKFN0cmluZ1tdIHNlYXJjaFN0cmluZ3MsIFN0cmluZyB0ZXh0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRleHQuZW5kc1dpdGgoc2VhcmNoU3RyaW5nc1tpXSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBmaW5kRW5kT2ZXaGl0ZVNwYWNlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGVuZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKG9mZnNldCA8IGVuZCkgewotCQkJY2hhciBjID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgewotCQkJCXJldHVybiBvZmZzZXQ7Ci0JCQl9Ci0JCQlvZmZzZXQrKzsKLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoaW5kZW50YXRpb25XaWR0aCAhPSAwKSB7Ci0JCQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQkJCXRyeSB7Ci0JCQkJCUlSZWdpb24gZmlyc3RMaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCQlpbnQgb2Zmc2V0SW5MaW5lID0gY29tbWFuZC5vZmZzZXQgLSBmaXJzdExpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCi0JCQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKQotCQkJCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0KLQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVycyB3aXRoIHNwYWNlcwotCQkJY29tbWFuZC50ZXh0ID0gaW5kZW50LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDQUNhbmRpZGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ0FDYW5kaWRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlNTVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDQUNhbmRpZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLQotY2xhc3MgQ1NTQ0FDYW5kaWRhdGUgewotCi0JcHJpdmF0ZSBTdHJpbmcgZlJlcGxhY2VtZW50U3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCXByaXZhdGUgU3RyaW5nIGZEaXNwbGF5U3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIENTU0ltYWdlVHlwZSBmSW1hZ2VUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0NBQ2FuZGlkYXRlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTQ0FDYW5kaWRhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCWludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBmRGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZSgpIHsKLQkJcmV0dXJuIGZJbWFnZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCVN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKLQkJcmV0dXJuIGZSZXBsYWNlbWVudFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJZkN1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0RGlzcGxheVN0cmluZyhTdHJpbmcgZGlzcGxheVN0cmluZykgewotCQlmRGlzcGxheVN0cmluZyA9IGRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZSBpbWFnZVR5cGUpIHsKLQkJZkltYWdlVHlwZSA9IGltYWdlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBzZXRSZXBsYWNlbWVudFN0cmluZyhTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcpIHsKLQkJZlJlcGxhY2VtZW50U3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChnZXRSZXBsYWNlbWVudFN0cmluZygpKTsKLQkJYnVmLmFwcGVuZCgiXCIiKTsvLyROT04tTkxTLTEkCi0JCWJ1Zi5hcHBlbmQoZ2V0RGlzcGxheVN0cmluZygpKTsKLQkJYnVmLmFwcGVuZCgiXCIiKTsvLyROT04tTkxTLTEkCi0JCWJ1Zi5hcHBlbmQoIigiKTsvLyROT04tTkxTLTEkCi0JCWJ1Zi5hcHBlbmQoZ2V0Q3Vyc29yUG9zaXRpb24oKSk7Ci0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkYjY1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotY2xhc3MgQ1NTQ29udGVudEFzc2lzdENvbnRleHQgewotCi0JcHJpdmF0ZSBpbnQgZlJlcGxhY2VCZWdpbiA9IC0xOwotCXByaXZhdGUgU3RyaW5nIGZUZXh0VG9SZXBsYWNlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmVGV4dFRvQ29tcGFyZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlRhcmdldFBvcyA9IC0xOwotCXByaXZhdGUgSUNTU05vZGUgZlRhcmdldE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGZDdXJzb3JQb3MgPSAtMTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkRvY3VtZW50T2Zmc2V0ID0gMDsKLQlwcml2YXRlIGNoYXIgZlF1b3RlID0gMDsKLQlwcml2YXRlIElDU1NNb2RlbCBmTW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ29udGVudEFzc2lzdENvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUNTU0NvbnRlbnRBc3Npc3RDb250ZXh0KGludCBkb2N1bWVudFBvc2l0aW9uLCBJQ1NTTm9kZSBub2RlLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGNoYXIgcXVvdGUpIHsKLQkJc3VwZXIoKTsKLQkJZkN1cnNvclBvcyA9IGRvY3VtZW50UG9zaXRpb247Ci0JCWZEb2N1bWVudE9mZnNldCA9IGRvY3VtZW50T2Zmc2V0OwotCQlmUXVvdGUgPSBxdW90ZTsKLQkJaW5pdGlhbGl6ZShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0Q3Vyc29yUG9zKCkgewotCQlyZXR1cm4gZkN1cnNvclBvczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXREb2N1bWVudE9mZnNldCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudE9mZnNldDsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gZk1vZGVsOwotCX0KLQotCXByaXZhdGUgSUNTU05vZGUgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIChJQ1NTTm9kZSkgKChmTW9kZWwgIT0gbnVsbCkgPyBmTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBjaGFyCi0JICovCi0JY2hhciBnZXRRdW90ZU9mU3R5bGVBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBmUXVvdGU7Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0UmVnaW9uQnlPZmZzZXQoaW50IG9mZnNldCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCS8vCVN0cmluZyBnZXRSZWdpb25UZXh0KCkgewotCS8vCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBnZXRUYXJnZXRSZWdpb24oKTsKLQkvLwkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsKSB7Ci0JLy8JCQlyZXR1cm4gdGFyZ2V0UmVnaW9uLmdldFRleHQoKTsKLQkvLwkJfSBlbHNlIHsKLQkvLwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCS8vCQl9Ci0JLy8JfQotCS8qKgotCSAqICAKLQkgKi8KLQlpbnQgZ2V0UmVwbGFjZUJlZ2luKCkgewotCQlyZXR1cm4gZlJlcGxhY2VCZWdpbjsKLQl9Ci0KLQlJQ1NTTm9kZSBnZXRUYXJnZXROb2RlKCkgewotCQlyZXR1cm4gZlRhcmdldE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VGFyZ2V0UG9zKCkgewotCQlyZXR1cm4gZlRhcmdldFBvczsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRUYXJnZXRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRSZWdpb25CeU9mZnNldChnZXRUYXJnZXRQb3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFRhcmdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnRSZWdpb25CeU9mZnNldChnZXRUYXJnZXRQb3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uQnlPZmZzZXQoaW50IG9mZnNldCkgewotCQlyZXR1cm4gKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgPyBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkgOiBudWxsOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFRhcmdldFJlZ2lvblByZXZpb3VzKCkgewotCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGdldFRhcmdldFJlZ2lvbigpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0JCWlmICh0YXJnZXRSZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKDAgPCBmQ3Vyc29yUG9zKSB7Ci0JCQkJaXRlcmF0b3IgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgZkN1cnNvclBvcyAtIDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaXRlcmF0b3IgPSBnZXRSZWdpb25JdGVyYXRvcigpOwotCQkJaWYgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJCWl0ZXJhdG9yLnByZXYoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlcmF0b3IgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChpdGVyYXRvciAhPSBudWxsKSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlcmF0b3IucHJldigpOwotCQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHsKLQkJCQkJcHJldmlvdXNSZWdpb24gPSByZWdpb247Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcmV2aW91c1JlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFRvQ29tcGFyZSgpIHsKLQkJcmV0dXJuIGZUZXh0VG9Db21wYXJlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFRvUmVwbGFjZSgpIHsKLQkJcmV0dXJuIGZUZXh0VG9SZXBsYWNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQlmTW9kZWwgPSBtb2RlbDsKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWluaXRpYWxpemVUYXJnZXRQb3MoKTsKLQkJaW5pdGlhbGl6ZVRhcmdldFRleHQoKTsKLQkJaW5pdGlhbGl6ZVRhcmdldE5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYXJnZXROb2RlKCkgewotCQlpZiAoZkN1cnNvclBvcyA9PSAwKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IGZNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCBlZGdlIG9mIHRyZWUgbm9kZQotCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gZ2V0Tm9kZUF0KGZDdXJzb3JQb3MpOwotCQlpZiAoY3Vyc29yTm9kZSA9PSBudWxsKSB7IC8vIGVuZCBvZiBkb2N1bWVudAotCQkJY3Vyc29yTm9kZSA9IGZNb2RlbC5nZXREb2N1bWVudCgpOwotCQl9Ci0JCUlDU1NOb2RlIG5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ3Vyc29yUG9zIC0gMSk7Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIChub2RlID0gZ2V0Tm9kZUF0KGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpKSA9PSBjdXJzb3JOb2RlICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSAhPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsgLy8gdG9wIG9mIGRvY3VtZW50Ci0JCQlmVGFyZ2V0Tm9kZSA9IChub2RlID09IG51bGwpID8gZk1vZGVsLmdldERvY3VtZW50KCkgOiBub2RlOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vICAgdjwtLXwKLQkJLy8gICBBQUFBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkEgLCBub2RlOkIgLT4gdGFyZ2V0IGlzIEEKLQkJaWYgKGN1cnNvck5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJQ1NTTm9kZSBwYXJlbnQgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAocGFyZW50ID09IGN1cnNvck5vZGUpIHsKLQkJCQkJZlRhcmdldE5vZGUgPSBjdXJzb3JOb2RlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vICAgICB2PC0tfAotCQkvLyAgIEFBQQotCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QiAsIG5vZGU6QSAtPiBkZXBlbmQgb24gQSdzIG5vZGUgdHlwZQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQlmVGFyZ2V0Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlmVGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCQl9Ci0JCQkvLwkJCWZUYXJnZXROb2RlID0gKGJPdmVyU2VtaUNvbG9uKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZTsKLQkJfSBlbHNlIGlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCWZUYXJnZXROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFyZ2V0UG9zKCkgewotCQlpZiAoZkN1cnNvclBvcyA9PSAwIHx8IGlzU3BlY2lhbERlbGltaXRlclJlZ2lvbihmQ3Vyc29yUG9zIC0gMSkpIHsKLQkJCWZUYXJnZXRQb3MgPSBmQ3Vyc29yUG9zOwotCQl9IGVsc2UgewotCQkJZlRhcmdldFBvcyA9IGZDdXJzb3JQb3MgLSAxOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFyZ2V0VGV4dCgpIHsKLQkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBnZXRUYXJnZXREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwpIHsKLQkJCWZSZXBsYWNlQmVnaW4gPSBmQ3Vyc29yUG9zOwotCQkJZlRleHRUb1JlcGxhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlRleHRUb0NvbXBhcmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nIHJlZ2lvblRleHQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHRhcmdldFJlZ2lvbik7Ci0JCQlpbnQgcmVnaW9uU3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0YXJnZXRSZWdpb24pOwotCQkJaWYgKHJlZ2lvblN0YXJ0ID09IGZDdXJzb3JQb3MgfHwgcmVnaW9uVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCByZWdpb25TdGFydCArIHJlZ2lvblRleHQubGVuZ3RoKCkgLSAxIDwgZlRhcmdldFBvcykgewotCQkJCS8vIHRvIGluc2VydGlvbgotCQkJCWZSZXBsYWNlQmVnaW4gPSBmQ3Vyc29yUG9zOwotCQkJCWZUZXh0VG9SZXBsYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlmVGV4dFRvQ29tcGFyZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCS8vIHRvIHJlcGxhY2UKLQkJCQlmUmVwbGFjZUJlZ2luID0gcmVnaW9uU3RhcnQ7Ci0JCQkJZlRleHRUb1JlcGxhY2UgPSByZWdpb25UZXh0OwotCQkJCWZUZXh0VG9Db21wYXJlID0gcmVnaW9uVGV4dC5zdWJzdHJpbmcoMCwgZkN1cnNvclBvcyAtIGZSZXBsYWNlQmVnaW4pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NwZWNpYWxEZWxpbWl0ZXJSZWdpb24oaW50IHBvcykgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25CeU9mZnNldChwb3MpOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUik7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCWJvb2xlYW4gaXNUYXJnZXRQb3NBZnRlck9mKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldE5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA8IDAgfHwgKChJbmRleGVkUmVnaW9uKSBmVGFyZ2V0Tm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJUmVnaW9uSXRlcmF0b3IgaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBzdGFydCk7Ci0JCXdoaWxlIChpUmVnaW9uLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaVJlZ2lvbi5uZXh0KCk7Ci0JCQlpZiAoZlRhcmdldFBvcyA8IGlSZWdpb24uZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSByZWdpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCWJvb2xlYW4gaXNUYXJnZXRQb3NCZWZvcmVPZihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlyZXR1cm4gIWlzVGFyZ2V0UG9zQWZ0ZXJPZihyZWdpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCWJvb2xlYW4gdGFyZ2V0Rm9sbG93cyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlSZWdpb25JdGVyYXRvciBpUmVnaW9uOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA8PSBmVGFyZ2V0UG9zKSB7Ci0JCQlpUmVnaW9uID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJfSBlbHNlIHsKLQkJCWlSZWdpb24gPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgZlRhcmdldFBvcyk7Ci0JCQl0cnkgewotCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmU3RydWN0dXJlZERvY3VtZW50LmdldENoYXIoZlRhcmdldFBvcykpICYmIGlSZWdpb24uaGFzUHJldigpKSB7Ci0JCQkJCXJlZ2lvbiA9IGlSZWdpb24ucHJldigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlpUmVnaW9uID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoaVJlZ2lvbi5oYXNQcmV2KCkpIHsKLQkJCXJlZ2lvbiA9IGlSZWdpb24ucHJldigpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSByZWdpb25UeXBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIHRhcmdldEhhcyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGZUYXJnZXROb2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBmVGFyZ2V0Tm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA8IDAgfHwgZW5kIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlSZWdpb25JdGVyYXRvciBpUmVnaW9uID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0KTsKLQkJd2hpbGUgKGlSZWdpb24uaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpUmVnaW9uLm5leHQoKTsKLQkJCWlmIChlbmQgPD0gaVJlZ2lvbi5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSByZWdpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCVJlZ2lvbkl0ZXJhdG9yIGdldFJlZ2lvbkl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBnZXRUYXJnZXRQb3MoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUNTU01ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7Ci0JCUNTU01ldGFNb2RlbEZpbmRlciBmaW5kZXIgPSBDU1NNZXRhTW9kZWxGaW5kZXIuZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIGZpbmRlci5maW5kTWV0YU1vZGVsRm9yKGdldE1vZGVsKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2E3YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLlN0eWxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudEFzc2lzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCi0JcHJpdmF0ZSBpbnQgZkRvY3VtZW50T2Zmc2V0ID0gMDsKLQlwcml2YXRlIGNoYXIgZlF1b3RlID0gMDsKLQlwcml2YXRlIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBmVGVtcGxhdGVQcm9jZXNzb3IgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwcm9wb3NlZCBjb2RlIGNvbXBsZXRpb25zIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0LWVkaXRvciBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvZGUtYXNzaXN0IGl0ZW1zCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uICsgZkRvY3VtZW50T2Zmc2V0KTsKLQkJSURPTU5vZGUgeE5vZGUgPSBudWxsOwotCQlJRE9NTm9kZSBwYXJlbnQgPSBudWxsOwotCQlDU1NQcm9wb3NhbEFycmFuZ2VyIGFycmFuZ2VyID0gbnVsbDsKLQkJYm9vbGVhbiBpc0VtcHR5RG9jdW1lbnQgPSBmYWxzZTsKLQotCQkvLyBiYWlsIGlmIHdlIGNvdWxkbid0IGdldCBhbiBpbmRleGVkIG5vZGUKLQkJLy8gaWYoaW5kZXhlZE5vZGUgPT0gbnVsbCkgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCQlpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJeE5vZGUgPSAoSURPTU5vZGUpIGluZGV4ZWROb2RlOwotCQkJcGFyZW50ID0gKElET01Ob2RlKSB4Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJLy8gbmVlZCB0byBnZXQgaW4gaGVyZSBpZiB0aGVyZSBpbiB0aGUgbm8gMCByZWdpb24gPHN0eWxlPnw8L3N0eWxlPgotCQkvLyBjYXNlCi0JCWlmICgoeE5vZGUgIT0gbnVsbCkgJiYgeE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpIHsKLQkJCS8vIG5vdyB3ZSBrbm93IHRoZSBjdXJzb3IgaXMgaW4gYSA8c3R5bGU+IHRhZyB3L291dCByZWdpb24KLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBnZXRDU1NNb2RlbCh4Tm9kZSk7Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGFkanVzdCBvZmZzZXRzIGZvciBlbWJlZGRlZCBzdHlsZQotCQkJCWludCBvZmZzZXQgPSBkb2N1bWVudFBvc2l0aW9uOwotCQkJCWludCBwb3MgPSAwOwotCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHBvcyk7Ci0JCQkJaWYgKGtleUluZGV4ZWROb2RlID09IG51bGwpIHsKLQkJCQkJa2V5SW5kZXhlZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChJQ1NTTW9kZWwpIGNzc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCX0KLQkJCQlhcnJhbmdlciA9IG5ldyBDU1NQcm9wb3NhbEFycmFuZ2VyKHBvcywgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgb2Zmc2V0LCAoY2hhcikgMCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHBhcmVudCAhPSBudWxsKSAmJiBwYXJlbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpIHsKLQkJCS8vIG5vdyB3ZSBrbm93IHRoZSBjdXJzb3IgaXMgaW4gYSA8c3R5bGU+IHRhZyB3aXRoIGEgcmVnaW9uCi0JCQkvLyB1c2UgdGhlIHBhcmVudCBiZWNhdXNlIHRoYXQgd2lsbCBiZSB0aGUgPHN0eWxlPiB0YWcKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBnZXRDU1NNb2RlbChwYXJlbnQpOwotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGp1c3Qgb2Zmc2V0cyBmb3IgZW1iZWRkZWQgc3R5bGUKLQkJCQlpbnQgb2Zmc2V0ID0gaW5kZXhlZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIG9mZnNldDsKLQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihwb3MpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihwb3MsIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIG9mZnNldCwgKGNoYXIpIDApOwotCQkJfQotCQl9IGVsc2UgaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCS8vIGdldCBtb2RlbCBmb3Igbm9kZSB3LyBzdHlsZSBhdHRyaWJ1dGUKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBnZXRDU1NNb2RlbCgoSURPTU5vZGUpIGluZGV4ZWROb2RlKTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiAtIGZEb2N1bWVudE9mZnNldCk7Ci0JCQkJaWYgKGtleUluZGV4ZWROb2RlID09IG51bGwpIHsKLQkJCQkJa2V5SW5kZXhlZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChJQ1NTTW9kZWwpIGNzc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCX0KLQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQkvLyBpbmxpbmUgc3R5bGUgZm9yIGEgdGFnLCBub3QgZW1iZWRkZWQKLQkJCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihkb2N1bWVudFBvc2l0aW9uLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBmRG9jdW1lbnRPZmZzZXQsIGZRdW90ZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCS8vIHdoZW4gZWRpdGluZyBleHRlcm5hbCBDU1MgdXNpbmcgQ1NTIERlc2lnbmVyLCBJQ1NTTm9kZSBpcwotCQkJLy8gcGFzc2VkLgotCQkJSUNTU0RvY3VtZW50IGNzc2RvYyA9ICgoSUNTU05vZGUpIGluZGV4ZWROb2RlKS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoY3NzZG9jICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gY3NzZG9jLmdldE1vZGVsKCk7Ci0JCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiAtIGZEb2N1bWVudE9mZnNldCk7Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJCS8vIGlubGluZSBzdHlsZSBmb3IgYSB0YWcsIG5vdCBlbWJlZGRlZAotCQkJCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihkb2N1bWVudFBvc2l0aW9uLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBmRG9jdW1lbnRPZmZzZXQsIGZRdW90ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKGluZGV4ZWROb2RlID09IG51bGwpICYmIGlzVmlld2VyRW1wdHkodmlld2VyKSkgewotCQkJaXNFbXB0eURvY3VtZW50ID0gdHJ1ZTsKLQkJCS8vIHRoZSB0b3Agb2YgZW1wdHkgQ1NTIERvY3VtZW50Ci0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY3NzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCQlpZiAoY3NzTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiAtIGZEb2N1bWVudE9mZnNldCk7Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJCS8vIGlubGluZSBzdHlsZSBmb3IgYSB0YWcsIG5vdCBlbWJlZGRlZAotCQkJCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihkb2N1bWVudFBvc2l0aW9uLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBmRG9jdW1lbnRPZmZzZXQsIGZRdW90ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKQotCQkJCQljc3NNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYgKGFycmFuZ2VyICE9IG51bGwpIHsKLQkJCWZEb2N1bWVudE9mZnNldCA9IDA7Ci0JCQlwcm9wb3NhbHMgPSBhcnJhbmdlci5nZXRQcm9wb3NhbHMoKTsKLQotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld2ZpbGVwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBhbnlwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCS8vIGFkZCB0ZW1wbGF0ZSBwcm9wb3NhbHMKLQkJCWlmIChnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzRW1wdHlEb2N1bWVudCkgewotCQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCQkJCW5ld2ZpbGVwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLkFMTCk7Ci0JCQkJYW55cHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCX0KLQotCQkJLy8gYWRkIGVuZCB0YWcgaWYgcGFyZW50IGlzIG5vdCBjbG9zZWQKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgZW5kVGFnID0gWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5jb21wdXRlWE1MRW5kVGFnUHJvcG9zYWwodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uLCBpbmRleGVkTm9kZSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1RBR19HRU5FUklDKTsgCi0KLQkJCS8vIGFkZCB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbHMKLQkJCWludCBhZGRpdGlvbmFsTGVuZ3RoID0gbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGggKyBhbnlwcm9wb3NhbHMubGVuZ3RoOwotCQkJYWRkaXRpb25hbExlbmd0aCA9IChlbmRUYWcgIT0gbnVsbCkgPyArK2FkZGl0aW9uYWxMZW5ndGggOiBhZGRpdGlvbmFsTGVuZ3RoOwotCQkJaWYgKGFkZGl0aW9uYWxMZW5ndGggPiAwKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHBsdXNPbmVzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLmxlbmd0aCArIGFkZGl0aW9uYWxMZW5ndGhdOwotCQkJCWludCBhcHBlbmRQb3MgPSBwcm9wb3NhbHMubGVuZ3RoOwotCQkJCS8vIGFkZCBlbmQgdGFnIHByb3Bvc2FsCi0JCQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvcG9zYWxzLCAwLCBwbHVzT25lcywgMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0JCQkJCXBsdXNPbmVzWzBdID0gZW5kVGFnOwotCQkJCQkrK2FwcGVuZFBvczsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb3Bvc2FscywgMCwgcGx1c09uZXMsIDAsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQkJCX0KLQkJCQkvLyBhZGQgaXRlbXMgaW4gbmV3ZmlsZXByb3Bvc2FscwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IG5ld2ZpbGVwcm9wb3NhbHNbaV07Ci0JCQkJfQotCQkJCS8vIGFkZCBpdGVtcyBpbiBhbnlwcm9wb3NhbHMKLQkJCQlhcHBlbmRQb3MgPSBhcHBlbmRQb3MgKyBuZXdmaWxlcHJvcG9zYWxzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFueXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IGFueXByb3Bvc2Fsc1tpXTsKLQkJCQl9Ci0JCQkJcHJvcG9zYWxzID0gcGx1c09uZXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gdGV4dCBvciBpdCdzIGFsbCB3aGl0ZSBzcGFjZSwgb3RoZXJ3aXNlCi0JICogcmV0dXJucyBmYWxzZQotCSAqIAotCSAqIEBwYXJhbSB0cmVlTm9kZQotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld2VyRW1wdHkoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlib29sZWFuIGlzRW1wdHkgPSBmYWxzZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCWlmICgodGV4dCA9PSBudWxsKSB8fCAoKHRleHQgIT0gbnVsbCkgJiYgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCWlzRW1wdHkgPSB0cnVlOwotCQlyZXR1cm4gaXNFbXB0eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ1NTTW9kZWwgZm9yIGFuIGluZGV4ZWQgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBpbmRleGVkTm9kZQotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDU1NNb2RlbChJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlKSB7Ci0JLy8gaWYgKGluZGV4ZWROb2RlID09IG51bGwpIHJldHVybiBudWxsOwotCS8vIE5vZGUgbm9kZSA9IChOb2RlKWluZGV4ZWROb2RlOwotCS8vIElOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcilub2RlLmdldFBhcmVudE5vZGUoKTsKLQkvLyBpZiAobm90aWZpZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPQotCS8vIFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChub3RpZmllcik7Ci0JLy8gaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBDU1NNb2RlbEFkYXB0ZXIpKSByZXR1cm4KLQkvLyBudWxsOwotCS8vIENTU01vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSAoQ1NTTW9kZWxBZGFwdGVyKWFkYXB0ZXI7Ci0JLy8gcmV0dXJuIG1vZGVsQWRhcHRlci5nZXRNb2RlbCgpOwotCS8vIH0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDU1Ntb2RlbCBmb3IgYSBnaXZlbiBYTUwgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDU1NNb2RlbChJRE9NTm9kZSBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbWVudCk7Ci0JCWlmICgoYWRhcHRlciA9PSBudWxsKSB8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTTW9kZWxBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gbW9kZWxBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBjb250ZXh0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHBvc3NpYmxlCi0JICogICAgICAgICAgICBjb250ZXh0cwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29udGV4dCBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIG5vIGNvbnRleHQgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIGNvbXBsZXRpb24gcHJvcG9zYWwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIHByZXNlbnRpbmcgY29udGV4dAotCSAqICAgICAgICAgaW5mb3JtYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzCi0JICogICAgICAgICBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wNS8yMgotCSAqIDEwOjM3OjA1KQotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJZkRvY3VtZW50T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZQotCSAqICAgICAgICAgICAgY2hhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlQ2hhck9mU3R5bGVBdHRyaWJ1dGUoY2hhciBxdW90ZSkgewotCQlmUXVvdGUgPSBxdW90ZTsKLQl9Ci0KLQlwcml2YXRlIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsQXJyYW5nZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsQXJyYW5nZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5ZmE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEFycmFuZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsQXJyYW5nZXIgewotCi0JcHJpdmF0ZSBMaXN0IGZQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBDU1NDb250ZW50QXNzaXN0Q29udGV4dCBmQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEFycmFuZ2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9wb3NhbEFycmFuZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsQXJyYW5nZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NQcm9wb3NhbEFycmFuZ2VyKGludCBkb2N1bWVudFBvc2l0aW9uLCBJQ1NTTm9kZSBub2RlLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGNoYXIgcXVvdGUpIHsKLQkJc3VwZXIoKTsKLQkJZkNvbnRleHQgPSBuZXcgQ1NTQ29udGVudEFzc2lzdENvbnRleHQoZG9jdW1lbnRQb3NpdGlvbiwgbm9kZSwgZG9jdW1lbnRPZmZzZXQsIHF1b3RlKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBidWlsZFByb3Bvc2FscygpIHsKLQkJZlByb3Bvc2Fscy5jbGVhcigpOwotCi0JCS8qCi0JCSAqIFN0cmluZyB0ZXh0OyBJQ29tcGxldGlvblByb3Bvc2FsIGl0ZW07IHRleHQgPSAiLS0tLSBUZXN0Ci0JCSAqIEluZm9ybWF0aW9uIC0tLS0iOyBpdGVtID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwKLQkJICogZkNvbnRleHQuZ2V0UmVwbGFjZUJlZ2luKCksIDAsIDAsIG51bGwsIHRleHQsIG51bGwsIG51bGwpOwotCQkgKiBmUHJvcG9zYWxzLmFkZChpdGVtKTsKLQkJICogCi0JCSAqIHRleHQgPSAiVGFyZ2V0OiBcIiIgKyBmQ29udGV4dC5nZXRSZWdpb25UZXh0KCkgKyAiXCIiOwotCQkgKiAKLQkJICogaXRlbSA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLAotCQkgKiBudWxsLCB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqIAotCQkgKiB0ZXh0ID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpLmdldENsYXNzKCkudG9TdHJpbmcoKTsgaW50Ci0JCSAqIGxhc3RQZXJpb2RQb3MgPSB0ZXh0Lmxhc3RJbmRleE9mKCcuJyk7IHRleHQgPSAiTm9kZTogIiArCi0JCSAqIHRleHQuc3Vic3RyaW5nKGxhc3RQZXJpb2RQb3MgKyAxKTsgaXRlbSA9IG5ldwotCQkgKiBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLCBudWxsLAotCQkgKiB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqLwotCi0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCS8vaW50IHRhcmdldFBvcyA9IGZDb250ZXh0LmdldFRhcmdldFBvcygpOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckFueVJ1bGUoKTsKLQkJfSBlbHNlIGlmICgodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NBZnRlck9mKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB8fCAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yQW55UnVsZSgpOwotCQkJLy8JCWJ1aWxkUHJvcG9zYWxzRm9yU3R5bGVSdWxlKCk7Ci0JCX0gZWxzZSBpZiAoKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpOwotCQl9IGVsc2UgaWYgKCh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8IHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSAmJiAodGFyZ2V0Tm9kZS5nZXRPd25lckRvY3VtZW50KCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCBmQ29udGV4dC50YXJnZXRGb2xsb3dzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IGZDb250ZXh0LnRhcmdldEZvbGxvd3MoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpKSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaWYgKGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSkgewotCQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQl9Ci0JCS8qCi0JCSAqIGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUgfHwgKCh0YXJnZXROb2RlCi0JCSAqIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8Ci0JCSAqIHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YKLQkJICogSUNTU1N0eWxlRGVjbEl0ZW0pICYmCi0JCSAqIGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DT0xPTikpKSB7Ci0JCSAqIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOyB9Ci0JCSAqLwotCi0JCS8vIGZvciBUZXN0Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JBbnlSdWxlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25OYW1lKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZShmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JEZWNsYXJhdGlvblZhbHVlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpIHsKLQkJQ1NTUHJvcG9zYWxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvcihmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JTdHlsZVJ1bGUoKSB7Ci0JCUNTU1Byb3Bvc2FsR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyhmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscygpIHsKLQkJYnVpbGRQcm9wb3NhbHMoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FsQXJyYXkgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW2ZQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaUl0ZW0gPSBmUHJvcG9zYWxzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpSXRlbS5oYXNOZXh0KCk7IGkrKykgewotCQkJcHJvcG9zYWxBcnJheVtpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBpSXRlbS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsQXJyYXk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDRiNTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWFic3RyYWN0IGNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FuZE9mZnNldCB7Ci0JCVN0cmluZ0FuZE9mZnNldChTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCQl0aGlzLmZTdHJpbmcgPSBzdHJpbmc7Ci0JCQl0aGlzLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCX0KLQotCQlTdHJpbmcgZlN0cmluZzsKLQkJaW50IGZPZmZzZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGZDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9wb3NhbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NQcm9wb3NhbEdlbmVyYXRvcihDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMZWFkaW5nQ29sb24oKSB7Ci0JCWJvb2xlYW4gaGFzTGVhZGluZ0NvbG9uID0gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwgJiYgMCA8IGZDb250ZXh0LmdldEN1cnNvclBvcygpKSB7Ci0JCQl0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRSZWdpb25CeU9mZnNldChmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSAtIDEpOwotCQkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsICYmIHRhcmdldFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykgewotCQkJCWhhc0xlYWRpbmdDb2xvbiA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGFyZ2V0UmVnaW9uICE9IG51bGwpIHsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRleHQuZ2V0UmVnaW9uSXRlcmF0b3IoKTsKLQkJCWlmIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCQlpdGVyYXRvci5wcmV2KCk7Ci0JCQkJaWYgKGl0ZXJhdG9yLmhhc1ByZXYoKSAmJiBpdGVyYXRvci5wcmV2KCkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCQkJaGFzTGVhZGluZ0NvbG9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhc0xlYWRpbmdDb2xvbjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZUJyYWNlcygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBmQ29udGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGluZGVudFN0ciA9IGdldEluZGVudFN0cmluZygpOwotCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSkpIHsKLQkJCWJ1Zi5hcHBlbmQobGluZURlbGltaXRlcik7Ci0JCX0KLQkJYnVmLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKSB7Ci0JCQlidWYuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQkJYnVmLmFwcGVuZChpbmRlbnRTdHIpOwotCQl9IGVsc2UgewotCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbnQgb2Zmc2V0ID0gYnVmLmxlbmd0aCgpOwotCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpIHsKLQkJCWJ1Zi5hcHBlbmQobGluZURlbGltaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1Zi5hcHBlbmQoIn0iKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQW5kT2Zmc2V0IGdlbmVyYXRlUGFyZW50aGVzaXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBvZmZzZXQ7Ci0JCWJ1Zi5hcHBlbmQoIigiKTsvLyROT04tTkxTLTEkCi0JCW9mZnNldCA9IDE7Ci0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQW5kT2Zmc2V0IGdlbmVyYXRlUXVvdGVzKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyIHF1b3RlQ2hhciA9IGdldFF1b3RlQ2hhcigpOwotCQlidWYuYXBwZW5kKHF1b3RlQ2hhcik7Ci0JCWJ1Zi5hcHBlbmQocXVvdGVDaGFyKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdBbmRPZmZzZXQoYnVmLnRvU3RyaW5nKCksIDEpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQW5kT2Zmc2V0IGdlbmVyYXRlU2VtaWNvbG9uKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgb2Zmc2V0OwotCQlidWYuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQlvZmZzZXQgPSAwOwotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVVSSSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWJvb2xlYW4gaXNRdW90ZUluVVJJID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSk7Ci0JCWNoYXIgcXVvdGVDaGFyID0gZ2V0UXVvdGVDaGFyKCk7Ci0JCWJ1Zi5hcHBlbmQoInVybCgiKTsvLyROT04tTkxTLTEkCi0JCWlmIChpc1F1b3RlSW5VUkkpIHsKLQkJCWJ1Zi5hcHBlbmQocXVvdGVDaGFyKTsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gYnVmLmxlbmd0aCgpOwotCQlpZiAoaXNRdW90ZUluVVJJKSB7Ci0JCQlidWYuYXBwZW5kKHF1b3RlQ2hhcik7Ci0JCX0KLQkJYnVmLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBTdHJpbmdBbmRPZmZzZXQoYnVmLnRvU3RyaW5nKCksIG9mZnNldCk7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKTsKLQotCUxpc3QgZ2V0UHJvcG9zYWxzKCkgewotCQlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlDU1NJbWFnZUhlbHBlciBpbWFnZUhlbHBlciA9IENTU0ltYWdlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRDYW5kaWRhdGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgY2FuZGlkYXRlID0gKENTU0NBQ2FuZGlkYXRlKSBpLm5leHQoKTsKLQkJCUltYWdlIGltYWdlID0gaW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoY2FuZGlkYXRlLmdldEltYWdlVHlwZSgpKTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgaXRlbSA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoY2FuZGlkYXRlLmdldFJlcGxhY2VtZW50U3RyaW5nKCksIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpICsgZkNvbnRleHQuZ2V0RG9jdW1lbnRPZmZzZXQoKSwgZkNvbnRleHQuZ2V0VGV4dFRvUmVwbGFjZSgpLmxlbmd0aCgpLCBjYW5kaWRhdGUuZ2V0Q3Vyc29yUG9zaXRpb24oKSwgaW1hZ2UsIGNhbmRpZGF0ZS5nZXREaXNwbGF5U3RyaW5nKCksIG51bGwsIG51bGwpOwotCQkJcHJvcG9zYWxzLmFkZChpdGVtKTsKLQkJfQotCi0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBjaGFyCi0JICovCi0JcHJpdmF0ZSBjaGFyIGdldFF1b3RlQ2hhcigpIHsKLQotCQlTdHJpbmcgcXVvdGVTdHIgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCWNoYXIgcXVvdGVDaGFyID0gKHF1b3RlU3RyICE9IG51bGwgJiYgMCA8IHF1b3RlU3RyLmxlbmd0aCgpKSA/IHF1b3RlU3RyLmNoYXJBdCgwKSA6ICciJzsKLQkJY2hhciBhdHRyUXVvdGUgPSBmQ29udGV4dC5nZXRRdW90ZU9mU3R5bGVBdHRyaWJ1dGUoKTsKLQkJaWYgKGF0dHJRdW90ZSAhPSAwKSB7Ci0JCQlpZiAoYXR0clF1b3RlID09ICciJyAmJiBxdW90ZUNoYXIgPT0gJyInKSB7Ci0JCQkJcXVvdGVDaGFyID0gJ1wnJzsKLQkJCX0gZWxzZSBpZiAoYXR0clF1b3RlID09ICdcJycgJiYgcXVvdGVDaGFyID09ICdcJycpIHsKLQkJCQlxdW90ZUNoYXIgPSAnIic7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHF1b3RlQ2hhcjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgdGV4dFRvQ29tcGFyZSA9IGZDb250ZXh0LmdldFRleHRUb0NvbXBhcmUoKTsKLQkJaWYgKHRleHRUb0NvbXBhcmUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKHRleHQudG9VcHBlckNhc2UoKS5pbmRleE9mKHRleHRUb0NvbXBhcmUudG9VcHBlckNhc2UoKSkgPT0gMCk7Ci0JCX0KLQkJLyoKLQkJICogU3RyaW5nIHRleHRUb1JlcGxhY2UgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7IGlmCi0JCSAqICh0ZXh0VG9SZXBsYWNlLmxlbmd0aCgpID09IDApIHsgcmV0dXJuIHRydWU7IH0gZWxzZSB7IHJldHVybgotCQkgKiAodGV4dC50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGV4dFRvUmVwbGFjZS50b1VwcGVyQ2FzZSgpKSA9PSAwKTsgfQotCQkgKi8KLQl9Ci0JCi0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2Yzg5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlNlbGVjdGlvbkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlIGV4dGVuZHMgQ1NTUHJvcG9zYWxHZW5lcmF0b3IgewotCi0JcHJpdmF0ZSBib29sZWFuIGZVc2VVcHBlckNhc2UgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVCA9ICJAY2hhcnNldCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX0ZBQ0UgPSAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlQgPSAiQGltcG9ydCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQSA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRSA9ICJAcGFnZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ1NTQXRtYXJrUnVsZVByb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0JCWZVc2VVcHBlckNhc2UgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVDaGFyc2V0UnVsZSgpIHsKLQkJLy8gY2hlY2sgY29udGVudCBtb2RlbAotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfQ0hBUlNFVF9SVUxFKS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgZW1iZWRkZWQgb3Igbm90Ci0JCWlmIChmQ29udGV4dC5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIGNhcmV0IHByZWNlZGUgYWxsIG90aGVyIHJ1bGVzLgotCQlpbnQgb2Zmc2V0ID0gZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCk7Ci0JCWlmICgwIDwgb2Zmc2V0KSB7Ci0JCQlTZWxlY3Rpb25Db2xsZWN0b3IgdHJhdiA9IG5ldyBTZWxlY3Rpb25Db2xsZWN0b3IoKTsKLQkJCXRyYXYuc2V0UmVnaW9uKDAsIG9mZnNldCAtIDEpOwotCQkJdHJhdi5hcHBseShmQ29udGV4dC5nZXRNb2RlbCgpLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaSA9IHRyYXYuZ2V0U2VsZWN0ZWROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NOb2RlICYmICEob2JqIGluc3RhbmNlb2YgSUNTU0RvY3VtZW50KSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gQ0hBUlNFVC50b1VwcGVyQ2FzZSgpIDogQ0hBUlNFVC50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGlkZW50KTsKLQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJY3Vyc29yUG9zID0gYnVmLmxlbmd0aCgpOwotCQlTdHJpbmdBbmRPZmZzZXQgc2FvOwotCQlzYW8gPSBnZW5lcmF0ZVF1b3RlcygpOwotCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJY3Vyc29yUG9zICs9IHNhby5mT2Zmc2V0OwotCQlzYW8gPSBnZW5lcmF0ZVNlbWljb2xvbigpOwotCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQotCQlTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JCWlmIChpc01hdGNoKHRleHQpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHRleHQpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKGlkZW50KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5SVUxFX0NIQVJTRVQpOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NBQ2FuZGlkYXRlIGdldENhbmRpZGF0ZUZvbnRGYWNlUnVsZSgpIHsKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlpZiAoIXV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX0ZPTlRfRkFDRV9SVUxFKS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZyBpZGVudCA9IChmVXNlVXBwZXJDYXNlKSA/IEZPTlRfRkFDRS50b1VwcGVyQ2FzZSgpIDogRk9OVF9GQUNFLnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfRk9OVEZBQ0UpOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NBQ2FuZGlkYXRlIGdldENhbmRpZGF0ZUltcG9ydFJ1bGUoKSB7Ci0JCS8vIGNoZWNrIGNvbnRlbnQgbW9kZWwKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlpZiAoIXV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX0lNUE9SVF9SVUxFKS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gY2hhcnNldCBhbmQgaW1wb3J0IGNhbiBwcmVjZWRlIGltcG9ydCBydWxlLgotCQlpbnQgb2Zmc2V0ID0gZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCk7Ci0JCWlmICgwIDwgb2Zmc2V0KSB7Ci0JCQlTZWxlY3Rpb25Db2xsZWN0b3IgdHJhdiA9IG5ldyBTZWxlY3Rpb25Db2xsZWN0b3IoKTsKLQkJCXRyYXYuc2V0UmVnaW9uKDAsIG9mZnNldCAtIDEpOwotCQkJdHJhdi5hcHBseShmQ29udGV4dC5nZXRNb2RlbCgpLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaSA9IHRyYXYuZ2V0U2VsZWN0ZWROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NOb2RlICYmICEob2JqIGluc3RhbmNlb2YgSUNTU0RvY3VtZW50IHx8IG9iaiBpbnN0YW5jZW9mIElDU1NDaGFyc2V0UnVsZSB8fCBvYmogaW5zdGFuY2VvZiBJQ1NTSW1wb3J0UnVsZSkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZyBpZGVudCA9IChmVXNlVXBwZXJDYXNlKSA/IElNUE9SVC50b1VwcGVyQ2FzZSgpIDogSU1QT1JULnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlVVJJKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCXNhbyA9IGdlbmVyYXRlU2VtaWNvbG9uKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKGlkZW50KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5SVUxFX0lNUE9SVCk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlTWVkaWFSdWxlKCkgewotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfTUVESUFfUlVMRSkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBNRURJQS50b1VwcGVyQ2FzZSgpIDogTUVESUEudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCkgLSAxOwotCQlTdHJpbmdBbmRPZmZzZXQgc2FvOwotCQlzYW8gPSBnZW5lcmF0ZUJyYWNlcygpOwotCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQotCQlTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JCWlmIChpc01hdGNoKHRleHQpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhpZGVudCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuUlVMRV9NRURJQSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlUGFnZVJ1bGUoKSB7Ci0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9QQUdFX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gUEFHRS50b1VwcGVyQ2FzZSgpIDogUEFHRS50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGlkZW50KTsKLQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJY3Vyc29yUG9zID0gYnVmLmxlbmd0aCgpOwotCQlTdHJpbmdBbmRPZmZzZXQgc2FvOwotCQlzYW8gPSBnZW5lcmF0ZUJyYWNlcygpOwotCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJY3Vyc29yUG9zICs9IHNhby5mT2Zmc2V0OwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKGlkZW50KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5SVUxFX1BBR0UpOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldENhbmRpZGF0ZXMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKSB7Ci0JCUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb25QcmV2aW91cygpOwotCQkvLwlJVGV4dFJlZ2lvbiByZWdpb24gPSBmQ29udGV4dC5nZXRTaWduaWZpY2FudFRhcmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSB7Ci0JCQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfQotCi0JCUNTU0NBQ2FuZGlkYXRlIGl0ZW07Ci0JCWlmICgoaXRlbSA9IGdldENhbmRpZGF0ZUltcG9ydFJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlQ2hhcnNldFJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlTWVkaWFSdWxlKCkpICE9IG51bGwpIHsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JCWlmICgoaXRlbSA9IGdldENhbmRpZGF0ZVBhZ2VSdWxlKCkpICE9IG51bGwpIHsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JCWlmICgoaXRlbSA9IGdldENhbmRpZGF0ZUZvbnRGYWNlUnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmNDBiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLQotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHByZURlbGltID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7IGkrKykgewotCQkJcHJlRGVsaW0gKz0gJyAnOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgcG9zdERlbGltID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOyBpKyspIHsKLQkJCXBvc3REZWxpbSArPSAnICc7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJYm9vbGVhbiBiRm9udFJ1bGUgPSBmYWxzZTsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gdGFyZ2V0Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZSkgewotCQkJCWJGb250UnVsZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCUl0ZXJhdG9yIGlOYW1lcyA9IHV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKChiRm9udFJ1bGUpID8gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUiA6IENTU01NTm9kZS5UWVBFX1BST1BFUlRZKTsKLQkJd2hpbGUgKGlOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaU5hbWVzLm5leHQoKTsKLQkJCW5hbWVzLmFkZChub2RlKTsKLQkJfQotCQlzb3J0TmFtZXMobmFtZXMpOwotCQkvLyBDb2xsZWN0aW9ucy5zb3J0KG5hbWVzKTsKLQotCQlib29sZWFuIGJBZGRDb2xvbiA9IHRydWU7Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0gJiYgZkNvbnRleHQudGFyZ2V0SGFzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpKSB7Ci0JCQliQWRkQ29sb24gPSBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJdGV4dCA9IChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKCFpc01hdGNoKHRleHQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWludCBjdXJzb3JQb3MgPSAwOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1Zi5hcHBlbmQodGV4dCk7Ci0JCQlidWYuYXBwZW5kKHByZURlbGltKTsKLQkJCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJCWlmIChiQWRkQ29sb24pIHsKLQkJCQlidWYuYXBwZW5kKCc6Jyk7Ly8kTk9OLU5MUy0xJAotCQkJCWJ1Zi5hcHBlbmQocG9zdERlbGltKTsKLQkJCQljdXJzb3JQb3MgKz0gMSArIHBvc3REZWxpbS5sZW5ndGgoKTsKLQkJCX0KLQkJCS8vIGlmICghICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pKSB7Ci0JCQkvLyBidWYuYXBwZW5kKCc7Jyk7Ly8kTk9OLU5MUy0xJAotCQkJLy8gfQotCi0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKGdldENhdGVnb3J5SW1hZ2VUeXBlKG5vZGUpKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIHNvcnROYW1lcyhMaXN0IG5hbWVzKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUxID0gKENTU01NTm9kZSkgbzE7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUyID0gKENTU01NTm9kZSkgbzI7Ci0JCQkJaWYgKG5vZGUxID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIGlmIChub2RlMiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaW50IGRpZmYgPSAwOwotCQkJCVN0cmluZyBjYXRlZ29yeTEgPSBub2RlMS5nZXRBdHRyaWJ1dGUoImNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgY2F0ZWdvcnkyID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGNhdGVnb3J5MSA9PSBudWxsKSB7Ci0JCQkJCWlmIChjYXRlZ29yeTIgPT0gbnVsbCkgewotCQkJCQkJZGlmZiA9IDA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoY2F0ZWdvcnkyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpZmYgPSBjYXRlZ29yeTEuY29tcGFyZVRvKGNhdGVnb3J5Mik7Ci0JCQkJfQotCQkJCWlmIChkaWZmID09IDApIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBub2RlMS5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5hbWUuY29tcGFyZVRvKG5vZGUyLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogcmV0cmlldmUgZGVmYXVsdCBjYXRlZ29yeSBpY29uIG5hbWUgVE9ETzogaWYgbm9kZSBoYXMgImljb24iKD8pLCB1c2UKLQkgKiBpdC4KLQkgKi8KLQlDU1NJbWFnZVR5cGUgZ2V0Q2F0ZWdvcnlJbWFnZVR5cGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJQ1NTSW1hZ2VUeXBlIGltYWdlVHlwZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjYXRlZ29yeSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCWltYWdlVHlwZSA9IENTU0ltYWdlVHlwZS5nZXRJbWFnZVR5cGUoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0RFRkFVTFQgOiBpbWFnZVR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZjAyNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTnVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTRnVuY3Rpb25JRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZSBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRBTlQgPSAiIWltcG9ydGFudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gZlVzZVVwcGVyQ2FzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkFwcGVuZFNlbWlDb2xvbjsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZShDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCQlmVXNlVXBwZXJDYXNlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRnVuY3Rpb24oTGlzdCBjYW5kaWRhdGVzLCBDU1NNTUZ1bmN0aW9uIHByb3ApIHsKLQkJU3RyaW5nIHRleHQgPSBwcm9wLnRvU3RyaW5nKCk7Ci0JCWlmICghaXNNYXRjaCh0ZXh0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChwcm9wLmdldE5hbWUoKS5lcXVhbHMoQ1NTRnVuY3Rpb25JRC5GX1VSSSkpIHsKLQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZVVSSSgpOwotCQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCQljdXJzb3JQb3MgPSBzYW8uZk9mZnNldDsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQocHJvcC50b1N0cmluZygpKTsKLQkJCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZVBhcmVudGhlc2lzKCk7Ci0JCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJfQotCi0JCXRleHQgPSBidWYudG9TdHJpbmcoKTsKLQkJdGV4dCA9IChmVXNlVXBwZXJDYXNlKSA/IHRleHQudG9VcHBlckNhc2UoKSA6IHRleHQudG9Mb3dlckNhc2UoKTsKLQotCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuVkFMVUVfRlVOQ1RJT04pOwotCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTnVtYmVyKExpc3QgY2FuZGlkYXRlcywgQ1NTTU1OdW1iZXIgcHJvcCkgewotCQlTdHJpbmcgZnVsbFRleHQgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7Ci0JCS8vIHNraXAgbnVtYmVyCi0JCWludCB1bml0SW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsVGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoZnVsbFRleHQuY2hhckF0KGkpKSkgewotCQkJCXVuaXRJbmRleCA9IGkgKyAxOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyB1bml0U3ViVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBudW1TdWJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKDAgPD0gdW5pdEluZGV4KSB7Ci0JCQludW1TdWJUZXh0ID0gZnVsbFRleHQuc3Vic3RyaW5nKDAsIHVuaXRJbmRleCk7Ci0JCQlpZiAodW5pdEluZGV4IDwgZnVsbFRleHQubGVuZ3RoKCkpIHsKLQkJCQl1bml0U3ViVGV4dCA9IGZ1bGxUZXh0LnN1YnN0cmluZyh1bml0SW5kZXgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdW5pdFN1YlRleHQgPSBmdWxsVGV4dDsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBwcm9wLmdldERlc2NlbmRhbnRzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Vbml0IHVuaXQgPSAoQ1NTTU1Vbml0KSBpLm5leHQoKTsKLQkJCVN0cmluZyB1bml0U3RyaW5nID0gdW5pdC5nZXRVbml0U3RyaW5nKCk7Ci0JCQlpZiAoKDAgPCB1bml0U3ViVGV4dC5sZW5ndGgoKSAmJiB1bml0U3RyaW5nLmluZGV4T2YodW5pdFN1YlRleHQpICE9IDApIHx8ICgwIDwgbnVtU3ViVGV4dC5sZW5ndGgoKSAmJiB1bml0U3RyaW5nLmVxdWFscygiIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCVN0cmluZyB0ZXh0ID0gbnVtU3ViVGV4dCArIHVuaXRTdHJpbmc7Ci0JCQl0ZXh0ID0gKGZVc2VVcHBlckNhc2UpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJCWlmICgwIDwgbnVtU3ViVGV4dC5sZW5ndGgoKSB8fCB0ZXh0LmVxdWFscygiIyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKHRleHQubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKDApOwotCQkJfQotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlZBTFVFX05VTUJFUik7Ci0JCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tTZW1pQ29sb24oKSB7Ci0JCWZBcHBlbmRTZW1pQ29sb24gPSBmYWxzZTsKLQotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsICYmIHRhcmdldFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJLy8gZmluZCB0cmFpbGluZyAiOiIgb3IgIjsiCi0JCQkvLyBpZiAiOiIgYmVmb3JlICI7IiBpcyBmb3VuZCwgYWRkICI7IgotCQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBmQ29udGV4dC5nZXRSZWdpb25JdGVyYXRvcigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIgPSBpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IGNvbnRhaW5lcikgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCQlmQXBwZW5kU2VtaUNvbG9uID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmQXBwZW5kU2VtaUNvbG9uKSB7Ci0JCQkJLy8gc2Vjb25kIGNoYW5jZToKLQkJCQkvLyBsZWFkaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgbm90ICI7IgotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IENTU1V0aWwuZmluZE5leHRTaWduaWZpY2FudE5vZGUoY29udGFpbmVyKTsKLQkJCQlpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJZkFwcGVuZFNlbWlDb2xvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRTZW1pQ29sb24oQ1NTQ0FDYW5kaWRhdGUgaXRlbSkgewotCQlpZiAoZkFwcGVuZFNlbWlDb2xvbikgewotCQkJU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gaXRlbS5nZXRSZXBsYWNlbWVudFN0cmluZygpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhyZXBsYWNlbWVudFN0cmluZyArICI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBjdXJzb3JQb3NpdGlvbiA9IGl0ZW0uZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJCWlmIChyZXBsYWNlbWVudFN0cmluZy5sZW5ndGgoKSA8PSBjdXJzb3JQb3NpdGlvbikgewotCQkJCS8vIGN1cnNvcnBvcyBpcyB0YWlsIG9mIHN0cmluZwotCQkJCWN1cnNvclBvc2l0aW9uKys7Ci0JCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3NpdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbWlDb2xvbihMaXN0IGNhbmRpZGF0ZXMpIHsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJSUNTU05vZGUgZmlyc3RDaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChmaXJzdENoaWxkIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZmlyc3RDaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAoZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkgPD0gc3RhcnRPZmZzZXQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gYkFkZENsb3NlciA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQlpZiAodGFyZ2V0UmVnaW9uICE9IG51bGwgJiYgdGFyZ2V0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkvLyBmaW5kIHRyYWlsaW5nICI6IiBvciAiOyIKLQkJCS8vIGlmICI6IiBiZWZvcmUgIjsiIGlzIGZvdW5kLCBhZGQgIjsiCi0JCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IGZDb250ZXh0LmdldFJlZ2lvbkl0ZXJhdG9yKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lciA9IGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gY29udGFpbmVyKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJCWJBZGRDbG9zZXIgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWJBZGRDbG9zZXIpIHsKLQkJCQkvLyBzZWNvbmQgY2hhbmNlOgotCQkJCS8vIGxlYWRpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBub3QgIjsiCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShjb250YWluZXIpOwotCQkJCWlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCQliQWRkQ2xvc2VyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYkFkZENsb3NlcikgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJU3RyaW5nIHRleHQgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCkgKyAiOyI7Ly8kTk9OLU5MUy0xJAotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24odGV4dC5sZW5ndGgoKSk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoIjsiKTsvLyROT04tTkxTLTEkCi0JCQlpdGVtLnNldEltYWdlVHlwZShudWxsKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHJpbmcoTGlzdCBjYW5kaWRhdGVzLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoIWlzTWF0Y2godGV4dCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRleHQgPSAoZlVzZVVwcGVyQ2FzZSkgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0KLQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcpOwotCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbXBvcnRhbnQoTGlzdCBjYW5kaWRhdGVzKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCXdoaWxlICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIDEuIGhhcyBubyBwcmlvcml0eSByZWdpb24KLQkJLy8gMi4gY3Vyc29yIHBvc2l0aW9uIGlzIGFmdGVyIG9mIGxhc3QgY2hpbGQKLQkJLy8gMy4gbm9ybWFsIGlzTWF0Y2ggbWV0aG9kCi0JCVN0cmluZyBwcmlvcml0eSA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIHRhcmdldE5vZGUpLmdldFByaW9yaXR5KCk7Ci0JCWlmIChwcmlvcml0eSA9PSBudWxsIHx8IHByaW9yaXR5Lmxlbmd0aCgpID09IDApIHsKLQkJCUlDU1NOb2RlIGxhc3RDaGlsZCA9IHRhcmdldE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbGFzdENoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCS8vCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pbGFzdENoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpZiAoc3RhcnRPZmZzZXQgPCBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSAmJiBpc01hdGNoKElNUE9SVEFOVCkpIHsKLQkJCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKElNUE9SVEFOVCk7Ci0JCQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oSU1QT1JUQU5ULmxlbmd0aCgpKTsKLQkJCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKElNUE9SVEFOVCk7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcpOwotCQkJCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldENhbmRpZGF0ZXMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKSB7Ci0JCUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQljaGVja1NlbWlDb2xvbigpOyAvLyBjaGVjayBzaG91bGQgYWRkIHNlbWktY29sb24gb3Igbm90Ci0KLQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQkJSXRlcmF0b3IgaSA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCWlmIChpc0ZvbnRGYWNlUnVsZSgpKSB7Ci0JCQkJQ1NTTU1EZXNjcmlwdG9yIGRlc2MgPSB1dGlsLmdldERlc2NyaXB0b3IobmFtZSk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQlpID0gZGVzYy5nZXRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNTU01NUHJvcGVydHkgcHJvcCA9IHV0aWwuZ2V0UHJvcGVydHkobmFtZSk7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQlpID0gcHJvcC5nZXRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgdmFsID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHZhbHVlVHlwZSA9IHZhbC5nZXRUeXBlKCk7Ci0JCQkJaWYgKHZhbHVlVHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9LRVlXT1JEKSB7Ci0JCQkJCWFkZFN0cmluZyhjYW5kaWRhdGVzLCB2YWwudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfTlVNQkVSKSB7Ci0JCQkJCWFkZE51bWJlcihjYW5kaWRhdGVzLCAoQ1NTTU1OdW1iZXIpIHZhbCk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04pIHsKLQkJCQkJYWRkRnVuY3Rpb24oY2FuZGlkYXRlcywgKENTU01NRnVuY3Rpb24pIHZhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYWRkSW1wb3J0YW50KGNhbmRpZGF0ZXMpOwotCQlhZGRTZW1pQ29sb24oY2FuZGlkYXRlcyk7Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCXdoaWxlICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJcmV0dXJuICgoSUNTU1N0eWxlRGVjbEl0ZW0pIHRhcmdldE5vZGUpLmdldFByb3BlcnR5TmFtZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9udEZhY2VSdWxlKCkgewotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQl3aGlsZSAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCXRhcmdldE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsgLy8gZ2V0IERlY2xhcmF0aW9uCi0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gaW5saW5lIHN0eWxlIGhhcyBubyBydWxlIG5vZGUKLQkJCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7IC8vIGdldCBydWxlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICh0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2OGY1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIENTU1N0eWxlUnVsZVByb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0KLQkJaWYgKGZIVE1MVGFncyA9PSBudWxsKSB7Ci0JCQlmSFRNTFRhZ3MgPSBzZXR1cEhUTUxUYWdzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGNoZWNrTGVhZGluZ0NvbG9uKCkpIHsKLQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQkvLyBYSFRNTCByZXF1aXJlcyBsb3dlciBjYXNlCi0JCWJvb2xlYW4gYkxvd2VyQ2FzZSA9IGZhbHNlOwotCQlpZiAoZkNvbnRleHQuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJTm9kZSBkb21Ob2RlID0gZkNvbnRleHQuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKTsKLQkJCWlmIChkb21Ob2RlICE9IG51bGwgJiYgIShkb21Ob2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0JCQkJZG9tTm9kZSA9IGRvbU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCWlmIChkb21Ob2RlIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0JCQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgZG9tTm9kZSkuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJCWJMb3dlckNhc2UgPSAoYWRhcHRlci5nZXRUYWdOYW1lQ2FzZSgpID09IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQlpbnQgbGVuZ3RoID0gZkhUTUxUYWdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHRhZ1RleHQgPSBmSFRNTFRhZ3NbaV07Ci0JCQlpZiAoYkxvd2VyQ2FzZSkgewotCQkJCXRhZ1RleHQgPSB0YWdUZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAoIWlzTWF0Y2godGFnVGV4dCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmLmFwcGVuZCh0YWdUZXh0KTsKLQkJCWN1cnNvclBvcyArPSB0YWdUZXh0Lmxlbmd0aCgpOwotCQkJYm9vbGVhbiBpblJ1bGUgPSAoZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSk7Ci0JCQlpZiAoIWluUnVsZSB8fCBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJY3Vyc29yUG9zICs9IDE7Ci0JCQl9Ci0JCQlpZiAoIWluUnVsZSkgewotCQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZUJyYWNlcygpOwotCQkJCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQkJCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJCX0KLQotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGFnVGV4dCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuU0VMRUNUT1JfVEFHKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc2V0dXBIVE1MVGFncygpIHsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbWRvYy5nZXRFbGVtZW50cygpOwotCQlWZWN0b3IgbmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCWludCBuRWxlbWVudHMgPSBlbGVtZW50cy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYyA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuaXRlbShpKTsKLQkJCWlmIChpc0F0dHJEZWZpbmVkKGVkZWMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQkJbmFtZXMuYWRkKGVkZWMuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChuYW1lcyk7Ci0JCVN0cmluZ1tdIHRhZ3MgPSBuZXcgU3RyaW5nW25hbWVzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGlOYW1lcyA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpTmFtZXMuaGFzTmV4dCgpOyBpKyspIHsKLQkJCXRhZ3NbaV0gPSAoU3RyaW5nKSBpTmFtZXMubmV4dCgpOwotCQl9Ci0JCXJldHVybiB0YWdzOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXR0ckRlZmluZWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYywgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChlZGVjID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDTU5hbWVkTm9kZU1hcCBhdHRycyA9IGVkZWMuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYXR0ci5nZXRBdHRyTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZIVE1MVGFncyA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBjNDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01NVHlwZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogIAotICovCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yIGV4dGVuZHMgQ1NTUHJvcG9zYWxHZW5lcmF0b3IgewotCi0JLyoqCi0JICogQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYm9vbGVhbiBoYXNMZWFkaW5nQ29sb24gPSBjaGVja0xlYWRpbmdDb2xvbigpOwotCQlTdHJpbmcgdGV4dFRvUmVwbGFjZSA9IGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKTsKLQkJaWYgKCFoYXNMZWFkaW5nQ29sb24gJiYgMCA8IHRleHRUb1JlcGxhY2UubGVuZ3RoKCkgJiYgIXRleHRUb1JlcGxhY2UuZXF1YWxzKGZDb250ZXh0LmdldFRleHRUb0NvbXBhcmUoKSkpIHsKLQkJCS8vIGN1cnNvciBwbGFjZWQgbWlkcG9pbnQgb2YgdGhlIHJlZ2lvbgotCQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiAhQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZSh0eXBlKSkgewotCQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIHVzZVVwcGVyQ2FzZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCi0JCUxpc3QgdGFncyA9IGdldFNlbGVjdG9yVGFncygpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRhZ3MpOwotCQlJdGVyYXRvciBpID0gdGFncy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpZiAoaGFzTGVhZGluZ0NvbG9uICYmICFpc01hdGNoKHRleHQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl0ZXh0ID0gKHVzZVVwcGVyQ2FzZSkgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0KLQkJCWludCBjdXJzb3JQb3MgPSAwOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChoYXNMZWFkaW5nQ29sb24pIHsKLQkJCQlidWYuYXBwZW5kKHRleHQuc3Vic3RyaW5nKDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZCh0ZXh0VG9SZXBsYWNlKTsKLQkJCQlidWYuYXBwZW5kKHRleHQpOwotCQkJfQotCQkJY3Vyc29yUG9zICs9IGJ1Zi5sZW5ndGgoKTsKLQotCQkJaWYgKDAgPCBidWYubGVuZ3RoKCkpIHsKLQkJCQlib29sZWFuIGluUnVsZSA9IChmQ29udGV4dC5nZXRUYXJnZXROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlIHx8IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKSBpbnN0YW5jZW9mIElDU1NQYWdlUnVsZSk7Ci0JCQkJaWYgKCFpblJ1bGUgfHwgKHRleHRUb1JlcGxhY2UubGVuZ3RoKCkgPT0gMCAmJiAhaGFzTGVhZGluZ0NvbG9uKSkgewotCQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCQljdXJzb3JQb3MgKz0gMTsKLQkJCQl9Ci0JCQkJaWYgKCFpblJ1bGUpIHsKLQkJCQkJU3RyaW5nQW5kT2Zmc2V0IHNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCQkJCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQkJCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCQkJfQotCQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9QU0VVRE8pOwotCQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvclRhZ3MoKSB7Ci0JCUxpc3QgdGFnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJU3RyaW5nIHJvb3RUeXBlID0gKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUpID8gQ1NTTU1Ob2RlLlRZUEVfUEFHRV9SVUxFIDogQ1NTTU1Ob2RlLlRZUEVfU1RZTEVfUlVMRTsKLQotCQlDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuY29sbGVjdE5lc3RlZFR5cGUoZmFsc2UpOwotCQljb2xsZWN0b3IuYXBwbHkoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCksIHJvb3RUeXBlKTsKLQkJSXRlcmF0b3IgaTsKLQkJaSA9IGNvbGxlY3Rvci5nZXROb2RlcygpOwotCQlpZiAoIWkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGFnTGlzdDsKLQkJfQotCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQlpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIGNoaWxkID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SKSB7Ci0JCQkJU3RyaW5nIHNlbFR5cGUgPSAoKENTU01NU2VsZWN0b3IpIGNoaWxkKS5nZXRTZWxlY3RvclR5cGUoKTsKLQkJCQlpZiAoc2VsVHlwZSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0NMQVNTIHx8IHNlbFR5cGUgPT0gQ1NTTU1TZWxlY3Rvci5UWVBFX1BTRVVET19FTEVNRU5UKSB7Ci0JCQkJCXRhZ0xpc3QuYWRkKCgoQ1NTTU1TZWxlY3RvcikgY2hpbGQpLmdldFNlbGVjdG9yU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXN1cGVyLmlzTWF0Y2godGV4dCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjgwNTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgQ1NTIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUKLSAqIGJ5IHRoZSBDU1MgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIENTUyBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHRUeXBlSWQgPSBudWxsOwotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXR5cGUgPSByZWdpc3RyeS5nZXRDb250ZXh0VHlwZShmQ29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCS8vIGp1c3QgcmV0dXJuIHRoZSBzYW1lIGltYWdlIGZvciBub3cKLQkJcmV0dXJuIENTU0ltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEVNUExBVEUpOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZVtdIGdldFRlbXBsYXRlcyhTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZXNbXSA9IG51bGw7Ci0KLQkJVGVtcGxhdGVTdG9yZSBzdG9yZSA9IGdldFRlbXBsYXRlU3RvcmUoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZXMgPSBzdG9yZS5nZXRUZW1wbGF0ZXMoY29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTDQwTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MNDBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwOTQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MNDBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLS8qKgotICogUHJvdmlkZSBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgSFRNTCA0LjA/IHNwZWNpZmljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTDQwTmFtZXNwYWNlIHsKLQotCS8vIEVsZW1lbnQgbmFtZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEEgPSAiQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJCUiA9ICJBQkJSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1JPTllNID0gIkFDUk9OWU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSAiQUREUkVTUyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTEVUID0gIkFQUExFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJFQSA9ICJBUkVBIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCID0gIkIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0UgPSAiQkFTRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRUZPTlQgPSAiQkFTRUZPTlQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJETyA9ICJCRE8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJHU09VTkQgPSAiQkdTT1VORCI7IC8vIEQyMDU1MTMKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSUcgPSAiQklHIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTElOSyA9ICJCTElOSyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tRVU9URSA9ICJCTE9DS1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gIkJPRFkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gIkJSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT04gPSAiQlVUVE9OIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBUSU9OID0gIkNBUFRJT04iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlRFUiA9ICJDRU5URVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJVEUgPSAiQ0lURSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERSA9ICJDT0RFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0wgPSAiQ09MIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xHUk9VUCA9ICJDT0xHUk9VUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREQgPSAiREQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTCA9ICJERUwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERGTiA9ICJERk4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9ICJESVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJViA9ICJESVYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMID0gIkRMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVCA9ICJEVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU0gPSAiRU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEID0gIkVNQkVEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRFNFVCA9ICJGSUVMRFNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9OVCA9ICJGT05UIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNID0gIkZPUk0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FID0gIkZSQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRVNFVCA9ICJGUkFNRVNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDEgPSAiSDEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgyID0gIkgyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMyA9ICJIMyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDQgPSAiSDQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg1ID0gIkg1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINiA9ICJINiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9ICJIRUFEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIUiA9ICJIUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJID0gIkkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElGUkFNRSA9ICJJRlJBTUUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNRyA9ICJJTUciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUID0gIklOUFVUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlMgPSAiSU5TIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU0lOREVYID0gIklTSU5ERVgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtCRCA9ICJLQkQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gIkxBQkVMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdFTkQgPSAiTEVHRU5EIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSSA9ICJMSSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOSyA9ICJMSU5LIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVAgPSAiTUFQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VID0gIk1FTlUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSAiTUVUQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9CUiA9ICJOT0JSIjsgLy8gRDIwNTUxMyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PRU1CRUQgPSAiTk9FTUJFRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9GUkFNRVMgPSAiTk9GUkFNRVMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PU0NSSVBUID0gIk5PU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1QgPSAiT0JKRUNUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTCA9ICJPTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUR1JPVVAgPSAiT1BUR1JPVVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTiA9ICJPUFRJT04iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFAgPSAiUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAiUEFSQU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRSA9ICJQUkUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFEgPSAiUSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUyA9ICJTIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QID0gIlNBTVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVCA9ICJTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVCA9ICJTRUxFQ1QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMID0gIlNNQUxMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFOID0gIlNQQU4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklLRSA9ICJTVFJJS0UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUk9ORyA9ICJTVFJPTkciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFID0gIlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUIgPSAiU1VCIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAgPSAiU1VQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRSA9ICJUQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEJPRFkgPSAiVEJPRFkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFREID0gIlREIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUQVJFQSA9ICJURVhUQVJFQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEZPT1QgPSAiVEZPT1QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIID0gIlRIIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVBRCA9ICJUSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiVElUTEUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSID0gIlRSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVCA9ICJUVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVSA9ICJVIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTCA9ICJVTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSID0gIlZBUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JSID0gIldCUiI7IC8vIEQyMDU1MTMgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJRVUVFID0gIk1BUlFVRUUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9DT05GSUcgPSAiU1NJOkNPTkZJRyI7IC8vIEQyMTAzOTMKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRUNITyA9ICJTU0k6RUNITyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VYRUMgPSAiU1NJOkVYRUMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GU0laRSA9ICJTU0k6RlNJWkUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GTEFTVE1PRCA9ICJTU0k6RkxBU1RNT0QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9JTkNMVURFID0gIlNTSTpJTkNMVURFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJJTlRFTlYgPSAiU1NJOlBSSU5URU5WIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfU0VUID0gIlNTSTpTRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9XTUwgPSAid21sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQ0FSRCA9ICJjYXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfVEVNUExBVEUgPSAidGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BQ0NFU1MgPSAiYWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfRE8gPSAiZG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9PTkVWRU5UID0gIm9uZXZlbnQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9USU1FUiA9ICJ0aW1lciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FOQ0hPUiA9ICJhbmNob3IiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9QUkVWID0gInByZXYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9SRUZSRVNIID0gInJlZnJlc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9HTyA9ICJnbyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX05PT1AgPSAibm9vcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX1NFVFZBUiA9ICJzZXR2YXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9QT1NURklFTEQgPSAicG9zdGZpZWxkIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIENoYXJhY3RlciBFbnRpdGllcwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVudGl0eU5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQUNVVEVfVSA9ICJBYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFBQ1VURV9MID0gImFhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJUkNfVSA9ICJBY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJUkNfTCA9ICJhY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNVVEUgPSAiYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFFTElHX1UgPSAiQUVsaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFFTElHX0wgPSAiYWVsaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHUkFWRV9VID0gIkFncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUdSQVZFX0wgPSAiYWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEVGU1lNID0gImFsZWZzeW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBX1UgPSAiQWxwaGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBX0wgPSAiYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUCA9ICJhbXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORCA9ICJhbmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORyA9ICJhbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSSU5HX1UgPSAiQXJpbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSSU5HX0wgPSAiYXJpbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTWU1QID0gImFzeW1wIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVElMREVfVSA9ICJBdGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUSUxERV9MID0gImF0aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVNTF9VID0gIkF1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVTUxfTCA9ICJhdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRFFVTyA9ICJiZHF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVUQV9VID0gIkJldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVEFfTCA9ICJiZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUlZCQVIgPSAiYnJ2YmFyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUxMID0gImJ1bGwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUCA9ICJjYXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENDRURJTF9VID0gIkNjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0NFRElMX0wgPSAiY2NlZGlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRURJTCA9ICJjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VOVCA9ICJjZW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElfVSA9ICJDaGkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENISV9MID0gImNoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lSQyA9ICJjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTFVCUyA9ICJjbHVicyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORyA9ICJjb25nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZID0gImNvcHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSQVJSID0gImNyYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVAgPSAiY3VwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU4gPSAiY3VycmVuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQUdHRVJfVSA9ICJEYWdnZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBR0dFUl9MID0gImRhZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFSUl9VID0gImRBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBUlJfTCA9ICJkYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUcgPSAiZGVnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9VID0gIkRlbHRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9MID0gImRlbHRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFNUyA9ICJkaWFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElWSURFID0gImRpdmlkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFDVVRFX1UgPSAiRWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQUNVVEVfTCA9ICJlYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSVJDX1UgPSAiRWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSVJDX0wgPSAiZWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVHUkFWRV9VID0gIkVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUdSQVZFX0wgPSAiZWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICJlbXB0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1TUCA9ICJlbXNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlNQID0gImVuc3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVQU0lMT05fVSA9ICJFcHNpbG9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUFNJTE9OX0wgPSAiZXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVSVYgPSAiZXF1aXYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQV9VID0gIkV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRBX0wgPSAiZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVEhfVSA9ICJFVEgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUSF9MID0gImV0aCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVVNTF9VID0gIkV1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVVTUxfTCA9ICJldW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVVJPID0gImV1cm8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYSVNUID0gImV4aXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTk9GID0gImZub2YiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkFMTCA9ICJmb3JhbGwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMxMiA9ICJmcmFjMTIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMxNCA9ICJmcmFjMTQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMzNCA9ICJmcmFjMzQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQVNMID0gImZyYXNsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHQU1NQV9VID0gIkdhbW1hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHQU1NQV9MID0gImdhbW1hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRSA9ICJnZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1QgPSAiZ3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBUlJfVSA9ICJoQXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJSX0wgPSAiaGFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBUlRTID0gImhlYXJ0cyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMTElQID0gImhlbGxpcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUFDVVRFX1UgPSAiSWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQUNVVEVfTCA9ICJpYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDSVJDX1UgPSAiSWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDSVJDX0wgPSAiaWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElFWENMID0gImlleGNsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR1JBVkVfVSA9ICJJZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHUkFWRV9MID0gImlncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0UgPSAiaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORklOID0gImluZmluIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlQgPSAiaW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJT1RBX1UgPSAiSW90YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9UQV9MID0gImlvdGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElRVUVTVCA9ICJpcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTSU4gPSAiaXNpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVNTF9VID0gIkl1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVTUxfTCA9ICJpdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQVBQQV9VID0gIkthcHBhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQVBQQV9MID0gImthcHBhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU1CREFfVSA9ICJMYW1iZGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTUJEQV9MID0gImxhbWJkYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFORyA9ICJsYW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVFVTyA9ICJsYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSUl9VID0gImxBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBUlJfTCA9ICJsYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQ0VJTCA9ICJsY2VpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERRVU8gPSAibGRxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFID0gImxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRkxPT1IgPSAibGZsb29yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1dBU1QgPSAibG93YXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1ogPSAibG96IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMUk0gPSAibHJtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMU0FRVU8gPSAibHNhcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMU1FVTyA9ICJsc3F1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFQgPSAibHQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BQ1IgPSAibWFjciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTURBU0ggPSAibWRhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JQ1JPID0gIm1pY3JvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSURET1QgPSAibWlkZG90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VUyA9ICJtaW51cyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVfVSA9ICJNdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVfTCA9ICJtdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFCTEEgPSAibmFibGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5CU1AgPSAibmJzcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkRBU0ggPSAibmRhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FID0gIm5lIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSSA9ICJuaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UID0gIm5vdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USU4gPSAibm90aW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TVUIgPSAibnN1YiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlRJTERFX1UgPSAiTnRpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVElMREVfTCA9ICJudGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VX1UgPSAiTnUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VX0wgPSAibnUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9BQ1VURV9VID0gIk9hY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FDVVRFX0wgPSAib2FjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQ0lSQ19VID0gIk9jaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQ0lSQ19MID0gIm9jaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRUxJR19VID0gIk9FbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRUxJR19MID0gIm9lbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPR1JBVkVfVSA9ICJPZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9HUkFWRV9MID0gIm9ncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xJTkUgPSAib2xpbmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NRUdBX1UgPSAiT21lZ2EiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NRUdBX0wgPSAib21lZ2EiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSUNST05fVSA9ICJPbWljcm9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlDUk9OX0wgPSAib21pY3JvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BMVVMgPSAib3BsdXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SID0gIm9yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRGID0gIm9yZGYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SRE0gPSAib3JkbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NMQVNIX1UgPSAiT3NsYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU0xBU0hfTCA9ICJvc2xhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9USUxERV9VID0gIk90aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RJTERFX0wgPSAib3RpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVElNRVMgPSAib3RpbWVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVU1MX1UgPSAiT3VtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VNTF9MID0gIm91bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkEgPSAicGFyYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVCA9ICJwYXJ0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJNSUwgPSAicGVybWlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJQID0gInBlcnAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBISV9VID0gIlBoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhJX0wgPSAicGhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9VID0gIlBpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9MID0gInBpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSVYgPSAicGl2IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVTTU4gPSAicGx1c21uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1VORCA9ICJwb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUVfVSA9ICJQcmltZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUVfTCA9ICJwcmltZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRCA9ICJwcm9kIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QID0gInByb3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBTSV9VID0gIlBzaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFNJX0wgPSAicHNpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UID0gInF1b3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBRElDID0gInJhZGljIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HID0gInJhbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBUVVPID0gInJhcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVJSX1UgPSAickFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFSUl9MID0gInJhcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJDRUlMID0gInJjZWlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRFFVTyA9ICJyZHF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTCA9ICJyZWFsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUcgPSAicmVnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRkxPT1IgPSAicmZsb29yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSE9fVSA9ICJSaG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJIT19MID0gInJobyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkxNID0gInJsbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNBUVVPID0gInJzYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNRVU8gPSAicnNxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCUVVPID0gInNicXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FST05fVSA9ICJTY2Fyb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQVJPTl9MID0gInNjYXJvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RPVCA9ICJzZG90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUID0gInNlY3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIWSA9ICJzaHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BX1UgPSAiU2lnbWEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BX0wgPSAic2lnbWEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BRiA9ICJzaWdtYWYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTSA9ICJzaW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQURFUyA9ICJzcGFkZXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQkUgPSAic3ViZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNID0gInN1bSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQID0gInN1cCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQMSA9ICJzdXAxIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAyID0gInN1cDIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUDMgPSAic3VwMyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRSA9ICJzdXBlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWkxJRyA9ICJzemxpZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFVX1UgPSAiVGF1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVVfTCA9ICJ0YXUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVJFNCA9ICJ0aGVyZTQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBX1UgPSAiVGhldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBX0wgPSAidGhldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBU1lNID0gInRoZXRhc3ltIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSElOU1AgPSAidGhpbnNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSE9STl9VID0gIlRIT1JOIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSE9STl9MID0gInRob3JuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSUxERSA9ICJ0aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVMgPSAidGltZXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQURFID0gInRyYWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQUNVVEVfVSA9ICJVYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBQ1VURV9MID0gInVhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUFSUl9VID0gInVBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBUlJfTCA9ICJ1YXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQ0lSQ19VID0gIlVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQ0lSQ19MID0gInVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVR1JBVkVfVSA9ICJVZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVHUkFWRV9MID0gInVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1MID0gInVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBTSUggPSAidXBzaWgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQU0lMT05fVSA9ICJVcHNpbG9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUFNJTE9OX0wgPSAidXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVVNTF9VID0gIlV1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVVTUxfTCA9ICJ1dW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUlFUlAgPSAid2VpZXJwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSV9VID0gIlhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSV9MID0gInhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZQUNVVEVfVSA9ICJZYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlBQ1VURV9MID0gInlhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVOID0gInllbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWVVNTF9VID0gIll1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlVTUxfTCA9ICJ5dW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVRBX1UgPSAiWmV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVUQV9MID0gInpldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpXSiA9ICJ6d2oiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpXTkogPSAienduaiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MNDBfVVJJID0gImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUw0MF9UQUdfUFJFRklYID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBnbG9iYWwgYXR0cmlidXRlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTID0gImNsYXNzIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NUWUxFID0gInN0eWxlIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RJVExFID0gInRpdGxlIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xBTkcgPSAibGFuZyI7IC8vICVpMThuOwotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RJUiA9ICJkaXIiOyAvLyAlaTE4bjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkNMSUNLID0gIm9uY2xpY2siOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OREJMQ0xJQ0sgPSAib25kYmxjbGljayI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05NT1VTRURPV04gPSAib25tb3VzZWRvd24iOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05NT1VTRVVQID0gIm9ubW91c2V1cCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VPVkVSID0gIm9ubW91c2VvdmVyIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VNT1ZFID0gIm9ubW91c2Vtb3ZlIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VPVVQgPSAib25tb3VzZW91dCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlQUkVTUyA9ICJvbmtleXByZXNzIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTktFWURPV04gPSAib25rZXlkb3duIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlVUCA9ICJvbmtleXVwIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkhFTFAgPSAib25oZWxwIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkdDT0xPUiA9ICJiZ2NvbG9yIjsgLy8gJWJvZHljb2xvcjssCi0JCQkJCQkJCQkJCQkJCQkgIC8vIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEVYVCA9ICJ0ZXh0IjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MSU5LID0gImxpbmsiOyAvLyAlYm9keWNvbG9yOwotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZMSU5LID0gInZsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSU5LID0gImFsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vIEhUTUwKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9GSUxFID0gInByb2ZpbGUiOyAvLyBIRUFECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05MT0FEID0gIm9ubG9hZCI7IC8vIEJPRFkKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05VTkxPQUQgPSAib251bmxvYWQiOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CQUNLR1JPVU5EID0gImJhY2tncm91bmQiOyAvLyBCT0RZLAotCQkJCQkJCQkJCQkJCQkJCQkvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NSQyA9ICJzcmMiOyAvLyBJTUcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTFQgPSAiYWx0IjsgLy8gSU1HLEFSRUEKLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTE9OR0RFU0MgPSAibG9uZ2Rlc2MiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05BTUUgPSAibmFtZSI7IC8vIElNRyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyBJTUcsIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gIndpZHRoIjsgLy8gSU1HLCBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVNFTUFQID0gInVzZW1hcCI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU01BUCA9ICJpc21hcCI7IC8vIElNRyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8gSU1HLCBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSID0gImJvcmRlciI7IC8vIElNRywgVEFCTEUKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8gSU1HCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BUEZJTEUgPSAibWFwZmlsZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NVTU1BUlkgPSAic3VtbWFyeSI7IC8vIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRlJBTUUgPSAiZnJhbWUiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUlVMRVMgPSAicnVsZXMiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0VMTFNQQUNJTkcgPSAiY2VsbHNwYWNpbmciOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0VMTFBBRERJTkcgPSAiY2VsbHBhZGRpbmciOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfREFUQVBBR0VTSVpFID0gImRhdGFwYWdlc2l6ZSI7IC8vIFRBQkxFLEhSCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTE9SID0gImNvbG9yIjsgLy8gQkFTRUZPTlQsRk9OVAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkFDRSA9ICJmYWNlIjsgLy8gQkFTRUZPTlQsRk9OVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NJWkUgPSAic2l6ZSI7IC8vIEJBU0VGT05ULEZPTlQKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEVBUiA9ICJjbGVhciI7IC8vIEJSIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0hBUEUgPSAic2hhcGUiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT09SRFMgPSAiY29vcmRzIjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGID0gImhyZWYiOyAvLyBBUkVBIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEFSR0VUID0gInRhcmdldCI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9IUkVGID0gIm5vaHJlZiI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEFCSU5ERVggPSAidGFiaW5kZXgiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BQ0NFU1NLRVkgPSAiYWNjZXNza2V5IjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkZPQ1VTID0gIm9uZm9jdXMiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05CTFVSID0gIm9uYmx1ciI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUlNFVCA9ICJjaGFyc2V0IjsgLy8gTElOSwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hSRUZMQU5HID0gImhyZWZsYW5nIjsgLy8gTElOSwotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8gTElOSyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JFTCA9ICJyZWwiOyAvLyBMSU5LIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVWID0gInJldiI7IC8vIExJTksgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NRURJQSA9ICJtZWRpYSI7IC8vIExJTksKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFID0gInZhbHVlIjsgLy8gUEFSQU0KLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFVFlQRSA9ICJ2YWx1ZXR5cGUiOyAvLyBQQVJBTQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1NIQURFID0gIm5vc2hhZGUiOyAvLyBIUgotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIRUNLRUQgPSAiY2hlY2tlZCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElTQUJMRUQgPSAiZGlzYWJsZWQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVBRE9OTFkgPSAicmVhZG9ubHkiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFYTEVOR1RIID0gIm1heGxlbmd0aCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OU0VMRUNUID0gIm9uc2VsZWN0IjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OQ0hBTkdFID0gIm9uY2hhbmdlIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDQ0VQVCA9ICJhY2NlcHQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU1RZTEUgPSAiaXN0eWxlIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUiA9ICJjaGFyIjsgLy8gQ09MIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUk9GRiA9ICJjaGFyb2ZmIjsgLy8gQ09MCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMSUdOID0gInZhbGlnbiI7IC8vIENPTAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUEFOID0gInNwYW4iOyAvLyBDT0wgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GUkFNRUJPUkRFUiA9ICJmcmFtZWJvcmRlciI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVJHSU5XSURUSCA9ICJtYXJnaW53aWR0aCI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQgPSAibWFyZ2luaGVpZ2h0IjsgLy8gRlJBTUUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9SRVNJWkUgPSAibm9yZXNpemUiOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NST0xMSU5HID0gInNjcm9sbGluZyI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST01QVCA9ICJwcm9tcHQiOyAvLyBJU0lOREVYCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hUVFBfRVFVSVYgPSAiaHR0cC1lcXVpdiI7IC8vIE1FVEEKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UID0gImNvbnRlbnQiOyAvLyBNRVRBCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NIRU1FID0gInNjaGVtZSI7IC8vIE1FVEEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVJSTVNHID0gImVycm1zZyI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRUZNVCA9ICJzaXplZm10IjsgLy8gc3NpOmNvbmZpZwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RJTUVGTVQgPSAidGltZWZtdCI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQVIgPSAidmFyIjsgLy8gc3NpOmVjaG8KLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0dJID0gImNnaSI7IC8vIHNzaTpleGVjCi0JCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NNRCA9ICJjbWQiOyAvLyBzc2k6ZXhlYwotCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyBzc2k6ZnNpemUKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WSVJUVUFMID0gInZpcnR1YWwiOyAvLyBzc2k6ZnNpemUKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRUxFQ1RFRCA9ICJzZWxlY3RlZCI7IC8vIE9QVElPTgotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFCRUwgPSAibGFiZWwiOyAvLyBPUFRJT04KLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1MgPSAicm93cyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MUyA9ICJjb2xzIjsgLy8gVEVYVEFSRUEKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vIFNDUklQVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfREVGRVIgPSAiZGVmZXIiOyAvLyBTQ1JJUFQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VWRU5UID0gImV2ZW50IjsgLy8gU0NSSVBUCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GT1IgPSAiZm9yIjsgLy8gU0NSSVBUIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8gT0wvVUwKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVEFSVCA9ICJzdGFydCI7IC8vIE9ML1VMCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ESVJFQ1RLRVkgPSAiZGlyZWN0a2V5IjsgLy8gQQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVJDSElWRSA9ICJhcmNoaXZlIjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT0JKRUNUID0gIm9iamVjdCI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVlTQ1JJUFQgPSAibWF5c2NyaXB0IjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NJVEUgPSAiY2l0ZSI7IC8vIEJMT0NLUVVPVEUKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQUNSTyA9ICJtYWNybyI7IC8vIEQyVyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEVUSU1FID0gImRhdGV0aW1lIjsgLy8gSU5TL0RFTAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTE9PUCA9ICJsb29wIjsgLy8gRU1CRUQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ISURERU4gPSAiaGlkZGVuIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVk9MVU1FID0gInZvbHVtZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9TVEFSVCA9ICJhdXRvc3RhcnQiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPUExBWSA9ICJhdXRvcGxheSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPU0laRSA9ICJhdXRvc2l6ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05UUk9MTEVSID0gImNvbnRyb2xsZXIiOy8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ0FMRSA9ICJzY2FsZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSE9XQ09OVFJPTFMgPSAic2hvd2NvbnRyb2xzIjsvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BMQVlDT1VOVCA9ICJwbGF5Y291bnQiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9SRVBFQVQgPSAicmVwZWF0IjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFORUwgPSAicGFuZWwiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFMRVRURSA9ICJwYWxldHRlIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9URVhURk9DVVMgPSAidGV4dGZvY3VzIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNUSU9OID0gImFjdGlvbiI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUVUSE9EID0gIm1ldGhvZCI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRU5DVFlQRSA9ICJlbmN0eXBlIjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OU1VCTUlUID0gIm9uc3VibWl0IjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05SRVNFVCA9ICJvbnJlc2V0IjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VUID0gImFjY2VwdC1jaGFyc2V0IjsvLyBGT1JNCi0JCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFSEFWSU9SID0gImJlaGF2aW9yIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NST0xMQU1PVU5UID0gInNjcm9sbGFtb3VudCI7Ly8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDUk9MTERFTEFZID0gInNjcm9sbGRlbGF5IjsvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RSVUVTUEVFRCA9ICJ0cnVlc3BlZWQiOyAvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RFQ0xBUkUgPSAiZGVjbGFyZSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTSUQgPSAiY2xhc3NpZCI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEEgPSAiZGF0YSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREVUWVBFID0gImNvZGV0eXBlIjsgLy8gT0JKRUNUCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVEFOREJZID0gInN0YW5kYnkiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NVUxUSVBMRSA9ICJtdWx0aXBsZSI7IC8vIFNFTEVDVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUJCUiA9ICJhYmJyIjsgLy8gVEgvVEQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BWElTID0gImF4aXMiOyAvLyBUSC9URCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFQURFUlMgPSAiaGVhZGVycyI7IC8vIFRIL1RECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NPUEUgPSAic2NvcGUiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUk9XU1BBTiA9ICJyb3dzcGFuIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0xTUEFOID0gImNvbHNwYW4iOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PV1JBUCA9ICJub3dyYXAiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCS8vIDw8RDIwNTUxNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UT1BNQVJHSU4gPSAidG9wbWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1RUT01NQVJHSU4gPSAiYm90dG9tbWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MRUZUTUFSR0lOID0gImxlZnRtYXJnaW4iOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUklHSFRNQVJHSU4gPSAicmlnaHRtYXJnaW4iOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1JERVJDT0xPUiA9ICJib3JkZXJjb2xvciI7IC8vIFRBQkxFL1RSL1RIL1REL0ZSQU1FU0VUL0ZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCS8vIGZvciBXTUwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX1RJVExFID0gInRpdGxlIjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9ET01BSU4gPSAiZG9tYWluIjsgLy8gYWNjZXNzCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfUEFUSCA9ICJwYXRoIjsgLy8gYWNjZXNzCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9PTkVOVEVSRk9SV0FSRCA9ICJvbmVudGVyZm9yd2FyZCI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05FTlRFUkJBQ0tXQVJEID0gIm9uZW50ZXJiYWNrd2FyZCI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9PTlBJQ0sgPSAib25waWNrIjsgLy8gb3B0aW9uCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05USU1FUiA9ICJvbnRpbWVyIjsgLy8gdGVtcGxhdGUsY2FyZAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfTkVXQ09OVEVYVCA9ICJuZXdjb250ZXh0IjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT1JERVJFRCA9ICJvcmRlcmVkIjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT1BUSU9OQUwgPSAib3B0aW9uYWwiOyAvLyBkbwotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9DQUNIRV9DT05UUk9MID0gImNhY2hlLWNvbnRyb2wiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfU0VORFJFRkVSRVIgPSAic2VuZHJlZmVyZXIiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9NRVRIT0QgPSAibWV0aG9kIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9FTkNUWVBFID0gImVuY3R5cGUiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfQUNDRVBUX0NIQVJTRVQgPSAiYWNjZXB0LWNoYXJzZXQiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9DT0xVTU5TID0gImNvbHVtbnMiOyAvLyB0YWJsZQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCS8vIEQyMDU1MTQKLQkvLzw8RDIxNTY4NAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GUkFNRVNQQUNJTkcgPSAiZnJhbWVzcGFjaW5nIjsgLy8gRlJBTUVTRVQKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvL0QyMTU2ODQKLQkvLyBnbG9iYWwgYXR0cmlidXRlIHZhbHVlczsgbWFpbmx5IHVzZWQgaW4gZW51bWVyYXRpb24uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZFUlNJT05fRlJBTUVTRVQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xUUiA9ICJsdHIiOyAvLyBkaXIgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUlRMID0gInJ0bCI7IC8vIGRpciAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSAidG9wIjsgLy8gYWxpZ24gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gIm1pZGRsZSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NIQVIgPSAiY2hhciI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdmFsaWduIChiYXNlbGluZSkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JBU0VMSU5FID0gImJhc2VsaW5lIjsgLy8gdmFsaWduCi0JCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBjbGVhciAobGVmdHxhbGx8cmlnaHR8bm9uZSk6IGxlZnQgYW5kIHJpZ2h0IGFyZSBhbHJlYWR5IGRlZmluZWQKLQkvLyBhYm92ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FMTCA9ICJhbGwiOyAvLyBjbGVhciAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OT05FID0gIm5vbmUiOyAvLyBjbGVhcgotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHNoYXBlIChyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRUNUID0gInJlY3QiOyAvLyBzaGFwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ0lSQ0xFID0gImNpcmNsZSI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUE9MWSA9ICJwb2x5IjsgLy8gc2hhcGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdmFsdWV0eXBlIChkYXRhfHJlZnxvYmplY3QpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9EQVRBID0gImRhdGEiOyAvLyB2YWx1ZXR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFRiA9ICJyZWYiOyAvLyB2YWx1ZXR5cGUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9PQkpFQ1QgPSAib2JqZWN0IjsgLy8gdmFsdWV0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHR5cGUgb2YgSU5QVVQKLQkvLyAgICAgICAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkvLyAgICAgICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVEVYVCA9ICJ0ZXh0IjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFTU1dPUkQgPSAicGFzc3dvcmQiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NIRUNLQk9YID0gImNoZWNrYm94IjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SQURJTyA9ICJyYWRpbyI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU1VCTUlUID0gInN1Ym1pdCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVNFVCA9ICJyZXNldCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRklMRSA9ICJmaWxlIjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSElEREVOID0gImhpZGRlbiI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9JTUFHRSA9ICJpbWFnZSI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVUVE9OID0gImJ1dHRvbiI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc3BhbiwgY29sc3Bhbiwgcm93c3BhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfMSA9ICIxIjsgLy8gc3BhbiAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgZnJhbWVib3JkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzAgPSAiMCI7IC8vIEZSQU1FIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBzY3JvbGxpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1lFUyA9ICJ5ZXMiOyAvLyBGUkFNRSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OTyA9ICJubyI7IC8vIEZSQU1FIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FVVE8gPSAiYXV0byI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgVUwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RJU0MgPSAiZGlzYyI7IC8vIFVMOnR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NRVUFSRSA9ICJzcXVhcmUiOyAvLyBVTDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGZyYW1lIG9mIFRBQkxFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WT0lEID0gInZvaWQiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUJPVkUgPSAiYWJvdmUiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUxPVyA9ICJiZWxvdyI7IC8vIFRBQkxFOmZyYW1lCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0hTSURFUyA9ICJoc2lkZXMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xIUyA9ICJsaHMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JIUyA9ICJyaHMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZTSURFUyA9ICJ2c2lkZXMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPWCA9ICJib3giOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPUkRFUiA9ICJib3JkZXIiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBydWxlcyBvZiBUQUJMRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfR1JPVVBTID0gImdyb3VwcyI7IC8vIFRBQkxFOnJ1bGVzCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XUyA9ICJyb3dzIjsgLy8gVEVYVEFSRUEKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPTFMgPSAiY29scyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgbWV0aG9kIG9mIEZPUk0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0dFVCA9ICJnZXQiOyAvLyBGT1JNIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BPU1QgPSAicG9zdCI7IC8vIEZPUk0gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc2NvcGUgb2YgKFRIIHwgVEQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ST1cgPSAicm93IjsgLy8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPTCA9ICJjb2wiOyAvLyAoVEh8VEQpOnNjb3BlCi0JCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XR1JPVVAgPSAicm93Z3JvdXAiOy8vIChUSHxURCk6c2NvcGUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DT0xHUk9VUCA9ICJjb2xncm91cCI7Ly8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBhdXRvPz8gb2YgRU1CRUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBiZWhhdmlybyBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TQ1JPTEwgPSAic2Nyb2xsIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NMSURFID0gInNsaWRlIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTFRFUk5BVEUgPSAiYWx0ZXJuYXRlIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBkaXJlY3Rpb24gb2YgTUFSUVVFRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVVAgPSAidXAiOyAvLyBNQVJRVUVFIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RPV04gPSAiZG93biI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciB0eXBlIG9mIExJIChEMTk5MjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OVU1CRVIgPSAiMSI7IC8vIExJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xPV0VSX0FMUEhBID0gImEiOyAvLyBMSQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ1NTTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9DU1NOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZhZWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9DU1NOb2RlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLS8qKgotICogQWRhcHRzIHRoZSBDU1MgRE9NIG5vZGUgdG8gYSBKRmFjZSB2aWV3ZXIuCi0gKi8KLWNsYXNzIENTU05vZGVBZGFwdGVyIGltcGxlbWVudHMgSUpGYWNlTm9kZUFkYXB0ZXIsIElOb2RlQWRhcHRlciwgUnVubmFibGUgewotCWNsYXNzIE5vdGlmeUNvbnRleHQgewotCQlOb3RpZnlDb250ZXh0KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQkJCXRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotCQkJdGhpcy5jaGFuZ2VkRmVhdHVyZSA9IGNoYW5nZWRGZWF0dXJlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQkJdGhpcy5wb3MgPSBwb3M7Ci0JCX0KLQotCQl2b2lkIGZpcmUoKSB7Ci0JCQlpbnRlcm5hbE5vdGlmeUNoYW5nZWQobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJfQotCi0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXI7Ci0JCWludCBldmVudFR5cGU7Ci0JCU9iamVjdCBjaGFuZ2VkRmVhdHVyZTsKLQkJT2JqZWN0IG9sZFZhbHVlOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCWludCBwb3M7Ci0JfQotCi0JY2xhc3MgU3R5bGVWaWV3VXBkYXRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGxhc3RVcGRhdGVyID09IHRoaXMpIHsKLQkJCQlpbnRlcm5hbEFjdGlvblBlcmZvcm1lZCgpOwotCQkJCWxhc3RVcGRhdGVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgVmVjdG9yIG5vdGlmeVF1ZXVlOwotCVN0eWxlVmlld1VwZGF0ZXIgbGFzdFVwZGF0ZXI7Ci0JcHJvdGVjdGVkIGludCBkZWxheU1TZWNzID0gNTAwOwotCWZpbmFsIHN0YXRpYyBDbGFzcyBBREFQVEVSX0tFWSA9IElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzOwotCi0JcHVibGljIENTU05vZGVBZGFwdGVyKElOb2RlQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFjdGlvblBlcmZvcm1lZCgpIHsKLQkJaWYgKG5vdGlmeVF1ZXVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIHJlZnJlc2hfYWxsID0gZmFsc2U7Ci0JCWJvb2xlYW4gcmVmcmVzaF9ydWxlID0gZmFsc2U7Ci0JCWludCBwb3NfYWxsID0gMDsKLQkJTGlzdCB0YXJnZXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmeVF1ZXVlLnNpemUoKTsgaSsrKSB7Ci0JCQlOb3RpZnlDb250ZXh0IGNvbnRleHQgPSAoTm90aWZ5Q29udGV4dCkgbm90aWZ5UXVldWUuZ2V0KGkpOwotCQkJaWYgKGNvbnRleHQubm90aWZpZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCXJlZnJlc2hfYWxsID0gdHJ1ZTsKLQkJCQlwb3NfYWxsID0gaTsKLQkJCX0KLQkJCWlmIChjb250ZXh0Lm5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pIHsKLQkJCQlyZWZyZXNoX3J1bGUgPSB0cnVlOwotCQkJCXRhcmdldHMuYWRkKGNvbnRleHQpOwotCQkJCS8vIHBvc19ydWxlID0gaTsKLQkJCX0KLQkJCS8vICgoTm90aWZ5Q29udGV4dCkgbm90aWZ5UXVldWUuZ2V0KGkpKS5maXJlKCk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hfYWxsKSB7Ci0JCQkoKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChwb3NfYWxsKSkuZmlyZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZnJlc2hfcnVsZSkgewotCQkJSXRlcmF0b3IgaSA9IHRhcmdldHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCSgoTm90aWZ5Q29udGV4dCkgaS5uZXh0KCkpLmZpcmUoKTsKLQkJCX0KLQkJCS8vIGVsc2UgaWYgKHJlZnJlc2hfcnVsZSkgaW50ZXJuYWxSZWZyZXNoQWxsKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmeVF1ZXVlLnNpemUoKTsgaSsrKSB7Ci0JCQkJKChOb3RpZnlDb250ZXh0KSBub3RpZnlRdWV1ZS5nZXQoaSkpLmZpcmUoKTsKLQkJCX0KLQkJfQotCQlub3RpZnlRdWV1ZS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgb2JqZWN0IGJlaW5nIGFkYXB0ZXIgKHRoZSBub3RpZmllcikgd2hlbiBzb21ldGhpbmcgaGFzCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnRlcm5hbE5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0TGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJCW5vdGlmeUNoYW5nZWRGb3JTdHJ1Y3R1cmVkVmlld2VyKChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lciwgbm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJCQlub3RpZnlDaGFuZ2VkRm9yUHJvcGVydHlTaGVldFBhZ2UoKFByb3BlcnR5U2hlZXRQYWdlKSBsaXN0ZW5lciwgbm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkRm9yUHJvcGVydHlTaGVldFBhZ2UoUHJvcGVydHlTaGVldFBhZ2UgcGFnZSwgSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAocGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCBwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCXBhZ2UucmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUNoYW5nZWRGb3JTdHJ1Y3R1cmVkVmlld2VyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyLCBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmICh2aWV3ZXIuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCUlDU1NOb2RlIHRlbXAgPSAoY2hhbmdlZEZlYXR1cmUgIT0gbnVsbCkgPyAoSUNTU05vZGUpIGNoYW5nZWRGZWF0dXJlIDogKElDU1NOb2RlKSBuZXdWYWx1ZTsKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoOzspIHsKLQkJCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRlbXAgPT0gbnVsbCkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh0ZW1wID09IG51bGwgfHwgdGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmlld2VyLnJlZnJlc2godGVtcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKElDU1NOb2RlKSBub3RpZmllcjsKLQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCB0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREKSB7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCUlDU1NOb2RlIHRlbXAgPSAoY2hhbmdlZEZlYXR1cmUgIT0gbnVsbCkgPyAoSUNTU05vZGUpIGNoYW5nZWRGZWF0dXJlIDogKElDU1NOb2RlKSBuZXdWYWx1ZTsKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoOzspIHsKLQkJCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRlbXAgPT0gbnVsbCkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0ZW1wID09IG51bGwgfHwgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgoKElDU1NOb2RlKSBuZXdWYWx1ZSkuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlDU1NOb2RlIHRlbXAgPSAoSUNTU05vZGUpIG5vdGlmaWVyOwotCQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmlld2VyLnJlZnJlc2godGVtcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB2aWV3ZXIucmVmcmVzaChub3RpZmllcik7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChJQ1NTTm9kZSkgbm90aWZpZXI7Ci0JCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmICh0ZW1wID09IG51bGwgfHwgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaW50ZXJuYWxSZWZyZXNoQWxsKCkgewotCQlDb2xsZWN0aW9uIGxpc3RlbmVycyA9ICgoSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MpIGFkYXB0ZXJGYWN0b3J5KS5nZXRMaXN0ZW5lcnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGxpc3RlbmVyOwotCQkJCWlmICh2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIGxpc3RlbmVyOwotCQkJCWlmIChwYWdlLmdldENvbnRyb2woKSAhPSBudWxsICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhBREFQVEVSX0tFWSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBvYmplY3QgYmVpbmcgYWRhcHRlciAodGhlIG5vdGlmaWVyKSB3aGVuIHNvbWV0aGluZyBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZ5UXVldWUgPT0gbnVsbCkKLQkJCW5vdGlmeVF1ZXVlID0gbmV3IFZlY3RvcigpOwotCQlub3RpZnlRdWV1ZS5hZGQobmV3IE5vdGlmeUNvbnRleHQobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKSk7Ci0JCS8vIFRPRE8tZnV0dXJlOiB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHdheSB0aGFuIHJlbHlpbmcgb24gYXN5bmMKLQkJLy8gZXhlYwotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBnZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkpCi0JCQlnZXREaXNwbGF5KCkudGltZXJFeGVjKGRlbGF5TVNlY3MsIHRoaXMpOwotCQllbHNlCi0JCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXREaXNwbGF5KCkgIT0gbnVsbCkgewotCQkJCQkJZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhkZWxheU1TZWNzLCB0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCX0KLQotCURpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGlzIGludGVuZGVkIG9ubHkgZm9yIHRpbWVyRXhlYygpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlsYXN0VXBkYXRlciA9IG5ldyBTdHlsZVZpZXdVcGRhdGVyKCk7Ci0JCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobGFzdFVwZGF0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gY29udGFpbmluZyBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQsCi0JICogd2hpY2ggcmVwcmVzZW50cyBhIG5vZGUgaW4gYSB0cmVlLiBUaGUgZGlmZmVyZW5jZSB0bwotCSAqIDxjb2RlPklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKE9iamVjdCk8L2NvZGU+IGlzIGFzCi0JICogZm9sbG93czogPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIHRyZWUKLQkgKiB2aWV3ZXIncyByb290IGVsZW1lbnRzLiBNZXRob2QgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IGlzIHVzZWQgdG8KLQkgKiBvYnRhaW4gdGhlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gbm9kZSBpbiB0aGUgdHJlZSwgd2hpY2ggY2FuIGNhbiBiZSBhCi0JICogcm9vdCBub2RlLCB0b28uCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBvYmplY3Q7Ci0KLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLlBBR0VSVUxFX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUpIHsKLQkJCQlmb3IgKG5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKTsgbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCS8vIG5vcAotCQkJCX0KLQkJCX0KLQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ1NTTm9kZSBjaGlsZCA9IChub2RlICE9IG51bGwpID8gbm9kZS5nZXRGaXJzdENoaWxkKCkgOiBudWxsOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgJiYgIShjaGlsZCBpbnN0YW5jZW9mIE1lZGlhTGlzdCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBSZXF1aXJlZCB0byBjb3JyZWN0bHkgY29ubmVjdCB0aGUgcmVmcmVzaGluZyBiZWhhdmlvciB0bwotCQkJCSAqIHRoZSB0cmVlCi0JCQkJICovCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIGNoaWxkKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQl9Ci0JCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIHdpdGggdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEKLQkgKiBsaXN0IGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUaGUgcm9vdCBpcyB1c3VhbGx5IGFuIGluc3RhbmNlIG9mIGFuIFhNTFN0cnVjdHVyZWRNb2RlbCBpbgotCQkvLyB3aGljaCBjYXNlIHdlIHdhbnQgdG8gZXh0cmFjdCB0aGUgZG9jdW1lbnQuCi0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJQXJyYXlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBpbnRlcm5hbEdldEVsZW1lbnRzKG9iamVjdCwgdik7Ci0JCQlhZGRFbGVtZW50cyhvYmplY3QsIHYpOwotCQkJT2JqZWN0W10gZWxlbWVudHMgPSB2LnRvQXJyYXkoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCS8qCi0JCQkJICogUmVxdWlyZWQgdG8gY29ycmVjdGx5IGNvbm5lY3QgdGhlIHJlZnJlc2hpbmcgYmVoYXZpb3IgdG8KLQkJCQkgKiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50c1tpXSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LCBmb3IgdXNlIGluIHRoZQotCSAqIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBUaGUgdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCBpbWFnZS4gRWxlbWVudAotCSAqICAgICAgICAgICAgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldAotCSAqICAgICAgICAgICAgdG8gdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0TGFiZWxJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlDU1NJbWFnZUhlbHBlciBoZWxwZXIgPSBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQkJcmV0dXJuIGhlbHBlci5nZXRJbWFnZShDU1NJbWFnZVR5cGUuZ2V0SW1hZ2VUeXBlKChJQ1NTTm9kZSkgZWxlbWVudCkpOwotCQkJLy8gSW1hZ2UgaW1hZ2UgPSBnZXRDU1NOb2RlSW1hZ2UoZWxlbWVudCk7Ci0JCQkvLyByZXR1cm4gaW1hZ2U7Ci0JCQkvLyByZXR1cm4gZ2V0QWRhcHRlcihlbGVtZW50KS5nZXRMYWJlbEltYWdlKChJQ1NTTm9kZSkgZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LCBmb3IgdXNlIGluIHRoZQotCSAqIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBUaGUgdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCB0ZXh0LiBFbGVtZW50IGNhbgotCSAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyBubyBpbnB1dCBvYmplY3QgaXMgc2V0IHRvCi0JICogICAgICAgICAgICB0aGUgdmlld2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIFRoaXMgd2FzIHJldHVybmluZyBudWxsLCBvbiBvY2Nhc2lvbiAuLi4gcHJvYmFibHkgc2hvdWxkIG5vdCBiZSwKLQkJLy8gYnV0Ci0JCS8vIHRvb2sgdGhlIHF1aWNrIGFuZCBlYXN5IHdheSBvdXQgZm9yIG5vdy4gKGRtdyAzLzgvMDEpCi0KLQkJU3RyaW5nIHJlc3VsdCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1lZGlhVGV4dDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJc3dpdGNoICgoKElDU1NOb2RlKSBlbGVtZW50KS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoSUNTU1N0eWxlUnVsZSkgZWxlbWVudCkuZ2V0U2VsZWN0b3JzKCkuZ2V0U3RyaW5nKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoQ1NTSW1wb3J0UnVsZSkgZWxlbWVudCkuZ2V0SHJlZigpOwotCQkJCQltZWRpYVRleHQgPSBnZXRNZWRpYVRleHQoKENTU0ltcG9ydFJ1bGUpIGVsZW1lbnQpOwotCQkJCQlpZiAobWVkaWFUZXh0ICE9IG51bGwgJiYgMCA8IG1lZGlhVGV4dC5sZW5ndGgoKSkgewotCQkJCQkJcmVzdWx0ICs9ICIgKCIgKyBtZWRpYVRleHQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuUEFHRVJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJAcGFnZSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJwcm9wZXJ0aWVzIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgZWxlbWVudCkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoSUNTU1ByaW1pdGl2ZVZhbHVlKSBlbGVtZW50KS5nZXRTdHJpbmdWYWx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLk1FRElBUlVMRV9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gIkBtZWRpYSI7Ly8kTk9OLU5MUy0xJAotCQkJCQltZWRpYVRleHQgPSBnZXRNZWRpYVRleHQoKElDU1NNZWRpYVJ1bGUpIGVsZW1lbnQpOwotCQkJCQlpZiAobWVkaWFUZXh0ICE9IG51bGwgJiYgMCA8IG1lZGlhVGV4dC5sZW5ndGgoKSkgewotCQkJCQkJcmVzdWx0ICs9ICIgKCIgKyBtZWRpYVRleHQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJAY2hhcnNldCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLk1FRElBTElTVF9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gKChNZWRpYUxpc3QpIGVsZW1lbnQpLmdldE1lZGlhVGV4dCgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCS8vIElDU1NOb2RlIG5vZGUgPSAoKElDU1NOb2RlKWVsZW1lbnQpOwotCQkvLyByZXN1bHQgPSBnZXRBZGFwdGVyKGVsZW1lbnQpLmdldExhYmVsVGV4dCgoSUNTU05vZGUpIGVsZW1lbnQpOwotCQkvLyB9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhpcyBtZXRob2QgY2FuIHJldHVybgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCB0aGUgcGFyZW50IGNhbid0IGJlIGNvbXB1dGVkLiBJbgotCSAqIHRoaXMgY2FzZSB0aGUgdHJlZSB2aWV3ZXIgY2FuJ3QgZXhwYW5kIGEgZ2l2ZW4gbm9kZSBjb3JyZWN0bHkgaWYKLQkgKiByZXF1ZXN0ZWQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIG5vZGUgPSAoKElDU1NOb2RlKSBvYmplY3QpLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJCS8qCi0JCQkJICogUmVxdWlyZWQgdG8gYWxzbyBjb3JyZWN0bHkgY29ubmVjdCBzdHlsZSBkZWNsYXJhdGlvbiB0byB0aGUKLQkJCQkgKiByZWZyZXNoaW5nIGJlaGF2aW9yIGluIHRoZSB0cmVlCi0JCQkJICovCi0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCSgoSU5vZGVOb3RpZmllcikgbm9kZSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLgotCSAqIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyByZXR1cm4gZ2V0QWRhcHRlcihvYmplY3QpLmhhc0NoaWxkcmVuKChJQ1NTTm9kZSkgb2JqZWN0KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkvKgotCQkJICogUmVxdWlyZWQgdG8gY29ycmVjdGx5IGNvbm5lY3QgdGhlIHJlZnJlc2hpbmcgYmVoYXZpb3IgdG8gdGhlCi0JCQkgKiB0cmVlCi0JCQkgKi8KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJfQotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZQotCQkJCXJldHVybiAoKElDU1NOb2RlKSBvYmplY3QpLmhhc0NoaWxkTm9kZXMoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRzKE9iamVjdCBlbGVtZW50LCBBcnJheUxpc3QgdikgewotCi0JCUlDU1NOb2RlIG5vZGU7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCUlDU1NNb2RlbCBtb2RlbCA9IChJQ1NTTW9kZWwpIGVsZW1lbnQ7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCW5vZGUgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJbm9kZSA9ICgoSUNTU05vZGUpIGVsZW1lbnQpLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm47Ci0KLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJdi5hZGQobm9kZSk7Ci0JCQl9Ci0KLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1lZGlhVGV4dChDU1NSdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlDU1NOb2RlIGNoaWxkID0gKHJ1bGUgIT0gbnVsbCkgPyAoKElDU1NOb2RlKSBydWxlKS5nZXRGaXJzdENoaWxkKCkgOiBudWxsOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsKLQkJCQlyZXN1bHQgPSAoKE1lZGlhTGlzdCkgY2hpbGQpLmdldE1lZGlhVGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YmNjNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUyBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUyhPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgbm9kZSkgewotCQlpZiAoc2luZ2xldG9uQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgdGhlIEpGYWNlTm9kZUFkYXB0ZXIKLQkJCXNpbmdsZXRvbkFkYXB0ZXIgPSBuZXcgQ1NTTm9kZUFkYXB0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkFkYXB0ZXI7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJjMmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3Q7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBvbmx5IGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRoYXQgeW91IHNob3VsZAotICogICAgICAgICAgICAgYWN0dWFsbHkgaW1wbGVtZW50IHlvdXJzZWxmLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFNldHRpbmdzUmVnaXN0cnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gQ1NTVUlNZXNzYWdlcy5VSV9ub25lOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENTU01ldGFNb2RlbFJlZ2lzdHJ5SW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUl0ZXJhdG9yIGkgPSByZWcuZ2V0UHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgaWQgPSBwcm9maWxlLmdldFByb2ZpbGVJRCgpOwotCQkJU3RyaW5nIG5hbWUgPSBwcm9maWxlLmdldFByb2ZpbGVOYW1lKCk7Ci0JCQljb21iby5hZGQobmFtZSwgaWQpOwotCQl9Ci0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOGQwNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ29udGVudFNldHRpbmdzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSUNvbnRlbnRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbWJvTGlzdE9uUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSBDU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW5zdGVhZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIHsKLQotCXByaXZhdGUgZmluYWwgaW50IE5fQ1NTX1BST0ZJTEUgPSAwOwotCi0KLQotCXB1YmxpYyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW51bWJlck9mQ29tYm8gPSAxOwotCQludW1Db2xzID0gMjsKLQkJbnVtUm93cyA9IDE7Ci0JCWNvbWJvID0gbmV3IENvbWJvTGlzdE9uUHJvcGVydHlQYWdlW3N1cGVyLm51bWJlck9mQ29tYm9dOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ1NTQ29tYm9Cb3goKSB7Ci0JCXN1cGVyLmNvbWJvW05fQ1NTX1BST0ZJTEVdID0gc3VwZXIuY3JlYXRlQ29tYm9Cb3hPZihDU1NfTEFCRUwpOwotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oY29tYm9bTl9DU1NfUFJPRklMRV0pOwotCQlpZiAoY29tYm9bTl9DU1NfUFJPRklMRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fQ1NTX1BST0ZJTEVdLCBpbml0VmFsdWUpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKSB7Ci0KLQkJaW50IHR5cGUgPSAoKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpKS5nZXRUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJLy9jb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocHJvcGVydHlQYWdlLG51bUNvbHMsbnVtUm93cyk7Ci0JCQkJY3JlYXRlQ1NTQ29tYm9Cb3goKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLkNTU19DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaXMgaW5zdGFudGlhdGVkIGJ5IHJlc291cmNlIGV4Y2VwdCBGSUxFIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWVJbkNvbWJvLCBpbnQgaW5kZXgpIHsKLQotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fQ1NTX1BST0ZJTEUgOgotCQkJCS8vIGNzcwotCQkJCXByb3BlcnRpZXMucHV0KElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBwdXRTZWxlY3RlZFByb3BlcnR5SW50bygpIGluIGNsYXNzIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTm9uZVByb3BlcnR5KGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fQ1NTX1BST0ZJTEUgOgotCQkJCS8vIGNzcwotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBkZWxldGVOb25lUHJvcGVydHkoKSBpbiBjbGFzcyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY1ZmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGZpbmFsIGNsYXNzIENTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9OT05FID0gQ1NTVUlNZXNzYWdlcy5VSV9ub25lOwotCi0JcHJpdmF0ZSBDb21ibyBmUHJvZmlsZUNvbWJvOwotCXByaXZhdGUgTGlzdCBmUHJvZmlsZUlkczsKLQotCXB1YmxpYyBDU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcHJvcGVydHlQYWdlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJLy8gQ1NTIFByb2ZpbGUgY29udHJvbAotCQlUZXh0IGxhbmd1YWdlTGFiZWwgPSBuZXcgVGV4dChwcm9wZXJ0eVBhZ2UsIFNXVC5SRUFEX09OTFkpOwotCQlsYW5ndWFnZUxhYmVsLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5DU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMSk7Ci0JCWZQcm9maWxlQ29tYm8gPSBuZXcgQ29tYm8ocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZQcm9maWxlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlwb3B1bGF0ZVZhbHVlcygpOwotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5DU1NfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCVN0cmluZyBwcm9maWxlID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCAmJiBwcm9maWxlLmxlbmd0aCgpID4gMCkgewotCQkJLyoKLQkJCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgc2VsZWN0Ci0JCQkgKiBub25lLgotCQkJICovCi0JCQlpbmRleCA9IGZQcm9maWxlSWRzLmluZGV4T2YocHJvZmlsZSk7Ci0JCX0KLQkJaW5kZXggPSBpbmRleCA+PSAwID8gaW5kZXggOiAwOwotCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmFsdWVzKCkgewotCQlmUHJvZmlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZlByb2ZpbGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmUHJvZmlsZUlkcy5hZGQobnVsbCk7Ci0KLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJZlByb2ZpbGVDb21iby5hZGQobmFtZSk7Ci0JCQlmUHJvZmlsZUlkcy5hZGQoaWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZQcm9maWxlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZQcm9maWxlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUNTU0NvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2MWFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ2xlYW51cFByb2Nlc3NvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBDbGVhbnVwIGFjdGlvbiBkZWxlZ2F0ZSBmb3IgQ1NTIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJZmluYWwgSVRleHRFZGl0b3IgZWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJRGlhbG9nIGNsZWFudXBEaWFsb2cgPSBuZXcgQ2xlYW51cERpYWxvZ0NTUyhlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKGNsZWFudXBEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCS8vIHNldHVwIHJ1bm5hYmxlCi0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCQkJCQkJaWYgKGNsZWFudXBQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnCi0JCQkJCQkvLyBtb2RlbCBjaGFuZ2UKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkvLyBydW4KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJLy8gbW9kZWwKLQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ2xlYW51cFByb2Nlc3NvciA9PSBudWxsKQotCQkJZkNsZWFudXBQcm9jZXNzb3IgPSBuZXcgQ2xlYW51cFByb2Nlc3NvckNTUygpOwotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMWMyNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0NTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRGlhbG9nQ1NTIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgYm9vbGVhbiBlbWJlZGRlZENTUzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbklkZW50Q2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94UXVvdGVWYWx1ZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0KLQkvKioKLQkgKiBDU1NDbGVhbnVwRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBDbGVhbnVwRGlhbG9nQ1NTKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGlzRW1iZWRkZWRDU1MoKSkKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNTU19DbGVhbnVwX1VJXyk7Ci0JCWVsc2UKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBfVUlfKTsKLQotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCXBhbmVsLnNldExheW91dChsYXlvdXQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFuZWwsIElIZWxwQ29udGV4dElkcy5DU1NfQ0xFQU5VUF9IRUxQSUQpOwotCi0JCS8vIENvbnZlcnQgaWRlbnQgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBpZGVudENhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJaWRlbnRDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJZGVudGlmaWVyX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJJZGVudGlmaWVyIGNhc2U6IgotCQkvLwkJQ2FudmFzIGlkZW50Q2FzZSA9IG5ldyBDYW52YXMocGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JvdXAgaWRlbnRDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCWlkZW50Q2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuSWRlbnRpZmllcl9jYXNlX19VSV8pOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpZGVudENhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlciA9IG5ldyBCdXR0b24oaWRlbnRDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuVXBwZXJfVUlfKTsKLQotCQkvLyBDb252ZXJ0IHByb3BlcnR5IG5hbWUgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBwcm9wTmFtZUNhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJcHJvcE5hbWVDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJQcm9wZXJ0eSBuYW1lIGNhc2U6IgotCQkvLwkJQ2FudmFzIHByb3BOYW1lQ2FzZSA9IG5ldyBDYW52YXMocGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JvdXAgcHJvcE5hbWVDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCXByb3BOYW1lQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJvcGVydHlfbmFtZV9jYXNlX19VSV8pOwotCQloTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJcHJvcE5hbWVDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyA9IG5ldyBCdXR0b24ocHJvcE5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlciA9IG5ldyBCdXR0b24ocHJvcE5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHByb3BOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0KLQkJLy8gQ29udmVydCBwcm9wZXJ0eSBWYWx1ZSBjYXNlCi0JCS8vIEFDQzogR3JvdXAgcmFkaW8gYnV0dG9ucyB0b2dldGhlciBzbyBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJLy8JCUxhYmVsIHByb3BWYWx1ZUNhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJcHJvcFZhbHVlQ2FzZUxhYmVsLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvcGVydHlfdmFsdWVfY2FzZV9fVUlfIikpOwotCQkvLyAvLyROT04tTkxTLTEkID0gIlByb3BlcnR5IHZhbHVlIGNhc2U6IgotCQkvLwkJQ2FudmFzIHByb3BWYWx1ZUNhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCUdyb3VwIHByb3BWYWx1ZUNhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJcHJvcFZhbHVlQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJvcGVydHlfdmFsdWVfY2FzZV9fVUlfKTsKLQkJaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXByb3BWYWx1ZUNhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcyA9IG5ldyBCdXR0b24ocHJvcFZhbHVlQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlciA9IG5ldyBCdXR0b24ocHJvcFZhbHVlQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHByb3BWYWx1ZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuVXBwZXJfVUlfKTsKLQotCQlpZiAoIWlzRW1iZWRkZWRDU1MoKSkgewotCQkJLy8gQ29udmVydCBzZWxlY3RvciB0YWcgY2FzZQotCQkJLy8gQUNDOiBHcm91cCByYWRpbyBidXR0b25zIHRvZ2V0aGVyIHNvIGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQkJLy8JCQlMYWJlbCBzZWxlY3RvclRhZ0Nhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkJLy8JCQlzZWxlY3RvclRhZ0Nhc2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdG9yX3RhZ19uYW1lX2Nhc2VfX1VJXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiU2VsZWN0b3IgdGFnIG5hbWUgY2FzZToiCi0JCQkvLwkJCUNhbnZhcyBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCQlHcm91cCBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfKTsKLQkJCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzID0gbmV3IEJ1dHRvbihzZWxlY3RvclRhZ0Nhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yVGFnQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yVGFnQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5VcHBlcl9VSV8pOwotCQl9Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZVZhbHVlcyA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5RdW90ZV92YWx1ZXNfVUlfKTsKLQotCQlpZiAoIWlzRW1iZWRkZWRDU1MoKSkgewotCQkJLy8gRm9ybWF0IHNvdXJjZQotCQkJZkNoZWNrQm94Rm9ybWF0U291cmNlID0gbmV3IEJ1dHRvbihwYW5lbCwgU1dULkNIRUNLKTsKLQkJCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQl9Ci0KLQkJc2V0Q2xlYW51cE9wdGlvbnMoKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRDU1MoKSB7Ci0JCXJldHVybiBlbWJlZGRlZENTUzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1cGRhdGVDbGVhbnVwT3B0aW9ucygpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xlYW51cE9wdGlvbnMoKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZkNoZWNrQm94UXVvdGVWYWx1ZXMgIT0gbnVsbCkKLQkJCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFNlbGVjdGlvbihzdGd5LmlzUXVvdGVWYWx1ZXMoKSk7Ci0KLQkJaWYgKGZDaGVja0JveEZvcm1hdFNvdXJjZSAhPSBudWxsKQotCQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihzdGd5LmlzRm9ybWF0U291cmNlKCkpOwotCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbWJlZGRlZENTUwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkQ1NTKGJvb2xlYW4gbmV3RW1iZWRkZWRDU1MpIHsKLQkJZW1iZWRkZWRDU1MgPSBuZXdFbWJlZGRlZENTUzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xlYW51cE9wdGlvbnMoKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRJZGVudENhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKTsKLQkJCWVsc2UgaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0UHJvcE5hbWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5VUFBFUik7Ci0JCQllbHNlIGlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5BU0lTKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRTZWxlY3RvclRhZ0Nhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZkNoZWNrQm94UXVvdGVWYWx1ZXMgIT0gbnVsbCkKLQkJCXN0Z3kuc2V0UXVvdGVWYWx1ZXMoZkNoZWNrQm94UXVvdGVWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCWlmIChmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgIT0gbnVsbCkKLQkJCXN0Z3kuc2V0Rm9ybWF0U291cmNlKGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gc2F2ZSB0aGVzZSB2YWx1ZXMgdG8gcHJlZmVyZW5jZXMKLQkJKChDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKSBzdGd5KS5zYXZlT3B0aW9ucygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0NTU0VkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9DU1NFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyMzY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0NTU0VkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjsKLQotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBDU1MgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU1RZTEVTSEVFVCA9ICJpY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9DSEFSU0VUID0gImljb25zL2Z1bGwvb2JqMTYvY2hhcnNldF9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfRk9OVEZBQ0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9mb250ZmFjZV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfSU1QT1JUID0gImljb25zL2Z1bGwvb2JqMTYvbGlua19ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfTUVESUEgPSAiaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfUEFHRSA9ICJpY29ucy9mdWxsL29iajE2L3BhZ2VfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX1NUWUxFID0gImljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX1VOS05PV04gPSAiaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9DTEFTUyA9ICJpY29ucy9mdWxsL29iajE2L2NsYXNzX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0lEID0gImljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfUFNFVURPID0gImljb25zL2Z1bGwvb2JqMTYvcHNldWRvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX1RBRyA9ICJpY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9MSU5LID0gImljb25zL2Z1bGwvb2JqMTYvbGlua19zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9ERUZBVUxUID0gImljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVkFMVUVfRlVOQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9mdW5jdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WQUxVRV9OVU1CRVIgPSAiaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTFVFX1NUUklORyA9ICJpY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9BVVJBTCA9ICJpY29ucy9mdWxsL29iajE2L2F1cmFsX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0JPWCA9ICJpY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCA9ICJpY29ucy9mdWxsL29iajE2L2NvbGJhY2tfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfQ09OVEVOVCA9ICJpY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfRk9OVCA9ICJpY29ucy9mdWxsL29iajE2L2ZvbnRfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfUEFHRSA9ICJpY29ucy9mdWxsL29iajE2L3BhZ2VkbWVkaWFfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfVEFCTEVTID0gImljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfVEVYVCA9ICJpY29ucy9mdWxsL29iajE2L3RleHRfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfVUkgPSAiaWNvbnMvZnVsbC9vYmoxNi91aV9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9WSVNVQUwgPSAiaWNvbnMvZnVsbC9vYmoxNi92aXN1YWxfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfREVGQVVMVCA9ICJpY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RFTVBMQVRFID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV0NTU0ZJTEUgPSAiaWNvbnMvZnVsbC93aXpiYW4vbmV3Y3NzZmlsZV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBjNGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgQ1NTIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IENTU1VJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gQ1NTIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyArIl9zb3VyY2VfSGVscElkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ1NTIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTAiOyAvLyROT04tTkxTLTEkCi0JLy8gQ1NTIFNvdXJjZSBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfU09VUkNFX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAxMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDU1MgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDEyIjsgLy8kTk9OLU5MUy0xJAotCS8vIENTUyBUZW1wbGF0ZSBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAxMyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBDbGVhbnVwIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DTEVBTlVQX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTMwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBDb250ZW50IFNldHRpbmdzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEID0gUFJFRklYICsgIm1pc2MwMTgwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIENTUyBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAiY3NzdzAwMTAiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiNGQzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5DU1NFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIENTU0ltYWdlSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDU1NJbWFnZUhlbHBlciBmSW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU0ltYWdlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsJLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIE1hcCBmVHlwZU1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU0ltYWdlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENTU1VJUGx1Z2luLklELCByZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQlkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQl9IGVsc2UgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENTU1VJUGx1Z2luLklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogYnkgdHlwZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShDU1NJbWFnZVR5cGUgdHlwZSkgewotCQlpZiAoZlR5cGVNYXAgPT0gbnVsbCkgewotCQkJZlR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TVFlMRVNIRUVULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TVFlMRVNIRUVUKTsKLQotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX0NIQVJTRVQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfQ0hBUlNFVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfRk9OVEZBQ0UsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfRk9OVEZBQ0UpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX0lNUE9SVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9JTVBPUlQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX01FRElBLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX01FRElBKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9QQUdFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1BBR0UpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX1NUWUxFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1NUWUxFKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9VTktOT1dOLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1VOS05PV04pOwotCi0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0NMQVNTLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9DTEFTUyk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0lELCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9JRCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX1BTRVVETywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfUFNFVURPKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfVEFHLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9UQUcpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9MSU5LLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9MSU5LKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfREVGQVVMVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfREVGQVVMVCk7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuVkFMVUVfRlVOQ1RJT04sIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1ZBTFVFX0ZVTkNUSU9OKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuVkFMVUVfTlVNQkVSLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9WQUxVRV9OVU1CRVIpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1ZBTFVFX1NUUklORyk7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQVVSQUwsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0FVUkFMKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQk9YLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9CT1gpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0NPTlRFTlQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0NPTlRFTlQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9GT05ULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9GT05UKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfUEFHRSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfUEFHRSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1RBQkxFUywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVEFCTEVTKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfVEVYVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVEVYVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1VJLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9VSSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1ZJU1VBTCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVklTVUFMKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfREVGQVVMVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfREVGQVVMVCk7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlKChTdHJpbmcpIGZUeXBlTWFwLmdldCh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogYnkgcmVsYXRpdmUgcGF0aChmcm9tIGhlcmUpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODM1Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU0ltYWdlVHlwZSB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmTmFtZTsKLQotCXByaXZhdGUgQ1NTSW1hZ2VUeXBlKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTVFlMRVNIRUVUID0gbmV3IENTU0ltYWdlVHlwZSgiU1RZTEVTSEVFVCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX0NIQVJTRVQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJSVUxFX0NIQVJTRVQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfRk9OVEZBQ0UgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJSVUxFX0ZPTlRGQUNFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX0lNUE9SVCA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX01FRElBID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9NRURJQSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9QQUdFID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9QQUdFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX1NUWUxFID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9TVFlMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9VTktOT1dOID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9VTktOT1dOIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0NMQVNTID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfQ0xBU1MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0lEID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfSUQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0RFRkFVTFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9ERUZBVUxUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9QU0VVRE8gPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9QU0VVRE8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX1RBRyA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX1RBRyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU0VMRUNUT1JfTElOSyA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0xJTksiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgVkFMVUVfRlVOQ1RJT04gPSBuZXcgQ1NTSW1hZ2VUeXBlKCJWQUxVRV9GVU5DVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgVkFMVUVfTlVNQkVSID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfTlVNQkVSIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBWQUxVRV9TVFJJTkcgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJWQUxVRV9TVFJJTkciKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfQVVSQUwgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9BVVJBTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfQk9YID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQk9YIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0NPTlRFTlQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9DT05URU5UIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9GT05UID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfRk9OVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfUEFHRSA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1BBR0UiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1RBQkxFUyA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1RBQkxFUyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfVEVYVCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1VJID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfVUkiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1ZJU1VBTCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1ZJU1VBTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfREVGQVVMVCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0RFRkFVTFQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYnkgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShJQ1NTTm9kZSBub2RlKSB7Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0NoYXJzZXRSdWxlKSB7Ci0JCQlpbWFnZVR5cGUgPSBSVUxFX0NIQVJTRVQ7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9GT05URkFDRTsKLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTSW1wb3J0UnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9JTVBPUlQ7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9NRURJQTsKLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUGFnZVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfUEFHRTsKLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlKSB7Ci0JCQlpbWFnZVR5cGUgPSBnZXRJbWFnZVR5cGUoKChJQ1NTU3R5bGVSdWxlKSBub2RlKS5nZXRTZWxlY3RvcnMoKSk7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pIHsKLQkJCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEltYWdlVHlwZShwYXJlbnQpOwotCQkJfQotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJU3RyaW5nIG5hbWUgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJCUlDU1NEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCUlDU1NNb2RlbCBtb2RlbCA9IChkb2MgIT0gbnVsbCkgPyBkb2MuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCQlDU1NNZXRhTW9kZWxGaW5kZXIgZmluZGVyID0gQ1NTTWV0YU1vZGVsRmluZGVyLmdldEluc3RhbmNlKCk7Ci0JCQlDU1NNZXRhTW9kZWwgbWV0YU1vZGVsID0gZmluZGVyLmZpbmRNZXRhTW9kZWxGb3IobW9kZWwpOwotCQkJLy8gaXMgZm9udC1mYWNlIHJ1bGUgPwotCQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpIHsKLQkJCQkJaW1hZ2VUeXBlID0gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0ZPTlQ7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGltYWdlVHlwZSA9PSBudWxsKSB7Ci0JCQkJQ1NTTU1Qcm9wZXJ0eSBwcm9wID0gbmV3IENTU01ldGFNb2RlbFV0aWwobWV0YU1vZGVsKS5nZXRQcm9wZXJ0eShuYW1lKTsKLQkJCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjYXRlZ29yeSA9IHByb3AuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWltYWdlVHlwZSA9IGdldEltYWdlVHlwZShjYXRlZ29yeSk7Ci0JCQkJfQotCQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCQlpbWFnZVR5cGUgPSBDU1NJbWFnZVR5cGUuQ0FURUdPUllfREVGQVVMVDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ZhbHVlKSB7Ci0JCQlzd2l0Y2ggKCgoQ1NTVmFsdWUpIG5vZGUpLmdldENzc1ZhbHVlVHlwZSgpKSB7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT04gOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJCWltYWdlVHlwZSA9IFZBTFVFX05VTUJFUjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0ZPUk1BVCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMIDoKLQkJCQkJaW1hZ2VUeXBlID0gVkFMVUVfRlVOQ1RJT047Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpbWFnZVR5cGUgPSBWQUxVRV9TVFJJTkc7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKElDU1NTZWxlY3Rvckxpc3Qgc2VsZWN0b3JMaXN0KSB7Ci0JCWlmIChzZWxlY3Rvckxpc3QgPT0gbnVsbCB8fCBzZWxlY3Rvckxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIFNFTEVDVE9SX0RFRkFVTFQ7Ci0JCX0KLQkJQ1NTSW1hZ2VUeXBlIGltYWdlVHlwZSA9IG51bGw7Ci0JCWludCBuU2VsZWN0b3JzID0gc2VsZWN0b3JMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgewotCQkJQ1NTSW1hZ2VUeXBlIGNhbmRpZGF0ZSA9IGdldEltYWdlVHlwZShzZWxlY3Rvckxpc3QuZ2V0U2VsZWN0b3IoaSkpOwotCQkJaWYgKGltYWdlVHlwZSA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VUeXBlID0gY2FuZGlkYXRlOwotCQkJfSBlbHNlIGlmIChpbWFnZVR5cGUgIT0gY2FuZGlkYXRlKSB7Ci0JCQkJaW1hZ2VUeXBlID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gU0VMRUNUT1JfREVGQVVMVCA6IGltYWdlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoSUNTU1NlbGVjdG9yIHNlbGVjdG9yKSB7Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBTRUxFQ1RPUl9ERUZBVUxUOwotCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCB8fCBzZWxlY3Rvci5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gaW1hZ2VUeXBlOwotCQl9Ci0JCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IHNlbGVjdG9yLmdldEl0ZW0oc2VsZWN0b3IuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJaWYgKGl0ZW0uZ2V0SXRlbVR5cGUoKSA9PSBJQ1NTU2VsZWN0b3JJdGVtLlNJTVBMRSkgewotCQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNzID0gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCWlmICgwIDwgc3MuZ2V0TnVtT2ZJRHMoKSkgewotCQkJCWltYWdlVHlwZSA9IFNFTEVDVE9SX0lEOwotCQkJfSBlbHNlIGlmICgwIDwgc3MuZ2V0TnVtT2ZDbGFzc2VzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9DTEFTUzsKLQkJCX0gZWxzZSBpZiAoMCA8IHNzLmdldE51bU9mUHNldWRvTmFtZXMoKSkgewotCQkJCWltYWdlVHlwZSA9IFNFTEVDVE9SX1BTRVVETzsKLQkJCX0gZWxzZSB7Ci0JCQkJaW1hZ2VUeXBlID0gU0VMRUNUT1JfVEFHOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoZkNhdGVnb3J5TWFwID09IG51bGwpIHsKLQkJCWZDYXRlZ29yeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJhdXJhbCIsIENBVEVHT1JZX0FVUkFMKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiYm94IiwgQ0FURUdPUllfQk9YKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiY29sb3JhbmRiYWNrZ3JvdW5kIiwgQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiY29udGVudCIsIENBVEVHT1JZX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJmb250IiwgQ0FURUdPUllfRk9OVCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInBhZ2UiLCBDQVRFR09SWV9QQUdFKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidGFibGVzIiwgQ0FURUdPUllfVEFCTEVTKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidGV4dCIsIENBVEVHT1JZX1RFWFQpOyAvLyROT04tTkxTLTEkCi0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJ1aSIsIENBVEVHT1JZX1VJKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidmlzdWFsIiwgQ0FURUdPUllfVklTVUFMKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSAoQ1NTSW1hZ2VUeXBlKSBmQ2F0ZWdvcnlNYXAuZ2V0KGNhdGVnb3J5KTsKLQkJcmV0dXJuIChpbWFnZVR5cGUgPT0gbnVsbCkgPyBDQVRFR09SWV9ERUZBVUxUIDogaW1hZ2VUeXBlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBmQ2F0ZWdvcnlNYXAgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjQ3MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBDU1MgVUkgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIENTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIENTUyBTdHlsZSBQcmVmZXJlbmNlcwotCQlTdHJpbmcgTk9CQUNLR1JPVU5EQk9MRCA9ICIgfCBudWxsIHwgZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUsIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDQyLCAwLCAyMjUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgOTUsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5ULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTI3LCAwLCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDQyLCAwLCAyMjUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUsIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5VUkksIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OLCBzdHlsZVZhbHVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTkxLCA2MywgNjMpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IsIHN0eWxlVmFsdWUpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgbmV3IGNzcyBmaWxlIHRlbXBsYXRlIHRvIHVzZSBpbiBuZXcgZmlsZSB3aXphcmQKLQkJLyoKLQkJICogTmVlZCB0byBmaW5kIHRlbXBsYXRlIG5hbWUgdGhhdCBnb2VzIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBpZCAobmFtZQotCQkgKiBtYXkgY2hhbmdlIGZvciBkaWZmZXJudCBsYW5ndWFnZSkKLQkJICovCi0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkuZmluZFRlbXBsYXRlQnlJZCgib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMubmV3Y3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWI3ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBDU1MgVUkKLSAqLwotcHVibGljIGNsYXNzIENTU1VJUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIENTU1VJUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIGluc3RhbmNlCi0JfQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgQ1NTIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0NvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0NvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGY5MTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi1wdWJsaWMgY2xhc3MgQ1NTQ29sb3JQYWdlIGV4dGVuZHMgQWJzdHJhY3RDb2xvclBhZ2UgewotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCi0JCS8vIGFzc2lnbmluZyBvbmUgaGVscCBmb3Igd2hvbGUgZ3JvdXAKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29sb3JpbmdDb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb2xvcmluZ0NvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIGFzc2lnbmluZyBvbmUgaGVscCBmb3Igd2hvbGUgZ3JvdXAKLQkJcmV0dXJuIGNvbG9yaW5nQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIGdldFNhbXBsZVRleHQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU2FtcGxlOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRTdHlsZU1hcAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPLCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TLCBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFX1NFTEVDVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8sIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCBJU3R5bGVDb25zdGFudHNDU1MuRVJST1IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yTm9ybWFsKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JBdG1hcmtSdWxlKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTZWxlY3Rvcik7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yTWVkaWEpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ29tbWVudCk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eU5hbWUpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5VmFsdWUpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuVVJJLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JVcmkpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTdHJpbmcpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNvbG9uKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbik7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ3VybHlCcmFjZSk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yRXJyb3IpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR1cFBpY2tlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTKS5nZXRQYXJzZXIoKSk7Ci0KLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDc5ZjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHNjcm9sbGVkQ29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2Nyb2xsZWRDb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5DU1NfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQkJCi0JCXNldFNpemUoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHNjcm9sbGVkQ29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ0dyb3VwKCk7Ci0KLSAgICAgICAgdXBkYXRlQXBwbHlCdXR0b24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FiMjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU1NvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JLy8gQ29udGVudCBBc3Npc3QKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdXRvUHJvcG9zZTsKLQlwcm90ZWN0ZWQgTGFiZWwgZkF1dG9Qcm9wb3NlTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBmQXV0b1Byb3Bvc2VUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZJZGVudExvd2VyOwotCS8vIGNhc2Ugb2Ygb3V0cHV0IGNoYXJhY3RlcgotCS8vIGNhc2Ugb2YgaWRlbnRpZmllcgotCXByb3RlY3RlZCBCdXR0b24gZklkZW50VXBwZXI7Ci0JcHJpdmF0ZSBTcGlubmVyIGZJbmRlbnRhdGlvblNpemU7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nU3BhY2VzOwotCQotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1RhYnM7Ci0JLy8gRm9ybWF0dGluZwotCXByb3RlY3RlZCBMYWJlbCBmTGluZVdpZHRoTGFiZWw7Ci0JCi0JcHJvdGVjdGVkIFRleHQgZkxpbmVXaWR0aFRleHQ7Ci0JLy8gcHJvaGliaXQgd3JhcHBpbmcgaWYgc3R5bGUgYXR0cmlidXRlCi0JcHJvdGVjdGVkIEJ1dHRvbiBmTm93cmFwQXR0cjsKLQkvLyBvbmUgcHJvcGVydHkgcGVyIG9uZSBsaW5lCi0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvcGVydHlQZXJMaW5lOwotCXByb3RlY3RlZCBCdXR0b24gZlByb3BOYW1lTG93ZXI7Ci0KLQkvLyBjYXNlIG9mIHByb3BlcnR5IG5hbWUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wTmFtZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlByb3BWYWx1ZUxvd2VyOwotCS8vIGNhc2Ugb2YgcHJvcGVydHkgdmFsdWUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wVmFsdWVVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZTcGxpdE11bHRpQXR0cnM7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0lOREVOVEFUSU9OX1NJWkUgPSAxNjsKLQlwcml2YXRlIGZpbmFsIGludCBNSU5fSU5ERU5UQVRJT05fU0laRSA9IDA7Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5DU1NfUFJFRldFQlhfU09VUkNFX0hFTFBJRCk7Ci0KLQkJY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDb250ZW50QXNzaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIG5vdCBjb250ZW50IGFzc2lzdCwgYnV0IHByZWZlcnJlZCBjYXNlCi0JCUdyb3VwIGNhc2VHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMyk7Ci0JCWNhc2VHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlR3JvdXApOwotCi0JCS8vIHVzZSBncm91cCBmb3IgcmFkaW8gYnV0dG9ucyBzbyB0aGF0IGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQlHcm91cCBpZGVudEdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJaWRlbnRHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlSWRlbnQpOwotCQlmSWRlbnRVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKGlkZW50R3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlSWRlbnRVcHBlcik7Ci0JCWZJZGVudExvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24oaWRlbnRHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VJZGVudExvd2VyKTsKLQotCQkvLyB1c2UgZ3JvdXAgZm9yIHJhZGlvIGJ1dHRvbnMgc28gdGhhdCBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJR3JvdXAgcHJvcE5hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCXByb3BOYW1lR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lKTsKLQkJZlByb3BOYW1lVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihwcm9wTmFtZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lVXBwZXIpOwotCQlmUHJvcE5hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BOYW1lR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVMb3dlcik7Ci0KLQkJLy8gdXNlIGdyb3VwIGZvciByYWRpbyBidXR0b25zIHNvIHRoYXQgYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCUdyb3VwIHByb3BWYWx1ZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJcHJvcFZhbHVlR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZSk7Ci0JCWZQcm9wVmFsdWVVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BWYWx1ZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyKTsKLQkJZlByb3BWYWx1ZUxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24ocHJvcFZhbHVlR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGZvcm1hdHRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWZvcm1hdHRpbmdHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuRm9ybWF0dGluZ19VSV8pOwotCi0JCWZMaW5lV2lkdGhMYWJlbCA9IGNyZWF0ZUxhYmVsKGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5MaW5lX3dpZHRoX19VSV8pOwotCQlmTGluZVdpZHRoVGV4dCA9IG5ldyBUZXh0KGZvcm1hdHRpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDI1OwotCQlmTGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJZkxpbmVXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlByb3BlcnR5UGVyTGluZSA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrKTsKLQkJKChHcmlkRGF0YSkgZlByb3BlcnR5UGVyTGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmTm93cmFwQXR0ciA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nV2l0aG91dEF0dHIpOwotCQkoKEdyaWREYXRhKSBmTm93cmFwQXR0ci5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCWZJbmRlbnRVc2luZ1RhYnMgPSBjcmVhdGVSYWRpb0J1dHRvbihmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3RhYnNfKTsKLQkJKChHcmlkRGF0YSkgZkluZGVudFVzaW5nVGFicy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkluZGVudFVzaW5nU3BhY2VzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBDU1NVSU1lc3NhZ2VzLkluZGVudF91c2luZ19zcGFjZXMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdTcGFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZSk7Ci0JCWZJbmRlbnRhdGlvblNpemUgPSBuZXcgU3Bpbm5lcihmb3JtYXR0aW5nR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5JbmRlbnRhdGlvbl9zaXplX3RpcCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWluaW11bShNSU5fSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWF4aW11bShNQVhfSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0SW5jcmVtZW50KDEpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFBhZ2VJbmNyZW1lbnQoNCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0JCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudFVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmSWRlbnRMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlByb3BOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZQcm9wTmFtZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcFZhbHVlVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmUHJvcFZhbHVlTG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KHByZWZzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlByb3BlcnR5UGVyTGluZS5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpOwotCQlmTm93cmFwQXR0ci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikpOwotCQkKLQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQkJCi0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBub3QgY29udGVudCBhc3Npc3QsIGJ1dCBwcmVmZXJyZWQgY2FzZQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZklkZW50VXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmSWRlbnRMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZQcm9wTmFtZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcFZhbHVlVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BWYWx1ZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChwcmVmcy5nZXREZWZhdWx0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmUHJvcGVydHlQZXJMaW5lLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpOwotCQlmTm93cmFwQXR0ci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKTsKLQkJCi0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9CQkKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBub3QgY29udGVudCBhc3Npc3QsIGJ1dCBwcmVmZXJyZWQgY2FzZQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIChmSWRlbnRVcHBlci5nZXRTZWxlY3Rpb24oKSkgPyBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDogQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCAoZlByb3BOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIChmUHJvcFZhbHVlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIGZQcm9wZXJ0eVBlckxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgZk5vd3JhcEF0dHIuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJfSBlbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczNjVmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIENTUyB0ZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIENTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIHsKLQkKLQlwdWJsaWMgQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJQ1NTVUlQbHVnaW4gY3NzVUlQbHVnaW4gPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoY3NzVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKGNzc1VJUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoY3NzVUlQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAJICBib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0gIAkgIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkgIHJldHVybiBvazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNjcmVhdGVWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyIHZpZXdlcj0gbmV3IFNvdXJjZVZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb249IG5ldyBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCXZpZXdlci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7Ci0JCUlEb2N1bWVudCBkb2N1bWVudD0gbmV3IERvY3VtZW50KCk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTEwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0vKioKLSAqIENvbnRhaW5zIGEgc2V0IG9mIHByb2plY3Rpb24gbW9kZWwgYWRkaXRpb25zL2RlbGV0aW9ucy9tb2RpZmljYXRpb25zCi0gKi8KLWNsYXNzIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBjaGFuZ2UgTm9kZSB0byBJQ1NTTm9kZQotCXByaXZhdGUgSUNTU05vZGUgZk5vZGU7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZkRlbGV0aW9uczsKLQlwcml2YXRlIE1hcCBmQWRkaXRpb25zOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZNb2RpZmljYXRpb25zOwotCi0JcHVibGljIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKElDU1NOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmOWUwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotCi0vKioKLSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIHdpdGggcHJvamVjdGlvbiBhbm5vdGF0aW9ucyBmb3IgdGhpcwotICogYWRhcHRlciBub2RlJ3MgY2hpbGRyZW4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkXAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBJQ1NTTm9kZSBmTm9kZTsKLQotCQlwdWJsaWMgVGFnUHJvamVjdGlvbkFubm90YXRpb24oSUNTU05vZGUgbm9kZSwgYm9vbGVhbiBpc0NvbGxhcHNlZCkgewotCQkJc3VwZXIoaXNDb2xsYXBzZWQpOwotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcHVibGljIElDU1NOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBEb2VzIG5vdCBwYWludCBoaWRkZW4gYW5ub3RhdGlvbnMuIEFubm90YXRpb25zIGFyZSBoaWRkZW4gd2hlbiB0aGV5Ci0JCSAqIG9ubHkgc3BhbiBvbmUgbGluZS4KLQkJICogCi0JCSAqIEBzZWUgUHJvamVjdGlvbkFubm90YXRpb24jcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIENhbnZhcyBjYW52YXMsIFJlY3RhbmdsZSByZWN0YW5nbGUpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvKgotCQkJICogb25seSBuZWVkIHRvIGNoZWNrIGFubm90YXRpb25zIHRoYXQgYXJlIGV4cGFuZGVkIGJlY2F1c2UgaGlkZGVuCi0JCQkgKiBhbm5vdGF0aW9ucyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGdpdmVuIHRoZSBjaGFuY2UgdG8KLQkJCSAqIGNvbGxhcHNlLgotCQkJICovCi0JCQlpZiAoIWlzQ29sbGFwc2VkKCkpIHsKLQkJCQkvLyB3b3JraW5nIHdpdGggcmVjdGFuZ2xlLCBzbyBsaW5lIGhlaWdodAotCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJCWlmIChtZXRyaWNzICE9IG51bGwpIHsKLQkJCQkJLy8gZG8gbm90IGRyYXcgYW5ub3RhdGlvbnMgdGhhdCBvbmx5IHNwYW4gb25lIGxpbmUgYW5kCi0JCQkJCS8vIG1hcmsgdGhlbSBhcyBub3QgdmlzaWJsZQotCQkJCQlpZiAoKHJlY3RhbmdsZS5oZWlnaHQgLyBtZXRyaWNzLmdldEhlaWdodCgpKSA8PSAxKSB7Ci0JCQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmSXNWaXNpYmxlID0gdHJ1ZTsKLQkJCXN1cGVyLnBhaW50KGdjLCBjYW52YXMsIHJlY3RhbmdsZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb24jbWFya0NvbGxhcHNlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtYXJrQ29sbGFwc2VkKCkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8vIGRvIG5vdCBtYXJrIGNvbGxhcHNlZCBpZiBhbm5vdGF0aW9uIGlzIG5vdCB2aXNpYmxlCi0JCQlpZiAoZklzVmlzaWJsZSkKLQkJCQlzdXBlci5tYXJrQ29sbGFwc2VkKCk7Ci0JCX0KLQl9Ci0KLQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZkFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIGZUYWdBbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIGZhY3RvcnkpIHsKLQkJZkFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm9qZWN0aW9uIHBvc2l0aW9uIGZyb20gdGhlIGdpdmVuIG5vZGUuIEFibGUgdG8gZ2V0Ci0JICogcHJvamVjdGlvbiBwb3NpdGlvbiBpZiBub2RlIGlzTm9kZVByb2plY3RhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBudWxsIGlmIG5vIHByb2plY3Rpb24gcG9zaXRpb24gcG9zc2libGUsIGEgUG9zaXRpb24gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oSUNTU05vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkgJiYgbm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCS8vIElEb2N1bWVudCBkb2N1bWVudCA9Ci0JCQkvLyBmQWRhcHRlckZhY3RvcnkuZ2V0UHJvamVjdGlvblZpZXdlcigpLmdldERvY3VtZW50KCk7Ci0JCQkvLyBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQkJaW50IHN0YXJ0ID0gaW5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmQgPSBpbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChzdGFydCA+PSAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQkJLy8gcmVnaW9uLWJhc2VkCi0JCQkJLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbiBpbmNyZWFzZSB3aGVuCi0JCQkJLy8gYWRkIG5ld2xpbmUKLQkJCQlwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQkvLyB0cnkgewotCQkJCS8vIC8vIGxpbmUtYmFzZWQKLQkJCQkvLyAvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uCi0JCQkJLy8gLy8gaW5jcmVhc2Ugd2hlbiBhZGQgbmV3bGluZQotCQkJCS8vIElSZWdpb24gc3RhcnRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gSVJlZ2lvbiBlbmRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChlbmQpOwotCQkJCS8vIGludCBzdGFydE9mZnNldCA9IHN0YXJ0TGluZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkvLyBpbnQgZW5kT2Zmc2V0ID0gZW5kTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSArCi0JCQkJLy8gZW5kTGluZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkvLyBpZiAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQpIHsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtCi0JCQkJLy8gc3RhcnRPZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLwotCQkJCS8vIC8vIGxpbmUtYmFzZWQKLQkJCQkvLyAvLyBubyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgcmVnaW9uIGluY3JlYXNlCi0JCQkJLy8gLy8gd2hlbiBhZGQgbmV3bGluZQotCQkJCS8vIGludCBzdGFydExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIGludCBlbmRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaWYgKGVuZExpbmUgKyAxIDwgZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpKSB7Ci0JCQkJLy8gaW50IG9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc3RhcnRMaW5lKTsKLQkJCQkvLyBpbnQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChlbmRMaW5lICsgMSk7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKG9mZnNldCwgZW5kT2Zmc2V0IC0gb2Zmc2V0KTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgbnVsbCwgeCk7Ci0JCQkJLy8gfQotCQkJfQotCQkJLy8gfQotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogRmluZCBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZSBpbiB0aGUgY3VycmVudCBsaXN0IG9mIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBnZXRFeGlzdGluZ0Fubm90YXRpb24oSUNTU05vZGUgbm9kZSkgewotCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gbnVsbDsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgYW5ubyA9PSBudWxsKSB7Ci0JCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYSA9IChUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJCUlDU1NOb2RlIG4gPSBhLmdldE5vZGUoKTsKLQkJCQlpZiAobm9kZS5lcXVhbHMobikpIHsKLQkJCQkJYW5ubyA9IGE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhbm5vOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgYSBub2RlIHR5cGUgYWJsZSB0byBmb2xkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBub2RlIGlzIHByb2plY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlzaG9ydCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gSUNTU05vZGUuU1RZTEVSVUxFX05PREUgfHwgdHlwZSA9PSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIHx8IHR5cGUgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUgfHwgdHlwZSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgfHwgdHlwZSA9PSBJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBjaGVjayBpZiBmb2xkaW5nIGlzIGV2ZW4gZW5hYmxlZCwgaWYgbm90LCBqdXN0IGlnbm9yZSBub3RpZnlDaGFuZ2VkCi0JCS8vIGV2ZW50cwotCQlpZiAoIWZBZGFwdGVyRmFjdG9yeS5pc0FjdGl2ZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyB3b3JrYXJvdW5kIGZvciBCdWc4NTM0MiAtIFNUUlVDVFJFX0NIQU5HRUQgaXMgbmV2ZXIgZmlyZWQgc28gbmVlZAotCQkvLyB0byBsaXN0ZW4gZm9yIGV2ZXJ5IEFERCwgUkVNT1ZFCi0JCS8vIGlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpICYmIChub3RpZmllcgotCQkvLyBpbnN0YW5jZW9mIElDU1NOb2RlKSkgewotCQlpZiAoKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpICYmIChub3RpZmllciBpbnN0YW5jZW9mIElDU1NOb2RlKSkgewotCQkJdXBkYXRlQWRhcHRlcigoSUNTU05vZGUpIG5vdGlmaWVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoSUNTU05vZGUgbm9kZSkgewotCQl1cGRhdGVBZGFwdGVyKG5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlIGFuZCBhZGRzIGFsbCBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIHZpZXdlciAoZm9yIG5ld2x5IGFkZGVkCi0JICogdmlld2VycykKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoSUNTU05vZGUgbm9kZSwgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCU1hcCBhZGRpdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgcHJvamVjdGlvbkFubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBnbyB0aHJvdWdoIGltbWVkaWF0ZSBjaGlsZCBub2RlcyBhbmQgZmlndXJlIG91dCBwcm9qZWN0aW9uCi0JCS8vIG1vZGVsIGFubm90YXRpb25zCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlDU1NOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24oY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQlhZGRpdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KGV4aXN0aW5nLCBuZXdQb3MpOwotCQkJCQkJLy8gcmVtb3ZlIGZyb20gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gZGVsZXRlCi0JCQkJCQlmVGFnQW5ub3RhdGlvbnMucmVtb3ZlKGV4aXN0aW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQotCQkJLy8gaW4gdGhlIGVuZCwgd2FudCB0byBkZWxldGUgYW55dGhpbmcgbGVmdG92ZXIgaW4gb2xkIGxpc3QsIGFkZAotCQkJLy8gZXZlcnl0aGluZyBpbiBhZGRpdGlvbnMsIGFuZCB1cGRhdGUgZXZlcnl0aGluZyBpbgotCQkJLy8gcHJvamVjdGlvbkFubm90YXRpb25zCi0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG9sZExpc3QgPSBudWxsOwotCQkJaWYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJb2xkTGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBtb2RpZnlMaXN0ID0gbnVsbDsKLQkJCWlmICghcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW1vZGlmeUxpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgcHJvamVjdGlvbkFubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQotCQkJLy8gc3BlY2lmaWNhbGx5IGFkZCBhbGwgYW5ub3RhdGlvbnMgdG8gdmlld2VyCi0JCQlpZiAodmlld2VyICE9IG51bGwgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKG9sZExpc3QgIT0gbnVsbCAmJiBvbGRMaXN0Lmxlbmd0aCA+IDApIHx8ICghYWRkaXRpb25zLmlzRW1wdHkoKSkgfHwgKG1vZGlmeUxpc3QgIT0gbnVsbCAmJiBtb2RpZnlMaXN0Lmxlbmd0aCA+IDApKQotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgb2xkTGlzdCwgYWRkaXRpb25zLCBtb2RpZnlMaXN0KTsKLQkJfQotCi0JCS8vIHNhdmUgbmV3IGxpc3Qgb2YgYW5ub3RhdGlvbnMKLQkJZlRhZ0Fubm90YXRpb25zID0gcHJvamVjdGlvbkFubm90YXRpb25zOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS50b1N0cmluZygpIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLnVwZGF0ZUFkYXB0ZXIgKCIgKyBub2RlTmFtZSArICIpOiIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGEyODRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogbW9kZWwgbm9kZSBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZQcm9qZWN0aW9uVmlld2VyczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MoKSB7Ci0JCXRoaXMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKE9iamVjdCBhZGFwdGVyS2V5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXkpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUyBhZGFwdGVyID0gbnVsbDsKLQotCQlpZiAoKGlzQWN0aXZlKCkpICYmICh0YXJnZXQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkpIHsKLQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHRhcmdldDsKLQkJCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQkvLyBvbmx5IGFkZCBmb3IgdG9wIHN0eWxlc2hlZXQgbm9kZQotCQkJaWYgKHR5cGUgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQkJYWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUyh0aGlzKTsKLQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZhY3RvcnkgaXMgY3VycmVudGx5IGFjdGl2ZWx5IG1hbmFnaW5nIHByb2plY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCAmJiAhZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKElDU1NOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCXF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgZm9yIGEgc3BlY2lmaWMgcHJvamVjdGlvbiB2aWV3ZXIgaWYKLQkgKiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4gT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZAotCSAqIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKElDU1NOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyBjcmVhdGUgYSBjaGFuZ2Ugb2JqZWN0IGZvciBsYXRlc3QgY2hhbmdlIGFuZCBhZGQgdG8gcXVldWUKLQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlID0gbmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5nZXQodmlld2VyKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSXRlcmF0b3IgaW5mb3MgPSBmUHJvamVjdGlvblZpZXdlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGdvIHRocm91Z2ggZXZlcnkgcHJvamVjdGlvbnZpZXdlciBhbmQgY2FsbAotCQkvLyByZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaW5mb3MgPSBmUHJvamVjdGlvblZpZXdlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCQlpbmZvcy5yZW1vdmUoKTsKLQkJCX0KLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdmlld2VyIHRvIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMgZmFjdG9yeSBpcyBhc3NvY2lhdGVkCi0JICogd2l0aAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB2aWV3ZXIncyBkb2N1bWVudCBhbmQgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JICogICAgICAgICAgICBhcmUgbm90IG51bGwKLQkgKi8KLQl2b2lkIGFkZFByb2plY3Rpb25WaWV3ZXIoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gcmVtb3ZlIG9sZCBlbnRyeSBpZiBpdCBleGlzdHMKLQkJcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCi0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgPT0gbnVsbCkgewotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBuZXcgb2JqZWN0IGNvbnRhaW5pbmcgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGl0cyBpbmZvCi0JCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbih2aWV3ZXIpOwotCQlmUHJvamVjdGlvblZpZXdlcnMucHV0KHZpZXdlciwgaW5mbyk7Ci0JCWluZm8uaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHZpZXdlciBmcm9tIHRoZSBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzCi0JICogZmFjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQkvLyByZW1vdmUgZW50cnkgZnJvbSBsaXN0IG9mIHZpZXdlcnMKLQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLnJlbW92ZSh2aWV3ZXIpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJfQotCQkJLy8gaWYgcmVtb3ZpbmcgbGFzdCBwcm9qZWN0aW9uIHZpZXdlciwgY2xlYXIgb3V0IGV2ZXJ5dGhpbmcKLQkJCWlmIChmUHJvamVjdGlvblZpZXdlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNThmZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2plY3Rpb24gdmlld2VyIGFuZCBhbHNvIG1hbmFnZXMgdXBkYXRpbmcKLSAqIHRoZSB2aWV3ZXIncyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLSAqLwotY2xhc3MgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gZG9jdW1lbnQgdG8gYmUgYXdhcmUgb2Ygd2hlbiB0byB1cGRhdGUgdGhlIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gZkluZm87Ci0KLQkJcHVibGljIERvY3VtZW50TGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJLy8gcmVnaXN0ZXIgYSBwb3N0IG5vdGlmaWNhdGlvbiByZXBsYWNlIHNvIHRoYXQgcHJvamVjdGlvbgotCQkJLy8gYW5ub3RhdGlvbiBtb2RlbCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgYWxsIGRvY3VtZW50Q2hhbmdlZAotCQkJLy8gbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZAotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbiAmJiBmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJaWYgKGZJbmZvLmhhc0NoYW5nZXNRdWV1ZWQoKSkKLQkJCQkJKChJRG9jdW1lbnRFeHRlbnNpb24pIGRvY3VtZW50KS5yZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKHRoaXMsIG5ldyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkluZm8pKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVzc2VudGlhbGx5IGEgcG9zdCBkb2N1bWVudCBjaGFuZ2VkIGxpc3RlbmVyIGJlY2F1c2UgaXQgaXMgY2FsbGVkIGFmdGVyCi0JICogZG9jdW1lbnRjaGFuZ2VkIGhhcyBiZWVuIGZpcmVkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHsKLQkJcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gZkluZm87Ci0KLQkJcHVibGljIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGVyZm9ybShJRG9jdW1lbnQgZG9jdW1lbnQsIElEb2N1bWVudExpc3RlbmVyIG93bmVyKSB7Ci0JCQlmSW5mby5hcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY3VycmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogdmlld2VyCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsIGZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotCS8qKgotCSAqIERvY3VtZW50IGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKioKLQkgKiBMaXN0ZW5lciB0byBmUHJvamVjdGlvblZpZXdlcidzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lcjsKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZG9jdW1lbnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudENoYW5naW5nID0gZmFsc2U7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0aGF0IG5lZWQgdG8gYmUgYXBwbGllZAotCSAqLwotCXByaXZhdGUgTGlzdCBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWZEb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCA9IHZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCk7Ci0JfQotCi0JSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpIHsKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9PSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQl9Ci0KLQl2b2lkIHNldElzRG9jdW1lbnRDaGFuZ2luZyhib29sZWFuIGNoYW5naW5nKSB7Ci0JCWZJc0RvY3VtZW50Q2hhbmdpbmcgPSBjaGFuZ2luZzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudENoYW5naW5nKCkgewotCQlyZXR1cm4gZklzRG9jdW1lbnRDaGFuZ2luZzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBwZW5kaW5nIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRvIHRoZQotCSAqIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQl2b2lkIGFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpIHsKLQkJTGlzdCBxdWV1ZWRDaGFuZ2VzID0gZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKTsKLQkJLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBlbmRpbmcgYW5ub3RhdGlvbiBjaGFuZ2VzIGFuZCBhcHBseQotCQkvLyB0aGVtIHRvCi0JCS8vIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkJd2hpbGUgKCFxdWV1ZWRDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgY2hhbmdlcyA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcykgcXVldWVkQ2hhbmdlcy5yZW1vdmUoMCk7Ci0JCQl0cnkgewotCQkJCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsLm1vZGlmeUFubm90YXRpb25zKGNoYW5nZXMuZ2V0RGVsZXRpb25zKCksIGNoYW5nZXMuZ2V0QWRkaXRpb25zKCksIGNoYW5nZXMuZ2V0TW9kaWZpY2F0aW9ucygpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGxvZyBpdCBiZSBjb250aW51ZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW5ub3RhdGlvbiBjaGFuZ2VzIHF1ZXVlZCB1cCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGFuZ2VzUXVldWVkKCkgewotCQlyZXR1cm4gIWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlKSB7Ci0JCS8qCi0JCSAqIGZ1dHVyZV9UT0RPOiBtYXliZSBpbXByb3ZlIGJ5IGNoZWNraW5nIGlmIGFubm90YXRpb24gcHJvamVjdGlvbgotCQkgKiBtb2RlbCBjaGFuZ2UgYWxyZWFkeSBleGlzdHMgZm9yIG5vZGUuIGlmIHNvLCB0aHJvdyBvdXQgb2xkIGNoYW5nZS4KLQkJICovCi0JCWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuYWRkKG5ld0NoYW5nZSk7Ci0KLQkJLy8gaWYgZG9jdW1lbnQgaXNuJ3QgY2hhbmdpbmcsIGdvIGFoZWFkIGFuZCBhcHBseSBpdAotCQlpZiAoIWlzRG9jdW1lbnRDaGFuZ2luZygpKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGFkZCBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlnZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBsaXN0IG9mIHF1ZXVlZCBjaGFuZ2VzIHNpbmNlIGl0IG1heSBubyBsb25nZXIKLQkJLy8gYmUgYWNjdXJhdGUKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMuY2xlYXIoKTsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5OTIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbW9kZWwgb2YgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciBDU1MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciwgSVByb2plY3Rpb25MaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkXAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEp1c3QgYWRkIGFkYXB0ZXIgdG8gdG9wIHN0eWxlc2hlZXQgbm9kZS4gVGhpcyBhZGFwdGVyIHdpbGwgdHJhY2sKLQkgKiBjaGlsZHJlbiBhZGRpdGlvbi9kZWxldGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCQkJSUNTU01vZGVsIGNzc01vZGVsID0gKElDU1NNb2RlbCkgc01vZGVsOwotCQkJCQlJQ1NTRG9jdW1lbnQgY3NzRG9jID0gY3NzTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGNzc0RvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgY3NzRG9jOwotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgYWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUykgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIoY3NzRG9jLCBmVmlld2VyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGp1c3QgY2FsbCBnZXRhZGFwdGVyIHNvIHRoZSBhZGFwdGVyIGlzIGNyZWF0ZWQKLQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUy5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyB0byB1c2Ugd2l0aCB0aGlzIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZ2V0QWRhcHRlckZhY3RvcnkoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkJCQkJLy8gZ2V0dGluZyB0aGUgcHJvamVjdGlvbm1vZGVsbm9kZWFkYXB0ZXIgZm9yIHRoZSBmaXJzdAotCQkJCQkvLyB0aW1lCi0JCQkJCS8vIHNvIGRvIHNvbWUgaW5pdGlhbGl6aW5nCi0JCQkJCWlmICghZmFjdG9yeVJlZ2lzdHJ5LmNvbnRhaW5zKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIG5ld0ZhY3RvcnkgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIGZhY3RvcnkgcmVnaXN0cnkKLQkJCQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGZhY3RvcnkKLQkJCQkJZmFjdG9yeSA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MpIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCS8vIGNsZWFyIG91dCBvbGQgaW5mbwotCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQlmRG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJLy8gc2V0IHByb2plY3Rpb24gdmlld2VyIG9uIG5ldyBkb2N1bWVudCdzIGFkYXB0ZXIgZmFjdG9yeQotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSh0cnVlKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LmFkZFByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCQl9Ci0KLQkJCWFkZEFsbEFkYXB0ZXJzKCk7Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoZmFsc2UpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIGFubm90YXRpb25zCi0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkucmVtb3ZlQWxsQW5ub3RhdGlvbnMoKTsKLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhZGFwdGVyIGZyb20gdG9wIHN0eWxlc2hlZXQgbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSAoSUNTU01vZGVsKSBzTW9kZWw7Ci0JCQkJCUlDU1NEb2N1bWVudCBjc3NEb2MgPSBjc3NNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoY3NzRG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBjc3NEb2M7Ci0JCQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJbm90aWZpZXIucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmUzYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbEZpbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIEEgSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgQ1NTIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UgewotCXByb3RlY3RlZCBJQ1NTTm9kZSBmTm9kZSA9IG51bGw7Ci0JLy8gZm9yIHBlcmZvcm1hbmNlLi4uCi0JZmluYWwgc3RhdGljIENsYXNzIEFEQVBURVJfS0VZID0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCWZpbmFsIGJvb2xlYW4gUEVSRl9HRVRERVNDUklQVE9SUyA9IGZhbHNlOwotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCXB1YmxpYyBDU1NQcm9wZXJ0eVNvdXJjZShJQ1NTTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSAgdGFyZ2V0OwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gdGhlIGRpc3BsYXlOYW1lIE1VU1QgYmUgc2V0Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUsIGZOb2RlKTsKLQkJLy8gSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3Ci0JCS8vIFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihDU1NNTU5vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5nZXROYW1lKCksIGNhdGVnb3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBjYXRlZ29yeSkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLQkJCQljYXRlZ29yeSA9IENTU1VJTWVzc2FnZXMuSU5GT19Ob3RfQ2F0ZWdvcml6ZWRfMTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlLCBjYXRlZ29yeSk7Ci0JCQkvLyBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJLy8gZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlKTsKLQkJCS8vIH0gZWxzZSB7Ci0JCQkvLyBkZXNjcmlwdG9yID0gbmV3IENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgZk5vZGUsCi0JCQkvLyBjYXRlZ29yeSk7Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGlzIG9iamVjdCB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkKLQkgKiBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyBhbGwgZGVzY3JpcHRvcnMuCi0JICovCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCUNTU01ldGFNb2RlbCBtZXRhbW9kZWwgPSBDU1NNZXRhTW9kZWxGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kTWV0YU1vZGVsRm9yKGZOb2RlKTsKLQkJSXRlcmF0b3IgaVByb3BlcnRpZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCXN3aXRjaCAoZk5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuUEFHRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tUGFyZW50ID0gbmV3IENTU01ldGFNb2RlbFV0aWwobWV0YW1vZGVsKS5nZXRNZXRhTW9kZWxOb2RlRm9yKGZOb2RlKTsKLQkJCQlpZiAobW1QYXJlbnQgIT0gbnVsbCkgewotCQkJCQlpUHJvcGVydGllcyA9IG1tUGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tTm9kZSA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKG1ldGFtb2RlbCkuZ2V0TWV0YU1vZGVsTm9kZUZvcihmTm9kZSk7Ci0JCQkJaWYgKG1tTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlQcm9wZXJ0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtbU5vZGUpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBzZXR1cCBjYXRlZ29yaWVzCi0JCU1hcCBjYXRlZ29yaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3IgaUNhdGVnb3JpZXMgPSBtZXRhbW9kZWwuZ2V0Q2F0ZWdvcmllcygpOwotCQl3aGlsZSAoaUNhdGVnb3JpZXMuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTUNhdGVnb3J5IGNhdGVnb3J5ID0gKENTU01NQ2F0ZWdvcnkpIGlDYXRlZ29yaWVzLm5leHQoKTsKLQkJCWNhdGVnb3JpZXMucHV0KGNhdGVnb3J5LmdldE5hbWUoKSwgY2F0ZWdvcnkuZ2V0Q2FwdGlvbigpKTsKLQkJfQotCi0JCS8vIGNvbGxlY3QgcHJvcGVydHkgbmFtZXMKLQkJU2V0IGRlY2xhcmVkUHJvcGVydGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChpUHJvcGVydGllcy5oYXNOZXh0KCkpIHsKLQkJCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNTU05vZGVMaXN0IG5vZGVMaXN0ID0gKChJQ1NTTm9kZSkgZGVjbGFyYXRpb24pLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpbnQgblByb3BzID0gKG5vZGVMaXN0ICE9IG51bGwpID8gbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgOiAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblByb3BzOyBpKyspIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQkJCQkJZGVjbGFyZWRQcm9wZXJ0aWVzLmFkZChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBmaXJzdDogcHJvcGVydGllcyBmcm9tIGNvbnRlbnQgbW9kZWwKLQkJd2hpbGUgKGlQcm9wZXJ0aWVzLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydGllcy5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkgfHwgbm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUikgewotCQkJCVN0cmluZyBjYXRlZ29yeSA9IChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0KG5vZGUuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAoZGVjbGFyZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJCWRlY2xhcmVkUHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0JCQkJfQotCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBjYXRlZ29yeSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2Vjb25kOiBleGlzdGluZyBwcm9wZXJ0aWVzIGJ1dCBub3QgaW4gY29udGVudCBtb2RlbAotCQlJdGVyYXRvciBpUmVtYWlucyA9IGRlY2xhcmVkUHJvcGVydGllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaVJlbWFpbnMuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoKFN0cmluZykgaVJlbWFpbnMubmV4dCgpLCBudWxsKTsKLQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0QXJyYXkgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldOwotCQlpZiAoUEVSRl9HRVRERVNDUklQVE9SUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoSVByb3BlcnR5RGVzY3JpcHRvcltdKSBkZXNjcmlwdG9ycy50b0FycmF5KHJlc3VsdEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgbmFtZWQgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhcyBuYW1lZCBieSBpdHMgcHJvcGVydHkgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0KLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkJc3dpdGNoIChmTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBmTm9kZSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKG5hbWVTdHJpbmcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQl2YWx1ZVN0cmluZyA9ICgoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGUpLmdldFByb3BlcnR5VmFsdWUobmFtZVN0cmluZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBwYXJlbnQpLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwpIHsKLQkJCXZhbHVlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB2YWx1ZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IHZhbHVlIGhhcyBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMKLQkgKiAgICAgICAgIGNoYW5nZWQgZnJvbSBpdHMgb3JpZ2luYWwgZGVmYXVsdCB2YWx1ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gZ2V0RGVjbGFyYXRpb25Ob2RlKCk7Ci0JCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LnRvU3RyaW5nKCkpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgMCA8IHZhbHVlLmxlbmd0aCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkncyB2YWx1ZSB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0byByZXNldAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3Qgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCWRlY2xhcmF0aW9uLnJlbW92ZVByb3BlcnR5KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVkIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHNldAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwgfHwgdmFsdWVTdHJpbmcubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlkZWNsYXJhdGlvbi5yZW1vdmVQcm9wZXJ0eShuYW1lU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlY2xhcmF0aW9uLnNldFByb3BlcnR5KG5hbWVTdHJpbmcsIHZhbHVlU3RyaW5nLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQ1NTVUlNZXNzYWdlcy5UaXRsZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IENTU1VJTWVzc2FnZXMuTWVzc2FnZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHdpbmRvdy5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb25Ob2RlKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbnVsbDsKLQotCQlzd2l0Y2ggKGZOb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJZGVjbGFyYXRpb24gPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pKSB7Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZGVjbGFyYXRpb247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmYmI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NQYXRoU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFRleHRQcm9wZXJ0eURlc2NyaXB0b3IgewotCXByaXZhdGUgZmluYWwgSUNTU05vZGUgZk5vZGU7Ci0KLQkvKioKLQkgKiBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsIElDU1NOb2RlIG5vZGUpIHsKLQkJc3VwZXIoaWQsIGRpc3BsYXlOYW1lKTsKLQkJdGhpcy5mTm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsIElDU1NOb2RlIG5vZGUsIFN0cmluZyBjYXRlZ29yeSkgewotCQlzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotCQl0aGlzLmZOb2RlID0gbm9kZTsKLQkJc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICovCi0JcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBmTm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVYVEVSTkFMICYmIGZpbmRFZGl0b3IobW9kZWwpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gY2hlY2sgd2hldGhlciBJRmlsZSBpcyByZWFkb25seSB0byBwcm9oaWJpdCBlZGl0aW5nIGJlZm9yZQotCQkvLyB2YWxpZGF0ZUVkaXQoKQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG1vZGVsOwotCQlpZiAobW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9ICgoSURPTU5vZGUpIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpKS5nZXRNb2RlbCgpOwotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSBDU1NQYXRoU2VydmljZS5sb2NhdGlvbjJGaWxlKHN0cnVjdHVyZWRNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgZmlsZS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlUHJvcGVydHlFZGl0b3IocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRWRpdG9yUGFydCBmaW5kRWRpdG9yKElDU1NNb2RlbCBtb2RlbCkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93c1tpXS5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYWdlcy5sZW5ndGg7IGorKykgewotCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JzID0gcGFnZXNbal0uZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZWRpdG9ycy5sZW5ndGg7IGsrKykgewotCQkJCQlJRWRpdG9yUGFydCBlZGl0UGFydCA9IGVkaXRvcnNba10uZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKLQkJCQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vVE9ETyBVcmdlbnQgbmVlZHMgdG8gYmUgZml4ZWQKLQkJCQkJCQkJLy8gSSB0aGluayB3ZSBuZWVkICdlcXVhbHMnIChvciAnZXF1aXZhbGVudCcKLQkJCQkJCQkJLy8gb24gbW9kZWwpIGZvciBjYXNlcyBsaWtlIHRoaXMKLQkJCQkJCQkJaWYgKFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY2FsY3VsYXRlSWQoZmlsZSkuZXF1YWxzKG1vZGVsLmdldElkKCkpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gZWRpdFBhcnQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEwOGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTIGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JDU1MpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gYWRkIHRoZSBub3JtYWwgY29udGVudCBiYXNlZCBmYWN0b3JpZXMgdG8gbW9kZWwncyByZWdpc3RyeQotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVpbml0aWFsaXplRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExYTcyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZWxlY3RzIGVuY2xvc2luZyBDU1MgZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0NTU0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0Q1NTQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxMjJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0Q1NTQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2VsZWN0cyBuZXh0IENTUyBlbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCWludCBvZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIDE7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJb2Zmc2V0ID0gMDsKLQotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCBvZmZzZXQpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gKElDU1NOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKGN1cnJlbnRPZmZzZXQsIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBjdXJyZW50T2Zmc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzQ1NTQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzQ1NTQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyODlhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIFNlbGVjdHMgcHJldmlvdXMgQ1NTIGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSB7Ci0JCQkJSUNTU05vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50RW5kT2Zmc2V0IC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyODBkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN5bWJvbGljIG5hbWUgb2Ygc3R5bGVzIHVzZWQgYnkgTGluZVN0eWxlUHJvdmlkZXIsCi0gKiBDb2xvck1hbmFnZXIsIGFuZCBhbnkgb3RoZXJzIHdobyBtYXkgYmUgaW50ZXJlc3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0NTUyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMID0gIk5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVE1BUktfUlVMRSA9ICJBVE1BUktfUlVMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUiA9ICJTRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQSA9ICJNRURJQSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UID0gIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJQUk9QRVJUWV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTFVFID0gIlBST1BFUlRZX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HID0gIlNUUklORyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPTiA9ICJDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU1JX0NPTE9OID0gIlNFTUlfQ09MT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSTFlfQlJBQ0UgPSAiQ1VSTFlfQlJBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiRVJST1IiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzYjE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckNTUyBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0JLyoqIENvbnRhaW5zIHJlZ2lvbiB0byBzdHlsZSBtYXBwaW5nICovCi0JcHJpdmF0ZSBNYXAgZkNvbG9yVHlwZXM7Ci0KLQkvKioKLQkgKiBMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZUZvcih0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCX0KLQotCS8qKgotCSAqIExvb2sgdXAgdGhlIFRleHRBdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiByZWdpb24gY29udGV4dC4gTWlnaHQgcmV0dXJuCi0JICogbnVsbCBmb3IgdW51c3VhbCB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KGZDb2xvclR5cGVzLmdldCh0eXBlKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkNvbG9yVHlwZXMgPT0gbnVsbCkgewotCQkJZkNvbG9yVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MsIElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0FUS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJVU0sIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0VfU0VMRUNUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5ELCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0KLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVDsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuRVJST1I7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5NRURJQS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5NRURJQTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUw7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORzsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5VUkk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGlzIGlzIGFyb3VuZCBmb3Igb2xkIGRlcHJlY2F0ZWQgcHJlZmVyZW5jZXNDaGFuZ2VkKCkgbWV0aG9kCi0JCQkvLyBUT0RPIHJlbW92ZSB3aGVuIHByZWZlcmVuY2VzQ2hhbmdlZCgpIGlzIHJlbW92ZWQKLQkJCWxvYWRDb2xvcnMoKTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkNvbG9yVHlwZXMgIT0gbnVsbCkgewotCQkJZkNvbG9yVHlwZXMuY2xlYXIoKTsKLQkJCWZDb2xvclR5cGVzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJaW5pdEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5MDNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTIGV4dGVuZHMgTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MgewotCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWludCByZWdpb25TdGFydCA9IHR5cGVkUmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgcmVnaW9uRW5kID0gcmVnaW9uU3RhcnQgKyB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB3aG9sZVJlZ2lvbiA9IGdldERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocmVnaW9uU3RhcnQpOwotCi0JCUxpc3QgdG9rZW5zOwotCQlpbnQgb2Zmc2V0OwotCi0JCVBhcnNlckNhY2hlIGNhY2hlID0gZ2V0Q2FjaGVkUGFyc2luZ1Jlc3VsdCh3aG9sZVJlZ2lvbik7Ci0JCWlmIChjYWNoZSA9PSBudWxsKSB7Ci0JCQlvZmZzZXQgPSB3aG9sZVJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJU3RyaW5nIGNvbnRlbnQ7Ci0JCQljb250ZW50ID0gd2hvbGVSZWdpb24uZ2V0VGV4dCgpOwotCi0JCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9TVFlMRVNIRUVULCBjb250ZW50KTsKLQkJCXRva2VucyA9IHBhcnNlci5nZXRUb2tlbkxpc3QoKTsKLQkJCWNhY2hlUGFyc2luZ1Jlc3VsdCh3aG9sZVJlZ2lvbiwgbmV3IFBhcnNlckNhY2hlKG9mZnNldCwgdG9rZW5zKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0b2tlbnMgPSBjYWNoZS50b2tlbnM7Ci0JCQlvZmZzZXQgPSBjYWNoZS5vZmZzZXQ7Ci0JCX0KLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmICgwIDwgdG9rZW5zLnNpemUoKSkgewotCQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQkJSXRlcmF0b3IgaSA9IHRva2Vucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTVGV4dFRva2VuIHRva2VuID0gKENTU1RleHRUb2tlbikgaS5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvblN0YXJ0IDw9IHN0YXJ0ICYmIHN0YXJ0IDwgcmVnaW9uRW5kKSB7Ci0JCQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKHRva2VuLmtpbmQpOwotCQkJCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJCWhvbGRSZXN1bHRzLmFkZChuZXcgU3R5bGVSYW5nZShzdGFydCwgdG9rZW4ubGVuZ3RoLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaG9sZFJlc3VsdHMuYWRkKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCB0b2tlbi5sZW5ndGgsIG51bGwsIG51bGwpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdGFydCArPSB0b2tlbi5sZW5ndGg7Ci0JCQl9Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbnVwQ2FjaGUoKSB7Ci0JCWZDYWNoZUtleSA9IC0xOwotCQlmQ2FjaGVSZXN1bHQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgUGFyc2VyQ2FjaGUgZ2V0Q2FjaGVkUGFyc2luZ1Jlc3VsdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoZkNhY2hlS2V5ID09IHJlZ2lvbi5nZXRUZXh0KCkuaGFzaENvZGUoKSkgewotCQkJcmV0dXJuIGZDYWNoZVJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVQYXJzaW5nUmVzdWx0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBQYXJzZXJDYWNoZSByZXN1bHQpIHsKLQkJZkNhY2hlS2V5ID0gcmVnaW9uLmdldFRleHQoKS5oYXNoQ29kZSgpOwotCQlmQ2FjaGVSZXN1bHQgPSByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQljbGVhbnVwQ2FjaGUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFBhcnNlckNhY2hlIHsKLQkJUGFyc2VyQ2FjaGUoaW50IG5ld09mZnNldCwgTGlzdCBuZXdUb2tlbnMpIHsKLQkJCW9mZnNldCA9IG5ld09mZnNldDsKLQkJCXRva2VucyA9IG5ld1Rva2VuczsKLQkJfQotCi0JCWludCBvZmZzZXQ7Ci0JCUxpc3QgdG9rZW5zOwotCX0KLQotCWludCBmQ2FjaGVLZXkgPSAtMTsKLQlQYXJzZXJDYWNoZSBmQ2FjaGVSZXN1bHQgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZGE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUyBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUygpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgQ1NTVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ODFjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIENTUyB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gQ1NTIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVDU1MgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlQ1NTKCkgewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMTM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImNzc19hbGwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiY3NzX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkMDU3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGV4dC9DU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCi0JcHJpdmF0ZSBpbnQgZkFuY2hvciA9IElDaGFyYWN0ZXJQYWlyTWF0Y2hlci5MRUZUOwotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQlpZiAoci5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgci5nZXRTdGFydE9mZnNldCgpID09IG9mZnNldCAmJiByLmdldFByZXZpb3VzKCkuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSkgewotCQkJCQlyID0gci5nZXRQcmV2aW91cygpOwotCQkJCX0KLQkJCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpKSB7Ci0JCQkJCXdoaWxlIChyICE9IG51bGwgJiYgIXIuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkgewotCQkJCQkJciA9IHIuZ2V0UHJldmlvdXMoKTsKLQkJCQkJfQotCQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihyLmdldFN0YXJ0T2Zmc2V0KCksIDEpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpIHsKLQkJCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpKSB7Ci0JCQkJCQlyID0gci5nZXROZXh0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG5ldyBSZWdpb24oci5nZXRFbmRPZmZzZXQoKSAtIDEsIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzMwNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLWNsYXNzIE5ld0NTU0ZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCQotCXB1YmxpYyBOZXdDU1NGaWxlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCB0aGUgc2VsZWN0ZWQgZm9sZGVyIHRvIHdlYiBjb250ZW50cyAKLQkgKiBmb2xkZXIgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG91dHNpZGUgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIuIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpIHsKLQkJc3VwZXIuaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCk7Ci0JCQotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkKLQkJaWYgKHdlYkNvbnRlbnRQYXRoICE9IG51bGwgJiYgIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQlzZXRDb250YWluZXJGdWxsUGF0aCh3ZWJDb250ZW50UGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCBhZGRpdGlvbmFsIHZhbGlkYXRpb24gc3BlY2lmaWMgdG8gCi0JICogY3NzIGZpbGVzLiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCi0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKENTU1VJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0NTUywgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShDU1NVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGdldCB0aGUgSVByb2plY3QgZm9yIHRoZSBzZWxlY3Rpb24gcGF0aAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCQkvLyBpZiBpbnNpZGUgd2ViIHByb2plY3QsIGNoZWNrIGlmIGluc2lkZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBpc1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkvLyBjaGVjayB0aGF0IHRoZSBwYXRoIGlzIGluc2lkZSB0aGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkJCWlmICghd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCQkJc2V0TWVzc2FnZShDU1NVSU1lc3NhZ2VzLl9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCwgV0FSTklORyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgQ1NTIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBpZiBmaWxlTmFtZSBpcyB2YWxpZCBuYW1lIGZvciBjb250ZW50IHR5cGUuIFRha2VzIGJhc2UgY29udGVudAotCSAqIHR5cGUgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gaXMgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCS8vIGNoZWNrIHdoYXQgY29udGVudCB0eXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgZXh0ZW5zaW9uCi0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZU5hbWUpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0tpbmRPZih0eXBlKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWQgPSB0cnVlOyAvLyBubyBleHRlbnNpb24gc28gdmFsaWQKLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGV4dCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggd2hpY2ggcHJvamVjdCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQcm9qZWN0IG9iamVjdC4gSWYgcGF0aCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgcmV0dXJuIHZhbHVlIAotCSAqIAkJICAgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4gCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVBhdGgoSVBhdGggcGF0aCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAod29ya3NwYWNlLnZhbGlkYXRlUGF0aChwYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5QUk9KRUNUKS5pc09LKCkpIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBhIHdlYiBwcm9qZWN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHRvIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2plY3QgaXMgd2ViIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQkKLQkJaWYgKGZhY2V0ZWQgIT0gbnVsbCAmJiAKLQkJCShmYWNldGVkLmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSkpIHx8IAotCQkJIGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHdoaWNoIHdlYiBjb250ZW50cyBwYXRoIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVBhdGggb2YgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIKLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCQotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGlzV2ViUHJvamVjdChwcm9qZWN0KSkgewkJCQotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlwYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI3YzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSIsIENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLk5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIENTUyBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5DU1NfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCXZpZXdlci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlIGdldFNlbGVjdGVkVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0ZW1wbGF0ZSBzdHJpbmcgdG8gaW5zZXJ0LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHRvIGluc2VydCBvciBudWxsIGlmIG5vbmUgaXMgdG8gYmUgaW5zZXJ0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IG51bGw7Ci0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5ORVcpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIDAsIDApOwotCQkJdHJ5IHsKLQkJCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBjb250ZXh0LmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGJ1ZmZlci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIHRlbXBsYXRlIGZvciBuZXcgY3NzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0ZW1wbGF0ZVN0cmluZzsKLQl9Ci0KLQl2b2lkIGxpbmtDbGlja2VkKCkgewotCQlTdHJpbmcgcGFnZUlkID0gZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpOwotCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgcGFnZUlkLCBuZXcgU3RyaW5nW117cGFnZUlkfSwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gTmV3IENTUyBGaWxlIHdpemFyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhDU1NVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FKTsKLQkJaWYgKHRlbXBsYXRlTmFtZSA9PSBudWxsIHx8IHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0ZW1wbGF0ZSBuYW1lIHVzZWQgZm9yIG5leHQgY2FsbCB0byBOZXcgQ1NTIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUNTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShDU1NVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwYXR0ZXJuIHZpZXdlci4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvTmV3Q1NTV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWE2MDQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvTmV3Q1NTV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgTmV3Q1NTV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JcHJpdmF0ZSBOZXdDU1NGaWxlV2l6YXJkUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0NTU0ZpbGVXaXphcmRQYWdlKCJDU1NXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpOyAvLyROT04tTkxTLTEkCi0JCWZOZXdGaWxlUGFnZS5zZXRUaXRsZShDU1NVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0hFQURJTkcpOyAvLyROT04tTkxTLTEkCi0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShDU1NVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX1RJVExFKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IENTU0ltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0NTU0ZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQkJCXRyeSB7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBudWxsOwotCQkJCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8ganVzdCB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpOwotCQkJCQl9Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZSh0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50cyBmb3IgbmV3IENTUyBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBvcGVuIHRoZSBmaWxlIGluIGVkaXRvcgotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQkJLy8gZXZlcnl0aGluZydzIGZpbmUKLQkJCXBlcmZvcm1lZE9LID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkT0s7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM5ZDg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIG91dGxpbmUgdmlldyBwYWdlIHdoaWNoIHNob3dzIENTUyBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBmQ29udGVudFByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX1NPUlRfUFJFRiA9ICJvdXRsaW5lLXNvcnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIENTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElDb250cmlidXRpb25JdGVtW10gY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IHN1cGVyLmNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKHZpZXdlcik7Ci0KLQkJU29ydEFjdGlvbiBzb3J0QWN0aW9uID0gbmV3IFNvcnRBY3Rpb24odmlld2VyLCBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfU09SVF9QUkVGKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc29ydEl0ZW0gPSBuZXcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtKHNvcnRBY3Rpb24pOwotCi0JCWlmIChpdGVtcyA9PSBudWxsKSB7Ci0JCQlpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVsxXTsKLQkJCWl0ZW1zWzBdID0gc29ydEl0ZW07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGNvbWJpbmVkSXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1baXRlbXMubGVuZ3RoICsgMV07Ci0JCQljb21iaW5lZEl0ZW1zWzBdID0gc29ydEl0ZW07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBjb21iaW5lZEl0ZW1zLCAxLCBpdGVtcy5sZW5ndGgpOwotCQkJaXRlbXMgPSBjb21iaW5lZEl0ZW1zOwotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkKLQkJCWZDb250ZW50UHJvdmlkZXIgPSBuZXcgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyQ1NTKCk7Ci0JCXJldHVybiBmQ29udGVudFByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEZpbHRlcmVkTm9kZShPYmplY3QgbykgewotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJbm9kZSA9IChJQ1NTTm9kZSkgbzsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQl3aGlsZSAobm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsKLQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRGaWx0ZXJlZE5vZGVzKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJT2JqZWN0W10gZmlsdGVyZWQgPSBuZXcgT2JqZWN0W29iamVjdHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZC5sZW5ndGg7IGkrKykgewotCQkJZmlsdGVyZWRbaV0gPSBnZXRGaWx0ZXJlZE5vZGUob2JqZWN0c1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkOwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmTGFiZWxQcm92aWRlciA9PSBudWxsKQotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUygpOwotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLlN0cnVjdHVyZWRDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJU2VsZWN0aW9uIGZpbHRlcmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIGZpbHRlcmVkTm9kZXMgPSBnZXRGaWx0ZXJlZE5vZGVzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpKTsKLQkJCWZpbHRlcmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyZWROb2Rlcyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkU2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTg5MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotCi0vKioKLSAqIEEgQ29udGVudCBwcm92aWRlciBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5IENTUyBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciBkb2VzIG5vdCB1c2UgYWRhcHRlcnMuCi0gKi8KLWNsYXNzIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUyBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50cyhPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHYpIHsKLQotCQlJQ1NTTm9kZSBub2RlOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoSUNTU01vZGVsKSBlbGVtZW50OwotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoKElDU1NOb2RlKSBlbGVtZW50KS5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCXYuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBnaXZlbiBlbGVtZW50LAotCSAqIHdoaWNoIHJlcHJlc2VudHMgYSBub2RlIGluIGEgdHJlZS4gVGhlIGRpZmZlcmVuY2UgdG8KLQkgKiA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhPYmplY3QpPC9jb2RlPiBpcyBhcwotCSAqIGZvbGxvd3M6IDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB0cmVlCi0JICogdmlld2VyJ3Mgcm9vdCBlbGVtZW50cy4gTWV0aG9kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkIHRvCi0JICogb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUsIHdoaWNoIGNhbiBjYW4gYmUgYQotCSAqIHJvb3Qgbm9kZSwgdG9vLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYQotCSAqIGxpc3QgZXRjLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gSW4KLQkgKiB0aGlzIGNhc2UgdGhlIHRyZWUgdmlld2VyIGNhbid0IGV4cGFuZCBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLgotCSAqIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihvYmplY3QpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ICE9IG51bGwgJiYgb2xkSW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJU3RydWN0dXJlZE1vZGVsKSBuZXdJbnB1dCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZGVsZXRlZCBvciBub3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpGYWNlIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGFibGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgVGhlIG9iamVjdCB0byBnZXQgdGhlIGFkYXB0ZXIgZm9yCi0JICovCi0JcHJpdmF0ZSBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCWFkYXB0YWJsZSA9ICgoSUNTU01vZGVsKSBhZGFwdGFibGUpLmdldERvY3VtZW50KCk7Ci0JCX0KLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9ICgoSU5vZGVOb3RpZmllcikgYWRhcHRhYmxlKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChub2RlQWRhcHRlciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKQotCQkJCWFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIG5vZGVBZGFwdGVyOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2MTM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci0KLWNsYXNzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByaXZhdGUgSUpGYWNlTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlKSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlhZGFwdGFibGUgPSAoKElDU1NNb2RlbCkgYWRhcHRhYmxlKS5nZXREb2N1bWVudCgpOwotCQl9Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSAoKElOb2RlTm90aWZpZXIpIGFkYXB0YWJsZSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAobm9kZUFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikKLQkJCQlhZGFwdGVyID0gKElKRmFjZU5vZGVBZGFwdGVyKSBub2RlQWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LCBmb3IgdXNlIGluIHRoZQotCSAqIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBUaGUgdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCBpbWFnZS4gRWxlbWVudAotCSAqICAgICAgICAgICAgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldAotCSAqICAgICAgICAgICAgdG8gdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWltYWdlID0gYWRhcHRlci5nZXRMYWJlbEltYWdlKGVsZW1lbnQpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LCBmb3IgdXNlIGluIHRoZQotCSAqIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBUaGUgdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCB0ZXh0LiBFbGVtZW50IGNhbgotCSAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyBubyBpbnB1dCBvYmplY3QgaXMgc2V0IHRvCi0JICogICAgICAgICAgICB0aGUgdmlld2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gYWRhcHRlci5nZXRMYWJlbFRleHQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBsYWJlbCBwcm92aWRlciBpcyBhZmZlY3RlZCBieSB0aGUgZ2l2ZW4gZG9tYWluCi0JICogZXZlbnQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGVkKE9iamVjdCBkdW1teSkgey8vIERvbWFpbkV2ZW50IGV2ZW50KSB7Ci0JCS8vIHJldHVybiBldmVudC5pc01vZGlmaWVyKERvbWFpbkV2ZW50Lk5PTl9TVFJVQ1RVUkVfQ0hBTkdFKTsKLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIGJ5IGEgY2hhbmdlIHRvIHRoZSBnaXZlbgotCSAqIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGEKLQkgKiBub24tc3RydWN0dXJhbCB2aWV3ZXIgdXBkYXRlLiBJZiB0aGUgcHJvcGVydHkgbWVudGlvbmVkIGluIHRoZSB1cGRhdGUKLQkgKiBkb2VzIG5vdCBhZmZlY3QgdGhlIGxhYmVsLCB0aGVuIHRoZSB2aWV3ZXIgbmVlZCBub3QgdXBkYXRlIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCB3b3VsZCBiZSB1bmFmZmVjdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkNzNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci0KLS8qCi0gKiBCYXNlZCBvbiBEVERDb250ZW50T3V0bGluZVBhZ2UjU29ydEFjdGlvbgotICovCi1jbGFzcyBTb3J0QWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHVibGljIFNvcnRBY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCXN1cGVyKENTU1VJTWVzc2FnZXMuU29ydEFjdGlvbl8wLCBzdG9yZSwgcHJlZmVyZW5jZUtleSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENTU1VJUGx1Z2luLklELCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TT1JUKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQl0cmVlVmlld2VyID0gdmlld2VyOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotCQlPYmplY3RbXSBleHBhbmRlZEVsZW1lbnRzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG51bGwpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQodHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkRWxlbWVudHMpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjMWZhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkNTU1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSBzaGVldCBwYWdlIHdoaWNoIHNob3dzIENTUyBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuYWRkUHJvcGVydHlTaGVldFBhZ2UoZlByb3BlcnR5U2hlZXRQYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ1NTUHJvcGVydHlTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2UgZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJcHJpdmF0ZSBJQ1NTTm9kZSBmU291cmNlID0gbnVsbDsKLQotCQlwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChmU291cmNlICE9IG51bGwgJiYgb2JqZWN0LmVxdWFscyhmU291cmNlKSkgewotCQkJCXJldHVybiBmUHJvcGVydHlTb3VyY2U7Ci0JCQl9Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCWZTb3VyY2UgPSAoSUNTU05vZGUpb2JqZWN0OwotCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG5ldyBDU1NQcm9wZXJ0eVNvdXJjZShmU291cmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTb3VyY2UgPSBudWxsOwotCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZlByb3BlcnR5U291cmNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0aWVzUmVmcmVzaEpvYiBleHRlbmRzIFVJSm9iIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0RFTEFZID0gMjAwOwotCi0JCXByaXZhdGUgU2V0IHByb3BlcnR5U2hlZXRQYWdlcyA9IG51bGw7Ci0KLQkJcHVibGljIFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5KRmFjZU5vZGVBZGFwdGVyXzEpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcyA9IG5ldyBIYXNoU2V0KDEpOwotCQl9Ci0KLQkJdm9pZCBhZGRQcm9wZXJ0eVNoZWV0UGFnZShJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmFkZChwYWdlKTsKLQkJCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJT2JqZWN0W10gcGFnZXMgPSBwcm9wZXJ0eVNoZWV0UGFnZXMudG9BcnJheSgpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmNsZWFyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBwYWdlc1tpXTsKLQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb3BlcnRpZXNSZWZyZXNoSm9iIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG51bGw7Ci0KLQlJUHJvcGVydHlTaGVldFBhZ2UgZlByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElOb2RlQWRhcHRlciBmUmVmcmVzaEFkYXB0ZXIgPSBuZXcgQ1NTUHJvcGVydHlTaGVldFJlZnJlc2hBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIElOb2RlTm90aWZpZXJbXSBmU2VsZWN0ZWROb3RpZmllcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldElucHV0U2VsZWN0aW9uKElXb3JrYmVuY2hQYXJ0IHNlbGVjdGluZ1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHJlbW92ZSBVSSByZWZyZXNoIGFkYXB0ZXJzCi0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCi0JCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gc3VwZXIuZ2V0SW5wdXRTZWxlY3Rpb24oc2VsZWN0aW5nUGFydCwgc2VsZWN0aW9uKTsKLQkJaWYgKHByZWZlcnJlZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSBuZXcgT2JqZWN0WygoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCksIDAsIHNlbGVjdGVkT2JqZWN0cywgMCwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJCXdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFKSB7Ci0JCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogQWRkIFVJIHJlZnJlc2ggYWRhcHRlcnMgYW5kIHJlbWVtYmVyIG5vdGlmaWVycyBmb3IgbGF0ZXIKLQkJCSAqIHJlbW92YWwKLQkJCSAqLwotCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZE5vdGlmaWVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCXNlbGVjdGVkTm90aWZpZXJzLmFkZChzZWxlY3RlZE9iamVjdHNbaV0pOwotCQkJCQkJKChJTm9kZU5vdGlmaWVyKSBzZWxlY3RlZE9iamVjdHNbaV0pLmFkZEFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmU2VsZWN0ZWROb3RpZmllcnMgPSAoSU5vZGVOb3RpZmllcltdKSBzZWxlY3RlZE5vdGlmaWVycy50b0FycmF5KG5ldyBJTm9kZU5vdGlmaWVyW3NlbGVjdGVkTm90aWZpZXJzLnNpemUoKV0pOwotCQkJfQotCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRPYmplY3RzKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCVByb3BlcnRpZXNSZWZyZXNoSm9iIGdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQlpZiAoZlByb3BlcnRpZXNSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG5ldyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllc1JlZnJlc2hKb2I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJaWYgKGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbmV3IENTU1Byb3BlcnR5U291cmNlUHJvdmlkZXIoKTsKLQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlzdXBlci51bmNvbmZpZ3VyZSgpOwotCQlpZiAoZlNlbGVjdGVkTm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkTm90aWZpZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzW2ldLnJlbW92ZUFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCX0KLQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjI4MmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UZW1wbGF0ZXMubmV3Y3NzLm5hbWU9TmV3IENTUyBGaWxlCi1UZW1wbGF0ZXMubmV3Y3NzLmRlc2M9bmV3IGNzcyBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDI3MjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRlbXBsYXRlcz4KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm5ld2Nzcy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5uZXdjc3MuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLm5ld2NzcyIgY29udGV4dD0iY3NzX25ldyIgZW5hYmxlZD0idHJ1ZSI+QENIQVJTRVQgIiR7ZW5jb2Rpbmd9Ijs8L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2MTA2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbnRlbnRtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJlbWZtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzYXhwYXJzZXIvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTEzOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1ydW50aW1lCi1kdGRjb3JlLmphcgotKi56aXAKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjQ5ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxY2Q1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMzBkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGFza3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LAotIHJvc2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMzQzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbAotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIGVtZm1vZGVsLyxcCi0gICAgICAgICAgIHNheHBhcnNlci8sXAotICAgICAgICAgICBzcmMtdmFsaWRhdGlvbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYzEyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9kdGQvb3ZlcnZpZXcuaHRtbCIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJEVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRGYWN0b3J5RFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50RmFjdG9yeURURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY1ZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRGYWN0b3J5RFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBidWlsZGVyIGhhbmRsZXMgYnVpbGRpbmcgLmR0ZCBncmFtbWFyIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeURURCBpbXBsZW1lbnRzIENNRG9jdW1lbnRGYWN0b3J5IHsKLQlwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlEVEQoKSB7Ci0JfQotCi0KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpIHsKLQkJLy8gd29yayBhcm91bmQgYSBidWcgaW4gb3VyIHBhcnNlcnMKLQkJLy8gdG9kby4uLiByZXZpc2l0IHRoaXMKLQkJLy8KLS8vCQlodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwNDgxCi0vLwkJU3RyaW5nIGZpbGVQcm90b2NvbCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLS8vCQlpZiAodXJpLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sKSkgewotLy8JCQl1cmkgPSB1cmkuc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSk7Ci0vLwkJfQotCi0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IERUREltcGwuYnVpbGRDTURvY3VtZW50KHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJjb3VsZCBub3QgY3JlYXRlIGNvbnRlbnQgbW9kZWwgZm9yIFVSSTogIiArIHVyaSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1ZDIxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ01Ob2RlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OID0gImRvY3VtZW50YXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UgPSAiZG9jdW1lbnRhdGlvblNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFID0gImRvY3VtZW50YXRpb25MYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9NT0ZfTk9USUZJRVIgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT05fSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTiA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvYmplY3QpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODkxZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRFRESW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFREQmFzaWNUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFREUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTURhdGFUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRW50aXR5RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Ob2RlTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERJbXBsIHsKLQlzdGF0aWMgewotCQkvLyBDYWxsIGluaXQgb24gdGhlIERURCBwYWNrYWdlIHRvIGF2b2lkIHN0cmFuZ2UgaW5pdGlhbGl6YXRpb24gYnVncwotCQkvLwotCQlEVERQYWNrYWdlSW1wbC5pbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEVERBZGFwdGVyRmFjdG9yeUltcGwgZHRkQWRhcHRlckZhY3RvcnlJbXBsID0gbmV3IERUREFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCXByb3RlY3RlZCBzdGF0aWMgQ01EYXRhVHlwZUluZm9UYWJsZSBjbURhdGFUeXBlSW5mb1RhYmxlID0gbmV3IENNRGF0YVR5cGVJbmZvVGFibGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSkgewotCQlEVERGaWxlIGR0ZEZpbGUgPSBidWlsZERURE1vZGVsKHVyaSk7Ci0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpOwotCQkKLQkJcmV0dXJuIGNtRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEVERGaWxlIGJ1aWxkRFRETW9kZWwoU3RyaW5nIHVyaSkgewotCQlEVERVdGlsIGR0ZFV0aWwgPSBuZXcgRFREVXRpbCgpOwotCQlkdGRVdGlsLnNldGV4cGFuZEVudGl0eVJlZmVyZW5jZXModHJ1ZSk7Ci0JCWR0ZFV0aWwucGFyc2UobmV3IFJlc291cmNlU2V0SW1wbCgpLCB1cmkpOwotCQlyZXR1cm4gZHRkVXRpbC5nZXREVERGaWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChEVERGaWxlIGR0ZEZpbGUpIHsKLQkJcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ01Ob2RlIGdldEFkYXB0ZXIoTm90aWZpZXIgbykgewotCQlyZXR1cm4gKENNTm9kZSkgZHRkQWRhcHRlckZhY3RvcnlJbXBsLmFkYXB0KG8pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE1pbk9jY3VySGVscGVyKERURFJlcGVhdGFibGVDb250ZW50IGNvbnRlbnQpIHsKLQkJaW50IG9jY3VyZW5jZSA9IGNvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaXNPcHRpb25hbCA9IChvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUwgfHwgb2NjdXJlbmNlID09IERURE9jY3VycmVuY2VUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCXJldHVybiBpc09wdGlvbmFsID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4T2NjdXJIZWxwZXIoRFREUmVwZWF0YWJsZUNvbnRlbnQgY29udGVudCkgewotCQlpbnQgb2NjdXJlbmNlID0gY29udGVudC5nZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKTsKLQkJYm9vbGVhbiBpc011bHRpID0gKG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5PTkVfT1JfTU9SRSB8fCBvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJcmV0dXJuIGlzTXVsdGkgPyAtMSA6IDE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQkJQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREF0dHJpYnV0ZSkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFREQXR0cmlidXRlQWRhcHRlcigoRFREQXR0cmlidXRlKSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERFbGVtZW50QWRhcHRlcigoRFRERWxlbWVudCkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcigoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREZpbGVBZGFwdGVyKChEVERGaWxlKSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREdyb3VwQ29udGVudEFkYXB0ZXIoKERUREdyb3VwQ29udGVudCkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERFbnRpdHlBZGFwdGVyKChEVERFbnRpdHkpIHRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkgewotCQkJcmV0dXJuIGFkYXB0KHRhcmdldCwgdGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEVERCYXNlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRFREQmFzZUFkYXB0ZXIgZXh0ZW5kcyBDTU5vZGVJbXBsIHsKLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIHR5cGUgPT0gZHRkQWRhcHRlckZhY3RvcnlJbXBsOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJDTURvY3VtZW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdldENNRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRE9DVU1FTlRBVElPTikpIHsKLQkJCQlyZXN1bHQgPSBnZXREb2N1bWVudGF0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT05fSU5GTykpIHsKLQkJCQlyZXN1bHQgPSBnZXREZWZpbml0aW9uSW5mbygpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERUZJTklUSU9OKSkgewotCQkJCXJlc3VsdCA9IGdldERlZmluaXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTU9GX05PVElGSUVSKSkgewotCQkJCXJlc3VsdCA9IGdldEtleSgpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygic3BlYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBnZXRTcGVjKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDTURvY3VtZW50KCk7Ci0JCQkJCWlmIChjbURvY3VtZW50IGluc3RhbmNlb2YgRFRERmlsZUFkYXB0ZXIpIHsKLQkJCQkJCUFubm90YXRpb25NYXAgbWFwID0gKChEVERGaWxlQWRhcHRlcikgY21Eb2N1bWVudCkuYW5ub3RhdGlvbk1hcDsKLQkJCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBzcGVjID0gZ2V0U3BlYygpOwotCQkJCQkJCWlmIChzcGVjICE9IG51bGwpIHsKLQkJCQkJCQkJcmVzdWx0ID0gbWFwLmdldFByb3BlcnR5KGdldFNwZWMoKSwgcHJvcGVydHlOYW1lKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCQlNYXAgZ2xvYmFsUHJvcGVydHlNYXAgPSAoKERUREZpbGVBZGFwdGVyKSBjbURvY3VtZW50KS5nbG9iYWxQcm9wZXJ0eU1hcDsKLQkJCQkJCQlyZXN1bHQgPSBnbG9iYWxQcm9wZXJ0eU1hcC5nZXQocHJvcGVydHlOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXREZWZpbml0aW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNwZWMoKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERUREF0dHJpYnV0ZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREF0dHJpYnV0ZUFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gewotCQlwcm90ZWN0ZWQgRFREQXR0cmlidXRlIGF0dHJpYnV0ZTsKLQkJcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGU7Ci0KLQkJcHVibGljIERUREF0dHJpYnV0ZUFkYXB0ZXIoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0JCQlkYXRhVHlwZSA9IG5ldyBEYXRhVHlwZUltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKSArICIvQCIgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIEFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQkJcmV0dXJuIGRhdGFUeXBlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlLmdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGF0dHJpYnV0ZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJCWludCB1c2FnZSA9IE9QVElPTkFMOwotCQkJc3dpdGNoIChhdHRyaWJ1dGUuZ2V0RGVmYXVsdEtpbmQoKS5nZXRWYWx1ZSgpKSB7Ci0JCQkJY2FzZSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRCA6IHsKLQkJCQkJdXNhZ2UgPSBSRVFVSVJFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuRklYRUQgOiB7Ci0JCQkJCXVzYWdlID0gRklYRUQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB1c2FnZTsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSBhdHRyaWJ1dGUuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKTsKLQkJCXJldHVybiBkdGRGaWxlICE9IG51bGwgPyAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcihkdGRGaWxlKSA6IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZSB7Ci0JCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJCXJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJCXJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImlzVmFsaWRFbXB0eVZhbHVlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgZGF0YVR5cGVOYW1lID0gZ2V0RGF0YVR5cGVOYW1lKCk7Ci0JCQkJCXJlc3VsdCA9IChkYXRhVHlwZU5hbWUgPT0gbnVsbCB8fCBkYXRhVHlwZU5hbWUuZXF1YWxzKENNRGF0YVR5cGUuQ0RBVEEpKSA/ICJ0cnVlIiA6ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJCQlyZXR1cm4gY21EYXRhVHlwZUluZm9UYWJsZS5nZXREYXRhVHlwZU5hbWUoYXR0cmlidXRlLmdldERURFR5cGUoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkgewotCQkJCXJldHVybiBjbURhdGFUeXBlSW5mb1RhYmxlLmdldEluc3RhbmNlVmFsdWUoYXR0cmlidXRlLmdldERURFR5cGUoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpIHsKLQkJCQlpbnQgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9OT05FOwotCQkJCWludCBkZWZhdWx0VmFsdWVLaW5kID0gYXR0cmlidXRlLmdldERlZmF1bHRLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlS2luZCA9PSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEKSB7Ci0JCQkJCXJlc3VsdCA9IElNUExJRURfVkFMVUVfREVGQVVMVDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZGVmYXVsdFZhbHVlS2luZCA9PSBEVEREZWZhdWx0S2luZC5GSVhFRCkgewotCQkJCQlyZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0ZJWEVEOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlLmdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJCQlPYmplY3RbXSBvYmplY3RMaXN0ID0gYXR0cmlidXRlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS50b0FycmF5KCk7Ci0JCQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tvYmplY3RMaXN0Lmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXJlc3VsdFtpXSA9IG9iamVjdExpc3RbaV0udG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERWxlbWVudEJhc2VBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEVERFbGVtZW50QmFzZUFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uIHsKLQkJcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGU7Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpOwotCi0JCXByb3RlY3RlZCBDTURvY3VtZW50YXRpb24gZG9jdW1lbnRhdGlvbiA9IG51bGw7Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBFTEVNRU5UX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBnZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgcmVzdWx0ID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQkJTGlzdCBhdHRyaWJ1dGVMaXN0ID0gZ2V0RFRERWxlbWVudCgpLmdldERUREF0dHJpYnV0ZSgpOwotCQkJZm9yIChJdGVyYXRvciBpID0gYXR0cmlidXRlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlEVERBdHRyaWJ1dGUgYXR0cmlidXRlID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JCQkJcmVzdWx0LmdldEhhc2h0YWJsZSgpLnB1dChhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBnZXRBZGFwdGVyKGF0dHJpYnV0ZSkpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJCXJldHVybiAoQ01Db250ZW50KSBnZXRBZGFwdGVyKGdldERUREVsZW1lbnQoKS5nZXRDb250ZW50KCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJCS8vIHRvZG8KLQkJCWludCByZXN1bHQgPSBFTEVNRU5UOwotCQkJRFRERWxlbWVudENvbnRlbnQgZHRkRWxlbWVudENvbnRlbnQgPSBnZXREVERFbGVtZW50KCkuZ2V0Q29udGVudCgpOwotCQkJaWYgKGR0ZEVsZW1lbnRDb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJCXJlc3VsdCA9IFBDREFUQTsKLQkJCX0KLQkJCWVsc2UgaWYgKGR0ZEVsZW1lbnRDb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQkJRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCA9IChEVERHcm91cENvbnRlbnQpIGR0ZEVsZW1lbnRDb250ZW50OwotCQkJCWludCBncm91cEtpbmQgPSBncm91cENvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZ3JvdXBLaW5kID09IERUREdyb3VwS2luZC5DSE9JQ0UpIHsKLQkJCQkJTGlzdCBsaXN0ID0gZ3JvdXBDb250ZW50LmdldENvbnRlbnQoKTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpID4gMCAmJiBsaXN0LmdldCgwKSBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCQkJCXJlc3VsdCA9IE1JWEVEOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERBbnlDb250ZW50KSB7Ci0JCQkJcmVzdWx0ID0gQU5ZOwotCQkJfQotCQkJZWxzZSBpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCQlyZXN1bHQgPSBFTVBUWTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQkJaW50IGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWJvb2xlYW4gaGFzRGF0YVR5cGUgPSBjb250ZW50VHlwZSA9PSBQQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gTUlYRUQ7Ci0JCQlyZXR1cm4gaGFzRGF0YVR5cGUgPyBkYXRhVHlwZSA6IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJCXJldHVybiBDTU5hbWVkTm9kZU1hcEltcGwuRU1QVFlfTkFNRURfTk9ERV9NQVA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkgewotCQkJRFRERmlsZSBkdGRGaWxlID0gZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKTsKLQkJCXJldHVybiBkdGRGaWxlICE9IG51bGwgPyAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcihkdGRGaWxlKSA6IG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkgewotCQkJQ01Ob2RlTGlzdEltcGwgbm9kZUxpc3QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJCWlmIChkb2N1bWVudGF0aW9uID09IG51bGwpIHsKLQkJCQlTdHJpbmcgY29tbWVudCA9IGdldERUREVsZW1lbnQoKS5nZXRDb21tZW50KCk7Ci0JCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbW1lbnQsICJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXZhbHVlICs9IHN0Lm5leHRUb2tlbigpLnRyaW0oKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlkb2N1bWVudGF0aW9uID0gbmV3IENNRG9jdW1lbnRhdGlvbkltcGwodmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkb2N1bWVudGF0aW9uICE9IG51bGwpIHsKLQkJCQlub2RlTGlzdC5nZXRMaXN0KCkuYWRkKGRvY3VtZW50YXRpb24pOwotCQkJfQotCQkJcmV0dXJuIG5vZGVMaXN0OwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENNRG9jdW1lbnRhdGlvbkltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50YXRpb24gewotCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0JCXB1YmxpYyBDTURvY3VtZW50YXRpb25JbXBsKFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBET0NVTUVOVEFUSU9OOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERFbGVtZW50QWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBEVERFbGVtZW50QmFzZUFkYXB0ZXIgewotCQlwcm90ZWN0ZWQgRFRERWxlbWVudCBlbGVtZW50OwotCi0JCXB1YmxpYyBEVERFbGVtZW50QWRhcHRlcihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQlkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgiI1BDREFUQSIsIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpIHsKLQkJCXJldHVybiAiZ2xvYmFsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXREZWZpbml0aW9uKCkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyIGV4dGVuZHMgRFRERWxlbWVudEJhc2VBZGFwdGVyIHsKLQkJcHJvdGVjdGVkIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNvbnRlbnQ7Ci0KLQkJcHVibGljIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcihEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBjb250ZW50KSB7Ci0JCQl0aGlzLmNvbnRlbnQgPSBjb250ZW50OwotCQkJZGF0YVR5cGUgPSBuZXcgQ01EYXRhVHlwZUltcGwoIiNQQ0RBVEEiLCBnZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCi0JCXByb3RlY3RlZCBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gY29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJCXJldHVybiBnZXRNaW5PY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCQlyZXR1cm4gZ2V0TWF4T2NjdXJIZWxwZXIoY29udGVudCk7Ci0JCX0KLQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKGdldERUREVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREVudGl0eUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREVudGl0eUFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRW50aXR5RGVjbGFyYXRpb24gewotCQlwcm90ZWN0ZWQgRFRERW50aXR5IGR0ZEVudGl0eTsKLQotCQlwdWJsaWMgRFRERW50aXR5QWRhcHRlcihEVERFbnRpdHkgZHRkRW50aXR5KSB7Ci0JCQl0aGlzLmR0ZEVudGl0eSA9IGR0ZEVudGl0eTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gRU5USVRZX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gZHRkRW50aXR5OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGR0ZEVudGl0eS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChkdGRFbnRpdHkuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgRFRESW50ZXJuYWxFbnRpdHkpIHsKLQkJCQlEVERJbnRlcm5hbEVudGl0eSBjb250ZW50ID0gKERUREludGVybmFsRW50aXR5KSBkdGRFbnRpdHkuZ2V0Q29udGVudCgpOwotCQkJCXZhbHVlID0gY29udGVudC5nZXRWYWx1ZSgpOwotCQkJfQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERHcm91cENvbnRlbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERHcm91cENvbnRlbnRBZGFwdGVyIGV4dGVuZHMgRFREQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQkJcHJvdGVjdGVkIERUREdyb3VwQ29udGVudCBjb250ZW50OwotCi0JCXB1YmxpYyBEVERHcm91cENvbnRlbnRBZGFwdGVyKERUREdyb3VwQ29udGVudCBjb250ZW50KSB7Ci0JCQl0aGlzLmNvbnRlbnQgPSBjb250ZW50OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gR1JPVVA7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVzY3JpcHRpb25CdWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24odGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQkJTGlzdCBsaXN0ID0gY29udGVudC5nZXRDb250ZW50KCk7Ci0JCQlDTU5vZGVMaXN0SW1wbCByZXN1bHQgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSBnZXRBZGFwdGVyKChOb3RpZmllcikgaS5uZXh0KCkpOwotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0LmdldExpc3QoKS5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0KLQkJcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJCXJldHVybiBnZXRNYXhPY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCQlyZXR1cm4gZ2V0TWluT2NjdXJIZWxwZXIoY29udGVudCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkgewotCQkJLy8gdG9kby4uLiBoYW5kbGUgQUxPTkUgY2FzZSBieSBjaGVja2lnIGlmIGNoaWxkIGNvdW50ID09IDEKLQkJCWludCBncm91cEtpbmQgPSBjb250ZW50LmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCk7Ci0JCQlyZXR1cm4gKGdyb3VwS2luZCA9PSBEVERHcm91cEtpbmQuQ0hPSUNFKSA/IENIT0lDRSA6IFNFUVVFTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRFRERmlsZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREZpbGVBZGFwdGVyIGV4dGVuZHMgRFREQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPT1RfTkFNRSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmYXVsdFJvb3ROYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0JCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbmFtZWROb2RlTWFwOwotCQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGVudGl0eU5vZGVNYXA7Ci0KLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0JCXByb3RlY3RlZCBNYXAgZ2xvYmFsUHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXB1YmxpYyBEVERGaWxlQWRhcHRlcihEVERGaWxlIGR0ZEZpbGUpIHsKLQkJCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBkdGRGaWxlOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJCXJldHVybiBhbm5vdGF0aW9uTWFwOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQkJaWYgKG5hbWVkTm9kZU1hcCA9PSBudWxsKSB7Ci0JCQkJbmFtZWROb2RlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSAoRFRERWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQluYW1lZE5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KGR0ZEVsZW1lbnQuZ2V0TmFtZSgpLCBnZXRBZGFwdGVyKGR0ZEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZWROb2RlTWFwOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQkJaWYgKGVudGl0eU5vZGVNYXAgPT0gbnVsbCkgewotCQkJCWVudGl0eU5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJCQkvLyBhZGQgdGhlIGJ1aWx0IGluIGVudGl0eSBkZWNsYXJhdGlvbnMKLQkJCQkvLwotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhbXAiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImFtcCIsICImIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJsdCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgibHQiLCAiPCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiZ3QiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImd0IiwgIj4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoInF1b3QiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoInF1b3QiLCAiXCIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImFwb3MiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImFwb3MiLCAiJyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGR0ZEZpbGUubGlzdERUREVudGl0eSgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlEVERFbnRpdHkgZHRkRW50aXR5ID0gKERUREVudGl0eSkgaS5uZXh0KCk7Ci0JCQkJCWlmICghZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZHRkRW50aXR5LmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBmb3Igbm93Li4uIGp1c3QgaGFuZGxlIERUREludGVybmFsRW50aXR5Ci0JCQkJCQkvLwotCQkJCQkJaWYgKGR0ZEVudGl0eS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBEVERJbnRlcm5hbEVudGl0eSkgewotCQkJCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KGR0ZEVudGl0eS5nZXROYW1lKCksIGdldEFkYXB0ZXIoZHRkRW50aXR5KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZW50aXR5Tm9kZU1hcDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gRE9DVU1FTlQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGR0ZEZpbGUuZ2V0TmFtZSgpICsgIi5kdGQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoREVGQVVMVF9ST09UX05BTUUpKSB7Ci0JCQkJRFRETWV0cmljcyBtZXRyaWNzID0gbmV3IERURE1ldHJpY3MoZHRkRmlsZSk7Ci0JCQkJRFRERWxlbWVudCBkdGRFbGVtZW50ID0gbWV0cmljcy5nZXRMZWFzdFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCQkJaWYgKGR0ZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBkdGRFbGVtZW50LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJhbm5vdGF0aW9uTWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGFubm90YXRpb25NYXA7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJnbG9iYWxQcm9wZXJ0eU1hcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBnbG9iYWxQcm9wZXJ0eU1hcDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENNRGF0YVR5cGVJbmZvVGFibGUgewotCQlwcm90ZWN0ZWQgU3RyaW5nW10gaW5zdGFuY2VWYWx1ZVRhYmxlOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZGF0YVR5cGVOYW1lVGFibGU7Ci0KLQkJcHVibGljIENNRGF0YVR5cGVJbmZvVGFibGUoKSB7Ci0JCQkvLyBoYXNodGFibGUucHV0KERURFR5cGUuQ0RBVEEsIG51bGwpKTsKLQkJCWluc3RhbmNlVmFsdWVUYWJsZSA9IG5ldyBTdHJpbmdbRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVLaW5kcy5sZW5ndGhdOwotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuRU5USVRZXSA9ICJlbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVElFU10gPSAiZW50aXRpZXMiOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOXSA9ICJubXRva2VuIjsgLy8kTk9OLU5MUy0xJAotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNdID0gIm5tdG9rZW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlkYXRhVHlwZU5hbWVUYWJsZSA9IG5ldyBTdHJpbmdbRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVLaW5kcy5sZW5ndGhdOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5DREFUQV0gPSBDTURhdGFUeXBlLkNEQVRBOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5JRF0gPSBDTURhdGFUeXBlLklEOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5JRFJFRl0gPSBDTURhdGFUeXBlLklEUkVGOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVFldID0gQ01EYXRhVHlwZS5FTlRJVFk7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTXSA9IENNRGF0YVR5cGUuRU5USVRJRVM7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5dID0gQ01EYXRhVHlwZS5OTVRPS0VOOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU10gPSBDTURhdGFUeXBlLk5NVE9LRU5TOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZVZhbHVlKERURFR5cGUgZHRkVHlwZSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkgewotCQkJCWludCBraW5kID0gKChEVERCYXNpY1R5cGUpIGR0ZFR5cGUpLmdldEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChraW5kID49IDAgJiYga2luZCA8IERUREJhc2ljVHlwZUltcGwuYmFzaWNUeXBlRGVzY3JpcHRpb25zLmxlbmd0aCkgewotCQkJCQlyZXN1bHQgPSBpbnN0YW5jZVZhbHVlVGFibGVba2luZF07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKERURFR5cGUgZHRkVHlwZSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkgewotCQkJCWludCBraW5kID0gKChEVERCYXNpY1R5cGUpIGR0ZFR5cGUpLmdldEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChraW5kID49IDAgJiYga2luZCA8IERUREJhc2ljVHlwZUltcGwuYmFzaWNUeXBlRGVzY3JpcHRpb25zLmxlbmd0aCkgewotCQkJCQlyZXN1bHQgPSBkYXRhVHlwZU5hbWVUYWJsZVtraW5kXTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFRERW51bWVyYXRpb25UeXBlKSB7Ci0JCQkJcmVzdWx0ID0gQ01EYXRhVHlwZS5FTlVNOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQW55Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBbnlDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNjUzOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBbnlDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BbnkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREFueUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREQW55Q29udGVudCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50IHsKLX0gLy8gRFREQW55Q29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzVhZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREF0dHJpYnV0ZSBleHRlbmRzIEVBdHRyaWJ1dGUsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQkvLyBOT04tR0VOIGludGVyZmFjZXMgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQKLQotCXB1YmxpYyBEVERUeXBlIGdldERURFR5cGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldERURFR5cGUoRFREVHlwZSB0eXBlKTsKLQotCXB1YmxpYyB2b2lkIHNldERUREJhc2ljVHlwZShpbnQgdmFsdWUpOwotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBzZWUgI3NldERlZmF1bHRLaW5kKERURERlZmF1bHRLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURERlZmF1bHRLaW5kIGdldERlZmF1bHRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQHNlZSAjZ2V0RGVmYXVsdEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRLaW5kKERURERlZmF1bHRLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdFZhbHVlU3RyaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JwotCSAqICAgICAgICAgICAgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZhbHVlU3RyaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUgPGVtPkRURCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERBdHRyaWJ1dGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREVsZW1lbnQoRFRERWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gRFREQXR0cmlidXRlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5OTg1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERCYXNpY1R5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREQmFzaWNUeXBlIGV4dGVuZHMgRUNsYXNzLCBEVERUeXBlIHsKLQkvLyBOT04tR0VOIGludGVyZmFjZXMgRFREVHlwZQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gVGhlCi0JICogbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQHNlZSAjc2V0S2luZChEVERCYXNpY1R5cGVLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREJhc2ljVHlwZV9LaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQmFzaWNUeXBlS2luZCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2luZChEVERCYXNpY1R5cGVLaW5kIHZhbHVlKTsKLX0gLy8gRFREQmFzaWNUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZUtpbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgyMTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERCYXNpY1R5cGVLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFREQmFzaWNUeXBlS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNEQVRBPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NEQVRBX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUY8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUZfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEUkVGID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRlNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEUkVGUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVFk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRZX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFkgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRJRVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRJRVNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUSUVTID0gNjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk1UT0tFTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk1UT0tFTlMgPSA4OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgTk9ORV9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoTk9ORSwgIk5PTkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0RBVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DREFUQTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDREFUQQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBDREFUQV9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoQ0RBVEEsICJDREFUQSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBJRF9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoSUQsICJJRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklEUkVGPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIElEUkVGX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChJRFJFRiwgIklEUkVGIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklEUkVGUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRlMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgSURSRUZTX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChJRFJFRlMsICJJRFJFRlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBFTlRJVFlfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKEVOVElUWSwgIkVOVElUWSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVElFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVOVElUSUVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUSUVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIEVOVElUSUVTX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChFTlRJVElFUywgIkVOVElUSUVTIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OTVRPS0VOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgTk1UT0tFTl9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoTk1UT0tFTiwgIk5NVE9LRU4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OTVRPS0VOUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBOTVRPS0VOU19MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoTk1UT0tFTlMsICJOTVRPS0VOUyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERCYXNpY1R5cGVLaW5kW117Tk9ORV9MSVRFUkFMLCBDREFUQV9MSVRFUkFMLCBJRF9MSVRFUkFMLCBJRFJFRl9MSVRFUkFMLCBJRFJFRlNfTElURVJBTCwgRU5USVRZX0xJVEVSQUwsIEVOVElUSUVTX0xJVEVSQUwsIE5NVE9LRU5fTElURVJBTCwgTk1UT0tFTlNfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERCYXNpY1R5cGVLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFREQmFzaWNUeXBlS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREQmFzaWNUeXBlS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9ORSA6Ci0JCQkJcmV0dXJuIE5PTkVfTElURVJBTDsKLQkJCWNhc2UgQ0RBVEEgOgotCQkJCXJldHVybiBDREFUQV9MSVRFUkFMOwotCQkJY2FzZSBJRCA6Ci0JCQkJcmV0dXJuIElEX0xJVEVSQUw7Ci0JCQljYXNlIElEUkVGIDoKLQkJCQlyZXR1cm4gSURSRUZfTElURVJBTDsKLQkJCWNhc2UgSURSRUZTIDoKLQkJCQlyZXR1cm4gSURSRUZTX0xJVEVSQUw7Ci0JCQljYXNlIEVOVElUWSA6Ci0JCQkJcmV0dXJuIEVOVElUWV9MSVRFUkFMOwotCQkJY2FzZSBFTlRJVElFUyA6Ci0JCQkJcmV0dXJuIEVOVElUSUVTX0xJVEVSQUw7Ci0JCQljYXNlIE5NVE9LRU4gOgotCQkJCXJldHVybiBOTVRPS0VOX0xJVEVSQUw7Ci0JCQljYXNlIE5NVE9LRU5TIDoKLQkJCQlyZXR1cm4gTk1UT0tFTlNfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFREQmFzaWNUeXBlS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFREQmFzaWNUeXBlS2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMWE5YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFREQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERfRVJST1JfTElORV9QUkVGSVggPSAiPCEtLUVSUk9SICI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERfRVJST1JfTElORV9TVUZGSVggPSAiIC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfRVhURU5TSU9OID0gImR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUlfRVhURU5TSU9OID0gInhtaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfWE1JX0VYVEVOU0lPTiA9ICJkdGQueG1pIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3M2JjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERDb250ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERDb250ZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQgPGVtPkRURCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREZpbGUoRFRERmlsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERDb250ZW50X0RUREZpbGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRURENvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgZ2V0RFRERmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpOwotCi19IC8vIERURENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERGVmYXVsdEtpbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERGVmYXVsdEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2Mzc4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURERlZmF1bHRLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURERlZmF1bHRLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERGVmYXVsdEtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklNUExJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU1QTElFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVSVJFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRVFVSVJFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRUQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRklYRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJWEVEID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PRklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9GSVhFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9GSVhFRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTVBMSUVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU1QTElFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTVBMSUVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBJTVBMSUVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoSU1QTElFRCwgIklNUExJRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVRVUlSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRVFVSVJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRVFVSVJFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgUkVRVUlSRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChSRVFVSVJFRCwgIlJFUVVJUkVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRklYRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIEZJWEVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoRklYRUQsICJGSVhFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT0ZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT0ZJWEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBOT0ZJWEVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoTk9GSVhFRCwgIk5PRklYRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERURERlZmF1bHRLaW5kW117SU1QTElFRF9MSVRFUkFMLCBSRVFVSVJFRF9MSVRFUkFMLCBGSVhFRF9MSVRFUkFMLCBOT0ZJWEVEX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRERGVmYXVsdEtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVEREZWZhdWx0S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRERGVmYXVsdEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIElNUExJRUQgOgotCQkJCXJldHVybiBJTVBMSUVEX0xJVEVSQUw7Ci0JCQljYXNlIFJFUVVJUkVEIDoKLQkJCQlyZXR1cm4gUkVRVUlSRURfTElURVJBTDsKLQkJCWNhc2UgRklYRUQgOgotCQkJCXJldHVybiBGSVhFRF9MSVRFUkFMOwotCQkJY2FzZSBOT0ZJWEVEIDoKLQkJCQlyZXR1cm4gTk9GSVhFRF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVEREZWZhdWx0S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRERGVmYXVsdEtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMjJlZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSA8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnQgZXh0ZW5kcyBFQ2xhc3MsIERURENvbnRlbnQsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQotCXB1YmxpYyB2b2lkIGFkZERUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgYXR0cmlidXRlKTsKLQotCS8vIHJldHVybnMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIHNhbWUgRFRERmlsZSB0aGF0IHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKCk7Ci0KLQkvLyByZXR1cm4gYSBicmllZiBzdHJpbmcgbGlzdGluZyB0aGUgYXR0cmlidXRlcwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlRGV0YWlsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGVudChEVERFbGVtZW50Q29udGVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJlbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnRDb250ZW50IGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBBdHRyaWJ1dGU8L2I+PC9lbT4nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlCi0JICoge0BsaW5rIERUREF0dHJpYnV0ZX0uIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEKLQkgKiBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQKLQkgKiBAbW9kZWwgdHlwZT0iRFREQXR0cmlidXRlIiBvcHBvc2l0ZT0iRFRERWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERUREF0dHJpYnV0ZSgpOwotCi19IC8vIERUREVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjZTRmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnRDb250ZW50IGV4dGVuZHMgRU9iamVjdCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCi0JLy8gZm9yIHNob3dpbmcgbmFtZXMgdG8gYmUgdXNlZCBpbiB0aGUgdHJlZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKTsKLQotCS8vIGZvciBzaG93aW5nIGl0ZW1zIGluIHRoZSB0YWJsZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudERldGFpbCgpOwotCi0JcHVibGljIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpOwotCi0JLy8gZ2V0IHRoZSBtb3N0IG91dGVyIERUREdyb3VwQ29udGVudAotCXB1YmxpYyBEVERHcm91cENvbnRlbnQgZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0KLQkvLyByZXR1cm5zIHRydWUgaWYgdGhpcyBlbGVtZW50IGNvbnRlbnQgaXMgdGhlIGZpcnN0Ci0JLy8gaW4gdGhlIGVsZW1lbnQKLQkvLyBlZyA8IUVMRU1FTlQgYmxhaCBmaXJzdEVsZW1lbnQ+Ci0JLy8gPCFFTEVNRU5UIGJsYWggKChmaXJzdEVsZW1lbnQsIHNlY29uZEVsZW1lbnQpIHwgbGFzdEVsZW1lbnQpCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdyb3VwKERUREdyb3VwQ29udGVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250ZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERHcm91cENvbnRlbnQgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JvdXAoRFRER3JvdXBDb250ZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250ZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50KERUREVsZW1lbnQgdmFsdWUpOwotCi19IC8vIERUREVsZW1lbnRDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWIyNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQjZ2V0UmVmZXJlbmNlZEVsZW1lbnQgPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIEVsZW1lbnQ8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlZmVyZW5jZWRFbGVtZW50KERUREVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudCBnZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCA8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkRWxlbWVudChEVERFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbXB0eUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW1wdHlDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGQ1YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbXB0eUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtcHR5IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbXB0eUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW1wdHlDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotfSAvLyBEVERFbXB0eUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ZjNzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW50aXR5IGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5PC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtZXRlckVudGl0eShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNQYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGVudChEVERFbnRpdHlDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9Db250ZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRUREVudGl0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRlbnQoRFRERW50aXR5Q29udGVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJtIEVudGl0eSBSZWY8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVudGl0eSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFybUVudGl0eVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudH0uIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cwotCSAqIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqICAgICAgICAgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IgotCSAqICAgICAgICBvcHBvc2l0ZT0iZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpOwotCi19IC8vIERUREVudGl0eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0YzJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlDb250ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnRpdHlDb250ZW50IGV4dGVuZHMgRU9iamVjdCwgRFRET2JqZWN0IHsKLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBFbnRpdHk8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbnRpdHk8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREVERFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXREVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkgPGVtPkRURCBFbnRpdHk8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbnRpdHk8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREVERFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotfSAvLyBEVERFbnRpdHlDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDRhYjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJlbnRpdHlSZWZlcmVuY2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSB2YWx1ZSk7Ci0KLX0gLy8gRFRERW50aXR5UmVmZXJlbmNlQ29udGVudAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1Hcm91cEtpbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bUdyb3VwS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTBiOGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bUdyb3VwS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtR3JvdXBLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERW51bUdyb3VwS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TkFNRSBUT0tFTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX1RPS0VOX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVEFUSU9OIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PVEFUSU9OX0dST1VQX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9HUk9VUCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OQU1FIFRPS0VOIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TkFNRSBUT0tFTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbAotCSAqIG9iamVjdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05BTUVfVE9LRU5fR1JPVVAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREVudW1Hcm91cEtpbmQgTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMID0gbmV3IERUREVudW1Hcm91cEtpbmQoTkFNRV9UT0tFTl9HUk9VUCwgIk5BTUVfVE9LRU5fR1JPVVAiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UQVRJT04gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT1RBVElPTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT1RBVElPTl9HUk9VUAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZCBOT1RBVElPTl9HUk9VUF9MSVRFUkFMID0gbmV3IERUREVudW1Hcm91cEtpbmQoTk9UQVRJT05fR1JPVVAsICJOT1RBVElPTl9HUk9VUCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERFbnVtR3JvdXBLaW5kW117TkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMLCBOT1RBVElPTl9HUk9VUF9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREVudW1Hcm91cEtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERFbnVtR3JvdXBLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERFbnVtR3JvdXBLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOQU1FX1RPS0VOX0dST1VQIDoKLQkJCQlyZXR1cm4gTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMOwotCQkJY2FzZSBOT1RBVElPTl9HUk9VUCA6Ci0JCQkJcmV0dXJuIE5PVEFUSU9OX0dST1VQX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERUREVudW1Hcm91cEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERUREVudW1Hcm91cEtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1lcmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBlZjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnVtZXJhdGlvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnVtZXJhdGlvblR5cGUgZXh0ZW5kcyBFRW51bSwgRFREVHlwZSB7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RW51bUxpdGVyYWxzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIFRoZQotCSAqIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlCi0JICogcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBzZWUgI3NldEtpbmQoRFRERW51bUdyb3VwS2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtZXJhdGlvblR5cGVfS2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudW1Hcm91cEtpbmQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtpbmQoRFRERW51bUdyb3VwS2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREVERGaWxlKERUREZpbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFRERW51bWVyYXRpb25UeXBlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGaWxlIGdldERUREZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpOwotCi19IC8vIERUREVudW1lcmF0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFcnJvck1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXJyb3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTUwNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFcnJvck1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFRERXJyb3JNZXNzYWdlIHsKLQlwdWJsaWMgU3RyaW5nIGVycm9yS2V5OwotCXB1YmxpYyBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCXB1YmxpYyBTdHJpbmcgbGluZU5vOwotCXB1YmxpYyBTdHJpbmcgY2hhck9mZlNldDsKLQlwdWJsaWMgU3RyaW5nIGRlY2xhcmF0aW9uVHlwZTsKLQlwdWJsaWMgU3RyaW5nIGRlY2xhcmF0aW9uTmFtZTsKLQlwdWJsaWMgU3RyaW5nIHNvdXJjZUxpbmU7Ci0KLQotCXB1YmxpYyBEVERFcnJvck1lc3NhZ2UoU3RyaW5nIGRlY2xhcmF0aW9uVHlwZSwgU3RyaW5nIGRlY2xhcmF0aW9uTmFtZSwgU3RyaW5nIGxpbmVObywgU3RyaW5nIGNoYXJPZmZTZXQsIFN0cmluZyBlcnJvcktleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQl0aGlzKGRlY2xhcmF0aW9uVHlwZSwgZGVjbGFyYXRpb25OYW1lLCBsaW5lTm8sIGNoYXJPZmZTZXQsIGVycm9yS2V5LCBlcnJvck1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBEVERFcnJvck1lc3NhZ2UoU3RyaW5nIGRlY2xhcmF0aW9uVHlwZSwgU3RyaW5nIGRlY2xhcmF0aW9uTmFtZSwgU3RyaW5nIGxpbmVObywgU3RyaW5nIGNoYXJPZmZTZXQsIFN0cmluZyBlcnJvcktleSwgU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHNyY0xpbmUpIHsKLQkJdGhpcy5kZWNsYXJhdGlvblR5cGUgPSBkZWNsYXJhdGlvblR5cGU7Ci0JCXRoaXMuZGVjbGFyYXRpb25OYW1lID0gZGVjbGFyYXRpb25OYW1lOwotCQl0aGlzLmxpbmVObyA9IGxpbmVObzsKLQkJdGhpcy5jaGFyT2ZmU2V0ID0gY2hhck9mZlNldDsKLQkJdGhpcy5lcnJvcktleSA9IGVycm9yS2V5OwotCQl0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQkJdGhpcy5zb3VyY2VMaW5lID0gc3JjTGluZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIigiICsgZGVjbGFyYXRpb25UeXBlICsgIjoiICsgZGVjbGFyYXRpb25OYW1lICsgIikgIiArIGxpbmVObyArICI6IiArIGNoYXJPZmZTZXQgKyAiICIgKyBlcnJvck1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCi0JCXJldHVybiAiKCIgKyBkZWNsYXJhdGlvblR5cGUgKyAiOiIgKyBkZWNsYXJhdGlvbk5hbWUgKyAiKSAiICsgbGluZU5vICsgIjoiICsgY2hhck9mZlNldCArICIgIiArIGVycm9yTWVzc2FnZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGY0MDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgYW4gSURvbWFpbk1vZGVsIHRvIGF1Z21lbnQKLSAqIGdldEVsZW1lbnRQcm9wZXJ0eSBmb3IgYW55IERURCBvYmplY3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERXh0ZW5kZXIgewotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KERURE9iamVjdCBkdGRPYmplY3QsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjVjYTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZXJuYWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZXJuYWwgRW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREV4dGVybmFsRW50aXR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREV4dGVybmFsRW50aXR5IGV4dGVuZHMgRFRERW50aXR5Q29udGVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeXN0ZW0gSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN5c3RlbUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFeHRlcm5hbEVudGl0eV9TeXN0ZW1JRCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTeXN0ZW1JRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN5c3RlbUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaWMgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1YmxpY0lEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFeHRlcm5hbEVudGl0eV9QdWJsaWNJRCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdWJsaWNJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1YmxpY0lEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE5vdGF0aW9uKERURE5vdGF0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREV4dGVybmFsRW50aXR5X05vdGF0aW9uKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJlbnRpdHkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURE5vdGF0aW9uIGdldE5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGF0aW9uKERURE5vdGF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZShEVERGaWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREV4dGVybmFsRW50aXR5X0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGaWxlIGdldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKERUREZpbGUgdmFsdWUpOwotCi19IC8vIERUREV4dGVybmFsRW50aXR5Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4M2QyNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdCBwcm92aWRlcyBhCi0gKiBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jCi0gKiAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRUREZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERHcm91cENvbnRlbnQgY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF0dHJpYnV0ZTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQXR0cmlidXRlIGNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudCBjcmVhdGVEVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbXB0eUNvbnRlbnQgY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFueSBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QW55IENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREFueUNvbnRlbnQgY3JlYXRlRFREQW55Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBDRGF0YUNvbnRlbnQgY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsZTwvZW0+Jy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZpbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgY3JlYXRlRFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNpYyBUeXBlPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzaWMgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQmFzaWNUeXBlIGNyZWF0ZURUREJhc2ljVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVEROb3RhdGlvbiBjcmVhdGVEVEROb3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHk8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBjcmVhdGVEVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFeHRlcm5hbEVudGl0eSBjcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREludGVybmFsRW50aXR5IGNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhY2thZ2UgZ2V0RFREUGFja2FnZSgpOwotCi19IC8vIERUREZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2MzNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREZpbGUgZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERPYmplY3QgewotCi0JcHVibGljIEVMaXN0IGdldERURE9iamVjdCgpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnQoKTsKLQotCXB1YmxpYyBMaXN0IGxpc3REVEROb3RhdGlvbigpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVudGl0eSgpOwotCi0JcHVibGljIExpc3QgbGlzdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCXB1YmxpYyBEVERFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVERFbnRpdHkgZmluZEVudGl0eShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gZmluZE5vdGF0aW9uKFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZmluZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoYm9vbGVhbiBpbmNsdWRlRXJyb3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyc2UgRXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJzZUVycm9yKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1BhcnNlRXJyb3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IgPGVtPlBhcnNlIEVycm9yPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1BhcnNlRXJyb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnNlRXJyb3IoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgQ29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERURENvbnRlbnR9LiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgQ29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBDb250ZW50PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0RURENvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUKLQkgKiBAbW9kZWwgdHlwZT0iRFREQ29udGVudCIgb3Bwb3NpdGU9IkRUREZpbGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREVERDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRW51bWVyYXRpb24gVHlwZTwvYj48L2VtPicKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFRERW51bWVyYXRpb25UeXBlfS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEKLQkgKiBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT4nCi0JICogICAgICAgICBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlCi0JICogQG1vZGVsIHR5cGU9IkRUREVudW1lcmF0aW9uVHlwZSIgb3Bwb3NpdGU9IkRUREZpbGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQotfSAvLyBEVERGaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNDdkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyb3VwIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREdyb3VwQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERHcm91cENvbnRlbnQgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudCB7Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRQb3NpdGlvbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kfS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZAotCSAqIEBzZWUgI3NldEdyb3VwS2luZChEVERHcm91cEtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREdyb3VwS2luZCBnZXRHcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQHNlZSAjZ2V0R3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERFbGVtZW50Q29udGVudH0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogICAgICAgICBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREdyb3VwQ29udGVudF9Db250ZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAKLQkgKiBAbW9kZWwgdHlwZT0iRFRERWxlbWVudENvbnRlbnQiIG9wcG9zaXRlPSJncm91cCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50KCk7Ci0KLX0gLy8gRFRER3JvdXBDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxMGRlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERHcm91cEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERHcm91cEtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NFUVVFTkNFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSE9JQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0hPSUNFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTRVFVRU5DRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRER3JvdXBLaW5kIFNFUVVFTkNFX0xJVEVSQUwgPSBuZXcgRFRER3JvdXBLaW5kKFNFUVVFTkNFLCAiU0VRVUVOQ0UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hPSUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0hPSUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NIT0lDRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRER3JvdXBLaW5kIENIT0lDRV9MSVRFUkFMID0gbmV3IERUREdyb3VwS2luZChDSE9JQ0UsICJDSE9JQ0UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmRbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFRER3JvdXBLaW5kW117U0VRVUVOQ0VfTElURVJBTCwgQ0hPSUNFX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERHcm91cEtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERHcm91cEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERHcm91cEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNFUVVFTkNFIDoKLQkJCQlyZXR1cm4gU0VRVUVOQ0VfTElURVJBTDsKLQkJCWNhc2UgQ0hPSUNFIDoKLQkJCQlyZXR1cm4gQ0hPSUNFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERUREdyb3VwS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRER3JvdXBLaW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREludGVybmFsRW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREludGVybmFsRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODRhMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERJbnRlcm5hbEVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVybmFsIEVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREludGVybmFsRW50aXR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREludGVybmFsRW50aXR5IGV4dGVuZHMgRFRERW50aXR5Q29udGVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEVERJbnRlcm5hbEVudGl0eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTJkMjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETGV4aWNhbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGNsYXNzIERURExleGljYWxJbmZvIGltcGxlbWVudHMgRFREU291cmNlT2Zmc2V0IHsKLQkvLyBCZWdpbiBVc2VyIERlZmluZWQgTWV0aG9kcwotCWludCBzdGFydE9mZnNldDsKLQlpbnQgZW5kT2Zmc2V0OwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBzdGFydE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJdGhpcy5zdGFydE9mZnNldCA9IHY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBlbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0KLQkJdGhpcy5lbmRPZmZzZXQgPSB2OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFN0YXJ0T2Zmc2V0R2VuKCkgewotCi0JCXJldHVybiBzdGFydE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhcnRPZmZzZXRHZW4oaW50IHYpIHsKLQotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEVuZE9mZnNldEdlbigpIHsKLQotCQlyZXR1cm4gZW5kT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVuZE9mZnNldEdlbihpbnQgdikgewotCi0KLQkJdGhpcy5lbmRPZmZzZXQgPSB2OwotCX0KLX0vLyBEVERTb3VyY2VPZmZzZXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyM2UyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURE5vdGF0aW9uIGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeXN0ZW0gSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN5c3RlbUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTeXN0ZW1JRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN5c3RlbUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaWMgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1YmxpY0lEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdWJsaWNJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1YmxpY0lEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERFeHRlcm5hbEVudGl0eX0uIEl0IGlzCi0JICogYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX0VudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uCi0JICogQG1vZGVsIHR5cGU9IkRUREV4dGVybmFsRW50aXR5IiBvcHBvc2l0ZT0ibm90YXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVudGl0eSgpOwotCi19IC8vIERURE5vdGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9iamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzODRiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vLyBSZWYgcGFja2FnZQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIERURE9iamVjdCBleHRlbmRzIEVPYmplY3QgewotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKTsKLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKTsKLQotfSAvLyBEVERPYmplY3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzOWFhMTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRET2NjdXJyZW5jZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERPY2N1cnJlbmNlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+T05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUFRJT05BTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPUFRJT05BTF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSA2MzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9PUl9NT1JFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkVfT1JfTU9SRSA9IDQzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1pFUk9fT1JfTU9SRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWkVST19PUl9NT1JFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT05FX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT05FLCAiT05FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1BUSU9OQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT1BUSU9OQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlIE9QVElPTkFMX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT1BUSU9OQUwsICJPUFRJT05BTCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkUgT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9PUl9NT1JFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPTkVfT1JfTU9SRV9MSVRFUkFMID0gbmV3IERURE9jY3VycmVuY2VUeXBlKE9ORV9PUl9NT1JFLCAiT05FX09SX01PUkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1pFUk9fT1JfTU9SRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgWkVST19PUl9NT1JFX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoWkVST19PUl9NT1JFLCAiWkVST19PUl9NT1JFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZVtde09ORV9MSVRFUkFMLCBPUFRJT05BTF9MSVRFUkFMLCBPTkVfT1JfTU9SRV9MSVRFUkFMLCBaRVJPX09SX01PUkVfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERPY2N1cnJlbmNlVHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURURE9jY3VycmVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERPY2N1cnJlbmNlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgT05FIDoKLQkJCQlyZXR1cm4gT05FX0xJVEVSQUw7Ci0JCQljYXNlIE9QVElPTkFMIDoKLQkJCQlyZXR1cm4gT1BUSU9OQUxfTElURVJBTDsKLQkJCWNhc2UgT05FX09SX01PUkUgOgotCQkJCXJldHVybiBPTkVfT1JfTU9SRV9MSVRFUkFMOwotCQkJY2FzZSBaRVJPX09SX01PUkUgOgotCQkJCXJldHVybiBaRVJPX09SX01PUkVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRET2NjdXJyZW5jZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERURE9jY3VycmVuY2VUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBDRGF0YUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNlNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBDIERhdGEgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFBDRGF0YUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUENEYXRhQ29udGVudCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50IHsKLX0gLy8gRFREUENEYXRhQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNmE1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuIEl0IGNvbnRhaW5zCi0gKiBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJkdGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vZXRvb2xzL2R0ZC5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFREUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsIDxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVsZW1lbnRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFJlcGVhdGFibGVDb250ZW50SW1wbCA8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERSZXBlYXRhYmxlQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERSZXBlYXRhYmxlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERHcm91cENvbnRlbnRJbXBsIDxlbT5Hcm91cCBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERHcm91cENvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRER3JvdXBDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0dST1VQID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCA8ZW0+QXR0cmlidXRlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19DSEFOR0VBQkxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0NIQU5HRUFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm9sYXRpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVk9MQVRJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19UUkFOU0lFTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBMaXRlcmFsPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5zZXR0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19VTlNFVFRBQkxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOU0VUVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fSUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19DT01NRU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BdHRyaWJ1dGU8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRUxFTUVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19JTlRFUkZBQ0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FSURfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0RURF9GSUxFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19DT01NRU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19DT05URU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVtcHR5Q29udGVudEltcGwgPGVtPkVtcHR5IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVtcHR5Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbXB0eUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQW55Q29udGVudEltcGwgPGVtPkFueSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBbnlDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREFueUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFueSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQQ0RhdGFDb250ZW50SW1wbCA8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQQ0RhdGFDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURFBDRGF0YUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCA8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBFbGVtZW50PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsIDxlbT5GaWxlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEUgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX0NPTU1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnNlIEVycm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19QQVJTRV9FUlJPUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIENvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fRFREX0NPTlRFTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9iPjwvZW0+JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5GaWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREJhc2ljVHlwZUltcGwgPGVtPkJhc2ljIFR5cGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREJhc2ljVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERCYXNpY1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX09QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VJRF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0tJTkQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNpYyBUeXBlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudW1lcmF0aW9uVHlwZUltcGwgPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudW1lcmF0aW9uVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEUgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVFTlVNX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVFTlVNX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FRU5VTV9fSU5TVEFOQ0VfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVFTlVNX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJpYWxpemFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fU0VSSUFMSVpBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVMaXRlcmFsczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0VMSVRFUkFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EID0gRWNvcmVQYWNrYWdlLkVFTlVNX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgPSBFY29yZVBhY2thZ2UuRUVOVU1fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUVOVU1fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERDb250ZW50SW1wbCA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9DT05URU5UID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9DT05URU5UX19EVERfRklMRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsIDxlbT5Ob3RhdGlvbjwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fRFREX0ZJTEUgPSBEVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX0NPTU1FTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeXN0ZW0gSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19TWVNURU1fSUQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaWMgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19QVUJMSUNfSUQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX0VOVElUWSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwgPGVtPkVudGl0eTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5USVRZID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0RURF9GSUxFID0gRFREX0NPTlRFTlRfX0RURF9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQ09NTUVOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBFbnRpdHk8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQ09OVEVOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcm0gRW50aXR5IFJlZjwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnRpdHk8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5Q29udGVudEltcGwgPGVtPkVudGl0eSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudGl0eUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9DT05URU5UID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREV4dGVybmFsRW50aXR5SW1wbCA8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFeHRlcm5hbEVudGl0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA9IERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeXN0ZW0gSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lEID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRESW50ZXJuYWxFbnRpdHlJbXBsIDxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREludGVybmFsRW50aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREludGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZID0gRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwgPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFID0gRFREX0NPTlRFTlRfX0RURF9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsIDxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUgPGVtPk9jY3VycmVuY2UgVHlwZTwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERPY2N1cnJlbmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfT0NDVVJSRU5DRV9UWVBFID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVEREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfREVGQVVMVF9LSU5EID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZCA8ZW0+QmFzaWMgVHlwZSBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQmFzaWNUeXBlS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9LSU5EID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZCA8ZW0+RW51bSBHcm91cCBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW51bUdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5VTV9HUk9VUF9LSU5EID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERHcm91cEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0tJTkQgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZSA8ZW0+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgPSAyNTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCA8ZW0+RWxlbWVudCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbGVtZW50Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCA8ZW0+R3JvdXAgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERHcm91cENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRHcm91cEtpbmQoKQotCSAqIEBzZWUgI2dldERUREdyb3VwQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0Q29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRER3JvdXBDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUgPGVtPkF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdEtpbmQoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRWYWx1ZVN0cmluZyA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRWYWx1ZVN0cmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbGVtZW50X0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0NvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlIDxlbT5EVEQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudCA8ZW0+RW1wdHkgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbXB0eUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudCA8ZW0+QW55IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFueSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERBbnlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQgPGVtPlBDIERhdGEgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERQQ0RhdGFDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IDxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCA8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQjZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCA8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERSZXBlYXRhYmxlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UgPGVtPk9jY3VycmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T2NjdXJyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURFJlcGVhdGFibGVDb250ZW50X09jY3VycmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSA8ZW0+RmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREZpbGVfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJzZSBFcnJvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREZpbGVfUGFyc2VFcnJvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRURCBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREZpbGVfRFREQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUgPGVtPkJhc2ljIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2ljIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQmFzaWNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQoKQotCSAqIEBzZWUgI2dldERUREJhc2ljVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQmFzaWNUeXBlX0tpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlIDxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudW1lcmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kKCkKLQkgKiBAc2VlICNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlKCkKLQkgKiBAc2VlICNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVEROb3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5c3RlbSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGljIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5KCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRETm90YXRpb25fRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERW50aXR5X0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjaXNQYXJhbWV0ZXJFbnRpdHkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZigpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQgPGVtPkVudGl0eSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW50aXR5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREVudGl0eUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5IDxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREV4dGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfU3lzdGVtSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1YmxpYyBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0UHVibGljSUQoKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9QdWJsaWNJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24oKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSA8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERJbnRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldERUREludGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERJbnRlcm5hbEVudGl0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCA8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlKCkKLQkgKiBAc2VlICNnZXREVERDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERDb250ZW50X0RUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZSA8ZW0+T2NjdXJyZW5jZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk9jY3VycmVuY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRET2NjdXJyZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRERGVmYXVsdEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kIDxlbT5CYXNpYyBUeXBlIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QmFzaWMgVHlwZSBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERUREJhc2ljVHlwZUtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kIDxlbT5FbnVtIEdyb3VwIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RW51bSBHcm91cCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERUREVudW1Hcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+R3JvdXAgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERUREdyb3VwS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlIDxlbT5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGYWN0b3J5IGdldERUREZhY3RvcnkoKTsKLQotfSAvLyBEVERQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2ODYyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlLiBJdCBpcwotCSAqIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZgotCSAqIEBtb2RlbCBvcHBvc2l0ZT0icGFybUVudGl0eVJlZiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotfSAvLyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5Y2Q0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlcGVhdGFibGVDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBlYXRhYmxlIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UgPGVtPk9jY3VycmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURFJlcGVhdGFibGVDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2NjdXJyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAc2VlICNzZXRPY2N1cnJlbmNlKERURE9jY3VycmVuY2VUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFJlcGVhdGFibGVDb250ZW50X09jY3VycmVuY2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERPY2N1cnJlbmNlVHlwZSBnZXRPY2N1cnJlbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UgPGVtPk9jY3VycmVuY2U8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2NjdXJyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlCi0JICogQHNlZSAjZ2V0T2NjdXJyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T2NjdXJyZW5jZShEVERPY2N1cnJlbmNlVHlwZSB2YWx1ZSk7Ci0KLX0gLy8gRFREUmVwZWF0YWJsZUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNzk5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIERURFJlc291cmNlIHsKLQkvLyBFbnVtZXJhdGlvbiBDb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllJQ09OID0gImljb25zL2FueS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVElDT04gPSAiaWNvbnMvZWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZSUNPTiA9ICJpY29ucy9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURUlDT04gPSAiaWNvbnMvYXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTklDT04gPSAiaWNvbnMvbm90YXRpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZSUNPTiA9ICJpY29ucy9lbXB0eWNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQUlDT04gPSAiaWNvbnMvb25lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlSRUZFUkVOQ0VJQ09OID0gImljb25zL2VudGl0eV9yZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FSUNPTiA9ICJpY29ucy9vbmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMSUNPTiA9ICJpY29ucy9vcHRpb25hbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFSUNPTiA9ICJpY29ucy9vbmVvcm1vcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVJQ09OID0gImljb25zL3plcm9vcm1vcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FU0VRVUVOQ0VJQ09OID0gImljb25zL29uZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTFNFUVVFTkNFSUNPTiA9ICJpY29ucy9vcHRpb25hbHNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvemVyb29ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUNIT0lDRUlDT04gPSAiaWNvbnMvb25lY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTENIT0lDRUlDT04gPSAiaWNvbnMvb3B0aW9uYWxjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRUNIT0lDRUlDT04gPSAiaWNvbnMvb25lb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy96ZXJvb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUREZJTEVJQ09OID0gImljb25zL0RUREZpbGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXRFREID0gImljb25zL25ld2R0ZF93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0hUTUxGT1JNID0gImljb25zL2dlbmh0bWZvcm1fd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREU291cmNlT2Zmc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFNvdXJjZU9mZnNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjMyYjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREU291cmNlT2Zmc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGludGVyZmFjZSBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdik7Ci0KLX0vLyBEVERTb3VyY2VPZmZzZXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OGZkYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGludGVyZmFjZSBEVERUeXBlIGV4dGVuZHMgRFRET2JqZWN0IHsKLQkvLyBjb25zdGFudCBzdHJpbmdzIGZvciBkdGQgYXR0cmlidXRlIHR5cGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOb25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSAiQ2hhcmFjdGVyIERhdGEgKENEQVRBKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJJZGVudGlmaWVyIChJRCkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSAiSUQgUmVmZXJlbmNlIChJRFJFRikiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gIklEIFJlZmVyZW5jZXMgKElEUkVGUykiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gIkVudGl0eSBOYW1lIChFTlRJVFkpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTID0gIkVudGl0eSBOYW1lcyAoRU5USVRJRVMpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU4gPSAiTmFtZSBUb2tlbiAoTk1UT0tFTikiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSAiTmFtZSBUb2tlbnMgKE5NVE9LRU5TKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNX05BTUVfVE9LRU5fR1JPVVAgPSAiRW51bWVyYXRlZCBOYW1lIFRva2VucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNX05PVEFUSU9OX0dST1VQID0gIkVudW1lcmF0ZWQgTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvWE1MU2NoZW1hRGVmaW5lZFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvWE1MU2NoZW1hRGVmaW5lZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxMzhmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL1hNTFNjaGVtYURlZmluZWRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxTY2hlbWFEZWZpbmVkVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU1RSSU5HX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJTkcgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Qk9PTEVBTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCT09MRUFOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZMT0FUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZMT0FUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTE9BVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRE9VQkxFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1VCTEUgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVDSU1BTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNERUNJTUFMX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUNJTUFMID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVJTlNUQU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FSU5TVEFOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FRFVSQVRJT048L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRURVUkFUSU9OX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FRFVSQVRJT04gPSA3OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVDVVJSSU5HSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUNVUlJJTkdJTlNUQU5UID0gODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJJTkFSWTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCSU5BUllfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkFSWSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVVJJX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUkkgPSAxMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU5URUdFUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUiA9IDExOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNEQVRFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRFID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBOT05FX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoTk9ORSwgIk5PTkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NUUklORwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgU1RSSU5HX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoU1RSSU5HLCAiU1RSSU5HIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJPT0xFQU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CT09MRUFOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JPT0xFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIEJPT0xFQU5fTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShCT09MRUFOLCAiQk9PTEVBTiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GTE9BVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZMT0FUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZMT0FUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBGTE9BVF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKEZMT0FULCAiRkxPQVQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RPVUJMRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgRE9VQkxFX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoRE9VQkxFLCAiRE9VQkxFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRFQ0lNQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ERUNJTUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RFQ0lNQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIERFQ0lNQUxfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShERUNJTUFMLCAiREVDSU1BTCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUVJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVJTlNUQU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBUSU1FSU5TVEFOVF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFRJTUVJTlNUQU5ULCAiVElNRUlOU1RBTlQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRURVUkFUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VElNRURVUkFUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVEVVJBVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVElNRURVUkFUSU9OX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVElNRURVUkFUSU9OLCAiVElNRURVUkFUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQ1VSUklOR0lOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRUNVUlJJTkdJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsCi0JICogb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVDVVJSSU5HSU5TVEFOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFJFQ1VSUklOR0lOU1RBTlQsICJSRUNVUlJJTkdJTlNUQU5UIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJJTkFSWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJJTkFSWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCSU5BUlkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIEJJTkFSWV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKEJJTkFSWSwgIkJJTkFSWSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1VSSQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVVJJX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVVJJLCAiVVJJIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lOVEVHRVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIElOVEVHRVJfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShJTlRFR0VSLCAiSU5URUdFUiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREFURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgREFURV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKERBVEUsICJEQVRFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBUSU1FX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVElNRSwgIlRJTUUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGVbXSBWQUxVRVNfQVJSQVkgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGVbXXtOT05FX0xJVEVSQUwsIFNUUklOR19MSVRFUkFMLCBCT09MRUFOX0xJVEVSQUwsIEZMT0FUX0xJVEVSQUwsIERPVUJMRV9MSVRFUkFMLCBERUNJTUFMX0xJVEVSQUwsIFRJTUVJTlNUQU5UX0xJVEVSQUwsIFRJTUVEVVJBVElPTl9MSVRFUkFMLCBSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwsIEJJTkFSWV9MSVRFUkFMLCBVUklfTElURVJBTCwgSU5URUdFUl9MSVRFUkFMLCBEQVRFX0xJVEVSQUwsIFRJTUVfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MU2NoZW1hRGVmaW5lZFR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlYTUxTY2hlbWFEZWZpbmVkVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxTY2hlbWFEZWZpbmVkVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9ORSA6Ci0JCQkJcmV0dXJuIE5PTkVfTElURVJBTDsKLQkJCWNhc2UgU1RSSU5HIDoKLQkJCQlyZXR1cm4gU1RSSU5HX0xJVEVSQUw7Ci0JCQljYXNlIEJPT0xFQU4gOgotCQkJCXJldHVybiBCT09MRUFOX0xJVEVSQUw7Ci0JCQljYXNlIEZMT0FUIDoKLQkJCQlyZXR1cm4gRkxPQVRfTElURVJBTDsKLQkJCWNhc2UgRE9VQkxFIDoKLQkJCQlyZXR1cm4gRE9VQkxFX0xJVEVSQUw7Ci0JCQljYXNlIERFQ0lNQUwgOgotCQkJCXJldHVybiBERUNJTUFMX0xJVEVSQUw7Ci0JCQljYXNlIFRJTUVJTlNUQU5UIDoKLQkJCQlyZXR1cm4gVElNRUlOU1RBTlRfTElURVJBTDsKLQkJCWNhc2UgVElNRURVUkFUSU9OIDoKLQkJCQlyZXR1cm4gVElNRURVUkFUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIFJFQ1VSUklOR0lOU1RBTlQgOgotCQkJCXJldHVybiBSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUw7Ci0JCQljYXNlIEJJTkFSWSA6Ci0JCQkJcmV0dXJuIEJJTkFSWV9MSVRFUkFMOwotCQkJY2FzZSBVUkkgOgotCQkJCXJldHVybiBVUklfTElURVJBTDsKLQkJCWNhc2UgSU5URUdFUiA6Ci0JCQkJcmV0dXJuIElOVEVHRVJfTElURVJBTDsKLQkJCWNhc2UgREFURSA6Ci0JCQkJcmV0dXJuIERBVEVfTElURVJBTDsKLQkJCWNhc2UgVElNRSA6Ci0JCQkJcmV0dXJuIFRJTUVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgWE1MU2NoZW1hRGVmaW5lZFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIFhNTFNjaGVtYURlZmluZWRUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQW55Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBbnlDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmJlMzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBbnlDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BbnkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERBbnlDb250ZW50SW1wbCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREFueUNvbnRlbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiQU5ZIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQW55Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQW55Q29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmODBmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQXR0cmlidXRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwjZ2V0RGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldERlZmF1bHRWYWx1ZVN0cmluZyA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgRUF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBEVERBdHRyaWJ1dGUgewotCi0JcHVibGljIERUREF0dHJpYnV0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERURFR5cGUgZ2V0RFREVHlwZSgpIHsKLQkJcmV0dXJuIChEVERUeXBlKSBnZXRFVHlwZSgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RFREVHlwZShEVERUeXBlIHR5cGUpIHsKLQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREVERCYXNpY1R5cGUoaW50IHZhbHVlKSB7Ci0JCURUREZhY3RvcnlJbXBsIGZhY3RvcnkgPSAoRFRERmFjdG9yeUltcGwpIERUREZhY3RvcnlJbXBsLmluc3RhbmNlKCk7Ci0JCS8vIHNldCBhdHRyaWJ1dGUgdHlwZQotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIDAgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfTk9ORSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMSA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMiA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9JRCgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMyA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9JRFJFRigpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNCA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9JRFJFRlMoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDUgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfRU5USVRZKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA2IDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA3IDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX05NVE9LRU4oKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDggOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKDEyOCk7Ci0KLQotCQlyZXN1bHQuYXBwZW5kKGdldE5hbWUoKSk7Ci0KLQotCQlTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN3aXRjaCAoZ2V0RGVmYXVsdEtpbmQoKS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIERURERlZmF1bHRLaW5kLklNUExJRUQgOgotCQkJCXZhbHVlLmFwcGVuZCgiI0lNUExJRUQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRCA6Ci0JCQkJdmFsdWUuYXBwZW5kKCIjUkVRVUlSRUQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBEVEREZWZhdWx0S2luZC5GSVhFRCA6Ci0JCQkJU3RyaW5nIHR5cGUgPSBnZXREVERUeXBlKCkudG9TdHJpbmcoKTsKLQkJCQlpZiAoISh0eXBlLmVxdWFscyhEVERUeXBlLklEKSB8fCB0eXBlLmVxdWFscyhEVERUeXBlLklEUkVGKSB8fCB0eXBlLmVxdWFscyhEVERUeXBlLkVOVU1fTkFNRV9UT0tFTl9HUk9VUCkgfHwgdHlwZS5lcXVhbHMoRFREVHlwZS5JRFJFRlMpKSkgewotCQkJCQl2YWx1ZS5hcHBlbmQoIiNGSVhFRCBcIiIpLmFwcGVuZChnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERURERlZmF1bHRLaW5kLk5PRklYRUQgOgotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpCi0JCQkJCXZhbHVlLmFwcGVuZCgiXCIiKS5hcHBlbmQoZGVmYXVsdFZhbHVlKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWJyZWFrOwotCQl9Ci0KLQotCQkvLyBHZXQgdGhlIGF0dHJpYnV0ZSB0eXBlCi0JCURUREVudGl0eSB0eXBlRW50ID0gZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJaWYgKHR5cGVFbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFwcGVuZCgiICUiICsgdHlwZUVudC5nZXROYW1lKCkgKyAiOyAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCURURFR5cGUgZHRkVHlwZSA9IGdldERURFR5cGUoKTsKLQkJCWlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJc3dpdGNoICgoKERUREJhc2ljVHlwZSkgZHRkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLkNEQVRBIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBDREFUQSAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLklEIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBJRCAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLklEUkVGIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBJRFJFRiAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLklEUkVGUyA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgSURSRUZTICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuRU5USVRZIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBFTlRJVFkgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5FTlRJVElFUyA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgRU5USVRJRVMgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBOTVRPS0VOICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlMgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIE5NVE9LRU5TICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERFbnVtZXJhdGlvblR5cGUpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKCIgIikuYXBwZW5kKGJ1aWxkRW51bVN0cmluZygoRFRERW51bWVyYXRpb25UeXBlKSBkdGRUeXBlKSkuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEVudW1TdHJpbmcoRFRERW51bWVyYXRpb25UeXBlIGVudW1UeXBlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkJaWYgKGVudW1UeXBlLmdldEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVApCi0JCQlyZXN1bHQgKz0gIk5PVEFUSU9OICI7IC8vJE5PTi1OTFMtMSQKLQotCi0JCUl0ZXJhdG9yIGkgPSBlbnVtVHlwZS5nZXRFbnVtTGl0ZXJhbHMoKS5pdGVyYXRvcigpOwotCQlpZiAoaS5oYXNOZXh0KCkpIHsKLQkJCXJlc3VsdCArPSAiKCIgKyAoKEVFbnVtTGl0ZXJhbCkgaS5uZXh0KCkpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdCArPSAiIHwgIiArICgoRUVudW1MaXRlcmFsKSBpLm5leHQoKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzdWx0ICs9ICIpICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKFN0cmluZ1tdIGVudW1WYWx1ZXMsIGludCBlbnVtS2luZCkgewotCQlEVERFbnVtZXJhdGlvblR5cGUgZW51bWVyYXRpb24gPSBEVERGYWN0b3J5SW1wbC5pbnN0YW5jZSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCQkvLyBlbnVtLnNldElEKCJFbnVtXyIgKyAoKERUREVsZW1lbnQpZ2V0TU9GRG9tYWluKCkpLmdldE5hbWUoKSArICJfIiArCi0JCS8vIGdldE5hbWUoKSk7Ci0JCURUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCQllbnVtZXJhdGlvbi5zZXRLaW5kKGdyb3VwS2luZCk7Ci0JCS8vIEVudW1lcmF0aW9uIHZhbHVlcwotCQlpZiAoZW51bVZhbHVlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlFY29yZVBhY2thZ2UgZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCQkJRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gKChFY29yZUZhY3RvcnkpIGVQYWNrYWdlLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkJLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbChlbnVtVmFsdWVzW2ldKTsKLQkJCQllbnVtTGl0ZXJhbC5zZXROYW1lKGVudW1WYWx1ZXNbaV0pOwotCQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoaSk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0VmFsdWUoaSk7Ci0KLQkJCQllbnVtZXJhdGlvbi5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCQkJfQotCQl9Ci0JCWdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW1lcmF0aW9uKTsKLQkJcmV0dXJuIGVudW1lcmF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyBUT0RPOiBmaW5pc2ggcG9ydAotCQkvLyByZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKGdldERUREVsZW1lbnQoKS5nZXRQYXRobmFtZSgpLAotCQkvLyAiQXR0ciIsIGdldE5hbWUoKSwgLTEpOwotCX0KLQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vIFRPRE86IGZpbmlzaCBwb3J0Ci0JCS8qCi0JCSAqIE9iamVjdFtdIHJlc3VsdCA9IERURFBhdGhuYW1lVXRpbC5wYXJzZVBhdGhDb21wb25lbnQocmVsYXRpdmVQYXRoKTsKLQkJICogCi0JCSAqIAotCQkgKiBTdHJpbmcgdHlwZSA9IChTdHJpbmcpcmVzdWx0WzBdOwotCQkgKiAKLQkJICogCi0JCSAqIGlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOwotCQkgKiAKLQkJICogCi0JCSAqIERURE9iamVjdCBvYmogPSBudWxsOyBpZiAodHlwZS5lcXVhbHMoIlR5cGUiKSkgeyBvYmogPQotCQkgKiBnZXREYXRhVHlwZSgpOyB9IGVsc2UgeyByZXR1cm4gbnVsbDsgfQotCQkgKiAKLQkJICogCi0JCSAqIFN0cmluZyByZXN0UGF0aCA9IChTdHJpbmcpcmVzdWx0WzNdOwotCQkgKiAKLQkJICogaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7Ci0JCSAqIHJldHVybiBvYmouZmluZE9iamVjdChyZXN0UGF0aCk7IH0KLQkJICovCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQotCQlEVERUeXBlIHR5cGUgPSBnZXREVERUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRFRERW51bWVyYXRpb25UeXBlKSB7Ci0JCQlEVERFbnVtZXJhdGlvblR5cGUgZW51bVR5cGUgPSAoRFRERW51bWVyYXRpb25UeXBlKSB0eXBlOwotCQkJSXRlcmF0b3IgaSA9IGVudW1UeXBlLmdldEVudW1MaXRlcmFscygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlyZXN1bHQuYWRkKCgoRUVudW1MaXRlcmFsKSBpLm5leHQoKSkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEtpbmQoKSA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVmYXVsdEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgREVGQVVMVF9LSU5EX0VERUZBVUxUID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEtpbmQoKSA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVmYXVsdEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVEREZWZhdWx0S2luZCBkZWZhdWx0S2luZCA9IERFRkFVTFRfS0lORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWVTdHJpbmcgPSBERUZBVUxUX1ZBTFVFX1NUUklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHkgYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERBdHRyaWJ1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURERlZmF1bHRLaW5kIGdldERlZmF1bHRLaW5kKCkgewotCQlyZXR1cm4gZGVmYXVsdEtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRLaW5kKERURERlZmF1bHRLaW5kIG5ld0RlZmF1bHRLaW5kKSB7Ci0JCURURERlZmF1bHRLaW5kIG9sZERlZmF1bHRLaW5kID0gZGVmYXVsdEtpbmQ7Ci0JCWRlZmF1bHRLaW5kID0gbmV3RGVmYXVsdEtpbmQgPT0gbnVsbCA/IERFRkFVTFRfS0lORF9FREVGQVVMVCA6IG5ld0RlZmF1bHRLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCwgb2xkRGVmYXVsdEtpbmQsIGRlZmF1bHRLaW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gZGVmYXVsdFZhbHVlU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWVTdHJpbmcoU3RyaW5nIG5ld0RlZmF1bHRWYWx1ZVN0cmluZykgewotCQlTdHJpbmcgb2xkRGVmYXVsdFZhbHVlU3RyaW5nID0gZGVmYXVsdFZhbHVlU3RyaW5nOwotCQlkZWZhdWx0VmFsdWVTdHJpbmcgPSBuZXdEZWZhdWx0VmFsdWVTdHJpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcsIG9sZERlZmF1bHRWYWx1ZVN0cmluZywgZGVmYXVsdFZhbHVlU3RyaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsICYmIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LmVJc1Byb3h5KCkpIHsKLQkJCURUREVudGl0eSBvbGRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA9IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5OwotCQkJYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPSAoRFRERW50aXR5KSBFY29yZVV0aWwucmVzb2x2ZShhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgdGhpcyk7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gb2xkQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZLCBvbGRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgYmFzaWNHZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERW50aXR5IG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ID0gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHk7Ci0JCWF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ID0gbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZLCBvbGRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCWlmIChuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkobmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZLCBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwgJiYgYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkuZUlzUHJveHkoKSkgewotCQkJRFRERW50aXR5IG9sZEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ID0gYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHk7Ci0JCQlhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA9IChEVERFbnRpdHkpIEVjb3JlVXRpbC5yZXNvbHZlKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCB0aGlzKTsKLQkJCWlmIChhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBvbGRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBiYXNpY0dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eTsKLQkJYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPSBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJaWYgKG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFksIG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERWxlbWVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERWxlbWVudChEVERFbGVtZW50IG5ld0RUREVsZW1lbnQpIHsKLQkJaWYgKG5ld0RUREVsZW1lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UICYmIG5ld0RUREVsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdEVERFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RFRERWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RFRERWxlbWVudCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREVsZW1lbnQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5ULCBuZXdEVERFbGVtZW50LCBuZXdEVERFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCQlpZiAoYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShudWxsLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShudWxsLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTkFNRSA6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FVFlQRSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVUeXBlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA6Ci0JCQkJcmV0dXJuIGlzQ2hhbmdlYWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJcmV0dXJuIGlzVm9sYXRpbGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UIDoKLQkJCQlyZXR1cm4gaXNUcmFuc2llbnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5JUVVFIDoKLQkJCQlyZXR1cm4gaXNVbmlxdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19MT1dFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldExvd2VyQm91bmQoKSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVVBQRVJfQk9VTkQgOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRVcHBlckJvdW5kKCkpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX01BTlkgOgotCQkJCXJldHVybiBpc01hbnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fUkVRVUlSRUQgOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgOgotCQkJCXJldHVybiBpc1Vuc2V0dGFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fSUQgOgotCQkJCXJldHVybiBpc0lEKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFQXR0cmlidXRlVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgOgotCQkJCXJldHVybiBnZXREZWZhdWx0S2luZCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldERUREVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTkFNRSA6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA6Ci0JCQkJc2V0Q2hhbmdlYWJsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1ZPTEFUSUxFIDoKLQkJCQlzZXRWb2xhdGlsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA6Ci0JCQkJc2V0VHJhbnNpZW50KCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5JUVVFIDoKLQkJCQlzZXRVbmlxdWUoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19MT1dFUl9CT1VORCA6Ci0JCQkJc2V0TG93ZXJCb3VuZCgoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVVBQRVJfQk9VTkQgOgotCQkJCXNldFVwcGVyQm91bmQoKChJbnRlZ2VyKSBuZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgOgotCQkJCXNldFVuc2V0dGFibGUoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJc2V0SUQoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EIDoKLQkJCQlzZXREZWZhdWx0S2luZCgoRFRERGVmYXVsdEtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXNldERlZmF1bHRWYWx1ZVN0cmluZygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQlzZXREVERFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FVFlQRSA6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA6Ci0JCQkJc2V0Q2hhbmdlYWJsZShDSEFOR0VBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgOgotCQkJCXNldFZvbGF0aWxlKFZPTEFUSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UIDoKLQkJCQlzZXRUcmFuc2llbnQoVFJBTlNJRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5JUVVFIDoKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMIDoKLQkJCQlzZXREZWZhdWx0VmFsdWVMaXRlcmFsKERFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVVBQRVJfQk9VTkQgOgotCQkJCXNldFVwcGVyQm91bmQoVVBQRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTlNFVFRBQkxFIDoKLQkJCQlzZXRVbnNldHRhYmxlKFVOU0VUVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJc2V0SUQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgOgotCQkJCXNldERlZmF1bHRLaW5kKERFRkFVTFRfS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HIDoKLQkJCQlzZXREZWZhdWx0VmFsdWVTdHJpbmcoREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXNldERUREVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX05BTUUgOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRVRZUEUgOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIENIQU5HRUFCTEVfRUZMQUcpICE9IDApICE9IENIQU5HRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwKSAhPSBWT0xBVElMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMCkgIT0gVFJBTlNJRU5UX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOSVFVRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVU5JUVVFX0VGTEFHKSAhPSAwKSAhPSBVTklRVUVfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMIDoKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VmFsdWVMaXRlcmFsICE9IG51bGwgOiAhREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxULmVxdWFscyhkZWZhdWx0VmFsdWVMaXRlcmFsKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19MT1dFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIGxvd2VyQm91bmQgIT0gTE9XRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVVBQRVJfQk9VTkQgOgotCQkJCXJldHVybiB1cHBlckJvdW5kICE9IFVQUEVSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX01BTlkgOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBmYWxzZTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19SRVFVSVJFRCA6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSAhPSBmYWxzZTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOU0VUVEFCTEVfRUZMQUcpICE9IDApICE9IFVOU0VUVEFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fSUQgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElEX0VGTEFHKSAhPSAwKSAhPSBJRF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEUgOgotCQkJCXJldHVybiBiYXNpY0dldEVBdHRyaWJ1dGVUeXBlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gQ09NTUVOVF9FREVGQVVMVCA9PSBudWxsID8gY29tbWVudCAhPSBudWxsIDogIUNPTU1FTlRfRURFRkFVTFQuZXF1YWxzKGNvbW1lbnQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJcmV0dXJuIGRlZmF1bHRLaW5kICE9IERFRkFVTFRfS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VmFsdWVTdHJpbmcgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX1NUUklOR19FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFZhbHVlU3RyaW5nKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXJldHVybiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RFRERWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29tbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdEtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdEtpbmQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRWYWx1ZVN0cmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0VmFsdWVTdHJpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRFREQXR0cmlidXRlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREJhc2ljVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERCYXNpY1R5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTE4YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREJhc2ljVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2ljIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQmFzaWNUeXBlSW1wbCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREJhc2ljVHlwZUltcGwgZXh0ZW5kcyBFQ2xhc3NJbXBsIGltcGxlbWVudHMgRFREQmFzaWNUeXBlLCBFQ2xhc3MgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgYmFzaWNUeXBlU3RyaW5nc1tdID0ge0RURFR5cGUuTk9ORSwgRFREVHlwZS5DREFUQSwgRFREVHlwZS5JRCwgRFREVHlwZS5JRFJFRiwgRFREVHlwZS5JRFJFRlMsIERURFR5cGUuRU5USVRZLCBEVERUeXBlLkVOVElUSUVTLCBEVERUeXBlLk5NVE9LRU4sIERURFR5cGUuTk1UT0tFTlN9OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgYmFzaWNUeXBlRGVzY3JpcHRpb25zW10gPSB7RFREQ29yZU1lc3NhZ2VzLl9VSV9OT05FX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfQ0hBUkFDVEVSX0RBVEFfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9JREVOVElGSUVSX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfSURfUkVGRVJFTkNFX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfSURfUkVGRVJFTkNFU19ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVTX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTl9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5TX0RFU0N9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgYmFzaWNUeXBlS2luZHNbXSA9IHtEVERCYXNpY1R5cGVLaW5kLk5PTkUsIERUREJhc2ljVHlwZUtpbmQuQ0RBVEEsIERUREJhc2ljVHlwZUtpbmQuSUQsIERUREJhc2ljVHlwZUtpbmQuSURSRUYsIERUREJhc2ljVHlwZUtpbmQuSURSRUZTLCBEVERCYXNpY1R5cGVLaW5kLkVOVElUWSwgRFREQmFzaWNUeXBlS2luZC5FTlRJVElFUywgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOLCBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TfTsKLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoKSB7Ci0JCWludCBraW5kID0gZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCWlmIChraW5kID49IDAgJiYga2luZCA8IGJhc2ljVHlwZVN0cmluZ3MubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYmFzaWNUeXBlU3RyaW5nc1traW5kXTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0VHlwZURlc2NyaXB0aW9uKGdldEtpbmQoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbihpbnQgdHlwZUtpbmQpIHsKLQkJaWYgKHR5cGVLaW5kID49IDAgJiYgdHlwZUtpbmQgPCBiYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYmFzaWNUeXBlRGVzY3JpcHRpb25zW3R5cGVLaW5kXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQkvLyBUQkQKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgS0lORF9FREVGQVVMVCA9IERUREJhc2ljVHlwZUtpbmQuTk9ORV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREJhc2ljVHlwZUtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERUREJhc2ljVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQmFzaWNUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERCYXNpY1R5cGVLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQgbmV3S2luZCkgewotCQlEVERCYXNpY1R5cGVLaW5kIG9sZEtpbmQgPSBraW5kOwotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQsIG9sZEtpbmQsIGtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RVJlZmVyZW5jZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gaXNJbnRlcmZhY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9BVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBnZXRFUmVmZXJlbmNlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcygoQ2xhc3MpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFQXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJc2V0S2luZCgoRFREQmFzaWNUeXBlS2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcyhJTlNUQU5DRV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJc2V0S2luZChLSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFnZXRFQW5ub3RhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzTmFtZSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3NOYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzcyAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVEVSRkFDRV9FRkxBRykgIT0gMCkgIT0gSU5URVJGQUNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBlU3VwZXJUeXBlcyAhPSBudWxsICYmICFnZXRFU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCXJldHVybiBlT3BlcmF0aW9ucyAhPSBudWxsICYmICFnZXRFT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9BVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1JFRkVSRU5DRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZVJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhZ2V0RVJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZUF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhZ2V0RUF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxDb250YWlubWVudHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VJRF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5EIDoKLQkJCQlyZXR1cm4ga2luZCAhPSBLSU5EX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChraW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGtpbmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRFREQmFzaWNUeXBlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzOWI5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTmFtZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIERURENvbnRlbnRJbXBsIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBEVERDb250ZW50LCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREZpbGUpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERDb250ZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTgxZGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50Q29udGVudEltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUREVsZW1lbnRDb250ZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRFRERWxlbWVudENvbnRlbnQgewotCi0JcHVibGljIERUREVsZW1lbnRDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQlEVERFbGVtZW50Q29udGVudCBjID0gZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0JCWlmIChjICE9IG51bGwpCi0JCQlyZXR1cm4gYy5nZXRFbGVtZW50KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLy8gZ2V0IHRoZSBtb3N0IG91dGVyIERUREdyb3VwQ29udGVudAotCXB1YmxpYyBEVERHcm91cENvbnRlbnQgZ2V0RFRER3JvdXBDb250ZW50KCkgewotCQlEVERFbGVtZW50Q29udGVudCBjID0gdGhpczsKLQkJd2hpbGUgKGMuZ2V0R3JvdXAoKSAhPSBudWxsKSB7Ci0JCQljID0gYy5nZXRHcm91cCgpOwotCQl9Ci0JCXJldHVybiAoKGMgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpID8gKERUREdyb3VwQ29udGVudCkgYyA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCWludCBjbnQgPSAwOwotCQlEVERPYmplY3QgcGFyZW50ID0gZ2V0R3JvdXAoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlwYXJlbnQgPSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEVERHcm91cENvbnRlbnQgZ3JvdXAgPSAoRFRER3JvdXBDb250ZW50KSBwYXJlbnQ7Ci0JCQlJdGVyYXRvciBpID0gZ3JvdXAuZ2V0Q29udGVudCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKTsKLQkJCQlpZiAoY29udGVudCA9PSB0aGlzKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgfHwgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY250Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aCgoKHBhcmVudCA9PSBudWxsKSA/ICJOVUxMX1BBUkVOVCIgOiBwYXJlbnQuZ2V0UGF0aG5hbWUoKSksICJDb250ZW50IiwgbnVsbCwgY250KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnRDb250ZW50KCkgewotCQlEVERFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJLy8gVGhpcyBtZWFucyB0aGlzIGlzIHRoZSBvbmx5IGVsZW1lbnQgY29udGVudCBpbiB0aGUgZWxlbWVudAotCQkJcmV0dXJuIHRydWU7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJRFRER3JvdXBDb250ZW50IGdyb3VwID0gZ2V0R3JvdXAoKTsKLQkJaW50IHBvcyA9IGdyb3VwLmdldENvbnRlbnRQb3NpdGlvbih0aGlzKTsKLQkJaWYgKHBvcyA9PSAwKSB7Ci0JCQkvLyBub3cgcmVjdXJzZSBhbmQgZW5zdXJlIHRoaXMgZ3JvdXAgaXMgdGhlIGZpcnN0IGdyb3VwCi0JCQlyZXR1cm4gZ3JvdXAuaXNGaXJzdEVsZW1lbnRDb250ZW50KCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50RGV0YWlsKCkgewotCQkvLyBtb3N0IHRpbWVzLCBjb250ZW50IG5hbWUgaXMgZmluZS4gSG93ZXZlciBmb3IgZ3JvdXBzLAotCQkvLyB3ZSBkaWRuJ3Qgd2FudCBhIGxvbmcgbmFtZSB0byBzaG93IHVwIGluIHRoZSB0cmVlLAotCQkvLyBzbyB3ZSBjcmVhdGVkIGEgZ2V0IGNvbnRlbnRkZXRhaWwgdG8gZ2V0IHRvIHRoZSBsb25nCi0JCS8vIG5hbWUgKGdldENvbnRlbnROYW1lIHdpbGwgZ2V0IHRoZSBzaG9ydCBvbmUuCi0JCXJldHVybiBnZXRDb250ZW50TmFtZSgpOwotCX0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRFRERWxlbWVudENvbnRlbnQjZ2V0Q29udGVudE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVsZW1lbnRDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERHcm91cENvbnRlbnQgZ2V0R3JvdXAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERHcm91cENvbnRlbnQpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwKERUREdyb3VwQ29udGVudCBuZXdHcm91cCkgewotCQlpZiAobmV3R3JvdXAgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQICYmIG5ld0dyb3VwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3R3JvdXApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcm91cCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JvdXApLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyb3VwLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbmV3R3JvdXAsIG5ld0dyb3VwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREVsZW1lbnQpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRFRERWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCWlmIChuZXdFbGVtZW50ICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UICYmIG5ld0VsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RWxlbWVudCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0VsZW1lbnQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgbmV3RWxlbWVudCwgbmV3RWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gRFRERWxlbWVudENvbnRlbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQxM2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERWaXNpdG9yOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERWxlbWVudEltcGwgZXh0ZW5kcyBFQ2xhc3NJbXBsIGltcGxlbWVudHMgRFRERWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JcHVibGljIERUREVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlnZXREVERBdHRyaWJ1dGUoKS5hZGQoYXR0cmlidXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJFbGVtIiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBEVERQYXRobmFtZVV0aWwucGFyc2VQYXRoQ29tcG9uZW50KHJlbGF0aXZlUGF0aCk7Ci0KLQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXN1bHRbMF07Ci0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCURURE9iamVjdCBvYmogPSBudWxsOwotCQlpZiAodHlwZS5lcXVhbHMoIkF0dHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBUT0RPOiBmaXggcG9ydAotCQkJLy8gb2JqID0gZmluZEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQllbHNlIGlmICgodHlwZS5lcXVhbHMoIkNvbnRlbnQiKSkgfHwgKHR5cGUuZXF1YWxzKCJFbGVtUmVmIikpIHx8ICh0eXBlLmVxdWFscygiRW50UmVmIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvYmogPSBnZXRDb250ZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyByZXN0UGF0aCA9IChTdHJpbmcpIHJlc3VsdFszXTsKLQotCQlpZiAoKHJlc3RQYXRoID09IG51bGwpIHx8IChvYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gb2JqLmZpbmRPYmplY3QocmVzdFBhdGgpOwotCQl9Ci0JfQotCi0JLy8gcmV0dXJucyBhbGwgcmVmZXJlbmNlcyBpbiB0aGUgc2FtZSBEVERGaWxlIHRoYXQgcmVmZXJlbmNlIHRoaXMgZWxlbWVudAotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlZmVyZW5jZXMoKSB7Ci0JCURUREZpbGUgZmlsZSA9IGdldERUREZpbGUoKTsKLQkJZmluYWwgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJRFREVmlzaXRvciB2aXNpdFJlZnMgPSBuZXcgRFREVmlzaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQlpZiAoZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKSA9PSBEVERFbGVtZW50SW1wbC50aGlzKSB7Ci0JCQkJCXJlc3VsdC5hZGQoZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQl9Ci0JCX07Ci0JCXZpc2l0UmVmcy52aXNpdERUREZpbGUoZmlsZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVEZXRhaWwoKSB7Ci0JCVN0cmluZyBhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBnZXREVERBdHRyaWJ1dGUoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZWVuT25lID0gZmFsc2U7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlpZiAoc2Vlbk9uZSkgewotCQkJCQlhdHRyaWJ1dGVTdHJpbmcgPSBhdHRyaWJ1dGVTdHJpbmcgKyAiLCAiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWVuT25lID0gdHJ1ZTsKLQkJCQl9IC8vIGVuZCBvZiBlbHNlCi0KLQkJCQlhdHRyaWJ1dGVTdHJpbmcgPSBhdHRyaWJ1dGVTdHJpbmcgKyAoKERUREF0dHJpYnV0ZSkgaS5uZXh0KCkpLmdldE5hbWUoKTsKLQkJCX0KLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJcmV0dXJuIGF0dHJpYnV0ZVN0cmluZzsKLQl9Ci0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5ULCBvbGRDb21tZW50LCBjb21tZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudENvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgbmV3Q29udGVudCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbGVtZW50Q29udGVudCBvbGRDb250ZW50ID0gY29udGVudDsKLQkJY29udGVudCA9IG5ld0NvbnRlbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBvbGRDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChEVERFbGVtZW50Q29udGVudCBuZXdDb250ZW50KSB7Ci0JCWlmIChuZXdDb250ZW50ICE9IGNvbnRlbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgRFRERWxlbWVudENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRlbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgRFRERWxlbWVudENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGVudChuZXdDb250ZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgbmV3Q29udGVudCwgbmV3Q29udGVudCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldERUREF0dHJpYnV0ZSgpIHsKLQkJaWYgKGR0ZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlkdGRBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChEVERBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBkdGRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgY29udGVudCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERUREF0dHJpYnV0ZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFUmVmZXJlbmNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29udGVudChudWxsLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUywgRVBhY2thZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gaXNJbnRlcmZhY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9BVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBnZXRFUmVmZXJlbmNlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQ09OVEFJTk1FTlRTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RFREQXR0cmlidXRlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3MgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzcyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQUJTVFJBQ1QgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKSAhPSBBQlNUUkFDVF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRFUkZBQ0VfRUZMQUcpICE9IDApICE9IElOVEVSRkFDRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZVN1cGVyVHlwZXMgIT0gbnVsbCAmJiAhZ2V0RVN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGVSZWZlcmVuY2VzICE9IG51bGwgJiYgIWdldEVSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGVBdHRyaWJ1dGVzICE9IG51bGwgJiYgIWdldEVBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQ29udGFpbm1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNvbnRlbnQgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGR0ZEF0dHJpYnV0ZSAhPSBudWxsICYmICFnZXREVERBdHRyaWJ1dGUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRFREQ29udGVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERURENvbnRlbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcygoQ2xhc3MpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFQXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCWdldERUREF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RFREQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQUJTVFJBQ1QgOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJc2V0SW50ZXJmYWNlKElOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA6Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQlzZXRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlnZXREVERBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREZpbGUpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIG5ld0RUREZpbGUpIHsKLQkJaWYgKG5ld0RUREZpbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSAmJiBuZXdEVERGaWxlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RFRERmlsZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RUREZpbGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSwgbmV3RFRERmlsZSwgbmV3RFRERmlsZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJiODg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJRFRERWxlbWVudCBlID0gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBnZXRSZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgcmVmZXJlbmNlZEVsZW1lbnQuZUlzUHJveHkoKSkgewotCQkJRFRERWxlbWVudCBvbGRSZWZlcmVuY2VkRWxlbWVudCA9IHJlZmVyZW5jZWRFbGVtZW50OwotCQkJcmVmZXJlbmNlZEVsZW1lbnQgPSAoRFRERWxlbWVudCkgRWNvcmVVdGlsLnJlc29sdmUocmVmZXJlbmNlZEVsZW1lbnQsIHRoaXMpOwotCQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG9sZFJlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGJhc2ljR2V0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkRWxlbWVudChEVERFbGVtZW50IG5ld1JlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCURUREVsZW1lbnQgb2xkUmVmZXJlbmNlZEVsZW1lbnQgPSByZWZlcmVuY2VkRWxlbWVudDsKLQkJcmVmZXJlbmNlZEVsZW1lbnQgPSBuZXdSZWZlcmVuY2VkRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIG9jY3VycmVuY2UgIT0gT0NDVVJSRU5DRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCXNldFJlZmVyZW5jZWRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlzZXRSZWZlcmVuY2VkRWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbXB0eUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNzdkYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbXB0eUNvbnRlbnRJbXBsIGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRERW1wdHlDb250ZW50IHsKLQotCXB1YmxpYyBEVERFbXB0eUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVtcHR5Q29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIkVNUFRZIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjYWRlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRERW50aXR5Q29udGVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERUREVudGl0eUNvbnRlbnQgewotCi0JcHVibGljIERUREVudGl0eUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKGdldERUREVudGl0eSgpLmdldFBhdGhuYW1lKCksICJDb250ZW50IiwgbnVsbCwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldERUREVudGl0eSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERFbnRpdHkpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERW50aXR5KERUREVudGl0eSBuZXdEVERFbnRpdHkpIHsKLQkJaWYgKG5ld0RUREVudGl0eSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZICYmIG5ld0RUREVudGl0eSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREVudGl0eSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RUREVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RFRERW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREVudGl0eSwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbmV3RFRERW50aXR5LCBuZXdEVERFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RFRERW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbnRpdHlDb250ZW50I3VucGFyc2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlYjA5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnRpdHlJbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHksIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiRW50IiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IERURFBhdGhuYW1lVXRpbC5wYXJzZVBhdGhDb21wb25lbnQocmVsYXRpdmVQYXRoKTsKLQotCi0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgcmVzdWx0WzBdOwotCi0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0KLQkJRFRET2JqZWN0IG9iaiA9IG51bGw7Ci0JCWlmICh0eXBlLmVxdWFscygiQ29udGVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGdldENvbnRlbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQlTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKSByZXN1bHRbM107Ci0KLQkJaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsKLQkJfQotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyYW1ldGVyRW50aXR5KCkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyYW1ldGVyRW50aXR5KCkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyYW1ldGVyRW50aXR5ID0gUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnQoKSA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHlDb250ZW50IGNvbnRlbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFybUVudGl0eVJlZigpIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQYXJtRW50aXR5UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5UmVmZXJlbmNlKCkgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudGl0eVJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIG5ld1BhcmFtZXRlckVudGl0eSkgewotCQlib29sZWFuIG9sZFBhcmFtZXRlckVudGl0eSA9IHBhcmFtZXRlckVudGl0eTsKLQkJcGFyYW1ldGVyRW50aXR5ID0gbmV3UGFyYW1ldGVyRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFksIG9sZFBhcmFtZXRlckVudGl0eSwgcGFyYW1ldGVyRW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbmV3Q29udGVudCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHlDb250ZW50IG9sZENvbnRlbnQgPSBjb250ZW50OwotCQljb250ZW50ID0gbmV3Q29udGVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgb2xkQ29udGVudCwgbmV3Q29udGVudCkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbmV3Q29udGVudCkgewotCQlpZiAobmV3Q29udGVudCAhPSBjb250ZW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgRFRERW50aXR5Q29udGVudC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3Q29udGVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGVudCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIERUREVudGl0eUNvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGVudChuZXdDb250ZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBuZXdDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZ2V0UGFybUVudGl0eVJlZigpIHsKLQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gbnVsbCAmJiBwYXJtRW50aXR5UmVmLmVJc1Byb3h5KCkpIHsKLQkJCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBvbGRQYXJtRW50aXR5UmVmID0gcGFybUVudGl0eVJlZjsKLQkJCXBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBFY29yZVV0aWwucmVzb2x2ZShwYXJtRW50aXR5UmVmLCB0aGlzKTsKLQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG9sZFBhcm1FbnRpdHlSZWYpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgb2xkUGFybUVudGl0eVJlZiwgcGFybUVudGl0eVJlZikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJtRW50aXR5UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGJhc2ljR2V0UGFybUVudGl0eVJlZigpIHsKLQkJcmV0dXJuIHBhcm1FbnRpdHlSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG5ld1Bhcm1FbnRpdHlSZWYsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9sZFBhcm1FbnRpdHlSZWYgPSBwYXJtRW50aXR5UmVmOwotCQlwYXJtRW50aXR5UmVmID0gbmV3UGFybUVudGl0eVJlZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBvbGRQYXJtRW50aXR5UmVmLCBuZXdQYXJtRW50aXR5UmVmKSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG5ld1Bhcm1FbnRpdHlSZWYpIHsKLQkJaWYgKG5ld1Bhcm1FbnRpdHlSZWYgIT0gcGFybUVudGl0eVJlZikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGFybUVudGl0eVJlZiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcGFybUVudGl0eVJlZikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQYXJtRW50aXR5UmVmKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFybUVudGl0eVJlZihuZXdQYXJtRW50aXR5UmVmLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIG5ld1Bhcm1FbnRpdHlSZWYsIG5ld1Bhcm1FbnRpdHlSZWYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudGl0eVJlZmVyZW5jZSgpIHsKLQkJaWYgKGVudGl0eVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQllbnRpdHlSZWZlcmVuY2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotCQlpZiAoYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIHsKLQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChEVERBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KChEVERFbnRpdHlDb250ZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBhcm1FbnRpdHlSZWYpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5UmVmZXJlbmNlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJtRW50aXR5UmVmKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5UmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGlzUGFyYW1ldGVyRW50aXR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldFBhcm1FbnRpdHlSZWYoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQYXJtRW50aXR5UmVmKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJc2V0UGFyYW1ldGVyRW50aXR5KCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXNldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlnZXRFbnRpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlzZXRQYXJhbWV0ZXJFbnRpdHkoUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXNldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlyZXR1cm4gcGFyYW1ldGVyRW50aXR5ICE9IFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNvbnRlbnQgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXJldHVybiBwYXJtRW50aXR5UmVmICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRFbnRpdHlSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgIT0gbnVsbCAmJiAhZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJFbnRpdHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyRW50aXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREVudGl0eUltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRERW50aXR5SW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgRFRERW50aXR5LAotLy8gRU5hbWVzcGFjZSwgRFREQ29udGVudHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBCb29sZWFuIHBhcmFtZXRlckVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERUREVudGl0eUNvbnRlbnQgY29udGVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZW50aXR5UmVmZXJlbmNlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldENvbW1lbnQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRQYXJhbWV0ZXJFbnRpdHkgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb250ZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByaXZhdGUgRFREQ29udGVudEltcGwgZHRkQ29udGVudERlbGVnYXRlID0gbnVsbDsKLQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RUREVudGl0eSgpKTsKLS8vIGluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8gcmV0dXJuIHRoaXM7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIHZvaWQgaW5pdEluc3RhbmNlRGVsZWdhdGVzKCkgewotLy8gc3VwZXIuaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLwotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkucmVmU2V0RGVsZWdhdGVPd25lcih0aGlzKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFREUGFja2FnZSBlUGFja2FnZURURCgpIHsKLS8vIHJldHVybgotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RUREVudGl0eSgpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERUREVudGl0eSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotLy8gaWYgKHRoaXMuc2V0Q29tbWVudCkgcmV0dXJuIHRoaXMuY29tbWVudDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldENvbW1lbnQoKSB7Ci0vLyByZXR1cm4gc2V0Q29tbWVudDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBCb29sZWFuIGdldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIGlmICh0aGlzLnNldFBhcmFtZXRlckVudGl0eSkgcmV0dXJuIHRoaXMucGFyYW1ldGVyRW50aXR5OwotLy8gZWxzZSByZXR1cm4KLS8vIChCb29sZWFuKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCkgewotLy8gQm9vbGVhbiByZXN1bHQgPSBnZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShCb29sZWFuIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSx0aGlzLnBhcmFtZXRlckVudGl0eSx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdmFsdWUpIHsKLS8vIHNldFBhcmFtZXRlckVudGl0eSh2YWx1ZT9Cb29sZWFuLlRSVUU6Qm9vbGVhbi5GQUxTRSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIHJldHVybiBzZXRQYXJhbWV0ZXJFbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRFRERW50aXR5Q29udGVudCBnZXRDb250ZW50KCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLmNvbnRlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyB0aGlzLmNvbnRlbnQgPSAoRFRERW50aXR5Q29udGVudCkKLS8vICgoSW50ZXJuYWxFT2JqZWN0KXRoaXMuY29udGVudCkucmVzb2x2ZSh0aGlzKTsKLS8vIGlmICh0aGlzLmNvbnRlbnQ9PW51bGwpIHRoaXMuc2V0Q29udGVudCA9IGZhbHNlOwotLy8gcmV0dXJuIHRoaXMuY29udGVudDsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbCkgewotLy8gcmVmU2V0VmFsdWVGb3JSZWZPYmplY3RTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLHRoaXMuY29udGVudCxsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldENvbnRlbnQoKSB7Ci0vLyByZWZVbnNldFZhbHVlRm9yUmVmT2JqZWN0U0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSx0aGlzLmNvbnRlbnQpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29udGVudCgpIHsKLS8vIHJldHVybiBzZXRDb250ZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLnBhcm1FbnRpdHlSZWYgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotLy8gKChJbnRlcm5hbEVPYmplY3QpdGhpcy5wYXJtRW50aXR5UmVmKS5yZXNvbHZlKHRoaXMsCi0vLyBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpKTsKLS8vIGlmICh0aGlzLnBhcm1FbnRpdHlSZWY9PW51bGwpIHRoaXMuc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gcmV0dXJuIHRoaXMucGFybUVudGl0eVJlZjsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksdGhpcy5wYXJtRW50aXR5UmVmLGwpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0UGFybUVudGl0eVJlZigpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLHRoaXMucGFybUVudGl0eVJlZik7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRQYXJtRW50aXR5UmVmKCkgewotLy8gcmV0dXJuIHNldFBhcm1FbnRpdHlSZWY7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0RW50aXR5UmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuZW50aXR5UmVmZXJlbmNlPT1udWxsKSB7Ci0vLyB0aGlzLmVudGl0eVJlZmVyZW5jZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHlSZWZlcmVuY2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpIHsKLS8vIGlmICh0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U9PW51bGwpIHsKLS8vIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZT09bnVsbCkgewotLy8gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogcmV0dXJuIGdldFBhcmFtZXRlckVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHJldHVybiBnZXRDb250ZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiByZXR1cm4gZ2V0UGFybUVudGl0eVJlZigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0U6IHJldHVybiBnZXRFbnRpdHlSZWZlcmVuY2UoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0U6IHJldHVybgotLy8gZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRTogcmV0dXJuCi0vLyBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHJldHVybiBnZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDoKLS8vIHJldHVybiB0aGlzLnNldENvbW1lbnQ/IHRoaXMuY29tbWVudCA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWToKLS8vIHJldHVybiB0aGlzLnNldFBhcmFtZXRlckVudGl0eT8gdGhpcy5wYXJhbWV0ZXJFbnRpdHkgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6Ci0vLyBpZiAoIXRoaXMuc2V0Q29udGVudHx8dGhpcy5jb250ZW50PT1udWxsKSByZXR1cm4gbnVsbDsKLS8vIGlmICgoKEludGVybmFsRU9iamVjdCl0aGlzLmNvbnRlbnQpLnJlZklzRGVsZXRlZCgpKSB7dGhpcy5jb250ZW50PW51bGw7Ci0vLyB0aGlzLnNldENvbnRlbnQ9ZmFsc2U7fQotLy8gcmV0dXJuIHRoaXMuY29udGVudDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6Ci0vLyBpZiAoIXRoaXMuc2V0UGFybUVudGl0eVJlZnx8dGhpcy5wYXJtRW50aXR5UmVmPT1udWxsKSByZXR1cm4gbnVsbDsKLS8vIGlmICgoKEludGVybmFsRU9iamVjdCl0aGlzLnBhcm1FbnRpdHlSZWYpLnJlZklzRGVsZXRlZCgpKQotLy8ge3RoaXMucGFybUVudGl0eVJlZj1udWxsOyB0aGlzLnNldFBhcm1FbnRpdHlSZWY9ZmFsc2U7fQotLy8gcmV0dXJuIHRoaXMucGFybUVudGl0eVJlZjsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuZW50aXR5UmVmZXJlbmNlOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRToKLS8vIHJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogcmV0dXJuCi0vLyAoKEludGVybmFsRU9iamVjdClnZXREdGRDb250ZW50RGVsZWdhdGUoKSkucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHJldHVybiBpc1NldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiByZXR1cm4KLS8vIGlzU2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogcmV0dXJuIGlzU2V0Q29udGVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogcmV0dXJuIGlzU2V0UGFybUVudGl0eVJlZigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiByZXR1cm4gaXNTZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIHNldFBhcmFtZXRlckVudGl0eSgobmV3VmFsdWUgaW5zdGFuY2VvZgotLy8gU3RyaW5nKT9Cb29sZWFuLnZhbHVlT2YoKFN0cmluZyluZXdWYWx1ZSk6KEJvb2xlYW4pbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIHNldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gc2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb21tZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJhbWV0ZXJFbnRpdHk7Ci0vLyB0aGlzLnBhcmFtZXRlckVudGl0eSA9IChCb29sZWFuKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHkgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29udGVudDsKLS8vIHRoaXMuY29udGVudCA9IChEVERFbnRpdHlDb250ZW50KW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb250ZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcm1FbnRpdHlSZWY7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJtRW50aXR5UmVmID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIHVuc2V0Q29tbWVudCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIHVuc2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gdW5zZXRDb250ZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyB1bnNldFBhcm1FbnRpdHlSZWYoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogewotLy8gdW5zZXREVERGaWxlKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gcmVmQmFzaWNVbnNldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb21tZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSxvbGRWYWx1ZSxnZXRDb21tZW50KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyYW1ldGVyRW50aXR5OwotLy8gdGhpcy5wYXJhbWV0ZXJFbnRpdHkgPSBudWxsOwotLy8gdGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksb2xkVmFsdWUsZ2V0UGFyYW1ldGVyRW50aXR5KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29udGVudDsKLS8vIHRoaXMuY29udGVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbnRlbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLG9sZFZhbHVlLG51bGwpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gdGhpcy5wYXJtRW50aXR5UmVmID0gbnVsbDsKLS8vIHRoaXMuc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFREQ29udGVudEltcGwgZ2V0RHRkQ29udGVudERlbGVnYXRlKCkgewotLy8gaWYgKGR0ZENvbnRlbnREZWxlZ2F0ZSA9PSBudWxsKSB7Ci0vLyBEVERQYWNrYWdlIHBrZyA9Ci0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gZHRkQ29udGVudERlbGVnYXRlPShEVERDb250ZW50SW1wbClwa2cuZUNyZWF0ZUluc3RhbmNlKHBrZy5EVERfQ09OVEVOVCk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGUuaW5pdEluc3RhbmNlKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZHRkQ29udGVudERlbGVnYXRlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFREQ29udGVudCgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5lQ2xhc3MoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnNldERUREZpbGUodmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0RFRERmlsZSgpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnVuc2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5pc1NldERUREZpbGUoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjZhNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IHsKLQotCXB1YmxpYyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJRFRERW50aXR5IGUgPSBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJRFRERW50aXR5IGVudGl0eVJlZiA9IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCWlmIChlbnRpdHlSZWYuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJcmV0dXJuICIlIiArIGdldENvbnRlbnROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICImIiArIGdldENvbnRlbnROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwgJiYgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkuZUlzUHJveHkoKSkgewotCQkJRFRERW50aXR5IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCQllbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IChEVERFbnRpdHkpIEVjb3JlVXRpbC5yZXNvbHZlKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCB0aGlzKTsKLQkJCWlmIChlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eSBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCQllbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZLCBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJaWYgKG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZLCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCWlmIChlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXJldHVybiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZSgoRFRET2NjdXJyZW5jZVR5cGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZShPQ0NVUlJFTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudW1lcmF0aW9uVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnVtZXJhdGlvblR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTZkMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudW1lcmF0aW9uVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVFbnVtSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERW51bWVyYXRpb25UeXBlSW1wbCBleHRlbmRzIEVFbnVtSW1wbCBpbXBsZW1lbnRzIERUREVudW1lcmF0aW9uVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZCBLSU5EX0VERUZBVUxUID0gRFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQX0xJVEVSQUw7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBlbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbnNbXSA9IHtEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlVNX05PVEFUSU9OX0RFU0N9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGVudW1lcmF0aW9uVHlwZUtpbmRzW10gPSB7RFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQLCBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbnVtR3JvdXBLaW5kIGtpbmQgPSBLSU5EX0VERUZBVUxUOwotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVudW1MaXRlcmFscygpIHsKLQkJcmV0dXJuIGdldEVMaXRlcmFscygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBnZXRFbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbihnZXRLaW5kKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oaW50IGtpbmQpIHsKLQkJLy8gaXQgY2FuIG9ubHkgYmUgMSBvciAyLCBidXQgbWF5YmUgbGF0ZXIuLi4KLQkJaWYgKGtpbmQgPj0gMSAmJiBraW5kIDw9IDIpIHsKLQkJCS8vIHdlIHN1YnRyYWN0IDEgc2luY2UgdGhlIGtpbmQgaXMgMSAtIGJhc2VkIG5vdCB6ZXJvIGJhc2VkCi0JCQlyZXR1cm4gZW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb25zW2tpbmQgLSAxXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQkvLyBUQkQKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERW51bUdyb3VwS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2luZChEVERFbnVtR3JvdXBLaW5kIG5ld0tpbmQpIHsKLQkJRFRERW51bUdyb3VwS2luZCBvbGRLaW5kID0ga2luZDsKLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREZpbGUpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIG5ld0RUREZpbGUpIHsKLQkJaWYgKG5ld0RUREZpbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSAmJiBuZXdEVERGaWxlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RFRERmlsZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RUREZpbGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFLCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSwgbmV3RFRERmlsZSwgbmV3RFRERmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUxpdGVyYWxzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVMaXRlcmFscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUywgRVBhY2thZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJcmV0dXJuIGlzU2VyaWFsaXphYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCXJldHVybiBnZXRFTGl0ZXJhbHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGdldEtpbmQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3MgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzcyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBTRVJJQUxJWkFCTEVfRUZMQUcpICE9IDApICE9IFNFUklBTElaQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQlyZXR1cm4gZUxpdGVyYWxzICE9IG51bGwgJiYgIWdldEVMaXRlcmFscygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcygoQ2xhc3MpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJc2V0U2VyaWFsaXphYmxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJZ2V0RUxpdGVyYWxzKCkuY2xlYXIoKTsKLQkJCQlnZXRFTGl0ZXJhbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoKERUREVudW1Hcm91cEtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFIDoKLQkJCQlzZXRTZXJpYWxpemFibGUoU0VSSUFMSVpBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJZ2V0RUxpdGVyYWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChraW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERXh0ZXJuYWxFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERXh0ZXJuYWxFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MjVhMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERXh0ZXJuYWxFbnRpdHlJbXBsIGV4dGVuZHMgRFRERW50aXR5Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFeHRlcm5hbEVudGl0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5c3RlbUlEKCkgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IFNZU1RFTV9JRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGljSUQoKSA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gUFVCTElDX0lEX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVEROb3RhdGlvbiBub3RhdGlvbiA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREZpbGUgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IG51bGw7Ci0KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREV4dGVybmFsRW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJaWYgKGdldFB1YmxpY0lEKCkgPT0gbnVsbCB8fCBnZXRQdWJsaWNJRCgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dC5hcHBlbmQoIlNZU1RFTSAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJdGV4dC5hcHBlbmQoIlBVQkxJQyBcIiIpLmFwcGVuZChnZXRQdWJsaWNJRCgpKS5hcHBlbmQoIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlTdHJpbmcgc3lzdGVtSWQgPSBnZXRTeXN0ZW1JRCgpOwotCi0JCXRleHQuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JZCkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlEVEROb3RhdGlvbiBub3RhdGlvbiA9IGdldE5vdGF0aW9uKCk7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJdGV4dC5hcHBlbmQoIiBOREFUQSAiKS5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlyZXR1cm4gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIG5ld1N5c3RlbUlEKSB7Ci0JCVN0cmluZyBvbGRTeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlzeXN0ZW1JRCA9IG5ld1N5c3RlbUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCwgb2xkU3lzdGVtSUQsIHN5c3RlbUlEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlyZXR1cm4gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIG5ld1B1YmxpY0lEKSB7Ci0JCVN0cmluZyBvbGRQdWJsaWNJRCA9IHB1YmxpY0lEOwotCQlwdWJsaWNJRCA9IG5ld1B1YmxpY0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCwgb2xkUHVibGljSUQsIHB1YmxpY0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gZ2V0Tm90YXRpb24oKSB7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsICYmIG5vdGF0aW9uLmVJc1Byb3h5KCkpIHsKLQkJCURURE5vdGF0aW9uIG9sZE5vdGF0aW9uID0gbm90YXRpb247Ci0JCQlub3RhdGlvbiA9IChEVEROb3RhdGlvbikgRWNvcmVVdGlsLnJlc29sdmUobm90YXRpb24sIHRoaXMpOwotCQkJaWYgKG5vdGF0aW9uICE9IG9sZE5vdGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gYmFzaWNHZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROb3RhdGlvbihEVEROb3RhdGlvbiBuZXdOb3RhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVEROb3RhdGlvbiBvbGROb3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbiA9IG5ld05vdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb24oRFRETm90YXRpb24gbmV3Tm90YXRpb24pIHsKLQkJaWYgKG5ld05vdGF0aW9uICE9IG5vdGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbm90YXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOb3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Tm90YXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE5vdGF0aW9uKG5ld05vdGF0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgbmV3Tm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkgewotCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsICYmIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUuZUlzUHJveHkoKSkgewotCQkJRFRERmlsZSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZTsKLQkJCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSAoRFRERmlsZSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgdGhpcyk7Ci0JCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSwgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBiYXNpY0dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCURUREZpbGUgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFLCBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBub3RhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbigoRFRETm90YXRpb24pIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBnZXRTeXN0ZW1JRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIGdldFB1YmxpY0lEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0Tm90YXRpb24oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIFNZU1RFTV9JRF9FREVGQVVMVCA9PSBudWxsID8gc3lzdGVtSUQgIT0gbnVsbCA6ICFTWVNURU1fSURfRURFRkFVTFQuZXF1YWxzKHN5c3RlbUlEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXJldHVybiBub3RhdGlvbiAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXNldFB1YmxpY0lEKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSA6Ci0JCQkJc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXNldFN5c3RlbUlEKFNZU1RFTV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzeXN0ZW1JRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzeXN0ZW1JRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljSUQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVibGljSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDJjNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBEVERGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9OT05FOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0NEQVRBOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0lEOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0lEUkVGOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0lEUkVGUzsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9FTlRJVFk7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfRU5USVRJRVM7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfTk1UT0tFTjsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOUzsKLQotCi0KLQlwdWJsaWMgc3RhdGljIERUREZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeSkgZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfTk9ORS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX05PTkUoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfTk9ORSA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX05PTkUgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfQ0RBVEEuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9DREFUQSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9DREFUQSA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0NEQVRBID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5DREFUQV9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0NEQVRBOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9JRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0lEKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0lEID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfSUQgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLklEX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfSUQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0lEUkVGLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfSURSRUYoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSURSRUYgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9JRFJFRiA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuSURSRUZfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRFJFRjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfSURSRUZTLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfSURSRUZTKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0lEUkVGUyA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0lEUkVGUyA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuSURSRUZTX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfSURSRUZTOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9FTlRJVFkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9FTlRJVFkoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfRU5USVRZID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfRU5USVRZID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5FTlRJVFlfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9FTlRJVFk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0VOVElUSUVTLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfRU5USVRJRVMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfRU5USVRJRVMgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9FTlRJVElFUyA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9FTlRJVElFUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfTk1UT0tFTi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX05NVE9LRU4oKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfTk1UT0tFTiA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX05NVE9LRU4gPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5fTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OTVRPS0VOOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOUy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX05NVE9LRU5TKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX05NVE9LRU5TID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk1UT0tFTlMgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfTk1UT0tFTlM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBjcmVhdGVEVERBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREJhc2ljVHlwZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRETm90YXRpb24oKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREV4dGVybmFsRW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfT0NDVVJSRU5DRV9UWVBFIDoKLQkJCQlyZXR1cm4gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0RFRkFVTFRfS0lORCA6Ci0JCQkJcmV0dXJuIERURERlZmF1bHRLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX0tJTkQgOgotCQkJCXJldHVybiBEVERCYXNpY1R5cGVLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBEVERFbnVtR3JvdXBLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gRFRER3JvdXBLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLlhNTF9TQ0hFTUFfREVGSU5FRF9UWVBFIDoKLQkJCQlyZXR1cm4gWE1MU2NoZW1hRGVmaW5lZFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX09DQ1VSUkVOQ0VfVFlQRSA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0RFRkFVTFRfS0lORCA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfS0lORCA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1fR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBEVERQYWNrYWdlLlhNTF9TQ0hFTUFfREVGSU5FRF9UWVBFIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREdyb3VwQ29udGVudCBjcmVhdGVEVERHcm91cENvbnRlbnQoKSB7Ci0JCURUREdyb3VwQ29udGVudEltcGwgZHRkR3JvdXBDb250ZW50ID0gbmV3IERUREdyb3VwQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEdyb3VwQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREF0dHJpYnV0ZSBjcmVhdGVEVERBdHRyaWJ1dGUoKSB7Ci0JCURUREF0dHJpYnV0ZUltcGwgZHRkQXR0cmlidXRlID0gbmV3IERUREF0dHJpYnV0ZUltcGwoKTsKLQkJcmV0dXJuIGR0ZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVsZW1lbnQgY3JlYXRlRFRERWxlbWVudCgpIHsKLQkJRFRERWxlbWVudEltcGwgZHRkRWxlbWVudCA9IG5ldyBEVERFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVtcHR5Q29udGVudCBjcmVhdGVEVERFbXB0eUNvbnRlbnQoKSB7Ci0JCURUREVtcHR5Q29udGVudEltcGwgZHRkRW1wdHlDb250ZW50ID0gbmV3IERUREVtcHR5Q29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEVtcHR5Q29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREFueUNvbnRlbnQgY3JlYXRlRFREQW55Q29udGVudCgpIHsKLQkJRFREQW55Q29udGVudEltcGwgZHRkQW55Q29udGVudCA9IG5ldyBEVERBbnlDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkQW55Q29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURFBDRGF0YUNvbnRlbnQgY3JlYXRlRFREUENEYXRhQ29udGVudCgpIHsKLQkJRFREUENEYXRhQ29udGVudEltcGwgZHRkcGNEYXRhQ29udGVudCA9IG5ldyBEVERQQ0RhdGFDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkcGNEYXRhQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkgewotCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgPSBuZXcgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREZpbGUgY3JlYXRlRFRERmlsZSgpIHsKLQkJRFRERmlsZUltcGwgZHRkRmlsZSA9IG5ldyBEVERGaWxlSW1wbCgpOwotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREJhc2ljVHlwZSBjcmVhdGVEVERCYXNpY1R5cGUoKSB7Ci0JCURUREJhc2ljVHlwZUltcGwgZHRkQmFzaWNUeXBlID0gbmV3IERUREJhc2ljVHlwZUltcGwoKTsKLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZUltcGwgZHRkRW51bWVyYXRpb25UeXBlID0gbmV3IERUREVudW1lcmF0aW9uVHlwZUltcGwoKTsKLQkJcmV0dXJuIGR0ZEVudW1lcmF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURE5vdGF0aW9uIGNyZWF0ZURURE5vdGF0aW9uKCkgewotCQlEVEROb3RhdGlvbkltcGwgZHRkTm90YXRpb24gPSBuZXcgRFRETm90YXRpb25JbXBsKCk7Ci0JCXJldHVybiBkdGROb3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBjcmVhdGVEVERFbnRpdHkoKSB7Ci0JCURUREVudGl0eUltcGwgZHRkRW50aXR5ID0gbmV3IERUREVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREV4dGVybmFsRW50aXR5IGNyZWF0ZURUREV4dGVybmFsRW50aXR5KCkgewotCQlEVERFeHRlcm5hbEVudGl0eUltcGwgZHRkRXh0ZXJuYWxFbnRpdHkgPSBuZXcgRFRERXh0ZXJuYWxFbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBkdGRFeHRlcm5hbEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREludGVybmFsRW50aXR5IGNyZWF0ZURUREludGVybmFsRW50aXR5KCkgewotCQlEVERJbnRlcm5hbEVudGl0eUltcGwgZHRkSW50ZXJuYWxFbnRpdHkgPSBuZXcgRFRESW50ZXJuYWxFbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBkdGRJbnRlcm5hbEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwgZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlID0gbmV3IERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwoKTsKLQkJcmV0dXJuIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpIHsKLQkJRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwgZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCA9IG5ldyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURFBhY2thZ2UgZ2V0RFREUGFja2FnZSgpIHsKLQkJcmV0dXJuIChEVERQYWNrYWdlKSBnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERGaWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDZlODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTmFtZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUHJpbnRlcjsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNpc1BhcnNlRXJyb3IgPGVtPlBhcnNlIEVycm9yPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsI2dldERURENvbnRlbnQgPGVtPkRURCBDb250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsI2dldERUREVudW1lcmF0aW9uVHlwZSA8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERmlsZUltcGwgZXh0ZW5kcyBFTmFtZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERUREZpbGUsIEVOYW1lZEVsZW1lbnQgewotCi0JcHVibGljIEVMaXN0IGdldERURE9iamVjdCgpIHsKLQkJcmV0dXJuIGdldERURENvbnRlbnQoKTsKLQl9Ci0KLQotCXB1YmxpYyBMaXN0IGxpc3REVERFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudExpc3RPZihEVERFbGVtZW50LmNsYXNzLCBudWxsKTsKLQl9Ci0KLQotCXB1YmxpYyBMaXN0IGxpc3REVEROb3RhdGlvbigpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRMaXN0T2YoRFRETm90YXRpb24uY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGxpc3REVERFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERUREVudGl0eS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIExpc3QgbGlzdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRMaXN0T2YoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudEFuZERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRMaXN0T2YoRFRERWxlbWVudC5jbGFzcywgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Q29udGVudExpc3RPZihDbGFzcyBjbGFzczEsIENsYXNzIGNsYXNzMikgewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGkgPSBnZXREVERDb250ZW50KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAoY2xhc3MxLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJCXYuYWRkKG9iaik7Ci0JCQl9Ci0JCQllbHNlIGlmICgoY2xhc3MyICE9IG51bGwpICYmIChjbGFzczIuaXNJbnN0YW5jZShvYmopKSkgewotCQkJCXYuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JcHVibGljIERUREVsZW1lbnQgZmluZEVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdERUREVsZW1lbnQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURUREVsZW1lbnQgZSA9IChEVERFbGVtZW50KSBpLm5leHQoKTsKLQkJCWlmIChlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRFRERW50aXR5IGZpbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdERUREVudGl0eSgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRERW50aXR5IGUgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCWlmIChlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gZmluZE5vdGF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVEROb3RhdGlvbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRETm90YXRpb24gZSA9IChEVEROb3RhdGlvbikgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBmaW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBlID0gKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKGJvb2xlYW4gaW5jbHVkZSkgewotCQlEVERQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcih0cnVlKTsKLQkJcHJpbnRlci52aXNpdERUREZpbGUodGhpcyk7Ci0JCXJldHVybiBwcmludGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IERURFBhdGhuYW1lVXRpbC5wYXJzZVBhdGhDb21wb25lbnQocmVsYXRpdmVQYXRoKTsKLQotCi0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgcmVzdWx0WzBdOwotCi0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0KLQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSByZXN1bHRbMV07Ci0KLQkJRFRET2JqZWN0IG9iaiA9IG51bGw7Ci0JCWlmICh0eXBlLmVxdWFscygiRWxlbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGZpbmRFbGVtZW50KG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUuZXF1YWxzKCJFbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kRW50aXR5KG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUuZXF1YWxzKCJQRW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZmluZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShuYW1lKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLmVxdWFscygiTm90YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGZpbmROb3RhdGlvbihuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQlTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKSByZXN1bHRbM107Ci0KLQkJaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsKLQkJfQotCX0KLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyc2VFcnJvcigpIDxlbT5QYXJzZSBFcnJvcjwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzUGFyc2VFcnJvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBBUlNFX0VSUk9SX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BhcnNlRXJyb3IoKSA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcnNlRXJyb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHBhcnNlRXJyb3IgPSBQQVJTRV9FUlJPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERURENvbnRlbnQoKSA8ZW0+RFREIENvbnRlbnQ8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RFREQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGR0ZENvbnRlbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGR0ZEVudW1lcmF0aW9uVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERUREZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5ULCBvbGRDb21tZW50LCBjb21tZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyc2VFcnJvcigpIHsKLQkJcmV0dXJuIHBhcnNlRXJyb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnNlRXJyb3IoYm9vbGVhbiBuZXdQYXJzZUVycm9yKSB7Ci0JCWJvb2xlYW4gb2xkUGFyc2VFcnJvciA9IHBhcnNlRXJyb3I7Ci0JCXBhcnNlRXJyb3IgPSBuZXdQYXJzZUVycm9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUiwgb2xkUGFyc2VFcnJvciwgcGFyc2VFcnJvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RFREQ29udGVudCgpIHsKLQkJaWYgKGR0ZENvbnRlbnQgPT0gbnVsbCkgewotCQkJZHRkQ29udGVudCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERURENvbnRlbnQuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSk7Ci0JCX0KLQkJcmV0dXJuIGR0ZENvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREVERFbnVtZXJhdGlvblR5cGUoKSB7Ci0JCWlmIChkdGRFbnVtZXJhdGlvblR5cGUgPT0gbnVsbCkgewotCQkJZHRkRW51bWVyYXRpb25UeXBlID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRFRERW51bWVyYXRpb25UeXBlLmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUpOwotCQl9Ci0JCXJldHVybiBkdGRFbnVtZXJhdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERDb250ZW50KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFRERW51bWVyYXRpb25UeXBlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQ29udGVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERUREVudW1lcmF0aW9uVHlwZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IgOgotCQkJCXJldHVybiBpc1BhcnNlRXJyb3IoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlyZXR1cm4gZ2V0RFREQ29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJcmV0dXJuIGdldERUREVudW1lcmF0aW9uVHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IgOgotCQkJCXNldFBhcnNlRXJyb3IoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQgOgotCQkJCWdldERURENvbnRlbnQoKS5jbGVhcigpOwotCQkJCWdldERURENvbnRlbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQlnZXREVERFbnVtZXJhdGlvblR5cGUoKS5jbGVhcigpOwotCQkJCWdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IgOgotCQkJCXNldFBhcnNlRXJyb3IoUEFSU0VfRVJST1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQgOgotCQkJCWdldERURENvbnRlbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCWdldERUREVudW1lcmF0aW9uVHlwZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gQ09NTUVOVF9FREVGQVVMVCA9PSBudWxsID8gY29tbWVudCAhPSBudWxsIDogIUNPTU1FTlRfRURFRkFVTFQuZXF1YWxzKGNvbW1lbnQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUiA6Ci0JCQkJcmV0dXJuIHBhcnNlRXJyb3IgIT0gUEFSU0VfRVJST1JfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlyZXR1cm4gZHRkQ29udGVudCAhPSBudWxsICYmICFnZXREVERDb250ZW50KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJcmV0dXJuIGR0ZEVudW1lcmF0aW9uVHlwZSAhPSBudWxsICYmICFnZXREVERFbnVtZXJhdGlvblR5cGUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29tbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyc2VFcnJvcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYXJzZUVycm9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREZpbGVJbXBsCi0KLS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLS8vCi0KLS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLS8vIC8vcHVibGljIGNsYXNzIERUREZpbGVJbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cyBEVERGaWxlLAotLy8gRU5hbWVzcGFjZXsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uCi0vLyAyMDAyLiI7Ci0vLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEJvb2xlYW4gcGFyc2VFcnJvciA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGR0ZENvbnRlbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBkdGRFbnVtZXJhdGlvblR5cGUgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldENvbW1lbnQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRQYXJzZUVycm9yID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFRERmlsZSgpKTsKLS8vIGluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8gcmV0dXJuIHRoaXM7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERGaWxlKCkgewotLy8gcmV0dXJuCi0vLyAoKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKSkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotLy8gaWYgKHRoaXMuc2V0Q29tbWVudCkgcmV0dXJuIHRoaXMuY29tbWVudDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpLHRoaXMuY29tbWVudCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRDb21tZW50KCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9Db21tZW50KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldENvbW1lbnQoKSB7Ci0vLyByZXR1cm4gc2V0Q29tbWVudDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBCb29sZWFuIGdldFBhcnNlRXJyb3IoKSB7Ci0vLyBpZiAodGhpcy5zZXRQYXJzZUVycm9yKSByZXR1cm4gdGhpcy5wYXJzZUVycm9yOwotLy8gZWxzZSByZXR1cm4KLS8vIChCb29sZWFuKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNQYXJzZUVycm9yKCkgewotLy8gQm9vbGVhbiByZXN1bHQgPSBnZXRQYXJzZUVycm9yKCk7Ci0vLyByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJzZUVycm9yKEJvb2xlYW4gdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9QYXJzZUVycm9yKCksdGhpcy5wYXJzZUVycm9yLHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJzZUVycm9yKGJvb2xlYW4gdmFsdWUpIHsKLS8vIHNldFBhcnNlRXJyb3IodmFsdWU/Qm9vbGVhbi5UUlVFOkJvb2xlYW4uRkFMU0UpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0UGFyc2VFcnJvcigpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRQYXJzZUVycm9yKCkgewotLy8gcmV0dXJuIHNldFBhcnNlRXJyb3I7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0RFREQ29udGVudCgpIHsKLS8vIGlmICh0aGlzLmR0ZENvbnRlbnQ9PW51bGwpIHsKLS8vIHRoaXMuZHRkQ29udGVudD1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9EVERDb250ZW50KCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmR0ZENvbnRlbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0RFRERW51bWVyYXRpb25UeXBlKCkgewotLy8gaWYgKHRoaXMuZHRkRW51bWVyYXRpb25UeXBlPT1udWxsKSB7Ci0vLyB0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuZHRkRW51bWVyYXRpb25UeXBlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDogcmV0dXJuIGdldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHJldHVybiBnZXRQYXJzZUVycm9yKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UOiByZXR1cm4gZ2V0RFREQ29udGVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRTogcmV0dXJuCi0vLyBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IHJlZkJhc2ljVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRDb21tZW50PyB0aGlzLmNvbW1lbnQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjoKLS8vIHJldHVybiB0aGlzLnNldFBhcnNlRXJyb3I/IHRoaXMucGFyc2VFcnJvciA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UOgotLy8gcmV0dXJuIHRoaXMuZHRkQ29udGVudDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEU6Ci0vLyByZXR1cm4gdGhpcy5kdGRFbnVtZXJhdGlvblR5cGU7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHJldHVybiBpc1NldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHJldHVybiBpc1NldFBhcnNlRXJyb3IoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDogewotLy8gc2V0Q29tbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIHNldFBhcnNlRXJyb3IoKG5ld1ZhbHVlIGluc3RhbmNlb2YKLS8vIFN0cmluZyk/Qm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpbmV3VmFsdWUpOihCb29sZWFuKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyc2VFcnJvcjsKLS8vIHRoaXMucGFyc2VFcnJvciA9IChCb29sZWFuKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJzZUVycm9yID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9QYXJzZUVycm9yKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIHVuc2V0Q29tbWVudCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogewotLy8gdW5zZXRQYXJzZUVycm9yKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gcmVmQmFzaWNVbnNldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSxvbGRWYWx1ZSxnZXRDb21tZW50KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJzZUVycm9yOwotLy8gdGhpcy5wYXJzZUVycm9yID0gbnVsbDsKLS8vIHRoaXMuc2V0UGFyc2VFcnJvciA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLG9sZFZhbHVlLGdldFBhcnNlRXJyb3IoKSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotLy8gU3RyaW5nIG91dD0iKCI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBib29sZWFuIGZpcnN0PXRydWU7Ci0vLyBib29sZWFuIGVtcHR5TGlzdD10cnVlOwotLy8gaWYoaXNTZXRDb21tZW50KCkpIHsKLS8vIGlmKCFlbXB0eUxpc3QpIG91dCs9IiwgIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIG91dCs9ImNvbW1lbnQ6ICIrdGhpcy5jb21tZW50OyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gZmlyc3Q9ZmFsc2U7Ci0vLyBlbXB0eUxpc3Q9ZmFsc2U7Ci0vLyB9Ci0vLyBpZihpc1NldFBhcnNlRXJyb3IoKSkgewotLy8gaWYoIWVtcHR5TGlzdCkgb3V0Kz0iLCAiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gb3V0Kz0icGFyc2VFcnJvcjogIit0aGlzLnBhcnNlRXJyb3I7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBmaXJzdD1mYWxzZTsKLS8vIGVtcHR5TGlzdD1mYWxzZTsKLS8vIH0KLS8vIG91dCs9IikiOwotLy8gaWYgKCFmaXJzdCkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiICIgK291dDsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIHJldHVybiBzdXBlci50b1N0cmluZygpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREdyb3VwQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDExZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREdyb3VwQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUHJpbnRlcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREdyb3VwQ29udGVudEltcGwgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERHcm91cENvbnRlbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cEtpbmQoKSA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgR1JPVVBfS0lORF9FREVGQVVMVCA9IERUREdyb3VwS2luZC5TRVFVRU5DRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREdyb3VwS2luZCBncm91cEtpbmQgPSBHUk9VUF9LSU5EX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERHcm91cENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREdyb3VwQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFBvc2l0aW9uKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJRUxpc3QgbGlzdCA9IGdldENvbnRlbnQoKTsKLQkJcmV0dXJuIGxpc3QuaW5kZXhPZihjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKGZhbHNlKTsKLQkJcHJpbnRlci52aXNpdERUREdyb3VwQ29udGVudCh0aGlzKTsKLQotCQlyZXR1cm4gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERHcm91cEtpbmQgZ2V0R3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZ3JvdXBLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kIG5ld0dyb3VwS2luZCkgewotCQlEVERHcm91cEtpbmQgb2xkR3JvdXBLaW5kID0gZ3JvdXBLaW5kOwotCQlncm91cEtpbmQgPSBuZXdHcm91cEtpbmQgPT0gbnVsbCA/IEdST1VQX0tJTkRfRURFRkFVTFQgOiBuZXdHcm91cEtpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQsIG9sZEdyb3VwS2luZCwgZ3JvdXBLaW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJY29udGVudCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREVsZW1lbnRDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXBLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ3JvdXBLaW5kICE9IEdST1VQX0tJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGwgJiYgIWdldENvbnRlbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCA6Ci0JCQkJc2V0R3JvdXBLaW5kKChEVERHcm91cEtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCWdldENvbnRlbnQoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlzZXRHcm91cEtpbmQoR1JPVVBfS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQlnZXRDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cEtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3JvdXBLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESWRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA3MDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotCi1wdWJsaWMgY2xhc3MgRFRESWRIZWxwZXIgewotCXB1YmxpYyBEVERJZEhlbHBlcigpIHsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVDb250ZW50SWQoRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQlTdHJpbmcgaWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJaWQgPSAiI0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQlpZCA9ICIjUENEQVRBIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCWlkID0gIiNFTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCWlkID0gIiMiICsgKChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgY29udGVudCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJaWQgPSAiIyIgKyAoKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpLmdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJaWQgPSBjb21wdXRlR3JvdXBJZCgoRFRER3JvdXBDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb21wdXRlR3JvdXBJZChEVERHcm91cENvbnRlbnQgZ3JwKSB7Ci0JCVN0cmluZyBncm91cElkID0gIl8iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBncm91cElkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVDb250ZW50SWRHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCi0JCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCWlkID0gIiNQQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJaWQgPSAiI0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJaWQgPSAiIyIgKyAoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRSZWZlcmVuY2VkRWxlbWVudCgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCkuZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQlpZCA9IGNvbXB1dGVHcm91cElkKChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlR3JvdXBJZEdlbihEVERHcm91cENvbnRlbnQgZ3JwKSB7Ci0KLQkJU3RyaW5nIGdyb3VwSWQgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdyb3VwSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREludGVybmFsRW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREludGVybmFsRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDIwMGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJbnRlcm5hbEVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERJbnRlcm5hbEVudGl0eUltcGwgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREludGVybmFsRW50aXR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JcHVibGljIERUREludGVybmFsRW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERJbnRlcm5hbEVudGl0eSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig2NCk7Ci0JCWlmIChnZXRWYWx1ZSgpID09IG51bGwpCi0JCQlzYi5hcHBlbmQoIlwiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgiXCIiKS5hcHBlbmQocmVwbGFjZURvdWJsZVF1b3RlcyhnZXRWYWx1ZSgpKSkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyB0aGlzIG1ldGhvZCByZXBsYWNlcyBhbnkgb2NjdXJyZW5jZSBvZiAnICIgJyB3aXRoIHRoZSBlcXVpdmFsZW50IHZhbHVlCi0JLy8gb2YgJiMzNDsKLQlwcml2YXRlIFN0cmluZyByZXBsYWNlRG91YmxlUXVvdGVzKFN0cmluZyBpbnB1dCkgewotCQlTdHJpbmdCdWZmZXIgbmV3VmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihpbnB1dCk7Ci0KLQkJd2hpbGUgKGNoYXJhY3RlcnMuY3VycmVudCgpICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUpIHsKLQkJCWNoYXIgY3VycmVudCA9IGNoYXJhY3RlcnMuY3VycmVudCgpOwotCi0JCQlpZiAoY3VycmVudCA9PSAnIicpIHsKLQkJCQluZXdWYWx1ZS5hcHBlbmQoIiYjMzQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1ZhbHVlLmFwcGVuZChjdXJyZW50KTsKLQkJCX0KLQkJCWNoYXJhY3RlcnMubmV4dCgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1ZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RFRERW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RFRERW50aXR5KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgOgotCQkJCXNldFZhbHVlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURE5vdGF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURE5vdGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGUzMjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVEROb3RhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRETm90YXRpb25JbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVEROb3RhdGlvbiwgRFREQ29udGVudCB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJOb3RhIiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lzdGVtSUQoKSA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeXN0ZW1JRCgpIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IFNZU1RFTV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaWNJRCgpIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1YmxpY0lEKCkgPGVtPlB1YmxpYyBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFB1YmxpY0lEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gUFVCTElDX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5KCkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRETm90YXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgbmV3U3lzdGVtSUQpIHsKLQkJU3RyaW5nIG9sZFN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JCXN5c3RlbUlEID0gbmV3U3lzdGVtSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQsIG9sZFN5c3RlbUlELCBzeXN0ZW1JRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlyZXR1cm4gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKFN0cmluZyBuZXdQdWJsaWNJRCkgewotCQlTdHJpbmcgb2xkUHVibGljSUQgPSBwdWJsaWNJRDsKLQkJcHVibGljSUQgPSBuZXdQdWJsaWNJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCwgb2xkUHVibGljSUQsIHB1YmxpY0lEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnRpdHkoKSB7Ci0JCWlmIChlbnRpdHkgPT0gbnVsbCkgewotCQkJZW50aXR5ID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREV4dGVybmFsRW50aXR5LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OKTsKLQkJfQotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHkoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVudGl0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIGdldFN5c3RlbUlEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBnZXRQdWJsaWNJRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEIDoKLQkJCQlzZXRQdWJsaWNJRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlnZXRFbnRpdHkoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRChTWVNURU1fSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCWdldEVudGl0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBTWVNURU1fSURfRURFRkFVTFQgPT0gbnVsbCA/IHN5c3RlbUlEICE9IG51bGwgOiAhU1lTVEVNX0lEX0VERUZBVUxULmVxdWFscyhzeXN0ZW1JRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCXJldHVybiBlbnRpdHkgIT0gbnVsbCAmJiAhZ2V0RW50aXR5KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5c3RlbUlEOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5c3RlbUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWNJRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdWJsaWNJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVEROb3RhdGlvbkltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRETm90YXRpb25JbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotLy8gRFRETm90YXRpb24sIEVOYW1lc3BhY2UsIERURENvbnRlbnR7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgotLy8gMjAwMi4iOwotLy8KLS8vIHB1YmxpYyBEVEROb3RhdGlvbkltcGwoKQotLy8gewotLy8gc3VwZXIoKTsKLS8vIH0KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKQotLy8gewotLy8gcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiTm90YSIsIGdldE5hbWUoKSwgLTEpOwotLy8gfQotLy8KLS8vIHB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKQotLy8gewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLwotLy8gLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLS8vIC8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLS8vIC8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0vLyBEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFN5c3RlbUlEID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICovCi0vLyBwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkKLS8vIHsKLS8vIHJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHBhcmFtIHYgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLS8vIH0KLS8vICAKLS8vIC8qKgotLy8gKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIGludCBnZXRFbmRPZmZzZXQoKQotLy8gewotLy8gcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqIEBwYXJhbSB2IFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFRETm90YXRpb24oKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCB2b2lkIGluaXRJbnN0YW5jZURlbGVnYXRlcygpIHsKLS8vIHN1cGVyLmluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVEROb3RhdGlvbigpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERURE5vdGF0aW9uKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0vLyBpZiAodGhpcy5zZXRDb21tZW50KSByZXR1cm4gdGhpcy5jb21tZW50OwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29tbWVudCgpIHsKLS8vIHJldHVybiBzZXRDb21tZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLS8vIGlmICh0aGlzLnNldFN5c3RlbUlEKSByZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksdGhpcy5zeXN0ZW1JRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRTeXN0ZW1JRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFN5c3RlbUlEKCkgewotLy8gcmV0dXJuIHNldFN5c3RlbUlEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRQdWJsaWNJRCgpIHsKLS8vIGlmICh0aGlzLnNldFB1YmxpY0lEKSByZXR1cm4gdGhpcy5wdWJsaWNJRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksdGhpcy5wdWJsaWNJRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQdWJsaWNJRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFB1YmxpY0lEKCkgewotLy8gcmV0dXJuIHNldFB1YmxpY0lEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEVudGl0eSgpIHsKLS8vIGlmICh0aGlzLmVudGl0eT09bnVsbCkgewotLy8gdGhpcy5lbnRpdHk9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0VudGl0eSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHJldHVybiBnZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gZ2V0UHVibGljSUQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBnZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRDb21tZW50PyB0aGlzLmNvbW1lbnQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0U3lzdGVtSUQ/IHRoaXMuc3lzdGVtSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0UHVibGljSUQ/IHRoaXMucHVibGljSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZOgotLy8gcmV0dXJuIHRoaXMuZW50aXR5OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybgotLy8gKChJbnRlcm5hbEVPYmplY3QpZ2V0RHRkQ29udGVudERlbGVnYXRlKCkpLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogcmV0dXJuIGlzU2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiByZXR1cm4gaXNTZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gaXNTZXRQdWJsaWNJRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBpc1NldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiB7Ci0vLyBzZXRTeXN0ZW1JRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gc2V0UHVibGljSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuc3lzdGVtSUQ7Ci0vLyB0aGlzLnN5c3RlbUlEID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0U3lzdGVtSUQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wdWJsaWNJRDsKLS8vIHRoaXMucHVibGljSUQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQdWJsaWNJRCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gdW5zZXRDb21tZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIHVuc2V0U3lzdGVtSUQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gdW5zZXRQdWJsaWNJRCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHsKLS8vIHVuc2V0RFRERmlsZSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5zeXN0ZW1JRDsKLS8vIHRoaXMuc3lzdGVtSUQgPSBudWxsOwotLy8gdGhpcy5zZXRTeXN0ZW1JRCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksb2xkVmFsdWUsZ2V0U3lzdGVtSUQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucHVibGljSUQ7Ci0vLyB0aGlzLnB1YmxpY0lEID0gbnVsbDsKLS8vIHRoaXMuc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLG9sZFZhbHVlLGdldFB1YmxpY0lEKCkpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURENvbnRlbnRJbXBsIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpIHsKLS8vIGlmIChkdGRDb250ZW50RGVsZWdhdGUgPT0gbnVsbCkgewotLy8gRFREUGFja2FnZSBwa2cgPQotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZT0oRFREQ29udGVudEltcGwpcGtnLmVDcmVhdGVJbnN0YW5jZShwa2cuRFREX0NPTlRFTlQpOwotLy8gZHRkQ29udGVudERlbGVnYXRlLmluaXRJbnN0YW5jZSgpOwotLy8gfQotLy8gcmV0dXJuIGR0ZENvbnRlbnREZWxlZ2F0ZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURENvbnRlbnQoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZUNsYXNzKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5nZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5zZXREVERGaWxlKHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldERUREZpbGUoKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS51bnNldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuaXNTZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyB9Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQQ0RhdGFDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDBmNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERURFBDRGF0YUNvbnRlbnRJbXBsIGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFREUENEYXRhQ29udGVudCB7Ci0KLQlwdWJsaWMgRFREUENEYXRhQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUENEYXRhQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIiNQQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjMThhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgRFREUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBEVERQYWNrYWdlLAotICogICAgICAgICAgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGNsYXNzIERURFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRFREUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRHcm91cENvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEF0dHJpYnV0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRW1wdHlDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRBbnlDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRwY0RhdGFDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEJhc2ljVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGROb3RhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbnRpdHlDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGRPY2N1cnJlbmNlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZERlZmF1bHRLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkQmFzaWNUeXBlS2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZEVudW1Hcm91cEtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGRHcm91cEtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieQotCSAqIHRoZSBwYWNrYWdlIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMgZmFjdG9yeQotCSAqIG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKiBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgRFRERmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8vIHB1YmxpYyBEVERQYWNrYWdlSW1wbCgpCi0JLy8gewotCS8vIHN1cGVyKGVOU19VUkkpOwotCS8vIGluaXRpYWxpemVQYWNrYWdlKG51bGwpOwotCS8vIH0KLQotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLAotCSAqIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuIFNpbXBsZSBkZXBlbmRlbmNpZXMgYXJlCi0JICogc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcKLQkgKiBhbnl0aGluZyBlbHNlLiBUaGlzIG1ldGhvZCBkcml2ZXMgaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50Ci0JICogcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+Ci0JICogT2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaCBoYXZlIG5vdAotCSAqIHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZCBhbmQKLQkgKiByZWdpc3RlcmVkLiBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOiBtZXRhLW1vZGVsCi0JICogb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55IGFyZSBpbml0aWFsaXplZCwKLQkgKiBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8gdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD4KLQkgKiBJbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERQYWNrYWdlIGluaXQoKSB7Ci0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UgYW5kIGludGVyZGVwZW5kZW5jaWVzCi0JCURURFBhY2thZ2VJbXBsIHRoZURURFBhY2thZ2UgPSAoRFREUGFja2FnZUltcGwpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBEVERQYWNrYWdlSW1wbCgpKTsKLQkJRWNvcmVQYWNrYWdlSW1wbCB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChFY29yZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChFY29yZVBhY2thZ2UuZU5TX1VSSSkgOiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBTdGVwIDE6IGNyZWF0ZSBtZXRhLW1vZGVsIG9iamVjdHMKLQkJdGhlRFREUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNvcmVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIFN0ZXAgMjogY29tcGxldGUgaW5pdGlhbGl6YXRpb24KLQkJdGhlRFREUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjb3JlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJcmV0dXJuIHRoZURURFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERWxlbWVudENvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbGVtZW50Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudENvbnRlbnRfR3JvdXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRER3JvdXBDb250ZW50KCkgewotCQlyZXR1cm4gZHRkR3JvdXBDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEdyb3VwQ29udGVudEVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkR3JvdXBDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGR0ZEF0dHJpYnV0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfRGVmYXVsdEtpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVsZW1lbnQoKSB7Ci0JCXJldHVybiBkdGRFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFbGVtZW50X0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRWxlbWVudEVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudF9Db250ZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW1wdHlDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRW1wdHlDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREFueUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRBbnlDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURFBDRGF0YUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRwY0RhdGFDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50X1JlZmVyZW5jZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURFJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURFJlcGVhdGFibGVDb250ZW50X09jY3VycmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREZpbGVfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRGaWxlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERGaWxlX1BhcnNlRXJyb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRmlsZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERmlsZV9EVERDb250ZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEZpbGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEZpbGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREQmFzaWNUeXBlKCkgewotCQlyZXR1cm4gZHRkQmFzaWNUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERCYXNpY1R5cGVfS2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRCYXNpY1R5cGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW51bWVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFbnVtZXJhdGlvblR5cGVfS2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVEROb3RhdGlvbigpIHsKLQkJcmV0dXJuIGR0ZE5vdGF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGROb3RhdGlvbkVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fUHVibGljSUQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERURE5vdGF0aW9uX0VudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGROb3RhdGlvbkVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnRpdHkoKSB7Ci0JCXJldHVybiBkdGRFbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVudGl0eV9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9Db250ZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW50aXR5Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBkdGRFeHRlcm5hbEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1B1YmxpY0lEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERJbnRlcm5hbEVudGl0eSgpIHsKLQkJcmV0dXJuIGR0ZEludGVybmFsRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERJbnRlcm5hbEVudGl0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRJbnRlcm5hbEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZENvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERURENvbnRlbnRfRFRERmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFRET2NjdXJyZW5jZVR5cGUoKSB7Ci0JCXJldHVybiBkdGRPY2N1cnJlbmNlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFRERGVmYXVsdEtpbmQoKSB7Ci0JCXJldHVybiBkdGREZWZhdWx0S2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFREQmFzaWNUeXBlS2luZCgpIHsKLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZUtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERUREVudW1Hcm91cEtpbmQoKSB7Ci0JCXJldHVybiBkdGRFbnVtR3JvdXBLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERHcm91cEtpbmQoKSB7Ci0JCXJldHVybiBkdGRHcm91cEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhNTFNjaGVtYURlZmluZWRUeXBlKCkgewotCQlyZXR1cm4geG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREZhY3RvcnkgZ2V0RFRERmFjdG9yeSgpIHsKLQkJcmV0dXJuIChEVERGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQKLQkgKiB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWR0ZEVsZW1lbnRDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTEVNRU5UX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLCBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MsIERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQpOwotCi0JCWR0ZEdyb3VwQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfR1JPVVBfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkR3JvdXBDb250ZW50RUNsYXNzLCBEVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkR3JvdXBDb250ZW50RUNsYXNzLCBEVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCk7Ci0KLQkJZHRkQXR0cmlidXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9BVFRSSUJVVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQpOwotCi0JCWR0ZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVsZW1lbnRFQ2xhc3MsIERURF9FTEVNRU5UX19DT01NRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50RUNsYXNzLCBEVERfRUxFTUVOVF9fQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudEVDbGFzcywgRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUpOwotCi0JCWR0ZEVtcHR5Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU1QVFlfQ09OVEVOVCk7Ci0KLQkJZHRkQW55Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfQU5ZX0NPTlRFTlQpOwotCi0JCWR0ZHBjRGF0YUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX1BDX0RBVEFfQ09OVEVOVCk7Ci0KLQkJZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UKTsKLQotCQlkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfUkVQRUFUQUJMRV9DT05URU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcywgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSk7Ci0KLQkJZHRkRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRmlsZUVDbGFzcywgRFREX0ZJTEVfX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19QQVJTRV9FUlJPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRmlsZUVDbGFzcywgRFREX0ZJTEVfX0RURF9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUpOwotCi0JCWR0ZEJhc2ljVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfQkFTSUNfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkQmFzaWNUeXBlRUNsYXNzLCBEVERfQkFTSUNfVFlQRV9fS0lORCk7Ci0KLQkJZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTlVNRVJBVElPTl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MsIERURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MsIERURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSk7Ci0KLQkJZHRkTm90YXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX05PVEFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGROb3RhdGlvbkVDbGFzcywgRFREX05PVEFUSU9OX19DT01NRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGROb3RhdGlvbkVDbGFzcywgRFREX05PVEFUSU9OX19TWVNURU1fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX1BVQkxJQ19JRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fRU5USVRZKTsKLQotCQlkdGRFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19DT01NRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFKTsKLQotCQlkdGRFbnRpdHlDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTlRJVFlfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5Q29udGVudEVDbGFzcywgRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZKTsKLQotCQlkdGRFeHRlcm5hbEVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRVhURVJOQUxfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFeHRlcm5hbEVudGl0eUVDbGFzcywgRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFeHRlcm5hbEVudGl0eUVDbGFzcywgRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFeHRlcm5hbEVudGl0eUVDbGFzcywgRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSk7Ci0KLQkJZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0lOVEVSTkFMX0VOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFKTsKLQotCQlkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MsIERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZKTsKLQotCQlkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MsIERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkpOwotCi0JCWR0ZENvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZENvbnRlbnRFQ2xhc3MsIERURF9DT05URU5UX19EVERfRklMRSk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWR0ZE9jY3VycmVuY2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShEVERfT0NDVVJSRU5DRV9UWVBFKTsKLQkJZHRkRGVmYXVsdEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9ERUZBVUxUX0tJTkQpOwotCQlkdGRCYXNpY1R5cGVLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfQkFTSUNfVFlQRV9LSU5EKTsKLQkJZHRkRW51bUdyb3VwS2luZEVFbnVtID0gY3JlYXRlRUVudW0oRFREX0VOVU1fR1JPVVBfS0lORCk7Ci0JCWR0ZEdyb3VwS2luZEVFbnVtID0gY3JlYXRlRUVudW0oRFREX0dST1VQX0tJTkQpOwotCQl4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUVjb3JlUGFja2FnZUltcGwgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZUltcGwpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWR0ZEdyb3VwQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURFJlcGVhdGFibGVDb250ZW50KCkpOwotCQlkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVBdHRyaWJ1dGUoKSk7Ci0JCWR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVDbGFzcygpKTsKLQkJZHRkRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEVtcHR5Q29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRBbnlDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZHBjRGF0YUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpKTsKLQkJZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpKTsKLQkJZHRkQmFzaWNUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUVudW0oKSk7Ci0JCWR0ZE5vdGF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREQ29udGVudCgpKTsKLQkJZHRkRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREQ29udGVudCgpKTsKLQkJZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbnRpdHlDb250ZW50KCkpOwotCQlkdGRJbnRlcm5hbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVudGl0eUNvbnRlbnQoKSk7Ci0JCWR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERSZXBlYXRhYmxlQ29udGVudCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLCBEVERFbGVtZW50Q29udGVudC5jbGFzcywgIkRUREVsZW1lbnRDb250ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCksIHRoaXMuZ2V0RFRER3JvdXBDb250ZW50KCksIHRoaXMuZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKSwgImdyb3VwIiwgbnVsbCwgMCwgMSwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudF9Db250ZW50KCksICJlbGVtZW50IiwgbnVsbCwgMCwgMSwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRHcm91cENvbnRlbnRFQ2xhc3MsIERUREdyb3VwQ29udGVudC5jbGFzcywgIkRUREdyb3VwQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpLCB0aGlzLmdldERUREdyb3VwS2luZCgpLCAiZ3JvdXBLaW5kIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpLCB0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnRfR3JvdXAoKSwgImNvbnRlbnQiLCBudWxsLCAxLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRBdHRyaWJ1dGVFQ2xhc3MsIERUREF0dHJpYnV0ZS5jbGFzcywgIkRUREF0dHJpYnV0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREQXR0cmlidXRlX0NvbW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbW1lbnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpLCB0aGlzLmdldERURERlZmF1bHRLaW5kKCksICJkZWZhdWx0S2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRWYWx1ZVN0cmluZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVmYXVsdFZhbHVlU3RyaW5nIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLCAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSwgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCksICJEVERFbGVtZW50IiwgbnVsbCwgMCwgMSwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbGVtZW50RUNsYXNzLCBEVERFbGVtZW50LmNsYXNzLCAiRFRERWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERWxlbWVudF9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50X0NvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpLCB0aGlzLmdldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKSwgImNvbnRlbnQiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGUoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpLCAiRFREQXR0cmlidXRlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW1wdHlDb250ZW50RUNsYXNzLCBEVERFbXB0eUNvbnRlbnQuY2xhc3MsICJEVERFbXB0eUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRBbnlDb250ZW50RUNsYXNzLCBEVERBbnlDb250ZW50LmNsYXNzLCAiRFREQW55Q29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZHBjRGF0YUNvbnRlbnRFQ2xhc3MsIERURFBDRGF0YUNvbnRlbnQuY2xhc3MsICJEVERQQ0RhdGFDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MsIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmNsYXNzLCAiRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50X1JlZmVyZW5jZWRFbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudCgpLCBudWxsLCAicmVmZXJlbmNlZEVsZW1lbnQiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLCBEVERSZXBlYXRhYmxlQ29udGVudC5jbGFzcywgIkRURFJlcGVhdGFibGVDb250ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERURFJlcGVhdGFibGVDb250ZW50X09jY3VycmVuY2UoKSwgdGhpcy5nZXREVERPY2N1cnJlbmNlVHlwZSgpLCAib2NjdXJyZW5jZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEZpbGVFQ2xhc3MsIERUREZpbGUuY2xhc3MsICJEVERGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERGaWxlX0NvbW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbW1lbnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREZpbGVfUGFyc2VFcnJvcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInBhcnNlRXJyb3IiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREZpbGVfRFREQ29udGVudCgpLCB0aGlzLmdldERURENvbnRlbnQoKSwgdGhpcy5nZXREVERDb250ZW50X0RUREZpbGUoKSwgIkRURENvbnRlbnQiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCksIHRoaXMuZ2V0RFRERW51bWVyYXRpb25UeXBlKCksIHRoaXMuZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKSwgIkRUREVudW1lcmF0aW9uVHlwZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEJhc2ljVHlwZUVDbGFzcywgRFREQmFzaWNUeXBlLmNsYXNzLCAiRFREQmFzaWNUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERCYXNpY1R5cGVfS2luZCgpLCB0aGlzLmdldERUREJhc2ljVHlwZUtpbmQoKSwgImtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MsIERUREVudW1lcmF0aW9uVHlwZS5jbGFzcywgIkRUREVudW1lcmF0aW9uVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERW51bWVyYXRpb25UeXBlX0tpbmQoKSwgdGhpcy5nZXREVERFbnVtR3JvdXBLaW5kKCksICJraW5kIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpLCB0aGlzLmdldERUREZpbGUoKSwgdGhpcy5nZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpLCAiRFRERmlsZSIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkTm90YXRpb25FQ2xhc3MsIERURE5vdGF0aW9uLmNsYXNzLCAiRFRETm90YXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERURE5vdGF0aW9uX0NvbW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbW1lbnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzeXN0ZW1JRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRETm90YXRpb25fUHVibGljSUQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInB1YmxpY0lEIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVEROb3RhdGlvbl9FbnRpdHkoKSwgdGhpcy5nZXREVERFeHRlcm5hbEVudGl0eSgpLCB0aGlzLmdldERUREV4dGVybmFsRW50aXR5X05vdGF0aW9uKCksICJlbnRpdHkiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbnRpdHlFQ2xhc3MsIERUREVudGl0eS5jbGFzcywgIkRUREVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERW50aXR5X0NvbW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbW1lbnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwYXJhbWV0ZXJFbnRpdHkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9Db250ZW50KCksIHRoaXMuZ2V0RFRERW50aXR5Q29udGVudCgpLCB0aGlzLmdldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCksICJjb250ZW50IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksIHRoaXMuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCksIHRoaXMuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLCAicGFybUVudGl0eVJlZiIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCksIHRoaXMuZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpLCB0aGlzLmdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSwgImVudGl0eVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGUoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSwgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCksICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW50aXR5Q29udGVudEVDbGFzcywgRFRERW50aXR5Q29udGVudC5jbGFzcywgIkRUREVudGl0eUNvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfQ29udGVudCgpLCAiRFRERW50aXR5IiwgbnVsbCwgMCwgMSwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFeHRlcm5hbEVudGl0eUVDbGFzcywgRFRERXh0ZXJuYWxFbnRpdHkuY2xhc3MsICJEVERFeHRlcm5hbEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfU3lzdGVtSUQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInN5c3RlbUlEIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFeHRlcm5hbEVudGl0eV9QdWJsaWNJRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHVibGljSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREV4dGVybmFsRW50aXR5X05vdGF0aW9uKCksIHRoaXMuZ2V0RFRETm90YXRpb24oKSwgdGhpcy5nZXREVEROb3RhdGlvbl9FbnRpdHkoKSwgIm5vdGF0aW9uIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREV4dGVybmFsRW50aXR5X0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSwgdGhpcy5nZXREVERGaWxlKCksIG51bGwsICJlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRJbnRlcm5hbEVudGl0eUVDbGFzcywgRFRESW50ZXJuYWxFbnRpdHkuY2xhc3MsICJEVERJbnRlcm5hbEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsICJEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLCAiZW50aXR5IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmNsYXNzLCAiRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKSwgImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRDb250ZW50RUNsYXNzLCBEVERDb250ZW50LmNsYXNzLCAiRFREQ29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERDb250ZW50X0RUREZpbGUoKSwgdGhpcy5nZXREVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZV9EVERDb250ZW50KCksICJEVERGaWxlIiwgbnVsbCwgMCwgMSwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLmNsYXNzLCAiRFRET2NjdXJyZW5jZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5PTkVfT1JfTU9SRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLlpFUk9fT1JfTU9SRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuY2xhc3MsICJEVEREZWZhdWx0S2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5JTVBMSUVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuUkVRVUlSRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5GSVhFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLk5PRklYRURfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5jbGFzcywgIkRUREJhc2ljVHlwZUtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLk5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuQ0RBVEFfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuSURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuSURSRUZfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuSURSRUZTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLkVOVElUWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5FTlRJVElFU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkdGRFbnVtR3JvdXBLaW5kRUVudW0sIERUREVudW1Hcm91cEtpbmQuY2xhc3MsICJEVERFbnVtR3JvdXBLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEVudW1Hcm91cEtpbmRFRW51bSwgRFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkRW51bUdyb3VwS2luZEVFbnVtLCBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkdGRHcm91cEtpbmRFRW51bSwgRFRER3JvdXBLaW5kLmNsYXNzLCAiRFRER3JvdXBLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEdyb3VwS2luZEVFbnVtLCBEVERHcm91cEtpbmQuU0VRVUVOQ0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRHcm91cEtpbmRFRW51bSwgRFRER3JvdXBLaW5kLkNIT0lDRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuY2xhc3MsICJYTUxTY2hlbWFEZWZpbmVkVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5OT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuU1RSSU5HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuQk9PTEVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkZMT0FUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuRE9VQkxFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuREVDSU1BTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlRJTUVJTlNUQU5UX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuVElNRURVUkFUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkJJTkFSWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlVSSV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLklOVEVHRVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5EQVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuVElNRV9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi0KLX0gLy8gRFREUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk3MTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UsIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlEVERFbnRpdHkgZW50aXR5ID0gZ2V0RW50aXR5KCk7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eSgpLmdldE5hbWUoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiUEVudCIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5KCkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBlbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEVudGl0eSgpIHsKLQkJaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQkJZW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5LCB0aGlzKTsKLQkJCWlmIChlbnRpdHkgIT0gb2xkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgb2xkRW50aXR5LCBlbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0RW50aXR5KCkgewotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQllbnRpdHkgPSBuZXdFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBvbGRFbnRpdHksIG5ld0VudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ICE9IGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVudGl0eShuZXdFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBuZXdFbnRpdHksIG5ld0VudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCXNldEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQlzZXRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVudGl0eSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwKLS8vIGltcGxlbWVudHMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLCBFTmFtZXNwYWNlLCBEVERDb250ZW50ewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERFbnRpdHkgZW50aXR5ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRFbnRpdHkgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgdm9pZCBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKSB7Ci0vLyBzdXBlci5pbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vCi0KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0vLyByZXR1cm4KLS8vICgoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpKS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBEVERFbnRpdHkgZ2V0RW50aXR5KCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLmVudGl0eSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSkgKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlc29sdmUodGhpcywKLS8vIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSk7Ci0vLyBpZiAodGhpcy5lbnRpdHk9PW51bGwpIHRoaXMuc2V0RW50aXR5ID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW50aXR5KERUREVudGl0eSBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSx0aGlzLmVudGl0eSxsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldEVudGl0eSgpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksdGhpcy5lbnRpdHkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RW50aXR5KCkgewotLy8gcmV0dXJuIHNldEVudGl0eTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gZ2V0RFRERmlsZSgpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6Ci0vLyBpZiAoIXRoaXMuc2V0RW50aXR5fHx0aGlzLmVudGl0eT09bnVsbCkgcmV0dXJuIG51bGw7Ci0vLyBpZiAoKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlZklzRGVsZXRlZCgpKSB7dGhpcy5lbnRpdHk9bnVsbDsKLS8vIHRoaXMuc2V0RW50aXR5PWZhbHNlO30KLS8vIHJldHVybiB0aGlzLmVudGl0eTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiByZXR1cm4KLS8vICgoSW50ZXJuYWxFT2JqZWN0KWdldER0ZENvbnRlbnREZWxlZ2F0ZSgpKS5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuCi0vLyBpc1NldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gaXNTZXREVERGaWxlKCk7Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBzZXRFbnRpdHkoKERUREVudGl0eSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmVudGl0eTsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0RW50aXR5ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogewotLy8gdW5zZXRFbnRpdHkoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiB7Ci0vLyB1bnNldERUREZpbGUoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZW50aXR5OwotLy8gdGhpcy5lbnRpdHkgPSBudWxsOwotLy8gdGhpcy5zZXRFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERDb250ZW50SW1wbCBnZXREdGRDb250ZW50RGVsZWdhdGUoKSB7Ci0vLyBpZiAoZHRkQ29udGVudERlbGVnYXRlID09IG51bGwpIHsKLS8vIERURFBhY2thZ2UgcGtnID0KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGU9KERURENvbnRlbnRJbXBsKXBrZy5lQ3JlYXRlSW5zdGFuY2UocGtnLkRURF9DT05URU5UKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZS5pbml0SW5zdGFuY2UoKTsKLS8vIH0KLS8vIHJldHVybiBkdGRDb250ZW50RGVsZWdhdGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERDb250ZW50KCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmVDbGFzcygpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuc2V0RFRERmlsZSh2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXREVERGaWxlKCkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkudW5zZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmlzU2V0RFRERmlsZSgpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQ3MGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERSZXBlYXRhYmxlQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERSZXBlYXRhYmxlQ29udGVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9jY3VycmVuY2UoKSA8ZW0+T2NjdXJyZW5jZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE9jY3VycmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT0NDVVJSRU5DRV9FREVGQVVMVCA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2UgPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCi0JcHVibGljIERURFJlcGVhdGFibGVDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERSZXBlYXRhYmxlQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMjgpOwotCQlpZiAoZ2V0T2NjdXJyZW5jZSgpLmdldFZhbHVlKCkgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKSB7Ci0JCQlpZiAodGhpcyBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQlzYi5hcHBlbmQoIigiKS5hcHBlbmQodW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNiLmFwcGVuZCh1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCQl9Ci0KLQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJLy8gRUVudW1MaXRlcmFsIGxpdCA9IGdldE9jY3VycmVuY2UoKTsKLQkJCURURE9jY3VycmVuY2VUeXBlIGxpdCA9IGdldE9jY3VycmVuY2UoKTsKLQkJCWlmIChsaXQgIT0gbnVsbCkgewotCQkJCXNiLmFwcGVuZCgoY2hhcikgbGl0LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogICAgICAgICAgICBKVVNUX09ORT0gLTEgT05FX09SX01PUkU9NDMgT1BUSU9OQUw9NjMgWkVST19PUl9NT1JFPTQyCi0JICovCi0JcHVibGljIERURE9jY3VycmVuY2VUeXBlIGdldE9jY3VycmVuY2UoKSB7Ci0JCXJldHVybiBvY2N1cnJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKERURE9jY3VycmVuY2VUeXBlIG5ld09jY3VycmVuY2UpIHsKLQkJRFRET2NjdXJyZW5jZVR5cGUgb2xkT2NjdXJyZW5jZSA9IG9jY3VycmVuY2U7Ci0JCW9jY3VycmVuY2UgPSBuZXdPY2N1cnJlbmNlID09IG51bGwgPyBPQ0NVUlJFTkNFX0VERUZBVUxUIDogbmV3T2NjdXJyZW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFLCBvbGRPY2N1cnJlbmNlLCBvY2N1cnJlbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIG9jY3VycmVuY2UgIT0gT0NDVVJSRU5DRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG9jY3VycmVuY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQob2NjdXJyZW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERSZXBlYXRhYmxlQ29udGVudCN1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRFRERWxlbWVudENvbnRlbnQjZ2V0Q29udGVudE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RUREFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwNmNkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEVERQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBEVERBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBEVERQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREU3dpdGNoIG1vZGVsU3dpdGNoID0gbmV3IERURFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudENvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERHcm91cENvbnRlbnQoRFRER3JvdXBDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREdyb3VwQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREQXR0cmlidXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudChEVERFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbXB0eUNvbnRlbnQoRFRERW1wdHlDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVtcHR5Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREFueUNvbnRlbnQoRFREQW55Q29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERBbnlDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREUENEYXRhQ29udGVudChEVERQQ0RhdGFDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURFBDRGF0YUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURFJlcGVhdGFibGVDb250ZW50KERURFJlcGVhdGFibGVDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURFJlcGVhdGFibGVDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERmlsZShEVERGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERCYXNpY1R5cGUoRFREQmFzaWNUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREJhc2ljVHlwZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVudW1lcmF0aW9uVHlwZShEVERFbnVtZXJhdGlvblR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW51bWVyYXRpb25UeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRETm90YXRpb24oRFRETm90YXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRETm90YXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHkoRFRERW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVudGl0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eUNvbnRlbnQoRFRERW50aXR5Q29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERXh0ZXJuYWxFbnRpdHkoRFRERXh0ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERJbnRlcm5hbEVudGl0eShEVERJbnRlcm5hbEVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERJbnRlcm5hbEVudGl0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERDb250ZW50KERURENvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3NpZmllcihFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQ2xhc3NpZmllckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzcyhFQ2xhc3Mgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUNsYXNzQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRURhdGFUeXBlKEVEYXRhVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFRGF0YVR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFRW51bShFRW51bSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFRW51bUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcikgbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUKLQkgKiBjYXNlcy4gSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZQotCSAqIGNhc2VzIGFueXdheS4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRETm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW50aXR5Q29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREV4dGVybmFsRW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRESW50ZXJuYWxFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREUmVwZWF0YWJsZUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbGVtZW50Q29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVtcHR5Q29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZQotCSAqIGNhc2VzLiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlCi0JICogY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQW55Q29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURFBDRGF0YUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERHcm91cENvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERCYXNpY1R5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUVudW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVEYXRhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy8gRFREQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNZXRyaWNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETWV0cmljcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmMwNmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNZXRyaWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci0KLQotcHVibGljIGNsYXNzIERURE1ldHJpY3MgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBlbGVtZW50UmVmZXJlbmNlTWFwOwotCi0JcHVibGljIERURE1ldHJpY3MoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UmVmZXJlbmNlcygpIHsKLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVsZW1lbnRSZWZlcmVuY2VDb3VudChEVERFbGVtZW50IGR0ZEVsZW1lbnQpIHsKLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGUgZ2V0RWxlbWVudFJlZmVyZW5jZXNHZW4oKSB7Ci0KLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnRHZW4oRFRERWxlbWVudCBkdGRFbGVtZW50KSB7Ci0KLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXRMZWFzdFJlZmVyZW5jZWRFbGVtZW50R2VuKCkgewotCi0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RjNzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNb2RlbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRUREZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQXR0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkF0dGxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Ob2RlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNUmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNUmVwZWF0YWJsZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5EVERTYXhBcnRpZmFjdFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5FbGVtZW50RGVjbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVudGl0eURlY2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5FcnJvck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5Ob3RhdGlvbkRlY2w7Ci0KLXB1YmxpYyBjbGFzcyBEVERNb2RlbEJ1aWxkZXIgZXh0ZW5kcyBEVERTYXhBcnRpZmFjdFZpc2l0b3IgewotCURURCBkdGQ7Ci0JRFREVXRpbCBkdGRVdGlsOwotCURUREZpbGUgZHRkRmlsZTsKLQlSZXNvdXJjZVNldCByZXNvdXJjZXM7Ci0KLQlwdWJsaWMgRFRETW9kZWxCdWlsZGVyKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREVXRpbCBkdGRVdGlsLCBEVEQgZHRkLCBEVERGaWxlIGR0ZEZpbGUpIHsKLQkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCXRoaXMuZHRkVXRpbCA9IGR0ZFV0aWw7Ci0JCXRoaXMuZHRkID0gZHRkOwotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyBEVERGYWN0b3J5SW1wbCBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gKERUREZhY3RvcnlJbXBsKSBkdGRVdGlsLmdldEZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURChEVEQgZHRkKSB7Ci0JCXN1cGVyLnZpc2l0RFREKGR0ZCk7Ci0KLQkJLy8gLSAybmQgcGFzcyAtCi0JCS8vIGRvIGZpbmFsIHByb2Nlc3NpbmcgZm9yIEF0dGxpc3RzIGFuZCBhZGRpbmcgY29udGVudE1vZGVsCi0JCWFkZEF0dGxpc3RBbmRDb250ZW50TW9kZWwoZHRkLCBkdGRGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsKEVsZW1lbnREZWNsIGVsZW1lbnQpIHsKLQkJLy8gRWxlbWVudCBtaWdodCBoYXZlIGJlZW4gYWRkZWQgZWFybGllciBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQKLQkJU3RyaW5nIGRlY2xOYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2w6IiArIGRlY2xOYW1lICk7Ci0JCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KGRlY2xOYW1lKTsKLQkJaWYgKGR0ZGVsZW1lbnQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcm9jZXNzIEVsZW1lbnREZWNsIC0gbm90IGZvdW5kIC0gY3JlYXRlIgotCQkJLy8gKTsKLQkJCWR0ZGVsZW1lbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudCgpOwotCQkJZHRkZWxlbWVudC5zZXROYW1lKGRlY2xOYW1lKTsKLQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQkJZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLnB1dChkZWNsTmFtZSwgZHRkZWxlbWVudCk7Ci0JCX0KLQotCQlzdXBlci52aXNpdEVsZW1lbnREZWNsKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCQkvLyBOb3RhdGlvbiBtaWdodCBoYXZlIGJlZW4gYWRkZWQgZWFybGllciBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQKLQkJLy8gYnkgYW4gZW50aXR5Ci0JCURURE5vdGF0aW9uIGR0ZG5vdCA9IGR0ZEZpbGUuZmluZE5vdGF0aW9uKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCQlpZiAoZHRkbm90ID09IG51bGwpIHsKLQkJCWR0ZG5vdCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkbm90KTsKLQkJfQotCQlkdGRub3Quc2V0TmFtZShub3RhdGlvbi5nZXROb2RlTmFtZSgpKTsKLQotCQlpZiAobm90YXRpb24uZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldFN5c3RlbUlEKG5vdGF0aW9uLmdldFN5c3RlbUlkKCkpOwotCQlpZiAobm90YXRpb24uZ2V0UHVibGljSWQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldFB1YmxpY0lEKG5vdGF0aW9uLmdldFB1YmxpY0lkKCkpOwotCi0JCWlmIChub3RhdGlvbi5nZXRDb21tZW50KCkgIT0gbnVsbCkKLQkJCWR0ZG5vdC5zZXRDb21tZW50KG5vdGF0aW9uLmdldENvbW1lbnQoKSk7Ci0JCWlmIChub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2Uobm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZG5vdCk7Ci0JCX0KLQotCQlzdXBlci52aXNpdE5vdGF0aW9uRGVjbChub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCS8vIFRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLQkJLy8gQWRkIHRoZSBsaW5rIHRvIHRoZSByZWFsIGVudGl0eSB0aGF0IGl0IHJlZmVyZW5jZXMKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRSZWYgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKHBhcm1FbnRSZWYpOwotCi0JCVN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5vZGVOYW1lKCk7Ci0KLQkJLy8gQWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIERUREVudGl0eQotCQlEVERFbnRpdHkgZHRkZW50aXR5ID0gZ2V0RFRERmlsZSgpLmZpbmRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCWlmIChkdGRlbnRpdHkgIT0gbnVsbCkgewotCQkJcGFybUVudFJlZi5zZXRFbnRpdHkoZHRkZW50aXR5KTsKLQkJfQotCQlpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZGVudGl0eSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgUEUgcmVmZXJlbmNlOiAiICsgZGVjbE5hbWUpOwotCi0JCXN1cGVyLnZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbChlbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCURUREVudGl0eSBkdGRFbnRpdHkgPSBjcmVhdGVEVERFbnRpdHkoZW50aXR5KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgZW50aXR5OiAiICsgZGVjbE5hbWUpOwotCQlEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkJZHRkRW50aXR5LnNldENvbnRlbnQoZXh0RW50aXR5KTsKLQotCQlmaW5pc2hFeHRlcm5hbEVudGl0eShleHRFbnRpdHksIGVudGl0eSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGV4dCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkJaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0KLQkJCWR0ZFV0aWwuZ2V0UEVQb29sKCkucHV0KCIlIiArIGVudGl0eS5nZXROb2RlTmFtZSgpICsgIjsiLCBkdGRFbnRpdHkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRJbnRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCi0JCURUREludGVybmFsRW50aXR5IGludEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCQlkdGRFbnRpdHkuc2V0Q29udGVudChpbnRFbnRpdHkpOwotCQlpbnRFbnRpdHkuc2V0VmFsdWUoZW50aXR5LmdldFZhbHVlKCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBpbnQgZW50aXR5IHRvTW9mOiAiICk7Ci0JCWlmIChkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiICsgZW50aXR5LmdldE5vZGVOYW1lKCkgKyAiOyIsIGR0ZEVudGl0eSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJc3VwZXIudmlzaXRJbnRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChEVEQgZHRkLCBEVERGaWxlIGRGaWxlKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkQXR0TGlzdEFuZENvdGVudE1vZGVsIC0gZHRkOiIgKwotCQkvLyBkdGQuZ2V0TmFtZSgpKTsKLQkJRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBlID0gZW4ubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgRWxlbWVudERlY2wpIHsKLQkJCQlEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldCgoKEVsZW1lbnREZWNsKSBlKS5nZXROb2RlTmFtZSgpKTsKLQkJCQlpZiAoZHRkZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCWR0ZGVsZW1lbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudCgpOwotCQkJCQlkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZmluaXNoRWxlbWVudERlY2woZHRkZWxlbWVudCwgKEVsZW1lbnREZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBdHRsaXN0KSB7Ci0JCQkJcHJvY2Vzc0F0dExpc3QoKEF0dGxpc3QpIGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0F0dExpc3QoQXR0bGlzdCBhdHRMaXN0KSB7Ci0JCURUREVsZW1lbnQgZSA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCS8vIEVsZW1lbnQgaGFzIGJlZW4gYWRkZWQuIEFkZCB0aGUgYXR0cmlidXRlcwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgcHJvY2Vzc0F0dGxpc3QgLSBhZGRpbmcgQXR0bGlzdDoiICsKLQkJCS8vIGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQljcmVhdGVBdHRyaWJ1dGVzKGUsIGF0dExpc3QpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIhISEhISEhISEgZWxlbWVudCBpcyBudWxsICIpOwotCQl9Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgZmluaXNoaW5nIHRoZSBpbXBvcnQgb2YgYSBEVERFeHRlcm5hbEVudGl0eQotCS8vCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXZvaWQgZmluaXNoRXh0ZXJuYWxFbnRpdHkoRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LCBFbnRpdHlEZWNsIGVudGl0eURlY2wpIHsKLQkJdXBkYXRlU3lzdGVtSUQoZXh0RW50aXR5LCBlbnRpdHlEZWNsKTsKLQkJZXh0RW50aXR5LnNldFB1YmxpY0lEKGVudGl0eURlY2wuZ2V0UHVibGljSWQoKSk7Ci0KLQkJU3RyaW5nIG5vdGF0aW9uTmFtZSA9IGVudGl0eURlY2wuZ2V0Tm90YXRpb25OYW1lKCk7Ci0JCWlmIChub3RhdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJRFRETm90YXRpb24gZHRkTm90YXRpb24gPSBjcmVhdGVPckZpbmROb3RhdGlvbihleHRFbnRpdHksIG5vdGF0aW9uTmFtZSwgdHJ1ZSk7Ci0JCQlleHRFbnRpdHkuc2V0Tm90YXRpb24oZHRkTm90YXRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIERURE5vdGF0aW9uIGNyZWF0ZU9yRmluZE5vdGF0aW9uKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCURURE5vdGF0aW9uIGFOb3RhdGlvbiA9IGV4dEVudGl0eS5nZXREVERFbnRpdHkoKS5nZXREVERGaWxlKCkuZmluZE5vdGF0aW9uKG5hbWUpOwotCQlpZiAoYU5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBhTm90YXRpb247Ci0JCX0KLQotCQkvLwotCQkvLyBDcmVhdGUgYSBub3RhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZQotCQkvLwotCQlpZiAoY3JlYXRlKSB7Ci0JCQlhTm90YXRpb24gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRETm90YXRpb24oKTsKLQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGFOb3RhdGlvbik7Ci0JCQlhTm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gYU5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFRoZSBTeXN0ZW1JRCBhdHRyaWJ1dGUgaXMgc2V0IHRvIHdoYXRldmVyIHRoZSB1c2VyIGVudGVycyBlLmcuCi0JICogY29tL2libS9iMmIveG1pbW9kZWxzL3h4eC5kdGQueG1pCi0JICogCi0JICogSW4gdGhlIHVucGFyc2UoKSBtZXRob2QsIHBhcnNlIG91dCB0aGUgRFREIGZpbGUgbmFtZSBmcm9tIHRoZSBjbGFzc3BhdGgKLQkgKiBuYW1lLiBlLmcuIHJldHVybnMgeHh4LmR0ZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTeXN0ZW1JRChEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCQlTdHJpbmcgc3lzdGVtSWQgPSBlbnRpdHlEZWNsLmdldFN5c3RlbUlkKCk7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IGVudGl0eURlY2wuZ2V0UHVibGljSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJU3RyaW5nIHVyaSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShkdGQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJRXh0ZXJuYWxEVERNb2RlbCBlZCA9IGR0ZFV0aWwuZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsIHVyaSk7Ci0JCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCURUREZpbGUgcmVmZXJlbmNlRHRkRmlsZSA9IGVkLmdldEV4dGVybmFsRFRERmlsZSgpOwotCQkJCWV4dEVudGl0eS5zZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKHJlZmVyZW5jZUR0ZEZpbGUpOwotCQkJCWV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZW50aXR5RGVjbC5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKSB7Ci0JCQkJCUVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkJCQkJZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKERURENvcmVNZXNzYWdlcy5fRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRSArICIgJyIgKyBzeXN0ZW1JZCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWFkZEVycm9yTWVzc2FnZShkdGRFcnJvciwgZXh0RW50aXR5LmdldERUREVudGl0eSgpKTsKLQkJCQl9Ci0KLQkJCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoc3lzdGVtSWQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQkvLyBzZXQgdGhlIHN5c3RlbSBpZCB0byBiZSAiIgotCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIERUREVudGl0eSBjcmVhdGVEVERFbnRpdHkoRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJLy8gY3JlYXRlIGFuZCBkbyB3aGF0IHdlIGNhbiB0byBmaWxsIGluIHNvbWUgYmFzaWMgdGhpbmdzCi0JCURUREVudGl0eSBkdGRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5KCk7Ci0JCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZEVudGl0eSk7Ci0KLQkJZHRkRW50aXR5LnNldE5hbWUoZW50aXR5LmdldE5vZGVOYW1lKCkpOwotCQlkdGRFbnRpdHkuc2V0UGFyYW1ldGVyRW50aXR5KGVudGl0eS5pc1BhcmFtZXRlcigpKTsKLQkJaWYgKGVudGl0eS5nZXRDb21tZW50KCkgIT0gbnVsbCkgewotCQkJZHRkRW50aXR5LnNldENvbW1lbnQoZW50aXR5LmdldENvbW1lbnQoKSk7Ci0JCX0KLQkJaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpLCBkdGRFbnRpdHkpOwotCQl9Ci0KLQkJcmV0dXJuIGR0ZEVudGl0eTsKLQl9Ci0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLwotCS8vIE1ldGhvZHMgZm9yIGZpbmlzaGluZyB0aGUgaW1wb3J0IG9mIGEgRFRERWxlbWVudAotCS8vCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXB1YmxpYyB2b2lkIGZpbmlzaEVsZW1lbnREZWNsKERUREVsZW1lbnQgZHRkRWxlbWVudCwgRWxlbWVudERlY2wgZWQpIHsKLQkJZHRkRWxlbWVudC5zZXROYW1lKGVkLmdldE5vZGVOYW1lKCkpOwotCi0JCUNNTm9kZSBjbU5vZGUgPSBlZC5nZXRDb250ZW50TW9kZWxOb2RlKCk7Ci0KLQkJaWYgKGVkLmdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlkdGRFbGVtZW50LnNldENvbW1lbnQoZWQuZ2V0Q29tbWVudCgpKTsKLQkJfQotCQlpZiAoZWQuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJYWRkRXJyb3JNZXNzYWdlKGVkLmdldEVycm9yTWVzc2FnZSgpLCBkdGRFbGVtZW50KTsKLQkJfQotCi0JCWlmIChjbU5vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJQ01CYXNpY05vZGUgYm4gPSAoQ01CYXNpY05vZGUpIGNtTm9kZTsKLQkJCXN3aXRjaCAoYm4uZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBDTU5vZGVUeXBlLkVNUFRZIDoKLQkJCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBDTU5vZGVUeXBlLkFOWSA6Ci0JCQkJCURUREFueUNvbnRlbnQgYW55Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERBbnlDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChhbnlDb250ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNTm9kZVR5cGUuUENEQVRBIDoKLQkJCQkJRFREUENEYXRhQ29udGVudCBwY0RhdGEgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCQkJCQlkdGRFbGVtZW50LnNldENvbnRlbnQocGNEYXRhKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkgewotCQkJQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSkgY21Ob2RlOwotCQkJaWYgKHJuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpIHsKLQkJCQlTdHJpbmcgZW50aXR5TmFtZSA9IHJuLmdldE5hbWUoKS50cmltKCk7Ci0KLQkJCQlEVERFbnRpdHkgYW5FbnRpdHkgPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChlbnRpdHlOYW1lKTsKLQkJCQlpZiAoYW5FbnRpdHkgIT0gbnVsbCkgewotCQkJCQkvLwotCQkJCQkvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkJLy8gZWxlbWVudAotCQkJCQkvLwotCQkJCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJCQkJZW5SZWYuc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoYW5FbnRpdHkpOwotCi0JCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JCQkJCWVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlblJlZik7Ci0JCQkJfQotCQkJCWVsc2UgeyAvLyBjcmVhdGUgZGVmYXVsdCBjb250ZW50Ci0JCQkJCURUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vCi0JCQkJLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJCS8vIElmIHRoZSByZWFsIGVsZW1lbnQgZG9lcyBub3QgeWV0IGV4aXN0LCBjcmVhdGUgaXQKLQkJCQkvLwotCQkJCURUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGR0ZEVsZW1lbnQpOwotCi0JCQkJLy8KLQkJCQkvLyBDcmVhdGUgYW4gRFRERWxlbWVudFJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkCi0JCQkJLy8gZWxlbWVudAotCQkJCS8vCi0JCQkJRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbVJlZiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCQkJCWVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQotCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JCQkJZWxlbVJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJCS8vIHNldENvbnRlbnQgdG8gRFRERWxlbWVudFJlZmVyZW5jZQotCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlbGVtUmVmKTsKLQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQlDTUdyb3VwTm9kZSBncnBOb2RlID0gKENNR3JvdXBOb2RlKSBjbU5vZGU7Ci0JCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCQkJRFRER3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChncnBOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JCQlncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShncnBOb2RlKSk7Ci0JCQlncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCS8vIGp1c3QgdXNlIHRoZSBsb2NhdG9yIGZvciB0aGUgZWxlbWVudCBhcyB0aGUgY2xvc2VzdCBndWVzcwotCQkJcHJvY2Vzc0dyb3VwQ29udGVudChncm91cENvbnRlbnQsIGdycE5vZGUpOwotCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGdyb3VwQ29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlID09IG51bGwpIHsKLQkJCS8vIGJhZCB0aGluZyBoYXBwZW5lZCBoZXJlLCBqdXN0IGNyZWF0ZSBhIHBjZGF0YQotCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCQl9Ci0KLQotCX0KLQotCi0JLyoqCi0JICogQWRkIGEgbmV3IGdyb3VwIHRvIHRoZSBjdXJyZW50IGdyb3VwCi0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IG5vZGUgZm9yIHRoaXMgZ3JvdXAgZWxlbWVudAotCSAqIEBwYXJhbSBvcDFOb2RlIC0KLQkgKiAgICAgICAgICAgIHRoZSBncm91cCBlLmcuIChhLGIpCi0JICogQHBhcmFtIG9wMk5vZGUgLQotCSAqICAgICAgICAgICAgc2V0IG9ubHkgaWYgY2FsbGVkIGJ5IHByb2Nlc3NDTTFvcCBlLmcuIChhLGIpKwotCSAqLwotCXZvaWQgcHJvY2Vzc0dyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgcGFyZW50LCBDTUdyb3VwTm9kZSBncnBOb2RlKSB7Ci0JCUVudW1lcmF0aW9uIGNoaWxkcmVuID0gZ3JwTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRzKCk7Ci0JCURUREZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLQkJd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlDTU5vZGUgY25vZGUgPSAoQ01Ob2RlKSBjaGlsZHJlbi5uZXh0RWxlbWVudCgpOwotCi0JCQlpZiAoY25vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJCUNNR3JvdXBOb2RlIGdOb2RlID0gKENNR3JvdXBOb2RlKSBjbm9kZTsKLQkJCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZmFjdG9yeS5jcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQkJCQlEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JCQkJZ3JvdXBDb250ZW50LnNldEdyb3VwS2luZChncm91cEtpbmQpOwotCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdOb2RlKSk7Ci0JCQkJZ3JvdXBDb250ZW50LnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZ3JvdXBDb250ZW50KTsKLQkJCQlwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ05vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCUNNQmFzaWNOb2RlIG4gPSAoQ01CYXNpY05vZGUpIGNub2RlOwotCQkJCWlmIChuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLlBDREFUQSkgewotCQkJCQkvLyBDcmVhdGUgYSBEVERQQ0RhdGFDb250ZW50IGZvciBhIGxlYWYgUENEYXRhIG5vZGUKLQkJCQkJLy8KLQkJCQkJRFREUENEYXRhQ29udGVudCBwY0RhdGEgPSBmYWN0b3J5LmNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKTsKLQkJCQkJLy8gQWRkICNQQ0RBVEEgdG8gdGhlIEdyb3VwLCBpLmUgTWl4ZWQgY29udGVudCBtb2RlbAotCQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChwY0RhdGEpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGNub2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKSB7Ci0JCQkJQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSkgY25vZGU7Ci0JCQkJaWYgKHJuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ00gRWxlbWVudCBSZWYgbmFtZTogIiArCi0JCQkJCS8vIHJuLmdldE5hbWUoKSk7Ci0JCQkJCS8vCi0JCQkJCS8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkJLy8gZWxlbWVudAotCQkJCQkvLwotCQkJCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0gZmFjdG9yeS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCi0JCQkJCS8vCi0JCQkJCS8vIEZpbmQgdGhlIHJlYWwgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHJlZmVyZW5jZXMKLQkJCQkJLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCQkJCQkvLwotCQkJCQlEVERFbGVtZW50IGFuRWxlbWVudCA9IGNyZWF0ZU9yRmluZEVsZW1lbnQocm4uZ2V0TmFtZSgpLCBlbGVtUmVmKTsKLQotCQkJCQllbGVtUmVmLnNldFJlZmVyZW5jZWRFbGVtZW50KGFuRWxlbWVudCk7Ci0KLQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJZWxlbVJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJCQkvLyBBZGQgRFRERWxlbWVudFJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkJCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZWxlbVJlZik7Ci0JCQkJfQotCQkJCWVsc2UgLy8gUEUgUmVmZXJlbmNlCi0JCQkJewotCQkJCQlTdHJpbmcgZW50aXR5TmFtZSA9IHJuLmdldE5hbWUoKS50cmltKCk7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBQRSBSZWYgbmFtZTogIiArIGVudGl0eU5hbWUpOwotCQkJCQlEVERFbnRpdHkgYW5FbnRpdHkgPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChlbnRpdHlOYW1lKTsKLQkJCQkJaWYgKGFuRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJCS8vCi0JCQkJCQkvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkJCS8vIGVsZW1lbnQKLQkJCQkJCS8vCi0JCQkJCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0gZmFjdG9yeS5jcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JCQkJCQllblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0KLQkJCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JCQkJCQllblJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJCQkJLy8gQWRkIERUREVudGl0eVJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkJCQkJCXBhcmVudC5nZXRDb250ZW50KCkuYWRkKGVuUmVmKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgcmVhbCBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBEVERFbGVtZW50IGNyZWF0ZU9yRmluZEVsZW1lbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopIHsKLQkJLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IGdldERUREZpbGUoKS5maW5kRWxlbWVudChuYW1lKTsKLQotCQlEVERFbGVtZW50IGFFbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQobmFtZSk7Ci0KLQkJaWYgKGFFbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBhRWxlbWVudDsKLQkJfQotCi0JCVN0cmluZyBlcnJvck1zZyA9IERURENvcmVNZXNzYWdlcy5fRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzE7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JNc2cgKz0gIlwiIiArIG5hbWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXJyb3JNc2cgKz0gRFREQ29yZU1lc3NhZ2VzLl9VSV9FUlJPUlBBUlRfVU5ERUNMQVJFRF9FTEVNRU5UXzI7IC8vJE5PTi1OTFMtMSQKLQotCQlFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0KLQkJZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkJYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBvYmopOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3JNc2cpOwotCQkvLyBzZXREVERFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCQlnZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQotCQkvLwotCQkvLyBDcmVhdGUgYW4gZW1wdHkgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSB0byBtYWtlIGl0IHZhbGlkCi0JCS8vCi0KLQkJRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQlEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnQoKTsKLQkJZHRkZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCi0JCURUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQlkdGRlbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQotCQlnZXREVERGaWxlKCkuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQlkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KG5hbWUsIGR0ZGVsZW1lbnQpOwotCQlyZXR1cm4gZHRkZWxlbWVudDsKLQl9Ci0KLQotCS8qKgotCSAqIENvbXB1dGUgdGhlIE1PRiBvY2N1cnJlbmNlIGZyb20gdGhlIHhtbDRqIG9jY3VycmVuY2UKLQkgKi8KLQlwcml2YXRlIGludCBjb21wdXRlTW9mT2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlIHJub2RlKSB7Ci0JCWludCBvY2N1cnJlbmNlID0gcm5vZGUuZ2V0T2NjdXJyZW5jZSgpOwotCQlpbnQgbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkU7Ci0KLQkJaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpIHsKLQkJCW1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFOwotCQl9Ci0JCWVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkVfT1JfTU9SRTsKLQkJfQotCQllbHNlIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuT1BUSU9OQUwpIHsKLQkJCW1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUw7Ci0JCX0KLQkJcmV0dXJuIG1vZm9jY3VyOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgdGhlIE1PRiBtb2RlbCBncm91cCBmcm9tIHRoZSB4bWw0aiBtb2RlbCBncm91cAotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVNb2ZHcm91cEtpbmQoaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpIHsKLQkJCXJldHVybiBEVERHcm91cEtpbmQuQ0hPSUNFOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIERUREdyb3VwS2luZC5TRVFVRU5DRTsKLQkJfQotCX0KLQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgY3JlYXRpbmcgdGhlIGF0dHJpYnV0ZXMgb2YgYSBEVERFbGVtZW50Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JcHVibGljIHZvaWQgY3JlYXRlQXR0cmlidXRlcyhEVERFbGVtZW50IGVsZW1lbnQsIEF0dGxpc3QgYXR0TGlzdCkgewotCQlpZiAoYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKSwgZWxlbWVudCk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUF0dE5vZGUgYWQgPSBhdHRMaXN0LmVsZW1lbnRBdChpKTsKLQkJCS8vIERUREF0dHJpYnV0ZUVsZW1lbnQgZHRkQXR0PQotCQkJLy8gZ2V0RFREQXR0cmlidXRlRWxlbWVudChhLmdldE5hbWUoKSk7Ci0KLQkJCS8vIG9ubHkgYWRkIHRoZSBBdHREZWYgaWYgaXQgaXMgbm90IGFkZGVkIHlldAotCQkJLy8gaWdub3JlIHRoZSBkdXAgQXR0RGVmIGFzIGRvY3VtZW50ZWQgaW4gdGhlIFhNTCAxLjAgc3BlY3MKLQkJCS8vIGlmKCBkdGRBdHQ9PW51bGwpCi0JCQlhZGRBdHRyaWJ1dGUoZWxlbWVudCwgYWQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBEVERBdHRyaWJ1dGUgZnJvbSB0aGUgeG1sNGogYXR0cmlidXRlCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKERUREVsZW1lbnQgZHRkZWxlbWVudCwgQXR0Tm9kZSBhZCkgewotCQlEVERBdHRyaWJ1dGUgZHRkYXR0ciA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERBdHRyaWJ1dGUoKTsKLQkJZHRkZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKS5hZGQoZHRkYXR0cik7Ci0JCWZpbmlzaEF0dHJpYnV0ZShkdGRhdHRyLCBhZCk7Ci0JfQotCi0JLy8gU3R1ZmYgZm9yIHBvcHVsYXRpbmcgYXR0cmlidXRlCi0JcHVibGljIHZvaWQgZmluaXNoQXR0cmlidXRlKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZikgewotCQlib29sZWFuIHBhcnNlRXJyb3IgPSBmYWxzZTsKLQotCQlpZiAoYXR0ZGVmLm5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwZU5hbWUgPSBhdHRkZWYubmFtZS50cmltKCk7Ci0JCQlEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCQkJaWYgKGVuICE9IG51bGwpIHsKLQkJCQlkdGRhdHRyLnNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KGVuKTsKLQkJCX0KLQkJfQotCi0JCWR0ZGF0dHIuc2V0TmFtZShhdHRkZWYubmFtZSk7Ci0KLQkJaW50IGF0dHJUeXBlID0gYXR0ZGVmLmdldERlY2xhcmVkVHlwZSgpOwotCi0JCWlmIChhdHRyVHlwZSA9PSBBdHROb2RlLlBFUkVGRVJFTkNFICYmIGF0dGRlZi50eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBwZU5hbWUgPSBhdHRkZWYudHlwZS50cmltKCk7Ci0JCQlEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCQkJaWYgKGVuICE9IG51bGwpIHsKLQkJCQlkdGRhdHRyLnNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KGVuKTsKLQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOyAvLyBoYWNrLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzbwotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZ2V0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJhY2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWUKLQkJCX0KLQkJCWVsc2UKLQkJCQkvLyBzZXQgZGVmYXVsdCB0eXBlCi0JCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQotCQl9Ci0JCWVsc2UgewotCQkJc3dpdGNoIChhdHRyVHlwZSkgewotCQkJCWNhc2UgQXR0Tm9kZS5DREFUQSA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLkVOVElUSUVTIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9FTlRJVElFUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5USVRZIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9FTlRJVFkoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLklEIDoKLQkJCQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBJRCBhdHRyaWJ1dGUKLQkJCQkJaWYgKGhhc0lEQXR0cmlidXRlKGR0ZGF0dHIpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9EVVBfSURfQVRUUklCVVRFXzE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVyck1zZyArPSBhdHRkZWYubmFtZSArIERURENvcmVNZXNzYWdlcy5fVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0SUVsZW1lbnQoKS5zZXREVERFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkJCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCQkJCQkJcGFyc2VFcnJvciA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9JRCgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuSURSRUYgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5JRFJFRlMgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5VTUVSQVRJT04gOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBjcmVhdGVEVERFbnVtZXJhdGlvbihkdGRhdHRyLCBhdHRkZWYsIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OT1RBVElPTiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OTVRPS0VOIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OTVRPS0VOUyA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdCA6Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIidVbmtub3duCi0JCQkvLyB0eXBlLi4uIiArIGF0dHJUeXBlKTsKLQkJCX0KLQkJfQotCi0JCWludCBhdHRyRGVmYXVsdCA9IGF0dGRlZi5nZXREZWZhdWx0VHlwZSgpOwotCQlpbnQgZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEOwotCQlzd2l0Y2ggKGF0dHJEZWZhdWx0KSB7Ci0JCQljYXNlIEF0dE5vZGUuRklYRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuRklYRUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQXR0Tm9kZS5JTVBMSUVEIDoKLQkJCQlkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQXR0Tm9kZS5SRVFVSVJFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLk5PRklYRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuTk9GSVhFRDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJyBVbmtub3duIGRlZmF1bHQKLQkJLy8gdHlwZS4uLiAiICsgYXR0ckRlZmF1bHQpOwotCQl9Ci0KLQkJRFRERGVmYXVsdEtpbmQgZGVmYXVsdEtpbmRPYmogPSBEVEREZWZhdWx0S2luZC5nZXQoZGVmYXVsdEtpbmQpOwotCQlkdGRhdHRyLnNldERlZmF1bHRLaW5kKGRlZmF1bHRLaW5kT2JqKTsKLQotCQlpZiAocGFyc2VFcnJvcikgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dGRlZi5kZWZhdWx0VmFsdWU7Ci0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gfHwgYXR0clR5cGUgPT0gQXR0Tm9kZS5OT1RBVElPTikgewotCQkJCWlmICghaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoYXR0ZGVmLCBkZWZhdWx0VmFsdWUpKSB7Ci0JCQkJCVN0cmluZyB0eXBlU3RyaW5nID0gKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gPyAiZW51bWVyYXRpb24iIDogIm5vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlTdHJpbmcgZXJyTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xOyAvLyROT04tTkxTLTEkCi0JCQkJCWVyck1zZyArPSB0eXBlU3RyaW5nICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9FUlJPUlBBUlRfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMjsgLy8kTk9OLU5MUy0xJAotCQkJCQllcnJNc2cgKz0gYXR0ZGVmLm5hbWUgKyAiJyI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCQkJCQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWR0ZGF0dHIuc2V0RGVmYXVsdFZhbHVlU3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nICIgKwotCQkvLyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQXR0ciAtIHRvTW9mIGdldERlZmF1bHRWYWx1ZTogIiArCi0JCS8vIGdldERlZmF1bHRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgZHRkYXR0cikgewotCQlib29sZWFuIGhhc0lEID0gZmFsc2U7Ci0KLQkJRFRERWxlbWVudCBlbGVtZW50ID0gZHRkYXR0ci5nZXREVERFbGVtZW50KCk7Ci0JCUVMaXN0IGF0dHJzID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKTsKLQotCQlJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlEVERBdHRyaWJ1dGUgYXR0ciA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCQkJRFREVHlwZSBkVHlwZSA9IGF0dHIuZ2V0RFREVHlwZSgpOwotCQkJaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaWYgKCgoRFREQmFzaWNUeXBlKSBkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gRFREQmFzaWNUeXBlS2luZC5JRCkgewotCQkJCQloYXNJRCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzSUQ7Ci0JfQotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZSBlbnVtZXJhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JCWVudW1lcmF0aW9uLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCWlmIChlbnVtVmFsdWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCUVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCQkJCS8vIGVudW1WYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKGVudW1WYWx1ZXNbaV0pOwotCQkJCWVudW1MaXRlcmFsLnNldE5hbWUoZW51bVZhbHVlc1tpXSk7Ci0KLQkJCQkvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSk7Ci0JCQkJZW51bWVyYXRpb24uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkJCX0KLQkJfQotCQlkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW1lcmF0aW9uKTsKLQkJcmV0dXJuIGVudW1lcmF0aW9uOwotCX0KLQotCXByaXZhdGUgRUVudW1MaXRlcmFsIGNyZWF0ZUVFbnVtTGl0ZXJhbCgpIHsKLQkJRWNvcmVQYWNrYWdlIGVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCQkvLyBNT0YyRU1GIFBvcnQKLQkJLy8gcmV0dXJuICgoRWNvcmVGYWN0b3J5KWVQYWNrYWdlLmdldEZhY3RvcnkoKSkuY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCXJldHVybiBlUGFja2FnZS5nZXRFY29yZUZhY3RvcnkoKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQl9Ci0KLQlwcml2YXRlIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgQXR0Tm9kZSBhdHRkZWYsIGludCBlbnVtS2luZCkgewotCQlEVERFbnVtZXJhdGlvblR5cGUgZW51bWVyYXRpb24gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JCURUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCQllbnVtZXJhdGlvbi5zZXRLaW5kKGdyb3VwS2luZCk7Ci0JCWR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bWVyYXRpb24pOwotCi0JCS8vIEVudW1lcmF0aW9uIHZhbHVlcwotCQlFbnVtZXJhdGlvbiB0b2tlbkl0ZXIgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkJaWYgKHRva2VuSXRlciAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodG9rZW5JdGVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIHZhbCA9IChTdHJpbmcpIHRva2VuSXRlci5uZXh0RWxlbWVudCgpOwotCQkJCUVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCQkJCS8vIGVudW1MaXRlcmFsLnNldFhNSURvY3VtZW50KGR0ZGF0dHIuZ2V0WE1JRG9jdW1lbnQoKSk7Ci0JCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkJLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbCh2YWwpOwotCQkJCWVudW1MaXRlcmFsLnNldE5hbWUodmFsKTsKLQotCi0JCQkJLy8gZW51bUxpdGVyYWwuc2V0TnVtYmVyKGkrKyk7Ci0JCQkJZW51bWVyYXRpb24uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbnVtZXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoQXR0Tm9kZSBhdHRkZWYsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQlib29sZWFuIGNvbnRhaW5zUGVyY2VudCA9IGZhbHNlOwotCi0JCS8vIEVudW1lcmF0aW9uIHZhbHVlcwotCQlFbnVtZXJhdGlvbiBlbnVtVmFsdWVzID0gYXR0ZGVmLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbnVtVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgdmFsID0gKFN0cmluZykgZW51bVZhbHVlcy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHZhbC5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgewotCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICh2YWwuaW5kZXhPZignJScpID49IDApIHsKLQkJCQljb250YWluc1BlcmNlbnQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZCB8fCBjb250YWluc1BlcmNlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ckRURFR5cGUoRFREQXR0cmlidXRlIGR0ZGF0dHIsIERURFR5cGUgdHlwZSkgewotCQlkdGRhdHRyLnNldERURFR5cGUodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JNZXNzYWdlKEVycm9yTWVzc2FnZSBlcnJNc2csIE9iamVjdCBvYmopIHsKLQkJZXJyTXNnLnNldE9iamVjdChvYmopOwotCQlkdGRVdGlsLmFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCX0KLQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZhY3RvcnlJbXBsIGdldEZhY3RvcnlHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gKERUREZhY3RvcnlJbXBsKWR0ZFV0aWwuZ2V0RmFjdG9yeSgpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERGaWxlIGdldERUREZpbGVHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREdlbihEVEQgZHRkKSB7Ci0JLy8KLQkvLyBzdXBlci52aXNpdERURChkdGQpOwotCS8vCi0JLy8KLQkvLyAvLyAtIDJuZCBwYXNzIC0KLQkvLyAvLyBkbyBmaW5hbCBwcm9jZXNzaW5nIGZvciBBdHRsaXN0cyBhbmQgYWRkaW5nIGNvbnRlbnRNb2RlbAotCS8vIGFkZEF0dGxpc3RBbmRDb250ZW50TW9kZWwoZHRkLGR0ZEZpbGUpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RWxlbWVudERlY2xHZW4oRWxlbWVudERlY2wgZWxlbWVudCkgewotCS8vCi0JLy8gLy8gRWxlbWVudCBtaWdodCBoYXZlIGJlZW4gYWRkZWQgZWFybGllciBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQKLQkvLyBTdHJpbmcgZGVjbE5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCkgOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbDoiICsgZGVjbE5hbWUgKTsKLQkvLyBEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSAoRFRERWxlbWVudCkKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KGRlY2xOYW1lKTsKLQkvLyBpZiAoZHRkZWxlbWVudCA9PSBudWxsKQotCS8vIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2wgLSBub3QgZm91bmQgLSBjcmVhdGUiICk7Ci0JLy8gZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkZWxlbWVudC5zZXROYW1lKGRlY2xOYW1lKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KGRlY2xOYW1lLGR0ZGVsZW1lbnQpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRFbGVtZW50RGVjbChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbEdlbihOb3RhdGlvbkRlY2wgbm90YXRpb24pIHsKLQkvLwotCS8vIC8vIE5vdGF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCS8vIC8vIGJ5IGFuIGVudGl0eQotCS8vIERURE5vdGF0aW9uIGR0ZG5vdCA9IGR0ZEZpbGUuZmluZE5vdGF0aW9uKCBub3RhdGlvbi5nZXROb2RlTmFtZSgpICk7Ci0JLy8gaWYgKGR0ZG5vdCA9PSBudWxsKQotCS8vIHsKLQkvLyBkdGRub3QgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRETm90YXRpb24oKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRub3QpOwotCS8vIH0KLQkvLyBkdGRub3Quc2V0TmFtZShub3RhdGlvbi5nZXROb2RlTmFtZSgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKG5vdGF0aW9uLmdldFN5c3RlbUlkKCkhPSBudWxsICkKLQkvLyBkdGRub3Quc2V0U3lzdGVtSUQobm90YXRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JLy8gaWYgKG5vdGF0aW9uLmdldFB1YmxpY0lkKCkhPSBudWxsICkKLQkvLyBkdGRub3Quc2V0UHVibGljSUQobm90YXRpb24uZ2V0UHVibGljSWQoKSk7Ci0JLy8KLQkvLwotCS8vIGlmIChub3RhdGlvbi5nZXRDb21tZW50KCkhPW51bGwpCi0JLy8gZHRkbm90LnNldENvbW1lbnQobm90YXRpb24uZ2V0Q29tbWVudCgpKTsKLQkvLyBpZiAobm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkbm90KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHN1cGVyLnZpc2l0Tm90YXRpb25EZWNsKG5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2xHZW4oRW50aXR5RGVjbCBlbnRpdHkpCi0JLy8gewotCS8vCi0JLy8gLy8gVGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlLgotCS8vIC8vIEFkZCB0aGUgbGluayB0byB0aGUgcmVhbCBlbnRpdHkgdGhhdCBpdCByZWZlcmVuY2VzCi0JLy8gRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRSZWYgPQotCS8vIGdldEZhY3RvcnkoKS5jcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChwYXJtRW50UmVmKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0Tm9kZU5hbWUoKTsKLQkvLwotCS8vCi0JLy8gLy8gQWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIERUREVudGl0eQotCS8vIERUREVudGl0eSBkdGRlbnRpdHkgPSBnZXREVERGaWxlKCkuZmluZEVudGl0eShlbnRpdHlOYW1lKTsKLQkvLyBpZiAoZHRkZW50aXR5ICE9IG51bGwpCi0JLy8gewotCS8vIHBhcm1FbnRSZWYuc2V0RW50aXR5KGR0ZGVudGl0eSk7Ci0JLy8gfQotCS8vIGlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZGVudGl0eSk7Ci0JLy8gfQotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIFBFIHJlZmVyZW5jZTogIiArIGRlY2xOYW1lKTsKLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKGVudGl0eSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlcm5hbEVudGl0eURlY2xHZW4oRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkvLwotCS8vIERUREVudGl0eSBkdGRFbnRpdHkgPSBjcmVhdGVEVERFbnRpdHkoZW50aXR5KTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBlbnRpdHk6ICIgKyBkZWNsTmFtZSk7Ci0JLy8gRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREV4dGVybmFsRW50aXR5KCk7Ci0JLy8gZHRkRW50aXR5LnNldENvbnRlbnQoZXh0RW50aXR5KTsKLQkvLwotCS8vCi0JLy8gZmluaXNoRXh0ZXJuYWxFbnRpdHkoZXh0RW50aXR5LCBlbnRpdHkpOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGV4dCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkvLyBpZiAoZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JLy8gewotCS8vCi0JLy8KLQkvLyBkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIrZW50aXR5LmdldE5vZGVOYW1lKCkrIjsiLCBkdGRFbnRpdHkpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdEludGVybmFsRW50aXR5RGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkgewotCS8vCi0JLy8gRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCS8vCi0JLy8KLQkvLyBEVERJbnRlcm5hbEVudGl0eSBpbnRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQkvLyBkdGRFbnRpdHkuc2V0Q29udGVudChpbnRFbnRpdHkpOwotCS8vIGludEVudGl0eS5zZXRWYWx1ZShlbnRpdHkuZ2V0VmFsdWUoKSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIgaW50IGVudGl0eSB0b01vZjogIiApOwotCS8vIGlmIChkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8gZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiK2VudGl0eS5nZXROb2RlTmFtZSgpKyI7IiwgZHRkRW50aXR5KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHN1cGVyLnZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbEdlbihEVEQgZHRkLCBEVERGaWxlIGRGaWxlKSB7Ci0JLy8KLQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkQXR0TGlzdEFuZENvdGVudE1vZGVsIC0gZHRkOiIgKwotCS8vIGR0ZC5nZXROYW1lKCkpOwotCS8vIEVudW1lcmF0aW9uIGVuID0gZHRkLmV4dGVybmFsRWxlbWVudHMoKTsKLQkvLyB3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIE9iamVjdCBlID0gZW4ubmV4dEVsZW1lbnQoKTsKLQkvLyBpZiAoIGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCApCi0JLy8gewotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KAotCS8vICgoRWxlbWVudERlY2wpZSkuZ2V0Tm9kZU5hbWUoKSApOwotCS8vIGlmIChkdGRlbGVtZW50ID09IG51bGwpCi0JLy8gewotCS8vIGR0ZGVsZW1lbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudCgpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCS8vIH0KLQkvLyBmaW5pc2hFbGVtZW50RGVjbChkdGRlbGVtZW50LCAoRWxlbWVudERlY2wpIGUpOwotCS8vIH0KLQkvLyBlbHNlIGlmICggZSBpbnN0YW5jZW9mIEF0dGxpc3QgKQotCS8vIHsKLQkvLyBwcm9jZXNzQXR0TGlzdCgoQXR0bGlzdCkgZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQXR0TGlzdEdlbihBdHRsaXN0IGF0dExpc3QpIHsKLQkvLwotCS8vIERUREVsZW1lbnQgZSA9IChEVERFbGVtZW50KQotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkvLyBpZiAoIGUgIT0gbnVsbCApCi0JLy8gewotCS8vIC8vIEVsZW1lbnQgaGFzIGJlZW4gYWRkZWQuIEFkZCB0aGUgYXR0cmlidXRlcwotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCIgcHJvY2Vzc0F0dGxpc3QgLSBhZGRpbmcgQXR0bGlzdDoiICsKLQkvLyBhdHRMaXN0LmdldE5vZGVOYW1lKCkpOwotCS8vIGNyZWF0ZUF0dHJpYnV0ZXMoZSwgYXR0TGlzdCk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oIiEhISEhISEhISBlbGVtZW50IGlzIG51bGwgIik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGZpbmlzaEV4dGVybmFsRW50aXR5R2VuKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwKLQkvLyBFbnRpdHlEZWNsIGVudGl0eURlY2wpIHsKLQkvLwotCS8vIHVwZGF0ZVN5c3RlbUlEKGV4dEVudGl0eSwgZW50aXR5RGVjbCk7Ci0JLy8gZXh0RW50aXR5LnNldFB1YmxpY0lEKGVudGl0eURlY2wuZ2V0UHVibGljSWQoKSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBub3RhdGlvbk5hbWUgPSBlbnRpdHlEZWNsLmdldE5vdGF0aW9uTmFtZSgpOwotCS8vIGlmIChub3RhdGlvbk5hbWUgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gRFRETm90YXRpb24gZHRkTm90YXRpb24gPSBjcmVhdGVPckZpbmROb3RhdGlvbihleHRFbnRpdHksCi0JLy8gbm90YXRpb25OYW1lLHRydWUpOwotCS8vIGV4dEVudGl0eS5zZXROb3RhdGlvbihkdGROb3RhdGlvbik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVEROb3RhdGlvbiBjcmVhdGVPckZpbmROb3RhdGlvbkdlbihEVERFeHRlcm5hbEVudGl0eQotCS8vIGV4dEVudGl0eSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JLy8KLQkvLyBEVEROb3RhdGlvbiBhTm90YXRpb24gPQotCS8vIGV4dEVudGl0eS5nZXREVERFbnRpdHkoKS5nZXREVERGaWxlKCkuZmluZE5vdGF0aW9uKG5hbWUpOwotCS8vIGlmIChhTm90YXRpb24gIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGFOb3RhdGlvbjsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGEgbm90YXRpb24gZm9yIHRoZSByZWZlcmVuY2UKLQkvLyAvLwotCS8vIGlmIChjcmVhdGUpCi0JLy8gewotCS8vIGFOb3RhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGFOb3RhdGlvbik7Ci0JLy8gYU5vdGF0aW9uLnNldE5hbWUobmFtZSk7Ci0JLy8gfQotCS8vIHJldHVybiBhTm90YXRpb247Ci0JLy8gfQotCS8vIC8qKgotCS8vICogVGhlIFN5c3RlbUlEIGF0dHJpYnV0ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgdGhlIHVzZXIgZW50ZXJzCi0JLy8gKiBlLmcuIGNvbS9pYm0vYjJiL3htaW1vZGVscy94eHguZHRkLnhtaQotCS8vICoKLQkvLyAqIEluIHRoZSB1bnBhcnNlKCkgbWV0aG9kLCBwYXJzZSBvdXQgdGhlIERURCBmaWxlIG5hbWUgZnJvbQotCS8vICogdGhlIGNsYXNzcGF0aCBuYW1lLgotCS8vICogZS5nLiByZXR1cm5zIHh4eC5kdGQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN5c3RlbUlER2VuKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwKLQkvLyBFbnRpdHlEZWNsIGVudGl0eURlY2wpIHsKLQkvLwotCS8vIFN0cmluZyBzeXN0ZW1JZCA9IGVudGl0eURlY2wuZ2V0U3lzdGVtSWQoKTsKLQkvLyBTdHJpbmcgcHVibGljSWQgPSBlbnRpdHlEZWNsLmdldFB1YmxpY0lkKCk7Ci0JLy8gaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JLy8gewotCS8vIElkUmVzb2x2ZXIgaWRSZXNvbHZlciA9IG5ldyBJZFJlc29sdmVySW1wbChkdGQuZ2V0TmFtZSgpKTsKLQkvLyBTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlSWQocHVibGljSWQsIHN5c3RlbUlkKTsKLQkvLyBFeHRlcm5hbERURE1vZGVsIGVkID0gZHRkVXRpbC5nZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgdXJpKTsKLQkvLyBpZiAoZWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gRFRERmlsZSByZWZlcmVuY2VEdGRGaWxlID0gZWQuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JLy8gZXh0RW50aXR5LnNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUocmVmZXJlbmNlRHRkRmlsZSk7Ci0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBpZiAoZW50aXR5RGVjbC5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKQotCS8vIHsKLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFIikKLQkvLyArICIgJyIgKyBzeXN0ZW1JZCArICInIik7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBleHRFbnRpdHkuZ2V0RFRERW50aXR5KCkpOwotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JLy8gewotCS8vIGV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZQotCS8vIHsKLQkvLyAvLyBzZXQgdGhlIHN5c3RlbSBpZCB0byBiZSAiIgotCS8vIGV4dEVudGl0eS5zZXRTeXN0ZW1JRCgiIik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnRpdHkgY3JlYXRlRFRERW50aXR5R2VuKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JLy8KLQkvLyAvLyBjcmVhdGUgYW5kIGRvIHdoYXQgd2UgY2FuIHRvIGZpbGwgaW4gc29tZSBiYXNpYyB0aGluZ3MKLQkvLyBEVERFbnRpdHkgZHRkRW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudGl0eSgpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZEVudGl0eSk7Ci0JLy8KLQkvLwotCS8vIGR0ZEVudGl0eS5zZXROYW1lKGVudGl0eS5nZXROb2RlTmFtZSgpKTsKLQkvLyBkdGRFbnRpdHkuc2V0UGFyYW1ldGVyRW50aXR5KGVudGl0eS5pc1BhcmFtZXRlcigpKTsKLQkvLyBpZiAoZW50aXR5LmdldENvbW1lbnQoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gZHRkRW50aXR5LnNldENvbW1lbnQoZW50aXR5LmdldENvbW1lbnQoKSk7Ci0JLy8gfQotCS8vIGlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVudGl0eSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyByZXR1cm4gZHRkRW50aXR5OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGZpbmlzaEVsZW1lbnREZWNsR2VuKERUREVsZW1lbnQgZHRkRWxlbWVudCwgRWxlbWVudERlY2wKLQkvLyBlZCkgewotCS8vCi0JLy8gZHRkRWxlbWVudC5zZXROYW1lKGVkLmdldE5vZGVOYW1lKCkpOwotCS8vCi0JLy8KLQkvLyBDTU5vZGUgY21Ob2RlID0gZWQuZ2V0Q29udGVudE1vZGVsTm9kZSgpOwotCS8vCi0JLy8KLQkvLyBpZiAoZWQuZ2V0Q29tbWVudCgpIT1udWxsKQotCS8vIHsKLQkvLyBkdGRFbGVtZW50LnNldENvbW1lbnQoZWQuZ2V0Q29tbWVudCgpKTsKLQkvLyB9Ci0JLy8gaWYgKGVkLmdldEVycm9yTWVzc2FnZSgpIT1udWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZWQuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVsZW1lbnQpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKQotCS8vIHsKLQkvLyBDTUJhc2ljTm9kZSBibiA9IChDTUJhc2ljTm9kZSljbU5vZGU7Ci0JLy8gc3dpdGNoIChibi5nZXRUeXBlKCkpCi0JLy8gewotCS8vIGNhc2UgQ01Ob2RlVHlwZS5FTVBUWSA6Ci0JLy8gRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBDTU5vZGVUeXBlLkFOWSA6Ci0JLy8gRFREQW55Q29udGVudCBhbnlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoYW55Q29udGVudCk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQ01Ob2RlVHlwZS5QQ0RBVEE6Ci0JLy8gRFREUENEYXRhQ29udGVudCBwY0RhdGEgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChwY0RhdGEpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gfQotCS8vIGVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkKLQkvLyB7Ci0JLy8gQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSkgY21Ob2RlOwotCS8vIGlmIChybi5nZXRUeXBlKCkgPT0gQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKQotCS8vIHsKLQkvLyBTdHJpbmcgZW50aXR5TmFtZSA9IHJuLmdldE5hbWUoKS50cmltKCk7Ci0JLy8KLQkvLwotCS8vIERUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCS8vIGlmIChhbkVudGl0eSE9bnVsbCkKLQkvLyB7Ci0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQgZWxlbWVudAotCS8vIC8vCi0JLy8gRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlblJlZiA9Ci0JLy8gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLyBlblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0JLy8KLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JLy8gZW5SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZW5SZWYpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8geyAvLyBjcmVhdGUgZGVmYXVsdCBjb250ZW50Ci0JLy8gRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy8KLQkvLyAvLyBGaW5kIHRoZSByZWFsIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCByZWZlcmVuY2VzCi0JLy8gLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCS8vIC8vCi0JLy8gRFRERWxlbWVudCBhbkVsZW1lbnQgPSBjcmVhdGVPckZpbmRFbGVtZW50KHJuLmdldE5hbWUoKSwgZHRkRWxlbWVudCk7Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0KLQkvLyBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLyBlbGVtUmVmLnNldFJlZmVyZW5jZWRFbGVtZW50KGFuRWxlbWVudCk7Ci0JLy8KLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JLy8gZWxlbVJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIC8vIHNldENvbnRlbnQgdG8gRFRERWxlbWVudFJlZmVyZW5jZQotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbGVtUmVmKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmIChjbU5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkKLQkvLyB7Ci0JLy8gQ01Hcm91cE5vZGUgZ3JwTm9kZSA9IChDTUdyb3VwTm9kZSljbU5vZGU7Ci0JLy8gRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQkvLyBEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0KLQkvLyBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ3JwTm9kZS5nZXRHcm91cEtpbmQoKSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdycE5vZGUpKTsKLQkvLyBncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyAvLyBqdXN0IHVzZSB0aGUgbG9jYXRvciBmb3IgdGhlIGVsZW1lbnQgYXMgdGhlIGNsb3Nlc3QgZ3Vlc3MKLQkvLyBwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ3JwTm9kZSk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGdyb3VwQ29udGVudCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNtTm9kZSA9PSBudWxsKQotCS8vIHsKLQkvLyAvLyBiYWQgdGhpbmcgaGFwcGVuZWQgaGVyZSwganVzdCBjcmVhdGUgYSBwY2RhdGEKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBBZGQgYSBuZXcgZ3JvdXAgdG8gdGhlIGN1cnJlbnQgZ3JvdXAKLQkvLyAqIEBwYXJhbSBwYXJlbnQgLSB0aGUgcGFyZW50IG5vZGUgZm9yIHRoaXMgZ3JvdXAgZWxlbWVudAotCS8vICogQHBhcmFtIG9wMU5vZGUgLSB0aGUgZ3JvdXAKLQkvLyAqIGUuZy4gKGEsYikKLQkvLyAqIEBwYXJhbSBvcDJOb2RlIC0gc2V0IG9ubHkgaWYgY2FsbGVkIGJ5IHByb2Nlc3NDTTFvcAotCS8vICogZS5nLiAoYSxiKSsKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NHcm91cENvbnRlbnRHZW4oRFRER3JvdXBDb250ZW50IHBhcmVudCwKLQkvLyBDTUdyb3VwTm9kZSBncnBOb2RlKSB7Ci0JLy8KLQkvLyBFbnVtZXJhdGlvbiBjaGlsZHJlbiA9IGdycE5vZGUuZ2V0Q2hpbGRyZW4oKS5lbGVtZW50cygpOwotCS8vIERUREZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLQkvLyB3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIENNTm9kZSBjbm9kZSA9IChDTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCS8vIHsKLQkvLyBDTUdyb3VwTm9kZSBnTm9kZSA9IChDTUdyb3VwTm9kZSljbm9kZTsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZmFjdG9yeS5jcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQkvLyBEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0KLQkvLyBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ05vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkvLyBncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShnTm9kZSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKGdyb3VwQ29udGVudCk7Ci0JLy8gcHJvY2Vzc0dyb3VwQ29udGVudChncm91cENvbnRlbnQsZ05vZGUpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKQotCS8vIHsKLQkvLyBDTUJhc2ljTm9kZSBuID0gKENNQmFzaWNOb2RlKWNub2RlOwotCS8vIGlmIChuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLlBDREFUQSkKLQkvLyB7Ci0JLy8gLy8gQ3JlYXRlIGEgRFREUENEYXRhQ29udGVudCBmb3IgYSBsZWFmIFBDRGF0YSBub2RlCi0JLy8gLy8KLQkvLyBEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGZhY3RvcnkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCS8vIC8vIEFkZCAjUENEQVRBIHRvIHRoZSBHcm91cCwgaS5lIE1peGVkIGNvbnRlbnQgbW9kZWwKLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChwY0RhdGEpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpCi0JLy8gewotCS8vIENNUmVmZXJlbmNlTm9kZSBybiA9IChDTVJlZmVyZW5jZU5vZGUpY25vZGU7Ci0JLy8gaWYgKHJuLmdldFR5cGUoKT09Q01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkKLQkvLyB7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBFbGVtZW50IFJlZiBuYW1lOiAiICsgcm4uZ2V0TmFtZSgpKTsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQgZWxlbWVudAotCS8vIC8vCi0JLy8gRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbVJlZiA9Ci0JLy8gZmFjdG9yeS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCS8vCi0JLy8KLQkvLyAvLwotCS8vIC8vIEZpbmQgdGhlIHJlYWwgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHJlZmVyZW5jZXMKLQkvLyAvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50IGFuRWxlbWVudCA9IGNyZWF0ZU9yRmluZEVsZW1lbnQocm4uZ2V0TmFtZSgpLCBlbGVtUmVmKTsKLQkvLwotCS8vCi0JLy8gZWxlbVJlZi5zZXRSZWZlcmVuY2VkRWxlbWVudChhbkVsZW1lbnQpOwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gLy8gQWRkIERUREVsZW1lbnRSZWZlcmVuY2UgdG8gdGhlIEdyb3VwCi0JLy8gcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZWxlbVJlZik7Ci0JLy8gfQotCS8vIGVsc2UgLy8gUEUgUmVmZXJlbmNlCi0JLy8gewotCS8vIFN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQkvLwotCS8vCi0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBQRSBSZWYgbmFtZTogIiArIGVudGl0eU5hbWUpOwotCS8vIERUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCS8vIGlmIChhbkVudGl0eSE9bnVsbCkKLQkvLyB7Ci0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQgZWxlbWVudAotCS8vIC8vCi0JLy8gRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlblJlZiA9Ci0JLy8gZmFjdG9yeS5jcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JLy8gZW5SZWYuc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoYW5FbnRpdHkpOwotCS8vICAgICAgICAgICAgIAotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlblJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vCi0JLy8gLy8gQWRkIERUREVudGl0eVJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlblJlZik7Ci0JLy8KLQkvLwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBGaW5kIHRoZSByZWFsIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IGVsZW1lbnQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbGVtZW50IGNyZWF0ZU9yRmluZEVsZW1lbnRHZW4oU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopIHsKLQkvLwotCS8vIC8vIERUREVsZW1lbnQgYUVsZW1lbnQgPSBnZXREVERGaWxlKCkuZmluZEVsZW1lbnQobmFtZSk7Ci0JLy8KLQkvLwotCS8vIERUREVsZW1lbnQgYUVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChuYW1lKTsKLQkvLwotCS8vCi0JLy8gaWYgKGFFbGVtZW50ICE9IG51bGwpCi0JLy8gewotCS8vIHJldHVybiBhRWxlbWVudDsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBlcnJvck1zZyA9Ci0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xIik7Ci0JLy8gZXJyb3JNc2cgKz0gIlwiIiArIG5hbWUgKyAiXCIiOwotCS8vIGVycm9yTXNnICs9Ci0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMiIpOwotCS8vCi0JLy8KLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gICAgIAotCS8vIGR0ZEVycm9yLnNldEVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBvYmopOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1zZyk7Ci0JLy8gLy8gc2V0RFRERXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBnZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gZW1wdHkgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSB0byBtYWtlIGl0IHZhbGlkCi0JLy8gLy8KLQkvLwotCS8vCi0JLy8gRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlRFRERWxlbWVudCgpOwotCS8vIGR0ZGVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkvLwotCS8vCi0JLy8gRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGZhY3RvcnkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JLy8gZHRkZWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JLy8KLQkvLwotCS8vIGdldERUREZpbGUoKS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JLy8gZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLnB1dChuYW1lLGR0ZGVsZW1lbnQpOwotCS8vIHJldHVybiBkdGRlbGVtZW50OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENvbXB1dGUgdGhlIE1PRiBvY2N1cnJlbmNlIGZyb20gdGhlIHhtbDRqIG9jY3VycmVuY2UKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBpbnQgY29tcHV0ZU1vZk9jY3VycmVuY2VHZW4oQ01SZXBlYXRhYmxlTm9kZSBybm9kZSkgewotCS8vCi0JLy8gaW50IG9jY3VycmVuY2UgPSBybm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JLy8gaW50IG1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT05FOwotCS8vCi0JLy8KLQkvLyBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSkKLQkvLyB7Ci0JLy8gbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkU7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSkKLQkvLyB7Ci0JLy8gbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkVfT1JfTU9SRTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9QVElPTkFMKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9QVElPTkFMOwotCS8vIH0KLQkvLyByZXR1cm4gbW9mb2NjdXI7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ29tcHV0ZSB0aGUgTU9GIG1vZGVsIGdyb3VwIGZyb20gdGhlIHhtbDRqIG1vZGVsIGdyb3VwCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgaW50IGNvbXB1dGVNb2ZHcm91cEtpbmRHZW4oaW50IHR5cGUpIHsKLQkvLwotCS8vIGlmICh0eXBlID09IENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFKQotCS8vIHsKLQkvLyByZXR1cm4gRFRER3JvdXBLaW5kLkNIT0lDRTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyByZXR1cm4gRFRER3JvdXBLaW5kLlNFUVVFTkNFOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzR2VuKERUREVsZW1lbnQgZWxlbWVudCwgQXR0bGlzdCBhdHRMaXN0KQotCS8vIHsKLQkvLwotCS8vIGlmIChhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpIT1udWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKSwgZWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBmb3IgKGludCBpPTA7aTxhdHRMaXN0LnNpemUoKTtpKyspCi0JLy8gewotCS8vIEF0dE5vZGUgYWQgPSAoQXR0Tm9kZSkgYXR0TGlzdC5lbGVtZW50QXQoaSk7Ci0JLy8gLy8gRFREQXR0cmlidXRlRWxlbWVudCBkdGRBdHQ9IGdldERUREF0dHJpYnV0ZUVsZW1lbnQoYS5nZXROYW1lKCkpOwotCS8vCi0JLy8KLQkvLyAvLyBvbmx5IGFkZCB0aGUgQXR0RGVmIGlmIGl0IGlzIG5vdCBhZGRlZCB5ZXQKLQkvLyAvLyBpZ25vcmUgdGhlIGR1cCBBdHREZWYgYXMgZG9jdW1lbnRlZCBpbiB0aGUgWE1MIDEuMCBzcGVjcwotCS8vIC8vaWYoIGR0ZEF0dD09bnVsbCkKLQkvLyBhZGRBdHRyaWJ1dGUoZWxlbWVudCwgYWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDcmVhdGUgYSBEVERBdHRyaWJ1dGUgZnJvbSB0aGUgeG1sNGogYXR0cmlidXRlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVHZW4oRFRERWxlbWVudCBkdGRlbGVtZW50LCBBdHROb2RlIGFkKSB7Ci0JLy8KLQkvLyBEVERBdHRyaWJ1dGUgZHRkYXR0ciA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERBdHRyaWJ1dGUoKTsKLQkvLyBkdGRlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLmFkZChkdGRhdHRyKTsKLQkvLyBmaW5pc2hBdHRyaWJ1dGUoZHRkYXR0ciwgYWQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGZpbmlzaEF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgQXR0Tm9kZSBhdHRkZWYpCi0JLy8gewotCS8vCi0JLy8gYm9vbGVhbiBwYXJzZUVycm9yID0gZmFsc2U7Ci0JLy8KLQkvLwotCS8vIGlmIChhdHRkZWYubmFtZS5zdGFydHNXaXRoKCIlIikpCi0JLy8gewotCS8vIFN0cmluZyBwZU5hbWUgPSBhdHRkZWYubmFtZS50cmltKCk7Ci0JLy8gRFRERW50aXR5IGVuID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQocGVOYW1lKTsKLQkvLyBpZiAoZW4hPW51bGwpCi0JLy8gewotCS8vIGR0ZGF0dHIuc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGR0ZGF0dHIuc2V0TmFtZShhdHRkZWYubmFtZSk7Ci0JLy8KLQkvLwotCS8vIGludCBhdHRyVHlwZSA9IGF0dGRlZi5nZXREZWNsYXJlZFR5cGUoKTsKLQkvLwotCS8vCi0JLy8gaWYgKGF0dHJUeXBlPT1BdHROb2RlLlBFUkVGRVJFTkNFICYmIGF0dGRlZi50eXBlIT1udWxsKQotCS8vIHsKLQkvLyBTdHJpbmcgcGVOYW1lID0gYXR0ZGVmLnR5cGUudHJpbSgpOwotCS8vIERUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JLy8gaWYgKGVuIT1udWxsKQotCS8vIHsKLQkvLyBkdGRhdHRyLnNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KGVuKTsKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOyAvLyBoYWNrLAotCS8vIHNvIHdlIGNhbiBnZXQgYmFjayB0aGUgZGVmYXVsdCB2YWx1ZQotCS8vIH0KLQkvLyBlbHNlIC8vc2V0IGRlZmF1bHQgdHlwZQotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JLy8KLQkvLwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHN3aXRjaCAoYXR0clR5cGUpCi0JLy8gewotCS8vIGNhc2UgQXR0Tm9kZS5DREFUQToKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5USVRJRVM6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9FTlRJVElFUygpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLkVOVElUWToKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklEOgotCS8vIC8vIGNoZWNrIGZvciBkdXBsaWNhdGUgSUQgYXR0cmlidXRlCi0JLy8gaWYgKGhhc0lEQXR0cmlidXRlKGR0ZGF0dHIpKQotCS8vIHsKLQkvLyBTdHJpbmcgZXJyTXNnID0gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSIpOwotCS8vIGVyck1zZyArPSBhdHRkZWYubmFtZSArCi0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX1VJX0VSUk9SUEFSVF9EVVBfSURfQVRUUklCVVRFXzIiKTsKLQkvLyAvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIHBhcnNlRXJyb3IgPSB0cnVlOwotCS8vIH0KLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSURSRUY6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9JRFJFRigpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklEUkVGUzoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLkVOVU1FUkFUSU9OOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwKLQkvLyBEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVApKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5PVEFUSU9OOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwKLQkvLyBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5OTVRPS0VOOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTigpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5NVE9LRU5TOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGRlZmF1bHQ6Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBVFRSICciICthdHRkZWYubmFtZSArICInVW5rbm93biB0eXBlLi4uIiArCi0JLy8gYXR0clR5cGUpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGludCBhdHRyRGVmYXVsdCA9IGF0dGRlZi5nZXREZWZhdWx0VHlwZSgpOwotCS8vIGludCBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JLy8gc3dpdGNoIChhdHRyRGVmYXVsdCkKLQkvLyB7Ci0JLy8gY2FzZSBBdHROb2RlLkZJWEVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuRklYRUQ7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5JTVBMSUVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLlJFUVVJUkVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuUkVRVUlSRUQ7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5OT0ZJWEVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuTk9GSVhFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gZGVmYXVsdDoKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIicgVW5rbm93biBkZWZhdWx0Ci0JLy8gdHlwZS4uLiAiICsgYXR0ckRlZmF1bHQpOwotCS8vIH0KLQkvLwotCS8vIERURERlZmF1bHRLaW5kIGRlZmF1bHRLaW5kT2JqID0gRFRERGVmYXVsdEtpbmQuZ2V0KGRlZmF1bHRLaW5kKTsKLQkvLyBkdGRhdHRyLnNldERlZmF1bHRLaW5kKGRlZmF1bHRLaW5kT2JqKTsKLQkvLwotCS8vIGlmIChwYXJzZUVycm9yKQotCS8vIHsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ZGVmLmRlZmF1bHRWYWx1ZTsKLQkvLyBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpCi0JLy8gewotCS8vIGlmIChhdHRyVHlwZSA9PSBBdHROb2RlLkVOVU1FUkFUSU9OIHx8IGF0dHJUeXBlID09IEF0dE5vZGUuTk9UQVRJT04pCi0JLy8gewotCS8vIGlmICghIGlzRGVmYXVsdEVudW1WYWx1ZVZhbGlkKGF0dGRlZixkZWZhdWx0VmFsdWUpKQotCS8vIHsKLQkvLyBTdHJpbmcgdHlwZVN0cmluZyA9Ci0JLy8gKGF0dHJUeXBlPT1BdHROb2RlLkVOVU1FUkFUSU9OPyJlbnVtZXJhdGlvbiI6Im5vdGF0aW9uIik7Ci0JLy8gU3RyaW5nIGVyck1zZyA9Ci0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzEiKTsKLQkvLyBlcnJNc2cgKz0gdHlwZVN0cmluZyArCi0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX1VJX0VSUk9SUEFSVF9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yIik7Ci0JLy8gZXJyTXNnICs9IGF0dGRlZi5uYW1lICsgIiciOwotCS8vCi0JLy8KLQkvLyAvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gfQotCS8vIGR0ZGF0dHIuc2V0RGVmYXVsdFZhbHVlU3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0JLy8gfQotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQXR0ciAtIHRvTW9mIGdldERlZmF1bHRWYWx1ZVN0cmluZyAiICsKLQkvLyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlOiAiICsKLQkvLyBnZXREZWZhdWx0VmFsdWUoKSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gaGFzSURBdHRyaWJ1dGVHZW4oRFREQXR0cmlidXRlIGR0ZGF0dHIpIHsKLQkvLwotCS8vIGJvb2xlYW4gaGFzSUQgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gZHRkYXR0ci5nZXREVERFbGVtZW50KCk7Ci0JLy8gRUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCS8vCi0JLy8KLQkvLyBJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREF0dHJpYnV0ZSBhdHRyID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JLy8gRFREVHlwZSBkVHlwZSA9IGF0dHIuZ2V0RFREVHlwZSgpOwotCS8vIGlmIChkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkKLQkvLyB7Ci0JLy8gaWYgKCAoKERUREJhc2ljVHlwZSlkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gRFREQmFzaWNUeXBlS2luZC5JRCkKLQkvLyB7Ci0JLy8gaGFzSUQgPSB0cnVlOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBoYXNJRDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uR2VuKERUREF0dHJpYnV0ZQotCS8vIGR0ZGF0dHIsIFN0cmluZ1tdIGVudW1WYWx1ZXMsIGludCBlbnVtS2luZCkgewotCS8vCi0JLy8gRFRERW51bWVyYXRpb25UeXBlIGVudW0gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JLy8gLy8gVGhpcyBpcyBncm9zcywgYnV0IHRoaXMgaXMgd2hhdCB3YXMgZG9uZSBiZWZvcmUuCi0JLy8gRFREQXR0cmlidXRlSW1wbCBkdGRhdHRyaW1wbCA9IChEVERBdHRyaWJ1dGVJbXBsKSBkdGRhdHRyOwotCS8vIC8vIGVudW0uc2V0SUQoIkVudW1fIiArCi0JLy8gKChEVERFbGVtZW50KWR0ZGF0dHJpbXBsLmdldE1PRkRvbWFpbigpKS5nZXROYW1lKCkgKyAiXyIgKwotCS8vIGR0ZGF0dHIuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkvLyBlbnVtLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyAvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkvLyBpZiAoZW51bVZhbHVlcyE9bnVsbCkKLQkvLyB7Ci0JLy8gZm9yKGludCBpPTA7aTxlbnVtVmFsdWVzLmxlbmd0aDtpKyspCi0JLy8gewotCS8vIEVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIC8vIGVudW1WYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKGVudW1WYWx1ZXNbaV0pOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKTsKLQkvLyBlbnVtLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JLy8gfQotCS8vIH0KLQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW0pOwotCS8vIHJldHVybiBlbnVtOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBFRW51bUxpdGVyYWwgY3JlYXRlRUVudW1MaXRlcmFsR2VuKCkgewotCS8vCi0JLy8gRWNvcmVQYWNrYWdlIGVQYWNrYWdlID0KLQkvLyAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQkvLyByZXR1cm4gKChFY29yZUZhY3RvcnkpZVBhY2thZ2UuZ2V0RmFjdG9yeSgpKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uR2VuKERUREF0dHJpYnV0ZQotCS8vIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmLCBpbnQgZW51bUtpbmQpIHsKLQkvLwotCS8vIERUREVudW1lcmF0aW9uVHlwZSBlbnVtID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCS8vIC8vIFRoaXMgaXMgZ3Jvc3MsIGJ1dCB0aGlzIGlzIHdoYXQgd2FzIGRvbmUgYmVmb3JlLgotCS8vIERUREF0dHJpYnV0ZUltcGwgZHRkYXR0cmltcGwgPSAoRFREQXR0cmlidXRlSW1wbCkgZHRkYXR0cjsKLQkvLyAvLyBlbnVtLnNldElEKCJFbnVtXyIgKwotCS8vICgoRFRERWxlbWVudClkdGRhdHRyaW1wbC5nZXRNT0ZEb21haW4oKSkuZ2V0TmFtZSgpICsgIl8iICsKLQkvLyBkdGRhdHRyLmdldE5hbWUoKSk7Ci0JLy8gRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JLy8gZW51bS5zZXRLaW5kKGdyb3VwS2luZCk7Ci0JLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtKTsKLQkvLwotCS8vCi0JLy8gLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JLy8gRW51bWVyYXRpb24gdG9rZW5JdGVyID0gYXR0ZGVmLmVsZW1lbnRzKCk7Ci0JLy8gaWYgKHRva2VuSXRlciAhPSBudWxsKSB7Ci0JLy8gaW50IGk9MDsKLQkvLyB3aGlsZSAodG9rZW5JdGVyLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgdmFsID0gKFN0cmluZyl0b2tlbkl0ZXIubmV4dEVsZW1lbnQoKTsKLQkvLyBFRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBjcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkvLyAvLyBlbnVtTGl0ZXJhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCS8vICAgICAgICAKLQkvLwotCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwodmFsKTsKLQkvLyAvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSsrKTsKLQkvLyBlbnVtLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gcmV0dXJuIGVudW07Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0RW51bVZhbHVlVmFsaWRHZW4oQXR0Tm9kZSBhdHRkZWYsIFN0cmluZwotCS8vIGRlZmF1bHRWYWx1ZSkgewotCS8vCi0JLy8gYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCS8vIGJvb2xlYW4gY29udGFpbnNQZXJjZW50ID0gZmFsc2U7Ci0JLy8KLQkvLwotCS8vIC8vIEVudW1lcmF0aW9uIHZhbHVlcwotCS8vIEVudW1lcmF0aW9uIGVudW1WYWx1ZXMgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkvLyB3aGlsZSAoZW51bVZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIHZhbCA9IChTdHJpbmcpZW51bVZhbHVlcy5uZXh0RWxlbWVudCgpOwotCS8vIGlmICh2YWwuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpCi0JLy8gewotCS8vIHZhbGlkID0gdHJ1ZTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gaWYgKHZhbC5pbmRleE9mKCclJykgPj0gMCkKLQkvLyB7Ci0JLy8gY29udGFpbnNQZXJjZW50ID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiB2YWxpZCB8fCBjb250YWluc1BlcmNlbnQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgc2V0QXR0ckRURFR5cGVHZW4oRFREQXR0cmlidXRlIGR0ZGF0dHIsIERURFR5cGUgdHlwZSkgewotCS8vCi0JLy8gZHRkYXR0ci5zZXREVERUeXBlKHR5cGUpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEVycm9yTWVzc2FnZUdlbihFcnJvck1lc3NhZ2UgZXJyTXNnLCBPYmplY3Qgb2JqKSB7Ci0JLy8KLQkvLyBlcnJNc2cuc2V0T2JqZWN0KG9iaik7Ci0JLy8gZHRkVXRpbC5hZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRET2JqZWN0RmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRET2JqZWN0RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjM2YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE9iamVjdEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREU291cmNlT2Zmc2V0OwotCi1wdWJsaWMgY2xhc3MgRFRET2JqZWN0RmluZGVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0JcHVibGljIGNsYXNzIFNvdXJjZU9mZnNldCB7Ci0JCS8vIENvbnZlbmllbmNlIGNsYXNzIHRvIGZpbmQgY29udGFpbm1lbnQgb2Ygb2JqZWN0Ci0JCXByaXZhdGUgaW50IHN0YXJ0LCBlbmQ7Ci0KLQkJcHVibGljIFNvdXJjZU9mZnNldChpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJCXRoaXMuZW5kID0gZW5kOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoU291cmNlT2Zmc2V0IG90aGVyKSB7Ci0JCQlpZiAodGhpcy5zdGFydCA8PSBvdGhlci5zdGFydCAmJiBvdGhlci5zdGFydCA8PSB0aGlzLmVuZCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCi0JU291cmNlT2Zmc2V0IHNlYXJjaExvY2F0aW9uOwotCi0JcHJpdmF0ZSBTb3VyY2VPZmZzZXQgb2Zmc2V0T2JqZWN0Rm9yKERURFNvdXJjZU9mZnNldCBzKSB7Ci0JCXJldHVybiBuZXcgU291cmNlT2Zmc2V0KHMuZ2V0U3RhcnRPZmZzZXQoKSwgcy5nZXRFbmRPZmZzZXQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbm1lbnQoRFRET2JqZWN0IG8pIHsKLQkJaWYgKG9mZnNldE9iamVjdEZvcigoRFREU291cmNlT2Zmc2V0KSBvKS5jb250YWlucyhzZWFyY2hMb2NhdGlvbikpIHsKLQkJCWNsb3Nlc3RPYmplY3QgPSBvOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCXB1YmxpYyBEVERPYmplY3RGaW5kZXIoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0JCXNlYXJjaExvY2F0aW9uID0gbmV3IFNvdXJjZU9mZnNldChzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURE5vdGF0aW9uKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQobm90YXRpb24pOwotCQlzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eShEVERFbnRpdHkgZW50aXR5KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoZW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnQoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoZWxlbWVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoYXR0cmlidXRlKTsKLQkJc3VwZXIudmlzaXREVERBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCQljaGVja0NvbnRhaW5tZW50KHBhcm1FbnRpdHkpOwotCQlzdXBlci52aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJY2hlY2tDb250YWlubWVudChjb250ZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIERURE9iamVjdCBjbG9zZXN0T2JqZWN0ID0gbnVsbDsKLQotCXB1YmxpYyBEVERPYmplY3QgZ2V0Q2xvc2VzdE9iamVjdCgpIHsKLQkJcmV0dXJuIGNsb3Nlc3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VPZmZzZXQgb2Zmc2V0T2JqZWN0Rm9yR2VuKERURFNvdXJjZU9mZnNldCBzKSB7Ci0KLQkJcmV0dXJuIG5ldyBTb3VyY2VPZmZzZXQocy5nZXRTdGFydE9mZnNldCgpLCBzLmdldEVuZE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tDb250YWlubWVudEdlbihEVERPYmplY3QgbykgewotCi0JCWlmIChvZmZzZXRPYmplY3RGb3IoKERURFNvdXJjZU9mZnNldCkgbykuY29udGFpbnMoc2VhcmNoTG9jYXRpb24pKSB7Ci0JCQljbG9zZXN0T2JqZWN0ID0gbzsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVEROb3RhdGlvbkdlbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCi0JCWNoZWNrQ29udGFpbm1lbnQobm90YXRpb24pOwotCQlzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbnRpdHlHZW4oRFRERW50aXR5IGVudGl0eSkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoZW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50R2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoZWxlbWVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVHZW4oRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoYXR0cmlidXRlKTsKLQkJc3VwZXIudmlzaXREVERBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VHZW4oRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KHBhcm1FbnRpdHkpOwotCQlzdXBlci52aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChjb250ZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERURE9iamVjdCBnZXRDbG9zZXN0T2JqZWN0R2VuKCkgewotCi0JCXJldHVybiBjbG9zZXN0T2JqZWN0OwotCX0KLX0vLyBEVERPYmplY3RGaW5kZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQYXRobmFtZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQYXRobmFtZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhYmQyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUGF0aG5hbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERQYXRobmFtZVV0aWwgewotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIG1ha2VQYXRoKFN0cmluZyBwYXJlbnRQYXRoLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIGludCBjbnQpIHsKLQkJU3RyaW5nIHBuID0gbnVsbDsKLQkJbmFtZSA9IGVuY29kZShuYW1lKTsKLQkJaWYgKChuYW1lID09IG51bGwpICYmIChjbnQgPD0gMCkpIHsKLQkJCXBuID0gdHlwZTsKLQkJfQotCQllbHNlIGlmIChjbnQgPD0gMCkgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpICsgIjoiICsgY250OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudFBhdGggKyAiLiIgKyBwbjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHBuOwotCQl9Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBPYmplY3RbXSBwYXJzZVBhdGhDb21wb25lbnQoU3RyaW5nIHBhdGgpIHsKLQkJLyoKLQkJICogVGhpcyByb3V0aW5lIHBhcnNlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHBhdGggYW5kIHJldHVybnMgdGhlCi0JCSAqIHJlc3VsdCBpbiBhbiBhcnJyYXkgb2YgU3RyaW5ncy4gcmVzdWx0WzBdID0gdHlwZSAoU3RyaW5nKSByZXN1bHRbMV0gPQotCQkgKiBuYW1lIChTdHJpbmcpIHJlc3VsdFsyXSA9IGNvdW50IChJbnRlZ2VyKSByZXN1bHRbM10gPSB0aGUgcmVzdCBvZgotCQkgKiB0aGUgcGF0aCAoU3RyaW5nKQotCQkgKiAKLQkJICogRS5nLiBQYXRoQ29tcG9uZW50IHJlc3VsdFswXSByZXN1bHRbMV0gcmVzdWx0WzJdIHJlc3VsdFszXQotCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUKLQkJICogdHlwZSA8bnVsbD4gPG51bGw+IDxudWxsPiB0eXBlLnJlc3QgdHlwZSA8bnVsbD4gPG51bGw+IHJlc3QKLQkJICogdHlwZTpuYW1lIHR5cGUgbmFtZSA8bnVsbD4gPG51bGw+IHR5cGU6bmFtZS5yZXN0IHR5cGUgbmFtZSA8bnVsbD4KLQkJICogcmVzdCB0eXBlOjpuIHR5cGUgPG51bGw+IG4gPG51bGw+IHR5cGU6Om4ucmVzdCB0eXBlIDxudWxsPiBuIHJlc3QKLQkJICogdHlwZTpuYW1lOm4gdHlwZSBuYW1lIG4gPG51bGw+IHR5cGU6bmFtZTpuLnJlc3QgdHlwZSBuYW1lIG4gcmVzdAotCQkgKi8KLQotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzRdOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlpbnQgaSA9IHBhdGguaW5kZXhPZignLicpOwotCQlpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKLQotCQlpZiAoaSA8IDApIHsKLQkJCWkgPSBsZW5ndGg7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSW50ZWdlciBuID0gbnVsbDsKLQkJU3RyaW5nIHJlc3QgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgdHlwZQotCQlpbnQgaiA9IHBhdGguaW5kZXhPZignOicpOwotCQlpZiAoaiA+IGkpCi0JCQlqID0gLTE7Ci0JCWlmIChqIDwgMCkgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGopOwotCi0JCQkvLyBnZXQgdGhlIG5hbWUKLQkJCWludCBrID0gcGF0aC5pbmRleE9mKCc6JywgaiArIDEpOwotCQkJaWYgKGsgPiBpKQotCQkJCWsgPSAtMTsKLQkJCWlmIChrIDwgMCkgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGspOwotCi0JCQkJLy8gZ2V0IHRoZSBjb3VudAotCQkJCXRyeSB7Ci0JCQkJCW4gPSBuZXcgSW50ZWdlcihwYXRoLnN1YnN0cmluZyhrICsgMSwgaSkpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCX0KLQkJCQlpZiAoKG4gIT0gbnVsbCkgJiYgKG4uaW50VmFsdWUoKSA8IDApKSB7Ci0JCQkJCW4gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoaSA8IGxlbmd0aCkgewotCQkJcmVzdCA9IHBhdGguc3Vic3RyaW5nKGkgKyAxKTsKLQkJfQotCi0JCXJlc3VsdFswXSA9IHR5cGU7Ci0JCXJlc3VsdFsxXSA9IGRlY29kZShuYW1lKTsKLQkJcmVzdWx0WzJdID0gbjsKLQkJcmVzdWx0WzNdID0gcmVzdDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fCAoYyA9PSAnLScpKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gaWYgKChjID09ICcuJykgfHwgKGMgPT0gJzonKSB8fCAoYyA9PSAnXycpIHx8IC4uLikKLQkJCQkvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gYSA0IGRpZ2l0IGhleCBjb2RlIHByZWZpeGVkIGJ5ICJfIgotCQkJCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOwotCQkJCWludCBsID0gaGV4Lmxlbmd0aCgpOwotCQkJCWlmIChsID09IDEpIHsKLQkJCQkJby5hcHBlbmQoIl8wMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDIpIHsKLQkJCQkJby5hcHBlbmQoIl8wMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMykgewotCQkJCQlvLmFwcGVuZCgiXzAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJby5hcHBlbmQoJ18nKTsKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBvID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGMgIT0gJ18nKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBoZXggY29kZQotCQkJCVN0cmluZyBoZXg7Ci0JCQkJaWYgKGxlbiA+IGkgKyA0KSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxLCBpICsgNSk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxKTsKLQkJCQkJaSA9IGxlbiAtIDE7Ci0JCQkJfQotCQkJCW8uYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpKTsKLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbWFrZVBhdGhHZW4oU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgaW50IGNudCkgewotCi0JCVN0cmluZyBwbiA9IG51bGw7Ci0JCW5hbWUgPSBlbmNvZGUobmFtZSk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSAmJiAoY250IDw9IDApKSB7Ci0JCQlwbiA9IHR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoY250IDw9IDApIHsKLQkJCXBuID0gdHlwZSArICI6IiArICgobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKSArICI6IiArIGNudDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCWlmIChwYXJlbnRQYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnRQYXRoICsgIi4iICsgcG47IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBwbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFtdIHBhcnNlUGF0aENvbXBvbmVudEdlbihTdHJpbmcgcGF0aCkgewotCi0JCS8qCi0JCSAqIFRoaXMgcm91dGluZSBwYXJzZSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIGFuZCByZXR1cm5zIHRoZQotCQkgKiByZXN1bHQgaW4gYW4gYXJycmF5IG9mIFN0cmluZ3MuIHJlc3VsdFswXSA9IHR5cGUgKFN0cmluZykgcmVzdWx0WzFdID0KLQkJICogbmFtZSAoU3RyaW5nKSByZXN1bHRbMl0gPSBjb3VudCAoSW50ZWdlcikgcmVzdWx0WzNdID0gdGhlIHJlc3Qgb2YKLQkJICogdGhlIHBhdGggKFN0cmluZykKLQkJICogCi0JCSAqIEUuZy4gUGF0aENvbXBvbmVudCByZXN1bHRbMF0gcmVzdWx0WzFdIHJlc3VsdFsyXSByZXN1bHRbM10KLQkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlCi0JCSAqIHR5cGUgPG51bGw+IDxudWxsPiA8bnVsbD4gdHlwZS5yZXN0IHR5cGUgPG51bGw+IDxudWxsPiByZXN0Ci0JCSAqIHR5cGU6bmFtZSB0eXBlIG5hbWUgPG51bGw+IDxudWxsPiB0eXBlOm5hbWUucmVzdCB0eXBlIG5hbWUgPG51bGw+Ci0JCSAqIHJlc3QgdHlwZTo6biB0eXBlIDxudWxsPiBuIDxudWxsPiB0eXBlOjpuLnJlc3QgdHlwZSA8bnVsbD4gbiByZXN0Ci0JCSAqIHR5cGU6bmFtZTpuIHR5cGUgbmFtZSBuIDxudWxsPiB0eXBlOm5hbWU6bi5yZXN0IHR5cGUgbmFtZSBuIHJlc3QKLQkJICovCi0KLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFs0XTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJaW50IGkgPSBwYXRoLmluZGV4T2YoJy4nKTsKLQkJaW50IGxlbmd0aCA9IHBhdGgubGVuZ3RoKCk7Ci0KLQkJaWYgKGkgPCAwKSB7Ci0JCQlpID0gbGVuZ3RoOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCUludGVnZXIgbiA9IG51bGw7Ci0JCVN0cmluZyByZXN0ID0gbnVsbDsKLQotCQkvLyBnZXQgdGhlIHR5cGUKLQkJaW50IGogPSBwYXRoLmluZGV4T2YoJzonKTsKLQkJaWYgKGogPiBpKQotCQkJaiA9IC0xOwotCQlpZiAoaiA8IDApIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCQllbHNlIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBqKTsKLQotCQkJLy8gZ2V0IHRoZSBuYW1lCi0JCQlpbnQgayA9IHBhdGguaW5kZXhPZignOicsIGogKyAxKTsKLQkJCWlmIChrID4gaSkKLQkJCQlrID0gLTE7Ci0JCQlpZiAoayA8IDApIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmFtZSA9IHBhdGguc3Vic3RyaW5nKGogKyAxLCBrKTsKLQotCQkJCS8vIGdldCB0aGUgY291bnQKLQkJCQl0cnkgewotCQkJCQluID0gbmV3IEludGVnZXIocGF0aC5zdWJzdHJpbmcoayArIDEsIGkpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl9Ci0JCQkJaWYgKChuICE9IG51bGwpICYmIChuLmludFZhbHVlKCkgPCAwKSkgewotCQkJCQluID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGkgPCBsZW5ndGgpIHsKLQkJCXJlc3QgPSBwYXRoLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXN1bHRbMF0gPSB0eXBlOwotCQlyZXN1bHRbMV0gPSBkZWNvZGUobmFtZSk7Ci0JCXJlc3VsdFsyXSA9IG47Ci0JCXJlc3VsdFszXSA9IHJlc3Q7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGVuY29kZUdlbihTdHJpbmcgcykgewotCi0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fCAoYyA9PSAnLScpKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gaWYgKChjID09ICcuJykgfHwgKGMgPT0gJzonKSB8fCAoYyA9PSAnXycpIHx8IC4uLikKLQkJCQkvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gYSA0IGRpZ2l0IGhleCBjb2RlIHByZWZpeGVkIGJ5ICJfIgotCQkJCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOwotCQkJCWludCBsID0gaGV4Lmxlbmd0aCgpOwotCQkJCWlmIChsID09IDEpIHsKLQkJCQkJby5hcHBlbmQoIl8wMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDIpIHsKLQkJCQkJby5hcHBlbmQoIl8wMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMykgewotCQkJCQlvLmFwcGVuZCgiXzAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJby5hcHBlbmQoJ18nKTsKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGRlY29kZUdlbihTdHJpbmcgcykgewotCi0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyAhPSAnXycpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBuZXh0IDQgY2hhcmFjdGVycyBhcmUgdGhlIGhleCBjb2RlCi0JCQkJU3RyaW5nIGhleDsKLQkJCQlpZiAobGVuID4gaSArIDQpIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQkJaSArPSA0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEpOwotCQkJCQlpID0gbGVuIC0gMTsKLQkJCQl9Ci0JCQkJby5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoaGV4LCAxNikpOwotCQkJfQotCQl9IC8vIGZvcgotCQlyZXR1cm4gby50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY0ZmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERTb3VyY2VPZmZzZXQ7Ci0KLQotcHVibGljIGNsYXNzIERURFByaW50ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYm9vbGVhbiB1cGRhdGVPZmZzZXQgPSB0cnVlOwotCi0JcHVibGljIERURFByaW50ZXIoYm9vbGVhbiB1cGRhdGVPZmZzZXQpIHsKLQkJdGhpcy51cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBzYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREZpbGUoRFRERmlsZSBmaWxlKSB7Ci0JCXN1cGVyLnZpc2l0RFRERmlsZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURE5vdGF0aW9uKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCWdlbmVyYXRlQ29tbWVudChub3RhdGlvbik7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KG5vdGF0aW9uLCBzYi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZCgiPCFOT1RBVElPTiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBwdWJsaWNJRCA9IG5vdGF0aW9uLmdldFB1YmxpY0lEKCk7Ci0JCVN0cmluZyBzeXN0ZW1JRCA9IG5vdGF0aW9uLmdldFN5c3RlbUlEKCk7Ci0JCWlmIChwdWJsaWNJRCA9PSBudWxsIHx8IHB1YmxpY0lELmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKCJTWVNURU0gIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgiUFVCTElDIFwiIikuYXBwZW5kKHB1YmxpY0lEKS5hcHBlbmQoIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChzeXN0ZW1JRCA9PSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoIlwiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JRCkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbmRUYWcoKTsKLQkJdXBkYXRlRW5kT2Zmc2V0KG5vdGF0aW9uLCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCQlzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eShEVERFbnRpdHkgZW50aXR5KSB7Ci0JCWdlbmVyYXRlQ29tbWVudChlbnRpdHkpOwotCQl1cGRhdGVTdGFydE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IUVOVElUWSAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkJCXNiLmFwcGVuZCgiJSAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNiLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZW50aXR5LmdldENvbnRlbnQoKS51bnBhcnNlKCkpOwotCi0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQoZW50aXR5LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCQlzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudChEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJZ2VuZXJhdGVDb21tZW50KGVsZW1lbnQpOwotCQl1cGRhdGVTdGFydE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZCgiPCFFTEVNRU5UICIgKyBlbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJRFRERWxlbWVudENvbnRlbnQgY29udGVudCA9IGVsZW1lbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQgfHwgY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlzYi5hcHBlbmQoIiAoIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQkJCXNiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQkJfSAvLyBlbmQgb2YgZWxzZQotCQllbmRUYWcoKTsKLQkJdXBkYXRlRW5kT2Zmc2V0KGVsZW1lbnQsIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXZpc2l0QXR0cmlidXRlcyhlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCQlnZW5lcmF0ZUNvbW1lbnQocGFybUVudGl0eSk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KHBhcm1FbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCIlIiArIHBhcm1FbnRpdHkuZ2V0TmFtZSgpICsgIjtcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdXBkYXRlRW5kT2Zmc2V0KHBhcm1FbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZQotCQkJCQkJCQkJCQkJCQkvLyBjaGFyCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGNvbnRlbnQsIHNiLmxlbmd0aCgpKTsKLQkJU3RyaW5nIHRyYWlsaW5nQ2hhcnMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50KSB7Ci0JCQlEVERSZXBlYXRhYmxlQ29udGVudCByZXBlYXRDb250ZW50ID0gKERURFJlcGVhdGFibGVDb250ZW50KSBjb250ZW50OwotCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSByZXBlYXRDb250ZW50LmdldE9jY3VycmVuY2UoKTsKLQkJCS8vIEludGVnZXIgb2NjdXJyZW5jZSA9IHJlcGVhdENvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpOwotCQkJaWYgKG9jY3VycmVuY2VUeXBlICE9IG51bGwpIHsKLQkJCQlpbnQgb2NjdXJUeXBlID0gb2NjdXJyZW5jZVR5cGUuZ2V0VmFsdWUoKTsKLQkJCQlpZiAob2NjdXJUeXBlICE9IERURE9jY3VycmVuY2VUeXBlLk9ORSkgewotCQkJCQlpZiAocmVwZWF0Q29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQkJCXNiLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl0cmFpbGluZ0NoYXJzID0gIikiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJdHJhaWxpbmdDaGFycyArPSAoY2hhcikgb2NjdXJUeXBlOwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCXN1cGVyLnZpc2l0RFRERWxlbWVudENvbnRlbnQoY29udGVudCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCB8fCBjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJc2IuYXBwZW5kKCgoRFREUmVwZWF0YWJsZUNvbnRlbnQpIGNvbnRlbnQpLnVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQkvLyBoYW5kbGUgRFREUENEYXRhQ29udGVudCwgRFREQW55Q29udGVudCBhbmQgRFRERW1wdHlDb250ZW50IGhlcmUKLQkJCXNiLmFwcGVuZChjb250ZW50LmdldENvbnRlbnROYW1lKCkpOwotCQl9IC8vIGVuZCBvZiBlbHNlCi0JCXNiLmFwcGVuZCh0cmFpbGluZ0NoYXJzKTsKLQkJdXBkYXRlRW5kT2Zmc2V0KGNvbnRlbnQsIHNiLmxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgZ3JvdXApIHsKLQkJc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQkJRFRER3JvdXBLaW5kIGtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkJLy8gTU9GMkVNRiBQb3J0Ci0JCS8vIEludGVnZXIgZ3JvdXBLaW5kID0gZ3JvdXAuZ2V0R3JvdXBLaW5kKCk7Ci0JCWlmIChraW5kID09IG51bGwpIHsKLQkJCWdyb3VwLnNldEdyb3VwS2luZChEVERHcm91cEtpbmQuZ2V0KERUREdyb3VwS2luZC5TRVFVRU5DRSkpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCi0JCVN0cmluZyBjb24gPSBncm91cC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREdyb3VwS2luZC5DSE9JQ0UgPyAiIHwgIiA6ICIsICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIExvb3AgdGhydSB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgZ3JvdXAKLQkJQ29sbGVjdGlvbiBjb250ZW50ID0gZ3JvdXAuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGZpcnN0Q29udGVudCA9IHRydWU7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWlmICghZmlyc3RDb250ZW50KSB7Ci0JCQkJCXNiLmFwcGVuZChjb24pOwotCQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQkJZWxzZSB7Ci0JCQkJCWZpcnN0Q29udGVudCA9IGZhbHNlOwotCQkJCX0gLy8gZW5kIG9mIGVsc2UKLQkJCQl2aXNpdERUREVsZW1lbnRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmlzaXRBdHRyaWJ1dGVzKERUREVsZW1lbnQgZWxlbSkgewotCQlDb2xsZWN0aW9uIGF0dHJzID0gZWxlbS5nZXREVERBdHRyaWJ1dGUoKTsKLQkJSXRlcmF0b3IgaSA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0JCWlmIChhdHRycyAhPSBudWxsICYmIGkuaGFzTmV4dCgpKSB7Ci0JCQlEVERBdHRyaWJ1dGUgYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JCQlpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKQotCQkJCXNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzYi5hcHBlbmQoIjwhQVRUTElTVCAiICsgZWxlbS5nZXROYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlU3RhcnRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQlzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JCQl1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQlzYi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoOyBpLmhhc05leHQoKTspIHsKLQkJCQlhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCQljb21tZW50ID0gYXR0cmliLmdldENvbW1lbnQoKTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNiLmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpID4gMCkKLQkJCQkJCXNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCQlzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JCQkJdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCQkJCXNiLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2IuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFRhZygpIHsKLQkJc2IuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdGFydE9mZnNldChEVERTb3VyY2VPZmZzZXQgbywgaW50IG9mZnNldCkgewotCQlpZiAodXBkYXRlT2Zmc2V0KSB7Ci0JCQlvLnNldFN0YXJ0T2Zmc2V0KG9mZnNldCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuZE9mZnNldChEVERTb3VyY2VPZmZzZXQgbywgaW50IG9mZnNldCkgewotCQlpZiAodXBkYXRlT2Zmc2V0KSB7Ci0JCQlvLnNldEVuZE9mZnNldChvZmZzZXQpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUNvbW1lbnQoRFRET2JqZWN0IGR0ZE9iamVjdCkgewotCQlTdHJpbmcgY29tbWVudFN0cmluZyA9IG51bGw7Ci0KLQkJaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpCi0JCQljb21tZW50U3RyaW5nID0gKChEVERFbGVtZW50KSBkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkJZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERW50aXR5KQotCQkJY29tbWVudFN0cmluZyA9ICgoRFRERW50aXR5KSBkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkJZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRETm90YXRpb24pCi0JCQljb21tZW50U3RyaW5nID0gKChEVEROb3RhdGlvbikgZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0KLQkJaWYgKGNvbW1lbnRTdHJpbmcgIT0gbnVsbCAmJiBjb21tZW50U3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJc2IuYXBwZW5kKCI8IS0tIikuYXBwZW5kKGNvbW1lbnRTdHJpbmcpLmFwcGVuZCgiLS0+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBnZXRCdWZmZXJHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gc2I7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERGaWxlR2VuKERUREZpbGUgZmlsZSkgewotCS8vCi0JLy8gc3VwZXIudmlzaXREVERGaWxlKGZpbGUpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRETm90YXRpb25HZW4oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChub3RhdGlvbik7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIjwhTk9UQVRJT04gIik7Ci0JLy8gc2IuYXBwZW5kKG5vdGF0aW9uLmdldE5hbWUoKSkuYXBwZW5kKCIgIik7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBwdWJsaWNJRCA9IG5vdGF0aW9uLmdldFB1YmxpY0lEKCk7Ci0JLy8gU3RyaW5nIHN5c3RlbUlEID0gbm90YXRpb24uZ2V0U3lzdGVtSUQoKTsKLQkvLyBpZiAocHVibGljSUQgPT0gbnVsbCB8fCBwdWJsaWNJRC5lcXVhbHMoIiIpKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlNZU1RFTSAiKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlBVQkxJQyBcIiIpLmFwcGVuZChwdWJsaWNJRCkuYXBwZW5kKCJcIiAiKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGlmIChzeXN0ZW1JRD09bnVsbCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCJcIlwiIik7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JRCkuYXBwZW5kKCJcIiIpOwotCS8vIH0KLQkvLyBlbmRUYWcoKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JLy8gc3VwZXIudmlzaXREVEROb3RhdGlvbihub3RhdGlvbik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbnRpdHlHZW4oRFRERW50aXR5IGVudGl0eSkgewotCS8vCi0JLy8gZ2VuZXJhdGVDb21tZW50KGVudGl0eSk7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoZW50aXR5LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCI8IUVOVElUWSAiKTsKLQkvLwotCS8vCi0JLy8gaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHNiLmFwcGVuZCgiJSAiKTsKLQkvLwotCS8vCi0JLy8gc2IuYXBwZW5kKGVudGl0eS5nZXROYW1lKCkpLmFwcGVuZCgiICIpOwotCS8vIHNiLmFwcGVuZChlbnRpdHkuZ2V0Q29udGVudCgpLnVucGFyc2UoKSk7Ci0JLy8KLQkvLwotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JLy8gc3VwZXIudmlzaXREVERFbnRpdHkoZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRHZW4oRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQoZWxlbWVudCk7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiPCFFTEVNRU5UICIgKyBlbGVtZW50LmdldE5hbWUoKSk7Ci0JLy8gRFRERWxlbWVudENvbnRlbnQgY29udGVudCA9IGVsZW1lbnQuZ2V0Q29udGVudCgpOwotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCB8fAotCS8vIGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCIgKCIpOwotCS8vIHN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQkvLyBzYi5hcHBlbmQoIikiKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCIgIik7Ci0JLy8gc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCS8vIH0gLy8gZW5kIG9mIGVsc2UKLQkvLyBlbmRUYWcoKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyB2aXNpdEF0dHJpYnV0ZXMoZWxlbWVudCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQKLQkvLyB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUdlbihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLQkvLyBwYXJtRW50aXR5KSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQocGFybUVudGl0eSk7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiJSIgKyBwYXJtRW50aXR5LmdldE5hbWUoKSArICI7XG4iKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lCi0JLy8gY2hhcgotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnRHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCS8vCi0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCS8vIFN0cmluZyB0cmFpbGluZ0NoYXJzID0gIiI7Ci0JLy8gaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCApCi0JLy8gewotCS8vIERURFJlcGVhdGFibGVDb250ZW50IHJlcGVhdENvbnRlbnQgPSAoRFREUmVwZWF0YWJsZUNvbnRlbnQpIGNvbnRlbnQ7Ci0JLy8gSW50ZWdlciBvY2N1cnJlbmNlID0gcmVwZWF0Q29udGVudC5nZXRPY2N1cnJlbmNlKCk7Ci0JLy8gaWYgKG9jY3VycmVuY2UgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gaW50IG9jY3VyVHlwZSA9IG9jY3VycmVuY2UuaW50VmFsdWUoKTsKLQkvLyBpZiAob2NjdXJUeXBlICE9IERURE9jY3VycmVuY2VUeXBlLk9ORSkKLQkvLyB7Ci0JLy8gaWYgKHJlcGVhdENvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIigiKTsKLQkvLyB0cmFpbGluZ0NoYXJzID0gIikiOwotCS8vIH0KLQkvLyB0cmFpbGluZ0NoYXJzICs9IChjaGFyKSBvY2N1clR5cGU7Ci0JLy8gfQotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyAgICAKLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkKLQkvLyB7Ci0JLy8gc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCB8fAotCS8vIGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoKChEVERSZXBlYXRhYmxlQ29udGVudCljb250ZW50KS51bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIC8vIGhhbmRsZSBEVERQQ0RhdGFDb250ZW50LCBEVERBbnlDb250ZW50IGFuZCBEVERFbXB0eUNvbnRlbnQgaGVyZQotCS8vIHNiLmFwcGVuZChjb250ZW50LmdldENvbnRlbnROYW1lKCkpOwotCS8vIH0gLy8gZW5kIG9mIGVsc2UKLQkvLyBzYi5hcHBlbmQodHJhaWxpbmdDaGFycyk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGNvbnRlbnQsIHNiLmxlbmd0aCgpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgZ3JvdXApIHsKLQkvLwotCS8vIHNiLmFwcGVuZCgiKCIpOwotCS8vICAgIAotCS8vIEludGVnZXIgZ3JvdXBLaW5kID0gZ3JvdXAuZ2V0R3JvdXBLaW5kKCk7Ci0JLy8gaWYgKGdyb3VwS2luZCA9PSBudWxsKQotCS8vIHsKLQkvLyBncm91cC5zZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kLlNFUVVFTkNFKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vICAgIAotCS8vIFN0cmluZyBjb24gPSBncm91cC5nZXRHcm91cEtpbmQoKS5pbnRWYWx1ZSgpID09IERUREdyb3VwS2luZC5DSE9JQ0UgPyAiCi0JLy8gfCAiIDogIiwgIjsKLQkvLwotCS8vCi0JLy8gLy8gTG9vcCB0aHJ1IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBncm91cAotCS8vIENvbGxlY3Rpb24gY29udGVudCA9IGdyb3VwLmdldENvbnRlbnQoKTsKLQkvLyBpZiAoY29udGVudCAhPSBudWxsKQotCS8vIHsKLQkvLyBib29sZWFuIGZpcnN0Q29udGVudCA9IHRydWU7Ci0JLy8gZm9yIChJdGVyYXRvciBpID0gY29udGVudC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCS8vIHsKLQkvLyBpZiAoIWZpcnN0Q29udGVudCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKGNvbik7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIGZpcnN0Q29udGVudCA9IGZhbHNlOwotCS8vIH0gLy8gZW5kIG9mIGVsc2UKLQkvLyB2aXNpdERUREVsZW1lbnRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCkpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHNiLmFwcGVuZCgiKSIpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0QXR0cmlidXRlc0dlbihEVERFbGVtZW50IGVsZW0pIHsKLQkvLwotCS8vIENvbGxlY3Rpb24gYXR0cnMgPSBlbGVtLmdldERUREF0dHJpYnV0ZSgpOwotCS8vIEl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCS8vIGlmIChhdHRycyAhPSBudWxsICYmIGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERBdHRyaWJ1dGUgYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JLy8gU3RyaW5nIGNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCS8vIGlmIChjb21tZW50IT1udWxsICYmIGNvbW1lbnQubGVuZ3RoKCk+MCkKLQkvLyBzYi5hcHBlbmQoIjwhLS1cbiAiKS5hcHBlbmQoY29tbWVudCkuYXBwZW5kKCJcbi0tPlxuIik7Ci0JLy8gc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7Ci0JLy8gc2IuYXBwZW5kKCIgIik7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKGF0dHJpYi51bnBhcnNlKCkpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIlxuIik7Ci0JLy8gZm9yICg7IGkuaGFzTmV4dCgpOyApCi0JLy8gewotCS8vIGF0dHJpYiA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCS8vIGNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCS8vIGlmIChjb21tZW50IT1udWxsICYmIGNvbW1lbnQubGVuZ3RoKCk+MCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCI+XG4iKTsKLQkvLyBpZiAoY29tbWVudCE9bnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpPjApCi0JLy8gc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOwotCS8vIHNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOwotCS8vIH0KLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiXG4iKTsKLQkvLyB9Ci0JLy8gc2IuYXBwZW5kKCI+XG4iKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZW5kVGFnR2VuKCkgewotCS8vCi0JLy8gc2IuYXBwZW5kKCI+XG4iKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGFydE9mZnNldEdlbihEVERTb3VyY2VPZmZzZXQgbywgaW50IG9mZnNldCkgewotCS8vCi0JLy8gaWYgKHVwZGF0ZU9mZnNldCkKLQkvLyB7Ci0JLy8gby5zZXRTdGFydE9mZnNldChvZmZzZXQpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW5kT2Zmc2V0R2VuKERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JLy8KLQkvLyBpZiAodXBkYXRlT2Zmc2V0KQotCS8vIHsKLQkvLyBvLnNldEVuZE9mZnNldChvZmZzZXQpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVDb21tZW50R2VuKERURE9iamVjdCBkdGRPYmplY3QpIHsKLQkvLwotCS8vIFN0cmluZyBjb21tZW50U3RyaW5nID0gbnVsbDsKLQkvLwotCS8vCi0JLy8gaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpCi0JLy8gY29tbWVudFN0cmluZyA9ICgoRFRERWxlbWVudClkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkvLyBlbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JLy8gY29tbWVudFN0cmluZyA9ICgoRFRERW50aXR5KWR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCS8vIGVsc2UgaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERURE5vdGF0aW9uKQotCS8vIGNvbW1lbnRTdHJpbmcgPSAoKERURE5vdGF0aW9uKWR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGNvbW1lbnRTdHJpbmchPW51bGwgJiYgY29tbWVudFN0cmluZy5sZW5ndGgoKT4wKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIjwhLS0iKS5hcHBlbmQoY29tbWVudFN0cmluZykuYXBwZW5kKCItLT5cbiIpOwotCS8vIH0KLQkvLyB9Ci19Ly8gRFREUHJpbnRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTJhYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIERURFJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQlwdWJsaWMgRFREUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiBuZXcgRFREUmVzb3VyY2VJbXBsKGZpbGVuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IERURFJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCByZXNvdXJjZXMsIFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgRFREUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBEVERSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzb3VyY2VzLmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoVVJJIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmVzb3VyY2UubG9hZChuZXcgSGFzaE1hcCgpKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBsb2FkKHJlc291cmNlcywgdXJpLCBuZXcgSGFzaE1hcCgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFVSSSB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZChyZXNvdXJjZXMsIHVyaSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VzLCB1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBVUkkgdXJpLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VzLCB1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotfSAvLyBEVERSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OWRhNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUmVzb3VyY2VJbXBsIGV4dGVuZHMgUmVzb3VyY2VJbXBsIHsKLQotCXB1YmxpYyBEVERSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERURFJlc291cmNlSW1wbChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJc3VwZXIoVVJJLmNyZWF0ZVVSSShmaWxlbmFtZSkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj4+Pj4gRFREUmVzb3VyY2VJbXBsIGN0b3IgMSIpOwotCX0KLQotCXB1YmxpYyBEVERSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj4+Pj4gRFREUmVzb3VyY2VJbXBsIGN0b3IgMiIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdCBmb3IgdGhlIGdpdmVuIFVSSQotCSAqIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9LgotCSAqIDxwPgotCSAqIFRoZSBmcmFnbWVudCBlbmNvZGluZyB3aWxsIHR5cGljYWxseSBiZSB0aGF0IHByb2R1Y2VkIGJ5Ci0JICoge0BsaW5rICNnZXRVUklGcmFnbWVudCBnZXRVUklGcmFnbWVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB1cmlGcmFnbWVudAotCSAqICAgICAgICAgICAgdGhlIGZyYWdtZW50IHRvIHJlc29sdmUuCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZnJhZ21lbnQuCi0JICogQHNlZSAjZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNnZXRFT2JqZWN0KFVSSSwgYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNyZXNvbHZlKEVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZU9iamVjdEZvclVSSUZyYWdtZW50U2VnbWVudChTdHJpbmcpCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgbmF2aWdhdGluZyB0aGUgZnJhZ21lbnQuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIHVyaUZyYWdtZW50KSB7Ci0JCUVMaXN0IGNvbnRlbnRzID0gZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCS8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBEVERGaWxlIGluIGEgRFREIGV4dGVudAotCQkJCQlFT2JqZWN0IHJlc3VsdCA9ICgoRFRERmlsZSkgb2JqKS5maW5kT2JqZWN0KHVyaUZyYWdtZW50KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gRFRES2V5IEVycm9yOiBjYW5ub3QgZmluZCBvYmplY3QgIiArIHVyaUZyYWdtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9IHRoYXQsIHdoZW4gcGFzc2VkIHRvCi0JICoge0BsaW5rICNnZXRFT2JqZWN0IGdldEVPYmplY3R9IHdpbGwgcmV0dXJuIHRoZSBnaXZlbiBvYmplY3QuCi0JICogPHA+Ci0JICogSW4gb3RoZXIgd29yZHMsIHRoZSBmb2xsb3dpbmcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGFueSBvYmplY3QKLQkgKiBjb250YWluZWQgYnkgYSByZXNvdXJjZToKLQkgKiAKLQkgKiA8cHJlPgotCSAqIAotCSAqICAgIFJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkgKiAgICBlT2JqZWN0ID09IHJlc291cmNlLmdldEVPYmplY3QocmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQoZU9iamVjdCkpCi0JICogCi0JICogPC9wcmU+Ci0JICogCi0JICogQW4gaW1wbGVtZW50YXRpb24gbWF5IGNob29zZSB0byB1c2UgSURzIG9yIHRvIHVzZSBzdHJ1Y3R1cmVkIFVSSQotCSAqIGZyYWdtZW50cywgYXMgc3VwcG9ydGVkIGJ5Ci0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZVVSSUZyYWdtZW50U2VnbWVudCBlVVJJRnJhZ21lbnRTZWdtZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gaWRlbnRpZnkuCi0JICogQHJldHVybiB0aGUgVVJJIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9IGZvciB0aGUgb2JqZWN0LgotCSAqIEBzZWUgI2dldEVPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlVVJJRnJhZ21lbnRTZWdtZW50KG9yZy5lY2xpcHNlLmVtZi5jb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwKLQkgKiAgICAgIEVPYmplY3QpCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRFRET2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChEVERPYmplY3QpIGVPYmplY3QpLmdldFBhdGhuYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFVSSUZyYWdtZW50KGVPYmplY3QpOwotCX0KLQotCXByaXZhdGUgRFREVXRpbCBkdGRVdGlsOwotCi0JcHVibGljIERURFV0aWwgZ2V0RFREVXRpbCgpIHsKLQkJcmV0dXJuIGR0ZFV0aWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RFREVXRpbChEVERVdGlsIGR0ZFV0aWwpIHsKLQkJdGhpcy5kdGRVdGlsID0gZHRkVXRpbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB7Ci0KLQkJU3RyaW5nIHVyaVN0cmluZyA9IGdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCXRyeSB7Ci0JCQlEVERVdGlsIGR0ZFV0aWwgPSBuZXcgRFREVXRpbCgpOwotCQkJZHRkVXRpbC5wYXJzZShnZXRSZXNvdXJjZVNldCgpLCB1cmlTdHJpbmcpOwotCQkJZHRkVXRpbC5zZXRSZXNvdXJjZSh0aGlzKTsKLQkJCXNldERURFV0aWwoZHRkVXRpbCk7Ci0JCQlnZXRDb250ZW50cygpLmFkZChkdGRVdGlsLmdldERUREZpbGUoKSk7Ci0KLQkJCS8vIFJlc2V0IHRoZSBkaXJ0eSBmbGFnIGFmdGVyIHRoZSByZXNvdXJjZSBpcyBsb2FkZWQKLQkJCXNldE1vZGlmaWVkKGZhbHNlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MsIE9iamVjdCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlEVERQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcih0cnVlKTsKLQkJCQkJCXByaW50ZXIudmlzaXREVERGaWxlKChEVERGaWxlKSBvYmopOwotCi0JCQkJCQlTdHJpbmcgcyA9IHByaW50ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQkJCQkJCW9zLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCQkvLyBSZXNldCB0aGUgZGlydHkgZmxhZyBhZnRlciB0aGUgcmVzb3VyY2UgaXMgc2F2ZWQKLQkJCQkJCXNldE1vZGlmaWVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFppcE91dHB1dFN0cmVhbSB6b3MsIFN0cmluZyBlbnRyeSwgU3RyaW5nIG1ldGFNb2RlbE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRXhjZXB0aW9uKERURENvcmVNZXNzYWdlcy5fRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3YjEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEVERQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBEVERTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVCA6IHsKLQkJCQkJRFRER3JvdXBDb250ZW50IGR0ZEdyb3VwQ29udGVudCA9IChEVERHcm91cENvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRER3JvdXBDb250ZW50KGR0ZEdyb3VwQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChkdGRHcm91cENvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkR3JvdXBDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFIDogewotCQkJCQlEVERBdHRyaWJ1dGUgZHRkQXR0cmlidXRlID0gKERUREF0dHJpYnV0ZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERBdHRyaWJ1dGUoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVBdHRyaWJ1dGUoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UIDogewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSAoRFRERWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbGVtZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzKGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlQgOiB7Ci0JCQkJCURUREVtcHR5Q29udGVudCBkdGRFbXB0eUNvbnRlbnQgPSAoRFRERW1wdHlDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVtcHR5Q29udGVudChkdGRFbXB0eUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkRW1wdHlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlQgOiB7Ci0JCQkJCURUREFueUNvbnRlbnQgZHRkQW55Q29udGVudCA9IChEVERBbnlDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREFueUNvbnRlbnQoZHRkQW55Q29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRBbnlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UIDogewotCQkJCQlEVERQQ0RhdGFDb250ZW50IGR0ZHBjRGF0YUNvbnRlbnQgPSAoRFREUENEYXRhQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERQQ0RhdGFDb250ZW50KGR0ZHBjRGF0YUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkcGNEYXRhQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgOiB7Ci0JCQkJCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50ID0gKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURFJlcGVhdGFibGVDb250ZW50KGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRSA6IHsKLQkJCQkJRFRERmlsZSBkdGRGaWxlID0gKERUREZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERmlsZShkdGRGaWxlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRSA6IHsKLQkJCQkJRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZSA9IChEVERCYXNpY1R5cGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREQmFzaWNUeXBlKGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3MoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEUgOiB7Ci0JCQkJCURUREVudW1lcmF0aW9uVHlwZSBkdGRFbnVtZXJhdGlvblR5cGUgPSAoRFRERW51bWVyYXRpb25UeXBlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVudW1lcmF0aW9uVHlwZShkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUVudW0oZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVEYXRhVHlwZShkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT04gOiB7Ci0JCQkJCURURE5vdGF0aW9uIGR0ZE5vdGF0aW9uID0gKERURE5vdGF0aW9uKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURURE5vdGF0aW9uKGR0ZE5vdGF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURENvbnRlbnQoZHRkTm90YXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFkgOiB7Ci0JCQkJCURUREVudGl0eSBkdGRFbnRpdHkgPSAoRFRERW50aXR5KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVudGl0eShkdGRFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGRFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFkgOiB7Ci0JCQkJCURUREV4dGVybmFsRW50aXR5IGR0ZEV4dGVybmFsRW50aXR5ID0gKERUREV4dGVybmFsRW50aXR5KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREV4dGVybmFsRW50aXR5KGR0ZEV4dGVybmFsRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVudGl0eUNvbnRlbnQoZHRkRXh0ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFkgOiB7Ci0JCQkJCURUREludGVybmFsRW50aXR5IGR0ZEludGVybmFsRW50aXR5ID0gKERUREludGVybmFsRW50aXR5KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREludGVybmFsRW50aXR5KGR0ZEludGVybmFsRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVudGl0eUNvbnRlbnQoZHRkSW50ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA6IHsKLQkJCQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVCA6IHsKLQkJCQkJRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50ID0gKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudChkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURFJlcGVhdGFibGVDb250ZW50KGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERGaWxlKERUREZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURE5vdGF0aW9uKERURE5vdGF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERDb250ZW50KERURENvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eShEVERFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eUNvbnRlbnQoRFRERW50aXR5Q29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERXh0ZXJuYWxFbnRpdHkoRFRERXh0ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREludGVybmFsRW50aXR5KERUREludGVybmFsRW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFJlcGVhdGFibGVDb250ZW50KERURFJlcGVhdGFibGVDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudChEVERFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQW55Q29udGVudChEVERBbnlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQQ0RhdGFDb250ZW50KERURFBDRGF0YUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREdyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudW1lcmF0aW9uVHlwZShEVERFbnVtZXJhdGlvblR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREJhc2ljVHlwZShEVERCYXNpY1R5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLyAvLyBwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZXNwYWNlKEVOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzKEVDbGFzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFRW51bShFRW51bSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVEYXRhVHlwZShFRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLyAvLyBwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcm5hbEVDbGFzc2lmaWVyKEludGVybmFsRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy8gRFREU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyZjZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREVW5pcXVlTmFtZUhlbHBlciB7Ci0JcHVibGljIERURFVuaXF1ZU5hbWVIZWxwZXIoKSB7Ci0KLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZWxlbWVudHMsICJOZXdFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVFbnRpdHlOYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IGVudGl0aWVzID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVudGl0aWVzLCAiTmV3RW50aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOb3RhdGlvbk5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3Qgbm90YXRpb25zID0gZHRkRmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUobm90YXRpb25zLCAiTmV3Tm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUF0dHJpYnV0ZU5hbWUoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJcmV0dXJuICgoRFRERWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQlyZXR1cm4gKChEVERFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERURE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChEVEROb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFREQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChEVERBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lR2VuKERUREZpbGUgZHRkRmlsZSkgewotCi0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUVudGl0eU5hbWVHZW4oRFRERmlsZSBkdGRGaWxlKSB7Ci0KLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUubGlzdERUREVudGl0eSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZUdlbihEVERGaWxlIGR0ZEZpbGUpIHsKLQotCQlMaXN0IG5vdGF0aW9ucyA9IGR0ZEZpbGUubGlzdERURE5vdGF0aW9uKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlQXR0cmlidXRlTmFtZUdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoYXR0cnMsICJOZXdBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVOYW1lR2VuKExpc3Qgb2JqcywgU3RyaW5nIHRva2VuKSB7Ci0KLQkJaW50IGNvdW50ZXIgPSAxOwotCi0JCWJvb2xlYW4gdW5pcXVlTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoIXVuaXF1ZU5hbWUpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gdG9rZW4gKyBuZXcgSW50ZWdlcihjb3VudGVyKyspOwotCQkJdW5pcXVlTmFtZSA9IHRydWU7Ci0JCQlJdGVyYXRvciBpdGVyID0gb2Jqcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBvYmpOYW1lID0gZ2V0TmFtZShvYmopOwotCQkJCWlmIChvYmpOYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQl1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1bmlxdWVOYW1lKSB7Ci0JCQkJcmV0dXJuIG5ld05hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlCi0JCXJldHVybiAiTm8gTmFtZSBmb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZUdlbihPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCXJldHVybiAoKERUREVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVudGl0eSkgewotCQkJcmV0dXJuICgoRFRERW50aXR5KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVEROb3RhdGlvbikgewotCQkJcmV0dXJuICgoRFRETm90YXRpb24pIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREF0dHJpYnV0ZSkgewotCQkJcmV0dXJuICgoRFREQXR0cmlidXRlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ly8gRFREVW5pcXVlTmFtZUhlbHBlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGFiMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVycm9yTWVzc2FnZTsKLQotLyoqCi0gKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSB0aGUgcGFyc2VkIERURCBJZiBubyBEVEQgZmlsZSBpcyBzcGVjaWZlZCwgY3JlYXRlCi0gKiB0aGUgcm9vdCBNT0Ygb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERVdGlsIHsKLQlEVERGYWN0b3J5IGZhY3Rvcnk7Ci0JRUxpc3QgZXh0ZW50OwotCVJlc291cmNlIHJlc291cmNlOwotCURUREZpbGUgZHRkRmlsZTsKLQlTdHJpbmcgZHRkTW9kZWxGaWxlOwotCWJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQotCXByaXZhdGUgSGFzaHRhYmxlIGV4dGVybmFsRFRETW9kZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIHBlUG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbGVtZW50UG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgRFREUGFyc2VyIHBhcnNlcjsKLQotCXByaXZhdGUgVmVjdG9yIGVycm9yTXNncyA9IG5ldyBWZWN0b3IoKTsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSB1dGlsQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlzdGF0aWMgcHVibGljIERURFV0aWwgZ2V0RFREVXRpbEZvcihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJRFREVXRpbCB1dGlsID0gKERURFV0aWwpIHV0aWxDYWNoZS5nZXQoZmlsZW5hbWUpOwotCQlpZiAodXRpbCA9PSBudWxsKSB7Ci0JCQl1dGlsID0gbmV3IERURFV0aWwoKTsKLQkJCXV0aWxDYWNoZS5wdXQoZmlsZW5hbWUsIHV0aWwpOwotCQl9Ci0KLQkJcmV0dXJuIHV0aWw7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgdXJpKSB7Ci0JCXBhcnNlKG5ldyBSZXNvdXJjZVNldEltcGwoKSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgcGFyc2UgdG8gcGFyc2UgYSAuZHRkIGZpbGUgaW50byBhIE1PRiBvYmplY3QgbW9kZWwgVGhpcyBpcwotCSAqIGludm9rZWQgYnkgdGhlIFJlZ2lzdGVyZWREVERQYXJzZXIgdGhhdCByZWdpc3RlcnMgdGhpcyBwYXJzZXIgZm9yIE1PRgotCSAqIHRvIHVzZSBhZ2FpbnN0IHRoZSAuZHRkIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmVkIG5hbWUgb2YgYSAuZHRkIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyBmaWxlbmFtZSkgewotCQkvLyBHZXQgdGhlIGR0ZCBuYW1lIGZyb20gdGhlIGZpbGUgbmFtZQotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0JCUlQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCi0JCXRyeSB7Ci0JCQlwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGZhbHNlKTsKLQkJCWlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCQkJcGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JCQl9Ci0JCQlwYXJzZXIucGFyc2UoZmlsZW5hbWUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQl9Ci0KLQkJZHRkTW9kZWxGaWxlID0gZmlsZW5hbWU7Ci0KLQkJZmFjdG9yeSA9IERUREZhY3RvcnlJbXBsLmluc3RhbmNlKCk7Ci0KLQkJZXh0ZW50ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQotCQlkdGRGaWxlID0gZmFjdG9yeS5jcmVhdGVEVERGaWxlKCk7Ci0JCWV4dGVudC5hZGQoZHRkRmlsZSk7Ci0KLQkJZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCi0JCXBvcHVsYXRlRFREKHJlc291cmNlcywgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JfQotCi0JcHVibGljIERUREZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRQRVBvb2woKSB7Ci0JCXJldHVybiBwZVBvb2w7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UG9vbCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRQb29sOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIGV4dGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRleHBhbmRFbnRpdHlSZWZlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxEaXJ0eSgpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIC5kdGQgZmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmUoKSB7Ci0JCXRyeSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG1vZGVsIGV4Y2VwdGlvbiAiICsgZXgpOyAvLyROT04tTkxTLTEkCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhdmVBcyhTdHJpbmcgbmV3RmlsZW5hbWUpIHsKLQkJcmVzb3VyY2Uuc2V0VVJJKFVSSS5jcmVhdGVVUkkobmV3RmlsZW5hbWUpKTsKLQkJYm9vbGVhbiBvayA9IHNhdmUoKTsKLQotCQlpZiAob2spIHsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKG5ld0ZpbGVuYW1lKTsKLQkJCUlQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQotCQkJZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlRFRERmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl0cnkgewotCQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpLCB0cnVlKTsKLQkJCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKHRydWUpOwotCQkJcHJpbnRlci52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0KLQkJCVN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQkJcHcucHJpbnRsbihzKTsKLQkJCXB3LmNsb3NlKCk7Ci0JCX0KLQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREVERTb3VyY2UoYm9vbGVhbiBpbmNsdWRlRXJyb3IpIHsKLQkJcmV0dXJuIGR0ZEZpbGUudW5wYXJzZShpbmNsdWRlRXJyb3IpOyAvLyB0cnVlID0gaW5jbHVkZSBlcnJvciBsaW5lcwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURURChSZXNvdXJjZVNldCByZXNvdXJjZXMsIGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQlWZWN0b3IgZHRkTGlzdCA9IHBhcnNlci5nZXREVERMaXN0KCk7Ci0KLQkJLy8gY3JlYXRlIFhNSU1vZGVsIGZvciB0aGUgaW5jbHVkZWQgRFREcwotCQlpZiAoZHRkTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoIWV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCQlmb3IgKGludCBpID0gZHRkTGlzdC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0JCQkJCURURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdChpKTsKLQkJCQkJbG9hZEluY2x1ZGVkRFREKHJlc291cmNlcywgZHRkKTsKLQkJCQl9Ci0KLQkJCQlEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoMCk7Ci0JCQkJcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOyAvLyBwb3B1bGF0ZSB0aGUgbWFpbgotCQkJCQkJCQkJCQkJCQkvLyBEVEQKLQkJCQkvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IGR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCQkJCQlwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7Ci0JCQkJCS8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBpbnN0YW5jZSB1bmlxdWUgdG8gdGhpcyBEVERVdGlsIGZpbGUgdGhhdCByZXByZXNlbnRzIGFuCi0JLy8gZXh0ZXJuYWxseSBsb2FkZWQgZHRkICh3aWxsIGNyZWF0ZSBpZiBvbmUgZG9lc24ndCBleGlzdCB5ZXQpCi0JcHVibGljIEV4dGVybmFsRFRETW9kZWwgZ2V0RXh0ZXJuYWxEVERNb2RlbChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gRGVmYXVsdE1zZ0xvZ2dlci53cml0ZSgiRXh0ZXJuYWwgRFREIG5hbWU6ICIgKyB1cmkpOwotCi0JCWlmIChleHRlcm5hbERURE1vZGVscy5jb250YWluc0tleSh1cmkpKSB7Ci0JCQlyZXR1cm4gKEV4dGVybmFsRFRETW9kZWwpIGV4dGVybmFsRFRETW9kZWxzLmdldCh1cmkpOwotCQl9Ci0JCWVsc2UgewotCQkJRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IG5ldyBFeHRlcm5hbERURE1vZGVsKCk7Ci0JCQlpZiAoZXh0TW9kZWwubG9hZE1vZGVsKHJlc291cmNlcywgdXJpKSkgewotCQkJCWV4dGVybmFsRFRETW9kZWxzLnB1dCh1cmksIGV4dE1vZGVsKTsKLQkJCQlyZXR1cm4gZXh0TW9kZWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gbG9hZCB4bWlNb2RlbHMgZm9yIGluY2x1ZGVkIERURHMKLQlwcml2YXRlIHZvaWQgbG9hZEluY2x1ZGVkRFREKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCkgewotCQlFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsIGR0ZC5nZXROYW1lKCkpOwotCQlpZiAoZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gbm93IGZpbGwgb3VyIGhhc2ggdGFibGVzIGZvciBlbGVtZW50cyBhbmQgcGFyYW1ldGVyIGVudGl0aWVzCi0JCQkvLyBzbyB0aGF0IHdlIGtub3cgd2hhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdXIgbWFpbiBkdGQKLQkJCURUREZpbGUgZmlsZSA9IGV4dE1vZGVsLmdldEV4dGVybmFsRFRERmlsZSgpOwotCQkJQ29sbGVjdGlvbiBlbGVtZW50TGlzdCA9IGZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJCUNvbGxlY3Rpb24gZW50aXR5TGlzdCA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCi0JCQlJdGVyYXRvciBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkJCQllbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUob2JqZWN0KSwgb2JqZWN0KTsKLQkJCX0KLQotCQkJaSA9IGVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQkJCQkJcGVQb29sLnB1dChnZXRCYXNlTmFtZShlbnRpdHkpLCBlbnRpdHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCSAqIAotCSAqIDEpIHdpbGwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIERURCBNb2Ygb2JqZWN0IGZvciBFbnRpdHlEZWNsLAotCSAqIE5vdGF0aW9uRGVjbCBhbmQgRWxlbWVudERlY2wgZGVjbGFyYXRpb25zIGR1cmluZyB0aGUgMXN0IHBhc3MgMikgRHVyaW5nCi0JICogdGhlIDJuZCBwYXNzLCBpdCB3aWxsIGFkZCB0aGUgY29udGVudE1vZGVsIGFuZCBBdHRsaXN0IHRvIGFsbAotCSAqIEVsZW1lbnREZWNsLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURURChSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkJRFRETW9kZWxCdWlsZGVyIG1vZGVsQnVpbGRlciA9IG5ldyBEVERNb2RlbEJ1aWxkZXIocmVzb3VyY2VzLCB0aGlzLCBkdGQsIGRGaWxlKTsKLQotCQltb2RlbEJ1aWxkZXIudmlzaXREVEQoZHRkKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGVtcHR5RXJyb3JNZXNzYWdlcygpIHsKLQkJZXJyb3JNc2dzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlKEVycm9yTWVzc2FnZSBlcnJvcikgewotCQlpbnQgdmVjdG9yU2l6ZSA9IGVycm9yTXNncy5zaXplKCk7Ci0JCWJvb2xlYW4gYWRkID0gdHJ1ZTsKLQotCQlpZiAodmVjdG9yU2l6ZSAhPSAwKSB7Ci0JCQlpbnQgaW5kZXggPSAwOwotCi0JCQl3aGlsZSAoYWRkID09IHRydWUgJiYgaW5kZXggPCB2ZWN0b3JTaXplKSB7Ci0JCQkJaWYgKCgoRXJyb3JNZXNzYWdlKSBlcnJvck1zZ3MuZWxlbWVudEF0KGluZGV4KSkuZXF1YWxzKGVycm9yKSkgewotCQkJCQlhZGQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGFkZCkgewotCQkJZXJyb3JNc2dzLmFkZEVsZW1lbnQoZXJyb3IpOwotCQl9Ci0JfQotCi0JcHVibGljIFZlY3RvciBnZXRFcnJvcnMoKSB7Ci0JCXJldHVybiBlcnJvck1zZ3M7Ci0JfQotCi0JLy8gVGhpcyBnZXRzIHRoZSBuYW1lIHdpdGhvdXQgYW55IHBzZXVkbyBuYW1lc3BhY2UgcHJlZml4Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoRFRET2JqZWN0IG9iaikgewotCQlyZXR1cm4gZ2V0TmFtZShvYmosIG51bGwpOwotCX0KLQotCS8vIFRoaXMgZ2V0cyB0aGUgbmFtZSB3aXRoIHBzZXVkbyBuYW1lc3BhY2UgcHJlZml4ZXMgaWYgZHRkRmlsZSBpcyBub3QKLQkvLyBudWxsCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShEVERPYmplY3Qgb2JqLCBEVERGaWxlIGR0ZEZpbGUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQlEVERFbnRpdHkgZW50aXR5ID0gKERUREVudGl0eSkgb2JqOwotCQkJaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJiAhZW50aXR5LmdldERUREZpbGUoKS5lcXVhbHMoZHRkRmlsZSkpIHsKLQkJCQluYW1lID0gbmV3IFBhdGgoZW50aXR5LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lICs9ICIlIiArICgoRFRERW50aXR5KSBvYmopLmdldE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIG9iajsKLQkJCWlmIChkdGRGaWxlICE9IG51bGwgJiYgIWVsZW1lbnQuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkgewotCQkJCW5hbWUgPSBuZXcgUGF0aChlbGVtZW50LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lICs9ICgoRFRERWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudENvbnRlbnQpIHsKLQkJCXJldHVybiAoKERUREVsZW1lbnRDb250ZW50KSBvYmopLmdldENvbnRlbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBUeXBlKGludCBncm91cEtpbmQsIGludCBvY2N1cnJlbmNlKSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQlzd2l0Y2ggKGdyb3VwS2luZCkgewotCQkJY2FzZSBEVERHcm91cEtpbmQuU0VRVUVOQ0UgOgotCQkJCXR5cGUgPSAiRFREU2VxdWVuY2UiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIERUREdyb3VwS2luZC5DSE9JQ0UgOgotCQkJCXR5cGUgPSAiRFREQ2hvaWNlIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQkJdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZShpbnQgb2NjdXJyZW5jZSkgewotCQlTdHJpbmcgdHlwZSA9ICJEVERSZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCi0JCXR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChpbnQgb2NjdXJyZW5jZSkgewotCQlyZXR1cm4gIigiICsgKGNoYXIpIG9jY3VycmVuY2UgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcblN0YXJ0aW5nIC4uLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBEdGRVdGlsIGlucHV0ZmlsZS5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWphdmEuaW8uRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKLQotCQlTdHJpbmcgZHRkRmlsZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZHRkRmlsZU5hbWUgPSBpbnB1dEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0KLQkJU3RyaW5nIGR0ZE1vZGVsTmFtZSA9IGR0ZEZpbGVOYW1lOwotCi0JCWlmIChEVERDb25zdGFudHMuRFREX0VYVEVOU0lPTi5lcXVhbHMobmV3IFBhdGgoZHRkRmlsZU5hbWUpLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCWR0ZE1vZGVsTmFtZSA9IG5ldyBQYXRoKGR0ZEZpbGVOYW1lKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJfQotCQlEVERVdGlsIGQybSA9IG5ldyBEVERVdGlsKCk7Ci0JCS8vIFRPRE86IGZpeCBwb3J0Ci0JCS8vIGQybS5wYXJzZShkdGRGaWxlTmFtZSk7Ci0JCXRyeSB7Ci0JCQlkMm0uc2F2ZUFzKGR0ZE1vZGVsTmFtZSArICIuIiArIERURENvbnN0YW50cy5EVERfWE1JX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRocm93biBkdXJpbmcgbW9kZWwgc2F2ZTogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBnZXRQYXRoKCkgewotCQlQYXRoIGN1cnJlbnREVERQYXRoID0gbmV3IFBhdGgoZHRkTW9kZWxGaWxlKTsKLQkJaWYgKGN1cnJlbnREVERQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIGN1cnJlbnREVERQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBEVERVdGlsIGdldERURFV0aWxGb3JHZW4oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyBEVERVdGlsIHV0aWwgPSAoRFREVXRpbCkgdXRpbENhY2hlLmdldChmaWxlbmFtZSk7Ci0JLy8gaWYgKHV0aWwgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gdXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JLy8gdXRpbENhY2hlLnB1dChmaWxlbmFtZSwgdXRpbCk7Ci0JLy8gfQotCS8vICAgIAotCS8vIHJldHVybiB1dGlsOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBhcnNlR2VuKFN0cmluZyB1cmkpIHsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCS8vIHBhcnNlKG5ldyBSZXNvdXJjZVNldEltcGwoKSwgdXJpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBJbnZva2UgcGFyc2UgdG8gcGFyc2UgYSAuZHRkIGZpbGUgaW50byBhIE1PRiBvYmplY3QgbW9kZWwKLQkvLyAqIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgUmVnaXN0ZXJlZERURFBhcnNlciB0aGF0IHJlZ2lzdGVycyB0aGlzIHBhcnNlcgotCS8vIGZvciBNT0YgdG8gdXNlCi0JLy8gKiBhZ2FpbnN0IHRoZSAuZHRkIHR5cGUKLQkvLyAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBmdWxseSBxdWFsaWZlZCBuYW1lIG9mIGEgLmR0ZCBmaWxlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwYXJzZUdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyBmaWxlbmFtZSkgewotCS8vCi0JLy8gLy8gR2V0IHRoZSBkdGQgbmFtZSBmcm9tIHRoZSBmaWxlIG5hbWUKLQkvLyBQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0JLy8gSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkvLyBTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQkvLwotCS8vCi0JLy8gdHJ5Ci0JLy8gewotCS8vIHBhcnNlciA9IG5ldyBEVERQYXJzZXIoZmFsc2UpOwotCS8vIGlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKQotCS8vIHsKLQkvLyBwYXJzZXIuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkvLyB9Ci0JLy8gcGFyc2VyLnBhcnNlKGZpbGVuYW1lKTsKLQkvLyB9Ci0JLy8gY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGR0ZE1vZGVsRmlsZSA9IGZpbGVuYW1lOwotCS8vCi0JLy8KLQkvLyBmYWN0b3J5ID0gRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKTsKLQkvLwotCS8vCi0JLy8gZXh0ZW50ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZSA9IGZhY3RvcnkuY3JlYXRlRFRERmlsZSgpOwotCS8vIGV4dGVudC5hZGQoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIGR0ZEZpbGUuc2V0TmFtZShkdGROYW1lKTsKLQkvLwotCS8vCi0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmFjdG9yeSBnZXRGYWN0b3J5R2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGZhY3Rvcnk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZpbGUgZ2V0RFRERmlsZUdlbigpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0UEVQb29sR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIHBlUG9vbDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGVsZW1lbnRQb29sOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBFTGlzdCBnZXRFeHRlbnRHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXh0ZW50OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHNldFJlc291cmNlR2VuKFJlc291cmNlIHJlc291cmNlKSB7Ci0JLy8KLQkvLyB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlR2VuKFJlc291cmNlIHJlc291cmNlKSB7Ci0JLy8KLQkvLyByZXR1cm4gcmVzb3VyY2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgc2V0ZXhwYW5kRW50aXR5UmVmZXJlbmNlc0dlbihib29sZWFuCi0JLy8gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCS8vCi0JLy8gdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogUmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGhhcyBiZWVuIG1vZGlmaWVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc01vZGVsRGlydHlHZW4oKSB7Ci0JLy8KLQkvLyBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIHJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIFNhdmUgdGhlIC5kdGQgZmlsZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUdlbigpIHsKLQkvLwotCS8vIHRyeQotCS8vIHsKLQkvLyByZXNvdXJjZS5zYXZlKCk7Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIGNhdGNoIChFeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2F2ZSBtb2RlbCBleGNlcHRpb24gIiArIGV4KTsKLQkvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHNhdmVBc0dlbihTdHJpbmcgbmV3RmlsZW5hbWUpIHsKLQkvLwotCS8vIHJlc291cmNlLnNldFVSSShuZXdGaWxlbmFtZSk7Ci0JLy8gYm9vbGVhbiBvayA9IHNhdmUoKTsKLQkvLwotCS8vCi0JLy8gaWYgKG9rKQotCS8vIHsKLQkvLyBQYXRoIHBhdGggPSBuZXcgUGF0aChuZXdGaWxlbmFtZSk7Ci0JLy8gSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkvLyBTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCS8vIH0KLQkvLyByZXR1cm4gb2s7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZURUREZpbGVHZW4oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyBib29sZWFuIHJlc3VsdD10cnVlOwotCS8vIHRyeQotCS8vIHsKLQkvLyBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSksdHJ1ZSk7Ci0JLy8gRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JLy8gcHJpbnRlci52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS5nZXROYW1lKCkudG9TdHJpbmcoKTsKLQkvLyBwdy5wcmludGxuKHMpOwotCS8vIHB3LmNsb3NlKCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JLy8gewotCS8vIHJlc3VsdCA9IGZhbHNlOwotCS8vIH0KLQkvLyByZXR1cm4gcmVzdWx0OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBTdHJpbmcgZ2V0RFREU291cmNlR2VuKGJvb2xlYW4gaW5jbHVkZUVycm9yKSB7Ci0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZS51bnBhcnNlKGluY2x1ZGVFcnJvcik7IC8vIHRydWUgPSBpbmNsdWRlIGVycm9yIGxpbmVzCi0JLy8gfQotCS8vIC8qKgotCS8vICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURUREdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIGJvb2xlYW4KLQkvLyBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JLy8KLQkvLyBWZWN0b3IgZHRkTGlzdCA9IHBhcnNlci5nZXREVERMaXN0KCk7Ci0JLy8KLQkvLwotCS8vIC8vIGNyZWF0ZSBYTUlNb2RlbCBmb3IgdGhlIGluY2x1ZGVkIERURHMKLQkvLyBpZiAoIGR0ZExpc3Quc2l6ZSgpID4gMCkKLQkvLyB7Ci0JLy8gaWYgKCFleHBhbmRFbnRpdHlSZWZlcmVuY2VzKQotCS8vIHsKLQkvLyBmb3IgKGludCBpPWR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+IDA7IGktLSkKLQkvLyB7Ci0JLy8gRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCS8vIGxvYWRJbmNsdWRlZERURChyZXNvdXJjZXMsIGR0ZCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoMCk7Ci0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOyAvLyBwb3B1bGF0ZSB0aGUgbWFpbiBEVEQKLQkvLyAvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGZvciAoaW50IGkgPSBkdGRMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotCS8vIHsKLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOwotCS8vIC8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEV4dGVybmFsRFRETW9kZWwgZ2V0RXh0ZXJuYWxEVERNb2RlbEdlbihSZXNvdXJjZVNldAotCS8vIHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCS8vCi0JLy8gaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpCi0JLy8gewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAgICAgICAKLQkvLyBEZWZhdWx0TXNnTG9nZ2VyLndyaXRlKCJFeHRlcm5hbCBEVEQgbmFtZTogIiArIHVyaSk7Ci0JLy8KLQkvLwotCS8vIGlmIChleHRlcm5hbERURE1vZGVscy5jb250YWluc0tleSh1cmkpKQotCS8vIHsKLQkvLyByZXR1cm4gKEV4dGVybmFsRFRETW9kZWwpIGV4dGVybmFsRFRETW9kZWxzLmdldCh1cmkpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIEV4dGVybmFsRFRETW9kZWwgZXh0TW9kZWwgPSBuZXcgRXh0ZXJuYWxEVERNb2RlbCgpOwotCS8vIGlmIChleHRNb2RlbC5sb2FkTW9kZWwocmVzb3VyY2VzLCB1cmkpKQotCS8vIHsKLQkvLyBleHRlcm5hbERURE1vZGVscy5wdXQodXJpLCBleHRNb2RlbCk7Ci0JLy8gcmV0dXJuIGV4dE1vZGVsOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgbG9hZEluY2x1ZGVkRFRER2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCkgewotCS8vCi0JLy8gRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IGdldEV4dGVybmFsRFRETW9kZWwocmVzb3VyY2VzLAotCS8vIGR0ZC5nZXROYW1lKCkpOwotCS8vIGlmIChleHRNb2RlbCAhPSBudWxsKQotCS8vIHsKLQkvLyAvLyBub3cgZmlsbCBvdXIgaGFzaCB0YWJsZXMgZm9yIGVsZW1lbnRzIGFuZCBwYXJhbWV0ZXIgZW50aXRpZXMKLQkvLyAvLyBzbyB0aGF0IHdlIGtub3cgd2hhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdXIgbWFpbiBkdGQKLQkvLyBEVERGaWxlIGZpbGUgPSBleHRNb2RlbC5nZXRFeHRlcm5hbERUREZpbGUoKTsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRMaXN0ID0gZmlsZS5saXN0RFRERWxlbWVudCgpOwotCS8vIENvbGxlY3Rpb24gZW50aXR5TGlzdCA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCS8vCi0JLy8KLQkvLyBJdGVyYXRvciBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkvLyBlbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUob2JqZWN0KSwgb2JqZWN0KTsKLQkvLyB9Ci0JLy8gICAgICAKLQkvLyBpID0gZW50aXR5TGlzdC5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIGkubmV4dCgpOwotCS8vIGlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8gcGVQb29sLnB1dChnZXRCYXNlTmFtZShlbnRpdHkpLCBlbnRpdHkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCS8vICoKLQkvLyAqIDEpIHdpbGwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIERURCBNb2Ygb2JqZWN0IGZvciBFbnRpdHlEZWNsLAotCS8vIE5vdGF0aW9uRGVjbAotCS8vICogYW5kIEVsZW1lbnREZWNsIGRlY2xhcmF0aW9ucyBkdXJpbmcgdGhlIDFzdCBwYXNzCi0JLy8gKiAyKSBEdXJpbmcgdGhlIDJuZCBwYXNzLCBpdCB3aWxsIGFkZCB0aGUgY29udGVudE1vZGVsIGFuZCBBdHRsaXN0IHRvCi0JLy8gYWxsCi0JLy8gKiBFbGVtZW50RGVjbC4KLQkvLyAqCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURUREdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQsIERUREZpbGUKLQkvLyBkRmlsZSkgewotCS8vCi0JLy8gRFRETW9kZWxCdWlsZGVyIG1vZGVsQnVpbGRlciA9IG5ldyBEVERNb2RlbEJ1aWxkZXIocmVzb3VyY2VzLCB0aGlzLAotCS8vIGR0ZCwgZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBtb2RlbEJ1aWxkZXIudmlzaXREVEQoZHRkKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBlbXB0eUVycm9yTWVzc2FnZXNHZW4oKSB7Ci0JLy8KLQkvLyBlcnJvck1zZ3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvck1lc3NhZ2VHZW4oRXJyb3JNZXNzYWdlIGVycm9yKSB7Ci0JLy8KLQkvLyBpbnQgdmVjdG9yU2l6ZSA9IGVycm9yTXNncy5zaXplKCk7Ci0JLy8gYm9vbGVhbiBhZGQgPSB0cnVlOwotCS8vCi0JLy8KLQkvLyBpZiAodmVjdG9yU2l6ZSAhPSAwKQotCS8vIHsKLQkvLyBpbnQgaW5kZXggPSAwOwotCS8vCi0JLy8KLQkvLyB3aGlsZSAoYWRkID09IHRydWUgJiYgaW5kZXggPCB2ZWN0b3JTaXplKQotCS8vIHsKLQkvLyBpZiAoKChFcnJvck1lc3NhZ2UpIGVycm9yTXNncy5lbGVtZW50QXQoaW5kZXgpKS5lcXVhbHMoZXJyb3IpKQotCS8vIHsKLQkvLyBhZGQgPWZhbHNlOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGluZGV4Kys7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGlmIChhZGQpCi0JLy8gewotCS8vIGVycm9yTXNncy5hZGRFbGVtZW50KGVycm9yKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFZlY3RvciBnZXRFcnJvcnNHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXJyb3JNc2dzOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRFRER2VuKCkgewotCS8vCi0JLy8gU3RyaW5nIHRlbXBEVERGaWxlPWdldFBhdGgoKS50b09TU3RyaW5nKCkrInRlbXBWYWxpZGF0aW5nRmlsZU5hbWUuZHRkIjsKLQkvLyB0cnkKLQkvLyB7Ci0JLy8gc2F2ZURUREZpbGUodGVtcERUREZpbGUpOwotCS8vCi0JLy8KLQkvLyBwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGZhbHNlKTsKLQkvLyBpZiAoRmlsZVV0aWxpdHkuZmlsZUV4aXN0cyh0ZW1wRFRERmlsZSkpCi0JLy8gewotCS8vIHBhcnNlci5wYXJzZSh0ZW1wRFRERmlsZSk7Ci0JLy8gfQotCS8vIFZlY3RvciBkdGRMaXN0ID0gcGFyc2VyLmdldERURExpc3QoKTsKLQkvLyBpZiAoIGR0ZExpc3Quc2l6ZSgpID4gMCkKLQkvLyB7Ci0JLy8gLy8gcmVzZXQgdGhlIGVycm9ycyBhbmQgdXBkYXRlIHdoYXQgd2UgaGF2ZSBpbiB0aGUgZWxlbWVudCBwb29sCi0JLy8gZW1wdHlFcnJvck1lc3NhZ2VzKCk7Ci0JLy8gdXBkYXRlRWxlbWVudEhhc2h0YWJsZSgpOwotCS8vCi0JLy8KLQkvLyAvLyBUT0RPOiBkbyB3ZSBqdXN0IHZhbGlkYXRlIHRoZSBjdXJyZW50IG9uZT8KLQkvLyB2YWxpZGF0ZVdpdGhNb2RlbCgoRFREKWR0ZExpc3QuZWxlbWVudEF0KDApKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotCS8vIHsKLQkvLyBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JLy8gRmlsZVV0aWxpdHkuZGVsZXRlKHRlbXBEVERGaWxlKTsKLQkvLyB9Ci0JLy8gRmlsZVV0aWxpdHkuZGVsZXRlKHRlbXBEVERGaWxlKTsKLQkvLwotCS8vCi0JLy8gcmV0dXJuIGR0ZEZpbGUuaXNQYXJzZUVycm9yKCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVXaXRoTW9kZWxHZW4oRFREIGR0ZCkgewotCS8vCi0JLy8gRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCS8vIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGUgaW5zdGFuY2VvZiBFbnRpdHlEZWNsICkKLQkvLyB7Ci0JLy8gRW50aXR5RGVjbCBlbnRpdHkgPSAoRW50aXR5RGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gZW50aXR5LmdldEVycm9yTWVzc2FnZSgpOwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkRmlsZS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCApCi0JLy8gewotCS8vIEVsZW1lbnREZWNsIGVsZW0gPSAoRWxlbWVudERlY2wpIGU7Ci0JLy8gRXJyb3JNZXNzYWdlIGVyck1zZyA9IGVsZW0uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpCi0JLy8gZ2V0RWxlbWVudFBvb2woKS5nZXQoZWxlbS5nZXROb2RlTmFtZSgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gY2hlY2tGb3JNaXNzaW5nRWxlbWVudFJlZmVyZW5jZXMoZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTm90YXRpb25EZWNsICkKLQkvLyB7Ci0JLy8gTm90YXRpb25EZWNsIG5vdGF0aW9uID0gKE5vdGF0aW9uRGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gbm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQXR0bGlzdCApCi0JLy8gewotCS8vIEF0dGxpc3QgYXR0TGlzdCA9IChBdHRsaXN0KSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpOwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGNoZWNrRm9yRHVwbGljYXRlSURBdHRyaWJ1dGUoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbGVtZW50SGFzaHRhYmxlR2VuKCkgewotCS8vCi0JLy8gZWxlbWVudFBvb2wuY2xlYXIoKTsKLQkvLyBDcmVhdGVMaXN0SXRlbXMgaXRlbXNIZWxwZXIgPSBuZXcgQ3JlYXRlTGlzdEl0ZW1zKGR0ZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBWZWN0b3IgYWxsRWxlbWVudHMgPSBpdGVtc0hlbHBlci5nZXRFbGVtZW50cygpOwotCS8vIC8vIGdvIHRocm91Z2ggYWxsIHRoZSBkdGRGaWxlcyBhbmQgbGlzdCB0aGUgZWxlbWVudHMKLQkvLyBpbnQgbnVtRWxlbWVudHMgPSBhbGxFbGVtZW50cy5zaXplKCk7Ci0JLy8KLQkvLwotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGFsbEVsZW1lbnRzLmVsZW1lbnRBdChpKTsKLQkvLyBlbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUoZWxlbWVudCksIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbnRpdHlIYXNodGFibGVHZW4oKSB7Ci0JLy8KLQkvLyB1cGRhdGVIYXNoVGFibGUocGVQb29sLCBkdGRGaWxlLmxpc3REVERFbnRpdHkoKSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGFzaFRhYmxlR2VuKEhhc2h0YWJsZSBoLCBDb2xsZWN0aW9uIGR0ZE9iamVjdHMpIHsKLQkvLwotCS8vIGguY2xlYXIoKTsKLQkvLyBJdGVyYXRvciBpID0gZHRkT2JqZWN0cy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIG5hbWUgPSAiIjsKLQkvLyBEVERPYmplY3QgbyA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCS8vIG5hbWUgPSBnZXRCYXNlTmFtZShvKTsKLQkvLyBoLnB1dChuYW1lLG8pOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZUdlbihEVERPYmplY3Qgb2JqKSB7Ci0JLy8KLQkvLyByZXR1cm4gZ2V0TmFtZShvYmosIG51bGwpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE5hbWVHZW4oRFRET2JqZWN0IG9iaiwgRFRERmlsZSBkdGRGaWxlKSB7Ci0JLy8KLQkvLyBTdHJpbmcgbmFtZSA9ICIiOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JLy8gewotCS8vIERUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBvYmo7Ci0JLy8gaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJgotCS8vICFlbnRpdHkuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkKLQkvLyB7Ci0JLy8gbmFtZSA9IG5ldyBQYXRoKGVudGl0eS5nZXREVERGaWxlKCkuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpICsgIjogIjsKLQkvLyB9Ci0JLy8gbmFtZSArPSAiJSIgKyAoKERUREVudGl0eSlvYmopLmdldE5hbWUoKSArICI7IjsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIG9iajsKLQkvLyBpZiAoZHRkRmlsZSAhPSBudWxsICYmCi0JLy8gIWVsZW1lbnQuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkKLQkvLyB7Ci0JLy8gbmFtZSA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7Ci0JLy8gfQotCS8vIG5hbWUgKz0gKChEVERFbGVtZW50KW9iaikuZ2V0TmFtZSgpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50Q29udGVudCkKLQkvLyB7Ci0JLy8gcmV0dXJuICgoRFRERWxlbWVudENvbnRlbnQpIG9iaikuZ2V0Q29udGVudE5hbWUoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIG5hbWU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JNaXNzaW5nRWxlbWVudFJlZmVyZW5jZXNHZW4oRFRERWxlbWVudCBlbGVtZW50KQotCS8vIHsKLQkvLwotCS8vIFN0cmluZyBkdGRTdHJpbmcgPSBudWxsOwotCS8vIGlmICggZWxlbWVudCA9PSBudWxsICkKLQkvLyByZXR1cm47Ci0JLy8KLQkvLwotCS8vIFZlY3RvciBlbGVtZW50UmVmcyA9IG5ldyBWZWN0b3IoKTsKLQkvLyBmaW5kRWxlbWVudFJlZmVyZW5jZXMoZWxlbWVudC5nZXRDb250ZW50KCksZWxlbWVudFJlZnMpOwotCS8vCi0JLy8KLQkvLyBFbnVtZXJhdGlvbiBlbiA9IGVsZW1lbnRSZWZzLmVsZW1lbnRzKCk7Ci0JLy8gd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgZWxlbWVudFJlZk5hbWUgPSAiIjsKLQkvLyBEVERPYmplY3QgZHRkT2JqZWN0ID0gKERURE9iamVjdCkgZW4ubmV4dEVsZW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KQotCS8vIHsKLQkvLyBlbGVtZW50UmVmTmFtZSA9ICgoRFRERWxlbWVudClkdGRPYmplY3QpLmdldE5hbWUoKTsKLQkvLyBpZiAoIGdldEVsZW1lbnRQb29sKCkuZ2V0KGVsZW1lbnRSZWZOYW1lKSA9PSBudWxsKQotCS8vIHsKLQkvLyBpZiAoZHRkU3RyaW5nID09IG51bGwpCi0JLy8gewotCS8vIGR0ZFN0cmluZyA9IGdldERURFNvdXJjZShmYWxzZSk7Ci0JLy8gfQotCS8vIFN0cmluZyBlcnJvck1zZyA9ICJFbGVtZW50IFwiIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIlwiLCByZWZlcnMgdG8KLQkvLyB1bmRlY2xhcmVkIGVsZW1lbnQgIgotCS8vICsgIlwiIiArIGVsZW1lbnRSZWZOYW1lICsgIlwiLCBpbiBjb250ZW50IG1vZGVsLlxuIjsKLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5MaW5lQ29sdW1uIGxpbmVDb2x1bW4gPQotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLm9mZnNldFRvTGluZUNvbHVtbihkdGRTdHJpbmcsCi0JLy8gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckxpbmUobGluZUNvbHVtbi5nZXRMaW5lKCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yQ29sdW1uKGxpbmVDb2x1bW4uZ2V0Q29sdW1uKCkpOwotCS8vIGFkZEVycm9yTWVzc2FnZShkdGRFcnJvcik7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluZEVsZW1lbnRSZWZlcmVuY2VzR2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQsCi0JLy8gVmVjdG9yIHJlc3VsdCkgewotCS8vCi0JLy8KLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyByZXN1bHQuYWRkRWxlbWVudCgoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KWNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gcmVzdWx0LmFkZEVsZW1lbnQoKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KWNvbnRlbnQpLmdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KQotCS8vIHsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXAgPSAoRFRER3JvdXBDb250ZW50KWNvbnRlbnQ7Ci0JLy8gRUxpc3QgY29udGVudHMgPSBncm91cC5nZXRDb250ZW50KCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBmaW5kRWxlbWVudFJlZmVyZW5jZXMoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSwgcmVzdWx0KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGNoZWNrRm9yRHVwbGljYXRlSURBdHRyaWJ1dGVHZW4oKSB7Ci0JLy8KLQkvLyBTdHJpbmcgZHRkU3RyaW5nID0gbnVsbDsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCS8vIEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGkubmV4dCgpOwotCS8vIEl0ZXJhdG9yIGsgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLml0ZXJhdG9yKCk7Ci0JLy8gYm9vbGVhbiBzYXcxc3RJRCA9IGZhbHNlOwotCS8vIHdoaWxlIChrLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFREQXR0cmlidXRlIGF0dHIgPSAoRFREQXR0cmlidXRlKSBrLm5leHQoKTsKLQkvLyBEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JLy8gaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKQotCS8vIHsKLQkvLyBpZiAoICgoRFREQmFzaWNUeXBlKWRUeXBlKS5nZXRLaW5kKCkuaW50VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKQotCS8vIHsKLQkvLyBpZiAoc2F3MXN0SUQpCi0JLy8gewotCS8vIGlmIChkdGRTdHJpbmcgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkU3RyaW5nID0gZ2V0RFREU291cmNlKGZhbHNlKTsKLQkvLyB9Ci0JLy8gU3RyaW5nIGVyck1zZyA9IERURFBsdWdpbi5nZXREVERTdHJpbmcoIl9FUlJPUl9EVVBfSURfQVRUUklCVVRFXzEiKTsKLQkvLyBlcnJNc2cgKz0gYXR0ci5nZXROYW1lKCkgKwotCS8vIERURFBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yIik7Ci0JLy8gICAgICAgICAgICAgIAotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5MaW5lQ29sdW1uIGxpbmVDb2x1bW4gPQotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLm9mZnNldFRvTGluZUNvbHVtbihkdGRTdHJpbmcsCi0JLy8gYXR0ci5nZXRTdGFydE9mZnNldCgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckxpbmUobGluZUNvbHVtbi5nZXRMaW5lKCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yQ29sdW1uKGxpbmVDb2x1bW4uZ2V0Q29sdW1uKCkpOwotCS8vIGR0ZEVycm9yLnNldE9iamVjdChhdHRyKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IpOwotCS8vIC8vIGR0ZEZpbGUuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYXcxc3RJRCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRHcm91cFR5cGVHZW4oaW50IGdyb3VwS2luZCwgaW50IG9jY3VycmVuY2UpCi0JLy8gewotCS8vCi0JLy8gU3RyaW5nIHR5cGUgPSBudWxsOwotCS8vCi0JLy8KLQkvLyBzd2l0Y2ggKGdyb3VwS2luZCkKLQkvLyB7Ci0JLy8gY2FzZSBEVERHcm91cEtpbmQuU0VRVUVOQ0U6Ci0JLy8gdHlwZSA9ICJEVERTZXF1ZW5jZSI7Ci0JLy8gYnJlYWs7Ci0JLy8gY2FzZSBEVERHcm91cEtpbmQuQ0hPSUNFOgotCS8vIHR5cGUgPSAiRFREQ2hvaWNlIjsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JLy8gcmV0dXJuIHR5cGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZUdlbihpbnQgb2NjdXJyZW5jZSkgewotCS8vCi0JLy8gU3RyaW5nIHR5cGUgPSAiRFREUmVmZXJlbmNlIjsKLQkvLyB0eXBlICs9IGdldFJlcGVhdGFibGVUeXBlU3VmZml4KG9jY3VycmVuY2UpOwotCS8vIHJldHVybiB0eXBlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFJlcGVhdGFibGVUeXBlU3VmZml4R2VuKGludCBvY2N1cnJlbmNlKSB7Ci0JLy8KLQkvLyByZXR1cm4gIigiICsgKGNoYXIpb2NjdXJyZW5jZSArICIpIjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbWFpbkdlbihTdHJpbmdbXSBhcmdzKSB7Ci0JLy8KLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU3RhcnRpbmcgLi4uIik7Ci0JLy8KLQkvLwotCS8vIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidXNhZ2U6IER0ZFV0aWwgaW5wdXRmaWxlLmR0ZCIpOwotCS8vCi0JLy8KLQkvLyBqYXZhLmlvLkZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkdGRGaWxlTmFtZSA9ICIiOwotCS8vIHRyeQotCS8vIHsKLQkvLyBkdGRGaWxlTmFtZSA9IGlucHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JLy8gfQotCS8vIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotCS8vIHt9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkdGRNb2RlbE5hbWUgPSBkdGRGaWxlTmFtZTsKLQkvLwotCS8vCi0JLy8gaWYgKERURENvbnN0YW50cy5EVERfRVhURU5TSU9OLmVxdWFscyhuZXcKLQkvLyBQYXRoKGR0ZEZpbGVOYW1lKS5nZXRGaWxlRXh0ZW5zaW9uKCkpKQotCS8vIHsKLQkvLyBkdGRNb2RlbE5hbWU9IG5ldwotCS8vIFBhdGgoZHRkRmlsZU5hbWUpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCS8vIH0KLQkvLyBEVERVdGlsIGQybSA9IG5ldyBEVERVdGlsKCk7Ci0JLy8gLy8gVE9ETzogZml4IHBvcnQKLQkvLyAvLyBkMm0ucGFyc2UoZHRkRmlsZU5hbWUpOwotCS8vIHRyeQotCS8vIHsKLQkvLyBkMm0uc2F2ZUFzKGR0ZE1vZGVsTmFtZSArICIuIiArIERURENvbnN0YW50cy5EVERfWE1JX0VYVEVOU0lPTik7Ci0JLy8gfQotCS8vIGNhdGNoIChFeGNlcHRpb24gZSkKLQkvLyB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gdGhyb3duIGR1cmluZyBtb2RlbCBzYXZlOiAiICsgZSk7Ci0JLy8gfQotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZS4iKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGdldFBhdGhHZW4oKSB7Ci0JLy8KLQkvLyBQYXRoIGN1cnJlbnREVERQYXRoID0gbmV3IFBhdGgoZHRkTW9kZWxGaWxlKTsKLQkvLyBpZiAoY3VycmVudERURFBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCS8vIHsKLQkvLyByZXR1cm4gY3VycmVudERURFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JLy8gfQotCS8vICAgIAotCS8vIHJldHVybiBuZXcgUGF0aCgiIik7Ci0JLy8gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NWE0MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERURFZpc2l0b3IgewotCi0JcHVibGljIERURFZpc2l0b3IoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERGaWxlKERUREZpbGUgZmlsZSkgewotCQlDb2xsZWN0aW9uIG5vdGF0aW9ucyA9IGZpbGUubGlzdERURE5vdGF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5vdGF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRETm90YXRpb24oKERURE5vdGF0aW9uKSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGVudGl0aWVzID0gZmlsZS5saXN0RFRERW50aXR5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGVudGl0aWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVERFbnRpdHkoKERUREVudGl0eSkgaS5uZXh0KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBvYmplY3RzID0gZmlsZS5saXN0RFRERWxlbWVudEFuZERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRET2JqZWN0IG9iamVjdCA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCQl2aXNpdERUREVsZW1lbnQoKERUREVsZW1lbnQpIG9iamVjdCk7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJZWxzZSB7Ci0JCQkJdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRETm90YXRpb24oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eShEVERFbnRpdHkgZW50aXR5KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50KERUREVsZW1lbnQgZWxlbWVudCkgewotCQl2aXNpdERUREVsZW1lbnRDb250ZW50KGVsZW1lbnQuZ2V0Q29udGVudCgpKTsKLQkJdmlzaXREVERBdHRyaWJ1dGVMaXN0KGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ2aXNpdERUREVsZW1lbnRDb250ZW50IDogIiArIGNvbnRlbnQpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJdmlzaXREVERFbXB0eUNvbnRlbnQoKERUREVtcHR5Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREQW55Q29udGVudCgoRFREQW55Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREUENEYXRhQ29udGVudCgoRFREUENEYXRhQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCkgewotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQl2aXNpdERUREdyb3VwQ29udGVudCgoRFRER3JvdXBDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9IC8vIGVuZCBvZiBlbHNlCi0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigib2NjdXJyZW5jZTogIiArCi0JCQkvLyAoY2hhcikoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLmdldE9jY3VycmVuY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVtcHR5Q29udGVudChEVERFbXB0eUNvbnRlbnQgZHRkRW1wdHlDb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogRU1QVFkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREFueUNvbnRlbnQoRFREQW55Q29udGVudCBkdGRBbnlDb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQU5ZIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQQ0RhdGFDb250ZW50KERURFBDRGF0YUNvbnRlbnQgcGNEYXRhQ29udGVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFBDREFUQSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQpIHsKLQkJaWYgKGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREdyb3VwS2luZC5TRVFVRU5DRSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBTZXF1ZW5jZSIpOwotCQl9Ci0JCWVsc2UgLy8gaWYgKGNvbnRlbnRnZXRHcm91cEtpbmQoKSA9PSBEVERHcm91cEtpbmQuQ0hPSUNFKQotCQl7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IENob2ljZSIpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBncm91cENvbnRlbnRzID0gZ3JvdXBDb250ZW50LmdldENvbnRlbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZ3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQXR0cmlidXRlTGlzdChMaXN0IGF0dHJzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJdmlzaXREVERBdHRyaWJ1dGUoKERUREF0dHJpYnV0ZSkgaXRlci5uZXh0KCkpOwotCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERGaWxlR2VuKERUREZpbGUgZmlsZSkgewotCi0JCUNvbGxlY3Rpb24gbm90YXRpb25zID0gZmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbm90YXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVEROb3RhdGlvbigoRFRETm90YXRpb24pIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZW50aXRpZXMgPSBmaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVudGl0eSgoRFRERW50aXR5KSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIG9iamVjdHMgPSBmaWxlLmxpc3REVERFbGVtZW50QW5kRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERPYmplY3Qgb2JqZWN0ID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudCgoRFRERWxlbWVudCkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQllbHNlIHsKLQkJCQl2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURE5vdGF0aW9uR2VuKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbnRpdHlHZW4oRFRERW50aXR5IGVudGl0eSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudEdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQotCQl2aXNpdERUREVsZW1lbnRDb250ZW50KGVsZW1lbnQuZ2V0Q29udGVudCgpKTsKLQkJdmlzaXREVERBdHRyaWJ1dGVMaXN0KGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUdlbihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnRHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidmlzaXREVERFbGVtZW50Q29udGVudCA6ICIgKyBjb250ZW50KTsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCXZpc2l0RFRERW1wdHlDb250ZW50KChEVERFbXB0eUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERBbnlDb250ZW50KSB7Ci0JCQl2aXNpdERUREFueUNvbnRlbnQoKERUREFueUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQl2aXNpdERURFBDRGF0YUNvbnRlbnQoKERURFBDRGF0YUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUmVwZWF0YWJsZUNvbnRlbnQpIHsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQkJdmlzaXREVERHcm91cENvbnRlbnQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQl2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpOwotCQkJfSAvLyBlbmQgb2YgZWxzZQotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm9jY3VycmVuY2U6ICIgKwotCQkJLy8gKGNoYXIpKChEVERSZXBlYXRhYmxlQ29udGVudCljb250ZW50KS5nZXRPY2N1cnJlbmNlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW1wdHlDb250ZW50R2VuKERUREVtcHR5Q29udGVudCBkdGRFbXB0eUNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IEVNUFRZIik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREQW55Q29udGVudEdlbihEVERBbnlDb250ZW50IGR0ZEFueUNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IEFOWSIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURFBDRGF0YUNvbnRlbnRHZW4oRFREUENEYXRhQ29udGVudCBwY0RhdGFDb250ZW50KSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBQQ0RBVEEiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERHcm91cENvbnRlbnRHZW4oRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCkgewotCi0JCWlmIChncm91cENvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERHcm91cEtpbmQuU0VRVUVOQ0UpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogU2VxdWVuY2UiKTsKLQkJfQotCQllbHNlIC8vIGlmIChjb250ZW50Z2V0R3JvdXBLaW5kKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkKLQkJewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBDaG9pY2UiKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZ3JvdXBDb250ZW50cyA9IGdyb3VwQ29udGVudC5nZXRDb250ZW50KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGdyb3VwQ29udGVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVsZW1lbnRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRHZW4oRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRHZW4oRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVMaXN0R2VuKExpc3QgYXR0cnMpIHsKLQotCQlJdGVyYXRvciBpdGVyID0gYXR0cnMuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCXZpc2l0RFREQXR0cmlidXRlKChEVERBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpKTsKLQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVHZW4oRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0V4dGVybmFsRFRETW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9FeHRlcm5hbERURE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzY1MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0V4dGVybmFsRFRETW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci0KLQotLyoqCi0gKiBMb2FkIGFub3RoZXIgRFREIG1vZGVsIC0gdXNlIHdoZW4gdGhlcmUgaXMgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMgZnJvbQotICogYW5vdGhlciBtb2RlbAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxEVERNb2RlbCB7Ci0JRFRERmlsZSBkdGRGaWxlID0gbnVsbDsKLQotCXB1YmxpYyBFeHRlcm5hbERURE1vZGVsKCkgewotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldEV4dGVybmFsRFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgRFREIG1vZGVsIHNwZWNpZmllZCBieSB0aGUgdXJpIGUuZy4KLQkgKiBmaWxlOkM6L2VjbGlwc2UvZXhhbXBsZXMvcHVyY2hhc2VvcmRlci5kdGQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBsb2FkTW9kZWwoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JCWJvb2xlYW4gcmMgPSB0cnVlOwotCi0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gdG9kby4uLiBJbnZlc3RpZ2F0ZSB3aHkgd2UgY2FuIG5vdCBjcmVhdGUgYSBuZXcgRFREVXRpbCB0byBsb2FkCi0JCQkvLyB0aGUgZXh0ZXJuYWwKLQkJCS8vIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGJ2dCB0ZXN0IGJ1Y2tldCBvbiB0aGUgb2FnaXMgY2FzZXMuCi0JCQkvLyBBcmUgZGVwZW5kaW5nIG9uIG1vZidzIGJ1aWx0IGluIGNhY2hpbmcgdmlhCi0JCQkvLyByZXNvdXJjZXMubG9hZCh1cmkpPwotCQkJLy8KLQkJCVVSSSB1cmlPYmogPSBVUkkuY3JlYXRlVVJJKHVyaSk7Ci0JCQlSZXNvdXJjZSByID0gcmVzb3VyY2VzLmNyZWF0ZVJlc291cmNlKHVyaU9iaik7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyLmxvYWQob3B0aW9ucyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlEVERGaWxlIGN1cnJlbnRGaWxlID0gKERUREZpbGUpICgoUmVzb3VyY2UpIGkubmV4dCgpKS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQlTdHJpbmcgY3VycmVudFVSSSA9IGN1cnJlbnRGaWxlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJLy8gbm90ZSA6IG1vZiBzdG9yZXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgdXJpIHRoYW4gdGhlIG9uZSB3ZQotCQkJCS8vIHBhc3NlZCBpbiB0byByZXNvdXJjZXMubG9hZCh1cmkpCi0JCQkJLy8gSW4gdGhlICdmaWxlOicgcHJvdG9jb2wgY2FzZSwgdGhlIGNhbGwKLQkJCQkvLyByZXNvdXJjZS5sb2FkKCJmaWxlOkQ6XHguZHRkIikgd2lsbCBzdG9yZSBhIHJlc291cmNlIHdpdGgKLQkJCQkvLyB1cmkgIkQ6XHguZHRkIi4KLQkJCQkvLyBUaGlzIGlzIHdoeSB3ZSB1c2UgJ2VuZHN3aXRoKCknIGluc3RlYWQgb2YgJ2VxdWFscygpJyB0bwotCQkJCS8vIGNvbXBhcmUuCi0JCQkJaWYgKHVyaS5lbmRzV2l0aChjdXJyZW50VVJJKSkgewotCQkJCQlkdGRGaWxlID0gY3VycmVudEZpbGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkdGRGaWxlID09IG51bGwpIHsKLQkJCQlyYyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJjID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvRFRELmNhdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvRFRELmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5NzI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL0RURC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzODEyICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDUNCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNy41LjAxMDMuMTkyMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJkdGQiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWQ1NzMwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiZHRkIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2Uud3N0LmR0ZCIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEVEQiKSkpDQotICAgIHF1aWQgICAgICAgCSIzODU3QjFDMDAyOTMiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkRUREVsZW1lbnRDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZDU3MzAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiRFRER3JvdXBDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQkVBRUYwMjMyIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRDkyMDM2MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJncm91cEtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGQzlFQzAxODkiDQotCQkgICAgdHlwZSAgICAgICAJIkRUREdyb3VwS2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkNBNTUwMjE2Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREF0dHJpYnV0ZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjE1OTAxREEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REM5QTAxM0IiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlZmF1bHRLaW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFMTQ0QkYwMjYxIg0KLQkJICAgIHR5cGUgICAgICAgCSJEVEREZWZhdWx0S2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ0REMwM0FEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdFZhbHVlU3RyaW5nIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzk2QjlCQkYwMDZCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRET2NjdXJyZW5jZVR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NDMTlBRjAwN0QiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18T05FPTQ5IA0KLXxPUFRJT05BTD02MyBPTkVfT1JfTU9SRT00MyBaRVJPX09SX01PUkU9NDINCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRERWxlbWVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBBRjAyQTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjgzMDI5QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REM4MTAwNjIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbXB0eUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI0NzAzN0EiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwZC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFCRjMwMzI3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREQW55Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjUwMDMwNCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUJFRTAyMDciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERQQ0RhdGFDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCNUMwMTM1Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQkU5MDI3OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCN0QwMDEwIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRDhDMDNBQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFENEMwMUQxIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBREI3MDNDMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvY2N1cnJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdDQzE4QTkwMTQ4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJKVVNUX09ORT0gLTEgIE9ORV9PUl9NT1JFPTQzIE9QVElPTkFMPTYzIFpFUk9fT1JfTU9SRT00MiINCi0JCSAgICB0eXBlICAgICAgIAkiRFRET2NjdXJyZW5jZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxOUFGMDA3RCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJEVERGaWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMDdGMDExOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQkVGMDEyQiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyc2VFcnJvciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMWEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4OEM5OTVGMDI1QiINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVEREZWZhdWx0S2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NERDMDNBRCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJJTVBMSUVEPTEgUkVRVUlSRUQ9MiBGSVhFRD0zIE5PRklYRUQ9NCINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREJhc2ljVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NjRGMDBEQSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjI4MDAzMTUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RTE0NjhBMDAxNiINCi0JCSAgICB0eXBlICAgICAgIAkiRFREQmFzaWNUeXBlS2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ5MDUwMjJDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudW1lcmF0aW9uVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjI4MTAzMDIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVFbnVtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE0NzNFOTAxRDQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJraW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2QUMwM0I4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJEVERFbnVtR3JvdXBLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDlCMjAxQUQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREQmFzaWNUeXBlS2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0OTA1MDIyQyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJOT05FPTAgQ0RBVEE9MSBJRD0yIElEUkVGPTMgSURSRUZTPTQgRU5USVRZPTUgRU5USVRJRVM9NiBOTVRPS0VOPTcgTk1UT0tFTlM9OCINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudW1Hcm91cEtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDlCMjAxQUQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiTkFNRV9UT0tFTl9HUk9VUD0xIE5PVEFUSU9OX0dST1VQPTIiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERHcm91cEtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGQ0E1NTAyMTYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiU0VRVUVOQ0U9MSBDSE9JQ0U9MiINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRURE5vdGF0aW9uIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQwRUYwMEM5Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEUzMDIzNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjg1MDExOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REMwQTAyNEMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwZC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxMDIwMzk3Ig0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWNJRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTBFMDE4QyINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudGl0eSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDEwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBFNzAxRUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4NjAzMDQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDMzcwMDhFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbWV0ZXJFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDEyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDEzQzAxN0UiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW50aXR5Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDEzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTlEMDA4MyINCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIkRUREV4dGVybmFsRW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxRjgwM0UxIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzI0MDBGMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQyRTUwMTYxIg0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWNJRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkVDMDFGNyINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREludGVybmFsRW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQyQkEwMjZFIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzJCMDMyRSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQyQ0IwMjY4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjg3Q0EwMTYzIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEQxMDA3NiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjhBMDI4NyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI5MDBFMDEyNyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTA0NDAxMUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIikpKQ0KLQkob2JqZWN0IENsYXNzICJYTUxTY2hlbWFEZWZpbmVkVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4OUYwQzZEMDEwRSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxOT05FPS0xDQotfFNUUklORz0xDQotfEJPT0xFQU49Mg0KLXxGTE9BVD0zDQotfERPVUJMRT00DQotfERFQ0lNQUw9NQ0KLXxUSU1FSU5TVEFOVD02DQotfFRJTUVEVVJBVElPTj03DQotfFJFQ1VSUklOR0lOU1RBTlQ9OA0KLXxCSU5BUlk9OQ0KLXxVUkk9MTANCi18SU5URUdFUj0xMQ0KLXxEQVRFPTEyDQotfFRJTUU9MTMNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFREQ29udGVudCINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMkI1RTAyREUiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQkVCNkYwMDVEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0NCRUI3MDAwNkQiDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImdyb3VwIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdDQkVCNzAwMEFCIg0KLQkJICAgIGxhYmVsICAgICAgCSJncm91cCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREdyb3VwQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBRUYwMjMyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBkLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQzBFMDBDRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbGVtZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFDMEYwMzlGIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUMwRjAzQTkiDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFGMTEwMDFBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnRSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDExLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUYxQjAyMDkiDQotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnRSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCN0QwMDEwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpDQotCQkob2JqZWN0IFJvbGUgInJlZmVyZW5jZWRFbGVtZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFGMUIwMjBBIg0KLQkJICAgIGxhYmVsICAgICAgCSJyZWZlcmVuY2VkRWxlbWVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDFDOTAyREYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUNBMDMxRCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiY29udGVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUNBMDMyNyINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzQ0MDBFNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJub3RhdGlvbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTctMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzQ1MDIwOSINCi0JCSAgICBsYWJlbCAgICAgIAkibm90YXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVEROb3RhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQwRUYwMEM5Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzQ1MDIxMyINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERXh0ZXJuYWxFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUY4MDNFMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyODk3OTAwNUYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicGFybUVudGl0eVJlZiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI4OTdDMDM1MiINCi0JCSAgICBsYWJlbCAgICAgIAkicGFybUVudGl0eVJlZiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg3Q0EwMTYzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI4OTdDMDM1MyINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjk0RUIwMjQzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVudGl0eVJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWQtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NEVGMDNCQiINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5UmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1MjkwMEUwMTI3Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk0RUYwM0JDIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI5NzJEMDJDQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMC0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk3MzYwMjkxIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTczNjAyOUIiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhCNjhBNzMwMkI4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCNjhBNzgwMDg0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERXh0ZXJuYWxFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUY4MDNFMSIpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEI2OEE3ODAwOEUiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QkQ0OTA4MDEzRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNi0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCRDQ5MTQwMTMwIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJENDkxNDAxNEUiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMkE5NTAwQ0MiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQTk1MDMxMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkE5NTAzMUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTJCQkUwMkRDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkJCRjAxQjEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCQkYwMUJCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOCINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMzBEODAzM0UiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUzMEQ5MDEwNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMzBEOTAxMzciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnVtZXJhdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiINCi0JICAgIHF1aWQgICAgICAgCSIzN0NBQjBFNjAxNzciDQotCSAgICB0aXRsZSAgICAgIAkiTWFpbiINCi0JICAgIHpvb20gICAgICAgCTk4DQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IE5vdGVWaWV3IEAxDQotCQkgICAgbG9jYXRpb24gICAJKDMyNjQsIDI0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDI5MTAsIDY1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNw0KLQkJCW1heF93aWR0aCAgCTY3Mw0KLQkJCWxhYmVsICAgICAgCQ0KLXxEVERFbGVtZW50J3MsIA0KLXxEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UncywgRFRERW50aXR5J3MsIGFuZCBEVEROb3RhdGlvbidzIGFyZSBhZGRlZCB0byBEVERGaWxlJ3MgdXNpbmcgdGhlDQotfG93bmVkRWxlbWVudCByZWxhdGlvbnNoaXANCi18YmV0d2VlbiBNT0ZOYW1lc3BhY2UNCi18YW5kIE1PRk9iamVjdA0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk3MzMNCi0JCSAgICBoZWlnaHQgICAgIAkzNjMpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRESW50ZXJuYWxFbnRpdHkiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDE4NzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxNjQ3LCAxODE3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRESW50ZXJuYWxFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDJCQTAyNkUiDQotCQkgICAgd2lkdGggICAgICAJMzcyDQotCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAxMjAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoNDE3LCAxMTQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg0MTcsIDEyMDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzEpDQotCQkgICAgd2lkdGggICAgICAJMzY4DQotCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTQ4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTM0MSwgMTQzOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiDQotCQkgICAgd2lkdGggICAgICAJMzc2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxNjQwKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1MjAsIDE2NDApDQotCQkJKDE1MjAsIDE1NTApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiIEA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI0ODAsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANg0KLQkJCWxvY2F0aW9uICAgCSgyMTg2LCAxMTY2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg3Q0EwMTYzIg0KLQkJICAgIHdpZHRoICAgICAgCTYwNg0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTIxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJbG9jYXRpb24gICAJKDEyNzAsIDExMzcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMTI3MCwgMTE5NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTUyNSkNCi0JCSAgICB3aWR0aCAgICAgIAk1MTgNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTQ2LCAxMzY2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUM5MDJERiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0IiBAOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NCwgMjQ2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUNBMDMxRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDYsIDEzNjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTQ2LCAxMzA3KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQsIDI0NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSgxNDQzLCAxNDA3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY5OTI0OA0KLQkJCQloZWlnaHQgICAgIAkxMDQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxQ0EwMzI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0NiwgMTM2NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDYsIDE0MjYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDE0MDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyMTgwNA0KLQkJCQloZWlnaHQgICAgIAkyMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk3OCwgMTI1NikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyODk3OTAwNUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFybUVudGl0eVJlZiIgQDE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDYwMiwgNDg4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDIwMzgsIDEyOTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Bhcm1FbnRpdHlSZWYiDQotCQkJCXBjdERpc3QgICAgCTAuMzA1NDE5DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI4OTdDMDM1MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTc4LCAxMjU2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3NywgMTI1NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0MSwgMTIyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODI2NDg0DQotCQkJCWhlaWdodCAgICAgCTI5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHkiIEAxNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDIsIDQ4OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxODYyLCAxMjE3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuNTg5MTA5DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI4OTdDMDM1MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTc4LCAxMjU2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3OSwgMTI1NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyMywgMTMwOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzc2OTIzDQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCIgQDIwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgMTc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjANCi0JCQlsb2NhdGlvbiAgIAkoMTM1MiwgMTMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiZU5hbWVkRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiDQotCQkgICAgd2lkdGggICAgICAJMjkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEAyMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU3NiwgOTYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIxDQotCQkJbG9jYXRpb24gICAJKDQ5MiwgODYzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSINCi0JCSAgICB3aWR0aCAgICAgIAkxODYNCi0JCSAgICBoZWlnaHQgICAgIAkyMTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEFGMDJBOCINCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU3MSwgMTEzMikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTcxLCAxMDY5KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiIEAyMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1NjAsIDg2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIzDQotCQkJbG9jYXRpb24gICAJKDI0MjQsIDgxOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImVOYW1lZEVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5MA0KLQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI0DQotCQkgICAgbG9jYXRpb24gICAJKDI1NjAsIDEwMzYpDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNTYwLCAxMDM2KQ0KLQkJCSgyNTYwLCA5MjEpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEU3MDFFQSINCi0JCSAgICBjbGllbnQgICAgIAlANw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NjksIDExMjUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjksIDEwMzYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjQpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBEMTAwNzYiDQotCQkgICAgY2xpZW50ICAgICAJQDYNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjE4LCAxMTUzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjE4LCAxMDM2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURE5vdGF0aW9uIiBAMjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTkyLCAxMjMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJbG9jYXRpb24gICAJKDgxNywgMTEyOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURE5vdGF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQwRUYwMEM5Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCWxvY2F0aW9uICAgCSg4MTcsIDExODgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzNzEpDQotCQkgICAgd2lkdGggICAgICAJMzY4DQotCQkgICAgaGVpZ2h0ICAgICAJMjMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERXh0ZXJuYWxFbnRpdHkiIEAyOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ0LCAxODcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI4DQotCQkJbG9jYXRpb24gICAJKDExNTgsIDE3OTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFeHRlcm5hbEVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUY4MDNFMSINCi0JCSAgICB3aWR0aCAgICAgIAkzOTANCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBAMjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTY5LCAxNjc3KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzQ0MDBFNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJub3RhdGlvbiIgQDMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNDcsIDIwNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJCWxvY2F0aW9uICAgCSg4MzQsIDEzOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMDMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK25vdGF0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3MDczNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzNDUwMjA5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjksIDE2NzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjksIDEzNDcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyDQotCQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDEzODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3NzkzNA0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5IiBAMzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI0NywgMjA1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0DQotCQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQkJbG9jYXRpb24gICAJKDEwODIsIDE3ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzNDUwMjEzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTY5LCAxNjc3KQ0KLQkJCQkoOTY5LCAxODI3KQ0KLQkJCQkoMTE0OSwgMTgyNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjksIDE2NzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ5LCAxODI3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJCWxvY2F0aW9uICAgCSgxMTA0LCAxODUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NjM1MDENCi0JCQkJaGVpZ2h0ICAgICAJMjYNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzI0MDBGMyINCi0JCSAgICBjbGllbnQgICAgIAlAMjgNCi0JCSAgICBzdXBwbGllciAgIAlANA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNzQsIDE3ODEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzQsIDE2NDApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50IiBAMzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCA4MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNw0KLQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA3NTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIg0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM4DQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDk5MCkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTQ3MiwgOTkwKQ0KLQkJCSgxNDcyLCA4NjIpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCODMwMjlCIg0KLQkJICAgIGNsaWVudCAgICAgCUAzDQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTMyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTksIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCODYwMzA0Ig0KLQkJICAgIGNsaWVudCAgICAgCUA3DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MiwgMTEyNCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1MiwgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4QTAyODciDQotCQkgICAgY2xpZW50ICAgICAJQDYNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ3LCAxMTU0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzQ3LCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSIgQDQyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDQ0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCWxvY2F0aW9uICAgCSgxMjgxLCAzNjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDE0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCWxvY2F0aW9uICAgCSgxMjgxLCA0MjgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MjUpDQotCQkgICAgd2lkdGggICAgICAJNDMyDQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDQzDQotCQkgICAgbG9jYXRpb24gICAJKDM1NCwgMTA0OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEI2OEE3MzAyQjgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEA0NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA5LCAyMDcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCNjhBNzgwMDg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzU0LCAxMDQ5KQ0KLQkJCQkoMzU0LCAxNzgxKQ0KLQkJCQkoMTE0OSwgMTc4MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTQsIDEwNDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ5LCAxNzgxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIiBANDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwOSwgMjA3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDI5NiwgNDUzNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTczMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSINCi0JCQkJcGN0RGlzdCAgICAJLTIuMjgzMzMzDQotCQkJCWhlaWdodCAgICAgCTU5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QjY4QTc4MDA4RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQzDQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM1NCwgMTA0OSkNCi0JCQkJKDM1NCwgNDM5KQ0KLQkJCQkoMTI3MiwgNDM5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM1NCwgMTA0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzIsIDQzOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNTAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NTcxMjkNCi0JCQkJaGVpZ2h0ICAgICAJNjENCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0OA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjA3RjAxMTgiDQotCQkgICAgY2xpZW50ICAgICAJQDQyDQotCQkgICAgc3VwcGxpZXIgICAJQDIwDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4OCwgMzU3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg4LCAyMzMpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBANDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3MiwgNjM4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQkJFMDJEQyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDUwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDkNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xNjIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCQkYwMUIxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCA2MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA1MzkpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3IiBANTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTE2MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQkJGMDFCQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgNjM4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MiwgNzM4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDUxDQotCQkJCWxvY2F0aW9uICAgCSgxNTI2LCA3MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczNjI0OA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnVtZXJhdGlvblR5cGUiIEA1Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDQ4LCA0NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTMNCi0JCQlsb2NhdGlvbiAgIAkoMjE4NCwgMzg1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW51bWVyYXRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCWxvY2F0aW9uICAgCSgyMTg0LCA0NDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1NDYpDQotCQkgICAgd2lkdGggICAgICAJNTQ2DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEA1NA0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTM5LCA0NDkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTMwRDgwMzNFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5IiBANTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ2MSwgLTMxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUzMEQ5MDEwNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDU0DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkzOSwgNDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwNCwgNDQ5KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDU2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTQNCi0JCQkgICAgbG9jYXRpb24gICAJKC00NjEsIC0zMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUzMEQ5MDEzNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDU0DQotCQkJICAgIHN1cHBsaWVyICAgCUA1Mw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkzOSwgNDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3NSwgNDQ5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDU2DQotCQkJCWxvY2F0aW9uICAgCSgyMTIwLCA0ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2NzgzNw0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEUzMDIzNCINCi0JCSAgICBjbGllbnQgICAgIAlAMjcNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY0LCAxMTE2KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY0LCAxMDM2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4NTAxMTgiDQotCQkgICAgY2xpZW50ICAgICAJQDI3DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQxLCAxMTE3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NDEsIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzMkIwMzJFIg0KLQkJICAgIGNsaWVudCAgICAgCUAyDQotCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzgyLCAxODA1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzgyLCAxNjQwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVsZW1lbnREZWZpbml0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0MzMwMDMyRiINCi0JICAgIHRpdGxlICAgICAgCSJFbGVtZW50RGVmaW5pdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAk0MjYNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW1wdHlDb250ZW50IiBANjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDY3LCAxNDQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJbG9jYXRpb24gICAJKDI4MSwgMTQwMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVtcHR5Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjQ3MDM3QSINCi0JCSAgICB3aWR0aCAgICAgIAkzOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBbnlDb250ZW50IiBANjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODg2LCAxNDQ1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYyDQotCQkJbG9jYXRpb24gICAJKDcyOCwgMTQwMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREFueUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI1MDAzMDQiDQotCQkgICAgd2lkdGggICAgICAJMzM0DQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUENEYXRhQ29udGVudCIgQDYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIDE0NTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjMNCi0JCQlsb2NhdGlvbiAgIAkoMTA5OSwgMTQwNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURFBDRGF0YUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI1QzAxMzUiDQotCQkgICAgd2lkdGggICAgICAJNDE2DQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiIEA2NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCAxNDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQlsb2NhdGlvbiAgIAkoMTU3MiwgMTQwNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURFJlcGVhdGFibGVDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIg0KLQkJICAgIHdpZHRoICAgICAgCTY1MA0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY1DQotCQkgICAgbG9jYXRpb24gICAJKDE4NzgsIDE2MTgpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE4NzgsIDE2MTgpDQotCQkJKDE4NzgsIDE1MjApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiIEA2Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MzYsIDQwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCWxvY2F0aW9uICAgCSgxODU1LCAzMjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDY3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTI4LCAzODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjcNCi0JCQlsb2NhdGlvbiAgIAkoODQ3LCAzMDkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREdyb3VwQ29udGVudCIgQDY4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIxOTIsIDE3NzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjgNCi0JCQlsb2NhdGlvbiAgIAkoMTkzMSwgMTcyNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREdyb3VwQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUVGMDIzMiINCi0JCSAgICB3aWR0aCAgICAgIAk1NDANCi0JCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFEOTIwMzYzIg0KLQkJICAgIGNsaWVudCAgICAgCUA2OA0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMjEsIDE3MTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjEsIDE2MTgpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCIgQDcwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDE3NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQlsb2NhdGlvbiAgIAkoMTIyMywgMTcxNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTAwRTAxMjciDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5MDQ0MDExQiINCi0JCSAgICBjbGllbnQgICAgIAlANzANCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDc0LCAxNzAyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDc0LCAxNjE4KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDY1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50IiBANzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAxMDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzINCi0JCQlsb2NhdGlvbiAgIAkoNzA0LCAxMDA4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQxNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudENvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCQkgICAgd2lkdGggICAgICAJNDM0DQotCQkgICAgaGVpZ2h0ICAgICAJMTIwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDczDQotCQkgICAgbG9jYXRpb24gICAJKDIyODksIDEwNDgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVCNkYwMDVEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEA3NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDczDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1DQotCQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQkJbG9jYXRpb24gICAJKDEyMjMsIDEwMDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCXBjdERpc3QgICAgCTAuOTE5NDI0DQotCQkJCWhlaWdodCAgICAgCTQ4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQjcwMDA2RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDczDQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4OSwgMTA0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMjksIDEwNDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2DQotCQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQkJbG9jYXRpb24gICAJKDExODYsIDEwODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1MTM4MQ0KLQkJCQloZWlnaHQgICAgIAkzNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzcNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0NiwgOTQxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJMTA4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJncm91cCIgQDc4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjUzNSwgMTc0NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZ3JvdXAiDQotCQkJCXBjdERpc3QgICAgCTAuOTM3NzQ0DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQjcwMDBBQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDczDQotCQkJICAgIHN1cHBsaWVyICAgCUA2OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyODksIDEwNDgpDQotCQkJCSgyNTg3LCAxMDQ4KQ0KLQkJCQkoMjU4NywgMTc4NSkNCi0JCQkJKDI0NjIsIDE3ODUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4OSwgMTA0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0NjIsIDE3ODUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwDQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDI1MjYsIDE4MjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0NTA4NQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4MQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTAsIDEyOTEpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDkxMCwgMTI5MSkNCi0JCQkoOTEwLCAxMTE2KSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQkU5MDI3OCINCi0JCSAgICBjbGllbnQgICAgIAlANjMNCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAxMzk0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUJGMzAzMjciDQotCQkgICAgY2xpZW50ICAgICAJQDYxDQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDY2LCAxMzkxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjYsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQkVFMDIwNyINCi0JCSAgICBjbGllbnQgICAgIAlANjINCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODEsIDEzODgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg4MSwgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFEQjcwM0MwIg0KLQkJICAgIGNsaWVudCAgICAgCUA2NA0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MDMsIDEzOTIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDMsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiIEA4Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE3NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODYNCi0JCQlsb2NhdGlvbiAgIAkoNDkyLCAxNzE1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI3RDAwMTAiDQotCQkgICAgd2lkdGggICAgICAJNjAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDhDMDNBQSINCi0JCSAgICBjbGllbnQgICAgIAlAODYNCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTAsIDE3MDMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY1MCwgMTYxOCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiIEA4OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCAyMDY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDg4DQotCQkJbG9jYXRpb24gICAJKDEyNDQsIDE5OTIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgd2lkdGggICAgICAJNTA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDg5DQotCQkgICAgbG9jYXRpb24gICAJKDE0ODAsIDE4OTgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk0RUIwMjQzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eVJlZmVyZW5jZSIgQDkwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODkNCi0JCQkgICAgbG9jYXRpb24gICAJKDMxMiwgLTcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxDQotCQkJCVBhcmVudF9WaWV3IAlAOTANCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE4NDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMTINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eVJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTM3NTANCi0JCQkJaGVpZ2h0ICAgICAJMjAxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NEVGMDNCQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDg5DQotCQkJICAgIHN1cHBsaWVyICAgCUA3MA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4MCwgMTg5OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODAsIDE4MTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyDQotCQkJCVBhcmVudF9WaWV3IAlAOTANCi0JCQkJbG9jYXRpb24gICAJKDE1MzQsIDE4NDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5Mzc1MA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiIEA5Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg5DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMTIsIC03MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NA0KLQkJCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJCWxvY2F0aW9uICAgCSgxMjIwLCAxOTU0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50UmVmZXJlbmNlZEVudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC42ODUzMTUNCi0JCQkJaGVpZ2h0ICAgICAJMjYxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NEVGMDNCQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDg5DQotCQkJICAgIHN1cHBsaWVyICAgCUA4OA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4MCwgMTg5OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODAsIDE5ODApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk1DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDE5NTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczNDIzNA0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50IiBAOTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCA3NTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOTYNCi0JCQlsb2NhdGlvbiAgIAkoNzQ0LCA3MDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIHdpZHRoICAgICAgCTM1NA0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEA5Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDkwNCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUMwRTAwQ0QiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudCIgQDk4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNSwgOTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkNCi0JCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxNCwgODY1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjQyODU3MQ0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFDMEYwMzlGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk2DQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwDQotCQkJCVBhcmVudF9WaWV3IAlAOTgNCi0JCQkJbG9jYXRpb24gICAJKDg1NywgODUwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC41OTgyMTQNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI1LCA5NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDEwMTQsIDk2NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJcGN0RGlzdCAgICAJMC42NjQwNjMNCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQzBGMDNBOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDk3DQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoODcxLCA5NjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0MDYyNQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTA0DQotCQkgICAgbG9jYXRpb24gICAJKDEyMywgMTEyMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUYxMTAwMUEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudFJlZmVyZW5jZSIgQDEwNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTk4MSwgNjQyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIxLCAxODI1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzQ4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50UmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg0MDAzNQ0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUYxQjAyMDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIzLCAxMTIyKQ0KLQkJCQkoMTIzLCAxNzY5KQ0KLQkJCQkoNDgzLCAxNzY5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMywgMTEyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ4MywgMTc2OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3DQotCQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJCWxvY2F0aW9uICAgCSg0MjIsIDE3MjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0MDU1OQ0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlZEVsZW1lbnQiIEAxMDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC05ODEsIDY0MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJbG9jYXRpb24gICAJKDUzMiwgNjg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZWZlcmVuY2VkRWxlbWVudCINCi0JCQkJcGN0RGlzdCAgICAJMC43OTk2NTANCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFGMUIwMjBBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA0DQotCQkJICAgIHN1cHBsaWVyICAgCUA5Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMywgMTEyMikNCi0JCQkJKDEyMywgNzI4KQ0KLQkJCQkoNzM1LCA3MjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzLCAxMTIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzM1LCA3MjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMA0KLQkJCQlQYXJlbnRfVmlldyAJQDEwOA0KLQkJCQlsb2NhdGlvbiAgIAkoNzAxLCA3NzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk2Njk2NQ0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBBRjAyQTgiDQotCQkgICAgY2xpZW50ICAgICAJQDk2DQotCQkgICAgc3VwcGxpZXIgICAJQDY3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTIzLCA2OTApDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkyMywgNDcwKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiIEAxMTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgNzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExMg0KLQkJCWxvY2F0aW9uICAgCSgxNjEyLCA2NTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTUyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgd2lkdGggICAgICAJNTcwDQotCQkgICAgaGVpZ2h0ICAgICAJMjE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDExMw0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzc1LCAxNjI4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NzJEMDJDQiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIiBAMTE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTkxLCAtNTY0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjQyMiwgODA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyOTYzMA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTczNjAyOTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NzUsIDE2MjgpDQotCQkJCSgyNzc1LCA3NjgpDQotCQkJCSgyMTczLCA3NjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc3NSwgMTYyOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzMsIDc2OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJCWxvY2F0aW9uICAgCSgyMjIyLCA4NzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk2NjY0OQ0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IiBAMTE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTkxLCAtNTY0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQlQYXJlbnRfVmlldyAJQDExNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjA3NiwgMjA5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTU4OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuNzcxNDY5DQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NzM2MDI5QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMw0KLQkJCSAgICBzdXBwbGllciAgIAlAODgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzc1LCAxNjI4KQ0KLQkJCQkoMjc3NSwgMjA1NSkNCi0JCQkJKDE3NDEsIDIwNTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc3NSwgMTYyOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDEsIDIwNTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTgxMywgMjAxOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTUxNDQyDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBAMTIwDQotCQkgICAgbG9jYXRpb24gICAJKDI5NDUsIDE4OTEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhCRDQ5MDgwMTNEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiIEAxMjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkgICAgbG9jYXRpb24gICAJKDE0ODksIC02NzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyDQotCQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJCWxvY2F0aW9uICAgCSgyNDM1LCA2NTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuODY2MDI2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QkQ0OTE0MDEzMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjk0NSwgMTg5MSkNCi0JCQkJKDI5NDUsIDcwOCkNCi0JCQkJKDIxNzMsIDcwOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQ1LCAxODkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3MywgNzA4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQkJbG9jYXRpb24gICAJKDIzNDUsIDYwMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTEyNTM4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiIEAxMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkgICAgbG9jYXRpb24gICAJKDE0ODksIC02NzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSgxNjc5LCAyMjk5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTc2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjg2MDENCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCRDQ5MTQwMTRFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTIwDQotCQkJICAgIHN1cHBsaWVyICAgCUA4OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI5NDUsIDE4OTEpDQotCQkJCSgyOTQ1LCAyMjQzKQ0KLQkJCQkoMTQzOCwgMjI0MykNCi0JCQkJKDE0MzgsIDIxNDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjk0NSwgMTg5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzgsIDIxNDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2NSwgMjE3OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTg0Nzc0DQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMTU5MDFEQSINCi0JCSAgICBjbGllbnQgICAgIAlAMTEyDQotCQkgICAgc3VwcGxpZXIgICAJQDY2DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk1MCwgNjQ1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTUwLCA0ODYpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMTI4DQotCQkgICAgbG9jYXRpb24gICAJKDEzNDYsIDc1MikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkE5NTAwQ0MiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEAxMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NDIsIC0xNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkE5NTAzMTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzQ2LCA3NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg5LCA3NTIpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQyLCAtMTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkE5NTAzMUIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM0NiwgNzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMywgNzUyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJbG9jYXRpb24gICAJKDE1NDQsIDc5MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzczMzkwDQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJBdHRyaWJ1dGVEZWZpbml0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NDU3MDI1NyINCi0JICAgIHRpdGxlICAgICAgCSJBdHRyaWJ1dGVEZWZpbml0aW9uIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIiBAMTMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MTIsIDY1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM2LCA1MzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTUyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgd2lkdGggICAgICAJNTcwDQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQmFzaWNUeXBlIiBAMTMzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCA2NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTMzDQotCQkJbG9jYXRpb24gICAJKDEwMTcsIDU4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0OTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREJhc2ljVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjRGMDBEQSINCi0JCSAgICB3aWR0aCAgICAgIAk1MTINCi0JCSAgICBoZWlnaHQgICAgIAkxNjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnVtZXJhdGlvblR5cGUiIEAxMzQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDY1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQlsb2NhdGlvbiAgIAkoMTY0NiwgNTg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUxNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW51bWVyYXRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkJICAgIHdpZHRoICAgICAgCTUzNA0KLQkJICAgIGhlaWdodCAgICAgCTE2OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTM1DQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgMTEyMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQlsb2NhdGlvbiAgIAkoNDkyLCA5MjYpDQotCQkJbmxpbmVzICAgICAJOQ0KLQkJCW1heF93aWR0aCAgCTgwNQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxBIERURCBhdHRyaWJ1dGUncyB0eXBlIGFuZCBpbml0aWFsDQotfHZhbHVlIGFyZSByZXByZXNlbnRlZCB1c2luZyB0aGUgZVR5cGUgYW5kIGRlZmF1bHQgdmFsdWUgc3RvcmVkIGluIGVBdHRyaWJ1dGUuIFRoZSBlVHlwZSB3aWxsIGFsd2F5cyBiZSBlaXRoZXIgRFREQmFzaWNUeXBlIChzdWJjbGFzcyBvZiBlQ2xhc3MpIG9yIERUREVudW1lcmF0aW9uVHlwZSAoc3ViY2xhc3Mgb2YgZUVudW0pLg0KLQkJCSkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHdpZHRoICAgICAgCTg2NQ0KLQkJICAgIGhlaWdodCAgICAgCTQwMCkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTM2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGNsaWVudCAgICAgCUAxMzINCi0JCSAgICBzdXBwbGllciAgIAlAMTM1DQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDEzNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQlsb2NhdGlvbiAgIAkoMTE4MywgMTk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVFbnVtIiBAMTM4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzOA0KLQkJCWxvY2F0aW9uICAgCSgxODIzLCAxOTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFRW51bSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE0NzNFOTAxRDQiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YyODAwMzE1Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxMzMNCi0JCSAgICBzdXBwbGllciAgIAlAMTM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI2MCwgNTcyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYwLCAzNTkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMjgxMDMwMiINCi0JCSAgICBjbGllbnQgICAgIAlAMTM0DQotCQkgICAgc3VwcGxpZXIgICAJQDEzOA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MDMsIDU3MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMywgMzU5KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiIEAxNDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQlsb2NhdGlvbiAgIAkoNDQ3LCAxOTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjE1OTAxREEiDQotCQkgICAgY2xpZW50ICAgICAJQDEzMg0KLQkJICAgIHN1cHBsaWVyICAgCUAxNDENCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjAsIDUyNykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCAzNTkpKSkpKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL2R0ZG1vZGVsLm1kbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvZHRkbW9kZWwubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTU2MjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvZHRkbW9kZWwubWRsCisrKyAvZGV2L251bGwKQEAgLTEsNzUyNiArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQ1DQotICAgIF93cml0dGVuICAgCSJSb3NlIDcuNS4wMTAzLjE5MjAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIklERSINCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKSkNCi0gICAgcXVpZCAgICAgICAJIjNFMzZCRUI2MDEzMyINCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGNyINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDIwQiINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjYiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiM0EwQzc1RjQwMUY4Ig0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRWQUJBU0VfUExVR0lOU19QQVRIXFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXHNyY1xcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FQ29yZS5jYXQiDQotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImR0ZCINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFZBQkFTRV9QTFVHSU5TX1BBVEhcXG9yZy5lY2xpcHNlLndzdC5kdGRcXHNyY1xccm9zZVxcRFRELmNhdCINCi0JCXF1aWQgICAgICAgCSIzODU3QjFDMDAyOTMiKSkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRkYiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMQ0KLQkJCWxvY2F0aW9uICAgCSg5NjAsIDMwNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDIyMCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiZWNvcmUiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmR0ZCIgQDINCi0JCQlsb2NhdGlvbiAgIAkoMzY4LCAyNTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCAxNzIpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImR0ZCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4NTdCMUMwMDI5MyINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY4Ig0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMjBBIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY5Ig0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRkIiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiQU5TSSINCi0JCQkJdmFsdWUgICAgICAJODAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiT3JhY2xlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiDQotCQkJCXZhbHVlICAgICAgCTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSINCi0JCQkJdmFsdWUgICAgICAJODAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiV2F0Y29tIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJJZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJWXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIl9WIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIk51bGxzT0siDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETEVsZW1lbnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiINCi0JCQkJdmFsdWUgICAgICAJNTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiDQotCQkJCXZhbHVlICAgICAgCTUxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVW5pb24iDQotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiU0NDIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiQ29kZWdlbiBOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1Rhc2siDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTIyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMjEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNaXhpbiINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYXNrIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiDQotCQkJCXZhbHVlICAgICAgCTIxMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJMjE0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIyNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5pdGlhbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMjI4KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyINCi0JCQkJdmFsdWUgICAgICAJMjI5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBdXRvIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlRydWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTIyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiDQotCQkJCXZhbHVlICAgICAgCTIzMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkicHJvamVjdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiREJNUyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNWaWV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iDQotCQkJdmFsdWUgICAgICAJIk5vbmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JvdyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSINCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNIg0KLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiLjtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXGRiMmphdmEuemlwO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcZGIyamNjLmphcjtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXHNxbGouemlwO0M6XFxJQk1cXFNRTExJQlxcYmluO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcY29tbW9uLmphciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3VuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJInZvaWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQotCQkJdmFsdWUgICAgICAJMykNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZSgkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSINCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZERlY2wiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiDQotCQkJdmFsdWUgICAgICAJMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiDQotCQkJCXZhbHVlICAgICAgCTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVG9wTGluayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJlbnVtIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTEwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIm1vZHVsZSINCi0JCQkJdmFsdWUgICAgICAJMTAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQkJdmFsdWUgICAgICAJMTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkidW5pb24iDQotCQkJCXZhbHVlICAgICAgCTEwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIm1heCINCi0JCQkJdmFsdWUgICAgICAJMTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJraW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZGxsbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGlicmFyeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsY2lkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMjEzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiMCINCi0JCQkJdmFsdWUgICAgICAJMjIzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiMSINCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiQmFzZVNldCIgMjIyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciDQotCQkJdmFsdWUgICAgICAJKCJJbnN0YW5jaW5nU2V0IiAyMTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiVGV4dCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0JvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5VmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydEJpbmFyeSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvblZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsRW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbiBBbGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImNsYXNzaWZpZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkib3BlcmF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0lEIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkpDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRkEiKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZTUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE3ZDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYjdiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVlYjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzJjY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzhlNjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MTg4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYjI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWMxMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjJjYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA5NjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZDgyZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0OWM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMDk0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NDcwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWRmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGMyNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTNiYTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYjM1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Mzk4YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZXNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxZGIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZXNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOTY1OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQyMmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0ZjliZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQ1Mjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTdhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3VucmVjb2duaXplZF9jb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4OTk3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3VucmVjb2duaXplZF9jb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWY1MTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhYzEzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ0Y2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTU3ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIERURCBDb3JlCi0jCi1TdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgRFREIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1EVERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9RFRECi1fRFREX1ZBTElEQVRPUl9OQU1FICAgICAgICAgICAgICAgPSBEVEQgVmFsaWRhdG9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMGVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckRURCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRhc2tzLkRUREZpbGVUYXNrU2Nhbm5lciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGFza3MuRFRERmlsZVRhc2tTY2FubmVyIgotCQkJY29udGVudFR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJkdGQiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Im1vZCIgLz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZW50IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iZHRkLG1vZCxlbnQiCi0JCQlwcmlvcml0eT0ibm9ybWFsIgotCQkJbmFtZT0iJURURF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJkdGRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50LkNvbnRlbnREZXNjcmliZXJGb3JEVEQiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotCQk8cGFyc2VyCi0JCQl0eXBlPSJkdGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFJlc291cmNlRmFjdG9yeUltcGwiPgotCQk8L3BhcnNlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLQkJPHBhcnNlcgotCQkJdHlwZT0iZW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERSZXNvdXJjZUZhY3RvcnlJbXBsIj4KLQkJPC9wYXJzZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotCQk8cGFja2FnZQotCQkJdXJpPSJEVEQueG1pIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbCI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJkdGQsIGVudCwgbW9kLCB4bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50RmFjdG9yeURURCI+Ci0JCTwvZmFjdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBkdGQgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJlZ2lzdGVyIHRoZSBEVEQgdmFsaWRhdG9yIHdpdGggdGhlIHZhbGlkYXRpb24gCQktLT4KLQk8IS0tIGZyYW1ld29yay4gCQkJCQkJCQkJCSAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJkdGREVERWYWxpZGF0b3IiCi0JCW5hbWU9IiVfRFREX1ZBTElEQVRPUl9OQU1FIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLQkJPHZhbGlkYXRvcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0JCQkJbmFtZUZpbHRlcj0iKi5kdGQiPgotCQkJPC9maWx0ZXI+Ci0JCQk8aGVscGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuSGVscGVyIj4KLQkJCTwvaGVscGVyPgotCQkJPHJ1bgotICAgICAgICAgYXN5bmM9InRydWUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiCi0gICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgZnVsbEJ1aWxkPSJ0cnVlIgotICAgICAgICAgaW5jcmVtZW50YWw9InRydWUiPgotCQkJPC9ydW4+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEVEQgYXMgeW91IHR5cGUgdmFsaWRhdGlvbgkJCQkJCQkJLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuZHRkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NmRkZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEF0dE5vZGUgewotCS8vCi0JLy8gYXR0VHlwZQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0RBVEEgPSAwLCBJRCA9IDEsIElEUkVGID0gMiwgSURSRUZTID0gMywgRU5USVRZID0gNCwgRU5USVRJRVMgPSA1LCBOTVRPS0VOID0gNiwgTk1UT0tFTlMgPSA3LCBOT1RBVElPTiA9IDgsIEVOVU1FUkFUSU9OID0gOSwgUEVSRUZFUkVOQ0UgPSAxMDsKLQotCS8vCi0JLy8gS2VlcCB0aGlzIGFycmF5IGluLXN5bmMgd2l0aCB0aGUgQVRUVFlQRSBkZWZpbml0aW9ucwotCS8vCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZmdBdHRUeXBlU3RyaW5nID0geyJDREFUQSIsIC8vIDAgLy8kTk9OLU5MUy0xJAotCQkJCSJJRCIsIC8vIDEgLy8kTk9OLU5MUy0xJAotCQkJCSJJRFJFRiIsIC8vIDIgLy8kTk9OLU5MUy0xJAotCQkJCSJJRFJFRlMiLCAvLyAzIC8vJE5PTi1OTFMtMSQKLQkJCQkiRU5USVRZIiwgLy8gNCAvLyROT04tTkxTLTEkCi0JCQkJIkVOVElUSUVTIiwgLy8gNSAvLyROT04tTkxTLTEkCi0JCQkJIk5NVE9LRU4iLCAvLyA2IC8vJE5PTi1OTFMtMSQKLQkJCQkiTk1UT0tFTlMiLCAvLyA3IC8vJE5PTi1OTFMtMSQKLQkJCQkiTk9UQVRJT04iLCAvLyA4IC8vJE5PTi1OTFMtMSQKLQkJCQkiRU5VTUVSQVRJT04iLCAvLyA5IChyZXBsYWNlZCB3aXRoICJOTVRPS0VOIiBieSBTQVggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyBBdHRyaWJ1dGVMaXN0IGhhbmRsZXIpCi0JCQkJIiVFTlRJVFlSRUZFUkVOQ0U7In07IC8vJE5PTi1OTFMtMSQKLQotCS8vCi0JLy8gYXR0RGVmYXVsdFR5cGUKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PRklYRUQgPSAxLCAvLyBBdHRWYWx1ZQotCQkJCVJFUVVJUkVEID0gMiwgLy8gI1JFUVVJUkVECi0JCQkJSU1QTElFRCA9IDMsIC8vICNJTVBMSUVECi0JCQkJRklYRUQgPSA0OyAvLyAjRklYRUQgQXR0VmFsdWUKLQotCXB1YmxpYyBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHVibGljIFN0cmluZyB0eXBlID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRUeXBlID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JcHVibGljIFZlY3RvciBlbnVtTGlzdCA9IG51bGw7IC8vIGxpc3Qgb2YgTm90YXRpb25zIG9yIEVudW0gdmFsdWVzCi0KLQlwdWJsaWMgaW50IGdldERlY2xhcmVkVHlwZSgpIHsKLQkJaW50IHQgPSAtMTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiB0OwotCi0JCWlmICh0eXBlLnN0YXJ0c1dpdGgoIiUiKSAmJiB0eXBlLmVuZHNXaXRoKCI7IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIFBFUkVGRVJFTkNFOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdBdHRUeXBlU3RyaW5nLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodHlwZS5lcXVhbHMoZmdBdHRUeXBlU3RyaW5nW2ldKSkgewotCQkJCXQgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiB0OwotCX0KLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJaWYgKGVudW1MaXN0ID09IG51bGwpCi0JCQllbnVtTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJcmV0dXJuIGVudW1MaXN0LmVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0VHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKGRlZmF1bHRUeXBlLnN0YXJ0c1dpdGgoIiUiKSAmJiBkZWZhdWx0VHlwZS5lbmRzV2l0aCgiOyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBQRVJFRkVSRU5DRTsKLQkJZWxzZSBpZiAoZGVmYXVsdFR5cGUuZXF1YWxzKCIjUkVRVUlSRUQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFJFUVVJUkVEOwotCQllbHNlIGlmIChkZWZhdWx0VHlwZS5lcXVhbHMoIiNJTVBMSUVEIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBJTVBMSUVEOwotCQllbHNlIGlmIChkZWZhdWx0VHlwZS5lcXVhbHMoIiNGSVhFRCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gRklYRUQ7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0ZJWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQXR0IE5hbWU6ICIgKyBuYW1lICsgIiBUeXBlOiAiICsgdHlwZSArICIgZGVmYXVsdFR5cGU6ICIgKyBkZWZhdWx0VHlwZSArICIgZGVmYXVsdFZhbHVlOiAiICsgZGVmYXVsdFZhbHVlOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0bGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0bGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJlNDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0F0dGxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0bGlzdCBleHRlbmRzIEJhc2VOb2RlIHsKLQlWZWN0b3IgYXR0RGVmcyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBsaXN0J3MgbmFtZTsgdGhpcyB2YWx1ZSBpcyBhbHNvIGtub3duIGFzIHRoZQotCSAqICAgICAgICAgICAgRWxlbWVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBBdHRsaXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQpIHsKLQkJdGhpcyhuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEF0dGxpc3QoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNvbW1lbnQsIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UpIHsKLQkJc3VwZXIobmFtZSwgb3duZXJEVEQsIGNvbW1lbnQsIGVycm9yTWVzc2FnZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGRlZmluaXRpb24gdG8gdGhlIGVuZCBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGxpc3QgLgotCSAqIAotCSAqIEBwYXJhbSBhdHREZWYKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIHRvIGFkZCB0byB0aGlzIGF0cmlidXRlIGxpc3QuCi0JICogQHJldHVybiA9dHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbgotCSAqICAgICAgICAgdGhpcyBhdHRyaWJ1dGUgbGlzdDsgb3RoZXJ3aXNlLCA9ZmFsc2UuCi0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkRWxlbWVudChBdHROb2RlIGF0dERlZikgewotCQlpZiAoY29udGFpbnMoYXR0RGVmLm5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0aGlzLmF0dERlZnMuYWRkRWxlbWVudChhdHREZWYpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBhdCB0aGUgc3BlY2lmaWVkIDx2YXI+aW5kZXg8L3Zhcj4gaW4KLQkgKiB0aGlzIGF0dHJpYnV0ZSBsaXN0Ci0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBpbnRvIHRoaXMgbGlzdCBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuCi0JICogQHJldHVybiBBdHRyaWJ1dGUgZGVmaW5pdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBvciA8dmFyPm51bGw8L3Zhcj4KLQkgKiAgICAgICAgIGlmIGFuIGludmFsaWQgaW5kZXguCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBBdHROb2RlIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChBdHROb2RlKSB0aGlzLmF0dERlZnMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBkZWZpbml0aW9uIG5hbWUgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0RGVmTmFtZQotCSAqICAgICAgICAgICAgQXR0cmlidXRlIGRlZmluaXRpb24gbmFtZSB0byBtYXRjaCBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEByZXR1cm4gVGhlIG1hdGNoaW5nIGF0dHJpYnV0ZSBkZWZpbml0aW9uLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgdGhlCi0JICogICAgICAgICBhdHRyaWJ1dGUgaXMgbm90IGN1cnJlbnRseSBkZWZpbmVkLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNjb250YWlucwotCSAqIEBzZWUgI3NpemUKLQkgKiBAc2VlICNlbGVtZW50cwotCSAqLwotCXB1YmxpYyBBdHROb2RlIGdldEF0dERlZihTdHJpbmcgYXR0RGVmTmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0JCQlBdHROb2RlIGFkID0gZWxlbWVudEF0KGkpOwotCQkJaWYgKGF0dERlZk5hbWUuZXF1YWxzKGFkLm5hbWUpKQotCQkJCXJldHVybiBhZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBuYW1lIGlzIGN1cnJlbnRseQotCSAqIGRlZmluZWQgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0RGVmTmFtZQotCSAqICAgICAgICAgICAgQXR0cmlidXRlIGRlZmluaXRpb24gbmFtZSB0byBtYXRjaCBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEByZXR1cm4gPXRydWUgaWYgPHZhcj5hdHREZWZOYW1lPC92YXI+IGlzIGRlZmluZWQ7IG90aGVyd2lzZSwgPWZhbHNlLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNzaXplCi0JICogQHNlZSAjZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgYXR0RGVmTmFtZSkgewotCQlyZXR1cm4gbnVsbCAhPSBnZXRBdHREZWYoYXR0RGVmTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gTnVtYmVyIG9mIGF0dHJpYnV0ZSBsaXN0IGRlZmluaXRpb25zLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgbm8KLQkgKiAgICAgICAgIGRlZmluaXRpb25zIGRlZmluZWQuCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5hdHREZWZzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBhdHRyaWJ1dGUKLQkgKiBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgYWxsIGF0dHJpYnV0ZSBkZWZpbml0aW9ucywgb3IgPHZhcj5udWxsPC92YXI+Ci0JICogICAgICAgICBpZiBub25lIHNwZWNpZmllZC4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5hdHREZWZzLmVsZW1lbnRzKCk7Ci0JfQotCi0Jdm9pZCBzZXRBdHREZWZzKFZlY3RvciBhdHRycykgewotCQlhdHREZWZzID0gYXR0cnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQmFzZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDRiMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQmFzZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBvd25lckRURCA9IG51bGw7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCkgewotCQl0aGlzKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNvbW1lbnQsIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5vd25lckRURCA9IG93bmVyRFREOwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3duZXJEVEQoKSB7Ci0JCXJldHVybiBvd25lckRURDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRURChTdHJpbmcgb3duZXIpIHsKLQkJb3duZXJEVEQgPSBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgRXJyb3JNZXNzYWdlIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTUJhc2ljTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDcwZmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNQmFzaWNOb2RlIGV4dGVuZHMgQ01Ob2RlIHsKLQlwcml2YXRlIGludCB0eXBlID0gQ01Ob2RlVHlwZS5FTVBUWTsgLy8gcG9zc2libGUgdHlwZXMgOgotCi0JLy8gQ01Ob2RlVHlwZS5FTVBUWQotCS8vIENNTm9kZVR5cGUuQU5ZCi0JLy8gQ01Ob2RlVHlwZS5QQ0RBVEEKLQotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLwotCXB1YmxpYyBDTUJhc2ljTm9kZShTdHJpbmcgcmVmTmFtZSkgewotCQlzdXBlcihyZWZOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ01CYXNpY05vZGUoU3RyaW5nIHJlZk5hbWUsIGludCB0eXBlKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiIEJhc2ljTm9kZU5hbWU6ICIgKyBnZXROYW1lKCkgKyAiIFR5cGU6ICIgKyBnZXRUeXBlKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNR3JvdXBOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTUdyb3VwTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNiMmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNR3JvdXBOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cE5vZGUgZXh0ZW5kcyBDTVJlcGVhdGFibGVOb2RlIHsKLQlwcml2YXRlIGludCB0eXBlID0gQ01Ob2RlVHlwZS5HUk9VUDsKLQlwcml2YXRlIGludCBncm91cEtpbmQgPSBDTU5vZGVUeXBlLkdST1VQX1NFUVVFTkNFOwotCXByaXZhdGUgVmVjdG9yIGNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotCi0JcHVibGljIENNR3JvdXBOb2RlKCkgewotCQlzdXBlcigiR1JPVVAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLy8gaW1wbGVtZW50IHN1cGVyIGNsYXNzCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQkvLyBjYW4ndCBjaGFuZ2UgLSBvbmx5IG9uZSB0eXBlIGFsbG93cwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0R3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZ3JvdXBLaW5kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyb3VwS2luZChpbnQga2luZCkgewotCQlncm91cEtpbmQgPSBraW5kOwotCX0KLQotCXB1YmxpYyBWZWN0b3IgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChDTU5vZGUgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkRWxlbWVudChjaGlsZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICJHcm91cCAoIC0ga2luZDogIiArIGdldEdyb3VwS2luZCgpICsgIiBPY2NUeXBlOiAiICsgZ2V0T2NjdXJyZW5jZSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlFbnVtZXJhdGlvbiBlbiA9IGNoaWxkcmVuLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJcmVzdWx0ICs9ICIgIiArIGVuLm5leHRFbGVtZW50KCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJlc3VsdCArPSAiR3JvdXAgKSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjgyYTI3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlIHsKLQlwcml2YXRlIFN0cmluZyByZWZOYW1lOwotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIENNTm9kZShTdHJpbmcgcmVmTmFtZSkgewotCQl0aGlzLnJlZk5hbWUgPSByZWZOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHJlZk5hbWU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUeXBlKGludCB0eXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg1ZGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgaW50ZXJmYWNlIENNTm9kZVR5cGUgewotCXN0YXRpYyBwdWJsaWMgaW50IEVNUFRZID0gMTsKLQlzdGF0aWMgcHVibGljIGludCBBTlkgPSAyOwotCXN0YXRpYyBwdWJsaWMgaW50IFBDREFUQSA9IDM7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgRUxFTUVOVF9SRUZFUkVOQ0UgPSA0OwotCXN0YXRpYyBwdWJsaWMgaW50IEVOVElUWV9SRUZFUkVOQ0UgPSA1OwotCXN0YXRpYyBwdWJsaWMgaW50IEdST1VQID0gNjsKLQotCXN0YXRpYyBwdWJsaWMgaW50IE9ORSA9IDc7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgT1BUSU9OQUwgPSA4OwotCXN0YXRpYyBwdWJsaWMgaW50IE9ORV9PUl9NT1JFID0gOTsKLQlzdGF0aWMgcHVibGljIGludCBaRVJPX09SX01PUkUgPSAxMDsKLQotCXN0YXRpYyBwdWJsaWMgaW50IEdST1VQX0NIT0lDRSA9IDExOwotCXN0YXRpYyBwdWJsaWMgaW50IEdST1VQX1NFUVVFTkNFID0gMTI7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZWZlcmVuY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTliNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZWZlcmVuY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNUmVmZXJlbmNlTm9kZSBleHRlbmRzIENNUmVwZWF0YWJsZU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFOwotCi0JcHVibGljIENNUmVmZXJlbmNlTm9kZShTdHJpbmcgcmVmTmFtZSkgewotCQl0aGlzKHJlZk5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpOwotCX0KLQotCXB1YmxpYyBDTVJlZmVyZW5jZU5vZGUoU3RyaW5nIHJlZk5hbWUsIGludCB0eXBlKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgUmVmTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICIgT2NjVHlwZTogIiArIGdldE9jY3VycmVuY2UoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmUxMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTVJlcGVhdGFibGVOb2RlIGV4dGVuZHMgQ01Ob2RlIHsKLQlwcml2YXRlIGludCBvY2NUeXBlID0gQ01Ob2RlVHlwZS5PTkU7Ci0KLQlwdWJsaWMgQ01SZXBlYXRhYmxlTm9kZShTdHJpbmcgcmVmTmFtZSkgewotCQlzdXBlcihyZWZOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ01SZXBlYXRhYmxlTm9kZShTdHJpbmcgcmVmTmFtZSwgaW50IG9jY1R5cGUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JCXRoaXMub2NjVHlwZSA9IG9jY1R5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRPY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gb2NjVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKGludCBvY2NUeXBlKSB7Ci0JCXRoaXMub2NjVHlwZSA9IG9jY1R5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZmOWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIERURCB7Ci0JLy8KLQkvLyBDb25zdGFudHMKLQkvLwotCi0JVmVjdG9yIGV4dGVybmFsRWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0JU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JYm9vbGVhbiBpc0V4Y2VwdGlvbkR1cmluZ1BhcnNlID0gZmFsc2U7Ci0KLQkvLwotCS8vIENvbnN0cnVjdG9ycwotCS8vCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKi8KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgZmlsZSBuYW1lIG9mIHRoaXMgRFRELgotCSAqIEBzZWUgI2dldE5hbWUKLQkgKiBAc2VlICNzZXROYW1lCi0JICovCi0JcHVibGljIERURChTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBEVEQncyBmaWxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGlzIERURCdzIGZpbGUgbmFtZSwgb3IgPHZhcj5udWxsPC92YXI+IGlmIG5vIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyBEVEQncyBmaWxlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoaXMgRFREJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXROYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gaW5zdGFuY2Ugb2YgYWxsIGV4dGVybmFsIHN1YnNldCBjaGlsZHJlbiBvZiB0aGlzCi0JICogRFRELgotCSAqIAotCSAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgYWxsIGV4dGVybmFsIHN1YnNldCBjaGlsZHJlbiBvZiB0aGlzIERURC4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZXh0ZXJuYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIGV4dGVybmFsRWxlbWVudHMuZWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREZWNsKEJhc2VOb2RlIGRlY2wpIHsKLQkJZXh0ZXJuYWxFbGVtZW50cy5hZGRFbGVtZW50KGRlY2wpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UoYm9vbGVhbiBvbikgewotCQlpc0V4Y2VwdGlvbkR1cmluZ1BhcnNlID0gb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNFeGNlcHRpb25EdXJpbmdQYXJzZSgpIHsKLQkJcmV0dXJuIGlzRXhjZXB0aW9uRHVyaW5nUGFyc2U7Ci0JfQotCi19IC8vIGNsYXNzIERURApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0NDIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRFRESGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERURFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIERUREhhbmRsZXIsIEVycm9ySGFuZGxlciwgRGVjbEhhbmRsZXIsIExleGljYWxIYW5kbGVyIHsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBkZWNsU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENhbm9uaWNhbCBvdXRwdXQuICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2Fub25pY2FsOwotCi0JcHJvdGVjdGVkIFhNTFJlYWRlciByZWFkZXI7Ci0JaW50IGVudGl0eURlcHRoOwotCi0JLy8gZG13IDExLzE1IHByaXZhdGUgZmllbGQgbmV2ZXIgcmVhZCBsb2NhbGx5Ci0JLy8gcHJpdmF0ZSBWZWN0b3IgZGVjbEVsZW1lbnRzOwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotCXByaXZhdGUgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGVycm9yTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBEZWNsTm9kZSBwcmV2aW91c0RlY2xOb2RlID0gbnVsbDsKLQlwcml2YXRlIERlY2xOb2RlIGN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBCYXNlTm9kZSBsYXN0QmFzZU5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGVudGl0eUVuZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IGxpbmVOdW1iZXI7Ci0KLQlwcml2YXRlIERURCBjdXJyZW50RFREID0gbnVsbDsKLQlwcml2YXRlIFZlY3RvciBkdGRMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JcHJpdmF0ZSBTdGFjayBkdGRTdGFjayA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgU3RhY2sgcGVSZWZTdGFjayA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgU3RhY2sgcGFyc2luZ1BFUmVmU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgRW50aXR5UG9vbCBlbnRpdHlQb29sID0gbmV3IEVudGl0eVBvb2woKTsKLQlwcml2YXRlIFN0cmluZyBleHBhbmRlZEVudGl0eVZhbHVlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbGVtZW50UG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCWJvb2xlYW4gcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQotCXByaXZhdGUgTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgTG9jYXRvciBnZXRMb2NhdG9yKCkgewotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0JfQotCi0JcHVibGljIERURFBhcnNlcihib29sZWFuIGNhbm9uaWNhbCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQl0aGlzKG51bGwsIGNhbm9uaWNhbCk7Ci0JfQotCi0JcHJvdGVjdGVkIERURFBhcnNlcihTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gY2Fub25pY2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKGVuY29kaW5nID09IG51bGwpCi0JCQllbmNvZGluZyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCQl0aGlzLmNhbm9uaWNhbCA9IGNhbm9uaWNhbDsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlciBzcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotCQkJcmVhZGVyID0gc3BhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0JCQlyZWFkZXIuc2V0RFRESGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIodGhpcyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKiBQcmludHMgdGhlIG91dHB1dCBmcm9tIHRoZSBTQVggY2FsbGJhY2tzLiAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBsb2dpY2FsVVJJKSB7Ci0JCXRyeSB7CQkJCi0JCQkvLyBDUyBlbnN1cmUgdGhhdCB0aGUgcGh5c2ljYWwgVVJJIGlzIGNvbnNpZGVyZWQgd2hlcmUgc3RyZWFtcyBhcmUgcmVxdWlyZWQKLQkJCS8vIGFuZCB0aGUgbG9naWNhbFVSSSBpcyB1c2VkIGFzIHRoZSBEVEQncyBiYXNlTG9jYXRpb24KLQkJCVN0cmluZyBwaHlzaWNhbFVSSSA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oIiIsICIiLCBsb2dpY2FsVVJJKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlib29sZWFuIGlzUmVhZGFibGUgPSBVUklIZWxwZXIuaXNSZWFkYWJsZVVSSShwaHlzaWNhbFVSSSwgdHJ1ZSk7Ci0JCQlpZiAoIWlzUmVhZGFibGUpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJEVEQgcGFyc2UgZXJyb3IuIENhbiBub3QgcmVhZCB0aGUgc3BlY2lmaWVkIFVSSSA6ICIgKyBsb2dpY2FsVVJJKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkJCQotCQkJU3RyaW5nIGRvY3VtZW50ID0gIjwhRE9DVFlQRSByb290IFNZU1RFTSBcIiIgKyBsb2dpY2FsVVJJICsgIlwiPjxyb290Lz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWVudGl0eURlcHRoID0gMDsKLQkJCWN1cnJlbnREVEQgPSBuZXcgRFREKGxvZ2ljYWxVUkkpOwotCQkJSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpOwotCQkJaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQobG9naWNhbFVSSSArICIueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIHNlKSB7Ci0JCQlpZiAoY3VycmVudERURCAhPSBudWxsKQotCQkJCWN1cnJlbnREVEQuc2V0SXNFeGNlcHRpb25EdXJpbmdQYXJzZSh0cnVlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChjdXJyZW50RFREICE9IG51bGwpCi0JCQkJY3VycmVudERURC5zZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKHRydWUpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIEVudGl0eSByZWZlcmVuY2VzIGFyZSBhbHdheXMgZXhwYW5kZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIEVudGl0eSByZWZlcmVuY2VzIGFyZSBhbHdheXMgZXhwYW5kZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIFZlY3RvciBnZXREVERMaXN0KCkgewotCQlyZXR1cm4gZHRkTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sKCkgewotCQlyZXR1cm4gZWxlbWVudFBvb2w7Ci0JfQotCi0JcHVibGljIEVudGl0eVBvb2wgZ2V0RW50aXR5UG9vbCgpIHsKLQkJcmV0dXJuIGVudGl0eVBvb2w7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZXM7Ci0JfQotCi0JLy8KLQkvLyBEb2N1bWVudEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgewotCX0KLQotCS8vCi0JLy8gRFRESGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIHVucGFyc2VkRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBub3RhdGlvbk5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLk5PVEFUSU9OKTsKLQkJZGVjbFN0cmluZyA9ICI8IU5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJU3RyaW5nIHhzID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl4cyArPSBuYW1lOwotCQkJaWYgKHB1YmxpY0lkID09IG51bGwpCi0JCQkJeHMgKz0gIiBTWVNURU0gIiArICJcIiIgKyBzeXN0ZW1JZCArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQllbHNlCi0JCQkJeHMgKz0gIiBQVUJMSUMgIiArICJcIiIgKyBwdWJsaWNJZCArICJcIiAiICsgIlwiIiArIHN5c3RlbUlkICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQkJfQotCX0KLQotCS8vCi0JLy8gRGVjbEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTEVNRU5UKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVMRU1FTlQiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gS0I6IFdpdGggZWFybHkgdmVyc2lvbnMgb2YgWGVyY2VzIDIueCwgc3RhcnRFbnRpdHkoIltkdGRdIikgdXNlZCB0bwotCQkvLyBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kCi0JCS8vIHNvIGVudGl0eURlcHRoIHdhcyAxLiBVc2luZyBKQVhQIGNoYW5nZWQgdGhhdCBhbmQgc3RhcnRFbnRpdHkoKSBpcwotCQkvLyBub3QgY2FsbGVkIGJhY2sgYW55bW9yZS4KLQkJLy8gQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBlbnRpdHlEZXB0aCA9PSAwCi0JCS8vIGFzIHdlbGwuCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAwIHx8IGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpCi0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihuYW1lICsgIiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgYXR0cmlidXRlRGVjbChTdHJpbmcgZU5hbWUsIFN0cmluZyBhTmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZURlZmF1bHQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuQVRUTElTVCk7Ci0JCWRlY2xTdHJpbmcgPSAiPCFBVFRMSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWF0dHJpYnV0ZVN0cmluZyArPSAiICIgKyBhTmFtZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIHR5cGU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZhbHVlRGVmYXVsdCAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIHZhbHVlRGVmYXVsdDsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZVN0cmluZyArPSAiICciICsgdmFsdWUgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWF0dHJpYnV0ZVN0cmluZyA9IGVOYW1lICsgIiAiICsgYXR0cmlidXRlU3RyaW5nICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoYXR0cmlidXRlU3RyaW5nKTsKLQkJYXR0cmlidXRlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuSU5URVJOQUxfRU5USVRZKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJLy8gYnVpbGQgdXAgYSBzdHJpbmc6IGUuZy4gIiAlIFNUUkRPTSAiKCNQQ0RBVEEpIj4iCi0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gIiUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJZWxzZQotCQkJCXhzICs9IG5hbWU7Ci0KLQkJCXhzICs9ICIgXCIiICsgdmFsdWUgKyAiXCI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCQkvLyBzYXZlIGV4cGFuZGVkIGVudGl0eSB2YWx1ZQotCQkJZXhwYW5kZWRFbnRpdHlWYWx1ZSA9IHZhbHVlOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRVhURVJOQUxfRU5USVRZKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJLy8gYnVpbGQgdXAgYSBzdHJpbmc6Ci0JCQkvLyBleDEpICIgJSBGSUVMRCBTWVNURU0gIm9hZ2lzX2ZpZWxkcy5kdGQiPiIKLQkJCS8vIGV4MikgIiAlIEZJRUxEIFBVQkxJQyAiRk9PIj4iCi0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gIiUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJZWxzZQotCQkJCXhzICs9IG5hbWU7Ci0KLQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJCXhzICs9ICIgU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZWxzZSBpZiAocHVibGljSWQgIT0gbnVsbCkKLQkJCQl4cyArPSAiIFBVQkxJQyBcIiIgKyBwdWJsaWNJZCArICJcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJY29udGVudFN0cmluZyArPSB4czsKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIExleGljYWxIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZHRkTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlkdGRMaXN0LmFkZEVsZW1lbnQoY3VycmVudERURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgRFREIGRlY2xhcmF0aW9ucy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI3N0YXJ0RFRECi0JICovCi0JcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRU5EX0RURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBiZWdpbm5pbmcgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIFRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkgYXJlIG5vdCByZXBvcnRlZC4gVGhlIHN0YXJ0Ci0JICogYW5kIGVuZCBvZiB0aGUgZXh0ZXJuYWwgRFREIHN1YnNldCBhcmUgcmVwb3J0ZWQgdXNpbmcgdGhlIHBzZXVkby1uYW1lCi0JICogIltkdGRdIi4gQWxsIG90aGVyIGV2ZW50cyBtdXN0IGJlIHByb3Blcmx5IG5lc3RlZCB3aXRoaW4gc3RhcnQvZW5kCi0JICogZW50aXR5IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gSWYgaXQgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCB0aGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZWdpbiB3aXRoICclJy4KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI2VuZEVudGl0eQotCSAqLwotCi0JcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5TVEFSVF9FTlRJVFlfRFREKTsKLQkJfQotCQllbHNlIGlmIChjdXJyZW50RGVjbE5vZGUgPT0gbnVsbCkgewotCQkJLy8gUEUgcmVmZXJlbmNlIGluIG1hcmt1cGRlY2wgc2VjdGlvbgotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQkJRW50aXR5RGVjbCBlbiA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHBlTmFtZSk7Ci0KLQkJCQlwZVJlZlN0YWNrLnB1c2gobmFtZSk7Ci0JCQkJcGFyc2luZ1BFUmVmU3RhY2sucHVzaChuZXcgQm9vbGVhbihwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkpOwotCi0JCQkJU3RyaW5nIHN5c3RlbUlkID0gZW4uZ2V0U3lzdGVtSWQoKTsKLQkJCQlTdHJpbmcgcHVibGljSWQgPSBlbi5nZXRQdWJsaWNJZCgpOwotCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQkJU3RyaW5nIHVyaSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQkJaWYgKCFpc0RURExvYWRlZCh1cmkpKSB7Ci0JCQkJCQkvLyBub3QgbG9hZGVkCi0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBub3QgbG9hZGVkIC4uIGNyZWF0ZSBuZXcgRFREOiAiCi0JCQkJCQkvLyApOwotCQkJCQkJZHRkU3RhY2sucHVzaChjdXJyZW50RFREKTsKLQkJCQkJCURURCBuZXdEVEQgPSBuZXcgRFREKHVyaSk7Ci0JCQkJCQlkdGRMaXN0LmFkZEVsZW1lbnQobmV3RFREKTsKLQkJCQkJCWN1cnJlbnREVEQgPSBuZXdEVEQ7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBhbHJlYWR5IGxvYWRlZCAuLiAiICk7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCVN0cmluZyB4cyA9IChTdHJpbmcpIHJlYWRlci5nZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMveG1sLXN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQl9Ci0JCWVudGl0eURlcHRoKys7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgZW5kaW5nLgotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjc3RhcnRFbnRpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTkRfRU5USVRZX0RURCk7Ci0JCX0KLQkJZWxzZSBpZiAoIXBlUmVmU3RhY2suZW1wdHkoKSkgewotCQkJcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5lbmRzV2l0aChuYW1lICsgIjsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHhzID0gKFN0cmluZykgcmVhZGVyLmdldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy94bWwtc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJfQotCQl9Ci0JCWVudGl0eURlcHRoLS07Ci0JCWVudGl0eUVuZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7Ci0JCWlmICghcGVSZWZTdGFjay5lbXB0eSgpKSB7Ci0JCQlpZiAoKChTdHJpbmcpIHBlUmVmU3RhY2sucGVlaygpKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwZVJlZlN0YWNrLnBvcCgpOwotCQkJCWlmIChwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJCQljdXJyZW50RFREID0gKERURCkgZHRkU3RhY2sucG9wKCk7Ci0JCQkJCWFkZFBFUmVmZXJlbmNlTm9kZShuYW1lKTsKLQkJCQl9Ci0JCQkJcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSAoKEJvb2xlYW4pIHBhcnNpbmdQRVJlZlN0YWNrLnBvcCgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIFhNTCBjb21tZW50IGFueXdoZXJlIGluIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMgaW5zaWRlIG9yIG91dHNpZGUgdGhlIGRvY3VtZW50Ci0JICogZWxlbWVudCwgaW5jbHVkaW5nIGNvbW1lbnRzIGluIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IChpZiByZWFkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgYXJyYXkuCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21tZW50KGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5DT01NRU5UKTsKLQotCQlpZiAoY29tbWVudCA9PSBudWxsKQotCQkJY29tbWVudCA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCQllbHNlCi0JCQljb21tZW50ICs9ICJcbiIgKyBuZXcgU3RyaW5nKGNoKTsgLy8gYXBwZW5kIGFsbCBjb21tZW50cy4gLy8kTk9OLU5MUy0xJAotCQkvLyBUaGUgY29tbWVudCB3aWxsIGdldCByZXNldCBhZnRlcgotCQkvLyBpdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgZm9sbG93aW5nCi0JCS8vIGRlY2xhcmF0aW9uLgotCX0KLQotCS8vCi0JLy8gRXJyb3JIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JLyogV2FybmluZy4gKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW1dhcm5pbmcgICAgXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXNldEVycm9ySW5mb3JtYXRpb24oZXgsICJ3YXJuaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIEVycm9yLiAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW0Vycm9yICAgXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXNldEVycm9ySW5mb3JtYXRpb24oZXgsICJlcnJvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKiBGYXRhbCBlcnJvci4gKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbRmF0YWwgRXJyb3JdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgImZhdGFsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIFJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGxvY2F0aW9uLiAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uU3RyaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJU3RyaW5nIHN5c3RlbUlkID0gZXguZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJc3lzdGVtSWQgPSBzeXN0ZW1JZC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCXN0ci5hcHBlbmQoc3lzdGVtSWQpOwotCQl9Ci0JCXN0ci5hcHBlbmQoJzonKTsKLQkJc3RyLmFwcGVuZChleC5nZXRMaW5lTnVtYmVyKCkpOwotCQlzdHIuYXBwZW5kKCc6Jyk7Ci0JCXN0ci5hcHBlbmQoZXguZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCXJldHVybiBzdHIudG9TdHJpbmcoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydERlY2xhcmF0aW9uKGludCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IERlY2xOb2RlLkVORF9EVEQgfHwgdHlwZSA9PSBEZWNsTm9kZS5FTkRfRU5USVRZX0RURCB8fCB0eXBlID09IERlY2xOb2RlLkNPTU1FTlQgfHwgdHlwZSA9PSBEZWNsTm9kZS5FUlJPUikgewotCQkJcHJldmlvdXNEZWNsTm9kZSA9IGN1cnJlbnREZWNsTm9kZTsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljdXJyZW50RGVjbE5vZGUgPSBuZXcgRGVjbE5vZGUodHlwZSk7Ci0JCQljb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlY2xTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZXhwYW5kZWRFbnRpdHlWYWx1ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKSB7Ci0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uSGVscGVyKGNvbnRlbnRTdHJpbmcpOwotCQljb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoU3RyaW5nIGRlY2xhcmF0aW9uU3RyaW5nKSB7Ci0JCURURFNjYW5uZXIgc2Nhbm5lcjsKLQkJU3RyaW5nIG5hbWU7Ci0KLQkJaWYgKGN1cnJlbnREZWNsTm9kZSA9PSBudWxsICYmIHByZXZpb3VzRGVjbE5vZGUgIT0gbnVsbCAmJiBlbnRpdHlFbmQpIHsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IHByZXZpb3VzRGVjbE5vZGU7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBwcmV2aW91cyBkZWNsTm9kZQotCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCUJhc2VOb2RlIGJhc2VOb2RlID0gbnVsbDsKLQkJCS8vIHN0cmlwIG91dCB0aGUgZW5kaW5nIG1hcmt1cCBzeW1ib2wgIj4iCi0JCQlpZiAoZGVjbGFyYXRpb25TdHJpbmcuZW5kc1dpdGgoIj4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWRlY2xhcmF0aW9uU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKDAsIGRlY2xhcmF0aW9uU3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0KLQkJCWludCBzSW5kZXg7Ci0JCQlTdHJpbmcgY1N0cmluZzsKLQkJCWludCB0eXBlID0gY3VycmVudERlY2xOb2RlLmdldFR5cGUoKTsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgRGVjbE5vZGUuRUxFTUVOVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgRWxlbWVudERlY2wobmFtZSwgY3VycmVudERURC5nZXROYW1lKCkpOwotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGNTdHJpbmcpOwotCQkJCQlDTU5vZGUgY29udGVudE1vZGVsID0gc2Nhbm5lci5zY2FuQ29udGVudE1vZGVsKCk7Ci0JCQkJCWlmIChjb250ZW50TW9kZWwgPT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKCJFeHBlY3RpbmcgJygnIGluIGNvbnRlbnQgbW9kZWwiLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCQkoKEVsZW1lbnREZWNsKSBiYXNlTm9kZSkuc2V0Q29udGVudE1vZGVsTm9kZShjb250ZW50TW9kZWwpOwotCQkJCQllbGVtZW50UG9vbC5wdXQobmFtZSwgYmFzZU5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEZWNsTm9kZS5JTlRFUk5BTF9FTlRJVFkgOgotCQkJCWNhc2UgRGVjbE5vZGUuRVhURVJOQUxfRU5USVRZIDogewotCQkJCQlpZiAoIXBhcnNlRXh0ZXJuYWxQRVJlZmVyZW5jZShkZWNsYXJhdGlvblN0cmluZykpIHsKLQkJCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgZGVjbGFyYXRpb25TdHJpbmcpOwotCQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5FbnRpdHlEZWNsKCk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS1iYXNlTm9kZSAoIiArCi0JCQkJCQkvLyBkZWNsYXJhdGlvblN0cmluZyArICIpIiArIGJhc2VOb2RlKTsKLQkJCQkJCWlmICh0eXBlID09IERlY2xOb2RlLklOVEVSTkFMX0VOVElUWSAmJiBleHBhbmRlZEVudGl0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkoKEVudGl0eURlY2wpIGJhc2VOb2RlKS5leHBhbmRlZFZhbHVlID0gZXhwYW5kZWRFbnRpdHlWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJZW50aXR5UG9vbC5hZGQoKEVudGl0eURlY2wpIGJhc2VOb2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIERlY2xOb2RlLk5PVEFUSU9OIDogewotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGRlY2xhcmF0aW9uU3RyaW5nKTsKLQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5Ob3RhdGlvbkRlY2woKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRGVjbE5vZGUuQVRUTElTVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgQXR0bGlzdChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSk7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgY1N0cmluZy50cmltKCkpOwotCQkJCQlWZWN0b3IgYXR0cnMgPSBzY2FubmVyLnNjYW5BdHRsaXN0RGVjbChlbnRpdHlQb29sKTsKLQkJCQkJU3RyaW5nIGVycm9yU3RyaW5nID0gc2Nhbm5lci5nZXRFcnJvclN0cmluZygpOwotCi0JCQkJCWlmIChhdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkoKEF0dGxpc3QpIGJhc2VOb2RlKS5zZXRBdHREZWZzKGF0dHJzKTsKLQkJCQkJfQotCQkJCQlpZiAoZXJyb3JTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKGVycm9yU3RyaW5nLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0IDogewotCQkJCQljdXJyZW50RGVjbE5vZGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCWJhc2VOb2RlLnNldENvbW1lbnQoY29tbWVudCk7Ci0JCQkJCWNvbW1lbnQgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQliYXNlTm9kZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudERURC5hZGREZWNsKGJhc2VOb2RlKTsKLQkJCQl9Ci0JCQkJbGFzdEJhc2VOb2RlID0gYmFzZU5vZGU7Ci0JCQl9Ci0KLQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGFzdEJhc2VOb2RlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgbGFzdEJhc2VOb2RlLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQlsYXN0QmFzZU5vZGUuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQRVJlZmVyZW5jZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsgLy8gc3RyaXAgb3V0IHRoZSAlIGZyb20gZW50aXR5IG5hbWUKLQkJfQotCQlFbnRpdHlEZWNsIGUgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSwgbnVsbCwgdHJ1ZSk7Ci0JCWUuc2V0RW50aXR5UmVmZXJlbmNlZCh0cnVlKTsKLQkJZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJY3VycmVudERURC5hZGREZWNsKGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RURExvYWRlZChTdHJpbmcgdXJpKSB7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCVN0cmluZyBsaXN0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGR0ZExpc3QgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gZW4gPSBkdGRMaXN0LmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlEVEQgZHRkID0gKERURCkgZW4ubmV4dEVsZW1lbnQoKTsKLQkJCQlsaXN0ICs9IGR0ZC5nZXROYW1lKCk7Ci0JCQkJbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZHRkLmdldE5hbWUoKS5lcXVhbHModXJpKSkgewotCQkJCQlsb2FkZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQlTdHJpbmcgbG9naWNhbFVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgLy8gYnVnIDExMzUzNywgZW5zdXJlIHBoeXNpY2FsIHJlc29sdXRpb24gZ2V0cyBkb25lIGhlcmUKLQkJLy8gcmlnaHQgYmVmb3JlIHdlIGF0dGVtcHQgdG8gb3BlbiBhIHN0cmVhbQotCQlTdHJpbmcgcGh5c2ljYWxVUkkgPSBpZFJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgbG9naWNhbFVSSSk7Ci0JCXJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShsb2dpY2FsVVJJKTsKLQkJaWYoIShwaHlzaWNhbFVSSSA9PSBudWxsIHx8IHBoeXNpY2FsVVJJLmVxdWFscygiIikgfHwgVVJJSGVscGVyLmhhc1Byb3RvY29sKHBoeXNpY2FsVVJJKSkpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkgIHBoeXNpY2FsVVJJID0gImZpbGU6Ly8vIiArIHBoeXNpY2FsVVJJOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVzdWx0LnNldEJ5dGVTdHJlYW0obmV3IExhenlVUkxJbnB1dFN0cmVhbShwaHlzaWNhbFVSSSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gTWFpbgotCS8vCi0KLQkvKiogTWFpbiBwcm9ncmFtIGVudHJ5IHBvaW50LiAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLQotCQkvLyBpcyB0aGVyZSBhbnl0aGluZyB0byBkbz8KLQkJaWYgKGFyZ3YubGVuZ3RoID09IDApIHsKLQkJCXByaW50VXNhZ2UoKTsKLQkJCVN5c3RlbS5leGl0KDEpOwotCQl9Ci0KLQkJLy8gdmFycwotCQlib29sZWFuIGNhbm9uaWNhbCA9IGZhbHNlOwotCQlib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBmYWxzZTsKLQkJRFREUGFyc2VyIHBhcnNlcjsKLQotCQkvLyBjaGVjayBwYXJhbWV0ZXJzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3ZbaV07Ci0KLQkJCS8vIG9wdGlvbnMKLQkJCWlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmIChhcmcuZXF1YWxzKCItYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY2Fub25pY2FsID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi14IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi1oIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcGFyc2VyID0gbmV3IERURFBhcnNlcihjYW5vbmljYWwpOwotCQkJCXBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCQkJCXBhcnNlci5wYXJzZShhcmcpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfSAvLyBtYWluKFN0cmluZ1tdKQotCi0JLyoqIFByaW50cyB0aGUgdXNhZ2UuICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotCi0JCVN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGphdmEgc2F4LkRURFBhcnNlciAob3B0aW9ucykgdXJpIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQlTeXN0ZW0uZXJyLnByaW50bG4oIm9wdGlvbnM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1jICAgICAgIENhbm9uaWNhbCBYTUwgb3V0cHV0LiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigiICAteCAgICAgICBFeHBhbmQgZW50aXR5IHJlZmVyZW5jZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1oICAgICAgIFRoaXMgaGVscCBzY3JlZW4uIik7IC8vJE5PTi1OTFMtMSQKLQotCX0gLy8gcHJpbnRVc2FnZSgpCi0KLQlwcml2YXRlIHZvaWQgc2V0RXJyb3JJbmZvcm1hdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiBleCwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlpZiAoZXguZ2V0TGluZU51bWJlcigpID09IC0xKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGxpbmVOdW1iZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShleC5nZXRMaW5lTnVtYmVyKCkpOwotCQl9Ci0KLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKGV4LmdldE1lc3NhZ2UoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihleC5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlMb2NhdG9yIGxvY2F0b3IgPSBnZXRMb2NhdG9yKCk7Ci0KLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQllcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCi0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERTYXhBcnRpZmFjdFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDk2YmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREU2F4QXJ0aWZhY3RWaXNpdG9yIHsKLQlwdWJsaWMgdm9pZCB2aXNpdERURChEVEQgZHRkKSB7Ci0JCUVudW1lcmF0aW9uIGVuID0gZHRkLmV4dGVybmFsRWxlbWVudHMoKTsKLQotCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBlID0gZW4ubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgRW50aXR5RGVjbCkgewotCQkJCXZpc2l0RW50aXR5RGVjbCgoRW50aXR5RGVjbCkgZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgRWxlbWVudERlY2wpIHsKLQkJCQl2aXNpdEVsZW1lbnREZWNsKChFbGVtZW50RGVjbCkgZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgTm90YXRpb25EZWNsKSB7Ci0JCQkJdmlzaXROb3RhdGlvbkRlY2woKE5vdGF0aW9uRGVjbCkgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbChOb3RhdGlvbkRlY2wgbm90YXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsKEVsZW1lbnREZWNsIGVsZW1lbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJaWYgKGVudGl0eS5pc0VudGl0eVJlZmVyZW5jZWQoKSkgewotCQkJdmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKGVudGl0eSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZW50aXR5LmlzRXh0ZXJuYWwoKSkgewotCQkJCXZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aXNpdEludGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEludGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNzA1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBTY2FubmluZyAvIHBhcnNpbmcgdGhlIGNvbnRlbnQgc3RyaW5nIGZyb20gdGhlIERlY2wgc3RhdGVtZW50Ci0gKiAKLSAqIEB2ZXJzaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERTY2FubmVyIHsKLQkvLyBlbGVtZW50IGNvbnRlbnQgbW9kZWwgc3RyaW5ncwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBlbXB0eV9zdHJpbmcgPSB7J0UnLCAnTScsICdQJywgJ1QnLCAnWSd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBhbnlfc3RyaW5nID0geydBJywgJ04nLCAnWSd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBwY2RhdGFfc3RyaW5nID0geycjJywgJ1AnLCAnQycsICdEJywgJ0EnLCAnVCcsICdBJ307Ci0KLQkvLyBhdHRyaWJ1dGUgdHlwZSBhbmQgZGVmYXVsdCB0eXBlIHN0cmluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gY2RhdGFfc3RyaW5nID0geydDJywgJ0QnLCAnQScsICdUJywgJ0EnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaWRfc3RyaW5nID0geydJJywgJ0QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcmVmX3N0cmluZyA9IHsnUicsICdFJywgJ0YnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gZW50aXRfc3RyaW5nID0geydFJywgJ04nLCAnVCcsICdJJywgJ1QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaWVzX3N0cmluZyA9IHsnSScsICdFJywgJ1MnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gbm10b2tlbl9zdHJpbmcgPSB7J04nLCAnTScsICdUJywgJ08nLCAnSycsICdFJywgJ04nfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gbm90YXRpb25fc3RyaW5nID0geydOJywgJ08nLCAnVCcsICdBJywgJ1QnLCAnSScsICdPJywgJ04nfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcmVxdWlyZWRfc3RyaW5nID0geycjJywgJ1InLCAnRScsICdRJywgJ1UnLCAnSScsICdSJywgJ0UnLCAnRCd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBpbXBsaWVkX3N0cmluZyA9IHsnIycsICdJJywgJ00nLCAnUCcsICdMJywgJ0knLCAnRScsICdEJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGZpeGVkX3N0cmluZyA9IHsnIycsICdGJywgJ0knLCAnWCcsICdFJywgJ0QnfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBzeXN0ZW1fc3RyaW5nID0geydTJywgJ1knLCAnUycsICdUJywgJ0UnLCAnTSd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBwdWJsaWNfc3RyaW5nID0geydQJywgJ1UnLCAnQicsICdMJywgJ0knLCAnQyd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBuZGF0YV9zdHJpbmcgPSB7J04nLCAnRCcsICdBJywgJ1QnLCAnQSd9OwotCi0JcHJpdmF0ZSBpbnRbXSBmT3BTdGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBDTUdyb3VwTm9kZVtdIGZHcnBTdGFjayA9IG51bGw7Ci0KLQlwcml2YXRlIEVudGl0eVBvb2wgZW50aXR5UG9vbDsKLQotCS8qIEF0dHJpYnV0ZSBEZWYgc2Nhbm5lciBzdGF0ZSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSA9IDEsIEF0dF9TY2FubmVyX1N0YXRlX1R5cGUgPSAyLCBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZSA9IDMsIEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZSA9IDQ7Ci0KLQlwcml2YXRlIFN0cmluZ1BhcnNlciBjb250ZW50U3RyaW5nOwotCXByaXZhdGUgU3RyaW5nIGNEYXRhOwotCXByaXZhdGUgaW50IHByZXZOb2RlT2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBub2RlT2Zmc2V0ID0gMTsKLQlwcml2YXRlIFN0cmluZyBvd25lckRURDsKLQotCXByaXZhdGUgU3RyaW5nIGVycm9yU3RyaW5nOwotCi0JcHVibGljIERURFNjYW5uZXIoU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY20pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbTogIiArIGNtKTsKLQkJY29udGVudFN0cmluZyA9IG5ldyBTdHJpbmdQYXJzZXIoY20pOwotCQljRGF0YSA9IGNtOwotCQl0aGlzLm93bmVyRFREID0gb3duZXJEVEQ7Ci0JfQotCi0JLy8KLQkvLyBbNDZdIGNvbnRlbnRzcGVjIDo6PSAnRU1QVFknIHwgJ0FOWScgfCBNaXhlZCB8IGNoaWxkcmVuCi0JLy8KLQkvLyBTcGVjaWZpYyB0byBWaXN1YWxEVEQgOiBhbHNvIGFsbG93cyAlUEVSZWZlcmVuY2U7Ci0JLy8KLQlwdWJsaWMgQ01Ob2RlIHNjYW5Db250ZW50TW9kZWwoKSB7Ci0JCUNNTm9kZSBjbU5vZGUgPSBudWxsOwotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoZW1wdHlfc3RyaW5nKSkgewotCQkJY21Ob2RlID0gbmV3IENNQmFzaWNOb2RlKCJFTVBUWSIsIENNTm9kZVR5cGUuRU1QVFkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGFueV9zdHJpbmcpKSB7Ci0JCQljbU5vZGUgPSBuZXcgQ01CYXNpY05vZGUoIkFOWSIsIENNTm9kZVR5cGUuQU5ZKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQljbU5vZGUgPSBuZXcgQ01SZWZlcmVuY2VOb2RlKGNvbnRlbnRTdHJpbmcuZ2V0RGF0YSgpLCBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpOwotCQl9Ci0JCWVsc2UgaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjb250ZW50bW9kZWwgc3RyaW5nIGlzIGJhZC4uLgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIhISEgZXhjZXB0aW9uIC0gbm8gKCIpOwotCQkJcmV0dXJuIGNtTm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtYWluaW5nIFN0cmluZyA9ICIgKwotCQkJLy8gY29udGVudFN0cmluZy5nZXRSZW1haW5pbmdTdHJpbmcoKSk7Ci0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCWJvb2xlYW4gc2tpcHBlZFBDREFUQSA9IGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhwY2RhdGFfc3RyaW5nKTsKLQkJCWlmIChza2lwcGVkUENEQVRBKSB7Ci0JCQkJY21Ob2RlID0gc2Nhbk1peGVkKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljbU5vZGUgPSBzY2FuQ2hpbGRyZW4oKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBjbU5vZGU7Ci0JfQotCi0JLy8KLQkvLyBbNTFdIE1peGVkIDo6PSAnKCcgUz8gJyNQQ0RBVEEnIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpKicgfCAnKCcgUz8KLQkvLyAnI1BDREFUQScgUz8gJyknCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgcGFzdCAnKCcgUz8gJyNQQ0RBVEEnCi0JLy8KLQlwcml2YXRlIENNTm9kZSBzY2FuTWl4ZWQoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2Nhbk1peGVkLi4uIik7Ci0JCUNNR3JvdXBOb2RlIGNtTm9kZSA9IG5ldyBDTUdyb3VwTm9kZSgpOwotCQljbU5vZGUuc2V0R3JvdXBLaW5kKENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFKTsKLQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTUJhc2ljTm9kZSgiI1BDREFUQSIsIENNTm9kZVR5cGUuUENEQVRBKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBpbnQgcHJldk5vZGVJbmRleCA9IC0xOwotCQlib29sZWFuIHN0YXJSZXF1aXJlZCA9IGZhbHNlOwotCi0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJfQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ3wnLCB0cnVlKSkgewotCQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcpJywgdHJ1ZSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyonLCB0cnVlKSkgewotCQkJCQljbU5vZGUuc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0YXJSZXF1aXJlZCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiAqIGlzIHJlcXVpcmVkIC4uLiAiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJfQotCi0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlpZiAobm9kZU9mZnNldCAhPSAtMSkgewotCQkJCS8vIHNraXAgcGFzcyAifCIKLQkJCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQl9Ci0KLQkJCXN0YXJSZXF1aXJlZCA9IHRydWU7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKCcpJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID09IC0xKQotCQkJCWJyZWFrOwotCi0JCQkvLyBhZGQgbGVhdmUgbm9kZQotCQkJaW50IGxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCVN0cmluZyByZWZOYW1lID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQlpZiAocmVmTmFtZS5zdGFydHNXaXRoKCIlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljbU5vZGUuYWRkQ2hpbGQobmV3IENNUmVmZXJlbmNlTm9kZShyZWZOYW1lLCBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpKTsKLQkJCWVsc2UKLQkJCQljbU5vZGUuYWRkQ2hpbGQobmV3IENNUmVmZXJlbmNlTm9kZShyZWZOYW1lLCBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKSk7Ci0KLQkJfSAvLyBlbmQgd2hpbGUKLQotCi0JCWlmIChjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMSkgewotCQkJLy8gc2ltcGxpZnkgdGhlIGNvbnRlbnRNb2RlbCBpZiB0aGUgQ01Hcm91cE5vZGUgb25seSBoYXMgb25lIGNoaWxkCi0JCQkvLyBub2RlLgotCQkJcmV0dXJuIChDTUJhc2ljTm9kZSkgY21Ob2RlLmdldENoaWxkcmVuKCkuZWxlbWVudEF0KDApOwotCQl9Ci0KLQkJcmV0dXJuIGNtTm9kZTsKLQl9Ci0KLQkvLwotCS8vIFs0N10gY2hpbGRyZW4gOjo9IChjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPwotCS8vIFs0OV0gY2hvaWNlIDo6PSAnKCcgUz8gY3AgKCBTPyAnfCcgUz8gY3AgKSogUz8gJyknCi0JLy8gWzUwXSBzZXEgOjo9ICcoJyBTPyBjcCAoIFM/ICcsJyBTPyBjcCApKiBTPyAnKScKLQkvLyBbNDhdIGNwIDo6PSAoTmFtZSB8IGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/Ci0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgcGFzdCAnKCcKLQotCXByaXZhdGUgQ01Ob2RlIHNjYW5DaGlsZHJlbigpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW5DaGlsZHJlbi4uLiIpOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCX0KLQotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWludCBkZXB0aCA9IDE7Ci0JCWluaXRpYWxpemVDb250ZW50TW9kZWxTdGFjayhkZXB0aCk7Ci0JCWludCBsZW47Ci0KLQkJU3RyaW5nIG5vZGVOYW1lOwotCQlDTUdyb3VwTm9kZSBjbU5vZGUgPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJZkdycFN0YWNrW2RlcHRoXSA9IGNtTm9kZTsKLQotCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBCZWdpbiBvdXR0ZXIgd2hpbGUgbG9vcCAuLi4iICk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCQkvLyBza2lwIHBhc3QgYW55IHdoaXRlIHNwYWNlcyBhZnRlciB0aGUgJygnCi0JCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQl9Ci0KLQkJCQlkZXB0aCsrOwotCQkJCWluaXRpYWxpemVDb250ZW50TW9kZWxTdGFjayhkZXB0aCk7Ci0JCQkJZkdycFN0YWNrW2RlcHRoXSA9IG5ldyBDTUdyb3VwTm9kZSgpOwotCQkJCWZHcnBTdGFja1tkZXB0aCAtIDFdLmFkZENoaWxkKGZHcnBTdGFja1tkZXB0aF0pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnKScpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQkvKgotCQkJICogU3lzdGVtLm91dC5wcmludGxuKCIgcHJldk5vZGVPRmZzZXQgIiArIHByZXZOb2RlT2Zmc2V0KTsKLQkJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiIGN1cnJlbnROb2RlT0Zmc2V0ICIgKyBub2RlT2Zmc2V0KTsKLQkJCSAqLwotCi0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID09IC0xIHx8IGxlbiA8IDEpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbm9kZU5hbWUgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQotCQkJQ01SZXBlYXRhYmxlTm9kZSBybjsKLQkJCWlmIChub2RlTmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJuID0gbmV3IENNUmVmZXJlbmNlTm9kZShub2RlTmFtZSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJuID0gbmV3IENNUmVmZXJlbmNlTm9kZShub2RlTmFtZSwgQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSk7Ci0JCQl9Ci0KLQkJCWZHcnBTdGFja1tkZXB0aF0uYWRkQ2hpbGQocm4pOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0KLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJz8nLCB0cnVlKSkgewotCQkJCXJuLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PUFRJT05BTCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyonLCB0cnVlKSkgewotCQkJCXJuLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcrJywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT05FX09SX01PUkUpOwotCQkJfQotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBCZWdpbiBpbm5lciB3aGlsZSBsb29wIC4uLiBkZXB0aCAiICsKLQkJCQkvLyBkZXB0aCApOwotCQkJCWlmIChmT3BTdGFja1tkZXB0aF0gIT0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRSAmJiBjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ3wnLCB0cnVlKSkgewotCQkJCQlmT3BTdGFja1tkZXB0aF0gPSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRTsKLQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRHcm91cEtpbmQoQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpOwotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZPcFN0YWNrW2RlcHRoXSAhPSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSAmJiBjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJywnLCB0cnVlKSkgewotCQkJCQlmT3BTdGFja1tkZXB0aF0gPSBDTU5vZGVUeXBlLkdST1VQX1NFUVVFTkNFOwotCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldEdyb3VwS2luZChDTU5vZGVUeXBlLkdST1VQX1NFUVVFTkNFKTsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKScsIHRydWUpKSB7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBlcnJvciApIG5vdCBmb3VuZCIpOwotCQkJCQl9Ci0JCQkJCS8vIGVuZCBvZiB0aGUgY3VyZW50IGdyb3VwIG5vZGUKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignPycsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PUFRJT05BTCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcrJywgdHJ1ZSkpIHsKLQkJCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKTsKLQkJCQkJfQotCQkJCQlkZXB0aC0tOwotCQkJCQlpZiAoZGVwdGggPT0gMCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgRW5kIGVuZCBpbm5lciB3aGlsZSBsb29wIC4uLiBkZXB0aAotCQkJCQkvLyAiICsgZGVwdGggKTsKLQotCQkJCX0KLQkJCX0gLy8gaW5uZXIgd2hpbGUKLQotCQkJaWYgKGRlcHRoID09IDApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSAvLyBvdXRlciB3aGlsZQotCi0JCWlmIChjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMSkgewotCQkJLy8gc2ltcGxpZnkgdGhlIGNvbnRlbnRNb2RlbCBpZiB0aGUgQ01Hcm91cE5vZGUgb25seSBoYXMgb25lIGNoaWxkCi0JCQkvLyBub2RlIGFuZCB0aGF0IG5vZGUgaXMgYW4gZWxlbWVudCByZWYuCi0JCQlDTVJlcGVhdGFibGVOb2RlIHJuID0gKENNUmVwZWF0YWJsZU5vZGUpIGNtTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRBdCgwKTsKLQkJCWlmIChybiBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkgewotCQkJCUNNUmVmZXJlbmNlTm9kZSByZWYgPSAoQ01SZWZlcmVuY2VOb2RlKSBybjsKLQkJCQlpZiAocmVmLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKSB7Ci0JCQkJCWlmIChyZWYuZ2V0T2NjdXJyZW5jZSgpID09IENNTm9kZVR5cGUuT05FKSB7Ci0JCQkJCQlyZWYuc2V0T2NjdXJyZW5jZShjbU5vZGUuZ2V0T2NjdXJyZW5jZSgpKTsKLQkJCQkJCXJldHVybiByZWY7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY21Ob2RlLmdldE9jY3VycmVuY2UoKSA9PSBDTU5vZGVUeXBlLk9ORSkgewotCQkJCQkJcmV0dXJuIHJlZjsKLQkJCQkJfQotCQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY21Ob2RlOwotCX0KLQotCS8vCi0JLy8gWzUyXSBBdHRsaXN0RGVjbCA6Oj0gJzwhQVRUTElTVCcgUyBOYW1lIEF0dERlZiogUz8gJz4nCi0JLy8gWzUzXSBBdHREZWYgOjo9IFMgTmFtZSBTIEF0dFR5cGUgUyBEZWZhdWx0RGVjbAotCS8vIFs2MF0gRGVmYXVsdERlY2wgOjo9ICcjUkVRVUlSRUQnIHwgJyNJTVBMSUVEJyB8ICgoJyNGSVhFRCcgUyk/Ci0JLy8gQXR0VmFsdWUpCi0JLy8KLQotCXB1YmxpYyBWZWN0b3Igc2NhbkF0dGxpc3REZWNsKEVudGl0eVBvb2wgZW50aXR5UG9vbCkgewotCQlWZWN0b3IgYXR0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5lbnRpdHlQb29sID0gZW50aXR5UG9vbDsKLQotCQlpbnQgc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZTsKLQkJCi0JCUF0dE5vZGUgYXR0Tm9kZTsKLQotCQl3aGlsZSAodHJ1ZSkgewotCQkJYXR0Tm9kZSA9IG5ldyBBdHROb2RlKCk7Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIHNjYW5uZXIgc3RhdGU6ICIgKyBzY2FubmVyU3RhdGUpOwotCi0JCQkvLyBzY2FubmluZyBhdHQgbmFtZQotCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGF0dCBOYW1lLi4uIik7Ci0JCQkJc2Nhbm5lclN0YXRlID0gY2hlY2tGb3JBdHRyaWJ1dGVXaXRoUEVSZWZlcmVuY2UoYXR0Tm9kZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQlpZiAoc2Nhbm5lclN0YXRlID09IC0xKSB7Ci0JCQkJCXJldHVybiBhdHRMaXN0OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2Nhbm5pbmcgYXR0IHR5cGUKLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbiBhdHQgdHlwZS4uLiIpOwotCi0JCQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhjZGF0YV9zdHJpbmcpKSB7Ci0JCQkJCWF0dE5vZGUudHlwZSA9IG5ldyBTdHJpbmcoY2RhdGFfc3RyaW5nKTsKLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhpZF9zdHJpbmcpKSB7Ci0JCQkJCWlmICghY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHJlZl9zdHJpbmcpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSBuZXcgU3RyaW5nKGlkX3N0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiSURSRUYiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiSURSRUZTIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoZW50aXRfc3RyaW5nKSkgewotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdZJywgdHJ1ZSkpIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9ICJFTlRJVFkiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGllc19zdHJpbmcpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiRU5USVRJRVMiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhubXRva2VuX3N0cmluZykpIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiTk1UT0tFTlMiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiTk1UT0tFTiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKG5vdGF0aW9uX3N0cmluZykpIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBtaXNzaW5nICggaW4gbm90YXRpb24gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlhdHROb2RlLnR5cGUgPSAiTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0JCQkJCWF0dE5vZGUuZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oY29udGVudFN0cmluZywgdHJ1ZSk7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJCQlhdHROb2RlLnR5cGUgPSAiRU5VTUVSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JCQkJCWF0dE5vZGUuZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oY29udGVudFN0cmluZywgZmFsc2UpOwotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKGF0dE5vZGUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgewotCQkJCQkJc2V0RXJyb3JTdHJpbmcoIkZhaWxlZCB0byBmaW5kIHR5cGUgZm9yIGF0dHJpYnV0ZSAnIiArIGF0dE5vZGUubmFtZSArICInLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBvcmlnaW5hbCBEVEQgZmlsZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkvLyB3ZSBmYWlsZWQgdG8gZmluZCBhIHR5cGUgZm9yIHRoaXMgYXR0cmlidXRlCi0JCQkJCQlyZXR1cm4gYXR0TGlzdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gZGVmYXVsdCB0eXBlLi4uIik7Ci0JCQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpKSB7Ci0JCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSBuZXcgU3RyaW5nKHJlcXVpcmVkX3N0cmluZyk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhpbXBsaWVkX3N0cmluZykpIHsKLQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IG5ldyBTdHJpbmcoaW1wbGllZF9zdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhmaXhlZF9zdHJpbmcpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gbmV3IFN0cmluZyhmaXhlZF9zdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCS8vICJkZWZhdWx0IgotCQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9ICJOT0ZJWEVEIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQlhdHROb2RlLmRlZmF1bHRWYWx1ZSA9IHNjYW5EZWZhdWx0QXR0VmFsdWUoY29udGVudFN0cmluZyk7Ci0JCQkJfQotCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7IC8vIG5leHQKLQkJCX0KLQotCi0JCQlhdHRMaXN0LmFkZEVsZW1lbnQoYXR0Tm9kZSk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID49IGNEYXRhLmxlbmd0aCgpKQotCQkJCXJldHVybiBhdHRMaXN0OwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCX0vLyBlbmQgd2hpbGUgbG9vcAotCX0KLQotCS8vCi0JLy8gY29udGVudCBtb2RlbCBzdGFjawotCS8vCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb250ZW50TW9kZWxTdGFjayhpbnQgZGVwdGgpIHsKLQkJaWYgKGZPcFN0YWNrID09IG51bGwpIHsKLQkJCWZPcFN0YWNrID0gbmV3IGludFs4XTsKLQkJCWZHcnBTdGFjayA9IG5ldyBDTUdyb3VwTm9kZVs4XTsKLQkJfQotCQllbHNlIGlmIChkZXB0aCA9PSBmT3BTdGFjay5sZW5ndGgpIHsKLQkJCWludFtdIG5ld1N0YWNrID0gbmV3IGludFtkZXB0aCAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weShmT3BTdGFjaywgMCwgbmV3U3RhY2ssIDAsIGRlcHRoKTsKLQkJCWZPcFN0YWNrID0gbmV3U3RhY2s7Ci0KLQkJCUNNR3JvdXBOb2RlW10gbmV3R3JwU3RhY2sgPSBuZXcgQ01Hcm91cE5vZGVbZGVwdGggKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZkdycFN0YWNrLCAwLCBuZXdHcnBTdGFjaywgMCwgZGVwdGgpOwotCQkJZkdycFN0YWNrID0gbmV3R3JwU3RhY2s7Ci0JCX0KLQkJZk9wU3RhY2tbZGVwdGhdID0gLTE7Ci0JCWZHcnBTdGFja1tkZXB0aF0gPSBudWxsOwotCX0KLQotCS8vCi0JcHJpdmF0ZSBpbnQgY2hlY2tGb3JBdHRyaWJ1dGVXaXRoUEVSZWZlcmVuY2UoQXR0Tm9kZSBhdHROb2RlLCBpbnQgc2Nhbm5lclN0YXRlKSB7Ci0JCWludCBzdGF0ZSA9IC0xOwotCQlpbnQgbGVuOwotCQlTdHJpbmcgcmF3VGV4dDsKLQkJRW50aXR5RGVjbCBwRW50aXR5OwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNoZWNrZm9yQVRUUEVSUmVmZXJlbmNlLSBzdGFydCBzY2FubmVyU3RhdGU6ICIKLQkJLy8gKyBzY2FubmVyU3RhdGUpOwotCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX05hbWUpIHsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQotCQkJcmF3VGV4dCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJYXR0Tm9kZS5uYW1lID0gcmF3VGV4dDsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV9uYW1lIDogIiArIHJhd1RleHQpOwotCi0JCQlpZiAocmF3VGV4dC5zdGFydHNXaXRoKCIlIikgJiYgcmF3VGV4dC5lbmRzV2l0aCgiOyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBwZSA9IHJhd1RleHQuc3Vic3RyaW5nKDEsIHJhd1RleHQubGVuZ3RoKCkgLSAxKTsKLQotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShwZSk7Ci0JCQkJaWYgKHBFbnRpdHkgIT0gbnVsbCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBuYW1lIDoiICsgcmF3VGV4dCArIiBleHBhbmRUbzoiICsKLQkJCQkJLy8gcEVudGl0eS5leHBhbmRlZFZhbHVlKTsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tGb3JBdHRyd2l0aFBFUiAtIG5leHRzdGF0ZTogIgotCQkJCQkvLyArIHN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX1R5cGU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCi0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJCXJhd1RleHQgPSBnZXRQRU5hbWUoKTsKLQkJCQlhdHROb2RlLnR5cGUgPSAiJSIgKyByYXdUZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBlTmFtZSA9IHJhd1RleHQuc3Vic3RyaW5nKDAsIHJhd1RleHQubGVuZ3RoKCkgLSAxKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX3R5cGUgOiBwZS0gIiArIHBlTmFtZSk7Ci0JCQkJcEVudGl0eSA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHBlTmFtZSk7Ci0JCQkJaWYgKHBFbnRpdHkgIT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQkJfQotCQllbHNlIGlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJCXJhd1RleHQgPSBnZXRQRU5hbWUoKTsKLQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gcmF3VGV4dDsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX2RlZmF1bHRUeXBlIDogIiArIHJhd1RleHQpOwotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShyYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSkpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJfQotCQllbHNlIGlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS5kZWZhdWx0VmFsdWUgPSByYXdUZXh0OwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGVfZGVmYXVsdFZhbHVlIDogIiArIHJhd1RleHQpOwotCi0JCQkJcEVudGl0eSA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHJhd1RleHQuc3Vic3RyaW5nKDEsIHJhd1RleHQubGVuZ3RoKCkgLSAxKSk7Ci0JCQkJaWYgKHBFbnRpdHkgIT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZTsKLQkJfQotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UEVOYW1lKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIoJzsnLCB0cnVlKTsKLQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlpbnQgbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQlyZXR1cm4gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUoU3RyaW5nIGF0dHJDb250ZW50U3RyaW5nLCBpbnQgY3VycmVudFN0YXRlKSB7Ci0JCVN0cmluZ1BhcnNlciBzcCA9IG5ldyBTdHJpbmdQYXJzZXIoYXR0ckNvbnRlbnRTdHJpbmcudHJpbSgpKTsKLQotCi0JCWludCBuZXh0U3RhdGUgPSBjdXJyZW50U3RhdGU7Ci0JCWludCBuT2Zmc2V0ID0gMDsKLQotCQkvKgotCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgQXR0Q29udGVudFN0cmluZ3QgOiAiICsKLQkJICogYXR0ckNvbnRlbnRTdHJpbmcpOyBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQKLQkJICogQXR0Q29udGVudFN0cmluZ0wgOiAiICsgYXR0ckNvbnRlbnRTdHJpbmcubGVuZ3RoKCkpOwotCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgY3VycmVudHN0YXRlIDogIiArIGN1cnJlbnRTdGF0ZSk7Ci0JCSAqLwotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgaW5zaWRlIHdoaWwgbmV4dHN0YXRlIDogIiArCi0JCQkvLyBuZXh0U3RhdGUpOwotCQkJaWYgKG5leHRTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lKSB7IC8vIHRoZSBjdXJyZW50Ci0JCQkJCQkJCQkJCQkJCS8vIHNjYW5uaW5nIHN0YXRlIGlzCi0JCQkJCQkJCQkJCQkJCS8vIEF0dHIgTmFtZSwgaXMgdGhlCi0JCQkJCQkJCQkJCQkJCS8vIG5leHQgcGFydCBBdHRyIFR5cGUKLQkJCQkJCQkJCQkJCQkJLy8gPwotCQkJCWlmIChpc0F0dHJOYW1lKHNwKSkgewotCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5leHRTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlKSB7IC8vIHRoZSBjdXJyZW50Ci0JCQkJCQkJCQkJCQkJCQkvLyBzY2FubmluZyBzdGF0ZQotCQkJCQkJCQkJCQkJCQkJLy8gaXMgQXR0ciBUeXBlLAotCQkJCQkJCQkJCQkJCQkJLy8gaXMgdGhlIG5leHQKLQkJCQkJCQkJCQkJCQkJCS8vIHBhcnQgRGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJLy8gQXR0ciBUeXBlID8KLQotCQkJCWlmIChpc0F0dHJUeXBlKHNwKSkgewotCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgQXR0ciBQYXJ0IC0gaXMgbm90IGFuIEF0dHIgVHlwZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCX0KLQotCQkJaWYgKG5leHRTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZSkgewotCi0JCQkJaW50IGRUeXBlID0gaXNBdHRyRGVmYXVsdFR5cGUoc3ApOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hhdGlzdGhlTmV4dCBpbnNpZGUgZFR5cGUgOiAiICsKLQkJCQkvLyBkVHlwZSk7Ci0JCQkJaWYgKGRUeXBlID09IDEpIC8vICNSRVFVSVJFRCBvciAjSU1QTElFRAotCQkJCXsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChkVHlwZSA9PSAyKSAvLyAjRklYRUQKLQkJCQkJewotCQkJCQkJLy8gbmVlZCB0byBsb29rIGF0IHRoaXMgYWdhaW4KLQkJCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHNjYW5EZWZhdWx0QXR0VmFsdWUoc3ApICE9IG51bGwpIHsKLQkJCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKG5PZmZzZXQgPT0gc3AuZ2V0Q3VycmVudE9mZnNldCgpKQotCQkJCWJyZWFrOwotCi0JCQluT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobk9mZnNldCA+PSBhdHRyQ29udGVudFN0cmluZy5sZW5ndGgoKSB8fCBuT2Zmc2V0ID09IC0xKQotCQkJCWJyZWFrOwotCi0JCX0gLy8gZW5kIHdoaWxlCi0KLQkJcmV0dXJuIG5leHRTdGF0ZTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJOYW1lKFN0cmluZ1BhcnNlciBzcCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0ck5hbWUgLSBzcDoiICsgc3AuZkRhdGEpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0ck5hbWUgLSBjdXJyZW50T2Zmc2V0OiIgKwotCQkvLyBzcC5nZXRDdXJyZW50T2Zmc2V0KCkpOwotCQlib29sZWFuIGlzQXR0ck5hbWUgPSBmYWxzZTsKLQkJaW50IHByZXYgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCXNwLnNraXBQYXN0TmFtZSgnICcpOwotCQlpZiAoKHNwLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXYpID4gMCkKLQkJCWlzQXR0ck5hbWUgPSB0cnVlOwotCQlyZXR1cm4gaXNBdHRyTmFtZTsKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJUeXBlKFN0cmluZ1BhcnNlciBzcCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0clR5cGUgLSBzcDoiICsgc3AuZkRhdGEpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0clR5cGUgLSBjdXJyZW50T2Zmc2V0OiIgKwotCQkvLyBzcC5nZXRDdXJyZW50T2Zmc2V0KCkpOwotCQlib29sZWFuIGlzQXR0clR5cGUgPSBmYWxzZTsKLQkJaWYgKHNwLnNraXBwZWRTdHJpbmcoY2RhdGFfc3RyaW5nKSkgewotCQkJaXNBdHRyVHlwZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhpZF9zdHJpbmcpKSB7Ci0JCQlpZiAoIXNwLnNraXBwZWRTdHJpbmcocmVmX3N0cmluZykpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gSUQKLQkJCX0KLQkJCWVsc2UgaWYgKCFzcC5sb29raW5nQXRDaGFyKCdTJywgdHJ1ZSkpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gSURSRUZTCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gSURSRUYKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKGVudGl0X3N0cmluZykpIHsKLQkJCWlmIChzcC5sb29raW5nQXRDaGFyKCdZJywgdHJ1ZSkpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gRU5USVRZCi0JCQl9Ci0JCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKGllc19zdHJpbmcpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIEVOVElUSVRFUwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcobm10b2tlbl9zdHJpbmcpKSB7Ci0JCQlpZiAoc3AubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIE5NVE9LRU5TCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gTk1UT0tFTgotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcobm90YXRpb25fc3RyaW5nKSkgewotCQkJaWYgKCFzcC5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBtaXNzaW5nICggaW4gbm90YXRpb24gIik7Ci0JCQl9Ci0JCQlWZWN0b3IgZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oc3AsIHRydWUpOwotCQkJaWYgKGVudW1MaXN0ID09IG51bGwgfHwgZW51bUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaXNBdHRyVHlwZSA9IGZhbHNlOwotCQkJZWxzZQotCQkJCWlzQXR0clR5cGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHNwLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJLy8gIkVOVU1FUkFUSU9OIjsKLQkJCVZlY3RvciBlbnVtTGlzdCA9IHNjYW5FbnVtZXJhdGlvbihzcCwgZmFsc2UpOwotCQkJaWYgKGVudW1MaXN0ID09IG51bGwgfHwgZW51bUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaXNBdHRyVHlwZSA9IGZhbHNlOwotCQkJZWxzZQotCQkJCWlzQXR0clR5cGUgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGlzQXR0clR5cGU7Ci0KLQl9Ci0KLQkvKgotCSAqIHJldHVybiAwIC0gbm90IGRlZmF1bHQgdHlwZSAxIC0gI1JFUVVJUkVEIG9yICNJTVBMSUVEIDIgLSAjRklYRUQKLQkgKi8KLQotCXByaXZhdGUgaW50IGlzQXR0ckRlZmF1bHRUeXBlKFN0cmluZ1BhcnNlciBzcCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0ckRlZmF1bHRUeXBlIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChzcC5za2lwcGVkU3RyaW5nKHJlcXVpcmVkX3N0cmluZykpIHsKLQkJCXJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhpbXBsaWVkX3N0cmluZykpIHsKLQkJCXJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhmaXhlZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAyOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBbNThdIE5vdGF0aW9uVHlwZSA6Oj0gJ05PVEFUSU9OJyBTICcoJyBTPyBOYW1lIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpJwotCS8vIFs1OV0gRW51bWVyYXRpb24gOjo9ICcoJyBTPyBObXRva2VuIChTPyAnfCcgUz8gTm10b2tlbikqIFM/ICcpJwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nICcoJwotCS8vCi0JcHJpdmF0ZSBWZWN0b3Igc2NhbkVudW1lcmF0aW9uKFN0cmluZ1BhcnNlciBzcCwgYm9vbGVhbiBpc05vdGF0aW9uVHlwZSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBzY2FuRW51bSAuLi4iKTsKLQkJVmVjdG9yIGVudW1MaXN0ID0gbnVsbDsKLQkJaW50IGxlbjsKLQotCQlpZiAoc3AubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCWludCBwcmV2Tm9kZU9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJaW50IG5vZGVPZmZzZXQ7Ci0KLQkJU3RyaW5nIG5vZGVOYW1lOwotCi0JCXdoaWxlICh0cnVlKSB7Ci0KLQkJCWlmIChpc05vdGF0aW9uVHlwZSkKLQkJCQlzcC5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnKScpOwotCQkJZWxzZQotCQkJCXNwLnNraXBQYXN0Tm10b2tlbkFuZFBFUmVmZXJlbmNlKCcpJyk7Ci0KLQkJCW5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID09IC0xKSB7Ci0JCQkJcmV0dXJuIGVudW1MaXN0OwotCQkJfQotCi0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlub2RlTmFtZSA9IHNwLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQotCQkJaWYgKGVudW1MaXN0ID09IG51bGwpCi0JCQkJZW51bUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCWVudW1MaXN0LmFkZEVsZW1lbnQobm9kZU5hbWUpOwotCi0JCQlpZiAoc3AubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKCFzcC5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQlpZiAoIXNwLmxvb2tpbmdBdENoYXIoJyknLCB0cnVlKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNjYW5uaW5nIGVudW0gdmFsdWVzIC0gZXJyb3IgbWlzc2luZyAnKSciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChzcC5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gZW51bUxpc3Q7Ci0JfQotCi0JLy8KLQkvLyBbMTBdIEF0dFZhbHVlIDo6PSAnIicgKFtePCYiXSB8IFJlZmVyZW5jZSkqICciJwotCS8vIHwgIiciIChbXjwmJ10gfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8qKgotCSAqIFNjYW4gdGhlIGRlZmF1bHQgdmFsdWUgaW4gYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRUeXBlCi0JICogICAgICAgICAgICBoYW5kbGUgdG8gdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIGhhbmRsZSBpbiB0aGUgc3RyaW5nIHBvb2wgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZQotCSAqIEByZXR1cm4gaGFuZGxlIGluIHRoZSBzdHJpbmcgcG9vbCBmb3IgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlCi0JICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBzY2FuRGVmYXVsdEF0dFZhbHVlKFN0cmluZ1BhcnNlciBzcCkgewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gZGVmYXVsdCBBVFQgVmFsdWUuLi4gc3A6IiArIHNwLmZEYXRhKTsKLQotCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCWJvb2xlYW4gc2luZ2xlOwotCQlpZiAoIShzaW5nbGUgPSBzcC5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKSAmJiAhc3AubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJY2hhciBxY2hhciA9IHNpbmdsZSA/ICdcJycgOiAnXCInOwotCQlpbnQgc09mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJc3Auc2tpcFRvQ2hhcihxY2hhciwgdHJ1ZSk7Ci0JCWludCBsZW4gPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCkgLSBzT2Zmc2V0IC0gMTsKLQkJaWYgKGxlbiA9PSAwKQotCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQl2YWx1ZSA9IHNwLmdldFN0cmluZyhzT2Zmc2V0LCBsZW4pOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvLwotCS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsCi0JLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+JwotCS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+JwotCS8vIFs3M10gRW50aXR5RGVmIDo6PSBFbnRpdHlWYWx1ZSB8IChFeHRlcm5hbElEIE5EYXRhRGVjbD8pCi0JLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElECi0JLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwKLQkvLyB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbAotCS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lCi0JLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInCi0JLy8gfCAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgJ0VOVElUWScKLQkvLwotCXB1YmxpYyBFbnRpdHlEZWNsIHNjYW5FbnRpdHlEZWNsKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IDE7Ci0JCW5vZGVPZmZzZXQgPSAxOwotCQlpbnQgbGVuOwotCQlib29sZWFuIGlzUEVEZWNsID0gZmFsc2U7Ci0JCUVudGl0eURlY2wgZW50aXR5RGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgbmRhdGEgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSBmYWxzZTsgLy8gPCFFTlRJVFkgeCAieCI+Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSB0cnVlOyAvLyA8IUVOVElUWSAlIHggIngiPgotCQkJfQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lKCcgJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCW5hbWUgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCWJvb2xlYW4gc2luZ2xlOwotCQlpZiAoKHNpbmdsZSA9IGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgfHwgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcIicsIHRydWUpKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzY2FuRW50aXR5VmFsdWUoc2luZ2xlKTsKLQkJCWVudGl0eURlY2wgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBvd25lckRURCwgdmFsdWUsIGlzUEVEZWNsKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGV4dGVybmFsIGVudGl0eQotCQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQkJaWYgKHhJRCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1BFRGVjbCkgLy8gZ2VuZXJhbCBlbnRpdHkKLQkJCQl7Ci0JCQkJCWJvb2xlYW4gdW5wYXJzZWQgPSBmYWxzZTsKLQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQl1bnBhcnNlZCA9IGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhuZGF0YV9zdHJpbmcpOwotCQkJCQlpZiAodW5wYXJzZWQpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZSgnICcpOwotCQkJCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJCQkJbmRhdGEgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbnRpdHlEZWNsID0gbmV3IEVudGl0eURlY2wobmFtZSwgb3duZXJEVEQsIHhJRCwgaXNQRURlY2wsIG5kYXRhKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5RGVjbDsKLQl9Ci0KLQotCS8vCi0JLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8IFB1YmxpY0lEKSBTPwotCS8vICc+JwotCS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwKLQkvLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbAotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nICdOT1RBVElPTicKLQkvLwotCXB1YmxpYyBOb3RhdGlvbkRlY2wgc2Nhbk5vdGF0aW9uRGVjbCgpIHsKLQkJcHJldk5vZGVPZmZzZXQgPSAxOwotCQlub2RlT2Zmc2V0ID0gMTsKLQkJaW50IGxlbjsKLQkJTm90YXRpb25EZWNsIG5vdGF0aW9uRGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWUoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJbm90YXRpb25EZWNsID0gbmV3IE5vdGF0aW9uRGVjbChuYW1lLCBvd25lckRURCk7Ci0KLQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQlpZiAoeElEICE9IG51bGwpIHsKLQkJCWlmICh4SUQuZ2V0U3lzdGVtTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0U3lzdGVtSWQoeElELmdldFN5c3RlbUxpdGVyYWwoKSk7Ci0JCQl9Ci0JCQlpZiAoeElELmdldFB1YklkTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0UHVibGljSWQoeElELmdldFB1YklkTGl0ZXJhbCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RhdGlvbkRlY2w7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBzY2FuRW50aXR5VmFsdWUoYm9vbGVhbiBzaW5nbGUpIHsKLQkJY2hhciBxY2hhciA9IHNpbmdsZSA/ICdcJycgOiAnXCInOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIGZhbHNlKTsKLQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCVN0cmluZyB2YWx1ZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLy8KLQkvLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbAotCS8vIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsCi0JcHJpdmF0ZSBFeHRlcm5hbElEIHNjYW5FeHRlcm5hbElEKCkgewotCQlFeHRlcm5hbElEIHhJRCA9IG51bGw7Ci0JCWNoYXIgcWNoYXIgPSAnXCInOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHN5c3RlbV9zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeXN0ZW1pZC4uLiIgKyBzeXN0ZW1JZCk7Ci0JCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChzeXN0ZW1JZCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHB1YmxpY19zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQkvLyBwdWJsaWNMaXRlcmFsCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCi0JCQkvLyBzeXN0ZW1MaXRlcmFsCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCi0JCQlpZiAobGVuID4gMCkgewotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChwdWJsaWNJZCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhJRDsKLQl9Ci0KLQkvLwotCS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsCi0JLy8KLQotCS8vIGRtdyAxMS8xNSBwcml2YXRlIG1ldGhvZCBuZXZlciByZWFkIGxvY2FsbHkKLQkvLyBUT0RPOiBjaGFuZ2UgdG8gcHJpdmF0ZSBpZiB1c2VkLCBvdGhlcndpc2Ugc2hvdWxkIGJlIHJlbW92ZWQKLQlTdHJpbmcgc2NhblB1YmxpY0lEKCkgewotCQlTdHJpbmcgcElEID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhwdWJsaWNfc3RyaW5nKSkgewotCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJcmV0dXJuIHBJRDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFRvQ2hhcignICcsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlwSUQgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJfQotCi0JCXJldHVybiBwSUQ7Ci0JfQotCi0JLy8KLQkvLyBNYWluCi0JLy8KLQotCS8qKiBNYWluIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCi0JCS8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotCQlpZiAoYXJndi5sZW5ndGggPT0gMCkgewotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotCQkvLyBEVERTY2FubmVyIHNjID0gbmV3IERURFNjYW5uZXIoYXJndlswXSk7Ci0JCURURFNjYW5uZXIgc2MgPSBuZXcgRFREU2Nhbm5lcigiaGVsbG8uZHRkIiwgIiBnaWYgU1lTVEVNIFwiR0lGIEZpbGVcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJTm90YXRpb25EZWNsIG4gPSBzYy5zY2FuTm90YXRpb25EZWNsKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTm9hdGlvbiBOYW1lOiAiICsgbi5nZXROb2RlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN5c3RlbUlkOiAiICsgbi5nZXRTeXN0ZW1JZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJLy8gQXR0cmlidXRlcwotCQkvLyBWZWN0b3IgbGlzdHMgPSBzYy5zY2FuQXR0bGlzdERlY2woKTsKLQkJLy8gc2MucHJpbnRBdHRMaXN0KGxpc3RzKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNOiAiICsgc2Muc2NhbkNvbnRlbnRNb2RlbCgpKTsKLQotCX0gLy8gbWFpbihTdHJpbmdbXSkKLQotCS8qKgotCSAqIEdldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvclN0cmluZygpIHsKLQkJcmV0dXJuIGVycm9yU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGVycm9yU3RyaW5nCi0JICogICAgICAgICAgICBUaGUgZXJyb3JTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdHJpbmcoU3RyaW5nIGVycm9yU3RyaW5nKSB7Ci0JCXRoaXMuZXJyb3JTdHJpbmcgPSBlcnJvclN0cmluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EZWNsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTcyMGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWNsTm9kZSB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgSU5WQUxJRCA9IC0xOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVMRU1FTlQgPSAxOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEFUVExJU1QgPSAyOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVOVElUWSA9IDM7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgSU5URVJOQUxfRU5USVRZID0gNDsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFWFRFUk5BTF9FTlRJVFkgPSA1OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IElOVEVSTkFMX0dFTkVSQUxfRU5USVRZID0gNjsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZID0gNzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFWFRFUk5BTF9HRU5FUkFMX0VOVElUWSA9IDg7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWSA9IDk7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgPSAxMDsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBOT1RBVElPTiA9IDExOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IENPTU1FTlQgPSAxMjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IFNUQVJUX0RURCA9IDIxOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVORF9EVEQgPSAyMjsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBTVEFSVF9FTlRJVFlfRFREID0gMjM7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5EX0VOVElUWV9EVEQgPSAyNDsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFUlJPUiA9IDI1OwotCi0JcHVibGljIGludCB0eXBlID0gSU5WQUxJRDsKLQlwcml2YXRlIFN0cmluZyBkZWNsTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgY29udGVudFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBjb21tZW50ID0gbnVsbDsKLQotCS8vCi0JLy8gQ29uc3RhbnRzCi0JLy8KLQotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLwotCXB1YmxpYyBEZWNsTm9kZShpbnQgdHlwZSkgewotCQl0aGlzKG51bGwsIHR5cGUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBEZWNsTm9kZShTdHJpbmcgbmFtZSwgaW50IHR5cGUsIFN0cmluZyBjb250ZW50U3RyaW5nKSB7Ci0JCXRoaXMuZGVjbE5hbWUgPSBuYW1lOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmNvbnRlbnRTdHJpbmcgPSBjb250ZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbE5hbWUoKSB7Ci0JCXJldHVybiBkZWNsTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNsTmFtZShTdHJpbmcgbmFtZSkgewotCQlkZWNsTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50U3RyaW5nKCkgewotCQlyZXR1cm4gY29udGVudFN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50U3RyaW5nKFN0cmluZyBjb250ZW50KSB7Ci0JCXRoaXMuY29udGVudFN0cmluZyA9IGNvbnRlbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7Ci0JCXRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0KLQl7Ci0JCXJldHVybiAiTm9kZSBOYW1lOiAiICsgZGVjbE5hbWUgKyAiIFR5cGU6ICIgKyB0eXBlICsgIiBDb250ZW50U3RyaW5nOiAiICsgY29udGVudFN0cmluZzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRWxlbWVudERlY2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VsZW1lbnREZWNsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlODcxNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRWxlbWVudERlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlY2wgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JQ01Ob2RlIGNvbnRlbnRNb2RlbE5vZGUgPSBudWxsOwotCi0JcHVibGljIEVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQpIHsKLQkJdGhpcyhuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQsIFN0cmluZyBjb21tZW50LCBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBjb21tZW50LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0Q29udGVudE1vZGVsTm9kZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRNb2RlbE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudE1vZGVsTm9kZShDTU5vZGUgY21ub2RlKSB7Ci0JCWNvbnRlbnRNb2RlbE5vZGUgPSBjbW5vZGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlEZWNsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlEZWNsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2M5OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5RGVjbCBleHRlbmRzIEJhc2VOb2RlIHsKLQlib29sZWFuIGlzUGFyYW1ldGVyID0gZmFsc2U7Ci0JU3RyaW5nIGV4cGFuZGVkVmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbAotCQkJCQkJCQkJLy8gRW50aXRpZXMKLQlTdHJpbmcgdmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbCBFbnRpdGllcwotCUV4dGVybmFsSUQgZXh0ZXJuYWxJRCA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsCi0JCQkJCQkJCQkvLyBFbnRpdGllcwotCVN0cmluZyBuZGF0YSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsIEVudGl0aWVzCi0KLQlib29sZWFuIHBhcnNlZCA9IGZhbHNlOwotCURURFBhcnNlciBkdGQgPSBudWxsOyAvLyBBbHdheXMgbnVsbCwgZXhjZXB0IHdoZW4gaXQgaGFzIGJlZW4gcGFyc2VkLgotCi0JYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgaW50ZXJuYWwgRW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhpcyBFbnRpdHkuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgWE1MLWVuY29kZWQgdmFsdWUgdGhhdCB3YXMgZGlyZWN0bHkgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICBFbnRpdHkuCi0JICogQHBhcmFtIGlzUGFyYW1ldGVyCi0JICogICAgICAgICAgICA9dHJ1ZSBpZiBhIHBhcmFtZXRlciBFbnRpdHk7IG90aGVyd2lzZSA9ZmFsc2UuCi0JICovCi0JcHVibGljIEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGlzUGFyYW1ldGVyKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmlzUGFyYW1ldGVyID0gaXNQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIGV4dGVybmFsIEVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIG9mIHRoZSBFbnRpdHkuCi0JICogQHBhcmFtIGV4dGVybmFsSUQKLQkgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2UocykgdG8gdGhlIGV4dGVybmFsIGVudGl0eSB0byByZXRyaWV2ZS4KLQkgKiBAcGFyYW0gaXNQYXJhbWV0ZXIKLQkgKiAgICAgICAgICAgID10cnVlIGlmIGEgcGFyYW1ldGVyIEVudGl0eTsgb3RoZXJ3aXNlID1mYWxzZS4KLQkgKiBAcGFyYW0gbmRhdGEKLQkgKiAgICAgICAgICAgIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmFyeSBFbnRpdHksIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgICAgaWYgdGhlIEVudGl0eSBpcyBhIHRleHQgRW50aXR5LgotCSAqIEBzZWUgc2F4LkV4dGVybmFsSUQKLQkgKi8KLQlwdWJsaWMgRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBFeHRlcm5hbElEIGV4dGVybmFsSUQsIGJvb2xlYW4gaXNQYXJhbWV0ZXIsIFN0cmluZyBuZGF0YSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IGV4dGVybmFsSUQ7Ci0JCXRoaXMuaXNQYXJhbWV0ZXIgPSBpc1BhcmFtZXRlcjsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIEVudGl0eSBpcyBhIHBhcmFtZXRlciBFbnRpdHkuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiBhbiBpbnRlcm5hbCBwYXJhbWV0ZXIgRW50aXR5OyBvdGhlcndpc2UgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgewotCQlyZXR1cm4gdGhpcy5pc1BhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBYTUwtZW5jb2RlZCB2YWx1ZSB0aGF0IHdhcyBkaXJlY3RseSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgIGludGVybmFsIEVudGl0eTsgb3RoZXJ3aXNlLCA8dmFyPm51bGw8L3Zhcj4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZWZlcmVuY2VkKCkgewotCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZWZlcmVuY2VkKGJvb2xlYW4gcmVmZXJlbmNlKSB7Ci0JCWVudGl0eVJlZmVyZW5jZWQgPSByZWZlcmVuY2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIEEgc3lzdGVtIGlkZW50aWZpZXIgaXMgYQotCSAqIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElEI2dldFN5c3RlbUxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlpZiAoZXh0ZXJuYWxJRCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzLmV4dGVybmFsSUQuZ2V0U3lzdGVtTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gQSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhCi0JICogVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZGVudGlmaWVyCi0JICogICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZGVudGlmaWVyKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2V0U1lzdGVtSWQgLSBleHRlcm5hbElkOiAiICsgZXh0ZXJuYWxJRCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKSwgc3lzdGVtSWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIE5vdGF0aW9uLiBUaGlzIHZhbHVlIGlzIG9ubHkgdmFsaWQKLQkgKiBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBhbiBleHRlcm5hbCBlbnRpdGllcwotCSAqIGNvbnRlbnQuIElmIHJldHJpZXZhbCBmYWlscyB1c2luZyB0aGUgcHVibGljIGlkZW50aWZpZXIsIGFuIGF0dGVtcHQKLQkgKiBtdXN0IGJlIG1hZGUgdG8gcmV0cmlldmUgY29udGVudCB1c2luZyB0aGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogQHJldHVybiBUaGUgcHVibGljIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCWlmIChleHRlcm5hbElEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZCBpZgotCSAqIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGFuIGV4dGVybmFsIGVudGl0aWVzCi0JICogY29udGVudC4gSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdAotCSAqIG11c3QgYmUgbWFkZSB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWRlbnRpZmllcgotCSAqICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyLgotCSAqIEBzZWUgI2dldFB1YmxpY0lkCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZGVudGlmaWVyKSB7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkZW50aWZpZXIsIHRoaXMuZXh0ZXJuYWxJRC5nZXRTeXN0ZW1MaXRlcmFsKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4dGVybmFsIElEIG9mIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlZmVyZW5jZShzKSB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHRvIHJldHJpZXZlOyBvdGhlcndpc2UsCi0JICogICAgICAgICA8dmFyPm51bGw8L3Zhcj4uCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBFeHRlcm5hbElEIGdldEV4dGVybmFsSUQoKSB7Ci0JCXJldHVybiB0aGlzLmV4dGVybmFsSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZW50aXR5IHZhbHVlIGlzIGV4dGVybmFsLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgZW50aXR5IGlzIGV4dGVybmFsOyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5uZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgbmRhdGEpIHsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmRhdGE7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKFN0cmluZyBhcmcpIHsgdGhpcy5uZGF0YSA9IGFyZzsgfQotCSAqLwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGEgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50aXR5IHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgdGhlIGV4dGVybmFsIGJpbmFyeSBlbnRpdHkgY29udGFpbnMgYSBub3RhdGlvbjsKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm5kYXRhICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHMpIHsKLQkJdGhpcy52YWx1ZSA9IHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VkKGJvb2xlYW4gcCkgewotCQl0aGlzLnBhcnNlZCA9IHA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UGFyc2VkKCkgewotCQlyZXR1cm4gdGhpcy5wYXJzZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2U0MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIEVudGl0eVBvb2wgewotCXByaXZhdGUgSGFzaHRhYmxlIG1fZW50aXR5ID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIG1fcGFyYSA9IG5ldyBIYXNodGFibGUoKTsgLy8gcGFyYW1ldGVyIHJlZmVyZW5jZXMKLQotCXB1YmxpYyBFbnRpdHlQb29sKCkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlTdHJpbmcgbmFtZSA9IGVudGl0eS5nZXROb2RlTmFtZSgpOwotCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyKCkpIHsKLQkJCWlmIChtX3BhcmEuY29udGFpbnNLZXkobmFtZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbV9wYXJhLnB1dChuYW1lLCBlbnRpdHkpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG1fZW50aXR5LmNvbnRhaW5zS2V5KG5hbWUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCW1fZW50aXR5LnB1dChuYW1lLCBlbnRpdHkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBFbnRpdHlEZWNsIHJlZmVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoRW50aXR5RGVjbCkgbV9lbnRpdHkuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBFbnRpdHlEZWNsIHJlZmVyUGFyYShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKEVudGl0eURlY2wpIG1fcGFyYS5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIDxDT0RFPkVudW1lcmF0aW9uPC9DT0RFPiBvZiA8Q09ERT5FbnRpdHlEZWNsPC9DT0RFPi4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FbnRpdHlEZWNsCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlyZXR1cm4gbV9lbnRpdHkuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gPENPREU+RW51bWVyYXRpb248L0NPREU+IG9mIDxDT0RFPkVudGl0eURlY2w8L0NPREU+IGZvcgotCSAqIHBhcmFtZXRlciBlbnRpdGllcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FbnRpdHlEZWNsCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIHBhcmFtZXRlckVudGl0eUVsZW1lbnRzKCkgewotCQlyZXR1cm4gbV9wYXJhLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogRm9yIERURCNnZXRFbnRpdGllcygpOwotCSAqLwotCUhhc2h0YWJsZSBnZXRFbnRpdHlIYXNoKCkgewotCQlyZXR1cm4gdGhpcy5tX2VudGl0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FcnJvck1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Vycm9yTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTk1ZThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Vycm9yTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0KLQotcHVibGljIGNsYXNzIEVycm9yTWVzc2FnZSB7Ci0JcHJpdmF0ZSBpbnQgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgc2V2ZXJpdHk7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JTdHJpbmc7Ci0KLQotCXB1YmxpYyBFcnJvck1lc3NhZ2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvcikgewotCQllcnJvclN0cmluZyA9IGVycm9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkgewotCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWlmIChzZXZlcml0eSA9PSAid2FybmluZyIpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5zZXZlcml0eSA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoc2V2ZXJpdHkgPT0gImVycm9yIikgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnNldmVyaXR5ID0gMTsKLQkJfQotCQllbHNlIGlmIChzZXZlcml0eSA9PSAiZmF0YWwiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2V2ZXJpdHkgPSAyOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JMaW5lKGludCBsaW5lKSB7Ci0JCWVycm9yTGluZSA9IGxpbmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JDb2x1bW4oaW50IGNvbHVtbikgewotCQllcnJvckNvbHVtbiA9IGNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yU3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVycm9yTGluZSgpIHsKLQkJcmV0dXJuIGVycm9yTGluZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVycm9yQ29sdW1uKCkgewotCQlyZXR1cm4gZXJyb3JDb2x1bW47Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAtMTsKLQotCXB1YmxpYyB2b2lkIHNldEVycm9yU3RhcnRPZmZzZXQoaW50IHN0YXJ0KSB7Ci0JCXN0YXJ0T2Zmc2V0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvclN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0ID0gLTE7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckVuZE9mZnNldChpbnQgZW5kKSB7Ci0JCWVuZE9mZnNldCA9IGVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVycm9yRW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZW5kT2Zmc2V0OwotCX0KLQotCi0JT2JqZWN0IG9iamVjdDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNsb3Nlc3Qgb2JqZWN0IHRvIHRoZSBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGNsb3Nlc3Qgb2JqZWN0IHRvIHRoZSBlcnJvci4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IHYpIHsKLQkJdGhpcy5vYmplY3QgPSB2OwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTmV3RXJyb3JNZXNzYWdlTGluZShTdHJpbmcgbmV3TGluZSkgewotCQllcnJvclN0cmluZyArPSAiXG4iICsgbmV3TGluZTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0V4dGVybmFsSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0V4dGVybmFsSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMDk4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbElEIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9TWVNURU0gPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX1BVQkxJQyA9IDE7Ci0KLQlpbnQgdHlwZSA9IFRfUFVCTElDOwotCVN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0JU3RyaW5nIHN5c3RlbUlEID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBzeXN0ZW0gSURzLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JRAotCSAqICAgICAgICAgICAgVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncwotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxJRChTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JCXRoaXMucHVibGljSUQgPSBudWxsOwotCQl0aGlzLnN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHB1YmxpYyBhbmQgc3lzdGVtIElEcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIElkZW50aWZpZXIgdG8gYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUgYW4gYWx0ZXJuYXRpdmUgVVJJCi0JICogICAgICAgICAgICBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudCwgb3IKLQkgKiAgICAgICAgICAgIDx2YXI+bnVsbDwvdmFyPiBpZiBhIHN5c3RlbSBpZGVudGl0aWVyIGlzIHRvIGJlCi0JICogICAgICAgICAgICBjb25zdHJ1Y3RlZC4KLQkgKiBAcGFyYW0gc3lzdGVtSUQKLQkgKiAgICAgICAgICAgIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICovCi0JcHVibGljIEV4dGVybmFsSUQoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9QVUJMSUM7Ci0JCXRoaXMucHVibGljSUQgPSBwdWJsaWNJRDsKLQkJdGhpcy5zeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlpZiAobnVsbCA9PSB0aGlzLnB1YmxpY0lEKQotCQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiB0aGlzIGV4dGVybmFsIElEIGlzIGEgc3lzdGVtIElEIChvciBwdWJsaWMgSUQpLgotCSAqIAotCSAqIEByZXR1cm4gU3lzdGVtIElEPXRydWUsIFB1YmxpYyBJRD1mYWxzZS4KLQkgKiBAc2VlICNpc1B1YmxpYwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3lzdGVtKCkgewotCQlyZXR1cm4gdGhpcy50eXBlID09IFRfU1lTVEVNOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaWYgdGhpcyBleHRlcm5hbCBJRCBpcyBhIHB1YmxpYyBJRCAob3Igc3lzdGVtIElEKS4KLQkgKiAKLQkgKiBAcmV0dXJuIFB1YmxpYyBJRD10cnVlLCBTeXN0ZW0gSUQ9ZmFsc2UuCi0JICogQHNlZSAjaXNTeXN0ZW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZSA9PSBUX1BVQkxJQzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBBIHN5c3RlbSBpZGVudGlmaWVyCi0JICogaXMgYSBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiBUaGUgc3lzdGVtIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSAjZ2V0UHViaWRMaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1MaXRlcmFsKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBUaGlzIHZhbHVlIGlzIG9ubHkKLQkgKiB2YWxpZCBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdCBtdXN0IGJlIG1hZGUKLQkgKiB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwdWJsaWMgaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlICNnZXRTeXN0ZW1MaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJJZExpdGVyYWwoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBleHRlcm5hbCBJRCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBkZWNsYXJlZDogPENPREU+U1lTVEVNCi0JICogJnF1b3Q7PFZBUj5zeXN0ZW1JRDwvVkFSPiZxdW90OzwvQ09ERT4gb3IgPENPREU+UFVCTElDICZxdW90OzxWQVI+cHVibGljSUQ8L1ZBUj4mcXVvdDsKLQkgKiAmcXVvdDs8VkFSPnN5c3RlbUlEPC9WQVI+JnF1b3Q7PC9DT0RFPi4KLQkgKiAKLQkgKiBAcmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IG9mIHRoZSBleHRlcm5hbCBJRCAobmV2ZXIKLQkgKiAgICAgICAgIDx2YXI+bnVsbDwvdmFyPikuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJldDsKLQkJaWYgKGlzU3lzdGVtKCkpIHsKLQkJCXJldCA9ICJTWVNURU0gXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAobnVsbCAhPSBnZXRTeXN0ZW1MaXRlcmFsKCkpIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIgXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIiOyAvLyBmb3IgTk9UQVRJT04gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEV4dGVybmFsSUQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFeHRlcm5hbElEIGVpZCA9IChFeHRlcm5hbElEKSBvYmo7Ci0JCWlmICghKChlaWQucHVibGljSUQgPT0gbnVsbCAmJiB0aGlzLnB1YmxpY0lEID09IG51bGwpIHx8IGVpZC5wdWJsaWNJRCAhPSBudWxsICYmIGVpZC5wdWJsaWNJRC5lcXVhbHModGhpcy5wdWJsaWNJRCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISgoZWlkLnN5c3RlbUlEID09IG51bGwgJiYgdGhpcy5zeXN0ZW1JRCA9PSBudWxsKSB8fCBlaWQuc3lzdGVtSUQgIT0gbnVsbCAmJiBlaWQuc3lzdGVtSUQuZXF1YWxzKHRoaXMuc3lzdGVtSUQpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmV0dmFsID0gMDsKLQkJaWYgKHB1YmxpY0lEICE9IG51bGwpCi0JCQlyZXR2YWwgPSBwdWJsaWNJRC5oYXNoQ29kZSgpOwotCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkKLQkJCXJldHZhbCArPSBzeXN0ZW1JRC5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvTm90YXRpb25EZWNsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkNGUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0vKioKLSAqIE5vdGF0aW9ucyBhcmUgaG93IHRoZSBEb2N1bWVudCBUeXBlIERlc2NyaXB0aW9uIChEVEQpIHJlY29yZHMgaGludHMgYWJvdXQKLSAqIHRoZSBmb3JtYXQgb2YgYW4gWE1MICJ1bnBhcnNlZCBlbnRpdHkiIC0tIGluIG90aGVyIHdvcmRzLCBub24tWE1MIGRhdGEKLSAqIGJvdW5kIHRvIHRoaXMgZG9jdW1lbnQgdHlwZSwgd2hpY2ggc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gY29uc3VsdAotICogd2hlbiBtYW5pcHVsYXRpbmcgdGhlIGRvY3VtZW50LiBBIE5vdGF0aW9uIHJlcHJlc2VudHMgYSBuYW1lLXZhbHVlIHBhaXIsCi0gKiB3aXRoIGl0cyBub2RlTmFtZSBiZWluZyBzZXQgdG8gdGhlIGRlY2xhcmVkIG5hbWUgb2YgdGhlIG5vdGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTm90YXRpb25EZWNsIGV4dGVuZHMgQmFzZU5vZGUgewotCS8qKiBQdWJsaWMgaWRlbnRpZmllci4gKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQotCS8qKiBTeXN0ZW0gaWRlbnRpZmllci4gKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8vCi0JLy8gQ29uc3RydWN0b3JzCi0JLy8KLQotCS8qKiBGYWN0b3J5IGNvbnN0cnVjdG9yLiAqLwotCXB1YmxpYyBOb3RhdGlvbkRlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCk7Ci0JfQotCi0JLy8KLQkvLyBOb3RhdGlvbiBtZXRob2RzCi0JLy8KLQotCS8qKgotCSAqIFRoZSBQdWJsaWMgSWRlbnRpZmllciBmb3IgdGhpcyBOb3RhdGlvbi4gSWYgbm8gcHVibGljIGlkZW50aWZpZXIgd2FzCi0JICogc3BlY2lmaWVkLCB0aGlzIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gcHVibGljSWQ7Ci0JfSAvLyBnZXRQdWJsaWNJZCgpOlN0cmluZwotCi0JLyoqCi0JICogVGhlIFN5c3RlbSBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBzeXN0ZW0gaWRlbnRpZmllciB3YXMKLQkgKiBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JZDsKLQl9IC8vIGdldFN5c3RlbUlkKCk6U3RyaW5nCi0KLQkvLwotCS8vIFB1YmxpYyBtZXRob2RzCi0JLy8KLQotCS8qKgotCSAqIE5PTi1ET006IFRoZSBQdWJsaWMgSWRlbnRpZmllciBmb3IgdGhpcyBOb3RhdGlvbi4gSWYgbm8gcHVibGljCi0JICogaWRlbnRpZmllciB3YXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgaWQpIHsKLQkJcHVibGljSWQgPSBpZDsKLQl9IC8vIHNldFB1YmxpY0lkKFN0cmluZykKLQotCS8qKgotCSAqIE5PTi1ET006IFRoZSBTeXN0ZW0gSWRlbnRpZmllciBmb3IgdGhpcyBOb3RhdGlvbi4gSWYgbm8gc3lzdGVtCi0JICogaWRlbnRpZmllciB3YXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgaWQpIHsKLQkJc3lzdGVtSWQgPSBpZDsKLQl9IC8vIHNldFN5c3RlbUlkKFN0cmluZykKLQotfSAvLyBjbGFzcyBOb3RhdGlvbkltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1N0cmluZ1BhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvU3RyaW5nUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTFjZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvU3RyaW5nUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLS8qKgotICogUmVhZGVyIGZvciBwcm9jZXNzaW5nL3BhcnNpbmcgeG1sIHN0cmluZwotICogCi0gKiBAdmVyc2lvbgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nUGFyc2VyIHsKLQlTdHJpbmcgZkRhdGEgPSBudWxsOwotCWludCBmRW5kT2Zmc2V0OwotCWludCBmTW9zdFJlY2VudENoYXI7Ci0JaW50IGZDdXJyZW50T2Zmc2V0OwotCWJvb2xlYW4gZkNhbGxlZENoYXJQcm9wSW5pdCA9IGZhbHNlOwotCi0JcHVibGljIFN0cmluZ1BhcnNlcihTdHJpbmcgZGF0YSkgewotCQlmRGF0YSA9IGRhdGE7Ci0JCWZDdXJyZW50T2Zmc2V0ID0gMDsKLQkJZkVuZE9mZnNldCA9IGZEYXRhLmxlbmd0aCgpOwotCQlmTW9zdFJlY2VudENoYXIgPSBmRW5kT2Zmc2V0ID09IDAgPyAtMSA6IGZEYXRhLmNoYXJBdCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZkRhdGEuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCXJldHVybiBmRGF0YTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlbWFpbmluZ1N0cmluZygpIHsKLQkJcmV0dXJuIGZEYXRhLnN1YnN0cmluZyhnZXRDdXJyZW50T2Zmc2V0KCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudE9mZnNldCgpIHsKLQkJcmV0dXJuIGZDdXJyZW50T2Zmc2V0OwotCX0KLQotCS8vCi0JLy8KLQlwdWJsaWMgaW50IGxvYWROZXh0Q2hhcigpIHsKLQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiBmTW9zdFJlY2VudENoYXI7Ci0JfQotCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGxvb2tpbmdBdENoYXIoY2hhciBjaHIsIGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoICE9IGNocikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCWlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gbG9va2luZ0F0VmFsaWRDaGFyKGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoIDwgMHhEODAwKSB7Ci0JCQlpZiAoY2ggPCAweDIwICYmIGNoICE9IDB4MDkgJiYgY2ggIT0gMHgwQSAmJiBjaCAhPSAweDBEKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJCWlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkJCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChjaCA+IDB4RkZGRCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjaCA8IDB4REMwMCkgewotCQkJaWYgKGZDdXJyZW50T2Zmc2V0ICsgMSA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJY2ggPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQgKyAxKTsKLQkJCWlmIChjaCA8IDB4REMwMCB8fCBjaCA+PSAweEUwMDApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmICghc2tpcFBhc3RDaGFyKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ3VycmVudE9mZnNldCsrOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNoIDwgMHhFMDAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBsb29raW5nQXRTcGFjZShib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCWlmIChjaCA+IDB4MjApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjaCA9PSAweDIwIHx8IGNoID09IDB4MEEgfHwgY2ggPT0gMHgwRCB8fCBjaCA9PSAweDA5KSB7Ci0JCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJbG9hZE5leHRDaGFyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIHZvaWQgc2tpcFRvQ2hhcihjaGFyIGNociwgYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJLy8KLQkJLy8gUkVWSVNJVCAtIHRoaXMgd2lsbCBza2lwIGludmFsaWQgY2hhcmFjdGVycyB3aXRob3V0IHJlcG9ydGluZyB0aGVtLgotCQkvLwotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoY2ggPT0gY2hyKSB7Ci0JCQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJCQlsb2FkTmV4dENoYXIoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJfQotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyB2b2lkIHNraXBQYXN0U3BhY2VzKCkgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCWlmIChjaCA9PSAtMSkgewotCQkJLy8gY2hhbmdlUmVhZGVycygpLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChjaCA+IDB4MjAgfHwgKGNoICE9IDB4MjAgJiYgY2ggIT0gMHgwQSAmJiBjaCAhPSAweDA5ICYmIGNoICE9IDB4MEQpKSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gY2g7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJfQotCX0KLQotCS8vCi0JLy8KLQkvLwotCi0JcHVibGljIHZvaWQgc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoY2hhciBmYXN0Y2hlY2spIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCi0JCWlmIChjaCAhPSAnJScpIHsKLQkJCWlmIChjaCA8IDB4ODApIHsKLQkJCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpSW5pdGlhbE5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX0luaXRpYWxOYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQl3aGlsZSAodHJ1ZSkgewotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJCWlmIChmYXN0Y2hlY2sgPT0gY2gpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGNoID09ICclJyB8fCBjaCA9PSAnOycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNraXBQYXN0TmFtZShjaGFyIGZhc3RjaGVjaykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2tpcHBhc3ROYW1lIGNoOiAiICtjaCk7Ci0KLQkJaWYgKGNoIDwgMHg4MCkgewotCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaUluaXRpYWxOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQl3aGlsZSAodHJ1ZSkgewotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJCWlmIChmYXN0Y2hlY2sgPT0gY2gpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8vCi0JLy8KLQkvLwotCi0JcHVibGljIHZvaWQgc2tpcFBhc3RObXRva2VuKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChmYXN0Y2hlY2sgPT0gY2gpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5tdG9rZW5BbmRQRVJlZmVyZW5jZShjaGFyIGZhc3RjaGVjaykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoZmFzdGNoZWNrID09IGNoKQotCQkJCXJldHVybjsKLQkJCWlmIChjaCA9PSAnJScgfHwgY2ggPT0gJzsnKSB7Ci0JCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjaCA8IDB4ODApIHsKLQkJCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gc2tpcHBlZFN0cmluZyhjaGFyW10gcykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCWlmIChjaCAhPSBzWzBdKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGZDdXJyZW50T2Zmc2V0ICsgcy5sZW5ndGggPiBmRW5kT2Zmc2V0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQgKyBpKSAhPSBzW2ldKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmQ3VycmVudE9mZnNldCArPSAocy5sZW5ndGggLSAxKTsKLQkJbG9hZE5leHRDaGFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyBpbnQgc2NhbkludmFsaWRDaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJbG9hZE5leHRDaGFyKCk7Ci0JCXJldHVybiBjaDsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQkvKgotCSAqIHB1YmxpYyBpbnQgc2NhbkNoYXJSZWYoYm9vbGVhbiBoZXgpIHRocm93cyBFeGNlcHRpb24geyBpbnQgY2ggPQotCSAqIGZNb3N0UmVjZW50Q2hhcjsgaWYgKGNoID09IC0xKSAvLyByZXR1cm4KLQkgKiBjaGFuZ2VSZWFkZXJzKCkuc2NhbkNoYXJSZWYoaGV4KTsgcmV0dXJuIGNoOyBpbnQgbnVtID0gMDsgaWYgKGhleCkgeyBpZgotCSAqIChjaCA+ICdmJyB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlYRGlnaXRDaGFyW2NoXSA9PSAwKSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX0lOVkFMSURfQ0hBUjsgbnVtID0gY2ggLSAoY2ggPCAnQScgPwotCSAqICcwJyA6IChjaCA8ICdhJyA/ICdBJyA6ICdhJykgLSAxMCk7IH0gZWxzZSB7IGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5DSEFSUkVGX1JFU1VMVF9JTlZBTElEX0NIQVI7IG51bSA9IGNoIC0gJzAnOyB9Ci0JICogYm9vbGVhbiB0b29iaWcgPSBmYWxzZTsgd2hpbGUgKHRydWUpIHsgY2ggPSBsb2FkTmV4dENoYXIoKTsgaWYgKGNoID09Ci0JICogLTEpIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX1NFTUlDT0xPTl9SRVFVSVJFRDsgaWYgKGhleCkgewotCSAqIGlmIChjaCA+ICdmJyB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlYRGlnaXRDaGFyW2NoXSA9PSAwKQotCSAqIGJyZWFrOyB9IGVsc2UgeyBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIGJyZWFrOyB9IGlmIChoZXgpIHsgaW50IGRpZyA9Ci0JICogY2ggLSAoY2ggPCAnQScgPyAnMCcgOiAoY2ggPCAnYScgPyAnQScgOiAnYScpIC0gMTApOyBudW0gPSAobnVtIDw8IDQpICsKLQkgKiBkaWc7IH0gZWxzZSB7IGludCBkaWcgPSBjaCAtICcwJzsgbnVtID0gKG51bSAqIDEwKSArIGRpZzsgfSBpZiAobnVtID4KLQkgKiAweDEwRkZGRikgeyB0b29iaWcgPSB0cnVlOyBudW0gPSAwOyB9IH0gaWYgKGNoICE9ICc7JykgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5DSEFSUkVGX1JFU1VMVF9TRU1JQ09MT05fUkVRVUlSRUQ7IGxvYWROZXh0Q2hhcigpOyBpZgotCSAqICh0b29iaWcpIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX09VVF9PRl9SQU5HRTsgcmV0dXJuCi0JICogbnVtOyB9Ci0JICovCi0JLy8KLQkvLwotCS8vCi0JLyoKLQkgKiBwdWJsaWMgaW50IHNjYW5TdHJpbmdMaXRlcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGJvb2xlYW4gc2luZ2xlOyBpZgotCSAqICghKHNpbmdsZSA9IGxvb2tpbmdBdENoYXIoJ1wnJywgdHJ1ZSkpICYmICFsb29raW5nQXRDaGFyKCdcIicsIHRydWUpKSB7Ci0JICogcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuU1RSSU5HTElUX1JFU1VMVF9RVU9URV9SRVFVSVJFRDsgfSBpbnQgb2Zmc2V0ID0KLQkgKiBmQ3VycmVudE9mZnNldDsgY2hhciBxY2hhciA9IHNpbmdsZSA/ICdcJycgOiAnXCInOyB3aGlsZQotCSAqICghbG9va2luZ0F0Q2hhcihxY2hhciwgZmFsc2UpKSB7IGlmICghbG9va2luZ0F0VmFsaWRDaGFyKHRydWUpKSB7Ci0JICogcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuU1RSSU5HTElUX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSAvLyBpbnQKLQkgKiBzdHJpbmdJbmRleCA9IGFkZFN0cmluZyhvZmZzZXQsIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0KTsgaW50Ci0JICogc3RyaW5nSW5kZXggPSBhZGRTdHJpbmcob2Zmc2V0LCBmQ3VycmVudE9mZnNldCAtIG9mZnNldCk7Ci0JICogbG9va2luZ0F0Q2hhcihxY2hhciwgdHJ1ZSk7IC8vIG1vdmUgcGFzdCBxY2hhciByZXR1cm4gc3RyaW5nSW5kZXg7IH0KLQkgKi8KLQotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBzY2FuQXR0VmFsdWUoY2hhciBxY2hhcikgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAobG9va2luZ0F0Q2hhcihxY2hhciwgZmFsc2UpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobG9va2luZ0F0Q2hhcignICcsIHRydWUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIWxvb2tpbmdBdFZhbGlkQ2hhcih0cnVlKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWxvb2tpbmdBdENoYXIocWNoYXIsIHRydWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInCi0JLy8gfCAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvLyBUaGUgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgYXM6Ci0JLy8KLQkvLyAwIC0gbm90IHNwZWNpYWwKLQkvLyAxIC0gcXVvdGUgY2hhcmFjdGVyCi0JLy8gMiAtIHJlZmVyZW5jZQotCS8vIDMgLSBwZXJlZgotCS8vIDQgLSBpbnZhbGlkCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaUVudGl0eVZhbHVlQ2hhcltdID0gezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDAsIDQsIDQsIDAsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDAsIDEsIDAsIDAsIDMsIDIsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICdcIicsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJScsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJicsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnXCcnCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0KLQkvKgotCSAqIHB1YmxpYyBpbnQgc2NhbkVudGl0eVZhbHVlKGludCBxY2hhciwgYm9vbGVhbiBjcmVhdGVTdHJpbmcpIHRocm93cwotCSAqIEV4Y2VwdGlvbiB7IGludCBvZmZzZXQgPSBmQ3VycmVudE9mZnNldDsgaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCSAqIHdoaWxlICh0cnVlKSB7IGlmIChjaCA9PSAtMSkgeyBjaGFuZ2VSZWFkZXJzKCk7IC8vIGRvIG5vdCBjYWxsIG5leHQKLQkgKiByZWFkZXIsIG91ciBjYWxsZXIgbWF5IG5lZWQgdG8gY2hhbmdlIHRoZSBwYXJhbWV0ZXJzIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuRU5USVRZVkFMVUVfUkVTVUxUX0VORF9PRl9JTlBVVDsgfSBpZiAoY2ggPCAweDgwKSB7Ci0JICogc3dpdGNoIChmZ0FzY2lpRW50aXR5VmFsdWVDaGFyW2NoXSkgeyBjYXNlIDE6IC8vIHF1b3RlIGNoYXIgaWYgKGNoID09Ci0JICogcWNoYXIpIHsgaWYgKCFjcmVhdGVTdHJpbmcpIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuRU5USVRZVkFMVUVfUkVTVUxUX0ZJTklTSEVEOyBpbnQgbGVuZ3RoID0KLQkgKiBmQ3VycmVudE9mZnNldCAtIG9mZnNldDsgaW50IHJlc3VsdCA9IGxlbmd0aCA9PSAwID8KLQkgKiBTdHJpbmdQb29sLkVNUFRZX1NUUklORyA6IGFkZFN0cmluZyhvZmZzZXQsIGxlbmd0aCk7IGxvYWROZXh0Q2hhcigpOwotCSAqIHJldHVybiByZXN1bHQ7IH0gLy8gdGhlIG90aGVyIHF1b3RlIGNoYXJhY3RlciBpcyBub3Qgc3BlY2lhbCAvLyBmYWxsCi0JICogdGhyb3VnaCBjYXNlIDA6IC8vIG5vbi1zcGVjaWFsIGNoYXIgaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCSAqIGlmIChvd2VUcmFpbGluZ1NwYWNlKSB7IG93ZVRyYWlsaW5nU3BhY2UgPSBmYWxzZTsgY2ggPSBmTW9zdFJlY2VudENoYXIgPSAnICc7IH0KLQkgKiBlbHNlIHsgY2ggPSBmTW9zdFJlY2VudENoYXIgPSAtMTsgfSB9IGVsc2UgeyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9Ci0JICogZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsgfSBjb250aW51ZTsgY2FzZSAyOiAvLyByZWZlcmVuY2UgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfUkVGRVJFTkNFOyBjYXNlIDM6IC8vIHBlcmVmIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuRU5USVRZVkFMVUVfUkVTVUxUX1BFUkVGOyBjYXNlIDQ6IC8vIGludmFsaWQgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfSU5WQUxJRF9DSEFSOyB9IH0gZWxzZSBpZiAoY2ggPAotCSAqIDB4RDgwMCkgeyBjaCA9IGxvYWROZXh0Q2hhcigpOyB9IGVsc2UgaWYgKGNoID49IDB4RTAwMCAmJiAoY2ggPD0gMHhGRkZEIHx8Ci0JICogKGNoID49IDB4MTAwMDAgJiYgY2ggPD0gMHgxMEZGRkYpKSkgeyAvLyAvLyBSRVZJU0lUIC0gbmVlZHMgbW9yZSBjb2RlCi0JICogdG8gY2hlY2sgc3Vycm9nYXRlcy4gLy8gY2ggPSBsb2FkTmV4dENoYXIoKTsgfSBlbHNlIHsgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfSU5WQUxJRF9DSEFSOyB9IH0gfQotCSAqLwotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1RTdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1RTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxZjAyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9UU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBzb21lIG9mIHRoZSB2ZXJ5IHVzZWQgSVN0cmluZwotICogb3BlcmF0aW9ucwotICovCi0KLXB1YmxpYyBjbGFzcyBUU3RyaW5nIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEFCRVQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEFOVU1FUklDID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1FUklDID0gIjAxMjM0NTY3ODkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBjaGFuZ2UgYWxsIG9jY3VycmVuY2VzIG9mIG9sZFBhdCB0byBuZXdQYXQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2UoU3RyaW5nIGluLCBTdHJpbmcgb2xkUGF0LCBTdHJpbmcgbmV3UGF0KSB7Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBpbjsKLQkJaWYgKG9sZFBhdC5sZW5ndGgoKSA9PSAxICYmIG5ld1BhdC5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuIGluLnJlcGxhY2Uob2xkUGF0LmNoYXJBdCgwKSwgbmV3UGF0LmNoYXJBdCgwKSk7Ci0KLQkJaW50IGxhc3RJbmRleCA9IDA7Ci0JCWludCBuZXdJbmRleCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBuZXdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOzspIHsKLQkJCW5ld0luZGV4ID0gaW4uaW5kZXhPZihvbGRQYXQsIGxhc3RJbmRleCk7Ci0JCQlpZiAobmV3SW5kZXggIT0gLTEpIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgsIG5ld0luZGV4KSArIG5ld1BhdCk7Ci0JCQkJbGFzdEluZGV4ID0gbmV3SW5kZXggKyBvbGRQYXQubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3U3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gY2hhbmdlIHRoZSBvY2N1cnJlbmNlcyBvZiBvbGRQYXQgdG8gbmV3UGF0IHN0YXJ0aW5nIGF0IHN0YXJ0UG9zaXRpb24KLQkvLyBmb3IgbnVtYmVyIG9mIG51bUNoYW5nZXMKLQkvLyBOb3RlOiB0aGUgMXN0IGNoYXIgaW4gdGhlIHN0cmluZyBoYXMgcG9zaXRpb24gb2YgMAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlKFN0cmluZyBpbiwgU3RyaW5nIG9sZFBhdCwgU3RyaW5nIG5ld1BhdCwgaW50IHN0YXJ0UG9zLCBpbnQgbnVtQ2hhbmdlcykgewotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gaW47Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMSAmJiBuZXdQYXQubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBpbi5yZXBsYWNlKG9sZFBhdC5jaGFyQXQoMCksIG5ld1BhdC5jaGFyQXQoMCkpOwotCi0JCWludCBpbkxlbiA9IGluLmxlbmd0aCgpOwotCi0JCWlmIChzdGFydFBvcyA+PSBpbkxlbikKLQkJCXJldHVybiBpbjsKLQotCQlpbnQgbGFzdEluZGV4ID0gc3RhcnRQb3M7Ci0JCWludCBuZXdJbmRleCA9IDA7Ci0JCWludCBjb3VudENoYW5nZXMgPSAwOwotCi0KLQkJU3RyaW5nQnVmZmVyIG5ld1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKDs7KSB7Ci0JCQluZXdJbmRleCA9IGluLmluZGV4T2Yob2xkUGF0LCBsYXN0SW5kZXgpOwotCQkJaWYgKG5ld0luZGV4ICE9IC0xKSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4LCBuZXdJbmRleCkgKyBuZXdQYXQpOwotCQkJCWxhc3RJbmRleCA9IG5ld0luZGV4ICsgb2xkUGF0Lmxlbmd0aCgpOwotCQkJCWNvdW50Q2hhbmdlcysrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb3VudENoYW5nZXMgPT0gbnVtQ2hhbmdlcykgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmQoU3RyaW5nIGluLCBpbnQgaSkgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluKTsKLQkJaWYgKGkgPD0gMCB8fCBpID4gc3QuY291bnRUb2tlbnMoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCVN0cmluZyByZXQgPSBuZXcgU3RyaW5nKCk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJcmV0ID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKC0taSA9PSAwKQotCQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmRzKFN0cmluZyBpbiwgaW50IGkpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbik7Ci0JCWlmIChpIDw9IDAgfHwgaSA+IHN0LmNvdW50VG9rZW5zKCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJaWYgKC0taSA9PSAwKQotCQkJCQlicmVhazsKLQkJCQlzdC5uZXh0VG9rZW4oKTsKLQkJCX0KLQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJcmV0dXJuIHN0Lm5leHRUb2tlbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNwYWNlcyhTdHJpbmcgaW4sIGludCBsZW4pIHsKLQkJaWYgKGxlbiA8IDEpCi0JCQlyZXR1cm4gaW47Ci0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihpbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgbnVtV29yZHMoU3RyaW5nIGluKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW4pOwotCQlyZXR1cm4gc3QuY291bnRUb2tlbnMoKTsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGZpcnN0IGluZGV4IHdpdGhpbiBzcmNTdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHZhbGlkU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYWJjZGVmZyIKLQkvLyB2YWxpZFN0cmluZyA9ICJiY2ZnIgotCS8vIHJldHVybiA9IDAgKGkuZS4gY2hhciBhIGlzIG5vdCBpbiAiYmNmZyIpIC0gMXN0IGluZGV4ID0gMAotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkFueUJ1dChTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgdmFsaWRTdHJpbmcpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3JjTGVuID0gc3JjU3RyaW5nLmxlbmd0aCgpOwotCi0JCS8vIHdhbGsgYmFja3dhcmQgdG8gZmluZCBpZiBhIGNoYXIgd2l0aGluIHNyY1N0cmluZyBpcyBpbiB2YWxpZFN0cmluZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyY0xlbjsgaSsrKSB7Ci0JCQkvLyBub3QgZm91bmQsIHN0b3AgaXQKLQkJCWlmICh2YWxpZFN0cmluZy5pbmRleE9mKHNyY1N0cmluZy5jaGFyQXQoaSkpID09IC0xKSB7Ci0JCQkJcmVzdWx0ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGxhc3QgaW5kZXggd2l0aGluIHNyY1N0cmluZyB0aGF0IGlzIG5vdCBpbiB0aGUgdmFsaWRTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhYmNkZWZnIgotCS8vIHZhbGlkU3RyaW5nID0gImJjZmciCi0JLy8gcmV0dXJuID0gNCAoaS5lLiBjaGFyIGUgaXMgbm90IGluICJiY2ZnIikgLSAxc3QgaW5kZXggPSAwCi0KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZkFueUJ1dChTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgdmFsaWRTdHJpbmcpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3JjTGVuID0gc3JjU3RyaW5nLmxlbmd0aCgpOwotCi0JCS8vIHdhbGsgYmFja3dhcmQgdG8gZmluZCBpZiBhIGNoYXIgd2l0aGluIHNyY1N0cmluZyBpcyBpbiB2YWxpZFN0cmluZwotCQlmb3IgKGludCBpID0gc3JjTGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCS8vIG5vdCBmb3VuZCwgc3RvcCBpdAotCQkJaWYgKHZhbGlkU3RyaW5nLmluZGV4T2Yoc3JjU3RyaW5nLmNoYXJBdChpKSkgPT0gLTEpIHsKLQkJCQlyZXN1bHQgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2Ygc2VhcmNoQ2hhciB3aXRoaW4gc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiOjpmOjpmOjpnIgotCS8vIHNlYWNockNoYXIgPSAnOicKLQkvLyByZXR1cm4gPSA2Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlT2YoU3RyaW5nIHNyY1N0cmluZywgY2hhciBzZWFyY2hDaGFyKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJaWYgKHNyY1N0cmluZy5sZW5ndGgoKSA+IDApIHsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNTdHJpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJCS8vIGZvdW5kLCBpbmNyZW1lbnQgdGhlIGNvdW50Ci0JCQkJaWYgKHNlYXJjaENoYXIgPT0gc3JjU3RyaW5nLmNoYXJBdChpKSkKLQkJCQkJcmVzdWx0Kys7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHN0cmlwIHRoZSBsZWFkaW5nIHBTdHJpbmcgaW4gdGhlIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gIjo6Zjo6Zjo6ZyIKLQkvLyBwU3RyaW5nICI6OiIKLQkvLyByZXR1cm4gPSAiZjo6Zjo6ZyIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwTGVhZGluZyhTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgcFN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0OwotCi0JCWlmIChzcmNTdHJpbmcuc3RhcnRzV2l0aChwU3RyaW5nKSkgLy8gbGVhZGluZyBwYXRTdHJpbmcgZm91bmQKLQkJCXJlc3VsdCA9IHNyY1N0cmluZy5zdWJzdHJpbmcocFN0cmluZy5sZW5ndGgoKSwgc3JjU3RyaW5nLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJLy8gbm90IGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmc7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBzdHJpcCB0aGUgdHJhaWxpbmcgcFN0cmluZyBpbiB0aGUgc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiZjo6Zjo6Zzo6IgotCS8vIHBTdHJpbmcgIjo6IgotCS8vIHJldHVybiA9ICJmOjpmOjpnIgotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBUcmFpbGluZyhTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgcFN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0OwotCi0JCWlmIChzcmNTdHJpbmcuZW5kc1dpdGgocFN0cmluZykpIC8vIGxlYWRpbmcgcGF0U3RyaW5nIGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmcuc3Vic3RyaW5nKDAsIHNyY1N0cmluZy5sYXN0SW5kZXhPZihwU3RyaW5nKSk7Ci0JCWVsc2UKLQkJCS8vIG5vdCBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogc3RyaXAgdGhlIHRyYWlsaW5nIGJsYW5rcyBpbiB0aGUgc3JjCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBUcmFpbGluZ0JsYW5rcyhTdHJpbmcgc3JjKSB7Ci0KLQkJaWYgKHNyYyAhPSBudWxsKSB7Ci0JCQl3aGlsZSAoc3JjLmxlbmd0aCgpID4gMCkgewotCQkJCWlmIChzcmMuZW5kc1dpdGgoIiAiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlzcmMgPSBzcmMuc3Vic3RyaW5nKDAsIHNyYy5sZW5ndGgoKSAtIDEpOwotCQkJCWVsc2UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3JjOwotCX0KLQotCi0KLQkvLyByZXR1cm4gYSBzdHJpbmcgdGhhdCBjb250YWlucyBudW1iZXIgb2YgY29waWVzIG9mIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImFiYyIKLQkvLyBudW1iZXJPZkNvcGllcyA9IDIKLQkvLyByZXR1cm4gc3RyaW5nID0gImFiY2FiYyIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHkoU3RyaW5nIHNyY1N0cmluZywgaW50IG51bWJlck9mQ29waWVzKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKG51bWJlck9mQ29waWVzID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtYmVyT2ZDb3BpZXM7IGkrKykKLQkJCQlyZXN1bHQuYXBwZW5kKHNyY1N0cmluZyk7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzcmNTdHJpbmcpOwotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBpbiBzcmNTdHJpbmcgYXJlIGluIHthLi4uen0gb3Ige0EuLi5afQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxwaGFiZXRpYyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCXJldHVybiAobGFzdEluZGV4T2ZBbnlCdXQoc3JjU3RyaW5nLCBBTFBIQUJFVCkgPT0gLTEpOwotCX0KLQotCS8vCi0JLy8gcmV0dXJuIHRydWUgaWYgYWxsIGNoYXJzIGluIHNyY1N0cmluZyBhcmUgaW4ge2EuLi56LH0gb3Ige0EuLi5afQotCS8vIHswLi4uOX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FscGhhbnVtZXJpYyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCXJldHVybiAobGFzdEluZGV4T2ZBbnlCdXQoc3JjU3RyaW5nLCBBTFBIQU5VTUVSSUMpID09IC0xKTsKLQl9Ci0KLQotCS8vCi0JLy8gcmV0dXJuIHRydWUgaWYgYWxsIGNoYXJzIGFyZSBpbiAnMCcgLSAnOScKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RpZ2l0cyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCXJldHVybiAobGFzdEluZGV4T2ZBbnlCdXQoc3JjU3RyaW5nLCBOVU1FUklDKSA9PSAtMSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eU9yTnVsbChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQotCS8vCi0JLy8gcmV0dXJuIHRoZSBzdHJpbmcgYWZ0ZXIgdGhlIG1hdGNoaW5nIHRva2VuIGlzIHJlbW92ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXRjaChTdHJpbmcgaW4sIFN0cmluZyB0b2tlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW4gPSBpbi50cmltKCk7Ci0JCWlmIChpbi5zdGFydHNXaXRoKHRva2VuKSkKLQkJCXJldHVybiBpbi5zdWJzdHJpbmcodG9rZW4ubGVuZ3RoKCksIGluLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXhwZWN0ZWQ6ICIgKyB0b2tlbiArICIgYnV0IGdvdDoiICsgd29yZChpbiwgMSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgc3RyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTG9uZy5wYXJzZUxvbmcoc3RyKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIG0pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLy8gcmV0dXJuIHRydWUgaWYgdGhlICIgIiBhcHBlYXJzIHdpdGhpbiBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhIG0iCi0JLy8gcmV0dXJuID0gdHJ1ZQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zRG91YmxlQmxhbmtzKFN0cmluZyBzcmNTdHJpbmcpIHsKLQkJU3RyaW5nIGJiID0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCQljaGFyIGIgPSBiYi5jaGFyQXQoMCk7Ci0KLQkJaWYgKHNyY1N0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgKHNyY1N0cmluZy5sZW5ndGgoKSAtIDEpOyBpKyspIHsKLQkJCQlpZiAoKGIgPT0gc3JjU3RyaW5nLmNoYXJBdChpKSkgJiAoYiA9PSBzcmNTdHJpbmcuY2hhckF0KGkgKyAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9YTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9YTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDJmMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotLyoqCi0gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBwcm9wZXJ0aWVzIG9mIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHZhcmlvdXMgVzNDCi0gKiByZWNvbW1lbmRhdGlvbnMKLSAqIAotICogWE1MQ2hhcmFjdGVyUHJvcGVydGllcyBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb21tb25seSB1c2VkCi0gKiBjaGFyYWN0ZXIgdGVzdHMuCi0gKiAKLSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgdGFibGVzIHVzZWQgYnkgdGhlIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlCi0gKiBhbHNvIHB1YmxpYywgYW5kIGFyZSBkaXJlY3RseSBhY2Nlc3NlZCBieSBwZXJmb3JtYW5jZSBjcml0aWNhbCByb3V0aW5lcy4KLSAqIAotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzIHsKLQkvKgotCSAqIFsyNl0gVmVyc2lvbk51bSA6Oj0gKFthLXpBLVowLTlfLjpdIHwgJy0nKSsKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBhc2NpaSBwb3J0aW9uIG9mIHRoZSBOYW1lQ2hhciBkZWZpbml0aW9uLgotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nIGFjY29yZGluZyB0byBbMjZdIGluCi0JICogdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIHZlcnNpb24gaXMgYSB2YWxpZCB2ZXJzaW9uIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFZlcnNpb25OdW0oU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB2ZXJzaW9uLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgZW5jb2RpbmcgbmFtZSBhY2NvcmRpbmcgdG8gWzgxXSBpbgotCSAqIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgZW5jb2RpbmcgaXMgYSB2YWxpZCBlbmNvZGluZyBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRW5jTmFtZShTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKGVuY29kaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBlbmNvZGluZy5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpQWxwaGFDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGVuY29kaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoID0gZW5jb2RpbmcuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlFbmNOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwKLQkgKiBbLScoKSssLi86PT87ISojQCRfJV0KLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gWzEzXQotCSAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgcHVibGljSWQgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHZhbGlkUHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY0lkLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBwdWJsaWNJZC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicgfHwgZmdBc2NpaVB1YmlkQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOYW1lIGFjY29yZGluZyB0byBbNV0gaW4gdGhlIFhNTAotCSAqIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQljaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JykgewotCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX0luaXRpYWxOYW1lQ2hhckZsYWcpID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYgKGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaCA9IG5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIGZyb20gdGhlIG5hbWVzcGFjZSByZWMgWzVdIE5DTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykKLQkgKiAoTmFtZU5DQ2hhcikqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTkNOYW1lIGFjY29yZGluZyB0byBbNV0gZnJvbSB0aGUKLQkgKiBYTUwgTmFtZXNwYWNlcyAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROQ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBuYW1lLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onKSB7Ci0JCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZmdBc2NpaUluaXRpYWxOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgewotCQkJY2ggPSBuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTm10b2tlbiBhY2NvcmRpbmcgdG8gWzddIGluIHRoZSBYTUwKLQkgKiAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbm10b2tlbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNqCi0JICogQHJldHVybiB0cnVlIGlmIG5tdG9rZW4gaXMgYSB2YWxpZCBObXRva2VuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkTm10b2tlbihTdHJpbmcgbm10b2tlbikgewotCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJaWYgKG5tdG9rZW4ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubXRva2VuLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBubXRva2VuLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEhlcmUgYXJlIHRhYmxlcyB1c2VkIHRvIGJ1aWxkIGNoYXJhY3RlciBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpWERpZ2l0Q2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnQScgLSAnRicKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnYScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2YnCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlBbHBoYUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLy8gJ1AnIC0gJ1onCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW5jTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJy4nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaVB1YmlkQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICcgJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnIScsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyMnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICckJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJScsCi0JCQkJLy8gJ1wnJywgJygnLCAnKScsICcqJywgJysnLCAnLCcsICctJywgJy4nLCAnLycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAvLyAnMCcgLSAnOScsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJzonLCAnOycsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJz0nLCAnPycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQCcsICdBJyAtCi0JCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAvLyAnOicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcuJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnOicgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTkNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICc6JwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaU5DTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnLicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJzonIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHgzQQotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpQ2hhckRhdGFbXSA9IHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCA0LCA0LCA0LCA0LCA0LCA0LCAvLyB0YWIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MDkKLQkJCQk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpV1NDaGFyRGF0YVtdID0gezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDQsIDUsIDQsIDQsIC8vIHRhYgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwOSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBMRgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwQSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBDUgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwRAotCQkJCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcgJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyMCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX0NoYXJEYXRhRmxhZyA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRV9Jbml0aWFsTmFtZUNoYXJGbGFnID0gMSA8PCAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX05hbWVDaGFyRmxhZyA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmZ0NoYXJGbGFncyA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRDaGFyRmxhZ3MoKSB7Ci0JCWlmIChmZ0NoYXJGbGFncyA9PSBudWxsKSB7Ci0JCQlmZ0NoYXJGbGFncyA9IG5ldyBieXRlWzB4MTAwMDBdOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnQ2hhckRhdGFSYW5nZXMsIEVfQ2hhckRhdGFGbGFnKTsKLQkJCXNldEZsYWdGb3JSYW5nZShmZ0luaXRpYWxOYW1lQ2hhclJhbmdlcywgKGJ5dGUpIChFX0luaXRpYWxOYW1lQ2hhckZsYWcgfCBFX05hbWVDaGFyRmxhZykpOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnTmFtZUNoYXJSYW5nZXMsIEVfTmFtZUNoYXJGbGFnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmxhZ0ZvclJhbmdlKGNoYXJbXSByYW5nZXMsIGJ5dGUgZmxhZykgewotCQlpbnQgaTsKLQkJaW50IGNoOwotCQlmb3IgKGkgPSAwOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkgKz0gMikgewotCQkJaW50IGVuZGNoID0gcmFuZ2VzW2kgKyAxXTsKLQkJCXdoaWxlIChjaCA8PSBlbmRjaCkKLQkJCQlmZ0NoYXJGbGFnc1tjaCsrXSB8PSBmbGFnOwotCQl9Ci0JCWZvciAoaSsrOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkrKykKLQkJCWZnQ2hhckZsYWdzW2NoXSB8PSBmbGFnOwotCX0KLQotCS8qCi0JICogWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gLy8gYW55IFVuaWNvZGUgY2hhcmFjdGVyLAotCSAqIGV4Y2x1ZGluZyB0aGUgfCBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0gLy8gc3Vycm9nYXRlCi0JICogYmxvY2tzLCBGRkZFLCBhbmQgRkZGRi4gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopCi0JICogCi0JICogV2Ugd2lsbCB1c2UgQ2hhciAtICggW148Jl0gfCAnXScgfCAjeEEgfCAjeEQgKSBhbmQgaGFuZGxlIHRoZSBzcGVjaWFsCi0JICogY2FzZXMgaW5saW5lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdDaGFyRGF0YVJhbmdlc1tdID0gezB4MDAyMCwgMHgwMDI1LCAvLyAnJicgaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwMDI2Ci0JCQkJMHgwMDI3LCAweDAwM0IsIC8vICc8JyBpcyAweDAwM0MKLQkJCQkweDAwM0QsIDB4MDA1QywgLy8gJ10nIGlzIDB4MDA1RAotCQkJCTB4MDA1RSwgMHhEN0ZGLCAweEUwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDksIC8vIHRhYgotCQkJCTB4MDAwMH07Ci0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSogWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfAotCSAqIERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyIFs4NF0gTGV0dGVyCi0JICogOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMgWzg1XSBCYXNlQ2hhciA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg2XQotCSAqIElkZW9ncmFwaGljIDo6PSA8c2VlIHN0YW5kYXJkPiBbODddIENvbWJpbmluZ0NoYXIgOjo9IDxzZWUgc3RhbmRhcmQ+Ci0JICogWzg4XSBEaWdpdCA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg5XSBFeHRlbmRlciA6Oj0gPHNlZSBzdGFuZGFyZD4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnSW5pdGlhbE5hbWVDaGFyUmFuZ2VzW10gPSB7Ci0JLy8KLQkJCQkvLyBSYW5nZXM6Ci0JCQkJLy8KLQkJCQkvLyBCYXNlQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDA0MSwgMHgwMDVBLCAweDAwNjEsIDB4MDA3QSwgMHgwMEMwLCAweDAwRDYsIDB4MDBEOCwgMHgwMEY2LCAweDAwRjgsIDB4MDEzMSwgMHgwMTM0LCAweDAxM0UsIDB4MDE0MSwgMHgwMTQ4LCAweDAxNEEsIDB4MDE3RSwgMHgwMTgwLCAweDAxQzMsIDB4MDFDRCwgMHgwMUYwLCAweDAxRjQsIDB4MDFGNSwgMHgwMUZBLCAweDAyMTcsIDB4MDI1MCwgMHgwMkE4LCAweDAyQkIsIDB4MDJDMSwgMHgwMzg4LCAweDAzOEEsIDB4MDM4RSwgMHgwM0ExLCAweDAzQTMsIDB4MDNDRSwgMHgwM0QwLCAweDAzRDYsIDB4MDNFMiwgMHgwM0YzLCAweDA0MDEsIDB4MDQwQywgMHgwNDBFLCAweDA0NEYsIDB4MDQ1MSwgMHgwNDVDLCAweDA0NUUsIDB4MDQ4MSwgMHgwNDkwLCAweDA0QzQsIDB4MDRDNywgMHgwNEM4LCAweDA0Q0IsIDB4MDRDQywgMHgwNEQwLCAweDA0RUIsIDB4MDRFRSwgMHgwNEY1LCAweDA0RjgsIDB4MDRGOSwgMHgwNTMxLCAweDA1NTYsIDB4MDU2MSwgMHgwNTg2LCAweDA1RDAsIDB4MDVFQSwgMHgwNUYwLCAweDA1RjIsIDB4MDYyMSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0QSwgMHgwNjcxLCAweDA2QjcsIDB4MDZCQSwgMHgwNkJFLCAweDA2QzAsIDB4MDZDRSwgMHgwNkQwLCAweDA2RDMsIDB4MDZFNSwgMHgwNkU2LCAweDA5MDUsIDB4MDkzOSwgMHgwOTU4LCAweDA5NjEsIDB4MDk4NSwgMHgwOThDLCAweDA5OEYsIDB4MDk5MCwgMHgwOTkzLCAweDA5QTgsIDB4MDlBQSwgMHgwOUIwLCAweDA5QjYsIDB4MDlCOSwgMHgwOURDLCAweDA5REQsIDB4MDlERiwgMHgwOUUxLCAweDA5RjAsIDB4MDlGMSwgMHgwQTA1LCAweDBBMEEsIDB4MEEwRiwgMHgwQTEwLCAweDBBMTMsIDB4MEEyOCwgMHgwQTJBLCAweDBBMzAsIDB4MEEzMiwgMHgwQTMzLCAweDBBMzUsIDB4MEEzNiwgMHgwQTM4LCAweDBBMzksIDB4MEE1OSwgMHgwQTVDLCAweDBBNzIsIDB4MEE3NCwgMHgwQTg1LCAweDBBOEIsIDB4MEE4RiwgMHgwQTkxLAotCQkJCTB4MEE5MywgMHgwQUE4LCAweDBBQUEsIDB4MEFCMCwgMHgwQUIyLCAweDBBQjMsIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LCAweDBCMkEsIDB4MEIzMCwgMHgwQjMyLCAweDBCMzMsIDB4MEIzNiwgMHgwQjM5LCAweDBCNUMsIDB4MEI1RCwgMHgwQjVGLCAweDBCNjEsIDB4MEI4NSwgMHgwQjhBLCAweDBCOEUsIDB4MEI5MCwgMHgwQjkyLCAweDBCOTUsIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLCAweDBCQUUsIDB4MEJCNSwgMHgwQkI3LCAweDBCQjksIDB4MEMwNSwgMHgwQzBDLCAweDBDMEUsIDB4MEMxMCwgMHgwQzEyLCAweDBDMjgsIDB4MEMyQSwgMHgwQzMzLCAweDBDMzUsIDB4MEMzOSwgMHgwQzYwLCAweDBDNjEsIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLCAweDBDQjUsIDB4MENCOSwgMHgwQ0UwLCAweDBDRTEsIDB4MEQwNSwgMHgwRDBDLCAweDBEMEUsIDB4MEQxMCwgMHgwRDEyLCAweDBEMjgsIDB4MEQyQSwgMHgwRDM5LCAweDBENjAsIDB4MEQ2MSwgMHgwRTAxLCAweDBFMkUsIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LCAweDBFOTQsIDB4MEU5NywgMHgwRTk5LCAweDBFOUYsIDB4MEVBMSwgMHgwRUEzLCAweDBFQUEsIDB4MEVBQiwgMHgwRUFELCAweDBFQUUsIDB4MEVCMiwgMHgwRUIzLCAweDBFQzAsIDB4MEVDNCwgMHgwRjQwLCAweDBGNDcsIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLCAweDExMDUsIDB4MTEwNywgMHgxMTBCLCAweDExMEMsIDB4MTEwRSwgMHgxMTEyLCAweDExNTQsIDB4MTE1NSwgMHgxMTVGLCAweDExNjEsIDB4MTE2RCwgMHgxMTZFLAotCQkJCTB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwgMHgxMUI3LCAweDExQjgsIDB4MTFCQywgMHgxMUMyLCAweDFFMDAsIDB4MUU5QiwgMHgxRUEwLCAweDFFRjksIDB4MUYwMCwgMHgxRjE1LCAweDFGMTgsIDB4MUYxRCwgMHgxRjIwLCAweDFGNDUsIDB4MUY0OCwgMHgxRjRELCAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywgMHgxRkMyLCAweDFGQzQsIDB4MUZDNiwgMHgxRkNDLCAweDFGRDAsIDB4MUZEMywgMHgxRkQ2LCAweDFGREIsIDB4MUZFMCwgMHgxRkVDLCAweDFGRjIsIDB4MUZGNCwgMHgxRkY2LCAweDFGRkMsIDB4MjEyQSwgMHgyMTJCLCAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywgMHhBQzAwLCAweEQ3QTMsCi0JCQkJLy8KLQkJCQkvLyBJZGVvZ3JhcGhpYyByYW5nZXMKLQkJCQkvLwotCQkJCTB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCTB4MDAzQSwgLy8gJzonCi0JCQkJMHgwMDVGLCAvLyAnXycKLQkJCQkvLwotCQkJCS8vIEJhc2VDaGFyIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MDM4NiwgMHgwMzhDLCAweDAzREEsIDB4MDNEQywgMHgwM0RFLCAweDAzRTAsIDB4MDU1OSwgMHgwNkQ1LCAweDA5M0QsIDB4MDlCMiwgMHgwQTVFLCAweDBBOEQsIDB4MEFCRCwgMHgwQUUwLCAweDBCM0QsIDB4MEI5QywgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsIDB4MEVCRCwgMHgxMTAwLCAweDExMDksIDB4MTEzQywgMHgxMTNFLCAweDExNDAsIDB4MTE0QywgMHgxMTRFLCAweDExNTAsIDB4MTE1OSwgMHgxMTYzLCAweDExNjUsIDB4MTE2NywgMHgxMTY5LCAweDExNzUsIDB4MTE5RSwgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsIDB4MUY1RCwgMHgxRkJFLCAweDIxMjYsIDB4MjEyRSwKLQkJCQkvLwotCQkJCS8vIElkZW9ncmFwaGljIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MzAwNywKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnTmFtZUNoYXJSYW5nZXNbXSA9IHsKLQkvLwotCQkJCS8vIFJhbmdlczoKLQkJCQkvLwotCQkJCTB4MDAyRCwgMHgwMDJFLCAvLyAnLScgYW5kICcuJwotCQkJCS8vCi0JCQkJLy8gQ29tYmluaW5nQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDMwMCwgMHgwMzQ1LCAweDAzNjAsIDB4MDM2MSwgMHgwNDgzLCAweDA0ODYsIDB4MDU5MSwgMHgwNUExLCAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwgMHgwNkQ2LCAweDA2REMsIDB4MDZERCwgMHgwNkRGLCAweDA2RTAsIDB4MDZFNCwgMHgwNkU3LCAweDA2RTgsIDB4MDZFQSwgMHgwNkVELCAweDA5MDEsIDB4MDkwMywgMHgwOTNFLCAweDA5NEMsIDB4MDk1MSwgMHgwOTU0LCAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwgMHgwOUNCLCAweDA5Q0QsIDB4MDlFMiwgMHgwOUUzLCAweDBBNDAsIDB4MEE0MiwgMHgwQTQ3LCAweDBBNDgsIDB4MEE0QiwgMHgwQTRELCAweDBBNzAsIDB4MEE3MSwgMHgwQTgxLCAweDBBODMsIDB4MEFCRSwgMHgwQUM1LCAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywgMHgwQjQ3LCAweDBCNDgsIDB4MEI0QiwgMHgwQjRELCAweDBCNTYsIDB4MEI1NywgMHgwQjgyLCAweDBCODMsIDB4MEJCRSwgMHgwQkMyLCAweDBCQzYsIDB4MEJDOCwgMHgwQkNBLCAweDBCQ0QsIDB4MEMwMSwgMHgwQzAzLCAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwgMHgwQzgyLCAweDBDODMsIDB4MENCRSwgMHgwQ0M0LCAweDBDQzYsIDB4MENDOCwgMHgwQ0NBLCAweDBDQ0QsIDB4MENENSwgMHgwQ0Q2LCAweDBEMDIsIDB4MEQwMywgMHgwRDNFLCAweDBENDMsIDB4MEQ0NiwgMHgwRDQ4LCAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwgMHgwRUJCLCAweDBFQkMsIDB4MEVDOCwgMHgwRUNELCAweDBGMTgsIDB4MEYxOSwgMHgwRjcxLCAweDBGODQsIDB4MEY4NiwgMHgwRjhCLAotCQkJCTB4MEY5MCwgMHgwRjk1LCAweDBGOTksIDB4MEZBRCwgMHgwRkIxLCAweDBGQjcsIDB4MjBEMCwgMHgyMERDLCAweDMwMkEsIDB4MzAyRiwKLQkJCQkvLwotCQkJCS8vIERpZ2l0IHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMDMwLCAweDAwMzksIDB4MDY2MCwgMHgwNjY5LCAweDA2RjAsIDB4MDZGOSwgMHgwOTY2LCAweDA5NkYsIDB4MDlFNiwgMHgwOUVGLCAweDBBNjYsIDB4MEE2RiwgMHgwQUU2LCAweDBBRUYsIDB4MEI2NiwgMHgwQjZGLCAweDBCRTcsIDB4MEJFRiwgMHgwQzY2LCAweDBDNkYsIDB4MENFNiwgMHgwQ0VGLCAweDBENjYsIDB4MEQ2RiwgMHgwRTUwLCAweDBFNTksIDB4MEVEMCwgMHgwRUQ5LCAweDBGMjAsIDB4MEYyOSwKLQkJCQkvLwotCQkJCS8vIEV4dGVuZGVyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCS8vIENvbWJpbmluZ0NoYXIgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgwNUJGLCAweDA1QzQsIDB4MDY3MCwgMHgwOTNDLCAweDA5NEQsIDB4MDlCQywgMHgwOUJFLCAweDA5QkYsIDB4MDlENywgMHgwQTAyLCAweDBBM0MsIDB4MEEzRSwgMHgwQTNGLCAweDBBQkMsIDB4MEIzQywgMHgwQkQ3LCAweDBENTcsIDB4MEUzMSwgMHgwRUIxLCAweDBGMzUsIDB4MEYzNywgMHgwRjM5LCAweDBGM0UsIDB4MEYzRiwgMHgwRjk3LCAweDBGQjksIDB4MjBFMSwgMHgzMDk5LCAweDMwOUEsCi0JCQkJLy8KLQkJCQkvLyBFeHRlbmRlciBzaW5nbGVzCi0JCQkJLy8KLQkJCQkweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDMxMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IERURCBWYWxpZGF0aW9uCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREVmFsaWRhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUkVGX0VMRU1FTlRfVU5ERUZJTkVEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfSU5WQUxJRF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfRFREX0lOVkFMSURfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfVkFMSURfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRFREVmFsaWRhdGlvblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfNDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERWYWxpZGF0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4NmEzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSEKLSEgVmFsaWRhdGUgRFRECi0hCi1fVUlfRElBTE9HX0RURF9JTlZBTElEX1RJVExFICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRSAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9URVhUICAgICA9IFRoZSBEVEQgZmlsZSBpcyB2YWxpZC4KLV9VSV9ESUFMT0dfRFREX0lOVkFMSURfVEVYVCAgID0gVGhlIERURCBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciBlcnJvciBtZXNzYWdlcy4KLQotIQotISBSZWZlcmVuY2VkIEVsZW1lbnQgVmFsaWRhdGlvbgotIQotX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCA9IFRoZSBlbGVtZW50IHswfSBoYXMgbm90IGJlZW4gZGVjbGFyZWQuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzE9UmVxdWlyZWQgZmlsZXMgeGVyY2VzSW1wbC5qYXIgYW5kIHhtbFBhcnNlckFQSXMuamFyIGNhbm5vdCBiZSBmb3VuZC5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI9RG93bmxvYWQgWGVyY2VzIDIuNi4yIGFuZCBwbGFjZSB4ZXJjZXNJbXBsLmphciBhbmQgeG1sUGFyc2VyQVBJcy5qYXIgaW4gYSBmb2xkZXIgZW50aXRsZWQgamFycyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uIHBsdWdpbi5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzM9Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHd3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy94bWwveGVyY2VzSW5mby54bWwuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzQ9TWlzc2luZyBYZXJjZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmYxYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTGF6eVVSTElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIERURCB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRFREVmFsaWRhdG9yIHsKLQkvKioKLQkgKiBBbiBlbnRpdHkgcmVzb2x2ZXIgdGhhdCB3cmFwcyBhIFVSSSByZXNvbHZlci4KLQkgKi8KLQljbGFzcyBEVERFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCXByaXZhdGUgVVJJUmVzb2x2ZXIgZlVSSVJlc29sdmVyID0gbnVsbDsKLQotCQkvKioKLQkJICogQ29uc3RydWN0b3IuCi0JCSAqIAotCQkgKiBAcGFyYW0gaWRyZXNvbHZlcgotCQkgKiAgICAgICAgICAgIFRoZSBpZHJlc29sdmVyIHRoaXMgZW50aXR5IHJlc29sdmVyIHdyYXBzLgotCQkgKiBAcGFyYW0gYmFzZWxvY2F0aW9uCi0JCSAqICAgICAgICAgICAgVGhlIGJhc2UgbG9jYXRpb24gdG8gcmVzb2x2ZSB3aXRoLgotCQkgKi8KLQkJcHVibGljIERUREVudGl0eVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaXJlc29sdmVyLCBTdHJpbmcgYmFzZWxvY2F0aW9uKSB7Ci0JCQl0aGlzLmZVUklSZXNvbHZlciA9IHVyaXJlc29sdmVyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUT0RPIGNzOiB3ZSBuZXZlciBzZWVtIHRvIHNldCBhIFVSSVJlc29sdmVyCi0gICAgICAgICAgICAvLyBJIGNyZWF0ZSBvbmUgaGVyZSB1cCBmcm9udCBqdXN0IGluY2FzZQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChmVVJJUmVzb2x2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZlVSSVJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgCi0JCQl0aGlzLmZCYXNlTG9jYXRpb24gPSBiYXNlbG9jYXRpb247Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCQkJaWYgKGZCYXNlTG9jYXRpb24uZXF1YWxzKHN5c3RlbUlkKSkgewotCQkJCWxvY2F0aW9uID0gc3lzdGVtSWQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsb2NhdGlvbiA9IGZVUklSZXNvbHZlci5yZXNvbHZlKGZCYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQlJbnB1dFNvdXJjZSBpcyA9IG51bGw7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCAmJiAhbG9jYXRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJICAvLyBDUyA6IHdoaWxlIHdvcmtpbmcgb24gYnVnIDExMzUzNyBJIG5vdGljZWQgd2UncmUgbm90IHVzaW5nIHRoZSBMYXp5VVJMSW5wdXRTdHJlYW0KLQkJICAgICAgLy8gc28gZml4ZWQgdGhpcyB0byBhdm9pZCBsZWFraW5nIGZpbGUgaGFuZGxlcwotCQkJICAvLwotICAgICAgICAgICAgICBTdHJpbmcgcGh5c2ljYWwgPSBmVVJJUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oZkJhc2VMb2NhdGlvbiwgcHVibGljSWQsIGxvY2F0aW9uKTsgCi0JCQkgIGlzID0gbmV3IElucHV0U291cmNlKGxvY2F0aW9uKTsKLQkJCSAgaXMuc2V0Qnl0ZVN0cmVhbShuZXcgTGF6eVVSTElucHV0U3RyZWFtKHBoeXNpY2FsKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiBlcnJvciBoYW5kbGVyIGZvciBEVEQgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0JICovCi0JY2xhc3MgRFRERXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLQotCQlwcml2YXRlIGZpbmFsIGludCBFUlJPUiA9IDA7Ci0JCXByaXZhdGUgZmluYWwgVmFsaWRhdGlvbkluZm8gZlZhbGlkYXRpb25JbmZvOwotCi0JCXByaXZhdGUgZmluYWwgaW50IFdBUk5JTkcgPSAxOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSB2YWxpbmZvCi0JCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gdXNlIHRvIHJlZ2lzdGVyIHZhbGlkYXRpb24KLQkJICogICAgICAgICAgICBtZXNzYWdlcy4KLQkJICovCi0JCXB1YmxpYyBEVERFcnJvckhhbmRsZXIoVmFsaWRhdGlvbkluZm8gdmFsaW5mbykgewotCQkJdGhpcy5mVmFsaWRhdGlvbkluZm8gPSB2YWxpbmZvOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eS4KLQkJICogCi0JCSAqIEBwYXJhbSBleGNlcHRpb24KLQkJICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRoYXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCQkgKiAgICAgICAgICAgIG1lc3NhZ2UuCi0JCSAqIEBwYXJhbSBzZXZlcml0eQotCQkgKiAgICAgICAgICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpIHsKLQkJCWlmIChleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNldmVyaXR5ID09IFdBUk5JTkcpIHsKLQkJCQkJZlZhbGlkYXRpb25JbmZvLmFkZFdhcm5pbmcoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmVmFsaWRhdGlvbkluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBFUlJPUik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBFUlJPUik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBXQVJOSU5HKTsKLQkJfQotCX0KLQotCWNsYXNzIE11bHRpSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgb3JnLnhtbC5zYXguRFRESGFuZGxlciwgQ29udGVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyLCBEZWNsSGFuZGxlciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX01PRElGSUVSUyA9ICIqKz8iOyAvLyROT04tTkxTLTEkCi0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0RFTElNSVRFUlMgPSAiLCgpfCAiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJpdmF0ZSBMaXN0IGZFbGVtRGVjbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJpdmF0ZSBIYXNodGFibGUgZkVsZW1SZWZzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXByaXZhdGUgTGlzdCBmSWdub3JlRWxlbU1vZGVsID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgTGlzdCBmSWdub3JlRWxlbVJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJpdmF0ZSBMb2NhdG9yIGZMb2NhdG9yID0gbnVsbDsKLQotCQlwdWJsaWMgTXVsdGlIYW5kbGVyKCkgewotCQkJZklnbm9yZUVsZW1SZWZzLmFkZCgiI1BDREFUQSIpOyAvLyROT04tTkxTLTEkCi0JCQlmSWdub3JlRWxlbU1vZGVsLmFkZCgiQU5ZIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZJZ25vcmVFbGVtTW9kZWwuYWRkKCJFTVBUWSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNhdHRyaWJ1dGVEZWNsKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYXR0cmlidXRlRGVjbChTdHJpbmcgZU5hbWUsIFN0cmluZyBhTmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZURlZmF1bHQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2NvbW1lbnQoY2hhcltdLCBpbnQsIGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhcltdIGFyZzAsIGludCBhcmcxLCBpbnQgYXJnMikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2VsZW1lbnREZWNsKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZWwpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gQWRkIHRoaXMgZWxlbWVudCB0byB0aGUgbGlzdCBvZiBkZWNsYXJlZCBlbGVtZW50cy4KLQkJCWZFbGVtRGVjbHMuYWRkKG5hbWUpOwotCi0JCQkvLyBSZXR1cm4gaWYgdGhlIGVsZW1lbnQgbW9kZWwgc2hvdWxkIGJlIGlnbm9yZWQuIFRoZSBtb2RlbCBzaG91bGQKLQkJCS8vIGJlCi0JCQkvLyBpZ25vcmVkIGluIHN1Y2ggY2FzZXMgYXMgd2hlbiBpdCBpcyBlcXVhbCB0byBFTVBUWSBvciBBTlkuCi0JCQlpZiAoZklnbm9yZUVsZW1Nb2RlbC5jb250YWlucyhtb2RlbCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBBZGQgZWFjaCByZWZlcmVuY2VkIGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlZCBlbGVtZW50cwotCQkJaW50IGxpbmUgPSBmTG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7Ci0JCQlpbnQgY29sdW1uID0gZkxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0JCQlTdHJpbmcgdXJpID0gZkxvY2F0b3IuZ2V0U3lzdGVtSWQoKTsKLQotCQkJU3RyaW5nVG9rZW5pemVyIHN0cnRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobW9kZWwsIE1PREVMX0RFTElNSVRFUlMpOwotCQkJd2hpbGUgKHN0cnRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSBzdHJ0b2submV4dFRva2VuKCk7Ci0JCQkJaW50IHRva2VubGVuZ3RoID0gdG9rZW4ubGVuZ3RoKCk7Ci0JCQkJaWYgKEVMRU1FTlRfTU9ESUZJRVJTLmluZGV4T2YodG9rZW4uY2hhckF0KHRva2VubGVuZ3RoIC0gMSkpICE9IC0xKSB7Ci0JCQkJCXRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDAsIHRva2VubGVuZ3RoIC0gMSk7Ci0JCQkJCS8vIElmIHRoZSB0b2tlbiBpcyBub3cgZW1wdHkgKGl0IHdhcyBvbmx5ID8sKiBvciArKSB0aGVuCi0JCQkJCS8vIGNvbnRpbnVlLgotCQkJCQlpZiAodG9rZW4ubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGZJZ25vcmVFbGVtUmVmcy5jb250YWlucyh0b2tlbikpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCUVsZW1lbnRSZWZMb2NhdGlvbiBlbGVtTG9jID0gKEVsZW1lbnRSZWZMb2NhdGlvbikgZkVsZW1SZWZzLmdldCh0b2tlbik7Ci0JCQkJRWxlbWVudFJlZkxvY2F0aW9uIHRva2VuTG9jID0gbmV3IEVsZW1lbnRSZWZMb2NhdGlvbihsaW5lLCBjb2x1bW4sIHVyaSwgZWxlbUxvYyk7Ci0JCQkJZkVsZW1SZWZzLnB1dCh0b2tlbiwgdG9rZW5Mb2MpOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmRDREFUQSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmREVEQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kRW50aXR5KFN0cmluZyBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZXh0ZXJuYWxFbnRpdHlEZWNsKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGV4dGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKioKLQkJICogR2V0IHRoZSBsaXN0IG9mIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotCQkgKiAKLQkJICogQHJldHVybiBUaGUgbGlzdCBvZiBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gZkVsZW1EZWNsczsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBoYXNodGFibGUuCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSBlbGVtZW50IHJlZmVyZW5jZXMgaGFzaHRhYmxlLgotCQkgKi8KLQkJcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UmVmZXJlbmNlcygpIHsKLQkJCXJldHVybiBmRWxlbVJlZnM7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNpbnRlcm5hbEVudGl0eURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3NldERvY3VtZW50TG9jYXRvcihvcmcueG1sLnNheC5Mb2NhdG9yKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgewotCQkJc3VwZXIuc2V0RG9jdW1lbnRMb2NhdG9yKGxvY2F0b3IpOwotCQkJdGhpcy5mTG9jYXRvciA9IGxvY2F0b3I7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydENEQVRBKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnREVEQoamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0JfQotCi0JCi0KLQlwcml2YXRlIFVSSVJlc29sdmVyIGZSZXNvbHZlciA9IG51bGw7Ci0KLQlwdWJsaWMgRFREVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgVVJJIHJlc29sdmVyIHRvIHVzZSB3aXRoIFhTRCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB1cmlyZXNvbHZlcgotCSAqICAgICAgICAgICAgVGhlIFVSSSByZXNvbHZlciB0byB1c2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIpIHsKLQkJdGhpcy5mUmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgRFREIGZpbGUgbG9jYXRlZCBhdCB0aGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0JICogQHJldHVybiBBIHZhbGlkYXRpb24gcmVwb3J0IGZvciB0aGUgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpKSB7Ci0JCVZhbGlkYXRpb25JbmZvIHZhbGluZm8gPSBuZXcgVmFsaWRhdGlvbkluZm8odXJpKTsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0JCQlYTUxSZWFkZXIgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQkJTXVsdGlIYW5kbGVyIGR0ZEhhbmRsZXIgPSBuZXcgTXVsdGlIYW5kbGVyKCk7Ci0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2RlY2xhcmF0aW9uLWhhbmRsZXIiLCBkdGRIYW5kbGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBkdGRIYW5kbGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGR0ZEhhbmRsZXIpOwotCQkJcmVhZGVyLnNldERUREhhbmRsZXIoZHRkSGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBEVERFcnJvckhhbmRsZXIodmFsaW5mbykpOwotCQkJcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKG5ldyBEVERFbnRpdHlSZXNvbHZlcihmUmVzb2x2ZXIsIHVyaSkpOwotCQkJU3RyaW5nIGRvY3VtZW50ID0gIjwhRE9DVFlQRSByb290IFNZU1RFTSBcIiIgKyB1cmkgKyAiXCI+PHJvb3QvPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlyZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZG9jdW1lbnQpKSk7Ci0KLQkJCUxpc3QgZWxlbURlY2xzID0gZHRkSGFuZGxlci5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0JCQlIYXNodGFibGUgZWxlbVJlZnMgPSBkdGRIYW5kbGVyLmdldEVsZW1lbnRSZWZlcmVuY2VzKCk7Ci0JCQl2YWxpZGF0ZUVsZW1lbnRSZWZlcmVuY2VzKGVsZW1EZWNscywgZWxlbVJlZnMsIHZhbGluZm8pOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCXJldHVybiB2YWxpbmZvOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBlbGVtZW50IHJlZmVyZW5jZXMgaW4gdGhlIERURC4gQW4gZWxlbWVudCByZWZlcmVuY2UgaXMKLQkgKiA8IUVMRU1FTlQgZWxlbSAoZWxlbWVudFJlZmVyZW5jZSk+Ci0JICogCi0JICogQHBhcmFtIGVsZW1EZWNscwotCSAqICAgICAgICAgICAgQSBsaXN0IG9mIHZhbGlkIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotCSAqIEBwYXJhbSBlbGVtUmVmcwotCSAqICAgICAgICAgICAgQSBoYXNodGFibGUgY29udGFpbmluZyBlbGVtZW50IHJlZmVyZW5jZXMgYXMga2V5cyBhbmQKLQkgKiAgICAgICAgICAgIGxvY2F0aW9ucyBpbiB0aGUgZG9jdW1lbnQgYXMgdmFsdWVzLgotCSAqIEBwYXJhbSB2YWxpbmZvCi0JICogICAgICAgICAgICBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byBzdG9yZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUVsZW1lbnRSZWZlcmVuY2VzKExpc3QgZWxlbURlY2xzLCBIYXNodGFibGUgZWxlbVJlZnMsIFZhbGlkYXRpb25JbmZvIHZhbGluZm8pIHsKLQkJRW51bWVyYXRpb24ga2V5cyA9IGVsZW1SZWZzLmtleXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBlbGVtUmVmID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzbid0IGJlZW4gZGVjbGFyZWQgY3JlYXRlIGFuIGVycm9yLgotCQkJaWYgKCFlbGVtRGVjbHMuY29udGFpbnMoZWxlbVJlZikpIHsKLQkJCQlFbGVtZW50UmVmTG9jYXRpb24gZWxlbUxvYyA9IChFbGVtZW50UmVmTG9jYXRpb24pIGVsZW1SZWZzLmdldChlbGVtUmVmKTsKLQkJCQlkbyB7Ci0JCQkJCXZhbGluZm8uYWRkRXJyb3IoTkxTLmJpbmQoRFREVmFsaWRhdGlvbk1lc3NhZ2VzLl9FUlJPUl9SRUZfRUxFTUVOVF9VTkRFRklORUQsICInIiArIGVsZW1SZWYgKyAiJyIpLCBlbGVtTG9jLmdldExpbmUoKSwgZWxlbUxvYy5nZXRDb2x1bW4oKSwgZWxlbUxvYy5nZXRVUkkoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQllbGVtTG9jID0gZWxlbUxvYy5nZXROZXh0KCk7Ci0JCQkJfQotCQkJCXdoaWxlIChlbGVtTG9jICE9IG51bGwpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRWxlbWVudFJlZkxvY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbGVtZW50UmVmTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5OGRhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbGVtZW50UmVmTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBBbiBlbGVtZW50IHJlZmVyZW5jZXMgbG9jYXRpb24gaG9sZHMgdGhlIGxvY2F0aW9uIG9mIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotICogQW4gZWxlbWVudCByZWZlcmVuY2UgaXMgZGVjbGFyZWQgaW4gYSBEVEQgZWxlbWVudCBkZWNsYXJhdGlvbiBzdWNoIGFzCi0gKiA8IUVMRU1FTlQgbXllbGVtIChlbGVtZW50cmVmKT4gQW4gZWxlbWVudCByZWZlcmVuY2UgbWF5IGJlIHBhcnQgb2YgYSBsaW5rZWQKLSAqIGxpc3QgYW5kIGNhbiBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaXN0LgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLWNsYXNzIEVsZW1lbnRSZWZMb2NhdGlvbiB7Ci0JcHJpdmF0ZSBpbnQgY29sdW1uID0gLTE7Ci0KLQlwcml2YXRlIGludCBsaW5lID0gLTE7Ci0KLQlwcml2YXRlIEVsZW1lbnRSZWZMb2NhdGlvbiBuZXh0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHVyaTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lCi0JICogICAgICAgICAgICBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gbmV4dAotCSAqICAgICAgICAgICAgVGhlIG5leHQgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWZMb2NhdGlvbihpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgRWxlbWVudFJlZkxvY2F0aW9uIG5leHQpIHsKLQkJdGhpcy5saW5lID0gbGluZTsKLQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCXRoaXMudXJpID0gdXJpOwotCQl0aGlzLm5leHQgPSBuZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lKCkgewotCQlyZXR1cm4gbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5leHQgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIGxpbmtlZCBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5leHQgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIGxpbmtlZCBsaXN0LgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmTG9jYXRpb24gZ2V0TmV4dCgpIHsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL0RURFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ0YTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIEFuIERURCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogRFREIHZhbGlkYXRvciB0byBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LgotICogVXNpbmcgdGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBpbnRlcm5hbCBEVEQgdmFsaWRhdG9yIGFuZCByZWdpc3RlcmluZwotICogdGhlIFVSSSByZXNvbHZlciBmcm9tIHRoZSBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EVERWYWxpZGF0b3IgCi17Ci0gIHByaXZhdGUgc3RhdGljIERURFZhbGlkYXRvciBfaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBSZWdpc3RlcnMgVVJJIHJlc29sdXRpb24gZnJhbWV3b3JrIHdpdGggdGhlIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgRFREVmFsaWRhdG9yKCkKLSAgewotCXN1cGVyKCk7Ci0Jc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2Ugc3BlY2lmaWMgRFREIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHNwZWNpZmljIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERURFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpIAotICB7Ci0JaWYgKF9pbnN0YW5jZSA9PSBudWxsKSAKLQl7Ci0JICBfaW5zdGFuY2UgPSBuZXcgRFREVmFsaWRhdG9yKCk7Ci0JfQotCXJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzk0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci0KLS8qKgotICogRFREIHZhbGlkYXRvciB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yIAotewotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JRFREVmFsaWRhdG9yIHZhbGlkYXRvciA9IERURFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCXZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmkpOwotCQotCXJldHVybiB2YWxyZXBvcnQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZDlmZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGJhc2UgY2xhc3MgZm9yIGFuIEVsZW1lbnQncyBjb250ZW50bW9kZWwKLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgZXh0ZW5kcyBEVEROb2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9DSEFSQUNURVJfREFUQV9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FU19ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlRJVFlfTkFNRV9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTUVSQVRFRF9OQU1FID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNRVJBVEVEX05PVEFUSU9OID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlVNX05PVEFUSU9OX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSVhFRCA9ICIjRklYRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0lERU5USUZJRVJfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9JRF9SRUZFUkVOQ0VfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGUyA9IERURENvcmVNZXNzYWdlcy5fVUlfSURfUkVGRVJFTkNFU19ERVNDOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMSUVEID0gIiNJTVBMSUVEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU4gPSBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5fREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9OQU1FX1RPS0VOU19ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAiI1JFUVVJUkVEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBIYXNodGFibGUgdHlwZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHR5cGVzID0ge0NEQVRBLCBJRCwgSURSRUYsIElEUkVGUywgRU5USVRZLCBFTlRJVElFUywgTk1UT0tFTiwgTk1UT0tFTlMsIEVOVU1FUkFURURfTkFNRSwgRU5VTUVSQVRFRF9OT1RBVElPTn07Ci0KLQl7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JELCBDREFUQSk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JELCBJRCk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JELCBJRFJFRik7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCwgSURSRUZTKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JELCBFTlRJVFkpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCwgRU5USVRJRVMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JELCBOTVRPS0VOKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQsIE5NVE9LRU5TKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQsIEVOVU1FUkFURURfTk9UQVRJT04pOwotCQkvLyB0aGlzIG9uZSdzIGEgc3BlY2lhbCBjYXNlIHNpbmNlIHRoZXJlIGlzIG5vIGtleXdvcmQgZm9yCi0JCS8vIGVudW1lcmF0ZWQgbmFtZSB0b2tlbnMKLQkJdHlwZUhhc2gucHV0KCIoKSIsIEVOVU1FUkFURURfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBub3cgcHV0IHRoZSByZXZlcnNlIGluIHBsYWNlLiBUaGlzIGdpdmVzIHVzIGEgMiB3YXkgbG9va3VwCi0JCS8vIGZvciB3aGVuIHdlIHdhbnQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFuZCB3aGVuIHdlIHdhbnQgdG8gc2V0IGl0Ci0JCXR5cGVIYXNoLnB1dChDREFUQSwgIkNEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KElELCAiSUQiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoSURSRUYsICJJRFJFRiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChJRFJFRlMsICJJRFJFRlMiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5USVRZLCAiRU5USVRZIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVElUSUVTLCAiRU5USVRJRVMiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoTk1UT0tFTiwgIk5NVE9LRU4iKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoTk1UT0tFTlMsICJOTVRPS0VOUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlVNRVJBVEVEX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5VTUVSQVRFRF9OT1RBVElPTiwgIk5PVEFUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIEF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gbnVsbDsKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRUQgPSAiSU1QTElFRCI7Ci0KLQlwdWJsaWMgQXR0cmlidXRlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2luZCgpIHsKLQkJSVRleHRSZWdpb24gZGVmYXVsdEtpbmRSZWdpb24gPSBnZXREZWZhdWx0S2luZFJlZ2lvbigpOwotCQlpZiAoZGVmYXVsdEtpbmRSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoZGVmYXVsdEtpbmRSZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldERlZmF1bHRLaW5kUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JEKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJSVRleHRSZWdpb24gZGVmYXVsdFZhbHVlID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihkZWZhdWx0VmFsdWUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVFbnVtTGlzdCBnZXRFbnVtTGlzdCgpIHsKLQkJcmV0dXJuIGVudW1MaXN0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5BVFRSSUJVVEVJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROZXh0UXVvdGVkTGl0ZXJhbChSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpIHx8IHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRPZmZzZXRBZnRlclR5cGUoKSB7Ci0JCUlUZXh0UmVnaW9uIHR5cGVSZWdpb24gPSBnZXRUeXBlUmVnaW9uKCk7Ci0KLQkJU3RyaW5nIHR5cGUgPSBnZXRUeXBlKCk7Ci0JCWJvb2xlYW4gaXNFbnVtZXJhdGlvbiA9IHR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkgfHwgdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCWlmIChpc0VudW1lcmF0aW9uKSB7Ci0JCQkvLyBub3cgY2hlY2sgaWYgbWF5YmUgdGhpcyBpcyBhbiBlbnVtZXJhdGlvbgotCQkJaWYgKGdldEVudW1MaXN0KCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRFbnVtTGlzdCgpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCWlmICh0eXBlUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQodHlwZVJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuYW1lUmVnaW9uKTsKLQkJCS8vIC8vIGNyZWF0ZSBvbmUKLQkJCS8vIHR5cGVSZWdpb24gPQotCQkJLy8gZmluZE9yQ3JlYXRlVHlwZVJlZ2lvbigoU3RyaW5nKXR5cGVIYXNoLmdldChDREFUQSkpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRUeXBlUmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSB0eXBlSGFzaC5nZXQocmVnaW9uLmdldFR5cGUoKSk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8ganVzdCByZXR1cm4gdGhlIHRleHQgb2YgdGhlIHR5cGUgcmVnaW9uIHNpbmNlIHRoaXMgbWF5IGJlCi0JCQkJLy8gYW4gZW50aXR5IHJlcHJlc2VudGluZyB0aGUgdHlwZTsKLQkJCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0RW51bUxpc3QoKSAhPSBudWxsKSB7Ci0JCQkvLyBlbnVtZXJhdGVkIG5hbWUgdG9rZW5zIGRvbid0IGhhdmUgYSB0eXBlIGtleXdvcmQuIGp1c3QKLQkJCS8vIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGxlZnQgcGFyZW4gaXMgZW5vdWdoCi0JCQlyZXR1cm4gKFN0cmluZykgdHlwZUhhc2guZ2V0KCIoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0VHlwZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5QQVJNX0VOVElUWV9UWVBFKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpIHx8IHR5cGUuZXF1YWxzKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSkgewotCQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKSkgewotCQkJCWVudW1MaXN0ID0gbmV3IEF0dHJpYnV0ZUVudW1MaXN0KGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJfQotCQkJaWYgKGVudW1MaXN0ICE9IG51bGwpIHsKLQkJCQllbnVtTGlzdC5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRLaW5kKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBraW5kKSB7Ci0KLQkJSVRleHRSZWdpb24gZGVmYXVsdEtpbmRSZWdpb24gPSBnZXREZWZhdWx0S2luZFJlZ2lvbigpOwotCQlTdHJpbmcgb2xkRGVmYXVsdEtpbmQgPSBkZWZhdWx0S2luZFJlZ2lvbiA9PSBudWxsID8gIiIgOiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KGRlZmF1bHRLaW5kUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWtpbmQuZXF1YWxzKG9sZERlZmF1bHRLaW5kKSkgewotCQkJU3RyaW5nIG5ld1RleHQgPSBraW5kOwotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJaWYgKGRlZmF1bHRLaW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKTsKLQkJCQlsZW5ndGggPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pIC0gc3RhcnRPZmZzZXQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldE9mZnNldEFmdGVyVHlwZSgpOwotCQkJCW5ld1RleHQgPSAiICIgKyBuZXdUZXh0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUlUZXh0UmVnaW9uIGRlZmF1bHRWYWx1ZSA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXJhdG9yKCkpOwotCi0JCQlpZiAoa2luZC5lcXVhbHMoQXR0cmlidXRlLkZJWEVEKSB8fCBraW5kLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotCQkJCQkvLyB3ZSBhcmUgY2hhbmdpbmcgdG8gZml4ZWQgYW5kIHdlaGF2ZSBubyBxdW90ZWQgcmVnaW9uLgotCQkJCQkvLyBwdXQgaW4gYW4gZW1wdHkgdmFsdWUKLQkJCQkJbmV3VGV4dCArPSAiIFwiXCIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWxlbmd0aCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChkZWZhdWx0VmFsdWUpIC0gc3RhcnRPZmZzZXQ7Ci0JCQkJfQotCQkJfQotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgbGVuZ3RoLCBuZXdUZXh0KTsKLQkJCS8vIGRvIHNvbWV0aGluZyBpZiB0aGVyZSBpcyBubyAia2luZCIgcmVnaW9uCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0S2luZChTdHJpbmcga2luZCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9LSU5EKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0S2luZCh0aGlzLCBraW5kKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZml4ZWQpIHsKLQkJSVRleHRSZWdpb24gZGVmYXVsdFZhbHVlID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCVN0cmluZyBxdW90ZUNoYXIgPSB2YWx1ZS5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaW50IGVuZE9mZnNldCA9IDA7Ci0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgb2xkVmFsdWUgPSBnZXREZWZhdWx0VmFsdWUoKTsKLQkJYm9vbGVhbiBvbGRLaW5kSXNGaXhlZCA9IGdldERlZmF1bHRLaW5kKCkuZXF1YWxzKEF0dHJpYnV0ZS5GSVhFRCk7Ci0JCWlmIChvbGRWYWx1ZS5lcXVhbHModmFsdWUpICYmIGZpeGVkID09IG9sZEtpbmRJc0ZpeGVkKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZGVmYXVsdFZhbHVlKTsKLQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChkZWZhdWx0VmFsdWUpOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gZGVmYXVsdEtpbmRSZWdpb24gPSBnZXREZWZhdWx0S2luZFJlZ2lvbigpOwotCQlpZiAoZGVmYXVsdEtpbmRSZWdpb24gIT0gbnVsbCkgewotCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCQllbmRPZmZzZXQgPSBlbmRPZmZzZXQgPT0gMCA/IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbikgOiBlbmRPZmZzZXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoc3RhcnRPZmZzZXQgPT0gMCkgewotCQkJCWVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ID0gZ2V0T2Zmc2V0QWZ0ZXJUeXBlKCk7Ci0JCQkJbmV3VGV4dCArPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUlUZXh0UmVnaW9uIHR5cGVSZWdpb24gPSBnZXRUeXBlUmVnaW9uKCk7Ci0JCQlpZiAodHlwZVJlZ2lvbiA9PSBudWxsICYmIGdldEVudW1MaXN0KCkgPT0gbnVsbCkgewotCQkJCS8vIHRhY2sgb24gYSBkZWZhdWx0IHR5cGUKLQkJCQkvLyBuZXdUZXh0ICs9ICJDREFUQSAiOwotCQkJfQotCQl9Ci0JCWlmIChmaXhlZCkgewotCQkJbmV3VGV4dCArPSAiI0ZJWEVEICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXREZWZhdWx0S2luZCgpLmVxdWFscygiIikgJiYgdmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkvLyBpZiBub3QgZml4ZWQgYW5kIHZhbHVlIGlzICIiIHRoZW4gcmVzZXQgdGhlIGRlZmF1bHQga2luZCB0bwotCQkJCS8vIGltcGxpZWQKLQkJCQluZXdUZXh0ICs9ICIjSU1QTElFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmICghZ2V0VHlwZSgpLmVxdWFscygiIikgJiYgIXZhbHVlLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQluZXdUZXh0ICs9IHF1b3RlQ2hhciArIHZhbHVlICsgcXVvdGVDaGFyOwotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIHZhbHVlLCBib29sZWFuIGZpeGVkKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX1ZBTCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVmYXVsdFZhbHVlKHRoaXMsIHZhbHVlLCBmaXhlZCk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB0eXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gZ2V0VHlwZSgpOwotCQlpZiAoIXR5cGUuZXF1YWxzKG9sZFR5cGUpKSB7Ci0JCQlib29sZWFuIHdhc0VudW1lcmF0aW9uID0gb2xkVHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCBvbGRUeXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJCWJvb2xlYW4gaXNFbnVtZXJhdGlvbiA9IHR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkgfHwgdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJaW50IGVuZE9mZnNldCA9IDA7Ci0KLQkJCWlmICh3YXNFbnVtZXJhdGlvbiAmJiAhaXNFbnVtZXJhdGlvbikgewotCQkJCS8vIGdldCByaWQgb2YgdGhlIG9sZCBlbnVtbGlzdAotCQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gZ2V0RW51bUxpc3QoKTsKLQkJCQlpZiAoZW51bUxpc3QgIT0gbnVsbCkgewotCQkJCQlzdGFydE9mZnNldCA9IGVudW1MaXN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVuZE9mZnNldCA9IGVudW1MaXN0LmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0VHlwZVJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCWlmIChlbmRPZmZzZXQgPT0gMCkgewotCQkJCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCQluZXdUZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCWVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJfQotCi0JCQlTdHJpbmcgbmV3VHlwZVdvcmQgPSAoU3RyaW5nKSB0eXBlSGFzaC5nZXQodHlwZSk7Ci0JCQlpZiAobmV3VHlwZVdvcmQgPT0gbnVsbCkgewotCQkJCS8vIHRoZW4gdGhpcyBtdXN0IGJlIGEgcGFybSBlbnRpdHkgYmVpbmcgdXNlZCBpbiB0aGUgdHlwZQotCQkJCS8vIHVzZSB0aGUgdHlwZSB0ZXh0IGRpcmVjdGx5Ci0JCQkJbmV3VHlwZVdvcmQgPSB0eXBlOwotCQkJfQotCi0JCQluZXdUZXh0ICs9IG5ld1R5cGVXb3JkOwotCi0JCQlpZiAoaXNFbnVtZXJhdGlvbiAmJiAhd2FzRW51bWVyYXRpb24pIHsKLQkJCQkvLyBwdXQgaW4gYSBuZXcgbnVtbGlzdAotCQkJCWJvb2xlYW4gaXNTcGFjZU5lZWRlZCA9ICF0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpOwotCQkJCW5ld1RleHQgKz0gaXNTcGFjZU5lZWRlZCA/ICIgIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXdUZXh0ICs9ICIoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBuZXdUZXh0KTsKLQkJCWlmIChuZXdUeXBlV29yZC5lcXVhbHMoIiIpICYmICF0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyB0aGUgc2V0IHRoZSBkZWZhdWx0a2luZCB0byAiIgotCQkJCS8vIHNldERlZmF1bHRLaW5kKHJlcXVlc3RvciwgIiIpOwotCQkJCXNldERlZmF1bHRWYWx1ZShyZXF1ZXN0b3IsICIiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VHlwZSh0aGlzLCB0eXBlKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlRW51bUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlRW51bUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwZTEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUVudW1MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVFbnVtTGlzdCBleHRlbmRzIERURE5vZGUgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBBdHRyaWJ1dGVFbnVtTGlzdChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gbmV2ZXIgZXhwb3NlZCBpbiB0cmVlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgaW4gdGhpcyBlbnVtZXJhdGVkIGxpc3QKLQlwdWJsaWMgTGlzdCBnZXRJdGVtcygpIHsKLQkJbGlzdC5jbGVhcigpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5OQU1FKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQlsaXN0LmFkZChnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmdbXSBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHQgPSAiKCI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJdGV4dCArPSAiIHwgIiArIGl0ZW1zW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZXh0ICs9IGl0ZW1zW2ldOwotCQkJCX0KLQkJCX0KLQkJCXRleHQgKz0gIikiOyAvLyROT04tTkxTLTEkCi0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0YXJ0T2Zmc2V0KCksIGdldE5vZGVMZW5ndGgoKSwgdGV4dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfRU5VTV9JVEVNUyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SXRlbXModGhpcywgaXRlbXMpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyMmI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVMaXN0IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCXB1YmxpYyBBdHRyaWJ1dGVMaXN0KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfTElTVF9BREQpOyAvLyROT04tTkxTLTEkCi0KLQkJRFRETm9kZSBsYXN0QXR0cmlidXRlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0QXR0cmlidXRlLmdldEVuZE9mZnNldCgpLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQl9Ci0KLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5BVFRSSUJVVEVMSVNUSUNPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIEF0dHJpYnV0ZSByZWZlcmVuY2UsIEF0dHJpYnV0ZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbm9kZS5nZXRGdWxsTm9kZVRleHQoKTsKLQkJaWYgKCFpc0FmdGVyKSB7Ci0JCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSBhbmQgZ2V0IG5leHQgY2hpbGQKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgcmVmZXJlbmNlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJb2Zmc2V0ID0gYXR0ci5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCB1c2UgdGhlIGVuZCBvZmZzZXQKLQkJCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCW5ld1RleHQgKz0gbm9kZVRleHQ7Ly8gKyAoaXNMYXN0Q2hpbGQgPyAiXG4iIDogIlxuXHQiKTsKLQkJaWYgKCFub2RlLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKSB7Ci0JCQluZXdUZXh0ICs9ICJcblx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQkJYm9vbGVhbiB0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKSkgewotCQkJCWF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJY2hpbGRyZW4uYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYXBwZW5kQ2hpbGQoYXR0cmlidXRlKTsKLQkJCQl0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCAmJiBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSAhPSBEVERSZWdpb25UeXBlcy5FTkRfVEFHKSB7Ci0JCQkJaWYgKCF0cmFpbGluZ1doaXRlc3BhY2UpIHsKLQkJCQkJYXR0cmlidXRlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSB7Ci0JCQkJCQlhdHRyaWJ1dGUuYWRkV2hpdGVzcGFjZVJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHRoZSBmb2xsb3dpbmcgcHJldmVudHMgZXh0cmEgd2hpdGVzcGFjZSBmcm9tIGJlaW5nIHBpY2tlZAotCQkJCS8vIHVwIGJ5IHRoZSBhdHRyaWJ1dGUKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpIHsKLQkJCQkJdHJhaWxpbmdXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IG51bUtpZHMgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2lkczsgaSsrKSB7Ci0JCQkoKEF0dHJpYnV0ZSkgY2hpbGRyZW4uZ2V0KGkpKS5yZXNvbHZlUmVnaW9ucygpOwotCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjdmMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUJhc2ljTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKgotICogQ01CYXNpY05vZGUgY29tYmluZXMgYWxsIHRoZSBkaWZmZXJlbnQgY29udGVudCB0eXBlcyBpbnRvIG9uZS4gVGhlIGlkZWEKLSAqIGJlaGluZCB0aGlzIGlzIHRvIGFsbG93IGFyYml0cmFyeSBuYW1lIGNoYW5nZXMgdG8gbm90IHJlcXVpcmUgYSB0cmVlCi0gKiB1cGRhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDTUJhc2ljTm9kZSBleHRlbmRzIENNUmVwZWF0YWJsZU5vZGUgewotCi0JLy8gc3RhdGljIGZpbmFsIGludCBFTVBUWSA9IDA7Ci0JLy8gc3RhdGljIGZpbmFsIGludCBBTlkgPSAxOwotCS8vIHN0YXRpYyBmaW5hbCBpbnQgUENEQVRBID0gMjsKLQotCXB1YmxpYyBDTUJhc2ljTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCUlUZXh0UmVnaW9uIHBjZGF0YSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOwotCQlpZiAocGNkYXRhICE9IG51bGwpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuUENEQVRBSUNPTik7Ci0JCX0KLQotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSkgewotCQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRU1QVFlJQ09OKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzKEFOWSkpIHsKLQkJCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFOWUlDT04pOwotCQkJfQotCQl9Ci0KLQkJLy8gT3RoZXJ3aXNlIHRoaXMgaXMganVzdCBhbiBlbGVtZW50IHJlZmVyZW5jZSBub2RlLiBKdXN0IHJldHVybgotCQkvLyB3aGF0IENNUmVwZWF0YWJsZU5vZGUgd291bGQgZ2l2ZSB1cwotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OQU1FIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJldHVybnMgdGhlIG9jY3VycmVuY2V0b2tlbiwgb3IgdGhlIHRva2VuIHdoZXJlIHRoZSBvY2N1cnJlbmNlIHRva2VuCi0JLy8gc2hvdWxkIGFwcGVhciBhZnRlcgotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRPY2N1cnJlbmNlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldE5hbWVSZWdpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCUlUZXh0UmVnaW9uIHBjZGF0YSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOwotCQlpZiAocGNkYXRhICE9IG51bGwpIHsKLQkJCXJldHVybiBQQ0RBVEE7Ci0JCX0KLQotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJZmluYWwgU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJCWlmIChuYW1lLmVxdWFscyhFTVBUWSkpIHsKLQkJCQkJcmV0dXJuIEVNUFRZOwotCQkJCX0KLQkJCQllbHNlIGlmIChuYW1lLmVxdWFscyhBTlkpKSB7Ci0JCQkJCXJldHVybiBBTlk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBvdGhlcndpc2UganVzdCByZXR1cm4gaXQncyBuYW1lIGFzIHRoZSB0eXBlCi0JCQkJCXJldHVybiBuYW1lOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHlBbnlPclBDRGF0YSgpIHsKLQkJaWYgKGlzUENEYXRhKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhFTVBUWSkgfHwgbmFtZS5lcXVhbHMoQU5ZKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BDRGF0YSgpIHsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIHB1YmxpYyBOb2RlIGluc2VydFJlZ2lvbihSZWdpb24gdG9rZW4pCi0JLy8gewotCS8vIGlmICghdG9rZW5TdHJlYW0uY29udGFpbnNUb2tlbih0b2tlbikgJiYgdG9rZW4uZ2V0VHlwZSgpID09Ci0JLy8gVG9rZW4uT0NDVVJfVFlQRSkKLQkvLyB7Ci0JLy8gLy8gdGhlbiBhZGQgaXQgc28gdGhhdCBvdXIgcmFuZ2UgY29udGFpbnMgaXQKLQkvLyBpbnNlcnRJbnRvVG9rZW5TdHJlYW0odG9rZW4pOwotCS8vIH0KLQkvLyByZXR1cm4gdGhpczsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuICFpc0VtcHR5QW55T3JQQ0RhdGEoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCS8vIGJlZ2luUmVjb3JkaW5nKHJlcXVlc3RvciwgIk5hbWUgQ2hhbmdlIik7Ci0KLQkJc3VwZXIuc2V0TmFtZShyZXF1ZXN0b3IsIG5hbWUpOwotCQlpZiAoIWlzUmVmZXJlbmNlKCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vIGxvbmdlciBhIHJlZmVyZW5jZSBub2RlLCByZW1vdmUgdGhlIG9jY3VycmVuY2UKLQkJCS8vIHRva2VuCi0JCQlzZXRPY2N1cnJlbmNlKHJlcXVlc3RvciwgQ01SZXBlYXRhYmxlTm9kZS5PTkNFKTsKLQkJfQotCi0JCS8vIGVuZFJlY29yZGluZyhyZXF1ZXN0b3IpOwotCX0KLQotCS8qCi0JICogcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShpbnQgdHlwZSkgeyBzd2l0Y2ggKHR5cGUpIHsgY2FzZSBFTVBUWToKLQkgKiByZXR1cm4gZW1wdHlTdHJpbmc7IGNhc2UgQU5ZOiByZXR1cm4gYW55U3RyaW5nOyBjYXNlIFBDREFUQTogcmV0dXJuCi0JICogcGNkYXRhU3RyaW5nOyBkZWZhdWx0OiBicmVhazsgfSAvLyBlbmQgb2Ygc3dpdGNoICgpIHJldHVybiAiIjsgfQotCSAqLwotCi19Ly8gQ01CYXNpY05vZGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Hcm91cE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Hcm91cE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1MWZkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNR3JvdXBOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFVuaXF1ZU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cE5vZGUgZXh0ZW5kcyBDTVJlcGVhdGFibGVOb2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSE9JQ0UgPSAnfCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNFUVVFTkNFID0gJywnOwotCi0JcHJvdGVjdGVkIGNoYXIgY29ubmVjdG9yID0gU0VRVUVOQ0U7Ci0KLQkvLyBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIENNR3JvdXBOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0NISUxEKTsgLy8kTk9OLU5MUy0xJAotCQlEVEROb2RlIGxhc3ROb2RlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZU5hbWUoZ2V0Q2hpbGRyZW5MaXN0KCksICJDaGlsZE5vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJcmVwbGFjZVRleHQodGhpcywgbGFzdE5vZGUuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArIGVsZW1lbnROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSArIDEsIDAsIGVsZW1lbnROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEdyb3VwKCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9HUlApOyAvLyROT04tTkxTLTEkCi0JCURURE5vZGUgbGFzdE5vZGUgPSAoRFRETm9kZSkgZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0Tm9kZS5nZXRFbmRPZmZzZXQoKSwgMCwgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpICsgMSwgMCwgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBjaGlsZCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGdldEZpcnN0Q2hpbGQoKSA9PSBjaGlsZCkgewotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXROb2RlTGVuZ3RoKCksIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCURURE5vZGUgY2hpbGRBID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQlib29sZWFuIGNoaWxkQURlbGV0ZWQgPSBjaGlsZEEgPT0gY2hpbGQ7Ci0JCQlib29sZWFuIGNoaWxkQkRlbGV0ZWQgPSBjaGlsZEIgPT0gY2hpbGQ7Ci0JCQlpZiAoY2hpbGRBRGVsZXRlZCB8fCBjaGlsZEJEZWxldGVkKSB7Ci0JCQkJLy8gd2UgZm91bmQgdGhlIGNoaWxkCi0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gY2hpbGRBRGVsZXRlZCA/IGNoaWxkQS5nZXRTdGFydE9mZnNldCgpIDogY2hpbGRBLmdldEVuZE9mZnNldCgpOwotCQkJCWludCBlbmRPZmZzZXQgPSBjaGlsZEFEZWxldGVkID8gY2hpbGRCLmdldFN0YXJ0T2Zmc2V0KCkgOiBjaGlsZEIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqLwotCXB1YmxpYyBjaGFyIGdldENvbm5lY3RvcigpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkrKykgewotCQkJRFRETm9kZSBjaGlsZEEgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQlEVEROb2RlIGNoaWxkQiA9IChEVEROb2RlKSBjaGlsZHJlbltpICsgMV07Ci0KLQkJCS8vIGNyZWF0ZSBhIHN0cmVhbSBiZXR3ZWVuIHRoZSB0d28gc2libGluZ3MgYW5kIHdhbGsgaXQKLQkJCS8vIG5vdGUgdGhhdCB0aGlzIHN0cmVhbSBpbmNsdWRlcyB0aGUgbGFzdCByZWdpb24gb2YgdGhlIGZpcnN0Ci0JCQkvLyBzaWJsaW5nIGFuZCB0aGUgZmlyc3QgcmVnaW9uIG9mIHRoZSBuZXh0IHNpYmxpbmcuCi0JCQkvLyBib3RoIHRoZXNlIHNob3VsZCBiZSBpZ25vcmVkCi0JCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIGNoaWxkQi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCS8vIHN0cmVhbS5zZXRGaXJzdFJlZ2lvbihjaGlsZEEuZ2V0TGFzdFJlZ2lvbigpKTsKLQkJCS8vIHN0cmVhbS5zZXRMYXN0UmVnaW9uKGNoaWxkQi5nZXRGaXJzdFJlZ2lvbigpKTsKLQkJCS8vIEl0ZXJhdG9yIGl0ZXIgPSBzdHJlYW0uaXRlcmF0b3IoKTsKLQkJCS8vIHNraXAgdGhlIGZpcnN0IHJlZ2lvbiB3aGljaCBpcyB0aGUgbGFzdCByZWdpb24gb2YgY2hpbGRBCi0JCQkvLyBkbyB3ZSBuZWVkIHRoaXMgbm93ID8KLQkJCS8vIGl0ZXIubmV4dCgpOwotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgY3VycmVudFJlZ2lvbiAhPSBjaGlsZEIuZ2V0U3RhcnRSZWdpb24oKSkgewotCQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKSB7Ci0JCQkJCWNvbm5lY3RvciA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoY3VycmVudFJlZ2lvbikuY2hhckF0KDApOwotCQkJCQlyZXR1cm4gY29ubmVjdG9yOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29ubmVjdG9yOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJRFREQ29yZVBsdWdpbiByZXNvdXJjZVBsdWdpbiA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQkJc3dpdGNoIChnZXRDb25uZWN0b3IoKSkgewotCQkJY2FzZSBTRVFVRU5DRSA6Ci0JCQkJcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORVNFUVVFTkNFSUNPTik7Ci0JCQkvKgotCQkJICogc3dpdGNoIChnZXRPY2N1cnJlbmNlKCkpIHsgY2FzZSBPTkNFIDogcmV0dXJuCi0JCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVTRVFVRU5DRUlDT04pOyBjYXNlCi0JCQkgKiBPUFRJT05BTCA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT1BUSU9OQUxTRVFVRU5DRUlDT04pOyBjYXNlCi0JCQkgKiBPTkVfT1JfTU9SRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FT1JNT1JFU0VRVUVOQ0VJQ09OKTsKLQkJCSAqIGNhc2UgWkVST19PUl9NT1JFIDogcmV0dXJuCi0JCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5aRVJPT1JNT1JFU0VRVUVOQ0VJQ09OKTsgfQotCQkJICovCi0JCQljYXNlIENIT0lDRSA6Ci0JCQkJcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORUNIT0lDRUlDT04pOwotCQkvKgotCQkgKiBzd2l0Y2ggKGdldE9jY3VycmVuY2UoKSkgeyBjYXNlIE9OQ0UgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FQ0hPSUNFSUNPTik7IGNhc2UgT1BUSU9OQUwgOgotCQkgKiByZXR1cm4gcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT1BUSU9OQUxDSE9JQ0VJQ09OKTsKLQkJICogY2FzZSBPTkVfT1JfTU9SRSA6IHJldHVybgotCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVPUk1PUkVDSE9JQ0VJQ09OKTsgY2FzZQotCQkgKiBaRVJPX09SX01PUkUgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuWkVST09STU9SRUNIT0lDRUlDT04pOyB9Ci0JCSAqLwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXJlZ2lvbiwgb3IgdGhlIGxhc3QgcmVnaW9uIHdoZXJlIHRoZSBvY2N1cnJlbmNlCi0JLy8gcmVnaW9uIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpIHsKLQkJaW50IG5lc3RpbmcgPSAwOwotCi0JCS8vIHdlIHNraXAgcGFzdCB0aGUgZmlyc3QgbGVmdCBwYXJlbiB3ZSBzZWUgc2luY2UgdGhhdCBpcyB0aGUKLQkJLy8gYmVnaW5uaW5nIG9mIG91ciBvd24gbm9kZQotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJLy8gd2UgYXNzdW1lIHRoZSBmaXJzdCByZWdpb24gaXMgdGhlICcoJwotCQlpdGVyLm5leHQoKTsKLQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBuZXN0aW5nID49IDApIHsKLQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKSB7Ci0JCQkJbmVzdGluZysrOwotCQkJfQotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKSB7Ci0JCQkJbmVzdGluZy0tOwotCQkJfQotCQl9Ci0JCWlmIChuZXN0aW5nIDwgMCkgewotCQkJLy8gVGhpcyBtZWFucyB3ZSBoYXZlIHBhc3NlZCBvdmVyIHRoZSByaWdodCBwYXJlbiB0aGF0IG1hcmtzIHRoZQotCQkJLy8gZW5kIG9mIG91ciBncm91cGluZy4KLQkJCS8vIExvb2sgZm9yIGFuIG9jY3VycmVuY2UgcmVnaW9uCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpIHsKLQkJCQkJcmV0dXJuIGN1cnJlbnRSZWdpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIHdlJ3JlIGhlcmUsIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBvY2N1ciByZWdpb24uIHJldHVybiB0aGUKLQkJLy8gbGFzdCByZWdpb24KLQkJcmV0dXJuIGl0ZXIucHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAoZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpIHsKLQkJCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAobm9kZS5nZXRUeXBlKCkuZXF1YWxzKFBDREFUQSkpIHsKLQkJCQkJcmV0dXJuIE1JWEVEOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIENISUxEUkVOOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRDaGlsZE5vZGUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5vZGVUZXh0LCBpbnQgcG9zaXRpb24pIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBvc2l0aW9uIDwgY2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQlEVEROb2RlIHJlZmVyZW5jZSA9IChEVEROb2RlKSBjaGlsZHJlbltwb3NpdGlvbl07Ci0JCQlzdGFydE9mZnNldCA9IHJlZmVyZW5jZS5nZXRTdGFydE9mZnNldCgpOwotCQkJbmV3VGV4dCA9IG5vZGVUZXh0ICsgIiAiICsgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChwb3NpdGlvbiA9PSBjaGlsZHJlbi5sZW5ndGgpIHsKLQkJCS8vIGFkZCB0byBlbmQKLQkJCURURE5vZGUgcmVmZXJlbmNlID0gKERURE5vZGUpIGNoaWxkcmVuW3Bvc2l0aW9uIC0gMV07Ci0JCQlzdGFydE9mZnNldCA9IHJlZmVyZW5jZS5nZXRFbmRPZmZzZXQoKTsKLQkJCW5ld1RleHQgPSAiICIgKyBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyAiICIgKyBub2RlVGV4dDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgMCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0Q2hpbGROb2RlKFN0cmluZyBub2RlVGV4dCwgaW50IHBvc2l0aW9uKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fR1JQX05PREVfSU5TRVJUX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWluc2VydENoaWxkTm9kZSh0aGlzLCBub2RlVGV4dCwgcG9zaXRpb24pOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIENNTm9kZSByZWZlcmVuY2UsIENNTm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbm9kZS5nZXROb2RlVGV4dCgpOwotCQlMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5MaXN0KCk7Ci0KLQkJaW50IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihyZWZlcmVuY2UpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCS8vIG5vIHJlZmVyZW5jZSBub2RlLCBhZGQgaXQgdG8gdGhlIGVuZD8/Ci0JCQlpbmRleCA9IGNoaWxkcmVuLnNpemUoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGdvdCBhbiBpbmRleC4gaWYgd2Ugd2FudCB0byBhZGQgYWZ0ZXIsIGluY3JlYXNlIGJ5IDEKLQkJCWluZGV4ID0gaXNBZnRlciA/IGluZGV4ICsgMSA6IGluZGV4OwotCQl9Ci0JCWluc2VydENoaWxkTm9kZShyZXF1ZXN0b3IsIG5vZGVUZXh0LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCWludCBuZXN0aW5nID0gMDsKLQkJLy8gY2hpbGRyZW4uY2xlYXIoKTsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlEVEROb2RlIGN1cnJlbnRHcm91cE5vZGUgPSBudWxsOwotCQlDTUJhc2ljTm9kZSBjdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkvLyB3ZSBhc3N1bWUgdGhlIGZpcnN0IHJlZ2lvbiBpcyB0aGUgJygnCi0JCWl0ZXIubmV4dCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgbmVzdGluZyA+PSAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobmVzdGluZyA9PSAwKSB7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkpIHsKLQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IGN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbnVsbDsKLQkJCQkJRFRETm9kZSBwY0RhdGEgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJCXBjRGF0YS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCWFwcGVuZENoaWxkKHBjRGF0YSk7Ci0JCQkJCS8vIGNoaWxkcmVuLmFkZChwY0RhdGEpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQkJLy8gd2UgaGF2ZSBoaXQgYSBuZXcgcmVmZXJlbmNlIG5vZGUuIE1ha2Ugc3VyZSB3ZSByZXNldAotCQkJCQkvLyB0aGUgZ3JvdXBub2RlIHZhciBzbyBpdCBkb2Vzbid0IGNvbGxlY3QgbW9yZSByZWdpb25zCi0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBudWxsOwotCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZSA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQlhcHBlbmRDaGlsZChjdXJyZW50UmVmZXJlbmNlTm9kZSk7Ci0JCQkJCS8vIGNoaWxkcmVuLmFkZChjdXJyZW50UmVmZXJlbmNlTm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkvLyB3ZSBjb3VsZCBwb3RlbnRpYWxseSBmbGFnIGFuIGVycm9yIGhlcmUgaWYgd2UgaGl0IGFuCi0JCQkJCS8vIG9jY3VycmVuY2UgdHlwZSBhbmQgY3VycmVudFJlZk5vZGUgYW5kIGN1cnJlbnRHcm91cE5vZGUKLQkJCQkJLy8gYXJlIG51bGwKLQkJCQkJaWYgKGN1cnJlbnRSZWZlcmVuY2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGN1cnJlbnRSZWZlcmVuY2VOb2RlLnNldE9jY3VycmVuY2UoY3VycmVudFJlZ2lvbi5nZXRUZXh0KCkudG9DaGFyQXJyYXkoKVswXSk7Ci0JCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikpIHsKLQkJCQkJLy8gbm90ZSB0aGF0IGlmIGNvbm5lY3RvciBpcyBhbHJlYWR5IHNldCBhbmQgaXQgaXMKLQkJCQkJLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgY29ubmVjdG9yIHJlZ2lvbiwgdGhlbiB3ZQotCQkJCQkvLyBoYXZlIGFuIGVycm9yIQotCQkJCQkvLyBzZXRDb25uZWN0b3IoY3VycmVudFJlZ2lvbi5nZXRUZXh0KCkudG9DaGFyQXJyYXkoKVswXSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKSkgewotCQkJCQlpZiAoY3VycmVudEdyb3VwTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyB3ZSBoYXZlIGhpdCBhIG5ldyBncm91cC4gTWFrZSBzdXJlIHdlIHJlc2V0IHRoZQotCQkJCQkJLy8gcmVmZXJlbmNlbm9kZSB2YXIgc28gaXQgZG9lc24ndCBjb2xsZWN0IGFueSBtb3JlCi0JCQkJCQkvLyByZWdpb25zCi0JCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbmV3IENNR3JvdXBOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQkJYXBwZW5kQ2hpbGQoY3VycmVudEdyb3VwTm9kZSk7Ci0JCQkJCQkvLyBjaGlsZHJlbi5hZGQoY3VycmVudEdyb3VwTm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQluZXN0aW5nKys7Ci0JCQl9Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKSkgewotCQkJCW5lc3RpbmctLTsKLQkJCQlpZiAobmVzdGluZyA9PSAwICYmIGN1cnJlbnRHcm91cE5vZGUgIT0gbnVsbCkgewotCQkJCQljdXJyZW50R3JvdXBOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJLy8gcGVlayBhdCBuZXh0IHJlZ2lvbiB0byBzZWUgaWYgaXQgaXMgYW4gb2NjdXIgcmVnaW9uLiBpZgotCQkJCQkvLyBzbywgYWRkIGl0IHRvIHRoZSBncm91cG5vZGUKLQkJCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAobmV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpKSB7Ci0JCQkJCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24obmV4dFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBPdGhlcndpc2UsIHB1c2ggaXQgYmFjayBhcyB0aGUgbmV4dCBpdGVtIHRvIGJlCi0JCQkJCQkJLy8gcmV0cmlldmVkIGJ5IGEgZnV0dXJlIG5leHQoKSBjYWxsCi0JCQkJCQkJaXRlci5wcmV2aW91cygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjdXJyZW50R3JvdXBOb2RlICE9IG51bGwpIHsKLQkJCQljdXJyZW50R3JvdXBOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXN0aW5nIDwgMCkgewotCQkJLy8gVGhpcyBtZWFucyB3ZSBoYXZlIHBhc3NlZCBvdmVyIHRoZSByaWdodCBwYXJlbiB0aGF0IG1hcmtzIHRoZQotCQkJLy8gZW5kIG9mIG91ciBncm91cGluZy4KLQkJCS8vIExvb2sgZm9yIGFuIG9jY3VycmVuY2UgcmVnaW9uCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkvLyBzZXRPY2N1cnJlbmNlKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0JCX0KLQotCQkvLyBmb3IgKG9yZy53M2MuZG9tLk5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkCi0JCS8vID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLQkJLy8gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNoaWxkIGZvdW5kID0gIiArIGNoaWxkKTsKLQkJLy8gfQotCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZHJlbiBsZWdudGggPSAiICsgY2hpbGRyZW4ubGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJY3VycmVudE5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gY29ubmVjdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3RvcihjaGFyIHYpIHsKLQkJaWYgKGNvbm5lY3RvciAhPSB2KSB7Ci0JCQljb25uZWN0b3IgPSB2OwotCQkJLy8gd2FsayB0aHJvdWdoIG91ciBraWRzIGFuZCBzZWUgaWYgdGhlcmUgaXMgYSBjb25uZWN0b3IgYmV0d2VlbgotCQkJLy8gZWFjaCBzaWJsaW5nLiBpZiBub3QsIGNyZWF0ZSBvbmUgYW5kIHNldCB0aGUgY29ubmVjdG9yLiBpZgotCQkJLy8gdGhlcmUgaXMKLQkJCS8vIHRoZW4ganVzdCBjaGFuZ2UgdGhlIHRleHQgb2YgdGhlIGNvbm5lY3RvcgotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA8PSAxKSB7Ci0JCQkJLy8gdGhlcmUgd29uJ3QgYmUgYW55IGNvbm5lY3RvciBleGlzdGluZyBiZXR3ZWVuIHRoZSBjaGlsZHJlbgotCQkJCS8vIGp1c3Qgbm90aWZ5IGEgY2hhbmdlIGluIHRoZSBub2RlIGFuZCByZXR1cm47Ci0JCQkJZ2V0RFRERmlsZSgpLm5vdGlmeU5vZGVDaGFuZ2VkKHRoaXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fR1JQX05PREVfQ09OTkVDVE9SKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkQSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGNoaWxkQiA9IChEVEROb2RlKSBjaGlsZHJlbltpICsgMV07Ci0KLQkJCQkvLyBjcmVhdGUgYSBzdHJlYW0gYmV0d2VlbiB0aGUgdHdvIHNpYmxpbmdzIGFuZCB3YWxrIGl0Ci0JCQkJLy8gbm90ZSB0aGF0IHRoaXMgc3RyZWFtIGluY2x1ZGVzIHRoZSBsYXN0IHJlZ2lvbiBvZiB0aGUgZmlyc3QKLQkJCQkvLyBzaWJsaW5nIGFuZCB0aGUgZmlyc3QgcmVnaW9uIG9mIHRoZSBuZXh0IHNpYmxpbmcuCi0JCQkJLy8gYm90aCB0aGVzZSBzaG91bGQgYmUgaWdub3JlZAotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCksIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgY2hpbGRCLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCS8vIHNraXAgdGhlIGZpcnN0IHJlZ2lvbiB3aGljaCBpcyB0aGUgbGFzdCByZWdpb24gb2YgY2hpbGRBCi0KLQkJCQkvLyBkbyB3ZSBzdGlsbCBuZWVkIHRoaXMKLQkJCQkvLyBpdGVyLm5leHQoKTsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gbnVsbDsKLQkJCQlib29sZWFuIGZvdW5kQ29ubmVjdG9yID0gZmFsc2U7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIGN1cnJlbnRSZWdpb24gIT0gY2hpbGRCLmdldFN0YXJ0UmVnaW9uKCkpIHsKLQkJCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKSB7Ci0JCQkJCQlmb3VuZENvbm5lY3RvciA9IHRydWU7Ci0JCQkJCQkvLyBSZWdpb24gb2xkUmVnaW9uID0gY3VycmVudFJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQkvLyBmb3VuZCBhIGNvbm5lY3RvciEgb24gdG8gdGhlIG5leHQgc2libGluZyBwYWlyCi0JCQkJCQkvLyBjdXJyZW50UmVnaW9uLnVwZGF0ZVRleHQoU3RyaW5nLnZhbHVlT2YodikpOwotCQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIDEsIFN0cmluZy52YWx1ZU9mKGNvbm5lY3RvcikpOwotCQkJCQkJLy8gY2hhbmdlU3RydWN0dXJlZERvY3VtZW50KG9sZFJlZ2lvbiwgY3VycmVudFJlZ2lvbik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghZm91bmRDb25uZWN0b3IpIHsKLQkJCQkJLy8gaWYgd2UncmUgaGVyZSwgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGluc2VydCBhIG5ldwotCQkJCQkvLyBjb25uZWN0b3IgcmVnaW9uIGFmdGVyIGNoaWxkQQotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGNvbm5lY3RvcikpOwotCQkJCQkvLyBEVERSZWdpb24gY29ubmVjdG9yUmVnaW9uID0gbmV3Ci0JCQkJCS8vIERURFJlZ2lvbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IsCi0JCQkJCS8vIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgMSk7Ci0JCQkJCS8vIGluc2VydEludG9TdHJ1Y3R1cmVkRG9jdW1lbnQoY29ubmVjdG9yUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKQotCS8vIHsKLQkvLyByZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCS8vIH0KLX0vLyBDTUdyb3VwTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOTNjNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8vIGJhc2UgY2xhc3MgZm9yIGFuIEVsZW1lbnQncyBjb250ZW50bW9kZWwKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgZXh0ZW5kcyBEVEROb2RlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQU5ZOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTERSRU4gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfRU1QVFk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVhFRCA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9NSVhfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE7IC8vJE5PTi1OTFMtMSQKLQotCi0JYm9vbGVhbiByb290RWxlbWVudENvbnRlbnQ7Ci0KLQlwdWJsaWMgQ01Ob2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JLy8gdGhpcyBpcyBvbmx5IHZhbGlkIHRvIGFzayBpZiB0aGUgY29udGVudCBpcyBhIHJvb3QgZWxlbWVudCBjb250ZW50Ci0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4gVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgZWxlbWVudAotCSAqIGNvbnRlbnQncyBwYXJlbnQgaXMgYSBkaXJlY3QgZGVjZW5kZW50IG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIHJvb3RFbGVtZW50Q29udGVudDsKLQl9Ci0KLQkvLyBpZiB0aGlzIGlzIGEgcm9vdCBlbGVtZW50LCBjaGFuZ2UgdGhlIGNvbnRlbnQgdG8gY2hpbGRyZW4KLQkvLyBpZSAuIChjaGlsZDEpCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW5Db250ZW50KFN0cmluZyBuZXdDaGlsZCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKCFuZXdDaGlsZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCIgKyBuZXdDaGlsZCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhDSElMRFJFTikpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIobmV3Q2hpbGQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBtaXhlZCBjb250ZW50IHRvIHRoaXMgb25lLiBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSByZW1haW5pbmcgY2hpbGRyZW4KLQkJCQkJQ01Hcm91cE5vZGUgZ3JvdXAgPSAoQ01Hcm91cE5vZGUpIHRoaXM7Ci0JCQkJCUNNTm9kZSBmaXJzdENoaWxkID0gKENNTm9kZSkgZ3JvdXAuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAoZmlyc3RDaGlsZC5nZXRUeXBlKCkuZXF1YWxzKFBDREFUQSkpIHsKLQkJCQkJCWdyb3VwLmRlbGV0ZShmaXJzdENoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVQgKyAiICIgKyBjb250ZW50ICsgIiAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIGNvbnRlbnQpOwotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gaWYgdGhpcyBpcyBhIHJvb3QgZWxlbWVudCwgY2hhbmdlIHRoZSBjb250ZW50IHRvIG1peGVkCi0JLy8gaWUgLiAoI1BDREFUQSwgY2hpbGQxKQotCXB1YmxpYyB2b2lkIHNldE1peGVkQ29udGVudCgpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhNSVhFRCkpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh0aGlzIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCNQQ0RBVEEgfCBuZXdDaGlsZCkqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBjaGlsZHJlbiBjb250ZW50IHRvIHRoaXMgb25lLgotCQkJCQkvLyBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJZ3JvdXAuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJCWdyb3VwLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJCQlDTU5vZGUgZmlyc3RDaGlsZCA9IChDTU5vZGUpIGdyb3VwLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKCFmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuaW5zZXJ0Q2hpbGROb2RlKCIjUENEQVRBIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudENvbnRlbnQoYm9vbGVhbiB2KSB7Ci0JCXRoaXMucm9vdEVsZW1lbnRDb250ZW50ID0gdjsKLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBkZWxldGUoKQotCS8vIHsKLQkvLyBpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkvLyB7Ci0JLy8gLy8gdGhlbiB0aGUgc3VwZXJjbGFzc2VzIGRlbGV0ZSB3aWxsIGJlIGZpbmUKLQkvLyBzdXBlci5kZWxldGUoKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCi0JLy8gQ01Hcm91cE5vZGUgcGFyZW50ID0gKENNR3JvdXBOb2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JLy8gcGFyZW50LnJlbW92ZUNoaWxkTm9kZSh0aGlzKTsKLQkvLyB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljZTExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01SZXBlYXRhYmxlTm9kZSBleHRlbmRzIENNTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT05DRSA9ICcxJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT05FX09SX01PUkUgPSAnKyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QVElPTkFMID0gJz8nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBaRVJPX09SX01PUkUgPSAnKic7Ci0KLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlEVERDb3JlUGx1Z2luIHJlc291cmNlUGx1Z2luID0gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRUxFTUVOVFJFRklDT04pOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldE9jY3VycmVuY2UoKSB7Ci0JCUlUZXh0UmVnaW9uIG9jY3VyUmVnaW9uID0gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpOwotCQlpZiAob2NjdXJSZWdpb24gIT0gbnVsbCAmJiBvY2N1clJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQob2NjdXJSZWdpb24pLmNoYXJBdCgwKTsKLQkJfQotCQlyZXR1cm4gQ01SZXBlYXRhYmxlTm9kZS5PTkNFOwotCX0KLQotCS8vIHJldHVybnMgdGhlIG9jY3VycmVuY2VyZWdpb24sIG9yIHRoZSBsYXN0IHJlZ2lvbiB3aGVyZSB0aGUgb2NjdXJyZW5jZQotCS8vIHJlZ2lvbiBzaG91bGQgYXBwZWFyIGFmdGVyCi0JYWJzdHJhY3QgcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKTsKLQotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoY2hhciBvY2N1cnJlbmNlKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fUkVQX05PREVfQ0hHX09DQ1VSKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRPY2N1cnJlbmNlKHRoaXMsIG9jY3VycmVuY2UpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZShPYmplY3QgcmVxdWVzdG9yLCBjaGFyIG9jY3VycmVuY2UpIHsKLQkJaWYgKGdldE9jY3VycmVuY2UoKSAhPSBvY2N1cnJlbmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJaWYgKG9jY3VycmVuY2UgPT0gQ01SZXBlYXRhYmxlTm9kZS5PTkNFKSB7Ci0JCQkJCQkvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2NjdXIgcmVnaW9uIGZyb20gdGhlIGZsYXQKLQkJCQkJCS8vIG1vZGVsOwotCQkJCQkJZ2V0RFRERmlsZSgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgMSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBSZWdpb24gb2xkT2NjdXIgPSByZWdpb24uY3JlYXRlQ29weSgpOwotCQkJCQkJZ2V0RFRERmlsZSgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgMSwgU3RyaW5nLnZhbHVlT2Yob2NjdXJyZW5jZSkpOwotCQkJCQkJLy8gY2hhbmdlU3RydWN0dXJlZERvY3VtZW50KG9sZE9jY3VyLCByZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9jY3VycmVuY2UgIT0gQ01SZXBlYXRhYmxlTm9kZS5PTkNFKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRTdHJpbmcoKSk7Ci0JCQkJCS8vIHdlIG5lZWQgdG8gY3JlYXRlIGFuIG9jY3VycmVuY2VSZWdpb24KLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSwgMCwgU3RyaW5nLnZhbHVlT2Yob2NjdXJyZW5jZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfS8vIENNUmVwZWF0YWJsZU5vZGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ29tbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Db21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNWZmNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Db21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQlwdWJsaWMgY2xhc3MgU3RhcnRFbmRQYWlyIHsKLQkJcHVibGljIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCX0KLQotCXB1YmxpYyBDb21tZW50KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkNPTU1FTlRJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA8PSAzMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgMjkpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQoU3RhcnRFbmRQYWlyIHBhaXIpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIGNvbW1lbnRTdGFydFRhZyA9IGdldFN0YXJ0VGFnKGl0ZXIpOwotCQlJVGV4dFJlZ2lvbiBlbmRDb21tZW50VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7Ci0JCXBhaXIuZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChjb21tZW50U3RhcnRUYWcgIT0gbnVsbCkgewotCQkJcGFpci5zdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChjb21tZW50U3RhcnRUYWcpOwotCQl9Ci0JCWlmIChlbmRDb21tZW50VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZW5kQ29tbWVudFRhZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQlpbnQgZmxhdE5vZGVTdGFydCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCVN0YXJ0RW5kUGFpciBwYWlyID0gbmV3IFN0YXJ0RW5kUGFpcigpOwotCQlnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQocGFpcik7Ci0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyhwYWlyLnN0YXJ0T2Zmc2V0IC0gZmxhdE5vZGVTdGFydCwgcGFpci5lbmRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ09NTUVOVF9DSEcpOyAvLyROT04tTkxTLTEkCi0JCVN0YXJ0RW5kUGFpciBwYWlyID0gbmV3IFN0YXJ0RW5kUGFpcigpOwotCQlnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQocGFpcik7Ci0JCXJlcGxhY2VUZXh0KHRoaXMsIHBhaXIuc3RhcnRPZmZzZXQsIHBhaXIuZW5kT2Zmc2V0IC0gcGFpci5zdGFydE9mZnNldCwgbmV3VGV4dCk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTEyZjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBEVEQgQ29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURENvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTk9ORV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DSEFSQUNURVJfREFUQV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JREVOVElGSUVSX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lEX1JFRkVSRU5DRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JRF9SRUZFUkVOQ0VTX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVElUWV9OQU1FX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVElUWV9OQU1FU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FX1RPS0VOX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05BTUVfVE9LRU5TX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRU5VTV9OT1RBVElPTl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfVkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfS0lORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfTElTVF9BREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fR1JQX05PREVfSU5TRVJUX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9HUlA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9NSVhfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9DSElMRF9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX1NFVF9NSVhfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9TRVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfQU5ZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTU1FTlRfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9OT1RBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX05PREVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX0FERF9BVFRSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX0FERF9HUlA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlRfQUREX0NISUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX1BBUk1fRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX0dFTkVSQUxfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX0VYVF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX05EQVRBX0NIQU5HRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhUX05PREVfUFVCTElDX0lEX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0VMRU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9OT1RBVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9DT01NRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX09USEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NIR19FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ09NTUVOVF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RPUF9MRVZFTF9OT0RFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUlBBUlRfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERURENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiNTVjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRFREQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIERURENvcmVQbHVnaW4gaW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldERUREltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpY29uTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RFRESW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbih0aGlzSUQsIGljb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBEVERDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCi0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwgaWNvbk5hbWUpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YWMzZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBTdHJpbmdzIGZvciBEVERCYXNpY1R5cGVJbXBsIHR5cGUgZGVzY3JpcHRpb25zCi1fVUlfTk9ORV9ERVNDPU5vbmUKLQotISEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyB0ZXh0IGluIHBhcmVudGhlc2VzIG9uIGZvbGxvd2luZyAxMCBsaW5lcyBpLmUuKENEQVRBKQotX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M9Q2hhcmFjdGVyIERhdGEgKENEQVRBKQotX1VJX0lERU5USUZJRVJfREVTQz1JZGVudGlmaWVyIChJRCkKLV9VSV9JRF9SRUZFUkVOQ0VfREVTQz1JRCBSZWZlcmVuY2UgKElEUkVGKQotX1VJX0lEX1JFRkVSRU5DRVNfREVTQz1JRCBSZWZlcmVuY2VzIChJRFJFRlMpCi1fVUlfRU5USVRZX05BTUVfREVTQz1FbnRpdHkgTmFtZSAoRU5USVRZKQotX1VJX0VOVElUWV9OQU1FU19ERVNDPUVudGl0eSBOYW1lcyAoRU5USVRJRVMpCi1fVUlfTkFNRV9UT0tFTl9ERVNDPU5hbWUgVG9rZW4gKE5NVE9LRU4pCi1fVUlfTkFNRV9UT0tFTlNfREVTQz1OYW1lIFRva2VucyAoTk1UT0tFTlMpCi1fVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDPUVudW1lcmF0ZWQgTmFtZSBUb2tlbnMKLV9VSV9FTlVNX05PVEFUSU9OX0RFU0M9RW51bWVyYXRlZCBOT1RBVElPTgotCi0hIFN0cmluZ3MgZnJvbSBzZWQvbW9kZWwKLQotISBBdHRyaWJ1dGUuamF2YQotX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9WQUw9QXR0cmlidXRlIERlZmF1bHQgQ2hhbmdlIFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQ9Q2hhbmdlIEF0dHJpYnV0ZSBEZWZhdWx0IFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9UWVBFPUNoYW5nZSBBdHRyaWJ1dGUgVHlwZQotCi0hIEF0dHJpYnV0ZUVudW1MaXN0Ci1fVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TPUNoYW5nZSBBdHRyaWJ1dGUgRW51bWVyYXRpb24gVmFsdWUKLQotISBBdHRyaWJ1dGVMaXN0Ci1fVUlfTEFCRUxfQVRUUl9MSVNUX0FERD1BZGQgQXR0cmlidXRlCi0KLSEgQ01Hcm91cE5vZGUKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1I9Q2hhbmdlIENvbm5lY3RvcgotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UPUluc2VydCBFbGVtZW50Ci1fVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0dSUD1BZGQgR3JvdXAKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQ9QWRkIENoaWxkIEVsZW1lbnQKLQotISBDTU5vZGUKLV9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UPU1peGVkIENvbnRlbnQKLV9VSV9MQUJFTF9DTV9OT0RFX0NISUxEX0NPTlRFTlQ9Q2hpbGRyZW4gQ29udGVudAotX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UPVNldCBNaXhlZCBDb250ZW50Ci1fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVD1TZXQgQ2hpbGRyZW4gQ29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIlNldCA8dmFyaWFibGUgY29udGVudD4gQ29udGVudCIKLV9VSV9MQUJFTF9DTV9OT0RFX1NFVD1TZXQKLV9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQ9Q29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBETyBOT1QgVFJBTlNMQVRFIEZPTExPV0lORyAzIExJTkVTCi1fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE9KCNQQ0RBVEEpCi1fVUlfTEFCRUxfQ01fTk9ERV9BTlk9QU5ZCi1fVUlfTEFCRUxfQ01fTk9ERV9FTVBUWT1FTVBUWQotCi0hIENNUmVwZWF0YWJsZU5vZGUKLV9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVI9Q2hhbmdlIE9jY3VycmVuY2UKLQotISBDb21tZW50Ci1fVUlfTEFCRUxfQ09NTUVOVF9DSEc9Q29tbWVudCBDaGFuZ2UKLQotISBEVERGaWxlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQ9QWRkIEVsZW1lbnQKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZPUFkZCBFbnRpdHkKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfQ09NTUVOVD1BZGQgQ29tbWVudAotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUY9QWRkIFBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX05PVEFUSU9OPUFkZCBOb3RhdGlvbgotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9BVFRSX0xJU1Q9QWRkIEF0dHJpYnV0ZSBMaXN0Ci1fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFPURlbGV0ZQotCi0hIERURE5vZGUKLV9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRz1OYW1lIENoYW5nZQotX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURT1EZWxldGUKLQotISBFbGVtZW50Ci1fVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUj1BZGQgQXR0cmlidXRlCi1fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQPUFkZCBHcm91cAotX1VJX0xBQkVMX0VMRU1FTlRfQUREX0NISUxEPUFkZCBDaGlsZCBFbGVtZW50Ci0KLSEgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWT1TZXQgUGFyYW1ldGVyIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk9U2V0IEdlbmVyYWwgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZPVNldCBFeHRlcm5hbCBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk9U2V0IEludGVybmFsIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEc9RW50aXR5IFZhbHVlIENoYW5nZQotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIk5EQVRBIENoYW5nZSIKLV9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFPUNoYW5nZQotCi0hIEV4dGVybmFsTm9kZQotX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEc9UHVibGljIElEIENoYW5nZQotX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEc9U3lzdGVtIElEIENoYW5nZQotCi0hIE5vZGVMaXN0Ci1fVUlfTEFCRUxfTk9ERV9MSVNUX0VMRU1FTlRTPUVsZW1lbnRzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTPUVudGl0aWVzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX05PVEFUSU9OUz1Ob3RhdGlvbnMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM9Q29tbWVudHMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfT1RIRVI9T3RoZXIKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUz1BdHRyaWJ1dGVzCi0KLSEgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NIR19FTlRJVFlfUkVGPUNoYW5nZSBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHPUNvbW1lbnQgQ2hhbmdlCi0KLSEgVG9wTGV2ZWxOb2RlCi1fVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFPURlbGV0ZQotCi1fRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRSAgICAgICA9IEZhaWxlZCB0byBsb2FkIGluY2x1ZGVkIGZpbGUKLQotISB1c2FnZTogX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xICArIDxlbGVtZW50TmFtZT4gKyBfUEFSVEVSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8yCi1fRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEgICAgICAgICA9IFJlZmVyZW5jZSB0byB1bmRlY2xhcmVkIGVsZW1lbnQgJwotX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMiAgPScgaW4gY29udGVudCBtb2RlbC4KLQotISB1c2FnZTogX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgKyA8YXR0cmlidXRlTmFtZT4gKyBfUEFSVEVSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMgotX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgICAgICAgID0gRHVwbGljYXRlIElEIGF0dHJpYnV0ZSAnCi1fVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiAgPSAnLiBPbmx5IG9uZSBJRCBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCBwZXIgRUxFTUVOVCB0eXBlLgotCi0hIHVzYWdlOl9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xICsgPHR5cGVTdHJpbmc+ICsgX1BBUlRFUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yICsgPGF0dHJpYnV0ZU5hbWU+Ci1fRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMSAgICAgICAgID0gSW52YWxpZCBkZWZhdWx0Ci1fVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIgID0gIHZhbHVlIGZvciBhdHRyaWJ1dGUgJwotCi1fRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEICA9IE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RUREZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNmMDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERNb2RlbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotcHVibGljIGNsYXNzIERUREZpbGUgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uIHsKLQlwcml2YXRlIE5vZGVMaXN0IGF0dGxpc3RMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IGNvbW1lbnRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCi0JYm9vbGVhbiBjcmVhdGluZ05ld01vZGVsID0gZmFsc2U7Ci0JcHJpdmF0ZSBEVERNb2RlbEltcGwgZkRURE1vZGVsOwotCi0JcHJpdmF0ZSBOb2RlTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBOb2RlTGlzdCh0aGlzLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCBlbnRpdHlMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCi0JcHJpdmF0ZSBMaXN0IGZvbGRlckxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTW92aW5nTm9kZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaXN0IG1vZGVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTm9kZUxpc3Qgbm90YXRpb25MaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCB1bnJlY29nbml6ZWRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0KLQlwdWJsaWMgRFRERmlsZShEVERNb2RlbEltcGwgZHRkTW9kZWwpIHsKLQkJdGhpcy5mRFRETW9kZWwgPSBkdGRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREVERGaWxlTGlzdGVuZXIoSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQltb2RlbExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWFkZE5vZGUobm9kZUxpc3Quc2l6ZSgpLCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlKGludCBpbmRleCwgRFRETm9kZSBub2RlKSB7Ci0JCW5vZGVMaXN0LmFkZChpbmRleCwgbm9kZSk7Ci0JCS8qCi0JCSAqIGlmIChpbmRleCA8IG5vZGVMaXN0LnNpemUoKSkgeyBpbnNlcnRCZWZvcmUobm9kZSwgKERURE5vZGUpCi0JCSAqIG5vZGVMaXN0LmdldChpbmRleCkpOyB9IGVsc2UgeyBhcHBlbmRDaGlsZChub2RlKTsgfQotCQkgKi8KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBidWlsZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQkvLyBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJRFRETm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCS8vIHRoZW4gdGhpcyBpcyBhbiBlbGVtZW50Ci0JCQlub2RlID0gbmV3IEVsZW1lbnQodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzRW50aXR5KGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBFbnRpdHkodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24oZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IE5vdGF0aW9uKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IEF0dHJpYnV0ZUxpc3QodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzQ29tbWVudChmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgQ29tbWVudCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoIWZsYXROb2RlLmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlub2RlID0gbmV3IFVucmVjb2duaXplZCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaW5zZXJ0Tm9kZShub2RlKTsKLQkJCW5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBidWlsZE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGxpc3QpIHsKLQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQotCQlUb3BMZXZlbE5vZGUgcHJldmlvdXNOb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlUb3BMZXZlbE5vZGUgbm9kZSA9IChUb3BMZXZlbE5vZGUpIGJ1aWxkTm9kZShmbGF0Tm9kZSk7Ci0JCQkvLyBpZiB3ZSBkb24ndCBjcmVhdGUgYSBub2RlLCB0aGVuIHdlIGFzc3VtZSB0aGF0IHRoZSBmbGF0Ci0JCQkvLyBub2RlIHdhcyB3aGl0ZXNwYWNlLiBUYWNrIGl0IG9uIHRvIGEgcHJldmlvdXMgdG9wbGV2ZWwKLQkJCS8vIG5vZGUKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c05vZGUgPSBub2RlOwotCQkJCWFkZGVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHByZXZpb3VzTm9kZSAhPSBudWxsKSB7Ci0JCQkJCXByZXZpb3VzTm9kZS5hZGRXaGl0ZXNwYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApLy8gJiYKLQkJLy8gY3JlYXRpbmdOZXdNb2RlbCA9PSBmYWxzZSkKLQkJewotCQkJLy8gbm93IHRlbGwgcGVvcGxlIGFib3V0IHRoZSBhZGRpdGlvbnMKLQkJCW5vdGlmeU5vZGVzQWRkZWQoYWRkZWREVEROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQkvLyBJbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gdGVzdFBvc2l0aW9uICYmIHRlc3RQb3NpdGlvbiA8PSBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVMaXN0KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IUFUVExJU1QgIiArIG5hbWUgKyAiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29tbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhLS0gIiArIG5hbWUgKyAiIC0tPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRWxlbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRUxFTUVOVCAiICsgbmFtZSArICIgRU1QVFk+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFbnRpdHkoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRU5USVRZICIgKyBuYW1lICsgIiBcIlwiPlxuIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVOb3RhdGlvbihEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IU5PVEFUSU9OICIgKyBuYW1lICsgIiBTWVNURU0gXCJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSBuYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBub2RlKSB7Ci0JCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kZWxldGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghaXNNb3ZpbmdOb2RlKSB7Ci0JCQkJRFRETW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBuZXcgRFRETW9kZWxVcGRhdGVyKCk7Ci0JCQkJdXBkYXRlci5vYmplY3RBYm91dFRvQmVEZWxldGVkKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQkJRW50aXR5IHJlZmVyZW5jZWRFbnRpdHkgPSAoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbm9kZSkuZ2V0RW50aXR5T2JqZWN0KCk7Ci0JCQkJCWlmIChyZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGFsbCBlbGVtZW50cyBhbmQgcGFybSBlbnRpdGllcwotCQkJCQkJLy8gY29udGFpbmVkIGluIG91ciBjdXJyZW50IG1vZGVsCi0JCQkJCQlEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgcmVtb3ZlciA9IG5ldyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIoKTsKLQkJCQkJCXJlbW92ZXIuZXh0ZXJuYWxSZWZlcmVuY2VBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgcmVmZXJlbmNlZEVudGl0eSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKChOb3RhdGlvbikgbm9kZSk7Ci0JCQkJCURURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciByZW1vdmVyID0gbmV3IERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlcigpOwotCQkJCQlyZW1vdmVyLm5vdGF0aW9uQWJvdXRUb0JlRGVsZXRlZChyZXF1ZXN0b3IsIG5vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5vIHBhcmVudD8gdGhlbiBkZWxldGUgdXAgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG5vZGUKLQkJCS8vIGlmIGl0IGlzIGEgdG9wIGxldmVsIG5vZGUKLQkJCWludCBzdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmRPZmZzZXQgPSBub2RlLmdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIHRydWUpOwotCQkJfQotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldENvbW1lbnRzKCkgewotCQlyZXR1cm4gY29tbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIERURE1vZGVsSW1wbCBnZXREVERNb2RlbCgpIHsKLQkJcmV0dXJuIGZEVERNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHN0YXJ0ID0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCWludCBlbmQgPSBnZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChlbmQgPj0gMCkgewotCQkJCXJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotCQkJCWlmIChyZXN1bHQgPCAtMSkgewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdHlMaXN0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5EVERGSUxFSUNPTik7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0SW5zZXJ0T2Zmc2V0KERURE5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNBZnRlcikgewotCQkJCS8vIHRoZW4gZ2V0IHRoZSBuZXh0IG5vZGUgYW5kIHVzZSBpdCdzIHN0YXJ0IG9mZnNldAotCQkJCWludCBpbmRleCA9IGdldE5vZGVzKCkuaW5kZXhPZihnZXROb2RlKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpKTsKLQotCQkJCURURE5vZGUgYWZ0ZXJOb2RlID0gbnVsbDsKLQkJCQlpZiAoaW5kZXggKyAxIDwgZ2V0Tm9kZXMoKS5zaXplKCkpIHsKLQkJCQkJYWZ0ZXJOb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGluZGV4ICsgMSk7Ci0JCQkJfQotCQkJCWlmIChhZnRlck5vZGUgIT0gbnVsbCkgewotCQkJCQlvZmZzZXQgPSBhZnRlck5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFkZCB0byBlbmQKLQkJCQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhZGQgdG8gZW5kCi0JCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoIHBhdGggPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGgoZ2V0RFRETW9kZWwoKS5nZXRJZCgpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRUb3BMZXZlbE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJRFRETm9kZSBub2RlID0gZ2V0VG9wTGV2ZWxOb2RlQXQoc3RhcnRPZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlTGlzdHMoKSB7Ci0JCWlmIChmb2xkZXJMaXN0ID09IG51bGwpIHsKLQkJCWZvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChub3RhdGlvbkxpc3QpOwotCQkJZm9sZGVyTGlzdC5hZGQoZW50aXR5TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChlbGVtZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChhdHRsaXN0TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChjb21tZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZCh1bnJlY29nbml6ZWRMaXN0KTsKLQkJfQotCQlyZXR1cm4gZm9sZGVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXROb3RhdGlvbnMoKSB7Ci0JCXJldHVybiBub3RhdGlvbkxpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRFRETW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0VG9wTGV2ZWxOb2RlQXQoaW50IG9mZnNldCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuY29udGFpbnMob2Zmc2V0KSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRVbnJlY29nbml6ZWQoKSB7Ci0JCXJldHVybiB1bnJlY29nbml6ZWRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZSwgRFRETm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCW5vZGVUZXh0ID0gKChUb3BMZXZlbE5vZGUpIG5vZGUpLmdldEZ1bGxUZXh0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KHJlZmVyZW5jZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBub2RlVGV4dCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2RlKERURE5vZGUgbm9kZSkgewotCQlpbnQgc3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBpbnNlcnRJbmRleCA9IC0xOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0b2Zmc2V0ID0gIiArIHN0YXJ0T2Zmc2V0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXROb2RlcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50Tm9kZSBlbmRPZmZzZXQgPSAiCi0JCQkvLyArY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCi0JCQlpZiAoY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZW5kb2Zmc2V0ICIgKwotCQkJCS8vIGN1cnJlbnROb2RlLmdldEVuZE9mZnNldCgpICsgIiA+ICIgKyBzdGFydE9mZnNldCk7Ci0JCQkJaW5zZXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpbnNlcnRJbmRleCA9PSAtMSkgewotCQkJaW5zZXJ0SW5kZXggPSBnZXROb2RlcygpLnNpemUoKTsKLQkJfQotCi0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbnNlcnQgaW5kZXggPSAiICsgaW5zZXJ0SW5kZXgpOwotCi0JCWFkZE5vZGUoaW5zZXJ0SW5kZXgsIG5vZGUpOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMikgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNOb3RhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIGlzU2FtZVRvcExldmVsVHlwZShEVEROb2RlIGFmZmVjdGVkTm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gYWZmZWN0ZWROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpOwotCQkvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhdG5vZGUgc3RpbGwgbWF0Y2hlcyB3aGF0IHRoZSBhZmZlY3RlZE5vZGUKLQkJLy8gaXMgcmVwcmVzZW50aW5nCi0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgaXNFbnRpdHkoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQ29tbWVudCAmJiBpc0NvbW1lbnQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCAmJiBpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgTm90YXRpb24gJiYgaXNOb3RhdGlvbihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBVbnJlY29nbml6ZWQgJiYgaXNVbnJlY29nbml6ZWQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnJlY29nbml6ZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXR1cm4gIWlzRWxlbWVudChmbGF0Tm9kZSkgJiYgIWlzRW50aXR5KGZsYXROb2RlKSAmJiAhaXNOb3RhdGlvbihmbGF0Tm9kZSkgJiYgIWlzUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKGZsYXROb2RlKSAmJiAhaXNBdHRyaWJ1dGVMaXN0KGZsYXROb2RlKSAmJiAhaXNDb21tZW50KGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZU5vZGUsIERURE5vZGUgbm9kZVRvTW92ZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWlzTW92aW5nTm9kZSA9IHRydWU7Ci0KLQkJZGVsZXRlTm9kZShyZXF1ZXN0b3IsIG5vZGVUb01vdmUpOwotCQlpbnNlcnRJbnRvTW9kZWwocmVxdWVzdG9yLCByZWZlcmVuY2VOb2RlLCBub2RlVG9Nb3ZlLCBpc0FmdGVyKTsKLQkJaXNNb3ZpbmdOb2RlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQljcmVhdGluZ05ld01vZGVsID0gdHJ1ZTsKLQkJbm9kZUxpc3QuY2xlYXIoKTsKLQkJTm9kZXNFdmVudCByZW1vdmVFdmVudCA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCXJlbW92ZUV2ZW50LmdldE5vZGVzKCkuYWRkQWxsKG5vZGVMaXN0KTsKLQkJbm90aWZ5Tm9kZXNSZW1vdmVkKHJlbW92ZUV2ZW50KTsKLQkJLyogcmVtb3ZlQ2hpbGROb2RlcygpOyAqLwotCi0JCWlmIChldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSAhPSBudWxsKSB7Ci0JCQlidWlsZE5vZGVzKGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSk7Ci0JCX0KLQkJY3JlYXRpbmdOZXdNb2RlbCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMgPSBldmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCU5vZGVzRXZlbnQgcmVtb3ZlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gb2xkTm9kZXMuaXRlbShpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQkJcmVtb3ZlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlidWlsZE5vZGVzKGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSk7Ci0KLQkJaWYgKHJlbW92ZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCW5vdGlmeU5vZGVzUmVtb3ZlZChyZW1vdmVkRFRETm9kZXMpOwotCQkJcmVtb3ZlTm9kZXMocmVtb3ZlZERURE5vZGVzLmdldE5vZGVzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Tm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2RlQ2hhbmdlZChub2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeU5vZGVzQWRkZWQoTm9kZXNFdmVudCBhZGRlZE5vZGVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2Rlc0FkZGVkKGFkZGVkTm9kZXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Tm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVzUmVtb3ZlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkTm9kZXMoTGlzdCBub2RlcykgewotCQkvLyByZW1vdmUgdGhlIG9sZCBub2RlcwotCQlyZW1vdmVOb2Rlcyhub2Rlcyk7Ci0KLQkJLy8gbm93IHJlYnVpbGQgdGhlbQotCQlOb2Rlc0V2ZW50IGFkZGVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCQlJdGVyYXRvciBkdGROb2RlcyA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChkdGROb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgZHRkTm9kZSA9IChEVEROb2RlKSBkdGROb2Rlcy5uZXh0KCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYnVpbGRpbmcgIiArCi0JCQkvLyBkdGROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0KLQkJCURURE5vZGUgbm9kZSA9IGJ1aWxkTm9kZShkdGROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlhZGRlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCS8vIG5vdyB0ZWxsIHBlb3BsZSBhYm91dCB0aGUgYWRkaXRpb25zCi0JCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVRleHRSZWdpb24gY2hhbmdlZFJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gKERURE5vZGUpIGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChjaGFuZ2VkUmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KGNoYW5nZWRSZWdpb24pKTsKLQkJaWYgKGFmZmVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHJlc29sdmUgcmVnaW9ucyBhcyBpdCBpcyBqdXN0IGEgY2hhbmdlCi0JCQkvLyBhZmZlY3RlZE5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJCW5vdGlmeU5vZGVDaGFuZ2VkKGFmZmVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBub2Rlc1RvUmVidWlsZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlEVEROb2RlIGFmZmVjdGVkTm9kZSA9IGdldE5vZGUoZmxhdE5vZGUpOwotCi0JCWlmICghaXNTYW1lVG9wTGV2ZWxUeXBlKGFmZmVjdGVkTm9kZSkpIHsKLQkJCS8vIEJ1ZyAxMTExMDAgLSBGaXJlIG9mZiBhIG5vZGUgcmVtb3ZhbCBldmVudAotCQkJLy8gdG8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIHRyZWUgdmlld2VyCi0JCQlOb2Rlc0V2ZW50IHJlbW92ZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlyZW1vdmVkRFRETm9kZXMuYWRkKGFmZmVjdGVkTm9kZSk7Ci0JCQlub3RpZnlOb2Rlc1JlbW92ZWQocmVtb3ZlZERURE5vZGVzKTsKLQkJCW5vZGVzVG9SZWJ1aWxkLmFkZChhZmZlY3RlZE5vZGUpOwotCQkJcmVidWlsZE5vZGVzKG5vZGVzVG9SZWJ1aWxkKTsKLQkJfQotCQllbHNlIHsKLQkJCWFmZmVjdGVkTm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQkJbm90aWZ5Tm9kZUNoYW5nZWQoYWZmZWN0ZWROb2RlKTsKLQkJCS8vIG5vdyB0cnkgYW5kIGRldGVybWluZSB3aGljaCBvbmVzIHdlcmUgYWRkZWQKLQkJCU5vZGVzRXZlbnQgYWRkZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IGV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJCWludCBzaXplID0gbmV3UmVnaW9ucy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KGkpOwotCQkJCURURE5vZGUgZGVlcGVzdE5vZGUgPSBhZmZlY3RlZE5vZGUuZ2V0RGVlcGVzdE5vZGUoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpOwotCQkJCS8vIEJ1ZyAxMTExMDAgLSBXZSBkbyBub3QgbmVlZCB0byBmaXJlIGEgbm9kZSBhZGRlZCBldmVudAotCQkJCS8vIGZvciB0aGUgYWZmZWN0ZWROb2RlIGJlY2F1c2UgdGhhdCBpcyBhbHJlYWR5IGhhbmRsZWQgYnkKLQkJCQkvLyB0aGUgbm9kZSBjaGFuZ2VkIGV2ZW50IGFib3ZlCi0JCQkJaWYgKGRlZXBlc3ROb2RlICE9IGFmZmVjdGVkTm9kZSAmJiAhYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLmNvbnRhaW5zKGRlZXBlc3ROb2RlKSkgewotCQkJCQlhZGRlZERURE5vZGVzLmFkZChkZWVwZXN0Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZGVkRFRETm9kZXMuZ2V0Tm9kZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbm90aWZ5Tm9kZXNBZGRlZChhZGRlZERURE5vZGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURUREZpbGVMaXN0ZW5lcihJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW1vZGVsTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm9kZXMoTGlzdCBub2RlcykgewotCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0JCS8qCi0JCSAqIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJICogcmVtb3ZlQ2hpbGQoKERURE5vZGUpbm9kZXMuZ2V0KGkpKTsgfSAvLyBlbmQgb2YgZm9yICgpCi0JCSAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRETm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTAzN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVEROb2RlIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24gewotCi0JLy8gdGhlc2UgYXJlIGNoYXJhY3Rlcm9mZnNldHMKLQlwcm90ZWN0ZWQgRFRERmlsZSBkdGRGaWxlOwotCi0JLy8gZmxhdCBub2RlIHRoYXQgY29udGFpbnMgdGhpcyBub2RlCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0KLQlwcm90ZWN0ZWQgVGV4dFJlZ2lvbkxpc3RJbXBsIHJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dFJlZ2lvbkxpc3RJbXBsIHdoaXRlc3BhY2UgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQlwdWJsaWMgRFRETm9kZShEVERGaWxlIGR0ZEZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLyoKLQkJICogaWYgKHN0YXJ0UmVnaW9uID09IG51bGwpIHsgc3RhcnRSZWdpb24gPSByZWdpb247IH0gZW5kUmVnaW9uID0KLQkJICogcmVnaW9uOwotCQkgKi8KLQkJcmVnaW9ucy5hZGQocmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRXaGl0ZXNwYWNlUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl3aGl0ZXNwYWNlLmFkZChyZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBsYWJlbCkgewotCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zUmFuZ2UodGVzdFBvc2l0aW9uLCB0ZXN0UG9zaXRpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpIDw9IHN0YXJ0ICYmIGVuZCA8PSBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoRFRETm9kZSBjaGlsZCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlKHRoaXMsIGNoaWxkKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIGNoaWxkKSB7Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSwgY2hpbGQuZ2V0RnVsbE5vZGVMZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0b3IpIHsKLQkJZ2V0RFRERmlsZSgpLmdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHJlcXVlc3Rvcik7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW5MaXN0KCkudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuTGlzdCgpIHsKLQkJTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0RGVlcGVzdE5vZGUoaW50IG9mZnNldCkgewotCQlpZiAoY29udGFpbnMob2Zmc2V0KSkgewotCQkJLy8gbm93IHNlZSBpZiBhIGNoaWxkIGNvbnRhaW5zIHRoaXMgb2Zmc2V0Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZCA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGRlZXBlc3QgPSBjaGlsZC5nZXREZWVwZXN0Tm9kZShvZmZzZXQpOwotCQkJCWlmIChkZWVwZXN0ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlZXBlc3Q7Ci0JCQkJfQotCQkJfSAvLyBlbmQgb2YgZm9yICgpCi0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXREZWVwZXN0Tm9kZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKGNvbnRhaW5zUmFuZ2Uoc3RhcnQsIGVuZCkpIHsKLQkJCS8vIG5vdyBzZWUgaWYgYSBjaGlsZCBjb250YWlucyB0aGlzIG9mZnNldAotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCURURE5vZGUgY2hpbGQgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQkJRFRETm9kZSBkZWVwZXN0ID0gY2hpbGQuZ2V0RGVlcGVzdE5vZGUoc3RhcnQsIGVuZCk7Ci0JCQkJaWYgKGRlZXBlc3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVlcGVzdDsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGdldEVuZFJlZ2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RW5kUmVnaW9uKCkgewotCQlyZXR1cm4gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsvLyBlbmRSZWdpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCURURE1vZGVsSW1wbCBtb2RlbCA9IGR0ZEZpbGUuZ2V0RFRETW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RnVsbE5vZGVMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRXaGl0ZXNwYWNlRW5kT2Zmc2V0KCkgLSBnZXRTdGFydE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5vZGVUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IGdldE5vZGVUZXh0KCk7Ci0JCWlmICh3aGl0ZXNwYWNlLnNpemUoKSA+IDApIHsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBuZXcgUmVnaW9uSXRlcmF0b3Iod2hpdGVzcGFjZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQl0ZXh0ICs9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBmaXJzdCB0b2tlbiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgdG9rZW4gdHlwZQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROZXh0UmVnaW9uKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIsIFN0cmluZyB0eXBlKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Tm9kZUxlbmd0aCgpIHsKLQkJcmV0dXJuIGdldEVuZE9mZnNldCgpIC0gZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVRleHQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCXNiLmFwcGVuZChnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbikpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChnZXRTdGFydFJlZ2lvbigpKTsKLQl9Ci0KLQkvLyBwcml2YXRlIFJlZ2lvbiBzdGFydFJlZ2lvbixlbmRSZWdpb247Ci0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0UmVnaW9uKCkgewotCQlyZXR1cm4gcmVnaW9ucy5nZXQoMCk7Ci0JCS8vIHJldHVybiBzdGFydFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGZsYXROb2RlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZmxhdE5vZGUuCi0JICogCi0JICogSVNTVUU6bmFtZWQgY2hhbmdlZCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQKLQkgKiBzdXBlciBjbGFzcyBtZXRob2QsIGJ1dCBzaG91bGQgcmUtdGhpbmsgaWYgdGhpcyBpcyBjb3JyZWN0IHRlY2huaXF1ZS4KLQkgKiBQZXJoYXBzIGdldEZpcnN0UmVnaW9uPwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8vIHJldHVybiBlbmQgb2Zmc2V0IGluY2x1ZGluZyB3aGl0ZXNwYWNlCi0JLy8gb3IganVzdCB0aGUgZW5kIG9mZnNldCBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlCi0JcHVibGljIGludCBnZXRXaGl0ZXNwYWNlRW5kT2Zmc2V0KCkgewotCQlpZiAod2hpdGVzcGFjZS5zaXplKCkgPiAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB3aGl0ZXNwYWNlLmdldCh3aGl0ZXNwYWNlLnNpemUoKSAtIDEpOwotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuIGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpIHsKLQkJcmV0dXJuIHdoaXRlc3BhY2Uuc2l6ZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIHJlZ2lvbiBpdGVyICIgKyB0aGlzLmdldENsYXNzKCkgKyAiIHdpdGgKLQkJLy8gc3RhcnQgLCBlbmQgPSAiICsgZ2V0U3RhcnRPZmZzZXQoKSArICIsICIgK2dldEVuZE9mZnNldCgpKTsKLQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcihyZWdpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdG9yLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIFN0cmluZyBuZXdUZXh0KSB7Ci0JCWdldERUREZpbGUoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0LCBsZW5ndGgsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCFnZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJCS8vIG5hbWVUb2tlbi51cGRhdGVUZXh0KG5hbWUpOwotCQkJCWdldERUREZpbGUoKS5nZXREVERNb2RlbCgpLmdldFJlZmVyZW5jZVVwZGF0ZXIoKS5uYW1lQWJvdXRUb0NoYW5nZShyZXF1ZXN0b3IsIHRoaXMsIG5hbWUpOwotCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIG5hbWVSZWdpb24uZ2V0TGVuZ3RoKCksIG5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9OT0RFX05BTUVfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlzZXROYW1lKHRoaXMsIG5hbWUpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGZsYXROb2RlLiBJU1NVRTpuYW1lZCBjaGFuZ2VkIG5vdCB0byBiZQotCSAqICAgICAgICAgICAgY29uZnVzZWQgd2l0aCBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgc3VwZXIgY2xhc3MgbWV0aG9kLAotCSAqICAgICAgICAgICAgYnV0IHNob3VsZCByZS10aGluayBpZiB0aGlzIGlzIGNvcnJlY3QgdGVjaG5pcXVlCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB2KSB7Ci0JCXRoaXMuZmxhdE5vZGUgPSB2OwotCX0KLQotCS8vIHNraXBzIHBhc3QgbmV4dCBuYW1lIHRva2VuIGluIHRoZSBpdGVyYXRvcgotCXByb3RlY3RlZCB2b2lkIHNraXBQYXN0TmFtZShSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKGphdmEubGFuZy5TdHJpbmcgZmVhdHVyZSwgamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkMjQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIERURFJlc291cmNlIHsKLQkvLyBFbnVtZXJhdGlvbiBDb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvYW55LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVMSVNUSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5USUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRERklMRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5USUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRSRUZJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZUkVGRVJFTkNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfQVRUTElTVCA9ICJpY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9DT01NID0gImljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0VMID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9OT1QgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9VTlJFQyA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXSFRNTEZPUk0gPSAiaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05JQ09OID0gImljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTFNFUVVFTkNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOUkVDT0dOSVpFRElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUNIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MDRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JTGlzdCBhdHRMaXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBDTU5vZGUgZkNvbnRlbnRNb2RlbDsKLQotCXB1YmxpYyBFbGVtZW50KERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRfQUREX0FUVFIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpOwotCQlpZiAoYXR0TGlzdHMuc2l6ZSgpID09IDApIHsKLQkJCWdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHRoaXMsIGdldE5hbWUoKSwgdHJ1ZSk7Ci0JCQlhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCk7Ci0JCX0KLQkJaWYgKGF0dExpc3RzLnNpemUoKSA+IDApIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5nZXQoYXR0TGlzdHMuc2l6ZSgpIC0gMSk7Ci0JCQlhdHRMaXN0LmFkZEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbnRlbnQodGhpcywgIiBFTVBUWSIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBjb250ZW50KSB7Ci0JCUlUZXh0UmVnaW9uIHdoaXRlc3BhY2UgPSBnZXRXaGl0ZXNwYWNlQWZ0ZXJOYW1lKCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlpZiAod2hpdGVzcGFjZSAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHdoaXRlc3BhY2UpOwotCQkJbGVuZ3RoID0gd2hpdGVzcGFjZS5nZXRMZW5ndGgoKSA+PSAyID8gMSA6IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGVsZW1lbnRUYWcpOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGxlbmd0aCwgY29udGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkR3JvdXAoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRDb250ZW50KHRoaXMsICIgKCkiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnQoZHRkRmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3RzKCkgewotCQlhdHRMaXN0TGlzdC5jbGVhcigpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXROYW1lKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkdGRGaWxlLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QgJiYgbm9kZS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWF0dExpc3RMaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0TGlzdExpc3Q7Ci0JfQotCi0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0Q29udGVudE1vZGVsKCkgewotCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCkKLQkJcmV0dXJuIChDTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsvLyBjb250ZW50TW9kZWw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSB7Ci0JCWF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJSXRlcmF0b3IgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhdHRMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5uZXh0KCk7Ci0KLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gYXR0TGlzdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWF0dHJpYnV0ZXMuYWRkKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRUxFTUVOVElDT04pOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5vZGUuRUxFTUVOVF9OT0RFOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VDb250ZW50TW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQ01Ob2RlIG5vZGUpIHsKLQkJcmVwbGFjZUNvbnRlbnRNb2RlbChyZXF1ZXN0b3IsIG5vZGUuZ2V0Tm9kZVRleHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZUNvbnRlbnRNb2RlbChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbm9kZVRleHQpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlDTU5vZGUgY29udGVudE1vZGVsID0gZ2V0Q29udGVudE1vZGVsKCk7Ci0JCWlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gY29udGVudE1vZGVsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBjb250ZW50TW9kZWwuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIGxlbmd0aCwgbm9kZVRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkQ29udGVudChyZXF1ZXN0b3IsIG5vZGVUZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnQgbm9kZSBzdHJlYW0gPSAiICsKLQkJLy8gdG9rZW5TdHJlYW0uZ2V0U3RyaW5nKCkpOwotCQlmQ29udGVudE1vZGVsID0gbnVsbDsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmIChmQ29udGVudE1vZGVsID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01Hcm91cE5vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZkNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5EX1RBRykpIHsKLQkJCQkJLy8gY29udGVudCBtb2RlbCBnZXRzIGFsbCByZWdpb25zIGV4Y2VwdCBmb3IgdGhlICc+JwotCQkJCQlmQ29udGVudE1vZGVsLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGlmIGl0IGlzIGVxdWFsIHRvIHRoZSBlbmQgdGFnLCB0aGVuIGRvbid0IGFkZCBhbnltb3JlCi0JCQkJCS8vIHJlZ2lvbnMKLQkJCQkJLy8gZm9yIHRoZSBjb250ZW50IG1vZGVsCi0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCi0JCX0KLQkJaWYgKGZDb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJYXBwZW5kQ2hpbGQoZkNvbnRlbnRNb2RlbCk7Ci0JCQkvLyB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQgY29udGVudCBzbyBzZXQgaXQgdHJ1ZQotCQkJZkNvbnRlbnRNb2RlbC5zZXRSb290RWxlbWVudENvbnRlbnQodHJ1ZSk7Ci0JCQkvLyBub3cgdGVsbCB0aGUgY29udGVudCBtb2RlbCB0byByZXNvbHZlIGl0J3MgcmVnaW9ucwotCQkJZkNvbnRlbnRNb2RlbC5yZXNvbHZlUmVnaW9ucygpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWwoQ01Ob2RlIGNvbnRlbnRNb2RlbCkgewotCQl0aGlzLmZDb250ZW50TW9kZWwgPSBjb250ZW50TW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDJmNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gZXh0ZXJuYWwgbm9kZSBjb250YWlucyBjb2RlIHRvIGhlbHAgc2V0IGFuZCBnZXQgcHVibGljIGlkcwotcHVibGljIGNsYXNzIEVudGl0eSBleHRlbmRzIEV4dGVybmFsTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0RXh0ZXJuYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfRVhUX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRHZW5lcmFsRW50aXR5ID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfU0VUX0dFTkVSQUxfRU5USVRZOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldEludGVybmFsRW50aXR5ID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRQYXJhbWV0ZXJFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfUEFSTV9FTlRJVFk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBFbnRpdHkoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRU5USVRZSUNPTik7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIG5vdGF0aW9uTmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIG5vdGF0aW9uTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJSVRleHRSZWdpb24gbmRhdGFSZWdpb24gPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJaWYgKG5kYXRhUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KG5kYXRhUmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UGVyY2VudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCWlmICghaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXJhdG9yKCkpOwotCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKHZhbHVlUmVnaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGV4dGVybmFsRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZXh0ZXJuYWxFbnRpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbEVudGl0eSgpIHsKLQkJcmV0dXJuIGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgIT0gbnVsbCB8fCBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBpc1BhcmFtZXRlckVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UGVyY2VudFJlZ2lvbigpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5EYXRhKE9iamVjdCByZXF1ZXN0b3IpIHsKLQkJSVRleHRSZWdpb24gbmRhdGFSZWdpb24gPSBudWxsOwotCi0JCS8vIHNlZSBpZiB3ZSBoYXZlIGFuIE5EQVRBIGtleXdvcmQKLQkJbmRhdGFSZWdpb24gPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSAwLCBlbmRPZmZzZXQgPSAwOwotCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuZGF0YVJlZ2lvbik7Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmRhdGFSZWdpb24pOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHZhbHVlID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAoc3RhcnRPZmZzZXQgPT0gMCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQodmFsdWUpOwotCQkJfQotCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHZhbHVlKTsKLQkJfQotCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBleHRlcm5hbEVudGl0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGV4dGVybmFsRW50aXR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsRW50aXR5KGJvb2xlYW4gaXNFeHRlcm5hbEVudGl0eSkgewotCQlpZiAoaXNFeHRlcm5hbEVudGl0eSgpICE9IGlzRXh0ZXJuYWxFbnRpdHkpIHsKLQkJCS8vIGV4dGVybmFsRW50aXR5ID0gdjsKLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIGlzRXh0ZXJuYWxFbnRpdHkgPyBzZXRFeHRlcm5hbEVudGl0eSA6IHNldEludGVybmFsRW50aXR5KTsKLQkJCWlmIChpc0V4dGVybmFsRW50aXR5KSB7Ci0JCQkJLy8gd2UgbmVlZCB0byBnZXQgcmlkIG9mIHRoZSB2YWx1ZSBsaXRlcmFsCi0JCQkJSVRleHRSZWdpb24gcXVvdGUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsKLQkJCQlpZiAocXVvdGUgPT0gbnVsbCkgewotCQkJCQlxdW90ZSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOwotCQkJCX0KLQkJCQlpZiAocXVvdGUgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChxdW90ZSksIHF1b3RlLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGV4dCBiZXR3ZWVuIGVuZCBvZiBuYW1lIHJlZ2lvbiBhbmQKLQkJCQkvLyB0aGUgbGFzdCBkb3VibGUgcXVvdGVkIGxpdGVyYWwKLQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQlJVGV4dFJlZ2lvbiBrZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyKTsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCWludCBsZW5ndGggPSAwOwotCQkJCWlmIChrZXl3b3JkID09IG51bGwpIHsKLQkJCQkJLy8gcmVzZXQgdGhlIGl0ZXJhdG9yCi0JCQkJCWl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlrZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyKTsKLQkJCQl9Ci0JCQkJaWYgKGtleXdvcmQgIT0gbnVsbCkgewotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGtleXdvcmQpOwotCQkJCQkvLyBzdGFydCB3aXRoIGEgbGVuZ3RoIGp1c3QgZXF1YWwgdG8gdGhlIGtleXdvcmQgZm9yIG5vdwotCQkJCQlsZW5ndGggPSBrZXl3b3JkLmdldExlbmd0aCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gcmVzZXQgdGhlIGl0ZXJhdG9yIHNpbmNlIHdlIGRpZG4ndCBmaW5kIHRoZSBrZXl3b3JkCi0JCQkJCWl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQkvLyBqdXN0IGdvIGZyb20gYWZ0ZXIgdGhlIG5hbWUKLQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZ2V0TmFtZVJlZ2lvbigpKTsKLQkJCQl9Ci0KLQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBzdGFydCwgbG9vayBmb3IgdGhlIGVuZAotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBudWxsOwotCi0JCQkJaWYgKGxhc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyB0aGVuIGxvb2sgZm9yIGxhc3QgcXVvdGVkIGxpdGVyYWwKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiBsaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQkJCQlpZiAobGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkJbGFzdFJlZ2lvbiA9IGxpdGVyYWw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobGFzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWxlbmd0aCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChsYXN0UmVnaW9uKSAtIHN0YXJ0T2Zmc2V0OwotCQkJCX0KLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBzdGFydE9mZnNldCwgbGVuZ3RoLCAiXCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVtb3ZlTkRhdGEodGhpcyk7Ci0JCQl9Ci0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCWlmICghZ2V0Tm90YXRpb25OYW1lKCkuZXF1YWxzKG5ld05vdGF0aW9uKSkgewotCQkJaWYgKCFuZXdOb3RhdGlvbi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAKLQkJCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOwotCQkJCWlmIChuZGF0YVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQobmRhdGFSZWdpb24pLCBuZGF0YVJlZ2lvbi5nZXRMZW5ndGgoKSwgbmV3Tm90YXRpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGltZSB0byBjcmVhdGUgb25lCi0JCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJSVRleHRSZWdpb24gbmRhdGFLZXl3b3JkID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JEKTsKLQkJCQkJaWYgKG5kYXRhS2V5d29yZCA9PSBudWxsKSB7Ci0JCQkJCQkvLyB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBvbmUgYWZ0ZXIgdGhlIGxhc3QgcXVvdGVkCi0JCQkJCQkvLyBsaXRlcmFsCi0JCQkJCQkvLyBSZXNldCBpdGVyYXRvcgotCQkJCQkJc3RyaW5nICs9ICIgTkRBVEEgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCQlJVGV4dFJlZ2lvbiBsYXN0UXVvdGVkTGl0ZXJhbCA9IG51bGw7Ci0JCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBsaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQkJCQkJaWYgKGxpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCQlsYXN0UXVvdGVkTGl0ZXJhbCA9IGxpdGVyYWw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGxhc3RRdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChsYXN0UXVvdGVkTGl0ZXJhbCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjcmVhdGVkIGFmdGVyIHRoZSBzeXN0ZW0gb3IgcHVibGljIGtleXdvcmQKLQkJCQkJCQlJVGV4dFJlZ2lvbiBrZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCQkJCQlpZiAoa2V5d29yZCA9PSBudWxsKSB7Ci0JCQkJCQkJCWtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyB3ZSBzaG91bGRuJ3QgYmUgbnVsbCBoZXJlIHNpbmNlIHdlIGNoZWNrIGlmIHdlCi0JCQkJCQkJLy8gd2VyZSBleHRlcm5hbCBhbHJlYWR5Ci0JCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoa2V5d29yZCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5kYXRhS2V5d29yZCk7Ci0JCQkJCX0KLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgMCwgc3RyaW5nICsgbmV3Tm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIHRoZSBuZGF0YSBzdHVmZgotCQkJCXJlbW92ZU5EYXRhKHJlcXVlc3Rvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIG5vdGF0aW9uTmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm90YXRpb24KLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBub3RhdGlvbk5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKFN0cmluZyBuZXdOb3RhdGlvbikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCAiTkRBVEEgIiArIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX05EQVRBX0NIQU5HRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXROb3RhdGlvbk5hbWUodGhpcywgbmV3Tm90YXRpb24pOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBpc1BhcmFtZXRlckVudGl0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIHYpIHsKLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5KCkgIT0gdikgewotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgdiA/IHNldFBhcmFtZXRlckVudGl0eSA6IHNldEdlbmVyYWxFbnRpdHkpOwotCQkJaWYgKHYpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQlJVGV4dFJlZ2lvbiBzdGFydFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMCwgbGVuZ3RoID0gMDsKLQotCQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5XSElURVNQQUNFICYmIHJlZ2lvbi5nZXRMZW5ndGgoKSA+IDEpIHsKLQkJCQkJCWxlbmd0aCA9IDE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHN0YXJ0VGFnKTsKLQkJCQl9Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgc3RhcnRPZmZzZXQsIGxlbmd0aCwgIiAlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBub3cgZ2V0IHJpZCBvZiBhbnkgTkRhdGEgc2luY2UgaXQgaXMgb25seSBhbGxvd2VkIGlmIHRoZQotCQkJCS8vIGVudGl0eSBpcyBhIGdlbmVyYWwgZW50aXR5IGFuZCBub3QgYSBwYXJhbWV0ZXIgZW50aXR5Ci0JCQkJcmVtb3ZlTkRhdGEodGhpcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBnZXQgcmlkIG9mIHBlcmNlbnQgcmVnaW9uCi0JCQkJSVRleHRSZWdpb24gcGVyY2VudFJlZ2lvbiA9IGdldFBlcmNlbnRSZWdpb24oKTsKLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwZXJjZW50UmVnaW9uKSwgcGVyY2VudFJlZ2lvbi5nZXRMZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdikgewotCQlpZiAoIWlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJaWYgKCFnZXRWYWx1ZSgpLmVxdWFscyh2KSkgewotCQkJCS8vIHRoZW4gaXQgbWFrZXMgc2Vuc2UgdG8gY2hhbmdlIHRoZSB2YWx1ZQotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCQkJU3RyaW5nIHF1b3RlQ2hhciA9IHYuaW5kZXhPZigiXCIiKSA9PSAtMSA/ICJcIiIgOiAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbiksIHZhbHVlUmVnaW9uLmdldExlbmd0aCgpLCBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5BTUUpOwotCQkJCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQkJCS8vIGNyZWF0ZSBpdCBhZnRlciB0aGUgcGVyY2VudCBpZiB0aGVyZSBpcyBvbmUKLQkJCQkJCXJlZ2lvbiA9IGdldFBlcmNlbnRSZWdpb24oKTsKLQkJCQkJfQotCQkJCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQkJCS8vIGlmIHN0aWxsIG51bGwsIHRoZW4gY3JlYXRlIGl0IGFmdGVyIHRoZSBlbGVtZW50IHRhZwotCQkJCQkJcmVnaW9uID0gZ2V0U3RhcnRUYWcoaXRlcmF0b3IoKSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldFZhbHVlKHRoaXMsIHYpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0V4dGVybmFsTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FeHRlcm5hbE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmNzA5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0V4dGVybmFsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGJhc2UgY2xhc3MgZm9yIG5vZGVzIHRoYXQgY2FuIGNvbnRhaW4gZXh0ZXJuYWwgY29udGVudAotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVybmFsTm9kZSBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCVN0cmluZyBwdWJsaWNJRDsKLQotCVN0cmluZyBzeXN0ZW1JRDsKLQotCXB1YmxpYyBFeHRlcm5hbE5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdGFnVHlwZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgdGFnVHlwZSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRRdW90ZWRMaXRlcmFsKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgcHVibGljSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJRCgpIHsKLQkJSVRleHRSZWdpb24gcHVibGljVmFsdWUgPSBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpOwotCQlpZiAocHVibGljVmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihwdWJsaWNWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFB1YmxpY0tleXdvcmRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFB1YmxpY1ZhbHVlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyKTsKLQotCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHF1b3RlZExpdGVyYWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSUQoKSB7Ci0JCUlUZXh0UmVnaW9uIHN5c3RlbVZhbHVlID0gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKTsKLQkJaWYgKHN5c3RlbVZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24oc3lzdGVtVmFsdWUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJSVRleHRSZWdpb24gc3lzdGVtS2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcik7Ci0JCWlmIChzeXN0ZW1LZXl3b3JkICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcXVvdGVkTGl0ZXJhbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgc2Vjb25kIHF1b3RlZCBsaXRlcmFsIGFmdGVyIGEgcHVibGljCi0JCQkvLyBrZXl3b3JkCi0JCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHB1YmxpY0tleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCi0JCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJLy8gbm93IGdldCB0aGUgc2Vjb25kIHF1b3RlZCBsaXRlcmFsCi0JCQkJCXF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJLy8gZ290IGl0IQotCQkJCQkJcmV0dXJuIHF1b3RlZExpdGVyYWw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUuZXF1YWxzKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKSB8fCB0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcHVibGljSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHYpIHsKLQkJaWYgKCF2LmVxdWFscyhwdWJsaWNJRCkpIHsKLQkJCXB1YmxpY0lEID0gdjsKLQkJCUlUZXh0UmVnaW9uIHB1YmxpY1ZhbHVlID0gZ2V0UHVibGljVmFsdWVSZWdpb24oKTsKLQkJCUlUZXh0UmVnaW9uIHB1YmxpY0tleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJSVRleHRSZWdpb24gc3lzdGVtS2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0KLQkJCWlmICh2LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJLy8gdGltZSB0byBnZXQgcmlkIG9mIHRoZSBwdWJsaWMga2V5d29yZCBhbmQgdmFsdWUKLQkJCQkJLy8gYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgc3lzdGVtIG9uZQotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwdWJsaWNLZXl3b3JkKTsKLQkJCQkJU3RyaW5nIG5ld1N0cmluZyA9ICJTWVNURU0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChzeXN0ZW1WYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQluZXdTdHJpbmcgKz0gIiBcIlwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChwdWJsaWNWYWx1ZSkgLSBzdGFydE9mZnNldCwgbmV3U3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBoZXJlIHdlcmUgc2V0dGluZyBhIG5vbiBlbXB0eSB2YWx1ZQotCQkJCVN0cmluZyBxdW90ZUNoYXIgPSB2LmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWlmIChwdWJsaWNWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHVibGljVmFsdWUpLCBwdWJsaWNWYWx1ZS5nZXRMZW5ndGgoKSwgcXVvdGVDaGFyICsgcHVibGljSUQgKyBxdW90ZUNoYXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGltZSB0byBjcmVhdGUgc3R1ZmYKLQkJCQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCkgewotCQkJCQkJLy8gdGhlbiBqdXN0IHB1dCBvdXIgbmV3IHZhbHVlIGFmdGVyIHRoZSBrZXl3b3JkCi0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChwdWJsaWNLZXl3b3JkKSwgMCwgIiAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHdlIG5lZWQgdGhlIHB1YmxpYyBrZXl3b3JkIGFzIHdlbGwKLQkJCQkJCWlmIChzeXN0ZW1LZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHN5c3RlbUtleXdvcmQpLCBzeXN0ZW1LZXl3b3JkLmdldExlbmd0aCgpLCAiUFVCTElDICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuYW1lUmVnaW9uKSwgMCwgIiBQVUJMSUMgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgcHVibGljSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBwdWJsaWNJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgdikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldFB1YmxpY0lEKHRoaXMsIHYpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghdi5lcXVhbHMoc3lzdGVtSUQpIHx8IChnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpID09IG51bGwgJiYgZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSA9PSBudWxsKSkgewotCQkJc3lzdGVtSUQgPSB2OwotCQkJU3RyaW5nIHF1b3RlQ2hhciA9IHYuaW5kZXhPZigiXCIiKSA9PSAtMSA/ICJcIiIgOiAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0JCQlpZiAoc3lzdGVtVmFsdWUgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoc3lzdGVtVmFsdWUpLCBzeXN0ZW1WYWx1ZS5nZXRMZW5ndGgoKSwgcXVvdGVDaGFyICsgc3lzdGVtSUQgKyBxdW90ZUNoYXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb24gc3lzdGVtS2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0KLQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBzdHVmZgotCQkJCWlmIChzeXN0ZW1LZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJLy8gdGhlbiBqdXN0IHB1dCBvdXIgbmV3IHZhbHVlIGFmdGVyIHRoZSBrZXl3b3JkCi0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHN5c3RlbUtleXdvcmQpLCAwLCAiICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc2VlIGlmIHdlIGhhdmUgYSBwdWJsaWMga2V5d29yZAotCQkJCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCQkJaWYgKHB1YmxpY0tleXdvcmQgPT0gbnVsbCkgewotCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICIgU1lTVEVNICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcHV0IGl0IGFmdGVyIHRoZSBwdWJsaWMgdmFsdWUgcmVnaW9uCi0JCQkJCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZVJlZ2lvbiA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChwdWJsaWNWYWx1ZVJlZ2lvbiksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3lzdGVtSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRfTk9ERV9TWVNURU1fSURfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRTeXN0ZW1JRCh0aGlzLCB2KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzNiYWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMzBjZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9OYW1lZFRvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGludGVyZmFjZSBmb3Igbm9kZXMgdGhhdCBjYW4gZXhpc3QgYXQgdGhlIHRvcCBsZXZlbCBpbiBhIGR0ZGZpbGUKLS8vIGVnLiBlbnRpdHksIG5vdGF0aW9uLCBlbGVtZW50LCBjb21tZW50LCBhdHRsaXN0LCBvciB1bnJlY29nbml6ZWQgc3R1ZmYgKGllCi0vLyA8anVuayBka2ZqZGw+Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWRUb3BMZXZlbE5vZGUgZXh0ZW5kcyBUb3BMZXZlbE5vZGUgewotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnU3RhcnRUeXBlOwotCi0JcHVibGljIE5hbWVkVG9wTGV2ZWxOb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIoZHRkRmlsZSwgZmxhdE5vZGUpOwotCQl0YWdTdGFydFR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQkvLyBuYW1lIHJlZ2lvbiBpcyBsb2NhdGVkIGFmdGVyIHRoZSB3aGl0ZXNwYWNlICh3aGljaCBpcyBhZnRlcgotCQkvLyB0aGUgZWxlbWVudHRhZwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJZ2V0TmV4dFJlZ2lvbihpdGVyLCB0YWdTdGFydFR5cGUpOwotCi0JCWlmICghaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCWlmICghcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0KLQkJLy8gd2Ugbm9ybWFsbHkgc3RvcCBoZXJlLCBidXQgZm9yIGVudGl0aWVzLCB3ZSBoYXZlIHRvIHNlZSBpZiB3ZSBhcmUKLQkJLy8gYXQgYSAnJScuIGlmIHNvLCB3ZSBza2lwIHRoYXQgYW5kIGZpbmQgdGhlIG5hbWUgYWZ0ZXIgdGhlCi0JCS8vIHdoaXRlc3BhY2UgYWdhaW4KLQkJaWYgKHRhZ1N0YXJ0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHICYmIHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZWdpb24gPSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKCFyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTdGFydFRhZyhSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFdoaXRlc3BhY2VBZnRlck5hbWUoKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkvLyBza2lwIHBhc3QgdGhlIGVsZW1lbnQgdGFnIHJlZ2lvbgotCQlnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0JCWJvb2xlYW4gZm91bmROYW1lID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWZvdW5kTmFtZSAmJiBuYW1lUmVnaW9uICE9IG51bGwgJiYgcmVnaW9uID09IG5hbWVSZWdpb24pIHsKLQkJCQlmb3VuZE5hbWUgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSkpIHsKLQkJCQkvLyB0aGVyZSBpcyBubyBuYW1lIHJlZ2lvbiBvciB3ZSBoYXZlIGFscmVhZHkgcGFzc2VkIGl0Ci0JCQkJaWYgKG5hbWVSZWdpb24gPT0gbnVsbCB8fCBmb3VuZE5hbWUpIHsKLQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdXBlci5zZXROYW1lKHJlcXVlc3RvciwgbmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIGVsZW1lbnRUYWdSZWdpb24gPSBnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0JCQlpbnQgcmVwbGFjZUxlbmd0aCA9IDA7Ci0JCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSkpIHsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRMZW5ndGgoKSA+PSAyKSB7Ci0JCQkJCQkvLyB0aGVyZSBhcmUgMiBzcGFjZXMgYmV0d2VlbiAnRUxFTUVOVCcgYW5kIHRoZQotCQkJCQkJLy8gY29udGVudAotCQkJCQkJLy8gQ2hhbmdlIHJlcGxhY2UgbGVuZ3RoIHRvIDEgc28gdGhhdCB0aGUgbmV3IG5hbWUgYW5kCi0JCQkJCQkvLyB0aGUgY29udGVudCBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNwYWNlCi0JCQkJCQlyZXBsYWNlTGVuZ3RoID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYmVnaW5SZWNvcmRpbmcocmVxdWVzdG9yLCAiTmFtZSBDaGFuZ2UiKTsKLQkJCVN0cmluZyBuZXdUZXh0ID0gIiAiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZWxlbWVudFRhZ1JlZ2lvbiksIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCQkJLy8gZW5kUmVjb3JkaW5nKHJlcXVlc3Rvcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm9kZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4NDEyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotCi0KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdCB7Ci0JcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQotCUFycmF5TGlzdCBsaXN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpc3RUeXBlOwotCi0JcHVibGljIE5vZGVMaXN0KERUREZpbGUgZHRkRmlsZSwgU3RyaW5nIHRva2VuVHlwZSkgewotCQlsaXN0VHlwZSA9IHRva2VuVHlwZTsKLQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0VMKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfRU5UKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9OT1QpOwotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9DT01NKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0FUVExJU1QpOwotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX1VOUkVDKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RUeXBlKCkgewotCQlyZXR1cm4gbGlzdFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9FTEVNRU5UUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9FTlRJVElFUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX05PVEFUSU9OUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9DT01NRU5UUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCkgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX09USEVSOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXROb2RlcygpIHsKLQkJbGlzdE5vZGVzLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkdGRGaWxlLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcgJiYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpKSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgJiYgbm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcgJiYgbm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQgJiYgbm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UICYmIG5vZGUgaW5zdGFuY2VvZiBVbnJlY29nbml6ZWQpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0Tm9kZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWExYWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgTm90YXRpb24gZXh0ZW5kcyBFeHRlcm5hbE5vZGUgewotCi0JcHVibGljIE5vdGF0aW9uKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuTk9UQVRJT05JQ09OKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1MWEwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQotCi0JcHVibGljIGNsYXNzIFN0YXJ0RW5kUGFpciB7Ci0JCXB1YmxpYyBpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eSBjYWNoZWRFbnRpdHkgPSBudWxsOwotCi0JcHVibGljIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCX0KLQotCXB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5T2JqZWN0KCkgewotCQlpZiAoY2FjaGVkRW50aXR5ICE9IG51bGwgJiYgIWNhY2hlZEVudGl0eS5nZXROYW1lKCkuZXF1YWxzKGdldFJlZmVyZW5jZWRFbnRpdHkoKSkpIHsKLQkJCS8vIGlmIHdlIGhhdmUgYSBjYWNoZWQgZW50aXR5LCBidXQgdGhlIG5hbWUgZG9lc250IG1hdGNoLAotCQkJLy8gbnVsbCBpdCBub3csIHNvIHdlIHBlcmZvcm0gYSBsb29rdXAKLQkJCWNhY2hlZEVudGl0eSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoY2FjaGVkRW50aXR5ID09IG51bGwpIHsKLQkJCUxpc3Qgbm9kZXMgPSBnZXREVERGaWxlKCkuZ2V0Tm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBub2RlOwotCQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5LmdldE5hbWUoKS5lcXVhbHMoZ2V0UmVmZXJlbmNlZEVudGl0eSgpKSkgewotCQkJCQkJY2FjaGVkRW50aXR5ID0gZW50aXR5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYWNoZWRFbnRpdHk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkVOVElUWVJFRkVSRU5DRUlDT04pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0TmFtZSgpOwotCQlyZXR1cm4gZ2V0TmFtZSgpLnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChTdGFydEVuZFBhaXIgcGFpcikgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gY29tbWVudFN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcoaXRlcik7Ci0JCUlUZXh0UmVnaW9uIGVuZENvbW1lbnRUYWcgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsKLQkJcGFpci5lbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGNvbW1lbnRTdGFydFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLnN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGNvbW1lbnRTdGFydFRhZyk7Ci0JCX0KLQkJaWYgKGVuZENvbW1lbnRUYWcgIT0gbnVsbCkgewotCQkJcGFpci5lbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZW5kQ29tbWVudFRhZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQlpbnQgZmxhdE5vZGVTdGFydCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCVN0YXJ0RW5kUGFpciBwYWlyID0gbmV3IFN0YXJ0RW5kUGFpcigpOwotCQlnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQocGFpcik7Ci0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyhwYWlyLnN0YXJ0T2Zmc2V0IC0gZmxhdE5vZGVTdGFydCwgcGFpci5lbmRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkRW50aXR5KE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0TGVuZ3RoKCksICIlIiArIG5hbWUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NIR19FTlRJVFlfUkVGKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRSZWZlcmVuY2VkRW50aXR5KHRoaXMsIG5hbWUpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX1BBUk1fRU5USVRZX1JFRl9DT01NRU5UX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmVwbGFjZVRleHQodGhpcywgcGFpci5zdGFydE9mZnNldCwgcGFpci5lbmRPZmZzZXQgLSBwYWlyLnN0YXJ0T2Zmc2V0LCBuZXdUZXh0KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ub3BMZXZlbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVG9wTGV2ZWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjJjOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ub3BMZXZlbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGludGVyZmFjZSBmb3Igbm9kZXMgdGhhdCBjYW4gZXhpc3QgYXQgdGhlIHRvcCBsZXZlbCBpbiBhIGR0ZGZpbGUKLS8vIGVnLiBlbnRpdHksIG5vdGF0aW9uLCBlbGVtZW50LCBjb21tZW50LCBhdHRsaXN0LCBvciB1bnJlY29nbml6ZWQgc3R1ZmYgKGllCi0vLyA8anVuayBka2ZqZGw+Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9wTGV2ZWxOb2RlIGV4dGVuZHMgRFRETm9kZSB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmbGF0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgVG9wTGV2ZWxOb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JCWZsYXROb2Rlcy5hZGQoZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdoaXRlc3BhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWZsYXROb2Rlcy5hZGQobm9kZSk7Ci0JfQotCi0JLy8gc3BlY2lhbGl6ZSB0aGlzIHNvIHdlIGRlbGV0ZSB0aGUgb2JqZWN0cyBmbGF0IG5vZGUgcmFuZ2UKLQkvLyBBTkQgYW55IHdoaXRlc3BhY2UKLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKGdldERUREZpbGUoKSwgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZmxhdE5vZGVzLmdldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGZsYXROb2Rlcy5nZXQoZmxhdE5vZGVzLnNpemUoKSAtIDEpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBmaXJzdC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kT2Zmc2V0ID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQotCQlyZXBsYWNlVGV4dChnZXREVERGaWxlKCksIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyhnZXREVERGaWxlKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFbmRSZWdpb24oKSB7Ci0JCWludCBzaXplID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaWYgKHNpemUgPiAwKSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldChzaXplIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gaW5jbHVkZXMgd2hhdCBnZXR0ZXh0IGdpdmVzIHVzIHBsdXMgYW55IHdoaXRlc3BhY2UKLQkvLyB0cmFpbGluZyBpdAotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGZsYXROb2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZk5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgaXRlci5uZXh0KCk7Ci0JCQlzYi5hcHBlbmQoZk5vZGUuZ2V0VGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3RhcnRSZWdpb24oKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSByZWdpb24gaXRlciAiICsgdGhpcy5nZXRDbGFzcygpICsgIiB3aXRoCi0JCS8vIHN0YXJ0ICwgZW5kID0gIiArIGdldFN0YXJ0T2Zmc2V0KCkgKyAiLCAiICtnZXRFbmRPZmZzZXQoKSk7Ci0JCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGdldFN0YXJ0T2Zmc2V0KCksIGdldEVuZE9mZnNldCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1VucmVjb2duaXplZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NGI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1VucmVjb2duaXplZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgVW5yZWNvZ25pemVkIGV4dGVuZHMgVG9wTGV2ZWxOb2RlIHsKLQotCXB1YmxpYyBVbnJlY29nbml6ZWQoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuVU5SRUNPR05JWkVESUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gMzApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDI5KSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ29udGVudERlc2NyaWJlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmFkOTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci0KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckRURCBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8vIHNhbWUgcnVsZXMgYXMgZm9yIFhNTAotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQlpZiAocmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgPSBuZXcgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGdldERldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLyB9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RURE1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5ZWI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RURE1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LkRURE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFJlZmVyZW5jZVVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuTGFiZWxWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERNb2RlbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgRFRETW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJLy8gY3JlYXRlIHRoZSB0ZW1wIEZpbGUgb2JqZWN0Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQlyZXN1bHQgPSBmaWxlLmRlbGV0ZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRFRERmlsZSBkb2N1bWVudDsKLQotCS8vIHByaXZhdGUgTGlzdCBlcnJvck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gZW50aXR5IHJlZmVyZW5jZSBuYW1lcyBmb3VuZCBpbiB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zCi0JcHJpdmF0ZSBWZWN0b3IgaWdub3JlZEVudGl0eVJlZnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgRFREUmVmZXJlbmNlVXBkYXRlciByZWZVcGRhdGVyID0gbmV3IERURFJlZmVyZW5jZVVwZGF0ZXIoKTsKLQotCXB1YmxpYyBEVERNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRvY3VtZW50ID0gbmV3IERUREZpbGUodGhpcyk7Ci0JCWRvY3VtZW50LmFkZERUREZpbGVMaXN0ZW5lcihuZXcgSURUREZpbGVMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCQlzZXRSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCQkJY2hlY2tJZkV4dGVybmFsUmVmZXJlbmNlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCk7Ci0JCS8vIGNsZWFyIHJlZmVyZW5jZSB1cGRhdGVyIGNhY2hlCi0JCWdldFJlZmVyZW5jZVVwZGF0ZXIoKS5jbGVhckNhY2hlKCk7Ci0JfQotCi0Jdm9pZCBjaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbm9kZTsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCXNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGhlbHBzIGRldGVybWluZSB0aGUgbGlzdCBvZiB0aGluZ3MgdGhhdAotCS8vIGNhbiBiZSB1c2VkIGluIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UgY29udGVudAotCS8vIE9wdGlvbmFsIHBhcmFtZXRlciBpcyB0byBhbGxvdyB0aGUgY3VycmVudGx5IHVzZWQgRFRERW50aXR5IHRvCi0JLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbWJvYm94LgotCS8vCi0JcHVibGljIExhYmVsVmFsdWVQYWlyW10gY3JlYXRlUGFybUVudGl0eUNvbnRlbnRJdGVtcyhFbnRpdHkgZW50aXR5KSB7Ci0JCU5vZGVMaXN0IGVudGl0aWVzID0gZ2V0RFRERmlsZSgpLmdldEVudGl0aWVzKCk7Ci0KLQkJVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotCi0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSAiJSIgKyBlbnRpdHkuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWl0ZW1zLmFkZEVsZW1lbnQobmV3IExhYmVsVmFsdWVQYWlyKG5hbWUsIG5hbWUpKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGVudGl0aWVzLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRpdHkgZW50aXR5QXQgPSAoRW50aXR5KSBpLm5leHQoKTsKLQkJCWlmIChlbnRpdHlBdC5pc1BhcmFtZXRlckVudGl0eSgpICYmIGVudGl0eUF0LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCVN0cmluZyBuYW1lID0gIiUiICsgZW50aXR5QXQuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpdGVtcy5hZGRFbGVtZW50KG5ldyBMYWJlbFZhbHVlUGFpcihuYW1lLCBuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJTGFiZWxWYWx1ZVBhaXJbXSBjb21ib0FycmF5ID0gbmV3IExhYmVsVmFsdWVQYWlyW2l0ZW1zLnNpemUoKV07Ci0JCWl0ZW1zLmNvcHlJbnRvKGNvbWJvQXJyYXkpOwotCQlyZXR1cm4gY29tYm9BcnJheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQlzdXBlci5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQkJLy8gY2xlYXIgcmVmZXJlbmNlIHVwZGF0ZXIgY2FjaGUKLQkJZ2V0UmVmZXJlbmNlVXBkYXRlcigpLmNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvLyBSZXR1cm5zIGVudGl0eSByZWZlcmVuY2UgbmFtZXMgdGhhdCBhcmUgaW4KLQkvLyB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zLgotCXB1YmxpYyBWZWN0b3IgZ2V0SWdub3JlZEVudGl0eVJlZnMoKSB7Ci0JCWlmIChpZ25vcmVkRW50aXR5UmVmcyA9PSBudWxsKQotCQkJaWdub3JlZEVudGl0eVJlZnMgPSBuZXcgVmVjdG9yKCk7Ci0JCXJldHVybiBpZ25vcmVkRW50aXR5UmVmczsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGUgYXQgIiArIG9mZnNldCArICIgcmV0dXJuaW5nID0gIiArCi0JCS8vIHRoaXMuZG9jdW1lbnQuZ2V0Tm9kZUF0KG9mZnNldCkpOwotCi0JCXJldHVybiB0aGlzLmRvY3VtZW50LmdldE5vZGVBdChvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBEVERSZWZlcmVuY2VVcGRhdGVyIGdldFJlZmVyZW5jZVVwZGF0ZXIoKSB7Ci0JCXJldHVybiByZWZVcGRhdGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQlkb2N1bWVudC5uZXdNb2RlbChmbGF0TW9kZWxFdmVudCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5uZXdtb2RlbCIpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5vY2hhbmdlIik7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5ub2Rlc3JlcGxhY2VkIik7Ci0JCWRvY3VtZW50Lm5vZGVzUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50IHNvdXJjZSA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJuZXcgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRPcmlnaW5hbENoYW5nZXMoKSArIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGVkIFN0cmluZyA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0RGVsZXRlZFRleHQoKSArIiciKTsKLQkJLy8gRW51bWVyYXRpb24gZSA9Ci0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldE5vZGVzKCkuZWxlbWVudHMoKTsKLQkJLy8gaW50IGkgPSAwOwotCQkvLyBmb3IgKDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotCQkvLyB7Ci0JCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPQotCQkvLyAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJLy8gb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5vZGUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiAiICsgaSArIi4gIiArIG5vZGUuaGFzaENvZGUoKSArICIgJyIKLQkJLy8gK25vZGUuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gfQotCX0KLQotCXB1YmxpYyB2b2lkIG91dHB1dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCS8vIGludCBzaXplID0gZmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkvLyB7Ci0JCS8vIFJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oaSArICIuICIgKyByZWdpb24uZ2V0VHlwZSgpKTsKLQotCQkvLyB9IC8vIGVuZCBvZiBmb3IgKCkKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5yZWdpb24gY2hhbmdlZCIpOwotCQlkb2N1bWVudC5yZWdpb25DaGFuZ2VkKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lvbiBjaGFuZ2VkICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKS5oYXNoQ29kZSgpICsgIiA9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKSk7Ci0KLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbnJlZ2lvbiByZXBsYWNlZCIpOwotCQlkb2N1bWVudC5yZWdpb25zUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCkgewotCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hSZXF1aXJlZChib29sZWFuIHZhbHVlKSB7Ci0JCXJlZnJlc2hSZXF1aXJlZCA9IHZhbHVlOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N0cnVjdHVyZWREb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXJldHVybjsgLy8gbm90aW5nIHRvIGRvCi0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQluZXdNb2RlbChuZXcgTmV3RG9jdW1lbnRFdmVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoaXMpKTsKLQkJCX0KLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTM3ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLy8gdG8gZW5zdXJlIGNvbnNpc3Qgb3ZlcmFsbCBydWxlcyB1c2VkLCB3ZSdsbCBtYXJrIGFzCi0JLy8gZmluYWwsCi0JLy8gYW5kIHJlcXVpcmUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGNlcnRhaW4gcGllY2VzIG9mCi0JLy8gdGhlCi0JLy8gaW1wbGVtZW50YXRpb24KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRvIHJldHVybiBhIGRlZmF1bHQgZW5jb2RpbmcgLS0gYXMgc3BlY2lmaWVkIGJ5IGFuIGluZHVzdHJ5Ci0JICogY29udGVudCB0eXBlIHNwZWMgLS0gd2hlbiBub3QgcHJlc2VudCBpbiB0aGUgc3RyZWFtLCBmb3IgZXhhbXBsZSwgWE1MCi0JICogc3BlY2lmaWVzIFVURi04LCBKU1Agc3BlY2lmaWVzIElTTy04ODU5LTEuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KLQkgKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggInNwZWMgZGVmYXVsdCIuCi0JICovCi0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3BlY0RlZmF1bHQoKSB7Ci0JCVN0cmluZyBlbmNvZGluZ05hbWU7Ci0JCWVuY29kaW5nTmFtZSA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXZlcnkgc3ViY2xhc3MgbXVzdCBwcm92aWRlIGEgd2F5IHRvIHBhcnNlIHRoZSBpbnB1dC4gVGhpcyBtZXRob2QgaGFzCi0JICogc2V2ZXJhbCBjcml0aWNhbCByZXNwb25zaWJpbGl0aWVzOgotCSAqIDxsaT5zZXQgdGhlIGZFbmNvZGluZ01lbWVudG8gZmllbGQgYXBwcm9wcmlhdGVseSwgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHJlc3VsdHMgb2YgdGhlIHBhcnNlIG9mIGZSZWFkZXIuPC9saT4KLQkgKiA8bGk+c2V0IGZIYXJkZXJQYXJzZWQgdG8gdHJ1ZSwgdG8gYXZvaWQgd2FzdGVkIHJlLXBhcnNpbmcuPC9saT4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTUwYTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgewotCQl0aGlzLmZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiB0aGlzLmZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSB0aGlzLmZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCh0aGlzLmZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSB0aGlzLmZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWU5ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gMjgtQXVnLTAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIEBhdXRob3Iga2JvbwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yLnNldChmUmVhZGVyKTsKLQkJZkVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKWRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmIyYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LkRURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVEREb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCi0JcHVibGljIERURERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBEVERSZWdpb25QYXJzZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgcmVQYXJzZXIgPSBuZXcgRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQkJcmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KGRvY3VtZW50KTsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5zZXRSZVBhcnNlcihyZVBhcnNlcik7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2QwMWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9JRFRERmlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjlmYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9JRFRERmlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEVERGaWxlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKTsKLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCk7Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L05vZGVzRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk3NGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE5vZGVzRXZlbnQgewotCXByaXZhdGUgQXJyYXlMaXN0IGNoYW5nZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyB2b2lkIGFkZChEVEROb2RlIGNoYW5nZWROb2RlKSB7Ci0JCWNoYW5nZWROb2Rlcy5hZGQoY2hhbmdlZE5vZGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vZGVzKCkgewotCQlyZXR1cm4gY2hhbmdlZE5vZGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRFRETW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0RURE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjMxZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRFRETW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCXB1YmxpYyBEVERNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IERURERvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBEVERNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3IERURE1vZGVsSW1wbCgpOwotCQkvLyBub3cgZG9uZSBpbiBjcmVhdGUKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJLy8gbW9kZWwuc2V0RmFjdG9yeVJlZ2lzdHJ5KGRlZmF1bHRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTdhNTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbEhhbmRsZXJGb3JEVEQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJZCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJZCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgRFRETW9kZWxMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMThiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBEVERSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIElUZXh0UmVnaW9uIGNyZWF0ZVJlZ2lvbihTdHJpbmcgdG9rZW5LaW5kLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRva2VuS2luZCAhPSBudWxsKSB7Ci0JCQkvLyBJU1NVRTogRFREIHJlZ2lvbnMgZG9uJ3QgZGlzdGluZ3Vpc2ggdGV4dCBmcm9tIHdoaXRlIHNwYWNlCi0JCQlyZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbih0b2tlbktpbmQsIHN0YXJ0LCBsZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1M2VhNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LkRURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplci5EVERUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplci5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFREUmVnaW9uUGFyc2VyIGltcGxlbWVudHMgUmVnaW9uUGFyc2VyIHsKLQlwcml2YXRlIFZlY3RvciBjYWNoZWRSZWdpb25zID0gbnVsbDsKLQlwcml2YXRlIERURFRva2VuaXplciB0b2tlbml6ZXIgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjYWNoZWROb2RlID0gbnVsbDsgLy8gdG9wIG9mIG5vZGUKLQkJCQkJCQkJCQkJCQkJCS8vIGNoYWluCi0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IERURFJlZ2lvblBhcnNlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZGROZXdOb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlLCBWZWN0b3IgcmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxlYWRpbmdTcGFjZU5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0cmFpbGluZ1NwYWNlTm9kZSA9IG51bGw7Ci0JCUxpbmtlZExpc3Qgbm9kZVNlZWRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJaW50IG5SZWdpb25zID0gcmVnaW9ucy5zaXplKCk7Ci0JCWludCBsZWFkaW5nU3BhY2VFbmQgPSAtMTsKLQkJaW50IHRyYWlsaW5nU3BhY2VCZWdpbiA9IG5SZWdpb25zOwotCi0JCS8vIGZpbmQgbGVhZGluZyBzcGFjZQotCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVnaW9uczsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzQmxhbmtSZWdpb24odHlwZSkpIHsKLQkJCQlsZWFkaW5nU3BhY2VFbmQgPSBpOwotCQkJCW5vZGVTZWVkcy5hZGRMYXN0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCWxlYWRpbmdTcGFjZU5vZGUgPSBjcmVhdGVOb2RlKG5vZGVTZWVkcyk7Ci0JCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWxhc3ROb2RlLnNldE5leHQobGVhZGluZ1NwYWNlTm9kZSk7Ci0JCQkJbGVhZGluZ1NwYWNlTm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQl9Ci0JCQlsYXN0Tm9kZSA9IGxlYWRpbmdTcGFjZU5vZGU7Ci0JCX0KLQotCQkvLyBmaW5kIHRyYWlsaW5nIHNwYWNlCi0JCWlmIChsZWFkaW5nU3BhY2VFbmQgPCBuUmVnaW9ucyAtIDEpIHsKLQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJZm9yIChpbnQgaSA9IG5SZWdpb25zIC0gMTsgMCA8PSBpOyBpLS0pIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpOwotCQkJCVN0cmluZyB0eXBlID0gKChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXQoaSkpLmdldFR5cGUoKTsKLQkJCQlpZiAoaXNCbGFua1JlZ2lvbih0eXBlKSkgewotCQkJCQl0cmFpbGluZ1NwYWNlQmVnaW4gPSBpOwotCQkJCQlub2RlU2VlZHMuYWRkRmlyc3QocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSkgewotCQkJCXRyYWlsaW5nU3BhY2VOb2RlID0gY3JlYXRlTm9kZShub2RlU2VlZHMpOwotCQkJfQotCi0JCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCWZvciAoaW50IGkgPSBsZWFkaW5nU3BhY2VFbmQgKyAxOyBpIDwgdHJhaWxpbmdTcGFjZUJlZ2luOyBpKyspIHsKLQkJCQlub2RlU2VlZHMuYWRkTGFzdChyZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCQljb250ZW50Tm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGNvbnRlbnROb2RlKTsKLQkJCQkJY29udGVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCX0KLQkJCQlsYXN0Tm9kZSA9IGNvbnRlbnROb2RlOwotCQkJfQotCQkJaWYgKHRyYWlsaW5nU3BhY2VOb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0Tm9kZS5zZXROZXh0KHRyYWlsaW5nU3BhY2VOb2RlKTsKLQkJCQl0cmFpbGluZ1NwYWNlTm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJbGFzdE5vZGUgPSB0cmFpbGluZ1NwYWNlTm9kZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsYXN0Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlTm9kZShMaW5rZWRMaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5EVERfR0VORVJJQyk7Ci0JCWludCBzdGFydCA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0Rmlyc3QoKSkuZ2V0U3RhcnQoKTsKLQkJaW50IGxlbmd0aCA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0TGFzdCgpKS5nZXRFbmQoKSAtIHN0YXJ0OwotCQlub2RlLnNldFN0YXJ0KHN0YXJ0KTsKLQkJbm9kZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3IgaSA9IHJlZ2lvbnMubGlzdEl0ZXJhdG9yKDApOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlub2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1zdGFydCk7Ci0JCX0KLQkJbm9kZS5zZXRFbmRlZCh0cnVlKTsKLQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlTm9kZUNoYWluKExpc3QgcmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCVZlY3RvciBub2RlU2VlZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOyBlLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBJZiB0aGUgZm9sbG93aW5nIHJlZ2lvbnMgYXBwZWFyLAotCQkJLy8gYSBwcmV2aW91cyBub2RlIGlzIGNsb3NlZCBpbiBmcm9udCBvZiBpdC4KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSAmJiBpc0JlZ2lubmluZ1JlZ2lvbih0eXBlKSkgewotCQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlub2RlU2VlZHMuYWRkRWxlbWVudChyZWdpb24pOwotCi0JCQkvLyBUaGUgZm9sbG93aW5nIHJlZ2lvbnMgY2xvc2UgdGhlIGN1cnJlbnQgbm9kZS4KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSAmJiBpc0VuZGluZ1JlZ2lvbih0eXBlKSkgewotCQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGZpbmRGaXJzdE5vZGUobGFzdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xvc2UgY3VycmVudCBub2RlIGZvcmNpYmx5LgotCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBmaW5kRmlyc3ROb2RlKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRGaXJzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbm9kZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCXdoaWxlICgocHJldk5vZGUgPSBmaXJzdE5vZGUuZ2V0UHJldmlvdXMoKSkgIT0gbnVsbCkgewotCQkJZmlyc3ROb2RlID0gcHJldk5vZGU7Ci0JCX0KLQkJcmV0dXJuIGZpcnN0Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCWlmIChjYWNoZWROb2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWROb2RlOwotCQl9Ci0KLQkJTGlzdCByZWdpb25zID0gZ2V0UmVnaW9ucygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gY3JlYXRlTm9kZUNoYWluKHJlZ2lvbnMpOwotCQljYWNoZWROb2RlID0gaGVhZE5vZGU7Ci0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCWlmIChjYWNoZWRSZWdpb25zICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWRSZWdpb25zOwotCQl9Ci0KLQkJVmVjdG9yIHJlZ2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCVRva2VuIGN1cnJlbnRUb2tlbiA9IG51bGw7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudFRva2VuID0gKFRva2VuKSB0b2tlbml6ZXIueXlsZXgoKTsKLQkJCQlpZiAoY3VycmVudFRva2VuICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gRFREUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY3VycmVudFRva2VuLmdldFR5cGUoKSwgY3VycmVudFRva2VuLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnRUb2tlbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCXJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJd2hpbGUgKGN1cnJlbnRUb2tlbiAhPSBudWxsKTsKLQotCQljYWNoZWRSZWdpb25zID0gcmVnaW9uczsKLQkJcmV0dXJuIHJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlcikgewotCQlpZiAodG9rZW5pemVyID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdG9rZW5pemVyID0gbmV3IERURFRva2VuaXplcihyZWFkZXIpOwotCQkJfQotCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgRFREVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJdG9rZW5pemVyLnl5cmVzZXQocmVhZGVyKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQljYWNoZWROb2RlID0gbnVsbDsKLQkJY2FjaGVkUmVnaW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBvZmZzZXQgZm9yIHVzZSB3aXRoIGFueSBwb3NpdGlvbi1kZXBlbmRhbnQgcGFyc2luZyBydWxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQocmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJcmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCwgaW50IG9mZnNldCkgewotCQlyZXNldChpbnB1dCk7Ci0JfQotCi0JLy8gbmV2ZXIgdXNlZAotCURURFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCXJldHVybiB0b2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQmVnaW5uaW5nUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpIHx8ICh0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNCbGFua1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kaW5nUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTkRfVEFHKSB8fCAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSkgfHwgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGVjZDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVnaW9uVHlwZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlZ2lvblByZWZpeCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5wYXJzZXIuRFREUmVnaW9uVHlwZXMuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9IHJlZ2lvblByZWZpeCArICJOQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9IHJlZ2lvblByZWZpeCArICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTkRfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFSRU4gPSByZWdpb25QcmVmaXggKyAiTEVGVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSUdIVF9QQVJFTiA9IHJlZ2lvblByZWZpeCArICJSSUdIVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFID0gcmVnaW9uUHJlZml4ICsgIldISVRFU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SID0gcmVnaW9uUHJlZml4ICsgIkNPTk5FQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9DQ1VSX1RZUEUgPSByZWdpb25QcmVmaXggKyAiT0NDVVJfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMQU1BVElPTiA9IHJlZ2lvblByZWZpeCArICJFWENMQU1BVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJDRU5UID0gcmVnaW9uUHJlZml4ICsgIlBFUkNFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VNSUNPTE9OID0gcmVnaW9uUHJlZml4ICsgIlNFTUlDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1NUQVJUID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VORCA9IHJlZ2lvblByZWZpeCArICJDT01NRU5UX0VORCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RBRyA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fQ09OVEVOVCA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTlRJVFlfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9QQVJNID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9QQVJNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX1ZBTFVFID0gcmVnaW9uUHJlZml4ICsgIk5EQVRBX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUcgPSByZWdpb25QcmVmaXggKyAiRUxFTUVOVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVMRU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0VNUFRZID0gcmVnaW9uUHJlZml4ICsgIkNPTlRFTlRfRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BTlkgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9BTlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQ0RBVEEgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9QQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRMSVNUX1RBRyA9IHJlZ2lvblByZWZpeCArICJBVFRMSVNUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlNZU1RFTV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlBVQkxJQ19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTkRBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJTSU5HTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJET1VCTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiVU5LTk9XTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSByZWdpb25QcmVmaXggKyAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiQ0RBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJRFJFRl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGU19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEUkVGU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiRU5USVRJRVNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTlNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTV9DSE9JQ0UgPSByZWdpb25QcmVmaXggKyAiRU5VTV9DSE9JQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9FTlRJVFlfVFlQRSA9IHJlZ2lvblByZWZpeCArICJQQVJNX0VOVElUWV9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gYXR0cmlidXRlIGRlZmF1bHRzIGtleXdvcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJSRVFVSVJFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJTVBMSUVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJGSVhFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotfS8vIERURFJlZ2lvblR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZiNjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBEVEQgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiZHRkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ4ZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgRFREIGNvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIERURENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzk1NTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MsIHdpdGggaXRzIG9uZSBmaWVsZCwgaXMgYSBjb252ZW5pZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJyaW5nIHRvIHRoZSBEVEQgY29udGVudFR5cGUgSUQuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JEVEQgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgQ29udGVudFR5cGVJRF9EVEQgaWQgZmllbGQgd2lsbCBtYXRjaCB3aGF0IGlzCi0JICogc3BlY2lmaWVkIGluIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ueG1sIGZvciB0aGUgRFREIGNvbnRlbnQKLQkgKiB0eXBlLgotCSAqIAotCSAqIFRoaXMgdmFsdWUgaXMgaW50ZW50aW9uYWxseSBzZXQgdGhyb3VnaCBhIGRlZmF1bHQgcHJvdGVjdGVkIG1ldGhvZCBzbwotCSAqIHRoYXQgaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0RURCA9IGdldENvbnN0YW50U3RyaW5nKCk7Ci0KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgRFREIENvbnRlbnQgVHlwZSBJZGVudGlmaWVyIElEIGFzIGEgU3RyaW5nCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvRFRETW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvRFRETW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzY2E0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0RURE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIDxwPgotICogQW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBTU0UtYmFzZWQgRFREIG1vZGVsLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURE1vZGVsIGV4dGVuZHMgSVN0cnVjdHVyZWRNb2RlbHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmQzNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lEVERQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gdHlwZXMgRFRELgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LklEVERQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURURFBhcnRpdGlvblR5cGVzIHsKLQkKLQlTdHJpbmcgRFREX0RFRkFVTFQgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90YXNrcy9EVERGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGFza3MvRFRERmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzI2OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90YXNrcy9EVERGaWxlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyOwotCi1wdWJsaWMgY2xhc3MgRFRERmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciB7Ci0JcHVibGljIERUREZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWI1YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZlN0YXJ0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JCXJldHVybiByZXBhcnNlKHN0YXJ0Tm9kZS5nZXRTdGFydCgpLCBlbmROb2RlLmdldEVuZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJcmV0dXJuIHN1cGVyLnJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTViMGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFREX0dFTkVSSUMgPSA1OwotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIERURF9HRU5FUklDIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWdpb25JdGVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2RjZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4OwotCi0JLy8gcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnM7Ci0JLy8gcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIHN0YXJ0UmVnaW9uLCBlbmRSZWdpb247Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCXRoaXMobm9kZSwgbm9kZS5nZXRTdGFydCgpLCBub2RlLmdldEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlzdGFydFJlZ2lvbiA9IG5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQllbmRSZWdpb24gPSBub2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZE9mZnNldCAtIDEpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoc3RhcnRSZWdpb24gPT0gcmVnaW9uKSB7Ci0JCQkJY3VycmVudEluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQl0aGlzLnJlZ2lvbnMgPSByZWdpb25zOwotCQlzdGFydFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQllbmRSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQljdXJyZW50SW5kZXggPSAwOwotCQkvLyB0aGlzKG5vZGUsIG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJaWYgKGN1cnJlbnRJbmRleCA8IHJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gY3VycmVudEluZGV4IDw9IHJlZ2lvbnMuaW5kZXhPZihlbmRSZWdpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7Ci0JCQlyZXR1cm4gY3VycmVudEluZGV4ID49IHJlZ2lvbnMuaW5kZXhPZihzdGFydFJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBuZXh0KCkgewotCQlpZiAoaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gcmVnaW9ucy5nZXQoY3VycmVudEluZGV4KyspOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIHByZXZpb3VzKCkgewotCQlpZiAoaGFzUHJldmlvdXMoKSkgewotCQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KC0tY3VycmVudEluZGV4KTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzkzNDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0RGVmYXVsdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNpbml0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde0lEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL0RURFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjA2YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkxICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMy41IG9uIDMvMTQvMDUgOTozNyBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotCi0vKiogCi0gKiBHZW5lcmF0ZSB3aXRoICJkdGRza2VsZXRvbiIuCi0gKgotICogSXQgcmVtb3ZlcyBzb21lIHVudXNlZCBmaWVsZHMgYW5kIGF2b2lkcyBzb21lIGNvbXBpbGVyIHdhcm5pbmdzIAotICovCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuMy41Ci0gKiBvbiAzLzE0LzA1IDk6MzcgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0JVRkZFUlNJWkUgPSAxNjM4NDsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0VOVU1FUkFUSU9OID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE5PVEFUSU9OX05BTUUgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX0NISUxEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRU5USVRZX0NPTlRFTlQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBDT01NRU5UX0NPTlRFTlQgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRMSVNUX05BTUUgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFWFRFUk5BTElEX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX0NPTlRFTlQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX01JWEVEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9NSVhFRF9PUl9DSElMRCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVFJJQlVURV9DT05URU5UID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVOVElUWV9OQU1FID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0RFRkFVTFQgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9OQU1FID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTkRBVEFfQ09OVEVOVCA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVExJU1RfQ09OVEVOVCA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBOT0RFID0gMTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDEwXDBcMVwwXDFcNVwxXDNcMVwwXDFcMFwxXDJcMjJcMFwxXDVcMVw2IisKLSAgICAiXDFcMVwxXDM3XDFcMFwxXDIzXDFcMFwxXDQ2XDFcNDJcMVw0M1wxXDRcMVw3IisKLSAgICAiXDFcNDVcMVwxMlwxXDBcMVwwXDEyXDBcMVwwXDFcMTBcMVwxMVwxXDBcMVwxMyIrCi0gICAgIlwxXDRcMVwwXDFcMjVcMVwzMVwxXDMyXDFcMzNcMVwxNFwxXDM1XDJcMFwxXDIxIisKLSAgICAiXDFcMFwxXDM2XDFcMTVcMVwxNlwxXDE3XDFcMjRcMVwyN1wxXDQwXDFcMzRcMVwyNiIrCi0gICAgIlwxXDIwXDFcMzBcMlwwXDFcNDFcMVwyMlwxXDBcMVwwXDFcMFwyXDBcMVwwIisKLSAgICAiXDFcMFwzMlwwXDFcMFwxXDQ0XHVmZjgzXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgMzksICAgIDc4LCAgIDExNywgICAxNTYsICAgMTk1LCAgIDIzNCwgICAyNzMsICAgMzEyLCAgIDM1MSwgCi0gICAgICAzOTAsICAgNDI5LCAgIDQ2OCwgICA1MDcsICAgNTQ2LCAgIDU4NSwgICA2MjQsICAgIDM5LCAgICAzOSwgICAgMzksIAotICAgICAgNjYzLCAgIDcwMiwgICA3NDEsICAgNzgwLCAgIDgxOSwgICAgMzksICAgIDM5LCAgIDg1OCwgICA4OTcsICAgIDM5LCAKLSAgICAgICAzOSwgICA5MzYsICAgOTM2LCAgIDk3NSwgIDEwMTQsICAxMDUzLCAgMTA5MiwgIDExMzEsICAxMTcwLCAgMTIwOSwgCi0gICAgIDEyNDgsICAxMjg3LCAgMTMyNiwgIDEzNjUsICAxNDA0LCAgMTQ0MywgICAgMzksICAxNDgyLCAgMTUyMSwgIDE1NjAsIAotICAgICAxNTk5LCAgMTYzOCwgICAgMzksICAxNjc3LCAgMTcxNiwgIDE3NTUsICAxNzk0LCAgMTgzMywgIDE4NzIsICAgIDM5LCAKLSAgICAgICAzOSwgIDE5MTEsICAxOTUwLCAgMTk4OSwgIDIwMjgsICAyMDY3LCAgMjEwNiwgICAgMzksICAgIDM5LCAgICAzOSwgCi0gICAgIDIxNDUsICAyMTg0LCAgMjIyMywgIDIyNjIsICAyMzAxLCAgMjM0MCwgIDIzNzksICAgODk3LCAgMjQxOCwgICA5NzUsIAotICAgICAyNDU3LCAgMjQ5NiwgIDI1MzUsICAyNTc0LCAgIDk3NSwgIDI2MTMsICAyNjUyLCAgMjY5MSwgIDI3MzAsICAxNTYwLCAKLSAgICAgMjc2OSwgIDI4MDgsICAyODQ3LCAgMjg4NiwgIDI5MjUsICAyOTY0LCAgMzAwMywgIDMwNDIsICAzMDgxLCAgMzEyMCwgCi0gICAgIDE5NTAsICAzMTU5LCAgMzE5OCwgIDMyMzcsICAzMjc2LCAgMzMxNSwgIDE5NTAsICAgIDM5LCAgMzM1NCwgIDMzOTMsIAotICAgICAzNDMyLCAgICAzOSwgIDM0NzEsICAzNTEwLCAgMzU0OSwgICAgMzksICAzNTg4LCAgMzYyNywgICAgMzksICAzNjY2LCAKLSAgICAgMzcwNSwgIDM3NDQsICAgIDM5LCAgICAzOSwgIDM3ODMsICAzODIyLCAgMzg2MSwgIDM5MDAsICAzOTM5LCAgMzk3OCwgCi0gICAgIDQwMTcsICA0MDU2LCAgICAzOSwgIDQwOTUsICA0MTM0LCAgNDE3MywgICAgMzksICA0MjEyLCAgNDI1MSwgIDQyOTAsIAotICAgICA0MzI5LCAgNDM2OCwgIDQ0MDcsICA0NDQ2LCAgNDQ4NSwgIDQ1MjQsICA0NTYzLCAgNDYwMiwgIDQ2NDEsICA0NjgwLCAKLSAgICAgNDcxOSwgIDQ3NTgsICA0Nzk3LCAgNDgzNiwgIDQ4NzUsICA0OTE0LCAgNDk1MywgIDQ5OTIsICA1MDMxLCAgNTA3MCwgCi0gICAgIDUxMDksICA1MTQ4LCAgNTE4NywgIDUyMjYsICA1MjY1LCAgNTMwNCwgIDUzNDMsICAgOTc1LCAgNTM4MiwgIDU0MjEsIAotICAgICA1NDYwLCAgNTQ5OSwgIDU1MzgsICA1NTc3LCAgMTU2MCwgIDU2MTYsICA1NjU1LCAgNTY5NCwgIDU3MzMsICA1NzcyLCAKLSAgICAgNTgxMSwgIDU4NTAsICAgNTQ2LCAgNTg4OSwgIDU5MjgsICA1OTY3LCAgNjAwNiwgICA5NzUsICAgOTc1LCAgIDk3NSwgCi0gICAgIDYwNDUsICAxNTYwLCAgNjA4NCwgIDYxMjMsICAxNTYwLCAgNjE2MiwgIDYyMDEsICA2MjQwLCAgMTk1MCwgICA1NDYsIAotICAgICA2Mjc5LCAgIDU0NiwgICA4MTksICA2MzE4LCAgNjM1NywgIDYzOTYsICA2NDM1LCAgNjQ3NCwgIDY1MTMsICAgNTQ2LCAKLSAgICAgNjU1MiwgIDE1NjAsICAxNTYwLCAgMTU2MCwgIDE5NTAsICA2NTkxLCAgICAzOSwgIDE5NTAKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBIChwYXJ0IDApCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkMCA9IAotICAgICJcMlwxN1wyXDIwXDFcMTdcMVwyMFwxXDIxXDFcMTdcMVwyMlwxXDIzIisKLSAgICAiXDFcMTdcMVwyNFwxXDI1XDJcMTdcMVwyNlwzXDE3XDFcMjdcMVwxNyIrCi0gICAgIlwxXDMwXDIxXDE3XDQ3XDBcMlwzMVwyXDIwXDFcMzJcMVwyMFwxXDAiKwotICAgICJcMVwzMlwxXDMxXDFcMzNcMVwzMVwxXDMzXDIzXDMxXDFcMzRcMlwzMSIrCi0gICAgIlwxXDM1XDFcMzZcMlwzN1wxXDMxXDJcNDBcMlwyMFwxXDBcMVwyMCIrCi0gICAgIlwzXDQwXDFcMzNcMVw0MFwxXDMzXDdcNDBcMVw0MVwxNlw0MFw0XDAiKwotICAgICJcMVw0MFwxXDQyXDFcNDNcMlwyMFwxXDQyXDFcMjBcM1w0MlwxXDMzIisKLSAgICAiXDFcNDJcMVwzM1wxMlw0MlwxXDQ0XDFcNDVcMTZcNDJcMVw0NlwyXDQ3IisKLSAgICAiXDJcMjBcMVw0N1wxXDIwXDNcNDdcMVwzM1wxXDQ3XDFcMzNcMzNcNDciKwotICAgICJcMlw1MFwyXDIwXDFcMFwxXDIwXDJcMFwxXDUwXDFcMzNcMVw1MCIrCi0gICAgIlwxXDMzXDI2XDUwXDRcMFwxXDUwXDFcNDJcMVw0M1wyXDIwXDFcNDIiKwotICAgICJcMVwyMFwzXDQyXDFcMzNcMVw0MlwxXDMzXDNcNDJcMVw1MVw2XDQyIisKLSAgICAiXDFcNTJcMVw1M1wxNlw0MlwxXDQ2XDJcNTRcMlw1NVwxXDU0XDFcNTUiKwotICAgICJcNFw1NFwxXDU2XDFcNTdcMzNcNTRcMlw2MFwyXDIwXDFcNDJcMVwyMCIrCi0gICAgIlwyXDQyXDFcNjBcMVwzM1wxXDYwXDFcMzNcMjZcNjBcNFw0MlwxXDYwIisKLSAgICAiXDJcNjFcMlwyMFwxXDQyXDFcMjBcMlw0MlwxXDYxXDFcMzNcMVw2MSIrCi0gICAgIlwxXDMzXDI2XDYxXDRcNDJcMVw2MVwxXDYyXDFcNjNcMVw2NFwxXDY1IisKLSAgICAiXDFcNjJcMVw2NlwzXDYyXDFcMzNcMVw2MlwxXDMzXDFcNjdcMlw2MiIrCi0gICAgIlwxXDcwXDFcNjJcMVw3MVwxMFw2MlwxXDcyXDRcNjJcMVw3M1wyXDYyIisKLSAgICAiXDFcNzRcMlw3NVwxXDYyXDFcNzZcMVw3N1wxXDEwMFwyXDIwXDFcNzciKwotICAgICJcMVwyMFwzXDc3XDFcMzNcMVw3N1wxXDMzXDIzXDc3XDFcMTAxXDZcNzciKwotICAgICJcMVwxMDJcMlwxMDNcMlwyMFwxXDEwM1wxXDIwXDNcMTAzXDFcMzNcMVwxMDMiKwotICAgICJcMVwzM1wyNlwxMDNcMVwxMDRcMVwxMDVcMVwxMDZcMlwxMDNcMlwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMjNcMTdcMlwwXDJcMjBcMVwwXDFcMjBcNTNcMFwxXDEwN1wzNFwwIisKLSAgICAiXDJcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwIisKLSAgICAiXDFcMTdcMVwxMTBcMVwxN1wxXDExMVwzXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMVwxMTJcMjJcMTdcMlwxMTNcMlwwXDFcMTEzXDJcMFwxXDExM1wyXDAiKwotICAgICJcMVwxMTNcMVwwXDdcMTEzXDFcMFwyM1wxMTNcMlwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDExNFwyXDE3IisKLSAgICAiXDFcMFwyM1wxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIrCi0gICAgIlwyNlwzMVw0XDBcM1wzMVw2XDBcMVwzMVwxXDBcMVwzMVwxXDAiKwotICAgICJcMTNcMzFcMVwxMTVcMTJcMzFcNFwwXDFcMzFcMlwwXDJcMTE2XDFcMCIrCi0gICAgIlwxXDExNlwzMVwwXDFcMTE3XDdcMFwyXDQwXDRcMFwzXDQwXDFcMCIrCi0gICAgIlwxXDQwXDFcMFwyNlw0MFw0XDBcMVw0MFwyXDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwzM1w0MlwxXDQzXDFcMTIwIisKLSAgICAiXDJcMTIxXDFcNDNcMVwxMjFcM1w0M1wxXDEyMVwxXDQzXDFcMTIxXDMzXDQzIisKLSAgICAiXDJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwIisKLSAgICAiXDZcNDJcMVwxMjJcMjZcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwIisKLSAgICAiXDFcNDJcMVwwXDE0XDQyXDFcMTIzXDE2XDQyXDJcNDZcMlwxMjRcMVw0NiIrCi0gICAgIlwxXDEyNFwzXDQ2XDFcMTI0XDFcNDZcMVwxMjRcMzJcNDZcMVwxMjVcMlw0NyIrCi0gICAgIlwyXDBcMVw0N1wxXDBcM1w0N1wxXDBcMVw0N1wxXDBcMzNcNDciKwotICAgICJcMlw1MFw2XDBcMVw1MFwxXDBcMVw1MFwxXDBcMjZcNTBcNFwwIisKLSAgICAiXDFcNTBcMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDBcMTdcNDJcMVwxMjZcMTVcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDZcNDJcMVwxMjdcMjZcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDE0XDQyXDFcMTMwXDE2XDQyIisKLSAgICAiXDEyXDU0XDJcMFwzNVw1NFwyXDU1XDFcNTRcMVw1NVw0XDU0XDJcMCIrCi0gICAgIlwzM1w1NFwxMlwwXDFcMTMxXDM0XDBcMlw2MFwyXDBcMVw0MlwxXDAiKwotICAgICJcMlw0MlwxXDYwXDFcMFwxXDYwXDFcMFwyNlw2MFw0XDQyXDFcNjAiKwotICAgICJcMlw2MVwyXDBcMVw0MlwxXDBcMlw0MlwxXDYxXDFcMFwxXDYxIisKLSAgICAiXDFcMFwyNlw2MVw0XDQyXDFcNjFcMlw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMjZcNjJcM1wwXDJcNjJcMVw2MyIrCi0gICAgIlwxXDEzMlwyXDEzM1wxXDYzXDFcMTMzXDNcNjNcMVwxMzNcMVw2M1wxXDEzMyIrCi0gICAgIlwyNlw2M1wzXDEzM1wyXDYzXDNcMFwxXDY1XDUwXDBcMVw2Nlw0MVwwIisKLSAgICAiXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwxMzRcMjJcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDJcNjJcMVwxMzVcNVw2MlwxXDEzNiIrCi0gICAgIlwxNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMTdcNjJcMVwxMzdcNlw2MlwzXDBcNFw2MlwyXDAiKwotICAgICJcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTdcNjJcMVwxNDAiKwotICAgICJcNlw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDE0MVwxMlw2MlwxXDE0MlwxXDE0M1w0XDYyIisKLSAgICAiXDNcMFwyXDYyXDJcNzZcMlwxNDRcMVw3NlwxXDE0NFwzXDc2XDFcMTQ0IisKLSAgICAiXDFcNzZcMVwxNDRcMjZcNzZcM1wxNDRcMVw3NlwxXDEzMlwyXDc3XDJcMCIrCi0gICAgIlwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwzM1w3N1wxXDEwMCIrCi0gICAgIlwxXDE0NVwyXDE0NlwxXDEwMFwxXDE0NlwzXDEwMFwxXDE0NlwxXDEwMFwxXDE0NiIrCi0gICAgIlwzM1wxMDBcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcNVw3N1wxXDE0N1wxMlw3N1wxXDE1MFwxXDE1MVwxMVw3N1wyXDEwMiIrCi0gICAgIlwyXDE1MlwxXDEwMlwxXDE1MlwzXDEwMlwxXDE1MlwxXDEwMlwxXDE1MlwzMlwxMDIiKwotICAgICJcMVwxNTNcMlwxMDNcMlwwXDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMVwwXDI2XDEwM1wzXDBcMlwxMDNcMTJcMFwxXDE1NFwzNFwwXDJcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDFcMTU1IisKLSAgICAiXDZcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw0XDE3XDFcMTU2XDJcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMTU3IisKLSAgICAiXDJcMTdcMVwwXDIzXDE3XDJcMTEzXDJcMFwxXDExM1wyXDBcMVwxMTMiKwotICAgICJcMVwxNjBcMVwwXDFcMTEzXDFcMFw3XDExM1wxXDBcMjNcMTEzXDJcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTciKwotICAgICJcMVwxNjFcMlwxN1wxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDAiKwotICAgICJcMVwzMVwxXDBcMTZcMzFcMVwxNjJcN1wzMVw0XDBcMVwzMVwyN1wwIisKLSAgICAiXDFcMTYzXDE3XDBcMVwxMjFcMVwxNjRcNDVcMTIxXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDEyXDQyXDFcMTY1XDIyXDQyIisKLSAgICAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNVw0MiIrCi0gICAgIlwxXDE2NlwxNVw0Mlw0NlwxMjRcMVwxNjdcMlw0MlwyXDBcMVw0MlwxXDAiKwotICAgICJcM1w0MlwxXDBcMVw0MlwxXDBcMTFcNDJcMVwxNzBcMjNcNDJcMlwwIisKLSAgICAiXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDEyXDQyXDFcMTcxIisKLSAgICAiXDIyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMCIrCi0gICAgIlwxNVw0MlwxXDE3MlwxNVw0MlwxM1wwXDFcMTczXDMzXDBcMVwxMzNcMVwxNzQiKwotICAgICJcNDVcMTMzXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwxNzVcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjJcMVwxNzZcMjFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwxNzdcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDIwXDYyXDFcMjAwXDVcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDExXDYyXDFcMjAxXDE0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwyXDYyXDFcMjAyXDIzXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDIwM1wyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcNVw2MlwxXDIwNFwyMFw2MlwzXDAiKwotICAgICJcMlw2Mlw0NlwxNDRcMVwxNzRcMVwxNDZcMVwyMDVcNDVcMTQ2XDJcNzdcMlwwIisKLSAgICAiXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDJcNzdcMVwyMDYiKwotICAgICJcMzJcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwIisKLSAgICAiXDFcMjA3XDM0XDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFw1XDc3XDFcMjEwXDI1XDc3XDQ2XDE1MlwxXDIxMVwyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwyXDE3XDFcMjEyIisKLSAgICAiXDRcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw1XDE3XDFcMjEzXDFcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwxXDE3XDFcMjE0XDIzXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFwxXDE3XDFcMjE1XDVcMTdcMVwwXDIzXDE3XDJcMzEiKwotICAgICJcNlwwXDFcMzFcMVwwXDFcMzFcMVwwXDE3XDMxXDFcMjE2XDZcMzEiKwotICAgICJcNFwwXDFcMzFcMzJcMFwxXDIxN1wxNFwwXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDRcNDJcMVwyMjBcMzBcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDFcNDIiKwotICAgICJcMVwyMjFcMzNcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDRcNDJcMVwyMjJcMzBcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDRcNDJcMVwyMjNcMzBcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDFcNDJcMVwyMjRcMzFcNDIiKwotICAgICJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcNVw2MlwxXDIyNVwyMFw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjJcMVwyMjZcMTVcNjJcM1wwIisKLSAgICAiXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDExXDYyXDFcMjI3XDE0XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwxXDIzMFwyNVw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MiIrCi0gICAgIlwxXDIzMVwyMVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMTNcNjJcMVwyMzJcMTJcNjJcM1wwXDRcNjIiKwotICAgICJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDI0XDYyIisKLSAgICAiXDFcMjMzXDFcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDI1XDYyXDFcMjM0XDNcMFwyXDYyXDJcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDEzXDc3IisKLSAgICAiXDFcMjM1XDIxXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwyNFw3N1wxXDIzNlwxMFw3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMjVcNzdcMVwyMzdcNVw3N1wyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwxXDI0MFw2XDE3IisKLSAgICAiXDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxNyIrCi0gICAgIlwxXDBcNFwxN1wxXDI0MVwyXDE3XDFcMFwyNVwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDI0MlwyXDE3IisKLSAgICAiXDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxNyIrCi0gICAgIlwxXDBcNVwxN1wxXDI0M1wxXDE3XDFcMFwyM1wxN1wyXDMxXDZcMCIrCi0gICAgIlwxXDMxXDFcMFwxXDMxXDFcMFwxMVwzMVwxXDI0NFwxNFwzMVw0XDAiKwotICAgICJcMVwzMVwzM1wwXDFcMjQ1XDEzXDBcMlw0MlwyXDBcMVw0MlwxXDAiKwotICAgICJcM1w0MlwxXDBcMVw0MlwxXDBcMVwyNDZcMzRcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDVcNDJcMVwyNDdcMjdcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDExXDQyIisKLSAgICAiXDFcMjUwXDIzXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwxXDI1MVwzNFw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDAiKwotICAgICJcMVw0MlwxXDBcNVw0MlwxXDI1MlwyNVw0MlwyXDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjUzXDIxXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwyMlw2MlwxXDI1NFwzXDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjU1XDIxXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwyMVw2MlwxXDI1Nlw0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxMVw2MlwxXDI1N1wxNFw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDI2MFwyNFw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTRcNjJcMVwyNjFcMTFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcMjYyXDI1XDYyXDNcMFwyXDYyXDJcNzdcMlwwXDFcNzciKwotICAgICJcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDFcNzdcMVwyNjNcMzNcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDE0XDc3IisKLSAgICAiXDFcMjY0XDIwXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwxXDI2NVwzMlw3N1wyXDE3XDJcMFwxXDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDFcMFwzXDE3XDFcMjY2XDNcMTdcMVwwXDI1XDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw2XDE3IisKLSAgICAiXDFcMjY3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcNVwxN1wxXDI3MFwxXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMlwxN1wxXDI3MVwyMFwxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxIisKLSAgICAiXDFcMFw0XDMxXDFcMjcyXDIxXDMxXDRcMFwxXDMxXDI1XDBcMVwyNzMiKwotICAgICJcMjFcMFwyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwyXDQyXDFcMjc0XDMyXDQyXDJcMFwxXDQyXDFcMFwzXDQyIisKLSAgICAiXDFcMFwxXDQyXDFcMFwxNlw0MlwxXDI3NFwxNlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMlw0MlwxXDI3NVwzMlw0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTZcNDIiKwotICAgICJcMVwyNzZcMTRcNDJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDI3N1wxXDMwMFwxN1w2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMVwzMDEiKwotICAgICJcMjVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDVcNjJcMVwzMDJcMjBcNjJcM1wwXDRcNjJcMlwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDEyXDYyXDFcMzAzIisKLSAgICAiXDEzXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMjM0XDIwXDYyXDNcMFw0XDYyXDJcMCIrCi0gICAgIlwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw1XDYyXDFcMzA0IisKLSAgICAiXDIwXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxN1w2MlwxXDEzMlw2XDYyXDNcMFwyXDYyXDJcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDVcNzciKwotICAgICJcMVwzMDVcMjdcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDVcNzdcMVwzMDZcMjdcNzdcMlwwXDFcNzdcMVwwXDNcNzciKwotICAgICJcMVwwXDFcNzdcMVwwXDE3XDc3XDFcMzA3XDEzXDc3XDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwzMTAiKwotICAgICJcMlwxN1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDdcMTdcMVwwXDFcMzExXDI0XDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMzEyXDJcMTciKwotICAgICJcMVwwXDIzXDE3XDJcMzFcNlwwXDFcMzFcMVwwXDFcMzFcMVwwIisKLSAgICAiXDExXDMxXDFcMzEzXDE0XDMxXDRcMFwxXDMxXDIwXDBcMVwzMTRcMjZcMCIrCi0gICAgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwxXDMxNVwyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcM1w2MlwxXDMxNlwyMlw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjIiKwotICAgICJcMVwzMTdcMTVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDIwXDYyXDFcMjM0XDVcNjJcM1wwXDJcNjIiKwotICAgICJcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiKwotICAgICJcMVwzMjBcMzRcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDIwXDc3XDFcMzIxXDEyXDc3XDJcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMVwwXDNcMTdcMVwzMjJcM1wxN1wxXDAiKwotICAgICJcMjNcMTdcMjVcMFwxXDMyM1wyMVwwXDJcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDEyXDYyXDFcMzI0XDEzXDYyXDNcMCIrCi0gICAgIlw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwxMlw2MlwxXDMyNVwxM1w2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcM1w2MlwxXDMyNlwyMlw2MlwzXDAiKwotICAgICJcMlw2MlwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwxN1w3N1wxXDMyN1wxNVw3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMVwzMzBcMzJcNzdcMlwwXDJcMzIzXDFcMCIrCi0gICAgIlwxXDMyM1wzNVwwXDFcMzMxXDNcMFwyXDc3XDJcMFwxXDc3XDFcMCIrCi0gICAgIlwzXDc3XDFcMFwxXDc3XDFcMFwxN1w3N1wxXDMzMlwxM1w3NyI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjaygpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDAsICA4LCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgOSwgIDksICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDAsICA5LCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyW1lZX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBpbnQgeXljb2x1bW47IAotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JaW50IG5vZGVfY291bnQgPSAwOwotCVN0cmluZyBjdXJyZW50U3RyaW5nOwotCi0JcHJpdmF0ZSBUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3IFRva2VuKHR5cGUsIHl5dGV4dCgpLCB5eWxpbmUsIHl5Y2hhciArIHN0YXJ0T2Zmc2V0LCB5eWxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKLQkJdGhpcy55eWxpbmUgPSBsaW5lOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBEVERUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgRFREVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIHNwbGl0LCBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbNjYzMF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0geXlfdW5wYWNrKHl5X3BhY2tlZDAsIG9mZnNldCwgdHJhbnMpOwotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVudHJ5Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgeXlfdW5wYWNrKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSB0cmFucykgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzApIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9yZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOyAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh5eV9yZWFkZXIgIT0gbnVsbCkKLSAgICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHJlc2V0cyB0aGUKLSAgICogc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PllZX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eWNsb3NlKCk7Ci0gICAgeXlfcmVhZGVyID0gcmVhZGVyOwotICAgIHl5X2F0RU9GICA9IGZhbHNlOwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQgPSAwOwotICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgZmluYWwgcHVibGljIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFl5dG9rZW4geXlsZXgoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB5eV9jdXJyZW50UG9zX2w7Ci0gICAgaW50IHl5X21hcmtlZFBvc19sOwotICAgIGludCB5eV9lbmRSZWFkX2wgPSB5eV9lbmRSZWFkOwotICAgIGNoYXIgW10geXlfYnVmZmVyX2wgPSB5eV9idWZmZXI7Ci0gICAgY2hhciBbXSB5eWNtYXBfbCA9IHl5Y21hcDsKLQotICAgIGludCBbXSB5eXRyYW5zX2wgPSB5eXRyYW5zOwotICAgIGludCBbXSB5eV9yb3dNYXBfbCA9IHl5X3Jvd01hcDsKLSAgICBieXRlIFtdIHl5X2F0dHJfbCA9IFlZX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0geXlfbWFya2VkUG9zX2wteXlfc3RhcnRSZWFkOwotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvc19sID0geXlfY3VycmVudFBvcyA9IAotICAgICAgICAgICAgICAgICAgICAgICB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3NfbDsKLSAgCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHl5X2N1cnJlbnRQb3NfbCA8IHl5X2VuZFJlYWRfbCkKLSAgICAgICAgICAgIHl5X2lucHV0ID0geXlfYnVmZmVyX2xbeXlfY3VycmVudFBvc19sKytdOwotICAgICAgICAgIGVsc2UgaWYgKHl5X2F0RU9GKSB7Ci0gICAgICAgICAgICB5eV9pbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgeXlfY3VycmVudFBvcyAgPSB5eV9jdXJyZW50UG9zX2w7Ci0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgICA9IHl5X21hcmtlZFBvc19sOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB5eV9yZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgeXlfY3VycmVudFBvc19sICA9IHl5X2N1cnJlbnRQb3M7Ci0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCAgID0geXlfbWFya2VkUG9zOwotICAgICAgICAgICAgeXlfYnVmZmVyX2wgICAgICA9IHl5X2J1ZmZlcjsKLSAgICAgICAgICAgIHl5X2VuZFJlYWRfbCAgICAgPSB5eV9lbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB5eV9pbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgeXlfaW5wdXQgPSB5eV9idWZmZXJfbFt5eV9jdXJyZW50UG9zX2wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc19sWyB5eV9yb3dNYXBfbFt5eV9zdGF0ZV0gKyB5eWNtYXBfbFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0geXlfYXR0cl9sW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvc19sID0geXlfY3VycmVudFBvc19sOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB5eV9tYXJrZWRQb3MgPSB5eV9tYXJrZWRQb3NfbDsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjE5OiBicmVhazsKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgIH0KLSAgICAgICAgY2FzZSAyMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgY2FzZSAxMzQ6IAotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxNzk6IAotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjIzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgICAgeyAgeXliZWdpbihDT01NRU5UX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7ICB9Ci0gICAgICAgIGNhc2UgMjI2OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjI3OiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgeyAgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDIyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOyAgfQotICAgICAgICBjYXNlIDIzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogCi0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM4OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzk6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKE5PVEFUSU9OX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNDU6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEVMRU1FTlRfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRU5USVRZX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oTkRBVEFfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDk6IGJyZWFrOwotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsgIH0KLSAgICAgICAgY2FzZSAyNTA6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKTsgIH0KLSAgICAgICAgY2FzZSAyNTI6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pOyAgfQotICAgICAgICBjYXNlIDI1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgY2FzZSAxNDk6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMTUxOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICBjYXNlIDE1MzogCi0gICAgICAgIGNhc2UgMTU0OiAKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgY2FzZSAxNzc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7ICB9Ci0gICAgICAgIGNhc2UgMjU3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyAgfQotICAgICAgICBjYXNlIDI1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTk6IGJyZWFrOwotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7ICB9Ci0gICAgICAgIGNhc2UgMjYwOiBicmVhazsKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlVNX0NIT0lDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjYzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyAgeXliZWdpbihFTlRJVFlfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDI2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjg6IGJyZWFrOwotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjcwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsgIH0KLSAgICAgICAgY2FzZSAyNzE6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjcyOiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDI3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDE2MzogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjc0OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOyAgfQotICAgICAgICBjYXNlIDI3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjc2OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjc3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNFTUlDT0xPTik7ICB9Ci0gICAgICAgIGNhc2UgMjc4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUik7ICB9Ci0gICAgICAgIGNhc2UgMjc5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyAgfQotICAgICAgICBjYXNlIDI4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTkRfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyODE6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjgyOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGJhYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFRva2VuIGV4dGVuZHMgWXl0b2tlbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9TVEFSVCA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0FOWSA9IDQzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRU1QVFkgPSA0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1BDREFUQSA9IDQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDQxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9UQUcgPSA0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfVEFHID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfQ09OVEVOVCA9IDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9QQVJNID0gMzE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfVEFHID0gMzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDTEFNQVRJT04gPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfUEFSRU4gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX0NPTlRFTlQgPSAyMTsKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fVEFHID0gMjA7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0NIT0lDRSA9IDU7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TRVFVRU5DRSA9IDY7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfT1BUSU9OQUwgPSA3OwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX09ORV9PUl9NT1JFID0gODsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ0NVUl9aRVJPX09SX01PUkUgPSA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX1RZUEUgPSA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1BBUkVOID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UQUcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFU1BBQ0UgPSA1OwotCi0KLQlwdWJsaWMgVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIodHlwZSk7Ci0JfQotCi0JcHVibGljIFRva2VuKFN0cmluZyB0eXBlLCBTdHJpbmcgdGV4dCwgaW50IGxpbmUsIGludCBjaGFyQmVnaW4sIGludCBsZW5ndGgpIHsKLQkJc3VwZXIodHlwZSwgdGV4dCwgbGluZSwgY2hhckJlZ2luLCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyBUb2tlbiBjcmVhdGVDb3B5KCkgewotCQlUb2tlbiBjb3B5ID0gbmV3IFRva2VuKGdldFR5cGUoKSwgZ2V0VGV4dCgpLCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwZGEwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9ZeXRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7Ci0KLWNsYXNzIFl5dG9rZW4gewotCXB1YmxpYyBpbnQgbV9jaGFyQmVnaW47Ci0JcHVibGljIGludCBtX2xlbmd0aDsKLQlwdWJsaWMgaW50IG1fbGluZTsKLQlwdWJsaWMgU3RyaW5nIG1fdGV4dDsKLQlwdWJsaWMgU3RyaW5nIG1fdHlwZTsKLQotCVl5dG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJbV90eXBlID0gdHlwZTsKLQl9Ci0KLQlZeXRva2VuKFN0cmluZyB0eXBlLCBTdHJpbmcgdGV4dCwgaW50IGxpbmUsIGludCBjaGFyQmVnaW4sIGludCBsZW5ndGgpIHsKLQkJbV90eXBlID0gdHlwZTsKLQkJbV90ZXh0ID0gbmV3IFN0cmluZyh0ZXh0KTsKLQkJbV9saW5lID0gbGluZTsKLQkJbV9jaGFyQmVnaW4gPSBjaGFyQmVnaW47Ci0JCW1fbGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaW50IHN0cmluZ1N0YXJ0ID0gc3RhcnQgLSBtX2NoYXJCZWdpbjsKLQkJU3RyaW5nIG9sZFN0cmluZyA9IG1fdGV4dDsKLQkJbV90ZXh0ID0gb2xkU3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmdTdGFydCk7Ci0JCW1fdGV4dCArPSBvbGRTdHJpbmcuc3Vic3RyaW5nKHN0cmluZ1N0YXJ0ICsgbGVuZ3RoKTsKLQotCQltX2xlbmd0aCA9IG1fdGV4dC5sZW5ndGgoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJuZXcgc3RyaW5nID0gIiArIG1fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhZeXRva2VuIG90aGVyKSB7Ci0JCXJldHVybiBtX3R5cGUgPT0gb3RoZXIuZ2V0VHlwZSgpICYmIG1fdGV4dC5lcXVhbHMob3RoZXIuZ2V0VGV4dCgpKSAmJiBtX2xpbmUgPT0gb3RoZXIuZ2V0U3RhcnRMaW5lKCkgJiYgbV9jaGFyQmVnaW4gPT0gb3RoZXIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBtX2xlbmd0aCA9PSBvdGhlci5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIG1fY2hhckJlZ2luICsgbV9sZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBtX2xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpIHsKLQkJcmV0dXJuIG1fbGluZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbV9jaGFyQmVnaW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gbV90ZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIG1fdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgc3RhcnRPZmZzZXQpIHsKLQkJbV9jaGFyQmVnaW4gPSBzdGFydE9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlRleHQgICA6ICIgKyBtX3RleHQgKyAiXG50eXBlIDogIiArIG1fdHlwZSArICJcbmxpbmUgIDogIiArIG1fbGluZSArICJcbmNCZWcuIDogIiArIG1fY2hhckJlZ2luICsgIlxuY0VuZC4gOiAiICsgZ2V0RW5kT2Zmc2V0KCkgKyAiXG5jTGVuZ3RoLiA6ICIgKyBtX2xlbmd0aDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVPZmZzZXQoaW50IGRlbHRhKSB7Ci0JCW1fY2hhckJlZ2luICs9IGRlbHRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJbV90ZXh0ID0gbmV3VGV4dDsKLQkJbV9sZW5ndGggPSBuZXdUZXh0Lmxlbmd0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZC5mbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkLmZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTE0YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkLmZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotCi0vKiogCi0gKiBHZW5lcmF0ZSB3aXRoICJkdGRza2VsZXRvbiIuCi0gKgotICogSXQgcmVtb3ZlcyBzb21lIHVudXNlZCBmaWVsZHMgYW5kIGF2b2lkcyBzb21lIGNvbXBpbGVyIHdhcm5pbmdzIAotICovCi0KLSUlCi0KLSV7Ci0JaW50IG5vZGVfY291bnQgPSAwOwotCVN0cmluZyBjdXJyZW50U3RyaW5nOwotCi0JcHJpdmF0ZSBUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3IFRva2VuKHR5cGUsIHl5dGV4dCgpLCB5eWxpbmUsIHl5Y2hhciArIHN0YXJ0T2Zmc2V0LCB5eWxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKLQkJdGhpcy55eWxpbmUgPSBsaW5lOwotCX0KLSV9Ci0KLSVjbGFzcyBEVERUb2tlbml6ZXIKLSVwdWJsaWMKLSV1bmljb2RlCi0lY2hhcgotCi0lc3RhdGUgTk9ERQotJXN0YXRlIEVMRU1FTlRfTkFNRQotJXN0YXRlIEVMRU1FTlRfQ09OVEVOVAotJXN0YXRlIEVMRU1FTlRfTUlYRURfT1JfQ0hJTEQKLSVzdGF0ZSBFTEVNRU5UX01JWEVECi0lc3RhdGUgRUxFTUVOVF9DSElMRAotJXN0YXRlIEVOVElUWV9OQU1FCi0lc3RhdGUgRU5USVRZX0NPTlRFTlQKLSVzdGF0ZSBOREFUQV9DT05URU5UCi0KLSVzdGF0ZSBOT1RBVElPTl9OQU1FCi0lc3RhdGUgRVhURVJOQUxJRF9DT05URU5UCi0KLSVzdGF0ZSBDT01NRU5UX0NPTlRFTlQKLSVzdGF0ZSBBVFRMSVNUX05BTUUKLSVzdGF0ZSBBVFRMSVNUX0NPTlRFTlQKLSVzdGF0ZSBBVFRSSUJVVEVfQ09OVEVOVAotJXN0YXRlIEFUVFJJQlVURV9ERUZBVUxUCi0lc3RhdGUgQVRUUklCVVRFX0VOVU1FUkFUSU9OCi0KLQotQUxQSEE9W0EtWmEtel0KLURJR0lUPVswLTldCi1OT05ORVdMSU5FX1dISVRFX1NQQUNFX0NIQVI9W1wgXHRcYlwwMTJdCi1TVFJJTkdfVEVYVD0oXFxcInxbXlxuXHJcIl18XFx7V0hJVEVfU1BBQ0VfQ0hBUn0rXFwpKgotQ09NTUVOVF9URVhUPShbXiovXG5dfFteKlxuXSIvIlteKlxuXXxbXi9cbl0iKiJbXi9cbl18IioiW14vXG5dfCIvIlteKlxuXSkqCi1JZGVudCA9IHtBTFBIQX0oe0FMUEhBfXx7RElHSVR9fF8pKgotSW5wdXRDaGFyYWN0ZXIgPSBbXlxyXG5dCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG58XHJcbgotCi0vKiAzIC0gV2hpdGUgU3BhY2UgKi8KLVMgICAgICAgICAgICAgID0gICAgKFx4MjAgfCBceDA5IHwgXHgwRCB8IFx4MEEpKwotTm9uTGluZVRlcm1pbmF0b3JXaGl0ZXNwYWNlID0gKFx4MjAgfCBceDA5KSsKLQotV2hpdGVTcGFjZSAgICAgPSB7TGluZVRlcm1pbmF0b3J9IHwgWyBcdFxmXQotCi0vKiA4NCAqLwotLypMZXR0ZXIgICAgICAgICA9ICAgIHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9Ci0KLS8qIDg1ICovCi1CYXNlQ2hhciAgICAgICA9ICAgIFtcdTAwNDEtXHUwMDVBXSB8IFtcdTAwNjEtXHUwMDdBXSB8IFtcdTAwQzAtXHUwMEQ2XSB8IFtcdTAwRDgtXHUwMEY2XSB8IFtcdTAwRjgtXHUwMEZGXSB8IFtcdTAxMDAtXHUwMTMxXSB8IFtcdTAxMzQtXHUwMTNFXSB8IFtcdTAxNDEtXHUwMTQ4XSB8IFtcdTAxNEEtXHUwMTdFXSB8IFtcdTAxODAtXHUwMUMzXSB8IFtcdTAxQ0QtXHUwMUYwXSB8IFtcdTAxRjQtXHUwMUY1XSB8IFtcdTAxRkEtXHUwMjE3XSB8IFtcdTAyNTAtXHUwMkE4XSB8IFtcdTAyQkItXHUwMkMxXSB8IFx1MDM4NiB8IFtcdTAzODgtXHUwMzhBXSB8IFx1MDM4QyB8IFtcdTAzOEUtXHUwM0ExXSB8IFtcdTAzQTMtXHUwM0NFXSB8IFtcdTAzRDAtXHUwM0Q2XSB8IFx1MDNEQSB8IFx1MDNEQyB8IFx1MDNERSB8IFx1MDNFMCB8IFtcdTAzRTItXHUwM0YzXSB8IFtcdTA0MDEtXHUwNDBDXSB8IFtcdTA0MEUtXHUwNDRGXSB8IFtcdTA0NTEtXHUwNDVDXSB8IFtcdTA0NUUtXHUwNDgxXSB8IFtcdTA0OTAtXHUwNEM0XSB8IFtcdTA0QzctXHUwNEM4XSB8IFtcdTA0Q0ItXHUwNENDXSB8IFtcdTA0RDAtXHUwNEVCXSB8IFtcdTA0RUUtXHUwNEY1XSB8IFtcdTA0RjgtXHUwNEY5XSB8IFtcdTA1MzEtXHUwNTU2XSB8IFx1MDU1OSB8IFtcdTA1NjEtXHUwNTg2XSB8IFtcdTA1RDAtXHUwNUVBXSB8IFtcdTA1RjAtXHUwNUYyXSB8IFtcdTA2MjEtXHUwNjNBXSB8IFtcdTA2NDEtXHUwNjRBXSB8IFtcdTA2NzEtXHUwNkI3XSB8IFtcdTA2QkEtXHUwNkJFXSB8IFtcdTA2QzAtXHUwNkNFXSB8IFtcdTA2RDAtXHUwNkQzXSB8IFx1MDZENSB8IFtcdTA2RTUtXHUwNkU2XSB8IFtcdTA5MDUtXHUwOTM5XSB8IFx1MDkzRCB8IFtcdTA5NTgtXHUwOTYxXSB8IFtcdTA5ODUtXHUwOThDXSB8IFtcdTA5OEYtXHUwOTkwXSB8IFtcdTA5OTMtXHUwOUE4XSB8IFtcdTA5QUEtXHUwOUIwXSB8IFx1MDlCMiB8IFtcdTA5QjYtXHUwOUI5XSB8IFtcdTA5REMtXHUwOUREXSB8IFtcdTA5REYtXHUwOUUxXSB8IFtcdTA5RjAtXHUwOUYxXSB8IFtcdTBBMDUtXHUwQTBBXSB8IFtcdTBBMEYtXHUwQTEwXSB8IFtcdTBBMTMtXHUwQTI4XSB8IFtcdTBBMkEtXHUwQTMwXSB8IFtcdTBBMzItXHUwQTMzXSB8IFtcdTBBMzUtXHUwQTM2XSB8IFtcdTBBMzgtXHUwQTM5XSB8IFtcdTBBNTktXHUwQTVDXSB8IFx1MEE1RSB8IFtcdTBBNzItXHUwQTc0XSB8IFtcdTBBODUtXHUwQThCXSB8IFx1MEE4RCB8IFtcdTBBOEYtXHUwQTkxXSB8IFtcdTBBOTMtXHUwQUE4XSB8IFtcdTBBQUEtXHUwQUIwXSB8IFtcdTBBQjItXHUwQUIzXSB8IFtcdTBBQjUtXHUwQUI5XSB8IFx1MEFCRCB8IFx1MEFFMCB8IFtcdTBCMDUtXHUwQjBDXSB8IFtcdTBCMEYtXHUwQjEwXSB8IFtcdTBCMTMtXHUwQjI4XSB8IFtcdTBCMkEtXHUwQjMwXSB8IFtcdTBCMzItXHUwQjMzXSB8IFtcdTBCMzYtXHUwQjM5XSB8IFx1MEIzRCB8IFtcdTBCNUMtXHUwQjVEXSB8IFtcdTBCNUYtXHUwQjYxXSB8IFtcdTBCODUtXHUwQjhBXSB8IFtcdTBCOEUtXHUwQjkwXSB8IFtcdTBCOTItXHUwQjk1XSB8IFtcdTBCOTktXHUwQjlBXSB8IFx1MEI5QyB8IFtcdTBCOUUtXHUwQjlGXSB8IFtcdTBCQTMtXHUwQkE0XSB8IFtcdTBCQTgtXHUwQkFBXSB8IFtcdTBCQUUtXHUwQkI1XSB8IFtcdTBCQjctXHUwQkI5XSB8IFtcdTBDMDUtXHUwQzBDXSB8IFtcdTBDMEUtXHUwQzEwXSB8IFtcdTBDMTItXHUwQzI4XSB8IFtcdTBDMkEtXHUwQzMzXSB8IFtcdTBDMzUtXHUwQzM5XSB8IFtcdTBDNjAtXHUwQzYxXSB8IFtcdTBDODUtXHUwQzhDXSB8IFtcdTBDOEUtXHUwQzkwXSB8IFtcdTBDOTItXHUwQ0E4XSB8IFtcdTBDQUEtXHUwQ0IzXSB8IFtcdTBDQjUtXHUwQ0I5XSB8IFx1MENERSB8IFtcdTBDRTAtXHUwQ0UxXSB8IFtcdTBEMDUtXHUwRDBDXSB8IFtcdTBEMEUtXHUwRDEwXSB8IFtcdTBEMTItXHUwRDI4XSB8IFtcdTBEMkEtXHUwRDM5XSB8IFtcdTBENjAtXHUwRDYxXSB8IFtcdTBFMDEtXHUwRTJFXSB8IFx1MEUzMCB8IFtcdTBFMzItXHUwRTMzXSB8IFtcdTBFNDAtXHUwRTQ1XSB8IFtcdTBFODEtXHUwRTgyXSB8IFx1MEU4NCB8IFtcdTBFODctXHUwRTg4XSB8IFx1MEU4QSB8IFx1MEU4RCB8IFtcdTBFOTQtXHUwRTk3XSB8IFtcdTBFOTktXHUwRTlGXSB8IFtcdTBFQTEtXHUwRUEzXSB8IFx1MEVBNSB8IFx1MEVBNyB8IFtcdTBFQUEtXHUwRUFCXSB8IFtcdTBFQUQtXHUwRUFFXSB8IFx1MEVCMCB8IFtcdTBFQjItXHUwRUIzXSB8IFx1MEVCRCB8IFtcdTBFQzAtXHUwRUM0XSB8IFtcdTBGNDAtXHUwRjQ3XSB8IFtcdTBGNDktXHUwRjY5XSB8IFtcdTEwQTAtXHUxMEM1XSB8IFtcdTEwRDAtXHUxMEY2XSB8IFx1MTEwMCB8IFtcdTExMDItXHUxMTAzXSB8IFtcdTExMDUtXHUxMTA3XSB8IFx1MTEwOSB8IFtcdTExMEItXHUxMTBDXSB8IFtcdTExMEUtXHUxMTEyXSB8IFx1MTEzQyB8IFx1MTEzRSB8IFx1MTE0MCB8IFx1MTE0QyB8IFx1MTE0RSB8IFx1MTE1MCB8IFtcdTExNTQtXHUxMTU1XSB8IFx1MTE1OSB8IFtcdTExNUYtXHUxMTYxXSB8IFx1MTE2MyB8IFx1MTE2NSB8IFx1MTE2NyB8IFx1MTE2OSB8IFtcdTExNkQtXHUxMTZFXSB8IFtcdTExNzItXHUxMTczXSB8IFx1MTE3NSB8IFx1MTE5RSB8IFx1MTFBOCB8IFx1MTFBQiB8IFtcdTExQUUtXHUxMUFGXSB8IFtcdTExQjctXHUxMUI4XSB8IFx1MTFCQSB8IFtcdTExQkMtXHUxMUMyXSB8IFx1MTFFQiB8IFx1MTFGMCB8IFx1MTFGOSB8IFtcdTFFMDAtXHUxRTlCXSB8IFtcdTFFQTAtXHUxRUY5XSB8IFtcdTFGMDAtXHUxRjE1XSB8IFtcdTFGMTgtXHUxRjFEXSB8IFtcdTFGMjAtXHUxRjQ1XSB8IFtcdTFGNDgtXHUxRjREXSB8IFtcdTFGNTAtXHUxRjU3XSB8IFx1MUY1OSB8IFx1MUY1QiB8IFx1MUY1RCB8IFtcdTFGNUYtXHUxRjdEXSB8IFtcdTFGODAtXHUxRkI0XSB8IFtcdTFGQjYtXHUxRkJDXSB8IFx1MUZCRSB8IFtcdTFGQzItXHUxRkM0XSB8IFtcdTFGQzYtXHUxRkNDXSB8IFtcdTFGRDAtXHUxRkQzXSB8IFtcdTFGRDYtXHUxRkRCXSB8IFtcdTFGRTAtXHUxRkVDXSB8IFtcdTFGRjItXHUxRkY0XSB8IFtcdTFGRjYtXHUxRkZDXSB8IFx1MjEyNiB8IFtcdTIxMkEtXHUyMTJCXSB8IFx1MjEyRSB8IFtcdTIxODAtXHUyMTgyXSB8IFtcdTMwNDEtXHUzMDk0XSB8IFtcdTMwQTEtXHUzMEZBXSB8IFtcdTMxMDUtXHUzMTJDXSB8IFtcdUFDMDAtXHVEN0EzXSAgCi0KLS8qIDg2ICovCi1JZGVvZ3JhcGhpYyAgICA9ICAgIFtcdTRFMDAtXHU5RkE1XSB8IFx1MzAwNyB8IFtcdTMwMjEtXHUzMDI5XSAgCi0KLS8qIDQgKi8gIC8qIGlzICcuJyB0byBiZSBlc2NhcGVkPz8gKi8KLU5hbWVDaGFyICAgICAgID0gICAge0xldHRlcn0gfCB7RGlnaXR9IHwgLiB8IC0gfCBfIHwgOiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0KLQotLyogNSAqLwotTmFtZSAgICAgICAgICAgPSAoe0xldHRlcn0gfCBfIHwgOikge05hbWVDaGFyfSogCi0KLS8qIDg3ICovCi1Db21iaW5pbmdDaGFyICA9ICAgIFtcdTAzMDAtXHUwMzQ1XSB8IFtcdTAzNjAtXHUwMzYxXSB8IFtcdTA0ODMtXHUwNDg2XSB8IFtcdTA1OTEtXHUwNUExXSB8IFtcdTA1QTMtXHUwNUI5XSB8IFtcdTA1QkItXHUwNUJEXSB8IFx1MDVCRiB8IFtcdTA1QzEtXHUwNUMyXSB8IFx1MDVDNCB8IFtcdTA2NEItXHUwNjUyXSB8IFx1MDY3MCB8IFtcdTA2RDYtXHUwNkRDXSB8IFtcdTA2REQtXHUwNkRGXSB8IFtcdTA2RTAtXHUwNkU0XSB8IFtcdTA2RTctXHUwNkU4XSB8IFtcdTA2RUEtXHUwNkVEXSB8IFtcdTA5MDEtXHUwOTAzXSB8IFx1MDkzQyB8IFtcdTA5M0UtXHUwOTRDXSB8IFx1MDk0RCB8IFtcdTA5NTEtXHUwOTU0XSB8IFtcdTA5NjItXHUwOTYzXSB8IFtcdTA5ODEtXHUwOTgzXSB8IFx1MDlCQyB8IFx1MDlCRSB8IFx1MDlCRiB8IFtcdTA5QzAtXHUwOUM0XSB8IFtcdTA5QzctXHUwOUM4XSB8IFtcdTA5Q0ItXHUwOUNEXSB8IFx1MDlENyB8IFtcdTA5RTItXHUwOUUzXSB8IFx1MEEwMiB8IFx1MEEzQyB8IFx1MEEzRSB8IFx1MEEzRiB8IFtcdTBBNDAtXHUwQTQyXSB8IFtcdTBBNDctXHUwQTQ4XSB8IFtcdTBBNEItXHUwQTREXSB8IFtcdTBBNzAtXHUwQTcxXSB8IFtcdTBBODEtXHUwQTgzXSB8IFx1MEFCQyB8IFtcdTBBQkUtXHUwQUM1XSB8IFtcdTBBQzctXHUwQUM5XSB8IFtcdTBBQ0ItXHUwQUNEXSB8IFtcdTBCMDEtXHUwQjAzXSB8IFx1MEIzQyB8IFtcdTBCM0UtXHUwQjQzXSB8IFtcdTBCNDctXHUwQjQ4XSB8IFtcdTBCNEItXHUwQjREXSB8IFtcdTBCNTYtXHUwQjU3XSB8IFtcdTBCODItXHUwQjgzXSB8IFtcdTBCQkUtXHUwQkMyXSB8IFtcdTBCQzYtXHUwQkM4XSB8IFtcdTBCQ0EtXHUwQkNEXSB8IFx1MEJENyB8IFtcdTBDMDEtXHUwQzAzXSB8IFtcdTBDM0UtXHUwQzQ0XSB8IFtcdTBDNDYtXHUwQzQ4XSB8IFtcdTBDNEEtXHUwQzREXSB8IFtcdTBDNTUtXHUwQzU2XSB8IFtcdTBDODItXHUwQzgzXSB8IFtcdTBDQkUtXHUwQ0M0XSB8IFtcdTBDQzYtXHUwQ0M4XSB8IFtcdTBDQ0EtXHUwQ0NEXSB8IFtcdTBDRDUtXHUwQ0Q2XSB8IFtcdTBEMDItXHUwRDAzXSB8IFtcdTBEM0UtXHUwRDQzXSB8IFtcdTBENDYtXHUwRDQ4XSB8IFtcdTBENEEtXHUwRDREXSB8IFx1MEQ1NyB8IFx1MEUzMSB8IFtcdTBFMzQtXHUwRTNBXSB8IFtcdTBFNDctXHUwRTRFXSB8IFx1MEVCMSB8IFtcdTBFQjQtXHUwRUI5XSB8IFtcdTBFQkItXHUwRUJDXSB8IFtcdTBFQzgtXHUwRUNEXSB8IFtcdTBGMTgtXHUwRjE5XSB8IFx1MEYzNSB8IFx1MEYzNyB8IFx1MEYzOSB8IFx1MEYzRSB8IFx1MEYzRiB8IFtcdTBGNzEtXHUwRjg0XSB8IFtcdTBGODYtXHUwRjhCXSB8IFtcdTBGOTAtXHUwRjk1XSB8IFx1MEY5NyB8IFtcdTBGOTktXHUwRkFEXSB8IFtcdTBGQjEtXHUwRkI3XSB8IFx1MEZCOSB8IFtcdTIwRDAtXHUyMERDXSB8IFx1MjBFMSB8IFtcdTMwMkEtXHUzMDJGXSB8IFx1MzA5OSB8IFx1MzA5QSAgCi0KLS8qIDg4ICovCi1EaWdpdCAgICAgICAgICA9ICAgIFtcdTAwMzAtXHUwMDM5XSB8IFtcdTA2NjAtXHUwNjY5XSB8IFtcdTA2RjAtXHUwNkY5XSB8IFtcdTA5NjYtXHUwOTZGXSB8IFtcdTA5RTYtXHUwOUVGXSB8IFtcdTBBNjYtXHUwQTZGXSB8IFtcdTBBRTYtXHUwQUVGXSB8IFtcdTBCNjYtXHUwQjZGXSB8IFtcdTBCRTctXHUwQkVGXSB8IFtcdTBDNjYtXHUwQzZGXSB8IFtcdTBDRTYtXHUwQ0VGXSB8IFtcdTBENjYtXHUwRDZGXSB8IFtcdTBFNTAtXHUwRTU5XSB8IFtcdTBFRDAtXHUwRUQ5XSB8IFtcdTBGMjAtXHUwRjI5XSAgCi0KLS8qIDg5ICovCi1FeHRlbmRlciAgICAgICA9ICAgIFx1MDBCNyB8IFx1MDJEMCB8IFx1MDJEMSB8IFx1MDM4NyB8IFx1MDY0MCB8IFx1MEU0NiB8IFx1MEVDNiB8IFx1MzAwNSB8IFtcdTMwMzEtXHUzMDM1XSB8IFtcdTMwOUQtXHUzMDlFXSB8IFtcdTMwRkMtXHUzMEZFXSAgCi0qLwotCi1MZXR0ZXIgICAgICAgICA9IFthLXpBLVpdCi1OYW1lQ2hhciAgICAgICA9IHtMZXR0ZXJ9IHwgWzAtOV0KLS8vTmFtZSAgICAgICAgICAgPSAoe0xldHRlcn0gfCBfIHwgOikge05hbWVDaGFyfSogCi0vL05hbWUgICAgICAgICAgID0gW15ceDIwXHgwOVx4MERceDBBXSsKLU5hbWUgICAgICAgICAgID0gW15ceDIwXHgwOVx4MERceDBBXHwsXCFcP1wrXCpcKFwpPD5dKwotRWxlbWVudFJlZk5hbWUgPSBbXlx4MjBceDA5XHgwRFx4MEFcfCxcP1wrXCpcKFwpPD5dKwotRW50aXR5TmFtZSAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFcfCxcP1wqXChcKTw+XSsKLVBhcm1FbnRpdHlOYW1lID0gW15ceDIwXHgwOVx4MERceDBBXCElOzw+XSsKLQotQ29tbWVudFN0YXJ0ICAgPSBcIS0tCi1Db21tZW50Q29udGVudCA9IFteLT5dKwotQ29tbWVudEVuZCAgICAgPSAtLT4KLUVsZW1lbnRTdGFydCAgID0gRUxFTUVOVAotRWxlbWVudENvbnRlbnQgPSBbXjw+XSoKLQotRW50aXR5U3RhcnQgICAgPSBFTlRJVFkKLUVudGl0eV9QYXJtICAgID0gJXtTfQotRW50aXR5Q29udGVudCAgPSB7U31bXjw+XSoKLQotTm90YXRpb25TdGFydCAgPSBOT1RBVElPTgotTm90YXRpb25Db250ZW50ID0ge1N9W148Pl0qCi1BdHRMaXN0ICAgICAgICA9IEFUVExJU1QKLUV4dGVybmFsUGFybUVudGl0eVJlZiA9ICV7UGFybUVudGl0eU5hbWV9OwotRW5kVGFnICAgICAgICAgPSA+Ci1TdGFydFRhZyAgICAgICA9IDwKLVN5c3RlbSAgICAgICAgID0gU1lTVEVNCi1QdWJsaWMgICAgICAgICA9IFBVQkxJQwotTkRhdGEgICAgICAgICAgPSBOREFUQQotCi0vLyB0aGVzZSBhcmUgYXR0cmlidXRlIHR5cGUga2V5d29yZHMKLS8vICAgd2UgcmV1c2UgTk9UQVRJT04gZnJvbSBOb3RhdGlvblN0YXJ0Ci0vLyAgIHdlIHJldXNlIEVOVElUWSBmcm9tIEVudGl0eVN0YXJ0Ci1DRGF0YSAgICAgICAgICA9IENEQVRBCi1JRCAgICAgICAgICAgICA9IElECi1JRFJlZiAgICAgICAgICA9IElEUkVGCi1JRFJlZnMgICAgICAgICA9IElEUkVGUwotRW50aXRpZXMgICAgICAgPSBFTlRJVElFUwotTk1Ub2tlbiAgICAgICAgPSBOTVRPS0VOCi1OTVRva2VucyAgICAgICA9IE5NVE9LRU5TCi0KLS8vIHRoZXNlIGFyZSBhdHRyaWJ1dGUgZGVmYXVsdHMga2V5d29yZHMKLVJlcXVpcmVkICAgICAgID0gI1JFUVVJUkVECi1JbXBsaWVkICAgICAgICA9ICNJTVBMSUVECi1GaXhlZCAgICAgICAgICA9ICNGSVhFRAotCi0KLUVtcHR5ICAgICAgICAgID0gRU1QVFkKLUFueSAgICAgICAgICAgID0gQU5ZCi1QY0RhdGEgICAgICAgICA9ICNQQ0RBVEEKLUxlZnRQYXJlbiAgICAgID0gXCgKLVJpZ2h0UGFyZW4gICAgID0gXCkKLQotUGVyY2VudCAgICAgICAgPSAlCi1TZW1pY29sb24gICAgICA9IDsKLVBsdXMgICAgICAgICAgID0gXCsKLUNob2ljZSAgPSBcfAotU2VxdWVuY2UgPSAsCi1Db25uZWN0b3IgICAgICA9IHtDaG9pY2V9fHtTZXF1ZW5jZX0KLU9jY3VyT3B0aW9uYWwgID0gXD8KLU9jY3VyT25lT3JNb3JlID0gXCsKLU9jY3VyWmVyb09yTW9yZSA9IFwqCi1PY2N1clR5cGUgICAgICA9IHtPY2N1ck9wdGlvbmFsfXx7T2NjdXJPbmVPck1vcmV9fHtPY2N1clplcm9Pck1vcmV9Ci1FeGNsYW1hdGlvbiAgID0gXCEKLVNpbmdsZVF1b3RlZExpdGVyYWwgPSAnW14nXSonCi1Eb3VibGVRdW90ZWRMaXRlcmFsID0gXCJbXlwiXSpcIgotTm9uVGFnQ29udGVudCA9IFteXHgyMFx4MDlceDBEXHgwQTw+XSoKLU5vbkVudW1Db250ZW50ID0gW15ceDIwXHgwOVx4MERceDBBPD5cKFwpXHxdKgotCi0lJQotCi08WVlJTklUSUFMPiB7Ci0gIHtTdGFydFRhZ30gICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHKTsgfQotICB7RW5kVGFnfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVORF9UQUcpOyB9Ci0gIHtFeGNsYW1hdGlvbn0gICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pOyB9Ci0gIHtQZXJjZW50fSAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7IH0KLSAge1NlbWljb2xvbn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TRU1JQ09MT04pOyB9Ci0KLSAge0VsZW1lbnRTdGFydH0gICB7IHl5YmVnaW4oRUxFTUVOVF9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKTsgfQotICB7Q29tbWVudFN0YXJ0fSAgIHsgeXliZWdpbihDT01NRU5UX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7IH0KLSAge0VudGl0eVN0YXJ0fSAgICB7IHl5YmVnaW4oRU5USVRZX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7IH0KLSAge05vdGF0aW9uU3RhcnR9ICB7IHl5YmVnaW4oTk9UQVRJT05fTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpOyB9Ci0gIHtBdHRMaXN0fSAgICAgICAgeyB5eWJlZ2luKEFUVExJU1RfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyk7IH0KLQotICB7RXh0ZXJuYWxQYXJtRW50aXR5UmVmfSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsgfQotLy8ganVzdCBhIHBhcm1lbnRpdHluYW1lIGJ5IGl0c2VsZiBpcyBubyBnb29kLiAgd2UgdXNlIHRoaXMKLS8vIHRvIGNhcHR1cmUgZ2FyYmFnZSBjb250ZW50IGF0IHRoZSB0b3AgbGV2ZWwKLSAge1Bhcm1FbnRpdHlOYW1lfSAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotfQotCi08RUxFTUVOVF9OQU1FPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1BjRGF0YX18XCh7U30qe1BjRGF0YX17U30qXCkgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOyB9Ci0gIHtOYW1lfSAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLQotICB7TGVmdFBhcmVufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyB9Ci0gIHtDb25uZWN0b3J9ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKTsgfSAgICAKLSAge09jY3VyVHlwZX0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKTsgfQotICB7UmlnaHRQYXJlbn0gICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgfQotCi0gIHtTdGFydFRhZ30gICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLSAge0VuZFRhZ30gICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi0vLyAqKioqKioqKiA8IUFUVExJU1QuLi4+Ci08QVRUTElTVF9OQU1FPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEFUVExJU1RfQ09OVEVOVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtOYW1lfSAgICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKTsgfQotICB7Tm9uVGFnQ29udGVudH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRSSUJVVEVfQ09OVEVOVD4gewotICB7TGluZVRlcm1pbmF0b3J9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyB9Ci0gIHtOb25MaW5lVGVybWluYXRvcldoaXRlc3BhY2V9Ci0gICAgICAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge0NEYXRhfSAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCk7IH0gIAotCi0gIHtJRH0gICAgICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQpOyB9ICAgICAgIAotICB7SURSZWZ9ICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEKTsgfSAgCi0gIHtJRFJlZnN9ICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEKTsgfSAgCi0gIHtFbnRpdHlTdGFydH0gICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEKTsgfSAgCi0gIHtFbnRpdGllc30gICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQpOyB9ICAKLSAge05NVG9rZW59ICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEKTsgfSAgCi0gIHtOTVRva2Vuc30gICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQpOyB9ICAKLSAge05vdGF0aW9uU3RhcnR9ICB7IHl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQpOyB9ICAKLQotICB7UmVxdWlyZWR9IHwge0ltcGxpZWR9IHwge0ZpeGVkfSB8IHtTaW5nbGVRdW90ZWRMaXRlcmFsfSB8IHsgRG91YmxlUXVvdGVkTGl0ZXJhbH0KLSAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyB9Ci0KLSAge0xlZnRQYXJlbn0gICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsgfSAgCi0gIHtOb25FbnVtQ29udGVudH0geyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBBUk1fRU5USVRZX1RZUEUpOyB9Ci0gIHtOb25FbnVtQ29udGVudH18e1JpZ2h0UGFyZW59fHtDaG9pY2V9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUUklCVVRFX0RFRkFVTFQ+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7UmVxdWlyZWR9ICAgICAgIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCk7IH0KLSAge0ltcGxpZWR9ICAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCk7IH0KLSAge0ZpeGVkfSAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JEKTsgfQotICB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IH0gLy9yZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEFUVFJJQlVURV9FTlVNRVJBVElPTj4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtMZWZ0UGFyZW59ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTik7IH0KLSAge0Nob2ljZX0gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlVNX0NIT0lDRSk7IH0KLSAge1JpZ2h0UGFyZW59ICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyB9Ci0gIHtOb25FbnVtQ29udGVudH0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotCi0vLyAqKioqKioqKiA8IUVOVElUWS4uLj4KLTxFTlRJVFlfTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtQZXJjZW50fSAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7IH0KLSAge0VudGl0eU5hbWV9ICAgICB7IHl5YmVnaW4oRU5USVRZX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxFTlRJVFlfQ09OVEVOVD4gewotLy8gIHtFbnRpdHlDb250ZW50fSB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9DT05URU5UKTsgfQotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtTeXN0ZW19IHwge1B1YmxpY30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7IH0KLSAge1NpbmdsZVF1b3RlZExpdGVyYWx9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0KLSAge0RvdWJsZVF1b3RlZExpdGVyYWx9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotCi0vLyAqKioqKioqKiA8IU5PVEFUSU9OLi4uPgotPE5PVEFUSU9OX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxFWFRFUk5BTElEX0NPTlRFTlQ+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7U3lzdGVtfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JEKTsgfSAgCi0gIHtQdWJsaWN9ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOyB9ICAKLSAge1NpbmdsZVF1b3RlZExpdGVyYWx9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0KLSAge0RvdWJsZVF1b3RlZExpdGVyYWx9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7IH0KLSAge05EYXRhfSAgICAgICAgICB7IHl5YmVnaW4oTkRBVEFfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JEKTsgfQotICB7Tm9uVGFnQ29udGVudH0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08TkRBVEFfQ09OVEVOVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0gIAotCi0vLyAqKioqKioqKiA8IS0tIC4uLj4KLTxDT01NRU5UX0NPTlRFTlQ+IHsKLSAge0NvbW1lbnRFbmR9ICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsgfQotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtDb21tZW50Q29udGVudH0gfCAiLSIgfCAiPiIgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCk7IH0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGRza2VsZXRvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZHNrZWxldG9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGJlMDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZHNrZWxldG9uCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0tLS0gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0JVRkZFUlNJWkUgPSAuLi47Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0tLS0gIGxleGljYWwgc3RhdGVzLCBjaGFybWFwCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLS0tLSBpc0ZpbmFsIGxpc3QKLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyW1lZX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBpbnQgeXljb2x1bW47IAotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotLS0tIHVzZXIgY2xhc3MgY29kZQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfcmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPCAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoeXlfcmVhZGVyICE9IG51bGwpCi0gICAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgY3VycmVudCBzdHJlYW0sIGFuZCByZXNldHMgdGhlCi0gICAqIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5ZWV9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXljbG9zZSgpOwotICAgIHl5X3JlYWRlciA9IHJlYWRlcjsKLSAgICB5eV9hdEVPRiAgPSBmYWxzZTsKLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkID0gMDsKLSAgICB5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3MgPSAwOwotICAgIHl5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIGZpbmFsIHB1YmxpYyBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotLS0tIHl5X1NjYW5FcnJvciBkZWNsYXJhdGlvbiAgCi0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotLS0tIHRocm93cyBjbGF1c2UKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotLS0tIHl5cHVzaGJhY2sgZGVjbCAoY29udGFpbnMgeXlfU2NhbkVycm9yIGV4Y2VwdGlvbikKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLS0tLSB5eV9kb0VvZgotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotLS0tIHl5bGV4IGRlY2xhcmF0aW9uCi0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB5eV9jdXJyZW50UG9zX2w7Ci0gICAgaW50IHl5X21hcmtlZFBvc19sOwotICAgIGludCB5eV9lbmRSZWFkX2wgPSB5eV9lbmRSZWFkOwotICAgIGNoYXIgW10geXlfYnVmZmVyX2wgPSB5eV9idWZmZXI7Ci0gICAgY2hhciBbXSB5eWNtYXBfbCA9IHl5Y21hcDsKLQotLS0tIGxvY2FsIGRlY2xhcmF0aW9ucwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHl5X21hcmtlZFBvc19sID0geXlfbWFya2VkUG9zOwotCi0tLS0gc3RhcnQgYWRtaW4gKGxpbmUsIGNoYXIsIGNvbCBjb3VudCkKLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zX2wgPSB5eV9jdXJyZW50UG9zID0gCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvc19sOwotICAKLS0tLSBzdGFydCBhZG1pbiAobGV4c3RhdGUgZXRjKQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLS0tLSBuZXh0IGlucHV0LCBsaW5lLCBjb2wsIGNoYXIgY291bnQsIG5leHQgdHJhbnNpdGlvbiwgaXNGaW5hbCBhY3Rpb24KLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvc19sID0geXlfY3VycmVudFBvc19sOyAKLS0tLSBsaW5lIGNvdW50IHVwZGF0ZQotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB5eV9tYXJrZWRQb3MgPSB5eV9tYXJrZWRQb3NfbDsKLS0tLSBjaGFyIGNvdW50IHVwZGF0ZQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgewotCi0tLS0gYWN0aW9ucwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLS0tLSBlb2Z2YWx1ZQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0tLS0gbm8gbWF0Y2gKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLS0tLSBtYWluCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERCYXRjaE5vZGVEZWxldGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERCYXRjaE5vZGVEZWxldGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZTk4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREQmF0Y2hOb2RlRGVsZXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERCYXRjaE5vZGVEZWxldGUgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBEVERCYXRjaE5vZGVEZWxldGUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGhlIG5vZGUgaXMgY29udGFpbmVkIGJ5IGFueW9uZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQotCQkJaWYgKGN1cnJlbnROb2RlLmNvbnRhaW5zUmFuZ2Uobm9kZS5nZXRTdGFydE9mZnNldCgpLCBub2RlLmdldEVuZE9mZnNldCgpKSkgewotCQkJCS8vIHRoZW4gbm8gbmVlZCB0byBhZGQgdGhlIG5vZGUgdG8gdGhlIGxpc3QgdG8gYmUgZGVsZXRlZAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgJiYgbm9kZS5nZXRFbmRPZmZzZXQoKSA8PSBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZXMuYWRkKGksIG5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBnZXQgaGVyZSwgdGhlbiBhZGQgaXQgdG8gdGhlIGVuZAotCQlub2Rlcy5hZGQobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZXMoT2JqZWN0IHJlcXVlc3RvcikgewotCQlmb3IgKGludCBpID0gbm9kZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQlkdGRGaWxlLmRlbGV0ZU5vZGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQlub2Rlcy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxYWJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotCi0KLS8qCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUgbW9kZWwgd2hlbiBpdGVtcyBhcmUgZGVsZXRlZCBvcgotICogc28gdGhhdCBpdGVtcyByZWZlcmVuY2VkIGJ5IGl0IGFyZSBjbGVhbmVkIHVwIG5vdGUgdGhhdCB0b3AgbGV2ZWwgbm9kZXMgYXJlCi0gKiBxdWV1ZWQgdXAgZm9yIGRlbGV0aW9uIHNvIHRoYXQgaXRlcmF0aW9uIG92ZXIgdGhlIGxpc3Qgb2Ygbm9kZXMgZnJvbSB0aGUKLSAqIGR0ZGZpbGUgaXMgbm90IG1lc3NlZCB1cC4gTm90ZSB0aGF0IHdoZW4gYW4gZXh0ZXJuYWwgcGFybWV0ZXIgZW50aXR5Ci0gKiBjaGFuZ2VzLCB0aGUgY2xpZW50IG9mIHRoZSBtb2RlbCAoZS5nLiBlZGl0b3IpIG11c3QgYmUgYSBEVERGaWxlTGlzdGVuZXIKLSAqIGltcGxlbWVudGluZyB0aGUgbGlzdGVuZXIncyBpbnRlcmZhY2UgdG8ga2VlcCB0aGUgbW9kZWwncyByZWZlcmVudGlhbAotICogaW50ZWdyaXR5IChTZWUgRFRETW9kZWxJbXBsIGZvciBleGFtcGxlKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0KLQlwcm90ZWN0ZWQgRFREQmF0Y2hOb2RlRGVsZXRlIGJhdGNoRGVsZXRlOwotCXByb3RlY3RlZCBMaXN0IGV4dGVybmFsRWxlbWVudHNBbmRQYXJtRW50aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgRFRETm9kZSBub2RlVG9EZWxldGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3RvcjsKLQotCXB1YmxpYyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZXh0ZXJuYWxSZWZlcmVuY2VBYm91dFRvQ2hhbmdlKE9iamVjdCByZXF1ZXN0b3IsIEVudGl0eSBlbnRpdHkpIHsKLQkJaWYgKGlzVXBkYXRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIWVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpIHx8ICFlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSwgaWdub3JlIGFzIHdlbGwKLQkJCXJldHVybjsKLQkJfQotCi0JCWlzVXBkYXRpbmcgPSB0cnVlOwotCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQotCQlEVERGaWxlIGR0ZEZpbGUgPSBlbnRpdHkuZ2V0RFRERmlsZSgpOwotCQlpZiAoYmF0Y2hEZWxldGUgPT0gbnVsbCkgewotCQkJYmF0Y2hEZWxldGUgPSBuZXcgRFREQmF0Y2hOb2RlRGVsZXRlKGR0ZEZpbGUpOwotCQl9Ci0KLQkJLy8gU2VlIHRoZSBjb21tZW50IGF0IHRoZSBoZWFkIG9mIHRoaXMgZmlsZSByZWdhcmRpbmcKLQkJLy8gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzLgotCQkvLyBleHRlcm5hbEVsZW1lbnRzQW5kUGFybUVudGl0aWVzID0KLQkJLy8gZHRkRmlsZS5nZXREVERNb2RlbCgpLmdldEV4dGVybmFsTW9kZWxzKCkuZ2V0RWxlbWVudENvbnRlbnROYW1lcyhlbnRpdHkuZ2V0UHVibGljSUQoKSwKLQkJLy8gZHRkRmlsZS5nZXREVERNb2RlbCgpLnJlc29sdmVJRChlbnRpdHkuZ2V0UHVibGljSUQoKSwKLQkJLy8gZW50aXR5LmdldFN5c3RlbUlEKCkpKTsKLQotCQl2aXNpdChkdGRGaWxlKTsKLQotCQliYXRjaERlbGV0ZS5kZWxldGVOb2RlcyhyZXF1ZXN0b3IpOwotCi0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcy5jb250YWlucyhuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVN0cmluZyBhdHRyVHlwZSA9IGF0dHIuZ2V0VHlwZSgpOwotCi0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRyTmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRyTmFtZSkpIHsKLQkJCQlhdHRyLnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRyVHlwZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRyVHlwZSkpIHsKLQkJCQlhdHRyLnNldFR5cGUocmVxdWVzdG9yLCBBdHRyaWJ1dGUuQ0RBVEEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVMaXN0KEF0dHJpYnV0ZUxpc3QgYXR0TGlzdCkgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JCVN0cmluZyBhdHRMaXN0TmFtZSA9IGF0dExpc3QuZ2V0TmFtZSgpOwotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYoYXR0TGlzdE5hbWUpKSB7Ci0JCQlpZiAoaXNNYXRjaGluZ05hbWUoYXR0TGlzdE5hbWUpKSB7Ci0JCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihlbGVtZW50TmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShlbGVtZW50TmFtZSkpIHsKLQkJCQllbGVtZW50LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCQlTdHJpbmcgcmVmTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQlpZiAoaXNNYXRjaGluZ05hbWUocmVmTmFtZSkpIHsKLQkJCWJhdGNoRGVsZXRlLmFkZE5vZGUobm9kZSk7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJmNDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERNb2RlbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLQotCi0vLyB0aGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUgbW9kZWwgd2hlbiBpdGVtcwotLy8gYXJlIGRlbGV0ZWQgb3IgYSBleHRlcm5hbCBwYXJtIGVudGl0eSBjaGFuZ2VzIHNvIHRoYXQKLS8vIGl0ZW1zIHJlZmVyZW5jZWQgYnkgaXQgYXJlIGNsZWFuZWQgdXAKLS8vIG5vdGUgdGhhdCB0b3AgbGV2ZWwgbm9kZXMgYXJlIHF1ZXVlZCB1cCBmb3IgZGVsZXRpb24gc28gdGhhdAotLy8gaXRlcmF0aW9uIG92ZXIgdGhlIGxpc3Qgb2Ygbm9kZXMgZnJvbSB0aGUgZHRkZmlsZSBpcyBub3QgbWVzc2VkIHVwCi1wdWJsaWMgY2xhc3MgRFRETW9kZWxVcGRhdGVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IG5vZGVzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIERURE5vZGUgbm9kZVRvRGVsZXRlOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkUmVmTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFRETW9kZWxVcGRhdGVyKCkgewotCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9iamVjdEFib3V0VG9CZURlbGV0ZWQoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBub2RlKSB7Ci0JCWlmIChpc1VwZGF0aW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVudGl0eSB8fCBub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHsKLQkJCS8vIGp1c3QgaWdub3JlIGlmIGl0IGlzIG5vdCBvbmUgb2YgdGhlc2UKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAhKChFbnRpdHkpIG5vZGUpLmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhIHBhcmFtZXRlciBlbnRpdHksIGlnbm9yZSBhcyB3ZWxsCi0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCWlzVXBkYXRpbmcgPSB0cnVlOwotCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJdGhpcy5ub2RlVG9EZWxldGUgPSBub2RlOwotCQlvbGRSZWZOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCWlzUGFybUVudGl0eSA9IGZhbHNlOwotCQlub2Rlc1RvRGVsZXRlLmNsZWFyKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCWlzUGFybUVudGl0eSA9IHRydWU7Ci0JCQlvbGRSZWZOYW1lID0gIiUiICsgb2xkUmVmTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlEVERGaWxlIGR0ZEZpbGUgPSBub2RlLmdldERUREZpbGUoKTsKLQkJdmlzaXQoZHRkRmlsZSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlc1RvRGVsZXRlLnNpemUoKTsgaSsrKSB7Ci0JCQlkdGRGaWxlLmRlbGV0ZU5vZGUocmVxdWVzdG9yLCAoRFRETm9kZSkgbm9kZXNUb0RlbGV0ZS5nZXQoaSkpOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJYXR0ci5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChhdHRyLmdldFR5cGUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldFR5cGUocmVxdWVzdG9yLCBBdHRyaWJ1dGUuQ0RBVEEpOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrIHRoZSBhdHRyIG5hbWUgYW5kIHRoZSBhdHRyIHR5cGUgdG8gc2VlIGlmIGl0Ci0JCS8vIG5lZWRzIHVwZGF0aW5nCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVMaXN0KEF0dHJpYnV0ZUxpc3QgYXR0TGlzdCkgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JCWlmIChhdHRMaXN0LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCQlhdHRMaXN0LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gc2F2ZSB1cCBmb3IgbGF0ZXIgZGVsZXRpb24KLQkJCQlub2Rlc1RvRGVsZXRlLmFkZChhdHRMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYpIHsKLQkJc3VwZXIudmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5UmVmKTsKLQkJaWYgKGlzUGFybUVudGl0eSAmJiBwYXJtRW50aXR5UmVmLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCW5vZGVzVG9EZWxldGUuYWRkKHBhcm1FbnRpdHlSZWYpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRSZWZlcmVuY2UoQ01CYXNpY05vZGUgbm9kZSkgewotCQlzdXBlci52aXNpdFJlZmVyZW5jZShub2RlKTsKLQotCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlEVEROb2RlIHBhcmVudCA9IChEVEROb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCXBhcmVudC5kZWxldGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjYmY4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlRW51bUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciB7Ci0JcHJvdGVjdGVkIE5vdGF0aW9uIG5vdGF0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb25OYW1lOwotCi0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgbm90YXRpb25BYm91dFRvQmVEZWxldGVkKE9iamVjdCByZXF1ZXN0b3IsIE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQl0aGlzLm5vdGF0aW9uID0gbm90YXRpb247Ci0JCW5vdGF0aW9uTmFtZSA9IG5vdGF0aW9uLmdldE5hbWUoKTsKLQotCQl2aXNpdChub3RhdGlvbi5nZXREVERGaWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0KERUREZpbGUgZmlsZSkgewotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXZpc2l0RW50aXR5KChFbnRpdHkpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCXZpc2l0QXR0cmlidXRlTGlzdCgoQXR0cmlidXRlTGlzdCkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTikpIHsKLQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gYXR0ci5nZXRFbnVtTGlzdCgpOwotCQkJTGlzdCBub3RhdGlvbk5hbWVzID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBub3RhdGlvbk5hbWVzLml0ZXJhdG9yKCk7Ci0JCQlib29sZWFuIHVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgbm90YXRpb24gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm90YXRpb24uZXF1YWxzKG5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJdXBkYXRlUmVxdWlyZWQgPSB0cnVlOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGVSZXF1aXJlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tub3RhdGlvbk5hbWVzLnNpemUoKV07Ci0JCQkJbm90YXRpb25OYW1lcy50b0FycmF5KG5ld0l0ZW1zKTsKLQkJCQllbnVtTGlzdC5zZXRJdGVtcyhyZXF1ZXN0b3IsIG5ld0l0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSBhdHRMaXN0LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGF0dHIgIT0gbnVsbCkgewotCQkJdmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCQlhdHRyID0gKEF0dHJpYnV0ZSkgYXR0ci5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlpZiAoZW50aXR5LmdldE5vdGF0aW9uTmFtZSgpLmVxdWFscyhub3RhdGlvbk5hbWUpKSB7Ci0JCQllbnRpdHkuc2V0Tm90YXRpb25OYW1lKHJlcXVlc3RvciwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0vLyBEVEROb3RhdGlvblJlbW92ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjkzMWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVFbnVtTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLQotCi0vLyB0aGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyBhbnkgZHRkIG5vZGUgaW4KLS8vIHJlc3BvbnNlIHRvIGEgY2hhbmdlIGluIHRoZSBub2RlIHRoYXQgdGhleSByZWZlcmVuY2UKLXB1YmxpYyBjbGFzcyBEVERSZWZlcmVuY2VVcGRhdGVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RhdGlvbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0aW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBuZXdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIiwgbmV3UmVmTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcm90ZWN0ZWQgRFRETm9kZSByZWZlcmVuY2VkTm9kZSA9IG51bGw7Ci0KLQkvLyB0aGUgcmVmZXJlbmNlcyBMaXN0IGlzIGEgY2FjaGUgb2YgdGhlIERURE5vZGVzIHRoYXQgYXJlIGNoYW5nZWQKLQkvLyBhcyBhIHJlc3VsdCBvZiBhIGNhbGwgdG8gbmFtZUFib3V0VG9DaGFuZ2UoKS4gVGhlIGlkZWEgaXMgdGhhdAotCS8vIGlmIGEgc3Vic2VxdWVudCBjYWxsIGNvbWVzIGluIHRoYXQgY2hhbmdlcyB0aGUgbmFtZSBvZiB0aGUgc2FtZQotCS8vIG9iamVjdCBmb3Igd2hpY2ggdGhpcyBjYWNoZSBleGlzdHMgZm9yLCB0aGVuIHdlIG9wdGltaXplIHRoZQotCS8vIHBhdGggYnkganVzdCB3YWxraW5nIHRoZSBjYWNoZQotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERURFJlZmVyZW5jZVVwZGF0ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlyZWZlcmVuY2VkTm9kZSA9IG51bGw7Ci0JCXJlZmVyZW5jZXMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbmFtZUFib3V0VG9DaGFuZ2UoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSByZWZlcmVuY2VkTm9kZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGlzVXBkYXRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSB8fCByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgcmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikpIHsKLQkJCS8vIGp1c3QgaWdub3JlIGlmIGl0IGlzIG5vdCBvbmUgb2YgdGhlc2UKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgISgoRW50aXR5KSByZWZlcmVuY2VkTm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJLy8gaWYgaXQgaXMgbm90IGEgcGFyYW1ldGVyIGVudGl0eSwgaWdub3JlIGFzIHdlbGwKLQkJCXJldHVybjsKLQkJfQotCi0JCWlzVXBkYXRpbmcgPSB0cnVlOwotCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJb2xkUmVmTmFtZSA9IHJlZmVyZW5jZWROb2RlLmdldE5hbWUoKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3UmVmTmFtZSA9IG5ld05hbWU7Ci0JCWlzUGFybUVudGl0eSA9IGZhbHNlOwotCQlpc05vdGF0aW9uID0gcmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbjsKLQotCQlpZiAocmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCWlzUGFybUVudGl0eSA9IHRydWU7Ci0JCQlvbGRSZWZOYW1lID0gIiUiICsgb2xkUmVmTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQluZXdSZWZOYW1lID0gIiUiICsgbmV3UmVmTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAodGhpcy5yZWZlcmVuY2VkTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgcHJldmlvdXMgcmVmZXJlbmNlZCBub2RlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCS8vIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdGhhdCBpcyBjb21pbmcgaW4uIGlmIHNvLCBqdXN0Ci0JCQkvLyBjaGFuZ2UgdGhlIHByZXZpb3VzIHJlZ2lvbnMKLQkJCWlmICh0aGlzLnJlZmVyZW5jZWROb2RlID09IHJlZmVyZW5jZWROb2RlKSB7Ci0JCQkJcXVpY2tVcGRhdGUoKTsKLQkJCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgdGhlIGNhY2hlIGlmIHdlIGdldCBoZXJlCi0JCXRoaXMucmVmZXJlbmNlZE5vZGUgPSByZWZlcmVuY2VkTm9kZTsKLQkJcmVmZXJlbmNlcy5jbGVhcigpOwotCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VkTm9kZS5nZXREVERGaWxlKCk7Ci0JCXZpc2l0KGR0ZEZpbGUpOwotCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcXVpY2tVcGRhdGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJdmlzaXRFbGVtZW50KChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZSgoQXR0cmlidXRlKSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCXZpc2l0UmVmZXJlbmNlKChDTUJhc2ljTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQkvLyBjaGVjayB0aGUgYXR0ciBuYW1lIGFuZCB0aGUgYXR0ciB0eXBlIHRvIHNlZSBpZiBpdAotCQkJLy8gbmVlZHMgdXBkYXRpbmcKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldE5hbWUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCQlyZWZlcmVuY2VzLmFkZChhdHRyKTsKLQkJCX0KLQkJCWlmIChhdHRyLmdldFR5cGUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldFR5cGUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCQlyZWZlcmVuY2VzLmFkZChhdHRyKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChpc05vdGF0aW9uICYmIGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTikpIHsKLQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gYXR0ci5nZXRFbnVtTGlzdCgpOwotCQkJTGlzdCBpdGVtcyA9IGVudW1MaXN0LmdldEl0ZW1zKCk7Ci0JCQlib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBub3RhdGlvbk5hbWUgPSAoU3RyaW5nKSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG5vdGF0aW9uTmFtZS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQkJdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLQkJCQkJaXRlbXMuc2V0KGksIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGVOZWVkZWQpIHsKLQkJCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLQotCQkJCWVudW1MaXN0LnNldEl0ZW1zKChTdHJpbmdbXSkgaXRlbXMudG9BcnJheShuZXdJdGVtcykpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCWlmICghaXNOb3RhdGlvbiAmJiBhdHRMaXN0LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCWF0dExpc3Quc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJcmVmZXJlbmNlcy5hZGQoYXR0TGlzdCk7Ci0JCX0KLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGVMaXN0KGF0dExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eVJlZik7Ci0JCWlmIChwYXJtRW50aXR5UmVmLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCXBhcm1FbnRpdHlSZWYuc2V0UmVmZXJlbmNlZEVudGl0eShyZXF1ZXN0b3IsIG5ld05hbWUpOwotCQkJcmVmZXJlbmNlcy5hZGQocGFybUVudGl0eVJlZik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYob2xkUmVmTmFtZSkgJiYgIWlzUGFybUVudGl0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJbm9kZS5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChub2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzMzOWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIERURFVuaXF1ZU5hbWVIZWxwZXIgewotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCXJldHVybiAoKEVudGl0eSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCXJldHVybiAoKE5vdGF0aW9uKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiAoKEF0dHJpYnV0ZSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIC8vIE1vZGVsIEdyb3VwIENvbnRlbnQKLQkJewotCQkJcmV0dXJuICgoQ01CYXNpY05vZGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUF0dHJpYnV0ZU5hbWUoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldEVsZW1lbnRBdHRyaWJ1dGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGF0dHJzLCAiTmV3QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbGVtZW50cyA9IGR0ZEZpbGUuZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkuZ2V0Tm9kZXMoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZWxlbWVudHMsICJOZXdFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVFbnRpdHlOYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IGVudGl0aWVzID0gZHRkRmlsZS5nZXRFbnRpdGllcygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVudGl0aWVzLCAiTmV3RW50aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKExpc3Qgb2JqcywgU3RyaW5nIHRva2VuKSB7Ci0JCWludCBjb3VudGVyID0gMTsKLQotCQlib29sZWFuIHVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKCF1bmlxdWVOYW1lKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IHRva2VuICsgbmV3IEludGVnZXIoY291bnRlcisrKTsKLQkJCXVuaXF1ZU5hbWUgPSB0cnVlOwotCQkJSXRlcmF0b3IgaXRlciA9IG9ianMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgb2JqTmFtZSA9IGdldE5hbWUob2JqKTsKLQkJCQlpZiAob2JqTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJdW5pcXVlTmFtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodW5pcXVlTmFtZSkgewotCQkJCXJldHVybiBuZXdOYW1lOwotCQkJfQotCQl9Ci0JCS8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZQotCQlyZXR1cm4gIk5vIE5hbWUgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTm90YXRpb25OYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IG5vdGF0aW9ucyA9IGR0ZEZpbGUuZ2V0Tm90YXRpb25zKCkuZ2V0Tm9kZXMoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUobm90YXRpb25zLCAiTmV3Tm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERVbmlxdWVOYW1lSGVscGVyKCkgewotCX0KLQotfSAvLyBEVERVbmlxdWVOYW1lSGVscGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNmQwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotcHVibGljIGNsYXNzIERURFZpc2l0b3IgewotCi0JcHVibGljIERURFZpc2l0b3IoKSB7Ci0KLQl9Ci0KLQkvLyB1dGlsaXR5IG1ldGhvZAotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5UmVmKFN0cmluZyByZWZlcmVuY2UpIHsKLQkJaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiByZWZlcmVuY2UuY2hhckF0KDApID09ICclJyAmJiByZWZlcmVuY2UuY2hhckF0KHJlZmVyZW5jZS5sZW5ndGgoKSAtIDEpID09ICc7JzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXQoRFRERmlsZSBmaWxlKSB7Ci0JCUxpc3Qgbm9kZXMgPSBmaWxlLmdldE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXZpc2l0RWxlbWVudCgoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJCXZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCS8vIG5vdGUgdGhhdCB3ZSBkb24ndCB2aXNpdCBhdHRyaWJ1dGVzIGhlcmUgYmVjYXVzZSB3ZQotCQkvLyB3YW50IHRoZSBlbGVtZW50IHRvIHZpc2l0IHRoZW0gd2l0aCBpdCdzIGNvbnNvbGlkYXRlZCBsaXN0Ci0JCS8vIHRoYXQgaXQgY3JlYXRlcyBieSBnYXRoZXJpbmcgYWxsIGF0dHJpYnV0ZSBsaXN0cyB0b2dldGhlcgotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlcyhMaXN0IGF0dHJpYnV0ZXMpIHsKLQkJaW50IHNpemUgPSBhdHRyaWJ1dGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQl2aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q29udGVudE5vZGUoQ01Ob2RlIGNvbnRlbnQpIHsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJQ01CYXNpY05vZGUgYmFzaWNOb2RlID0gKENNQmFzaWNOb2RlKSBjb250ZW50OwotCQkJaWYgKGJhc2ljTm9kZS5pc1JlZmVyZW5jZSgpKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoYmFzaWNOb2RlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXZpc2l0R3JvdXBOb2RlKChDTUdyb3VwTm9kZSkgY29udGVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNTm9kZSBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50TW9kZWwoKTsKLQkJdmlzaXRDb250ZW50Tm9kZShjb250ZW50KTsKLQkJdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0R3JvdXBOb2RlKENNR3JvdXBOb2RlIGdyb3VwKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBncm91cC5nZXRDaGlsZHJlbkxpc3QoKTsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl2aXNpdENvbnRlbnROb2RlKChDTU5vZGUpIGNoaWxkcmVuLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9MYWJlbFZhbHVlUGFpci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWQ4NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbFZhbHVlUGFpciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGZMYWJlbDsKLQlwdWJsaWMgT2JqZWN0IGZWYWx1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbmFtZS92YWx1ZSBpdGVtCi0JICovCi0JcHVibGljIExhYmVsVmFsdWVQYWlyKFN0cmluZyBsYWJlbCwgT2JqZWN0IHZhbHVlKSB7Ci0JCUFzc2VydC5pc1RydWUobGFiZWwgIT0gbnVsbCk7Ci0JCWZMYWJlbCA9IGxhYmVsOwotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3RleHQvSURURFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkwZjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gdHlwZXMgRFRELgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEVERQYXJ0aXRpb25zIHsKLQkKLQlTdHJpbmcgRFREX0RFRkFVTFQgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkMzU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMiIGtpbmQ9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMtcHJvcGVydGllcyIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIga2luZD0iY29uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIga2luZD0iY29uIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0iYmluIiBraW5kPSJvdXRwdXQiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0NTY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1ydW50aW1lCi1kdGR1aS5qYXIKLSouemlwCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1AZG90Ci1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTczZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wcm9qZWN0aW9ucGVyZj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIyMDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YmFjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTA3ZDM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZHRkLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb2plY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDA3MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtcHJvcGVydGllcy8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZTUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZiNzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU1ZTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTU4ZTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI1YTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmNjM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNWRkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMWE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTYxMWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmE5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWM0MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdkdGRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzExNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzYzZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE5NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2M3OTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGQ2MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTURURCAtIFhNTCBUb29scyBEVEQgRWRpdG9yCi0hIFBhY2thZ2VkIGZvciB0cmFuc2xhdGlvbiBpbjogIHhtbC56aXAKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVNTRSBEVEQgU291cmNlIEVkaXRvcgotCi1EVERfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9RFREIEVkaXRvcgotX1VJX0xBQkVMX0RURF9GSUxFUz1EVEQgRmlsZXMKLURURF9UZW1wbGF0ZXMubmFtZT1EVEQgVGVtcGxhdGVzCi1fVUlfTEFCRUxfRFREX1NUWUxFUz1EVEQgU3R5bGVzCi1fVUlfV0laQVJEX05FV19EVEQ9RFREIEZpbGUKLV9VSV9DUkVBVEVfTkVXX0RURF9GSUxFPUNyZWF0ZSBhIG5ldyBEVEQgZmlsZQotIyMKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotX1VJX01FTlVfVkFMSURBVEVfRFREICAgICAgICAgICAgICAgPSAmVmFsaWRhdGUgRFREIEZpbGUKLQotRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgRFRECi1fVUlfTEFCRUxfR0VORVJBTD1HZW5lcmFsCi1fVUlfTEFCRUxfT1RIRVI9T3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTPUF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OPURvY3VtZW50YXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGQzNmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTwhLS0gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiIC0tPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlRFREX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuQWN0aW9uQ29udHJpYnV0b3JEVEQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkRURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0LkRURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTwhLS0gY29tbWVudCBvdXQgdGlsbCBhYmxlIHRvIGltcHJvdmUgZHRkIGZvbGRpbmcKLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFREIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQktLT4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPCEtLSBwcm92aWRlIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIERURCBzdWJzZXQgd2l0aGluIFhNTCAtLT4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ibGluZXN0eWxlcHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5kdGQuaW50ZXJuYWxfc3Vic2V0IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JCTxlZGl0b3JDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5Ij4KLQkJCTwvYWN0aW9uPgotCQk8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSB1c2UgYSBzcGVjaWZpYyBhbm5vdGF0aW9uIG1vZGVsIHdpdGggRmlsZUJ1ZmZlcnMgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gUmVnaXN0ZXIgdGhlIFVJIGFkYXB0ZXIgZmFjdG9yeSBwcm92aWRlciAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckRURCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVfVUlfTEFCRUxfRFREX0ZJTEVTIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJURURF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQudGVtcGxhdGVzIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9MQUJFTF9EVERfU1RZTEVTIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29sb3JQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnN0eWxlcyI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gTmV3IERURCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZC5OZXdEVERXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfRFREIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9DUkVBVEVfTkVXX0RURF9GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUgRFREIHVpIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJURURF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZURURCIKLQkJCWlkPSJkdGRfbmV3Ij4KLQkJPC9jb250ZXh0VHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJvcGVydHlDb250cmlidXRvciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyIgotICAgICAgICAgICAgdHlwZU1hcHBlcj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRFREVHlwZU1hcHBlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5nZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5vdGhlciIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuYXR0cmlidXRlcyIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZG9jdW1lbnRhdGlvbiIvPgotICAgICAgPC9wcm9wZXJ0eUNvbnRyaWJ1dG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicwotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9HRU5FUkFMIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5nZW5lcmFsIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5hdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0FUVFJJQlVURVMiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkub3RoZXIiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5vdGhlciIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX09USEVSIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5kb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfRE9DVU1FTlRBVElPTiIvPgotICAgICAgPC9wcm9wZXJ0eVRhYnM+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlTZWN0aW9ucyI+Ci0gICA8cHJvcGVydHlTZWN0aW9ucyBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSI+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5hbWVTZWN0aW9uIgotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmFtZVNlY3Rpb24iCi0gICAgICAgIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudCIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdCIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbiIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbW1lbnRTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29tbWVudFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50Ii8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uIj4KLQkgICAgCTxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZVNlY3Rpb24iCi0gICAgICAgIGZpbHRlcj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZUZpbHRlciIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uIgotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLm90aGVyIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsVHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5kb2N1bWVudGF0aW9uIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRvY3VtZW50U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRvY3VtZW50U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3QiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbXB0eVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbXB0eVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiLz4KLQkJIAk8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPCEtLQkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkub3RoZXIiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgLS0+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5Ii8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTm90YXRpb25TZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTm90YXRpb25TZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlU2VjdGlvbiIgIAotICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VGaWx0ZXIiCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24iICAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgPC9wcm9wZXJ0eVNlY3Rpb25zPgotPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RUREVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFRERWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYWQ3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFRERWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci0KLS8qKgotICogQSBEVEQgRWRpdG9yIHN1YmNsYXNzIFN0cnVjdHVyZWRUZXh0RWRpdG9yLCByZXF1aXJlZCB0byBzdXBwbHkgYSBjb21wbGV0ZQotICogcmVwbGFjZW1lbnQgZm9yIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLiBXaGVuIGEgYmV0dGVyIHNvbHV0aW9uIGlzIGZvdW5kLAotICogdGhpcyBjbGFzcyB3aWxsIGJlIHJlbW92ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciB7Ci0JY2xhc3MgRFREUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciBpbXBsZW1lbnRzIElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHsKLQkJRFREUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yI2dldENvbnRyaWJ1dG9ySWQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkgewotCQkJcmV0dXJuIGdldEVkaXRvclNpdGUoKS5nZXRJZCgpOwotCQl9Ci0JfQotCi0JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZlByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHVibGljIERUREVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyByZXF1aXJlZCkgewotCQlpZiAoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgewotCQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBEVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShuZXcgRFREUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcigpKTsKLQkJCQkvKgotCQkJCSAqIEFkZCB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZSBhcyBhIGRpcmVjdCBwb3N0IHNlbGVjdGlvbgotCQkJCSAqIGxpc3RlbmVyIHNvIHN0YW5kYXJkIGN1cnNvciBuYXZpZ2F0aW9uIHRyaWdnZXJzIGEgc2VsZWN0aW9uCi0JCQkJICogbm90aWZpY2F0aW9uLiBUaGUgZGVmYXVsdCB0YWJiZWQgcHJvcGVydHkgc2hlZXQgZG9lcyBub3QKLQkJCQkgKiBsaXN0ZW4gdG8gcG9zdCBzZWxlY3Rpb24uCi0JCQkJICovCi0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFmUHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWZQcm9wZXJ0eVNoZWV0UGFnZS5zZWxlY3Rpb25DaGFuZ2VkKERUREVkaXRvci50aGlzLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgZWRpdG9ySW5wdXQpOwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgZHcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotCQl0cnkgewotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4ZjkwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBEVERQcm9wZXJ0aWVzTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PTkVfT1JfTU9SRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT1BUSU9OQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1pFUk9fT1JfTU9SRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfT0NDVVJSRU5DRTsKLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5BdHRyaWJ1ZURlZmF1bHRTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVGQVVMVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVVNBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RFRkFVTFRfVkFMVUU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TRVFVRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0hPSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NT0RFTF9HUk9VUDsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OVEVOVF9NT0RFTDsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OVEVOVF9UWVBFOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmFtZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UWVBFOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QQVJBTUVURVJfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9HRU5FUkFMX0VOVElUWTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFVCTElDX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TWVNURU1fSUQ7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlcgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VMRU1FTlRfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ0hPSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfU0VRVUVOQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRMSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX05PVEFUSU9OOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURF9ERVNDOwotCi0JLy8gTmV3IHByb3BlcnR5IHRhYnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfR0VORVJBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfT1RIRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzk7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRFREUHJvcGVydGllc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHJpdmF0ZSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Q1MzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1MIHRvb2xzIERURCBFZGl0b3IKLSEgUGFja2FnZWQgZm9yIHRyYW5zbGF0aW9uIGluOiAgeG1sLnppcAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VTZWN0aW9uLmphdmEKLV9VSV9PTkNFICAgICAgICAgICAgID0gSnVzdCBvbmNlICgxKQotX1VJX09ORV9PUl9NT1JFICAgICAgPSBPbmUgb3IgbW9yZSAoKykKLV9VSV9PUFRJT05BTCAgICAgICAgID0gT3B0aW9uYWwgKD8pCi1fVUlfWkVST19PUl9NT1JFICAgICA9IFplcm8gb3IgbW9yZSAoKikKLV9VSV9MQUJFTF9PQ0NVUlJFTkNFID0gT2NjdXJyZW5jZQotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKLV9VSV9ERUZBVUxUICAgICAgICAgICAgID0gRGVmYXVsdAotX1VJX0xBQkVMX1VTQUdFICAgICAgICAgPSBVc2FnZQotX1VJX0xBQkVMX0RFRkFVTFRfVkFMVUUgPSBEZWZhdWx0IFZhbHVlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKLV9VSV9TRVFVRU5DRSAgICAgICAgICA9IFNlcXVlbmNlICgsKQotX1VJX0NIT0lDRSAgICAgICAgICAgID0gQ2hvaWNlICh8KQotX1VJX0xBQkVMX01PREVMX0dST1VQID0gTW9kZWwgR3JvdXAKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfQ09OVEVOVF9NT0RFTCA9IENvbnRlbnQgTW9kZWwKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfQ09OVEVOVF9UWVBFID0gQ29udGVudCBUeXBlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmFtZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX05BTUUgPSBOYW1lCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX1RZUEUgPSBUeXBlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX0VOVElUWV9UWVBFICAgICAgPSBFbnRpdHkgVHlwZQotX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWSAgPSBFeHRlcm5hbAotX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFkgPSBQYXJhbWV0ZXIKLV9VSV9MQUJFTF9HRU5FUkFMX0VOVElUWSAgID0gR2VuZXJhbAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfRU5USVRZX1ZBTFVFID0gRW50aXR5IFZhbHVlCi1fVUlfTEFCRUxfUFVCTElDX0lEICAgID0gUHVibGljIElECi1fVUlfTEFCRUxfU1lTVEVNX0lEICAgID0gU3lzdGVtIElECi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVCAgICAgPSBlbGVtZW50Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VMRU1FTlRfUkVGID0gZWxlbWVudCByZWZlcmVuY2UKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ0hPSUNFICAgICAgPSBjaG9pY2UKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfU0VRVUVOQ0UgICAgPSBzZXF1ZW5jZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRSSUJVVEUgICA9IGF0dHJpYnV0ZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRMSVNUICAgICA9IGF0dHJpYnV0ZSBsaXN0Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0NPTU1FTlQgICAgID0gY29tbWVudAotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTlRJVFkgICAgICA9IGVudGl0eQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9OT1RBVElPTiAgICA9IG5vdGF0aW9uCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbgotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURCA9IFNlbGVjdCBEVEQgZmlsZQotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURF9ERVNDICAgPSBTZWxlY3QgYSBEVEQgZmlsZSBmcm9tIHRoZSBXb3JrYmVuY2ggcHJvamVjdHMKLQotISBOZXcgcHJvcGVydHkgdGFicwotX1VJX0xBQkVMX0dFTkVSQUwgICAgICAgPSBHZW5lcmFsCi1fVUlfTEFCRUxfT1RIRVIgICAgICAgICA9IE90aGVyCi1fVUlfTEFCRUxfQVRUUklCVVRFUyAgICA9IEF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OID0gRG9jdW1lbnRhdGlvbgotISBlbmQKLURUREVkaXRvcl8wPWdlbmVyYWwKLURUREVkaXRvcl8xPW90aGVyCi1EVERFZGl0b3JfMj1hdHRyaWJ1dGVzCi1EVERFZGl0b3JfMz1kb2N1bWVudGF0aW9uCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wPWNob2ljZQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMT1zZXF1ZW5jZQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNj1lbGVtZW50Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl83PWF0dHJpYnV0ZQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOD1hdHRyaWJ1dGUgbGlzdAotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOT1jb21tZW50Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xMD1lbnRpdHkKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzExPW5vdGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjYTg1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLWNsYXNzIERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIG9sZFNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcikgewotCQlzdXBlcih0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBlZGl0b3IgaXMgYWN0aXZlCi0JCQkJCWlmIChhY3RpdmVFZGl0b3IuZ2V0QWRhcHRlcihJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpID09IERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLnRoaXMpIHsKLQkJCQkJCWlmIChvbGRTZWxlY3Rpb24gPT0gbnVsbCB8fCAhb2xkU2VsZWN0aW9uLmVxdWFscyhzZWxlY3Rpb24pKSB7Ci0JCQkJCQkJb2xkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJCQkJCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3NDc0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbiBpbXBsZW1lbnRzIElTZWN0aW9uLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgTGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IGZXb3JrYmVuY2hQYXJ0OwotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JcHJvdGVjdGVkIE9iamVjdCBmSW5wdXQ7Ci0JcHJvdGVjdGVkIGludCByaWdodE1hcmdpblNwYWNlOwotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5nZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBhRmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBhRmFjdG9yeTsKLQkJR0MgZ2MgPSBuZXcgR0MocGFyZW50KTsKLQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCgiICAuLi4gICIpOyAvLyROT04tTkxTLTEkCi0JCXJpZ2h0TWFyZ2luU3BhY2UgPSBleHRlbnQueDsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci0JCUFzc2VydC5pc1RydWUoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24sICJzZWxlY3Rpb24gIiArIHNlbC5nZXRDbGFzcygpICsgImlzIG5vdCBzdHJ1Y3R1cmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLmZXb3JrYmVuY2hQYXJ0ID0gcGFydDsKLQkJdGhpcy5mU2VsZWN0aW9uID0gc2VsOwotCQl0aGlzLmZJbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkvKgotCQkgKiBpZiAoZklucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsgeHNkU2NoZW1hID0KLQkJICogKChYU0RDb25jcmV0ZUNvbXBvbmVudClmSW5wdXQpLmdldFNjaGVtYSgpOyB9Ci0JCSAqLwotCi0JCS8vIHJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNhYm91dFRvQmVTaG93bigpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0JlU2hvd24oKSB7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNhYm91dFRvQmVIaWRkZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9CZUhpZGRlbigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2dldE1pbmltdW1IZWlnaHQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluaW11bUhlaWdodCgpIHsKLQkJcmV0dXJuIFNXVC5ERUZBVUxUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJaWYgKGZJbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIGZJbnB1dCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KChFbGVtZW50KWZJbnB1dCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiBnZXRJbnB1dCgpICE9IG51bGwgJiYgIWlzSW5Eb0hhbmRsZSkgewotCQkJaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLQkJCWRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmIGdldElucHV0KCkgIT0gbnVsbCAmJiAhaXNJbkRvSGFuZGxlKSB7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJZG9XaWRnZXRTZWxlY3RlZChlKTsKLQkJCWlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckVuYWJsZWQoYm9vbGVhbiB2KSB7Ci0JCXRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNJbkRvSGFuZGxlKSB7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJc3RhcnREZWxheWVkRXZlbnQoZXZlbnQpOwotCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCi0JfQotCi0JcHJvdGVjdGVkIERlbGF5ZWRFdmVudCBkZWxheWVkVGFzazsKLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0RGVsYXllZEV2ZW50KEV2ZW50IGUpIHsKLQkJaWYgKGRlbGF5ZWRUYXNrID09IG51bGwgfHwgZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKSB7Ci0JCQlkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLQkJCWRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCwgZGVsYXllZFRhc2spOwotCQl9Ci0JCWVsc2UgewotCQkJRXZlbnQgZGVsYXllZEV2ZW50ID0gZGVsYXllZFRhc2suZ2V0RXZlbnQoKTsKLQotCQkJaWYgKGUud2lkZ2V0ID09IGRlbGF5ZWRFdmVudC53aWRnZXQgJiYgZS50eXBlID09IGRlbGF5ZWRFdmVudC50eXBlKSB7Ci0JCQkJLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0JCQkJZGVsYXllZFRhc2suc2V0RXZlbnQobnVsbCk7Ci0JCQl9Ci0JCQlkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLQkJCWRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCwgZGVsYXllZFRhc2spOwotCQl9Ci0JfQotCi0JY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcm90ZWN0ZWQgRXZlbnQgZXZlbnQ7Ci0KLQkJLyoKLQkJICogQHNlZSBSdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJCWRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJCWlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotCQkJCWV2ZW50ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBldmVudC4KLQkJICogCi0JCSAqIEByZXR1cm4gUmV0dXJucyBhIEV2ZW50Ci0JCSAqLwotCQlwdWJsaWMgRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgZXZlbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFdmVudChFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50ID0gZTsKLQkJfQotCi0JfQotCi0JYm9vbGVhbiBpc0luRG9IYW5kbGU7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGlzSW5Eb0hhbmRsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGlzSW5Eb0hhbmRsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luRG9IYW5kbGUoKSB7Ci0JCXJldHVybiBpc0luRG9IYW5kbGU7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotCQlJU3RhdHVzTGluZU1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBlZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJcmVzdWx0ID0gY29udHJpYnV0b3IuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlEb2N1bWVudEltcGwgZ2V0RG9jdW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhTdHJpbmcgZGVzY3JpcHRpb24sIEVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudEltcGwgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50SW1wbCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQotCQlkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlTGFuZ3VhZ2UoU3RyaW5nIGxhbmcpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODFiYjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIElNUExJRUQgPSBBdHRyaWJ1dGUuSU1QTElFRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9IEF0dHJpYnV0ZS5SRVFVSVJFRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBGSVhFRCA9IEF0dHJpYnV0ZS5GSVhFRDsKLQotCXByaXZhdGUgQ0NvbWJvIHVzYWdlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB1c2FnZUNvbWJvVmFsdWVzID0ge0lNUExJRUQsIFJFUVVJUkVELCBGSVhFRCwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9ERUZBVUxUfTsKLQlwcml2YXRlIFRleHQgZGVmYXVsdFZhbHVlVGV4dDsKLQlwcml2YXRlIENMYWJlbCBkZWZhdWx0VmFsdWVMYWJlbDsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCB1c2FnZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfVVNBR0UpOwotCQlpbml0aWFsaXplRm9udE1ldHJpY3ModXNhZ2VMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aCh1c2FnZUxhYmVsLmdldFRleHQoKSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl1c2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdXNhZ2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdXNhZ2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl1c2FnZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl1c2FnZUNvbWJvLnNldEl0ZW1zKHVzYWdlQ29tYm9WYWx1ZXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCWRlZmF1bHRWYWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfREVGQVVMVF9WQUxVRSk7Ci0JCWxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKGRlZmF1bHRWYWx1ZUxhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkZWZhdWx0VmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGVmYXVsdFZhbHVlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkZWZhdWx0VmFsdWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCWRlZmF1bHRWYWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGVmYXVsdFZhbHVlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJU3RyaW5nIGtpbmQgPSAoKEF0dHJpYnV0ZSkgaW5wdXQpLmdldERlZmF1bHRLaW5kKCk7Ci0JCQkJaWYgKCIiLmVxdWFscyhraW5kKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl1c2FnZUNvbWJvLnNldFRleHQoRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9ERUZBVUxUKTsKLQkJCQllbHNlCi0JCQkJCXVzYWdlQ29tYm8uc2V0VGV4dChraW5kKTsKLQotCQkJCWlmICgiIi5lcXVhbHMoa2luZCkgfHwgRklYRUQuZXF1YWxzKGtpbmQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VGV4dCgoKEF0dHJpYnV0ZSkgaW5wdXQpLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB1c2FnZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJU3RyaW5nIHVzYWdlID0gdXNhZ2VDb21iby5nZXRUZXh0KCk7Ci0JCQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGlucHV0OwotCQkJCWlmICh1c2FnZS5lcXVhbHMoRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9ERUZBVUxUKSkKLQkJCQkJYXR0cmlidXRlLnNldERlZmF1bHRLaW5kKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UKLQkJCQkJYXR0cmlidXRlLnNldERlZmF1bHRLaW5kKHVzYWdlKTsKLQotCQkJCWlmIChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQuZXF1YWxzKHVzYWdlKSB8fCBGSVhFRC5lcXVhbHModXNhZ2UpKSB7Ci0JCQkJCWRlZmF1bHRWYWx1ZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCWlmIChldmVudC53aWRnZXQgPT0gZGVmYXVsdFZhbHVlVGV4dCkgewotCQkJCVN0cmluZyBuZXdWYWx1ZSA9IGRlZmF1bHRWYWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJCSgoQXR0cmlidXRlKSBpbnB1dCkuc2V0RGVmYXVsdFZhbHVlKG5ld1ZhbHVlLCB1c2FnZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoRklYRUQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29tbWVudFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzlmMmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotCi1wdWJsaWMgY2xhc3MgQ29tbWVudFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgVGV4dCBjb21tZW50VGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNvbW1lbnRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk1VTFRJIHwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCWNvbW1lbnRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIENvbW1lbnRTZWN0aW9uLnRoaXMpOwotCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQljb21tZW50VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCWNvbW1lbnRUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWNvbW1lbnRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCWNvbW1lbnRUZXh0LnNldFRleHQoKChDb21tZW50KSBpbnB1dCkuZ2V0VGV4dCgpKTsKLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBjb21tZW50VGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwICYmIGlucHV0IGluc3RhbmNlb2YgQ29tbWVudCkgewotCQkJCUNvbW1lbnQgY29tbWVudCA9IChDb21tZW50KSBpbnB1dDsKLQkJCQljb21tZW50LnNldFRleHQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYTg4ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VRVUVOQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX1NFUVVFTkNFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIENIT0lDRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfQ0hPSUNFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE1PREVMX0dST1VQID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9NT0RFTF9HUk9VUDsKLQotCXByaXZhdGUgQ0NvbWJvIG1vZGVsR3JvdXBDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIG1vZGVsR3JvdXBDb21ib1ZhbHVlcyA9IHtTRVFVRU5DRSwgQ0hPSUNFfTsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTU9ERUxfR1JPVVApOwotCQlpbml0aWFsaXplRm9udE1ldHJpY3MoY0xhYmVsKTsKLQkJaW50IGxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKGNMYWJlbC5nZXRUZXh0KCkpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbW9kZWxHcm91cENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJbW9kZWxHcm91cENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW1vZGVsR3JvdXBDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJbW9kZWxHcm91cENvbWJvLnNldEl0ZW1zKG1vZGVsR3JvdXBDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgbm9kZSA9IChDTUdyb3VwTm9kZSkgaW5wdXQ7Ci0JCQkJY2hhciBtb2RlbFR5cGUgPSBub2RlLmdldENvbm5lY3RvcigpOwotCQkJCWlmIChDTUdyb3VwTm9kZS5DSE9JQ0UgPT0gbW9kZWxUeXBlKQotCQkJCQltb2RlbEdyb3VwQ29tYm8uc2V0VGV4dChDSE9JQ0UpOwotCQkJCWVsc2UgaWYgKENNR3JvdXBOb2RlLlNFUVVFTkNFID09IG1vZGVsVHlwZSkKLQkJCQkJbW9kZWxHcm91cENvbWJvLnNldFRleHQoU0VRVUVOQ0UpOwotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSBtb2RlbEdyb3VwQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJCUNNR3JvdXBOb2RlIG5vZGUgPSAoQ01Hcm91cE5vZGUpIGlucHV0OwotCQkJCWlmIChDSE9JQ0UuZXF1YWxzKG1vZGVsR3JvdXBDb21iby5nZXRUZXh0KCkpKQotCQkJCQlub2RlLnNldENvbm5lY3RvcihDTUdyb3VwTm9kZS5DSE9JQ0UpOwotCQkJCWVsc2UgaWYgKFNFUVVFTkNFLmVxdWFscyhtb2RlbEdyb3VwQ29tYm8uZ2V0VGV4dCgpKSkKLQkJCQkJbm9kZS5zZXRDb25uZWN0b3IoQ01Hcm91cE5vZGUuU0VRVUVOQ0UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlsaXplIGZvbnQgbWV0cmljcwotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb250TWV0cmljcyhDb250cm9sIGNvbnRyb2wpIHsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCQlmRm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGxhYmVsIHdpZHRoCi0JICogCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRMYWJlbFdpZHRoKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJaW50IGxhYmVsV2lkdGggPSA5ODsKLQotCQlpbnQgcGl4ZWxzID0gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGxhYmVsVGV4dC5sZW5ndGgoKSArIDUpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocGl4ZWxzLCBsYWJlbFdpZHRoKTsKLQkJcmV0dXJuIGxhYmVsV2lkdGg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1MGJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxOYW1lRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJcmV0dXJuIHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICEoKENNQmFzaWNOb2RlKSB0b1Rlc3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkNjkwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsTmFtZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRFTlRfTU9ERUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlRFTlRfTU9ERUw7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7Q01Ob2RlLlBDREFUQX07Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIENPTlRFTlRfTU9ERUwpOwotCQlpbml0aWFsaXplRm9udE1ldHJpY3MoY0xhYmVsKTsKLQkJaW50IGxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKGNMYWJlbC5nZXRUZXh0KCkpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0KLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJdHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLlBDREFUQSk7Ci0JCQkJLy8gTm9kZUxpc3QgbGlzdCA9Ci0JCQkJLy8gKChDTUJhc2ljTm9kZSlmSW5wdXQpLmdldERUREZpbGUoKS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoQ01CYXNpY05vZGUpIGlucHV0KS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCWJvb2xlYW4gaXNGb3JSb290Q29udGVudCA9ICgoQ01CYXNpY05vZGUpIGlucHV0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKCFpc0ZvclJvb3RDb250ZW50ICYmIG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCQkJdHlwZUNvbWJvLmFkZChub2RlLmdldE5hbWUoKSk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5ICYmICgoRW50aXR5KSBub2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQkJdHlwZUNvbWJvLmFkZCgiJSIgKyBub2RlLmdldE5hbWUoKSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQotCQkJCXR5cGVDb21iby5zZXRUZXh0KCgoQ01CYXNpY05vZGUpIGlucHV0KS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQlDTUJhc2ljTm9kZSBub2RlID0gKENNQmFzaWNOb2RlKSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCS8vIGlmIChDTU5vZGUuUENEQVRBLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJbm9kZS5zZXROYW1lKHNlbGVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWxpemUgZm9udCBtZXRyaWNzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbGFiZWwgd2lkdGgKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldExhYmVsV2lkdGgoU3RyaW5nIGxhYmVsVGV4dCkgewotCQlpbnQgbGFiZWxXaWR0aCA9IDk4OwotCi0JCWludCBwaXhlbHMgPSBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgbGFiZWxUZXh0Lmxlbmd0aCgpICsgNSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwaXhlbHMsIGxhYmVsV2lkdGgpOwotCQlyZXR1cm4gbGFiZWxXaWR0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGFjODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbFR5cGVGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoT2JqZWN0IHRvVGVzdCkgewotCQlpZiAodG9UZXN0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUgJiYgISgoQ01CYXNpY05vZGUpIHRvVGVzdCkuaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodG9UZXN0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUgJiYgKChDTUdyb3VwTm9kZSkgdG9UZXN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg0YzQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsVHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfQ09OVEVOVF9UWVBFOwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge0NNTm9kZS5BTlksIENNTm9kZS5FTVBUWSwgQ01Ob2RlLlBDREFUQSwgQ01Ob2RlLkNISUxEUkVOLCBDTU5vZGUuTUlYRUR9OwotCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBDT05URU5UX1RZUEUpOwotCQlpbml0aWFsaXplRm9udE1ldHJpY3MoY0xhYmVsKTsKLQkJaW50IGxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKGNMYWJlbC5nZXRUZXh0KCkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJdHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLkFOWSk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuRU1QVFkpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLlBDREFUQSk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuQ0hJTERSRU4pOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLk1JWEVEKTsKLQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDTU5vZGUpIGlucHV0KS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBub2RlTmFtZSA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlub2RlTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdHlwZUNvbWJvLmluZGV4T2Yobm9kZU5hbWUpID09IC0xKQotCQkJCQkJdHlwZUNvbWJvLmFkZChub2RlTmFtZSk7Ci0JCQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgKChFbnRpdHkpIG5vZGUpLmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgdHlwZUNvbWJvLmluZGV4T2Yobm9kZU5hbWUpID09IC0xKQotCQkJCQkJdHlwZUNvbWJvLmFkZCgiJSIgKyBub2RlTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoKChDTUdyb3VwTm9kZSkgaW5wdXQpLmdldFR5cGUoKSk7Ci0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoKChDTUJhc2ljTm9kZSkgaW5wdXQpLmdldFR5cGUoKSk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGlmIChmSW5wdXQgIT0gbnVsbCkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSB8fCBpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmIChDTU5vZGUuTUlYRUQuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRNaXhlZENvbnRlbnQoKTsKLQkJCQllbHNlIGlmIChDTU5vZGUuQ0hJTERSRU4uZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRDaGlsZHJlbkNvbnRlbnQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZSBpZiAoQ01Ob2RlLkVNUFRZLmVxdWFscyhzZWxlY3RlZCkgfHwgQ01Ob2RlLkFOWS5lcXVhbHMoc2VsZWN0ZWQpIHx8IENNTm9kZS5QQ0RBVEEuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRDb250ZW50KHNlbGVjdGVkKTsKLQkJCQllbHNlCi0JCQkJCW5vZGUuc2V0Q2hpbGRyZW5Db250ZW50KHNlbGVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWxpemUgZm9udCBtZXRyaWNzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbGFiZWwgd2lkdGgKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldExhYmVsV2lkdGgoU3RyaW5nIGxhYmVsVGV4dCkgewotCQlpbnQgbGFiZWxXaWR0aCA9IDk4OwotCi0JCWludCBwaXhlbHMgPSBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgbGFiZWxUZXh0Lmxlbmd0aCgpICsgNSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwaXhlbHMsIGxhYmVsV2lkdGgpOwotCQlyZXR1cm4gbGFiZWxXaWR0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMzdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01SZXBlYXRhYmxlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0KLQkJT2JqZWN0IHNlbGVjdGVkID0gb2JqZWN0OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gKChEVERGaWxlKSBzZWxlY3RlZCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKERURE5vZGUpIHNlbGVjdGVkKS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9iamVjdCBzZWxlY3RlZCA9IG9iamVjdDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlyZXR1cm4gKChEVERGaWxlKSBzZWxlY3RlZCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCWlmICgoKENNQmFzaWNOb2RlKSBzZWxlY3RlZCkuaXNSZWZlcmVuY2UoKSkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUY7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICgoQ01CYXNpY05vZGUpIHNlbGVjdGVkKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKSB7Ci0JCQlDTVJlcGVhdGFibGVOb2RlIG5vZGUgPSAoQ01SZXBlYXRhYmxlTm9kZSkgc2VsZWN0ZWQ7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJCWlmICgoKENNR3JvdXBOb2RlKSBub2RlKS5nZXRDb25uZWN0b3IoKSA9PSBDTUdyb3VwTm9kZS5DSE9JQ0UpCi0JCQkJCW5hbWUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMDsKLQkJCQllbHNlCi0JCQkJCW5hbWUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTsKLQkJCX0KLQkJCWNoYXIgb2NjdXJyZW5jZSA9IG5vZGUuZ2V0T2NjdXJyZW5jZSgpOwotCQkJc3dpdGNoIChvY2N1cnJlbmNlKSB7Ci0JCQkJY2FzZSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UgOgotCQkJCQluYW1lICs9ICIgWzEuLjFdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuT1BUSU9OQUwgOgotCQkJCQluYW1lICs9ICIgWzAuLjFdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuT05FX09SX01PUkUgOgotCQkJCQluYW1lICs9ICIgWzEuLipdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuWkVST19PUl9NT1JFIDoKLQkJCQkJbmFtZSArPSAiIFswLi4qXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl82OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl83OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfODsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQ29tbWVudCkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzk7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEVudGl0eSkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzEwOwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBOb3RhdGlvbikKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzExOwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpCi0JCQkJLy8gcmV0dXJuICJwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSI7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICgoRFRETm9kZSkgc2VsZWN0ZWQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkVsZW1lbnQpIHsKLQkJCXJldHVybiAoKG9yZy53M2MuZG9tLkVsZW1lbnQpIHNlbGVjdGVkKS5nZXRMb2NhbE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE1MzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotCi0vKioKLSAqIEV4dGVuZCB0aGUgYmFzZSB3aXphcmQgdG8gc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSBwcm9qZWN0IG9yIG91dHNpZGUgdGhlCi0gKiB3b3JrYmVuY2ggYW5kIGFkZCBlcnJvciBoYW5kbGluZwotICovCi1jbGFzcyBEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCURURFNlbGVjdFNpbmdsZUZpbGVQYWdlIGZpbGVQYWdlOwotCi0JSUZpbGUgcmVzdWx0RmlsZTsKLQotCXB1YmxpYyBEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZChTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBWaWV3ZXJGaWx0ZXIgZmlsdGVyLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBEVERSZXNvdXJjZS5ORVdEVEQpKTsKLQotCQkvLyBTZWxlY3QgRmlsZSBQYWdlCi0JCWZpbGVQYWdlID0gbmV3IERURFNlbGVjdFNpbmdsZUZpbGVQYWdlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCWZpbGVQYWdlLnNldFRpdGxlKHRpdGxlKTsKLQkJZmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JCWZpbGVQYWdlLmFkZEZpbHRlcihmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UoZmlsZVBhZ2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmVzdWx0RmlsZSA9IGZpbGVQYWdlLmdldEZpbGUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldFJlc3VsdEZpbGUoKSB7Ci0JCXJldHVybiByZXN1bHRGaWxlOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBEVEQgRmlsZQotCSAqLwotCWNsYXNzIERURFNlbGVjdFNpbmdsZUZpbGVQYWdlIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgewotCQlwdWJsaWMgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UoSVdvcmtiZW5jaCB3LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KSB7Ci0JCQlzdXBlcih3LCBzZWxlY3Rpb24sIGlzRmlsZU1hbmRhdG9yeSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCXJldHVybiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFR5cGVNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTM1ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFR5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotcHVibGljIGNsYXNzIERURFR5cGVNYXBwZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBlciB7Ci0JcHVibGljIERURFR5cGVNYXBwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENsYXNzIG1hcFR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0LmdldENsYXNzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjcyMGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgVGV4dCBjb21tZW50VGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNvbW1lbnRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk1VTFRJIHwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCWNvbW1lbnRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQljb21tZW50VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCWNvbW1lbnRUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWNvbW1lbnRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gZ2V0Q29tbWVudE5vZGUoKERURE5vZGUpIGlucHV0KTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKQotCQkJCQljb21tZW50VGV4dC5zZXRUZXh0KGNvbW1lbnQuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5ld1ZhbHVlID0gY29tbWVudFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCUNvbW1lbnQgY29tbWVudCA9IGdldENvbW1lbnROb2RlKChEVEROb2RlKSBpbnB1dCk7Ci0JCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCkKLQkJCQkJY29tbWVudC5zZXRUZXh0KG5ld1ZhbHVlKTsKLQkJCQllbHNlIHsKLQkJCQkJLy8gQ3JlYXRlIGEgbmV3IGNvbW1lbnQgbm9kZS4KLQkJCQkJKChEVEROb2RlKSBpbnB1dCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUNvbW1lbnQoKERURE5vZGUpIGlucHV0LCBuZXdWYWx1ZSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBDb21tZW50IGdldENvbW1lbnROb2RlKERURE5vZGUgbm9kZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUuZ2V0RFRERmlsZSgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCURURE5vZGUgcHJldk5vZGUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljdXJyZW50Tm9kZSA9IChEVEROb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZSA9PSBjdXJyZW50Tm9kZSAmJiBwcmV2Tm9kZSAhPSBudWxsICYmIHByZXZOb2RlIGluc3RhbmNlb2YgQ29tbWVudCkKLQkJCQlyZXR1cm4gKENvbW1lbnQpIHByZXZOb2RlOwotCQkJZWxzZQotCQkJCXByZXZOb2RlID0gY3VycmVudE5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW1wdHlTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW1wdHlTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjQyOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VtcHR5U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVtcHR5U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRNaW5pbXVtSGVpZ2h0KCkgewotCQlyZXR1cm4gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVR5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2NzZlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVudGl0eVR5cGVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTlRJVFlfVFlQRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1RZUEU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRVhURVJOQUxfRU5USVRZID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFUk5BTF9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QQVJBTUVURVJfRU5USVRZOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEdFTkVSQUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZOwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge1BBUkFNRVRFUiwgR0VORVJBTH07Ci0JcHJpdmF0ZSBCdXR0b24gY2hlY2tCb3g7Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBFTlRJVFlfVFlQRSk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyhjTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoY0xhYmVsLmdldFRleHQoKSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQotCQljaGVja0JveCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBFWFRFUk5BTF9FTlRJVFksIFNXVC5DSEVDSyk7Ci0JCWxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKGNoZWNrQm94LmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoOTUsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoUEFSQU1FVEVSKTsKLQkJCQllbHNlCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KEdFTkVSQUwpOwotCi0JCQkJaWYgKGVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQlpc0V4dGVybmFsRW50aXR5ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAoUEFSQU1FVEVSLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KHRydWUpOwotCQkJCWVsc2UKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IGNoZWNrQm94KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlib29sZWFuIHNlbGVjdGVkID0gY2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJCW5vZGUuc2V0RXh0ZXJuYWxFbnRpdHkodHJ1ZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbm9kZS5zZXRFeHRlcm5hbEVudGl0eShmYWxzZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlsaXplIGZvbnQgbWV0cmljcwotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb250TWV0cmljcyhDb250cm9sIGNvbnRyb2wpIHsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCQlmRm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGxhYmVsIHdpZHRoCi0JICogCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRMYWJlbFdpZHRoKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJaW50IGxhYmVsV2lkdGggPSA5ODsKLQotCQlpbnQgcGl4ZWxzID0gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGxhYmVsVGV4dC5sZW5ndGgoKSArIDUpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocGl4ZWxzLCBsYWJlbFdpZHRoKTsKLQkJcmV0dXJuIGxhYmVsV2lkdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkZTAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVudGl0eVZhbHVlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkFMVUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9WQUxVRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCXByaXZhdGUgVGV4dCB2YWx1ZVRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgc3lzdGVtSWRUZXh0OwotCi0JcHJpdmF0ZSBDTGFiZWwgdmFsdWVMYWJlbDsKLQlwcml2YXRlIENMYWJlbCBwdWJsaWNJZExhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHN5c3RlbUlkTGFiZWw7Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gdmFsdWVUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBwdWJsaWNJZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBwdWJsaWNJZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRQdWJsaWNJRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHN5c3RlbUlkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFN5c3RlbUlEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgVkFMVUUpOwotCQlpbml0aWFsaXplRm9udE1ldHJpY3ModmFsdWVMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aCh2YWx1ZUxhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gRW50aXR5IFZhbHVlCi0JCXZhbHVlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YWx1ZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdmFsdWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXZhbHVlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlwdWJsaWNJZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFBVQkxJQ19JRCk7Ci0JCWxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKHB1YmxpY0lkTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFsdWVMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlwdWJsaWNJZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gUHVibGljIElECi0JCXB1YmxpY0lkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0lkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlzeXN0ZW1JZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFNZU1RFTV9JRCk7Ci0JCWxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKHN5c3RlbUlkTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gU3lzdGVtIElECi0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQl2YWx1ZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJdmFsdWVUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVibGljSWRMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJcHVibGljSWRUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlzeXN0ZW1JZFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQotCQkJcHVibGljSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlzeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCXB1YmxpY0lkVGV4dC5zZXRUZXh0KChlbnRpdHkpLmdldFB1YmxpY0lEKCkpOwotCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KChlbnRpdHkpLmdldFN5c3RlbUlEKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJdmFsdWVUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlwdWJsaWNJZExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVibGljSWRUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJc3lzdGVtSWRMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJdmFsdWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkKLQkJCQl2YWx1ZVRleHQuc2V0VGV4dCgoKEVudGl0eSkgaW5wdXQpLmdldFZhbHVlKCkpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBFbnRpdHlUeXBlU2VjdGlvbi5pc0V4dGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmIzMzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTmFtZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5BTUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX05BTUU7Ci0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOwotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCAmJiBpbnB1dCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlEVEROb2RlIGR0ZE5vZGUgPSAoRFRETm9kZSkgaW5wdXQ7Ci0JCQkJZHRkTm9kZS5zZXROYW1lKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCUZvcm1EYXRhIGRhdGE7Ci0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTkFNRSk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyhuYW1lTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgobmFtZUxhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIGxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nRm9yRW50ZXIobmFtZVRleHQpOwotCQkvLyBsaXN0ZW5lci5zdGFydExpc3RlbmluZ1RvKG5hbWVUZXh0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQluYW1lVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkKLQkJCQluYW1lVGV4dC5zZXRUZXh0KCgoRFRETm9kZSkgaW5wdXQpLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWxpemUgZm9udCBtZXRyaWNzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbGFiZWwgd2lkdGgKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldExhYmVsV2lkdGgoU3RyaW5nIGxhYmVsVGV4dCkgewotCQlpbnQgbGFiZWxXaWR0aCA9IDk4OwotCi0JCWludCBwaXhlbHMgPSBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgbGFiZWxUZXh0Lmxlbmd0aCgpICsgNSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwaXhlbHMsIGxhYmVsV2lkdGgpOwotCQlyZXR1cm4gbGFiZWxXaWR0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OZXdFbnRpdHlTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YWZiMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBOZXdFbnRpdHlTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOQU1FID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOVElUWV9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9FTlRJVFkgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQQVJBTUVURVIgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VORVJBTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfR0VORVJBTF9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkFMVUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9WQUxVRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gd2l6YXJkQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGVudGl0eVZhbHVlVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja0JveDsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtQQVJBTUVURVIsIEdFTkVSQUx9OwotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQljcmVhdGVFbnRpdHlDb21tb25Db21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVFeHRlcm5hbEVudGl0eUNvbXBvc2l0ZShwYWdlQm9vayk7Ci0JCWNyZWF0ZUludGVybmFsRW50aXR5Q29tcG9zaXRlKHBhZ2VCb29rKTsKLQotCQlwYWdlQm9vay5zaG93UGFnZShleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZW50aXR5Q29tbW9uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRW50aXR5Q29tbW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZW50aXR5Q29tbW9uQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQllbnRpdHlDb21tb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChlbnRpdHlDb21tb25Db21wb3NpdGUsIE5BTUUpOyAvLyROT04tTkxTLTEkCi0JCWluaXRpYWxpemVGb250TWV0cmljcyhuYW1lTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgobmFtZUxhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJCAgICAKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCBFTlRJVFlfVFlQRSk7Ci0JCWxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKGNMYWJlbC5nZXRUZXh0KCkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIENoZWNrYm94Ci0JCWNoZWNrQm94ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihlbnRpdHlDb21tb25Db21wb3NpdGUsIEVYVEVSTkFMX0VOVElUWSwgU1dULkNIRUNLKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIENDb21ibwotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSAtIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCi0JCXJldHVybiBlbnRpdHlDb21tb25Db21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaW50ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVJbnRlcm5hbEVudGl0eUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWludGVybmFsRW50aXR5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBlbnRpdHlWYWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgVkFMVUUpOyAvLyROT04tTkxTLTEkCi0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChlbnRpdHlWYWx1ZUxhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQllbnRpdHlWYWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZW50aXR5VmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5VmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eVZhbHVlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQllbnRpdHlWYWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZW50aXR5VmFsdWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQllbnRpdHlWYWx1ZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJcmV0dXJuIGludGVybmFsRW50aXR5Q29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGV4dGVybmFsRW50aXR5Q29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlDb21tb25Db21wb3NpdGUsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgcHVibGljSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsIFBVQkxJQ19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKHB1YmxpY0lkTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlwdWJsaWNJZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWNJZFRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0lkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQkvLyBDcmVhdGUgU3lzdGVtIElEIExhYmVsCi0JCUNMYWJlbCBzeXN0ZW1JZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgU1lTVEVNX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChzeXN0ZW1JZExhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJc3lzdGVtSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBXaXphcmQgQnV0dG9uCi0JCXdpemFyZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkQnV0dG9uLnNldEltYWdlKEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksICJpY29ucy9icm93c2VidXR0b24uZ2lmIikuY3JlYXRlSW1hZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl3aXphcmRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2l6YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENyZWF0ZSBTeXN0ZW0gSUQgVGV4dAotCQlzeXN0ZW1JZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzeXN0ZW1JZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQod2l6YXJkQnV0dG9uLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCXJldHVybiBleHRlcm5hbEVudGl0eUNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKFBBUkFNRVRFUi5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eSh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KGZhbHNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSBjaGVja0JveCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3RlZCkgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KHRydWUpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KGZhbHNlKTsKLQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSB3aXphcmRCdXR0b24pIHsKLQkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCUlGaWxlIGN1cnJlbnRJRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihuZXcgU3RyaW5nW117Ii5kdGQifSwgbmV3IElGaWxlW117Y3VycmVudElGaWxlfSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZmlsZVNlbGVjdFdpemFyZCA9IG5ldyBEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURCwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVERfREVTQywgZmlsdGVyLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTZWxlY3Rpb24pOwotCi0JCQlXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgZmlsZVNlbGVjdFdpemFyZCk7Ci0JCQl3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0JCQl3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCQlJRmlsZSBzZWxlY3RlZElGaWxlID0gZmlsZVNlbGVjdFdpemFyZC5nZXRSZXN1bHRGaWxlKCk7Ci0JCQkJU3RyaW5nIGR0ZEZpbGVTdHJpbmcgPSB2YWx1ZTsKLQkJCQlpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsKSB7Ci0JCQkJCWR0ZEZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRGdWxsUGF0aCgpLCBjdXJyZW50SUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KGR0ZEZpbGVTdHJpbmcpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQluYW1lVGV4dC5zZXRUZXh0KGVudGl0eS5nZXROYW1lKCkpOwotCi0JCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCQkJCWVsc2UKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoR0VORVJBTCk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQkJcHVibGljSWRUZXh0LnNldFRleHQoZW50aXR5LmdldFB1YmxpY0lEKCkpOwotCQkJCQlzeXN0ZW1JZFRleHQuc2V0VGV4dChlbnRpdHkuZ2V0U3lzdGVtSUQoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJCWVudGl0eVZhbHVlVGV4dC5zZXRUZXh0KGVudGl0eS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldE5hbWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBlbnRpdHlWYWx1ZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBlbnRpdHlWYWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHB1YmxpY0lkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHB1YmxpY0lkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWxpemUgZm9udCBtZXRyaWNzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbGFiZWwgd2lkdGgKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldExhYmVsV2lkdGgoU3RyaW5nIGxhYmVsVGV4dCkgewotCQlpbnQgbGFiZWxXaWR0aCA9IDk4OwotCi0JCWludCBwaXhlbHMgPSBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgbGFiZWxUZXh0Lmxlbmd0aCgpICsgNSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwaXhlbHMsIGxhYmVsV2lkdGgpOwotCQlyZXR1cm4gbGFiZWxXaWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZTEzZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05vdGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5vdGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFVCTElDX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQ7Ci0KLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwcml2YXRlIENMYWJlbCBwdWJsaWNJZExhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHN5c3RlbUlkTGFiZWw7Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcHVibGljSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gcHVibGljSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJCW5vdGF0aW9uLnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJCW5vdGF0aW9uLnNldFN5c3RlbUlEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXB1YmxpY0lkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgUFVCTElDX0lEKTsKLQkJaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKHB1YmxpY0lkTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgocHVibGljSWRMYWJlbC5nZXRUZXh0KCkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJcHVibGljSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFB1YmxpYyBJRAotCQlwdWJsaWNJZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNJZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJc3lzdGVtSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBTWVNURU1fSUQpOwotCQlsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChzeXN0ZW1JZExhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJc3lzdGVtSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFN5c3RlbSBJRAotCQlzeXN0ZW1JZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeXN0ZW1JZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJcHVibGljSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCXN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKE5vdGF0aW9uKSBpbnB1dDsKLQkJCXB1YmxpY0lkVGV4dC5zZXRUZXh0KChub3RhdGlvbikuZ2V0UHVibGljSUQoKSk7Ci0JCQlzeXN0ZW1JZFRleHQuc2V0VGV4dCgobm90YXRpb24pLmdldFN5c3RlbUlEKCkpOwotCQl9Ci0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWxpemUgZm9udCBtZXRyaWNzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbGFiZWwgd2lkdGgKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldExhYmVsV2lkdGgoU3RyaW5nIGxhYmVsVGV4dCkgewotCQlpbnQgbGFiZWxXaWR0aCA9IDk4OwotCi0JCWludCBwaXhlbHMgPSBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgbGFiZWxUZXh0Lmxlbmd0aCgpICsgNSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwaXhlbHMsIGxhYmVsV2lkdGgpOwotCQlyZXR1cm4gbGFiZWxXaWR0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTdlMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlOwotCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZUZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIHNlbGVjdChPYmplY3QgdG9UZXN0KSB7Ci0JCWlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSAmJiAoKENNQmFzaWNOb2RlKSB0b1Rlc3QpLmlzRW1wdHlBbnlPclBDRGF0YSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIGlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQ0OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9OQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX09OQ0U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT05FX09SX01PUkUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX09ORV9PUl9NT1JFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9QVElPTkFMID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9PUFRJT05BTDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBaRVJPX09SX01PUkUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX1pFUk9fT1JfTU9SRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPQ0NVUkVOQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX09DQ1VSUkVOQ0U7Ci0KLQlwcml2YXRlIENDb21ibyBvY2N1cnJlbmNlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSBvY2N1cnJlbmNlQ29tYm9WYWx1ZXMgPSB7T05DRSwgT05FX09SX01PUkUsIE9QVElPTkFMLCBaRVJPX09SX01PUkV9OwotCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIHVzYWdlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgT0NDVVJFTkNFKTsKLQkJaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKHVzYWdlTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgodXNhZ2VMYWJlbC5nZXRUZXh0KCkpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJdXNhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW9jY3VycmVuY2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJb2NjdXJyZW5jZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9jY3VycmVuY2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJb2NjdXJyZW5jZUNvbWJvLnNldEl0ZW1zKG9jY3VycmVuY2VDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01SZXBlYXRhYmxlTm9kZSkgewotCQkJY2hhciBvY2N1cmVuY2UgPSAoKENNUmVwZWF0YWJsZU5vZGUpIGlucHV0KS5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlpZiAoQ01SZXBlYXRhYmxlTm9kZS5PTkNFID09IG9jY3VyZW5jZSkKLQkJCQlvY2N1cnJlbmNlQ29tYm8uc2V0VGV4dChPTkNFKTsKLQkJCWVsc2UgaWYgKENNUmVwZWF0YWJsZU5vZGUuT05FX09SX01PUkUgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9ORV9PUl9NT1JFKTsKLQkJCWVsc2UgaWYgKENNUmVwZWF0YWJsZU5vZGUuT1BUSU9OQUwgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9QVElPTkFMKTsKLQkJCWVsc2UgaWYgKENNUmVwZWF0YWJsZU5vZGUuWkVST19PUl9NT1JFID09IG9jY3VyZW5jZSkKLQkJCQlvY2N1cnJlbmNlQ29tYm8uc2V0VGV4dChaRVJPX09SX01PUkUpOwotCQkJZWxzZQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9OQ0UpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpIHsKLQkJCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCQlDTVJlcGVhdGFibGVOb2RlIG5vZGUgPSAoQ01SZXBlYXRhYmxlTm9kZSkgaW5wdXQ7Ci0JCQlTdHJpbmcgb2NjdXJyZW5jZSA9IG9jY3VycmVuY2VDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAoT05DRS5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuT05DRSk7Ci0JCQllbHNlIGlmIChPTkVfT1JfTU9SRS5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuT05FX09SX01PUkUpOwotCQkJZWxzZSBpZiAoT1BUSU9OQUwuZXF1YWxzKG9jY3VycmVuY2UpKQotCQkJCW5vZGUuc2V0T2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlLk9QVElPTkFMKTsKLQkJCWVsc2UgaWYgKFpFUk9fT1JfTU9SRS5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuWkVST19PUl9NT1JFKTsKLQkJCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmMwOGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVFlQRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRTsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtBdHRyaWJ1dGUuQ0RBVEEsIEF0dHJpYnV0ZS5JRCwgQXR0cmlidXRlLklEUkVGLCBBdHRyaWJ1dGUuSURSRUZTLCBBdHRyaWJ1dGUuRU5USVRZLCBBdHRyaWJ1dGUuRU5USVRJRVMsIEF0dHJpYnV0ZS5OTVRPS0VOLCBBdHRyaWJ1dGUuTk1UT0tFTlMsIEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05BTUUsIEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05PVEFUSU9OfTsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgVFlQRSk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyhjTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoY0xhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpCi0JCQkJdHlwZUNvbWJvLnNldFRleHQoKChBdHRyaWJ1dGUpIGlucHV0KS5nZXRUeXBlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGlucHV0OwotCQkJCWF0dHJpYnV0ZS5zZXRUeXBlKHR5cGVDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MmMxZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wOwotCi0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgYSBzb3VyY2Ugdmlld2VyIHdoaWNoIHNob3dzIERURCBjb250ZW50LgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yRFREOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JOb29wOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVCwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVCB8fCBwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTikgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JDU1MoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04pIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9yTm9vcCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckNTUygpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckRURCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yRFREOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JOb29wKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9yTm9vcCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JOb29wID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yTm9PcCgpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JOb29wOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc2NTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURUxJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX05PVEFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0RURF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9EVERfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0dST1VQX0FERF9HUk9VUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fR1JPVVBfSVRFTVNfTE9HSUNBTExZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fU09SVF9JVEVNUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9QQVJBTV9FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTU9WRV9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX05PREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfTk9ERVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ1JFQVRFX05FV19EVERfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19EVERfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfRFREX0VYUEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERURFVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjN2FiMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRFREVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERURFVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBkdGQgdWkuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgZHRkIHVpLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBEVERVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBkdGQgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGR0ZCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIERURFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBkdGQgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGR0ZCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5ORVcpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDc2YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURUxJU1Q9QWRkIEF0dHJpYnV0ZSAmTGlzdAotCi0hRFRET3V0bGluZXIKLV9VSV9BQ1RJT05fQUREX0RURF9OT1RBVElPTj1BZGQgJk5vdGF0aW9uCi1fVUlfQUNUSU9OX0FERF9EVERfRU5USVRZPUFkZCAmRW50aXR5Ci1fVUlfQUNUSU9OX0FERF9EVERfRUxFTUVOVD1BZGQgRWxlJm1lbnQKLV9VSV9BQ1RJT05fQUREX0RURF9DT01NRU5UPUFkZCAmQ29tbWVudAotX1VJX0FDVElPTl9EVERfREVMRVRFPSZEZWxldGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURT1BZGQgJkF0dHJpYnV0ZQotX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVA9QWRkIEdyb3VwIHRvIENvbiZ0ZW50IE1vZGVsCi1fVUlfQUNUSU9OX0FERF9FTEVNRU5UPUFkZCBFbGVtZW50IHRvIEMmb250ZW50IE1vZGVsCi0KLSFEVERDb250ZW50T3V0bGluZVBhZ2UKLV9VSV9CVVRUT05fR1JPVVBfSVRFTVNfTE9HSUNBTExZPUdyb3VwIGl0ZW1zIGxvZ2ljYWxseS4KLV9VSV9CVVRUT05fU09SVF9JVEVNUz1Tb3J0IGl0ZW1zIGFscGhhYmV0aWNhbGx5LgotCi0hRFREQ29udGV4dENvbnRyaWJ1dGVyCi1fVUlfQUNUSU9OX0FERF9QQVJBTV9FTlRJVFlfUkVGPUFkZCAmUGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2UKLQotIURyYWdBdHRyaWJ1dGVDb21tYW5kCi1fVUlfTU9WRV9BVFRSSUJVVEU9TW92ZSBBdHRyaWJ1dGUKLQotIURyYWdDb250ZW50TW9kZWxDb21tYW5kCi1fVUlfTU9WRV9DT05URU5UPU1vdmUgQ29udGVudAotCi0hRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kCi1fVUlfTU9WRV9OT0RFPU1vdmUgTm9kZQotX1VJX01PVkVfTk9ERVM9TW92ZSBOb2RlcwotCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfRFREPVRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi0KLSNEVEQgRmlsZSBwYWdlCi1DcmVhdGluZ19maWxlcz1DcmVhdGluZyBmaWxlcwotRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbD1BZGQgdGhpcyBzdWZmaXggKGlmIG5vdCBzcGVjaWZpZWQpOgotRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvcj1TdWZmaXggbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB7MH0uCi0KLSNEVEQgU3R5bGUgcGFnZQotRFREQ29sb3JQYWdlXzA9PCFFTEVNRU5UIE1haW4gKE9uZSxUd28rKT5cclxuPCFFTEVNRU5UIE9uZSAoVGhyZWUsRm91cik+XHJcbjwhQVRUTElTVCBPbmVcclxuIG9uZW9uZSBDREFUQSAjUkVRVUlSRURcclxuPlxyXG48IS0tIFlvdSBuZWVkIHRoaXMgLS0+XHJcbjwhRUxFTUVOVCBUd28gKG1vcmVtb3JlKik+XHJcbjwhQVRUTElTVCBUd29cclxuIHR3b3R3byBDREFUQSAjUkVRVUlSRURcclxuIHR3b3RocmVlIChhYWEgfCBiYmIpICJhYWEiXHJcbj5cclxuCi1EVERDb2xvclBhZ2VfMT1Db21tZW50cwotRFREQ29sb3JQYWdlXzI9RGF0YQotRFREQ29sb3JQYWdlXzM9RGVmYXVsdAotRFREQ29sb3JQYWdlXzQ9S2V5d29yZHMKLURURENvbG9yUGFnZV81PVN0cmluZ3MKLURURENvbG9yUGFnZV82PVN5bWJvbHMKLURURENvbG9yUGFnZV83PVRhZyBEZWxpbWl0ZXJzCi1EVERDb2xvclBhZ2VfOD1UYWcgTmFtZXMKLURURFByb3BlcnR5U291cmNlQWRhcHRlcl8wPU5hbWUKLURURFByb3BlcnR5U291cmNlQWRhcHRlcl8xPUNvbnRlbnRzCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMj1BdHRyaWJ1dGVzCi0KLSEgTmV3RFREV2l6YXJkLmphdmEKLV9VSV9DUkVBVEVfTkVXX0RURF9GSUxFICAgICAgPSBDcmVhdGUgYSBuZXcgRFREIGZpbGUuCi1fVUlfV0laQVJEX05FV19EVERfVElUTEUgICAgID0gQ3JlYXRlIERURAotX1VJX1dJWkFSRF9ORVdfRFREX0VYUEwgICAgICA9IENyZWF0ZSBhIG5ldyBEVEQgZmlsZS4gU3BlY2lmeSB0aGUgZm9sZGVyIGFuZCBuYW1lIGZvciB0aGUgZmlsZS4KLQotIyBjb3BpZWQgZnJvbSBkdGQgY29yZQotX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURT1EZWxldGUKLSMjCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBEVEQgVGVtcGxhdGUKLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIERURCBwYWdlLgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV80PVVzZSBEVEQgVGVtcGxhdGUKLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNT1QcmV2aWV3OgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBEVEQnIHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgPGE+RFREIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotCi1Tb3VyY2VNZW51X2xhYmVsPVNvdXJjZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjE3YjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQkJCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EVEREcmFnQW5kRHJvcE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRFRERHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZTZmODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EVEREcmFnQW5kRHJvcE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuVG9wTGV2ZWxOb2RlOwotCi1wdWJsaWMgY2xhc3MgRFRERHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyIHsKLQotCXB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEcmFnQXR0cmlidXRlQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjBlZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0F0dHJpYnV0ZUNvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXB1YmxpYyBEcmFnQXR0cmlidXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQXR0cmlidXRlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEVEROb2RlIHJlZmVyZW5jZU5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VOb2RlLmdldERUREZpbGUoKTsKLQkJaWYgKHJlZmVyZW5jZU5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX0FUVFJJQlVURSk7IC8vJE5PTi1OTFMtMSQKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSByZWZlcmVuY2VOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQkJYXR0TGlzdC5pbnNlcnRJbnRvTW9kZWwodGhpcywgKEF0dHJpYnV0ZSkgcmVmZXJlbmNlTm9kZSwgKEF0dHJpYnV0ZSkgbm9kZSwgaXNBZnRlcigpKTsKLQkJCQkJZHRkRmlsZS5kZWxldGVOb2RlKHRoaXMsIG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjA1NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQ29udGVudE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBEcmFnQ29udGVudE1vZGVsQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCi0JcHVibGljIERyYWdDb250ZW50TW9kZWxDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgQ01Ob2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBDTU5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0KLQkJaWYgKHJlZmVyZW5jZU5vZGUgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZU5vZGUuZ2V0RFRERmlsZSgpOwotCi0JCQlEVEROb2RlIHBhcmVudCA9IChEVEROb2RlKSByZWZlcmVuY2VOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQlib29sZWFuIHBhcmVudElzRWxlbWVudCA9IGZhbHNlOwotCQkJRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCUNNR3JvdXBOb2RlIGdyb3VwID0gbnVsbDsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJcGFyZW50SXNFbGVtZW50ID0gdHJ1ZTsKLQkJCQllbGVtZW50ID0gKEVsZW1lbnQpIHBhcmVudDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdyb3VwID0gKENNR3JvdXBOb2RlKSBwYXJlbnQ7Ci0JCQl9Ci0KLQkJCWlmIChlbGVtZW50ID09IG51bGwgJiYgZ3JvdXAgPT0gbnVsbCkgewotCQkJCS8vIG5vIHBhcmVudCB0byBhZGQgdG8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQkJaWYgKHBhcmVudElzRWxlbWVudCkgewotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCkgPT0gbm9kZSkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudC5yZXBsYWNlQ29udGVudE1vZGVsKHRoaXMsIChDTU5vZGUpIG5vZGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHJlZmVyZW5jZU5vZGUgPT0gbm9kZSB8fCAoaXNBZnRlcigpICYmIHJlZmVyZW5jZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlKSB8fCAoIWlzQWZ0ZXIoKSAmJiBub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gcmVmZXJlbmNlTm9kZSkpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQotCQkJCQkJZ3JvdXAuaW5zZXJ0SW50b01vZGVsKHRoaXMsIChDTU5vZGUpIHJlZmVyZW5jZU5vZGUsIChDTU5vZGUpIG5vZGUsIGlzQWZ0ZXIoKSk7Ci0KLQkJCQkJfQotCQkJCQlEVEROb2RlIG5vZGVQYXJlbnQgPSAoRFRETm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCW5vZGVQYXJlbnQuZGVsZXRlKHRoaXMsIG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZlZWRiYWNrKCkgewotCQlEVEROb2RlIHJlZmVyZW5jZU5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCQlpZiAocmVmZXJlbmNlTm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpIHJlZmVyZW5jZU5vZGU7Ci0JCQlpZiAoY21Ob2RlLmlzUm9vdEVsZW1lbnRDb250ZW50KCkgJiYgY21Ob2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQlyZXR1cm4gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRGZWVkYmFjaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjc2MzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlRvcExldmVsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZSA9IERURFVJTWVzc2FnZXMuX1VJX01PVkVfTk9ERTsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZXMgPSBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX05PREVTOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0KLQkJRFRERmlsZSBkdGRGaWxlID0gcmVmZXJlbmNlTm9kZS5nZXREVERGaWxlKCk7Ci0JCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBzb3VyY2VzLnNpemUoKSA+IDEgPyBtb3ZlTm9kZXMgOiBtb3ZlTm9kZSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQlkdGRGaWxlLm1vdmVOb2RlKHRoaXMsIHJlZmVyZW5jZU5vZGUsIG5vZGUsIGlzQWZ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzIwZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvcjsKLQotLyoqCi0gKiBYTUxFZGl0b3JBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckRURCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkNvbnRyaWJ1dG9yI2dldEV4dGVuc2lvbklEcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmRXhwYW5kU2VsZWN0aW9uVG9NZW51KTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCQl9Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCVN0cmluZyBzb3VyY2VNZW51TGFiZWwgPSBEVERVSU1lc3NhZ2VzLlNvdXJjZU1lbnVfbGFiZWw7Ci0JCVN0cmluZyBzb3VyY2VNZW51SWQgPSAic291cmNlTWVudUlkIjsgLy8kTk9OLU5MUy0xJAotCQlJTWVudU1hbmFnZXIgc291cmNlTWVudSA9IG5ldyBNZW51TWFuYWdlcihzb3VyY2VNZW51TGFiZWwsIHNvdXJjZU1lbnVJZCk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHNvdXJjZU1lbnUpOwotCQlpZiAoc291cmNlTWVudSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0UmlnaHQpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0TGVmdCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU3ZmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqIAotICogTk9URTogRm9yIGludGVybmFsIHVzZSBvbmx5LiBGb3IgaW1hZ2VzIHVzZWQgZXh0ZXJuYWxseSwgcGxlYXNlIHVzZSB0aGUKLSAqIFNoYXJlZCoqKkltYWdlSGVscGVyIGNsYXNzIGluc3RlYWQuCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJLy8gZG9udCBhZGQgdGhlIG1pc3NpbmcgaW1hZ2UgZGVzY3JpcHRvciBpbWFnZSB0byB0aGUgaW1hZ2UKLQkJCS8vIHJlZ2lzdHJ5Ci0JCQlpZiAoIWRlc2MuZXF1YWxzKEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkpKQotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMTE1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgRFREIFNvdXJjZSBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIERUREVkaXRvclBsdWdpbkltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0FERF9BVFRSSUJVVEUgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0FERF9FTEVNRU5UID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9BRERfQVRUUklCVVRFID0gImljb25zL2Z1bGwvZHRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0VMRU1FTlQgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMID0gImljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMID0gImljb25zL2Z1bGwvZHRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQUREX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL2V0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9FTEVNRU5UID0gImljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2V0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9DT01NRU5UID0gImljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX0VOVElUWSA9ICJpY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX0VOVElUWV9SRUZFUkVOQ0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfTk9UQVRJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9BRERfTm90YXRpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfT1JHQU5JWkVfRFREX0xPR0lDQUxMWSA9ICJpY29ucy9mdWxsL29iajE2L29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU09SVCA9ICJpY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVkFMSURBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi92YWxpZGF0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdEVERGSUxFID0gImljb25zL2Z1bGwvd2l6YmFuL25ld2R0ZGZpbGVfd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhkZDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgRFREIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjAiOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAyMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBEVEQgVGVtcGxhdGUgUHJlZmVyZW5jZSBwYWdlIChubyBpZCBmb3IgdGhpcyB5ZXQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gRFREIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCArICJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERURCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAiZHRkdzAwMTAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMmEzZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi1wdWJsaWMgY2xhc3MgRFREQ29sb3JQYWdlIGV4dGVuZHMgQWJzdHJhY3RDb2xvclBhZ2UgewotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkoKEdyaWREYXRhKSBwYWdlQ29tcG9uZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQotCQlzdXBlci5jcmVhdGVDb250ZW50cyhwYWdlQ29tcG9uZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT05URU5UX0VNUFRZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfQU5ZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5BTUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0sIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVORF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzEpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8yKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzQpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzUpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzYpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzcpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV84KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKS5nZXRQYXJzZXIoKSk7Ci0KLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFRERmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGZmZmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBUZXh0IGZEZWZhdWx0U3VmZml4ID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlZhbGlkRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCi0JCUdyb3VwIGNyZWF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIDIpOwotCQljcmVhdGluZ0dyb3VwLnNldFRleHQoRFREVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlcyk7Ci0KLQkJLy8gRGVmYXVsdCBleHRlbnNpb24gZm9yIE5ldyBmaWxlIFdpemFyZAotCQljcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLCBEVERVSU1lc3NhZ2VzLkRUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWwpOwotCQlmRGVmYXVsdFN1ZmZpeCA9IGNyZWF0ZVRleHRGaWVsZChjcmVhdGluZ0dyb3VwKTsKLQkJZkRlZmF1bHRTdWZmaXguYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZEZWZhdWx0U3VmZml4LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucwotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2UjZ2V0TW9kZWxQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCQlmRGVmYXVsdFN1ZmZpeC5zZXRUZXh0KHN1ZmZpeCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCBzdWZmaXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVmFsdWVzKCkgewotCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQkJSXRlcmF0b3IgaSA9IGdldFZhbGlkRXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSAmJiAhaXNWYWxpZCkgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJaXNWYWxpZCA9IGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKGZEZWZhdWx0U3VmZml4LmdldFRleHQoKSk7Ci0JCX0KLQotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChEVERVSU1lc3NhZ2VzLkRUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3IsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldFZhbGlkKHRydWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDBmYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIERURCB0ZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIERURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIHsKLQkKLQlwdWJsaWMgRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJRFREVUlQbHVnaW4gZHRkVUlQbHVnaW4gPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoZHRkVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKGR0ZFVJUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoZHRkVUlQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAJICBib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0gIAkgIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkgIHJldHVybiBvazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliYTk1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIERURCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIERURCBTdHlsZSBQcmVmZXJlbmNlcwotCQlTdHJpbmcgTk9CQUNLR1JPVU5EQk9MRCA9ICIgfCBudWxsIHwgZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgc3R5bGVWYWx1ZSk7IC8vIGJsYWNrCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCA2MywgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcsIHN0eWxlVmFsdWUpOyAvLyBibHVlCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCBzdHlsZVZhbHVlKTsgLy8gYmx1ZQotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygxMjcsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCBzdHlsZVZhbHVlKTsgLy8gZ3JleQotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygxMjgsIDAsIDApICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIHN0eWxlVmFsdWUpOyAvLyBkYXJrCi0JCS8vIHJlZAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgMTU5LCA5NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCBzdHlsZVZhbHVlKTsgLy8gZ3JlZW4KLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTkxLCA5NSwgOTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEsIHN0eWxlVmFsdWUpOyAvLyBsaWdodAotCQkvLyByZWQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTI4LCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wsIHN0eWxlVmFsdWUpOyAvLyBkYXJrCi0JCS8vIHJlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZjJmNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBEVEQgVUkKLSAqLwotcHVibGljIGNsYXNzIERURFVJUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIERURFVJUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIGluc3RhbmNlCi0JfQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgRFREIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmIzMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ub3BMZXZlbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyB0aGUgcHJvamVjdGlvbiBtb2RlbCBvZiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIERURC4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFREIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLCBJUHJvamVjdGlvbkxpc3RlbmVyLCBJRFRERmlsZUxpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuZHRkLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgY2xhc3MgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXh0ZW5kcyBQcm9qZWN0aW9uQW5ub3RhdGlvbiB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmSXNWaXNpYmxlID0gZmFsc2U7IC8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCXByaXZhdGUgTm9kZSBmTm9kZTsKLQotCQlwdWJsaWMgVGFnUHJvamVjdGlvbkFubm90YXRpb24oTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIGZOb2RlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBEb2VzIG5vdCBwYWludCBoaWRkZW4gYW5ub3RhdGlvbnMuIEFubm90YXRpb25zIGFyZSBoaWRkZW4gd2hlbiB0aGV5Ci0JCSAqIG9ubHkgc3BhbiBvbmUgbGluZS4KLQkJICogCi0JCSAqIEBzZWUgUHJvamVjdGlvbkFubm90YXRpb24jcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIENhbnZhcyBjYW52YXMsIFJlY3RhbmdsZSByZWN0YW5nbGUpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvKgotCQkJICogb25seSBuZWVkIHRvIGNoZWNrIGFubm90YXRpb25zIHRoYXQgYXJlIGV4cGFuZGVkIGJlY2F1c2UgaGlkZGVuCi0JCQkgKiBhbm5vdGF0aW9ucyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGdpdmVuIHRoZSBjaGFuY2UgdG8KLQkJCSAqIGNvbGxhcHNlLgotCQkJICovCi0JCQlpZiAoIWlzQ29sbGFwc2VkKCkpIHsKLQkJCQkvLyB3b3JraW5nIHdpdGggcmVjdGFuZ2xlLCBzbyBsaW5lIGhlaWdodAotCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJCWlmIChtZXRyaWNzICE9IG51bGwpIHsKLQkJCQkJLy8gZG8gbm90IGRyYXcgYW5ub3RhdGlvbnMgdGhhdCBvbmx5IHNwYW4gb25lIGxpbmUgYW5kCi0JCQkJCS8vIG1hcmsgdGhlbSBhcyBub3QgdmlzaWJsZQotCQkJCQlpZiAoKHJlY3RhbmdsZS5oZWlnaHQgLyBtZXRyaWNzLmdldEhlaWdodCgpKSA8PSAxKSB7Ci0JCQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmSXNWaXNpYmxlID0gdHJ1ZTsKLQkJCXN1cGVyLnBhaW50KGdjLCBjYW52YXMsIHJlY3RhbmdsZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb24jbWFya0NvbGxhcHNlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtYXJrQ29sbGFwc2VkKCkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8vIGRvIG5vdCBtYXJrIGNvbGxhcHNlZCBpZiBhbm5vdGF0aW9uIGlzIG5vdCB2aXNpYmxlCi0JCQlpZiAoZklzVmlzaWJsZSkKLQkJCQlzdXBlci5tYXJrQ29sbGFwc2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQljbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJaWYgKGZEb2N1bWVudCA9PSBldmVudC5nZXREb2N1bWVudCgpKQotCQkJCWZJc0RvY3VtZW50Q2hhbmdpbmcgPSB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkRvY3VtZW50ID09IGRvY3VtZW50KSB7Ci0JCQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCAmJiBmUXVldWVkTm9kZUNoYW5nZXMgIT0gbnVsbCAmJiAhZlF1ZXVlZE5vZGVDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQljbGFzcyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgewotCQlwdWJsaWMgdm9pZCBwZXJmb3JtKElEb2N1bWVudCBkb2N1bWVudCwgSURvY3VtZW50TGlzdGVuZXIgb3duZXIpIHsKLQkJCWFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udGFpbnMgbm9kZSBhbmQgYW4gaW5kaWNhdGlvbiBvbiBob3cgaXQgY2hhbmdlZAotCSAqLwotCWNsYXNzIE5vZGVDaGFuZ2UgewotCQlzdGF0aWMgZmluYWwgaW50IEFERCA9IDE7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFID0gMjsKLQotCQlwcml2YXRlIE5vZGUgZk5vZGU7Ci0JCXByaXZhdGUgaW50IGZDaGFuZ2VUeXBlOwotCi0JCXB1YmxpYyBOb2RlQ2hhbmdlKE5vZGUgbm9kZSwgaW50IGNoYW5nZVR5cGUpIHsKLQkJCWZOb2RlID0gbm9kZTsKLQkJCWZDaGFuZ2VUeXBlID0gY2hhbmdlVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENoYW5nZVR5cGUoKSB7Ci0JCQlyZXR1cm4gZkNoYW5nZVR5cGU7Ci0JCX0KLQl9Ci0KLQlJRG9jdW1lbnQgZkRvY3VtZW50OwotCVByb2plY3Rpb25WaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIGJvb2xlYW4gZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlib29sZWFuIGZJc0RvY3VtZW50Q2hhbmdpbmcgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0IG9mIGNoYW5nZWQgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZAotCSAqLwotCUxpc3QgZlF1ZXVlZE5vZGVDaGFuZ2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFByb2Nlc3NlcyBhbGwgdGhlIHF1ZXVlZCBub2RlIGNoYW5nZXMgYW5kIHVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uCi0JICogbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwgJiYgZlF1ZXVlZE5vZGVDaGFuZ2VzICE9IG51bGwgJiYgIWZRdWV1ZWROb2RlQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCk7Ci0KLQkJCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkgdGhlbSB0bwotCQkJLy8gdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCQkJd2hpbGUgKCFmUXVldWVkTm9kZUNoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQkJTm9kZUNoYW5nZSBjaGFuZ2VzID0gKE5vZGVDaGFuZ2UpIGZRdWV1ZWROb2RlQ2hhbmdlcy5yZW1vdmUoMCk7Ci0JCQkJaWYgKGNoYW5nZXMuZ2V0Q2hhbmdlVHlwZSgpID09IE5vZGVDaGFuZ2UuQUREKSB7Ci0JCQkJCS8vIGFkZAotCQkJCQlOb2RlIG5vZGUgPSBjaGFuZ2VzLmdldE5vZGUoKTsKLQkJCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKG5vZGUpOwotCQkJCQlpZiAobmV3UG9zICE9IG51bGwpIHsKLQkJCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24obm9kZSwgZmFsc2UpOwotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlhbm5vdGF0aW9uTW9kZWwuYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgbG9nIGl0IGFuZCBjb250aW51ZQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChjaGFuZ2VzLmdldENoYW5nZVR5cGUoKSA9PSBOb2RlQ2hhbmdlLlJFTU9WRSkgewotCQkJCQkvLyByZW1vdmUKLQkJCQkJTm9kZSBub2RlID0gY2hhbmdlcy5nZXROb2RlKCk7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBmaW5kRXhpc3RpbmdBbm5vdGF0aW9uKG5vZGUpOwotCQkJCQlpZiAoYW5ubyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbm5vdGF0aW9uKGFubm8pOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgbG9nIGl0IGFuZCBjb250aW51ZQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZRdWV1ZWROb2RlQ2hhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBjcmVhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBpZiBuZWVkZWQKLQkgKiAKLQkgKiBAcGFyYW0gRFRERmlsZQotCSAqICAgICAgICAgICAgYXNzdW1lcyBmaWxlIGlzIG5vdCBudWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbEFubm90YXRpb25zKERUREZpbGUgZmlsZSkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTGlzdCBub2RlcyA9IGZpbGUuZ2V0Tm9kZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXQubmV4dCgpOwotCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKG5vZGUpOwotCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihub2RlLCBmYWxzZSk7Ci0JCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCWZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLmFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURC5hZGRBbGxBbm5vdGF0aW9uczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm9qZWN0aW9uIHBvc2l0aW9uIGZyb20gdGhlIGdpdmVuIG5vZGUuIEFibGUgdG8gZ2V0Ci0JICogcHJvamVjdGlvbiBwb3NpdGlvbiBpZiBub2RlIGlzTm9kZVByb2plY3RhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBudWxsIGlmIG5vIHByb2plY3Rpb24gcG9zaXRpb24gcG9zc2libGUsIGEgUG9zaXRpb24gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oTm9kZSBub2RlKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZlZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQkJaW50IHN0YXJ0ID0gaW5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kID0gaW5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkJcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhyb3VnaCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgYW5kIHJldHJpZXZlcwotCSAqIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZvciBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZvciBub2RlIG9yIG51bGwgaWYgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmaW5kRXhpc3RpbmdBbm5vdGF0aW9uKE5vZGUgbm9kZSkgewotCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gbnVsbDsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKGEuZ2V0Tm9kZSgpKSkKLQkJCQkJYW5ubyA9IGE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm87Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBkdGQgZmlsZSBmb3IgdGhlIGZEb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gRFRERmlsZSBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IG51bGw7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsIGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkJCWR0ZEZpbGUgPSAoKERURE1vZGVsSW1wbCkgc01vZGVsKS5nZXREVERGaWxlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGlzIHByb3ZpZGVyIHdpdGggdGhlIGNvcnJlY3QgZG9jdW1lbnQuIEFzc3VtZXMgcHJvamVjdGlvbgotCSAqIGlzIGVuYWJsZWQuIChvdGhlcndpc2UsIG9ubHkgaW5zdGFsbCB3b3VsZCBoYXZlIGJlZW4gY2FsbGVkKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmICghaXNJbnN0YWxsZWQoKSkKLQkJCXJldHVybjsKLQotCQkvLyByZW1vdmUgb2xkIGluZm8KLQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJZkRvY3VtZW50ID0gZlZpZXdlci5nZXREb2N1bWVudCgpOwotCQlEVERGaWxlIGZpbGUgPSBnZXREVERGaWxlKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCAmJiBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkKLQkJCQlmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKCk7Ci0KLQkJCWZEb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQotCQkJLy8gYWRkIGR0ZCBmaWxlIGxpc3RlbmVyIHRvIG5ldyBkdGQgZmlsZQotCQkJZmlsZS5hZGREVERGaWxlTGlzdGVuZXIodGhpcyk7Ci0KLQkJCWFkZEFsbEFubm90YXRpb25zKGZpbGUpOwotCQl9Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFzc29jaWF0ZSBhIFByb2plY3Rpb25WaWV3ZXIgd2l0aCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHVuaW5zdGFsbCBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbGwgbmV3IHZpZXdlcgotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJdW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgbm9kZSB0eXBlIGFibGUgdG8gZm9sZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbm9kZSBpcyBwcm9qZWN0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTm9kZVByb2plY3RhYmxlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCS8qCi0JCSAqIERvbid0IGJlbGlldmUgdGhpcyBpcyBuZWNlc3NhcnkgKHVzZWQgdG8gbmVlZCBpdCB0byBvbmx5IGFkZAotCQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIGVsZW1lbnRzIHRoYXQgc3BhbiBtb3JlIHRoYW4gb25lIGxpbmUsCi0JCSAqIGJ1dCBub3cganVzdCBhbHdheXMgYWRkIHByb2plY3Rpb24gYW5ub3RhdGlvbikKLQkJICovCi0JCS8vIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gLy8gcmVjYWxjdWxhdGUgcHJvamVjdGlvbiBhbm5vdGF0aW9ucyBmb3Igbm9kZQotCQkvLyAvLyBjaGVjayBpZiB0aGlzIHdhcyBldmVuIGEgcHJvamVjdGFibGUgbm9kZSB0byBzdGFydCB3aXRoCi0JCS8vIGlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCQkvLyAvLyBmaW5kIHRoZSBleGlzdGluZyBhbm5vdGF0aW9uCi0JCS8vIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBmaW5kRXhpc3RpbmdBbm5vdGF0aW9uKG5vZGUpOwotCQkvLyAvLyBpZiBhYmxlIHRvIHByb2plY3Qgbm9kZSBzZWUgaWYgcHJvamVjdGlvbiBhbm5vdGF0aW9uIHdhcwotCQkvLyAvLyBhbHJlYWR5IGNyZWF0ZWQgYW5kIGNyZWF0ZSBuZXcgaWYgbmVlZGVkCi0JCS8vIFBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihub2RlKTsKLQkJLy8gaWYgKG5ld1BvcyAhPSBudWxsICYmIGFubm8gPT0gbnVsbCkgewotCQkvLyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3Ci0JCS8vIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKG5vZGUsIGZhbHNlKTsKLQkJLy8gLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkvLyBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5hZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb24sCi0JCS8vIG5ld1Bvcyk7Ci0JCS8vIH0KLQkJLy8gLy8gaWYgbm90IGFibGUgdG8gcHJvamVjdCBub2RlIHNlZSBpZiBwcm9qZWN0aW9uIGFubm90YXRpb24gd2FzCi0JCS8vIC8vIGFscmVhZHkgY3JlYXRlZCBhbmQgcmVtb3ZlIGl0Ci0JCS8vIGlmIChuZXdQb3MgPT0gbnVsbCAmJiBhbm5vICE9IG51bGwpIHsKLQkJLy8gZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkucmVtb3ZlQW5ub3RhdGlvbihhbm5vKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIGlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCS8vIFN0cmluZyBub2RlTmFtZSA9IG5vZGUgIT0gbnVsbCA/IG5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELm5vZGVDaGFuZ2VkICgiCi0JCS8vICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyB9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNBZGRlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlwcm9jZXNzTm9kZXNFdmVudChldmVudCwgTm9kZUNoYW5nZS5BREQpOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURC5ub2Rlc0FkZGVkOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBjaGFuZ2VkIG5vZGUgaW4gZXZlbnQgYW5kIGFkZCB0byBxdWV1ZSBvZiBub2RlCi0JICogY2hhbmdlcyB0aGF0IHdpbGwgYmUgcmVjYWxjdWxhdGVkIGZvciBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogQHBhcmFtIGNoYW5nZVR5cGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc05vZGVzRXZlbnQoTm9kZXNFdmVudCBldmVudCwgaW50IGNoYW5nZVR5cGUpIHsKLQkJTGlzdCBub2RlcyA9IGV2ZW50LmdldE5vZGVzKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0Lm5leHQoKTsKLQkJCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCQkJCWlmIChmUXVldWVkTm9kZUNoYW5nZXMgPT0gbnVsbCkgewotCQkJCQlmUXVldWVkTm9kZUNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJfQotCi0JCQkJaW50IGV4aXN0aW5nSW5kZXggPSBmUXVldWVkTm9kZUNoYW5nZXMuaW5kZXhPZihub2RlKTsKLQkJCQlpZiAoZXhpc3RpbmdJbmRleCA+IC0xKSB7Ci0JCQkJCS8vIG5vZGUgaXMgYWxyZWFkeSBxdWV1ZWQgdXAKLQkJCQkJTm9kZUNoYW5nZSBleGlzdGluZ0NoYW5nZSA9IChOb2RlQ2hhbmdlKSBmUXVldWVkTm9kZUNoYW5nZXMucmVtb3ZlKGV4aXN0aW5nSW5kZXgpOwotCQkJCQkvLyBkb24ndCBhZGQgaWYgYWRkZWQgdGhlbiByZW1vdmVkIG5vZGUgb3IgdmljZSB2ZXJzYQotCQkJCQlpZiAoZXhpc3RpbmdDaGFuZ2UuZ2V0Q2hhbmdlVHlwZSgpID09IGNoYW5nZVR5cGUpIHsKLQkJCQkJCU5vZGVDaGFuZ2UgbmV3Q2hhbmdlID0gbmV3IE5vZGVDaGFuZ2Uobm9kZSwgY2hhbmdlVHlwZSk7Ci0JCQkJCQlmUXVldWVkTm9kZUNoYW5nZXMuYWRkKG5ld0NoYW5nZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdCBxdWV1ZWQgdXAgeWV0LCBzbyBxdWV1ZSBub2RlCi0JCQkJCU5vZGVDaGFuZ2UgbmV3Q2hhbmdlID0gbmV3IE5vZGVDaGFuZ2Uobm9kZSwgY2hhbmdlVHlwZSk7Ci0JCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcy5hZGQobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgZG9jdW1lbnQgaXNuJ3QgY2hhbmdpbmcsIGdvIGFoZWFkIGFuZCBhcHBseSBpdAotCQlpZiAoIWZJc0RvY3VtZW50Q2hhbmdpbmcpIHsKLQkJCWFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCXByb2Nlc3NOb2Rlc0V2ZW50KGV2ZW50LCBOb2RlQ2hhbmdlLlJFTU9WRSk7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELm5vZGVzUmVtb3ZlZDogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCURUREZpbGUgZmlsZSA9IGdldERUREZpbGUoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZmlsZS5yZW1vdmVEVERGaWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQkvLyByZW1vdmUgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJCWZEb2N1bWVudCA9IG51bGw7Ci0KLQkJCS8vIGNsZWFyIG91dCBsaXN0IG9mIHF1ZXVlZCBjaGFuZ2VzIHNpbmNlIGl0IG1heSBubyBsb25nZXIgYmUKLQkJCS8vIGFjY3VyYXRlCi0JCQlpZiAoZlF1ZXVlZE5vZGVDaGFuZ2VzICE9IG51bGwpIHsKLQkJCQlmUXVldWVkTm9kZUNoYW5nZXMuY2xlYXIoKTsKLQkJCQlmUXVldWVkTm9kZUNoYW5nZXMgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBmb2xkaW5nIGlzIGVuYWJsZWQgYW5kIG5ldyBkb2N1bWVudCBpcyBnb2luZyB0byBiZSBhIHRvdGFsbHkKLQkJLy8gZGlmZmVyZW50IGRvY3VtZW50LCBkaXNhYmxlIHByb2plY3Rpb24KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIGZEb2N1bWVudCAhPSBuZXdJbnB1dCkgewotCQkJLy8gZGlzYWJsZSBwcm9qZWN0aW9uIGFuZCBkaXNjb25uZWN0IGV2ZXJ5dGhpbmcKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIHByb2plY3Rpb24gd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgaW5wdXQgZG9jdW1lbnQgY2hhbmdlZAotCQkvLyBhbmQgbmV3IGRvY3VtZW50IGlzIGRpZmZlcmVudCB0aGFuIG9sZCBkb2N1bWVudAotCQlpZiAoZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkICYmIGZEb2N1bWVudCA9PSBudWxsICYmIG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCXByb2plY3Rpb25FbmFibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIgZnJvbSBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCQlmVmlld2VyLnJlbW92ZVByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJiNTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogQGF1dGhvciBuaXRpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckRURCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckRURCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVpbml0aWFsaXplRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8sIHNpbmNlIG5vIGVtYmVkZGVkIHR5cGUKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiY2FkZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLAotICogQ29sb3JNYW5hZ2VyLCBhbmQgYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNEVEQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0NPTU1FTlQgPSAiZHRkQ29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERhdGEgYXJlIHZhcmlhYmxlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9EQVRBID0gImR0ZERhdGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0RFRkFVTFQgPSAiZHRkRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGtleXdvcmRzIGFyZSBjb25zdGFudHMgbGlrZSBJTVBMSUVEIG9yIFBDREFUQQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9LRVlXT1JEID0gImR0ZEtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBzdHJpbmdzIGFyZSBhbnl0aGluZyBpbiBxdW90ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1RSSU5HID0gImR0ZFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEFsbCB0aGUgcmVtYWluaW5nIHN5bWJvbHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1lNQk9MID0gImR0ZFN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ3MgYXJlICc8JywgJyEnLCBvciAnPicKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHID0gImR0ZFRhZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ25hbWVzIGFyZSBsaWtlIEVMRU1FTlQsIEFUVExJU1QsIGV0Yy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHTkFNRSA9ICJkdGRUYWdOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4ZDcxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckRURCBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLyoqCi0JCSAqIGEgbWV0aG9kIHRvIGNlbnRyYWxpemUgYWxsIHRoZSAiZm9ybWF0IHJ1bGVzIiBmb3IgcmVnaW9ucwotCQkgKiBzcGVjaWZpY2FsbHkgYXNzb2NpYXRlZCBmb3IgaG93IHRvICJvcGVuIiB0aGUgcmVnaW9uLgotCQkgKi8KLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgY29taW5nIHRocm91Z2ggbnVsbCwgYnV0IGp1c3QgdG8gY2F0Y2ggaXQKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCk7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX0VNUFRZIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9BTlkgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUiB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVORF9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLk5BTUUgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSkgewotCQkJLy8gaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIERURFJlZ2lvbikgewotCQkJLy8gRFREUmVnaW9uIGR0ZFJlZ2lvbiA9IChEVERSZWdpb24pIHJlZ2lvbjsKLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBkdGRSZWdpb24uZ2V0UGFyZW50KCk7Ci0JCQkvLyBTdHJpbmcgcmVnaW9uVGV4dCA9IGZsYXROb2RlLmdldFRleHQoZHRkUmVnaW9uKTsKLQkJCS8vIGlmIChyZWdpb25UZXh0LmVxdWFscygiQU5ZIikgfHwgcmVnaW9uVGV4dC5lcXVhbHMoIkVNUFRZIikpIHsKLQkJCS8vIHJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZShEVERDb2xvcnMuRFREX0tFWVdPUkQpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQl9Ci0KLQkJLy8gZGVmYXVsdCwgcmV0dXJuIG51bGwgdG8gc2lnbmFsICJub3QgaGFuZGxlZCIKLQkJLy8gaW4gd2hpY2ggY2FzZSwgb3RoZXIgZmFjdG9yaWVzIHNob3VsZCBiZSB0cmllZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUc7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ4ZjBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldCBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIEhpZ2hsaWdodGVyIGZIaWdobGlnaHRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZJbnRlcm5hbE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREIGZJbnRlcm5hbFByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIFN0eWxlUmFuZ2VbXSBmSW50ZXJuYWxSYW5nZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvbmluZyA9IG51bGw7Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJbnRlcm5hbFByb3ZpZGVyID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yRFREKCk7Ci0JCWZJbnRlcm5hbFJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCQlmUGFydGl0aW9uaW5nID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORzsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5lUmVxdWVzdFN0YXJ0Ci0JICogQHBhcmFtIGxpbmVSZXF1ZXN0TGVuZ3RoCi0JICogQHBhcmFtIGhvbGRSZXN1bHRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN0eWxlUmFuZ2VzKGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMsIGludCBhZGp1c3RtZW50KSB7Ci0JCWludCBsaW5lUmVxdWVzdEVuZCA9IGxpbmVSZXF1ZXN0U3RhcnQgKyBsaW5lUmVxdWVzdExlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmSW50ZXJuYWxSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBhZGp1c3RlZFN0eWxlUmFuZ2VTdGFydCA9IGFkanVzdG1lbnQgKyBmSW50ZXJuYWxSYW5nZXNbaV0uc3RhcnQ7Ci0JCQlpbnQgYWRqdXN0ZWRTdHlsZVJhbmdlRW5kID0gYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQgKyBmSW50ZXJuYWxSYW5nZXNbaV0ubGVuZ3RoOwotCQkJaWYgKGFkanVzdGVkU3R5bGVSYW5nZUVuZCA8IGxpbmVSZXF1ZXN0U3RhcnQgfHwgbGluZVJlcXVlc3RFbmQgPCBhZGp1c3RlZFN0eWxlUmFuZ2VTdGFydCkKLQkJCQljb250aW51ZTsKLQkJCWludCBlbmQgPSBNYXRoLm1pbihhZGp1c3RlZFN0eWxlUmFuZ2VFbmQsIGxpbmVSZXF1ZXN0RW5kKTsKLQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgpOwotCQkJcmFuZ2Uuc3RhcnQgPSBNYXRoLm1heChhZGp1c3RlZFN0eWxlUmFuZ2VTdGFydCwgbGluZVJlcXVlc3RTdGFydCk7Ci0JCQlyYW5nZS5sZW5ndGggPSBlbmQgLSByYW5nZS5zdGFydDsKLQkJCXJhbmdlLmZvbnRTdHlsZSA9IGZJbnRlcm5hbFJhbmdlc1tpXS5mb250U3R5bGU7Ci0JCQlyYW5nZS5mb3JlZ3JvdW5kID0gZkludGVybmFsUmFuZ2VzW2ldLmZvcmVncm91bmQ7Ci0JCQlyYW5nZS5iYWNrZ3JvdW5kID0gZkludGVybmFsUmFuZ2VzW2ldLmJhY2tncm91bmQ7Ci0JCQlob2xkUmVzdWx0cy5hZGQocmFuZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBib29sZWFuIGJvbGQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIGJvbGQgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmdldFN0cmluZyhJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0JCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCk7Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRJbnRlcm5hbERvY3VtZW50KCkgewotCQlpZiAoZkludGVybmFsTW9kZWwgPT0gbnVsbCkgewotCQkJZkludGVybmFsTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkhpZ2hsaWdodGVyID0gaGlnaGxpZ2h0ZXI7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIjcHJlcGFyZVJlZ2lvbnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb24sCi0JICogICAgICBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWlmICghSURURFBhcnRpdGlvbnMuRFREX0RFRkFVTFQuZXF1YWxzKHR5cGVkUmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCS8vIGNvbXB1dGUgYW4gaW50ZXJuYWwgRFREIG1vZGVsIGFuZCByZXR1cm4gbGluZXN0eWxlcyBmb3IgaXQKLQkJCUlUZXh0UmVnaW9uIGR0ZENvbnRlbnRSZWdpb24gPSBudWxsOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N0eXBlID0gZkRvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHR5cGVkUmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChkb2N0eXBlICE9IG51bGwpCi0JCQkJZHRkQ29udGVudFJlZ2lvbiA9IGRvY3R5cGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJU3RyaW5nIGNvbnRlbnRzID0gZHRkQ29udGVudFJlZ2lvbiAhPSBudWxsID8gZG9jdHlwZS5nZXRGdWxsVGV4dChkdGRDb250ZW50UmVnaW9uKSA6IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gZ2V0SW50ZXJuYWxEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQl1cGRhdGVTdHlsZVJhbmdlcyhkb2N1bWVudCwgY29udGVudHMpOwotCi0JCQlhZGRTdHlsZVJhbmdlcyhsaW5lUmVxdWVzdFN0YXJ0LCBsaW5lUmVxdWVzdExlbmd0aCwgaG9sZFJlc3VsdHMsIGRvY3R5cGUuZ2V0U3RhcnRPZmZzZXQoZHRkQ29udGVudFJlZ2lvbikpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmSW50ZXJuYWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlmSW50ZXJuYWxQcm92aWRlci5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3R5bGVSYW5nZXMoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGNvbnRlbnRzKSB7Ci0JCWlmICghZG9jdW1lbnQuZ2V0KCkuZXF1YWxzKGNvbnRlbnRzKSkgewotCQkJZG9jdW1lbnQuc2V0KGNvbnRlbnRzKTsKLQkJCXRyeSB7Ci0JCQkJSVR5cGVkUmVnaW9uIHJlZ2lvbnNbXSA9IFRleHRVdGlsaXRpZXMuY29tcHV0ZVBhcnRpdGlvbmluZyhnZXRJbnRlcm5hbERvY3VtZW50KCksIGZQYXJ0aXRpb25pbmcsIDAsIGRvY3VtZW50LmdldExlbmd0aCgpLCBmYWxzZSk7Ci0JCQkJTGlzdCByYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZkludGVybmFsUHJvdmlkZXIuaW5pdChnZXRJbnRlcm5hbERvY3VtZW50KCksIGZIaWdobGlnaHRlcik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZJbnRlcm5hbFByb3ZpZGVyLnByZXBhcmVSZWdpb25zKHJlZ2lvbnNbaV0sIHJlZ2lvbnNbaV0uZ2V0T2Zmc2V0KCksIHJlZ2lvbnNbaV0uZ2V0TGVuZ3RoKCksIHJhbmdlcyk7Ci0JCQkJfQotCQkJCWZJbnRlcm5hbFJhbmdlcyA9IChTdHlsZVJhbmdlW10pIHJhbmdlcy50b0FycmF5KG5ldyBTdHlsZVJhbmdlWzBdKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZkludGVybmFsUmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMF07Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZURURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDNjM2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZURURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgRFREIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBEVEQgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZURURCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCi0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNGVlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9ICJkdGRfbmV3IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RleHQvRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RleHQvRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmViZDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLQotCi1wdWJsaWMgY2xhc3MgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVH0sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDkzNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIEFkZEF0dHJpYnV0ZUFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlTdHJpbmcgbmV3TmFtZSA9ICJOZXdBdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkoKEF0dHJpYnV0ZUxpc3QpIHNlbGVjdGVkTm9kZSkuYWRkQXR0cmlidXRlKG5ld05hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCSgoRWxlbWVudCkgc2VsZWN0ZWROb2RlKS5hZGRBdHRyaWJ1dGUobmV3TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmMgPSBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJRFRETm9kZSBub2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZSIpOwotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYXR0cmlidXRlIHNldCB0byBmYWxzZSIpOwotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NDI1MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlTGlzdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlTGlzdEFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQkJRFRERmlsZSBkdGRGaWxlID0gZ2V0TW9kZWwoKS5nZXREVERGaWxlKCk7Ci0JCVN0cmluZyBhdHRMaXN0TmFtZSA9ICJOZXdBdHRMaXN0IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLQkJCURURE5vZGUgdG9wTGV2ZWxOb2RlID0gZHRkRmlsZS5nZXRUb3BMZXZlbE5vZGVBdChzZWxlY3RlZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAodG9wTGV2ZWxOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCWF0dExpc3ROYW1lID0gKChFbGVtZW50KSB0b3BMZXZlbE5vZGUpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCi0JCWdldE1vZGVsKCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUF0dHJpYnV0ZUxpc3Qoc2VsZWN0ZWROb2RlLCBhdHRMaXN0TmFtZSwgdHJ1ZSk7Ci0JCS8vIG5ld0VsZW1lbnQuc2V0TmFtZShEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZUVsZW1lbnROYW1lKGR0ZEZpbGUpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZENvbW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZENvbW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjNjk3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZENvbW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRDb21tZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWdldE1vZGVsKCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUNvbW1lbnQoc2VsZWN0ZWROb2RlLCAiTmV3Q29tbWVudCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhhMzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERVbmlxdWVOYW1lSGVscGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50QWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkRWxlbWVudEFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlEVERGaWxlIGR0ZEZpbGUgPSBnZXRNb2RlbCgpLmdldERUREZpbGUoKTsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVFbGVtZW50TmFtZShkdGRGaWxlKTsKLQkJZHRkRmlsZS5jcmVhdGVFbGVtZW50KHNlbGVjdGVkTm9kZSwgZWxlbWVudE5hbWUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzMDI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIEFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRFRETm9kZSBub2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkoKENNR3JvdXBOb2RlKSBub2RlKS5hZGRDaGlsZCgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkoKEVsZW1lbnQpIG5vZGUpLmFkZENoaWxkKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmMgPSBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJRFRETm9kZSBub2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVudGl0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE0YmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVudGl0eUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbnRpdHlBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbnRpdHlBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVFbnRpdHkoc2VsZWN0ZWROb2RlLCAiTmV3RW50aXR5IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbmV3RWxlbWVudC5zZXROYW1lKERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlRWxlbWVudE5hbWUoZHRkRmlsZSkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU2ZThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRFRETm9kZSBub2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkoKENNR3JvdXBOb2RlKSBub2RlKS5hZGRHcm91cCgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkoKEVsZW1lbnQpIG5vZGUpLmFkZEdyb3VwKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGROb3RhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkTm90YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxZjA3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGROb3RhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkTm90YXRpb25BY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGROb3RhdGlvbkFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCi0JCWdldE1vZGVsKCkuZ2V0RFRERmlsZSgpLmNyZWF0ZU5vdGF0aW9uKHNlbGVjdGVkTm9kZSwgIk5ld05vdGF0aW9uIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBuZXdOb3RhdGlvbi5zZXROYW1lKERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlTm90YXRpb25OYW1lKGR0ZEZpbGUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzM4ODk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIEFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGFiZWxWYWx1ZVBhaXJbXSBmcmVlRXh0ZXJuYWxFbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCi0JCWlmIChmcmVlRXh0ZXJuYWxFbnRpdGllcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZnJlZUV4dGVybmFsRW50aXRpZXNbMF0uZlZhbHVlOwotCQkJLy8gcmV0dXJuIChFbnRpdHkpIGZyZWVFeHRlcm5hbEVudGl0aWVzWzBdLmZWYWx1ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZXh0RW50aXR5ID0gZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShkdGRGaWxlKTsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlpZiAoZXh0RW50aXR5ICE9IG51bGwpIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgZXh0RW50aXR5LCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgIiVOZXdFbnRpdHlSZWZlcmVuY2U7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4NzM3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBCYXNlQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250ZXh0Q29udHJpYnV0b3I7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZNb2RlbDsKLQotCXB1YmxpYyBCYXNlQWN0aW9uKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMobW9kZWwsIHRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBCYXNlQWN0aW9uKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjKSB7Ci0JCXN1cGVyKHRleHQpOwotCQlmTW9kZWwgPSBtb2RlbDsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzYyk7Ci0JfQotCi0JcHJvdGVjdGVkIERURE5vZGUgZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiBnZXRGaXJzdE5vZGVTZWxlY3RlZChnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBEVEROb2RlIGdldEZpcnN0Tm9kZVNlbGVjdGVkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCS8vIERURE5vZGUgcmVmZXJlbmNlUG9pbnQgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlyZXR1cm4gKERURE5vZGUpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIERURE1vZGVsSW1wbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChEVERNb2RlbEltcGwpIGZNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Q29udHJpYnV0b3IoSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKSB7Ci0JCWNvbnRleHRDb250cmlidXRvciA9IGNvbnRyaWJ1dG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwOTRiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRUREJhdGNoTm9kZURlbGV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotCXB1YmxpYyBEZWxldGVBY3Rpb24oU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQotCQlJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCURUREJhdGNoTm9kZURlbGV0ZSBiYXRjaERlbGV0ZSA9IG51bGw7Ci0JCURUREZpbGUgZHRkRmlsZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBlbGVtZW50OwotCQkJCWR0ZEZpbGUgPSBub2RlLmdldERUREZpbGUoKTsKLQkJCQlpZiAoYmF0Y2hEZWxldGUgPT0gbnVsbCkgewotCQkJCQliYXRjaERlbGV0ZSA9IG5ldyBEVERCYXRjaE5vZGVEZWxldGUoZHRkRmlsZSk7Ci0JCQkJfQotCQkJCWJhdGNoRGVsZXRlLmFkZE5vZGUoKERURE5vZGUpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERVSU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWJhdGNoRGVsZXRlLmRlbGV0ZU5vZGVzKHRoaXMpOwotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIERURE5vZGUgJiYgIShzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIENNTm9kZSAmJiAoKENNTm9kZSkgc2VsZWN0ZWRPYmplY3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCkpKSB7Ci0JCQlzZXRFbmFibGVkKHRydWUpOwotCQkJcmV0dXJuIHRydWU7IC8vIGVuYWJsZSBkZWxldGUgbWVudSBpdGVtCi0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybiBmYWxzZTsgLy8gZGlzYWJsZSBpdCAtIGdyZXkgb3V0Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL1JlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTIzOTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL1JlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotcHVibGljIGNsYXNzIFJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIFJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRFRETm9kZSBub2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlDTU5vZGUgY29udGVudE1vZGVsID0gKChFbGVtZW50KSBub2RlKS5nZXRDb250ZW50TW9kZWwoKTsKLQkJCWlmIChDTU5vZGUuRU1QVFkuZXF1YWxzKGNvbnRlbnRNb2RlbC5nZXRUeXBlKCkpKSB7Ci0JCQkJZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRUZXh0KCkpOwotCQkJCSgoRWxlbWVudCkgbm9kZSkucmVwbGFjZUNvbnRlbnRNb2RlbCh0aGlzLCAiKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJjID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCXNldEVuYWJsZWQobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpOwotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5MDA4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLiBSZXF1aXJlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlCi0gKiBhZGFwdGVycyBmb3IgdGhlIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJUHJvcGVydHlTb3VyY2UgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0FUVFJJQlVURVMgPSAiQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9OQU1FID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9URVhUID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCXByb3RlY3RlZCBJTm9kZU5vdGlmaWVyIGZOb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdGFjayBmVmFsdWVzQmVpbmdTZXQgPSBuZXcgU3RhY2soKTsKLQotCXB1YmxpYyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCUN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9IG5ldyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfTkFNRSwgSURfTkFNRSwgbnVsbCk7Ci0JCW5hbWVEZXNjcmlwdG9yLnNldENhdGVnb3J5KERURFVJTWVzc2FnZXMuRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzIpOyAvLyROT04tTkxTLTEkCi0JCS8vIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBjb250ZW50RGVzY3JpcHRvciA9IG5ldwotCQkvLyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfVEVYVCwgSURfVEVYVCwgbnVsbCk7Ci0JCS8vIGNvbnRlbnREZXNjcmlwdG9yLnNldENhdGVnb3J5KCJBdHRyaWJ1dGVzIik7Ci0JCXJldHVybiBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltde25hbWVEZXNjcmlwdG9yfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsdWUgZm9yIHRoaXMgTm9kZSB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkgc2hlZXQuCi0JICogCi0JICogQHJldHVybiBhIHZhbHVlIHRoYXQgY2FuIGJlIGVkaXR0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB2YWxpZCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBmRGVzY3JpcHRvcnMubGVuZ3RoID09IDApIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKGlkLmVxdWFscyhJRF9OQU1FKSAmJiBmTm9kZSBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXZhbHVlID0gKChEVEROb2RlKSBmTm9kZSkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChpZC5lcXVhbHMoSURfVEVYVCkgJiYgZk5vZGUgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQl2YWx1ZSA9ICgoRFRETm9kZSkgZk5vZGUpLmdldEZ1bGxOb2RlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2MDZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoSVByb3BlcnR5U291cmNlLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBhdCB0aGUgbW9tZW50LCBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMKLQkJcmV0dXJuIG5ldyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIodGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg1ZDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZSIsIERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIERURCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5EVERfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQl2aWV3ZXIuY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IERvY3VtZW50VGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgMCwgMCk7Ci0JCQl0cnkgewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBkdGQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgRFREIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERURFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBEVEQgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKERURFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCURURFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIHBpY2sgdGhlIGxhc3QgdXNlZCB0ZW1wbGF0ZQotCQkJdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0JCX0KLQotCQkvLyBubyByZWNvcmQgb2YgbGFzdCB1c2VkIHRlbXBsYXRlIHNvIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCWlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7Ci0JCQkvLyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQkJdGVtcGxhdGUgPSBmVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApOwotCQl9Ci0KLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlbXBsYXRlKTsKLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHBhdHRlcm4gdmlld2VyLgotCSAqLwotCXZvaWQgdXBkYXRlVmlld2VySW5wdXQoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDk3ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkRURENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdEVERXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZTsKLQlwcml2YXRlIExpc3QgZlZhbGlkRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBBZGRzIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCUlDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgRFREIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyBpZiBmaWxlTmFtZSBpcyB2YWxpZCBuYW1lIGZvciBjb250ZW50IHR5cGUuIFRha2VzIGJhc2UgY29udGVudAotCSAqIHR5cGUgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gaXMgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKCJEVERXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQkJCWlmICgoZnVsbFBhdGggIT0gbnVsbCkgJiYgKGZ1bGxQYXRoLmlzRW1wdHkoKSA9PSBmYWxzZSkgJiYgKGZpbGVOYW1lICE9IG51bGwpKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoRFREVUlNZXNzYWdlcy5fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfRFRELCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCQkJSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpIHsKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoRFREVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotCQkJfQotCQl9OwotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoRFREVUlNZXNzYWdlcy5fVUlfQ1JFQVRFX05FV19EVERfRklMRSk7Ci0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbihEVERVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RURF9FWFBMKTsKLQotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShEVERVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RURF9USVRMRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0RUREZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJZk5ld0ZpbGVQYWdlLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBmaWxlCi0JCUlGaWxlIGZpbGUgPSBmTmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vIGlmIHRoZXJlIHdhcyBwcm9ibGVtIHdpdGggY3JlYXRpbmcgZmlsZSwgaXQgd2lsbCBiZSBudWxsLCBzbyBtYWtlCi0JCS8vIHN1cmUgdG8gY2hlY2sKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLmdldFRlbXBsYXRlU3RyaW5nKCk7Ci0JCQlpZiAodGVtcGxhdGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCS8vIGRldGVybWluZSB0aGUgZW5jb2RpbmcgZm9yIHRoZSBuZXcgZmlsZQotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQkJCXRyeSB7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBudWxsOwotCQkJCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8ganVzdCB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpOwotCQkJCQl9Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZSh0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50cyBmb3IgbmV3IERURCBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODcxNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5PYmplY3RUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQuRFRERHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3Igb3V0bGluZSB2aWV3IHBhZ2Ugd2hpY2ggc2hvd3MgRFREIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBEVERDb250ZXh0TWVudUhlbHBlciBmTWVudUhlbHBlcjsKLQlwcml2YXRlIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQlwcml2YXRlIE1hcCBmVmlld2VyQ29udHJpYnV0aW9uczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX09SREVSX1BSRUYgPSAib3V0bGluZS1vcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX1NPUlRfUFJFRiA9ICJvdXRsaW5lLXNvcnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBEVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQkJZlZpZXdlckNvbnRyaWJ1dGlvbnMgPSBuZXcgSGFzaE1hcCgyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2NyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlBc3NlcnQuaXNUcnVlKGdldENvbnRlbnRQcm92aWRlcih2aWV3ZXIpIGluc3RhbmNlb2YgRFREVHJlZUNvbnRlbnRQcm92aWRlciwgImludmFsaWQgY29udGVudCBwcm92aWRlciBvbiB2aWV3ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gc3VwZXIuY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnModmlld2VyKTsKLQotCQlTb3J0QWN0aW9uIHNvcnRBY3Rpb24gPSBuZXcgU29ydEFjdGlvbih2aWV3ZXIsIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1VUTElORV9TT1JUX1BSRUYpOwotCQlPcmRlckFjdGlvbiBvcmRlckFjdGlvbiA9IG5ldyBPcmRlckFjdGlvbih2aWV3ZXIsIChEVERUcmVlQ29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIodmlld2VyKSwgRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX09SREVSX1BSRUYpOwotCQlJQ29udHJpYnV0aW9uSXRlbSBzb3J0SXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oc29ydEFjdGlvbik7Ci0JCUlDb250cmlidXRpb25JdGVtIG9yZGVySXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ob3JkZXJBY3Rpb24pOwotCi0JCWlmIChpdGVtcyA9PSBudWxsKSB7Ci0JCQlpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVsyXTsKLQkJCWl0ZW1zWzBdID0gc29ydEl0ZW07Ci0JCQlpdGVtc1sxXSA9IG9yZGVySXRlbTsKLQkJfQotCQllbHNlIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gY29tYmluZWRJdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtpdGVtcy5sZW5ndGggKyAyXTsKLQkJCWNvbWJpbmVkSXRlbXNbMF0gPSBzb3J0SXRlbTsKLQkJCWNvbWJpbmVkSXRlbXNbMV0gPSBvcmRlckl0ZW07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBjb21iaW5lZEl0ZW1zLCAyLCBpdGVtcy5sZW5ndGgpOwotCQkJaXRlbXMgPSBjb21iaW5lZEl0ZW1zOwotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZDb250ZW50UHJvdmlkZXIgPSBuZXcgRFREVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5nZXRDb250ZW50UHJvdmlkZXIodmlld2VyKTsKLQkJcmV0dXJuIGZDb250ZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgRFRETGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5nZXRMYWJlbFByb3ZpZGVyKHZpZXdlcik7Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldE1lbnVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlNZW51TGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQlpZiAoZk1lbnVIZWxwZXIgPT0gbnVsbCAmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIERURE1vZGVsSW1wbCkgewotCQkJZk1lbnVIZWxwZXIgPSBuZXcgRFREQ29udGV4dE1lbnVIZWxwZXIoKERURE1vZGVsSW1wbCkgdmlld2VyLmdldElucHV0KCkpOwotCQkJZk1lbnVIZWxwZXIuY3JlYXRlTWVudUxpc3RlbmVyc0Zvcih2aWV3ZXIpOwotCQl9Ci0JCWlmIChmTWVudUhlbHBlciAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lciA9IGZNZW51SGVscGVyLmdldE1lbnVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmIChmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCS8vIGVtdWxhdGUgdGhlIFhNTERyYWdBbmREcm9wTWFuYWdlcgotCQkJZmluYWwgVmlld2VyRHJhZ0FkYXB0ZXIgZHJhZ0FkYXB0ZXIgPSBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodHJlZVZpZXdlcik7Ci0JCQlmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJhZ0FkYXB0ZXIuZHJhZ0ZpbmlzaGVkKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJhZ0FkYXB0ZXIuZHJhZ1NldERhdGEoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJhZ0FkYXB0ZXIuZHJhZ1N0YXJ0KGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0KLQkJcmV0dXJuIGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJLy8gZW11bGF0ZSB0aGUgWE1MRHJhZ0FuRHJvcE1hbmFnZXIKLQkJCWZpbmFsIFZpZXdlckRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyID0gbmV3IFZpZXdlckRyb3BBZGFwdGVyKHRyZWVWaWV3ZXIsIG5ldyBEVEREcmFnQW5kRHJvcE1hbmFnZXIoKSk7Ci0JCQlmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJhZ0VudGVyKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyb3BBZGFwdGVyLmRyYWdMZWF2ZShldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyb3BBZGFwdGVyLmRyYWdPcGVyYXRpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJhZ092ZXIoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyb3BBZGFwdGVyLmRyb3AoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyb3BBY2NlcHQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyb3BBZGFwdGVyLmRyb3BBY2NlcHQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlyZXR1cm4gZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9fTsKLQkJfQotCQlyZXR1cm4gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI3VuY29uZmlndXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZShUcmVlVmlld2VyIHZpZXdlcikgewotCQlzdXBlci51bmNvbmZpZ3VyZSh2aWV3ZXIpOwotCQlmVmlld2VyQ29udHJpYnV0aW9ucy5yZW1vdmUodmlld2VyKTsKLQkJaWYgKGZNZW51SGVscGVyICE9IG51bGwpIHsKLQkJCWZNZW51SGVscGVyLnJlbW92ZU1lbnVMaXN0ZW5lcnNGb3Iodmlld2VyKTsKLQkJCWZNZW51SGVscGVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZXh0TWVudUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmM2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZENvbW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkRW50aXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGROb3RhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLlJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbjsKLQotLyoqCi0gKiBNZW51IGhlbHBlciBmb3IgQ29udGVudCBPdXRsaW5lIHBhZ2UuIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZS4KLSAqLwotY2xhc3MgRFREQ29udGV4dE1lbnVIZWxwZXIgewotCWNsYXNzIERURE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCS8vIHVwZGF0ZSB0aGUgYWN0aW9uIHNlbGVjdGlvbiBub3cKLQkJCWFkZE5vdGF0aW9uQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRFbnRpdHlBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZENvbW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJZGVsZXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRBdHRyaWJ1dGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0KLQotCQkJaWYgKCFmVmlld2VyU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCWFkZEFjdGlvbkl0ZW1zRm9yU2VsZWN0aW9uKGZWaWV3ZXJTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCksIG1hbmFnZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVmlld2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCV9zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCUFkZEF0dHJpYnV0ZUFjdGlvbiBhZGRBdHRyaWJ1dGVBY3Rpb247Ci0KLQlBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uIGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci0JQWRkQ29tbWVudEFjdGlvbiBhZGRDb21tZW50QWN0aW9uOwotCUFkZEVsZW1lbnRBY3Rpb24gYWRkRWxlbWVudEFjdGlvbjsKLQlBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZEVudGl0eUFjdGlvbiBhZGRFbnRpdHlBY3Rpb247Ci0JQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbiBhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZE5vdGF0aW9uQWN0aW9uIGFkZE5vdGF0aW9uQWN0aW9uOwotCUFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbiBhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci0JRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbjsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IFZpZXdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIElNZW51TGlzdGVuZXIgZk1lbnVMaXN0ZW5lcjsKLQlwcml2YXRlIERURE1vZGVsSW1wbCBmTW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGZWaWV3ZXJMaXN0OwotCi0JSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uOwotCi0JcHVibGljIERURENvbnRleHRNZW51SGVscGVyKERURE1vZGVsSW1wbCBtb2RlbCkgewotCQlmTW9kZWwgPSBtb2RlbDsKLQkJZlZpZXdlckxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmTWVudUxpc3RlbmVyID0gbmV3IERURE1lbnVMaXN0ZW5lcigpOwotCi0JCWFkZE5vdGF0aW9uQWN0aW9uID0gbmV3IEFkZE5vdGF0aW9uQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RURF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRW50aXR5QWN0aW9uID0gbmV3IEFkZEVudGl0eUFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFbGVtZW50QWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbW1lbnRBY3Rpb24gPSBuZXcgQWRkQ29tbWVudEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24gPSBuZXcgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBUkFNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0RURF9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbiA9IG5ldyBBZGRBdHRyaWJ1dGVBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uID0gbmV3IEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFTElTVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uID0gbmV3IEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVApOyAvLyROT04tTkxTLTEkCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbiA9IG5ldyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gPSBuZXcgUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkZE5vdGF0aW9uQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfTk9UQVRJT04pKTsKLQkJYWRkRW50aXR5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfRU5USVRZKSk7Ci0JCWFkZENvbW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9DT01NRU5UKSk7Ci0JCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0VOVElUWV9SRUZFUkVOQ0UpKTsKLQotCQkvLyBUcmktc3RhdGUgaW1hZ2VzCi0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0VMRU1FTlQpKTsKLQkJYWRkRWxlbWVudEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9FTEVNRU5UKSk7Ci0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfRUxFTUVOVCkpOwotCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9BVFRSSUJVVEUpKTsKLQkJYWRkQXR0cmlidXRlQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwpKTsKLQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMKSk7Ci0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCkpOwotCi0JCS8vIHVzZSB0aGUgc2FtZSBpbWFnZXMgYXMgYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbgotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQl9Ci0KLQl2b2lkIF9zZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvKgotCQkgKiBTYXZlIHRoZSBzZWxlY3Rpb24gc28gd2Ugb25seSBub3RpZnkgdGhlIGFjdGlvbnMgd2hlbiB0aGUgbWVudSBpcwotCQkgKiBzaG93bgotCQkgKi8KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCX0KLQotCXZvaWQgYWRkQWN0aW9uSXRlbXNGb3JTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGVkT2JqZWN0LCBJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJLy8gYWRkIGFwcHJvcHJpYXRlIG1lbnUgdG8gbG9naWNhbCB2aWV3Ci0JCQlOb2RlTGlzdCBmb2xkZXIgPSAoTm9kZUxpc3QpIHNlbGVjdGVkT2JqZWN0OwotCQkJaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkTm90YXRpb25BY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkRW50aXR5QWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlMYWJlbFZhbHVlUGFpcltdIGF2YWlsYWJsZUVudGl0aWVzID0gZk1vZGVsLmNyZWF0ZVBhcm1FbnRpdHlDb250ZW50SXRlbXMobnVsbCk7Ci0JCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlRW50aXRpZXMubGVuZ3RoID4gMCk7Ci0KLQkJCQltZW51LmFkZChhZGRFbGVtZW50QWN0aW9uKTsKLQkJCQltZW51LmFkZChhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUFjdGlvbik7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRFRERmlsZSB8fCBzZWxlY3RlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQlMYWJlbFZhbHVlUGFpcltdIGF2YWlsYWJsZUVudGl0aWVzID0gZk1vZGVsLmNyZWF0ZVBhcm1FbnRpdHlDb250ZW50SXRlbXMobnVsbCk7Ci0JCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uc2V0RW5hYmxlZChhdmFpbGFibGVFbnRpdGllcy5sZW5ndGggPiAwKTsKLQotCQkJbWVudS5hZGQoYWRkRWxlbWVudEFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRFbnRpdHlBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkTm90YXRpb25BY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZENvbW1lbnRBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkQXR0cmlidXRlTGlzdEFjdGlvbik7Ci0JCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJRWxlbWVudCBkdGRFbGVtZW50ID0gKEVsZW1lbnQpIHNlbGVjdGVkT2JqZWN0OwotCi0JCQlDTU5vZGUgY29udGVudE1vZGVsID0gZHRkRWxlbWVudC5nZXRDb250ZW50TW9kZWwoKTsKLQkJCWlmIChjb250ZW50TW9kZWwgPT0gbnVsbCkgewotCQkJCW1lbnUuYWRkKGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50TW9kZWwgIT0gbnVsbCAmJiBDTU5vZGUuRU1QVFkuZXF1YWxzKGNvbnRlbnRNb2RlbC5nZXRUeXBlKCkpKSB7Ci0JCQkJbWVudS5hZGQocmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uKTsKLQkJCX0KLQkJCS8vIGlmICghKCgoRWxlbWVudClzZWxlY3RlZE9iamVjdCkuZ2V0Q29udGVudE1vZGVsKCkgaW5zdGFuY2VvZgotCQkJLy8gQ01Hcm91cE5vZGUpKQotCQkJLy8gewotCQkJLy8gbWVudS5hZGQoYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQkvLyB9Ci0JCQkvLyBhZGRBdHRyaWJ1dGVBY3Rpb24uc2V0RWxlbWVudChzZWxlY3RlZE9iamVjdCk7Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVBY3Rpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCS8vIGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRFbGVtZW50KHNlbGVjdGVkT2JqZWN0KTsKLQkJCS8vIGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0RWxlbWVudChzZWxlY3RlZE9iamVjdCk7Ci0JCQltZW51LmFkZChhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVBY3Rpb24pOwotCQl9Ci0KLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJYWRkRWRpdEFjdGlvbnMobWVudSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRFRETm9kZSAmJiAhKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQ01Ob2RlICYmICgoQ01Ob2RlKSBzZWxlY3RlZE9iamVjdCkuaXNSb290RWxlbWVudENvbnRlbnQoKSkpIHsKLQkJCW1lbnUuYWRkKGRlbGV0ZUFjdGlvbik7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCS8vIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnRDb250ZW50KQotCQkJLy8gewotCQkJLy8gRFRERWxlbWVudENvbnRlbnQgY29udGVudCA9IChEVERFbGVtZW50Q29udGVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQkvLyBpZiAoY29udGVudC5nZXRFbGVtZW50KCkgIT0gbnVsbCAmJiAoY29udGVudCBpbnN0YW5jZW9mCi0JCQkvLyBEVERQQ0RhdGFDb250ZW50IHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpKQotCQkJLy8gewotCQkJLy8gZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkJCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JCX0KLQl9Ci0KLQl2b2lkIGFkZEVkaXRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIG1lbnUuYWRkKHVuZG9BY3Rpb24pOwotCQkvLyBtZW51LmFkZChyZWRvQWN0aW9uKTsKLQkJLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJLy8gbWVudS5hZGQoY3V0QWN0aW9uKTsKLQkJLy8gbWVudS5hZGQoY29weUFjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKHBhc3RlQWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVNZW51TGlzdGVuZXJzRm9yKFZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCi0JCWZWaWV3ZXJMaXN0LmFkZCh2aWV3ZXIpOwotCX0KLQotCXB1YmxpYyBJTWVudUxpc3RlbmVyIGdldE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGZNZW51TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVudUxpc3RlbmVyc0ZvcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJZlZpZXdlckxpc3QucmVtb3ZlKHZpZXdlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGQ4N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotCi1jbGFzcyBEVERMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgRFRETGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlc2UgaXMgbm8gaW1hZ2UgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWltYWdlID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJaW1hZ2UgPSAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlpbWFnZSA9ICgoRFRERmlsZSkgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlID0gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIHRleHQKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHN0cmluZyB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlc2UgaXMgbm8gdGV4dCBsYWJlbCBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCVN0cmluZyBuYW1lID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJCS8vIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSAodXNlZnVsIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzKQotCQkJaW50IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOwotCQkJaW50IGxhc3RWaXNpYmxlQ2hhcmFjdGVyID0gbmFtZS5sZW5ndGgoKSAtIDE7Ci0JCQlmb3IgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOyBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyIDwgbmFtZS5sZW5ndGgoKTsgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlcisrKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIpKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBrZWVwIG9ubHkgdGhlIGZpcnN0IGxpbmUgb2YgdGV4dCBpbiBhIG11bHRpLWxpbmUgbmFtZQotCQkJaWYgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPCBsYXN0VmlzaWJsZUNoYXJhY3RlcikgewotCQkJCWZvciAobGFzdFZpc2libGVDaGFyYWN0ZXIgPSBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyICsgMTsgbGFzdFZpc2libGVDaGFyYWN0ZXIgPCBuYW1lLmxlbmd0aCgpOyBsYXN0VmlzaWJsZUNoYXJhY3RlcisrKSB7Ci0JCQkJCWNoYXIgY2hhcmFjdGVyID0gbmFtZS5jaGFyQXQobGFzdFZpc2libGVDaGFyYWN0ZXIpOwotCQkJCQlpZiAoY2hhcmFjdGVyID09ICdccicgfHwgY2hhcmFjdGVyID09ICdcbicpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA+IDAgJiYgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA8IG5hbWUubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIsIGxhc3RWaXNpYmxlQ2hhcmFjdGVyKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQkvLyByZXR1cm4gKChOb2RlTGlzdCkgZWxlbWVudCkuZ2V0TGlzdFR5cGUoKTsKLQkJCXJldHVybiAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiAoKERUREZpbGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiZjU0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci0KLWNsYXNzIERURFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSURUREZpbGVMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE9iamVjdCBmSW5wdXRPYmplY3Q7Ci0JcHJvdGVjdGVkIFZpZXdlciBmVmlld2VyOwotCi0JLy8gQSBjYWNoZWQgc2V0IG9mIEluZGV4ZWROb2RlTGlzdHMsIHJlcXVpcmVkIGZvciBnZXRQYXJlbnQgdG8gcmV0dXJuIHRoZQotCS8vIGNvcnJlY3QgaW5zdGFuY2VzIG1hcHBpbmcgdG8gVHJlZUl0ZW1zCi0JcHJvdGVjdGVkIE9iamVjdFtdIGxvZ2ljYWxOb2RlTGlzdHMgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dMb2dpY2FsT3JkZXIgPSBmYWxzZTsKLQotCXB1YmxpYyBEVERUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZWaWV3ZXIgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRUb05vZGUoRFRETm9kZSBub2RlKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IG5vZGUuZ2V0RFRERmlsZSgpOwotCQkvLyBmaXJzdCBleHBhbmQgdGhlIHJvb3QKLQkJQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKGR0ZEZpbGUsIDEpOwotCQlOb2RlTGlzdCBsaXN0VG9FeHBhbmQgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCWxpc3RUb0V4cGFuZCA9IGR0ZEZpbGUuZ2V0Tm90YXRpb25zKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbnRpdGllcygpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldENvbW1lbnRzKCk7Ci0JCX0KLQkJaWYgKGxpc3RUb0V4cGFuZCAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbChsaXN0VG9FeHBhbmQsIDEpOwotCQl9Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKG5vZGUsIDApOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkvLyByZXR1cm4gdGhlIGxpc3RzIG9mIG5vZGVzIHdoZW4gaW4gbG9naWNhbCBvcmRlciBtb2RlLCBhbGwgdGhlIE5vZGVzCi0JCS8vIG90aGVyd2lzZQotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCWlmIChpc1Nob3dMb2dpY2FsT3JkZXIoKSkgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlIGxpc3RzCi0JCQkJaWYgKGxvZ2ljYWxOb2RlTGlzdHMgPT0gbnVsbCkgewotCQkJCQlJdGVyYXRvciBub2RlTGlzdHMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCQkJCUxpc3QgdmlzaWJsZUxpc3RzID0gbmV3IEFycmF5TGlzdCg3KTsKLQkJCQkJd2hpbGUgKG5vZGVMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCQkJCU5vZGVMaXN0IGxpc3QgPSAoTm9kZUxpc3QpIG5vZGVMaXN0cy5uZXh0KCk7Ci0JCQkJCQlpZiAoaXNWaXNpYmxlTm9kZUxpc3QobGlzdCkpIHsKLQkJCQkJCQl2aXNpYmxlTGlzdHMuYWRkKGxpc3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWxvZ2ljYWxOb2RlTGlzdHMgPSB2aXNpYmxlTGlzdHMudG9BcnJheSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gbG9naWNhbE5vZGVMaXN0czsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlcwotCQkJCUxpc3QgYWxsTm9kZXMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVzKCk7Ci0JCQkJTGlzdCB2aXNpYmxlTm9kZXMgPSBuZXcgQXJyYXlMaXN0KGFsbE5vZGVzLnNpemUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3QgbyA9IGFsbE5vZGVzLmdldChpKTsKLQkJCQkJaWYgKGlzVmlzaWJsZU5vZGUobykpIHsKLQkJCQkJCXZpc2libGVOb2Rlcy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHZpc2libGVOb2Rlcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQlyZXR1cm4gKChOb2RlTGlzdCkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZXMoKS50b0FycmF5KCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIGFsd2F5cyBncm91cCB0aGUgYXR0cmlidXRlcyBkaXJlY3RseSB1bmRlciB0aGUgZWxlbWVudAotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSAoKEVsZW1lbnQpIHBhcmVudEVsZW1lbnQpLmdldEVsZW1lbnRBdHRyaWJ1dGVzKCk7Ci0JCQlPYmplY3RbXSBsb2dpY2FsQ2hpbGRyZW4gPSBuZXcgT2JqZWN0W2NoaWxkcmVuLmxlbmd0aCArIGF0dHJpYnV0ZXMuc2l6ZSgpXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXhdID0gY2hpbGRyZW5baW5kZXhdOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXgrK10gPSBpdGVyLm5leHQoKTsKLQkJCX0KLQkJCXJldHVybiBsb2dpY2FsQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXJldHVybiAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IG51bGw7Ci0JCS8vIEFsd2F5cyBzaG93IHRoZSBEVERGaWxlICJub2RlIgotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbXXsoKERURE1vZGVsSW1wbCkgaW5wdXRFbGVtZW50KS5nZXREVERGaWxlKCl9OwotCQl9Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBlbGVtZW50OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQkvLyB0aGVuIHdlIG11c3Qgc2F5IHRoYXQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCQkJLy8gYXMgb3VyIGF0dHJpYnV0ZSdzIHBhcmVudCBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCQlyZXR1cm4gZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJLy8gdGhlbiB3ZSBtdXN0IHNheSB0aGF0IHRoZSBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZQotCQkJCS8vIGFzIG91ciBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAoKEF0dHJpYnV0ZUxpc3QpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBwYXJlbnQgPT0gbnVsbCkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGN1cnJlbnROb2RlLmdldE5hbWUoKS5lcXVhbHMoYXR0TGlzdE5hbWUpKSB7Ci0JCQkJCQlwYXJlbnQgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHNob3dpbmcgaW4gdGhlIGxvZ2ljYWwgb3JkZXIsIHJldHVybiB0aGUgSW5kZXhlZE5vZGVMaXN0Ci0JCQkvLyBhY3RpbmcgYXMgdGhlIHBhcmVudCBpbiB0aGUgdHJlZQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJCU9iamVjdFtdIGluZGV4ZWROb2RlTGlzdHMgPSBnZXRDaGlsZHJlbigoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZWROb2RlTGlzdHMubGVuZ3RoICYmIHBhcmVudCA9PSBudWxsOyBpKyspIHsKLQkJCQkJCWlmIChpbmRleGVkTm9kZUxpc3RzW2ldIGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCQkJCQlpZiAoKChOb2RlTGlzdCkgaW5kZXhlZE5vZGVMaXN0c1tpXSkuZ2V0Tm9kZXMoKS5jb250YWlucyhlbGVtZW50KSkKLQkJCQkJCQkJcGFyZW50ID0gaW5kZXhlZE5vZGVMaXN0c1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gKChEVERNb2RlbEltcGwpIGZJbnB1dE9iamVjdCkuZ2V0RFRERmlsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgJiYgZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQlwYXJlbnQgPSAoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkucmVtb3ZlRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWZJbnB1dE9iamVjdCA9IG5ld0lucHV0OwotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkuYWRkRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc2hvd0xvZ2ljYWxPcmRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dMb2dpY2FsT3JkZXIoKSB7Ci0JCXJldHVybiBzaG93TG9naWNhbE9yZGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlTGlzdChOb2RlTGlzdCBub2RlTGlzdCkgewotCQkvKgotCQkgKiBBbGwgTm9kZXNMaXN0cyBzaG91bGQgYmUgdmlzaWJsZSBiZWNhdXNlIHlvdSBjYW4gbW9tZW50YXJpbHkgaGF2ZQotCQkgKiBhbiBBVFRMSVNUIChmb3IgZXhhbXBsZSkgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgRUxFTUVOVAotCQkgKiBkZWNsYXJhdGlvbgotCQkgKi8KLQkJcmV0dXJuIHRydWU7Ly8gIW5vZGVMaXN0LmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vZGUgY2hhbmdlZCBub3RpZmllZCIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYmVmb3JlID0gIiArCi0JCQkvLyAoKFN0cnVjdHVyZWRWaWV3ZXIpdmlldykuZ2V0U2VsZWN0aW9uKCkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0ICYmIGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJLy8gaW4gdGhpcyBjYXNlLCB3ZSBhcmUgc2hvd2luZyBhdHRyaWJ1dGVzIHVuZGVyIHRoZSBlbGVtZW50LgotCQkJCS8vIHJlZnJlc2ggdGhlIGVsZW1lbnQgb2JqZWN0IGluc3RlYWQKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TmFtZSgpLmVxdWFscyhub2RlLmdldE5hbWUoKSkgJiYgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2goY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGRvIHN0YW5kYXJkIHN0dWZmCi0JCQkJKChTdHJ1Y3R1cmVkVmlld2VyKSBmVmlld2VyKS5yZWZyZXNoKG5vZGUpOwotCQkJfQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYWZ0ZXIgPSAiICsKLQkJCS8vICgoU3RydWN0dXJlZFZpZXdlcil2aWV3KS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQkJT2JqZWN0IGZpcnN0T2JqID0gKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQkJRFRETm9kZSBvbGRTZWxlY3RlZE5vZGUgPSBudWxsOwotCQkJaWYgKGZpcnN0T2JqIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCW9sZFNlbGVjdGVkTm9kZSA9IChEVEROb2RlKSBmaXJzdE9iajsKLQkJCX0KLQotCQkJQWJzdHJhY3RUcmVlVmlld2VyIGFic3RyYWN0VHJlZVZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG5vZGUgPSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChub2RlKTsKLQkJCQkvLyBCdWcgMTExMTAwIC0gSWYgaXQgaXMgYSB0b3AgbGV2ZWwgbm9kZSAoaWUuIHBhcmVudCBpcyBhCi0JCQkJLy8gRFRERmlsZSksCi0JCQkJLy8gaW5zZXJ0IHRoZSBub2RlIGRpcmVjdGx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQlPYmplY3RbXSBvYmpzID0gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAob2Jqc1tpXSA9PSBub2RlKSB7Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLmluc2VydChwYXJlbnQsIG5vZGUsIGkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIElmIHRoZSBwYXJlbnQgbm9kZSBpcyBub3QgYSBEVERGaWxlLCBqdXN0IHJlZnJlc2ggdGhlCi0JCQkJLy8gcGFyZW50IGZvciBub3cKLQkJCQllbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVmcmVzaChwYXJlbnQpOwotCQkJCX0KLQkJCQkvLyBZb3Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2ssIGlmIHlvdSBkbywganVzdCByZWZyZXNoCi0JCQkJLy8gdGhlIHdob2xlIHRyZWUKLQkJCQllbHNlIHsKLQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQlMaXN0IG5ld1NlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2xkU2VsZWN0ZWROb2RlID09IG51bGwgfHwgbm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSAhPSBvbGRTZWxlY3RlZE5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpICE9IG9sZFNlbGVjdGVkTm9kZS5nZXRTdGFydE9mZnNldCgpIHx8IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgIT0gb2xkU2VsZWN0ZWROb2RlLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCS8vIGFkZCB0byBzZWxlY3Rpb24KLQkJCQkJbmV3U2VsZWN0aW9uLmFkZChub2RlKTsKLQkJCQkJZXhwYW5kVG9Ob2RlKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdTZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCWlmIChmVmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKSB7Ci0JCQlBYnN0cmFjdFRyZWVWaWV3ZXIgYWJzdHJhY3RUcmVlVmlld2VyID0gKEFic3RyYWN0VHJlZVZpZXdlcikgZlZpZXdlcjsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc2hvd0xvZ2ljYWxPcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzaG93TG9naWNhbE9yZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dMb2dpY2FsT3JkZXIoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnNob3dMb2dpY2FsT3JkZXIgPSB2YWx1ZTsKLQkJaWYgKCF2YWx1ZSkgewotCQkJLy8gaWYgbm90IHVzaW5nIGxvZ2ljYWwgb3JkZXIsIGxvc2UgdGhlIGNhY2hlZCBsaXN0cwotCQkJbG9naWNhbE5vZGVMaXN0cyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvT3JkZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODEyMGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotCi1jbGFzcyBPcmRlckFjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQlwcml2YXRlIERURFRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHVibGljIE9yZGVyQWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBEVERUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyLCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlzdXBlcihEVERVSU1lc3NhZ2VzLl9VSV9CVVRUT05fR1JPVVBfSVRFTVNfTE9HSUNBTExZLCBzdG9yZSwgcHJlZmVyZW5jZUtleSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9PUkdBTklaRV9EVERfTE9HSUNBTExZKSk7Ci0JCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWNvbnRlbnRQcm92aWRlciA9IHByb3ZpZGVyOwotCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQljb250ZW50UHJvdmlkZXIuc2V0U2hvd0xvZ2ljYWxPcmRlcihpc0NoZWNrZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0Q2hlY2tlZChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGdldFByZWZlcmVuY2VLZXkoKSkpOwotCQkvLyB0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8gdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRTaG93TG9naWNhbE9yZGVyKGlzQ2hlY2tlZCgpKTsKLQotCQkvLyB0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCi0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJLy8gdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJLy8gdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjAzODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXB1YmxpYyBTb3J0QWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlzdXBlcihEVERVSU1lc3NhZ2VzLl9VSV9CVVRUT05fU09SVF9JVEVNUywgc3RvcmUsIHByZWZlcmVuY2VLZXksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU09SVCkpOwotCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQl0cmVlVmlld2VyID0gdmlld2VyOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJLy8gdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCU9iamVjdFtdIGV4cGFuZGVkRWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJaWYgKGlzQ2hlY2tlZCgpKSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobnVsbCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cyk7Ci0JCS8vIHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDRhNTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIGtpbmQ9ImNvbiI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL3VpLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvdWkvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjYTZjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1odG1sbW9kZWwuamFyCi10ZW1wLmZvbGRlcgotZGV2LnByb3BlcnRpZXMKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjZhNTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2JhYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgQXVnIDE5IDE2OjMxOjQzIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWNkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OTQ1ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuc3NpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZTsgZXhjZXB0aW9ucz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjYyMmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgZGF0YS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY1YWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnN0YW5kYXJkLmR0ZHMiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9odG1sL292ZXJ2aWV3Lmh0bWwiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDQ2MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQVRhZ0luZm89QSBsaW5rIGlmIHRoZSBocmVmIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCBhbmQgdGhlIHRhcmdldCBmb3IgYSBsaW5rIGlmIHRoZSBuYW1lIGF0dHJpYnV0ZSBpcyBwcmVzZW50Ci1BQkJSVGFnSW5mbz1BbiBhYmJyZXZpYXRpb24gKGZvciBleGFtcGxlLCBXV1csIEhUVFApCi1BQ1JPTllNVGFnSW5mbz1BbiBhY3JvbnltIChmb3IgZXhhbXBsZSwgU0NVQkEpCi1BRERSRVNTVGFnSW5mbz1BZGRyZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgYXV0aG9yIG9mIHRoZSBwYWdlCi1BUFBMRVRUYWdJbmZvPUEgSmF2YSBhcHBsZXQKLUFSRUFUYWdJbmZvPURlZmluZXMgYSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgYXJlYQotQlRhZ0luZm89RGlzcGxheXMgY29udGFpbmVkIHRleHQgYXMgYm9sZAotQkFTRVRhZ0luZm89VGhlIGJhc2UgVVJJIGZvciB0aGUgcGFnZSwgdG8gYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHJlbGF0aXZlIHBhdGhzCi1CQVNFRk9OVFRhZ0luZm89VGhlIGJhc2UgZm9udCBzaXplIGZvciB0aGUgcGFnZQotQkRPVGFnSW5mbz1PdmVycmlkZXMgZGVmYXVsdCBiaWRpcmVjdGlvbmFsIGRpc3BsYXkuIEZvciB1c2Ugd2l0aCBiaWRpcmVjdGlvbmFsIGxhbmd1YWdlcy4KLUJJR1RhZ0luZm89RGlzcGxheXMgY29udGFpbmVkIHRleHQgYXMgbGFyZ2UKLUJHU09VTkRUYWdJbmZvPURlZmluZXMgYSBzb3VuZCBmaWxlIGZvciB0aGUgcGFnZS4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotQkxJTktUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgYmxpbmtpbmcuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLUJMT0NLUVVPVEVUYWdJbmZvPUEgbG9uZyBxdW90YXRpb24KLUJPRFlUYWdJbmZvPVRoZSBkb2N1bWVudCBib2R5LiBDb250YWlucyBhbGwgdGhlIGNvbnRlbnQgZm9yIHRoZSBwYWdlLgotQlJUYWdJbmZvPUZvcmNlcyBhIGxpbmUgYnJlYWsKLUJVVFRPTlRhZ0luZm89RGVmaW5lcyBhIHB1c2ggYnV0dG9uCi1DQVBUSU9OVGFnSW5mbz1EZWZpbmVzIGEgdGFibGUgY2FwdGlvbgotQ0VOVEVSVGFnSW5mbz1EaXNwbGF5cyBjb250YWluZWQgdGV4dCBjZW50ZXJlZC4gRXF1aXZhbGVudCB0byBESVYgd2l0aCBhbGlnbj1jZW50ZXIuCi1DSVRFVGFnSW5mbz1BIGNpdGF0aW9uCi1DT0RFVGFnSW5mbz1BIGNvbXB1dGVyIGNvZGUgZnJhZ21lbnQKLUNPTFRhZ0luZm89QSB0YWJsZSBjb2x1bW4KLUNPTEdST1VQVGFnSW5mbz1BIGdyb3VwIG9mIHRhYmxlIGNvbHVtbnMKLUREVGFnSW5mbz1BIGRlZmluaXRpb24gb3IgZGVzY3JpcHRpb24gaW4gYSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGxpc3QKLURFTFRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBkZWxldGVkCi1ERk5UYWdJbmZvPUEgZGVmaW5pdGlvbgotRElSVGFnSW5mbz1BIGRpcmVjdG9yeSBsaXN0aW5nCi1ESVZUYWdJbmZvPUEgZ2VuZXJpYyBjb250YWluZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkZWZpbmluZyBsYW5ndWFnZSBvciBzdHlsZSBmb3IgdGhlIGNvbnRlbnRzCi1ETFRhZ0luZm89QSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGxpc3QKLURUVGFnSW5mbz1BIHRlcm0gb3Igc3ViamVjdCBpbiBhIGRlZmluaXRpb24gb3IgZGVzY3JpcHRpb24gbGlzdAotRU1UYWdJbmZvPURpc3BsYXlzIHRleHQgZW1waGFzaXplZCAoZ2VuZXJhbGx5IGl0YWxpY2l6ZWQpCi1FTUJFRFRhZ0luZm89RGVmaW5lcyBhbiBlbWJlZGRlZCBwbHVnLWluLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1GSUVMRFNFVFRhZ0luZm89RGVmaW5lcyBhIGZvcm0gY29udHJvbCBncm91cAotRk9OVFRhZ0luZm89RGlzcGxheXMgdGV4dCBpbiB0aGUgZ2l2ZW4gZm9udAotRk9STVRhZ0luZm89RGVmaW5lcyBhbiBpbnRlcmFjdGl2ZSBmb3JtCi1GUkFNRVRhZ0luZm89RGVmaW5lcyBhIGZyYW1lIHdpdGhpbiB0aGUgY3VycmVudCB3aW5kb3cKLUZSQU1FU0VUVGFnSW5mbz1EZWZpbmVzIGEgZnJhbWVzZXQgdGhhdCBkaXZpZGVzIHRoZSB3aW5kb3cgaW50byBmcmFtZXMKLUgxVGFnSW5mbz1BIHRvcC1sZXZlbCBoZWFkaW5nCi1IMlRhZ0luZm89QSBzZWNvbmQtbGV2ZWwgaGVhZGluZwotSDNUYWdJbmZvPUEgdGhpcmQtbGV2ZWwgaGVhZGluZwotSDRUYWdJbmZvPUEgZm91cnRoLWxldmVsIGhlYWRpbmcKLUg1VGFnSW5mbz1BIGZpZnRoLWxldmVsIGhlYWRpbmcKLUg2VGFnSW5mbz1BIHNpeHRoLWxldmVsIGhlYWRpbmcKLUhFQURUYWdJbmZvPUNvbnRhaW5zIG1ldGFkYXRhIGFuZCB3aW5kb3cgdGl0bGUgaW5mb3JtYXRpb24gZm9yIHRoZSBkb2N1bWVudAotSFJUYWdJbmZvPUEgaG9yaXpvbnRhbCBydWxlCi1IVE1MVGFnSW5mbz1UaGUgcm9vdCBlbGVtZW50IGZvciB0aGUgZG9jdW1lbnQuCi1JVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIGl0YWxpYwotSUZSQU1FVGFnSW5mbz1EZWZpbmVzIGFuIGlubGluZSBzdWJ3aW5kb3cKLUlNR1RhZ0luZm89RGlzcGxheXMgdGhlIHJlZmVyZW5jZWQgaW1hZ2UgYXMgZW1iZWRkZWQgY29udGVudAotSU5QVVRUYWdJbmZvPURlZmluZXMgYSBmb3JtIGNvbnRyb2wgZm9yIHVzZXIgaW5wdXQKLUlOU1RhZ0luZm89RGVmaW5lcyBpbnNlcnRlZCB0ZXh0Ci1JU0lOREVYVGFnSW5mbz1EZWZpbmVzIGEgc2luZ2xlIGxpbmUgcHJvbXB0Ci1LQkRUYWdJbmZvPURlZmluZXMgdGV4dCB0byBiZSBlbnRlcmVkIGJ5IHRoZSB1c2VyCi1MQUJFTFRhZ0luZm89RGVmaW5lcyB0aGUgbGFiZWwgZm9yIGEgZm9ybSBmaWVsZAotTEVHRU5EVGFnSW5mbz1EZWZpbmVzIHRoZSBsYWJlbCBmb3IgYSBzZXQgb2YgZm9ybSBmaWVsZHMKLUxJVGFnSW5mbz1EZWZpbmVzIGEgbGlzdCBpdGVtIHdpdGhpbiBhIGxpc3QKLUxJTktUYWdJbmZvPUEgbWVkaWEtaW5kZXBlbmRlbnQgbGluawotTUFQVGFnSW5mbz1EZWZpbmVzIGEgY2xpZW50LXNpZGUgaW1hZ2UgbWFwCi1NQVJRVUVFVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIHNjcm9sbGluZy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotTUVOVVRhZ0luZm89RGVmaW5lcyBhIG1lbnUgbGlzdAotTUVUQVRhZ0luZm89RGVmaW5lcyBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIGRvY3VtZW50Ci1OT0JSVGFnSW5mbz1PdmVycmlkZXMgYW5kIHByZXZlbnRzIGxpbmUgYnJlYWtzLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1OT0ZSQU1FU1RhZ0luZm89UHJvdmlkZXMgaW5mb3JtYXRpb24gdG8gZGlzcGxheSBpZiB0aGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgZnJhbWVzCi1OT1NDUklQVFRhZ0luZm89UHJvdmlkZXMgaW5mb3JtYXRpb24gdG8gZGlzcGxheSBpZiB0aGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgc2NyaXB0aW5nCi1PQkpFQ1RUYWdJbmZvPURlZmluZXMgYSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdAotT0xUYWdJbmZvPUFuIG9yZGVyZWQgbGlzdAotT1BUR1JPVVBUYWdJbmZvPUFuIG9wdGlvbiBncm91cAotT1BUSU9OVGFnSW5mbz1BIHNlbGVjdGFibGUgY2hvaWNlCi1QVGFnSW5mbz1BIHBhcmFncmFwaAotUEFSQU1UYWdJbmZvPUEgbmFtZWQgcHJvcGVydHkgdmFsdWUKLVBSRVRhZ0luZm89UHJlZm9ybWF0dGVkIHRleHQKLVFUYWdJbmZvPUEgc2hvcnQgaW5saW5lIHF1b3RhdGlvbgotU1RhZ0luZm89RGlzcGxheSB0ZXh0IGluIHN0cmlrZS10aHJvdWdoIHN0eWxlCi1TQU1QVGFnSW5mbz1TYW1wbGUgcHJvZ3JhbSBvdXRwdXQsIHNjcmlwdHMsIGV0Yy4gRGlzcGxheXMgaW4gbW9ub3NwYWNlIGZvbnQuCi1TQ1JJUFRUYWdJbmZvPVNjcmlwdCBzdGF0ZW1lbnRzCi1TRUxFQ1RUYWdJbmZvPUFuIG9wdGlvbiBzZWxlY3RvcgotU01BTExUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgc21hbGwKLVNQQU5UYWdJbmZvPUEgZ2VuZXJpYyBjb250YWluZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkZWZpbmluZyBsYW5ndWFnZSBvciBzdHlsZSBmb3IgdGhlIGNvbnRlbnRzCi1TVFJJS0VUYWdJbmZvPURpc3BsYXkgdGV4dCBpbiBzdHJpa2UtdGhyb3VnaCBzdHlsZQotU1RST05HVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIHN0cm9uZ2x5IGVtcGhhc2l6ZWQgKGdlbmVyYWxseSBib2xkKQotU1RZTEVUYWdJbmZvPURlZmluZXMgYSBzdHlsZSBmb3IgdGhlIGNvbnRhaW5lZCBpbmZvcm1hdGlvbgotU1VCVGFnSW5mbz1EaXNwbGF5IGFzIHN1YnNjcmlwdAotU1VQVGFnSW5mbz1EaXNwbGF5IGFzIHN1cGVyc2NyaXB0Ci1UQUJMRVRhZ0luZm89RGVmaW5lcyBhIHRhYmxlCi1UQk9EWVRhZ0luZm89VGhlIGJvZHkgb2YgdGhlIHRhYmxlCi1URFRhZ0luZm89QSBjZWxsIHdpdGhpbiBhIHRhYmxlCi1URVhUQVJFQVRhZ0luZm89QSBtdWx0aS1saW5lIHRleHQgZmllbGQKLVRGT09UVGFnSW5mbz1BIHRhYmxlIGZvb3RlcgotVEhUYWdJbmZvPUEgdGFibGUgaGVhZGVyIGNlbGwKLVRIRUFEVGFnSW5mbz1BIHRhYmxlIGhlYWRlcgotVElUTEVUYWdJbmZvPVRoZSBkb2N1bWVudCB0aXRsZSwgZGlzcGxheWVkIGluIHRoZSBicm93c2VyJ3MgdGl0bGUgYmFyCi1UUlRhZ0luZm89QSB0YWJsZSByb3cKLVRUVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGluIHRlbGV0eXBlIG9yIG1vbm9zcGFjZWQgdGV4dCBzdHlsZQotVVRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyB1bmRlcmxpbmVkCi1VTFRhZ0luZm89QW4gdW5vcmRlcmVkIGxpc3QKLVZBUlRhZ0luZm89QW4gaW5zdGFuY2Ugb2YgYSB2YXJpYWJsZSBvciBwcm9ncmFtIGFyZ3VtZW50Ci1XQlJUYWdJbmZvPUFsbG93cyBhIGxpbmUgYnJlYWsgd2l0aGluIDxCPiZsdDtOT0JSJmd0OzwvQj4gdGFnLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1Yjc0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08YWJzdHJhY3RHcmFtbWFyQW5ub3RhdGlvbnMgcHJvcGVydGllc0xvY2F0aW9uPSJodG1yZWYiIGNhc2VTZW5zaXRpdmU9ImZhbHNlIj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFCQlIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFCQlJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQUNST05ZTSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQUNST05ZTVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBRERSRVNTIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBRERSRVNTVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFQUExFVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQVBQTEVUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFSRUEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFSRUFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCQVNFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCQVNFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJBU0VGT05UIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCQVNFRk9OVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCRE8iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJET1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCR1NPVU5EIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCR1NPVU5EVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJJRyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQklHVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJMSU5LIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCTElOS1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCTE9DS1FVT1RFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCTE9DS1FVT1RFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJPRFkiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJPRFlUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQlIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJVVFRPTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQlVUVE9OVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNBUFRJT04iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNBUFRJT05UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ0VOVEVSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDRU5URVJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ0lURSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ0lURVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDT0RFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDT0RFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNPTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ09MVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNPTEdST1VQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDT0xHUk9VUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJERCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRERUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iREVMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVERUxUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iREZOIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVERk5UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRElSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVESVJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRElWIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVESVZUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iREwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVEVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJFTSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRU1UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRU1CRUQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUVNQkVEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZJRUxEU0VUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGSUVMRFNFVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGT05UIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGT05UVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZPUk0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZPUk1UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRlJBTUUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZSQU1FVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZSQU1FU0VUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGUkFNRVNFVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIMSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUgyVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkgzIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIM1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJINCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUg1VGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ikg2Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVINlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIRUFEIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIRUFEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkhSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIVE1MIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIVE1MVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkkiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSUZSQU1FIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJRlJBTUVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSU1HIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJTUdUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSU5QVVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlOUFVUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklOUyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSU5TVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklTSU5ERVgiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlTSU5ERVhUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iS0JEIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVLQkRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTEFCRUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxBQkVMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkxFR0VORCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTEVHRU5EVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkxJIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVMSVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMSU5LIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVMSU5LVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik1BUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTUFQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik1BUlFVRUUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1BUlFVRUVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUVOVSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTUVOVVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNRVRBIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNRVRBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik5PQlIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU5PQlJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTk9GUkFNRVMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU5PRlJBTUVTVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik5PU0NSSVBUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVOT1NDUklQVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJPQkpFQ1QiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9CSkVDVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJPTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lT0xUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT1BUR1JPVVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9QVEdST1VQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9QVElPTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lT1BUSU9OVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUEFSQU0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVBBUkFNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlBSRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lUFJFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTQU1QIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTQU1QVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNDUklQVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU0NSSVBUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNFTEVDVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU0VMRUNUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNNQUxMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTTUFMTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTUEFOIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTUEFOVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNUUklLRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1RSSUtFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNUUk9ORyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1RST05HVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNUWUxFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVFlMRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVUIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNVQlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNVUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUQUJMRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEFCTEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEJPRFkiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRCT0RZVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlREIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVURFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJURVhUQVJFQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEVYVEFSRUFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEZPT1QiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRGT09UVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRIIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUSFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUSEVBRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEhFQURUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVElUTEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRJVExFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJVTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVUxUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVkFSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVWQVJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iV0JSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVXQlJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci08L2Fic3RyYWN0R3JhbW1hckFubm90YXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1NWEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIEhUTUwgTW9kZWwKLVN0cnVjdHVyZWRfSFRNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgSFRNTCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotSFRNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1IVE1MCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDZmYzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWRlZmF1bHQ9Im5vIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUwiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZW1iZWRkZWRUeXBlSGFuZGxlciI+Ci0JCTxlbWJlZGRlZFR5cGVIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRIVE1MIj4KLQkJPC9lbWJlZGRlZFR5cGVIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRhc2tzLkhUTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9IVE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29tbWVudEVsZW1lbnRIYW5kbGVyIj4KLQkJPGhhbmRsZXItY3VzdG9tCi0JCQljb21tZW50dHlwZT0ieG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaGFuZGxlcnMuQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJIj4KLQkJCTxzdGFydHdpdGggcHJlZml4PSIjIj48L3N0YXJ0d2l0aD4KLQkJPC9oYW5kbGVyLWN1c3RvbT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJodG1sIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imh0bSI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4aHRtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJodHBsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249IndtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJzaHRtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJzaHRtIj4KLQkJPC9maWxlVHlwZXM+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCTwvcHJvY2Vzc29yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFeHRlbnNpb24gcG9pbnQgZm9yIHRhZ2hlbHAgZG9jdW1lbnRhdGlvbiAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuYW5ub3RhdGlvbkZpbGVzIj4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iaHRtbCxodG0seGh0bWwsaHRwbCx3bWwsc2h0bWwsc2h0bSIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0iaHRtbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiPgotCQkJPCEtLSBub3RlOiBubyBkZWZhdWx0LWNoYXJzZXQgZm9yIEhUTUwsIHNob3VsZCB1c2UgJ3BsYXRmb3JtJyAtLT4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySFRNTCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLTwhLS0gbW92ZWQgdG8gd2hlcmUgdGhlIGR0ZCdzIGFyZSBjb250cmlidXRlZAotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50VHlwZXMiPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjAgU3RyaWN0IgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIDEuMCBUcmFuc2l0aW9uYWwiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCQkJZGVmYXVsdFhIVE1MPSJ0cnVlIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgMS4wIEZyYW1lc2V0IgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJ0cnVlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIEJhc2ljIDEuMCIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjEiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgTVAgMS4wIgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9IndtbCIKLQkJCWRpc3BsYXlOYW1lPSJXTUwgMS4zIgotCQkJbmFtZXNwYWNlVVJJPSIiCi0JCQlpc1dNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjMvL0VOIgotCQkJZGVmYXVsdFdNTD0idHJ1ZSIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTMuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQk8IS0tIGluaXRpYWxpemUgaHRtbCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb250ZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjYxMmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVySW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRCdWlsZGVyIGV4dGVuZHMgRE9NQ29udGVudEJ1aWxkZXJJbXBsIHsKLQotCXByaXZhdGUgaW50IGZUYWdDYXNlOwotCXByaXZhdGUgaW50IGZBdHRyQ2FzZTsKLQotCS8qKgotCSAqIERPTUNvbnRlbnRCdWlsZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGRvY3VtZW50IG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHVibGljIEhUTUxDb250ZW50QnVpbGRlcihEb2N1bWVudCBkb2N1bWVudCkgewotCQlzdXBlcihkb2N1bWVudCk7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZUYWdDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpOwotCQlmQXR0ckNhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpOwotCQkvLwlFbGVtZW50IGNhc2VTZXR0aW5ncyA9IEhUTUxQcmVmZXJlbmNlTWFuYWdlci5nZXRIVE1MSW5zdGFuY2UoKS5nZXRFbGVtZW50KFByZWZlcmVuY2VOYW1lcy5QUkVGRVJSRURfQ0FTRSk7Ci0JCS8vCWZUYWdDYXNlID0gY2FzZVNldHRpbmdzLmdldEF0dHJpYnV0ZShQcmVmZXJlbmNlTmFtZXMuVEFHTkFNRSk7Ci0JCS8vCWZBdHRyQ2FzZSA9IGNhc2VTZXR0aW5ncy5nZXRBdHRyaWJ1dGUoUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURU5BTUUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtbm9kZSwgTm9kZSBwYXJlbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBzdXBlci5jb21wdXRlTmFtZShjbW5vZGUsIHBhcmVudCk7Ci0JCS8vIGRvbid0IGNoYW5nZSB0aGUgY2FzZSB1bmxlc3Mgd2UncmUgY2VydGFpbiBpdCBpcyBtZWFuaW5nbGVzcwotCQkvLwlpZiAoY21ub2RlIGluc3RhbmNlb2YgSFRNTENNTm9kZSAmJiAoKEhUTUxDTU5vZGUpIGNtbm9kZSkuc2hvdWxkSWdub3JlQ2FzZSgpKSB7Ci0JCWlmIChzaG91bGRJZ25vcmVDYXNlKGNtbm9kZSkpIHsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCQkJCWlmIChmVGFnQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQllbHNlIGlmIChmVGFnQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkvLyBlbHNlIGRvIG5vdGhpbmcKLQkJCX0KLQkJCWVsc2UgaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQlpZiAoZkF0dHJDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWVsc2UgaWYgKGZBdHRyQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkvLyBlbHNlIGRvIG5vdGhpbmcKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJZ25vcmVDYXNlKENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKCFjbW5vZGUuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBjbW5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTY1NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBIVE1MIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZXJyb3JfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRlZmluZWRfYXR0cmlidXRlX25hbWVfX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kZWZpbmVkX2F0dHJpYnV0ZV92YWx1ZV9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpcGxlX3ZhbHVlc19zcGVjaWZpZWRfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9fXzBfX191c2VzX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9fXzBfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfYXR0cmlidXRlX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9sb2NhdGlvbl9vZl90YWdfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER1cGxpY2F0ZV90YWdfX18wX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19zdGFydF90YWdfX19fMF9fX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2VuZF90YWdfX19fXzBfX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfdGFnX19fX18wX19fX25vdF9uZWVkZV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5rbm93bl90YWdfX18wX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9fXzBfX191c2VzX3dyb25nX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF90YWdfbmFtZV9fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfSlNQX2RpcmVjdGl2ZV9fXzBfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX3RleHRfc3RyaW5nX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfdXNlZF9pbl9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25fZXJyb3JfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydF90YWdfX19fMF9fX19ub3RfY2xvc19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19fX19fMF9fX19ub3RfY2xvc2VfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV92YWx1ZV9fXzBfX191c2VzX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X25vdF9jbG9zZWRfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX2RlY2xhcmF0aW9uX25vdF9jbF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9ub3RfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENEQVRBX3NlY3Rpb25fbm90X2Nsb3NlZF9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9UYWdfX18wX19fc2hvdWxkX2JlX2FuX2VtcHR5X2VsZW1lbnRfdGFnXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0F0dHJpYnV0ZV92YWx1ZV9fXzBfX19ub3RfY2xvc2VkX18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBIVE1MQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIVE1MQ29yZU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTljNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEhUTUxDb3JlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSFRNTENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSFRNTENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JCUhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIuc3RhcnR1cCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5uaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJLy8ga2V5cwotCQlIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnNodXRkb3duKCk7Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmMyZmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTm9fZXJyb3JfX1VJXz1ObyBlcnJvci4KLVVuZGVmaW5lZF9hdHRyaWJ1dGVfbmFtZV9fX0VSUk9SXz1VbmRlZmluZWQgYXR0cmlidXRlIG5hbWUgKHswfSkuCi1VbmRlZmluZWRfYXR0cmlidXRlX3ZhbHVlX19FUlJPUl89VW5kZWZpbmVkIGF0dHJpYnV0ZSB2YWx1ZSAoezB9KS4KLU11bHRpcGxlX3ZhbHVlc19zcGVjaWZpZWRfX0VSUk9SXz1NdWx0aXBsZSB2YWx1ZXMgc3BlY2lmaWVkIGZvciBhbiBhdHRyaWJ1dGUgKHswfSkuCi1BdHRyaWJ1dGVfbmFtZV9fXzBfX191c2VzX19FUlJPUl89QXR0cmlidXRlIG5hbWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4KLUludmFsaWRfYXR0cmlidXRlX25hbWVfX18wX0VSUk9SXz1JbnZhbGlkIGF0dHJpYnV0ZSBuYW1lICh7MH0pLgotSW52YWxpZF9hdHRyaWJ1dGVfX18wX19fX0VSUk9SXz1JbnZhbGlkIGF0dHJpYnV0ZSAoezB9KS4KLUludmFsaWRfbG9jYXRpb25fb2ZfdGFnX19fX0VSUk9SXz1JbnZhbGlkIGxvY2F0aW9uIG9mIHRhZyAoezB9KS4KLUR1cGxpY2F0ZV90YWdfX18wX19fX0VSUk9SXz1EdXBsaWNhdGUgdGFnICh7MH0pLgotTm9fc3RhcnRfdGFnX19fXzBfX19fX0VSUk9SXz1ObyBzdGFydCB0YWcgKDx7MH0+KS4KLU5vX2VuZF90YWdfX19fXzBfX19fX0VSUk9SXz1ObyBlbmQgdGFnICg8L3swfT4pLgotRW5kX3RhZ19fX19fMF9fX19ub3RfbmVlZGVfRVJST1JfPUVuZCB0YWcgKDwvezB9Pikgbm90IG5lZWRlZC4KLVVua25vd25fdGFnX19fMF9fX19FUlJPUl89VW5rbm93biB0YWcgKHswfSkuCi1UYWdfbmFtZV9fXzBfX191c2VzX3dyb25nX19FUlJPUl89VGFnIG5hbWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4KLUludmFsaWRfdGFnX25hbWVfX18wX19fX0VSUk9SXz1JbnZhbGlkIHRhZyBuYW1lICh7MH0pLgotSW52YWxpZF9KU1BfZGlyZWN0aXZlX19fMF9fRVJST1JfPUludmFsaWQgSlNQIGRpcmVjdGl2ZSAoezB9KS4KLUludmFsaWRfdGV4dF9zdHJpbmdfX18wX19fX0VSUk9SXz1JbnZhbGlkIHRleHQgc3RyaW5nICh7MH0pLgotSW52YWxpZF9jaGFyYWN0ZXJfdXNlZF9pbl9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyIHVzZWQgaW4gdGV4dCBzdHJpbmcgKHswfSkuCi1Vbmtub3duX2Vycm9yX19FUlJPUl89VW5rbm93biBlcnJvci4KLVN0YXJ0X3RhZ19fX18wX19fX25vdF9jbG9zX0VSUk9SXz1TdGFydCB0YWcgKDx7MH0+KSBub3QgY2xvc2VkLgotRW5kX3RhZ19fX19fMF9fX19ub3RfY2xvc2VfRVJST1JfPUVuZCB0YWcgKDwvezB9Pikgbm90IGNsb3NlZC4KLUF0dHJpYnV0ZV92YWx1ZV9fXzBfX191c2VzX0VSUk9SXz1BdHRyaWJ1dGUgdmFsdWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4KLUNvbW1lbnRfbm90X2Nsb3NlZF9fRVJST1JfPUNvbW1lbnQgbm90IGNsb3NlZC4KLURPQ1RZUEVfZGVjbGFyYXRpb25fbm90X2NsX0VSUk9SXz1ET0NUWVBFIGRlY2xhcmF0aW9uIG5vdCBjbG9zZWQuCi1Qcm9jZXNzaW5nX2luc3RydWN0aW9uX25vdF9FUlJPUl89UHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub3QgY2xvc2VkLgotQ0RBVEFfc2VjdGlvbl9ub3RfY2xvc2VkX19FUlJPUl89Q0RBVEEgc2VjdGlvbiBub3QgY2xvc2VkLgotIyBGcm9tIGhlcmUsIHRoZSBuZXcgbWVzc2FnZXMgYXJlIGFkZGVkIGZvciBWNQotX0VSUk9SX1RhZ19fXzBfX19zaG91bGRfYmVfYW5fZW1wdHlfZWxlbWVudF90YWdfMT1UYWcgKHswfSkgc2hvdWxkIGJlIGFuIGVtcHR5LWVsZW1lbnQgdGFnLgotX0VSUk9SX0F0dHJpYnV0ZV92YWx1ZV9fXzBfX19ub3RfY2xvc2VkX18xPUF0dHJpYnV0ZSB2YWx1ZSAoezB9KSBub3QgY2xvc2VkLgotIwotSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZz1VcGRhdGluZyBXZWIgQ29udGVudCBTZXR0aW5ncwotSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZz1Qcm9ibGVtIHNhdmluZyBXZWIgQ29udGVudCBTZXR0aW5ncyBmb3IgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2NhMDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZiBkZXNpcmVkLAotICogdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMgcGx1Z2luLiBPdGhlcgotICogcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIEBwYXJhbSBsZXZlbCBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLCBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24gZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGggL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZmYzMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhbnVwUHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzKSB7Ci0KLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmQ2xlYW51cFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcygpOwotCQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0VGFnTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0QXR0ck5hbWVDYXNlKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0UXVvdGVBdHRyVmFsdWVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRFT0xDb2RlKHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCi0JCWZQcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlU291cmNlKElET01Nb2RlbCBtb2RlbCwgT2JqZWN0IHJlcXVlc3RlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKHJlcXVlc3RlciA9PSBudWxsKSB7Ci0JCQlyZXF1ZXN0ZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4MDA2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlCi0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIgewotCi0JcHVibGljIE5vZGUgY2xlYW51cChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQotCQlTdHJpbmcgY29udGVudCA9IGdldENTU0NvbnRlbnQobm9kZSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQotCQlpbnQgb2Zmc2V0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQlyZXBsYWNlU291cmNlKG1vZGVsLCB0aGlzLCBvZmZzZXQsIGxlbmd0aCwgY29udGVudCk7Ci0JCXJldHVybiAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NDb250ZW50KE5vZGUgdGV4dCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbCh0ZXh0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgYWRhcHRlcjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5jbGVhbnVwKGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChOb2RlIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVTaGVldEFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDIwZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyIHsKLQotCS8qKiBOb24tTkxTIHN0cmluZ3MgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UQUdfT1BFTiA9ICI8IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9UQUdfT1BFTiA9ICI8LyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9UQUdfQ0xPU0UgPSAiLz4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1FVT1RFUyA9ICInJyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVTID0gIlwiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJ1wiJzsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5vZGUgY2xlYW51cChOb2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgcmVuYW1lZE5vZGUgPSAoSURPTU5vZGUpIGNsZWFudXBDaGlsZHJlbihub2RlKTsKLQotCQkvLyBjYWxsIHF1b3RlQXR0clZhbHVlKCkgZmlyc3Qgc28gaXQgd2lsbCBjbG9zZSBhbnkgdW5jbG9zZWQgYXR0cgotCQkvLyBxdW90ZUF0dHJWYWx1ZSgpIHdpbGwgcmV0dXJuIHRoZSBuZXcgc3RhcnQgdGFnIGlmIHRoZXJlIGlzIGEKLQkJLy8gc3RydWN0dXJlIGNoYW5nZQotCQlyZW5hbWVkTm9kZSA9IHF1b3RlQXR0clZhbHVlKHJlbmFtZWROb2RlKTsKLQotCQkvLyBpbnNlcnQgdGFnIGNsb3NlIGlmIG1pc3NpbmcKLQkJLy8gaWYgbm9kZSBpcyBub3QgY29tbWVudCB0YWcKLQkJLy8gYW5kIG5vdCBpbXBsaWNpdCB0YWcKLQkJaWYgKCEoKElET01FbGVtZW50KSByZW5hbWVkTm9kZSkuaXNDb21tZW50VGFnKCkgJiYgKHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSByZW5hbWVkTm9kZS5nZXRNb2RlbCgpOwotCi0JCQkvLyBzYXZlIHN0YXJ0IG9mZnNldCBiZWZvcmUgaW5zZXJ0VGFnQ2xvc2UoKQotCQkJLy8gb3IgZWxzZSByZW5hbWVkTm9kZS5nZXRTdGFydE9mZnNldCgpIHdpbGwgYmUgemVybyBpZgotCQkJLy8gcmVuYW1lZE5vZGUgcmVwbGFjZWQgYnkgaW5zZXJ0VGFnQ2xvc2UoKQotCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSByZW5hbWVkTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCQkvLyBmb3Igc3RhcnQgdGFnCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWluc2VydFRhZ0Nsb3NlKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkvLyB1cGRhdGUgcmVuYW1lZE5vZGUgYW5kIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFmdGVyCi0JCQkvLyBpbnNlcnRUYWdDbG9zZSgpCi0JCQlyZW5hbWVkTm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0JCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCS8vIGZvciBlbmQgdGFnCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQotCQkvLyBjYWxsIGluc2VydE1pc3NpbmdUYWdzKCkgbmV4dCwgaXQgd2lsbCBnZW5lcmF0ZSBpbXBsaWNpdCB0YWdzIGlmCi0JCS8vIHRoZXJlIGFyZSBhbnkKLQkJLy8gaW5zZXJ0TWlzc2luZ1RhZ3MoKSB3aWxsIHJldHVybiB0aGUgbmV3IG1pc3Npbmcgc3RhcnQgdGFnIGlmIG9uZSBpcwotCQkvLyBtaXNzaW5nCi0JCS8vIGFwcGx5VGFnTmFtZUNhc2UoKSB3aWxsIHJldHVybiB0aGUgcmVuYW1lZCBub2RlLgotCQkvLyBUaGUgcmVuYW1lZC9uZXcgbm9kZSB3aWxsIGJlIHNhdmVkIGFuZCByZXR1cm5lZCB0byBjYWxsZXIgd2hlbiBhbGwKLQkJLy8gY2xlYW51cCBpcyBkb25lLgotCQlyZW5hbWVkTm9kZSA9IGluc2VydE1pc3NpbmdUYWdzKHJlbmFtZWROb2RlKTsKLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRSZXF1aXJlZEF0dHJzKHJlbmFtZWROb2RlKTsKLQkJcmVuYW1lZE5vZGUgPSBhcHBseVRhZ05hbWVDYXNlKHJlbmFtZWROb2RlKTsKLQkJYXBwbHlBdHRyTmFtZUNhc2UocmVuYW1lZE5vZGUpOwotCQljbGVhbnVwQ1NTQXR0clZhbHVlKHJlbmFtZWROb2RlKTsKLQotCQlyZXR1cm4gcmVuYW1lZE5vZGU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGNsZWFudXAgc2hvdWxkIG1vZGlmeSBjYXNlLiBSZXR1cm5zIHRydWUgY2FzZSBzaG91bGQgYmUKLQkgKiBwcmVzZXJ2ZWQsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IGlzIGNhc2Ugc2Vuc2l0aXZlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUHJlc2VydmVDYXNlKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gY2FzZSBvcHRpb24gY2FuIGJlIGFwcGxpZWQgdG8gbm8gbmFtZXNwYWNlIHRhZ3MKLQkJcmV0dXJuICFlbGVtZW50LmlzR2xvYmFsVGFnKCk7Ci0JCS8qCi0JCSAqIE1vZGVsUXVlcnlBZGFwdGVyIG1xYWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikKLQkJICogZWxlbWVudC5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsgTW9kZWxRdWVyeSBtcSA9Ci0JCSAqIG51bGw7IENNTm9kZSBub2RlZGVjbCA9IG51bGw7IGlmIChtcWFkYXB0ZXIgIT0gbnVsbCkgbXEgPQotCQkgKiBtcWFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpOyBpZiAobXEgIT0gbnVsbCkgbm9kZWRlY2wgPQotCQkgKiBtcS5nZXRDTU5vZGUobm9kZSk7IC8vIGlmIGEgTm9kZSBpc24ndCByZWNvZ25pemVkIGFzIEhUTUwgb3IgaXMgYW5kCi0JCSAqIGNhcmVzIGFib3V0IGNhc2UsIGRvIG5vdCBhbHRlciBpdCAvLyBpZiAobm9kZWRlY2wgPT0gbnVsbCB8fAotCQkgKiAobm9kZWRlY2wgaW5zdGFuY2VvZiBIVE1MQ01Ob2RlICYmICgoSFRNTENNTm9kZSkKLQkJICogbm9kZWRlY2wpLnNob3VsZElnbm9yZUNhc2UoKSkpIGlmICghCi0JCSAqIG5vZGVkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgcmV0dXJuCi0JCSAqIGZhbHNlOyByZXR1cm4KLQkJICogKChCb29sZWFuKWNtbm9kZS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgY2xlYW51cCBzaG91bGQgZm9yY2UgbW9kaWZ5aW5nIGVsZW1lbnQgbmFtZSB0byBhbGwgbG93ZXJjYXNlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiB0cnVlIGlmIGNsZWFudXAgc2hvdWxkIGxvd2VyY2FzZSBlbGVtZW50IG5hbWUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50LmlzWE1MVGFnKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXBwbHlBdHRyTmFtZUNhc2UoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZwotCi0JCWludCBhdHRyTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTOwotCQlpZiAoIXNob3VsZFByZXNlcnZlQ2FzZShlbGVtZW50KSkgewotCQkJaWYgKGlzWE1MVGFnKGVsZW1lbnQpKQotCQkJCWF0dHJOYW1lQ2FzZSA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQkJZWxzZQotCQkJCWF0dHJOYW1lQ2FzZSA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEF0dHJOYW1lQ2FzZSgpOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0xlbmd0aDsgaSsrKSB7Ci0JCQlJRE9NTm9kZSBlYWNoQXR0ciA9IChJRE9NTm9kZSkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJU3RyaW5nIG9sZEF0dHJOYW1lID0gZWFjaEF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBuZXdBdHRyTmFtZSA9IG9sZEF0dHJOYW1lOwotCQkJLyoKLQkJCSAqIDI1NDk2MSAtIGFsbCBIVE1MIHRhZyBuYW1lcyBhbmQgYXR0cmlidXRlIG5hbWVzIHNob3VsZCBiZSBpbgotCQkJICogRW5nbGlzaCBldmVuIGZvciBIVE1MIGZpbGVzIGluIG90aGVyIGxhbmd1YWdlcyBsaWtlIEphcGFuZXNlIG9yCi0JCQkgKiBUdXJraXNoLiBFbmdsaXNoIGxvY2FsZSBzaG91bGQgYmUgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4KLQkJCSAqIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIChvdGhlcndpc2UgImxpbmsiIHdvdWxkIGJlIGNvbnZlcnRlZCB0bwotCQkJICogVHVya2lzaCAiSSBPdmVyZG90IENhcGl0YWwiKS4KLQkJCSAqLwotCQkJaWYgKGF0dHJOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQluZXdBdHRyTmFtZSA9IG9sZEF0dHJOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCQllbHNlIGlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCi0JCQlpZiAobmV3QXR0ck5hbWUuY29tcGFyZVRvKG9sZEF0dHJOYW1lKSAhPSAwKSB7Ci0JCQkJaW50IGF0dHJOYW1lU3RhcnRPZmZzZXQgPSBlYWNoQXR0ci5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBhdHRyTmFtZUxlbmd0aCA9IG9sZEF0dHJOYW1lLmxlbmd0aCgpOwotCi0JCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBhdHRyTmFtZVN0YXJ0T2Zmc2V0LCBhdHRyTmFtZUxlbmd0aCwgbmV3QXR0ck5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGFwcGx5VGFnTmFtZUNhc2UoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJaW50IHRhZ05hbWVDYXNlID0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUzsKLQotCQlpZiAoIXNob3VsZFByZXNlcnZlQ2FzZShlbGVtZW50KSkgewotCQkJaWYgKGlzWE1MVGFnKGVsZW1lbnQpKQotCQkJCXRhZ05hbWVDYXNlID0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCQllbHNlCi0JCQkJdGFnTmFtZUNhc2UgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRUYWdOYW1lQ2FzZSgpOwotCQl9Ci0KLQkJU3RyaW5nIG9sZFRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZyBuZXdUYWdOYW1lID0gb2xkVGFnTmFtZTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJLyoKLQkJICogMjU0OTYxIC0gYWxsIEhUTUwgdGFnIG5hbWVzIGFuZCBhdHRyaWJ1dGUgbmFtZXMgc2hvdWxkIGJlIGluCi0JCSAqIEVuZ2xpc2ggZXZlbiBmb3IgSFRNTCBmaWxlcyBpbiBvdGhlciBsYW5ndWFnZXMgbGlrZSBKYXBhbmVzZSBvcgotCQkgKiBUdXJraXNoLiBFbmdsaXNoIGxvY2FsZSBzaG91bGQgYmUgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gdXBwZXJjYXNlCi0JCSAqIGFuZCBsb3dlcmNhc2UgKG90aGVyd2lzZSAibGluayIgd291bGQgYmUgY29udmVydGVkIHRvIFR1cmtpc2ggIkkKLQkJICogT3ZlcmRvdCBDYXBpdGFsIikuCi0JCSAqLwotCQlpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQluZXdUYWdOYW1lID0gb2xkVGFnTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQllbHNlIGlmICh0YWdOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCW5ld1RhZ05hbWUgPSBvbGRUYWdOYW1lLnRvVXBwZXJDYXNlKExvY2FsZS5VUyk7Ci0KLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCAmJiByZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBzdGFydFRhZ05hbWVSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCQlpbnQgc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQgPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChzdGFydFRhZ05hbWVSZWdpb24pOwotCQkJCWludCBzdGFydFRhZ05hbWVMZW5ndGggPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHN0YXJ0VGFnTmFtZVJlZ2lvbikgLSBzdGFydFRhZ05hbWVTdGFydE9mZnNldDsKLQotCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0LCBzdGFydFRhZ05hbWVMZW5ndGgsIG5ld1RhZ05hbWUpOwotCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkJCS8vIG5ldwotCQkJCS8vIG5vZGUKLQkJCX0KLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucyAhPSBudWxsICYmIHJlZ2lvbnMuc2l6ZSgpID4gMCkgewotCQkJCUlUZXh0UmVnaW9uIGVuZFRhZ05hbWVSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCQlpbnQgZW5kVGFnTmFtZVN0YXJ0T2Zmc2V0ID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGVuZFRhZ05hbWVSZWdpb24pOwotCQkJCWludCBlbmRUYWdOYW1lTGVuZ3RoID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoZW5kVGFnTmFtZVJlZ2lvbikgLSBlbmRUYWdOYW1lU3RhcnRPZmZzZXQ7Ci0KLQkJCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdOYW1lU3RhcnRPZmZzZXQsIGVuZFRhZ05hbWVMZW5ndGgsIG5ld1RhZ05hbWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY2xlYW51cENoaWxkcmVuKE5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBjbGVhbnVwIHRoaXMgY2hpbGQgbm9kZQotCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBmYWN0b3J5LmNyZWF0ZUhhbmRsZXIoY2hpbGROb2RlLCBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSk7Ci0JCQkJY2hpbGROb2RlID0gY2xlYW51cEhhbmRsZXIuY2xlYW51cChjaGlsZE5vZGUpOwotCi0JCQkJLy8gZ2V0IG5ldyBwYXJlbnQgbm9kZQotCQkJCXBhcmVudE5vZGUgPSBjaGlsZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJLy8gZ2V0IG5leHQgY2hpbGQgbm9kZQotCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cENTU0F0dHJWYWx1ZShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSkKLQkJCXJldHVybjsKLQotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoInN0eWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0Q1NTVmFsdWUoYXR0cik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkVmFsdWUgPSAoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpOwotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotCQkJcmV0dXJuOwotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZURlY2xhcmF0aW9uQWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKGF0dHIpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBhZGFwdGVyOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmNsZWFudXAoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgaW5zZXJ0RW5kVGFnKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQllbHNlIGlmIChpc0VtcHR5RWxlbWVudChlbGVtZW50KSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCBsYXN0UmVnaW9uLmdldExlbmd0aCgpLCBFTVBUWV9UQUdfQ0xPU0UpOwotCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uQmVmb3JlVGFnQ2xvc2UgPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEgLSAxKTsKLQotCQkJCS8vIGluc2VydCBhIHNwYWNlIHNlcGFyYXRvciBiZWZvcmUgdGFnIGNsb3NlIGlmIHRoZSBwcmV2aW91cwotCQkJCS8vIHJlZ2lvbiBkb2VzIG5vdCBoYXZlIGV4dHJhIHNwYWNlcwotCQkJCWlmIChyZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRUZXh0TGVuZ3RoKCkgPT0gcmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0TGVuZ3RoKCkpCi0JCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBlbmRUYWcgPSBFTkRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCi0JCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpbnQgZW5kVGFnU3RhcnRPZmZzZXQgPSAwOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJCS8vIGlmIHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZyBhZnRlciB0aGUKLQkJCQkvLyBsYXN0IGNoaWxkCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBsYXN0Q2hpbGQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbHNlCi0JCQkJLy8gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnCi0JCQkJLy8gYWZ0ZXIgdGhlIHN0YXJ0IHRhZwotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdTdGFydE9mZnNldCwgMCwgZW5kVGFnKTsKLQkJfQotCi0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGluc2VydE1pc3NpbmdUYWdzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRNaXNzaW5nVGFncykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJLy8gaW1wbGljaXQgc3RhcnQgdGFnOyBnZW5lcmF0ZSB0YWcgZm9yIGl0Ci0JCQkJbmV3Tm9kZSA9IGluc2VydFN0YXJ0VGFnKG5vZGUpOwotCQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgcmVnaW9uTGlzdCAhPSBudWxsICYmIHJlZ2lvbkxpc3QuZ2V0KHJlZ2lvbkxpc3Quc2l6ZSgpIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBzdGFydCB0YWcgbWlzc2luZwotCQkJCQlpZiAoaXNTdGFydFRhZ1JlcXVpcmVkKG5ld05vZGUpKQotCQkJCQkJbmV3Tm9kZSA9IGluc2VydFN0YXJ0VGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzRW5kVGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0RW5kVGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBpbnNlcnRTdGFydFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlJRE9NTm9kZSBuZXdOb2RlID0gbnVsbDsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gU1RBUlRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRUYWdTdGFydE9mZnNldCwgMCwgc3RhcnRUYWcpOwotCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydFRhZ0Nsb3NlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKChmbGF0Tm9kZSAhPSBudWxsKSAmJiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpICE9IG51bGwpKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25MaXN0LmdldChyZWdpb25MaXN0LnNpemUoKSAtIDEpOwotCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyByZWdpb25UeXBlID0gbGFzdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgJiYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQkvLyBpbnNlcnQgIj4iIGFmdGVyIGxhc3RSZWdpb24gb2YgZmxhdE5vZGUKLQkJCQkJLy8gYXMgaW4gIjxhPC9hPiIgaWYgZmxhdE5vZGUgaXMgZm9yIHN0YXJ0IHRhZywgb3IgaW4KLQkJCQkJLy8gIjxhPjwvYSIgaWYgZmxhdE5vZGUgaXMgZm9yIGVuZCB0YWcKLQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChsYXN0UmVnaW9uKSwgMCwgIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBlbmQgdGFncyBvZiBIVE1MIEVNUFRZIGNvbnRlbnQgdHlwZSwgc3VjaCBhcyBJTUcsIGFuZCBIVE1MCi0JICogdW5kZWZpbmVkIHRhZ3MgYXJlIHBhcnNlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHN0YXJ0IHRhZ3MuIFNvIGluc2VydGluZwotCSAqIHRoZSBtaXNzaW5nIHN0YXJ0IHRhZyBpcyB1c2VsZXNzIGFuZCBldmVuIGhhcm1mdWwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFydFRhZ1JlcXVpcmVkKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5vZGUuaXNDb250YWluZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTFR5cGUoSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGRvY3VtZW50LmlzWE1MVHlwZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgcXVvdGVBdHRyVmFsdWUoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRRdW90ZUF0dHJWYWx1ZXMoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKHF1b3RlQXR0clZhbHVlcykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJCWF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQlJRE9NQXR0ciBlYWNoQXR0ciA9IChJRE9NQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCS8vIElUZXh0UmVnaW9uIG9sZEF0dHJWYWx1ZVJlZ2lvbiA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJU3RyaW5nIG9sZEF0dHJWYWx1ZSA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCWlmIChvbGRBdHRyVmFsdWUgPT0gbnVsbCkgewotCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQlpZiAoaXNYTUxUeXBlKHN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJCS8vIFRPRE86IEtpdCwgcGxlYXNlIGNoZWNrLiBJcyB0aGVyZSBhbnkgd2F5IHRvIG5vdAotCQkJCQkJLy8gcmVseSBvbiBnZXR0aW5nIHJlZ2lvbnMgZnJvbSBhdHRyaWJ1dGVzPwotCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9ICI9XCIiICsgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvblRleHQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldE5hbWVSZWdpb25FbmRPZmZzZXQoKSwgMCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7IC8vIHNhdmUKLQkJCQkJCS8vIG5ldwotCQkJCQkJLy8gbm9kZQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCi0JCQkJCWNoYXIgcXVvdGUgPSBTdHJpbmdVdGlscy5pc1F1b3RlZChvbGRBdHRyVmFsdWUpID8gb2xkQXR0clZhbHVlLmNoYXJBdCgwKSA6IERPVUJMRV9RVU9URTsKLQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShlYWNoQXR0ciwgcXVvdGUpOwotCi0JCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbgotCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJLy8gd2hlbiB0aGUgcmVnaW9uIGlzIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbi4KLQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93Li4uCi0JCQkJCWlmIChvbGRBdHRyVmFsdWUubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJY2hhciBmaXJzdENoYXIgPSBvbGRBdHRyVmFsdWUuY2hhckF0KDApOwotCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpCi0JCQkJCQkJbmV3QXR0clZhbHVlID0gU0lOR0xFX1FVT1RFUzsKLQkJCQkJCWVsc2UgaWYgKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEUpCi0JCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJfQotCi0JCQkJCWlmIChuZXdBdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8ob2xkQXR0clZhbHVlKSAhPSAwKSB7Ci0JCQkJCQkJaW50IGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCWludCBhdHRyVmFsdWVMZW5ndGggPSBvbGRBdHRyVmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0LCBhdHRyVmFsdWVMZW5ndGgsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJCQkJCQkvLyBuZXcKLQkJCQkJCQkvLyBub2RlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydFJlcXVpcmVkQXR0cnMoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRSZXF1aXJlZEF0dHJzKSB7Ci0JCQlMaXN0IHJlcXVpcmVkQXR0cnMgPSBnZXRSZXF1aXJlZEF0dHJzKG5ld05vZGUpOwotCQkJaWYgKHJlcXVpcmVkQXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCU5hbWVkTm9kZU1hcCBjdXJyZW50QXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlMaXN0IGluc2VydEF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMCkKLQkJCQkJaW5zZXJ0QXR0cnMuYWRkQWxsKHJlcXVpcmVkQXR0cnMpOwotCQkJCWVsc2UgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkQXR0cnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJOYW1lID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSByZXF1aXJlZEF0dHJzLmdldChpKSkuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VycmVudEF0dHJzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlTdHJpbmcgY3VycmVudEF0dHJOYW1lID0gY3VycmVudEF0dHJzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQlpZiAocmVxdWlyZWRBdHRyTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGN1cnJlbnRBdHRyTmFtZSkgPT0gMCkgewotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghZm91bmQpCi0JCQkJCQkJaW5zZXJ0QXR0cnMuYWRkKHJlcXVpcmVkQXR0cnMuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaW5zZXJ0QXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpbnQgaW5kZXggPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExhc3RSZWdpb24oKTsKLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCQkJaW5kZXgtLTsKLQkJCQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJaW5kZXggPSBpbmRleCAtIDI7Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfQotCQkJCQlNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJCQl0cnkgewotCQkJCQkJZm9yIChpbnQgaSA9IGluc2VydEF0dHJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnNlcnRBdHRycy5nZXQoaSk7Ci0JCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0cmlidXRlTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJEZWNsLmdldERlZmF1bHRWYWx1ZSgpOwotCQkJCQkJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkKLQkJCQkJCQkJZGVmYXVsdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChpID09IDAgJiYgbGFzdFJlZ2lvbi5nZXRMZW5ndGgoKSA+IGxhc3RSZWdpb24uZ2V0VGV4dExlbmd0aCgpKQotCQkJCQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlICs9IHJlcXVpcmVkQXR0cmlidXRlTmFtZSArICI9XCIiICsgZGVmYXVsdFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChpbmRleCwgbmFtZUFuZERlZmF1bHRWYWx1ZSkpOwotCQkJCQkJCS8vIEJVRzMzODE6IE11bHRpVGV4dEVkaXQgYXBwbGllcyBhbGwgY2hpbGQKLQkJCQkJCQkvLyBUZXh0RWRpdCdzIGJhc2luZyBvbiBvZmZzZXRzCi0JCQkJCQkJLy8gaW4gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgZmlyc3QgVGV4dEVkaXQsIG5vdAotCQkJCQkJCS8vIGFmdGVyIGVhY2gKLQkJCQkJCQkvLyBjaGlsZCBUZXh0RWRpdC4gVGhlcmVmb3JlLCBkbyBub3QgbmVlZCB0bwotCQkJCQkJCS8vIGFkdmFuY2UgdGhlIGluZGV4LgotCQkJCQkJCS8vIGluZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KG5ld05vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCU1vZGVsUXVlcnkgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXJlc3VsdCA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKERvY3VtZW50KSBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlYTY4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotY2xhc3MgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSB7Ci0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSBmSW5zdGFuY2UgPSBudWxsOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjcmVhdGVIYW5kbGVyKE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzKSB7Ci0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWlmIChpc0pTUFRhZyhub2RlKSkKLQkJCQkJaGFuZGxlciA9IG5ldyBKU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJZWxzZQotCQkJCQloYW5kbGVyID0gbmV3IEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJaWYgKGlzUGFyZW50U3R5bGVUYWcobm9kZSkpCi0JCQkJCWhhbmRsZXIgPSBuZXcgQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWVsc2UKLQkJCQkJaGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJaGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCX0KLQkJfQotCi0JCWhhbmRsZXIuc2V0Q2xlYW51cFByZWZlcmVuY2VzKGNsZWFudXBQcmVmZXJlbmNlcyk7Ci0KLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyhOb2RlIG5vZGUpIHsKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX0NMT1NFID0gIkpTUF9DT01NRU5UX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9PUEVOID0gIkpTUF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9URVhUID0gIkpTUF9DT01NRU5UX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gIkpTUF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElET01Ob2RlKSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJLy8gaW4gc29tZSBjYXNlcywgdGhlIG5vZGVzIGV4aXN0cywgYnV0IGhhc24ndCBiZWVuIGFzc29jaWF0ZWQKLQkJCS8vIHdpdGgKLQkJCS8vIGEgZmxhdG5vZGUgeWV0ICh0aGUgc2NyZWVuIHVwZGF0ZXMgY2FuIGJlIGluaXRpYXRlZCBvbiBhCi0JCQkvLyBkaWZmZXJlbnQgdGhyZWFkLAotCQkJLy8gc28gdGhlIHJlcXVlc3QgZm9yIGEgZmxhdG5vZGUgY2FuIGNvbWUgaW4gYmVmb3JlIHRoZSBub2RlIGlzCi0JCQkvLyBmdWxseSBmb3JtZWQuCi0JCQkvLyBpZiB0aGUgZmxhdG5vZGUgaXMgbnVsbCwgd2UnbGwganVzdCBhbGxvdyB0aGUgZGVmYXVsdHMgdG8KLQkJCS8vIGFwcGx5LgotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmxhdE5vZGVUeXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQkJCS8vIHNob3VsZCBub3QgYmUgbnVsbCwgYnV0IGp1c3QgdG8gYmUgc3VyZQotCQkJCWlmIChmbGF0Tm9kZVR5cGUgIT0gbnVsbCkgewotCQkJCQlpZiAoKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0NPTlRFTlQpKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfRVhQUkVTU0lPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX1NDUklQVExFVF9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RFQ0xBUkFUSU9OX09QRU4pKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfRElSRUNUSVZFX0NMT1NFKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9OQU1FKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0NMT1NFKSkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcmVudFN0eWxlVGFnKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChmbGF0Tm9kZS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlmIHRoZSBwYXJlbnQgaXMgU1RZTEUgZWxlbWVudAotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5hbWUgPSBwYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNUWUxFIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cFByb2Nlc3NvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjc2NWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUhhbmRsZXIobm9kZSwgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmQ2xlYW51cFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRUYWdOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRBdHRyTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Rm9ybWF0U291cmNlKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbmV3IEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0pTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0pTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwYTc4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyIHsKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmI2MTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyIHsKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaGFuZGxlcnMvQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaGFuZGxlcnMvQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjODgzMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5oYW5kbGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLkNvbW1lbnRFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbC5UYWdTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJIGltcGxlbWVudHMgQ29tbWVudEVsZW1lbnRIYW5kbGVyIHsKLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDTURvY3VtZW50IGNtID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCWlmIChjbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbS5nZXRFbGVtZW50cygpOwotCQlpZiAobWFwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoZGF0YSwgMSk7Ci0JCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLmxlbmd0aCgpICsgNCk7Ci0JCWJ1ZmZlci5hcHBlbmQoU1NJX1BSRUZJWCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzonKTsKLQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJLy8gY2hlY2sgaWYgdmFsaWQgKGRlZmluZWQpIFNTSSB0YWcgb3Igbm90Ci0JCWlmIChtYXAuZ2V0TmFtZWRJdGVtKHRhZ05hbWUpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ29tbWVudEVsZW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ29tbWVudEVsZW1lbnRGYWN0b3J5KGRvY3VtZW50LCBpc0pTUFRhZywgdGhpcyk7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlKHRhZ05hbWUsIENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19TVEFSVCk7Ci0KLQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJU3RyaW5nIGF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl3aGlsZSAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQlBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJYXR0ci5zZXRWYWx1ZShhdHRyVmFsdWUpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCX0KLQkJCWF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCcjJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyTmFtZShhdHRyKTsKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJLy8gYXR0ciBuYW1lIG9ubHkgZm9yIEhUTUwgYm9vbGVhbiBhbmQgSlNQCi0JCQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOyAvLyBhbHdheXMgZW1wdHkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ01Eb2N1bWVudCBjbSA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoY20gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVsZW1lbnRzKCk7Ci0JCWlmIChtYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ID09IG51bGwgfHwgIXByZWZpeC5lcXVhbHMoU1NJX1BSRUZJWCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA8PSA0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1hcC5nZXROYW1lZEl0ZW0odGFnTmFtZSkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSRUZJWCA9ICJzc2kiOy8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU2MzQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBBdHRyaWJ1dGVDb2xsZWN0aW9uIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgSFRNTDQwTmFtZXNwYWNlIHsKLQotCS8qKiBib2R5Y29sb3JzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJPRFlDT0xPUlMgPSB7QVRUUl9OQU1FX0JHQ09MT1IsIEFUVFJfTkFNRV9URVhULCBBVFRSX05BTUVfTElOSywgQVRUUl9OQU1FX1ZMSU5LLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSU5LfTsKLQkvKiogY29yZWF0dHJzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPUkUgPSB7QVRUUl9OQU1FX0lELCBBVFRSX05BTUVfQ0xBU1MsIEFUVFJfTkFNRV9TVFlMRSwgQVRUUl9OQU1FX1RJVExFfTsKLQkvKiogZXZlbnRzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVWRU5UUyA9IHtBVFRSX05BTUVfT05DTElDSywgQVRUUl9OQU1FX09OREJMQ0xJQ0ssIEFUVFJfTkFNRV9PTk1PVVNFRE9XTiwgQVRUUl9OQU1FX09OTU9VU0VVUCwgQVRUUl9OQU1FX09OTU9VU0VPVkVSLCBBVFRSX05BTUVfT05NT1VTRU1PVkUsIEFUVFJfTkFNRV9PTk1PVVNFT1VULCBBVFRSX05BTUVfT05LRVlQUkVTUywgQVRUUl9OQU1FX09OS0VZRE9XTiwgQVRUUl9OQU1FX09OS0VZVVAsIEFUVFJfTkFNRV9PTkhFTFB9OwotCS8qKiBpMThuLiBsYW5nLCBkaXIgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJMThOID0ge0FUVFJfTkFNRV9MQU5HLCBBVFRSX05BTUVfRElSfTsKLQkvKiogY2VsbGhhbGlnaC4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDRUxMSEFMSUdOID0ge0FUVFJfTkFNRV9DSEFSLCBBVFRSX05BTUVfQ0hBUk9GRn07Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGUoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0KLQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FCQlIpKSB7Ci0JCQkvLyAoYWJiciAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FCQlIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FDQ0VQVCkpIHsKLQkJCS8vIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUNDRVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCkpIHsKLQkJCS8vIChhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSU0VUUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ1RJT04pKSB7Ci0JCQkvLyAoYWN0aW9uICVVUkkgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BUkNISVZFKSkgewotCQkJLy8gKGFyY2hpdmUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FSQ0hJVkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FDQ0VTU0tFWSkpIHsKLQkJCS8vIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUNDRVNTS0VZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BTElOSykpIHsKLQkJCS8vIChhbGluayAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJTkssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FMVCkpIHsKLQkJCS8vIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BVVRPU1RBUlQpKSB7Ci0JCQkvLyAoYXV0b3N0YXJ0ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9TVEFSVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVVUT1BMQVkpKSB7Ci0JCQkvLyAoYXV0b3BsYXkgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQVVUT1BMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FVVE9TSVpFKSkgewotCQkJLy8gKGF1dG9zaXplICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BWElTKSkgewotCQkJLy8gKGF4aXMgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FYSVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JBQ0tHUk9VTkQpKSB7Ci0JCQkvLyAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JBQ0tHUk9VTkQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JFSEFWSU9SKSkgewotCQkJLy8gKGJlaGF2aW9yIChzY3JvbGx8c2xpZGV8YWx0ZXJuYXRlKSBzY3JvbGwpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1NDUk9MTCwgQVRUUl9WQUxVRV9TTElERSwgQVRUUl9WQUxVRV9BTFRFUk5BVEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1NDUk9MTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JFSEFWSU9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CR0NPTE9SKSkgewotCQkJLy8gKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JHQ09MT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPUkRFUikpIHsKLQkJCS8vIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DRUxMU1BBQ0lORykpIHsKLQkJCS8vIChjZWxsc3BhY2luZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DRUxMU1BBQ0lORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0VMTFBBRERJTkcpKSB7Ci0JCQkvLyAoY2VsbHBhZGRpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0VMTFBBRERJTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NHSSkpIHsKLQkJCS8vIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DR0ksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIQVIpKSB7Ci0JCQkvLyAoY2hhciAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSQUNURVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DSEFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEFST0ZGKSkgewotCQkJLy8gKGNoYXJvZmYgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUk9GRiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hBUlNFVCkpIHsKLQkJCS8vIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSU0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUlNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0lURSkpIHsKLQkJCS8vIChjaXRlICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0lURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xBU1MpKSB7Ci0JCQkvLyAoY2xhc3MgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMQVNTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTEFTU0lEKSkgewotCQkJLy8gKGNsYXNzaWQgJVVSSSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMQVNTSUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NNRCkpIHsKLQkJCS8vIChjbWQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NNRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hFQ0tFRCkpIHsKLQkJCS8vIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DSEVDS0VEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hFQ0tFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xFQVIpKSB7Ci0JCQkvLyAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQUxMLCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX05PTkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX05PTkUpOwotCi0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMRUFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFKSkgewotCQkJLy8gKGNvZGUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPREUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPREVCQVNFKSkgewotCQkJLy8gKGNvZGViYXNlICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09ERUJBU0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPREVUWVBFKSkgewotCQkJLy8gKGNvZGV0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0RFVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09MT1IpKSB7Ci0JCQkvLyAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT01QQUNUKSkgewotCQkJLy8gKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX0NPTVBBQ1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT01QQUNULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTKSkgewotCQkJLy8gKGNvbHMgTlVNQkVSICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTFNQQU4pKSB7Ci0JCQkvLyAoY29sc3BhbiBOVU1CRVIgMSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfMSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTFNQQU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTlRFTlQpKSB7Ci0JCQkvLyAoY29udGVudCBDREFUQSAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTlRFTlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTlRST0xMRVIpKSB7Ci0JCQkvLyAoY29udHJvbGxlciAodHJ1ZXxmYWxzZSkgdHJ1ZSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTlRST0xMRVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPT1JEUykpIHsKLQkJCS8vIChjb29yZHMgJUNvb3JkczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09PUkRTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09PUkRTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRBKSkgewotCQkJLy8gKGRhdGEgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EQVRBLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRFVElNRSkpIHsKLQkJCS8vIChkYXRldGltZSAlRGF0ZXRpbWU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkRBVEVUSU1FKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREFURVRJTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RBVEFQQUdFU0laRSkpIHsKLQkJCS8vIChkYXRhcGFnZXNpemUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RBVEFQQUdFU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREVDTEFSRSkpIHsKLQkJCS8vIChkZWNsYXJlIChkZWNsYXJlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ERUNMQVJFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREVDTEFSRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREVGRVIpKSB7Ci0JCQkvLyAoZGVmZXIgKGRlZmVyKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ERUZFUn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RFRkVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVIpKSB7Ci0JCQkvLyAoZGlyIChsdHJ8cnRsKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTFRSLCBBVFRSX1ZBTFVFX1JUTH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElSRUNUSU9OKSkgewotCQkJLy8gKGRpcmVjdGlvbiAobGVmdHxyaWdodHx1cHxkb3duKSBsZWZ0KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX1VQLCBBVFRSX1ZBTFVFX0RPV059OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ESVJFQ1RJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RJUkVDVEtFWSkpIHsKLQkJCS8vIChkaXJlY3RrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElSRUNUS0VZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVNBQkxFRCkpIHsKLQkJCS8vIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQkvLyBib29sZWFuIGF0dHJpYnV0ZSBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgaXRzIG5hbWUuCi0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX0RJU0FCTEVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElTQUJMRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VOQ1RZUEUpKSB7Ci0JCQkvLyAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VOQ1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VSUk1TRykpIHsKLQkJCS8vIChlcnJtc2cgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VSUk1TRywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRVZFTlQpKSB7Ci0JCQkvLyAoZXZlbnQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VWRU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GQUNFKSkgewotCQkJLy8gKGZhY2UgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0ZJTEUpKSB7Ci0JCQkvLyAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZJTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0ZPUikpIHsKLQkJCS8vIChmb3IgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0ZSQU1FKSkgewotCQkJLy8gKGZyYW1lICVURnJhbWU7ICNJTVBMSUVEKQotCQkJLy8gJVRGcmFtZTsgaXMKLQkJCS8vICh2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVk9JRCwgQVRUUl9WQUxVRV9BQk9WRSwgQVRUUl9WQUxVRV9CRUxPVywgQVRUUl9WQUxVRV9IU0lERVMsIEFUVFJfVkFMVUVfTEhTLCBBVFRSX1ZBTFVFX1JIUywgQVRUUl9WQUxVRV9WU0lERVMsIEFUVFJfVkFMVUVfQk9YLCBBVFRSX1ZBTFVFX0JPUkRFUn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZSQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRUJPUkRFUikpIHsKLQkJCS8vIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV8xLCBBVFRSX1ZBTFVFXzB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLyA8PEQyMTU2ODQKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRVNQQUNJTkcpKSB7Ci0JCQkvLyAoZnJhbWVzcGFjaW5nIENEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRlJBTUVTUEFDSU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQkvLyBEMjE1Njg0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSEVBREVSUykpIHsKLQkJCS8vIChIRUFERVJTIElEUkVGUzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuSURSRUZTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVBREVSUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSEVJR0hUKSkgewotCQkJLy8gKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hJRERFTikpIHsKLQkJCS8vIChoaWRkZW4gQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hJRERFTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFJFRikpIHsKLQkJCS8vIChocmVmICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSFJFRiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFJFRkxBTkcpKSB7Ci0JCQkvLyAoaHJlZmxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEFOR1VBR0VfQ09ERSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUZMQU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IU1BBQ0UpKSB7Ci0JCQkvLyAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFRUUF9FUVVJVikpIHsKLQkJCS8vIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTkFNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hUVFBfRVFVSVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0lEKSkgewotCQkJLy8gKGlkIElEICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSUQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSVNNQVApKSB7Ci0JCQkvLyAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9JU01BUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0lTTUFQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9JU1RZTEUpKSB7Ci0JCQkvLyAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JU1RZTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBQkVMKSkgewotCQkJLy8gKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEFCRUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBTkcpKSB7Ci0JCQkvLyAobGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MQU5HVUFHRV9DT0RFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEFORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTEFOR1VBR0UpKSB7Ci0JCQkvLyAobGFuZ3VhZ2UgJUNEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEFOR1VBR0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xJTkspKSB7Ci0JCQkvLyAobGluayAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTElOSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTE9OR0RFU0MpKSB7Ci0JCQkvLyAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MT05HREVTQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTE9PUCkpIHsKLQkJCS8vIChsb29wIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MT09QLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQUNSTykpIHsKLQkJCS8vIChtYWNybyBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFDUk8sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BUEZJTEUpKSB7Ci0JCQkvLyAobWFwZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BUEZJTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BUkdJTldJRFRIKSkgewotCQkJLy8gKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BUkdJTldJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQpKSB7Ci0JCQkvLyAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFYTEVOR1RIKSkgewotCQkJLy8gKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVhMRU5HVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWVNDUklQVCkpIHsKLQkJCS8vIChtYXlzY3JpcHQgKG1heXNjcmlwdCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTUFZU0NSSVBUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFZU0NSSVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRURJQSkpIHsKLQkJCS8vIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5NRURJQV9ERVNDKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVESUEsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01FVEhPRCkpIHsKLQkJCS8vIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0dFVCwgQVRUUl9WQUxVRV9QT1NUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9HRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NRVRIT0QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01VTFRJUExFKSkgewotCQkJLy8gKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTVVMVElQTEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NVUxUSVBMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTkFNRSkpIHsKLQkJCS8vIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT0hSRUYpKSB7Ci0JCQkvLyAobm9ocmVmIChub2hyZWYpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PSFJFRn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05PSFJFRiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9SRVNJWkUpKSB7Ci0JCQkvLyAobm9yZXNpemUgKG5vcmVzaXplKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1JFU0laRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05PUkVTSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT1NIQURFKSkgewotCQkJLy8gKG5vc2hhZGUgKG5vc2hhZGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PU0hBREV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1NIQURFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT1dSQVApKSB7Ci0JCQkvLyAobm93cmFwIChub3dyYXApICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PV1JBUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05PV1JBUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT0JKRUNUKSkgewotCQkJLy8gKG9iamVjdCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9PQkpFQ1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PQkpFQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQkxVUikpIHsKLQkJCS8vIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05CTFVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkNMSUNLKSkgewotCQkJLy8gKG9uY2xpY2sgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05DTElDSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05DSEFOR0UpKSB7Ci0JCQkvLyAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05DSEFOR0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OREJMQ0xJQ0spKSB7Ci0JCQkvLyAob25kYmxjbGljayAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkRCTENMSUNLLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkZPQ1VTKSkgewotCQkJLy8gKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05GT0NVUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05IRUxQKSkgewotCQkJLy8gKG9uaGVscCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkhFTFAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OS0VZUFJFU1MpKSB7Ci0JCQkvLyAob25rZXlwcmVzcyAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWVBSRVNTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTktFWURPV04pKSB7Ci0JCQkvLyAob25rZXlkb3duICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OS0VZRE9XTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05LRVlVUCkpIHsKLQkJCS8vIChvbmt5ZXVwICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OS0VZVVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTE9BRCkpIHsKLQkJCS8vIChvbmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05MT0FELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFRE9XTikpIHsKLQkJCS8vIChvbm1vdXNlZG93biAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFRE9XTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRVVQKSkgewotCQkJLy8gKG9ubW91c2V1cCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFVVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VPVkVSKSkgewotCQkJLy8gKG9ubW91c2VvdmVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTU9VU0VPVkVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFTU9WRSkpIHsKLQkJCS8vIChvbm1vdXNlbW92ZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFTU9WRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRU9VVCkpIHsKLQkJCS8vIChvbm1vdXNlb3V0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTU9VU0VPVVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OUkVTRVQpKSB7Ci0JCQkvLyAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlJFU0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlNFTEVDVCkpIHsKLQkJCS8vIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlNFTEVDVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TVUJNSVQpKSB7Ci0JCQkvLyAob25zdWJtaXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TVUJNSVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OVU5MT0FEKSkgewotCQkJLy8gKG9udW5sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OVU5MT0FELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QQUxFVFRFKSkgewotCQkJLy8gKHBhbGV0dGUgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QQUxFVFRFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QQU5FTCkpIHsKLQkJCS8vIChwYW5lbCBDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1BBTkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QTEFZQ09VTlQpKSB7Ci0JCQkvLyAocGxheWNvdW50IE5VTUJFUjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QTEFZQ09VTlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1BST0ZJTEUpKSB7Ci0JCQkvLyAocHJvZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1BST0ZJTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1BST01QVCkpIHsKLQkJCS8vIChwcm9tcHQgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QUk9NUFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFQURPTkxZKSkgewotCQkJLy8gKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfUkVBRE9OTFl9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRUFET05MWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUkVQRUFUKSkgewotCQkJLy8gKHJlcGVhdCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVQRUFULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRUwpKSB7Ci0JCQkvLyAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJTktfVFlQRVMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFVikpIHsKLQkJCS8vIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTElOS19UWVBFUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JFViwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XUykpIHsKLQkJCS8vIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ST1dTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ST1dTUEFOKSkgewotCQkJLy8gKHJvd3NwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ST1dTUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SVUxFUykpIHsKLQkJCS8vIChydWxlcyAlVFJ1bGVzOyAjSU1QTElFRCkKLQkJCS8vICVUUnVsZXM7IGlzIChub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9OT05FLCBBVFRSX1ZBTFVFX0dST1VQUywgQVRUUl9WQUxVRV9ST1dTLCBBVFRSX1ZBTFVFX0NPTFMsIEFUVFJfVkFMVUVfQUxMfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUlVMRVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDQUxFKSkgewotCQkJLy8gKHNjYWxlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TQ0FMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NIRU1FKSkgewotCQkJLy8gKHNjaGVtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NIRU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TRUxFQ1RFRCkpIHsKLQkJCS8vIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1NFTEVDVEVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0VMRUNURUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDT1BFKSkgewotCQkJLy8gKFNDT1BFICVTY29wZTsgI0lNUExJRUQpCi0JCQkvLyAlU2NvcGU7IGlzIChyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9ST1csIEFUVFJfVkFMVUVfQ09MLCBBVFRSX1ZBTFVFX1JPV0dST1VQLCBBVFRSX1ZBTFVFX0NPTEdST1VQfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NPUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCkpIHsKLQkJCS8vIChzY3JvbGxhbW91bnQgTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMQU1PVU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ1JPTExERUxBWSkpIHsKLQkJCS8vIChzY3JvbGxkZWxheSBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TQ1JPTExERUxBWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NST0xMSU5HKSkgewotCQkJLy8gKHNjcm9sbGluZyAoeWVzfG5vfGF1dG8pIGF1dG8pCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1lFUywgQVRUUl9WQUxVRV9OTywgQVRUUl9WQUxVRV9BVVRPfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9BVVRPKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMSU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSEFQRSkpIHsKLQkJCS8vIChzaGFwZSAlU2hhcGU7IHJlY3QpOiAlU2hhcGU7IGlzIChyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9SRUNULCBBVFRSX1ZBTFVFX0NJUkNMRSwgQVRUUl9WQUxVRV9QT0xZLCBBVFRSX1ZBTFVFX0RFRkFVTFR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1JFQ1QpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSEFQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0hPV0NPTlRST0xTKSkgewotCQkJLy8gKHNob3djb250cm9scyAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSE9XQ09OVFJPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NJWkUpKSB7Ci0JCQkvLyAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSVpFRk1UKSkgewotCQkJLy8gKHNpemVmbXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NJWkVGTVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NQQU4pKSB7Ci0JCQkvLyAoc3BhbiBOVU1CRVIgMSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfMSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NQQU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NSQykpIHsKLQkJCS8vIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JCQkvLyBOT1RFOiAic3JjIiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGluIHNldmVyYWwgZWxlbWVudHMuCi0JCQkvLyBUaGUgZGVmaW5pdGlvbiBvZiBJTUcgaXMgZGlmZmVyZW50IGZyb20gb3RoZXJzLgotCQkJLy8gU28sIGl0IHNob3VsZCBiZSBsb2NhbGx5IGRlZmluZWQuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NUQVJUKSkgewotCQkJLy8gKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NUQVJULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVEFOREJZKSkgewotCQkJLy8gKHN0YW5kYnkgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVEFOREJZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVFlMRSkpIHsKLQkJCS8vIChzdHlsZSAlU3R5bGVTaGVldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU1RZTEVfU0hFRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVFlMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1VNTUFSWSkpIHsKLQkJCS8vIChzdW1tYXJ5ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1VNTUFSWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVEFCSU5ERVgpKSB7Ci0JCQkvLyAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEFCSU5ERVgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RBUkdFVCkpIHsKLQkJCS8vICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5GUkFNRV9UQVJHRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UQVJHRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RFWFQpKSB7Ci0JCQkvLyAodGV4dCAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEVYVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVEVYVEZPQ1VTKSkgewotCQkJLy8gKHRleHRmb2N1cyBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEVYVEZPQ1VTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9USVRMRSkpIHsKLQkJCS8vICh0aXRsZSAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RJVExFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9USU1FRk1UKSkgewotCQkJLy8gKHRpbWVmbXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RJTUVGTVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RSVUVTUEVFRCkpIHsKLQkJCS8vICh0cnVlc3BlZWQgKHRydWVzcGVlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfVFJVRVNQRUVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFJVRVNQRUVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UWVBFKSkgewotCQkJLy8gKHR5cGUgJUNvdGVudFR5cGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1VTRU1BUCkpIHsKLQkJCS8vICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9VU0VNQVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTElHTikpIHsKLQkJCS8vICh2YWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfQkFTRUxJTkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTFVFKSkgewotCQkJLy8gKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxVRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkFMVUVUWVBFKSkgewotCQkJLy8gKHZhbHVldHlwZSAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9EQVRBLCBBVFRSX1ZBTFVFX1JFRiwgQVRUUl9WQUxVRV9PQkpFQ1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxVRVRZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBUikpIHsKLQkJCS8vICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkVSU0lPTikpIHsKLQkJCS8vICh2ZXJzaW9uIENEQVRBICNGSVhFRCAnJUhUTUwuVmVyc2lvbjspCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVELCBBVFRSX1ZBTFVFX1ZFUlNJT05fVFJBTlNJVElPTkFMKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkVSU0lPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVklSVFVBTCkpIHsKLQkJCS8vICh2aXJ0dWFsICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVklSVFVBTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkxJTkspKSB7Ci0JCQkvLyAodmxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZMSU5LLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WT0xVTUUpKSB7Ci0JCQkvLyAodm9sdW1lIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WT0xVTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1dJRFRIKSkgewotCQkJLy8gKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WU1BBQ0UpKSB7Ci0JCQkvLyAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLyA8PEQyMDU1MTQKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UT1BNQVJHSU4pKSB7Ci0JCQkvLyAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RPUE1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQk9UVE9NTUFSR0lOKSkgewotCQkJLy8gKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CT1RUT01NQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xFRlRNQVJHSU4pKSB7Ci0JCQkvLyAobGVmdG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MRUZUTUFSR0lOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SSUdIVE1BUkdJTikpIHsKLQkJCS8vIChyaWdodG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SSUdIVE1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQk9SREVSQ09MT1IpKSB7Ci0JCQkvLyAoYm9yZGVyY29sb3IsICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CT1JERVJDT0xPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJLy8gRDIwNTUxNAotCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1bmtub3duIGF0dHJpYnV0ZTsgbWF5YmUgZXJyb3IuCi0JCQkvLyBzaG91bGQgd2Fybi4KLQkJCWF0dHIgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUNBbGlnbjsgYXMgdmFsdWVzLi4gQXQgdGhpcyB0aW1lCi0JICogKDQvMTkvMjAwMSksIGl0IGlzIGlkZW50aWNhbCB0byAlTEFsaWduOy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JDYXB0aW9uKCkgewotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUlBbGlnbjsgYXMgdmFsdWVzLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JJbWFnZSgpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxpZ24gYXR0cmlidXRlIHdoaWNoIGhhcyAlTEFsaWduOyBhcyB2YWx1ZXMuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvckxlZ2VuZCgpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gZm9yIDxjb2RlPmFsaWduPC9jb2RlPiBpbiBzZXZlcmFsCi0JICogZWxlbWVudHMsIGxpa2UgPGNvZGU+UDwvY29kZT4sIDxjb2RlPkRJVjwvY29kZT4uIFRoZSB2YWx1ZXMgYXJlCi0JICogZGlmZmVyZW50IGZyb20gYXR0cmlidXRlcyB0aG9zZSBoYXZlIHRoZSBzYW1lIG5hbWUgaW4gb3RoZXIgZWxlbWVudHMgKDxjb2RlPklNRzwvY29kZT4KLQkgKiBhbmQgPGNvZGU+VEFCTEU8L2NvZGU+KS4gU28sIGl0IGNhbid0IHRyZWF0IGFzIGdsb2JhbCBhdHRyaWJ1dGVzLgotCSAqIDxzdHJvbmc+Tk9URTogVGhlc2UgYXR0cmlidXRlIGRlY2xhcmF0aW9uIGhhcyBubyBvd25lciBDTURvY3VtZW50Ci0JICogaW5zdGFuY2UuPC9zdHJvbmc+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCkgewotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlczogbGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeQotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9KVVNUSUZZfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWF0dHJzOyBkZWNsYXJhdGlvbnMuICVhdHRyczsgY29uc2lzdHMgb2YgJWNvcmVhdHRyczssICVpMThuLCBhbmQKLQkgKiAlZXZlbnRzOy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRBdHRycyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCS8vICVjb3JlYXR0cnM7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChDT1JFKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JCS8vICVpMThuOwotCQluYW1lcyA9IEFycmF5cy5hc0xpc3QoSTE4TikuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCQkvLyAlZXZlbnRzOwotCQluYW1lcyA9IEFycmF5cy5hc0xpc3QoRVZFTlRTKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVib2R5Y29sb3JzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Qm9keWNvbG9ycyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChCT0RZQ09MT1JTKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVjZWxsaGFsaWduOyBkZWNsYXJhdGlvbnMuICVjZWxsaGFsaWdoOyBjb25zaXN0cyBvZjogLSAoYWxpZ24KLQkgKiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRCkgLSAoY2hhciAlQ2hhcmFjdGVyOwotCSAqICNJTVBMSUVEKSAtIChjaGFyb2ZmICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqLwotCXB1YmxpYyB2b2lkIGdldENlbGxoYWxpZ24oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQkvLyAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQpIHNob3VsZCBiZSBkZWZpbmVkCi0JCS8vIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQ0VOVEVSLCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX0pVU1RJRlksIEFUVFJfVkFMVUVfQ0hBUn07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KENFTExIQUxJR04pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWNlbGx2YWxpZ247IGRlY2xhcmF0aW9ucy4gJWNlbGxoYWxpZ2g7IGlzOiAtICh2YWxpZ24KLQkgKiAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEKQotCSAqLwotCXB1YmxpYyB2b2lkIGdldENlbGx2YWxpZ24oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjID0gZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxJR04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMSUdOLCBkZWMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlY29yZWF0dHJzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Q29yZShDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChDT1JFKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZ2xvYmFsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlDTU5vZGUgY21ub2RlID0gZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0KLQkJSFRNTEF0dHJEZWNsSW1wbCBkZWMgPSBjcmVhdGUoYXR0ck5hbWUpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlwdXROYW1lZEl0ZW0oYXR0ck5hbWUsIGRlYyk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVjbGFyYXRpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQgYnkgbmFtZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWVzCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucywgSXRlcmF0b3IgbmFtZXMpIHsKLQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGRlYyA9IGdldERlY2xhcmF0aW9uKGF0dHJOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0ICVldmVudHM7IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRFdmVudHMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoRVZFTlRTKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVpMThuOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0STE4bihDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChJMThOKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzdjODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci0KLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNQ29udGVudCBmb3IgSFRNTCBDTS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUNvbnRlbnQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CT1VOREVEID0gLTE7Ci0JLyoqICAtMTogaXQncyBVTkJPVU5ERUQuICovCi0JcHJpdmF0ZSBpbnQgbWF4T2NjdXIgPSBVTkJPVU5ERUQ7Ci0JLyoqICAwOiBpdCdzIE9QVElPTkFMLCAxLCBpdCdzIFJFUVVJUkVELiAqLwotCXByaXZhdGUgaW50IG1pbk9jY3VyID0gMDsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IGNvbnN0dXJjdG9yLgotCSAqIFVzZSB0aGlzIG9uZSBmb3IgdXN1YWwgY2FzZXMuPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnRJbXBsKFN0cmluZyBuYW1lLCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0JCXN1cGVyKG5hbWUpOwotCQltaW5PY2N1ciA9IG1pbjsKLQkJbWF4T2NjdXIgPSBtYXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gbWF4T2NjdXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gbWluT2NjdXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhYjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICovCi1jbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQotCXByaXZhdGUgaW50IG9wZXJhdG9yID0gQ01Hcm91cC5TRVFVRU5DRTsKLQlwcml2YXRlIENNTm9kZUxpc3RJbXBsIGNoaWxkcmVuID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNR3JvdXBJbXBsKGludCBvcCwgaW50IG1pbk9jY3VyLCBpbnQgbWF4T2NjdXIpIHsKLQkJc3VwZXIobnVsbCwgbWluT2NjdXIsIG1heE9jY3VyKTsKLQkJc3dpdGNoIChvcCkgewotCQkJY2FzZSBDTUdyb3VwLkFMTCA6Ci0JCQljYXNlIENNR3JvdXAuQ0hPSUNFIDoKLQkJCWNhc2UgQ01Hcm91cC5TRVFVRU5DRSA6Ci0JCQkJb3BlcmF0b3IgPSBvcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgYXBwZW5kQ2hpbGQoQ01Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoaWxkcmVuLmFwcGVuZE5vZGUoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0Ci0JICovCi0JcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuR1JPVVA7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjZTFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW50ZWQgdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICogSWYgc29tZW9uZSB3YW50cyB0byB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uCi0gKiB0byB0aGUgZmFjdCB0aGF0IHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuICBUaGF0IGlzLCB0aGlzCi0gKiBjbGFzcyBkb2VzIG5vdCBkaXN0aW5ndWlzaCAibmFtZSIsICJOQU1FIiwgYW5kICJOYW1lIiBhcyBhIGtleSBuYW1lLgotICovCi1jbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSBpdGVtcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCQlpdGVtcyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVua25vd24ga2V5cy4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKCFpdGVtcy5jb250YWluc0tleShjb29rZWROYW1lKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgaXRlbXMuZ2V0KGNvb2tlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKC0taW5kZXggPCAwKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gaXRlbXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmF3Rm9ybSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhd0Zvcm0pIHsKLQkJcmV0dXJuIHJhd0Zvcm0udG9VcHBlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaXRlbSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBwdXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUsIENNTm9kZSBpdGVtKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmIChpdGVtcy5jb250YWluc0tleShjb29rZWROYW1lKSkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSByZWdpc3RlcmVkLgotCQlpdGVtcy5wdXQoY29va2VkTmFtZSwgaXRlbSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGY0YzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ01OYW1lc3BhY2UgaW1wbGVtZW50YXRpb24uCi0gKi8KLWNsYXNzIENNTmFtZXNwYWNlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTU5hbWVzcGFjZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotCS8qKgotCSAqIENNTmFtZXNwYWNlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZUltcGwoU3RyaW5nIHVyaSwgU3RyaW5nIHBmeCkgewotCQlzdXBlcih1cmkpOwotCQlwcmVmaXggPSBwZng7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcmVmaXggbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0VVJJIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzZDc1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUltcGwoU3RyaW5nIG5tKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWUgPSBubTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGNkYjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0vKioKLSAqIEFuYWxvZyBvZiBkb20uTm9kZUxpc3QgZm9yIENNLgotICogU28sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8KLSAqIE5vZGVMaXN0SW1wbDxicj4KLSAqLwotY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IHsKLQotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBub2RlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJbm9kZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gbm9kZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgYXBwZW5kTm9kZShDTU5vZGUgbm9kZSkgewotCQlub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIG5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWI2NjUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0gKiBpbiBYTUwgU2NoZW1hLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCXByb3RlY3RlZCBDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb21wbGV4VHlwZURlZmluaXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29tcGxleFR5cGVEZWZpbml0aW9uKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbGxlY3Rpb24gPSBlbGVtZW50Q29sbGVjdGlvbjsKLQkJY3JlYXRlQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhY3R1YWwgY29udGVudCBtb2RlbC4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYW5kIG9ubHkgb25jZSBpbiB0aGUgY29uc3RydWN0b3IuPGJyPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwCi0JICovCi0JcHVibGljIENNR3JvdXAgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JLyogTk9URTogRG8gd2UgbmVlZCBMT0dJQ0FMIHR5cGU/Ci0JICogLS0gMy83LzIwMDEKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCBoaW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldFByaW1hcnlDYW5kaWRhdGUoKSB7Ci0JCWlmIChwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0ocHJpbWFyeUNhbmRpZGF0ZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlTmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZmRlZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogRmFjdG9yeSBvZiBDb21wbGV4VHlwZURlZmluaXRpb24uCi0gKi8KLWZpbmFsIGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGRlZmluaXRpb25zID0gbnVsbDsKLQkvLyBjb25zdGFudHMgZm9yIGNvbXBsZXggdHlwZSBuYW1lCi0JLyoqIGZvciBBRERSRVNTLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0FERFJFU1MgPSAiQ1RZUEVfQUREUkVTUyI7Ly8kTk9OLU5MUy0xJAotCS8qKiBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DREFUQSA9ICJDVFlQRV9DREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBjb2wgZ3JvdXAgY29udGVudC4gQ09MKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0NPTFVNTl9HUk9VUCA9ICJDVFlQRV9DT0xVTU5fR1JPVVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIERMLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0RFRklOSVRJT05fTElTVCA9ICJDVFlQRV9ERUZJTklUSU9OX0xJU1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEVNQkVELiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0VNQkVEID0gIkNUWVBFX0VNQkVEIjsvLyROT04tTkxTLTEkCi0JLyoqIGVtcHR5IGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaG91bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTVBUWSA9ICJDVFlQRV9FTVBUWSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRklFTERTRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRklFTERTRVQgPSAiQ1RZUEVfRklFTERTRVQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZSQU1FU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZSQU1FU0VUID0gIkNUWVBFX0ZSQU1FU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZsb3cgY29udGVudC4gKCVmbG93OykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRkxPV19DT05UQUlORVIgPSAiQ1RZUEVfRkxPV19DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogaHRtbCBjb250ZW50LiBIRUFELCAoRlJBTUVTRVR8Qk9EWSkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IVE1MID0gIkNUWVBFX0hUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKiogaGVhZCBjb250ZW50LiBUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IRUFEID0gIkNUWVBFX0hFQUQiOy8vJE5PTi1OTFMtMSQKLQkvKiogaW5saW5lIGNvbnRlbnQuICglaW5saW5lOykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiA9ICJDVFlQRV9JTkxJTkVfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGxpc3QgaXRlbSBjb250YWluZXIuIChMSSkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTElfQ09OVEFJTkVSID0gIkNUWVBFX0xJX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgTUFQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX01BUCA9ICJDVFlQRV9NQVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogbm9mcmFtZXMgY29udGVudC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9OT0ZSQU1FU19DT05URU5UID0gIkNUWVBFX05PRlJBTUVTX0NPTlRFTlQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE9QVEdST1VQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX09QVElPTl9DT05UQUlORVIgPSAiQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBwYXJhbSBjb250YWluZXIuIEZvciBPQkpFQ1QvQVBQTEVULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BBUkFNX0NPTlRBSU5FUiA9ICJDVFlQRV9QQVJBTV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogUENEQVRBIGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaHVsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BDREFUQSA9ICJDVFlQRV9QQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIFNFTEVDVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9TRUxFQ1QgPSAiQ1RZUEVfU0VMRUNUIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNvbnRlbnQuIENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVEFCTEUgPSAiQ1RZUEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgY2VsbCBjb250YWllci4gKFRIfFREKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UQ0VMTF9DT05UQUlORVIgPSAiQ1RZUEVfVENFTExfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIHJlY29yZCBjb250YWluZXIuIChUUikrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVFJfQ09OVEFJTkVSID0gIkNUWVBFX1RSX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJZGVmaW5pdGlvbnMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kIGZvciBDb21wbGV4VHlwZURlZmluaXRpb24uCi0JICogRWFjaCBpbnN0YW5jZSBjcmVhdGVkIGluIHRoaXMgbWV0aG9kIG11c3QgYmUgcmVnaXN0ZXJlZCBpbnRvCi0JICogdGhlIG1hcCB3aXRoIGl0cyBuYW1lLgotCSAqIEBwYXJhbSBkZWZpbml0aW9uTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbk5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCWlmIChkZWZpbml0aW9ucy5jb250YWluc0tleShkZWZpbml0aW9uTmFtZSkpIHsKLQkJCXJldHVybiAoQ29tcGxleFR5cGVEZWZpbml0aW9uKSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0JCWlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9BRERSRVNTKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQWRkcmVzcyhlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9DT0xVTU5fR1JPVVApIHsKLQkJCWRlZiA9IG5ldyBDdGRDb2x1bW5Hcm91cChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERUZJTklUSU9OX0xJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9FTUJFRCkgewotCQkJZGVmID0gbmV3IEN0ZEVtYmVkKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZJRUxEU0VUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRmllbGRzZXQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRkxPV19DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRGbG93Q29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZSQU1FU0VUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRnJhbWVzZXQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRCkgewotCQkJZGVmID0gbmV3IEN0ZEhlYWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSFRNTCkgewotCQkJZGVmID0gbmV3IEN0ZEh0bWwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZElubGluZUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9MSV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRMaUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9NQVApIHsKLQkJCWRlZiA9IG5ldyBDdGRNYXAoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCkgewotCQkJZGVmID0gbmV3IEN0ZE5vZnJhbWVzQ29udGVudChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9PUFRJT05fQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkT3B0aW9uQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1BBUkFNX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZFBhcmFtQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1NFTEVDVCkgewotCQkJZGVmID0gbmV3IEN0ZFNlbGVjdChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UQUJMRSkgewotCQkJZGVmID0gbmV3IEN0ZFRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1RDRUxMX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZFRhYmxlQ2VsbENvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UUl9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRUckNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIHsKLQkJCWRlZiA9IG51bGw7Ci0JCX0KLQkJaWYgKGRlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlLgotCQlkZWZpbml0aW9ucy5wdXQoZGVmaW5pdGlvbk5hbWUsIGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogRm9yIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZThkZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBDdGRBZGRyZXNzIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRBZGRyZXNzKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWlubGluZSkKLQkJQ01Hcm91cEltcGwgaW5saW5lcyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChpbmxpbmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGlubGluZXMpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGlubGluZXMpOwotCQkvLyBQCi0JCUNNTm9kZSBwID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlApOwotCQlpZiAocCAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChwKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqIEJlY2F1c2UgJWlubGluZTsgY29udGFpbnMgI1BDREFUQSwgdGhlIHR5cGUgaXMgTUlYRUQuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQ29sdW1uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQ29sdW1uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxNzcwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENPTCBncm91cC4KLSAqIChDT0wpKgotICovCi1maW5hbCBjbGFzcyBDdGRDb2x1bW5Hcm91cCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkQ29sdW1uR3JvdXAoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIChDT0wpKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBDT0wKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKENPTCkqCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DT0xVTU5fR1JPVVA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0YTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBETC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRGwgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZERsKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQ7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBEVAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBERAotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRW1iZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRW1iZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlOTE4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEVtYmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBFTUJFRC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRW1iZWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEVtYmVkKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9FTUJFRDsKLQl9Ci0KLQkvKioKLQkgKiAoTk9FTUJFRCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkvLyBOT0VNQkVECi0JCUNNTm9kZSBub2VtYmVkID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQpOwotCQlpZiAobm9lbWJlZCAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChub2VtYmVkKTsKLQl9Ci0KLQkvKioKLQkgKiAoTk9FTUJFRCkuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1CRUQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmllbGRzZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmllbGRzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5ZWQwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBGSUVMRFNFVC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRmllbGRzZXQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEZpZWxkc2V0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5EOwotCX0KLQotCS8qKgotCSAqICgjUENEQVRBLCBMRUdFTkQsICglZmxvdzspKikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAsICwgKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkvLyAjUENEQVRBCi0JCS8vIC4uLj8/Ci0KLQkJLy8gTEVHRU5ECi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5EKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyAoJWZsb3c7KSoKLQkJQ01Hcm91cEltcGwgZmxvd3MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKGZsb3dzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0RmxvdyhmbG93cyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZmxvd3MpOwotCX0KLQotCS8qKgotCSAqICgjUENEQVRBLCBMRUdFTkQsICglZmxvdzspKikKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRklFTERTRVQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzEzOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciBjb250YWluZXJzIG9mIDxjb2RlPiVmbG93OzwvY29kZT4uCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZsb3dDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEZsb3dDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglZmxvdzspKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbGxlY3Rpb24uZ2V0Rmxvdyhjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRnJhbWVzZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRnJhbWVzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkMTA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZyYW1lc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBGUkFNRVNFVC4KLSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KQotICovCi1maW5hbCBjbGFzcyBDdGRGcmFtZXNldCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkRnJhbWVzZXQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRTsKLQl9Ci0KLQkvKioKLQkgKiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIE5PRlJBTUVTPykuCi0JICogLS0+ICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgKE5PRlJBTUVTKT8pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggJiApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5BTEwsIDEsIDEpOwotCi0JCS8vICggfCApKwotCQlDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0KLQkJLy8gRlJBTUVTRVQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRVNFVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vIEZSQU1FCi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKCApPwotCQlncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCi0JCS8vIE5PRlJBTUVTCi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUyk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GUkFNRVNFVDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEhlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2ODE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEhlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGhlYWQgY29udGVudC4KLSAqIENvbnRlbnQgTW9kZWw6IChUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEhlYWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEhlYWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgSEVBRC4KLQkgKiBUbyBhdm9pZCB1c2luZyBpbmNsdXNpb24sIHRoZSBjb250ZW50IG1vZGVsIGNvbWVzIGZyb20gdGhlIFhIVE1MIDEuMC4KLQkgKgotCSAqICglaGVhZC5taXNjOywgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8IChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSkKLQkgKiBBbmQgJWhlYWQubWlzYzsgaXM6Ci0JICogKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0fGlzaW5kZXgpKgotCSAqCi0JICogMDogKCVoZWFkLm1pc2MsIEEpCi0JICogQTogKEIgfCBDKQotCSAqIEI6ICh0aXRsZSwgJWhlYWQubWlzYzssIEQpCi0JICogQzogKGJhc2UsICVoZWFkLm1pc2M7LCBFKQotCSAqIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JICogRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gQXQgMXN0LCBjcmVhdGUgJWhlYWQubWlzYzsgY29udGVudC4KLQkJLy8gJWhlYWQubWlzYzsKLQkJLy8gICAoIHwgKSoKLQkJQ01Hcm91cEltcGwgbWlzYyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAobWlzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVh9OwotCQljb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhtaXNjLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJLy8gMm5kLCBnZXQgYSB0aXRsZQotCQlDTU5vZGUgdGl0bGUgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpOwotCQkvLyAzcmQsIGdldCBhIGJhc2UKLQkJQ01Ob2RlIGJhc2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSk7Ci0JCWlmICh0aXRsZSA9PSBudWxsIHx8IGJhc2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUb3AgbGV2ZWwgY29udGVudCBpcyBhIHNlcXVlbmNlIG9mICVoZWFkLm1pc2M7IGFuZCBBLgotCQkvLyAwOiAoJWhlYWQubWlzYzssIEEpCi0JCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsKLQkJY29udGVudC5hcHBlbmRDaGlsZChtaXNjKTsKLQkJLy8gICBjcmVhdGUgQSBhbmQgYXBwZW5kIGl0IHRvIHRoZSB0b3AgbGV2ZWwuCi0JCXsKLQkJCS8vIEEgaXMgYSBjaG9pY2Ugb2YgQiBhbmQgQy4KLQkJCS8vIEE6IChCIHwgQykKLQkJCS8vICAgY3JlYXRlIGEgY2hvaWNlCi0JCQlDTUdyb3VwSW1wbCBnQSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCQlpZiAoZ0EgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyAgIGFwcGVuZCBBIHRvIHRoZSB0b3AgbGV2ZWwuCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGdBKTsKLQotCQkJLy8gY3JlYXRlIEIgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQiBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlLCAlaGVhZC5taXNjOywgYW5kIEQuCi0JCQkJLy8gQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0IgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdCID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBCIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0IpOwotCi0JCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gQgotCQkJCWdCLmFwcGVuZENoaWxkKHRpdGxlKTsKLQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJLy8gICBjcmVhdGUgRCBhbmQgYXBwZW5kIGl0IHRvIEIuCi0JCQkJewotCQkJCQkvLyBEIGlzIGEgc2VxdWVuY2Ugb2YgYmFzZSwgJWhlYWQubWlzYzsuCi0JCQkJCS8vIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQkJQ01Hcm91cEltcGwgZ0QgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCQkJCWlmIChnRCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkvLyAgIGFwcGVuZCBEIHRvIEIuCi0JCQkJCWdCLmFwcGVuZENoaWxkKGdEKTsKLQotCQkJCQkvLyAgIGFwcGVuZCBiYXNlIHRvIEQKLQkJCQkJZ0QuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEQuCi0JCQkJCWdELmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNyZWF0ZSBDIGFuZCBhcHBlbmQgaXQgdG8gQQotCQkJewotCQkJCS8vIEMgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOywgYW5kIEUKLQkJCQkvLyBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCUNNR3JvdXBJbXBsIGdDID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCWlmIChnQyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gICBhcHBlbmQgQyB0byBBLgotCQkJCWdBLmFwcGVuZENoaWxkKGdDKTsKLQotCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKGJhc2UpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEMKLQkJCQlnQy5hcHBlbmRDaGlsZChtaXNjKTsKLQotCQkJCS8vICAgY3JlYXRlIEUgYW5kIGFwcGVuZCBpdCB0byBDLgotCQkJCXsKLQkJCQkJLy8gRSBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlIGFuZCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQkJaWYgKGdFID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEUgdG8gQy4KLQkJCQkJZ0MuYXBwZW5kQ2hpbGQoZ0UpOwotCi0JCQkJCS8vICAgYXBwZW5kIHRpdGxlIHRvIEUKLQkJCQkJZ0UuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBFLgotCQkJCQlnRS5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSHRtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NlYWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSHRtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciA8Y29kZT5IVE1MPC9jb2RlPi48YnI+Ci0gKiBDb250ZW50IE1vZGVsOgotICogSEVBRCwgKEZSQU1FU0VUfEJPRFkpPGJyPgotICovCi1maW5hbCBjbGFzcyBDdGRIdG1sIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIdG1sKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQl9Ci0KLQkvKioKLQkgKiAoJWh0bWwuY29udGVudDspLgotCSAqICVodG1sLmNvbnRlbnQ7IGlzIEhFQUQsIChGUkFNRVNFVCB8IEJPRFkpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBIRUFECi0JCUNNTm9kZSBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCQkvLyAoIHwgKQotCQlDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCi0JCS8vIEZSQU1FU0VULCBCT0RZCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRVNFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFl9OwotCQljb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gc2luY2UgQk9EWSBzdGFydCBhbmQgZW5kIGFyZSBvbWlzc2FibGUKLQkJLy8gYWRkaW5nIHZhbGlkIGNoaWxkcmVuIG9mIEJPRFkgaGVyZSB1bmRlciBIVE1MCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzM0MgotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BUCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CRE8pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT1NDUklQVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDYpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRUZPTlQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlMpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgzKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5RKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFJJS0UpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUJCUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQklHKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BQ1JPTllNKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPTlQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuS0JEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQU1QKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlMpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1KTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVVApOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRGTik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlZBUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCQllZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFQUExFVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNNQUxMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DSVRFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPREUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNQQU4pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVQik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU0pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1MpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUUk9ORyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1MmM4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgKCVpbmxpbmU7KSouCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZElubGluZUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkSW5saW5lQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWlubGluZSkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGNvbnRlbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9JTkxJTkVfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZExpQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZExpQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTY4YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBMaXN0IGl0ZW0gY29udGFpbmVyLgotICogKExJKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkTGlDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbkNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTGlDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSTsKLQl9Ci0KLQkvKioKLQkgKiAoTEkpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKExJKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSBsaSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCWlmIChsaSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChsaSk7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjliNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIE1BUC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkTWFwIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRNYXAoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUkVBOwotCX0KLQotCS8qKgotCSAqICgoJWJsb2NrOykgfCBBUkVBKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vICglYmxvY2s7KQotCQlDTUdyb3VwSW1wbCBibG9ja3MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoYmxvY2tzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0QmxvY2soYmxvY2tzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChibG9ja3MpOwotCQkvLyBBUkVBCi0JCUNNTm9kZSBhcmVhID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFSRUEpOwotCQlpZiAoYXJlYSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChhcmVhKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVibG9jazspIHwgQVJFQSkrLgotCSAqIEJlY2F1c2UgJWJsb2NrOyBjb25zaXN0cyBvZiBlbGVtZW50cyBvbmx5LCB0aGUgdHlwZSBpcyBFTEVNRU5ULgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX01BUDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTm9mcmFtZXNDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWMwOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIE5PRlJBTUVTLgotICovCi1maW5hbCBjbGFzcyBDdGROb2ZyYW1lc0NvbnRlbnQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZE5vZnJhbWVzQ29udGVudChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JfQotCi0JLyoqCi0JICogKEJPRFkpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJLy8gQk9EWQotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFkpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKEJPRFkpCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRPcHRpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NzJmMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRPcHRpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogT1BUSU9OIGNvbnRhaW5lci4KLSAqIChPUFRJT04pKwotICovCi1maW5hbCBjbGFzcyBDdGRPcHRpb25Db250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZE9wdGlvbkNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkUGFyYW1Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkUGFyYW1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyYWZiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFBhcmFtQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIFBBUkFNIGNvbnRhaW5lci4gIEZvciBPQkpFQ1QgYW5kIEFQUExFVC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkUGFyYW1Db250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFBhcmFtQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoUEFSQU0gfCAlZmxvdzspKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gUEFSQU0KLQkJQ01Ob2RlIHBhcmFtID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsKLQkJaWYgKHBhcmFtICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHBhcmFtKTsKLQkJLy8gJWZsb3c7Ci0JCUNNR3JvdXBJbXBsIGZsb3dzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGZsb3dzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGZsb3dzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChmbG93cyk7Ci0JfQotCi0JLyoqCi0JICogKFBBUkFNIHwgJWZsb3c7KSouCi0JICogQmVjYXVzZSAlZmxvdzsgY29udGFpbnMgI1BDREFUQSwgdGhlIHR5cGUgaXMgTUlYRUQuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BBUkFNX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkU2VsZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjZjMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkU2VsZWN0IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRTZWxlY3QoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVEdST1VQCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUR1JPVVApOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vIE9QVElPTgotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU2YzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBUQUJMRS4KLSAqIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKywgVFIrKQotICovCi1maW5hbCBjbGFzcyBDdGRUYWJsZSBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVGFibGUoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWTsKLQl9Ci0KLQkvKioKLQkgKiAoQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSspCi0JICogLS0+ICgoQ0FQVElPTik/LCAoKENPTCkqIHwgKENPTEdST1VQKSopLCAoVEhFQUQpPywgKFRGT09UKT8sIChUQk9EWSkrLCAoVFIpKykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAsICwgLCAsKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCi0JCS8vIChDQVBUSU9OKT8KLQkJLy8gICAgICggKT8KLQkJQ01Hcm91cEltcGwgd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJLy8gICAgIENBUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vICgoQ09MKSogfCAoQ09MR1JPVVApKikKLQkJLy8gICAgICggfCApCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCQkvLyAgICAgICAgIChDT0wpKgotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ3JvdXAuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vICAgICAgICAgKENPTEdST1VQKSoKLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdyb3VwLmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVApOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKFRIRUFEKT8KLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vIChURk9PVCk/Ci0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoVEJPRFkpKwotCQkvLyBUQk9EWSBoYXMgb3B0aW9uYWwgc3RhcnQgYW5kIGVuZCB0YWdzCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MTAxCi0JCS8vIFRCT0RZIHN0YXJ0IGFuZCBlbmQgdGFnIGFyZSBvcHRpb25hbCwgc28gVFIgc2hvdWxkIGJlIGFsbG93ZWQgaGVyZQotCQkvLyAoVFIpKwotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVEFCTEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGVDZWxsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZGRiYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogVGFibGUgY2VsbCBjb250YWluZXIuCi0gKiAoVEggfCBURCkrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFRhYmxlQ2VsbENvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVGFibGVDZWxsQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEQ7Ci0JfQotCi0JLyoqCi0JICogKFRIIHwgVEQpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIFRICi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEgpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vIFRECi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoVEggfCBURCkrCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQ0VMTF9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVHJDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVHJDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZGZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIFRhYmxlIHJlY29yZCBjb250YWluZXIuCi0gKiAoVFIpKwotICovCi1maW5hbCBjbGFzcyBDdGRUckNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVHJDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUjsKLQl9Ci0KLQkvKioKLQkgKiAoVFIpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKFRSKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSB0ciA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUik7Ci0JCWlmICh0ciAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZCh0cik7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RSX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EZWNsQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EZWNsQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2RkZWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRGVjbENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIER1YWxNYXAgewotCQlwdWJsaWMgRHVhbE1hcCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRHVhbE1hcChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiB0YWJsZS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKGludCBrZXkpIHsKLQkJCWlmICghaXNWYWxpZEluZGV4KGtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gdGFibGVba2V5XTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJSW50ZWdlciBrZXlPYmogPSAoSW50ZWdlcikgbWFwLmdldCh2YWx1ZSk7Ci0JCQlpZiAoa2V5T2JqID09IG51bGwpCi0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQlyZXR1cm4ga2V5T2JqLmludFZhbHVlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCWlmIChvYmplY3RzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdGFibGUgPSBvYmplY3RzOwotCQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGtleSA9IDA7IGtleSA8IG9iamVjdHMubGVuZ3RoOyBrZXkrKykgewotCQkJCU9iamVjdCB2YWx1ZSA9IHRhYmxlW2tleV07Ci0JCQkJbWFwLnB1dCh2YWx1ZSwgbmV3IEludGVnZXIoa2V5KSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIHRhYmxlID0gbnVsbDsKLQkJcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJbmRleChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGFibGUubGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvbGVyYW50U3RyaW5nRHVhbE1hcCBleHRlbmRzIER1YWxNYXAgewotCQlwdWJsaWMgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvYmplY3RzW2ldID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZXNbaV0pOwotCQkJfQotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCXJldHVybiBzdXBlci5nZXRLZXkobWFrZUNhbm9uaWNhbEZvcm0obmFtZSkpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3KSB7Ci0JCQlyZXR1cm4gcmF3LnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIERlY2xJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHVibGljIERlY2xJdGVyYXRvcigpIHsKLQkJCW1heGlkID0gZkRlY2xzLmxlbmd0aCAtIDE7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGlkIDwgbWF4aWQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlpZiAoIWhhc05leHQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpdGVtKCsraWQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgeyAvKiBub3RoaW5nIHNob3VsZCBiZSBkb25lLiAqLwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgaWQgPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbWF4aWQgPSAtMTsKLQl9Ci0KLQlDTU5vZGVbXSBmRGVjbHMgPSBudWxsOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBTVFJJQ1RfQ0FTRSA9IGZhbHNlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBUT0xFUkFOVF9DQVNFID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBJRF9VTktOT1dOID0gLTE7Ci0JcHJpdmF0ZSBEdWFsTWFwIGZNYXAgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIERlY2xDb2xsZWN0aW9uKFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIHRvbGVyYW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZEZWNscyA9IG5ldyBDTU5vZGVbbmFtZXMubGVuZ3RoXTsKLQkJaWYgKHRvbGVyYW50KSB7Ci0JCQlmTWFwID0gbmV3IFRvbGVyYW50U3RyaW5nRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTWFwID0gbmV3IER1YWxNYXAobmFtZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RGVjbGFyYXRpb25zKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCUNNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlDTU5vZGUgbm9kZSA9IGdldE5hbWVkSXRlbShuYW1lKTsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQltYXAucHV0TmFtZWRJdGVtKG5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWVzIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGdldERlY2xhcmF0aW9ucyhDTUdyb3VwSW1wbCBncm91cCwgSXRlcmF0b3IgbmFtZXMpIHsKLQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7Ci0JCQlDTU5vZGUgZGVjID0gZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCWdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYXAgbmFtZSB0byBpZC4KLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldElEKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmTWFwLmdldEtleShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZEZWNscy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZShpbnQgaWQpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGZNYXAuZ2V0VmFsdWUoaWQpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlpbnQgaWQgPSBnZXRJRChuYW1lKTsKLQkJaWYgKCFpc1ZhbGlkSUQoaWQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBpdGVtKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gaWQgaW50Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJRChpbnQgaWQpIHsKLQkJcmV0dXJuIGlkID49IDAgJiYgaWQgPCBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAoIWlzVmFsaWRJRChpbmRleCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ01Ob2RlIGRlY2wgPSBmRGVjbHNbaW5kZXhdOwotCQlpZiAoZGVjbCAhPSBudWxsKQotCQkJcmV0dXJuIGRlY2w7IC8vIGFscmVhZHkgZXhpc3QuCi0KLQkJZGVjbCA9IGNyZWF0ZShnZXROYW1lKGluZGV4KSk7Ci0JCWZEZWNsc1tpbmRleF0gPSBkZWNsOwotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRGVjbEl0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYmQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JLy8gRWxlbWVudCBJRHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUJCUiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDUk9OWU0gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRERSRVNTID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVBQTEVUID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJFQSA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0IgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CQVNFID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkFTRUZPTlQgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRE8gPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CSUcgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkxJTksgPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkxPQ0tRVU9URSA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JSID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVVFRPTiA9IDE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQVBUSU9OID0gMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlRFUiA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSVRFID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPREUgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MID0gMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTEdST1VQID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0REID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERk4gPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJViA9IDI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ETCA9IDI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EVCA9IDI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTSA9IDI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTUJFRCA9IDMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GSUVMRFNFVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT05UID0gMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUk0gPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBTUUgPSAzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBTUVTRVQgPSAzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDEgPSAzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDIgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDMgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDQgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDUgPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDYgPSA0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBRCA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IUiA9IDQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IVE1MID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0kgPSA0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUZSQU1FID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNRyA9IDQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlBVVCA9IDQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlMgPSA0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVNJTkRFWCA9IDUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQkQgPSA1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFCRUwgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEVHRU5EID0gNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xJID0gNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xJTksgPSA1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFQID0gNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01FTlUgPSA1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVUQSA9IDU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT0VNQkVEID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PRlJBTUVTID0gNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PU0NSSVBUID0gNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09CSkVDVCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTCA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUFRHUk9VUCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUFRJT04gPSA2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUCA9IDY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUkUgPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUSA9IDY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TID0gNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NBTVAgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NSSVBUID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TTUFMTCA9IDc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFOID0gNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NUUklLRSA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVFJPTkcgPSA3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RZTEUgPSA3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQUJMRSA9IDgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQk9EWSA9IDgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URVhUQVJFQSA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URk9PVCA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USCA9IDg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVBRCA9IDg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USVRMRSA9IDg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUiA9IDg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UVCA9IDkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VID0gOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VMID0gOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1ZBUiA9IDkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQVJRVUVFID0gOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9DT05GSUcgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0VDSE8gPSA5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0VYRUMgPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZTSVpFID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9GTEFTVE1PRCA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfSU5DTFVERSA9IDEwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX1BSSU5URU5WID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfU0VUID0gMTAyOwotCQkvLyA8PEQyMDU1MTMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkdTT1VORCA9IDEwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9CUiA9IDEwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfV0JSID0gMTA1OwotCi0JCS8vIEQyMDU1MTMKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8qKiAlZm9udHN0eWxlOy4gVFQgfCBJIHwgQiB8IFUgfCBTIHwgU1RSSUtFIHwgQklHIHwgU01BTEwgfCBCTElOSyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZPTlRTVFlMRSA9IHtUVCwgSSwgQiwgVSwgUywgU1RSSUtFLCBCSUcsIFNNQUxMLCBCTElOS307Ci0JLyoqICVmb3JtY3RsOy4gSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9STUNUTCA9IHtJTlBVVCwgU0VMRUNULCBURVhUQVJFQSwgTEFCRUwsIEJVVFRPTn07Ci0JLyoqICVwaHJhc2U7LgotCSAqIEVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8IFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIHwgQUJCUiB8IEFDUk9OWU0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSFJBU0UgPSB7RU0sIFNUUk9ORywgREZOLCBDT0RFLCBTQU1QLCBLQkQsIFZBUiwgQ0lURSwgQUJCUiwgQUNST05ZTX07Ci0JLyoqICVzcGVjaWFsOy4KLQkgKiBBIHwgSU1HIHwgQVBQTEVUIHwgT0JKRUNUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfAotCSAqIE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIHwgSUZSQU1FIHwgRU1CRUQgfCBNQVJRVUVFIHwKLQkgKiBEMlcgfCBTVUJNSVQKLQkgKiBXQlIgfCBOT0JSIHwgQkdTT1VORAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNQRUNJQUwgPSB7QSwgSU1HLCBBUFBMRVQsIE9CSkVDVCwgRk9OVCwgQkFTRUZPTlQsIEJSLCBXQlIsIC8vIEQyMDU1MTMKLQkJCQlTQ1JJUFQsIE1BUCwgUSwgU1VCLCBTVVAsIFNQQU4sIEJETywgSUZSQU1FLCBFTUJFRCwgQkdTT1VORCwgLy8gRDIwNTUxMwotCQkJCU1BUlFVRUUsIE5PQlIgLy8gRDIwNTUxMwotCX07Ci0JLyoqICVoZWFkaW5nOy4gSFsxLTZdICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSEVBRElORyA9IHtIMSwgSDIsIEgzLCBINCwgSDUsIEg2fTsKLQkvKiogJWxpc3Q7LiBVTCB8IE9MIHwgRElSIHwgTUVOVSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExJU1QgPSB7VUwsIE9MLCBESVIsIE1FTlV9OwotCS8qKiAlcHJlZm9ybWF0dGVkOy4gUFJFICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJFRk9STUFUVEVEID0ge1BSRX07Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZOYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQlmTmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJZk5hbWVzW0lkcy5JRF9BXSA9IEE7Ci0JCWZOYW1lc1tJZHMuSURfQUJCUl0gPSBBQkJSOwotCQlmTmFtZXNbSWRzLklEX0FDUk9OWU1dID0gQUNST05ZTTsKLQkJZk5hbWVzW0lkcy5JRF9BRERSRVNTXSA9IEFERFJFU1M7Ci0JCWZOYW1lc1tJZHMuSURfQVBQTEVUXSA9IEFQUExFVDsKLQkJZk5hbWVzW0lkcy5JRF9BUkVBXSA9IEFSRUE7Ci0JCWZOYW1lc1tJZHMuSURfQl0gPSBCOwotCQlmTmFtZXNbSWRzLklEX0JBU0VdID0gQkFTRTsKLQkJZk5hbWVzW0lkcy5JRF9CQVNFRk9OVF0gPSBCQVNFRk9OVDsKLQkJZk5hbWVzW0lkcy5JRF9CRE9dID0gQkRPOwotCQlmTmFtZXNbSWRzLklEX0JJR10gPSBCSUc7Ci0JCWZOYW1lc1tJZHMuSURfQkxJTktdID0gQkxJTks7Ci0JCWZOYW1lc1tJZHMuSURfQkxPQ0tRVU9URV0gPSBCTE9DS1FVT1RFOwotCQlmTmFtZXNbSWRzLklEX0JPRFldID0gQk9EWTsKLQkJZk5hbWVzW0lkcy5JRF9CUl0gPSBCUjsKLQkJZk5hbWVzW0lkcy5JRF9CVVRUT05dID0gQlVUVE9OOwotCQlmTmFtZXNbSWRzLklEX0NBUFRJT05dID0gQ0FQVElPTjsKLQkJZk5hbWVzW0lkcy5JRF9DRU5URVJdID0gQ0VOVEVSOwotCQlmTmFtZXNbSWRzLklEX0NJVEVdID0gQ0lURTsKLQkJZk5hbWVzW0lkcy5JRF9DT0RFXSA9IENPREU7Ci0JCWZOYW1lc1tJZHMuSURfQ09MXSA9IENPTDsKLQkJZk5hbWVzW0lkcy5JRF9DT0xHUk9VUF0gPSBDT0xHUk9VUDsKLQkJZk5hbWVzW0lkcy5JRF9ERF0gPSBERDsKLQkJZk5hbWVzW0lkcy5JRF9ERUxdID0gREVMOwotCQlmTmFtZXNbSWRzLklEX0RGTl0gPSBERk47Ci0JCWZOYW1lc1tJZHMuSURfRElSXSA9IERJUjsKLQkJZk5hbWVzW0lkcy5JRF9ESVZdID0gRElWOwotCQlmTmFtZXNbSWRzLklEX0RMXSA9IERMOwotCQlmTmFtZXNbSWRzLklEX0RUXSA9IERUOwotCQlmTmFtZXNbSWRzLklEX0VNXSA9IEVNOwotCQlmTmFtZXNbSWRzLklEX0VNQkVEXSA9IEVNQkVEOwotCQlmTmFtZXNbSWRzLklEX0ZJRUxEU0VUXSA9IEZJRUxEU0VUOwotCQlmTmFtZXNbSWRzLklEX0ZPTlRdID0gRk9OVDsKLQkJZk5hbWVzW0lkcy5JRF9GT1JNXSA9IEZPUk07Ci0JCWZOYW1lc1tJZHMuSURfRlJBTUVdID0gRlJBTUU7Ci0JCWZOYW1lc1tJZHMuSURfRlJBTUVTRVRdID0gRlJBTUVTRVQ7Ci0JCWZOYW1lc1tJZHMuSURfSDFdID0gSDE7Ci0JCWZOYW1lc1tJZHMuSURfSDJdID0gSDI7Ci0JCWZOYW1lc1tJZHMuSURfSDNdID0gSDM7Ci0JCWZOYW1lc1tJZHMuSURfSDRdID0gSDQ7Ci0JCWZOYW1lc1tJZHMuSURfSDVdID0gSDU7Ci0JCWZOYW1lc1tJZHMuSURfSDZdID0gSDY7Ci0JCWZOYW1lc1tJZHMuSURfSEVBRF0gPSBIRUFEOwotCQlmTmFtZXNbSWRzLklEX0hSXSA9IEhSOwotCQlmTmFtZXNbSWRzLklEX0hUTUxdID0gSFRNTDsKLQkJZk5hbWVzW0lkcy5JRF9JXSA9IEk7Ci0JCWZOYW1lc1tJZHMuSURfSUZSQU1FXSA9IElGUkFNRTsKLQkJZk5hbWVzW0lkcy5JRF9JTUddID0gSU1HOwotCQlmTmFtZXNbSWRzLklEX0lOUFVUXSA9IElOUFVUOwotCQlmTmFtZXNbSWRzLklEX0lOU10gPSBJTlM7Ci0JCWZOYW1lc1tJZHMuSURfSVNJTkRFWF0gPSBJU0lOREVYOwotCQlmTmFtZXNbSWRzLklEX0tCRF0gPSBLQkQ7Ci0JCWZOYW1lc1tJZHMuSURfTEFCRUxdID0gTEFCRUw7Ci0JCWZOYW1lc1tJZHMuSURfTEVHRU5EXSA9IExFR0VORDsKLQkJZk5hbWVzW0lkcy5JRF9MSV0gPSBMSTsKLQkJZk5hbWVzW0lkcy5JRF9MSU5LXSA9IExJTks7Ci0JCWZOYW1lc1tJZHMuSURfTUFQXSA9IE1BUDsKLQkJZk5hbWVzW0lkcy5JRF9NRU5VXSA9IE1FTlU7Ci0JCWZOYW1lc1tJZHMuSURfTUVUQV0gPSBNRVRBOwotCQlmTmFtZXNbSWRzLklEX05PRU1CRURdID0gTk9FTUJFRDsKLQkJZk5hbWVzW0lkcy5JRF9OT0ZSQU1FU10gPSBOT0ZSQU1FUzsKLQkJZk5hbWVzW0lkcy5JRF9OT1NDUklQVF0gPSBOT1NDUklQVDsKLQkJZk5hbWVzW0lkcy5JRF9PQkpFQ1RdID0gT0JKRUNUOwotCQlmTmFtZXNbSWRzLklEX09MXSA9IE9MOwotCQlmTmFtZXNbSWRzLklEX09QVEdST1VQXSA9IE9QVEdST1VQOwotCQlmTmFtZXNbSWRzLklEX09QVElPTl0gPSBPUFRJT047Ci0JCWZOYW1lc1tJZHMuSURfUF0gPSBQOwotCQlmTmFtZXNbSWRzLklEX1BBUkFNXSA9IFBBUkFNOwotCQlmTmFtZXNbSWRzLklEX1BSRV0gPSBQUkU7Ci0JCWZOYW1lc1tJZHMuSURfUV0gPSBROwotCQlmTmFtZXNbSWRzLklEX1NdID0gUzsKLQkJZk5hbWVzW0lkcy5JRF9TQU1QXSA9IFNBTVA7Ci0JCWZOYW1lc1tJZHMuSURfU0NSSVBUXSA9IFNDUklQVDsKLQkJZk5hbWVzW0lkcy5JRF9TRUxFQ1RdID0gU0VMRUNUOwotCQlmTmFtZXNbSWRzLklEX1NNQUxMXSA9IFNNQUxMOwotCQlmTmFtZXNbSWRzLklEX1NQQU5dID0gU1BBTjsKLQkJZk5hbWVzW0lkcy5JRF9TVFJJS0VdID0gU1RSSUtFOwotCQlmTmFtZXNbSWRzLklEX1NUUk9OR10gPSBTVFJPTkc7Ci0JCWZOYW1lc1tJZHMuSURfU1RZTEVdID0gU1RZTEU7Ci0JCWZOYW1lc1tJZHMuSURfU1VCXSA9IFNVQjsKLQkJZk5hbWVzW0lkcy5JRF9TVVBdID0gU1VQOwotCQlmTmFtZXNbSWRzLklEX1RBQkxFXSA9IFRBQkxFOwotCQlmTmFtZXNbSWRzLklEX1RCT0RZXSA9IFRCT0RZOwotCQlmTmFtZXNbSWRzLklEX1REXSA9IFREOwotCQlmTmFtZXNbSWRzLklEX1RFWFRBUkVBXSA9IFRFWFRBUkVBOwotCQlmTmFtZXNbSWRzLklEX1RGT09UXSA9IFRGT09UOwotCQlmTmFtZXNbSWRzLklEX1RIXSA9IFRIOwotCQlmTmFtZXNbSWRzLklEX1RIRUFEXSA9IFRIRUFEOwotCQlmTmFtZXNbSWRzLklEX1RJVExFXSA9IFRJVExFOwotCQlmTmFtZXNbSWRzLklEX1RSXSA9IFRSOwotCQlmTmFtZXNbSWRzLklEX1RUXSA9IFRUOwotCQlmTmFtZXNbSWRzLklEX1VdID0gVTsKLQkJZk5hbWVzW0lkcy5JRF9VTF0gPSBVTDsKLQkJZk5hbWVzW0lkcy5JRF9WQVJdID0gVkFSOwotCQlmTmFtZXNbSWRzLklEX01BUlFVRUVdID0gTUFSUVVFRTsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfQ09ORklHXSA9IFNTSV9DT05GSUc7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0VDSE9dID0gU1NJX0VDSE87Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0VYRUNdID0gU1NJX0VYRUM7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0ZTSVpFXSA9IFNTSV9GU0laRTsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRkxBU1RNT0RdID0gU1NJX0ZMQVNUTU9EOwotCQlmTmFtZXNbSWRzLklEX1NTSV9JTkNMVURFXSA9IFNTSV9JTkNMVURFOwotCQlmTmFtZXNbSWRzLklEX1NTSV9QUklOVEVOVl0gPSBTU0lfUFJJTlRFTlY7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX1NFVF0gPSBTU0lfU0VUOwotCQlmTmFtZXNbSWRzLklEX0JHU09VTkRdID0gQkdTT1VORDsKLQkJZk5hbWVzW0lkcy5JRF9OT0JSXSA9IE5PQlI7Ci0JCWZOYW1lc1tJZHMuSURfV0JSXSA9IFdCUjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudENvbGxlY3Rpb24oQXR0cmlidXRlQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGZOYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFjdHVhbGx5IGNyZWF0ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJSFRNTEVsZW1EZWNsSW1wbCBlZGVjID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBKHRoaXMpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUJCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEFCQlIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBQ1JPTllNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQUNST05ZTSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFERFJFU1MpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFERFJFU1ModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFQUExFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQVBQTEVUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBUkVBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBUkVBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoQiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJBU0UpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJBU0UodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJBU0VGT05UKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCQVNFRk9OVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkRPKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCRE8odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJJRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEJJRywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJMSU5LKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoQkxJTkssIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCTE9DS1FVT1RFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCTE9DS1FVT1RFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCT0RZKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCT0RZKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQlIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJVVFRPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQlVUVE9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDQVBUSU9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDQVBUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDRU5URVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZENFTlRFUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0lURSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKENJVEUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0RFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQ09ERSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ09MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xHUk9VUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ09MR1JPVVAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEREKSkgewotCQkJZWRlYyA9IG5ldyBIZWRERCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREVMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNYXJrQ2hhbmdlcyhERUwsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERk4pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShERk4sIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoRElSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRElWKSkgewotCQkJZWRlYyA9IG5ldyBIZWRESVYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRETCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShFTSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEVNLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRU1CRUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEVNQkVEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGSUVMRFNFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRklFTERTRVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZPTlQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZPTlQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZPUk0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZPUk0odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZSQU1FKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGUkFNRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRlJBTUVTRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZSQU1FU0VUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgyKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgyLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg1KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg1LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDYsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIRUFEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIRUFEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhUTUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShJLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSUZSQU1FKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJRlJBTUUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElNRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU1HKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlBVVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU5QVVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTWFya0NoYW5nZXMoSU5TLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSVNJTkRFWCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSVNJTkRFWCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoS0JEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoS0JELCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFCRUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExBQkVMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMRUdFTkQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExFR0VORCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExJKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMSU5LKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMSU5LKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNQVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1BUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUFSUVVFRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUFSUVVFRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVOVSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShNRU5VLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVUQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVUQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9FTUJFRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9FTUJFRCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9GUkFNRVMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PRlJBTUVTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT1NDUklQVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9TQ1JJUFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9CSkVDVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT0JKRUNUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT0wodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9QVEdST1VQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPUFRHUk9VUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT1BUSU9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPUFRJT04odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFApKSB7Ci0JCQllZGVjID0gbmV3IEhlZFAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFBBUkFNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQQVJBTSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUFJFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQUkUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShTLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0FNUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKFNBTVAsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTQ1JJUFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNDUklQVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTRUxFQ1QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNNQUxMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoU01BTEwsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTUEFOKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTUEFOKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFJJS0UpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShTVFJJS0UsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFJPTkcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShTVFJPTkcsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFlMRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1RZTEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNVQikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU2NyaXB0cyhTVUIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNjcmlwdHMoU1VQLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEFCTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRBQkxFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUQk9EWSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVCb2R5KFRCT0RZLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQ2VsbChURCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRFWFRBUkVBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRURVhUQVJFQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEZPT1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQm9keShURk9PVCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRIKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUNlbGwoVEgsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUSEVBRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVCb2R5KFRIRUFELCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVElUTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRJVExFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVFIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoVFQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoVSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFVMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRVTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVkFSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoVkFSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0NPTkZJRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJQ29uZmlnKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRUNITykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRWNobyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VYRUMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUV4ZWModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9GU0laRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRnNpemUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9GTEFTVE1PRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRmxhc3Rtb2QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9JTkNMVURFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lJbmNsdWRlKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfUFJJTlRFTlYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSVByaW50ZW52KHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfU0VUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lTZXQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJHU09VTkQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJHU09VTkQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PQlIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFdCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkV0JSKHRoaXMpOwotCi0JCX0gLy8gdW5rbm93bgotCQllbHNlIHsKLQkJCS8vIE5PVEU6IFdlIGRvbid0IGRlZmluZSB0aGUgVU5LTk9XTiBlbGVtZW50IGRlY2xhcmF0aW9uLgotCQkJLy8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZGVjbGFyYXRpb24gaXMgYSBzaWduIG9mCi0JCQkvLyB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgdW5rbm93bi4KLQkJCS8vIC0tIDMvOS8yMDAxCi0JCQllZGVjID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWRlYzsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gYXR0cmlidXRlQ29sbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgQ29sbGVjdGlvbiBnZXROYW1lc09mQmxvY2soKSB7Ci0JCS8vIFAsIERMLCBESVYsIENFTlRFUiwgTk9TQ1JJUFQsIE5PRlJBTUVTLCBCTE9DS1FVT1RFLCBGT1JNLCBJU0lOREVYLCBIUiwKLQkJLy8gVEFCTEUsIEZJRUxEU0VULCBBRERSRVNTCi0JCVN0cmluZ1tdIGJsb2NrTWlzYyA9IHtQLCBETCwgRElWLCBDRU5URVIsIE5PU0NSSVBULCBOT0ZSQU1FUywgQkxPQ0tRVU9URSwgRk9STSwgSVNJTkRFWCwgSFIsIFRBQkxFLCBGSUVMRFNFVCwgQUREUkVTU307Ci0JCVZlY3RvciBuYW1lcyA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdChibG9ja01pc2MpKTsKLQkJLy8gJWhlYWRpbmc7Ci0JCW5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KEhFQURJTkcpKTsKLQkJLy8gJWxpc3Q7Ci0JCW5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KExJU1QpKTsKLQkJLy8gJXByZWZvcm1hdHRlZDsKLQkJbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKSk7Ci0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqICVibG9jazsuCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0QmxvY2soQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgZ2V0TmFtZXNPZkJsb2NrKCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGbG93KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRCbG9jayhncm91cCk7Ci0JCWdldElubGluZShncm91cCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9udHN0eWxlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoRk9OVFNUWUxFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb3JtY3RybChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPUk1DVEwpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVoZWFkaW5nOy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRIZWFkaW5nKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChIRUFESU5HKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldElubGluZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0Rm9udHN0eWxlKGdyb3VwKTsKLQkJZ2V0UGhyYXNlKGdyb3VwKTsKLQkJZ2V0U3BlY2lhbChncm91cCk7Ci0JCWdldEZvcm1jdHJsKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiAlbGlzdDsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0TGlzdChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoTElTVCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UGhyYXNlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUEhSQVNFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlcHJlZm9ybWF0dGVkOwotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFByZWZvcm1hdHRlZChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRTcGVjaWFsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoU1BFQ0lBTCkuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDU5NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVudGl0eSBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEVudGl0eUNvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkVudGl0eU5hbWUgewotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfTCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FBQ1VURV9VID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNJUkNfTCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX1UgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ1VURSA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FFTElHX0wgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19VID0gNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX0wgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BR1JBVkVfVSA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMRUZTWU0gPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9MID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMUEhBX1UgPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU1QID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FORCA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkcgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfTCA9IDE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUklOR19VID0gMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FTWU1QID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUSUxERV9MID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUSUxERV9VID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FVTUxfTCA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX1UgPSAyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkRRVU8gPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkVUQV9MID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfVSA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CUlZCQVIgPSAyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlVMTCA9IDI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQVAgPSAyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0NFRElMX0wgPSAyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0NFRElMX1UgPSAyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VESUwgPSAzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSElfTCA9IDMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSElfVSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSVJDID0gMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NMVUJTID0gMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTkcgPSAzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09QWSA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DUkFSUiA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DVVAgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VSUkVOID0gNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBR0dFUl9MID0gNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBR0dFUl9VID0gNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBUlJfTCA9IDQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX1UgPSA0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVHID0gNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX0wgPSA0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMVEFfVSA9IDQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESUFNUyA9IDQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVZJREUgPSA0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUFDVVRFX0wgPSA1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUFDVVRFX1UgPSA1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfTCA9IDUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQ0lSQ19VID0gNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VHUkFWRV9MID0gNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VHUkFWRV9VID0gNTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNUFRZID0gNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNU1AgPSA1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU5TUCA9IDU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUFNJTE9OX0wgPSA1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9VID0gNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VRVUlWID0gNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUQV9MID0gNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUQV9VID0gNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUSF9MID0gNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUSF9VID0gNjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVTUxfTCA9IDY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX1UgPSA2NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVSTyA9IDY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWElTVCA9IDY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GTk9GID0gNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUkFMTCA9IDcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMTIgPSA3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzE0ID0gNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMzNCA9IDc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFTTCA9IDc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9MID0gNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dBTU1BX1UgPSA3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0UgPSA3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR1QgPSA3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEFSUl9MID0gODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfVSA9IDgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUFSVFMgPSA4MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVMTElQID0gODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lBQ1VURV9MID0gODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lBQ1VURV9VID0gODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX0wgPSA4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUNJUkNfVSA9IDg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JRVhDTCA9IDg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JR1JBVkVfTCA9IDg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JR1JBVkVfVSA9IDkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTUFHRSA9IDkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTkZJTiA9IDkyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlQgPSA5MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU9UQV9MID0gOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfVSA9IDk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JUVVFU1QgPSA5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVNJTiA9IDk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JVU1MX0wgPSA5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9VID0gOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tBUFBBX0wgPSAxMDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tBUFBBX1UgPSAxMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTUJEQV9MID0gMTAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfVSA9IDEwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFORyA9IDEwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFRVU8gPSAxMDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfTCA9IDEwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFSUl9VID0gMTA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQ0VJTCA9IDEwODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTERRVU8gPSAxMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xFID0gMTEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRkxPT1IgPSAxMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPV0FTVCA9IDExMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTE9aID0gMTEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MUk0gPSAxMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTQVFVTyA9IDExNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFNRVU8gPSAxMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xUID0gMTE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQUNSID0gMTE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NREFTSCA9IDExOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlDUk8gPSAxMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JRERPVCA9IDEyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlOVVMgPSAxMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01VX0wgPSAxMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01VX1UgPSAxMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05BQkxBID0gMTI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQlNQID0gMTI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OREFTSCA9IDEyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkUgPSAxMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05JID0gMTI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1QgPSAxMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PVElOID0gMTMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OU1VCID0gMTMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVElMREVfTCA9IDEzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX1UgPSAxMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05VX0wgPSAxMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05VX1UgPSAxMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09BQ1VURV9MID0gMTM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfVSA9IDEzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0NJUkNfTCA9IDEzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0NJUkNfVSA9IDE0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0VMSUdfTCA9IDE0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0VMSUdfVSA9IDE0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0dSQVZFX0wgPSAxNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9VID0gMTQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTElORSA9IDE0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01FR0FfTCA9IDE0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01FR0FfVSA9IDE0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9MID0gMTQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUlDUk9OX1UgPSAxNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QTFVTID0gMTUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUiA9IDE1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1JERiA9IDE1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1JETSA9IDE1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1NMQVNIX0wgPSAxNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9VID0gMTU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElMREVfTCA9IDE1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX1UgPSAxNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USU1FUyA9IDE1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9MID0gMTU5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVU1MX1UgPSAxNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkEgPSAxNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUlQgPSAxNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUk1JTCA9IDE2MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEVSUCA9IDE2NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEhJX0wgPSAxNjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9VID0gMTY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSVYgPSAxNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJX0wgPSAxNjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJX1UgPSAxNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BMVVNNTiA9IDE3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUE9VTkQgPSAxNzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSSU1FX0wgPSAxNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSSU1FX1UgPSAxNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BST0QgPSAxNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BST1AgPSAxNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BTSV9MID0gMTc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfVSA9IDE3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUVVPVCA9IDE3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFESUMgPSAxNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBTkcgPSAxODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUVVPID0gMTgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX0wgPSAxODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUlJfVSA9IDE4MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkNFSUwgPSAxODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JEUVVPID0gMTg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRUFMID0gMTg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRUcgPSAxODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JGTE9PUiA9IDE4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkhPX0wgPSAxODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19VID0gMTkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9STE0gPSAxOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTQVFVTyA9IDE5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUlNRVU8gPSAxOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NCUVVPID0gMTk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ0FST05fTCA9IDE5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX1UgPSAxOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NET1QgPSAxOTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFQ1QgPSAxOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NIWSA9IDE5OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFGID0gMjAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQV9MID0gMjAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQV9VID0gMjAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSU0gPSAyMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NQQURFUyA9IDIwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCID0gMjA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUJFID0gMjA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVU0gPSAyMDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUCA9IDIwODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMSA9IDIwOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMiA9IDIxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMyA9IDIxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQRSA9IDIxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1pMSUcgPSAyMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBVV9MID0gMjE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfVSA9IDIxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFUkU0ID0gMjE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQVNZTSA9IDIxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFfTCA9IDIxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFfVSA9IDIxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhJTlNQID0gMjIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USE9STl9MID0gMjIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USE9STl9VID0gMjIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USUxERSA9IDIyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElNRVMgPSAyMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RSQURFID0gMjI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQUNVVEVfTCA9IDIyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX1UgPSAyMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfTCA9IDIyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFSUl9VID0gMjI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQ0lSQ19MID0gMjMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQ0lSQ19VID0gMjMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VR1JBVkVfTCA9IDIzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX1UgPSAyMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VNTCA9IDIzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUggPSAyMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fTCA9IDIzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUxPTl9VID0gMjM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX0wgPSAyMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VVTUxfVSA9IDIzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfV0VJRVJQID0gMjQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9YSV9MID0gMjQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9YSV9VID0gMjQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZQUNVVEVfTCA9IDI0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX1UgPSAyNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lFTiA9IDI0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9MID0gMjQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZVU1MX1UgPSAyNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfTCA9IDI0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWkVUQV9VID0gMjQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV0ogPSAyNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pXTkogPSAyNTE7Ci0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAyNTIuCi0JCQkvLyAtLSA1LzI0LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX0xdID0gQUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQUNVVEVfVV0gPSBBQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0FDSVJDX0xdID0gQUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0FDSVJDX1VdID0gQUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0FDVVRFXSA9IEFDVVRFOwotCQluYW1lc1tJZHMuSURfQUVMSUdfTF0gPSBBRUxJR19MOwotCQluYW1lc1tJZHMuSURfQUVMSUdfVV0gPSBBRUxJR19VOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX0xdID0gQUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BR1JBVkVfVV0gPSBBR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0FMRUZTWU1dID0gQUxFRlNZTTsKLQkJbmFtZXNbSWRzLklEX0FMUEhBX0xdID0gQUxQSEFfTDsKLQkJbmFtZXNbSWRzLklEX0FMUEhBX1VdID0gQUxQSEFfVTsKLQkJbmFtZXNbSWRzLklEX0FNUF0gPSBBTVA7Ci0JCW5hbWVzW0lkcy5JRF9BTkRdID0gQU5EOwotCQluYW1lc1tJZHMuSURfQU5HXSA9IEFORzsKLQkJbmFtZXNbSWRzLklEX0FSSU5HX0xdID0gQVJJTkdfTDsKLQkJbmFtZXNbSWRzLklEX0FSSU5HX1VdID0gQVJJTkdfVTsKLQkJbmFtZXNbSWRzLklEX0FTWU1QXSA9IEFTWU1QOwotCQluYW1lc1tJZHMuSURfQVRJTERFX0xdID0gQVRJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BVElMREVfVV0gPSBBVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX0FVTUxfTF0gPSBBVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX1VdID0gQVVNTF9VOwotCQluYW1lc1tJZHMuSURfQkRRVU9dID0gQkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9CRVRBX0xdID0gQkVUQV9MOwotCQluYW1lc1tJZHMuSURfQkVUQV9VXSA9IEJFVEFfVTsKLQkJbmFtZXNbSWRzLklEX0JSVkJBUl0gPSBCUlZCQVI7Ci0JCW5hbWVzW0lkcy5JRF9CVUxMXSA9IEJVTEw7Ci0JCW5hbWVzW0lkcy5JRF9DQVBdID0gQ0FQOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX0xdID0gQ0NFRElMX0w7Ci0JCW5hbWVzW0lkcy5JRF9DQ0VESUxfVV0gPSBDQ0VESUxfVTsKLQkJbmFtZXNbSWRzLklEX0NFRElMXSA9IENFRElMOwotCQluYW1lc1tJZHMuSURfQ0VOVF0gPSBDRU5UOwotCQluYW1lc1tJZHMuSURfQ0hJX0xdID0gQ0hJX0w7Ci0JCW5hbWVzW0lkcy5JRF9DSElfVV0gPSBDSElfVTsKLQkJbmFtZXNbSWRzLklEX0NJUkNdID0gQ0lSQzsKLQkJbmFtZXNbSWRzLklEX0NMVUJTXSA9IENMVUJTOwotCQluYW1lc1tJZHMuSURfQ09OR10gPSBDT05HOwotCQluYW1lc1tJZHMuSURfQ09QWV0gPSBDT1BZOwotCQluYW1lc1tJZHMuSURfQ1JBUlJdID0gQ1JBUlI7Ci0JCW5hbWVzW0lkcy5JRF9DVVBdID0gQ1VQOwotCQluYW1lc1tJZHMuSURfQ1VSUkVOXSA9IENVUlJFTjsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9MXSA9IERBR0dFUl9MOwotCQluYW1lc1tJZHMuSURfREFHR0VSX1VdID0gREFHR0VSX1U7Ci0JCW5hbWVzW0lkcy5JRF9EQVJSX0xdID0gREFSUl9MOwotCQluYW1lc1tJZHMuSURfREFSUl9VXSA9IERBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0RFR10gPSBERUc7Ci0JCW5hbWVzW0lkcy5JRF9ERUxUQV9MXSA9IERFTFRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9ERUxUQV9VXSA9IERFTFRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9ESUFNU10gPSBESUFNUzsKLQkJbmFtZXNbSWRzLklEX0RJVklERV0gPSBESVZJREU7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfTF0gPSBFQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0VBQ1VURV9VXSA9IEVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfRUNJUkNfTF0gPSBFQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfRUNJUkNfVV0gPSBFQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX0xdID0gRUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FR1JBVkVfVV0gPSBFR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0VNUFRZXSA9IEVNUFRZOwotCQluYW1lc1tJZHMuSURfRU1TUF0gPSBFTVNQOwotCQluYW1lc1tJZHMuSURfRU5TUF0gPSBFTlNQOwotCQluYW1lc1tJZHMuSURfRVBTSUxPTl9MXSA9IEVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fVV0gPSBFUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9FUVVJVl0gPSBFUVVJVjsKLQkJbmFtZXNbSWRzLklEX0VUQV9MXSA9IEVUQV9MOwotCQluYW1lc1tJZHMuSURfRVRBX1VdID0gRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfTF0gPSBFVEhfTDsKLQkJbmFtZXNbSWRzLklEX0VUSF9VXSA9IEVUSF9VOwotCQluYW1lc1tJZHMuSURfRVVNTF9MXSA9IEVVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0VVTUxfVV0gPSBFVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVVJPXSA9IEVVUk87Ci0JCW5hbWVzW0lkcy5JRF9FWElTVF0gPSBFWElTVDsKLQkJbmFtZXNbSWRzLklEX0ZOT0ZdID0gRk5PRjsKLQkJbmFtZXNbSWRzLklEX0ZPUkFMTF0gPSBGT1JBTEw7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMTJdID0gRlJBQzEyOwotCQluYW1lc1tJZHMuSURfRlJBQzE0XSA9IEZSQUMxNDsKLQkJbmFtZXNbSWRzLklEX0ZSQUMzNF0gPSBGUkFDMzQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFTTF0gPSBGUkFTTDsKLQkJbmFtZXNbSWRzLklEX0dBTU1BX0xdID0gR0FNTUFfTDsKLQkJbmFtZXNbSWRzLklEX0dBTU1BX1VdID0gR0FNTUFfVTsKLQkJbmFtZXNbSWRzLklEX0dFXSA9IEdFOwotCQluYW1lc1tJZHMuSURfR1RdID0gR1Q7Ci0JCW5hbWVzW0lkcy5JRF9IQVJSX0xdID0gSEFSUl9MOwotCQluYW1lc1tJZHMuSURfSEFSUl9VXSA9IEhBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0hFQVJUU10gPSBIRUFSVFM7Ci0JCW5hbWVzW0lkcy5JRF9IRUxMSVBdID0gSEVMTElQOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX0xdID0gSUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQUNVVEVfVV0gPSBJQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0lDSVJDX0xdID0gSUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0lDSVJDX1VdID0gSUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0lFWENMXSA9IElFWENMOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX0xdID0gSUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9JR1JBVkVfVV0gPSBJR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0lNQUdFXSA9IElNQUdFOwotCQluYW1lc1tJZHMuSURfSU5GSU5dID0gSU5GSU47Ci0JCW5hbWVzW0lkcy5JRF9JTlRdID0gSU5UOwotCQluYW1lc1tJZHMuSURfSU9UQV9MXSA9IElPVEFfTDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfVV0gPSBJT1RBX1U7Ci0JCW5hbWVzW0lkcy5JRF9JUVVFU1RdID0gSVFVRVNUOwotCQluYW1lc1tJZHMuSURfSVNJTl0gPSBJU0lOOwotCQluYW1lc1tJZHMuSURfSVVNTF9MXSA9IElVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0lVTUxfVV0gPSBJVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9LQVBQQV9MXSA9IEtBUFBBX0w7Ci0JCW5hbWVzW0lkcy5JRF9LQVBQQV9VXSA9IEtBUFBBX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfTF0gPSBMQU1CREFfTDsKLQkJbmFtZXNbSWRzLklEX0xBTUJEQV9VXSA9IExBTUJEQV9VOwotCQluYW1lc1tJZHMuSURfTEFOR10gPSBMQU5HOwotCQluYW1lc1tJZHMuSURfTEFRVU9dID0gTEFRVU87Ci0JCW5hbWVzW0lkcy5JRF9MQVJSX0xdID0gTEFSUl9MOwotCQluYW1lc1tJZHMuSURfTEFSUl9VXSA9IExBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0xDRUlMXSA9IExDRUlMOwotCQluYW1lc1tJZHMuSURfTERRVU9dID0gTERRVU87Ci0JCW5hbWVzW0lkcy5JRF9MRV0gPSBMRTsKLQkJbmFtZXNbSWRzLklEX0xGTE9PUl0gPSBMRkxPT1I7Ci0JCW5hbWVzW0lkcy5JRF9MT1dBU1RdID0gTE9XQVNUOwotCQluYW1lc1tJZHMuSURfTE9aXSA9IExPWjsKLQkJbmFtZXNbSWRzLklEX0xSTV0gPSBMUk07Ci0JCW5hbWVzW0lkcy5JRF9MU0FRVU9dID0gTFNBUVVPOwotCQluYW1lc1tJZHMuSURfTFNRVU9dID0gTFNRVU87Ci0JCW5hbWVzW0lkcy5JRF9MVF0gPSBMVDsKLQkJbmFtZXNbSWRzLklEX01BQ1JdID0gTUFDUjsKLQkJbmFtZXNbSWRzLklEX01EQVNIXSA9IE1EQVNIOwotCQluYW1lc1tJZHMuSURfTUlDUk9dID0gTUlDUk87Ci0JCW5hbWVzW0lkcy5JRF9NSURET1RdID0gTUlERE9UOwotCQluYW1lc1tJZHMuSURfTUlOVVNdID0gTUlOVVM7Ci0JCW5hbWVzW0lkcy5JRF9NVV9MXSA9IE1VX0w7Ci0JCW5hbWVzW0lkcy5JRF9NVV9VXSA9IE1VX1U7Ci0JCW5hbWVzW0lkcy5JRF9OQUJMQV0gPSBOQUJMQTsKLQkJbmFtZXNbSWRzLklEX05CU1BdID0gTkJTUDsKLQkJbmFtZXNbSWRzLklEX05EQVNIXSA9IE5EQVNIOwotCQluYW1lc1tJZHMuSURfTkVdID0gTkU7Ci0JCW5hbWVzW0lkcy5JRF9OSV0gPSBOSTsKLQkJbmFtZXNbSWRzLklEX05PVF0gPSBOT1Q7Ci0JCW5hbWVzW0lkcy5JRF9OT1RJTl0gPSBOT1RJTjsKLQkJbmFtZXNbSWRzLklEX05TVUJdID0gTlNVQjsKLQkJbmFtZXNbSWRzLklEX05USUxERV9MXSA9IE5USUxERV9MOwotCQluYW1lc1tJZHMuSURfTlRJTERFX1VdID0gTlRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9OVV9MXSA9IE5VX0w7Ci0JCW5hbWVzW0lkcy5JRF9OVV9VXSA9IE5VX1U7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfTF0gPSBPQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX09BQ1VURV9VXSA9IE9BQ1VURV9VOwotCQluYW1lc1tJZHMuSURfT0NJUkNfTF0gPSBPQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfT0NJUkNfVV0gPSBPQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfT0VMSUdfTF0gPSBPRUxJR19MOwotCQluYW1lc1tJZHMuSURfT0VMSUdfVV0gPSBPRUxJR19VOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX0xdID0gT0dSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PR1JBVkVfVV0gPSBPR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX09MSU5FXSA9IE9MSU5FOwotCQluYW1lc1tJZHMuSURfT01FR0FfTF0gPSBPTUVHQV9MOwotCQluYW1lc1tJZHMuSURfT01FR0FfVV0gPSBPTUVHQV9VOwotCQluYW1lc1tJZHMuSURfT01JQ1JPTl9MXSA9IE9NSUNST05fTDsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fVV0gPSBPTUlDUk9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9PUExVU10gPSBPUExVUzsKLQkJbmFtZXNbSWRzLklEX09SXSA9IE9SOwotCQluYW1lc1tJZHMuSURfT1JERl0gPSBPUkRGOwotCQluYW1lc1tJZHMuSURfT1JETV0gPSBPUkRNOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX0xdID0gT1NMQVNIX0w7Ci0JCW5hbWVzW0lkcy5JRF9PU0xBU0hfVV0gPSBPU0xBU0hfVTsKLQkJbmFtZXNbSWRzLklEX09USUxERV9MXSA9IE9USUxERV9MOwotCQluYW1lc1tJZHMuSURfT1RJTERFX1VdID0gT1RJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElNRVNdID0gT1RJTUVTOwotCQluYW1lc1tJZHMuSURfT1VNTF9MXSA9IE9VTUxfTDsKLQkJbmFtZXNbSWRzLklEX09VTUxfVV0gPSBPVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9QQVJBXSA9IFBBUkE7Ci0JCW5hbWVzW0lkcy5JRF9QQVJUXSA9IFBBUlQ7Ci0JCW5hbWVzW0lkcy5JRF9QRVJNSUxdID0gUEVSTUlMOwotCQluYW1lc1tJZHMuSURfUEVSUF0gPSBQRVJQOwotCQluYW1lc1tJZHMuSURfUEhJX0xdID0gUEhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QSElfVV0gPSBQSElfVTsKLQkJbmFtZXNbSWRzLklEX1BJVl0gPSBQSVY7Ci0JCW5hbWVzW0lkcy5JRF9QSV9MXSA9IFBJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QSV9VXSA9IFBJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QTFVTTU5dID0gUExVU01OOwotCQluYW1lc1tJZHMuSURfUE9VTkRdID0gUE9VTkQ7Ci0JCW5hbWVzW0lkcy5JRF9QUklNRV9MXSA9IFBSSU1FX0w7Ci0JCW5hbWVzW0lkcy5JRF9QUklNRV9VXSA9IFBSSU1FX1U7Ci0JCW5hbWVzW0lkcy5JRF9QUk9EXSA9IFBST0Q7Ci0JCW5hbWVzW0lkcy5JRF9QUk9QXSA9IFBST1A7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfTF0gPSBQU0lfTDsKLQkJbmFtZXNbSWRzLklEX1BTSV9VXSA9IFBTSV9VOwotCQluYW1lc1tJZHMuSURfUVVPVF0gPSBRVU9UOwotCQluYW1lc1tJZHMuSURfUkFESUNdID0gUkFESUM7Ci0JCW5hbWVzW0lkcy5JRF9SQU5HXSA9IFJBTkc7Ci0JCW5hbWVzW0lkcy5JRF9SQVFVT10gPSBSQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JBUlJfTF0gPSBSQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX1VdID0gUkFSUl9VOwotCQluYW1lc1tJZHMuSURfUkNFSUxdID0gUkNFSUw7Ci0JCW5hbWVzW0lkcy5JRF9SRFFVT10gPSBSRFFVTzsKLQkJbmFtZXNbSWRzLklEX1JFQUxdID0gUkVBTDsKLQkJbmFtZXNbSWRzLklEX1JFR10gPSBSRUc7Ci0JCW5hbWVzW0lkcy5JRF9SRkxPT1JdID0gUkZMT09SOwotCQluYW1lc1tJZHMuSURfUkhPX0xdID0gUkhPX0w7Ci0JCW5hbWVzW0lkcy5JRF9SSE9fVV0gPSBSSE9fVTsKLQkJbmFtZXNbSWRzLklEX1JMTV0gPSBSTE07Ci0JCW5hbWVzW0lkcy5JRF9SU0FRVU9dID0gUlNBUVVPOwotCQluYW1lc1tJZHMuSURfUlNRVU9dID0gUlNRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQlFVT10gPSBTQlFVTzsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9MXSA9IFNDQVJPTl9MOwotCQluYW1lc1tJZHMuSURfU0NBUk9OX1VdID0gU0NBUk9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9TRE9UXSA9IFNET1Q7Ci0JCW5hbWVzW0lkcy5JRF9TRUNUXSA9IFNFQ1Q7Ci0JCW5hbWVzW0lkcy5JRF9TSFldID0gU0hZOwotCQluYW1lc1tJZHMuSURfU0lHTUFGXSA9IFNJR01BRjsKLQkJbmFtZXNbSWRzLklEX1NJR01BX0xdID0gU0lHTUFfTDsKLQkJbmFtZXNbSWRzLklEX1NJR01BX1VdID0gU0lHTUFfVTsKLQkJbmFtZXNbSWRzLklEX1NJTV0gPSBTSU07Ci0JCW5hbWVzW0lkcy5JRF9TUEFERVNdID0gU1BBREVTOwotCQluYW1lc1tJZHMuSURfU1VCXSA9IFNVQjsKLQkJbmFtZXNbSWRzLklEX1NVQkVdID0gU1VCRTsKLQkJbmFtZXNbSWRzLklEX1NVTV0gPSBTVU07Ci0JCW5hbWVzW0lkcy5JRF9TVVBdID0gU1VQOwotCQluYW1lc1tJZHMuSURfU1VQMV0gPSBTVVAxOwotCQluYW1lc1tJZHMuSURfU1VQMl0gPSBTVVAyOwotCQluYW1lc1tJZHMuSURfU1VQM10gPSBTVVAzOwotCQluYW1lc1tJZHMuSURfU1VQRV0gPSBTVVBFOwotCQluYW1lc1tJZHMuSURfU1pMSUddID0gU1pMSUc7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfTF0gPSBUQVVfTDsKLQkJbmFtZXNbSWRzLklEX1RBVV9VXSA9IFRBVV9VOwotCQluYW1lc1tJZHMuSURfVEhFUkU0XSA9IFRIRVJFNDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBU1lNXSA9IFRIRVRBU1lNOwotCQluYW1lc1tJZHMuSURfVEhFVEFfTF0gPSBUSEVUQV9MOwotCQluYW1lc1tJZHMuSURfVEhFVEFfVV0gPSBUSEVUQV9VOwotCQluYW1lc1tJZHMuSURfVEhJTlNQXSA9IFRISU5TUDsKLQkJbmFtZXNbSWRzLklEX1RIT1JOX0xdID0gVEhPUk5fTDsKLQkJbmFtZXNbSWRzLklEX1RIT1JOX1VdID0gVEhPUk5fVTsKLQkJbmFtZXNbSWRzLklEX1RJTERFXSA9IFRJTERFOwotCQluYW1lc1tJZHMuSURfVElNRVNdID0gVElNRVM7Ci0JCW5hbWVzW0lkcy5JRF9UUkFERV0gPSBUUkFERTsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9MXSA9IFVBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfVUFDVVRFX1VdID0gVUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQVJSX0xdID0gVUFSUl9MOwotCQluYW1lc1tJZHMuSURfVUFSUl9VXSA9IFVBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1VDSVJDX0xdID0gVUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX1VDSVJDX1VdID0gVUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9MXSA9IFVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfVUdSQVZFX1VdID0gVUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9VTUxdID0gVU1MOwotCQluYW1lc1tJZHMuSURfVVBTSUhdID0gVVBTSUg7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJTE9OX0xdID0gVVBTSUxPTl9MOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9VXSA9IFVQU0lMT05fVTsKLQkJbmFtZXNbSWRzLklEX1VVTUxfTF0gPSBVVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX1VdID0gVVVNTF9VOwotCQluYW1lc1tJZHMuSURfV0VJRVJQXSA9IFdFSUVSUDsKLQkJbmFtZXNbSWRzLklEX1hJX0xdID0gWElfTDsKLQkJbmFtZXNbSWRzLklEX1hJX1VdID0gWElfVTsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9MXSA9IFlBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfWUFDVVRFX1VdID0gWUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZRU5dID0gWUVOOwotCQluYW1lc1tJZHMuSURfWVVNTF9MXSA9IFlVTUxfTDsKLQkJbmFtZXNbSWRzLklEX1lVTUxfVV0gPSBZVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9aRVRBX0xdID0gWkVUQV9MOwotCQluYW1lc1tJZHMuSURfWkVUQV9VXSA9IFpFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1pXSl0gPSBaV0o7Ci0JCW5hbWVzW0lkcy5JRF9aV05KXSA9IFpXTko7Ci0JfQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB2YWx1ZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJdmFsdWVzID0gbmV3IGNoYXJbSWRzLmdldE51bU9mSWRzKCldOwotCQl2YWx1ZXNbSWRzLklEX0FBQ1VURV9MXSA9IDIyNTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfVV0gPSAxOTM7Ci0JCXZhbHVlc1tJZHMuSURfQUNJUkNfTF0gPSAyMjY7Ci0JCXZhbHVlc1tJZHMuSURfQUNJUkNfVV0gPSAxOTQ7Ci0JCXZhbHVlc1tJZHMuSURfQUNVVEVdID0gMTgwOwotCQl2YWx1ZXNbSWRzLklEX0FFTElHX0xdID0gMjMwOwotCQl2YWx1ZXNbSWRzLklEX0FFTElHX1VdID0gMTk4OwotCQl2YWx1ZXNbSWRzLklEX0FHUkFWRV9MXSA9IDIyNDsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfVV0gPSAxOTI7Ci0JCXZhbHVlc1tJZHMuSURfQUxFRlNZTV0gPSA4NTAxOwotCQl2YWx1ZXNbSWRzLklEX0FMUEhBX0xdID0gOTQ1OwotCQl2YWx1ZXNbSWRzLklEX0FMUEhBX1VdID0gOTEzOwotCQl2YWx1ZXNbSWRzLklEX0FNUF0gPSAzODsKLQkJdmFsdWVzW0lkcy5JRF9BTkRdID0gODc0MzsKLQkJdmFsdWVzW0lkcy5JRF9BTkddID0gODczNjsKLQkJdmFsdWVzW0lkcy5JRF9BUklOR19MXSA9IDIyOTsKLQkJdmFsdWVzW0lkcy5JRF9BUklOR19VXSA9IDE5NzsKLQkJdmFsdWVzW0lkcy5JRF9BU1lNUF0gPSA4Nzc2OwotCQl2YWx1ZXNbSWRzLklEX0FUSUxERV9MXSA9IDIyNzsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfVV0gPSAxOTU7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9MXSA9IDIyODsKLQkJdmFsdWVzW0lkcy5JRF9BVU1MX1VdID0gMTk2OwotCQl2YWx1ZXNbSWRzLklEX0JEUVVPXSA9IDgyMjI7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9MXSA9IDk0NjsKLQkJdmFsdWVzW0lkcy5JRF9CRVRBX1VdID0gOTE0OwotCQl2YWx1ZXNbSWRzLklEX0JSVkJBUl0gPSAxNjY7Ci0JCXZhbHVlc1tJZHMuSURfQlVMTF0gPSA4MjI2OwotCQl2YWx1ZXNbSWRzLklEX0NBUF0gPSA4NzQ1OwotCQl2YWx1ZXNbSWRzLklEX0NDRURJTF9MXSA9IDIzMTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfVV0gPSAxOTk7Ci0JCXZhbHVlc1tJZHMuSURfQ0VESUxdID0gMTg0OwotCQl2YWx1ZXNbSWRzLklEX0NFTlRdID0gMTYyOwotCQl2YWx1ZXNbSWRzLklEX0NISV9MXSA9IDk2NzsKLQkJdmFsdWVzW0lkcy5JRF9DSElfVV0gPSA5MzU7Ci0JCXZhbHVlc1tJZHMuSURfQ0lSQ10gPSA3MTA7Ci0JCXZhbHVlc1tJZHMuSURfQ0xVQlNdID0gOTgyNzsKLQkJdmFsdWVzW0lkcy5JRF9DT05HXSA9IDg3NzM7Ci0JCXZhbHVlc1tJZHMuSURfQ09QWV0gPSAxNjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1JBUlJdID0gODYyOTsKLQkJdmFsdWVzW0lkcy5JRF9DVVBdID0gODc0NjsKLQkJdmFsdWVzW0lkcy5JRF9DVVJSRU5dID0gMTY0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9MXSA9IDgyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfREFHR0VSX1VdID0gODIyNTsKLQkJdmFsdWVzW0lkcy5JRF9EQVJSX0xdID0gODU5NTsKLQkJdmFsdWVzW0lkcy5JRF9EQVJSX1VdID0gODY1OTsKLQkJdmFsdWVzW0lkcy5JRF9ERUddID0gMTc2OwotCQl2YWx1ZXNbSWRzLklEX0RFTFRBX0xdID0gOTQ4OwotCQl2YWx1ZXNbSWRzLklEX0RFTFRBX1VdID0gOTE2OwotCQl2YWx1ZXNbSWRzLklEX0RJQU1TXSA9IDk4MzA7Ci0JCXZhbHVlc1tJZHMuSURfRElWSURFXSA9IDI0NzsKLQkJdmFsdWVzW0lkcy5JRF9FQUNVVEVfTF0gPSAyMzM7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX1VdID0gMjAxOwotCQl2YWx1ZXNbSWRzLklEX0VDSVJDX0xdID0gMjM0OwotCQl2YWx1ZXNbSWRzLklEX0VDSVJDX1VdID0gMjAyOwotCQl2YWx1ZXNbSWRzLklEX0VHUkFWRV9MXSA9IDIzMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfVV0gPSAyMDA7Ci0JCXZhbHVlc1tJZHMuSURfRU1QVFldID0gODcwOTsKLQkJdmFsdWVzW0lkcy5JRF9FTVNQXSA9IDgxOTU7Ci0JCXZhbHVlc1tJZHMuSURfRU5TUF0gPSA4MTk0OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fTF0gPSA5NDk7Ci0JCXZhbHVlc1tJZHMuSURfRVBTSUxPTl9VXSA9IDkxNzsKLQkJdmFsdWVzW0lkcy5JRF9FUVVJVl0gPSA4ODAxOwotCQl2YWx1ZXNbSWRzLklEX0VUQV9MXSA9IDk1MTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfVV0gPSA5MTk7Ci0JCXZhbHVlc1tJZHMuSURfRVRIX0xdID0gMjQwOwotCQl2YWx1ZXNbSWRzLklEX0VUSF9VXSA9IDIwODsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX0xdID0gMjM1OwotCQl2YWx1ZXNbSWRzLklEX0VVTUxfVV0gPSAyMDM7Ci0JCXZhbHVlc1tJZHMuSURfRVVST10gPSA4MzY0OwotCQl2YWx1ZXNbSWRzLklEX0VYSVNUXSA9IDg3MDc7Ci0JCXZhbHVlc1tJZHMuSURfRk5PRl0gPSA0MDI7Ci0JCXZhbHVlc1tJZHMuSURfRk9SQUxMXSA9IDg3MDQ7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzEyXSA9IDE4OTsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMTRdID0gMTg4OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMzNF0gPSAxOTA7Ci0JCXZhbHVlc1tJZHMuSURfRlJBU0xdID0gODI2MDsKLQkJdmFsdWVzW0lkcy5JRF9HQU1NQV9MXSA9IDk0NzsKLQkJdmFsdWVzW0lkcy5JRF9HQU1NQV9VXSA9IDkxNTsKLQkJdmFsdWVzW0lkcy5JRF9HRV0gPSA4ODA1OwotCQl2YWx1ZXNbSWRzLklEX0dUXSA9IDYyOwotCQl2YWx1ZXNbSWRzLklEX0hBUlJfTF0gPSA4NTk2OwotCQl2YWx1ZXNbSWRzLklEX0hBUlJfVV0gPSA4NjYwOwotCQl2YWx1ZXNbSWRzLklEX0hFQVJUU10gPSA5ODI5OwotCQl2YWx1ZXNbSWRzLklEX0hFTExJUF0gPSA4MjMwOwotCQl2YWx1ZXNbSWRzLklEX0lBQ1VURV9MXSA9IDIzNzsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfVV0gPSAyMDU7Ci0JCXZhbHVlc1tJZHMuSURfSUNJUkNfTF0gPSAyMzg7Ci0JCXZhbHVlc1tJZHMuSURfSUNJUkNfVV0gPSAyMDY7Ci0JCXZhbHVlc1tJZHMuSURfSUVYQ0xdID0gMTYxOwotCQl2YWx1ZXNbSWRzLklEX0lHUkFWRV9MXSA9IDIzNjsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfVV0gPSAyMDQ7Ci0JCXZhbHVlc1tJZHMuSURfSU1BR0VdID0gODQ2NTsKLQkJdmFsdWVzW0lkcy5JRF9JTkZJTl0gPSA4NzM0OwotCQl2YWx1ZXNbSWRzLklEX0lOVF0gPSA4NzQ3OwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfTF0gPSA5NTM7Ci0JCXZhbHVlc1tJZHMuSURfSU9UQV9VXSA9IDkyMTsKLQkJdmFsdWVzW0lkcy5JRF9JUVVFU1RdID0gMTkxOwotCQl2YWx1ZXNbSWRzLklEX0lTSU5dID0gODcxMjsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX0xdID0gMjM5OwotCQl2YWx1ZXNbSWRzLklEX0lVTUxfVV0gPSAyMDc7Ci0JCXZhbHVlc1tJZHMuSURfS0FQUEFfTF0gPSA5NTQ7Ci0JCXZhbHVlc1tJZHMuSURfS0FQUEFfVV0gPSA5MjI7Ci0JCXZhbHVlc1tJZHMuSURfTEFNQkRBX0xdID0gOTU1OwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9VXSA9IDkyMzsKLQkJdmFsdWVzW0lkcy5JRF9MQU5HXSA9IDkwMDE7Ci0JCXZhbHVlc1tJZHMuSURfTEFRVU9dID0gMTcxOwotCQl2YWx1ZXNbSWRzLklEX0xBUlJfTF0gPSA4NTkyOwotCQl2YWx1ZXNbSWRzLklEX0xBUlJfVV0gPSA4NjU2OwotCQl2YWx1ZXNbSWRzLklEX0xDRUlMXSA9IDg5Njg7Ci0JCXZhbHVlc1tJZHMuSURfTERRVU9dID0gODIyMDsKLQkJdmFsdWVzW0lkcy5JRF9MRV0gPSA4ODA0OwotCQl2YWx1ZXNbSWRzLklEX0xGTE9PUl0gPSA4OTcwOwotCQl2YWx1ZXNbSWRzLklEX0xPV0FTVF0gPSA4NzI3OwotCQl2YWx1ZXNbSWRzLklEX0xPWl0gPSA5Njc0OwotCQl2YWx1ZXNbSWRzLklEX0xSTV0gPSA4MjA2OwotCQl2YWx1ZXNbSWRzLklEX0xTQVFVT10gPSA4MjQ5OwotCQl2YWx1ZXNbSWRzLklEX0xTUVVPXSA9IDgyMTY7Ci0JCXZhbHVlc1tJZHMuSURfTFRdID0gNjA7Ci0JCXZhbHVlc1tJZHMuSURfTUFDUl0gPSAxNzU7Ci0JCXZhbHVlc1tJZHMuSURfTURBU0hdID0gODIxMjsKLQkJdmFsdWVzW0lkcy5JRF9NSUNST10gPSAxODE7Ci0JCXZhbHVlc1tJZHMuSURfTUlERE9UXSA9IDE4MzsKLQkJdmFsdWVzW0lkcy5JRF9NSU5VU10gPSA4NzIyOwotCQl2YWx1ZXNbSWRzLklEX01VX0xdID0gOTU2OwotCQl2YWx1ZXNbSWRzLklEX01VX1VdID0gOTI0OwotCQl2YWx1ZXNbSWRzLklEX05BQkxBXSA9IDg3MTE7Ci0JCXZhbHVlc1tJZHMuSURfTkJTUF0gPSAxNjA7Ci0JCXZhbHVlc1tJZHMuSURfTkRBU0hdID0gODIxMTsKLQkJdmFsdWVzW0lkcy5JRF9ORV0gPSA4ODAwOwotCQl2YWx1ZXNbSWRzLklEX05JXSA9IDg3MTU7Ci0JCXZhbHVlc1tJZHMuSURfTk9UXSA9IDE3MjsKLQkJdmFsdWVzW0lkcy5JRF9OT1RJTl0gPSA4NzEzOwotCQl2YWx1ZXNbSWRzLklEX05TVUJdID0gODgzNjsKLQkJdmFsdWVzW0lkcy5JRF9OVElMREVfTF0gPSAyNDE7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX1VdID0gMjA5OwotCQl2YWx1ZXNbSWRzLklEX05VX0xdID0gOTU3OwotCQl2YWx1ZXNbSWRzLklEX05VX1VdID0gOTI1OwotCQl2YWx1ZXNbSWRzLklEX09BQ1VURV9MXSA9IDI0MzsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfVV0gPSAyMTE7Ci0JCXZhbHVlc1tJZHMuSURfT0NJUkNfTF0gPSAyNDQ7Ci0JCXZhbHVlc1tJZHMuSURfT0NJUkNfVV0gPSAyMTI7Ci0JCXZhbHVlc1tJZHMuSURfT0VMSUdfTF0gPSAzMzk7Ci0JCXZhbHVlc1tJZHMuSURfT0VMSUdfVV0gPSAzMzg7Ci0JCXZhbHVlc1tJZHMuSURfT0dSQVZFX0xdID0gMjQyOwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9VXSA9IDIxMDsKLQkJdmFsdWVzW0lkcy5JRF9PTElORV0gPSA4MjU0OwotCQl2YWx1ZXNbSWRzLklEX09NRUdBX0xdID0gOTY5OwotCQl2YWx1ZXNbSWRzLklEX09NRUdBX1VdID0gOTM3OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fTF0gPSA5NTk7Ci0JCXZhbHVlc1tJZHMuSURfT01JQ1JPTl9VXSA9IDkyNzsKLQkJdmFsdWVzW0lkcy5JRF9PUExVU10gPSA4ODUzOwotCQl2YWx1ZXNbSWRzLklEX09SXSA9IDg3NDQ7Ci0JCXZhbHVlc1tJZHMuSURfT1JERl0gPSAxNzA7Ci0JCXZhbHVlc1tJZHMuSURfT1JETV0gPSAxODY7Ci0JCXZhbHVlc1tJZHMuSURfT1NMQVNIX0xdID0gMjQ4OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9VXSA9IDIxNjsKLQkJdmFsdWVzW0lkcy5JRF9PVElMREVfTF0gPSAyNDU7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX1VdID0gMjEzOwotCQl2YWx1ZXNbSWRzLklEX09USU1FU10gPSA4ODU1OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfTF0gPSAyNDY7Ci0JCXZhbHVlc1tJZHMuSURfT1VNTF9VXSA9IDIxNDsKLQkJdmFsdWVzW0lkcy5JRF9QQVJBXSA9IDE4MjsKLQkJdmFsdWVzW0lkcy5JRF9QQVJUXSA9IDg3MDY7Ci0JCXZhbHVlc1tJZHMuSURfUEVSTUlMXSA9IDgyNDA7Ci0JCXZhbHVlc1tJZHMuSURfUEVSUF0gPSA4ODY5OwotCQl2YWx1ZXNbSWRzLklEX1BISV9MXSA9IDk2NjsKLQkJdmFsdWVzW0lkcy5JRF9QSElfVV0gPSA5MzQ7Ci0JCXZhbHVlc1tJZHMuSURfUElWXSA9IDk4MjsKLQkJdmFsdWVzW0lkcy5JRF9QSV9MXSA9IDk2MDsKLQkJdmFsdWVzW0lkcy5JRF9QSV9VXSA9IDkyODsKLQkJdmFsdWVzW0lkcy5JRF9QTFVTTU5dID0gMTc3OwotCQl2YWx1ZXNbSWRzLklEX1BPVU5EXSA9IDE2MzsKLQkJdmFsdWVzW0lkcy5JRF9QUklNRV9MXSA9IDgyNDI7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfVV0gPSA4MjQzOwotCQl2YWx1ZXNbSWRzLklEX1BST0RdID0gODcxOTsKLQkJdmFsdWVzW0lkcy5JRF9QUk9QXSA9IDg3MzM7Ci0JCXZhbHVlc1tJZHMuSURfUFNJX0xdID0gOTY4OwotCQl2YWx1ZXNbSWRzLklEX1BTSV9VXSA9IDkzNjsKLQkJdmFsdWVzW0lkcy5JRF9RVU9UXSA9IDM0OwotCQl2YWx1ZXNbSWRzLklEX1JBRElDXSA9IDg3MzA7Ci0JCXZhbHVlc1tJZHMuSURfUkFOR10gPSA5MDAyOwotCQl2YWx1ZXNbSWRzLklEX1JBUVVPXSA9IDE4NzsKLQkJdmFsdWVzW0lkcy5JRF9SQVJSX0xdID0gODU5NDsKLQkJdmFsdWVzW0lkcy5JRF9SQVJSX1VdID0gODY1ODsKLQkJdmFsdWVzW0lkcy5JRF9SQ0VJTF0gPSA4OTY5OwotCQl2YWx1ZXNbSWRzLklEX1JEUVVPXSA9IDgyMjE7Ci0JCXZhbHVlc1tJZHMuSURfUkVBTF0gPSA4NDc2OwotCQl2YWx1ZXNbSWRzLklEX1JFR10gPSAxNzQ7Ci0JCXZhbHVlc1tJZHMuSURfUkZMT09SXSA9IDg5NzE7Ci0JCXZhbHVlc1tJZHMuSURfUkhPX0xdID0gOTYxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19VXSA9IDkyOTsKLQkJdmFsdWVzW0lkcy5JRF9STE1dID0gODIwNzsKLQkJdmFsdWVzW0lkcy5JRF9SU0FRVU9dID0gODI1MDsKLQkJdmFsdWVzW0lkcy5JRF9SU1FVT10gPSA4MjE3OwotCQl2YWx1ZXNbSWRzLklEX1NCUVVPXSA9IDgyMTg7Ci0JCXZhbHVlc1tJZHMuSURfU0NBUk9OX0xdID0gMzUzOwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9VXSA9IDM1MjsKLQkJdmFsdWVzW0lkcy5JRF9TRE9UXSA9IDg5MDE7Ci0JCXZhbHVlc1tJZHMuSURfU0VDVF0gPSAxNjc7Ci0JCXZhbHVlc1tJZHMuSURfU0hZXSA9IDE3MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQUZdID0gOTYyOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BX0xdID0gOTYzOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BX1VdID0gOTMxOwotCQl2YWx1ZXNbSWRzLklEX1NJTV0gPSA4NzY0OwotCQl2YWx1ZXNbSWRzLklEX1NQQURFU10gPSA5ODI0OwotCQl2YWx1ZXNbSWRzLklEX1NVQl0gPSA4ODM0OwotCQl2YWx1ZXNbSWRzLklEX1NVQkVdID0gODgzODsKLQkJdmFsdWVzW0lkcy5JRF9TVU1dID0gODcyMTsKLQkJdmFsdWVzW0lkcy5JRF9TVVBdID0gODgzNTsKLQkJdmFsdWVzW0lkcy5JRF9TVVAxXSA9IDE4NTsKLQkJdmFsdWVzW0lkcy5JRF9TVVAyXSA9IDE3ODsKLQkJdmFsdWVzW0lkcy5JRF9TVVAzXSA9IDE3OTsKLQkJdmFsdWVzW0lkcy5JRF9TVVBFXSA9IDg4Mzk7Ci0JCXZhbHVlc1tJZHMuSURfU1pMSUddID0gMjIzOwotCQl2YWx1ZXNbSWRzLklEX1RBVV9MXSA9IDk2NDsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfVV0gPSA5MzI7Ci0JCXZhbHVlc1tJZHMuSURfVEhFUkU0XSA9IDg3NTY7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFTWU1dID0gOTc3OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBX0xdID0gOTUyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBX1VdID0gOTIwOwotCQl2YWx1ZXNbSWRzLklEX1RISU5TUF0gPSA4MjAxOwotCQl2YWx1ZXNbSWRzLklEX1RIT1JOX0xdID0gMjU0OwotCQl2YWx1ZXNbSWRzLklEX1RIT1JOX1VdID0gMjIyOwotCQl2YWx1ZXNbSWRzLklEX1RJTERFXSA9IDczMjsKLQkJdmFsdWVzW0lkcy5JRF9USU1FU10gPSAyMTU7Ci0JCXZhbHVlc1tJZHMuSURfVFJBREVdID0gODQ4MjsKLQkJdmFsdWVzW0lkcy5JRF9VQUNVVEVfTF0gPSAyNTA7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX1VdID0gMjE4OwotCQl2YWx1ZXNbSWRzLklEX1VBUlJfTF0gPSA4NTkzOwotCQl2YWx1ZXNbSWRzLklEX1VBUlJfVV0gPSA4NjU3OwotCQl2YWx1ZXNbSWRzLklEX1VDSVJDX0xdID0gMjUxOwotCQl2YWx1ZXNbSWRzLklEX1VDSVJDX1VdID0gMjE5OwotCQl2YWx1ZXNbSWRzLklEX1VHUkFWRV9MXSA9IDI0OTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfVV0gPSAyMTc7Ci0JCXZhbHVlc1tJZHMuSURfVU1MXSA9IDE2ODsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJSF0gPSA5Nzg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9MXSA9IDk2NTsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJTE9OX1VdID0gOTMzOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfTF0gPSAyNTI7Ci0JCXZhbHVlc1tJZHMuSURfVVVNTF9VXSA9IDIyMDsKLQkJdmFsdWVzW0lkcy5JRF9XRUlFUlBdID0gODQ3MjsKLQkJdmFsdWVzW0lkcy5JRF9YSV9MXSA9IDk1ODsKLQkJdmFsdWVzW0lkcy5JRF9YSV9VXSA9IDkyNjsKLQkJdmFsdWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSAyNTM7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX1VdID0gMjIxOwotCQl2YWx1ZXNbSWRzLklEX1lFTl0gPSAxNjU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9MXSA9IDI1NTsKLQkJdmFsdWVzW0lkcy5JRF9ZVU1MX1VdID0gMzc2OwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfTF0gPSA5NTA7Ci0JCXZhbHVlc1tJZHMuSURfWkVUQV9VXSA9IDkxODsKLQkJdmFsdWVzW0lkcy5JRF9aV0pdID0gODIwNTsKLQkJdmFsdWVzW0lkcy5JRF9aV05KXSA9IDgyMDQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudGl0eUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKG5hbWVzLCBTVFJJQ1RfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGVudGl0eSBkZWNsYXJhdGlvbi4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpbnQgaWQgPSBnZXRJRChlbnRpdHlOYW1lKTsKLQkJaWYgKGlkID09IElEX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdmFsdWUgPSBTdHJpbmcudmFsdWVPZih2YWx1ZXNbaWRdKTsKLQkJSFRNTEVudGl0eURlY2xJbXBsIGRlYyA9IG5ldyBIVE1MRW50aXR5RGVjbEltcGwoZW50aXR5TmFtZSwgdmFsdWUpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSENNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWY1Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IQ01Eb2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgSFRNTC4KLSAqLwotY2xhc3MgSENNRG9jSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01Eb2N1bWVudCB7Ci0KLQkvKiogTmFtZXNwYWNlIGZvciBhbGwgbmFtZXMgb2YgZWxlbWVudHMsIGVudGl0aWVzIGFuZCBhdHRyaWJ1dGVzLiAqLwotCXByaXZhdGUgQ01OYW1lc3BhY2VJbXBsIG5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBFbnRpdHlDb2xsZWN0aW9uIGVudGl0aWVzID0gbnVsbDsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSENNRG9jSW1wbChTdHJpbmcgZG9jVHlwZU5hbWUsIENNTmFtZXNwYWNlSW1wbCB0YXJnZXROYW1lc3BhY2UpIHsKLQkJc3VwZXIoZG9jVHlwZU5hbWUpOwotCQluYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlQ29sbGVjdGlvbigpOwotCQllbGVtZW50cyA9IG5ldyBFbGVtZW50Q29sbGVjdGlvbihhdHRyaWJ1dGVzKTsKLQkJZW50aXRpZXMgPSBuZXcgRW50aXR5Q29sbGVjdGlvbigpOwotCX0KLQotCUF0dHJpYnV0ZUNvbGxlY3Rpb24gZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIGVudGl0aWVzOwotCX0KLQotCXB1YmxpYyBIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKGVudGl0aWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRW50aXR5RGVjbGFyYXRpb24pIGVudGl0aWVzLmdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDNiMmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3Mgb2Yge0BsaW5rIDxjb2RlPkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjwvY29kZT59IGludGVyZmFjZS48YnI+Ci0gKi8KLWNsYXNzIEhUTUxBdHRyRGVjbEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgSFRNTENNRGF0YVR5cGVJbXBsIHR5cGUgPSBudWxsOwotCXByaXZhdGUgaW50IHVzYWdlID0gMDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MQXR0ckRlY2xJbXBsKFN0cmluZyBhdHRyTmFtZSwgSFRNTENNRGF0YVR5cGVJbXBsIHZhbHVlVHlwZSwgaW50IHZhbHVlVXNhZ2UpIHsKLQkJc3VwZXIoYXR0ck5hbWUpOwotCQl0aGlzLnR5cGUgPSB2YWx1ZVR5cGU7Ci0KLQkJc3dpdGNoICh2YWx1ZVVzYWdlKSB7Ci0JCQljYXNlIE9QVElPTkFMIDoKLQkJCWNhc2UgUkVRVUlSRUQgOgotCQkJY2FzZSBGSVhFRCA6Ci0JCQljYXNlIFBST0hJQklURUQgOgotCQkJCXRoaXMudXNhZ2UgPSB2YWx1ZVVzYWdlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gc2hvdWxkIHdhcm4uLi4KLQkJCQl0aGlzLnVzYWdlID0gT1BUSU9OQUw7IC8vIGZhbGwgYmFjawotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0ck5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0clR5cGUgbWV0aG9kCi0JICogQHJldHVybiBDTURhdGFUeXBlCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGJ5IHN1cGVyaW50ZXJmYWNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCWlmICh0eXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBieSBzdXBlcmludGVyZmFjZQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QodHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpKTsKLQkJcmV0dXJuIHYuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiB1c2FnZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU0NSSVBUQUJMRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NDUklQVEFCTEUpKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSA9PSBIVE1MQ01EYXRhVHlwZS5TQ1JJUFQgPyBuZXcgQm9vbGVhbih0cnVlKSA6IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmY2ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZXh0ZW5kcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzNjFkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBIVE1MIGV4dGVuc2lvbiBmb3IgZGF0YSB0eXBlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQ01EYXRhVHlwZSBleHRlbmRzIENNRGF0YVR5cGUgewotCi0JLyoqIEJvb2xlYW47IGl0IHNob3VsZCBiZSBkZWZpbmVkIGluIENNRGF0YVR5cGUuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJCT09MRUFOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SID0gIkNPTE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UID0gIkVWRU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGUyA9ICJJRFJFRlMiOyAvLyROT04tTkxTLTEkCi0JLyoqIE5hbWU7IGl0IHNob3VsZCBiZSBkZWZpbmVkIGluIENNRGF0YVR5cGUuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJOQU1FIjsgLy8kTk9OLU5MUy0xJAotCS8vIEZvbGxvd2luZyB0eXBlcyBhcmUganVzdCBhbGlhc2VzLgotCS8qKiAlQ2hhcmFjdGVyOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUiA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDaGFyc2V0OyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVQgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlQ2hhcnNldHM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVFMgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlQ29udGVudFR5cGU7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNvb3JkczsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT09SRFMgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlRGF0ZXRpbWU7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURVRJTUUgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlRnJhbWVUYXJnZXQ7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVfVEFSR0VUID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUxhbmd1YWdlQ29kZTsgPT0gTkFNRSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdVQUdFX0NPREUgPSBOQU1FOwotCS8qKiAlTGVuZ3RoOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFTkdUSCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVMaW5rVHlwZXM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19UWVBFUyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVMSVN0eWxlOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJX1NUWUxFID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJU1lZGlhRGVzYzsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9ERVNDID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJU11bHRpTGVuZ3RoOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJX0xFTkdUSCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVPTFN0eWxlOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9MX1NUWUxFID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJVBpeGxlczsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSVhFTFMgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlU2NyaXB0OyA9PSBFVkVOVCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVCA9IEVWRU5UOwotCS8qKiAlU3R5bGVTaGVldDsgPT0gRVZFTlQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9TSEVFVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVUZXh0OyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSBDTURhdGFUeXBlLkNEQVRBOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZlNjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxDTURhdGFUeXBlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01EYXRhVHlwZSB7Ci0KLQlwcml2YXRlIGludCBpbXBsaWVkVmFsdWVLaW5kID0gSU1QTElFRF9WQUxVRV9OT05FOwotCXByaXZhdGUgU3RyaW5nIGltcGxpZWRWYWx1ZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZW1wdHlBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBTdHJpbmdbXSBlbnVtVmFsdWVzID0gZW1wdHlBcnJheTsKLQlwcml2YXRlIFN0cmluZyBpbnN0YW5jZVZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQkJdGhpcy5pbnN0YW5jZVZhbHVlID0gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0JICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIGVudW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRFbnVtVmFsdWVzKFN0cmluZ1tdIHZhbHVlcykgewotCQllbnVtVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudW1WYWx1ZXNbaV0gPSB2YWx1ZXNbaV07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwYWNrYWdlIHNjb3BlLgotCSAqLwotCXZvaWQgc2V0SW1wbGllZFZhbHVlKGludCBraW5kLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElNUExJRURfVkFMVUVfRklYRUQgOgotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBraW5kOwotCQkJCWltcGxpZWRWYWx1ZSA9IHZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX05PTkUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQkJCQlpbXBsaWVkVmFsdWUgPSBudWxsOyAvLyBtYXliZSBhIG51bGwgc3RyaW5nPwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNWZhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLQotLyoqCi0gKiBIVE1MIGV4dGVuc2lvbiBmb3IgQ01Eb2N1bWVudC4KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHNvbWUgc2hvcnQgaGFuZCBtZXRob2RzIHRvIGdldCBkZWNsYXJhdGlvbnMKLSAqIGJ5IGEgbmFtZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQ01Eb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnQgewotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYSBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciBhIEhUTUwgZWxlbWVudC48YnI+Ci0JICogQHBhcmFtIGVsZW1lbnROYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpOwotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYSBlbnRpdHkgZGVjbGFyYXRpb24gb2YgSFRNTCBkb2N1bWVudHMuPGJyPgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU5MDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbC5DSENNRG9jSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogSU5vZGVBZGFwdGVyIGZhY3RvcnkgZm9yIEhUTUwgYW5kIEpTUCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVE1MQ01Eb2N1bWVudEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGNtZG9jcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCXN0YXRpYyB7Ci0JCUNNTmFtZXNwYWNlSW1wbCBoNDBucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSFRNTDQwTmFtZXNwYWNlLkhUTUw0MF9VUkksIEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVEFHX1BSRUZJWCk7Ci0JCUNNTmFtZXNwYWNlSW1wbCBqMTFucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSlNQMTFOYW1lc3BhY2UuSlNQMTFfVVJJLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0KLQkJSENNRG9jSW1wbCBodG1sNDBkb2MgPSBuZXcgSENNRG9jSW1wbChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSwgaDQwbnMpOwotCQlDSENNRG9jSW1wbCBjaHRtbGRvYyA9IG5ldyBDSENNRG9jSW1wbChDTURvY1R5cGUuQ0hUTUxfRE9DX1RZUEUsIGg0MG5zKTsKLQkJSkNNRG9jSW1wbCBqc3AxMWRvYyA9IG5ldyBKQ01Eb2NJbXBsKENNRG9jVHlwZS5KU1AxMV9ET0NfVFlQRSwgajExbnMpOwotCi0JCWNtZG9jcy5wdXQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUsIGh0bWw0MGRvYyk7Ci0JCWNtZG9jcy5wdXQoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFLCBjaHRtbGRvYyk7Ci0JCWNtZG9jcy5wdXQoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFLCBqc3AxMWRvYyk7Ci0JfQotCi0JLyoqCi0JICogSFRNTENNQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKiBAcGFyYW0gY210eXBlIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgY210eXBlKSB7Ci0JCU9iamVjdCBvYmogPSBjbWRvY3MuZ2V0KGNtdHlwZSk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoQ01Eb2N1bWVudCkgb2JqOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTM4NzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIGRlY2xhcmF0aW9uIGlzIGZvciBIVE1MIGF0dHJpYnV0ZS9lbGVtZW50L2VudGl0eS4KLQkgKiBPdGhlcndpc2UsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbURlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5M2M3ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgSGVkPz8/PyBjbGFzc2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIVE1MRWxlbURlY2xJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24sIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQotCS8vIERURAotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCS8qKiBOZXZlciBhY2Nlc3MgdGhpcyBmaWVsZCBkaXJlY3RseS4gIEluc3RlYWQsIHVzZSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24gbWV0aG9kLiAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgaW5jbHVzaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgZXhjbHVzaW9uID0gbnVsbDsKLQkvLyBhZHZhbmNlZCBpbmZvcm1hdGlvbgotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkQW5jZXN0b3JzID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9OT05FOwotCXByb3RlY3RlZCBpbnQgZm9ybWF0VHlwZSA9IEZPUk1BVF9IVE1MOwotCXByb3RlY3RlZCBpbnQgbGF5b3V0VHlwZSA9IExBWU9VVF9OT05FOwotCXByb3RlY3RlZCBpbnQgb21pdFR5cGUgPSBPTUlUX05PTkU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4ga2VlcFNwYWNlcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBIVE1MRWxlbURlY2xJbXBsIGNvbnN0cnVjdG9yLgotCSAqIEluIHRoZSBIVE1MIERURCwgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBoYXMgbm8gc3BlY2lmaWNhdGlvbgotCSAqIGZvciBpdHMgb2NjdXJyZW5jZS4gIE9jY3VycmVuY2UgaXMgc3BlY2lmZWQgaW4gY29udGVudCBtb2RlbCwgbGlrZQotCSAqIDxjb2RlPihMSSkrPC9jb2RlPi4gIFRvIGF2b2lkIGNvbmZ1c2lvbiAoYW5kIGNvbXBsZXhpdHkpLAotCSAqIG9jY3VycmVuY2Ugb2YgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBhbHdheXMgMSAoaXQgbWVhbnMsIG1pbiA9IDEgYW5kCi0JICogbWF4ID0gMSkuICBJbnN0ZWFkLCBvY2N1cnJlbmNlIG9mIENNR3JvdXAgcmVwcmVzZW50cyBhY3R1YWwgb2NjdXJyZW5jZQotCSAqIG9mIHRoZSBjb250ZW50LgotCSAqIDxicj4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxFbGVtRGVjbEltcGwoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCAxLCAxKTsKLQkJZWxlbWVudENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbi5nZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ0RBVEEpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWSkgfHwgdHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BDREFUQSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGZhY3RvcnkgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwgZXJyb3IuCi0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGZhY3RvcnkuY3JlYXRlVHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb25OYW1lLCBlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlCi0JCX0KLQotCQlDTU5vZGUgY21ub2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCWNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBpbnN0YW5jZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbiA9PSBudWxsKQotCQkJdHlwZURlZmluaXRpb24gPSBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJcmV0dXJuIHR5cGVEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm4gbnVsbC4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7IC8vIGxhenkgZXZhbC4KLQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0Q29udGVudCgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSB0eXBlLgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdHJpZXMgdG8gY3JlYXRlIGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24KLQkgKiBpbnN0YW5jZSBhbmQgYWNjZXNzIHRvIGl0LgotCSAqIDxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7IC8vIGxhenkgZXZhbC4KLQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0Q29udGVudFR5cGUoKSA6IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb3JyZWN0aW9uVHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29ycmVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBjb3JyZWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBkYXRhIHR5cGUuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiBBbG1vc3QgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhIGV4Y2x1c2lvbi4KLQkgKiBPbmx5IGNsYXNzZXMgdGhvc2UgaGF2ZSBleGNsdXNpb24gc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGZvcm1hdCB0eXBlIGlzIDxjb2RlPkZPUk1BVF9IVE1MPC9jb2RlPi48YnI+Ci0JICovCi0JcHVibGljIGludCBnZXRGb3JtYXRUeXBlKCkgewotCQlyZXR1cm4gZm9ybWF0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBJbmNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBpbmNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgaW5jbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMYXlvdXRUeXBlKCkgewotCQlyZXR1cm4gbGF5b3V0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBMaW5lIGJyZWFrIGhpbnQgaXMgc3Ryb25nbHkgcmVsYXRlZCB0byBsYXlvdXQgdHlwZS4KLQkgKiBJbmRlZWQsIGluIHRoZSBDKytET00sIGl0IGlzIGRldGVybWluZWQgZnJvbSBsYXlvdXQgdHlwZSBvbmx5LgotCSAqIFNvLCB0aGlzIGltcGxlbWVudGF0aW9uLCBhcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIGRlY2xhcmF0aW9ucywKLQkgKiBhbHNvIGRldGVybWluZXMgZnJvbSBsYXlvdXQgdHlwZSBvbmx5Ljxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSGludCgpIHsKLQkJc3dpdGNoIChnZXRMYXlvdXRUeXBlKCkpIHsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CUkVBSyA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQUZURVJfU1RBUlQ7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm8gSFRNTCBlbGVtZW50IGhhcyBsb2NhbCBlbGVtZW50cy4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIGFuIGVtcHR5IG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIEVNUFRZX01BUDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T21pdFR5cGUoKSB7Ci0JCXJldHVybiBvbWl0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJcmV0dXJuIEVNUFRZX01BUDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gcHAuc3VwcG9ydHModGhpcyk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0UHJpbWFyeUNhbmRpZGF0ZSgpIDogbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcHAuZ2V0KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGVsZW1lbnQgbmFtZXMgd2hpY2ggdGVybWluYXRlcyB0aGlzIGVsZW1lbnQuPGJyPgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBlbGVtZW50IGlzIGEgSlNQIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1AoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbiBzb21lIGVsZW1lbnRzLCBzdWNoIGFzIEFQUExFVCwgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBpbmRlbnQgY2hpbGQKLQkgKiBlbGVtZW50cyB0aGF0IHRoZWlyIHBhcmVudHMuICBUaGF0IGlzLCBhIHNvdXJjZSBnZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlCi0JICogc291cmNlICBvZiBBUFBMRVQgYW5kIFBBUkFNUyBsaWtlIHRoaXM6Ci0JICogPFBSRT4KLQkgKiAgICZsdDtBUFBMRVQgLi4uJmd0OwotCSAqICAgICAmbHQ7UEFSQU0gLi4uICZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAmbHQ7L0FQUExFVCZndDsKLQkgKiA8UFJFPgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQlyZXR1cm4gaW5kZW50Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogTW9zdCBvZiBlbGVtZW50cyBjYW4gY29tcGFjdCBzcGFjZXMgaW4gdGhlaXIgY2hpbGQgdGV4dCBub2Rlcy4KLQkgKiBTb21lIHNwZWNpYWwgZWxlbWVudHMgc2hvdWxkIGtlZXAgdGhlbSBpbiB0aGVpciBzb3VyY2UuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlcygpIHsKLQkJcmV0dXJuIGtlZXBTcGFjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBuZXh0RWxlbWVudCkgewotCQlJdGVyYXRvciBpID0gZ2V0VGVybWluYXRvcnMoKTsKLQkJaWYgKGkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5leHROYW1lID0gbmV4dEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAobmV4dE5hbWUuZXF1YWxzKGkubmV4dCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTcxZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgaW50ZXJmYWNlIHdoaWNoIGhhcwotICogaW50ZXJmYWNlcyBkZWZpbmVkIGluIGJvdGggb2Yge0BsaW5rIDxjb2RlPkNNRWxlbWVudERlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqIEluIGFkZGl0aW9uIHRvIHRoaXMsIHNvbWUgaW50ZXJmYWNlcyBhcmUgYWRkZWQgdG8gdGhpcyBpbnRlcmZhY2UsCi0gKiB0aG9zZSBhcmUgc3BlY2lhbGx5IHRvIEhUTUwgZWxlbWVudHMuPGJyPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZXh0ZW5kcyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQkvKiogVGFnIG9tbWlzc2lvbjsgTm90IG9tbWlzaWJsZS4gKi8KLQlpbnQgT01JVF9OT05FID0gMDsKLQkvKiogVGFnIG9tbWlzc2lvbjsgQm90aCB0YWdzIGFyZSBvbW1pc2libGUuICovCi0JaW50IE9NSVRfQk9USCA9IDE7Ci0JLyoqIFRhZyBvbW1pc3Npb247IFRoZSBlbmQgdGFnIGlzIG9tbWlzaWJsZS4gKi8KLQlpbnQgT01JVF9FTkQgPSAyOwotCS8qKiBUYWcgb21taXNzaW9uOyBUaGUgZW5kIHRhZyBpcyBvbW1pdHRlZCB3aGVuIGNyZWF0ZWQuICovCi0JaW50IE9NSVRfRU5EX0RFRkFVTFQgPSAzOwotCS8qKiBUYWcgb21taXNzaW9uOyBUaGUgZW5kIHRhZyBtdXN0IGJlIG9taXR0ZWQuICovCi0JaW50IE9NSVRfRU5EX01VU1QgPSA0OwotCS8qKiBMaW5lIEJyZWFrOyBObyBicmVhay4gKi8KLQlpbnQgQlJFQUtfTk9ORSA9IDEwOwotCS8qKiBMaW5lIEJyZWFrOyBCcmVhayBhZnRlciB0aGUgc3RhcnQgdGFnLiAqLwotCWludCBCUkVBS19BRlRFUl9TVEFSVCA9IDExOwotCS8qKiBMaW5lIEJyZWFrOyBCcmVhayBib3RoIGJlZm9yZSB0aGUgc3RhcnQgdGFnbiBhbmQgYWZ0ZXIgdGhlIGVuZCB0YWcuICovCi0JaW50IEJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EID0gMTI7Ci0JLyogTGF5b3V0ICovCi0JLyoqIGluaXRpYWwgdmFsdWU7IHRoZSB2YWx1ZSBzaG91bGQgbmV2ZXIgcmV0dXJucyB0byBjbGllbnQgcHJvZ3JhbXMuICovCi0JaW50IExBWU9VVF9OT05FID0gMTAwOwotCWludCBMQVlPVVRfQkxPQ0sgPSAxMDE7Ci0JaW50IExBWU9VVF9XUkFQID0gMTAyOwotCS8qKiBObyB3cmFwIG9iamVjdDsgbGlrZSBJTUcsIEFQUExFVCwuLi4gKi8KLQlpbnQgTEFZT1VUX09CSkVDVCA9IDEwMzsKLQkvKiogQlIgKi8KLQlpbnQgTEFZT1VUX0JSRUFLID0gMTA0OwotCS8qKiBIaWRkZW4gb2JqZWN0OyBsaWtlIEhUTUwgb3IgSEVBRCAqLwotCWludCBMQVlPVVRfSElEREVOID0gMTA1OwotCS8qIENvcnJlY3Rpb24gKi8KLQkvKiogQ29ycmVjdDsgTm8gY29ycmVjdC4gKi8KLQlpbnQgQ09SUkVDVF9OT05FID0gMTAwMDsKLQkvKiogQ29ycmVjdDsgTWVhbmluZ2xlc3Mgd2hlbiB0aGUgY29udGVudCBpcyBlbXB0eS4gKi8KLQlpbnQgQ09SUkVDVF9FTVBUWSA9IDEwMDE7Ci0JLyoqIENvcnJlY3Q7IE1lYW5pbmdsZXNzIHdoZW4gbm8gYXR0cmlidXQgaXMgc2V0LiAqLwotCWludCBDT1JSRUNUX05FVVRSQUwgPSAxMDAyOwotCS8qKiBDb3JyZWN0OyBNZWFuaW5nbGVzcyB3aGVuIHNhbWUgZWxlbWVudCBpcyBuZXN0ZWQuICovCi0JaW50IENPUlJFQ1RfRFVQTElDQVRFRCA9IDEwMDM7Ci0JLyoqIEZvcm1hdDsgSFRNTCAqLwotCWludCBGT1JNQVRfSFRNTCA9IDEwMDAwOwotCS8qKiBGb3JtYXQ7IFNTSSAqLwotCWludCBGT1JNQVRfU1NJID0gMTAwMDE7Ci0JLyoqIEZvcm1hdDsgSlNQIHNjcmlwdCAqLwotCWludCBGT1JNQVRfSlNQX1NDUklQVCA9IDEwMDAyOwotCS8qKiBGb3JtYXQ7IEpTUCBkaXJlY3RpdmUgKi8KLQlpbnQgRk9STUFUX0pTUF9ESVJFQ1RJVkUgPSAxMDAwMzsKLQkvKiogRm9ybWF0OyBYTUwgKi8KLQlpbnQgRk9STUFUX1hNTCA9IDEwMDA0OwotCS8qKiBGb3JtYXQ7IE1XICovCi0JaW50IEZPUk1BVF9NVyA9IDEwMDA1OwotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIG9mIGEgSFRNTCBlbGVtZW50LgotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzY0N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTEVudGl0eURlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01FbnRpdHlEZWNsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIGphdmEubGFuZy5TdHJpbmc7IEVudGl0eSBuYW1lLgotCSAqIEBwYXJhbSBlbnRpdHlWYWx1ZSBqYXZhLmxhbmcuU3RyaW5nOyBWYWx1ZSBzdHJpbmcuCi0JICovCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsSW1wbChTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVZhbHVlKSB7Ci0JCXN1cGVyKGVudGl0eU5hbWUpOwotCQl2YWx1ZSA9IGVudGl0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ01Ob2RlIHR5cGUuPGJyPgotCSAqIEByZXR1cm4gaW50OyBBbHdheXMgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVOVElUWV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRW50aXRpZXMgaW4gSFRNTCBkb2N1bWVudHMgYXJlIGFsd2F5cyB0cmVhdGVkIHdpdGggaWdub3JpbmcgY2FzZXMuCi0JICogQmVjYXVzZSBubyBzcGVjaWFsIGVudGl0aWVzIGFyZSBkZWZpbmVkIGluIEpTUCAxLjAsIHRoaXMgbWV0aG9kCi0JICogY2FuIGFsd2F5cyByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2M2UyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgaW50ZXJmYWNlIHdoaWNoIGhhcwotICogaW50ZXJmYWNlcyBkZWZpbmVkIGluIGJvdGggb2Yge0BsaW5rIDxjb2RlPkNNRW50aXR5RGVjbGFyYXRpb248L2NvZGU+fQotICogYW5kIHtAbGluayA8Y29kZT5IVE1MQ01Ob2RlPC9jb2RlPn0uPGJyPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbiB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxQcm9wZXJ0eURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxQcm9wZXJ0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTM1MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MUHJvcGVydHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGNvbW1vbmx5IHVzZWQgaW4gZGVjbGFyYXRpb24gaW1wbGVtZW50YXRpb24sIGFuZCBpbnRlcm5hbCB1c2UuCi0gKiBVc2UgZ2V0UHJvcGVydHkoKSBtZXRob2QgZm9yIHB1YmxpYyB1c2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gewotCS8qKgotCSAqIFRvIGRldGVybWluIHRoZSB0eXBlLCBsb29rIHVwIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gQysrRE9NL0RURFBhcnNlci5jcHA6Ci0JICogPHVsPgotCSAqICAgPGxpPkNPUlJFQ1RfRFVQTElDQVRFRCAtIDxjb2RlPkdST1VQX05PRFVQPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+Q09SUkVDVF9FTVBUWSAtIDxjb2RlPkdST1VQX0NPTVBBQ1Q8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5DT1JSRUNUX05FVVRSQUwgLSA8Y29kZT5HUk9VUF9ORVVUUkFMPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+Q09SUkVDVF9OT05FIC0gPGNvZGU+KE4vQSk8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldENvcnJlY3Rpb25UeXBlKCk7Ci0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIGRlY2xhcmF0aW9ucyB0aG9zZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgY29udGVudC48YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCUNNQ29udGVudCBnZXRFeGNsdXNpb24oKTsKLQkvKioKLQkgKiBUbyBkZXRlcm1pbiB0aGUgdHlwZSwgc2VlIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gdGhlIEMrK0RPTToKLQkgKiAgIEVsZW1lbnRUeXBlLmNwcCAtIEVsZW1lbnRUeXBlI3NldEdyb3VwKCkuCi0JICogICBFbGVtZW50LmNwcCAtIEVsZW1lbnQjZ2V0U3RhcnRUYWcoKS4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRGb3JtYXRUeXBlKCk7Ci0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIGRlY2xhcmF0aW9ucyB0aG9zZSBzaG91bGQgYmUgaW5jbHVkZWQgaW50byB0aGUgY29udGVudC48YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCUNNQ29udGVudCBnZXRJbmNsdXNpb24oKTsKLQkvKioKLQkgKiBUbyBkZXRlcm1pbiB0aGUgdHlwZSwgbG9vayB1cCB0aGUgZm9sbG93aW5nIGtleXdvcmRzIGluIEMrK0RPTS9EVERQYXJzZXIuY3BwOgotCSAqIDx1bD4KLQkgKiAgIDxsaT5MQVlPVVRfQkxPQ0sgLSA8Y29kZT5HUk9VUF9CTE9DSzwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9CUkVBSyAtIDxjb2RlPkdST1VQX0JSRUFLPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX0hJRERFTiAtIDxjb2RlPkdST1VQX0hJRERFTjwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9OT05FIC0gPGNvZGU+KE4vQSk8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfT0JKRUNUIC0gPGNvZGU+R1JPVVBfTk9XUkFQPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX1dSQVAgLSA8Y29kZT4oTi9BKTwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGF5b3V0VHlwZSgpOwotCS8qKgotCSAqIFRvIGRldGVybWluZSB0aGUgdHlwZSwgc2VlIDxjb2RlPkVsZW1lbnQ6OmlzQnJlYWtpbmdCZWZvcmVFbGVtZW50KCk8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkVsZW1lbnQ6OmlzQnJlYWtpbmdBZnRlckVsZW1lbnQoKTwvY29kZT4gZGVmaW5lZCBpbiBDKytET00vRWxlbWVudC5jcHAuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldExpbmVCcmVha0hpbnQoKTsKLQkvKioKLQkgKiBUbyBkZXRlcm1pbmUgdGhlIHR5cGUsIENoZWNrIHRoZSBIVE1MIERURC4KLQkgKiBBbmQgbG9vayB1cCA8Y29kZT5HUk9VUF9OT0VORDwvY29kZT4gaW4gQysrRE9NL0RURFBhcnNlci5jcHAuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldE9taXRUeXBlKCk7Ci0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwCi0JICovCi0JQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpOwotCS8qKgotCSAqIHJldHVybiB0cnVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYSBKU1AgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzSlNQKCk7Ci0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpOwotCS8qKgotCSAqIFNvbWUgZWxlbWVudHMgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBjaGlsZCB0ZXh0IG5vZGVzLgotCSAqIEZvciBleGFtcGxlLCBQUkUgYW5kIFRFWFRBUkVBLiAgVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLAotCSAqIGlmIGEgdGFyZ2V0IGVsZW1lbnQgaXMgb25lIG9mIHN1Y2ggZWxlbWVudHMuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBzaG91bGRLZWVwU3BhY2VzKCk7Ci0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgaWYgPGNvZGU+bmV4dEVsZW1lbnQ8L2NvZGU+IHRlcm1pbmF0ZXMKLQkgKiB0aGUgY3VycmVudCBlbGVtZW50LgotCSAqIFNvbWUgZWxlbWVudHMgbGlrZSA8Y29kZT5QPC9jb2RlPiB0ZXJtaW5hdGVzIG90aGVyIDxjb2RlPlA8L2NvZGU+LgotCSAqIFRoYXQgaXMsIHdoZW4gPGNvZGU+Jmx0O1AmZ3Q7PC9jb2RlPiBhcHBlYXJzIGF0IHRoZSBuZXh0IHRvIDxjb2RlPlA8L2NvZGU+LAotCSAqIHdoaWNoIGVuZCB0YWdzIGlzIG9taXR0ZWQsIGl0IHJlcHJlc2VudHMgbm90IG9ubHkgdGhlIGJlZ2lubmluZyBvZiB0aGUKLQkgKiBuZXcgPGNvZGU+UDwvY29kZT4gZWxlbWVudCBidXQgYWxzbyB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyA8Y29kZT5QPC9jb2RlPi4KLQkgKi8KLQlib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlNDIxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEEgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChzaGFwZSAlU2hhcGU7IHJlY3QpCi0JICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBUlNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGTEFORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFViwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElSRUNUS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NIQVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPT1JEUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5BPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5BPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgYSA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7Ci0JCWlmIChhICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoYSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQUREUkVTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOWI3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQUREUkVTUyBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFERFJFU1MoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUywgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVBQTEVULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODI0NGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVBQTEVULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEFQUExFVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQVBQTEVUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQVBQTEVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFQUExFVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUEFSQU1fQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGNvZGViYXNlICVVUkk7ICNJTVBMSUVEKQotCSAqIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCSAqIChjb2RlIENEQVRBICNJTVBMSUVEKQotCSAqIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JICogKGFsdCAlVGV4dDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERUJBU0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVJDSElWRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAlYWxpZ247IC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVJFQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdlNmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVJFQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBBUkVBLgotICovCi1maW5hbCBjbGFzcyBIZWRBUkVBIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFSRUEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEFSRUEgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogKHNoYXBlICVTaGFwZTsgcmVjdCkKLQkgKiAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAobm9ocmVmIChub2hyZWYpICNJTVBMSUVEKQotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSEFQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT09SRFMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxN2RhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogQkFTRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkFTRSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCQVNFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfSElEREVOLgotCQkvLyBCZWNhdXNlLCBCQVNFIGlzIEdST1VQX0hJRERFTiBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIEJBU0UuCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBUkdFVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0VGT05ULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0VGT05ULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxY2NjZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBCQVNFRk9OVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkFTRUZPTlQgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkFTRUZPTlQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRUZPTlQsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfT0JKRUNUIC0gR1JPVVBfTk9XUkFQLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFRk9OVC4KLQkgKiAoaWQgSUQgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGxvY2FseSBkZWZpbmVkLgotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChmYWNlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GQUNFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHNpemUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGxvY2FseSBkZWZpbmVkLgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCRE8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkRPLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YzI2MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCRE8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogQkRPLgotICovCi1maW5hbCBjbGFzcyBIZWRCRE8gZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJETyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CRE8sIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAobGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAoZGlyIChsdHJ8cnRsKSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR307Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICAoZGlyIChsdHJ8cnRsKSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MVFIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JUTH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJUiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkdTT1VORC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCR1NPVU5ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjA4ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCR1NPVU5ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotCi0KLWZpbmFsIGNsYXNzIEhlZEJHU09VTkQgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQlwdWJsaWMgSGVkQkdTT1VORChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CR1NPVU5ELCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogKHNyYywgQ0RBVEEsICNJTVBMSUVEKQotCSAqIChsb29wLCBDREFUQSwgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQkvLyBzcmMKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQkJLy8gbG9vcAotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0lORklOSVRFKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJMT0NLUVVPVEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4N2IyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJMT0NLUVVPVEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQkxPQ0tRVU9URS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkxPQ0tRVU9URSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJMT0NLUVVPVEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkxPQ0tRVU9URSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNpdGUgJVVSSTsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0lURX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCT0RZLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJPRFkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1Mjk2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJPRFkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQk9EWS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQk9EWSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCT0RZKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWJvZHljb2xvcnM7Ci0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpIC4uIEQyMDU1MTQKLQkgKiAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uLiBEMjA1NTE0Ci0JICogKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChsZWZ0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uIEQyMDU1MTQKLQkgKiAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVib2R5Y29sb3JzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEJvZHljb2xvcnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05VTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwKLQkJLy8gPDxEMjA1NTE0Ci0JCQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RPUE1BUkdJTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1RUT01NQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEVGVE1BUkdJTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SSUdIVE1BUkdJTgotCQkvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEluY2x1c2lvbi4KLQkgKiAiTGF6eSBldmFsLiI8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0SW5jbHVzaW9uKCkgewotCQlpZiAoaW5jbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gaW5jbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gKElOU3xERUwpCi0JCWluY2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUx9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoaW5jbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGluY2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBCT0RZIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3NDlhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIEJSLgotICovCi1maW5hbCBjbGFzcyBIZWRCUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CUiwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9CUkVBSy4KLQkJLy8gQmVjYXVzZSwgQlIgaXMgR1JPVVBfQlJFQUsgaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JSRUFLOwotCX0KLQotCS8qKgotCSAqIEJSLgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGNsZWFyIChsZWZ0IHwgYWxsIHwgcmlnaHQgfCBub25lKSBub25lKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCQkvLyBjbGVhcgotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEVBUik7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCVVRUT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTJkMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCVVRUT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEJVVFRPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlVUVE9OIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlVUVE9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodHlwZSAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0KSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0JVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU1VCTUlULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SRVNFVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJRUxEU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSUZSQU1FfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldEZvcm1jdHJsKGV4Y2x1c2lvbik7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDQVBUSU9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENBUFRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3MDg2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENBUFRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogQ0FQVElPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ0FQVElPTiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ0FQVElPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGFsaWduICVDQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yQ2FwdGlvbigpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENFTlRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBhODc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQ0VOVEVSLgotICovCi1maW5hbCBjbGFzcyBIZWRDRU5URVIgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRDRU5URVIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4MWVkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIENPTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ09MIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQkxPQ0suCi0JCS8vIEJlY2F1c2UsIENPTCBpcyBHUk9VUF9CTE9DSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQ09MLgotCSAqICVhdHRyczsKLQkgKiAoc3BhbiBOVU1CRVIgMSkKLQkgKiAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNwYW4gTlVNQkVSIDEpCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1BBTn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICh3aWR0aCAlTXVsdGlMZW5ndGg7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5NVUxUSV9MRU5HVEgpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCi0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09MR1JPVVAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09MR1JPVVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmMjI5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTEdST1VQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIENPTEdST1VQLgotICovCi1maW5hbCBjbGFzcyBIZWRDT0xHUk9VUCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTEdST1VQLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSfTsKLQotCXB1YmxpYyBIZWRDT0xHUk9VUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ09MVU1OX0dST1VQOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChzcGFuIE5VTUJFUiAxKQotCSAqICh3aWR0aCAlTXVsdGlMZW5ndGg7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NQQU59OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTVVMVElfTEVOR1RIKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBMSSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDAyMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogREQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEREIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogREQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRESVYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRElWLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWExOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRESVYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBESVYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERJViBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERJVihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlYWxpZ247Ci0JICogJXJlc2VydmVkOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYWxpZ247Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCQkvLyAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRETC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY3ZWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogREwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERMIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RFRklOSVRJT05fTElTVDsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWFycmF5czsKLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNlODIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIERULgotICovCi1maW5hbCBjbGFzcyBIZWREVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRFQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRFQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NThhM2Q3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogRU1CRUQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEVNQkVEIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRU1CRUQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU1CRUQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNQkVEOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWV2ZW50czsKLQkgKiAoc3JjICVVUkk7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGxvb3AgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhpZGRlbiBDREFUQSAjSU1QTElFRCkKLQkgKiAodm9sdW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChhdXRvc3RhcnQgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCSAqIChhdXRvcGxheSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKGF1dG9zaXplICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAoY29udHJvbGxlciAodHJ1ZXxmYWxzZSkgdHJ1ZSkKLQkgKiAoc2NhbGUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNob3djb250cm9scyAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKHBsYXljb3VudCBOVU1CRVIgI0lNUExJRUQpCi0JICogKHJlcGVhdCBDREFUQSAjSU1QTElFRCkKLQkgKiAocGFuZWwgQ0RBVEEgI0lNUExJRUQpCi0JICogKHRleHQgQ0RBVEEgI0lNUExJRUQpCi0JICogKHBhbGV0dGUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHRleHRmb2N1cyBDREFUQSAjSU1QTElFRCkKLQkgKiAodHlwZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vICVldmVudHM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RXZlbnRzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ISURERU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVk9MVU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9TVEFSVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BVVRPUExBWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BVVRPU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05UUk9MTEVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDQUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NIT1dDT05UUk9MUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QTEFZQ09VTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVQRUFULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BBTkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RFWFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUEFMRVRURSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9URVhURk9DVVN9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkvLyAoc3JjICVVUkk7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0KLQkJLy8gKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gKHR5cGUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFbXB0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFbXB0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU4OThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRW1wdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBFTVBUWSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRFbXB0eSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEVtcHR5KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFk7Ci0JCS8vIEVNUFRZIHR5cGUgaGFzIG5vIGVuZCB0YWcuCi0JCW9taXRUeXBlID0gT01JVF9FTkRfTVVTVDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFTVBUWSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGI1ZTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRklFTERTRVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBGSUVMRFNFVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRklFTERTRVQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGSUVMRFNFVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRklFTERTRVQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPTlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2MTBiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPTlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogRk9OVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRk9OVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRk9OVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT05ULCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWkxOG47Ci0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChmYWNlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRkFDRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9STS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT1JNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzYwYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT1JNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGT1JNLgotICovCi1maW5hbCBjbGFzcyBIZWRGT1JNIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRk9STShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGFjdGlvbiAlVVJJOyAjUkVRVUlSRUQpCi0JICogKG1ldGhvZCAoR0VUfFBPU1QpIEdFVCkKLQkgKiAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKG9uc3VibWl0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnJlc2V0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAoYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDVElPTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NRVRIT0QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRU5DVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFUFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlNVQk1JVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlJFU0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBUkdFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5GT1JNPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5GT1JNPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgZm9ybSA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSk7Ci0JCWlmIChmb3JtICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoZm9ybSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODQ0Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBGUkFNRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkRlJBTUUgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRlJBTUUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUUsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfSElEREVOLgotCQkvLyBCZWNhdXNlLCBGUkFNRSBpcyBHUk9VUF9ISURERU4gaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBGUkFNRS4KLQkgKiAlY29yZWF0dHJzOwotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChub3Jlc2l6ZSAobm9yZXNpemUpICNJTVBMSUVEKQotCSAqIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT05HREVTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9SRVNJWkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMSU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SIC8vIEQyMDU1NAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRVNFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRVNFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM4OTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogRlJBTUVTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZSQU1FU0VUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRlJBTUVTRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZSQU1FU0VUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKHJvd3MgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb2xzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoZnJhbWVib3JkZXIgKHllc3xubykgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAoZnJhbWVzcGFjaW5nIENEQVRBICNJTVBMSUVEKSAuLi4gRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05VTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SLCAvLyBEMjA1NTE0Ci0JCQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVTUEFDSU5HIC8vIEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKHJvd3MgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTVVMVElfTEVOR1RIKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIGF0dHIpOwotCi0JCS8vIChjb2xzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFMsIGF0dHIpOwotCi0JCS8vIChmcmFtZWJvcmRlciAoeWVzfG5vKSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfWUVTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT307Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDQ3ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWZsb3c7KSogY29udGFpbmVycy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRmxvd0NvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZsb3dDb250YWluZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GTE9XX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGb250U3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRm9udFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzg3YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGb250U3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiAlZm9udHN0eWxlOwotICovCi1maW5hbCBjbGFzcyBIZWRGb250U3R5bGUgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZvbnRTdHlsZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQklHKSB8fCBlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCkpIHsKLQkJCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJfQotCQllbHNlIHsgLy8gQiwgSSwgVSwgLi4uCi0JCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRFVQTElDQVRFRDsKLQkJfQotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJU3RyaW5nIG15TmFtZSA9IGdldEVsZW1lbnROYW1lKCk7Ci0JCWlmICghbXlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRykgJiYgIW15TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCkpCi0JCQlyZXR1cm4gRU1QVFlfTUFQOwotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSEVBRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmMyZThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSEVBRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSEVBRCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIRUFEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hFQUQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SEVBRDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVpMThuOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnByb2ZpbGU8L3RkPjx0ZD5VUkk8L3RkPjx0ZD4jSU1QTElFRDwvdGQ+PHRkPk4vQTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCQkvLyBwcm9maWxlCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BST0ZJTEUpOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9GSUxFLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBIRUFEIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3MTU1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnMKLQkgKiAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG5vc2hhZGUgKG5vc2hhZGUpICNJTVBMSUVEKQotCSAqIChzaXplICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9TSEFERSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTE9SIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTIyMzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSFRNTCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUx9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhUTUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSFRNTDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IVE1MPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+PGNvZGU+JWkxOG47PC9jb2RlPjwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICAgIDx0ZD57QGxpbmsgUERDTURvY0ltcGwjZ2V0QXR0ckRlY2xhcmF0aW9uc0kxOG59PC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD52ZXJzaW9uPC90ZD48dGQ+Q0RBVEE8L3RkPjx0ZD4jRklYRUQ8L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIEhUTUxfVkVSU0lPTl9UUkFOU0lUSU9OQUx9PC90ZD48dGQ+ZGVwbGVjYXRlZCBpbiBIVE1MNC4wMTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JCS8vIHZlcnNpb24KLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWMgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkVSU0lPTik7Ci0JCWlmIChhZGVjICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqIEhUTUwgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhlYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyM2NlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhlYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBIWzEtNl0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhlYWRpbmcgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhlYWRpbmcoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IMTwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSUZSQU1FLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElGUkFNRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM2NzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSUZSQU1FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElGUkFNRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkSUZSQU1FIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSUZSQU1FKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklGUkFNRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGZyYW1lYm9yZGVyICgxfDApIDEpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHNjcm9sbGluZyAoeWVzfG5vfGF1dG8pIGF1dG8pCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPTkdERVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTldJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ1JPTExJTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRIfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTUcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTI5NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTUcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBJTUcuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElNRyBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTUcoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU1HLgotCSAqICVhdHRyczsKLQkgKiAoc3JjICVVUkk7ICNSRVFVSVJFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGFsdCAlVGV4dDsgI1JFUVVJUkVEKQotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPTkdERVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU01BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVBGSUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gYWxpZ24gKGxvY2FsKTsgc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y1YWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSU5QVVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElOUFVUIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElOUFVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU5QVVQuCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqIDw8RDIxNTY4NAotCSAqICh3aWR0aCBDREFUQTsgI0lNUExJRUQpCi0JICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JICogKGJvcmRlciBDREFUQTsgI0lNUExJRUQpCi0JICogRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyBOT1RFOiAlSW5wdXRUeXBlIGlzIEVOVU07Ci0JCS8vICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCQkvLyAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkFESU8sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0ZJTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0hJRERFTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSU1BR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0JVVFRPTn07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9URVhUKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0KLQkJLy8gKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHRyKTsKLQotCQkvLyAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hFQ0tFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRUFET05MWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWExFTkdUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU01BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TRUxFQ1QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRSwKLQkJLy88PEQyMTU2ODQKLQkJCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSCi0JCS8vPEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJU0lOREVYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWM3NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJU0lOREVYLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSVNJTkRFWC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSVNJTkRFWCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJU0lOREVYKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIElTSU5ERVguCi0JICogJWNvcmVhdHRyczsKLQkgKiAlaTE4bjsKLQkgKiAocHJvbXB0ICVUZXh0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9NUFQpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9NUFQsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJbmxpbmVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODEyYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJbmxpbmVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yICglaW5saW5lOykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZElubGluZUNvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICogSGVkSW5saW5lQ29udGFpbmVyLgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSGVkSW5saW5lQ29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMQUJFTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMQUJFTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWNiN2IzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogTEFCRUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExBQkVMIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMQUJFTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChmb3IgSURSRUYgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoZm9yIElEUkVGICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEUkVGKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GT1IsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkxBQkVMPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5MQUJFTDwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGxhYmVsID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTCk7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGxhYmVsKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxBQkVMfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEVHRU5ELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZkODY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEVHRU5ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIExFR0VORC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTEVHRU5EIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMRUdFTkQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5ELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChhbGlnbiAlTEFsaWduOyAjSU1QTElFRCkgLi4uIHNodWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JMZWdlbmQoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTJkYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogTEkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExJIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEl9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh2YWx1ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTElfU1RZTEUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkvLyAodmFsdWUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSU5LLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJTksuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlNTI2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJTksuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBMSU5LLgotICovCi1maW5hbCBjbGFzcyBIZWRMSU5LIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJTksoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIExJTksuCi0JICogJWF0dHJzOwotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaHJlZmxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEFSU0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRkxBTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFViwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NRURJQSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNDk3MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbGlzdCBpdGVtIGNvbnRhaW5lciBkZWNsYXJhdGlvbnMuCi0gKiAtIE9MLCBVTCwgTUVOVSwgRElSLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRMaXN0SXRlbUNvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExpc3RJdGVtQ29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTElfQ09OVEFJTkVSOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTAzNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0KLQotLyoqCi0gKiBNQVAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1BUCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1BUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NQVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX01BUDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChuYW1lIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVJRVUVFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Y2FkY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVJRVUVFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIE1BUlFVRUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1BUlFVRUUgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNQVJRVUVFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BUlFVRUUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGJlaGF2aW9yIChzY3JvbGx8c2xpZGV8YWx0ZXJuYXRlKSBzY3JvbGwpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0aW9uIChsZWZ0fHJpZ2h0fHVwfGRvd24pIGxlZnQpCi0JICogKGhlaWdodCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChsb29wIENEQVRBICNJTVBMSUVEKQotCSAqIChzY3JvbGxhbW91bnQgTlVNQkVSICNJTVBMSUVEKQotCSAqIChzY3JvbGxkZWxheSBOVU1CRVIgI0lNUExJRUQpCi0JICogKHZzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh3aWR0aCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHRydWVzcGVlZCAodHJ1ZXNwZWVkKSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JFSEFWSU9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElSRUNUSU9OLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMQU1PVU5ULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDUk9MTERFTEFZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RSVUVTUEVFRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChoZWlnaHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgYXR0cik7Ci0KLQkJLy8gKHdpZHRoIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0KLQkJLy8gKGhzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIGF0dHIpOwotCi0JCS8vICh2c3BhY2UgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRU5VLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1FTlUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1NzAzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1FTlUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE1FTlUvRElSLgotICovCi1maW5hbCBjbGFzcyBIZWRNRU5VIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FTlUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNRU5VL0RJUi4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT01QQUNUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPk1FTlUvRElSPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lYmxvY2s7PC9jb2RlPi4KLQkgKiAlYmxvY2s7IGlzOgotCSAqIFAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLQkgKiBOT1NDUklQVCB8IE5PRlJBTUVTIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBJU0lOREVYIHwgSFIgfAotCSAqIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTLgotCSAqICVoZWFkaW5nOyBpczogSDEgfCBIMiB8IEgzIHwgSDQgfCBINSB8IEg2LgotCSAqICVsaXN0OyBpcyA6IFVMIHwgT0wgfCBESVIgfCBNRU5VLgotCSAqICVwcmVmb3JtYXR0ZWQ7IGlzIFBSRS4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vICVibG9jazsKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1LCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDYsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1N9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVUQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiN2UwMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLS8qKgotICogTUVUQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUVUQSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNRVRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBNRVRBLgotCSAqICVpMThuOwotCSAqIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JICogKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCSAqIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hUVFBfRVFVSVYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ0hFTUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNYXJrQ2hhbmdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNYXJrQ2hhbmdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZmNDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogKElOU3xERUwpCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1hcmtDaGFuZ2VzIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTWFya0NoYW5nZXMoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNpdGUgJVVSSTsgI0lNUExJRUQpCi0JICogKGRhdGV0aW1lICVEYXRldGltZTsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0lURSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9EQVRFVElNRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9CUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNhMWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9CUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogTk9CUiAtLSBub3Qgc3RhbmRhcmQgdGFnIGJ1dCBpdCBpcyBjb21tb25seSB1c2VkLgotICovCi1maW5hbCBjbGFzcyBIZWROT0JSIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCi0JcHVibGljIEhlZE5PQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9CUiwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5DT1JSRUNUX0RVUExJQ0FURUQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQkvLyBObyBhdHRyaWJ1dGVzIGlzIGRlZmluZWQuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0VNQkVELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWQ1ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0VNQkVELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIE5PRU1CRUQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE5PRU1CRUQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWROT0VNQkVEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9GUkFNRVMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9GUkFNRVMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZDA0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIE5PRlJBTUVTLgotICovCi1maW5hbCBjbGFzcyBIZWROT0ZSQU1FUyBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE5PRlJBTUVTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9OT0ZSQU1FU19DT05URU5UOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPk5PRlJBTUVTPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5OT0ZSQU1FUzwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGxhYmVsID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUyk7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGxhYmVsKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FU307Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PU0NSSVBULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PU0NSSVBULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOWE0MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT1NDUklQVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE5PU0NSSVBULgotICovCi1maW5hbCBjbGFzcyBIZWROT1NDUklQVCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE5PU0NSSVBUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9CSkVDVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPQkpFQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyOWFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9CSkVDVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBPQkpFQ1QuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9CSkVDVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9CSkVDVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BBUkFNX0NPTlRBSU5FUjsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkuCi0JICogKGRlY2xhcmUgKGRlY2xhcmUpICNJTVBMSUVEKQotCSAqIChjbGFzc2lkICVVUkk7ICNJTVBMSUVEKQotCSAqIChjb2RlYmFzZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZGF0YSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChjb2RldHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCSAqIChzdGFuZGJ5ICVUZXh0OyAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJXJlc2VydmVkOyAuLi4gZW1wdHkuCi0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERUNMQVJFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTSUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERUJBU0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREFUQSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPREVUWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FSQ0hJVkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RBTkRCWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVVNFTUFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJLy8gJWFsaWduOyAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDI2ZjNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE9MLgotICovCi1maW5hbCBjbGFzcyBIZWRPTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT0wuCi0JICogKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICogKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAodHlwZSAlT0xTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk9MX1NUWUxFKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVEFSVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRHUk9VUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRHUk9VUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzY3MzQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUR1JPVVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBPUFRHUk9VUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkT1BUR1JPVVAgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPUFRHUk9VUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRHUk9VUCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUjsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKGxhYmVsICVUZXh0OyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAobGFiZWwgJVRleHQ7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFCRUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQUJFTCwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUSU9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY4YmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBPUFRJT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9QVElPTiBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OLgotCSAqICVhdHRyczsKLQkgKiAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAobGFiZWwgJVRleHQ7ICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NFTEVDVEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBQkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTYzN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkUCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIHRlcm1pbmF0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPlA8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYXR0cnM7PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWFsaWduOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICogPHA+PGI+JWFsaWduOzwvYj4gbWVhbnMgPGNvZGU+YWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICNJTVBMSUVEPC9jb2RlPi4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIDxjb2RlPmFsaWduPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSBvbmUgaW4KLQkgKiA8Y29kZT5JTUc8L2NvZGU+IG9yIDxjb2RlPlRBQkxFPC9jb2RlPi4gIFNvLCB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogb2YgPGNvZGU+YWxpZ248L2NvZGU+IHNob3VsZCBiZSBsb2NhbHkgY3JlYXRlZCBhbmQgaXQgc2hvdWxkbid0IGJlIHJlZ2lzdGVyZWQKLQkgKiBpbiBhIDxjb2RlPkhDTURvY0ltcGw8L2NvZGU+IGluc3RhbmNlLjwvcD4KLQkgKiA8cD5Ib3dldmVyLCAlYWxpZ24gaXMgdXNlZCBpbiBzZXZhcmFsIHRpbWVzLiAgSSB3b3VsZG4ndCB3cml0ZSBzYW1lIGNvZGUKLQkgKiBpbiBtYW55IHRpbWVzLiAgU28sIEkgYWRkIGEgbmV3IHV0aWxpdHkgbWV0aG9kIGludG8gPGNvZGU+Q01VdGlsPC9jb2RlPgotCSAqIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uLjwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGFkZWMgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBuYW1lcyBvZiB0ZXJtaW5hdG9ycy4KLQkgKiA8Y29kZT5QPC9jb2RlPiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCWlmICh0ZXJtaW5hdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JCS8vPDxEMjE3OTgyCi0JCXRlcm1pbmF0b3JzID0gbmV3IFZlY3RvcigpOwotCQl0ZXJtaW5hdG9ycy5hZGRBbGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZXNPZkJsb2NrKCkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJdGVybWluYXRvcnMuYWRkKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCXRlcm1pbmF0b3JzLmFkZChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQkvL0QyMTc5ODIKLQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUEFSQU0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUEFSQU0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0NGZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBBUkFNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIFBBUkFNLgotICovCi1maW5hbCBjbGFzcyBIZWRQQVJBTSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQQVJBTShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFBBUkFNLgotCSAqIChpZCBJRCAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWV0eXBlIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUVUWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUFJFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNmIyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogUFJFLgotICovCi1maW5hbCBjbGFzcyBIZWRQUkUgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICogUFJFIGVsZW1lbnQgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFBSRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0KLQkJa2VlcFNwYWNlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh3aWR0aCBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPlBSRTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JXByZS5leGNsdXNpb247PC9jb2RlPi4KLQkgKiAlcHJlLmV4Y2x1c2lvbiBpczoKLQkgKiBJTUcgfCBPQkpFQ1QgfCBBUFBMRVQgfCBCSUcgfCBTTUFMTCB8IFNVQiB8IFNVUCB8IEZPTlQgfCBCQVNFRk9OVAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFQUExFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNNQUxMLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1VCLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1VQLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9OVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0VGT05UfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGNkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE0YzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGNkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgUENEQVRBIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRQY2RhdGEgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQY2RhdGEoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogUENEQVRBIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQaHJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGhyYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NjFlMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQaHJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqICVwaHJhc2U7Ci0gKi8KLWZpbmFsIGNsYXNzIEhlZFBocmFzZSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUGhyYXNlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5DT1JSRUNUX0RVUExJQ0FURUQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTgyMzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBRLgotICovCi1maW5hbCBjbGFzcyBIZWRRIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRRKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlEsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRFVQTElDQVRFRDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNpdGUgJVVSSTsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NJVEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTQ1JJUFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0NSSVBULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzlhMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTQ1JJUFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBTQ1JJUFQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNDUklQVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNDUklQVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBTQ1JJUFQuCi0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobGFuZ3VhZ2UgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZGVmZXIgKGRlZmVyKSAjSU1QTElFRCkKLQkgKiAoZXZlbnQgQ0RBVEEgI0lNUExJRUQpCi0JICogKGZvciAlVVJJOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBUlNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREVGRVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVZFTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgInRleHQvamF2YXNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPlNDUklQVDwvY29kZT4gaXMgQ0RBVEEgdHlwZS4KLQkgKiBTbywgdGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ0RBVEEgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0VMRUNULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNFTEVDVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTNjM2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0VMRUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRTRUxFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTRUxFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNpemUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NVUxUSVBMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkNIQU5HRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNQQU4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1BBTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWFhYTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1BBTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBTUEFOLgotICovCi1maW5hbCBjbGFzcyBIZWRTUEFOIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIFNQQU4uCi0JICovCi0JcHVibGljIEhlZFNQQU4oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1BBTiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM4YmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgU1NJIGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkU1NJQmFzZSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lCYXNlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX1NTSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcE5hbWUpIHsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BOYW1lKTsKLQl9Ci0KLQkvKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMjkyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6Q09ORklHLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lDb25maWcgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lDb25maWcoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0NPTkZJRywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkNPTkZJRy4KLQkgKiAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCSAqICh0aW1lZm10IENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9FUlJNU0csIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRUZNVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9USU1FRk1UfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRWNoby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzVlNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpFQ0hPLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFY2hvIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRWNobyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkVDSE8KLQkgKiAodmFyIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUV4ZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjM2M4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUV4ZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkVYRUMuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUV4ZWMgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lFeGVjKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RVhFQwotCSAqIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JICogKGNtZCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0dJLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUZsYXN0bW9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUZsYXN0bW9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODM5NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGbGFzdG1vZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RkxBU1RNT0QuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUZsYXN0bW9kIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRmxhc3Rtb2QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZMQVNUTU9ELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RkxBU1RNT0QKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGc2l6ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGc2l6ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y3NTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRnNpemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkZTSVpFLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lGc2l6ZSBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUZzaXplKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZTSVpFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lJbmNsdWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOGE1NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lJbmNsdWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpJTkNMVURFLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lJbmNsdWRlIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJSW5jbHVkZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfSU5DTFVERSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOklOQ0xVREUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lQcmludGVudi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lQcmludGVudi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWMzMDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJUHJpbnRlbnYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBTU0k6UFJJTlRFTlYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVByaW50ZW52IGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJUHJpbnRlbnYoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLQotCS8qKgotCSAqIFNTSTpQUklOVEVOViBoYXMgbm8gYXR0cmlidXRlcy4gIFNvLCB0aGlzIG1ldGhvZCBzaG91bGQKLQkgKiBhbHdheXMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIE5vdGU6IFNpbmNlIHNvbWVib2R5IGRvZXNuJ3QgZXhwZWN0IG51bGwgaXMgcmV0dXJuZWQsIHJldHVybiB0aGUgZW1wdHkgYXR0cmlidXRlCi0JICogbGlrZSBhIGN1c3RvbSB0YWcgd2hpY2ggZG9lc24ndCBoYXZlIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGM0MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOlNFVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJU2V0IGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJU2V0KEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9TRVQsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpTRVQKLQkgKiAodmFyIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1RZTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1RZTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4MmQ1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBTVFlMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1RZTEUgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTVFlMRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ0RBVEE7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFNUWUxFCi0JICogJWkxOG47Ci0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkgKiAodGl0bGUgJVRleHQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FRElBLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RJVExFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiA8Y29kZT5TVFlMRTwvY29kZT4gaXMgQ0RBVEEgY29udGVudCB0eXBlLiAgU28sIGl0IGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENEQVRBIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNjcmlwdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU2NyaXB0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWIyMGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU2NyaXB0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFNVQiBhbmQgU1VQLgotICovCi1maW5hbCBjbGFzcyBIZWRTY3JpcHRzIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTY3JpcHRzKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEFCTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEFCTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhZWE1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRBQkxFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogVEFCTEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRBQkxFIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVEFCTEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RBQkxFOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVEFCTEUuCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsKLQkgKiAoc3VtbWFyeSAlVGV4dDsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGZyYW1lICVURnJhbWU7ICNJTVBMSUVEKQotCSAqIChydWxlcyAlVFJ1bGVzOyAjSU1QTElFRCkKLQkgKiAoY2VsbHNwYWNpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNlbGxwYWRkaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChhbGlnbiAlVEFsaWduOyAjSU1QTElFRCkKLQkgKiAoYmdjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChkYXRhcGFnZXNpemUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlcmVzZXJ2ZWQ7Ci0JCS8vIC4uLiAlcmVzZXJ2ZWQ7IGlzIGVtcHR5IGluIHRoZSBjdXJyZW50IERURC4KLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NVTU1BUlksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JVTEVTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NFTExTUEFDSU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NFTExQQURESU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREFUQVBBR0VTSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CQUNLR1JPVU5ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIGFsaWduVmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGFsaWduVmFsdWVzKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhZGVjID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiMGY1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFRFWFRBUkVBLgotICovCi1maW5hbCBjbGFzcyBIZWRURVhUQVJFQSBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQkvKioKLQkgKiBURVhUQVJFQSBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkVEVYVEFSRUEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBURVhUQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFQURPTkxZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlNFTEVDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkNIQU5HRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUSVRMRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUSVRMRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThjZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUSVRMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVElUTEUgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRJVExFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogVElUTEUuCi0JICogJWkxOG47Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5USVRMRTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWhlYWQubWlzYzs8L2NvZGU+LgotCSAqICVoZWFkLm1pc2M7IGlzIDxjb2RlPlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCkKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMTVjZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogVFIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRSIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFJ9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQ0VMTF9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChoZWlnaHQgJUxlbmd0aCAjSU1QTElFRCkgYnVnMjI0NgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkdDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CQUNLR1JPVU5ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFRSIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVCb2R5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDJlNmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBUSEVBRC9URk9PVC9UQk9EWQotICovCi1maW5hbCBjbGFzcyBIZWRUYWJsZUJvZHkgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVAsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1R9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRhYmxlQm9keShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RSX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpZiAoZWxlbWVudE5hbWUgPT0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB7Ci0JCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQkJfQotCQllbHNlIHsKLQkJCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JCX0KLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRCT0RZL1RGT09UL1RIRUFECi0JICogJWF0dHJzOwotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIFRIRUFELCBURk9PVCBhbmQgVEJPRFkgaGF2ZSB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVDZWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc5MWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVDZWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiAoVEggfCBURCkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRhYmxlQ2VsbCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEgsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVGFibGVDZWxsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhYmJyICVUZXh0OyAjSU1QTElFRCkKLQkgKiAoYXhpcyBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGVhZGVycyBJRFJFRlMgI0lNUExJRUQpCi0JICogKHNjb3BlICVTY29wZTsgI0lNUExJRUQpCi0JICogKHJvd3NwYW4gTlVNQkVSIDEpCi0JICogKGNvbHNwYW4gTlVNQkVSIDEpCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICogKG5vd3JhcCAobm93cmFwKSAjSU1QTElFRCkKLQkgKiAoYmdjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQkJSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FYSVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVBREVSUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ST1dTUEFOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFNQQU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9XUkFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JBQ0tHUk9VTkQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSQ09MT1IgLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUSCBhbmQgVEQgaGF2ZSB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NGU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogVUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFVMIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFVMKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBVTC4KLQkgKiAodHlwZSAlVUxTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAodHlwZSAlVUxTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyAlVUxTdHlsZTsgaXMgKGRpc2N8c3F1YXJlfGNpcmNsZSkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0RJU0MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NRVUFSRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0lSQ0xFfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT01QQUNUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFdCUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0ZTU0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFdCUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotZmluYWwgY2xhc3MgSGVkV0JSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JcHVibGljIEhlZFdCUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5XQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIHNhbWUgYXMgQlIuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQkvLyBObyBhdHRyaWJ1dGVzIGlzIGRlZmluZWQuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjBkNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ01Eb2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgQ01Eb2N1bWVudCBmb3IgdGhlIEpTUCAxLjEuCi0gKi8KLWNsYXNzIEpDTURvY0ltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSlNQQ01Eb2N1bWVudCB7Ci0KLQkvKiogTmFtZXNwYWNlIGZvciBhbGwgbmFtZXMgb2YgZWxlbWVudHMsIGVudGl0aWVzIGFuZCBhdHRyaWJ1dGVzLiAqLwotCXByaXZhdGUgQ01OYW1lc3BhY2VJbXBsIG5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBKU1BFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBIQ01Eb2NJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQllbGVtZW50cyA9IG5ldyBKU1BFbGVtZW50Q29sbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMTFOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMTFOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmZmYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDExTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0vKioKLSAqIEpTUCAxLjEgTmFtZXNwYWNlLiBOb3RlLCB0aGlzIGludGVyZmFjZSB3YXMgCi0gKiBjb3BpZWQgZm9ybSBKU1AgY29yZSBwYWNrYWdlcy4gT25lIGltcGxpY2F0aW9uIAotICogaXMgdGhhdCBleHRyYSBjYXJlIGlzIG5lZWRlZCBpbiB1c2luZyAnPT0nIGluc3RlYWQgCi0gKiBvZiAnLmVxdWFscycuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTFOYW1lc3BhY2UgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgewotCQkvLyBFbGVtZW50IG5hbWVzCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVExFVCA9ICJqc3A6c2NyaXB0bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OID0gImpzcDpleHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTiA9ICJqc3A6ZGVjbGFyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9QQUdFID0gImpzcDpkaXJlY3RpdmUucGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX0lOQ0xVREUgPSAianNwOmRpcmVjdGl2ZS5pbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfVEFHTElCID0gImpzcDpkaXJlY3RpdmUudGFnbGliIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VCRUFOID0gImpzcDp1c2VCZWFuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRQUk9QRVJUWSA9ICJqc3A6c2V0UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVFBST1BFUlRZID0gImpzcDpnZXRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERSA9ICJqc3A6aW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRCA9ICJqc3A6Zm9yd2FyZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gImpzcDpwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNUyA9ICJqc3A6cGFyYW1zIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxMQkFDSyA9ICJqc3A6ZmFsbGJhY2siOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNID0gImpzcDpwYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICJqc3A6cm9vdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJqc3A6dGV4dCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1AxMV9VUkkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9UQUdfUFJFRklYID0gImpzcCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBhdHRyaWJ1dGUgbmFtZXMKLQkvLyAgIGRpcmVjdGl2ZS5wYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xBTkdVQUdFID0gImxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FWFRFTkRTID0gImV4dGVuZHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSA9ICJjb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSU1QT1JUID0gImltcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0VTU0lPTiA9ICJzZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CVUZGRVIgPSAiYnVmZmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPRkxVU0ggPSAiYXV0b0ZsdXNoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSA9ICJpc1RocmVhZFNhZmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lORk8gPSAiaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVJST1JfUEFHRSA9ICJlcnJvclBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lTX0VSUk9SX1BBR0UgPSAiaXNFcnJvclBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcgPSAicGFnZUVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZGlyZWN0aXZlLmluY2x1ZGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRklMRSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZGlyZWN0aXZlLnRhZ2xpYgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUkVGSVggPSAicHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCS8vICAgdXNlQmVhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CRUFOX05BTUUgPSAiYmVhbk5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHNldFByb3BlcnR5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQVJBTSA9ICJwYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGluY2x1ZGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GTFVTSCA9ICJmbHVzaCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHBsdWdpbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFID0gImNvZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREVCQVNFID0gImNvZGViYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTElHTiA9ICJhbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVJDSElWRSA9ICJhcmNoaXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IRUlHSFQgPSAiaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IU1BBQ0UgPSAiaHNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9KUkVWRVJTSU9OID0gImpyZXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZTUEFDRSA9ICJ2c3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gIndpZHRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OU1BMVUdJTlVSTCA9ICJuc3BsdWdpbnVybCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSUVQTFVHSU5VUkwgPSAiaWVwbHVnaW51cmwiOyAvLyROT04tTkxTLTEkCi0JLy8gICByb290Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1hNTE5TX0pTUCA9ICJ4bWxuczpqc3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBhdHRyaWJ1dGUgdmFsdWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0pBVkEgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NUX0RFRkFVTFQgPSAidGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiOy8vRDE5NTM2NiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CVUZTSVpfREVGQVVMVCA9ICI4a2IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TRVNTSU9OID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVFVRVNUID0gInJlcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JFQU4gPSAiYmVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FQUExFVCA9ICJhcHBsZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSAidG9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gIm1pZGRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0pWRVIxMSA9ICIxLjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9YTUxOU19KU1AgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQQ01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2YzN2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQQ01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogSlNQIGV4dGVuc2lvbiBmb3IgQ01Eb2N1bWVudC4KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHNvbWUgc2hvcnQgaGFuZCBtZXRob2RzIHRvIGdldCBkZWNsYXJhdGlvbnMKLSAqIGJ5IGEgbmFtZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BDTURvY3VtZW50IGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50IHsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgYSBKU1AgZWxlbWVudC4KLQkgKiBKU1AgZGVjbGFyYXRpb24gY2xhc3MgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGludGVyZmFjZS4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50TmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BFbGVtZW50Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BFbGVtZW50Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmVmYTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQRWxlbWVudENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiB0aGUgSlNQIDEuMS4KLSAqLwotZmluYWwgY2xhc3MgSlNQRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JcHJpdmF0ZSBjbGFzcyBUeXBlUGFja2V0IHsKLQkJcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLQkJcHVibGljIGludCBjb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFk7Ci0JCXB1YmxpYyBpbnQgb21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FOwotCQlwdWJsaWMgaW50IGxpbmVCcmVhayA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJcHVibGljIGludCBsYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9OT05FOwotCQlwdWJsaWMgaW50IGNvcnJlY3QgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkNPUlJFQ1RfTk9ORTsKLQkJcHVibGljIGludCBmb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9YTUw7Ci0JCXB1YmxpYyBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0KLQkJcHVibGljIFR5cGVQYWNrZXQoKSB7Ci0JCX0KLQl9Ci0KLQkvKiogSlNQIGVsZW1lbnQgZGVjbGFyYXRpb24uICovCi0JcHJpdmF0ZSBjbGFzcyBFbGVtRGVjbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0JCXByaXZhdGUgVHlwZVBhY2tldCB0eXBlID0gbnVsbDsKLQkJcHJpdmF0ZSBDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG51bGw7Ci0KLQkJcHVibGljIEVsZW1EZWNsKFR5cGVQYWNrZXQgdCkgewotCQkJc3VwZXIodC5uYW1lLCAxLCAxKTsKLQkJCXR5cGUgPSB0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Q29udGVudChDTUdyb3VwSW1wbCBncm91cCkgewotCQkJY29udGVudCA9IGdyb3VwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhDTU5hbWVkTm9kZU1hcEltcGwgYXR0cnMpIHsKLQkJCWF0dHJpYnV0ZXMgPSBhdHRyczsKLQkJfQotCi0JCS8vIGltcGxlbWVudGVzIENNTm9kZQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHBwID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gcHAuc3VwcG9ydHModGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7IC8vRDIwODgzOQotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCQlTdHJpbmcgbXlOYW1lID0gZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQlpZiAobXlOYW1lID09IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTikgewotCQkJCQlyZXR1cm4gZ2V0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7IC8vIG91dGVyIGNsYXNzIG1ldGhvZC4KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobXlOYW1lID09IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUykgewotCQkJCQlyZXR1cm4gZ2V0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsgLy8gb3V0ZXIgY2xhc3MgbWV0aG9kLgotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHBwID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiBwcC5nZXQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbXBsZW1lbnRlcyBDTUVsZW1lbnREZWNsYXJhdGlvbgotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGVzOwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQkJcmV0dXJuIGNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUuY29udGVudDsKLQkJfQotCi0JCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaW1wbGVtZW50ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQkJcmV0dXJuIHR5cGUuY29ycmVjdDsKLQkJfQotCi0JCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCQlyZXR1cm4gRU1QVFlfTUFQOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRGb3JtYXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUuZm9ybWF0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMYXlvdXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUubGF5b3V0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMaW5lQnJlYWtIaW50KCkgewotCQkJcmV0dXJuIHR5cGUubGluZUJyZWFrOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRPbWl0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLm9taXQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGRlYykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlcygpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQkJcmV0dXJuIHR5cGUuaW5kZW50Q2hpbGQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0pTUCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLy8gZWxlbWVudCBJRHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFRMRVQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWFBSRVNTSU9OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVDTEFSQVRJT04gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfUEFHRSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9JTkNMVURFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBR0xJQiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VTRUJFQU4gPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRVRQUk9QRVJUWSA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFVFBST1BFUlRZID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5DTFVERSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUldBUkQgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVR0lOID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNUyA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GQUxMQkFDSyA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ST09UID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFQgPSAxNjsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8vIGF0dHJpYnV0ZSBjcmVhdGVyCi0JcHJpdmF0ZSBjbGFzcyBKQUNyZWF0ZXIgaW1wbGVtZW50cyBKU1AxMU5hbWVzcGFjZSB7Ci0JCS8vIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCQlwcml2YXRlIGNsYXNzIEF0dHJEZWNsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0JCQlIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JCQlpbnQgdXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCi0JCQkvLyBtZXRob2RzCi0JCQlwdWJsaWMgQXR0ckRlY2woU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCQkJc3VwZXIoYXR0ck5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJCQlyZXR1cm4gdHlwZTsKLQkJCX0KLQotCQkJLyoqIEBkZXByZWNhdGVkIGJ5IHN1cGVyY2xhc3MgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCWlmICh0eXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQl9Ci0KLQkJCS8qKiBAZGVwcmVjYXRlZCAgYnkgc3VwZXJjbGFzcyAqLwotCQkJcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQkJCVZlY3RvciB2ID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpKSk7Ci0JCQkJcmV0dXJuIHYuZWxlbWVudHMoKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJCQlyZXR1cm4gdXNhZ2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgSkFDcmVhdGVyKCkgewotCQkJZGVjbGFyYXRpb25zID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXREZWNsYXJhdGlvbnMoaW50IGVpZCkgewotCQkJc3dpdGNoIChlaWQpIHsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJCWNyZWF0ZUZvckRpclBhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JEaXJJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCQljcmVhdGVGb3JEaXJUYWdsaWIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfVVNFQkVBTiA6Ci0JCQkJCWNyZWF0ZUZvclVzZUJlYW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfU0VUUFJPUEVSVFkgOgotCQkJCQljcmVhdGVGb3JTZXRQcm9wZXJ0eSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9HRVRQUk9QRVJUWSA6Ci0JCQkJCWNyZWF0ZUZvckdldFByb3BlcnR5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCQljcmVhdGVGb3JGb3J3YXJkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJCWNyZWF0ZUZvclBsdWdpbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9QQVJBTSA6Ci0JCQkJCWNyZWF0ZUZvclBhcmFtKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCQljcmVhdGVGb3JSb290KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQkvLyBzaG91bGQgd2Fybi4KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCQl9Ci0KLQkJcHJpdmF0ZSBBdHRyRGVjbCBjcmVhdGVCb29sVHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZlZhbHVlKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKG5hbWUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgZGVmVmFsdWUpOwotCQkJcmV0dXJuIGFkZWM7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyUGFnZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBudWxsOwotCQkJLy8gKCJsYW5ndWFnZSIgQ0RBVEEgREVDTEFSRUQgImphdmEiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfSkFWQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MQU5HVUFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiZXh0ZW5kcyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0VYVEVORFMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VYVEVORFMsIGFkZWMpOwotCi0JCQkvLyAoImNvbnRlbnRUeXBlIiBDREFUQSBERUNMQVJFRCAidGV4dC9odG1sOyBJU08tODg1OS0xIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9DVF9ERUZBVUxUKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSwgYWRlYyk7Ci0KLQkJCS8vICgiaW1wb3J0IiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSU1QT1JUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTVBPUlQsIGFkZWMpOwotCi0JCQkvLyAoInNlc3Npb24iIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0VTU0lPTiwgYWRlYyk7Ci0KLQkJCS8vICgiYnVmZmVyIiBDREFUQSBERUNMQVJFRCAiOGtiIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0JVRkZFUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9CVUZTSVpfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CVUZGRVIsIGFkZWMpOwotCi0JCQkvLyAoImF1dG9GbHVzaCIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9BVVRPRkxVU0gsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FVVE9GTFVTSCwgYWRlYyk7Ci0KLQkJCS8vICgiaXNUaHJlYWRTYWZlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFLCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgYWRlYyk7Ci0KLQkJCS8vICgiaW5mbyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lORk8pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lORk8sIGFkZWMpOwotCi0JCQkvLyAoImVycm9yUGFnZSIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FUlJPUl9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiaXNFcnJvclBhZ2UiIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJmYWxzZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX0VSUk9SX1BBR0UsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJwYWdlRW5jb2RpbmciIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HLCBhZGVjKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpckluY2x1ZGUoKSB7Ci0JCQkvLyAoImZpbGUiIFVSSSBSRVFVSVJFRCk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRklMRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRklMRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyVGFnbGliKCkgewotCQkJLy8gKCJ1cmkiIFVSSSBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1VSSSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVVJJLCBhZGVjKTsKLQotCQkJLy8gKCJwcmVmaXgiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJFRklYKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BSRUZJWCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yVXNlQmVhbigpIHsKLQkJCS8vICgiaWQiIElEIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSUQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSUQsIGFkZWMpOwotCi0JCQkvLyAoInNjb3BlIiBFTlVNIERFQ0xBUkVEIChwYWdlfHNlc3Npb258cmVxdWVzdHxhcHBsaWNhdGlvbikgInBhZ2UiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfU0NPUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUEFHRSwgQVRUUl9WQUxVRV9TRVNTSU9OLCBBVFRSX1ZBTFVFX1JFUVVFU1QsIEFUVFJfVkFMVUVfQVBQTElDQVRJT059OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfUEFHRSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TQ09QRSwgYWRlYyk7Ci0KLQkJCS8vICgiY2xhc3MiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DTEFTUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ0xBU1MsIGFkZWMpOwotCi0JCQkvLyAoImJlYW5OYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQkVBTl9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CRUFOX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInR5cGUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JTZXRQcm9wZXJ0eSgpIHsKLQkJCS8vICgibmFtZSIgSURSRUYgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRFJFRik7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInByb3BlcnR5IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BST1BFUlRZKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BST1BFUlRZLCBhZGVjKTsKLQotCQkJLy8gKCJ2YWx1ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZBTFVFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WQUxVRSwgYWRlYyk7Ci0KLQkJCS8vICgicGFyYW0iIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQVJBTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFSQU0sIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yR2V0UHJvcGVydHkoKSB7Ci0JCQkvLyAoIm5hbWUiIElEUkVGIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSURSRUYpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJwcm9wZXJ0eSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QUk9QRVJUWSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUk9QRVJUWSwgYWRlYyk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JJbmNsdWRlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG51bGw7Ci0JCQkvLyAoInBhZ2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImZsdXNoIiBFTlVNIFJFUVVJUkVEICh0cnVlfGZhbHNlKSk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRkxVU0gpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GTFVTSCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRm9yd2FyZCgpIHsKLQkJCS8vICgicGFnZSIgVVJJIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGx1Z2luKCkgewotCQkJLy8gKCJ0eXBlIiBFTlVNIFJFUVVJUkVEIChiZWFufGFwcGxldCkpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQkVBTiwgQVRUUl9WQUxVRV9BUFBMRVR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGUiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZWJhc2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREVCQVNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFQkFTRSwgYWRlYyk7Ci0KLQkJCS8vICgiYWxpZ24iIEVOVU0gSU1QTElFRCAodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BTElHTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhbGlnbnMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKGFsaWducyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0KLQkJCS8vICgiYXJjaGl2ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FSQ0hJVkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FSQ0hJVkUsIGFkZWMpOwotCi0JCQkvLyAoImhlaWdodCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hFSUdIVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhZGVjKTsKLQotCQkJLy8gKCJoc3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgianJldmVyc2lvbiIgQ0RBVEEgREVDTEFSRUQgIjEuMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9KUkVWRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pWRVIxMSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9KUkVWRVJTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJuYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidnNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVlNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoIndpZHRoIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfV0lEVEgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1dJRFRILCBhZGVjKTsKLQotCQkJLy8gKCJuc3BsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05TUExVR0lOVVJMLCBhZGVjKTsKLQotCQkJLy8gKCJpZXBsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lFUExVR0lOVVJMLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JQYXJhbSgpIHsKLQkJCS8vICgibmFtZSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInZhbHVlIiBDREFUQSBSRVFVSVJFRCk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkFMVUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkFMVUUsIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUm9vdCgpIHsKLQkJCS8vICgieG1sbnM6anNwIiBDREFUQSAiaHR0cDovL2p2YS5zdW4uY29tL0pTUC9QYWdlIikKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1hNTE5TX0pTUCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9YTUxOU19KU1ApOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfWE1MTlNfSlNQLCBhZGVjKTsKLQkJCS8vICgidmVyc2lvbiIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ01OYW1lZE5vZGVNYXAgRU1QVFlfTUFQID0gbmV3IENNTmFtZWROb2RlTWFwKCkgewotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfU0NSSVBUTEVUXSA9IFNDUklQVExFVDsKLQkJbmFtZXNbSWRzLklEX0VYUFJFU1NJT05dID0gRVhQUkVTU0lPTjsKLQkJbmFtZXNbSWRzLklEX0RFQ0xBUkFUSU9OXSA9IERFQ0xBUkFUSU9OOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX1BBR0VdID0gRElSRUNUSVZFX1BBR0U7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERV0gPSBESVJFQ1RJVkVfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9UQUdMSUJdID0gRElSRUNUSVZFX1RBR0xJQjsKLQkJbmFtZXNbSWRzLklEX1VTRUJFQU5dID0gVVNFQkVBTjsKLQkJbmFtZXNbSWRzLklEX1NFVFBST1BFUlRZXSA9IFNFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfR0VUUFJPUEVSVFldID0gR0VUUFJPUEVSVFk7Ci0JCW5hbWVzW0lkcy5JRF9JTkNMVURFXSA9IElOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9GT1JXQVJEXSA9IEZPUldBUkQ7Ci0JCW5hbWVzW0lkcy5JRF9QTFVHSU5dID0gUExVR0lOOwotCQluYW1lc1tJZHMuSURfUEFSQU1TXSA9IFBBUkFNUzsKLQkJbmFtZXNbSWRzLklEX0ZBTExCQUNLXSA9IEZBTExCQUNLOwotCQluYW1lc1tJZHMuSURfUEFSQU1dID0gUEFSQU07Ci0JCW5hbWVzW0lkcy5JRF9ST09UXSA9IFJPT1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUXSA9IFRFWFQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEpTUEVsZW1lbnRDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVFbGVtRGVjbChnZXRJRChlbGVtZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQgaW50Ci0JICovCi0JcHJpdmF0ZSBDTUdyb3VwSW1wbCBjcmVhdGVDb250ZW50KGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JCUNNTm9kZSBjaGlsZCA9IG51bGw7Ci0KLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX0lOQ0xVREUgOgotCQkJY2FzZSBJZHMuSURfRk9SV0FSRCA6Ci0JCQkJLy8gKGpzcDpwYXJhbSkqCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9QQVJBTSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUExVR0lOIDoKLQkJCQkvLyAoanNwOnBhcmFtcyB8IGpzcDpmYWxsYmFjayk/Ci0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgMSk7Ci0JCQkJLy8ganNwOnBhcmFtcwotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfUEFSQU1TKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJLy8ganNwOmZhbGxiYWNrCi0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9GQUxMQkFDSyk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUEFSQU1TIDoKLQkJCQkvLyAoanNwOnBhcmFtKSsKLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJCQljaGlsZCA9IGl0ZW0oSWRzLklEX1BBUkFNKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQkvLyAlQm9keTsKLQkJCQkvLyAtLT4gKGpzcDp0ZXh0fCVEaXJlY3RpdmVzO3wlU2NyaXB0czt8JUFjdGlvbnM7KSoKLQkJCQkvLyAgICAgJURpcmVjdGl2ZXMgLS0+IGpzcDpkaXJlY3RpdmUucGFnZXxqc3A6ZGlyZWN0aXZlLmluY2x1ZGUKLQkJCQkvLyAgICAgJVNjcmlwdHM7IC0tPiBqc3A6c2NyaXB0bGV0fGpzcDpkZWNsYXJhdGlvbnxqc3A6ZXhwcmVzc2lvbgotCQkJCS8vICAgICAlQWN0aW9ucyAtLT4ganNwOnVzZUJlYW58anNwLnNldFByb3BlcnR5fGpzcDpnZXRQcm9wZXJ0eQotCQkJCS8vICAgICAgICAgICAgICAgICAgfGpzcDppbmNsdWRlfGpzcDpmb3J3YXJkfGpzcDpwbHVnaW4KLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJaW50IHZhbGlkQ2hpbGRyZW5bXSA9IHtJZHMuSURfVEVYVCwKLQkJCQkvLyAlRGlyZWN0dmVzOwotCQkJCQkJCUlkcy5JRF9ESVJFQ1RJVkVfUEFHRSwgSWRzLklEX0RJUkVDVElWRV9JTkNMVURFLAotCQkJCQkJCS8vICVTY3JpcHRzOwotCQkJCQkJCUlkcy5JRF9TQ1JJUFRMRVQsIElkcy5JRF9ERUNMQVJBVElPTiwgSWRzLklEX0VYUFJFU1NJT04sCi0JCQkJCQkJLy8gJUFjdGlvbnM7Ci0JCQkJCQkJSWRzLklEX1VTRUJFQU4sIElkcy5JRF9TRVRQUk9QRVJUWSwgSWRzLklEX0dFVFBST1BFUlRZLCBJZHMuSURfSU5DTFVERSwgSWRzLklEX0ZPUldBUkQsIElkcy5JRF9QTFVHSU59OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQljaGlsZCA9IGl0ZW0odmFsaWRDaGlsZHJlbltpXSk7Ci0JCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZCBpbnQKLQkgKi8KLQlwcml2YXRlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbURlY2woaW50IGVpZCkgewotCQlpZiAoZWlkID09IElEX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlUeXBlUGFja2V0IHBhY2tldCA9IG5ldyBUeXBlUGFja2V0KCk7Ci0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIElkcy5JRF9TQ1JJUFRMRVQgOgotCQkJCS8vIGNvbnRlbnQsIG9taXQsIGxpbmVCcmVhaywgbGF5b3V0LCBjb3JyZWN0LCBmb3JtYXQKLQkJCQkvLyBzY3JpcHRsZXQKLQkJCQlwYWNrZXQubmFtZSA9IFNDUklQVExFVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9FWFBSRVNTSU9OIDoKLQkJCQkvLyBleHByZXNzaW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBFWFBSRVNTSU9OOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RFQ0xBUkFUSU9OIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gREVDTEFSQVRJT047Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1BBR0UgOgotCQkJCS8vIGRpcmVjdGl2ZS5wYWdlCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfUEFHRTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9JTkNMVURFIDoKLQkJCQkvLyBkaXJlY3RpdmUuaW5sY3VkZQotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX0lOQ0xVREU7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfVEFHTElCIDoKLQkJCQkvLyBkaXJlY3RpdmUudGFnbGliCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfVEFHTElCOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfVVNFQkVBTiA6Ci0JCQkJLy8gdXNlQmVhbgotCQkJCXBhY2tldC5uYW1lID0gVVNFQkVBTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9TRVRQUk9QRVJUWSA6Ci0JCQkJLy8gc2V0UHJvcGVydHkKLQkJCQlwYWNrZXQubmFtZSA9IFNFVFBST1BFUlRZOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfR0VUUFJPUEVSVFkgOgotCQkJCS8vIGdldFByb3BlcnR5Ci0JCQkJcGFja2V0Lm5hbWUgPSBHRVRQUk9QRVJUWTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0lOQ0xVREUgOgotCQkJCS8vIGluY2x1ZGUKLQkJCQlwYWNrZXQubmFtZSA9IElOQ0xVREU7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9GT1JXQVJEIDoKLQkJCQkvLyBmb3J3YXJkCi0JCQkJcGFja2V0Lm5hbWUgPSBGT1JXQVJEOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUExVR0lOIDoKLQkJCQkvLyBwbHVnaW4KLQkJCQlwYWNrZXQubmFtZSA9IFBMVUdJTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUEFSQU1TIDoKLQkJCQkvLyBwYXJhbXMKLQkJCQlwYWNrZXQubmFtZSA9IFBBUkFNUzsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRkFMTEJBQ0sgOgotCQkJCS8vIGZhbGxiYWNrCi0JCQkJcGFja2V0Lm5hbWUgPSBGQUxMQkFDSzsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QQVJBTSA6Ci0JCQkJLy8gcGFyYW0KLQkJCQlwYWNrZXQubmFtZSA9IFBBUkFNOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJcGFja2V0Lm5hbWUgPSBST09UOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOyAvLyBzYW1lIGFzIEhUTUwKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1RFWFQgOgotCQkJCXBhY2tldC5uYW1lID0gVEVYVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHVua25vd24gSUQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUVsZW1EZWNsIGRlYyA9IG5ldyBFbGVtRGVjbChwYWNrZXQpOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50KGVpZCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlkZWMuc2V0Q29udGVudChjb250ZW50KTsKLQotCQlKQUNyZWF0ZXIgY3JlYXRlciA9IG5ldyBKQUNyZWF0ZXIoKTsKLQkJZGVjLnNldEF0dHJpYnV0ZXMoY3JlYXRlci5nZXREZWNsYXJhdGlvbnMoZWlkKSk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljYmE0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotLyoqCi0gKiBQcm9wZXJ0eVByb3ZpZGVyIGNsYXNzLgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2VzLgotICovCi1pbnRlcmZhY2UgUHJvcGVydHlQcm92aWRlciB7Ci0KLQlib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotCi0JT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTI2MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLS8qKgotICogVGhlIGZhY3Rvcnkgb2JqZWN0IG9mIFByb3BlcnR5UHJvdmlkZXIuCi0gKi8KLWZpbmFsIGNsYXNzIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogRGVmYXVsdFByb3ZpZGVyIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHVua25vd24gcHJvcGVydGllcy4KLQkgKiBJdCBhbHdheXMgcmV0dXJucyBudWxsIHZhbHVlIGZvciBhbnkgcHJvcGVydGllcy4KLQkgKi8KLQljbGFzcyBEZWZhdWx0UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIERlZmF1bHRQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIChlZGVjbCAhPSBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCWlmICghKGVkZWNsIGluc3RhbmNlb2YgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGdldEVsZW1lbnRQcm9wZXJ0eSgoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pZWRlY2wpOwotCQl9Ci0KLQkJYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCk7Ci0JfQotCi0JLyoKLQkgKiAidGFnSW5mbyIKLQkgKiBnZXRzIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JY2xhc3MgUFBUYWdJbmZvIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBodG1sQW5ub3RhdGlvbkxvYyA9ICJkYXRhL2h0bXJlZi54bWwiOyAvLyROT04tTkxTLTEkCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGZBbm5vdGF0aW9uTWFwID0gbnVsbDsKLQotCQlwdWJsaWMgUFBUYWdJbmZvKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBhbm5vdGF0aW9uTWFwLgotCQkgKiBAcmV0dXJuIFJldHVybnMgYSBBbm5vdGF0aW9uTWFwCi0JCSAqLwotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJaWYgKGZBbm5vdGF0aW9uTWFwID09IG51bGwpIHsKLQkJCQlmQW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZkFubm90YXRpb25NYXAubG9hZChodG1sQW5ub3RhdGlvbkxvYywgSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vIGFubm90YXRpb24gYXZhaWxhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZBbm5vdGF0aW9uTWFwOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuIGdldEFubm90YXRpb25NYXAoKS5nZXRQcm9wZXJ0eSgoKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pZGVjbCkuZ2V0RWxlbWVudE5hbWUoKSwgInRhZ0luZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEtlZXBTcGFjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEtlZXBTcGFjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRLZWVwU3BhY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkS2VlcFNwYWNlcygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEluZGVudENoaWxkU291cmNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJ0ZXJtaW5hdG9ycyIKLQkgKi8KLQljbGFzcyBQUFRlcm1pbmF0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFRlcm1pbmF0b3JzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmICghIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1EZWNsSW1wbCkpIHJldHVybiBudWxsOwotCQkJcmV0dXJuICgoSFRNTEVsZW1EZWNsSW1wbClkZWNsKS5nZXRUZXJtaW5hdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAicHJvaGliaXRlZEFuY2VzdG9ycyIKLQkgKi8KLQljbGFzcyBQUFByb2hpYml0ZWRBbmNlc3RvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQUHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc0pTUCIKLQkgKi8KLQljbGFzcyBQUElzSlNQIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzSlNQKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLmlzSlNQKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNYSFRNTCIKLQkgKiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGl0c2VsZiBuZXZlciByZXByZXNlbnQgYW55IFhIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JICogU28sIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBhbHdheXMgZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1hIVE1MIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzWEhUTUwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzU1NJIgotCSAqIEVhY2ggZGVjbGFyYXRpb24gY2xhc3MgZm9yIFNTSSBlbGVtZW50cyBtdXN0IHByb3ZpZGUgdGhpcyBwcm9wZXJ0eSBpdHNlbGYsCi0JICogYW5kIHRoZW4gcmV0dXJuIHRydWUuICBPdGhlciBkZWNsYXJhdGlvbiBtdXN0IGFsd2F5cyByZXR1cm4gZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1NTSSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1NTSSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGluZUJyZWFrSGludCIKLQkgKi8KLQljbGFzcyBQUExpbmVCcmVha0hpbnQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGluZUJyZWFrSGludCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGluZUJyZWFrSGludCgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgOgotCQkJCQloaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIGhpbnQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJsYXlvdXRUeXBlIgotCSAqLwotCWNsYXNzIFBQTGF5b3V0VHlwZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBMYXlvdXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CTE9DSyA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfQkxPQ0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JSRUFLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfSElEREVOOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfT0JKRUNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX1dSQVAgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX1dSQVA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qCi0JICogIm9taXRUeXBlIgotCSAqLwotCWNsYXNzIFBQT21pdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQT21pdFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIHR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0T21pdFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0JPVEggOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9ERUZBVUxUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9NVVNUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpbmNsdXNpb24iCi0JICovCi0JY2xhc3MgUFBJbmNsdXNpb24gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSW5jbHVzaW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBkZWNsLmdldEluY2x1c2lvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLQkJUHJvcGVydHlQcm92aWRlciBwcCA9IChQcm9wZXJ0eVByb3ZpZGVyKSBmYWN0b3J5LnJlZ2lzdHJ5LmdldChwcm9wTmFtZSk7Ci0JCWlmIChwcCAhPSBudWxsKQotCQkJcmV0dXJuIHBwOwotCi0JCXBwID0gZmFjdG9yeS5jcmVhdGUocHJvcE5hbWUpOwotCQlpZiAocHAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWN0b3J5LmRlZmF1bHRQcm92aWRlcjsKLQotCQlmYWN0b3J5LnJlZ2lzdHJ5LnB1dChwcm9wTmFtZSwgcHApOwotCQlyZXR1cm4gcHA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgUHJvcGVydHlQcm92aWRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlIHJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBjcmVhdGUoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBudWxsOwotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXBwID0gbmV3IFBQSXNKU1AoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcHAgPSBuZXcgUFBJc1hIVE1MKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlwcCA9IG5ldyBQUElzU1NJKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkxBWU9VVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQTGF5b3V0VHlwZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcHAgPSBuZXcgUFBMaW5lQnJlYWtIaW50KCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXBwID0gbmV3IFBQUHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEtlZXBTcGFjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXBwID0gbmV3IFBQVGVybWluYXRvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVEFHSU5GTykpCi0JCQlwcCA9IG5ldyBQUFRhZ0luZm8oKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQT21pdFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkKLQkJCXBwID0gbmV3IFBQSW5jbHVzaW9uKCk7Ci0KLQkJcmV0dXJuIHBwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDI4MjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgQXR0cmlidXRlQ29sbGVjdGlvbiBleHRlbmRzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENIVE1MTmFtZXNwYWNlIHsKLQkvKioKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZShTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQotCQlpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNUSU9OKSkgewotCQkJLy8gKGFjdGlvbiAlVVJJICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDVElPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUxUKSkgewotCQkJLy8gKGFsdCAlVGV4dDsgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPUkRFUikpIHsKLQkJCS8vIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEVDS0VEKSkgewotCQkJLy8gKGNoZWNrZWQgKGNoZWNrZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX0NIRUNLRUR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DSEVDS0VELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTEVBUikpIHsKLQkJCS8vIChjbGVhciAobGVmdCB8IGFsbCB8IHJpZ2h0IHwgbm9uZSkgbm9uZSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9BTEwsIEFUVFJfVkFMVUVfUklHSFQsIEFUVFJfVkFMVUVfTk9ORX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfTk9ORSk7Ci0KLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0xFQVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTFMpKSB7Ci0JCQkvLyAoY29scyBOVU1CRVIgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09MUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRU5DVFlQRSkpIHsKLQkJCS8vIChlbmN0eXBlICVDb250ZW50VHlwZTsgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRU5DVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSEVJR0hUKSkgewotCQkJLy8gKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUYpKSB7Ci0JCQkvLyAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hTUEFDRSkpIHsKLQkJCS8vIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSFNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IVFRQX0VRVUlWKSkgewotCQkJLy8gKGh0dHAtZXF1aXYgTkFNRSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5OQU1FKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSFRUUF9FUVVJViwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFYTEVOR1RIKSkgewotCQkJLy8gKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVhMRU5HVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01FVEhPRCkpIHsKLQkJCS8vIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0dFVCwgQVRUUl9WQUxVRV9QT1NUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9HRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NRVRIT0QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01VTFRJUExFKSkgewotCQkJLy8gKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTVVMVElQTEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NVUxUSVBMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTkFNRSkpIHsKLQkJCS8vIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT1NIQURFKSkgewotCQkJLy8gKG5vc2hhZGUgKG5vc2hhZGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PU0hBREV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1NIQURFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ST1dTKSkgewotCQkJLy8gKHJvd3MgTlVNQkVSICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JPV1MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NFTEVDVEVEKSkgewotCQkJLy8gKHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfU0VMRUNURUR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TRUxFQ1RFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0laRSkpIHsKLQkJCS8vIChzaXplICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NSQykpIHsKLQkJCS8vIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JCQkvLyBOT1RFOiAic3JjIiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGluIHNldmVyYWwgZWxlbWVudHMuCi0JCQkvLwkJIFRoZSBkZWZpbml0aW9uIG9mIElNRyBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlcnMuCi0JCQkvLwkJIFNvLCBpdCBzaG91bGQgYmUgbG9jYWxseSBkZWZpbmVkLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UWVBFKSkgewotCQkJLy8gKHR5cGUgJUNvdGVudFR5cGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTFVFKSkgewotCQkJLy8gKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxVRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkVSU0lPTikpIHsKLQkJCS8vICh2ZXJzaW9uIENEQVRBICNGSVhFRCAnJUhUTUwuVmVyc2lvbjspCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVELCBBVFRSX1ZBTFVFX1ZFUlNJT05fVFJBTlNJVElPTkFMKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkVSU0lPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfV0lEVEgpKSB7Ci0JCQkvLyAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZTUEFDRSkpIHsKLQkJCS8vICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVlNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJCS8vIDw8RDIwNTUxNAotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biBhdHRyaWJ1dGU7IG1heWJlIGVycm9yLgotCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQlhdHRyID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCAlYm9keWNvbG9yczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEJvZHljb2xvcnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVJQWxpZ247IGFzIHZhbHVlcy4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9ySW1hZ2UoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBmb3IgPGNvZGU+YWxpZ248L2NvZGU+Ci0JICogaW4gc2V2ZXJhbCBlbGVtZW50cywgbGlrZSA8Y29kZT5QPC9jb2RlPiwgPGNvZGU+RElWPC9jb2RlPi4KLQkgKiBUaGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZnJvbSBhdHRyaWJ1dGVzIHRob3NlIGhhdmUgdGhlIHNhbWUgbmFtZQotCSAqIGluIG90aGVyIGVsZW1lbnRzICg8Y29kZT5JTUc8L2NvZGU+IGFuZCA8Y29kZT5UQUJMRTwvY29kZT4pLgotCSAqIFNvLCBpdCBjYW4ndCB0cmVhdCBhcyBnbG9iYWwgYXR0cmlidXRlcy4KLQkgKiA8c3Ryb25nPk5PVEU6IFRoZXNlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMKLQkgKiBubyBvd25lciBDTURvY3VtZW50IGluc3RhbmNlLjwvc3Ryb25nPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpIHsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXM6IGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9DRU5URVIsIEFUVFJfVkFMVUVfUklHSFQsfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWF0dHJzOyBkZWNsYXJhdGlvbnMuCi0JICogJWF0dHJzOyBjb25zaXN0cyBvZiAlY29yZWF0dHJzOywgJWkxOG4sIGFuZCAlZXZlbnRzOy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRBdHRycyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVjb3JlYXR0cnM7IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDb3JlKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBnbG9iYWwgYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJQ01Ob2RlIGNtbm9kZSA9IGdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCWlmIChjbW5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCi0JCUhUTUxBdHRyRGVjbEltcGwgZGVjID0gY3JlYXRlKGF0dHJOYW1lKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlY2xhcmF0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IG5hbWVzLgotCSAqIEBwYXJhbSBuYW1lcyBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucywgSXRlcmF0b3IgbmFtZXMpIHsKLQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGRlYyA9IGdldERlY2xhcmF0aW9uKGF0dHJOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0ICVldmVudHM7IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRFdmVudHMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLQotCS8qKgotCSAqIEdldCAlaTE4bjsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEkxOG4oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIQ01Eb2NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYmY0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSENNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEhUTUwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDSENNRG9jSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01Eb2N1bWVudCB7Ci0KLQkvKiogTmFtZXNwYWNlIGZvciBhbGwgbmFtZXMgb2YgZWxlbWVudHMsIGVudGl0aWVzIGFuZCBhdHRyaWJ1dGVzLiAqLwotCXByaXZhdGUgQ01OYW1lc3BhY2UgbmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRzID0gbnVsbDsKLQlwcml2YXRlIEVudGl0eUNvbGxlY3Rpb24gZW50aXRpZXMgPSBudWxsOwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDSENNRG9jSW1wbChTdHJpbmcgZG9jVHlwZU5hbWUsIENNTmFtZXNwYWNlIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSk7Ci0JCW5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRDb2xsZWN0aW9uKGF0dHJpYnV0ZXMpOwotCQllbnRpdGllcyA9IG5ldyBFbnRpdHlDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdGllczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWlmIChlbnRpdGllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVudGl0eURlY2xhcmF0aW9uKSBlbnRpdGllcy5nZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ0hUTUxOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ0hUTUxOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkNWMyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBQcm92aWRlIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBIVE1MIDQuMD8gc3BlY2lmaWNhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBDSFRNTE5hbWVzcGFjZSB7Ci0KLQkvLyBFbGVtZW50IG5hbWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS1FVT1RFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFkgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlRFUiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEREID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk0gPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgyID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg1ID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIUiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUcgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEkgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1QgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNUOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUQVJFQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVMID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfQ09ORklHID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9FQ0hPID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRVhFQyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZTSVpFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZMQVNUTU9EID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0lOQ0xVREUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9QUklOVEVOViA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9TRVQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVDsKLQl9Ci0KLQkvLyBDaGFyYWN0ZXIgRW50aXRpZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbnRpdHlOYW1lIHsKLQl9Ci0KLQkvLyBnbG9iYWwgYXR0cmlidXRlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NSQyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTFQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1JERVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZTUEFDRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEVBUiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PU0hBREUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIRUNLRUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BWExFTkdUSCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFYTEVOR1RIOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU1RZTEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFRUUF9FUVVJViA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFRUUF9FUVVJVjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NVUxUSVBMRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFTEVDVEVEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUk9XUyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MUyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNUSU9OID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01FVEhPRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVUSE9EOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FTkNUWVBFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9FTkNUWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUU7Ci0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk1TRyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFRk1UID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFRk1UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9USU1FRk1UID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9USU1FRk1UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0dJID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DR0k7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NNRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ01EOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WSVJUVUFMID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMOwotCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSB2YWx1ZXM7IG1haW5seSB1c2VkIGluIGVudW1lcmF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwgPSAiLS8vVzNDLy9EVEQgQ29tcGFjdCBIVE1MIDEuMCBEcmFmdC8vRU4iOyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9UT1A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9NSURETEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9CT1RUT007Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MRUZUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTEVGVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NFTlRFUiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFQ7Ci0JLy8gICBmb3IgY2xlYXIgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpOiBsZWZ0IGFuZCByaWdodCBhcmUgYWxyZWFkeSBkZWZpbmVkIGFib3ZlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxMID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTk9ORSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX05PTkU7Ci0JLy8gICBmb3IgdHlwZSBvZiBJTlBVVAotCS8vICAgICAgICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCS8vICAgICAgICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9URVhUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBU1NXT1JEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DSEVDS0JPWCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NIRUNLQk9YOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkFESU8gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NVQk1JVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFU0VUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ISURERU4gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ISURERU47Ci0JLy8gICBmb3Igc3BhbiwgY29sc3Bhbiwgcm93c3BhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfMSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFXzE7Ci0JLy8gICBmb3IgZnJhbWVib3JkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzAgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV8wOwotCS8vICAgZm9yIG1ldGhvZCBvZiBGT1JNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9HRVQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9HRVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QT1NUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUE9TVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEOwotCS8vICAgZm9yIGJlaGF2aXJvIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NDUk9MTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDUk9MTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NMSURFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU0xJREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTFRFUk5BVEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9BTFRFUk5BVEU7Ci0JLy8gICBmb3IgZGlyZWN0aW9uIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1VQID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVVA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ET1dOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRE9XTjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Db250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI3OTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Db250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgQ01Db250ZW50IGZvciBIVE1MIENNLgotICovCi1hYnN0cmFjdCBjbGFzcyBDTUNvbnRlbnRJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkRFRCA9IC0xOwotCS8qKiAgLTE6IGl0J3MgVU5CT1VOREVELiAqLwotCXByaXZhdGUgaW50IG1heE9jY3VyID0gVU5CT1VOREVEOwotCS8qKiAgMDogaXQncyBPUFRJT05BTCwgMSwgaXQncyBSRVFVSVJFRC4gKi8KLQlwcml2YXRlIGludCBtaW5PY2N1ciA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBjb25zdHVyY3Rvci4KLQkgKiBVc2UgdGhpcyBvbmUgZm9yIHVzdWFsIGNhc2VzLjxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50SW1wbChTdHJpbmcgbmFtZSwgaW50IG1pbiwgaW50IG1heCkgewotCQlzdXBlcihuYW1lKTsKLQkJbWluT2NjdXIgPSBtaW47Ci0JCW1heE9jY3VyID0gbWF4OwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIG1pbk9jY3VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNR3JvdXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMmIzZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0vKioKLSAqLwotY2xhc3MgQ01Hcm91cEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01Hcm91cCB7Ci0KLQlwcml2YXRlIGludCBvcGVyYXRvciA9IENNR3JvdXAuU0VRVUVOQ0U7Ci0JcHJpdmF0ZSBDTU5vZGVMaXN0SW1wbCBjaGlsZHJlbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUdyb3VwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTUdyb3VwSW1wbChpbnQgb3AsIGludCBtaW5PY2N1ciwgaW50IG1heE9jY3VyKSB7Ci0JCXN1cGVyKG51bGwsIG1pbk9jY3VyLCBtYXhPY2N1cik7Ci0JCXN3aXRjaCAob3ApIHsKLQkJCWNhc2UgQ01Hcm91cC5BTEwgOgotCQkJY2FzZSBDTUdyb3VwLkNIT0lDRSA6Ci0JCQljYXNlIENNR3JvdXAuU0VRVUVOQ0UgOgotCQkJCW9wZXJhdG9yID0gb3A7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4KLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZENoaWxkKENNTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGlsZHJlbi5hcHBlbmROb2RlKGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkdST1VQOwotCX0KLQotCS8qKgotCSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFMT05FIChhKSwgU0VRVUVOQ0UgKGEsYiksIENIT0lDRSAoYXxiKSwgQUxMIChhJmIpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBvcGVyYXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmNkZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW50ZWQgdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICogSWYgc29tZW9uZSB3YW50cyB0byB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uCi0gKiB0byB0aGUgZmFjdCB0aGF0IHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuICBUaGF0IGlzLCB0aGlzCi0gKiBjbGFzcyBkb2VzIG5vdCBkaXN0aW5ndWlzaCAibmFtZSIsICJOQU1FIiwgYW5kICJOYW1lIiBhcyBhIGtleSBuYW1lLgotICovCi1jbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwIHsKLQotCXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBpdGVtcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCQlpdGVtcyA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBpdGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlIDxjb2RlPm51bGw8L2NvZGU+IGZvciB1bmtub3duIGtleXMuCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmICghaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIGl0ZW1zLmdldChjb29rZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmICgtLWluZGV4IDwgMCkKLQkJCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGl0ZW1zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJhd0Zvcm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1ha2VDYW5vbmljYWxGb3JtKFN0cmluZyByYXdGb3JtKSB7Ci0JCXJldHVybiByYXdGb3JtLnRvVXBwZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGl0ZW0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgcHV0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgaXRlbSkgewotCQlTdHJpbmcgY29va2VkTmFtZSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpOwotCQlpZiAoaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkJaXRlbXMucHV0KGNvb2tlZE5hbWUsIGl0ZW0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzgzODQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLQotCi0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVJbXBsKFN0cmluZyBubSkgewotCQlzdXBlcigpOwotCQluYW1lID0gbm07Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0NDA0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuYWxvZyBvZiBkb20uTm9kZUxpc3QgZm9yIENNLgotICovCi1jbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vZGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZE5vZGUoQ01Ob2RlIG5vZGUpIHsKLQkJbm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjMmRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0gKiBpbiBYTUwgU2NoZW1hLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCXByb3RlY3RlZCBDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb21wbGV4VHlwZURlZmluaXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29tcGxleFR5cGVEZWZpbml0aW9uKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbGxlY3Rpb24gPSBlbGVtZW50Q29sbGVjdGlvbjsKLQkJY3JlYXRlQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhY3R1YWwgY29udGVudCBtb2RlbC4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYW5kIG9ubHkgb25jZSBpbiB0aGUgY29uc3RydWN0b3IuPGJyPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwCi0JICovCi0JcHVibGljIENNR3JvdXAgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JLyogTk9URTogRG8gd2UgbmVlZCBMT0dJQ0FMIHR5cGU/Ci0JICogLS0gMy83LzIwMDEKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCBoaW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldFByaW1hcnlDYW5kaWRhdGUoKSB7Ci0JCWlmIChwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0ocHJpbWFyeUNhbmRpZGF0ZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlTmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzQ2YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogRmFjdG9yeSBvZiBDb21wbGV4VHlwZURlZmluaXRpb24uCi0gKi8KLWZpbmFsIGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGRlZmluaXRpb25zID0gbnVsbDsKLQkvLyBjb25zdGFudHMgZm9yIGNvbXBsZXggdHlwZSBuYW1lCi0JLyoqIGZvciBBRERSRVNTLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0FERFJFU1MgPSAiQ1RZUEVfQUREUkVTUyI7Ly8kTk9OLU5MUy0xJAotCS8qKiBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DREFUQSA9ICJDVFlQRV9DREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBjb2wgZ3JvdXAgY29udGVudC4gQ09MKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0NPTFVNTl9HUk9VUCA9ICJDVFlQRV9DT0xVTU5fR1JPVVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIERMLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0RFRklOSVRJT05fTElTVCA9ICJDVFlQRV9ERUZJTklUSU9OX0xJU1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEVNQkVELiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0VNQkVEID0gIkNUWVBFX0VNQkVEIjsvLyROT04tTkxTLTEkCi0JLyoqIGVtcHR5IGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaG91bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTVBUWSA9ICJDVFlQRV9FTVBUWSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRklFTERTRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRklFTERTRVQgPSAiQ1RZUEVfRklFTERTRVQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZSQU1FU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZSQU1FU0VUID0gIkNUWVBFX0ZSQU1FU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZsb3cgY29udGVudC4gKCVmbG93OykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRkxPV19DT05UQUlORVIgPSAiQ1RZUEVfRkxPV19DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogaHRtbCBjb250ZW50LiBIRUFELCAoRlJBTUVTRVR8Qk9EWSkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IVE1MID0gIkNUWVBFX0hUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKiogaGVhZCBjb250ZW50LiBUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IRUFEID0gIkNUWVBFX0hFQUQiOy8vJE5PTi1OTFMtMSQKLQkvKiogaW5saW5lIGNvbnRlbnQuICglaW5saW5lOykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiA9ICJDVFlQRV9JTkxJTkVfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGxpc3QgaXRlbSBjb250YWluZXIuIChMSSkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTElfQ09OVEFJTkVSID0gIkNUWVBFX0xJX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgTUFQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX01BUCA9ICJDVFlQRV9NQVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogbm9mcmFtZXMgY29udGVudC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9OT0ZSQU1FU19DT05URU5UID0gIkNUWVBFX05PRlJBTUVTX0NPTlRFTlQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE9QVEdST1VQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX09QVElPTl9DT05UQUlORVIgPSAiQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBwYXJhbSBjb250YWluZXIuIEZvciBPQkpFQ1QvQVBQTEVULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BBUkFNX0NPTlRBSU5FUiA9ICJDVFlQRV9QQVJBTV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogUENEQVRBIGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaHVsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BDREFUQSA9ICJDVFlQRV9QQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIFNFTEVDVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9TRUxFQ1QgPSAiQ1RZUEVfU0VMRUNUIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNvbnRlbnQuIENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVEFCTEUgPSAiQ1RZUEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgY2VsbCBjb250YWllci4gKFRIfFREKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UQ0VMTF9DT05UQUlORVIgPSAiQ1RZUEVfVENFTExfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIHJlY29yZCBjb250YWluZXIuIChUUikrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVFJfQ09OVEFJTkVSID0gIkNUWVBFX1RSX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJZGVmaW5pdGlvbnMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kIGZvciBDb21wbGV4VHlwZURlZmluaXRpb24uCi0JICogRWFjaCBpbnN0YW5jZSBjcmVhdGVkIGluIHRoaXMgbWV0aG9kIG11c3QgYmUgcmVnaXN0ZXJlZCBpbnRvCi0JICogdGhlIG1hcCB3aXRoIGl0cyBuYW1lLgotCSAqIEBwYXJhbSBkZWZpbml0aW9uTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbk5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCWlmIChkZWZpbml0aW9ucy5jb250YWluc0tleShkZWZpbml0aW9uTmFtZSkpIHsKLQkJCXJldHVybiAoQ29tcGxleFR5cGVEZWZpbml0aW9uKSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0JCWlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9BRERSRVNTKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQWRkcmVzcyhlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERUZJTklUSU9OX0xJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GTE9XX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZEZsb3dDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRCkgewotCQkJZGVmID0gbmV3IEN0ZEhlYWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSFRNTCkgewotCQkJZGVmID0gbmV3IEN0ZEh0bWwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZElubGluZUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9MSV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRMaUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX09QVElPTl9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRPcHRpb25Db250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfU0VMRUNUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkU2VsZWN0KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgewotCQkJZGVmID0gbnVsbDsKLQkJfQotCQlpZiAoZGVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmFpbCB0byBjcmVhdGUuCi0JCWRlZmluaXRpb25zLnB1dChkZWZpbml0aW9uTmFtZSwgZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBGb3Igc2luZ2xldG9uLjxicj4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Nzk2ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBDdGRBZGRyZXNzIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRBZGRyZXNzKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWlubGluZSkKLQkJQ01Hcm91cEltcGwgaW5saW5lcyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChpbmxpbmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGlubGluZXMpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGlubGluZXMpOwotCQkvLyBQCi0JCUNNTm9kZSBwID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCk7Ci0JCWlmIChwICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHApOwotCX0KLQotCS8qKgotCSAqICgoJWlubGluZSkgfCBQKSouCi0JICogQmVjYXVzZSAlaW5saW5lOyBjb250YWlucyAjUENEQVRBLCB0aGUgdHlwZSBpcyBNSVhFRC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZiMTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkRGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIERMLgotICovCi1maW5hbCBjbGFzcyBDdGREbCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkRGwoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gRFQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBERAotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoRFQgfCBERCkrLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RFRklOSVRJT05fTElTVDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5NGQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIGNvbnRhaW5lcnMgb2YgPGNvZGU+JWZsb3c7PC9jb2RlPi4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRmxvd0NvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ3RkRmxvd0NvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCVmbG93OykqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJY29sbGVjdGlvbi5nZXRGbG93KGNvbnRlbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GTE9XX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEhlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2MWMzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEhlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGhlYWQgY29udGVudC4KLSAqIENvbnRlbnQgTW9kZWw6IChUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEhlYWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEhlYWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCX0KLQotCS8qKgotCSAqIGZvciBIRUFELgotCSAqIFRvIGF2b2lkIHVzaW5nIGluY2x1c2lvbiwgdGhlIGNvbnRlbnQgbW9kZWwgY29tZXMgZnJvbSB0aGUgWEhUTUwgMS4wLgotCSAqCi0JICogKCVoZWFkLm1pc2M7LCAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKQotCSAqIEFuZCAlaGVhZC5taXNjOyBpczoKLQkgKiAoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3R8aXNpbmRleCkqCi0JICoKLQkgKiAwOiAoJWhlYWQubWlzYywgQSkKLQkgKiBBOiAoQiB8IEMpCi0JICogQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkgKiBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JICogRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkgKiBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBBdCAxc3QsIGNyZWF0ZSAlaGVhZC5taXNjOyBjb250ZW50LgotCQkvLyAlaGVhZC5taXNjOwotCQkvLyAgICggfCApKgotCQlDTUdyb3VwSW1wbCBtaXNjID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChtaXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobWlzYywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vIDJuZCwgZ2V0IGEgdGl0bGUKLQkJQ01Ob2RlIHRpdGxlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpOwotCQkvLyAzcmQsIGdldCBhIGJhc2UKLQkJQ01Ob2RlIGJhc2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKTsKLQkJaWYgKHRpdGxlID09IG51bGwgfHwgYmFzZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRvcCBsZXZlbCBjb250ZW50IGlzIGEgc2VxdWVuY2Ugb2YgJWhlYWQubWlzYzsgYW5kIEEuCi0JCS8vIDA6ICglaGVhZC5taXNjOywgQSkKLQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOwotCQljb250ZW50LmFwcGVuZENoaWxkKG1pc2MpOwotCQkvLyAgIGNyZWF0ZSBBIGFuZCBhcHBlbmQgaXQgdG8gdGhlIHRvcCBsZXZlbC4KLQkJewotCQkJLy8gQSBpcyBhIGNob2ljZSBvZiBCIGFuZCBDLgotCQkJLy8gQTogKEIgfCBDKQotCQkJLy8gICBjcmVhdGUgYSBjaG9pY2UKLQkJCUNNR3JvdXBJbXBsIGdBID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJCWlmIChnQSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vICAgYXBwZW5kIEEgdG8gdGhlIHRvcCBsZXZlbC4KLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ0EpOwotCi0JCQkvLyBjcmVhdGUgQiBhbmQgYXBwZW5kIGl0IHRvIEEKLQkJCXsKLQkJCQkvLyBCIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUsICVoZWFkLm1pc2M7LCBhbmQgRC4KLQkJCQkvLyBCOiAodGl0bGUsICVoZWFkLm1pc2M7LCBEKQotCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQlDTUdyb3VwSW1wbCBnQiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQlpZiAoZ0IgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vICAgYXBwZW5kIEIgdG8gQS4KLQkJCQlnQS5hcHBlbmRDaGlsZChnQik7Ci0KLQkJCQkvLyAgIGFwcGVuZCB0aXRsZSB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEIKLQkJCQlnQi5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQkvLyAgIGNyZWF0ZSBEIGFuZCBhcHBlbmQgaXQgdG8gQi4KLQkJCQl7Ci0JCQkJCS8vIEQgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJCQkJaWYgKGdEID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEQgdG8gQi4KLQkJCQkJZ0IuYXBwZW5kQ2hpbGQoZ0QpOwotCi0JCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gRAotCQkJCQlnRC5hcHBlbmRDaGlsZChiYXNlKTsKLQkJCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gRC4KLQkJCQkJZ0QuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY3JlYXRlIEMgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQyBpcyBhIHNlcXVlbmNlIG9mIGJhc2UsICVoZWFkLm1pc2M7LCBhbmQgRQotCQkJCS8vIEM6IChiYXNlLCAlaGVhZC5taXNjOywgRSkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdDID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBDIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0MpOwotCi0JCQkJLy8gICBhcHBlbmQgYmFzZSB0byBDCi0JCQkJZ0MuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKG1pc2MpOwotCi0JCQkJLy8gICBjcmVhdGUgRSBhbmQgYXBwZW5kIGl0IHRvIEMuCi0JCQkJewotCQkJCQkvLyBFIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUgYW5kICVoZWFkLm1pc2M7LgotCQkJCQkvLyBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJCUNNR3JvdXBJbXBsIGdFID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCQlpZiAoZ0UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gICBhcHBlbmQgRSB0byBDLgotCQkJCQlnQy5hcHBlbmRDaGlsZChnRSk7Ci0KLQkJCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gRQotCQkJCQlnRS5hcHBlbmRDaGlsZCh0aXRsZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEUuCi0JCQkJCWdFLmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC48YnI+Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEh0bWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSHRtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJhYjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSHRtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIDxjb2RlPkhUTUw8L2NvZGU+Ljxicj4KLSAqIENvbnRlbnQgTW9kZWw6Ci0gKiBIRUFELCAoRlJBTUVTRVR8Qk9EWSk8YnI+Ci0gKi8KLWZpbmFsIGNsYXNzIEN0ZEh0bWwgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEh0bWwoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQ7Ci0JfQotCi0JLyoqCi0JICogKCVodG1sLmNvbnRlbnQ7KS4KLQkgKiAlaHRtbC5jb250ZW50OyBpcyBIRUFELCAoRlJBTUVTRVQgfCBCT0RZKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gSEVBRAotCQlDTU5vZGUgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCQkvLyAoIHwgKQotCQlDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCi0JCS8vIEZSQU1FU0VULCBCT0RZCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFl9OwotCQljb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRWxlbWVudCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzM5NDRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciAoJWlubGluZTspKi4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSW5saW5lQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRJbmxpbmVDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglaW5saW5lKSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJY29sbGVjdGlvbi5nZXRJbmxpbmUoY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkTGlDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkTGlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0NzE2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZExpQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIExpc3QgaXRlbSBjb250YWluZXIuCi0gKiAoTEkpKwotICovCi1maW5hbCBjbGFzcyBDdGRMaUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVuQ29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRMaUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEk7Ci0JfQotCi0JLyoqCi0JICogKExJKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIChMSSkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlDTU5vZGUgbGkgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCWlmIChsaSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChsaSk7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRPcHRpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTBhNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRPcHRpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogT1BUSU9OIGNvbnRhaW5lci4KLSAqIChPUFRJT04pKwotICovCi1maW5hbCBjbGFzcyBDdGRPcHRpb25Db250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZE9wdGlvbkNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gT1BUSU9OCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKE9QVElPTikrCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9PUFRJT05fQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZFNlbGVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRTZWxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwZDYxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZFNlbGVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBDdGRTZWxlY3QgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFNlbGVjdChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBPUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRGVjbENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRGVjbENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1NjUyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0RlY2xDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBEdWFsTWFwIHsKLQkJcHVibGljIER1YWxNYXAoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIER1YWxNYXAoT2JqZWN0W10gb2JqZWN0cykgewotCQkJc3VwZXIoKTsKLQkJCWluaXRpYWxpemUob2JqZWN0cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gdGFibGUubGVuZ3RoOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShpbnQga2V5KSB7Ci0JCQlpZiAoIWlzVmFsaWRJbmRleChrZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHRhYmxlW2tleV07Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEtleShPYmplY3QgdmFsdWUpIHsKLQkJCUludGVnZXIga2V5T2JqID0gKEludGVnZXIpIG1hcC5nZXQodmFsdWUpOwotCQkJaWYgKGtleU9iaiA9PSBudWxsKQotCQkJCXJldHVybiBJRF9VTktOT1dOOwotCQkJcmV0dXJuIGtleU9iai5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlpZiAob2JqZWN0cyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXRhYmxlID0gb2JqZWN0czsKLQkJCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBrZXkgPSAwOyBrZXkgPCBvYmplY3RzLmxlbmd0aDsga2V5KyspIHsKLQkJCQlPYmplY3QgdmFsdWUgPSB0YWJsZVtrZXldOwotCQkJCW1hcC5wdXQodmFsdWUsIG5ldyBJbnRlZ2VyKGtleSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3RbXSB0YWJsZSA9IG51bGw7Ci0JCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBudWxsOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSW5kZXgoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IHRhYmxlLmxlbmd0aDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUb2xlcmFudFN0cmluZ0R1YWxNYXAgZXh0ZW5kcyBEdWFsTWFwIHsKLQkJcHVibGljIFRvbGVyYW50U3RyaW5nRHVhbE1hcChTdHJpbmdbXSBuYW1lcykgewotCQkJc3VwZXIoKTsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W25hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2JqZWN0c1tpXSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWVzW2ldKTsKLQkJCX0KLQkJCWluaXRpYWxpemUob2JqZWN0cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEtleShPYmplY3QgdmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0S2V5KG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBJRF9VTktOT1dOOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhdykgewotCQkJcmV0dXJuIHJhdy50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBEZWNsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBEZWNsSXRlcmF0b3IoKSB7Ci0JCQltYXhpZCA9IGZEZWNscy5sZW5ndGggLSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpZCA8IG1heGlkOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKCFoYXNOZXh0KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaXRlbSgrK2lkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgLyogbm90aGluZyBzaG91bGQgYmUgZG9uZS4gKi8KLQkJfQotCi0JCXByaXZhdGUgaW50IGlkID0gLTE7Ci0JCXByaXZhdGUgaW50IG1heGlkID0gLTE7Ci0JfQotCi0JQ01Ob2RlW10gZkRlY2xzID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gU1RSSUNUX0NBU0UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gVE9MRVJBTlRfQ0FTRSA9IHRydWU7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSURfVU5LTk9XTiA9IC0xOwotCXByaXZhdGUgRHVhbE1hcCBmTWFwID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBEZWNsQ29sbGVjdGlvbihTdHJpbmdbXSBuYW1lcywgYm9vbGVhbiB0b2xlcmFudCkgewotCQlzdXBlcigpOwotCQlmRGVjbHMgPSBuZXcgQ01Ob2RlW25hbWVzLmxlbmd0aF07Ci0JCWlmICh0b2xlcmFudCkgewotCQkJZk1hcCA9IG5ldyBUb2xlcmFudFN0cmluZ0R1YWxNYXAobmFtZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJZk1hcCA9IG5ldyBEdWFsTWFwKG5hbWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gaWQgaW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZSBjcmVhdGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldERlY2xhcmF0aW9ucyhTdHJpbmdbXSBuYW1lcykgewotCQlDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJQ01Ob2RlIG5vZGUgPSBnZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJbWFwLnB1dE5hbWVkSXRlbShuYW1lLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldERlY2xhcmF0aW9ucyhDTUdyb3VwSW1wbCBncm91cCwgSXRlcmF0b3IgbmFtZXMpIHsKLQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7Ci0JCQlDTU5vZGUgZGVjID0gZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCWdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYXAgbmFtZSB0byBpZC4KLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldElEKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmTWFwLmdldEtleShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZEZWNscy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZShpbnQgaWQpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGZNYXAuZ2V0VmFsdWUoaWQpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlpbnQgaWQgPSBnZXRJRChuYW1lKTsKLQkJaWYgKCFpc1ZhbGlkSUQoaWQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBpdGVtKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gaWQgaW50Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJRChpbnQgaWQpIHsKLQkJcmV0dXJuIGlkID49IDAgJiYgaWQgPCBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAoIWlzVmFsaWRJRChpbmRleCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ01Ob2RlIGRlY2wgPSBmRGVjbHNbaW5kZXhdOwotCQlpZiAoZGVjbCAhPSBudWxsKQotCQkJcmV0dXJuIGRlY2w7IC8vIGFscmVhZHkgZXhpc3QuCi0KLQkJZGVjbCA9IGNyZWF0ZShnZXROYW1lKGluZGV4KSk7Ci0JCWZEZWNsc1tpbmRleF0gPSBkZWNsOwotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRGVjbEl0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1YWQ0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JLy8gRWxlbWVudCBJRHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUREUkVTUyA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JBU0UgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTE9DS1FVT1RFID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQk9EWSA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JSID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVEVSID0gNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREQgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVIgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVYgPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ETCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EVCA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JNID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gxID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gyID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gzID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g0ID0gMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g1ID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g2ID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFQUQgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSFIgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSFRNTCA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTUcgPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5QVVQgPSAyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEkgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVOVSA9IDI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRVRBID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVElPTiA9IDI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSRSA9IDMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1QgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEVYVEFSRUEgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElUTEUgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUwgPSAzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0NPTkZJRyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRUNITyA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRVhFQyA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRlNJWkUgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZMQVNUTU9EID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9JTkNMVURFID0gNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9QUklOVEVOViA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfU0VUID0gNDI7Ci0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAxMDUuCi0JCQkvLyAtLSA1LzI1LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQkvKiogJWZvcm1jdGw7LiBJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9STUNUTCA9IHtJTlBVVCwgU0VMRUNULCBURVhUQVJFQX07Ci0JLyoqICVwaHJhc2U7LgotCSAqIERGTgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIUkFTRSA9IHtERk59OwotCS8qKiAlc3BlY2lhbDsuCi0JICogQSB8IElNRyB8IEJSCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1BFQ0lBTCA9IHtBLCBJTUcsIEJSfTsKLQkvKiogJWhlYWRpbmc7LiBIWzEtNl0gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIRUFESU5HID0ge0gxLCBIMiwgSDMsIEg0LCBINSwgSDZ9OwotCS8qKiAlbGlzdDsuIFVMIHwgT0wgfCBESVIgfCBNRU5VICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElTVCA9IHtVTCwgT0wsIERJUiwgTUVOVX07Ci0JLyoqICVwcmVmb3JtYXR0ZWQ7LiBQUkUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUkVGT1JNQVRURUQgPSB7UFJFfTsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FdID0gQTsKLQkJbmFtZXNbSWRzLklEX0FERFJFU1NdID0gQUREUkVTUzsKLQkJbmFtZXNbSWRzLklEX0JBU0VdID0gQkFTRTsKLQkJbmFtZXNbSWRzLklEX0JMT0NLUVVPVEVdID0gQkxPQ0tRVU9URTsKLQkJbmFtZXNbSWRzLklEX0JPRFldID0gQk9EWTsKLQkJbmFtZXNbSWRzLklEX0JSXSA9IEJSOwotCQluYW1lc1tJZHMuSURfQ0VOVEVSXSA9IENFTlRFUjsKLQkJbmFtZXNbSWRzLklEX0REXSA9IEREOwotCQluYW1lc1tJZHMuSURfRElSXSA9IERJUjsKLQkJbmFtZXNbSWRzLklEX0RJVl0gPSBESVY7Ci0JCW5hbWVzW0lkcy5JRF9ETF0gPSBETDsKLQkJbmFtZXNbSWRzLklEX0RUXSA9IERUOwotCQluYW1lc1tJZHMuSURfRk9STV0gPSBGT1JNOwotCQluYW1lc1tJZHMuSURfSDFdID0gSDE7Ci0JCW5hbWVzW0lkcy5JRF9IMl0gPSBIMjsKLQkJbmFtZXNbSWRzLklEX0gzXSA9IEgzOwotCQluYW1lc1tJZHMuSURfSDRdID0gSDQ7Ci0JCW5hbWVzW0lkcy5JRF9INV0gPSBINTsKLQkJbmFtZXNbSWRzLklEX0g2XSA9IEg2OwotCQluYW1lc1tJZHMuSURfSEVBRF0gPSBIRUFEOwotCQluYW1lc1tJZHMuSURfSFJdID0gSFI7Ci0JCW5hbWVzW0lkcy5JRF9IVE1MXSA9IEhUTUw7Ci0JCW5hbWVzW0lkcy5JRF9JTUddID0gSU1HOwotCQluYW1lc1tJZHMuSURfSU5QVVRdID0gSU5QVVQ7Ci0JCW5hbWVzW0lkcy5JRF9MSV0gPSBMSTsKLQkJbmFtZXNbSWRzLklEX01FTlVdID0gTUVOVTsKLQkJbmFtZXNbSWRzLklEX01FVEFdID0gTUVUQTsKLQkJbmFtZXNbSWRzLklEX09MXSA9IE9MOwotCQluYW1lc1tJZHMuSURfT1BUSU9OXSA9IE9QVElPTjsKLQkJbmFtZXNbSWRzLklEX1BdID0gUDsKLQkJbmFtZXNbSWRzLklEX1BSRV0gPSBQUkU7Ci0JCW5hbWVzW0lkcy5JRF9TRUxFQ1RdID0gU0VMRUNUOwotCQluYW1lc1tJZHMuSURfVEVYVEFSRUFdID0gVEVYVEFSRUE7Ci0JCW5hbWVzW0lkcy5JRF9USVRMRV0gPSBUSVRMRTsKLQkJbmFtZXNbSWRzLklEX1VMXSA9IFVMOwotCQluYW1lc1tJZHMuSURfU1NJX0NPTkZJR10gPSBTU0lfQ09ORklHOwotCQluYW1lc1tJZHMuSURfU1NJX0VDSE9dID0gU1NJX0VDSE87Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRVhFQ10gPSBTU0lfRVhFQzsKLQkJbmFtZXNbSWRzLklEX1NTSV9GU0laRV0gPSBTU0lfRlNJWkU7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRkxBU1RNT0RdID0gU1NJX0ZMQVNUTU9EOwotCQluYW1lc1tJZHMuSURfU1NJX0lOQ0xVREVdID0gU1NJX0lOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfUFJJTlRFTlZdID0gU1NJX1BSSU5URU5WOwotCQluYW1lc1tJZHMuSURfU1NJX1NFVF0gPSBTU0lfU0VUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvbihBdHRyaWJ1dGVDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIobmFtZXMsIFRPTEVSQU5UX0NBU0UpOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2UuCi0JICogQHJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCUhUTUxFbGVtRGVjbEltcGwgZWRlYyA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUREUkVTUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQUREUkVTUyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkFTRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkFTRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkxPQ0tRVU9URSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkxPQ0tRVU9URSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQk9EWSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDRU5URVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZENFTlRFUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEREKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoRElSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRElWKSkgewotCQkJZWRlYyA9IG5ldyBIZWRESVYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRETCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGT1JNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGT1JNKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgyKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgyLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg1KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg1LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDYsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIRUFEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIRUFEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhUTUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElNRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU1HKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlBVVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU5QVVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExJKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMSSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVOVSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShNRU5VLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVUQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVUQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT0wpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPUFRJT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9QVElPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUFJFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQUkUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU0VMRUNUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURVhUQVJFQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVEVYVEFSRUEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRJVExFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUSVRMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFVMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfQ09ORklHKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lDb25maWcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FQ0hPKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFY2hvKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRVhFQykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRXhlYyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZTSVpFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGc2l6ZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZMQVNUTU9EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGbGFzdG1vZCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0lOQ0xVREUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUluY2x1ZGUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9QUklOVEVOVikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJUHJpbnRlbnYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9TRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSVNldCh0aGlzKTsKLQotCQl9IC8vIHVua25vd24KLQkJZWxzZSB7Ci0JCQkvLyBOT1RFOiBXZSBkb24ndCBkZWZpbmUgdGhlIFVOS05PV04gZWxlbWVudCBkZWNsYXJhdGlvbi4KLQkJCS8vIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIGRlY2xhcmF0aW9uIGlzIGEgc2lnbiBvZgotCQkJLy8gdGhlIHRhcmdldCBlbGVtZW50IGlzIHVua25vd24uCi0JCQkvLyAtLSAzLzkvMjAwMQotCQkJZWRlYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVkZWM7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZUNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIENvbGxlY3Rpb24gZ2V0TmFtZXNPZkJsb2NrKCkgewotCQkvLyBQIHwgJWxpc3QgfCAlcHJlZm9ybWF0dGVkIHwgREwgfCBESVYgfCBDRU5URVIgfCBCTE9DS1FVT1RFIHwgRk9STSB8IEhSCi0JCVN0cmluZ1tdIGJsb2NrTWlzYyA9IHtQLCBETCwgRElWLCBDRU5URVIsIEJMT0NLUVVPVEUsIEZPUk0sIEhSLH07Ci0JCVZlY3RvciBibG9ja05hbWVzID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KGJsb2NrTWlzYykpOwotCQkvLyAlaGVhZGluZzsKLQkJYmxvY2tOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChIRUFESU5HKSk7Ci0JCS8vICVsaXN0OwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KExJU1QpKTsKLQkJLy8gJXByZWZvcm1hdHRlZDsKLQkJYmxvY2tOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChQUkVGT1JNQVRURUQpKTsKLQotCQlyZXR1cm4gYmxvY2tOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiAlYmxvY2s7LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEJsb2NrKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIGdldE5hbWVzT2ZCbG9jaygpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbQotCSAqIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4gaW5zdGFuY2UuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0RmxvdyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0QmxvY2soZ3JvdXApOwotCQlnZXRJbmxpbmUoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZvbnRzdHlsZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9ybWN0cmwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChGT1JNQ1RMKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlaGVhZGluZzsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0SGVhZGluZyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoSEVBRElORykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRJbmxpbmUoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEZvbnRzdHlsZShncm91cCk7Ci0JCWdldFBocmFzZShncm91cCk7Ci0JCWdldFNwZWNpYWwoZ3JvdXApOwotCQlnZXRGb3JtY3RybChncm91cCk7Ci0JfQotCi0JLyoqCi0JICogJWxpc3Q7LgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldExpc3QoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KExJU1QpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFBocmFzZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBIUkFTRSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogJXByZWZvcm1hdHRlZDsKLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRQcmVmb3JtYXR0ZWQoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0U3BlY2lhbChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFNQRUNJQUwpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VudGl0eUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQ0NTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbnRpdHkgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbnRpdHlDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5FbnRpdHlOYW1lIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX0wgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfVSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX0wgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19VID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNVVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19MID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfVSA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9MID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX1UgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTEVGU1lNID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfTCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9VID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FNUCA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkQgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5HID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX0wgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfVSA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BU1lNUCA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfTCA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfVSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9VID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JEUVVPID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX1UgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlJWQkFSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVTEwgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0FQID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9MID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9VID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFRElMID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlQgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX0wgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX1UgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0lSQyA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DTFVCUyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT05HID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1JBUlIgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VQID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUlJFTiA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfTCA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfVSA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX0wgPSA0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9VID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFRyA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9MID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX1UgPSA0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElBTVMgPSA0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWSURFID0gNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9MID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9VID0gNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX0wgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfVSA9IDUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfTCA9IDU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfVSA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVBUWSA9IDU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVNQID0gNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VOU1AgPSA1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9MID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fVSA9IDYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUVVJViA9IDYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfTCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfVSA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfTCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfVSA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX0wgPSA2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9VID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVUk8gPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhJU1QgPSA2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk5PRiA9IDcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JBTEwgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzEyID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxNCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMzQgPSA3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBU0wgPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfTCA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9VID0gNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFID0gNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dUID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfTCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX1UgPSA4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBUlRTID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFTExJUCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfTCA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfVSA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19MID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX1UgPSA4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUVYQ0wgPSA4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX0wgPSA4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX1UgPSA5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5GSU4gPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5UID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfTCA9IDk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX1UgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVFVRVNUID0gOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lTSU4gPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9MID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfVSA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9MID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9VID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfTCA9IDEwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX1UgPSAxMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTkcgPSAxMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUVVPID0gMTA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX0wgPSAxMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfVSA9IDEwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTENFSUwgPSAxMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xEUVVPID0gMTA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRSA9IDExMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEZMT09SID0gMTExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1dBU1QgPSAxMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPWiA9IDExMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFJNID0gMTE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU0FRVU8gPSAxMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTUVVPID0gMTE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MVCA9IDExNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFDUiA9IDExODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTURBU0ggPSAxMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JQ1JPID0gMTIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSURET1QgPSAxMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JTlVTID0gMTIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9MID0gMTIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9VID0gMTI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQUJMQSA9IDEyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkJTUCA9IDEyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkRBU0ggPSAxMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05FID0gMTI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OSSA9IDEyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9UID0gMTMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1RJTiA9IDEzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlNVQiA9IDEzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX0wgPSAxMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9VID0gMTM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9MID0gMTM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9VID0gMTM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfTCA9IDEzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX1UgPSAxMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX0wgPSAxMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX1UgPSAxNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX0wgPSAxNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX1UgPSAxNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9MID0gMTQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfVSA9IDE0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0xJTkUgPSAxNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX0wgPSAxNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX1UgPSAxNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fTCA9IDE0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9VID0gMTQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUExVUyA9IDE1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1IgPSAxNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SREYgPSAxNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SRE0gPSAxNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9MID0gMTU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfVSA9IDE1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX0wgPSAxNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9VID0gMTU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElNRVMgPSAxNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfTCA9IDE1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9VID0gMTYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBID0gMTYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJUID0gMTYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJNSUwgPSAxNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUlAgPSAxNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9MID0gMTY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfVSA9IDE2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElWID0gMTY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9MID0gMTY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9VID0gMTY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVTTU4gPSAxNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BPVU5EID0gMTcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9MID0gMTcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9VID0gMTczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9EID0gMTc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9QID0gMTc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfTCA9IDE3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX1UgPSAxNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1FVT1QgPSAxNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBRElDID0gMTc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQU5HID0gMTgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVFVTyA9IDE4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9MID0gMTgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX1UgPSAxODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JDRUlMID0gMTg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRFFVTyA9IDE4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVBTCA9IDE4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVHID0gMTg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRkxPT1IgPSAxODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19MID0gMTg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fVSA9IDE5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkxNID0gMTkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU0FRVU8gPSAxOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTUVVPID0gMTkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQlFVTyA9IDE5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX0wgPSAxOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9VID0gMTk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRE9UID0gMTk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUNUID0gMTk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSFkgPSAxOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BRiA9IDIwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfTCA9IDIwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfVSA9IDIwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lNID0gMjAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFERVMgPSAyMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQiA9IDIwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCRSA9IDIwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VNID0gMjA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAgPSAyMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDEgPSAyMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDIgPSAyMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDMgPSAyMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUEUgPSAyMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NaTElHID0gMjEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfTCA9IDIxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX1UgPSAyMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVJFNCA9IDIxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFTWU0gPSAyMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX0wgPSAyMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX1UgPSAyMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RISU5TUCA9IDIyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fTCA9IDIyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fVSA9IDIyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElMREUgPSAyMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTUVTID0gMjI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUkFERSA9IDIyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX0wgPSAyMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9VID0gMjI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX0wgPSAyMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfVSA9IDIyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfTCA9IDIzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfVSA9IDIzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX0wgPSAyMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9VID0gMjMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTUwgPSAyMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lIID0gMjM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX0wgPSAyMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fVSA9IDIzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9MID0gMjM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX1UgPSAyMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1dFSUVSUCA9IDI0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfTCA9IDI0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfVSA9IDI0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX0wgPSAyNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9VID0gMjQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZRU4gPSAyNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfTCA9IDI0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9VID0gMjQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX0wgPSAyNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfVSA9IDI0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldKID0gMjUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV05KID0gMjUxOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMjUyLgotCQkJLy8gLS0gNS8yNC8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9MXSA9IEFBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX1VdID0gQUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19MXSA9IEFDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19VXSA9IEFDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ1VURV0gPSBBQ1VURTsKLQkJbmFtZXNbSWRzLklEX0FFTElHX0xdID0gQUVMSUdfTDsKLQkJbmFtZXNbSWRzLklEX0FFTElHX1VdID0gQUVMSUdfVTsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9MXSA9IEFHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX1VdID0gQUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTEVGU1lNXSA9IEFMRUZTWU07Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9MXSA9IEFMUEhBX0w7Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9VXSA9IEFMUEhBX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTVBdID0gQU1QOwotCQluYW1lc1tJZHMuSURfQU5EXSA9IEFORDsKLQkJbmFtZXNbSWRzLklEX0FOR10gPSBBTkc7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19MXSA9IEFSSU5HX0w7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19VXSA9IEFSSU5HX1U7Ci0JCW5hbWVzW0lkcy5JRF9BU1lNUF0gPSBBU1lNUDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9MXSA9IEFUSUxERV9MOwotCQluYW1lc1tJZHMuSURfQVRJTERFX1VdID0gQVRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX0xdID0gQVVNTF9MOwotCQluYW1lc1tJZHMuSURfQVVNTF9VXSA9IEFVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0JEUVVPXSA9IEJEUVVPOwotCQluYW1lc1tJZHMuSURfQkVUQV9MXSA9IEJFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0JFVEFfVV0gPSBCRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9CUlZCQVJdID0gQlJWQkFSOwotCQluYW1lc1tJZHMuSURfQlVMTF0gPSBCVUxMOwotCQluYW1lc1tJZHMuSURfQ0FQXSA9IENBUDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9MXSA9IENDRURJTF9MOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX1VdID0gQ0NFRElMX1U7Ci0JCW5hbWVzW0lkcy5JRF9DRURJTF0gPSBDRURJTDsKLQkJbmFtZXNbSWRzLklEX0NFTlRdID0gQ0VOVDsKLQkJbmFtZXNbSWRzLklEX0NISV9MXSA9IENISV9MOwotCQluYW1lc1tJZHMuSURfQ0hJX1VdID0gQ0hJX1U7Ci0JCW5hbWVzW0lkcy5JRF9DSVJDXSA9IENJUkM7Ci0JCW5hbWVzW0lkcy5JRF9DTFVCU10gPSBDTFVCUzsKLQkJbmFtZXNbSWRzLklEX0NPTkddID0gQ09ORzsKLQkJbmFtZXNbSWRzLklEX0NPUFldID0gQ09QWTsKLQkJbmFtZXNbSWRzLklEX0NSQVJSXSA9IENSQVJSOwotCQluYW1lc1tJZHMuSURfQ1VQXSA9IENVUDsKLQkJbmFtZXNbSWRzLklEX0NVUlJFTl0gPSBDVVJSRU47Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfTF0gPSBEQUdHRVJfTDsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9VXSA9IERBR0dFUl9VOwotCQluYW1lc1tJZHMuSURfREFSUl9MXSA9IERBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0RBUlJfVV0gPSBEQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9ERUddID0gREVHOwotCQluYW1lc1tJZHMuSURfREVMVEFfTF0gPSBERUxUQV9MOwotCQluYW1lc1tJZHMuSURfREVMVEFfVV0gPSBERUxUQV9VOwotCQluYW1lc1tJZHMuSURfRElBTVNdID0gRElBTVM7Ci0JCW5hbWVzW0lkcy5JRF9ESVZJREVdID0gRElWSURFOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX0xdID0gRUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfVV0gPSBFQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX0xdID0gRUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX1VdID0gRUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9MXSA9IEVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX1VdID0gRUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FTVBUWV0gPSBFTVBUWTsKLQkJbmFtZXNbSWRzLklEX0VNU1BdID0gRU1TUDsKLQkJbmFtZXNbSWRzLklEX0VOU1BdID0gRU5TUDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fTF0gPSBFUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gRVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfRVFVSVZdID0gRVFVSVY7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfTF0gPSBFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0VUQV9VXSA9IEVUQV9VOwotCQluYW1lc1tJZHMuSURfRVRIX0xdID0gRVRIX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfVV0gPSBFVEhfVTsKLQkJbmFtZXNbSWRzLklEX0VVTUxfTF0gPSBFVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX1VdID0gRVVNTF9VOwotCQluYW1lc1tJZHMuSURfRVVST10gPSBFVVJPOwotCQluYW1lc1tJZHMuSURfRVhJU1RdID0gRVhJU1Q7Ci0JCW5hbWVzW0lkcy5JRF9GTk9GXSA9IEZOT0Y7Ci0JCW5hbWVzW0lkcy5JRF9GT1JBTExdID0gRk9SQUxMOwotCQluYW1lc1tJZHMuSURfRlJBQzEyXSA9IEZSQUMxMjsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxNF0gPSBGUkFDMTQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMzRdID0gRlJBQzM0OwotCQluYW1lc1tJZHMuSURfRlJBU0xdID0gRlJBU0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9MXSA9IEdBTU1BX0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9VXSA9IEdBTU1BX1U7Ci0JCW5hbWVzW0lkcy5JRF9HRV0gPSBHRTsKLQkJbmFtZXNbSWRzLklEX0dUXSA9IEdUOwotCQluYW1lc1tJZHMuSURfSEFSUl9MXSA9IEhBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfVV0gPSBIQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9IRUFSVFNdID0gSEVBUlRTOwotCQluYW1lc1tJZHMuSURfSEVMTElQXSA9IEhFTExJUDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9MXSA9IElBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX1VdID0gSUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19MXSA9IElDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19VXSA9IElDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9JRVhDTF0gPSBJRVhDTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9MXSA9IElHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX1VdID0gSUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JTUFHRV0gPSBJTUFHRTsKLQkJbmFtZXNbSWRzLklEX0lORklOXSA9IElORklOOwotCQluYW1lc1tJZHMuSURfSU5UXSA9IElOVDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfTF0gPSBJT1RBX0w7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX1VdID0gSU9UQV9VOwotCQluYW1lc1tJZHMuSURfSVFVRVNUXSA9IElRVUVTVDsKLQkJbmFtZXNbSWRzLklEX0lTSU5dID0gSVNJTjsKLQkJbmFtZXNbSWRzLklEX0lVTUxfTF0gPSBJVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX1VdID0gSVVNTF9VOwotCQluYW1lc1tJZHMuSURfS0FQUEFfTF0gPSBLQVBQQV9MOwotCQluYW1lc1tJZHMuSURfS0FQUEFfVV0gPSBLQVBQQV9VOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX0xdID0gTEFNQkRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfVV0gPSBMQU1CREFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTkddID0gTEFORzsKLQkJbmFtZXNbSWRzLklEX0xBUVVPXSA9IExBUVVPOwotCQluYW1lc1tJZHMuSURfTEFSUl9MXSA9IExBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0xBUlJfVV0gPSBMQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQ0VJTF0gPSBMQ0VJTDsKLQkJbmFtZXNbSWRzLklEX0xEUVVPXSA9IExEUVVPOwotCQluYW1lc1tJZHMuSURfTEVdID0gTEU7Ci0JCW5hbWVzW0lkcy5JRF9MRkxPT1JdID0gTEZMT09SOwotCQluYW1lc1tJZHMuSURfTE9XQVNUXSA9IExPV0FTVDsKLQkJbmFtZXNbSWRzLklEX0xPWl0gPSBMT1o7Ci0JCW5hbWVzW0lkcy5JRF9MUk1dID0gTFJNOwotCQluYW1lc1tJZHMuSURfTFNBUVVPXSA9IExTQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xTUVVPXSA9IExTUVVPOwotCQluYW1lc1tJZHMuSURfTFRdID0gTFQ7Ci0JCW5hbWVzW0lkcy5JRF9NQUNSXSA9IE1BQ1I7Ci0JCW5hbWVzW0lkcy5JRF9NREFTSF0gPSBNREFTSDsKLQkJbmFtZXNbSWRzLklEX01JQ1JPXSA9IE1JQ1JPOwotCQluYW1lc1tJZHMuSURfTUlERE9UXSA9IE1JRERPVDsKLQkJbmFtZXNbSWRzLklEX01JTlVTXSA9IE1JTlVTOwotCQluYW1lc1tJZHMuSURfTVVfTF0gPSBNVV9MOwotCQluYW1lc1tJZHMuSURfTVVfVV0gPSBNVV9VOwotCQluYW1lc1tJZHMuSURfTkFCTEFdID0gTkFCTEE7Ci0JCW5hbWVzW0lkcy5JRF9OQlNQXSA9IE5CU1A7Ci0JCW5hbWVzW0lkcy5JRF9OREFTSF0gPSBOREFTSDsKLQkJbmFtZXNbSWRzLklEX05FXSA9IE5FOwotCQluYW1lc1tJZHMuSURfTkldID0gTkk7Ci0JCW5hbWVzW0lkcy5JRF9OT1RdID0gTk9UOwotCQluYW1lc1tJZHMuSURfTk9USU5dID0gTk9USU47Ci0JCW5hbWVzW0lkcy5JRF9OU1VCXSA9IE5TVUI7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfTF0gPSBOVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX05USUxERV9VXSA9IE5USUxERV9VOwotCQluYW1lc1tJZHMuSURfTlVfTF0gPSBOVV9MOwotCQluYW1lc1tJZHMuSURfTlVfVV0gPSBOVV9VOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX0xdID0gT0FDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfVV0gPSBPQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX09DSVJDX0xdID0gT0NJUkNfTDsKLQkJbmFtZXNbSWRzLklEX09DSVJDX1VdID0gT0NJUkNfVTsKLQkJbmFtZXNbSWRzLklEX09FTElHX0xdID0gT0VMSUdfTDsKLQkJbmFtZXNbSWRzLklEX09FTElHX1VdID0gT0VMSUdfVTsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9MXSA9IE9HUkFWRV9MOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX1VdID0gT0dSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTElORV0gPSBPTElORTsKLQkJbmFtZXNbSWRzLklEX09NRUdBX0xdID0gT01FR0FfTDsKLQkJbmFtZXNbSWRzLklEX09NRUdBX1VdID0gT01FR0FfVTsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fTF0gPSBPTUlDUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gT01JQ1JPTl9VOwotCQluYW1lc1tJZHMuSURfT1BMVVNdID0gT1BMVVM7Ci0JCW5hbWVzW0lkcy5JRF9PUl0gPSBPUjsKLQkJbmFtZXNbSWRzLklEX09SREZdID0gT1JERjsKLQkJbmFtZXNbSWRzLklEX09SRE1dID0gT1JETTsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9MXSA9IE9TTEFTSF9MOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX1VdID0gT1NMQVNIX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfTF0gPSBPVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX09USUxERV9VXSA9IE9USUxERV9VOwotCQluYW1lc1tJZHMuSURfT1RJTUVTXSA9IE9USU1FUzsKLQkJbmFtZXNbSWRzLklEX09VTUxfTF0gPSBPVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX1VdID0gT1VNTF9VOwotCQluYW1lc1tJZHMuSURfUEFSQV0gPSBQQVJBOwotCQluYW1lc1tJZHMuSURfUEFSVF0gPSBQQVJUOwotCQluYW1lc1tJZHMuSURfUEVSTUlMXSA9IFBFUk1JTDsKLQkJbmFtZXNbSWRzLklEX1BFUlBdID0gUEVSUDsKLQkJbmFtZXNbSWRzLklEX1BISV9MXSA9IFBISV9MOwotCQluYW1lc1tJZHMuSURfUEhJX1VdID0gUEhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QSVZdID0gUElWOwotCQluYW1lc1tJZHMuSURfUElfTF0gPSBQSV9MOwotCQluYW1lc1tJZHMuSURfUElfVV0gPSBQSV9VOwotCQluYW1lc1tJZHMuSURfUExVU01OXSA9IFBMVVNNTjsKLQkJbmFtZXNbSWRzLklEX1BPVU5EXSA9IFBPVU5EOwotCQluYW1lc1tJZHMuSURfUFJJTUVfTF0gPSBQUklNRV9MOwotCQluYW1lc1tJZHMuSURfUFJJTUVfVV0gPSBQUklNRV9VOwotCQluYW1lc1tJZHMuSURfUFJPRF0gPSBQUk9EOwotCQluYW1lc1tJZHMuSURfUFJPUF0gPSBQUk9QOwotCQluYW1lc1tJZHMuSURfUFNJX0xdID0gUFNJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfVV0gPSBQU0lfVTsKLQkJbmFtZXNbSWRzLklEX1FVT1RdID0gUVVPVDsKLQkJbmFtZXNbSWRzLklEX1JBRElDXSA9IFJBRElDOwotCQluYW1lc1tJZHMuSURfUkFOR10gPSBSQU5HOwotCQluYW1lc1tJZHMuSURfUkFRVU9dID0gUkFRVU87Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX0xdID0gUkFSUl9MOwotCQluYW1lc1tJZHMuSURfUkFSUl9VXSA9IFJBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1JDRUlMXSA9IFJDRUlMOwotCQluYW1lc1tJZHMuSURfUkRRVU9dID0gUkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9SRUFMXSA9IFJFQUw7Ci0JCW5hbWVzW0lkcy5JRF9SRUddID0gUkVHOwotCQluYW1lc1tJZHMuSURfUkZMT09SXSA9IFJGTE9PUjsKLQkJbmFtZXNbSWRzLklEX1JIT19MXSA9IFJIT19MOwotCQluYW1lc1tJZHMuSURfUkhPX1VdID0gUkhPX1U7Ci0JCW5hbWVzW0lkcy5JRF9STE1dID0gUkxNOwotCQluYW1lc1tJZHMuSURfUlNBUVVPXSA9IFJTQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JTUVVPXSA9IFJTUVVPOwotCQluYW1lc1tJZHMuSURfU0JRVU9dID0gU0JRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fTF0gPSBTQ0FST05fTDsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9VXSA9IFNDQVJPTl9VOwotCQluYW1lc1tJZHMuSURfU0RPVF0gPSBTRE9UOwotCQluYW1lc1tJZHMuSURfU0VDVF0gPSBTRUNUOwotCQluYW1lc1tJZHMuSURfU0hZXSA9IFNIWTsKLQkJbmFtZXNbSWRzLklEX1NJR01BRl0gPSBTSUdNQUY7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9MXSA9IFNJR01BX0w7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9VXSA9IFNJR01BX1U7Ci0JCW5hbWVzW0lkcy5JRF9TSU1dID0gU0lNOwotCQluYW1lc1tJZHMuSURfU1BBREVTXSA9IFNQQURFUzsKLQkJbmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCW5hbWVzW0lkcy5JRF9TVUJFXSA9IFNVQkU7Ci0JCW5hbWVzW0lkcy5JRF9TVU1dID0gU1VNOwotCQluYW1lc1tJZHMuSURfU1VQXSA9IFNVUDsKLQkJbmFtZXNbSWRzLklEX1NVUDFdID0gU1VQMTsKLQkJbmFtZXNbSWRzLklEX1NVUDJdID0gU1VQMjsKLQkJbmFtZXNbSWRzLklEX1NVUDNdID0gU1VQMzsKLQkJbmFtZXNbSWRzLklEX1NVUEVdID0gU1VQRTsKLQkJbmFtZXNbSWRzLklEX1NaTElHXSA9IFNaTElHOwotCQluYW1lc1tJZHMuSURfVEFVX0xdID0gVEFVX0w7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfVV0gPSBUQVVfVTsKLQkJbmFtZXNbSWRzLklEX1RIRVJFNF0gPSBUSEVSRTQ7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQVNZTV0gPSBUSEVUQVNZTTsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX0xdID0gVEhFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX1VdID0gVEhFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1RISU5TUF0gPSBUSElOU1A7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9MXSA9IFRIT1JOX0w7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9VXSA9IFRIT1JOX1U7Ci0JCW5hbWVzW0lkcy5JRF9USUxERV0gPSBUSUxERTsKLQkJbmFtZXNbSWRzLklEX1RJTUVTXSA9IFRJTUVTOwotCQluYW1lc1tJZHMuSURfVFJBREVdID0gVFJBREU7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfTF0gPSBVQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9VXSA9IFVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfVUFSUl9MXSA9IFVBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1VBUlJfVV0gPSBVQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19MXSA9IFVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19VXSA9IFVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfTF0gPSBVR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9VXSA9IFVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfVU1MXSA9IFVNTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lIXSA9IFVQU0lIOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9MXSA9IFVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fVV0gPSBVUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX0xdID0gVVVNTF9MOwotCQluYW1lc1tJZHMuSURfVVVNTF9VXSA9IFVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1dFSUVSUF0gPSBXRUlFUlA7Ci0JCW5hbWVzW0lkcy5JRF9YSV9MXSA9IFhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9YSV9VXSA9IFhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSBZQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9VXSA9IFlBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfWUVOXSA9IFlFTjsKLQkJbmFtZXNbSWRzLklEX1lVTUxfTF0gPSBZVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX1VdID0gWVVNTF9VOwotCQluYW1lc1tJZHMuSURfWkVUQV9MXSA9IFpFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1pFVEFfVV0gPSBaRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9aV0pdID0gWldKOwotCQluYW1lc1tJZHMuSURfWldOSl0gPSBaV05KOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdmFsdWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCXZhbHVlcyA9IG5ldyBjaGFyW0lkcy5nZXROdW1PZklkcygpXTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfTF0gPSAyMjU7Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX1VdID0gMTkzOwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX0xdID0gMjI2OwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX1VdID0gMTk0OwotCQl2YWx1ZXNbSWRzLklEX0FDVVRFXSA9IDE4MDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19MXSA9IDIzMDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19VXSA9IDE5ODsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfTF0gPSAyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX1VdID0gMTkyOwotCQl2YWx1ZXNbSWRzLklEX0FMRUZTWU1dID0gODUwMTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9MXSA9IDk0NTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9VXSA9IDkxMzsKLQkJdmFsdWVzW0lkcy5JRF9BTVBdID0gMzg7Ci0JCXZhbHVlc1tJZHMuSURfQU5EXSA9IDg3NDM7Ci0JCXZhbHVlc1tJZHMuSURfQU5HXSA9IDg3MzY7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfTF0gPSAyMjk7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfVV0gPSAxOTc7Ci0JCXZhbHVlc1tJZHMuSURfQVNZTVBdID0gODc3NjsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfTF0gPSAyMjc7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX1VdID0gMTk1OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfTF0gPSAyMjg7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9VXSA9IDE5NjsKLQkJdmFsdWVzW0lkcy5JRF9CRFFVT10gPSA4MjIyOwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfTF0gPSA5NDY7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9VXSA9IDkxNDsKLQkJdmFsdWVzW0lkcy5JRF9CUlZCQVJdID0gMTY2OwotCQl2YWx1ZXNbSWRzLklEX0JVTExdID0gODIyNjsKLQkJdmFsdWVzW0lkcy5JRF9DQVBdID0gODc0NTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfTF0gPSAyMzE7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX1VdID0gMTk5OwotCQl2YWx1ZXNbSWRzLklEX0NFRElMXSA9IDE4NDsKLQkJdmFsdWVzW0lkcy5JRF9DRU5UXSA9IDE2MjsKLQkJdmFsdWVzW0lkcy5JRF9DSElfTF0gPSA5Njc7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX1VdID0gOTM1OwotCQl2YWx1ZXNbSWRzLklEX0NJUkNdID0gNzEwOwotCQl2YWx1ZXNbSWRzLklEX0NMVUJTXSA9IDk4Mjc7Ci0JCXZhbHVlc1tJZHMuSURfQ09OR10gPSA4NzczOwotCQl2YWx1ZXNbSWRzLklEX0NPUFldID0gMTY5OwotCQl2YWx1ZXNbSWRzLklEX0NSQVJSXSA9IDg2Mjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1VQXSA9IDg3NDY7Ci0JCXZhbHVlc1tJZHMuSURfQ1VSUkVOXSA9IDE2NDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfTF0gPSA4MjI0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9VXSA9IDgyMjU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9MXSA9IDg1OTU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9VXSA9IDg2NTk7Ci0JCXZhbHVlc1tJZHMuSURfREVHXSA9IDE3NjsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9MXSA9IDk0ODsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9VXSA9IDkxNjsKLQkJdmFsdWVzW0lkcy5JRF9ESUFNU10gPSA5ODMwOwotCQl2YWx1ZXNbSWRzLklEX0RJVklERV0gPSAyNDc7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX0xdID0gMjMzOwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9VXSA9IDIwMTsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19MXSA9IDIzNDsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19VXSA9IDIwMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfTF0gPSAyMzI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX1VdID0gMjAwOwotCQl2YWx1ZXNbSWRzLklEX0VNUFRZXSA9IDg3MDk7Ci0JCXZhbHVlc1tJZHMuSURfRU1TUF0gPSA4MTk1OwotCQl2YWx1ZXNbSWRzLklEX0VOU1BdID0gODE5NDsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gOTQ5OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fVV0gPSA5MTc7Ci0JCXZhbHVlc1tJZHMuSURfRVFVSVZdID0gODgwMTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfTF0gPSA5NTE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX1VdID0gOTE5OwotCQl2YWx1ZXNbSWRzLklEX0VUSF9MXSA9IDI0MDsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfVV0gPSAyMDg7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9MXSA9IDIzNTsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX1VdID0gMjAzOwotCQl2YWx1ZXNbSWRzLklEX0VVUk9dID0gODM2NDsKLQkJdmFsdWVzW0lkcy5JRF9FWElTVF0gPSA4NzA3OwotCQl2YWx1ZXNbSWRzLklEX0ZOT0ZdID0gNDAyOwotCQl2YWx1ZXNbSWRzLklEX0ZPUkFMTF0gPSA4NzA0OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxMl0gPSAxODk7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzE0XSA9IDE4ODsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMzRdID0gMTkwOwotCQl2YWx1ZXNbSWRzLklEX0ZSQVNMXSA9IDgyNjA7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfTF0gPSA5NDc7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfVV0gPSA5MTU7Ci0JCXZhbHVlc1tJZHMuSURfR0VdID0gODgwNTsKLQkJdmFsdWVzW0lkcy5JRF9HVF0gPSA2MjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX0xdID0gODU5NjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX1VdID0gODY2MDsKLQkJdmFsdWVzW0lkcy5JRF9IRUFSVFNdID0gOTgyOTsKLQkJdmFsdWVzW0lkcy5JRF9IRUxMSVBdID0gODIzMDsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfTF0gPSAyMzc7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX1VdID0gMjA1OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX0xdID0gMjM4OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX1VdID0gMjA2OwotCQl2YWx1ZXNbSWRzLklEX0lFWENMXSA9IDE2MTsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfTF0gPSAyMzY7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX1VdID0gMjA0OwotCQl2YWx1ZXNbSWRzLklEX0lNQUdFXSA9IDg0NjU7Ci0JCXZhbHVlc1tJZHMuSURfSU5GSU5dID0gODczNDsKLQkJdmFsdWVzW0lkcy5JRF9JTlRdID0gODc0NzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX0xdID0gOTUzOwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfVV0gPSA5MjE7Ci0JCXZhbHVlc1tJZHMuSURfSVFVRVNUXSA9IDE5MTsKLQkJdmFsdWVzW0lkcy5JRF9JU0lOXSA9IDg3MTI7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9MXSA9IDIzOTsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX1VdID0gMjA3OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX0xdID0gOTU0OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX1VdID0gOTIyOwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9MXSA9IDk1NTsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfVV0gPSA5MjM7Ci0JCXZhbHVlc1tJZHMuSURfTEFOR10gPSA5MDAxOwotCQl2YWx1ZXNbSWRzLklEX0xBUVVPXSA9IDE3MTsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX0xdID0gODU5MjsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX1VdID0gODY1NjsKLQkJdmFsdWVzW0lkcy5JRF9MQ0VJTF0gPSA4OTY4OwotCQl2YWx1ZXNbSWRzLklEX0xEUVVPXSA9IDgyMjA7Ci0JCXZhbHVlc1tJZHMuSURfTEVdID0gODgwNDsKLQkJdmFsdWVzW0lkcy5JRF9MRkxPT1JdID0gODk3MDsKLQkJdmFsdWVzW0lkcy5JRF9MT1dBU1RdID0gODcyNzsKLQkJdmFsdWVzW0lkcy5JRF9MT1pdID0gOTY3NDsKLQkJdmFsdWVzW0lkcy5JRF9MUk1dID0gODIwNjsKLQkJdmFsdWVzW0lkcy5JRF9MU0FRVU9dID0gODI0OTsKLQkJdmFsdWVzW0lkcy5JRF9MU1FVT10gPSA4MjE2OwotCQl2YWx1ZXNbSWRzLklEX0xUXSA9IDYwOwotCQl2YWx1ZXNbSWRzLklEX01BQ1JdID0gMTc1OwotCQl2YWx1ZXNbSWRzLklEX01EQVNIXSA9IDgyMTI7Ci0JCXZhbHVlc1tJZHMuSURfTUlDUk9dID0gMTgxOwotCQl2YWx1ZXNbSWRzLklEX01JRERPVF0gPSAxODM7Ci0JCXZhbHVlc1tJZHMuSURfTUlOVVNdID0gODcyMjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9MXSA9IDk1NjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9VXSA9IDkyNDsKLQkJdmFsdWVzW0lkcy5JRF9OQUJMQV0gPSA4NzExOwotCQl2YWx1ZXNbSWRzLklEX05CU1BdID0gMTYwOwotCQl2YWx1ZXNbSWRzLklEX05EQVNIXSA9IDgyMTE7Ci0JCXZhbHVlc1tJZHMuSURfTkVdID0gODgwMDsKLQkJdmFsdWVzW0lkcy5JRF9OSV0gPSA4NzE1OwotCQl2YWx1ZXNbSWRzLklEX05PVF0gPSAxNzI7Ci0JCXZhbHVlc1tJZHMuSURfTk9USU5dID0gODcxMzsKLQkJdmFsdWVzW0lkcy5JRF9OU1VCXSA9IDg4MzY7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX0xdID0gMjQxOwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9VXSA9IDIwOTsKLQkJdmFsdWVzW0lkcy5JRF9OVV9MXSA9IDk1NzsKLQkJdmFsdWVzW0lkcy5JRF9OVV9VXSA9IDkyNTsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfTF0gPSAyNDM7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX1VdID0gMjExOwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX0xdID0gMjQ0OwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX1VdID0gMjEyOwotCQl2YWx1ZXNbSWRzLklEX09FTElHX0xdID0gMzM5OwotCQl2YWx1ZXNbSWRzLklEX09FTElHX1VdID0gMzM4OwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9MXSA9IDI0MjsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfVV0gPSAyMTA7Ci0JCXZhbHVlc1tJZHMuSURfT0xJTkVdID0gODI1NDsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9MXSA9IDk2OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9VXSA9IDkzNzsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gOTU5OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fVV0gPSA5Mjc7Ci0JCXZhbHVlc1tJZHMuSURfT1BMVVNdID0gODg1MzsKLQkJdmFsdWVzW0lkcy5JRF9PUl0gPSA4NzQ0OwotCQl2YWx1ZXNbSWRzLklEX09SREZdID0gMTcwOwotCQl2YWx1ZXNbSWRzLklEX09SRE1dID0gMTg2OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9MXSA9IDI0ODsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfVV0gPSAyMTY7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX0xdID0gMjQ1OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9VXSA9IDIxMzsKLQkJdmFsdWVzW0lkcy5JRF9PVElNRVNdID0gODg1NTsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX0xdID0gMjQ2OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfVV0gPSAyMTQ7Ci0JCXZhbHVlc1tJZHMuSURfUEFSQV0gPSAxODI7Ci0JCXZhbHVlc1tJZHMuSURfUEFSVF0gPSA4NzA2OwotCQl2YWx1ZXNbSWRzLklEX1BFUk1JTF0gPSA4MjQwOwotCQl2YWx1ZXNbSWRzLklEX1BFUlBdID0gODg2OTsKLQkJdmFsdWVzW0lkcy5JRF9QSElfTF0gPSA5NjY7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX1VdID0gOTM0OwotCQl2YWx1ZXNbSWRzLklEX1BJVl0gPSA5ODI7Ci0JCXZhbHVlc1tJZHMuSURfUElfTF0gPSA5NjA7Ci0JCXZhbHVlc1tJZHMuSURfUElfVV0gPSA5Mjg7Ci0JCXZhbHVlc1tJZHMuSURfUExVU01OXSA9IDE3NzsKLQkJdmFsdWVzW0lkcy5JRF9QT1VORF0gPSAxNjM7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfTF0gPSA4MjQyOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX1VdID0gODI0MzsKLQkJdmFsdWVzW0lkcy5JRF9QUk9EXSA9IDg3MTk7Ci0JCXZhbHVlc1tJZHMuSURfUFJPUF0gPSA4NzMzOwotCQl2YWx1ZXNbSWRzLklEX1BTSV9MXSA9IDk2ODsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfVV0gPSA5MzY7Ci0JCXZhbHVlc1tJZHMuSURfUVVPVF0gPSAzNDsKLQkJdmFsdWVzW0lkcy5JRF9SQURJQ10gPSA4NzMwOwotCQl2YWx1ZXNbSWRzLklEX1JBTkddID0gOTAwMjsKLQkJdmFsdWVzW0lkcy5JRF9SQVFVT10gPSAxODc7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9MXSA9IDg1OTQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9VXSA9IDg2NTg7Ci0JCXZhbHVlc1tJZHMuSURfUkNFSUxdID0gODk2OTsKLQkJdmFsdWVzW0lkcy5JRF9SRFFVT10gPSA4MjIxOwotCQl2YWx1ZXNbSWRzLklEX1JFQUxdID0gODQ3NjsKLQkJdmFsdWVzW0lkcy5JRF9SRUddID0gMTc0OwotCQl2YWx1ZXNbSWRzLklEX1JGTE9PUl0gPSA4OTcxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19MXSA9IDk2MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fVV0gPSA5Mjk7Ci0JCXZhbHVlc1tJZHMuSURfUkxNXSA9IDgyMDc7Ci0JCXZhbHVlc1tJZHMuSURfUlNBUVVPXSA9IDgyNTA7Ci0JCXZhbHVlc1tJZHMuSURfUlNRVU9dID0gODIxNzsKLQkJdmFsdWVzW0lkcy5JRF9TQlFVT10gPSA4MjE4OwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9MXSA9IDM1MzsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fVV0gPSAzNTI7Ci0JCXZhbHVlc1tJZHMuSURfU0RPVF0gPSA4OTAxOwotCQl2YWx1ZXNbSWRzLklEX1NFQ1RdID0gMTY3OwotCQl2YWx1ZXNbSWRzLklEX1NIWV0gPSAxNzM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFGXSA9IDk2MjsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9MXSA9IDk2MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9VXSA9IDkzMTsKLQkJdmFsdWVzW0lkcy5JRF9TSU1dID0gODc2NDsKLQkJdmFsdWVzW0lkcy5JRF9TUEFERVNdID0gOTgyNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJdID0gODgzNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJFXSA9IDg4Mzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VNXSA9IDg3MjE7Ci0JCXZhbHVlc1tJZHMuSURfU1VQXSA9IDg4MzU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMV0gPSAxODU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMl0gPSAxNzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VQM10gPSAxNzk7Ci0JCXZhbHVlc1tJZHMuSURfU1VQRV0gPSA4ODM5OwotCQl2YWx1ZXNbSWRzLklEX1NaTElHXSA9IDIyMzsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfTF0gPSA5NjQ7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX1VdID0gOTMyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVJFNF0gPSA4NzU2OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBU1lNXSA9IDk3NzsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9MXSA9IDk1MjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9VXSA9IDkyMDsKLQkJdmFsdWVzW0lkcy5JRF9USElOU1BdID0gODIwMTsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9MXSA9IDI1NDsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9VXSA9IDIyMjsKLQkJdmFsdWVzW0lkcy5JRF9USUxERV0gPSA3MzI7Ci0JCXZhbHVlc1tJZHMuSURfVElNRVNdID0gMjE1OwotCQl2YWx1ZXNbSWRzLklEX1RSQURFXSA9IDg0ODI7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX0xdID0gMjUwOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9VXSA9IDIxODsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX0xdID0gODU5MzsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX1VdID0gODY1NzsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19MXSA9IDI1MTsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19VXSA9IDIxOTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfTF0gPSAyNDk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX1VdID0gMjE3OwotCQl2YWx1ZXNbSWRzLklEX1VNTF0gPSAxNjg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUhdID0gOTc4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fTF0gPSA5NjU7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9VXSA9IDkzMzsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX0xdID0gMjUyOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfVV0gPSAyMjA7Ci0JCXZhbHVlc1tJZHMuSURfV0VJRVJQXSA9IDg0NzI7Ci0JCXZhbHVlc1tJZHMuSURfWElfTF0gPSA5NTg7Ci0JCXZhbHVlc1tJZHMuSURfWElfVV0gPSA5MjY7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX0xdID0gMjUzOwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9VXSA9IDIyMTsKLQkJdmFsdWVzW0lkcy5JRF9ZRU5dID0gMTY1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfTF0gPSAyNTU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9VXSA9IDM3NjsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX0xdID0gOTUwOwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfVV0gPSA5MTg7Ci0JCXZhbHVlc1tJZHMuSURfWldKXSA9IDgyMDU7Ci0JCXZhbHVlc1tJZHMuSURfWldOSl0gPSA4MjA0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnRpdHlDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbnRpdHkgZGVjbGFyYXRpb24uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQoZW50aXR5TmFtZSk7Ci0JCWlmIChpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWVzW2lkXSk7Ci0JCUhUTUxFbnRpdHlEZWNsSW1wbCBkZWMgPSBuZXcgSFRNTEVudGl0eURlY2xJbXBsKGVudGl0eU5hbWUsIHZhbHVlKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxBdHRyRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDVkNjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIHtAbGluayA8Y29kZT5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb248L2NvZGU+fSBpbnRlcmZhY2UuPGJyPgotICovCi1jbGFzcyBIVE1MQXR0ckRlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIEhUTUxDTURhdGFUeXBlSW1wbCB0eXBlID0gbnVsbDsKLQlwcml2YXRlIGludCB1c2FnZSA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJEZWNsSW1wbChTdHJpbmcgYXR0ck5hbWUsIEhUTUxDTURhdGFUeXBlSW1wbCB2YWx1ZVR5cGUsIGludCB2YWx1ZVVzYWdlKSB7Ci0JCXN1cGVyKGF0dHJOYW1lKTsKLQkJdGhpcy50eXBlID0gdmFsdWVUeXBlOwotCi0JCXN3aXRjaCAodmFsdWVVc2FnZSkgewotCQkJY2FzZSBPUFRJT05BTCA6Ci0JCQljYXNlIFJFUVVJUkVEIDoKLQkJCWNhc2UgRklYRUQgOgotCQkJY2FzZSBQUk9ISUJJVEVEIDoKLQkJCQl0aGlzLnVzYWdlID0gdmFsdWVVc2FnZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLi4uCi0JCQkJdGhpcy51c2FnZSA9IE9QVElPTkFMOyAvLyBmYWxsIGJhY2sKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldEF0dHJOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01EYXRhVHlwZQotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCWlmICh0eXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSkpOwotCQlyZXR1cm4gdi5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJcmV0dXJuIHVzYWdlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5MzFiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLS8qKgotICovCi1jbGFzcyBIVE1MQ01EYXRhVHlwZUltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRGF0YVR5cGUgewotCi0JcHJpdmF0ZSBpbnQgaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQlwcml2YXRlIFN0cmluZyBpbXBsaWVkVmFsdWUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGVtcHR5QXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgU3RyaW5nW10gZW51bVZhbHVlcyA9IGVtcHR5QXJyYXk7Ci0JcHJpdmF0ZSBTdHJpbmcgaW5zdGFuY2VWYWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBIVE1MQ01EYXRhVHlwZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQ01EYXRhVHlwZUltcGwoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MQ01EYXRhVHlwZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQ01EYXRhVHlwZUltcGwoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgaW5zdGFuY2VWYWx1ZSkgewotCQlzdXBlcih0eXBlTmFtZSk7Ci0JCXRoaXMuaW5zdGFuY2VWYWx1ZSA9IGluc3RhbmNlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICoKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotCSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCXJldHVybiBlbnVtVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0JICoKLQkgKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKSB7Ci0JCXJldHVybiBpbXBsaWVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0SW1wbGllZFZhbHVlS2luZCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCwgSU1QTElFRF9WQUxVRV9ERUZBVUxULgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZUtpbmQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RW51bVZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJZW51bVZhbHVlcyA9IG5ldyBTdHJpbmdbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbnVtVmFsdWVzW2ldID0gdmFsdWVzW2ldOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcGFja2FnZSBzY29wZS4KLQkgKi8KLQl2b2lkIHNldEltcGxpZWRWYWx1ZShpbnQga2luZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0ZJWEVEIDoKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9ERUZBVUxUIDoKLQkJCQlpbXBsaWVkVmFsdWVLaW5kID0ga2luZDsKLQkJCQlpbXBsaWVkVmFsdWUgPSB2YWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW1wbGllZFZhbHVlID0gbnVsbDsgLy8gbWF5YmUgYSBudWxsIHN0cmluZz8KLQkJCQlicmVhazsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTENNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWU1NTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTENNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIGRlY2xhcmF0aW9uIGlzIGZvciBIVE1MIGF0dHJpYnV0ZS9lbGVtZW50L2VudGl0eS4KLQkgKiBPdGhlcndpc2UsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRWxlbURlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTI5NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRWxlbURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MUHJvcGVydHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgSGVkPz8/PyBjbGFzc2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIVE1MRWxlbURlY2xJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24sIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQotCS8vIERURAotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCS8qKiBOZXZlciBhY2Nlc3MgdGhpcyBmaWVsZCBkaXJlY3RseS4gIEluc3RlYWQsIHVzZSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24gbWV0aG9kLiAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgaW5jbHVzaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgZXhjbHVzaW9uID0gbnVsbDsKLQkvLyBhZHZhbmNlZCBpbmZvcm1hdGlvbgotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkQW5jZXN0b3JzID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9OT05FOwotCXByb3RlY3RlZCBpbnQgZm9ybWF0VHlwZSA9IEZPUk1BVF9IVE1MOwotCXByb3RlY3RlZCBpbnQgbGF5b3V0VHlwZSA9IExBWU9VVF9OT05FOwotCXByb3RlY3RlZCBpbnQgb21pdFR5cGUgPSBPTUlUX05PTkU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4ga2VlcFNwYWNlcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBIVE1MRWxlbURlY2xJbXBsIGNvbnN0cnVjdG9yLgotCSAqIEluIHRoZSBIVE1MIERURCwgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBoYXMgbm8gc3BlY2lmaWNhdGlvbgotCSAqIGZvciBpdHMgb2NjdXJyZW5jZS4gIE9jY3VycmVuY2UgaXMgc3BlY2lmZWQgaW4gY29udGVudCBtb2RlbCwgbGlrZQotCSAqIDxjb2RlPihMSSkrPC9jb2RlPi4gIFRvIGF2b2lkIGNvbmZ1c2lvbiAoYW5kIGNvbXBsZXhpdHkpLAotCSAqIG9jY3VycmVuY2Ugb2YgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBhbHdheXMgMSAoaXQgbWVhbnMsIG1pbiA9IDEgYW5kCi0JICogbWF4ID0gMSkuICBJbnN0ZWFkLCBvY2N1cnJlbmNlIG9mIENNR3JvdXAgcmVwcmVzZW50cyBhY3R1YWwgb2NjdXJyZW5jZQotCSAqIG9mIHRoZSBjb250ZW50LgotCSAqIDxicj4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxFbGVtRGVjbEltcGwoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCAxLCAxKTsKLQkJZWxlbWVudENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbi5nZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ0RBVEEpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWSkgfHwgdHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BDREFUQSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGZhY3RvcnkgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwgZXJyb3IuCi0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGZhY3RvcnkuY3JlYXRlVHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb25OYW1lLCBlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlCi0JCX0KLQotCQlDTU5vZGUgY21ub2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCWNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBpbnN0YW5jZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbiA9PSBudWxsKQotCQkJdHlwZURlZmluaXRpb24gPSBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJcmV0dXJuIHR5cGVEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm4gbnVsbC4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7IC8vIGxhenkgZXZhbC4KLQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0Q29udGVudCgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSB0eXBlLgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdHJpZXMgdG8gY3JlYXRlIGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24KLQkgKiBpbnN0YW5jZSBhbmQgYWNjZXNzIHRvIGl0LgotCSAqIDxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7IC8vIGxhenkgZXZhbC4KLQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0Q29udGVudFR5cGUoKSA6IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb3JyZWN0aW9uVHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29ycmVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBjb3JyZWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBkYXRhIHR5cGUuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiBBbG1vc3QgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhIGV4Y2x1c2lvbi4KLQkgKiBPbmx5IGNsYXNzZXMgdGhvc2UgaGF2ZSBleGNsdXNpb24gc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGZvcm1hdCB0eXBlIGlzIDxjb2RlPkZPUk1BVF9IVE1MPC9jb2RlPi48YnI+Ci0JICovCi0JcHVibGljIGludCBnZXRGb3JtYXRUeXBlKCkgewotCQlyZXR1cm4gZm9ybWF0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBJbmNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBpbmNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgaW5jbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMYXlvdXRUeXBlKCkgewotCQlyZXR1cm4gbGF5b3V0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBMaW5lIGJyZWFrIGhpbnQgaXMgc3Ryb25nbHkgcmVsYXRlZCB0byBsYXlvdXQgdHlwZS4KLQkgKiBJbmRlZWQsIGluIHRoZSBDKytET00sIGl0IGlzIGRldGVybWluZWQgZnJvbSBsYXlvdXQgdHlwZSBvbmx5LgotCSAqIFNvLCB0aGlzIGltcGxlbWVudGF0aW9uLCBhcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIGRlY2xhcmF0aW9ucywKLQkgKiBhbHNvIGRldGVybWluZXMgZnJvbSBsYXlvdXQgdHlwZSBvbmx5Ljxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSGludCgpIHsKLQkJc3dpdGNoIChnZXRMYXlvdXRUeXBlKCkpIHsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CUkVBSyA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQUZURVJfU1RBUlQ7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm8gSFRNTCBlbGVtZW50IGhhcyBsb2NhbCBlbGVtZW50cy4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIGFuIGVtcHR5IG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIEVNUFRZX01BUDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T21pdFR5cGUoKSB7Ci0JCXJldHVybiBvbWl0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJcmV0dXJuIEVNUFRZX01BUDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gcHAuc3VwcG9ydHModGhpcyk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0UHJpbWFyeUNhbmRpZGF0ZSgpIDogbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcHAuZ2V0KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGVsZW1lbnQgbmFtZXMgd2hpY2ggdGVybWluYXRlcyB0aGlzIGVsZW1lbnQuPGJyPgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBlbGVtZW50IGlzIGEgSlNQIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1AoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbiBzb21lIGVsZW1lbnRzLCBzdWNoIGFzIEFQUExFVCwgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBpbmRlbnQgY2hpbGQKLQkgKiBlbGVtZW50cyB0aGF0IHRoZWlyIHBhcmVudHMuICBUaGF0IGlzLCBhIHNvdXJjZSBnZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlCi0JICogc291cmNlICBvZiBBUFBMRVQgYW5kIFBBUkFNUyBsaWtlIHRoaXM6Ci0JICogPFBSRT4KLQkgKiAgICZsdDtBUFBMRVQgLi4uJmd0OwotCSAqICAgICAmbHQ7UEFSQU0gLi4uICZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAmbHQ7L0FQUExFVCZndDsKLQkgKiA8UFJFPgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQlyZXR1cm4gaW5kZW50Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogTW9zdCBvZiBlbGVtZW50cyBjYW4gY29tcGFjdCBzcGFjZXMgaW4gdGhlaXIgY2hpbGQgdGV4dCBub2Rlcy4KLQkgKiBTb21lIHNwZWNpYWwgZWxlbWVudHMgc2hvdWxkIGtlZXAgdGhlbSBpbiB0aGVpciBzb3VyY2UuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlcygpIHsKLQkJcmV0dXJuIGtlZXBTcGFjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBuZXh0RWxlbWVudCkgewotCQlJdGVyYXRvciBpID0gZ2V0VGVybWluYXRvcnMoKTsKLQkJaWYgKGkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5leHROYW1lID0gbmV4dEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAobmV4dE5hbWUuZXF1YWxzKGkubmV4dCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjNkMmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLS8qKgotICovCi1jbGFzcyBIVE1MRW50aXR5RGVjbEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEVudGl0eURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUVudGl0eURlY2xJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGVudGl0eU5hbWUgamF2YS5sYW5nLlN0cmluZzsgRW50aXR5IG5hbWUuCi0JICogQHBhcmFtIGVudGl0eVZhbHVlIGphdmEubGFuZy5TdHJpbmc7IFZhbHVlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xJbXBsKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5VmFsdWUpIHsKLQkJc3VwZXIoZW50aXR5TmFtZSk7Ci0JCXZhbHVlID0gZW50aXR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCBDTU5vZGUgdHlwZS48YnI+Ci0JICogQHJldHVybiBpbnQ7IEFsd2F5cyByZXR1cm4gRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRU5USVRZX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdGllcyBpbiBIVE1MIGRvY3VtZW50cyBhcmUgYWx3YXlzIHRyZWF0ZWQgd2l0aCBpZ25vcmluZyBjYXNlcy4KLQkgKiBCZWNhdXNlIG5vIHNwZWNpYWwgZW50aXRpZXMgYXJlIGRlZmluZWQgaW4gSlNQIDEuMCwgdGhpcyBtZXRob2QKLQkgKiBjYW4gYWx3YXlzIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi48YnI+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NWNhMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBBLgotICovCi1maW5hbCBjbGFzcyBIZWRBIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChzaGFwZSAlU2hhcGU7IHJlY3QpCi0JICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRix9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+QTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+QTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGEgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7Ci0JCWlmIChhICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoYSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQUREUkVTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBRERSRVNTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTc5ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBRERSRVNTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQUREUkVTUyBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFERFJFU1MoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9BRERSRVNTOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkFTRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCQVNFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmM4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCQVNFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogQkFTRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkFTRSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCQVNFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEJBU0UgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQkFTRS4KLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRix9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCTE9DS1FVT1RFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJMT0NLUVVPVEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4MTU2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJMT0NLUVVPVEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBCTE9DS1FVT1RFLgotICovCi1maW5hbCBjbGFzcyBIZWRCTE9DS1FVT1RFIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkxPQ0tRVU9URShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJPRFkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTIyODhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBCT0RZLgotICovCi1maW5hbCBjbGFzcyBIZWRCT0RZIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCT0RZKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlYm9keWNvbG9yczsKLQkgKiAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAobWFyZ2lud2lkdGggJVBpeGVsczsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICogKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkgLi4gRDIwNTUxNAotCSAqICh0b3BtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLi4uIEQyMDU1MTQKLQkgKiAoYm90dG9tbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICogKGxlZnRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLi4gRDIwNTUxNAotCSAqIChyaWdodG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWJvZHljb2xvcnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Qm9keWNvbG9ycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqIEJPRFkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGVmNDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIEJSLgotICovCi1maW5hbCBjbGFzcyBIZWRCUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JSRUFLLgotCQkvLyBCZWNhdXNlLCBCUiBpcyBHUk9VUF9CUkVBSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JLyoqCi0JICogQlIuCi0JICogJWNvcmVhdHRyczsKLQkgKiAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vIGNsZWFyCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRDRU5URVIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzYwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRDRU5URVIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBDRU5URVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENFTlRFUiBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENFTlRFUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkYTI5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERELgotICovCi1maW5hbCBjbGFzcyBIZWRERCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRERChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRELCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEREIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRElWLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGI1NmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRElWLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogRElWLgotICovCi1maW5hbCBjbGFzcyBIZWRESVYgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRESVYoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlYWxpZ247Ci0JICogJXJlc2VydmVkOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYWxpZ247Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRETC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDljOWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBETC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRETChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhcnJheXM7Ci0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyYzRjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERULgotICovCi1maW5hbCBjbGFzcyBIZWREVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRFQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmMzMGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBFTVBUWSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRFbXB0eSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEVtcHR5KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFk7Ci0JCS8vIEVNUFRZIHR5cGUgaGFzIG5vIGVuZCB0YWcuCi0JCW9taXRUeXBlID0gT01JVF9FTkRfTVVTVDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFTVBUWSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZPUk0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5Y2E5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZPUk0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZPUk0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZPUk0gZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGT1JNKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhY3Rpb24gJVVSSTsgI1JFUVVJUkVEKQotCSAqIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JICogKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChvbnN1Ym1pdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FDVElPTiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX01FVEhPRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0VOQ1RZUEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5GT1JNPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5GT1JNPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgZm9ybSA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNKTsKLQkJaWYgKGZvcm0gIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChmb3JtKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjMwN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWZsb3c7KSogY29udGFpbmVycy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRmxvd0NvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZsb3dDb250YWluZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GTE9XX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIRUFELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhFQUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2NmRjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhFQUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSEVBRCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSEVBRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hFQUQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SEVBRDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVpMThuOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnByb2ZpbGU8L3RkPjx0ZD5VUkk8L3RkPjx0ZD4jSU1QTElFRDwvdGQ+PHRkPk4vQTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEhFQUQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDY1YWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBIUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkSFIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzCi0JICogKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkgKiAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0VOVEVSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNDNkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiBIVE1MLgotICovCi1maW5hbCBjbGFzcyBIZWRIVE1MIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIVE1MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSFRNTDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IVE1MPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+PGNvZGU+JWkxOG47PC9jb2RlPjwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICAgIDx0ZD57QGxpbmsgUERDTURvY0ltcGwjZ2V0QXR0ckRlY2xhcmF0aW9uc0kxOG59PC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD52ZXJzaW9uPC90ZD48dGQ+Q0RBVEE8L3RkPjx0ZD4jRklYRUQ8L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIEhUTUxfVkVSU0lPTl9UUkFOU0lUSU9OQUx9PC90ZD48dGQ+ZGVwbGVjYXRlZCBpbiBIVE1MNC4wMTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT48YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCQkvLyB2ZXJzaW9uCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkVSU0lPTik7Ci0JCWlmIChhZGVjICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkVSU0lPTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSGVhZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThlOTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSGVhZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEhbMS02XS4KLSAqLwotZmluYWwgY2xhc3MgSGVkSGVhZGluZyBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSGVhZGluZyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkgxPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWF0dHJzOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhbGlnbjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqIDxwPjxiPiVhbGlnbjs8L2I+IG1lYW5zIDxjb2RlPmFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAjSU1QTElFRDwvY29kZT4uCi0JICogVW5mb3J0dW5hdGVseSwgdGhpcyA8Y29kZT5hbGlnbjwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gb25lIGluCi0JICogPGNvZGU+SU1HPC9jb2RlPiBvciA8Y29kZT5UQUJMRTwvY29kZT4uICBTbywgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIG9mIDxjb2RlPmFsaWduPC9jb2RlPiBzaG91bGQgYmUgbG9jYWx5IGNyZWF0ZWQgYW5kIGl0IHNob3VsZG4ndCBiZSByZWdpc3RlcmVkCi0JICogaW4gYSA8Y29kZT5IQ01Eb2NJbXBsPC9jb2RlPiBpbnN0YW5jZS48L3A+Ci0JICogPHA+SG93ZXZlciwgJWFsaWduIGlzIHVzZWQgaW4gc2V2YXJhbCB0aW1lcy4gIEkgd291bGRuJ3Qgd3JpdGUgc2FtZSBjb2RlCi0JICogaW4gbWFueSB0aW1lcy4gIFNvLCBJIGFkZCBhIG5ldyB1dGlsaXR5IG1ldGhvZCBpbnRvIDxjb2RlPkNNVXRpbDwvY29kZT4KLQkgKiB0byBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi48L3A+Ci0JICogPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU1HLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElNRy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTk1Mzg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU1HLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSU1HLgotICovCi1maW5hbCBjbGFzcyBIZWRJTUcgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU1HKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU1HLgotCSAqICVhdHRyczsKLQkgKiAoc3JjICVVUkk7ICNSRVFVSVJFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGFsdCAlVGV4dDsgI1JFUVVJUkVEKQotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduIChsb2NhbCk7IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElOUFVULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElOUFVULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDk1MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTlBVVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogSU5QVVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElOUFVUIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElOUFVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBJTlBVVC4KLQkgKiAlYXR0cnM7Ci0JICogKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAocmVhZG9ubHkgKHJlYWRvbmx5KSAjSU1QTElFRCkKLQkgKiAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYWx0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGFjY2VwdCAlQ29udGVudFR5cGVzOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChpc3R5bGUgQ0RBVEEgI0lNUExJRUQpCi0JICogPDxEMjE1Njg0Ci0JICogKHdpZHRoIENEQVRBOyAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0IENEQVRBOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyIENEQVRBOyAjSU1QTElFRCkKLQkgKiBEMjE1Njg0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCS8vIE5PVEU6ICVJbnB1dFR5cGUgaXMgRU5VTTsKLQkJLy8gKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0JCS8vICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9URVhULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JELCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NIRUNLQk9YLCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JBRElPLCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9SRVNFVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9ISURERU4sfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVCk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0KLQkJLy8gKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgYXR0cik7Ci0KLQkJLy8gKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0hFQ0tFRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVhMRU5HVEgsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRSwKLQkJLy88PEQyMTU2ODQKLQkJCQkJQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSCi0JCS8vPEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYxNGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWlubGluZTspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqIEhlZElubGluZUNvbnRhaW5lci4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEhlZElubGluZUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTEkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzYTM0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIExJLgotICovCi1maW5hbCBjbGFzcyBIZWRMSSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEl9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBMSSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDU3YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbGlzdCBpdGVtIGNvbnRhaW5lciBkZWNsYXJhdGlvbnMuCi0gKiAtIE9MLCBVTCwgTUVOVSwgRElSLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRMaXN0SXRlbUNvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExpc3RJdGVtQ29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTElfQ09OVEFJTkVSOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxZDk1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE1FTlUvRElSLgotICovCi1maW5hbCBjbGFzcyBIZWRNRU5VIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FTlUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNRU5VL0RJUi4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+TUVOVS9ESVI8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVibG9jazs8L2NvZGU+LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuCi0JICogJWhlYWRpbmc7IGlzOiBIMSB8IEgyIHwgSDMgfCBINCB8IEg1IHwgSDYuCi0JICogJWxpc3Q7IGlzIDogVUwgfCBPTCB8IERJUiB8IE1FTlUuCi0JICogJXByZWZvcm1hdHRlZDsgaXMgUFJFLgotCSAqIDxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vICVibG9jazsKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMywgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1LCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5INiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTU307Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRVRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MmVjYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIE1FVEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FVEEgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVUQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBNRVRBLgotCSAqICVpMThuOwotCSAqIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JICogKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCSAqIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0KLQkJLy8gMjQ5NDkzCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5ULCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFRUUF9FUVVJViwKLQkJLy8JCUNIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5UCi0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTgzZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE9MLgotICovCi1maW5hbCBjbGFzcyBIZWRPTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBPTC4KLQkgKiAodHlwZSAlT0xTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKiAoc3RhcnQgTlVNQkVSICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTA4MWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogT1BUSU9OLgotICovCi1maW5hbCBjbGFzcyBIZWRPUFRJT04gZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04uCi0JICogJWF0dHJzOwotCSAqIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMDU2ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkUCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIHRlcm1pbmF0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+UDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqIDxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGFkZWMgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBuYW1lcyBvZiB0ZXJtaW5hdG9ycy4KLQkgKiA8Y29kZT5QPC9jb2RlPiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCWlmICh0ZXJtaW5hdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JCS8vPDxEMjE3OTgyCi0JCXRlcm1pbmF0b3JzID0gbmV3IFZlY3RvcigpOwotCQl0ZXJtaW5hdG9ycy5hZGRBbGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZXNPZkJsb2NrKCkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQkvL0QyMTc5ODIKLQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUFJFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBSRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY1OTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUFJFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFBSRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUFJFIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIFBSRSBlbGVtZW50IHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgc291cmNlLgotCSAqLwotCXB1YmxpYyBIZWRQUkUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0KLQkJa2VlcFNwYWNlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh3aWR0aCBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5QUkU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVwcmUuZXhjbHVzaW9uOzwvY29kZT4uCi0JICogJXByZS5leGNsdXNpb24gaXM6Ci0JICogSU1HIHwgT0JKRUNUIHwgQVBQTEVUIHwgQklHIHwgU01BTEwgfCBTVUIgfCBTVVAgfCBGT05UIHwgQkFTRUZPTlQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRyx9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWIxM2MzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgUENEQVRBIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRQY2RhdGEgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQY2RhdGEoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogUENEQVRBIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTRUxFQ1QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDBiYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTRUxFQ1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRTRUxFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTRUxFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRUxFQ1QsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOwotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEUsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJQmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTBiZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci0KLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgU1NJIGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkU1NJQmFzZSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lCYXNlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX1NTSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcE5hbWUpIHsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BOYW1lKTsKLQl9Ci0KLQkvKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlOTJlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpDT05GSUcuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUNvbmZpZyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUNvbmZpZyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpDT05GSUcuCi0JICogKGVycm1zZyBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9FUlJNU0csIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFRk1ULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2YzZjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpFQ0hPLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFY2hvIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRWNobyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RUNITwotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRXhlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5N2NiNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU1NJOkVYRUMuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUV4ZWMgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lFeGVjKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VYRUMsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpFWEVDCi0JICogKGNnaSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoY21kIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NHSSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWFmOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpGTEFTVE1PRC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRmxhc3Rtb2QgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGbGFzdG1vZChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZMQVNUTU9ECi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZzaXplLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZzaXplLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYmYzYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpGU0laRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRnNpemUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGc2l6ZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZTSVpFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUluY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg4YjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpJTkNMVURFLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lJbmNsdWRlIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJSW5jbHVkZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6SU5DTFVERQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY0YTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBTU0k6UFJJTlRFTlYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVByaW50ZW52IGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJUHJpbnRlbnYoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlYsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogU1NJOlBSSU5URU5WIGhhcyBubyBhdHRyaWJ1dGVzLiAgU28sIHRoaXMgbWV0aG9kIHNob3VsZAotCSAqIGFsd2F5cyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogTm90ZTogU2luY2Ugc29tZWJvZHkgZG9lc24ndCBleHBlY3QgbnVsbCBpcyByZXR1cm5lZCwgcmV0dXJuIHRoZSBlbXB0eSBhdHRyaWJ1dGUKLQkgKiBsaWtlIGEgY3VzdG9tIHRhZyB3aGljaCBkb2Vzbid0IGhhdmUgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSVNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhOGUxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVNldCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVNldChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9TRVQsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpTRVQKLQkgKiAodmFyIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRFWFRBUkVBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRFWFRBUkVBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjk1MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRURVhUQVJFQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRFWFRBUkVBLgotICovCi1maW5hbCBjbGFzcyBIZWRURVhUQVJFQSBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQkvKioKLQkgKiBURVhUQVJFQSBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkVEVYVEFSRUEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRFWFRBUkVBLgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGNvbHMgTlVNQkVSICNSRVFVSVJFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAocmVhZG9ubHkgKHJlYWRvbmx5KSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChpc3R5bGUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFMsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRUSVRMRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRUSVRMRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdiZjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUSVRMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVElUTEUgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRJVExFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBUSVRMRS4KLQkgKiAlaTE4bjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPlRJVExFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4laGVhZC5taXNjOzwvY29kZT4uCi0JICogJWhlYWQubWlzYzsgaXMgPGNvZGU+U0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1Q8L2NvZGU+LgotCSAqIDxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCkKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZGRiYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFVMLgotICovCi1maW5hbCBjbGFzcyBIZWRVTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRVTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBVTC4KLQkgKiAodHlwZSAlVUxTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDU2N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogUHJvcGVydHlQcm92aWRlciBjbGFzcy4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGluc3RhbmNlcy4KLSAqLwotaW50ZXJmYWNlIFByb3BlcnR5UHJvdmlkZXIgewotCi0JYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKTsKLQotCU9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdiMWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MUHJvcGVydHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLS8qKgotICogVGhlIGZhY3Rvcnkgb2JqZWN0IG9mIFByb3BlcnR5UHJvdmlkZXIuCi0gKi8KLWZpbmFsIGNsYXNzIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogRGVmYXVsdFByb3ZpZGVyIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHVua25vd24gcHJvcGVydGllcy4KLQkgKiBJdCBhbHdheXMgcmV0dXJucyBudWxsIHZhbHVlIGZvciBhbnkgcHJvcGVydGllcy4KLQkgKi8KLQljbGFzcyBEZWZhdWx0UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIERlZmF1bHRQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIChlZGVjbCAhPSBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCWlmICghKGVkZWNsIGluc3RhbmNlb2YgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGdldEVsZW1lbnRQcm9wZXJ0eSgoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pZWRlY2wpOwotCQl9Ci0KLQkJYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCk7Ci0JfQotCi0JLyoKLQkgKiAidGFnSW5mbyIKLQkgKiBnZXRzIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JY2xhc3MgUFBUYWdJbmZvIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBodG1sQW5ub3RhdGlvbkxvYyA9ICJkYXRhL2h0bXJlZi54bWwiOyAvLyROT04tTkxTLTEkCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGZBbm5vdGF0aW9uTWFwID0gbnVsbDsKLQotCQlwdWJsaWMgUFBUYWdJbmZvKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBhbm5vdGF0aW9uTWFwLgotCQkgKiBAcmV0dXJuIFJldHVybnMgYSBBbm5vdGF0aW9uTWFwCi0JCSAqLwotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJaWYgKGZBbm5vdGF0aW9uTWFwID09IG51bGwpIHsKLQkJCQlmQW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZkFubm90YXRpb25NYXAubG9hZChodG1sQW5ub3RhdGlvbkxvYywgSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vIGFubm90YXRpb24gYXZhaWxhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZBbm5vdGF0aW9uTWFwOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuIGdldEFubm90YXRpb25NYXAoKS5nZXRQcm9wZXJ0eSgoKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pZGVjbCkuZ2V0RWxlbWVudE5hbWUoKSwgInRhZ0luZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEtlZXBTcGFjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEtlZXBTcGFjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRLZWVwU3BhY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkS2VlcFNwYWNlcygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEluZGVudENoaWxkU291cmNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJ0ZXJtaW5hdG9ycyIKLQkgKi8KLQljbGFzcyBQUFRlcm1pbmF0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFRlcm1pbmF0b3JzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmIChkZWNsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoISAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtRGVjbEltcGwpKSByZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKEhUTUxFbGVtRGVjbEltcGwpZGVjbCkuZ2V0VGVybWluYXRvcnMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogInByb2hpYml0ZWRBbmNlc3RvcnMiCi0JICovCi0JY2xhc3MgUFBQcm9oaWJpdGVkQW5jZXN0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIGRlY2wuZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNKU1AiCi0JICovCi0JY2xhc3MgUFBJc0pTUCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc0pTUCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5pc0pTUCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzWEhUTUwiCi0JICogSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpdHNlbGYgbmV2ZXIgcmVwcmVzZW50IGFueSBYSFRNTCBlbGVtZW50IGRlY2xhcmF0aW9uLgotCSAqIFNvLCB0aGlzIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNYSFRNTCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1hIVE1MKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc1NTSSIKLQkgKiBFYWNoIGRlY2xhcmF0aW9uIGNsYXNzIGZvciBTU0kgZWxlbWVudHMgbXVzdCBwcm92aWRlIHRoaXMgcHJvcGVydHkgaXRzZWxmLAotCSAqIGFuZCB0aGVuIHJldHVybiB0cnVlLiAgT3RoZXIgZGVjbGFyYXRpb24gbXVzdCBhbHdheXMgcmV0dXJuIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNTU0kgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSXNTU0koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImxpbmVCcmVha0hpbnQiCi0JICovCi0JY2xhc3MgUFBMaW5lQnJlYWtIaW50IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUExpbmVCcmVha0hpbnQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIGhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExpbmVCcmVha0hpbnQoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19BRlRFUl9TVEFSVCA6Ci0JCQkJCWhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBoaW50OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGF5b3V0VHlwZSIKLQkgKi8KLQljbGFzcyBQUExheW91dFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGF5b3V0VHlwZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExheW91dFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JMT0NLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JSRUFLIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9CUkVBSzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0hJRERFTjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1QgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX09CSkVDVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9XUkFQIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9XUkFQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJvbWl0VHlwZSIKLQkgKi8KLQljbGFzcyBQUE9taXRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUE9taXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldE9taXRUeXBlKCkpIHsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9CT1RIIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfQk9USDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfREVGQVVMVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfTVVTVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaW5jbHVzaW9uIgotCSAqLwotCWNsYXNzIFBQSW5jbHVzaW9uIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUEluY2x1c2lvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRJbmNsdXNpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgcHJvcE5hbWUpIHsKLQkJUHJvcGVydHlQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSAoUHJvcGVydHlQcm92aWRlcikgZmFjdG9yeS5yZWdpc3RyeS5nZXQocHJvcE5hbWUpOwotCQlpZiAocHAgIT0gbnVsbCkKLQkJCXJldHVybiBwcDsKLQotCQlwcCA9IGZhY3RvcnkuY3JlYXRlKHByb3BOYW1lKTsKLQkJaWYgKHBwID09IG51bGwpCi0JCQlyZXR1cm4gZmFjdG9yeS5kZWZhdWx0UHJvdmlkZXI7Ci0KLQkJZmFjdG9yeS5yZWdpc3RyeS5wdXQocHJvcE5hbWUsIHBwKTsKLQkJcmV0dXJuIHBwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSByZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbmV3IERlZmF1bHRQcm92aWRlcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgY3JlYXRlKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gbnVsbDsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpCi0JCQlwcCA9IG5ldyBQUElzSlNQKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXBwID0gbmV3IFBQSXNYSFRNTCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcHAgPSBuZXcgUFBJc1NTSSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MQVlPVVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUExheW91dFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXBwID0gbmV3IFBQTGluZUJyZWFrSGludCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlwcCA9IG5ldyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRLZWVwU3BhY2UoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlwcCA9IG5ldyBQUFRlcm1pbmF0b3JzKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRBR0lORk8pKQotCQkJcHAgPSBuZXcgUFBUYWdJbmZvKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUE9taXRUeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTikpCi0JCQlwcCA9IG5ldyBQUEluY2x1c2lvbigpOwotCi0JCXJldHVybiBwcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9zc2kvU1NJQ01Eb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvc3NpL1NTSUNNRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OTk0MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9zc2kvU1NJQ01Eb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnNzaTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGZhY3RvcnkgZm9yIFNTSSBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTU0lDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRklYID0gIlNTSSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBET0NfVFlQRV9OQU1FID0gIlNTSSI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGNsYXNzIENNTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQkJcHVibGljIENNTmFtZXNwYWNlSW1wbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJCXJldHVybiBQUkVGSVg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBET0NfVFlQRV9OQU1FOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBDTURvY0ltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQkJcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBoY20gPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSk7Ci0KLQkJc3RhdGljIGNsYXNzIEVsZW1lbnRzIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZTSVpFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZMQVNUTU9ELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlYsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VUfTsKLQkJCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQkJcHVibGljIEVsZW1lbnRzKCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGVsZW1zID0gaGNtLmdldEVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1zLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCQkJbWFwLnB1dChuYW1lLCBkZWMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkJcmV0dXJuIG1hcC5zaXplKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQkJU3RyaW5nIGNvb2tlZCA9IGdldENhbm9uaWNhbE5hbWUobmFtZSk7Ci0JCQkJaWYgKCFtYXAuY29udGFpbnNLZXkoY29va2VkKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIChDTU5vZGUpIG1hcC5nZXQoY29va2VkKTsKLQkJCX0KLQotCQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJCQlyZXR1cm4gKENNTm9kZSkgbm9kZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCQlyZXR1cm4gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGdldENhbm9uaWNhbE5hbWUoU3RyaW5nIHJhd05hbWUpIHsKLQkJCQlyZXR1cm4gcmF3TmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQl9Ci0KLQkJc3RhdGljIHByaXZhdGUgRWxlbWVudHMgZWxlbWVudHMgPSBuZXcgRWxlbWVudHMoKTsKLQotCi0JCXB1YmxpYyBDTURvY0ltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gc3NpbnM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01OYW1lc3BhY2Ugc3NpbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBteWNtID0gbmV3IENNRG9jSW1wbCgpOwotCi0JcHJpdmF0ZSBTU0lDTURvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIG15Y207Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzdhNDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBIVE1MLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kIG1vZGlmeSB0aGUKLSAqIEhUTUwgcHJvcGVydGllcyBwcm9ncmFtbWF0aWNhbGx5IHVzaW5nIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb250ZW50UHJvcGVydGllcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MQ09SRV9JRCA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9LRVkgPSAiPHByb2plY3Q+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZG9jdW1lbnQgdHlwZSB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEUgPSAiZG9jdW1lbnQtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRoZSBrZXkgd2lsbCBiZSBiYXNlZCBvZmYgb2YKLQkgKiBAcmV0dXJuIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aCAoYmFzaWNhbGx5IHRoZQotCSAqICAgICAgICAgcmVzb3VyY2VQYXRoIHdpdGhvdXQgdGhlIGZpbGVuYW1lKTsgUFJPSkVDVF9LRVkgaWYgcmVzb3VyY2VQYXRoCi0JICogICAgICAgICBpcyBudWxsCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRLZXlGb3IoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVN0cmluZyBrZXkgPSBQUk9KRUNUX0tFWTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsICYmIHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWtleSA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqIHByZWZlcmVuY2Uga2V5IChzdWJOb2RlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlCi0JICogY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIHVuZGVyCi0JICogQHBhcmFtIHByZWZlcmVuY2VLZXkKLQkgKiAgICAgICAgICAgIHRoZSBzdWJub2RlL2NhdGVnb3J5IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgbG9jYXRlZCBpbgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGEgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QKLQkgKiAgICAgICAgICAgIGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiAgICAgICAgIHByZWZlcmVuY2Uga2V5LiBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQgYW5kIGNyZWF0ZSBpcwotCSAqICAgICAgICAgZmFsc2UKLQkgKi8KLQlzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjcmVhdGUpCi0JCQkvLyBjcmVhdGUgYWxsIG5vZGVzIGRvd24gdG8gdGhlIG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShIVE1MQ09SRV9JRCkubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJLy8gYmUgY2FyZWZ1bCBsb29raW5nIHVwIGZvciBvdXIgbm9kZSBzbyBub3QgdG8gY3JlYXRlIGFueSBub2RlcyBhcwotCQkvLyBzaWRlIGVmZmVjdAotCQlQcmVmZXJlbmNlcyBub2RlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Um9vdE5vZGUoKS5ub2RlKFByb2plY3RTY29wZS5TQ09QRSk7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIG9uY2UgYnVnIDkwNTAwIGlzIGZpeGVkLCBzaG91bGQgYmUgYXMgc2ltcGxlIGFzIHRoaXM6Ci0JCQkvLyBTdHJpbmcgcGF0aCA9IHByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gRU5DT0RJTkdfUFJFRl9OT0RFOwotCQkJLy8gcmV0dXJuIG5vZGUubm9kZUV4aXN0cyhwYXRoKSA/IG5vZGUubm9kZShwYXRoKSA6IG51bGw7Ci0JCQkvLyBmb3Igbm93LCB0YWtlIHRoZSBsb25nIHdheQotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJvamVjdC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhIVE1MQ09SRV9JRCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKEhUTUxDT1JFX0lEKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByZWZlcmVuY2VLZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGUubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vZGVFeGlzdHMgZmFpbGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IHJldHJpZXZlIHByZWZlcmVuY2Ugbm9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGlzCi0JICogICAgICAgICAgICBhdmFpbGFibGUgYW5kIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZyBzaG91bGQgYmUgdGFrZW4uIE5vdGUKLQkgKiAgICAgICAgICAgIHRoYXQgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiBAcGFyYW0gcmVjdXJzZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgcGFyZW50IHNob3VsZCBiZSBxdWVyaWVkIHRpbGwgcHJvcGVydHkgaXMgZm91bmQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBrZXkuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlKSB7Ci0JCVN0cmluZyB2YWwgPSBudWxsOwotCQkvLyBib29sZWFuIHByZWZlcmVuY2VGb3VuZCA9IGZhbHNlOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbCA9IGludGVybmFsR2V0UHJvcGVydHkocmVzb3VyY2UsIHJlY3Vyc2UsIHByZWZlcmVuY2VzKTsKLQkJCQkJLy8gcHJlZmVyZW5jZUZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8gLy8gbm8gcHJlZmVyZW5jZXMgZm91bmQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKLQkJLy8gLy8gc2hvcnQtY2lyY3VpdAotCQkvLyAvLyBsb29rdXAgYnkgZmFsbGluZyBiYWNrIHRvIHdvcmtzcGFjZSdzIGRlZmF1bHQKLQkJLy8gLy8gc2V0dGluZwotCQkvLyBpZiAoIXByZWZlcmVuY2VGb3VuZCkKLQkJLy8gdmFsID0gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQlyZXR1cm4gdmFsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBpbnRlcm5hbEdldFByb3BlcnR5KElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlLCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCBudWxsKTsKLQkJaWYgKHZhbHVlID09IG51bGwgJiYgcmVzb3VyY2UgIT0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpICYmIHJlY3Vyc2UpIHsKLQkJCXZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihudWxsKSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBlbnN1cmUgd2UgZGVmYXVsdCB0byB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2UgaWYgbm9uZSBpcyBmb3VuZAotCQkvLyByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KSA6IHZhbHVlOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dC4gTm90ZSBjb250ZXh0IGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUga2V5LiBJZiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgdGhlIGtleSBpcyByZW1vdmVkIGZyb20gcHJvcGVydGllcy4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCB0cnVlKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcHJlZmVyZW5jZXMucmVtb3ZlKGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJZWxzZQotCQkJCQlwcmVmZXJlbmNlcy5wdXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCB2YWx1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gc2F2ZSBjaGFuZ2VzCi0JCQkJCXByZWZlcmVuY2VzLmZsdXNoKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEhUTUxDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWYwM2M4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyIHsKLQlwdWJsaWMgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlmSm9iID0gbmV3IENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIgX2luc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCUNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBmSm9iOwotCi0JLyoqCi0JICogVGhpcyBqb2IgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBhbGxvdyB0aGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0JICogdG8gc2NoZWR1bGUgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gbW9kaWZ5IHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19VUERBVEVfREVMQVkgPSA1MDA7Ci0JCXByaXZhdGUgTGlzdCBhc3luY0NoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpIHsKLQkJCXN1cGVyKEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZyk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQ2hhbmdlcyhTZXQgbmV3Q2hhbmdlcykgewotCQkJaWYgKG5ld0NoYW5nZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJYXN5bmNDaGFuZ2VzLmFkZEFsbChuZXdDaGFuZ2VzKTsKLQkJCQlhc3luY0NoYW5nZXMubm90aWZ5KCk7Ci0JCQl9Ci0JCQlzY2hlZHVsZShQUk9QRVJUSUVTX1VQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0TmV4dENoYW5nZSgpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuIGFzeW5jQ2hhbmdlcy5pc0VtcHR5KCkgPyBudWxsIDogKElQcm9qZWN0KSBhc3luY0NoYW5nZXMucmVtb3ZlKGFzeW5jQ2hhbmdlcy5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhIVE1MQ29udGVudFByb3BlcnRpZXMuSFRNTENPUkVfSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBIVE1MQ29yZU1lc3NhZ2VzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIG51bGwpOwotCQkJbW9uaXRvciA9IG1vbml0b3IgPT0gbnVsbCA/IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgOiBtb25pdG9yOwotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhIVE1MQ29yZU1lc3NhZ2VzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIGFzeW5jQ2hhbmdlcy5zaXplKCkpOwotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0IG5leHQ7Ci0JCQkJCXdoaWxlICgobmV4dCA9IGdldE5leHRDaGFuZ2UoKSkgIT0gbnVsbCkgewotCQkJCQkJLy8ganVzdCBleGl0IGlmIHRoZSBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biBvciBoYXMKLQkJCQkJCS8vIGJlZW4gc2h1dCBkb3duCi0JCQkJCQkvLyBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgdGhlIHdvcmtzcGFjZSBhdCB0aGlzCi0JCQkJCQkvLyBwb2ludCBhbnl3YXkKLQkJCQkJCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLm9zZ2kiKS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gc2F2ZSB0aGUgcHJlZmVyZW5jZXMgbm9kZXMKLQkJCQkJCQlpZiAobmV4dC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkvLyBzYXZlIGRvY3VtZW50IHR5cGUgcHJlZmVyZW5jZXMKLQkJCQkJCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHdlIGdvdCBhbiBlcnJvciBzYXZpbmcKLQkJCQkJCQlTdHJpbmcgZGV0YWlsTWVzc2FnZSA9IE5MUy5iaW5kKEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZywgbmV4dC5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoMSA8PCAoSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQgJSAxMDAgLyAzMyksIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBkZXRhaWxNZXNzYWdlLCBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuICFhc3luY0NoYW5nZXMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeUNoYW5nZXMoSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCS8vIGNoZWNrIGVhY2ggcmVzb3VyY2Ugd2l0aCB3ZWIgY29udGVudCBzZXR0aW5nIHRvIHNlZSBpZiBpdCBoYXMKLQkJCS8vIGJlZW4gbW92ZWQvZGVsZXRlZAotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gcHJvamVjdCBhZmZlY3RlZAotCQkJSVByb2plY3QgY3VycmVudFByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3REZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCQlyZXNvdXJjZUNoYW5nZXMgPSBwcm9jZXNzUHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMpCi0JCQkJcHJvamVjdHNUb1NhdmUuYWRkKGN1cnJlbnRQcm9qZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBHb2VzIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZS1kZXBlbmRlbnQgcHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoCi0JCSAqIGN1cnJlbnRQcm9qZWN0ICYga2V5IGFuZCB1cGRhdGVzIHRoZSBwcmVmZXJlbmNlIGtleXMgaWYgbmVlZGVkCi0JCSAqIGJhc2VkIG9uIHByb2plY3REZWx0YQotCQkgKiAKLQkJICogQHBhcmFtIGN1cnJlbnRQcm9qZWN0Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBwcm9qZWN0IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQgYXQKLQkJICogQHBhcmFtIGtleQotCQkgKiAgICAgICAgICAgIGN1cnJlbnQga2V5L3N1YmNhdGVnb3J5IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQKLQkJICogICAgICAgICAgICBhdAotCQkgKiBAcGFyYW0gcHJvamVjdERlbHRhCi0JCSAqICAgICAgICAgICAgdGhlIGNoYW5nZXMgdG8gcHJvY2VzcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGFnYWluc3QKLQkJICogQHBhcmFtIHByb2plY3RzVG9TYXZlCi0JCSAqICAgICAgICAgICAgdGhlIHByb2plY3RzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkL3NhdmVkCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBjdXJyZW50UHJvamVjdCdzIHByZWZlcmVuY2VzIHdlcmUgbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUHJlZmVyZW5jZXMoSVByb2plY3QgY3VycmVudFByb2plY3QsIFN0cmluZyBrZXksIElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JCQkvLyBnZXQgdGhlIHByb2plY3Qta2V5IHByZWZlcmVuY2Ugbm9kZQotCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCWlmIChwcm9qZWN0UHJlZnMgPT0gbnVsbCkKLQkJCQkvLyBubyBwcmVmZXJlbmNlcyBmb3IgdGhpcyBwcm9qZWN0LWtleSwganVzdCBiYWlsCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gYWZmZWN0ZWRSZXNvdXJjZXM7Ci0JCQl0cnkgewotCQkJCWFmZmVjdGVkUmVzb3VyY2VzID0gcHJvamVjdFByZWZzLmtleXMoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHByb2JsZW1zIHdpdGggdGhlIHByb2plY3Qgc2NvcGUuLi4gd2UgZ29ubmEgbWlzcyB0aGUKLQkJCQkvLyBjaGFuZ2VzIChidXQgd2lsbCBsb2cpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlByb2JsZW0gcmV0cmVpdmluZyBKU1AgRnJhZ21lbnQgcHJlZmVyZW5jZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIHByZWZlcmVuY2Uga2V5ICh3aGljaCBpcyByZWFsbHkgYSBmaWxlIG5hbWUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gc2VlIGlmIHByZWZlcmVuY2Uga2V5L2ZpbGUgbmFtZSB3YXMgZmlsZSB0aGF0IHdhcyBjaGFuZ2VkCi0JCQkJSVJlc291cmNlRGVsdGEgbWVtYmVyRGVsdGEgPSBwcm9qZWN0RGVsdGEuZmluZE1lbWJlcihuZXcgUGF0aChhZmZlY3RlZFJlc291cmNlc1tpXSkpOwotCQkJCS8vIG5vIGNoYW5nZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQotCQkJCWlmIChtZW1iZXJEZWx0YSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobWVtYmVyRGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJcmVzb3VyY2VDaGFuZ2VzID0gdHJ1ZTsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBzZXR0aW5nIGZvciB0aGUgb3JpZ2luYWwgbG9jYXRpb24KLQkJCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByb2plY3RQcmVmcy5nZXQoYWZmZWN0ZWRSZXNvdXJjZXNbaV0sIG51bGwpOwotCQkJCQlwcm9qZWN0UHJlZnMucmVtb3ZlKGFmZmVjdGVkUmVzb3VyY2VzW2ldKTsKLQkJCQkJaWYgKChtZW1iZXJEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCQkJCS8vIGlmIG1vdmluZywgY29weSB0aGUgc2V0dGluZyBmb3IgdGhlIG5ldyBsb2NhdGlvbgotCQkJCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCQkJUHJlZmVyZW5jZXMgdGFyZ2V0UHJlZnMgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXModGFyZ2V0UHJvamVjdCwga2V5LCB0cnVlKTsKLQkJCQkJCXRhcmdldFByZWZzLnB1dChIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0S2V5Rm9yKG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkpLCBjdXJyZW50VmFsdWUpOwotCQkJCQkJaWYgKHRhcmdldFByb2plY3QgIT0gY3VycmVudFByb2plY3QpCi0JCQkJCQkJcHJvamVjdHNUb1NhdmUuYWRkKHRhcmdldFByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc291cmNlQ2hhbmdlczsKLQkJfQotCi0JCS8qKgotCQkgKiBGb3IgYW55IGNoYW5nZSB0byB0aGUgZW5jb2RpbmcgZmlsZSBvciBhbnkgcmVzb3VyY2Ugd2l0aCBlbmNvZGluZwotCQkgKiBzZXQsIGp1c3QgZGlzY2FyZCB0aGUgY2FjaGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUlSZXNvdXJjZURlbHRhW10gcHJvamVjdERlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCS8vIHByb2Nlc3MgZWFjaCBwcm9qZWN0IGluIHRoZSBkZWx0YQotCQkJU2V0IHByb2plY3RzVG9TYXZlID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdERlbHRhcy5sZW5ndGg7IGkrKykKLQkJCQkvLyBub3RoaW5nIHRvIGRvIGlmIGEgcHJvamVjdCBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkL21vdmVkCi0JCQkJaWYgKHByb2plY3REZWx0YXNbaV0uZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKHByb2plY3REZWx0YXNbaV0uZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pID09IDApCi0JCQkJCXByb2Nlc3NFbnRyeUNoYW5nZXMocHJvamVjdERlbHRhc1tpXSwgcHJvamVjdHNUb1NhdmUpOwotCQkJZkpvYi5hZGRDaGFuZ2VzKHByb2plY3RzVG9TYXZlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJX2luc3RhbmNlID0gbmV3IEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJX2luc3RhbmNlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmI2YmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByb3RlY3RlZCBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV2ZXJ5IHN1YmNsYXNzIG11c3QgcHJvdmlkZSBhIHdheSB0byBwYXJzZSB0aGUgaW5wdXQuIFRoaXMgbWV0aG9kIGhhcwotCSAqIHNldmVyYWwgY3JpdGljYWwgcmVzcG9uc2liaWxpdGllczoKLQkgKiA8bGk+c2V0IHRoZSBmRW5jb2RpbmdNZW1lbnRvIGZpZWxkIGFwcHJvcHJpYXRlbHksIGFjY29yZGluZyB0byB0aGUKLQkgKiByZXN1bHRzIG9mIHRoZSBwYXJzZSBvZiBmUmVhZGVyLjwvbGk+Ci0JICogPGxpPnNldCBmSGFyZGVyUGFyc2VkIHRvIHRydWUsIHRvIGF2b2lkIHdhc3RlZCByZS1wYXJzaW5nLjwvbGk+Ci0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpU3RvcmFnZS5nZXRDb250ZW50cygpOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQkJLy8gVE9ETyB3ZSdsbCBuZWVkIHRvICJyZW1lbWJlciIgSUZpbGUsIG9yCi0JCS8vIGdldCBpdHMgKG9yIGl0cyBwcm9qZWN0J3MpIHNldHRpbmdzLCBpbiBjYXNlCi0JCS8vIHRob3NlIGFyZSBuZWVkZWQgdG8gaGFuZGxlIGNhc2VzIHdoZW4gdGhlCi0JCS8vIGVuY29kaW5nIGlzIG5vdCBpbiB0aGUgZmlsZSBzdHJlYW0uCi0JfQotCi0JLyoqCi0JICogTm90ZTogdGhpcyBpcyBub3QgcGFydCBvZiBpbnRlcmZhY2UgdG8gaGVscCBhdm9pZCBjb25mdXNpb24gLi4uIGl0Ci0JICogZXhwZWN0ZWQgdGhpcyBSZWFkZXIgaXMgYSB3ZWxsIGZvcm1lZCBjaGFyYWN0ZXIgcmVhZGVyIC4uLiB0aGF0IGlzLCBpdHMKLQkgKiBhbGwgcmVhZHkgYmVlbiBkZXRlcm1pbmVkIHRvIG5vdCBiZSBhIHVuaWNvZGUgbWFya2VkIGlucHV0IHN0cmVhbS4gQW5kLAotCSAqIGl0cyBhc3N1bWVkIHRvIGJlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBhdCBwb3NpdGlvbiB6ZXJvLCByZWFkeSB0bwotCSAqIHJlYWQgZmlyc3QgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWlmICghZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NibGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZiBtYXJrYWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2E1MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODk3YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JIVE1MIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQotCWZpbmFsIHByaXZhdGUgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUfTsKLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciByZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJLy8gYXNzdW1tbWluZyB3ZSBzaG91bGQgcmV0dXJuIHNhbWUgJ3ZhbGlkaXR5JyB2YWx1ZSB3ZSBkaWQKLQkJCS8vIHdoZW4gY2FsbGVkIGJlZm9yZS4gKHRlY2huaWNhbGx5LCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlCi0JCQkvLyBpbiBmdXR1cmUsIHNvIG1pZ2h0IHdhbnQgdG8gY2hlY2sgaWYgYW55ICdvbCB2YWx1ZSB3b3VsZAotCQkJLy8gYmUgb2sgaGVyZS4KLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCS8vIGFzc3VtbW1pbmcgd2Ugc2hvdWxkIHJldHVybiBzYW1lICd2YWxpZGl0eScgdmFsdWUgd2UgZGlkCi0JCQkvLyB3aGVuIGNhbGxlZCBiZWZvcmUuICh0ZWNobmljYWxseSwgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBpc3N1ZQotCQkJLy8gaW4gZnV0dXJlLCBzbyBtaWdodCB3YW50IHRvIGNoZWNrIGlmIGhhcmQgY29kZWQgJ3ZhbGlkJyB3b3VsZAotCQkJLy8gYmUgb2sgaGVyZS4KLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gY29udGVudHMgc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkIEhUTUwgY29udGVudHMKLQkJLy8gKHRoaXMgbWF5IGNoYW5nZSBvbmNlIHdlIGFkZCBYSFRNTCBjb250ZW50IHR5cGUpCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShSZWFkZXIgcmVhZGVyKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBjb250ZW50cyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWQgSFRNTCBjb250ZW50cwotCQkvLyAodGhpcyBtYXkgY2hhbmdlIG9uY2Ugd2UgYWRkIFhIVE1MIGNvbnRlbnQgdHlwZSkKLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCWlmIChyZXNvdXJjZUNoYXJzZXREZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUNoYXJzZXREZXRlY3RvciA9IG5ldyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGF2b2lkIGFkZGluZyBhbnl0aGluZyBpZiBub3QgYWJzb2x1dGx5IG5lZWRlZCwgc2luY2UgYWx3YXlzCi0JCS8vICJjYWNoZWQiIHBlciBzZXNzaW9uCi0JCS8vIGRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5FTkNPRElOR19NRU1FTlRPLAotCQkvLyBlbmNvZGluZ01lbWVudG8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQkvLyBzaW5jZSBlcXVhbCwgd2UgZG9uJ3QgbmVlZCB0byBhZGQsIGJ1dCBpZiBvdXIgZGV0ZWN0ZWQgdmVyc2lvbiBpcwotCQkvLyBkaWZmZXJlbnQgdGhhbgotCQkvLyBqYXZhQ2hhcnNldCwgdGhlbiB3ZSBzaG91bGQgYWRkIGl0LiBUaGlzIHdpbGwgaGFwcGVuLCBmb3IgZXhhbXBsZSwKLQkJLy8gaWYgdGhlcmUncwotCQkvLyBkaWZmZXJlbmNlcyBpbiBjYXNlLCBvciBkaWZmZXJlbmNlcyBkdWUgdG8gb3ZlcnJpZGUgcHJvcGVydGllcwotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vIGlmICghZGV0ZWN0ZWRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCS8vIGRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULAotCQkJLy8gZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJCS8vIH0KLQotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQkvLyBlbHNlIGlmCi0JCS8vIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTykpCi0JCS8vIHJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTdmM2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogCi0gKiBUaGlzIGlzIHBvcnRlZCBmcm9tIFBhZ2VEZXNpZ25lcidzIGhwYmNvbS9LYW5qaS5jcHAncwotICogS2Fuamk6Omd1ZXNzX2thbmppX2NvZGUoKSwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nR3Vlc3NlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJID0gMDsgLy8gQVNDSUkKLQkvLyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSV9JTiA9IDg7IC8vIFRoaXMgaXMgYWZ0ZXIgSVNPMjAyMidzIGNoYW5nZQotCS8vIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSEFMRktBTkEgPSA2OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbiBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0pQID0gMzsgLy8gVGhpcyBpcyBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPMjAyMl9KUCA9IDQ7IC8vIFRoaXMgaXMgSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSklTX0hBTEZLQU5BID0gNzsgLy8gVEhpcyBpcyBIYWxmIEthbmEgaW4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzEgPSAweDQwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMiA9IChieXRlKSAweDgwOwotCS8vIEFTQ0lJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSU4gPSAweDAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSk9VVCA9IDB4MDI7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FU0MgPSAweDA0OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklTID0gMHgwODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDEgPSAweDEwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMiA9IDB4MjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrdHlwZVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDAwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMTAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAvKiAhIiMkJSYnICovLyogIiAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qICgpKissLS4vICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogMDEyMzQ1NjcgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiA4OTo7IDw9Pj8gKi8KLQkweDI5LCAweDI4LCAweDJiLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBAQUJDREVGRyAqLwotCTB4MmEsIDB4MjgsIDB4MmEsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEhJSktMTU5PICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogUFFSU1RVVlcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBYWVpbXF1eXyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGFiY2RlZmcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBoaWprbG1ubyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIHBxcnN0dXZ3ICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgwMCwgLyogeHl6e3x9fiAqLwotCTB4MjAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDgwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogOTAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDIwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQTAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQjAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQzAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogRDAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRTAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRjAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMCwgMHgwMCx9OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU084ODU5XzEgPSAxOyAvLyBJU08tMQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSElGVF9KSVMgPSAyOyAvLyBUaGlzIGlzIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSklTX0hBTEZLQU5BID0gNTsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4KLQotCS8qKgotCSAqIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IC0xOyAvLyBVbmtub3duCi0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgaW50Ci0JICogCi0JICogQ29udmVydCBwcml2YXRlIGludCB0byBJQU5BIEVuY29kaW5nIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoaW50IGNvZGUpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgU0hJRlRfSklTIDoKLQkJCWNhc2UgU0pJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiU2hpZnRfSklTIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEVVQ19KUCA6Ci0JCQljYXNlIEVVQ19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiRVVDLUpQIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElTTzIwMjJfSlAgOgotCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIklTTy0yMDIyLUpQIjsvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZ3Vlc3NlZCBKYXZhIEVuY29kaW5nIG5hbWUgdGFyZ2V0OiBieXRlcyB0byBiZSBpbnNwZWN0ZWQgbGVuZ3RoOgotCSAqIGxlbmd0aCBvZiB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0VuY29kaW5nKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGNvZGUgPSBVTktOT1dOOwotCi0JCS8vIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBpcyBzdXBwb3J0ZWQuCi0JCVN0cmluZyBzeXN0ZW1fY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCQlTdHJpbmcganBfY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCk7Ci0JCWlmIChzeXN0ZW1fY3R5cGUuY29tcGFyZVRvKGpwX2N0eXBlKSA9PSAwKSB7Ci0JCQkvLyBPaywgSSdtIHVuZGVyIGphX0pQLgotCQkJY29kZSA9IEFTQ0lJOwotCQkJaW50IHBvcyA9IDA7Ci0JCQl3aGlsZSAoKGNvZGUgPT0gQVNDSUkpICYmIChsZW5ndGggPiAwKSkgewotCQkJCWludCBjaDEgPSB0YXJnZXRbcG9zXTsKLQkJCQljaDEgPSBjaDEgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDIgPSAobGVuZ3RoID49IDIpID8gdGFyZ2V0W3BvcyArIDFdIDogMDsKLQkJCQljaDIgPSBjaDIgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDMgPSAobGVuZ3RoID49IDMpID8gdGFyZ2V0W3BvcyArIDJdIDogMDsKLQkJCQljaDMgPSBjaDMgJiAweDAwMDAwMEZGOwotCQkJCWNvZGUgPSBndWVzc0phcGFuZXNlS2FuamlDb2RlKGNoMSwgY2gyLCBjaDMsIDApOwotCQkJCXBvcysrOwotCQkJCWxlbmd0aC0tOwotCQkJfQotCQkJc3dpdGNoIChjb2RlKSB7Ci0JCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJCWNvZGUgPSBJU08yMDIyX0pQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEVVQ19KUCA6Ci0JCQkJCWNvZGUgPSBFVUNfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb2RlID0gU0hJRlRfSklTOwotCQkJfQotCQl9Ci0JCXJldHVybiAoY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogR3Vlc3MgdGhlIGVuY29kaW5nLiBoYWxma2FuYV9mbGFnID0gMHgwMSAoIGRldGVjdCBTSklTIGhhbGYga2FuYSApCi0JICogaGFsZmthbmFfZmxhZyA9IDB4MDIgKCBkZXRlY3QgRVVDIGhhbGYga2FuYSApCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoaW50IGNoMSwgaW50IGNoMiwgaW50IGNoMywgaW50IGhhbGZrYW5hX2ZsYWcpIHsKLQkJYm9vbGVhbiBzamlzX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDEpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCQlib29sZWFuIGV1Y19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAyKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQotCQlpZiAoY2gxID09IDApCi0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJaWYgKHNqaXNfaGFua2FrdV9mbGFnICYmIGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGV1Y19oYW5rYWt1X2ZsYWcgJiYgY2gxID09IDB4OGUgJiYgY2gyID49IDB4YTEgJiYgY2gyIDw9IDB4ZGYpCi0JCQlyZXR1cm4gRVVDX0hBTEZLQU5BOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9TRlQxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9TRlQyKSAhPSAwKSkKLQkJCXJldHVybiBTSElGVF9KSVM7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX0VVQzEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX0VVQzIpICE9IDApKQotCQkJcmV0dXJuIEVVQ19KUDsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgKChrdHlwZVtjaDJdICYgS1RfSklOKSAhPSAwKSkKLQkJCXJldHVybiBJU08yMDIyX0pQOwotCQllbHNlIGlmIChjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmIGNoMyA9PSAweDQ5LyogJ0knICovKQotCQkJcmV0dXJuIEpJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiAoKGt0eXBlW2NoM10gJiBLVF9KT1VUKSAhPSAwKSkKLQkJCXJldHVybiBBU0NJSV9JTjsKLQotCQlyZXR1cm4gQVNDSUk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nR3Vlc3NlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzY4ZjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA0IDY6NDEgUE0gKi8KLQotLypubHNYWFgqLyAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMS8yNy8wNCA2OjQxIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxIZWFkVG9rZW5pemVyIHsKLQotCS8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLQkvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9NRVRBX1RBRyA9IDQ7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0JLyoqCi0JICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLQkgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0JICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCSAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7MCwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgN307Ci0KLQkvKiogCi0JICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcMjJcMVwwXDFcNDBcMlwwIiArICJcMVw0NFwxXDBcMVw0M1w1XDBcMVwzNFwxXDBcMVw0MlwxM1wwXDFcNDVcMVwxMiIgKyAiXDFcMTBcMVwzMVwxXDEzXDFcMFwxXDIxXDFcMFwxXDI0XDFcMjZcMVwxN1wxXDAiICsgIlwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1XDFcMjNcMVwyNVwxXDMzXDFcMzUiICsgIlwyXDBcMVwyMFwxXDM2XDFcMzdcMVwwXDFcMTRcMVw0MVw3XDBcMVwyMVwxXDAiICsgIlwxXDI0XDFcMjZcMVwxN1wxXDBcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTZcMVwxNSIgKyAiXDFcMjNcMVwyNVwxXDMzXDFcMzVcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0IiArICJcMVw0MVwxMDFcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwIiArICJcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLQkvKiogCi0JICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLQkvKiBlcnJvciBjb2RlcyAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLQkvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0geyJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIn07Ci0KLQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCXByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0JLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQlwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCXByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0JLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0JLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCSBmcm9tIGlucHV0ICovCi0JcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotCi0JLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXByaXZhdGUgaW50IHl5Y2hhcjsKLQotCi0JLyoqIAotCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0JLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotCS8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsKLQotCi0KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIGluKSB7Ci0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0KLQkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikgMCk7Ci0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCi0JCS8qKiAKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQgCi0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQotCi0JCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLQkJICogb2YgYSBsaW5lCi0JCSAqLwotCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0JCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLQkJaGFzTW9yZSA9IHRydWU7Ci0KLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotCi0KLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotCSAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKgotCSAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotCQl0aGlzLnl5X3JlYWRlciA9IGluOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLQkgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKgotCSAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCX0KLQotCS8qKiAKLQkgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotCSAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLQkJY2hhcltdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0JCWludCBqID0gMDsgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLQkJd2hpbGUgKGkgPCAxNzQpIHsKLQkJCWludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQlkbwotCQkJCW1hcFtqKytdID0gdmFsdWU7Ci0JCQl3aGlsZSAoLS1jb3VudCA+IDApOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLQkgKgotCSAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotCSAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotCSAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLQkgKi8KLQlwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0JCS8qIHN0YW5kYXJkIGNhc2UgKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKQotCQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0JCS8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8KLQkJaWYgKHl5X2F0RU9GKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCS8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0JCS8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0JCWlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9idWZmZXIsIDAsIHl5X2VuZFJlYWQgLSB5eV9zdGFydFJlYWQpOwotCi0JCQkvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotCQkJeXlfZW5kUmVhZCAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9jdXJyZW50UG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X21hcmtlZFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9wdXNoYmFja1BvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9zdGFydFJlYWQgPSAwOwotCQl9Ci0KLQkJLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotCQlpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLQkJCWNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLQkJCXl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLQkJfQotCi0JCS8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotCQlpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgeXlfYnVmZmVyLmxlbmd0aCAtIHl5X2VuZFJlYWQpOwotCi0JCWlmIChudW1SZWFkID09IC0xKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCXl5X2VuZFJlYWQgKz0gbnVtUmVhZDsKLQotCQlyZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0JfQotCi0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl5eV9hdEVPRiA9IHRydWU7IC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0JCXl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7IC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0JCXl5X3JlYWRlci5jbG9zZSgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotCSAqLwotCWZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLQkJcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0JfQotCi0JLyoqCi0JICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLQkgKgotCSAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotCQl5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLQkJcmV0dXJuIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZDsKLQl9Ci0KLQotCS8qKgotCSAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotCSAqCi0JICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0JCX0KLQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLQkJfQotCi0JCVN5c3RlbS5leGl0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0JICoKLQkgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0JICoKLQkgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLQkgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0JCWlmIChudW1iZXIgPiB5eWxlbmd0aCgpKQotCQkJeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0JCXl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLQkgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLQkJaWYgKCF5eV9lb2ZfZG9uZSkgewotCQkJeXlfZW9mX2RvbmUgPSB0cnVlOwotCQkJaGFzTW9yZSA9IGZhbHNlOwotCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0JICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotCSAqCi0JICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0JICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaW50IHl5X2lucHV0OwotCQlpbnQgeXlfYWN0aW9uOwotCi0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJeXljaGFyICs9IHl5bGVuZ3RoKCk7Ci0KLQkJCXl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcyAtIDFdID09ICdcbic7Ci0JCQlpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXSA9PSAnXHInKSB7Ci0JCQkJeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLQkJCQlpZiAoIXl5X2F0RU9GKQotCQkJCQl5eV9jdXJyZW50UG9zLS07Ci0JCQl9Ci0KLQkJCXl5X2FjdGlvbiA9IC0xOwotCi0JCQl5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0JCQlpZiAoeXlfYXRCT0wpCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlICsgMV07Ci0JCQllbHNlCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0JCQl5eV9mb3JBY3Rpb24gOiB7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQotCQkJCQl5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YpCi0JCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0JCQkJCWJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotCQkJCQlib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLQkJCQkJeXlfZm9yTmV4dCA6IHsKLQkJCQkJCXN3aXRjaCAoeXlfc3RhdGUpIHsKLQkJCQkJCQljYXNlIDAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjYgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCWNhc2UgMzQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM2IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2NSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMzAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2NiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDczOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDMzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoeXlfaXNGaW5hbCkgewotCQkJCQkJeXlfYWN0aW9uID0geXlfc3RhdGU7Ci0JCQkJCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQkJCQkJaWYgKHl5X25vTG9va0FoZWFkKQotCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCi0KLQkJCXN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLQkJCQljYXNlIDI2IDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSA5NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjAgOgotCQkJCWNhc2UgMjEgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQkJeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7Ci0JCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCQl9Ci0JCQkJY2FzZSA5NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTcgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCQlpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKQotCQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOwotCQkJCQl9Ci0JCQkJY2FzZSA5OCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzEgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDk5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MyA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJCWlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpCi0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7Ci0JCQkJCX0KLQkJCQljYXNlIDEwMCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDUgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDIpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwMSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDYgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDIpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwMiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjEgOgotCQkJCQl7Ci0JCQkJCQlpZiAoeXljaGFyID09IDApIHsKLQkJCQkJCQl5eWJlZ2luKFNUX1hNTERlY2wpOwotCQkJCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWNhc2UgMTAzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4IDoKLQkJCQljYXNlIDkgOgotCQkJCWNhc2UgMTAgOgotCQkJCWNhc2UgMTEgOgotCQkJCWNhc2UgMTIgOgotCQkJCWNhc2UgMTMgOgotCQkJCWNhc2UgMTQgOgotCQkJCWNhc2UgMTUgOgotCQkJCWNhc2UgMTYgOgotCQkJCWNhc2UgMTggOgotCQkJCWNhc2UgMTkgOgotCQkJCWNhc2UgMjIgOgotCQkJCQl7Ci0JCQkJCQlpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHsKLQkJCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJY2FzZSAxMDQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDYwIDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihTVF9NRVRBX1RBRyk7Ci0JCQkJCQlyZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0OwotCQkJCQl9Ci0JCQkJY2FzZSAxMDUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQwIDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsKLQkJCQkJfQotCQkJCWNhc2UgMTA2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA5NCA6Ci0JCQkJCXsKLQkJCQkJCXB1c2hDdXJyZW50U3RhdGUoKTsKLQkJCQkJCXl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOwotCQkJCQkJZm91bmRDb250ZW50VHlwZVZhbHVlID0gdHJ1ZTsKLQkJCQkJCXJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwNyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjggOgotCQkJCQl7Ci0JCQkJCQlwdXNoQ3VycmVudFN0YXRlKCk7Ci0JCQkJCQl5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsKLQkJCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMzIDoKLQkJCQkJewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwOSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzQgOgotCQkJCQl7Ci0JCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsKLQkJCQkJfQotCQkJCWNhc2UgMTEwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0NyA6Ci0JCQkJCXsKLQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007Ci0JCQkJCX0KLQkJCQljYXNlIDExMSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjggOgotCQkJCQl7Ci0JCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDExMiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjUgOgotCQkJCWNhc2UgMjcgOgotCQkJCWNhc2UgMjkgOgotCQkJCWNhc2UgMzIgOgotCQkJCQl7Ci0JCQkJCQlzdHJpbmcuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJfQotCQkJCWNhc2UgMTEzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNCA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oU1FfU1RSSU5HKTsKLQkJCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJCX0KLQkJCQljYXNlIDExNCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjMgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKERRX1NUUklORyk7Ci0JCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMwIDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTYgOgotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0JCQkJCQl5eV9hdEVPRiA9IHRydWU7Ci0JCQkJCQl5eV9kb19lb2YoKTsKLQkJCQkJCXsKLQkJCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0JICoKLQkgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0JICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0JICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotCSAqCi0JICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotCSAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCUhUTUxIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzY2FubmVyID0gbmV3IEhUTUxIZWFkVG9rZW5pemVyKG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiICsgYXJndltpXSArICJcIiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgSFRNTEhlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlkbyB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0JCQkJfQotCQkJCXdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhiY2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCi0JU3RyaW5nIE1ldGFUYWdFbmQgPSAiTWV0YVRhZ0VuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTWV0YVRhZ1N0YXJ0ID0gIk1ldGFUYWdTdGFydCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTWV0YVRhZ0NvbnRlbnRUeXBlID0gIk1ldGFUYWdDb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYyMjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gc3BlYyBkZWZpbmVkIGVuY29kaW5nIGZvciBIVE1MIChoaXN0b3JpY2FsbHkpLCBzbyBudWxsIGlzCi0JICogcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy9pZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCWZUb2tlbml6ZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVnYWxTdHJpbmcoU3RyaW5nIHZhbHVlVG9rZW5UeXBlKSB7Ci0JCWlmICh2YWx1ZVRva2VuVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tJbkNvbnRlbnQoKTsKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSGV1cmlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbm9IZXVyaXN0aWMgPSBmYWxzZTsKLQkJU3RyaW5nIGhldXJpc3RpY0VuY29kaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQ29kZWRJTy5NQVhfTUFSS19TSVpFXTsKLQkJCWludCBuUmVhZCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZSZWFkZXIucmVhZHkoKSkgewotCQkJCQlpbnQgb25lQnl0ZSA9IGZSZWFkZXIucmVhZCgpOwotCQkJCQluUmVhZCsrOwotCQkJCQlpZiAob25lQnl0ZSA8PSAweEZGKSB7Ci0JCQkJCQlieXRlc1tpXSA9IChieXRlKSBvbmVCeXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9IZXVyaXN0aWMpIHsKLQkJCQloZXVyaXN0aWNFbmNvZGluZyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKGJ5dGVzLCBuUmVhZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGFueSBJTyBleGNlcHRpb24sIHRoZW4gbm90IGEgaGV1cmlzdGljIGNhc2UKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJfQotCQlpZiAoaGV1cmlzdGljRW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGhldXJpc3RpY0VuY29kaW5nLCBFbmNvZGluZ01lbWVudG8uR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUhUTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZQotCQkJCS8vIG1lbWVudG8KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGUpIHsKLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJY29udGVudFR5cGVWYWx1ZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChjb250ZW50VHlwZVZhbHVlICE9IG51bGwpIHsKLQkJCXBhcnNlQ29udGVudFR5cGVWYWx1ZShjb250ZW50VHlwZVZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNvbnRlbnRUeXBlVmFsdWUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCI7XFxzKmNoYXJzZXRcXHMqPVxccyoiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJ0cyA9IHBhdHRlcm4uc3BsaXQoY29udGVudFR5cGUpOwotCQlpZiAocGFydHMubGVuZ3RoID4gMCkgewotCQkJLy8gaWYgb25seSBvbmUgaXRlbSwgaXQgY2FuIHN0aWxsIGJlIGNoYXJzZXQgaW5zdGVhZCBvZgotCQkJLy8gY29udGVudFR5cGUKLQkJCWlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChwYXJ0c1swXS5sZW5ndGgoKSA+IDYpIHsKLQkJCQkJU3RyaW5nIGNoZWNrRm9yQ2hhcnNldCA9IHBhcnRzWzBdLnN1YnN0cmluZygwLCA3KTsKLQkJCQkJaWYgKGNoZWNrRm9yQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyc2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaW50IGVxcG9zID0gcGFydHNbMF0uaW5kZXhPZignPScpOwotCQkJCQkJZXFwb3MgPSBlcXBvcyArIDE7Ci0JCQkJCQlpZiAoZXFwb3MgPCBwYXJ0c1swXS5sZW5ndGgoKSkgewotCQkJCQkJCWNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoZXFwb3MpOwotCQkJCQkJCWNoYXJzZXQgPSBjaGFyc2V0LnRyaW0oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vZkNvbnRlbnRUeXBlID0gcGFydHNbMF07Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKLQkJCWNoYXJzZXQgPSBwYXJ0c1sxXTsKLQkJfQotCQkKLQkJaWYgKGNoYXJzZXQgIT0gbnVsbCAmJiBjaGFyc2V0Lmxlbmd0aCgpID4gMCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQsIEVuY29kaW5nTWVtZW50by5GT1VORF9FTkNPRElOR19JTl9DT05URU5UKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkMDQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwNjc0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBsaXN0Lmxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTIyYWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01TdHlsZU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTVN0eWxlTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmMyMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTVN0eWxlTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERPTVN0eWxlTW9kZWxJbXBsIGV4dGVuZHMgRE9NTW9kZWxJbXBsIHsKLQlwdWJsaWMgRE9NU3R5bGVNb2RlbEltcGwoKSB7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBzdXBlciBjb25zdHJ1Y3RvciwgCi0JCS8vIHZpYSBpbnRlcm5hbENyZWF0ZURvY3VtZW50Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQlyZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJc3VwZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQlyZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VTdHlsZVNoZWV0cygpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIERvY3VtZW50U3R5bGVJbXBsKSB7Ci0JCQkJKChEb2N1bWVudFN0eWxlSW1wbCkgZG9jKS5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZURvY3VtZW50IG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgaW50ZXJuYWxDcmVhdGVEb2N1bWVudCgpIHsKLQkJRG9jdW1lbnRTdHlsZUltcGwgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnRTdHlsZUltcGwoKTsKLQkJZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFN0eWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50U3R5bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDYyMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50U3R5bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkRvY3VtZW50Q1NTOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50U3R5bGVJbXBsIGV4dGVuZHMgRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgSURPTURvY3VtZW50LCBEb2N1bWVudENTUyB7Ci0JcHVibGljIERvY3VtZW50U3R5bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudFN0eWxlSW1wbChEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIpIGFkYXB0ZXIpLmdldE92ZXJyaWRlU3R5bGUoZWxlbWVudCwgcHNldWRvTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0eWxlU2hlZXRMaXN0IGdldFN0eWxlU2hlZXRzKCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoSVN0eWxlU2hlZXRMaXN0QWRhcHRlcikgYWRhcHRlcikuZ2V0U3R5bGVTaGVldHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkoKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIpIGFkYXB0ZXIpLnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVsZW1lbnQgbWV0aG9kCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGVja1RhZ05hbWVWYWxpZGl0eSh0YWdOYW1lKTsKLQotCQlFbGVtZW50U3R5bGVJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudFN0eWxlSW1wbCgpOwotCQllbGVtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVsZW1lbnQuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50U3R5bGVJbXBsIGNsb25lZCA9IG5ldyBEb2N1bWVudFN0eWxlSW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZWQuaW1wb3J0Q2hpbGROb2Rlcyh0aGlzLCB0cnVlKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudFN0eWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRTdHlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzMjE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudFN0eWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5FbGVtZW50Q1NTSW5saW5lU3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTGlua1N0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50U3R5bGVJbXBsIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cyBJRE9NRWxlbWVudCwgRWxlbWVudENTU0lubGluZVN0eWxlLCBMaW5rU3R5bGUgewotCXB1YmxpYyBFbGVtZW50U3R5bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50U3R5bGVJbXBsKEVsZW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0U2hlZXQoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZVNoZWV0QWRhcHRlcikgYWRhcHRlcikuZ2V0U2hlZXQoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSBhZGFwdGVyKS5nZXRTdHlsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJc3VwZXIuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVsZW1lbnRJbXBsIGNsb25lZCA9IG5ldyBFbGVtZW50U3R5bGVJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdjMmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29udmVydGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlIVE1MQ2xlYW51cFByb2Nlc3NvckltcGwgcHJvY2Vzc29yID0gbmV3IEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCgpOwotCQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBwcmVmID0gcHJvY2Vzc29yLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCS8vIGJhY2t1cCBvcHRpb25zCi0JCWJvb2xlYW4gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzID0gcHJlZi5nZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoKTsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gcHJlZi5nZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCk7Ci0JCWJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MgPSBwcmVmLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gcHJlZi5nZXRRdW90ZUF0dHJWYWx1ZXMoKTsKLQkJYm9vbGVhbiBmb3JtYXRTb3VyY2UgPSBwcmVmLmdldEZvcm1hdFNvdXJjZSgpOwotCQlpbnQgdGFnTmFtZUNhc2UgPSBwcmVmLmdldFRhZ05hbWVDYXNlKCk7Ci0JCWludCBhdHRyTmFtZUNhc2UgPSBwcmVmLmdldEF0dHJOYW1lQ2FzZSgpOwotCi0JCS8vIHNldHVwIG9wdGlvbnMKLQkJcHJlZi5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3ModHJ1ZSk7Ci0JCXByZWYuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyh0cnVlKTsKLQkJcHJlZi5zZXRJbnNlcnRNaXNzaW5nVGFncyh0cnVlKTsKLQkJcHJlZi5zZXRRdW90ZUF0dHJWYWx1ZXModHJ1ZSk7Ci0JCXByZWYuc2V0Rm9ybWF0U291cmNlKGZhbHNlKTsKLQkJaWYgKG1vZGVsLmdldERvY3VtZW50KCkuaXNYTUxUeXBlKCkpIHsgLy8gWEhUTUwKLQkJCXByZWYuc2V0VGFnTmFtZUNhc2UoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQkJcHJlZi5zZXRBdHRyTmFtZUNhc2UoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQl9Ci0JCWVsc2UgewotCQkJcHJlZi5zZXRUYWdOYW1lQ2FzZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJCXByZWYuc2V0QXR0ck5hbWVDYXNlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQl9Ci0KLQkJcHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0KLQkJLy8gc2V0IGJhY2sgb3B0aW9ucwotCQlwcmVmLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpOwotCQlwcmVmLnNldEluc2VydFJlcXVpcmVkQXR0cnMoaW5zZXJ0UmVxdWlyZWRBdHRycyk7Ci0JCXByZWYuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoaW5zZXJ0TWlzc2luZ1RhZ3MpOwotCQlwcmVmLnNldFF1b3RlQXR0clZhbHVlcyhxdW90ZUF0dHJWYWx1ZXMpOwotCQlwcmVmLnNldEZvcm1hdFNvdXJjZShmb3JtYXRTb3VyY2UpOwotCQlwcmVmLnNldFRhZ05hbWVDYXNlKHRhZ05hbWVDYXNlKTsKLQkJcHJlZi5zZXRBdHRyTmFtZUNhc2UoYXR0ck5hbWVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElET01Nb2RlbCBtb2RlbCwgU3RyaW5nIGRlY2xhcmF0aW9uLCBTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNldERlY2xhcmF0aW9uKG1vZGVsLCBkZWNsYXJhdGlvbiwgcHVibGljSWQpOwotCQljbGVhbnVwTW9kZWwobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIGRlY2xhcmF0b2luOiAiZGF0YSIgZm9yIFhNTCBkZWNsYXJhdGlvbiwgc3VjaCBhcyAidmVyc2lvbj1cIjEuMFwiIgotCSAqIHB1YmxpY0lkOiBwdWJsaWNJZCBmb3IgRE9DVFlQRSBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnZlcnQoSW5wdXRTdHJlYW0gaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRE9NTW9kZWwgbW9kZWwgPSByZWFkTW9kZWwoaW5wdXQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWNvbnZlcnQobW9kZWwsIGRlY2xhcmF0aW9uLCBwdWJsaWNJZCk7Ci0JCQl3cml0ZU1vZGVsKG1vZGVsLCBvdXRwdXQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElGaWxlIGZpbGUsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRE9NTW9kZWwgbW9kZWwgPSByZWFkTW9kZWwoZmlsZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJY29udmVydChtb2RlbCwgZGVjbGFyYXRpb24sIHB1YmxpY0lkKTsKLQkJCXdyaXRlTW9kZWwobW9kZWwsIGZpbGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydEJyZWFrKElET01Nb2RlbCBtb2RlbCwgTm9kZSBub2RlKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybjsKLQotCQkvLyBnZXQgZGVsaW1pdGVyIHN0cmluZwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBkZWxpbSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCWlmIChkZWxpbSA9PSBudWxsIHx8IGRlbGltLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVGV4dCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGVsaW0pOwotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRleHQsIG5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSURPTU1vZGVsIHJlYWRNb2RlbChJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gY3JlYXRlIHRlbXBvcmFyeSBtb2RlbAotCQlTdHJpbmcgaWQgPSBpbnB1dC50b1N0cmluZygpICsgIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoaWQsIGlucHV0LCBudWxsKTsKLQkJaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSB7Ci0JCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSURPTU1vZGVsKSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElET01Nb2RlbCByZWFkTW9kZWwoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCWlmICghKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElET01Nb2RlbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb24oSURPTU1vZGVsIG1vZGVsLCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSBudWxsOwotCQkJTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQlTdHJpbmcgdGFyZ2V0ID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmVxdWFscygieG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIGNoaWxkOwotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJSURPTURvY3VtZW50VHlwZSBkb2NUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQotCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAocGkgIT0gbnVsbCkgewotCQkJCQlwaS5zZXREYXRhKGRlY2xhcmF0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBpID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCBkZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHBpLCBjaGlsZCk7Ci0JCQkJCWluc2VydEJyZWFrKG1vZGVsLCBjaGlsZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocHVibGljSWQgIT0gbnVsbCkgewotCQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHB1YmxpY0lkKTsKLQkJCQlTdHJpbmcgbmFtZSA9IChlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0TmFtZSgpIDogbnVsbCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCi0JCQkJCW5hbWUgPSAiSFRNTCI7IC8vIGRlZmF1bHQgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuYW1lLmVxdWFscyhkb2NUeXBlLmdldE5hbWUoKSkpIHsgLy8gcmVwbGFjZQotCQkJCQkJTm9kZSBwYXJlbnQgPSBkb2NUeXBlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWNoaWxkID0gZG9jVHlwZTsKLQkJCQkJCWRvY1R5cGUgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdW1lbnQuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZG9jVHlwZSwgY2hpbGQpOwotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZG9jVHlwZSA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudC5jcmVhdGVEb2N0eXBlKG5hbWUpOwotCQkJCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUoZG9jVHlwZSwgY2hpbGQpOwotCQkJCQlpbnNlcnRCcmVhayhtb2RlbCwgY2hpbGQpOwotCQkJCX0KLQkJCQlkb2NUeXBlLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKLQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBlbnRyeS5nZXRTeXN0ZW1JZCgpOwotCQkJCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkJCQkJCWRvY1R5cGUuc2V0U3lzdGVtSWQoc3lzdGVtSWQpOwotCQkJCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gZW50cnkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotCQkJCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwgbmFtZXNwYWNlVVJJKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVNb2RlbChJRE9NTW9kZWwgbW9kZWwsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG91dHB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5zYXZlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTW9kZWwoSURPTU1vZGVsIG1vZGVsLCBJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy9CeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJLy9vdXRwdXQgPSBuZXcKLQkJCS8vIEJ5dGVBcnJheU91dHB1dFN0cmVhbShzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJbW9kZWwuc2F2ZSgpOwotCQkJLy9pbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JCQkvL2ZpbGUuc2V0Q29udGVudHMoaW5wdXQsIHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8JCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkvLwkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJCWlmIChpbnB1dCAhPSBudWxsKQotCQkJCWlucHV0LmNsb3NlKCk7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjk3YTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIgZXh0ZW5kcyBEb2N1bWVudFR5cGVBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMgewotCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkgZkZhY3RvcnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTCA9ICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhIVE1MID0gInhodG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXTUwgPSAid21sIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyKElET01Eb2N1bWVudCBkb2N1bWVudCwgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIoZG9jdW1lbnQpOwotCi0JCXRoaXMuZkZhY3RvcnkgPSBmYWN0b3J5OwotCi0JCS8vIGluaXRpYWxpemUKLQkJZG9jdW1lbnRUeXBlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBkb2N1bWVudFR5cGVDaGFuZ2VkKCkgewotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJSURPTU1vZGVsIG1vZGVsID0gZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCi0JCS8vIGZpbmQgRE9DVFlQRSBkZWxjYXJhdGlvbiBhbmQgUHVibGljIElECi0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCURvY3VtZW50VHlwZSBuZXdEb2N1bWVudFR5cGUgPSBmaW5kRG9jdW1lbnRUeXBlKGRvY3VtZW50KTsKLQkJaWYgKG5ld0RvY3VtZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlwdWJsaWNJZCA9IG5ld0RvY3VtZW50VHlwZS5nZXRQdWJsaWNJZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gbG9va3VwIGRlZmF1bHQgc2V0IGJ5IGNvbnRlbnRzZXR0aW5ncwotCQkJcHVibGljSWQgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIGZpbGUsIHRydWUpOwotCQl9Ci0KLQkJLy8gbG9va3VwIERPQ1RZUEUgcmVnaXN0cnkKLQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IG5ld0VudHJ5ID0gbnVsbDsKLQkJaWYgKHB1YmxpY0lkICE9IG51bGwpIHsKLQkJCW5ld0VudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RW50cnkocHVibGljSWQpOwotCQl9Ci0KLQkJYm9vbGVhbiBuZXdYTUxUeXBlID0gKG5ld0VudHJ5ICE9IG51bGwgPyBuZXdFbnRyeS5pc1hNTFR5cGUoKSA6IGZhbHNlKTsKLQkJYm9vbGVhbiBuZXdXTUxUeXBlID0gKG5ld0VudHJ5ICE9IG51bGwgPyBuZXdFbnRyeS5pc1dNTFR5cGUoKSA6IGZhbHNlKTsKLQotCQlpZiAoIW5ld1hNTFR5cGUpIHsKLQkJCS8vIGZpbmQgWE1MIGRlY2xhcmF0aW9uCi0JCQlpZiAoZmluZFhNTE5vZGUoZG9jdW1lbnQpICE9IG51bGwpIHsKLQkJCQluZXdYTUxUeXBlID0gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgZmlsZSBleHRlbnNpb24KLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZXh0ID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHNJZ25vcmVDYXNlKFhIVE1MKSkgewotCQkJCQluZXdYTUxUeXBlID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0LmVxdWFsc0lnbm9yZUNhc2UoV01MKSkgewotCQkJCQluZXdYTUxUeXBlID0gdHJ1ZTsKLQkJCQkJbmV3V01MVHlwZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlpZiAobmV3RW50cnkgPT0gbnVsbCkgewotCQkJLy8gbG9va3VwIHN5c3RlbSBkZWZhdWx0Ci0JCQlpZiAobmV3WE1MVHlwZSAmJiBuZXdEb2N1bWVudFR5cGUgPT0gbnVsbCkgewotCQkJCS8vIHVzZSBkZWZhdWx0IFhIVE1MLCBpZiBpdCdzIFhNTCBhbmQgbm8gZG9jdW1lbnQgdHlwZQotCQkJCS8vIGRlY2xhcmVkCi0JCQkJaWYgKG5ld1dNTFR5cGUpCi0JCQkJCW5ld0VudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdEVudHJ5KEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5ERUZBVUxUX1dNTCk7Ci0JCQkJZWxzZQotCQkJCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRFbnRyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuREVGQVVMVF9YSFRNTCk7Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld0VudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdEVudHJ5KEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5ERUZBVUxUX0hUTUwpOwotCQkJfQotCQkJaWYgKG5ld0VudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBlcnJvcgotCQl9Ci0KLQkJaWYgKG5ld0RvY3VtZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlEb2N1bWVudFR5cGUgb2xkRG9jdW1lbnRUeXBlID0gZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JCQlpZiAob2xkRG9jdW1lbnRUeXBlID09IG51bGwgfHwgb2xkRG9jdW1lbnRUeXBlLmdldE5hbWUoKSAhPSBuZXdFbnRyeS5nZXROYW1lKCkpIHsKLQkJCQkvLyBjcmVhdGUgaW1wbGljaXQgRG9jdW1lbnRUeXBlCi0JCQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IGRvY3VtZW50LmdldEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJaWYgKGltcGwgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbmFtZSA9IG5ld0VudHJ5LmdldE5hbWUoKTsKLQkJCQkJcHVibGljSWQgPSBuZXdFbnRyeS5nZXRQdWJsaWNJZCgpOwotCQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBuZXdFbnRyeS5nZXRTeXN0ZW1JZCgpOwotCQkJCQluZXdEb2N1bWVudFR5cGUgPSBpbXBsLmNyZWF0ZURvY3VtZW50VHlwZShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCWlmICh0aGlzLmVudHJ5ICE9IG51bGwpIHsgLy8gZG8gbm90IG5vdGlmeSBvbiBpbml0aWFsaXphdGlvbgotCQkJbm90aWZ5ID0gKG5ld0VudHJ5ICE9IHRoaXMuZW50cnkgfHwgbmV3WE1MVHlwZSAhPSB0aGlzLmlzWE1MVHlwZSk7Ci0JCX0KLQotCQlpZiAobmV3RG9jdW1lbnRUeXBlICE9IG51bGwpCi0JCQlzZXREb2N1bWVudFR5cGUobmV3RG9jdW1lbnRUeXBlKTsKLQkJdGhpcy5lbnRyeSA9IG5ld0VudHJ5OwotCQl0aGlzLmlzWE1MVHlwZSA9IG5ld1hNTFR5cGU7Ci0KLQkJaWYgKG5vdGlmeSkKLQkJCW5vdGlmeURvY3VtZW50VHlwZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElET01Eb2N1bWVudFR5cGUgZmluZERvY3VtZW50VHlwZShJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSURPTURvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQlpZiAoZG9jdW1lbnRUeXBlICE9IG51bGwgJiYgZG9jdW1lbnRUeXBlLmdldEV4aXN0aW5nQWRhcHRlcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQkvLyB3YXRjaCBmdXR1cmUgY2hhbmdlcwotCQkJZG9jdW1lbnRUeXBlLmFkZEFkYXB0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE5vZGUgZmluZFhNTE5vZGUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIHRhcmdldCA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmVxdWFscyhYTUwpKSB7Ci0JCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ck5hbWVDYXNlKCkgewotCQlpZiAoaXNYTUxUeXBlKCkpCi0JCQlyZXR1cm4gTE9XRVJfQ0FTRTsgLy8gWEhUTUwKLQkJcmV0dXJuIHRoaXMuZkZhY3RvcnkuZ2V0QXR0ck5hbWVDYXNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJSUZpbGUgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJcmVzdWx0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQkJaWYgKGlzWE1MVHlwZSgpKQotCQkJcmV0dXJuIExPV0VSX0NBU0U7IC8vIFhIVE1MCi0JCXJldHVybiB0aGlzLmZGYWN0b3J5LmdldFRhZ05hbWVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZmVhdHVyZS5lcXVhbHMoSFRNTCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGZlYXR1cmUuZXF1YWxzKFNTSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGZlYXR1cmUuZXF1YWxzKEZSQU1FU0VUKSkgewotCQkJaWYgKHRoaXMuZW50cnkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeS5oYXNGcmFtZXNldCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1hNTFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmlzWE1MVHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEKQotCQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWRvY3VtZW50VHlwZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwMjhiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSwgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBpbnQgdGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JcHJpdmF0ZSBpbnQgYXR0ck5hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwotCi0JLy8gZm9yIHJlbW92YWwgbGF0ZXIgb24gcmVsZWFzZSgpCi0JcHJpdmF0ZSBIYXNoTWFwIGZEb2MyQWRhcHRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWlmICh0aGlzLnByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXVwZGF0ZUNhc2VzKCk7IC8vIGluaXRpYWxpemUKLQkJCXRoaXMucHJlZmVyZW5jZXMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIEl0Ci0JICogbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUKLQkgKiBJTm9kZUFkYXB0ZXIgLi4uIGJ1dCBpbiBnZW5lcmFsIGl0IGlzIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlCi0JICogc3RhdGVsZXNzLCBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEgc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIG9ubHkgYWRhcHQgSURPTURvY3VtZW50Ci0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCi0JCQkvLyBpZiBhbHJlYWR5IGhhcyBhbiBhZGFwdGVyLCBubyBuZWVkIHRvIHJlY3JlYXRlL2luaXRpYWxpemUuCi0JCQkvLyBOb3RlOiB0aGlzIG1lYW5zIGlmICJkb2N0eXBlIiBmb3IgRE9NIGNoYW5nZXMsCi0JCQkvLyB0aGVEb2N1bWVudFR5cGVBZGF0cGVyIGZvciB0aGF0IERPTQotCQkJLy8gc2hvdWxkIGJlIHJlbW92ZWQgKGFuZCByZWxlYXNlZCkgYW5kIGl0IHdpbGwgYmUgcmUtY3JlYXRlZCBuZXh0Ci0JCQkvLyB0aW1lIHJlcXVpcmVkLgotCQkJRG9jdW1lbnRUeXBlQWRhcHRlciBvbGRBZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChvbGRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBvbGRBZGFwdGVyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJCi0JCQkJLy8gaWYgdGhlcmUgYWxyZWFkeSB3YXMgYW4gYWRhcHRlcgotCQkJCS8vaWYoZkFkYXB0ZXIgIT0gbnVsbCkgCi0JCQkJLy8JZkFkYXB0ZXIucmVsZWFzZSgpOwotCQkJCQotCQkJCS8vIG5vdGUsIHRoZSBmYWN0b3J5IGlzIGluY2x1ZGVkIGluIHRoaXMgY2FzZSB0byBoYXZlIGEgY2VudHJhbCBwbGFjZQotCQkJCS8vIHRvIGNvbWUgYmFjayB0byBmb3IgY2FzZSBwcmVmZXJlbmNlcy4KLQkJCQlyZXN1bHQgPSBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIoKElET01Eb2N1bWVudCkgbm90aWZpZXIsIHRoaXMpOwotCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIocmVzdWx0KTsKLQkJCQkKLQkJCQlmRG9jMkFkYXB0ZXJNYXAucHV0KG5vdGlmaWVyLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCQlyZXR1cm4gdGhpcy50YWdOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAocHJvcGVydHkuZXF1YWxzKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpIHx8IHByb3BlcnR5LmVxdWFscyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkpIHsKLQkJCXVwZGF0ZUNhc2VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FzZXMoKSB7Ci0JCXRoaXMudGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JCXRoaXMuYXR0ck5hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCi0JCWlmICh0aGlzLnByZWZlcmVuY2VzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHRhZ0Nhc2UgPSB0aGlzLnByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKTsKLQkJaWYgKHRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQl0aGlzLnRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCQllbHNlIGlmICh0YWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRTsKLQkJCi0JCWludCBhdHRDYXNlID0gdGhpcy5wcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpOwotCQlpZiAoYXR0Q2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCXRoaXMuYXR0ck5hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCQllbHNlIGlmIChhdHRDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkKLQkJaWYoIWZEb2MyQWRhcHRlck1hcC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGRvY3MgPSBmRG9jMkFkYXB0ZXJNYXAua2V5U2V0KCkudG9BcnJheSgpOwotCQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykgewotCQkJCWFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcilmRG9jMkFkYXB0ZXJNYXAuZ2V0KGRvY3NbaV0pOwotCQkJCWFkYXB0ZXIucmVsZWFzZSgpOwotCQkJCSgoSURPTURvY3VtZW50KWRvY3NbaV0pLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0JCQlmRG9jMkFkYXB0ZXJNYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1OTYwCi0JCWlmICh0aGlzLnByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXRoaXMucHJlZmVyZW5jZXMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjMzI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZSQU1FU0VUID0gIkZSQU1FU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNTSSA9ICJTU0kiOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMjY4ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50VHlwZUVudHJ5IHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJOwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTFR5cGU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzWEhUTUxUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBpc1dNTFR5cGU7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0ZyYW1lc2V0OwotCXByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRYSFRNTDsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0V01MOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBYSFRNTF9OQU1FID0gImh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEhUTUxfTkFNRSA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiB1c2VJbnRlcm5hbE1vZGVsID0gZmFsc2U7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgYm9vbGVhbiBpc1hIVE1MVHlwZSwgYm9vbGVhbiBoYXNGcmFtZXNldCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBib29sZWFuIGlzRGVmYXVsdFhIVE1MLCBib29sZWFuIGlzRGVmYXVsdFdNTCwgYm9vbGVhbiBpc1dNTFR5cGUpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGlzWE1MVHlwZSkKLQkJCQl0aGlzLm5hbWUgPSBYSFRNTF9OQU1FOy8vIG5lZWQgY29kZSBmb3Igd21sPwotCQkJZWxzZQotCQkJCXRoaXMubmFtZSA9IEhUTUxfTkFNRTsKLQkJfQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQkJdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JCXRoaXMuaXNYTUxUeXBlID0gaXNYSFRNTFR5cGUgfCBpc1dNTFR5cGU7Ci0JCXRoaXMuaGFzRnJhbWVzZXQgPSBoYXNGcmFtZXNldDsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQl0aGlzLmlzRGVmYXVsdFhIVE1MID0gaXNEZWZhdWx0WEhUTUw7Ci0JCXRoaXMuaXNEZWZhdWx0V01MID0gaXNEZWZhdWx0V01MOwotCQl0aGlzLmlzWEhUTUxUeXBlID0gaXNYSFRNTFR5cGU7Ci0JCXRoaXMuaXNXTUxUeXBlID0gaXNXTUxUeXBlOwotCX0KLQkKLQlIVE1MRG9jdW1lbnRUeXBlRW50cnkoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBib29sZWFuIGlzWEhUTUxUeXBlLCBib29sZWFuIGhhc0ZyYW1lc2V0LCBTdHJpbmcgZGlzcGxheU5hbWUsIGJvb2xlYW4gaXNEZWZhdWx0WEhUTUwsIGJvb2xlYW4gaXNEZWZhdWx0V01MLCBib29sZWFuIGlzV01MVHlwZSwgYm9vbGVhbiB1c2VJbnRlcm5hbE1vZGVsKSB7Ci0JCXRoaXMobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuYW1lc3BhY2VVUkksIGlzWEhUTUxUeXBlLCBoYXNGcmFtZXNldCwgZGlzcGxheU5hbWUsIGlzRGVmYXVsdFhIVE1MLCBpc0RlZmF1bHRXTUwsIGlzV01MVHlwZSk7Ci0JCXRoaXMudXNlSW50ZXJuYWxNb2RlbCA9IHVzZUludGVybmFsTW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5pc1hNTFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRnJhbWVzZXQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0ZyYW1lc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdFhIVE1MKCkgewotCQlyZXR1cm4gdGhpcy5pc0RlZmF1bHRYSFRNTDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRXTUwoKSB7Ci0JCXJldHVybiB0aGlzLmlzRGVmYXVsdFdNTDsKLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWEhUTUxUeXBlKCkgewotCQlyZXR1cm4gaXNYSFRNTFR5cGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNXTUxUeXBlKCkgewotCQlyZXR1cm4gaXNXTUxUeXBlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB1c2VJbnRlcm5hbE1vZGVsKCkgewotCQlyZXR1cm4gdXNlSW50ZXJuYWxNb2RlbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDcxZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbnRyaWVzID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0RW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRYSFRNTEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0V01MRW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRDSFRNTEVudHJ5ID0gbnVsbDsKLQotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9IVE1MID0gMDsKLQlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfWEhUTUwgPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9XTUwgPSAyOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9DSFRNTCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSFRNTF9QVUJMSUNfSUQgPSAiLS8vVzNDLy9EVEQgQ29tcGFjdCBIVE1MIDEuMCBEcmFmdC8vRU4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMuZW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJLy8gSFRNTCA0LjAxCi0JCVN0cmluZyBuYW1lID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzeXN0ZW1JZCA9ICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gIkhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGVmYXVsdEVudHJ5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG51bGwsIGZhbHNlLCBmYWxzZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCB0aGlzLmRlZmF1bHRFbnRyeSk7Ci0JCXB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iOy8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtSWQgPSAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI7Ly8kTk9OLU5MUy0xJAotCQlkaXNwbGF5TmFtZSA9ICJIVE1MIDQuMDEgU3RyaWN0IjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlwdWJsaWNJZCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIjsvLyROT04tTkxTLTEkCi0JCXN5c3RlbUlkID0gImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI7Ly8kTk9OLU5MUy0xJAotCQlkaXNwbGF5TmFtZSA9ICJIVE1MIDQuMDEgRnJhbWVzZXQiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBudWxsLCBmYWxzZSwgdHJ1ZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJLy8gQ0hUTUwKLQkJbmFtZSA9ICJIVE1MIjsvLyROT04tTkxTLTEkCi0JCXB1YmxpY0lkID0gQ0hUTUxfUFVCTElDX0lEOwotCQlkaXNwbGF5TmFtZSA9ICJDb21wYWN0IEhUTUwgMS4wIERyYWZ0IjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRlZmF1bHRDSFRNTEVudHJ5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIHRoaXMuZGVmYXVsdENIVE1MRW50cnkpOwotCi0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBuZXcgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCWlmIChyZWFkZXIgIT0gbnVsbCkKLQkJCXJlYWRlci5yZWFkUmVnaXN0cnkodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZWdpc3QoU3RyaW5nIHBpZCwgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRvY3R5cGUpIHsKLQkJaWYgKHBpZCA9PSBudWxsIHx8IGRvY3R5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5lbnRyaWVzLnB1dChwaWQsIGRvY3R5cGUpOwotCQlpZiAodGhpcy5kZWZhdWx0WEhUTUxFbnRyeSA9PSBudWxsKSB7Ci0JCQlpZiAoZG9jdHlwZS5pc0RlZmF1bHRYSFRNTCgpKQotCQkJCXRoaXMuZGVmYXVsdFhIVE1MRW50cnkgPSBkb2N0eXBlOwotCQl9Ci0JCWlmICh0aGlzLmRlZmF1bHRXTUxFbnRyeSA9PSBudWxsKSB7Ci0JCQlpZiAoZG9jdHlwZS5pc0RlZmF1bHRXTUwoKSkKLQkJCQl0aGlzLmRlZmF1bHRXTUxFbnRyeSA9IGRvY3R5cGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldERlZmF1bHRFbnRyeShpbnQgdHlwZSkgewotCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgREVGQVVMVF9YSFRNTCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRYSFRNTEVudHJ5OwotCQkJCWJyZWFrOwotCQkJY2FzZSBERUZBVUxUX1dNTCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRXTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9DSFRNTCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRDSFRNTEVudHJ5OwotCQkJCWJyZWFrOwotCQkJY2FzZSBERUZBVUxUX0hUTUwgOgotCQkJZGVmYXVsdCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRFbnRyeTsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXREZWZhdWx0RW50cnkoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldFhIVE1MRGVmYXVsdEVudHJ5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0WEhUTUxFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW50cmllcygpIHsKLQkJcmV0dXJuIHRoaXMuZW50cmllcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSB0aGlzLmVudHJpZXMuZ2V0KHB1YmxpY0lkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJmNmVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICovCi1jbGFzcyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIgewotCi0JLy8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImRvY3VtZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19OQU1FID0gImRvY3VtZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX1BJRCA9ICJwdWJsaWNJRCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX1NJRCA9ICJzeXN0ZW1JRCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lTX1hIVE1MID0gImlzWEhUTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19XTUwgPSAiaXNXTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9IQVNfRlJBTUVTRVQgPSAiaGFzRnJhbWVzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9OU1VSSSA9ICJuYW1lc3BhY2VVUkkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9FTkFNRSA9ICJlbGVtZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0ROQU1FID0gImRpc3BsYXlOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfREVGQVVMVF9YSFRNTCA9ICJkZWZhdWx0WEhUTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19ERUZBVUxUX1dNTCA9ICJkZWZhdWx0V01MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFZfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFZfTlVMTF9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVhZFJlZ2lzdHJ5KEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcpIHsKLQkJaWYgKHJlZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBkb2N0eXBlID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUgZWxlbWVudAotCQkJCWlmIChkb2N0eXBlICE9IG51bGwpIHsKLQkJCQkJcmVnLnJlZ2lzdChkb2N0eXBlLmdldFB1YmxpY0lkKCksIGRvY3R5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBkb2N0eXBlID0gbnVsbDsKLQkJU3RyaW5nIHBpZCA9IG51bGw7Ci0JCVN0cmluZyBzaWQgPSBudWxsOwotCQlTdHJpbmcgbnN1cmkgPSBudWxsOwotCQlTdHJpbmcgcm9vdCA9IG51bGw7Ci0JCWJvb2xlYW4geGh0bWwgPSB0cnVlOwotCQlib29sZWFuIGZyYW1lc2V0ID0gZmFsc2U7Ci0JCVN0cmluZyBkbmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gZGVmYXVsdFhodG1sID0gZmFsc2U7Ci0JCWJvb2xlYW4gZGVmYXVsdFdNTCA9IGZhbHNlOwotCQlib29sZWFuIGlzV01MID0gZmFsc2U7Ci0KLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCXBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QSUQpOwotCQkJLy8gcHVibGljSUQgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KLQkJCWlmIChwaWQgPT0gbnVsbCB8fCBwaWQuZXF1YWxzKEFUVl9OVUxMX1NUUklORykpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXNpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TSUQpOwotCQkJbnN1cmkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTlNVUkkpOwotCQkJcm9vdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9FTkFNRSk7Ci0JCQl4aHRtbCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX1hIVE1MKTsKLQkJCWZyYW1lc2V0ID0gZ2V0Qm9vbGVhbihlbGVtZW50LCBBVFRfSEFTX0ZSQU1FU0VUKTsKLQkJCWRuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0ROQU1FKTsKLQkJCWRlZmF1bHRYaHRtbCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX0RFRkFVTFRfWEhUTUwpOwotCQkJZGVmYXVsdFdNTCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX0RFRkFVTFRfV01MKTsKLQkJCWlzV01MID0gZ2V0Qm9vbGVhbihlbGVtZW50LCBBVFRfSVNfV01MKTsKLQkJCWRvY3R5cGUgPSBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KHJvb3QsIHBpZCwgc2lkLCBuc3VyaSwgeGh0bWwsIGZyYW1lc2V0LCBkbmFtZSwgZGVmYXVsdFhodG1sLCBkZWZhdWx0V01MLCBpc1dNTCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3R5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0KTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKEFUVl9UUlVFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDMzZDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ01Ob2RlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTW9kZWxQYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEhUTUxEb2N1bWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXIgaW1wbGVtZW50cyBNb2RlbFBhcnNlckFkYXB0ZXIgewotCS8qKgotCSAqIG5vdGU6IEkgbWFkZSBwdWJsaWMsIHRlbXBhcmlseSwgc28gY291bGQgYmUgdXNlZCBieSBKU1BMb2FkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTE1vZGVsUGFyc2VyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAoIXBhcmVudC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGkgPSAoamF2YS51dGlsLkl0ZXJhdG9yKSBwYXJlbnQuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUyk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IGNoaWxkLmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJLy8gTk9URTogQ01FbGVtZW50RGVjbGFyYXRpb24gb2YgY2hpbGQgaXMgbm90IGFsd2F5cyBIVE1MQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JCQkvLyBJdCBtaWdodCBiZSBvbmUgb2YgYmFzZWQgb24gRFREIChmb3IgWEhUTUwgZWxlbWVudCkuICBTbywgY29tcGFyaXNvbiBtdXN0Ci0JCQkvLyBiZSBwZXJmb3JtZWQgaWdub3JpbmcgY2FzZS4KLQkJCS8vIC0tIDMvMjAvMjAwMgotCQkJU3RyaW5nIHRlcm1pbmF0b3IgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlmICh0ZXJtaW5hdG9yID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAobmV4dE5hbWUuZXF1YWxzSWdub3JlQ2FzZSh0ZXJtaW5hdG9yKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGFpbihFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRE9NRWxlbWVudCBpbXBsID0gKElET01FbGVtZW50KSBlbGVtZW50OwotCi0JCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAoIWltcGwuaXNHbG9iYWxUYWcoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gbm9uIEhUTUwgdGFnCi0JCQlJRE9NRWxlbWVudCBjaGlsZEVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGNoaWxkOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBteURlYyA9IENNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKG15RGVjID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvL2lmICghKG15RGVjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikpIHJldHVybiB0cnVlOwotCQkJaWYgKG15RGVjLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAoIWNoaWxkRWxlbWVudC5pc0dsb2JhbFRhZygpKQotCQkJCXJldHVybiB0cnVlOyAvLyBub24gSFRNTCB0YWcKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkRGVjID0gQ01Ob2RlVXRpbC5nZXRFbGVtZW50RGVjbGFyYXRpb24oY2hpbGRFbGVtZW50KTsKLQkJCWlmIChjaGlsZERlYyA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy9pZiAoIShjaGlsZERlYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pKSByZXR1cm4gdHJ1ZTsKLQotCQkJaWYgKG15RGVjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCWlmICgoKEJvb2xlYW4pICgoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgbXlEZWMpLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHNob3VsZFRlcm1pbmF0ZUF0KG15RGVjLCBjaGlsZERlYykgJiYgIWlzVmFsaWRDaGlsZChteURlYywgY2hpbGREZWMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlTdHJpbmcgdGFnTmFtZSA9IGltcGwuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCVN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKGNoaWxkTmFtZSA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKCFpbXBsLmhhc1N0YXJ0VGFnKCkgJiYgIWltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpKSB7Ci0JCQkJCWlmICghY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlJRE9NRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQkJCWlmICghcGFyZW50RWxlbWVudC5oYXNTdGFydFRhZygpICYmICFwYXJlbnRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQlpZiAoIWNhbkNvbnRhaW4ocGFyZW50RWxlbWVudCwgY2hpbGQpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gY29udGV4dWFsIHRlcm1pbmF0aW9uIGZvciBUQUJMRSBjb250ZW50IHRhZ3MKLQkJCWJvb2xlYW4gaXNUYWJsZUNvbnRlbnQgPSBmYWxzZTsKLQkJCWlmIChjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpIHx8IGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCkgfHwgY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKSkgewotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaXNUYWJsZUNvbnRlbnQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKSkgewotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaXNUYWJsZUNvbnRlbnQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlREKSB8fCBjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEgpKSB7Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFIpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpc1RhYmxlQ29udGVudCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoaXNUYWJsZUNvbnRlbnQpIHsKLQkJCQkvLyBUQUJMRSBjb250ZW50IHRhZ3Mgc2hvdWxkIHRlcm1pbmF0ZSBub24gVEFCTEUgY29udGVudCB0YWdzLAotCQkJCS8vIGlmIGluIFRBQkxFCi0JCQkJZm9yIChOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlicmVhazsKLQkJCQkJSURPTUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJCQlTdHJpbmcgcGFyZW50TmFtZSA9IHBhcmVudEVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQlpZiAocGFyZW50TmFtZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChwYXJlbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTUJFRCkpIHsKLQkJCQlpZiAoIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVEKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gaW1wbC5nZXRUYWdOYW1lKCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU1CRUQpKSB7Ci0JCQkJSURPTVRleHQgdGV4dCA9IChJRE9NVGV4dCkgY2hpbGQ7Ci0JCQkJaWYgKCF0ZXh0LmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQlpZiAoaW1wbC5pc0ltcGxpY2l0VGFnKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBjcmVhdGVNZXRhRWxlbWVudChkb2N1bWVudCwgZGF0YSwgaXNKU1BUYWcpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcm91dGluZSBjcmVhdGUgYW4gaW1wbGljaXQgRWxlbWVudCBmb3IgZ2l2ZW4gcGFyZW50IGFuZCBjaGlsZCwKLQkgKiBzdWNoIGFzIEhUTUwsIEJPRFksIEhFQUQsIGFuZCBUQk9EWSBmb3IgSFRNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVJbXBsaWNpdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgRWxlbWVudCBjcmVhdGVNZXRhRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihkYXRhLCAwLCB0cnVlKTsgLy8gb25lIGxpbmUKLQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgIW5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5NRVRBREFUQSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNTdGFydFNwYW4gPSBmYWxzZTsKLQkJYm9vbGVhbiBpc0VuZFNwYW4gPSBmYWxzZTsKLQkJbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJd2hpbGUgKG5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gc2Nhbm5lci5uZXh0VmFsdWUoKTsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuVFlQRSkpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuREVTSUdORVJfQ09OVFJPTCkpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkRFU0lHTkVSX0NPTlRST0w7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuRFlOQU1JQ19EQVRBKSkgewotCQkJCQl0eXBlID0gTWV0YURhdGEuRFlOQU1JQ19EQVRBOwotCQkJCX0KLQkJCQllbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkFVVEhPUl9USU1FX1ZJU1VBTCkpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkFVVEhPUl9USU1FX1ZJU1VBTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5BTk5PVEFUSU9OKSkgewotCQkJCQl0eXBlID0gTWV0YURhdGEuQU5OT1RBVElPTjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5TVEFSVFNQQU4pKSB7Ci0JCQkJaXNTdGFydFNwYW4gPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkVORFNQQU4pKSB7Ci0JCQkJaWYgKCFpc1N0YXJ0U3BhbikKLQkJCQkJaXNFbmRTcGFuID0gdHJ1ZTsKLQkJCX0KLQkJCW5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzU3RhcnRTcGFuICYmICFpc0VuZFNwYW4pCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG1ldGFEYXRhID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IHNjYW5uZXIuZ2V0TmV4dE9mZnNldCgpOyAvLyBza2lwIG5ldyBsaW5lCi0JCWlmIChvZmZzZXQgPCBkYXRhLmxlbmd0aCgpKQotCQkJbWV0YURhdGEgPSBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQlpZiAobWV0YURhdGEgPT0gbnVsbCkKLQkJCW1ldGFEYXRhID0gbmV3IFN0cmluZygpOwotCi0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTWV0YURhdGEuUFJFRklYICsgdHlwZSk7Ci0KLQkJTWV0YURhdGFBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTWV0YURhdGFBZGFwdGVyKHR5cGUpOwotCQlpZiAoaXNTdGFydFNwYW4pIHsKLQkJCWlmIChtZXRhRGF0YSAhPSBudWxsKQotCQkJCWFkYXB0ZXIuc2V0RGF0YShtZXRhRGF0YSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobWV0YURhdGEgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLnNldEVuZERhdGEobWV0YURhdGEpOwotCQl9Ci0JCWVsZW1lbnQuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJYWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQllbGVtZW50LnNldEpTUFRhZyhpc0pTUFRhZyk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyB0YWcgbWF0Y2hpbmcgc2hvdWxkIG5vdCBiZXlvbmQgVEFCTEUgdGFnIGV4Y2VwdCBCT0RZIHRhZwotCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlUYWdBZGFwdGVyIGFkYXB0ZXIgPSAoVGFnQWRhcHRlcikgZWxlbWVudC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5pc0VuZFRhZygpOwotCQlyZXR1cm4gZWxlbWVudC5pc0VuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBkbyBub3RoaW5nIG9uIG5vdGlmaXkgY2hhbmdlCi0JCS8vIFRPRE86IHRoaXMgbWVhbnMgZ29vZCBjYW5kaWRhdGUgZm9yIHJlZ3VsYXIgcGxhdGZvcm0gYWRhcHRlcgotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENoaWxkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNQ29udGVudCBjb250ZW50ID0gcGFyZW50LmdldENvbnRlbnQoKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlzQ2hpbGQoY29udGVudCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZChDTUNvbnRlbnQgY29udGVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gdGFyZ2V0KSB7Ci0JCXN3aXRjaCAoY29udGVudC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQlyZXR1cm4gaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50LCB0YXJnZXQpOwotCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCQlpZiAoaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQljYXNlIENNTm9kZS5HUk9VUCA6Ci0JCQkJCQkJaWYgKGlzQ2hpbGQoKENNQ29udGVudCkgY2hpbGQsIHRhcmdldCkpCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lRGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gYURlYywgQ01FbGVtZW50RGVjbGFyYXRpb24gb3RoZXJEZWMpIHsKLQkJcmV0dXJuIGFEZWMuZ2V0RWxlbWVudE5hbWUoKSA9PSBvdGhlckRlYy5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzQxOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTW9kZWxQYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4gSXQKLQkgKiBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90IC4uLiBkZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZQotCSAqIElOb2RlQWRhcHRlciAuLi4gYnV0IGluIGdlbmVyYWwgaXQgaXMgcmVjb21tZW5kZWQgZm9yIGFuIGFkYXB0ZXIgdG8gYmUKLQkgKiBzdGF0ZWxlc3MsIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgYWRkQWRhcHRlciBvbiB0aGUgYWRhcHRlZAotCSAqIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChub3RpZmllciAhPSBudWxsKSB7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCQlhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQlhZGFwdGVyID0gbmV3IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXIoKTsKLQkJCQkJbm90aWZpZXIuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBubyBzdGF0ZSB0byBjbGVhbnVwCi0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBjb3B5IG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzJlMThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGEgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQSA9ICJNRVRBREFUQSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVFNQQU4gPSAic3RhcnRzcGFuIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTkRTUEFOID0gImVuZHNwYW4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFU0lHTkVSX0NPTlRST0wgPSAiRGVzaWduZXJDb250cm9sIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0RBVEEgPSAiRHluYW1pY0RhdGEiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUl9USU1FX1ZJU1VBTCA9ICJBdXRob3JUaW1lVmlzdWFsIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OID0gIkFubm90YXRpb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJNRVRBREFUQToiOy8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGFBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGFBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzRjYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciwgTWV0YURhdGEgewotCi0JcHJpdmF0ZSBJRE9NRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBkYXRhID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbmREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBNZXRhRGF0YUFkYXB0ZXIoU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAodHlwZS5lcXVhbHMoQU5OT1RBVElPTikpIHsKLQkJCQl0aGlzLnR5cGUgPSBBTk5PVEFUSU9OOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoQVVUSE9SX1RJTUVfVklTVUFMKSkgewotCQkJCXRoaXMudHlwZSA9IEFVVEhPUl9USU1FX1ZJU1VBTDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0NvbW1lbnRUZXh0KHJlZ2lvblR5cGUpKSB7Ci0JCQkJZGF0YSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJZm9yICg7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IGRhdGEuY2hhckF0KG9mZnNldCk7Ci0JCQlpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykgewotCQkJCW9mZnNldCsrOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWZvciAoOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSBkYXRhLmNoYXJBdChvZmZzZXQpOwotCQkJaWYgKGMgIT0gJ1xyJyAmJiBjICE9ICdcbicpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGF0YS5zdWJzdHJpbmcob2Zmc2V0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGV4dChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXN1bHQgPSBpc0RPTUNvbW1lbnQocmVnaW9uVHlwZSkgfHwgaXNOZXN0ZWRDb250ZW50Q29tbWVudChyZWdpb25UeXBlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRDb250ZW50Q29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVnaW9uVHlwZS5lcXVhbHMoSlNQX0NPTU1FTlRfVEVYVCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRE9NQ29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlyZXR1cm4gcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMuZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5kYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5kYXRhOwotCQlyZXR1cm4gZ2V0RGF0YShmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVsaW1pdGVyKElET01Nb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgZGVsaW0gPSBudWxsOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlkZWxpbSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCX0KLQkJaWYgKGRlbGltID09IG51bGwpCi0JCQlkZWxpbSA9ICJcclxuIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZWxpbTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZERhdGEoKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5lbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5lbmREYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmREYXRhOwotCQlyZXR1cm4gZ2V0RGF0YShmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgiPCUtLSIpOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgiPCEtLSIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNRVRBREFUQSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJYnVmZmVyLmFwcGVuZChUWVBFKTsKLQkJYnVmZmVyLmFwcGVuZCgiPVwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMudHlwZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlwiICIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNZXRhRGF0YS5FTkRTUEFOKTsKLQkJU3RyaW5nIGRhdGEgPSBnZXRFbmREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBkZWxpbSA9IGdldERlbGltaXRlcihlbGVtZW50LmdldE1vZGVsKCkpOwotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoIi0tJT4iKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIi0tPiIpOy8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCI8JS0tIik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCI8IS0tIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1FVEFEQVRBKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlidWZmZXIuYXBwZW5kKFRZUEUpOwotCQlidWZmZXIuYXBwZW5kKCI9XCIiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy50eXBlKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1ldGFEYXRhLlNUQVJUU1BBTik7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXREZWxpbWl0ZXIoZWxlbWVudC5nZXRNb2RlbCgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCItLSU+Iik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCItLT4iKTsvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gTWV0YURhdGFBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5lbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLmVsZW1lbnQuaGFzRW5kVGFnKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHRoaXMuZW5kRGF0YSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bnRpbWVDb250YWluZXIoKSB7Ci0JCXJldHVybiAodGhpcy50eXBlID09IEFOTk9UQVRJT04gfHwgdGhpcy50eXBlID09IEFVVEhPUl9USU1FX1ZJU1VBTCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCi0JCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkKLQkJCXRoaXMuZWxlbWVudC5ub3RpZnlTdGFydFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmREYXRhKFN0cmluZyBkYXRhKSB7Ci0JCXRoaXMuZW5kRGF0YSA9IGRhdGE7Ci0KLQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKQotCQkJdGhpcy5lbGVtZW50Lm5vdGlmeUVuZFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQotCQlpZiAodGhpcy5lbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMuZWxlbWVudC5zZXRDb21tZW50VGFnKHRydWUpOwotCQkJaWYgKHRoaXMudHlwZSAhPSBNZXRhRGF0YS5BTk5PVEFUSU9OKSB7Ci0JCQkJdGhpcy5lbGVtZW50LnNldEpTUFRhZyh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzUnVudGltZUNvbnRhaW5lcigpKQotCQkJcmV0dXJuOwotCi0JCUlET01Nb2RlbCBtb2RlbCA9IHRoaXMuZWxlbWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgb2Zmc2V0ID0gdGhpcy5lbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCWludCBlbmQgPSB0aGlzLmVsZW1lbnQuZ2V0RW5kU3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IGVuZCAtIG9mZnNldDsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KG1vZGVsLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTBiYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgVGFnU2Nhbm5lciB7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWcgPSBudWxsOwotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gb25lTGluZSA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JVGFnU2Nhbm5lcihTdHJpbmcgdGFnLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy50YWcgPSB0YWc7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAodGFnICE9IG51bGwpCi0JCQl0aGlzLmxlbmd0aCA9IHRhZy5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQsIGJvb2xlYW4gb25lTGluZSkgewotCQl0aGlzKHRhZywgb2Zmc2V0KTsKLQotCQl0aGlzLm9uZUxpbmUgPSBvbmVMaW5lOwotCX0KLQotCS8qKgotCSAqLwotCWludCBnZXROZXh0T2Zmc2V0KCkgewotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmICghaXNFbmQoYykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCWludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmQoY2hhciBjKSB7Ci0JCXJldHVybiAodGhpcy5vbmVMaW5lICYmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJz0nKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUXVvdGUoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2hhciBuZXh0Q2hhcigpIHsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGM7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RyaW5nIG5leHROYW1lKCkgewotCQlpZiAodGhpcy50YWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5sZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAobmV4dENoYXIoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IG5hbWVPZmZzZXQgPSB0aGlzLm9mZnNldDsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykgfHwgaXNTcGFjZShjKSkKLQkJCQlicmVhazsKLQkJCWlmIChpc0VxdWFsKGMpICYmIHRoaXMub2Zmc2V0ID4gbmFtZU9mZnNldCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAodGhpcy5vZmZzZXQgPT0gbmFtZU9mZnNldCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiB0aGlzLnRhZy5zdWJzdHJpbmcobmFtZU9mZnNldCwgdGhpcy5vZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCVN0cmluZyBuZXh0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWNoYXIgc2VwZXJhdG9yID0gbmV4dENoYXIoKTsKLQkJaWYgKCFpc0VxdWFsKHNlcGVyYXRvcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdGhpcy5vZmZzZXQrKzsgLy8gc2tpcCAnPScKLQkJY2hhciBxdW90ZSA9IG5leHRDaGFyKCk7Ci0JCWlmIChxdW90ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpc1F1b3RlKHF1b3RlKSkKLQkJCXRoaXMub2Zmc2V0Kys7Ci0JCWVsc2UKLQkJCXF1b3RlID0gMDsKLQotCQlpbnQgdmFsdWVPZmZzZXQgPSB0aGlzLm9mZnNldDsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykpIHsKLQkJCQlxdW90ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocXVvdGUgPT0gMCkgewotCQkJCWlmIChpc1NwYWNlKGMpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjID09IHF1b3RlKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgdmFsdWVFbmQgPSB0aGlzLm9mZnNldDsKLQkJaWYgKHF1b3RlICE9IDAgJiYgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aCkKLQkJCXRoaXMub2Zmc2V0Kys7Ci0JCWlmICh2YWx1ZUVuZCA9PSB2YWx1ZU9mZnNldCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiB0aGlzLnRhZy5zdWJzdHJpbmcodmFsdWVPZmZzZXQsIHZhbHVlRW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVW5rbm93blRhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmY2Y0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVW5rbm93blRhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93blRhZ0FkYXB0ZXIgaW1wbGVtZW50cyBUYWdBZGFwdGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHN0YXJ0VGFnID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbmRUYWcgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVua25vd25UYWdBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCWlmICh0aGlzLmVuZFRhZyAhPSBudWxsKSB7Ci0JCQl0YWcgPSB0aGlzLmVuZFRhZzsKLQkJCXRoaXMuZW5kVGFnID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gbnVsbDsKLQkJaWYgKHRoaXMuc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJdGFnID0gdGhpcy5zdGFydFRhZzsKLQkJCXRoaXMuc3RhcnRUYWcgPSBudWxsOwotCQl9Ci0JCXJldHVybiB0YWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gVGFnQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRUYWcoU3RyaW5nIGVuZFRhZykgewotCQl0aGlzLmVuZFRhZyA9IGVuZFRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFRhZyhTdHJpbmcgc3RhcnRUYWcpIHsKLQkJdGhpcy5zdGFydFRhZyA9IHN0YXJ0VGFnOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjQyYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5IVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGJlZ2lubmluZyBwb3J0aW9uIG9mIEhUTUwgZmlsZSB0byBnZXQgdGhlIGVuY29kaW5nIHZhbHVlCi0gKiBpbiBhIE1FVEEgdGFnLiBFeGFtcGxlOgotICogPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0gKiAKLSAqIE5vdGU6IGV2ZW4gdGhvdWdoLCB0ZWNobmljYWxseSwgYSBNRVRBIHRhZyBtdXN0IGNvbWUgaW4gYSA8SEVBRD50YWcsIHdlCi0gKiBkb24ndCBjaGVjayBmb3IgdGhhdCwgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB3aGF0ZXZlciwgb3Igd2hlcmVldmVyLCB0aGUKLSAqIHRoZSBmaXJzdCA8TUVUQT50YWcgaXMsIGl0IGlzIHRoZSBvbmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgdXNlciwgYW5kCi0gKiB0aGV5IG1heSBqdXN0IGJlIHRyeWluZyB0byByZXBhaXIgdGhlIGVycm9yLiBUaGUgSFRNTCB2YWxpZGF0b3Igd2lsbCB0ZWxsCi0gKiB0aGVtIGlmIGl0cyBpbiB0aGUgd3JvbmcgbG9jYXRpb24uCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCi0JcHVibGljIEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMGE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ0d1ZXNzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQotCXB1YmxpYyBIVE1MRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSFRNTGlzaFRhZyhYTUxTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGVuY29kaW5nLiBGb3IgSFRNTCwgdGhlcmUgaXMgbm8gc3BlYy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIERvIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3Rpb24gYnkgZ3Vlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVuY29kaW5nTmFtZUJ5R3Vlc3MoYnl0ZVtdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlmaW5hbCBTdHJpbmcgaWFuYUVuYyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKHN0cmluZywgbGVuZ3RoKTsKLQkJcmV0dXJuIGlhbmFFbmM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TG9hZGVyI2NyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpCi0JICovCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qCi0JICogQHNlZSBJTW9kZWxMb2FkZXIjZ2V0UGFyc2VyKCkKLQkgKi8KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJWE1MU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQkJLy8gZm9yIHRoZSAic3RhdGljIEhUTUwiIGNhc2UsIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZQotCQkvLyBCbG9ja3RhZ3MgaGVyZS4KLQkJYWRkSFRNTGlzaFRhZyhwYXJzZXIsICJzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRIVE1MaXNoVGFnKHBhcnNlciwgInN0eWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCS8vCi0JCWZhY3RvcnkgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0JCWZhY3RvcnkgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIERNVzoganVzdCBhZGRlZCB0aGlzIHByZWxvYWQgb24gOC8xNi8yMDAyCi0JCS8vIEkgbm90aWNlZCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHdhcyBiZWluZyBhZGRlZCwKLQkJLy8gdGhhdCB0aGF0IHRoZSBQcm9hZ2F0aW5nQWRhcHRlckFkYXB0ZXIgd2FzIG5vdCBiZWluZwotCQkvLyBwcmVsb2FkIGFkYXB0ZWQgLS0gSSdtIGFzc3VpbmcgaXQgQUxXQVlTIGhhcyB0byBiZS4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb21Nb2RlbC5nZXREb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjg0ZmM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01TdHlsZU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5EZWJ1Z0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0KLQotCXB1YmxpYyBIVE1MTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSFRNTGlzaFRhZyhYTUxTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJRE9NU3R5bGVNb2RlbEltcGwgbW9kZWwgPSBuZXcgRE9NU3R5bGVNb2RlbEltcGwoKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gU3R5bGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJLy8KLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlzdXBlci5wcmVMb2FkQWRhcHQoc3RydWN0dXJlZE1vZGVsKTsKLQkJLy8gRE1XOiBqdXN0IGFkZGVkIHRoaXMgcHJlbG9hZCBvbiA4LzE2LzIwMDIKLQkJLy8gSSBub3RpY2VkIHRoZSBQcm9hZ2F0aW5nQWRhcHRlckZhY3Rvcnkgd2FzIGJlaW5nIGFkZGVkLAotCQkvLyB0aGF0IHRoYXQgdGhlIFByb2FnYXRpbmdBZGFwdGVyQWRhcHRlciB3YXMgbm90IGJlaW5nCi0JCS8vIHByZWxvYWQgYWRhcHRlZCAtLSBJJ20gYXNzdWluZyBpdCBBTFdBWVMgaGFzIHRvIGJlLgotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKERlYnVnLmRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzKSB7Ci0JCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb21Nb2RlbC5nZXREb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IERlYnVnQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBIVE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IEhUTUxEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0VtYmVkZGVkQ1NTRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0VtYmVkZGVkQ1NTRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDkwNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9FbWJlZGRlZENTU0Zvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZENTU0Zvcm1hdHRlciBleHRlbmRzIEhUTUxGb3JtYXR0ZXIgewotCi0JLy9wcml2YXRlIElBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzLCB0cnVlKTsKLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRW1iZWRkZWRDU1NGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01UZXh0IHRleHQgPSAoSURPTVRleHQpIG5vZGU7Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldENTU0NvbnRlbnQobm9kZSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgeyAvLyBmYWxsYmFjawotCQkJc291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCWludCBvZmZzZXQgPSB0ZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSB0ZXh0LmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQlyZXBsYWNlU291cmNlKHRleHQuZ2V0TW9kZWwoKSwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JCXNldFdpZHRoKGNvbnRyYWludHMsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTQ29udGVudChJRE9NTm9kZSB0ZXh0KSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKHRleHQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBhZGFwdGVyOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoSURPTU5vZGUgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZVNoZWV0QWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEVsZW1lbnRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEVsZW1lbnRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjM2E3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxFbGVtZW50Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1wdWJsaWMgY2xhc3MgSFRNTEVsZW1lbnRGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MRWxlbWVudEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29tcHJlc3NUYWlsaW5nU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJaW50IGNvdW50ID0gcmVnaW9uLmdldEVuZCgpIC0gb2Zmc2V0OwotCQlpZiAoY291bnQgPT0gMSkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCQlpbnQgc3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuY2hhckF0KG9mZnNldCAtIHN0YXJ0KSA9PSAnICcpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VTb3VyY2UoZmxhdE5vZGUsIG9mZnNldCwgY291bnQsICIgIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlOb2RlIGxhc3RDaGlsZCA9IGVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0KLQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsICYmIGxhc3RDaGlsZCBpbnN0YW5jZW9mIElET01FbGVtZW50ICYmIGxhc3RDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnNjcmlwdGxldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWluc2VydEJyZWFrQWZ0ZXIoKElET01FbGVtZW50KSBsYXN0Q2hpbGQsIGNvbnRyYWludHMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpIHx8IGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCVN0cmluZyBlbmRUYWcgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkJaWYgKGVuZFRhZyAhPSBudWxsICYmIGVuZFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBlbmRUYWcpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFJvb3RUYWcocHJldlJlZ2lvbi5nZXRUeXBlKCkpKSkgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFJvb3RUYWcocHJldlJlZ2lvbi5nZXRUeXBlKCkpKSkgewotCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQl9Ci0KLQkJLy8gQlVHMTIzODkwIChlbmQgdGFnIGxlbmd0aCB3YXMgYWxyZWFkeSBwcmVmYWN0b3JlZCBpbnRvCi0JCS8vIGZvcm1hdFN0YXJ0VGFnIHNvIG5vIG5lZWQgdG8gZG8gaXQgaGVyZSkKLQkJLy8gU3RyaW5nIG5ld0VuZFRhZyA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCS8vIGlmIChuZXdFbmRUYWcgIT0gbnVsbCAmJiBuZXdFbmRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCS8vIHNldFdpZHRoKGNvbnRyYWludHMsIG5ld0VuZFRhZyk7Ci0JCS8vCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0KLQkJZm9ybWF0U3RhcnRUYWcoZWxlbWVudCwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0Q2hpbGROb2RlcyhlbGVtZW50LCBjb250cmFpbnRzKTsKLQotCQlmb3JtYXRFbmRUYWcoZWxlbWVudCwgY29udHJhaW50cyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQotCQlpZiAoZWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnNjcmlwdGxldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWluc2VydEJyZWFrQmVmb3JlKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gV2Ugc2hvdWxkIGZvcm1hdCBhdHRyaWJ1dGVzIGluIEpTUFRhZz8KLQkJLy8gaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgc3RhcnRUYWcgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCAmJiBzdGFydFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBzdGFydFRhZyk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaXJzdCBwcm9jZXNzIHN0eWxlIGF0dHJpYnV0ZQotCQlpZiAoZWxlbWVudC5pc0dsb2JhbFRhZygpKSB7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoInN0eWxlIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlmb3JtYXRTdHlsZUF0dHIoYXR0cik7Ci0JCX0KLQkJYm9vbGVhbiBpbnNlcnRCcmVhayA9IGZhbHNlOwotCQlpbnNlcnRCcmVhayA9ICgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSkuZ2V0U3BsaXRNdWx0aUF0dHJzKCk7Ci0KLQkJaWYgKGluc2VydEJyZWFrKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCB8fCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIDwgMikKLQkJCQlpbnNlcnRCcmVhayA9IGZhbHNlOwotCQl9Ci0JCVN0cmluZyBicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKGVsZW1lbnQpOwotCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50KCk7Ci0JCWlmIChpbmRlbnQgIT0gbnVsbCAmJiBpbmRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlicmVha1NwYWNlcyArPSBpbmRlbnQ7Ci0JCX0KLQkJSVRleHRSZWdpb24gbGFzdEJyZWFrUmVnaW9uID0gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJSVRleHRSZWdpb24gYnJlYWtSZWdpb24gPSBudWxsOwotCi0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZyhyZWdpb25UeXBlKSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJCWJyZWFrUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpKSB7Ci0JCQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCQkJYnJlYWtSZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCQlicmVha1JlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSkgewotCQkJCQkvLyBhdHRyaWJ1dGUgbmFtZSB3aXRob3V0IHZhbHVlCi0JCQkJCWJyZWFrUmVnaW9uID0gcHJldlJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChicmVha1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IGVuZCA9IGJyZWFrUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCQlpZiAobGFzdEJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IG9mZnNldCA9IGxhc3RCcmVha1JlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJaW50IGNvdW50ID0gZW5kIC0gb2Zmc2V0OwotCQkJCQlpZiAoaW5zZXJ0QnJlYWsgfHwgIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgY291bnQgKyAxKSkgewotCQkJCQkJcmVwbGFjZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbiwgYnJlYWtTcGFjZXMpOwotCQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29tcHJlc3NUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJCX0KLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgY291bnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgZW5kKTsKLQkJCQl9Ci0JCQkJbGFzdEJyZWFrUmVnaW9uID0gYnJlYWtSZWdpb247Ci0JCQl9Ci0KLQkJCXByZXZSZWdpb24gPSByZWdpb247Ci0JCX0KLQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSkgewotCQkJLy8gYXR0cmlidXRlIG5hbWUgd2l0aG91dCB2YWx1ZQotCQkJaW50IGVuZCA9IHByZXZSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJaWYgKGxhc3RCcmVha1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IGxhc3RCcmVha1JlZ2lvbi5nZXRFbmQoKTsKLQkJCQlpbnQgY291bnQgPSBlbmQgLSBvZmZzZXQ7Ci0JCQkJaWYgKGluc2VydEJyZWFrIHx8ICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIGNvdW50ICsgMSkpIHsKLQkJCQkJcmVwbGFjZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbiwgYnJlYWtTcGFjZXMpOwotCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb21wcmVzc1RhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCX0KLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb3VudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBlbmQpOwotCQkJfQotCQkJbGFzdEJyZWFrUmVnaW9uID0gcHJldlJlZ2lvbjsKLQkJfQotCi0JCWlmIChsYXN0QnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJaW50IG9mZnNldCA9IGxhc3RCcmVha1JlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQlpbnQgY291bnQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSAtIG9mZnNldDsKLQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJY29tcHJlc3NUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCS8vIEJVRzEyMzg5MCAocHJlLWZhY3RvciBpbiBlbmQgdGFnKQotCQkJCWNvdW50ICs9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpICsgMzsKLQkJCX0KLQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvdW50KTsKLQkJfQotCQllbHNlIHsKLQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9ST09UX1RBR19OQU1FID0gIkpTUF9ST09UX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlLmVxdWFscyhKU1BfUk9PVF9UQUdfTkFNRSkgfHwgcmVnaW9uVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkUm9vdFRhZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZS5lcXVhbHMoSlNQX1JPT1RfVEFHX05BTUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFN0eWxlQXR0cihBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0Q1NTVmFsdWUoYXR0cik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkVmFsdWUgPSAoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpOwotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotCQkJcmV0dXJuOwotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZURlY2xhcmF0aW9uQWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKGF0dHIpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBhZGFwdGVyOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVRhaWxpbmdTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgY291bnQgPSByZWdpb24uZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCWlmIChjb3VudCA8PSAwKQotCQkJcmV0dXJuOwotCQlyZXBsYWNlU291cmNlKGZsYXROb2RlLCBvZmZzZXQsIGNvdW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwbGFjZVRhaWxpbmdTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uLCBTdHJpbmcgc3BhY2VzKSB7Ci0JCWludCBvZmZzZXQgPSByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgY291bnQgPSByZWdpb24uZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCWlmIChjb3VudCA9PSBzcGFjZXMubGVuZ3RoKCkpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5lbmRzV2l0aChzcGFjZXMpKSB7Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlyZXBsYWNlU291cmNlKGZsYXROb2RlLCBvZmZzZXQsIGNvdW50LCBzcGFjZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRDb250cmFpbnRzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0Q29udHJhaW50c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1MDM4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRDb250cmFpbnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICogUGxlYXNlIHVuLWRlcHJlY2F0ZSB0aGlzIGlmIFBhZ2UgRGVzaWduZXIgdGhpbmtzIHRoZXkgYXJlIG5lZWRlZC4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxGb3JtYXRDb250cmFpbnRzSW1wbCBleHRlbmRzIFN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGltcGxlbWVudHMgSFRNTEZvcm1hdENvbnRyYWludHMgewotCXByb3RlY3RlZCBpbnQgZkF2YWlsYWJsZUxpbmVXaWR0aDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0JcHVibGljIGludCBnZXRBdmFpbGFibGVMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBmQXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlTGluZVdpZHRoKGludCBhdmFpbGFibGVMaW5lV2lkdGgpIHsKLQkJZkF2YWlsYWJsZUxpbmVXaWR0aCA9IGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY1Y2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdFByb2Nlc3NvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwgZXh0ZW5kcyBGb3JtYXRQcm9jZXNzb3JYTUwgewotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICJodG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKG5vZGUsIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzNjY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxGb3JtYXR0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9OQU1FID0gImh0bWwiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9OQU1FID0gIkJPRFkiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdpZHRoKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIGludCB3aWR0aCkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIXNwbGl0TGluZXMoKSB8fCBnZXRMaW5lV2lkdGgoKSA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IGF2YWlsYWJsZVdpZHRoID0gY29udHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSAtIHdpZHRoOwotCQlpZiAoYXZhaWxhYmxlV2lkdGggPCAwKQotCQkJYXZhaWxhYmxlV2lkdGggPSAwOwotCQljb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRm9ybWF0Q2hpbGQoTm9kZSBub2RlKSB7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpIHsKLQkJCQkJYm9vbGVhbiBzaG91bGRLZWVwU3BhY2UgPSAoKEJvb2xlYW4pIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoc2hvdWxkS2VlcFNwYWNlKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtBZnRlcihDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBoaW50ID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCk7Ci0JCWlmIChoaW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpIHx8IGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtBZnRlcihOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIGRvIG5vdCBpbnNlcnQgYnJlYWsgYWZ0ZXIgdW5jbG9zZWQgdGFnCi0JCQkJaWYgKCEoKElET01FbGVtZW50KSBub2RlKS5pc0Nsb3NlZCgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJLy8gZG8gbm90IGluc2VydCBicmVhayBiZWZvcmUgbWlzc2luZyBlbmQgdGFnCi0JCQlpZiAobmV4dCA9PSBudWxsICYmIGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGluc2VydCBsaW5lIGJyZWFrIHVuZGVyIG5vbi1IVE1MIGVsZW1lbnRzIGluY2x1ZGluZyBKU1AgZWxlbWVudHMKLQkJCWlmIChlbGVtZW50LmdldFByZWZpeCgpICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCS8vIHNwZWNpYWwgZm9yIGRpcmVjdCBjaGlsZHJlbiB1bmRlciBCT0RZCi0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWV9OQU1FKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0FmdGVyKGRlY2wpKSB7Ci0JCQkJLy8gc3BjaWFsIGZvciBCUgotCQkJCXJldHVybiBjYW5Gb3JtYXRDaGlsZChwYXJlbnQpOwotCQkJfQotCQl9Ci0JCWlmIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBuZXh0KTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0JlZm9yZShkZWNsKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtCZWZvcmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlpZiAoaGludCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQmVmb3JlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJLy8gZG8gbm90IGluc2VydCBicmVhayBhZnRlciBtaXNzaW5nIHN0YXJ0IHRhZwotCQkJaWYgKHByZXYgPT0gbnVsbCAmJiBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGluc2VydCBsaW5lIGJyZWFrIHVuZGVyIG5vbi1IVE1MIGVsZW1lbnRzIGluY2x1ZGluZyBKU1AgZWxlbWVudHMKLQkJCWlmIChlbGVtZW50LmdldFByZWZpeCgpICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCS8vIHNwZWNpYWwgZm9yIGRpcmVjdCBjaGlsZHJlbiB1bmRlciBCT0RZCi0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWV9OQU1FKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0JlZm9yZShkZWNsKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcHJldik7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihkZWNsKSkgewotCQkJCS8vIHNwY2lhbCBmb3IgQlIKLQkJCQlyZXR1cm4gY2FuRm9ybWF0Q2hpbGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSkgewotCQlmb3JtYXQobm9kZSwgZ2V0Rm9ybWF0Q29udHJhaW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlICYmIGNvbnRyYWludHMgaW5zdGFuY2VvZiBIVE1MRm9ybWF0Q29udHJhaW50cykKLQkJCWZvcm1hdCgoSURPTU5vZGUpIG5vZGUsIChIVE1MRm9ybWF0Q29udHJhaW50cykgY29udHJhaW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0KElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGRvIG5vdCBmb3JtYXQgcmVtb3ZlZCBub2RlCi0KLQkJc2V0V2lkdGgoY29udHJhaW50cywgbm9kZSk7Ci0KLQkJaWYgKGNhbkluc2VydEJyZWFrQmVmb3JlKG5vZGUpKQotCQkJaW5zZXJ0QnJlYWtCZWZvcmUobm9kZSwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0Tm9kZShub2RlLCBjb250cmFpbnRzKTsKLQotCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihub2RlKSkKLQkJCWluc2VydEJyZWFrQWZ0ZXIobm9kZSwgY29udHJhaW50cyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGROb2RlcyhJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghbm9kZS5oYXNDaGlsZE5vZGVzKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gY29uY2F0IGFkamFjZW50IHRleHRzCi0JCW5vZGUubm9ybWFsaXplKCk7Ci0KLQkJLy8gZGlzYWJsZSBzaWJsaW5nIGluZGVudCBkdXJpbmcgZm9ybWF0dGluZyBhbGwgdGhlIGNoaWxkcmVuCi0JCWJvb2xlYW4gaW5kZW50ID0gZmFsc2U7Ci0JCWlmIChjb250cmFpbnRzICE9IG51bGwpIHsKLQkJCWluZGVudCA9IGNvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKTsKLQkJCWNvbnRyYWludHMuc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoZmFsc2UpOwotCQl9Ci0KLQkJYm9vbGVhbiBpbnNlcnRCcmVhayA9IHRydWU7Ci0JCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gbm9kZSkKLQkJCQlicmVhazsKLQkJCUlET01Ob2RlIG5leHQgPSAoSURPTU5vZGUpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCWlmIChpbnNlcnRCcmVhayAmJiBjYW5JbnNlcnRCcmVha0JlZm9yZShjaGlsZCkpIHsKLQkJCQlpbnNlcnRCcmVha0JlZm9yZShjaGlsZCwgY29udHJhaW50cyk7Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKGNoaWxkLCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJCWlmIChmb3JtYXR0ZXIgaW5zdGFuY2VvZiBIVE1MRm9ybWF0dGVyKSB7Ci0JCQkJCUhUTUxGb3JtYXR0ZXIgaHRtbEZvcm1hdHRlciA9IChIVE1MRm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCQkJCWh0bWxGb3JtYXR0ZXIuZm9ybWF0Tm9kZShjaGlsZCwgY29udHJhaW50cyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3JtYXR0ZXIuZm9ybWF0KGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjYW5JbnNlcnRCcmVha0FmdGVyKGNoaWxkKSkgewotCQkJCWluc2VydEJyZWFrQWZ0ZXIoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJCWluc2VydEJyZWFrID0gZmFsc2U7IC8vIG5vdCB0byBpbnNlcnQgdHdpY2UKLQkJCX0KLQkJCWVsc2UgewotCQkJCWluc2VydEJyZWFrID0gdHJ1ZTsKLQkJCX0KLQotCQkJY2hpbGQgPSBuZXh0OwotCQl9Ci0KLQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCkKLQkJCWNvbnRyYWludHMuc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoaW5kZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsgLy8gY29udGFpbmVyCi0JCQlmb3JtYXRDaGlsZE5vZGVzKG5vZGUsIGNvbnRyYWludHMpOwotCQl9Ci0JCWVsc2UgeyAvLyBsZWFmCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcmVha1NwYWNlcyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVN0cmluZyBkZWxpbSA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQlpZiAoZGVsaW0gIT0gbnVsbCAmJiBkZWxpbS5sZW5ndGgoKSA+IDApCi0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQotCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50KCk7Ci0JCWlmIChpbmRlbnQgIT0gbnVsbCAmJiBpbmRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQlicmVhazsKLQkJCQkvLyBpZ25vcmUgb21pdHRlZCB0YWcKLQkJCQlpZiAoKChJRE9NTm9kZSkgcGFyZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJCWlmIChlbGVtZW50LmdldFByZWZpeCgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJCS8vIHNwZWNpYWwgZm9yIGh0bWw6aHRtbAotCQkJCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgIWxvY2FsTmFtZS5lcXVhbHMoSFRNTF9OQU1FKSkgewotCQkJCQkJYnVmZmVyLmFwcGVuZChpbmRlbnQpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQkJaWYgKGRlY2wgIT0gbnVsbCAmJiBkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKSB7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkSW5kZW50ID0gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKHNob3VsZEluZGVudCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoaW5kZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudCgpIHsKLQkJcmV0dXJuIGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldExpbmVXaWR0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0QnJlYWtBZnRlcihJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCVN0cmluZyBzcGFjZXMgPSBudWxsOwotCQlpZiAobmV4dCA9PSBudWxsKSB7IC8vIGxhc3Qgc3BhY2VzCi0JCQkvLyB1c2UgcGFyZW50IGluZGVudCBmb3IgdGhlIGVuZCB0YWcKLQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKHBhcmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlpZiAoY29udHJhaW50cyAhPSBudWxsICYmIGNvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkgewotCQkJCUlET01Ob2RlIHRleHQgPSAoSURPTU5vZGUpIG5leHQ7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gSFRNTEZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVGb3JtYXR0ZXIodGV4dCwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCQkJaWYgKGZvcm1hdHRlciBpbnN0YW5jZW9mIEhUTUxUZXh0Rm9ybWF0dGVyKSB7Ci0JCQkJCUhUTUxUZXh0Rm9ybWF0dGVyIHRleHRGb3JtYXR0ZXIgPSAoSFRNTFRleHRGb3JtYXR0ZXIpIGZvcm1hdHRlcjsKLQkJCQkJdGV4dEZvcm1hdHRlci5mb3JtYXRUZXh0KHRleHQsIGNvbnRyYWludHMsIEhUTUxUZXh0Rm9ybWF0dGVyLkZPUk1BVF9IRUFEKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJfQotCQlpZiAoc3BhY2VzID09IG51bGwgfHwgc3BhY2VzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVNvdXJjZShub2RlLmdldE1vZGVsKCksIG5vZGUuZ2V0RW5kT2Zmc2V0KCksIDAsIHNwYWNlcyk7Ci0JCXNldFdpZHRoKGNvbnRyYWludHMsIHNwYWNlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0QnJlYWtCZWZvcmUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkJU3RyaW5nIHNwYWNlcyA9IG51bGw7Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlpZiAoY29udHJhaW50cyAhPSBudWxsICYmIGNvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkgewotCQkJCUlET01Ob2RlIHRleHQgPSAoSURPTU5vZGUpIHByZXY7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gSFRNTEZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVGb3JtYXR0ZXIodGV4dCwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCQkJaWYgKGZvcm1hdHRlciBpbnN0YW5jZW9mIEhUTUxUZXh0Rm9ybWF0dGVyKSB7Ci0JCQkJCUhUTUxUZXh0Rm9ybWF0dGVyIHRleHRGb3JtYXR0ZXIgPSAoSFRNTFRleHRGb3JtYXR0ZXIpIGZvcm1hdHRlcjsKLQkJCQkJdGV4dEZvcm1hdHRlci5mb3JtYXRUZXh0KHRleHQsIGNvbnRyYWludHMsIEhUTUxUZXh0Rm9ybWF0dGVyLkZPUk1BVF9UQUlMKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJfQotCQlpZiAoc3BhY2VzID09IG51bGwgfHwgc3BhY2VzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVNvdXJjZShub2RlLmdldE1vZGVsKCksIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgMCwgc3BhY2VzKTsKLQkJc2V0V2lkdGgoY29udHJhaW50cywgc3BhY2VzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dpZHRoQXZhaWxhYmxlKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIGludCB3aWR0aCkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICghc3BsaXRMaW5lcygpIHx8IGdldExpbmVXaWR0aCgpIDwgMCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gKGNvbnRyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgPj0gd2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBCbGFua0xpbmVzKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gKCFjb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlU291cmNlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZmxhdE5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBzdGFydE9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShzdGFydE9mZnNldCArIG9mZnNldCwgbGVuZ3RoKSkKLQkJCXJldHVybjsKLQkJLy8gV2UgdXNlICdzdHJ1Y3R1cmVkRG9jdW1lbnQnIGFzIHRoZSByZXF1ZXN0ZXIgb2JqZWN0IGp1c3Qgc28gdGhpcyBhbmQgdGhlIG90aGVyCi0JCS8vIGZvcm1hdC1yZWxhdGVkICdyZXBhbGNlVGV4dCcgKGluIHJlcGxhY2VTb3VyY2UpIGNhbiB1c2UgdGhlIHNhbWUgcmVxdWVzdGVyLgotCQkvLyBPdGhlcndpc2UsIGlmIHJlcXVlc3RlciBpcyBub3QgaWRlbnRpY2FsLCAKLQkJLy8gdGhlIHVuZG8gZ3JvdXAgZ2V0cyAiYnJva2VuIiBpbnRvIG11bHRpcGxlIHBpZWNlcyBiYXNlZAotCQkvLyBvbiB0aGUgcmVxdWVzdGVycyBiZWluZyBkaWZmZXJlbnQuIFRlY2huaWNhbGx5LCBhbnkgdW5pcXVlLCBjb21tb24KLQkJLy8gcmVxdWVzdGVyIG9iamVjdCB3b3VsZCB3b3JrLgotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydE9mZnNldCArIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VTb3VyY2UoSURPTU1vZGVsIG1vZGVsLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKSkKLQkJCXJldHVybjsKLQkJLy8gV2UgdXNlICdzdHJ1Y3R1cmVkRG9jdW1lbnQnIGFzIHRoZSByZXF1ZXN0ZXIgb2JqZWN0IGp1c3Qgc28gdGhpcyBhbmQgdGhlIG90aGVyCi0JCS8vIGZvcm1hdC1yZWxhdGVkICdyZXBhbGNlVGV4dCcgKGluIHJlcGxhY2VTb3VyY2UpIGNhbiB1c2UgdGhlIHNhbWUgcmVxdWVzdGVyLgotCQkvLyBPdGhlcndpc2UsIGlmIHJlcXVlc3RlciBpcyBub3QgaWRlbnRpY2FsLCAKLQkJLy8gdGhlIHVuZG8gZ3JvdXAgZ2V0cyAiYnJva2VuIiBpbnRvIG11bHRpcGxlIHBpZWNlcyBiYXNlZAotCQkvLyBvbiB0aGUgcmVxdWVzdGVycyBiZWluZyBkaWZmZXJlbnQuIFRlY2huaWNhbGx5LCBhbnkgdW5pcXVlLCBjb21tb24KLQkJLy8gcmVxdWVzdGVyIG9iamVjdCB3b3VsZCB3b3JrLiAKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkdGgoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpZiAoIXNwbGl0TGluZXMoKSkKLQkJCXJldHVybjsKLQkJaW50IGxpbmVXaWR0aCA9IGdldExpbmVXaWR0aCgpOwotCQlpZiAobGluZVdpZHRoIDwgMCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gc291cmNlLmxhc3RJbmRleE9mKCdcbicpOwotCQlpbnQgb2Zmc2V0MiA9IHNvdXJjZS5sYXN0SW5kZXhPZignXHInKTsKLQkJaWYgKG9mZnNldDIgPiBvZmZzZXQpCi0JCQlvZmZzZXQgPSBvZmZzZXQyOwotCQlpZiAob2Zmc2V0ID49IDApCi0JCQlvZmZzZXQrKzsKLQotCQlpbnQgYXZhaWxhYmxlV2lkdGggPSAwOwotCQlpZiAob2Zmc2V0ID49IDApIHsKLQkJCWF2YWlsYWJsZVdpZHRoID0gbGluZVdpZHRoIC0gKGxlbmd0aCAtIG9mZnNldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhdmFpbGFibGVXaWR0aCA9IGNvbnRyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgLSBsZW5ndGg7Ci0JCX0KLQkJaWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkKLQkJCWF2YWlsYWJsZVdpZHRoID0gMDsKLQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFdpZHRoKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIE5vZGUgbm9kZSkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKCFzcGxpdExpbmVzKCkpCi0JCQlyZXR1cm47Ci0JCWludCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoKTsKLQkJaWYgKGxpbmVXaWR0aCA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChvZmZzZXQpOwotCQlpbnQgbGluZU9mZnNldCA9IDA7Ci0JCXRyeSB7Ci0JCQlsaW5lT2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm47IC8vIGVycm9yCi0JCX0KLQkJaWYgKGxpbmVPZmZzZXQgPiBvZmZzZXQpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IGF2YWlsYWJsZVdpZHRoID0gbGluZVdpZHRoIC0gKG9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQlpZiAoYXZhaWxhYmxlV2lkdGggPCAwKQotCQkJYXZhaWxhYmxlV2lkdGggPSAwOwotCi0JCWNvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdExpbmVzKCkgewotCQlyZXR1cm4gdHJ1ZTsvL2dldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0U3BsaXRMaW5lcygpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIEhUTUxGb3JtYXRDb250cmFpbnRzIGZGb3JtYXRDb250cmFpbnRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCS8vcHVibGljIHZvaWQgZm9ybWF0KFhNTE5vZGUgbm9kZSwgRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JLy8JaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkKLQkvLwkJZm9ybWF0Q29udHJhaW50cy5zZXRDdXJyZW50SW5kZW50KGdldFNpYmxpbmdJbmRlbnQobm9kZSkpOwotCS8vCi0JLy8JZm9ybWF0Tm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkvL30KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKCkgewotCQlpZiAoZkZvcm1hdENvbnRyYWludHMgPT0gbnVsbCkgewotCQkJZkZvcm1hdENvbnRyYWludHMgPSBuZXcgSFRNTEZvcm1hdENvbnRyYWludHNJbXBsKCk7Ci0KLQkJCWZGb3JtYXRDb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldExpbmVXaWR0aCgpKTsKLQkJCWZGb3JtYXRDb250cmFpbnRzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQkJfQotCi0JCXJldHVybiBmRm9ybWF0Q29udHJhaW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJZlByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTdjNjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1jbGFzcyBIVE1MRm9ybWF0dGVyRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgSFRNTEZvcm1hdHRlckZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBIVE1MRm9ybWF0dGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSFRNTEZvcm1hdHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBjcmVhdGVGb3JtYXR0ZXIoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKSB7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IG51bGw7Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCWZvcm1hdHRlciA9IG5ldyBIVE1MRWxlbWVudEZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJaWYgKGlzRW1iZWRkZWRDU1Mobm9kZSkpIHsKLQkJCQkJZm9ybWF0dGVyID0gbmV3IEVtYmVkZGVkQ1NTRm9ybWF0dGVyKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTFRleHRGb3JtYXR0ZXIoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTEZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gaW5pdCBGb3JtYXRQcmVmZXJlbmNlcwotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZm9ybWF0UHJlZmVyZW5jZXMpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1iZWRkZWRDU1MoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmFtZSA9IHBhcmVudC5nZXROb2RlTmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTVFlMRSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByaXZhdGUgSFRNTEZvcm1hdHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTFRleHRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTFRleHRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1MmY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxUZXh0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVGV4dEZvcm1hdHRlciBleHRlbmRzIEhUTUxGb3JtYXR0ZXIgewotCi0JcHVibGljIHN0YXRpYyBpbnQgRk9STUFUX0FMTCA9IDA7Ci0JcHVibGljIHN0YXRpYyBpbnQgRk9STUFUX0hFQUQgPSAxOwotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9UQUlMID0gMjsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MVGV4dEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuRm9ybWF0VGV4dChJRE9NVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRleHQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQkJaWYgKGlzVW5wYXJzZWRSZWdpb24odHlwZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQlpZiAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSAmJiAhdGV4dC5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBjYW5Gb3JtYXRDaGlsZChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1VucGFyc2VkUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gaXNOZXN0ZWRTY2FubmVkUmVnaW9uKHR5cGUpIHx8IGlzQmxvY2tTY2FubmVkUmVnaW9uKHR5cGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Jsb2NrU2Nhbm5lZFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQ7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RlZFNjYW5uZWRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gIkpTUF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSlNQX0NPTlRFTlQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmVIZWFkaW5nU3BhY2VzKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIHBhcmVudCk7Ci0JCWlmIChkZWNsID09IG51bGwgfHwgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBoaW50ID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCk7Ci0JCXJldHVybiBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlbW92ZVRhaWxpbmdTcGFjZXMoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlmb3JtYXRUZXh0KG5vZGUsIGNvbnRyYWludHMsIEZPUk1BVF9BTEwpOyAvLyBmdWxsIGZvcm1hdAotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFRleHQoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgaW50IG1vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlET01UZXh0IHRleHQgPSAoSURPTVRleHQpIG5vZGU7Ci0JCVN0cmluZyBzb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCi0JCWlmICghY2FuRm9ybWF0VGV4dCh0ZXh0KSkgewotCQkJc2V0V2lkdGgoY29udHJhaW50cywgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSB0ZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSB0ZXh0LmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCi0JCS8vIGZvcm1hdCBhZGphY2VudCB0ZXh0IGF0IG9uY2UKLQkJaWYgKG1vZGUgPT0gRk9STUFUX0hFQUQpIHsKLQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJSURPTVRleHQgbmV4dFRleHQgPSAoSURPTVRleHQpIG5leHQ7Ci0JCQkJbGVuZ3RoICs9IChuZXh0VGV4dC5nZXRFbmRPZmZzZXQoKSAtIG5leHRUZXh0LmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVN0cmluZyBuZXh0U291cmNlID0gbmV4dFRleHQuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKG5leHRTb3VyY2UgIT0gbnVsbCAmJiBuZXh0U291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJCQlzb3VyY2UgPSBuZXh0U291cmNlOwotCQkJCQllbHNlCi0JCQkJCQlzb3VyY2UgKz0gbmV4dFNvdXJjZTsKLQkJCQl9Ci0JCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlID09IEZPUk1BVF9UQUlMKSB7Ci0JCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJd2hpbGUgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlJRE9NVGV4dCBwcmV2VGV4dCA9IChJRE9NVGV4dCkgcHJldjsKLQkJCQlvZmZzZXQgPSBwcmV2VGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQkJCWxlbmd0aCArPSAocHJldlRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQpOwotCQkJCVN0cmluZyBwcmV2U291cmNlID0gcHJldlRleHQuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKHByZXZTb3VyY2UgIT0gbnVsbCAmJiBwcmV2U291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJCQlzb3VyY2UgPSBwcmV2U291cmNlOwotCQkJCQllbHNlCi0JCQkJCQlzb3VyY2UgPSBwcmV2U291cmNlICsgc291cmNlOwotCQkJCX0KLQkJCQlwcmV2ID0gcHJldi5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCVNwYWNlQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBTcGFjZUNvbnZlcnRlcihzb3VyY2UsIGtlZXBCbGFua0xpbmVzKGNvbnRyYWludHMpKTsKLQotCQlpbnQgd29yZExlbmd0aCA9IGNvbnZlcnRlci5uZXh0V29yZCgpOwotCQlpZiAod29yZExlbmd0aCA9PSAwKSB7IC8vIG9ubHkgc3BhY2VzCi0JCQlpZiAoIWNvbnZlcnRlci5oYXNTcGFjZXMoKSkKLQkJCQlyZXR1cm47IC8vIGVtcHR5Ci0JCQlib29sZWFuIHJlbW92ZVNwYWNlcyA9IGZhbHNlOwotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGFncyBhcmUgb21pdHRlZAotCQkJCUlET01Ob2RlIGVsZW1lbnQgPSAoSURPTU5vZGUpIHBhcmVudDsKLQkJCQlpZiAobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCXJlbW92ZVNwYWNlcyA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQlyZW1vdmVTcGFjZXMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZW1vdmVTcGFjZXMpIHsKLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIDIpIHx8IGNhbkluc2VydEJyZWFrQWZ0ZXIobm9kZSkgfHwgY2FuSW5zZXJ0QnJlYWtCZWZvcmUobm9kZSkpIHsKLQkJCQlTdHJpbmcgc3BhY2VzID0gbnVsbDsKLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsgLy8gbGFzdCBzcGFjZXMKLQkJCQkJLy8gdXNlIHBhcmVudCBpbmRlbnQgZm9yIHRoZSBlbmQgdGFnCi0JCQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKHBhcmVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQl9Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoc3BhY2VzKTsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBzcGFjZXMpOwotCQkJfQotCQkJZWxzZSBpZiAoY2FuUmVtb3ZlSGVhZGluZ1NwYWNlcyhub2RlKSB8fCBjYW5SZW1vdmVUYWlsaW5nU3BhY2VzKG5vZGUpKSB7Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBicmVha1NwYWNlcyA9IG51bGw7Ci0KLQkJCS8vIGZvcm1hdCBoZWFkaW5nIHNwYWNlcwotCQkJYm9vbGVhbiBoYXNTcGFjZXMgPSBjb252ZXJ0ZXIuaGFzU3BhY2VzKCk7Ci0JCQlpZiAobW9kZSA9PSBGT1JNQVRfVEFJTCkgewotCQkJCS8vIGtlZXAgc3BhY2VzIGFzIGlzCi0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgY29udmVydGVyLmdldFNwYWNlQ291bnQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoaGFzU3BhY2VzICYmICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIHdvcmRMZW5ndGggKyAxKSkgfHwgY2FuSW5zZXJ0QnJlYWtCZWZvcmUobm9kZSkpIHsKLQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKGJyZWFrU3BhY2VzKTsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoaGFzU3BhY2VzKSB7Ci0JCQkJCWlmIChjYW5SZW1vdmVIZWFkaW5nU3BhY2VzKG5vZGUpKSB7Ci0JCQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlhZGRXaWR0aChjb250cmFpbnRzLCB3b3JkTGVuZ3RoKTsKLQotCQkJLy8gZm9ybWF0IG1pZGRsZQotCQkJd29yZExlbmd0aCA9IGNvbnZlcnRlci5uZXh0V29yZCgpOwotCQkJd2hpbGUgKHdvcmRMZW5ndGggPiAwKSB7Ci0JCQkJaWYgKG1vZGUgIT0gRk9STUFUX0FMTCkgewotCQkJCQkvLyBrZWVwIHNwYWNlcyBhcyBpcwotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb252ZXJ0ZXIuZ2V0U3BhY2VDb3VudCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgd29yZExlbmd0aCArIDEpKSB7Ci0JCQkJCWlmIChicmVha1NwYWNlcyA9PSBudWxsKQotCQkJCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoYnJlYWtTcGFjZXMpOwotCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJfQotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIHdvcmRMZW5ndGgpOwotCQkJCXdvcmRMZW5ndGggPSBjb252ZXJ0ZXIubmV4dFdvcmQoKTsKLQkJCX0KLQotCQkJLy8gZm9ybWF0IHRhaWxpbmcgc3BhY2VzCi0JCQloYXNTcGFjZXMgPSBjb252ZXJ0ZXIuaGFzU3BhY2VzKCk7Ci0JCQlpZiAobW9kZSA9PSBGT1JNQVRfSEVBRCkgewotCQkJCS8vIGtlZXAgc3BhY2VzIGFzIGlzCi0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgY29udmVydGVyLmdldFNwYWNlQ291bnQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoaGFzU3BhY2VzICYmICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIDIpKSB8fCBjYW5JbnNlcnRCcmVha0FmdGVyKG5vZGUpKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7IC8vIGxhc3QgdGVzdAotCQkJCQkvLyB1c2UgcGFyZW50IGluZGVudCBmb3IgdGhlIGVuZCB0YWcKLQkJCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhwYXJlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGJyZWFrU3BhY2VzID09IG51bGwpCi0JCQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCX0KLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhicmVha1NwYWNlcyk7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGhhc1NwYWNlcykgewotCQkJCQlpZiAoY2FuUmVtb3ZlVGFpbGluZ1NwYWNlcyhub2RlKSkgewotCQkJCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnZlcnRlci5pc01vZGlmaWVkKCkpIHsKLQkJCXNvdXJjZSA9IGNvbnZlcnRlci5nZXRTb3VyY2UoKTsKLQkJCXJlcGxhY2VTb3VyY2UodGV4dC5nZXRNb2RlbCgpLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1NwYWNlQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1NwYWNlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjZmNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9TcGFjZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLQotCi1maW5hbCBjbGFzcyBTcGFjZUNvbnZlcnRlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgc3BhY2VDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgd29yZENvdW50ID0gMDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCXByaXZhdGUgaW50IGxhc3RPZmZzZXQgPSAwOwotCXByaXZhdGUgYm9vbGVhbiBrZWVwQmxhbmtMaW5lcyA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHVibGljIFNwYWNlQ29udmVydGVyKFN0cmluZyBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRoaXMuc291cmNlID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTcGFjZUNvbnZlcnRlcihTdHJpbmcgc291cmNlLCBib29sZWFuIGtlZXBCbGFua0xpbmVzKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5sZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCX0KLQkJdGhpcy5rZWVwQmxhbmtMaW5lcyA9IGtlZXBCbGFua0xpbmVzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXByZXNzU3BhY2VzKCkgewotCQlpZiAodGhpcy5zcGFjZUNvdW50ID09IDApCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLnNwYWNlQ291bnQgPT0gMSAmJiB0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5zdGFydE9mZnNldCkgPT0gJyAnKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKQotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLnN0YXJ0T2Zmc2V0ID4gdGhpcy5sYXN0T2Zmc2V0KSB7Ci0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMubGFzdE9mZnNldCwgdGhpcy5zdGFydE9mZnNldCkpOwotCQl9Ci0KLQkJdGhpcy5idWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJdGhpcy5sYXN0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpCi0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRoaXMubGVuZ3RoID4gdGhpcy5sYXN0T2Zmc2V0KSB7Ci0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMubGFzdE9mZnNldCwgdGhpcy5sZW5ndGgpKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5idWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwYWNlQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLnNwYWNlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3BhY2VzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BhY2VDb3VudCA+IDApOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAodGhpcy5idWZmZXIgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIG51bWJlciBvZiB0aGUgb2xkIGJsYW5rIGxpbmVzIHRvIG5ldyBzcGFjZSBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWVyZ2VCbGFua0xpbmVzKFN0cmluZyBuZXdTcGFjZXMsIFN0cmluZyBvbGRTcGFjZXMpIHsKLQkJaWYgKG5ld1NwYWNlcyA9PSBudWxsIHx8IG5ld1NwYWNlcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ld1NwYWNlczsKLQkJaWYgKG9sZFNwYWNlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ld1NwYWNlczsKLQotCQkvLyBjb3VudCBvbGQgbmV3IGxpbmVzCi0JCWludCBuZXdMaW5lQ291bnQgPSAwOwotCQlpbnQgb2xkTGVuZ3RoID0gb2xkU3BhY2VzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGMgPSBvbGRTcGFjZXMuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCW5ld0xpbmVDb3VudCsrOwotCQkJCWlmIChpICsgMSA8IG9sZExlbmd0aCkgewotCQkJCQljID0gb2xkU3BhY2VzLmNoYXJBdChpICsgMSk7Ci0JCQkJCWlmIChjID09ICdcbicpCi0JCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJbmV3TGluZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5ld0xpbmVDb3VudCA8IDIpCi0JCQlyZXR1cm4gbmV3U3BhY2VzOyAvLyBubyBibGFuayBsaW5lCi0KLQkJLy8gaGVyZSBhc3N1bWluZyBuZXdTcGFjZXMgc3RhcnRzIHdpdGggYSBuZXcgbGluZSBpZiBhbnkKLQkJU3RyaW5nIGRlbGltID0gbnVsbDsKLQkJY2hhciBkID0gbmV3U3BhY2VzLmNoYXJBdCgwKTsKLQkJaWYgKGQgPT0gJ1xyJykgewotCQkJaWYgKG5ld1NwYWNlcy5sZW5ndGgoKSA+IDEgJiYgbmV3U3BhY2VzLmNoYXJBdCgxKSA9PSAnXG4nKQotCQkJCWRlbGltID0gIlxyXG4iOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlkZWxpbSA9ICJcciI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGQgPT0gJ1xuJykKLQkJCQlkZWxpbSA9ICJcbiI7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCXJldHVybiBuZXdTcGFjZXM7IC8vIG5vIG5ldyBsaW5lCi0JCX0KLQotCQluZXdMaW5lQ291bnQtLTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmV3U3BhY2VzLmxlbmd0aCgpICsgbmV3TGluZUNvdW50ICogMik7Ci0JCXdoaWxlIChuZXdMaW5lQ291bnQgPiAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJCW5ld0xpbmVDb3VudC0tOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQobmV3U3BhY2VzKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgbmV4dFdvcmQoKSB7Ci0JCWlmICh0aGlzLmVuZE9mZnNldCA9PSB0aGlzLmxlbmd0aCkgewotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoaXMuZW5kT2Zmc2V0OwotCQkJdGhpcy5zcGFjZUNvdW50ID0gMDsKLQkJCXRoaXMud29yZENvdW50ID0gMDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJdGhpcy5zdGFydE9mZnNldCA9IHRoaXMuZW5kT2Zmc2V0OwotCQlpbnQgaSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCWZvciAoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc291cmNlLmNoYXJBdChpKSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdGhpcy5zcGFjZUNvdW50ID0gaSAtIHRoaXMuc3RhcnRPZmZzZXQ7Ci0KLQkJaW50IHdvcmRPZmZzZXQgPSBpOwotCQlmb3IgKDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc291cmNlLmNoYXJBdChpKSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdGhpcy53b3JkQ291bnQgPSBpIC0gd29yZE9mZnNldDsKLQkJdGhpcy5lbmRPZmZzZXQgPSBpOwotCi0JCXJldHVybiB0aGlzLndvcmRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlU3BhY2VzKFN0cmluZyBzcGFjZXMpIHsKLQkJaW50IHNwYWNlTGVuZ3RoID0gKHNwYWNlcyAhPSBudWxsID8gc3BhY2VzLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZyBvbGRTcGFjZXMgPSBudWxsOwotCQlpZiAoc3BhY2VMZW5ndGggPT0gdGhpcy5zcGFjZUNvdW50KSB7Ci0JCQlpZiAoc3BhY2VMZW5ndGggPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAodGhpcy5zdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJaWYgKHRoaXMuc291cmNlLnN0YXJ0c1dpdGgoc3BhY2VzKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5lbmRPZmZzZXQgPT0gdGhpcy5sZW5ndGgpIHsKLQkJCQlpZiAodGhpcy5zb3VyY2UuZW5kc1dpdGgoc3BhY2VzKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHRleHRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCQkJCW9sZFNwYWNlcyA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0T2Zmc2V0LCB0ZXh0T2Zmc2V0KTsKLQkJCQlpZiAob2xkU3BhY2VzLmVxdWFscyhzcGFjZXMpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMua2VlcEJsYW5rTGluZXMgJiYgdGhpcy5zcGFjZUNvdW50ID4gMCkgewotCQkJaWYgKG9sZFNwYWNlcyA9PSBudWxsKSB7Ci0JCQkJaW50IHRleHRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCQkJCW9sZFNwYWNlcyA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0T2Zmc2V0LCB0ZXh0T2Zmc2V0KTsKLQkJCX0KLQkJCWlmIChvbGRTcGFjZXMgIT0gbnVsbCkgewotCQkJCXNwYWNlcyA9IG1lcmdlQmxhbmtMaW5lcyhzcGFjZXMsIG9sZFNwYWNlcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGhpcy5idWZmZXIgPT0gbnVsbCkKLQkJCXRoaXMuYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGhpcy5zdGFydE9mZnNldCA+IHRoaXMubGFzdE9mZnNldCkgewotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLmxhc3RPZmZzZXQsIHRoaXMuc3RhcnRPZmZzZXQpKTsKLQkJfQotCi0JCWlmIChzcGFjZUxlbmd0aCA+IDApCi0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQoc3BhY2VzKTsKLQotCQl0aGlzLmxhc3RPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdENTU01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExYmU0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdENTU01vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJQ1NTTW9kZWxBZGFwdGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX0lEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIElDU1NNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlBYnN0cmFjdENTU01vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQkvLyBjcmVhdGUgZW1iZWRkZWQgQ1NTIG1vZGVsIChub3QgZm9yIGV4dGVybmFsIENTUykKLQkJaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpOwotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSAoSUNTU01vZGVsKSBiYXNlTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENTU19JRCk7Ci0JCSgoQ1NTTW9kZWxJbXBsKSBuZXdNb2RlbCkuc2V0T3duZXJET01Ob2RlKGdldEVsZW1lbnQoKSk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5U3R5bGVDaGFuZ2VkKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGFyZ2V0OwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IG5vdGlmaWVyLmdldEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3R5bGVMaXN0ZW5lcikgewotCQkJCVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoU3R5bGVMaXN0ZW5lcikgYWRhcHRlcjsKLQkJCQlsaXN0ZW5lci5zdHlsZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayAKLQkgKiAxLiBJZiBhdHRyaWJ1dGVzIG9mIGVsZW1lbnQgaXMgdmFsaWQgKHR5cGUscmVsIC4uLikKLQkgKiAyLiBJZiBjb250ZW50IG1vZGVsIHN1cHBvcnRzIHRoaXMgZWxlbWVudCAvIGF0dHJpYnV0ZSAoZnV0dXJlID8pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChnZXRFbGVtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDUxNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAJCU1hc2FraSBTYWl0b2ggKE1TQUlUT0hAanAuaWJtLmNvbSkKLSAqCQlTZWUgQnVnIDE1MzAwMCAgU3R5bGUgQWRhcHRlcnMgc2hvdWxkIGJlIGxhemllcgotICoJCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMwMDAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlhNTE1vZGVsTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLkRvY3VtZW50U3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuRG9jdW1lbnRUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVMaXN0ZW5lciwgSVN0eWxlU2hlZXRBZGFwdGVyIHsKLQotCS8vIHRoaXMgdmFyaWFibGUgdG8gaG9sZCB0aGUgY2xhc3MgaXMganVzdCBhIFZBSmF2YSB0cmljay4KLQkvLyBpdCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBpbiBWQUphdmEgYnkgbWluaW1pemluZyBjbGFzcyBsb2FkaW5nLgotCXByaXZhdGUgZmluYWwgQ2xhc3MgU3R5bGVTaGVldEFkYXB0ZXJDbGFzcyA9IElTdHlsZVNoZWV0QWRhcHRlci5jbGFzczsKLQlwcml2YXRlIENvbGxlY3Rpb24gc3R5bGVDaGFuZ2VkTm9kZXM7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWwodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbChib29sZWFuIG5vdGlmeSkgewotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSBzdXBlci5jcmVhdGVNb2RlbCgpOwotCQlpZiAobm90aWZ5ICYmIG5ld01vZGVsICE9IG51bGwpIHsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBub3RpZnkgYWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLm1vZGVsUHJvdmlkZWQobmV3TW9kZWwpOwotCQl9Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBnZXRTaGVldCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChTdHlsZVNoZWV0KSBtb2RlbC5nZXREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gU3R5bGVTaGVldEFkYXB0ZXJDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZWQoKSB7Ci0JCUlDU1NNb2RlbCBjdXJyZW50TW9kZWwgPSBnZXRNb2RlbCgpOwotCi0JCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQotCQlzZXRFbGVtZW50KG51bGwpOwotCQlzZXRNb2RlbChudWxsKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJYWRhcHRlci5tb2RlbFJlbGVhc2VkKGN1cnJlbnRNb2RlbCk7Ci0KLQkJaWYgKGN1cnJlbnRNb2RlbCAhPSBudWxsKQotCQkJY3VycmVudE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0JCUlDU1NNb2RlbCBjdXJyZW50TW9kZWwgPSBnZXRNb2RlbCgpOwotCi0JCXNldE1vZGVsKG51bGwpOwotCi0JCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKGN1cnJlbnRNb2RlbCk7Ci0KLQkJaWYgKGN1cnJlbnRNb2RlbCAhPSBudWxsKQotCQkJY3VycmVudE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKiBAcGFyYW0gcmVtb3ZlZCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBhZGRlZCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBtZWRpYSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIG1pZ2h0IHJlbGVhc2VkCi0JCURvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJLy8gdG8gbm90aWZ5IEdFRiB0cmVlIAotCQlpZiAoZG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9ICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVycygpOwotCQkJaWYgKGFkYXB0ZXJzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQkJaWYgKGl0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXQubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVDaGFuZ2VkKHNyY01vZGVsLCByZW1vdmVkLCBhZGRlZCwgbWVkaWEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLwotCi0JCWlmIChzdHlsZUNoYW5nZWROb2RlcyA9PSBudWxsKSB7Ci0JCQlzdHlsZUNoYW5nZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaW50IHJlbW92ZWRTZWxOdW0gPSByZW1vdmVkICE9IG51bGwgPyByZW1vdmVkLmxlbmd0aCA6IDA7Ci0JCQlpbnQgYWRkZWRTZWxOdW0gPSBhZGRlZCAhPSBudWxsID8gYWRkZWQubGVuZ3RoIDogMDsKLQotCQkJTm9kZUl0ZXJhdG9yIGl0ZXIgPSAoKERvY3VtZW50VHJhdmVyc2FsKSBkb2MpLmNyZWF0ZU5vZGVJdGVyYXRvcihkb2MsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCBudWxsLCB0cnVlKTsKLQkJCU5vZGUgbm9kZTsKLQkJCXdoaWxlICgobm9kZSA9IGl0ZXIubmV4dE5vZGUoKSkgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudCBlbG0gPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCQlpbnQgaTsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJlbW92ZWRTZWxOdW0gJiYgIW1hdGNoOyBpKyspIHsKLQkJCQkJCW1hdGNoID0gcmVtb3ZlZFtpXS5tYXRjaChlbG0sIG51bGwpOwotCQkJCQl9Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBhZGRlZFNlbE51bSAmJiAhbWF0Y2g7IGkrKykgewotCQkJCQkJbWF0Y2ggPSBhZGRlZFtpXS5tYXRjaChlbG0sIG51bGwpOwotCQkJCQl9Ci0JCQkJCWlmIChtYXRjaCkgewotCQkJCQkJaWYgKCFzdHlsZUNoYW5nZWROb2Rlcy5jb250YWlucyhlbG0pKQotCQkJCQkJCXN0eWxlQ2hhbmdlZE5vZGVzLmFkZChlbG0pOwotCQkJCQkJLy8gbm90aWZ5U3R5bGVDaGFuZ2VkKGVsbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJLy8gRG9jdW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgRG9jdW1lbnRUcmF2ZXJzYWwuLi4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsIGNvbS5pYm0uc2VkLmNzcy5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXRFbGVtZW50KCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Nb2RlbCBtb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBtb2RlbC5nZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGJlZm9yZSB1cGRhdGluZywgYWxsIHN1Yi1tb2RlbHMgc2hvdWxkIGJlIGxvYWRlZCEKLQkJRG9jdW1lbnRTdHlsZSBkb2N1bWVudCA9IChEb2N1bWVudFN0eWxlKSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlTdHlsZVNoZWV0TGlzdCBzdHlsZXMgPSBkb2N1bWVudC5nZXRTdHlsZVNoZWV0cygpOwotCQlpZiAoc3R5bGVzICE9IG51bGwpIHsKLQkJCWludCBuID0gc3R5bGVzLmdldExlbmd0aCgpOwotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0IHNoZWV0ID0gc3R5bGVzLml0ZW0oaSk7Ci0JCQkJaWYgKHNoZWV0IGluc3RhbmNlb2YgSUNTU05vZGUpCi0JCQkJCXRyYXYuYXBwbHkoKElDU1NOb2RlKSBzaGVldCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmbGFzaCBzdHlsZSBjaGFuZ2VkIGV2ZW50cwotCQlpZiAoc3R5bGVDaGFuZ2VkTm9kZXMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBzdHlsZUNoYW5nZWROb2Rlcy50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgZWxlbWVudHMgIT0gbnVsbCAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQkJbm90aWZ5U3R5bGVDaGFuZ2VkKChFbGVtZW50KSBlbGVtZW50c1tpXSk7Ci0JCQlzdHlsZUNoYW5nZWROb2Rlcy5jbGVhcigpOwotCQl9Ci0KLQkJLy8gdG8gbm90aWZ5IEdFRiB0cmVlIAotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlcnMoKTsKLQkJCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJCWlmIChpdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlVXBkYXRlKHNyY01vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlub3RpZmllci5wcm9wZXJ0eUNoYW5nZWQobm9kZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NzJhZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbi5DU1NQcm9wZXJ0eUNvbnRleHQ7Ci0KLS8qKgotICovCi1jbGFzcyBDU1NRdWVyeUNvbnRleHQgZXh0ZW5kcyBDU1NQcm9wZXJ0eUNvbnRleHQgewotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5Q29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlDb250ZXh0KElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJc3VwZXIoZGVjbCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUZ1bGwoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gZlByb3BlcnRpZXMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQotCQkJaWYgKHZhbCBpbnN0YW5jZW9mIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKSB7Ci0JCQkJSUNTU1N0eWxlRGVjbEl0ZW0gZGVjbEl0ZW0gPSAoKENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKSB2YWwpLmdldERlY2xJdGVtKCk7Ci0JCQkJaWYgKGRlY2xJdGVtLmdldExlbmd0aCgpIDw9IDApIHsKLQkJCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbVRvUmVtb3ZlID0gZGVjbC5nZXREZWNsSXRlbU5vZGUoa2V5LnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaXRlbVRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQkJCWRlY2wucmVtb3ZlRGVjbEl0ZW1Ob2RlKGl0ZW1Ub1JlbW92ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlY2wuc2V0RGVjbEl0ZW1Ob2RlKGRlY2xJdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSAodmFsIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSA/ICgoSUNTU1ZhbHVlKSB2YWwpLmdldENTU1ZhbHVlVGV4dCgpIDogdmFsLnRvU3RyaW5nKCk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW1Ub1JlbW92ZSA9IGRlY2wuZ2V0RGVjbEl0ZW1Ob2RlKGtleS50b1N0cmluZygpKTsKLQkJCQkJaWYgKGl0ZW1Ub1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJCQlkZWNsLnJlbW92ZURlY2xJdGVtTm9kZShpdGVtVG9SZW1vdmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWNsLnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBpbXBvcnRhbnQsIGludCBzcGVjaWZpY2l0eSkgewotCQlPYmplY3QgY3VycmVudCA9IGZQcm9wZXJ0aWVzLmdldChwcm9wTmFtZSk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudCBpbnN0YW5jZW9mIENTU1F1ZXJ5VmFsdWVEYXRhKSB7Ci0JCQlDU1NRdWVyeVZhbHVlRGF0YSBjdXJyZW50VmFsdWUgPSAoQ1NTUXVlcnlWYWx1ZURhdGEpIGN1cnJlbnQ7Ci0JCQlpZiAoKCFpbXBvcnRhbnQgJiYgY3VycmVudFZhbHVlLmltcG9ydGFudCkgfHwgKGN1cnJlbnRWYWx1ZS5nZXRTcGVjaWZpY2l0eSgpID4gc3BlY2lmaWNpdHkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG92ZXJyaWRlV2l0aEV4cGFuZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NMaW5rQ29udmVydGVyIGNvbnYgPSBuZXcgQ1NTTGlua0NvbnZlcnRlcihkZWNsLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQotCQlpbnQgblByb3BlcnRpZXMgPSBkZWNsLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyBpKyspIHsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGRlY2wuaXRlbShpKTsKLQkJCWlmIChwcm9wTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb3BOID0gcHJvcE5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKHByb3BOLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YocHJvcE4pOwotCQkJCQlTdHJpbmcgcHJpb3JpdHkgPSBkZWNsLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcE5hbWUpOwotCQkJCQlib29sZWFuIGltcG9ydGFudCA9IHByaW9yaXR5ICE9IG51bGwgJiYgcHJpb3JpdHkubGVuZ3RoKCkgPiAwOwotCQkJCQlpZiAocHJvcCAhPSBudWxsICYmIHByb3AuaXNTaG9ydGhhbmQoKSkgewotCQkJCQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQkJCQkJQ1NTUXVlcnlDb250ZXh0IGNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCQkJCQlleHBhbmRUb0xlYWYocHJvcCwgZGVjbC5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKSwgY29udGV4dCk7Ci0KLQkJCQkJCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBjb250ZXh0LnByb3BlcnRpZXMoKTsKLQkJCQkJCXdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCQkJcHJvcE4gPSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoY2hlY2socHJvcE4sIGltcG9ydGFudCwgc3BlY2lmaWNpdHkpKSB7Ci0JCQkJCQkJCWZQcm9wZXJ0aWVzLnB1dChwcm9wTiwgbmV3IENTU1F1ZXJ5VmFsdWVEYXRhKGNvbnYudG9BYnNvbHV0ZShjb250ZXh0LmdldChwcm9wTikpLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGNoZWNrKHByb3BOLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSkgewotCQkJCQkJCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBkZWNsLmdldERlY2xJdGVtTm9kZShwcm9wTmFtZSkuY2xvbmVOb2RlKHRydWUpOwotCQkJCQkJCWludCBuVmFsdWVzID0gZGVjbEl0ZW0uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuVmFsdWVzOyBqKyspIHsKLQkJCQkJCQkJY29udi50b0Fic29sdXRlKGRlY2xJdGVtLml0ZW0oaikpOwotCQkJCQkJCX0KLQkJCQkJCQlkZWNsSXRlbS5zZXRQcmlvcml0eShudWxsKTsKLQkJCQkJCQlmUHJvcGVydGllcy5wdXQocHJvcE4sIG5ldyBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YShkZWNsSXRlbSwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeURlY2xhcmF0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTU2ZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEgZXh0ZW5kcyBDU1NRdWVyeVZhbHVlRGF0YSB7Ci0KLQotCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtOwotCi0JcHVibGljIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKElDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtLCBib29sZWFuIGltcCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCXN1cGVyKG51bGwsIGltcCwgc3BlY2lmaWNpdHkpOwotCQl0aGlzLmRlY2xJdGVtID0gZGVjbEl0ZW07Ci0JfQotCi0JLyoqCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW0oKSB7Ci0JCXJldHVybiBkZWNsSXRlbTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiBkZWNsSXRlbSAhPSBudWxsKSB7Ci0JCQl2YWx1ZSA9IGRlY2xJdGVtLmdldENTU1ZhbHVlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVRyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmNmI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5FbGVtZW50Q1NTSW5saW5lU3R5bGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTUXVlcnlUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyBwc2V1ZG9OYW1lOwotCXByaXZhdGUgQ1NTUXVlcnlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCUlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQl0cnkgewotCQkJSUNTU1N0eWxlRGVjbGFyYXRpb24gaW5saW5lU3R5bGUgPSAoSUNTU1N0eWxlRGVjbGFyYXRpb24pICgoRWxlbWVudENTU0lubGluZVN0eWxlKSBlbGVtZW50KS5nZXRTdHlsZSgpOwotCQkJaWYgKGlubGluZVN0eWxlICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQkJCWNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCQkJfQotCQkJCWNvbnRleHQub3ZlcnJpZGVXaXRoRXhwYW5kKGlubGluZVN0eWxlLCAxMDAwMCk7Ci0JCQkJLy8gc3R5bGUgYXR0cmlidXRlJ3Mgc3BlY2lmaWNpdHkgaXMgMTAwIChpbiBDU1MyIHNwZWMuKSBhbmQKLQkJCQkvLyBvdXIgaW1wbGVtZW50IHVzZSAxMDAgYXMgYmFzZSBudW1iZXIgKHNlZSBDU1NTZWxlY3Rvci5qYXZhKQotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGVsZW1lbnQgaXMgbm90IEVsZW1lbnRDU1NJbmxpbmVTdHlsZSA/Pz8KLQkJfQotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCWRlY2wgPSBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oKTsKLQkJY29udGV4dC5hcHBseUZ1bGwoZGVjbCk7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBvdmVyd3JpdGVEZWNsYXJhdGlvbihJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJaWYgKGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCWNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCWNvbnRleHQub3ZlcnJpZGVXaXRoRXhwYW5kKGQsIHNwZWNpZmljaXR5KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkvLyBzdHlsZSBydWxlCi0JCQlJQ1NTU3R5bGVSdWxlIHN0eWxlID0gKElDU1NTdHlsZVJ1bGUpIG5vZGU7Ci0JCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBzdHlsZS5nZXRTZWxlY3RvcnMoKTsKLQkJCWludCBuU2VsZWN0b3JzID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJCWludCBtYXhTcGVjaWZpY2l0eSA9IC0xOwotCQkJZm9yIChpbnQgaVNlbGVjdG9yID0gMDsgaVNlbGVjdG9yIDwgblNlbGVjdG9yczsgaVNlbGVjdG9yKyspIHsKLQkJCQkvLyBDaGVjayBlYWNoIFNlbGVjdG9yIExpc3RzCi0JCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbGlzdC5nZXRTZWxlY3RvcihpU2VsZWN0b3IpOwotCQkJCWludCBzcGVjaWZpY2l0eSA9IHNlbGVjdG9yLmdldFNwZWNpZmljaXR5KCk7Ci0JCQkJaWYgKG1heFNwZWNpZmljaXR5IDwgc3BlY2lmaWNpdHkgJiYgc2VsZWN0b3IubWF0Y2goZWxlbWVudCwgcHNldWRvTmFtZSkpIHsKLQkJCQkJbWF4U3BlY2lmaWNpdHkgPSBzcGVjaWZpY2l0eTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWF4U3BlY2lmaWNpdHkgPj0gMCkgewotCQkJCS8vIGFwcGx5IHRoaXMgc3R5bGUgdG8gdGhlIGVsZW1lbnQKLQkJCQlvdmVyd3JpdGVEZWNsYXJhdGlvbigoSUNTU1N0eWxlRGVjbGFyYXRpb24pIHN0eWxlLmdldFN0eWxlKCksIG1heFNwZWNpZmljaXR5KTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQl9Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q29udGV4dCgpIHsKLQkJY29udGV4dCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHNldWRvTmFtZSA9IHBzZXVkb05hbWU7Ci0JCXJlc2V0Q29udGV4dCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVZhbHVlRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlWYWx1ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkNzRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVZhbHVlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbi5WYWx1ZURhdGE7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgQ1NTUXVlcnlWYWx1ZURhdGEgZXh0ZW5kcyBWYWx1ZURhdGEgewotCi0JcHJpdmF0ZSBpbnQgc3BlY2lmaWNpdHk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlWYWx1ZURhdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5VmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wKSB7Ci0JCXN1cGVyKHZhbCwgaW1wKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlWYWx1ZURhdGEoU3RyaW5nIHZhbCwgYm9vbGVhbiBpbXAsIGludCBzcGVjaWZpY2l0eSkgewotCQlzdXBlcih2YWwsIGltcCk7Ci0JCXRoaXMuc3BlY2lmaWNpdHkgPSBzcGVjaWZpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0U3BlY2lmaWNpdHkoKSB7Ci0JCXJldHVybiBzcGVjaWZpY2l0eTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTERvY3VtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTERvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmNlYjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxEb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0NsYXNzVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJU3R5bGVTaGVldExpc3RBZGFwdGVyLCBTdHlsZVNoZWV0TGlzdCB7Ci0KLQlwcml2YXRlIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIFZlY3RvciBzdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQlwcml2YXRlIFZlY3RvciBvbGRTdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCUhUTUxEb2N1bWVudEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN0eWxlU2hlZXQoRWxlbWVudCBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWJvb2xlYW4gaXNDb250YWluZXIgPSBmYWxzZTsKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBUKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKSB8fCAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSAmJiBlbGVtZW50LmlzQ29udGFpbmVyKCkpKSB7Ci0JCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgPT0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpIHsKLQkJCQkvLyBUaGlzIGNvbmRpdGlvbiBpcyB0b28gc2V2ZXJlLCBhY3R1YWxseSBkbyBub3Qgd29yayBmb3IgSlNGIHRlbXBsYXRlLgotCQkJCS8vIEJ1dCBhYm92ZSAoISBnbG9iYWxUYWcoKSAmJiBpc0NvbnRhaW5lcigpKSBjb3ZlciBKU0YgdGVtcGxhdGUgKyB0cGwgdGVtcGxhdGUKLQkJCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXRhZ05hbWUgPSAoKEVsZW1lbnQpIHBhcmVudCkuZ2V0VGFnTmFtZSgpOwotCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSkgewotCQkJCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkpIHsKLQkJCQkvLyB0YWdsaWIgaHRtbCB0YWcKLQkJCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gZWxlbWVudDsKLQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpIHsKLQkJCQkJdGhpcy5zdHlsZUFkYXB0ZXJzLmFkZEVsZW1lbnQoYWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc0NvbnRhaW5lcikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IGVsZW1lbnQ7Ci0JCQlpZiAobm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCQlub3RpZmllci5hZGRBZGFwdGVyKHRoaXMpOwotCQkJfQotCQkJZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljb250aW51ZTsKLQkJCQlhZGRTdHlsZVNoZWV0KChFbGVtZW50KSBjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoKSB7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBiYWNrdXAgb2xkIGFkYXB0ZXJzIHRvIGJlIHJlbGVhc2VkIG9uIHVwZGF0aW5nIGluIGdldFN0eWxlU2hlZXRzKCkKLQkJdGhpcy5vbGRTdHlsZUFkYXB0ZXJzID0gdGhpcy5zdHlsZUFkYXB0ZXJzOwotCQkvLyBpbnZhbGlkYXRlIHRoZSBsaXN0Ci0JCXRoaXMuc3R5bGVBZGFwdGVycyA9IG51bGw7Ci0KLQkJbm90aWZ5U3R5bGVTaGVldHNDaGFuZ2VkKHRoaXMuZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRDbGFzc2VzKCkgewotCQlTdHlsZVNoZWV0TGlzdCBzaGVldExpc3QgPSBnZXRTdHlsZVNoZWV0cygpOwotCQlpbnQgblNoZWV0cyA9IHNoZWV0TGlzdC5nZXRMZW5ndGgoKTsKLQotCQlmaW5hbCBBcnJheUxpc3QgY2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlDU1NDbGFzc1RyYXZlcnNlciB0cmF2ZXJzZXIgPSBuZXcgQ1NTQ2xhc3NUcmF2ZXJzZXIoKTsKLQkJdHJhdmVyc2VyLnNldFRyYXZlcnNlSW1wb3J0ZWQodHJ1ZSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2hlZXRzOyBpKyspIHsKLQkJCW9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQgc2hlZXQgPSBzaGVldExpc3QuaXRlbShpKTsKLQkJCWlmIChzaGVldCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJdHJhdmVyc2VyLmFwcGx5KChJQ1NTTm9kZSkgc2hlZXQpOwotCQkJfQotCQl9Ci0JCWNsYXNzZXMuYWRkQWxsKHRyYXZlcnNlci5nZXRDbGFzc05hbWVzKCkpOwotCi0JCXJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0JCQlpbnQgaSA9IDA7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCQlyZXR1cm4gaSA8IGNsYXNzZXMuc2l6ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJCXJldHVybiBjbGFzc2VzLmdldChpKyspOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEFkYXB0ZXJzKCkgewotCQlWZWN0b3IgdmFsaWRBZGFwdGVycyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gdGhpcy5zdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIgJiYgKChBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmlzVmFsaWRBdHRyaWJ1dGUoKSkgewotCQkJCQl2YWxpZEFkYXB0ZXJzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWRBZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFZhbGlkQWRhcHRlcnMoKS5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCVN0eWxlU2hlZXRMaXN0IHNzbCA9IGdldFN0eWxlU2hlZXRzKCk7Ci0JCWludCBudW1TdHlsZXMgPSBzc2wuZ2V0TGVuZ3RoKCk7Ci0KLQkJQ1NTUXVlcnlUcmF2ZXJzZXIgcXVlcnkgPSBuZXcgQ1NTUXVlcnlUcmF2ZXJzZXIoKTsKLQkJcXVlcnkuc2V0VHJhdmVyc2VJbXBvcnRlZCh0cnVlKTsKLQkJcXVlcnkuc2V0VHJhdmVyc2VJbXBvcnRGaXJzdCh0cnVlKTsKLQkJcXVlcnkuc2V0RWxlbWVudChlbGVtZW50LCBwc2V1ZG9OYW1lKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVN0eWxlczsgaSsrKSB7Ci0JCQkvLyBsb29wIGZvciBzdHlsZXMgKDxzdHlsZT4gYW5kIDxsaW5rPikKLQkJCW9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQgc3MgPSBzc2wuaXRlbShpKTsKLQotCQkJdHJ5IHsKLQkJCQlxdWVyeS5hcHBseSgoSUNTU05vZGUpIHNzKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBJIGNhbiBoYW5kbGUgb25seSBDU1Mgc3R5bGUKLQkJCX0KLQkJfQotCi0JCXJldHVybiBxdWVyeS5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0TGlzdCBnZXRTdHlsZVNoZWV0cygpIHsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQl0aGlzLnN0eWxlQWRhcHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSB0aGlzLmRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWFkZFN0eWxlU2hlZXQoKEVsZW1lbnQpIGNoaWxkKTsKLQkJCX0KLQotCQkJcmVtb3ZlT2xkU3R5bGVTaGVldHMoKTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgdmFsaWRBZGFwdGVycyA9IGdldFZhbGlkQWRhcHRlcnMoKTsKLQotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHZhbGlkQWRhcHRlcnMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0eWxlU2hlZXQgc2hlZXQgPSAoKElTdHlsZVNoZWV0QWRhcHRlcikgdmFsaWRBZGFwdGVycy5nZXQoaW5kZXgpKS5nZXRTaGVldCgpOwotCQlpZiAoc2hlZXQgPT0gbnVsbCkgey8vIGZvciBMSU5LIGVsZW1lbnQgd2hvc2UgbGluayBpcyBicm9rZW4KLQkJCUlDU1NNb2RlbCBtb2RlbCA9ICgoQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlcikgdmFsaWRBZGFwdGVycy5nZXQoaW5kZXgpKS5jcmVhdGVNb2RlbCgpOwotCQkJc2hlZXQgPSAoKG1vZGVsICE9IG51bGwpID8gKFN0eWxlU2hlZXQpIG1vZGVsLmdldERvY3VtZW50KCkgOiBudWxsKTsKLQkJfQotCQlyZXR1cm4gc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQljYXNlIElOb2RlTm90aWZpZXIuQUREIDoKLQkJCQlub2RlID0gKE5vZGUpIG5ld1ZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRSA6Ci0JCQkJbm9kZSA9IChOb2RlKSBvbGRWYWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCW5vZGUgPSAoTm9kZSkgbm90aWZpZXI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybjsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSkgewotCQkJCXJlZnJlc2hBZGFwdGVycygpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkspIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpIHx8ICghZWxlbWVudC5pc0dsb2JhbFRhZygpICYmIGVsZW1lbnQuaXNDb250YWluZXIoKSkpIHsKLQkJCQljaGlsZFJlcGxhY2VkKCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpKSB7Ci0JCQkJcmVmcmVzaEFkYXB0ZXJzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpKSB7Ci0JCQkJCS8vIHRhZ2xpYiBodG1sIHRhZwotCQkJCQljaGlsZFJlcGxhY2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVsb2FkIExJTksgLyBAaW1wb3J0IGlmIEJBU0UgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQWRhcHRlcnMoKSB7Ci0JCUl0ZXJhdG9yIGlBZGFwdGVyID0gdGhpcy5zdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpQWRhcHRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gaUFkYXB0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBMaW5rRWxlbWVudEFkYXB0ZXIpIHsKLQkJCQkoKExpbmtFbGVtZW50QWRhcHRlcikgYWRhcHRlcikucmVmcmVzaFNoZWV0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3R5bGVFbGVtZW50QWRhcHRlcikgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9ICgoU3R5bGVFbGVtZW50QWRhcHRlcikgYWRhcHRlcikuZ2V0TW9kZWwoKTsKLQkJCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQkJCXRyYXYuYXBwbHkobW9kZWwpOwotCQkJCUl0ZXJhdG9yIGlSdWxlID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGlSdWxlLmhhc05leHQoKSkgewotCQkJCQlJQ1NTSW1wb3J0UnVsZSBydWxlID0gKElDU1NJbXBvcnRSdWxlKSBpUnVsZS5uZXh0KCk7Ci0JCQkJCXJ1bGUucmVmcmVzaFN0eWxlU2hlZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5U3R5bGVTaGVldHNDaGFuZ2VkKERvY3VtZW50IHRhcmdldCkgewotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRhcmdldDsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSBub3RpZmllci5nZXRBZGFwdGVycygpOwotCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0eWxlTGlzdGVuZXIpIHsKLQkJCQlTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKFN0eWxlTGlzdGVuZXIpIGFkYXB0ZXI7Ci0JCQkJbGlzdGVuZXIuc3R5bGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVsZWFzZU9sZFN0eWxlU2hlZXRzKCkgewotCQlpZiAodGhpcy5vbGRTdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gdGhpcy5vbGRTdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlTdHlsZVNoZWV0QWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vIGlmIHRoZSBzYW1lIGFkYXB0ZXIgaXMgaW4gdGhlIGN1cnJlbnQgbGlzdCwKLQkJCS8vIGRvIG5vdCByZWxlYXNlCi0JCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzICE9IG51bGwgJiYgdGhpcy5zdHlsZUFkYXB0ZXJzLmNvbnRhaW5zKGFkYXB0ZXIpKQotCQkJCWNvbnRpbnVlOwotCQkJYWRhcHRlci5yZWxlYXNlZCgpOwotCQl9Ci0JCXRoaXMub2xkU3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCkgewotCQlyZWxlYXNlT2xkU3R5bGVTaGVldHMoKTsKLQotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gdGhpcy5zdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlTdHlsZVNoZWV0QWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLnJlbGVhc2VkKCk7Ci0JCX0KLQkJdGhpcy5zdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlT2xkU3R5bGVTaGVldHMoKSB7Ci0JCWlmICh0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLm9sZFN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVN0eWxlU2hlZXRBZGFwdGVyIGFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgdGhlIHNhbWUgYWRhcHRlciBpcyBpbiB0aGUgY3VycmVudCBsaXN0LAotCQkJLy8gZG8gbm90IHJlbGVhc2UKLQkJCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgIT0gbnVsbCAmJiB0aGlzLnN0eWxlQWRhcHRlcnMuY29udGFpbnMoYWRhcHRlcikpCi0JCQkJY29udGludWU7Ci0JCQlhZGFwdGVyLnJlbW92ZWQoKTsKLQkJfQotCQl0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTM0N2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBpbXBsZW1lbnRzIElTdHlsZVNlbGVjdG9yQWRhcHRlciB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBPYmplY3QgdG9NYXRjaCA9IElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzczsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IHRvTWF0Y2g7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpOwotCQlTdHJpbmcga2V5OwotCi0JCS8vIFBzZXVkb05hbWUKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAocHNldWRvTmFtZSA9PSBudWxsIHx8IHBzZXVkb05hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAocHNldWRvTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlbGVjdG9yLmdldFBzZXVkb05hbWUoaSkpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpIDwgMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayB0YWcgbmFtZQotCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkgJiYgIWVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHNlbGVjdG9yLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWQKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mSURzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKGkgPiAxKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIXNlbGVjdG9yLmdldElEKDApLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNsYXNzCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoa2V5KTsKLQkJCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlpZiAoc2VsZWN0b3IuZ2V0Q2xhc3MoaSkuZXF1YWxzKHRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghb2spCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGF0dHJpYnV0ZXMKLQkJZm9yIChpID0gc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VsZWN0b3IuZ2V0QXR0cmlidXRlKGkpLCAiPX58IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJaW50IGNvdW50VG9rZW5zID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAoY291bnRUb2tlbnMgPiAwKSB7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNvdW50VG9rZW5zID4gMSkgewotCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCI9IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdUb2tlbml6ZXIgYXR0clZhbHVlVG9rZW5pemVyID0gbnVsbDsKLQkJCQkJaWYgKHRva2VuLmVxdWFscygifiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRva2VuLmVxdWFscygifCIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUsICItIik7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChhdHRyVmFsdWVUb2tlbml6ZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJCQkJd2hpbGUgKGF0dHJWYWx1ZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJaWYgKHRva2VuLmVxdWFscyhhdHRyVmFsdWVUb2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQkJCQlvayA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIW9rKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoIWF0dHJWYWx1ZS5lcXVhbHModG9rZW4pKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjZmYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlOwotCXByaXZhdGUgT2JqZWN0IHRvTWF0Y2ggPSBJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFByb3ZpZGVBZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogSXQgbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUgSU5vZGVBZGFwdGVyICAuLi4KLQkgKiBidXQgaW4gZ2VuZXJhbCBpdCBpcyByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZSBzdGF0ZWxlc3MsIAotCSAqIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJYWRhcHRlciA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIGlzRmFjdG9yeUZvclR5cGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSB0b01hdGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9MaW5rRWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0xpbmtFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGYzNGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0xpbmtFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDU1NfSUQgPSBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTOwotCXByaXZhdGUgYm9vbGVhbiByZXBsYWNlTW9kZWwgPSB0cnVlOwotCS8vIHRoaXMgdmFyaWFibGUgdG8gaG9sZCB0aGUgY2xhc3MgaXMganVzdCBhIFZBSmF2YSB0cmljay4KLQkvLyBpdCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBpbiBWQUphdmEgYnkgbWluaW1pemluZyBjbGFzcyBsb2FkaW5nLgotCXByaXZhdGUgZmluYWwgQ2xhc3MgTW9kZWxQcm92aWRlQWRhcHRlckNsYXNzID0gSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgTGlua0VsZW1lbnRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRyUmVwbGFjZWQoKSB7Ci0JCXRoaXMucmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlIVE1MRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoSFRNTERvY3VtZW50QWRhcHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYWRhcHRlci5jaGlsZFJlcGxhY2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJLy8gY3JlYXRlIHBoYW50b20oYnJva2VuIGxpbmspIGV4dGVybmFsIENTUyBtb2RlbAotCQlpZiAoZ2V0RWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwgPSAoKElET01Ob2RlKSBnZXRFbGVtZW50KCkpLmdldE1vZGVsKCk7Ci0JCUlDU1NNb2RlbCBuZXdNb2RlbCA9IChJQ1NTTW9kZWwpIGJhc2VNb2RlbC5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ1NTX0lEKTsKLQotCQkvLyBjYWxjdWxhdGUgYmFzZSBsb2NhdGlvbiBhbmQgc2V0Ci0JCS8vIGdldCByZXNvbHZlciBpbiBNb2RlbAotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGJhc2VNb2RlbC5nZXRSZXNvbHZlcigpOwotCi0JCS8vIHJlc29sdmUgdG8gYWJzb2x1dGUgdXJsIDogdGhpcyBuZWVkIG5vdCBleGFjdCBsb2NhdGlvbiBvZiBjc3MgZmlsZS4gSXQgaXMgaW1wb3J0YW50IHRoYXQgYWJzdXJsIGlzIG5vdCBudWxsLiAKLQkJU3RyaW5nIHJlZiA9IGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUob3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYpOwotCQlTdHJpbmcgYWJzdXJsID0gKHJlc29sdmVyICE9IG51bGwgJiYgcmVmICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShyZWYsIHRydWUpIDogbnVsbDsKLQkJaWYgKChhYnN1cmwgPT0gbnVsbCkgfHwgKGFic3VybC5sZW5ndGgoKSA9PSAwKSkgewotCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJVVJMSGVscGVyIGhlbHBlciA9IG5ldyBVUkxIZWxwZXIoYmFzZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkpOwotCQkJYWJzdXJsID0gaGVscGVyLnRvQWJzb2x1dGUocmVmID09IG51bGwgPyAiIiA6IHJlZik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgoYWJzdXJsID09IG51bGwpIHx8IChhYnN1cmwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWFic3VybCA9IHJlZjsKLQkJfQotCQlpZiAoYWJzdXJsID09IG51bGwpIHsKLQkJCWFic3VybCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCQluZXdNb2RlbC5zZXRCYXNlTG9jYXRpb24oYWJzdXJsKTsKLQotCQkvLyBzZXQgc3R5bGUgbGlzdGVuZXIKLQkJbmV3TW9kZWwuYWRkU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAodGhpcy5yZXBsYWNlTW9kZWwpIHsKLQkJCUlDU1NNb2RlbCBvbGRNb2RlbCA9IG1vZGVsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IHJldHJpZXZlTW9kZWwoKTsKLQkJCQlzZXRNb2RlbChtb2RlbCk7Ci0KLQkJCQkvLyByZWxlYXNlIG9sZCBtb2RlbAotCQkJCWlmIChvbGRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKG9sZE1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkKLQkJCQkJb2xkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkKLQkJCXJldHVybjsKLQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJyZWwiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJCW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpIHx8IC8vJE5PTi1OTFMtMSQJCi0JCQkJCW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaHJlZiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJYXR0clJlcGxhY2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoU2hlZXQoKSB7Ci0JCWlmICghcmVwbGFjZU1vZGVsKSB7Ci0JCQlyZW1vdmVkKCk7Ci0JCQlyZXBsYWNlTW9kZWwgPSB0cnVlOwotCi0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXRFbGVtZW50KCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZS5ub3RpZnkoSU5vZGVOb3RpZmllci5DSEFOR0UsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVOb2RlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGKSwgbnVsbCwgbnVsbCwgbm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VkKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCi0JCQkJLy8gc2V0IGVsZW1lbnQgdG8gbnVsbCBmaXJzdCwgc28gdGhhdCBubyBkb2N1bWVudCB3aWRlIHVwZGF0ZXMKLQkJCQlzZXRFbGVtZW50KG51bGwpOwotCQkJCXNldE1vZGVsKG51bGwpOwotCi0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5tb2RlbFJlbGVhc2VkKG1vZGVsKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXRoaXMucmVwbGFjZU1vZGVsID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlzZXRNb2RlbChudWxsKTsKLQotCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKG1vZGVsKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXRoaXMucmVwbGFjZU1vZGVsID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF0dHJpYnV0ZSgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgcmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJlbCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlbCA9PSBudWxsIHx8ICFyZWwuZXF1YWxzSWdub3JlQ2FzZSgic3R5bGVzaGVldCIpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHR5cGUgIT0gbnVsbCAmJiAhdHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0L2NzcyIpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGhyZWYgPT0gbnVsbCB8fCBocmVmLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIHJldHJpZXZlTW9kZWwoKSB7Ci0JCWlmICghaXNWYWxpZEF0dHJpYnV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG51bGwsYXR0ciBjaGVjayBpcyBkb25lIGluIGlzVmFsaWRBdHRyaWJ1dGUoKQotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCVN0cmluZyBocmVmID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsvLyROT04tTkxTLTEkCi0KLQkJSURPTU1vZGVsIGJhc2VNb2RlbCA9ICgoSURPTU5vZGUpIGVsZW1lbnQpLmdldE1vZGVsKCk7Ci0JCWlmIChiYXNlTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgaWQgPSBiYXNlTW9kZWwuZ2V0SWQoKTsKLQkJaWYgKCEoaWQgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vU3RyaW5nIGJhc2UgPSAoU3RyaW5nKWlkOwotCi0JCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUHJvdmlkZUFkYXB0ZXJDbGFzcyk7Ci0KLQkJVVJMTW9kZWxQcm92aWRlciBwcm92aWRlciA9IG5ldyBVUkxNb2RlbFByb3ZpZGVyKCk7Ci0JCXRyeSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gcHJvdmlkZXIuZ2V0TW9kZWxGb3JSZWFkKGJhc2VNb2RlbCwgaHJlZik7Ci0JCQlpZiAobmV3TW9kZWwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICghKG5ld01vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSkgewotCQkJCW5ld01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBub3RpZnkgYWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLm1vZGVsUHJvdmlkZWQobmV3TW9kZWwpOwotCi0JCQlyZXR1cm4gKElDU1NNb2RlbCkgbmV3TW9kZWw7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJSUNTU01vZGVsIG9sZE1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gb2xkTW9kZWwpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLnNldE1vZGVsKG1vZGVsKTsKLQkJaWYgKHRoaXMucmVwbGFjZU1vZGVsKQotCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQlvbGRNb2RlbC5yZW1vdmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMThkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENTU19DT05URU5UX1RZUEUgPSAidGV4dC9jc3MiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0eWxlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJSFRNTERvY3VtZW50QWRhcHRlciBuZXdBZGFwdGVyID0gbmV3IEhUTUxEb2N1bWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RG9jdW1lbnQoKERvY3VtZW50KSBub2RlKTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQlpZiAoIWlzVGFnQXZhaWxhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkvLwkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJLy8JCWlmICh0eXBlICE9IG51bGwgJiYgISB0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQ1NTX0NPTlRFTlRfVFlQRSkpIHsKLQkJCS8vCQkJcmV0dXJuIG51bGw7Ci0JCQkvLwkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlTdHlsZUVsZW1lbnRBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVFbGVtZW50QWRhcHRlcigpOwotCQkJbmV3QWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJbm90aWZpZXIuYWRkQWRhcHRlcihuZXdBZGFwdGVyKTsKLQkJCXJldHVybiBuZXdBZGFwdGVyOwotCQl9Ci0JCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykpIHsKLQkJCWlmICghaXNUYWdBdmFpbGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlMaW5rRWxlbWVudEFkYXB0ZXIgbmV3QWRhcHRlciA9IG5ldyBMaW5rRWxlbWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCi0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQotCQlpZiAoIWlzQXR0cmlidXRlQXZhaWxhYmxlKGVsZW1lbnQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHlsZUF0dHJBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVBdHRyQWRhcHRlcigpOwotCQluZXdBZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCXJldHVybiBuZXdBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZ0F2YWlsYWJsZShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbWRvYy5nZXRFbGVtZW50cygpOwotCQkJaWYgKChDTUVsZW1lbnREZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVBdmFpbGFibGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBPYmplY3QncyBjbG9uZSgpIG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQXR0ckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQXR0ckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxNGQxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUF0dHJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZUF0dHJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFID0gInN0eWxlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlTdHlsZUF0dHJBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwgJiYgaXNNb2RlbE5lY2Vzc2FyeSgpKSB7Ci0JCQltb2RlbCA9IGNyZWF0ZU1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBDU1NTb3VyY2VQYXJzZXIpIHsKLQkJCQkoKENTU1NvdXJjZVBhcnNlcilwYXJzZXIpLnNldFBhcnNlck1vZGUoQ1NTU291cmNlUGFyc2VyLk1PREVfREVDTEFSQVRJT04pOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCQlzZXRNb2RlbChtb2RlbCk7IC8vIG5lZWQgdG8gc2V0IGJlZm9yZSB2YWx1ZUNoYW5nZWQoKQotCQkJdmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgIWlzTW9kZWxOZWNlc3NhcnkoKSkgewotCQkJbW9kZWwgPSBudWxsOwotCQkJdmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENTU1N0eWxlRGVjbGFyYXRpb24pIG1vZGVsLmdldERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlzZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodGhpcy5pZ25vcmVOb3RpZmljYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkKLQkJCXJldHVybjsKLQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUWUxFKSkgewotCQkJdmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlzZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlzZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZSgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZsYXROb2Rlcy5pdGVtKGkpOwotCQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJCXZhbHVlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFNUWUxFKTsKLQkJfQotCQllbHNlIHsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShTVFlMRSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJKChJRE9NTm9kZSkgYXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKFNUWUxFKTsKLQkJCQkoKElET01Ob2RlKSBhdHRyKS5zZXRWYWx1ZVNvdXJjZSh2YWx1ZSk7Ci0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJfQotCQl9Ci0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0KLQkJbm90aWZ5U3R5bGVDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc01vZGVsTmVjZXNzYXJ5KCkpIHsgLy8gcmVtb3ZlZAotCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGRlZmVyCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUob3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCXZhbHVlID0gKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnNldFRleHQodGhpcywgdmFsdWUpOwotCi0JCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNNb2RlbE5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsICYmIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVOb2RlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkgIT0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWY5N2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAJICAgIE1hc2FraSBTYWl0b2ggKE1TQUlUT0hAanAuaWJtLmNvbSkKLSAqCQlTZWUgQnVnIDE1MzAwMCAgU3R5bGUgQWRhcHRlcnMgc2hvdWxkIGJlIGxhemllcgotICoJCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMwMDAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVFbGVtZW50QWRhcHRlciBleHRlbmRzIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VNb2RlbCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0eWxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyYXRpb24gb2YgYXBwbHlpbmcgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IG9sZCBjb250ZW50IGxlbmd0aAotCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIGNvbnRlbnQgPSAoSURPTU5vZGUpIGNoaWxkOwotCQlpbnQgb2xkTGVuZ3RoID0gY29udGVudC5nZXRFbmRPZmZzZXQoKSAtIGNvbnRlbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkvLyBnZXQgbmV3IGNvbnRlbnQgbGVuZ3RoCi0JCWludCBuZXdMZW5ndGggPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoZmxhdE5vZGVzICE9IG51bGwpIHsKLQkJCWludCBjb3VudCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSBmbGF0Tm9kZXMuaXRlbShjb3VudCAtIDEpOwotCQkJCWlmIChsYXN0ICE9IG51bGwpCi0JCQkJCW5ld0xlbmd0aCA9IGxhc3QuZ2V0RW5kKCk7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaW50IGVuZCA9IGZsYXROb2RlLmdldEVuZCgpOwotCQlpbnQgZGlmZiA9IG9sZExlbmd0aCAtIG5ld0xlbmd0aDsKLQkJaW50IGxlbmd0aCA9IGVuZCAtIG9mZnNldCArIGRpZmY7Ci0JCVN0cmluZyBkYXRhID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCi0JCXJlcGxhY2VEYXRhKG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBseSBjaGFuZ2VzIGZyb20gSFRNTCBtb2RlbCB0byBDU1Mgc3ViLW1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnRlbnRDaGFuZ2VkKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCU5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCWRhdGEgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKLQkJfQotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJZGF0YSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBtaW5pbWl6ZSByZXBsYWNlIHJhbmdlCi0JCWludCBzdGFydCA9IDAsIGVuZCA9IDA7Ci0JCVN0cmluZyBvbGREYXRhID0gc3RydWN0dXJlZERvY3VtZW50LmdldCgpOwotCQlpZiAob2xkRGF0YSA9PSBudWxsKQotCQkJb2xkRGF0YSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZWFyY2ggZGlmZmVyZW5jdCBjaGFyYWN0ZXIgcG9zaXRpb24gZnJvbSBmaXJzdAotCQlmb3IgKDsgc3RhcnQgPCBvbGREYXRhLmxlbmd0aCgpICYmIHN0YXJ0IDwgZGF0YS5sZW5ndGgoKTsgc3RhcnQrKykKLQkJCWlmIChvbGREYXRhLmNoYXJBdChzdGFydCkgIT0gZGF0YS5jaGFyQXQoc3RhcnQpKQotCQkJCWJyZWFrOwotCi0JCWlmIChzdGFydCA9PSBvbGREYXRhLmxlbmd0aCgpICYmIHN0YXJ0ID09IGRhdGEubGVuZ3RoKCkpCi0JCQlyZXR1cm47IC8vIG5vIGNoYW5nZQotCQllbHNlIGlmIChzdGFydCA9PSBvbGREYXRhLmxlbmd0aCgpKSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVySDJDKCksIHN0YXJ0LCAwLCBkYXRhLnN1YnN0cmluZyhzdGFydCkpOyAvLyBhcHBlbmQgdGV4dCB0byBsYXN0Ci0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gZGF0YS5sZW5ndGgoKSkgewotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckgyQygpLCBzdGFydCwgb2xkRGF0YS5sZW5ndGgoKSAtIHN0YXJ0LCAiIik7IC8vIHJlbW92ZSB0ZXh0IG9mIGxhc3QgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2VhcmNoIGRpZmZlcmVuY3QgY2hhcmFjdGVyIHBvc2l0aW9uIGZyb20gbGFzdAotCQkJZm9yICg7IHN0YXJ0IDwgb2xkRGF0YS5sZW5ndGgoKSAtIGVuZCAmJiBzdGFydCA8IGRhdGEubGVuZ3RoKCkgLSBlbmQ7IGVuZCsrKSB7Ci0JCQkJaWYgKG9sZERhdGEuY2hhckF0KG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgLSAxKSAhPSBkYXRhLmNoYXJBdChkYXRhLmxlbmd0aCgpIC0gZW5kIC0gMSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckgyQygpLCBzdGFydCwgb2xkRGF0YS5sZW5ndGgoKSAtIGVuZCAtIHN0YXJ0LCBkYXRhLnN1YnN0cmluZyhzdGFydCwgZGF0YS5sZW5ndGgoKSAtIGVuZCkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmICh0aGlzLnJlcGxhY2VNb2RlbCkgewotCQkJSUNTU01vZGVsIG9sZE1vZGVsID0gbW9kZWw7Ci0JCQltb2RlbCA9IGNyZWF0ZU1vZGVsKGZhbHNlKTsKLQotCQkJc2V0TW9kZWwobW9kZWwsIGZhbHNlKTsgLy8gbmVlZCB0byBzZXQgYmVmb3JlIGNvbnRlbnRDaGFuZ2VkKCkKLQkJCWNvbnRlbnRDaGFuZ2VkKCk7Ci0KLQkJCS8vIGZyb20gc3VwZXIuY3JlYXRlTW9kZWwoKQotCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIG1vZGVsUHJvdmlkZUFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQlpZiAobW9kZWxQcm92aWRlQWRhcHRlciAhPSBudWxsKQotCQkJCW1vZGVsUHJvdmlkZUFkYXB0ZXIubW9kZWxQcm92aWRlZChtb2RlbCk7Ci0KLQkJCS8vIGZyb20gY3JlYXRlTW9kZWwoKQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gZnJvbSBzZXRNb2RlbCgpCi0JCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkKLQkJCQlvbGRNb2RlbC5yZW1vdmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwuYWRkU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQotCQkJaWYgKG9sZE1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKG9sZE1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMucmVwbGFjZU1vZGVsID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmxlbmd0aCgpID4gMCAmJiAhdHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0L2NzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWwodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbChib29sZWFuIGFkZExpc3RlbmVyKSB7Ci0JCWlmICghaXNWYWxpZEF0dHJpYnV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghYWRkTGlzdGVuZXIpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlTW9kZWwoZmFsc2UpOwotCi0JCUlDU1NNb2RlbCBtb2RlbCA9IHN1cGVyLmNyZWF0ZU1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCS8vICBwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCS8vICAJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCS8vICAJaWYgKG1vZGVsID09IG51bGwpIHsKLQkvLyAgCQltb2RlbCA9IGNyZWF0ZU1vZGVsKCk7Ci0JLy8gIAkJaWYgKG1vZGVsID09IG51bGwpIHJldHVybiBudWxsOwotCS8vICAJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JLy8gIAkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyAgCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JLy8gIAkJc2V0TW9kZWwobW9kZWwpOyAvLyBuZWVkIHRvIHNldCBiZWZvcmUgY29udGVudENoYW5nZWQoKQotCS8vICAJCWNvbnRlbnRDaGFuZ2VkKCk7Ci0JLy8gIAl9Ci0JLy8gIAlyZXR1cm4gbW9kZWw7Ci0JLy8gIH0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSZXF1ZXN0ZXJIMkMoKSB7Ci0JCXJldHVybiAoZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpICE9IG51bGwpID8gKE9iamVjdCkgKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpIDogdGhpczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSZXF1ZXN0ZXJDMkgoKSB7Ci0JCXJldHVybiAoZ2V0TW9kZWwoKSAhPSBudWxsKSA/IChPYmplY3QpIGdldE1vZGVsKCkgOiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gZ2V0UmVxdWVzdGVySDJDKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSBnZXRSZXF1ZXN0ZXJIMkMoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBJTm9kZUFkYXB0ZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIDxTVFlMRT4gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodGhpcy5pZ25vcmVOb3RpZmljYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQljb250ZW50Q2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlIVE1MRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoSFRNTERvY3VtZW50QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuY2hpbGRSZXBsYWNlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgZGF0YSkgewotCQlJRE9NTm9kZSBlbGVtZW50ID0gKElET01Ob2RlKSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Nb2RlbCBvd25lck1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQlpZiAob3duZXJNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG93bmVyTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGNvbnRlbnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSB0cnVlOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVyQzJIKCksIGNvbnRlbnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyYXRpb24gb2YgYXBwbHlpbmcgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKQotCQkJCQlvZmZzZXQgPSBmaXJzdC5nZXRTdGFydCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShjb3VudCAtIDEpOwotCQkJCWlmIChsYXN0ICE9IG51bGwpCi0JCQkJCWxlbmd0aCA9IGxhc3QuZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oaSk7Ci0JCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGkgPT0gMCkKLQkJCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJfQotCQkJCWRhdGEgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJlcGxhY2VEYXRhKG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc2V0TW9kZWwobW9kZWwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCwgYm9vbGVhbiBzZXR1cExpc3RlbmVyKSB7Ci0JCUlDU1NNb2RlbCBvbGRNb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG9sZE1vZGVsKQotCQkJcmV0dXJuOwotCQlzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0JCWlmICghc2V0dXBMaXN0ZW5lcikKLQkJCXJldHVybjsKLQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQlvbGRNb2RlbC5yZW1vdmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZDE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0eWxlTGlzdGVuZXIgewotCi0JLyoqCi0JICovCi0Jdm9pZCBzdHlsZUNoYW5nZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDEzZDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxIZWxwZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5VUkxIZWxwZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VVcmwKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsKSB7Ci0JCXN1cGVyKGJhc2VVcmwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlVXJsCi0JICogQHBhcmFtIGRvY1Jvb3QKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsLCBTdHJpbmcgZG9jUm9vdCkgewotCQlzdXBlcihiYXNlVXJsLCBkb2NSb290KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiOTc5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Qcm9qZWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vLyBUT0RPIHdoZW4gdGhpcyBjbGFzcyBpcyByZW1vdmVkIGZyb20gLmNvcmUsIFBhdGhIZWxwZXIgYW5kIFVSTEhlbHBlciBjbGFzcwotLy8gYWxzbyBjYW4gYmUgcmVtb3ZlZC4KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxNb2RlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX1JFQUQgPSAxOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9SRUFEID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9FRElUID0gMzsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfRURJVCA9IDQ7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0MDk2OwotCS8vIElNb2RlbE1hbmFnZXIKLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBVUkxNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCi0JCS8vIG9idGFpbiBtb2RlbCBtYW5hZ2VyCi0JCW1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIElEIGZyb20gYSBmaWxlbmFtZS4gVGhpcyBtdXN0IGJlIHNhbWUgYXMKLQkgKiBGaWxlTW9kZWxQcm92aWRlci5jYWxjdWxhdGVJZChJRmlsZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSVBhdGggZnVsbElQYXRoKSB7Ci0JCXJldHVybiBmdWxsSVBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q29tbW9uTW9kZWxGb3IoZmluYWwgSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIGZpbmFsIFN0cmluZyByZWYsIGZpbmFsIGludCB3aGljaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZmlyc3QsIGNyZWF0ZSBhYnNvbHV0ZSB1cmwKLQkJU3RyaW5nIGFic1VSTCA9IHJlc29sdmVVUkkoYmFzZU1vZGVsLCByZWYsIHRydWUpOwotCQlpZiAoKGFic1VSTCA9PSBudWxsKSB8fCAoYWJzVVJMLmxlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG5lZWQgdG8gcmVtb3ZlIGZpbGU6Ly8gc2NoZW1lIGlmIG5lY2Vzc2FyeQotCQl0cnkgewotCQkJZmluYWwgamF2YS5uZXQuVVJMIGFVUkwgPSBuZXcgamF2YS5uZXQuVVJMKGFic1VSTCk7Ci0JCQkvLyBBbiBhY3R1YWwgVVJMIHdhcyBnaXZlbiwgb25seSBmaWxlOi8vLyBpcyBzdXBwb3J0ZWQKLQkJCS8vIHJlc29sdmUgaXQgYnkgZmluZGluZyB0aGUgZmlsZSBpdCBwb2ludHMgdG8KLQkJCWlmICghYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSAmJiAoYVVSTC5nZXRIb3N0KCkuZXF1YWxzKCJsb2NhbGhvc3QiKSB8fCBhVVJMLmdldEhvc3QoKS5sZW5ndGgoKSA9PSAwKSkgey8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCWFic1VSTCA9IGFVUkwuZ2V0RmlsZSgpOwotCQkJCQlmaW5hbCBJUGF0aCBpcGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCQkJCS8vICBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoCi0JCQkJCS8vIElQYXRoLlNFUEFSQVRPUiwgcmVtb3ZlIGl0Ci0JCQkJCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBpcGF0aC5nZXREZXZpY2UoKTsKLQkJCQkJaWYgKChkZXZpY2UgIT0gbnVsbCkgJiYgKGRldmljZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlpZiAoZGV2aWNlLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpIHsKLQkJCQkJCQlmaW5hbCBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlLnN1YnN0cmluZygxKTsKLQkJCQkJCQlhYnNVUkwgPSBpcGF0aC5zZXREZXZpY2UobmV3RGV2aWNlKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZnVFeGMpIHsKLQkJfQotCi0KLQkJLy8gbmV4dCwgZGVjaWRlIHByb2plY3QKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWZpbmFsIElQYXRoIGZ1bGxJUGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvY2F0aW9uKGZ1bGxJUGF0aCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJLy8gZnVsbElQYXRoIGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JCQlwcm9qZWN0ID0gY29udGFpbmVyLmdldFByb2plY3QoKTsKLQkJfQotCi0JCS8vIElmIEhUTUwgZG9jdW1lbnQgaGFzIGEgbGluayB0byBhbiBleHRlcm4gQ1NTIHdoaWNoIGlzIG5vdCBpbgotCQkvLyBJUHJvamVjdAotCQkvLyB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9hdGlvbigpIG1heSByZXR1cm4gbnVsbC4gV2UgbmVlZCB0byB0YWtlCi0JCS8vIGNhcmUKLQkJLy8gb2YgdGhpcyBjYXNlCi0KLQkJLy8gbm93LCBnZXQgYWJzVVJMJ3MgSUZpbGUKLQkJaWYgKChwcm9qZWN0ICE9IG51bGwpICYmIChwcm9qZWN0LmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihmdWxsSVBhdGgpID09IGZhbHNlKSkgewotCQkJLy8gaXQncyBhdCBvdXRzaWRlIG9mIFByb2plY3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlQYXRoIGZpbGVQYXRoID0gZnVsbElQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocHJvamVjdC5nZXRMb2NhdGlvbigpLnNlZ21lbnRDb3VudCgpKTsKLQkJCUlGaWxlIGZpbGUgPSAoZmlsZVBhdGggIT0gbnVsbCAmJiAhZmlsZVBhdGguaXNFbXB0eSgpKSA/IHByb2plY3QuZ2V0RmlsZShmaWxlUGF0aCkgOiBudWxsOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJfQotCi0JCQkvLyBzZXR0aW5nIHN5bmNocm9uaXphdGlvbiBzdGFtcCBpcyBJTW9kZWxNYW5hZ2VyJ3MgY2xpZW50J3MKLQkJCS8vIHJlc3BvbnNpYmlsaXR5Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKQotCQkJCW1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgaWQgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQkJLy8gb2J0YWluIHJlc29sdmVyCi0JCQlVUklSZXNvbHZlciByZXNvbHZlciA9IChwcm9qZWN0ICE9IG51bGwpID8gKFVSSVJlc29sdmVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpIDogbnVsbDsKLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJLy8gUHJvamVjdFJlc29sdmVyIGNhbiB0YWtlIGNhcmUgb2YgdGhlIGNhc2UgaWYgcHJvamVjdCBpcwotCQkJCS8vIG51bGwuCi0JCQkJcmVzb2x2ZXIgPSBuZXcgUHJvamVjdFJlc29sdmVyKHByb2plY3QpOwotCQkJfQotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gdGhlcmUgaXMgbm8gcHJvamVjdC4gd2UgY2FuJ3QgZXhwZWN0IElQcm9qZWN0IGhlbHAgdG8gY3JlYXRlCi0JCQkvLyBpZC9pbnB1dFN0cmVhbQotCQkJamF2YS5pby5GaWxlIGZpbGUgPSBmdWxsSVBhdGgudG9GaWxlKCk7Ci0KLQkJCS8vIG9iYXRpbiBpZAotCQkJaWQgPSBjYWxjdWxhdGVJZChmdWxsSVBhdGgpOwotCi0JCQkvLyBvYnRhaW4gSW5wdXRTdHJlYW0KLQkJCXRyeSB7Ci0JCQkJaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0JCQkJLy8gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIHdlIGRvbid0IGhhdmUgcmVhZCBwZXJtaXNzaW9uCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG9idGFpbiBtb2RlbAotCQkJdHJ5IHsKLQkJCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGluU3RyZWFtLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWUpIHsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGNsb3NlIG5vdyAhCi0JCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCi0JCS8vIHNldCBsb2NhdGlvbmlkCi0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldEJhc2VMb2NhdGlvbigpID09IG51bGwpIHsKLQkJCW1vZGVsLnNldEJhc2VMb2NhdGlvbihmdWxsSVBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfRURJVCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX1JFQUQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNoZWNrIHRoZSBtb2RlbCBpcyBIVE1MIGZhbWlseSBvciBub3QKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGlzSFRNTEZhbWlseShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyLmhhc0ZlYXR1cmUoSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cy5IVE1MKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICogPGNvZGU+cmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzPC9jb2RlPjogSWYgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzCi0JICogaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBwcm9wZXJseSByZXNvbHZlIHRoZSBVUkkgaWYgaXQgaXMKLQkgKiBhIHZhbGlkIFVSSSBwb2ludGluZyB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVVJJKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gZm9yIEhUTUwsICdocmVmJyBhdHRyaWJ1dGUgdmFsdWUgb2YgQkFTRSBlbGVtZW50Ci0JCS8vIHNob3VsZCBiZSB1c2VkLCBpZiBleGlzdHMgYW55Ci0JCVN0cmluZyBiYXNlSHJlZiA9IG51bGw7Ci0JCS8vIGRtd19UT0RPIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gaGFuZGxlIGEgY29udGVudCBtb2RlbAotCQkvLyBvZiBIVE1MIG9yIFhIVE1MCi0JCWlmIChpc0hUTUxGYW1pbHkoYmFzZU1vZGVsKSkgewotCQkJZmluYWwgSURPTU1vZGVsIHhtbG1vZGVsID0gKElET01Nb2RlbCkgYmFzZU1vZGVsOwotCQkJZmluYWwgSURPTURvY3VtZW50IGRvYyA9IHhtbG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkvLyBsb29rIGZvciA8QkFTRT4gdy8gaHJlZgotCQkJZmluYWwgTm9kZUxpc3QgbmwgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkJBU0UiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJLy8gcGVyIGVhY2ggPEJBU0U+Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWZpbmFsIE5vZGUgYmFzZU5vZGUgPSBubC5pdGVtKGkpOwotCQkJCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCQkJLy8gZ2V0IGFsbCBhdHRycwotCQkJCQkJZmluYWwgTmFtZWROb2RlTWFwIGF0dHJOb2RlcyA9IGJhc2VOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCWlmIChhdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJCQkJCWZpbmFsIE5vZGUgYXR0ck5vZGUgPSBhdHRyTm9kZXMuZ2V0TmFtZWRJdGVtKCJIUkVGIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChhdHRyTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIGZvdW5kIGhyZWY9IiIKLQkJCQkJCQkJZmluYWwgU3RyaW5nIGF0dHJWYWx1ZSA9IGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJCWJhc2VIcmVmID0gYXR0clZhbHVlLnRyaW0oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyB3aGF0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSA8QkFTRT4gdGFncyA/PwotCQkJCQlpZiAoYmFzZUhyZWYgIT0gbnVsbCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcmVzb2x2ZXIgaW4gTW9kZWwKLQkJZmluYWwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBiYXNlTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQotCQkvLyByZXNvbHZlIHRvIGFic29sdXRlIHVybAotCQlmaW5hbCBTdHJpbmcgYWJzdXJsID0gKHJlc29sdmVyICE9IG51bGwpID8gKChiYXNlSHJlZiAhPSBudWxsKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCBiYXNlSHJlZiwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSA6IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpKSA6IG51bGw7Ci0JCWlmICgocmVzb2x2ZXIgIT0gbnVsbCkgJiYgKGFic3VybCA9PSBudWxsKSAmJiAocmVmICE9IG51bGwpICYmIChyZWYudHJpbSgpLmxlbmd0aCgpID4gMCkgJiYgKHJlZi50cmltKCkuY2hhckF0KDApID09ICcvJykpIHsKLQkJCS8vIHRvIHJlYWNoIGhlcmUgbWVhbnMgOgotCQkJLy8gICAgcmVmIGlzIGEgRG9jcm9vdCByZWxhdGl2ZQotCQkJLy8gICAgcmVzb2x2ZXIgY2FuJ3QgcmVzb2x2ZSByZWYKLQkJCS8vIHNvIHRoYXQgaHJlZiBpcyBhIGJyb2tlbiBhbmQgc2hvdWxkIG5vdCBjcmVhdGUgbW9kZWwKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoYWJzdXJsICE9IG51bGwpICYmIChhYnN1cmwubGVuZ3RoKCkgPiAwKSkgewotCQkJcmV0dXJuIGFic3VybDsKLQkJfQotCi0JCS8vIG1heWJlIHJlZiBpcyBhdCBvdXRzaWRlIG9mIHRoZSBQcm9qZWN0Ci0JCS8vIG9idGFpbiBkb2Nyb290OwotCQlmaW5hbCBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChyZXNvbHZlciAhPSBudWxsKSA/IHJlc29sdmVyLmdldFJvb3RMb2NhdGlvbigpIDogbnVsbDsKLQkJU3RyaW5nIGRvY3Jvb3QgPSBudWxsOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCWRvY3Jvb3QgPSBjb250YWluZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCWRvY3Jvb3QgPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJLy8gc2hvdWxkIG5vdCBiZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBvYnRhaW4gZG9jdW1lbnQgdXJsCi0JCVN0cmluZyBtb2RlbEJhc2VMb2NhdGlvbiA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGZhbGxiYWNrLi4uCi0JCQltb2RlbEJhc2VMb2NhdGlvbiA9IGJhc2VNb2RlbC5nZXRJZCgpOwotCQl9Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBpIGNhbid0IHJlc29sdmUgdXJpICEKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gcmVzb2x2ZSB1cmwKLQkJVVJMSGVscGVyIGhlbHBlciA9IG5ldyBVUkxIZWxwZXIoUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChtb2RlbEJhc2VMb2NhdGlvbiksIFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgoUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGRvY3Jvb3QpKSk7Ci0JCXJldHVybiBoZWxwZXIudG9BYnNvbHV0ZShyZWYpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMGEwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLkhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLlN0eWxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk1vZGVsUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRIVE1MIGltcGxlbWVudHMgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0KLQlwdWJsaWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRW1iZWRkZWRIVE1MID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW1iZWRkZWRIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1iZWRkZWRIVE1MLgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEhUTUxpc2hUYWcoQmxvY2tUYWdQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjZ2V0RmFtaWx5SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5SWQoKSB7Ci0JCXJldHVybiBNb2RlbEhhbmRsZXJGb3JIVE1MLkFzc29jaWF0ZWRDb250ZW50VHlwZUlEOwotCX0KLQotCS8qCi0JICogT25seSAibW9kZWwgc2lkZSIgZW1iZWRkZWQgZmFjdG9yaWVzIGNhbiBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwoKSk7Ci0JCS8vIGZhY3Rvcmllcy5hZGRBbGwoUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yaWVzKHRoaXMpKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSFRNTGlzaFRhZyhwYXJzZXIsICJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIExpc3QgZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkgewotCQlpZiAoc3VwcG9ydGVkTWltZVR5cGVzID09IG51bGwpIHsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoInRleHQvaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L3hodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoImFwcGxpY2F0aW9uL3hodG1sK3htbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJhcHBsaWNhdGlvbi94bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC92bmQud2FwLndtbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZE1pbWVUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5KTsKLQotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcykpIHsKLQotCQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpKSB7Ci0KLQkJCWZhY3RvcnkgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnkpOwotCi0JCS8vIElTU1VFOiBzaG91bGQgdGhlc2UgZmFjdG9yaWVzIGJlIHJlbGVhc2VkPyBPciBqdXN0IAotCQkvLyByZW1vdmVkIGZyb20gdGhpcyByZWdpc3RyeSwgYmVjYXVzZSB3ZSBhcmUgZ2V0dGluZyByZWFkeSB0bwotCQkvLyByZS1hZGQgdGhlbT8KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gcmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQlyZWdpc3RyeS5yZW1vdmVGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSByZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQkvLyBJJ20gYXNzdW1pbmcgYmxvY2sgbWFya2VycyBhcmUgdW5pcXVlIGJhc2VkIG9uIG5hbWUgb25seQotCQkvLyB3ZSBhZGQgdGhlc2UgYXMgZnVsbCBCbG9ja01hcmtlcnMsIGJ1dCByZW1vdmUgYmFzZWQgb24gbmFtZSBhbG9uZS4KLQkJcGFyc2VyLnJlbW92ZUJsb2NrTWFya2VyKCJzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIucmVtb3ZlQmxvY2tNYXJrZXIoInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogd2lsbCBzb21lZGF5IGJlIGNvbnRyb2xsZWQgdmlhIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCXJldHVybiBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKS5jb250YWlucyhtaW1lVHlwZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2MxNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckhUTUwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKiAKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiAKLQkgKiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4gYXQgcnVuIHRpbWUgd2l0aCAKLQkgKiB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiAKLQkgKiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4gYXQgcnVuIHRpbWUgd2l0aCAKLQkgKiB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySURfSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEX0hUTUwpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQxZjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHNlbGYsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYnVkZHksIGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcihzZWxmLCBidWRkeSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0QXR0ck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0QXR0ck5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRBdHRyVHlwZSgpCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0QXR0clR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXREZWZhdWx0VmFsdWUoKQotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRFbnVtQXR0cigpCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRFbnVtQXR0cigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldFVzYWdlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldFVzYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldFNlbGYoKSB7Ci0JCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgc2VsZjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4ZjEzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5zc2kuU1NJQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBnZXRIVE1MQ01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQl9Ci0KLQljbGFzcyBFbGVtZW50cyBleHRlbmRzIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0gewotCQlwdWJsaWMgRWxlbWVudHMoQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQltYWtlQnVkZHlTeXN0ZW0oZWxlbWVudHMpOwotCQkJYWRkU1NJRGVjbHMoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBlZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlyZXR1cm4gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oZWRlY2wsIGlzWEhUTUwoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2woQ01Ob2RlIGNtbm9kZSkgewotCQkJaWYgKGNtbm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21ub2RlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFNTSURlY2xzKCkgewotCQkJQ01Eb2N1bWVudCBzc2kgPSBTU0lDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCQlpZiAoc3NpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBzc2kuZ2V0RWxlbWVudHMoKTsKLQkJCUl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJcHV0KGRlY2wuZ2V0RWxlbWVudE5hbWUoKSwgZGVjbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnRzIGVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBDTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0oQ01Eb2N1bWVudCBzZWxmLCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoc2VsZiwgZ2V0SFRNTENNRG9jdW1lbnQoKSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBnZXRTZWxmKCk7Ci0JCWlmIChjbWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRzKGNtZG9jLmdldEVsZW1lbnRzKCksIGlzWEhUTUwpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RW50aXRpZXMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IGdldFNlbGYoKTsKLQkJaWYgKGNtZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNtZG9jLmdldEVudGl0aWVzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0TmFtZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlDTURvY3VtZW50IGNtZG9jID0gZ2V0U2VsZigpOwotCQlpZiAoY21kb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY21kb2MuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGdldFNlbGYoKSB7Ci0JCWlmIChzZWxmLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkRPQ1VNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Eb2N1bWVudCkgc2VsZjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFiNGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgaHRtbGNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0SFRNTENNRWxlbURlY2woQ01FbGVtZW50RGVjbGFyYXRpb24gb3JpZ2luYWwpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gYnVkZHkgPSBudWxsOwotCQlpZiAoaHRtbGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1zID0gaHRtbGNtLmdldEVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbXMgIT0gbnVsbCkgewotCQkJCWJ1ZGR5ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtcy5nZXROYW1lZEl0ZW0ob3JpZ2luYWwuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZGR5OwotCX0KLQotCXByaXZhdGUgY2xhc3MgQXR0cnMgZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtIHsKLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBidWRkeUF0dHJzID0gbnVsbDsKLQotCQlwdWJsaWMgQXR0cnMoQ01OYW1lZE5vZGVNYXAgYXR0cnMsIENNTmFtZWROb2RlTWFwIGJ1ZGR5QXR0cnMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQl0aGlzLmJ1ZGR5QXR0cnMgPSBidWRkeUF0dHJzOwotCQkJbWFrZUJ1ZGR5U3lzdGVtKGF0dHJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChhZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGFkZWNsLmdldEF0dHJOYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZUJ1ZGR5U3lzdGVtKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjbCA9IGdldERlY2wob3JpZ2luYWwpOwotCQkJaWYgKGFkZWNsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGJ1ZGR5ID0gbnVsbDsKLQkJCWlmIChidWRkeUF0dHJzICE9IG51bGwpIHsKLQkJCQlidWRkeSA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBidWRkeUF0dHJzLmdldE5hbWVkSXRlbShhZGVjbC5nZXRBdHRyTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKGFkZWNsLCBidWRkeSwgaXNYSFRNTCgpKTsKLQkJfQotCi0JCXByaXZhdGUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsKENNTm9kZSBjbW5vZGUpIHsKLQkJCWlmIChjbW5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEF0dHJzIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oQ01FbGVtZW50RGVjbGFyYXRpb24gc2VsZiwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKHNlbGYsIGdldEhUTUxDTUVsZW1EZWNsKHNlbGYpLCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0QXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0cmlidXRlczsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGh0bWxEZWNsID0gZ2V0QnVkZHkoKTsKLQkJQ01OYW1lZE5vZGVNYXAgaHRtbEF0dHJzID0gKGh0bWxEZWNsID09IG51bGwpID8gbnVsbCA6IGh0bWxEZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRycyhlZGVjbC5nZXRBdHRyaWJ1dGVzKCksIGh0bWxBdHRycywgaXNYSFRNTCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0Q29udGVudCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJcmV0dXJuIGVkZWNsLmdldENvbnRlbnRUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldERhdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXREYXRhVHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRMb2NhbEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQ29udGVudCNnZXRNYXhPY2N1cigpCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gZWRlY2wuZ2V0TWF4T2NjdXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Db250ZW50I2dldE1pbk9jY3VyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBlZGVjbC5nZXRNaW5PY2N1cigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjc3VwcG9ydHMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGlzWEhUTUwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChpc1hIVE1MICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKQotCQkJcmV0dXJuIEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfTk9ORTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTZWxmKCkgewotCQlpZiAoc2VsZi5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHNlbGY7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRCdWRkeSgpIHsKLQkJaWYgKGJ1ZGR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGJ1ZGR5LmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgYnVkZHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzZGFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbS4KLQkgKiBDQVVUSU9OOiBFYWNoIGRlcml2ZWQgY2xhc3MgbXVzdCBjYWxsICdtYWtlQnVkZHlTeXN0ZW0nIG1ldGhvZCBpbiBpdHMKLQkgKiBjb25zdHJ1Y3RvciB0byBidWlsZCB1cCBpdHMgY29udGVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0oYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXNYSFRNTCA9IGlzWEhUTUw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBtYXAuc2l6ZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNnZXROYW1lZEl0ZW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBrZXkgPSBjYW5vbmljYWxOYW1lKG5hbWUpOwotCQlpZiAoIW1hcC5jb250YWluc0tleShrZXkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBtYXAuZ2V0KGtleSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2l0ZW0oaW50KQotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmICgtLWluZGV4IDwgMCkKLQkJCQlyZXR1cm4gKENNTm9kZSkgbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01OYW1lZE5vZGVNYXAjaXRlcmF0b3IoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qIHBhY2thZ2Ugc2NvcGUuICovCi0Jdm9pZCBwdXQoU3RyaW5nIG5hbWUsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBjbW5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbWFwLnB1dChjYW5vbmljYWxOYW1lKG5hbWUpLCBjbW5vZGUpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYSFRNTCgpIHsKLQkJcmV0dXJuIGlzWEhUTUw7Ci0JfQotCi0JLyoqCi0JICogRWFjaCBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCB0aGlzIG1ldGhvZCBpbiBpdHMgY29uc3RydWN0b3IKLQkgKiB0byBidWlsZCB1cCBpdHMgY29udGVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUJ1ZGR5U3lzdGVtKENNTmFtZWROb2RlTWFwIG9yaWdpbmFsKSB7Ci0JCUl0ZXJhdG9yIGkgPSBvcmlnaW5hbC5pdGVyYXRvcigpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBvcmcgPSAoQ01Ob2RlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSBnZXRLZXlOYW1lKG9yZyk7Ci0JCQlDTU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZUJ1ZGR5U3lzdGVtKG9yZyk7Ci0JCQlwdXQoa2V5LCBuZXdOb2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNhbm9uaWNhbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUudG9VcHBlckNhc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Ob2RlQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTm9kZUJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YThiZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Ob2RlQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqLwotY2xhc3MgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTU5vZGUgewotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJvdGVjdGVkIENNTm9kZSBzZWxmID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Ob2RlIGJ1ZGR5ID0gbnVsbDsKLQotCXB1YmxpYyBDTU5vZGVCdWRkeVN5c3RlbShDTU5vZGUgc2VsZiwgQ01Ob2RlIGJ1ZGR5LCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxmID0gc2VsZjsKLQkJdGhpcy5idWRkeSA9IGJ1ZGR5OwotCQl0aGlzLmlzWEhUTUwgPSBpc1hIVE1MOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0Tm9kZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBzZWxmLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXROb2RlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIHNlbGYuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI3N1cHBvcnRzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYnVkZHkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGJ1ZGR5LnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKCFpc1hIVE1MKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGlzWEhUTUwpOwotCQl9Ci0KLQkJaWYgKGJ1ZGR5ID09IG51bGwgfHwgKCFidWRkeS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVkZHkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzJjMjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0RvY3VtZW50UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlOwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFF1ZXJ5IHsKLQotCS8qKgotCSAqIGlzUmVuZGVyUm9vdCgpIHJldHVybnMgdHJ1ZSBpZiAtIG5vZGUgaXMgQk9EWSBlbGVtZW50IChib3RoIGV4cGxpY2l0Ci0JICogYW5kIGltcGxpY2l0KSAtIG5vZGUgaXMgcG9ydGFsaHRtbDpib2R5IGVsZW1lbnQgLSBub2RlIGlzIERvY3VtZW50IG5vZGUKLQkgKiBhbmQgdGhlIGRvY3VtZW50IGlzIHRyZWF0ZWQgYXMgZnJhZ21lbnQgKHdpdGggQk9EWSBjb250ZXh0KSBOb3RlIHRoYXQKLQkgKiBpbiBlZGl0aW5nIGEgZnJhZ21lbnQgZmlsZSwgRG9jdW1lbnQgbm9kZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhCi0JICogc3Vic3RpdHV0ZSBvZiBCT0RZIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc1JlbmRlclJvb3QoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGlzSGVhZENvcnJlc3BvbmRlbnQoKSByZXR1cm5zIHRydWUgaWYgLSBub2RlIGlzIEhFQUQgZWxlbWVudCAoYm90aAotCSAqIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCkgLSBub2RlIGlzIHBvcnRhbGh0bWw6aGVhZCBlbGVtZW50IC0gbm9kZSBpcwotCSAqIERvY3VtZW50IG5vZGUgYW5kIHRoZSBkb2N1bWVudCBpcyB0cmVhdGVkIGFzIGZyYWdtZW50ICh3aXRoIEhFQUQKLQkgKiBjb250ZXh0KSBOb3RlIHRoYXQgaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUgKHdpdGggSEVBRCBjb250ZXh0KSwKLQkgKiBEb2N1bWVudCBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3Vic3RpdHV0ZSBvZiBIRUFEIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0hlYWRDb3JyZXNwb25kZW50KE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBJbXBsaWNpdCBCT0RZIGVsZW1lbnQgd2lsbCBiZSBnb25lIGluIFY2IFNFRCBtb2RlbC4gU28gcGFnZSBkZXNpZ25lcgotCSAqIHByb3ZpZGVzIGFuIEFQSSB0byBnZXQgYSByYW5nZSB3aG9zZSBjb250ZW50IG5vZGVzIGFyZSByZW5kZXJlZCBpbgotCSAqIGRlc2lnbiB2aWV3LiBnZXRSZW5kZXJSb290UmFuZ2UoKSByZXR1cm5zIC0gYSByYW5nZSBmcm9tIEJPRFkncyBmaXJzdAotCSAqIHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIEJPRFkgZWxlbWVudCkgLSBhIHJhbmdlIGZvcm0KLQkgKiBEb2N1bWVudCdzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZCi0JICogY29udGV4dCkgLSBudWxsIChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQpIFtUaGUKLQkgKiBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSByYW5nZSBmcm9tIGEgY3VzdG9tCi0JICogdGFnJ3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEJPRFkgZWxlbWVudCBhdCBydW50aW1lKSAtIGEgcmFuZ2UgZnJvbSBEb2N1bWVudCdzCi0JICogYXBwcm9waXJhdGUgb2Zmc2V0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdAotCSAqIEJPRFkvSFRNTCkgLSBhIHJhbmdlIGZyb20gSFRNTCBlbGVtZW50J3MgYXBwcm9wcmlhdGUgb2Zmc2V0IHRvIGl0cyBsYXN0Ci0JICogKGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0IEJPRFkgYnV0IGhhdmUgZXhwbGljaXQgSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCVJhbmdlIGdldFJlbmRlclJvb3RSYW5nZShEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogSW1wbGljaXQgSEVBRCBlbGVtZW50IHdpbGwgYmUgZ29uZSBpbiBWNiBTRUQgbW9kZWwuIFNvIHBhZ2UgZGVzaWduZXIKLQkgKiBwcm92aWRlcyBhbiBBUEkgdG8gZ2V0IGEgcmFuZ2Ugd2hvc2UgY29udGVudCBub2RlcyBhcmUgdHJlYXRlZCBhcyBIRUFECi0JICogZWxlbWVudCdzIGNoaWxkLiBnZXRIZWFkQ29ycmVzcG9uZGVudFJhbmdlKCkgcmV0dXJucyAtIGEgcmFuZ2UgZnJvbQotCSAqIEhFQUQncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGhhcyBIRUFEIGVsZW1lbnQpIC0gYSByYW5nZQotCSAqIGZvcm0gRG9jdW1lbnQncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGgKLQkgKiBIRUFEIGNvbnRleHQpIC0gbnVsbCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0KQotCSAqIFtUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlIFY2XSAtIGEgcmFuZ2UgZnJvbSBhCi0JICogY3VzdG9tIHRhZydzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIGEgY3VzdG9tIHRhZyB3aGljaAotCSAqIGdlbmVyYXRlcyBIRUFEIGVsZW1lbnQgYXQgcnVudGltZSkgLSBhIHJhbmdlIGZyb20gRG9jdW1lbnQncyBmaXJzdCB0bwotCSAqIGFwcHJvcGlyYXRlIG9mZnNldCAoaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZXhwbGljaXQgSEVBRC9IVE1MKSAtCi0JICogYSByYW5nZSBmcm9tIEhUTUwgZWxlbWVudCdzIGZpcnN0IHRvIGFwcHJvcHJpYXRlIG9mZnNldCAoaWYgdGhlCi0JICogZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBIRUFEIGJ1dCBoYXZlIGV4cGxpY2l0IEhUTUwpCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlSYW5nZSBnZXRIZWFkQ29ycmVzcG9uZGVudFJhbmdlKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBnZXRSZW5kZXJSb290Tm9kZSgpIHdpdGggW2NyZWF0ZT1mYWxzZV0gcmV0dXJucyAtIEJPRFkgZWxlbWVudCBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgQk9EWSBlbGVtZW50IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50Ci0JICogaXMgbm90IGZyYWdtZW50IGFuZCBkb2VzIG5vdCBoYXZlIEJPRFkgZWxlbWVudCAtIERvY3VtZW50IG5vZGUgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50IGlzCi0JICogZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQgW1RoZSBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UKLQkgKiBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2ggZ2VuZXJhdGVzIEJPRFkgdGFnIGF0IHJ1bnRpbWUgLSBEb2N1bWVudCBub2RlCi0JICogb3IgSFRNTCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlCi0JICogZXhwbGljaXQgQk9EWSBlbGVtZW50IGdldFJlbmRlclJvb3ROb2RlKCkgd2l0aCBbY3JlYXRlPXRydWVdIHJldHVybnMgLQotCSAqIEJPRFkgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEJPRFkgZWxlbWVudCAobm8KLQkgKiBtb2RpZmljdGF0aW9uKSAtIG5ld2x5IGNyZWF0ZWQgQk9EWSBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90Ci0JICogZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUgQk9EWSBlbGVtZW50IC0gRG9jdW1lbnQgbm9kZSBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgKG5vIG1vZGlmaWN0YXRpb24pIFtUaGUKLQkgKiBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEJPRFkgdGFnIGF0IHJ1bnRpbWUgKG5vIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBCT0RZCi0JICogZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdAotCSAqIEJPRFkgZWxlbWVudCBnZXRSZW5kZXJSb290Tm9kZSgpIHRocm93cyBIVE1MQ29tbWFuZEV4Y2VwdGlvbiAoc2luY2UgVjYpCi0JICogaWYgLSB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IGFuZCAtICJjcmVhdGUiCi0JICogcGFyYW1ldGVyIGlzIHRydWUgTm90ZSB0aGF0IGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLCBEb2N1bWVudCBub2RlCi0JICogc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEJPRFkgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldFJlbmRlclJvb3ROb2RlKE5vZGUgY2hpbGRPckRvY3VtZW50LCBib29sZWFuIGNyZWF0ZSk7Ci0KLQkvKioKLQkgKiBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoKSB3aXRoIFtjcmVhdGU9ZmFsc2VdIHJldHVybnMgLSBIRUFEIGVsZW1lbnQKLQkgKiBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEhFQUQgZWxlbWVudCAtIG51bGwgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgZG9lcyBub3QgaGF2ZSBIRUFEIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlCi0JICogaWYgdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCAtIG51bGwgaWYgdGhpcyBkb2N1bWVudAotCSAqIGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IFtUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkCi0JICogc2luY2UgVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoIGdlbmVyYXRlcyBIRUFEIHRhZyBhdCBydW50aW1lIC0gRG9jdW1lbnQKLQkgKiBub2RlIG9yIEhUTUwgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZQotCSAqIGV4cGxpY2l0IEhFQUQgZWxlbWVudCBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoKSB3aXRoIFtjcmVhdGU9dHJ1ZV0KLQkgKiByZXR1cm5zIC0gSEVBRCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgSEVBRAotCSAqIGVsZW1lbnQgKG5vIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBIRUFEIGVsZW1lbnQgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBIRUFEIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlCi0JICogaWYgdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCAobm8gbW9kaWZpY3RhdGlvbikgW1RoZQotCSAqIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgSEVBRCB0YWcgYXQgcnVudGltZSAobm8gbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEhFQUQKLQkgKiBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0Ci0JICogSEVBRCBlbGVtZW50IGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZSgpIHRocm93cyBIVE1MQ29tbWFuZEV4Y2VwdGlvbgotCSAqIChzaW5jZSBWNikgaWYgLSB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IGFuZCAtCi0JICogImNyZWF0ZSIgcGFyYW1ldGVyIGlzIHRydWUgTm90ZSB0aGF0IGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLAotCSAqIERvY3VtZW50IG5vZGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEhFQUQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZShOb2RlIGNoaWxkT3JEb2N1bWVudCwgYm9vbGVhbiBjcmVhdGUpOwotCi0JLyoqCi0JICogZ2V0SHRtbENvcnJlc3BvbmRlbnROb2RlKCkgdGhyb3dzIEhUTUxDb21tYW5kRXhjZXB0aW9uIChzaW5jZSBWNikgaWYgLQotCSAqIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgYW5kICJjcmVhdGUiIHBhcmFtZXRlciBpcyB0cnVlCi0JICogCi0JICogQHBhcmFtIGNoaWxkT3JEb2N1bWVudAotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBnZXRIdG1sQ29ycmVzcG9uZGVudE5vZGUoTm9kZSBjaGlsZE9yRG9jdW1lbnQsIGJvb2xlYW4gY3JlYXRlKTsKLQotCS8qKgotCSAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIGluc2VydGlvbiB0YXJnZXQuIHBsZWFzZSB1c2UgdGhpcyBsaWtlCi0JICogdGhlIGZvbGxvd2luZyA6IERvY3VtZW50UXVlcnkuSW5zZXJ0aW9uVGFyZ2V0IGluczsKLQkgKiBpbnMuZ2V0UGFyZW50KCkuaW5zZXJ0QmVmb3JlKHlvdUluc2VydGlvbk5vZGUsIGlucy5nZXRSZWYoKSk7Ci0JICovCi0JcHVibGljIGNsYXNzIEluc2VydGlvblRhcmdldCB7Ci0JCXByaXZhdGUgZmluYWwgTm9kZSBwYXJlbnQ7Ci0JCXByaXZhdGUgZmluYWwgTm9kZSByZWY7Ci0KLQkJcHVibGljIEluc2VydGlvblRhcmdldChOb2RlIHBhcmVudCwgTm9kZSByZWYpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5yZWYgPSByZWY7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0UmVmKCkgewotCQkJcmV0dXJuIHJlZjsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldEhlYWRJbnNlcnRpb25UYXJnZXQoKSByZXR1cm5zIGFwcHJvcHJpYXRlIGluc2V0aW9uIHRhcmdldCBsb2NhdGlvbgotCSAqIGZvciBIRUFEIGNoaWxkIHRhZ3Mgc3VjaCBhcyA8c2NyaXB0PiwgPHN0eWxlPiwgPG1ldGE+ZXRjLiBCYXNpY2FsbHkKLQkgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgPEhFQUQ+dGFnJ3MgdGhlIGxhc3QgcG9zaXRpb24uIE5vdGUgdGhhdCB0aGlzCi0JICogd291bGQgbm90IGNyZWF0ZSBhY3R1YWwgPEhFQUQ+dGFnIHdoZW4gdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgaXQuCi0JICogPEhFQUQ+aXMgb21pdHRhYmxlIHRhZyBzbyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYXBwcm9wcmlhdGUgcG9zaXRpb24KLQkgKiB0byB3aGljaCBpbXBsaWNpdCA8SEVBRD5jYW4gYmUgaW5zZXJ0ZWQsIGlmIHRoZSBkb2N1bWVudCBoYXMgbm8KLQkgKiA8SEVBRD4uCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlJbnNlcnRpb25UYXJnZXQgZ2V0SGVhZEluc2VydGlvblRhcmdldChEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogZ2V0UGFnZUluc2VydGlvblRhcmdldCgpIHJldHVybnMgYXBwcm9wcmlhdGUgaW5zZXRpb24gdGFyZ2V0IGxvY2F0aW9uCi0JICogZm9yIHBhZ2UtbGV2ZWwgbWFya3Vwcywgc3VjaCBhcyBKU1AgZGlyZWN0aXZlcywgdXNlYmVhbiB0YWdzIG9yIDxodG1sPgotCSAqIHRhZy4gQmFzaWNhbGx5IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBqdXN0IGJlZm9yZSA8SFRNTD50YWcuIE5vdGUgdGhhdAotCSAqIHRoaXMgd291bGQgbm90IGNyZWF0ZSBhY3R1YWwgPEhUTUw+dGFnIHdoZW4gdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUKLQkgKiBpdC4gSW4gc3VjaCBjYXNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUKLQkgKiBtZWFuaW5nZnVsIHRhZ3Mgc3VjaCBhcyBIVE1ML0pTUCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCUluc2VydGlvblRhcmdldCBnZXRQYWdlSW5zZXJ0aW9uVGFyZ2V0KERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBpc0ZyYWdtZW50KCkgcmV0dXJucyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCBvciBjb21wbGV0ZQotCSAqIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzRnJhZ21lbnQoRG9jdW1lbnQgZG9jKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMzk2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk4MWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyOwotCQlhZGFwdGVyID0gbmV3IEhUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkZGIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9ITVFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBITVFVdGlsIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFZlY3RvciBudWxsVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JLyogSE1RVXRpbCBjbGFzcyBtdXN0IG5vdCBpbnN0YW50aWF0ZS4gKi8KLQlwcml2YXRlIEhNUVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogZ2F0aGVyIGFsbCBlbGVtZW50IGRlY2xhcmF0aW9ucyBpbiBpbmNsdXNpb24gb2YgZWFjaCBwYXJlbnQgb2YgdGhlIHRhcmdldC4gCi0JICogdGhlIGluY2x1c2lvbiBvZiB0aGUgdGFyZ2V0IGlzIGFsc28gZ2F0aGVyZWQuICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldEluY2x1c2lvbnMoRWxlbWVudCB0YXJnZXQpIHsKLQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGxWZWN0b3I7Ci0JCUNvbGxlY3Rpb24gaW5jbHVzaW9ucyA9IGdhdGhlckluY2x1c2lvbnMoZ2V0QW5jZXN0b3JEZWNsYXJhdGlvbnModGFyZ2V0KSk7Ci0KLQkJSGFzaHRhYmxlIGF2YWlsYWJsZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpbmNsdXNpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01Db250ZW50IGluY2x1c2lvbiA9IChDTUNvbnRlbnQpIGl0ZXIubmV4dCgpOwotCQkJc3dpdGNoIChpbmNsdXNpb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJZXh0cmFjdERlY2xhcmF0aW9ucyhhdmFpbGFibGVzLCAoQ01Hcm91cCkgaW5jbHVzaW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJCWFkZEluY2x1c2lvbihhdmFpbGFibGVzLCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGluY2x1c2lvbik7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGF2YWlsYWJsZXMudmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRBbmNlc3RvckRlY2xhcmF0aW9ucyhFbGVtZW50IHRhcmdldCkgewotCQlWZWN0b3IgYW5jZXN0b3JzID0gbmV3IFZlY3RvcigpOwotCi0JCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlhbmNlc3RvcnMuYWRkKGRlY2wpOwotCi0JCUVsZW1lbnQgcGFyZW50ID0gZ2V0UGFyZW50KHRhcmdldCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJZGVjbCA9IHF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKQotCQkJCWFuY2VzdG9ycy5hZGQoZGVjbCk7Ci0JCQlwYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gYW5jZXN0b3JzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSW5jbHVzaW9uKEhhc2h0YWJsZSBhdmFpbGFibGVzLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCVN0cmluZyBuYW1lID0gZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoYXZhaWxhYmxlcy5jb250YWluc0tleShuYW1lKSkKLQkJCXJldHVybjsKLQkJYXZhaWxhYmxlcy5wdXQobmFtZSwgZGVjbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnYXRoZXJJbmNsdXNpb25zKENvbGxlY3Rpb24gYW5jZXN0b3JzKSB7Ci0JCVZlY3RvciBpbmNsdXNpb25zID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBpdGVyID0gYW5jZXN0b3JzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTikpIHsKLQkJCQlDTUNvbnRlbnQgaW5jbHVzaW9uID0gKENNQ29udGVudCkgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTik7Ci0JCQkJaWYgKGluY2x1c2lvbiAhPSBudWxsKQotCQkJCQlpbmNsdXNpb25zLmFkZChpbmNsdXNpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmNsdXNpb25zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgZ2V0UGFyZW50KE5vZGUgdGFyZ2V0KSB7Ci0JCU5vZGUgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIChFbGVtZW50KSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZXh0cmFjdERlY2xhcmF0aW9ucyhIYXNodGFibGUgYXZhaWxhYmxlcywgQ01Hcm91cCBncm91cCkgewotCQlDTU5vZGVMaXN0IGNvbnRlbnQgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlDTU5vZGUgY21uID0gY29udGVudC5pdGVtKGkpOwotCQkJaWYgKGNtbiA9PSBudWxsIHx8IGNtbi5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJCWNvbnRpbnVlOwotCQkJYWRkSW5jbHVzaW9uKGF2YWlsYWJsZXMsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21uKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5N2Y1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgewotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhMGQ5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWxRdWVyeUNNUHJvdmlkZXIgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyCi0JICovCi0JcHVibGljIEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IEhUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcikpOwotCX0KLQotCS8vIE1JV0E6IFdlIGNhbm5vdCBjYWNoZSBhIENNRWxlbWVudERlY2xhcmF0aW9uIGFueSBtb3JlLiAgQmVjYXVzZSwgd2hlbiB0aGUgRE9DVFlQRQotCS8vIHdhcyBjaGFuZ2VkLCBDTURvY3VtZW50IHdvdWxkIGJlIGNoYW5nZWQuICBUaGVuLCBhIGNhY2hlZCBDTUVsZW1lbnREZWNsYXJhdGlvbgotCS8vIHdvdWxkIGJlIGludmFsaWQuICBJZiBzb21lIHBlcmZvcm1hbmNlIHByb2JsZW1zIG9jY3Vycywgd2UgY29uc2lkZXIgYSBzbWFydGVyCi0JLy8gY2FjaGUgbWVjaGFuaXNtLgotCS8vCi0JLy8JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCS8vCQkvLyBjaGVjayBpZiBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGNhY2hlZAotCS8vCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGVsZW1lbnQ7Ci0JLy8JCUVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JLy8JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JLy8JCQlyZXR1cm4gYWRhcHRlci5nZXREZWNsYXJhdGlvbigpOwotCS8vCi0JLy8JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBzdXBlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkvLwotCS8vCQkvLyBjYWNoZSBIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24gb25seQotCS8vCQlpZiAoZGVjbCAhPSBudWxsICYmIGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JLy8JCQlJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JLy8JCQlhZGFwdGVyID0gKEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQobm90aWZpZXIpOwotCS8vCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkvLwkJCQlhZGFwdGVyLnNldERlY2xhcmF0aW9uKGRlY2wpOwotCS8vCQl9Ci0JLy8KLQkvLwkJcmV0dXJuIGRlY2w7Ci0JLy8JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTZkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBYSFRNTCBkb2N1bWVudHMuCi0gKiAKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdCB3aWxsCi0gKiBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgc3RhdGljSFRNTCA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IHN0YXRpY0NIVE1MID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgZG9jdHlwZVJlZ2lzdHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGJ1ZGR5Q2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlciB4aHRtbGFzc29jID0gbnVsbDsKLQotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXhodG1sYXNzb2MgPSBuZXcgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLiBvciBudWxsIGlmIG5vCi0JICogQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlJRE9NRG9jdW1lbnQgb3duZXIgPSBnZXRPd25lclhNTERvY3VtZW50KG5vZGUpOwotCQlpZiAob3duZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBwaWQgPSBnZXRQdWJsaWNJZChvd25lcik7Ci0JCWlmIChwaWQgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCi0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IGRvY3R5cGVSZWdpc3RyeS5nZXRFbnRyeShwaWQpOwotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTAwMCAtIHVzZSBpbnRlcm5hbCBjb250ZW50IG1vZGVsCi0JCWlmIChlbnRyeS51c2VJbnRlcm5hbE1vZGVsKCkpIHsKLQkJCWlmIChwaWQgIT0gbnVsbCAmJiBwaWQuZXF1YWxzKEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5DSFRNTF9QVUJMSUNfSUQpKSB7Ci0JCQkJcmV0dXJuIHN0YXRpY0NIVE1MOwotCQkJfQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0JCX0KLQotCQlwaWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc2lkID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQotCQlDTURvY3VtZW50IGR0ZGNtID0geGh0bWxhc3NvYy5nZXRYSFRNTENNRG9jdW1lbnQocGlkLCBzaWQpOwotCQlpZiAoZHRkY20gPT0gbnVsbCkgewotCQkJaWYgKHBpZCAhPSBudWxsICYmIHBpZC5lcXVhbHMoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkNIVE1MX1BVQkxJQ19JRCkpIHsKLQkJCQlyZXR1cm4gc3RhdGljQ0hUTUw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdGljSFRNTDsKLQkJfQotCi0JCVN0cmluZyBncmFtbWFyVVJJID0geGh0bWxhc3NvYy5nZXRDYWNoZWRHcmFtbWVyVVJJKCk7Ci0JCUNNRG9jdW1lbnQgYnVkZHljbSA9IChDTURvY3VtZW50KSBidWRkeUNhY2hlLmdldChncmFtbWFyVVJJKTsKLQkJaWYgKGJ1ZGR5Y20gIT0gbnVsbCkKLQkJCXJldHVybiBidWRkeWNtOwotCi0JCWJ1ZGR5Y20gPSBuZXcgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtKGR0ZGNtLCBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCWJ1ZGR5Q2FjaGUucHV0KGdyYW1tYXJVUkksIGJ1ZGR5Y20pOwotCQlyZXR1cm4gYnVkZHljbTsKLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMKLQlwcml2YXRlIElET01Eb2N1bWVudCBnZXRPd25lclhNTERvY3VtZW50KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50IG93bmVyID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChvd25lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG93bmVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElET01Eb2N1bWVudCkgb3duZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGljSWQoSURPTURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2MuZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gKGRvY3R5cGUgIT0gbnVsbCkgPyBkb2N0eXBlLmdldFB1YmxpY0lkKCkgOiBkb2MuZ2V0RG9jdW1lbnRUeXBlSWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxZDhkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vdmFibGVNb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGFkZGVkIGFuZC9vciBtYWRlIHB1YmxpYyBzcGVjaWZpY2FsbHkgZm9yIGV4cGVyaW1lbnRhdGlvbi4gSXQKLSAqIHdpbGwgY2hhbmdlIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIEFQSS4gU2VlCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDg0Ci0gKi8KLSAKLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxRdWVyeUltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5SW1wbCBpbXBsZW1lbnRzIE1vdmFibGVNb2RlbFF1ZXJ5IHsKLQotCXByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgZkNhY2hlID0gbnVsbDsKLQlwcm90ZWN0ZWQgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NQcm92ID0gbnVsbDsKLQotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUltcGwoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBIVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoY2FjaGUsIGlkUmVzb2x2ZXIpKTsKLQkJZkNhY2hlID0gY2FjaGU7Ci0JCXhtbEFzc29jUHJvdiA9IG5ldyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlQ29udGVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMpIHsKLQkJTGlzdCBvcmlnaW5hbENhbmRpZGF0ZXMgPSBzdXBlci5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0JCWlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSA9PSAwKQotCQkJcmV0dXJuIG9yaWdpbmFsQ2FuZGlkYXRlczsKLQkJLy8gV2hlbiB0aGUgdGFyZ2V0IGRvY3VtZW50IGlzIFhIVE1MLCBpdCBpcyB3YXN0ZSB0byBmaW5kIGluY2x1c2lvbnMsCi0JCS8vIHNpbmNlIGluY2x1c2lvbiBpcyBhdmFpbGFibGUgaW4gSFRNTCBvbmx5LgotCQlpZiAoIWVkLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIG9yaWdpbmFsQ2FuZGlkYXRlczsKLQkJCi0JCUJvb2xlYW4gaXNYaHRtbCA9IEJvb2xlYW4uRkFMU0U7Ci0JCWlzWGh0bWwgPSAoQm9vbGVhbikgZWQuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCk7Ci0JCWlmIChpc1hodG1sICE9IG51bGwgJiYgaXNYaHRtbC5ib29sZWFuVmFsdWUoKSkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0KLQkJLy8gT0ssIHRoZSB0YXJnZXQgaXMgc3VyZWx5IGEgSFRNTCBlbGVtZW50LCBzbyBpdCBtYXkgaGF2ZSBpbmNsdXNpb24uCi0JCS8vIFRyeSB0byBmaW5kIGl0LgotCQlWZWN0b3IgY2FuZGlkYXRlcyA9IG5ldyBWZWN0b3Iob3JpZ2luYWxDYW5kaWRhdGVzKTsKLQotCQlzd2l0Y2ggKGVkLmdldENvbnRlbnRUeXBlKCkpIHsKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIDoKLQkJCQkvLyBkbyBlbnVtZXJhdGUgaW5jbHVzaW9ucy4KLQkJCQljYW5kaWRhdGVzLmFkZEFsbChITVFVdGlsLmdldEluY2x1c2lvbnMoZWxlbWVudCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBIDoKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCBub3QgYWRkIGFueSBpbmNsdXNpb25zLgotCQkJCS8vIHNvLCBub3RoaW5nIHRvIGRvIGhlcmUuCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBkb2VzIG5vdCBhdmFpbGFibGUsIGl0IGlzIGltcG9zc2libGUKLQkJLy8gdG8gZmlsdGVyIG91dCBleGNsdXNpb24uCi0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gY2FuZGlkYXRlczsKLQotCQkvLyBOb3csIHRoZSB0aW1lIHRvIGNoZWNrIGV4Y2x1c2lvbi4KLQkJVmVjdG9yIGNvbnRlbnQgPSBuZXcgVmVjdG9yKGNhbmRpZGF0ZXMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjYW5kaWRhdGUgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNhbmRpZGF0ZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGNhbmRpZGF0ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGlzRXhjbHVkZWQoY2FuZGlkYXRlLCBlbGVtZW50KSkKLQkJCQljb250aW51ZTsKLQkJCWNvbnRlbnQuYWRkKGNhbmRpZGF0ZSk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vdmFibGVNb2RlbFF1ZXJ5I3NldElkUmVzb2x2ZXIoSWRSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBuZXcgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotCi0JLy8gdXRpbGl0aWVzCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKENNRWxlbWVudERlY2xhcmF0aW9uIGNhbmRpZGF0ZSwgRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZCA9IGdldFByb2hpYml0ZWRBbmNlc3RvcnMoY2FuZGlkYXRlKTsKLQkJaWYgKHByb2hpYml0ZWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudCBwYXJlbnQgPSB0YXJnZXQ7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ01Ob2RlIHBkZWMgPSBwcm9oaWJpdGVkLmdldE5hbWVkSXRlbShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlpZiAocGRlYyAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJcGFyZW50ID0gZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjKSB7Ci0JCWlmICghZGVjLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01OYW1lZE5vZGVNYXApIGRlYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKTsKLQl9Ci0KLQkvKiBnZXQgYW4gYW5jZXN0b3IgZWxlbWVudCBpZ25vcmluZyBpbXBsaWNpdCBvbmVzLiAqLwotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KE5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIHAgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwICE9IG51bGwpIHsKLQkJCWlmIChwLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpZiAocCBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCWlmICgoKElET01FbGVtZW50KSBwKS5pc0ltcGxpY2l0VGFnKCkpIHsKLQkJCQkJCXAgPSBwLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAoRWxlbWVudCkgcDsKLQkJCX0KLQkJCXAgPSBwLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IHN1cGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAobnVsbCAhPSByZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkKLQkJcmV0dXJuIHhtbEFzc29jUHJvdi5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdjMjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MLgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgImZvcmNlcyIgYSBuZXcgb25lIHRvIGFsd2F5cyBiZSBjcmVhdGVkL3JldHVybmVkLCBub3QKLQkgKiAiY2FjaGVkIiBvbiB0aGUgbm9kZS4gVGhhdCBzZWVtcyBpbmNvcnJlY3QuIFNpbXBseSB1c2luZwotCSAqIHNob3VsZFJlZ2lzdGVyRmFsc2Ugc2hvdWxkIHdvcmssIGV4Y2VwdCwgdGhlcmUgbWlnaHQgaGF2ZSBiZWVuIG9uZQotCSAqIHRoZXJlIHRoYXQgc29tZW9uZSBlbHNlIGFscmVhZHkgZXhwbGljaXRseSBwdXQgdGhlcmUsIHNvIHRoaXMgaXMgb25seQotCSAqIHdheSBJIGtub3cgdG8gb3ZlcnJpZGUgdGhhdC4gRXNwZWNpYWxseSBjb21wbGljYXRlZCBoZXJlIHNpbmNlIGEgbnVtYmVyCi0JICogb2YgYWRhcHRlcnMgYXJlIGZvciBNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcy4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBhZGFwdE5ldyhvYmplY3QpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWRmNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuWE1MQ2F0YWxvZ0lkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgTW9kZWxRdWVyeUFkYXB0ZXIgZm9yIEhUTUwgbW9kZWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlNb2RlbFF1ZXJ5QWRhcHRlckltcGwgbW9kZWxRdWVyeUFkYXB0ZXI7Ci0JSVN0cnVjdHVyZWRNb2RlbCBtb2RlbFN0YXRlTm90aWZpZXI7Ci0JcHJpdmF0ZSBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQotCWNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkvLyBJU1NVRTogc2hvdWxkIHdlICJmcmVlemUiIHN0YXRlLCBvciBhbnl0aGluZz8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZnJlZXplIiBzdGF0ZSwgb3IgYW55dGhpbmc/Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gbm90aGluZyB0byBkbz8KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gbm90aGluZyB0byBkbz8KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCQltb2RlbFN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyID0gbmV3TW9kZWw7Ci0JCQl1cGRhdGVSZXNvbHZlcihtb2RlbFN0YXRlTm90aWZpZXIpOwotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQltb2RlbFF1ZXJ5QWRhcHRlci5zZXRJZFJlc29sdmVyKG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG1vZGVsLmdldFJlc29sdmVyKCkpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuIE5vdGU6IHRoaXMgaXMgYQotCSAqIGNhc2UgdGhlcmUgdGhlIGtleSBpcyBub3QgZXhhY3RseSBzYW1lIGFzIHRoZSBjbGFzcyB3ZSBhcmUgYWZ0ZXIuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBuZWVkIHRoaXMgcHJvdGVjdGVkIHZlcnNpb24gdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBwYXNzIHVwIHN0YW5kYXJkCi0JICogYmVoYXZpb3VyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0KLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAobW9kZWxTdGF0ZU5vdGlmaWVyICE9IG51bGwpIHsKLQkJCW1vZGVsU3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQl9Ci0KLQkJbW9kZWxTdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKiAKLQkgKiBYWFg6IHdlIG11c3QgbWFrZSB0aGlzIG1ldGhvZCBtb3JlIGluZGVwZW5kZW50IG9mICdsb2NhdGlvbicgKGF0IGxlYXN0Ci0JICogcHJvdmlkZSBzb21lIGZhbGwtYmFjayBtZXRob2QpLgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCi0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJCW1vZGVsU3RhdGVOb3RpZmllciA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQltb2RlbFN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCQlTdHJpbmcgbW9kZWxzQmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJaWYgKG1vZGVsc0Jhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBQYXRoKG1vZGVsc0Jhc2VMb2NhdGlvbikudG9GaWxlKCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQlJUGF0aCBkZXJpdmVkUGF0aCA9IG51bGw7Ci0JCQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJCQkJCWRlcml2ZWRQYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJZWxzZQotCQkJCQkJCWRlcml2ZWRQYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChiYXNlUGF0aCk7Ci0JCQkJCQlpZiAoZGVyaXZlZFBhdGggIT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGRlcml2ZWRQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyBiYXNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCQlDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBudWxsOwotCi0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCB8fCByZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG5ldyBIVE1MTW9kZWxRdWVyeUltcGwoY21Eb2N1bWVudENhY2hlLCBpZFJlc29sdmVyKTsKLQkJCQltb2RlbFF1ZXJ5LnNldEVkaXRNb2RlKE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQpOwotCQkJCW1vZGVsUXVlcnlBZGFwdGVyID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVySW1wbChjbURvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlcjsKLQl9Ci0KLQotCi0JcHJpdmF0ZSBmaW5hbCBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID0gbmV3IEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hIVE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTUwZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hIVE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlhNTEFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIENsYXNzIHRvIHByb3ZpZGUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBYSFRNTCBkb2N1bWVudHMgYW5kIERURHMgZm9yCi0gKiBYSFRNTC4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW4gSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLgotICovCi0vKgotICogVGhpcyBjbGFzcyBjbG9zZWx5IHJlc2VtYmxlIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLgotICovCi1jbGFzcyBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIHNldCBVU0VfUVVJQ0tfQ0FDSEUgdG8gZmFsc2UgdG8gdGVzdCBlZmZlY3RzIG9mIG5vdCBjYWNoaW5nIGF0IGFsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9RVUlDS19DQUNIRSA9IHRydWU7Ci0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZEdyYW1tZXJVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFB1YmxpY0lEOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTeXN0ZW1JRDsKLQlwcml2YXRlIGJvb2xlYW4gY2FjaGVkOwotCi0JcHVibGljIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY2FjaGUpOwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRYSFRNTENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaWYgKGlkUmVzb2x2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgZ3JhbW1lclVSSSA9IG51bGw7Ci0JCWlmIChVU0VfUVVJQ0tfQ0FDSEUpIHsKLQkJCS8qCi0JCQkgKiBJbiBwYXJzaW5nIGEgZG9jdW1lbnQsIHdlIGdldCBtYW55IGlkZW50aWNhbCByZXF1ZXN0cyB0byB0aGlzCi0JCQkgKiBtZXRob2QsIHNvIGluc3RlYWQgb2YgbG9va2luZyB1cCAocmVzb2x2aW5nKSBncmFtbWVyVVJJIGVhY2gKLQkJCSAqIHRpbWUsIHdlJ2xsIGp1c3QgcmV0dXJuIHByZXZpb3VzbHkgY2FjaGVkIG9uZS4gUHJvYmFibHkgbm90Ci0JCQkgKiB3b3J0aCBoYXZlIGEgbW9yZSBjb21wbGV4IGNhY2hlIHRoYW4gdGhhdC4KLQkJCSAqLwotCQkJaWYgKGNhY2hlZCAmJiBzYW1lQXMoZkNhY2hlZFB1YmxpY0lELCBwdWJsaWNJZCkgJiYgc2FtZUFzKGZDYWNoZWRTeXN0ZW1JRCwgc3lzdGVtSWQpKSB7Ci0JCQkJZ3JhbW1lclVSSSA9IGZDYWNoZWRHcmFtbWVyVVJJOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ3JhbW1lclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCWZDYWNoZWRHcmFtbWVyVVJJID0gZ3JhbW1lclVSSTsKLQkJCQlmQ2FjaGVkUHVibGljSUQgPSBwdWJsaWNJZDsKLQkJCQlmQ2FjaGVkU3lzdGVtSUQgPSBzeXN0ZW1JZDsKLQkJCQljYWNoZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZ3JhbW1lclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9Ci0KLQkJaWYgKGdyYW1tZXJVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8qCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODg5NgotCQkgKiAKLQkJICogV2Ugb25jZSBjYWxsZWQgdGhlIGRlcHJlY2F0ZWQgMiBhcmd1bWVudCBmb3JtIG9mIGdldENNRG9jdW1lbnQuCi0JCSAqIAotCQkgKiBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwKLQkJICogZ3JhbW1lclVSSSk7Ci0JCSAqIAotCQkgKiB3aGljaCBldmVudHVhbGx5IHJlc3VsdGVkIGluIGVtcHR5IHN0cmluZyBmb3IgdHlwZSwgd2hpY2ggSSBkb24ndAotCQkgKiB0aGluayB0aGUgaW5mcmFzdHJ1Y3R1cmUgaGFuZGxlcyBhbnkgbG9uZ2VyLiBTbywgSSBkZWxldGVkCi0JCSAqIGRlcHJlY2F0ZWQgbWV0aG9kcywgYW5kIHN3aXRjaGVkIHRvIG51bGwgZm9yIHR5cGUgYXJndW1lbnQuCi0JCSAqIAotCQkgKiAnbnVsbCcgbWVhbnMgdG8gImNyZWF0ZSBiYXNlZCBvbiB1cmkiLgotCQkgKiAKLQkJICogRllJLCAnZHRkJyB3b3VsZCBtZWFuIGxvYWQgb25seSB0aG9zZSByZWdpc3RlcmVkIGFzIGR0ZCdzCi0JCSAqIAotCQkgKiBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwKLQkJICogZ3JhbW1lclVSSSk7IENNRG9jdW1lbnQgY21Eb2N1bWVudCA9Ci0JCSAqIGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLCBncmFtbWVyVVJJLCAiZHRkIik7Ci0JCSAqLwotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgZ3JhbW1lclVSSSwgbnVsbCk7Ci0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBpZFJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2FtZUFzKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoYSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBiID09IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBhLmVxdWFscyhiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdAotCSAqIHdpbGwgY2hhbmdlIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIEFQSS4gU2VlCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA4NAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVkR3JhbW1lclVSSSgpIHsKLQkJcmV0dXJuIGZDYWNoZWRHcmFtbWVyVVJJOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDIxY2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBIVE1MIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQotCQkvLyBmb3JtYXR0aW5nIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZmFsc2UpOwotCQlub2RlLnB1dChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCAxKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTLCBmYWxzZSk7Ci0KLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJLy8gbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUywKLQkJLy8gdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmYWxzZSk7Ci0KLQkJLy8gY29kZSBnZW5lcmF0aW9uIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVmYXVsdEVuYyA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3lzdGVtRW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN5c3RlbUVuYyAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0RW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShzeXN0ZW1FbmMsICJVVEYtOCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZGVmYXVsdEVuYyk7Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2NzgzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29tbW9uIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IEhUTUwgY29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEhUTUwKLQkgKiBGaWxlIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgYmVmb3JlIGEgbGluZSBzcGxpdCBpcyBuZWVkZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgYmxhbmtzIGxpbmVzIHNob3VsZCBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nLgotCSAqIEJsYW5rIGxpbmVzIHdpbGwgYmUga2VwdCB3aGVuIGZhbHNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgI0lOREVOVEFUSU9OX0NIQVIgZm9yIDEgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fU0laRSA9ICJpbmRlbnRhdGlvblNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RBQiwgU1BBQ0V9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX0NIQVIgPSAiaW5kZW50YXRpb25DaGFyIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiB0YWIgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNTUEFDRQotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogc3BhY2UgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNUQUIKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZAotCSAqIChzcGxpdHRpbmcgZWFjaCBhdHRyIG9uIGEgbmV3IGxpbmUpLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX01VTFRJX0FUVFJTID0gInNwbGl0TXVsdGlBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZW1wdHkgZWxlbWVudHMgc2hvdWxkIGJlIGNvbXByZXNzZWQgZHVyaW5nCi0JICogY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1JFUVVJUkVEX0FUVFJTID0gImluc2VydFJlcXVpcmVkQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyB0YWdzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IGFsbCBsaW5lIGRlbGltaXRlcnMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGxpbmUgZGVsaW1pdGVyIHRvIHVzZSBkdXJpbmcgY2xlYW51cCBpZiBjb252ZXJ0aW5nIGxpbmUKLQkgKiBkZWxpbWl0ZXJzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtDUiwgQ1JMRiwgTEYsIE5PX1RSQU5TTEFUSU9OfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgY2FzZSB0byB1c2Ugb24gYWxsIHRhZyBuYW1lcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0xPV0VSLCBVUFBFUiwgQVNJU30KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9UQUdfTkFNRV9DQVNFID0gImNsZWFudXBUYWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGNhc2UgdG8gdXNlIG9uIGFsbCBhdHRyaWJ1dGUgbmFtZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtMT1dFUiwgVVBQRVIsIEFTSVN9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciB0YWcgbmFtZXMgaW4gY29kZSBnZW5lcmF0aW9uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtMT1dFUiwgVVBQRVJ9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FX0NBU0UgPSAidGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcnJlZCBtYXJrdXAgY2FzZSBmb3IgYXR0cmlidXRlIG5hbWVzIGluIGNvZGUgZ2VuZXJhdGlvbgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7TE9XRVIsIFVQUEVSfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0FTRSA9ICJhdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjVEFHX05BTUVfQ0FTRSBvciAjQVRUUl9OQU1FX0NBU0UuCi0JICogSW5kaWNhdGVzIHRvIGxlYXZlIGNhc2UgYXMgaXMuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNVUFBFUgotCSAqIEBzZWUgI1RBR19OQU1FX0NBU0UKLQkgKiBAc2VlICNBVFRSX05BTUVfQ0FTRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTSVMgPSAwOwotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNUQUdfTkFNRV9DQVNFIG9yICNBVFRSX05BTUVfQ0FTRS4KLQkgKiBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lIGxvd2VyY2FzZS4KLQkgKiAKLQkgKiBAc2VlICNBU0lTCi0JICogQHNlZSAjVVBQRVIKLQkgKiBAc2VlICNUQUdfTkFNRV9DQVNFCi0JICogQHNlZSAjQVRUUl9OQU1FX0NBU0UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT1dFUiA9IDE7Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI1RBR19OQU1FX0NBU0Ugb3IgI0FUVFJfTkFNRV9DQVNFLgotCSAqIEluZGljYXRlcyB0byBtYWtlIG5hbWUgdXBwZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjQVNJUwotCSAqIEBzZWUgI1RBR19OQU1FX0NBU0UKLQkgKiBAc2VlICNBVFRSX05BTUVfQ0FTRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQUEVSID0gMjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MNDBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MNDBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5NDRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTDQwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxDTVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5NmNkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0vKioKLSAqIEhUTUxDTVByb3BlcnRpZXMgZGVmaW5lcyBhbGwgcHJvcGVydHkgbmFtZXMgYW5kIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBIVE1MIENNLgotICogQWxsIG9mIHRob3NlIHByb3BlcnRpZXMgY2FuIGJlIHJldHJlaXZlZCBmcm9tIGVsZW1lbnQgZGVjbGFyYXRpb25zIG9mIEhUTUwgQ00KLSAqIHZpYSBDTU5vZGUjZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQ01Qcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqICJzaG91bGRJZ25vcmVDYXNlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfSUdOT1JFX0NBU0UgPSAic2hvdWxkSWdub3JlQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJzaG91bGRLZWVwU3BhY2UiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9LRUVQX1NQQUNFID0gInNob3VsZEtlZXBTcGFjZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpbmRlbnRDaGlsZFNvdXJjZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UgPSAic2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAidGVybWluYXRvcnMiIHJldHVybnMgamF2YS51dGlsLkl0ZXJhdG9yIChhbiBhcnJheSBvZiBTdHJpbmcgb2JqZWN0cykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTUlOQVRPUlMgPSAidGVybWluYXRvcnMiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiY29udGVudEhpbnQiIHJldHVybnMgQ01FbGVtZW50RGVjbGFyYXRpb24gaW5zdG5hY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ISU5UID0gImNvbnRlbnRIaW50IjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInByb2hpYml0ZWRBbmNlc3RvcnMiIHJldHVybnMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9ISUJJVEVEX0FOQ0VTVE9SUyA9ICJwcm9oaWJpdGVkQW5jZXN0b3JzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzSlNQIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19KU1AgPSAiaXNKU1AiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNYSFRNTCIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfWEhUTUwgPSAiaXNYSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc1NTSSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfU1NJID0gImlzU1NJIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImxpbmVCcmVha0hpbnQiIHJldHVybnMgU3RyaW5nIChvbmUgb2YgcHJlLWRlZmluZWQgdmFsdWVzIGluIFZhbHVlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9CUkVBS19ISU5UID0gImxpbmVCcmVha0hpbnQiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAibGF5b3V0VHlwZSIgcmV0dXJucyBTdHJpbmcgKG9uZSBvZiBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gVmFsdWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVFlQRSA9ICJsYXlvdXRUeXBlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInRhZ0luZm8iIHJldHVybnMgU3RyaW5nIChkb2N1bWVudGF0aW9uIGZvciB0aGlzIGVsZW1lbnQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0lORk8gPSAidGFnSW5mbyI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJvbWl0VHlwZSIgcmV0dXJucyBTdHJpbmcgKG9uZSBvZiBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gVmFsdWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX1RZUEUgPSAib21pdFR5cGUiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaW5jbHVzaW9uIiByZXR1cm5zIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVU0lPTiA9ICJpbmNsdXNpb24iOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNTY3JpcHRhYmxlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TQ1JJUFRBQkxFID0gImlzU2NyaXB0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbHVlcyB7Ci0JCS8qCi0JCSAqIGZvciBMSU5FX0JSRUFLX0hJTlQgPSAibGluZUJyZWFrSGludCIuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkVBS19OT05FID0gImJyZWFrTm9uZSI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkVBS19BRlRFUl9TVEFSVCA9ICJicmVha0FmdGVyU3RhcnQiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgPSAiYnJlYWtCZWZvcmVTdGFydEFuZEFmdGVyRW5kIjsvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGZvciBMQVlPVVRfVFlQRSA9ICJsYXlvdXRUeXBlIgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0JMT0NLID0gImxheW91dEJsb2NrIjsvLyROT04tTkxTLTEkCi0JCS8qKiBCUiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfQlJFQUsgPSAibGF5b3V0QnJlYWsiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIEhpZGRlbiBvYmplY3Q7IGxpa2UgSFRNTCBvciBIRUFEICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9ISURERU4gPSAibGF5b3V0SGlkZGVuIjsvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9OT05FID0gImxheW91dE5vbmUiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIE5vIHdyYXAgb2JqZWN0OyBsaWtlIElNRywgQVBQTEVULC4uLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfT0JKRUNUID0gImxheW91dE9iamVjdCI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfV1JBUCA9ICJsYXlvdXRXcmFwIjsvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGZvciBPTUlUX1RZUEUgPSAib21pdFR5cGUiCi0JCSAqLwotCQkvKiogTm90IG9tbWlzaWJsZS4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9OT05FID0gIm9taXROb25lIjsvLyROT04tTkxTLTEkCi0JCS8qKiBCb3RoIHRhZ3MgYXJlIG9tbWlzaWJsZS4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9CT1RIID0gIm9taXRCb3RoIjsvLyROT04tTkxTLTEkCi0JCS8qKiBUaGUgZW5kIHRhZyBpcyBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfRU5EID0gIm9taXRFbmQiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIFRoZSBlbmQgdGFnIGlzIG9tbWl0dGVkIHdoZW4gY3JlYXRlZC4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9FTkRfREVGQVVMVCA9ICJvbWl0RW5kRGVmYXVsdCI7Ly8kTk9OLU5MUy0xJAotCQkvKiogVGhlIGVuZCB0YWcgbXVzdCBiZSBvbWl0dGVkLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX0VORF9NVVNUID0gIm9taXRFbmRNdXN0IjsvLyROT04tTkxTLTEkCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJiNGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgbm90IHVzZWQgaW4gV1RQCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEZpbGVzUHJlZmVyZW5jZU5hbWVzIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TVUZGSVggPSAiZGVmYXVsdFN1ZmZpeCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9TVUZGSVggPSAiaHRtbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRE9DVU1FTlRfVFlQRSA9ICJnZW5lcmF0ZURvY3VtZW50VHlwZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfR0VORVJBVE9SID0gImdlbmVyYXRlR2VuZXJhdG9yIjsvLyROT04tTkxTLTEkCi0JLy8gYWRkZWQgdGhpcyBhcyBhIHBvdGVudGlhbCB3YXkgdG8gaGFuZGxlIGNoYW5naW5nCi0JLy8gcHJvZHVjdCBuYW1lcyAidXAiIHRoZSBzdGFjay4gTm90ZSwgbm90IGRlY2xhcmVkIGZpbmFsIAotCS8vIHRvIGF2b2lkIGdldHRpbmcgJ2lubGluZWQnIGJ5IGNvbXBpbGVyLgotCXN0YXRpYyBJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCS8vIFBsYXRmb3JtLmdldFByb2R1Y3QoKSBpcyBzcGVjJ2Qgc28gaXQgbWlnaHQgcmV0dXJuIG51bGwuCi0JLy8gSXRzIGV4cGVjdGVkIGZvciBhbnkgZmluYWwgcHJvZHVjdCBpdCB3b3VsZCBub3QgYmUsIHNvIHdlJ2xsIHJldHVybiAKLQkvLyAiV1RQIiBmb3IgZGV2ZWxvcG1lbnQvaW50ZXJpbSBidWlsZHMuIE5vIG5lZWQgdG8gdHJhbnNsYXRlLiAKLQlzdGF0aWMgU3RyaW5nIEdFTkVSQVRPUiA9IChwcm9kdWN0ID09IG51bGwpID8gIldUUCI6IHByb2R1Y3QuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTEZvcm1hdENvbnRyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZGU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTEZvcm1hdENvbnRyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBQbGVhc2UgdW4tZGVwcmVjYXRlIHRoaXMgaWYgUGFnZSBEZXNpZ25lciB0aGlua3MgdGhleSBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxGb3JtYXRDb250cmFpbnRzIGV4dGVuZHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCWludCBnZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzBjMjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9QcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VOYW1lcyB7Ci0KLQlTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWUVTID0gInllcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCi0KLQotCVN0cmluZyBTRVRUSU5HUyA9ICJzZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUUkVFVklFVyA9ICJ0cmVldmlldyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVGQVVMVF9ERVBUSCA9ICJkZWZhdWx0ZGVwdGgiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVNJUyA9ICJhcy1pcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVQUEVSID0gInVwcGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFBSRUZFUlJFRF9DQVNFID0gInByZWZlcnJlZC1jYXNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdOQU1FID0gInRhZ25hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJJQlVURU5BTUUgPSAiYXR0cmlidXRlbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTMwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0IHByb3RlY3RlZAotICogbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JIVE1MIHsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgbm90IGRlY2xhcmVkIGFzIGZpbmFsLAotCSAqIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9IVE1MID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9ySFRNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lIVE1MUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lIVE1MUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhODgyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSFRNTFBhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uCi0gKiB0eXBlcyBmb3IgSFRNTC4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQKLSAqIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhUTUxQYXJ0aXRpb25UeXBlcyB7Ci0KLQlTdHJpbmcgSFRNTF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9ERUNMQVJBVElPTiA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBIVE1MX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFNDUklQVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSVNTVUU6IEkgdGhpbmsgbWV0YSB0YWcgYXJlYXMgYXJlIGhlcmUgdG9vPwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTNkNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLklTdHJ1Y3R1cmVkVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLS8qKgotICogRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIEhUTUwuIENsaWVudC1zaWRlIHNjcmlwdHMgb2YgdHlwZSBKYXZhU2NyaXB0IGFyZQotICogcmVwb3J0ZWQgYXMgU1RfU0NSSVBULCBhbGwgb3RoZXJzIGZvciA8c2NyaXB0IGxhbmd1YWdlPSJmb28iIHR5cGU9ImZvbzIiPgotICogYXMgU0NSSVBULmxhbmd1YWdlOkZPTyBhbmQgU0NSSVBULnR5cGU6Rk9PMi4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04sIElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIElDU1NQYXJ0aXRpb25zLlNUWUxFfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU0NSSVBUX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzdHlwZSA9IGdldFNjcmlwdGluZ1BhcnRpdGlvblR5cGUobm9kZSk7Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgc3R5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVQYXJ0aXRpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCVN0cmluZyBsb2NhbFR5cGUgPSB0eXBlOwotCQlpZiAodHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbG9jYWxUeXBlID0gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShub2RlKTsKLQkJCX0KLQkJfQotCQlzdXBlci5zZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgbG9jYWxUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTY3JpcHRpbmdQYXJ0aXRpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29yZU5vZGUpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gY29yZU5vZGU7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBpc1ZhbGlkU2NyaXB0aW5nUmVnaW9uVHlwZShub2RlLmdldFR5cGUoKSkpIHsKLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPiA0ICYmIHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJSVRleHRSZWdpb24gcG90ZW50aWFsTGFuZ3VhZ2VSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCVN0cmluZyBwb3RlbnRpYWxMYW5ndWFnZVN0cmluZyA9IG5vZGUuZ2V0VGV4dChwb3RlbnRpYWxMYW5ndWFnZVJlZ2lvbik7Ci0JCQlpZiAocG90ZW50aWFsTGFuZ3VhZ2VTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCQlhdHRyTmFtZVJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBub2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQkJCQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSkpCi0JCQkJCQkJbGFuZ3VhZ2UgPSBTdHJpbmdVdGlscy5zdHJpcChub2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkpIHsKLQkJCQkJCQl0eXBlID0gU3RyaW5nVXRpbHMuc3RyaXAobm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQllbHNlIGlmIChsYW5ndWFnZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gbG9va3VwU2NyaXB0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU2NyaXB0aW5nUmVnaW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cFNjcmlwdFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKQotCQkJCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCArICIudHlwZS4iICsgdHlwZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBsb29rdXBTY3JpcHRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTLmxlbmd0aDsgaSsrKQotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZShsYW5ndWFnZSkpCi0JCQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUICsgIi5sYW5ndWFnZS4iICsgbGFuZ3VhZ2UudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVDsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikKLQkJCXJlc3VsdCA9IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFQ0xBUkFUSU9OOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCQotCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG5leHRFbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCi0JCUlUZXh0UmVnaW9uW10gcmVnaW9ucyA9IHByZXZpb3VzTm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJcHJldmlvdXNTdGFydFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZ2lvbnMgPSBuZXh0Tm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmV4dEVuZFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZihwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBudWxsIHx8IG5leHRFbmRUYWdOYW1lUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDsKLQkJCi0JCVN0cmluZyBuYW1lMSA9IHByZXZpb3VzTm9kZS5nZXRUZXh0KHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJU3RyaW5nIG5hbWUyID0gbmV4dE5vZGUuZ2V0VGV4dChuZXh0RW5kVGFnTmFtZVJlZ2lvbik7Ci0JCWlmIChuYW1lMS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCkpCi0JCQkvLwkJCXJldHVybiBTVF9TQ1JJUFQ7Ci0JCQlyZXR1cm4gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzTm9kZS5nZXRTdGFydE9mZnNldChwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbikpKTsKLQkJZWxzZSBpZiAobmFtZTEuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkKLQkJCXJldHVybiBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyB0YWduYW1lIHNob3VsZCBub3QgYmUgbnVsbCwKLQkJLy8gYnV0IHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkxMQotCQlpZiAodGFnbmFtZSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRVbmtub3duKCk7Ci0JCX0KLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpCi0JCQlyZXN1bHQgPSBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RFcnJvckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWI0ZDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVycm9ySW5mbyBpbXBsZW1lbnRzIEVycm9ySW5mbywgRXJyb3JTdGF0ZSB7Ci0KLQotCXByaXZhdGUgaW50IHN0YXRlID0gTk9ORV9FUlJPUjsKLQlwcml2YXRlIFNlZ21lbnQgc2VnID0gbnVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdEVycm9ySW5mbyhpbnQgc3RhdGUsIFNlZ21lbnQgc2VnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5zZWcgPSBzZWc7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRIaW50KCk7Ci0KLQlhYnN0cmFjdCBwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpOwotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAoc2VnID09IG51bGwpID8gMCA6IHNlZy5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIChzZWcgPT0gbnVsbCkgPyAwIDogc2VnLmdldE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ01VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ01VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWYyZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NNVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LkhNUVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1maW5hbCBjbGFzcyBDTVV0aWwgewotCi0JLyoqCi0JICogTmV2ZXIgaW5zdGFudGlhdGUhCi0JICovCi0JcHJpdmF0ZSBDTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogWW91IGNhbm5vdCBhbHdheXMgcmV0cmlldmUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiB2aWEgYW4gRWxlbWVudCBpbnN0YW5jZS4KLQkgKiBCZWNhdXNlLCBpdCBvY2Nhc2lvbmFsbHkgYSBKU1AgY3VzdG9tIHRhZy4gLS0gOS83LzIwMDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCXJldHVybiBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gISgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZChDTUNvbnRlbnQgY29udGVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gdGFyZ2V0KSB7Ci0JCXN3aXRjaCAoY29udGVudC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNvbnRlbnQpKQotCQkJCQlpZiAoaXNDaGlsZCgoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50KS5nZXRDb250ZW50KCksIHRhcmdldCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50LCB0YXJnZXQpOwotCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKSkKLQkJCQkJCQkJaWYgKGlzQ2hpbGQoKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpLmdldENvbnRlbnQoKSwgdGFyZ2V0KSkKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJCQlpZiAoaXNDaGlsZCgoQ01Db250ZW50KSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJfQotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5kVGFnT21pc3NpYmxlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCEoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgb21pdFR5cGUgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJcmV0dXJuICFvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaG9sZVRhZ09taXNzaWJsZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG9taXRUeXBlID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCXJldHVybiBvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHRvIGRpc3Rpbmd1aXNoIEhUTUwgYW5kIFhIVE1MIGZyb20gb3RoZXIgbWFyayB1cC4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcywKLQkgKiAoMSkgbm90IEpTUCwKLQkgKiAoMikgbm90IFNTSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJcmV0dXJuICghaXNKU1AoZGVjbCkpICYmICghaXNTU0koZGVjbCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lRGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gYURlYywgQ01FbGVtZW50RGVjbGFyYXRpb24gb3RoZXJEZWMpIHsKLQkJcmV0dXJuIGFEZWMuZ2V0RWxlbWVudE5hbWUoKSA9PSBvdGhlckRlYy5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NTSShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjKSB7Ci0JCWlmIChlZGVjID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGVkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHRoaXMgbWV0aG9kIG9ubHkgd2hlbiB0aGUgcGFyZW50IGNvbnRlbnQgdHlwZSBpcyBvbmUgb2YKLQkgKiB0aGUgZm9sbG93aW5nOiBBTlksIEVMRU1FTlQsIG9yIE1JWEVELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2hpbGQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzSFRNTChwYXJlbnQpICYmICghaXNIVE1MKGNoaWxkKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJQ01Db250ZW50IGNvbnRlbnQgPSBwYXJlbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNDaGlsZChjb250ZW50LCBjaGlsZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9yZWlnbihFbGVtZW50IHRhcmdldCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQlyZXR1cm4gIWVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCSAqICgxKSB2YWx1ZSB0eXBlIGlzIEVOVU0sCi0JICogKDIpIG9ubHkgb25lIHZhbHVlIGlzIGRlZmluZWQgaW4gdGhlIGVudW1lcmF0aW9uLAotCSAqICgzKSB0aGUgdmFsdWUgaGFzIHNhbWUgbmFtZSB0byB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm9vbGVhbkF0dHIoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjKSB7Ci0JCUNNRGF0YVR5cGUgYXR0cnR5cGUgPSBhZGVjLmdldEF0dHJUeXBlKCk7Ci0JCWlmIChhdHRydHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXR0cnR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkgIT0gQ01EYXRhVHlwZS5FTlVNKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBhdHRydHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2YWx1ZXNbMF0uZXF1YWxzKGFkZWMuZ2V0QXR0ck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJbmNsdXNpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgRWxlbWVudCBwYXJlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IEhNUVV0aWwuZ2V0SW5jbHVzaW9ucyhwYXJlbnQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gaW5jbHVzaW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbihkZWNsLCBpbmNsdXNpb24pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQyMTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Db21wb3NpdGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JcHJvdGVjdGVkIFZlY3RvciBjb21wb25lbnRzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogQ29tcG9zaXRlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCi0JCUl0ZXJhdG9yIGkgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVmFsaWRhdGlvbkFkYXB0ZXIgY29tcG9uZW50ID0gKFZhbGlkYXRpb25BZGFwdGVyKSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaSA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0aW9uQ29tcG9uZW50IGNvbXBvbmVudCA9IChWYWxpZGF0aW9uQ29tcG9uZW50KSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC52YWxpZGF0ZShub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgYWRkKFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yKSB7Ci0JCWNvbXBvbmVudHMuYWRkKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGFsbCBjb21wb25lbnRzIGluICd2YWxpZGF0b3JzJy4KLQkgKiBFYWNoIGRlcml2YXRpdmUgbXVzdCBjYWxsIHRoaXMgbWV0aGlkIGluIGl0cyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh2YWxpZGF0b3JzW2ldICE9IG51bGwpCi0JCQkJYWRkKHZhbGlkYXRvcnNbaV0pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI3YTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciB7Ci0KLQotCXByaXZhdGUgVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IgPSBuZXcgSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yKCk7Ci0JcHJpdmF0ZSBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IgcHJvcGFnYXRlZSA9IG5ldyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKTsKLQotCXB1YmxpYyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlnZXRQcm9wYWdhdGVlKCkuc2V0UmVwb3J0ZXIodGhpcy5yZXBvcnRlcik7Ci0JCXN1cGVyLnZhbGlkYXRlKG5vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuY2xhc3MgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJdmFsaWRhdG9yLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJcHJvcGFnYXRlZS5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpIHsKLQkJcmV0dXJuIHByb3BhZ2F0ZWU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRpb25BZGFwdGVyIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0VsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0VsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjgzNzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yID0gbmV3IEhUTUxTaW1wbGVWYWxpZGF0b3IoKTsKLQotCXB1YmxpYyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmNsYXNzIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCXZhbGlkYXRvci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25BZGFwdGVyIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI0MzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWludGVyZmFjZSBFcnJvckluZm8gewotCi0JcHVibGljIFN0cmluZyBnZXRIaW50KCk7Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpOwotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKTsKLQotCXB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mb0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMjZjMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotZmluYWwgY2xhc3MgRXJyb3JJbmZvSW1wbCBleHRlbmRzIEFic3RyYWN0RXJyb3JJbmZvIHsKLQotCXByaXZhdGUgTm9kZSB0YXJnZXQgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBTZWdtZW50IHNlZyA9IG51bGw7Ci0JLyoqCi0JICovCi0JcHVibGljIEVycm9ySW5mb0ltcGwoaW50IHN0YXRlLCBTZWdtZW50IGVycm9yU2VnLCBOb2RlIHRhcmdldCkgewotCQlzdXBlcihzdGF0ZSwgZXJyb3JTZWcpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhpbnQoKSB7Ci0JCXN3aXRjaCAodGFyZ2V0LmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0JCQkJc3dpdGNoIChnZXRTdGF0ZSgpKSB7Ci0JCQkJCWNhc2UgVU5ERUZJTkVEX1ZBTFVFX0VSUk9SIDoKLQkJCQkJY2FzZSBNSVNNQVRDSEVEX1ZBTFVFX0VSUk9SIDoKLQkJCQkJY2FzZSBVTkNMT1NFRF9BVFRSX1ZBTFVFIDoKLQkJCQkJCS8vRDIxMDQyMgotCQkJCQkJcmV0dXJuICgoQXR0cikgdGFyZ2V0KS5nZXRWYWx1ZSgpOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXJldHVybiB0YXJnZXQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gKChUZXh0KSB0YXJnZXQpLmdldERhdGEoKTsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRhcmdldC5nZXROb2RlTmFtZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKSB7Ci0JCXJldHVybiB0YXJnZXQuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9yU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvclN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjU5NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9yU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWludGVyZmFjZSBFcnJvclN0YXRlIHsKLQlzdGF0aWMgZmluYWwgaW50IE5PTkVfRVJST1IgPSAwOwotCS8vIGdlbmVyaWMgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRF9OQU1FX0VSUk9SID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfVkFMVUVfRVJST1IgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfVkFMVUVfRVJST1IgPSAxMzsKLQkvLyBmb3JtYXQgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FUlJPUl9MRVZFTCA9IDEwMDsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTkFNRV9FUlJPUiA9IDEwMTsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ0hBUl9FUlJPUiA9IDEwMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfRVJST1IgPSAxMDM7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNNQVRDSEVEX0VORF9UQUdfRVJST1IgPSAxMDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiA9IDEwNTsKLQlzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfRU5EX1RBR19FUlJPUiA9IDEwNjsKLQlzdGF0aWMgZmluYWwgaW50IFVOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IgPSAxMDc7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FUVFJfRVJST1IgPSAxMDg7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0RJUkVDVElWRV9FUlJPUiA9IDEwOTsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX1RBR19FUlJPUiA9IDExMDsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX0VORF9UQUdfRVJST1IgPSAxMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHID0gMTEyOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5DTE9TRURfQVRUUl9WQUxVRSA9IDExMzsgLy9EMjEwNDIyCi0JLy8gbGF5b3V0IGVycm9yCi0Jc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRVJST1JfTEVWRUwgPSAxMDAwOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9DT05URU5UX0VSUk9SID0gMTAwMTsKLQlzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9FUlJPUiA9IDEwMDI7Ci0Jc3RhdGljIGZpbmFsIGludCBDT0VYSVNURU5DRV9FUlJPUiA9IDEwMDM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0ZNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0ZNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY5ODRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9GTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotZmluYWwgY2xhc3MgRk1VdGlsIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19OT05FID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfV0hPTEVfVEFHID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfU1RBUlRfVEFHID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfRU5EX1RBRyA9IDM7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEZNVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFNlZ21lbnQgZ2V0U2VnbWVudChJRE9NTm9kZSB0YXJnZXQsIGludCBzZWdUeXBlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU2VnbWVudCgwLCAwKTsKLQkJU2VnbWVudCBzZWcgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBudWxsOwotCQlzd2l0Y2ggKHNlZ1R5cGUpIHsKLQkJCWNhc2UgU0VHX1dIT0xFX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQllbmRUYWcgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZywgZW5kVGFnKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IHRhcmdldC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gdGFyZ2V0LmdldEVuZE9mZnNldCgpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0VHX1NUQVJUX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudCh0YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfRU5EX1RBRyA6Ci0JCQkJZW5kVGFnID0gdGFyZ2V0LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChlbmRUYWcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQodGFyZ2V0LmdldEVuZE9mZnNldCgpLCAwKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNFR19OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBuZXcgU2VnbWVudCgwLCAwKTsKLQkJfQotCQlyZXR1cm4gc2VnOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MQXR0cmlidXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjU4MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotcHVibGljIGNsYXNzIEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVHSU9OX05BTUUgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUdJT05fVkFMVUUgPSAyOwotCS8vIDw8RDIxMDQyMgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7Ci0KLQkvLyBEMjEwNDIyCi0JLyoqCi0JICogSFRNTEF0dHJpYnV0ZVZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MQXR0cmlidXRlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU2VnbWVudCBnZXRFcnJvclNlZ21lbnQoSURPTU5vZGUgZXJyb3JOb2RlLCBpbnQgcmVnaW9uVHlwZSkgewotCQlJVGV4dFJlZ2lvbiByZ24gPSBudWxsOwotCQlzd2l0Y2ggKHJlZ2lvblR5cGUpIHsKLQkJCWNhc2UgUkVHSU9OX05BTUUgOgotCQkJCXJnbiA9IGVycm9yTm9kZS5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl9WQUxVRSA6Ci0JCQkJcmduID0gZXJyb3JOb2RlLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyZ24gIT0gbnVsbCkgewotCQkJaWYgKGVycm9yTm9kZSBpbnN0YW5jZW9mIElET01BdHRyKSB7Ci0JCQkJSURPTUVsZW1lbnQgb3duZXJFbGVtZW50ID0gKElET01FbGVtZW50KSAoKElET01BdHRyKSBlcnJvck5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWlmIChvd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZ24pOwotCQkJCQlpbnQgcmVnaW9uTGVuZ3RoID0gcmduLmdldExlbmd0aCgpOwotCQkJCQlyZXR1cm4gbmV3IFNlZ21lbnQocmVnaW9uU3RhcnRPZmZzZXQsIHJlZ2lvbkxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2VnbWVudChlcnJvck5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEF0dHJpYnV0ZVZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChDTVV0aWwuaXNGb3JlaWduKHRhcmdldCkpCi0JCQlyZXR1cm47Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGVkZWMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ01OYW1lZE5vZGVNYXAgZGVjbGFyYXRpb25zID0gZWRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpbnQgcmduVHlwZSA9IFJFR0lPTl9OQU1FOwotCQkJaW50IHN0YXRlID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQkJQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkvLyBEMjAzNjM3OyBJZiB0aGUgdGFyZ2V0IGF0dHIgaGFzIHByZWZpeCwgdGhlIHZhbGlkYXRvciBzaG91bGQKLQkJCS8vIG5vdAotCQkJLy8gd2FybiBhYm91dCBpdC4gVGhhdCBpcywganVzdCBpZ25vcmUuIEl0IGlzIGFibGUgdG8gY2hlY2sKLQkJCS8vIHdoZXRoZXIKLQkJCS8vIGFuIGF0dHIgaGFzIHByZWZpeCBvciBub3QgYnkgY2FsbGluZyBYTUxBdHRyI2lzR2xvYmFsQXR0cigpLgotCQkJLy8gV2hlbiBhIGF0dHIgaGFzIHByZWZpeCAobm90IGdsb2JhbCksIGl0IHJldHVybnMgZmFsc2UuCi0JCQlib29sZWFuIGlzWE1MQXR0ciA9IGEgaW5zdGFuY2VvZiBJRE9NQXR0cjsKLQkJCWlmIChpc1hNTEF0dHIpIHsKLQkJCQlJRE9NQXR0ciB4bWxhdHRyID0gKElET01BdHRyKSBhOwotCQkJCWlmICgheG1sYXR0ci5pc0dsb2JhbEF0dHIoKSkKLQkJCQkJY29udGludWU7IC8vIHNraXAgZnV0aGVyIHZhbGlkYXRpb24gYW5kIGJlZ2luIG5leHQgbG9vcC4KLQkJCX0KLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9ucy5nZXROYW1lZEl0ZW0oYS5nZXROYW1lKCkpOwotCQkJaWYgKGFkZWMgPT0gbnVsbCkgewotCQkJCS8vIE5vIGF0dHIgZGVjbGFyYXRpb24gd2FzIGZvdW5kLiBUaGF0IGlzLCB0aGUgYXR0ciBuYW1lIGlzCi0JCQkJLy8gdW5kZWZpbmVkLgotCQkJCS8vIGJ1dCBub3QgcmVnYXJkIGl0IGFzIHVuZGVmaW5lZCBuYW1lIGlmIGl0IGluY2x1ZGVzIEpTUAotCQkJCWlmIChoYXNKU1BSZWdpb24oKChJRE9NTm9kZSkgYSkuZ2V0TmFtZVJlZ2lvbigpKSkgewotCQkJCQlyZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkRFRklORURfTkFNRV9FUlJPUjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBUaGUgYXR0ciBkZWNsYXJhdGlvbiB3YXMgZm91bmQuCi0JCQkJLy8gQXQgMXN0LCB0aGUgbmFtZSBzaG91bGQgYmUgY2hlY2tlZC4KLQkJCQlpZiAoQ01VdGlsLmlzSFRNTChlZGVjKSAmJiAoIUNNVXRpbC5pc1hIVE1MKGVkZWMpKSkgewotCQkJCQkvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgcHVyZSBIVE1MIChub3QgWEhUTUwpLCBzb21lCi0JCQkJCS8vIGF0dHJpYnV0ZXMKLQkJCQkJLy8gbWlnaHQgYmUgd3JpdHRlbiBpbiBib29sZWFuIGZvcm1hdC4gSXQgc2hvdWxkIGJlIGNoZWNrCi0JCQkJCS8vIHNwZWNpZmljYWxseS4KLQkJCQkJaWYgKENNVXRpbC5pc0Jvb2xlYW5BdHRyKGFkZWMpICYmICgoSURPTUF0dHIpIGEpLmhhc05hbWVPbmx5KCkpCi0JCQkJCQljb250aW51ZTsgLy8gT0ssIGtlZXAgZ29pbmcuIE5vIG1vcmUgY2hlY2sgaXMgbmVlZGVkCi0JCQkJCS8vIGFnYWluc3QgdGhpcyBhdHRyLgotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gSWYgdGhlIHRhcmdldCBpcyBvdGhlciB0aGFuIHB1cmUgSFRNTCAoSlNQIG9yIFhIVE1MKSwKLQkJCQkJLy8gdGhlIG5hbWUKLQkJCQkJLy8gbXVzdCBiZSBjaGVja2VkIGV4YWN0bHkgKGllIGluIGNhc2Ugc2Vuc2l0aXZlIHdheSkuCi0JCQkJCVN0cmluZyBhY3R1YWwgPSBhLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIGRlc2lyZWQgPSBhZGVjLmdldEF0dHJOYW1lKCk7Ci0JCQkJCWlmICghYWN0dWFsLmVxdWFscyhkZXNpcmVkKSkgeyAvLyBjYXNlIG1pc21hdGNoCi0JCQkJCQlyZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuTUlTTUFUQ0hFRF9FUlJPUjsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBUaGVuLCB0aGUgdmFsdWUgbXVzdCBiZSBjaGVja2VkLgotCQkJCWlmIChzdGF0ZSA9PSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsgLy8gTmVlZCBtb3JlIGNoZWNrLgotCQkJCQkvLyBOb3csIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2hlY2tlZCwgaWYgdGhlIHR5cGUgaXMgRU5VTS4KLQkJCQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGFkZWMuZ2V0QXR0clR5cGUoKTsKLQkJCQkJU3RyaW5nIGFjdHVhbFZhbHVlID0gYS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCkgewotCQkJCQkJLy8gQ2hlY2sgRklYRUQgdmFsdWUuCi0JCQkJCQlTdHJpbmcgdmFsaWRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQkJaWYgKCFhY3R1YWxWYWx1ZS5lcXVhbHModmFsaWRWYWx1ZSkpIHsKLQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkRFRklORURfVkFMVUVfRVJST1I7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmdbXSBjYW5kaWRhdGVzID0gYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJCQkJaWYgKGNhbmRpZGF0ZXMgIT0gbnVsbCAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkvLyBzZXZlcmFsIGNhbmRpZGF0ZXMgYXJlIGZvdW5kLgotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2FuZGlkYXRlcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJCQkJU3RyaW5nIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXNbaW5kZXhdOwotCQkJCQkJCQkvLyBBdCAxc3QsIGNvbXBhcmUgaWdub3JpbmcgY2FzZS4KLQkJCQkJCQkJaWYgKGFjdHVhbFZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoY2FuZGlkYXRlKSkgewotCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJaWYgKENNVXRpbC5pc0Nhc2VTZW5zaXRpdmUoZWRlYykgJiYgKCFhY3R1YWxWYWx1ZS5lcXVhbHMoY2FuZGlkYXRlKSkpIHsKLQkJCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5NSVNNQVRDSEVEX1ZBTFVFX0VSUk9SOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7IC8vIGV4aXQgdGhlIGxvb3AuCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJCQkvLyBObyBjYW5kaWRhdGUgd2FzIGZvdW5kLiBUaGF0IGlzLAotCQkJCQkJCQkvLyBhY3R1YWxWYWx1ZSBpcyBpbnZhbGlkLgotCQkJCQkJCQkvLyBidXQgbm90IHJlZ2FyZCBpdCBhcyB1bmRlZmluZWQgdmFsdWUgaWYgaXQKLQkJCQkJCQkJLy8gaW5jbHVkZXMgSlNQLgotCQkJCQkJCQlpZiAoaGFzSlNQUmVnaW9uKCgoSURPTU5vZGUpIGEpLmdldFZhbHVlUmVnaW9uKCkpKSB7Ci0JCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlVOREVGSU5FRF9WQUxVRV9FUlJPUjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyA8PEQyMTA0MjIKLQkJCQlpZiAoc3RhdGUgPT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7IC8vIE5lZWQgbW9yZSBjaGVjay4KLQkJCQkJaWYgKGlzWE1MQXR0cikgewotCQkJCQkJU3RyaW5nIHNvdXJjZSA9ICgoSURPTUF0dHIpIGEpLmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJY2hhciBmaXJzdENoYXIgPSBzb3VyY2UuY2hhckF0KDApOwotCQkJCQkJCWNoYXIgbGFzdENoYXIgPSBzb3VyY2UuY2hhckF0KHNvdXJjZS5sZW5ndGgoKSAtIDEpOwotCQkJCQkJCWlmIChpc1F1b3RlKGZpcnN0Q2hhcikgfHwgaXNRdW90ZShsYXN0Q2hhcikpIHsKLQkJCQkJCQkJaWYgKGxhc3RDaGFyICE9IGZpcnN0Q2hhcikgewotCQkJCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkNMT1NFRF9BVFRSX1ZBTFVFOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEQyMTA0MjIKLQkJCX0KLQkJCWlmIChzdGF0ZSAhPSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsKLQkJCQlTZWdtZW50IHNlZyA9IGdldEVycm9yU2VnbWVudCgoSURPTU5vZGUpIGEsIHJnblR5cGUpOwotCQkJCWlmIChzZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IEVycm9ySW5mb0ltcGwoc3RhdGUsIHNlZywgYSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNKU1BSZWdpb24oSVRleHRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb250YWluZXIpLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgKGlzTmV4dGVkVGFnTmFtZShyZWdpb25UeXBlKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIC8qKgotICAgICAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLSAgICAgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbiAibmVzdGVkQ29udGV4dCIuCi0gICAgICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV4dGVkVGFnTmFtZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfT1BFTik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gPDxEMjE0MDIyCi0JcHJpdmF0ZSBib29sZWFuIGlzUXVvdGUoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA9PSBTSU5HTEVfUVVPVEUpIHx8IChjID09IERPVUJMRV9RVU9URSk7Ci0JfQotCS8vIEQyMTA0MjIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2ZTZkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgRGl2aXNpb24gewotCQlwcml2YXRlIFZlY3RvciBleHBsaWNpdEh0bWxzID0gbmV3IFZlY3RvcigpOwotCQlwcml2YXRlIFZlY3RvciByZXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCXB1YmxpYyBEaXZpc2lvbihEb2N1bWVudCBkb2N1bWVudCwgTm9kZUxpc3QgY2hpbGRyZW4pIHsKLQkJCVN0cmluZyByb290VGFnTmFtZSA9IGdldFJvb3RUYWdOYW1lKGRvY3VtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChpc0h0bWxUYWcoY2hpbGQsIHJvb3RUYWdOYW1lKSkgewotCQkJCQlleHBsaWNpdEh0bWxzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzRXhwbGljaXRIdG1scygpIHsKLQkJCXJldHVybiBleHBsaWNpdEh0bWxzLnNpemUoKSA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRFeHBsaWNpdEh0bWxzKCkgewotCQkJcmV0dXJuIGV4cGxpY2l0SHRtbHM7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgZ2V0UmVzdE5vZGVzKCkgewotCQkJcmV0dXJuIHJlc3QuaXRlcmF0b3IoKTsKLQkJfQotCi0JCS8qIHV0aWxpdGllcyAqLwotCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbFRhZyhOb2RlIG5vZGUsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKEVsZW1lbnQpIG5vZGUpLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJvb3RUYWdOYW1lKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgKChJRE9NRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gYWRhcHRlci5nZXREb2N1bWVudFR5cGUoKTsKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NUeXBlLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJLy8gaXNGcmFnbWVudCBjaGVjayBzaG91bGQgYmUgbW9yZSBpbnRlbGxpZ2VudC4KLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gdHJ1ZTsKLQotCQlEb2N1bWVudCB0YXJnZXQgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gdGFyZ2V0LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRGl2aXNpb24gZGl2aXNpb24gPSBuZXcgRGl2aXNpb24odGFyZ2V0LCBjaGlsZHJlbik7Ci0JCWlmIChkaXZpc2lvbi5oYXNFeHBsaWNpdEh0bWxzKCkpIHsKLQkJCWlzRnJhZ21lbnQgPSBmYWxzZTsKLQotCQkJTGlzdCBleHBsaWNpdHMgPSBkaXZpc2lvbi5nZXRFeHBsaWNpdEh0bWxzKCk7Ci0JCQlpZiAoZXhwbGljaXRzLnNpemUoKSA+IDEpIHsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGV4cGxpY2l0cy5zaXplKCk7IGkrKykgewotCQkJCQlFbGVtZW50IGh0bWwgPSAoRWxlbWVudCkgZXhwbGljaXRzLmdldChpKTsKLQkJCQkJLy8gcmVwb3J0IGVycm9yIChkdXBsaWNhdGUpCi0JCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCgoSURPTU5vZGUpIGh0bWwsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChFcnJvclN0YXRlLkRVUExJQ0FURV9FUlJPUiwgZXJyb3JTZWcsIGh0bWwpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZhbGlkYXRlQ29udGVudChkaXZpc2lvbi5nZXRSZXN0Tm9kZXMoKSwgaXNGcmFnbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZHMgdmFsaWRhdGUgbm9kZXMgb3RoZXIgdGhhbiBIVE1MIGVsZW1lbnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbnRlbnQoSXRlcmF0b3IgY2hpbGRyZW4sIGJvb2xlYW4gaXNGcmFnbWVudCkgewotCQlib29sZWFuIGZvdW5kRG9jdHlwZSA9IGZhbHNlOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0JCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgY2hpbGRyZW4ubmV4dCgpOwotCi0JCQlpbnQgZXJyb3IgPSBFcnJvclN0YXRlLk5PTkVfRVJST1I7Ci0JCQlpbnQgc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCi0JCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQkJaWYgKCFpc0ZyYWdtZW50KSB7Ci0JCQkJCQlFbGVtZW50IGNoaWxkRWxlbSA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbihjaGlsZEVsZW0pOwotCQkJCQkJLy8gVW5kZWZpbmVkIGVsZW1lbnQgaXMgdmFsaWQuCi0JCQkJCQlpZiAoY2VkID09IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQkvLyBKU1AgKGluY2x1ZGVzIGN1c3RvbSB0YWdzKSBhbmQgU1NJIGFyZSB2YWxpZC4KLQkJCQkJCWlmIChDTVV0aWwuaXNGb3JlaWduKGNoaWxkRWxlbSkgfHwgQ01VdGlsLmlzU1NJKGNlZCkpCi0JCQkJCQkJY29udGludWU7IC8vIERlZmVjdCAxODY3NzQKLQotCQkJCQkJLy8gcmVwb3J0IGVycm9yIChpbnZhbGlkIGNvbnRlbnQpCi0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJLy8gbWFyayB0aGUgd2hvbGUgc3RhcnQgdGFnIGFzIGVycm9yLgotCQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfU1RBUlRfVEFHOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCQlpZiAoIWlzRnJhZ21lbnQpIHsKLQkJCQkJCS8vIFRFWFQgbm9kZSBpcyB2YWxpZCB3aGVuIGl0IGNvbnRhaW5zIHdoaXRlIHNwYWNlCi0JCQkJCQkvLyBjaGFyYWN0ZXJzIG9ubHkuCi0JCQkJCQkvLyBPdGhlcndpc2UsIGl0IGlzIGludmFsaWQgY29udGVudC4KLQkJCQkJCWlmICgoKElET01UZXh0KSBjaGlsZCkuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJCS8vIERPQ1RZUEUgaXMgYWxzbyB2YWxpZCB3aGVuIGl0IGFwcGVhcnMgb25jZSBhbmQgb25seQotCQkJCQkvLyBvbmNlLgotCQkJCQlpZiAoIWZvdW5kRG9jdHlwZSkgewotCQkJCQkJZm91bmREb2N0eXBlID0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5EVVBMSUNBVEVfRVJST1I7Ci0JCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQkJLy8gYWx3YXlzIHZhbGlkLgotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCQljb250aW51ZTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKCFpc0ZyYWdtZW50KSB7Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGVycm9yICE9IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgewotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChjaGlsZCwgc2VnVHlwZSk7Ci0JCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCXJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBFcnJvckluZm9JbXBsKGVycm9yLCBlcnJvclNlZywgY2hpbGQpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlNWUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGV4Y2x1c2lvbiB3aGljaCBpcyBkZWZpbmVkIGluIG9ubHkgSFRNTCBEVEQgKFNHTUwpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlFbGVtZW50IHRhcmdldCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoQ01VdGlsLmlzRm9yZWlnbih0YXJnZXQpKQotCQkJcmV0dXJuOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGRlYyA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBjYW5ub3QgdmFsaWRhdGUuCi0JCWlmICghQ01VdGlsLmlzSFRNTChkZWMpKQotCQkJcmV0dXJuOyAvLyBubyBuZWVkIHRvIHZhbGlkYXRlCi0JCWlmICghZGVjLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpKQotCQkJcmV0dXJuOyAvLyBjYW5ub3QgdmFsaWRhdGUuCi0JCUNNTmFtZWROb2RlTWFwIHByb2hpYml0ZWQgPSAoQ01OYW1lZE5vZGVNYXApIGRlYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKTsKLQkJaWYgKHByb2hpYml0ZWQuZ2V0TGVuZ3RoKCkgPD0gMCkKLQkJCXJldHVybjsgLy8gbm8gcHJvaGliaXRlZCBhbmNlc3RvcnMuCi0KLQkJRWxlbWVudCBwYXJlbnQgPSBTTVV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCUNNTm9kZSBwZGVjID0gcHJvaGliaXRlZC5nZXROYW1lZEl0ZW0ocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJaWYgKHBkZWMgIT0gbnVsbCkgeyAvLyBwcm9oaWJpdGVkIGVsZW1lbnQgaXMgZm91bmQgaW4gYW5jZXN0b3JzLgotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCgoSURPTU5vZGUpIG5vZGUsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IEVycm9ySW5mb0ltcGwoRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1IsIGVycm9yU2VnLCB0YXJnZXQpKSk7Ci0JCQkJYnJlYWs7IC8vIElmIG9uZSBwcm9oaWJpdGVkIGFuY2VzdG9yIGlzIGZvdW5kLCBpdCdzIGVub3VnaC4KLQkJCX0KLQkJCXBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWMwODM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlFbGVtZW50IHRhcmdldCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoQ01VdGlsLmlzRm9yZWlnbih0YXJnZXQpKQotCQkJcmV0dXJuOwotCi0JCXZhbGlkYXRlQ29udGVudCh0YXJnZXQsIHRhcmdldC5nZXRDaGlsZE5vZGVzKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbnRlbnQoRWxlbWVudCBwYXJlbnQsIE5vZGVMaXN0IGNoaWxkcmVuKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJLy8gcGVyZm9ybSBhY3R1YWwgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVOb2RlKHBhcmVudCwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBpbnQgY291bnRFeHBsaWNpdFNpYmxpbmdzKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgdGFnTmFtZSkgewotCS8vIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkvLyBpbnQgY291bnQgPSAwOwotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCS8vIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCS8vIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCS8vIGNvbnRpbnVlOwotCS8vIGlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChFbGVtZW50KSBjaGlsZCkuZ2V0VGFnTmFtZSgpKSkgewotCS8vIGNvdW50Kys7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gY291bnQ7Ci0JLy8gfQotCi0JLyoKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgcHJhY3RpY2FsIGJ1dCBhY2N1cmF0ZS4KLQkgKiBUaGUgYWNjdXJhdGUgbWF4aW11bSBvY2N1cmVuY2Ugc2hvdWxkIGJlIHJldHJlaXZlIGZyb20gdGhlIGNvbnRlbnQKLQkgKiBtb2RlbC4gSG93ZXZlciwgaXQgaXMgdXNlZnVsIGVub3VnaCwgc2luY2UgYWxtb3N0IGltcGxpY2l0IGVsZW1lbnRzIGFyZQotCSAqIEhUTUwsIEhFQUQsIG9yIEJPRFkuCi0JICovCi0JLy8gcHJpdmF0ZSBpbnQgZ2V0TWF4T2NjdXIoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBjaGlsZFRhZykgewotCS8vIHJldHVybiAxOwotCS8vIH0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVOb2RlKEVsZW1lbnQgdGFyZ2V0LCBOb2RlIGNoaWxkKSB7Ci0JCS8vIE5PVEU6IElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyAnVU5LTk9XTicsIHRoYXQgaXMsIGl0IGhhcyBubwotCQkvLyBlbGVtZW50IGRlY2xhcmF0aW9uLCB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBlbGVtZW50IHNob3VsZCBiZQotCQkvLyByZWdhcmRlZCBhcyAnQU5ZJy4gLS0gOS8xMC8yMDAxCi0JCWludCBjb250ZW50VHlwZSA9IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudFR5cGUgPSBlZGVjLmdldENvbnRlbnRUeXBlKCk7Ci0KLQkJaW50IGVycm9yID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQlpbnQgc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCi0JCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJRWxlbWVudCBjaGlsZEVsZW0gPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQkJLy8gRGVmZWN0IDIwMDMyMToKLQkJCQkvLyBUaGlzIHZhbGlkYXRvciBjYXJlcyBvbmx5IEhUTUwvWEhUTUwgZWxlbWVudHMuIElmIGEgY2hpbGQKLQkJCQkvLyBpcwotCQkJCS8vIGFuIGVsZW1lbnQgb2YgZm9yZWlnbiBtYXJrdXAgbGFuZ3VhZ2VzLCBqdXN0IGlnbm9yZSBpdC4KLQkJCQlpZiAoQ01VdGlsLmlzRm9yZWlnbihjaGlsZEVsZW0pKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjZWQgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24oKEVsZW1lbnQpIGNoaWxkKTsKLQkJCQkvLyBEZWZlY3QgMTg2Nzc0OiBJZiBhIGNoaWxkIGlzIG5vdCBvbmUgb2YgSFRNTCBlbGVtZW50cywKLQkJCQkvLyBpdCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYSB2YWxpZCBjaGlsZCByZWdhcmRsZXNzIHRoZQotCQkJCS8vIHR5cGUgb2YgdGhlIHBhcmVudCBjb250ZW50IG1vZGVsLiAtLSAxMC8xMi8yMDAxCi0JCQkJaWYgKGNlZCA9PSBudWxsIHx8IENNVXRpbC5pc1NTSShjZWQpIHx8ICghQ01VdGlsLmlzSFRNTChjZWQpKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJc3dpdGNoIChjb250ZW50VHlwZSkgewotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSA6Ci0JCQkJCQkvLyBLZWVwIGdvaW5nLgotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIDoKLQkJCQkJCWlmIChjZWQgPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlpZiAoQ01VdGlsLmlzVmFsaWRDaGlsZChlZGVjLCBjZWQpKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCS8vIE5vdywgaXQgaXMgdGhlIHRpbWUgdG8gY2hlY2sgaW5jbHVzaW9uLCB1bmxlc3MgdGhlCi0JCQkJCQkvLyB0YXJnZXQKLQkJCQkJCS8vIGRvY3VtZW50IGlzIG5vdCBhIFhIVE1MLgotCQkJCQkJaWYgKCFDTVV0aWwuaXNYSFRNTChlZGVjKSkgewotCQkJCQkJCS8vIHB1cmUgSFRNTAotCQkJCQkJCWlmIChDTVV0aWwuaXNWYWxpZEluY2x1c2lvbihjZWQsIHRhcmdldCkpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIE1hcmsgdGhlIHdob2xlIFNUQVJUIHRhZyBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1NUQVJUX1RBRzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXN3aXRjaCAoY29udGVudFR5cGUpIHsKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBIDoKLQkJCQkJCS8vIEQxODQzMzkKLQkJCQkJCS8vIEtlZXAgZ29pbmcuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkgOgotCQkJCQkJaWYgKCgoSURPTVRleHQpIGNoaWxkKS5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIE1hcmsgdGhlIHdob2xlIG5vZGUgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCWlmIChjb250ZW50VHlwZSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuOwotCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgbm9kZSBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgbm9kZSBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoZXJyb3IgIT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7Ci0JCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoKElET01Ob2RlKSBjaGlsZCwgc2VnVHlwZSk7Ci0JCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChlcnJvciwgZXJyb3JTZWcsIGNoaWxkKSkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhOTM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IgZXh0ZW5kcyBDb21wb3NpdGVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0aW9uQ29tcG9uZW50WzJdOwotCi0JCXZhbGlkYXRvcnNbMF0gPSBuZXcgSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzFdID0gbmV3IFN5bnRheFZhbGlkYXRvcigpOwotCi0JCXJlZ2lzdGVyKHZhbGlkYXRvcnMpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJhNWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBIVE1MU2ltcGxlVmFsaWRhdG9yIGV4dGVuZHMgQ29tcG9zaXRlVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxTaW1wbGVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFNpbXBsZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0aW9uQ29tcG9uZW50WzVdOwotCi0JCXZhbGlkYXRvcnNbMF0gPSBuZXcgSFRNTEF0dHJpYnV0ZVZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzFdID0gbmV3IEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzJdID0gbmV3IFN5bnRheFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzNdID0gbmV3IEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IoKTsKLQkJdmFsaWRhdG9yc1s0XSA9IG5ldyBOYW1lc3BhY2VWYWxpZGF0b3IoKTsKLQotCQlyZWdpc3Rlcih2YWxpZGF0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MU2ltcGxlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTA4ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKFZhbGlkYXRpb25BZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdGFyZ2V0OwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotCQkJCXJldHVybiBuZXcgRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpOwotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIG5ldyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBuZXcgTnVsbFZhbGlkYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgT2JqZWN0J3MgY2xvbmUoKSBtZXRob2QKLQkgKiBUaGlzIGlzIHVzZWQgaW4gSU1vZGVsTWFuYWdlcidzIElTdHJ1Y3R1cmVkTW9kZWwgY29weWluZy4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01lc3NhZ2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwYjUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIE1lc3NhZ2VGYWN0b3J5IGltcGxlbWVudHMgRXJyb3JTdGF0ZSB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVycm9yVGFibGUgewotCQlwcml2YXRlIGNsYXNzIFBhY2tldCB7Ci0JCQlwdWJsaWMgUGFja2V0KFN0cmluZyBtc2csIGludCBzZXZlcml0eSkgewotCQkJCXRoaXMubXNnID0gbXNnOwotCQkJCXRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCQkJcmV0dXJuIHNldmVyaXR5OwotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyBtc2cgPSBudWxsOwotCQkJcHJpdmF0ZSBpbnQgc2V2ZXJpdHkgPSAtMTsKLQkJfQotCi0JCXB1YmxpYyBFcnJvclRhYmxlKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHV0KGludCBzdGF0ZSwgU3RyaW5nIG1zZywgaW50IHNldmVyaXR5KSB7Ci0JCQlQYWNrZXQgcGFja2V0ID0gbmV3IFBhY2tldChtc2csIHNldmVyaXR5KTsKLQkJCW1hcC5wdXQobmV3IEludGVnZXIoc3RhdGUpLCBwYWNrZXQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKGludCBzdGF0ZSkgewotCQkJcmV0dXJuIGdldFBhY2tldChzdGF0ZSkuZ2V0TWVzc2FnZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTZXZlcml0eShpbnQgc3RhdGUpIHsKLQkJCXJldHVybiBnZXRQYWNrZXQoc3RhdGUpLmdldFNldmVyaXR5KCk7Ci0JCX0KLQotCQlwcml2YXRlIFBhY2tldCBnZXRQYWNrZXQoaW50IHN0YXRlKSB7Ci0JCQlyZXR1cm4gKFBhY2tldCkgbWFwLmdldChuZXcgSW50ZWdlcihzdGF0ZSkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludGVyZmFjZSBOb2RlVHlwZSB7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFID0gMDsKLQkJc3RhdGljIGZpbmFsIGludCBFTEVNRU5UID0gMTsKLQkJc3RhdGljIGZpbmFsIGludCBET0NVTUVOVF9UWVBFID0gMjsKLQkJc3RhdGljIGZpbmFsIGludCBURVhUID0gMzsKLQkJc3RhdGljIGZpbmFsIGludCBDT01NRU5UID0gNDsKLQkJc3RhdGljIGZpbmFsIGludCBDREFUQV9TRUNUSU9OID0gNTsKLQkJc3RhdGljIGZpbmFsIGludCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OID0gNjsKLQkJc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVGRVJFTkNFID0gNzsKLQotCQlzdGF0aWMgZmluYWwgaW50IE1BWF9UWVBFID0gODsKLQl9Ci0KLQkvLyBlcnJvciBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTk9fRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLk5vX2Vycm9yX19VSV87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkRFRklORURfQVRUUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVW5kZWZpbmVkX2F0dHJpYnV0ZV9uYW1lX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ERUZJTkVEX1ZBTFVFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5VbmRlZmluZWRfYXR0cmlidXRlX3ZhbHVlX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19EVVBMSUNBVEVfQVRUUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuTXVsdGlwbGVfdmFsdWVzX3NwZWNpZmllZF9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTTUFUQ0hFRF9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZV9fXzBfX191c2VzX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0FUVFJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfYXR0cmlidXRlX25hbWVfX18wX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0FUVFJfTk9fVkFMVUVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfYXR0cmlidXRlX19fMF9fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfbG9jYXRpb25fb2ZfdGFnX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkR1cGxpY2F0ZV90YWdfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU1NJTkdfU1RBUlRfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Ob19zdGFydF90YWdfX19fMF9fX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTU0lOR19FTkRfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Ob19lbmRfdGFnX19fX18wX19fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5FbmRfdGFnX19fX18wX19fX25vdF9uZWVkZV9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkRFRklORURfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Vbmtub3duX3RhZ19fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlRhZ19uYW1lX19fMF9fX3VzZXNfd3JvbmdfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX3RhZ19uYW1lX19fMF9fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0RJUkVDVElWRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9KU1BfZGlyZWN0aXZlX19fMF9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9URVhUX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX3RleHRfc3RyaW5nX19fMF9fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0NIQVJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOS05PV05fRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlVua25vd25fZXJyb3JfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX1NUQVJUX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuU3RhcnRfdGFnX19fXzBfX19fbm90X2Nsb3NfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfRU5EX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuRW5kX3RhZ19fX19fMF9fX19ub3RfY2xvc2VfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTTUFUQ0hFRF9BVFRSX1ZBTFVFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5BdHRyaWJ1dGVfdmFsdWVfX18wX19fdXNlc19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9DT01NRU5UX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Db21tZW50X25vdF9jbG9zZWRfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0RPQ1RZUEVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkRPQ1RZUEVfZGVjbGFyYXRpb25fbm90X2NsX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX1BJX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Qcm9jZXNzaW5nX2luc3RydWN0aW9uX25vdF9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9DREFUQV9TRUNUSU9OX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5DREFUQV9zZWN0aW9uX25vdF9jbG9zZWRfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfRU1QVFlfRUxFTUVOVF9UQUcgPSBIVE1MQ29yZU1lc3NhZ2VzLl9FUlJPUl9UYWdfX18wX19fc2hvdWxkX2JlX2FuX2VtcHR5X2VsZW1lbnRfdGFnXzE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9BVFRSX1ZBTFVFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5fRVJST1JfQXR0cmlidXRlX3ZhbHVlX19fMF9fX25vdF9jbG9zZWRfXzE7Ci0JcHJpdmF0ZSBzdGF0aWMgRXJyb3JUYWJsZVtdIGVyclRhYmxlcyA9IG5ldyBFcnJvclRhYmxlW05vZGVUeXBlLk1BWF9UWVBFXTsKLQotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgTm9kZVR5cGUuTUFYX1RZUEU7IGkrKykgewotCQkJZXJyVGFibGVzW2ldID0gbmV3IEVycm9yVGFibGUoKTsKLQkJfQotCQkvLyBOT1RFOiBUaGUgc2V2ZXJpdGllcyBhcmUganVzdCBzdHViLiAgVGhleSBtdXN0IGJlIHJldmlld2VkLgotCQkvLyAtLSA4LzMwLzIwMDEKLQotCQkvLyBhdHRyaWJ1dGUgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgYXR0clRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkFUVFJJQlVURV07Ly8gc2hvcnQgaGFuZAotCQlhdHRyVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCWF0dHJUYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfQVRUUl9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWF0dHJUYWJsZS5wdXQoVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBNU0dfVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJYXR0clRhYmxlLnB1dChNSVNNQVRDSEVEX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9BVFRSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJYXR0clRhYmxlLnB1dChJTlZBTElEX05BTUVfRVJST1IsIE1TR19JTlZBTElEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KElOVkFMSURfQVRUUl9FUlJPUiwgTVNHX0FUVFJfTk9fVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9BVFRSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJYXR0clRhYmxlLnB1dChNSVNNQVRDSEVEX1ZBTFVFX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9BVFRSX1ZBTFVFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCS8vPDxEMjEwNDIyCi0JCWF0dHJUYWJsZS5wdXQoVU5DTE9TRURfQVRUUl9WQUxVRSwgTVNHX1VOQ0xPU0VEX0FUVFJfVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQkvL0QyMTA0MjIKLQkJLy8gZWxlbWVudCBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBlbGVtVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuRUxFTUVOVF07Ly8gc2hvcnQgaGFuZAotCQllbGVtVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCWVsZW1UYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChJTlZBTElEX05BTUVfRVJST1IsIE1TR19JTlZBTElEX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQllbGVtVGFibGUucHV0KE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWVsZW1UYWJsZS5wdXQoTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJZWxlbVRhYmxlLnB1dChNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiwgTVNHX01JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWVsZW1UYWJsZS5wdXQoSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IsIE1TR19JTlZBTElEX0RJUkVDVElWRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQllbGVtVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWVsZW1UYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWVsZW1UYWJsZS5wdXQoQ09FWElTVEVOQ0VfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQllbGVtVGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX1NUQVJUX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQllbGVtVGFibGUucHV0KFVOQ0xPU0VEX0VORF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgTVNHX0lOVkFMSURfRU1QVFlfRUxFTUVOVF9UQUcsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCi0JCS8vIGRvY3VtZW50IHR5cGUgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgZG9jVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuRE9DVU1FTlRfVFlQRV07Ly8gc2hvcnQgaGFuZAotCQlkb2NUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJZG9jVGFibGUucHV0KERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJZG9jVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWRvY1RhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9ET0NUWVBFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0KLQkJLy8gdGV4dCBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSB0ZXh0VGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuVEVYVF07Ci0JCXRleHRUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJdGV4dFRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX1RFWFRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQl0ZXh0VGFibGUucHV0KElOVkFMSURfQ0hBUl9FUlJPUiwgTVNHX0lOVkFMSURfQ0hBUl9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0KLQkJLy8gY29tbWVudCBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBjb21tVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ09NTUVOVF07Ci0JCWNvbW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJY29tbVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQljb21tVGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0NPTU1FTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQotCQkvLyBjZGF0YSBzZWN0aW9uIGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGNkYXRUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJY2RhdFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQljZGF0VGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWNkYXRUYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfQ0RBVEFfU0VDVElPTl9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCi0JCS8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgcGlUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OXTsKLQkJcGlUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJcGlUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJcGlUYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfUElfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQotCQkvLyBlbnRpdHkgcmVmZXJlbmNlIGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGVyVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRV07Ci0JCWVyVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCWVyVGFibGUucHV0KFVOREVGSU5FRF9OQU1FX0VSUk9SLCBNU0dfVU5ERUZJTkVEX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWVyVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uTWVzc2FnZSBjcmVhdGVNZXNzYWdlKEVycm9ySW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBlcnJvck1zZyA9IGdldEVycm9yTWVzc2FnZShpbmZvKTsKLQkJaW50IGVycm9yU2V2ZXJpdHkgPSBnZXRFcnJvclNldmVyaXR5KGluZm8pOwotCQlyZXR1cm4gbmV3IFZhbGlkYXRpb25NZXNzYWdlKGVycm9yTXNnLCBpbmZvLmdldE9mZnNldCgpLCBpbmZvLmdldExlbmd0aCgpLCBlcnJvclNldmVyaXR5KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKEVycm9ySW5mbyBpbmZvKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gZ2V0RXJyb3JUYWJsZShpbmZvLmdldFRhcmdldFR5cGUoKSk7Ci0JCWlmICh0YWIgPT0gbnVsbCkKLQkJCXJldHVybiBNU0dfVU5LTk9XTl9FUlJPUjsKLQotCQlTdHJpbmcgdGVtcGxhdGUgPSB0YWIuZ2V0TWVzc2FnZShpbmZvLmdldFN0YXRlKCkpOwotCQlPYmplY3RbXSBhcmd1bWVudHMgPSB7aW5mby5nZXRIaW50KCl9OwotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzID0gTkxTLmJpbmQodGVtcGxhdGUsIGFyZ3VtZW50cyk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcyA9IHRlbXBsYXRlICsgIjoiICsgYXJndW1lbnRzLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RXJyb3JTZXZlcml0eShFcnJvckluZm8gaW5mbykgewotCQlFcnJvclRhYmxlIHRhYiA9IGdldEVycm9yVGFibGUoaW5mby5nZXRUYXJnZXRUeXBlKCkpOwotCQlpZiAodGFiID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHRhYi5nZXRTZXZlcml0eShpbmZvLmdldFN0YXRlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVycm9yVGFibGUgZ2V0RXJyb3JUYWJsZShzaG9ydCBub2RldHlwZSkgewotCQlFcnJvclRhYmxlIHRhYiA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZXR5cGUpIHsKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0JCQkJdGFiID0gZXJyVGFibGVzW05vZGVUeXBlLkFUVFJJQlVURV07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuRUxFTUVOVF07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuRE9DVU1FTlRfVFlQRV07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuVEVYVF07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ09NTUVOVF07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ0RBVEFfU0VDVElPTl07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRV07Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTVmNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL05hbWVzcGFjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTE5TX1BSRUZJWCA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOU19TRVBBUkFUT1IgPSAiOiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5hbWVzcGFjZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gTmFtZXNwYWNlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKGlzWE1MRWxlbWVudCh0YXJnZXQpICYmIGhhc1Vua25vd25QcmVmaXgodGFyZ2V0KSkgewotCQkJSURPTUVsZW1lbnQgZSA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQkJaWYgKCFpc1ZhbGlkUHJlZml4KGUuZ2V0UHJlZml4KCksIHRhcmdldCkgJiYgIWUuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkvLyByZXBvcnQgdW5rbm93biB0YWcgZXJyb3IuCi0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGUsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IEVycm9ySW5mb0ltcGwoVU5ERUZJTkVEX05BTUVfRVJST1IsIGVycm9yU2VnLCBlKSkpOwotCQkJfQotCQl9Ci0JCS8vICgyKSBjaGVjayBwcmVmaXggb2YgZWFjaCBhdHRyIAotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0YXJnZXQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoIShuIGluc3RhbmNlb2YgSURPTUF0dHIpKQotCQkJCWNvbnRpbnVlOwotCQkJSURPTUF0dHIgYSA9IChJRE9NQXR0cikgbjsKLQkJCVN0cmluZyBwcmVmaXggPSBhLmdldFByZWZpeCgpOwotCQkJaWYgKChwcmVmaXggIT0gbnVsbCkgJiYgaXNVbmtub3duQXR0cihhLCB0YXJnZXQpKSB7Ci0JCQkJLy8gVGhlIGF0dHIgaGFzIHVua25vd24gcHJlZml4LiAgU28sIGNoZWNrIGl0LgotCQkJCWlmICghaXNWYWxpZFByZWZpeChwcmVmaXgsIHRhcmdldCkpIHsKLQkJCQkJLy8gcmVwb3J0IHVua25vd24gYXR0ciBlcnJvci4KLQkJCQkJSVRleHRSZWdpb24gciA9IGEuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQlpZiAociA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWludCBhX29mZnNldCA9IGEuZ2V0TmFtZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWludCBhX2xlbmd0aCA9IGEuZ2V0TmFtZVJlZ2lvbigpLmdldExlbmd0aCgpOwotCQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChVTkRFRklORURfTkFNRV9FUlJPUiwgbmV3IFNlZ21lbnQoYV9vZmZzZXQsIGFfbGVuZ3RoKSwgYSkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMJCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MRWxlbWVudChFbGVtZW50IHRhcmdldCkgewotCQlyZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Vua25vd25QcmVmaXgoRWxlbWVudCB0YXJnZXQpIHsKLQkJcmV0dXJuIGlzVW5rbm93bkVsZW1lbnQodGFyZ2V0KSAmJiBDTVV0aWwuaXNGb3JlaWduKHRhcmdldCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5rbm93bkVsZW1lbnQoRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCXJldHVybiBkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmtub3duQXR0cihJRE9NQXR0ciBhdHRyLCBFbGVtZW50IHRhcmdldCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGRlYyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHVua25vd24uCi0JCUNNTmFtZWROb2RlTWFwIGFkZWNscyA9IGRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhZGVjbHMuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGFkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFByZWZpeChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJaWYgKHByZWZpeC5lcXVhbHMoWE1MTlNfUFJFRklYKSkKLQkJCXJldHVybiB0cnVlOyAvLyAieG1sbnM6Zm9vIiBhdHRyIGlzIGFsd2F5cyB2YWxpZC4KLQotCQkvLyAoMSkgY2hlY2sgdGhlIGVsZW1lbnQgaGFzIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCWlmIChpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChwcmVmaXgsIGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gKDIpIGNoZWNrIGFuY2VzdG9ycyBvZiB0aGUgZWxlbWVudCBoYXZlIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCUVsZW1lbnQgcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQoZSk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KHByZWZpeCwgcGFyZW50KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJU3RyaW5nIG5zID0gWE1MTlNfUFJFRklYICsgTlNfU0VQQVJBVE9SICsgcHJlZml4OwotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKG4gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChucy5lcXVhbHMoKChBdHRyKSBuKS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL051bGxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9OdWxsVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWY5M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL051bGxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLS8qKgotICogTnVsbFZhbGlkYXRvciBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBhIHJlcGxhY2VtZW50IG9mIG51bGwKLSAqIGZvciBWYWxpZGF0aW9uQ29tcG9uZW50IHR5cGUuCi0gKi8KLWZpbmFsIGNsYXNzIE51bGxWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uQ29tcG9uZW50IHsKLQotCXB1YmxpYyBOdWxsVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ByaW1lVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZjI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotYWJzdHJhY3QgY2xhc3MgUHJpbWVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uQ29tcG9uZW50IHsKLQotCS8qKgotCSAqIFByaW1lVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByaW1lVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU01VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU01VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZjZmZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NNVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1maW5hbCBjbGFzcyBTTVV0aWwgewotCi0JcHJpdmF0ZSBTTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogZ2V0IGFuIGFuY2VzdG9yIGVsZW1lbnQgaWdub3JpbmcgaW1wbGljaXQgb25lcy4gKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChOb2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBwID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocCAhPSBudWxsKSB7Ci0JCQlpZiAocC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcmV0dXJuIChFbGVtZW50KSBwOwotCQkJfQotCQkJcCA9IHAuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU2VnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmZDM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBTZWdtZW50IHsKLQotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTZWdtZW50KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTZWdtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub2Zmc2V0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXRoaXMubGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIE5PVEU6ICdzdGFydCcgYW5kICdlbmQnIG11c3QgYmUgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGNvbnRpZ3VvdXMgcmVnaW9ucy4KLQkgKiBPdGhlcndpc2UsIHRoaXMgY2xhc3MgY2Fubm90IHdvcmsgY29ycmVjdGx5LgotCSAqLwotCXB1YmxpYyBTZWdtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub2Zmc2V0ID0gc3RhcnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZE9mZnNldCA9IChlbmQgPT0gbnVsbCkgPyBzdGFydC5nZXRFbmRPZmZzZXQoKSA6IGVuZC5nZXRFbmRPZmZzZXQoKTsKLQkJdGhpcy5sZW5ndGggPSBlbmRPZmZzZXQgLSB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvL3B1YmxpYyBTZWdtZW50KElUZXh0UmVnaW9uIHN0YXJ0LCBJVGV4dFJlZ2lvbiBlbmQpIHsKLQkvLwlzdXBlcigpOwotCS8vCXRoaXMub2Zmc2V0ID0gc3RhcnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkvLwlpbnQgZW5kT2Zmc2V0ID0gKGVuZCA9PSBudWxsKSA/IHN0YXJ0LmdldEVuZE9mZnNldCgpIDogZW5kLmdldEVuZE9mZnNldCgpOwotCS8vCXRoaXMubGVuZ3RoID0gZW5kT2Zmc2V0IC0gdGhpcy5vZmZzZXQ7Ci0JLy99Ci0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNmFjOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1N5bnRheFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIFN5bnRheFZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIGltcGxlbWVudHMgRXJyb3JTdGF0ZSB7Ci0KLQotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFJlZ2lvbihJVGV4dFJlZ2lvbiByZ24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZ24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBubyB0eXBlIGlzIGludmFsaWQuCi0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldFRhZ05hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWcpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWcuZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciBpdGVyID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJnbiA9IChJVGV4dFJlZ2lvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmduLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkKLQkJCQlyZXR1cm4gdGFnLmdldFRleHQocmduKTsKLQkJfQotCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUNvbnRlbnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlyZXR1cm4gKGRlY2wgIT0gbnVsbCkgJiYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JcHVibGljIFN5bnRheFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gU3ludGF4VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQljbGFzcyBFbGVtZW50SW5mbyB7Ci0JCXB1YmxpYyBFbGVtZW50SW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSURPTUVsZW1lbnQgdGFyZ2V0ID0gbnVsbDsKLQkJcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBudWxsOwotCQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZyA9IG51bGw7Ci0JCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IG51bGw7Ci0JCXB1YmxpYyBib29sZWFuIGhhc1N0YXJ0VGFnID0gZmFsc2U7Ci0JCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZyA9IGZhbHNlOwotCQlwdWJsaWMgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSkgewotCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5kZXhlZE5vZGU7Ci0JCXZhbGlkYXRlQ2hpbGRyZW4obm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybjsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW5mbyBpbmZvID0gbmV3IEVsZW1lbnRJbmZvKCk7Ci0JCWluZm8udGFyZ2V0ID0gKElET01FbGVtZW50KSBub2RlOwotCi0JCS8vIGdhdGhlciBpbmZvcm1hdGlvbiB0byB2YWxpZGF0ZSBmcm9tIHRhcmdldCBhdCBvbmNlLgotCQlnZXRJbmZvKGluZm8pOwotCi0JCWlmIChpbmZvLnRhcmdldC5pc0dsb2JhbFRhZygpKSB7Ci0JCQl2YWxpZGF0ZVRhZ3MoaW5mbyk7Ci0JCQl2YWxpZGF0ZU5hbWVzKGluZm8pOwotCQkJaWYgKGluZm8uZGVjbCAhPSBudWxsICYmIGluZm8uaXNYSFRNTCkgewotCQkJCXZhbGlkYXRlVGFnQ2FzZShpbmZvKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRJbmZvKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaW5mby5kZWNsID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKGluZm8udGFyZ2V0KTsKLQkJaW5mby5zdGFydFRhZyA9IGluZm8udGFyZ2V0LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWluZm8uZW5kVGFnID0gaW5mby50YXJnZXQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJaW5mby5oYXNTdGFydFRhZyA9IChpbmZvLnN0YXJ0VGFnICE9IG51bGwpOwotCQlpbmZvLmhhc0VuZFRhZyA9IChpbmZvLmVuZFRhZyAhPSBudWxsKTsKLQotCQlEb2N1bWVudCBkb2MgPSBpbmZvLnRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmICghKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB0eXBlaWQgPSAoKElET01Eb2N1bWVudCkgZG9jKS5nZXREb2N1bWVudFR5cGVJZCgpOwotCQlpZiAodHlwZWlkICE9IG51bGwpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHR5cGVpZCk7Ci0JCQlpbmZvLmlzWEhUTUwgPSAoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYWdFcnJvckluZm9JbXBsIGV4dGVuZHMgQWJzdHJhY3RFcnJvckluZm8gewotCQlwcml2YXRlIFN0cmluZyBoaW50ID0gbnVsbDsKLQotCQlwdWJsaWMgVGFnRXJyb3JJbmZvSW1wbChpbnQgc3RhdGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnLCBTdHJpbmcgaGludCkgewotCQkJc3VwZXIoc3RhdGUsIG5ldyBTZWdtZW50KHRhZykpOwotCQkJdGhpcy5oaW50ID0gaGludDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SGludCgpIHsKLQkJCXJldHVybiBoaW50OwotCQl9Ci0KLQkJcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWdDb3JydXB0ZWQoRWxlbWVudEluZm8gaW5mbykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGluZm8uZW5kVGFnLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZ24gPSAoSVRleHRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFpc1ZhbGlkUmVnaW9uKHJnbikpCi0JCQkJcmV0dXJuIHRydWU7IC8vIGZvdW5kIGludmFsaWQgcmVnaW9uIHR5cGUuCi0JCX0KLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgcmVnaW9ucyBhcmUgdmFsaWQuCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW5kVGFnRnVsbFRleHQoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgaGludCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmZvLmVuZFRhZy5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmduID0gKElUZXh0UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmduLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJY29udGludWU7Ci0JCQloaW50ICs9IGluZm8uZW5kVGFnLmdldEZ1bGxUZXh0KHJnbik7Ci0JCX0KLQkJcmV0dXJuIGhpbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGhpbnQgPSBnZXRFbmRUYWdGdWxsVGV4dChpbmZvKTsKLQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBpbmZvLmVuZFRhZywgaGludCk7Ci0JCXRoaXMucmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoZXJyb3IpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUYWdzKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8uaGFzU3RhcnRUYWcpIHsKLQkJCWlmICghaW5mby50YXJnZXQuaXNTdGFydFRhZ0Nsb3NlZCgpKSB7Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgU1RBUlQgdGFnIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8uc3RhcnRUYWcpOwotCQkJCXJlcG9ydChVTkNMT1NFRF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoaW5mby5oYXNFbmRUYWcpIHsKLQkJCQlpZiAoaW5mby5kZWNsICE9IG51bGwpIHsKLQkJCQkJaWYgKENNVXRpbC5pc0hUTUwoaW5mby5kZWNsKSAmJiAhaW5mby50YXJnZXQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCQlpZiAoaW5mby50YXJnZXQuaXNDb250YWluZXIoKSkgewotCQkJCQkJCS8vIFNldCB0aGUgZXJyb3IgbWFyayB0byB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuCi0JCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8udGFyZ2V0LmdldFN0YXJ0T2Zmc2V0KCksIDApOwotCQkJCQkJCXJlcG9ydChNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIE1hcmsgdGhlIHdob2xlIEVORCB0YWcgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5lbmRUYWcpOwotCQkJCQkJCXJlcG9ydChVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGluZm8uaXNYSFRNTCkgewotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8udGFyZ2V0LmdldFN0YXJ0T2Zmc2V0KCksIDApOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGluZm8uaGFzRW5kVGFnKSB7Ci0JCQlpZiAoIWluZm8udGFyZ2V0LmlzQ2xvc2VkKCkpIHsKLQkJCQkvLyBTZXQgdGhlIHdob2xlIEVORCB0YWcgYXMgZXJyb3Igc2VnbWVudC4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5lbmRUYWcpOwotCQkJCXJlcG9ydChVTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGluZm8uaXNYSFRNTCkgeyAvLyBYSFRNTAotCQkJCWlmICghaW5mby50YXJnZXQuaXNFbXB0eVRhZygpKSB7Ci0JCQkJCWlmIChpc0VtcHR5Q29udGVudChpbmZvLmRlY2wpKSB7Ci0JCQkJCQkvLyBFTVBUWSBlbGVtZW50IHNob3VsZCBiZSB3cml0dGVuIGluIDwuLi4vPiBmb3JtLgotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJCQlyZXBvcnQoSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGVuZCB0YWcgaXMgcmVxdWlyZWQuCi0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby50YXJnZXQuZ2V0RW5kT2Zmc2V0KCksIDApOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgeyAvLyBIVE1MCi0JCQkJaWYgKGluZm8uaGFzU3RhcnRUYWcpIHsKLQkJCQkJaWYgKGluZm8uZGVjbCAhPSBudWxsICYmIENNVXRpbC5pc0hUTUwoaW5mby5kZWNsKSAmJiAhaW5mby50YXJnZXQuaXNFbXB0eVRhZygpICYmICFDTVV0aWwuaXNFbmRUYWdPbWlzc2libGUoaW5mby5kZWNsKSkgewotCQkJCQkJLy8gU2V0IHRoZSBlcnJvciBtYXJrIHRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCi0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby50YXJnZXQuZ2V0RW5kT2Zmc2V0KCksIDApOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIHBlcmZvcm0gdmFsaWRhdGlvbiBhYm91dCB0YWcgbmFtZSBkZWZpbml0aW9uLiAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU5hbWVzKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJYm9vbGVhbiBjb3JydXB0ZWQgPSBpbmZvLmhhc0VuZFRhZyAmJiBpc0VuZFRhZ0NvcnJ1cHRlZChpbmZvKTsKLQkJaWYgKGluZm8uZGVjbCA9PSBudWxsKSB7Ci0JCQkvLyBJZiBubyBkZWNsYXJhdGlvbiBpcyByZXRyaWV2ZWQsIHRoZSB0YXJnZXQgaXMgcmVhbGx5Ci0JCQkvLyB1bmtub3duIGVsZW1lbnQuCi0JCQlpZiAoIWluZm8uaGFzU3RhcnRUYWcgJiYgY29ycnVwdGVkKSB7Ci0JCQkJcmVwb3J0Q29ycnVwdGVkRW5kVGFnRXJyb3IoaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoaW5mby50YXJnZXQsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQlyZXBvcnQoVU5ERUZJTkVEX05BTUVfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBFdmVuIGlmIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmV0cmlldmVkLCBpZiB0aGUgZW5kCi0JCQkvLyB0YWcgaXMgY29ycnVwdGVkLCBpdCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgdW5kZWZpbmVkCi0JCQkvLyBuYW1lLiAoRDIwMjQ5MykKLQkJCWlmIChjb3JydXB0ZWQpIHsKLQkJCQlyZXBvcnRDb3JydXB0ZWRFbmRUYWdFcnJvcihpbmZvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHBlcmZvcm0gdmFsaWRhdGlvbiB0YWcgY2FzZSBvbmx5IGZvciBYSFRNTCBkb2N1bWVudCAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVRhZ0Nhc2UoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgZGVjbGFyZWQgPSBpbmZvLmRlY2wuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnTmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGVuZFRhZ05hbWUgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChkZWNsYXJlZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHN0YXJ0IHRhZwotCQlpZiAoaW5mby5oYXNTdGFydFRhZykgewotCQkJc3RhcnRUYWdOYW1lID0gZ2V0VGFnTmFtZShpbmZvLnN0YXJ0VGFnKTsKLQkJCWlmICghZGVjbGFyZWQuZXF1YWxzKHN0YXJ0VGFnTmFtZSkpIHsKLQkJCQlUYWdFcnJvckluZm9JbXBsIGVycm9yID0gbmV3IFRhZ0Vycm9ySW5mb0ltcGwoTUlTTUFUQ0hFRF9FUlJPUiwgaW5mby5zdGFydFRhZywgc3RhcnRUYWdOYW1lKTsKLQkJCQl0aGlzLnJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKGVycm9yKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZW5kIHRhZwotCQlpZiAoaW5mby5oYXNFbmRUYWcpIHsKLQkJCWVuZFRhZ05hbWUgPSBnZXRUYWdOYW1lKGluZm8uZW5kVGFnKTsKLQkJCWlmICghaW5mby5oYXNTdGFydFRhZyB8fCAoIWVuZFRhZ05hbWUuZXF1YWxzKHN0YXJ0VGFnTmFtZSkpKSB7Ci0JCQkJaWYgKCFkZWNsYXJlZC5lcXVhbHMoZW5kVGFnTmFtZSkpIHsKLQkJCQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKE1JU01BVENIRURfRVJST1IsIGluZm8uZW5kVGFnLCBlbmRUYWdOYW1lKTsKLQkJCQkJdGhpcy5yZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShlcnJvcikpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNoaWxkcmVuKE5vZGUgdGFyZ2V0KSB7Ci0JCWlmICgodGFyZ2V0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpICYmIENNVXRpbC5pc0ZvcmVpZ24oKEVsZW1lbnQpIHRhcmdldCkpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gdGFyZ2V0LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkJewotCQkJCQkJSURPTU5vZGUgdGV4dCA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCQkJCQlpbnQgY2hhck9mZnNldCA9IHZhbGlkYXRlVGV4dFNvdXJjZSh0ZXh0KTsKLQkJCQkJCWlmIChjaGFyT2Zmc2V0ID49IDApIHsKLQkJCQkJCQljaGFyT2Zmc2V0ICs9IHRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoY2hhck9mZnNldCwgMSk7Ci0JCQkJCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCQkJCXJlcG9ydChJTlZBTElEX0NIQVJfRVJST1IsIGVycm9yU2VnLCB0ZXh0KTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJCXsKLQkJCQkJCUlET01Ob2RlIHRhZyA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCQkJCQlpZiAoIXRhZy5pc0Nsb3NlZCgpKSB7Ci0JCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KHRhZywgRk1VdGlsLlNFR19XSE9MRV9UQUcpOwotCQkJCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQkJCQlyZXBvcnQoVU5DTE9TRURfVEFHX0VSUk9SLCBlcnJvclNlZywgdGFnKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgdmFsaWRhdGVUZXh0U291cmNlKElET01Ob2RlIHRleHQpIHsKLQkJdHJ5IHsKLQkJCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKHRleHQpOwotCQkJdmFsaWRhdG9yLnZhbGlkYXRlU291cmNlKHRleHQuZ2V0U291cmNlKCkpOwotCQl9Ci0JCWNhdGNoIChJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZXguZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXBvcnQoaW50IHN0YXRlLCBTZWdtZW50IGVycm9yU2VnLCBOb2RlIG5vZGUpIHsKLQkJRXJyb3JJbmZvIGluZm8gPSBuZXcgRXJyb3JJbmZvSW1wbChzdGF0ZSwgZXJyb3JTZWcsIG5vZGUpOwotCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShpbmZvKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS90ZXh0L0lIVE1MUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3RleHQvSUhUTUxQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTkwNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3RleHQvSUhUTUxQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uCi0gKiB0eXBlcyBmb3IgSFRNTC4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQKLSAqIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRNTFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIEhUTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhUTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBTQ1JJUFQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIElTU1VFOiBJIHRoaW5rIG1ldGEgdGFnIGFyZWFzIGFyZSBoZXJlIHRvbz8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwOWNlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtaHRtbC12YWxpZGF0aW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIga2luZD0iY29uIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvdWkvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvY29yZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC91aS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvdWkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjM5ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWh0bWxlZGl0b3IuamFyCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwMTVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGJlZTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaHRtbC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2JhYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0ZDdiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWksCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODZlZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHNyYy1odG1sLXZhbGlkYXRpb24vCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdodG1sX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdodG1sX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzVhYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3aHRtbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3aHRtbF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3aHRtbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZlMThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2h0bWxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5YjQ1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg5OTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYW5jaG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJvZHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDVmYTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJ1dHRvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDNmY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1idXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9udC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjQwY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvcm0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEzOTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmNTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaHRtbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzliYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzMjM1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWltYWdlLW1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWltYWdlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg4YzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg0NjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRpdGxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI5MDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3aGZpbGVfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3aGZpbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzZTFlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2hmaWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2M2UzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTc6MjM6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTdkOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9SFRNTCBVSSBTb3VyY2UgRWRpdG9yCi1IVE1MX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUhUTUwgRWRpdG9yCi1IVE1MX0ZpbGVzLm5hbWU9SFRNTCBGaWxlcwotSFRNTF9Tb3VyY2UubmFtZT1IVE1MIFNvdXJjZQotSFRNTF9UZW1wbGF0ZXMubmFtZT1IVE1MIFRlbXBsYXRlcwotSFRNTF9TdHlsZXMubmFtZT1IVE1MIFN0eWxlcwotV2ViQ29udGVudFNldHRpbmdzLm5hbWU9V2ViIENvbnRlbnQgU2V0dGluZ3MKLURldmljZV9Qcm9maWxlX0VudHJ5X1Byb3ZpZGVyX0V4dGVuc2lvbi5uYW1lPURldmljZSBQcm9maWxlIEVudHJ5IFByb3ZpZGVyIEV4dGVuc2lvbgotQWxsX0hUTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIEhUTUwKLUhUTUxfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBIVE1MCi1IVE1MX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1IVE1MIFRhZwotSFRNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTCBBdHRyaWJ1dGUKLUhUTUxfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUhUTUwgQXR0cmlidXRlIHZhbHVlCi1IVE1MX1N5bnRheF9WYWxpZGF0b3IubmFtZT1IVE1MIFN5bnRheCBWYWxpZGF0b3IKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIGV4dGVuc2lvbiBwb2ludAotX1VJX1dJWkFSRF9OQU1FID0gSFRNTAotX1VJX1dJWkFSRF9DUkVBVEVfTkVXX0ZJTEUgPSBDcmVhdGUgYSBuZXcgSFRNTCBwYWdlCi0jIwotQWRkVGFzay5sYWJlbD1BZGQgJlRhc2suLi4KLUFkZFRhc2sudG9vbHRpcD1BZGQgVGFzay4uLgotQWRkQm9va21hcmsubGFiZWw9QWRkIEJvbyZrbWFyay4uLgotQWRkQm9va21hcmsudG9vbHRpcD1BZGQgQm9va21hcmsuLi4KLVNlbGVjdFJ1bGVyLmxhYmVsPVNlbGVjdCBSdWxlcgotIyMKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9RW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD1OZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD1QcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsPVJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcD1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTI2ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIiIG5hbWU9IiVEZXZpY2VfUHJvZmlsZV9FbnRyeV9Qcm92aWRlcl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZCIvPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVIVE1MX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkFjdGlvbkNvbnRyaWJ1dG9ySFRNTCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUuSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic291cmNlZWRpdGluZ3RleHR0b29scyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dC5IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjb3JyZWN0aW9uYXNzaXN0YW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMsIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zdHlsZXMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTwhLS0gSFRNTCBQUkVGRVJFTkNFIFBBR0VTLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9GaWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9Tb3VyY2UubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfU3R5bGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTENvbG9yUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zdHlsZXMiPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBXZWIgY29udGVudCBzZXR0aW5ncyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPCEtLSBmb3IgajJlZSB3ZWIgcHJvamVjdCAtLT4KLQkJPHBhZ2UKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLQkJCWFkYXB0YWJsZT0idHJ1ZSIKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmR5bmFtaWNwcm9qZWN0cHJvcGVydHlwYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9IndzdC53ZWIiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCWFkYXB0YWJsZT0idHJ1ZSIKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIj4KLQkJCTwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUFsbF9IVE1MX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX2FsbCI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX25ldyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX3RhZyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX2F0dHJpYnV0ZSI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX2F0dHJpYnV0ZV92YWx1ZSI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxpbmNsdWRlCi0JCQlmaWxlPSJ0ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotCQk8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBpbml0aWFsaXplIGh0bWwgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkV4dGVybmFsRmlsZUVkaXRvcklucHV0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RmlsZURvY3VtZW50UHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuRXh0ZXJuYWxGaWxlRG9jdW1lbnRQcm92aWRlciI+Ci0JCTwvcHJvdmlkZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIFdvcmtiZW5jaCB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJIVE1MVmFsaWRhdG9yIgotCQluYW1lPSIlSFRNTF9TeW50YXhfVmFsaWRhdG9yLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotCQk8dmFsaWRhdG9yPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmh0bWwiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouaHRtIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLnhodG1sIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmh0cGwiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9Iioud21sIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3BmIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzZiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3YiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanRwbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxoZWxwZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbi5IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlciI+Ci0JCQk8L2hlbHBlcj4KLQkJCi0JCTxydW4KLSAgICAgICAgICAgICBhc3luYz0idHJ1ZSIKLSAgICAgICAgICAgICBmdWxsQnVpbGQ9InRydWUiCi0gICAgICAgICAgICAgaW5jcmVtZW50YWw9InRydWUiCi0gICAgICAgICAgICAgZW5hYmxlZD0idHJ1ZSIKLQkJCSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbi5IVE1MVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gQXMgeW91IHR5cGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJwYXJ0aWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb24uSFRNTFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmh0bWxzeW50YXh2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLm1hcmt1cHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gTmV3IEhUTUwgd2l6YXJkIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9OQU1FIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZC5OZXdIVE1MV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBBZGQgbmV3IEhUTUwgd2l6YXJkIHRvIEoyRUUgUHJvamVjdCBOYXZpZ2F0b3IgLS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29tbW9uV2l6YXJkLm5ld0hUTUwiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZC5OZXdIVE1MV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPHRlc3QKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9IndzdC53ZWIiLz4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkNsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJGaW5kT2NjdXJyZW5jZXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc2NoZW1hL2RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NjaGVtYS9kZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDJmODJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc2NoZW1hL2RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIiBpZD0iZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIiIG5hbWU9IkRldmljZSBQcm9maWxlIEVudHJ5IFByb3ZpZGVyIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNGRmMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydGVyIHsKLQotCXByaXZhdGUgSVZhbGlkYXRvciBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXBvcnRlcihJVmFsaWRhdG9yIG93bmVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMucmVzdWx0ID0gbnVsbDsKLQotCQlpZiAodGhpcy5yZXBvcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMub3duZXIsIHRoaXMuZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyByZW1vdmUgYnkgbXlzZWxmPwotCQkJU3RyaW5nIGlkID0gSFRNTFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCk7Ci0JCQl0cnkgewotCQkJCS8vIFRhc2tMaXN0SGVscGVyIEFQSSBjaGFuZ2VkCi0JCQkJLy8gVGFza0xpc3RIZWxwZXIuZ2V0VGFza0xpc3QoKS5yZW1vdmVBbGxUYXNrcyhpZCwgdGhpcy5maWxlLAotCQkJCS8vIG51bGwpOwotCQkJCVRhc2tMaXN0SGVscGVyLmdldFRhc2tMaXN0KCkucmVtb3ZlQWxsVGFza3ModGhpcy5maWxlLCBpZCwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXN1bHQgZ2V0UmVzdWx0KCkgewotCQlpZiAodGhpcy5yZXN1bHQgPT0gbnVsbCkKLQkJCXRoaXMucmVzdWx0ID0gbmV3IEhUTUxWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCXJldHVybiB0aGlzLnJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5maWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSU1lc3NhZ2UgbWVzID0gdHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlKTsKLQotCQlpZiAodGhpcy5yZXBvcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcy5vd25lciwgbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFkZCBieSBteXNlbGY/Ci0JCQlTdHJpbmcgaWQgPSBIVE1MVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IEludGVnZXIudG9TdHJpbmcobWVzLmdldExpbmVOdW1iZXIoKSk7Ci0JCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlJUGF0aCBmaWxlUGF0aCA9IHRoaXMuZmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCQluYW1lID0gZmlsZVBhdGgudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJVGFza0xpc3RIZWxwZXIuZ2V0VGFza0xpc3QoKS5hZGRUYXNrKGlkLCB0aGlzLmZpbGUsIGxvY2F0aW9uLCBtZXMuZ2V0SWQoKSwgbWVzLmdldFRleHQoKSwgbWVzLmdldFNldmVyaXR5KCksIG5hbWUsIG1lcy5nZXRHcm91cE5hbWUoKSwgbWVzLmdldE9mZnNldCgpLCBtZXMuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYW5zbGF0ZSBWYWxpZGF0aW9uTWVzc2FnZSB0byBJTWVzc2FnZSBhbmQgZ2VuZXJhdGUgcmVzdWx0IGxvZwotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgdHJhbnNsYXRlTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWludCBzZXZlcml0eSA9IElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkJSFRNTFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gZ2V0UmVzdWx0KCk7Ci0JCXN3aXRjaCAobWVzc2FnZS5nZXRTZXZlcml0eSgpKSB7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQkJcmVzdWx0LmFkZEVycm9yKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJCXJlc3VsdC5hZGRXYXJuaW5nKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXN1bHQuYWRkSW5mb3JtYXRpb24oKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCUlNZXNzYWdlIG1lcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlLmdldE1lc3NhZ2UoKSwgdGhpcy5maWxlKTsKLQkJbWVzLnNldE9mZnNldChtZXNzYWdlLmdldE9mZnNldCgpKTsKLQkJbWVzLnNldExlbmd0aChtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJaWYgKHRoaXMubW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBmbGF0TW9kZWwgPSB0aGlzLm1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGZsYXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbmUgPSBmbGF0TW9kZWwuZ2V0TGluZU9mT2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCW1lcy5zZXRMaW5lTm8obGluZSArIDEpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXN1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYzlmNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSFRNTFZhbGlkYXRpb25SZXN1bHQgewotCXByaXZhdGUgaW50IGVycm9ycyA9IDA7Ci0JcHJpdmF0ZSBpbnQgd2FybmluZ3MgPSAwOwotCXByaXZhdGUgaW50IGluZm9ybWF0aW9ucyA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXN1bHQoKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoKSB7Ci0JCXRoaXMuZXJyb3JzKys7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5mb3JtYXRpb24oKSB7Ci0JCXRoaXMuaW5mb3JtYXRpb25zKys7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2FybmluZygpIHsKLQkJdGhpcy53YXJuaW5ncysrOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JzKCkgewotCQlyZXR1cm4gdGhpcy5lcnJvcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRJbmZvcm1hdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmluZm9ybWF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdhcm5pbmdzKCkgewotCQlyZXR1cm4gdGhpcy53YXJuaW5nczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gKHRoaXMuZXJyb3JzID09IDAgJiYgdGhpcy53YXJuaW5ncyA9PSAwICYmIHRoaXMuaW5mb3JtYXRpb25zID09IDApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25Xb3JrYmVuY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiZmRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgewotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGFuIElWYWxpZGF0b3IgYXNzb2NpYXRlcyBhIHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJTWVzc2FnZSwgdGhlCi0JICogV29ya2JlbmNoUmVwb3J0ZXIgZXZlbnR1YWxseSByZXNvbHZlcyB0aGF0IHRhcmdldCBvYmplY3Qgd2l0aCBhbgotCSAqIElSZXNvdXJjZS4gU29tZXRpbWVzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZQotCSAqIElSZXNvdXJjZSAodXN1YWxseSB0aGUgSVByb2plY3QsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IElSZXNvdXJjZSB3aGVuIGFuCi0JICogSUZpbGUgY2Fubm90IGJlIGZvdW5kKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkLCBieSB0aGUKLQkgKiBXb3JrYmVuY2hSZXBvcnRlciwgc28gdGhhdCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgY2FuIGRpc3Rpbmd1aXNoCi0JICogYmV0d2VlbiB0aGUgSU1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgc2FtZSBJUmVzb3VyY2UsIGJ1dCByZWZlciB0bwotCSAqIGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cy4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZQotCSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkgbWV0aG9kLCBzbyB0aGF0IHdoZW4gb25lIHRhcmdldAotCSAqIG9iamVjdCByZW1vdmVzIGFsbCBvZiBpdHMgbWVzc2FnZXMsIHRoYXQgaXQgZG9lc24ndCByZW1vdmUgYW5vdGhlcgotCSAqIHRhcmdldCBvYmplY3QncyBtZXNzYWdlcy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgb25seSBpZiBvYmplY3QgaXMgbnVsbC4gT3RoZXJ3aXNlLCBhbiBpZAotCSAqIHdoaWNoIGNhbiB1bmlxdWVseSBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuIFRoZQotCSAqIGlkIG5lZWRzIHRvIGJlIHVuaXF1ZSBvbmx5IHdpdGhpbiBvbmUgcGFydGljdWxhciBJVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gZ2V0UG9ydGFibGVOYW1lKChJRmlsZSkgb2JqZWN0KTsKLQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODAxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkZpbGVCdWZmZXJNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iLCBJU291cmNlVmFsaWRhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfSlNUX0pTUF9DT1JFX0pTUFNPVVJDRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9XU1RfSFRNTF9DT1JFX0hUTUxTT1VSQ0UgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCAocmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JcHVibGljIEhUTUxWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0TW9kZWwoSVByb2plY3QgcHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8IGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFjYW5IYW5kbGUoZmlsZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyByZXRyeSBpZ25vcmluZyBNRVRBIGNoYXJzZXQgZm9yIGludmFsaWQgTUVUQSBjaGFyc2V0Ci0JCQkJLy8gc3BlY2lmaWNhdGlvbgotCQkJCS8vIHJlY3JlYXRlIGlucHV0IHN0cmVhbSwgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHBhcnRpYWxseSByZWFkCi0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlLCBuZXcgU3RyaW5nKCksIG51bGwpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJfQotCi0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgewotCQkJcmVsZWFzZU1vZGVsKG1vZGVsKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSURPTU1vZGVsKSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTFZhbGlkYXRpb25SZXBvcnRlciBnZXRSZXBvcnRlcihJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElET01Nb2RlbCBtb2RlbCkgewotCQlyZXR1cm4gbmV3IEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIodGhpcywgcmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmaWxlIGV4dGVuc2lvbiB0byB2YWxpZGF0ZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGUoSUZpbGUgZmlsZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0KLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJSUNvbnRlbnRUeXBlIGh0bWxDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShPUkdfRUNMSVBTRV9XU1RfSFRNTF9DT1JFX0hUTUxTT1VSQ0UpOwotCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlJQ29udGVudFR5cGUgZmlsZUNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0KLQkJCQkJaWYgKGh0bWxDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZmlsZUNvbnRlbnRUeXBlLmlzS2luZE9mKGh0bWxDb250ZW50VHlwZSkpIHsKLQkJCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gSVNTVUU6IGhlcmUncyBhIGxpdHRsZSAiYmFja3dhcmRzIiBkZXBlbmRhbmN5LgotCQkJCQkJCS8vIHRoZXJlIHNob3VsZCBiZSBhICJKU1BFTUJFRERFREhUTUwgdmFsaWRhdG9yIgotCQkJCQkJCS8vIGNvbnRyaWJ1dGVkIGJ5IEpTUCBwbHVnaW4uCi0JCQkJCQkJSUNvbnRlbnRUeXBlIGpzcENvbnRlbnRUeXBlID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKE9SR19FQ0xJUFNFX0pTVF9KU1BfQ09SRV9KU1BTT1VSQ0UpOwotCQkJCQkJCWlmIChqc3BDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlc3VsdCA9IGZpbGVDb250ZW50VHlwZS5pc0tpbmRPZihqc3BDb250ZW50VHlwZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGh0bWxDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGh0bWxDb250ZW50VHlwZS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2hvdWxkIGJlIHJhcmUsIGJ1dCB3aWxsIGlnbm9yZSB0byBhdm9pZCBsb2dnaW5nICJlbmNvZGluZwotCQkJCS8vIGV4Y2VwdGlvbnMiIGFuZCB0aGUgbGlrZSBoZXJlLgotCQkJCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzSFRNTEZlYXR1cmUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKCJIVE1MIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VNb2RlbChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChoZWxwZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKChyZXBvcnRlciAhPSBudWxsKSAmJiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSA9PSB0cnVlKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJU3RyaW5nW10gZGVsdGFBcnJheSA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCWlmIChkZWx0YUFycmF5ICE9IG51bGwgJiYgZGVsdGFBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQl2YWxpZGF0ZURlbHRhKGhlbHBlciwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVGdWxsKGhlbHBlciwgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB2YWxpZGF0ZSBjYWxsIGlzIGZvciB0aGUgSVNvdXJjZVZhbGlkYXRvciBwYXJ0aWFsIGRvY3VtZW50Ci0JICogdmFsaWRhdGlvbiBhcHByb2FjaAotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKGhlbHBlciA9PSBudWxsIHx8IGZEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICgocmVwb3J0ZXIgIT0gbnVsbCkgJiYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgPT0gdHJ1ZSkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJdHJ5IHsKLQotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCWRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJfQotCi0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCAhaGFzSFRNTEZlYXR1cmUoZG9jdW1lbnQpKQotCQkJCXJldHVybjsgLy8gaWdub3JlCi0KLQkJCUlUZXh0RmlsZUJ1ZmZlciBmYiA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoZkRvY3VtZW50KTsKLQkJCWlmIChmYiA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmYi5nZXRMb2NhdGlvbigpKTsKLQkJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHdyb25nIHJlZ2lvbiBpZiBpdCdzIFRleHQgKGluc3RlYWQgb2YgRWxlbWVudCkKLQkJCS8vIHdlIGRvbid0IGtub3cgaG93IHRvIHZhbGlkYXRlIFRleHQKLQkJCUluZGV4ZWRSZWdpb24gaXIgPSBnZXRDb3ZlcmluZ05vZGUoZGlydHlSZWdpb24pOyAvLyAgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoaXIgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJd2hpbGUgKGlyICE9IG51bGwgJiYgaXIgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCS8vIGl0J3MgYXNzdW1lZCB0aGF0IHRoaXMgZ2V0cyB0aGUgSW5kZXhlZFJlZ2lvbiB0bwotCQkJCQkvLyB0aGUgcmlnaHQgb2YgdGhlIGVuZCBvZmZzZXQKLQkJCQkJaXIgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGlyLmdldEVuZE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChpciBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KChJTm9kZU5vdGlmaWVyKSBpcik7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCQkJaWYgKHJlcG9ydGVyICE9IG51bGwpIHsKLQkJCQkJSFRNTFZhbGlkYXRpb25SZXBvcnRlciByZXAgPSBudWxsOwotCQkJCQlyZXAgPSBnZXRSZXBvcnRlcihyZXBvcnRlciwgZmlsZSwgKElET01Nb2RlbCkgbW9kZWwpOwotCQkJCQlyZXAuY2xlYXIoKTsKLQkJCQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCi0JCQkJCVN0cmluZyBmaWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCUlQYXRoIGZpbGVQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCQkJZmlsZU5hbWUgPSBmaWxlUGF0aC50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBhcmdzW10gPSBuZXcgU3RyaW5nW117ZmlsZU5hbWV9OwotCi0JCQkJCU1lc3NhZ2UgbWVzcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgTkxTLmJpbmQoSFRNTFVJTWVzc2FnZXMuTUVTU0FHRV9IVE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV8sIGFyZ3MpKTsKLQkJCQkJbWVzcy5zZXRQYXJhbXMoYXJncyk7Ci0JCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3MpOwotCQkJCX0KLQkJCQlhZGFwdGVyLnZhbGlkYXRlKGlyKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGdldENvdmVyaW5nTm9kZShJUmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCQotCQlJbmRleGVkUmVnaW9uIGxhcmdlc3RSZWdpb24gPSBudWxsOwotCQlpZihmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCXRyeSB7Ci0JCQkJaWYoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpZkRvY3VtZW50KS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGRpcnR5UmVnaW9uLmdldE9mZnNldCgpLCBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJICAgIGxhcmdlc3RSZWdpb24gPSBnZXRMYXJnZXN0KHJlZ2lvbnMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhcmdlc3RSZWdpb247Ci0JfQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldExhcmdlc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHNkUmVnaW9ucykgewotCQkKLQkJaWYoc2RSZWdpb25zID09IG51bGwgfHwgc2RSZWdpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCSAKLQkJSW5kZXhlZFJlZ2lvbiBjdXJyZW50TGFyZ2VzdCA9IGdldENvcnJlc3BvbmRpbmdOb2RlKHNkUmVnaW9uc1swXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2RSZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBpZighc2RSZWdpb25zW2ldLmlzRGVsZXRlZCgpKSB7Ci0gICAgCQkJSW5kZXhlZFJlZ2lvbiBjb3JyZXNwb25kaW5nID0gZ2V0Q29ycmVzcG9uZGluZ05vZGUoc2RSZWdpb25zW2ldKTsKLSAgICAJCQkKLSAgICAJCQlpZihjdXJyZW50TGFyZ2VzdCBpbnN0YW5jZW9mIFRleHQpCi0gICAgCQkJCWN1cnJlbnRMYXJnZXN0ID0gY29ycmVzcG9uZGluZzsKLSAgICAJCQkKLSAgICAgICAgICAgICAgICBpZihjb3JyZXNwb25kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAJaWYoIShjb3JyZXNwb25kaW5nIGluc3RhbmNlb2YgVGV4dCkpIHsKLQkgICAgICAgIAkJCWlmIChjb3JyZXNwb25kaW5nLmdldFN0YXJ0T2Zmc2V0KCkgPD0gY3VycmVudExhcmdlc3QuZ2V0U3RhcnRPZmZzZXQoKSAgCi0JICAgICAgICAJCQkJCQkmJiAgY29ycmVzcG9uZGluZy5nZXRFbmRPZmZzZXQoKSA+PSBjdXJyZW50TGFyZ2VzdC5nZXRFbmRPZmZzZXQoKSApCi0JICAgICAgICAJCQkJY3VycmVudExhcmdlc3QgPSBjb3JyZXNwb25kaW5nOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCQl9Ci0JCXJldHVybiBjdXJyZW50TGFyZ2VzdDsKLQl9Ci0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q29ycmVzcG9uZGluZ05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLSAgICAgICAgSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgaW5kZXhlZFJlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0KCkpOyAgICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0gICAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElET01Nb2RlbCBtb2RlbCwgSUZpbGUgZmlsZSkgewotCQlJUHJvamVjdCBwcmogPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlwcmogPSBmaWxlLmdldFByb2plY3QoKTsKLQkJfQotCQlpZiAoKHByaiA9PSBudWxsKSAmJiAobW9kZWwgIT0gbnVsbCkpIHsKLQkJCVVSSVJlc29sdmVyIHJlcyA9IG1vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlwcmogPSByZXMuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCWZpbmFsIFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKHByaiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJldHVybiB2YWxpZGF0ZShyZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCWlmICghaGFzSFRNTEZlYXR1cmUoZG9jdW1lbnQpKQotCQkJcmV0dXJuIG51bGw7IC8vIGlnbm9yZQotCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJVmFsaWRhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChWYWxpZGF0aW9uQWRhcHRlcikgZmFjdG9yeS5hZGFwdChkb2N1bWVudCk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JCXJlcC5jbGVhcigpOwotCQlhZGFwdGVyLnNldFJlcG9ydGVyKHJlcCk7Ci0JCWlmIChyZXBvcnRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJSVBhdGggZmlsZVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCWZpbGVOYW1lID0gZmlsZVBhdGgudG9TdHJpbmcoKTsKLQkJCX0KLQkJCVN0cmluZyBhcmdzW10gPSBuZXcgU3RyaW5nW117ZmlsZU5hbWV9OwotCi0JCQkvLyBNZXNzYWdlIG1lc3MgPSBuZXcgTWVzc2FnZSgiSFRNTFZhbGlkYXRpb24iLCAvLyROT04tTkxTLTEkCi0JCQkvLyBTZXZlcml0eUVudW0uTE9XX1NFVkVSSVRZLAotCQkJLy8gIk1FU1NBR0VfSFRNTF9WQUxJREFUSU9OX01FU1NBR0VfVUlfIiwgLy8kTk9OLU5MUy0xJAotCQkJLy8gYXJncyk7Ci0JCQlNZXNzYWdlIG1lc3MgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIE5MUy5iaW5kKEhUTUxVSU1lc3NhZ2VzLk1FU1NBR0VfSFRNTF9WQUxJREFUSU9OX01FU1NBR0VfVUlfLCBhcmdzKSk7Ci0JCQltZXNzLnNldFBhcmFtcyhhcmdzKTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3MpOwotCQl9Ci0JCWFkYXB0ZXIudmFsaWRhdGUoZG9jdW1lbnQpOwotCQlyZXR1cm4gcmVwLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbnRhaW5lcihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gY29udGFpbmVyLm1lbWJlcnMoZmFsc2UpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VBcnJheVtpXTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCByZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQl2YWxpZGF0ZUZpbGUoaGVscGVyLCByZXBvcnRlciwgKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQl2YWxpZGF0ZUNvbnRhaW5lcihoZWxwZXIsIHJlcG9ydGVyLCAoSUNvbnRhaW5lcikgcmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGVsdGEoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCVN0cmluZ1tdIGRlbHRhQXJyYXkgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBkZWx0YSA9IGRlbHRhQXJyYXlbaV07Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGRlbHRhKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpCi0JCQkJY29udGludWU7Ci0JCQl2YWxpZGF0ZUZpbGUoaGVscGVyLCByZXBvcnRlciwgKElGaWxlKSByZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVGaWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSkgewotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoIXNob3VsZFZhbGlkYXRlKGZpbGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoZmlsZS5nZXRQcm9qZWN0KCksIGZpbGUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJdmFsaWRhdGUocmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXJlbGVhc2VNb2RlbChtb2RlbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVGdWxsKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJU3RyaW5nW10gZmlsZURlbHRhID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQlJV29ya2JlbmNoQ29udGV4dCB3YkhlbHBlciA9IChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyOwotCQkJcHJvamVjdCA9IHdiSGVscGVyLmdldFByb2plY3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdvbid0IHdvcmsgZm9yIHByb2plY3QgdmFsaWRhdGlvbiAoYi9jIG5vdGhpbmcgaW4gZmlsZSBkZWx0YSkKLQkJCXByb2plY3QgPSBnZXRSZXNvdXJjZShmaWxlRGVsdGFbMF0pLmdldFByb2plY3QoKTsKLQkJfQotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl2YWxpZGF0ZUNvbnRhaW5lcihoZWxwZXIsIHJlcG9ydGVyLCBwcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIGFkZGVkIHRvIGdldCByaWQgb3IgZGVwZW5kZW5jeSBvbiBJV29ya2JlbmNoSGVscGVyCi0JICogCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgZGVsdGEpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChkZWx0YSkpOwotCX0KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBFeGNlcHRpb24gY2F0Y2hpbmcgd2FzIHJlbW92ZWQsIHNlZQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNjAwCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViYTEyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotCi0vKioKLSAqIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZQotICogCi0gKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciB2YWxpZGF0b3JzIHdoaWNoIHJ1biBvbmx5IGluIEVjbGlwc2UgYW5kIHdob3NlIG1lc3NhZ2VzLCBiZWNhdXNlIHRoZXkKLSAqIGNvbWUgZnJvbSBhbm90aGVyIHRvb2wsIGFyZSBhbHJlYWR5IGxvY2FsaXplZC4gTG9jYWxpemVkTWVzc2FnZSBjYW5ub3QgYmUgdXNlZCBieSBhbnkgdmFsaWRhdG9yCi0gKiB3aGljaCBuZWVkcyB0byBydW4gaW4gYm90aCBXZWJTcGhlcmUgYW5kIEVjbGlwc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWVkZTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiAKLSAqIENsYXNzIHRvIGhlbHAgdGhpcyBQcm9ibGVtJ3MgbGlzdC4KLSAqIAotICovCi1jbGFzcyBUYXNrTGlzdEhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgVGFza0xpc3RIZWxwZXIgX3Rhc2tMaXN0SGVscGVyID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgVGFza0xpc3RIZWxwZXIgZ2V0VGFza0xpc3QoKSB7Ci0JCWlmIChfdGFza0xpc3RIZWxwZXIgPT0gbnVsbCkgewotCQkJX3Rhc2tMaXN0SGVscGVyID0gbmV3IFRhc2tMaXN0SGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF90YXNrTGlzdEhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgbWVzc2FnZSB0byBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1hcmtlclR5cGUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKHBsdWdpbklkLCByZXNvdXJjZSwgbG9jYXRpb24sIG1lc3NhZ2VJZCwgbWVzc2FnZSwgbWFya2VyVHlwZSwgdGFyZ2V0T2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgbWVzc2FnZXMgZnJvbSBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgb3duZXIsIG9iamVjdE5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdFV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2MzYzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBjYWxsZWQgb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIFRoaXMgc2luZ2xldG9uIGludGVyYWN0cyB3aXRoIHRoZSBlY2xpcHNlIHdvcmtiZW5jaCdzIFRhc2sgbGlzdC4KLSAqIFRhc2tMaXN0VXRpbGl0eSBhZGRzIGFuZCByZW1vdmVzIHRhc2tzIGZyb20gdGhlIGxpc3QuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgYW4gSVdvcmtzcGFjZVJ1bm5hYmxlIG9yCi0gKiBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuIE1hbnkgcmVzb3VyY2UgZGVsdGFzIGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIG1ldGhvZHMKLSAqIGluIHRoaXMgY2xhc3MuCi0gKiAKLSAqIFRoaXMgY2FtZSBmcm9tIFRhc2tMaXN0VXRpbGl0eQotICovCi1wdWJsaWMgY2xhc3MgVGFza0xpc3RVdGlsaXR5IHsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEhUTUxVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVIgPSBQTFVHSU5fSUQgKyAiLnByb2JsZW1tYXJrZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBleHRlbnNpb24gd2hpY2ggaXMgdXNlZCB0byBhZGQgdmFsaWRhdGlvbiBtYXJrZXJzIHRvIHRoZSB0YXNrIGxpc3QKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBJVmFsaWRhdG9yIHdobyBvd25zIHRoZSBJTWFya2VyIG9uIHRoZSB0YXNrIGxpc3QKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFkgPSAidmFsaWRhdGlvblNldmVyaXR5IjsgLy8kTk9OLU5MUy0xJCAvLyBvbmUgb2YgdGhlIElNZXNzYWdlIHZhbHVlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QgPSAidGFyZ2V0T2JqZWN0IjsgLy8kTk9OLU5MUy0xJCAvLyBXaGVuIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZSBJUmVzb3VyY2UsIHRoaXMgZmllbGQgaWRlbnRpZmllcyB3aGljaCB0YXJnZXRPYmplY3Qgb3ducyBhIHBhcnRpY3VsYXIgbWVzc2FnZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfR1JPVVAgPSAiZ3JvdXBOYW1lIjsgLy8kTk9OLU5MUy0xJCAvLyBGb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwgdGhpcyBmaWVsZCBhc3NvY2lhdGVzIGEgbWVzc2FnZSB3aXRoIGEgZ3JvdXAsIHNvIHRoYXQgYSBzdWJzZXQgb2YgbWVzc2FnZXMgbWF5IGJlIHJlbW92ZWQgZnJvbSBhIGZpbGUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRCA9ICJtZXNzYWdlSWQiOyAvLyROT04tTkxTLTEkIC8vIFBlcnNpc3QgdGhlIG1lc3NhZ2UgaWQgb2YgdGhlIG1lc3NhZ2UsIG5vdCBqdXN0IHRoZSB0cmFuc2xhdGVkIHRleHQuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUFRIX0lORklOSVRFID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVBUSF9aRVJPID0gSVJlc291cmNlLkRFUFRIX1pFUk87Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSU1hcmtlcltdIE5PX01BUktFUlMgPSBuZXcgSU1hcmtlclswXTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNYXJrZXIgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1hcmtlclR5cGUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gZ2V0U2V2ZXJpdHkobWFya2VyVHlwZSk7Ci0KLQkJLy8gQWxsb3cgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIHRhc2sgbGlzdC4KLQkJLy8gUHJpb3IgdG8gYSBmdWxsIHZhbGlkYXRpb24sIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayB3aWxsIHJlbW92ZQotCQkvLyBhbGwgbWVzc2FnZXMgb3duZWQKLQkJLy8gYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLgotCQkvLyBQcmlvciB0byBhbiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgd2lsbAotCQkvLyByZW1vdmUgYWxsIG1lc3NhZ2VzLAotCQkvLyBvbiBlYWNoIG9mIHRoZSBjaGFuZ2VkIHJlc291cmNlcywgb3duZWQgYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzCi0JCS8vIGludm9rZWQuCi0JCS8vIAotCQkvLyBJdCBpcyB1cCB0byB0aGUgdmFsaWRhdG9yIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCBhZGRpbmcgdGhlCi0JCS8vIHNhbWUgbWVzc2FnZQotCQkvLyBpbiBtb3JlIHRoYW4gb25lIHBsYWNlLCBhbmQgYWxzbyB0byBjbGVhciBvdXQgYW55IG9sZCBtZXNzYWdlcwotCQkvLyB3aGljaCBhcmUgbm90IGNsZWFyZWQKLQkJLy8gYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCQlJTWFya2VyIGl0ZW0gPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoVkFMSURBVElPTl9NQVJLRVIpOyAvLyBhZGQgYQotCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWxpZGF0aW9uCi0JCQkJCQkJCQkJCQkJCQkJCS8vIG1hcmtlcgotCi0JCS8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCByZXBsYWNlIHRoZSBtdWx0aXBsZSBzZXRBdHRyaWJ1dGUKLQkJLy8gY2FsbHMgYWJvdmUgd2l0aCBhIHNpbmdsZSBzZXRBdHRyaWJ1dGVzIGNhbGwuCi0JCWJvb2xlYW4gb2Zmc2V0U2V0ID0gKChvZmZzZXQgIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSAmJiAobGVuZ3RoICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCkpOwotCQlpbnQgc2l6ZSA9IChvZmZzZXRTZXQpID8gMTAgOiA4OyAvLyBhZGQgQ0hBUl9TVEFSVCwgQ0hBUl9FTkQgb25seQotCQkJCQkJCQkJCQkvLyBpZiB0aGUgb2Zmc2V0IGlzIHNldC4gSWYgdGhlCi0JCQkJCQkJCQkJCS8vIG9mZnNldCBpcyBzZXQsIGl0IHRha2VzCi0JCQkJCQkJCQkJCS8vIHByZWNlbmRlbmNlIG92ZXIgdGhlIGxpbmUKLQkJCQkJCQkJCQkJLy8gbnVtYmVyLiAoZWNsaXBzZSdzIHJ1bGUsIG5vdAotCQkJCQkJCQkJCQkvLyBtaW5lLikKLQkJU3RyaW5nW10gYXR0cmliTmFtZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlPYmplY3RbXSBhdHRyaWJWYWx1ZXMgPSBuZXcgT2JqZWN0W3NpemVdOwotCi0JCS8vIFZlcnkgZmlyc3QgdGhpbmcsIGFkZCB0aGUgb3duZXIuIFRoYXQgd2F5LCBpZiB0aGUgY29kZSBkaWVzCi0JCS8vIGJlZm9yZSB0aGluZ3MgYXJlIHBlcnNpc3RlZCwgaG9wZWZ1bGx5IHRoaXMgbWFya2VyIHdpbGwgYmUKLQkJLy8gcGVyc2lzdGVkLgotCQkvLyBIb3BlZnVsbHksIGVjbGlwc2UgV0lMTCBwZXJzaXN0IHRoaXMgZmllbGQsIGFzIHJlcXVlc3RlZC4KLQkJYXR0cmliTmFtZXNbMF0gPSBWQUxJREFUSU9OX01BUktFUl9PV05FUjsKLQkJYXR0cmliVmFsdWVzWzBdID0gcGx1Z2luSWQ7Ci0JCWF0dHJpYk5hbWVzWzFdID0gVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFk7IC8vIHRoaXMgdmFsaWRhdGlvbgotCQkJCQkJCQkJCQkJCQkvLyBzZXZlcml0eSBpcyBzdG9yZWQsCi0JCQkJCQkJCQkJCQkJCS8vIGluIGFkZGl0aW9uIHRvIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBtYXJrZXIgc2V2ZXJpdHksIHRvCi0JCQkJCQkJCQkJCQkJCS8vIGVuYWJsZSBtb3JlIHRoYW4KLQkJCQkJCQkJCQkJCQkJLy8gb25lIHNldmVyaXR5IG9mCi0JCQkJCQkJCQkJCQkJCS8vIG1lc3NhZ2UgdG8gYmUKLQkJCQkJCQkJCQkJCQkJLy8gZGlzcGxheWVkLiBlLmcuCi0JCQkJCQkJCQkJCQkJCS8vIEVSUk9SIHwgV0FSTklORwotCQkJCQkJCQkJCQkJCQkvLyAodXNpbmcgYmluYXJ5IE9SKS4KLQkJCQkJCQkJCQkJCQkJLy8gVGhlIElNYXJrZXIKLQkJCQkJCQkJCQkJCQkJLy8gY29uc3RhbnRzIGFyZQotCQkJCQkJCQkJCQkJCQkvLyByZWd1bGFyIGRlY2ltYWwKLQkJCQkJCQkJCQkJCQkJLy8gY29uc3RhbnRzLgotCQlhdHRyaWJWYWx1ZXNbMV0gPSBuZXcgSW50ZWdlcihtYXJrZXJUeXBlKTsKLQkJYXR0cmliTmFtZXNbMl0gPSBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1Q7IC8vIHRvIGRpc3Rpbmd1aXNoCi0JCQkJCQkJCQkJCQkJCQkvLyBiZXR3ZWVuCi0JCQkJCQkJCQkJCQkJCQkvLyBtZXNzYWdlcyB3aGljaAotCQkJCQkJCQkJCQkJCQkJLy8gYXJlIHJlZ2lzdGVyZWQKLQkJCQkJCQkJCQkJCQkJCS8vIG9uIGFuCi0JCQkJCQkJCQkJCQkJCQkvLyBJUmVzb3VyY2UsIGJ1dAotCQkJCQkJCQkJCQkJCQkJLy8gYWdhaW5zdAotCQkJCQkJCQkJCQkJCQkJLy8gZGlmZmVyZW50Ci0JCQkJCQkJCQkJCQkJCQkvLyB0YXJnZXQgb2JqZWN0cwotCQlhdHRyaWJWYWx1ZXNbMl0gPSAoKHRhcmdldE9iamVjdE5hbWUgPT0gbnVsbCkgPyAiIiA6IHRhcmdldE9iamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzNdID0gVkFMSURBVElPTl9NQVJLRVJfR1JPVVA7Ci0JCWF0dHJpYlZhbHVlc1szXSA9ICgoZ3JvdXBOYW1lID09IG51bGwpID8gIiIgOiBncm91cE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzRdID0gSU1hcmtlci5NRVNTQUdFOwotCQlhdHRyaWJWYWx1ZXNbNF0gPSBtZXNzYWdlOwotCQlhdHRyaWJOYW1lc1s1XSA9IFZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRDsKLQkJYXR0cmliVmFsdWVzWzVdID0gbWVzc2FnZUlkOwotCi0JCWF0dHJpYk5hbWVzWzZdID0gSU1hcmtlci5TRVZFUklUWTsgLy8gSU1hcmtlci5TRVZFUklUWV9FUlJPUiwKLQkJCQkJCQkJCQkJLy8gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLAotCQkJCQkJCQkJCQkvLyBJTWFya2VyLlNFVkVSSVRZX0lORk8KLQkJYXR0cmliVmFsdWVzWzZdID0gbmV3IEludGVnZXIoc2V2ZXJpdHkpOwotCQl0cnkgewotCQkJLy8gSWYgdGhlIGxvY2F0aW9uIGlzIGEgbGluZSBudW1iZXIsIHN0b3JlIGl0IGFzIGEgbGluZSBudW1iZXIKLQkJCUludGVnZXIgbGluZU51bWJlciA9IEludGVnZXIudmFsdWVPZihsb2NhdGlvbik7Ci0JCQlhdHRyaWJOYW1lc1s3XSA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0JCQlhdHRyaWJWYWx1ZXNbN10gPSBsaW5lTnVtYmVyOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBPdGhlcndpc2UsIHN0b3JlIGl0IGFzIGEgdGV4dCBsb2NhdGlvbgotCQkJYXR0cmliTmFtZXNbN10gPSBJTWFya2VyLkxPQ0FUSU9OOwotCQkJYXR0cmliVmFsdWVzWzddID0gbG9jYXRpb247Ci0JCX0KLQotCQlpZiAob2Zmc2V0U2V0KSB7Ci0JCQlhdHRyaWJOYW1lc1s4XSA9IElNYXJrZXIuQ0hBUl9TVEFSVDsKLQkJCWF0dHJpYlZhbHVlc1s4XSA9IG5ldyBJbnRlZ2VyKG9mZnNldCk7Ci0JCQlhdHRyaWJOYW1lc1s5XSA9IElNYXJrZXIuQ0hBUl9FTkQ7Ci0JCQlhdHRyaWJWYWx1ZXNbOV0gPSBuZXcgSW50ZWdlcihvZmZzZXQgKyBsZW5ndGgpOwotCQl9Ci0KLQkJaXRlbS5zZXRBdHRyaWJ1dGVzKGF0dHJpYk5hbWVzLCBhdHRyaWJWYWx1ZXMpOwotCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIG9uZSBvZiB0aGUgU2V2ZXJpdHlFbnVtIHNldmVyaXRpZXMsIHJldHVybiB0aGUgSU1hcmtlciBzZXZlcml0eQotCSAqIGludCB0aGF0IGlzIGl0cyBlcXVpdmFsZW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRTZXZlcml0eShpbnQgc2V2ZXJpdHlFbnVtVmFsdWUpIHsKLQkJc3dpdGNoIChzZXZlcml0eUVudW1WYWx1ZSkgewotCQkJY2FzZSAoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkxPV19TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfSU5GTzsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKSA6IHsKLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5BTExfTUVTU0FHRVMpIDoKLQkJCWNhc2UgKElNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HKSA6Ci0JCQlkZWZhdWx0IDogewotCQkJCS8vIGFzc3VtZSBpdCdzIGEgd2FybmluZy4KLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERlcHRoKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIERFUFRIX0lORklOSVRFOyAvLyBERVBUSF9JTkZJTklURSBtZWFucyBnZXQgdGhpcyBwcm9qZWN0J3MKLQkJCQkJCQkJCS8vIG1hcmtlcnMsIGFuZCB0aGUgbWFya2VycyBiZWxvbmdpbmcgdG8KLQkJCQkJCQkJCS8vIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgewotCQkJLy8gTmVlZGVkIGZvciB0aGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdoZW4gaXQgY2hlY2tzIGZvciBvcnBoYW4KLQkJCS8vIHRhc2tzLgotCQkJcmV0dXJuIERFUFRIX0lORklOSVRFOyAvLyBERVBUSF9JTkZJTklURSBtZWFucyBnZXQgYWxsIG9mIHRoZQotCQkJCQkJCQkJLy8gbWFya2VycyBpbiB0aGUgd29ya3NwYWNlCi0JCX0KLQotCQlyZXR1cm4gREVQVEhfWkVSTzsgLy8gREVQVEhfWkVSTyBtZWFucyBqdXN0IHRoaXMgcmVzb3VyY2UsIG5vdCBpdHMKLQkJCQkJCQkvLyBjaGlsZHJlbgotCX0KLQotCXByaXZhdGUgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2V2ZXJpdHksIGludCBkZXB0aCkgewotCQlJTWFya2VyW10gdGVtcE1hcmtlcnMgPSBudWxsOwotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCXRyeSB7Ci0JCQlJTWFya2VyW10gYWxsTWFya2VycyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWFsbE1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhWQUxJREFUSU9OX01BUktFUiwgZmFsc2UsIGRlcHRoKTsgLy8gZmFsc2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lYW5zCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmx5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25zaWRlcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gUFJPQkxFTV9NQVJLRVIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHZhcmlhbnRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gUFJPQkxFTV9NQVJLRVIuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBTaW5jZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYWRkVGFzawotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb25seQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYWRkcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gUFJPQkxFTV9NQVJLRVIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZG9uJ3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5lZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25zaWRlcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdWJ0eXBlcy4KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIExvZ2dlciBsb2dnZXIgPQotCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJLy8gTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlLAotCQkJCS8vIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkvLyB9Ci0JCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCQl9Ci0KLQkJCS8vIE5vdyBmaWx0ZXIgaW4gdGhlIG1hcmtlcnMsIGJhc2VkIG9uIHNldmVyaXR5IHR5cGUuCi0JCQlpZiAoYWxsTWFya2Vycy5sZW5ndGggIT0gMCkgewotCQkJCXRlbXBNYXJrZXJzID0gbmV3IElNYXJrZXJbYWxsTWFya2Vycy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IGFsbE1hcmtlcnNbaV07Ci0JCQkJCUludGVnZXIgZmlsdGVyU2V2ZXJpdHkgPSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWSk7Ci0JCQkJCWlmIChmaWx0ZXJTZXZlcml0eSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBvZGQuLi5tYXJrZXIgd2Fzbid0IGNyZWF0ZWQgY29ycmVjdGx5LiBIb3cgY291bGQKLQkJCQkJCS8vIHRoaXMgaGFwcGVuPwotCQkJCQkJLy8gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzZXZlcml0eSBhbmQgYWRkIGl0IHRvIHRoZQotCQkJCQkJLy8gbGlzdC4KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBnZXRTZXZlcml0eShzZXZlcml0eSkpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkJLy8gTG9nZ2VyIGxvZ2dlciA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQkvLyBMb2dFbnRyeSBlbnRyeSA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKGludCwKLQkJCQkJCQkvLyBJUmVzb3VyY2UsIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCQkJCS8vIExvZ2dlciBsb2dnZXIgPQotCQkJCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJLy8gTG9nRW50cnkgZW50cnkgPQotCQkJCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhpbnQsCi0JCQkJCQkJLy8gSVJlc291cmNlLCBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBlbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChzZXZlcml0eSAmIGZpbHRlclNldmVyaXR5LmludFZhbHVlKCkpID09IDApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXRlbXBNYXJrZXJzW3ZhbGlkQ291bnQrK10gPSBtYXJrZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJLy8gTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoaW50LAotCQkJLy8gSVJlc291cmNlLCBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJLy8gfQotCQl9Ci0KLQkJaWYgKHZhbGlkQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlJTWFya2VyW10gdmFsaWRNYXJrZXJzID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcE1hcmtlcnMsIDAsIHZhbGlkTWFya2VycywgMCwgdmFsaWRDb3VudCk7Ci0JCXJldHVybiB2YWxpZE1hcmtlcnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG1lc3NhZ2VPd25lcnMsIGludCBkZXB0aCkgewotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCUlNYXJrZXJbXSB0ZW1wID0gbmV3IElNYXJrZXJbbWFya2Vycy5sZW5ndGhdOwotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCi0JCQl0cnkgewotCQkJCU9iamVjdCBvd25lciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJCWlmICgob3duZXIgPT0gbnVsbCkgfHwgIShvd25lciBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJLy8gVGhlIFZhbGlkYXRpb25NaWdyYXRvciB3aWxsIHJlbW92ZSBhbnkgInVub3duZWQiCi0JCQkJCS8vIHZhbGlkYXRpb24gbWFya2Vycy4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXNzYWdlT3duZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlT3duZXIgPSBtZXNzYWdlT3duZXJzW2pdOwotCQkJCQlpZiAoKChTdHJpbmcpIG93bmVyKS5lcXVhbHMobWVzc2FnZU93bmVyKSkgewotCQkJCQkJdGVtcFt2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBMb2dnZXIgbG9nZ2VyID0KLQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsCi0JCQkJLy8gU3RyaW5nW10pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBlbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJLy8gfQotCQkJCXJldHVybiBOT19NQVJLRVJTOwotCQkJfQotCQl9Ci0KLQkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgdmFsaWRDb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCB2YWxpZGF0aW9uIHRhc2tzIGZyb20gdGhlIHJlc291cmNlLiBJZiBkZXB0aAotCSAqIGlzIElORklOSVRFLCBjaGlsZCB0YXNrcyBhcmUgcmV0dXJuZWQgYXMgd2VsbC4gT25seSB0aGUgdGFza3Mgd2hpY2ggYXJlCi0JICogb3duZWQgYnkgdGhlIHNwZWNpZmllZCBtZXNzYWdlT3duZXIsIGFuZCBhcHBseSB0byB0aGUgbmFtZWQgSU1lc3NhZ2UncwotCSAqIHRhcmdldCBvYmplY3QgKG9iamVjdE5hbWUpIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG1lc3NhZ2VPd25lciwgU3RyaW5nIG9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoKG1lc3NhZ2VPd25lciA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQlJTWFya2VyW10gdmFsaWRMaXN0ID0gbnVsbDsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG1lc3NhZ2VPd25lciwgZGVwdGgpOwotCQlpZiAobWFya2VycyAhPSBudWxsKSB7Ci0JCQl2YWxpZExpc3QgPSBuZXcgSU1hcmtlclttYXJrZXJzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0KLQkJCQkvLyBJZiBtb3JlIHRoYW4gb25lIHRhcmdldCBvYmplY3QgcmVzb2x2ZXMgdG8gdGhlIHNhbWUKLQkJCQkvLyByZXNvdXJjZSwgcmVtb3Zpbmcgb25lIHRhcmdldCdzCi0JCQkJLy8gbWVzc2FnZXMgc2hvdWxkIG5vdCByZW1vdmUgdGhlIG90aGVyIHRhcmdldCBvYmplY3QncwotCQkJCS8vIG1lc3NhZ2VzLgotCQkJCWlmIChvYmplY3ROYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IHRhcmdldE9iamVjdCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUKTsKLQkJCQkJaWYgKCh0YXJnZXRPYmplY3QgPT0gbnVsbCkgfHwgISh0YXJnZXRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHx8ICEoKChTdHJpbmcpIHRhcmdldE9iamVjdCkuZXF1YWxzKG9iamVjdE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZ3JvdXBOYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGdyb3VwID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9HUk9VUCk7Ci0JCQkJCWlmICgoZ3JvdXAgPT0gbnVsbCkgfHwgIShncm91cCBpbnN0YW5jZW9mIFN0cmluZykgfHwgISgoKFN0cmluZykgZ3JvdXApLmVxdWFscyhncm91cE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl2YWxpZExpc3RbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCX0KLQkJfQotCi0JCWlmICh2YWxpZENvdW50ID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHZhbGlkTGlzdCwgMCwgcmVzdWx0LCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCBtZXNzYWdlcyBmcm9tIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBuZXcgU3RyaW5nW117b3duZXJ9LCBvYmplY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgbnVsbCwgZGVwdGgpOyAvLyBudWxsCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBtZWFucwotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm8KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGdyb3VwCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhIHN1YnNldCBvZiB0YXNrcyBmcm9tIHRoZSBwcm9qZWN0LCBpbmNsdWRpbmcgY2hpbGQKLQkgKiB0YXNrcy4gRXZlcnkgdGFzayB3aGljaCBiZWxvbmdzIHRvIHRoZSBncm91cCwgaWRlbnRpZmllZCBieSBncm91cE5hbWUsCi0JICogd2lsbCBiZSByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZW1vdmVUYXNrU3Vic2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgob3duZXJzID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSU1hcmtlcltdIGFsbFRhc2tzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdyb3VwTmFtZSwgZGVwdGgpOwotCQlpZiAoYWxsVGFza3MubGVuZ3RoID4gMCkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMoYWxsVGFza3MpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjYmUxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0LlN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuWE1MSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm8uSFRNTEluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mby5IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmNvbW1vbi5jb250ZW50YXNzaXN0LkphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmNvbW1vbi5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckphdmFTY3JpcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwuY29tbW9uLnRhZ2luZm8uSmF2YVNjcmlwdEluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwuY29tbW9uLnRhZ2luZm8uSmF2YVNjcmlwdFRhZ0luZm9Ib3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLlRleHRIb3Zlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSFRNTCBjb250ZW50LgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIG5vdCBzb3VyY2V2aWV3ZXItc3BlY2lmaWMgYW5kCi0JICogaXQncyBhIFN0cmluZyBhcnJheQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhc2NyaXB0OwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3VwZXJTdHJhdGVnaWVzID0gc3VwZXIuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyU3RyYXRlZ2llcy5sZW5ndGg7IGkrKykgewotCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJfQotCi0JCWlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUIHx8IGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFQ0xBUkFUSU9OKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MKCkpOwotCQl9Ci0KLQkJLy8gYmUgc3VyZSB0aGlzIGlzIGFkZGVkIGxhc3QgaW4gbGlzdCwgc28gaXQgaGFzIGEgY2hhbmdlIHRvIG1vZGlmeQotCQkvLyBwcmV2aW91cyByZXN1bHRzLgotCQkvLyBhZGQgYXV0byBlZGl0IHN0cmF0ZWd5IHRoYXQgaGFuZGxlcyB3aGVuIHRhYiBrZXkgaXMgcHJlc3NlZAotCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMoKSk7Ci0KLQkJcmV0dXJuIChJQXV0b0VkaXRTdHJhdGVneVtdKSBhbGxTdHJhdGVnaWVzLnRvQXJyYXkobmV3IElBdXRvRWRpdFN0cmF0ZWd5W2FsbFN0cmF0ZWdpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIHhtbFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlTdHJpbmdbXSBodG1sVHlwZXMgPSBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbMiArIHhtbFR5cGVzLmxlbmd0aCArIGh0bWxUeXBlcy5sZW5ndGhdOwotCi0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1swXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzWzFdID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OOwotCi0JCQlpbnQgaW5kZXggPSAwOwotCQkJU3lzdGVtLmFycmF5Y29weSh4bWxUeXBlcywgMCwgZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMsIGluZGV4ICs9IDIsIHhtbFR5cGVzLmxlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGh0bWxUeXBlcywgMCwgZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMsIGluZGV4ICs9IHhtbFR5cGVzLmxlbmd0aCwgaHRtbFR5cGVzLmxlbmd0aCk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IG51bGw7Ci0KLQkJaWYgKChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpIHx8IChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQpKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IEhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBKYXZhU2NyaXB0Q29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04pIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZpbmFsIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlciksIElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCi0JCWZvcm1hdHRlci5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwoKSkpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHVibGljIElUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBnZXREb3VibGVDbGlja1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpIHsKLQkJCS8vIHVzZSB4bWwncyBkb3VibGVjbGljayBzdHJhdGVneQotCQkJcmV0dXJuIGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rRGV0ZWN0b3JbXSBnZXRIeXBlcmxpbmtEZXRlY3RvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKHNvdXJjZVZpZXdlciA9PSBudWxsIHx8ICFmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSFlQRVJMSU5LU19FTkFCTEVEKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgYWxsRGV0ZWN0b3JzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJYWxsRGV0ZWN0b3JzLmFkZChuZXcgWE1MSHlwZXJsaW5rRGV0ZWN0b3IoKSk7Ci0KLQkJSUh5cGVybGlua0RldGVjdG9yW10gc3VwZXJEZXRlY3RvcnMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvcnMoc291cmNlVmlld2VyKTsKLQkJZm9yIChpbnQgbSA9IDA7IG0gPCBzdXBlckRldGVjdG9ycy5sZW5ndGg7IG0rKykgewotCQkJSUh5cGVybGlua0RldGVjdG9yIGRldGVjdG9yID0gc3VwZXJEZXRlY3RvcnNbbV07Ci0JCQlpZiAoIWFsbERldGVjdG9ycy5jb250YWlucyhkZXRlY3RvcikpIHsKLQkJCQlhbGxEZXRlY3RvcnMuYWRkKGRldGVjdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElIeXBlcmxpbmtEZXRlY3RvcltdKSBhbGxEZXRlY3RvcnMudG9BcnJheShuZXcgSUh5cGVybGlua0RldGVjdG9yWzBdKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCS8vIHByZWZpeFswXSBpcyBlaXRoZXIgJ1x0JyBvciAnICcgeCB0YWJXaWR0aCwgZGVwZW5kaW5nIG9uIHByZWZlcmVuY2UKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJYm9vbGVhbiB1c2VTcGFjZXMgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMoaW5kZW50Q2hhclByZWYpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJU3RyaW5nQnVmZmVyIHByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYXBwZW5kVGFiID0gZmFsc2U7Ci0KLQkJCWlmICh1c2VTcGFjZXMpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiArIGkgPCBpbmRlbnRhdGlvbldpZHRoOyBqKyspCi0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gaW5kZW50YXRpb25XaWR0aCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFwcGVuZFRhYikgewotCQkJCXByZWZpeC5hcHBlbmQoJ1x0Jyk7Ci0JCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCQkJLy8gcmVtb3ZlIHRoZSB0YWIgc28gdGhhdCBpbmRlbnRhdGlvbiAtIHRhYiBpcyBhbHNvIGFuIGluZGVudAotCQkJCS8vIHByZWZpeAotCQkJCXByZWZpeC5kZWxldGVDaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJfQotCi0JCXZlY3Rvci5hZGQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChTdHJpbmdbXSkgdmVjdG9yLnRvQXJyYXkobmV3IFN0cmluZ1t2ZWN0b3Iuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIElJbmZvcm1hdGlvblByb3ZpZGVyIGdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlJbmZvcm1hdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgewotCQkJLy8gSFRNTAotCQkJcHJvdmlkZXIgPSBuZXcgSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIoKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCS8vIEhUTUwgSmF2YVNjcmlwdAotCQkJcHJvdmlkZXIgPSBuZXcgSmF2YVNjcmlwdEluZm9ybWF0aW9uUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9IG51bGw7Ci0KLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUNMQVJBVElPTikgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhc2NyaXB0KCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUygpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1M7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckhUTUwgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckhUTUw7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmFzY3JpcHQoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhc2NyaXB0ID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckphdmFzY3JpcHQgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhU2NyaXB0KCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckphdmFzY3JpcHQ7Ci0JfQotCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUsIGludCBzdGF0ZU1hc2spIHsKLQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBudWxsOwotCi0JCS8vIGxvb2sgZm9yIGFwcHJvcHJpYXRlIHRleHQgaG92ZXIgcHJvY2Vzc29yIHRvIHJldHVybiBiYXNlZCBvbgotCQkvLyBjb250ZW50IHR5cGUgYW5kIHN0YXRlIG1hc2sKLQkJVGV4dEhvdmVyTWFuYWdlciBtYW5hZ2VyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKTsKLQkJVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yW10gaG92ZXJEZXNjcyA9IG1hbmFnZXIuZ2V0VGV4dEhvdmVycygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgaG92ZXJEZXNjcy5sZW5ndGggJiYgdGV4dEhvdmVyID09IG51bGwpIHsKLQkJCWlmIChob3ZlckRlc2NzW2ldLmlzRW5hYmxlZCgpICYmIEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhob3ZlckRlc2NzW2ldLmdldE1vZGlmaWVyU3RyaW5nKCkpID09IHN0YXRlTWFzaykgewotCQkJCVN0cmluZyBob3ZlclR5cGUgPSBob3ZlckRlc2NzW2ldLmdldElkKCk7Ci0JCQkJaWYgKFRleHRIb3Zlck1hbmFnZXIuQ09NQklOQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKSB7Ci0JCQkJCS8vIGNoZWNrIGlmIHNjcmlwdCBvciBodG1sIGlzIG5lZWRlZAotCQkJCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJCQkJdGV4dEhvdmVyID0gbWFuYWdlci5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgSmF2YVNjcmlwdFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSB7Ci0JCQkJCQl0ZXh0SG92ZXIgPSBtYW5hZ2VyLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFRleHRIb3Zlck1hbmFnZXIuRE9DVU1FTlRBVElPTl9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpCi0JCQkJCS8vIGNoZWNrIGlmIHNjcmlwdCBvciBodG1sIGlzIG5lZWRlZAotCQkJCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJCQkJdGV4dEhvdmVyID0gbmV3IEphdmFTY3JpcHRUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSB7Ci0JCQkJCQl0ZXh0SG92ZXIgPSBuZXcgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpOwotCQkJCQl9Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQotCQkvLyBubyBhcHByb3ByaWF0ZSB0ZXh0IGhvdmVycyBmb3VuZCwgdHJ5IHN1cGVyCi0JCWlmICh0ZXh0SG92ZXIgPT0gbnVsbCkgewotCQkJdGV4dEhvdmVyID0gc3VwZXIuZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUsIHN0YXRlTWFzayk7Ci0JCX0KLQkJcmV0dXJuIHRleHRIb3ZlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1YjUzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBIVE1MIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSFRNTFVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIEhUTUxVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX0hUTUxfZG9jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSFRNTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9IVE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7CS8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfUHVibGljX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1N5c3RlbV9JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0NTU19wcm9maWxlX19fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVycmVkX21hcmt1cF9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZXNfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZXNfVXBwZXJfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVzX0xvd2VyX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lc19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lc19VcHBlcl9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZXNfTG93ZXJfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9mb3JfSFRNTF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9Bc19pc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9Mb3dlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9VcHBlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9mb3JfSFRNTF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9Bc19pc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9Mb3dlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9VcHBlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydF9taXNzaW5nX3RhZ3NfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdF9zb3VyY2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRfRU9MX2NvZGVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfV2luZG93c19VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfVW5peF9VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfTWFjX1VJOwotCi0JLy8gYmVsb3cgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIGRlbGV0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMzsKLQkvLyBhYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3MzE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBIVE1MVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwkKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGh0bWwgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBodG1sIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgSFRNTFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBIVE1MVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBodG1sIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBodG1sIGVkaXRvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlpZiAoZlRlbXBsYXRlU3RvcmUgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlU3RvcmUgPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZShnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBodG1sIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBodG1sIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BTEwpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLlRBRyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEUpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuQVRUUklCVVRFX1ZBTFVFKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JlMDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIEhUTUwgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIEhUTUwgSGlnaGxpZ2h0aW5nIFByZWZlcmVuY2VzCi0jIyB3ZSBuZWVkIGEgZmxhbWluZyBsb2dvCi1TYW1wbGVfSFRNTF9kb2M9PCFET0NUWVBFIEhUTUxcblx0UFVCTElDIFwiLS8vVzNDL0RURC8gSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU5cIlxuXHRcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZFwiPlxuPEhUTUw+XG5cdDxIRUFEPlxuXHRcdDxNRVRBIGNvbnRlbnQ9XCJ0ZXh0L2h0bWxcIj5cblx0XHQ8VElUTEU+SFRNTCBIaWdobGlnaHRpbmcgUHJlZmVyZW5jZXM8L1RJVExFPlxuXHQ8L0hFQUQ+XG48Qk9EWT5cblx0PCEtLVxuXHRcdHdlIG5lZWQgYSBmbGFtaW5nIGxvZ28hXG5cdC0tPlxuPC9CT0RZPlxuPC9IVE1MPgotCi1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8wPUxvYWRpbmcgZmlsZXMuLi4KLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IEhUTUwgUGFnZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEhUTUwgUGFnZQotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgSFRNTCBQYWdlLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0hUTUwgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LgotX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UID0gRmlsZXMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4geW91ciBkZXBsb3llZCBXZWIgYXBwbGljYXRpb24uIAotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IEhUTUwgVGVtcGxhdGUKLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBIVE1MIHBhZ2UuCi1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIEhUTUwgVGVtcGxhdGUKLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldwotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgSFRNTCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5IVE1MIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotIwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotTUVTU0FHRV9IVE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV89SFRNTCBTeW50YXggOiB7MH0KLSMgQ29waWVkIGZyb20gc3NlLnVpCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1DcmVhdGluZ19maWxlcz1DcmVhdGluZyBmaWxlcwotRW5jb2RpbmdfZGVzYz1UaGUgZm9sbG93aW5nIGVuY29kaW5nIHdpbGwgYXBwbHk6Ci1QcmVmZXJyZWRfbWFya3VwX2Nhc2VfVUlfPVByZWZlcnJlZCBtYXJrdXAgY2FzZSBmb3IgY29udGVudCBhc3Npc3QsIGFuZCBjb2RlIGdlbmVyYXRpb24KLVRhZ19uYW1lc19fVUlfPVRhZyBuYW1lczoKLVRhZ19uYW1lc19VcHBlcl9jYXNlX1VJXz0mVXBwZXJjYXNlCi1UYWdfbmFtZXNfTG93ZXJfY2FzZV9VSV89Jkxvd2VyY2FzZQotQXR0cmlidXRlX25hbWVzX19VSV89QXR0cmlidXRlIG5hbWVzOgotQXR0cmlidXRlX25hbWVzX1VwcGVyX2Nhc2VfVUlfPVUmcHBlcmNhc2UKLUF0dHJpYnV0ZV9uYW1lc19Mb3dlcl9jYXNlX1VJXz1MJm93ZXJjYXNlCi1DbGVhbnVwX1VJXz1DbGVhbnVwCi1UYWdfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXz1UYWcgbmFtZSBjYXNlIGZvciBIVE1MOgotVGFnX25hbWVfY2FzZV9Bc19pc19VSV89JkFzLWlzCi1UYWdfbmFtZV9jYXNlX0xvd2VyX1VJXz0mTG93ZXIKLVRhZ19uYW1lX2Nhc2VfVXBwZXJfVUlfPSZVcHBlcgotQXR0cmlidXRlX25hbWVfY2FzZV9mb3JfSFRNTF9VSV89QXR0cmlidXRlIG5hbWUgY2FzZSBmb3IgSFRNTDoKLUF0dHJpYnV0ZV9uYW1lX2Nhc2VfQXNfaXNfVUlfPUEmcy1pcwotQXR0cmlidXRlX25hbWVfY2FzZV9Mb3dlcl9VSV89TCZvd2VyCi1BdHRyaWJ1dGVfbmFtZV9jYXNlX1VwcGVyX1VJXz1VJnBwZXIKLUluc2VydF9yZXF1aXJlZF9hdHRyaWJ1dGVzX1VJXz1JbnNlcnQgJnJlcXVpcmVkIGF0dHJpYnV0ZXMKLUluc2VydF9taXNzaW5nX3RhZ3NfVUlfPSZJbnNlcnQgbWlzc2luZyB0YWdzCi1RdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX1VJXz0mUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotRm9ybWF0X3NvdXJjZV9VSV89JkZvcm1hdCBzb3VyY2UKLUNvbnZlcnRfRU9MX2NvZGVzX1VJXz1Db252ZXJ0IGxpbmUgJmRlbGltaXRlcnMgdG8KLUVPTF9XaW5kb3dzX1VJPSZXaW5kb3dzCi1FT0xfVW5peF9VST1VJk5JWAotRU9MX01hY19VST0mTWFjCi0KLSMgd2ViIGNvbnRlbnQgc2V0dGluZ3MKLVVJX0Rlc2NyaXB0aW9uX29mX3JvbGVfb2ZfZm9sbG93aW5nX0RPQ1RZUEU9VXNlIHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBkb2N1bWVudCB0eXBlIHdoZW4gbm8gRE9DVFlQRSBpcyBkZWNsYXJlZCBpbiBhIGZpbGU6Ci1VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzE9RG9jdW1lbnQgdHlwZToKLVVJX1B1YmxpY19JRD1QdWJsaWMgSUQ6Ci1VSV9TeXN0ZW1fSUQ9U3lzdGVtIElEOgotVUlfbm9uZT1ub25lCi1VSV9DU1NfcHJvZmlsZV9fXzI9Q1NTIHByb2ZpbGU6Ci1XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGUgcHJvcGVydGllcyB1c2VkIHRoYXQgY2Fubm90IG9yIGFyZSBub3Qgc3BlY2lmaWVkIGluIHdlYiBmaWxlcy4gIFRoZSBwcm9qZWN0IHNldHRpbmcgaXMgdXNlZCBpZiB5b3Ugc3BlY2lmeSAibm9uZS4iCi1Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9VGhlIHByb3BlcnRpZXMgZm9yIEoyRUUgV2ViIHByb2plY3RzIGFjdCBhcyAicHJvamVjdCIgZGVmYXVsdCB0byBiZSBsb29rZWQgdXAgd2hlbiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciB3ZWIgZmlsZS4KLQotIyBiZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZAotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMT1BZGQgdGhpcyBzdWZmaXggKGlmIG5vdCBzcGVjaWZpZWQpOgotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMj1JbnNlcnQgRE9DVFlQRSBkZWNsYXJhdGlvbgotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMz1JbnNlcnQgR0VORVJBVE9SIHdpdGggTUVUQSB0YWcKLSMgYWJvdmUgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIGRlbGV0ZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjYwMDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWIzOTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Db25maWd1cmFibGVMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBdXRvRWRpdFN0cmF0ZWd5IHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluc2VydGVkIHdoZW4gVGFiIGtleSBpcyBwcmVzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGlmIG5vdCBpbiBzbWFydCBpbnNlcnQgbW9kZSBqdXN0IGlnbm9yZQotCQlpZiAoIWlzU21hcnRJbnNlcnRNb2RlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKGNvbW1hbmQubGVuZ3RoID09IDAgJiYgY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKSAhPSAtMSkKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IGdldEluZGVudGF0aW9uV2lkdGgoKTsKLQkJaWYgKGluZGVudGF0aW9uV2lkdGggPiAtMSkgewotCQkJU3RyaW5nIG9yaWdpbmFsVGV4dCA9IGNvbW1hbmQudGV4dDsKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihvcmlnaW5hbFRleHQpOwotCi0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQotCQkJSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gZ2V0TGluZVRyYWNrZXIoZG9jdW1lbnQsIG9yaWdpbmFsVGV4dCk7Ci0KLQkJCWludCBzdGFydEluZGV4ID0gMDsKLQkJCWludCBpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50YXRpb25XaWR0aCwgbGluZU9mZnNldCwgbGluZVRyYWNrZXIsIGluZGV4KTsKLQotCQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVyIHdpdGggc3BhY2VzCi0JCQkJbmV3VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIDEsIGluZGVudCk7Ci0JCQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpbmVUcmFja2VyLnJlcGxhY2UoaW5kZXgsIDEsIGluZGVudCk7Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggcmVwbGFjaW5nIHRleHQsIGp1c3QKLQkJCQkJCS8vIHJlc2V0IHRvIGN1cnJlbnQgc3RyaW5nCi0JCQkJCQlsaW5lVHJhY2tlci5zZXQobmV3VGV4dC50b1N0cmluZygpKTsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXN0YXJ0SW5kZXggPSBpbmRleCArIGluZGVudC5sZW5ndGgoKTsKLQkJCQlpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWNvbW1hbmQudGV4dCA9IG5ld1RleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygc3BhY2VzIGZvciBuZXh0IHRhYiBzdG9wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRhdGlvbldpZHRoLCBpbnQgbGluZU9mZnNldCwgSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQlpbnQgb2Zmc2V0SW5MaW5lID0gLTE7Ci0JCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBsaW5lVHJhY2tlci5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbmRleCk7Ci0JCQkJaWYgKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDAgJiYgbGluZU9mZnNldCA+IC0xKQotCQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQkJZWxzZQotCQkJCQlvZmZzZXRJbkxpbmUgPSBpbmRleCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9mZnNldEluTGluZSA+IC0xICYmIGluZGVudGF0aW9uV2lkdGggPiAwKSB7Ci0JCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRTaXplOyBpKyspCi0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKGRlbGltc1swXSAhPSAtMSB8fCBkZWxpbXNbMV0gIT0gLTEpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUoKSB7Ci0JCWJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUgPSBmYWxzZTsKLQkJCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcillZGl0b3I7Ci0JCQkJCWVsc2UKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gY2hlY2sgaWYgc21hcnQgaW5zZXJ0IG1vZGUKLQkJaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKQotCQkJaXNTbWFydEluc2VydE1vZGUgPSB0cnVlOwotCQlyZXR1cm4gaXNTbWFydEluc2VydE1vZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCXJldHVybiB3aWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdkNjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQXV0b21hdGljYWxseSBpbnNlcnRzIGNsb3NpbmcgY29tbWVudCB0YWcgb3IgZW5kIHRhZyB3aGVuIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCS8qCi0JICogTk9URTogY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3RzIGluCi0JICogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdAotCSAqIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICovCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJT2JqZWN0IHRleHRFZGl0b3IgPSBnZXRBY3RpdmVUZXh0RWRpdG9yKCk7Ci0JCWlmICghKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCkgewotCQkJCQlzbWFydEluc2VydEZvckNvbW1lbnQoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQkJc21hcnRJbnNlcnRGb3JFbmRUYWcoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50ICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JDb21tZW50KERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCItIikgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMyAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAzLCAzKS5lcXVhbHMoIjwhLSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWNvbW1hbmQudGV4dCArPSAiICAtLT4iOyAvLyROT04tTkxTLTEkCi0JCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDI7Ci0JCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvckVuZFRhZyhEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiLyIpICYmIGRvY3VtZW50LmdldExlbmd0aCgpID49IDEgJiYgZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0IC0gMSwgMSkuZXF1YWxzKCI8IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgKChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCAtIDEpKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlIHBhcmVudAotCQkJCQl3aGlsZSAocGFyZW50Tm9kZSAhPSBudWxsICYmIGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0RvY3VtZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBvbmx5IGFkZCBlbmQgdGFnIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmCi0JCQkJCS8vIGFkZCAnLycgZG9lcyBub3QgY3JlYXRlIG9uZSBhbHJlYWR5Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcGFyZW50Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgdG9BZGQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAodG9BZGQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdG9BZGQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgc3VmZml4ID0gdG9BZGQudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoKGRvY3VtZW50LmdldExlbmd0aCgpIDwgY29tbWFuZC5vZmZzZXQgKyBzdWZmaXgubGVuZ3RoKCkpIHx8ICghc3VmZml4LmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIHN1ZmZpeC5sZW5ndGgoKSkpKSkgewotCQkJCQkJCQljb21tYW5kLnRleHQgKz0gc3VmZml4OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA4ZmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1ha2UgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbyBpbnRvIGNvbnRlbnQKLSAqIGZpdCBmb3IgYW4gSFRNTCB2aWV3ZXIgKGJ5IGVzY2FwaW5nIGNoYXJhY3RlcnMpCi0gKi8KLWNsYXNzIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwgZXh0ZW5kcyBUZW1wbGF0ZVByb3Bvc2FsIGltcGxlbWVudHMgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCi0JcHVibGljIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgSW1hZ2UgaW1hZ2UsIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgaW1hZ2UsIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCXJldHVybiBTdHJpbmdVdGlscy5jb252ZXJ0VG9IVE1MQ29udGVudChhZGRpdGlvbmFsSW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFkMzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmNvbW1vbi5jb250ZW50YXNzaXN0LkphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnlGb3JDU1MgPSBudWxsOwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGlzWEhUTUwgPSBmYWxzZTsKLQlwcml2YXRlIEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlRlbXBsYXRlQ29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuQVRUUklCVVRFKTsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEVfVkFMVUUpOwotCQlzdXBlci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wb3NhbHMgZm9yIGEgY29tcGxldGVseSBlbXB0eSBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJaWYgKGlzWEhUTUwpCi0JCQlzdXBlci5hZGRQQ0RBVEFQcm9wb3NhbChub2RlTmFtZSwgY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJaWYgKGlzWEhUTUwpCi0JCQlhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuVEFHKTsKLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBpZiBhbHJlYWR5IGFkZGluZyB0ZW1wbGF0ZSBwcm9wb3NhbHMgZm9yIGEgY2VydGFpbiBjb250ZXh0IHR5cGUsIGRvCi0JCS8vIG5vdCBhZGQgYWdhaW4KLQkJaWYgKCFmVGVtcGxhdGVDb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuYWRkKGNvbnRleHQpOwotCQkJYm9vbGVhbiB1c2VQcm9wb3NhbExpc3QgPSAhY29udGVudEFzc2lzdFJlcXVlc3Quc2hvdWxkU2VwYXJhdGUoKTsKLQotCQkJaWYgKGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpICE9IG51bGwpIHsKLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShjb250ZXh0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZlRleHRWaWV3ZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAodXNlUHJvcG9zYWxMaXN0KQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWxzW2ldKTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkTWFjcm8ocHJvcG9zYWxzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChhU3RyaW5nID09IG51bGwgfHwgcHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaW50IG1pbmltdW1MZW5ndGggPSBNYXRoLm1pbihwcmVmaXgubGVuZ3RoKCksIGFTdHJpbmcubGVuZ3RoKCkpOwotCQlTdHJpbmcgYmVnaW5uaW5nID0gYVN0cmluZy5zdWJzdHJpbmcoMCwgbWluaW11bUxlbmd0aCk7Ci0JCXJldHVybiBiZWdpbm5pbmcuZXF1YWxzSWdub3JlQ2FzZShwcmVmaXgpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJLy8gYnVnMTE1OTI3IHVzZSBvcmlnaW5hbCBkb2N1bWVudCBwb3NpdGlvbiBmb3IgYWxsL2FueSByZWdpb24gdGVtcGxhdGVzCi0JCWFkZFRlbXBsYXRlcyhyZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BTEwsIGRvY3VtZW50UG9zaXRpb24pOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHByb3Bvc2VkIGNvZGUgY29tcGxldGlvbnMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQtZWRpdG9yIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGEgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29kZS1hc3Npc3QgaXRlbXMKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIHRyZWVOb2RlOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJLy8gY2hlY2sgaWYgaXQncyBpbiBhIGNvbW1lbnQgbm9kZQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChmbiAhPSBudWxsICYmIGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgJiYgZG9jdW1lbnRQb3NpdGlvbiAhPSBmbi5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCX0KLQotCQkvLyBDTVZDIDI0MjY5NQotCQkvLyBpZiBpdCdzIGEgPC9zY3JpcHQ+IHRhZywgYm91bmNlIGJhY2sgdG8gSlMgY2EgcHJvY2Vzc29yLi4uCi0JCWlmIChmbiAhPSBudWxsICYmIGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCB2ID0gZm4uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHYuc2l6ZSgpID4gMSkgewotCQkJCS8vIGRldGVybWluZSB0aGF0IGl0J3MgYSBjbG9zZSB0YWcKLQkJCQlpZiAoKHYuZ2V0KDApKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ID0gdi5pdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCQkvLyBzZWFyY2ggZm9yIHNjcmlwdCB0YWcgbmFtZQotCQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJCWlmIChmbi5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIHJldHVybiBKUyBjb250ZW50IGFzc2lzdC4uLgotCQkJCQkJCUphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzUHJvY2Vzc29yID0gbmV3IEphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQkJcmV0dXJuIGpzUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaXNYSFRNTCA9IGdldFhIVE1MKG5vZGUpOwotCi0JCWZHZW5lcmF0b3IgPSBudWxsOyAvLyBmb3JjZSByZWxvYWQgb2YgY29udGVudCBnZW5lcmF0b3IKLQotCQkvLyBoYW5kbGUgYmxhbmsgSFRNTCBkb2N1bWVudCBjYXNlCi0JCWlmICh0cmVlTm9kZSA9PSBudWxsIHx8IGlzVmlld2VyRW1wdHkodGV4dFZpZXdlcikpIHsKLQkJCS8vIGN1cnNvciBpcyBhdCB0aGUgRU9GCi0JCQlJQ29tcGxldGlvblByb3Bvc2FsIGh0bWxUYWdQcm9wb3NhbCA9IGdldEhUTUxUYWdQcm9wc29zYWwoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBzdXBlclJlc3VsdHMgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWlmIChzdXBlclJlc3VsdHMgIT0gbnVsbCAmJiBzdXBlclJlc3VsdHMubGVuZ3RoID4gMCAmJiBodG1sVGFnUHJvcG9zYWwgIT0gbnVsbCkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBibGFua0hUTUxEb2NSZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbc3VwZXJSZXN1bHRzLmxlbmd0aCArIDFdOwotCQkJCWJsYW5rSFRNTERvY1Jlc3VsdHNbMF0gPSBodG1sVGFnUHJvcG9zYWw7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShzdXBlclJlc3VsdHMsIDAsIGJsYW5rSFRNTERvY1Jlc3VsdHMsIDEsIHN1cGVyUmVzdWx0cy5sZW5ndGgpOwotCQkJCXJldHVybiBibGFua0hUTUxEb2NSZXN1bHRzOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQotCQkJLy8gY2hlY2sgZW1iZWRkZWQgQ1NTIHByb3Bvc2FscyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBTVFlMRSBlbmQKLQkJCS8vIHRhZwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkpIHsvLyROT04tTkxTLTEkCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIG9mZnNldDsKLQkJCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRDU1NQcm9wb3NhbHModGV4dFZpZXdlciwgcG9zLCBub2RlLCBvZmZzZXQsIChjaGFyKSAwKTsKLQkJCQkJCWlmIChwcm9wb3NhbHMgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gcHJvcG9zYWxzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBpbmxpbmUgQ1NTIHByb3Bvc2FscwotCQkJLy8gbmVlZCB0byBmaW5kIGF0dHIgcmVnaW9uIGZyb20gc2QgcmVnaW9uCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHN0eWxlTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiBzdHlsZVZhbHVlUmVnaW9uID0gbnVsbDsKLQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCXN0eWxlTmFtZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJaWYgKHN0eWxlTmFtZVJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgJiYgc2RSZWdpb24uZ2V0VGV4dChzdHlsZU5hbWVSZWdpb24pLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyB0aGUgbmV4dCByZWdpb24gc2hvdWxkIGJlICI9IgotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCXJlZ2lvbnMubmV4dCgpOyAvLyBza2lwIHRoZSAiPSIKLQkJCQkJCS8vIG5leHQgcmVnaW9uIHNob3VsZCBiZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJc3R5bGVWYWx1ZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzdHlsZVZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3R5bGVWYWx1ZVJlZ2lvbik7Ci0JCQkJaW50IGVuZCA9IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoc3R5bGVWYWx1ZVJlZ2lvbik7Ci0JCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gb2Zmc2V0ICYmIGRvY3VtZW50UG9zaXRpb24gPD0gZW5kKSB7Ci0JCQkJCWJvb2xlYW4gYXNrQ1NTID0gdHJ1ZTsKLQkJCQkJY2hhciBxdW90ZSA9IChjaGFyKSAwOwotCQkJCQlTdHJpbmcgdGV4dCA9IHNkUmVnaW9uLmdldFRleHQoc3R5bGVWYWx1ZVJlZ2lvbik7Ci0JCQkJCWludCBsZW5ndGggPSAodGV4dCAhPSBudWxsID8gdGV4dC5sZW5ndGgoKSA6IDApOwotCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJY2hhciBmaXJzdENoYXIgPSB0ZXh0LmNoYXJBdCgwKTsKLQkJCQkJCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gb2Zmc2V0KSB7Ci0JCQkJCQkJCS8vIGJlZm9yZSBxdW90ZQotCQkJCQkJCQlhc2tDU1MgPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW9mZnNldCsrOwotCQkJCQkJCQlxdW90ZSA9IGZpcnN0Q2hhcjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBlbmQpIHsKLQkJCQkJCQlpZiAobGVuZ3RoID4gMSAmJiB0ZXh0LmNoYXJBdChsZW5ndGggLSAxKSA9PSBxdW90ZSkgewotCQkJCQkJCQkvLyBhZnRlciBxdW90ZQotCQkJCQkJCQlhc2tDU1MgPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGFza0NTUykgewotCQkJCQkJaW50IHBvcyA9IGRvY3VtZW50UG9zaXRpb24gLSBvZmZzZXQ7Ci0JCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0Q1NTUHJvcG9zYWxzKHRleHRWaWV3ZXIsIHBvcywgbm9kZSwgb2Zmc2V0LCBxdW90ZSk7Ci0JCQkJCQlpZiAocHJvcG9zYWxzICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIHByb3Bvc2FsczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gdGV4dCBvciBpdCdzIGFsbCB3aGl0ZSBzcGFjZSwgb3RoZXJ3aXNlCi0JICogcmV0dXJucyBmYWxzZQotCSAqIAotCSAqIEBwYXJhbSB0cmVlTm9kZQotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld2VyRW1wdHkoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlib29sZWFuIGlzRW1wdHkgPSBmYWxzZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJaXNFbXB0eSA9IHRydWU7Ci0JCXJldHVybiBpc0VtcHR5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbAotCSAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRIVE1MVGFnUHJvcHNvc2FsKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSU1vZGVsTWFuYWdlciBtbSA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobW0gIT0gbnVsbCkgewotCQkJCW1vZGVsID0gbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJSURPTURvY3VtZW50IGRvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2MpOwotCQkJCQlpZiAobXEgIT0gbnVsbCkgewotCi0JCQkJCQkvLyBYSFRNTCByZXF1aXJlcyBsb3dlcmNhc2UgdGFnbmFtZSBmb3IgbG9va3VwCi0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBodG1sRGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbXEuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jKS5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTC50b0xvd2VyQ2FzZSgpKTsKLQkJCQkJCWlmIChodG1sRGVjbCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIHByb3Bvc2VkVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcoZG9jLCBodG1sRGVjbCwgcHJvcG9zZWRUZXh0QnVmZmVyKTsKLQotCQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBwcm9wb3NlZFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWROYW1lID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFJlcXVpcmVkTmFtZShkb2MsIGh0bWxEZWNsKTsKLQotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBkb2N1bWVudFBvc2l0aW9uLAotCQkJCQkJCS8qIHN0YXJ0IHBvcyAqLwotCQkJCQkJCTAsIC8qIHJlcGxhY2UgbGVuZ3RoICovCi0JCQkJCQkJcmVxdWlyZWROYW1lLmxlbmd0aCgpICsgMiwgLyoKLQkJCQkJCQkJCQkJCQkJICogY3Vyc29yIHBvc2l0aW9uCi0JCQkJCQkJCQkJCQkJCSAqIGFmdGVyIChyZWxhdnRpdmUgdG8KLQkJCQkJCQkJCQkJCQkJICogc3RhcnQpCi0JCQkJCQkJCQkJCQkJCSAqLwotCQkJCQkJCUhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIHJlcXVpcmVkTmFtZSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX05BTUUpOwotCQkJCQkJCXJlc3VsdCA9IHByb3Bvc2FsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZW50R2VuZXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoKSB7Ci0JCWlmIChmR2VuZXJhdG9yID09IG51bGwpIHsKLQkJCWlmIChpc1hIVE1MKQotCQkJCWZHZW5lcmF0b3IgPSBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWVsc2UKLQkJCQlmR2VuZXJhdG9yID0gSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZkdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldENTU1Byb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBwb3MsIElET01Ob2RlIGVsZW1lbnQsIGludCBvZmZzZXQsIGNoYXIgcXVvdGUpIHsKLQotCQlDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNzc1Byb2Nlc3NvciA9IG5ldyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWNzc1Byb2Nlc3Nvci5zZXREb2N1bWVudE9mZnNldChvZmZzZXQpOwotCQljc3NQcm9jZXNzb3Iuc2V0UXVvdGVDaGFyT2ZTdHlsZUF0dHJpYnV0ZShxdW90ZSk7Ci0KLQkJcmV0dXJuIGNzc1Byb2Nlc3Nvci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIHBvcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbXB0eVRhZ0Nsb3NlU3RyaW5nKCkgewotCQlpZiAoaXNYSFRNTCkKLQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZUZW1wbGF0ZVByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVQcm9jZXNzb3IgPSBuZXcgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgRG9jdW1lbnQgaXMgYW4gWEhUTUwgRG9jdW1lbnQuIE9wcmF0ZXMgc29sZWx5IG9mZiBvZgotCSAqIHRoZSBEb2N1bWVudCBUeXBlIGRlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0WEhUTUwoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJZWxzZQotCQkJZG9jID0gKChEb2N1bWVudCkgbm9kZSk7Ci0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkKLQkJCXJldHVybiAoKElET01Eb2N1bWVudCkgZG9jKS5pc1hNTFR5cGUoKTsKLQotCi0JCWlmIChkb2MgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvYykuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkgIT0gbnVsbCkKLQkJCQljbWRvYyA9IGFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvYyk7Ci0JCQlpZiAoY21kb2MgIT0gbnVsbCkgewotCQkJCS8vIHRyZWF0IGFzIFhIVE1MIHVubGVzcyB3ZSd2ZSBnb3QgdGhlIGluLWNvZGUgSFRNTCBjb250ZW50Ci0JCQkJLy8gbW9kZWwKLQkJCQlpZiAoY21kb2MgaW5zdGFuY2VvZiBIVE1MQ01Eb2N1bWVudCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjbWRvYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCQkJcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoY21kb2MuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpOwotCQkJfQotCQl9Ci0JCS8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBkb2MuZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gZG9jVHlwZSAhPSBudWxsICYmIGRvY1R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsICYmIGRvY1R5cGUuZ2V0UHVibGljSWQoKS5pbmRleE9mKCItLy9XM0MvL0RURCBYSFRNTCAiKSA9PSAwOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJcmVpbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVpbml0KCkgewotCQlTdHJpbmcga2V5ID0gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRTsKLQkJYm9vbGVhbiBkb0F1dG8gPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSk7Ci0JCWlmIChkb0F1dG8pIHsKLQkJCWtleSA9IEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERTsKLQkJCWNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhrZXkpLnRvQ2hhckFycmF5KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZhY3RvcnlGb3JDU1MgIT0gbnVsbCkgewotCQkJZmFjdG9yeUZvckNTUy5yZWxlYXNlKCk7Ci0JCX0KLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJcmV0dXJuIGEuZXF1YWxzSWdub3JlQ2FzZShiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0KLQkJaWYgKHByb3BlcnR5LmNvbXBhcmVUbyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSA9PSAwIHx8IHByb3BlcnR5LmNvbXBhcmVUbyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpID09IDApIHsKLQkJCXJlaW5pdCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSA9PSBudWxsKQotCQkJZlByZWZlcmVuY2VTdG9yZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkYWExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGluc3RhbmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGZUYWdDYXNlOwotCXByb3RlY3RlZCBpbnQgZkF0dHJDYXNlOwotCi0JLyoqCi0JICogSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQkvL0lQcmVmZXJlbmNlU3RvcmUgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKENvbnRlbnRUeXBlLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZUYWdDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpOwotCQlmQXR0ckNhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRW5kVGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQlyZXR1cm47Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvIiArIHRhZ05hbWUgKyAiPiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyZXR1cm47Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoIWNtbm9kZS5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGNtbm9kZS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgb3duZXJOb2RlLCBDTU5vZGUgY21ub2RlKSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuZ2V0UmVxdWlyZWROYW1lKG93bmVyTm9kZSwgY21ub2RlKTsKLQkJLy8gZG9uJ3QgY2hhbmdlIHRoZSBjYXNlIHVubGVzcyB3ZSdyZSBjZXJ0YWluIGl0IGlzIG1lYW5pbmdsZXNzCi0JCWlmIChzaG91bGRJZ25vcmVDYXNlKGNtbm9kZSkpIHsKLQkJCWludCBjYXNlVmFsID0gLTE7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQkJY2FzZVZhbCA9IGZUYWdDYXNlOwotCQkJZWxzZSBpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLQkJCQljYXNlVmFsID0gZkF0dHJDYXNlOwotCQkJc3dpdGNoIChjYXNlVmFsKSB7Ci0JCQkJY2FzZSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUiA6Ci0JCQkJCXsKLQkJCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6Ci0JCQkJCXsKLQkJCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3RoZXI7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybiAiLz4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJCWlmIChvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVCkpIHsKLQkJCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yKCk7Ci0JCWluc3RhbmNlLmluaXQoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5ZDZmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlczsKLQotCi0vKioKLSAqIENvbXBsZXRpb24gcHJvY2Vzc29yIGZvciBIVE1MIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUKLSAqIGJ5IHRoZSBIVE1MIENvbnRlbnQgQXNzaXN0IHByb2Nlc3Nvciwgc28gYnkgdGhlIHRpbWUgdGhlCi0gKiBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGlzIGFza2VkIGZvciBjb250ZW50IGFzc2lzdCBwcm9wb3NhbHMsIHRoZQotICogSFRNTCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByb3Bvc2FsQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCXJldHVybiAoKFRlbXBsYXRlUHJvcG9zYWwpIG8yKS5nZXRSZWxldmFuY2UoKSAtICgoVGVtcGxhdGVQcm9wb3NhbCkgbzEpLmdldFJlbGV2YW5jZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBmZ1Byb3Bvc2FsQ29tcGFyYXRvciA9IG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIFN0cmluZyBmQ29udGV4dFR5cGVJZCA9IG51bGw7Ci0KLQkvKgotCSAqIENvcGllZCBmcm9tIHN1cGVyIGNsYXNzIGV4Y2VwdCBpbnN0ZWFkIG9mIGNhbGxpbmcgY3JlYXRlQ29udGV4dCh2aWV3ZXIsCi0JICogcmVnaW9uKSBjYWxsIGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQkvLyBhZGp1c3Qgb2Zmc2V0IHRvIGVuZCBvZiBub3JtYWxpemVkIHNlbGVjdGlvbgotCQlpZiAoc2VsZWN0aW9uLmdldE9mZnNldCgpID09IG9mZnNldCkKLQkJCW9mZnNldCA9IHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQotCQlTdHJpbmcgcHJlZml4ID0gZXh0cmFjdFByZWZpeCh2aWV3ZXIsIG9mZnNldCk7Ci0JCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCAtIHByZWZpeC5sZW5ndGgoKSwgcHJlZml4Lmxlbmd0aCgpKTsKLQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCQkvLyBuYW1lIG9mIHRoZSBzZWxlY3Rpb24gdmFyaWFibGVzIHtsaW5lLCB3b3JkfV9zZWxlY3Rpb24KLQkJY29udGV4dC5zZXRWYXJpYWJsZSgic2VsZWN0aW9uIiwgc2VsZWN0aW9uLmdldFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZVtdIHRlbXBsYXRlcyA9IGdldFRlbXBsYXRlcyhjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSk7Ci0KLQkJTGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZXNbaV07Ci0JCQl0cnkgewotCQkJCWNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS52YWxpZGF0ZSh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRlbXBsYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0ZW1wbGF0ZS5tYXRjaGVzKHByZWZpeCwgY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpKQotCQkJCW1hdGNoZXMuYWRkKGNyZWF0ZVByb3Bvc2FsKHRlbXBsYXRlLCBjb250ZXh0LCAoSVJlZ2lvbikgcmVnaW9uLCBnZXRSZWxldmFuY2UodGVtcGxhdGUsIHByZWZpeCkpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQobWF0Y2hlcywgZmdQcm9wb3NhbENvbXBhcmF0b3IpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBtYXRjaGVzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbbWF0Y2hlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29uY3JldGUgdGVtcGxhdGUgY29udGV4dCBmb3IgdGhlIGdpdmVuIHJlZ2lvbiBpbiB0aGUKLQkgKiBkb2N1bWVudC4gVGhpcyBpbnZvbHZlcyBmaW5kaW5nIG91dCB3aGljaCBjb250ZXh0IHR5cGUgaXMgdmFsaWQgYXQgdGhlCi0JICogZ2l2ZW4gbG9jYXRpb24sIGFuZCB0aGVuIGNyZWF0aW5nIGEgY29udGV4dCBvZiB0aGlzIHR5cGUuIFRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIDxjb2RlPlNtYXJ0UmVwbGFjZVRlbXBsYXRlQ29udGV4dDwvY29kZT4gZm9yCi0JICogdGhlIGNvbnRleHQgdHlwZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uIFRoaXMgdGFrZXMgdGhlIG9mZnNldCBhdCB3aGljaAotCSAqIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIGZvciB3aGljaCB0aGUgY29udGV4dCBpcyBjcmVhdGVkCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBpbnRvIDxjb2RlPmRvY3VtZW50PC9jb2RlPiBmb3Igd2hpY2ggdGhlCi0JICogICAgICAgICAgICBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgb2Zmc2V0IHdoZXJlIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkCi0JICogQHJldHVybiBhIHRlbXBsYXRlIGNvbnRleHQgdGhhdCBjYW4gaGFuZGxlIHRlbXBsYXRlIGluc2VydGlvbiBhdCB0aGUKLQkgKiAgICAgICAgIGdpdmVuIGxvY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyBwcmV0dHkgbXVjaCBzYW1lIGNvZGUgYXMgc3VwZXIuY3JlYXRlQ29udGV4dCBleGNlcHQgY3JlYXRlCi0JCS8vIFNtYXJ0UmVwbGFjZVRlbXBsYXRlQ29udGV4dAotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gZ2V0Q29udGV4dFR5cGUodmlld2VyLCByZWdpb24pOwotCQlpZiAoY29udGV4dFR5cGUgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlyZXR1cm4gbmV3IFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgaW50IHJlbGV2YW5jZSkgewotCQlyZXR1cm4gbmV3IEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgZ2V0SW1hZ2UodGVtcGxhdGUpLCByZWxldmFuY2UpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZUNvbnRleHRUeXBlIGdldENvbnRleHRUeXBlKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24pIHsKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlID0gbnVsbDsKLQotCQlDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0JCQl0eXBlID0gcmVnaXN0cnkuZ2V0Q29udGV4dFR5cGUoZkNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX1RFTVBMQVRFKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlW10gZ2V0VGVtcGxhdGVzKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlc1tdID0gbnVsbDsKLQotCQlUZW1wbGF0ZVN0b3JlIHN0b3JlID0gZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkKLQkJCXRlbXBsYXRlcyA9IHN0b3JlLmdldFRlbXBsYXRlcyhjb250ZXh0VHlwZUlkKTsKLQotCQlyZXR1cm4gdGVtcGxhdGVzOwotCX0KLQotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MTJmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmNvbW1vbi5jb250ZW50YXNzaXN0LkphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCBleHRlbmRzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQkKLQkJc3VwZXIuaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIGh0bWxQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCwgaHRtbFByb2Nlc3Nvcik7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbmV3IEphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBULCBqc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUNTU1BhcnRpdGlvbnMuU1RZTEUsIGNzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjg5NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotCi0vKioKLSAqIEp1c3QgbGlrZSBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCBleGNlcHQgaWYgYW4gaW5zZXJ0IG9mZnNldCBpcyBwYXNzZWQgaW4sCi0gKiBkdXJpbmcgZXZhbHVhdGlvbiwgdGhlICJwcmVmaXgiIGJlZm9yZSB0aGUgdGVtcGxhdGUgd2lsbCBiZSBjaGVja2VkIHRvIHNlZQotICogaWYgaXQgbWF0Y2hlcyB0aGUgdGVtcGxhdGUgbmFtZS4gSWYgc28sIG92ZXJ3cml0ZSB0aGUgdGVtcGxhdGUgbmFtZS4KLSAqIE90aGVyd2lzZSwganVzdCBpbnNlcnQgdGhlIHRlbXBsYXRlIGF0IHRoZSBpbnNlcnQgb2Zmc2V0IGxvY2F0aW9uIChieSBub3QKLSAqIG92ZXJ3cml0aW5nIHRoZSBwcmVmaXggdGV4dCkKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0IGV4dGVuZHMgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgewotCXByaXZhdGUgaW50IGZJbnNlcnRPZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuIFRoZSBzdXBwbGllZCA8Y29kZT5Qb3NpdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHF1ZXJpZWQgdG8gY29tcHV0ZSB0aGUgPGNvZGU+Z2V0U3RhcnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmdldEVuZDwvY29kZT4gbWV0aG9kcywgd2hpY2ggd2lsbCB0aGVyZWZvcmUgYW5zd2VyIHVwZGF0ZWQKLQkgKiBwb3NpdGlvbiBkYXRhIGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGRlc2NyaWJpbmcgdGhlIGFyZWEgb2YgdGhlIGRvY3VtZW50IHdoaWNoIGZvcm1zCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgY29udGV4dAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXN1cGVyKHR5cGUsIGRvY3VtZW50LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBpbnNlcnRPZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbiB3aGVyZSBpbnNlcnQgd2FzCi0JICogICAgICAgICAgICBvcmlnaW5hbGx5IHJlcXVlc3RlZAotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGluc2VydE9mZnNldCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQkJZkluc2VydE9mZnNldCA9IGluc2VydE9mZnNldDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0I2V2YWx1YXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlKQotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZUJ1ZmZlciBldmFsdWF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBUZW1wbGF0ZUV4Y2VwdGlvbiB7Ci0JCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IHN1cGVyLmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAoZkluc2VydE9mZnNldCA+IC0xICYmIGZJbnNlcnRPZmZzZXQgPiBnZXRTdGFydCgpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldERvY3VtZW50KCkuZ2V0KGdldFN0YXJ0KCksIGZJbnNlcnRPZmZzZXQgLSBnZXRTdGFydCgpKTsKLQkJCQlpZiAoIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgYSBuZXcgYnVmZmVyIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlCi0JCQkJCS8vIHRleHQgdGhhdCB3YXMgZ29pbmcgdG8gYmUgb3ZlcndyaXR0ZW4KLQkJCQkJYnVmZmVyID0gbmV3IFRlbXBsYXRlQnVmZmVyKHByZWZpeCArIGJ1ZmZlci5nZXRTdHJpbmcoKSwgYnVmZmVyLmdldFZhcmlhYmxlcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmOWFmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcml2YXRlIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGVsZW1lbnREZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJaWYgKCgoQm9vbGVhbikgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJCWlmIChvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJcmV0dXJuOwotCQlidWZmZXIuYXBwZW5kKCI8LyIgKyB0YWdOYW1lICsgIj4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3RoZXI7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFTVBUWSB0YWcsIGRvIGEgc2VsZi1jbG9zZQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJLy8gaWYgaXQncyBhIEpTUCBlbGVtZW50LCBkb24ndCBhZGQgdGhlIHNwYWNlIHNpbmNlIHRoZSBKU1AgY29udGFpbmVyIGRvZXNuJ3Qvc2hvdWxkbid0IGNhcmUKLQkJCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gJiYgKCgoQm9vbGVhbikgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKSkpCi0JCQkJLy8gaWYgaXQncyBub3QgSlNQLCBjb25mb3JtIHRvIFhIVE1MIGd1aWRlbGluZXMgYW5kIGFkZCB0aGUgc3BhY2UKLQkJCQlyZXR1cm4gIi8+IjsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIG5vdCBkZWZpbmVkIGFzIEVNUFRZLCBidXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc3VjaCBhbnl3YXkKLQkJZWxzZSBpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9IVE1MTm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0hUTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGE0Y2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0hUTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxOb2RlQWN0aW9uTWFuYWdlciBleHRlbmRzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIHsKLQlwcm90ZWN0ZWQgaW50IGZUYWdDYXNlOwotCXByb3RlY3RlZCBpbnQgZkF0dHJDYXNlOwotCi0JcHVibGljIEhUTUxOb2RlQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1vZGVsLCB2aWV3ZXIpOwotCQl1cGRhdGVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgbmVjY2Vzc2FyeSwgZW1wbG95IGEgRE9NQ29udGVudEJ1aWxkZXIgdGhhdCB1bmRlcnN0YW5kcyBob3cgdG8KLQkgKiBjaGFuZ2UgdGhlIGNhc2Ugb2YgSFRNTCB0YWdzIChidXQgTk9UIHRhZ2xpYiBkZXJpdmVkIHRhZ3MpLgotCSAqLwotCXB1YmxpYyBET01Db250ZW50QnVpbGRlciBjcmVhdGVET01Db250ZW50QnVpbGRlcihEb2N1bWVudCBkb2N1bWVudCkgewotCQlET01Db250ZW50QnVpbGRlciBidWlsZGVyID0gbnVsbDsKLQkJU3RyaW5nIG9uZSA9IGZNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKS5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCQlTdHJpbmcgbW9kZWxDb250ZW50VHlwZUlkID0gZk1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQlpZiAob25lICE9IG1vZGVsQ29udGVudFR5cGVJZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZXF1YWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChtb2RlbENvbnRlbnRUeXBlSWQuZXF1YWxzKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCkpCi0JCQlidWlsZGVyID0gbmV3IEhUTUxDb250ZW50QnVpbGRlcihkb2N1bWVudCk7Ci0JCWVsc2UKLQkJCWJ1aWxkZXIgPSBzdXBlci5jcmVhdGVET01Db250ZW50QnVpbGRlcihkb2N1bWVudCk7Ci0KLQkJcmV0dXJuIGJ1aWxkZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoIWNtbm9kZS5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGNtbm9kZS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSB0aGUgZGlzcGxheWVkIG1lbnVpdGVtIGxhYmVsIHRvIGNoYW5nZSB0aGUgY2FzZSBvZiBIVE1MIGNoaWxkcmVuCi0JICogYnV0IG5laXRoZXIgWE1MIG5vciB0YWdsaWItZGVyaXZlZCBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBDTU5vZGUgY21ub2RlID0gYWN0aW9uLmdldENNTm9kZSgpOwotCQkvLyBkb24ndCBjaGFuZ2UgdGhlIGNhc2UgdW5sZXNzIHdlJ3JlIGNlcnRhaW4gaXQgaXMgbWVhbmluZ2xlc3MKLQkJaWYgKHNob3VsZElnbm9yZUNhc2UoY21ub2RlKSkgewotCQkJU3RyaW5nIG5hbWUgPSBjbW5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCQkJCWlmIChmVGFnQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQllbHNlIGlmIChmVGFnQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkvLyBlbHNlIGRvIG5vdGhpbmcKLQkJCX0KLQkJCWVsc2UgaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQlpZiAoZkF0dHJDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWVsc2UgaWYgKGZBdHRyQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkvLyBlbHNlIGRvIG5vdGhpbmcKLQkJCX0KLQkJCXJlc3VsdCA9IG5hbWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBzdXBlci5nZXRMYWJlbChwYXJlbnQsIGNtbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFub3RoZXIgSFRNTCBzcGVjaWZpYyBkZXRhaWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FzZSgpIHsKLQkJaWYgKGZNb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxDb250ZW50VHlwZUlkID0gZk1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQkJaWYgKG1vZGVsQ29udGVudFR5cGVJZCAhPSBudWxsKSB7Ci0JCQkJaWYgKG1vZGVsQ29udGVudFR5cGVJZC5lcXVhbHMoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKSkgewotCQkJCQlQcmVmZXJlbmNlcyBwcmVmcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZUYWdDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpOwotCQkJCQlmQXR0ckNhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZm9ybWF0KE5vZGUgbmV3RWxlbWVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCXRyeSB7Ci0JCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotCQkJZk1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZQotCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsKCk7Ci0JCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShuZXdFbGVtZW50KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotCQkJZk1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODFiMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZmFjdG9yeSB0byBjcmVhdGUgSkZhY2VOb2RlQWRhcHRlcnMuICBVc2UgdGhpcwotICogYWRhcHRlciBmYWN0b3J5IHdpdGggYSBKRmFjZUFkYXB0ZXJDb250ZW50UHJvdmlkZXIgdG8gZGlzcGxheQotICogRE9NIG5vZGVzIGluIGEgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpIHsKLQkJdGhpcyhJSkZhY2VOb2RlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MKHRoaXMpOwotCQkJaW5pdEFkYXB0ZXIoc2luZ2xldG9uQWRhcHRlciwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExOGE3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBZGFwdHMgYSBET00gbm9kZSB0byBhIEpGYWNlIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlciB7Ci0KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUhUTUxJbWFnZShTdHJpbmcgaW1hZ2VSZXNvdXJjZU5hbWUpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihpbWFnZVJlc291cmNlTmFtZSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTChKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZUltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgidGFibGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUJMRSk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19BTkNIT1IpOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImJvZHkiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfQk9EWSk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYnV0dG9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0JVVFRPTik7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZm9udCIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19GT05UKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmb3JtIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0ZPUk0pOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImh0bWwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSFRNTCk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaW1nIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0lNQUdFKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJtYXAiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSU1BR0VfTUFQKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ0aXRsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19USVRMRSk7Ci0JCQllbHNlCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBRyk7Ci0JCX0KLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gc3VwZXIuY3JlYXRlSW1hZ2Uobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkMDI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBOb3QgbmVlZGVkLiBTZWUgQlVHMTE4MzU5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeSBpbXBsZW1lbnRzIERldmljZVByb2ZpbGVFbnRyeSB7Ci0KLQlwdWJsaWMgQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeUlkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmMGJjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuICBTZWUgQlVHMTE4MzU5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIGltcGxlbWVudHMKLQkJRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIgewotCi0JcHVibGljIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERldmljZVByb2ZpbGVFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NWFkNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgb25seSBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0aGF0IHlvdSBzaG91bGQKLSAqICAgICAgICAgICAgIGFjdHVhbGx5IGltcGxlbWVudCB5b3Vyc2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gSFRNTFVJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXhMZW5ndGhTdHJpbmdJbkNoYXJhY3RlckNvZGVSZWdpc3RyeSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5KCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJRW51bWVyYXRpb24gZSA9IHJlZy5nZXRFbnRyaWVzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gZW50cnkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWlmIChkaXNwbGF5TmFtZSAhPSBudWxsKSB7Ci0JCQkJY29tYm8uYWRkKGRpc3BsYXlOYW1lLCBwdWJsaWNJZCk7Ci0JCQkJaWYgKGRpc3BsYXlOYW1lLmxlbmd0aCgpID4gbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkubGVuZ3RoKCkpCi0JCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZGlzcGxheU5hbWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29tYm8uYWRkKHB1YmxpY0lkLCBwdWJsaWNJZCk7Ci0JCQlpZiAocHVibGljSWQubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IHB1YmxpY0lkOwotCQkJaWYgKGVudHJ5LmdldFN5c3RlbUlkKCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsgLy8gaWYgSFRNTCBlbnRyeQotCQkJaWYgKGVudHJ5LmdldFN5c3RlbUlkKCkubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQotCQljb21iby5zb3J0QnlLZXkoMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENTU01ldGFNb2RlbFJlZ2lzdHJ5SW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUl0ZXJhdG9yIGkgPSByZWcuZ2V0UHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgaWQgPSBwcm9maWxlLmdldFByb2ZpbGVJRCgpOwotCQkJU3RyaW5nIG5hbWUgPSBwcm9maWxlLmdldFByb2ZpbGVOYW1lKCk7Ci0JCQljb21iby5hZGQobmFtZSwgaWQpOwotCQl9Ci0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGV2aWNlUHJvZmlsZVJlZ2lzdHJ5SW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciByZWcgPSBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIuZ2V0RW50cnlQcm92aWRlcigpOwotCQlpZiAocmVnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYXRvciBwcm9maWxlcyA9IHJlZy5nZXREZXZpY2VQcm9maWxlRW50cmllcygpOwotCQlpZiAocHJvZmlsZXMgPT0gbnVsbCkgewotCQkJcmVnLnJlbGVhc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlEZXZpY2VQcm9maWxlRW50cnkgZW50cnk7Ci0JCXdoaWxlIChwcm9maWxlcy5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKERldmljZVByb2ZpbGVFbnRyeSkgcHJvZmlsZXMubmV4dCgpOwotCQkJY29tYm8uYWRkKGVudHJ5LmdldEVudHJ5TmFtZSgpLCBlbnRyeS5nZXRFbnRyeUlkKCkpOwotCQkJZW50cnkucmVsZWFzZSgpOwotCQl9Ci0JCXJlZy5yZWxlYXNlKCk7Ci0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1JZEZyb20oU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChlbnRyeS5nZXRQdWJsaWNJZCgpLmVxdWFscyhwdWJsaWNJZCkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRlbnRUeXBlSW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJU3RyaW5nW10gdHlwZSA9IHsiIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiYXBwbGljYXRpb24veG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC9odG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC94bWwiLH07IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gZGlzcGxheU5hbWUgPSB7Tk9ORSwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkiYXBwbGljYXRpb24veG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC9odG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC94bWwiLH07IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGlzcGxheU5hbWVbaV0gIT0gbnVsbCAmJiBkaXNwbGF5TmFtZVtpXS5sZW5ndGgoKSAhPSAwKQotCQkJCWNvbWJvLmFkZChkaXNwbGF5TmFtZVtpXSwgdHlwZVtpXSk7Ci0JCQllbHNlCi0JCQkJY29tYm8uYWRkKHR5cGVbaV0sIHR5cGVbaV0pOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hhcmFjdGVyQ29kZUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1heCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIENvbW1vbkNoYXJzZXROYW1lcyBlbmNvZGluZyA9IG5ldyBDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJU3RyaW5nW10gY2hhckNvZGUgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0Q29tbW9uQ2hhcnNldE5hbWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhckNvZGUubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXREaXNwbGF5U3RyaW5nKGNoYXJDb2RlW2ldKTsKLQkJCWlmIChkaXNwbGF5TmFtZSAhPSBudWxsICYmIGRpc3BsYXlOYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWUsIGNoYXJDb2RlW2ldKTsKLQkJCQlpbnQgbl9ieXRlID0gZGlzcGxheU5hbWUuZ2V0Qnl0ZXMoKS5sZW5ndGg7Ci0JCQkJaWYgKG1heC5nZXRCeXRlcygpLmxlbmd0aCA8IG5fYnl0ZSkKLQkJCQkJbWF4ID0gZGlzcGxheU5hbWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29tYm8uYWRkKGNoYXJDb2RlW2ldLCBjaGFyQ29kZVtpXSk7Ci0JCX0KLQkJLyoKLQkJICogY2hhckNvZGUgPSBlbmNvZGluZy5nZXRTdXBwb3J0ZWRKYXZhRW5jb2RpbmdzKCk7IGZvcihpbnQgaT0wO2k8Y2hhckNvZGUubGVuZ3RoO2krKyl7Ci0JCSAqIFN0cmluZyBkaXNwbGF5TmFtZSA9IGVuY29kaW5nLmdldERpc3BsYXlTdHJpbmcoY2hhckNvZGVbaV0pOyBpZgotCQkgKiAoZGlzcGxheU5hbWUhPW51bGwgJiYgZGlzcGxheU5hbWUubGVuZ3RoKCkhPTApCi0JCSAqIGNvbWJvLmFkZChkaXNwbGF5TmFtZSxjaGFyQ29kZVtpXSk7IGVsc2UKLQkJICogY29tYm8uYWRkKGNoYXJDb2RlW2ldLGNoYXJDb2RlW2ldKTsgfQotCQkgKi8KLQkJLy8gY29tYm8uc29ydEJ5S2V5KDEpOwotCQltYXhMZW5ndGhTdHJpbmdJbkNoYXJhY3RlckNvZGVSZWdpc3RyeSA9IG1heDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFuZ3VhZ2VJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQlTdHJpbmdbXSBsYW5nID0geyIiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXNjcmlwdCIsfTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkaXNwbGF5TmFtZSA9IHtOT05FLCAiamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXNjcmlwdCIsfTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhbmcubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkaXNwbGF5TmFtZVtpXSAhPSBudWxsICYmIGRpc3BsYXlOYW1lW2ldLmxlbmd0aCgpICE9IDApCi0JCQkJY29tYm8uYWRkKGRpc3BsYXlOYW1lW2ldLCBsYW5nW2ldKTsKLQkJCWVsc2UKLQkJCQljb21iby5hZGQobGFuZ1tpXSwgbGFuZ1tpXSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU3OTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIGRpcmVjdGx5LgotICogSW5zdGVhZCwgcGxlYXNlIHVzZSBhYnN0cmFjdCBjbGFzcyhBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeSkgaW5zdGVhZC4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERldmljZVByb2ZpbGVFbnRyeSB7Ci0JcHVibGljIFN0cmluZyBnZXRFbnRyeUlkKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5TmFtZSgpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzI2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyBkaXJlY3RseS4KLSAqIEluc3RlYWQsIHBsZWFzZSB1c2UgYWJzdHJhY3QgY2xhc3MoQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlcikKLSAqIGluc3RlYWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuIFNlZSBCVUcxMTgzNTkKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciB7Ci0JcHVibGljIEl0ZXJhdG9yIGdldERldmljZVByb2ZpbGVFbnRyaWVzKCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTVhZDA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gIFNlZSBCVUcxMTgzNTkKLSAqLwotcHVibGljIGNsYXNzIERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9QTFVHSU5JRCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSI7ICAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gImRldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0Jc3RhdGljIHB1YmxpYyBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciBnZXRFbnRyeVByb3ZpZGVyKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KEVYVEVOU0lPTl9QT0lOVF9QTFVHSU5JRCwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb25zW10gPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlpZiAoKGV4dGVuc2lvbnMgIT0gbnVsbCkgJiYgKGV4dGVuc2lvbnMubGVuZ3RoID4gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnRzW10gPSBleHRlbnNpb25zW2ldLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlpZiAoKGVsZW1lbnRzICE9IG51bGwpICYmIChlbGVtZW50cy5sZW5ndGggPiAwKSkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgPSBlbGVtZW50c1tqXTsKLQkJCQkJCQlpZiAoKGNvbmZpZyAhPSBudWxsKSAmJiAoY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoRVhURU5TSU9OX1BPSU5UX05BTUUpID09IHRydWUpKSB7Ci0JCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKEFUVFJfQ0xBU1MpOwotCQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIgcHJvdmlkZXIgPSAoRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIpY29uZmlnLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUl9DTEFTUyk7Ci0JCQkJCQkJCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gaWdub3JlZCkgewotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0hUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0hUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxZmIwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9IVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5JQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQotCXByaXZhdGUgZmluYWwgaW50IE5fRE9DVU1FTlRfVFlQRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9DU1NfUFJPRklMRSA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9UQVJHRVRfREVWSUNFID0gMjsKLQotCXByaXZhdGUgVGV4dCBwdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQotCXB1YmxpYyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQludW1iZXJPZkNvbWJvID0gMzsKLQkJbnVtQ29scyA9IDI7Ci0JCW51bVJvd3MgPSA4OwotCQljb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtzdXBlci5udW1iZXJPZkNvbWJvXTsKLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFR5cGVDb21ib0JveCgpIHsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb24gb2YgaW1wbGVjaXQgRE9DVFlQRQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIGNvbWJvYm94Ci0JCXN1cGVyLmNvbWJvW05fRE9DVU1FTlRfVFlQRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERPQ1VNRU5UX0xBQkVMKTsKLQkJc3VwZXIuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkvLyBzZXQgZW50cnkgbGlzdCBpbnRvIENvbWJvCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oY29tYm9bTl9ET0NVTUVOVF9UWVBFXSk7Ci0JCS8vCWNyZWF0ZSBUZXh0RmllbGQKLQkJY3JlYXRlSURUZXh0RmllbGQoKTsKLQkJaWYgKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0sIGluaXRWYWx1ZSk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoaW5pdFZhbHVlKTsKLQkJaWYgKCFpbml0VmFsdWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRvcm8gRDIxMDI2MAotCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShpbml0VmFsdWUpICE9IG51bGwpCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCWxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sczsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oY29tYm9bTl9DU1NfUFJPRklMRV0pOwotCQlpZiAoY29tYm9bTl9DU1NfUFJPRklMRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fQ1NTX1BST0ZJTEVdLCBpbml0VmFsdWUpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXZpY2VDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9UQVJHRVRfREVWSUNFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoREVWSUNFX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKGNvbWJvW05fVEFSR0VUX0RFVklDRV0pOwotCQlpZiAoY29tYm9bTl9UQVJHRVRfREVWSUNFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9UQVJHRVRfREVWSUNFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpIHsKLQkJaW50IHR5cGUgPSAoKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpKS5nZXRUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJLy8JY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCk7Ci0JCQkJY3JlYXRlQ1NTQ29tYm9Cb3goKTsKLQkJCQljcmVhdGVEZXZpY2VDb21ib0JveCgpOwotCQkJCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgRklMRSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWVJbkNvbWJvLCBpbnQgaW5kZXgpIHsKLQotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVOb25lUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgTl9ET0NVTUVOVF9UWVBFIDoKLQkJCQkvLyBkb2MgdHlwZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fVEFSR0VUX0RFVklDRSA6Ci0JCQkJLy8gZGV2aWNlCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBkZWxldGVOb25lUHJvcGVydHkoKSBpbiBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlEVGV4dEZpZWxkKCkgewotCQkvLyBwdWJsaWMgSUQgJiBTeXN0ZW0gSUQKLQkJTGFiZWwgcHVibGljTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXB1YmxpY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0xhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJcHVibGljSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBzeXN0ZW1MYWJlbCA9IG5ldyBMYWJlbChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJc3lzdGVtTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlzeXN0ZW1JZFRleHQgPSBuZXcgVGV4dChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgd2hlbiBIVE1MRG9jdW1lbnRUeXBlRW50cnkgd2FzIHNldCBpbiBjbGFzcyBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS4KLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5Lm1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gdGhpcy5zeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSB0aGlzLnN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoYmFja3VwKTsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5wdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuc3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9UQVJHRVRfREVWSUNFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJV2lkZ2V0IHNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZXF1YWxzKHNvdXJjZSkpIHsKLQkJCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV07Ci0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSk7Ci0JCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpICE9IG51bGwpCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSkpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4OGUwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5JQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIFByb2plY3RIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGluc3RlYWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9ET0NVTUVOVF9UWVBFID0gMDsKLQlwcml2YXRlIGZpbmFsIGludCBOX0NTU19QUk9GSUxFID0gMTsKLQlwcml2YXRlIGZpbmFsIGludCBOX1RBUkdFVF9ERVZJQ0UgPSAyOwotCi0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgc3lzdGVtSWRUZXh0OwotCi0JcHVibGljIFByb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW51bWJlck9mQ29tYm8gPSAzOwotCQludW1Db2xzID0gMjsKLQkJbnVtUm93cyA9IDg7Ci0JCWNvbWJvID0gbmV3IENvbWJvTGlzdE9uUHJvcGVydHlQYWdlW3N1cGVyLm51bWJlck9mQ29tYm9dOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCkgewotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbiBvZiBpbXBsZWNpdCBET0NUWVBFCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0Rlc2NyaXB0aW9uX29mX3JvbGVfb2ZfZm9sbG93aW5nX0RPQ1RZUEUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2xzOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSBjb21ib2JveAotCQlzdXBlci5jb21ib1tOX0RPQ1VNRU5UX1RZUEVdID0gc3VwZXIuY3JlYXRlQ29tYm9Cb3hPZihET0NVTUVOVF9MQUJFTCk7Ci0JCXN1cGVyLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJLy8gc2V0IGVudHJ5IGxpc3QgaW50byBDb21ibwotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlJbnRvKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0pOwotCQkvLyBjcmVhdGUgVGV4dEZpZWxkCi0JCWNyZWF0ZUlEVGV4dEZpZWxkKCk7Ci0JCWlmIChjb21ib1tOX0RPQ1VNRU5UX1RZUEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0RPQ1VNRU5UX1RZUEVdLCBpbml0VmFsdWUpOwotCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGluaXRWYWx1ZSk7Ci0JCWlmICghaW5pdFZhbHVlLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQkvLyB0b3JvIEQyMTAyNjAKLQkJCWlmIChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSAhPSBudWxsKQotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGluaXRWYWx1ZSkpOwotCQkJZWxzZQotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlCi0JCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gY3JlYXRlIHNlcGFyYXRvcgotCQlsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0eVBhZ2UsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gODsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDU1NDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9DU1NfUFJPRklMRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKENTU19MQUJFTCk7Ci0KLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKGNvbWJvW05fQ1NTX1BST0ZJTEVdKTsKLQkJaWYgKGNvbWJvW05fQ1NTX1BST0ZJTEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0NTU19QUk9GSUxFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV2aWNlQ29tYm9Cb3goKSB7Ci0JCXN1cGVyLmNvbWJvW05fVEFSR0VUX0RFVklDRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERFVklDRV9MQUJFTCk7Ci0KLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0RGV2aWNlUHJvZmlsZVJlZ2lzdHJ5SW50byhjb21ib1tOX1RBUkdFVF9ERVZJQ0VdKTsKLQkJaWYgKGNvbWJvW05fVEFSR0VUX0RFVklDRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fVEFSR0VUX0RFVklDRV0sIGluaXRWYWx1ZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKSB7Ci0JCWludCB0eXBlID0gKChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKSkuZ2V0VHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCS8vIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwcm9wZXJ0eVBhZ2UsbnVtQ29scyxudW1Sb3dzKTsKLQkJCQljcmVhdGVEb2N1bWVudFR5cGVDb21ib0JveCgpOwotCQkJCWNyZWF0ZUNTU0NvbWJvQm94KCk7Ci0JCQkJY3JlYXRlRGV2aWNlQ29tYm9Cb3goKTsKLQkJCQljb21wdXRlTWF4V2lkdGhIaW50KCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5XRUJfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpcyBpbnN0YW50aWF0ZWQgYnkgcmVzb3VyY2UgZXhjZXB0IFBST0pFQ1QiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlSW5Db21ibywgaW50IGluZGV4KSB7Ci0KLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0RPQ1VNRU5UX1RZUEUgOgotCQkJCS8vIGRvYyB0eXBlCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fQ1NTX1BST0ZJTEUgOgotCQkJCS8vIGNzcwotCQkJCXByb3BlcnRpZXMucHV0KElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fVEFSR0VUX0RFVklDRSA6Ci0JCQkJLy8gZGV2aWNlCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW5kZXggaXMgb3V0IG9mIHJhbmdlIGluIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKCkgaW4gY2xhc3MgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTm9uZVByb3BlcnR5KGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gZGVsZXRlTm9uZVByb3BlcnR5KCkgaW4gY2xhc3MgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJRFRleHRGaWVsZCgpIHsKLQkJLy8gcHVibGljIElEICYgU3lzdGVtIElECi0JCUxhYmVsIHB1YmxpY0xhYmVsID0gbmV3IExhYmVsKHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlwdWJsaWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX1B1YmxpY19JRCk7Ci0JCXB1YmxpY0lkVGV4dCA9IG5ldyBUZXh0KHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJTGFiZWwgc3lzdGVtTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXN5c3RlbUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfU3lzdGVtX0lEKTsKLQkJc3lzdGVtSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVNYXhXaWR0aEhpbnQoKSB7Ci0JCS8vIG1heExlbmd0aFN0cmluZyB3YXMgc2V0IHdoZW4gSFRNTERvY3VtZW50VHlwZUVudHJ5IHdhcyBzZXQgaW4gY2xhc3MKLQkJLy8gQ29udGVudFNldHRpbmdzUmVnaXN0cnkuCi0JCVN0cmluZyBtYXhMZW5ndGhTdHJpbmcgPSBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5tYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLQkJU3RyaW5nIGJhY2t1cCA9IHRoaXMuc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChtYXhMZW5ndGhTdHJpbmcpOwotCQlpbnQgbWF4V2lkdGhIaW50ID0gdGhpcy5zeXN0ZW1JZFRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KGJhY2t1cCk7Ci0KLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnB1YmxpY0lkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5zeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0NTU19QUk9GSUxFXS5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuY29tYm9bdGhpcy5OX0NTU19QUk9GSUxFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX1RBUkdFVF9ERVZJQ0VdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCVdpZGdldCBzb3VyY2UgPSBldmVudC53aWRnZXQ7Ci0KLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmVxdWFscyhzb3VyY2UpKSB7Ci0JCQlDb21ib0xpc3RPblByb3BlcnR5UGFnZSBjb21ibyA9IHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdOwotCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPCAwKQotCQkJCXJldHVybjsKLQkJCWlmICghY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dChjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpOwotCQkJCWlmIChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpKSAhPSBudWxsKQotCQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpKTsKLQkJCQllbHNlCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjYmU0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIHsKLQlwdWJsaWMgUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ5OTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTk9ORSA9IEhUTUxVSU1lc3NhZ2VzLlVJX25vbmU7Ci0JcHJpdmF0ZSBTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib1NlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IGluZGV4ID0gZkRvY3VtZW50VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgZG9jdHlwZSA9IChTdHJpbmcpIGZEb2N1bWVudFR5cGVJZHMuZ2V0KGluZGV4KTsKLQkJCXVwZGF0ZURvY3R5cGVUZXh0KGluZGV4LCBkb2N0eXBlKTsKLQkJfQotCX0KLQotCUNvbWJvIGZEb2N1bWVudFR5cGVDb21ibzsKLQlMaXN0IGZEb2N1bWVudFR5cGVJZHM7Ci0JcHJpdmF0ZSBUZXh0IGZQdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IGZTeXN0ZW1JZFRleHQ7Ci0JcHJpdmF0ZSBDb21ibyBmUHJvZmlsZUNvbWJvOwotCXByaXZhdGUgTGlzdCBmUHJvZmlsZUlkczsKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGZMaXN0ZW5lcjsKLQotCXB1YmxpYyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERlc2NyaXB0aW9uKEhUTUxVSU1lc3NhZ2VzLldlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0JCWNyZWF0ZURvY3R5cGVDb250ZW50cyhwcm9wZXJ0eVBhZ2UpOwotCQljcmVhdGVDU1NQcm9maWxlQ29udGVudHMocHJvcGVydHlQYWdlKTsKLQotCQlwb3B1bGF0ZVZhbHVlcygpOwotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0JCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQotCQlmTGlzdGVuZXIgPSBuZXcgQ29tYm9TZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlmRG9jdW1lbnRUeXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZkxpc3RlbmVyKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCXJldHVybiBwcm9wZXJ0eVBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNTU1Byb2ZpbGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENTUyBQcm9maWxlCi0JCVRleHQgbGFuZ3VhZ2VMYWJlbCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWxhbmd1YWdlTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9DU1NfcHJvZmlsZV9fXzIpOwotCQlmUHJvZmlsZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmUHJvZmlsZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURvY3R5cGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbiBvZiBpbXBsaWNpdCBET0NUWVBFCi0JCVRleHQgZG9jdHlwZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJZG9jdHlwZUxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZG9jdHlwZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gZG9jdW1lbnQgdHlwZQotCQlUZXh0IGxhbmd1YWdlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlsYW5ndWFnZUxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVmYXVsdF9IVE1MX0RPQ1RZUEVfSURfX18xKTsKLQkJZkRvY3VtZW50VHlwZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmRG9jdW1lbnRUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBwdWJsaWMgSUQKLQkJVGV4dCBwdWJsaWNJZExhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJcHVibGljSWRMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX1B1YmxpY19JRCk7Ci0JCWZQdWJsaWNJZFRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZQdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBzeXN0ZW0gSUQKLQkJVGV4dCBzeXN0ZW1JZExhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJc3lzdGVtSWRMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX1N5c3RlbV9JRCk7Ci0JCWZTeXN0ZW1JZFRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZTeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3lzdGVtSWRGcm9tKFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAocHVibGljSWQgPT0gbnVsbCB8fCBwdWJsaWNJZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJRW51bWVyYXRpb24gZSA9IHJlZy5nZXRFbnRyaWVzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoZW50cnkuZ2V0UHVibGljSWQoKS5lcXVhbHMocHVibGljSWQpKQotCQkJCXJldHVybiBlbnRyeS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplRG9jdHlwZVZhbHVlcygpOwotCQlpbml0aWFsaXplQ1NTUHJvZmlsZVZhbHVlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ1NTUHJvZmlsZVZhbHVlcygpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJU3RyaW5nIHByb2ZpbGUgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZ2V0UmVzb3VyY2UoKSwgZmFsc2UpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsICYmIHByb2ZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvKgotCQkJICogSWYgaXRlbSBpcyBhbHJlYWR5IHBhcnQgb2YgY29tYm8sIHNlbGVjdCBpdC4gT3RoZXJ3aXNlLCBzZWxlY3QKLQkJCSAqIG5vbmUuCi0JCQkgKi8KLQkJCWluZGV4ID0gZlByb2ZpbGVJZHMuaW5kZXhPZihwcm9maWxlKTsKLQkJfQotCQlpbmRleCA9IGluZGV4ID49IDAgPyBpbmRleCA6IDA7Ci0JCWZQcm9maWxlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURvY3R5cGVWYWx1ZXMoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCVN0cmluZyBkb2N0eXBlID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChkb2N0eXBlICE9IG51bGwgJiYgZG9jdHlwZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8qCi0JCQkgKiBJZiBpdGVtIGlzIGFscmVhZHkgcGFydCBvZiBjb21ibywgc2VsZWN0IGl0LiBPdGhlcndpc2UsIHNlbGVjdAotCQkJICogbm9uZS4KLQkJCSAqLwotCQkJaW5kZXggPSBmRG9jdW1lbnRUeXBlSWRzLmluZGV4T2YoZG9jdHlwZSk7Ci0JCX0KLQotCQkvLyBzZXQgY29tYm9ib3gKLQkJaW5kZXggPSBpbmRleCA+PSAwID8gaW5kZXggOiAwOwotCQlmRG9jdW1lbnRUeXBlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQl1cGRhdGVEb2N0eXBlVGV4dChpbmRleCwgZG9jdHlwZSk7Ci0JfQotCi0Jdm9pZCB1cGRhdGVEb2N0eXBlVGV4dChpbnQgaW5kZXgsIFN0cmluZyBkb2N0eXBlKSB7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCS8vIHNldCBwdWJsaWMvc3lzdGVtIGlkIHRleHQKLQkJCWZQdWJsaWNJZFRleHQuc2V0VGV4dChkb2N0eXBlKTsKLQkJCVN0cmluZyBzeXN0ZW1JZCA9IGdldFN5c3RlbUlkRnJvbShkb2N0eXBlKTsKLQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJCWZTeXN0ZW1JZFRleHQuc2V0VGV4dChzeXN0ZW1JZCk7Ci0JCQllbHNlCi0JCQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0IHB1YmxpYy9zeXN0ZW0gaWQgdGV4dAotCQkJZlB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmFsdWVzKCkgewotCQlwb3B1bGF0ZURvY3R5cGVWYWx1ZXMoKTsKLQkJcG9wdWxhdGVDU1NQcm9maWxlVmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ1NTUHJvZmlsZVZhbHVlcygpIHsKLQkJZlByb2ZpbGVJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGFkZCBub25lIGZpcnN0Ci0JCWZQcm9maWxlQ29tYm8uYWRkKFNFTEVDVF9OT05FKTsKLQkJZlByb2ZpbGVJZHMuYWRkKG51bGwpOwotCi0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaSA9IHJlZy5nZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHByb2ZpbGUuZ2V0UHJvZmlsZUlEKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2ZpbGUuZ2V0UHJvZmlsZU5hbWUoKTsKLQkJCWZQcm9maWxlQ29tYm8uYWRkKG5hbWUpOwotCQkJZlByb2ZpbGVJZHMuYWRkKGlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURvY3R5cGVWYWx1ZXMoKSB7Ci0JCWZEb2N1bWVudFR5cGVJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGFkZCBub25lIGZpcnN0Ci0JCWZEb2N1bWVudFR5cGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmRG9jdW1lbnRUeXBlSWRzLmFkZChudWxsKTsKLQotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUVudW1lcmF0aW9uIGUgPSByZWcuZ2V0RW50cmllcygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJU3RyaW5nIHB1YmxpY0lkID0gZW50cnkuZ2V0UHVibGljSWQoKTsKLQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IGVudHJ5LmdldERpc3BsYXlOYW1lKCk7Ci0JCQlkaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lICE9IG51bGwgPyBkaXNwbGF5TmFtZSA6IHB1YmxpY0lkOwotCi0JCQlmRG9jdW1lbnRUeXBlQ29tYm8uYWRkKGRpc3BsYXlOYW1lKTsKLQkJCWZEb2N1bWVudFR5cGVJZHMuYWRkKHB1YmxpY0lkKTsKLQotCQkJaWYgKGRpc3BsYXlOYW1lLmxlbmd0aCgpID4gbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkubGVuZ3RoKCkpIHsKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IGRpc3BsYXlOYW1lOwotCQkJfQotCi0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOyAvLyBpZiBIVE1MIGVudHJ5Ci0KLQotCQkJaWYgKGVudHJ5LmdldFN5c3RlbUlkKCkubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgcG9wdWxhdGVEb2N0eXBlVmFsdWVzIHdhcyBjYWxsZWQKLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gZlN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCWZTeXN0ZW1JZFRleHQuc2V0VGV4dChtYXhMZW5ndGhTdHJpbmcpOwotCQlpbnQgbWF4V2lkdGhIaW50ID0gZlN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCWZTeXN0ZW1JZFRleHQuc2V0VGV4dChiYWNrdXApOwotCi0JCWlmIChmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSBmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmIChmUHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgZlB1YmxpY0lkVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKGZTeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSBmU3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAoZlByb2ZpbGVDb21iby5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIGZQcm9maWxlQ29tYm8uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1DU1NQcm9maWxlRGVmYXVsdHMoKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uaW5kZXhPZihTRUxFQ1RfTk9ORSk7Ci0JCWlmIChpbmRleCA+IC0xKQotCQkJZlByb2ZpbGVDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwZXJmb3JtQ1NTUHJvZmlsZU9rKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBmUHJvZmlsZUlkcy5nZXQoaW5kZXgpOwotCQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCB8fCBpZC5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVF9OT05FKSkgewotCQkJCS8vIGlmIG5vbmUsIHVzZSBudWxsCi0JCQkJaWQgPSBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlDU1NDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZ2V0UmVzb3VyY2UoKSwgaWQpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIG1heWJlIGluIGZ1dHVyZSwgbGV0IHVzZXIga25vdyB0aGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZwotCQkJCS8vIGZpbGUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQlwZXJmb3JtRG9jdHlwZURlZmF1bHRzKCk7Ci0JCXBlcmZvcm1DU1NQcm9maWxlRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURvY3R5cGVEZWZhdWx0cygpIHsKLQkJZlB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCWZTeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybURvY3R5cGVPaygpIHsKLQkJaW50IGluZGV4ID0gZkRvY3VtZW50VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBmRG9jdW1lbnRUeXBlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUhUTUxDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShIVE1MQ29udGVudFByb3BlcnRpZXMuRE9DVU1FTlRfVFlQRSwgZ2V0UmVzb3VyY2UoKSwgaWQpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIG1heWJlIGluIGZ1dHVyZSwgbGV0IHVzZXIga25vdyB0aGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZwotCQkJCS8vIGZpbGUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlwZXJmb3JtRG9jdHlwZU9rKCk7Ci0JCXBlcmZvcm1DU1NQcm9maWxlT2soKTsKLQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjNDU4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29ycmVjdGlvblByb2Nlc3NvclhNTDsKLQotLyoqCi0gKiBDb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgSFRNTAotICovCi1wdWJsaWMgY2xhc3MgQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTCBleHRlbmRzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29ycmVjdGlvbkFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEFzc2lzdGFudCBjYSA9IG51bGw7Ci0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0KLQkJCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNvcnJlY3Rpb25Qcm9jZXNzb3IgPSBuZXcgQ29ycmVjdGlvblByb2Nlc3NvclhNTChzb3VyY2VWaWV3ZXIpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTik7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX1BJKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5EVERfU1VCU0VUKTsKLQkJCX0KLQkJCWNhID0gYXNzaXN0YW50OwotCQl9Ci0KLQkJcmV0dXJuIGNhOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzOGZiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuamF2YWRvYy5TaW5nbGVDaGFyUmVhZGVyLgotICogTW9kaWZpY2F0aW9uIHdhcyBtYWRlIHRvIGZpeCBzdGF0ZW1lbnQgdW5uZWNlc3NhcmlseSBuZXN0ZWQgd2l0aGluIGVsc2UKLSAqIGNsYXVzZSB3YXJuaW5nIGluIHJlYWQoLi4pLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50IGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCXdoaWxlICgoY2ggPSByZWFkKCkpICE9IC0xKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQWN0aW9uQ29udHJpYnV0b3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0FjdGlvbkNvbnRyaWJ1dG9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU4NzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQWN0aW9uQ29udHJpYnV0b3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JYTUw7Ci0KLS8qKgotICoKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yCi0gKiBvZiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9ySFRNTCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBFRElUT1JfSURTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDU1M2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXAuSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSAqIENsZWFudXAgYWN0aW9uIGRlbGVnYXRlIGZvciBIVE1MIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChIVE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCUNsZWFudXBEaWFsb2dIVE1MIGNsZWFudXBEaWFsb2cgPSBuZXcgQ2xlYW51cERpYWxvZ0hUTUwoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWNsZWFudXBEaWFsb2cuc2V0aXNYSFRNTFR5cGUoaXNYSFRNTCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJLy8gbW9kZWwgY2hhbmdlCi0JCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCQkJLy8gcnVuCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCkgewotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCgpOwotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTCgpIHsKLQkJYm9vbGVhbiBpc3hodG1sID0gZmFsc2U7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGRvbURvY3VtZW50ICE9IG51bGwpCi0JCQkJCQlpc3hodG1sID0gZG9tRG9jdW1lbnQuaXNYTUxUeXBlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc3hodG1sOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0hUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyNTI2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERpYWxvZ0hUTUwgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93czsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4OwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYzsKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZklzWEhUTUwgPSBmYWxzZTsKLQlwcml2YXRlIEdyb3VwIGZUYWdOYW1lQ2FzZTsKLQlwcml2YXRlIEdyb3VwIGZBdHRyTmFtZUNhc2U7Ci0KLQlwdWJsaWMgQ2xlYW51cERpYWxvZ0hUTUwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIoc2hlbGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlnZXRTaGVsbCgpLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ2xlYW51cF9VSV8pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQljcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoY29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZU9wdGlvbnMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotCQlva0J1dHRvbkVuYWJsZW1lbnQoKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlRm9ySFRNTChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIENvbnZlcnQgdGFnIG5hbWUgY2FzZQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJZlRhZ05hbWVDYXNlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmVGFnTmFtZUNhc2Uuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXyk7Ci0JCUdyaWRMYXlvdXQgaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWZUYWdOYW1lQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcyA9IG5ldyBCdXR0b24oZlRhZ05hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX0FzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlciA9IG5ldyBCdXR0b24oZlRhZ05hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVfY2FzZV9Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihmVGFnTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX1VwcGVyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ29udmVydCBhdHRyIG5hbWUgY2FzZQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJZkF0dHJOYW1lQ2FzZSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZkF0dHJOYW1lQ2FzZS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfKTsKLQkJZkF0dHJOYW1lQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMgPSBuZXcgQnV0dG9uKGZBdHRyTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZV9jYXNlX0FzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihmQXR0ck5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihmQXR0ck5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfVXBwZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlRm9ySFRNTChjb21wb3NpdGUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkNMRUFOVVBfSFRNTF9IRUxQSUQpOyAvLyB1c2UKLQkJLy8gSFRNTAotCQkvLyBzcGVjaWZpYwotCQkvLyBoZWxwCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gSW5zZXJ0IG1pc3NpbmcgcmVxdWlyZWQgYXR0cnMKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBJbnNlcnQgbWlzc2luZyBiZWdpbi9lbmQgdGFncwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkluc2VydF9taXNzaW5nX3RhZ3NfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV8pOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gRm9ybWF0IHNvdXJjZQotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ29udmVydCBFT0wgY29kZQotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ29udmVydF9FT0xfY29kZXNfVUlfKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlDb21wb3NpdGUgRU9MQ29kZXMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlFT0xDb2Rlcy5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5FT0xfV2luZG93c19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRU9MX1VuaXhfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYyA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5FT0xfTWFjX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXN0b3JlT3B0aW9ucygpOwotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zRm9ySFRNTCgpIHsKLQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gaXNYSFRNTFR5cGUoKTsKLQotCQlpZiAoY2FzZVNlbnNpdGl2ZSkgewotCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgdGFnTmFtZUNhc2UgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSk7Ci0JCQlpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgYXR0ck5hbWVDYXNlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKTsKLQkJCWlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKGF0dHJOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQllbmFibGVDYXNlQ29udHJvbHMoIWNhc2VTZW5zaXRpdmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zKCkgewotCQlpbml0aWFsaXplT3B0aW9uc0ZvckhUTUwoKTsKLQotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQlpZiAoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlTdHJpbmcgRU9MQ29kZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSk7Ci0JCQlpZiAoRU9MQ29kZSA9PSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChFT0xDb2RlID09IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVFT0xDb2RlUmFkaW9zKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVPcHRpb25zRm9ySFRNTCgpIHsKLQkJaWYgKCFpc1hIVE1MVHlwZSgpICYmIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UgaWYgKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWVsc2UKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCi0JCWlmICghaXNYSFRNTFR5cGUoKSAmJiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UgaWYgKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZWxzZQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCi0JCS8vIGV4cGxpY2l0bHkgc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgc28gdmFsdWVzIGFyZSBzdG9yZWQKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlT3B0aW9ucygpIHsKLQkJc3RvcmVPcHRpb25zRm9ySFRNTCgpOwotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIGZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCBmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSkgewotCQkJaWYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKTsKLQkJCX0gZWxzZSBpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUik7Ci0JCQl9IGVsc2UgewotCQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQkJCX0KLQkJfQotCi0JCS8vIGV4cGxpY2l0bHkgc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgc28gdmFsdWVzIGFyZSBzdG9yZWQKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXdpZGdldFNlbGVjdGVkKGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IGZDaGVja0JveENvbnZlcnRFT0xDb2RlcykKLQkJCWVuYWJsZUVPTENvZGVSYWRpb3MoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlva0J1dHRvbkVuYWJsZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MVHlwZSgpIHsKLQkJcmV0dXJuIGZJc1hIVE1MOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUVPTENvZGVSYWRpb3MoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYgKChmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgIT0gbnVsbCkpIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0RW5hYmxlZChlbmFibGUpOwotCi0JCQlpZiAoIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmdldFNlbGVjdGlvbigpICYmICFmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSAmJiAhZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSkKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSB0YWcvYXR0ciBjYXNlIHJhZGlvIGJ1dHRvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ2FzZUNvbnRyb2xzKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWZUYWdOYW1lQ2FzZS5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQotCQlmQXR0ck5hbWVDYXNlLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMvZGlzYWJsZXMgT0sgYnV0dG9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9rQnV0dG9uRW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiB0YWdOYW1lQ2FzZUNoZWNrID0gKChmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkgfHwgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gYXR0ck5hbWVDYXNlQ2hlY2sgPSAoKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpIHx8IGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKTsKLQkJYm9vbGVhbiBlb2xDaGVjayA9IGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gYnV0dG9uRW5hYmxlZCA9IHRhZ05hbWVDYXNlQ2hlY2sgfHwgYXR0ck5hbWVDYXNlQ2hlY2sgfHwgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmdldFNlbGVjdGlvbigpIHx8IGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSB8fCBlb2xDaGVjazsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoYnV0dG9uRW5hYmxlZCk7Ci0JfQotCi0Jdm9pZCBzZXRpc1hIVE1MVHlwZShib29sZWFuIGlzWEhUTUwpIHsKLQkJZklzWEhUTUwgPSBpc1hIVE1MOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDg2M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0hUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IEhUTUxVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkKLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZSByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0hUTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMWU3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIEhUTUwgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsgCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFCTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19BTkNIT1IgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYW5jaG9yLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0JPRFkgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19CVVRUT04gPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0ZPTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctZm9udC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19GT1JNID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWZvcm0uZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0hUTUwgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaHRtbC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19JTUFHRV9NQVAgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0lNQUdFID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWltYWdlLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0pTUCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVEVNUExBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVElUTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUcgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdIVE1MRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXouZ2lmIjsJCQkvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmU1MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIEhUTUwgU291cmNlIEVkaXRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gSFRNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gSFRNTCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1NPVVJDRVZJRVdfSEVMUElEID0KLQkvLyBDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwgKyJfc291cmNlX0hlbHBJZCI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCQotCS8vIEhUTUwgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMzAiOyAvLyROT04tTkxTLTEkCi0JLy8gSFRNTCBTb3VyY2UgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9QUkVGV0VCWF9TT1VSQ0VfSEVMUElEID0gUFJFRklYICsgIndlYngwMDMxIjsgLy8kTk9OLU5MUy0xJAotCS8vIEhUTUwgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBIVE1MIFRlbXBsYXRlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMzMiOyAvLyROT04tTkxTLTEkCi0JCQotCS8vIEhUTUwgQ2xlYW51cCBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0hUTUxfSEVMUElEID0gUFJFRklYICsgInhtbG0xMTAwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEhUTUwgQ29udGVudCBTZXR0aW5ncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCA9IFBSRUZJWCArICJtaXNjMDE3MCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBIVE1MIE5ldyBGaWxlIFdpemFyZCAtIFRlbXBsYXRlIFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAiaHRtbHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYzI0NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSAqIEVkaXRvcklucHV0IGZvciBleHRlcm5hbCBmaWxlcy4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmVkaXRvcnMudGV4dC5KYXZhRmlsZUVkaXRvcklucHV0Ci0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVBhdGhFZGl0b3JJbnB1dCwgSUxvY2F0aW9uUHJvdmlkZXIgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkKLQkvKioKLQkgKiBUaGUgd29ya2JlbmNoIGFkYXB0ZXIgd2hpY2ggc2ltcGx5IHByb3ZpZGVzIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAc2VlICBFY2xpcHNlIDMuMQotCSAqLwotCXByaXZhdGUgY2xhc3MgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAoKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvKS5nZXROYW1lKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGZGaWxlOwotCXByaXZhdGUgV29ya2JlbmNoQWRhcHRlciBmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQkJZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmRmlsZS5leGlzdHMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJTG9jYXRpb25Qcm92aWRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCXJldHVybiBmV29ya2JlbmNoQWRhcHRlcjsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0I2dldFBhdGgoKQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQkJCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgSVBhdGhFZGl0b3JJbnB1dCBpbnB1dD0gKElQYXRoRWRpdG9ySW5wdXQpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKCkuZXF1YWxzKGlucHV0LmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRmlsZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiMTRlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgZXh0ZXJuYWwgZmlsZXMuCi0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkKLQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbjsKLQlwcml2YXRlIEZpbGUgZkh5cGVybGlua0ZpbGU7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBGaWxlIGZpbGUpIHsKLQkJZkh5cGVybGlua0ZpbGUgPSBmaWxlOwotCQlmSHlwZXJsaW5rUmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmSHlwZXJsaW5rRmlsZSAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoZkh5cGVybGlua0ZpbGUpOwotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQkJCXRyeSB7Ci0JCQkJZGVzY3JpcHRvciA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGlucHV0LmdldE5hbWUoKSwgdHJ1ZSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGlucHV0LCBkZXNjcmlwdG9yLmdldElkKCksIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTNhYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgZmlsZXMgd2l0aGluIHRoZSB3b3Jrc3BhY2UuIChBcyBsb25nIGFzIHRoZXJlIGlzIGFuIElGaWxlLAotICogdGhpcyBjYW4gYmUgdXNlZCkgT3BlbnMgdGhlIGRlZmF1bHQgZWRpdG9yIGZvciB0aGUgZmlsZS4KLSAqLwotY2xhc3MgV29ya3NwYWNlRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSUZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZIaWdobGlnaHRSYW5nZTsKLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSwgSVJlZ2lvbiByYW5nZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZIaWdobGlnaHRSYW5nZSA9IHJhbmdlOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkZpbGUgIT0gbnVsbCAmJiBmRmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgZkZpbGUsIHRydWUpOwotCQkJCS8vIGhpZ2hsaWdodCByYW5nZSBpbiBlZGl0b3IgaWYgcG9zc2libGUKLQkJCQlpZiAoZkhpZ2hsaWdodFJhbmdlICE9IG51bGwgJiYgZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJKChJVGV4dEVkaXRvcikgZWRpdG9yKS5zZXRIaWdobGlnaHRSYW5nZShmSGlnaGxpZ2h0UmFuZ2UuZ2V0T2Zmc2V0KCksIGZIaWdobGlnaHRSYW5nZS5nZXRMZW5ndGgoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YmUxNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLlVSTEh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGluIFhNTCB0YWdzLiBJbmNsdWRlcyBkZXRlY3Rpb24gaW4gRE9DVFlQRSBhbmQgYXR0cmlidXRlCi0gKiB2YWx1ZXMuIFJlc29sdmVzIHJlZmVyZW5jZXMgdG8gc2NoZW1hcywgZHRkcywgZXRjIHVzaW5nIHRoZSBDb21tb24gVVJJCi0gKiBSZXNvbHZlci4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MSHlwZXJsaW5rRGV0ZWN0b3IgaW1wbGVtZW50cyBJSHlwZXJsaW5rRGV0ZWN0b3IgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiaHR0cDovLyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04gPSAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNJX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGh5cGVybGluawotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcGFyYW0gaHlwZXJsaW5rUmVnaW9uCi0JICogQHJldHVybiBJSHlwZXJsaW5rCi0JICovCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhTdHJpbmcgdXJpU3RyaW5nLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50LCBOb2RlIG5vZGUpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQotCQlpZiAoaXNIdHRwKHVyaVN0cmluZykpIHsKLQkJCWxpbmsgPSBuZXcgVVJMSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgdXJpU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJRmlsZSBzeXN0ZW1GaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChzeXN0ZW1GaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3lzdGVtUGF0aCA9IHN5c3RlbUZpbGUuZ2V0UGF0aCgpOwotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHN5c3RlbVBhdGgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBleGlzdHMgaW4KLQkJCQkJLy8gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGZpbGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGhpcyBpcyBhbiBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBkb2VzIG5vdAotCQkJCQkvLyBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCQkJbGluayA9IG5ldyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBzeXN0ZW1GaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJLy8gZm9yIG5vdywgb25seSBjYXBhYmxlIG9mIGNyZWF0aW5nIDEgaHlwZXJsaW5rCi0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCQkvLyBkb2N0eXBlIG5vZGVzCi0JCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50Tm9kZSwgZG9jdW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCS8vIGVsZW1lbnQgbm9kZXMKLQkJCQkJQXR0ciBjdXJyZW50QXR0ciA9IGdldEN1cnJlbnRBdHRyTm9kZShjdXJyZW50Tm9kZSwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGxpbmsgZm9yIGN1cnJlbnQgYXR0cmlidXRlCi0JCQkJCQkvLyByZXNvbHZlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnRBdHRyLCBkb2N1bWVudCk7Ci0JCQkJCQkvLyB2ZXJpZnkgdmFsaWRpdHkgb2YgdXJpIHN0cmluZwotCQkJCQkJaWYgKHVyaVN0cmluZyA9PSBudWxsIHx8ICFpc1ZhbGlkVVJJKHVyaVN0cmluZykpCi0JCQkJCQkJLy8gcmVzZXQgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCQljdXJyZW50QXR0ciA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRBdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGEgbGlua2FibGUgYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50Ci0JCQkJCQljdXJyZW50QXR0ciA9IGdldExpbmthYmxlQXR0cigoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnRBdHRyOwotCQkJCX0KLQkJCQkvLyB0cnkgdG8gY3JlYXRlIGh5cGVybGluayBmcm9tIGluZm9ybWF0aW9uIGdhdGhlcmVkCi0JCQkJaWYgKHVyaVN0cmluZyAhPSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwgJiYgaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGN1cnJlbnROb2RlKTsKLQkJCQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsodXJpU3RyaW5nLCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50LCBjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChoeXBlcmxpbmsgIT0gbnVsbCkgewotCQkJCQkJaHlwZXJsaW5rcy5hZGQoaHlwZXJsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgaHlwZXJsaW5rcy50b0FycmF5KG5ldyBJSHlwZXJsaW5rWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJhc2UgbG9jYXRpb24gZnJvbSB0aGUgY3VycmVudCBtb2RlbCAobG9jYWwgZmlsZSBzeXN0ZW0pCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJaWYgKGxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhc2VMb2MgPSBsb2NhdGlvbi50b1N0cmluZygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGxvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobG9jYXRpb24pLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJZWxzZQotCQkJCQkJYmFzZUxvYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQobG9jYXRpb24pLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTG9jOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5vZGUgd2l0aGluIG5vZGUgYXQgb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBBdHRyCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldEN1cnJlbnRBdHRyTm9kZShOb2RlIG5vZGUsIGludCBvZmZzZXQpIHsKLQkJaWYgKChub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5jb250YWlucyhvZmZzZXQpICYmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIGF0dHJpYnV0ZSBpbiBub2RlIGFuZCBpZiBhdHRyaWJ1dGUgY29udGFpbnMKLQkJCS8vIG9mZnNldCwgcmV0dXJuIHRoYXQgYXR0cmlidXRlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCQkvLyBhc3N1bXB0aW9uIHRoYXQgaWYgcGFyZW50IG5vZGUgaXMgb2YgdHlwZSBJbmRleGVkUmVnaW9uLAotCQkJCS8vIHRoZW4gaXRzIGF0dHJpYnV0ZXMgd2lsbCBhbHNvIGJlIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbgotCQkJCUluZGV4ZWRSZWdpb24gYXR0UmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dFJlZ2lvbi5jb250YWlucyhvZmZzZXQpKSB7Ci0JCQkJCXJldHVybiAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm9kZSB0aGUgY3Vyc29yIGlzIGN1cnJlbnRseSBvbiBpbiB0aGUgZG9jdW1lbnQuIG51bGwgaWYgbm8KLQkgKiBub2RlIGlzIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gTm9kZSBlaXRoZXIgZWxlbWVudCwgZG9jdHlwZSwgdGV4dCwgb3IgbnVsbAotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRDdXJyZW50Tm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJLy8gZ2V0IHRoZSBjdXJyZW50IG5vZGUgYXQgdGhlIG9mZnNldCAocmV0dXJucyBlaXRoZXI6IGVsZW1lbnQsCi0JCS8vIGRvY3R5cGUsIHRleHQpCi0JCUluZGV4ZWRSZWdpb24gaW5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJCWlmIChpbm9kZSA9PSBudWxsKQotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0KLQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIChOb2RlKSBpbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZAotCSAqIGZpbGUgZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykKLQkJCQlpZiAoZmlsZXNbaV0uZXhpc3RzKCkpCi0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJfQotCi0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB1cmlTdHJpbmcgaXMgbm90IGh0dHA6Ly8KLQkgKiBAcmV0dXJuIEZpbGUgY3JlYXRlZCBmcm9tIHVyaVN0cmluZyBpZiBwb3NzaWJsZSwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0RmlsZUZyb21VcmlTdHJpbmcoU3RyaW5nIHVyaVN0cmluZykgewotCQlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZmlyc3QganVzdCB0cnkgdG8gY3JlYXRlIGEgZmlsZSBkaXJlY3RseSBmcm9tIHVyaVN0cmluZyBhcwotCQkJLy8gZGVmYXVsdCBpbiBjYXNlIGNyZWF0ZSBmaWxlIGZyb20gdXJpIGRvZXMgbm90IHdvcmsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCi0JCQkvLyB0cnkgdG8gY3JlYXRlIGZpbGUgZnJvbSB1cmkKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHVyaVN0cmluZyk7Ci0JCQlmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBGaWxlIGp1c3QgaWdub3JlCi0JCQkvLyBhbmQgZmlsZSB3aWxsIGJlIG51bGwKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKE5vZGUgbm9kZSkgewotCQlJUmVnaW9uIGh5cGVyUmVnaW9uID0gbnVsbDsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEVuZE9mZnNldCgpIC0gZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGVzCi0JCQkJSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotCQkJCS8vIGRvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uCi0JCQkJaW50IHJlZ09mZnNldCA9IGF0dC5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlTdHJpbmcgYXR0VmFsdWUgPSBhdHQuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpIHsKLQkJCQkJCSsrcmVnT2Zmc2V0OwotCQkJCQkJcmVnTGVuZ3RoID0gcmVnTGVuZ3RoIC0gMjsKLQkJCQkJfQotCQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24ocmVnT2Zmc2V0LCByZWdMZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gZmluZCBhbiBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQgdGhhdCBpcyBvcGVuYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gQXR0ciBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBmb3Igb3BlbiBvbiwgbnVsbCBpZiBubwotCSAqICAgICAgICAgYXR0cmlidXRlIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldExpbmthYmxlQXR0cihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbm9kZQotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiCi0JCQlBdHRyIGF0dCA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKGlzTGlua2FibGVBdHRyKGF0dCwgZWQpKSB7Ci0JCQkJcmV0dXJuIGF0dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBsb2NhdGlvbiBoaW50IGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlVVJJIGlmIGl0IGV4aXN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Tm9kZSAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIGxvY2F0aW9uIGhpbnQgKHN5c3RlbUlkKSBpZiBpdCB3YXMgZm91bmQsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25IaW50KEVsZW1lbnQgZWxlbWVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJQXR0ciBzY2hlbWFMb2NOb2RlID0gZWxlbWVudE5vZGUuZ2V0QXR0cmlidXRlTm9kZU5TKFhTSV9OQU1FU1BBQ0VfVVJJLCBTQ0hFTUFfTE9DQVRJT04pOwotCQlpZiAoc2NoZW1hTG9jTm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNjaGVtYUxvY05vZGUuZ2V0VmFsdWUoKSk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkvLyBmb3VuZCBsb2NhdGlvbiBoaW50Ci0JCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHNJZ25vcmVDYXNlKHB1YmxpY0lkKSkKLQkJCQkJcmV0dXJuIHN5c3RlbUlkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSSSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJU3RyaW5nKE5vZGUgbm9kZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyByZXNvbHZlZFVSSSA9IG51bGw7Ci0JCS8vIG5lZWQgdGhlIGJhc2UgbG9jYXRpb24sIHB1YmxpY0lkLCBhbmQgc3lzdGVtSWQgZm9yIFVSSVJlc29sdmVyCi0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQkJCXB1YmxpY0lkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZQotCQkJQXR0ciBhdHRyTm9kZSA9IChBdHRyKSBub2RlOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ck5vZGUuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGF0dHJOb2RlLmdldFZhbHVlKCk7Ci0JCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChhdHRyVmFsdWUpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmIGF0dHJWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQotCQkJCS8vIGhhbmRsZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLQkJCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJCQlpZiAoKFhNTE5TLmVxdWFscyhwcmVmaXgpKSB8fCAoWE1MTlMuZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCQkJcHVibGljSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCXN5c3RlbUlkID0gZ2V0TG9jYXRpb25IaW50KGF0dHJOb2RlLmdldE93bmVyRWxlbWVudCgpLCBwdWJsaWNJZCk7Ci0JCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0ck5vZGUpKSkgJiYgKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQkvLyBmb3Igbm93IGp1c3QgdXNlIHRoZSBmaXJzdCBwYWlyCi0JCQkJCS8vIG5lZWQgdG8gbG9vayBpbnRvIGJlaW5nIG1vcmUgcHJlY2lzZQotCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCXB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQlzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkJLy8gZWxzZSBjaGVjayBpZiB4bWxucyBwdWJsaWNJZCA9IHZhbHVlCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXNvbHZlZFVSSSA9IHJlc29sdmVVUkkoYmFzZUxvYywgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJcmV0dXJuIHJlc29sdmVkVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHVyaVN0cmluZyBpcyBhbiBodHRwIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIHRydWUgaWYgdXJpU3RyaW5nIGlzIGh0dHAgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNIdHRwKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc0h0dHAgPSBmYWxzZTsKLQkJaWYgKHVyaVN0cmluZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVtcFN0cmluZyA9IHVyaVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRlbXBTdHJpbmcuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkKLQkJCQlpc0h0dHAgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBpc0h0dHA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIG9wZW5hYmxlLiBBdHRyaWJ1dGUgaXMgb3BlbmFibGUKLQkgKiBpZiBpdCBpcyBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgb3IgaWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCSAqIG9mIHR5cGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBjbUVsZW1lbnQKLQkgKiAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIChjYW4gYmUKLQkgKiAgICAgICAgICAgIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTGlua2FibGVBdHRyKEF0dHIgYXR0ciwgQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50KSB7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgY29udGFpbnMgc2NoZW1hIGxvY2F0aW9uCi0JCWlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0cikpKSAmJiAoKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSB8fCAoTk9fTkFNRVNQQUNFX1NDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgVVJJCi0JCWlmIChjbUVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQlpZiAoKGF0dHJEZWNsICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLlVSSS5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB1cmlTdHJpbmcgaXMgcmVhbGx5IHBvaW50aW5nIHRvIGEgZmlsZQotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFVSSShTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCi0JCWlmIChpc0h0dHAodXJpU3RyaW5nKSkKLQkJCWlzVmFsaWQgPSB0cnVlOwotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCWlzVmFsaWQgPSBmaWxlLmlzRmlsZSgpOwotCQl9Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybiBTdHJpbmcgcmVzb2x2ZWQgdXJpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZG9udCByZXNvbHZlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byByZXNvbHZlCi0JCWlmICgoYmFzZUxvY2F0aW9uID09IG51bGwpICYmIChwdWJsaWNJZCA9PSBudWxsKSAmJiAoc3lzdGVtSWQgPT0gbnVsbCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmZWUwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSFRNTCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXN0b3JlLnNldERlZmF1bHQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPCIpOy8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIEhUTUwgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgICAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTI3LCAwLCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBzdHlsZVZhbHVlKTsKLQkJCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg0MiwgMCwgMjU1KSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQkJCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCQkKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCA5NSwgMTkxKSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0JCQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMTI4LCAxMjgpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMCwgMTI4KSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUsIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgc3R5bGVWYWx1ZSk7Ci0JCQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTI4LCAxMjgsIDEyOCkgICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCAxMjcsIDk1KSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7CS8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQsIHN0eWxlVmFsdWUpOwkvLyBzcGVjaWZpZWQgdmFsdWUgaXMgYmxhY2s7IGxlYXZpbmcgYXMgd2lkZ2V0IGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMTI4LCAxMjgpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCQkKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCAxMjcsIDEyNykgICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIHN0eWxlVmFsdWUpOwotCQkKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIHN0eWxlVmFsdWUpOwotIAotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsJLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5ULCBzdHlsZVZhbHVlKTsJLy8gc3BlY2lmaWVkIHZhbHVlIGlzIGJsYWNrOyBsZWF2aW5nIGFzIHdpZGdldCBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCQkKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDAsIDApICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIHN0eWxlVmFsdWUpOwotCQkKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDE5MSwgOTUsIDYzKSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQkJCi0JCS8vIHNldCBkZWZhdWx0IG5ldyBodG1sIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyBmaWxlIHdpemFyZAotCQkvKgotCQkgKiBOZWVkIHRvIGZpbmQgdGVtcGxhdGUgbmFtZSB0aGF0IGdvZXMgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGlkIChuYW1lCi0JCSAqIG1heSBjaGFuZ2UgZm9yIGRpZmZlcm50IGxhbmd1YWdlKQotCQkgKi8KLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkuZmluZFRlbXBsYXRlQnlJZCgib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZmM5NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgSFRNTCBVSQotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUHJlZmVyZW5jZU5hbWVzIHsKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBjb2RlIGFzc2lzdCBnZXRzIGF1dG8gYWN0aXZhdGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRSA9IGdldEF1dG9Qcm9wb3NlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRV9DT0RFID0gZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlQ29kZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gZ2V0VGVtcGxhdGVzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVzS2V5KCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IEhUTUwgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjQ2MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb2xvclBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ29sb3JQYWdlIGV4dGVuZHMgWE1MQ29sb3JQYWdlIHsKLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpaS5uZXh0KCkpKTsJCi0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBIVE1MVUlNZXNzYWdlcy5TYW1wbGVfSFRNTF9kb2M7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJaW5pdENvbW1vbkNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlpbml0RG9jVHlwZUNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQkvLyBGSVhNRTogdGhlc2Ugd2VyZSAiYnJ1dGUgZm9yY2VkIiBjb21tZW50ZWQgb3V0IHdoZW4gbW92aW5nIFhNTEpTUFJlZ2lvbkNvbnRleHRzCi0JCS8vIGVmZmVjdCBpcyB1bmtub3duLCBidXQgdGhvdWdodCBqdXN0IHRvIGVmZmVjdCBwcmVmZXJlbmNlIHBhZ2UKLQkJLy9jb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJLy9jb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCS8vY29udGV4dFN0eWxlTWFwLnB1dChYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJLy9jb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQotCQlpbml0Q29tbW9uRGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCWluaXREb2NUeXBlRGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCQlpbml0Q29tbW9uU3R5bGVMaXN0KGxpc3QpOwotCQlpbml0RG9jVHlwZVN0eWxlTGlzdChsaXN0KTsKLQkJLy8JbGlzdC5hZGQoSFRNTENvbG9yTWFuYWdlci5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcikgewotCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcGlja2VyLnNldFBhcnNlcihtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKS5nZXRQYXJzZXIoKSk7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcwotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCS8vIG1hcCByZWdpb24gdHlwZXMgdG8gaGlsaWdodGluZyB0eXBlcwotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCS8vCXVwZGF0ZVBpY2tlckZvbnQocGlja2VyKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1MTUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGZJbnB1dEVuY29kaW5nU2V0dGluZ3MgPSBudWxsOwotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHNjcm9sbGVkQ29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckxvYWRpbmdHcm91cChzY3JvbGxlZENvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY3JvbGxlZENvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQotCQlzZXRTaXplKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIHNjcm9sbGVkQ29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yTG9hZGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotCQlncm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzApOwotCi0JCWZJbnB1dEVuY29kaW5nU2V0dGluZ3MgPSBuZXcgV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MoZ3JvdXApOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVWYWx1ZXMoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0KLQkJZklucHV0RW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGVuY29kaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JMb2FkaW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JMb2FkaW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCi0JCWZJbnB1dEVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhlbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN1cGVyLnN0b3JlVmFsdWVzKCk7Ci0JCXN0b3JlVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKSB7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VULCBmSW5wdXRFbmNvZGluZ1NldHRpbmdzLmdldElBTkFUYWcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKHBhcmVudCk7Ci0JCS8vIEdyb3VwIGNyZWF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQkvLyBjcmVhdGluZ0dyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXMpOwotCQkvLwkJCi0JCS8vIC8vIEVuY29kaW5nLi4KLQkJLy8gTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLAotCQkvLyBIVE1MVUlNZXNzYWdlcy5FbmNvZGluZ19kZXNjKTsKLQkJLy8gKChHcmlkRGF0YSlsYWJlbC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJLy8gZkVuY29kaW5nU2V0dGluZ3MgPSBuZXcgRW5jb2RpbmdTZXR0aW5ncyhjcmVhdGluZ0dyb3VwKTsKLQkJLy8gKChHcmlkRGF0YSlmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1NTQ1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIEhUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFhNTFNvdXJjZVByZWZlcmVuY2VQYWdlIHsKLQotCXByb3RlY3RlZCBCdXR0b24gZlRhZ05hbWVBc0lzID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZUYWdOYW1lVXBwZXIgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gZlRhZ05hbWVMb3dlciA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQXR0ck5hbWVBc0lzID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdHRyTmFtZVVwcGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdHRyTmFtZUxvd2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDb250ZW50QXNzaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChwYXJlbnQpOwotCi0JCS8vIGFkZCBvbmUgbW9yZSBncm91cCBvZiBwcmVmZXJlbmNlcwotCQljcmVhdGVDb250ZW50c0ZvclByZWZlcnJlZENhc2VHcm91cChwYXJlbnQsIDIpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29udGVudHNGb3JQcmVmZXJyZWRDYXNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtblNwYW4pIHsKLQkJR3JvdXAgY2FzZUdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBjb2x1bW5TcGFuKTsKLQkJY2FzZUdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuUHJlZmVycmVkX21hcmt1cF9jYXNlX1VJXyk7Ci0KLQkJLy8gZDI1NzA2NCBuZWVkIHRvIGFzc29jaWF0ZSBncm91cCB3LyByYWRpbyBidXR0b25zIHNvIHJhZGlvIGJ1dHRvbnMgaGVhZGVyIGNhbiBiZSByZWFkCi0JCUdyb3VwIHRhZ05hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCXRhZ05hbWVHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lc19fVUlfKTsKLQkJZlRhZ05hbWVVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRhZ05hbWVHcm91cCwgSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVzX1VwcGVyX2Nhc2VfVUlfKTsKLQkJZlRhZ05hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRhZ05hbWVHcm91cCwgSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVzX0xvd2VyX2Nhc2VfVUlfKTsKLQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJR3JvdXAgYXR0ck5hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCWF0dHJOYW1lR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZXNfX1VJXyk7Ci0JCWZBdHRyTmFtZVVwcGVyID0gY3JlYXRlUmFkaW9CdXR0b24oYXR0ck5hbWVHcm91cCwgSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVzX1VwcGVyX2Nhc2VfVUlfKTsKLQkJZkF0dHJOYW1lTG93ZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihhdHRyTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZXNfTG93ZXJfY2FzZV9VSV8pOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZUYWdOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlRhZ05hbWVMb3dlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmQXR0ck5hbWVVcHBlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZkF0dHJOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJZlRhZ05hbWVVcHBlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZUYWdOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmQXR0ck5hbWVVcHBlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmQXR0ck5hbWVMb3dlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCi0JCXN1cGVyLmluaXRpYWxpemVWYWx1ZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJaWYgKGZUYWdOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQllbHNlCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlpZiAoZkF0dHJOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZWxzZQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0KLQkJc3VwZXIuc3RvcmVWYWx1ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gVUkKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9TT1VSQ0VfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmYxZjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBIVE1MIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIHsKLQkKLQlwdWJsaWMgSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCUhUTUxVSVBsdWdpbiBodG1sRWRpdG9yUGx1Z2luID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJCi0JCXNldFByZWZlcmVuY2VTdG9yZShodG1sRWRpdG9yUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShodG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoaHRtbEVkaXRvclBsdWdpbi5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gIAkgIGJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLSAgCSAgSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkgIHJldHVybiBvazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3M2JiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENvbnRhaW5zIGEgc2V0IG9mIHByb2plY3Rpb24gbW9kZWwgYWRkaXRpb25zL2RlbGV0aW9ucy9tb2RpZmljYXRpb25zCi0gKi8KLWNsYXNzIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQlwcml2YXRlIE5vZGUgZk5vZGU7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZkRlbGV0aW9uczsKLQlwcml2YXRlIE1hcCBmQWRkaXRpb25zOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZNb2RpZmljYXRpb25zOwotCi0JcHVibGljIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJZk5vZGUgPSBub2RlOwotCQlmRGVsZXRpb25zID0gZGVsZXRpb25zOwotCQlmQWRkaXRpb25zID0gYWRkaXRpb25zOwotCQlmTW9kaWZpY2F0aW9ucyA9IG1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRBZGRpdGlvbnMoKSB7Ci0JCXJldHVybiBmQWRkaXRpb25zOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0RGVsZXRpb25zKCkgewotCQlyZXR1cm4gZkRlbGV0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldE1vZGlmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiBmTW9kaWZpY2F0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gZk5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjN2EzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogbW9kZWwgbm9kZSBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZQcm9qZWN0aW9uVmlld2VyczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJc3VwZXIoYWRhcHRlcktleSk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKSB7Ci0JCXRoaXMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSBwYXJlbnQgb2YgdGFyZ2V0IGlmIHRhcmdldCBpcyB0aGUKLQkgKiAiYWRhcHQtYWJsZSIgbm9kZQotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAoKGlzQWN0aXZlKCkpICYmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSAmJiAoKE5vZGUpIHRhcmdldCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCi0JCQkJLy8gYWN0dWFsbHkgd29yayB3aXRoIHRoZSBwYXJlbnQgbm9kZSB0byBsaXN0ZW4gZm9yIGFkZCwKLQkJCQkvLyBkZWxldGUgZXZlbnRzCi0JCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIHBhcmVudE5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHBhcmVudDsKLQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIHBhcmVudEFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKSBwYXJlbnROb3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCQkJaWYgKHBhcmVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IGFkYXB0ZXIgZm9yIHBhcmVudAotCQkJCQkJcGFyZW50QWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwodGhpcyk7Ci0JCQkJCQlwYXJlbnROb3RpZmllci5hZGRBZGFwdGVyKHBhcmVudEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJCS8vIGNhbGwgdXBkYXRlIG9uIHBhcmVudCBiZWNhdXNlIGEgbmV3IG5vZGUgaGFzIGp1c3QgYmVlbgotCQkJCQkvLyBhZGRlZAotCQkJCQlwYXJlbnRBZGFwdGVyLnVwZGF0ZUFkYXB0ZXIocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJLy8gbm9kZSBpcyBvbmx5IHByb2plY3RhYmxlIGlmIGl0IGlzIGhlYWQsIGJvZHksIHNjcmlwdCwgc3R5bGUsCi0JCQkvLyB0YWJsZSwgdWwsIG9sIHRhZ3MKLQkJCWlmIChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZhY3RvcnkgaXMgY3VycmVudGx5IGFjdGl2ZWx5IG1hbmFnaW5nIHByb2plY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCAmJiAhZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0aW9uIHZpZXdlciBpZgotCSAqIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkCi0JICogd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucywgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gY3JlYXRlIGEgY2hhbmdlIG9iamVjdCBmb3IgbGF0ZXN0IGNoYW5nZSBhbmQgYWRkIHRvIHF1ZXVlCi0JCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSA9IG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucyk7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMuZ2V0KHZpZXdlcik7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnbyB0aHJvdWdoIGV2ZXJ5IHByb2plY3Rpb252aWV3ZXIgYW5kIGNhbGwKLQkJLy8gcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQkJaW5mb3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHZpZXdlciB0byBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzIGZhY3RvcnkgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdmlld2VyJ3MgZG9jdW1lbnQgYW5kIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCSAqICAgICAgICAgICAgYXJlIG5vdCBudWxsCi0JICovCi0Jdm9pZCBhZGRQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHJlbW92ZSBvbGQgZW50cnkgaWYgaXQgZXhpc3RzCi0JCXJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzID09IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgbmV3IG9iamVjdCBjb250YWluaW5nIHByb2plY3Rpb24gdmlld2VyIGFuZCBpdHMgaW5mbwotCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IG5ldyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24odmlld2VyKTsKLQkJZlByb2plY3Rpb25WaWV3ZXJzLnB1dCh2aWV3ZXIsIGluZm8pOwotCQlpbmZvLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiB2aWV3ZXIgZnJvbSB0aGUgbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcwotCSAqIGZhY3RvciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCByZW1vdmVQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBvZiB2aWV3ZXJzCi0JCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5yZW1vdmUodmlld2VyKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vIGlmIHJlbW92aW5nIGxhc3QgcHJvamVjdGlvbiB2aWV3ZXIsIGNsZWFyIG91dCBldmVyeXRoaW5nCi0JCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0NGY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5KSB7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdGlvbiBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBub2RlLiBBYmxlIHRvIGdldAotCSAqIHByb2plY3Rpb24gcG9zaXRpb24gaWYgbm9kZSBpc05vZGVQcm9qZWN0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbnVsbCBpZiBubyBwcm9qZWN0aW9uIHBvc2l0aW9uIHBvc3NpYmxlLCBhIFBvc2l0aW9uIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKE5vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoZkFkYXB0ZXJGYWN0b3J5LmlzTm9kZVByb2plY3RhYmxlKG5vZGUpICYmIG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkvLyBJRG9jdW1lbnQgZG9jdW1lbnQgPQotCQkJLy8gZkFkYXB0ZXJGYWN0b3J5LmdldFByb2plY3Rpb25WaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotCQkJLy8gaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUluZGV4ZWRSZWdpb24gaW5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCWludCBzdGFydCA9IGlub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gaW5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoc3RhcnQgPj0gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJCS8vIHJlZ2lvbi1iYXNlZAotCQkJCS8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJLy8gdHJ5IHsKLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbgotCQkJCS8vIC8vIGluY3JlYXNlIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBJUmVnaW9uIHN0YXJ0TGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIElSZWdpb24gZW5kTGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpbnQgc3RhcnRPZmZzZXQgPSBzdGFydExpbmVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGVuZExpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIGVuZExpbmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJLy8gaWYgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLQotCQkJCS8vIHN0YXJ0T2Zmc2V0KTsKLQkJCQkvLyB9Ci0JCQkJLy8KLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gbm8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IHJlZ2lvbiBpbmNyZWFzZQotCQkJCS8vIC8vIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmQpOwotCQkJCS8vIGlmIChlbmRMaW5lICsgMSA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSkgewotCQkJCS8vIGludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHN0YXJ0TGluZSk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoZW5kTGluZSArIDEpOwotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGVuZE9mZnNldCAtIG9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCS8vIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIG51bGwsIHgpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQkvLyB9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogRmluZCBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZSBpbiB0aGUgY3VycmVudCBsaXN0IG9mIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBnZXRFeGlzdGluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJTm9kZSBuID0gYS5nZXROb2RlKCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKG4pKSB7Ci0JCQkJCWFubm8gPSBhOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gY2hlY2sgaWYgZm9sZGluZyBpcyBldmVuIGVuYWJsZWQsIGlmIG5vdCwganVzdCBpZ25vcmUgbm90aWZ5Q2hhbmdlZAotCQkvLyBldmVudHMKLQkJaWYgKCFmQWRhcHRlckZhY3RvcnkuaXNBY3RpdmUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXVwZGF0ZUFkYXB0ZXIoKE5vZGUpIG5vdGlmaWVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihOb2RlIG5vZGUsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlNYXAgYWRkaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb2plY3Rpb25Bbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJLy8gZ28gdGhyb3VnaCBpbW1lZGlhdGUgY2hpbGQgbm9kZXMgYW5kIGZpZ3VyZSBvdXQgcHJvamVjdGlvbgotCQkvLyBtb2RlbCBhbm5vdGF0aW9ucwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24oY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQlhZGRpdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KGV4aXN0aW5nLCBuZXdQb3MpOwotCQkJCQkJLy8gcmVtb3ZlIGZyb20gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gZGVsZXRlCi0JCQkJCQlmVGFnQW5ub3RhdGlvbnMucmVtb3ZlKGV4aXN0aW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQotCQkJLy8gaW4gdGhlIGVuZCwgd2FudCB0byBkZWxldGUgYW55dGhpbmcgbGVmdG92ZXIgaW4gb2xkIGxpc3QsIGFkZAotCQkJLy8gZXZlcnl0aGluZyBpbiBhZGRpdGlvbnMsIGFuZCB1cGRhdGUgZXZlcnl0aGluZyBpbgotCQkJLy8gcHJvamVjdGlvbkFubm90YXRpb25zCi0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG9sZExpc3QgPSBudWxsOwotCQkJaWYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJb2xkTGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBtb2RpZnlMaXN0ID0gbnVsbDsKLQkJCWlmICghcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW1vZGlmeUxpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgcHJvamVjdGlvbkFubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQotCQkJLy8gc3BlY2lmaWNhbGx5IGFkZCBhbGwgYW5ub3RhdGlvbnMgdG8gdmlld2VyCi0JCQlpZiAodmlld2VyICE9IG51bGwgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKG9sZExpc3QgIT0gbnVsbCAmJiBvbGRMaXN0Lmxlbmd0aCA+IDApIHx8ICghYWRkaXRpb25zLmlzRW1wdHkoKSkgfHwgKG1vZGlmeUxpc3QgIT0gbnVsbCAmJiBtb2RpZnlMaXN0Lmxlbmd0aCA+IDApKQotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgb2xkTGlzdCwgYWRkaXRpb25zLCBtb2RpZnlMaXN0KTsKLQkJfQotCi0JCS8vIHNhdmUgbmV3IGxpc3Qgb2YgYW5ub3RhdGlvbnMKLQkJZlRhZ0Fubm90YXRpb25zID0gcHJvamVjdGlvbkFubm90YXRpb25zOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC51cGRhdGVBZGFwdGVyICgiICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NWVmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0aW9uIHZpZXdlciBhbmQgYWxzbyBtYW5hZ2VzIHVwZGF0aW5nCi0gKiB0aGUgdmlld2VyJ3MgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0gKi8KLWNsYXNzIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmSW5mby5oYXNDaGFuZ2VzUXVldWVkKCkpCi0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJZkluZm8uYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIHZpZXdlcgotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkvKioKLQkgKiBEb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCi0JcHVibGljIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlmRG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0JfQotCi0Jdm9pZCBzZXRJc0RvY3VtZW50Q2hhbmdpbmcoYm9vbGVhbiBjaGFuZ2luZykgewotCQlmSXNEb2N1bWVudENoYW5naW5nID0gY2hhbmdpbmc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRDaGFuZ2luZygpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50Q2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgcGVuZGluZyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0byB0aGUKLQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCUxpc3QgcXVldWVkQ2hhbmdlcyA9IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCk7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkKLQkJLy8gdGhlbSB0bwotCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCXdoaWxlICghcXVldWVkQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIGNoYW5nZXMgPSAoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMpIHF1ZXVlZENoYW5nZXMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5tb2RpZnlBbm5vdGF0aW9ucyhjaGFuZ2VzLmdldERlbGV0aW9ucygpLCBjaGFuZ2VzLmdldEFkZGl0aW9ucygpLCBjaGFuZ2VzLmdldE1vZGlmaWNhdGlvbnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbm5vdGF0aW9uIGNoYW5nZXMgcXVldWVkIHVwLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZXNRdWV1ZWQoKSB7Ci0JCXJldHVybiAhZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UpIHsKLQkJLyoKLQkJICogZnV0dXJlX1RPRE86IG1heWJlIGltcHJvdmUgYnkgY2hlY2tpbmcgaWYgYW5ub3RhdGlvbiBwcm9qZWN0aW9uCi0JCSAqIG1vZGVsIGNoYW5nZSBhbHJlYWR5IGV4aXN0cyBmb3Igbm9kZS4gaWYgc28sIHRocm93IG91dCBvbGQgY2hhbmdlLgotCQkgKi8KLQkJZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5hZGQobmV3Q2hhbmdlKTsKLQotCQkvLyBpZiBkb2N1bWVudCBpc24ndCBjaGFuZ2luZywgZ28gYWhlYWQgYW5kIGFwcGx5IGl0Ci0JCWlmICghaXNEb2N1bWVudENoYW5naW5nKCkpIHsKLQkJCWFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gYWRkIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWdldERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gcmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXREb2N1bWVudCgpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgcXVldWVkIGNoYW5nZXMgc2luY2UgaXQgbWF5IG5vIGxvbmdlcgotCQkvLyBiZSBhY2N1cmF0ZQotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzICE9IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcy5jbGVhcigpOwotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE3Y2NhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLklTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyB0aGUgcHJvamVjdGlvbiBtb2RlbCBvZiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIEhUTUwuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIGJvb2xlYW4gZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgdG8gYWRkIGFkYXB0ZXJzIHRvIChsaW1pdCBmb3IgcGVyZm9ybWFuY2UKLQkgKiBzYWtlKQotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9DSElMRFJFTiA9IDEwOwotCS8qKgotCSAqIE1heGltdW0gbnVtYmVyIG9mIHNpYmxpbmcgbm9kZXMgdG8gYWRkIGFkYXB0ZXJzIHRvIChsaW1pdCBmb3IKLQkgKiBwZXJmb3JtYW5jZSBzYWtlKQotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9TSUJMSU5HUyA9IDEwMDA7Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGFkYXB0ZXIgdG8gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gY2hpbGRMZXZlbAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyVG9Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgY2hpbGRMZXZlbCkgewotCQkvLyBzdG9wIGFkZGluZyBpbml0aWFsIGFkYXB0ZXJzIE1BWF9DSElMRFJFTiBsZXZlbHMgZGVlcCBmb3IKLQkJLy8gcGVyZm9ybWFuY2Ugc2FrZQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIgJiYgY2hpbGRMZXZlbCA8IE1BWF9DSElMRFJFTikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdXBkYXRlIHRoZQotCQkJLy8gYWRhcHRlciB3aXRoIHByb2plY3Rpb24gaW5mb3JtYXRpb24KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBhZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCkgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKG5vZGUsIGZWaWV3ZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZCBhbmQKLQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJfQotCQkJaW50IHNpYmxpbmdMZXZlbCA9IDA7Ci0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsICYmIHNpYmxpbmdMZXZlbCA8IE1BWF9TSUJMSU5HUykgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgY2hpbGRMZXZlbCArIDEpOwotCQkJCSsrc2libGluZ0xldmVsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIGFkZHMgYW4gYWRhcHRlciBvbnRvIGVhY2ggZm9yIHRyYWNraW5nCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCQkrK3NpYmxpbmdMZXZlbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIHRvIHVzZSB3aXRoIHRoaXMKLQkgKiBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZ2V0QWRhcHRlckZhY3RvcnkoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBuZXdGYWN0b3J5ID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwpIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmdldEFkYXB0ZXJGYWN0b3J5OiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCS8vIGNsZWFyIG91dCBvbGQgaW5mbwotCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQlmRG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJLy8gc2V0IHByb2plY3Rpb24gdmlld2VyIG9uIG5ldyBkb2N1bWVudCdzIGFkYXB0ZXIgZmFjdG9yeQotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkodHJ1ZSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQkJfQotCi0JCQlhZGRBbGxBZGFwdGVycygpOwotCQl9Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFzc29jaWF0ZSBhIFByb2plY3Rpb25WaWV3ZXIgd2l0aCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gdW5pbnN0YWxsIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFsbCBuZXcgdmlld2VyCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQl1bmluc3RhbGwoKTsKLQkJfQotCQlmVmlld2VyID0gdmlld2VyOwotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnN0YWxsZWQoKSB7Ci0JCXJldHVybiBmVmlld2VyICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkRpc2FibGVkKCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeShmYWxzZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnkucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgYW5ub3RhdGlvbnMKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpCi0JCQlmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5yZW1vdmVBbGxBbm5vdGF0aW9ucygpOwotCi0JCXJlbW92ZUFsbEFkYXB0ZXJzKCk7Ci0KLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIGFkYXB0ZXIgZnJvbSBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBsZXZlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBsZXZlbCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQotCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGFkYXB0ZXIgZm9yIHRoZSBjdXJyZW50IG5vZGUgYW5kIHJlbW92ZSBpdAotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCi0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGxldmVsICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgcmVtb3ZlcyBhZGFwdGVyIGZyb20gZWFjaCBmb3IgY2xlYW51cAotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5yZW1vdmVBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBmb2xkaW5nIGlzIGVuYWJsZWQgYW5kIG5ldyBkb2N1bWVudCBpcyBnb2luZyB0byBiZSBhIHRvdGFsbHkKLQkJLy8gZGlmZmVyZW50IGRvY3VtZW50LCBkaXNhYmxlIHByb2plY3Rpb24KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIGZEb2N1bWVudCAhPSBuZXdJbnB1dCkgewotCQkJLy8gZGlzYWJsZSBwcm9qZWN0aW9uIGFuZCBkaXNjb25uZWN0IGV2ZXJ5dGhpbmcKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIHByb2plY3Rpb24gd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgaW5wdXQgZG9jdW1lbnQgY2hhbmdlZAotCQkvLyBhbmQgbmV3IGRvY3VtZW50IGlzIGRpZmZlcmVudCB0aGFuIG9sZCBkb2N1bWVudAotCQlpZiAoZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkICYmIGZEb2N1bWVudCA9PSBudWxsICYmIG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCXByb2plY3Rpb25FbmFibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIgZnJvbSBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCQlmVmlld2VyLnJlbW92ZVByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJiNDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MIGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0KLQotCXB1YmxpYyB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQkvLyB0aGVzZSBhcmUgdGhlIG5vcm1hbCBlZGl0IHNpZGUgY29udGVudCBiYXNlZCBmYWN0b3JpZXMKLQkJYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIE11c3QgdXBkYXRlL2FkZCB0byBwcm9wYWdhdGluZyBhZGFwdGVyIGhlcmUgdG9vCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCWFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoc3RydWN0dXJlZE1vZGVsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkJZmFjdG9yeSA9IGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IG5ldyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwoKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBubyBwcm9wYWdhdGluZyB0byBhZGQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNpc0ZvcihDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9ySFRNTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVpbml0aWFsaXplRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8sIHNpbmNlIG5vIGVtYmVkZGVkIHR5cGUKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzJjNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZXRzIHVwIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGZvciBodG1sIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgTGlzdCBmUHJvY2Vzc29yczsKLQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTJhNjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBDb25maWd1cmVzIGEgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHdpdGggSFRNTCBwYXJ0aXRpb25zIGFuZCByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxULCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVH07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlZ2lvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUV9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0hUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3Yzg4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN5bWJvbGljIG5hbWUgb2Ygc3R5bGVzIHVzZWQgYnkgTGluZVN0eWxlUHJvdmlkZXIsIENvbG9yTWFuYWdlciwgYW5kCi0gKiBhbnkgb3RoZXJzIHdobyBtYXkgYmUgaW50ZXJlc3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0hUTUwgZXh0ZW5kcyBJU3R5bGVDb25zdGFudHNYTUwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVF9BUkVBX0JPUkRFUiA9ICJTQ1JJUFRfQVJFQV9CT1JERVIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfQVJFQSA9ICJTQ1JJUFRfQVJFQSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiNWU3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckhUTUwgZXh0ZW5kcyBMaW5lU3R5bGVQcm92aWRlckZvclhNTCBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zIAotCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JICovCi0JLy8gTk9URTogdGhpcyBtZXRob2Qgd2FzIGp1c3QgY29waWVkIGRvd24gZm9ybSBMaW5lU3R5bGVQcm92aWRlckZvclhNTAotCXB1YmxpYyBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgY29taW5nIHRocm91Z2ggbnVsbCwgYnV0IGp1c3QgdG8gY2F0Y2ggaXQKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJfQotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSlnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQl9Ci0JCS8vIGZpcnN0IHRyeSAic3RhbmRhcmQiIHRhZyBhdHRyaWJ1dGVzIGZyb20gc3VwZXIgY2xhc3MKLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZUZvcihyZWdpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCXN1cGVyLmxvYWRDb2xvcnMoKTsKLQotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCi0JCQkJLy8gdGhpcyBpcyB3aGF0IEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIucHJvcGVydHlDaGFuZ2UoKSBkb2VzCi0JCQkJZ2V0SGlnaGxpZ2h0ZXIoKS5yZWZyZXNoRGlzcGxheSgpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyI2dldENvbG9yUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOWNiMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBIVE1MIHRhZ3MgKFNob3dzIHRvb2x0aXAgZGVzY3JpcHRpb24pCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MSW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiB7Ci0KLQlwcml2YXRlIElUZXh0SG92ZXIgZlRleHRIb3ZlciA9IG51bGw7Ci0KLQlwdWJsaWMgSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRTdWJqZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEluZm9ybWF0aW9uMih0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24jZ2V0SW5mb3JtYXRpb24yKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbjIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVySW5mbyh0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmNzEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm8uWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yOwotCi0vKioKLSAqIFByb3ZpZGVzIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgSFRNTCB0YWdzCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIEhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IgZXh0ZW5kcyBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IgewotCS8vCWN1cnJlbnRseSBlbXB0eSBiZWNhdXNlIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBoYW5kbGVzIGFsbCBjYXNlcyByZWxldmFudCB0byBIVE1MCi0JcHVibGljIEhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E3ZDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MIGV4dGVuZHMgU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVFlQRSA9IGdldEVuY29kaW5nVHlwZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVuY29kaW5nVHlwZSgpIHsKLQkJcmV0dXJuICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVuY29kaW5nIHZhcmlhYmxlCi0JICovCi0JcHVibGljIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTCgpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgSFRNTFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXNfZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShUZW1wbGF0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc3NWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEhUTUwgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIEhUTUwgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRiMTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9IGdldEFsbCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFID0gZ2V0QXR0cmlidXRlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXID0gZ2V0TmV3KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBnZXRUYWcoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBbGwoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYWxsIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGVfdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ldygpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9uZXciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhZygpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl90YWciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuICJodG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiY2U0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0hUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXSd9OwotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JCXN1cGVyKG5ldyBTdHJpbmdbXXtET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UfSwgbmV3IEphdmFQYWlyTWF0Y2hlcihCUkFDS0VUUykpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0lKYXZhUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9JSmF2YVBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkODU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0lKYXZhUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIEphdmEgcGFydGl0aW9uaW5nIGFuZCBpdHMgcGFydGl0aW9ucy4KLSAqIAotICogQHNlZSBFY2xpcHNlIDMuMQotICovCi1pbnRlcmZhY2UgSUphdmFQYXJ0aXRpb25zIHsKLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIHBhcnRpdGlvbmluZy4KLQkgKi8KLQlTdHJpbmcgSkFWQV9QQVJUSVRJT05JTkcgPSAiX19famF2YV9wYXJ0aXRpb25pbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2luZ2xlLWxpbmUgKEpMUzI6IEVuZE9mTGluZUNvbW1lbnQpIGVuZCBjb21tZW50Ci0JICogcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9TSU5HTEVfTElORV9DT01NRU5UID0gIl9famF2YV9zaW5nbGVsaW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBtdWx0aS1saW5lIChKTFMyOiBUcmFkaXRpb25hbENvbW1lbnQpIGNvbW1lbnQgcGFydGl0aW9uCi0JICogY29udGVudCB0eXBlLgotCSAqLwotCVN0cmluZyBKQVZBX01VTFRJX0xJTkVfQ09NTUVOVCA9ICJfX2phdmFfbXVsdGlsaW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YWRvYyAoSkxTMjogRG9jdW1lbnRhdGlvbkNvbW1lbnQpIHBhcnRpdGlvbgotCSAqIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9ET0MgPSAiX19qYXZhX2phdmFkb2MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YSBzdHJpbmcgcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9TVFJJTkcgPSAiX19qYXZhX3N0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIGNoYXJhY3RlciBwYXJ0aXRpb24gY29udGVudCB0eXBlLgotCSAqLwotCVN0cmluZyBKQVZBX0NIQVJBQ1RFUiA9ICJfX2phdmFfY2hhcmFjdGVyIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NhY2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQuU2luZ2xlQ2hhclJlYWRlcjsKLQotLyoqCi0gKiBSZWFkcyBmcm9tIGEgZG9jdW1lbnQgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcy4gTWF5IGJlIGNvbmZpZ3VyZWQgdG8KLSAqIHNraXAgY29tbWVudHMgYW5kIHN0cmluZ3MuCi0gKi8KLWNsYXNzIEphdmFDb2RlUmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0KLQkvKiogVGhlIEVPRiBjaGFyYWN0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2tpcENvbW1lbnRzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZTa2lwU3RyaW5ncyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQlwcml2YXRlIGludCBmRW5kID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVOdW1iZXIgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU9mZnNldCA9IC0xOwotCi0KLQlwdWJsaWMgSmF2YUNvZGVSZWFkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQKLQkgKiBhZnRlciByZWFkIGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZGb3J3YXJkID8gZk9mZnNldCAtIDEgOiBmT2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gdHJ1ZTsKLQkJZkVuZCA9IE1hdGgubWluKGZEb2N1bWVudC5nZXRMZW5ndGgoKSwgZk9mZnNldCArIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJlQmFja3dhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNpbmdsZUNoYXJSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmRm9yd2FyZCA/IHJlYWRGb3J3YXJkcygpIDogcmVhZEJhY2t3YXJkcygpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50RW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonKSB7Ci0JCQkJaWYgKGZPZmZzZXQgPCBmRW5kICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykgewotCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ0VuZChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJ1xcJykgewotCQkJCS8vIGlnbm9yZSBlc2NhcGVkIGNoYXJhY3RlcnMKLQkJCQkrK2ZPZmZzZXQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvTGluZUVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJZk9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUgKyAxKTsKLQl9Ci0KLQlwcml2YXRlIGludCByZWFkRm9yd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0KLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nIDoKLQotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0IDwgZkVuZCkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IGVuZAotCQkJCQkJCSsrZk9mZnNldDsKLQkJCQkJCQlnb3RvQ29tbWVudEVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBsaW5lIGVuZAotCQkJCQkJCWdvdG9MaW5lRW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCWdvdG9TdHJpbmdFbmQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCi0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCi0JCXJldHVybiBFT0Y7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQlpZiAobGluZSA8IGZDYWNoZWRMaW5lTnVtYmVyKSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGxpbmU7Ci0JCQlmQ2FjaGVkTGluZU9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJaW50IG9mZnNldCA9IGZPZmZzZXQ7Ci0JCQl3aGlsZSAoZkNhY2hlZExpbmVPZmZzZXQgPCBvZmZzZXQpIHsKLQkJCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQtLSk7Ci0JCQkJaWYgKGN1cnJlbnQgPT0gJy8nICYmIGZDYWNoZWRMaW5lT2Zmc2V0IDw9IG9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpID09ICcvJykgewotCQkJCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50U3RhcnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQtLSk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicgJiYgMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ1N0YXJ0KGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKCEoMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKSA9PSAnXFwnKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJLS1mT2Zmc2V0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVhZEJhY2t3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQktLWZPZmZzZXQ7Ci0KLQkJCWhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCk7Ci0KLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLycgOgotCi0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPiAxKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgZW5kcywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBzdGFydAotCQkJCQkJCWZPZmZzZXQgLT0gMjsKLQkJCQkJCQlnb3RvQ29tbWVudFN0YXJ0KCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCS0tZk9mZnNldDsKLQkJCQkJCWdvdG9TdHJpbmdTdGFydChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0KLQkJcmV0dXJuIEVPRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjAyYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRSZWdpb247Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciBoZXVyaXN0aWMgYmFzZWQgSmF2YSBtYW5pcHVsYXRpb25zIGluIGFuIGluY29tcGxldGUKLSAqIEphdmEgc291cmNlIGZpbGUuCi0gKiAKLSAqIDxwPgotICogQW4gaW5zdGFuY2UgaG9sZHMgc29tZSBpbnRlcm5hbCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYW5kIGlzIHRoZXJlZm9yZQotICogbm90IHRocmVhZHNhZmUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgRWNsaXBzZSAzLjAKLSAqLwotZmluYWwgY2xhc3MgSmF2YUhldXJpc3RpY1NjYW5uZXIgaW1wbGVtZW50cyBTeW1ib2xzIHsKLQkvKioKLQkgKiBSZXR1cm5lZCBieSBhbGwgbWV0aG9kcyB3aGVuIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gY291bGQgbm90IGJlIGZvdW5kLAotCSAqIG9yIGlmIGEge0BsaW5rIEJhZExvY2F0aW9uRXhjZXB0aW9ufSB3YXMgdGhyb3duIHdoaWxlIHNjYW5uaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9GT1VORCA9IC0xOwotCi0JLyoqCi0JICogU3BlY2lhbCBib3VuZCBwYXJhbWV0ZXIgdGhhdCBtZWFucyBlaXRoZXIgLTEgKGJhY2t3YXJkIHNjYW5uaW5nKSBvcgotCSAqIDxjb2RlPmZEb2N1bWVudC5nZXRMZW5ndGgoKTwvY29kZT4gKGZvcndhcmQgc2Nhbm5pbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkQgPSAtMjsKLQotCi0JLyogY2hhcmFjdGVyIGNvbnN0YW50cyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEJSQUNFID0gJ3snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkJSQUNFID0gJ30nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTFBBUkVOID0gJygnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUlBBUkVOID0gJyknOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0VNSUNPTE9OID0gJzsnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ09MT04gPSAnOic7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDT01NQSA9ICcsJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExCUkFDS0VUID0gJ1snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkJSQUNLRVQgPSAnXSc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVUVTVElPTk1BUksgPSAnPyc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBFUVVBTCA9ICc9JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTkdMRSA9ICc8JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJBTkdMRSA9ICc+JzsKLQotCS8qKgotCSAqIFNwZWNpZmllcyB0aGUgc3RvcCBjb25kaXRpb24sIHVwb24gd2hpY2ggdGhlIDxjb2RlPnNjYW5YWFg8L2NvZGU+Ci0JICogbWV0aG9kcyB3aWxsIGRlY2lkZSB3aGV0aGVyIHRvIGtlZXAgc2Nhbm5pbmcgb3Igbm90LiBUaGlzIGludGVyZmFjZSBtYXkKLQkgKiBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0b3BDb25kaXRpb24gewotCQkvKioKLQkJICogSW5zdHJ1Y3RzIHRoZSBzY2FubmVyIHRvIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBjaAotCQkgKiAgICAgICAgICAgIHRoZSBjaGFyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBwb3NpdGlvbgotCQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBmb3J3YXJkCi0JCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdGlvbiBkaXJlY3Rpb24KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RvcCBjb25kaXRpb24gaXMgbWV0LgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCk7Ci0KLQkJLyoqCi0JCSAqIEFza3MgdGhlIGNvbmRpdGlvbiB0byByZXR1cm4gdGhlIG5leHQgcG9zaXRpb24gdG8gcXVlcnkuIFRoZQotCQkgKiBkZWZhdWx0IGlzIHRvIHJldHVybiB0aGUgbmV4dC9wcmV2aW91cyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEByZXR1cm4gdGhlIG5leHQgcG9zaXRpb24gdG8gc2NhbgotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBmb3J3YXJkID8gcG9zaXRpb24gKyAxIDogcG9zaXRpb24gLSAxOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdXBvbiBhIG5vbi13aGl0ZXNwYWNlIChhcyBkZWZpbmVkIGJ5Ci0JICoge0BsaW5rIENoYXJhY3RlciNpc1doaXRlc3BhY2UoY2hhcil9KSBjaGFyYWN0ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uV2hpdGVzcGFjZSBleHRlbmRzIFN0b3BDb25kaXRpb24gewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBzZWUgTm9uV2hpdGVzcGFjZQotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgTm9uV2hpdGVzcGFjZURlZmF1bHRQYXJ0aXRpb24gZXh0ZW5kcyBOb25XaGl0ZXNwYWNlIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBzdXBlci5zdG9wKGNoLCBwb3NpdGlvbiwgdHJ1ZSkgJiYgaXNEZWZhdWx0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNuZXh0UG9zaXRpb24oaW50LAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHRQb3NpdGlvbihpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpCi0JCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0KLQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJaW50IGVuZCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocG9zaXRpb24gPCBlbmQpCi0JCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFydGl0aW9uLmdldE9mZnNldCgpOwotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIG9mZnNldCAtIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24tamF2YSBpZGVudGlmaWVyIChhcyBkZWZpbmVkIGJ5Ci0JICoge0BsaW5rIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyUGFydChjaGFyKX0pIGNoYXJhY3Rlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25KYXZhSWRlbnRpZmllclBhcnQgZXh0ZW5kcyBTdG9wQ29uZGl0aW9uIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24tamF2YSBpZGVudGlmaWVyIGNoYXJhY3RlciBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHNlZSBOb25KYXZhSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE5vbkphdmFJZGVudGlmaWVyUGFydERlZmF1bHRQYXJ0aXRpb24gZXh0ZW5kcyBOb25KYXZhSWRlbnRpZmllclBhcnQgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuIHN1cGVyLnN0b3AoY2gsIHBvc2l0aW9uLCB0cnVlKSB8fCAhaXNEZWZhdWx0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNuZXh0UG9zaXRpb24oaW50LAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHRQb3NpdGlvbihpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpCi0JCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0KLQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJaW50IGVuZCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocG9zaXRpb24gPCBlbmQpCi0JCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFydGl0aW9uLmdldE9mZnNldCgpOwotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIG9mZnNldCAtIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4KLQkgKiBjaGFyYWN0ZXIgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENoYXJhY3Rlck1hdGNoIGV4dGVuZHMgU3RvcENvbmRpdGlvbiB7Ci0JCXByaXZhdGUgZmluYWwgY2hhcltdIGZDaGFyczsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICogCi0JCSAqIEBwYXJhbSBjaAotCQkgKiAgICAgICAgICAgIHRoZSBzaW5nbGUgY2hhcmFjdGVyIHRvIG1hdGNoCi0JCSAqLwotCQlwdWJsaWMgQ2hhcmFjdGVyTWF0Y2goY2hhciBjaCkgewotCQkJdGhpcyhuZXcgY2hhcltde2NofSk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICogCi0JCSAqIEBwYXJhbSBjaGFycwotCQkgKiAgICAgICAgICAgIHRoZSBjaGFycyB0byBtYXRjaC4KLQkJICovCi0JCXB1YmxpYyBDaGFyYWN0ZXJNYXRjaChjaGFyW10gY2hhcnMpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoY2hhcnMpOwotCQkJQXNzZXJ0LmlzVHJ1ZShjaGFycy5sZW5ndGggPiAwKTsKLQkJCWZDaGFycyA9IGNoYXJzOwotCQkJQXJyYXlzLnNvcnQoY2hhcnMpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhciwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gQXJyYXlzLmJpbmFyeVNlYXJjaChmQ2hhcnMsIGNoKSA+PSAwICYmIGlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jbmV4dFBvc2l0aW9uKGludCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCi0JCQlpZiAoZm9yd2FyZCkgewotCQkJCWludCBlbmQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQotCQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIGRvY3VtZW50IGJlaW5nIHNjYW5uZWQuICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKiBUaGUgcGFydGl0aW9uaW5nIGJlaW5nIHVzZWQgZm9yIHNjYW5uaW5nLiAqLwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmc7Ci0JLyoqIFRoZSBwYXJ0aXRpb24gdG8gc2NhbiBpbi4gKi8KLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uOwotCi0JLyogaW50ZXJuYWwgc2NhbiBzdGF0ZSAqLwotCi0JLyoqIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgY2hhcmFjdGVyLiAqLwotCXByaXZhdGUgY2hhciBmQ2hhcjsKLQkvKiogdGhlIG1vc3QgcmVjZW50bHkgcmVhZCBwb3NpdGlvbi4gKi8KLQlwcml2YXRlIGludCBmUG9zOwotCi0JLyogcHJlc2V0IHN0b3AgY29uZGl0aW9ucyAqLwotCXByaXZhdGUgZmluYWwgU3RvcENvbmRpdGlvbiBmTm9uV1NEZWZhdWx0UGFydCA9IG5ldyBOb25XaGl0ZXNwYWNlRGVmYXVsdFBhcnRpdGlvbigpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0b3BDb25kaXRpb24gZk5vbldTID0gbmV3IE5vbldoaXRlc3BhY2UoKTsKLQlwcml2YXRlIGZpbmFsIFN0b3BDb25kaXRpb24gZk5vbklkZW50ID0gbmV3IE5vbkphdmFJZGVudGlmaWVyUGFydERlZmF1bHRQYXJ0aXRpb24oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdG8gc2NhbgotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb25pbmcgdG8gdXNlIGZvciBzY2FubmluZwotCSAqIEBwYXJhbSBwYXJ0aXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdG8gc2NhbiBpbgotCSAqLwotCXB1YmxpYyBKYXZhSGV1cmlzdGljU2Nhbm5lcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwYXJ0aXRpb25pbmcsIFN0cmluZyBwYXJ0aXRpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFydGl0aW9uaW5nKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChwYXJ0aXRpb24pOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZlBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJZlBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscwotCSAqIDxjb2RlPnRoaXMoZG9jdW1lbnQsIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORywgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdG8gc2Nhbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUhldXJpc3RpY1NjYW5uZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoZG9jdW1lbnQsIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORywgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBpbnRlcm5hbCBzY2FuIHBvc2l0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGludGVybmFsIHNjYW4gcG9zaXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZQb3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBpbiBmb3J3YXJkIGRpcmVjdGlvbiwgc3RhcnRpbmcgYXQKLQkgKiA8Y29kZT5zdGFydDwvY29kZT4sIGFuZCBub3QgZXh0ZW5kaW5nIGZ1cnRoZXIgdGhhbgotCSAqIDxjb2RlPmJvdW5kPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkCi0JICogaW4ge0BsaW5rIFN5bWJvbHN9LiBBZnRlciBhIGNhbGwsIHtAbGluayAjZ2V0UG9zaXRpb24oKX0gd2lsbCByZXR1cm4KLQkgKiB0aGUgcG9zaXRpb24ganVzdCBhZnRlciB0aGUgc2Nhbm5lZCB0b2tlbiAoaS5lLiB0aGUgbmV4dCBwb3NpdGlvbiB0aGF0Ci0JICogd2lsbCBiZSBzY2FubmVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IHRvIGNvbnNpZGVyCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gbm90IHRvIGNvbnNpZGVyIGFueSBtb3JlCi0JICogQHJldHVybiBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFN5bWJvbHN9IGRlc2NyaWJpbmcgdGhlIG5leHQgdG9rZW4KLQkgKi8KLQlwdWJsaWMgaW50IG5leHRUb2tlbihpbnQgc3RhcnQsIGludCBib3VuZCkgewotCQlpbnQgcG9zID0gc2NhbkZvcndhcmQoc3RhcnQsIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7Ci0JCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJcmV0dXJuIFRva2VuRU9GOwotCi0JCWZQb3MrKzsKLQotCQlzd2l0Y2ggKGZDaGFyKSB7Ci0JCQljYXNlIExCUkFDRSA6Ci0JCQkJcmV0dXJuIFRva2VuTEJSQUNFOwotCQkJY2FzZSBSQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlblJCUkFDRTsKLQkJCWNhc2UgTEJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDS0VUOwotCQkJY2FzZSBSQlJBQ0tFVCA6Ci0JCQkJcmV0dXJuIFRva2VuUkJSQUNLRVQ7Ci0JCQljYXNlIExQQVJFTiA6Ci0JCQkJcmV0dXJuIFRva2VuTFBBUkVOOwotCQkJY2FzZSBSUEFSRU4gOgotCQkJCXJldHVybiBUb2tlblJQQVJFTjsKLQkJCWNhc2UgU0VNSUNPTE9OIDoKLQkJCQlyZXR1cm4gVG9rZW5TRU1JQ09MT047Ci0JCQljYXNlIENPTU1BIDoKLQkJCQlyZXR1cm4gVG9rZW5DT01NQTsKLQkJCWNhc2UgUVVFU1RJT05NQVJLIDoKLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7Ci0JCQljYXNlIEVRVUFMIDoKLQkJCQlyZXR1cm4gVG9rZW5FUVVBTDsKLQkJCWNhc2UgTEFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5MRVNTVEhBTjsKLQkJCWNhc2UgUkFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsKLQkJfQotCi0JCS8vIGVsc2UKLQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChmQ2hhcikpIHsKLQkJCS8vIGFzc3VtZSBhbiBpZGVudCBvciBrZXl3b3JkCi0JCQlpbnQgZnJvbSA9IHBvcywgdG87Ci0JCQlwb3MgPSBzY2FuRm9yd2FyZChwb3MgKyAxLCBib3VuZCwgZk5vbklkZW50KTsKLQkJCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJCXRvID0gYm91bmQgPT0gVU5CT1VORCA/IGZEb2N1bWVudC5nZXRMZW5ndGgoKSA6IGJvdW5kOwotCQkJZWxzZQotCQkJCXRvID0gcG9zOwotCi0JCQlTdHJpbmcgaWRlbnRPcktleXdvcmQ7Ci0JCQl0cnkgewotCQkJCWlkZW50T3JLZXl3b3JkID0gZkRvY3VtZW50LmdldChmcm9tLCB0byAtIGZyb20pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gVG9rZW5FT0Y7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRUb2tlbihpZGVudE9yS2V5d29yZCk7Ci0KLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gb3BlcmF0b3JzLCBudW1iZXIgbGl0ZXJhbHMgZXRjCi0JCQlyZXR1cm4gVG9rZW5PVEhFUjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gYmFja3dhcmQgZGlyZWN0aW9uLCBzdGFydGluZyBhdAotCSAqIDxjb2RlPnN0YXJ0PC9jb2RlPiwgYW5kIG5vdCBleHRlbmRpbmcgZnVydGhlciB0aGFuCi0JICogPGNvZGU+Ym91bmQ8L2NvZGU+LiBUaGUgcmV0dXJuIHZhbHVlIGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQKLQkgKiBpbiB7QGxpbmsgU3ltYm9sc30uIEFmdGVyIGEgY2FsbCwge0BsaW5rICNnZXRQb3NpdGlvbigpfSB3aWxsIHJldHVybgotCSAqIHRoZSBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgc2Nhbm5lZCB0b2tlbiBzdGFydHMgKGkuZS4gdGhlIG5leHQKLQkgKiBwb3NpdGlvbiB0aGF0IHdpbGwgYmUgc2Nhbm5lZCkuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCB0byBjb25zaWRlcgotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIG5vdCB0byBjb25zaWRlciBhbnkgbW9yZQotCSAqIEByZXR1cm4gYSBjb25zdGFudCBmcm9tIHtAbGluayBTeW1ib2xzfSBkZXNjcmliaW5nIHRoZSBwcmV2aW91cyB0b2tlbgotCSAqLwotCXB1YmxpYyBpbnQgcHJldmlvdXNUb2tlbihpbnQgc3RhcnQsIGludCBib3VuZCkgewotCQlpbnQgcG9zID0gc2NhbkJhY2t3YXJkKHN0YXJ0LCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCQlpZiAocG9zID09IE5PVF9GT1VORCkKLQkJCXJldHVybiBUb2tlbkVPRjsKLQotCQlmUG9zLS07Ci0KLQkJc3dpdGNoIChmQ2hhcikgewotCQkJY2FzZSBMQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDRTsKLQkJCWNhc2UgUkJSQUNFIDoKLQkJCQlyZXR1cm4gVG9rZW5SQlJBQ0U7Ci0JCQljYXNlIExCUkFDS0VUIDoKLQkJCQlyZXR1cm4gVG9rZW5MQlJBQ0tFVDsKLQkJCWNhc2UgUkJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlblJCUkFDS0VUOwotCQkJY2FzZSBMUEFSRU4gOgotCQkJCXJldHVybiBUb2tlbkxQQVJFTjsKLQkJCWNhc2UgUlBBUkVOIDoKLQkJCQlyZXR1cm4gVG9rZW5SUEFSRU47Ci0JCQljYXNlIFNFTUlDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuU0VNSUNPTE9OOwotCQkJY2FzZSBDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuQ09MT047Ci0JCQljYXNlIENPTU1BIDoKLQkJCQlyZXR1cm4gVG9rZW5DT01NQTsKLQkJCWNhc2UgUVVFU1RJT05NQVJLIDoKLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7Ci0JCQljYXNlIEVRVUFMIDoKLQkJCQlyZXR1cm4gVG9rZW5FUVVBTDsKLQkJCWNhc2UgTEFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5MRVNTVEhBTjsKLQkJCWNhc2UgUkFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsKLQkJfQotCi0JCS8vIGVsc2UKLQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChmQ2hhcikpIHsKLQkJCS8vIGFzc3VtZSBhbiBpZGVudCBvciBrZXl3b3JkCi0JCQlpbnQgZnJvbSwgdG8gPSBwb3MgKyAxOwotCQkJcG9zID0gc2NhbkJhY2t3YXJkKHBvcyAtIDEsIGJvdW5kLCBmTm9uSWRlbnQpOwotCQkJaWYgKHBvcyA9PSBOT1RfRk9VTkQpCi0JCQkJZnJvbSA9IGJvdW5kID09IFVOQk9VTkQgPyAwIDogYm91bmQgKyAxOwotCQkJZWxzZQotCQkJCWZyb20gPSBwb3MgKyAxOwotCi0JCQlTdHJpbmcgaWRlbnRPcktleXdvcmQ7Ci0JCQl0cnkgewotCQkJCWlkZW50T3JLZXl3b3JkID0gZkRvY3VtZW50LmdldChmcm9tLCB0byAtIGZyb20pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gVG9rZW5FT0Y7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRUb2tlbihpZGVudE9yS2V5d29yZCk7Ci0KLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gb3BlcmF0b3JzLCBudW1iZXIgbGl0ZXJhbHMgZXRjCi0JCQlyZXR1cm4gVG9rZW5PVEhFUjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvbmUgb2YgdGhlIGtleXdvcmQgY29uc3RhbnRzIG9yIDxjb2RlPlRva2VuSURFTlQ8L2NvZGU+IGZvciBhCi0JICogc2Nhbm5lZCBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBhIHNjYW5uZWQgaWRlbnRpZmllcgotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB7QGxpbmsgU3ltYm9sc30KLQkgKi8KLQlwcml2YXRlIGludCBnZXRUb2tlbihTdHJpbmcgcykgewotCQlBc3NlcnQuaXNOb3ROdWxsKHMpOwotCi0JCXN3aXRjaCAocy5sZW5ndGgoKSkgewotCQkJY2FzZSAyIDoKLQkJCQlpZiAoImlmIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuSUY7Ci0JCQkJaWYgKCJkbyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkRPOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQlpZiAoImZvciIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkZPUjsKLQkJCQlpZiAoInRyeSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblRSWTsKLQkJCQlpZiAoIm5ldyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbk5FVzsKLQkJCQlicmVhazsKLQkJCWNhc2UgNCA6Ci0JCQkJaWYgKCJjYXNlIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0FTRTsKLQkJCQlpZiAoImVsc2UiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5FTFNFOwotCQkJCWlmICgiZW51bSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkVOVU07Ci0JCQkJaWYgKCJnb3RvIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuR09UTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgNSA6Ci0JCQkJaWYgKCJicmVhayIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkJSRUFLOwotCQkJCWlmICgiY2F0Y2giLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5DQVRDSDsKLQkJCQlpZiAoImNsYXNzIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0xBU1M7Ci0JCQkJaWYgKCJ3aGlsZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbldISUxFOwotCQkJCWJyZWFrOwotCQkJY2FzZSA2IDoKLQkJCQlpZiAoInJldHVybiIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblJFVFVSTjsKLQkJCQlpZiAoInN0YXRpYyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNUQVRJQzsKLQkJCQlpZiAoInN3aXRjaCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNXSVRDSDsKLQkJCQlicmVhazsKLQkJCWNhc2UgNyA6Ci0JCQkJaWYgKCJkZWZhdWx0Ii5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuREVGQVVMVDsKLQkJCQlpZiAoImZpbmFsbHkiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5GSU5BTExZOwotCQkJCWJyZWFrOwotCQkJY2FzZSA5IDoKLQkJCQlpZiAoImludGVyZmFjZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbklOVEVSRkFDRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTIgOgotCQkJCWlmICgic3luY2hyb25pemVkIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuU1lOQ0hST05JWkVEOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBUb2tlbklERU5UOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChmb3J3YXJkIHNlYXJjaCkuCi0JICogQW55IHNjb3BlcyBpbnRyb2R1Y2VkIGJ5IG9wZW5pbmcgcGVlcnMgYXJlIHNraXBwZWQuIEFsbCBwZWVycyBhY2NvdW50ZWQKLQkgKiBmb3IgbXVzdCByZXNpZGUgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCA8Y29kZT5zdGFydDwvY29kZT4gbXVzdCBub3QgcG9pbnQgdG8gdGhlIG9wZW5pbmcgcGVlciwgYnV0Ci0JICogdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBiZWluZyBzZWFyY2hlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24KLQkgKiBAcGFyYW0gb3BlbmluZ1BlZXIKLQkgKiAgICAgICAgICAgIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd7JykKLQkgKiBAcGFyYW0gY2xvc2luZ1BlZXIKLQkgKiAgICAgICAgICAgIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd9JykKLQkgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBwZWVyIGNoYXJhY3RlciBwb3NpdGlvbiwgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZmluZENsb3NpbmdQZWVyKGludCBzdGFydCwgZmluYWwgY2hhciBvcGVuaW5nUGVlciwgZmluYWwgY2hhciBjbG9zaW5nUGVlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZEb2N1bWVudCk7Ci0JCUFzc2VydC5pc1RydWUoc3RhcnQgPj0gMCk7Ci0KLQkJdHJ5IHsKLQkJCWludCBkZXB0aCA9IDE7Ci0JCQlzdGFydCAtPSAxOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlzdGFydCA9IHNjYW5Gb3J3YXJkKHN0YXJ0ICsgMSwgVU5CT1VORCwgbmV3IENoYXJhY3Rlck1hdGNoKG5ldyBjaGFyW117b3BlbmluZ1BlZXIsIGNsb3NpbmdQZWVyfSkpOwotCQkJCWlmIChzdGFydCA9PSBOT1RfRk9VTkQpCi0JCQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0KLQkJCQlpZiAoZkRvY3VtZW50LmdldENoYXIoc3RhcnQpID09IG9wZW5pbmdQZWVyKQotCQkJCQlkZXB0aCsrOwotCQkJCWVsc2UKLQkJCQkJZGVwdGgtLTsKLQotCQkJCWlmIChkZXB0aCA9PSAwKQotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIE5PVF9GT1VORDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChiYWNrd2FyZCBzZWFyY2gpLgotCSAqIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBjbG9zaW5nIHBlZXJzIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkCi0JICogZm9yIG11c3QgcmVzaWRlIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+IG11c3Qgbm90IHBvaW50IHRvIHRoZSBjbG9zaW5nIHBlZXIsIGJ1dAotCSAqIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAneycpCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAnfScpCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgaW50IGZpbmRPcGVuaW5nUGVlcihpbnQgc3RhcnQsIGNoYXIgb3BlbmluZ1BlZXIsIGNoYXIgY2xvc2luZ1BlZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzdGFydCA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJdHJ5IHsKLQkJCWludCBkZXB0aCA9IDE7Ci0JCQlzdGFydCArPSAxOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlzdGFydCA9IHNjYW5CYWNrd2FyZChzdGFydCAtIDEsIFVOQk9VTkQsIG5ldyBDaGFyYWN0ZXJNYXRjaChuZXcgY2hhcltde29wZW5pbmdQZWVyLCBjbG9zaW5nUGVlcn0pKTsKLQkJCQlpZiAoc3RhcnQgPT0gTk9UX0ZPVU5EKQotCQkJCQlyZXR1cm4gTk9UX0ZPVU5EOwotCi0JCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSA9PSBjbG9zaW5nUGVlcikKLQkJCQkJZGVwdGgrKzsKLQkJCQllbHNlCi0JCQkJCWRlcHRoLS07Ci0KLQkJCQlpZiAoZGVwdGggPT0gMCkKLQkJCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgc3Vycm91bmRpbmcgYmxvY2sgYXJvdW5kIDxjb2RlPm9mZnNldDwvY29kZT4uIFRoZQotCSAqIHNlYXJjaCBpcyBzdGFydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiwgaS5lLiBhbgotCSAqIG9wZW5pbmcgYnJhY2UgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZQotCSAqIHN1cnJvdW5kaW5nIGJsb2NrLCBidXQgYSBjbG9zaW5nIGJyYWNlIHdpbGwuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBmb3Igd2hpY2ggdGhlIHN1cnJvdW5kaW5nIGJsb2NrIGlzIGNvbXB1dGVkCi0JICogQHJldHVybiBhIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBzdXJyb3VuZGluZyBibG9jaywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIElSZWdpb24gZmluZFN1cnJvdW5kaW5nQmxvY2soaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgMSB8fCBvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGJlZ2luID0gZmluZE9wZW5pbmdQZWVyKG9mZnNldCAtIDEsIExCUkFDRSwgUkJSQUNFKTsKLQkJaW50IGVuZCA9IGZpbmRDbG9zaW5nUGVlcihvZmZzZXQsIExCUkFDRSwgUkJSQUNFKTsKLQkJaWYgKGJlZ2luID09IE5PVF9GT1VORCB8fCBlbmQgPT0gTk9UX0ZPVU5EKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUmVnaW9uKGJlZ2luLCBlbmQgKyAxIC0gYmVnaW4pOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0Ci0JICogcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgc21hbGxlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gWzxjb2RlPnBvc2l0aW9uPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBmaW5kTm9uV2hpdGVzcGFjZUZvcndhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5Gb3J3YXJkKHBvc2l0aW9uLCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4pLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuCi0JICogICAgICAgICBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgZmluZE5vbldoaXRlc3BhY2VGb3J3YXJkSW5BbnlQYXJ0aXRpb24oaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5Gb3J3YXJkKHBvc2l0aW9uLCBib3VuZCwgZk5vbldTKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0Ci0JICogcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaGlnaGVzdCBwb3NpdGlvbiBvZiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IGZpbmROb25XaGl0ZXNwYWNlQmFja3dhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG93ZXN0IHBvc2l0aW9uIDxjb2RlPnA8L2NvZGU+IGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4KLQkgKiBzdWNoIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+ICZsdDs9IHAgJmx0OyA8Y29kZT5ib3VuZDwvY29kZT4gYW5kCi0JICogPGNvZGU+Y29uZGl0aW9uLnN0b3AoZkRvY3VtZW50LmdldENoYXIocCksIHApPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5TdG9wQ29uZGl0aW9uPC9jb2RlPiB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIGxvd2VzdCBwb3NpdGlvbiBpbiBbPGNvZGU+c3RhcnQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Ym91bmQ8L2NvZGU+KSBmb3Igd2hpY2ggPGNvZGU+Y29uZGl0aW9uPC9jb2RlPgotCSAqICAgICAgICAgaG9sZHMsIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5Gb3J3YXJkKGludCBzdGFydCwgaW50IGJvdW5kLCBTdG9wQ29uZGl0aW9uIGNvbmRpdGlvbikgewotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0ID49IDApOwotCi0JCWlmIChib3VuZCA9PSBVTkJPVU5EKQotCQkJYm91bmQgPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZShib3VuZCA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlmUG9zID0gc3RhcnQ7Ci0JCQl3aGlsZSAoZlBvcyA8IGJvdW5kKSB7Ci0KLQkJCQlmQ2hhciA9IGZEb2N1bWVudC5nZXRDaGFyKGZQb3MpOwotCQkJCWlmIChjb25kaXRpb24uc3RvcChmQ2hhciwgZlBvcywgdHJ1ZSkpCi0JCQkJCXJldHVybiBmUG9zOwotCi0JCQkJZlBvcyA9IGNvbmRpdGlvbi5uZXh0UG9zaXRpb24oZlBvcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gTk9UX0ZPVU5EOwotCX0KLQotCi0JLyoqCi0JICogRmluZHMgdGhlIGxvd2VzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBzZWFyY2ggZm9yCi0JICogQHJldHVybiB0aGUgbG93ZXN0IHBvc2l0aW9uIG9mIDxjb2RlPmNoPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5Gb3J3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyIGNoKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaCkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhdCBsZWFzdCBvbmUgY2ggaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGFuZCB0aGUKLQkgKiBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBsb3dlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gWzxjb2RlPnBvc2l0aW9uPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhcltdIGNoYXJzKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaGFycykpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBoaWdoZXN0IHBvc2l0aW9uIDxjb2RlPnA8L2NvZGU+IGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4KLQkgKiBzdWNoIHRoYXQgPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsgPGNvZGU+cDwvY29kZT4gJmx0Oz0KLQkgKiA8Y29kZT5zdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Y29uZGl0aW9uLnN0b3AoZkRvY3VtZW50LmdldENoYXIocCksIHApPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5TdG9wQ29uZGl0aW9uPC9jb2RlPiB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBmb3Igd2hpY2ggPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBob2xkcywKLQkgKiAgICAgICAgIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgc3RhcnQsIGludCBib3VuZCwgU3RvcENvbmRpdGlvbiBjb25kaXRpb24pIHsKLQkJaWYgKGJvdW5kID09IFVOQk9VTkQpCi0JCQlib3VuZCA9IC0xOwotCi0JCUFzc2VydC5pc1RydWUoYm91bmQgPj0gLTEpOwotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0IDwgZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJZlBvcyA9IHN0YXJ0OwotCQkJd2hpbGUgKGZQb3MgPiBib3VuZCkgewotCi0JCQkJZkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zKTsKLQkJCQlpZiAoY29uZGl0aW9uLnN0b3AoZkNoYXIsIGZQb3MsIGZhbHNlKSkKLQkJCQkJcmV0dXJuIGZQb3M7Ci0KLQkJCQlmUG9zID0gY29uZGl0aW9uLm5leHRQb3NpdGlvbihmUG9zLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gTk9UX0ZPVU5EOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBoaWdoZXN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gc3VjaCB0aGF0IHRoZQotCSAqIHBvc2l0aW9uIGlzICZsdDs9IDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBhbmQgJmd0OyA8Y29kZT5ib3VuZDwvY29kZT4KLQkgKiBhbmQgPGNvZGU+ZkRvY3VtZW50LmdldENoYXIocG9zaXRpb24pID09IGNoPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYXQgbGVhc3Qgb25lIGNoIGluIDxjb2RlPmNoYXJzPC9jb2RlPiBhbmQgdGhlCi0JICogcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2Ygb25lIGVsZW1lbnQgaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT5dIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyIGNoKSB7Ci0JCXJldHVybiBzY2FuQmFja3dhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGF0IGxlYXN0IG9uZSBjaCBpbiA8Y29kZT5jaGFyczwvY29kZT4gYW5kIHRoZQotCSAqIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjaGFycwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2Ygb25lIGVsZW1lbnQgaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT5dIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyW10gY2hhcnMpIHsKLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaGFycykpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiByZXNpZGVzIGluIGEgZGVmYXVsdCAoSmF2YSkKLQkgKiBwYXJ0aXRpb24gb2YgPGNvZGU+ZkRvY3VtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgaW4gdGhlCi0JICogICAgICAgICBkZWZhdWx0IHBhcnRpdGlvbiBvZiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFBhcnRpdGlvbihpbnQgcG9zaXRpb24pIHsKLQkJQXNzZXJ0LmlzVHJ1ZShwb3NpdGlvbiA+PSAwKTsKLQkJQXNzZXJ0LmlzVHJ1ZShwb3NpdGlvbiA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZlBhcnRpdGlvbi5lcXVhbHMoVGV4dFV0aWxpdGllcy5nZXRDb250ZW50VHlwZShmRG9jdW1lbnQsIGZQYXJ0aXRpb25pbmcsIHBvc2l0aW9uLCBmYWxzZSkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gYXQgPGNvZGU+cG9zaXRpb248L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHRvIGdldCB0aGUgcGFydGl0aW9uIGZvcgotCSAqIEByZXR1cm4gdGhlIHBhcnRpdGlvbiBhdCA8Y29kZT5wb3NpdGlvbjwvY29kZT4gb3IgYSBkdW1teSB6ZXJvLWxlbmd0aAotCSAqICAgICAgICAgcGFydGl0aW9uIGlmIGFjY2Vzc2luZyB0aGUgZG9jdW1lbnQgZmFpbHMKLQkgKi8KLQlwcml2YXRlIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPj0gMCk7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPD0gZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJcmV0dXJuIFRleHRVdGlsaXRpZXMuZ2V0UGFydGl0aW9uKGZEb2N1bWVudCwgZlBhcnRpdGlvbmluZywgcG9zaXRpb24sIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbihwb3NpdGlvbiwgMCwgIl9fbm9fcGFydGl0aW9uX2F0X2FsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbGluZSBzZWVtcyB0byBiZSBhbiBvcGVuIGNvbmRpdGlvbiBub3QgZm9sbG93ZWQgYnkgYQotCSAqIGJsb2NrIChpLmUuIGFuIGlmLCB3aGlsZSwgb3IgZm9yIHN0YXRlbWVudCB3aXRoIGp1c3Qgb25lIGZvbGxvd2luZwotCSAqIHN0YXRlbWVudCwgc2VlIGV4YW1wbGUgYmVsb3cpLgotCSAqIAotCSAqIDxwcmU+Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJZG9TdHVmZigpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIDxwPgotCSAqIEFsZ29yaXRobTogaWYgdGhlIGxhc3Qgbm9uLVdTLCBub24tQ29tbWVudCBjb2RlIG9uIHRoZSBsaW5lIGlzIGFuIGlmCi0JICogKGNvbmRpdGlvbiksIHdoaWxlIChjb25kaXRpb24pLCBmb3IoIGV4cHJlc3Npb24pLCBkbywgZWxzZSwgYW5kIHRoZXJlCi0JICogaXMgbm8gc3RhdGVtZW50IGFmdGVyIHRoYXQKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgaW5zZXJ0IHBvc2l0aW9uIG9mIHRoZSBuZXcgY2hhcmFjdGVyCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgbG93ZXN0IHBvc2l0aW9uIHRvIGNvbnNpZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29kZSBpcyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBvcgotCSAqICAgICAgICAgbG9vcCB3aXRob3V0IGEgYmxvY2ssIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JyYWNlbGVzc0Jsb2NrU3RhcnQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJaWYgKHBvc2l0aW9uIDwgMSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlzd2l0Y2ggKHByZXZpb3VzVG9rZW4ocG9zaXRpb24sIGJvdW5kKSkgewotCQkJY2FzZSBUb2tlbkRPIDoKLQkJCWNhc2UgVG9rZW5FTFNFIDoKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgVG9rZW5SUEFSRU4gOgotCQkJCXBvc2l0aW9uID0gZmluZE9wZW5pbmdQZWVyKGZQb3MsIExQQVJFTiwgUlBBUkVOKTsKLQkJCQlpZiAocG9zaXRpb24gPiAwKSB7Ci0JCQkJCXN3aXRjaCAocHJldmlvdXNUb2tlbihwb3NpdGlvbiAtIDEsIGJvdW5kKSkgewotCQkJCQkJY2FzZSBUb2tlbklGIDoKLQkJCQkJCWNhc2UgVG9rZW5GT1IgOgotCQkJCQkJY2FzZSBUb2tlbldISUxFIDoKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNzY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dDsKLQotLy8gdGFrZW4gZnJvbSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotY2xhc3MgSmF2YVBhaXJNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0UG9zOwotCXByb3RlY3RlZCBpbnQgZkVuZFBvczsKLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKYXZhQ29kZVJlYWRlcigpOwotCS8qKgotCSAqIFN0b3JlcyB0aGUgc291cmNlIHZlcnNpb24gc3RhdGUuCi0JICogCi0JICogQHNlZSBFY2xpcHNlICAzLjEKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZkhpZ2hsaWdodEFuZ3VsYXJCcmFja2V0cyA9IGZhbHNlOwotCi0KLQlwdWJsaWMgSmF2YVBhaXJNYXRjaGVyKGNoYXJbXSBwYWlycykgewotCQlmUGFpcnMgPSBwYWlyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQotCQlpZihvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBtYXRjaFBhaXJzQXQoKSAmJiBmU3RhcnRQb3MgIT0gZkVuZFBvcykKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2dldEFuY2hvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBbmNob3IoKSB7Ci0JCXJldHVybiBmQW5jaG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNsZWFyKCk7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZSZWFkZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAoZlJlYWRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFBhaXJzQXQoKSB7Ci0KLQkJaW50IGk7Ci0JCWludCBwYWlySW5kZXgxID0gZlBhaXJzLmxlbmd0aDsKLQkJaW50IHBhaXJJbmRleDIgPSBmUGFpcnMubGVuZ3RoOwotCi0JCWZTdGFydFBvcyA9IC0xOwotCQlmRW5kUG9zID0gLTE7Ci0KLQkJLy8gZ2V0IHRoZSBjaGFycyBwcmVjZWRpbmcgYW5kIGZvbGxvd2luZyB0aGUgc3RhcnQgcG9zaXRpb24KLQkJdHJ5IHsKLQotCQkJY2hhciBwcmV2Q2hhciA9IGZEb2N1bWVudC5nZXRDaGFyKE1hdGgubWF4KGZPZmZzZXQgLSAxLCAwKSk7Ci0JCQkvLyBtb2RpZmllZCBiZWhhdmlvciBmb3IKLQkJCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NzkKLQkJCS8vIGNoYXIgbmV4dENoYXI9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCi0JCQkvLyBzZWFyY2ggZm9yIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMDsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCS8vIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmU3RhcnRQb3M9IGZPZmZzZXQ7Ci0JCQkJLy8gcGFpckluZGV4MT0gaTsKLQkJCQkvLyB9IGVsc2UKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZTdGFydFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgxID0gaTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLyBlbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDI9IGk7Ci0JCQkJLy8gfQotCQkJfQotCi0JCQlpZiAoZkVuZFBvcyA+IC0xKSB7Ci0JCQkJZkFuY2hvciA9IFJJR0hUOwotCQkJCWZTdGFydFBvcyA9IHNlYXJjaEZvck9wZW5pbmdQZWVyKGZFbmRQb3MsIGZQYWlyc1twYWlySW5kZXgyIC0gMV0sIGZQYWlyc1twYWlySW5kZXgyXSwgZkRvY3VtZW50KTsKLQkJCQlpZiAoZlN0YXJ0UG9zID4gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZkVuZFBvcyA9IC0xOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0YXJ0UG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gTEVGVDsKLQkJCQlmRW5kUG9zID0gc2VhcmNoRm9yQ2xvc2luZ1BlZXIoZlN0YXJ0UG9zLCBmUGFpcnNbcGFpckluZGV4MV0sIGZQYWlyc1twYWlySW5kZXgxICsgMV0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZFbmRQb3MgPiAtMSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmU3RhcnRQb3MgPSAtMTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNlYXJjaEZvckNsb3NpbmdQZWVyKGludCBvZmZzZXQsIGludCBvcGVuaW5nUGVlciwgaW50IGNsb3NpbmdQZWVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChvcGVuaW5nUGVlciA9PSAnPCcgJiYgIShmSGlnaGxpZ2h0QW5ndWxhckJyYWNrZXRzICYmIGlzVHlwZVBhcmFtZXRlckJyYWNrZXQob2Zmc2V0LCBkb2N1bWVudCkpKQotCQkJcmV0dXJuIC0xOwotCi0JCWZSZWFkZXIuY29uZmlndXJlRm9yd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0ICsgMSwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JPcGVuaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob3BlbmluZ1BlZXIgPT0gJzwnICYmICFmSGlnaGxpZ2h0QW5ndWxhckJyYWNrZXRzKQotCQkJcmV0dXJuIC0xOwotCi0JCWZSZWFkZXIuY29uZmlndXJlQmFja3dhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSmF2YUNvZGVSZWFkZXIuRU9GKSB7Ci0JCQlpZiAoYyA9PSBjbG9zaW5nUGVlciAmJiBjICE9IG9wZW5pbmdQZWVyKQotCQkJCXN0YWNrKys7Ci0JCQllbHNlIGlmIChjID09IG9wZW5pbmdQZWVyKQotCQkJCXN0YWNrLS07Ci0KLQkJCWlmIChzdGFjayA9PSAwKSB7Ci0JCQkJaWYgKGNsb3NpbmdQZWVyID09ICc+JyAmJiAhaXNUeXBlUGFyYW1ldGVyQnJhY2tldChmUmVhZGVyLmdldE9mZnNldCgpLCBkb2N1bWVudCkpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgYW5ndWxhciBicmFja2V0IGF0IDxjb2RlPm9mZnNldDwvY29kZT4gaXMgYSB0eXBlCi0JICogcGFyYW1ldGVyIGJyYWNrZXQuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgb3BlbmluZyBicmFja2V0Ci0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBicmFja2V0IGlzIHBhcnQgb2YgYSB0eXBlIHBhcmFtZXRlciwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2VlIEVjbGlwc2UgIDMuMQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXJCcmFja2V0KGludCBvZmZzZXQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvKgotCQkgKiB0eXBlIHBhcmFtZXRlciBjb21lIGFmdGVyIGJyYWNlcyAoY2xvc2luZyBvciBvcGVuaW5nKSwgc2VtaWNvbG9ucywKLQkJICogb3IgYWZ0ZXIgYSBUeXBlIG5hbWUgKGhldXJpc3RpYzogc3RhcnRzIHdpdGggY2FwaXRhbCBjaGFyYWN0ZXIsIG9yCi0JCSAqIGFmdGVyIGEgbW9kaWZpZXIga2V5d29yZCBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbiAodmlzaWJpbGl0eSwKLQkJICogc3RhdGljLCBzeW5jaHJvbml6ZWQsIGZpbmFsKQotCQkgKi8KLQotCQl0cnkgewotCQkJSVJlZ2lvbiBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KTsKLQotCQkJSmF2YUhldXJpc3RpY1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBKYXZhSGV1cmlzdGljU2Nhbm5lcihkb2N1bWVudCk7Ci0JCQlpbnQgcHJldlRva2VuID0gc2Nhbm5lci5wcmV2aW91c1Rva2VuKG9mZnNldCAtIDEsIGxpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJaW50IHByZXZUb2tlbk9mZnNldCA9IHNjYW5uZXIuZ2V0UG9zaXRpb24oKSArIDE7Ci0JCQlTdHJpbmcgcHJldmlvdXMgPSBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRiA/IG51bGwgOiBkb2N1bWVudC5nZXQocHJldlRva2VuT2Zmc2V0LCBvZmZzZXQgLSBwcmV2VG9rZW5PZmZzZXQpLnRyaW0oKTsKLQotCQkJaWYgKHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuTEJSQUNFIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuUkJSQUNFIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU0VNSUNPTE9OIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1lOQ0hST05JWkVEIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1RBVElDIHx8IChwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UICYmIGlzVHlwZVBhcmFtZXRlckludHJvZHVjZXIocHJldmlvdXMpKSB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+aWRlbnRpZmllcjwvY29kZT4gaXMgYW4KLQkgKiBpZGVudGlmaWVyIHRoYXQgY291bGQgY29tZSByaWdodCBiZWZvcmUgYSB0eXBlIHBhcmFtZXRlciBsaXN0LiBJdCB1c2VzCi0JICogYSBoZXVyaXN0aWM6IGlmIHRoZSBpZGVudGlmaWVyIHN0YXJ0cyB3aXRoIGFuIHVwcGVyIGNhc2UsIGl0IGlzIGFzc3VtZWQKLQkgKiBhIHR5cGUgbmFtZS4gQWxzbywgaWYgPGNvZGU+aWRlbnRpZmllcjwvY29kZT4gaXMgYSBtZXRob2QgbW9kaWZpZXIsCi0JICogaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBhbmd1bGFyIGJyYWNrZXQgaXMgcGFydCBvZiB0aGUgZ2VuZXJpYyB0eXBlCi0JICogcGFyYW1ldGVyIG9mIGEgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGlkZW50aWZpZXIgY291bGQgaW50cm9kdWNlIGEgdHlwZQotCSAqICAgICAgICAgcGFyYW1ldGVyIGxpc3QKLQkgKiBAc2VlIEVjbGlwc2UgIDMuMQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXJJbnRyb2R1Y2VyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLmxlbmd0aCgpID4gMCAmJiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGlkZW50aWZpZXIuY2hhckF0KDApKSB8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoImZpbmFsIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInB1YmxpYyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwdWJsaWMiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHJvdGVjdGVkIikgLy8kTk9OLU5MUy0xJAotCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInByaXZhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L1N5bWJvbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvU3ltYm9scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODg2MTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvU3ltYm9scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotLyoqCi0gKiBTeW1ib2xzIGZvciB0aGUgaGV1cmlzdGljIGphdmEgc2Nhbm5lci4KLSAqIAotICogQHNlZSBFY2xpcHNlIDMuMAotICovCi1pbnRlcmZhY2UgU3ltYm9scyB7Ci0JaW50IFRva2VuRU9GID0gLTE7Ci0JaW50IFRva2VuTEJSQUNFID0gMTsKLQlpbnQgVG9rZW5SQlJBQ0UgPSAyOwotCWludCBUb2tlbkxCUkFDS0VUID0gMzsKLQlpbnQgVG9rZW5SQlJBQ0tFVCA9IDQ7Ci0JaW50IFRva2VuTFBBUkVOID0gNTsKLQlpbnQgVG9rZW5SUEFSRU4gPSA2OwotCWludCBUb2tlblNFTUlDT0xPTiA9IDc7Ci0JaW50IFRva2VuT1RIRVIgPSA4OwotCWludCBUb2tlbkNPTE9OID0gOTsKLQlpbnQgVG9rZW5RVUVTVElPTk1BUksgPSAxMDsKLQlpbnQgVG9rZW5DT01NQSA9IDExOwotCWludCBUb2tlbkVRVUFMID0gMTI7Ci0JaW50IFRva2VuTEVTU1RIQU4gPSAxMzsKLQlpbnQgVG9rZW5HUkVBVEVSVEhBTiA9IDE0OwotCWludCBUb2tlbklGID0gMTA5OwotCWludCBUb2tlbkRPID0gMTAxMDsKLQlpbnQgVG9rZW5GT1IgPSAxMDExOwotCWludCBUb2tlblRSWSA9IDEwMTI7Ci0JaW50IFRva2VuQ0FTRSA9IDEwMTM7Ci0JaW50IFRva2VuRUxTRSA9IDEwMTQ7Ci0JaW50IFRva2VuQlJFQUsgPSAxMDE1OwotCWludCBUb2tlbkNBVENIID0gMTAxNjsKLQlpbnQgVG9rZW5XSElMRSA9IDEwMTc7Ci0JaW50IFRva2VuUkVUVVJOID0gMTAxODsKLQlpbnQgVG9rZW5TVEFUSUMgPSAxMDE5OwotCWludCBUb2tlblNXSVRDSCA9IDEwMjA7Ci0JaW50IFRva2VuRklOQUxMWSA9IDEwMjE7Ci0JaW50IFRva2VuU1lOQ0hST05JWkVEID0gMTAyMjsKLQlpbnQgVG9rZW5HT1RPID0gMTAyMzsKLQlpbnQgVG9rZW5ERUZBVUxUID0gMTAyNDsKLQlpbnQgVG9rZW5ORVcgPSAxMDI1OwotCWludCBUb2tlbkNMQVNTID0gMTAyNjsKLQlpbnQgVG9rZW5JTlRFUkZBQ0UgPSAxMDI3OwotCWludCBUb2tlbkVOVU0gPSAxMDI4OwotCWludCBUb2tlbklERU5UID0gMjAwMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MRmlsZVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MRmlsZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0MTc4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTEZpbGVXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLWNsYXNzIE5ld0hUTUxGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQkKLQlwdWJsaWMgTmV3SFRNTEZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotICAgIH0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IHRoZSBzZWxlY3RlZCBmb2xkZXIgdG8gd2ViIGNvbnRlbnRzIAotCSAqIGZvbGRlciBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgb3V0c2lkZSB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlci4gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotCQlzdXBlci5pbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKTsKLQkJCi0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQotCQlpZiAod2ViQ29udGVudFBhdGggIT0gbnVsbCAmJiAhd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCXNldENvbnRhaW5lckZ1bGxQYXRoKHdlYkNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBzcGVjaWZpYyB0byAKLQkgKiBodG1sIGZpbGVzLiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCi0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKEhUTUxVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9IVE1MLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkvLyBleHRlbnNpb24gZG9lc24ndCBlcXVhbCBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cwotCQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSBmdWxsUGF0aC5hcHBlbmQobmV3RmlsZU5hbWUpOwotCi0JCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpIHsKLQkJCQkJLy8gcGF0aCBpbnZhbGlkCi0JCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEhUTUxVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGdldCB0aGUgSVByb2plY3QgZm9yIHRoZSBzZWxlY3Rpb24gcGF0aAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCQkvLyBpZiBpbnNpZGUgd2ViIHByb2plY3QsIGNoZWNrIGlmIGluc2lkZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBpc1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkvLyBjaGVjayB0aGF0IHRoZSBwYXRoIGlzIGluc2lkZSB0aGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkJCWlmICghd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCQkJc2V0TWVzc2FnZShIVE1MVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgSFRNTCBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggd2hpY2ggcHJvamVjdCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQcm9qZWN0IG9iamVjdC4gSWYgcGF0aCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgcmV0dXJuIHZhbHVlIAotCSAqIAkJICAgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4gCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVBhdGgoSVBhdGggcGF0aCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAod29ya3NwYWNlLnZhbGlkYXRlUGF0aChwYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5QUk9KRUNUKS5pc09LKCkpIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBhIHdlYiBwcm9qZWN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHRvIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2plY3QgaXMgd2ViIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQkKLQkJaWYgKGZhY2V0ZWQgIT0gbnVsbCAmJiAKLQkJCShmYWNldGVkLmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSkpIHx8IAotCQkJIGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHdoaWNoIHdlYiBjb250ZW50cyBwYXRoIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVBhdGggb2YgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIKLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCQotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGlzV2ViUHJvamVjdChwcm9qZWN0KSkgewkJCQotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlwYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViNjFkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgSFRNTCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsaW5rLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgdGhhdCBkaXNwbGF5cyB0ZW1wbGF0ZXMKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoaW5uZXJQYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTApOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5IVE1MX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXNldENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCBjb25maWd1cmVzIGFuZCByZXR1cm5zIGEgc291cmNlIHZpZXdlciB0byBwcmVzZW50IHRoZSB0ZW1wbGF0ZQotCSAqIHBhdHRlcm4gb24gdGhlIHByZWZlcmVuY2UgcGFnZS4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhCi0JICogY3VzdG9tIHNvdXJjZSB2aWV3ZXIgZmVhdHVyaW5nIGUuZy4gc3ludGF4IGNvbG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gYSBjb25maWd1cmVkIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGh0bWwiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgSFRNTCBGaWxlIHdpemFyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBIVE1MIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1NzQxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgTmV3SFRNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCQotCXByaXZhdGUgTmV3SFRNTEZpbGVXaXphcmRQYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0hUTUxGaWxlV2l6YXJkUGFnZSgiSFRNTFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UiLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGZTZWxlY3Rpb24pKSk7IC8vJE5PTi1OTFMtMSQKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKEhUTUxVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0hFQURJTkcpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9ORVdIVE1MRklMRSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBIVE1MIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTQyMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkhUTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmUuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIG91dGxpbmUgdmlldyBwYWdlIHdoaWNoIHNob3dzIEhUTUwgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTm9kZUFjdGlvbk1hbmFnZXIgY3JlYXRlTm9kZUFjdGlvbk1hbmFnZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyKChJU3RydWN0dXJlZE1vZGVsKSB0cmVlVmlld2VyLmdldElucHV0KCksIHRyZWVWaWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2FiNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLmNvbW1lbnQubmFtZT1jb21tZW50Ci1UZW1wbGF0ZXMuY29tbWVudC5kZXNjPWNvbW1lbnQKLVRlbXBsYXRlcy51bC5uYW1lPXVsCi1UZW1wbGF0ZXMudWwuZGVzYz11bm9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLnVsLmNvbnRlbnQ9PHVsPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvdWw+XG4KLVRlbXBsYXRlcy5kbC5uYW1lPWRsCi1UZW1wbGF0ZXMuZGwuZGVzYz1kZWZpbml0aW9uIGxpc3QKLVRlbXBsYXRlcy5kbC5jb250ZW50PTxkbD5cbiAgPGR0PiBGaXJzdCBkZWZpbml0aW9uPC9kdD4gIDxkZD4gIEZpcnN0IGV4cGxhbmF0aW9uPC9kZD5cbiAgPGR0PiBTZWNvbmQgZGVmaW5pdGlvbjwvZHQ+IDxkZD4gU2Vjb25kIGV4cGxhbmF0aW9uPC9kZD5cbjwvZGw+XG4KLVRlbXBsYXRlcy50YWJsZS5uYW1lPXRhYmxlCi1UZW1wbGF0ZXMudGFibGUuZGVzYz10YWJsZQotVGVtcGxhdGVzLnRhYmxlLmNvbnRlbnQ9PHRhYmxlPlxuICA8dHI+XG4gICAgPHRoPkNvbHVtbiAxIEhlYWRpbmc8L3RoPlxuICAgIDx0aD5Db2x1bW4gMiBIZWFkaW5nPC90aD5cbiAgPC90cj5cbiAgPHRyPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDE8L3RkPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDI8L3RkPlxuICA8L3RyPlxuPC90YWJsZT5cbgotVGVtcGxhdGVzLm9sLm5hbWU9b2wKLVRlbXBsYXRlcy5vbC5kZXNjPW9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLm9sLmNvbnRlbnQ9PG9sPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvb2w+XG4KLVRlbXBsYXRlcy5odG1sLm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSB0cmFuc2l0aW9uYWwpCi1UZW1wbGF0ZXMuaHRtbC5kZXNjPWh0bWwgNC4wMSB0cmFuc2l0aW9uYWwKLVRlbXBsYXRlcy5odG1sLmNvbnRlbnQ9PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMuaHRtbGZyYW1lc2V0Lm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSBmcmFtZXNldCkKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuZGVzYz1odG1sIDQuMDEgZnJhbWVzZXQKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuY29udGVudD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48ZnJhbWVzZXQ+XG4gICAgPGZyYW1lPlxuICAgIDxmcmFtZT5cbiAgICA8bm9mcmFtZXM+XG4gICAgPGJvZHk+XG4gICAgPHA+VGhpcyBwYWdlIHVzZXMgZnJhbWVzLiBUaGUgY3VycmVudCBicm93c2VyIHlvdSBhcmUgdXNpbmcgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMuPC9wPlxuICAgIDwvYm9keT5cbiAgICA8L25vZnJhbWVzPlxuPC9mcmFtZXNldD5cbjwvaHRtbD4KLVRlbXBsYXRlcy54aHRtbC5uYW1lPU5ldyBYSFRNTCBGaWxlICgxLjAgdHJhbnNpdGlvbmFsKQotVGVtcGxhdGVzLnhodG1sLmRlc2M9eGh0bWwgMS4wIHRyYW5zaXRpb25hbAotVGVtcGxhdGVzLnhodG1sLmNvbnRlbnQ9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+XG48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+XG48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAvPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5uYW1lPU5ldyBYSFRNTCBGaWxlICgxLjAgZnJhbWVzZXQpCi1UZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5kZXNjPXhodG1sIDEuMCBmcmFtZXNldAotVGVtcGxhdGVzLnhodG1sZnJhbWVzZXQuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCI+XG48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAvPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxmcmFtZXNldD5cbiAgICA8ZnJhbWUgLz5cbiAgICA8ZnJhbWUgLz5cbiAgICA8bm9mcmFtZXM+XG4gICAgPGJvZHk+XG4gICAgPHA+VGhpcyBwYWdlIHVzZXMgZnJhbWVzLiBUaGUgY3VycmVudCBicm93c2VyIHlvdSBhcmUgdXNpbmcgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMuPC9wPlxuICAgIDwvYm9keT5cbiAgICA8L25vZnJhbWVzPlxuPC9mcmFtZXNldD5cbjwvaHRtbD4KLVRlbXBsYXRlcy5zY3JpcHQubmFtZT1zY3JpcHQKLVRlbXBsYXRlcy5zY3JpcHQuZGVzYz1zY3JpcHQgICAgIChjb21tZW50ZWQpCi1UZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ9PHNjcmlwdCB0eXBlPVwiJHtjdXJzb3J9dGV4dC9qYXZhc2NyaXB0XCI+XG48IS0tXG5cbi8vLS0+XG48L3NjcmlwdD4KLVRlbXBsYXRlcy5zdHlsZS5uYW1lPXN0eWxlCi1UZW1wbGF0ZXMuc3R5bGUuZGVzYz1zdHlsZSAgICAgKGNvbW1lbnRlZCkKLVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PTxzdHlsZT5cbjwhLS1cbiR7Y3Vyc29yfVxuLS0+XG48L3N0eWxlPgotVGVtcGxhdGVzLmltZ21hcC5uYW1lPWltZwotVGVtcGxhdGVzLmltZ21hcC5kZXNjPWltZyAgICAgKG1hcCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxODMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZW1wbGF0ZXM+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmNvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuY29tbWVudC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmNvbW1lbnQiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7IS0tICR7Y3Vyc29yfSAtLSZndDs8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5pbWdtYXAubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaW1nbWFwLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaW1nbWFwIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+Jmx0O2ltZyBpc21hcCZndDs8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy51bC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy51bC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnVsIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy51bC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuZGwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuZGwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5kbCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuZGwuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnRhYmxlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnRhYmxlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMudGFibGUiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnRhYmxlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5vbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5vbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLm9sIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5vbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuaHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5odG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaHRtbCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuaHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmh0bWxmcmFtZXNldC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmh0bWxmcmFtZXNldCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54aHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnhodG1sIiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy54aHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMueGh0bWxmcmFtZXNldCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuc2NyaXB0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnNjcmlwdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnNjcmlwdCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5zdHlsZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zdHlsZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnN0eWxlIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkOTVjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWVuY29kaW5nIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXRhc2t0YWdzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNvbnRlbnRwcm9wZXJ0aWVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEyMzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbgotbW9kZWwuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmVfMS4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi0uZmJ3YXJuaW5ncwotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzY2VlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9tL2FkYXB0ZXIvbm90aWZpY2F0aW9uL3RpbWU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZS9jcml0ZXJpYT0xMAotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRkb2N1bWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL21vZGVsbWFuYWdlbWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9saWZlY3ljbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbG9ja3M9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9tb2RlbG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2RldGVjdGlvbj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2pvYj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL292ZXJhbGx0aW1lPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvdGltZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3ByZWZlcmVuY2VzPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcmVnaXN0cnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzViMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmU1OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuY3NzOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0lJQotCi0lewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0KLQlwdWJsaWMgQ1NTSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIENTU0hlYWRUb2tlbml6ZXIKLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuCi0ldHlwZSBTdHJpbmcKLSVjaGFyCi0ldW5pY29kZQotJWlnbm9yZWNhc2UgCi0lZGVidWcKLSVzd2l0Y2gKLQotCi1VVEYxNkJFID0gXHhGRVx4RkYKLVVURjE2TEUgPSBceEZGXHhGRQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGCi0KLS8vU3BhY2VDaGFyID0gW1x4MjBceDA5XQotCi0KLQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsKLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0KLQotQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoKLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbgotCi0KLSVzdGF0ZSBTVF9YTUxEZWNsCi0lc3RhdGUgQ0hBUlNFVF9SVUxFCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUKLSVzdGF0ZSBEUV9TVFJJTkcKLSVzdGF0ZSBTUV9TVFJJTkcKLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZwotCi0lJQotCi0KLTxZWUlOSVRJQUw+ICAKLXsKLQl7VVRGMTZCRX0gICAJCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30KLQl7VVRGMTZMRX0gICAJCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30KLQl7VVRGODNCeXRlQk9NfSAgIAl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30KLQotCS8vIGZvcmNlIHRvIGJlIHN0YXJ0ZWQgb24gZmlyc3QgbGluZSwgYnV0IHdlIGRvIGFsbG93IHByZWNlZWRpbmcgc3BhY2VzCi0JXiB7U30qICI8XD94bWwiIHtTfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0KLQkKLQleIHtTfSogIkBjaGFyc2V0IiAgICAge2lmICh5eWNoYXIgPT0gMCApICB7eXliZWdpbihDSEFSU0VUX1JVTEUpOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7fX0KLQkKLQotfQkKLQotLy8gSSBkb24ndCB0aGluayB0aGVyZSdzIHJlYWxseSBhbiBYTUwgZm9ybSBvZiBDU1MgZmlsZXMgLi4uIGJ1dCB3aWxsIGxlYXZlIGhlcmUgZm9yIGNvbnNpc3RlbmN5CQotPFNUX1hNTERlY2w+IAotewotCS8vInZlcnNpb24iIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30KLQkiZW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30KLQkvLyBub3RlIHRoaXMgImZvcmNlZCBlbmQiIG9uY2UgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotCSJcPz4iICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30KLX0JCi0KLTxDSEFSU0VUX1JVTEU+IAotewotCi0Je1N9KiAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7fQotCSI7IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDt9Ci19Ci0JCi0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCVwnCQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcKLQl7U30qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9Ci0KLX0JCi0KLQotPERRX1NUUklORz4KLXsKLQotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JIj4iCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlwvPiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjsiICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0JCi0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotCVwnICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiJT4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIj4iCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlwvPiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjsiICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFVuRGVsaW1pdGVkU3RyaW5nPgotewotCi0KLQl7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkiPiIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXC8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiOyIgICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlLCBDSEFSU0VUX1JVTEU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZjMzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDQgNjo0MiBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLmNzczsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxLzI3LzA0IDY6NDIgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIENTU0hlYWRUb2tlbml6ZXIgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQ0hBUlNFVF9SVUxFID0gNDsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcMTFcMlwwXDFcMTBcMjJcMFwxXDZcMVwwXDFcMzZcMlwwIisKLSAgICAiXDFcNDFcMVwwXDFcMzdcN1wwXDFcNDBcMTNcMFwxXDM1XDFcMTJcMVw3XDFcMzQiKwotICAgICJcMVwxM1wxXDE3XDFcMjJcMVwwXDFcMjBcMVwzMVwxXDI1XDFcMFwxXDMzXDFcMjEiKwotICAgICJcMVwzMlwyXDBcMVwxNlwxXDE1XDFcMjdcMVwzMFwyXDBcMVwyM1wxXDI0XDFcMjYiKwotICAgICJcM1wwXDFcMTRcMTBcMFwxXDIyXDFcMFwxXDIwXDFcMzFcMVwyNVwxXDBcMVwzMyIrCi0gICAgIlwxXDIxXDFcMzJcMlwwXDFcMTZcMVwxNVwxXDI3XDFcMzBcMlwwXDFcMjNcMVwyNCIrCi0gICAgIlwxXDI2XDNcMFwxXDE0XDEwMlwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDAiKwotICAgICJcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSAxMDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTU4KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSA2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDsgfQotICAgICAgICBjYXNlIDY4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDcwOiBicmVhazsKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSAge3l5YmVnaW4oQ0hBUlNFVF9SVUxFKTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFO30gfQotICAgICAgICBjYXNlIDcxOiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDczOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgNzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgNzU6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IH0KLSAgICAgICAgY2FzZSA3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOyB9Ci0gICAgICAgIGNhc2UgNzc6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7IH0KLSAgICAgICAgY2FzZSA3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsgfQotICAgICAgICBjYXNlIDc5OiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDgwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyAgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDgxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDgyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDgzOiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSA4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDg1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDg2OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIENTU0hlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IENTU0hlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBDU1NIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjA2ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtkOmpka3NcajJzZGsxLjQuMV8wMlxiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFB1cmVIZWFkV29ya3NwYWNlDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9Q1NTSGVhZFRva2VuaXplcg0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1xjc3NcDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NDNjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotUmVhZGluZyAiQ1NTSGVhZFRva2VuaXplci5qZmxleCIKLUNvbnN0cnVjdGluZyBORkEgOiA0NTggc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0xMDIgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDY0IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIkNTU0hlYWRUb2tlbml6ZXIuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzkyM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5odG1sOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0lJQotCi0lewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQlib29sZWFuIGZvdW5kQ29udGVudFR5cGVWYWx1ZSA9IGZhbHNlOwotCi0KLQotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIEhUTUxIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlIAotJWRlYnVnCi0lc3dpdGNoCi0KLQotVVRGMTZCRSA9IFx4RkVceEZGCi1VVEYxNkxFID0gXHhGRlx4RkUKLVVURjgzQnl0ZUJPTSA9IFx4RUZceEJCXHhCRgotCi1TcGFjZUNoYXIgPSBbXHgyMFx4MDldCi0KLQotCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKwotUyA9IFtceDIwXHgwOVx4MERceDBBXQotCi1CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9KgotCi1MaW5lVGVybWluYXRvciA9IFxyfFxuCi0KLQotJXN0YXRlIFNUX1hNTERlY2wKLSVzdGF0ZSBTVF9NRVRBX1RBRwotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPiAgCi17Ci0Je1VURjE2QkV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9Ci0Je1VURjE2TEV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0Je1VURjgzQnl0ZUJPTX0gICAJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCV4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0JCi0JIjxNRVRBICIgICAgICAge3l5YmVnaW4oU1RfTUVUQV9UQUcpOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0O30KLQkKLQotfQkKLQkKLTxTVF9YTUxEZWNsPiAKLXsKLQkvLyJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9Ci0JImVuY29kaW5nIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGlzICJmb3JjZWQgZW5kIiBvbmNlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQKLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9Ci19CQotCi08U1RfTUVUQV9UQUc+IAotewotCi0JImh0dHAtZXF1aXYiIHtTfSogXD0ge1N9KiBcIj8gIkNvbnRlbnQtVHlwZSIgXCI/IHtTfSsgImNvbnRlbnQiIHtCZWdpbkF0dHJpYmVWYWx1ZX0gIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTt9Ci0JIj4iICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDt9Ci0JIlwvPiIgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7fQotfQotCQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19CQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCQotCSI+IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcLz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLQlcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI+IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcLz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCi0JLy8gbm90ZSB0aGlzIGluaXRpYWwgc3BlY2lhbCBjYXNlIGZvciBIVFRQIGNvbnRlbnR0eXBlIHZhbHVlcwotCSI7IntTfSoJCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQl7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkiPiIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXC8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlLCBTVF9NRVRBX1RBRz4KLXsKLS8vIHRoaXMgaXMgdGhlIGZhbGxiYWNrIChtYXRjaCAiYW55dGhpbmciKSBydWxlICAoZm9yIHRoaXMgc2Nhbm5lciwgaW5wdXQgaXMgaWdub3JlZCwgYW5kIHBvc2l0aW9uIGFkdmFuY2VkLCBpZiBub3QgcmVjb2duaXplZCkKLS58XG4gICAgICAgICAgICAgIHtpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0KLX0KLQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QKLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVjMGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDQgNjo0MSBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLmh0bWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWwuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMS8yNy8wNCA2OjQxIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVUQV9UQUcgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcMjJcMVwwXDFcNDBcMlwwIisKLSAgICAiXDFcNDRcMVwwXDFcNDNcNVwwXDFcMzRcMVwwXDFcNDJcMTNcMFwxXDQ1XDFcMTIiKwotICAgICJcMVwxMFwxXDMxXDFcMTNcMVwwXDFcMjFcMVwwXDFcMjRcMVwyNlwxXDE3XDFcMCIrCi0gICAgIlwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1XDFcMjNcMVwyNVwxXDMzXDFcMzUiKwotICAgICJcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0XDFcNDFcN1wwXDFcMjFcMVwwIisKLSAgICAiXDFcMjRcMVwyNlwxXDE3XDFcMFwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1IisKLSAgICAiXDFcMjNcMVwyNVwxXDMzXDFcMzVcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0IisKLSAgICAiXDFcNDFcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMCIrCi0gICAgIlwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsKLQotCi0KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWxpbmUgPSAwOwotCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXljaGFyID0gMDsKLQotICAJCS8qKgotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAJCSAqLwotICAJCXl5Y29sdW1uID0gMDsgCi0KLSAgCQkvKiogCi0gIAkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgCi0gIAkJICogb2YgYSBsaW5lCi0gIAkJICovCi0gIAkJeXlfYXRCT0wgPSBmYWxzZTsKLQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIAkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0gIAkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLSAgCQkKLSAgCQloYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotICAJCQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0JCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3NCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdcbic7Ci0gICAgICBpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xyJykgewotICAgICAgICB5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotICAgICAgICBpZiAoIXl5X2F0RU9GKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICBpZiAoeXlfYXRCT0wpCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gNjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X3N0YXRlID0gNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDcwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDgzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA4NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDg4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gOTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA5MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSA5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgIGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7IH0KLSAgICAgICAgY2FzZSA5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7IH0KLSAgICAgICAgY2FzZSAxMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDEwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSAxMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9IH0KLSAgICAgICAgY2FzZSAxMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVUQV9UQUcpOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0OyB9Ci0gICAgICAgIGNhc2UgMTA1OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgMTA2OiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTsgfQotICAgICAgICBjYXNlIDEwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7IH0KLSAgICAgICAgY2FzZSAxMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7IH0KLSAgICAgICAgY2FzZSAxMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsgfQotICAgICAgICBjYXNlIDExMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTEyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSAxMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTE0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDExNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDExNjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBIVE1MSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBIVE1MSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMjMyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7ZDpqZGtzXGoyc2RrMS40LjFfMDJcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xQdXJlSGVhZFdvcmtzcGFjZQ0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPUhUTUxIZWFkVG9rZW5pemVyDQotc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpY1xzcmNcDQotc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cZW5jb2RpbmdccmVzb3VyY2VcY29udGVudHNwZWNpZmljXGh0bWxcDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDY5ZTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotUmVhZGluZyAiSFRNTEhlYWRUb2tlbml6ZXIuamZsZXgiCi0KLVdhcm5pbmcgOiBNYWNybyAiU3BhY2VDaGFyIiBoYXMgYmVlbiBkZWNsYXJlZCBidXQgbmV2ZXIgdXNlZC4KLUNvbnN0cnVjdGluZyBORkEgOiA2NjAgc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0xMzUgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDk1IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIkhUTUxIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGQwZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotUyA9IChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDogKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0JLy8gZG9uJ3QgbWF0Y2ggaWYgY29udGFpbnMgdHJhaWxpbmcgb3IgZW1iZWRkZWQgc3BhY2UKLQl7TmFtZX0ge1N9KyAgICAgICAgIHtyZXR1cm4gZmFsc2U7fQotCXtOYW1lfSB7U30rIHtOYW1lfSAge3JldHVybiBmYWxzZTt9Ci0KLQl7TmFtZX0gICAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTt9Ci0KLQkvLyBtYXRjaCBhbnl0aGluZyBzaG91bGQgY29tZSBsYXN0Ci0JLiAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0Je3JldHVybiBmYWxzZTt9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiZGNmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQgb24gNy8xNy8wNCAzOjQzIEFNICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQKLSAqIG9uIDcvMTcvMDQgMzo0MyBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5YTUwxME5hbWVzLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTDEwTmFtZXMgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gMjA0ODsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTFcMFwxXDFcMVwyXDJcMFwxXDFcMjJcMFwxXDFcMTRcMFwxXDBcMlwwIisKLSAgICAiXDEyXDBcMVwzXDZcMFwzMlwzXDRcMFwxXDNcMVwwXDMyXDNcNzRcMFwxXDAiKwotICAgICJcMTBcMFwyN1wzXDFcMFwzN1wzXDFcMFw3MlwzXDJcMFwxM1wzXDJcMFwxMFwzIisKLSAgICAiXDFcMFw2NVwzXDFcMFwxMDRcM1wxMVwwXDQ0XDNcM1wwXDJcM1w0XDBcMzZcMyIrCi0gICAgIlw3MFwwXDEzMVwzXDIyXDBcN1wzXDE2XDBcMlwwXDU2XDBcMTA2XDBcMzJcMFwyXDAiKwotICAgICJcNDRcMFwxXDNcMVwwXDNcM1wxXDBcMVwzXDFcMFwyNFwzXDFcMFw1NFwzIisKLSAgICAiXDFcMFw3XDNcM1wwXDFcM1wxXDBcMVwzXDFcMFwxXDNcMVwwXDFcMyIrCi0gICAgIlwxXDBcMjJcM1wxNVwwXDE0XDNcMVwwXDEwMlwzXDFcMFwxNFwzXDFcMFw0NFwzIisKLSAgICAiXDFcMFw0XDBcMTFcMFw2NVwzXDJcMFwyXDNcMlwwXDJcM1wzXDBcMzRcMyIrCi0gICAgIlwyXDBcMTBcM1wyXDBcMlwzXDY3XDBcNDZcM1wyXDBcMVwzXDdcMFw0NlwzIisKLSAgICAiXDEyXDBcMjFcMFwxXDBcMjdcMFwxXDBcM1wwXDFcMFwxXDBcMVwwXDJcMCIrCi0gICAgIlwxXDBcMVwwXDEzXDBcMzNcM1w1XDBcM1wzXDU2XDBcMzJcM1w1XDBcMVwwIisKLSAgICAiXDEyXDNcMTBcMFwxNVwwXDEyXDBcNlwwXDFcMFwxMDdcM1wyXDBcNVwzXDFcMCIrCi0gICAgIlwxN1wzXDFcMFw0XDNcMVwwXDFcM1wxN1wwXDJcM1wyXDBcMVwwXDRcMCIrCi0gICAgIlwyXDBcMTJcMFx1MDIwN1wwXDNcMFwxXDBcNjVcM1wyXDBcMVwwXDFcM1wyMFwwIisKLSAgICAiXDNcMFw0XDBcM1wwXDEyXDNcMlwwXDJcMFwxMlwwXDIxXDBcM1wwXDFcMCIrCi0gICAgIlwxMFwzXDJcMFwyXDNcMlwwXDI2XDNcMVwwXDdcM1wxXDBcMVwzXDNcMCIrCi0gICAgIlw0XDNcMlwwXDFcMFwxXDBcN1wwXDJcMFwyXDBcMlwwXDNcMFwxMVwwIisKLSAgICAiXDFcMFw0XDBcMlwzXDFcMFwzXDNcMlwwXDJcMFwxMlwwXDJcM1wyMFwwIisKLSAgICAiXDFcMFwyXDBcNlwzXDRcMFwyXDNcMlwwXDI2XDNcMVwwXDdcM1wxXDAiKwotICAgICJcMlwzXDFcMFwyXDNcMVwwXDJcM1wyXDBcMVwwXDFcMFw1XDBcNFwwIisKLSAgICAiXDJcMFwyXDBcM1wwXDEzXDBcNFwzXDFcMFwxXDNcN1wwXDEyXDBcMlwwIisKLSAgICAiXDNcM1wxNFwwXDNcMFwxXDBcN1wzXDFcMFwxXDNcMVwwXDNcM1wxXDAiKwotICAgICJcMjZcM1wxXDBcN1wzXDFcMFwyXDNcMVwwXDVcM1wyXDBcMVwwXDFcMyIrCi0gICAgIlwxMFwwXDFcMFwzXDBcMVwwXDNcMFwyMlwwXDFcM1w1XDBcMTJcMFwyMVwwIisKLSAgICAiXDNcMFwxXDBcMTBcM1wyXDBcMlwzXDJcMFwyNlwzXDFcMFw3XDNcMVwwIisKLSAgICAiXDJcM1wyXDBcNFwzXDJcMFwxXDBcMVwzXDZcMFwzXDBcMlwwXDJcMCIrCi0gICAgIlwzXDBcMTBcMFwyXDBcNFwwXDJcM1wxXDBcM1wzXDRcMFwxMlwwXDIyXDAiKwotICAgICJcMlwwXDFcMFw2XDNcM1wwXDNcM1wxXDBcNFwzXDNcMFwyXDNcMVwwIisKLSAgICAiXDFcM1wxXDBcMlwzXDNcMFwyXDNcM1wwXDNcM1wzXDBcMTBcM1wxXDAiKwotICAgICJcM1wzXDRcMFw1XDBcM1wwXDNcMFwxXDBcNFwwXDExXDBcMVwwXDE3XDAiKwotICAgICJcMTFcMFwyMVwwXDNcMFwxXDBcMTBcM1wxXDBcM1wzXDFcMFwyN1wzXDFcMCIrCi0gICAgIlwxMlwzXDFcMFw1XDNcNFwwXDdcMFwxXDBcM1wwXDFcMFw0XDBcN1wwIisKLSAgICAiXDJcMFwxMVwwXDJcM1w0XDBcMTJcMFwyMlwwXDJcMFwxXDBcMTBcM1wxXDAiKwotICAgICJcM1wzXDFcMFwyN1wzXDFcMFwxMlwzXDFcMFw1XDNcNFwwXDdcMFwxXDAiKwotICAgICJcM1wwXDFcMFw0XDBcN1wwXDJcMFw3XDBcMVwzXDFcMFwyXDNcNFwwIisKLSAgICAiXDEyXDBcMjJcMFwyXDBcMVwwXDEwXDNcMVwwXDNcM1wxXDBcMjdcM1wxXDAiKwotICAgICJcMjBcM1w0XDBcNlwwXDJcMFwzXDBcMVwwXDRcMFwxMVwwXDFcMFwxMFwwIisKLSAgICAiXDJcM1w0XDBcMTJcMFwyMjFcMFw1NlwzXDFcMFwxXDNcMVwwXDJcM1w3XDAiKwotICAgICJcNVwwXDZcM1wxXDBcMTBcMFwxXDBcMTJcMFw0N1wwXDJcM1wxXDBcMVwzIisKLSAgICAiXDJcMFwyXDNcMVwwXDFcM1wyXDBcMVwzXDZcMFw0XDNcMVwwXDdcMyIrCi0gICAgIlwxXDBcM1wzXDFcMFwxXDNcMVwwXDFcM1wyXDBcMlwzXDFcMFwyXDMiKwotICAgICJcMVwwXDFcM1wxXDBcMlwzXDZcMFwxXDBcMlwwXDFcM1wyXDBcNVwzIisKLSAgICAiXDFcMFwxXDBcMVwwXDZcMFwyXDBcMTJcMFw3NlwwXDJcMFw2XDBcMTJcMCIrCi0gICAgIlwxM1wwXDFcMFwxXDBcMVwwXDFcMFwxXDBcNFwwXDJcMFwxMFwzXDFcMCIrCi0gICAgIlw0MVwzXDdcMFwyNFwwXDFcMFw2XDBcNFwwXDZcMFwxXDBcMVwwXDFcMCIrCi0gICAgIlwyNVwwXDNcMFw3XDBcMVwwXDFcMFwzNDZcMFw0NlwzXDEyXDBcNDdcM1wxMVwwIisKLSAgICAiXDFcM1wxXDBcMlwzXDFcMFwzXDNcMVwwXDFcM1wxXDBcMlwzXDFcMCIrCi0gICAgIlw1XDNcNTFcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDEzXDBcMVwzXDFcMCIrCi0gICAgIlwxXDNcMVwwXDFcM1wzXDBcMlwzXDNcMFwxXDNcNVwwXDNcM1wxXDAiKwotICAgICJcMVwzXDFcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDNcMFwyXDNcM1wwIisKLSAgICAiXDJcM1wxXDBcMVwzXDUwXDBcMVwzXDExXDBcMVwzXDJcMFwxXDNcMlwwIisKLSAgICAiXDJcM1w3XDBcMlwzXDFcMFwxXDNcMVwwXDdcM1w1MFwwXDFcM1w0XDAiKwotICAgICJcMVwzXDEwXDBcMVwzXHUwYzA2XDBcMjM0XDNcNFwwXDEzMlwzXDZcMFwyNlwzXDJcMCIrCi0gICAgIlw2XDNcMlwwXDQ2XDNcMlwwXDZcM1wyXDBcMTBcM1wxXDBcMVwzXDFcMCIrCi0gICAgIlwxXDNcMVwwXDFcM1wxXDBcMzdcM1wyXDBcNjVcM1wxXDBcN1wzXDFcMCIrCi0gICAgIlwxXDNcM1wwXDNcM1wxXDBcN1wzXDNcMFw0XDNcMlwwXDZcM1w0XDAiKwotICAgICJcMTVcM1w1XDBcM1wzXDFcMFw3XDNcMzIzXDBcMTVcMFw0XDBcMVwwXDEwNFwwIisKLSAgICAiXDFcM1wzXDBcMlwzXDJcMFwxXDNcMTIxXDBcM1wzXHUwZTgyXDBcMVwwXDFcMCIrCi0gICAgIlwxXDNcMzFcMFwxMVwzXDZcMFwxXDBcNVwwXDEzXDBcMTI0XDNcNFwwXDJcMCIrCi0gICAgIlwyXDBcMlwwXDJcMFwxMzJcM1wxXDBcM1wwXDZcMFw1MFwzXHUxY2QzXDBcdTUxYTZcMyIrCi0gICAgIlx1MGM1YVwwXHUyYmE0XDNcdTI4NWNcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDFcMVwyXDRcMSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzddOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9ST1dNQVAgPSB6elVucGFja1Jvd01hcCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPQotICAgICJcMFwwXDBcNFwwXDEwXDBcMTRcMFwyMFwwXDI0XDBcMzAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs3XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1RSQU5TIFtdID0gewotICAgIDEsIDEsIC0xLCAyLCAtMSwgLTEsIC0xLCAtMSwgMiwgMywgCi0gICAgNCwgMiwgMiwgMywgNCwgNSwgLTEsIDQsIDQsIDYsIAotICAgIDUsIDUsIDQsIDUsIDYsIDYsIC0xLCA2LCAKLSAgfTsKLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMTFcNVwxIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbN107Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBYTUwxME5hbWVzKCkgewotCQl0aGlzLnp6UmVhZGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLQkJfQotCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLQkJCS8vICJub3QiCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyMjYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHByaXZhdGUgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICAgIHsge3JldHVybiBmYWxzZTt9IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmEuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDc3ZDE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotQGVjaG8gb24NCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtEOlxKREtzXGoyc2RrMS40LjJfMDNcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xSQzINCi1zZXQgSkZMRVhfTElCX0xPQ0FUSU9OPUQ6XERldlRpbWVTdXBwb3J0XEpGbGV4LTEuNFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9WE1MMTBOYW1lcw0KLQ0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbFxzcmNcDQotc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cc3NlXG1vZGVsXHhtbFxpbnRlcm5hbFxwYXJzZXJcDQotDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXBhdXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YUpGbGV4MTQuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YUpGbGV4MTQuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWZiZjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmFKRmxleDE0LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUBlY2hvIG9uDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7RDpcSkRLc1xqMnNkazEuNC4yXzAzXGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcUkMyDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleC0xLjRcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPVhNTDEwTmFtZXMNCi0NCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWxcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXHNzZVxtb2RlbFx4bWxcaW50ZXJuYWxccGFyc2VyXA0KLQ0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcSmZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcSmZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlICAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGNvcHkgJUpBVkFfRklMRSUgJVdPUktTUEFDRV9MT0NBVElPTiUlUFJPSkVDVF9TUkMlJVBBQ0tBR0VfRElSJSVKQVZBX0ZJTEUlDQotDQotcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhlcnIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleG91dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTYwYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVJlYWRpbmcgIlhNTDEwTmFtZXMuamZsZXgiCi1Db25zdHJ1Y3RpbmcgTkZBIDogMzYgc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLgotMTMgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDcgc3RhdGVzIGluIG1pbmltaXplZCBERkEKLVdyaXRpbmcgY29kZSB0byAiWE1MMTBOYW1lcy5qYXZhIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZlODk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0lJQotCi0lewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0JcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHl5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0JCi0KLSV9Ci0KLSVlb2Z7Ci0JaGFzTW9yZT1mYWxzZTsKLSVlb2Z9Ci0KLSVwdWJsaWMKLSVjbGFzcyBYTUxIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlIAotLy8lZGVidWcKLSVzd2l0Y2gKLSVidWZmZXIgODE5MgotCi1VVEYxNkJFID0gXHhGRVx4RkYKLVVURjE2TEUgPSBceEZGXHhGRQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGCi0KLVNwYWNlQ2hhciA9IFtceDIwXHgwOV0KLQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsKLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0KLQotQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoKLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbgotCi0KLSVzdGF0ZSBTVF9YTUxEZWNsCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUKLSVzdGF0ZSBEUV9TVFJJTkcKLSVzdGF0ZSBTUV9TVFJJTkcKLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZwotCi0lJQotCi0KLTxZWUlOSVRJQUw+ICAKLXsKLQkvLyBmb3JjZSB0byBzdGFydCBhdCBiZWdpbm5pbmcgb2YgbGluZSAoXikgYW5kIGF0IGJlZ2lubmluZyBvZiBmaWxlICh5eWNoYXIgPT0gMCkKLQlee1VURjE2QkV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fX0KLQlee1VURjE2TEV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fX0KLQlee1VURjgzQnl0ZUJPTX0gICAJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fX0KLQkKLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCV4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0JCi19CQotCQotPFNUX1hNTERlY2w+IAotewotCSJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9Ci0JImVuY29kaW5nIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0JLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMgCi0JLy8gcmVhZCB3aXRoIGluY29ycmVjdCBlbmNvZGluZyAoc3VjaCBhcyBpZiBwbGF0Zm9ybSBlbmNvZGluZyBpcyBpbiBlZmZlY3QgdW50aWwgdHJ1ZSBlbmNvZGluZyBkZXRlY3RlZCkuIAotCSJcPz4iICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9Ci19CQotCi0JCi0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCVwnCQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcKLQl7U30qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9Ci0KLX0JCi0KLQotPERRX1NUUklORz4KLXsKLQotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotCVwnICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiJT4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFVuRGVsaW1pdGVkU3RyaW5nPgotewotCi0Je1N9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCi0JeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLy8gdGhlc2UgYXJlIGEgYml0IHNwZWNpYWwsIHNpbmNlIHdlIHN0YXJ0ZWQgYW4gdW5kZWxpbWl0IHN0cmluZywgYnV0IGZvdW5kIGEgcXVvdGUgLi4uIHByb2JhYmx5IGluZGljYXRlcyBhIG1pc3NpbmcgYmVnaW5uaW5nIHF1b3RlCi0JXCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQlcIgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotfQotCi0vLyBUaGUgIm1hdGNoIGFueXRoaW5nIiBydWxlIHNob3VsZCBhbHdheXMgYmUgaW4gZWZmZWN0IGV4Y2VwdCBmb3Igd2hlbiBsb29raW5nIGZvciBlbmQgb2Ygc3RyaW5nCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQotPFlZSU5JVElBTCwgU1RfWE1MRGVjbCwgUXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9Ci0KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAzNzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDQvNi8wNCAxMToxMyBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDQvNi8wNCAxMToxMyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDQ7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgNgotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDZcMVw3XDJcMFwxXDExXDIyXDBcMVw2XDFcMFwxXDI3XDJcMCIrCi0gICAgIlwxXDMxXDFcMFwxXDMwXDI0XDBcMVwxMlwxXDEwXDFcMjZcMVwxM1wzXDBcMVwyMSIrCi0gICAgIlwxXDIzXDFcMTdcMVwwXDFcMjVcMVwwXDFcMjRcMlwwXDFcMTZcMVwxNVwxXDIwIisKLSAgICAiXDFcMjJcMTBcMFwxXDE0XDEyXDBcMVwyMVwxXDIzXDFcMTdcMVwwXDFcMjVcMVwwIisKLSAgICAiXDFcMjRcMlwwXDFcMTZcMVwxNVwxXDIwXDFcMjJcMTBcMFwxXDE0XDEwMlwwXDFcNCIrCi0gICAgIlwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxIisKLSAgICAiXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotICAJCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLSAgCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudCAKLSAgCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4gCi0gIAkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLSAgCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotICAJCX0KLQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9CQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTI4KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBjYXNlIDU3OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNTg6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNjA6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDYxOiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9IH0KLSAgICAgICAgY2FzZSA2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fSB9Ci0gICAgICAgIGNhc2UgNjM6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fSB9Ci0gICAgICAgIGNhc2UgNjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDY4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSA2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIFhNTEhlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBYTUxIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzFjN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1AZWNobyBvbg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC9zcGVjaWZpZWQgZm9yIGVhY2ggImRldmVsb3BtZW50IG1hY2hpbmUiDQotc2V0IFBBVEg9JVBBVEglO0Q6XEpES3NcajJzZGsxLjQuMl8wM1xiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFdTV0JNOA0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPVhNTEhlYWRUb2tlbml6ZXINCi0NCi1yZW0gc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sXHNyY1wNCi1yZW0gc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cc3NlXG1vZGVsXHhtbFxlbmNvZGluZ1wNCi0NCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxlbmNvZGluZ1xyZXNvdXJjZVxjb250ZW50c3BlY2lmaWNceG1sXA0KLQ0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1wYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YzMyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotUmVhZGluZyAiWE1MSGVhZFRva2VuaXplci5qZmxleCIKLQotV2FybmluZyA6IE1hY3JvICJTcGFjZUNoYXIiIGhhcyBiZWVuIGRlY2xhcmVkIGJ1dCBuZXZlciB1c2VkLgotQ29uc3RydWN0aW5nIE5GQSA6IDM1OCBzdGF0ZXMgaW4gTkZBCi1Db252ZXJ0aW5nIE5GQSB0byBERkEgOiAKLS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLTc5IHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA1NCBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJYTUxIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24gYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDk2MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9vbGRYTUxIZWFkVG9rZW5pemVyLnNrZWxldG9uCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIA0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQ0KLQ0KLS0tLSB1c2VyIGNsYXNzIGNvZGUNCi0NCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyDQotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuDQotICAgKg0KLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uDQotICAgKi8NCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24NCi0NCi0NCi0gIC8qKg0KLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlDQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0NCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0NCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyANCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLw0KLQ0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLw0KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgew0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsNCi0NCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLw0KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfc3RhcnRSZWFkID0gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8NCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsNCi0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7DQotICAgIH0NCi0NCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovDQotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7DQotDQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsNCi0NCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7DQotDQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0gIH0NCi0NCi0gICAgDQotICAvKioNCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8NCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovDQotICAgIHl5X3JlYWRlci5jbG9zZSgpOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsNCi0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKg0KLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgew0KLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgew0KLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgew0KLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICAvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiU2NhbkVycm9yOiAiICsgZXJyb3JDb2RlICsgIjogIiArIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsNCi0gICAgfQ0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0gICAgICAvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5FcnJvcjogIiArIGVycm9yQ29kZSArICI6ICIgKyBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgIH0NCi0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yDQotICAgIC8vIFN5c3RlbS5leGl0KDEpOw0KLSAgfSANCi0NCi0NCi0gIC8qKg0KLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKg0KLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZA0KLSAgICoNCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLg0KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhDQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsNCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkNCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7DQotDQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7DQotICB9DQotDQotDQotLS0tIHl5X2RvRW9mDQotICAvKioNCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsDQotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0tLS0geXlsZXggZGVjbGFyYXRpb24NCi0gICAgaW50IHl5X2lucHV0Ow0KLSAgICBpbnQgeXlfYWN0aW9uOw0KLQ0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMNCi0NCi0gICAgd2hpbGUgKHRydWUpIHsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxpbmUsIGNoYXIsIGNvbCBjb3VudCkNCi0gICAgICB5eV9hY3Rpb24gPSAtMTsNCi0NCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOw0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGV4c3RhdGUgZXRjKQ0KLQ0KLSAgICAgIHl5X2ZvckFjdGlvbjogew0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgDQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOw0KLQ0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOw0KLQ0KLS0tLSBsaW5lLCBjb2wsIGNoYXIgY291bnQsIG5leHQgdHJhbnNpdGlvbiwgaXNGaW5hbCBhY3Rpb24NCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgDQotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgDQotLS0tIGxpbmUgY291bnQgdXBkYXRlDQotICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotLS0tIGNoYXIgY291bnQgdXBkYXRlDQotDQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgDQotDQotLS0tIGFjdGlvbnMNCi0gICAgICAgIGRlZmF1bHQ6IA0KLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsNCi0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7DQotLS0tIGVvZnZhbHVlDQotICAgICAgICAgIH0gDQotICAgICAgICAgIGVsc2Ugew0KLS0tLSBubyBtYXRjaA0KLSAgICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9ICAgIA0KLQ0KLS0tLSBtYWluDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwY2U2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDA0LzEwLzAxIDIyOjUzICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzcy5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MucGFyc2VyLkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUb2tlbml6ZXIgaW1wbGVtZW50cyBDU1NSZWdpb25Db250ZXh0cyB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0lNUE9SVF9ERUxJTUlURVIgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1IgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DSEFSU0VUX0RFTElNSVRFUiA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BBR0VfUFNFVURPX1BBR0UgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9JTVBPUlRfVVJJID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT04gPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEFHRV9ERUxJTUlURVIgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVESUFfTUVESVVNID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0hBUlNFVF9OQU1FID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX01FRElVTSA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVESUFfREVMSU1JVEVSID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfTU9ESUZJRVIgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVwxMVwxXDE3XDFcMFwxXDRcMVwyMFwyMlwwXDFcNlwxXDMxXDFcMTAiKwotICAgICJcMVwyMlwxXDE2XDFcNzJcMVwxNlwxXDVcMVwyNlwxXDEyXDFcMzVcMVwxNFwxXDU1IisKLSAgICAiXDFcMTNcMVwxNVwxXDM0XDEyXDFcMVw2MlwxXDUwXDFcMzBcMVw2N1wxXDMyXDFcMjEiKwotICAgICJcMVwzNlwxXDQzXDFcMjdcMVw0MFwxXDU3XDFcNDZcMVw2NFwxXDYxXDFcNDFcMVw1MSIrCi0gICAgIlwyXDJcMVwyNVwxXDUyXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDI0XDFcNDRcMVw0NyIrCi0gICAgIlwxXDIzXDVcMlwxXDY2XDFcM1wxXDcxXDFcMTZcMVwyXDFcMTZcMVw0MlwxXDciKwotICAgICJcMVwzN1wxXDU2XDFcNDVcMVw2M1wxXDYxXDFcNDFcMVw1MVwyXDJcMVwyNVwxXDUyIisKLSAgICAiXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDI0XDFcNDRcMVw0N1wxXDIzXDVcMlwxXDYwIisKLSAgICAiXDFcNzBcMVwzM1wxXDcwXDFcMFx1ZmY4MFwyIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDU5LCAgIDExOCwgICAxNzcsICAgMjM2LCAgIDI5NSwgICAzNTQsICAgNDEzLCAgIDQ3MiwgICA1MzEsIAotICAgICAgNTkwLCAgIDY0OSwgICA3MDgsICAgNzY3LCAgIDgyNiwgICA4ODUsICAgOTQ0LCAgMTAwMywgIDEwNjIsICAxMTIxLCAKLSAgICAgMTE4MCwgIDEyMzksICAxMjk4LCAgMTM1NywgIDE0MTYsICAxNDc1LCAgMTUzNCwgIDExMjEsICAxNTkzLCAgMTEyMSwgCi0gICAgIDE2NTIsICAxNzExLCAgMTEyMSwgIDE3NzAsICAxODI5LCAgMTg4OCwgIDExMjEsICAxOTQ3LCAgMjAwNiwgIDIwNjUsIAotICAgICAyMTI0LCAgMjE4MywgIDIyNDIsICAxMTIxLCAgMjMwMSwgIDIzNjAsICAyNDE5LCAgMTEyMSwgIDExMjEsICAyNDc4LCAKLSAgICAgMjUzNywgIDI1OTYsICAxMTIxLCAgMjY1NSwgIDI3MTQsICAxMTIxLCAgMTEyMSwgIDI3NzMsICAyODMyLCAgMjg5MSwgCi0gICAgIDExMjEsICAyOTUwLCAgMTEyMSwgIDMwMDksICAzMDY4LCAgMzEyNywgIDMxODYsICAzMjQ1LCAgMzMwNCwgIDMzNjMsIAotICAgICAzNDIyLCAgMTEyMSwgIDExMjEsICAzNDgxLCAgMzU0MCwgIDM1OTksICAzNjU4LCAgMzcxNywgIDExMjEsICAzNzc2LCAKLSAgICAgMzgzNSwgIDM4OTQsICAzOTUzLCAgNDAxMiwgIDQwNzEsICAxNTkzLCAgMTEyMSwgIDQxMzAsICAxMjM5LCAgNDE4OSwgCi0gICAgIDQyNDgsICAxNDE2LCAgNDMwNywgIDE0NzUsICA0MzY2LCAgNDQyNSwgIDQ0ODQsICA0NTQzLCAgNDYwMiwgIDQ2NjEsIAotICAgICA0NzIwLCAgNDc3OSwgIDQ4MzgsICA0ODk3LCAgMTc3MCwgIDQ5NTYsICAxMTIxLCAgMTgyOSwgIDUwMTUsICA1MDc0LCAKLSAgICAgMTk0NywgIDUxMzMsICAxMTIxLCAgMjAwNiwgIDUxOTIsICA1MjUxLCAgMjE4MywgIDUzMTAsICA1MzY5LCAgMjM2MCwgCi0gICAgIDU0MjgsICA1NDg3LCAgMjUzNywgIDU1NDYsICA1NjA1LCAgMTEyMSwgIDI3MTQsICAyODMyLCAgNTY2NCwgIDU3MjMsIAotICAgICAzMDY4LCAgNTc4MiwgIDMxMjcsICA1ODQxLCAgMTEyMSwgIDMxODYsICA1OTAwLCAgNTk1OSwgIDMzNjMsICA2MDE4LCAKLSAgICAgNjA3NywgIDYxMzYsICA2MTk1LCAgMzg5NCwgIDExMjEsICAzNTk5LCAgMTEyMSwgIDYyNTQsICAzNjU4LCAgNjMxMywgCi0gICAgIDExMjEsICAzNzE3LCAgNjM3MiwgIDY0MzEsICA2NDkwLCAgNjU0OSwgIDM5NTMsICA2NjA4LCAgNjY2NywgIDY3MjYsIAotICAgICA0MDcxLCAgNjc4NSwgIDExMjEsICA0MTMwLCAgNjg0NCwgIDExMjEsICA2OTAzLCAgNjk2MiwgIDcwMjEsICA3MDgwLCAKLSAgICAgNzEzOSwgIDcxOTgsICA3MjU3LCAgNzMxNiwgIDczNzUsICA3NDM0LCAgNzQ5MywgIDc1NTIsICAxNzcwLCAgNzYxMSwgCi0gICAgIDc2NzAsICAxODI5LCAgNzcyOSwgIDc3ODgsICAxOTQ3LCAgNzg0NywgIDc5MDYsICAyMDA2LCAgNzk2NSwgIDgwMjQsIAotICAgICA4MDgzLCAgODE0MiwgIDgyMDEsICA4MjYwLCAgODMxOSwgIDgzNzgsICAzMTI3LCAgODQzNywgIDg0OTYsICAzMTg2LCAKLSAgICAgODU1NSwgIDg2MTQsICA4NjczLCAgODczMiwgIDg3OTEsICAzNjU4LCAgODg1MCwgIDg5MDksICAzNzE3LCAgODk2OCwgCi0gICAgIDkwMjcsICA5MDg2LCAgOTE0NSwgIDkyMDQsICA5MjYzLCAgOTMyMiwgIDkzODEsICAxMTIxLCAgMTEyMSwgIDk0NDAsIAotICAgICA5NDk5LCAgOTU1OCwgIDk2MTcsICA5Njc2LCAgOTczNSwgIDk3OTQsICA5ODUzLCAgOTkxMiwgIDk5NzEsIDEwMDMwLCAKLSAgICAxMDA4OSwgMTAxNDgsIDEwMjA3LCAxMDI2NiwgMTAzMjUsIDEwMzg0LCAxMDQ0MywgMTA1MDIsIDEwNTYxLCAxMDYyMCwgCi0gICAgMTA2NzksIDEwNzM4LCAxMDc5NywgMTA4NTYsIDEwOTE1LCAxMDk3NCwgMTEwMzMsIDExMDkyLCAxMTE1MSwgMTEyMTAsIAotICAgIDExMjY5LCAxMTMyOCwgMTEzODcsIDExNDQ2LCAxMTUwNSwgIDExMjEsIDExNTY0LCAxMTYyMywgIDExMjEsIDExNjgyLCAKLSAgICAxMTc0MSwgMTE4MDAsIDExODU5LCAxMTkxOCwgMTE5NzcsIDEyMDM2LCAxMjA5NSwgMTIxNTQsIDEyMjEzLCAgMTEyMSwgCi0gICAgMTIyNzIsIDEyMzMxLCAxMjM5MCwgMTI0NDksIDEyNTA4LCAxMjU2NywgMTI2MjYsIDEyNjg1LCAxMjc0NCwgMTI4MDMsIAotICAgIDEyODYyLCAxMjkyMSwgMTI5ODAsIDEzMDM5LCAxMzA5OCwgMTMxNTcsIDEzMjE2LCAxMTA5MiwgMTMyNzUsIDEzMzM0LCAKLSAgICAgMTEyMSwgMTMzOTMsIDEzNDUyLCAxMzUxMSwgMTM1NzAsIDEzNjI5LCAxMzY4OCwgIDExMjEsIDEzNzQ3LCAxMzgwNiwgCi0gICAgMTM4NjUsIDEzOTI0LCAxMzk4MywgMTQwNDIsIDE0MTAxLCAxNDE2MCwgMTQyMTksIDEyMDM2LCAxNDI3OCwgMTQzMzcsIAotICAgIDE0Mzk2LCAxNDQ1NSwgMTQ1MTQsIDE0NTczLCAxNDYzMiwgMTQ2OTEsIDE0NzUwLCAxNDgwOSwgMTQ4NjgsIDE0OTI3LCAKLSAgICAxNDk4NiwgMTUwNDUsIDE1MTA0LCAxNTE2MywgMTUyMjIsIDE1MjgxLCAxNTM0MCwgMTMxNTcsIDE1Mzk5LCAxNTQ1OCwgCi0gICAgMTU1MTcsIDE1NTc2LCAxNTYzNSwgMTU2OTQsIDE1NzUzLCAgMTEyMSwgMTU4MTIsIDE1ODcxLCAxNTkzMCwgMTU5ODksIAotICAgIDE2MDQ4LCAxNjEwNywgMTYxNjYsIDE2MjI1LCAxNjI4NCwgMTYzNDMsIDE2NDAyLCAxNjQ2MSwgMTY1MjAsIDE2NTc5LCAKLSAgICAxNjYzOCwgMTY2OTcsIDE2NzU2LCAxNjgxNSwgMTY4NzQsIDE2OTMzLCAxNjk5MiwgMTcwNTEsIDE3MTEwLCAxNzE2OSwgCi0gICAgMTcyMjgsIDE3Mjg3LCAxNzM0NiwgMTc0MDUsIDE3NDY0LCAxNzUyMywgMTc1ODIsIDE3NjQxLCAxNzcwMCwgMTc3NTksIAotICAgIDE3ODE4LCAxNzg3NywgMTc5MzYsIDE3OTk1LCAxODA1NCwgIDExMjEsIDE4MTEzLCAxODE3MiwgMTgyMzEsIDE4MjkwLCAKLSAgICAxODM0OSwgMTg0MDgsIDE4NDY3LCAxODUyNiwgMTg1ODUsIDEyMTU0LCAxODY0NCwgMTIyMTMsIDE4NzAzLCAxODc2MiwgCi0gICAgMTg4MjEsIDE4ODgwLCAxODkzOSwgMTg5OTgsIDE5MDU3LCAxOTExNiwgMTkxNzUsIDE5MjM0LCAxMzI3NSwgMTkyOTMsIAotICAgIDEzMzM0LCAxOTM1MiwgMTk0MTEsIDE5NDcwLCAxOTUyOSwgMTk1ODgsIDE5NjQ3LCAxOTcwNiwgMTk3NjUsIDE5ODI0LCAKLSAgICAxOTg4MywgMTk5NDIsICAxMTIxLCAyMDAwMSwgMjAwNjAsIDIwMTE5LCAyMDE3OCwgIDExMjEsIDIwMjM3LCAyMDI5NiwgCi0gICAgMjAzNTUsICAxMTIxLCAyMDQxNCwgMjA0NzMsIDIwNTMyLCAyMDU5MSwgMjA2NTAsIDIwNzA5LCAyMDc2OCwgMjA4MjcsIAotICAgIDIwODg2LCAyMDk0NQotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDJcMjRcMVwyNVwxXDI2XDFcMjdcMVwyNFwxXDI3XDFcMjVcMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwzMFwxXDI0XDFcMzFcMVwyNFwyXDI3XDFcMjQiKwotICAgICJcMVwzMlwzXDI1XDFcMjRcMVwyNVwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMzZcMVwzN1wxMVwyNVwxXDI0XDRcMjVcMVwyNFwyXDI1XDFcMjQiKwotICAgICJcMVwyNVwxXDQwXDNcMjVcMVw0MVwxMFwyNFwxXDI3XDFcNDJcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDNcMVwyN1wxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjQiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcNDBcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcMjdcMlwyNFwxXDI3XDFcMjRcMVw0NFwzXDI0XDJcMjciKwotICAgICJcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwyNCIrCi0gICAgIlwxXDQ1XDI2XDI0XDFcMjdcMVw0NlwxXDI3XDFcMjRcMVw0N1wxXDI3IisKLSAgICAiXDFcMjRcMVw0NFwzXDI0XDJcMjdcMlwyNFwxXDUwXDRcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNFwyNCIrCi0gICAgIlwxXDUxXDFcNTJcMVwyN1wxXDI0XDFcMjdcMVw1MVwxXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDUzXDNcMjRcMlwyN1wyXDI0XDNcNTFcMVwyNFwxXDUxIisKLSAgICAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDUxXDFcNDUiKwotICAgICJcNFw1MVwxXDI0XDJcNTFcMVwyNFwxXDUxXDFcMjRcM1w1MVwxMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwyN1wyXDI0XDFcMjdcMVwyNFwxXDQ0XDNcMjQiKwotICAgICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDExXDI0XDFcNDVcNFwyNFwxXDU0XDE3XDI0XDFcNTVcMVw1NlwxXDI3IisKLSAgICAiXDFcMjRcMVwyN1wxXDU1XDFcMjRcMVwyN1wxXDI0XDFcNTdcM1wyNCIrCi0gICAgIlwyXDI3XDJcMjRcM1w1NVwxXDI0XDFcNTVcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcNTVcMVwyNFw0XDU1XDFcMjRcMlw1NSIrCi0gICAgIlwxXDI0XDFcNTVcMVwyNFwzXDU1XDExXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDJcMjRcMVwyN1wxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTZcMjRcMVw2MFwyXDI0IisKLSAgICAiXDFcNjFcMTRcMjRcMVw2MlwxXDYzXDFcMjdcMVwyNFwxXDI3XDFcNjIiKwotICAgICJcMVwyNFwxXDI3XDFcMjRcMVw2NFwzXDI0XDJcMjdcMlwyNFwzXDYyIisKLSAgICAiXDFcMjRcMVw2MlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzNyIrCi0gICAgIlwxMVw2MlwxXDI0XDRcNjJcMVwyNFwyXDYyXDFcNjVcMVw2MlwxXDY2IisKLSAgICAiXDNcNjJcMTFcMjRcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3XDFcMjQiKwotICAgICJcMVw0NFwzXDI0XDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMjRcMVwzN1wyMVwyNFwxXDY1XDE2XDI0XDFcNjdcMVwyNFwxXDY3IisKLSAgICAiXDJcMjRcMVw2N1wxXDI0XDFcNDRcMVw3MFwxXDMxXDFcMjRcMlw2NyIrCi0gICAgIlwxXDI0XDFcMzJcNVwyNFwxXDMzXDFcMjRcMVw3MFwxXDM0XDFcMzUiKwotICAgICJcMVwzNlwxXDM3XDE2XDI0XDFcNzFcMlwyNFwxXDY1XDFcMjRcMVw0MCIrCi0gICAgIlwzXDI0XDFcNDFcNlwyNFwxXDcyXDFcNzNcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMVw3MlwxXDI0XDFcMjdcMVwyNFwxXDc0XDNcMjRcMlwyN1wyXDI0IisKLSAgICAiXDNcNzJcMVwyNFwxXDcyXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNCIrCi0gICAgIlwxXDM3XDExXDcyXDFcMjRcNFw3MlwxXDI0XDJcNzJcMVwyNFwxXDcyIisKLSAgICAiXDFcMjRcM1w3MlwxMVwyNFwxXDI3XDFcMjRcMVwyN1wyXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDQ0XDNcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0IisKLSAgICAiXDFcMzVcMVwyNFwxXDM3XDMwXDI0XDFcNzVcMVw3NlwxXDc3XDNcMjQiKwotICAgICJcMVwxMDBcMVwxMDFcMVwyN1wxXDEwMlwxXDI3XDFcMTAwXDFcMTAzXDFcMjciKwotICAgICJcMVwyNFwxXDEwNFwzXDI0XDJcMjdcMlwyNFwzXDEwMFwxXDI0XDFcMTAwIisKLSAgICAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDEwMFwxXDI0IisKLSAgICAiXDRcMTAwXDFcMjRcMlwxMDBcMVwyNFwxXDEwMFwxXDI0XDNcMTAwXDExXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDI3XDJcMjRcMVwyN1wxXDI0XDFcNDRcM1wyNCIrCi0gICAgIlwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMzJcMjRcMVw3N1wzXDI0XDFcMTA1XDFcMTA2XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMTA1XDFcMjRcMVwyN1wxXDI0XDFcMTA3XDNcMjRcMlwyN1wyXDI0IisKLSAgICAiXDNcMTA1XDFcMjRcMVwxMDVcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0IisKLSAgICAiXDFcMzdcMTFcMTA1XDFcMTEwXDRcMTA1XDFcMjRcMlwxMDVcMVwyNFwxXDEwNSIrCi0gICAgIlwxXDI0XDNcMTA1XDExXDI0XDFcMjdcMVwyNFwxXDI3XDJcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVwxMTBcMTFcMjRcMVwxMTFcMTFcMjQiKwotICAgICJcMVwxMTJcMVwxMTNcMVwxMTRcMVwyN1wxXDExNVwxXDI3XDFcMTEzXDFcMTE2IisKLSAgICAiXDFcMjdcMVwxMTdcMVwxMjBcMVwxMjFcMVwxMjJcMVwyNFwyXDI3XDFcMjQiKwotICAgICJcMVwxMjNcMVwxMjRcMlwxMTNcMVwyNFwxXDExM1wxXDMzXDFcMTI1XDFcMjQiKwotICAgICJcMVwzNFwxXDEyNlwxXDI0XDFcMzdcMTFcMTEzXDFcMTEwXDRcMTEzXDFcMTI3IisKLSAgICAiXDJcMTEzXDFcMjRcMVwxMTNcMVwyNFwzXDExM1w2XDI0XDFcMTEyXDFcMTEzIisKLSAgICAiXDFcMTE0XDFcMTMwXDFcMTE1XDFcMTMwXDFcMTEzXDFcMTE2XDFcMTMwXDFcMTE3IisKLSAgICAiXDFcMTIwXDFcMTIxXDFcMTIyXDFcMjRcMlwxMzBcMVwyNFwxXDEyM1wxXDEyNCIrCi0gICAgIlwyXDExM1wxXDI0XDFcMTEzXDFcMzNcMVwxMjVcMVwyNFwxXDM0XDFcMTI2IisKLSAgICAiXDFcMjRcMVwzN1wxMVwxMTNcMVwxMTBcNFwxMTNcMVwxMjdcMlwxMTNcMVwyNCIrCi0gICAgIlwxXDExM1wxXDI0XDNcMTEzXDVcMjRcNzRcMFwyXDI1XDFcMTMxXDNcMCIrCi0gICAgIlwxXDI1XDNcMFwxXDI1XDdcMFwzXDI1XDFcMFwxXDI1XDdcMCIrCi0gICAgIlwxMVwyNVwxXDBcNFwyNVwxXDBcMlwyNVwxXDBcMVwyNVwxXDAiKwotICAgICJcM1wyNVw2XDBcMVwxMzJcMlwyNVwxXDBcMlwyNVwxXDEzMlwxXDI1IisKLSAgICAiXDFcMFw1XDI1XDJcMFwxNlwyNVwxXDEzMlwyXDI1XDFcMTMyXDJcMjUiKwotICAgICJcMVwxMzJcMTBcMjVcMVwxMzJcNFwyNVwxXDEzMlw3XDI1XDRcMFwxXDI3IisKLSAgICAiXDFcMFwxXDI3XDJcMFwxXDI3XDVcMFwyXDI3XDUzXDBcMlwyNSIrCi0gICAgIlwxXDEzMVwzXDBcMVwyNVwzXDBcMVwxMzNcN1wwXDNcMjVcMVwwIisKLSAgICAiXDFcMjVcN1wwXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1XDFcMCIrCi0gICAgIlwxXDI1XDFcMFwzXDI1XDZcMFwyXDEzNFwxXDEzNVwzXDBcMVwxMzQiKwotICAgICJcM1wwXDFcMTM0XDdcMFwzXDEzNFwxXDBcMVwxMzRcN1wwXDExXDEzNCIrCi0gICAgIlwxXDBcNFwxMzRcMVwwXDJcMTM0XDFcMFwxXDEzNFwxXDBcM1wxMzQiKwotICAgICJcNlwwXDJcMTM2XDFcMTM3XDNcMFwxXDEzNlwzXDBcMVwxMzZcN1wwIisKLSAgICAiXDNcMTM2XDFcMFwxXDEzNlw3XDBcMTFcMTM2XDFcMFw0XDEzNlwxXDAiKwotICAgICJcMlwxMzZcMVwwXDFcMTM2XDFcMFwzXDEzNlwzNlwwXDFcMTQwXDc2XDAiKwotICAgICJcMVwxNDFcNzRcMFwyXDE0MlwxMFwwXDFcMTQzXDFcMTQ0XDFcMTQ1XDdcMCIrCi0gICAgIlwyXDE0NlwxMFwwXDFcMTQ3XDFcMTUwXDNcMFwxXDE0N1wzXDBcMVwxNDciKwotICAgICJcN1wwXDNcMTQ3XDFcMFwxXDE0N1w3XDBcMTFcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMlwxNDdcMVwwXDFcMTQ3XDFcMFwzXDE0N1w2XDBcMlwxNTEiKwotICAgICJcMVwxNTJcMVwwXDFcMTUzXDExXDE1MVwyXDBcNTJcMTUxXDFcMFwyXDE1NCIrCi0gICAgIlwxXDE1NVwxXDBcM1wxNTRcMVwxNTNcNlwxNTRcMlwwXDUyXDE1NFwxM1wwIisKLSAgICAiXDFcMTU2XDYwXDBcMlwxNTdcMVwxNjBcMVwwXDFcMTYxXDExXDE1N1wyXDAiKwotICAgICJcNTJcMTU3XDFcMFwyXDE2MlwxXDE2M1wxXDBcM1wxNjJcMVwxNjFcNlwxNjIiKwotICAgICJcMlwwXDUyXDE2MlwyNFwwXDFcMTY0XDQ3XDBcMlw1MVwxXDE2NVwzXDAiKwotICAgICJcMVw1MVwzXDBcMVw1MVw3XDBcM1w1MVwxXDBcMVw1MVw3XDAiKwotICAgICJcMTFcNTFcMVwwXDRcNTFcMVwwXDJcNTFcMVwwXDFcNTFcMVwwIisKLSAgICAiXDNcNTFcNlwwXDFcMTY2XDJcNTFcMVwwXDJcNTFcMVwxNjZcMVw1MSIrCi0gICAgIlwxXDBcNVw1MVwyXDBcMTZcNTFcMVwxNjZcMlw1MVwxXDE2NlwyXDUxIisKLSAgICAiXDFcMTY2XDEwXDUxXDFcMTY2XDRcNTFcMVwxNjZcN1w1MVwxXDBcMlw1MSIrCi0gICAgIlwxXDE2NVwzXDBcMVw1MVwzXDBcMVwxNjdcN1wwXDNcNTFcMVwwIisKLSAgICAiXDFcNTFcN1wwXDExXDUxXDFcMFw0XDUxXDFcMFwyXDUxXDFcMCIrCi0gICAgIlwxXDUxXDFcMFwzXDUxXDZcMFwyXDU1XDFcMTcwXDNcMFwxXDU1IisKLSAgICAiXDNcMFwxXDU1XDdcMFwzXDU1XDFcMFwxXDU1XDdcMFwxMVw1NSIrCi0gICAgIlwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDBcM1w1NSIrCi0gICAgIlw2XDBcMVwxNzFcMlw1NVwxXDBcMlw1NVwxXDE3MVwxXDU1XDFcMCIrCi0gICAgIlw1XDU1XDJcMFwxNlw1NVwxXDE3MVwyXDU1XDFcMTcxXDJcNTVcMVwxNzEiKwotICAgICJcMTBcNTVcMVwxNzFcNFw1NVwxXDE3MVw3XDU1XDFcMFwyXDU1XDFcMTcwIisKLSAgICAiXDNcMFwxXDU1XDNcMFwxXDE3Mlw3XDBcM1w1NVwxXDBcMVw1NSIrCi0gICAgIlw3XDBcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTUiKwotICAgICJcMVwwXDNcNTVcNlwwXDJcNjJcMVwxNzNcM1wwXDFcNjJcM1wwIisKLSAgICAiXDFcNjJcN1wwXDNcNjJcMVwwXDFcNjJcN1wwXDExXDYyXDFcMCIrCi0gICAgIlw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMFwzXDYyXDZcMCIrCi0gICAgIlwxXDE3NFwyXDYyXDFcMFwyXDYyXDFcMTc0XDFcNjJcMVwwXDVcNjIiKwotICAgICJcMlwwXDE2XDYyXDFcMTc0XDJcNjJcMVwxNzRcMlw2MlwxXDE3NFwxMFw2MiIrCi0gICAgIlwxXDE3NFw0XDYyXDFcMTc0XDdcNjJcMVwwXDJcNjJcMVwxNzNcM1wwIisKLSAgICAiXDFcNjJcM1wwXDFcMTc1XDdcMFwzXDYyXDFcMFwxXDYyXDdcMCIrCi0gICAgIlwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcM1w2Mlw3XDBcMVw2MlwxXDE3M1wzXDBcMVw2MlwzXDBcMVw2MiIrCi0gICAgIlw3XDBcM1w2MlwxXDBcMVw2Mlw3XDBcMTFcNjJcMVwwXDRcNjIiKwotICAgICJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjJcNVwwXDRcMTc2IisKLSAgICAiXDFcMTc3XDFcMTc2XDFcMTc3XDJcMTc2XDFcMTc3XDJcMTc2XDFcMFwyXDE3NiIrCi0gICAgIlwyXDE3N1wxMVwxNzZcMVwwXDI1XDE3NlwxXDBcMTJcMTc2XDFcMFwyXDcyIisKLSAgICAiXDFcMjAwXDNcMFwxXDcyXDNcMFwxXDcyXDdcMFwzXDcyXDFcMCIrCi0gICAgIlwxXDcyXDdcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MlwxXDAiKwotICAgICJcMVw3MlwxXDBcM1w3Mlw2XDBcMVwyMDFcMlw3MlwxXDBcMlw3MiIrCi0gICAgIlwxXDIwMVwxXDcyXDFcMFw1XDcyXDJcMFwxNlw3MlwxXDIwMVwyXDcyIisKLSAgICAiXDFcMjAxXDJcNzJcMVwyMDFcMTBcNzJcMVwyMDFcNFw3MlwxXDIwMVw3XDcyIisKLSAgICAiXDFcMFwyXDcyXDFcMjAwXDNcMFwxXDcyXDNcMFwxXDIwMlw3XDAiKwotICAgICJcM1w3MlwxXDBcMVw3Mlw3XDBcMTFcNzJcMVwwXDRcNzJcMVwwIisKLSAgICAiXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNzRcMFwxXDc1XDRcMCIrCi0gICAgIlwyXDEwMFwxXDIwM1wzXDBcMVwxMDBcM1wwXDFcMTAwXDdcMFwzXDEwMCIrCi0gICAgIlwxXDBcMVwxMDBcN1wwXDExXDEwMFwxXDBcNFwxMDBcMVwwXDJcMTAwIisKLSAgICAiXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwXDFcMjA0XDJcMTAwXDFcMCIrCi0gICAgIlwyXDEwMFwxXDIwNFwxXDEwMFwxXDBcNVwxMDBcMlwwXDE2XDEwMFwxXDIwNCIrCi0gICAgIlwyXDEwMFwxXDIwNFwyXDEwMFwxXDIwNFwxMFwxMDBcMVwyMDRcNFwxMDBcMVwyMDQiKwotICAgICJcN1wxMDBcMVwwXDJcMjA1XDFcMjA2XDFcMFwxXDIwN1wxMVwyMDVcMlwwIisKLSAgICAiXDUyXDIwNVwxXDBcMlwyMTBcMVwyMTFcMVwwXDNcMjEwXDFcMjA3XDZcMjEwIisKLSAgICAiXDJcMFw1MlwyMTBcMVwwXDJcMTAwXDFcMjAzXDNcMFwxXDEwMFwzXDAiKwotICAgICJcMVwyMTJcN1wwXDNcMTAwXDFcMFwxXDEwMFw3XDBcMTFcMTAwXDFcMCIrCi0gICAgIlw0XDEwMFwxXDBcMlwxMDBcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDAiKwotICAgICJcMlwxMDVcMVwyMTNcM1wwXDFcMTA1XDNcMFwxXDEwNVw3XDBcM1wxMDUiKwotICAgICJcMVwwXDFcMTA1XDdcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMVwwXDNcMTA1XDZcMFwxXDIxNFwyXDEwNVwxXDAiKwotICAgICJcMlwxMDVcMVwyMTRcMVwxMDVcMVwwXDVcMTA1XDJcMFwxNlwxMDVcMVwyMTQiKwotICAgICJcMlwxMDVcMVwyMTRcMlwxMDVcMVwyMTRcMTBcMTA1XDFcMjE0XDRcMTA1XDFcMjE0IisKLSAgICAiXDdcMTA1XDFcMFwyXDEwNVwxXDIxM1wzXDBcMVwxMDVcM1wwXDFcMjE1IisKLSAgICAiXDdcMFwzXDEwNVwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDUiKwotICAgICJcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwXDFcMTEyIisKLSAgICAiXDFcMjE2XDFcMjE3XDNcMFwxXDIxNlwzXDBcMVwyMTZcMVwwXDFcMjIwIisKLSAgICAiXDVcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDBcNFwyMTYiKwotICAgICJcMVwwXDJcMjE2XDFcMFwxXDIxNlwxXDBcM1wyMTZcNFwwXDFcMjIxIisKLSAgICAiXDFcMFwyXDExM1wxXDIyMlwzXDBcMVwxMTNcM1wwXDFcMTEzXDdcMCIrCi0gICAgIlwzXDExM1wxXDIyM1wxXDExM1w3XDBcMTFcMTEzXDFcMFw0XDExM1wxXDAiKwotICAgICJcMlwxMTNcMVwwXDFcMTEzXDFcMFwzXDExM1w2XDBcMVwyMjRcMlwxMTMiKwotICAgICJcMVwwXDJcMTEzXDFcMjI0XDFcMTEzXDFcMFw1XDExM1wyXDBcMTZcMTEzIisKLSAgICAiXDFcMjI0XDJcMTEzXDFcMjI0XDJcMTEzXDFcMjI0XDEwXDExM1wxXDIyNFw0XDExMyIrCi0gICAgIlwxXDIyNFw3XDExM1wxXDBcMlwyMjVcMVwyMjZcMVwwXDFcMjI3XDExXDIyNSIrCi0gICAgIlwyXDBcNTJcMjI1XDFcMFwyXDIzMFwxXDIzMVwxXDBcM1wyMzBcMVwyMjciKwotICAgICJcNlwyMzBcMlwwXDUyXDIzMFwxXDBcMVwyMzJcMVwxMTNcMVwyMjJcM1wwIisKLSAgICAiXDFcMTEzXDNcMFwxXDIzM1wxXDBcMVwyMjBcNVwwXDNcMTEzXDFcMjIzIisKLSAgICAiXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXDExMlwxM1wwXDFcMjIwXDU2XDAiKwotICAgICJcMVwyMzRcNzJcMFwyXDIzNVwxXDIzNlwzXDBcMVwyMzVcM1wwXDFcMjM1IisKLSAgICAiXDdcMFwzXDIzNVwxXDBcMVwyMzVcN1wwXDExXDIzNVwxXDBcNFwyMzUiKwotICAgICJcMVwwXDJcMjM1XDFcMFwxXDIzNVwxXDBcM1wyMzVcNlwwXDJcMTEzIisKLSAgICAiXDFcMjIyXDNcMFwxXDExM1wzXDBcMVwxMTNcMVwyMzdcNlwwXDFcMTEzIisKLSAgICAiXDFcMjQwXDFcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcMFwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDExXDBcMVwyNDEiKwotICAgICJcMVwwXDFcMjQxXDJcMFwxXDI0MVw1XDBcMlwyNDFcMzBcMFwxXDI0MiIrCi0gICAgIlwyMVwwXDRcMjQzXDFcMjQ0XDFcMjQzXDFcMjQ0XDJcMjQzXDFcMjQ0XDVcMjQzIisKLSAgICAiXDJcMjQ0XDEyXDI0M1wxXDBcMTRcMjQzXDFcMFwyMlwyNDNcMVwwXDFcMjQ1IisKLSAgICAiXDFcMjVcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDI0NVwxXDBcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNSIrCi0gICAgIlw3XDBcMVwyNDVcMlwyNVwxXDI0NVwyXDI1XDFcMjQ1XDJcMjVcMVwwIisKLSAgICAiXDRcMjVcMVwwXDFcMjQ1XDFcMjVcMVwwXDFcMjVcMVwwXDFcMjQ1IisKLSAgICAiXDJcMjVcNlwwXDJcMjVcMVwxMzFcM1wwXDFcMjVcM1wwXDFcMjUiKwotICAgICJcN1wwXDNcMjVcMVwwXDFcMjVcMlwwXDFcMjQ2XDRcMFwxMVwyNSIrCi0gICAgIlwxXDBcNFwyNVwxXDBcMlwyNVwxXDBcMVwyNVwxXDBcM1wyNSIrCi0gICAgIlw2XDBcMVwyNDdcMlwxMzRcMVwwXDJcMTM0XDFcMjQ3XDFcMTM0XDFcMCIrCi0gICAgIlw1XDEzNFwyXDBcMTZcMTM0XDFcMjQ3XDJcMTM0XDFcMjQ3XDJcMTM0XDFcMjQ3IisKLSAgICAiXDEwXDEzNFwxXDI0N1w0XDEzNFwxXDI0N1w3XDEzNFwxXDBcMVwyNTBcMlwxMzYiKwotICAgICJcMVwwXDJcMTM2XDFcMjUwXDFcMTM2XDFcMFw1XDEzNlwyXDBcMTZcMTM2IisKLSAgICAiXDFcMjUwXDJcMTM2XDFcMjUwXDJcMTM2XDFcMjUwXDEwXDEzNlwxXDI1MFw0XDEzNiIrCi0gICAgIlwxXDI1MFw3XDEzNlwxM1wwXDFcMjUxXDU3XDBcMzVcMTQxXDFcMjUyXDM1XDE0MSIrCi0gICAgIlw0MVwwXDFcMjUzXDEwM1wwXDFcMjU0XDY1XDBcMlwyNTVcNjZcMFwyXDI1NiIrCi0gICAgIlwxMDNcMFwxXDI1N1wxN1wwXDJcMTQ3XDFcMTUwXDNcMFwxXDE0N1wzXDAiKwotICAgICJcMVwxNDdcN1wwXDNcMTQ3XDFcMjYwXDFcMTQ3XDdcMFwxMVwxNDdcMVwwIisKLSAgICAiXDRcMTQ3XDFcMFwyXDE0N1wxXDBcMVwxNDdcMVwwXDNcMTQ3XDZcMCIrCi0gICAgIlwxXDI2MVwyXDE0N1wxXDBcMlwxNDdcMVwyNjFcMVwxNDdcMVwwXDVcMTQ3IisKLSAgICAiXDJcMFwxNlwxNDdcMVwyNjFcMlwxNDdcMVwyNjFcMlwxNDdcMVwyNjFcMTBcMTQ3IisKLSAgICAiXDFcMjYxXDRcMTQ3XDFcMjYxXDdcMTQ3XDFcMFwxXDI2MlwxXDE1MVwxXDE1MiIrCi0gICAgIlwxXDE1MVwxXDI2M1wxXDE1MVwxXDI2MlwxMFwxNTFcMVwyNjRcMTZcMTUxXDFcMjYyIisKLSAgICAiXDJcMTUxXDFcMjYyXDJcMTUxXDFcMjYyXDEwXDE1MVwxXDI2Mlw0XDE1MVwxXDI2MiIrCi0gICAgIlw3XDE1MVwxXDBcMVwyNjVcMVwxNTRcMVwxNTVcM1wxNTRcMVwyNjVcMVwyNjYiKwotICAgICJcN1wxNTRcMVwyNjdcMTZcMTU0XDFcMjY1XDJcMTU0XDFcMjY1XDJcMTU0XDFcMjY1IisKLSAgICAiXDEwXDE1NFwxXDI2NVw0XDE1NFwxXDI2NVw3XDE1NFwzMlwwXDFcMjQ2XDQxXDAiKwotICAgICJcMVwyNzBcMVwxNTdcMVwxNjBcMVwxNTdcMVwyNzFcMVwxNTdcMVwyNzBcMTBcMTU3IisKLSAgICAiXDFcMjcyXDE2XDE1N1wxXDI3MFwyXDE1N1wxXDI3MFwyXDE1N1wxXDI3MFwxMFwxNTciKwotICAgICJcMVwyNzBcNFwxNTdcMVwyNzBcN1wxNTdcMVwwXDFcMjczXDFcMTYyXDFcMTYzIisKLSAgICAiXDNcMTYyXDFcMjczXDFcMjc0XDdcMTYyXDFcMjc1XDE2XDE2MlwxXDI3M1wyXDE2MiIrCi0gICAgIlwxXDI3M1wyXDE2MlwxXDI3M1wxMFwxNjJcMVwyNzNcNFwxNjJcMVwyNzNcN1wxNjIiKwotICAgICJcMjVcMFwxXDI3Nlw0NlwwXDFcMjc3XDFcNTFcMVwxNjVcMVw1MVwxXDAiKwotICAgICJcMVw1MVwxXDI3N1wxXDBcMVw1MVwxXDBcMVw1MVwzXDBcMlw1MSIrCi0gICAgIlwyXDBcM1w1MVwxXDBcMVw1MVw3XDBcMVwyNzdcMlw1MVwxXDI3NyIrCi0gICAgIlwyXDUxXDFcMjc3XDJcNTFcMVwwXDRcNTFcMVwwXDFcMjc3XDFcNTEiKwotICAgICJcMVwwXDFcNTFcMVwwXDFcMjc3XDJcNTFcNlwwXDJcNTFcMVwxNjUiKwotICAgICJcM1wwXDFcNTFcM1wwXDFcNTFcN1wwXDNcNTFcMVwwXDFcNTEiKwotICAgICJcMlwwXDFcMjQ2XDRcMFwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMVwzMDBcMVw1NVwxXDE3MCIrCi0gICAgIlwxXDU1XDFcMFwxXDU1XDFcMzAwXDFcMFwxXDU1XDFcMFwxXDU1IisKLSAgICAiXDNcMFwyXDU1XDJcMFwzXDU1XDFcMFwxXDU1XDdcMFwxXDMwMCIrCi0gICAgIlwyXDU1XDFcMzAwXDJcNTVcMVwzMDBcMlw1NVwxXDBcNFw1NVwxXDAiKwotICAgICJcMVwzMDBcMVw1NVwxXDBcMVw1NVwxXDBcMVwzMDBcMlw1NVw2XDAiKwotICAgICJcMlw1NVwxXDE3MFwzXDBcMVw1NVwzXDBcMVw1NVw3XDBcM1w1NSIrCi0gICAgIlwxXDBcMVw1NVwyXDBcMVwyNDZcNFwwXDExXDU1XDFcMFw0XDU1IisKLSAgICAiXDFcMFwyXDU1XDFcMFwxXDU1XDFcMFwzXDU1XDZcMFwxXDMwMSIrCi0gICAgIlwxXDYyXDFcMTczXDFcNjJcMVwwXDFcNjJcMVwzMDFcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcNjJcM1wwXDJcNjJcMlwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcN1wwXDFcMzAxXDJcNjJcMVwzMDFcMlw2MlwxXDMwMVwyXDYyXDFcMCIrCi0gICAgIlw0XDYyXDFcMFwxXDMwMVwxXDYyXDFcMFwxXDYyXDFcMFwxXDMwMSIrCi0gICAgIlwyXDYyXDZcMFwyXDYyXDFcMTczXDNcMFwxXDYyXDNcMFwxXDYyIisKLSAgICAiXDdcMFwzXDYyXDFcMFwxXDYyXDJcMFwxXDI0Nlw0XDBcMTFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcNlwwXDFcMzAyXDFcNzJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXDMwMiIrCi0gICAgIlwxXDBcMVw3MlwxXDBcMVw3MlwzXDBcMlw3MlwyXDBcM1w3MiIrCi0gICAgIlwxXDBcMVw3Mlw3XDBcMVwzMDJcMlw3MlwxXDMwMlwyXDcyXDFcMzAyIisKLSAgICAiXDJcNzJcMVwwXDRcNzJcMVwwXDFcMzAyXDFcNzJcMVwwXDFcNzIiKwotICAgICJcMVwwXDFcMzAyXDJcNzJcNlwwXDJcNzJcMVwyMDBcM1wwXDFcNzIiKwotICAgICJcM1wwXDFcNzJcN1wwXDNcNzJcMVwwXDFcNzJcMlwwXDFcMjQ2IisKLSAgICAiXDRcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MlwxXDBcMVw3MiIrCi0gICAgIlwxXDBcM1w3Mlw2XDBcMVwzMDNcMVwxMDBcMVwyMDNcMVwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDFcMzAzXDFcMFwxXDEwMFwxXDBcMVwxMDBcM1wwXDJcMTAwIisKLSAgICAiXDJcMFwzXDEwMFwxXDBcMVwxMDBcN1wwXDFcMzAzXDJcMTAwXDFcMzAzIisKLSAgICAiXDJcMTAwXDFcMzAzXDJcMTAwXDFcMFw0XDEwMFwxXDBcMVwzMDNcMVwxMDAiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDMwM1wyXDEwMFw2XDBcMVwzMDRcMVwyMDUiKwotICAgICJcMVwyMDZcMVwyMDVcMVwzMDVcMVwyMDVcMVwzMDRcMTBcMjA1XDFcMzA2XDE2XDIwNSIrCi0gICAgIlwxXDMwNFwyXDIwNVwxXDMwNFwyXDIwNVwxXDMwNFwxMFwyMDVcMVwzMDRcNFwyMDUiKwotICAgICJcMVwzMDRcN1wyMDVcMVwwXDFcMzA3XDFcMjEwXDFcMjExXDNcMjEwXDFcMzA3IisKLSAgICAiXDFcMzEwXDdcMjEwXDFcMzExXDE2XDIxMFwxXDMwN1wyXDIxMFwxXDMwN1wyXDIxMCIrCi0gICAgIlwxXDMwN1wxMFwyMTBcMVwzMDdcNFwyMTBcMVwzMDdcN1wyMTBcMVwwXDJcMTAwIisKLSAgICAiXDFcMjAzXDNcMFwxXDEwMFwzXDBcMVwxMDBcN1wwXDNcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwyXDBcMVwyNDZcNFwwXDExXDEwMFwxXDBcNFwxMDBcMVwwIisKLSAgICAiXDJcMTAwXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwXDFcMzEyXDFcMTA1IisKLSAgICAiXDFcMjEzXDFcMTA1XDFcMFwxXDEwNVwxXDMxMlwxXDBcMVwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDNcMFwyXDEwNVwyXDBcM1wxMDVcMVwwXDFcMTA1XDdcMCIrCi0gICAgIlwxXDMxMlwyXDEwNVwxXDMxMlwyXDEwNVwxXDMxMlwyXDEwNVwxXDBcNFwxMDUiKwotICAgICJcMVwwXDFcMzEyXDFcMTA1XDFcMFwxXDEwNVwxXDBcMVwzMTJcMlwxMDUiKwotICAgICJcNlwwXDJcMTA1XDFcMjEzXDNcMFwxXDEwNVwzXDBcMVwxMDVcN1wwIisKLSAgICAiXDNcMTA1XDFcMFwxXDEwNVwyXDBcMVwyNDZcNFwwXDExXDEwNVwxXDAiKwotICAgICJcNFwxMDVcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwIisKLSAgICAiXDJcMjE2XDFcMjE3XDNcMFwxXDIxNlwzXDBcMVwyMTZcN1wwXDNcMjE2IisKLSAgICAiXDFcMFwxXDIxNlw3XDBcMTFcMjE2XDFcMFw0XDIxNlwxXDBcMlwyMTYiKwotICAgICJcMVwwXDFcMjE2XDFcMFwzXDIxNlw2XDBcMVwzMTNcMlwyMTZcMVwwIisKLSAgICAiXDJcMjE2XDFcMzEzXDFcMjE2XDFcMFw1XDIxNlwyXDBcMTZcMjE2XDFcMzEzIisKLSAgICAiXDJcMjE2XDFcMzEzXDJcMjE2XDFcMzEzXDEwXDIxNlwxXDMxM1w0XDIxNlwxXDMxMyIrCi0gICAgIlw3XDIxNlwxXDBcMVwzMTRcMVwxMTNcMVwyMjJcMVwxMTNcMVwwXDFcMTEzIisKLSAgICAiXDFcMzE0XDFcMFwxXDExM1wxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMCIrCi0gICAgIlwzXDExM1wxXDIyM1wxXDExM1w3XDBcMVwzMTRcMlwxMTNcMVwzMTRcMlwxMTMiKwotICAgICJcMVwzMTRcMlwxMTNcMVwwXDRcMTEzXDFcMFwxXDMxNFwxXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVwwXDFcMzE0XDJcMTEzXDZcMFwxXDMxNVwxXDIyNVwxXDIyNiIrCi0gICAgIlwxXDIyNVwxXDMxNlwxXDIyNVwxXDMxNVwxMFwyMjVcMVwzMTdcMTZcMjI1XDFcMzE1IisKLSAgICAiXDJcMjI1XDFcMzE1XDJcMjI1XDFcMzE1XDEwXDIyNVwxXDMxNVw0XDIyNVwxXDMxNSIrCi0gICAgIlw3XDIyNVwxXDBcMVwzMjBcMVwyMzBcMVwyMzFcM1wyMzBcMVwzMjBcMVwzMjEiKwotICAgICJcN1wyMzBcMVwzMjJcMTZcMjMwXDFcMzIwXDJcMjMwXDFcMzIwXDJcMjMwXDFcMzIwIisKLSAgICAiXDEwXDIzMFwxXDMyMFw0XDIzMFwxXDMyMFw3XDIzMFwxXDBcMVwyMzJcMVwxMTMiKwotICAgICJcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1wxXDBcMVwyMjBcNVwwIisKLSAgICAiXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMCIrCi0gICAgIlwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDRcMFwxXDIyMVwxXDAiKwotICAgICJcMlwxMTNcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDBcM1wxMTMiKwotICAgICJcMVwyMjNcMVwxMTNcMlwwXDFcMjQ2XDRcMFwxMVwxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcMFwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXDIzNCIrCi0gICAgIlwxXDIxNlwxXDIxN1wzXDBcMVwyMTZcM1wwXDFcMjE2XDdcMFwzXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDBcNFwyMTZcMVwwXDJcMjE2IisKLSAgICAiXDFcMFwxXDIxNlwxXDBcM1wyMTZcNFwwXDFcMjIxXDFcMFwxXDMyMyIrCi0gICAgIlwyXDIzNVwxXDBcMlwyMzVcMVwzMjNcMVwyMzVcMVwwXDVcMjM1XDJcMCIrCi0gICAgIlwxNlwyMzVcMVwzMjNcMlwyMzVcMVwzMjNcMlwyMzVcMVwzMjNcMTBcMjM1XDFcMzIzIisKLSAgICAiXDRcMjM1XDFcMzIzXDdcMjM1XDFcMFwxXDMyNFw1XDBcMVwzMjRcMTFcMCIrCi0gICAgIlwxXDMyNFw1XDBcMVwzMjRcN1wwXDJcMzI0XDFcMFwyXDMyNFwxXDAiKwotICAgICJcMlwzMjRcN1wwXDJcMzI0XDNcMFwyXDMyNFw3XDBcMlwxMTNcMVwyMjIiKwotICAgICJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDBcMlwxMTNcMVwzMjVcMVwyMjMiKwotICAgICJcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcM1wxMTNcNTdcMFwxXDMyNlwyMVwwXDFcMzI3XDFcMjUiKwotICAgICJcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDMyN1wxXDBcMVwyNVwxXDAiKwotICAgICJcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNVw3XDAiKwotICAgICJcMVwzMjdcMlwyNVwxXDMyN1wyXDI1XDFcMzI3XDJcMjVcMVwwXDRcMjUiKwotICAgICJcMVwwXDFcMzI3XDFcMjVcMVwwXDFcMjVcMVwwXDFcMzI3XDJcMjUiKwotICAgICJcNlwwXDFcMzMwXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXDMzMCIrCi0gICAgIlwxXDBcMVwxMzRcMVwwXDFcMTM0XDNcMFwyXDEzNFwyXDBcM1wxMzQiKwotICAgICJcMVwwXDFcMTM0XDdcMFwxXDMzMFwyXDEzNFwxXDMzMFwyXDEzNFwxXDMzMCIrCi0gICAgIlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcMzMwXDFcMTM0XDFcMFwxXDEzNCIrCi0gICAgIlwxXDBcMVwzMzBcMlwxMzRcNlwwXDFcMzMxXDFcMTM2XDFcMTM3XDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwxXDMzMVwxXDBcMVwxMzZcMVwwXDFcMTM2XDNcMCIrCi0gICAgIlwyXDEzNlwyXDBcM1wxMzZcMVwwXDFcMTM2XDdcMFwxXDMzMVwyXDEzNiIrCi0gICAgIlwxXDMzMVwyXDEzNlwxXDMzMVwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcMzMxIisKLSAgICAiXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzMzFcMlwxMzZcMjBcMFwxXDMzMiIrCi0gICAgIlw1N1wwXDM0XDE0MVwxXDMzM1wxXDI1MlwzNVwxNDFcNDJcMFwyXDMzNFwxMDJcMCIrCi0gICAgIlwxXDMzNVw3NVwwXDJcMzM2XDc0XDBcMVwzMzdcNzZcMFwxXDM0MFw3XDAiKwotICAgICJcMVwzNDFcMVwzNDJcMVwyNjBcMVwwXDFcMjYwXDFcMzQxXDFcMFwxXDI2MCIrCi0gICAgIlwxXDBcMVwzNDFcM1wwXDJcMjYwXDJcMFwzXDM0MVwxXDBcMVwzNDEiKwotICAgICJcN1wwXDExXDM0MVwxXDBcNFwzNDFcMVwwXDJcMzQxXDFcMFwxXDM0MSIrCi0gICAgIlwxXDBcM1wzNDFcNlwwXDFcMzQzXDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1wxXDM0M1wxXDBcMVwxNDdcMVwwXDFcMTQ3XDNcMFwyXDE0NyIrCi0gICAgIlwyXDBcM1wxNDdcMVwyNjBcMVwxNDdcN1wwXDFcMzQzXDJcMTQ3XDFcMzQzIisKLSAgICAiXDJcMTQ3XDFcMzQzXDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVwzNDNcMVwxNDciKwotICAgICJcMVwwXDFcMTQ3XDFcMFwxXDM0M1wyXDE0N1w2XDBcMVwzNDRcMVwxNTEiKwotICAgICJcMVwxNTJcMVwxNTFcMVwxNTNcMVwxNTFcMVwzNDRcMjdcMTUxXDFcMzQ0XDJcMTUxIisKLSAgICAiXDFcMzQ0XDJcMTUxXDFcMzQ0XDEwXDE1MVwxXDM0NFw0XDE1MVwxXDM0NFw3XDE1MSIrCi0gICAgIlwxXDBcMlwxNTFcMVwxNTJcMVwwXDFcMTUzXDEyXDE1MVwxXDBcNTJcMTUxIisKLSAgICAiXDFcMFwxXDM0NVwxXDE1NFwxXDE1NVwzXDE1NFwxXDM0NVwxXDE1M1wyNlwxNTQiKwotICAgICJcMVwzNDVcMlwxNTRcMVwzNDVcMlwxNTRcMVwzNDVcMTBcMTU0XDFcMzQ1XDRcMTU0IisKLSAgICAiXDFcMzQ1XDdcMTU0XDFcMFwyXDE1NFwxXDE1NVwxXDBcM1wxNTRcMVwxNTMiKwotICAgICJcN1wxNTRcMVwwXDUyXDE1NFwxXDBcMVwzNDZcMVwxNTdcMVwxNjBcMVwxNTciKwotICAgICJcMVwxNjFcMVwxNTdcMVwzNDZcMjdcMTU3XDFcMzQ2XDJcMTU3XDFcMzQ2XDJcMTU3IisKLSAgICAiXDFcMzQ2XDEwXDE1N1wxXDM0Nlw0XDE1N1wxXDM0Nlw3XDE1N1wxXDBcMlwxNTciKwotICAgICJcMVwxNjBcMVwwXDFcMTYxXDEyXDE1N1wxXDBcNTJcMTU3XDFcMFwxXDM0NyIrCi0gICAgIlwxXDE2MlwxXDE2M1wzXDE2MlwxXDM0N1wxXDE2MVwyNlwxNjJcMVwzNDdcMlwxNjIiKwotICAgICJcMVwzNDdcMlwxNjJcMVwzNDdcMTBcMTYyXDFcMzQ3XDRcMTYyXDFcMzQ3XDdcMTYyIisKLSAgICAiXDFcMFwyXDE2MlwxXDE2M1wxXDBcM1wxNjJcMVwxNjFcN1wxNjJcMVwwIisKLSAgICAiXDUyXDE2MlwyNlwwXDFcMzUwXDQ1XDBcMVwzNTFcMVw1MVwxXDE2NVwxXDUxIisKLSAgICAiXDFcMFwxXDUxXDFcMzUxXDFcMFwxXDUxXDFcMFwxXDUxXDNcMCIrCi0gICAgIlwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXDM1MVwyXDUxIisKLSAgICAiXDFcMzUxXDJcNTFcMVwzNTFcMlw1MVwxXDBcNFw1MVwxXDBcMVwzNTEiKwotICAgICJcMVw1MVwxXDBcMVw1MVwxXDBcMVwzNTFcMlw1MVw2XDBcMVwzNTIiKwotICAgICJcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcMzUyXDFcMFwxXDU1IisKLSAgICAiXDFcMFwxXDU1XDNcMFwyXDU1XDJcMFwzXDU1XDFcMFwxXDU1IisKLSAgICAiXDdcMFwxXDM1MlwyXDU1XDFcMzUyXDJcNTVcMVwzNTJcMlw1NVwxXDAiKwotICAgICJcNFw1NVwxXDBcMVwzNTJcMVw1NVwxXDBcMVw1NVwxXDBcMVwzNTIiKwotICAgICJcMlw1NVw2XDBcMVwzNTNcMVw2MlwxXDE3M1wxXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMzUzXDFcMFwxXDYyXDFcMFwxXDYyXDNcMFwyXDYyXDJcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDdcMFwxXDM1M1wyXDYyXDFcMzUzXDJcNjIiKwotICAgICJcMVwzNTNcMlw2MlwxXDBcNFw2MlwxXDBcMVwzNTNcMVw2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMVwzNTNcMlw2Mlw2XDBcMVwzNTRcMVw3MlwxXDIwMCIrCi0gICAgIlwxXDcyXDFcMFwxXDcyXDFcMzU0XDFcMFwxXDcyXDFcMFwxXDcyIisKLSAgICAiXDNcMFwyXDcyXDJcMFwzXDcyXDFcMFwxXDcyXDdcMFwxXDM1NCIrCi0gICAgIlwyXDcyXDFcMzU0XDJcNzJcMVwzNTRcMlw3MlwxXDBcNFw3MlwxXDAiKwotICAgICJcMVwzNTRcMVw3MlwxXDBcMVw3MlwxXDBcMVwzNTRcMlw3Mlw2XDAiKwotICAgICJcMVwzNTVcMVwxMDBcMVwyMDNcMVwxMDBcMVwwXDFcMTAwXDFcMzU1XDFcMCIrCi0gICAgIlwxXDEwMFwxXDBcMVwxMDBcM1wwXDJcMTAwXDJcMFwzXDEwMFwxXDAiKwotICAgICJcMVwxMDBcN1wwXDFcMzU1XDJcMTAwXDFcMzU1XDJcMTAwXDFcMzU1XDJcMTAwIisKLSAgICAiXDFcMFw0XDEwMFwxXDBcMVwzNTVcMVwxMDBcMVwwXDFcMTAwXDFcMCIrCi0gICAgIlwxXDM1NVwyXDEwMFw2XDBcMVwzNTZcMVwyMDVcMVwyMDZcMVwyMDVcMVwyMDciKwotICAgICJcMVwyMDVcMVwzNTZcMjdcMjA1XDFcMzU2XDJcMjA1XDFcMzU2XDJcMjA1XDFcMzU2IisKLSAgICAiXDEwXDIwNVwxXDM1Nlw0XDIwNVwxXDM1Nlw3XDIwNVwxXDBcMlwyMDVcMVwyMDYiKwotICAgICJcMVwwXDFcMjA3XDEyXDIwNVwxXDBcNTJcMjA1XDFcMFwxXDM1N1wxXDIxMCIrCi0gICAgIlwxXDIxMVwzXDIxMFwxXDM1N1wxXDIwN1wyNlwyMTBcMVwzNTdcMlwyMTBcMVwzNTciKwotICAgICJcMlwyMTBcMVwzNTdcMTBcMjEwXDFcMzU3XDRcMjEwXDFcMzU3XDdcMjEwXDFcMCIrCi0gICAgIlwyXDIxMFwxXDIxMVwxXDBcM1wyMTBcMVwyMDdcN1wyMTBcMVwwXDUyXDIxMCIrCi0gICAgIlwxXDBcMVwzNjBcMVwxMDVcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcMzYwIisKLSAgICAiXDFcMFwxXDEwNVwxXDBcMVwxMDVcM1wwXDJcMTA1XDJcMFwzXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcN1wwXDFcMzYwXDJcMTA1XDFcMzYwXDJcMTA1XDFcMzYwIisKLSAgICAiXDJcMTA1XDFcMFw0XDEwNVwxXDBcMVwzNjBcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDFcMFwxXDM2MFwyXDEwNVw2XDBcMVwzNjFcMVwyMTZcMVwyMTdcMVwyMTYiKwotICAgICJcMVwwXDFcMjE2XDFcMzYxXDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIisKLSAgICAiXDJcMjE2XDJcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDFcMzYxXDJcMjE2IisKLSAgICAiXDFcMzYxXDJcMjE2XDFcMzYxXDJcMjE2XDFcMFw0XDIxNlwxXDBcMVwzNjEiKwotICAgICJcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXDM2MVwyXDIxNlw2XDBcMVwzNjIiKwotICAgICJcMVwxMTNcMVwyMjJcMVwxMTNcMVwwXDFcMTEzXDFcMzYyXDFcMFwxXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyM1wxXDExMyIrCi0gICAgIlw3XDBcMVwzNjJcMlwxMTNcMVwzNjJcMlwxMTNcMVwzNjJcMlwxMTNcMVwwIisKLSAgICAiXDRcMTEzXDFcMFwxXDM2MlwxXDExM1wxXDBcMVwxMTNcMVwwXDFcMzYyIisKLSAgICAiXDJcMTEzXDZcMFwxXDM2M1wxXDIyNVwxXDIyNlwxXDIyNVwxXDIyN1wxXDIyNSIrCi0gICAgIlwxXDM2M1wyN1wyMjVcMVwzNjNcMlwyMjVcMVwzNjNcMlwyMjVcMVwzNjNcMTBcMjI1IisKLSAgICAiXDFcMzYzXDRcMjI1XDFcMzYzXDdcMjI1XDFcMFwyXDIyNVwxXDIyNlwxXDAiKwotICAgICJcMVwyMjdcMTJcMjI1XDFcMFw1MlwyMjVcMVwwXDFcMzY0XDFcMjMwXDFcMjMxIisKLSAgICAiXDNcMjMwXDFcMzY0XDFcMjI3XDI2XDIzMFwxXDM2NFwyXDIzMFwxXDM2NFwyXDIzMCIrCi0gICAgIlwxXDM2NFwxMFwyMzBcMVwzNjRcNFwyMzBcMVwzNjRcN1wyMzBcMVwwXDJcMjMwIisKLSAgICAiXDFcMjMxXDFcMFwzXDIzMFwxXDIyN1w3XDIzMFwxXDBcNTJcMjMwXDFcMCIrCi0gICAgIlwxXDM2NVwxXDIzNVwxXDIzNlwxXDIzNVwxXDBcMVwyMzVcMVwzNjVcMVwwIisKLSAgICAiXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1XDFcMCIrCi0gICAgIlwxXDIzNVw3XDBcMVwzNjVcMlwyMzVcMVwzNjVcMlwyMzVcMVwzNjVcMlwyMzUiKwotICAgICJcMVwwXDRcMjM1XDFcMFwxXDM2NVwxXDIzNVwxXDBcMVwyMzVcMVwwIisKLSAgICAiXDFcMzY1XDJcMjM1XDZcMFwxXDM2Nlw1XDBcMVwzNjZcM1wwXDFcMzY3IisKLSAgICAiXDVcMFwxXDM2Nlw1XDBcMVwzNjZcN1wwXDJcMzY2XDFcMFwyXDM2NiIrCi0gICAgIlwxXDBcMlwzNjZcN1wwXDJcMzY2XDNcMFwyXDM2Nlw3XDBcMlwxMTMiKwotICAgICJcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDBcM1wxMTNcMVwzNzAiKwotICAgICJcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcM1wxMTNcNjBcMFwxXDM3MVwyMFwwXDFcMzcyXDFcMjUiKwotICAgICJcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDM3MlwxXDBcMVwyNVwxXDAiKwotICAgICJcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNVw3XDAiKwotICAgICJcMVwzNzJcMlwyNVwxXDM3MlwyXDI1XDFcMzcyXDJcMjVcMVwwXDRcMjUiKwotICAgICJcMVwwXDFcMzcyXDFcMjVcMVwwXDFcMjVcMVwwXDFcMzcyXDJcMjUiKwotICAgICJcNlwwXDFcMzczXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXDM3MyIrCi0gICAgIlwxXDBcMVwxMzRcMVwwXDFcMTM0XDNcMFwyXDEzNFwyXDBcM1wxMzQiKwotICAgICJcMVwwXDFcMTM0XDdcMFwxXDM3M1wyXDEzNFwxXDM3M1wyXDEzNFwxXDM3MyIrCi0gICAgIlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcMzczXDFcMTM0XDFcMFwxXDEzNCIrCi0gICAgIlwxXDBcMVwzNzNcMlwxMzRcNlwwXDFcMzc0XDFcMTM2XDFcMTM3XDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwxXDM3NFwxXDBcMVwxMzZcMVwwXDFcMTM2XDNcMCIrCi0gICAgIlwyXDEzNlwyXDBcM1wxMzZcMVwwXDFcMTM2XDdcMFwxXDM3NFwyXDEzNiIrCi0gICAgIlwxXDM3NFwyXDEzNlwxXDM3NFwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcMzc0IisKLSAgICAiXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzNzRcMlwxMzZcMzFcMFwxXDM3NSIrCi0gICAgIlwxMjJcMFwxXDM3Nlw2N1wwXDFcMzc3XDY2XDBcMlx1MDEwMFw3M1wwXDFcdTAxMDEiKwotICAgICJcMjRcMFwyXDM0MVwxXDM0MlwxXHUwMTAyXDFcMFwxXHUwMTAyXDFcMzQxXDFcMCIrCi0gICAgIlwxXHUwMTAyXDFcdTAxMDNcMVwzNDFcM1wwXDJcdTAxMDJcMlwwXDNcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVw3XDBcMTFcMzQxXDFcMFw0XDM0MVwxXDBcMlwzNDFcMVwwIisKLSAgICAiXDFcMzQxXDFcMFwzXDM0MVw2XDBcMVx1MDEwNFwyXDM0MVwxXDBcMlwzNDEiKwotICAgICJcMVx1MDEwNFwxXDM0MVwxXDBcNVwzNDFcMlwwXDE2XDM0MVwxXHUwMTA0XDJcMzQxIisKLSAgICAiXDFcdTAxMDRcMlwzNDFcMVx1MDEwNFwxMFwzNDFcMVx1MDEwNFw0XDM0MVwxXHUwMTA0XDdcMzQxIisKLSAgICAiXDFcMFwxXHUwMTA1XDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTA1IisKLSAgICAiXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0NyIrCi0gICAgIlwxXDI2MFwxXDE0N1w3XDBcMVx1MDEwNVwyXDE0N1wxXHUwMTA1XDJcMTQ3XDFcdTAxMDUiKwotICAgICJcMlwxNDdcMVwwXDRcMTQ3XDFcMFwxXHUwMTA1XDFcMTQ3XDFcMFwxXDE0NyIrCi0gICAgIlwxXDBcMVx1MDEwNVwyXDE0N1w2XDBcMVx1MDEwNlwxXDE1MVwxXDE1MlwxXDE1MSIrCi0gICAgIlwxXDE1M1wxXDE1MVwxXHUwMTA2XDI3XDE1MVwxXHUwMTA2XDJcMTUxXDFcdTAxMDZcMlwxNTEiKwotICAgICJcMVx1MDEwNlwxMFwxNTFcMVx1MDEwNlw0XDE1MVwxXHUwMTA2XDdcMTUxXDFcMFwxXHUwMTA3IisKLSAgICAiXDFcMTU0XDFcMTU1XDNcMTU0XDFcdTAxMDdcMVwxNTNcMjZcMTU0XDFcdTAxMDdcMlwxNTQiKwotICAgICJcMVx1MDEwN1wyXDE1NFwxXHUwMTA3XDEwXDE1NFwxXHUwMTA3XDRcMTU0XDFcdTAxMDdcN1wxNTQiKwotICAgICJcMVwwXDFcdTAxMDhcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDEwOCIrCi0gICAgIlwyN1wxNTdcMVx1MDEwOFwyXDE1N1wxXHUwMTA4XDJcMTU3XDFcdTAxMDhcMTBcMTU3XDFcdTAxMDgiKwotICAgICJcNFwxNTdcMVx1MDEwOFw3XDE1N1wxXDBcMVx1MDEwOVwxXDE2MlwxXDE2M1wzXDE2MiIrCi0gICAgIlwxXHUwMTA5XDFcMTYxXDI2XDE2MlwxXHUwMTA5XDJcMTYyXDFcdTAxMDlcMlwxNjJcMVx1MDEwOSIrCi0gICAgIlwxMFwxNjJcMVx1MDEwOVw0XDE2MlwxXHUwMTA5XDdcMTYyXDFcMFwyXHUwMTBhXDFcdTAxMGIiKwotICAgICJcMVwzNTBcMVx1MDEwY1wxXDM1MFwxXHUwMTBhXDFcdTAxMGRcMVwzNTBcMVx1MDEwZVw0XHUwMTBhIisKLSAgICAiXDJcMzUwXDVcdTAxMGFcMVwwXDQ0XHUwMTBhXDFcMFwxXHUwMTBmXDFcNTFcMVwxNjUiKwotICAgICJcMVw1MVwxXDBcMVw1MVwxXHUwMTBmXDFcMFwxXDUxXDFcMFwxXDUxIisKLSAgICAiXDNcMFwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXHUwMTBmIisKLSAgICAiXDJcNTFcMVx1MDEwZlwyXDUxXDFcdTAxMGZcMlw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMVx1MDEwZlwxXDUxXDFcMFwxXDUxXDFcMFwxXHUwMTBmXDJcNTFcNlwwIisKLSAgICAiXDFcdTAxMTBcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcdTAxMTBcMVwwIisKLSAgICAiXDFcNTVcMVwwXDFcNTVcM1wwXDJcNTVcMlwwXDNcNTVcMVwwIisKLSAgICAiXDFcNTVcN1wwXDFcdTAxMTBcMlw1NVwxXHUwMTEwXDJcNTVcMVx1MDExMFwyXDU1IisKLSAgICAiXDFcMFw0XDU1XDFcMFwxXHUwMTEwXDFcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDFcdTAxMTBcMlw1NVw2XDBcMVx1MDExMVwxXDYyXDFcMTczXDFcNjJcMVwwIisKLSAgICAiXDFcNjJcMVx1MDExMVwxXDBcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MiIrCi0gICAgIlwyXDBcM1w2MlwxXDBcMVw2Mlw3XDBcMVx1MDExMVwyXDYyXDFcdTAxMTEiKwotICAgICJcMlw2MlwxXHUwMTExXDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxMTFcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMVx1MDExMVwyXDYyXDZcMFwxXHUwMTEyXDFcNzIiKwotICAgICJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXHUwMTEyXDFcMFwxXDcyXDFcMCIrCi0gICAgIlwxXDcyXDNcMFwyXDcyXDJcMFwzXDcyXDFcMFwxXDcyXDdcMCIrCi0gICAgIlwxXHUwMTEyXDJcNzJcMVx1MDExMlwyXDcyXDFcdTAxMTJcMlw3MlwxXDBcNFw3MiIrCi0gICAgIlwxXDBcMVx1MDExMlwxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTEyXDJcNzIiKwotICAgICJcNlwwXDFcdTAxMTNcMVwxMDBcMVwyMDNcMVwxMDBcMVwwXDFcMTAwXDFcdTAxMTMiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDEwMFwzXDBcMlwxMDBcMlwwXDNcMTAwIisKLSAgICAiXDFcMFwxXDEwMFw3XDBcMVx1MDExM1wyXDEwMFwxXHUwMTEzXDJcMTAwXDFcdTAxMTMiKwotICAgICJcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTEzXDFcMTAwXDFcMFwxXDEwMCIrCi0gICAgIlwxXDBcMVx1MDExM1wyXDEwMFw2XDBcMVx1MDExNFwxXDIwNVwxXDIwNlwxXDIwNSIrCi0gICAgIlwxXDIwN1wxXDIwNVwxXHUwMTE0XDI3XDIwNVwxXHUwMTE0XDJcMjA1XDFcdTAxMTRcMlwyMDUiKwotICAgICJcMVx1MDExNFwxMFwyMDVcMVx1MDExNFw0XDIwNVwxXHUwMTE0XDdcMjA1XDFcMFwxXHUwMTE1IisKLSAgICAiXDFcMjEwXDFcMjExXDNcMjEwXDFcdTAxMTVcMVwyMDdcMjZcMjEwXDFcdTAxMTVcMlwyMTAiKwotICAgICJcMVx1MDExNVwyXDIxMFwxXHUwMTE1XDEwXDIxMFwxXHUwMTE1XDRcMjEwXDFcdTAxMTVcN1wyMTAiKwotICAgICJcMVwwXDFcdTAxMTZcMVwxMDVcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcdTAxMTYiKwotICAgICJcMVwwXDFcMTA1XDFcMFwxXDEwNVwzXDBcMlwxMDVcMlwwXDNcMTA1IisKLSAgICAiXDFcMFwxXDEwNVw3XDBcMVx1MDExNlwyXDEwNVwxXHUwMTE2XDJcMTA1XDFcdTAxMTYiKwotICAgICJcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTE2XDFcMTA1XDFcMFwxXDEwNSIrCi0gICAgIlwxXDBcMVx1MDExNlwyXDEwNVw2XDBcMVx1MDExN1wxXDIxNlwxXDIxN1wxXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcMVx1MDExN1wxXDBcMVwyMTZcMVwwXDFcMjE2XDNcMCIrCi0gICAgIlwyXDIxNlwyXDBcM1wyMTZcMVwwXDFcMjE2XDdcMFwxXHUwMTE3XDJcMjE2IisKLSAgICAiXDFcdTAxMTdcMlwyMTZcMVx1MDExN1wyXDIxNlwxXDBcNFwyMTZcMVwwXDFcdTAxMTciKwotICAgICJcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXHUwMTE3XDJcMjE2XDZcMFwxXHUwMTE4IisKLSAgICAiXDFcMTEzXDFcMjIyXDFcMTEzXDFcMFwxXDExM1wxXHUwMTE4XDFcMFwxXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyM1wxXDExMyIrCi0gICAgIlw3XDBcMVx1MDExOFwyXDExM1wxXHUwMTE4XDJcMTEzXDFcdTAxMThcMlwxMTNcMVwwIisKLSAgICAiXDRcMTEzXDFcMFwxXHUwMTE4XDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDExOCIrCi0gICAgIlwyXDExM1w2XDBcMVx1MDExOVwxXDIyNVwxXDIyNlwxXDIyNVwxXDIyN1wxXDIyNSIrCi0gICAgIlwxXHUwMTE5XDI3XDIyNVwxXHUwMTE5XDJcMjI1XDFcdTAxMTlcMlwyMjVcMVx1MDExOVwxMFwyMjUiKwotICAgICJcMVx1MDExOVw0XDIyNVwxXHUwMTE5XDdcMjI1XDFcMFwxXHUwMTFhXDFcMjMwXDFcMjMxIisKLSAgICAiXDNcMjMwXDFcdTAxMWFcMVwyMjdcMjZcMjMwXDFcdTAxMWFcMlwyMzBcMVx1MDExYVwyXDIzMCIrCi0gICAgIlwxXHUwMTFhXDEwXDIzMFwxXHUwMTFhXDRcMjMwXDFcdTAxMWFcN1wyMzBcMVwwXDFcdTAxMWIiKwotICAgICJcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxMWJcMVwwXDFcMjM1IisKLSAgICAiXDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1XDFcMFwxXDIzNSIrCi0gICAgIlw3XDBcMVx1MDExYlwyXDIzNVwxXHUwMTFiXDJcMjM1XDFcdTAxMWJcMlwyMzVcMVwwIisKLSAgICAiXDRcMjM1XDFcMFwxXHUwMTFiXDFcMjM1XDFcMFwxXDIzNVwxXDBcMVx1MDExYiIrCi0gICAgIlwyXDIzNVw2XDBcMVx1MDExY1w1XDBcMVx1MDExY1wzXDBcMVwzNjdcNVwwIisKLSAgICAiXDFcdTAxMWNcNVwwXDFcdTAxMWNcN1wwXDJcdTAxMWNcMVwwXDJcdTAxMWNcMVwwIisKLSAgICAiXDJcdTAxMWNcN1wwXDJcdTAxMWNcM1wwXDJcdTAxMWNcN1wwXDFcdTAxMWRcNVwwIisKLSAgICAiXDFcdTAxMWRcMTFcMFwxXHUwMTFkXDVcMFwxXHUwMTFkXDdcMFwyXHUwMTFkXDFcMCIrCi0gICAgIlwyXHUwMTFkXDFcMFwyXHUwMTFkXDdcMFwyXHUwMTFkXDNcMFwyXHUwMTFkXDdcMCIrCi0gICAgIlwyXHUwMTFlXDFcdTAxMWZcMVx1MDEyMFwxXHUwMTIxXDFcdTAxMjBcMVx1MDExZVwxXHUwMTIyXDFcdTAxMjAiKwotICAgICJcMVx1MDEyM1w0XHUwMTFlXDJcdTAxMjBcNVx1MDExZVwxXDBcNDRcdTAxMWVcNTRcMFwxXHUwMTI0IisKLSAgICAiXDE3XDBcMVx1MDEyNVwxXDI1XDFcMTMxXDFcMjVcMVwwXDFcMjVcMVx1MDEyNSIrCi0gICAgIlwxXDBcMVwyNVwxXDBcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNSIrCi0gICAgIlwxXDBcMVwyNVw3XDBcMVx1MDEyNVwyXDI1XDFcdTAxMjVcMlwyNVwxXHUwMTI1IisKLSAgICAiXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxMjVcMVwyNVwxXDBcMVwyNSIrCi0gICAgIlwxXDBcMVx1MDEyNVwyXDI1XDZcMFwxXHUwMTI2XDFcMTM0XDFcMTM1XDFcMTM0IisKLSAgICAiXDFcMFwxXDEzNFwxXHUwMTI2XDFcMFwxXDEzNFwxXDBcMVwxMzRcM1wwIisKLSAgICAiXDJcMTM0XDJcMFwzXDEzNFwxXDBcMVwxMzRcN1wwXDFcdTAxMjZcMlwxMzQiKwotICAgICJcMVx1MDEyNlwyXDEzNFwxXHUwMTI2XDJcMTM0XDFcMFw0XDEzNFwxXDBcMVx1MDEyNiIrCi0gICAgIlwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxMjZcMlwxMzRcNlwwXDFcdTAxMjciKwotICAgICJcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxMjdcMVwwXDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwzXDBcMlwxMzZcMlwwXDNcMTM2XDFcMFwxXDEzNiIrCi0gICAgIlw3XDBcMVx1MDEyN1wyXDEzNlwxXHUwMTI3XDJcMTM2XDFcdTAxMjdcMlwxMzZcMVwwIisKLSAgICAiXDRcMTM2XDFcMFwxXHUwMTI3XDFcMTM2XDFcMFwxXDEzNlwxXDBcMVx1MDEyNyIrCi0gICAgIlwyXDEzNlw1MVwwXDFcdTAxMjhcNTJcMFwxXHUwMTI5XDExMFwwXDJcdTAxMmFcNDJcMCIrCi0gICAgIlwxXHUwMTJiXDYzXDBcMVx1MDEwMlwxXDBcMVx1MDEwMlwyXDBcMVx1MDEwMlwxXHUwMTAzIisKLSAgICAiXDRcMFwyXHUwMTAyXDUzXDBcMVx1MDEyY1wxXDM0MVwxXDM0MlwxXDM0MVwxXDAiKwotICAgICJcMVwzNDFcMVx1MDEyY1wxXDBcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDEiKwotICAgICJcMlwwXDNcMzQxXDFcMFwxXDM0MVw3XDBcMVx1MDEyY1wyXDM0MVwxXHUwMTJjIisKLSAgICAiXDJcMzQxXDFcdTAxMmNcMlwzNDFcMVwwXDRcMzQxXDFcMFwxXHUwMTJjXDFcMzQxIisKLSAgICAiXDFcMFwxXDM0MVwxXDBcMVx1MDEyY1wyXDM0MVw2XDBcMVx1MDEyZFwxXDE0NyIrCi0gICAgIlwxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVx1MDEyZFwxXDBcMVwxNDdcMVwwIisKLSAgICAiXDFcMTQ3XDNcMFwyXDE0N1wyXDBcM1wxNDdcMVwyNjBcMVwxNDdcN1wwIisKLSAgICAiXDFcdTAxMmRcMlwxNDdcMVx1MDEyZFwyXDE0N1wxXHUwMTJkXDJcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMVx1MDEyZFwxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxMmRcMlwxNDciKwotICAgICJcNlwwXDFcdTAxMmVcMVwxNTFcMVwxNTJcMVwxNTFcMVwxNTNcMVwxNTFcMVx1MDEyZSIrCi0gICAgIlwyN1wxNTFcMVx1MDEyZVwyXDE1MVwxXHUwMTJlXDJcMTUxXDFcdTAxMmVcMTBcMTUxXDFcdTAxMmUiKwotICAgICJcNFwxNTFcMVx1MDEyZVw3XDE1MVwxXDBcMVx1MDEyZlwxXDE1NFwxXDE1NVwzXDE1NCIrCi0gICAgIlwxXHUwMTJmXDFcMTUzXDI2XDE1NFwxXHUwMTJmXDJcMTU0XDFcdTAxMmZcMlwxNTRcMVx1MDEyZiIrCi0gICAgIlwxMFwxNTRcMVx1MDEyZlw0XDE1NFwxXHUwMTJmXDdcMTU0XDFcMFwxXHUwMTMwXDFcMTU3IisKLSAgICAiXDFcMTYwXDFcMTU3XDFcMTYxXDFcMTU3XDFcdTAxMzBcMjdcMTU3XDFcdTAxMzBcMlwxNTciKwotICAgICJcMVx1MDEzMFwyXDE1N1wxXHUwMTMwXDEwXDE1N1wxXHUwMTMwXDRcMTU3XDFcdTAxMzBcN1wxNTciKwotICAgICJcMVwwXDFcdTAxMzFcMVwxNjJcMVwxNjNcM1wxNjJcMVx1MDEzMVwxXDE2MVwyNlwxNjIiKwotICAgICJcMVx1MDEzMVwyXDE2MlwxXHUwMTMxXDJcMTYyXDFcdTAxMzFcMTBcMTYyXDFcdTAxMzFcNFwxNjIiKwotICAgICJcMVx1MDEzMVw3XDE2MlwxXDBcMlx1MDEwYVwxXHUwMTBiXDFcdTAxMzJcMVwwXDJcdTAxMGEiKwotICAgICJcMVwwXDFcdTAxMzJcMVx1MDEwZVw0XHUwMTBhXDJcdTAxMzJcNVx1MDEwYVwxXDBcNDRcdTAxMGEiKwotICAgICJcMVwwXDFcdTAxMzNcMVx1MDEwYVwxXHUwMTBiXDFcdTAxMzJcMlx1MDEwYVwxXHUwMTMzXDFcdTAxMGEiKwotICAgICJcMVx1MDEzMlwxXHUwMTM0XDRcdTAxMGFcMlx1MDEzMlwxNlx1MDEwYVwxXHUwMTMzXDJcdTAxMGFcMVx1MDEzMyIrCi0gICAgIlwyXHUwMTBhXDFcdTAxMzNcMTBcdTAxMGFcMVx1MDEzM1w0XHUwMTBhXDFcdTAxMzNcN1x1MDEwYVwxXDAiKwotICAgICJcMlx1MDEwY1wxXHUwMTM1XDFcMFwxXHUwMTMyXDExXHUwMTBjXDJcMFw1Mlx1MDEwY1wxXDAiKwotICAgICJcMlx1MDEwZFwxXHUwMTM2XDFcMFwzXHUwMTBkXDFcdTAxMzJcNlx1MDEwZFwyXDBcNTJcdTAxMGQiKwotICAgICJcMVwwXDFcdTAxMzdcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcdTAxMzciKwotICAgICJcMVwwXDFcNTFcMVwwXDFcNTFcM1wwXDJcNTFcMlwwXDNcNTEiKwotICAgICJcMVwwXDFcNTFcN1wwXDFcdTAxMzdcMlw1MVwxXHUwMTM3XDJcNTFcMVx1MDEzNyIrCi0gICAgIlwyXDUxXDFcMFw0XDUxXDFcMFwxXHUwMTM3XDFcNTFcMVwwXDFcNTEiKwotICAgICJcMVwwXDFcdTAxMzdcMlw1MVw2XDBcMVx1MDEzOFwxXDU1XDFcMTcwXDFcNTUiKwotICAgICJcMVwwXDFcNTVcMVx1MDEzOFwxXDBcMVw1NVwxXDBcMVw1NVwzXDAiKwotICAgICJcMlw1NVwyXDBcM1w1NVwxXDBcMVw1NVw3XDBcMVx1MDEzOFwyXDU1IisKLSAgICAiXDFcdTAxMzhcMlw1NVwxXHUwMTM4XDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxMzgiKwotICAgICJcMVw1NVwxXDBcMVw1NVwxXDBcMVx1MDEzOFwyXDU1XDZcMFwxXHUwMTM5IisKLSAgICAiXDFcNjJcMVwxNzNcMVw2MlwxXDBcMVw2MlwxXHUwMTM5XDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDNcMFwyXDYyXDJcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDdcMFwxXHUwMTM5XDJcNjJcMVx1MDEzOVwyXDYyXDFcdTAxMzlcMlw2MlwxXDAiKwotICAgICJcNFw2MlwxXDBcMVx1MDEzOVwxXDYyXDFcMFwxXDYyXDFcMFwxXHUwMTM5IisKLSAgICAiXDJcNjJcNlwwXDFcdTAxM2FcMVw3MlwxXDIwMFwxXDcyXDFcMFwxXDcyIisKLSAgICAiXDFcdTAxM2FcMVwwXDFcNzJcMVwwXDFcNzJcM1wwXDJcNzJcMlwwIisKLSAgICAiXDNcNzJcMVwwXDFcNzJcN1wwXDFcdTAxM2FcMlw3MlwxXHUwMTNhXDJcNzIiKwotICAgICJcMVx1MDEzYVwyXDcyXDFcMFw0XDcyXDFcMFwxXHUwMTNhXDFcNzJcMVwwIisKLSAgICAiXDFcNzJcMVwwXDFcdTAxM2FcMlw3Mlw2XDBcMVx1MDEzYlwxXDEwMFwxXDIwMyIrCi0gICAgIlwxXDEwMFwxXDBcMVwxMDBcMVx1MDEzYlwxXDBcMVwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDNcMFwyXDEwMFwyXDBcM1wxMDBcMVwwXDFcMTAwXDdcMFwxXHUwMTNiIisKLSAgICAiXDJcMTAwXDFcdTAxM2JcMlwxMDBcMVx1MDEzYlwyXDEwMFwxXDBcNFwxMDBcMVwwIisKLSAgICAiXDFcdTAxM2JcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXHUwMTNiXDJcMTAwXDZcMCIrCi0gICAgIlwxXHUwMTNjXDFcMjA1XDFcMjA2XDFcMjA1XDFcMjA3XDFcMjA1XDFcdTAxM2NcMjdcMjA1IisKLSAgICAiXDFcdTAxM2NcMlwyMDVcMVx1MDEzY1wyXDIwNVwxXHUwMTNjXDEwXDIwNVwxXHUwMTNjXDRcMjA1IisKLSAgICAiXDFcdTAxM2NcN1wyMDVcMVwwXDFcdTAxM2RcMVwyMTBcMVwyMTFcM1wyMTBcMVx1MDEzZCIrCi0gICAgIlwxXDIwN1wyNlwyMTBcMVx1MDEzZFwyXDIxMFwxXHUwMTNkXDJcMjEwXDFcdTAxM2RcMTBcMjEwIisKLSAgICAiXDFcdTAxM2RcNFwyMTBcMVx1MDEzZFw3XDIxMFwxXDBcMVx1MDEzZVwxXDEwNVwxXDIxMyIrCi0gICAgIlwxXDEwNVwxXDBcMVwxMDVcMVx1MDEzZVwxXDBcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDNcMFwyXDEwNVwyXDBcM1wxMDVcMVwwXDFcMTA1XDdcMFwxXHUwMTNlIisKLSAgICAiXDJcMTA1XDFcdTAxM2VcMlwxMDVcMVx1MDEzZVwyXDEwNVwxXDBcNFwxMDVcMVwwIisKLSAgICAiXDFcdTAxM2VcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXHUwMTNlXDJcMTA1XDZcMCIrCi0gICAgIlwxXHUwMTNmXDFcMjE2XDFcMjE3XDFcMjE2XDFcMFwxXDIxNlwxXHUwMTNmXDFcMCIrCi0gICAgIlwxXDIxNlwxXDBcMVwyMTZcM1wwXDJcMjE2XDJcMFwzXDIxNlwxXDAiKwotICAgICJcMVwyMTZcN1wwXDFcdTAxM2ZcMlwyMTZcMVx1MDEzZlwyXDIxNlwxXHUwMTNmXDJcMjE2IisKLSAgICAiXDFcMFw0XDIxNlwxXDBcMVx1MDEzZlwxXDIxNlwxXDBcMVwyMTZcMVwwIisKLSAgICAiXDFcdTAxM2ZcMlwyMTZcNlwwXDFcdTAxNDBcMVwxMTNcMVwyMjJcMVwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcdTAxNDBcMVwwXDFcMTEzXDFcMFwxXDExM1wzXDBcMlwxMTMiKwotICAgICJcMlwwXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxXHUwMTQwXDJcMTEzXDFcdTAxNDAiKwotICAgICJcMlwxMTNcMVx1MDE0MFwyXDExM1wxXDBcNFwxMTNcMVwwXDFcdTAxNDBcMVwxMTMiKwotICAgICJcMVwwXDFcMTEzXDFcMFwxXHUwMTQwXDJcMTEzXDZcMFwxXHUwMTQxXDFcMjI1IisKLSAgICAiXDFcMjI2XDFcMjI1XDFcMjI3XDFcMjI1XDFcdTAxNDFcMjdcMjI1XDFcdTAxNDFcMlwyMjUiKwotICAgICJcMVx1MDE0MVwyXDIyNVwxXHUwMTQxXDEwXDIyNVwxXHUwMTQxXDRcMjI1XDFcdTAxNDFcN1wyMjUiKwotICAgICJcMVwwXDFcdTAxNDJcMVwyMzBcMVwyMzFcM1wyMzBcMVx1MDE0MlwxXDIyN1wyNlwyMzAiKwotICAgICJcMVx1MDE0MlwyXDIzMFwxXHUwMTQyXDJcMjMwXDFcdTAxNDJcMTBcMjMwXDFcdTAxNDJcNFwyMzAiKwotICAgICJcMVx1MDE0Mlw3XDIzMFwxXDBcMVx1MDE0M1wxXDIzNVwxXDIzNlwxXDIzNVwxXDAiKwotICAgICJcMVwyMzVcMVx1MDE0M1wxXDBcMVwyMzVcMVwwXDFcMjM1XDNcMFwyXDIzNSIrCi0gICAgIlwyXDBcM1wyMzVcMVwwXDFcMjM1XDdcMFwxXHUwMTQzXDJcMjM1XDFcdTAxNDMiKwotICAgICJcMlwyMzVcMVx1MDE0M1wyXDIzNVwxXDBcNFwyMzVcMVwwXDFcdTAxNDNcMVwyMzUiKwotICAgICJcMVwwXDFcMjM1XDFcMFwxXHUwMTQzXDJcMjM1XDZcMFwxXHUwMTQ0XDVcMCIrCi0gICAgIlwxXHUwMTQ0XDNcMFwxXDM2N1w1XDBcMVx1MDE0NFw1XDBcMVx1MDE0NFw3XDAiKwotICAgICJcMlx1MDE0NFwxXDBcMlx1MDE0NFwxXDBcMlx1MDE0NFw3XDBcMlx1MDE0NFwzXDAiKwotICAgICJcMlx1MDE0NFw3XDBcMVx1MDE0NVw1XDBcMVx1MDE0NVwxMVwwXDFcdTAxNDVcNVwwIisKLSAgICAiXDFcdTAxNDVcN1wwXDJcdTAxNDVcMVwwXDJcdTAxNDVcMVwwXDJcdTAxNDVcN1wwIisKLSAgICAiXDJcdTAxNDVcM1wwXDJcdTAxNDVcN1wwXDJcdTAxMWVcMVx1MDExZlwxXHUwMTQ2XDFcMCIrCi0gICAgIlwyXHUwMTFlXDFcMFwxXHUwMTQ2XDFcdTAxMjNcNFx1MDExZVwyXHUwMTQ2XDVcdTAxMWVcMVwwIisKLSAgICAiXDQ0XHUwMTFlXDFcMFwxXHUwMTQ3XDFcdTAxMWVcMVx1MDExZlwxXHUwMTQ2XDJcdTAxMWVcMVx1MDE0NyIrCi0gICAgIlwxXHUwMTFlXDFcdTAxNDZcMVx1MDE0OFw0XHUwMTFlXDJcdTAxNDZcMTZcdTAxMWVcMVx1MDE0N1wyXHUwMTFlIisKLSAgICAiXDFcdTAxNDdcMlx1MDExZVwxXHUwMTQ3XDEwXHUwMTFlXDFcdTAxNDdcNFx1MDExZVwxXHUwMTQ3XDdcdTAxMWUiKwotICAgICJcMVwwXDJcdTAxMjFcMVx1MDE0OVwxXDBcMVx1MDE0NlwxMVx1MDEyMVwyXDBcNTJcdTAxMjEiKwotICAgICJcMVwwXDJcdTAxMjJcMVx1MDE0YVwxXDBcM1x1MDEyMlwxXHUwMTQ2XDZcdTAxMjJcMlwwIisKLSAgICAiXDUyXHUwMTIyXDI0XDBcMVx1MDE0Ylw0N1wwXDFcdTAxNGNcMVwyNVwxXDEzMVwxXDI1IisKLSAgICAiXDFcMFwxXDI1XDFcdTAxNGNcMVwwXDFcMjVcMVwwXDFcMjVcM1wwIisKLSAgICAiXDJcMjVcMlwwXDNcMjVcMVwwXDFcMjVcN1wwXDFcdTAxNGNcMlwyNSIrCi0gICAgIlwxXHUwMTRjXDJcMjVcMVx1MDE0Y1wyXDI1XDFcMFw0XDI1XDFcMFwxXHUwMTRjIisKLSAgICAiXDFcMjVcMVwwXDFcMjVcMVwwXDFcdTAxNGNcMlwyNVw2XDBcMVx1MDE0ZCIrCi0gICAgIlwxXDEzNFwxXDEzNVwxXDEzNFwxXDBcMVwxMzRcMVx1MDE0ZFwxXDBcMVwxMzQiKwotICAgICJcMVwwXDFcMTM0XDNcMFwyXDEzNFwyXDBcM1wxMzRcMVwwXDFcMTM0IisKLSAgICAiXDdcMFwxXHUwMTRkXDJcMTM0XDFcdTAxNGRcMlwxMzRcMVx1MDE0ZFwyXDEzNFwxXDAiKwotICAgICJcNFwxMzRcMVwwXDFcdTAxNGRcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXHUwMTRkIisKLSAgICAiXDJcMTM0XDZcMFwxXHUwMTRlXDFcMTM2XDFcMTM3XDFcMTM2XDFcMFwxXDEzNiIrCi0gICAgIlwxXHUwMTRlXDFcMFwxXDEzNlwxXDBcMVwxMzZcM1wwXDJcMTM2XDJcMCIrCi0gICAgIlwzXDEzNlwxXDBcMVwxMzZcN1wwXDFcdTAxNGVcMlwxMzZcMVx1MDE0ZVwyXDEzNiIrCi0gICAgIlwxXHUwMTRlXDJcMTM2XDFcMFw0XDEzNlwxXDBcMVx1MDE0ZVwxXDEzNlwxXDAiKwotICAgICJcMVwxMzZcMVwwXDFcdTAxNGVcMlwxMzZcNTJcMFwyXHUwMTRmXDczXDBcMVx1MDE1MCIrCi0gICAgIlwxMDZcMFwyXHUwMTUxXDdcMFwxXHUwMTUyXDFcMzQxXDFcMzQyXDFcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVwxXHUwMTUyXDFcMFwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MSIrCi0gICAgIlwyXDBcM1wzNDFcMVwwXDFcMzQxXDdcMFwxXHUwMTUyXDJcMzQxXDFcdTAxNTIiKwotICAgICJcMlwzNDFcMVx1MDE1MlwyXDM0MVwxXDBcNFwzNDFcMVwwXDFcdTAxNTJcMVwzNDEiKwotICAgICJcMVwwXDFcMzQxXDFcMFwxXHUwMTUyXDJcMzQxXDZcMFwxXHUwMTUzXDFcMTQ3IisKLSAgICAiXDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTUzXDFcMFwxXDE0N1wxXDAiKwotICAgICJcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDAiKwotICAgICJcMVx1MDE1M1wyXDE0N1wxXHUwMTUzXDJcMTQ3XDFcdTAxNTNcMlwxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwxXHUwMTUzXDFcMTQ3XDFcMFwxXDE0N1wxXDBcMVx1MDE1M1wyXDE0NyIrCi0gICAgIlw2XDBcMVx1MDE1NFwxXDE1MVwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXHUwMTU0IisKLSAgICAiXDI3XDE1MVwxXHUwMTU0XDJcMTUxXDFcdTAxNTRcMlwxNTFcMVx1MDE1NFwxMFwxNTFcMVx1MDE1NCIrCi0gICAgIlw0XDE1MVwxXHUwMTU0XDdcMTUxXDFcMFwxXHUwMTU1XDFcMTU0XDFcMTU1XDNcMTU0IisKLSAgICAiXDFcdTAxNTVcMVwxNTNcMjZcMTU0XDFcdTAxNTVcMlwxNTRcMVx1MDE1NVwyXDE1NFwxXHUwMTU1IisKLSAgICAiXDEwXDE1NFwxXHUwMTU1XDRcMTU0XDFcdTAxNTVcN1wxNTRcMVwwXDFcdTAxNTZcMVwxNTciKwotICAgICJcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDE1NlwyN1wxNTdcMVx1MDE1NlwyXDE1NyIrCi0gICAgIlwxXHUwMTU2XDJcMTU3XDFcdTAxNTZcMTBcMTU3XDFcdTAxNTZcNFwxNTdcMVx1MDE1Nlw3XDE1NyIrCi0gICAgIlwxXDBcMVx1MDE1N1wxXDE2MlwxXDE2M1wzXDE2MlwxXHUwMTU3XDFcMTYxXDI2XDE2MiIrCi0gICAgIlwxXHUwMTU3XDJcMTYyXDFcdTAxNTdcMlwxNjJcMVx1MDE1N1wxMFwxNjJcMVx1MDE1N1w0XDE2MiIrCi0gICAgIlwxXHUwMTU3XDdcMTYyXDRcMFwxXHUwMTMyXDFcMFwxXHUwMTMyXDJcMFwxXHUwMTMyIisKLSAgICAiXDFcdTAxMGVcNFwwXDJcdTAxMzJcNTNcMFwxXHUwMTU4XDFcdTAxMGFcMVx1MDEwYlwxXHUwMTBhIisKLSAgICAiXDFcMFwxXHUwMTBhXDFcdTAxNThcMVwwXDFcdTAxMGFcMVx1MDEwZVwxM1x1MDEwYVwxXDAiKwotICAgICJcMTBcdTAxMGFcMVx1MDE1OFwyXHUwMTBhXDFcdTAxNThcMlx1MDEwYVwxXHUwMTU4XDEwXHUwMTBhXDFcdTAxNTgiKwotICAgICJcNFx1MDEwYVwxXHUwMTU4XDdcdTAxMGFcMVwwXDFcdTAxNTlcMVx1MDEwY1wxXHUwMTM1XDFcdTAxMGMiKwotICAgICJcMVx1MDE1YVwxXHUwMTBjXDFcdTAxNTlcMTBcdTAxMGNcMVx1MDE1YlwxNlx1MDEwY1wxXHUwMTU5XDJcdTAxMGMiKwotICAgICJcMVx1MDE1OVwyXHUwMTBjXDFcdTAxNTlcMTBcdTAxMGNcMVx1MDE1OVw0XHUwMTBjXDFcdTAxNTlcN1x1MDEwYyIrCi0gICAgIlwxXDBcMVx1MDE1Y1wxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMTVjXDFcdTAxNWRcN1x1MDEwZCIrCi0gICAgIlwxXHUwMTVlXDE2XHUwMTBkXDFcdTAxNWNcMlx1MDEwZFwxXHUwMTVjXDJcdTAxMGRcMVx1MDE1Y1wxMFx1MDEwZCIrCi0gICAgIlwxXHUwMTVjXDRcdTAxMGRcMVx1MDE1Y1w3XHUwMTBkXDFcMFwxXHUwMTVmXDFcNTFcMVwxNjUiKwotICAgICJcMVw1MVwxXDBcMVw1MVwxXHUwMTVmXDFcMFwxXDUxXDFcMFwxXDUxIisKLSAgICAiXDNcMFwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXHUwMTVmIisKLSAgICAiXDJcNTFcMVx1MDE1ZlwyXDUxXDFcdTAxNWZcMlw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMVx1MDE1ZlwxXDUxXDFcMFwxXDUxXDFcMFwxXHUwMTVmXDJcNTFcNlwwIisKLSAgICAiXDFcdTAxNjBcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcdTAxNjBcMVwwIisKLSAgICAiXDFcNTVcMVwwXDFcNTVcM1wwXDJcNTVcMlwwXDNcNTVcMVwwIisKLSAgICAiXDFcNTVcN1wwXDFcdTAxNjBcMlw1NVwxXHUwMTYwXDJcNTVcMVx1MDE2MFwyXDU1IisKLSAgICAiXDFcMFw0XDU1XDFcMFwxXHUwMTYwXDFcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDFcdTAxNjBcMlw1NVw2XDBcMVx1MDE2MVwxXDYyXDFcMTczXDFcNjJcMVwwIisKLSAgICAiXDFcNjJcMVx1MDE2MVwxXDBcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MiIrCi0gICAgIlwyXDBcM1w2MlwxXDBcMVw2Mlw3XDBcMVx1MDE2MVwyXDYyXDFcdTAxNjEiKwotICAgICJcMlw2MlwxXHUwMTYxXDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxNjFcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMVx1MDE2MVwyXDYyXDZcMFwxXHUwMTYyXDFcNzIiKwotICAgICJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXHUwMTYyXDFcMFwxXDcyXDFcMCIrCi0gICAgIlwxXDcyXDNcMFwyXDcyXDJcMFwzXDcyXDFcMFwxXDcyXDdcMCIrCi0gICAgIlwxXHUwMTYyXDJcNzJcMVx1MDE2MlwyXDcyXDFcdTAxNjJcMlw3MlwxXDBcNFw3MiIrCi0gICAgIlwxXDBcMVx1MDE2MlwxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTYyXDJcNzIiKwotICAgICJcNlwwXDFcdTAxNjNcMVwxMDBcMVwyMDNcMVwxMDBcMVwwXDFcMTAwXDFcdTAxNjMiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDEwMFwzXDBcMlwxMDBcMlwwXDNcMTAwIisKLSAgICAiXDFcMFwxXDEwMFw3XDBcMVx1MDE2M1wyXDEwMFwxXHUwMTYzXDJcMTAwXDFcdTAxNjMiKwotICAgICJcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTYzXDFcMTAwXDFcMFwxXDEwMCIrCi0gICAgIlwxXDBcMVx1MDE2M1wyXDEwMFw2XDBcMVx1MDE2NFwxXDIwNVwxXDIwNlwxXDIwNSIrCi0gICAgIlwxXDIwN1wxXDIwNVwxXHUwMTY0XDI3XDIwNVwxXHUwMTY0XDJcMjA1XDFcdTAxNjRcMlwyMDUiKwotICAgICJcMVx1MDE2NFwxMFwyMDVcMVx1MDE2NFw0XDIwNVwxXHUwMTY0XDdcMjA1XDFcMFwxXHUwMTY1IisKLSAgICAiXDFcMjEwXDFcMjExXDNcMjEwXDFcdTAxNjVcMVwyMDdcMjZcMjEwXDFcdTAxNjVcMlwyMTAiKwotICAgICJcMVx1MDE2NVwyXDIxMFwxXHUwMTY1XDEwXDIxMFwxXHUwMTY1XDRcMjEwXDFcdTAxNjVcN1wyMTAiKwotICAgICJcMVwwXDFcdTAxNjZcMVwxMDVcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcdTAxNjYiKwotICAgICJcMVwwXDFcMTA1XDFcMFwxXDEwNVwzXDBcMlwxMDVcMlwwXDNcMTA1IisKLSAgICAiXDFcMFwxXDEwNVw3XDBcMVx1MDE2NlwyXDEwNVwxXHUwMTY2XDJcMTA1XDFcdTAxNjYiKwotICAgICJcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTY2XDFcMTA1XDFcMFwxXDEwNSIrCi0gICAgIlwxXDBcMVx1MDE2NlwyXDEwNVw2XDBcMVx1MDE2N1wxXDIxNlwxXDIxN1wxXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcMVx1MDE2N1wxXDBcMVwyMTZcMVwwXDFcMjE2XDNcMCIrCi0gICAgIlwyXDIxNlwyXDBcM1wyMTZcMVwwXDFcMjE2XDdcMFwxXHUwMTY3XDJcMjE2IisKLSAgICAiXDFcdTAxNjdcMlwyMTZcMVx1MDE2N1wyXDIxNlwxXDBcNFwyMTZcMVwwXDFcdTAxNjciKwotICAgICJcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXHUwMTY3XDJcMjE2XDZcMFwxXHUwMTY4IisKLSAgICAiXDFcMTEzXDFcMjIyXDFcMTEzXDFcMFwxXDExM1wxXHUwMTY4XDFcMFwxXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyM1wxXDExMyIrCi0gICAgIlw3XDBcMVx1MDE2OFwyXDExM1wxXHUwMTY4XDJcMTEzXDFcdTAxNjhcMlwxMTNcMVwwIisKLSAgICAiXDRcMTEzXDFcMFwxXHUwMTY4XDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDE2OCIrCi0gICAgIlwyXDExM1w2XDBcMVx1MDE2OVwxXDIyNVwxXDIyNlwxXDIyNVwxXDIyN1wxXDIyNSIrCi0gICAgIlwxXHUwMTY5XDI3XDIyNVwxXHUwMTY5XDJcMjI1XDFcdTAxNjlcMlwyMjVcMVx1MDE2OVwxMFwyMjUiKwotICAgICJcMVx1MDE2OVw0XDIyNVwxXHUwMTY5XDdcMjI1XDFcMFwxXHUwMTZhXDFcMjMwXDFcMjMxIisKLSAgICAiXDNcMjMwXDFcdTAxNmFcMVwyMjdcMjZcMjMwXDFcdTAxNmFcMlwyMzBcMVx1MDE2YVwyXDIzMCIrCi0gICAgIlwxXHUwMTZhXDEwXDIzMFwxXHUwMTZhXDRcMjMwXDFcdTAxNmFcN1wyMzBcMVwwXDFcdTAxNmIiKwotICAgICJcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxNmJcMVwwXDFcMjM1IisKLSAgICAiXDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1XDFcMFwxXDIzNSIrCi0gICAgIlw3XDBcMVx1MDE2YlwyXDIzNVwxXHUwMTZiXDJcMjM1XDFcdTAxNmJcMlwyMzVcMVwwIisKLSAgICAiXDRcMjM1XDFcMFwxXHUwMTZiXDFcMjM1XDFcMFwxXDIzNVwxXDBcMVx1MDE2YiIrCi0gICAgIlwyXDIzNVw2XDBcMVx1MDE2Y1w1XDBcMVx1MDE2Y1wzXDBcMVwzNjdcNVwwIisKLSAgICAiXDFcdTAxNmNcNVwwXDFcdTAxNmNcN1wwXDJcdTAxNmNcMVwwXDJcdTAxNmNcMVwwIisKLSAgICAiXDJcdTAxNmNcN1wwXDJcdTAxNmNcM1wwXDJcdTAxNmNcN1wwXDFcdTAxNmRcNVwwIisKLSAgICAiXDFcdTAxNmRcMTFcMFwxXHUwMTZkXDVcMFwxXHUwMTZkXDdcMFwyXHUwMTZkXDFcMCIrCi0gICAgIlwyXHUwMTZkXDFcMFwyXHUwMTZkXDdcMFwyXHUwMTZkXDNcMFwyXHUwMTZkXDEyXDAiKwotICAgICJcMVx1MDE0NlwxXDBcMVx1MDE0NlwyXDBcMVx1MDE0NlwxXHUwMTIzXDRcMFwyXHUwMTQ2IisKLSAgICAiXDUzXDBcMVx1MDE2ZVwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcMVx1MDExZVwxXHUwMTZlIisKLSAgICAiXDFcMFwxXHUwMTFlXDFcdTAxMjNcMTNcdTAxMWVcMVwwXDEwXHUwMTFlXDFcdTAxNmVcMlx1MDExZSIrCi0gICAgIlwxXHUwMTZlXDJcdTAxMWVcMVx1MDE2ZVwxMFx1MDExZVwxXHUwMTZlXDRcdTAxMWVcMVx1MDE2ZVw3XHUwMTFlIisKLSAgICAiXDFcMFwxXHUwMTZmXDFcdTAxMjFcMVx1MDE0OVwxXHUwMTIxXDFcdTAxNzBcMVx1MDEyMVwxXHUwMTZmIisKLSAgICAiXDEwXHUwMTIxXDFcdTAxNzFcMTZcdTAxMjFcMVx1MDE2ZlwyXHUwMTIxXDFcdTAxNmZcMlx1MDEyMVwxXHUwMTZmIisKLSAgICAiXDEwXHUwMTIxXDFcdTAxNmZcNFx1MDEyMVwxXHUwMTZmXDdcdTAxMjFcMVwwXDFcdTAxNzJcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTRhXDNcdTAxMjJcMVx1MDE3MlwxXHUwMTczXDdcdTAxMjJcMVx1MDE3NFwxNlx1MDEyMlwxXHUwMTcyIisKLSAgICAiXDJcdTAxMjJcMVx1MDE3MlwyXHUwMTIyXDFcdTAxNzJcMTBcdTAxMjJcMVx1MDE3Mlw0XHUwMTIyXDFcdTAxNzIiKwotICAgICJcN1x1MDEyMlw0N1wwXDFcdTAxNzVcMjRcMFwyXDI1XDFcMTMxXDFcMjVcMVwwIisKLSAgICAiXDJcMjVcMVwwXDFcMjVcMVwwXDFcMjVcM1wwXDJcMjVcMlwwIisKLSAgICAiXDNcMjVcMVwwXDFcMjVcN1wwXDExXDI1XDFcMFw0XDI1XDFcMCIrCi0gICAgIlwyXDI1XDFcMFwxXDI1XDFcMFwzXDI1XDZcMFwxXHUwMTc2XDFcMTM0IisKLSAgICAiXDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXHUwMTc2XDFcMFwxXDEzNFwxXDAiKwotICAgICJcMVwxMzRcM1wwXDJcMTM0XDJcMFwzXDEzNFwxXDBcMVwxMzRcN1wwIisKLSAgICAiXDFcdTAxNzZcMlwxMzRcMVx1MDE3NlwyXDEzNFwxXHUwMTc2XDJcMTM0XDFcMFw0XDEzNCIrCi0gICAgIlwxXDBcMVx1MDE3NlwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxNzZcMlwxMzQiKwotICAgICJcNlwwXDFcdTAxNzdcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxNzciKwotICAgICJcMVwwXDFcMTM2XDFcMFwxXDEzNlwzXDBcMlwxMzZcMlwwXDNcMTM2IisKLSAgICAiXDFcMFwxXDEzNlw3XDBcMVx1MDE3N1wyXDEzNlwxXHUwMTc3XDJcMTM2XDFcdTAxNzciKwotICAgICJcMlwxMzZcMVwwXDRcMTM2XDFcMFwxXHUwMTc3XDFcMTM2XDFcMFwxXDEzNiIrCi0gICAgIlwxXDBcMVx1MDE3N1wyXDEzNlw1NFwwXDFcdTAxNzhcNjVcMFwyXHUwMTc5XDMwXDAiKwotICAgICJcMVx1MDE3YVwxXDM0MVwxXDM0MlwxXDM0MVwxXDBcMVwzNDFcMVx1MDE3YVwxXDAiKwotICAgICJcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDFcMlwwXDNcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVw3XDBcMVx1MDE3YVwyXDM0MVwxXHUwMTdhXDJcMzQxXDFcdTAxN2FcMlwzNDEiKwotICAgICJcMVwwXDRcMzQxXDFcMFwxXHUwMTdhXDFcMzQxXDFcMFwxXDM0MVwxXDAiKwotICAgICJcMVx1MDE3YVwyXDM0MVw2XDBcMVx1MDE3YlwxXDE0N1wxXDE1MFwxXDE0N1wxXDAiKwotICAgICJcMVwxNDdcMVx1MDE3YlwxXDBcMVwxNDdcMVwwXDFcMTQ3XDNcMFwyXDE0NyIrCi0gICAgIlwyXDBcM1wxNDdcMVwyNjBcMVwxNDdcN1wwXDFcdTAxN2JcMlwxNDdcMVx1MDE3YiIrCi0gICAgIlwyXDE0N1wxXHUwMTdiXDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVx1MDE3YlwxXDE0NyIrCi0gICAgIlwxXDBcMVwxNDdcMVwwXDFcdTAxN2JcMlwxNDdcNlwwXDFcdTAxN2NcMVwxNTEiKwotICAgICJcMVwxNTJcMVwxNTFcMVwxNTNcMVwxNTFcMVx1MDE3Y1wyN1wxNTFcMVx1MDE3Y1wyXDE1MSIrCi0gICAgIlwxXHUwMTdjXDJcMTUxXDFcdTAxN2NcMTBcMTUxXDFcdTAxN2NcNFwxNTFcMVx1MDE3Y1w3XDE1MSIrCi0gICAgIlwxXDBcMVx1MDE3ZFwxXDE1NFwxXDE1NVwzXDE1NFwxXHUwMTdkXDFcMTUzXDI2XDE1NCIrCi0gICAgIlwxXHUwMTdkXDJcMTU0XDFcdTAxN2RcMlwxNTRcMVx1MDE3ZFwxMFwxNTRcMVx1MDE3ZFw0XDE1NCIrCi0gICAgIlwxXHUwMTdkXDdcMTU0XDFcMFwxXHUwMTdlXDFcMTU3XDFcMTYwXDFcMTU3XDFcMTYxIisKLSAgICAiXDFcMTU3XDFcdTAxN2VcMjdcMTU3XDFcdTAxN2VcMlwxNTdcMVx1MDE3ZVwyXDE1N1wxXHUwMTdlIisKLSAgICAiXDEwXDE1N1wxXHUwMTdlXDRcMTU3XDFcdTAxN2VcN1wxNTdcMVwwXDFcdTAxN2ZcMVwxNjIiKwotICAgICJcMVwxNjNcM1wxNjJcMVx1MDE3ZlwxXDE2MVwyNlwxNjJcMVx1MDE3ZlwyXDE2MlwxXHUwMTdmIisKLSAgICAiXDJcMTYyXDFcdTAxN2ZcMTBcMTYyXDFcdTAxN2ZcNFwxNjJcMVx1MDE3Zlw3XDE2MlwxXDAiKwotICAgICJcMVx1MDE4MFwxXHUwMTBhXDFcdTAxMGJcMVx1MDEwYVwxXDBcMVx1MDEwYVwxXHUwMTgwXDFcMCIrCi0gICAgIlwxXHUwMTBhXDFcdTAxMGVcMTNcdTAxMGFcMVwwXDEwXHUwMTBhXDFcdTAxODBcMlx1MDEwYVwxXHUwMTgwIisKLSAgICAiXDJcdTAxMGFcMVx1MDE4MFwxMFx1MDEwYVwxXHUwMTgwXDRcdTAxMGFcMVx1MDE4MFw3XHUwMTBhXDFcMCIrCi0gICAgIlwxXHUwMTgxXDFcdTAxMGNcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcMVx1MDEwY1wxXHUwMTgxXDI3XHUwMTBjIisKLSAgICAiXDFcdTAxODFcMlx1MDEwY1wxXHUwMTgxXDJcdTAxMGNcMVx1MDE4MVwxMFx1MDEwY1wxXHUwMTgxXDRcdTAxMGMiKwotICAgICJcMVx1MDE4MVw3XHUwMTBjXDFcMFwyXHUwMTBjXDFcdTAxMzVcMlx1MDEzMlwxXHUwMTVhXDJcdTAxMGMiKwotICAgICJcMVx1MDE1YVwxXHUwMTgyXDRcdTAxMGNcMlx1MDEzMlw1Mlx1MDEwY1wxXDBcMlx1MDEwY1wxXHUwMTM1IisKLSAgICAiXDFcMFwxXHUwMTMyXDEyXHUwMTBjXDFcMFw1Mlx1MDEwY1wxXDBcMVx1MDE4M1wxXHUwMTBkIisKLSAgICAiXDFcdTAxMzZcM1x1MDEwZFwxXHUwMTgzXDFcdTAxMzJcMjZcdTAxMGRcMVx1MDE4M1wyXHUwMTBkXDFcdTAxODMiKwotICAgICJcMlx1MDEwZFwxXHUwMTgzXDEwXHUwMTBkXDFcdTAxODNcNFx1MDEwZFwxXHUwMTgzXDdcdTAxMGRcMVwwIisKLSAgICAiXDJcdTAxMGRcMVx1MDEzNlwxXHUwMTMyXDFcdTAxMGRcMVx1MDE1ZFwxXHUwMTBkXDFcdTAxMzJcMVx1MDE1ZCIrCi0gICAgIlwxXHUwMTg0XDRcdTAxMGRcMlx1MDEzMlw1Mlx1MDEwZFwxXDBcMlx1MDEwZFwxXHUwMTM2XDFcMCIrCi0gICAgIlwzXHUwMTBkXDFcdTAxMzJcN1x1MDEwZFwxXDBcNTJcdTAxMGRcMVwwXDJcNTFcMVwxNjUiKwotICAgICJcMVw1MVwxXDBcMlw1MVwxXDBcMVw1MVwxXDBcMVw1MVwzXDAiKwotICAgICJcMlw1MVwyXDBcM1w1MVwxXDBcMVw1MVw3XDBcMTFcNTFcMVwwIisKLSAgICAiXDRcNTFcMVwwXDJcNTFcMVwwXDFcNTFcMVwwXDNcNTFcNlwwIisKLSAgICAiXDJcNTVcMVwxNzBcMVw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDAiKwotICAgICJcMVw1NVwzXDBcMlw1NVwyXDBcM1w1NVwxXDBcMVw1NVw3XDAiKwotICAgICJcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDNcNTVcNlwwXDJcNjJcMVwxNzNcMVw2MlwxXDBcMlw2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MlwyXDBcM1w2MlwxXDAiKwotICAgICJcMVw2Mlw3XDBcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcNlwwXDJcNzJcMVwyMDBcMVw3MlwxXDAiKwotICAgICJcMlw3MlwxXDBcMVw3MlwxXDBcMVw3MlwzXDBcMlw3MlwyXDAiKwotICAgICJcM1w3MlwxXDBcMVw3Mlw3XDBcMTFcNzJcMVwwXDRcNzJcMVwwIisKLSAgICAiXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNlwwXDJcMTAwXDFcMjAzIisKLSAgICAiXDFcMTAwXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDFcMTAwXDNcMCIrCi0gICAgIlwyXDEwMFwyXDBcM1wxMDBcMVwwXDFcMTAwXDdcMFwxMVwxMDBcMVwwIisKLSAgICAiXDRcMTAwXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMCIrCi0gICAgIlwxXHUwMTg1XDFcMjA1XDFcMjA2XDFcMjA1XDFcMjA3XDFcMjA1XDFcdTAxODVcMjdcMjA1IisKLSAgICAiXDFcdTAxODVcMlwyMDVcMVx1MDE4NVwyXDIwNVwxXHUwMTg1XDEwXDIwNVwxXHUwMTg1XDRcMjA1IisKLSAgICAiXDFcdTAxODVcN1wyMDVcMVwwXDFcdTAxODZcMVwyMTBcMVwyMTFcM1wyMTBcMVx1MDE4NiIrCi0gICAgIlwxXDIwN1wyNlwyMTBcMVx1MDE4NlwyXDIxMFwxXHUwMTg2XDJcMjEwXDFcdTAxODZcMTBcMjEwIisKLSAgICAiXDFcdTAxODZcNFwyMTBcMVx1MDE4Nlw3XDIxMFwxXDBcMlwxMDVcMVwyMTNcMVwxMDUiKwotICAgICJcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcMVwxMDVcM1wwXDJcMTA1IisKLSAgICAiXDJcMFwzXDEwNVwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDUiKwotICAgICJcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwXDFcdTAxODciKwotICAgICJcMVwyMTZcMVwyMTdcMVwyMTZcMVwwXDFcMjE2XDFcdTAxODdcMVwwXDFcMjE2IisKLSAgICAiXDFcMFwxXDIxNlwzXDBcMlwyMTZcMlwwXDNcMjE2XDFcMFwxXDIxNiIrCi0gICAgIlw3XDBcMVx1MDE4N1wyXDIxNlwxXHUwMTg3XDJcMjE2XDFcdTAxODdcMlwyMTZcMVwwIisKLSAgICAiXDRcMjE2XDFcMFwxXHUwMTg3XDFcMjE2XDFcMFwxXDIxNlwxXDBcMVx1MDE4NyIrCi0gICAgIlwyXDIxNlw2XDBcMlwxMTNcMVwyMjJcMVwxMTNcMVwwXDJcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyMyIrCi0gICAgIlwxXDExM1w3XDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMFwzXDExM1w2XDBcMVx1MDE4OFwxXDIyNVwxXDIyNlwxXDIyNSIrCi0gICAgIlwxXDIyN1wxXDIyNVwxXHUwMTg4XDI3XDIyNVwxXHUwMTg4XDJcMjI1XDFcdTAxODhcMlwyMjUiKwotICAgICJcMVx1MDE4OFwxMFwyMjVcMVx1MDE4OFw0XDIyNVwxXHUwMTg4XDdcMjI1XDFcMFwxXHUwMTg5IisKLSAgICAiXDFcMjMwXDFcMjMxXDNcMjMwXDFcdTAxODlcMVwyMjdcMjZcMjMwXDFcdTAxODlcMlwyMzAiKwotICAgICJcMVx1MDE4OVwyXDIzMFwxXHUwMTg5XDEwXDIzMFwxXHUwMTg5XDRcMjMwXDFcdTAxODlcN1wyMzAiKwotICAgICJcMVwwXDFcdTAxOGFcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxOGEiKwotICAgICJcMVwwXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1IisKLSAgICAiXDFcMFwxXDIzNVw3XDBcMVx1MDE4YVwyXDIzNVwxXHUwMThhXDJcMjM1XDFcdTAxOGEiKwotICAgICJcMlwyMzVcMVwwXDRcMjM1XDFcMFwxXHUwMThhXDFcMjM1XDFcMFwxXDIzNSIrCi0gICAgIlwxXDBcMVx1MDE4YVwyXDIzNVw2XDBcMVx1MDE4Ylw1XDBcMVx1MDE4YlwzXDAiKwotICAgICJcMVwzNjdcNVwwXDFcdTAxOGJcNVwwXDFcdTAxOGJcN1wwXDJcdTAxOGJcMVwwIisKLSAgICAiXDJcdTAxOGJcMVwwXDJcdTAxOGJcN1wwXDJcdTAxOGJcM1wwXDJcdTAxOGJcN1wwIisKLSAgICAiXDFcdTAxOGNcNVwwXDFcdTAxOGNcMTFcMFwxXHUwMThjXDVcMFwxXHUwMThjXDdcMCIrCi0gICAgIlwyXHUwMThjXDFcMFwyXHUwMThjXDFcMFwyXHUwMThjXDdcMFwyXHUwMThjXDNcMCIrCi0gICAgIlwyXHUwMThjXDdcMFwxXHUwMThkXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlIisKLSAgICAiXDFcdTAxOGRcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZVwxXDBcMTBcdTAxMWVcMVx1MDE4ZCIrCi0gICAgIlwyXHUwMTFlXDFcdTAxOGRcMlx1MDExZVwxXHUwMThkXDEwXHUwMTFlXDFcdTAxOGRcNFx1MDExZVwxXHUwMThkIisKLSAgICAiXDdcdTAxMWVcMVwwXDFcdTAxOGVcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxMjFcMVx1MDE0NlwxXHUwMTIxIisKLSAgICAiXDFcdTAxOGVcMjdcdTAxMjFcMVx1MDE4ZVwyXHUwMTIxXDFcdTAxOGVcMlx1MDEyMVwxXHUwMThlXDEwXHUwMTIxIisKLSAgICAiXDFcdTAxOGVcNFx1MDEyMVwxXHUwMThlXDdcdTAxMjFcMVwwXDJcdTAxMjFcMVx1MDE0OVwyXHUwMTQ2IisKLSAgICAiXDFcdTAxNzBcMlx1MDEyMVwxXHUwMTcwXDFcdTAxOGZcNFx1MDEyMVwyXHUwMTQ2XDUyXHUwMTIxXDFcMCIrCi0gICAgIlwyXHUwMTIxXDFcdTAxNDlcMVwwXDFcdTAxNDZcMTJcdTAxMjFcMVwwXDUyXHUwMTIxXDFcMCIrCi0gICAgIlwxXHUwMTkwXDFcdTAxMjJcMVx1MDE0YVwzXHUwMTIyXDFcdTAxOTBcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMTkwIisKLSAgICAiXDJcdTAxMjJcMVx1MDE5MFwyXHUwMTIyXDFcdTAxOTBcMTBcdTAxMjJcMVx1MDE5MFw0XHUwMTIyXDFcdTAxOTAiKwotICAgICJcN1x1MDEyMlwxXDBcMlx1MDEyMlwxXHUwMTRhXDFcdTAxNDZcMVx1MDEyMlwxXHUwMTczXDFcdTAxMjIiKwotICAgICJcMVx1MDE0NlwxXHUwMTczXDFcdTAxOTFcNFx1MDEyMlwyXHUwMTQ2XDUyXHUwMTIyXDFcMFwyXHUwMTIyIisKLSAgICAiXDFcdTAxNGFcMVwwXDNcdTAxMjJcMVx1MDE0Nlw3XHUwMTIyXDFcMFw1Mlx1MDEyMlw0MlwwIisKLSAgICAiXDJcdTAxOTJcMzBcMFwyXDEzNFwxXDEzNVwxXDEzNFwxXDBcMlwxMzRcMVwwIisKLSAgICAiXDFcMTM0XDFcMFwxXDEzNFwzXDBcMlwxMzRcMlwwXDNcMTM0XDFcMCIrCi0gICAgIlwxXDEzNFw3XDBcMTFcMTM0XDFcMFw0XDEzNFwxXDBcMlwxMzRcMVwwIisKLSAgICAiXDFcMTM0XDFcMFwzXDEzNFw2XDBcMlwxMzZcMVwxMzdcMVwxMzZcMVwwIisKLSAgICAiXDJcMTM2XDFcMFwxXDEzNlwxXDBcMVwxMzZcM1wwXDJcMTM2XDJcMCIrCi0gICAgIlwzXDEzNlwxXDBcMVwxMzZcN1wwXDExXDEzNlwxXDBcNFwxMzZcMVwwIisKLSAgICAiXDJcMTM2XDFcMFwxXDEzNlwxXDBcM1wxMzZcNDRcMFwyXHUwMTkzXDMzXDAiKwotICAgICJcMVx1MDE5NFwxXDM0MVwxXDM0MlwxXDM0MVwxXDBcMVwzNDFcMVx1MDE5NFwxXDAiKwotICAgICJcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDFcMlwwXDNcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVw3XDBcMVx1MDE5NFwyXDM0MVwxXHUwMTk0XDJcMzQxXDFcdTAxOTRcMlwzNDEiKwotICAgICJcMVwwXDRcMzQxXDFcMFwxXHUwMTk0XDFcMzQxXDFcMFwxXDM0MVwxXDAiKwotICAgICJcMVx1MDE5NFwyXDM0MVw2XDBcMlwxNDdcMVwxNTBcMVwxNDdcMVwwXDJcMTQ3IisKLSAgICAiXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0NyIrCi0gICAgIlwxXDI2MFwxXDE0N1w3XDBcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDciKwotICAgICJcMVwwXDFcMTQ3XDFcMFwzXDE0N1w2XDBcMlwxNTFcMVwxNTJcMVwxNTEiKwotICAgICJcMVwxNTNcNjVcMTUxXDFcMFwyXDE1NFwxXDE1NVw0XDE1NFwxXDE1M1w2MlwxNTQiKwotICAgICJcMVwwXDJcMTU3XDFcMTYwXDFcMTU3XDFcMTYxXDY1XDE1N1wxXDBcMlwxNjIiKwotICAgICJcMVwxNjNcNFwxNjJcMVwxNjFcNjJcMTYyXDFcMFwxXHUwMTk1XDFcdTAxMGFcMVx1MDEwYiIrCi0gICAgIlwxXHUwMTBhXDFcMFwxXHUwMTBhXDFcdTAxOTVcMVwwXDFcdTAxMGFcMVx1MDEwZVwxM1x1MDEwYSIrCi0gICAgIlwxXDBcMTBcdTAxMGFcMVx1MDE5NVwyXHUwMTBhXDFcdTAxOTVcMlx1MDEwYVwxXHUwMTk1XDEwXHUwMTBhIisKLSAgICAiXDFcdTAxOTVcNFx1MDEwYVwxXHUwMTk1XDdcdTAxMGFcMVwwXDFcdTAxOTZcMVx1MDEwY1wxXHUwMTM1IisKLSAgICAiXDFcdTAxMGNcMVx1MDEzMlwxXHUwMTBjXDFcdTAxOTZcMjdcdTAxMGNcMVx1MDE5NlwyXHUwMTBjXDFcdTAxOTYiKwotICAgICJcMlx1MDEwY1wxXHUwMTk2XDEwXHUwMTBjXDFcdTAxOTZcNFx1MDEwY1wxXHUwMTk2XDdcdTAxMGNcMVwwIisKLSAgICAiXDFcdTAxOTdcMVx1MDEwZFwxXHUwMTM2XDNcdTAxMGRcMVx1MDE5N1wxXHUwMTMyXDI2XHUwMTBkXDFcdTAxOTciKwotICAgICJcMlx1MDEwZFwxXHUwMTk3XDJcdTAxMGRcMVx1MDE5N1wxMFx1MDEwZFwxXHUwMTk3XDRcdTAxMGRcMVx1MDE5NyIrCi0gICAgIlw3XHUwMTBkXDFcMFwyXDIwNVwxXDIwNlwxXDIwNVwxXDIwN1w2NVwyMDVcMVwwIisKLSAgICAiXDJcMjEwXDFcMjExXDRcMjEwXDFcMjA3XDYyXDIxMFwxXDBcMlwyMTZcMVwyMTciKwotICAgICJcMVwyMTZcMVwwXDJcMjE2XDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIisKLSAgICAiXDJcMjE2XDJcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDAiKwotICAgICJcNFwyMTZcMVwwXDJcMjE2XDFcMFwxXDIxNlwxXDBcM1wyMTZcNlwwIisKLSAgICAiXDJcMjI1XDFcMjI2XDFcMjI1XDFcMjI3XDY1XDIyNVwxXDBcMlwyMzBcMVwyMzEiKwotICAgICJcNFwyMzBcMVwyMjdcNjJcMjMwXDFcMFwyXDIzNVwxXDIzNlwxXDIzNVwxXDAiKwotICAgICJcMlwyMzVcMVwwXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwIisKLSAgICAiXDNcMjM1XDFcMFwxXDIzNVw3XDBcMTFcMjM1XDFcMFw0XDIzNVwxXDAiKwotICAgICJcMlwyMzVcMVwwXDFcMjM1XDFcMFwzXDIzNVwyMFwwXDFcMzY3XDYwXDAiKwotICAgICJcMVx1MDE5OFw1XDBcMVx1MDE5OFwxMVwwXDFcdTAxOThcNVwwXDFcdTAxOThcN1wwIisKLSAgICAiXDJcdTAxOThcMVwwXDJcdTAxOThcMVwwXDJcdTAxOThcN1wwXDJcdTAxOThcM1wwIisKLSAgICAiXDJcdTAxOThcN1wwXDFcdTAxOTlcMVx1MDExZVwxXHUwMTFmXDFcdTAxMWVcMVwwXDFcdTAxMWUiKwotICAgICJcMVx1MDE5OVwxXDBcMVx1MDExZVwxXHUwMTIzXDEzXHUwMTFlXDFcMFwxMFx1MDExZVwxXHUwMTk5IisKLSAgICAiXDJcdTAxMWVcMVx1MDE5OVwyXHUwMTFlXDFcdTAxOTlcMTBcdTAxMWVcMVx1MDE5OVw0XHUwMTFlXDFcdTAxOTkiKwotICAgICJcN1x1MDExZVwxXDBcMVx1MDE5YVwxXHUwMTIxXDFcdTAxNDlcMVx1MDEyMVwxXHUwMTQ2XDFcdTAxMjEiKwotICAgICJcMVx1MDE5YVwyN1x1MDEyMVwxXHUwMTlhXDJcdTAxMjFcMVx1MDE5YVwyXHUwMTIxXDFcdTAxOWFcMTBcdTAxMjEiKwotICAgICJcMVx1MDE5YVw0XHUwMTIxXDFcdTAxOWFcN1x1MDEyMVwxXDBcMVx1MDE5YlwxXHUwMTIyXDFcdTAxNGEiKwotICAgICJcM1x1MDEyMlwxXHUwMTliXDFcdTAxNDZcMjZcdTAxMjJcMVx1MDE5YlwyXHUwMTIyXDFcdTAxOWJcMlx1MDEyMiIrCi0gICAgIlwxXHUwMTliXDEwXHUwMTIyXDFcdTAxOWJcNFx1MDEyMlwxXHUwMTliXDdcdTAxMjJcNjVcMFwxXHUwMTljIisKLSAgICAiXDUyXDBcMlx1MDE5ZFwyNVwwXDFcdTAxOWVcMVwzNDFcMVwzNDJcMVwzNDFcMVwwIisKLSAgICAiXDFcMzQxXDFcdTAxOWVcMVwwXDFcMzQxXDFcdTAxMDNcMVwzNDFcM1wwXDJcMzQxIisKLSAgICAiXDJcMFwzXDM0MVwxXDBcMVwzNDFcN1wwXDFcdTAxOWVcMlwzNDFcMVx1MDE5ZSIrCi0gICAgIlwyXDM0MVwxXHUwMTllXDJcMzQxXDFcMFw0XDM0MVwxXDBcMVx1MDE5ZVwxXDM0MSIrCi0gICAgIlwxXDBcMVwzNDFcMVwwXDFcdTAxOWVcMlwzNDFcNlwwXDFcdTAxOWZcMVx1MDEwYSIrCi0gICAgIlwxXHUwMTBiXDFcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDE5ZlwxXDBcMVx1MDEwYVwxXHUwMTBlIisKLSAgICAiXDEzXHUwMTBhXDFcMFwxMFx1MDEwYVwxXHUwMTlmXDJcdTAxMGFcMVx1MDE5ZlwyXHUwMTBhXDFcdTAxOWYiKwotICAgICJcMTBcdTAxMGFcMVx1MDE5Zlw0XHUwMTBhXDFcdTAxOWZcN1x1MDEwYVwxXDBcMVx1MDFhMFwxXHUwMTBjIisKLSAgICAiXDFcdTAxMzVcMVx1MDEwY1wxXHUwMTMyXDFcdTAxMGNcMVx1MDFhMFwyN1x1MDEwY1wxXHUwMWEwXDJcdTAxMGMiKwotICAgICJcMVx1MDFhMFwyXHUwMTBjXDFcdTAxYTBcMTBcdTAxMGNcMVx1MDFhMFw0XHUwMTBjXDFcdTAxYTBcN1x1MDEwYyIrCi0gICAgIlwxXDBcMVx1MDFhMVwxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMWExXDFcdTAxMzJcMjZcdTAxMGQiKwotICAgICJcMVx1MDFhMVwyXHUwMTBkXDFcdTAxYTFcMlx1MDEwZFwxXHUwMWExXDEwXHUwMTBkXDFcdTAxYTFcNFx1MDEwZCIrCi0gICAgIlwxXHUwMWExXDdcdTAxMGRcMVwwXDFcdTAxYTJcNVwwXDFcdTAxYTJcMTFcMFwxXHUwMWEyIisKLSAgICAiXDVcMFwxXHUwMWEyXDdcMFwyXHUwMWEyXDFcMFwyXHUwMWEyXDFcMFwyXHUwMWEyIisKLSAgICAiXDdcMFwyXHUwMWEyXDNcMFwyXHUwMWEyXDdcMFwxXHUwMWEzXDFcdTAxMWVcMVx1MDExZiIrCi0gICAgIlwxXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxYTNcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZSIrCi0gICAgIlwxXDBcMTBcdTAxMWVcMVx1MDFhM1wyXHUwMTFlXDFcdTAxYTNcMlx1MDExZVwxXHUwMWEzXDEwXHUwMTFlIisKLSAgICAiXDFcdTAxYTNcNFx1MDExZVwxXHUwMWEzXDdcdTAxMWVcMVwwXDFcdTAxYTRcMVx1MDEyMVwxXHUwMTQ5IisKLSAgICAiXDFcdTAxMjFcMVx1MDE0NlwxXHUwMTIxXDFcdTAxYTRcMjdcdTAxMjFcMVx1MDFhNFwyXHUwMTIxXDFcdTAxYTQiKwotICAgICJcMlx1MDEyMVwxXHUwMWE0XDEwXHUwMTIxXDFcdTAxYTRcNFx1MDEyMVwxXHUwMWE0XDdcdTAxMjFcMVwwIisKLSAgICAiXDFcdTAxYTVcMVx1MDEyMlwxXHUwMTRhXDNcdTAxMjJcMVx1MDFhNVwxXHUwMTQ2XDI2XHUwMTIyXDFcdTAxYTUiKwotICAgICJcMlx1MDEyMlwxXHUwMWE1XDJcdTAxMjJcMVx1MDFhNVwxMFx1MDEyMlwxXHUwMWE1XDRcdTAxMjJcMVx1MDFhNSIrCi0gICAgIlw3XHUwMTIyXDQ3XDBcMVx1MDFhNlwyNFwwXDJcMzQxXDFcMzQyXDFcMzQxXDFcMCIrCi0gICAgIlwyXDM0MVwxXDBcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDFcMlwwIisKLSAgICAiXDNcMzQxXDFcMFwxXDM0MVw3XDBcMTFcMzQxXDFcMFw0XDM0MVwxXDAiKwotICAgICJcMlwzNDFcMVwwXDFcMzQxXDFcMFwzXDM0MVw2XDBcMVx1MDFhN1wxXHUwMTBhIisKLSAgICAiXDFcdTAxMGJcMVx1MDEwYVwxXDBcMVx1MDEwYVwxXHUwMWE3XDFcMFwxXHUwMTBhXDFcdTAxMGUiKwotICAgICJcMTNcdTAxMGFcMVwwXDEwXHUwMTBhXDFcdTAxYTdcMlx1MDEwYVwxXHUwMWE3XDJcdTAxMGFcMVx1MDFhNyIrCi0gICAgIlwxMFx1MDEwYVwxXHUwMWE3XDRcdTAxMGFcMVx1MDFhN1w3XHUwMTBhXDFcMFwxXHUwMWE4XDFcdTAxMGMiKwotICAgICJcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcMVx1MDEwY1wxXHUwMWE4XDI3XHUwMTBjXDFcdTAxYThcMlx1MDEwYyIrCi0gICAgIlwxXHUwMWE4XDJcdTAxMGNcMVx1MDFhOFwxMFx1MDEwY1wxXHUwMWE4XDRcdTAxMGNcMVx1MDFhOFw3XHUwMTBjIisKLSAgICAiXDFcMFwxXHUwMWE5XDFcdTAxMGRcMVx1MDEzNlwzXHUwMTBkXDFcdTAxYTlcMVx1MDEzMlwyNlx1MDEwZCIrCi0gICAgIlwxXHUwMWE5XDJcdTAxMGRcMVx1MDFhOVwyXHUwMTBkXDFcdTAxYTlcMTBcdTAxMGRcMVx1MDFhOVw0XHUwMTBkIisKLSAgICAiXDFcdTAxYTlcN1x1MDEwZFwxXDBcMVx1MDFhYVwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDAiKwotICAgICJcMVx1MDExZVwxXHUwMWFhXDFcMFwxXHUwMTFlXDFcdTAxMjNcMTNcdTAxMWVcMVwwXDEwXHUwMTFlIisKLSAgICAiXDFcdTAxYWFcMlx1MDExZVwxXHUwMWFhXDJcdTAxMWVcMVx1MDFhYVwxMFx1MDExZVwxXHUwMWFhXDRcdTAxMWUiKwotICAgICJcMVx1MDFhYVw3XHUwMTFlXDFcMFwxXHUwMWFiXDFcdTAxMjFcMVx1MDE0OVwxXHUwMTIxXDFcdTAxNDYiKwotICAgICJcMVx1MDEyMVwxXHUwMWFiXDI3XHUwMTIxXDFcdTAxYWJcMlx1MDEyMVwxXHUwMWFiXDJcdTAxMjFcMVx1MDFhYiIrCi0gICAgIlwxMFx1MDEyMVwxXHUwMWFiXDRcdTAxMjFcMVx1MDFhYlw3XHUwMTIxXDFcMFwxXHUwMWFjXDFcdTAxMjIiKwotICAgICJcMVx1MDE0YVwzXHUwMTIyXDFcdTAxYWNcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMWFjXDJcdTAxMjJcMVx1MDFhYyIrCi0gICAgIlwyXHUwMTIyXDFcdTAxYWNcMTBcdTAxMjJcMVx1MDFhY1w0XHUwMTIyXDFcdTAxYWNcN1x1MDEyMlwxXDAiKwotICAgICJcMlx1MDEwYVwxXHUwMTBiXDFcdTAxMGFcMVwwXDJcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDEwZSIrCi0gICAgIlwxM1x1MDEwYVwxXDBcNDRcdTAxMGFcMVwwXDFcdTAxYWRcMVx1MDEwY1wxXHUwMTM1XDFcdTAxMGMiKwotICAgICJcMVx1MDEzMlwxXHUwMTBjXDFcdTAxYWRcMjdcdTAxMGNcMVx1MDFhZFwyXHUwMTBjXDFcdTAxYWRcMlx1MDEwYyIrCi0gICAgIlwxXHUwMWFkXDEwXHUwMTBjXDFcdTAxYWRcNFx1MDEwY1wxXHUwMWFkXDdcdTAxMGNcMVwwXDFcdTAxYWUiKwotICAgICJcMVx1MDEwZFwxXHUwMTM2XDNcdTAxMGRcMVx1MDFhZVwxXHUwMTMyXDI2XHUwMTBkXDFcdTAxYWVcMlx1MDEwZCIrCi0gICAgIlwxXHUwMWFlXDJcdTAxMGRcMVx1MDFhZVwxMFx1MDEwZFwxXHUwMWFlXDRcdTAxMGRcMVx1MDFhZVw3XHUwMTBkIisKLSAgICAiXDFcMFwyXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcMlx1MDExZVwxXDBcMVx1MDExZSIrCi0gICAgIlwxXHUwMTIzXDEzXHUwMTFlXDFcMFw0NFx1MDExZVwxXDBcMVx1MDFhZlwxXHUwMTIxXDFcdTAxNDkiKwotICAgICJcMVx1MDEyMVwxXHUwMTQ2XDFcdTAxMjFcMVx1MDFhZlwyN1x1MDEyMVwxXHUwMWFmXDJcdTAxMjFcMVx1MDFhZiIrCi0gICAgIlwyXHUwMTIxXDFcdTAxYWZcMTBcdTAxMjFcMVx1MDFhZlw0XHUwMTIxXDFcdTAxYWZcN1x1MDEyMVwxXDAiKwotICAgICJcMVx1MDFiMFwxXHUwMTIyXDFcdTAxNGFcM1x1MDEyMlwxXHUwMWIwXDFcdTAxNDZcMjZcdTAxMjJcMVx1MDFiMCIrCi0gICAgIlwyXHUwMTIyXDFcdTAxYjBcMlx1MDEyMlwxXHUwMWIwXDEwXHUwMTIyXDFcdTAxYjBcNFx1MDEyMlwxXHUwMWIwIisKLSAgICAiXDdcdTAxMjJcMVwwXDJcdTAxMGNcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcNjVcdTAxMGNcMVwwIisKLSAgICAiXDJcdTAxMGRcMVx1MDEzNlw0XHUwMTBkXDFcdTAxMzJcNjJcdTAxMGRcMVwwXDJcdTAxMjFcMVx1MDE0OSIrCi0gICAgIlwxXHUwMTIxXDFcdTAxNDZcNjVcdTAxMjFcMVwwXDJcdTAxMjJcMVx1MDE0YVw0XHUwMTIyXDFcdTAxNDYiKwotICAgICJcNjJcdTAxMjIiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsICAxLCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDMsICA5LCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDMsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAxMywgIDcsICAwLCAKLSAgICAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDksICAwLCAgOSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMCwgMTMsICA3LCAgMSwgIDksICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsIAotICAgICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksIAotICAgICAwLCAgMCwgIDksICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDksICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotLy8JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkVGV4dExlbmd0aDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7Ci0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU1RleHRSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX1NNQUxMID0gMjU2OwotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsKLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgc3RhdGUpIHsKLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgewotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQ7Ci0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOwotCQlib29sZWFuIHNwYWNlRm9sbG93czsKLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsKLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsKLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYKLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047Ci0JCQl9Ci0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotICAJCXJldHVybiB0b2tlbnM7Ci0gIAl9Ci0gIAkKLSAgCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7Ci0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4geXljaGFyOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vWVlJTklUSUFMOwotCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOwotCQl9Ci0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQotCQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkJZnJvbSBpbnB1dCAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0JCS8qKgotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0JCSAqIG1hdGNoZWQgdGV4dAotCQkgKi8KLQkJeXljb2x1bW4gPSAwOyAKLQotCQkvKiogCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCQkgKi8KLQkJeXlfYXRCT0wgPSBmYWxzZTsKLQkJCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8KLQkJLy8JCWZVbmRlZmluZWQuZGVsZXRlKDAsIGZVbmRlZmluZWQubGVuZ3RoKCkpOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIENTU1Rva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzIxMDA0XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzkwNikgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotICAgICAgeXlfd2FzX3B1c2hiYWNrID0gZmFsc2U7Ci0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDQyMTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyAgfQotICAgICAgICBjYXNlIDQzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDEyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsgIH0KLSAgICAgICAgY2FzZSA0MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7ICB9Ci0gICAgICAgIGNhc2UgNDM1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyAgfQotICAgICAgICBjYXNlIDQzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7ICB9Ci0gICAgICAgIGNhc2UgNDM3OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTA6IAotICAgICAgICBjYXNlIDMyNzogCi0gICAgICAgIGNhc2UgMzk4OiAKLSAgICAgICAgY2FzZSA0MDA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgIH0KLSAgICAgICAgY2FzZSA0Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgIGNhc2UgMzA3OiAKLSAgICAgICAgY2FzZSAzODU6IAotICAgICAgICBjYXNlIDM4NzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7ICB9Ci0gICAgICAgIGNhc2UgNDM5OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgIH0KLSAgICAgICAgY2FzZSA0NDA6IGJyZWFrOwotICAgICAgICBjYXNlIDIxODogCi0gICAgICAgICAgeyAgcmV0dXJuIENTU19DT01NRU5UOyAgfQotICAgICAgICBjYXNlIDQ0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0NETzsgIH0KLSAgICAgICAgY2FzZSA0NDI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgIGNhc2UgMjQ1OiAKLSAgICAgICAgY2FzZSAyODM6IAotICAgICAgICBjYXNlIDI4NDogCi0gICAgICAgIGNhc2UgMzIzOiAKLSAgICAgICAgY2FzZSAzMjQ6IAotICAgICAgICBjYXNlIDM2MzogCi0gICAgICAgIGNhc2UgMzY0OiAKLSAgICAgICAgY2FzZSAzOTQ6IAotICAgICAgICBjYXNlIDM5NTogCi0gICAgICAgIGNhc2UgNDA3OiAKLSAgICAgICAgY2FzZSA0MTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7ICB9Ci0gICAgICAgIGNhc2UgNDQzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfQ0RDOyAgfQotICAgICAgICBjYXNlIDQ0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7ICB9Ci0gICAgICAgIGNhc2UgNDQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgIGNhc2UgMjQ0OiAKLSAgICAgICAgY2FzZSAyODI6IAotICAgICAgICBjYXNlIDMyMjogCi0gICAgICAgIGNhc2UgMzYyOiAKLSAgICAgICAgY2FzZSAzOTM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7ICB9Ci0gICAgICAgIGNhc2UgNDQ2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7ICB9Ci0gICAgICAgIGNhc2UgNDQ3OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDIzNTogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgY2FzZSAzMTM6IAotICAgICAgICBjYXNlIDM1MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyAgfQotICAgICAgICBjYXNlIDQ0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgY2FzZSAxMjU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDUwOiBicmVhazsKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyAgfQotICAgICAgICBjYXNlIDQ1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICBjYXNlIDI3MjogCi0gICAgICAgIGNhc2UgMzEyOiAKLSAgICAgICAgY2FzZSAzNTI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDUyOiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgIH0KLSAgICAgICAgY2FzZSA0NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgY2FzZSAyMzM6IAotICAgICAgICBjYXNlIDI3MTogCi0gICAgICAgIGNhc2UgMzExOiAKLSAgICAgICAgY2FzZSAzNTE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07ICB9Ci0gICAgICAgIGNhc2UgNDU1OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDU2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgIGNhc2UgMTY0OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDI0OTogCi0gICAgICAgIGNhc2UgMjkyOiAKLSAgICAgICAgY2FzZSAzMzE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsgIH0KLSAgICAgICAgY2FzZSA0NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX1M7ICB9Ci0gICAgICAgIGNhc2UgNDU4OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgIH0KLSAgICAgICAgY2FzZSA0NTk6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7ICB9Ci0gICAgICAgIGNhc2UgNDYwOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOyAgfQotICAgICAgICBjYXNlIDQ2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7ICB9Ci0gICAgICAgIGNhc2UgNDYyOiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDIzMjogCi0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgY2FzZSAzMTA6IAotICAgICAgICBjYXNlIDM1MDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07ICB9Ci0gICAgICAgIGNhc2UgNDYzOiBicmVhazsKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyAgfQotICAgICAgICBjYXNlIDQ2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDEzNDogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgIGNhc2UgMzE0OiAKLSAgICAgICAgY2FzZSAzNTQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOyAgfQotICAgICAgICBjYXNlIDQ2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgIGNhc2UgMzE3OiAKLSAgICAgICAgY2FzZSAzNTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsgIH0KLSAgICAgICAgY2FzZSA0Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7ICB9Ci0gICAgICAgIGNhc2UgNDY4OiBicmVhazsKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0Njk6IGJyZWFrOwotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUjsgIH0KLSAgICAgICAgY2FzZSA0NzA6IGJyZWFrOwotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAxNTQ6IAotICAgICAgICBjYXNlIDE1OTogCi0gICAgICAgIGNhc2UgMjAzOiAKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICBjYXNlIDI0MTogCi0gICAgICAgIGNhc2UgMjc5OiAKLSAgICAgICAgY2FzZSAzMTk6IAotICAgICAgICBjYXNlIDM1OTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7ICB9Ci0gICAgICAgIGNhc2UgNDcxOiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7ICB9Ci0gICAgICAgIGNhc2UgNDcyOiBicmVhazsKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyNTA6IAotICAgICAgICBjYXNlIDI5MzogCi0gICAgICAgIGNhc2UgMzMyOiAKLSAgICAgICAgY2FzZSAzNzM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NMQVNTOyAgfQotICAgICAgICBjYXNlIDQ3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgY2FzZSAyNTE6IAotICAgICAgICBjYXNlIDI5NDogCi0gICAgICAgIGNhc2UgMzMzOiAKLSAgICAgICAgY2FzZSAzNzQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOyAgfQotICAgICAgICBjYXNlIDQ3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgIGNhc2UgMjU4OiAKLSAgICAgICAgY2FzZSAyNjA6IAotICAgICAgICBjYXNlIDMwMDogCi0gICAgICAgIGNhc2UgMzM4OiAKLSAgICAgICAgY2FzZSAzNzg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgIH0KLSAgICAgICAgY2FzZSA0NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfQ0hBUlNFVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1NUUklORzsgIH0KLSAgICAgICAgY2FzZSA0Nzc6IGJyZWFrOwotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyAgfQotICAgICAgICBjYXNlIDQ3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAzMTg6IAotICAgICAgICBjYXNlIDM1ODogCi0gICAgICAgIGNhc2UgMzkwOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047ICB9Ci0gICAgICAgIGNhc2UgNDc5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7ICB9Ci0gICAgICAgIGNhc2UgNDgwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDI0NzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT047ICB9Ci0gICAgICAgIGNhc2UgNDgxOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSA0ODI6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBDU1NUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IENTU1Rva2VuaXplciggbmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSApOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIENTU1Rva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ODFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotDQotJSUNCi0NCi0lcHVibGljDQotJWNsYXNzIENTU1Rva2VuaXplcg0KLSVpbXBsZW1lbnRzIENTU1JlZ2lvbkNvbnRleHRzLCBJQ1NTVG9rZW5pemVyDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSVsaW5lDQotJXVuaWNvZGUNCi0lY2FzZWxlc3MNCi0lZGVidWcNCi0lcGFjaw0KLQ0KLSV7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVTkRFRklORUQgPSAidW5kZWZpbmVkIjsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0Ow0KLS8vCXByaXZhdGUgaW50IGZCdWZmZXJlZFRleHRMZW5ndGg7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsNCi0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IENTU1RleHRSZWdpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7DQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0Ow0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9TTUFMTCA9IDI1NjsNCi0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOw0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IHN0YXRlKSB7DQotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7DQotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotICAJcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgY29udGV4dDsNCi0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOw0KLQkJYm9vbGVhbiBzcGFjZUZvbGxvd3M7DQotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0Ow0KLQkJaW50IHN0YXJ0Ow0KLQkJaW50IHRleHRMZW5ndGg7DQotCQlpbnQgbGVuZ3RoOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgew0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7DQotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQ0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzDQotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgew0KLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOw0KLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsNCi0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TDQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOw0KLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgew0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsNCi0JCQkJfQ0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQNCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsNCi0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZA0KLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZg0KLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7DQotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7DQotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsNCi0JCQl9DQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotICAJfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8NCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOw0KLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7DQotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7DQotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJDQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7DQotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOw0KLQkJCXRva2Vucy5hZGQodG9rZW4pOw0KLQkJfQ0KLQ0KLSAgCQlyZXR1cm4gdG9rZW5zOw0KLSAgCX0NCi0gIAkNCi0gIAkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsNCi0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7DQotICAJCQlyZXR1cm4gZmFsc2U7DQotICAJCX0gZWxzZSB7DQotICAJCQlyZXR1cm4gdHJ1ZTsNCi0gIAkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7DQotCQlyZXR1cm4geXljaGFyOw0KLQl9DQotCQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsNCi0JCXJldHVybiB5eV9hdEVPRjsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7DQotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLQkJeXlfcmVhZGVyID0gaW47DQotDQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQkJeXlfc3RhdGUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JCXl5X2xleGljYWxfc3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsNCi0NCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsNCi0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOw0KLQkJfQ0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0JCXl5X21hcmtlZFBvcyA9IDA7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQ0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQkJeXlfc3RhcnRSZWFkID0gMDsNCi0NCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JCQlmcm9tIGlucHV0ICovDQotCQl5eV9lbmRSZWFkID0gMDsNCi0NCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5bGluZSA9IDA7DQotDQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWNoYXIgPSAwOw0KLQ0KLQkJLyoqDQotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgDQotCQkgKiBtYXRjaGVkIHRleHQNCi0JCSAqLw0KLS8vCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLQkJLyoqIA0KLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotCQkgKi8NCi0JCXl5X2F0Qk9MID0gZmFsc2U7DQotCQkNCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotCQl5eV9hdEVPRiA9IGZhbHNlOw0KLQ0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8NCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLSV9DQotDQotJXN0YXRlIFNUX0NIQVJTRVRfTkFNRQ0KLSVzdGF0ZSBTVF9DSEFSU0VUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9JTVBPUlRfVVJJDQotJXN0YXRlIFNUX0lNUE9SVF9NRURJVU0NCi0lc3RhdGUgU1RfSU1QT1JUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9NRURJQV9NRURJVU0NCi0lc3RhdGUgU1RfTUVESUFfREVMSU1JVEVSDQotJXN0YXRlIFNUX1BBR0VfUFNFVURPX1BBR0UNCi0lc3RhdGUgU1RfUEFHRV9ERUxJTUlURVINCi0lc3RhdGUgU1RfRk9OVF9GQUNFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9NT0RJRklFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1INCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQNCi0lc3RhdGUgU1RfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRQ0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9WQUxVRQ0KLQ0KLWggPSBbMC05YS1mXQ0KLW5vbmFzY2lpID0gW1x1MDA4MC1cdWZmZmZdDQotdW5pY29kZSA9IFxce2h9ezEsNn1bIFx0XHJcblxmXT8NCi1lc2NhcGUgPSB7dW5pY29kZX18XFxbIC1+XHUwMDgwLVx1ZmZmZl0NCi0NCi0NCi0NCi1ubXN0YXJ0ID0gW19hLXpBLVpdfHtub25hc2NpaX18e2VzY2FwZX0NCi1ubWNoYXIgPSBbX2EtekEtWjAtOS1dfHtub25hc2NpaX18e2VzY2FwZX0NCi1zdHJpbmcxID0gXCIoW1x0ICEjJCUmKC1+XXxcXHtubH18XCd8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCINCi1zdHJpbmcyID0gXCcoW1x0ICEjJCUmKC1+XXxcXHtubH18XCJ8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCcNCi0NCi1pZGVudCA9IC0/e25tc3RhcnR9e25tY2hhcn0qDQotDQotbmFtZSA9IHtubWNoYXJ9Kw0KLW51bSA9IFsrLV0/KFswLTldK3xbMC05XSoiLiJbMC05XSspDQotc3RyaW5nID0ge3N0cmluZzF9fHtzdHJpbmcyfQ0KLXVybCA9IChbICEjJCUmKi1+XXx7bm9uYXNjaWl9fHtlc2NhcGV9KSoNCi1zID0gWyBcdFxyXG5cZl0NCi13ID0ge3N9Kg0KLW5sID0gXG58XHJcbnxccnxcZg0KLQ0KLS8vcmFuZ2UgPSBcP3sxLDZ9fHtofShcP3swLDV9fHtofShcP3swLDR9fHtofShcP3swLDN9fHtofShcP3swLDJ9fHtofShcPz98e2h9KSkpKSkNCi0NCi1oYXNoID0gIiMie25hbWV9DQotdXJpID0gKCJ1cmwoInt3fXtzdHJpbmd9e3d9IikifCJ1cmwoInt3fXt1cmx9e3d9IikiKQ0KLWZ1bmN0aW9uID0ge2lkZW50fSIoIg0KLXVuaWNvZGVfcmFuZ2UgPSAiVSJcK1swLTlhLWZBLUY/XXsxLDZ9KCItIlswLTlhLWZBLUY/XXsxLDZ9KT8NCi0NCi0lJQ0KLQ0KLS8qDQotICogKioqIGdsb2JhbCAqKioNCi0gKi8NCi0NCi17c30rIHsgcmV0dXJuIENTU19TOyB9DQotIjwhLS0iIHsgcmV0dXJuIENTU19DRE87IH0NCi0iLS0+IiB7IHJldHVybiBDU1NfQ0RDOyB9DQotIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLQ0KLS8vPFlZSU5JVElBTD4gew0KLS8vCSJAaW1wb3J0IiB7CXl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyB9DQotLy99DQotDQotLyoNCi0gKiAqKiogY2hhcnNldCBydWxlICoqKg0KLSAqIENIQVJTRVRfU1lNIFMqIFNUUklORyBTKiAnOycNCi0gKi8NCi0NCi0iQGNoYXJzZXQiIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7IH0NCi0NCi08U1RfQ0hBUlNFVF9OQU1FPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotfQ0KLQ0KLTxTVF9DSEFSU0VUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIGltcG9ydCBydWxlICoqKg0KLSAqIElNUE9SVF9TWU0gUyogW1NUUklOR3xVUkldIFMqIFsgbWVkaXVtIFsgQ09NTUEgUyogbWVkaXVtXSogXT8gJzsnIFMqDQotICovDQotDQotIkBpbXBvcnQiIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0NCi08U1RfSU1QT1JUX1VSST4gew0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotCS8vCSJ1cmwoInt3fXtzdHJpbmd9e3d9IikiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JLy8JInVybCgie3d9e3VybH17d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBtZWRpYSBydWxlICoqKg0KLSAqIE1FRElBX1NZTSBTKiBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW0gXSogTEJSQUNFIFMqIHJ1bGVzZXQqICd9JyBTKg0KLSAqLw0KLQ0KLSJAbWVkaWEiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOyB9DQotDQotLyogDQotICogbWVkaXVtDQotICogSURFTlQgUyoNCi0gKi8NCi08U1RfTUVESUFfTUVESVVNPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotfQ0KLQ0KLTxTVF9NRURJQV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIHBhZ2UgcnVsZSAqKg0KLSAqIFBBR0VfU1lNIFMqIHBzZXVkb19wYWdlPyBTKiBMQlJBQ0UgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gXSogJ30nIFMqDQotICovDQotDQotIkBwYWdlIiB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgfQ0KLSANCi0vKg0KLSAqIHBzZXVkb19wYWdlDQotICogJzonIElERU5UDQotICovDQotDQotPFNUX1BBR0VfUFNFVURPX1BBR0U+IHsNCi0JIjoiP3tpZGVudH0geyB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOyB9DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi08U1RfUEFHRV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogZm9udC1mYWNlDQotICogRk9OVF9GQUNFX1NZTSBTKiAneycgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gJyogJ30nIFMqDQotICovDQotDQotIkBmb250LWZhY2UiIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7IH0NCi0NCi08U1RfRk9OVF9GQUNFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBzZWxlY3Rvcg0KLSAqIHNpbXBsZV9zZWxlY3RvciBbIGNvbWJpbmF0b3Igc2ltcGxlX3NlbGVjdG9yIF0qDQotICovDQotDQotLyoNCi0gKiBzaW1wbGVfc2VsZWN0b3INCi0gKiBlbGVtZW50X25hbWUgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gXSogfCBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKw0KLSAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SX01PRElGSUVSLCBTVF9TRUxFQ1RPUj4gew0KLQkiKiIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7IH0NCi0Je2hhc2h9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7IH0NCi0vLwkiOiJ7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyB9DQotCSI6IntpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIi4ie25hbWV9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7IH0NCi0JIlsiIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOyB9DQotfQ0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX01PRElGSUVSPiB7DQotCSIsIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgfQ0KLQkvLyB1c2luZyBMT09LQUhFQUQNCi0Je3N9Ky9bXis+XHtdIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkiKyJ8Ij4iIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBhdHRyaWINCi0gKiAnWycgUyogSURFTlQgUyogWyBbICc9JyB8IElOQ0xVREVTIHwgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqIF0/ICddJw0KLSAqLw0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I+IHsNCi0JIj0ifCJ+PSJ8Inw9IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7IH0NCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFPiB7DQotCXtpZGVudH18e3N0cmluZ30geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORD4gew0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLS8qDQotICogZGVjbGFyYXRpb24NCi0gKiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPyB8IC8vIGVtcHR5IC8vDQotICovDQotDQotPFNUX0RFQ0xBUkFUSU9OPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUj4gew0KLQkiOiIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUsIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCSIhIntzfSoiaW1wb3J0YW50IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsgfQ0KLQkNCi0JDQotCSIpIiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFOyB9DQotCQ0KLQkvLyBvcmRlcmVkIGZvbGxvd2luZyB0d28gcnVsZXMgZGVsaWJlcmF0ZWx5LCBzZWUgDQotCS8vICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5OTAyDQotCXtudW19e2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsgfQ0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7IH0NCi0NCi0NCi0Je251bX0iJSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOyB9DQotCQkNCi0Je251bX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVI7IH0NCi0JDQotCQ0KLQkNCi0Je2Z1bmN0aW9ufSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOyB9DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOyB9DQotCSIjIntuYW1lfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7IH0NCi0Je3VuaWNvZGVfcmFuZ2V9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRTsgfQ0KLQlbLC9dIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCXtzfSsvW147fV0geyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OLCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IsIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIjsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOyB9DQotCS8vCSJ9IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7IH0NCi19DQotDQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotLy8Je3N9KyB7IHJldHVybiBDU1NfUzsgfQ0KLS8vCS4geyByZXR1cm4gVU5ERUZJTkVEOyB9DQotLy99DQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JW14gXHRcclxuXGZdKyB7IHJldHVybiBDU1NfVU5LTk9XTjsgfQ0KLS8vfQ0KLQ0KLS4gew0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmNlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1AZWNobyBvZmYNCi1zZXQgUEFUSD0lUEFUSCU7YzpcamRrMS40XGJpbg0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXhcbGliXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIEpTUFRva2VuaXplciAtc2tlbCBza2VsZXRvbi5zZWQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIEpGbGV4XGxpYlxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiBYTUxUb2tlbml6ZXIgLXNrZWwgc2tlbGV0b24uc2VkDQotcm0gLWYgSlNQVG9rZW5pemVyLmphdmF+IEpTUFRva2VuaXplcn4gWE1MVG9rZW5pemVyLmphdmF+IFhNTFRva2VuaXplcn4NCi1jb3B5IFhNTFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXHNlZG1vZGVsXGNvbVxpYm1cc2VkXHBhcnNlclxpbnRlcm5hbA0KLWNvcHkgSlNQVG9rZW5pemVyLmphdmEgLi5cLi5cLi5cLi5cc2VkbW9kZWxcY29tXGlibVxzZWRccGFyc2VyXGludGVybmFsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NzJmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMhL2Jpbi9zaA0KLQ0KLUpBVkFESVI9QzovQXBwL0lCTS9KYXZhMTQxL2Jpbg0KLUpBVkFPUFQ9LVhteDQ3MDAwMDAwMA0KLUNMQVNTUEFUSD0uLi8uLi9IVE1MVG9rZW5pemVyL2RldmVsL0pGbGV4L2xpYi9zZWQtamZsZXguamFyXDsuDQotREVTVERJUj0uLi8uLi8uLi8uLi8uLi9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzL3NyYy9jb20vaWJtL3NzZS9tb2RlbC9jc3MvaW50ZXJuYWwvcGFyc2VyDQotDQotI2V4cG9ydCBQQVRIPSRQQVRIOi9vcHQvSUJNSmF2YTItMTMxL2Jpbi86L29wdC9JQk1KYXZhMi0xMy9iaW4vOi9vcHQvamRrMS40DQotI2phdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXgvbGliL3NlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIENTU1Rva2VuaXplciAtc2tlbCBza2VsZXRvbi5zc2UNCi0NCi0kSkFWQURJUi9qYXZhICRKQVZBT1BUIC1jcCAkQ0xBU1NQQVRIIEpGbGV4Lk1haW4gQ1NTVG9rZW5pemVyLmpmbGV4DQotDQotcm0gLWYgQ1NTVG9rZW5pemVyLmphdmF+IENTU1Rva2VuaXplci5qZmxleH4NCi1jcCAtdiBDU1NUb2tlbml6ZXIuamF2YSAkREVTVERJUg0KLSMkSkFWQURJUi9qYXZhYyAkREVTVERJUi8qLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL1JFQURNRSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDgyMGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1kZXZlbCAgICAgLSB0aGUgYWN0aXZlIGRldmVsb3BtZW50IGVudmlyb25tZW50IChzYW5zIEpESykNCi0gICAgICAgICAgICAtIGxhdGVzdCB2ZXJzaW9uIG9mIEhUTUxUb2tlbml6ZXIgc3BlY2lmaWNhdGlvbiBhbmQgZ2VuZXJhdGVkIGNvZGUNCi0gICAgICAgICAgICAtIG1vZGlmaWVkIHNrZWxldG9uIHRvIHByZXZlbnQgVk0gZXhpdHMgb24gdW5tYXRjaGVkIGlucHV0DQotICAgICAgICAgICAgLSAiZmxleCIgc2NyaXB0cyB0byBydW4gSkZsZXggd2l0aCBtb2RpZmllZCBza2VsZXRvbg0KLSAgICAgICAgICAgIC0gYWN0aXZlIFJDUyBhcmNoaXZlDQotcmVzb3VyY2VzIC0gYmFja3VwL3ByaXN0aW5lIHJlc291cmNlcw0KLSAgICAgICAgICAgIC0gVW5tb2RpZmllZCBKRmxleCAxLjIuMiBkb3dubG9hZA0KLSAgICAgICAgICAgIC0gU2VwYXJhdGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgSkZsZXggc2tlbGV0b24NCi0gICAgICAgICAgICAtIFczQyBYTUwgcmVjb21tZW5kYXRpb24gdXNlZCBmb3Igc2V2ZXJhbCBvZiB0aGUgSFRNTFRva2VuaXplciBydWxlcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ5ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzA2ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDYvNy8wNiAxOjQ2IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLypubHNYWFgqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA2LzcvMDYgMTo0NiBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01KU1BSZWdpb25Db250ZXh0cyB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfRFFVT1RFUyA9IDUyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX1NRVU9URVMgPSA1MTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCA9IDUzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFU19FTkQgPSA0NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVMgPSA0NTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMID0gNDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9TUVVPVEVTID0gNDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEID0gNDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTCA9IDUwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9WQkwgPSA1NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEID0gNDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTlRFTlQgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMzE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMzI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUyA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVNfRU5EID0gNTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX0VMID0gNDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAzNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVNfRU5EID0gNDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9TUVVPVEVEX0VMID0gNDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UX0VORCA9IDM5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDM1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RRVU9URURfVkJMID0gNTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0FCT1JUX0VNQkVEREVEID0gNDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UID0gMzg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTiA9IDM3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyNlwyXDBcMVwxN1wyMlwwXDFcMTdcMVwyNVwxXDEyXDFcNjMiKwotICAgICJcMVwxNVwxXDIyXDFcMTNcMVwxNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcMjRcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMjBcMVwxMVwxXDcwXDFcMVwxXDUwXDFcMlwxXDRcMVwyMSIrCi0gICAgIlwxXDM3XDFcNzFcMVwzNVwxXDM2XDFcNTRcMVw2NlwxXDYwXDFcNjBcMVw2MVwxXDYwIisKLSAgICAiXDFcNjBcMVwzMlwxXDMxXDFcNjJcMVw1MVwxXDUzXDFcNjBcMVw2NVwxXDY0XDFcNDAiKwotICAgICJcMVw2N1wyXDYwXDFcMjdcMVw1MlwxXDYwXDFcMzRcMVwxMDJcMVwyM1wxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1NlwxXDEwMVwxXDcyXDFcNTdcMVw0MlwxXDY2XDFcNzNcMVw2MFwxXDQ1IisKLSAgICAiXDFcNzZcMVw2MFwxXDMzXDFcMzFcMVw0N1wxXDQ2XDFcNzdcMVw2MFwxXDQzXDFcNDQiKwotICAgICJcMVw1NVwxXDEwMFwxXDQxXDFcNjBcMVwzMFwxXDUyXDFcNjBcMVwxNlwxXDBcMVwxMDMiKwotICAgICJcNzFcMFwxXDc1XDEwXDBcMjdcNzRcMVwwXDM3XDc0XDFcMFw3Mlw3NFwyXDBcMTNcNzQiKwotICAgICJcMlwwXDEwXDc0XDFcMFw2NVw3NFwxXDBcMTA0XDc0XDExXDBcNDRcNzRcM1wwXDJcNzQiKwotICAgICJcNFwwXDM2XDc0XDcwXDBcMTMxXDc0XDIyXDBcN1w3NFwxNlwwXDJcNzVcNTZcMFwxMDZcNzUiKwotICAgICJcMzJcMFwyXDc1XDQ0XDBcMVw3NFwxXDc1XDNcNzRcMVwwXDFcNzRcMVwwXDI0XDc0IisKLSAgICAiXDFcMFw1NFw3NFwxXDBcN1w3NFwzXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NCIrCi0gICAgIlwxXDBcMVw3NFwxXDBcMjJcNzRcMTVcMFwxNFw3NFwxXDBcMTAyXDc0XDFcMFwxNFw3NCIrCi0gICAgIlwxXDBcNDRcNzRcMVwwXDRcNzVcMTFcMFw2NVw3NFwyXDBcMlw3NFwyXDBcMlw3NCIrCi0gICAgIlwzXDBcMzRcNzRcMlwwXDEwXDc0XDJcMFwyXDc0XDY3XDBcNDZcNzRcMlwwXDFcNzQiKwotICAgICJcN1wwXDQ2XDc0XDEyXDBcMjFcNzVcMVwwXDI3XDc1XDFcMFwzXDc1XDFcMFwxXDc1IisKLSAgICAiXDFcMFwyXDc1XDFcMFwxXDc1XDEzXDBcMzNcNzRcNVwwXDNcNzRcNTZcMFwzMlw3NCIrCi0gICAgIlw1XDBcMVw3NVwxMlw3NFwxMFw3NVwxNVwwXDEyXDc1XDZcMFwxXDc1XDEwN1w3NFwyXDAiKwotICAgICJcNVw3NFwxXDBcMTdcNzRcMVwwXDRcNzRcMVwwXDFcNzRcMTdcNzVcMlw3NFwyXDc1IisKLSAgICAiXDFcMFw0XDc1XDJcMFwxMlw3NVx1MDIwN1wwXDNcNzVcMVwwXDY1XDc0XDJcMFwxXDc1IisKLSAgICAiXDFcNzRcMjBcNzVcM1wwXDRcNzVcM1wwXDEyXDc0XDJcNzVcMlwwXDEyXDc1XDIxXDAiKwotICAgICJcM1w3NVwxXDBcMTBcNzRcMlwwXDJcNzRcMlwwXDI2XDc0XDFcMFw3XDc0XDFcMCIrCi0gICAgIlwxXDc0XDNcMFw0XDc0XDJcMFwxXDc1XDFcMFw3XDc1XDJcMFwyXDc1XDJcMCIrCi0gICAgIlwzXDc1XDExXDBcMVw3NVw0XDBcMlw3NFwxXDBcM1w3NFwyXDc1XDJcMFwxMlw3NSIrCi0gICAgIlwyXDc0XDIwXDBcMVw3NVwyXDBcNlw3NFw0XDBcMlw3NFwyXDBcMjZcNzRcMVwwIisKLSAgICAiXDdcNzRcMVwwXDJcNzRcMVwwXDJcNzRcMVwwXDJcNzRcMlwwXDFcNzVcMVwwIisKLSAgICAiXDVcNzVcNFwwXDJcNzVcMlwwXDNcNzVcMTNcMFw0XDc0XDFcMFwxXDc0XDdcMCIrCi0gICAgIlwxMlw3NVwyXDc1XDNcNzRcMTRcMFwzXDc1XDFcMFw3XDc0XDFcMFwxXDc0XDFcMCIrCi0gICAgIlwzXDc0XDFcMFwyNlw3NFwxXDBcN1w3NFwxXDBcMlw3NFwxXDBcNVw3NFwyXDAiKwotICAgICJcMVw3NVwxXDc0XDEwXDc1XDFcMFwzXDc1XDFcMFwzXDc1XDIyXDBcMVw3NFw1XDAiKwotICAgICJcMTJcNzVcMjFcMFwzXDc1XDFcMFwxMFw3NFwyXDBcMlw3NFwyXDBcMjZcNzRcMVwwIisKLSAgICAiXDdcNzRcMVwwXDJcNzRcMlwwXDRcNzRcMlwwXDFcNzVcMVw3NFw2XDc1XDNcMCIrCi0gICAgIlwyXDc1XDJcMFwzXDc1XDEwXDBcMlw3NVw0XDBcMlw3NFwxXDBcM1w3NFw0XDAiKwotICAgICJcMTJcNzVcMjJcMFwyXDc1XDFcMFw2XDc0XDNcMFwzXDc0XDFcMFw0XDc0XDNcMCIrCi0gICAgIlwyXDc0XDFcMFwxXDc0XDFcMFwyXDc0XDNcMFwyXDc0XDNcMFwzXDc0XDNcMCIrCi0gICAgIlwxMFw3NFwxXDBcM1w3NFw0XDBcNVw3NVwzXDBcM1w3NVwxXDBcNFw3NVwxMVwwIisKLSAgICAiXDFcNzVcMTdcMFwxMVw3NVwyMVwwXDNcNzVcMVwwXDEwXDc0XDFcMFwzXDc0XDFcMCIrCi0gICAgIlwyN1w3NFwxXDBcMTJcNzRcMVwwXDVcNzRcNFwwXDdcNzVcMVwwXDNcNzVcMVwwIisKLSAgICAiXDRcNzVcN1wwXDJcNzVcMTFcMFwyXDc0XDRcMFwxMlw3NVwyMlwwXDJcNzVcMVwwIisKLSAgICAiXDEwXDc0XDFcMFwzXDc0XDFcMFwyN1w3NFwxXDBcMTJcNzRcMVwwXDVcNzRcNFwwIisKLSAgICAiXDdcNzVcMVwwXDNcNzVcMVwwXDRcNzVcN1wwXDJcNzVcN1wwXDFcNzRcMVwwIisKLSAgICAiXDJcNzRcNFwwXDEyXDc1XDIyXDBcMlw3NVwxXDBcMTBcNzRcMVwwXDNcNzRcMVwwIisKLSAgICAiXDI3XDc0XDFcMFwyMFw3NFw0XDBcNlw3NVwyXDBcM1w3NVwxXDBcNFw3NVwxMVwwIisKLSAgICAiXDFcNzVcMTBcMFwyXDc0XDRcMFwxMlw3NVwyMjFcMFw1Nlw3NFwxXDBcMVw3NFwxXDc1IisKLSAgICAiXDJcNzRcN1w3NVw1XDBcNlw3NFwxXDc1XDEwXDc1XDFcMFwxMlw3NVw0N1wwXDJcNzQiKwotICAgICJcMVwwXDFcNzRcMlwwXDJcNzRcMVwwXDFcNzRcMlwwXDFcNzRcNlwwXDRcNzQiKwotICAgICJcMVwwXDdcNzRcMVwwXDNcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMlwwXDJcNzQiKwotICAgICJcMVwwXDJcNzRcMVwwXDFcNzRcMVw3NVwyXDc0XDZcNzVcMVwwXDJcNzVcMVw3NCIrCi0gICAgIlwyXDBcNVw3NFwxXDBcMVw3NVwxXDBcNlw3NVwyXDBcMTJcNzVcNzZcMFwyXDc1IisKLSAgICAiXDZcMFwxMlw3NVwxM1wwXDFcNzVcMVwwXDFcNzVcMVwwXDFcNzVcNFwwXDJcNzUiKwotICAgICJcMTBcNzRcMVwwXDQxXDc0XDdcMFwyNFw3NVwxXDBcNlw3NVw0XDBcNlw3NVwxXDAiKwotICAgICJcMVw3NVwxXDBcMjVcNzVcM1wwXDdcNzVcMVwwXDFcNzVcMzQ2XDBcNDZcNzRcMTJcMCIrCi0gICAgIlw0N1w3NFwxMVwwXDFcNzRcMVwwXDJcNzRcMVwwXDNcNzRcMVwwXDFcNzRcMVwwIisKLSAgICAiXDJcNzRcMVwwXDVcNzRcNTFcMFwxXDc0XDFcMFwxXDc0XDFcMFwxXDc0XDEzXDAiKwotICAgICJcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwzXDBcMlw3NFwzXDBcMVw3NFw1XDAiKwotICAgICJcM1w3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwzXDAiKwotICAgICJcMlw3NFwzXDBcMlw3NFwxXDBcMVw3NFw1MFwwXDFcNzRcMTFcMFwxXDc0XDJcMCIrCi0gICAgIlwxXDc0XDJcMFwyXDc0XDdcMFwyXDc0XDFcMFwxXDc0XDFcMFw3XDc0XDUwXDAiKwotICAgICJcMVw3NFw0XDBcMVw3NFwxMFwwXDFcNzRcdTBjMDZcMFwyMzRcNzRcNFwwXDEzMlw3NFw2XDAiKwotICAgICJcMjZcNzRcMlwwXDZcNzRcMlwwXDQ2XDc0XDJcMFw2XDc0XDJcMFwxMFw3NFwxXDAiKwotICAgICJcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMzdcNzRcMlwwXDY1XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwxXDc0XDNcMFwzXDc0XDFcMFw3XDc0XDNcMFw0XDc0XDJcMCIrCi0gICAgIlw2XDc0XDRcMFwxNVw3NFw1XDBcM1w3NFwxXDBcN1w3NFwzMjNcMFwxNVw3NVw0XDAiKwotICAgICJcMVw3NVwxMDRcMFwxXDc0XDNcMFwyXDc0XDJcMFwxXDc0XDEyMVwwXDNcNzRcdTBlODJcMCIrCi0gICAgIlwxXDc1XDFcMFwxXDc0XDMxXDBcMTFcNzRcNlw3NVwxXDBcNVw3NVwxM1wwXDEyNFw3NCIrCi0gICAgIlw0XDBcMlw3NVwyXDBcMlw3NVwyXDBcMTMyXDc0XDFcMFwzXDc1XDZcMFw1MFw3NCIrCi0gICAgIlx1MWNkM1wwXHU1MWE2XDc0XHUwYzVhXDBcdTJiYTRcNzRcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA2OCwgICAxMzYsICAgMjA0LCAgIDI3MiwgICAzNDAsICAgNDA4LCAgIDQ3NiwgICA1NDQsICAgNjEyLCAKLSAgICAgIDY4MCwgICA3NDgsICAgODE2LCAgIDg4NCwgICA5NTIsICAxMDIwLCAgMTA4OCwgIDExNTYsICAxMjI0LCAgMTI5MiwgCi0gICAgIDEzNjAsICAxNDI4LCAgMTQ5NiwgIDE1NjQsICAxNjMyLCAgMTcwMCwgIDE3NjgsICAxODM2LCAgMTkwNCwgIDE5NzIsIAotICAgICAyMDQwLCAgMjEwOCwgIDIxNzYsICAyMjQ0LCAgMjMxMiwgIDIzODAsICAyNDQ4LCAgMjUxNiwgIDI1ODQsICAyNjUyLCAKLSAgICAgMjcyMCwgIDI3ODgsICAyODU2LCAgMjkyNCwgIDI5OTIsICAzMDYwLCAgMzEyOCwgIDMxOTYsICAzMjY0LCAgMzMzMiwgCi0gICAgIDM0MDAsICAzNDY4LCAgMzUzNiwgIDM2MDQsICAzNjcyLCAgMzc0MCwgIDM4MDgsICAzODc2LCAgMzk0NCwgIDQwMTIsIAotICAgICA0MDgwLCAgNDE0OCwgIDQyMTYsICA0Mjg0LCAgNDM1MiwgIDQyODQsICA0MzUyLCAgNDQyMCwgIDQyODQsICA0Mjg0LCAKLSAgICAgNDM1MiwgIDQ0ODgsICA0NTU2LCAgNDYyNCwgIDQ2OTIsICA0NzYwLCAgNDgyOCwgIDQ4OTYsICA0Mjg0LCAgNDM1MiwgCi0gICAgIDQ5NjQsICA1MDMyLCAgNTEwMCwgIDQyODQsICA1MTY4LCAgNTE2OCwgIDUyMzYsICA1MzA0LCAgNTM3MiwgIDQ5NjQsIAotICAgICA0Mjg0LCAgNTQ0MCwgIDU1MDgsICA0Mjg0LCAgNTU3NiwgIDU2NDQsICA1NzEyLCAgNTc4MCwgIDQyODQsICA0MzUyLCAKLSAgICAgNTg0OCwgIDU5MTYsICA1OTg0LCAgNjA1MiwgIDYxMjAsICA2MTg4LCAgNDI4NCwgIDYyNTYsICA2MjU2LCAgNjMyNCwgCi0gICAgIDYzOTIsICA2NDYwLCAgNjUyOCwgIDY1OTYsICA0Mjg0LCAgNjY2NCwgIDY3MzIsICA2ODAwLCAgNjg2OCwgIDY5MzYsIAotICAgICA3MDA0LCAgNDI4NCwgIDcwNzIsICA3MTQwLCAgNzIwOCwgIDcyNzYsICA3MzQ0LCAgNzQxMiwgIDc0ODAsICA3NTQ4LCAKLSAgICAgNDI4NCwgIDc2MTYsICA3Njg0LCAgNzc1MiwgIDc4MjAsICA3ODg4LCAgNzk1NiwgIDgwMjQsICA4MDkyLCAgODA5MiwgCi0gICAgIDgxNjAsICA4MjI4LCAgODI5NiwgIDgzNjQsICA4MzY0LCAgODQzMiwgIDg1MDAsICA4NTY4LCAgODYzNiwgIDg2MzYsIAotICAgICA4NzA0LCAgODc3MiwgIDg4NDAsICA4OTA4LCAgNDI4NCwgIDg5NzYsICA4OTc2LCAgOTA0NCwgIDkxMTIsICA5MTgwLCAKLSAgICAgOTI0OCwgIDQyODQsICA0Mjg0LCAgNDM1MiwgIDkzMTYsICA0Mjg0LCAgNDM1MiwgIDkzODQsICA5NDUyLCAgOTUyMCwgCi0gICAgIDk1ODgsICA0Mjg0LCAgOTY1NiwgIDk3MjQsICA5NzkyLCAgOTg2MCwgIDQyODQsICA5OTI4LCAgOTk5NiwgMTAwNjQsIAotICAgIDEwMTMyLCAgNDI4NCwgIDQyODQsIDEwMjAwLCAgNDI4NCwgMTAyNjgsIDEwMzM2LCAxMDI2OCwgMTA0MDQsIDEwNDcyLCAKLSAgICAxMDQwNCwgIDQyODQsICA0Mjg0LCAxMDU0MCwgMTA2MDgsIDEwNjc2LCAgNDI4NCwgMTA3NDQsIDEwODEyLCAxMDg4MCwgCi0gICAgMTA5NDgsIDExMDE2LCAgNDI4NCwgIDQyODQsIDExMDg0LCAgNDI4NCwgMTExNTIsIDExMjIwLCAxMTE1MiwgMTEyODgsIAotICAgIDExMzU2LCAxMTI4OCwgIDQyODQsICA0Mjg0LCAxMTQyNCwgMTE0OTIsIDExNTYwLCAgNDI4NCwgMTE2MjgsIDExNjk2LCAKLSAgICAxMTc2NCwgIDQyODQsICA0Mjg0LCAxMTgzMiwgMTE5MDAsIDExOTY4LCAxMjAzNiwgMTIxMDQsICA0Mjg0LCAxMjE3MiwgCi0gICAgMTIyNDAsIDEyMzA4LCAxMjM3NiwgMTI0NDQsIDEyNTEyLCAxMjU4MCwgMTI2NDgsIDEyNzE2LCAgNDI4NCwgMTI3ODQsIAotICAgIDEyODUyLCAgNDI4NCwgIDQyODQsICA1MTY4LCAgNTMwNCwgIDQyODQsIDEyOTIwLCAgNTM3MiwgMTI5ODgsICA1NDQwLCAKLSAgICAgNTU3NiwgIDU2NDQsIDEzMDU2LCAgNTcxMiwgIDQyODQsIDEzMTI0LCAxMzE5MiwgIDU3ODAsIDEzMjYwLCAgNDI4NCwgCi0gICAgMTE5MDAsICA0Mjg0LCAgNjI1NiwgIDYzMjQsICA0Mjg0LCAxMzMyOCwgIDYzOTIsIDEzMzk2LCAgNDI4NCwgMTM0NjQsIAotICAgIDEzNTMyLCAgNzA3MiwgMTM2MDAsICA3Mjc2LCAgNDI4NCwgMTM2NjgsICA3MzQ0LCAxMzczNiwgMTM4MDQsIDEzODcyLCAKLSAgICAxMzk0MCwgMTQwMDgsIDE0MDc2LCAgNzgyMCwgIDQyODQsIDE0MTQ0LCAxNDIxMiwgIDgwOTIsICA4MTYwLCAgNDI4NCwgCi0gICAgMTQyODAsIDE0MzQ4LCAxNDQxNiwgMTQ0ODQsIDE0NTUyLCAgODI5NiwgIDgwOTIsICA4MzY0LCAgODQzMiwgIDQyODQsIAotICAgICA4NTAwLCAgODU2OCwgIDgzNjQsICA4NjM2LCAgODcwNCwgIDQyODQsIDE0NjIwLCAxNDY4OCwgMTQ3NTYsIDE0ODI0LCAKLSAgICAxNDg5MiwgMTQ5NjAsIDE1MDI4LCAgODk3NiwgIDkwNDQsICA0Mjg0LCAxNTA5NiwgMTUxNjQsIDE1MjMyLCAxNTMwMCwgCi0gICAgMTUzNjgsIDE1NDM2LCAxNTUwNCwgMTU1NzIsIDE1NjQwLCAgNDI4NCwgIDQyODQsICA0Mjg0LCAxNTcwOCwgIDQyODQsIAotICAgICA0Mjg0LCAxNTc3NiwgMTU4NDQsIDE1OTEyLCAxNTk4MCwgMTAyNjgsICA0Mjg0LCAxNjA0OCwgMTYxMTYsIDEwNDA0LCAKLSAgICAgNDI4NCwgMTYxODQsIDE2MjUyLCAxNjMyMCwgMTYzODgsIDE2NDU2LCAxNjUyNCwgMTY1OTIsIDE2NjYwLCAxNjcyOCwgCi0gICAgMTA5NDgsIDExMTUyLCAgNDI4NCwgMTY3OTYsIDE2ODY0LCAxMTI4OCwgIDQyODQsIDE2OTMyLCAxNzAwMCwgMTcwNjgsIAotICAgIDE3MTM2LCAxNzIwNCwgMTcyNzIsIDE3MzQwLCAxNzQwOCwgMTc0NzYsICA0Mjg0LCAgNDI4NCwgIDQyODQsIDE3NTQ0LCAKLSAgICAxNzYxMiwgMTc2ODAsIDE3NzQ4LCAxNzgxNiwgIDQyODQsIDE3ODg0LCAxNzk1MiwgIDQyODQsICA0Mjg0LCAgNDI4NCwgCi0gICAgIDQyODQsICA0Mjg0LCAgNDY5MiwgMTgwMjAsIDE4MDg4LCAxODE1NiwgMTgyMjQsIDE4MjkyLCAxODM2MCwgMTgyOTIsIAotICAgIDE4NDI4LCAxODQ5NiwgMTg0MjgsIDE4NTY0LCAxODYzMiwgMTg3MDAsIDE4NzY4LCAxODgzNiwgMTg5MDQsIDE4OTcyLCAKLSAgICAxODk3MiwgMTkwNDAsIDE5MTA4LCAxOTEwOCwgMTkxNzYsICA4ODQwLCAgODg0MCwgMTkyNDQsIDE5MzEyLCAxOTM4MCwgCi0gICAgMTkzODAsIDE5NDQ4LCAgOTE4MCwgIDkxODAsIDE5NTE2LCAxOTU4NCwgMTU5MTIsIDE5NjUyLCAxMDA2NCwgMTAwNjQsIAotICAgIDE5NzIwLCAxOTc4OCwgMTAyNjgsIDEwMjY4LCAxOTg1NiwgMTk5MjQsIDEwNDA0LCAxMDQwNCwgMTk5OTIsIDIwMDYwLCAKLSAgICAxMDU0MCwgMTA1NDAsIDE2NDU2LCAyMDEyOCwgMjAxOTYsIDEwNzQ0LCAxMDc0NCwgMTY2NjAsIDIwMjY0LCAyMDMzMiwgCi0gICAgMTA5NDgsIDEwOTQ4LCAyMDQwMCwgMTExNTIsIDExMTUyLCAyMDQ2OCwgMjA1MzYsIDExMjg4LCAxMTI4OCwgMjA2MDQsIAotICAgIDIwNjcyLCAxMTQyNCwgMTE0MjQsIDE3MjA0LCAyMDc0MCwgMjA4MDgsIDExNjI4LCAxMTYyOCwgMTc0MDgsIDIwODc2LCAKLSAgICAgNDI4NCwgIDQyODQsIDIwOTQ0LCAyMTAxMiwgIDQyODQsIDIxMDgwLCAyMTE0OCwgMjEyMTYsICA3MDcyLCAgNDI4NCwgCi0gICAgIDQyODQsIDIxMjg0LCAyMTM1MiwgMjE0MjAsIDIxNDg4LCAyMTU1NiwgMTQ0ODQsIDE0ODI0LCAgODg0MCwgMjE2MjQsIAotICAgIDE1MzAwLCAgOTE4MCwgMjE2OTIsICA0Mjg0LCAxMDA2NCwgMTAyNjgsIDIxNzYwLCAxMDQwNCwgMjE4MjgsIDEwNTQwLCAKLSAgICAyMTg5NiwgIDQyODQsIDEwNzQ0LCAyMTk2NCwgMTA5NDgsIDExMTUyLCAyMjAzMiwgMTEyODgsIDIyMTAwLCAxMTQyNCwgCi0gICAgMjIxNjgsICA0Mjg0LCAxMTYyOCwgMjIyMzYsIDIyMzA0LCAyMjM3MiwgMjI0NDAsIDIyNTA4LCAyMjU3NiwgMjI2NDQsIAotICAgIDIyNzEyLCAyMjc4MCwgMjI4NDgsIDIyOTE2LCAyMjk4NCwgMjMwNTIsIDIzMTIwLCAyMzE4OCwgMjMyNTYsIDIzMzI0LCAKLSAgICAyMzM5MiwgMjM0NjAsIDIzNTI4LCAyMzU5NiwgIDQ2OTIsIDIzNjY0LCAyMzczMiwgMjM4MDAsIDIzODY4LCAyMzkzNiwgCi0gICAgIDQyODQsICA0Mjg0LCAyNDAwNCwgMjQwNzIsIDI0MTQwLCAyNDIwOCwgMTY0NTYsIDE2NjYwLCAyNDI3NiwgMjQzNDQsIAotICAgIDE3MjA0LCAxNzQwOCwgMjQ0MTIsIDI0NDgwLCAyNDU0OCwgIDQyODQsICA0Mjg0LCAgNDI4NCwgMjQ2MTYsIDI0Njg0LCAKLSAgICAyNDc1MiwgMjQ4MjAsIDI0ODg4LCAyNDk1NiwgMjUwMjQsICA2ODAwLCAyNTA5MiwgMjUxNjAsIDI1MjI4LCAyNTI5NiwgCi0gICAgMjUzNjQsIDI1NDMyLCAyNTUwMCwgIDQyODQsIDI1NTY4LCAgODg0MCwgIDkxODAsIDEwMjY4LCAxMDQwNCwgMTExNTIsIAotICAgIDExMjg4LCAyNTYzNiwgMjU3MDQsIDI1NzcyLCAyNTg0MCwgMjU5MDgsIDI1OTc2LCAyNjA0NCwgMjYxMTIsIDI2MTgwLCAKLSAgICAyNjI0OCwgMjYzMTYsIDI2Mzg0LCAyNjQ1MiwgMjY1MjAsIDI2NTg4LCAyNjY1NiwgMjY3MjQsIDI2NzkyLCAyNjg2MCwgCi0gICAgMjY5MjgsIDI2OTk2LCAyNzA2NCwgMjcxMzIsIDI3MjAwLCAyNzI2OCwgMjczMzYsIDI3NDA0LCAyNzQ3MiwgMjc1NDAsIAotICAgIDI3NjA4LCAyNzY3NiwgMjc3NDQsIDI3ODEyLCAyNzg4MCwgMjc5NDgsIDI4MDE2LCAyODA4NCwgMjgxNTIsIDI4MjIwLCAKLSAgICAyODI4OCwgIDQyODQsIDI4MzU2LCAyODQyNCwgMjg0OTIsIDI4NTYwLCAgNjgwMCwgMjg2MjgsIDI4Njk2LCAyODc2NCwgCi0gICAgMjg4MzIsIDI4OTAwLCAyODk2OCwgMjkwMzYsIDI5MTA0LCAyOTE3MiwgMjkyNDAsIDI5MzA4LCAyOTM3NiwgMjk0NDQsIAotICAgIDI5NTEyCi0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw3MlwxXDczXDExXDcyXDFcNzRcMVw3MlwxXDc1XDRcNzJcMVw3NiIrCi0gICAgIlw0MFw3MlwxXDc3XDIwXDcyXDFcMTAwXDFcMTAxXDEwMlwxMDBcMVwxMDJcMVwxMDMiKwotICAgICJcMjFcMTAyXDFcMTA0XDJcMTAyXDFcMTA1XDU1XDEwMlwxXDEwNlwxXDEwN1wxMDJcMTA2IisKLSAgICAiXDFcMTAyXDFcMTAzXDVcMTAyXDFcMTEwXDE2XDEwMlwxXDEwNVw1NlwxMDJcMVwxMDMiKwotICAgICJcMlwxMDJcMVwxMTFcMVwxMTJcMlwxMDJcMlwxMTNcNVwxMDJcMVwxMTJcNlwxMDIiKwotICAgICJcMVwxMTJcMlwxMTRcM1wxMTNcMVwxMDJcMTBcMTEzXDFcMTE1XDJcMTEzXDFcMTAyIisKLSAgICAiXDEwXDExM1wxXDExNVwxXDExM1wxXDEwMlw0XDExM1wxXDEwMlw0XDExM1wxXDEwMiIrCi0gICAgIlw0XDExM1wzXDEwMlwxXDEwM1wyXDEwMlwxXDExMVwxXDExNlwxMVwxMDJcMVwxMTYiKwotICAgICJcNlwxMDJcMVwxMTZcNTVcMTAyXDFcMTE3XDFcMTIwXDJcMTE3XDFcMTIxXDIxXDExNyIrCi0gICAgIlwxXDEwNVw1NVwxMTdcMVwxMDJcMVwxMDNcMlwxMDJcMVwxMjJcMVwxMTJcMlwxMDIiKwotICAgICJcMlwxMjNcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMjNcMVwxMDJcMTNcMTIzIisKLSAgICAiXDFcMTAyXDEyXDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyMyIrCi0gICAgIlwzXDEwMlwxXDEwM1wyXDEwMlwxXDEyMlwxXDExMlwyXDEwMlwyXDEyM1w1XDEwMiIrCi0gICAgIlwxXDExMlw2XDEwMlwxXDExMlw1XDEyM1wxXDEwMlwxM1wxMjNcMVwxMjRcMTJcMTIzIisKLSAgICAiXDFcMTAyXDRcMTIzXDFcMTAyXDRcMTIzXDFcMTAyXDRcMTIzXDJcMTAyXDFcMTI1IisKLSAgICAiXDFcMTAzXDFcMTAyXDFcMTI2XDFcMTI3XDFcMTEyXDRcMTI1XDFcMTMwXDFcMTI1IisKLSAgICAiXDFcMTMxXDJcMTI1XDFcMTEyXDZcMTI1XDFcMTEyXDU1XDEyNVwxXDEwMlwxXDEwMyIrCi0gICAgIlwyXDEwMlwxXDEzMlwyMVwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzXDFcMTMzXDFcMTM0IisKLSAgICAiXDFcMTAyXDFcMTEyXDJcMTAyXDJcMTM1XDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyIisKLSAgICAiXDVcMTM1XDFcMTAyXDEzXDEzNVwxXDEwMlwxMlwxMzVcMVwxMDJcNFwxMzVcMVwxMDIiKwotICAgICJcNFwxMzVcMVwxMDJcNFwxMzVcM1wxMDJcMVwxMDNcMVwxMzNcMVwxMzRcMVwxMDIiKwotICAgICJcMVwxMTJcMlwxMDJcMlwxMzVcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMzUiKwotICAgICJcMVwxMDJcMTNcMTM1XDFcMTM2XDEyXDEzNVwxXDEwMlw0XDEzNVwxXDEwMlw0XDEzNSIrCi0gICAgIlwxXDEwMlw0XDEzNVwyXDEwMlwxXDEzN1wxXDEwM1wxXDEzM1wxXDE0MFwxXDEzNyIrCi0gICAgIlwxXDExMlw0XDEzN1wxXDE0MVwxXDEzN1wxXDE0MlwyXDEzN1wxXDExMlw2XDEzNyIrCi0gICAgIlwxXDExMlw1NVwxMzdcMVwxMDJcMVwxMDNcM1wxMDJcMVwxMTJcMTFcMTAyXDFcMTEyIisKLSAgICAiXDZcMTAyXDFcMTEyXDU1XDEwMlwxXDE0M1wxXDE0NFwyMFwxNDNcMVwxNDVcNjFcMTQzIisKLSAgICAiXDFcMTAyXDFcMTQ2XDNcMTAyXDFcMTEyXDJcMTAyXDJcMTQ3XDVcMTAyXDFcMTEyIisKLSAgICAiXDJcMTAyXDFcMTUwXDNcMTAyXDFcMTEyXDVcMTQ3XDFcMTAyXDEzXDE0N1wxXDEwMiIrCi0gICAgIlwxMlwxNDdcMVwxMDJcNFwxNDdcMVwxMDJcNFwxNDdcMVwxMDJcNFwxNDdcM1wxMDIiKwotICAgICJcMVwxNDZcM1wxMDJcMVwxNTFcMTFcMTAyXDFcMTUxXDJcMTAyXDFcMTUwXDNcMTAyIisKLSAgICAiXDFcMTUxXDU2XDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE1Mlw1XDEwMiIrCi0gICAgIlwxXDExMlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE1MlwxXDEwMlwxM1wxNTIiKwotICAgICJcMVwxMDJcMTJcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyIisKLSAgICAiXDNcMTAyXDFcMTQ2XDNcMTAyXDFcMTEyXDJcMTAyXDJcMTUyXDVcMTAyXDFcMTEyIisKLSAgICAiXDJcMTAyXDFcMTUwXDNcMTAyXDFcMTEyXDVcMTUyXDFcMTAyXDEzXDE1MlwxXDE1MyIrCi0gICAgIlwxMlwxNTJcMVwxMDJcNFwxNTJcMVwxMDJcNFwxNTJcMVwxMDJcNFwxNTJcMlwxMDIiKwotICAgICJcMVwxNTRcMVwxNDZcMVwxMDJcMVwxNTVcMVwxNTRcMVwxMTJcNFwxNTRcMVwxNTYiKwotICAgICJcMVwxNTRcMVwxNTdcMlwxNTRcMVwxMTJcMlwxNTRcMVwxNjBcM1wxNTRcMVwxMTIiKwotICAgICJcNTVcMTU0XDFcMTYxXDFcMTYyXDFcMTYzXDFcMTY0XDRcMTYxXDJcMTY1XDE1XDE2MSIrCi0gICAgIlw1XDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcMTJcMTY2XDFcMTYxXDRcMTY2XDFcMTYxIisKLSAgICAiXDRcMTY2XDFcMTYxXDFcMTY3XDNcMTY2XDJcMTYxXDFcMTAyXDFcMTcwXDFcMTYzIisKLSAgICAiXDFcMTY0XDFcMTAyXDFcMTEyXDJcMTAyXDJcMTcxXDVcMTAyXDFcMTEyXDZcMTAyIisKLSAgICAiXDFcMTEyXDVcMTcxXDFcMTAyXDEzXDE3MVwxXDEwMlwxMlwxNzFcMVwxMDJcNFwxNzEiKwotICAgICJcMVwxMDJcNFwxNzFcMVwxMDJcNFwxNzFcM1wxMDJcMVwxNzBcMVwxNjNcMVwxNjQiKwotICAgICJcMVwxMDJcMVwxMTJcMlwxMDJcMlwxNzFcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTIiKwotICAgICJcNVwxNzFcMVwxMDJcMTNcMTcxXDFcMTcyXDEyXDE3MVwxXDEwMlw0XDE3MVwxXDEwMiIrCi0gICAgIlw0XDE3MVwxXDEwMlw0XDE3MVwyXDEwMlwxXDE3M1wxXDE3NFwxXDE2M1wxXDE3NSIrCi0gICAgIlwxXDE3M1wxXDExMlw0XDE3M1wxXDE3NlwxXDE3M1wxXDE3N1wxXDIwMFwxXDE3MyIrCi0gICAgIlwxXDExMlw2XDE3M1wxXDExMlwzNFwxNzNcMVwyMDFcMjBcMTczXDFcMTAyXDFcMjAyIisKLSAgICAiXDFcMjAzXDJcMTAyXDFcMTEyXDExXDEwMlwxXDExMlw2XDEwMlwxXDExMlw3XDEwMiIrCi0gICAgIlwxXDIwNFwxXDIwNVwyXDEwMlwxXDIwNlwxMVwxMDJcMVwyMDZcMVwxMDJcMVwyMDUiKwotICAgICJcMVwyMDRcMjVcMTAyXDFcMTAzXDFcMjAzXDJcMTAyXDFcMTEyXDExXDEwMlwxXDExMiIrCi0gICAgIlw2XDEwMlwxXDExMlw1XDEwMlwxXDIwN1w1MFwxMDJcMVwxMDNcMVwyMDNcMlwxMDIiKwotICAgICJcMVwxMTJcMlwxMDJcMlwyMTBcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwyMTAiKwotICAgICJcMVwyMDdcMTNcMjEwXDFcMTAyXDEyXDIxMFwxXDEwMlw0XDIxMFwxXDEwMlw0XDIxMCIrCi0gICAgIlwxXDEwMlw0XDIxMFwzXDEwMlwxXDEwM1wxXDIwM1wyXDEwMlwxXDExMlwxMVwxMDIiKwotICAgICJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMDJcMVwyMDdcN1wxMDJcMVwyMTFcNlwxMDIiKwotICAgICJcMVwyMTJcMTBcMTAyXDFcMjExXDEyXDEwMlwxXDIxMlw0XDEwMlwxXDIxM1wxXDEwMyIrCi0gICAgIlwxXDIwM1wxXDIxNFwxXDIxM1wxXDExMlw0XDIxM1wxXDIxNVwxXDIxM1wxXDIxNiIrCi0gICAgIlwyXDIxM1wxXDExMlw2XDIxM1wxXDExMlw1XDIxM1wxXDIxN1w0N1wyMTNcMVwyMjAiKwotICAgICJcMVwxMDNcMVwyMDNcMVwyMjFcMVwyMjBcMVwxMTJcNFwyMjBcMVwyMjJcMVwyMjAiKwotICAgICJcMVwyMjNcMlwyMjBcMVwxMTJcNlwyMjBcMVwxMTJcNVwyMjBcMVwyMjRcNDdcMjIwIisKLSAgICAiXDFcMjI1XDFcMTAzXDFcMjAzXDFcMjI2XDFcMjI1XDFcMTEyXDRcMjI1XDFcMjI3IisKLSAgICAiXDFcMjI1XDFcMjMwXDJcMjI1XDFcMTEyXDZcMjI1XDFcMTEyXDU1XDIyNVwxXDIzMSIrCi0gICAgIlwxXDIzMlwxXDIzM1wxMDFcMjMxXDFcMjM0XDFcMTAzXDFcMjAzXDFcMjM1XDFcMjM0IisKLSAgICAiXDFcMTEyXDRcMjM0XDFcMjM2XDFcMjM0XDFcMjM3XDJcMjM0XDFcMTEyXDZcMjM0IisKLSAgICAiXDFcMTEyXDU1XDIzNFwxXDI0MFwxXDI0MVwxXDI0MlwxMDFcMjQwXDFcMjQzXDFcMjQ0IisKLSAgICAiXDEwMlwyNDNcMVwxMDJcMVwyNDVcMjRcMTAyXDFcMTA1XDU1XDEwMlwxXDI0NlwxXDI0NyIrCi0gICAgIlwxMDJcMjQ2XDFcMTAyXDFcMTAzXDVcMTAyXDFcMjUwXDE2XDEwMlwxXDEwNVw1NVwxMDIiKwotICAgICJcMVwyNTFcMVwyNTJcM1wyNTFcMVwyNTNcNlwyNTFcMVwyNTRcMVwyNTVcMVwyNTEiKwotICAgICJcMVwyNTNcNlwyNTFcMVwyNTNcMzRcMjUxXDFcMjU2XDIwXDI1MVwxXDI1N1wxXDI1MiIrCi0gICAgIlwzXDI1N1wxXDI2MFw0XDI1N1wxXDI2MVwyXDI1N1wxXDI2MlwxXDI1N1wxXDI2MCIrCi0gICAgIlw2XDI1N1wxXDI2MFwzNFwyNTdcMVwyNjNcMjBcMjU3XDFcMTAyXDFcMTAzXDI0XDEwMiIrCi0gICAgIlwxXDEwNVw1NVwxMDJcMVwyNjRcMVwyNjVcMTBcMjY0XDFcMjY2XDFcMjY0XDFcMjY3IisKLSAgICAiXDFcMjcwXDY1XDI2NFwxXDI3MVwxXDI3MlwxXDI3M1wxMlwyNzJcMVwxMDJcMTFcMjcyIisKLSAgICAiXDFcMjc0XDU1XDI3MlwxXDI3NVwxXDI3NlwxMFwyNzVcMVwxMDJcMTNcMjc1XDFcMjc3IisKLSAgICAiXDU1XDI3NVwxXDEwMlwxXDEwM1wxMlwxMDJcMVwzMDBcMTFcMTAyXDFcMTA1XDU2XDEwMiIrCi0gICAgIlwxXDEwM1wxMFwxMDJcMVwzMDFcMTNcMTAyXDFcMTA1XDU1XDEwMlwxXDMwMlwxXDMwMyIrCi0gICAgIlwxMFwzMDJcMVwyNjFcNjdcMzAyXDFcMzA0XDFcMzA1XDFcMzA2XDFcMzA3XDEyXDMwNiIrCi0gICAgIlwxXDI1NFw2NVwzMDZcMVwzMTBcMVwzMDVcMVwzMTFcMVwzMTJcMTBcMzExXDFcMzEzIisKLSAgICAiXDFcMzExXDFcMzE0XDQ2XDMxMVwxXDMxNVwxN1wzMTFcMVwzMTZcMVwzMTdcMVwzMjAiKwotICAgICJcMTJcMzE3XDFcMTAyXDExXDMxN1wxXDMyMVw1NVwzMTdcMVwzMjJcMVwzMjNcMTBcMzIyIisKLSAgICAiXDFcMTAyXDEzXDMyMlwxXDMyNFw1NVwzMjJcMVwxMDJcMVwxMDNcMTJcMTAyXDFcMzI1IisKLSAgICAiXDExXDEwMlwxXDEwNVw1NlwxMDJcMVwxMDNcMTBcMTAyXDFcMzI2XDEzXDEwMlwxXDEwNSIrCi0gICAgIlw1NVwxMDJcMVwzMjdcMVwzMzBcMTBcMzI3XDFcMjYxXDY3XDMyN1wxXDMzMVwxXDMzMiIrCi0gICAgIlwxXDMzM1wxXDMzNFwxMlwzMzNcMVwyNTRcNjVcMzMzXDFcMzM1XDFcMzMyXDFcNzIiKwotICAgICJcMVwwXDExXDcyXDFcMFwxXDcyXDFcMFw0XDcyXDFcMFw0MFw3MiIrCi0gICAgIlwxXDBcMjBcNzJcM1wwXDFcMzM2XDFcMzM3XDE1XDBcMVwzNDBcMlwwIisKLSAgICAiXDFcMzQxXDYzXDBcMVwzNDJcMlwwXDJcMzQzXDVcMFwxXDM0Mlw2XDAiKwotICAgICJcMVwzNDJcNVwzNDNcMVwwXDEzXDM0M1wxXDBcMTJcMzQzXDFcMzQ0XDRcMzQzIisKLSAgICAiXDFcMFw0XDM0M1wxXDBcNFwzNDNcMlwwXDFcMzQ1XDFcMFwxMVwzNDUiKwotICAgICJcMVwwXDFcMzQ1XDFcMzQ2XDFcMzQ3XDNcMzQ1XDFcMFw2MVwzNDVcNVwwIisKLSAgICAiXDFcMzQyXDJcMFwyXDM1MFw1XDBcMVwzNDJcNlwwXDFcMzQyXDVcMzUwIisKLSAgICAiXDFcMFwxM1wzNTBcMVwwXDEyXDM1MFwxXDBcNFwzNTBcMVwwXDRcMzUwIisKLSAgICAiXDFcMFw0XDM1MFwyXDBcMVwzNDVcMVwwXDExXDM0NVwxXDBcMlwzNDUiKwotICAgICJcMVwzNTFcM1wzNDVcMVwwXDQwXDM0NVwxXDM1MlwyMFwzNDVcMTI2XDBcMVwzNTMiKwotICAgICJcMlwwXDFcMzU0XDEwMVwwXDFcMzU1XDY3XDBcMVwzNTZcNzZcMFwxXDM1NyIrCi0gICAgIlwxMDZcMFwxXDExMlwxMVwwXDFcMTEyXDZcMFwxXDExMlw2M1wwXDRcMTEzIisKLSAgICAiXDZcMFwxXDExM1w2XDBcNVwxMTNcMVwwXDEzXDExM1wxXDBcMTJcMTEzIisKLSAgICAiXDFcMFw0XDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxMTNcNlwwXDFcMTEzIisKLSAgICAiXDZcMFwyXDExM1wxXDM2MFwyXDExM1wxXDBcMTNcMTEzXDFcMFwxMlwxMTMiKwotICAgICJcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMTBcMFw0XDExM1w2XDBcMVwxMTMiKwotICAgICJcNlwwXDJcMTEzXDFcMzYxXDJcMTEzXDFcMFwxM1wxMTNcMVwwXDEyXDExMyIrCi0gICAgIlwxXDBcNFwxMTNcMVwwXDExXDExM1w3XDBcMVwxMTZcMTFcMFwxXDExNiIrCi0gICAgIlw2XDBcMVwxMTZcNTdcMFwxXDM2MlwxMDNcMFwxXDM2M1wxMDdcMFw0XDEyMyIrCi0gICAgIlw2XDBcMVwxMjNcNlwwXDVcMTIzXDFcMFwxM1wxMjNcMVwwXDEyXDEyMyIrCi0gICAgIlwxXDBcNFwxMjNcMVwwXDExXDEyM1wyXDBcMVwxMjVcMlwwXDFcMzY0IisKLSAgICAiXDFcMTI1XDFcMFw0XDEyNVwxXDBcMVwxMjVcMVwwXDJcMTI1XDFcMCIrCi0gICAgIlw2XDEyNVwxXDBcNTZcMTI1XDFcMFwxXDM2M1wxXDM2NFwxXDEyNVwxXDAiKwotICAgICJcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNVwxXDBcNlwxMjVcMVwwIisKLSAgICAiXDU1XDEyNVwxXDM2NVwxXDBcMTBcMzY1XDFcMzY2XDJcMzY1XDFcMzY3XDQ1XDM2NSIrCi0gICAgIlwxXDM2N1wyMFwzNjVcMVwzNzBcMVwwXDEyXDM3MFwxXDM2NlwxXDM3MVw0NVwzNzAiKwotICAgICJcMVwzNzFcMjBcMzcwXDJcMFwxXDEzM1wxXDM3MlwxMDZcMFw0XDEzNVw2XDAiKwotICAgICJcMVwxMzVcNlwwXDVcMTM1XDFcMFwxM1wxMzVcMVwwXDEyXDEzNVwxXDAiKwotICAgICJcNFwxMzVcMVwwXDExXDEzNVwyXDBcMVwxMzdcMlwwXDFcMzczXDFcMTM3IisKLSAgICAiXDFcMFw0XDEzN1wxXDBcMVwxMzdcMVwwXDJcMTM3XDFcMFw2XDEzNyIrCi0gICAgIlwxXDBcNTZcMTM3XDFcMFwxXDEzM1wxXDM3NFwxXDEzN1wxXDBcNFwxMzciKwotICAgICJcMVwwXDFcMTM3XDFcMFwyXDEzN1wxXDBcNlwxMzdcMVwwXDU1XDEzNyIrCi0gICAgIlwxXDE0MVwxXDBcMVwzNzVcMVwzNzZcMVwxNDFcMVwzNzVcNFwxNDFcMVwzNzciKwotICAgICJcMVwxNDFcMVwzNzVcMVx1MDEwMFwxXDE0MVwxXDM3NVw2XDE0MVwxXDM3NVwzNFwxNDEiKwotICAgICJcMVx1MDEwMFwyMFwxNDFcMVwxNDJcMVwwXDFcdTAxMDFcMVx1MDEwMlwxXDE0MlwxXHUwMTAxIisKLSAgICAiXDRcMTQyXDFcdTAxMDFcMVwxNDJcMVwzNzdcMVx1MDEwM1wxXDE0MlwxXHUwMTAxXDZcMTQyIisKLSAgICAiXDFcdTAxMDFcMzRcMTQyXDFcdTAxMDNcMjBcMTQyXDJcMFwxXHUwMTA0XDEyM1wwXDFcMzUzIisKLSAgICAiXDJcMFwxXHUwMTA1XDY0XDBcNFwxNDdcNlwwXDFcMTQ3XDZcMFw1XDE0NyIrCi0gICAgIlwxXDBcMTNcMTQ3XDFcMFwxMlwxNDdcMVwwXDRcMTQ3XDFcMFwxMVwxNDciKwotICAgICJcNFwwXDFcdTAxMDZcMTA2XDBcMVwxNTFcMTFcMFwxXDE1MVw2XDBcMVwxNTEiKwotICAgICJcNjNcMFw0XDE1Mlw2XDBcMVwxNTJcNlwwXDVcMTUyXDFcMFwxM1wxNTIiKwotICAgICJcMVwwXDEyXDE1MlwxXDBcNFwxNTJcMVwwXDExXDE1MlwyXDBcMVwxNTQiKwotICAgICJcMlwwXDFcdTAxMDdcMVwxNTRcMVwwXDRcMTU0XDFcMFwxXDE1NFwxXDAiKwotICAgICJcMlwxNTRcMVwwXDZcMTU0XDFcMFw1NVwxNTRcMVx1MDEwOFwxXDBcMTBcdTAxMDgiKwotICAgICJcMVx1MDEwOVwyXHUwMTA4XDFcdTAxMGFcNDVcdTAxMDhcMVx1MDEwYVwyMFx1MDEwOFwxXHUwMTBiXDFcMCIrCi0gICAgIlwxMlx1MDEwYlwxXHUwMTA5XDFcdTAxMGNcNDVcdTAxMGJcMVx1MDEwY1wyMFx1MDEwYlwxXDE1NFwxXDAiKwotICAgICJcMVx1MDEwNlwxXHUwMTA3XDFcMTU0XDFcMFw0XDE1NFwxXDBcMVwxNTRcMVwwIisKLSAgICAiXDJcMTU0XDFcMFw2XDE1NFwxXDBcNTVcMTU0XDFcMTYxXDNcMFwyM1wxNjEiKwotICAgICJcNVwwXDFcMTYxXDEzXDBcMVwxNjFcMTJcMFwxXDE2MVw0XDBcMVwxNjEiKwotICAgICJcNFwwXDFcMTYxXDRcMFwyXDE2MVwzXDBcMVwzMzZcMTZcMFwxXDM1MyIrCi0gICAgIlwyXDBcMVwzNDFcNjBcMFwxXHUwMTBkXDEwMVwwXDFcMTYxXDNcMFwyXDE2MSIrCi0gICAgIlw0XDE2NVw2XDE2MVwxXDE2NVw2XDE2MVw1XDE2NlwxXDE2MVwxM1wxNjZcMVwxNjEiKwotICAgICJcMTJcMTY2XDFcMTYxXDRcMTY2XDFcMTYxXDRcMTY2XDFcMTY1XDRcMTY2XDJcMTYxIisKLSAgICAiXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDdcMTY2XDFcdTAxMGVcM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw1XDBcMVwzMzYiKwotICAgICJcNFwwXDJcdTAxMGZcMTBcMFwxXDM1M1wyXDBcMVwzNDFcMVwwXDVcdTAxMGYiKwotICAgICJcMVwwXDEzXHUwMTBmXDFcMFwxMlx1MDEwZlwxXDBcNFx1MDEwZlwxXDBcNFx1MDEwZiIrCi0gICAgIlwxXDBcNFx1MDEwZlwxMFwwXDRcMTcxXDZcMFwxXDE3MVw2XDBcNVwxNzEiKwotICAgICJcMVwwXDEzXDE3MVwxXDBcMTJcMTcxXDFcMFw0XDE3MVwxXDBcMTFcMTcxIisKLSAgICAiXDJcMFwxXDE3M1wyXDBcMVx1MDExMFwxXDE3M1wxXDBcNFwxNzNcMVwwIisKLSAgICAiXDFcMTczXDFcMFwyXDE3M1wxXDBcNlwxNzNcMVwwXDU1XDE3M1wzXDAiKwotICAgICJcMVwzMzZcNFwwXDJcdTAxMTFcMTBcMFwxXDM1M1wyXDBcMVwzNDFcMVwwIisKLSAgICAiXDVcdTAxMTFcMVwwXDEzXHUwMTExXDFcMFwxMlx1MDExMVwxXDBcNFx1MDExMVwxXDAiKwotICAgICJcNFx1MDExMVwxXDBcNFx1MDExMVwyXDBcMVwxNzNcMVwwXDFcdTAxMGRcMVx1MDExMCIrCi0gICAgIlwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczXDFcMFwyXDE3M1wxXDAiKwotICAgICJcNlwxNzNcMVwwXDU1XDE3M1wxXHUwMTEyXDFcMFwxMFx1MDExMlwxXHUwMTEzXDJcdTAxMTIiKwotICAgICJcMVx1MDExNFw0NVx1MDExMlwxXHUwMTE0XDIwXHUwMTEyXDFcdTAxMTVcMVwwXDEyXHUwMTE1XDFcdTAxMTMiKwotICAgICJcMVx1MDExNlw0NVx1MDExNVwxXHUwMTE2XDIwXHUwMTE1XDFcMTczXDJcMFwxXHUwMTEwXDFcMTczIisKLSAgICAiXDFcMFw0XDE3M1wxXDBcMVwxNzNcMVwwXDFcMTczXDFcdTAxMTdcMVwwIisKLSAgICAiXDZcMTczXDFcMFw1NlwxNzNcMlwwXDFcdTAxMTBcMVwxNzNcMVwwXDRcMTczIisKLSAgICAiXDFcMFwxXDE3M1wxXDBcMVwxNzNcMVx1MDExOFwxXDBcNlwxNzNcMVwwIisKLSAgICAiXDU1XDE3M1wzXDBcMVwzMzZcMTZcMFwxXDM1M1wyXDBcMVx1MDEwNVwxMjRcMCIrCi0gICAgIlwxXHUwMTE5XDJcMFwxXHUwMTE5XDcyXDBcMVx1MDExYVwxNFwwXDFcdTAxMWFcNjBcMCIrCi0gICAgIlwyXHUwMTFiXDUwXDBcMjNcdTAxMWNcMVx1MDExZFw2MFx1MDExY1w2XDBcNFwyMTBcNlwwIisKLSAgICAiXDFcMjEwXDZcMFw1XDIxMFwxXDBcMTNcMjEwXDFcMFwxMlwyMTBcMVwwIisKLSAgICAiXDRcMjEwXDFcMFwxMVwyMTBcNTRcMFwxXHUwMTFlXDEyMFwwXDFcdTAxMWZcMTBcMCIrCi0gICAgIlwxXHUwMTFmXDNcMFwxXDIxM1wyXDBcMVx1MDEyMFwxXDIxM1wxXDBcNFwyMTMiKwotICAgICJcMVwwXDFcMjEzXDFcMFwyXDIxM1wxXDBcNlwyMTNcMVwwXDU1XDIxMyIrCi0gICAgIlwxXHUwMTIxXDFcMFwxMFx1MDEyMVwxXHUwMTIyXDJcdTAxMjFcMVx1MDEyM1w0NVx1MDEyMVwxXHUwMTIzIisKLSAgICAiXDIwXHUwMTIxXDFcdTAxMjRcMVwwXDFcdTAxMjRcMlx1MDEyNVwxXHUwMTI0XDRcdTAxMjVcMlx1MDEyNCIrCi0gICAgIlwxXHUwMTI2XDFcdTAxMjdcMVx1MDEyNFw0XHUwMTI1XDFcdTAxMjRcMTBcdTAxMjVcMVx1MDEyNFwyNlx1MDEyNSIrCi0gICAgIlwxXHUwMTI3XDEwXHUwMTI1XDJcdTAxMjRcNFx1MDEyNVwyXHUwMTI0XDFcMjE3XDJcdTAxMWNcMVx1MDEyOCIrCi0gICAgIlwxXDIxN1wxXHUwMTFjXDRcMjE3XDFcdTAxMWNcMVwyMTdcMVx1MDExY1wyXDIxN1wxXHUwMTFjIisKLSAgICAiXDNcMjE3XDFcdTAxMjlcMlwyMTdcMVx1MDExY1w1NVwyMTdcMVwyMjBcMlwwXDFcdTAxMmEiKwotICAgICJcMVwyMjBcMVwwXDRcMjIwXDFcMFwxXDIyMFwxXDBcMlwyMjBcMVwwIisKLSAgICAiXDZcMjIwXDFcMFw1NVwyMjBcMTJcdTAxMmJcMVx1MDEyY1w3MVx1MDEyYlwxNFx1MDEyZFwxXHUwMTJjIisKLSAgICAiXDY3XHUwMTJkXDFcMjI0XDJcdTAxMWNcMVx1MDEyZVwxXDIyNFwxXHUwMTFjXDRcMjI0XDFcdTAxMWMiKwotICAgICJcMVwyMjRcMVx1MDExY1wyXDIyNFwxXHUwMTFjXDNcMjI0XDFcdTAxMmZcMlwyMjRcMVx1MDExYyIrCi0gICAgIlw1NVwyMjRcMVwyMjVcMlwwXDFcdTAxMzBcMVwyMjVcMVwwXDRcMjI1XDFcMCIrCi0gICAgIlwxXDIyNVwxXDBcMlwyMjVcMVwwXDZcMjI1XDFcMFw1NVwyMjVcMVx1MDEzMSIrCi0gICAgIlwxXDBcMTBcdTAxMzFcMVx1MDEzMlwyXHUwMTMxXDFcdTAxMzNcNDVcdTAxMzFcMVx1MDEzM1wyMFx1MDEzMSIrCi0gICAgIlwxXHUwMTM0XDFcMFwxXHUwMTM0XDJcdTAxMzVcMVx1MDEzNFw0XHUwMTM1XDJcdTAxMzRcMVx1MDEzNiIrCi0gICAgIlwxXHUwMTM3XDFcdTAxMzRcNFx1MDEzNVwxXHUwMTM0XDEwXHUwMTM1XDFcdTAxMzRcMjZcdTAxMzVcMVx1MDEzNyIrCi0gICAgIlwxMFx1MDEzNVwyXHUwMTM0XDRcdTAxMzVcMlx1MDEzNFwyXDIzMVwxXDBcMTAzXDIzMVwxXDAiKwotICAgICJcMTdcMjMxXDFcdTAxMzhcMlwyMzFcMVx1MDEzOVw1NlwyMzFcMVwyMzRcMlwwXDFcdTAxM2EiKwotICAgICJcMVwyMzRcMVwwXDRcMjM0XDFcMFwxXDIzNFwxXDBcMlwyMzRcMVwwIisKLSAgICAiXDZcMjM0XDFcMFw1NVwyMzRcMVx1MDEzYlwxXDBcMTBcdTAxM2JcMVx1MDEzY1wyXHUwMTNiIisKLSAgICAiXDFcdTAxM2RcNDVcdTAxM2JcMVx1MDEzZFwyMFx1MDEzYlwxXHUwMTNlXDFcMFwxXHUwMTNlXDJcdTAxM2YiKwotICAgICJcMVx1MDEzZVw0XHUwMTNmXDJcdTAxM2VcMVx1MDE0MFwxXHUwMTQxXDFcdTAxM2VcNFx1MDEzZlwxXHUwMTNlIisKLSAgICAiXDEwXHUwMTNmXDFcdTAxM2VcMjZcdTAxM2ZcMVx1MDE0MVwxMFx1MDEzZlwyXHUwMTNlXDRcdTAxM2ZcMlx1MDEzZSIrCi0gICAgIlwyXDI0MFwxXDBcMTAzXDI0MFwxXDBcMTdcMjQwXDFcdTAxNDJcMlwyNDBcMVx1MDE0MyIrCi0gICAgIlw1NlwyNDBcMjJcMFwxXDM0MFwyXDBcMVwzNTRcNjVcMFwxXHUwMTQ0XDc0XDAiKwotICAgICJcMVwyNTFcMVwwXDEyXDI1MVwxXDBcMVx1MDE0NVw0NVwyNTFcMVx1MDE0NVwyMFwyNTEiKwotICAgICJcM1wwXDFcdTAxNDZcMTZcMFwxXDM1M1wyXDBcMVwzNTRcNTZcMFwxXDI1MSIrCi0gICAgIlwxXDBcM1wyNTFcMVwyNTNcNlwyNTFcMVwwXDFcdTAxNDVcMVwyNTFcMVwyNTMiKwotICAgICJcNlwyNTFcMVwyNTNcMzRcMjUxXDFcdTAxNDVcMzZcMjUxXDFcdTAxNDdcMTAzXDI1MVwxXHUwMTQ4IisKLSAgICAiXDY1XDI1MVwxXDI1N1wxXDBcMTBcMjU3XDFcMFwyXDI1N1wxXHUwMTQ5XDQ1XDI1NyIrCi0gICAgIlwxXHUwMTQ5XDIxXDI1N1wxXDBcM1wyNTdcMVwyNjBcNFwyNTdcMVwwXDJcMjU3IisKLSAgICAiXDFcdTAxNDlcMVwyNTdcMVwyNjBcNlwyNTdcMVwyNjBcMzRcMjU3XDFcdTAxNDlcMzZcMjU3IisKLSAgICAiXDFcdTAxNGFcMTAzXDI1N1wxXHUwMTRiXDY1XDI1N1wxMlwyNjRcMVwwXDFcMjY0XDFcMCIrCi0gICAgIlwxXHUwMTRjXDY1XDI2NFwxXDBcMTJcMjY0XDFcMFwxXDI2NFwxXDBcMVx1MDE0YyIrCi0gICAgIlw0XDI2NFwxXHUwMTRkXDYwXDI2NFwxXDBcMTJcMjY0XDFcMFwxXDI2NFwxXDAiKwotICAgICJcMVwyNjRcMVx1MDE0ZVw2NFwyNjRcMVx1MDE0ZlwxNFx1MDE1MFwxXHUwMTUxXDEwM1x1MDE1MFwxXHUwMTUxIisKLSAgICAiXDVcdTAxNTBcMVx1MDE1MlwyXHUwMTUwXDFcdTAxNTNcNTZcdTAxNTBcMTJcdTAxNTRcMVx1MDE1NVwxMDNcdTAxNTQiKwotICAgICJcMVx1MDE1NVw3XHUwMTU0XDFcdTAxNTZcMlx1MDE1NFwxXHUwMTU3XDU2XHUwMTU0XDEyXDMwMlwxXDAiKwotICAgICJcNjdcMzAyXDFcdTAxNThcMVwwXDEyXDMwMlwxXDBcN1wzMDJcMVx1MDE1OVw1N1wzMDIiKwotICAgICJcMVx1MDE1OFwxXDBcMTJcMzAyXDFcdTAxNWFcNzFcMzAyXDE0XDMwNlwxXDBcNjVcMzA2IisKLSAgICAiXDFcdTAxNWJcMVwwXDE0XDMwNlwxXDBcNVwzMDZcMVx1MDE1Y1w1N1wzMDZcMVx1MDE1YiIrCi0gICAgIlwxXDBcMTRcMzA2XDFcdTAxNWRcNjdcMzA2XDEyXDMxMVwxXDBcMVwzMTFcMVwwIisKLSAgICAiXDY2XDMxMVwxXDBcMTJcMzExXDFcMFwxXDMxMVwxXDBcNVwzMTFcMVx1MDE1ZSIrCi0gICAgIlw2MFwzMTFcMVwwXDEyXDMxMVwxXDBcMVwzMTFcMVwwXDFcMzExXDFcdTAxNWYiKwotICAgICJcNjRcMzExXDFcMFwxNFx1MDE2MFwxXHUwMTYxXDEwM1x1MDE2MFwxXHUwMTYxXDVcdTAxNjBcMVx1MDE2MiIrCi0gICAgIlwyXHUwMTYwXDFcdTAxNjNcNTZcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwxMDNcdTAxNjRcMVx1MDE2NVw3XHUwMTY0IisKLSAgICAiXDFcdTAxNjZcMlx1MDE2NFwxXHUwMTY3XDU2XHUwMTY0XDEyXDMyN1wxXDBcNjdcMzI3XDFcdTAxNjgiKwotICAgICJcMVwwXDEyXDMyN1wxXDBcN1wzMjdcMVx1MDE2OVw1N1wzMjdcMVx1MDE2OFwxXDAiKwotICAgICJcMTJcMzI3XDFcdTAxNmFcNzFcMzI3XDE0XDMzM1wxXDBcNjVcMzMzXDFcdTAxNmJcMVwwIisKLSAgICAiXDE0XDMzM1wxXDBcNVwzMzNcMVx1MDE2Y1w1N1wzMzNcMVx1MDE2YlwxXDBcMTRcMzMzIisKLSAgICAiXDFcdTAxNmRcNjdcMzMzXDdcMFwxXHUwMTZlXDExXDBcMVx1MDE2ZlwzXDBcMVx1MDE3MCIrCi0gICAgIlwyMlwwXDFcdTAxNzFcNDJcMFwxXHUwMTcyXDI0XDBcMVx1MDE3M1w1NFwwXDFcMzQyIisKLSAgICAiXDJcMFwyXHUwMTc0XDVcMFwxXDM0Mlw2XDBcMVwzNDJcNVx1MDE3NFwxXDAiKwotICAgICJcMTNcdTAxNzRcMVwwXDEyXHUwMTc0XDFcMFw0XHUwMTc0XDFcMFw0XHUwMTc0XDFcMCIrCi0gICAgIlw0XHUwMTc0XDJcMFwxXHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzZcNFwzNDNcMVx1MDE3NSIrCi0gICAgIlwxXDBcM1x1MDE3NVwxXHUwMTc2XDFcMzQzXDFcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3NiIrCi0gICAgIlw1XDM0M1wxXHUwMTc1XDEzXDM0M1wxXHUwMTc1XDEyXDM0M1wxXHUwMTc1XDRcMzQzXDFcdTAxNzciKwotICAgICJcMTFcMzQzXDJcdTAxNzVcMjBcMFwxXHUwMTc4XDdcMFwxXHUwMTc5XDcwXDBcMVwzNDYiKwotICAgICJcNjZcMFwxMDNcMzQ3XDFcdTAxN2FcMVx1MDE3NVwxXDBcM1x1MDE3NVwxXHUwMTc2XDRcMzUwIisKLSAgICAiXDFcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3NlwxXDM1MFwxXHUwMTc1XDFcMFwzXHUwMTc1IisKLSAgICAiXDFcdTAxNzZcNVwzNTBcMVx1MDE3NVwxM1wzNTBcMVx1MDE3NVwxMlwzNTBcMVx1MDE3NVw0XDM1MCIrCi0gICAgIlwxXHUwMTdiXDExXDM1MFwyXHUwMTc1XDEwM1wzNTFcMVx1MDE3Y1w2M1wwXDFcMzUyXDI3XDAiKwotICAgICJcMVx1MDE2ZVwxNVwwXDFcdTAxNzBcMjJcMFwxXHUwMTcxXDY3XDBcMVx1MDE3M1w1MVwwIisKLSAgICAiXDFcdTAxN2RcMTAzXDBcMVx1MDE3ZVwxMDdcMFw0XDExM1w2XDBcMVwxMTNcNlwwIisKLSAgICAiXDNcMTEzXDJcdTAxN2ZcMVwwXDEzXDExM1wxXDBcMTJcMTEzXDFcMFw0XDExMyIrCi0gICAgIlwxXDBcMTFcMTEzXDEwXDBcNFwxMTNcNlwwXDFcMTEzXDZcMFw1XDExMyIrCi0gICAgIlwxXDBcMTNcMTEzXDFcMFwyXDExM1wxXHUwMTgwXDdcMTEzXDFcMFw0XDExMyIrCi0gICAgIlwxXDBcNlwxMTNcMVx1MDE4MFwyXDExM1wyXDBcMTJcMzY1XDFcMzY2XDNcMzY1IisKLSAgICAiXDFcMFw2NVwzNjVcMTRcMzcwXDFcMzY2XDFcMzcwXDFcMFw2NVwzNzBcMVwzNzUiKwotICAgICJcMVwwXDEwXDM3NVwxXDM3N1wyXDM3NVwxXHUwMTgxXDQ1XDM3NVwxXHUwMTgxXDIwXDM3NSIrCi0gICAgIlwxXDE0MVwyXDM3NVwxXDM3NlwxXDE0MVwxXDM3NVw0XDE0MVwxXDM3N1wxXDE0MSIrCi0gICAgIlwxXDM3NVwxXDE0MVwxXDEzN1wxXDM3NVw2XDE0MVwxXDM3NVw1NVwxNDFcMVx1MDEwMSIrCi0gICAgIlwxXDBcMTJcdTAxMDFcMVwzNzdcMVx1MDE4Mlw0NVx1MDEwMVwxXHUwMTgyXDIwXHUwMTAxXDFcMTQyIisKLSAgICAiXDJcdTAxMDFcMVx1MDEwMlwxXDE0MlwxXHUwMTAxXDRcMTQyXDFcdTAxMDFcMVwxNDJcMVwzNzciKwotICAgICJcMVwxNDJcMVwxMzdcMVx1MDEwMVw2XDE0MlwxXHUwMTAxXDU1XDE0MlwxMlx1MDEwOFwxXHUwMTA5IisKLSAgICAiXDNcdTAxMDhcMVwwXDY1XHUwMTA4XDE0XHUwMTBiXDFcdTAxMDlcMVx1MDEwYlwxXDBcNjVcdTAxMGIiKwotICAgICJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcNlwxNjZcMVx1MDE4M1wyXDE2NiIrCi0gICAgIlwxMFwwXDRcdTAxMGZcNlwwXDFcdTAxMGZcNlwwXDVcdTAxMGZcMVwwXDEzXHUwMTBmIisKLSAgICAiXDFcMFwxMlx1MDEwZlwxXDBcNFx1MDEwZlwxXDBcMTFcdTAxMGZcMTBcMFw0XHUwMTExIisKLSAgICAiXDZcMFwxXHUwMTExXDZcMFw1XHUwMTExXDFcMFwxM1x1MDExMVwxXDBcMTJcdTAxMTEiKwotICAgICJcMVwwXDRcdTAxMTFcMVwwXDExXHUwMTExXDJcMFwxMlx1MDExMlwxXHUwMTEzXDNcdTAxMTIiKwotICAgICJcMVwwXDY1XHUwMTEyXDE0XHUwMTE1XDFcdTAxMTNcMVx1MDExNVwxXDBcNjVcdTAxMTVcMVx1MDE4NCIrCi0gICAgIlwyXHUwMTg1XDFcdTAxODZcMVx1MDE4NFwxXHUwMTg1XDRcdTAxODRcMVx1MDE4NVwxXHUwMTg0XDFcdTAxODUiKwotICAgICJcMlx1MDE4NFwxXHUwMTg1XDZcdTAxODRcMVx1MDE4NVw1NFx1MDE4NFwxXDE3M1wxXHUwMTg3XDJcdTAxODgiKwotICAgICJcMVx1MDE4OVwxXHUwMTg3XDFcdTAxODhcNFx1MDE4N1wxXHUwMTg4XDFcdTAxODdcMVx1MDE4OFwyXHUwMTg3IisKLSAgICAiXDFcdTAxODhcNlx1MDE4N1wxXHUwMTg4XDU0XHUwMTg3XDFcMTczXDM1XDBcMVx1MDE4YVwzNFwwIisKLSAgICAiXDFcdTAxOGFcNTFcMFwxXHUwMThiXDE0XDBcMVx1MDE4Ylw3MFwwXDFcdTAxOGNcMTFcMCIrCi0gICAgIlwxXHUwMThjXDczXDBcMVx1MDE4ZFwxN1wwXDFcdTAxOGRcMTEwXDBcMVx1MDE4ZVw3XDAiKwotICAgICJcMVx1MDE4ZVwyXDBcMTJcdTAxMjFcMVx1MDEyMlwzXHUwMTIxXDFcMFw2NVx1MDEyMVwxXHUwMTI0IisKLSAgICAiXDFcMFwxMlx1MDEyNFwxXHUwMTIyXDFcdTAxOGZcNDVcdTAxMjRcMVx1MDE4ZlwyMVx1MDEyNFwxXDAiKwotICAgICJcMTJcdTAxMjRcMVx1MDE5MFwxXHUwMThmXDQ1XHUwMTI0XDFcdTAxOGZcMjBcdTAxMjRcMTRcMFwxXHUwMTkxIisKLSAgICAiXDY3XDBcMTRcdTAxMjRcMVx1MDE5MFwxXHUwMTI0XDFcMFw2NVx1MDEyNFwxMlx1MDEzMVwxXHUwMTMyIisKLSAgICAiXDNcdTAxMzFcMVwwXDY1XHUwMTMxXDFcdTAxMzRcMVwwXDEyXHUwMTM0XDFcdTAxMzJcMVx1MDE5MiIrCi0gICAgIlw0NVx1MDEzNFwxXHUwMTkyXDIxXHUwMTM0XDFcMFwxMlx1MDEzNFwxXHUwMTkzXDFcdTAxOTJcNDVcdTAxMzQiKwotICAgICJcMVx1MDE5MlwyMFx1MDEzNFwxNFwwXDFcdTAxOTRcNjdcMFwxNFx1MDEzNFwxXHUwMTkzXDFcdTAxMzQiKwotICAgICJcMVwwXDY1XHUwMTM0XDJcMjMxXDFcMFw0XDIzMVwxXHUwMTk1XDE1XDIzMVwxXHUwMTk2IisKLSAgICAiXDIyXDIzMVwxXHUwMTk3XDM1XDIzMVwxXDBcMzFcMjMxXDFcdTAxOThcNDdcMjMxXDEyXHUwMTNiIisKLSAgICAiXDFcdTAxM2NcM1x1MDEzYlwxXDBcNjVcdTAxM2JcMVx1MDEzZVwxXDBcMTJcdTAxM2VcMVx1MDEzYyIrCi0gICAgIlwxXHUwMTk5XDQ1XHUwMTNlXDFcdTAxOTlcMjFcdTAxM2VcMVwwXDEyXHUwMTNlXDFcdTAxOWFcMVx1MDE5OSIrCi0gICAgIlw0NVx1MDEzZVwxXHUwMTk5XDIwXHUwMTNlXDE0XDBcMVx1MDE5Ylw2N1wwXDE0XHUwMTNlXDFcdTAxOWEiKwotICAgICJcMVx1MDEzZVwxXDBcNjVcdTAxM2VcMlwyNDBcMVwwXDRcMjQwXDFcdTAxOWNcMTVcMjQwIisKLSAgICAiXDFcdTAxOWRcMjJcMjQwXDFcdTAxOWVcMzVcMjQwXDFcMFwzMVwyNDBcMVx1MDE5Zlw0N1wyNDAiKwotICAgICJcMjJcMFwxXHUwMWEwXDYxXDBcMTZcMjUxXDFcMFw2NVwyNTFcMTZcMjU3XDFcMCIrCi0gICAgIlw2NVwyNTdcMTJcMjY0XDFcMFwxXDI2NFwxXDBcMVwyNjRcMVx1MDFhMVw2NFwyNjQiKwotICAgICJcMVx1MDE0Zlw3XDI2NFwxXHUwMWEyXDJcMjY0XDFcMFwxXDI2NFwxXDBcMVx1MDE0YyIrCi0gICAgIlw3XDI2NFwxXHUwMWEzXDIyXDI2NFwxXHUwMWE0XDMyXDI2NFwxXDBcMTJcdTAxYTFcMVwwIisKLSAgICAiXDFcdTAxYTFcMVwwXDY2XHUwMWExXDFcMFwxMlx1MDE0ZlwxXDBcMVx1MDE0ZlwxXDAiKwotICAgICJcMVx1MDFhNVw2NVx1MDE0ZlwxXDBcN1x1MDE1MFwxXHUwMWE2XDRcdTAxNTBcMVx1MDE1MVwxMFx1MDE1MCIrCi0gICAgIlwxXHUwMWE3XDIyXHUwMTUwXDFcdTAxYThcNDdcdTAxNTBcMVx1MDE1MVwxN1x1MDE1MFwxXHUwMWE5XDQ3XHUwMTUwIisKLSAgICAiXDdcdTAxNTRcMVx1MDFhYVwyXHUwMTU0XDFcdTAxNTVcMTJcdTAxNTRcMVx1MDFhYlwyMlx1MDE1NFwxXHUwMWFjIisKLSAgICAiXDQ1XHUwMTU0XDFcdTAxNTVcMjFcdTAxNTRcMVx1MDFhZFw0N1x1MDE1NFwxMlwzMDJcMVwwXDEwMFwzMDIiKwotICAgICJcMVx1MDFhZVwyXDMwMlwxXDBcMTJcMzAyXDFcdTAxYWZcMjJcMzAyXDFcdTAxYjBcMzFcMzAyIisKLSAgICAiXDFcdTAxNThcMVwwXDEwMlx1MDFiMVwxXHUwMWIyXDFcdTAxYjFcMTRcMzA2XDFcMFw3NlwzMDYiKwotICAgICJcMVx1MDFiM1w0XDMwNlwxXDBcMTBcMzA2XDFcdTAxYjRcMjJcMzA2XDFcdTAxYjVcMzFcMzA2IisKLSAgICAiXDFcdTAxNWJcMVwwXDEwMlx1MDFiNlwxXHUwMWI3XDFcdTAxYjZcN1wzMTFcMVx1MDFiOFwyXDMxMSIrCi0gICAgIlwxXDBcMVwzMTFcMVwwXDEwXDMxMVwxXHUwMWI5XDIyXDMxMVwxXHUwMWJhXDMyXDMxMSIrCi0gICAgIlwxXDBcN1x1MDE2MFwxXHUwMWJiXDRcdTAxNjBcMVx1MDE2MVwxMFx1MDE2MFwxXHUwMWJjXDIyXHUwMTYwIisKLSAgICAiXDFcdTAxYmRcNDdcdTAxNjBcMVx1MDE2MVwxN1x1MDE2MFwxXHUwMWJlXDQ3XHUwMTYwXDdcdTAxNjRcMVx1MDFiZiIrCi0gICAgIlwyXHUwMTY0XDFcdTAxNjVcMTJcdTAxNjRcMVx1MDFjMFwyMlx1MDE2NFwxXHUwMWMxXDQ1XHUwMTY0XDFcdTAxNjUiKwotICAgICJcMjFcdTAxNjRcMVx1MDFjMlw0N1x1MDE2NFwxMlwzMjdcMVwwXDEwMFwzMjdcMVx1MDFjM1wyXDMyNyIrCi0gICAgIlwxXDBcMTJcMzI3XDFcdTAxYzRcMjJcMzI3XDFcdTAxYzVcMzFcMzI3XDFcdTAxNjhcMVwwIisKLSAgICAiXDEwMlx1MDFjNlwxXHUwMWM3XDFcdTAxYzZcMTRcMzMzXDFcMFw3NlwzMzNcMVx1MDFjOFw0XDMzMyIrCi0gICAgIlwxXDBcMTBcMzMzXDFcdTAxYzlcMjJcMzMzXDFcdTAxY2FcMzFcMzMzXDFcdTAxNmJcMVwwIisKLSAgICAiXDEwMlx1MDFjYlwxXHUwMWNjXDFcdTAxY2JcN1wwXDFcdTAxY2RcMTAzXDBcMVx1MDFjZVwxMzFcMCIrCi0gICAgIlwxXHUwMWNmXDQ2XDBcMVx1MDE3NFwxXDBcMTFcdTAxNzRcMVwwXDZcdTAxNzRcMVwwIisKLSAgICAiXDYxXHUwMTc0XDFcdTAxNzVcMVwwXDExXHUwMTc1XDFcMFw2XHUwMTc1XDFcMFw0NVx1MDE3NSIrCi0gICAgIlwxXDBcMTRcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3Nlw1XHUwMTc1XDFcMFwzXHUwMTc1IisKLSAgICAiXDFcdTAxNzZcMlx1MDE3NVwxXDBcM1x1MDE3NVwxXHUwMTc2XDQxXHUwMTc1XDFcdTAxZDBcMTNcdTAxNzUiKwotICAgICJcMjBcMFwxXHUwMTc4XDQ3XDBcMVx1MDFkMVwzM1wwXDFcdTAxZDJcMTRcMFwzXHUwMWQyIisKLSAgICAiXDJcMFwxXHUwMWQyXDExXDBcMVx1MDFkMlwxXDBcMlx1MDFkMlw2XDBcMVx1MDFkMiIrCi0gICAgIlwyXDBcMlx1MDFkMlw2XDBcMVx1MDFkMlwxMFwwXDRcMTEzXDZcMFwxXDExMyIrCi0gICAgIlw2XDBcNVwxMTNcMVwwXDExXDExM1wxXHUwMWQzXDFcMTEzXDFcMFwxXHUwMWQzIisKLSAgICAiXDExXDExM1wxXDBcNFwxMTNcMVwwXDExXDExM1wyXDBcMTJcMzc1XDFcMzc3IisKLSAgICAiXDNcMzc1XDFcMFw2NVwzNzVcMTRcdTAxMDFcMVwzNzdcMVx1MDEwMVwxXDBcNjVcdTAxMDEiKwotICAgICJcNlwwXDNcMTY2XDFcdTAxZDRcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcdTAxODRcMlx1MDE4NVwxXHUwMTg2XDFcdTAxODRcMVx1MDE4NVw0XHUwMTg0XDFcdTAxODVcMVx1MDE4NCIrCi0gICAgIlwxXHUwMTg1XDJcdTAxODRcMVx1MDE4NVw2XHUwMTg0XDFcdTAxODVcNTRcdTAxODRcMVx1MDFkNVwxMDNcdTAxODUiKwotICAgICJcMVx1MDFkNlwxXHUwMTg3XDJcdTAxODhcMVx1MDE4OVwxXHUwMTg3XDFcdTAxODhcNFx1MDE4N1wxXHUwMTg4IisKLSAgICAiXDFcdTAxODdcMVx1MDE4OFwyXHUwMTg3XDFcdTAxODhcNlx1MDE4N1wxXHUwMTg4XDU0XHUwMTg3XDFcdTAxZDUiKwotICAgICJcMTAzXHUwMTg4XDFcdTAxZDdcNDBcMFwxXHUwMWQ4XDE0XDBcMVx1MDFkOFw2MFwwXDJcdTAxZDkiKwotICAgICJcMTAxXDBcMVx1MDFkYVwxMTJcMFwxXHUwMWRiXDE0XDBcMVx1MDFkYlw2MFwwXDJcdTAxZGMiKwotICAgICJcNTBcMFwxNFx1MDEyNFwxXHUwMTIyXDFcdTAxMjRcMVwwXDY1XHUwMTI0XDNcMFwyXHUwMWRkIisKLSAgICAiXDFcMFw0XHUwMWRkXDJcMFwxXHUwMTI2XDFcdTAxZGRcMVwwXDRcdTAxZGRcMVwwIisKLSAgICAiXDEwXHUwMWRkXDFcMFwzN1x1MDFkZFwyXDBcNFx1MDFkZFwyXDBcMTRcdTAxMzRcMVx1MDEzMiIrCi0gICAgIlwxXHUwMTM0XDFcMFw2NVx1MDEzNFwzXDBcMlx1MDFkZVwxXDBcNFx1MDFkZVwyXDAiKwotICAgICJcMVx1MDEzNlwxXHUwMWRlXDFcMFw0XHUwMWRlXDFcMFwxMFx1MDFkZVwxXDBcMzdcdTAxZGUiKwotICAgICJcMlwwXDRcdTAxZGVcMlwwXDJcMjMxXDFcMFw0XDIzMVwxXHUwMWRmXDc2XDIzMSIrCi0gICAgIlwxXDBcMzJcMjMxXDFcdTAxZTBcNDZcMjMxXDE0XHUwMTNlXDFcdTAxM2NcMVx1MDEzZVwxXDAiKwotICAgICJcNjVcdTAxM2VcM1wwXDJcdTAxZTFcMVwwXDRcdTAxZTFcMlwwXDFcdTAxNDBcMVx1MDFlMSIrCi0gICAgIlwxXDBcNFx1MDFlMVwxXDBcMTBcdTAxZTFcMVwwXDM3XHUwMWUxXDJcMFw0XHUwMWUxIisKLSAgICAiXDJcMFwyXDI0MFwxXDBcNFwyNDBcMVx1MDFlMlw3NlwyNDBcMVwwXDMyXDI0MCIrCi0gICAgIlwxXHUwMWUzXDQ2XDI0MFwyXDBcMVx1MDFlNFwxMDFcMFw3XDI2NFwxXHUwMWU1XDJcMjY0IisKLSAgICAiXDFcMFwxXDI2NFwxXDBcMVx1MDE0Y1w2NVwyNjRcMVwwXDEyXHUwMTRmXDFcMCIrCi0gICAgIlwxXHUwMTRmXDFcMFwxXHUwMTRmXDFcMFw2NVx1MDE0Zlw3XHUwMTUwXDFcdTAxZTZcNFx1MDE1MCIrCi0gICAgIlwxXHUwMTUxXDEwM1x1MDE1MFwxXHUwMTUxXDIwXHUwMTUwXDFcdTAxZTdcNDZcdTAxNTBcN1x1MDE1NFwxXHUwMWU4IisKLSAgICAiXDJcdTAxNTRcMVx1MDE1NVwxMDNcdTAxNTRcMVx1MDE1NVwyMlx1MDE1NFwxXHUwMWU5XDQ2XHUwMTU0XDdcMzAyIisKLSAgICAiXDFcdTAxZWFcMlwzMDJcMVwwXDY3XDMwMlwxXHUwMTU4XDFcMFwxMlx1MDFlYlwxXHUwMWVjIisKLSAgICAiXDcwXHUwMWViXDFcMFw3XDMwNlwxXHUwMWVkXDRcMzA2XDFcMFw2NVwzMDZcMVx1MDE1YiIrCi0gICAgIlwxXDBcMTRcdTAxZWVcMVx1MDFlY1w2Nlx1MDFlZVwxXDBcN1wzMTFcMVx1MDFlZlwyXDMxMSIrCi0gICAgIlwxXDBcMVwzMTFcMVwwXDY2XDMxMVwxXDBcN1x1MDE2MFwxXHUwMWYwXDRcdTAxNjAiKwotICAgICJcMVx1MDE2MVwxMDNcdTAxNjBcMVx1MDE2MVwyMFx1MDE2MFwxXHUwMWYxXDQ2XHUwMTYwXDdcdTAxNjRcMVx1MDFmMiIrCi0gICAgIlwyXHUwMTY0XDFcdTAxNjVcMTAzXHUwMTY0XDFcdTAxNjVcMjJcdTAxNjRcMVx1MDFmM1w0Nlx1MDE2NFw3XDMyNyIrCi0gICAgIlwxXHUwMWY0XDJcMzI3XDFcMFw2N1wzMjdcMVx1MDE2OFwxXDBcMTJcdTAxZjVcMVx1MDFmNiIrCi0gICAgIlw3MFx1MDFmNVwxXDBcN1wzMzNcMVx1MDFmN1w0XDMzM1wxXDBcNjVcMzMzXDFcdTAxNmIiKwotICAgICJcMVwwXDE0XHUwMWY4XDFcdTAxZjZcNjZcdTAxZjhcMzdcMFwxXHUwMWY5XDEzNVwwXDFcdTAxZDAiKwotICAgICJcMzNcMFwxXHUwMWQyXDE0XDBcM1x1MDFkMlwyXDBcMVx1MDFkMlwxMVwwXDFcdTAxZDIiKwotICAgICJcMVwwXDJcdTAxZDJcNlwwXDFcdTAxZDJcMVwwXDFcdTAxZDFcMlx1MDFkMlw2XDAiKwotICAgICJcMVx1MDFkMlwxMFwwXDRcMTEzXDZcMFwxXDExM1w2XDBcNVwxMTNcMVwwIisKLSAgICAiXDZcMTEzXDFcdTAxZmFcNFwxMTNcMVwwXDEyXDExM1wxXDBcMVwxMTNcMVx1MDFmYSIrCi0gICAgIlwyXDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcNlwxNjZcMVx1MDFmYlw0XDE2NlwxXDBcNlwxNjZcMVx1MDFmYyIrCi0gICAgIlwzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw1NFwwXDFcdTAxZmRcNzZcMCIrCi0gICAgIlwxXHUwMWZlXDEzXDBcMVx1MDFmZVw2NFwwXDFcdTAxZmZcMTFcMFwxXHUwMWZmXDcxXDAiKwotICAgICJcMVx1MDIwMFwxMVwwXDFcdTAyMDBcNzRcMFwxXHUwMjAxXDEzXDBcMVx1MDIwMVwyMlwwIisKLSAgICAiXDJcMjMxXDFcMFwzM1wyMzFcMVx1MDIwMlw0NVwyMzFcMlwyNDBcMVwwXDMzXDI0MCIrCi0gICAgIlwxXHUwMjAzXDQ1XDI0MFwxNFx1MDE1MFwxXHUwMTUxXDIxXHUwMTUwXDFcdTAyMDRcNDVcdTAxNTBcMTJcdTAxNTQiKwotICAgICJcMVx1MDE1NVwyM1x1MDE1NFwxXHUwMjA1XDQ1XHUwMTU0XDEyXHUwMWViXDFcdTAxYjFcNjdcdTAxZWJcMVx1MDIwNiIrCi0gICAgIlwxXHUwMWIxXDE0XHUwMWVlXDFcdTAxYjZcNjVcdTAxZWVcMVx1MDIwN1wxXHUwMWI2XDE0XHUwMTYwXDFcdTAxNjEiKwotICAgICJcMjFcdTAxNjBcMVx1MDIwOFw0NVx1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDIzXHUwMTY0XDFcdTAyMDlcNDVcdTAxNjQiKwotICAgICJcMTJcdTAxZjVcMVx1MDFjNlw2N1x1MDFmNVwxXHUwMjBhXDFcdTAxYzZcMTRcdTAxZjhcMVx1MDFjYlw2NVx1MDFmOCIrCi0gICAgIlwxXHUwMjBiXDFcdTAxY2JcMzdcMFwxXHUwMjBjXDUyXDBcNFwxMTNcNlwwXDFcMTEzIisKLSAgICAiXDZcMFw1XDExM1wxXDBcM1wxMTNcMVx1MDIwZFw3XDExM1wxXDBcNFwxMTMiKwotICAgICJcMVx1MDIwZFw1XDExM1wxXDBcNFwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDExXDE2NlwxXHUwMjBlXDFcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDIwZlwyXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDU1XDBcMVx1MDIxMCIrCi0gICAgIlwyM1wwXDFcdTAyMTBcNTBcMFwxXHUwMjExXDE3XDBcMVx1MDIxMVw2NlwwXDFcdTAyMTIiKwotICAgICJcMTJcMFwxXHUwMjEyXDUyXDBcMVx1MDIxM1wxMDdcMFwxXHUwMjE0XDM0XDBcMVx1MDIxNCIrCi0gICAgIlwxMVwwXDJcMjMxXDFcMFwzNFwyMzFcMVx1MDIxNVw0NFwyMzFcMlwyNDBcMVwwIisKLSAgICAiXDM0XDI0MFwxXHUwMjE2XDQ0XDI0MFwxNFx1MDE1MFwxXHUwMTUxXDIyXHUwMTUwXDFcdTAyMTdcNDRcdTAxNTAiKwotICAgICJcMTJcdTAxNTRcMVx1MDE1NVwyNFx1MDE1NFwxXHUwMjE4XDQ0XHUwMTU0XDEyXHUwMWViXDFcdTAyMTlcNjdcdTAxZWIiKwotICAgICJcMVx1MDIwNlwxXHUwMWIxXDE0XHUwMWVlXDFcdTAyMWFcNjVcdTAxZWVcMVx1MDIwN1wxXHUwMWI2XDE0XHUwMTYwIisKLSAgICAiXDFcdTAxNjFcMjJcdTAxNjBcMVx1MDIxYlw0NFx1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDI0XHUwMTY0XDFcdTAyMWMiKwotICAgICJcNDRcdTAxNjRcMTJcdTAxZjVcMVx1MDIxZFw2N1x1MDFmNVwxXHUwMjBhXDFcdTAxYzZcMTRcdTAxZjhcMVx1MDIxZSIrCi0gICAgIlw2NVx1MDFmOFwxXHUwMjBiXDFcdTAxY2JcNDBcMFwxXHUwMjFmXDUxXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTFcMTY2XDFcdTAyMjBcMVwxNjZcMVwwIisKLSAgICAiXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDZcMTY2XDFcdTAyMjFcNFwxNjZcMVwwIisKLSAgICAiXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw0NFwwXDFcdTAyMjJcMTFcMCIrCi0gICAgIlwxXHUwMjIyXDY3XDBcMVx1MDIyM1wxNFwwXDFcdTAyMjNcNjZcMFwxXHUwMjI0XDE0XDAiKwotICAgICJcMVx1MDIyNFwyNlwwXDJcMjMxXDFcMFwzNVwyMzFcMVx1MDIyNVw0M1wyMzFcMlwyNDAiKwotICAgICJcMVwwXDM1XDI0MFwxXHUwMjI2XDQzXDI0MFwxNFx1MDE1MFwxXHUwMTUxXDIzXHUwMTUwXDFcdTAyMjciKwotICAgICJcNDNcdTAxNTBcMTJcdTAxNTRcMVx1MDE1NVwyNVx1MDE1NFwxXHUwMjI4XDQzXHUwMTU0XDE0XHUwMTYwXDFcdTAxNjEiKwotICAgICJcMjNcdTAxNjBcMVx1MDIyOVw0M1x1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDI1XHUwMTY0XDFcdTAyMmFcNDNcdTAxNjQiKwotICAgICJcMzdcMFwxXHUwMjJiXDUyXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjJjXDVcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcNVwxNjZcMVx1MDIyZFw1XDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDJcMFwyXDIzMVwxXDBcMzRcMjMxXDFcdTAyMmVcNDRcMjMxIisKLSAgICAiXDJcMjQwXDFcMFwzNFwyNDBcMVx1MDIyZlw0NFwyNDBcMTRcdTAxNTBcMVx1MDE1MVwyMlx1MDE1MCIrCi0gICAgIlwxXHUwMjMwXDQ0XHUwMTUwXDEyXHUwMTU0XDFcdTAxNTVcMjRcdTAxNTRcMVx1MDIzMVw0NFx1MDE1NFwxNFx1MDE2MCIrCi0gICAgIlwxXHUwMTYxXDIyXHUwMTYwXDFcdTAyMzJcNDRcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyNFx1MDE2NFwxXHUwMjMzIisKLSAgICAiXDQ0XHUwMTY0XDM0XDBcMVx1MDIzNFw1NVwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMVwxNjZcMVx1MDIzNVw3XDE2NlwyXDBcMlwyMzFcMVwwXDMxXDIzMVwxXHUwMjM2IisKLSAgICAiXDQ3XDIzMVwyXDI0MFwxXDBcMzFcMjQwXDFcdTAyMzdcNDdcMjQwXDE0XHUwMTUwXDFcdTAxNTEiKwotICAgICJcMTdcdTAxNTBcMVx1MDIzOFw0N1x1MDE1MFwxMlx1MDE1NFwxXHUwMTU1XDIxXHUwMTU0XDFcdTAyMzlcNDdcdTAxNTQiKwotICAgICJcMTRcdTAxNjBcMVx1MDE2MVwxN1x1MDE2MFwxXHUwMjNhXDQ3XHUwMTYwXDEyXHUwMTY0XDFcdTAxNjVcMjFcdTAxNjQiKwotICAgICJcMVx1MDIzYlw0N1x1MDE2NFw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjNjXDVcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTBcMTY2XDFcdTAyM2RcMlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcdTAyM2VcNlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDVcMTY2XDFcdTAyM2ZcNVwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwyXDBcNlx1MDI0MFw0XHUwMjQxXDZcdTAyNDBcMVx1MDI0MVw1XHUwMjQwIisKLSAgICAiXDFcMFw1XHUwMjQxXDFcdTAyNDBcMTNcdTAyNDFcMVx1MDI0MFwxMlx1MDI0MVwxXHUwMjQwXDRcdTAyNDEiKwotICAgICJcMVx1MDI0MFwxMVx1MDI0MVwyXHUwMjQwXDQxXDBcMVx1MDI0MlwzXDBcMVx1MDI0M1w3XDAiKwotICAgICJcMVx1MDI0NFwxXHUwMjQ1XDIwXDBcMVx1MDI0NlwxMlwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDRcMTY2XDFcdTAyNDdcM1wxNjZcMVx1MDI0OFwyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVx1MDI0OVwxXHUwMjRhXDRcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcNlwxNjZcMVx1MDI0YlwyXDE2Nlw2MFwwXDFcdTAyNGNcNzRcMFwxXHUwMjRkXDExMlwwIisKLSAgICAiXDFcdTAyNGVcMTAyXDBcMVx1MDI0ZlwxMDRcMFwxXHUwMjUwXDMzXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw1XDE2NlwxXHUwMjUxIisKLSAgICAiXDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTJcMTY2XDFcdTAyNTJcMVwwXDEyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI1M1w0XDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI1NFw1XDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI1NVw0XDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw0NVwwXDFcdTAyNTZcMTMyXDBcMVx1MDI1NyIrCi0gICAgIlwxMDRcMFwxXHUwMjU4XDY1XDBcMVx1MDI1OVwxMjFcMFwxXHUwMjVhXDE2XDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNlwxNjZcMVx1MDI1Ylw0XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxXDE2NlwxXHUwMjVjXDdcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwyXDE2NlwxXHUwMjVkXDZcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXHUwMjVlXDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwyXDE2NlwxXHUwMjVmXDZcMTY2XDQ3XDBcMVx1MDI2MCIrCi0gICAgIlw3MVwwXDFcdTAyNjFcMTAzXDBcMVx1MDI2MlwxMTNcMFwxXHUwMjYzXDEwMlwwXDFcdTAyNjQiKwotICAgICJcNDdcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjYiKwotICAgICJcMVx1MDI2NVwyXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw0XDE2NlwxXHUwMjY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNFwxNjZcMVx1MDI2N1wxXDBcMTNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw2XDE2NlwxXHUwMjY4XDRcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw1XDE2NlwxXHUwMjY5XDVcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNjBcMFwxXHUwMjZhIisKLSAgICAiXDEyNVwwXDFcdTAyNmJcNTBcMFwxXHUwMjZjXDEwM1wwXDFcdTAyNmRcNDRcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2IisKLSAgICAiXDFcdTAyNmVcNFwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDdcMTY2XDFcdTAyNmZcMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDI3MFwyXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyNzFcMlwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMDNcMFwxXHUwMjcyIisKLSAgICAiXDYxXDBcMVx1MDI1YVwxMjVcMFwxXHUwMjY0XDEwM1wwXDFcdTAyNzNcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDEwXDE2NlwxXHUwMjc0XDEwXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw2XDE2NlwxXHUwMjVmIisKLSAgICAiXDNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMFwxNjZcMVx1MDI2OVwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTBcMTY2XDFcdTAyNzVcMzVcMFwxXHUwMjVhXDE1MFwwXDFcdTAyNzZcMTFcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDRcMTY2XDFcdTAyNWZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFw3XDE2NlwxXHUwMjc3XDFcMTY2XDU3XDBcMVx1MDI1YSIrCi0gICAgIlwzNFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVx1MDI1Zlw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDAiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA5LCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgCi0gICAgIDMsICAzLCAgMywgIDMsICA5LCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsIAotICAgICAxLCAgMCwgIDEsICAwLCAgOSwgIDEsICAyLCAgMSwgIDIsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAKLSAgICAgMSwgIDksICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDksICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDAsIAotICAgICAxLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgOSwgIDAsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAyLCAKLSAgICAxMywgIDMsICAyLCAgMiwgMTMsICAzLCAgMiwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMiwgCi0gICAgMTMsICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgOSwgIDksIAotICAgICA5LCAgMCwgIDAsICAxLCAgMSwgIDEsICA5LCAgMCwgIDAsIDEzLCAgOSwgMTMsICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMywgIDIsICAyLCAgMywgIDIsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDIsICAzLCAgMywgIDIsICAyLCAgMywgIDMsICAyLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDIsICAzLCAgMywgIDIsICAyLCAgMywgCi0gICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgMCwgIDEsIAotICAgICA5LCAgMCwgIDEsICAxLCAgNSwgMTMsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgOSwgIDEsICAzLCAgMiwgIDMsICAyLCAgMSwgIDAsICA5LCAgMSwgIDAsICAxLCAgMywgCi0gICAgIDIsICAzLCAgMiwgIDEsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMSwgIDEsICAyLCAgMiwgIDAsICAwLCAgMiwgIDIsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMCwgIDAsICA5LCAgOSwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIAotICAgICAyLCAgMiwgIDIsICA5LCAgMSwgIDEsICAxLCAgMywgIDMsICAzLCAgMywgIDEsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsIAotICAgICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgLy8gcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOwotIAotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcKLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOwotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgYW4gZW1iZWRkZWQgcmVnaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQKLQlwcml2YXRlIFN0cmluZyBmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzCi0JLy8gICBiZWVuIGNvbXBsZXRlZAotCXByaXZhdGUgaW50IGZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ09OVEVYVCA9ICJQUk9YWV9DT05URVhUIjsKLQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0ID0gMDsKLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7Ci0JCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbgotCXByaXZhdGUgU3RyaW5nIGludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxDb250ZXh0ID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgwKTsKLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQotCS8vIHdoZXJlIHRoZSBsYXN0IGludGVybmFsIGNvbnRhaW5lciBibG9jayB3YXMgZm91bmQKLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOwotCQotCXByaXZhdGUgaW50IGZFTGxldmVsID0gMDsKLQotCXByaXZhdGUgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQotCQkJcmV0dXJuOwotCQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KFRhZ01hcmtlciBtYXJrZXIpIHsKLQkJZk5lc3RhYmxlUHJlZml4ZXMuYWRkKG1hcmtlcik7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsKLQkJcmV0dXJuIGZOZXN0YWJsZVByZWZpeGVzOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RhYmxlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCS8vSXRlcmF0b3IgYmxvY2tzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJLy93aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCS8vCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCS8vCVN0cmluZyBtYXJrZXJOYW1lID0gbWFya2VyLmdldFRhZ05hbWUoKTsKLQkJLy8JaWYodGFnTmFtZS5sZW5ndGgoKSA+IG1hcmtlck5hbWUubGVuZ3RoKCkgKyAxICYmIHRhZ05hbWUuc3RhcnRzV2l0aChtYXJrZXJOYW1lKSAmJiB0YWdOYW1lLmNoYXJBdChtYXJrZXJOYW1lLmxlbmd0aCgpKSA9PSAnOicpIHsKLQkJLy8JCXJldHVybiBtYXJrZXIuaXNHbG9iYWwoKSB8fCBnZXRPZmZzZXQoKSA+PSBtYXJrZXIuZ2V0TWFya2VyKCkuZ2V0U3RhcnQoKTsKLQkJLy8JfQotCQkvL30KLQkJLy9yZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgbmFtZSkgewotCQlpZiAoZk5lc3RhYmxlUHJlZml4ZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgbmVzdGFibGVzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChuZXN0YWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCgoVGFnTWFya2VyKSBuZXN0YWJsZXMubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQkJbmVzdGFibGVzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgewotCQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgewotCQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotCQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBudWxsLCBlbmRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcykgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgZW5kVHlwZXMsIG51bGwpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUeXBlKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBuZXcgU3RyaW5nW117ZW5kVHlwZX0sIG51bGwpOwotCX0KLQkvKioKLQkgKiAgdXNlciBtZXRob2QgCi0JICogCi0JICogQXNzZW1ibGVzIGFuIGVtYmVkZGVkIGNvbnRhaW5lciBiZWdpbm5pbmcgd2l0aCB0aGUgZ2l2ZW4gc3RhcnRUeXBlIGFzCi0JICogdGhlIGZpcnN0IENvbnRleHRSZWdpb24gd2l0aGluIGl0IGFuZCBvZiB0aGUgdHlwZSBmRW1iZWRkZWRIaW50LiAgVGhlCi0JICogZW5kVHlwZXNbXSBhcnJheSBjb250YWlucyB0aGUgY29udGV4dCB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgYSBzdWNjZXNzZnVsCi0JICogZXhpdC4gIFVzZSBvZiB0aGUgZW5kVGFnTmFtZSBwYXJhbWV0ZXIgYWx0ZXJzIHRoaXMgYmVoYXZpb3IgdG8gZm9yY2UgYW4KLQkgKiBleGl0IG9uIGFuIFhNTF9UQUdfQ0xPU0UgYWZ0ZXIgc2VlaW5nIGFuIFhNTF9UQUdfTkFNRSB3aG9zZSBzaWduaWZpY2FudAotCSAqIHRleHQgbWF0Y2hlcyB0aGUgZW5kVGFnTmFtZSBTdHJpbmcuICBBbGwgY29udGVudHMgaW4gYmV0d2VlbiBhcmUKLQkgKiBpbnNpZ25pZmljYW50LCBhbmQgeWVzLCB0aGlzIG1lYW5zIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluc2lkZS4KLQkgKiovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCS8vIHRoZSBjb250ZXh0IG9mIHRoZSByZWdpb24gYmVpbmcgYWRkZWQgdG8gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQlpbnRlcm5hbENvbnRleHQgPSBzdGFydFR5cGU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhpcyBjb250YWluZXIgYmVnYW47IHRvIHByb3ZpZGUgcmVsYXRpdmUgaW5kZWNlcyBmb3IgdGhlIHJlZ2lvbnMKLQkJaW50IGNvbnRhaW5lclN0YXJ0ID0geXljaGFyOwotCQlib29sZWFuIG5vdEZpbmlzaGVkID0gdHJ1ZTsKLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB3ZSBzZWVtIHRvIGJlIHNvIHRoYXQgdGhlIGVuZFRhZ05hbWUgY2FuIGJlIGNoZWNrZWQKLQkJYm9vbGVhbiBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNJbkZpcnN0VGFnID0gdHJ1ZTsKLQkJLy8gY3JlYXRlIHRoZSBlbWJlZGRlZCBjb250YWluZXIgYW5kIHNldHVwIGl0cyAidHlwZSIKLQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFR5cGUoZkVtYmVkZGVkSGludCk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoY29udGFpbmVyU3RhcnQpOwotCQkJLy8gVE9ETzogcGFyZW50IHJlZ2lvbiBuZWVkcyB0byBiZSBzZXQgLi4uLiBidXQgbm90IHN1cmUgd2hlcmUgdG8gZ2V0IGl0IGZyb20gCi0JCQkvLwkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFBhcmVudChwYXJlbnRSZWdpb24pOwotCQl9Ci0JCWNvbnRhaW5lclN0YXJ0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFN0YXJ0KCk7Ci0JCXdoaWxlIChub3RGaW5pc2hlZCkgewotCQkJLy8gYWRkIHRoZSByZWdpb24gdG8gdGhlIGNvbnRhaW5lcgotCQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkvLyBsb25nc2NhbiBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gYXR0ZW1wdCBhIGJsb2NrVGFnU2NhbiB3aXRoaW4gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQkJCWJvb2xlYW4gbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkvLyBzYXZlIHRoZSB0b2tlbml6ZXIgc3RhdGUgaW4gY2FzZSBvZiBhIGJsb2NrIHRhZyBzY2FuCi0JCQkJaW50IHByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJU3RyaW5nIHByZXZpb3VzQ3VycmVudFRhZ05hbWUgPSBmQ3VycmVudFRhZ05hbWU7Ci0JCQkJaW50IHByZXZpb3VzUG9zdFN0YXRlID0gZkVtYmVkZGVkUG9zdFN0YXRlOwotCQkJCVN0cmluZyBwcmV2aW91c0VtYmVkZGVkSGludCA9IGZFbWJlZGRlZEhpbnQ7Ci0JCQkJLy8gZGV0ZXJtaW5lIGlmIGEgYmxvY2sgdGFnIHNjYW4gaXMgbmVjZXNzYXJ5Ci0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsKLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQkJCWlmKCFpc05lc3RhYmxlKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JCQkJCQkvLyBzbmFnZ2VkIGEgdGFnIG5hbWUgd2Ugc2hvdWxkbid0IGhhdmUKLQkJCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0FCT1JUX0VNQkVEREVEOwotCQkJCQkJbm90RmluaXNoZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19PUEVOIHx8IGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JCQkJfQotCQkJCS8vIGRvIHVwa2VlcCBmb3IgZW5kVGFnTmFtZSB1c2FnZTsgbXVzdCBiZSBoZXJlIHNpbmNlIHRoZSBuZXh0IHRva2VuIGNvdWxkIGJlIHRoZSBjbG9zZQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpc0luRW5kVGFnID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCWlzSW5GaXJzdFRhZyA9IGlzSW5FbmRUYWcgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCSAJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQkJCWlmIChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpID4gMiAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19DTE9TRSAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpIC0gMykpLmdldFR5cGUoKSA9PSBYTUxfVEFHX09QRU4gJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChjb250YWluc1RhZ05hbWUoaW50ZXJuYWxUYWdOYW1lKSkgewotCQkJCQkJCWxvbmdzY2FuID0gdHJ1ZTsKLQkJCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobG9uZ3NjYW4pCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IGludGVybmFsVGFnTmFtZTsKLQkJCQkvLyByZWFkIHRoZSBuZXh0IHJlZ2lvbiBhbmQgY29udGV4dAotCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQlpZiAobG9uZ3NjYW4pIHsKLQkJCQkJLy8gUmV0dXJuaW5nIGZyb20gYSBibG9jayB0YWcgc2NhbiByZXF1aXJlcyByZXN0b3Jpbmcgc29tZSBzdGF0ZSB2YXJpYWJsZXMKLQkJCQkJLy8gYXMgd2VsbCBhcyBoYW5kbGluZyB0aGUgYmxvY2sgcmVnaW9uIGFuZCBzZXR0aW5nIHVwIGZvciBub3JtYWwgc2Nhbm5pbmcKLQkJCQkJLy8gaW5zaWRlIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIG5ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJCQlsb25nc2NhbiA9IGZhbHNlOwotCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBwcmV2aW91c1Bvc3RTdGF0ZTsKLQkJCQkJZkVtYmVkZGVkSGludCA9IHByZXZpb3VzRW1iZWRkZWRIaW50OwotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBwcmV2aW91c0N1cnJlbnRUYWdOYW1lOwotCQkJCQl5eWJlZ2luKHByZXZpb3VzU3RhdGUpOwotCQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHByaW1HZXROZXh0VG9rZW4oKSBjYWxscyBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24KLQkJCQkvLyBjYXRjaCBhbmQgZG8gbm90aGluZyBzaW5jZSB0aGUgaXNFT0YgY2hlY2sgYmVsb3cKLQkJCQkvLyB3aWxsIHByb3Blcmx5IGV4aXQgaWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmKSB7Ci0JCQkJLy8gc29tZSBvdGhlciBleGNlcHRpb24gaGFwcGVuZWQ7IG5ldmVyIHNob3VsZAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZik7Ci0JCQl9Ci0JCQlib29sZWFuIGlzRW5kaW5nVHlwZSA9IHl5c3RhdGUoKSA9PSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCWlmKCFpc0VuZGluZ1R5cGUpIHsKLQkJCQkvLyBjaGVjayBmb3IgZW5kaW5nIGNvbnRleHQKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5kVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlzRW5kaW5nVHlwZSA9IGlzRW5kaW5nVHlwZSB8fCAoaW50ZXJuYWxDb250ZXh0ID09IGVuZFR5cGVzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXNFbmRpbmdUeXBlID0gKChpc0luRW5kVGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB8fCAoaXNJbkZpcnN0VGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSkgJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwgJiYgaW50ZXJuYWxUYWdOYW1lLmVxdWFscyhlbmRUYWdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRMaXN0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCW5vdEZpbmlzaGVkID0gbm90RmluaXNoZWQgJiYgKCghaXNFbmRpbmdUeXBlKSAmJiAhaXNFT0YoKSAmJiAoZW5kVGFnTmFtZSAhPSBudWxsIHx8IGludGVybmFsQ29udGV4dCAhPSBVTkRFRklORUQpICYmICEoaW50ZXJuYWxDb250ZXh0ID09IFBST1hZX0NPTlRFWFQgJiYgKGVtYmVkZGVkTGlzdC5nZXQoZW1iZWRkZWRMaXN0LnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFVOREVGSU5FRCkpOwotCQl9Ci0JCS8vIGZpbmlzaCBhZGRpbmcgdGhlIGxhc3QgY29udGV4dAotCQlpZiAoaW50ZXJuYWxDb250ZXh0ICE9IG51bGwgJiYgaW50ZXJuYWxDb250ZXh0ICE9IFBST1hZX0NPTlRFWFQpIHsKLQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCX0KLQkJeXliZWdpbihmRW1iZWRkZWRQb3N0U3RhdGUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgewotCQlyZXR1cm4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOwotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7Ci0JfQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlCi0JICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0JICoKLQkgKiBFeGFtcGxlOiAKLQkgKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0JICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsKLQkgKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7Ci0JICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotCSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgCi0JICoKLQkgKiBSZXR1cm5zOgotCSAqCUJMT0NLX1RFWFQ6IDAtNDAKLQkgKglYTUxfRU5EX1RBR19PUEVOOiA0MS00MgotCSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLQkgKglYTUxfVEFHX0NMT1NFOiA0OS00OQotCSAqCVhNTF9DT05URU5UOiA1MC01NwotCSAqCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsKLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7Ci0JfQotCi0vKioKLSAqIE1ldGhvZCBkb1NjYW4uCi0gKiAKLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZwotICogCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+JwotICogQHBhcmFtIGFsbG93SlNQIC0gY2hlY2sgZm9yIGFuZCBhbGxvdyBmb3IgSlNQIG1hcmt1cCA8JSU+Ci0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgYm9vbGVhbiBhbGxvd0pTUCwgYm9vbGVhbiBhbGxvd0NEQVRBLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBzdGlsbFNlYXJjaGluZyA9IHRydWU7Ci0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkKLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOwotCWludCBuID0gMDsKLQljaGFyIGxhc3RDaGVja0NoYXI7Ci0JaW50IGk7Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0JLy8gQ2hlY2sgZm9yIEpTUCBzdGFydHMgKCI8JSIpIGlmIHRoZSB0YWcgaXMgZ2xvYmFsIGxpa2UgU0NSSVBUIG9yIFNUWUxFCi0JYm9vbGVhbiBjaGVja0pTUHMgPSBhbGxvd0pTUCAmJiAhZkZvcmJpZEpTUDsKLQlib29sZWFuIGNoZWNrZWRGb3JKU1BzT25jZSA9ICFjaGVja0pTUHM7Ci0JYm9vbGVhbiBjaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gZmFsc2U7Ci0JCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7Ci0JCW4gPSAwOwotCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLgotCQluID0geXlfYWR2YW5jZSgpOwotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpCi0JCQluID0geXlfYWR2YW5jZSgpOwotLy8JCWMgPSAoY2hhcikgbjsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YgJiYgY2hlY2tlZEZvckpTUHNPbmNlKSB7Ci0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJLyoqCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBKU1BzICI8JSIKLQkJCSAqLwotCQkJY2hlY2tlZEZvckpTUHNPbmNlID0gdHJ1ZTsKLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBKU1BzCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQlpZihjaGVja0pTUHMgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggKyAxXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0ganNwc3RhcnRlci5sZW5ndGggOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBKU1AgMiBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZAotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QKLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MuLih5eV9jdXJyZW50UG9zK2pzcFN0YXJ0bGVuZ3RoLTEpIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmICFjaGVja2VkSlNQc0F0U3RhcnRPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0KLQotCQkJLyoqCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBDREFUQSAiPCFbQ0RBVEFbIgotCQkJICovCi0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBDREFUQQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIENEQVRBIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8WyFDREFUQVtdXT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLS8qCQkJaWYoY2hlY2tDREFUQSAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgKyBzZWFyY2hTdHJpbmdMZW5ndGggPCB5eV9idWZmZXIubGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgCi0JCQkJY2hhcnNNYXRjaChjZGF0YVN0YXJ0ZXIsIHl5X2J1ZmZlciwgMCwgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCkpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCS8vIGdvIHRvIGEgc3RhdGUgd2hlcmUgQ0RBVEEgY2FuIGJlIGZvdW5kCi0JCQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKHNlYXJjaENvbnRleHQpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoeXljaGFyKTsKLQkJCQl9Ci0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihzZWFyY2hDb250ZXh0LCB5eWNoYXIsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJU3RyaW5nIGNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYoY29udGV4dC5lcXVhbHMoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4pKSB7Ci0JCQkJCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4sIFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9DTE9TRSk7Ci0JCQkJfQotCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotKi8vKgotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGNkYXRhU3RhcnRlci5sZW5ndGg6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIENEQVRBIHJpZ2h0IGhlcmUgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmCi0JCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMykgeXlfY3VycmVudFBvcyA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgIWNoZWNrZWRGb3JDREFUQU9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYKLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsKLQkJCQljaGVja2VkRm9yQ0RBVEFPbmNlID0gdHJ1ZTsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQlpZiAobiA9PSBZWUVPRikgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gdHJ1ZTsKLQkJCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzCi0JCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOwotCQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQkJZWxzZSB7Ci0JCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKiBkb2VzIGEgbG9va2FoZWFkIGZvciB0aGUgY3VycmVudCB0YWcgbmFtZQotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCksIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqIENvbnZlcnRzIHRoZSByYXcgY29udGV4dCBTdHJpbmcgcmV0dXJuZWQgYnkgdGhlIHByaW1HZXROZXh0VG9rZW4oKQotCSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlCi0JICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotCSAqCi0JICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQotCSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0JICoKLQkgKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZAotCSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7Ci0JCQlpZiAoZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uIGNvbnRhaW5lciA9IGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyOwotCQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCX0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJaWYgKGNvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCXJldHVybiBmRW1iZWRkZWRDb250YWluZXI7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQkJZWxzZQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQkJfQotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCWlmICh5eV9hdEVPRikgewotCQkJCWZUb2tlbkNvdW50Kys7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJLy8gc3RvcmUgdGhlIG5leHQgdG9rZW4KLQkJZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlpZiAoZl9jb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCX0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJLy8gRU9GCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmVG9rZW5Db3VudCsrOwotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsKLQkJCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JCXJlc2V0KGluLCAwKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgKgotCSAqCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzCi0JICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlCi0JICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcwotCSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCi0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJeXlfc3RhdGUgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0JCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQkKLQkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0JCi0JCS8qKiAKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQgCi0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQkKLQkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0JCi0JCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCQotCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0JCi0JCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCQotCQotCQkvKiB1c2VyIHZhcnM6ICovCi0JCWZUb2tlbkNvdW50ID0gMDsKLQkgCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQkJZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkKLQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsKLQkKLQkJY29udGV4dCA9IG51bGw7Ci0JCXN0YXJ0ID0gMDsKLQkJdGV4dExlbmd0aCA9IDA7Ci0JCWxlbmd0aCA9IDA7Ci0JCi0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQotCQlmRUxsZXZlbCA9IDA7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCUpTUFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZk5lc3RhYmxlUHJlZml4ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKSBmTmVzdGFibGVQcmVmaXhlcy5nZXQoaSk7Ci0JCQlpZihtYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuSlNQQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0lPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgSlNQX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfSlNQX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tJT4iLCBmYWxzZSwgZmFsc2UsIHRydWUsIEpTUF9DT01NRU5UX1RFWFQsIFNUX0pTUF9DT01NRU5UX0VORCwgU1RfSlNQX0NPTU1FTlRfRU5EKTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFsyOTU4MF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgNzM0NikgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7Ci0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsKLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsKLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobWF0Y2hlc1NvRmFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKgotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQKLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCAKLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgewotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOwotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIC8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICB5eV9wdXNoYmFja1BvcyA9IC0xOwotICAgIGJvb2xlYW4geXlfd2FzX3B1c2hiYWNrOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLSAgICAgIHl5X3dhc19wdXNoYmFjayA9IGZhbHNlOwotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDIpID4gMCApCi0gICAgICAgICAgICB5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7Ci0KLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfd2FzX3B1c2hiYWNrID0gKHl5X2F0dHJpYnV0ZXMgJiA0KSA+IDA7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X3dhc19wdXNoYmFjaykKLSAgICAgICAgeXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3M7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgNTk5OiAKLSAgICAgICAgY2FzZSA2MDQ6IAotICAgICAgICBjYXNlIDYxMTogCi0gICAgICAgIGNhc2UgNjE2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3AgZGlyZWN0aXZlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjMyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NjM6IAotICAgICAgICBjYXNlIDU2NTogCi0gICAgICAgIGNhc2UgNTY2OiAKLSAgICAgICAgY2FzZSA1Njc6IAotICAgICAgICBjYXNlIDU2ODogCi0gICAgICAgIGNhc2UgNTY5OiAKLSAgICAgICAgY2FzZSA1NzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDU1NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwOnJvb3QgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX1JPT1RfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDYzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjM1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDU0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDYzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDYzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDYzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQwOiBicmVhazsKLSAgICAgICAgY2FzZSA1MDE6IAotICAgICAgICBjYXNlIDU0MDogCi0gICAgICAgIGNhc2UgNTQxOiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NDE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5MTogCi0gICAgICAgIGNhc2UgNTM2OiAKLSAgICAgICAgY2FzZSA1Mzc6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQyOiBicmVhazsKLSAgICAgICAgY2FzZSA0ODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBKU1BfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQzOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJFTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQ1OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2NDY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9DT01NRU5UOwotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2NDc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2MDogCi0gICAgICAgIGNhc2UgNDc4OiAKLSAgICAgICAgY2FzZSA0ODE6IAotICAgICAgICBjYXNlIDQ4NDogCi0gICAgICAgIGNhc2UgNDg1OiAKLSAgICAgICAgY2FzZSA0ODc6IAotICAgICAgICBjYXNlIDQ4OTogCi0gICAgICAgIGNhc2UgNDkyOiAKLSAgICAgICAgY2FzZSA0OTQ6IAotICAgICAgICBjYXNlIDQ5NTogCi0gICAgICAgIGNhc2UgNDk3OiAKLSAgICAgICAgY2FzZSA0OTk6IAotICAgICAgICBjYXNlIDUwMjogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgY29tbWVudCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSAgewotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCS8vIHRoZSBjb21tZW50IGNvbnRhaW5lciBpdHNlbGYgd2lsbCBhY3QgYXMgY29tbWVudCB0ZXh0Ci0JCWZFbWJlZGRlZEhpbnQgPSBKU1BfQ09NTUVOVF9URVhUOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8qCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhCi0JCSAqIGNvbW1lbnQgc28gaXQgd2lsbCBiZSBvdGhlcndpc2UgaWdub3JlZCBidXQgcHJlc2VydmVkICh3aGljaCBpcyB3aHkKLQkJICogd2UgY2FuJ3QgdXNlIHdoaXRlLXNwYWNlKQotCQkgKi8KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NTA6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc5OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjUyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc3OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7Ci0JZkVMbGV2ZWwrKzsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIEpTUF9FTF9DTE9TRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjU0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuRW50aXR5UmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjg6IAotICAgICAgICBjYXNlIDQwNjogCi0gICAgICAgIGNhc2UgNDEzOiAKLSAgICAgICAgY2FzZSA0MTk6IAotICAgICAgICBjYXNlIDQyMzogCi0gICAgICAgIGNhc2UgNDI3OiAKLSAgICAgICAgY2FzZSA0MzE6IAotICAgICAgICBjYXNlIDQzNjogCi0gICAgICAgIGNhc2UgNDQxOiAKLSAgICAgICAgY2FzZSA0NDQ6IAotICAgICAgICBjYXNlIDQ0ODogCi0gICAgICAgIGNhc2UgNDUyOiAKLSAgICAgICAgY2FzZSA0NTc6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGV4cHJlc3Npb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYW4gZXhwcmVzc2lvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX0VYUFJFU1NJT05fT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FWFBSRVNTSU9OX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY3OiAKLSAgICAgICAgY2FzZSA0MDU6IAotICAgICAgICBjYXNlIDQxMjogCi0gICAgICAgIGNhc2UgNDE4OiAKLSAgICAgICAgY2FzZSA0MjI6IAotICAgICAgICBjYXNlIDQyNjogCi0gICAgICAgIGNhc2UgNDMwOiAKLSAgICAgICAgY2FzZSA0MzU6IAotICAgICAgICBjYXNlIDQ0MDogCi0gICAgICAgIGNhc2UgNDQzOiAKLSAgICAgICAgY2FzZSA0NDc6IAotICAgICAgICBjYXNlIDQ1MTogCi0gICAgICAgIGNhc2UgNDU2OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBkZWNsYXJhdGlvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX0RFQ0xBUkFUSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RFQ0xBUkFUSU9OX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY2OiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRpcmVjdGl2ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOwotCQlyZXR1cm4gSlNQX0RJUkVDVElWRV9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRElSRUNUSVZFX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRElSRUNUSVZFX0NMT1NFLCBKU1BfQ0xPU0V9KTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjU4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTY6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjU5OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjYwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTA6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwrKzsKLQlpZihmRUxsZXZlbCA9PSAxKSB7Ci0JCXJldHVybiBKU1BfVkJMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDM0MDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjYyOiBicmVhazsKLSAgICAgICAgY2FzZSAzMzY6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM0OiAKLSAgICAgICAgICB7IAotCS8vU3lzdGVtLm91dC5wcmludGxuKEpTUF9FTF9DT05URU5UKyAiOlsiICsgeXl0ZXh0KCkgKyAiXSIpOwotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY0OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzM6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwrKzsKLQlpZihmRUxsZXZlbCA9PSAxKSB7Ci0JCXJldHVybiBKU1BfRUxfT1BFTjsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMwOiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfVkJMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX0VMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNzogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjY6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjU6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gZW5kIHRhZyIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfRU5EX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzA6IGJyZWFrOwotICAgICAgICBjYXNlIDI4NDogCi0gICAgICAgIGNhc2UgMjk2OiAKLSAgICAgICAgY2FzZSAzMDI6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgNjcxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzI6IAotICAgICAgICAgIHsgCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7Ci0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0Ci0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7Ci0JLyoKLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhdHRyaWJ1dGUgbmFtZSwgZXF1YWxzLCBvciB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjcyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICAgIHsgCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7Ci0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0Ci0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7Ci0JLyoKLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhdHRyaWJ1dGUgbmFtZSwgZXF1YWxzLCBvciB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBkb3VibGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzU6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAyNzk6IAotICAgICAgICBjYXNlIDM4NzogCi0gICAgICAgIGNhc2UgMzkwOiAKLSAgICAgICAgY2FzZSA0Njg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNjc4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2Nzk6IGJyZWFrOwotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgIGNhc2UgMzg2OiAKLSAgICAgICAgY2FzZSA0Njc6IAotICAgICAgICBjYXNlIDUwNjogCi0gICAgICAgIGNhc2UgNTA3OiAKLSAgICAgICAgY2FzZSA1MjU6IAotICAgICAgICBjYXNlIDUyNjogCi0gICAgICAgIGNhc2UgNTQzOiAKLSAgICAgICAgY2FzZSA1NDQ6IAotICAgICAgICBjYXNlIDU1NjogCi0gICAgICAgIGNhc2UgNTY0OiAKLSAgICAgICAgY2FzZSA1NzE6IAotICAgICAgICBjYXNlIDU3MjogCi0gICAgICAgIGNhc2UgNTczOiAKLSAgICAgICAgY2FzZSA1NzQ6IAotICAgICAgICBjYXNlIDU3NjogCi0gICAgICAgIGNhc2UgNTgyOiAKLSAgICAgICAgY2FzZSA1ODM6IAotICAgICAgICBjYXNlIDU4NDogCi0gICAgICAgIGNhc2UgNTg1OiAKLSAgICAgICAgY2FzZSA1ODY6IAotICAgICAgICBjYXNlIDU5MjogCi0gICAgICAgIGNhc2UgNTkzOiAKLSAgICAgICAgY2FzZSA1OTQ6IAotICAgICAgICBjYXNlIDU5NTogCi0gICAgICAgIGNhc2UgNTk2OiAKLSAgICAgICAgY2FzZSA2MDI6IAotICAgICAgICBjYXNlIDYwMzogCi0gICAgICAgIGNhc2UgNjA1OiAKLSAgICAgICAgY2FzZSA2MDY6IAotICAgICAgICBjYXNlIDYxMjogCi0gICAgICAgIGNhc2UgNjEzOiAKLSAgICAgICAgY2FzZSA2MTQ6IAotICAgICAgICBjYXNlIDYxNTogCi0gICAgICAgIGNhc2UgNjIxOiAKLSAgICAgICAgY2FzZSA2MjI6IAotICAgICAgICBjYXNlIDYyMzogCi0gICAgICAgIGNhc2UgNjI0OiAKLSAgICAgICAgY2FzZSA2Mjc6IAotICAgICAgICBjYXNlIDYyODogCi0gICAgICAgIGNhc2UgNjMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLQkJZkVtYmVkZGVkSGludCA9IGdldEJsb2NrTWFya2VyQ29udGV4dCgpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2ODE6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAyNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjgyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBkaXJlY3RpdmUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2ODU6IGJyZWFrOwotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgY29kZSBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBkb1NjYW4oIiU+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCk7Ci0gfQotICAgICAgICBjYXNlIDY4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgMjU0OiAKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICBjYXNlIDI1ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg3OiBicmVhazsKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2ODg6IGJyZWFrOwotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2ODk6IGJyZWFrOwotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSAyNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjkxOiBicmVhazsKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyMTg6IAotICAgICAgICBjYXNlIDIxOTogCi0gICAgICAgIGNhc2UgMzYxOiAKLSAgICAgICAgY2FzZSAzNjQ6IAotICAgICAgICBjYXNlIDQzOTogCi0gICAgICAgIGNhc2UgNDUwOiAKLSAgICAgICAgY2FzZSA0NTU6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkzOiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgMTc5OiAKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgY2FzZSAzMzE6IAotICAgICAgICBjYXNlIDM0NTogCi0gICAgICAgIGNhc2UgMzQ4OiAKLSAgICAgICAgY2FzZSA0MTY6IAotICAgICAgICBjYXNlIDQxNzogCi0gICAgICAgIGNhc2UgNDI5OiAKLSAgICAgICAgY2FzZSA0MzQ6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2OTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAxNTk6IAotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMzIyOiAKLSAgICAgICAgY2FzZSA0MTE6IAotICAgICAgICBjYXNlIDQxNDogCi0gICAgICAgIGNhc2UgNDgyOiAKLSAgICAgICAgY2FzZSA1MTQ6IAotICAgICAgICBjYXNlIDUzMzogCi0gICAgICAgIGNhc2UgNTQ5OiAKLSAgICAgICAgY2FzZSA1NTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgY2FzZSAxNTM6IAotICAgICAgICBjYXNlIDMxMjogCi0gICAgICAgIGNhc2UgNDA0OiAKLSAgICAgICAgY2FzZSA0MDc6IAotICAgICAgICBjYXNlIDQ3OTogCi0gICAgICAgIGNhc2UgNTEzOiAKLSAgICAgICAgY2FzZSA1MzI6IAotICAgICAgICBjYXNlIDU0ODogCi0gICAgICAgIGNhc2UgNTU3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2OTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JaWYoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEfHxmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsKLQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCX0KLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk4OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA2OTk6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgY2FzZSAyMjk6IAotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgIGNhc2UgMjMzOiAKLSAgICAgICAgY2FzZSAzNzE6IAotICAgICAgICBjYXNlIDM3MjogCi0gICAgICAgIGNhc2UgMzczOiAKLSAgICAgICAgY2FzZSA0NjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MDA6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzAxOiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODg6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICBjYXNlIDEzNDogCi0gICAgICAgIGNhc2UgMTM2OiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICBjYXNlIDEzOTogCi0gICAgICAgIGNhc2UgMTQwOiAKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgY2FzZSAxNTE6IAotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgIGNhc2UgMTU3OiAKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgIGNhc2UgMTc3OiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAxODg6IAotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwNjogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgY2FzZSAyMjA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgNzAyOiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihyZXR1cm5lZENvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSA3MDM6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMTE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA3MDU6IGJyZWFrOwotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgY2FzZSAzODM6IAotICAgICAgICBjYXNlIDQ2NjogCi0gICAgICAgIGNhc2UgNTA1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDY6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOwotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgICAgeyAKLQkJLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOwotIH0KLSAgICAgICAgY2FzZSA3MDg6IGJyZWFrOwotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBzaW5nbGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzEwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxNDI6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMjkzOiAKLSAgICAgICAgY2FzZSAzOTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgNzEzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMjk5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDcxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgY2FzZSAzMDU6IAotICAgICAgICBjYXNlIDMwOTogCi0gICAgICAgIGNhc2UgNDAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICBjYXNlIDMxNTogCi0gICAgICAgIGNhc2UgMzE5OiAKLSAgICAgICAgY2FzZSA0MDk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgNzE5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluc2lkZSBvZiBKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzIxOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzIyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzIzOiBicmVhazsKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVMpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzI3OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3Mjg6IGJyZWFrOwotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3Mjk6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzA6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzE6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDczMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzM1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDczNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIzOiAKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICBjYXNlIDMxMTogCi0gICAgICAgIGNhc2UgMzIxOiAKLSAgICAgICAgY2FzZSAzMzI6IAotICAgICAgICBjYXNlIDMzNzogCi0gICAgICAgIGNhc2UgMzQxOiAKLSAgICAgICAgY2FzZSAzNDQ6IAotICAgICAgICBjYXNlIDM0NzogCi0gICAgICAgIGNhc2UgMzQ5OiAKLSAgICAgICAgY2FzZSAzNTM6IAotICAgICAgICBjYXNlIDM1NzogCi0gICAgICAgIGNhc2UgMzYwOiAKLSAgICAgICAgY2FzZSAzNjM6IAotICAgICAgICAgIHsgCi0JLyogSlNQIHNjcmlwdGxldCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygxKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX1NDUklQVExFVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfU0NSSVBUTEVUX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDczODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI0OiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzM5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQwOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDE6IAotICAgICAgICAgIHsgCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUKLQkJZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDE6IGJyZWFrOwotICAgICAgICBjYXNlIDI0MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBKU1BfRElSRUNUSVZFX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MjogCi0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDc0NTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1NzRlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qbmxzWFhYKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbkNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsNCi0NCi0lJQ0KLQ0KLSV7DQotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsNCi0gDQotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcNCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkDQotCXByaXZhdGUgU3RyaW5nIGZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzDQotCS8vICAgYmVlbiBjb21wbGV0ZWQNCi0JcHJpdmF0ZSBpbnQgZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DT05URVhUID0gIlBST1hZX0NPTlRFWFQiOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOw0KLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsNCi0NCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzDQotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOw0KLQkNCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZA0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbg0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMNCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOw0KLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOw0KLQkNCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZA0KLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOw0KLQ0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnDQotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOw0KLQkNCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOw0KLQ0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsNCi0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkNCi0JCQlyZXR1cm47DQotCQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgew0KLQkJZk5lc3RhYmxlUHJlZml4ZXMuYWRkKG1hcmtlcik7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsNCi0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RhYmxlKFN0cmluZyB0YWdOYW1lKSB7DQotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7DQotCQkvL3doaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCS8vCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKWJsb2Nrcy5uZXh0KCk7DQotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7DQotCQkvLwlpZih0YWdOYW1lLmxlbmd0aCgpID4gbWFya2VyTmFtZS5sZW5ndGgoKSArIDEgJiYgdGFnTmFtZS5zdGFydHNXaXRoKG1hcmtlck5hbWUpICYmIHRhZ05hbWUuY2hhckF0KG1hcmtlck5hbWUubGVuZ3RoKCkpID09ICc6Jykgew0KLQkJLy8JCXJldHVybiBtYXJrZXIuaXNHbG9iYWwoKSB8fCBnZXRPZmZzZXQoKSA+PSBtYXJrZXIuZ2V0TWFya2VyKCkuZ2V0U3RhcnQoKTsNCi0JCS8vCX0NCi0JCS8vfQ0KLQkJLy9yZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgbmFtZSkgew0KLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsNCi0JCQlJdGVyYXRvciBuZXN0YWJsZXMgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChuZXN0YWJsZXMuaGFzTmV4dCgpKSB7DQotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJCQluZXN0YWJsZXMucmVtb3ZlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgew0KLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgew0KLQkJCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0JCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkNCi0JCQkJCWJsb2Nrcy5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgew0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG51bGwsIGVuZFRhZ05hbWUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgZW5kVHlwZXMsIG51bGwpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUeXBlKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsNCi0JfQ0KLQkvKioNCi0JICogIHVzZXIgbWV0aG9kIA0KLQkgKiANCi0JICogQXNzZW1ibGVzIGFuIGVtYmVkZGVkIGNvbnRhaW5lciBiZWdpbm5pbmcgd2l0aCB0aGUgZ2l2ZW4gc3RhcnRUeXBlIGFzDQotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQ0KLQkgKiBlbmRUeXBlc1tdIGFycmF5IGNvbnRhaW5zIHRoZSBjb250ZXh0IHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhIHN1Y2Nlc3NmdWwNCi0JICogZXhpdC4gIFVzZSBvZiB0aGUgZW5kVGFnTmFtZSBwYXJhbWV0ZXIgYWx0ZXJzIHRoaXMgYmVoYXZpb3IgdG8gZm9yY2UgYW4NCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQNCi0JICogdGV4dCBtYXRjaGVzIHRoZSBlbmRUYWdOYW1lIFN0cmluZy4gIEFsbCBjb250ZW50cyBpbiBiZXR3ZWVuIGFyZQ0KLQkgKiBpbnNpZ25pZmljYW50LCBhbmQgeWVzLCB0aGlzIG1lYW5zIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluc2lkZS4NCi0JICoqLw0KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcywgU3RyaW5nIGVuZFRhZ05hbWUpIHsNCi0JCS8vIHRoZSBjb250ZXh0IG9mIHRoZSByZWdpb24gYmVpbmcgYWRkZWQgdG8gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcg0KLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOw0KLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGlzIGNvbnRhaW5lciBiZWdhbjsgdG8gcHJvdmlkZSByZWxhdGl2ZSBpbmRlY2VzIGZvciB0aGUgcmVnaW9ucw0KLQkJaW50IGNvbnRhaW5lclN0YXJ0ID0geXljaGFyOw0KLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7DQotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIHNlZW0gdG8gYmUgc28gdGhhdCB0aGUgZW5kVGFnTmFtZSBjYW4gYmUgY2hlY2tlZA0KLQkJYm9vbGVhbiBpc0luRW5kVGFnID0gZmFsc2U7DQotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7DQotCQkvLyBjcmVhdGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciBhbmQgc2V0dXAgaXRzICJ0eXBlIg0KLQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShmRW1iZWRkZWRIaW50KTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoY29udGFpbmVyU3RhcnQpOw0KLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIA0KLQkJCS8vCQlmRW1iZWRkZWRDb250YWluZXIuc2V0UGFyZW50KHBhcmVudFJlZ2lvbik7DQotCQl9DQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOw0KLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7DQotCQkJLy8gYWRkIHRoZSByZWdpb24gdG8gdGhlIGNvbnRhaW5lcg0KLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsNCi0JCQl9DQotCQkJdHJ5IHsNCi0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOw0KLQkJCQkvLyBzYXZlIHRoZSB0b2tlbml6ZXIgc3RhdGUgaW4gY2FzZSBvZiBhIGJsb2NrIHRhZyBzY2FuDQotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsNCi0JCQkJaW50IHByZXZpb3VzUG9zdFN0YXRlID0gZkVtYmVkZGVkUG9zdFN0YXRlOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50Ow0KLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkNCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsNCi0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgew0KLQkJCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlDQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJCQkJbm90RmluaXNoZWQgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19PUEVOIHx8IGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQkJCQl9DQotCQkJCS8vIGRvIHVwa2VlcCBmb3IgZW5kVGFnTmFtZSB1c2FnZTsgbXVzdCBiZSBoZXJlIHNpbmNlIHRoZSBuZXh0IHRva2VuIGNvdWxkIGJlIHRoZSBjbG9zZQ0KLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOw0KLQkJCQl9IGVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB7DQotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7DQotCQkJCX0gZWxzZSB7DQotCQkJCSAJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7DQotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7DQotCQkJCQkJCWxvbmdzY2FuID0gdHJ1ZTsNCi0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmIChsb25nc2NhbikNCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IGludGVybmFsVGFnTmFtZTsNCi0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQNCi0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQlpZiAobG9uZ3NjYW4pIHsNCi0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzDQotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZw0KLQkJCQkJLy8gaW5zaWRlIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJCS8vIG5ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsNCi0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOw0KLQkJCQkJZkVtYmVkZGVkSGludCA9IHByZXZpb3VzRW1iZWRkZWRIaW50Ow0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsNCi0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7DQotCQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCS8vIHByaW1HZXROZXh0VG9rZW4oKSBjYWxscyBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24NCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93DQotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydA0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmKSB7DQotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQNCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsNCi0JCQl9DQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJaWYoIWlzRW5kaW5nVHlwZSkgew0KLQkJCQkvLyBjaGVjayBmb3IgZW5kaW5nIGNvbnRleHQNCi0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgew0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUeXBlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJCWlzRW5kaW5nVHlwZSA9IGlzRW5kaW5nVHlwZSB8fCAoaW50ZXJuYWxDb250ZXh0ID09IGVuZFR5cGVzW2ldKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7DQotCQkJCX0NCi0JCQl9DQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJbm90RmluaXNoZWQgPSBub3RGaW5pc2hlZCAmJiAoKCFpc0VuZGluZ1R5cGUpICYmICFpc0VPRigpICYmIChlbmRUYWdOYW1lICE9IG51bGwgfHwgaW50ZXJuYWxDb250ZXh0ICE9IFVOREVGSU5FRCkgJiYgIShpbnRlcm5hbENvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCAmJiAoZW1iZWRkZWRMaXN0LmdldChlbWJlZGRlZExpc3Quc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSk7DQotCQl9DQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQNCi0JCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOw0KLQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzDQotCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsNCi0JCX0NCi0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsNCi0JCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsNCi0JCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCkgew0KLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsNCi0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgew0KLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7DQotCQl9DQotCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7DQotCQlyZXR1cm4gZkJsb2NrTWFya2VyczsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOw0KLQl9DQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgew0KLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgew0KLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7DQotCQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUNCi0JICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuDQotCSAqDQotCSAqIEV4YW1wbGU6IA0KLQkgKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7DQotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7DQotCSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsNCi0JICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOw0KLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IA0KLQkgKg0KLQkgKiBSZXR1cm5zOg0KLQkgKglCTE9DS19URVhUOiAwLTQwDQotCSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyDQotCSAqCVhNTF9UQUdfTkFNRTogNDMtNDgNCi0JICoJWE1MX1RBR19DTE9TRTogNDktNDkNCi0JICoJWE1MX0NPTlRFTlQ6IDUwLTU3DQotCSAqDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgew0KLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOw0KLQl9DQotDQotLyoqDQotICogTWV0aG9kIGRvU2Nhbi4NCi0gKiANCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcg0KLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nDQotICogDQotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIg0KLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nDQotICogQHBhcmFtIGFsbG93SlNQIC0gY2hlY2sgZm9yIGFuZCBhbGxvdyBmb3IgSlNQIG1hcmt1cCA8JSU+DQotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQ0KLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MNCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsNCi0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkNCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7DQotCWludCBuID0gMDsNCi0JY2hhciBsYXN0Q2hlY2tDaGFyOw0KLQlpbnQgaTsNCi0JYm9vbGVhbiBzYW1lID0gZmFsc2U7DQotCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQ0KLQlib29sZWFuIGNoZWNrSlNQcyA9IGFsbG93SlNQICYmICFmRm9yYmlkSlNQOw0KLQlib29sZWFuIGNoZWNrZWRGb3JKU1BzT25jZSA9ICFjaGVja0pTUHM7DQotCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOw0KLQkNCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7DQotCQluID0gMDsNCi0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuDQotCQluID0geXlfYWR2YW5jZSgpOw0KLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotLy8JCWMgPSAoY2hhcikgbjsNCi0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuDQotCQlpZiAobiA9PSBZWUVPRiAmJiBjaGVja2VkRm9ySlNQc09uY2UpIHsNCi0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJLyoqDQotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiDQotCQkJICovDQotCQkJY2hlY2tlZEZvckpTUHNPbmNlID0gdHJ1ZTsNCi0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcw0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4NCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4NCi0JCQlpZihjaGVja0pTUHMgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIA0KLQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQNCi0JCQkvLyAtLS0NCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbg0KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0DQotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuDQotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJg0KLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgew0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0JCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUNCi0JCQkvLyAtLS0NCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbg0KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuDQotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgIWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYNCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7DQotCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOw0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsNCi0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotDQotDQotCQkJLyoqDQotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyINCi0JCQkgKi8NCi0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBDREFUQQ0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgQ0RBVEEgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0Lg0KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8WyFDREFUQVtdXT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQNCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotLyoJCQlpZihjaGVja0NEQVRBICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyArIHNlYXJjaFN0cmluZ0xlbmd0aCA8IHl5X2J1ZmZlci5sZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiANCi0JCQkJY2hhcnNNYXRjaChjZGF0YVN0YXJ0ZXIsIHl5X2J1ZmZlciwgMCwgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCkpIHsNCi0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZA0KLQkJCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydCh5eWNoYXIpOw0KLQkJCQl9DQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCQkJU3RyaW5nIGNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgew0KLQkJCQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTiwgWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX0NMT1NFKTsNCi0JCQkJfQ0KLQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJfQ0KLSovLyoNCi0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0gY2RhdGFTdGFydGVyLmxlbmd0aDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgQ0RBVEEgcmlnaHQgaGVyZSBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZA0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QNCi0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4NCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJg0KLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgew0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0JCQkvLyAzKSB5eV9jdXJyZW50UG9zIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQ0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4NCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgIWNoZWNrZWRGb3JDREFUQU9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYNCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7DQotCQkJCWNoZWNrZWRGb3JDREFUQU9uY2UgPSB0cnVlOw0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsNCi0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotKi8NCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcg0KLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcw0KLQkJCWlmIChuID09IFlZRU9GKSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlzYW1lID0gdHJ1ZTsNCi0JCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3Nlcw0KLQkJCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0JCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7DQotCQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7DQotCQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdw0KLQkJCQllbHNlIHsNCi0JCQkJCXNhbWUgPSBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gNCi0JCQkJLy8gIjwvc2NyaXB0UyINCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsNCi0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICINCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkNCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgew0KLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaA0KLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsNCi0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJfQ0KLQl9DQotCWVsc2Ugew0KLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0DQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOw0KLQkJeXlfY3VycmVudFBvcysrOw0KLQl9DQotCXl5YmVnaW4oZXhpdFN0YXRlKTsNCi0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQ0KLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsNCi0JcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOw0KLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCksIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7DQotfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotCSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlDQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4NCi0JICoNCi0JICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQ0KLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLg0KLQkgKg0KLQkgKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZA0KLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4NCi0JICovDQotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7DQotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsNCi0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7DQotCQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJCQlyZXR1cm4gY29udGFpbmVyOw0KLQkJCX0NCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0Ow0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsNCi0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7DQotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQkJZWxzZQ0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7DQotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQkJfQ0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCWlmICh5eV9hdEVPRikgew0KLQkJCQlmVG9rZW5Db3VudCsrOw0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQl9DQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQkJZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7DQotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsNCi0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQllbHNlDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQkJfQ0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JCX0NCi0JCWlmIChjb250ZXh0ID09IG51bGwpIHsNCi0JCQkvLyBFT0YNCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCWZUb2tlbkNvdW50Kys7DQotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7DQotCQlzdXBlcigpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7DQotCQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsNCi0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7DQotCQlyZXNldChpbiwgMCk7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kICoNCi0JICoNCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzDQotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuDQotCSAqDQotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlDQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMNCi0JICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZk9mZnNldCA9IG5ld09mZnNldDsNCi0JDQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCQl5eV9yZWFkZXIgPSBpbjsNCi0JDQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCQl5eV9zdGF0ZSA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0JDQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCQl5eV9jdXJyZW50UG9zID0gMDsNCi0JDQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X3N0YXJ0UmVhZCA9IDA7DQotCQ0KLQkJLyoqIA0KLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkgKiBmcm9tIGlucHV0IA0KLQkJICovDQotCQl5eV9lbmRSZWFkID0gMDsNCi0JDQotCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5bGluZSA9IDA7DQotCQ0KLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWNoYXIgPSAwOw0KLQkNCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXl5X2F0RU9GID0gZmFsc2U7DQotCQ0KLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQkNCi0JDQotCQkvKiB1c2VyIHZhcnM6ICovDQotCQlmVG9rZW5Db3VudCA9IDA7DQotCSANCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQkJZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQkJZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCQ0KLQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsNCi0JDQotCQljb250ZXh0ID0gbnVsbDsNCi0JCXN0YXJ0ID0gMDsNCi0JCXRleHRMZW5ndGggPSAwOw0KLQkJbGVuZ3RoID0gMDsNCi0JDQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQkJDQotCQlmRUxsZXZlbCA9IDA7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7DQotCQlKU1BUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQVG9rZW5pemVyKCk7DQotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIA0KLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpDQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgew0KLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsNCi0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQ0KLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7DQotCQl9DQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZk5lc3RhYmxlUHJlZml4ZXMuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcikgZk5lc3RhYmxlUHJlZml4ZXMuZ2V0KGkpOw0KLQkJCWlmKG1hcmtlci5pc0dsb2JhbCgpKQ0KLQkJCQluZXdJbnN0YW5jZS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoDQotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0DQotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhbkpTUENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCS8vIFNjYW4gZm9yICctLSU+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JCS8vICAgSlNQX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoDQotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX0pTUF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0DQotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JCXJldHVybiBkb1NjYW4oIi0tJT4iLCBmYWxzZSwgZmFsc2UsIHRydWUsIEpTUF9DT01NRU5UX1RFWFQsIFNUX0pTUF9DT01NRU5UX0VORCwgU1RfSlNQX0NPTU1FTlRfRU5EKTsNCi0JfQ0KLSV9DQotDQotJWVvZnsNCi0vLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYg0KLSVlb2Z9DQotDQotJXB1YmxpYw0KLSVjbGFzcyBKU1BUb2tlbml6ZXINCi0laW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NSlNQUmVnaW9uQ29udGV4dHMNCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJWxpbmUNCi0ldW5pY29kZQ0KLSVwYWNrDQotDQotJXN0YXRlIFNUX0NEQVRBX1RFWFQNCi0lc3RhdGUgU1RfQ0RBVEFfRU5EDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UX0VORA0KLSVzdGF0ZSBTVF9QSQ0KLSVzdGF0ZSBTVF9QSV9XUw0KLSVzdGF0ZSBTVF9QSV9DT05URU5UDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfUElfRVFVQUxTDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfWE1MX1BJX1RBR19DTE9TRQ0KLSVzdGF0ZSBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9ESFRNTF9FUVVBTFMNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX0RIVE1MX1RBR19DTE9TRQ0KLQ0KLS8vIHNjcmlwdGxldCBzdGF0ZShzKQ0KLSVzdGF0ZSBTVF9KU1BfQ09OVEVOVA0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX05BTUUNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUw0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRQ0KLQ0KLS8vIG5vcm1hbCB0YWcgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9UQUdfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFDQotDQotLy8gZGVjbGFyYXRpb24gKERURCkgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UNCi0NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQNCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTQ0KLQ0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQNCi0NCi0NCi0lc3RhdGUgU1RfQkxPQ0tfVEFHX1NDQU4NCi0lc3RhdGUgU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4NCi0NCi0lc3RhdGUgU1RfSlNQX0NPTU1FTlQNCi0lc3RhdGUgU1RfSlNQX0NPTU1FTlRfRU5EDQotDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRA0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQNCi0NCi0lc3RhdGUgU1RfQUJPUlRfRU1CRURERUQNCi0NCi0lc3RhdGUgU1RfSlNQX0VMDQotJXN0YXRlIFNUX0pTUF9FTF9TUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9FTF9EUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9FTF9TUVVPVEVTX0VORA0KLSVzdGF0ZSBTVF9KU1BfRUxfRFFVT1RFU19FTkQNCi0NCi0lc3RhdGUgU1RfSlNQX0RRVU9URURfRUwNCi0lc3RhdGUgU1RfSlNQX1NRVU9URURfRUwNCi0NCi0lc3RhdGUgU1RfSlNQX1ZCTA0KLSVzdGF0ZSBTVF9KU1BfVkJMX1NRVU9URVMNCi0lc3RhdGUgU1RfSlNQX1ZCTF9EUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9WQkxfU1FVT1RFU19FTkQNCi0lc3RhdGUgU1RfSlNQX1ZCTF9EUVVPVEVTX0VORA0KLQ0KLSVzdGF0ZSBTVF9KU1BfRFFVT1RFRF9WQkwNCi0lc3RhdGUgU1RfSlNQX1NRVU9URURfVkJMDQotDQotLy8gTGV0dGVyID0gKFtBLVphLXpdKQ0KLS8vIERpZ2l0ID0gKFswLTldKQ0KLQ0KLS8qKg0KLSAqIHNtYWxsZXIgdG9rZW5zDQotICovDQotZ2VuZXJpY1RhZ09wZW4gICAgICAgPSA8DQotZ2VuZXJpY1RhZ0Nsb3NlICAgICAgPSA+DQotZ2VuZXJpY0VuZFRhZ09wZW4gICAgPSA8XC8NCi1nZW5lcmljRW1wdHlUYWdDbG9zZSA9IFwvPg0KLQ0KLVBJc3RhcnQgPSA8XD8NCi1QSWVuZCAgID0gXD8+DQotDQotDQotLy8gWzFdIGRvY3VtZW50IDo6PSBwcm9sb2cgZWxlbWVudCBNaXNjKg0KLWRvY3VtZW50ID0gKHtwcm9sb2d9IHtlbGVtZW50fSB7TWlzY30qKQ0KLQ0KLS8vIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdDQotIC8vQ2hhciA9ICguKQ0KLUNoYXIgPSBbXHgwOVx4MEFceDBEXHgyMC1cdUQ3RkZcdUUwMDAtXHVGRkZEXSANCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0rDQotDQotLy8gWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcg0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IFwuIHwgXC0gfCBfIHwgOiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0pDQotDQotLy8gWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIE5hbWVDaGFyKg0KLS8vTmFtZSA9ICh7TmFtZUNoYXJ9e05hbWVDaGFyfSopDQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6KXtOYW1lQ2hhcn0qDQotDQotLy8gWzZdIE5hbWVzIDo6PSB7TmFtZX0gKHtTfSB7TmFtZX0pKg0KLU5hbWVzID0gKHtOYW1lfSAoe1N9IHtOYW1lfSkqKQ0KLQ0KLS8vIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKw0KLU5tdG9rZW4gPSAoe05hbWVDaGFyfSspDQotDQotLy8gWzhdIE5tdG9rZW5zIDo6PSBObXRva2VuIChTIE5tdG9rZW4pKg0KLU5tdG9rZW5zID0gKHtObXRva2VufSAoe1N9IHtObXRva2VufSkqKQ0KLQ0KLS8vIFs5XSBFbnRpdHlWYWx1ZSA6Oj0gJyInIChbXiUmIl0gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciDQotRW50aXR5VmFsdWUgPSAoXCIgKFteJSZcIl0gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcIiB8ICBcJyAoW14lJlwnXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwnKQ0KLQ0KLS8vIFx4MjQgPSAnJCcsIFx4N2IgPSAneycsIFx4MjMgPSAnIycNCi0vLyBbMTBdIEF0dFZhbHVlIDo6PSAnIicgKFtePCYiXSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFtePCYnXSB8IFJlZmVyZW5jZSkqICInIg0KLUF0dFZhbHVlID0gKCBcIihbXjwiXHgyNFx4MjNdIHwgW1x4MjRceDIzXVteXHg3YiJdIHwge1JlZmVyZW5jZX0pKltceDI0XHgyM10qXCIgfCBcJyhbXjwnXHgyNFx4MjNdIHwgW1x4MjRceDIzXVteXHg3YiddIHwge1JlZmVyZW5jZX0pKltceDI0XHgyM10qXCcgIHwgKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqKQ0KLQ0KLS8vIFsxMV0gU3lzdGVtTGl0ZXJhbCA6Oj0gKCciJyBbXiJdKiAnIicpIHwgKCInIiBbXiddKiAiJyIpIA0KLVN5c3RlbUxpdGVyYWwgPSAoKFwiIFteXCJdKiBcIikgfCAoXCcgW15cJ10qIFwnKSkgDQotDQotLy8gWzEyXSBQdWJpZExpdGVyYWwgOjo9ICciJyBQdWJpZENoYXIqICciJyB8ICInIiAoUHViaWRDaGFyIC0gIiciKSogIiciDQotUHViaWRMaXRlcmFsID0gKFwiIHtQdWJpZENoYXJ9KiBcIiB8IFwnICh7UHViaWRDaGFyfVwnKSogIiciKQ0KLQ0KLS8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgI3hEIHwgI3hBIHwgW2EtekEtWjAtOV0gfCBbLScoKSssLi86PT87ISojQCRfJV0NCi1QdWJpZENoYXIgPSAoW1wwNDBcMDE1XDAxMl0gfCBbYS16QS1aMC05XSB8IFtcLVwnKClcKywuXC86PT87IVwqI0BcJF8lXSkNCi0NCi0vLyBbMTRdIENoYXJEYXRhIDo6PSBbXjwmXSogLSAoW148Jl0qICddXT4nIFtePCZdKikNCi0vLyBpbXBsZW1lbnQgbG9va2FoZWFkIGJlaGF2aW9yIGR1cmluZyBhY3Rpb24gZGVmaW5pdGlvbg0KLUNoYXJEYXRhID0gKFtePCYoXF1cXT4pXSopDQotDQotLy8gWzE1XSBDb21tZW50IDo6PSAnPCEtLScgKChDaGFyIC0gJy0nKSB8ICgnLScgKENoYXIgLSAnLScpKSkqICctLT4nDQotQ29tbWVudFN0YXJ0ID0gKDwhXC1cLSkNCi1Db21tZW50RW5kICAgPSAoXC1cLT4pDQotQ29tbWVudCA9ICh7Q29tbWVudFN0YXJ0fS4qe0NvbW1lbnRFbmR9KQ0KLQ0KLS8vIFsxNl0gUEkgOjo9ICc8PycgUElUYXJnZXQgKFMgKENoYXIqIC0gKENoYXIqICc/PicgQ2hhciopKSk/ICc/PicNCi1QSSA9ICg8XD97UElUYXJnZXR9IHtDaGFyfSogXD8+KQ0KLQ0KLS8vIFsxN10gUElUYXJnZXQgOjo9IE5hbWUgLSAoKCdYJyB8ICd4JykgKCdNJyB8ICdtJykgKCdMJyB8ICdsJykpDQotUElUYXJnZXQgPSAoe05hbWV9KChYfHgpKE18bSkoTHxsKSkpDQotDQotLy8gWzE4XSBDRFNlY3QgOjo9IENEU3RhcnQgQ0RhdGEgQ0RFbmQNCi1DRFNlY3QgPSAoe0NEU3RhcnR9e0NEYXRhfXtDREVuZH0pDQotDQotLy8gWzE5XSBDRFN0YXJ0IDo6PSAnPCFbQ0RBVEFbJw0KLUNEU3RhcnQgPSA8IVxbQ0RBVEFcWw0KLQ0KLS8vIFsyMF0gQ0RhdGEgOjo9IChDaGFyKiAtIChDaGFyKiAnXV0+JyBDaGFyKikpIA0KLS8vIGltcGxlbWVudCBsb29rYWhlYWQgYmVoYXZpb3IgZHVyaW5nIGFjdGlvbiBkZWZpbml0aW9uDQotQ0RhdGEgPSAoW14oXF1cXT4pXSopDQotDQotLy8gWzIxXSBDREVuZCA6Oj0gJ11dPicNCi1DREVuZCA9IChcXVxdPikNCi0NCi0vLyBbMjJdIHByb2xvZyA6Oj0gWE1MRGVjbD8gTWlzYyogKGRvY3R5cGVkZWNsIE1pc2MqKT8NCi1wcm9sb2cgPSAoe1hNTERlY2x9PyB7TWlzY30qICh7ZG9jdHlwZWRlY2x9IHtNaXNjfSopPykNCi0NCi0vLyBbMjNdIFhNTERlY2wgOjo9ICc8P3htbCcgVmVyc2lvbkluZm8gRW5jb2RpbmdEZWNsPyBTRERlY2w/IFM/ICc/PicNCi1YTUxEZWNsID0gKDxcP3htbCB7VmVyc2lvbkluZm99IHtFbmNvZGluZ0RlY2x9PyB7U0REZWNsfT8ge1N9PyBcPz4pDQotDQotLy8gWzI0XSBWZXJzaW9uSW5mbyA6Oj0gUyAndmVyc2lvbicgRXEgKCcgVmVyc2lvbk51bSAnIHwgIiBWZXJzaW9uTnVtICIpDQotVmVyc2lvbkluZm8gPSAoe1N9dmVyc2lvbntFcX0oXCd7VmVyc2lvbk51bX1cJyB8IFwie1ZlcnNpb25OdW19XCIpKQ0KLQ0KLS8vIFsyNV0gRXEgOjo9IFM/ICc9JyBTPw0KLUVxID0gKFw9KQ0KLQ0KLS8vIFsyNl0gVmVyc2lvbk51bSA6Oj0gKFthLXpBLVowLTlfLjpdIHwgJy0nKSsNCi1WZXJzaW9uTnVtID0gKChbYS16QS1aMC05Xy46XXxcLSkrKQ0KLQ0KLS8vIFsyN10gTWlzYyA6Oj0gQ29tbWVudCB8IFBJIHwgIFMNCi1NaXNjID0gKHtDb21tZW50fSB8IHtQSX0gfCB7U30pDQotDQotLy8gWzI4XSBkb2N0eXBlZGVjbCA6Oj0gJzwhRE9DVFlQRScgUyBOYW1lIChTIEV4dGVybmFsSUQpPyAgUz8gKCdbJyAobWFya3VwZGVjbCB8IFBFUmVmZXJlbmNlIHwgUykqICddJyBTPyk/ICc+Jw0KLWRvY3R5cGVkZWNsID0gKDxcIURPQ1RZUEV7U317TmFtZX0gKHtTfXtFeHRlcm5hbElEfSk/IHtTfT8gKFxbICh7bWFya3VwZGVjbH18e1BFUmVmZXJlbmNlfXx7U30pKiBcXXtTfT8pPz4pDQotDQotLy8gWzI5XSBtYXJrdXBkZWNsIDo6PSBlbGVtZW50ZGVjbCB8IEF0dGxpc3REZWNsIHwgRW50aXR5RGVjbCB8IE5vdGF0aW9uRGVjbCB8IFBJIHwgQ29tbWVudA0KLW1hcmt1cGRlY2wgPSAoe2VsZW1lbnRkZWNsfSB8IHtBdHRsaXN0RGVjbH0gfCB7RW50aXR5RGVjbH0gfCB7Tm90YXRpb25EZWNsfSB8IHtQSX0gfCB7Q29tbWVudH0pDQotDQotLy8gWzMwXSBleHRTdWJzZXQgOjo9IFRleHREZWNsPyBleHRTdWJzZXREZWNsDQotZXh0U3Vic2V0ID0gKHtUZXh0RGVjbH0/IHtleHRTdWJzZXREZWNsfSkNCi0NCi0vLyBbMzFdIGV4dFN1YnNldERlY2wgOjo9ICggbWFya3VwZGVjbCB8IGNvbmRpdGlvbmFsU2VjdCB8IFBFUmVmZXJlbmNlIHwgUyApKg0KLWV4dFN1YnNldERlY2wgPSAoKCB7bWFya3VwZGVjbH0gfCB7Y29uZGl0aW9uYWxTZWN0fSB8IHtQRVJlZmVyZW5jZX0gfCB7U30gKSopDQotDQotLy8gWzMyXSAgU0REZWNsICA6Oj0gUyAnc3RhbmRhbG9uZScgRXEgKCgiJyIgKCd5ZXMnIHwgJ25vJykgIiciKSB8ICgnIicgKCd5ZXMnIHwgJ25vJykgJyInKSkNCi1TRERlY2wgID0gKHtTfXN0YW5kYWxvbmV7RXF9e1N9KigoXCcoeWVzfG5vKVwnKXwoXCIoeWVzfG5vKVwiKSkpDQotDQotLy8gWzMzXSAgTGFuZ3VhZ2VJRCAgOjo9IExhbmdjb2RlICgnLScgU3ViY29kZSkqDQotTGFuZ3VhZ2VJRCAgPSAoe0xhbmdjb2RlfShcLXtTdWJjb2RlfSkqKQ0KLQ0KLS8vIFszNF0gIExhbmdjb2RlIDo6PSBJU082MzlDb2RlIHwgIElhbmFDb2RlIHwgIFVzZXJDb2RlDQotTGFuZ2NvZGUgPSAoe0lTTzYzOUNvZGV9IHwgIHtJYW5hQ29kZX0gfCAge1VzZXJDb2RlfSkNCi0NCi0vLyBbMzVdICBJU082MzlDb2RlIDo6PSAoW2Etel0gfCBbQS1aXSkgKFthLXpdIHwgW0EtWl0pDQotSVNPNjM5Q29kZSA9ICgoW2Etel18W0EtWl0pKFthLXpdfFtBLVpdKSkNCi0NCi0vLyBbMzZdICBJYW5hQ29kZSA6Oj0gKCdpJyB8ICdJJykgJy0nIChbYS16XSB8IFtBLVpdKSsNCi1JYW5hQ29kZSA9ICgoaXxJKVwtKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM3XSAgVXNlckNvZGUgOjo9ICgneCcgfCAnWCcpICctJyAoW2Etel0gfCBbQS1aXSkrDQotVXNlckNvZGUgPSAoKHh8WClcLShbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszOF0gIFN1YmNvZGUgOjo9IChbYS16XSB8IFtBLVpdKSsNCi1TdWJjb2RlID0gKChbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszOV0gIGVsZW1lbnQgIDo6PSBFbXB0eUVsZW1UYWcgfCBTVGFnIGNvbnRlbnQgRVRhZw0KLWVsZW1lbnQgID0gKHtFbXB0eUVsZW1UYWd9IHwge1NUYWd9IHtjb250ZW50fSB7RVRhZ30pDQotDQotLy8gWzQwXSAgU1RhZyAgOjo9ICc8JyBOYW1lIChTIEF0dHJpYnV0ZSkqIFM/ICc+Jw0KLVNUYWcgPSAoPHtOYW1lfSh7U317QXR0cmlidXRlfSkqe1N9Pz4pDQotDQotLy8gWzQxXSAgQXR0cmlidXRlIDo6PSBOYW1lIEVxIEF0dFZhbHVlDQotQXR0cmlidXRlID0gKHtOYW1lfXtTfSp7RXF9e1N9KntBdHRWYWx1ZX0pDQotDQotLy8gWzQyXSAgRVRhZyAgOjo9ICdOYW1lIFM/ICc+Jw0KLUVUYWcgPSAoPFwve05hbWV9e1N9Pz4pDQotDQotLy8gWzQzXSAgY29udGVudCAgOjo9IChlbGVtZW50IHwgQ2hhckRhdGEgfCBSZWZlcmVuY2UgfCBDRFNlY3QgfCBQSSB8IENvbW1lbnQpKg0KLWNvbnRlbnQgPSAoKHtlbGVtZW50fSB8IHtDaGFyRGF0YX0gfCB7UmVmZXJlbmNlfSB8IHtDRFNlY3R9IHwge1BJfSB8IHtDb21tZW50fSkqKQ0KLQ0KLS8vIFs0NF0gIEVtcHR5RWxlbVRhZyAgOjo9ICc8JyBOYW1lIChTIEF0dHJpYnV0ZSkqIFM/ICcvPicNCi1FbXB0eUVsZW1UYWcgPSAoPHtOYW1lfSh7U317QXR0cmlidXRlfSkqe1N9P1wvPikNCi0NCi0vLyBbNDVdIGVsZW1lbnRkZWNsIDo6PSAnPCFFTEVNRU5UJyBTIE5hbWUgUyBjb250ZW50c3BlYyBTPyAnPicNCi1lbGVtZW50ZGVjbCA9ICg8XCFFTEVNRU5Ue1N9e05hbWV9e1N9e2NvbnRlbnRzcGVjfXtTfT8+KQ0KLQ0KLS8vIFs0Nl0gY29udGVudHNwZWMgOjo9ICdFTVBUWScgfCAnQU5ZJyB8IE1peGVkIHwgY2hpbGRyZW4NCi1jb250ZW50c3BlYyA9IChFTVBUWXxBTll8e01peGVkfXx7Y2hpbGRyZW59KQ0KLQ0KLS8vIFs0N10gY2hpbGRyZW4gOjo9IChjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPw0KLWNoaWxkcmVuID0gKCh7Y2hvaWNlfXx7c2VxfSkoXD98XCp8XCspPykNCi0NCi0vLyBDQVVTRVMgTE9PUCBUSFJPVUdIIERFRlMgT0YgQ0hPSUNFIEFORCBTRVENCi0vLyBbNDhdIGNwIDo6PSAoTmFtZSB8IGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/DQotY3AgPSAoKHtOYW1lfSB8IHtjaG9pY2V9IHwge3NlcX0pIChcP3xcKnxcKyk/KQ0KLQ0KLS8vIFs0OV0gY2hvaWNlIDo6PSAnKCcgUz8gY3AgKCBTPyAnfCcgUz8gY3AgKSogUz8gJyknDQotLy8gY2hvaWNlID0gXCh7U30/e2NwfSh7U30/XHx7U30/e2NwfSkqe1N9P1wpDQotY2hvaWNlID0gXCh7U30/e05hbWV9KHtTfT9cfHtTfT97TmFtZX0pKntTfT9cKQ0KLQ0KLS8vIFs1MF0gc2VxIDo6PSAnKCcgUz8gY3AgKCBTPyAnLCcgUz8gY3AgKSogUz8gJyknDQotLy8gc2VxID0gKFwoe1N9P3tjcH0oe1N9P1wse1N9P3tjcH0pKntTfT9cKSkNCi1zZXEgPSAoXCh7U30/e05hbWV9KHtTfT9cLHtTfT97TmFtZX0pKntTfT9cKSkNCi0NCi0vLyBbNTFdIE1peGVkIDo6PSAnKCcgUz8gJyNQQ0RBVEEnIChTPyAnfCcgUz8gTmFtZSkqIFM/ICAnKSonIHwgJygnIFM/ICcjUENEQVRBJyBTPyAnKScNCi1NaXhlZCA9ICh7U30/XCNQQ0RBVEEoe1N9P1x8e1N9P3tOYW1lfSkqe1N9PykqXHwoe1N9P1wjUENEQVRBe1N9PykNCi0NCi0vLyBbNTJdIEF0dGxpc3REZWNsIDo6PSAnPCFBVFRMSVNUJyBTIE5hbWUgQXR0RGVmKiBTPyAnPicNCi1BdHRsaXN0RGVjbCA9ICg8XCFBVFRMSVNUe1N9e05hbWV9e0F0dERlZn0qe1N9Pz4pDQotDQotLy8gWzUzXSBBdHREZWYgOjo9IFMgTmFtZSBTIEF0dFR5cGUgUyBEZWZhdWx0RGVjbA0KLUF0dERlZiA9ICh7U317TmFtZX17U317QXR0VHlwZX17U317RGVmYXVsdERlY2x9KQ0KLQ0KLS8vIFs1NF0gQXR0VHlwZSA6Oj0gU3RyaW5nVHlwZSB8IFRva2VuaXplZFR5cGUgfCBFbnVtZXJhdGVkVHlwZSANCi1BdHRUeXBlID0gKHtTdHJpbmdUeXBlfSB8IHtUb2tlbml6ZWRUeXBlfSB8IHtFbnVtZXJhdGVkVHlwZX0pDQotDQotLy8gWzU1XSBTdHJpbmdUeXBlIDo6PSAnQ0RBVEEnDQotU3RyaW5nVHlwZSA9IChDREFUQSkNCi0NCi0vLyBbNTZdIFRva2VuaXplZFR5cGUgOjo9ICdJRCcgfCAnSURSRUYnIHwgJ0lEUkVGUycgfCAnRU5USVRZJyB8ICdFTlRJVElFUycgfCAnTk1UT0tFTicgfCAnTk1UT0tFTlMnDQotVG9rZW5pemVkVHlwZSA9IChJRHxJRFJFRnxJRFJFRlN8RU5USVRZfEVOVElUSUVTfE5NVE9LRU58Tk1UT0tFTlMpDQotDQotLy8gWzU3XSBFbnVtZXJhdGVkVHlwZSA6Oj0gTm90YXRpb25UeXBlIHwgRW51bWVyYXRpb24gDQotRW51bWVyYXRlZFR5cGUgPSAoe05vdGF0aW9uVHlwZX0gfCB7RW51bWVyYXRpb259KQ0KLQ0KLS8vIFs1OF0gTm90YXRpb25UeXBlIDo6PSAnTk9UQVRJT04nIFMgJygnIFM/IE5hbWUgKFM/ICd8JyBTPyBOYW1lKSogUz8gJyknIA0KLU5vdGF0aW9uVHlwZSA9IChOT1RBVElPTntTfVwoe1N9P3tOYW1lfSh7U30/XHx7U30/e05hbWV9KSp7U30/XCkpDQotDQotLy8gWzU5XSBFbnVtZXJhdGlvbiA6Oj0gJygnIFM/IE5tdG9rZW4gKFM/ICd8JyBTPyAgTm10b2tlbikqIFM/ICcpJw0KLUVudW1lcmF0aW9uID0gKFwoe1N9P3tObXRva2VufSh7U30/XHx7U30/e05tdG9rZW59KSp7U30/XCkpDQotDQotLy8gWzYwXSBEZWZhdWx0RGVjbCA6Oj0gJyNSRVFVSVJFRCcgfCAnI0lNUExJRUQnIHwgKCgnI0ZJWEVEJyBTKT8gQXR0VmFsdWUpDQotRGVmYXVsdERlY2wgPSAoXCNSRVFVSVJFRHxcI0lNUExJRUR8KChcI0ZJWEVEe1N9KT97QXR0VmFsdWV9KSkNCi0NCi0vLyBbNjFdIGNvbmRpdGlvbmFsU2VjdCA6Oj0gaW5jbHVkZVNlY3QgfCBpZ25vcmVTZWN0IA0KLWNvbmRpdGlvbmFsU2VjdCA9ICh7aW5jbHVkZVNlY3R9IHwge2lnbm9yZVNlY3R9KQ0KLQ0KLS8vIFs2Ml0gaW5jbHVkZVNlY3QgOjo9ICc8IVsnIFM/ICdJTkNMVURFJyBTPyAnWycgZXh0U3Vic2V0RGVjbCAnXV0+JyANCi1pbmNsdWRlU2VjdCA9ICg8XCFcW3tTfT9JTkNMVURFe1N9P1xbe2V4dFN1YnNldERlY2x9XF1cXT4pDQotDQotLy8gWzYzXSBpZ25vcmVTZWN0IDo6PSAnPCFbJyBTPyAnSUdOT1JFJyBTPyAnWycgaWdub3JlU2VjdENvbnRlbnRzKiAnXV0+Jw0KLWlnbm9yZVNlY3QgPSAoPFwhXFt7U30/SUdOT1JFe1N9P1xbe2lnbm9yZVNlY3RDb250ZW50c30qXF1cXT4pDQotDQotLy8gWzY0XSBpZ25vcmVTZWN0Q29udGVudHMgOjo9IElnbm9yZSAoJzwhWycgaWdub3JlU2VjdENvbnRlbnRzICddXT4nIElnbm9yZSkqDQotaWdub3JlU2VjdENvbnRlbnRzID0gKHtJZ25vcmV9KDxcIVxbe2lnbm9yZVNlY3RDb250ZW50c31cXVxdPntJZ25vcmV9KSopDQotDQotLy8gWzY1XSBJZ25vcmUgOjo9IENoYXIqIC0gKENoYXIqICgnPCFbJyB8ICddXT4nKSBDaGFyKikNCi1JZ25vcmUgPSAgKFteKFw8XCFcW3xcXVxdXD4pXSopDQotDQotLy8gWzY2XSBDaGFyUmVmIDo6PSAnJiMnIFswLTldKyAnOycgfCAnJiN4JyBbMC05YS1mQS1GXSsgJzsnDQotQ2hhclJlZiA9ICgmI1swLTldKzt8JiN4WzAtOWEtZkEtRl0rOykNCi0NCi0vLyBbNjddIFJlZmVyZW5jZSA6Oj0gRW50aXR5UmVmIHwgQ2hhclJlZg0KLVJlZmVyZW5jZSA9ICh7RW50aXR5UmVmfSB8IHtDaGFyUmVmfSkNCi0NCi0vLyBbNjhdIEVudGl0eVJlZiA9ICcmJyBOYW1lICc7Jw0KLUVudGl0eVJlZiA9ICgme05hbWV9OykNCi0NCi0vLyBbNjldIFBFUmVmZXJlbmNlIDo6PSAnJScgTmFtZSAnOycNCi1QRVJlZmVyZW5jZSA9ICgle05hbWV9OykNCi0NCi0vLyBbNzBdIEVudGl0eURlY2wgOjo9IEdFRGVjbCB8IFBFRGVjbA0KLUVudGl0eURlY2wgPSAoe0dFRGVjbH0gfCB7UEVEZWNsfSkNCi0NCi0vLyBbNzFdIEdFRGVjbCA6Oj0gJzwhRU5USVRZJyBTIE5hbWUgUyBFbnRpdHlEZWYgUz8gJz4nDQotR0VEZWNsID0gKDxcIUVOVElUWXtTfXtOYW1lfXtTfXtFbnRpdHlEZWZ9e1N9Pz4pDQotDQotLy8gWzcyXSBQRURlY2wgOjo9ICc8IUVOVElUWScgUyAnJScgUyBOYW1lIFMgUEVEZWYgUz8gJz4nDQotUEVEZWNsID0gKDxcIUVOVElUWXtTfVwle1N9e05hbWV9e1N9e1BFRGVmfXtTfT8+KQ0KLQ0KLS8vIFs3M10gRW50aXR5RGVmIDo6PSBFbnRpdHlWYWx1ZSB8IChFeHRlcm5hbElEIE5EYXRhRGVjbD8pDQotRW50aXR5RGVmID0gKHtFbnRpdHlWYWx1ZX0gfCAoe0V4dGVybmFsSUR9e05EYXRhRGVjbH0/KSkNCi0NCi0vLyBbNzRdIFBFRGVmIDo6PSBFbnRpdHlWYWx1ZSB8IEV4dGVybmFsSUQNCi1QRURlZiA9ICh7RW50aXR5VmFsdWV9IHwge0V4dGVybmFsSUR9KQ0KLQ0KLS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsIA0KLUV4dGVybmFsSUQgPSAoU1lTVEVNe1N9e1N5c3RlbUxpdGVyYWx9fFBVQkxJQ3tTfXtQdWJpZExpdGVyYWx9e1N9e1N5c3RlbUxpdGVyYWx9ICkNCi0NCi0vLyBbNzZdIE5EYXRhRGVjbCA6Oj0gUyAnTkRBVEEnIFMgTmFtZQ0KLU5EYXRhRGVjbCA9ICh7U31OREFUQXtTfXtOYW1lfSkNCi0NCi0vLyBbNzddIFRleHREZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvPyBFbmNvZGluZ0RlY2wgUz8gJz8+Jw0KLVRleHREZWNsID0gKDxcP3htbHtWZXJzaW9uSW5mb30/e0VuY29kaW5nRGVjbH17U30/XD8+KQ0KLQ0KLS8vIFs3OF0gZXh0UGFyc2VkRW50IDo6PSBUZXh0RGVjbD8gY29udGVudA0KLWV4dFBhcnNlZEVudCA9ICh7VGV4dERlY2x9P3tjb250ZW50fSkNCi0NCi0vLyBbNzldIGV4dFBFIDo6PSBUZXh0RGVjbD8gZXh0U3Vic2V0RGVjbA0KLWV4dFBFID0gKHtUZXh0RGVjbH0/e2V4dFN1YnNldERlY2x9KQ0KLQ0KLS8vIFs4MF0gRW5jb2RpbmdEZWNsIDo6PSBTICdlbmNvZGluZycgRXEgKCciJyBFbmNOYW1lICciJyB8ICAiJyIgRW5jTmFtZSAiJyIgKSANCi1FbmNvZGluZ0RlY2wgPSAoe1N9ZW5jb2Rpbmd7U30qe0VxfXtTfSooXCJ7RW5jTmFtZX1cInxcJ3tFbmNOYW1lfVwnKSkNCi0NCi0vLyBbODFdIEVuY05hbWUgOjo9IFtBLVphLXpdIChbQS1aYS16MC05Ll9dIHwgJy0nKSoNCi1FbmNOYW1lID0gKFtBLVphLXpdKFtBLVphLXowLTkuX118XC0pKikNCi0NCi0vLyBbODJdIE5vdGF0aW9uRGVjbCA6Oj0gJzwhTk9UQVRJT04nIFMgTmFtZSBTIChFeHRlcm5hbElEIHwgIFB1YmxpY0lEKSBTPyAnPicNCi1Ob3RhdGlvbkRlY2wgPSAoPFwhTk9UQVRJT057U317TmFtZX17U30oe0V4dGVybmFsSUR9fHtQdWJsaWNJRH0pe1N9Pz4pDQotDQotLy8gWzgzXSBQdWJsaWNJRCA6Oj0gJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwNCi1QdWJsaWNJRCA9IChQVUJMSUN7U317UHViaWRMaXRlcmFsfSkNCi0NCi0vLyBbODRdICBMZXR0ZXIgOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMNCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pDQotDQotLy8gWzg1XSAgQmFzZUNoYXIgOjo9IFsjeDAwNDEtI3gwMDVBXSB8IFsjeDAwNjEtI3gwMDdBXSB8IFsjeDAwQzAtI3gwMEQ2XQ0KLS8vIHwgWyN4MDBEOC0jeDAwRjZdIHwgWyN4MDBGOC0jeDAwRkZdIHwgWyN4MDEwMC0jeDAxMzFdDQotLy8gfCBbI3gwMTM0LSN4MDEzRV0gfCBbI3gwMTQxLSN4MDE0OF0gfCBbI3gwMTRBLSN4MDE3RV0NCi0vLyB8IFsjeDAxODAtI3gwMUMzXSB8IFsjeDAxQ0QtI3gwMUYwXSB8IFsjeDAxRjQtI3gwMUY1XQ0KLS8vIHwgWyN4MDFGQS0jeDAyMTddIHwgWyN4MDI1MC0jeDAyQThdIHwgWyN4MDJCQi0jeDAyQzFdIHwgI3gwMzg2DQotLy8gfCBbI3gwMzg4LSN4MDM4QV0gfCAjeDAzOEMgfCBbI3gwMzhFLSN4MDNBMV0gfCBbI3gwM0EzLSN4MDNDRV0NCi0vLyB8IFsjeDAzRDAtI3gwM0Q2XSB8ICN4MDNEQSB8ICN4MDNEQyB8ICN4MDNERSB8ICN4MDNFMA0KLS8vIHwgWyN4MDNFMi0jeDAzRjNdIHwgWyN4MDQwMS0jeDA0MENdIHwgWyN4MDQwRS0jeDA0NEZdDQotLy8gfCBbI3gwNDUxLSN4MDQ1Q10gfCBbI3gwNDVFLSN4MDQ4MV0gfCBbI3gwNDkwLSN4MDRDNF0NCi0vLyB8IFsjeDA0QzctI3gwNEM4XSB8IFsjeDA0Q0ItI3gwNENDXSB8IFsjeDA0RDAtI3gwNEVCXQ0KLS8vIHwgWyN4MDRFRS0jeDA0RjVdIHwgWyN4MDRGOC0jeDA0RjldIHwgWyN4MDUzMS0jeDA1NTZdIHwgI3gwNTU5DQotLy8gfCBbI3gwNTYxLSN4MDU4Nl0gfCBbI3gwNUQwLSN4MDVFQV0gfCBbI3gwNUYwLSN4MDVGMl0NCi0vLyB8IFsjeDA2MjEtI3gwNjNBXSB8IFsjeDA2NDEtI3gwNjRBXSB8IFsjeDA2NzEtI3gwNkI3XQ0KLS8vIHwgWyN4MDZCQS0jeDA2QkVdIHwgWyN4MDZDMC0jeDA2Q0VdIHwgWyN4MDZEMC0jeDA2RDNdIHwgI3gwNkQ1DQotLy8gfCBbI3gwNkU1LSN4MDZFNl0gfCBbI3gwOTA1LSN4MDkzOV0gfCAjeDA5M0QgfCBbI3gwOTU4LSN4MDk2MV0NCi0vLyB8IFsjeDA5ODUtI3gwOThDXSB8IFsjeDA5OEYtI3gwOTkwXSB8IFsjeDA5OTMtI3gwOUE4XQ0KLS8vIHwgWyN4MDlBQS0jeDA5QjBdIHwgI3gwOUIyIHwgWyN4MDlCNi0jeDA5QjldIHwgWyN4MDlEQy0jeDA5RERdDQotLy8gfCBbI3gwOURGLSN4MDlFMV0gfCBbI3gwOUYwLSN4MDlGMV0gfCBbI3gwQTA1LSN4MEEwQV0NCi0vLyB8IFsjeDBBMEYtI3gwQTEwXSB8IFsjeDBBMTMtI3gwQTI4XSB8IFsjeDBBMkEtI3gwQTMwXQ0KLS8vIHwgWyN4MEEzMi0jeDBBMzNdIHwgWyN4MEEzNS0jeDBBMzZdIHwgWyN4MEEzOC0jeDBBMzldDQotLy8gfCBbI3gwQTU5LSN4MEE1Q10gfCAjeDBBNUUgfCBbI3gwQTcyLSN4MEE3NF0gfCBbI3gwQTg1LSN4MEE4Ql0NCi0vLyB8ICN4MEE4RCB8IFsjeDBBOEYtI3gwQTkxXSB8IFsjeDBBOTMtI3gwQUE4XSB8IFsjeDBBQUEtI3gwQUIwXQ0KLS8vIHwgWyN4MEFCMi0jeDBBQjNdIHwgWyN4MEFCNS0jeDBBQjldIHwgI3gwQUJEIHwgI3gwQUUwDQotLy8gfCBbI3gwQjA1LSN4MEIwQ10gfCBbI3gwQjBGLSN4MEIxMF0gfCBbI3gwQjEzLSN4MEIyOF0NCi0vLyB8IFsjeDBCMkEtI3gwQjMwXSB8IFsjeDBCMzItI3gwQjMzXSB8IFsjeDBCMzYtI3gwQjM5XSB8ICN4MEIzRA0KLS8vIHwgWyN4MEI1Qy0jeDBCNURdIHwgWyN4MEI1Ri0jeDBCNjFdIHwgWyN4MEI4NS0jeDBCOEFdDQotLy8gfCBbI3gwQjhFLSN4MEI5MF0gfCBbI3gwQjkyLSN4MEI5NV0gfCBbI3gwQjk5LSN4MEI5QV0gfCAjeDBCOUMNCi0vLyB8IFsjeDBCOUUtI3gwQjlGXSB8IFsjeDBCQTMtI3gwQkE0XSB8IFsjeDBCQTgtI3gwQkFBXQ0KLS8vIHwgWyN4MEJBRS0jeDBCQjVdIHwgWyN4MEJCNy0jeDBCQjldIHwgWyN4MEMwNS0jeDBDMENdDQotLy8gfCBbI3gwQzBFLSN4MEMxMF0gfCBbI3gwQzEyLSN4MEMyOF0gfCBbI3gwQzJBLSN4MEMzM10NCi0vLyB8IFsjeDBDMzUtI3gwQzM5XSB8IFsjeDBDNjAtI3gwQzYxXSB8IFsjeDBDODUtI3gwQzhDXQ0KLS8vIHwgWyN4MEM4RS0jeDBDOTBdIHwgWyN4MEM5Mi0jeDBDQThdIHwgWyN4MENBQS0jeDBDQjNdDQotLy8gfCBbI3gwQ0I1LSN4MENCOV0gfCAjeDBDREUgfCBbI3gwQ0UwLSN4MENFMV0gfCBbI3gwRDA1LSN4MEQwQ10NCi0vLyB8IFsjeDBEMEUtI3gwRDEwXSB8IFsjeDBEMTItI3gwRDI4XSB8IFsjeDBEMkEtI3gwRDM5XQ0KLS8vIHwgWyN4MEQ2MC0jeDBENjFdIHwgWyN4MEUwMS0jeDBFMkVdIHwgI3gwRTMwIHwgWyN4MEUzMi0jeDBFMzNdDQotLy8gfCBbI3gwRTQwLSN4MEU0NV0gfCBbI3gwRTgxLSN4MEU4Ml0gfCAjeDBFODQgfCBbI3gwRTg3LSN4MEU4OF0NCi0vLyB8ICN4MEU4QSB8ICN4MEU4RCB8IFsjeDBFOTQtI3gwRTk3XSB8IFsjeDBFOTktI3gwRTlGXQ0KLS8vIHwgWyN4MEVBMS0jeDBFQTNdIHwgI3gwRUE1IHwgI3gwRUE3IHwgWyN4MEVBQS0jeDBFQUJdDQotLy8gfCBbI3gwRUFELSN4MEVBRV0gfCAjeDBFQjAgfCBbI3gwRUIyLSN4MEVCM10gfCAjeDBFQkQNCi0vLyB8IFsjeDBFQzAtI3gwRUM0XSB8IFsjeDBGNDAtI3gwRjQ3XSB8IFsjeDBGNDktI3gwRjY5XQ0KLS8vIHwgWyN4MTBBMC0jeDEwQzVdIHwgWyN4MTBEMC0jeDEwRjZdIHwgI3gxMTAwIHwgWyN4MTEwMi0jeDExMDNdDQotLy8gfCBbI3gxMTA1LSN4MTEwN10gfCAjeDExMDkgfCBbI3gxMTBCLSN4MTEwQ10gfCBbI3gxMTBFLSN4MTExMl0NCi0vLyB8ICN4MTEzQyB8ICN4MTEzRSB8ICN4MTE0MCB8ICN4MTE0QyB8ICN4MTE0RSB8ICN4MTE1MA0KLS8vIHwgWyN4MTE1NC0jeDExNTVdIHwgI3gxMTU5IHwgWyN4MTE1Ri0jeDExNjFdIHwgI3gxMTYzIHwgI3gxMTY1DQotLy8gfCAjeDExNjcgfCAjeDExNjkgfCBbI3gxMTZELSN4MTE2RV0gfCBbI3gxMTcyLSN4MTE3M10gfCAjeDExNzUNCi0vLyB8ICN4MTE5RSB8ICN4MTFBOCB8ICN4MTFBQiB8IFsjeDExQUUtI3gxMUFGXSB8IFsjeDExQjctI3gxMUI4XQ0KLS8vIHwgI3gxMUJBIHwgWyN4MTFCQy0jeDExQzJdIHwgI3gxMUVCIHwgI3gxMUYwIHwgI3gxMUY5DQotLy8gfCBbI3gxRTAwLSN4MUU5Ql0gfCBbI3gxRUEwLSN4MUVGOV0gfCBbI3gxRjAwLSN4MUYxNV0NCi0vLyB8IFsjeDFGMTgtI3gxRjFEXSB8IFsjeDFGMjAtI3gxRjQ1XSB8IFsjeDFGNDgtI3gxRjREXQ0KLS8vIHwgWyN4MUY1MC0jeDFGNTddIHwgI3gxRjU5IHwgI3gxRjVCIHwgI3gxRjVEIHwgWyN4MUY1Ri0jeDFGN0RdDQotLy8gfCBbI3gxRjgwLSN4MUZCNF0gfCBbI3gxRkI2LSN4MUZCQ10gfCAjeDFGQkUgfCBbI3gxRkMyLSN4MUZDNF0NCi0vLyB8IFsjeDFGQzYtI3gxRkNDXSB8IFsjeDFGRDAtI3gxRkQzXSB8IFsjeDFGRDYtI3gxRkRCXQ0KLS8vIHwgWyN4MUZFMC0jeDFGRUNdIHwgWyN4MUZGMi0jeDFGRjRdIHwgWyN4MUZGNi0jeDFGRkNdIHwgI3gyMTI2DQotLy8gfCBbI3gyMTJBLSN4MjEyQl0gfCAjeDIxMkUgfCBbI3gyMTgwLSN4MjE4Ml0gfCBbI3gzMDQxLSN4MzA5NF0NCi0vLyB8IFsjeDMwQTEtI3gzMEZBXSB8IFsjeDMxMDUtI3gzMTJDXSB8IFsjeEFDMDAtI3hEN0EzXQ0KLUJhc2VDaGFyID0gW1x1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM10NCi0NCi0vLyBbODZdICBJZGVvZ3JhcGhpYyA6Oj0gWyN4NEUwMC0jeDlGQTVdIHwgI3gzMDA3IHwgWyN4MzAyMS0jeDMwMjldDQotSWRlb2dyYXBoaWMgPSBbXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldDQotDQotLy8gWzg3XSAgICAgIENvbWJpbmluZ0NoYXIgICAgOjo9ICAgIFsjeDAzMDAtI3gwMzQ1XSAgICB8IFsjeDAzNjAtI3gwMzYxXQ0KLS8vIHwgWyN4MDQ4My0jeDA0ODZdICAgICAgICAgIHwgWyN4MDU5MS0jeDA1QTFdICAgICAgICAgfCBbI3gwNUEzLSN4MDVCOV0NCi0vLyB8IFsjeDA1QkItI3gwNUJEXSAgICAgICB8ICN4MDVCRiAgICAgICB8IFsjeDA1QzEtI3gwNUMyXQkgfCAjeDA1QzQNCi0vLyB8IFsjeDA2NEItI3gwNjUyXSAgICB8ICN4MDY3MCAgICB8IFsjeDA2RDYtI3gwNkRDXSAgIHwgWyN4MDZERC0jeDA2REZdDQotLy8gfCBbI3gwNkUwLSN4MDZFNF0gICAgICAgICAgfCBbI3gwNkU3LSN4MDZFOF0gICAgICAgICB8IFsjeDA2RUEtI3gwNkVEXQ0KLS8vIHwgWyN4MDkwMS0jeDA5MDNdICAgICAgIHwgI3gwOTNDICAgICAgIHwgWyN4MDkzRS0jeDA5NENdICAgICAgfCAjeDA5NEQNCi0vLyB8IFsjeDA5NTEtI3gwOTU0XSAgICB8IFsjeDA5NjItI3gwOTYzXSAgICB8IFsjeDA5ODEtI3gwOTgzXSAgIHwgI3gwOUJDDQotLy8gfCAjeDA5QkUgICAgICAgfCAjeDA5QkYgICAgICAgfCBbI3gwOUMwLSN4MDlDNF0gICAgICB8IFsjeDA5QzctI3gwOUM4XQ0KLS8vIHwgWyN4MDlDQi0jeDA5Q0RdICAgfCAjeDA5RDcgICB8IFsjeDA5RTItI3gwOUUzXSAgIHwgI3gwQTAyICAgfCAjeDBBM0MNCi0vLyB8ICN4MEEzRSAgICAgICB8ICN4MEEzRiAgICAgICB8IFsjeDBBNDAtI3gwQTQyXSAgICAgIHwgWyN4MEE0Ny0jeDBBNDhdDQotLy8gfCBbI3gwQTRCLSN4MEE0RF0gICAgfCBbI3gwQTcwLSN4MEE3MV0gICAgfCBbI3gwQTgxLSN4MEE4M10gICB8ICN4MEFCQw0KLS8vIHwgWyN4MEFCRS0jeDBBQzVdICAgICAgICAgIHwgWyN4MEFDNy0jeDBBQzldICAgICAgICAgfCBbI3gwQUNCLSN4MEFDRF0NCi0vLyB8IFsjeDBCMDEtI3gwQjAzXSAgICB8ICN4MEIzQyAgICB8IFsjeDBCM0UtI3gwQjQzXSAgIHwgWyN4MEI0Ny0jeDBCNDhdDQotLy8gfCBbI3gwQjRCLSN4MEI0RF0gICAgICAgICAgfCBbI3gwQjU2LSN4MEI1N10gICAgICAgICB8IFsjeDBCODItI3gwQjgzXQ0KLS8vIHwgWyN4MEJCRS0jeDBCQzJdICAgIHwgWyN4MEJDNi0jeDBCQzhdICAgIHwgWyN4MEJDQS0jeDBCQ0RdICAgfCAjeDBCRDcNCi0vLyB8IFsjeDBDMDEtI3gwQzAzXSAgICAgICAgICB8IFsjeDBDM0UtI3gwQzQ0XSAgICAgICAgIHwgWyN4MEM0Ni0jeDBDNDhdDQotLy8gfCBbI3gwQzRBLSN4MEM0RF0gICAgICAgICAgfCBbI3gwQzU1LSN4MEM1Nl0gICAgICAgICB8IFsjeDBDODItI3gwQzgzXQ0KLS8vIHwgWyN4MENCRS0jeDBDQzRdICAgICAgICAgIHwgWyN4MENDNi0jeDBDQzhdICAgICAgICAgfCBbI3gwQ0NBLSN4MENDRF0NCi0vLyB8IFsjeDBDRDUtI3gwQ0Q2XSAgICAgICAgICB8IFsjeDBEMDItI3gwRDAzXSAgICAgICAgIHwgWyN4MEQzRS0jeDBENDNdDQotLy8gfCBbI3gwRDQ2LSN4MEQ0OF0gICAgICAgfCBbI3gwRDRBLSN4MEQ0RF0gICAgICAgfCAjeDBENTcgICAgICB8ICN4MEUzMQ0KLS8vIHwgWyN4MEUzNC0jeDBFM0FdICAgIHwgWyN4MEU0Ny0jeDBFNEVdICAgIHwgI3gwRUIxICAgfCBbI3gwRUI0LSN4MEVCOV0NCi0vLyB8IFsjeDBFQkItI3gwRUJDXSAgICB8IFsjeDBFQzgtI3gwRUNEXSAgICB8IFsjeDBGMTgtI3gwRjE5XSAgIHwgI3gwRjM1DQotLy8gfCAjeDBGMzcgICAgICB8ICN4MEYzOSAgICAgfCAjeDBGM0UgICAgIHwgI3gwRjNGICAgICB8IFsjeDBGNzEtI3gwRjg0XQ0KLS8vIHwgWyN4MEY4Ni0jeDBGOEJdICAgIHwgWyN4MEY5MC0jeDBGOTVdICAgIHwgI3gwRjk3ICAgfCBbI3gwRjk5LSN4MEZBRF0NCi0vLyB8IFsjeDBGQjEtI3gwRkI3XSAgICAgICB8ICN4MEZCOSAgICAgICB8IFsjeDIwRDAtI3gyMERDXSAgICAgIHwgI3gyMEUxDQotLy8gfCBbI3gzMDJBLSN4MzAyRl0gfCAjeDMwOTkgfCAjeDMwOUENCi1Db21iaW5pbmdDaGFyID0gICAgW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0NCi0NCi0vLyBbODhdICAgRGlnaXQgIDo6PSAgWyN4MDAzMC0jeDAwMzldIHwgWyN4MDY2MC0jeDA2NjldIHwgWyN4MDZGMC0jeDA2RjldDQotLy8gfCBbI3gwOTY2LSN4MDk2Rl0gICAgICAgICAgfCBbI3gwOUU2LSN4MDlFRl0gICAgICAgICB8IFsjeDBBNjYtI3gwQTZGXQ0KLS8vIHwgWyN4MEFFNi0jeDBBRUZdICAgICAgICAgIHwgWyN4MEI2Ni0jeDBCNkZdICAgICAgICAgfCBbI3gwQkU3LSN4MEJFRl0NCi0vLyB8IFsjeDBDNjYtI3gwQzZGXSAgICAgICAgICB8IFsjeDBDRTYtI3gwQ0VGXSAgICAgICAgIHwgWyN4MEQ2Ni0jeDBENkZdDQotLy8gfCBbI3gwRTUwLSN4MEU1OV0gfCBbI3gwRUQwLSN4MEVEOV0gfCBbI3gwRjIwLSN4MEYyOV0NCi1EaWdpdCA9ICBbXHUwMDMwLVx1MDAzOVx1MDY2MC1cdTA2NjlcdTA2RjAtXHUwNkY5XHUwOTY2LVx1MDk2Rlx1MDlFNi1cdTA5RUZcdTBBNjYtXHUwQTZGXHUwQUU2LVx1MEFFRlx1MEI2Ni1cdTBCNkZcdTBCRTctXHUwQkVGXHUwQzY2LVx1MEM2Rlx1MENFNi1cdTBDRUZcdTBENjYtXHUwRDZGXHUwRTUwLVx1MEU1OVx1MEVEMC1cdTBFRDlcdTBGMjAtXHUwRjI5XQ0KLQ0KLS8vIFs4OV0gIEV4dGVuZGVyIDo6PSAjeDAwQjcgfCAjeDAyRDAgfCAjeDAyRDEgfCAjeDAzODcgfCAjeDA2NDAgfCAjeDBFNDYNCi0vLyB8ICN4MEVDNiAgICAgICB8ICN4MzAwNSAgICAgICB8IFsjeDMwMzEtI3gzMDM1XSAgICAgIHwgWyN4MzA5RC0jeDMwOUVdDQotLy8gfCBbI3gzMEZDLSN4MzBGRV0NCi1FeHRlbmRlciA9IFtcdTAwQjdcdTAyRDBcdTAyRDFcdTAzODdcdTA2NDBcdTBFNDZcdTBFQzZcdTMwMDVcdTMwMzEtXHUzMDM1XHUzMDlELVx1MzA5RVx1MzBGQy1cdTMwRkVdDQotDQotDQotDQotLyoqDQotICogSlNQIGFuZCBzY3JpcHRpbmcgbWFya2VyIGFsbG93YW5jZXMNCi0gKi8NCi0NCi1qc3BDb21tZW50U3RhcnQgPSA8JS0tDQotanNwQ29tbWVudEVuZCAgID0gLS0lPg0KLQ0KLWpzcFNjcmlwdGxldFN0YXJ0ICAgICAgICA9IDwlDQotanNwRXhwcmVzc2lvblN0YXJ0ICAgICAgID0ge2pzcFNjcmlwdGxldFN0YXJ0fT0NCi1qc3BEZWNsYXJhdGlvblN0YXJ0ICAgICAgPSB7anNwU2NyaXB0bGV0U3RhcnR9XCENCi1qc3BTY3JpcHRsZXRFbmQgICAgICAgICAgPSAlPg0KLWpzcERpcmVjdGl2ZVN0YXJ0ICAgICAgICA9IHtqc3BTY3JpcHRsZXRTdGFydH1ADQotDQotJSUNCi0NCi0vKiB3aGl0ZSBzcGFjZSB3aXRoaW4gYSB0YWcgKi8NCi08U1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9QSSwgU1RfWE1MX1BJX0VRVUFMUywgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04sIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVELFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLFNUX0RIVE1MX0VRVUFMUyxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUsU1RfREhUTUxfVEFHX0NMT1NFPiB7U30qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsNCi19DQotDQotLy8gQkVHSU4gUkVHVUxBUiBYTUwNCi0vKiBoYW5kbGUgb3BlbmluZyBhIG5ldyB0YWcgYWxtb3N0IGFueXdoZXJlICovDQotDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfSlNQX0RJUkVDVElWRV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSwgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOw0KLX0NCi0vKiBWRVJZIHNwZWNpYWwgY2FzZXMgZm9yIHRhZ3MgYXMgdmFsdWVzICovDQotLyogcXVvdGVkIEpTUCAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ+IFsiXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFsnXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiBbIl0gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCk7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBkb3VibGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJA0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gWyddIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ+IChbXjwiXHgyNFx4MjNdfFtceDI0XHgyM11bXlx4N2JdKSsgew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IChbXjwnXHgyNFx4MjNdfFtceDI0XHgyM11bXlx4N2JdKSsgew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIGluc2lkZSBvZiBKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7DQotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkNCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVELFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4ge2dlbmVyaWNFbmRUYWdPcGVufSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBlbmQgdGFnIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX0VORF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOw0KLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpDQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotLyogdW5xdW90ZWQgKi8NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTj4ge2dlbmVyaWNFbmRUYWdPcGVufSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOw0KLX0NCi0vKiBzcGVjaWFsbHkgdHJlYXRlZCBKU1AgdGFnIG5hbWVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOnJvb3Qgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBKU1BfUk9PVF9UQUdfTkFNRTsNCi19DQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOmRpcmVjdGl2ZS4ocGFnZXxpbmNsdWRlfHRhZ3x0YWdsaWJ8YXR0cmlidXRlfHZhcmlhYmxlKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi0vKiB0aGUgdGFnJ3MgbmFtZSB3YXMgZm91bmQsIHN0YXJ0IHNjYW5uaW5nIGZvciBhdHRyaWJ1dGVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi0NCi0vKiBhbm90aGVyIGF0dHJpYnV0ZSBuYW1lIHdhcyBmb3VuZCwgcmVzdW1lIGxvb2tpbmcgZm9yIHRoZSBlcXVhbHMgc2lnbiAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi0vKiBhbiBlcXVhbCBzaWduIHdhcyBmb3VuZCwgd2hhdCdzIG5leHQgaXMgdGhlIHZhbHVlICovDQotPFNUX1hNTF9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7DQotCQlmRW1iZWRkZWRIaW50ID0gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsNCi0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JfQ0KLQllbHNlDQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7DQotfQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQsIGJ1dCB0aGUgdGFnIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIGVuZCB0YWcgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljRW1wdHlUYWdDbG9zZX0gew0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1RBR19OQU1FPiBbXjwvPlx1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsNCi0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JfQ0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLS8vIEVORCBSRUdVTEFSIFhNTA0KLQ0KLS8vIEJFR0lOIE5FU1RFRCBYTUwgVEFHUw0KLTxTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9FUVVBTFM+IDx7TmFtZX0gew0KLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsNCi0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0DQotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOw0KLQkvKg0KLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4NCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4NCi0JICovDQotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgew0KLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsNCi0JfQ0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiA8e05hbWV9IHsNCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7DQotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldA0KLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsNCi0JLyoNCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuDQotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuDQotCSAqLw0KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsNCi0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JCXJldHVybiBYTUxfVEFHX09QRU47DQotCX0NCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotLy8gRU5EIE5FU1RFRCBYTUwNCi0NCi0vLyBYTUwgJiBKU1AgQ29tbWVudHMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtDb21tZW50U3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQ09NTUVOVDsNCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOw0KLX0NCi08U1RfWE1MX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLX0NCi0NCi08U1RfWE1MX0NPTU1FTlRfRU5EPiB7Q29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsNCi19DQotDQotPFNUX0pTUF9DT05URU5UPiB7anNwU2NyaXB0bGV0RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBKU1BfQ0xPU0U7DQotfQ0KLTxTVF9KU1BfQ09OVEVOVD4gLnxcbnxcciB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIGRvU2NhbigiJT4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBKU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5UKTsNCi19DQote2pzcFNjcmlwdGxldFN0YXJ0fSB7DQotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygxKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfU0NSSVBUTEVUX09QRU4sIEpTUF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JCX0NCi0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi17anNwRXhwcmVzc2lvblN0YXJ0fSB7DQotCS8qIEpTUCBleHByZXNzaW9uIGJlZ3VuIChhbnl3aGVyZSkNCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUNCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMNCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQNCi0JICovDQotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7DQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyENCi0JCXl5cHVzaGJhY2soMik7DQotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsNCi0JfQ0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7DQotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYW4gZXhwcmVzc2lvbiBvdXQgaW4gY29udGVudA0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiXG5KU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9FWFBSRVNTSU9OX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FWFBSRVNTSU9OX09QRU4sIEpTUF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JCX0NCi0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi17anNwRGVjbGFyYXRpb25TdGFydH0gew0KLQkvKiBKU1AgZGVjbGFyYXRpb24gYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzDQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsNCi0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9ERUNMQVJBVElPTl9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RFQ0xBUkFUSU9OX09QRU4sIEpTUF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JCX0NCi0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi17anNwQ29tbWVudFN0YXJ0fSB7DQotCS8qIEpTUCBjb21tZW50IGJlZ3VuIChhbnl3aGVyZSkNCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUNCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMNCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQNCi0JICovDQotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7DQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyENCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsNCi0JCXl5cHVzaGJhY2soNCk7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjayg0KTsNCi0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjayg0KTsNCi0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgIHsNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pDQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKT09WVlJTklUSUFMKSB7DQotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudA0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQkJcmV0dXJuIEpTUF9DT01NRU5UX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7DQotCQkvLyB0aGUgY29tbWVudCBjb250YWluZXIgaXRzZWxmIHdpbGwgYWN0IGFzIGNvbW1lbnQgdGV4dA0KLQkJZkVtYmVkZGVkSGludCA9IEpTUF9DT01NRU5UX1RFWFQ7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLyoNCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhDQotCQkgKiBjb21tZW50IHNvIGl0IHdpbGwgYmUgb3RoZXJ3aXNlIGlnbm9yZWQgYnV0IHByZXNlcnZlZCAod2hpY2ggaXMgd2h5DQotCQkgKiB3ZSBjYW4ndCB1c2Ugd2hpdGUtc3BhY2UpDQotCQkgKi8NCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotPFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOPiB7anNwQ29tbWVudFN0YXJ0fSAgew0KLQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7DQotCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikNCi0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFlZSU5JVElBTCxTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTj4ge2pzcERpcmVjdGl2ZVN0YXJ0fSAgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7DQotCQlyZXR1cm4gSlNQX0RJUkVDVElWRV9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRElSRUNUSVZFX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRElSRUNUSVZFX0NMT1NFLCBKU1BfQ0xPU0V9KTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0U+IHtTfT8gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRT4ge2pzcFNjcmlwdGxldEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge2pzcENvbW1lbnRTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsNCi0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsNCi0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotLy8gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSwgcmV0dXJuIGFzIGVuZGluZyByZWdpb24NCi08U1RfSlNQX0RRVU9URURfRUwsU1RfSlNQX0RRVU9URURfVkJMPiBbIl0gew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOw0KLX0NCi0vLyB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlLCByZXR1cm4gYXMgZW5kaW5nIHJlZ2lvbg0KLTxTVF9KU1BfU1FVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9WQkw+IFsnXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIGRvdWJsZSBxdW90ZXMNCi08U1RfSlNQX0RRVU9URURfRUw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBFTA0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gXFxcIiB7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX0VMPiBcXFwnIChbXlxcXXxcXFteJ31dKykqIFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgRUwNCi08U1RfSlNQX1NRVU9URURfRUw+IChbXlxcfSddfFxcW14nXSkrIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1NRVU9URURfRUw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9FTD4gfSB7DQotCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIHF1b3Rlcw0KLTxTVF9KU1BfRFFVT1RFRF9WQkw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgVkJMDQotPFNUX0pTUF9EUVVPVEVEX1ZCTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX0RRVU9URURfVkJMPiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX1ZCTD4gXFxcJyAoW15cXF18XFxbXid9XSspKiBcXFwnIHsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBWQkwNCi08U1RfSlNQX1NRVU9URURfVkJMPiAoW15cXH0nXXxcXFteJ10pKyB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfU1FVT1RFRF9WQkw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0NCi08U1RfSlNQX0RRVU9URURfVkJMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gfSB7DQotCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLX0NCi0NCi0NCi0vLyBYTUwgY29udGVudCBhcmVhIEVMDQotPFlZSU5JVElBTD4gXHgyNFx4N2JbXlx4N2RdKi9ceDdkIHsNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOw0KLQlmRUxsZXZlbCsrOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfSlNQX0VMPiBceDI0XHg3YiB7DQotCWZFTGxldmVsKys7DQotCWlmKGZFTGxldmVsID09IDEpIHsNCi0JCXJldHVybiBKU1BfRUxfT1BFTjsNCi0JfQ0KLX0NCi0vLyBYTUwgY29udGVudCBhcmVhIFZCTA0KLTxZWUlOSVRJQUw+IFx4MjNceDdiW15ceDdkXSovXHg3ZCB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWlmKHl5bGVuZ3RoKCkgPiAyKQ0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7DQotCWZFTGxldmVsKys7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX0pTUF9WQkw+IFx4MjNceDdiIHsNCi0JZkVMbGV2ZWwrKzsNCi0JaWYoZkVMbGV2ZWwgPT0gMSkgew0KLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsNCi0JfQ0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIFZCTCBhcyBjb250ZW50DQotPFNUX0pTUF9WQkw+IFteXHg3ZFx4MjJceDI3XSogew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIEVMIGFzIGNvbnRlbnQNCi08U1RfSlNQX0VMPiBbXlx4N2RceDIyXHgyN10qIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi0NCi0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX0VMPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMX0RRVU9URVM+IFteXHgyMl0rL1x4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfRFFVT1RFU19FTkQ+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX0VMX1NRVU9URVM+IFteXHgyN10rL1x4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfU1FVT1RFU19FTkQ+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX1ZCTD4gXHgyMiB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9EUVVPVEVTPiBbXlx4MjJdKy9ceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX0RRVU9URVNfRU5EPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTD4gXHgyNyB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9TUVVPVEVTPiBbXlx4MjddKy9ceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX1NRVU9URVNfRU5EPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi0NCi0vLyB1bnF1b3RlZCBjb250ZW50DQotPFNUX0pTUF9FTD4gKFtefVx4MjdceDIyXHgyNF18XHgyNFteXHg3Ylx4MjdceDIyXSkrIHsNCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9FTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotCX0NCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1ZCTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLQl9DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLS8vIEVMIHVucXVvdGVkIGluIHRhZyAoc2VjdGlvbiAyLjEgZGVjbGFyZXMgaXQgYXMgdmFsaWQgaW4gdGVtcGxhdGUgdGV4dCAoWE1MX0NPTlRFTlQpIG9yIGF0dHJpYnV0ZSB2YWx1ZXMNCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gXHgyNFx4N2JbXlx4N2RdKy9ceDdkIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiRUwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlmRUxsZXZlbCsrOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFfSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotLy8gVkJMIHVucXVvdGVkIGluIHRhZyBvciBhdHRyaWJ1dGUgdmFsdWVzDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IFx4MjNceDdiW15ceDdkXSsvXHg3ZCB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoeXlsZW5ndGgoKSA+IDIpDQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlZCTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9WQkwpOw0KLQlmRUxsZXZlbCsrOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi08U1RfSlNQX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgdGV4dCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLX0NCi08U1RfSlNQX0NPTU1FTlRfRU5EPiB7anNwQ29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIEpTUF9DT01NRU5UX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgbWlzYw0KLQ0KLXtDRFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47DQotfQ0KLTxTVF9DREFUQV9URVhUPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCVN0cmluZyByZXR1cm5lZENvbnRleHQgPSBkb1NjYW4oIl1dPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5ELCAgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkDQotCWlmKHJldHVybmVkQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkNCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsNCi0JcmV0dXJuIHJldHVybmVkQ29udGV4dDsNCi19DQotPFNUX0NEQVRBX0VORD4ge0NERW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BFUmVmZXJlbmNlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtDaGFyUmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOw0KLX0NCi08WVlJTklUSUFMPiB7RW50aXR5UmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BJc3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfUEkpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOw0KLX0NCi0vLyB0aGUgbmV4dCB0aHJlZSBhcmUgb3JkZXIgZGVwZW5kZW50DQotPFNUX1BJPiAoKFh8eCkoTXxtKShMfGwpKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4gKFtpSV1bbU1dW3BQXVtvT11bclJdW3RUXSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QSV9XUz4ge1N9KyB7DQotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOw0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi08U1RfUEksIFNUX1BJX1dTPiBcPz4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1BJX0NPTlRFTlQ+IC4gew0KLQkJLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZA0KLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsNCi19DQotPFNUX1BJX0NPTlRFTlQsU1RfWE1MX1BJX1RBR19DTE9TRT4gXD8+IHsNCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUNCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfWE1MX1BJX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIHRoZSBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtQSWVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLS8vIERIVE1MDQotPFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfREhUTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB8IChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIFRoZSBESFRNTCBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9ESFRNTF9FUVVBTFMsIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IFsvXSo+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBkZWNsYXJhdGlvbnMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSEgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRWVdW0xsXVtFZV1bTW1dW0VlXVtObl1bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRGRdW09vXVtDY11bVHRdW1l5XVtQcF1bRWVdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbQWFdW1R0XVtUdF1bTGxdW0lpXVtTc11bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOw0KLX0NCi0NCi0vLyBiZWdpbiBET0NUWVBFIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0U+IFxbW15cXV0qXF0gew0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOw0KLX0NCi0NCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1BwXVtVdV1bQmJdW0xsXVtJaV1bQ2NdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1NzXVtZeV1bU3NdW1R0XVtFZV1bTW1dIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUM+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0+IHtBdHRWYWx1ZX18e1N5c3RlbUxpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOw0KLX0NCi0vLyBlbmQgRE9DVFlQRSBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEVMRU1FTlQgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgRUxFTUVOVCBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEFUVExJU1QgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsNCi19DQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IFtePl0qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgQVRUTElTVCBoYW5kbGluZw0KLQ0KLTxTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCwgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBERUNMQVJBVElPTiBoYW5kbGluZw0KLQ0KLTxZWUlOSVRJQUw+IChbXjwmJVx4MjRceDIzXSp8XHgyMyt8XHgyNCt8WyYlXXtTfSt7TmFtZX1bXiYlPF0qfFtceDI0XHgyM11bXlx4N2I8JiVdfFsmJV17TmFtZX0oW147JiU8XSp8e1N9KzsqKSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ09OVEVOVDsNCi19DQotDQotDQotPFNUX0JMT0NLX1RBR19TQ0FOPiAufFxyfFxuIHsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotDQotLiB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBVTkRFRklORUQ7DQotfQ0KLQ0KLVwwNDAgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlNQQUNFIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTEgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIjB4OSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDE1IA0KLXsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDQVJSSUFHRSBSRVRVUk4iKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxMiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDUzN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODgxICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDgvMTYvMDUgMzowNyBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDgvMTYvMDUgMzowNyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0IHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjJcMlwwXDFcMTRcMjJcMFwxXDE0XDFcMjFcMVwxMVwxXDUxIisKLSAgICAiXDFcMTZcMVwxN1wxXDEyXDFcMTNcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDE2XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDE1XDFcMTBcMVw1NFwxXDFcMVw0M1wxXDJcMVw0XDFcMTYiKwotICAgICJcMVwzMlwxXDU1XDFcMzBcMVwzMVwxXDM1XDFcNTJcMVwzNFwxXDM0XDFcNDBcMVwzNCIrCi0gICAgIlwxXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDMzIisKLSAgICAiXDFcNTNcMlwzNFwxXDIzXDFcNDRcMVwzNFwxXDI3XDFcMFwxXDIwXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDQ3XDFcNTVcMVw1NlwxXDUwXDFcMzVcMVw1MlwxXDM0XDFcMzRcMVw0MCIrCi0gICAgIlwyXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDQ2IisKLSAgICAiXDFcNTNcMVwzNFwxXDM0XDFcMjRcMVw0NFwxXDM0XDFcMFwxXDBcNzJcMFwxXDYwIisKLSAgICAiXDEwXDBcMjdcNTdcMVwwXDM3XDU3XDFcMFw3Mlw1N1wyXDBcMTNcNTdcMlwwXDEwXDU3IisKLSAgICAiXDFcMFw2NVw1N1wxXDBcMTA0XDU3XDExXDBcNDRcNTdcM1wwXDJcNTdcNFwwXDM2XDU3IisKLSAgICAiXDcwXDBcMTMxXDU3XDIyXDBcN1w1N1wxNlwwXDJcNjBcNTZcMFwxMDZcNjBcMzJcMFwyXDYwIisKLSAgICAiXDQ0XDBcMVw1N1wxXDYwXDNcNTdcMVwwXDFcNTdcMVwwXDI0XDU3XDFcMFw1NFw1NyIrCi0gICAgIlwxXDBcN1w1N1wzXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1NyIrCi0gICAgIlwxXDBcMjJcNTdcMTVcMFwxNFw1N1wxXDBcMTAyXDU3XDFcMFwxNFw1N1wxXDBcNDRcNTciKwotICAgICJcMVwwXDRcNjBcMTFcMFw2NVw1N1wyXDBcMlw1N1wyXDBcMlw1N1wzXDBcMzRcNTciKwotICAgICJcMlwwXDEwXDU3XDJcMFwyXDU3XDY3XDBcNDZcNTdcMlwwXDFcNTdcN1wwXDQ2XDU3IisKLSAgICAiXDEyXDBcMjFcNjBcMVwwXDI3XDYwXDFcMFwzXDYwXDFcMFwxXDYwXDFcMFwyXDYwIisKLSAgICAiXDFcMFwxXDYwXDEzXDBcMzNcNTdcNVwwXDNcNTdcNTZcMFwzMlw1N1w1XDBcMVw2MCIrCi0gICAgIlwxMlw1N1wxMFw2MFwxNVwwXDEyXDYwXDZcMFwxXDYwXDEwN1w1N1wyXDBcNVw1N1wxXDAiKwotICAgICJcMTdcNTdcMVwwXDRcNTdcMVwwXDFcNTdcMTdcNjBcMlw1N1wyXDYwXDFcMFw0XDYwIisKLSAgICAiXDJcMFwxMlw2MFx1MDIwN1wwXDNcNjBcMVwwXDY1XDU3XDJcMFwxXDYwXDFcNTdcMjBcNjAiKwotICAgICJcM1wwXDRcNjBcM1wwXDEyXDU3XDJcNjBcMlwwXDEyXDYwXDIxXDBcM1w2MFwxXDAiKwotICAgICJcMTBcNTdcMlwwXDJcNTdcMlwwXDI2XDU3XDFcMFw3XDU3XDFcMFwxXDU3XDNcMCIrCi0gICAgIlw0XDU3XDJcMFwxXDYwXDFcMFw3XDYwXDJcMFwyXDYwXDJcMFwzXDYwXDExXDAiKwotICAgICJcMVw2MFw0XDBcMlw1N1wxXDBcM1w1N1wyXDYwXDJcMFwxMlw2MFwyXDU3XDIwXDAiKwotICAgICJcMVw2MFwyXDBcNlw1N1w0XDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDJcNTdcMVwwXDJcNTdcMlwwXDFcNjBcMVwwXDVcNjBcNFwwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMTNcMFw0XDU3XDFcMFwxXDU3XDdcMFwxMlw2MFwyXDYwIisKLSAgICAiXDNcNTdcMTRcMFwzXDYwXDFcMFw3XDU3XDFcMFwxXDU3XDFcMFwzXDU3XDFcMCIrCi0gICAgIlwyNlw1N1wxXDBcN1w1N1wxXDBcMlw1N1wxXDBcNVw1N1wyXDBcMVw2MFwxXDU3IisKLSAgICAiXDEwXDYwXDFcMFwzXDYwXDFcMFwzXDYwXDIyXDBcMVw1N1w1XDBcMTJcNjBcMjFcMCIrCi0gICAgIlwzXDYwXDFcMFwxMFw1N1wyXDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMlwwXDRcNTdcMlwwXDFcNjBcMVw1N1w2XDYwXDNcMFwyXDYwXDJcMCIrCi0gICAgIlwzXDYwXDEwXDBcMlw2MFw0XDBcMlw1N1wxXDBcM1w1N1w0XDBcMTJcNjBcMjJcMCIrCi0gICAgIlwyXDYwXDFcMFw2XDU3XDNcMFwzXDU3XDFcMFw0XDU3XDNcMFwyXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwyXDU3XDNcMFwyXDU3XDNcMFwzXDU3XDNcMFwxMFw1N1wxXDAiKwotICAgICJcM1w1N1w0XDBcNVw2MFwzXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTdcMCIrCi0gICAgIlwxMVw2MFwyMVwwXDNcNjBcMVwwXDEwXDU3XDFcMFwzXDU3XDFcMFwyN1w1N1wxXDAiKwotICAgICJcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwXDNcNjBcMVwwXDRcNjBcN1wwIisKLSAgICAiXDJcNjBcMTFcMFwyXDU3XDRcMFwxMlw2MFwyMlwwXDJcNjBcMVwwXDEwXDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFwyN1w1N1wxXDBcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwIisKLSAgICAiXDNcNjBcMVwwXDRcNjBcN1wwXDJcNjBcN1wwXDFcNTdcMVwwXDJcNTdcNFwwIisKLSAgICAiXDEyXDYwXDIyXDBcMlw2MFwxXDBcMTBcNTdcMVwwXDNcNTdcMVwwXDI3XDU3XDFcMCIrCi0gICAgIlwyMFw1N1w0XDBcNlw2MFwyXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTBcMCIrCi0gICAgIlwyXDU3XDRcMFwxMlw2MFwyMjFcMFw1Nlw1N1wxXDBcMVw1N1wxXDYwXDJcNTdcN1w2MCIrCi0gICAgIlw1XDBcNlw1N1wxXDYwXDEwXDYwXDFcMFwxMlw2MFw0N1wwXDJcNTdcMVwwXDFcNTciKwotICAgICJcMlwwXDJcNTdcMVwwXDFcNTdcMlwwXDFcNTdcNlwwXDRcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDFcNTdcMlwwXDJcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDFcNTdcMVw2MFwyXDU3XDZcNjBcMVwwXDJcNjBcMVw1N1wyXDBcNVw1NyIrCi0gICAgIlwxXDBcMVw2MFwxXDBcNlw2MFwyXDBcMTJcNjBcNzZcMFwyXDYwXDZcMFwxMlw2MCIrCi0gICAgIlwxM1wwXDFcNjBcMVwwXDFcNjBcMVwwXDFcNjBcNFwwXDJcNjBcMTBcNTdcMVwwIisKLSAgICAiXDQxXDU3XDdcMFwyNFw2MFwxXDBcNlw2MFw0XDBcNlw2MFwxXDBcMVw2MFwxXDAiKwotICAgICJcMjVcNjBcM1wwXDdcNjBcMVwwXDFcNjBcMzQ2XDBcNDZcNTdcMTJcMFw0N1w1N1wxMVwwIisKLSAgICAiXDFcNTdcMVwwXDJcNTdcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDJcNTdcMVwwIisKLSAgICAiXDVcNTdcNTFcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDEzXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDBcMVw1N1w1XDBcM1w1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDAiKwotICAgICJcMlw1N1wxXDBcMVw1N1w1MFwwXDFcNTdcMTFcMFwxXDU3XDJcMFwxXDU3XDJcMCIrCi0gICAgIlwyXDU3XDdcMFwyXDU3XDFcMFwxXDU3XDFcMFw3XDU3XDUwXDBcMVw1N1w0XDAiKwotICAgICJcMVw1N1wxMFwwXDFcNTdcdTBjMDZcMFwyMzRcNTdcNFwwXDEzMlw1N1w2XDBcMjZcNTdcMlwwIisKLSAgICAiXDZcNTdcMlwwXDQ2XDU3XDJcMFw2XDU3XDJcMFwxMFw1N1wxXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMzdcNTdcMlwwXDY1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwxXDU3XDNcMFwzXDU3XDFcMFw3XDU3XDNcMFw0XDU3XDJcMFw2XDU3XDRcMCIrCi0gICAgIlwxNVw1N1w1XDBcM1w1N1wxXDBcN1w1N1wzMjNcMFwxNVw2MFw0XDBcMVw2MFwxMDRcMCIrCi0gICAgIlwxXDU3XDNcMFwyXDU3XDJcMFwxXDU3XDEyMVwwXDNcNTdcdTBlODJcMFwxXDYwXDFcMCIrCi0gICAgIlwxXDU3XDMxXDBcMTFcNTdcNlw2MFwxXDBcNVw2MFwxM1wwXDEyNFw1N1w0XDBcMlw2MCIrCi0gICAgIlwyXDBcMlw2MFwyXDBcMTMyXDU3XDFcMFwzXDYwXDZcMFw1MFw1N1x1MWNkM1wwXHU1MWE2XDU3IisKLSAgICAiXHUwYzVhXDBcdTJiYTRcNTdcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA0OSwgICAgOTgsICAgMTQ3LCAgIDE5NiwgICAyNDUsICAgMjk0LCAgIDM0MywgICAzOTIsICAgNDQxLCAKLSAgICAgIDQ5MCwgICA1MzksICAgNTg4LCAgIDYzNywgICA2ODYsICAgNzM1LCAgIDc4NCwgICA4MzMsICAgODgyLCAgIDkzMSwgCi0gICAgICA5ODAsICAxMDI5LCAgMTA3OCwgIDExMjcsICAxMTc2LCAgMTIyNSwgIDEyNzQsICAxMzIzLCAgMTM3MiwgIDE0MjEsIAotICAgICAxNDcwLCAgMTUxOSwgIDE1NjgsICAxNjE3LCAgMTY2NiwgIDE3MTUsICAxNzY0LCAgMTcxNSwgIDE3NjQsICAxODEzLCAKLSAgICAgMTcxNSwgIDE3MTUsICAxNzY0LCAgMTg2MiwgIDE5MTEsICAxOTYwLCAgMjAwOSwgIDIwNTgsICAyMTA3LCAgMjE1NiwgCi0gICAgIDE3MTUsICAxNzY0LCAgMjIwNSwgIDIyNTQsICAyMzAzLCAgMTcxNSwgIDIzNTIsICAyMzUyLCAgMjQwMSwgIDI0NTAsIAotICAgICAyNDk5LCAgMjIwNSwgIDE3MTUsICAyNTQ4LCAgMjU5NywgIDE3MTUsICAyNjQ2LCAgMjY5NSwgIDI3NDQsICAyNzkzLCAKLSAgICAgMjg0MiwgIDI4OTEsICAxNzE1LCAgMjk0MCwgIDI5ODksICAzMDM4LCAgMzA4NywgIDE3MTUsICAzMTM2LCAgMzE4NSwgCi0gICAgIDMyMzQsICAzMjgzLCAgMzMzMiwgIDE3MTUsICAzMzgxLCAgMzQzMCwgIDM0NzksICAzNTI4LCAgMzU3NywgIDM2MjYsIAotICAgICAzNjc1LCAgMzcyNCwgIDM3MjQsICAzNzczLCAgMzgyMiwgIDM4NzEsICAzOTIwLCAgMzkyMCwgIDM5NjksICA0MDE4LCAKLSAgICAgNDA2NywgIDQxMTYsICA0MTE2LCAgNDE2NSwgIDQyMTQsICA0MjYzLCAgNDMxMiwgIDE3MTUsICA0MzYxLCAgNDM2MSwgCi0gICAgIDQ0MTAsICA0NDU5LCAgNDUwOCwgIDQ1NTcsICAxNzE1LCAgMTcxNSwgIDE3NjQsICAxNzE1LCAgMTcxNSwgIDQ2MDYsIAotICAgICA0NjU1LCAgNDcwNCwgIDQ3NTMsICA0ODAyLCAgNDg1MSwgIDQ5MDAsICA0OTQ5LCAgMTcxNSwgIDQ5OTgsICA1MDQ3LCAKLSAgICAgMTcxNSwgIDE3MTUsICAyMzUyLCAgNTA5NiwgIDI0NTAsICAxNzE1LCAgNTE0NSwgIDI0OTksICAyNTQ4LCAgMjY0NiwgCi0gICAgIDI2OTUsICA1MTk0LCAgMjc0NCwgIDE3MTUsICA1MjQzLCAgMjc5MywgIDE3MTUsICAzMTM2LCAgNTI5MiwgIDMyMzQsIAotICAgICAxNzE1LCAgNTM0MSwgIDMyODMsICA0NjA2LCAgNTM5MCwgIDU0MzksICA1NDg4LCAgMzUyOCwgIDE3MTUsICA1NTM3LCAKLSAgICAgNTU4NiwgIDM3MjQsICA1NjM1LCAgMzc3MywgIDE3MTUsICA1Njg0LCAgNTczMywgIDU3ODIsICA1NzgyLCAgNTgzMSwgCi0gICAgIDU4ODAsICAzODcxLCAgMzcyNCwgIDM5MjAsICA1OTI5LCAgMzk2OSwgIDE3MTUsICA1OTc4LCAgNDAxOCwgIDQwNjcsIAotICAgICAzOTIwLCAgNDExNiwgIDYwMjcsICA0MTY1LCAgMTcxNSwgIDYwNzYsICA2MTI1LCAgNjE3NCwgIDYxNzQsICA2MjIzLCAKLSAgICAgNjI3MiwgIDYzMjEsICA0MzYxLCAgNjM3MCwgIDQ0MTAsICAxNzE1LCAgNjQxOSwgIDY0NjgsICA2NTE3LCAgNjUxNywgCi0gICAgIDY1NjYsICA2NjE1LCAgNjY2NCwgIDY3MTMsICA2NzYyLCAgNjgxMSwgIDY4NjAsICAxNzE1LCAgNjkwOSwgIDY5NTgsIAotICAgICAxNzE1LCAgMTcxNSwgIDE3MTUsICAyMDA5LCAgNzAwNywgIDcwNTYsICA3MTA1LCAgNzE1NCwgIDcyMDMsICA3MjUyLCAKLSAgICAgNTY4NCwgIDczMDEsICA3MzAxLCAgNjA3NiwgIDczNTAsICA3MzUwLCAgNzM5OSwgIDY0MTksICA3NDQ4LCAgNzQ0OCwgCi0gICAgIDc0OTcsICAxNzE1LCAgNzU0NiwgIDc1OTUsICAxNzE1LCAgNzY0NCwgIDc2OTMsICA3NzQyLCAgNzc5MSwgIDc4NDAsIAotICAgICA3ODg5LCAgNzkzOCwgIDU4MzEsICA2MjIzLCAgNzk4NywgIDY1NjYsICA4MDM2LCAgODA4NSwgIDgxMzQsICA4MTgzLCAKLSAgICAgODIzMiwgIDgyODEsICA4MzMwLCAgODM3OSwgIDg0MjgsICA4NDc3LCAgODUyNiwgIDg1NzUsICA4NjI0LCAgODY3MywgCi0gICAgIDg3MjIsICAxNzE1LCAgMTcxNSwgIDg3NzEsICA4ODIwLCAgODg2OSwgIDg5MTgsICAxNzE1LCAgMTcxNSwgIDE3MTUsIAotICAgICA4OTY3LCAgOTAxNiwgIDkwNjUsICA5MTE0LCAgOTE2MywgIDE3MTUsICA0MjYzLCAgNDUwOAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0MVw0MFwxXDQ0IisKLSAgICAiXDFcNDVcNTdcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDM2XDQ2XDFcNTJcMVw1M1w1N1w1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcMzdcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwyXDYwXDJcNTdcMVw0NiIrCi0gICAgIlwxMFw1N1wxXDYxXDJcNTdcMVw0Nlw1XDU3XDFcNDZcMlw1N1wxXDQ2IisKLSAgICAiXDNcNTdcMlw0NlwxXDQ3XDJcNDZcMVw1NVwxXDYyXDZcNDZcMVw2MiIrCi0gICAgIlw1XDQ2XDFcNjJcMzZcNDZcMVw2M1wxXDY0XDJcNjNcMVw2NVwxNVw2MyIrCi0gICAgIlwxXDUxXDM2XDYzXDFcNDZcMVw0N1wyXDQ2XDFcNjZcMVw1NlwyXDQ2IisKLSAgICAiXDFcNjdcM1w0NlwxXDU2XDVcNDZcMVw1Nlw0XDY3XDFcNDZcMTNcNjciKwotICAgICJcMVw0Nlw1XDY3XDFcNDZcMlw2N1wxXDQ2XDNcNjdcMlw0NlwxXDQ3IisKLSAgICAiXDJcNDZcMVw2NlwxXDU2XDJcNDZcMVw2N1wzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDRcNjdcMVw0NlwxM1w2N1wxXDcwXDVcNjdcMVw0NlwyXDY3IisKLSAgICAiXDFcNDZcM1w2N1wxXDQ2XDFcNzFcMVw0N1wxXDQ2XDFcNzJcMVw3MyIrCi0gICAgIlwxXDU2XDNcNzFcMVw3NFwxXDcxXDFcNzVcMVw1Nlw1XDcxXDFcNTYiKwotICAgICJcMzZcNzFcMVw0NlwxXDQ3XDJcNDZcMVw3NlwxNVw0NlwxXDUxXDM3XDQ2IisKLSAgICAiXDFcNDdcMVw3N1wxXDEwMFwxXDQ2XDFcNTZcMlw0NlwxXDEwMVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTAxXDFcNDZcMTNcMTAxXDFcNDZcNVwxMDEiKwotICAgICJcMVw0NlwyXDEwMVwxXDQ2XDNcMTAxXDJcNDZcMVw0N1wxXDc3XDFcMTAwIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTAxXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNFwxMDFcMVw0NlwxM1wxMDFcMVwxMDJcNVwxMDFcMVw0NlwyXDEwMVwxXDQ2IisKLSAgICAiXDNcMTAxXDFcNDZcMVwxMDNcMVw0N1wxXDc3XDFcMTA0XDFcMTAzXDFcNTYiKwotICAgICJcM1wxMDNcMVwxMDVcMVwxMDNcMVwxMDZcMVw1Nlw1XDEwM1wxXDU2XDM2XDEwMyIrCi0gICAgIlwxXDQ2XDFcNDdcM1w0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcMzZcNDZcMVwxMDdcMVwxMTBcMVwxMTFcMVwxMTJcNFwxMDdcMVwxMTNcMTJcMTA3IisKLSAgICAiXDRcMTE0XDFcMTA3XDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwNyIrCi0gICAgIlwzXDExNFwxXDEwN1wxXDQ2XDFcMTEwXDFcMTExXDFcMTEyXDFcNDZcMVw1NiIrCi0gICAgIlwyXDQ2XDFcMTE1XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNFwxMTVcMVw0NiIrCi0gICAgIlwxM1wxMTVcMVw0Nlw1XDExNVwxXDQ2XDJcMTE1XDFcNDZcM1wxMTVcMlw0NiIrCi0gICAgIlwxXDExMFwxXDExMVwxXDExMlwxXDQ2XDFcNTZcMlw0NlwxXDExNVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTE1XDFcNDZcMTNcMTE1XDFcMTE2XDVcMTE1IisKLSAgICAiXDFcNDZcMlwxMTVcMVw0NlwzXDExNVwxXDQ2XDFcMTE3XDFcMTEwXDFcMTExIisKLSAgICAiXDFcMTIwXDFcMTE3XDFcNTZcM1wxMTdcMVwxMjFcMVwxMTdcMVwxMjJcMVw1NiIrCi0gICAgIlw1XDExN1wxXDU2XDM2XDExN1wxXDQ2XDFcMTIzXDFcMTI0XDJcNDZcMVw1NiIrCi0gICAgIlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMjVcMVwxMjZcMlw0NiIrCi0gICAgIlwxXDEyN1wxMVw0NlwxXDEyNlwxXDEyNVwxMVw0NlwxXDQ3XDFcMTI0XDJcNDYiKwotICAgICJcMVw1Nlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDRcNDZcMVwxMzBcMzJcNDYiKwotICAgICJcMVw0N1wxXDEyNFwyXDQ2XDFcNTZcMlw0NlwxXDEzMVwzXDQ2XDFcNTYiKwotICAgICJcNVw0NlwxXDU2XDRcMTMxXDFcMTMwXDEzXDEzMVwxXDQ2XDVcMTMxXDFcNDYiKwotICAgICJcMlwxMzFcMVw0NlwzXDEzMVwyXDQ2XDFcNDdcMVwxMjRcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNFw0NlwxXDEzMFw3XDQ2XDFcMTMyIisKLSAgICAiXDVcNDZcMVwxMzNcMTNcNDZcMVwxMzRcMVw0N1wxXDEyNFwxXDEzNVwxXDEzNCIrCi0gICAgIlwxXDU2XDNcMTM0XDFcMTM2XDFcMTM0XDFcMTM3XDFcNTZcNVwxMzRcMVw1NiIrCi0gICAgIlw0XDEzNFwxXDE0MFwzMVwxMzRcMVwxNDFcMVw0N1wxXDEyNFwxXDE0MlwxXDE0MSIrCi0gICAgIlwxXDU2XDNcMTQxXDFcMTQzXDFcMTQxXDFcMTQ0XDFcNTZcNVwxNDFcMVw1NiIrCi0gICAgIlw0XDE0MVwxXDE0NVwzMVwxNDFcMVwxNDZcMVw0N1wxXDEyNFwxXDE0N1wxXDE0NiIrCi0gICAgIlwxXDU2XDNcMTQ2XDFcMTUwXDFcMTQ2XDFcMTUxXDFcNTZcNVwxNDZcMVw1NiIrCi0gICAgIlwzNlwxNDZcMVwxNTJcMVwxNTNcMVwxNTRcNTZcMTUyXDFcMTU1XDFcNDdcMVwxMjQiKwotICAgICJcMVwxNTZcMVwxNTVcMVw1NlwzXDE1NVwxXDE1N1wxXDE1NVwxXDE2MFwxXDU2IisKLSAgICAiXDVcMTU1XDFcNTZcMzZcMTU1XDFcMTYxXDFcMTYyXDFcMTYzXDU2XDE2MVwxXDE2NCIrCi0gICAgIlwxXDE2NVw1N1wxNjRcMVw0MFwxXDBcMTBcNDBcMVwwXDRcNDBcMVwwIisKLSAgICAiXDQxXDQwXDNcMFwxXDE2NlwxXDE2N1wxNFwwXDFcMTcwXDQ0XDBcMVwxNzEiKwotICAgICJcMlwwXDFcMTcyXDNcMFwxXDE3MVw1XDBcMVwxNzFcNFwxNzJcMVwwIisKLSAgICAiXDEzXDE3MlwxXDBcNVwxNzJcMVwxNzNcMlwxNzJcMVwwXDNcMTcyXDZcMCIrCi0gICAgIlwxXDE3MVwyXDBcMVwxNzRcM1wwXDFcMTcxXDVcMFwxXDE3MVw0XDE3NCIrCi0gICAgIlwxXDBcMTNcMTc0XDFcMFw1XDE3NFwxXDBcMlwxNzRcMVwwXDNcMTc0IisKLSAgICAiXDEwM1wwXDFcMTc1XDU3XDBcMVwxNzZcNDdcMFwxXDE3N1w1M1wwXDFcMjAwIisKLSAgICAiXDYzXDBcMVw1Nlw2XDBcMVw1Nlw1XDBcMVw1Nlw0NFwwXDNcNTciKwotICAgICJcNFwwXDFcNTdcNVwwXDRcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAxXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAyXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDVcMFwxXDYyXDZcMFwxXDYyIisKLSAgICAiXDVcMFwxXDYyXDQwXDBcMVwyMDNcNjBcMFwxXDIwNFw2NFwwXDNcNjciKwotICAgICJcNFwwXDFcNjdcNVwwXDRcNjdcMVwwXDEzXDY3XDFcMFw1XDY3IisKLSAgICAiXDFcMFwyXDY3XDFcMFw0XDY3XDFcNzFcMlwwXDFcMjA1XDFcNzEiKwotICAgICJcMVwwXDNcNzFcMVwwXDFcNzFcMlwwXDVcNzFcMVwwXDM3XDcxIisKLSAgICAiXDFcMFwxXDIwNFwxXDIwNVwxXDcxXDFcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDJcMFw1XDcxXDFcMFwzNlw3MVwxXDc0XDFcMFwxXDIwNlwxXDIwNyIrCi0gICAgIlwxXDc0XDFcMjA2XDNcNzRcMVwyMTBcMVw3NFwyXDIwNlw1XDc0XDFcMjA2IisKLSAgICAiXDM2XDc0XDFcNzVcMVwwXDFcMjExXDFcMjEyXDFcNzVcMVwyMTFcM1w3NSIrCi0gICAgIlwxXDIxMVwxXDc1XDFcMjEwXDFcMjExXDVcNzVcMVwyMTFcMzZcNzVcMlwwIisKLSAgICAiXDFcNzdcMVwyMTNcNjNcMFwzXDEwMVw0XDBcMVwxMDFcNVwwXDRcMTAxIisKLSAgICAiXDFcMFwxM1wxMDFcMVwwXDVcMTAxXDFcMFwyXDEwMVwxXDBcNFwxMDEiKwotICAgICJcMVwxMDNcMlwwXDFcMjE0XDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMlwwXDVcMTAzXDFcMFwzN1wxMDNcMVwwXDFcNzdcMVwyMTVcMVwxMDMiKwotICAgICJcMVwwXDNcMTAzXDFcMFwxXDEwM1wyXDBcNVwxMDNcMVwwXDM2XDEwMyIrCi0gICAgIlwxXDEwNVwxXDBcMVwyMTZcMVwyMTdcMVwxMDVcMVwyMTZcM1wxMDVcMVwyMjAiKwotICAgICJcMVwxMDVcMlwyMTZcNVwxMDVcMVwyMTZcMzZcMTA1XDFcMTA2XDFcMFwxXDIyMSIrCi0gICAgIlwxXDIyMlwxXDEwNlwxXDIyMVwzXDEwNlwxXDIyMVwxXDEwNlwxXDIyMFwxXDIyMSIrCi0gICAgIlw1XDEwNlwxXDIyMVwzNlwxMDZcMVwxMDdcM1wwXDE3XDEwN1w0XDBcMVwxMDciKwotICAgICJcMTNcMFwxXDEwN1w1XDBcMVwxMDdcMlwwXDFcMTA3XDNcMFwxXDEwNyIrCi0gICAgIlwzXDBcMVwxNjZcMTVcMFwxXDE3MFw0MVwwXDFcMjIzXDU2XDBcMVwxMDciKwotICAgICJcM1wwXDJcMTA3XDNcMTEzXDRcMTA3XDFcMTEzXDVcMTA3XDRcMTE0XDFcMTA3IisKLSAgICAiXDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwN1wzXDExNFwxXDExMyIrCi0gICAgIlw2XDBcM1wxMTRcNFwwXDFcMTE0XDVcMFw0XDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFw1XDExNFwxXDBcMlwxMTRcMVwwXDRcMTE0XDZcMFwzXDExNSIrCi0gICAgIlw0XDBcMVwxMTVcNVwwXDRcMTE1XDFcMFwxM1wxMTVcMVwwXDVcMTE1IisKLSAgICAiXDFcMFwyXDExNVwxXDBcNFwxMTVcMVwxMTdcMlwwXDFcMjI0XDFcMTE3IisKLSAgICAiXDFcMFwzXDExN1wxXDBcMVwxMTdcMlwwXDVcMTE3XDFcMFwzN1wxMTciKwotICAgICJcMVwwXDFcMjIzXDFcMjI0XDFcMTE3XDFcMFwzXDExN1wxXDBcMVwxMTciKwotICAgICJcMlwwXDVcMTE3XDFcMFwzNlwxMTdcMVwxMjFcMVwwXDFcMjI1XDFcMjI2IisKLSAgICAiXDFcMTIxXDFcMjI1XDNcMTIxXDFcMjI3XDFcMTIxXDJcMjI1XDVcMTIxXDFcMjI1IisKLSAgICAiXDM2XDEyMVwxXDEyMlwxXDBcMVwyMzBcMVwyMzFcMVwxMjJcMVwyMzBcM1wxMjIiKwotICAgICJcMVwyMzBcMVwxMjJcMVwyMjdcMVwyMzBcNVwxMjJcMVwyMzBcMzZcMTIyXDNcMCIrCi0gICAgIlwxXDE2NlwxNVwwXDFcMjMyXDEwMFwwXDFcMjMzXDUyXDBcMVwyMzRcMTJcMCIrCi0gICAgIlwxXDIzNFw0MFwwXDFcMjM1XDMyXDBcMjBcMjM2XDFcMjM3XDQwXDIzNlw2XDAiKwotICAgICJcM1wxMzFcNFwwXDFcMTMxXDVcMFw0XDEzMVwxXDBcMTNcMTMxXDFcMCIrCi0gICAgIlw1XDEzMVwxXDBcMlwxMzFcMVwwXDRcMTMxXDQ0XDBcMVwyNDBcNjdcMCIrCi0gICAgIlwxXDI0MVw1XDBcMVwxMzRcMlwwXDFcMjQyXDFcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcMlwwXDVcMTM0XDFcMFwzNlwxMzRcMVwxMzZcMVwwIisKLSAgICAiXDFcMjQzXDFcMjQ0XDFcMTM2XDFcMjQzXDNcMTM2XDFcMjQ1XDFcMTM2XDJcMjQzIisKLSAgICAiXDVcMTM2XDFcMjQzXDM2XDEzNlwxXDI0NlwxXDBcMVwyNDdcMVwyNTBcMVwyNTEiKwotICAgICJcMVwyNDdcM1wyNTFcMVwyNDdcMVwyNDZcMVwyNTJcMVwyNTNcM1wyNTFcMVwyNDYiKwotICAgICJcMVwyNTFcMVwyNTNcNFwyNTFcMVwyNDZcMjdcMjUxXDJcMjQ2XDFcMTQwXDJcMjM2IisKLSAgICAiXDFcMjU0XDFcMTQwXDFcMjM2XDNcMTQwXDFcMjM2XDFcMTQwXDJcMjM2XDNcMTQwIisKLSAgICAiXDFcMjU1XDFcMTQwXDFcMjM2XDM2XDE0MFwxXDE0MVwyXDBcMVwyNTZcMVwxNDEiKwotICAgICJcMVwwXDNcMTQxXDFcMFwxXDE0MVwyXDBcNVwxNDFcMVwwXDM2XDE0MSIrCi0gICAgIlwxXDE0M1wyXDI1N1wxXDI2MFwxXDE0M1wxXDI1N1wzXDE0M1wxXDI2MVwxXDE0MyIrCi0gICAgIlwyXDI1N1w1XDE0M1wxXDI1N1wzNlwxNDNcMVwxNDRcMlwyNjJcMVwyNjNcMVwxNDQiKwotICAgICJcMVwyNjJcM1wxNDRcMVwyNjJcMVwxNDRcMVwyNjFcMVwyNjJcNVwxNDRcMVwyNjIiKwotICAgICJcMzZcMTQ0XDFcMTQ1XDJcMjM2XDFcMjY0XDFcMTQ1XDFcMjM2XDNcMTQ1XDFcMjM2IisKLSAgICAiXDFcMTQ1XDJcMjM2XDNcMTQ1XDFcMjY1XDFcMTQ1XDFcMjM2XDM2XDE0NVwxXDE0NiIrCi0gICAgIlwyXDBcMVwyNjZcMVwxNDZcMVwwXDNcMTQ2XDFcMFwxXDE0NlwyXDAiKwotICAgICJcNVwxNDZcMVwwXDM2XDE0NlwxXDE1MFwxXDBcMVwyNjdcMVwyNzBcMVwxNTAiKwotICAgICJcMVwyNjdcM1wxNTBcMVwyNzFcMVwxNTBcMlwyNjdcNVwxNTBcMVwyNjdcMzZcMTUwIisKLSAgICAiXDFcMjcyXDFcMFwxXDI3M1wxXDI3NFwxXDI3NVwxXDI3M1wzXDI3NVwxXDI3MyIrCi0gICAgIlwxXDI3MlwxXDI3NlwxXDI3N1wzXDI3NVwxXDI3MlwxXDI3NVwxXDI3N1w0XDI3NSIrCi0gICAgIlwxXDI3MlwyN1wyNzVcMlwyNzJcMlwxNTJcMVwwXDYwXDE1MlwxXDBcMTZcMTUyIisKLSAgICAiXDFcMzAwXDM3XDE1MlwxXDE1NVwyXDBcMVwzMDFcMVwxNTVcMVwwXDNcMTU1IisKLSAgICAiXDFcMFwxXDE1NVwyXDBcNVwxNTVcMVwwXDM2XDE1NVwxXDE1N1wxXDAiKwotICAgICJcMVwzMDJcMVwzMDNcMVwxNTdcMVwzMDJcM1wxNTdcMVwzMDRcMVwxNTdcMlwzMDIiKwotICAgICJcNVwxNTdcMVwzMDJcMzZcMTU3XDFcMzA1XDFcMFwxXDMwNlwxXDMwN1wxXDMxMCIrCi0gICAgIlwxXDMwNlwzXDMxMFwxXDMwNlwxXDMwNVwxXDMxMVwxXDMxMlwzXDMxMFwxXDMwNSIrCi0gICAgIlwxXDMxMFwxXDMxMlw0XDMxMFwxXDMwNVwyN1wzMTBcMlwzMDVcMlwxNjFcMVwwIisKLSAgICAiXDYwXDE2MVwxXDBcMTZcMTYxXDFcMzEzXDM3XDE2MVw3XDBcMVwzMTRcMTdcMCIrCi0gICAgIlwxXDMxNVwzNlwwXDFcMTcxXDJcMFwxXDQwXDNcMFwxXDE3MVw1XDAiKwotICAgICJcMVwxNzFcNFw0MFwxXDBcMTNcNDBcMVwwXDVcNDBcMVwwXDJcNDAiKwotICAgICJcMVwwXDNcNDBcMVwwXDFcMzE2XDFcMFwzXDMxNlwxXDMxN1wzXDE3MiIrCi0gICAgIlwxXDMxNlwxXDBcMVwzMTZcMVwzMTdcMVwxNzJcMVwzMTZcMVwwXDJcMzE2IisKLSAgICAiXDFcMzE3XDRcMTcyXDFcMzE2XDEzXDE3MlwxXDMxNlw1XDE3MlwxXDMxNlwyXDE3MiIrCi0gICAgIlwxXDMyMFw0XDE3MlwxNVwwXDFcMzIxXDZcMFwxXDMyMlwzNFwwXDFcMzE2IisKLSAgICAiXDFcMFwzXDMxNlwxXDMxN1wzXDE3NFwxXDMxNlwxXDBcMVwzMTZcMVwzMTciKwotICAgICJcMVwxNzRcMVwzMTZcMVwwXDJcMzE2XDFcMzE3XDRcMTc0XDFcMzE2XDEzXDE3NCIrCi0gICAgIlwxXDMxNlw1XDE3NFwxXDMxNlwyXDE3NFwxXDMyM1w0XDE3NFwyN1wwXDFcMzE1IisKLSAgICAiXDMzXDBcMVwzMjRcNjBcMFwxXDMyNVw2NFwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDNcNTdcMVwzMjZcMVwwXDEzXDU3XDFcMFw1XDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw0XDU3XDFcMFwxM1w1N1wxXDBcMVw1N1wxXDMyN1wzXDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDFcMjA2XDFcMFw3XDIwNlwxXDIxMFw0N1wyMDYiKwotICAgICJcMVwyMTFcMVwwXDExXDIxMVwxXDIxMFw0NVwyMTFcMVwyMTZcMVwwXDdcMjE2IisKLSAgICAiXDFcMjIwXDQ3XDIxNlwxXDIyMVwxXDBcMTFcMjIxXDFcMjIwXDQ1XDIyMVwxXDIyNSIrCi0gICAgIlwxXDBcN1wyMjVcMVwyMjdcNDdcMjI1XDFcMjMwXDFcMFwxMVwyMzBcMVwyMjciKwotICAgICJcNDVcMjMwXDMwXDBcMVwzMzBcMjVcMFwxXDMzMFwzNVwwXDFcMzMxXDEyXDAiKwotICAgICJcMVwzMzFcNDdcMFwxXDMzMlw2MlwwXDFcMzMzXDc2XDBcMVwzMzRcM1wwIisKLSAgICAiXDFcMjQzXDFcMFw3XDI0M1wxXDI0NVw0N1wyNDNcMVwyNDZcMVwwXDFcMjQ3IisKLSAgICAiXDFcMzM1XDFcMjQ2XDFcMjQ3XDNcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjQ1XDFcMjQ3IisKLSAgICAiXDVcMjQ2XDFcMjQ3XDM2XDI0NlwxXDI0N1wxXDBcMTFcMjQ3XDFcMjQ1XDQ1XDI0NyIrCi0gICAgIlwxXDI0NlwxXDBcMVwyNDdcMVwzMzVcMVwyNDZcMVwyNDdcM1wyNDZcMVwyNDciKwotICAgICJcMVwyNDZcMVwzMzZcMVwyNDdcNVwyNDZcMVwyNDdcMzZcMjQ2XDEzXDBcMVwzMzciKwotICAgICJcNDVcMFwxXDI0N1wxXDBcMTFcMjQ3XDFcMzM2XDQ1XDI0N1wxMVwyNTdcMVwyNjEiKwotICAgICJcNDdcMjU3XDEzXDI2MlwxXDI2MVw0NVwyNjJcMVwyNjdcMVwwXDdcMjY3XDFcMjcxIisKLSAgICAiXDQ3XDI2N1wxXDI3MlwxXDBcMVwyNzNcMVwzNDBcMVwyNzJcMVwyNzNcM1wyNzIiKwotICAgICJcMVwyNzNcMVwyNzJcMVwyNzFcMVwyNzNcNVwyNzJcMVwyNzNcMzZcMjcyXDFcMjczIisKLSAgICAiXDFcMFwxMVwyNzNcMVwyNzFcNDVcMjczXDFcMjcyXDFcMFwxXDI3M1wxXDM0MCIrCi0gICAgIlwxXDI3MlwxXDI3M1wzXDI3MlwxXDI3M1wxXDI3MlwxXDM0MVwxXDI3M1w1XDI3MiIrCi0gICAgIlwxXDI3M1wzNlwyNzJcMTNcMFwxXDM0Mlw0NVwwXDFcMjczXDFcMFwxMVwyNzMiKwotICAgICJcMVwzNDFcNDVcMjczXDJcMTUyXDFcMFwyNFwxNTJcMVwzNDNcMzFcMTUyXDFcMzAyIisKLSAgICAiXDFcMFw3XDMwMlwxXDMwNFw0N1wzMDJcMVwzMDVcMVwwXDFcMzA2XDFcMzQ0IisKLSAgICAiXDFcMzA1XDFcMzA2XDNcMzA1XDFcMzA2XDFcMzA1XDFcMzA0XDFcMzA2XDVcMzA1IisKLSAgICAiXDFcMzA2XDM2XDMwNVwxXDMwNlwxXDBcMTFcMzA2XDFcMzA0XDQ1XDMwNlwxXDMwNSIrCi0gICAgIlwxXDBcMVwzMDZcMVwzNDRcMVwzMDVcMVwzMDZcM1wzMDVcMVwzMDZcMVwzMDUiKwotICAgICJcMVwzNDVcMVwzMDZcNVwzMDVcMVwzMDZcMzZcMzA1XDEzXDBcMVwzNDZcNDVcMCIrCi0gICAgIlwxXDMwNlwxXDBcMTFcMzA2XDFcMzQ1XDQ1XDMwNlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcMzQ3XDMxXDE2MVw3XDBcMVwzNTBcMTAxXDBcMVwzNTFcMzBcMFwxXDMxNiIrCi0gICAgIlwxXDBcMTBcMzE2XDFcMFw0XDMxNlwxXDBcMzRcMzE2XDFcMFw1XDMxNiIrCi0gICAgIlwxXDBcM1wzMTZcMVwzMTdcNFwzMTZcMVwwXDFcMzE2XDFcMzE3XDJcMzE2IisKLSAgICAiXDFcMFwyXDMxNlwxXDMxN1wzMVwzMTZcMVwzNTJcNFwzMTZcMTVcMFwxXDMyMSIrCi0gICAgIlwzNlwwXDFcMzUzXDIxXDBcMVwzNTRcMTJcMFwzXDM1NFwyXDBcMVwzNTQiKwotICAgICJcMTFcMFwyXDM1NFwxXDBcMVwzNTRcMlwwXDJcMzU0XDEwXDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNFw1N1wxXDBcMTFcNTdcMVwzNTVcMVw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzM1wwXDFcMzU2IisKLSAgICAiXDEyXDBcMVwzNTZcNDBcMFwxXDM1N1w1N1wwXDFcMzYwXDY2XDBcMVwzNjEiKwotICAgICJcMTJcMFwxXDM2MVw0MFwwXDFcMzYyXDM1XDBcMlwzNjNcMVwwXDNcMzYzIisKLSAgICAiXDJcMFwxXDI1Mlw0XDM2M1wxXDBcNlwzNjNcMVwwXDI3XDM2M1w1XDAiKwotICAgICJcMlwzNjRcMVwwXDNcMzY0XDJcMFwxXDI3Nlw0XDM2NFwxXDBcNlwzNjQiKwotICAgICJcMVwwXDI3XDM2NFwyXDBcMlwxNTJcMVwwXDI1XDE1MlwxXDM2NVwzMFwxNTIiKwotICAgICJcM1wwXDJcMzY2XDFcMFwzXDM2NlwyXDBcMVwzMTFcNFwzNjZcMVwwIisKLSAgICAiXDZcMzY2XDFcMFwyN1wzNjZcMlwwXDJcMTYxXDFcMFwyNVwxNjFcMVwzNjciKwotICAgICJcMzBcMTYxXDMxXDBcMVwzNzBcMTAzXDBcMVwzNTJcMjFcMFwxXDM1NFwxMlwwIisKLSAgICAiXDNcMzU0XDJcMFwxXDM1NFwxMVwwXDJcMzU0XDFcMFwxXDM1NFwxXDAiKwotICAgICJcMVwzNTNcMlwzNTRcMTBcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3IisKLSAgICAiXDFcMFw2XDU3XDFcMzcxXDRcNTdcMVwwXDVcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDRcNTdcNDRcMFwxXDM3Mlw1NFwwXDFcMzczXDU1XDBcMVwzNzQiKwotICAgICJcNjBcMFwxXDM3NVw2M1wwXDFcMzc2XDIwXDBcMlwxNTJcMVwwXDI2XDE1MiIrCi0gICAgIlwxXDM3N1wyN1wxNTJcMlwxNjFcMVwwXDI2XDE2MVwxXHUwMTAwXDI3XDE2MVwzMlwwIisKLSAgICAiXDFcdTAxMDFcMzRcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcdTAxMDJcN1w1N1wxXDBcMlw1N1wxXHUwMTAyXDJcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDRcNTdcNDVcMFwxXHUwMTAzXDUyXDBcMVx1MDEwNFw2M1wwIisKLSAgICAiXDFcdTAxMDVcNDNcMFwxXHUwMTA2XDYzXDBcMVx1MDEwN1wyNVwwXDFcdTAxMDdcMlwwIisKLSAgICAiXDJcMTUyXDFcMFwyN1wxNTJcMVx1MDEwOFwyNlwxNTJcMlwxNjFcMVwwXDI3XDE2MSIrCi0gICAgIlwxXHUwMTA5XDI2XDE2MVwzM1wwXDFcdTAxMGFcMzJcMFwxXHUwMTBiXDNcNTdcM1wwIisKLSAgICAiXDFcdTAxMGJcMVw1N1w0XDBcMVx1MDEwYlw0XDU3XDFcMFwxM1w1N1wxXDAiKwotICAgICJcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzNVwwXDFcdTAxMGNcNTZcMCIrCi0gICAgIlwxXHUwMTBkXDEyXDBcMVx1MDEwZFw0NVwwXDFcdTAxMGVcMTJcMFwxXHUwMTBlXDEyXDAiKwotICAgICJcMlwxNTJcMVwwXDMwXDE1MlwxXHUwMTBmXDI1XDE1MlwyXDE2MVwxXDBcMzBcMTYxIisKLSAgICAiXDFcdTAxMTBcMjVcMTYxXDMyXDBcMVx1MDExMVwzM1wwXDFcdTAxMGJcNlwwXDFcdTAxMGIiKwotICAgICJcNVwwXDFcdTAxMGJcMzZcMFwyXDE1MlwxXDBcMjdcMTUyXDFcdTAxMTJcMjZcMTUyIisKLSAgICAiXDJcMTYxXDFcMFwyN1wxNjFcMVx1MDExM1wyNlwxNjFcMjdcMFwxXHUwMTE0XDMxXDAiKwotICAgICJcMlwxNTJcMVwwXDI0XDE1MlwxXHUwMTE1XDMxXDE1MlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcdTAxMTZcMzFcMTYxIjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAKLSAgICAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDksIAotICAgICAwLCAgMCwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgOSwgIDEsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JeXlfc3RhcnRSZWFkID0gMDsKLQotCS8qKiAKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgKiBmcm9tIGlucHV0IAotCSAqLwotCXl5X2VuZFJlYWQgPSAwOwotCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXlsaW5lID0gMDsKLQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5Y2hhciA9IDA7Ci0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JeXlfYXRFT0YgPSBmYWxzZTsKLQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCS8qIHVzZXIgdmFyczogKi8KLQlmVG9rZW5Db3VudCA9IDA7Ci0gCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQljb250ZXh0ID0gbnVsbDsKLQlzdGFydCA9IDA7Ci0JdGV4dExlbmd0aCA9IDA7Ci0JbGVuZ3RoID0gMDsKLX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotLyogdXNlciBtZXRob2QgKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzkyMTJdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDMyMjApIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzcyKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjc1OiAKLSAgICAgICAgY2FzZSAyNzY6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjgwOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyODE6IGJyZWFrOwotICAgICAgICBjYXNlIDI2NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSAyODM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgMjg0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTc6IAotICAgICAgICBjYXNlIDI2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAyODU6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjg4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSAyOTM6IGJyZWFrOwotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzAyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICAgIHsgCi0JLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgMzA0OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMDU6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgIGNhc2UgMjQ4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSAzMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzExOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgIGNhc2UgMjI2OiAKLSAgICAgICAgY2FzZSAyNDQ6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjYzOiAKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICBjYXNlIDI3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzEyOiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjMwOiAKLSAgICAgICAgY2FzZSAyNDY6IAotICAgICAgICBjYXNlIDI1NTogCi0gICAgICAgIGNhc2UgMjY0OiAKLSAgICAgICAgY2FzZSAyNzE6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzE0OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgMzE1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JU3RyaW5nIGJsb2NrQ29udGV4dCA9IGRvQmxvY2tTY2FuKCJdXT4iLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIGJsb2NrQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgMzE2OiBicmVhazsKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE3OiBicmVhazsKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzE4OiBicmVhazsKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzIzOiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICBjYXNlIDE2OTogCi0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDMyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgIGNhc2UgMjAwOiAKLSAgICAgICAgY2FzZSAyMjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDMzNDogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzZGFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qbmxzWFhYKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0Ow0KLQ0KLSUlDQotDQotJXsNCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOw0KLSANCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZw0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotDQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBzdGFydCA9IDA7DQotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOw0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOw0KLQ0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MNCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7DQotCQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkDQotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotDQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2Vycw0KLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZw0KLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOw0KLQ0KLQlwcml2YXRlIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpDQotCQlyZXR1cm47DQotCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCANCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgew0KLQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7DQotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQ0KLQkJCQlibG9ja3MucmVtb3ZlKCk7DQotCQl9DQotCX0NCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsNCi0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7DQotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7DQotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7DQotCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgew0KLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpDQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7DQotCX0NCi0JcmV0dXJuIEJMT0NLX1RFWFQ7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgew0KLQlyZXR1cm4gZkJsb2NrTWFya2VyczsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7DQotfQ0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgew0KLQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgew0KLQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkNCi0JCXJldHVybiBmYWxzZTsNCi0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgew0KLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlDQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuDQotICoNCi0gKiBFeGFtcGxlOiANCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7DQotICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsNCi0gKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7DQotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOw0KLSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgDQotICoNCi0gKiBSZXR1cm5zOg0KLSAqCUJMT0NLX1RFWFQ6IDAtNDANCi0gKglYTUxfRU5EX1RBR19PUEVOOiA0MS00Mg0KLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgNCi0gKglYTUxfVEFHX0NMT1NFOiA0OS00OQ0KLSAqCVhNTF9DT05URU5UOiA1MC01Nw0KLSAqDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsNCi0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7DQotfQ0KLS8qKg0KLSAqIE1ldGhvZCBkb1NjYW4uDQotICogDQotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3INCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZw0KLSAqIA0KLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSINCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+Jw0KLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aA0KLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkNCi0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzDQotICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAqLw0KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOw0KLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsNCi0JaW50IG4gPSAwOw0KLQljaGFyIGxhc3RDaGVja0NoYXI7DQotCWludCBpOw0KLQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7DQotCQluID0gMDsNCi0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuDQotCQluID0geXlfYWR2YW5jZSgpOw0KLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5Lg0KLQkJaWYgKG4gPT0gWVlFT0YpIHsNCi0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJc2FtZSA9IHRydWU7DQotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQNCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXINCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMNCi0JCQkNCi0JCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzICh5eV9jdXJyZW50UG9zIGlzIHRoZSAqbGFzdCogY2hhcmFjdGVyIHdlIGNhbiBjaGVjayBhZ2FpbnN0KQ0KLQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgew0KLQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsNCi0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQ0KLQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdw0KLQkJCWVsc2Ugew0KLQkJCQlzYW1lID0gZmFsc2U7DQotCQkJfQ0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaA0KLQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOw0KLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIg0KLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7DQotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7DQotCQl9DQotCX0NCi0JZWxzZSB7DQotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQNCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQl5eV9jdXJyZW50UG9zKys7DQotCX0NCi0JeXliZWdpbihleGl0U3RhdGUpOw0KLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5DQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIEEgZ2VuZXJpYyBsb29rYWhlYWQtbGlrZSBvcGVyYXRpb24NCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrU2NhbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0Q29udGV4dCwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCXJldHVybiBkb1NjYW4odGFyZ2V0LCBmYWxzZSwgdGFyZ2V0Q29udGV4dCwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsNCi0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZA0KLSAqDQotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUNCi0gKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuDQotICoNCi0gKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5DQotICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4NCi0gKg0KLSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkDQotICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuDQotICovDQotcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsNCi0JCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCX0NCi0JZWxzZSB7DQotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkNCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7DQotCQkJZWxzZQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQl9DQotCQlzdGFydCA9IHl5Y2hhcjsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJaWYgKHl5X2F0RU9GKSB7DQotCQkJZlRva2VuQ291bnQrKzsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCWlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJZWxzZQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCX0NCi0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsNCi0JfQ0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCX0NCi0JZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgew0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JfQ0KLQlpZiAoY29udGV4dCA9PSBudWxsKSB7DQotCQkvLyBFT0YNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCWZUb2tlbkNvdW50Kys7DQotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsNCi0Jc3VwZXIoKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgWE1MVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpew0KLQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7DQotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7DQotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsNCi0JcmVzZXQoaW4sIDApOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCAqDQotICoNCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMNCi0gKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLg0KLSAqDQotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUNCi0gKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzDQotICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZk9mZnNldCA9IG5ld09mZnNldDsNCi0NCi0JLyogdGhlIGlucHV0IGRldmljZSAqLw0KLQl5eV9yZWFkZXIgPSBpbjsNCi0NCi0JLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQl5eV9zdGF0ZSA9IDA7DQotDQotCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0JLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCXl5X21hcmtlZFBvcyA9IDA7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0JLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQ0KLQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JeXlfc3RhcnRSZWFkID0gMDsNCi0NCi0JLyoqIA0KLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JICogZnJvbSBpbnB1dCANCi0JICovDQotCXl5X2VuZFJlYWQgPSAwOw0KLQ0KLQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JeXlsaW5lID0gMDsNCi0NCi0JLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCXl5Y2hhciA9IDA7DQotDQotCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JeXlfYXRFT0YgPSBmYWxzZTsNCi0NCi0JLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotCXl5X2VvZl9kb25lID0gZmFsc2U7DQotDQotDQotCS8qIHVzZXIgdmFyczogKi8NCi0JZlRva2VuQ291bnQgPSAwOw0KLSANCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQ0KLQljb250ZXh0ID0gbnVsbDsNCi0Jc3RhcnQgPSAwOw0KLQl0ZXh0TGVuZ3RoID0gMDsNCi0JbGVuZ3RoID0gMDsNCi19DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKi8NCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgew0KLQkJWE1MVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IFhNTFRva2VuaXplcigpOw0KLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCANCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQ0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsNCi0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7DQotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkNCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOw0KLQl9DQotLyogdXNlciBtZXRob2QgKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dA0KLQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsNCi19DQotJX0NCi0NCi0lZW9mew0KLS8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iDQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIFhNTFRva2VuaXplcg0KLSVpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0DQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSVsaW5lDQotJXVuaWNvZGUNCi0lcGFjaw0KLQ0KLSVzdGF0ZSBTVF9DREFUQV9URVhUDQotJXN0YXRlIFNUX0NEQVRBX0VORA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVF9FTkQNCi0lc3RhdGUgU1RfUEkNCi0lc3RhdGUgU1RfUElfV1MNCi0lc3RhdGUgU1RfUElfQ09OVEVOVA0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX1BJX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1hNTF9QSV9UQUdfQ0xPU0UNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfREhUTUxfRVFVQUxTDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9ESFRNTF9UQUdfQ0xPU0UNCi0NCi0vLyBub3JtYWwgdGFnIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfVEFHX05BTUUNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRQ0KLQ0KLS8vIGRlY2xhcmF0aW9uIChEVEQpIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFDQotDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQw0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0NCi0NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX0JMT0NLX1RBR19TQ0FODQotDQotLy8gTGV0dGVyID0gKFtBLVphLXpdKQ0KLS8vIERpZ2l0ID0gKFswLTldKQ0KLQ0KLS8qKg0KLSAqIHNtYWxsZXIgdG9rZW5zDQotICovDQotZ2VuZXJpY1RhZ09wZW4gICAgICAgPSA8DQotZ2VuZXJpY1RhZ0Nsb3NlICAgICAgPSA+DQotZ2VuZXJpY0VuZFRhZ09wZW4gICAgPSA8XC8NCi1nZW5lcmljRW1wdHlUYWdDbG9zZSA9IFwvPg0KLQ0KLVBJc3RhcnQgPSA8XD8NCi1QSWVuZCAgID0gXD8+DQotDQotDQotLy8gWzFdIGRvY3VtZW50IDo6PSBwcm9sb2cgZWxlbWVudCBNaXNjKg0KLWRvY3VtZW50ID0gKHtwcm9sb2d9IHtlbGVtZW50fSB7TWlzY30qKQ0KLQ0KLS8vIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdDQotIC8vQ2hhciA9ICguKQ0KLUNoYXIgPSBbXHgwOVx4MEFceDBEXHgyMC1cdUQ3RkZcdUUwMDAtXHVGRkZEXSANCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0rDQotDQotLy8gWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcg0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IFwuIHwgXC0gfCBfIHwgOiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0pDQotDQotLy8gWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIE5hbWVDaGFyKg0KLS8vTmFtZSA9ICh7TmFtZUNoYXJ9e05hbWVDaGFyfSopDQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6KXtOYW1lQ2hhcn0qDQotDQotLy8gWzZdIE5hbWVzIDo6PSB7TmFtZX0gKHtTfSB7TmFtZX0pKg0KLU5hbWVzID0gKHtOYW1lfSAoe1N9IHtOYW1lfSkqKQ0KLQ0KLS8vIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKw0KLU5tdG9rZW4gPSAoe05hbWVDaGFyfSspDQotDQotLy8gWzhdIE5tdG9rZW5zIDo6PSBObXRva2VuIChTIE5tdG9rZW4pKg0KLU5tdG9rZW5zID0gKHtObXRva2VufSAoe1N9IHtObXRva2VufSkqKQ0KLQ0KLS8vIFs5XSBFbnRpdHlWYWx1ZSA6Oj0gJyInIChbXiUmIl0gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciDQotRW50aXR5VmFsdWUgPSAoXCIgKFteJSZcIl0gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcIiB8ICBcJyAoW14lJlwnXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwnKQ0KLQ0KLS8vIFsxMF0gQXR0VmFsdWUgOjo9ICciJyAoW148JiJdIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciDQotQXR0VmFsdWUgPSAoIFwiIChbXjxcIl0gfCB7UmVmZXJlbmNlfSkqIFwiIHwgXCcgKFtePFwnXSB8IHtSZWZlcmVuY2V9KSogXCcgIHwgKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkNCi0NCi0vLyBbMTFdIFN5c3RlbUxpdGVyYWwgOjo9ICgnIicgW14iXSogJyInKSB8ICgiJyIgW14nXSogIiciKSANCi1TeXN0ZW1MaXRlcmFsID0gKChcIiBbXlwiXSogXCIpIHwgKFwnIFteXCddKiBcJykpIA0KLQ0KLS8vIFsxMl0gUHViaWRMaXRlcmFsIDo6PSAnIicgUHViaWRDaGFyKiAnIicgfCAiJyIgKFB1YmlkQ2hhciAtICInIikqICInIg0KLVB1YmlkTGl0ZXJhbCA9IChcIiB7UHViaWRDaGFyfSogXCIgfCBcJyAoe1B1YmlkQ2hhcn1cJykqICInIikNCi0NCi0vLyBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwgWy0nKCkrLC4vOj0/OyEqI0AkXyVdDQotUHViaWRDaGFyID0gKFtcMDQwXDAxNVwwMTJdIHwgW2EtekEtWjAtOV0gfCBbXC1cJygpXCssLlwvOj0/OyFcKiNAXCRfJV0pDQotDQotLy8gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DaGFyRGF0YSA9IChbXjwmKFxdXF0+KV0qKQ0KLQ0KLS8vIFsxNV0gQ29tbWVudCA6Oj0gJzwhLS0nICgoQ2hhciAtICctJykgfCAoJy0nIChDaGFyIC0gJy0nKSkpKiAnLS0+Jw0KLUNvbW1lbnRTdGFydCA9ICg8IVwtXC0pDQotQ29tbWVudEVuZCAgID0gKFwtXC0+KQ0KLUNvbW1lbnQgPSAoe0NvbW1lbnRTdGFydH0uKntDb21tZW50RW5kfSkNCi0NCi0vLyBbMTZdIFBJIDo6PSAnPD8nIFBJVGFyZ2V0IChTIChDaGFyKiAtIChDaGFyKiAnPz4nIENoYXIqKSkpPyAnPz4nDQotUEkgPSAoPFw/e1BJVGFyZ2V0fSB7Q2hhcn0qIFw/PikNCi0NCi0vLyBbMTddIFBJVGFyZ2V0IDo6PSBOYW1lIC0gKCgnWCcgfCAneCcpICgnTScgfCAnbScpICgnTCcgfCAnbCcpKQ0KLVBJVGFyZ2V0ID0gKHtOYW1lfSgoWHx4KShNfG0pKEx8bCkpKQ0KLQ0KLS8vIFsxOF0gQ0RTZWN0IDo6PSBDRFN0YXJ0IENEYXRhIENERW5kDQotQ0RTZWN0ID0gKHtDRFN0YXJ0fXtDRGF0YX17Q0RFbmR9KQ0KLQ0KLS8vIFsxOV0gQ0RTdGFydCA6Oj0gJzwhW0NEQVRBWycNCi1DRFN0YXJ0ID0gPCFcW0NEQVRBXFsNCi0NCi0vLyBbMjBdIENEYXRhIDo6PSAoQ2hhciogLSAoQ2hhciogJ11dPicgQ2hhciopKSANCi0vLyBpbXBsZW1lbnQgbG9va2FoZWFkIGJlaGF2aW9yIGR1cmluZyBhY3Rpb24gZGVmaW5pdGlvbg0KLUNEYXRhID0gKFteKFxdXF0+KV0qKQ0KLQ0KLS8vIFsyMV0gQ0RFbmQgOjo9ICddXT4nDQotQ0RFbmQgPSAoXF1cXT4pDQotDQotLy8gWzIyXSBwcm9sb2cgOjo9IFhNTERlY2w/IE1pc2MqIChkb2N0eXBlZGVjbCBNaXNjKik/DQotcHJvbG9nID0gKHtYTUxEZWNsfT8ge01pc2N9KiAoe2RvY3R5cGVkZWNsfSB7TWlzY30qKT8pDQotDQotLy8gWzIzXSBYTUxEZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvIEVuY29kaW5nRGVjbD8gU0REZWNsPyBTPyAnPz4nDQotWE1MRGVjbCA9ICg8XD94bWwge1ZlcnNpb25JbmZvfSB7RW5jb2RpbmdEZWNsfT8ge1NERGVjbH0/IHtTfT8gXD8+KQ0KLQ0KLS8vIFsyNF0gVmVyc2lvbkluZm8gOjo9IFMgJ3ZlcnNpb24nIEVxICgnIFZlcnNpb25OdW0gJyB8ICIgVmVyc2lvbk51bSAiKQ0KLVZlcnNpb25JbmZvID0gKHtTfXZlcnNpb257RXF9KFwne1ZlcnNpb25OdW19XCcgfCBcIntWZXJzaW9uTnVtfVwiKSkNCi0NCi0vLyBbMjVdIEVxIDo6PSBTPyAnPScgUz8NCi1FcSA9IChcPSkNCi0NCi0vLyBbMjZdIFZlcnNpb25OdW0gOjo9IChbYS16QS1aMC05Xy46XSB8ICctJykrDQotVmVyc2lvbk51bSA9ICgoW2EtekEtWjAtOV8uOl18XC0pKykNCi0NCi0vLyBbMjddIE1pc2MgOjo9IENvbW1lbnQgfCBQSSB8ICBTDQotTWlzYyA9ICh7Q29tbWVudH0gfCB7UEl9IHwge1N9KQ0KLQ0KLS8vIFsyOF0gZG9jdHlwZWRlY2wgOjo9ICc8IURPQ1RZUEUnIFMgTmFtZSAoUyBFeHRlcm5hbElEKT8gIFM/ICgnWycgKG1hcmt1cGRlY2wgfCBQRVJlZmVyZW5jZSB8IFMpKiAnXScgUz8pPyAnPicNCi1kb2N0eXBlZGVjbCA9ICg8XCFET0NUWVBFe1N9e05hbWV9ICh7U317RXh0ZXJuYWxJRH0pPyB7U30/IChcWyAoe21hcmt1cGRlY2x9fHtQRVJlZmVyZW5jZX18e1N9KSogXF17U30/KT8+KQ0KLQ0KLS8vIFsyOV0gbWFya3VwZGVjbCA6Oj0gZWxlbWVudGRlY2wgfCBBdHRsaXN0RGVjbCB8IEVudGl0eURlY2wgfCBOb3RhdGlvbkRlY2wgfCBQSSB8IENvbW1lbnQNCi1tYXJrdXBkZWNsID0gKHtlbGVtZW50ZGVjbH0gfCB7QXR0bGlzdERlY2x9IHwge0VudGl0eURlY2x9IHwge05vdGF0aW9uRGVjbH0gfCB7UEl9IHwge0NvbW1lbnR9KQ0KLQ0KLS8vIFszMF0gZXh0U3Vic2V0IDo6PSBUZXh0RGVjbD8gZXh0U3Vic2V0RGVjbA0KLWV4dFN1YnNldCA9ICh7VGV4dERlY2x9PyB7ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzMxXSBleHRTdWJzZXREZWNsIDo6PSAoIG1hcmt1cGRlY2wgfCBjb25kaXRpb25hbFNlY3QgfCBQRVJlZmVyZW5jZSB8IFMgKSoNCi1leHRTdWJzZXREZWNsID0gKCgge21hcmt1cGRlY2x9IHwge2NvbmRpdGlvbmFsU2VjdH0gfCB7UEVSZWZlcmVuY2V9IHwge1N9ICkqKQ0KLQ0KLS8vIFszMl0gIFNERGVjbCAgOjo9IFMgJ3N0YW5kYWxvbmUnIEVxICgoIiciICgneWVzJyB8ICdubycpICInIikgfCAoJyInICgneWVzJyB8ICdubycpICciJykpDQotU0REZWNsICA9ICh7U31zdGFuZGFsb25le0VxfXtTfSooKFwnKHllc3xubylcJyl8KFwiKHllc3xubylcIikpKQ0KLQ0KLS8vIFszM10gIExhbmd1YWdlSUQgIDo6PSBMYW5nY29kZSAoJy0nIFN1YmNvZGUpKg0KLUxhbmd1YWdlSUQgID0gKHtMYW5nY29kZX0oXC17U3ViY29kZX0pKikNCi0NCi0vLyBbMzRdICBMYW5nY29kZSA6Oj0gSVNPNjM5Q29kZSB8ICBJYW5hQ29kZSB8ICBVc2VyQ29kZQ0KLUxhbmdjb2RlID0gKHtJU082MzlDb2RlfSB8ICB7SWFuYUNvZGV9IHwgIHtVc2VyQ29kZX0pDQotDQotLy8gWzM1XSAgSVNPNjM5Q29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pIChbYS16XSB8IFtBLVpdKQ0KLUlTTzYzOUNvZGUgPSAoKFthLXpdfFtBLVpdKShbYS16XXxbQS1aXSkpDQotDQotLy8gWzM2XSAgSWFuYUNvZGUgOjo9ICgnaScgfCAnSScpICctJyAoW2Etel0gfCBbQS1aXSkrDQotSWFuYUNvZGUgPSAoKGl8SSlcLShbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszN10gIFVzZXJDb2RlIDo6PSAoJ3gnIHwgJ1gnKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLVVzZXJDb2RlID0gKCh4fFgpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzhdICBTdWJjb2RlIDo6PSAoW2Etel0gfCBbQS1aXSkrDQotU3ViY29kZSA9ICgoW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzldICBlbGVtZW50ICA6Oj0gRW1wdHlFbGVtVGFnIHwgU1RhZyBjb250ZW50IEVUYWcNCi1lbGVtZW50ICA9ICh7RW1wdHlFbGVtVGFnfSB8IHtTVGFnfSB7Y29udGVudH0ge0VUYWd9KQ0KLQ0KLS8vIFs0MF0gIFNUYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnPicNCi1TVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT8+KQ0KLQ0KLS8vIFs0MV0gIEF0dHJpYnV0ZSA6Oj0gTmFtZSBFcSBBdHRWYWx1ZQ0KLUF0dHJpYnV0ZSA9ICh7TmFtZX17U30qe0VxfXtTfSp7QXR0VmFsdWV9KQ0KLQ0KLS8vIFs0Ml0gIEVUYWcgIDo6PSAnTmFtZSBTPyAnPicNCi1FVGFnID0gKDxcL3tOYW1lfXtTfT8+KQ0KLQ0KLS8vIFs0M10gIGNvbnRlbnQgIDo6PSAoZWxlbWVudCB8IENoYXJEYXRhIHwgUmVmZXJlbmNlIHwgQ0RTZWN0IHwgUEkgfCBDb21tZW50KSoNCi1jb250ZW50ID0gKCh7ZWxlbWVudH0gfCB7Q2hhckRhdGF9IHwge1JlZmVyZW5jZX0gfCB7Q0RTZWN0fSB8IHtQSX0gfCB7Q29tbWVudH0pKikNCi0NCi0vLyBbNDRdICBFbXB0eUVsZW1UYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnLz4nDQotRW1wdHlFbGVtVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT9cLz4pDQotDQotLy8gWzQ1XSBlbGVtZW50ZGVjbCA6Oj0gJzwhRUxFTUVOVCcgUyBOYW1lIFMgY29udGVudHNwZWMgUz8gJz4nDQotZWxlbWVudGRlY2wgPSAoPFwhRUxFTUVOVHtTfXtOYW1lfXtTfXtjb250ZW50c3BlY317U30/PikNCi0NCi0vLyBbNDZdIGNvbnRlbnRzcGVjIDo6PSAnRU1QVFknIHwgJ0FOWScgfCBNaXhlZCB8IGNoaWxkcmVuDQotY29udGVudHNwZWMgPSAoRU1QVFl8QU5ZfHtNaXhlZH18e2NoaWxkcmVufSkNCi0NCi0vLyBbNDddIGNoaWxkcmVuIDo6PSAoY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jaGlsZHJlbiA9ICgoe2Nob2ljZX18e3NlcX0pKFw/fFwqfFwrKT8pDQotDQotLy8gQ0FVU0VTIExPT1AgVEhST1VHSCBERUZTIE9GIENIT0lDRSBBTkQgU0VRDQotLy8gWzQ4XSBjcCA6Oj0gKE5hbWUgfCBjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPw0KLWNwID0gKCh7TmFtZX0gfCB7Y2hvaWNlfSB8IHtzZXF9KSAoXD98XCp8XCspPykNCi0NCi0vLyBbNDldIGNob2ljZSA6Oj0gJygnIFM/IGNwICggUz8gJ3wnIFM/IGNwICkqIFM/ICcpJw0KLS8vIGNob2ljZSA9IFwoe1N9P3tjcH0oe1N9P1x8e1N9P3tjcH0pKntTfT9cKQ0KLWNob2ljZSA9IFwoe1N9P3tOYW1lfSh7U30/XHx7U30/e05hbWV9KSp7U30/XCkNCi0NCi0vLyBbNTBdIHNlcSA6Oj0gJygnIFM/IGNwICggUz8gJywnIFM/IGNwICkqIFM/ICcpJw0KLS8vIHNlcSA9IChcKHtTfT97Y3B9KHtTfT9cLHtTfT97Y3B9KSp7U30/XCkpDQotc2VxID0gKFwoe1N9P3tOYW1lfSh7U30/XCx7U30/e05hbWV9KSp7U30/XCkpDQotDQotLy8gWzUxXSBNaXhlZCA6Oj0gJygnIFM/ICcjUENEQVRBJyAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAgJykqJyB8ICcoJyBTPyAnI1BDREFUQScgUz8gJyknDQotTWl4ZWQgPSAoe1N9P1wjUENEQVRBKHtTfT9cfHtTfT97TmFtZX0pKntTfT8pKlx8KHtTfT9cI1BDREFUQXtTfT8pDQotDQotLy8gWzUyXSBBdHRsaXN0RGVjbCA6Oj0gJzwhQVRUTElTVCcgUyBOYW1lIEF0dERlZiogUz8gJz4nDQotQXR0bGlzdERlY2wgPSAoPFwhQVRUTElTVHtTfXtOYW1lfXtBdHREZWZ9KntTfT8+KQ0KLQ0KLS8vIFs1M10gQXR0RGVmIDo6PSBTIE5hbWUgUyBBdHRUeXBlIFMgRGVmYXVsdERlY2wNCi1BdHREZWYgPSAoe1N9e05hbWV9e1N9e0F0dFR5cGV9e1N9e0RlZmF1bHREZWNsfSkNCi0NCi0vLyBbNTRdIEF0dFR5cGUgOjo9IFN0cmluZ1R5cGUgfCBUb2tlbml6ZWRUeXBlIHwgRW51bWVyYXRlZFR5cGUgDQotQXR0VHlwZSA9ICh7U3RyaW5nVHlwZX0gfCB7VG9rZW5pemVkVHlwZX0gfCB7RW51bWVyYXRlZFR5cGV9KQ0KLQ0KLS8vIFs1NV0gU3RyaW5nVHlwZSA6Oj0gJ0NEQVRBJw0KLVN0cmluZ1R5cGUgPSAoQ0RBVEEpDQotDQotLy8gWzU2XSBUb2tlbml6ZWRUeXBlIDo6PSAnSUQnIHwgJ0lEUkVGJyB8ICdJRFJFRlMnIHwgJ0VOVElUWScgfCAnRU5USVRJRVMnIHwgJ05NVE9LRU4nIHwgJ05NVE9LRU5TJw0KLVRva2VuaXplZFR5cGUgPSAoSUR8SURSRUZ8SURSRUZTfEVOVElUWXxFTlRJVElFU3xOTVRPS0VOfE5NVE9LRU5TKQ0KLQ0KLS8vIFs1N10gRW51bWVyYXRlZFR5cGUgOjo9IE5vdGF0aW9uVHlwZSB8IEVudW1lcmF0aW9uIA0KLUVudW1lcmF0ZWRUeXBlID0gKHtOb3RhdGlvblR5cGV9IHwge0VudW1lcmF0aW9ufSkNCi0NCi0vLyBbNThdIE5vdGF0aW9uVHlwZSA6Oj0gJ05PVEFUSU9OJyBTICcoJyBTPyBOYW1lIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpJyANCi1Ob3RhdGlvblR5cGUgPSAoTk9UQVRJT057U31cKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1OV0gRW51bWVyYXRpb24gOjo9ICcoJyBTPyBObXRva2VuIChTPyAnfCcgUz8gIE5tdG9rZW4pKiBTPyAnKScNCi1FbnVtZXJhdGlvbiA9IChcKHtTfT97Tm10b2tlbn0oe1N9P1x8e1N9P3tObXRva2VufSkqe1N9P1wpKQ0KLQ0KLS8vIFs2MF0gRGVmYXVsdERlY2wgOjo9ICcjUkVRVUlSRUQnIHwgJyNJTVBMSUVEJyB8ICgoJyNGSVhFRCcgUyk/IEF0dFZhbHVlKQ0KLURlZmF1bHREZWNsID0gKFwjUkVRVUlSRUR8XCNJTVBMSUVEfCgoXCNGSVhFRHtTfSk/e0F0dFZhbHVlfSkpDQotDQotLy8gWzYxXSBjb25kaXRpb25hbFNlY3QgOjo9IGluY2x1ZGVTZWN0IHwgaWdub3JlU2VjdCANCi1jb25kaXRpb25hbFNlY3QgPSAoe2luY2x1ZGVTZWN0fSB8IHtpZ25vcmVTZWN0fSkNCi0NCi0vLyBbNjJdIGluY2x1ZGVTZWN0IDo6PSAnPCFbJyBTPyAnSU5DTFVERScgUz8gJ1snIGV4dFN1YnNldERlY2wgJ11dPicgDQotaW5jbHVkZVNlY3QgPSAoPFwhXFt7U30/SU5DTFVERXtTfT9cW3tleHRTdWJzZXREZWNsfVxdXF0+KQ0KLQ0KLS8vIFs2M10gaWdub3JlU2VjdCA6Oj0gJzwhWycgUz8gJ0lHTk9SRScgUz8gJ1snIGlnbm9yZVNlY3RDb250ZW50cyogJ11dPicNCi1pZ25vcmVTZWN0ID0gKDxcIVxbe1N9P0lHTk9SRXtTfT9cW3tpZ25vcmVTZWN0Q29udGVudHN9KlxdXF0+KQ0KLQ0KLS8vIFs2NF0gaWdub3JlU2VjdENvbnRlbnRzIDo6PSBJZ25vcmUgKCc8IVsnIGlnbm9yZVNlY3RDb250ZW50cyAnXV0+JyBJZ25vcmUpKg0KLWlnbm9yZVNlY3RDb250ZW50cyA9ICh7SWdub3JlfSg8XCFcW3tpZ25vcmVTZWN0Q29udGVudHN9XF1cXT57SWdub3JlfSkqKQ0KLQ0KLS8vIFs2NV0gSWdub3JlIDo6PSBDaGFyKiAtIChDaGFyKiAoJzwhWycgfCAnXV0+JykgQ2hhciopDQotSWdub3JlID0gIChbXihcPFwhXFt8XF1cXVw+KV0qKQ0KLQ0KLS8vIFs2Nl0gQ2hhclJlZiA6Oj0gJyYjJyBbMC05XSsgJzsnIHwgJyYjeCcgWzAtOWEtZkEtRl0rICc7Jw0KLUNoYXJSZWYgPSAoJiNbMC05XSs7fCYjeFswLTlhLWZBLUZdKzspDQotDQotLy8gWzY3XSBSZWZlcmVuY2UgOjo9IEVudGl0eVJlZiB8IENoYXJSZWYNCi1SZWZlcmVuY2UgPSAoe0VudGl0eVJlZn0gfCB7Q2hhclJlZn0pDQotDQotLy8gWzY4XSBFbnRpdHlSZWYgPSAnJicgTmFtZSAnOycNCi1FbnRpdHlSZWYgPSAoJntOYW1lfTspDQotDQotLy8gWzY5XSBQRVJlZmVyZW5jZSA6Oj0gJyUnIE5hbWUgJzsnDQotUEVSZWZlcmVuY2UgPSAoJXtOYW1lfTspDQotDQotLy8gWzcwXSBFbnRpdHlEZWNsIDo6PSBHRURlY2wgfCBQRURlY2wNCi1FbnRpdHlEZWNsID0gKHtHRURlY2x9IHwge1BFRGVjbH0pDQotDQotLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+Jw0KLUdFRGVjbCA9ICg8XCFFTlRJVFl7U317TmFtZX17U317RW50aXR5RGVmfXtTfT8+KQ0KLQ0KLS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+Jw0KLVBFRGVjbCA9ICg8XCFFTlRJVFl7U31cJXtTfXtOYW1lfXtTfXtQRURlZn17U30/PikNCi0NCi0vLyBbNzNdIEVudGl0eURlZiA6Oj0gRW50aXR5VmFsdWUgfCAoRXh0ZXJuYWxJRCBORGF0YURlY2w/KQ0KLUVudGl0eURlZiA9ICh7RW50aXR5VmFsdWV9IHwgKHtFeHRlcm5hbElEfXtORGF0YURlY2x9PykpDQotDQotLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElEDQotUEVEZWYgPSAoe0VudGl0eVZhbHVlfSB8IHtFeHRlcm5hbElEfSkNCi0NCi0vLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbCB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbCANCi1FeHRlcm5hbElEID0gKFNZU1RFTXtTfXtTeXN0ZW1MaXRlcmFsfXxQVUJMSUN7U317UHViaWRMaXRlcmFsfXtTfXtTeXN0ZW1MaXRlcmFsfSApDQotDQotLy8gWzc2XSBORGF0YURlY2wgOjo9IFMgJ05EQVRBJyBTIE5hbWUNCi1ORGF0YURlY2wgPSAoe1N9TkRBVEF7U317TmFtZX0pDQotDQotLy8gWzc3XSBUZXh0RGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbz8gRW5jb2RpbmdEZWNsIFM/ICc/PicNCi1UZXh0RGVjbCA9ICg8XD94bWx7VmVyc2lvbkluZm99P3tFbmNvZGluZ0RlY2x9e1N9P1w/PikNCi0NCi0vLyBbNzhdIGV4dFBhcnNlZEVudCA6Oj0gVGV4dERlY2w/IGNvbnRlbnQNCi1leHRQYXJzZWRFbnQgPSAoe1RleHREZWNsfT97Y29udGVudH0pDQotDQotLy8gWzc5XSBleHRQRSA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRQRSA9ICh7VGV4dERlY2x9P3tleHRTdWJzZXREZWNsfSkNCi0NCi0vLyBbODBdIEVuY29kaW5nRGVjbCA6Oj0gUyAnZW5jb2RpbmcnIEVxICgnIicgRW5jTmFtZSAnIicgfCAgIiciIEVuY05hbWUgIiciICkgDQotRW5jb2RpbmdEZWNsID0gKHtTfWVuY29kaW5ne1N9KntFcX17U30qKFwie0VuY05hbWV9XCJ8XCd7RW5jTmFtZX1cJykpDQotDQotLy8gWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqDQotRW5jTmFtZSA9IChbQS1aYS16XShbQS1aYS16MC05Ll9dfFwtKSopDQotDQotLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8ICBQdWJsaWNJRCkgUz8gJz4nDQotTm90YXRpb25EZWNsID0gKDxcIU5PVEFUSU9Oe1N9e05hbWV9e1N9KHtFeHRlcm5hbElEfXx7UHVibGljSUR9KXtTfT8+KQ0KLQ0KLS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsDQotUHVibGljSUQgPSAoUFVCTElDe1N9e1B1YmlkTGl0ZXJhbH0pDQotDQotLy8gWzg0XSAgTGV0dGVyIDo6PSBCYXNlQ2hhciB8IElkZW9ncmFwaGljDQotTGV0dGVyID0gKHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9KQ0KLQ0KLS8vIFs4NV0gIEJhc2VDaGFyIDo6PSBbI3gwMDQxLSN4MDA1QV0gfCBbI3gwMDYxLSN4MDA3QV0gfCBbI3gwMEMwLSN4MDBENl0NCi0vLyB8IFsjeDAwRDgtI3gwMEY2XSB8IFsjeDAwRjgtI3gwMEZGXSB8IFsjeDAxMDAtI3gwMTMxXQ0KLS8vIHwgWyN4MDEzNC0jeDAxM0VdIHwgWyN4MDE0MS0jeDAxNDhdIHwgWyN4MDE0QS0jeDAxN0VdDQotLy8gfCBbI3gwMTgwLSN4MDFDM10gfCBbI3gwMUNELSN4MDFGMF0gfCBbI3gwMUY0LSN4MDFGNV0NCi0vLyB8IFsjeDAxRkEtI3gwMjE3XSB8IFsjeDAyNTAtI3gwMkE4XSB8IFsjeDAyQkItI3gwMkMxXSB8ICN4MDM4Ng0KLS8vIHwgWyN4MDM4OC0jeDAzOEFdIHwgI3gwMzhDIHwgWyN4MDM4RS0jeDAzQTFdIHwgWyN4MDNBMy0jeDAzQ0VdDQotLy8gfCBbI3gwM0QwLSN4MDNENl0gfCAjeDAzREEgfCAjeDAzREMgfCAjeDAzREUgfCAjeDAzRTANCi0vLyB8IFsjeDAzRTItI3gwM0YzXSB8IFsjeDA0MDEtI3gwNDBDXSB8IFsjeDA0MEUtI3gwNDRGXQ0KLS8vIHwgWyN4MDQ1MS0jeDA0NUNdIHwgWyN4MDQ1RS0jeDA0ODFdIHwgWyN4MDQ5MC0jeDA0QzRdDQotLy8gfCBbI3gwNEM3LSN4MDRDOF0gfCBbI3gwNENCLSN4MDRDQ10gfCBbI3gwNEQwLSN4MDRFQl0NCi0vLyB8IFsjeDA0RUUtI3gwNEY1XSB8IFsjeDA0RjgtI3gwNEY5XSB8IFsjeDA1MzEtI3gwNTU2XSB8ICN4MDU1OQ0KLS8vIHwgWyN4MDU2MS0jeDA1ODZdIHwgWyN4MDVEMC0jeDA1RUFdIHwgWyN4MDVGMC0jeDA1RjJdDQotLy8gfCBbI3gwNjIxLSN4MDYzQV0gfCBbI3gwNjQxLSN4MDY0QV0gfCBbI3gwNjcxLSN4MDZCN10NCi0vLyB8IFsjeDA2QkEtI3gwNkJFXSB8IFsjeDA2QzAtI3gwNkNFXSB8IFsjeDA2RDAtI3gwNkQzXSB8ICN4MDZENQ0KLS8vIHwgWyN4MDZFNS0jeDA2RTZdIHwgWyN4MDkwNS0jeDA5MzldIHwgI3gwOTNEIHwgWyN4MDk1OC0jeDA5NjFdDQotLy8gfCBbI3gwOTg1LSN4MDk4Q10gfCBbI3gwOThGLSN4MDk5MF0gfCBbI3gwOTkzLSN4MDlBOF0NCi0vLyB8IFsjeDA5QUEtI3gwOUIwXSB8ICN4MDlCMiB8IFsjeDA5QjYtI3gwOUI5XSB8IFsjeDA5REMtI3gwOUREXQ0KLS8vIHwgWyN4MDlERi0jeDA5RTFdIHwgWyN4MDlGMC0jeDA5RjFdIHwgWyN4MEEwNS0jeDBBMEFdDQotLy8gfCBbI3gwQTBGLSN4MEExMF0gfCBbI3gwQTEzLSN4MEEyOF0gfCBbI3gwQTJBLSN4MEEzMF0NCi0vLyB8IFsjeDBBMzItI3gwQTMzXSB8IFsjeDBBMzUtI3gwQTM2XSB8IFsjeDBBMzgtI3gwQTM5XQ0KLS8vIHwgWyN4MEE1OS0jeDBBNUNdIHwgI3gwQTVFIHwgWyN4MEE3Mi0jeDBBNzRdIHwgWyN4MEE4NS0jeDBBOEJdDQotLy8gfCAjeDBBOEQgfCBbI3gwQThGLSN4MEE5MV0gfCBbI3gwQTkzLSN4MEFBOF0gfCBbI3gwQUFBLSN4MEFCMF0NCi0vLyB8IFsjeDBBQjItI3gwQUIzXSB8IFsjeDBBQjUtI3gwQUI5XSB8ICN4MEFCRCB8ICN4MEFFMA0KLS8vIHwgWyN4MEIwNS0jeDBCMENdIHwgWyN4MEIwRi0jeDBCMTBdIHwgWyN4MEIxMy0jeDBCMjhdDQotLy8gfCBbI3gwQjJBLSN4MEIzMF0gfCBbI3gwQjMyLSN4MEIzM10gfCBbI3gwQjM2LSN4MEIzOV0gfCAjeDBCM0QNCi0vLyB8IFsjeDBCNUMtI3gwQjVEXSB8IFsjeDBCNUYtI3gwQjYxXSB8IFsjeDBCODUtI3gwQjhBXQ0KLS8vIHwgWyN4MEI4RS0jeDBCOTBdIHwgWyN4MEI5Mi0jeDBCOTVdIHwgWyN4MEI5OS0jeDBCOUFdIHwgI3gwQjlDDQotLy8gfCBbI3gwQjlFLSN4MEI5Rl0gfCBbI3gwQkEzLSN4MEJBNF0gfCBbI3gwQkE4LSN4MEJBQV0NCi0vLyB8IFsjeDBCQUUtI3gwQkI1XSB8IFsjeDBCQjctI3gwQkI5XSB8IFsjeDBDMDUtI3gwQzBDXQ0KLS8vIHwgWyN4MEMwRS0jeDBDMTBdIHwgWyN4MEMxMi0jeDBDMjhdIHwgWyN4MEMyQS0jeDBDMzNdDQotLy8gfCBbI3gwQzM1LSN4MEMzOV0gfCBbI3gwQzYwLSN4MEM2MV0gfCBbI3gwQzg1LSN4MEM4Q10NCi0vLyB8IFsjeDBDOEUtI3gwQzkwXSB8IFsjeDBDOTItI3gwQ0E4XSB8IFsjeDBDQUEtI3gwQ0IzXQ0KLS8vIHwgWyN4MENCNS0jeDBDQjldIHwgI3gwQ0RFIHwgWyN4MENFMC0jeDBDRTFdIHwgWyN4MEQwNS0jeDBEMENdDQotLy8gfCBbI3gwRDBFLSN4MEQxMF0gfCBbI3gwRDEyLSN4MEQyOF0gfCBbI3gwRDJBLSN4MEQzOV0NCi0vLyB8IFsjeDBENjAtI3gwRDYxXSB8IFsjeDBFMDEtI3gwRTJFXSB8ICN4MEUzMCB8IFsjeDBFMzItI3gwRTMzXQ0KLS8vIHwgWyN4MEU0MC0jeDBFNDVdIHwgWyN4MEU4MS0jeDBFODJdIHwgI3gwRTg0IHwgWyN4MEU4Ny0jeDBFODhdDQotLy8gfCAjeDBFOEEgfCAjeDBFOEQgfCBbI3gwRTk0LSN4MEU5N10gfCBbI3gwRTk5LSN4MEU5Rl0NCi0vLyB8IFsjeDBFQTEtI3gwRUEzXSB8ICN4MEVBNSB8ICN4MEVBNyB8IFsjeDBFQUEtI3gwRUFCXQ0KLS8vIHwgWyN4MEVBRC0jeDBFQUVdIHwgI3gwRUIwIHwgWyN4MEVCMi0jeDBFQjNdIHwgI3gwRUJEDQotLy8gfCBbI3gwRUMwLSN4MEVDNF0gfCBbI3gwRjQwLSN4MEY0N10gfCBbI3gwRjQ5LSN4MEY2OV0NCi0vLyB8IFsjeDEwQTAtI3gxMEM1XSB8IFsjeDEwRDAtI3gxMEY2XSB8ICN4MTEwMCB8IFsjeDExMDItI3gxMTAzXQ0KLS8vIHwgWyN4MTEwNS0jeDExMDddIHwgI3gxMTA5IHwgWyN4MTEwQi0jeDExMENdIHwgWyN4MTEwRS0jeDExMTJdDQotLy8gfCAjeDExM0MgfCAjeDExM0UgfCAjeDExNDAgfCAjeDExNEMgfCAjeDExNEUgfCAjeDExNTANCi0vLyB8IFsjeDExNTQtI3gxMTU1XSB8ICN4MTE1OSB8IFsjeDExNUYtI3gxMTYxXSB8ICN4MTE2MyB8ICN4MTE2NQ0KLS8vIHwgI3gxMTY3IHwgI3gxMTY5IHwgWyN4MTE2RC0jeDExNkVdIHwgWyN4MTE3Mi0jeDExNzNdIHwgI3gxMTc1DQotLy8gfCAjeDExOUUgfCAjeDExQTggfCAjeDExQUIgfCBbI3gxMUFFLSN4MTFBRl0gfCBbI3gxMUI3LSN4MTFCOF0NCi0vLyB8ICN4MTFCQSB8IFsjeDExQkMtI3gxMUMyXSB8ICN4MTFFQiB8ICN4MTFGMCB8ICN4MTFGOQ0KLS8vIHwgWyN4MUUwMC0jeDFFOUJdIHwgWyN4MUVBMC0jeDFFRjldIHwgWyN4MUYwMC0jeDFGMTVdDQotLy8gfCBbI3gxRjE4LSN4MUYxRF0gfCBbI3gxRjIwLSN4MUY0NV0gfCBbI3gxRjQ4LSN4MUY0RF0NCi0vLyB8IFsjeDFGNTAtI3gxRjU3XSB8ICN4MUY1OSB8ICN4MUY1QiB8ICN4MUY1RCB8IFsjeDFGNUYtI3gxRjdEXQ0KLS8vIHwgWyN4MUY4MC0jeDFGQjRdIHwgWyN4MUZCNi0jeDFGQkNdIHwgI3gxRkJFIHwgWyN4MUZDMi0jeDFGQzRdDQotLy8gfCBbI3gxRkM2LSN4MUZDQ10gfCBbI3gxRkQwLSN4MUZEM10gfCBbI3gxRkQ2LSN4MUZEQl0NCi0vLyB8IFsjeDFGRTAtI3gxRkVDXSB8IFsjeDFGRjItI3gxRkY0XSB8IFsjeDFGRjYtI3gxRkZDXSB8ICN4MjEyNg0KLS8vIHwgWyN4MjEyQS0jeDIxMkJdIHwgI3gyMTJFIHwgWyN4MjE4MC0jeDIxODJdIHwgWyN4MzA0MS0jeDMwOTRdDQotLy8gfCBbI3gzMEExLSN4MzBGQV0gfCBbI3gzMTA1LSN4MzEyQ10gfCBbI3hBQzAwLSN4RDdBM10NCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdDQotDQotLy8gWzg2XSAgSWRlb2dyYXBoaWMgOjo9IFsjeDRFMDAtI3g5RkE1XSB8ICN4MzAwNyB8IFsjeDMwMjEtI3gzMDI5XQ0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQ0KLQ0KLS8vIFs4N10gICAgICBDb21iaW5pbmdDaGFyICAgIDo6PSAgICBbI3gwMzAwLSN4MDM0NV0gICAgfCBbI3gwMzYwLSN4MDM2MV0NCi0vLyB8IFsjeDA0ODMtI3gwNDg2XSAgICAgICAgICB8IFsjeDA1OTEtI3gwNUExXSAgICAgICAgIHwgWyN4MDVBMy0jeDA1QjldDQotLy8gfCBbI3gwNUJCLSN4MDVCRF0gICAgICAgfCAjeDA1QkYgICAgICAgfCBbI3gwNUMxLSN4MDVDMl0JIHwgI3gwNUM0DQotLy8gfCBbI3gwNjRCLSN4MDY1Ml0gICAgfCAjeDA2NzAgICAgfCBbI3gwNkQ2LSN4MDZEQ10gICB8IFsjeDA2REQtI3gwNkRGXQ0KLS8vIHwgWyN4MDZFMC0jeDA2RTRdICAgICAgICAgIHwgWyN4MDZFNy0jeDA2RThdICAgICAgICAgfCBbI3gwNkVBLSN4MDZFRF0NCi0vLyB8IFsjeDA5MDEtI3gwOTAzXSAgICAgICB8ICN4MDkzQyAgICAgICB8IFsjeDA5M0UtI3gwOTRDXSAgICAgIHwgI3gwOTREDQotLy8gfCBbI3gwOTUxLSN4MDk1NF0gICAgfCBbI3gwOTYyLSN4MDk2M10gICAgfCBbI3gwOTgxLSN4MDk4M10gICB8ICN4MDlCQw0KLS8vIHwgI3gwOUJFICAgICAgIHwgI3gwOUJGICAgICAgIHwgWyN4MDlDMC0jeDA5QzRdICAgICAgfCBbI3gwOUM3LSN4MDlDOF0NCi0vLyB8IFsjeDA5Q0ItI3gwOUNEXSAgIHwgI3gwOUQ3ICAgfCBbI3gwOUUyLSN4MDlFM10gICB8ICN4MEEwMiAgIHwgI3gwQTNDDQotLy8gfCAjeDBBM0UgICAgICAgfCAjeDBBM0YgICAgICAgfCBbI3gwQTQwLSN4MEE0Ml0gICAgICB8IFsjeDBBNDctI3gwQTQ4XQ0KLS8vIHwgWyN4MEE0Qi0jeDBBNERdICAgIHwgWyN4MEE3MC0jeDBBNzFdICAgIHwgWyN4MEE4MS0jeDBBODNdICAgfCAjeDBBQkMNCi0vLyB8IFsjeDBBQkUtI3gwQUM1XSAgICAgICAgICB8IFsjeDBBQzctI3gwQUM5XSAgICAgICAgIHwgWyN4MEFDQi0jeDBBQ0RdDQotLy8gfCBbI3gwQjAxLSN4MEIwM10gICAgfCAjeDBCM0MgICAgfCBbI3gwQjNFLSN4MEI0M10gICB8IFsjeDBCNDctI3gwQjQ4XQ0KLS8vIHwgWyN4MEI0Qi0jeDBCNERdICAgICAgICAgIHwgWyN4MEI1Ni0jeDBCNTddICAgICAgICAgfCBbI3gwQjgyLSN4MEI4M10NCi0vLyB8IFsjeDBCQkUtI3gwQkMyXSAgICB8IFsjeDBCQzYtI3gwQkM4XSAgICB8IFsjeDBCQ0EtI3gwQkNEXSAgIHwgI3gwQkQ3DQotLy8gfCBbI3gwQzAxLSN4MEMwM10gICAgICAgICAgfCBbI3gwQzNFLSN4MEM0NF0gICAgICAgICB8IFsjeDBDNDYtI3gwQzQ4XQ0KLS8vIHwgWyN4MEM0QS0jeDBDNERdICAgICAgICAgIHwgWyN4MEM1NS0jeDBDNTZdICAgICAgICAgfCBbI3gwQzgyLSN4MEM4M10NCi0vLyB8IFsjeDBDQkUtI3gwQ0M0XSAgICAgICAgICB8IFsjeDBDQzYtI3gwQ0M4XSAgICAgICAgIHwgWyN4MENDQS0jeDBDQ0RdDQotLy8gfCBbI3gwQ0Q1LSN4MENENl0gICAgICAgICAgfCBbI3gwRDAyLSN4MEQwM10gICAgICAgICB8IFsjeDBEM0UtI3gwRDQzXQ0KLS8vIHwgWyN4MEQ0Ni0jeDBENDhdICAgICAgIHwgWyN4MEQ0QS0jeDBENERdICAgICAgIHwgI3gwRDU3ICAgICAgfCAjeDBFMzENCi0vLyB8IFsjeDBFMzQtI3gwRTNBXSAgICB8IFsjeDBFNDctI3gwRTRFXSAgICB8ICN4MEVCMSAgIHwgWyN4MEVCNC0jeDBFQjldDQotLy8gfCBbI3gwRUJCLSN4MEVCQ10gICAgfCBbI3gwRUM4LSN4MEVDRF0gICAgfCBbI3gwRjE4LSN4MEYxOV0gICB8ICN4MEYzNQ0KLS8vIHwgI3gwRjM3ICAgICAgfCAjeDBGMzkgICAgIHwgI3gwRjNFICAgICB8ICN4MEYzRiAgICAgfCBbI3gwRjcxLSN4MEY4NF0NCi0vLyB8IFsjeDBGODYtI3gwRjhCXSAgICB8IFsjeDBGOTAtI3gwRjk1XSAgICB8ICN4MEY5NyAgIHwgWyN4MEY5OS0jeDBGQURdDQotLy8gfCBbI3gwRkIxLSN4MEZCN10gICAgICAgfCAjeDBGQjkgICAgICAgfCBbI3gyMEQwLSN4MjBEQ10gICAgICB8ICN4MjBFMQ0KLS8vIHwgWyN4MzAyQS0jeDMwMkZdIHwgI3gzMDk5IHwgI3gzMDlBDQotQ29tYmluaW5nQ2hhciA9ICAgIFtcdTAzMDAtXHUwMzQ1XHUwMzYwLVx1MDM2MVx1MDQ4My1cdTA0ODZcdTA1OTEtXHUwNUExXHUwNUEzLVx1MDVCOVx1MDVCQi1cdTA1QkRcdTA1QkZcdTA1QzEtXHUwNUMyXHUwNUM0XHUwNjRCLVx1MDY1Mlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REQtXHUwNkRGXHUwNkUwLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHUwOTAxLVx1MDkwM1x1MDkzQ1x1MDkzRS1cdTA5NENcdTA5NERcdTA5NTEtXHUwOTU0XHUwOTYyLVx1MDk2M1x1MDk4MS1cdTA5ODNcdTA5QkNcdTA5QkVcdTA5QkZcdTA5QzAtXHUwOUM0XHUwOUM3LVx1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTItXHUwOUUzXHUwQTAyXHUwQTNDXHUwQTNFXHUwQTNGXHUwQTQwLVx1MEE0Mlx1MEE0Ny1cdTBBNDhcdTBBNEItXHUwQTREXHUwQTcwLVx1MEE3MVx1MEE4MS1cdTBBODNcdTBBQkNcdTBBQkUtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBCMDEtXHUwQjAzXHUwQjNDXHUwQjNFLVx1MEI0M1x1MEI0Ny1cdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2LVx1MEI1N1x1MEI4Mi1cdTBCODNcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDEtXHUwQzAzXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1LVx1MEM1Nlx1MEM4Mi1cdTBDODNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDUtXHUwQ0Q2XHUwRDAyLVx1MEQwM1x1MEQzRS1cdTBENDNcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEUzMVx1MEUzNC1cdTBFM0FcdTBFNDctXHUwRTRFXHUwRUIxXHUwRUI0LVx1MEVCOVx1MEVCQi1cdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4LVx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODYtXHUwRjhCXHUwRjkwLVx1MEY5NVx1MEY5N1x1MEY5OS1cdTBGQURcdTBGQjEtXHUwRkI3XHUwRkI5XHUyMEQwLVx1MjBEQ1x1MjBFMVx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFdDQotDQotLy8gWzg4XSAgIERpZ2l0ICA6Oj0gIFsjeDAwMzAtI3gwMDM5XSB8IFsjeDA2NjAtI3gwNjY5XSB8IFsjeDA2RjAtI3gwNkY5XQ0KLS8vIHwgWyN4MDk2Ni0jeDA5NkZdICAgICAgICAgIHwgWyN4MDlFNi0jeDA5RUZdICAgICAgICAgfCBbI3gwQTY2LSN4MEE2Rl0NCi0vLyB8IFsjeDBBRTYtI3gwQUVGXSAgICAgICAgICB8IFsjeDBCNjYtI3gwQjZGXSAgICAgICAgIHwgWyN4MEJFNy0jeDBCRUZdDQotLy8gfCBbI3gwQzY2LSN4MEM2Rl0gICAgICAgICAgfCBbI3gwQ0U2LSN4MENFRl0gICAgICAgICB8IFsjeDBENjYtI3gwRDZGXQ0KLS8vIHwgWyN4MEU1MC0jeDBFNTldIHwgWyN4MEVEMC0jeDBFRDldIHwgWyN4MEYyMC0jeDBGMjldDQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0NCi0NCi0vLyBbODldICBFeHRlbmRlciA6Oj0gI3gwMEI3IHwgI3gwMkQwIHwgI3gwMkQxIHwgI3gwMzg3IHwgI3gwNjQwIHwgI3gwRTQ2DQotLy8gfCAjeDBFQzYgICAgICAgfCAjeDMwMDUgICAgICAgfCBbI3gzMDMxLSN4MzAzNV0gICAgICB8IFsjeDMwOUQtI3gzMDlFXQ0KLS8vIHwgWyN4MzBGQy0jeDMwRkVdDQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQ0KLQ0KLSUlDQotDQotDQotLyogd2hpdGUgc3BhY2Ugd2l0aGluIGEgdGFnICovDQotPFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfUEksIFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSxTVF9ESFRNTF9FUVVBTFMsU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFLFNUX0RIVE1MX1RBR19DTE9TRT4ge1N9KiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkDQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLQ0KLS8vIEJFR0lOIFJFR1VMQVIgWE1MDQotLyogaGFuZGxlIG9wZW5pbmcgYSBuZXcgdGFnIGFsbW9zdCBhbnl3aGVyZSAqLw0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOw0KLX0NCi0NCi0vKiB1bnF1b3RlZCAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04+IHtnZW5lcmljRW5kVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47DQotfQ0KLS8qIHRoZSB0YWcncyBuYW1lIHdhcyBmb3VuZCwgc3RhcnQgc2Nhbm5pbmcgZm9yIGF0dHJpYnV0ZXMgKi8NCi08U1RfWE1MX1RBR19OQU1FPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotLyogYW5vdGhlciBhdHRyaWJ1dGUgbmFtZSB3YXMgZm91bmQsIHJlc3VtZSBsb29raW5nIGZvciB0aGUgZXF1YWxzIHNpZ24gKi8NCi08U1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotLyogYW4gZXF1YWwgc2lnbiB3YXMgZm91bmQsIHdoYXQncyBuZXh0IGlzIHRoZSB2YWx1ZSAqLw0KLTxTVF9YTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLS8qIGFsbG93IGZvciB1bmJhbGFuY2VkIHF1b3RlcywgbW9zdGx5IGEgZHVwbGljYXRlIG9mIHRoZSBBdHRWYWx1ZSBydWxlICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLQ0KLQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmKGlzQmxvY2tNYXJrZXIoKSkgew0KLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQl9DQotCWVsc2UNCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsNCi19DQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCwgYnV0IHRoZSB0YWcgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgZW5kIHRhZyAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNFbXB0eVRhZ0Nsb3NlfSB7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7DQotfQ0KLQ0KLTxTVF9YTUxfVEFHX05BTUU+IFtePC8+XHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOw0KLX0NCi0NCi0vLyBFTkQgUkVHVUxBUiBYTUwNCi0NCi0NCi0vLyBYTUwgQ29tbWVudHMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OPiB7Q29tbWVudFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47DQotfQ0KLTxTVF9YTUxfQ09NTUVOVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotfQ0KLQ0KLTxTVF9YTUxfQ09NTUVOVF9FTkQ+IHtDb21tZW50RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgbWlzYw0KLQ0KLXtDRFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47DQotfQ0KLTxTVF9DREFUQV9URVhUPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlTdHJpbmcgYmxvY2tDb250ZXh0ID0gZG9CbG9ja1NjYW4oIl1dPiIsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQNCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQ0KLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOw0KLQlyZXR1cm4gYmxvY2tDb250ZXh0Ow0KLX0NCi08U1RfQ0RBVEFfRU5EPiB7Q0RFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UEVSZWZlcmVuY2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsNCi19DQotPFlZSU5JVElBTD4ge0NoYXJSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtFbnRpdHlSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UElzdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9QSSk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47DQotfQ0KLS8vIHRoZSBuZXh0IHRocmVlIGFyZSBvcmRlciBkZXBlbmRlbnQNCi08U1RfUEk+ICgoWHx4KShNfG0pKEx8bCkpIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IChbaUldW21NXVtwUF1bb09dW3JSXVt0VF17U30qKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJX1dTPiB7U30rIHsNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7DQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9QSSwgU1RfUElfV1M+IFw/PiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi08U1RfUElfQ09OVEVOVD4gLiB7DQotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQNCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOw0KLX0NCi08U1RfUElfQ09OVEVOVCxTVF9YTUxfUElfVEFHX0NMT1NFPiBcPz4gew0KLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQ0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX1hNTF9QSV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotLyogdGhlIFBJJ3MgY2xvc2Ugd2FzIGZvdW5kICovDQotPFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRT4ge1BJZW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotLy8gREhUTUwNCi08U1RfREhUTUxfQVRUUklCVVRFX05BTUUsIFNUX0RIVE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLTxTVF9ESFRNTF9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIFRoZSBESFRNTCBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9ESFRNTF9FUVVBTFMsIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IFsvXSo+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBkZWNsYXJhdGlvbnMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSEgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRWVdW0xsXVtFZV1bTW1dW0VlXVtObl1bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRGRdW09vXVtDY11bVHRdW1l5XVtQcF1bRWVdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbQWFdW1R0XVtUdF1bTGxdW0lpXVtTc11bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOw0KLX0NCi0NCi0vLyBiZWdpbiBET0NUWVBFIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0U+IFxbW15cXV0qXF0gew0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOw0KLX0NCi0NCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1BwXVtVdV1bQmJdW0xsXVtJaV1bQ2NdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1NzXVtZeV1bU3NdW1R0XVtFZV1bTW1dIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUM+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsNCi19DQotPFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTT4ge0F0dFZhbHVlfXx7U3lzdGVtTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi19DQotLy8gZW5kIERPQ1RZUEUgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBFTEVNRU5UIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfXwoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgRUxFTUVOVCBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEFUVExJU1QgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9fChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBBVFRMSVNUIGhhbmRsaW5nDQotDQotPFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIERFQ0xBUkFUSU9OIGhhbmRsaW5nDQotDQotPFlZSU5JVElBTD4gW148JiVdKnxbJiVde1N9K3tOYW1lfVteJiU8XSp8WyYlXXtOYW1lfShbXjsmJTxdKnx7U30rOyopIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLQ0KLTxTVF9CTE9DS19UQUdfU0NBTj4gLnxccnxcbiB7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQ0KLS4gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCi0NCi1cMDQwIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJTUEFDRSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDExIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCIweDkiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxNSANCi17DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0FSUklBR0UgUkVUVVJOIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTIgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllODExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1jbWQgL2MgZmxleHguY21kDQotY21kIC9jIGZsZXhqLmNtZA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiNmUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMhL2Jpbi9zaA0KLWV4cG9ydCBQQVRIPSRQQVRIOi9vcHQvSUJNSmF2YTItMTMxL2Jpbi86L29wdC9JQk1KYXZhMi0xMy9iaW4vOi9vcHQvamRrMS40DQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBKRmxleC9saWIvc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZQ0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXgvbGliL3NlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UNCi1ybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiBYTUxUb2tlbml6ZXIuamF2YX4gWE1MVG9rZW5pemVyfg0KLWNwIC12IFhNTFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KLWNwIC12IEpTUFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleGouY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjEyYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUBlY2hvIG9mZg0KLVBBVEg9JVBBVEglO2M6XGpkazEuNC4yXzA5XGJpbg0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgZDpcSkZsZXhcMS4yLjJcbGliXEpGbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZSAmJiBybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiAmJiBjb3B5IEpTUFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXC4uXG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZVxzcmNcb3JnXGVjbGlwc2VcanN0XGpzcFxjb3JlXGludGVybmFsXHBhcnNlclxcaW50ZXJuYWxcSlNQVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXh4LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2IxZjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1QQVRIPSVQQVRIJTtjOlxqZGsxLjQuMl8wOFxiaW4NCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIGQ6XEpGbGV4XDEuMi4yXGxpYlxKRmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UgJiYgcm0gLWYgWE1MVG9rZW5pemVyLmphdmF+IFhNTFRva2VuaXplcn4gJiYgY29weSBYTUxUb2tlbml6ZXIuamF2YSAuLlwuLlwuLlwuLlwuLlxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmVcc3JjXG9yZ1xlY2xpcHNlXHdzdFx4bWxcY29yZVxpbnRlcm5hbFxwYXJzZXJcWE1MVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmI3NjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIC8qKg0KLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLSAgICogbWF0Y2hlZCB0ZXh0DQotICAgKi8NCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyANCi0NCi0gIC8qKiANCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQ0KLSAgICovDQotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7DQotDQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOw0KLQ0KLS0tLSB1c2VyIGNsYXNzIGNvZGUNCi0NCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyDQotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuDQotICAgKg0KLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uDQotICAgKi8NCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24NCi0NCi0NCi0gIC8qKg0KLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlDQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0NCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0NCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyANCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLw0KLQ0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLw0KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgew0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsNCi0NCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLw0KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfc3RhcnRSZWFkID0gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8NCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsNCi0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7DQotICAgIH0NCi0NCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovDQotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7DQotDQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsNCi0NCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7DQotDQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0gIH0NCi0NCi0gICAgDQotICAvKioNCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8NCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovDQotICAgIHl5X3JlYWRlci5jbG9zZSgpOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsNCi0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKg0KLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgew0KLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgew0KLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgew0KLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOw0KLSAgICB9DQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgICB9DQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcg0KLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsNCi0gIH0gDQotDQotDQotICAvKioNCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICoNCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QNCi0gICAqDQotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4NCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQ0KLSAgICovDQotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgew0KLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQ0KLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsNCi0NCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsNCi0gIH0NCi0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkDQotCSAqLw0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7DQotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgew0KLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsNCi0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOw0KLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgew0KLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYobWF0Y2hlc1NvRmFyKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKg0KLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0DQotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgew0KLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgew0KLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsNCi0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsNCi0JCQkJfQ0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl9DQotCQl9DQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsNCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCXRocm93IGU7DQotCQl9DQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCANCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuDQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gdG9rZW5zOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJA0KLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4geXlfYXRFT0Y7DQotCX0NCi0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLw0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgew0KLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOw0KLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpDQotCQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS0tLSB5eV9kb0VvZg0KLSAgLyoqDQotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLA0KLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotLS0tIHl5bGV4IGRlY2xhcmF0aW9uDQotICAgIGludCB5eV9pbnB1dDsNCi0gICAgaW50IHl5X2FjdGlvbjsNCi0NCi0tLS0gbG9jYWwgZGVjbGFyYXRpb25zDQotDQotICAgIHdoaWxlICh0cnVlKSB7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpDQotICAgICAgeXlfYWN0aW9uID0gLTE7DQotDQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykNCi0NCi0gICAgICB5eV9mb3JBY3Rpb246IHsNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgIA0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsNCi0NCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsNCi0NCi0tLS0gbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uDQotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IA0KLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IA0KLS0tLSBsaW5lIGNvdW50IHVwZGF0ZQ0KLSAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLS0tLSBjaGFyIGNvdW50IHVwZGF0ZQ0KLQ0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIA0KLQ0KLS0tLSBhY3Rpb25zDQotICAgICAgICBkZWZhdWx0OiANCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7DQotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOw0KLS0tLSBlb2Z2YWx1ZQ0KLSAgICAgICAgICB9IA0KLSAgICAgICAgICBlbHNlIHsNCi0tLS0gbm8gbWF0Y2gNCi0gICAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSAgICANCi0NCi0tLS0gbWFpbg0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODk3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UucmVhZG1lCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1UaGUgc2tlbGV0b24uc2VkIGZpbGUgY29udGFpbnMgdGhlIG1vZGlmaWVkIEpGbGV4IDEuMi4yIHNrZWxldG9uIGZpbGUgd2l0aA0KLWNoYW5nZXMgZm9yIHVzZSB3aXRoIHRoZSB0b2tlbml6ZXJzIHdpdGhpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbCBhbmQNCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuanNwIHBsdWdpbnMuDQotDQotVGhlIHNrZWxldG9uIGZpbGUncyBtZXRob2QgZGVmaW5pdGlvbnMgYXJlIGNvcGllZCBpbnRvIHRoZSBnZW5lcmF0ZWQgb3V0cHV0DQotZGlyZWN0bHkuDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ4M2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkNTU1Rva2VuaXplciI+Ci0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZS5kaXIiIHZhbHVlPSIuLi8uLiIvPgotCQk8cHJvcGVydHkgbmFtZT0iamZsZXguamFyIiB2YWx1ZT0iL0RldlRpbWVTdXBwb3J0L0pGbGV4L2xpYi9zZWQtamZsZXguamFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqZmxleC5tYXhtZW1vcnkiIHZhbHVlPSI0NzAwMDAwMDAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImpmbGV4Lm9wdCIgdmFsdWU9Ii1za2VsIFNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iQ1NTVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJTZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iQ1NTVG9rZW5pemVyLmpmbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Mvc3JjL2NvbS9pYm0vc3NlL21vZGVsL2Nzcy9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZpbmFsZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiPgotCQkJPHBhcmFtIG5hbWU9ImpmbGV4Lm9wdCIgdmFsdWU9IiIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTFRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxUb2tlbml6ZXIiLz4JCQkKLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC9zcmMvY29tL2libS9zc2UvbW9kZWwveG1sL2ludGVybmFsL3BhcnNlciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLXRva2VuaXplciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJKU1BUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IlNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iSlNQVG9rZW5pemVyLmpmbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5qc3Avc3JjL2NvbS9pYm0vc3NlL21vZGVsL2pzcC9wYXJzZXIvaW50ZXJuYWwiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQtdG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJKRmxleC5NYWluIiBtYXhtZW1vcnk9IiR7amZsZXgubWF4bWVtb3J5fSIgZm9yaz0ieWVzIiA+Ci0JCQk8YXJnIGxpbmU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0gJHtqZmxleC5vcHR9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqZmxleC5qYXJ9Ii8+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY29weSIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxjb3B5IHRvZGlyPSIke3dvcmtzcGFjZS5kaXJ9LyR7ZGVzdC5kaXJ9IiBvdmVyd3JpdGU9InRydWUiIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCQk8Y29weSB0b2Rpcj0iJHt3b3Jrc3BhY2UuZGlyfS8ke2ZpbmFsZGVzdC5kaXJ9IiBvdmVyd3JpdGU9InRydWUiIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBkZWZhdWx0ZXhjbHVkZXM9Im5vIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqfiIvPgotCQkJPC9maWxlc2V0PgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWJkMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscywKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7dmlzaWJpbGl0eTo9cmVleHBvcnQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjNjY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIGNvcmUgbW9kZWwgb2YgdGhlIHNzZSBmcmFtZXdvcmsuIEl0IHByb3ZpZGVzIHRoZSBiYXNlIGRvY3VtZW50IGNsYXNzZXMsCi1idWlsZGVycyBhbmQgcGFyc2Vycy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjVlYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMtZW5jb2RpbmcvLFwKLSAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgIHNyYy10YXNrdGFncy8sXAotICAgICAgICAgICBzcmMtY29udGVudHByb3BlcnRpZXMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IERldlRpbWVTdXBwb3J0LyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGRvYy8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWUyMjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlIj4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvc3NlL292ZXJ2aWV3Lmh0bWwiPjwvZGVzY3JpcHRpb24+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcyIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JCTx0eXBlIG5hbWU9IklQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiIgaW1wbGVtZW50PSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRFZGl0b3IiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9jaGFyc2V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGU2NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSEgdGhlIG51bWJlciBvZiBjb2Rlc2V0IG5hbWVzCi10b3RhbG51bWJlcj0yNQotCi0hIE9ubHkgdHJhbnNsYXRlIHRoZSB4eC5sYWJlbCBzdHJpbmdzLiAgRG8gbm90IHRyYW5zbGF0ZSB0aGUgeHguaWFuYSBvciB4eC5qYXZhIHN0cmluZ3MuCi0KLWNvZGVzZXQuMC5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtOCkKLWNvZGVzZXQuMC5pYW5hPVVURi04Ci0KLWNvZGVzZXQuMS5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtMTYpIEJpZyBFbmRpYW4KLWNvZGVzZXQuMS5pYW5hPVVURi0xNgotCi1jb2Rlc2V0LjIubGFiZWw9SVNPIDEwNjQ2L1VuaWNvZGUoVVRGLTE2QkUpIEJpZyBFbmRpYW4KLWNvZGVzZXQuMi5pYW5hPVVURi0xNkJFCi0KLWNvZGVzZXQuMy5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtMTZMRSkgTGl0dGxlIEVuZGlhbgotY29kZXNldC4zLmlhbmE9VVRGLTE2TEUKLQotY29kZXNldC40LmxhYmVsPVVTIEFTQ0lJCi1jb2Rlc2V0LjQuaWFuYT1VUy1BU0NJSQotCi1jb2Rlc2V0LjUubGFiZWw9SVNPIExhdGluLTEKLWNvZGVzZXQuNS5pYW5hPUlTTy04ODU5LTEKLQotISAoU2xhdmljOiBDemVjaCwgQ3JvYXQsIEdlcm1hbiwgSHVuZ2FyaWFuLCBQb2xpc2gsIFJvbWFuaWFuLCBTbG92YWssIFNsb3ZlbmlhbikKLWNvZGVzZXQuNi5sYWJlbD1DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYykgCi1jb2Rlc2V0LjYuaWFuYT1JU08tODg1OS0yCi0KLSEgKEVzcGVyYW50bywgR2FsaWNpYW4sIE1hbHRlc2UsIFR1cmtpc2gpCi1jb2Rlc2V0LjcubGFiZWw9U291dGhlcm4gRXVyb3BlYW4KLWNvZGVzZXQuNy5pYW5hPUlTTy04ODU5LTMKLQotY29kZXNldC44LmxhYmVsPUFyYWJpYywgTG9naWNhbAotY29kZXNldC44LmlhbmE9SVNPLTg4NTktNgotCi1jb2Rlc2V0LjkubGFiZWw9QXJhYmljCi1jb2Rlc2V0LjkuaWFuYT13aW5kb3dzLTEyNTYKLQotY29kZXNldC4xMC5sYWJlbD1DaGluZXNlLCBOYXRpb25hbCBTdGFuZGFyZAotY29kZXNldC4xMC5pYW5hPUdCMTgwMzAKLQotY29kZXNldC4xMS5sYWJlbD1UcmFkaXRpb25hbCBDaGluZXNlLCBCaWc1Ci1jb2Rlc2V0LjExLmlhbmE9QklHNQotCi0hIChFc3RvbmlhbiwgTGF0dmlhbiwgTGl0aHVhbmlhbikKLWNvZGVzZXQuMTIubGFiZWw9Q3lyaWxsaWMsIElTTy04ODU5LTQKLWNvZGVzZXQuMTIuaWFuYT1JU08tODg1OS00Ci0KLSEgKEJ1bGdhcmlhbiwgQnllbG9ydXNzaWFuLCBNYWNlZG9uaWFuLCBTZXJiaWFuLCBVa3JhaW5pYW4pCi1jb2Rlc2V0LjEzLmxhYmVsPUN5cmlsbGljLCBJU08tODg1OS01Ci1jb2Rlc2V0LjEzLmlhbmE9SVNPLTg4NTktNQotCi1jb2Rlc2V0LjE0LmxhYmVsPUdyZWVrCi1jb2Rlc2V0LjE0LmlhbmE9SVNPLTg4NTktNwotCi1jb2Rlc2V0LjE1LmxhYmVsPUhlYnJldywgVmlzdWFsCi1jb2Rlc2V0LjE1LmlhbmE9SVNPLTg4NTktOAotCi0hIGxhYmVsPUhlYnJldywgTG9naWNhbAotISBpYW5hPUlTTy04ODU5LTgtSQotCi1jb2Rlc2V0LjE2LmxhYmVsPUhlYnJldwotY29kZXNldC4xNi5pYW5hPXdpbmRvd3MtMTI1NQotCi1jb2Rlc2V0LjE3LmxhYmVsPUphcGFuZXNlLCBFVUMtSlAKLWNvZGVzZXQuMTcuaWFuYT1FVUMtSlAKLQotY29kZXNldC4xOC5sYWJlbD1KYXBhbmVzZSwgSVNPIDIwMjIKLWNvZGVzZXQuMTguaWFuYT1JU08tMjAyMi1KUAotCi1jb2Rlc2V0LjE5LmxhYmVsPUphcGFuZXNlLCBTaGlmdC1KSVMKLWNvZGVzZXQuMTkuaWFuYT1TaGlmdF9KSVMKLQotY29kZXNldC4yMC5sYWJlbD1KYXBhbmVzZSwgV2luZG93cy0zMUoKLWNvZGVzZXQuMjAuaWFuYT13aW5kb3dzLTMxagotCi1jb2Rlc2V0LjIxLmxhYmVsPUtvcmVhbiwgRVVDLUtSCi1jb2Rlc2V0LjIxLmlhbmE9RVVDLUtSCi0KLWNvZGVzZXQuMjIubGFiZWw9S29yZWFuLCBJU08gMjAyMgotY29kZXNldC4yMi5pYW5hPUlTTy0yMDIyLUtSCi0KLWNvZGVzZXQuMjMubGFiZWw9VGhhaSwgVElTSQotY29kZXNldC4yMy5pYW5hPVRJUy02MjAKLQotY29kZXNldC4yNC5sYWJlbD1UdXJraXNoCi1jb2Rlc2V0LjI0LmlhbmE9SVNPLTg4NTktOQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2RlZmF1bHRJQU5BLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvZGVmYXVsdElBTkEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1YzNkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvZGVmYXVsdElBTkEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgVGhpcyBmaWxlIGxpc3RzIGNoYXJzZXQgbWFwcGluZ3MgYmV0d2VlbiBhbiBlbmNvZGluZyBhbmQgaXRzIGRlZmF1bHQKLSMgZXF1aXZhbGVudCBlbmNvZGluZyBsaXN0ZWQgaW4gY2hhcnNldC5wcm9wZXJ0aWVzCi0jIGZvcm1hdDogYW55bmFtZT1pYW5hIG5hbWUgbGlzdGVkIGluIGNoYXJzZXQucHJvcGVydGllcwotCi0jIE5vIHRyYW5zbGF0aW9uIG5lY2Vzc2FyeQotd2luZG93cy0xMjUyPUlTTy04ODU5LTEKLXdpbmRvd3MtOTMyPVNoaWZ0X0pJUwoteC1ldWMtanAtbGludXg9RVVDLUpQIAotd2luZG93cy05NDk9RVVDLUtSCi14LXdpbmRvd3MtOTQ5PUVVQy1LUgotd2luZG93cy05NTA9QklHNQoteC13aW5kb3dzLTk1MD1CSUc1Ci13aW5kb3dzLTkzNj1HQjE4MDMwCi14LW1zd2luLTkzNj1HQjE4MDMwCi1HQjIzMTI9R0IxODAzMAoteC1FVUMtQ049R0IxODAzMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9vdmVycmlkZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDM4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBmaWxlIGxpc3RzIGNoYXJzZXQgbWFwcGluZ3Mgd2hpY2ggc3VwcGxlbWVudCBvciBvdmVycmlkZSB0aG9zZQotIyBwcm92aWRlZCBieSB0aGUgVk0uIFRoZXJlIGFyZSBmZXcgY2FzZXMgd2hlcmUgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQuCi0jIE5vdGU6IHRoZXJlIGlzIG5vIGludGVncmV0eSBjaGVja2luZyB0byBzZWUgaWYgdGhlIHZhbGlkQ2hhcnNldE5hbWUgaXMgaW5kZWVkCi0jIHZhbGlkIGZvciBhIGdpdmVuIFZNLCBzbyBlcnJvcnMgd291bGQgb25seSBzaG93IHVwIHdoZW4gYXR0ZW1wdGVkIHRvIAotIyBiZSB1c2VkLgotCi0jIE5vIHRyYW5zbGF0aW9uIG5lY2Vzc2FyeQotCi0jIGZvcm1hdDogYW55bmFtZT12YWxpZGphdmFDaGFyc2V0TmFtZQotSVNPLTg4NTktOC1JPUlTTy04ODU5LTgKLVgtU0pJUz1TaGlmdF9KSVMKLVgtRVVDLUpQPVNoaWZ0X0pJUwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjc4Y2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvYy9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1QLkNvZGUgew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDAuMDBwdDsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTVwdDsNCi0JZm9udC1zaXplOiAxMC4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogUmVndWxhcjsNCi0JY29sb3I6ICM0NDQ0Q0M7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyI7DQotfQ0KLUg2LkNhcHRpb25GaWdDb2x1bW4gew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLQlmb250LXNpemU6IDkuMDAwMDAwcHQ7DQotCWZvbnQtd2VpZ2h0OiBtZWRpdW07DQotCWZvbnQtc3R5bGU6IEl0YWxpYzsNCi0JY29sb3I6ICMwMDAwMDA7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJBcmlhbCI7DQotfQ0KLVAuTm90ZSB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMHB0Ow0KLQltYXJnaW4tdG9wOiAxOS41MDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDMwcHQ7DQotCWZvbnQtc2l6ZTogMTEuMDAwMDAwcHQ7DQotCWZvbnQtd2VpZ2h0OiBtZWRpdW07DQotCWZvbnQtc3R5bGU6IEl0YWxpYzsNCi0JY29sb3I6ICMwMDAwMDA7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJBcmlhbCI7DQotfQ0KLUVNLlVJTGFiZWwgew0KLQlmb250LXdlaWdodDogQm9sZDsNCi0JZm9udC1zdHlsZTogUmVndWxhcjsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLX0NCi1FTS5Db2RlTmFtZSB7DQotCWZvbnQtd2VpZ2h0OiBCb2xkOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7DQotfQ0KLQ0KLQ0KLQ0KLQ0KLS8qIGZvbGxvd2luZyBmb250IGZhY2UgZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgcmVtb3ZlZCBmb3IgREJDUyAqLw0KLQ0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzAwMDAwMH0NCi1wcmUJCQkJeyBmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlfQ0KLQ0KLS8qIGVuZCBmb250IGZhY2UgZGVjbGFyYXRpb25zICovDQotDQotLyogZm9sbG93aW5nIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIE9LIGZvciBEQkNTICovDQotYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1zaXplOiAxMHB0OyB9DQotcHJlCQkJCXsgZm9udC1zaXplOiAxMHB0fQ0KLQ0KLS8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovDQotDQotYm9keQkgICAgIHsgYmFja2dyb3VuZDogI0ZGRkZGRn0NCi1oMSAgICAgICAgICAgeyBmb250LXNpemU6IDE4cHQ7IG1hcmdpbi10b3A6IDU7IG1hcmdpbi1ib3R0b206IDEgfQkNCi1oMiAgICAgICAgICAgeyBmb250LXNpemU6IDE0cHQ7IG1hcmdpbi10b3A6IDI1OyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oMyAgICAgICAgICAgeyBmb250LXNpemU6IDExcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oNCAgICAgICAgICAgeyBmb250LXNpemU6IDEwcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzOyBmb250LXN0eWxlOiBpdGFsaWMgfQ0KLXAgICAgICAgICAgICB7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHggfQ0KLXByZQkgICAgIHsgbWFyZ2luLWxlZnQ6IDY7IGZvbnQtc2l6ZTogOXB0IH0NCi1hOmxpbmsJICAgICB7IGNvbG9yOiAjMDAwMEZGIH0NCi1hOmhvdmVyCSAgICAgeyBjb2xvcjogIzAwMDA4MCB9DQotYTp2aXNpdGVkICAgIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgfQ0KLXVsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotbGkJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfSANCi1saSBwCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0gDQotb2wJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1kbAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWR0CSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwOyBmb250LXdlaWdodDogYm9sZCB9DQotZGQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfQ0KLXN0cm9uZwkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGR9DQotZW0JICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi12YXIJICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi1kaXYucmV2aXNpb24geyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOyANCi0JCQkJICAgYm9yZGVyLWxlZnQtY29sb3I6ICM3QjY4RUU7IHBhZGRpbmctbGVmdDo1IH0NCi10aAkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvYy9zY2hlbWEuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZmJmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1INi5DYXB0aW9uRmlnQ29sdW1uI2hlYWRlciB7DQotCWZvbnQtc2l6ZToxNnB4OyANCi0JZGlzcGxheTppbmxpbmUNCi19DQotDQotUC5Ob3RlI2NvcHlyaWdodCB7DQotCWZvbnQtc2l6ZTogc21hbGxlcjsgDQotCWZvbnQtc3R5bGU6IG5vcm1hbDsNCi0JY29sb3I6ICMzMzY2OTk7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMy4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNkdGQgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjZHRkQXR0bGlzdCB7DQotCWNvbG9yOiAjODAwMDAwOyANCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMjAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSN0YWcgew0KLQljb2xvcjogIzAwMDA4MDsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjY3N0cmluZyB7DQotCWNvbG9yOiAjMDA4MDAwOyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7CQ0KLX0NCi0NCi0uQ29uZmlnTWFya3VwI2VsZW1lbnREZXNjIHsNCi0JY29sb3I6IGJsYWNrOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxMC4wMDAwMDBwdDsNCi19DQotDQotLkNvbmZpZ01hcmt1cCNhdHRsaXN0RGVzYyB7DQotCWNvbG9yOiBibGFjazsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMzIuMDAwMDAwcHQ7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9oYW5keVN0dWZmLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ3YjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGFjNjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBUZXh0IE1vZGVsCi0jIGV4dGVuc2lvbiBuYW1lcwotQWRhcHRfT25fQ3JlYXRlX0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9QWRhcHQgT24gQ3JlYXRlIEZhY3RvcnkgRXh0ZW5zaW9uCi1Eb2N1bWVudF9UeXBlc19FeHRlbnNpb24ubmFtZT1Eb2N1bWVudCBUeXBlcyBFeHRlbnNpb24KLUpTUF9FbWJlZGRlZF9Db250ZW50X1R5cGVfSGFuZGxlcl9FeHRlbnNpb24ubmFtZT1KU1AgRW1iZWRkZWQgQ29udGVudCBUeXBlIEhhbmRsZXIgRXh0ZW5zaW9uCi1Db250ZW50X1R5cGVfRmFjdG9yeV9Db250cmlidXRpb25fRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBUeXBlIEZhY3RvcnkgQ29udHJpYnV0aW9uIEV4dGVuc2lvbgotQ1NTX1Byb2ZpbGVfRXh0ZW5zaW9uLm5hbWU9Q1NTIFByb2ZpbGUgRXh0ZW5zaW9uCi1Db21tZW50X0VsZW1lbnRfSGFuZGxlcl9FeHRlbnNpb24ubmFtZT1Db21tZW50IEVsZW1lbnQgSGFuZGxlciBFeHRlbnNpb24KLU1vZGVsX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWU9TW9kZWwgSGFuZGxlciBFeHRlbnNpb24KLUZvcm1hdF9Qcm9jZXNzb3JzX0V4dGVuc2lvbl9Qb2ludC5uYW1lPUZvcm1hdCBQcm9jZXNzb3JzIEV4dGVuc2lvbiBQb2ludAotVGFza19TY2FubmVyX0V4dGVuc2lvbl9Qb2ludC5uYW1lPVRhc2sgU2Nhbm5lciBFeHRlbnNpb24gUG9pbnQKLVN0cnVjdHVyZWRfU291cmNlc19UYXNrX0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgU291cmNlcyBUYXNrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5ZDg1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQotCTwhLS0gZGVwcmVjYXRlZCAtLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhZGFwdE9uQ3JlYXRlRmFjdG9yeSIgbmFtZT0iJUFkYXB0X09uX0NyZWF0ZV9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkIi8+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb2N1bWVudFR5cGVzIiBuYW1lPSIlRG9jdW1lbnRfVHlwZXNfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZCIvPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZW1iZWRkZWRUeXBlSGFuZGxlciIgbmFtZT0iJUpTUF9FbWJlZGRlZF9Db250ZW50X1R5cGVfSGFuZGxlcl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZW1iZWRkZWRUeXBlSGFuZGxlci5leHNkIi8+Ci0JPCEtLSBkZXByZWNhdGVkIC0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbiIgbmFtZT0iJUNvbnRlbnRfVHlwZV9GYWN0b3J5X0NvbnRyaWJ1dGlvbl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uLmV4c2QiLz4KLQk8IS0tIEkgY29tbWVudGVkIG91dCAuLi4gY2xpZW50cyBzaG91bGQganVzdCB1c2UgdGhlIG5vcm1hbCBwbGF0Zm9ybSB3YXkgb2YgcmVnaXN0ZXJpbmcgdGhlc2UgCi0JCWFkYXB0ZXJGYWN0b3JpZXMuIEF0IHdvcnN0LCB0aGV5J2QgbmVlZCBhIHNtYWxsIHBsdWdpbiB3aXRoICdzdGFydHVwJyBzcGVjaWZpZWQgLi4uIGJ1dCB0aGF0J3MgCi0JCWJldHRlciB0aGFuIHVzIGdldHRpbmcgaGl0IHdpdGggdGhlIHBlcmZvcm1hbmNlIGltcGFjdCAob2YgbG9hZGluZyBwbHVnaW5zIGFuZCBwcmUtcmVxcywgZXRjLikuIAotCQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1cmlSZXNvbHZlckFkYXB0ZXJGYWN0b3J5IiBuYW1lPSJSZXNvdXJjZSBBZGFwdGVyIEZhY3RvcnkgZm9yIENyZWF0aW5nIFVSSVJlc29sdmVycyIvPgotCS0tPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iY3NzcHJvZmlsZSIgbmFtZT0iJUNTU19Qcm9maWxlX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9jc3Nwcm9maWxlLmV4c2QiLz4KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1lbnRFbGVtZW50SGFuZGxlciIgbmFtZT0iJUNvbW1lbnRfRWxlbWVudF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZCIvPgotCi0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2RlbEhhbmRsZXIiIG5hbWU9IiVNb2RlbF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9tb2RlbEhhbmRsZXIuZXhzZCIvPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iZm9ybWF0UHJvY2Vzc29ycyIKLQkJbmFtZT0iJUZvcm1hdF9Qcm9jZXNzb3JzX0V4dGVuc2lvbl9Qb2ludC5uYW1lIgotCQlzY2hlbWE9InNjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QiIC8+Ci0KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9InRhc2tzY2FubmVyIiBuYW1lPSIlVGFza19TY2FubmVyX0V4dGVuc2lvbl9Qb2ludC5uYW1lIiBzY2hlbWE9InNjaGVtYS90YXNrc2Nhbm5lci5leHNkIi8+Ci0KLQk8IS0tIGRlZmluZSBvdXIgdGFzayBtYXJrZXIgdHlwZSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJ0YXNrIgotCQluYW1lPSIlU3RydWN0dXJlZF9Tb3VyY2VzX1Rhc2tfRXh0ZW5zaW9uLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiIC8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBNYWtlIHN1cmUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcyBhcmUgc2V0IGF0IHJ1bnRpbWUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvYWRhcHRPbkNyZWF0ZUZhY3RvcnkuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJmODk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJhZGFwdE9uQ3JlYXRlRmFjdG9yeSIgbmFtZT0iQWRhcHQgT24gQ3JlYXRlIEZhY3RvcnkgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0MTczNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY29tbWVudEVsZW1lbnRIYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJjb21tZW50RWxlbWVudEhhbmRsZXIiIG5hbWU9IkNvbW1lbnQgRWxlbWVudCBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaGFuZGxlci1jdXN0b20iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaGFuZGxlci1jdXN0b20iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdGFydHdpdGgiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnR0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdGFydHdpdGgiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4NDE4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImNvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbiIgbmFtZT0iQ29udGVudCBUeXBlIEZhY3RvcnkgQ29udHJpYnV0aW9uIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jc3Nwcm9maWxlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2U4NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImNzc3Byb2ZpbGUiIG5hbWU9IkNTUyBQcm9maWxlIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvZmlsZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9maWxlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9kb2N1bWVudFR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGYzNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImRvY3VtZW50VHlwZXMiIG5hbWU9IkRvY3VtZW50IFR5cGVzIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZG9jdW1lbnRUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRvY3VtZW50VHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVsZW1lbnROYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzWEhUTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imhhc0ZyYW1lc2V0IiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdWJsaWNJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW1JRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0WEhUTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzV01MIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0V01MIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2VtYmVkZGVkVHlwZUhhbmRsZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9lbWJlZGRlZFR5cGVIYW5kbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiY2RlOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2VtYmVkZGVkVHlwZUhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImVtYmVkZGVkVHlwZUhhbmRsZXIiIG5hbWU9IkpTUCBFbWJlZGRlZCBDb250ZW50IFR5cGUgSGFuZGxlciBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVtYmVkZGVkVHlwZUhhbmRsZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZW1iZWRkZWRUeXBlSGFuZGxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViZDVlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJmb3JtYXRQcm9jZXNzb3JzIiBuYW1lPSJGb3JtYXQgUHJvY2Vzc29ycyBFeHRlbnNpb24gUG9pbnQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZm9yIGRlZmluaW5nIHRoZSBmb3JtYXQgcHJvY2Vzc3NvciBmb3IgYSBjb250ZW50IHR5cGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9jZXNzb3IiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc29yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtwcm9jZXNzb3INCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUwmcXVvdDsNCi0gICAgICAgICAgICBjb250ZW50VHlwZUlkPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9wcm9jZXNzb3ImZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvbW9kZWxIYW5kbGVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvbW9kZWxIYW5kbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzc1YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL21vZGVsSGFuZGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0ibW9kZWxIYW5kbGVyIiBuYW1lPSJNb2RlbCBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kZWxIYW5kbGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGVsSGFuZGxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFzc29jaWF0ZWRDb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS90YXNrc2Nhbm5lci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzAzZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJ0YXNrc2Nhbm5lciIgbmFtZT0iVGFzayBTY2FubmVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2Nhbm5lciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzY2FubmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0Fic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGJmYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIgaW1wbGVtZW50cyBJQ29udGVudFNldHRpbmdzSGFuZGxlciB7Ci0KLQotCXByaXZhdGUgSUNvbnRlbnRTZXR0aW5ncyBjb250ZW50U2V0dGluZ3MgPSBDb250ZW50U2V0dGluZ3NDcmVhdG9yLmNyZWF0ZSgpOwotCXByaXZhdGUgSVJlc291cmNlRGVsdGEgZkRlbHRhOwotCi0JcHJpdmF0ZSB2b2lkIGNvbW1vbldpdGhSZXNwZWN0VG9LaW5kKCkgewotCQlnZXRDb250ZW50U2V0dGluZ3MoKS5yZWxlYXNlQ2FjaGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSUNvbnRlbnRTZXR0aW5ncyBnZXRDb250ZW50U2V0dGluZ3MoKSB7Ci0JCXJldHVybiBjb250ZW50U2V0dGluZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIElSZXNvdXJjZURlbHRhIGdldERlbHRhKCkgewotCQlyZXR1cm4gZkRlbHRhOwotCX0KLQotCi0JLyoKLQkgKiBAc2VlIElDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZShJUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdGhpcy5mRGVsdGEgPSBkZWx0YTsKLQkJLy8gZ2V0IFJlc291cmNlIGRlbHRhIGtpbmQKLQkJZmluYWwgaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCS8vIG5ldmVyIHVzZWQhPwotCQkvL0lSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0KLQotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6IHsKLQkJCQloYW5kbGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOiB7Ci0JCQkJaGFuZGxlUmVtb3ZlZCgpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IHsKLQkJCQloYW5kbGVBZGRlZCgpOwotCQkJfQotCQkJCWJyZWFrOwotCi0KLQkJfQotCi0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZGVkKCkgewotCQljb21tb25XaXRoUmVzcGVjdFRvS2luZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWQoKSB7Ci0JCWNvbW1vbldpdGhSZXNwZWN0VG9LaW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZCgpIHsKLQkJY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0Fic3RyYWN0U3ViamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RTdWJqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NmE3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RTdWJqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN1YmplY3QgaW1wbGVtZW50cyBJTm90aWZ5LCBJU3ViamVjdCB7Ci0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGxpc3RlbmVyTGlzdCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LnB1dChsaXN0ZW5lciwgbGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29udGVudFNldHRpbmdzRXZlbnRTdWJqZWN0I25vdGlmeUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVycyhPYmplY3QpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlKSB7Ci0KLQkJU2V0IGtleXMgPSBsaXN0ZW5lckxpc3Qua2V5U2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgY3NsID0gKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQljc2wuY29udGVudFNldHRpbmdzQ2hhbmdlZChjaGFuZ2VkUmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjM3NDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNldHRpbmdzIGltcGxlbWVudHMgSUNvbnRlbnRTZXR0aW5ncyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbnRlbnRTZXR0aW5nc05hbWUgPSAiLmNvbnRlbnRzZXR0aW5ncyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU2ltcGxlTm9kZU9wZXJhdG9yIGRvbU9wZXJhdG9yOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgcHJlUHJvamVjdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElDb250ZW50U2V0dGluZ3Mgc2luZ2xldG9uID0gbmV3IENvbnRlbnRTZXR0aW5ncygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udGVudFNldHRpbmdzTmFtZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRTZXR0aW5nc05hbWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSUNvbnRlbnRTZXR0aW5ncyBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZW50U2V0dGluZ3NQYXRoOwotCXByaXZhdGUgSVByb2plY3QgY3VyclByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZUVsZW1lbnROYW1lID0gImZpbGUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQQVRIQVRUUiA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb2plY3RFbGVtZW50TmFtZSA9ICJwcm9qZWN0IjsvLyROT04tTkxTLTEkCi0KLQotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gImNvbnRlbnRzZXR0aW5ncyI7Ly8kTk9OLU5MUy0xJAotCi0KLQotCXByaXZhdGUgQ29udGVudFNldHRpbmdzKCkgewotCQljdXJyUHJvamVjdCA9IG51bGw7Ci0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIF9zZXRQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgTWFwIHByb3BlcnRpZXMpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybjsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQotCQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmcm9tIGV4aXN0aW5nIGNvbnRlbnRzZXR0aW5ncy4KLQkJCQljcmVhdGVET01UcmVlKCk7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBwcm9qZWN0IEVsZW1lbnQgYW5kIGFkZCBpdCBpbnRvIHRyZWUKLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJLy8gY2hlY2sgZXhpc3RzIGZpbGUgRWxlbWVudAotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBmaWxlIEVsZW1lbnQgYW5kIGFkZCBwYXRoIGludG8gaXQuCi0JCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5hZGRFbGVtZW50VW5kZXJSb290KHRoaXMuZmlsZUVsZW1lbnROYW1lKTsKLQkJCQlkb21PcGVyYXRvci5hZGRBdHRyaWJ1dGVBdChlLCBnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgZXhpc3RzIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUKLQkJTWFwIGF0dHJMaXN0ID0gZG9tT3BlcmF0b3IuZ2V0QXR0cmlidXRlc09mKGUpOwotCQlib29sZWFuIGhhc0F0dHIgPSB0cnVlOwotCQlpZiAoYXR0ckxpc3QgPT0gbnVsbCB8fCBhdHRyTGlzdC5pc0VtcHR5KCkpCi0JCQloYXNBdHRyID0gZmFsc2U7Ci0JCVNldCBrZXlzID0gcHJvcGVydGllcy5rZXlTZXQoKTsKLQkJSXRlcmF0b3IgaWkgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpaS5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBpaS5uZXh0KCk7Ci0JCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0KLQotCQkJaWYgKCFoYXNBdHRyIHx8IChTdHJpbmcpIGF0dHJMaXN0LmdldChwcm9wZXJ0eU5hbWUpID09IG51bGwpCi0JCQkJLy8gY3JlYXRlIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUgYW5kIGFkZAotCQkJCWRvbU9wZXJhdG9yLmFkZEF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJLy8gc2V0IGF0dHJpYnV0ZSB2YWx1ZQotCQkJCWRvbU9wZXJhdG9yLnVwZGF0ZUF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCX0KLQotCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJdHJ5IHsKLQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIF9zZXRQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHByb3BlcnR5TmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybjsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQotCQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmcm9tIGV4aXN0aW5nIGNvbnRlbnRzZXR0aW5ncy4KLQkJCQljcmVhdGVET01UcmVlKCk7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBwcm9qZWN0IEVsZW1lbnQgYW5kIGFkZCBpdCBpbnRvIHRyZWUKLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJLy8gY2hlY2sgZXhpc3RzIGZpbGUgRWxlbWVudAotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBmaWxlIEVsZW1lbnQgYW5kIGFkZCBwYXRoIGludG8gaXQuCi0JCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5hZGRFbGVtZW50VW5kZXJSb290KHRoaXMuZmlsZUVsZW1lbnROYW1lKTsKLQkJCQlkb21PcGVyYXRvci5hZGRBdHRyaWJ1dGVBdChlLCBnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgZXhpc3RzIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUKLQotCQlNYXAgYXR0ckxpc3QgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCWlmIChhdHRyTGlzdCA9PSBudWxsIHx8IGF0dHJMaXN0LmlzRW1wdHkoKSB8fCAoU3RyaW5nKSBhdHRyTGlzdC5nZXQocHJvcGVydHlOYW1lKSA9PSBudWxsKQotCQkJLy8gY3JlYXRlIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUgYW5kIGFkZAotCQkJZG9tT3BlcmF0b3IuYWRkQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZQotCQkJLy8gc2V0IGF0dHJpYnV0ZSB2YWx1ZQotCQkJZG9tT3BlcmF0b3IudXBkYXRlQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQotCi0JCS8vIHdyaXRlIGRvbSB0cmVlIGludG8gLmNvbnRlbnRzZXR0aW5ncwotCQl0cnkgewotCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQotCi0JfQotCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRE9NVHJlZSgpIHRocm93cyBTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoZG9tT3BlcmF0b3IgPT0gbnVsbCB8fCAoY3VyclByb2plY3QgIT0gbnVsbCAmJiAoIWN1cnJQcm9qZWN0LmVxdWFscyhwcmVQcm9qZWN0KSkgJiYgY29udGVudFNldHRpbmdzUGF0aCAhPSBudWxsKSkKLQkJCWRvbU9wZXJhdG9yID0gbmV3IFNpbXBsZU5vZGVPcGVyYXRvcihjb250ZW50U2V0dGluZ3NQYXRoKTsKLQotCi0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgY3JlYXRlTmV3RE9NVHJlZSgpIHRocm93cwotCSAqIFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9ueyAvLyBjcmVhdGUgTmV3Ci0JICogZG9jdW1lbnQgd2hlbiBubyBmaWxlIGV4aXN0cy4gRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9Ci0JICogRE9NSW1wbGVtZW50YXRpb25JbXBsLmdldERPTUltcGxlbWVudGF0aW9uKCk7IERvY3VtZW50IGRvY3VtZW50ID0KLQkgKiBpbXBsLmNyZWF0ZURvY3VtZW50KG51bGwscm9vdEVsZW1lbnROYW1lLG51bGwpOyBkb21PcGVyYXRvciA9IG5ldwotCSAqIFNpbXBsZU5vZGVPcGVyYXRvcihkb2N1bWVudCk7IH0KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmV3RE9NVHJlZSgpIHRocm93cyBTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGNyZWF0aW5nIGRvY3VtZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gY3JlYXRpbmcgZG9jdW1lbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJvb3RFbGVtZW50TmFtZSkpOwotCQkJZG9tT3BlcmF0b3IgPSBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yKGRvY3VtZW50KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlbGV0ZUFsbFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIGRlbGV0ZWRGaWxlKSB7Ci0JCWlmIChkZWxldGVkRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZiAoZGVsZXRlZEZpbGUuZXhpc3RzKCkpIHJldHVybjsKLQkJaWYgKChkZWxldGVkRmlsZSkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFICYmIChkZWxldGVkRmlsZSkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJcmV0dXJuOwotCi0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgoZGVsZXRlZEZpbGUpOy8vIGdldFByb2plY3RPZigoSVJlc291cmNlKWRlbGV0ZWRGaWxlKQotCQkvLyArCi0JCS8vIElQYXRoLlNFUEFSQVRPUgotCQkvLyArCi0JCS8vIGNvbnRlbnRTZXR0aW5nc05hbWU7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAoZGVsZXRlZEZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHRoaXMucHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAoZGVsZXRlZEZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChkZWxldGVkRmlsZSkpOwotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCS8vIHdoZW4gZGVsZXRlZEZpbGUgZW50cnkgZXhpc3RzLgotCQlpZiAoZGVsZXRlZEZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJZG9tT3BlcmF0b3IucmVtb3ZlRWxlbWVudFdpdGgodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQlkb21PcGVyYXRvci5yZW1vdmVFbGVtZW50V2l0aChnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChkZWxldGVkRmlsZSkpOwotCi0KLQkJLy8gd3JpdGUgZG9tIHRyZWUgaW50byAuY29udGVudHNldHRpbmdzCi0JCXRyeSB7Ci0JCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCi0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVsZXRlUHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybjsKLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCXJldHVybjsgLy8gd2hlbiAuY29udGVudHNldHRpbmdzLnhtbCBpcyBOT1QgZXhpc3QuCi0JCX0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCi0JCWlmIChlICE9IG51bGwpIHsKLQkJCWRvbU9wZXJhdG9yLnJlbW92ZUF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSk7Ci0JCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJCXRyeSB7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCi0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gZXhpc3RzQ29udGVudFNldHRpbmdzKCkgewotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlSZXNvdXJjZSBmaWxlID0gY3VyclByb2plY3QuZ2V0RmlsZShjb250ZW50U2V0dGluZ3NOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzUHJvcGVydGllcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCEocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIHdoZW4gLmNvbnRlbnRzZXR0aW5ncy54bWwgaXMgTk9UIGV4aXN0LgotCi0JCXRyeSB7Ci0JCQljcmVhdGVET01UcmVlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTWFwIHByb3BlcnRpZXMgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXByb3BlcnRpZXMucmVtb3ZlKGdldFBhdGhBdHRyKCkpOy8vIGlmIElGaWxlLHJlbW92ZWQKLQkJaWYgKHByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRTZXR0aW5nc1BhdGgoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyBwcm9qZWN0UGF0aCA9IGdldFByb2plY3RPZihyZXNvdXJjZSk7Ci0JCVN0cmluZ0J1ZmZlciBzdHJidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocHJvamVjdFBhdGggIT0gbnVsbCkgewotCQkJc3RyYnVmLmFwcGVuZChwcm9qZWN0UGF0aCk7Ci0JCQlzdHJidWYuYXBwZW5kKElQYXRoLlNFUEFSQVRPUik7Ci0JCQlzdHJidWYuYXBwZW5kKGNvbnRlbnRTZXR0aW5nc05hbWUpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBzdHIgPSBzdHJidWYudG9TdHJpbmcoKTsKLQkJc3RyYnVmLmRlbGV0ZSgwLCBzdHJidWYubGVuZ3RoKCkpOwotCQlyZXR1cm4gc3RyOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGF0aEF0dHIoKSB7Ci0JCXJldHVybiBQQVRIQVRUUjsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGdldFByb2plY3RPZihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gaWYgKHJlc291cmNlPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJY3VyclByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCS8vIFN0cmluZyBwcm9qZWN0UGF0aD1udWxsOwotCi0JCUlQYXRoIHBhdGggPSBjdXJyUHJvamVjdC5nZXRMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCXBhdGggPSBwYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKGN1cnJQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChwYXRoICE9IG51bGwpID8gcGF0aC50b1N0cmluZygpIDogbnVsbDsKLQotCX0KLQotCi0JcHVibGljIHN5bmNocm9uaXplZCBNYXAgZ2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQkJfQotCi0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJdHJ5IHsKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfQotCi0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCi0JCWlmIChlICE9IG51bGwpIHsKLQotCQkJTWFwIHByb3BlcnRpZXMgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcHJvcGVydGllcy5yZW1vdmUoZ2V0UGF0aEF0dHIoKSk7Ci0JCQlyZXR1cm4gcHJvcGVydGllczsKLQkJfQotCQllbHNlIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybiBudWxsOy8vIHdoZW4gcHJvamVjdCBvciBmaWxlIGVsZW1lbnQgaXMgTk9UIGV4aXN0LgotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCEocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gd2hlbiAuY29udGVudHNldHRpbmdzLnhtbCBpcyBOT1QgZXhpc3QuCi0JCX0KLQotCi0JCXRyeSB7Ci0JCQljcmVhdGVET01UcmVlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQkvLyBjcmVhdGUgRE9NIHRyZWUgZm9yIG5ldyBYTUwgRG9jdW1lbnQKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0KLQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQkvLyBzZWxlY3QgcHJvamVjdCBlbGVtZW50IGFuZCBnZXQgYXR0cmlidXRlCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0KLQotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZS5nZXRBdHRyaWJ1dGUocHJvcGVydHlOYW1lKTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm4gbnVsbDsvLyB3aGVuIHByb2plY3Qgb3IgZmlsZSBlbGVtZW50IGlzIE5PVCBleGlzdC4KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaWYgcmVzb3VyY2UgaXMgcHJvamVjdCBvciB3b3Jrc3BhY2Ugcm9vdAotCQlTdHJpbmcgcmVzb3VyY2VQYXRoID0gcGF0aC50b1N0cmluZygpOwotCi0JCXJldHVybiByZXNvdXJjZVBhdGg7Ci0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUNhY2hlKCkgewotCQlkb21PcGVyYXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBNYXAgcHJvcGVydGllcykgewotCQkvLyBkZW55IHRvIHNldCAicGF0aCIgYXR0cmlidXRlIHZhbHVlLgotCQlTZXQga2V5cyA9IHByb3BlcnRpZXMua2V5U2V0KCk7Ci0JCUl0ZXJhdG9yIGlpID0ga2V5cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaWkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAodGhpcy5nZXRQYXRoQXR0cigpLmVxdWFscyhpaS5uZXh0KCkpKQotCQkJCXJldHVybjsKLQkJfQotCQl0aGlzLl9zZXRQcm9wZXJ0aWVzKHJlc291cmNlLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQkvLyBkZW55IHRvIHNldCAicGF0aCIgYXR0cmlidXRlIHZhbHVlLgotCQlpZiAodGhpcy5nZXRQYXRoQXR0cigpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotCQkJcmV0dXJuOwotCQl0aGlzLl9zZXRQcm9wZXJ0eShyZXNvdXJjZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVET01Eb2N1bWVudCgpIHRocm93cyBTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWRvbU9wZXJhdG9yLndyaXRlRG9jdW1lbnQob3V0cHV0U3RyZWFtKTsKLQkJCW91dHB1dFN0cmVhbS5mbHVzaCgpOwotCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQotCQkJSUZpbGUgb3V0cHV0RmlsZSA9IGN1cnJQcm9qZWN0LmdldEZpbGUoY29udGVudFNldHRpbmdzTmFtZSk7Ci0JCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkKLQkJCQlvdXRwdXRGaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJCWVsc2UKLQkJCQlvdXRwdXRGaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0KLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKCJpbnZhbGlkIG91dHB1dEZpbGUgaW4gd3JpdGVET01Eb2N1bWVudCgpIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgbmV3IFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oImludmFsaWQgb3V0cHV0U3RyZWFtIG9yIGlucHV0U3RyZWFtIGluIHdyaXRlRE9NRG9jdW1lbnQoKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTgzMjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdCBleHRlbmRzIEFic3RyYWN0U3ViamVjdCB7Ci0KLQotCXByaXZhdGUgc3RhdGljIElOb3RpZnkgbm90aWZ5OwotCXByaXZhdGUgc3RhdGljIElTdWJqZWN0IHN1YmplY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElOb3RpZnkgZ2V0Tm90aWZ5KCkgewotCQlpZiAobm90aWZ5ID09IG51bGwgJiYgc3ViamVjdCA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuY2xhc3MpIHsKLQkJCQlpZiAobm90aWZ5ID09IG51bGwgJiYgc3ViamVjdCA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmeSA9IG5ldyBDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0KCk7Ci0JCQkJCXN1YmplY3QgPSAoSVN1YmplY3QpIG5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbm90aWZ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN1YmplY3QgZ2V0U3ViamVjdCgpIHsKLQkJaWYgKHN1YmplY3QgPT0gbnVsbCAmJiBub3RpZnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmNsYXNzKSB7Ci0JCQkJaWYgKHN1YmplY3QgPT0gbnVsbCAmJiBub3RpZnkgPT0gbnVsbCkgewotCQkJCQlzdWJqZWN0ID0gbmV3IENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QoKTsKLQkJCQkJbm90aWZ5ID0gKElOb3RpZnkpIHN1YmplY3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdWJqZWN0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSkgewotCQlzdXBlci5ub3RpZnlMaXN0ZW5lcnMoY2hhbmdlZFJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMWUzMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3NDcmVhdG9yIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSUNvbnRlbnRTZXR0aW5ncyBjcmVhdGUoKSB7Ci0JCXJldHVybiBDb250ZW50U2V0dGluZ3MuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NGaWxlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM4M2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0qIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0qLwotY2xhc3MgQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIgewotCi0KLQotCXByaXZhdGUgTWFwIHByb3BlcnRpZXM7Ci0KLQotCXByaXZhdGUgdm9pZCBnZXRQcm9wZXJ0aWVzKElSZXNvdXJjZSBmaWxlKSB7Ci0JCXByb3BlcnRpZXMgPSBnZXRDb250ZW50U2V0dGluZ3MoKS5nZXRQcm9wZXJ0aWVzKGZpbGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlQWRkZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZGVkKCkgewotCQlzdXBlci5oYW5kbGVBZGRlZCgpOwotCi0JCWlmIChzdXBlci5nZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVtdS0+Y29weS0+Y3JlYXRlIGZpbGUgd2l0aG91dCBvdmVycmlkZSwgbmV3IGZpbGUsCi0JCQkvLyBpbXBvcnQgd2l0aG91dCBvdmVycmlkZQotCQkJLy8gY29weSxuZXcsaW1wb3J0IGhhcyBzYW1lIGtpbmQoPTEpIGFuZCBmbGFnKD0wKS4KLQotCQl9IGVsc2UgaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW51LT4gcmVuYW1lIHdpdGhvdXQgb3ZlcnJpZGUscHVsbGRvd24gbWVudS0+bW92ZQotCQkJLy8gd2l0aG91dCBvdmVycmlkZQotCQkJLy8gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZCxoYW5kbGVSZW1vdmVkKCkgd29ya3MgZm9yIHRoaXMgZGVsdGEKLQotCQl9Ci0KLQl9Ci0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZCgpIHsKLQkJLy8gZWRpdAotCQlpZiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSAwKSB7Ci0JCQlzdXBlci5oYW5kbGVDaGFuZ2VkKCk7Ci0KLQkJfSBlbHNlIGlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpICE9IDApIHsKLQkJCS8vIG92ZXJyaWRlIGFzIGEgcmVzdWx0IG9mIGNvcHkgb3IgaW1wb3J0Ci0JCQkvLyBpbiBXZWIgcHJvamVjdCwgY29weSB3aXRoIG92ZXJyaWRlIGRvZXNuJ3QgaGFwcGVuCi0KLQkJCS8vIG92ZXJyaWRlIGFzIG1vdmUgb3IgcmVuYW1lCi0JCQkvLyBoYW5kbGVSZW1vdmVkKCkgd29ya3MgZm9yIHRoaXMgZGVsdGEKLQkJCXN1cGVyLmhhbmRsZUNoYW5nZWQoKTsKLQotCQl9Ci0KLQotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlUmVtb3ZlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZCgpIHsKLQkJc3VwZXIuaGFuZGxlUmVtb3ZlZCgpOwotCQlJRmlsZSBkZWxldGVkRmlsZSA9IG51bGw7Ci0KLQkJLy8gaWYgZW50cnkgZXhpc3RzIHRoZW4gcmVtb3ZlIGl0LgotCQlpZiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPmRlbGV0ZQotCQkJZGVsZXRlZEZpbGUgPSAoSUZpbGUpIGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKTsKLQotCQkJaWYgKGRlbGV0ZWRGaWxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZ2V0Q29udGVudFNldHRpbmdzKCkuZGVsZXRlQWxsUHJvcGVydGllcyhkZWxldGVkRmlsZSk7Ci0KLQkJCWdldENvbnRlbnRTZXR0aW5ncygpLnJlbGVhc2VDYWNoZSgpOwotCQl9Ci0KLQkJZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7Ci0KLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUsIHB1bGxkb3duIG1lbnUtPm1vdmUKLQkJCWRlbGV0ZWRGaWxlID0gKElGaWxlKSBnZXREZWx0YSgpLmdldFJlc291cmNlKCk7Ci0JCQlnZXRQcm9wZXJ0aWVzKGRlbGV0ZWRGaWxlKTsKLQotCQkJLy8gZ2V0IGRlc3RpbmF0aW9uIElSZXNvdXJjZQotCQkJSVBhdGggdGFyZ2V0UGF0aCA9IGdldERlbHRhKCkuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCUlXb3Jrc3BhY2VSb290IGl3ciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUmVzb3VyY2UgdGFyZ2V0RmlsZSA9IGl3ci5nZXRGaWxlKHRhcmdldFBhdGgpOy8vaXdyLmZpbmRNZW1iZXIodGFyZ2V0UGF0aCk7Ci0KLQkJCS8vIHNldCBwcm9wZXJ0eSBvZiBkZXN0aW5hdGlvbiBmaWxlCi0JCQlnZXRDb250ZW50U2V0dGluZ3MoKS5kZWxldGVBbGxQcm9wZXJ0aWVzKHRhcmdldEZpbGUpOwotCQkJc2V0UHJvcGVydGllcyh0YXJnZXRGaWxlKTsKLQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0JCQkJcHJvcGVydGllcy5jbGVhcigpOwotCQkJcHJvcGVydGllcyA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZGVsZXRlZEZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0Q29udGVudFNldHRpbmdzKCkuZGVsZXRlQWxsUHJvcGVydGllcyhkZWxldGVkRmlsZSk7Ci0KLQkJZ2V0Q29udGVudFNldHRpbmdzKCkucmVsZWFzZUNhY2hlKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvcGVydGllcyhJUmVzb3VyY2UgZmlsZSkgewotCQlpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCEoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgic2h0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImh0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiamh0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgieGh0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImNzcyIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc2YiKS8vJE5PTi1OTFMtMSQKLQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwZiIpKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWdldENvbnRlbnRTZXR0aW5ncygpLnNldFByb3BlcnRpZXMoZmlsZSwgcHJvcGVydGllcyk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTZWxmSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFlZTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElOb3RpZnkgbm90aWZ5Oy8vID0gbmV3IENvbnRlbnRTZXR0aW5nc0NoYW5nZWRTdWJqZWN0KCk7Ci0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBnZXRTdWJqZWN0KCkgewotCQlub3RpZnkgPSBDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmdldE5vdGlmeSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlQWRkZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZGVkKCkgewotCQlnZXRTdWJqZWN0KCk7Ci0JCWlmIChzdXBlci5nZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVtdS0+Y29weS0+Y3JlYXRlIGZpbGUgd2l0aG91dCBvdmVycmlkZSwgbmV3IGZpbGUsCi0JCQkvLyBwcm9wZXJ0eSBwYWdlIGNyZWF0ZSAuY29udGVudHNldHRpbmdzCi0JCQlzdXBlci5oYW5kbGVBZGRlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0gZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICE9IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUgd2l0aG91dCBvdmVycmlkZSxwdWxsZG93biBtZW51LT5tb3ZlCi0JCQkvLyB3aXRob3V0IG92ZXJyaWRlCi0JCQlzdXBlci5oYW5kbGVBZGRlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0KLQotCX0KLQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVDaGFuZ2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkKCkgewotCQlnZXRTdWJqZWN0KCk7Ci0JCWlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IDApIHsKLQkJCS8vIHJlc3VsdCBvZiBlZGl0LCBwcm9wZXJ0eSBwYWdlIG9wZXJhdGUgc2V0UHJvcGVydHkoYXBwbHkgb3Igb2sKLQkJCS8vIGJ1dHRvbikgaW4gLmNvbnRlbnRzZXR0aW5ncwotCQkJc3VwZXIuaGFuZGxlQ2hhbmdlZCgpOwotCi0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfSBlbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpICE9IDApIHsKLQkJCXN1cGVyLmhhbmRsZUNoYW5nZWQoKTsKLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9Ci0KLQotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlUmVtb3ZlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZCgpIHsKLQkJZ2V0U3ViamVjdCgpOwotCQlpZiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPmRlbGV0ZQotCQkJc3VwZXIuaGFuZGxlUmVtb3ZlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0gZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW51LT4gcmVuYW1lLCBwdWxsZG93biBtZW51LT5tb3ZlCi0JCQlzdXBlci5oYW5kbGVSZW1vdmVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGY1YmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQljbGFzcyBDb250ZW50U2V0dGluZ3NWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gcmVkZWZpbml0aW9uIGluIENvbnRlbnRTZXR0aW5ncy5qYXZhCi0JCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTZXR0aW5nc05hbWUgPSBDb250ZW50U2V0dGluZ3MuZ2V0Q29udGVudFNldHRpbmdzTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlRXZlbnQgZkV2ZW50OwotCQlwcml2YXRlIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIGhhbmRsZXI7Ci0KLQkJcHVibGljIENvbnRlbnRTZXR0aW5nc1Zpc2l0b3IoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuZkV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIHBhcmVudCBmb2xkZXIgb3IgcHJvamVjdAotCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgPT0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWZpbmFsIGludCByZXNvdXJjZVR5cGUgPSByZXNvdXJjZS5nZXRUeXBlKCk7Ci0JCQlzd2l0Y2ggKHJlc291cmNlVHlwZSkgewotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCS8vIHdoZXRoZXIgcmVzb3VyY2UgaXMgLmNvbnRlbnRzZXR0aW5ncyBmaWxlIG9yIG5vdAotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmICh0aGlzLmZFdmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgJiYgcmVzb3VyY2UuZXF1YWxzKHByb2plY3QuZ2V0RmlsZSh0aGlzLmNvbnRlbnRTZXR0aW5nc05hbWUpKSkgewotCQkJCQkJLy8gbmV3IG9iamVjdCBmb3IgLmNvbnRlbnRzZXR0aW5ncwotCQkJCQkJaGFuZGxlciA9IG5ldyBDb250ZW50U2V0dGluZ3NTZWxmSGFuZGxlcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRoaXMuZkV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgJiYgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLQkJCQkJCS8vIFRPRE8gY2hhbmdlIHRvIGNvbnRlbnQgdHlwZSEKLQkJCQkJCWlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgic2h0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImh0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiamh0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgieGh0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImNzcyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc2YiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBuZXcgb2JqZWN0IGZvciBJRmlsZQotCQkJCQkJCWhhbmRsZXIgPSBuZXcgQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIoKTsKLQkJCQkJCQloYW5kbGVyLmhhbmRsZShkZWx0YSk7Ci0JCQkJCQkJaGFuZGxlciA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyB0cnVlIG9yIGZhbHNlO21vdG9tb3RvIHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLS8vCQkJZmluYWwgSVJlc291cmNlRGVsdGEgZkRlbHRhID0gZGVsdGE7Ci0vLwkJCWZpbmFsIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIGRlbHRhSGFuZGxlciA9IHRoaXMuaGFuZGxlcjsKLQkJCS8vIFhYWCBGSVhNRQotCQkJLy8gSSBjb21tZW50ZWQgb3V0IGZvbGxvd2luZyB0byBtb3ZlIHRoaXMgdG8gIm1vZGVsIiAKLQkJCS8vIHBhY2thZ2VzLiBTaW5jZSB3YXNudCd0IGhvb2tlZCB1cC93b3JraW5nIGFueXdheSwgSSB0aGluayAKLQkJCS8vIG9rIGZvciBub3csIGJ1dCBuZWVkIHRvIHJlLXdvcmsgYXMgSm9iLCBvbmNlIHdlIGRvIGltcGxlbWVudCAKLQkJCS8vIHNldHRpbmdzIGZvciByZXNvdXJjZXMgYWdhaW4uIAotLy8JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0vLwkJCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0vLwkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJCQlpZiAoZGVsdGFIYW5kbGVyICE9IG51bGwpIHsKLS8vCQkJCQkJCWRlbHRhSGFuZGxlci5oYW5kbGUoZkRlbHRhKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0pOwotLy8JCQl9Ci0vLwkJCWVsc2UgaWYgKGRlbHRhSGFuZGxlciAhPSBudWxsKSB7Ci0vLwkJCQlkZWx0YUhhbmRsZXIuaGFuZGxlKGZEZWx0YSk7Ci0vLwkJCX0KLQkJCWhhbmRsZXIgPSBudWxsOwotCQkJcmV0dXJuIHRydWU7IC8vIHRydWUgb3IgZmFsc2U7bW90b21vdG8gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIENvbnRlbnRTZXR0aW5nc1Zpc2l0b3IgY3NWaXNpdG9yOwotCXByaXZhdGUgYm9vbGVhbiBmTGlzdGVuaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQotCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zdGFsbCgpIHsKLQkJaWYgKCFmTGlzdGVuaW5nKSB7Ci0JCQlnZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJCWZMaXN0ZW5pbmcgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0xpc3RlbmluZygpIHsKLQkJcmV0dXJuIGZMaXN0ZW5pbmc7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY3NWaXNpdG9yID09IG51bGwpCi0JCQkJCWNzVmlzaXRvciA9IG5ldyBDb250ZW50U2V0dGluZ3NWaXNpdG9yKGV2ZW50KTsKLQkJCQlkZWx0YS5hY2NlcHQoY3NWaXNpdG9yKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWNzVmlzaXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVuSW5zdGFsbCgpIHsKLQkJZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZkxpc3RlbmluZyA9IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwYmI0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFNldHRpbmdzIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIENTU19QUk9GSUxFID0gImNzcy1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1BST0ZJTEUgPSAidGFyZ2V0LWRldmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRSA9ICJkb2N1bWVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgSFRNTF9ET0NVTUVOVF9UWVBFID0gImh0bWwtZG9jdW1lbnQtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIGRlbGV0ZWRGaWxlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNQcm9wZXJ0aWVzKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgY2FjaGUgb2YgRE9NIHRyZWUgaW4gLmNvbnRlbnRzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDYWNoZSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIE1hcCBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjY2U0MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0qIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0qLwotaW50ZXJmYWNlIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIHsKLQotCXB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODFhZGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciB7Ci0KLQl2b2lkIGNvbnRlbnRTZXR0aW5nc0NoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSU5vdGlmeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSU5vdGlmeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhkZTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lOb3RpZnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1pbnRlcmZhY2UgSU5vdGlmeSB7Ci0KLQl2b2lkIG5vdGlmeUxpc3RlbmVycyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgcmVzb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lTdWJqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MWE1YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdWJqZWN0IHsKLQotCXZvaWQgYWRkTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvU2ltcGxlTm9kZU9wZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9TaW1wbGVOb2RlT3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyMzFkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9TaW1wbGVOb2RlT3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWNsYXNzIFNpbXBsZU5vZGVPcGVyYXRvciB7Ci0KLQljbGFzcyBDcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcmVhc29uKSB7Ci0JCQlzdXBlcihyZWFzb24pOwotCQl9Ci0JfQotCi0KLQljbGFzcyBSZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKLQkJCXN1cGVyKHJlYXNvbik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKLQkJCXN1cGVyKHJlYXNvbik7Ci0JCX0KLQl9Ci0KLQkvLyB3cml0ZXIgY2xhc3MgZm9yIC5jb250ZW50U2V0dGluZ3MuCi0JY2xhc3MgWE1MRG9jdW1lbnRXcml0ZXIgewotCQlPdXRwdXRTdHJlYW0gZk91dDsKLQotCQlwcm90ZWN0ZWQgWE1MRG9jdW1lbnRXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgewotCQkJdGhpcy5mT3V0ID0gb3V0OwotCQl9Ci0KLQkJcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2xvc2UoKSB7Ci0JCQl0cnkgewotCQkJCWZPdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nLCBzaG91bGRuJ3QgbWF0dGVyCi0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRG9jdW1lbnQgc291cmNlRG9jdW1lbnQpIHRocm93cyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQkJLy8gSkFYUCB0cmFuc2Zvcm1hdGlvbgotCQkJU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2Uoc291cmNlRG9jdW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLQkJCQl0cnkgewotCQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkvLyB1bnN1cHBvcnRlZCBwcm9wZXJ0aWVzCi0JCQkJfQotCQkJCXNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChmT3V0KSk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCQl0aHJvdyBuZXcgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU2ltcGxlTm9kZU9wZXJhdG9yIGEgPSBudWxsOwotCQl0cnkgewotCQkJYSA9IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IoIndvcmtzcGFjZS9vcmcuZWNsaXBzZS5leGFtcGxlcy5jb250ZW50c2V0dGluZ3MvLmNvbnRlbnRzZXR0aW5ncy54bWwiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXhpdCgwKTsKLQkJfQotCi0JCS8vIHByaW50IGFsbCBFbGVtZW50cwotCQkvL2EucHJpbnRUcmVlKGl0ZXIpOwotCi0JCS8vIGFkZCBFbGVtZW50Ci0JCU1hcCBhdHRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWF0dE1hcC5wdXQoInBhdGgiLCAiaG9nZXBhdGgiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXR0TWFwLnB1dCgiZkRvY3VtZW50LXR5cGUiLCAiZG9jdW1lbnRob2dlaG9nZSIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhLmFkZEVsZW1lbnRVbmRlclJvb3QoImZpbGUiLCBhdHRNYXApOy8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJYS53cml0ZURvY3VtZW50KFN5c3RlbS5vdXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQotCX0KLQotCS8vbmV2ZXIgdXNlZAotCS8vcHJpdmF0ZSBET01QYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgTm9kZSByb290OwotCi0JcHJpdmF0ZSBTdHJpbmcgc2V0dGluZ3NGaWxlTmFtZTsKLQotCi0JcHVibGljIFNpbXBsZU5vZGVPcGVyYXRvcihEb2N1bWVudCBkb2MpIHRocm93cyBDcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQotCQlpZiAoZG9jID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiRG9jdW1lbnQgZG9jPT1udWxsIik7Ly8kTk9OLU5MUy0xJAotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JCXJvb3QgPSBmRG9jdW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiTm9kZSByb290PT1udWxsIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTaW1wbGVOb2RlT3BlcmF0b3IoU3RyaW5nIGZ1bGxQYXRoKSB0aHJvd3MgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQl0aGlzLnNldHRpbmdzRmlsZU5hbWUgPSBmdWxsUGF0aDsKLQkJY3JlYXRlT2JqZWN0T2ZEb2N1bWVudCgpOwotCX0KLQotCS8vIGFkZCBhdHRyaWJ1dGUoYXR0TmFtZT1hdHRWYWx1ZSkgb2YgZWxlIHdpdGhvdXQgY2hlY2tpbmcgb3ZlcmxhcHBpbmcgb2YKLQkvLyBhbm90aGVyIGF0dHJpYnV0ZXMgb2YgZWxlLgotCS8vIGlmIG92ZXJsYXBwaW5nICxvdmVycmlkZQotCXByb3RlY3RlZCBOb2RlIGFkZEF0dHJpYnV0ZUF0KEVsZW1lbnQgZWxlLCBTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCUF0dHIgYXR0ID0gZkRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHROYW1lKTsKLQkJYXR0LnNldFZhbHVlKGF0dFZhbHVlKTsKLQkJaWYgKGVsZSAhPSBudWxsKQotCQkJZWxlLnNldEF0dHJpYnV0ZU5vZGUoYXR0KTsKLQkJcmV0dXJuIGVsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBhZGRFbGVtZW50VW5kZXIoTm9kZSBwYXJlbnQsIFN0cmluZyB0YWdOYW1lLCBNYXAgYXR0TWFwKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCB0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudCBlID0gZkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCWlmIChhdHRNYXAgIT0gbnVsbCkgewotCQkJaWYgKCFhdHRNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJU2V0IGF0dEtleXMgPSBhdHRNYXAua2V5U2V0KCk7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGF0dEtleXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQllLnNldEF0dHJpYnV0ZShrZXksIChTdHJpbmcpIGF0dE1hcC5nZXQoa2V5KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXBhcmVudC5hcHBlbmRDaGlsZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIE5vZGUgYWRkRWxlbWVudFVuZGVyUm9vdChTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gYWRkRWxlbWVudFVuZGVyKHJvb3QsIHRhZ05hbWUsIG51bGwpOwotCX0KLQotCS8vIGFkZCBlbGVtZW50IHdpdGggYXR0TWFwIGFzIGF0dHJpYnV0ZSB3aXRob3V0IGNoZWNraW5nIG92ZXJsYXBwaW5nLgotCXByb3RlY3RlZCBmaW5hbCBOb2RlIGFkZEVsZW1lbnRVbmRlclJvb3QoU3RyaW5nIHRhZ05hbWUsIE1hcCBhdHRNYXApIHsKLQkJcmV0dXJuIGFkZEVsZW1lbnRVbmRlcihyb290LCB0YWdOYW1lLCBhdHRNYXApOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVPYmplY3RPZkRvY3VtZW50KCkgdGhyb3dzIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZEb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgRmlsZShzZXR0aW5nc0ZpbGVOYW1lKSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gcGFyc2luZyIgKyBzZXR0aW5nc0ZpbGVOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJJL08gZXhjZXB0aW9uIHBhcnNpbmciICsgc2V0dGluZ3NGaWxlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gYWNjZXNzaW5nIERPTUltcGxlbWVudGF0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gYWNjZXNzaW5nIERPTUltcGxlbWVudGF0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvL2dldCB0aGUgcm9vdCBvZiB0aGUgWE1MIGZEb2N1bWVudAotCQlyb290ID0gZkRvY3VtZW50LmdldExhc3RDaGlsZCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oIkVycm9yOiBOb2RlIHJvb3Q9PW51bGwiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldEF0dHJpYnV0ZXNPZihOb2RlIG5vZGUpIHsKLQkJaWYgKCFub2RlLmhhc0F0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gYXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCW1hcC5wdXQoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIChtYXApOwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShOb2RlIGZpcnN0LCBTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCU5vZGUgbmF2cG9pbnQgPSBmaXJzdDsKLQkJd2hpbGUgKG5hdnBvaW50ICE9IG51bGwpIHsKLQkJCWlmIChuYXZwb2ludC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJTmFtZWROb2RlTWFwIG0gPSBuYXZwb2ludC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaWYgKG0gPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKG0uZ2V0TmFtZWRJdGVtKGF0dE5hbWUpICE9IG51bGwpIHsKLQkJCQkJaWYgKGF0dFZhbHVlLmVxdWFscygoKEF0dHIpIG0uZ2V0TmFtZWRJdGVtKGF0dE5hbWUpKS5nZXROb2RlVmFsdWUoKSkpCi0JCQkJCQlyZXR1cm4gbmF2cG9pbnQ7Ci0JCQkJfQotCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuYXZwb2ludC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCAmJiBjaGlsZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQlOb2RlIGhvbGROb2RlID0gZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUobmF2cG9pbnQuZ2V0Rmlyc3RDaGlsZCgpLCBhdHROYW1lLCBhdHRWYWx1ZSk7Ci0JCQkJCWlmIChob2xkTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gaG9sZE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQluYXZwb2ludCA9IG5hdnBvaW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyByZXR1cm4gYSAoZmlyc3QpIEVsZW1lbnQgd2l0aCBhdHRyKGF0dE5hbWU9YXR0VmFsdWUpIGl0IGlmIGV4aXN0cywKLQkvLyBvdGhlcndpc2UgcmV0dXJuIG51bGwKLQlwcm90ZWN0ZWQgTm9kZSBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCWlmIChhdHROYW1lID09IG51bGwgfHwgYXR0VmFsdWUgPT0gbnVsbCB8fCAhZkRvY3VtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZkRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotCX0KLQotCS8vIHJldHJ1biBFbGVtZW50IHdoaWNoIGhhcyBub2RlTmFtZSBhcyBOb2RlIE5hbWUKLQlwcm90ZWN0ZWQgTm9kZSBnZXRFbGVtZW50V2l0aE5vZGVOYW1lKFN0cmluZyBub2RlTmFtZSkgewotCQlpZiAobm9kZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlTGlzdCBub2RlcyA9IGZEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShub2RlTmFtZSk7Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBub2Rlcy5pdGVtKDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50VHJlZShOb2RlSXRlcmF0b3IgaXRlcikgewotCQlOb2RlIG47Ci0JCXdoaWxlICgobiA9IGl0ZXIubmV4dE5vZGUoKSkgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG4uZ2V0Tm9kZU5hbWUoKSArICI6Iik7Ly8kTk9OLU5MUy0xJAotCQkJTmFtZWROb2RlTWFwIG0gPSBuLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChtID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG0uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVN0cmluZyBhdHROYW1lID0gbS5pdGVtKGkpLmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludCgiICIgKyBhdHROYW1lICsgIj0iICsgbS5pdGVtKGkpLmdldE5vZGVWYWx1ZSgpKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQkvLyByZW1vdmUgYXR0cmlidXRlKGF0dE5hbWUpIGF0IGVsZS4KLQlwcm90ZWN0ZWQgQXR0ciByZW1vdmVBdHRyaWJ1dGVBdChFbGVtZW50IGVsZSwgU3RyaW5nIGF0dE5hbWUpIHsKLQkJaWYgKGVsZSA9PSBudWxsIHx8IGF0dE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRyIGF0dCA9IGVsZS5nZXRBdHRyaWJ1dGVOb2RlKGF0dE5hbWUpOwotCQllbGUucmVtb3ZlQXR0cmlidXRlKGF0dE5hbWUpOwotCQlyZXR1cm4gYXR0OwotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50IHJlbW92ZUVsZW1lbnRXaXRoKFN0cmluZyBub2RlTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IGZEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShub2RlTmFtZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJbm9kZXMuaXRlbShpKS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQobm9kZXMuaXRlbShpKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmVtb3ZlIGEgKGZpcnN0KSBFbGVtZW50IHdpdGggYXR0cihhdHROYW1lPWF0dFZhbHVlKSBhbmQgcmV0dXJuIGl0IGlmCi0JLy8gZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGwKLQlwcm90ZWN0ZWQgRWxlbWVudCByZW1vdmVFbGVtZW50V2l0aChTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCWlmIChmRG9jdW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShhdHROYW1lLCBhdHRWYWx1ZSk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGVsZW1lbnQpOwotCQkJCXJldHVybiAoRWxlbWVudCkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8vIHVwZGF0ZSBhdHRyaWJ1dGUoYXR0TmFtZT1uZXdWYWx1ZSkgYXQgZWxlIGlmIGJvdGggZWxlIGFuZCBhdHRyaWJ1dGUgb2YKLQkvLyBlbGUgZXhpc3QKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBdHRyaWJ1dGVBdChFbGVtZW50IGVsZSwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlBdHRyIGF0dCA9IG51bGw7Ci0JCWlmIChlbGUgIT0gbnVsbCkKLQkJCWlmICgoYXR0ID0gZWxlLmdldEF0dHJpYnV0ZU5vZGUoYXR0TmFtZSkpICE9IG51bGwpCi0JCQkJYXR0LnNldFZhbHVlKG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZURvY3VtZW50KE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQlYTUxEb2N1bWVudFdyaXRlciB3cml0ZXIgPSBuZXcgWE1MRG9jdW1lbnRXcml0ZXIob3V0KTsKLQkJdHJ5IHsKLQkJCXdyaXRlci5zZXJpYWxpemUoZkRvY3VtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRJTy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZElPLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDk5OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZElPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVkSU8gewotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMTAyNCAqIDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTUFSS19TSVpFID0gTUFYX0JVRl9TSVpFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fU1BFQ19ERUZBVUxUID0gIk5vU3BlY0RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIG92ZXJyaWRlbkNoYXJzZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZXJlIGFyZSB0d28gd2VsbCBrbm93biB1bmRlcnN0b29kIGNhc2VzIHdoZXJlIHRoZSBzdGFuZGFyZC9kZWZhdWx0Ci0JICogSmF2YSBNYXBwaW5ncyBhcmUgbm90IHN1ZmZpY2llbnQuIChUaGFua3MgdG8gSGlyb3Rha2EgTWF0c3Vtb3RvIGZvcgotCSAqIHByb3ZpZGluZyB0aGVzZSB0d28pLiBJIGJlbGlldmUgdGhlcmUgYXJlIG90aGVycyB0aGF0IGluZGl2aWR1YWwKLQkgKiBjdXN0b21lcnMgaGF2ZSByZXF1ZXN0ZWQgdG8gb3ZlcnJpZGUgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMsIGJ1dCBJJ3ZlCi0JICogbG9zdCB0aGUgZGV0YWlscy4gVE9ETy1mdXR1cmU6IGRvY3VtZW50IHNvbWUgb2YgdGhvc2UgdXNlLWNhc2VzLgotCSAqIDwvcD4KLQkgKiA8dWw+Ci0JICogPGxpPklTTy04ODU5LTgtSTwvbGk+Ci0JICogPHA+Ci0JICogSW4gdGhlIGNvZGUgY29udmVyc2lvbiBwb2ludCBvZiB2aWV3LCBJU08tOTk1OS04IGFuZCBJU08tODg1OS04LUkgYXJlCi0JICogdGhlIHNhbWUuIEhvd2V2ZXIuIHRoZSByZXByZXNlbnRhdGlvbiBvbiB0aGUgYnJvd3NlciBpcyBkaWZmZXJlbnQuICgKLQkgKiBJdCdzIHZlcnkgdmVyeSBoYXJkIHRvIGV4cGxhaW4gdGhpcyBpbnRvIHRoZSB3b3JkcywgYnV0IG9uY2UgeW91IHdpbGwKLQkgKiBzZWUsIHlvdSB3aWxsIHVuZGVyc3RhbmQgaXQgOikgTWFueSBCaURpIEhUTUwvSlNQcyB1c2UgSVNPLTg4NTktOC1JIGluCi0JICogTUVUQS9wYWdlIGRpcmVjdGl2ZS4gU28gV1NBRCBuZWVkcyB0byBzdXBwb3J0IHRoaXMgZW5jb2RpbmcuCi0JICogPC9wPgotCSAqIDxsaT5YLVNKSVM8L2xpPgotCSAqIDxwPgotCSAqIEJlY2F1c2UgTW9zYWljL05hdmlnYXRvciAyLjAgc3VwcG9ydGVkIG9ubHkgWC1TSklTL1gtRVVDLUpQLCBsb3RzIG9mCi0JICogb2xkIEhUTUwgZmlsZXMgdXNlZCBYLVNKSVMvWC1FVUMtSlAgc28gdGhhdCB0aGUgY3VzdG9tZXJzIHN0aWxsIHdhbnQgdXMKLQkgKiB0byBzdXBwb3J0IHRoaXMgY29kZSBjb252ZXJzaW9uIGZvciBIVE1MIGZpbGVzLgotCSAqIDwvcD4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybiB0aGUgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgaWYgbm8gb3ZlcnJpZGVzLCBvdGhlcndpc2UgdGhlIGNoYXJzZXQKLQkgKiAgICAgICAgIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKi8KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWxpYmVyYXRseSAnZGVmYXVsdCBhY2Nlc3MnIHNpbmNlIGNsaWVudHMgc2hvdWxkIG5vdAotCSAqIG5lZWQgdG8gYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24gZGlyZWN0bHkuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdoYXQgd2FzIHBhc3NlZCBpbiwgaWYKLQkJLy8gdGhlcmUgYXJlIG5vCi0JCS8vIG92ZXJyaWRlcy4KLQkJU3RyaW5nIHJlc3VsdCA9IGRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JCVN0cmluZyBuZXdSZXN1bHQgPSBnZXRPdmVycmlkZW5DaGFyc2V0cygpLmdldFByb3BlcnR5KGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQlpZiAobmV3UmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5ld1Jlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGluZ01lbWVudG8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGJ5dGVbXSBkZXRlY3RlZEJvbSwgU3RyaW5nIGphdmFDaGFyc2V0TmFtZSwgU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyB1blN1cHBvcnRlZE5hbWUsIFN0cmluZyBzcGVjRGVmYXVsdEVuY29kaW5nLCBTdHJpbmcgcmVhc29uKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCXJlc3VsdC5zZXRKYXZhQ2hhcnNldE5hbWUoamF2YUNoYXJzZXROYW1lKTsKLQkJcmVzdWx0LnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJaWYgKHNwZWNEZWZhdWx0RW5jb2RpbmcgPT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoTk9fU1BFQ19ERUZBVUxUKTsKLQkJZWxzZQotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChzcGVjRGVmYXVsdEVuY29kaW5nKTsKLQkJaWYgKHVuU3VwcG9ydGVkTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0SW52YWxpZEVuY29kaW5nKHVuU3VwcG9ydGVkTmFtZSk7Ci0JCX0KLQkJLy8gY2hlY2sgaWYgdmFsaWQKLQkJdHJ5IHsKLQkJCUNoYXJzZXQuaXNTdXBwb3J0ZWQoamF2YUNoYXJzZXROYW1lKTsKLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcoamF2YUNoYXJzZXROYW1lKTsKLQkJfQotCi0JCS8vIGNoZWNrIFVURjgzQnl0ZUJPTVVzZWQgYW5kIFVuaWNvZGVTdHJlYW0KLQkJaWYgKGRldGVjdGVkQm9tICE9IG51bGwpIHsKLQkJCWlmIChkZXRlY3RlZEJvbS5sZW5ndGggPT0gMikKLQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCWVsc2UgaWYgKGRldGVjdGVkQm9tLmxlbmd0aCA9PSAzKQotCQkJCXJlc3VsdC5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQlyZXR1cm4gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUsIHJlYXNvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24sIFN0cmluZyBzcGVjRGVmYXVsdEVuY29kaW5nKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCXJlc3VsdCA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJU3RyaW5nIGphdmFDaGFyc2V0ID0gZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJcmVzdWx0LnNldEphdmFDaGFyc2V0TmFtZShqYXZhQ2hhcnNldCk7Ci0JCXJlc3VsdC5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWlmIChzcGVjRGVmYXVsdEVuY29kaW5nID09IG51bGwpCi0JCQlyZXN1bHQuc2V0QXBwcm9wcmlhdGVEZWZhdWx0KE5PX1NQRUNfREVGQVVMVCk7Ci0JCWVsc2UKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoc3BlY0RlZmF1bHRFbmNvZGluZyk7Ci0JCS8vIGNoZWNrIGlmIHZhbGlkCi0JCXRyeSB7Ci0JCQlDaGFyc2V0LmlzU3VwcG9ydGVkKGphdmFDaGFyc2V0KTsKLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcoamF2YUNoYXJzZXQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJLy8gd2UgZG9uJ3QgYWxsb3cgbnVsbCBhcmd1bWVudCAob3IgcmlzayBOUEUgb3IKLQkJLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGxhdGVyIGF0IHNldmVyYWwKLQkJLy8gcG9pbnRzLgotCQlBc3NlcnQuaXNOb3ROdWxsKGRldGVjdGVkQ2hhcnNldE5hbWUsICJpbGxlZ2FsIGNoYXJzZXQgYXJndW1lbnQuIGl0IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBkZXRlY3RlZENoYXJzZXROYW1lOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCS8vIE5vdGU6IHRoaXMgd2lsbCBpbW1lZGlhdGx5IHRocm93Ci0JCS8vICJVbnN1cHBvdGVkQ2hhcnNldEV4Y2VwdGlvbiIgaWYgaXQKLQkJLy8gaW52YWxpZC4gSXNzdWU6IElzIGl0IG1vcmUgY2xpZW50IGZyaWVuZGx5IHRvCi0JCS8vIGVhdCB0aGF0IGV4Y2VwdGlvbiBhbmQgcmV0dXJuIG51bGw/Ci0JCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKHJlc3VsdCk7Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG92ZXJyaWRlbkNoYXJzZXRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0T3ZlcnJpZGVuQ2hhcnNldHMoKSB7Ci0JCWlmIChvdmVycmlkZW5DaGFyc2V0cyA9PSBudWxsKSB7Ci0JCQlvdmVycmlkZW5DaGFyc2V0cyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlCdW5kbGUga2V5QnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKElDb2RlZFJlc291cmNlUGx1Z2luLklEKTsKLQkJCUlQYXRoIGtleVBhdGggPSBuZXcgUGF0aCgiY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJVVJMIGxvY2F0aW9uID0gUGxhdGZvcm0uZmluZChrZXlCdW5kbGUsIGtleVBhdGgpOwotCQkJSW5wdXRTdHJlYW0gcHJvcGVydGllc0lucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcHJvcGVydGllc0lucHV0U3RyZWFtID0gbG9jYXRpb24ub3BlblN0cmVhbSgpOwotCQkJCW92ZXJyaWRlbkNoYXJzZXRzLmxvYWQocHJvcGVydGllc0lucHV0U3RyZWFtKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBjYW4ndCByZWFkLCBqdXN0IGFzc3VtZSB0aGVyZSdzIG5vCi0JCQkJLy8gb3ZlcnJpZGVzCi0JCQkJLy8gYW5kIHJlcGVhdGVkIGF0dGVtcHRzIHdpbGwgbm90IG9jY3VyLAotCQkJCS8vIHNpbmNlIHRoZXkKLQkJCQkvLyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5Ci0JCQkJLy8gUHJvcGVydGllcyBvYmplY3QKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3ZlcnJpZGVuQ2hhcnNldHM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBuZWVkIG5vdCBiZSBpbnN0YW50aWF0ZWQgKHRob3VnaCBpdHMgc3ViY2xhc3NlcyBjYW4gYmUpLgotCSAqLwotCXByb3RlY3RlZCBDb2RlZElPKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gY3JlYXRlTWVtZW50byhJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbikgewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0OwotCQlTdHJpbmcgYXBwcm9wcmlhdGVEZWZhdWx0ID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJU3RyaW5nIGRldGVjdGVkQ2hhcnNldCA9IChTdHJpbmcpIGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCk7Ci0JCVN0cmluZyB1blN1cHBvcnRlZENoYXJzZXQgPSAoU3RyaW5nKSBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpOwotCQlTdHJpbmcgamF2YUNoYXJzZXQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhcnNldCgpOwotCQkvLyBpbnRlZ3JpdHkgY2hlY2tzIGZvciBkZWJ1Z2dpbmcKLQkJaWYgKGphdmFDaGFyc2V0ID09IG51bGwpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJjaGFyc2V0IGVxdWFsZWQgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGphdmFDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJjaGFyc2V0IGVxdWFsZWQgZW1wdHlTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlieXRlW10gQk9NID0gKGJ5dGVbXSkgY29udGVudERlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJLy9yZXN1bHQgPSAoRW5jb2RpbmdNZW1lbnRvKQotCQkvLyBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pOwotCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oQk9NLCBqYXZhQ2hhcnNldCwgZGV0ZWN0ZWRDaGFyc2V0LCB1blN1cHBvcnRlZENoYXJzZXQsIGFwcHJvcHJpYXRlRGVmYXVsdCwgbnVsbCk7Ci0JCWlmICghcmVzdWx0LmlzVmFsaWQoKSkgewotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChhcHByb3ByaWF0ZURlZmF1bHQpOwotCQkJLy8gaW50ZWdyaXR5IGNoZWNrIGZvciBkZWJ1Z2dpbmcgImludmFsaWQiIGNhc2VzLgotCQkJLy8gdGhlIGFwcHJyaWF0ZSBkZWZhdWx0IHdlIGhhdmUsIHNob3VsZCBlcXVhbCB3aGF0J3MgaW4gdGhlCi0JCQkvLyBkZXRlY3RlZCBmaWVsZC4gKG5vdCBzdXJlIHRoaXMgaXMgYWx3YXlzIHJlcXVpcmVkKQotCQkJaWYgKERFQlVHICYmIGFwcHJvcHJpYXRlRGVmYXVsdCAhPSBudWxsICYmICFhcHByb3ByaWF0ZURlZmF1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldCkpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiYXBwcm9wcmlhdGUgZGlkIG5vdCBlcXVhbCBkZXRlY3RlZCwgYXMgZXhwZWN0ZWQgZm9yIGludmFsaWQgY2hhcnNldCBjYXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkUmVhZGVyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmIyMTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5CdWZmZXJlZExpbWl0ZWRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLk51bGxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Vbmljb2RlQk9NRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsOwotCi0KLS8qKgotICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBjZW50cmFsaXplIGFuYWx5c2lzIG9mIGEgZmlsZSB0byBkZXRlcm1pbmUKLSAqIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHJ1bGVzIG9mIGRlY29kaW5nIGl0LiBUaGUgaW50ZW5kZWQgdXNlIGlzIHRvIHNldCB0aGUKLSAqIGlucHV0LCB0aGVuIGdldCB0aGUgcmVhZGVyIGZvciB0aGF0IGlucHV0IHdoaWNoIHdpbGwgaGF2ZSBpdHMgZW5jb2Rpbmcgc2V0Ci0gKiBhcHByb3ByaWF0ZWx5LiBBZGRpdGlvbmFsbHksIHRoZXJlIGlzIGFuIEVuY29kaW5nTWVtZW50byBwcm92aWRlZCwgd2hpY2gKLSAqIHdpbGwgYmUgcmVxdWlyZWQsIGluIHNvbWUgY2FzZXMsIHRvIGxhdGVyIGRldGVybWluZSB0aGUgbW9zdCBhcHByb3ByaWF0ZQotICogZm9ybSBvZiBlbmNvZGVkIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIENvZGVkUmVhZGVyQ3JlYXRvciBleHRlbmRzIENvZGVkSU8gewotCi0KLQlwcml2YXRlIGJvb2xlYW4gZkNsaWVudFN1cHBsaWVkU3RyZWFtOwotCi0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBFbmNvZGluZ1J1bGUgZkVuY29kaW5nUnVsZTsKLQotCXByaXZhdGUgU3RyaW5nIGZGaWxlbmFtZTsKLQotCXByaXZhdGUgSUZpbGUgZklGaWxlOwotCi0KLQlwcml2YXRlIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoKSB7Ci0KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRSZWFkZXJDcmVhdG9yKElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZSk7Ci0JCXNldEVuY29kaW5nUnVsZShFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcihJRmlsZSBmaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCXRoaXMoKTsKLQkJc2V0KGZpbGUpOwotCQlzZXRFbmNvZGluZ1J1bGUoZW5jb2RpbmdSdWxlKTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRSZWFkZXJDcmVhdG9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQotCQl0aGlzKCk7Ci0JCXNldChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQlzZXRFbmNvZGluZ1J1bGUoRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgewotCi0JCXRoaXMoKTsKLQkJc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCXNldEVuY29kaW5nUnVsZShlbmNvZGluZ1J1bGUpOwotCX0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGNoZWNrRm9yRW5jb2RpbmdJbkNvbnRlbnRzKElucHV0U3RyZWFtIGxpbWl0ZWRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCi0JCS8vIGlmIGVuY29kaW5nIG1lbWVudG8gYWxyZWFkeSBzZXQsIHRoZW4gaUZpbGUgbXVzdAotCQkvLyBoYXZlIGJlZW4gc2V0LCBhbmQgbm8gbmVlZCB0byBnZXQgYWdhaW4uCi0JCWlmIChmRW5jb2RpbmdNZW1lbnRvICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZkNsaWVudFN1cHBsaWVkU3RyZWFtKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbGltaXRlZFN0cmVhbS5yZXNldCgpOwotCQkJCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihsaW1pdGVkU3RyZWFtLCBmRmlsZW5hbWUsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCQl9Ci0JCQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlsaW1pdGVkU3RyZWFtLnJlc2V0KCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBzdGF0ZToKLQkJCQkvLyBlbmNvZGluZ01lbWVudG8gd2FzIG51bGwgYnV0IG5vIGlucHV0IHN0cmVhbSBzdXBwbGllZCBieQotCQkJCS8vIGNsaWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzVmFsaWQoKSAmJiAhZm9yY2VEZWZhdWx0KCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKHJlc3VsdCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNldHRhYmxlTGltaXRlZFN0cmVhbQotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGNoZWNrU3RyZWFtRm9yQk9NKElucHV0U3RyZWFtIHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlVbmljb2RlQk9NRW5jb2RpbmdEZXRlY3RvciB1bmljb2RlQk9NRW5jb2RpbmdEZXRlY3RvciA9IG5ldyBVbmljb2RlQk9NRW5jb2RpbmdEZXRlY3RvcigpOwotCQl1bmljb2RlQk9NRW5jb2RpbmdEZXRlY3Rvci5zZXQocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQlyZXN1bHQgPSB1bmljb2RlQk9NRW5jb2RpbmdEZXRlY3Rvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZmluZE1lbWVudG9Gcm9tRmlsZUNhc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJLy8gVGhpcyBtZXRob2QgcHJvdmlkZXMgcG9zc2libGUgaW1wcm92ZWQgcGVyZm9ybWFuY2UgYXQgdGhlCi0JCQkvLyBjb3N0IG9mIHNvbWV0aW1lcyByZXR1cm5pbmcgbnVsbAotCQkJaWYgKGZJRmlsZS5leGlzdHMoKSkKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBmSUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gQXNzdW1lIGlmIGNvcmUgZXhjZXB0aW9uIG9jY3Vycywgd2UgY2FuIHN0aWxsIHRyeSBtb3JlCi0JCQkvLyBleHBlbnNpdmUKLQkJCS8vIGRpc2NvdmVyeSBvcHRpb25zLgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwgJiYgZklGaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRzID0gZklGaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGZJRmlsZS5nZXROYW1lKCksIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gQXNzdW1lIGlmIGNvcmUgZXhjZXB0aW9uIG9jY3Vycywgd2UgY2FuJ3QgcmVhbGx5IGRvIG11Y2gKLQkJCQkvLyB3aXRoCi0JCQkJLy8gZGV0ZXJtaW5pbmcgZW5jb2RpbmcsIGV0Yy4KLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQl0aHJvdyBlMTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCS8vIFdlIGxpa2VseSBjb3VsZG4ndCBnZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLCBzb21ldGhpbmcKLQkJCQkvLyBpcyByZWFsbHkgd3JvbmcKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQl0aHJvdyBlMjsKLQkJCX0KLQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZU1lbWVudG8oY29udGVudERlc2NyaXB0aW9uKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgbWV0aG9kIHdoaWNoIGNvbnRhaW5zIHRoZSBoaWdoZXN0IGxldmVsIHJ1bGVzIGZvciBob3cgdG8KLQkgKiBkZWNpZGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgcnVsZXM6IDEuIGZpcnN0IGNoZWNrIGZvciB1bmljb2RlIHN0cmVhbSAyLgotCSAqIHRoZW4gbG9va2VkIGZvciBlbmNvZGluZyBzcGVjaWZpZWQgaW4gY29udGVudCAoYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mCi0JICogY29udGVudCB0aGF0IGlzIGl0IC4uLiB4bWwsIGh0bWwsIGpzcCwgZXRjLiAzLiB0aGVuIGNoZWNrIGZvciB2YXJpb3VzCi0JICogc2V0dGluZ3M6IGZpbGUgc2V0dGluZ3MgZmlyc3QsIGlmIG51bGwgY2hlY2sgcHJvamVjdCBzZXR0aW5ncywgaWYgbnVsbCwKLQkgKiBjaGVjayB1c2VyIHByZWZlcmVuY2VzLiA0LiBsYXN0bHkgKG9yLCB3aGF0IGlzIHRoZSBsYXN0IHVzZXIKLQkgKiBwcmVmZXJlbmNlKSBpcyB0byB1c2UgIndvcmtiZW5jaCBkZWZhdWx0cyIuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZpbmRNZW1lbnRvRnJvbVN0cmVhbUNhc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlTGltaXRlZFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNldHRhYmxlTGltaXRlZFN0cmVhbSA9IGdldExpbWl0ZWRTdHJlYW0oZ2V0UmVzZXR0YWJsZVN0cmVhbSgpKTsKLQkJCWlmIChyZXNldHRhYmxlTGltaXRlZFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJLy8gZmlyc3QgY2hlY2sgZm9yIHVuaWNvZGUgc3RyZWFtCi0JCQkJcmVzdWx0ID0gY2hlY2tTdHJlYW1Gb3JCT00ocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQkJCS8vIGlmIG5vdCB0aGF0LCB0aGVuIGNoZWNrIGNvbnRlbnRzCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc2V0dGFibGVMaW1pdGVkU3RyZWFtLnJlc2V0KCk7Ci0JCQkJCXJlc3VsdCA9IGNoZWNrRm9yRW5jb2RpbmdJbkNvbnRlbnRzKHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHN0cmVhbSBudWxsLCBtYXkgbmFtZSdzIG5vdC4KLQkJCQlpZiAoZkZpbGVuYW1lICE9IG51bGwpIHsKLQkJCQkJLy8gZmlsZW5hbWUgbm90IG51bGwKLQkJCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0RGVzY3JpcHRpb25Gb3IobmV3IE51bGxJbnB1dFN0cmVhbSgpLCBmRmlsZW5hbWUsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBjcmVhdGVNZW1lbnRvKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWhhbmRsZVN0cmVhbUNsb3NlKHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZURlZmF1bHQoKSB7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZFbmNvZGluZ1J1bGUgIT0gbnVsbCAmJiBmRW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUmVhZGVyIGdldENvZGVkUmVhZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlSZWFkZXIgcmVzdWx0ID0gbnVsbDsKLQkJLy8gd2UgbWFrZSBhIGxvY2FsIGNvcHkgb2YgZW5jb2RpbmcgbWVtZW50byBzbwotCQkvLyBzdHJlYW0gd29uJ3QKLQkJLy8gYmUgYWNjZXNzZWQgc2ltdWx0YW5lb3VzbHkuCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBnZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChlbmNvZGluZ01lbWVudG8sICJBcHBlYXJzIHJlYWRlciByZXF1ZXN0ZWQgYmVmb3JlIGZpbGUgb3Igc3RyZWFtIHNldCIpOyAvLyROT04tTkxTLTEkCi0JCUlucHV0U3RyZWFtIHN0cmVhbVRvUmV0dXJuID0gZ2V0UmVzZXR0YWJsZVN0cmVhbSgpOwotCQlzdHJlYW1Ub1JldHVybi5yZXNldCgpOwotCQkvLyBpZiBVVEYgMyBieXRlIEJPTSBpcyB1c2VkIChvciBVVEYtMTZMRSksIHRoZQotCQkvLyBidWlsdCBpbiBjb252ZXJ0ZXJzCi0JCS8vIGRvbid0Ci0JCS8vIGNvcnJlY3Qgc2tpcCBhbGwgdGhyZWUgYnl0ZXMgLi4uIHNvIHNraXAKLQkJLy8gcmVtYWluaW5nIG9uZSB0byBsZWF2ZQotCQkvLyBzdHJlYW0gdHJhbnNwYXJlbnRseSByZWFkeSBmb3IgY2xpZW50LgotCQkvLyBzZWUgLi4uIFRPRE8gbG9vayB1cCBidWcgbnVtYmVyCi0JCWlmIChlbmNvZGluZ01lbWVudG8uaXNVbmljb2RlU3RyZWFtKCkpIHsKLQkJCXN0cmVhbVRvUmV0dXJuLnNraXAoMik7Ci0JCX0KLQkJZWxzZSBpZiAoZW5jb2RpbmdNZW1lbnRvLmlzVVRGODNCeXRlQk9NVXNlZCgpKSB7Ci0JCQlzdHJlYW1Ub1JldHVybi5za2lwKDMpOwotCQl9Ci0JCVN0cmluZyBjaGFyc2V0TmFtZSA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJaWYgKGNoYXJzZXROYW1lID09IG51bGwpIHsKLQkJCWNoYXJzZXROYW1lID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJfQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkgJiYgIWZvcmNlRGVmYXVsdCgpKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChlbmNvZGluZ01lbWVudG8pOwotCQl9Ci0KLQkJaWYgKGZFbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpIHsKLQkJCWNoYXJzZXROYW1lID0gZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpOwotCQl9Ci0JCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7Ci0JCUNoYXJzZXREZWNvZGVyIGNoYXJzZXREZWNvZGVyID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7Ci0JCWlmIChmRW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikgewotCQkJY2hhcnNldERlY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJCWNoYXJzZXREZWNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJfQotCQllbHNlIHsKLQkJCWNoYXJzZXREZWNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJCWNoYXJzZXREZWNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQl9Ci0JCS8vIG1vcmUgZWZmaWNpZW50IHRvIGJlIGJ1ZmZlcmVkLCBhbmQgSSBrbm93IG9mIG5vCi0JCS8vIHJlYXNvbiBub3QgdG8gcmV0dXJuCi0JCS8vIHRoYXQgZGlyZWN0bHkuCi0JCXJlc3VsdCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtVG9SZXR1cm4sIGNoYXJzZXREZWNvZGVyKSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXN1bHQubWFyayhDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBmaWd1cmUgb3V0IGVuY29kaW5nIG1lbWVudG8gZnJvbSBlbmNvZGluZyBzdHJhdGVneQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQlpZiAoZkNsaWVudFN1cHBsaWVkU3RyZWFtKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50byA9IGZpbmRNZW1lbnRvRnJvbVN0cmVhbUNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50byA9IGZpbmRNZW1lbnRvRnJvbUZpbGVDYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiBlbmNvZGluZyBzdHJhdGFneSBkb2Vzbid0IHByb3ZpZGUgYW5zd2VyLAotCQkvLyB0aGVuIHRyeSBmaWxlIHNldHRpbmdzLCBwcm9qZWN0IHNldHRpbmdzLAotCQkvLyB1c2VyIHByZWZlcmVuY2VzLCBhbmQKLQkJLy8gZmluYWxseSB3b3JrYmVuY2ggZGVmYXVsdC4KLQkJLy8KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCB8fCBmRW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpOwotCQl9Ci0KLQkJLy8gdXNlIERlZmF1bHROYW1lUnVsZXMgZnJvbSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzIGFzIHRoZSBmaW5hbAotCQkvLyBkZWZhdWx0Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBoYW5kbGVOb3RQcm92aWRlZEZyb21Db250ZW50Q2FzZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSB3aGVuIGVuY29kaW5nIGlzIG5vdCBkZXRlY3RlZCBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBIZXJlIGlzIGVuY29kaW5nIGxvb2t1cCBvcmRlciB3ZSB3aWxsIHRyeTogLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIGRlc2NyaXB0aW9uIChFY2xpcHNlIFRleHQgZmlsZSBlbmNvZGluZykgLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIHByb3BlcnRpZXMgKGZvciBKU1Agb25seSkgLSB0cnkgY29udGVudCB0eXBlIGVuY29kaW5nIHByZWZlcmVuY2VzIChmb3IKLQkgKiBIVE1MIG9ubHkpIC0gdHJ5IHJlc291cmNlIGNvbnRlbnQgZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlCi0JICogZW5jb2RpbmcsIGltcGxpY2l0IGNoZWNrKQotCSAqIAotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGFwcGVhcnMgaW4gYm90aCBDb2RlZFJlYWRlckNyZWF0b3IgYW5kCi0JICogQ29kZWRTdHJlYW1DcmVhdG9yICh3aXRoIGp1c3QgYSBtaW5vciBkaWZmZXJlbmNlKS4gVGhleSBzaG91bGQgYmUga2VwdAotCSAqIHRoZSBzYW1lLgotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50b0Zyb21SZXNvdXJjZUFuZFByZWZlcmVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gZkVuY29kaW5nTWVtZW50bzsKLQotCQkvLyBGb2xsb3cgRWNsaXBzZSBQbGF0Zm9ybSdzIGRpcmVjdGlvbi4gR2V0IHRoZSBjaGFyc2V0IGZyb20gSUZpbGUuCi0JCWlmIChmSUZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNoYXJzZXQgPSBmSUZpbGUuZ2V0Q2hhcnNldCgpOwotCQkJZW5jb2RpbmdNZW1lbnRvID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhbiBJbnB1dFN0cmVhbSBoYXMgbWFyay9yZXNldCBzdXBwb3J0LCBpcyByZWFkbGltaXQgaXMKLQkgKiBzZXQsIGFuZCB0aGF0IHRoZSBzdHJlYW0gaXMgImxpbWl0YWJsZSIgKHRoYXQgaXMsIHJlcG9ydHMgImVuZCBvZgotCSAqIGlucHV0IiByYXRoZXIgdGhhbiBhbGxvdyBnb2luZyBwYXN0IG1hcmspLiBUaGlzIGlzIHZlcnkgc3BlY2lhbGl6ZWQKLQkgKiBzdHJlYW0gaW50cm9kdWNlZCB0byBvdmVyY29tZQotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzIxMS4gU2VlIGFsc28KLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg1NjUKLQkgKi8KLQlwcml2YXRlIElucHV0U3RyZWFtIGdldExpbWl0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsIGluc3RhbmNlb2YgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlJbnB1dFN0cmVhbSBzID0gbmV3IEJ1ZmZlcmVkTGltaXRlZFN0cmVhbShvcmlnaW5hbCwgQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJcy5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzZXR0YWJsZVN0cmVhbSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG51bGw7Ci0KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIG5vdGUgd2UgYWx3YXlzIGdldCBjb250ZW50cywgZXZlbiBpZiBvdXQgb2Ygc3luY2gKLQkJCQlpbnB1dFN0cmVhbSA9IGZJRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTSE9VTEQgYWN0dWFsbHkgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZgotCQkJCS8vIGZJU3RvcmFnZSwgYnV0Ci0JCQkJLy8gZm9yIG5vdyB3aWxsIGp1c3QgYXNzdW1lIGNvcmUgZXhjZXB0aW9uCi0JCQkJLy8gbWVhbnMgaXQKLQkJCQkvLyBkb2Vzbid0IGV4aXN0IG9uIGZpbGUgc3lzdGVtLCB5ZXQuCi0JCQkJLy8gYW5kIHdlJ2xsIGxvZywganVzdCBpbiBjYXNlIGl0cyBhIG5vdGVhYmxlIGVycm9yCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBOdWxsSW5wdXRTdHJlYW0oKTsKLQkJCX0KLQkJCXJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZJbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbSA9IGZJbnB1dFN0cmVhbTsKLQkJCQkJLy8gdHJ5IHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbS5yZXNldCgpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIC8vIGFzc3VtZWQganVzdCBoYXNuJ3QgYmVlbiBtYXJrZWQgeWV0LCBzbyBpZ25vcmUKLQkJCQkJLy8gfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZJbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZXNldHRhYmxlU3RyZWFtID09IG51bGwpIHsKLQkJCXJlc2V0dGFibGVTdHJlYW0gPSBuZXcgTnVsbElucHV0U3RyZWFtKCk7Ci0JCX0KLQotCQkvLyBtYXJrIHRoaXMgb25jZSwgc3RyZWFtIGF0ICJ6ZXJvIiBwb3NpdGlvbgotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiByZXNldHRhYmxlU3RyZWFtOwotCX0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCkgewotCi0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgc3BlY0RlZmF1bHQgPSBudWxsOwotCQkvLyB0cnkgewotCQkvLyBzcGVjRGVmYXVsdCA9IGdldEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCS8vIH0KLQkJLy8gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkvLyAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMsIGFzc3VtZXMgdGhlcmUgaXMKLQkJLy8gLy8gbm8gc3BlY0RlZmF1bHQKLQkJLy8gfQotCQkvLyBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMsIGFzc3VtZXMgdGhlcmUgaXMKLQkJLy8gLy8gbm8gc3BlY0RlZmF1bHQKLQkJLy8gfQotCQkvLyBmaW5hbGx5IHsKLQkJLy8gdHJ5IHsKLQkJLy8gaGFuZGxlU3RyZWFtQ2xvc2UoZkVuY29kaW5nRGV0ZWN0b3JTdHJlYW0pOwotCQkvLyB9Ci0JCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkvLyAvLyBzZXZlcmUgZXJyb3IsIG5vdCBtdWNoIHRvIGRvIGhlcmUKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHRoaXMgbG9naWMgc2hvdWxkIGJlIG1vdmVkIHRvICdkZXRlY3Rpb24nIGlmIG5vdCBhbHJlYWR5Ci0JCVN0cmluZyBjaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKHNwZWNEZWZhdWx0KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjaGFyc2V0LCAicG9zdCBjb25kaXRpb24gZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc2V0dGFibGVJbnB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3RyZWFtQ2xvc2UoSW5wdXRTdHJlYW0gcmVzZXR0YWJsZUlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChyZXNldHRhYmxlSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJaWYgKGZDbGllbnRTdXBwbGllZFN0cmVhbSkgewotCQkJCXJlc2V0dGFibGVJbnB1dFN0cmVhbS5yZXNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0KLQkJCQlyZXNldHRhYmxlSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIFRPRE8gV2UganVzdCBjb3B5IHRoZSBjb250ZW50IHByb3BlcnRpZXMgZW5jb2RpbmcgdG8gY3VycmVudCByZXNvdXJjZSdzCi0JLy8gZW5jb2RpbmcgZm9yIG5vdy4gTWF5IGltcHJvdmUgdGhlIFVJIGxhdGVyIGJ5IHNldHRpbmcgYW4gaW5mb3JtYXRpb25hbAotCS8vIG1lc3NhZ2UgYW5kL29yIGRpc2FibGUgdGhlIGNvbnRlbnQgcHJvcGVydGllcyBlbmNvZGluZyBmaWVsZC4KLQkvLyBUT0RPOiByZW1ha2UgcHJpdmF0ZSBlbHNlIHJlbW92ZQotCXZvaWQgbWlncmF0ZUNvbnRlbnRQcm9wZXJ0aWVzRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElGaWxlIGZpbGUgPSBmSUZpbGU7Ci0JCWZpbmFsIFN0cmluZyBjaGFyc2V0ID0gZW5jb2Rpbmc7Ci0JCS8vIFRPRE86IGV4dGVybmFsaXplIHN0cmluZyBsYXRlcgotCQlKb2IgbWlncmF0ZXIgPSBuZXcgSm9iKFNTRUNvcmVNZXNzYWdlcy5NaWdyYXRlX0NoYXJzZXQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbGUuc2V0Q2hhcnNldChjaGFyc2V0LCBudWxsKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQltaWdyYXRlci5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCW1pZ3JhdGVyLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCi0JCWZFbmNvZGluZ1J1bGUgPSBudWxsOwotCQlmSUZpbGUgPSBudWxsOwotCQlmRmlsZW5hbWUgPSBudWxsOwotCQlmSW5wdXRTdHJlYW0gPSBudWxsOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkNsaWVudFN1cHBsaWVkU3RyZWFtID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiaWxsZWdhbCBhcmd1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXJlc2V0QWxsKCk7Ci0JCWZJRmlsZSA9IGlGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0KLQkJcmVzZXRBbGwoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlmQ2xpZW50U3VwcGxpZWRTdHJlYW0gPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nUnVsZShFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB7Ci0KLQkJZkVuY29kaW5nUnVsZSA9IGVuY29kaW5nUnVsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZFN0cmVhbUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkMzE5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsOwotCi0KLXB1YmxpYyBjbGFzcyBDb2RlZFN0cmVhbUNyZWF0b3IgZXh0ZW5kcyBDb2RlZElPIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTklUSUFMX0JVRkZFUl9TSVpFID0gMTAyNCAqIDE2OwotCi0JLy8gdGhlIDMyIGJ5dGVzIHVzZWQgYnkgZGVmYXVsdCBieSBCeXRlT3V0cHV0U3RyZWFtIGlzCi0JLy8gYSBsaXR0bGUgc21hbGwKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JBTV9FUlJPUl9fRkFJTEVEX1RPX0ZJTkRfQU5ZX0NIQVJTRVRfQU5ZV0hFUkVfID0gIlByb2dyYW0gZXJyb3I6IGZhaWxlZCB0byBmaW5kIGFueSBjaGFyc2V0IGFueXdoZXJlISI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZCRV9DSEFSU0VUX05BTUUgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNkxFX0NIQVJTRVRfTkFNRSA9ICJVVEYtMTZMRSI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2X0NIQVJTRVRfTkFNRSA9ICJVVEYtMTYiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOF9DSEFSU0VUX05BTUUgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gZkNsaWVudFN1cHBsaWVkUmVhZGVyOwotCi0JLy8gZnV0dXJlX1RPRE86IHRoaXMgJ2NoZWNrQ29udmVyc2lvbicgY2FuIGJlIGEgbGl0dGxlCi0JLy8gcHJpY2V5IGZvciBsYXJnZQotCS8vIGZpbGVzLCBjaG91bGQgYmUgYSB1c2VyIHByZWZlcmVuY2UsIG9yIHNvbWV0aGluZy4KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGNoZWNrQ29udmVyc2lvbiA9IHRydWU7Ci0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkN1cnJlbnRFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkZpbGVuYW1lOwotCi0JcHJpdmF0ZSBib29sZWFuIGZIYXNCZWVuQW5hbHl6ZWQ7Ci0KLQlwcml2YXRlIElGaWxlIGZJRmlsZTsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZQcmV2aW91c0VuY29kaW5nTWVtZW50bzsKLQotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0KLQlwcml2YXRlIFJlYWRlciBmUmVzZXR0YWJsZVJlYWRlcjsKLQlwcml2YXRlIGJ5dGVbXSBVVEYxNkJFQk9NID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhGRSwgKGJ5dGUpIDB4RkZ9OwotCi0JcHJpdmF0ZSBieXRlW10gVVRGMTZMRUJPTSA9IG5ldyBieXRlW117KGJ5dGUpIDB4RkYsIChieXRlKSAweEZFfTsKLQlwcml2YXRlIGJ5dGVbXSBVVEYzQllURUJPTSA9IG5ldyBieXRlW117KGJ5dGUpIDB4RUYsIChieXRlKSAweEJCLCAoYnl0ZSkgMHhCRn07Ci0KLQlwdWJsaWMgQ29kZWRTdHJlYW1DcmVhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBjaGFyW10gY2hhcmFjdGVyQXJyYXkpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZSZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJhY3RlckFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRTdHJlYW1DcmVhdG9yKFN0cmluZyBmaWxlbmFtZSwgUmVhZGVyIHJlYWRlcikgewotCQlzdXBlcigpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRTdHJlYW1DcmVhdG9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRleHRTdHJpbmcpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHRTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IG1ldGhvZCB3aGljaCBjb250YWlucyB0aGUgaGlnaGVzdCBsZXZlbCBydWxlcyBmb3IgaG93IHRvCi0JICogZGVjaWRlIGFwcHJvcHJpYXRlIGRlY29kaW5nIHJ1bGVzOiAxLiBmaXJzdCBjaGVjayBmb3IgdW5pY29kZSBzdHJlYW0gMi4KLQkgKiB0aGVuIGxvb2tlZCBmb3IgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIGNvbnRlbnQgKGFjY29yZGluZyB0byB0aGUgdHlwZSBvZgotCSAqIGNvbnRlbnQgdGhhdCBpcyBpdCAuLi4geG1sLCBodG1sLCBqc3AsIGV0Yy4gMy4gdGhlbiBjaGVjayBmb3IgdmFyaW91cwotCSAqIHNldHRpbmdzOiBmaWxlIHNldHRpbmdzIGZpcnN0LCBpZiBudWxsIGNoZWNrIHByb2plY3Qgc2V0dGluZ3MsIGlmIG51bGwsCi0JICogY2hlY2sgdXNlciBwcmVmZXJlbmNlcy4gNC4gbGFzdGx5IChvciwgd2hhdCBpcyB0aGUgbGFzdCB1c2VyCi0JICogcHJlZmVyZW5jZSkgaXMgdG8gdXNlICJ3b3JrYmVuY2ggZGVmYXVsdHMiLgotCSAqLwotCXByaXZhdGUgdm9pZCBhbmFseXplKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUmVhZGVyIHJlc2V0dGFibGVSZWFkZXIgPSBnZXRSZXNldHRhYmxlUmVhZGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJCXJlc2V0dGFibGVSZWFkZXIucmVzZXQoKTsKLQkJCQlmQ3VycmVudEVuY29kaW5nTWVtZW50byA9IGNoZWNrRm9yRW5jb2RpbmdJbkNvbnRlbnRzKCk7Ci0JCQl9Ci0JCQkvLyBpZiBlbmNvZGluZyBzdHJhdGFneSBkb2Vzbid0IHByb3ZpZGUgYW5zd2VyLAotCQkJLy8gdGhlbiB0cnkgZmlsZSBzZXR0aW5ncywgcHJvamVjdCBzZXR0aW5ncywKLQkJCS8vIHVzZXIgcHJlZmVyZW5jZXMsIGFuZAotCQkJLy8gZmluYWxseSB3b3JrYmVuY2ggZGVmYXVsdC4KLQkJCS8vCi0JCQlpZiAoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPT0gbnVsbCB8fCBmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCXJlc2V0dGFibGVSZWFkZXIucmVzZXQoKTsKLQkJCQlmQ3VycmVudEVuY29kaW5nTWVtZW50byA9IGdldEVuY29kaW5nTWVtZW50b0Zyb21SZXNvdXJjZUFuZFByZWZlcmVuY2UoKTsKLQkJCX0KLQotCQkJLy8gdXNlIERlZmF1bHROYW1lUnVsZXMgZnJvbSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzIGFzIHRoZQotCQkJLy8gZmluYWwgZGVmYXVsdAotCQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJCWhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCk7Ci0JCQl9Ci0KLQkJCWZIYXNCZWVuQW5hbHl6ZWQgPSB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlc2V0dGFibGVSZWFkZXIgIT0gbnVsbCkgewotCQkJCXJlc2V0dGFibGVSZWFkZXIucmVzZXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gY2hlY2sgY29udmVyc2lvbiBlYXJseSBvbi4gVGhlcmUncyBzb21lIGRhbmdlciB0aGFuIG9sZAotCSAqIGNvbnRlbnRzIG9mIGEgZmlsZSBhcmUgc2V0IHRvIGVtcHR5LCBpZiBhbiBleGNlcHRpb24gb2NjdXJzLgotCSAqIAotCSAqIEBwYXJhbSBhbGxUZXh0Ci0JICogQHBhcmFtIGVuY29kaW5nCi0JICogQHBhcmFtIGVuY29kaW5nUnVsZQotCSAqIEB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogQHRocm93cyBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsCi0JICogQGRlcHJlY2F0ZWQgLSB3ZSBuZWVkIHRvIGZpbmQgImNoZWFwZXIiIHdheSB0byB0byB0aGlzIGZ1bmN0aW9uYWxpdHkgc28KLQkgKiAgICAgICAgICAgICBsaWtlbHkgdG8gZ28gYXdheSBpbiBmdXR1cmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tDb252ZXJzaW9uKEVuY29kaW5nTWVtZW50byBtZW1lbnRvLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgamF2YUVuY29kaW5nID0gbWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJU3RyaW5nIGRldGVjdGVkRW5jb2RpbmcgPSBtZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGphdmFFbmNvZGluZyk7Ci0JCUNoYXJzZXRFbmNvZGVyIGNoYXJzZXRFbmNvZGVyID0gY2hhcnNldC5uZXdFbmNvZGVyKCk7Ci0JCWNoYXJzZXRFbmNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJY2hhcnNldEVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCVJlYWRlciByZWFkZXIgPSBnZXRSZXNldHRhYmxlUmVhZGVyKCk7Ci0JCXJlYWRlci5yZXNldCgpOwotCQlpbnQgY3VycmVudENoYXIgPSByZWFkZXIucmVhZCgpOwotCQlpbnQgY3VycmVudFBvcyA9IDE7Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoY3VycmVudENoYXIgIT0gLTEpIHsKLQkJCQkvLyBub3RlOiB0aGlzIGNhbiBwcm9iYWJseSBiZSBtYWRlIG1vcmUKLQkJCQkvLyBlZmZpY2llbnQgbGF0ZXIgdG8KLQkJCQkvLyBjaGVjayBidWZmZXIgYnkgYnVmZmVyLCBpbnN0ZWFkIG9mCi0JCQkJLy8gY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4KLQkJCQl0cnkgewotCQkJCQlib29sZWFuIGNhbkNvbnZlcnQgPSBjaGFyc2V0RW5jb2Rlci5jYW5FbmNvZGUoKGNoYXIpIGN1cnJlbnRDaGFyKTsKLQkJCQkJaWYgKCFjYW5Db252ZXJ0KSB7Ci0JCQkJCQlpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikgewotCQkJCQkJCS8vIGlmIHdlJ3JlIHRvbGQgdG8gaWdub3JlIHRoZQotCQkJCQkJCS8vIGVuY29kaW5nIGNvbnZlcnNpb24KLQkJCQkJCQkvLyBlcnJvciwKLQkJCQkJCQkvLyBub3RpY2Ugd2Ugc3RpbGwgd2FudCB0byBkZXRlY3QKLQkJCQkJCQkvLyBhbmQgbG9nIGl0LiBXZSBzaW1wbHkKLQkJCQkJCQkvLyBkb24ndCB0aHJvdyB0aGUgZXhjZXB0aW9uLCBhbmQKLQkJCQkJCQkvLyB3ZSBkbyBjb250aW51ZSB3aXRoCi0JCQkJCQkJLy8gdGhlCi0JCQkJCQkJLy8gc2F2ZS4KLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkVuY29kaW5nIENvbnZlcnNpb24gRXJyb3IgZHVyaW5nIHNhdmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0aHJvdyBuZXcgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbChqYXZhRW5jb2RpbmcsIGRldGVjdGVkRW5jb2RpbmcsIGN1cnJlbnRQb3MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRDaGFyID0gcmVhZGVyLnJlYWQoKTsKLQkJCQkJY3VycmVudFBvcysrOwotCQkJCX0KLQkJCQkvLyBJQk0ncyBKUkUgc2VlbXMgdG8gdGhyb3cgTlBFIHdoZW4gREJDUyBjaGFyIGlzIGdpdmVuIHRvCi0JCQkJLy8gU0JDUyBjaGFyc2V0RW5jb2RlcgotCQkJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbChqYXZhRW5jb2RpbmcpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJLy8gaWYgd2UgZ2V0IGFsbCB0aGUgd2F5IHRocm91Z2ggbG9vcCB3aXRob3V0IHRocm93aW5nIGV4Y2VwdGlvbiwKLQkJCS8vIHRoZW4gdGhlcmUgbXVzdAotCQkJLy8gYmUgYW4gZXJyb3Igbm90IGRldGVjdGFibGUgd2hlbiBnb2luZyBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLgotCQkJdGhyb3cgbmV3IENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKGphdmFFbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXJlYWRlci5yZXNldCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQotCQkvLyBpZiBlbmNvZGluZyBtZW1lbnRvIGFscmVhZHkgc2V0LCBhbmQgbm8gbmVlZCB0byBnZXQgYWdhaW4uCi0JCWlmIChmRW5jb2RpbmdNZW1lbnRvICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZkNsaWVudFN1cHBsaWVkUmVhZGVyKSB7Ci0JCQkJZlJlYWRlci5yZXNldCgpOwotCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0RGVzY3JpcHRpb25Gb3IoZlJlYWRlciwgZkZpbGVuYW1lLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJZkVuY29kaW5nTWVtZW50byA9IGNyZWF0ZU1lbWVudG8oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWZFbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50bygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPOiB3b3JrIGFyb3VuZCBmb3IgNS8xNCBidWcgaW4gYmFzZSwgc2hvdWxkIGJlCi0JCQkJCS8vIHJlbW92ZWQgd2hlbiBtb3ZlIHVwIHRvIDUvMjEKLQkJCQkJLy8ganVzdCBjcmVhdGVkIGEgc2ltcGxlIGRlZmF1bHQgb25lCi0JCQkJCWZFbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50bygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHN0YXRlOiBlbmNvZGluZ01lbWVudG8gd2FzIG51bGwgYnV0IG5vIGlucHV0IHN0cmVhbSBzdXBwbGllZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJLy8JCXRyeSB7Ci0JCS8vCQkJcmVzdWx0ID0gZ2V0RW5jb2RpbmdEZXRlY3RvcigpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLwkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzVmFsaWQoKSAmJiAhZm9yY2VEZWZhdWx0KCkpIHsKLQkJLy8JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwocmVzdWx0KTsKLQkJLy8JCQl9Ci0JCS8vCQl9Ci0JCS8vCQlmaW5hbGx5IHsKLQkJLy8JCQloYW5kbGVTdHJlYW1DbG9zZShmRW5jb2RpbmdEZXRlY3RvclN0cmVhbSk7Ci0JCS8vCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgZHVtcChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlLCBib29sZWFuIHVzZTNCeXRlQk9NaWZVVEY4KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlnZXRDdXJyZW50RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCVN0cmluZyBqYXZhRW5jb2RpbmdOYW1lID0gbnVsbDsKLQkJaWYgKGVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCkgewotCQkJaWYgKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJCWphdmFFbmNvZGluZ05hbWUgPSBmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8pOwotCQkJfQotCQl9IGVsc2UgaWYgKGVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuSUdOT1JFX0NPTlZFUlNJT05fRVJST1IpCi0JCQlqYXZhRW5jb2RpbmdOYW1lID0gZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0JCWVsc2UgaWYgKGVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCkKLQkJCWphdmFFbmNvZGluZ05hbWUgPSBmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKTsKLQkJLy8gd3JpdGUgYXBwcm9wcmlhdGUgImhlYWRlciIgdW5pY29kZSBCT00gYnl0ZXMKLQkJLy8gTm90ZTogSmF2YSBzZWVtcyB0byB3cml0ZSBhcHByb3ByaWF0ZSBoZWFkZXIgZm9yCi0JCS8vIFVURi0xNiwgYnV0IG5vdAotCQkvLyBVVEYtOCBub3IgVVRGLTE2QkUuIFRoaXMKLQkJLy8gbWF5IHZhcnkgYnkgSlJFIHZlcnNpb24sIHNvIG5lZWQgdG8gdGVzdCB3ZWxsLgotCQkvLyBOb3RlOiBqYXZhRW5jb2RpbmdOYW1lIGNhbiBiZSBudWxsIGluIGludmFsaWQKLQkJLy8gY2FzZXMsIHNvIHdlIG5vIGhhcmQKLQkJLy8gdG8gc2tpcCB3aG9sZSBjaGVjayBpZiB0aGF0J3MgdGhlIGNhc2UuCi0JCWlmIChqYXZhRW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzhfQ0hBUlNFVF9OQU1FKSAmJiB1c2UzQnl0ZUJPTWlmVVRGOCkgfHwgKGphdmFFbmNvZGluZ05hbWUuZXF1YWxzKFVURl84X0NIQVJTRVRfTkFNRSkgJiYgZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uaXNVVEY4M0J5dGVCT01Vc2VkKCkpKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLndyaXRlKFVURjNCWVRFQk9NKTsKLQkJCX0gZWxzZSBpZiAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzE2TEVfQ0hBUlNFVF9OQU1FKSkgewotCQkJCW91dHB1dFN0cmVhbS53cml0ZShVVEYxNkxFQk9NKTsKLQkJCX0gZWxzZSBpZiAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzE2QkVfQ0hBUlNFVF9OQU1FKSkgewotCQkJCW91dHB1dFN0cmVhbS53cml0ZShVVEYxNkJFQk9NKTsKLQkJCX0KLQkJfQotCQkvLyBUT0RPIGFkZCBiYWNrIGluIGxpbmUgZGVsaW1pdGVyIGhhbmRsaW5nIHRoZQotCQkvLyAicmlnaHQiIHdheSAodXBkYXRpbmcKLQkJLy8gbWFya2Vycywgbm90IHJlcXVpcmluZyBzdHJpbmcsIGV0Yy4gLi4gbWF5IG5lZWQKLQkJLy8gdG8gbW92ZSB0byBkb2N1bWVudAotCQkvLyBsZXZlbCkKLQkJLy9hbGxUZXh0QnVmZmVyID0KLQkJLy8gaGFuZGxlTGluZURlbGltaXRlcihhbGxUZXh0QnVmZmVyLCBkb2N1bWVudCk7Ci0JCVJlYWRlciByZWFkZXIgPSBnZXRSZXNldHRhYmxlUmVhZGVyKCk7Ci0JCS8vIGJlIHN1cmUgdG8gdGVzdCBsYXJnZSAicmVhZGVycyIgLi4uIHdlJ2xsIG5lZWQKLQkJLy8gdG8gbWFrZSBzdXJlIHRoZXkgYWxsCi0JCS8vIGNhbiByZXNldCB0byBpbml0aWFsIHBvc2l0aW9uIChTdHJpbmdSZWFkZXIsCi0JCS8vIENoYXJBcnJheVJlYWRlciwgYW5kCi0JCS8vIERvY3VtZW50UmVhZGVyIHNob3VsZCBhbGwgd29yayBvaykuCi0JCXJlYWRlci5yZXNldCgpOwotCQkvLyBUaGVyZSBtdXN0IGJlIGNsZWFuZXIgbG9naWMgc29tZWhvdywgYnV0IHRoZQotCQkvLyBpZGVhIGlzIHRoYXQKLQkJLy8gamF2YUVuY29kaW5nTmFtZSBjYW4gYmUgbnVsbAotCQkvLyBpZiBvcmlnaW5hbCBkZXRlY3RlZCBlbmNvZGluZyBpcyBub3QgdmFsaWQgKGFuZAotCQkvLyBpZiBGT1JDRV9ERUZBVUxUIHdhcwotCQkvLyBub3Qgc3BlY2lmaWVkKS4gSGVuY2UsIHdlIFdBTlQgdGhlIGZpcnN0Ci0JCS8vIENoYXJzZXQuZm9yTmFtZSB0bwotCQkvLyB0aHJvdyBhcHByb3ByaWF0ZSBleGNlcHRpb24uCi0JCUNoYXJzZXQgY2hhcnNldCA9IG51bGw7Ci0KLQkJLy8gdGhpcyBjYWxsIGNoZWNrcyAib3ZlcnJpZGUiIHByb3BlcnRpZXMgZmlsZQotCQlqYXZhRW5jb2RpbmdOYW1lID0gQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGphdmFFbmNvZGluZ05hbWUpOwotCi0JCWlmIChqYXZhRW5jb2RpbmdOYW1lID09IG51bGwpIHsKLQkJCWNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoamF2YUVuY29kaW5nTmFtZSk7Ci0JCX0KLQkJQ2hhcnNldEVuY29kZXIgY2hhcnNldEVuY29kZXIgPSBjaGFyc2V0Lm5ld0VuY29kZXIoKTsKLQkJaWYgKCEoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikpIHsKLQkJCWNoYXJzZXRFbmNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJCWNoYXJzZXRFbmNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQl9IGVsc2UgewotCQkJY2hhcnNldEVuY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJCWNoYXJzZXRFbmNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQotCQl9Ci0JCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhcnNldEVuY29kZXIpOwotCQkvL1RPRE86IHRoaXMgbWF5IG5vIGxvbmdlciBiZSBuZWVkZWQgKGFuZCBpcyBhdAotCQkvLyBsZWFzdCB3cm9uZyBzcG90IGZvcgotCQkvLyBpdCkuCi0JCS8vCQlpZiAoY2hlY2tDb252ZXJzaW9uICYmICghKGVuY29kaW5nUnVsZSA9PQotCQkvLyBFbmNvZGluZ1J1bGUuSUdOT1JFX0NPTlZFUlNJT05fRVJST1IpKSkgewotCQkvLwkJCWNoZWNrQ29udmVyc2lvbihmQ3VycmVudEVuY29kaW5nTWVtZW50bywKLQkJLy8gZW5jb2RpbmdSdWxlKTsKLQkJLy8JCX0KLQkJY2hhcltdIGNoYXJidWYgPSBuZXcgY2hhcltDb2RlZElPLk1BWF9CVUZfU0laRV07Ci0JCWludCBuUmVhZCA9IDA7Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoblJlYWQgIT0gLTEpIHsKLQkJCQluUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJidWYsIDAsIE1BWF9CVUZfU0laRSk7Ci0JCQkJaWYgKG5SZWFkID4gMCkgewotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKGNoYXJidWYsIDAsIG5SZWFkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24gZSkgewotCQkJY2hlY2tDb252ZXJzaW9uKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLCBlbmNvZGluZ1J1bGUpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gc2luY2Ugd2UgZG9uJ3Qgb3duIHRoZSBvcmlnaW5hbCBvdXRwdXQgc3RyZWFtLCB3ZQotCQkJLy8gd29uJ3QgY2xvc2UgaXQgb3Vycy4KLQkJCS8vIHRoZSBjYWxsZXIgd2hvIHBhc3NlZCBpdCB0byB1cyBtdXN0IGNsb3NlIG9yaWdpbmFsIG9uZQotCQkJLy8gd2hlbiBhcHByb3ByaWF0ZS4KLQkJCS8vIChidXQgd2UgZG8gZmx1c2ggdG8gYmUgc3VyZSBhbGwgdXAtdG8tZGF0ZSkKLQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldDNCeXRlQk9NUHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCk7Ci0JfQotCi0JcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBnZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbShFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBnZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbShFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvL0Fzc2VydC5pc05vdE51bGwoZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvLAotCQkvLyAicHJldmlvdXNFbmNvZGluZ01lbWVudG8KLQkJLy8gbmVlZHMgdG8gYmUgc2V0IGZpcnN0Iik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKElOSVRJQUxfQlVGRkVSX1NJWkUpOwotCQlkdW1wKGJ5dGVBcnJheU91dHB1dFN0cmVhbSwgZW5jb2RpbmdSdWxlLCBnZXQzQnl0ZUJPTVByZWZlcmVuY2UoKSk7Ci0JCXJldHVybiBieXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRDdXJyZW50RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy9Bc3NlcnQuaXNOb3ROdWxsKGZQcmV2aW91c0VuY29kaW5nTWVtZW50bywKLQkJLy8gInByZXZpb3VzRW5jb2RpbmdNZW1lbnRvCi0JCS8vIG5lZWRzIHRvIGJlIHNldCBmaXJzdCIpOwotCQlpZiAoIWZIYXNCZWVuQW5hbHl6ZWQpIHsKLQkJCWFuYWx5emUoKTsKLQkJfQotCQkvLyBwb3N0IGNvbmRpdGlvbgotCQlBc3NlcnQuaXNOb3ROdWxsKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLCAiaWxsZWdhbCBwb3N0IGNvbmRpdGlvbiBzdGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGJlIHN1cmUgdG8gY2Fycnkgb3ZlciBhcHByb3ByaWF0ZSBlbmNvZGluZwotCQkvLyAic3RhdGUiIHRoYXQgbWF5IGJlCi0JCS8vIHJlbGV2ZW50LgotCQlpZiAoZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvICE9IG51bGwpIHsKLQkJCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQoZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvLmlzVVRGODNCeXRlQk9NVXNlZCgpKTsKLQkJfQotCQlyZXR1cm4gZkN1cnJlbnRFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSB3aGVuIGVuY29kaW5nIGlzIG5vdCBkZXRlY3RlZCBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBIZXJlIGlzIGVuY29kaW5nIGxvb2t1cCBvcmRlciB3ZSB3aWxsIHRyeTogLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIGRlc2NyaXB0aW9uIChFY2xpcHNlIFRleHQgZmlsZSBlbmNvZGluZykgLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIHByb3BlcnRpZXMgKGZvciBKU1Agb25seSkgLSB0cnkgY29udGVudCB0eXBlIGVuY29kaW5nIHByZWZlcmVuY2VzIChmb3IKLQkgKiBIVE1MIG9ubHkpIC0gdHJ5IHJlc291cmNlIGNvbnRlbnQgZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlCi0JICogZW5jb2RpbmcsIGltcGxpY2l0IGNoZWNrKQotCSAqIAotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGFwcGVhcnMgaW4gYm90aCBDb2RlZFJlYWRlckNyZWF0b3IgYW5kCi0JICogQ29kZWRTdHJlYW1DcmVhdG9yICh3aXRoIGp1c3QgYSBtaW5vciBkaWZmZXJlbmNlKS4gVGhleSBzaG91bGQgYmUga2VwdAotCSAqIHRoZSBzYW1lLgotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50b0Zyb21SZXNvdXJjZUFuZFByZWZlcmVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gZkVuY29kaW5nTWVtZW50bzsKLQotCQkvLyBGb2xsb3cgRWNsaXBzZSBQbGF0Zm9ybSdzIGRpcmVjdGlvbi4gR2V0IHRoZSBjaGFyc2V0IGZyb20gSUZpbGUuCi0JCWlmIChmSUZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNoYXJzZXQgPSBmSUZpbGUuZ2V0Q2hhcnNldCgpOwotCQkJZW5jb2RpbmdNZW1lbnRvID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXByaXZhdGUgUmVhZGVyIGdldFJlc2V0dGFibGVSZWFkZXIoKSB7Ci0JCWlmIChmUmVzZXR0YWJsZVJlYWRlciA9PSBudWxsKSB7Ci0JCQlpZiAoZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCQlmUmVzZXR0YWJsZVJlYWRlciA9IGZSZWFkZXI7Ci0JCQl9IGVsc2UgewotCQkJCWZSZXNldHRhYmxlUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQkJCXRyeSB7Ci0JCQkJCWZSZXNldHRhYmxlUmVhZGVyLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYKLQkJCQkJLy8gbWFya2FibGUKLQkJCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBmUmVzZXR0YWJsZVJlYWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RQcm92aWRlZEZyb21Db250ZW50Q2FzZSgpIHsKLQkJLy8gbW92ZSB0byAiZGV0ZWN0b3JzIiBpZiBub3QgYWxyZWFkeQotCQlTdHJpbmcgc3BlY0RlZmF1bHQgPSBudWxsOwotCQkvL3NwZWNEZWZhdWx0ID0gZ2V0RW5jb2RpbmdEZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJU3RyaW5nIGNoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMoc3BlY0RlZmF1bHQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNoYXJzZXQsIFBST0dSQU1fRVJST1JfX0ZBSUxFRF9UT19GSU5EX0FOWV9DSEFSU0VUX0FOWVdIRVJFXyk7Ci0JCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JfQotCi0JLy8gVE9ETyBXZSBqdXN0IGNvcHkgdGhlIGNvbnRlbnQgcHJvcGVydGllcyBlbmNvZGluZyB0byBjdXJyZW50IHJlc291cmNlJ3MKLQkvLyBlbmNvZGluZyBmb3Igbm93LiBNYXkgaW1wcm92ZSB0aGUgVUkgbGF0ZXIgYnkgc2V0dGluZyBhbiBpbmZvcm1hdGlvbmFsCi0JLy8gbWVzc2FnZSBhbmQvb3IgZGlzYWJsZSB0aGUgY29udGVudCBwcm9wZXJ0aWVzIGVuY29kaW5nIGZpZWxkLgotCS8vIFRPRE8gbWFrZSBwcml2aWF0ZSBpZiBuZWVkZWQsIGVsc2UgcmVtb3ZlCi0Jdm9pZCBtaWdyYXRlQ29udGVudFByb3BlcnRpZXNFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZJRmlsZSAhPSBudWxsKQotCQkJZklGaWxlLnNldENoYXJzZXQoZW5jb2RpbmcsIG51bGwpOwotCQlmaW5hbCBJRmlsZSBmaWxlID0gZklGaWxlOwotCQlmaW5hbCBTdHJpbmcgY2hhcnNldCA9IGVuY29kaW5nOwotCQkvLyBUT0RPOiBleHRlcm5hbGl6ZSBzdHJpbmcgbGF0ZXIKLQkJSm9iIG1pZ3JhdGVyID0gbmV3IEpvYihTU0VDb3JlTWVzc2FnZXMuTWlncmF0ZV9DaGFyc2V0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmaWxlLnNldENoYXJzZXQoY2hhcnNldCwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJbWlncmF0ZXIuc2V0U3lzdGVtKHRydWUpOwotCQltaWdyYXRlci5zY2hlZHVsZSgpOwotCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZkZpbGVuYW1lID0gbnVsbDsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZQcmV2aW91c0VuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkhhc0JlZW5BbmFseXplZCA9IGZhbHNlOwotCQlmQ2xpZW50U3VwcGxpZWRSZWFkZXIgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSUZpbGUgZmlsZSwgUmVhZGVyIHJlYWRlcikgewotCQlmSUZpbGUgPSBmaWxlOwotCQlzZXQoZmlsZS5nZXROYW1lKCksIHJlYWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBmaWxlbmFtZSwgY2hhcltdIGNoYXJhY3RlckFycmF5KSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gbmV3IENoYXJBcnJheVJlYWRlcihjaGFyYWN0ZXJBcnJheSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBmaWxlbmFtZSwgUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJZkNsaWVudFN1cHBsaWVkUmVhZGVyID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dFN0cmluZykgewotCQlzZXQoZmlsZW5hbWUsIG5ldyBTdHJpbmdSZWFkZXIodGV4dFN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBwcmV2aW91c0VuY29kaW5nTWVtZW50bykgewotCQlmUHJldmlvdXNFbmNvZGluZ01lbWVudG8gPSBwcmV2aW91c0VuY29kaW5nTWVtZW50bzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkNoYXJzZXROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db21tb25DaGFyc2V0TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlMDhmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkNoYXJzZXROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ29tbW9uQ2hhcnNldHMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIHByb3ZpZGUgYSBjZW50cmFsIHBsYWNlIHRvIG1hcCBzb21lCi0gKiBJQU5BIGNoYXJzZXQgbmFtZSB0byBhIEphdmEgY2hhcnNldCBuYW1lLiBJbiAxLjQgSlJFJ3MgdGhpcyBtb3N0bHkgaXMgYQotICogdGhpbiB3cmFwcGVyIG9mIGV4aXN0aW5nIENoYXJzZXQgZnVuY3Rpb25hbGl0eS4gSXQgZG9lcywgaG93ZXZlciwgYWxsb3cKLSAqIHNvbWUgIm92ZXJyaWRpbmciIG9mIHRoZSBidWlsdCBpbiBKUkUgbWFwcGluZ3MgaW4gdGhlIGV2ZW50IHRoZXkgYXJlCi0gKiBuZWNlc3NhcnkuIFNlZSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGVzIHNvbWUgY29udmVuaWVudCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhlCi0gKiBjaGFyc2V0IG5hbWVzIHdoaWNoIGNhbiBiZSB1c2VkIGluIHVzZXIgaW50ZXJmYWNlcy4gVGhlIGRlc2NyaXB0aW9uIGlzIE5MCi0gKiBhd2FyZSBiYXNlZCBvbiBsb2NhbGUuIFRoZSBkYXRhIGlzIHBvcHVsYXRlZCB2aWEgdGhlIGNoYXJzZXQucHJvcGVydGllcwotICogZmlsZSBvbmx5IG9uY2UsIGJhc2VkIG9uIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiB0aGUgaGFzaHRhYmxlcy4KLSAqIDxwPgotICogVGhlIElBTkEgdGFncyBhcmUgYmFzZWQgb24gcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvdW5kIGF0IHRoZQotICogaHR0cDovL3d3dy5pYW5hLm9yZyBzaXRlLiBTcGVjaWZpY2FsbHkgc2VlCi0gKiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tb25DaGFyc2V0TmFtZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBkZWZhdWx0SUFOQW1hcHBpbmdzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBlbmNvZGluZ3MgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBjb21tb25seSBhdmFpbGFibGUgZW5jb2RpbmcgbmFtZXMuIFN1aXRhYmxlIGZvcgotCSAqIHBvcHVsYXRpbmcgYSBVSSBkaWFsb2cgb3IgZHJvcCBkb3duLiBUaGlzIGxpc3Qgd291bGQgYmUgYSBzdWJzZXQgb2YgYWxsCi0JICogcG9zc2libGUgY2hhcnNldHMgdGhlIFZNIHN1cHBvcnRzICh3aGljaCBjYW4gZ2V0IGludG8gdGhlIGh1bmRyZWRzKS4KLQkgKiBGb3IgdGhlIFZNIHN1cHBvcnRlZCBjaGFyc2V0cywgdXNlCi0JICogPGNvZGU+Q2hhcnNldC5hdmFpbGFibGVDaGFyc2V0cygpPC9jb2RlPgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbW1vbkNoYXJzZXROYW1lcygpIHsKLQkJU3RyaW5nW10gZW5jID0gbmV3IFN0cmluZ1tnZXRFbmNvZGluZ3MoKS5zaXplKCldOwotCQlnZXRFbmNvZGluZ3MoKS50b0FycmF5KGVuYyk7Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0SUFOQW1hcHBpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0RGVmYXVsdElBTkFNYXBwaW5ncygpIHsKLQkJaWYgKGRlZmF1bHRJQU5BbWFwcGluZ3MgPT0gbnVsbCkgewotCQkJZGVmYXVsdElBTkFtYXBwaW5ncyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlCdW5kbGUga2V5QnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKElDb2RlZFJlc291cmNlUGx1Z2luLklEKTsKLQkJCUlQYXRoIGtleVBhdGggPSBuZXcgUGF0aCgiY29uZmlnL2RlZmF1bHRJQU5BLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJVVJMIGxvY2F0aW9uID0gUGxhdGZvcm0uZmluZChrZXlCdW5kbGUsIGtleVBhdGgpOwotCQkJSW5wdXRTdHJlYW0gcHJvcGVydGllc0lucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcHJvcGVydGllc0lucHV0U3RyZWFtID0gbG9jYXRpb24ub3BlblN0cmVhbSgpOwotCQkJCWRlZmF1bHRJQU5BbWFwcGluZ3MubG9hZChwcm9wZXJ0aWVzSW5wdXRTdHJlYW0pOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBjYW4ndCByZWFkLCBqdXN0IGFzc3VtZSB0aGVyZSdzIG5vCi0JCQkJLy8gZGVmYXVsdCBJQU5BIG1hcHBpbmdzCi0JCQkJLy8gYW5kIHJlcGVhdGVkIGF0dGVtcHRzIHdpbGwgbm90IG9jY3VyLAotCQkJCS8vIHNpbmNlIHRoZXkKLQkJCQkvLyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5Ci0JCQkJLy8gUHJvcGVydGllcyBvYmplY3QKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdElBTkFtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGRpc3BsYXkgKHRyYW5zbGF0ZWQpIHN0cmluZyBmb3IgZW5jb2RpbmcgbmFtZS4gSWYgdGhlcmUgaXMgbm8KLQkgKiAiY3VzdG9tIiB0cmFuc2xhdGVkIHZlcnNpb24gYXZhaWxhYmxlLCBpdCBkZWZlcnMgdG8gdGhlciBWTSdzIENoYXJzZXQKLQkgKiBzdXBwb3J0LiBJdCB3aWxsIHJldHVybiBudWxsIGlmIG5vIGRpc3BsYXkgbmFtZSBpcyBhdmFpbGFibGUuCi0JICogCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgY2hhcnNldCBuYW1lCi0JICogQHJldHVybiBIdW1hbiBmcmllbmRseSBkaXNwbGF5IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlpZiAoY2hhcnNldE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgZ2V0U3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMoKS5nZXQoY2hhcnNldE5hbWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIGlmIHdlIGRvbid0IGhhdmUgYSBzcGVjaWFsIG9uZSwganVzdCByZXR1cm4KLQkJCS8vIHdoYXQncyBwcm92aWRlZCBieSBDaGFyc2V0Ci0KLQkJCXRyeSB7Ci0JCQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXROYW1lKTsKLQkJCQlyZXN1bHQgPSBjaGFyc2V0LmRpc3BsYXlOYW1lKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBub3Qgc3VwcG9ydGVkLCB0aGUgZGlzcGxheSBuYW1lIGlzCi0JCQkJLy8gdGhlIGxlYXN0IG9mIGNsaWVudHMgY29uY2VybnMgOikKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YUVuY29kaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZ2V0RW5jb2RpbmdzKCkgewotCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsKLQkJCWluaXRIYXNoVGFibGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVuY29kaW5nczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJYW5hUHJlZmVycmVkQ2hhcnNldE5hbWUoU3RyaW5nIGNoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyBwcmVmZXJyZWROYW1lID0gY2hhcnNldE5hbWU7Ci0KLQkJdHJ5IHsKLQkJCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7Ci0JCQlpZiAoY2hhcnNldC5uYW1lKCkgIT0gbnVsbCkgewotCQkJCXByZWZlcnJlZE5hbWUgPSBjaGFyc2V0Lm5hbWUoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgcmV0dXJuIGlucHV0IGlmIGlsbGVnYWwKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgcmV0dXJuIGlucHV0IGlmIGlsbGVnYWwKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVmYXVsdCBJQU5BIG5hbWUgdGhhdCBpcyBsaXN0ZWQgaW4gQ29tbW9uQ2hhcnNldE5hbWVzLiBIZXJlCi0JICogaXMgaG93IGl0IGNoZWNrczogMS4gY2hlY2sgdG8gc2VlIGlmIGNoYXJzZXROYW1lIGlzIGluIHRoZQotCSAqIENvbW1vbkNoYXJzZXROYW1lcyBsaXN0IGFuZCBpZiBzbywganVzdCByZXR1cm4gaXQuIDIuIGNoZWNrIHRvIHNlZSBpZgotCSAqIGNoYXJzZXROYW1lIGlzIGxpc3RlZCBpbiBkZWZhdWx0SUFOQW1hcHBpbmdzIHdoaWNoIGNvbnRhaW5zIGEgbWFwcGluZwotCSAqIG9mIG1vcmUgY29tbW9uIGVuY29kaW5ncyBhbmQgdGhlIGRlZmF1bHQgSUFOQSBuYW1lIHRoZXkgc2hvdWxkIG1hcCB0by4KLQkgKiAzLiByZXR1cm4gZGVmYXVsdElhbmFOYW1lIGlmIGFsbCBlbHNlIGZhaWxzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKFN0cmluZyBjaGFyc2V0TmFtZSwgU3RyaW5nIGRlZmF1bHRJYW5hTmFtZSkgewotCQlTdHJpbmcgcHJlZmVycmVkTmFtZSA9IGRlZmF1bHRJYW5hTmFtZTsKLQkJU3RyaW5nIGd1ZXNzZWROYW1lID0gY2hhcnNldE5hbWU7Ci0JCXRyeSB7Ci0JCQlndWVzc2VkTmFtZSA9IENvZGVkSU8uZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChjaGFyc2V0TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpbGxlZ2FsCi0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpbGxlZ2FsCi0JCX0KLQkJaWYgKGdldEVuY29kaW5ncygpLmNvbnRhaW5zKGd1ZXNzZWROYW1lKSkKLQkJCXByZWZlcnJlZE5hbWUgPSBndWVzc2VkTmFtZTsKLQkJZWxzZSB7Ci0JCQlwcmVmZXJyZWROYW1lID0gZ2V0RGVmYXVsdElBTkFNYXBwaW5ncygpLmdldFByb3BlcnR5KGd1ZXNzZWROYW1lLCBwcmVmZXJyZWROYW1lKTsKLQkJfQotCi0JCXJldHVybiBwcmVmZXJyZWROYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgZ2V0U3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlpbml0SGFzaFRhYmxlcygpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRIYXNoVGFibGVzKCkgewotCQlpZiAoc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJLy8gSW5pdGlhbGl6ZSBoYXNoIHRhYmxlIGZvciBlbmNvZGluZyB0YWJsZQotCQkJc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQllbmNvZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBidW5kbGVTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlVUkwgYnVuZGxlVVJMID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQpLCBQYXRoLmZyb21PU1N0cmluZygiJG5sJC9jb25maWcvY2hhcnNldC5wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGJ1bmRsZVVSTCAhPSBudWxsKSB7Ci0JCQkJCWJ1bmRsZVN0cmVhbSA9IGJ1bmRsZVVSTC5vcGVuU3RyZWFtKCk7Ci0JCQkJCWJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGJ1bmRsZVN0cmVhbSk7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRvdGFsTnVtU3RyaW5nID0gYnVuZGxlLmdldFN0cmluZygidG90YWxudW1iZXIiKTsvLyROT04tTkxTLTEkCi0JCQkJaW50IHRvdGFsTnVtID0gMDsKLQkJCQlpZiAodG90YWxOdW1TdHJpbmcubGVuZ3RoKCkgIT0gMCkgewotCQkJCQl0cnkgewotCQkJCQkJdG90YWxOdW0gPSBJbnRlZ2VyLnZhbHVlT2YodG90YWxOdW1TdHJpbmcpLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0b3RhbE51bSA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsTnVtOyBpKyspIHsKLQkJCQkJU3RyaW5nIGlhbmEgPSBidW5kbGUuZ2V0U3RyaW5nKCJjb2Rlc2V0LiIgKyBpICsgIi5pYW5hIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gYnVuZGxlLmdldFN0cmluZygiY29kZXNldC4iICsgaSArICIubGFiZWwiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCQkJCWVuY29kaW5ncy5hZGQoaWFuYSk7Ci0JCQkJCXN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzLnB1dChpYW5hLCBkaXNwbGF5TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJpbnZhbGlkIGluc3RhbGwgb3IgY29uZmlndXJhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYnVuZGxlU3RyZWFtICE9IG51bGwpCi0JCQkJCQlidW5kbGVTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCS8vIHVuaXQgdGVzdCBvbmx5Ci0JCVN0cmluZyB0ZXN0ID0gIkNwMTI1MiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRJYW5hUHJlZmVycmVkQ2hhcnNldE5hbWUodGVzdCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0ICsgIiAtLT4gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0ZXN0ID0gIk1TOTMyIjsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKHRlc3QpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdCArICIgLS0+ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgQ29tbW9uQ2hhcnNldE5hbWVzKCkgewotCQlzdXBlcigpOwotCQlpbml0SGFzaFRhYmxlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzNTRkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgdG8gc3BlY2lmeSBlbmNvZGluZyBhbmQgZW5kIG9mIGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcyB7Ci0JCi0JcHJpdmF0ZSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBDb25zdGFudCB0byBiZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIENSL01BQyBsaW5lIGRlbGltaXRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gIkVPTF9NYWMiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aGVuIHJlZmVycmluZyB0byBDUkxGL1dJTkRPV1MgbGluZSBkZWxpbWl0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkxGID0gIkVPTF9XaW5kb3dzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXIocykgdG8gdXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9PRl9MSU5FX0NPREUgPSAiZW5kT2ZMaW5lQ29kZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgY29kZSB0byB1c2Ugd2hlbiByZWFkaW5nIGEgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9DT0RFU0VUID0gImlucHV0Q29kZXNldCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aGVuIHJlZmVycmluZyB0byBMRi9VTklYIGxpbmUgZGVsaW1pdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEYgPSAiRU9MX1VuaXgiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aGVuIHJlZmVycmluZyB0byBObyB0cmFuc2xhdGlvbiBvZiBsaW5lIGRlbGltaXRlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19UUkFOU0xBVElPTiA9ICIiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciBjb2RlIHRvIHVzZSB3aGVuIHdyaXRpbmcgYSBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9DT0RFU0VUID0gIm91dHB1dENvZGVzZXQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBDUi9NQUMgbGluZSBkZWxpbWl0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ1IgPSAiXHIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBDUkxGL1dJTkRPV1MgbGluZSBkZWxpbWl0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ1JMRiA9ICJcclxuIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgTEYvVU5JWCBsaW5lIGRlbGltaXRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19MRiA9ICJcbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIFVzZSAzIGJ5dGUgQk9NIChCeXRlIE9yZGVyIE1hcmspIHdoZW4gc2F2aW5nIFVURi04IGVuY29kZWQgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCA9ICJVc2UzQnl0ZUJPTVdpdGhVVEY4IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZjYTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLQotcHVibGljIGNsYXNzIENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5IHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9MT0NBVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfWE1MX0lEID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNTRV9YTUxfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGJ1bmRsZUV4aXN0cyhTdHJpbmcgcGx1Z2luSWQpIHsKLQotCQkvLyB0aGlzIGp1c3QgdmVyaWZpZXMgdGhlcmUncyByZWFsbHkgYSBwbHVnaW4gd2l0aCB0aGlzIElEIGluICJzdGFjayIKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCXJldHVybiAoIShidW5kbGUgPT0gbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JQbHVnaW5JZChJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJLy8gVE9ETzogbmVlZCB0byBoYXZlIHJlZ2lzdHJhdGlvbiBpbmZvIGhlcmUsIGJ1dCBmb3Igbm93LCB3ZSdsbCB1c2UKLQkJLy8gc2ltcGxlIGhldXJpc3RpYyB0byBjb3ZlciB0aGUgY2FzZXMgd2Uga25vdyBhYm91dC4KLQkJU3RyaW5nIGZ1bGxJZCA9IG51bGw7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlmdWxsSWQgPSBERUZBVUxUX0xPQ0FUSU9OOwotCQl9IGVsc2UgewotCQkJZnVsbElkID0gY29udGVudFR5cGUuZ2V0SWQoKTsKLQkJfQotCQkvLyBvbmx5IG9uZSBrbm93biBjYXNlLCBzbyBmYXIsIG9mIGhhcmQgY29kZWQgcmUtZGlyZWN0aW9uCi0JCS8vIChub3Qgc3VyZSB0aGlzIGlzIGV2ZW4gbmVlZGVkLCBidXQganVzdCBpbiBjYXNlKS4KLQkJLy8gV2UgZG9uJ3Qgd2FudCB0byBzdG9yZS9jaGFuZ2UgcnVudGltZS54bWwgcHJlZmVyZW5jZXMKLQkJaWYgKFJVTlRJTUVfWE1MX0lELmVxdWFscyhmdWxsSWQpKSB7Ci0JCQlmdWxsSWQgPSBTU0VfWE1MX0lEOwotCQl9Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGluZmVyUGx1Z2luSWQoZnVsbElkKTsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcyhJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBlY2xpcHNlUHJlZmVyZW5jZXMgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpOwotCQkvLyBUT0RPOiBldmVudGF1bGx5IG5lZWQgZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBhdm9pZCB0aGVzZSBoYXJkIGNvZGVkCi0JCS8vIG1lY2hhbmlzbS4KLQkJLy8gVGhlIGlkZWEgaXMgdG8gbG9hZC9zdG9yZSBiYXNlZCBvbiBwbHVnaW4ncyBwcmVmZXJlbmNlcywgd2hlcmUgdGhlCi0JCS8vIGNvbnRlbnQgdHlwZSB3YXMgY29udHJpYnV0ZWQKLQkJLy8gRXZlbnR1YWxseSwgdG9vLCB3ZSBjb3VsZCBkbyBtb3JlICJkeW5hbWljIGxvb2t1cCIgdG8gZ2V0IHBhcmVudAotCQkvLyB0eXBlcyBmb3IgZGVmYXVsdHMsIGV0Yy4KLQotCQkvLyBHZXQgZGVmYXVsdCBwbHVnaW4gcHJlZmVyZW5jZXMKLQkJU3RyaW5nIHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbiA9IERlZmF1bHRTY29wZS5TQ09QRSArIElQYXRoLlNFUEFSQVRPUiArIGdldENvbnRyaWJ1dG9yUGx1Z2luSWQoY29udGVudFR5cGUpOwotCQlQcmVmZXJlbmNlcyBwbHVnaW5QcmVmZXJlbmNlcyA9IGVjbGlwc2VQcmVmZXJlbmNlcy5ub2RlKHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbik7Ci0KLQkJLy8gdGhlIGJlbG93IGNvZGUgZG9lcyBub3Qgd29yayBhdCB0aGlzIHRpbWUgYmVjYXVzZSBjb250ZW50IHR5cGUKLQkJLy8gcHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiB0aGUgcGxhY2UgYXMgcGx1Z2luIHByZWZlcmVuY2VzCi0KLQkJLy8JCVByZWZlcmVuY2VzIGNvbnRlbnRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCS8vCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkvLwkJCWNvbnRlbnRQcmVmZXJlbmNlcyA9IHBsdWdpblByZWZlcmVuY2VzLm5vZGUoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCS8vCQl9Ci0JCS8vCQllbHNlIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKERFRkFVTFRfTE9DQVRJT04gKTsKLQkJLy8JCX0KLQkJLy8KLQkJLy8JCXJldHVybiBjb250ZW50UHJlZmVyZW5jZXM7Ci0KLQkJcmV0dXJuIHBsdWdpblByZWZlcmVuY2VzOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlyZXR1cm4gZ2V0RGVmYXVsdFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGVjbGlwc2VQcmVmZXJlbmNlcyA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCk7Ci0JCS8vIFRPRE86IGV2ZW50YXVsbHkgbmVlZCBleHRlbnNpb24gbWVjaGFuaXNtIHRvIGF2b2lkIHRoZXNlIGhhcmQgY29kZWQKLQkJLy8gbWVjaGFuaXNtLgotCQkvLyBUaGUgaWRlYSBpcyB0byBsb2FkL3N0b3JlIGJhc2VkIG9uIHBsdWdpbidzIHByZWZlcmVuY2VzLCB3aGVyZSB0aGUKLQkJLy8gY29udGVudCB0eXBlIHdhcyBjb250cmlidXRlZAotCQkvLyBFdmVudHVhbGx5LCB0b28sIHdlIGNvdWxkIGRvIG1vcmUgImR5bmFtaWMgbG9va3VwIiB0byBnZXQgcGFyZW50Ci0JCS8vIHR5cGVzIGZvciBkZWZhdWx0cywgZXRjLgotCi0JCS8vIEdldCBpbnN0YW5jZSBwbHVnaW4gcHJlZmVyZW5jZXMKLQkJU3RyaW5nIHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbiA9IFBsdWdpbi5QTFVHSU5fUFJFRkVSRU5DRV9TQ09QRSArIElQYXRoLlNFUEFSQVRPUiArIGdldENvbnRyaWJ1dG9yUGx1Z2luSWQoY29udGVudFR5cGUpOwotCQlQcmVmZXJlbmNlcyBwbHVnaW5QcmVmZXJlbmNlcyA9IGVjbGlwc2VQcmVmZXJlbmNlcy5ub2RlKHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbik7Ci0KLQkJLy8gdGhlIGJlbG93IGNvZGUgZG9lcyBub3Qgd29yayBhdCB0aGlzIHRpbWUgYmVjYXVzZSBjb250ZW50IHR5cGUKLQkJLy8gcHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiB0aGUgcGxhY2UgYXMgcGx1Z2luIHByZWZlcmVuY2VzCi0KLQkJLy8JCVByZWZlcmVuY2VzIGNvbnRlbnRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCS8vCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkvLwkJCWNvbnRlbnRQcmVmZXJlbmNlcyA9IHBsdWdpblByZWZlcmVuY2VzLm5vZGUoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCS8vCQl9Ci0JCS8vCQllbHNlIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKERFRkFVTFRfTE9DQVRJT04gKTsKLQkJLy8JCX0KLQkJLy8KLQkJLy8JCXJldHVybiBjb250ZW50UHJlZmVyZW5jZXM7Ci0JCXJldHVybiBwbHVnaW5QcmVmZXJlbmNlczsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcyhjb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZXNTdHJpbmcoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBTdHJpbmcga2V5KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoY29udGVudFR5cGUpOwotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoa2V5LCBnZXREZWZhdWx0UHJlZmVyZW5jZXMoY29udGVudFR5cGUpLmdldChrZXksIG51bGwpKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcmVuY2VzU3RyaW5nKFN0cmluZyBjb250ZW50VHlwZUlkLCBTdHJpbmcga2V5KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoY29udGVudFR5cGVJZCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChrZXksIGdldERlZmF1bHRQcmVmZXJlbmNlcyhjb250ZW50VHlwZUlkKS5nZXQoa2V5LCBudWxsKSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZnVsbElkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBpbmZlclBsdWdpbklkKFN0cmluZyBmdWxsSWQpIHsKLQkJLy8gc2ltcGx5IHRyaW0gb2ZmIGxhc3QgInNlZ21lbnQiIGZyb20gZnVsbCBJRC4KLQkJaW50IGxhc3RTZWdtZW50UG9zID0gZnVsbElkLmxhc3RJbmRleE9mKCcuJyk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IG51bGw7Ci0JCWlmIChsYXN0U2VnbWVudFBvcyAhPSAtMSkgewotCQkJcGx1Z2luSWQgPSBmdWxsSWQuc3Vic3RyaW5nKDAsIGxhc3RTZWdtZW50UG9zKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHdlaXJkIGNhc2U/IFdlJ2xsIGF0IGxlYXN0IHB1dC9nZXQgdGhlbSBzb21ld2hlcmUKLQkJCXBsdWdpbklkID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfQotCQlpZiAoIWJ1bmRsZUV4aXN0cyhwbHVnaW5JZCkpIHsKLQkJCS8vIHVzZSBkZWZhdWx0IGxvY2F0aW9uCi0JCQlwbHVnaW5JZCA9IERFRkFVTFRfTE9DQVRJT047Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJhZDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBBIGNvbnZlbmllbmNlIGNsYXNzIHRvIHN0YXRpY2FsbHkgZ2V0IHByZWZlcmVuZW5jZXMuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcyB7Ci0KLQkvLyBhY3R1YWxseSBhIG51bGwvZW1wdHkgc3RyaW5nIGFsc28gbWVhbnMgdXNlIHdvcmtiZW5jaCBkZWZhdWx0IHNvIHRoaXMKLQkvLyBjb25zdGFudCBtaWdodCBub3QgcmVhbGx5IGJlIG5lY2Vzc2FyeQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktCRU5DSF9ERUZBVUxUID0gIldPUktCRU5DSF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBub3RlOiBpdHMgaW1wb3J0YW50IHRvIHVzZSB0aGlzIHN5c3RlbSBwcm9wZXJ0eSwKLQkJLy8gaW5zdGVhZAotCQkvLyBvZgotCQkvLyBCeXRlVG9DaGFyQ29udmVydGVyLmdldERlZmF1bHQoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpCi0JCS8vIGlub3JkZXIgdG8gaGFuZGxlIGNoYW5nZXMgIm9uIHRoZSBmbHkiLiB0aGUKLQkJLy8gQnl0ZVRvQ2hhckNvbnZlcnRlcgotCQkvLyBkZWZhdWx0IGlzIGFwcGFyZW50bHkgc2V0IG9ubHkgd2hlbiBWTSBzdGFydHMuCi0JCS8vIFRoZXJlJ3Mgbm90IHJlYWxseSBhbnkgImN1c29tdGVyIHNjbmVyZXJpb3MiCi0JCS8vIHRoYXQgY2hhbmdlIHRoZQotCQkvLyBkZWZhdWx0IGVuY29kaW5nICJvbiB0aGUgZmx5IiwgYnV0IGl0cyBhdCBsZWFzdAotCQkvLyB1c2VkIGR1cmluZwotCQkvLyBvdXIgYXV0b21hdGVkIHRlc3RzLgotCQlTdHJpbmcgZW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIG5ld0xpbmVDb2RlID0gbnVsbDsKLQkJbmV3TGluZUNvZGUgPSBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5nZXRQcmVmZXJlbmNlc1N0cmluZyhjb250ZW50VHlwZUlkLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFKTsKLQkJaWYgKG5ld0xpbmVDb2RlID09IG51bGwpCi0JCQlyZXN1bHQgPSBudWxsOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpKQotCQkJcmVzdWx0ID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpKQotCQkJcmVzdWx0ID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0xGOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRikpCi0JCQlyZXN1bHQgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1JMRjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGN1cnJlbnQgb3V0cHV0IGVuY29kaW5nIHByZWZlcmVuY2UgZm9yIGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCSAqICh1bmlxdWUgSUFOQSBlbmNvZGluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldE5hbWUoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJU3RyaW5nIHByZWZFbmNvZGluZyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJU3RyaW5nIGVuY29kaW5nID0gcHJlZkVuY29kaW5nOwotCQkvLyBnZXQgd29ya2JlbmNoIGVuY29kaW5nIHByZWZlcmVuY2UgaWYgcHJlZmVyZW5jZQotCQkvLyByZXF1ZXN0cyBpdAotCQlpZiAocHJlZkVuY29kaW5nID09IG51bGwgfHwgcHJlZkVuY29kaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHByZWZFbmNvZGluZy5lcXVhbHMoQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLldPUktCRU5DSF9ERUZBVUxUKSkgewotCQkJZW5jb2RpbmcgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0V29ya2JlbmNoUHJlZmVycmVkQ2hhcnNldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHNwZWNpZmllZCBwcmVmZXJlbmNlLiBTdWJjbGFzc2VzIGNhbid0IG92ZXJyaWRlLAotCSAqIHNpbmNlIHdlIGV4cGVjdCB0aGlzIHRvIHdvcmsgaW4gYSBjb25zaXN0ZW50IHdheS4gTm90ZTogdGhpcyBpcwotCSAqIHNwZWNpZmljIHRvIEhUTUwgYW5kIENTUyBhbmQgaXMgaW50ZW5kZWQgdG8gc3VwcGx5IGEgImRlZmF1bHQgc3BlYyIKLQkgKiBvdGhlciB0aGFuIHRoZSB3b3JrYmVuY2ggcGxhdGZvcm0ncyBkZWZhdWx0LCBvbmx5IGZvciB0aG9zZSBjYXNlcyB3aGVyZQotCSAqIHRoZXJlIGlzIG5vIGVuY29kaW5nIHNwZWNpZmllZCBhbnl3aGVyZSBlbHNlLCBlLmcuIGluIHRoZSBmaWxlLCBvciBhcyBhCi0JICogZmlsZSBvciBmb2xkZXIgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRFbmNvZGluZ1ByZWZlcmVuY2UoKSB7Ci0JCVN0cmluZyBDb250ZW50VHlwZUlEX0hUTUwgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0VXNlclNwZWNpZmllZERlZmF1bHRFbmNvZGluZ1ByZWZlcmVuY2UoQ29udGVudFR5cGVJRF9IVE1MKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZShTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQotCQkvLyBmaXJzdCB0cnkgdG8gZ2V0IGJhc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJRCk7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQllbmMgPSBjb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQl9Ci0JCQotCQkvLyBuZXh0IHRyeSB0byBnZXQgc3NlJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udGVudCB0eXBlCi0JCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSUQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCQl9Ci0JCQotCQkvLyBuZXh0LCBqdXN0IHRyeSBhbmQgdXNlIHdvcmtiZW5jaCBlbmNvZGluZwotCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKTsKLQkJfQotCQkKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgV29ya2JlbmNoIGVuY29kaW5nIHByZWZlcmVuY2UuIE5vdGU6IGlmIHdvcmtiZW5jaCBlbmNvZGluZyBpcwotCSAqIG51bGwsIHBsYXRmb3JtIGVuY29kaW5nIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdvcmtiZW5jaFByZWZlcnJlZENoYXJzZXROYW1lKCkgewotCQlTdHJpbmcgY2hhcnNldCA9IFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCQljaGFyc2V0ID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZShjaGFyc2V0KTsKLQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBXb3JrYmVuY2ggZW5jb2RpbmcgcHJlZmVyZW5jZS4gV2lsbCByZXR1cm4gbnVsbCBpZiBub25lCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVJlc291cmNlc1BsdWdpbiByZXNvdXJjZVBsdWdpbiA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKTsKLQkJU3RyaW5nIGVuYyA9IHJlc291cmNlUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HKTsKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZURlZmF1bHROYW1lUnVsZXMoSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGVuY29kaW5nUHJvdmlkZXIpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQllbmMgPSBlbmNvZGluZ1Byb3ZpZGVyLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBlbmM7Ci0JCX0gZWxzZSB7Ci0JCQllbmMgPSBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZSgpOwotCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5jOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldEphdmFQbGF0Zm9ybURlZmF1bHRFbmNvZGluZygpOwotCQkJCQkvLyBlbmMgc2hvdWxkIG5ldmVyIGJlIG51bGwgKGJ1dCB3ZSdsbAotCQkJCQkvLyBjaGVjayBhbnl3YXkpCi0JCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gZW5jOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUFzc2VydC5pc05vdE51bGwoZW5jLCAicG9zdCBjb25kaXRpb24gaW52YWxpZCIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGVuYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ01lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZGZkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdG8gc2ltcGx5IGhvbGQgaW5mb3JtYXRpb24gYW5kIGRhdGEgYWJvdXQgdGhlIHR5cGUgb2YKLSAqIGVuY29kaW5nIGZvdW5kIGZvciBhIHJlc291cmNlLiBJdCBub3Qgb25seSBpbmNsdWRlcyBuYW1lcywgZXRjLiwgYnV0IGFsc28KLSAqIGdpdmVzIGhpbnRzIGFib3V0IHRoZSBhbGdvcml0aG0sIG9yIHJ1bGUsIHRoYXQgdGhlIGVuY29kbmcgd2FzIGRldGVybWluZWQuCi0gKiBIYXZpbmcgYWxsIHRoaXMgaW5mbyBpbiBhIGNlbnRyYWwgb2JqZWN0LCBhc3NvY2lhdGVkIHdpdGggdGhlIERvY3VtZW50Ci0gKiAodGVjaG5pY2FsbHksIElTdHJ1Y3R1cmVkRG9jdW1lbnQpLCBhbGxvd3MgZm9yIGJldHRlciB1c2VyIGVycm9yIG1lc3NhZ2VzLAotICogYW5kIGJldHRlciBoYW5kbGluZyBvZiBrbm93aW5nIGhvdyB0byBkdW1wIGEgZmlsZSwgZ2l2ZW4gd2Uga25vdyBob3cgaXQgd2FzCi0gKiBsb2FkZWQuCi0gKiAKLSAqIE5vdGU6IHRoZSBkYXRhIGluIHRoaXMgY2xhc3MgaXMgb25seSB2YWxpZCBpZiBpdHMgaGFzIGFjdHVhbGx5IGdvbmUgdGhyb3VnaAotICogdGhlIGxvYWRpbmcgb3IgZHVtcGluZyBzZXF1ZW5jZS4gSXQgaXMgbm90IGFjY3VyYXRlLCBmb3IgZXhhbXBsZSwgaWYgYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIHNpbXBseSBjcmVhdGVkIGFuZCB0aGVuIHNldFRleHQgY2FsbGVkLiBJbiB0aGlzIHR5cGUKLSAqIG9mIGNhc2UsIGFjY3VyYWN5IGZvciBsb2FkaW5nIGFuZCBkdW1waW5nIGlzIG5vdCByZXF1aXJlZCwgc2luY2UgaXRzIGFsbAotICogcmUtZGlzY292ZXJlZC4gT25lIGxpbWl0YXRpb24gaXMgdGhhdCBzdHJ1Y3R1cmVkRG9jdW1lbnQncyBjcmVhdGVkICJmcm9tCi0gKiBzY3JhdGNoIiB0aGlzIHdheSwgZG9uJ3QgaGF2ZSBhbnkgZW5jb2RpbmcgaW5mb3JtYXRpb24gdG8gY291bnQgb24sIGFuZAotICogd291bGQgaGF2ZSB0byBhcnJhbmdlIHRoZSBwcm9jZXNzaW5nIHRvIGJlIGRvbmUuIChBbmQgaXQgaXMgZG9uZSwKLSAqIGF1dG9tYXRpY2FsbHkgaWYgZ29pbmcgdGhyb3VnaCBsb2FkZXIgb3IgZHVtcGVyLCBidXQgcGVyaGFwcyBub3QgaW4gZnV0dXJlCi0gKiBuZXcgdXNlcy4gVE9ETzogdGhpcyBjYW4gYmUgaW5wcm92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLikKLSAqIAotICogaXNJbml0aWFsaXplZCBpcyBzZXQgd2hlbiB0aGUgbG9hZGVyIG9yIGR1bXBlciBwcm9jZXNzZXMgaGF2ZSBiZWVuIHVzZWQsCi0gKiBidXQgZXZlbiB0aGlzIGNhbid0IGJlIGNvdW50ZWQgb24gMTAwJSBpZiB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gbW9kaWZpZWQKLSAqIHNpbmNlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ01lbWVudG8gaW1wbGVtZW50cyBDbG9uZWFibGUgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xPTkVEID0gImNsb25lZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCA9ICJEZWZhdWx0c0Fzc3VtZWRGb3JFbXB0eUlucHV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRTX1VTRURfRFVFX1RPX1NNQUxMX1NUUkVBTSA9ICJkZWZhdWx0c1VzZWREdWVUb1NtYWxsU3RyZWFtIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKgotCSAqIFN0cmluZ3MgdG8gYmUgdXNlZCBmb3IgdHJhY2luZy4gVE9ETzogbmVlZCB0byBjbGVhbiB0aGlzIHVwLCB3ZSBubwotCSAqIGxvbmdlciB1c2UgYWxsIG9mIHRoZW0KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTID0gImRldGVjdGVkU3RhbmRhcmRVbmljb2RlQnl0ZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9VTkRfRU5DT0RJTkdfSU5fQ09OVEVOVCA9ICJmb3VuZEVuY29kaW5nSW5Db250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPVU5EX0VOQ09ESU5HX0lOX1NUUkVBTSA9ICJmb3VuZEVuY29kaW5nSW5TdHJlYW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9VTkRfRU5DT0RJTkdfSU5fU1RSVUNUVVJFRF9ET0NVTUVOVCA9ICJmb3VuZEVuY29kaW5nSW5TdHJ1Y3R1cmVkRG9jdW1lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSA9ICJHdWVzc0VuY29kaW5nRnJvbVN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX05BTUVfRk9VTkRfQVNfSUFOQV9OQU1FID0gIm5vTWFwcGluZ0ZvdW5kQnV0SmF2YU5hbWVGb3VuZFRvQmVJQU5BTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX05BTUVfRk9VTkRfSU5fQUxJQVNfTkFNRSA9ICJub01hcHBpbmdGb3VuZEJ1dEphdmFOYW1lRm91bmRJbkFsaWFzVGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9fSUFOQV9OQU1FX0ZPVU5EID0gIm5vTWFwcGluZ0ZvdW5kRnJvbUphdmFOYW1lVG9JQU5BTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUID0gIlVzZWRDb250ZW50VHlwZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9KQVZBX0RFRkFVTFQgPSAiVXNlZEphdmFEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfTUVNRU5UT19GUk9NX0xPQUQgPSAidXNlZE1lbWVudG9Gcm9tTG9hZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX1BST1BFUlRZX1NFVFRJTkdTID0gIlVTRURfUFJPUEVSVFlfU0VUVElOR1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9VU0VSX1NQRUNJRklFRF9QUkVGRVJFTkNFID0gIlVzZWRVc2VyU3BlY2lmaWVkUHJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX1dPUktTUEFDRV9ERUZBVUxUID0gIlVzZWRXb3Jrc3BhY2VEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRVJfSVNfVVNJTkdfSkFWQV9FTkNPRElORyA9ICJVc2VySXNVc2luZ0phdmFFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmQXBwcm9wcmlhdGVEZWZhdWx0OwotCXByaXZhdGUgU3RyaW5nIGZEZXRlY3RlZENoYXJzZXROYW1lOwotCXByaXZhdGUgU3RyaW5nIGZJbnZhbGlkRW5jb2Rpbmc7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZKYXZhQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZVbmljb2RlU3RyZWFtOwotCXByaXZhdGUgYm9vbGVhbiBmVVRGODNCeXRlQk9NVXNlZDsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCUVuY29kaW5nTWVtZW50byBvYmplY3QgPSBudWxsOwotCQl0cnkgewotCQkJb2JqZWN0ID0gKEVuY29kaW5nTWVtZW50bykgc3VwZXIuY2xvbmUoKTsKLQkJfQotCQljYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UncmUgaW1wbGVtZW50aW5nIGhlcmUKLQkJfQotCi0JCXJldHVybiBvYmplY3Q7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZURlZmF1bHQuIFRoaXMgaXMgb25seSBzZXQgaWYgYW4gaW52YWxpZCBlbmNvZGluZwotCSAqIHdhcyBmb3VuZCwgYW5kIGNvbnRhaW5zIGFuIGNoYXJzZXQgYXBwcm9wcmlhdGUgdG8gdXNlIGFzIGEgZGVmYXVsdAotCSAqIHZhbHVlLCBpZiwgZm9yIGV4YW1wbGUsIHRoZSB1c2VyIGRlY2lkZXMgdG8gbG9hZCB0aGUgZG9jdW1lbnQgYW55d2F5LAotCSAqIGV2ZW4gdGhvdWdoIHRoZSBjaGFyc2V0IHdhcyBmb3VuZCB0byBiZSBpbnZhbGlkLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcHByb3ByaWF0ZURlZmF1bHQoKSB7Ci0JCWlmIChmQXBwcm9wcmlhdGVEZWZhdWx0ID09IG51bGwpIHsKLQkJCWZBcHByb3ByaWF0ZURlZmF1bHQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGZBcHByb3ByaWF0ZURlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcnNldCBuYW1lLCBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY2hhcnNldCBuYW1lCi0JICogZm91bmQgaW4gZ2V0SmF2YUNoYXJzZXROYW1lLiBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGVyZSBhcmUKLQkgKiBkaWZmZXJlbmNlcyBpbiBjYXNlLiBUaGlzIG1ldGhvZCBtaWdodCByZXR1cm4gU0hJRlRfSklTLCBhbmQgdGhlIHRoZQotCSAqIGdldEphdmFDaGFyc2V0TmFtZSBtaWdodCByZXR1cm4gU2hpZnRfSklTIC0tIGlmIFNISUZUX0pJUyB3YXMgZGV0ZWN0ZWQKLQkgKiBpbiBmaWxlL2RvY3VtZW50LiBJZiB0aGUgb3JpZ2luYWwgZmlsZSBjb250YWluZWQgdGhlIGNvcnJlY3QgY2FzZSwgdGhlbgotCSAqIHRoaXMgbWV0aG9kIHdvdWxkIHJldHVybiBudWxsLiBUaGUgZ2V0SmF2YUNoYXJzZXROYW1lIGlzIHR5cGljYWxseSB0aGUKLQkgKiBvbmUgdGhhdCBzaG91bGQgYWx3YXlzIGJlIHVzZWQsIGFuZCB0aGlzIG9uZSBvbmx5IHVzZWQgZm9yIGNlcnRhaW4KLQkgKiBlcnJvciBjb25kaXRpb25zLCBvciBvciBpZiB3aGVuIGNyZWF0aW5nIGEgImR1cGxpY2F0ZSIgcmVzb3VyY2UsIGl0IHdhcwotCSAqIGRlc2lyZWQgdG8gdXNlIGV4YWN0bHkgdGhlIGNoYXJzZXQgbmFtZSBhcyBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuIEFzCi0JICogYW4gZXhhbXBsZSBvZiB0aGlzIGxhdGVyIGNhc2UsIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBtaWdodCBjb250YWluCi0JICogSVNPLTg4NTktOSwgYnV0IHRoZSBkZXRlY3RlZCBjaGFyc2V0IG5hbWUgbWlnaHQgY29udGFpbiBJU08tODg1OS05LUkuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERldGVjdGVkQ2hhcnNldE5hbWUoKSB7Ci0JCXJldHVybiBmRGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY2hhcnNldCBuYW1lIHRoYXQgd2FzIGRldGVjdGVkLCBidXQgbm90IGZvdW5kIHRvIGJlIGEgY2hhcnNldAotCSAqIHN1cHBvb3J0ZWQgYnkgdGhlIFZNLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnZhbGlkRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBmSW52YWxpZEVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmEgY29ub25pY2FsIGNoYXJzZXQgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUNoYXJzZXROYW1lKCkgewotCQlyZXR1cm4gZkphdmFDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB3ZSBtYXkgYmUgYWJsZSB0byByZW1vdmUgdGhpcyBtZXRob2QsIGlmIGl0IHR1cm5zIG91dCB0aGlzIHdvcmsKLQkgKiBpcyBkb25lIGJ5ICJ0ZXh0IiB0eXBlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFVuaWNvZGVCT00oKSB7Ci0JCWJ5dGVbXSBib20gPSBudWxsOwotCQlpZiAoaXNVVEY4M0J5dGVCT01Vc2VkKCkpCi0JCQlib20gPSBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfODsKLQkJZWxzZSBpZiAoaXNVbmljb2RlU3RyZWFtKCkpIHsKLQkJCWlmIChnZXRKYXZhQ2hhcnNldE5hbWUoKS5lcXVhbHMoIlVURi0xNiIpIHx8IGdldEphdmFDaGFyc2V0TmFtZSgpLmVxdWFscygiVVRGLTE2TEUiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlib20gPSBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZMRTsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldEphdmFDaGFyc2V0TmFtZSgpLmVxdWFscygiVVRGLTE2QkUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYm9tID0gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2QkU7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gYm9tOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IGluIG91ciBpbXBsZW1lbnRhdGlvbiwgdGhlIHN0cmVhbSBpcyBhIHVuaWNvZGUgc3RyZWFtIGlmIHRoZQotCSAqIGNoYXJzZXQgaXMgVVRGLTE2LCBVVEYtMTZMRSwgb3IgVVRGLTE2QkUuIEEgc3RyZWFtIHdpdGggMyBieXRlIEJPTSBpcwotCSAqIG5vdCBjb25zaWRlcmVkIHVuaWNvZGUgc3RyZWFtIGhlcmUuCi0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgaXMgYSB1bmljb2RlIChVVEYtMTYpIHN0cmVhbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5pY29kZVN0cmVhbSgpIHsKLQkJcmV0dXJuIGZVbmljb2RlU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IGluIG91ciBpbXBsZW1lbnRhdGlvbiwgdGhlIHN0cmVhbSBpcyBhIHVuaWNvZGUgc3RyZWFtIGlmIHRoZQotCSAqIGNoYXJzZXQgaXMgVVRGLTE2LCBVVEYtMTZMRSwgb3IgVVRGLTE2QkUuIEEgc3RyZWFtIHdpdGggMyBieXRlIEJPTSBpcwotCSAqIG5vdCBjb25zaWRlcmVkIHVuaWNvZGUgc3RyZWFtIGhlcmUuCi0JICogCi0JICogU2V0IGR1cmluZyBsb2FkLCBjYW4gYmUgdXNlZCBieSBkdW1wZXIgdG8gd3JpdGUgMyBieXRlIEJPTSwgd2hpY2ggSmF2YQotCSAqIGRvZXMgbm90IG5vcm1hbGx5IGRvLiBUaGlzIGhlbHBzIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotCSAqIHByb2dyYW1zICh0aG9zZSB0aGF0IHdyb3RlIHRoZSAzIGJ5dGUgQk9NIHRoZXJlIHRvIGJlZ2luIHdpdGguCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVVEY4M0J5dGVCT01Vc2VkKCkgewotCQlyZXR1cm4gZlVURjgzQnl0ZUJPTVVzZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGdldEludmFsaWRFbmNvZGluZygpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXBwcm9wcmlhdGVEZWZhdWx0LgotCSAqIAotCSAqIEBwYXJhbSBhcHByb3ByaWF0ZURlZmF1bHQKLQkgKiAgICAgICAgICAgIFRoZSBhcHByb3ByaWF0ZURlZmF1bHQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwcm9wcmlhdGVEZWZhdWx0KFN0cmluZyBhcHByb3ByaWF0ZURlZmF1bHQpIHsKLQkJZkFwcHJvcHJpYXRlRGVmYXVsdCA9IGFwcHJvcHJpYXRlRGVmYXVsdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERldGVjdGVkQ2hhcnNldE5hbWUoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBkZXRlY3RlZENoYXJzZXROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludmFsaWRFbmNvZGluZyhTdHJpbmcgaW52YWxpZEVuY29kaW5nKSB7Ci0JCWZJbnZhbGlkRW5jb2RpbmcgPSBpbnZhbGlkRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YUVuY29kaW5nTmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUVuY29kaW5nTmFtZQotCSAqICAgICAgICAgICAgVGhlIGphdmFFbmNvZGluZ05hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YUNoYXJzZXROYW1lKFN0cmluZyBqYXZhQ2hhcnNldE5hbWUpIHsKLQkJZkphdmFDaGFyc2V0TmFtZSA9IGphdmFDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaWNvZGVTdHJlYW0oYm9vbGVhbiB1bmljb2RlU3RyZWFtKSB7Ci0JCWZVbmljb2RlU3RyZWFtID0gdW5pY29kZVN0cmVhbTsKLQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVURjgzQnl0ZUJPTWZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB1VEY4M0J5dGVCT01mb3VuZAotCSAqICAgICAgICAgICAgVGhlIHVURjgzQnl0ZUJPTWZvdW5kIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVURjgzQnl0ZUJPTVVzZWQoYm9vbGVhbiB1VEY4M0J5dGVCT01Vc2VkKSB7Ci0JCWZVVEY4M0J5dGVCT01Vc2VkID0gdVRGODNCeXRlQk9NVXNlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZiYmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotCi0vKioKLSAqIENsYXNzIHRvIHByb3ZpZGVkICJlbnVtZXJhdGVkIHR5cGVzIiBmb3IgZW5jb2RpbmcgcnVsZSBwYXJhbWV0ZXIuIFRoaXMgaXMKLSAqIHRvIGJlIHVzZWQgYnkgY2xpZW50IHRvIGhhdmUgc29tZSBjb250cm9sIG92ZXIgaG93IGVuY29kaW5nIGlzIGRldGVybWluZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1J1bGUgewotCS8qKgotCSAqIENPTlRFTlRfQkFTRUQgbWVhbnMgdGhlIGNsYXNzIHdoaWNoIHVzZXMgdGhlIHBhcmFtZXRlciAoc3VjaCBhcwotCSAqIGNvbnRlbnRUeXBlIExvYWRlcnMpIHNob3VsZCB1c2Ugd2hhdCBldmVyIHJ1bGVzIGl0IG5vcm1hbGx5IHdvdWxkLgotCSAqIChOb3RlLCBzb21lIGNvbnRlbnQgdHlwZSBsb2FkZXJzIG1heSBub3QgYWx3YXlzIGxpdGVyYWxseSB1c2UgdGhlIGZpbGUKLQkgKiBjb250ZW50IHRvIGRldGVybWluZSBlbmNvZGluZywgYnV0IHRoZSBwb2ludCBpcyB0aGV5IHNob3VsZCB1c2Ugd2hhdAotCSAqIGV2ZXIgcnVsZXMgdGhleSBub3JtYWxseSB3b3VsZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGluZ1J1bGUgQ09OVEVOVF9CQVNFRCA9IG5ldyBFbmNvZGluZ1J1bGUoIkNPTlRFTlRfQkFTRUQiKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEZPUkNFX0RFRkFVTFQgbWVhbnMgdGhlIGNsYXNzIHdoaWNoIHVzZXMgdGhlIHBhcmFtZXRlciAoc3VjaCBhcwotCSAqIGNvbnRlbnRUeXBlIExvYWRlcnMpIHNob3VsZCB1c2Ugd2hhdCBldmVyIGl0IGRlZmluZXMgYXMgdGhlIGRlZmF1bHQKLQkgKiBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVuY29kaW5nUnVsZSBGT1JDRV9ERUZBVUxUID0gbmV3IEVuY29kaW5nUnVsZSgiRk9SQ0VfREVGQVVMVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJR05PUkVfQ09OVkVSU0lPTl9FUlJPUiBtZWFucyB0aGF0IHRoZSBzYXZlIG9wZXJhdGlvbiBzaG91bGQgc2F2ZSBldmVuCi0JICogaWYgaXQgZW5jb3VudGVycyBjb252ZXJzaW9uIGVycm9ycy4gVGhpcyB3aWxsIHJlc3VsdCBpbiBzb21lIGRhdGEgbG9zcywKLQkgKiBzbyBzaG91bGQgb25seSBiZSB1c2VkIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIHRoYXQgaXMgaW5kZWVkIHdoYXQgdGhleQotCSAqIHdhbnQgdG8gZG8uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGluZ1J1bGUgSUdOT1JFX0NPTlZFUlNJT05fRVJST1IgPSBuZXcgRW5jb2RpbmdSdWxlKCJJR05PUkVfQ09OVkVSU0lPTl9FUlJPUiIpOyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVuY29kaW5nUnVsZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbmNvZGluZ1J1bGUgaXMgcHJpdmF0ZSwgc28gbm8gb25lIGNhbiBpbnN0YW50aWF0ZQotCSAqIGV4Y2VwdCB0aGlzIGNsYXNzIGl0c2VsZi4KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nUnVsZShTdHJpbmcgcnVsZU5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJZW5jb2RpbmdSdWxlID0gcnVsZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGVuY29kaW5nUnVsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb2RlZFJlc291cmNlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb2RlZFJlc291cmNlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjAxZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29kZWRSZXNvdXJjZVBsdWdpbiB7Ci0JU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NzhhZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQgewotCS8qKgotCSAqIFRoZSBBUFBST1BSSUFURV9ERUZBVUxUIGZpZWxkIGlzIHVzZWQgb25seSB3aGVuIHRoZQotCSAqIElDb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCByZXR1cm5zIG51bGwuIEl0cyB0eXBpY2FsbHkgc2V0IGZyb20KLQkgKiB1c2VyIHByZWZlcmVuY2VzLiBLbm93biB1c2VzIGNhc2VzIGFyZSBIVE1MIGFuZCBDU1MsIHdoZXJlIHRoZXJlIGlzIG5vCi0JICogInNwZWMgZGVmYXVsdCIgZm9yIHRob3NlIGNvbnRlbnQgdHlwZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIEFQUFJPUFJJQVRFX0RFRkFVTFQgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImFwcHJvcHJpYXRlRGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIERFVEVDVEVEX0NIQVJTRVQgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB3aGVuIHRoZSAiZGV0ZWN0ZWQiIGNoYXJzZXQKLQkgKiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgamF2YSBjaGFyc2V0LCBldmVuIHRob3VnaCBmdW5jdGlvbmFsbHkKLQkgKiBlcXVpdmVsZW50LiBUaGlzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGNhc2VzIGFyZSBkaWZmZXJlbnQsCi0JICogb3Igd2hlbiBhbiBhbGlhcyBuYW1lIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgY29uYW5pY2FsIG5hbWUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIERFVEVDVEVEX0NIQVJTRVQgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImRldGVjdGVkQ2hhcnNldCIpOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIFVOU1VQUE9SVEVEX0NIQVJTRVQgcHJvcGVydHkgaG9sZHMgdGhlIGNoYXJzZXQgdmFsdWUsIGlmIGl0cyBiZWVuCi0JICogZm91bmQgdG8gYmUgYW4gdW5zdXBwb3RlZCBjaGFyc2V0LiBUaGlzIGlzIGhlbHBmdWwgaW4gZXJyb3IgbWVzc2FnZXMsCi0JICogb3IgaW4gY2FzZXMgd2hlbiBldmVuIHRob3VnaCB0aGUgY2hhcnNldCBpcyBpbnZhbGlkLCB0aGUgamF2YSBjaGFyc2V0Ci0JICogaXMgYXNzdW1lZCB0byBiZSB0aGUgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgVU5TVVBQT1JURURfQ0hBUlNFVCA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAidW5zdXBwb3J0ZWRDaGFyc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lSZXNvdXJjZUNoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5NWI1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lSZXNvdXJjZUNoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBJU3RyZWFtQ2hhcnNldERldGVjdG9yIHsKLQl2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVN0cmVhbUNoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JU3RyZWFtQ2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWFlY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JU3RyZWFtQ2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJU3RyZWFtQ2hhcnNldERldGVjdG9yIHsKLQlTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0Jdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pOwotCi0Jdm9pZCBzZXQoUmVhZGVyIHJlYWRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzlhZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLQotcHVibGljIGNsYXNzIE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEphdmFQbGF0Zm9ybURlZmF1bHRFbmNvZGluZygpIHsKLQkJU3RyaW5nIGVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVzZXJTcGVjaWZpZWREZWZhdWx0Rm9yQ29udGVudFR5cGUoSUZpbGUgaUZpbGUpIHsKLQkJU3RyaW5nIGVuYyA9IG51bGw7Ci0JCQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJY29udGVudFR5cGUgPSBpRmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKS5nZXRDb250ZW50VHlwZSgpOwotCQkJCi0JCQkvLyBmaXJzdCB0cnkgdG8gZ2V0IGJhc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUgCi0JCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCWVuYyA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCQl9Ci0KLQkJCS8vIG5leHQgdHJ5IHRvIGdldCBzc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQllbmMgPSBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5nZXRQcmVmZXJlbmNlc1N0cmluZyhjb250ZW50VHlwZSwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZW5jID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBjb3JlIGV4Y2VwdGlvbiBvY2N1cnMsIGFzc3VtZSBubyBwcmVmZXJlbmNlIQotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVzZXJTcGVjaWZpZWREZWZhdWx0Rm9yQ29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJU3RyaW5nIGVuYyA9IG51bGw7Ci0JCQotCQkvLyBmaXJzdCB0cnkgdG8gZ2V0IGJhc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQllbmMgPSBjb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQl9Ci0JCQotCQkvLyBuZXh0IHRyeSB0byBnZXQgc3NlJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udGVudCB0eXBlCi0JCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCQl9Ci0JCQotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpIHsKLQkJUmVzb3VyY2VzUGx1Z2luIHJlc291cmNlUGx1Z2luID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpOwotCQlTdHJpbmcgZW5jID0gcmVzb3VyY2VQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoUmVzb3VyY2VzUGx1Z2luLlBSRUZfRU5DT0RJTkcpOwotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNwZWNEZWZhdWx0Ci0JICogICAgICAgICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IGNoYXJzZXQgbmFtZSB0aGF0IHdvdWxkIG9yZGluYXJpbHkgYmUKLQkgKiAgICAgICAgICAgIHVzZWQgZm9yIGEgcGFydGljdWxhciB0eXBlIG9mIGNvbnRlbnQuIE51bGwgbWF5IGJlCi0JICogICAgICAgICAgICBzcGVjaWZpZmVkIGZvciB0aG9zZSB0eXBlcyB3aXRoIG5vIHNwZWMgZGVmYXVsdC4gSWYgdGhlIHNwZWMKLQkgKiAgICAgICAgICAgIGRlZmF1bHQgaXMga25vd24gKGFuZCBwYXNzZWQgaW4pLCB0aGVuIGl0IHdpbGwgYmUgcmV0dXJuZWQKLQkgKiAgICAgICAgICAgIGFmdGVyIGJlaW5nIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXJlJ3MgYmUgYW55IHVzZXIgc3BlY2lmaWVkCi0JICogICAgICAgICAgICAib3ZlcnJpZGUiIGZvciB0aGF0IGNoYXJzZXQgKHdoaWNoIHdvdWxkIGJlIHJhcmUpLiBJbiBvdGhlcgotCSAqICAgICAgICAgICAgd29yZHMsIGlmIHRoZSBzcGVjIGlzIGtub3duLCB0aGVyZSdzIGxpdHRsZSByZWFzb24gdG8gdXNlCi0JICogICAgICAgICAgICB0aGlzIG1ldGhvZC4KLQkgKiBAcmV0dXJuIHRoZSBjaGFyc2V0IHRoYXQgc2hvdWxkIGJlIHVzZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcwotCSAqICAgICAgICAgZXN0YWJsaXNoZWQgYnkgdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB1c2VEZWZhdWx0TmFtZVJ1bGVzKFN0cmluZyBzcGVjRGVmYXVsdCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWVuYyA9IHNwZWNEZWZhdWx0OwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGVuYzsKLQkJfSBlbHNlIHsKLQkJCWVuYyA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZSgpOwotCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5jLnRyaW0oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmMgPSBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBlbmMudHJpbSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJZW5jID0gZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJCS8vIGVuYyBzaG91bGQgbmV2ZXIgYmUgbnVsbCAoYnV0IHdlJ2xsCi0JCQkJCS8vIGNoZWNrIGFueXdheSkKLQkJCQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBlbmM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWYxOGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0Jc3RhdGljIGNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzCi0JICogbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbgotCSAqIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZQotCSAqIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyNmJkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBwcmV0dHkgbGltaXRlZCBpbXBsZW1lbnRhdGlvbiwgc29ydCBvZiBzcGVjaWZpYyAKLSAqIHRvIHRoZSB3YXkgaXRzIHVzZWQgYnkgdG9rZW5pemVycyAoSkZsZXgpLiBUbyByZWFsbHkgCi0gKiBiZSBnZW5lcmFsIHB1cnBvc2UsIHdvdWxkIG5lZWQgbW9yZSB3b3JrLiAKLSAqCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRMaW1pdGVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotCXByaXZhdGUgaW50IGxpbWl0ZWRDb3VudDsKLQlwcml2YXRlIGludCBuUmVhZDsKLQotCXB1YmxpYyBCdWZmZXJlZExpbWl0ZWRSZWFkZXIoUmVhZGVyIHJlYWRlciwgaW50IHNpemUpIHsKLQkJc3VwZXIocmVhZGVyLCBzaXplKTsKLQkJaWYgKHJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJbWFyayhzaXplKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJbGltaXRlZENvdW50ID0gc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJblJlYWQrKzsKLQkJaWYgKG5SZWFkID4gbGltaXRlZENvdW50KSB7Ci0JCQlyZXN1bHQgPSAtMTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHN1cGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKG5SZWFkICsgbGVuID4gbGltaXRlZENvdW50KSB7Ci0JCQlyZXN1bHQgPSAtMTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHN1cGVyLnJlYWQoY2J1Ziwgb2ZmLCBsZW4pOwotCQkJblJlYWQgPSBuUmVhZCArIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyMGNiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewotCi0JcHJpdmF0ZSBpbnQgbGltaXRlZENvdW50OwotCi0JcHVibGljIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBpblN0cmVhbSwgaW50IHNpemUpIHsKLQkJc3VwZXIoaW5TdHJlYW0sIHNpemUpOwotCQltYXJrKHNpemUpOwotCQl0cnkgewotCQkJbGltaXRlZENvdW50ID0gTWF0aC5taW4oc2l6ZSwgaW5TdHJlYW0uYXZhaWxhYmxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB1bmxpa2VseQotCQkJbGltaXRlZENvdW50ID0gMDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIGxpbWl0ZWRDb3VudCAtIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBjb3BpZWQgZG93biBmcm9tIHN1cGVyIGNsYXNzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZU9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogY29waWVkIGRvd24gZnJvbSBzdXBlciBjbGFzcyB0aGVuLCBjaGFuZ2VkIHRvIHNpbWl1bGF0ZSBFT0YgaWYgZ29lcwotCSAqIGJleW9uZCBidWZmZXJlZCBhbW91bnQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlT3BlbigpOwotCQkvLyBmb3IgdGhpcyBzcGVjaWFsIHN0cmVhbSwgaW5kaWNhdGUgImVuZCBvZiBmaWxlIiB3aGVuIGJ1ZmZlciBpcwotCQkvLyBmdWxsCi0JCWlmIChwb3MgPj0gbGltaXRlZENvdW50KSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlYWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgc3RyZWFtLCBpbmRpY2F0ZSAiZW5kIG9mIGZpbGUiIHdoZW4gYnVmZmVyIGlzCi0JCS8vIGZ1bGwKLQkJaWYgKHBvcyA+PSBsaW1pdGVkQ291bnQpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGM1MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgewotCQl0aGlzLmZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiB0aGlzLmZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSB0aGlzLmZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCh0aGlzLmZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSB0aGlzLmZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0NvZGVkUmVzb3VyY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjMGI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvZGVkUmVzb3VyY2VQbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlZFJlc291cmNlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSUNvZGVkUmVzb3VyY2VQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb2RlZFJlc291cmNlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvZGVkUmVzb3VyY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvZGVkUmVzb3VyY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4LCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTEwMTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjNhYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL051bGxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI21hcmsoaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrU3VwcG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQkvLyB3ZSBjYW4gbWFyayBub3RoaW5nLgotCQkvLyBhbmQsIHdlIGFyZSB1c2luZyB0aGlzIE51bGwgY2xhc3Mgc3BlY2lmaWNhbGx5IGZvcgotCQkvLyBhICJmYWtlIiByZXNldHRhYmxlIHN0cmVhbS4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3JlYWQoKQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZXNldCgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2M3ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vL1RPRE86IHJld29yayB0aGlzIHdpdGggbmV3IHBsYXRmb3JtL3J1bnRpbWUgQVBJcyAoaWYgc3RpbGwgbmVlZGVkKS4KLQotcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlSGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZVVSSSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkksIExvY2FsZSB0YXJnZXRMb2NhbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gdHJ5IHRvIGxvYWQgYnVuZGxlIGZyb20gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2VVUkkKLQkJLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSByZXNvdXJjZVVSSSBwb2ludHMgdG8gdGhlIGxvY2FsCi0JCS8vIGZpbGUgc3lzdGVtCi0KLQkJaW50IGluZGV4ID0gcmVzb3VyY2VVUkkubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcmVzb3VyY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gQmVsb3cgd2Ugc2V0ICdyZXNvdXJjZURpcmVjdG9yeScgc28gdGhhdCBpdCBlbmRzIHdpdGggYSAnLycuCi0JCS8vIEhlcmUncyBhbiBleGNlcnB0IGZyb20gdGhlIENsYXNzTG9hZGVyIEphdmFkb2MgLi4uCi0JCS8vIEFueSBVUkwgdGhhdCBlbmRzIHdpdGggYSAnLycgaXMgYXNzdW1lZCB0byByZWZlciB0byBhIGRpcmVjdG9yeS4KLQkJLy8gT3RoZXJ3aXNlLCB0aGUgVVJMIGlzIGFzc3VtZWQKLQkJLy8gdG8gcmVmZXIgdG8gYSBKQVIgZmlsZSB3aGljaCB3aWxsIGJlIG9wZW5lZCBhcyBuZWVkZWQuCi0JCS8vCi0JCVN0cmluZyByZXNvdXJjZURpcmVjdG9yeSA9IHJlc291cmNlVVJJLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotCQlTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lID0gcmVzb3VyY2VVUkkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0KLQkJLy8gY3JlYXRlIGEgY2xhc3MgbG9hZGVyIHdpdGggYSBjbGFzcyBwYXRoIHRoYXQgcG9pbnRzIHRvIHRoZSByZXNvdXJjZQotCQkvLyBidW5kbGUncyBsb2NhdGlvbgotCQkvLyAgICAgICAgIAotCQlVUkxbXSBjbGFzc3BhdGggPSBuZXcgVVJMWzFdOwotCQljbGFzc3BhdGhbMF0gPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwocmVzb3VyY2VEaXJlY3RvcnkpKTsKLQkJQ2xhc3NMb2FkZXIgcmVzb3VyY2VMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoY2xhc3NwYXRoLCBudWxsKTsKLQotCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSwgdGFyZ2V0TG9jYWxlLCByZXNvdXJjZUxvYWRlcik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Vbmljb2RlQk9NRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M1MTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Vbmljb2RlQk9NRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSAiY29tbW9uIGZ1bmN0aW9uIiBjbGFzcyB0byBkZWNpZGUgaWYgYW4gaW5wdXQgc3RyZWFtLCBpcyBhCi0gKiB1bmljb2RlIHN0cmVhbS4KLSAqLwotcHVibGljIGNsYXNzIFVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNl9DSEFSU0VUX05BTUUgPSAiVVRGLTE2IjsKLQkvLyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vdEVub3VnaElucHV0Rm9yQk9NRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCi0JCS8qKgotCQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIE5vdEVub3VnaElucHV0Rm9yQk9NRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCQlzdXBlcihzKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBCQiA9IChieXRlKSAweEJCOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgQkYgPSAoYnl0ZSkgMHhCRjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEVGID0gKGJ5dGUpIDB4RUY7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBGRSA9IChieXRlKSAtMjsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgRkYgPSAoYnl0ZSkgLTE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNkJFX0NIQVJTRVRfTkFNRSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2TEVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84X0NIQVJTRVRfTkFNRSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZk5vQk9NUG9zc2libGU7Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja0ZvckJPTShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQotCQl0cnkgewotCQkJYnl0ZSBiMSA9IGdldE5leHRCeXRlKGlucHV0U3RyZWFtKTsKLQkJCWJ5dGUgYjIgPSBnZXROZXh0Qnl0ZShpbnB1dFN0cmVhbSk7Ci0JCQlpZiAoYjEgPT0gRkUgJiYgYjIgPT0gRkYpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oVVRGXzE2QkVfQ0hBUlNFVF9OQU1FKTsKLQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGIxID09IEZGICYmIGIyID09IEZFKSB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUVuY29kaW5nTWVtZW50byhVVEZfMTZMRV9DSEFSU0VUX05BTUUpOwotCQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlieXRlIGIzID0gZ2V0TmV4dEJ5dGUoKGlucHV0U3RyZWFtKSk7Ci0JCQkJCWlmIChiMSA9PSBFRiAmJiBiMiA9PSBCQiAmJiBiMyA9PSBCRikgewotCQkJCQkJcmVzdWx0ID0gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFVURl84X0NIQVJTRVRfTkFNRSk7Ci0JCQkJCQlyZXN1bHQuc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBzb3J0IG9mIHVuZXhwZWN0ZWQgZm9yIG5vcm1hbCBjYXNlcywgYnV0IGNhbiBvY2N1ciBmb3IKLQkJCS8vIGVtcHR5Ci0JCQkvLyBzdHJlYW1zLiBBbmQsIHRoaXMgY2FuIG9jY3VyICJub3JtYWxseSIgZm9yIG5vbi1CT00gc3RyZWFtcwotCQkJLy8gdGhhdAotCQkJLy8gaGF2ZSBvbmx5IHR3bwotCQkJLy8gYnl0ZXMsIGFuZCBmb3Igd2hpY2ggdGhvc2UgdHdvIGJ5dGVzIG1hdGNoIHRoZSBmaXJzdCB0d28gYnl0ZXMKLQkJCS8vIG9mIFVURi04Ci0JCQkvLyBCT00gSW4gYW55IGNhc2UsIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbDsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG90aGVyIGVycm9ycyBzaG91bGQgYmUgaW1wb3NzaWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGphdmFFbmNvZGluZ05hbWUpIHsKLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShqYXZhRW5jb2RpbmdOYW1lKTsKLQkJU3RyaW5nIGlhbmFOYW1lID0gQ2hhcnNldC5mb3JOYW1lKGphdmFFbmNvZGluZ05hbWUpLm5hbWUoKTsKLQkJZW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoaWFuYU5hbWUpOwotCQlpZiAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzhfQ0hBUlNFVF9OQU1FKSkgewotCQkJZW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSUFOQSBlbmNvZGluZyBuYW1lIGlmIEJPTSBkZXRlY3RlZCBpbiBzdHJlYW0uIElmIGEgQk9NIGlzCi0JICogZGV0ZWN0ZWQsIHRoZSBzdHJlYW0gaXMgbGVmdCBwb3NpdGlvbmVkIGFmdGVyIHJlYWR5aW5nIHRoZSBCT00uIElmIGEKLQkgKiBCT00gaXMgbm90IGRldGVjdGVkLCB0aGUgc3RlYW0gaXMgcmVzZXQuCi0JICogCi0JICogMHhGRUZGIFVURi0xNiwgYmlnLWVuZGlhbiAweEZGRkUgVVRGLTE2LCBsaXR0bGUtZW5kaWFuIDB4RUZCQkJGIFVURi04Ci0JICogKEJPTSBpcyBvcHRpb25hbCkKLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gLQotCSAqICAgICAgICAgICAgbXVzdCBiZSBhIHJlc2V0YWJsZSAobWFyayBzdXBwb3J0ZWQpIHN0cmVhbSBzbyBpdCBjYW4gYmUKLQkgKiAgICAgICAgICAgIHJlc2V0LCBpZiBub3QgQk9NIGVuY29kZWQgc3RyZWFtCi0JICogQHJldHVybiBTdHJpbmcgLSBJQU5BIGVuY29kaW5nbmFtZSAobWF5IG5vdCB3b3JrIHdlbGwgb24gMS4zLCBidXQgMS40Ci0JICogICAgICAgICBzZWVtcyB0byBoYXZlIGdvb2Qgc3VwcG9ydCBmb3IgSUFOQSBuYW1lcykKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKCFmTm9CT01Qb3NzaWJsZSkgewotCi0JCQlpZiAoZklucHV0U3RyZWFtID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghZklucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlucHV0U3RyZWFtIG11c3QgYmUgcmVzZXRhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmVzdWx0ID0gY2hlY2tGb3JCT00oZklucHV0U3RyZWFtKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwcml2YXRlIGJ5dGUgZ2V0TmV4dEJ5dGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaW50IGJ5dGVDaGFyQXNJbnQgPSAtMTsKLQkJLy8gYmUgc3VyZSB3ZSB3b24ndCBibG9jawotCQlpZiAoaW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQlieXRlQ2hhckFzSW50ID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJYnl0ZUNoYXJBc0ludCA9IGJ5dGVDaGFyQXNJbnQgJiAwWEZGOwotCQl9Ci0JCS8vIHRvIGF2b2lkIGNvbmZ1c3Rpb24gb3ZlciBtZWFuaW5nIG9mIHJldHVybmVkIGJ5dGUsCi0JCS8vIHRocm93IGV4Y2VwdGlvbiBpZiBFT0YgcmVhY2hlZC4KLQkJaWYgKGJ5dGVDaGFyQXNJbnQgPT0gLTEpCi0JCQl0aHJvdyBuZXcgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oInR5cGljYWxseSBub3QgYW4gZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKGJ5dGUpIGJ5dGVDaGFyQXNJbnQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBUaGVyZSBpcyBubyBkZWZhdWx0IGZvciB0aGlzIGNhc2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZk5vQk9NUG9zc2libGUgPSBmYWxzZTsKLQkJZklucHV0U3RyZWFtID0gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0KG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlTdG9yYWdlLmdldENvbnRlbnRzKCksIENvZGVkSU8uTUFYX0JVRl9TSVpFKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlpZiAocmVhZGVyIGluc3RhbmNlb2YgQnl0ZVJlYWRlcikgewotCQkJQnl0ZVJlYWRlciBieXRlUmVhZGVyID0gKEJ5dGVSZWFkZXIpIHJlYWRlcjsKLQkJCWZJbnB1dFN0cmVhbSA9IGJ5dGVSZWFkZXIuZklucHV0U3RyZWFtOwotCQl9IGVsc2UgewotCQkJZk5vQk9NUG9zc2libGUgPSB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9DaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTI1M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsIGV4dGVuZHMgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgU3RyaW5nIGZDaGFyc2V0TmFtZTsKLQotCXB1YmxpYyBDaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBDaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbChTdHJpbmcgY2hhcnNldE5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJZkNoYXJzZXROYW1lID0gY2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmQ2hhcnNldE5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFyc2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZDaGFyc2V0TmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOTU2N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL01hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEludGVuZGVkIHRvIGJlIGEgbW9yZSBwcmVjaXNlIGZvcm0gb2YgdGhlIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uLCB3aGVyZQotICogY2hhcmFjdGVyIHBvc2l0aW9uIGFuZCBhdHRlbXB0ZWQgZW5jb2RpbmcgY2FuIGJlIGF0dGVtcHRlZC4KLSAqLwotcHVibGljIGNsYXNzIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbCBleHRlbmRzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBpbnQgZkNoYXJQb3NpdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmRGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZkV4Y2VlZGVkTWF4ID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkphdmFDaGFyc2V0TmFtZTsKLQlwcml2YXRlIGludCBmTWF4QnVmZmVyOwotCi0JLyoqCi0JICogRGlzYWxsb3cgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gSWYgYXR0ZW1wdGVkRW5jb2RpbmcgYW5kIGNoYXJQb3N0aW9uIGNhbgotCSAqIG5vdCBiZSBwcm92aWRlZCwgdXNlIG9uZSBvZiBqYXZhJ3MgTWFsZm9ybWVkRXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBlbmNvZGluZ05hbWUsIGludCBjaGFyUG9zdGlvbikgewotCQl0aGlzLmZKYXZhQ2hhcnNldE5hbWUgPSBlbmNvZGluZ05hbWU7Ci0JCXRoaXMuZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBlbmNvZGluZ05hbWU7Ci0JCXRoaXMuZkNoYXJQb3NpdGlvbiA9IGNoYXJQb3N0aW9uOwotCX0KLQotCXB1YmxpYyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGF0dGVtcHRlZEphdmFFbmNvZGluZywgU3RyaW5nIGF0dGVtcHRlZElBTkFFbmNvZGluZywgaW50IGNoYXJQb3N0aW9uKSB7Ci0JCXRoaXMuZkphdmFDaGFyc2V0TmFtZSA9IGF0dGVtcHRlZEphdmFFbmNvZGluZzsKLQkJdGhpcy5mRGV0ZWN0ZWRDaGFyc2V0TmFtZSA9IGF0dGVtcHRlZElBTkFFbmNvZGluZzsKLQkJdGhpcy5mQ2hhclBvc2l0aW9uID0gY2hhclBvc3Rpb247Ci0JfQotCi0JLyoqCi0JICogSWYgY2hhclBvc2l0aW9uID0gLTEgdGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24KLQkgKiBleGNlZWRlZCB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSwgbWF4QnVmZmVyLCB0aGVuIGV4Y2VlZGVkTWF4ID0gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBhdHRlbXB0ZWRKYXZhRW5jb2RpbmcsIFN0cmluZyBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcsIGludCBjaGFyUG9zdGlvbiwgYm9vbGVhbiBleGNlZWRlZE1heCwgaW50IG1heEJ1ZmZlcikgewotCQl0aGlzLmZKYXZhQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRKYXZhRW5jb2Rpbmc7Ci0JCXRoaXMuZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRJQU5BRW5jb2Rpbmc7Ci0JCXRoaXMuZkNoYXJQb3NpdGlvbiA9IGNoYXJQb3N0aW9uOwotCQl0aGlzLmZFeGNlZWRlZE1heCA9IGV4Y2VlZGVkTWF4OwotCQl0aGlzLmZNYXhCdWZmZXIgPSBtYXhCdWZmZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0ZW1wdGVkSUFOQUVuY29kaW5nKCkgewotCQlyZXR1cm4gZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0ZW1wdGVkSmF2YUVuY29kaW5nKCkgewotCQlyZXR1cm4gZkphdmFDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hhclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkNoYXJQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXhCdWZmZXIuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heEJ1ZmZlcigpIHsKLQkJcmV0dXJuIGZNYXhCdWZmZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhjZWVkZWRNYXguCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGNlZWRlZE1heCgpIHsKLQkJcmV0dXJuIGZFeGNlZWRlZE1heDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2Y5ZjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi0KLXB1YmxpYyBjbGFzcyBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsIGV4dGVuZHMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERpc2FsbG93IGRlZmF1bHQgY29uc3RydWN0b3IuIElmIGF0dGVtcHRlZEVuY29kaW5nIGFuZCBjaGFyUG9zdGlvbiBjYW4KLQkgKiBub3QgYmUgcHJvdmlkZWQsIHVzZSBzdW4uaW8uTWFsZm9ybWVkRXhjZXB0aW9uLgotCSAqLwotCXByaXZhdGUgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbCgpIHsKLQkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBkaXNhbGxvd2VkLCBzaW5jZSBpZgotCQkvLyBleHRyYSBpbmZvIGNhbiBub3QgYmUgcHJvdmlkZWQsIHRoZSByZWd1bGFyCi0JCS8vIE1hbGZvcm1lZCBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93bgotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLgotCSAqIAotCSAqIEBwYXJhbSBhdHRlbXB0ZWRKYXZhRW5jb2RpbmcKLQkgKiBAcGFyYW0gYXR0ZW1wdGVkSUFOQUVuY29kaW5nCi0JICogQHBhcmFtIGNoYXJQb3N0aW9uCi0JICovCi0JcHVibGljIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGF0dGVtcHRlZEphdmFFbmNvZGluZywgU3RyaW5nIGF0dGVtcHRlZElBTkFFbmNvZGluZywgaW50IGNoYXJQb3N0aW9uKSB7Ci0JCXN1cGVyKGF0dGVtcHRlZEphdmFFbmNvZGluZywgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBjaGFyUG9zdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL1Vuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkYzQwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uczsKLQotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLQotCi0vKioKLSAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHNhbWUgcHVycG9zZSBhcyBpdCBzdXBlciBjbGFzcywgYnV0IHNpbXBseSBwcm92aWRlcwotICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGFuIHRoZSBuYW1lIGluIGVycm9yLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsCi0gKiBmb3IgIlVJcyIgd2hpY2ggY2FuIHByZXNlbnQgdXNlcnMgd2l0aCB0aGUgZXJyb3IsIGFuZCB0aGUKLSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGEgcGFydGljdWxhciBpbnB1dC4KLSAqLwotcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZXh0ZW5kcyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudGlvOwotCi0JcHVibGljIFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwoRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50bykgewotCQl0aGlzKGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCkpOwotCQlmRW5jb2RpbmdNZW1lbnRpbyA9IGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwcm90ZWN0ZWQgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgY2hhcnNldE5hbWUpIHsKLQkJc3VwZXIoY2hhcnNldE5hbWUpOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50aW87Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL0lGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvSUZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWM0NzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvSUZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci0KLS8qKgotICogU2Nhbm5lcnMgZm9yIHRoZSBtYWluIFRhc2sgU2Nhbm5lci4gU2Nhbm5lcnMgbWF5IGJlIGNvbnRyaWJ1dGVkIHVzaW5nIHRoZQotICogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIGV4dGVuc2lvbiBwb2ludC4gRm9yIHJlc291cmNlcyBhbmQKLSAqIHJlc291cmNlIGRlbHRhcyB3aXRoIG1hdGNoaW5nIGNvbnRlbnQgdHlwZXMsIHRoZSBtYWluIHNjYW5uZXIgd2lsbCBmaXJzdAotICogY2FsbCB0aGUgc3RhcnR1cCgpIG1ldGhvZCwgc2NhbigpLCBhbmQgdGhlbiBzaHV0ZG93bigpIGluIHNlcXVlbmNlLiBTY2FubmVyCi0gKiBpbnN0YW5jZXMgd2lsbCBiZSByZXVzZWQgYWNyb3NzIHByb2plY3RzIGJ1dCBhcmUgbm90IHNoYXJlZCBwZXIgY29udGVudAotICogdHlwZS4gU2Nhbm5lcnMgc2hvdWxkIG5vdCBob2xkIG9uIHRvIHJlZmVyZW5jZXMgdG8gbW9kZWxzIG9yIHJlc291cmNlcwotICogYWZ0ZXIgc2h1dGRvd24oKSBhbmQgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gbGVhayBtZW1vcnkgb3IgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlVGFza1NjYW5uZXIgewotCS8qKgotCSAqIE1hcmtlciB0eXBlIElEIG9mIHRhc2sgbWFya2VycyB0aGF0IGFyZSBjcmVhdGVkLCBhbGwgc2Nhbm5lcnMgYXJlCi0JICogZXhwZWN0ZWQgdG8gdXNlIHRoaXMgdHlwZSBvciBzdWJ0eXBlcwotCSAqLwotCVN0cmluZyBUQVNLX01BUktFUl9JRCA9IFNTRUNvcmVQbHVnaW4uSUQgKyAiLnRhc2siOyAvLyROT04tTkxTLTEkOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhhdCB0aGUgbGlzdCBvZiBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyZWQgdGFza3MgZm9yIHRoZSBnaXZlbgotCSAqIGZpbGUgYmUgdXBkYXRlZC4gT25jZSBjb21wbGV0ZWQsIHRoZSBsaXN0IG9mIHRhc2tzIHNob3VsZCBjb3JyZXNwb25kCi0JICogZXhhY3RseSB0byB0aGUgZmlsZSdzIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIC0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNjYW5uZWQKLQkgKiBAcGFyYW0gdGFza1RhZ3MgLQotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgdGFzayB0YWdzIGZvciB3aGljaCB0byBzY2FuCi0JICogQHBhcmFtIG1vbml0b3IgLQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtYXBzIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZXMgZm9yIHRhc2sgbWFya2VycyB0bwotCSAqICAgICAgICAgYmUgY3JlYXRlZAotCSAqLwotCU1hcFtdIHNjYW4oSUZpbGUgZmlsZSwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHNjYW5uZXIgdGhhdCBzY2FubmluZyBpcyBkb25lIGZvciBub3cuIFJlc291cmNlcyBoZWxkIGZyb20KLQkgKiBzdGFydHVwIHNob3VsZCBub3cgYmUgcmVsZWFzZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgLQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhhdCB3YXMganVzdCBzY2FubmVkCi0JICovCi0Jdm9pZCBzaHV0ZG93bihJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBzY2FubmVyIHRoYXQgYSBzZXF1ZW5jZSBvZiBzY2FucyBpcyBhYm91dCB0byBiZSByZXF1ZXN0ZWQuCi0JICogSWRlYWxseSB0aGUgdGltZSB0byBsb2FkIHByZWZlcmVuY2VzIGFuZCBwZXJmb3JtIGFueSBleHBlbnNpdmUKLQkgKiBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCAtCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGF0IGlzIGFib3V0IHRvIGJlIHNjYW5uZWQKLQkgKiAKLQkgKi8KLQl2b2lkIHN0YXJ0dXAoSVByb2plY3QgcHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL1Rhc2tUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvVGFza1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWI3MjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvVGFza1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0vKioKLSAqIFNpbXBsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWVzIHRoYXQgbWFrZSB1cCBhIFRhc2sgVGFnCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYXNrVGFnIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0hJR0ggPSBJTWFya2VyLlBSSU9SSVRZX0hJR0g7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfTE9XID0gSU1hcmtlci5QUklPUklUWV9MT1c7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfTk9STUFMID0gSU1hcmtlci5QUklPUklUWV9OT1JNQUw7Ci0KLQkvKioKLQkgKiB0aGlzIHRhc2sgdGFnJ3MgcHJpb3JpdHkKLQkgKi8KLQlwcml2YXRlIGludCBmUHJpb3JpdHkgPSBQUklPUklUWV9OT1JNQUw7Ci0JCi0JLyoqCi0JICogdGhpcyB0YXNrIHRhZydzICJ0YWdnaW5nIiB0ZXh0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZlRhZyA9IG51bGw7Ci0KLQlwdWJsaWMgVGFza1RhZyhTdHJpbmcgdGFnLCBpbnQgcHJpb3JpdHkpIHsKLQkJc3VwZXIoKTsKLQkJZlRhZyA9IHRhZzsKLQkJZlByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIGZQcmlvcml0eTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKLQkJcmV0dXJuIGZUYWc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFRhZygpICsgIjoiICsgZ2V0UHJpb3JpdHkoKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwZjE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL0ZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgY2xhc3MgU2Nhbm5lckluZm8gewotCQlTdHJpbmcgZklkOwotCQlJRmlsZVRhc2tTY2FubmVyIGZTY2FubmVyOwotCi0JCVNjYW5uZXJJbmZvKFN0cmluZyBpZCwgSUZpbGVUYXNrU2Nhbm5lciBzY2FubmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJZklkID0gaWQ7Ci0JCQlmU2Nhbm5lciA9IHNjYW5uZXI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFNjYW5uZXJJbmZvICYmIGZJZC5lcXVhbHMoKChTY2FubmVySW5mbykgb2JqKS5mSWQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCXJldHVybiBmSWQ7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGVUYXNrU2Nhbm5lciBnZXRTY2FubmVyKCkgewotCQkJcmV0dXJuIGZTY2FubmVyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgX2luc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBBVFRfQ09OVEVOVF9UWVBFUyA9ICJjb250ZW50VHlwZUlkcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZlNjYW5uZXJFbGVtZW50czsKLQotCS8vIGEgbWFwcGluZyBmcm9tIGNvbnRlbnQgdHlwZXMgdG8gU2Nhbm5lckluZm8gaW5zdGFuY2VzCi0JcHJpdmF0ZSBNYXAgZlNjYW5uZXJJbmZvcyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBOQU1FX1NDQU5ORVIgPSAic2Nhbm5lciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIFNDQU5ORVJfRVhURU5TSU9OX1BPSU5UX0lEID0gU1NFQ29yZVBsdWdpbi5JRCArICIudGFza3NjYW5uZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUlGaWxlVGFza1NjYW5uZXJbXSBnZXRGaWxlVGFza1NjYW5uZXJzKElDb250ZW50VHlwZVtdIGNvbnRlbnRUeXBlcykgewotCQlpZiAoZlNjYW5uZXJFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJfQotCi0JCUxpc3Qgc2Nhbm5lckluZm9zID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJU2Nhbm5lckluZm9bXSBzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZSA9IChTY2FubmVySW5mb1tdKSBmU2Nhbm5lckluZm9zLmdldChjb250ZW50VHlwZXNbaV0uZ2V0SWQoKSk7Ci0JCQlpZiAoc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJCXNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlID0gbG9hZFNjYW5uZXJzKGNvbnRlbnRUeXBlc1tpXSk7Ci0JCQl9Ci0JCQkvLyBvbmx5IGFkZCBub24tZHVwbGljYXRlIHNjYW5uZXJzCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFzY2FubmVySW5mb3MuY29udGFpbnMoc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGVbal0pKSB7Ci0JCQkJCXNjYW5uZXJJbmZvcy5hZGQoc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGVbal0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJRmlsZVRhc2tTY2FubmVyW10gc2Nhbm5lcnMgPSBuZXcgSUZpbGVUYXNrU2Nhbm5lcltzY2FubmVySW5mb3Muc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzY2FubmVycy5sZW5ndGg7IGkrKykgewotCQkJc2Nhbm5lcnNbaV0gPSAoKFNjYW5uZXJJbmZvKSBzY2FubmVySW5mb3MuZ2V0KGkpKS5nZXRTY2FubmVyKCk7Ci0JCX0KLQkJcmV0dXJuIHNjYW5uZXJzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZUlkcygpIHsKLQkJaWYgKGZTY2FubmVyRWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSByZWxldmFudCBleHRlbnNpb25zCi0JCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBzY2FubmVyRWxlbWVudHMgPSBmU2Nhbm5lckVsZW1lbnRzOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHNjYW5uZXJFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJaWYgKCFzY2FubmVyRWxlbWVudHNbal0uZ2V0TmFtZSgpLmVxdWFscyhOQU1FX1NDQU5ORVIpKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nW10gY29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc2Nhbm5lckVsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZShBVFRfQ09OVEVOVF9UWVBFUykpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50VHlwZUlkcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghdHlwZXMuY29udGFpbnMoY29udGVudFR5cGVJZHNbaV0pKSB7Ci0JCQkJCXR5cGVzLmFkZChjb250ZW50VHlwZUlkc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgdHlwZXMudG9BcnJheShuZXcgU3RyaW5nW3R5cGVzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgU2Nhbm5lckluZm9bXSBsb2FkU2Nhbm5lcnMoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlTY2FubmVySW5mb1tdIHNjYW5uZXJJbmZvcyA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGRlbGVnYXRlRWxlbWVudHMgPSBmU2Nhbm5lckVsZW1lbnRzOwotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVsZWdhdGVFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCWlmICghZGVsZWdhdGVFbGVtZW50c1tqXS5nZXROYW1lKCkuZXF1YWxzKE5BTUVfU0NBTk5FUikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0cmluZ1tdIHN1cHBvcnRlZENvbnRlbnRUeXBlSWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGRlbGVnYXRlRWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UX1RZUEVTKSk7Ci0JCQkJSUNvbnRlbnRUeXBlW10gc3VwcG9ydGVkQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVtzdXBwb3J0ZWRDb250ZW50VHlwZUlkcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc3VwcG9ydGVkQ29udGVudFR5cGVJZHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJc3VwcG9ydGVkQ29udGVudFR5cGVzW2tdID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKHN1cHBvcnRlZENvbnRlbnRUeXBlSWRzW2tdLnRyaW0oKSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc3VwcG9ydGVkQ29udGVudFR5cGVJZHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJLy8gYWxsb3cgc3VidHlwZXMgdG8gYmUgcmV0dXJuZWQgYXMgd2VsbAotCQkJCQlpZiAoc3VwcG9ydGVkQ29udGVudFR5cGVzW2tdICE9IG51bGwgJiYgY29udGVudFR5cGUuaXNLaW5kT2Yoc3VwcG9ydGVkQ29udGVudFR5cGVzW2tdKSkgewotCQkJCQkJZWxlbWVudHMuYWRkKGRlbGVnYXRlRWxlbWVudHNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gaW5zdGFudGlhdGUgYW5kIHNhdmUgdGhlIHNjYW5uZXJzCi0JCQlMaXN0IHNjYW5uZXJJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMuc2l6ZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJRmlsZVRhc2tTY2FubmVyIHNjYW5uZXIgPSAoSUZpbGVUYXNrU2Nhbm5lcikgKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnRzLmdldChpKSkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCQlpZiAoc2Nhbm5lciAhPSBudWxsKSB7Ci0JCQkJCQlzY2FubmVySW5mb0xpc3QuYWRkKG5ldyBTY2FubmVySW5mbygoKElDb25maWd1cmF0aW9uRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpKS5nZXRBdHRyaWJ1dGUoQVRUX0lEKSwgc2Nhbm5lcikpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiTm9uLWZhdGFsIGV4Y2VwdGlvbiBjcmVhdGluZyB0YXNrIHNjYW5uZXIgZm9yICIgKyBjb250ZW50VHlwZS5nZXRJZCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXNjYW5uZXJJbmZvcyA9IChTY2FubmVySW5mb1tdKSBzY2FubmVySW5mb0xpc3QudG9BcnJheShuZXcgU2Nhbm5lckluZm9bc2Nhbm5lckluZm9MaXN0LnNpemUoKV0pOwotCQkJZlNjYW5uZXJJbmZvcy5wdXQoY29udGVudFR5cGUuZ2V0SWQoKSwgc2Nhbm5lckluZm9zKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NSRUdJU1RSWSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlZCAiICsgc2Nhbm5lckluZm9zLmxlbmd0aCArICIgdGFzayBzY2FubmVyIGZvciAiICsgY29udGVudFR5cGUuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBzY2FubmVySW5mb3M7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJZlNjYW5uZXJJbmZvcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIEp1c3QgcmVtZW1iZXIgdGhlIGVsZW1lbnRzLCBzbyBwbHVnaW5zIGRvbid0IGhhdmUgdG8gYmUgYWN0aXZhdGVkLAotCQkvLyB1bmxlc3MgZXh0ZW5zaW9uIGF0dHJpYnV0ZXMgbWF0Y2ggdGhvc2Ugb2YgaW50ZXJlc3QKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChTQ0FOTkVSX0VYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlmU2Nhbm5lckVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1N0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU3ZTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLlRhc2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotLyoqCi0gKiBBIGRlbGVnYXRlIHRvIGNyZWF0ZSBJTWFya2VyLlRBU0tzIGZvciAidG9kb3MiIGFuZCBzaW1pbGlhciBjb21tZW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgaW1wbGVtZW50cyBJRmlsZVRhc2tTY2FubmVyIHsKLQkvLyB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgbmV3IHRhc2tzIGZvciB0aGUgY3VycmVudCBmaWxlCi0JcHJvdGVjdGVkIExpc3QgZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMgPSBudWxsOwotCi0JTGlzdCBvbGRNYXJrZXJzID0gbnVsbDsKLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQkJZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFuY2UgY3JlYXRlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIHdpdGggd2hpY2ggYSBuZXdseSBjcmVhdGVkIG1hcmtlciB3aWxsIGJlCi0JICogaW5pdGlhbGl6ZWQuIE1vZGlmaWVkIGZyb20gdGhlIG1ldGhvZCBpbiBNYXJrZXJSdWxlckFjdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgbWFya2VyIGF0dHJpYnV0ZXMKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGNyZWF0ZUluaXRpYWxNYXJrZXJBdHRyaWJ1dGVzKFN0cmluZyB0ZXh0LCBpbnQgZG9jdW1lbnRMaW5lLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIGludCBwcmlvcml0eSkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDYpOwotCQkvLyBtYXJrZXIgbGluZSBudW1iZXJzIGFyZSAxLWJhc2VkCi0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGRvY3VtZW50TGluZSArIDEpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5UQVNLLCBJRmlsZVRhc2tTY2FubmVyLlRBU0tfTUFSS0VSX0lEKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihzdGFydE9mZnNldCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcihzdGFydE9mZnNldCArIGxlbmd0aCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLk1FU1NBR0UsIHRleHQpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlVTRVJfRURJVEFCTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXQiLCBuZXcgU3RyaW5nW117IiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJc3dpdGNoIChwcmlvcml0eSkgewotCQkJY2FzZSBJTWFya2VyLlBSSU9SSVRZX0hJR0ggOiB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9ISUdIKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNYXJrZXIuUFJJT1JJVFlfTE9XIDogewotCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfTE9XKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDogewotCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfTk9STUFMKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZXRlY3RDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJZCA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGQuZ2V0Q2hhcnNldCgpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8qCi0JCQkJICogc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZSB0eXBlCi0JCQkJICogY2hlY2sgYWJvdmUKLQkJCQkgKi8KLQkJCX0KLQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29udGVudHMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGNvbnRlbnRzLCBmaWxlLmdldE5hbWUoKSwgbmV3IFF1YWxpZmllZE5hbWVbXXtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9KTsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24uZ2V0Q2hhcnNldCgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2lsbCB0cnkgdG8gY2xlYW51cCBpbiBmaW5hbGx5Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbm90IHN1cmUgaG93IHRvIHJlY292ZXIgYXQgdGhpcyBwb2ludAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gY29tbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRUYXNrcyhJRG9jdW1lbnQgZG9jdW1lbnQsIFRhc2tUYWdbXSB0YXNrVGFncywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29tbWVudCkgewotCQlpZiAoaXNDb21tZW50UmVnaW9uKGRvY3VtZW50UmVnaW9uLCBjb21tZW50KSkgewotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tbWVudCk7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21tZW50KTsKLQkJCXRyeSB7Ci0JCQkJaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydE9mZnNldCk7Ci0JCQkJaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kT2Zmc2V0KTsKLQkJCQlmb3IgKGludCBsaW5lTnVtYmVyID0gc3RhcnRMaW5lOyBsaW5lTnVtYmVyIDw9IGVuZExpbmU7IGxpbmVOdW1iZXIrKykgewotCQkJCQlJUmVnaW9uIGxpbmUgPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQkJCWludCBiZWdpbiA9IE1hdGgubWF4KHN0YXJ0T2Zmc2V0LCBsaW5lLmdldE9mZnNldCgpKTsKLQkJCQkJaW50IGVuZCA9IE1hdGgubWluKGVuZE9mZnNldCwgbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJCQlpbnQgbGVuZ3RoID0gZW5kIC0gYmVnaW47Ci0KLQkJCQkJLyogWFhYOiBUaGlzIGdlbmVyYXRlcyBhIGxvdCBvZiBnYXJiYWdlIG9iamVjdHMgKi8KLQotCQkJCQlTdHJpbmcgY29tbWVudGVkVGV4dCA9IGdldENvbW1lbnRlZFRleHQoZG9jdW1lbnQsIGJlZ2luLCBsZW5ndGgpOwotCQkJCQlTdHJpbmcgY29tcGFyaXNvblRleHQgPSBjb21tZW50ZWRUZXh0LnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbnQgdGFnSW5kZXggPSBjb21wYXJpc29uVGV4dC5pbmRleE9mKHRhc2tUYWdzW2ldLmdldFRhZygpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7Ci0JCQkJCQlpZiAodGFnSW5kZXggPj0gMCkgewotCQkJCQkJCVN0cmluZyBtYXJrZXJEZXNjcmlwdGlvbiA9IGNvbW1lbnRlZFRleHQuc3Vic3RyaW5nKHRhZ0luZGV4KTsKLQkJCQkJCQlpbnQgbWFya2VyT2Zmc2V0ID0gYmVnaW4gKyB0YWdJbmRleDsKLQkJCQkJCQlpbnQgbWFya2VyTGVuZ3RoID0gZW5kIC0gbWFya2VyT2Zmc2V0OwotCQkJCQkJCWZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLmFkZChjcmVhdGVJbml0aWFsTWFya2VyQXR0cmlidXRlcyhtYXJrZXJEZXNjcmlwdGlvbiwgbGluZU51bWJlciwgbWFya2VyT2Zmc2V0LCBtYXJrZXJMZW5ndGgsIHRhc2tUYWdzW2ldLmdldFByaW9yaXR5KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kVGFza3MoSUZpbGUgZmlsZSwgZmluYWwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGFuZGxlckZvcihmaWxlKTsKLQotCQkJLy8gcmVjb3JkcyBpZiB0aGUgb3B0aW1pemVkIHN0cmVhbWlzaCBwYXJzZSB3YXMgcG9zc2libGUKLQkJCWJvb2xlYW4gZGlkU3RyZWFtUGFyc2UgPSBmYWxzZTsKLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQkJCWZpbmFsIElFbmNvZGVkRG9jdW1lbnQgZGVmYXVsdERvY3VtZW50ID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGRlZmF1bHREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBkZWZhdWx0RG9jdW1lbnQpLmdldFBhcnNlcigpOwotCQkJCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHsKLQkJCQkJZGlkU3RyZWFtUGFyc2UgPSB0cnVlOwotCQkJCQlTdHJpbmcgY2hhcnNldCA9IGRldGVjdENoYXJzZXQoZmlsZSk7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBkb2N1bWVudFBhcnNlciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHBhcnNlcjsKLQkJCQkJZmluYWwgSURvY3VtZW50IHRleHREb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJCQlzZXREb2N1bWVudENvbnRlbnQodGV4dERvY3VtZW50LCBmaWxlLmdldENvbnRlbnRzKHRydWUpLCBjaGFyc2V0KTsKLQkJCQkJZG9jdW1lbnRQYXJzZXIucmVzZXQobmV3IERvY3VtZW50UmVhZGVyKHRleHREb2N1bWVudCkpOwotCQkJCQlkb2N1bWVudFBhcnNlci5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIGNvbW1lbnQgPSByZWdpb25zLmdldChqKTsKLQkJCQkJCQkJZmluZFRhc2tzKHRleHREb2N1bWVudCwgdGFza1RhZ3MsIGRvY3VtZW50UmVnaW9uLCBjb21tZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gZGlzY29ubmVjdCB0aGUgZG9jdW1lbnQgcmVnaW9ucwotCQkJCQkJCWlmIChkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwpIHsKLQkJCQkJCQkJZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKS5zZXRQcmV2aW91cyhudWxsKTsKLQkJCQkJCQkJZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKS5zZXROZXh0KG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCQl0ZXh0RG9jdW1lbnQuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCWRvY3VtZW50UGFyc2VyLmdldERvY3VtZW50UmVnaW9ucygpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZGlkU3RyZWFtUGFyc2UpIHsKLQkJCQkvLyBVc2UgYSBTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCQlJRW5jb2RlZERvY3VtZW50IGRvY3VtZW50ID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlKTsKLQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBjb21tZW50ID0gcmVnaW9ucy5nZXQoaik7Ci0JCQkJCQkJZmluZFRhc2tzKGRvY3VtZW50LCB0YXNrVGFncywgZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpOwotCQkJCQkJfQotCQkJCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdpdGggIiArIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgZW5jb3VudGVyZWQgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHJlYWRpbmcgIiArIGZpbGUuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aXRoICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWVudGVkVGV4dChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBiZWdpbiwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvY3VtZW50LmdldChiZWdpbiwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBNYXBbXSBzY2FuKElGaWxlIGZpbGUsIFRhc2tUYWdbXSB0YXNrVGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLmNsZWFyKCk7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSB8fCAhc2hvdWxkU2NhbihmaWxlKSkgewotCQkJcmV0dXJuIG5ldyBNYXBbMF07Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BFUkYpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKHRhc2tUYWdzLmxlbmd0aCA+IDApIHsKLQkJCWZpbmRUYXNrcyhmaWxlLCB0YXNrVGFncywgbW9uaXRvcik7Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BFUkYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBmb3IgIiArIGZpbGUuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoTWFwW10pIGZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLnRvQXJyYXkobmV3IE1hcFtmTmV3TWFya2VyQXR0cmlidXRlTWFwcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCBjb250ZW50IGZyb20gdGhpcyBzdHJlYW0gYW5kIGNsb3NlcyB0aGUgc3RyZWFtCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoYXJzZXQpIHsKLQkJUmVhZGVyIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb250ZW50U3RyZWFtLCBjaGFyc2V0KSwgMjA0OCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMDQ4KTsKLQkJCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0JCQlpbnQgbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQkJZG9jdW1lbnQuc2V0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWJvb2xlYW4gc2hvdWxkU2NhbihJUmVzb3VyY2UgcikgewotCQkvLyBza2lwICJkb3QiIGZpbGVzCi0JCVN0cmluZyBzID0gci5nZXROYW1lKCk7Ci0JCXJldHVybiBzLmxlbmd0aCgpID09IDAgfHwgcy5jaGFyQXQoMCkgIT0gJy4nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyAiIHNodXRkb3duIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydHVwKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyAiIHN0YXJ0dXAgZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIGxvYWRpbmcgcHJlZnMgZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODY3YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogUXVldWVpbmcgSm9iIGZvciBwcm9jZXNzaW5nIGRlbHRhcyBhbmQgcHJvamVjdHMuCi0gKi8KLWNsYXNzIFRhc2tTY2FubmluZ0pvYiBleHRlbmRzIEpvYiB7Ci0Jc3RhdGljIGZpbmFsIGludCBKT0JfREVMQVlfREVMVEEgPSA1MDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpPQl9ERUxBWV9QUk9KRUNUID0gMTAwMDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCA9ICJ0YXNrLXRhZy1wcm9qZWN0cy1hbHJlYWR5LXNjYW5uZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBMaXN0IGZRdWV1ZSA9IG51bGw7Ci0KLQkvKiogc3ltYm9saWMgbmFtZSBmb3IgT1NHSSBmcmFtZXdvcmsgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPU0dJX0ZSQU1FV09SS19JRCA9ICJvcmcuZWNsaXBzZS5vc2dpIjsgLy8kTk9OLU5MUy0xJAotCi0JVGFza1NjYW5uaW5nSm9iKCkgewotCQlzdXBlcihTU0VDb3JlTWVzc2FnZXMuVGFza1NjYW5uZXJfMCk7Ci0JCWZRdWV1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkRFQ09SQVRFKTsKLQkJc2V0U3lzdGVtKGZhbHNlKTsKLQotCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVELCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBhZGREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlmUXVldWUuYWRkKGRlbHRhKTsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0pPQikgewotCQkJU3RyaW5nIGtpbmQgPSBudWxsOwotCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLkFEREVEXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLkNIQU5HRURdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuUkVNT1ZFRF0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0JCQkJCWtpbmQgPSAiIFtJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT00gOgotCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBkZWx0YSAiICsgZGVsdGEuZ2V0RnVsbFBhdGgoKSArIGtpbmQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2NoZWR1bGUoSk9CX0RFTEFZX0RFTFRBKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGlzRW5hYmxlZFByb2plY3QocHJvamVjdCkpIHsKLQkJCWZRdWV1ZS5hZGQocHJvamVjdCk7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzY2hlZHVsZShKT0JfREVMQVlfUFJPSkVDVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMKLQkgKiAgICAgICAgIHNodXR0aW5nIGRvd24pCi0JICovCi0JYm9vbGVhbiBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHsKLQkJLy8gaW4gdGhlIEZyYW1ld29yayBjbGFzcyB0aGVyZSdzIGEgbm90ZToKLQkJLy8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3lzdGVtIEJ1bmRsZSB0byBTVE9QUElORy4KLQkJLy8gdGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QgYWNjb3JkaW5nIHRvIHNlY3Rpb24gNC4xOS4yIGZyb20gdGhlIE9TR2kKLQkJLy8gUjMgc3BlYy4KLQkJYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSAhUGxhdGZvcm0uaXNSdW5uaW5nKCkgfHwgUGxhdGZvcm0uZ2V0QnVuZGxlKE9TR0lfRlJBTUVXT1JLX0lEKS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVE9QUElORzsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0pPQiAmJiBzaHV0dGluZ0Rvd24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFza1NjYW5uaW5nSm9iOiBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZFByb2plY3QoSVJlc291cmNlIHByb2plY3QpIHsKLQkJU3RyaW5nW10gcHJvamVjdHNTY2FubmVkID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCkpOwotCi0JCWJvb2xlYW4gc2hvdWxkU2NhbiA9IHRydWU7Ci0JCVN0cmluZyBuYW1lID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCWZvciAoaW50IGogPSAwOyBzaG91bGRTY2FuICYmIGogPCBwcm9qZWN0c1NjYW5uZWQubGVuZ3RoOyBqKyspIHsKLQkJCWlmIChwcm9qZWN0c1NjYW5uZWRbal0uZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0pPQikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY2FubmluZyBKb2Igc2tpcHBpbmcgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNob3VsZFNjYW4gPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvdWxkU2NhbjsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgTGlzdCByZXRyaWV2ZVF1ZXVlKCkgewotCQlMaXN0IHF1ZXVlID0gZlF1ZXVlOwotCQlmUXVldWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBxdWV1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKQotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCi0JCXZhbGlkYXRlUmVtZW1iZXJlZFByb2plY3RMaXN0KFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlMaXN0IGN1cnJlbnRRdWV1ZSA9IHJldHJpZXZlUXVldWUoKTsKLQkJTGlzdCBlcnJvcnMgPSBudWxsOwotCQlpbnQgdGlja3MgPSBjdXJyZW50UXVldWUuc2l6ZSgpOwotCQlTdHJpbmcgdGFza05hbWUgPSBudWxsOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKSB7Ci0JCQl0YXNrTmFtZSA9ICJTY2FubmluZyAoIiArIHRpY2tzICsgIiB3b3JrIGl0ZW1zKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJdGFza05hbWUgPSBTU0VDb3JlTWVzc2FnZXMuVGFza1NjYW5uaW5nSm9iXzA7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIHRpY2tzKTsKLQotCQlJUHJvZ3Jlc3NNb25pdG9yIHNjYW5Nb25pdG9yID0gbnVsbDsKLQkJd2hpbGUgKCFjdXJyZW50UXVldWUuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgbyA9IGN1cnJlbnRRdWV1ZS5yZW1vdmUoMCk7Ci0JCQlpZiAoZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl0cnkgewotCQkJCXNjYW5Nb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZURlbHRhKSB7Ci0JCQkJCVdvcmtzcGFjZVRhc2tTY2FubmVyLmdldEluc3RhbmNlKCkuc2NhbigoSVJlc291cmNlRGVsdGEpIG8sIHNjYW5Nb25pdG9yKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCVdvcmtzcGFjZVRhc2tTY2FubmVyLmdldEluc3RhbmNlKCkuc2NhbigoSVByb2plY3QpIG8sIHNjYW5Nb25pdG9yKTsKLQkJCQkJU3RyaW5nW10gcHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZCA9IFN0cmluZ1V0aWxzLnVucGFjayhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpKTsKLQkJCQkJU3RyaW5nW10gdXBkYXRlZFByb2plY3RzID0gbmV3IFN0cmluZ1twcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkLmxlbmd0aCArIDFdOwotCQkJCQl1cGRhdGVkUHJvamVjdHNbcHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZC5sZW5ndGhdID0gKChJUmVzb3VyY2UpIG8pLmdldE5hbWUoKTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkLCAwLCB1cGRhdGVkUHJvamVjdHMsIDAsIHByb2plY3RzUHJldmlvdXNseVNjYW5uZWQubGVuZ3RoKTsKLQkJCQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQsIFN0cmluZ1V0aWxzLnBhY2sodXBkYXRlZFByb2plY3RzKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGVycm9ycyA9PSBudWxsKSB7Ci0JCQkJCWVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl9Ci0JCQkJZXJyb3JzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRUNvcmVQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQltb25pdG9yLmRvbmUoKTsKLQotCQlpZiAoZXJyb3JzID09IG51bGwgfHwgZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChlcnJvcnMuc2l6ZSgpID09IDEpIHsKLQkJCQlzdGF0dXMgPSAoSVN0YXR1cykgZXJyb3JzLmdldCgwKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlTdGF0dXNbXSBzdGF0aWkgPSAoSVN0YXR1c1tdKSBlcnJvcnMudG9BcnJheShuZXcgSVN0YXR1c1tlcnJvcnMuc2l6ZSgpXSk7Ci0JCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRUNvcmVQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIHN0YXRpaSwgU1NFQ29yZU1lc3NhZ2VzLlRhc2tTY2FubmluZ0pvYl8xLCBudWxsKTsKLQkJCX0KLQkJfQotCi0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJlbWVtYmVyZWRQcm9qZWN0TGlzdChTdHJpbmcgcHJlZmVyZW5jZU5hbWUpIHsKLQkJU3RyaW5nW10gcmVtZW1iZXJlZFByb2plY3ROYW1lcyA9IFN0cmluZ1V0aWxzLnVucGFjayhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhwcmVmZXJlbmNlTmFtZSkpOwotCQlJUmVzb3VyY2VbXSB3b3Jrc3BhY2VQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1t3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdE5hbWVzW2ldID0gd29ya3NwYWNlUHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotCQl9Ci0KLQkJTGlzdCBwcm9qZWN0TmFtZXNUb1JlbWVtYmVyID0gbmV3IEFycmF5TGlzdChyZW1lbWJlcmVkUHJvamVjdE5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtZW1iZXJlZFByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZW1lbWJlcmVkUHJvamVjdEV4aXN0cyA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7ICFyZW1lbWJlcmVkUHJvamVjdEV4aXN0cyAmJiBqIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKHJlbWVtYmVyZWRQcm9qZWN0TmFtZXNbaV0uZXF1YWxzKHByb2plY3ROYW1lc1tqXSkpIHsKLQkJCQkJcmVtZW1iZXJlZFByb2plY3RFeGlzdHMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZW1lbWJlcmVkUHJvamVjdEV4aXN0cykgewotCQkJCXByb2plY3ROYW1lc1RvUmVtZW1iZXIuYWRkKHJlbWVtYmVyZWRQcm9qZWN0TmFtZXNbaV0pOwotCQkJfQotCQkJZWxzZSBpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmluZyAiICsgcmVtZW1iZXJlZFByb2plY3ROYW1lc1tpXSArICIgcmVtb3ZlZCBmcm9tICIgKyBwcmVmZXJlbmNlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2plY3ROYW1lc1RvUmVtZW1iZXIuc2l6ZSgpICE9IHJlbWVtYmVyZWRQcm9qZWN0TmFtZXMubGVuZ3RoKSB7Ci0JCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKHByZWZlcmVuY2VOYW1lLCBTdHJpbmdVdGlscy5wYWNrKChTdHJpbmdbXSkgcHJvamVjdE5hbWVzVG9SZW1lbWJlci50b0FycmF5KG5ldyBTdHJpbmdbcHJvamVjdE5hbWVzVG9SZW1lbWJlci5zaXplKCldKSkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nU2NoZWR1bGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ1NjaGVkdWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTVmMTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nU2NoZWR1bGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBUYXNrU2Nhbm5pbmdTY2hlZHVsZXIgewotCXByaXZhdGUgY2xhc3MgTGlzdGVuZXJWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCWludCByZXNvdXJjZVR5cGUgPSBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKTsKLQkJCQlpZiAocmVzb3VyY2VUeXBlID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuUk9PVCkgewotCQkJCQl0cnkgewotCQkJCQkJZGVsdGEuYWNjZXB0KHRoaXMpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBoYW5kbGluZyByZXNvdXJjZSBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgPiAwIHx8IChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5FTkNPRElORykgPiAwIHx8IChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpID4gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQlmSm9iLmFkZERlbHRhKGRlbHRhKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGFza1NjYW5uaW5nU2NoZWR1bGVyIHNjaGVkdWxlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKCkgewotCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFRhc2tTY2FubmluZ0pvYi5UQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlzY2hlZHVsZXIuZW5xdWV1ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZ1tdIHByb2plY3ROYW1lcyA9IFN0cmluZ1V0aWxzLnVucGFjayhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhUYXNrU2Nhbm5pbmdKb2IuVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVEKSk7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBmcmVzaFByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwcm9qZWN0TmFtZXNbaV0uZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgewotCQkJCWZyZXNoUHJvamVjdExpc3QuYWRkKHByb2plY3ROYW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGZyZXNoUHJvamVjdHMgPSBTdHJpbmdVdGlscy5wYWNrKChTdHJpbmdbXSkgZnJlc2hQcm9qZWN0TGlzdC50b0FycmF5KG5ldyBTdHJpbmdbZnJlc2hQcm9qZWN0TGlzdC5zaXplKCldKSk7Ci0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVGFza1NjYW5uaW5nSm9iLlRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgZnJlc2hQcm9qZWN0cyk7IC8vJE5PTi1OTFMtMSQKLQotCQlzY2hlZHVsZXIuZW5xdWV1ZShwcm9qZWN0KTsKLQl9Ci0KLQotCS8qKgotCSAqIE9ubHkgZm9yIHVzZSBieSBTU0VDb3JlUGx1Z2luIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlpZiAoc2NoZWR1bGVyICE9IG51bGwpIHsKLQkJCXNjaGVkdWxlci5mSm9iLmNhbmNlbCgpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoc2NoZWR1bGVyLnZpc2l0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT25seSBmb3IgdXNlIGJ5IFNTRUNvcmVQbHVnaW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJc2NoZWR1bGVyID0gbmV3IFRhc2tTY2FubmluZ1NjaGVkdWxlcigpOwotCi0JCS8qCi0JCSAqIEFjY29yZGluZyB0bwotCQkgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UvZGV2ZWxvcG1lbnQvcGVyZm9ybWFuY2UvYmxvb3BlcnMuaHRtbCwKLQkJICogUE9TVF9DSEFOR0UgbGlzdGVuZXJzIGFkZCBhIHRyaXZpYWwgcGVyZm9ybWFuY2UgY29zdAotCQkgKi8KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoc2NoZWR1bGVyLnZpc2l0b3IsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotCQlzY2hlZHVsZXIuZW5xdWV1ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQl9Ci0KLQlUYXNrU2Nhbm5pbmdKb2IgZkpvYiA9IG51bGw7Ci0KLQlMaXN0ZW5lclZpc2l0b3IgdmlzaXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIFRhc2tTY2FubmluZ1NjaGVkdWxlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkpvYiA9IG5ldyBUYXNrU2Nhbm5pbmdKb2IoKTsKLQkJdmlzaXRvciA9IG5ldyBMaXN0ZW5lclZpc2l0b3IoKTsKLQl9Ci0KLQl2b2lkIGVucXVldWUoSVByb2plY3QgcHJvamVjdCkgewotCQlmSm9iLmFkZFByb2plY3QocHJvamVjdCk7Ci0JfQotCi0Jdm9pZCBlbnF1ZXVlKElXb3Jrc3BhY2VSb290IHJvb3QpIHsKLQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJZkpvYi5hZGRQcm9qZWN0KGFsbFByb2plY3RzW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1RhZ1ByZWZlcmVuY2VLZXlzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tUYWdQcmVmZXJlbmNlS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNlMzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1RhZ1ByZWZlcmVuY2VLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRhc2tUYWdQcmVmZXJlbmNlS2V5cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQgPSAiaWdub3JlZC1jb250ZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfRU5BQkxFID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfTk9ERSA9IFNTRUNvcmVQbHVnaW4uSUQgKyBJUGF0aC5TRVBBUkFUT1IgKyAidGFzay10YWdzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX1BFUl9QUk9KRUNUID0gInVzZS1wcm9qZWN0LXNldHRpbmdzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX1BSSU9SSVRJRVMgPSAidGFza1ByaW9yaXRpZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfVEFHUyA9ICJ0YXNrVGFncyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvV29ya3NwYWNlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvV29ya3NwYWNlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwMDY3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1dvcmtzcGFjZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuVGFza1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogRGlzcGF0Y2hlciBmb3Igc2Nhbm5pbmcgYmFzZWQgb24gZGVsdGFzIGFuZCByZXF1ZXN0ZWQgcHJvamVjdHMKLSAqLwotY2xhc3MgV29ya3NwYWNlVGFza1NjYW5uZXIgewotCXByaXZhdGUgc3RhdGljIFdvcmtzcGFjZVRhc2tTY2FubmVyIF9pbnN0YW5jZSA9IG51bGw7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIFdvcmtzcGFjZVRhc2tTY2FubmVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBXb3Jrc3BhY2VUYXNrU2Nhbm5lcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JZmluYWwgU3RyaW5nIERFRkFVTFRfTUFSS0VSX1RZUEUgPSBJRmlsZVRhc2tTY2FubmVyLlRBU0tfTUFSS0VSX0lEOwotCXByaXZhdGUgTGlzdCBmQWN0aXZlU2Nhbm5lcnMgPSBudWxsOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkN1cnJlbnRJZ25vcmVDb250ZW50VHlwZXMgPSBudWxsOwotCXByaXZhdGUgVGFza1RhZ1tdIGZDdXJyZW50VGFza1RhZ3MgPSBudWxsOwotCi0JcHJpdmF0ZSBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciByZWdpc3RyeSA9IG51bGw7Ci0KLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFdvcmtzcGFjZVRhc2tTY2FubmVyKCkgewotCQlzdXBlcigpOwotCQlyZWdpc3RyeSA9IEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCk7Ci0JCWZBY3RpdmVTY2FubmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZkN1cnJlbnRUYXNrVGFncyA9IG5ldyBUYXNrVGFnWzBdOwotCQlmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcyA9IG5ldyBJQ29udGVudFR5cGVbMF07Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBkZXRlY3RDb250ZW50VHlwZXMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQlpZiAodHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCXR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde2QuZ2V0Q29udGVudFR5cGUoKX07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvKgotCQkJCQkgKiBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCSAqIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQkJICovCi0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCQl0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NDT05URU5UVFlQRSkgewotCQkJCWlmICh0eXBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWlmICh0eXBlcy5sZW5ndGggPiAxKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyAibXVsdGlwbGUgYmFzZWQgb24gbmFtZSAocHJvYmFibHkgaGllcmFyY2hpY2FsKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSArICIgbWF0Y2hlZDogIiArIHR5cGVzW2ldLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJfQotCQllbHNlIHsKLQkJCXByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluaXQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHJlc291cmNlKTsKLQotCQlJUHJlZmVyZW5jZXNTZXJ2aWNlIHByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlJU2NvcGVDb250ZXh0W10gbG9va3VwT3JkZXIgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBQcm9qZWN0U2NvcGUocHJvamVjdCksIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJYm9vbGVhbiBwcm9jZWVkID0gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlLCBsb29rdXBPcmRlcik7Ci0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BSRUZTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNjYW4gb2YgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkgKyAiOiIgKyBwcm9jZWVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAocHJvY2VlZCkgewotCQkJU3RyaW5nW10gdGFncyA9IFN0cmluZ1V0aWxzLnVucGFjayhwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgbnVsbCwgbG9va3VwT3JkZXIpKTsKLQkJCVN0cmluZ1tdIHByaW9yaXRpZXMgPSBTdHJpbmdVdGlscy51bnBhY2socHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMsIG51bGwsIGxvb2t1cE9yZGVyKSk7Ci0JCQlTdHJpbmdbXSBjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHMgPSBTdHJpbmdVdGlscy51bnBhY2socHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVELCBudWxsLCBsb29rdXBPcmRlcikpOwotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BSRUZTKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludChnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdGFnczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50KHRhZ3NbaV0pOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBwcmlvcml0aWVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJpb3JpdGllcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQocHJpb3JpdGllc1tpXSk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGlnbm9yZWQgY29udGVudCB0eXBlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQoY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzW2ldKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQlmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcyA9IG5ldyBJQ29udGVudFR5cGVbY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzLmxlbmd0aF07Ci0JCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHMubGVuZ3RoOyBpKyspIHsKLQkJCQlmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlc1tpXSA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHNbaV0pOwotCQkJfQotCQkJaW50IG1heCA9IE1hdGgubWluKHRhZ3MubGVuZ3RoLCBwcmlvcml0aWVzLmxlbmd0aCk7Ci0JCQlmQ3VycmVudFRhc2tUYWdzID0gbmV3IFRhc2tUYWdbbWF4XTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpbnQgcHJpb3JpdHkgPSBUYXNrVGFnLlBSSU9SSVRZX05PUk1BTDsKLQkJCQl0cnkgewotCQkJCQlwcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQocHJpb3JpdGllc1tpXSk7Ci0JCQkJfQotCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBkZWZhdWx0IHRvIG5vcm1hbCBwcmlvcml0eQotCQkJCX0KLQkJCQlmQ3VycmVudFRhc2tUYWdzW2ldID0gbmV3IFRhc2tUYWcodGFnc1tpXSwgcHJpb3JpdHkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZWVkOwotCX0KLQotCXZvaWQgaW50ZXJuYWxTY2FuKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBzY2FuTW9uaXRvcikgewotCQlpZiAoc2Nhbk1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQlpZiAocmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgJiYgIXJlc291cmNlLmlzRGVyaXZlZCgpICYmICFyZXNvdXJjZS5pc1BoYW50b20oKSAmJiAhcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpICYmIG5hbWUubGVuZ3RoKCkgIT0gMCAmJiBuYW1lLmNoYXJBdCgwKSAhPSAnLicpIHsKLQkJCQlpZiAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpID4gMCB8fCAocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID4gMCkgewotCQkJCQlTdWJQcm9ncmVzc01vbml0b3IgY2hpbGRNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzY2FuTW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQkJCQkJSVJlc291cmNlW10gY2hpbGRyZW4gPSAoKElDb250YWluZXIpIHJlc291cmNlKS5tZW1iZXJzKCk7Ci0JCQkJCWNoaWxkTW9uaXRvci5iZWdpblRhc2soIiIsIGNoaWxkcmVuLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkJaW50ZXJuYWxTY2FuKHByb2plY3QsIGNoaWxkcmVuW2ldLCBjaGlsZE1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCWNoaWxkTW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRklMRSkgPiAwKSB7Ci0JCQkJCXNjYW5GaWxlKHByb2plY3QsIGZDdXJyZW50VGFza1RhZ3MsIChJRmlsZSkgcmVzb3VyY2UsIHNjYW5Nb25pdG9yKTsKLQkJCQkJc2Nhbk1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXNjYW5Nb25pdG9yLndvcmtlZCgxKTsKLQotCQkJfQotCQkJc2Nhbk1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGludGVybmFsU2NhbihJUmVzb3VyY2VEZWx0YSBkZWx0YSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCVN0cmluZyBuYW1lID0gZGVsdGEuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghcmVzb3VyY2UuaXNEZXJpdmVkKCkgJiYgIXJlc291cmNlLmlzUGhhbnRvbSgpICYmICFyZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgJiYgbmFtZS5sZW5ndGgoKSAhPSAwICYmIG5hbWUuY2hhckF0KDApICE9ICcuJykgewotCQkJCWlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgPiAwIHx8IChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPiAwKSB7Ci0JCQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCWlmIChuYW1lLmxlbmd0aCgpICE9IDAgJiYgbmFtZS5jaGFyQXQoMCkgIT0gJy4nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJCVN1YlByb2dyZXNzTW9uaXRvciBjaGlsZE1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JCQkJCQljaGlsZE1vbml0b3IuYmVnaW5UYXNrKCIiLCBjaGlsZHJlbi5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmb3IgKGludCBpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCQlpbnRlcm5hbFNjYW4oY2hpbGRyZW5baV0sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoY2hpbGRNb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spKTsKLQkJCQkJCX0KLQkJCQkJCWNoaWxkTW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZJTEUpID4gMCkgewotCQkJCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA+IDAgfHwgKChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSA+IDAgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA+IDApKSB7Ci0JCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJCXNjYW5GaWxlKGZpbGUuZ2V0UHJvamVjdCgpLCBmQ3VycmVudFRhc2tUYWdzLCBmaWxlLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBsYWNlVGFza01hcmtlcnMoZmluYWwgSUZpbGUgZmlsZSwgZmluYWwgTWFwIG1hcmtlckF0dHJpYnV0ZXNbXSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElGaWxlIGZpbmFsRmlsZSA9IGZpbGU7Ci0JCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSByID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8qCi0JCQkJCQkJICogRGVsZXRlIG9sZCBUYXNrIG1hcmtlcnMgKGRvbid0IGRlbGV0ZSByZWd1bGFyCi0JCQkJCQkJICogVGFza3Mgc2luY2UgdGhhdCBpbmNsdWRlcyB1c2VyLWRlZmluZWQgb25lcwotCQkJCQkJCSAqLwotCQkJCQkJCWZpbGUuZGVsZXRlTWFya2VycyhERUZBVUxUX01BUktFUl9UWVBFLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGRlbGV0aW5nIG9sZCB0YXNrcyIsIGUpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJfQotCQkJCQkJaWYgKG1hcmtlckF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBtYXJrZXJBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIG1hcmtlckF0dHJpYnV0ZXMubGVuZ3RoICsgIiB0YXNrcyBmb3IgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlckF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJU3RyaW5nIHNwZWNpZmllZE1hcmtlclR5cGUgPSAoU3RyaW5nKSBtYXJrZXJBdHRyaWJ1dGVzW2ldLmdldChJTWFya2VyLlRBU0spOwotCQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IGZpbmFsRmlsZS5jcmVhdGVNYXJrZXIoc3BlY2lmaWVkTWFya2VyVHlwZSAhPSBudWxsID8gc3BlY2lmaWVkTWFya2VyVHlwZSA6IERFRkFVTFRfTUFSS0VSX1RZUEUpOwotCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXJrZXJBdHRyaWJ1dGVzW2ldKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJZmluYWxGaWxlLmdldFdvcmtzcGFjZSgpLnJ1bihyLCBmaWxlLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgc2NhbihmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHNjYW5Nb25pdG9yKSB7Ci0JCWlmIChzY2FuTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2Nhbm5pbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBza2lwcGluZyBpbmFjY2Vzc2libGUgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTT1ZFUkFMTFBFUkYpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXNjYW5Nb25pdG9yLmJlZ2luVGFzaygiIiwgcHJvamVjdC5tZW1iZXJzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluaXQocHJvamVjdCkpIHsKLQkJCQlpbnRlcm5hbFNjYW4ocHJvamVjdCwgcHJvamVjdCwgc2Nhbk1vbml0b3IpOwotCQkJCXNodXRkb3duRGVsZWdhdGVzKHByb2plY3QpOwotCQkJfQotCQkJc2Nhbk1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU09WRVJBTExQRVJGKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgZm9yICIgKyBwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCi0Jdm9pZCBzY2FuKElSZXNvdXJjZURlbHRhIGRlbHRhLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTT1ZFUkFMTFBFUkYpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbml0KGRlbHRhLmdldFJlc291cmNlKCkpKSB7Ci0JCQlpbnRlcm5hbFNjYW4oZGVsdGEsIG1vbml0b3IpOwotCQkJc2h1dGRvd25EZWxlZ2F0ZXMoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTT1ZFUkFMTFBFUkYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBmb3IgIiArIGRlbHRhLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXZvaWQgc2NhbkZpbGUoSVByb2plY3QgcHJvamVjdCwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCVN1YlByb2dyZXNzTW9uaXRvciBzY2FubmVyTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQkJTGlzdCBtYXJrZXJBdHRyaWJ1dGVzID0gbnVsbDsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBkZXRlY3RDb250ZW50VHlwZXMoZmlsZSk7Ci0JCUlGaWxlVGFza1NjYW5uZXJbXSBmaWxlU2Nhbm5lcnMgPSBudWxsOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJaWYgKGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJZmlsZVNjYW5uZXJzID0gcmVnaXN0cnkuZ2V0RmlsZVRhc2tTY2FubmVycyh0eXBlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaXN0IHZhbGlkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gb2J0YWluIGEgZmlsdGVyZWQgbGlzdCBvZiBkZWxlZ2F0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWJvb2xlYW4gaWdub3JlQ29udGVudFR5cGUgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWdub3JlQ29udGVudFR5cGUgPSBpZ25vcmVDb250ZW50VHlwZSB8fCB0eXBlc1tpXS5pc0tpbmRPZihmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlc1tqXSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFpZ25vcmVDb250ZW50VHlwZSkgewotCQkJCQkJdmFsaWRUeXBlcy5hZGQodHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbGVTY2FubmVycyA9IHJlZ2lzdHJ5LmdldEZpbGVUYXNrU2Nhbm5lcnMoKElDb250ZW50VHlwZVtdKSB2YWxpZFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVt2YWxpZFR5cGVzLnNpemUoKV0pKTsKLQkJCX0KLQkJCWlmIChmaWxlU2Nhbm5lcnMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGogPSAwOyBmaWxlU2Nhbm5lcnMgIT0gbnVsbCAmJiBqIDwgZmlsZVNjYW5uZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChzY2FubmVyTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJc2Nhbm5lck1vbml0b3IuYmVnaW5UYXNrKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBmaWxlU2Nhbm5lcnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl0cnkgewotCQkJCQkJaWYgKCFmQWN0aXZlU2Nhbm5lcnMuY29udGFpbnMoZmlsZVNjYW5uZXJzW2pdKSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQlmaWxlU2Nhbm5lcnNbal0uc3RhcnR1cChmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJZkFjdGl2ZVNjYW5uZXJzLmFkZChmaWxlU2Nhbm5lcnNbal0pOwotCQkJCQkJfQotCQkJCQkJTWFwW10gdGFza01hcmtlckF0dHJpYnV0ZXMgPSBmaWxlU2Nhbm5lcnNbal0uc2NhbihmaWxlLCB0YXNrVGFncywgc2Nhbm5lck1vbml0b3IpOwotCQkJCQkJLyoKLQkJCQkJCSAqIFRPRE86IHBvb2wgdGhlIG1hcmtlciByZXN1bHRzIHNvIHRoZXJlJ3Mgb25seSBvbmUKLQkJCQkJCSAqIG9wZXJhdGlvbiBjcmVhdGluZyB0aGVtCi0JCQkJCQkgKi8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFza01hcmtlckF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAobWFya2VyQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCW1hcmtlckF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJfQotCQkJCQkJCW1hcmtlckF0dHJpYnV0ZXMuYWRkKHRhc2tNYXJrZXJBdHRyaWJ1dGVzW2ldKTsKLQkJCQkJCX0KLQkJCQkJCXNjYW5uZXJNb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNjYW5uZXJNb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJLy8gb25seSB1cGRhdGUgbWFya2VycyBpZiB3ZSByYW4gYSBzY2FubmVyIG9uIHRoaXMgZmlsZQotCQlpZiAoZmlsZVNjYW5uZXJzICE9IG51bGwgJiYgZmlsZVNjYW5uZXJzLmxlbmd0aCA+IDApIHsKLQkJCWlmIChtYXJrZXJBdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlVGFza01hcmtlcnMoZmlsZSwgKE1hcFtdKSBtYXJrZXJBdHRyaWJ1dGVzLnRvQXJyYXkobmV3IE1hcFttYXJrZXJBdHRyaWJ1dGVzLnNpemUoKV0pLCBtb25pdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlcGxhY2VUYXNrTWFya2VycyhmaWxlLCBudWxsLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzaHV0ZG93bkRlbGVnYXRlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZkFjdGl2ZVNjYW5uZXJzLnNpemUoKTsgaisrKSB7Ci0JCQl0cnkgewotCQkJCSgoSUZpbGVUYXNrU2Nhbm5lcikgZkFjdGl2ZVNjYW5uZXJzLmdldChqKSkuc2h1dGRvd24ocHJvamVjdCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKHByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfQotCQlmQWN0aXZlU2Nhbm5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTRhM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxNYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENsYXNzIHRvIGFsbG93IGFjY2VzcyB0byBNb2RlbE1hbmFnZXIuIE5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogCi0gKiBAc2luY2UgIDEuNSAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyIHsKLQkvKioKLQkgKiBEbyBub3QgYWxsb3cgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW5zdGFuY2Ugb2YgSU1vZGVsTWFuYWdlci4gUmV0dXJucyBudWxsIGlmIG1vZGVsCi0JICogbWFuYWdlciBjYW4gbm90IGJlIGNyZWF0ZWQgb3IgaXMgbm90IHZhbGlkIChzdWNoIGFzLCB3aGVuIHdvcmtiZW5jaCBpcwotCSAqIHNodXR0aW5nIGRvd24pLgotCSAqIAotCSAqIEByZXR1cm4gSU1vZGVsTWFuYWdlciAtIHJldHVybnMgdGhlIG9uZSBtb2RlbCBtYW5hZ2VyIGZvciBzdHJ1Y3R1cmVkCi0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWJvb2xlYW4gaXNSZWFkeSA9IGZhbHNlOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCXdoaWxlICghaXNSZWFkeSkgewotCQkJQnVuZGxlIGxvY2FsQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFNTRUNvcmVQbHVnaW4uSUQpOwotCQkJaW50IHN0YXRlID0gbG9jYWxCdW5kbGUuZ2V0U3RhdGUoKTsKLQkJCWlmIChzdGF0ZSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJLy8gZ2V0SW5zdGFuY2UgaXMgYSBzeW5jaHJvbml6ZWQgc3RhdGljIG1ldGhvZC4KLQkJCQltb2RlbE1hbmFnZXIgPSBNb2RlbE1hbmFnZXJJbXBsLmdldEluc3RhbmNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlLCBqdXN0IGxvb3AgYWdhaW4KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RPUFBJTkcgfHwgc3RhdGUgPT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBzdXJlIGFib3V0IG90aGVyIHN0YXRlcywgJ3Jlc29sdmVkJywgJ2luc3RhbGxlZCcKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyYTFiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgewotCi0Jc3RhdGljIGNsYXNzIERvY3VtZW50SW5mbyB7Ci0JCS8qKgotCQkgKiBUaGUgSVRleHRGaWxlQnVmZmVyCi0JCSAqLwotCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIHBsYXRmb3JtIGNvbnRlbnQtdHlwZSBJRCBvZiB0aGlzIGRvY3VtZW50Ci0JCSAqLwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBJU3RydWN0dXJlTW9kZWwgY29udGFpbmluZyB0aGlzIGRvY3VtZW50OyBtaWdodCBiZSBudWxsIGF0Ci0JCSAqIHBvaW50cyBpbiB0aGUgSVRleHRGaWxlQnVmZmVyJ3MgbGlmZWN5Y2xlCi0JCSAqLwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQotCQkvKioKLQkJICogV2hldGhlciBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNhbGxlZCBjb25uZWN0KCkgZm9yIHRoaXMKLQkJICogRG9jdW1lbnRJbmZvJ3MgdGV4dCBmaWxlYnVmZmVyCi0JCSAqLwotCQlib29sZWFuIHNlbGZDb25uZWN0ZWQgPSBmYWxzZTsKLQotCQlpbnQgYnVmZmVyUmVmZXJlbmNlQ291bnQgPSAwOwotCQlpbnQgbW9kZWxSZWZlcmVuY2VDb3VudCA9IDA7Ci0JfQotCi0JLyoqCi0JICogQSBVUklSZXNvbHZlciBpbnN0YW5jZSBvZiBtb2RlbHMgYnVpbHQgb24gamF2YS5pby5GaWxlcwotCSAqLwotCWNsYXNzIEV4dGVybmFsVVJJUmVzb2x2ZXIgaW1wbGVtZW50cyBVUklSZXNvbHZlciB7Ci0JCUlQYXRoIGZMb2NhdGlvbjsKLQotCQlFeHRlcm5hbFVSSVJlc29sdmVyKElQYXRoIGxvY2F0aW9uKSB7Ci0JCQlmTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUJhc2VMb2NhdGlvbigpIHsKLQkJCXJldHVybiBmTG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQkvLyBpZ25vcmUgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIHZhbHVlCi0JCQlpZiAodXJpID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQkJCXJldHVybiB1cmwuZ2V0RmlsZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gVVJJSGVscGVyLm5vcm1hbGl6ZSh1cmksIGJhc2VSZWZlcmVuY2UsIFBhdGguUk9PVC50b1N0cmluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSUNvbnRhaW5lciBnZXRSb290TG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIFVSSVJlc29sdmVyIGluc3RhbmNlIG9mIG1vZGVscyBidWlsdCBvbiB0aGUgZXh0ZW5zaWJsZSBXU1QgVVJJCi0JICogcmVzb2x2ZXIKLQkgKi8KLQljbGFzcyBDb21tb25VUklSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQkJSVBhdGggZkxvY2F0aW9uOwotCQlJUGF0aCBmUGF0aDsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAiLyI7IC8vJE5PTi1OTFMtMSQgCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLQotCQlDb21tb25VUklSZXNvbHZlcihJUGF0aCBwYXRoLCBJUGF0aCBsb2NhdGlvbikgewotCQkJZkxvY2F0aW9uID0gbG9jYXRpb247Ci0JCQlmUGF0aCA9IHBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gZkxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCksIGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCksIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgYmFzZVJlZmVyZW5jZSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewotCQkJYm9vbGVhbiBiYXNlSGFzUHJlZml4ID0gYmFzZVJlZmVyZW5jZSAhPSBudWxsICYmIGJhc2VSZWZlcmVuY2Uuc3RhcnRzV2l0aChGSUxFX1BSRUZJWCk7Ci0JCQlTdHJpbmcgcmVmZXJlbmNlID0gbnVsbDsKLQkJCWlmIChiYXNlSGFzUHJlZml4KSB7Ci0JCQkJcmVmZXJlbmNlID0gYmFzZVJlZmVyZW5jZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlZmVyZW5jZSA9IEZJTEVfUFJFRklYICsgYmFzZVJlZmVyZW5jZTsKLQkJCX0KLQkJCVN0cmluZyByZXN1bHQgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUocmVmZXJlbmNlLCBudWxsLCB1cmkpOwotCQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywKLQkJCS8vICJVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoIgotCQkJLy8gKyByZWZlcmVuY2UgKyAiLCBudWxsLCAiICt1cmkrIikgPSAiICsgcmVzdWx0KTsKLQkJCWlmICghYmFzZUhhc1ByZWZpeCAmJiByZXN1bHQuc3RhcnRzV2l0aChGSUxFX1BSRUZJWCkgJiYgcmVzdWx0Lmxlbmd0aCgpID4gRklMRV9QUkVGSVgubGVuZ3RoKCkpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKEZJTEVfUFJFRklYLmxlbmd0aCgpKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZlBhdGguc2VnbWVudCgwKSk7Ci0JCX0KLQotCQlwdWJsaWMgSUNvbnRhaW5lciBnZXRSb290TG9jYXRpb24oKSB7Ci0JCQlTdHJpbmcgcm9vdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShGSUxFX1BSRUZJWCArIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgbnVsbCwgU0VQQVJBVE9SKTsKLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKHJvb3QpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKGZpbGVzW2ldLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLQkJCQkJaWYgKCgoSUZvbGRlcikgZmlsZXNbaV0pLmdldEZ1bGxQYXRoKCkuaXNQcmVmaXhPZihmUGF0aCkpIHsKLQkJCQkJCXJldHVybiAoSUZvbGRlcikgZmlsZXNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcHMgaW50ZXJlc3RpbmcgZG9jdW1lbnRzIGluIGZpbGUgYnVmZmVycyB0byB0aG9zZSBmaWxlIGJ1ZmZlcnMuCi0JICogUmVxdWlyZWQgdG8gYWxsb3dzIHVzIHRvIGdvIGZyb20gZG9jdW1lbnRzIHRvIGNvbXBsZXRlIG1vZGVscy4KLQkgKi8KLQljbGFzcyBGaWxlQnVmZmVyTWFwcGVyIGltcGxlbWVudHMgSUZpbGVCdWZmZXJMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNyZWF0ZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIHRleHRCdWZmZXIgPSAoSVRleHRGaWxlQnVmZmVyKSBidWZmZXI7Ci0JCQkJaWYgKCEodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkxlYXJuZWQgbmV3IGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7Ci0JCQkJaW5mby5idWZmZXIgPSB0ZXh0QnVmZmVyOwotCQkJCWluZm8uY29udGVudFR5cGVJRCA9IGRldGVjdENvbnRlbnRUeXBlKGJ1ZmZlci5nZXRMb2NhdGlvbigpKS5nZXRJZCgpOwotCQkJCWluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQrKzsKLQkJCQlmRG9jdW1lbnRNYXAucHV0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSwgaW5mbyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBidWZmZXJEaXNwb3NlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpZiAoISh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGlzY2FyZGVkIGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50LS07Ci0JCQkJCWlmIChpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50ID09IDAgJiYgaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50ID09IDApCi0JCQkJCQlmRG9jdW1lbnRNYXAucmVtb3ZlKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlydHlTdGF0ZUNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkJ1ZmZlciBkaXJ0eSBzdGF0ZSBjaGFuZ2VkOiAoIiArIGlzRGlydHkgKyAiKSAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIgIiArIGJ1ZmZlciArICIgIiArICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCQkJCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0QnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCWlmICghKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJCQlyZXR1cm47Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLm1vZGVsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1zZyA9ICJVcGRhdGluZyBtb2RlbCBkaXJ0eSBzdGF0ZSBmb3IiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQgfHwgTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyk7Ci0JCQkJCX0KLQkJCQkJaW5mby5tb2RlbC5zZXREaXJ0eVN0YXRlKGlzRGlydHkpOwotCi0JCQkJCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpKTsKLQkJCQkJaWYgKCFpc0RpcnR5ICYmIHdvcmtzcGFjZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJaW5mby5tb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKHdvcmtzcGFjZUZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VGYWlsZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5naW5nKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVWYWxpZGF0aW9uQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNTdGF0ZVZhbGlkYXRlZCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVEZWxldGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGVsZXRlZCBidWZmZXI6ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZU1vdmVkKElGaWxlQnVmZmVyIGJ1ZmZlciwgSVBhdGggcGF0aCkgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW92ZWQgYnVmZmVyIGZyb206ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vdmVkIGJ1ZmZlciB0bzogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiAiICsgYnVmZmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlJRG9jdW1lbnRbXSBkYW5nbGluZ0RvY3VtZW50cyA9IChJRG9jdW1lbnRbXSkgaW5zdGFuY2UuZkRvY3VtZW50TWFwLmtleVNldCgpLnRvQXJyYXkobmV3IElEb2N1bWVudFswXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYW5nbGluZ0RvY3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGluc3RhbmNlLmZEb2N1bWVudE1hcC5nZXQoZGFuZ2xpbmdEb2N1bWVudHNbaV0pOwotCQkJCQlpZiAoaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50ID4gMCkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTEVBS0VEIE1PREVMOiAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIChpbmZvLm1vZGVsICE9IG51bGwgPyBpbmZvLm1vZGVsLmdldElkKCkgOiBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoaW5mby5idWZmZXJSZWZlcmVuY2VDb3VudCA+IDApCi0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxFQUtFRCBCVUZGRVI6ICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLnJlbW92ZUZpbGVCdWZmZXJMaXN0ZW5lcihpbnN0YW5jZS5mRmlsZUJ1ZmZlckxpc3RlbmVyKTsKLQkJCWluc3RhbmNlID0gbnVsbDsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCB2b2lkIHN0YXJ0dXAoKSB7Ci0JCWdldEluc3RhbmNlKCk7Ci0JfQotCi0JLy8gYSBtYXAgb2YgSVN0cnVjdHVyZWREb2N1bWVudHMgdG8gRG9jdW1lbnRJbmZvIG9iamVjdHMKLQlNYXAgZkRvY3VtZW50TWFwID0gbnVsbDsKLQotCUlGaWxlQnVmZmVyTGlzdGVuZXIgZkZpbGVCdWZmZXJMaXN0ZW5lciA9IG51bGw7Ci0KLQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnRNYXAgPSBuZXcgSGFzaHRhYmxlKDQpOwotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5hZGRGaWxlQnVmZmVyTGlzdGVuZXIoZkZpbGVCdWZmZXJMaXN0ZW5lciA9IG5ldyBGaWxlQnVmZmVyTWFwcGVyKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjYWxjdWxhdGUgYSBtb2RlbCBJRCB3aXRob3V0IGFuIElGaWxlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCUlQYXRoIHBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBUaGUgSUQgb2YgbW9kZWxzIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbGl6ZWQgcGF0aHMKLQkJCSAqIHN0b3JlZCBpbiB0aGUgdW5kZXJseWluZyBGaWxlQnVmZmVycyB0byByZXRyaWV2ZSB0aGVtIGJ5IGNvbW1vbgotCQkJICogSUQgbGF0ZXIgb24uIFdlIGNob3NlIHRoZSBGaWxlQnVmZmVyIG5vcm1hbGl6ZWQgcGF0aCBvdmVyIHRoZQotCQkJICogcHJldmlvdXNseSB1c2VkIGFic29sdXRlIElGaWxlIHBhdGggYmVjYXVzZSB0aGUgYnVmZmVycyBzaG91bGQKLQkJCSAqIGFscmVhZHkgZXhpc3QgYmVmb3JlIHdlIGJ1aWxkIGEgbW9kZWwgYW5kIHdlIGNhbid0IHJldHJpZXZlIGEKLQkJCSAqIEZpbGVCdWZmZXIgdXNpbmcgdGhlIElEIG9mIGEgbW9kZWwgdGhhdCBkb2Vzbid0IHlldCBleGlzdC4KLQkJCSAqLwotCQkJaWQgPSBGaWxlQnVmZmVycy5ub3JtYWxpemVMb2NhdGlvbihwYXRoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBpZDsKLQotCX0KLQotCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGNhbGN1bGF0ZSBhIG1vZGVsIElEIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGdldEJ1ZmZlcihkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWQgPSBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlVUklSZXNvbHZlciBjcmVhdGVVUklSZXNvbHZlcihJVGV4dEZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCUlQYXRoIGxvY2F0aW9uID0gYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLQkJaWYgKHdvcmtzcGFjZUZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZUZpbGUuZ2V0UHJvamVjdCgpOwotCQkJcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcyk7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJlc29sdmVyID0gbmV3IENvbW1vblVSSVJlc29sdmVyKHdvcmtzcGFjZUZpbGUuZ2V0RnVsbFBhdGgoKSwgd29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvbigpKTsKLQkJCX0KLQkJCXJlc29sdmVyLnNldEZpbGVCYXNlTG9jYXRpb24od29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzb2x2ZXIgPSBuZXcgRXh0ZXJuYWxVUklSZXNvbHZlcihsb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCi0JSUNvbnRlbnRUeXBlIGRldGVjdENvbnRlbnRUeXBlKElQYXRoIGxvY2F0aW9uKSB7Ci0JCUlDb250ZW50VHlwZSB0eXBlID0gbnVsbDsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBPcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQlkID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlID0gZC5nZXRDb250ZW50VHlwZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZQotCQkJCQkvLyB0eXBlIGNoZWNrIGFib3ZlCi0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFN5c3RlbUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGlucHV0LCBsb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRGaWxlQnVmZmVyIGdldEJ1ZmZlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGdldCBhIGJ1ZmZlciB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpCi0JCQlyZXR1cm4gaW5mby5idWZmZXI7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVN0cmluZyBnZXRDb250ZW50VHlwZUlEKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJcmV0dXJuIGluZm8uY29udGVudFR5cGVJRDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0L2NyZWF0ZSBhIG1vZGVsIHdpdGhvdXQgYSBqYXZhLmlvLkZpbGUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQl0cnkgewotCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNvbm5lY3RpbmcgdG8gRmlsZSAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWZmZXJNYW5hZ2VyLmNvbm5lY3QobG9jYXRpb24sIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKGxvY2F0aW9uKTsKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaW5mby5zZWxmQ29ubmVjdGVkID0gdHJ1ZTsKLQkJCQltb2RlbCA9IGdldE1vZGVsKChJU3RydWN0dXJlZERvY3VtZW50KSBidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBtb2RlbCBmb3IgIiArIGZpbGUuZ2V0UGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGdldC9jcmVhdGUgYSBtb2RlbCB3aXRob3V0IGFuIElGaWxlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJdHJ5IHsKLQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNvbm5lY3RpbmcgdG8gSUZpbGUgIiArIGZpbGUuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHNlZSBUZXh0RmlsZURvY3VtZW50UHJvdmlkZXIjY3JlYXRlRmlsZUluZm8gYWJvdXQgd2h5IHdlIHVzZQotCQkJLy8gSUZpbGUjZ2V0RnVsbFBhdGgKLQkJCS8vIGhlcmUsIG5vdCBJRmlsZSNnZXRMb2NhdGlvbi4KLQkJCUlQYXRoIGxvY2F0aW9uID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlidWZmZXJNYW5hZ2VyLmNvbm5lY3QobG9jYXRpb24sIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihsb2NhdGlvbik7Ci0JCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBOb3RlOiAiaW5mbyIgYmVpbmcgbnVsbCBhdCB0aGlzIHBvaW50IGlzIGEgc2xpZ2h0Ci0JCQkJCQkgKiBlcnJvci4KLQkJCQkJCSAqIAotCQkJCQkJICogVGhlIGNvbm5lY3QgY2FsbCBmcm9tIGFib3ZlIChvciBhdCBzb21lIHRpbWUKLQkJCQkJCSAqIGVhcmxpZXIgaW4gdGhlIHNlc3Npb24pIHdvdWxkIGhhdmUgbm90aWZpZWQgdGhlCi0JCQkJCQkgKiBGaWxlQnVmZmVyTWFwcGVyIG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUKLQkJCQkJCSAqIGNvcnJlc3BvbmRpbmcgdGV4dCBidWZmZXIgYW5kIGNyZWF0ZWQgdGhlCi0JCQkJCQkgKiBEb2N1bWVudEluZm8gb2JqZWN0IGZvciBJU3RydWN0dXJlZERvY3VtZW50cy4KLQkJCQkJCSAqLwotCQkJCQkJaW5mby5zZWxmQ29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiBDaGVjayB0aGUgZG9jdW1lbnQgdHlwZS4gQWx0aG91Z2ggcmV0dXJuaW5nIG51bGwgZm9yCi0JCQkJCSAqIHVua25vd24gZG9jdW1lbnRzIHdvdWxkIGJlIGZhaXIsIHRyeSB0byBnZXQgYSBtb2RlbCBpZgotCQkJCQkgKiB0aGUgZG9jdW1lbnQgaXMgYXQgbGVhc3QgYSB2YWxpZCB0eXBlLgotCQkJCQkgKi8KLQkJCQkJSURvY3VtZW50IGJ1ZmZlckRvY3VtZW50ID0gYnVmZmVyLmdldERvY3VtZW50KCk7Ci0JCQkJCWlmIChidWZmZXJEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJCW1vZGVsID0gZ2V0TW9kZWwoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGJ1ZmZlckRvY3VtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIG1vZGVsIGZvciAiICsgZmlsZS5nZXRMb2NhdGlvbigpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBnZXQvY3JlYXRlIGEgbW9kZWwgd2l0aG91dCBhIGRvY3VtZW50IHJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ubW9kZWwgPT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgY3JlYXRpbmcgbW9kZWwgZm9yICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50Kys7Ci0KLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChpbmZvLmNvbnRlbnRUeXBlSUQpOwotCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCW1vZGVsID0gbG9hZGVyLmNyZWF0ZU1vZGVsKGRvY3VtZW50LCBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIGhhbmRsZXIpOwotCQkJdHJ5IHsKLQkJCQlpbmZvLm1vZGVsID0gbW9kZWw7Ci0JCQkJbW9kZWwuc2V0SWQoaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQkvLyBoYW5kbGVyIG5vdyBzZXQgYnkgbG9hZGVyLCBmb3Igbm93Ci0JCQkJLy8gbW9kZWwuc2V0TW9kZWxIYW5kbGVyKGhhbmRsZXIpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsKS5zZXRDb250ZW50VHlwZUlkZW50aWZpZXIoaW5mby5jb250ZW50VHlwZUlEKTsKLQkJCQl9Ci0JCQkJbW9kZWwuc2V0UmVzb2x2ZXIoY3JlYXRlVVJJUmVzb2x2ZXIoZ2V0QnVmZmVyKGRvY3VtZW50KSkpOwotCQkJCWlmIChpbmZvLmJ1ZmZlci5pc0RpcnR5KCkpIHsKLQkJCQkJbW9kZWwuc2V0RGlydHlTdGF0ZSh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiYXR0ZW1wdGVkIHRvIGNyZWF0ZSBuZXcgbW9kZWwgd2l0aCBleGlzdGluZyBJRCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJbW9kZWwgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBpbmZvLm1vZGVsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4aXN0aW5nQnVmZmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGJ1ZmZlciB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlyZXR1cm4gaW5mbyAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VNb2RlbChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IHJlbGVhc2UgYSBtb2RlbCB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgbm90aWNlZCBmdWxsIHJlbGVhc2Ugb2YgbW9kZWwgZm9yICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaW5mby5tb2RlbCA9IG51bGw7Ci0JCQlpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQtLTsKLQkJCWlmIChpbmZvLnNlbGZDb25uZWN0ZWQpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgZGlzY29ubmVjdGluZyBmcm9tICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlJUGF0aCBsb2NhdGlvbiA9IGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuZGlzY29ubmVjdChsb2NhdGlvbiwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIHJlbGVhc2luZyBtb2RlbCBmb3IgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVydChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IHJlbGVhc2UgYSBtb2RlbCB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIHdhcyBhc2tlZCB0byByZXZlcnQgYSBkb2N1bWVudCBidXQgd2FzIG5vdCBiZWluZyBtYW5hZ2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIGdldCBwYXRoIGp1c3QgZm9yIHBvdGVudGlhbCBlcnJvciBtZXNzYWdlCi0JCQlJUGF0aCBsb2NhdGlvbiA9IGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIElTU1VFOiBpbiBmdXR1cmUsIGNsaWVudHMgc2hvdWxkIHByb3ZpZGUgcHJvZ3Jlc3MgbW9uaXRvcgotCQkJCWluZm8uYnVmZmVyLnJldmVydChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSVNTVUU6IHNob3VkbCB3ZSBub3QgYmUgcmUtdGhyb3dpbmcgQ29yZUV4Y2VwdGlvbnM/IE9yCi0JCQkJLy8gbm90IGNhdGNoIHRoZW0gYXQgYWxsPwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIHJldmVydGluZyBtb2RlbCBmb3IgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSUV4ZWN1dGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDQ5MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRXhlY3V0aW9uRGVsZWdhdGUgewotCi0Jdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSUxvY2thYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lMb2NrYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVjMjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSUxvY2thYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci0KLS8qKgotICogCi0gKiBOb3QgQVBJOiBub3QgdG8gYmUgdXNlZCBvciBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBUaGlzIGlzIGEgc3BlY2lhbAotICogcHVycG9zZSBpbnRlcmZhY2UgdG8gaGVscCBndWFyZCBzb21lIHRocmVhZGluZyBpc3N1ZXMgYmV0d2VlZW4gbW9kZWwgYW5kCi0gKiBkb2N1bWVudC4gV2lsbCBiZSBjaGFuZ2VkIHNvb24uCi0gKiAgCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTG9ja2FibGUgewotCi0JSUxvY2sgZ2V0TG9ja09iamVjdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0pTUEF3YXJlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJjMTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQQXdhcmVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0Jdm9pZCBpbml0aWFsaXplV2l0aChFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjVkN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIHRydWUgaWYgYm90aCBwbGF0Zm9ybSBhbmQgdGhpcyBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZGVidWciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGFkYXB0ZXIKLQkgKiBub3RpZmljYXRpb24gdGltZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19BREFQVEVSTk9USUZJQ0FUSU9OVElNRSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9tL2FkYXB0ZXIvbm90aWZpY2F0aW9uL3RpbWUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHN0cnVjdHVyZWQKLQkgKiBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19ET0NVTUVOVCA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZGRvY3VtZW50IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBmaWxlIGJ1ZmZlcgotCSAqIG1vZGVsIG1hbmFnZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZmlsZWJ1ZmZlcnMvbW9kZWxtYW5hZ2VtZW50IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyB0ZXh0IGJ1ZmZlcgotCSAqIGxpZmVjeWNsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9maWxlYnVmZmVycy9saWZlY3ljbGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIG1vZGVsCi0JICogbGlmZWN5Y2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0xJRkVDWUNMRSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL2xpZmVjeWNsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwgc3RhdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTU9ERUxTVEFURSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL3N0YXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBtb2RlbCBsb2NrCi0JICogc3RhdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTU9ERUxMT0NLID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbG9ja3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIG1vZGVsCi0JICogbWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTE1BTkFHRVIgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9tb2RlbG1hbmFnZXIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLUyA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIGNvbnRlbnQgdHlwZSBkZXRlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NDT05URU5UVFlQRSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvZGV0ZWN0aW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyB0YXNrIHRhZ3MKLQkgKiBqb2JzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTSk9CID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9qb2IiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIG92ZXJhbGwgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NPVkVSQUxMUEVSRiA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3Mvb3ZlcmFsbHRpbWUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTUEVSRiA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NQUkVGUyA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcHJlZmVyZW5jZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIHJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTUkVHSVNUUlkgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3JlZ2lzdHJ5IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qCi0JICogS2VlcCBvdXIgb3duIGNvcHkgaW4gY2FzZSB3ZSB3YW50IHRvIGFkZCBvdGhlciBzZXZlcml0eSBsZXZlbHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhsZXZlbCwgUExVR0lOX0lELCBsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIG1lc3NhZ2UgdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgRVJST1IsIFdBUk5JTkcsIElORk8sIE9LCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIGEgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIHRvIHRoZSBsb2cgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgbGV2ZWwKLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIEVSUk9SLCBXQVJOSU5HLCBJTkZPLCBPSwotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRvIGFkZCB0byB0aGUgbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBleGNlcHRpb24gYXMgYW4gZXJyb3IgaW4gdGhlIGxvZyBhbG9uZyB3aXRoIGFuIGFjY29tcGFueWluZwotCSAqIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZXhjZXB0aW9uIGFzIGFuIGVycm9yIGluIHRoZSBsb2cKLQkgKiAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0Yjc4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL01vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgc3RhdGljIE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZWFkZXIgPSBuZXcgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9BREFQVEVSS0VZID0gImFkYXB0ZXJLZXlDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NPTlRFTlRUWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX1JFR0lTVEVSQURBUFRFUiA9ICJyZWdpc3RlckFkYXB0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiYWRhcHRPbkNyZWF0ZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJBZGFwdE9uQ3JlYXRlRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFhNTEVkaXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZhY3RvcmllcyhJRG9jdW1lbnRUeXBlSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkoaGFuZGxlci5nZXRJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGxvYWRSZWdpc3RyeSh0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyRmFjdG9yeSBsb2FkRmFjdG9yeUZyb21Db25maWd1cmF0aW9uRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHJlcXVlc3RlclR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBjb250ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ09OVEVOVFRZUEUpOwotCQkJaWYgKCFjb250ZW50VHlwZS5lcXVhbHMocmVxdWVzdGVyVHlwZSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQlTdHJpbmcgYWRhcHRlcktleUNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9BREFQVEVSS0VZKTsKLQkJCVN0cmluZyByZWdpc3RlckFkYXB0ZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9SRUdJU1RFUkFEQVBURVIpOwotCi0JCQkvLyBpZiBjbGFzc05hbWUgaXMgbnVsbCwgdGhlbiBubyBvbmUgZGVmaW5lZCB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyBmb3IgYWRhcHRlciBmYWN0b3JpZXMKLQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUobmFtZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiBhbiBlcnJvciBvY2N1cnMgaGVyZSwgaXRzIHByb2JhYmx5IHRoYXQgdGhlIHBsdWdpbgotCQkJCQkvLyBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGJ1bmRsZTogIiArIG5hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl9Ci0JCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gdXNlRXh0ZW5kZWRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQkJCQlib29sZWFuIGRvUmVnaXN0ZXJBZGFwdGVycyA9IGZhbHNlOwotCQkJCQlPYmplY3QgYWRhcHRlcktleSA9IG51bGw7Ci0KLQkJCQkJaWYgKHJlZ2lzdGVyQWRhcHRlcnMgIT0gbnVsbCAmJiByZWdpc3RlckFkYXB0ZXJzLmxlbmd0aCgpID4gMCAmJiBCb29sZWFuLnZhbHVlT2YocmVnaXN0ZXJBZGFwdGVycykuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWRvUmVnaXN0ZXJBZGFwdGVycyA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGFkYXB0ZXJLZXlDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUNsYXNzIGFDbGFzcyA9IG51bGw7Ci0JCQkJCQkJLy8gYUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/Ci0JCQkJCQkJLy8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGFkYXB0ZXJLZXlDbGFzcykgOgotCQkJCQkJCS8vIENsYXNzLmZvck5hbWUoYWRhcHRlcktleUNsYXNzKTsKLQkJCQkJCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJCQkJCWFDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoYWRhcHRlcktleUNsYXNzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWFDbGFzcyA9IENsYXNzLmZvck5hbWUoYWRhcHRlcktleUNsYXNzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXVzZUV4dGVuZGVkQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJCQkJCQlhZGFwdGVyS2V5ID0gYUNsYXNzOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYWRhcHRlcktleSA9IGFkYXB0ZXJLZXlDbGFzczsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGFueUVycm9ycykgewotCQkJCQkJCWFkYXB0ZXJLZXkgPSBhZGFwdGVyS2V5Q2xhc3M7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgdGhlQ2xhc3MgPSBudWxsOwotCQkJCQkJLy8gQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8KLQkJCQkJCS8vIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDoKLQkJCQkJCS8vIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCQkJCWlmIChidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQkJCQl0aGVDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRoZUNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQkJCQkJfQotCQkJCQkJaWYgKHVzZUV4dGVuZGVkQ29uc3RydWN0b3IpIHsKLQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcltdIGN0b3JzID0gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlDbGFzc1tdIHBhcmFtVHlwZXMgPSBjdG9yc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJCQkJCQlpZiAoY3RvcnNbaV0uaXNBY2Nlc3NpYmxlKCkgJiYgcGFyYW1UeXBlcy5sZW5ndGggPT0gMiAmJiBwYXJhbVR5cGVzWzBdLmVxdWFscyhPYmplY3QuY2xhc3MpICYmIHBhcmFtVHlwZXNbMV0uZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgY3RvcnNbaV0ubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2FkYXB0ZXJLZXksIG5ldyBCb29sZWFuKGRvUmVnaXN0ZXJBZGFwdGVycyl9KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGUpIHsKLQkJCQkJCQkJCQkvLyBsb2cgb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCQkJZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUl9DTEFTUyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIG9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGxvZyBvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBsb2FkUmVnaXN0cnkoT2JqZWN0IGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgZmFjdG9yeUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFNTRUNvcmVQbHVnaW4uSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KGVsZW1lbnRzW2ldLCBjb250ZW50VHlwZSk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJZmFjdG9yeUxpc3QuYWRkKGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5TGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjEyOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob0NhbmNlbFByb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBOb0NhbmNlbFByb2dyZXNzTW9uaXRvciBleHRlbmRzIE51bGxQcm9ncmVzc01vbml0b3IgewotCi0KLQlwdWJsaWMgTm9DYW5jZWxQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMGI5ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGNsYXNzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXB1YmxpYyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCX0KLQotCXB1YmxpYyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzYzcyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Qcm9wYWdhdGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmN2I1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGFnYXRpbmdBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCXZvaWQgYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCUxpc3QgZ2V0QWRhcHRPbkNyZWF0ZUZhY3RvcmllcygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhZGRpbmcgYSBmYWN0b3J5LAotCSAqIHR5cGljYWxseSBvbiB0aGUgZG9jdW1lbnQgKHRvcCBsZXZlbCkgbm9kZSwgc28gYWxsIG5vZGVzIGNhbiBiZQotCSAqIGFkYXB0ZWQsIGlmIG5lZWRlZC4gVGhpcyBpcyBuZWVkZWQgZm9yIHRob3NlIG9jY2FzaW9ucyB3aGVuIGEgZmFjdG9yeQotCSAqIGlzIGFkZGVkZWQgYWZ0ZXIgc29tZSBub2RlcyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhdCB0aGUgdGltZQotCSAqIHRoZSBmYWN0b3J5IGlzIGFkZGVkLgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZUZvckZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBJTm9kZU5vdGlmaWVyIG5vZGUpOwotCi0JLy8gZG13OiBzaG91bGQgaGF2ZSBnZXRGYWN0b3J5Rm9yPwotCXZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5Mjg4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0Jdm9pZCBhZGRDb250cmlidXRlZEZhY3RvcmllcyhJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0Jdm9pZCBzZXRDb250cmlidXRlZEZhY3RvcmllcyhBcnJheUxpc3QgbGlzdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZkMWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBTU0UgQ29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNTRUNvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU1NFQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFNTRUNvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBX21vZGVsX3NfaWRfY2FuX25vdF9iZV9udV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2dyYW1fRXJyb3JfX01vZGVsTWFuYWdlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JpZ2luYWxfRXJyb3JfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0X0NoYW5nZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1NjYW5uZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrU2Nhbm5pbmdKb2JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrU2Nhbm5pbmdKb2JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaWdyYXRlX0NoYXJzZXQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg0NjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBTU0UgQ29yZSBQbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBTU0VDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlzdGF0aWMgU1NFQ29yZVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFNTRUNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBTU0VDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGRlZmF1bHQgbm9uLVVJCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLy8gc2V0IG1vZGVsIHByZWZlcmVuY2UgZGVmYXVsdHMKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4LCBmYWxzZSk7Ci0JCQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX1RBR1MsICJUT0RPLEZJWE1FLFhYWCIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfUFJJT1JJVElFUywgIjEsMiwxIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLnNodXRkb3duKCk7Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJLy8gaW5pdGlhbGl6ZSBGaWxlQnVmZmVyIGhhbmRsaW5nCi0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuc3RhcnR1cCgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCSAqLwotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyMmYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQV9tb2RlbF9zX2lkX2Nhbl9ub3RfYmVfbnVfRVhDXz1BIG1vZGVsJ3MgaWQgY2FuIG5vdCBiZSBudWxsCi1Qcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfPVByb2dyYW0gRXJyb3I6IE1vZGVsTWFuYWdlckltcGw6OnNhdmVNb2RlbC4gTW9kZWwgc2hvdWxkIGJlIGluIHRoZSBjYWNoZQotT3JpZ2luYWxfRXJyb3JfX1VJXz1PcmlnaW5hbCBFcnJvcjoKLVRleHRfQ2hhbmdlX1VJXz1UZXh0IENoYW5nZQotVGFza1NjYW5uZXJfMD1TY2FubmluZyBmb3IgVGFza3MKLVRhc2tTY2FubmluZ0pvYl8wPVNjYW5uaW5nCi1UYXNrU2Nhbm5pbmdKb2JfMT1FcnJvcnMgd2hpbGUgZGV0ZWN0aW5nIFRhc2tzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1NaWdyYXRlX0NoYXJzZXQ9TWlncmF0ZSBDaGFyc2V0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0M2E3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JcHVibGljIGJvb2xlYW4gcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcyA9IHRydWU7IC8vIHNwZWNpYWwgZmxhZyBmb3IgSlVuaXQKLQotCS8vIHRlc3RzIHRvIHNraXAgcmVmcmVzaAotCS8vIG9mIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkvLyB3aGVuIGl0J3Mgc2V0IHRvIGZhbHNlCi0KLQlwdWJsaWMgU3RyaW5nIGNsZWFudXBDb250ZW50KFN0cmluZyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaWQgPSBpbnB1dFN0cmVhbS50b1N0cmluZygpICsgZ2V0Q29udGVudFR5cGUoKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCXJldHVybiBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNsZWFudXBDb250ZW50KFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQuZ2V0Qnl0ZXMoIlVURjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyBnZXRDb250ZW50VHlwZSgpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCXJldHVybiBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHN0YXJ0ID49IDAgJiYgbGVuZ3RoID49IDAgJiYgc3RhcnQgKyBsZW5ndGggPD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYKLQkJCQkvLyBtb2RlbCBjaGFuZ2VkLgotCQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCi0JCQkJLy8gY2xlYW51cAotCQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vb3V0cHV0U3RyZWFtID0gbmV3Ci0JCQkvLyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKGZpbGUpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gc2F2ZSBvdXRwdXQgdG8gZmlsZQotCQkJLy9vdXRwdXRTdHJlYW0gPSBuZXcKLQkJCS8vIEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoZmlsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoIDw9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkpIHsKLQkJCQlWZWN0b3IgYWN0aXZlTm9kZXMgPSBnZXRBY3RpdmVOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCWlmIChhY3RpdmVOb2Rlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCU5vZGUgZmlyc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmZpcnN0RWxlbWVudCgpOwotCQkJCQlOb2RlIGxhc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmxhc3RFbGVtZW50KCk7Ci0JCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCQlOb2RlIGVhY2hOb2RlID0gZmlyc3ROb2RlOwotCQkJCQlOb2RlIG5leHROb2RlID0gbnVsbDsKLQkJCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJCQkvLyB1cGRhdGUgImRvbmUiCi0JCQkJCQlkb25lID0gKGVhY2hOb2RlID09IGxhc3ROb2RlKTsKLQotCQkJCQkJLy8gZ2V0IG5leHQgc2libGluZyBiZWZvcmUgY2xlYW51cCBiZWNhdXNlIGVhY2hOb2RlCi0JCQkJCQkvLyBtYXkKLQkJCQkJCS8vIGJlIGRlbGV0ZWQsCi0JCQkJCQkvLyBmb3IgZXhhbXBsZSB3aGVuIGl0J3MgYW4gZW1wdHkgdGV4dCBub2RlCi0JCQkJCQluZXh0Tm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCS8vIGNsZWFudXAgc2VsZWN0ZWQgbm9kZShzKQotCQkJCQkJY2xlYW51cE5vZGUoZWFjaE5vZGUpOwotCi0JCQkJCQkvLyB1cGRhdGUgZWFjaCBub2RlCi0JCQkJCQlpZiAobmV4dE5vZGUgIT0gbnVsbCAmJiBuZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLQkJCQkJCQkvLyBuZXh0Tm9kZSBpcyBkZWxldGVkIGR1cmluZyBjbGVhbnVwCi0JCQkJCQkJZWFjaE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCQkJZWxzZQotCQkJCQkJCWVhY2hOb2RlID0gbmV4dE5vZGU7Ci0KLQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UKLQkJCQkJCS8vIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggd2l0aCBlYWNoTm9kZS4KLQkJCQkJCS8vIFdlIGRvbid0IHdhbnQgYW4gaW5maW5pdGUgbG9vcCBoZXJlLgotCQkJCQkJaWYgKGVhY2hOb2RlID09IG51bGwpCi0JCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCX0KLQotCQkJCQkvLyBmb3JtYXQgc291cmNlCi0JCQkJCWlmIChnZXRGb3JtYXRTb3VyY2VQcmVmZXJlbmNlKHN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJCS8vIGZvcm1hdCB0aGUgZG9jdW1lbnQKLQkJCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IGdldEZvcm1hdFByb2Nlc3NvcigpOwotCQkJCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQkJCX0KLQotCQkJCQkvLyBjb252ZXJ0IEVPTCBjb2RlcwotCQkJCQlpZiAoZ2V0Q29udmVydEVPTENvZGVzUHJlZmVyZW5jZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlTdHJpbmcgZW5kT2ZMaW5lQ29kZSA9IGdldEVPTENvZGVQcmVmZXJlbmNlKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQkJCQlTdHJpbmcgZW5kT2ZMaW5lQ29kZVN0cmluZyA9IG51bGw7Ci0JCQkJCQlpZiAoZW5kT2ZMaW5lQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpID09IDApCi0JCQkJCQkJZW5kT2ZMaW5lQ29kZVN0cmluZyA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19MRjsKLQkJCQkJCWVsc2UgaWYgKGVuZE9mTGluZUNvZGUuY29tcGFyZVRvKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKSA9PSAwKQotCQkJCQkJCWVuZE9mTGluZUNvZGVTdHJpbmcgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1I7Ci0JCQkJCQllbHNlIGlmIChlbmRPZkxpbmVDb2RlLmNvbXBhcmVUbyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKSA9PSAwKQotCQkJCQkJCWVuZE9mTGluZUNvZGVTdHJpbmcgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1JMRjsKLQkJCQkJCWlmIChlbmRPZkxpbmVDb2RlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCQljb252ZXJ0TGluZURlbGltaXRlcnMoZG9jdW1lbnQsIGVuZE9mTGluZUNvZGVTdHJpbmcpOwotCQkJCQkJCS8vIERNVzogOC8yNC8yMDAyIHNldHRpbmcgbGluZSBkZWxpbWl0ZXIgaW4KLQkJCQkJCQkvLyBkb2N1bWVudCBhbGxvd3MKLQkJCQkJCQkvLyBzdWJzZXF1ZW50IGVkaXRpbmcgdG8gaW5zZXJ0IHRoZSBzYW1lIGxpbmUKLQkJCQkJCQkvLyBkZWxpbWl0ZXIuCi0JCQkJCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5zZXRMaW5lRGVsaW1pdGVyKGVuZE9mTGluZUNvZGVTdHJpbmcpOwotCQkJCQkJCX0KLQkJCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2V0RGlydHlTdGF0ZSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNsZWFudXBOb2RlID0gbm9kZTsKLQotCQkJLy8gY2xlYW51cCB0aGUgb3duZXIgbm9kZSBpZiBpdCdzIGFuIGF0dHJpYnV0ZSBub2RlCi0JCQlpZiAoY2xlYW51cE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCWNsZWFudXBOb2RlID0gKChBdHRyKSBjbGVhbnVwTm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0KLQkJCS8vIHJlZnJlc2ggY2xlYW51cCBwcmVmZXJlbmNlcyBiZWZvcmUgZ2V0dGluZyBjbGVhbnVwIGhhbmRsZXIKLQkJCWlmIChyZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKQotCQkJCXJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkJLy8gZ2V0IGNsZWFudXAgaGFuZGxlcgotCQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKGNsZWFudXBOb2RlKTsKLQkJCWlmIChjbGVhbnVwSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJLy8gY2xlYW51cCBlYWNoIG5vZGUKLQkJCQljbGVhbnVwSGFuZGxlci5jbGVhbnVwKGNsZWFudXBOb2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRMaW5lRGVsaW1pdGVycyhJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBuZXdEZWxpbWl0ZXIpIHsKLQkJZmluYWwgaW50IGxpbmVDb3VudCA9IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKTsKLQkJTWFwIHBhcnRpdGlvbmVycyA9IFRleHRVdGlsaXRpZXMucmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25lcnMoZG9jdW1lbnQpOwkJCi0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGRlbGltaXRlciA9IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSk7Ci0JCQkJaWYgKGRlbGltaXRlciAhPSBudWxsICYmIGRlbGltaXRlci5sZW5ndGgoKSA+IDAgJiYgIWRlbGltaXRlci5lcXVhbHMobmV3RGVsaW1pdGVyKSkgewotCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShyZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCksIGRlbGltaXRlci5sZW5ndGgoKSwgbmV3RGVsaW1pdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlUZXh0VXRpbGl0aWVzLmFkZERvY3VtZW50UGFydGl0aW9uZXJzKGRvY3VtZW50LCBwYXJ0aXRpb25lcnMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5zdXJlQ2xvc2VkKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFZlY3RvciBnZXRBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlWZWN0b3IgYWN0aXZlTm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlOb2RlIHN0YXJ0Tm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQpOwotCQkJTm9kZSBlbmROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBpdCdzIGFuIG5vbi1lbXB0eSBkb2N1bWVudAotCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGlzU2libGluZ09mKHN0YXJ0Tm9kZSwgZW5kTm9kZSkgPT0gZmFsc2UpIHsKLQkJCQkJaWYgKGVuZE5vZGUgIT0gbnVsbCkKLQkJCQkJCWVuZE5vZGUgPSBlbmROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXdoaWxlIChzdGFydE5vZGUgIT0gZW5kTm9kZSkgewotCQkJCQlhY3RpdmVOb2Rlcy5hZGRFbGVtZW50KHN0YXJ0Tm9kZSk7Ci0JCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCQlpZiAoc3RhcnROb2RlICE9IG51bGwpCi0JCQkJCWFjdGl2ZU5vZGVzLmFkZEVsZW1lbnQoc3RhcnROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhY3RpdmVOb2RlczsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q29udmVydEVPTENvZGVzUHJlZmVyZW5jZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWJvb2xlYW4gY29udmVydEVPTENvZGVzID0gdHJ1ZTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbigwKSk7Ci0JCWlmIChjbGVhbnVwSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwSGFuZGxlci5nZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQkJCWNvbnZlcnRFT0xDb2RlcyA9IGNsZWFudXBQcmVmZXJlbmNlcy5nZXRDb252ZXJ0RU9MQ29kZXMoKTsKLQkJfQotCQlyZXR1cm4gY29udmVydEVPTENvZGVzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RU9MQ29kZVByZWZlcmVuY2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlTdHJpbmcgZW9sQ29kZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcigoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cEhhbmRsZXIuZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCQllb2xDb2RlID0gY2xlYW51cFByZWZlcmVuY2VzLmdldEVPTENvZGUoKTsKLQkJfQotCQlyZXR1cm4gZW9sQ29kZTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2VQcmVmZXJlbmNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJYm9vbGVhbiBmb3JtYXRTb3VyY2UgPSB0cnVlOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJZm9ybWF0U291cmNlID0gY2xlYW51cFByZWZlcmVuY2VzLmdldEZvcm1hdFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaWJsaW5nT2YoTm9kZSBub2RlLCBOb2RlIGVuZE5vZGUpIHsKLQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlIHNpYmxpbmdOb2RlID0gbm9kZTsKLQkJCXdoaWxlIChzaWJsaW5nTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNpYmxpbmdOb2RlID09IGVuZE5vZGUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJc2libGluZ05vZGUgPSBzaWJsaW5nTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMGRkOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgewotCU5vZGUgY2xlYW51cChOb2RlIG5vZGUpOwotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQl2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0ODUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgewotCi0JaW50IGdldEF0dHJOYW1lQ2FzZSgpOwotCi0JYm9vbGVhbiBnZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoKTsKLQotCWJvb2xlYW4gZ2V0Q29udmVydEVPTENvZGVzKCk7Ci0KLQlTdHJpbmcgZ2V0RU9MQ29kZSgpOwotCi0JYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2UoKTsKLQotCWJvb2xlYW4gZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKTsKLQotCWJvb2xlYW4gZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCi0JYm9vbGVhbiBnZXRRdW90ZUF0dHJWYWx1ZXMoKTsKLQotCWludCBnZXRUYWdOYW1lQ2FzZSgpOwotCi0Jdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJOYW1lQ2FzZSk7Ci0KLQl2b2lkIHNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyk7Ci0KLQl2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2Rlcyk7Ci0KLQl2b2lkIHNldEVPTENvZGUoU3RyaW5nIEVPTENvZGUpOwotCi0Jdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpOwotCi0Jdm9pZCBzZXRJbnNlcnRNaXNzaW5nVGFncyhib29sZWFuIGluc2VydE1pc3NpbmdUYWdzKTsKLQotCXZvaWQgc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMpOwotCi0Jdm9pZCBzZXRQcmVmZXJlbmNlcyhQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyk7Ci0KLQl2b2lkIHNldFF1b3RlQXR0clZhbHVlcyhib29sZWFuIHF1b3RlQXR0clZhbHVlcyk7Ci0KLQl2b2lkIHNldFRhZ05hbWVDYXNlKGludCB0YWdOYW1lQ2FzZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzFjNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbmQgcmVsYXRlZCBjbGFzc2VzIGFyZSAnaW50ZXJuYWwnIGFuZCBzaG91bGQgbm90IAotICogYmUgdHJlYXRlZCBhcyBBUEksIGV2ZW4gdGhvdWdoIHVzZWQgYWNyb3NzIGNvbXBvbmVudHMgaW4gV1RQLiAKLSAqIENvbnNpZGVyIGl0IGEgd29yayBpbiBwcm9ncmVzcy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZXR1cm5zCi0JICogdGhlIGNsZWFuZWQgdXAgaW5wdXQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kCi0JICogbGVuZ3RoLCB0aGVuIHJldHVybnMgdGhlIGNsZWFuZWQgdXAgaW5wdXQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgY29udGVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSURvY3VtZW50IGFzIGlucHV0LCBjcmVhdGVzCi0JICogYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElEb2N1bWVudCdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSURvY3VtZW50IGFzIGlucHV0LCBjcmVhdGVzCi0JICogYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElEb2N1bWVudCdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcwotCSAqIHRoZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4gVGhlIElGaWxlCi0JICogaXMgdXBkYXRlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlCi0JICogbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcwotCSAqIHRoZSBtb2RlbC4gVGhlIElGaWxlIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzCi0JICogcmVsZWFzZWQgaW4gdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIGZpbGUgbmFtZSBhcyBpbnB1dCxjcmVhdGVzIGFuCi0JICogSW5wdXRTdHJlYW0gZnJvbSB0aGUgZmlsZSwgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZQotCSAqIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZpbGUgbmFtZSdzIGZpbGUgZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgd2hvbGUKLQkgKiBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuIFRoZSBmaWxlIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdAotCSAqIHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIG1vZGVsCi0JICogd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgZmlsZSBpcyB1cGRhdGVkCi0JICogd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGNsZWFudXBzCi0JICogdGhlIHdob2xlIG1vZGVsLgotCSAqLwotCXZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgY2xlYW51cHMKLQkgKiB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGguCi0JICovCi0Jdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBub2RlIGFzIGlucHV0LCBhbmQgZm9ybWF0cwotCSAqIHRoZSBub2RlIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY2xlYW51cE5vZGUoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZiZmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIHsKLQlwcml2YXRlIGludCBmQXR0ck5hbWVDYXNlOwotCXByaXZhdGUgYm9vbGVhbiBmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCXByaXZhdGUgYm9vbGVhbiBmQ29udmVydEVPTENvZGVzOwotCXByaXZhdGUgU3RyaW5nIGZFT0xDb2RlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0U291cmNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbnNlcnRSZXF1aXJlZEF0dHJzOwotCS8vcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlF1b3RlQXR0clZhbHVlczsKLQotCXByaXZhdGUgaW50IGZUYWdOYW1lQ2FzZTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ck5hbWVDYXNlKCkgewotCi0JCXJldHVybiBmQXR0ck5hbWVDYXNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpIHsKLQotCQlyZXR1cm4gZkNvbXByZXNzRW1wdHlFbGVtZW50VGFnczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKSB7Ci0KLQkJcmV0dXJuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFT0xDb2RlKCkgewotCi0JCXJldHVybiBmRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2UoKSB7Ci0KLQkJcmV0dXJuIGZGb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCkgewotCi0JCXJldHVybiBmSW5zZXJ0UmVxdWlyZWRBdHRyczsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0KLQkJaWYgKGZQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmUHJlZmVyZW5jZXMgPSBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBmUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCkgewotCi0JCXJldHVybiBmUXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZUYWdOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJOYW1lQ2FzZSkgewotCi0JCWZBdHRyTmFtZUNhc2UgPSBhdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKGJvb2xlYW4gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKSB7Ci0KLQkJZkNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IGNvbXByZXNzRW1wdHlFbGVtZW50VGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0RU9MQ29kZXMoYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMpIHsKLQotCQlmQ29udmVydEVPTENvZGVzID0gY29udmVydEVPTENvZGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVPTENvZGUoU3RyaW5nIEVPTENvZGUpIHsKLQotCQlmRU9MQ29kZSA9IEVPTENvZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKSB7Ci0KLQkJZkZvcm1hdFNvdXJjZSA9IGZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRNaXNzaW5nVGFncyhib29sZWFuIGluc2VydE1pc3NpbmdUYWdzKSB7Ci0KLQkJZkluc2VydE1pc3NpbmdUYWdzID0gaW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMpIHsKLQotCQlmSW5zZXJ0UmVxdWlyZWRBdHRycyA9IGluc2VydFJlcXVpcmVkQXR0cnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQotCQlmUHJlZmVyZW5jZXMgPSBwcmVmczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpIHsKLQotCQlmUXVvdGVBdHRyVmFsdWVzID0gcXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhZ05hbWVDYXNlKGludCB0YWdOYW1lQ2FzZSkgewotCi0JCWZUYWdOYW1lQ2FzZSA9IHRhZ05hbWVDYXNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDg2OWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIgewotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoU3RyaW5nIGNvbnRlbnRUeXBlKTsKLQotCXZvaWQgc2V0Q2xlYW51cFByb2Nlc3NvcihJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciwgU3RyaW5nIGNvbnRlbnRUeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGM5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgTWFwIGZDbGVhbnVwUHJvY2Vzc29yczsKLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZSk7Ci0KLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IpIGZDbGVhbnVwUHJvY2Vzc29ycy5nZXQoY29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcm9jZXNzb3IoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlKTsKLQotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3JzID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmIChmQ2xlYW51cFByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29ycy5yZW1vdmUoY29udGVudFR5cGUpOwotCQllbHNlCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMucHV0KGNvbnRlbnRUeXBlLCBjbGVhbnVwUHJvY2Vzc29yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0RG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI5OGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGEgZmlsZSBhbmQgY3JlYXRlcyBhbiBTdHJ1Y3R1cmVkIE1vZGVsLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REb2N1bWVudExvYWRlciBpbXBsZW1lbnRzIElEb2N1bWVudExvYWRlciB7Ci0KLQlwcml2YXRlIENvZGVkUmVhZGVyQ3JlYXRvciBmQ29kZWRSZWFkZXJDcmVhdG9yOwotCXByb3RlY3RlZCBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQkvLyBwcml2YXRlIGJvb2xlYW4gZlByb3BlcnRpZXNPYnRhaW5lZDsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQlwcm90ZWN0ZWQgUmVhZGVyIGZGdWxsUHJlcGFyZWRSZWFkZXI7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdExvYWRlciBjb25zdHJ1Y3RvciBhbHNvIGluaXRpYWxpemVzIGVuY29kaW5nIGNvbnZlcnRlci9tYXBwZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnVmZmVyIGNvbnZlcnRMaW5lRGVsaW1pdGVycyhTdHJpbmdCdWZmZXIgYWxsVGV4dEJ1ZmZlciwgU3RyaW5nIGxpbmVEZWxpbWl0ZXJUb1VzZSkgewotCQkvLyBUT0RPOiBhdm9pZCB1c2Ugb2YgU3RyaW5nIGluc3RhbmNlCi0JCVN0cmluZyBhbGxUZXh0ID0gYWxsVGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQlJRG9jdW1lbnQgdGVtcERvYyA9IG5ldyBEb2N1bWVudChhbGxUZXh0KTsKLQkJaWYgKGxpbmVEZWxpbWl0ZXJUb1VzZSA9PSBudWxsKQotCQkJbGluZURlbGltaXRlclRvVXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGluZUNvdW50ID0gdGVtcERvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGxpbmVJbmZvID0gdGVtcERvYy5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJaW50IGxpbmVTdGFydE9mZnNldCA9IGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJCWludCBsaW5lTGVuZ3RoID0gbGluZUluZm8uZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVFbmRPZmZzZXQgPSBsaW5lU3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCQkJCW5ld1RleHQuYXBwZW5kKGFsbFRleHQuc3Vic3RyaW5nKGxpbmVTdGFydE9mZnNldCwgbGluZUVuZE9mZnNldCkpOwotCQkJCWlmICgoaSA8IGxpbmVDb3VudCAtIDEpICYmICh0ZW1wRG9jLmdldExpbmVEZWxpbWl0ZXIoaSkgIT0gbnVsbCkpCi0JCQkJCW5ld1RleHQuYXBwZW5kKGxpbmVEZWxpbWl0ZXJUb1VzZSk7Ci0JCQl9Ci0JCQljYXRjaCAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvLyBzaG91bGQgZml4IHVwIHRvIGVpdGhlciB0aHJvdyBub3RoaW5nLCBvciB0aGUgcmlnaHQgdGhpbmcsCi0JCQkJLy8gYnV0Ci0JCQkJLy8gaW4gdGhlIGNvdXJzZSBvZiByZWZhY3RvcmluZywgdGhpcyB3YXMgZWFzaWVzdCAicXVpY2sgZml4Ii4KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdUZXh0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElFbmNvZGVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxseSBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbmV3RW5jb2RlZERvY3VtZW50KCk7Ci0JCS8vIE1ha2Ugc3VyZSBldmVyeSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGFuIEVuY29kaW5nIE1lbWVudG8sCi0JCS8vIHdoaWNoIGlzIHRoZSBkZWZhdWx0IG9uZSBmb3IgImVtcHR5IiBzdHJ1Y3R1cmVkRG9jdW1lbnRzCi0JCVN0cmluZyBjaGFyc2V0ID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLnVzZURlZmF1bHROYW1lUnVsZXMoZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkpOwotCQlTdHJpbmcgc3BlY0RlZmF1bHRDaGFyc2V0ID0gZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCwgc3BlY0RlZmF1bHRDaGFyc2V0KSk7Ci0KLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKG51bGwpOwotCQlpZiAobGluZURlbGltaXRlciAhPSBudWxsKQotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIobGluZURlbGltaXRlcik7Ci0KLQkJSURvY3VtZW50UGFydGl0aW9uZXIgZGVmYXVsdFBhcnRpdGlvbmVyID0gZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uMykgc3RydWN0dXJlZERvY3VtZW50KS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIGRlZmF1bHRQYXJ0aXRpb25lcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihkZWZhdWx0UGFydGl0aW9uZXIpOwotCQl9Ci0JCWRlZmF1bHRQYXJ0aXRpb25lci5jb25uZWN0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFic3RyYWN0IHZlcnNpb24gc2hvdWxkIGhhbmRsZSBtb3N0IGNhc2VzLCBidXQgd29uJ3QgaWYKLQkgKiBjb250ZW50VHlwZSBpcyBzZW5zaXRpdmUgdG8gZW5jb2RpbmcsIGFuZC9vciBlbWJlZGRlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoaUZpbGUpOwotCQlpZiAobGluZURlbGltaXRlciAhPSBudWxsKQotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIobGluZURlbGltaXRlcik7Ci0KLQkJdHJ5IHsKLQotCQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNyZWF0b3IgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKTsKLQkJCWNyZWF0b3Iuc2V0KGlGaWxlKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBjcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhmRW5jb2RpbmdNZW1lbnRvKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRDb2RlZFJlYWRlcigpOwotCi0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCAmJiBpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGhhdmUgYm90aCBudWxsIGZpbGVuYW1lIGFuZCBpbnB1dHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQl0cnkgewotCQkJY29kZWRSZWFkZXJDcmVhdG9yLnNldChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQkJY29kZWRSZWFkZXJDcmVhdG9yLnNldEVuY29kaW5nUnVsZShlbmNvZGluZ1J1bGUpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZkVuY29kaW5nTWVtZW50byk7Ci0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDaGFyUG9zdGlvbk9mRmFpbHVyZShCdWZmZXJlZFJlYWRlciBpbnB1dFN0cmVhbSkgewotCQlpbnQgY2hhclBvc2l0aW9uID0gMTsKLQkJaW50IGNoYXJSZWFkID0gLTE7Ci0JCWJvb2xlYW4gZXJyb3JGb3VuZCA9IGZhbHNlOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCWNoYXJSZWFkID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJCWNoYXJQb3NpdGlvbisrOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB0aGlzIGlzIGV4cGVjdGVkLCBzaW5jZSB3ZSdyZSBleHBlY3RpbmcgZmFpbHVyZSwKLQkJCQkvLyBzbyBubyBuZWVkIHRvIGRvIGFueXRoaW5nLgotCQkJCWVycm9yRm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXdoaWxlICghKGNoYXJSZWFkID09IC0xIHx8IGVycm9yRm91bmQpKTsKLQotCQlpZiAoZXJyb3JGb3VuZCkKLQkJCS8vIGRtdywgYmxpbmRseSBtb2RpZmllZCB0byArMSB0byBnZXQgdW5pdCB0ZXN0cyB0byB3b3JrLCBtb3ZpbmcKLQkJCS8vIGZyb20gSmF2YSAxLjMsIHRvIDEuNAotCQkJLy8gbm90IHN1cmUgaG93L3doeSB0aGlzIGJlaGF2aW9yIHdvdWxkIGhhdmUgY2hhbmdlZC4gKEl0cyBhcyBpZgotCQkJLy8gJ3JlYWQnIGlzIHJlcG9ydGluZyBlcnJvcgotCQkJLy8gb25lIGNoYXJhY3RlciBlYXJseSkuCi0JCQlyZXR1cm4gY2hhclBvc2l0aW9uICsgMTsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29kZWRSZWFkZXJDcmVhdG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2RlZFJlYWRlckNyZWF0b3IgZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkgewotCQlpZiAoZkNvZGVkUmVhZGVyQ3JlYXRvciA9PSBudWxsKSB7Ci0JCQlmQ29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQl9Ci0JCXJldHVybiBmQ29kZWRSZWFkZXJDcmVhdG9yOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhcnRpdGlvbmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUKLQkgKiBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HIHBhcnRpdGlvbmluZwotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY29kaW5nTWVtZW50by4KLQkgKiAKLQkgKiBAcmV0dXJuIEVuY29kaW5nTWVtZW50bwotCSAqLwotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBlbmNvZGluZ01lbWVudG8gd2FzIGFjY2Vzc2VkIGJlZm9yZSBpdCB3YXMgc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZ1bGxQcmVwYXJlZFJlYWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVhZGVyIGdldEZ1bGxQcmVwYXJlZFJlYWRlcigpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyID09IG51bGwpIHsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRDb2RlZFJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBmRnVsbFByZXBhcmVkUmVhZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIgcHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQbGF0Zm9ybUxpbmVEZWxpbWl0ZXJQcmVmZXJlbmNlKElGaWxlIGZpbGUpIHsKLQkJSVNjb3BlQ29udGV4dFtdIHNjb3BlQ29udGV4dDsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQkvLyBwcm9qZWN0IHByZWZlcmVuY2UKLQkJCXNjb3BlQ29udGV4dCA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSl9OwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgbnVsbCwgc2NvcGVDb250ZXh0KTsKLQkJCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGxpbmVEZWxpbWl0ZXI7Ci0JCX0KLQkJLy8gd29ya3NwYWNlIHByZWZlcmVuY2UKLQkJc2NvcGVDb250ZXh0ID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpfTsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsLCBzY29wZUNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlKSBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBzdWJjbGFzcyBkb2Vzbid0IGltcGxlbWVudCwgcmV0dXJuIHBsYXRmb3JtIGRlZmF1bHQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0UGxhdGZvcm1MaW5lRGVsaW1pdGVyUHJlZmVyZW5jZShmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHV0aWxpdHkgbWV0aG9kLCBidXQgZGVwZW5kcyBvbiBzdWJjbGFzc2VzIHRvIGltcGxpbWVudCB0aGUgcHJlZmVycmVkCi0JICogZW5kIG9mIGxpbmUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUuIE5vdGU6IHN1YmNsYXNzZXMgc2hvdWxkIG5vdAotCSAqIHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCAodGhlcmUncyBubyByZWFzb24gdG8sIGV2ZW4gdGhvdWdoIGl0cyBwYXJ0IG9mCi0JICogaW50ZXJmYWNlKS4gVGhpcyBtZXRob2Qgbm90IG9ubHkgY29udmVydHMgZW5kLW9mLWxpbmUgY2hhcmFjdGVycywgaWYKLQkgKiBuZWVkZWQsIGJ1dCBzZXRzIHRoZSBjb3JyZWN0IGVuZC1vZi1saW5lIGRlbGltaXRlciBpbgotCSAqIHN0cnVjdHVyZWREb2N1bWVudC4gTWlub3Igbm90ZTogY2FuJ3QgdXNlIHRoaXMgZXhhY3QgbWV0aG9kIGluIGR1bXBlcnMsCi0JICogc2luY2UgdGhlIGRlY2lzaW9uIHRvIGNoYW5nZSBvciBub3QgaXMgYSBsaXR0bGUgZGlmZmVyZW50LCBhbmQgc2luY2UKLQkgKiB0aGVyZSB3ZSBoYXZlIHRvIGNoYW5nZSB0ZXh0IG9mIHN0cnVjdHVyZWREb2N1bWVudCBpZiBmb3VuZCB0byBuZWVkCi0JICogY29udmVyc2lvbi4gKFdoZXJlIGFzIGZvciBsb2FkaW5nLCB3ZSBhc3N1bWUgd2UgaGF2ZW4ndCB5ZXQgc2V0IHRleHQgaW4KLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGJ1dCB3aWxsIGJlIGRvbmUgYnkgb3RoZXIgbWV0aG9kIGp1c3QgYSB0aW55IGJpeQotCSAqIGxhdGVyKS4gTmVlZHMgdG8gYmUgcHVibGljIHRvIGhhbmRsZSBpbnRlcmZhY2UuIEl0IGlzIGluIHRoZSBpbnRlcmZhY2UKLQkgKiBqdXN0IHNvIE1vZGVsTWFuYWdlckltcGwgY2FuIHVzZSBpdCBpbiBhIHNwZWNpYWwgY2lyY3Vtc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgaGFuZGxlTGluZURlbGltaXRlcihTdHJpbmdCdWZmZXIgb3JpZ2luYWxTdHJpbmcsIElFbmNvZGVkRG9jdW1lbnQgdGhlRmxhdE1vZGVsKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gaGFuZGxlIGxpbmUgZGVsaW1pdGVycyBzbyBNYXJrZXIgUG9zaXRpb25zIGFyZQotCQkvLyB1cGRhdGVkCi0JCVN0cmluZ0J1ZmZlciBjb252ZXJ0ZWRUZXh0ID0gbnVsbDsKLQkJLy8gYmFzZWQgb24gdGV4dCwgbWFrZSBhIGd1ZXNzIG9uIHdoYXQncyBiZWluZyB1c2VkIGFzCi0JCS8vIGxpbmUgZGVsaW1pdGVyCi0JCVN0cmluZyBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIgPSBUZXh0VXRpbGl0aWVzLmRldGVybWluZUxpbmVEZWxpbWl0ZXIob3JpZ2luYWxTdHJpbmcsIHRoZUZsYXRNb2RlbC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIgPSBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKG51bGwpOwotCQlpZiAocHJlZmVycmVkTGluZURlbGltaXRlciA9PSBudWxsKSB7Ci0JCQkvLyB3aGVuIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIgaXMgbnVsbCwgaXQgbWVhbnMgImxlYXZlIGFsb25lIgotCQkJLy8gc28gbm8gY29udmVyc2lvbiBuZWVkZWQuCi0JCQkvLyBzZXQgaGVyZSwgb25seSBpZiBudWxsIChzaG91bGQgYWxyZWFkeSBiZSBzZXQsIGJ1dCBpZiBub3QsCi0JCQkvLyB3ZSdsbCBzZXQgc28gYW55IHN1YnNlcXVlbnQgZWRpdGluZyBpbnNlcnRzIHdoYXQgd2UncmUKLQkJCS8vIGFzc3VtaW5nKQotCQkJaWYgKCF0aGVGbGF0TW9kZWwuZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpLmVxdWFscyhwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJdGhlRmxhdE1vZGVsLnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIocHJvYmFibGVMaW5lRGVsaW1pdGVyKTsKLQkJCX0KLQkJCWNvbnZlcnRlZFRleHQgPSBvcmlnaW5hbFN0cmluZzsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghcHJlZmVycmVkTGluZURlbGltaXRlci5lcXVhbHMocHJvYmFibGVMaW5lRGVsaW1pdGVyKSkgewotCQkJCS8vIHRlY2huaWNhbGx5LCB3b3VsZG4ndCBoYXZlIHRvIGNvbnZlcnQgbGluZSBkZWxpbWl0ZXJzCi0JCQkJLy8gaGVyZSBhdCBiZWdpbm5pbmcsIGJ1dCB3aGVuIHdlIHNhdmUsIGlmIHRoZSBwcmVmZXJyZWQKLQkJCQkvLyBsaW5lIGRlbGltdGVyIGlzICJsZWF2ZSBhbG9uZSIgdGhlbiB3ZSBkbyBsZWF2ZSBhbG9uZSwKLQkJCQkvLyBzbyBiZXN0IHRvIGJlIHJpZ2h0IGZyb20gYmVnaW5uaW5nLgotCQkJCWNvbnZlcnRlZFRleHQgPSBjb252ZXJ0TGluZURlbGltaXRlcnMob3JpZ2luYWxTdHJpbmcsIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIpOwotCQkJCXRoZUZsYXRNb2RlbC5zZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKHByZWZlcnJlZExpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhleSBhcmUgYWxyZWFkeSB0aGUgc2FtZSwgbm8gY29udmVyc2lvbiBuZWVkZWQKLQkJCQl0aGVGbGF0TW9kZWwuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihwcmVmZXJyZWRMaW5lRGVsaW1pdGVyKTsKLQkJCQljb252ZXJ0ZWRUZXh0ID0gb3JpZ2luYWxTdHJpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBWZXJ5IG1lY2hhbmljYWwgbWV0aG9kLCBqdXN0IHRvIHJlYWQgdGhlIGNoYXJhY3RlcnMsIG9uY2UgdGhlIHJlYWRlciBpcwotCSAqIGNvcnJlY3RseSBjcmVhdGVkLiBDYW4gdGhyb3cgTWFsRm9ybWVkSW5wdXRFeGNlcHRpb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcmVhZElucHV0U3RyZWFtKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaW50IGZCbG9ja3NSZWFkID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG51bVJlYWQgPSAwOwotCQl0cnkgewotCQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbQ29kZWRJTy5NQVhfQlVGX1NJWkVdOwotCQkJd2hpbGUgKG51bVJlYWQgIT0gLTEpIHsKLQkJCQludW1SZWFkID0gcmVhZGVyLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCk7Ci0JCQkJaWYgKG51bVJlYWQgPiAwKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodEJ1ZmYsIDAsIG51bVJlYWQpOwotCQkJCQlmQmxvY2tzUmVhZCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChmRW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpLCBmQmxvY2tzUmVhZCAqIENvZGVkSU8uTUFYX0JVRl9TSVpFICsgbnVtUmVhZCArIGUuZ2V0SW5wdXRMZW5ndGgoKSk7Ci0JCX0KLQkJY2F0Y2ggKFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChmRW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpLCBmQmxvY2tzUmVhZCAqIENvZGVkSU8uTUFYX0JVRl9TSVpFICsgbnVtUmVhZCArIGUuZ2V0SW5wdXRMZW5ndGgoKSk7Ci0KLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbG9hZChJRW5jb2RlZERvY3VtZW50IGVuY29kZWREb2N1bWVudCwgUmVhZGVyIGlucHV0U3RyZWFtUmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW5wdXRTdHJlYW1SZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RyZWFtIHJlYWRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWludCBSRUFEX0JVRkZFUl9TSVpFID0gODE5MjsKLQkJaW50IE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLID0gMjAwMDAwOwotCQkvLyB0ZW1wIC4uLi4gZXZlbnR1YWxseSB3ZSdsbGwgb25seSByZWFkIGFzIG5lZWRlZAotCQlCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFN0cmVhbVJlYWRlciwgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUkspOwotCQlidWZmZXJlZFJlYWRlci5tYXJrKE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCWludCBudW1SZWFkID0gMDsKLQkJCWNoYXIgdEJ1ZmZbXSA9IG5ldyBjaGFyW1JFQURfQlVGRkVSX1NJWkVdOwotCQkJd2hpbGUgKChudW1SZWFkID0gYnVmZmVyZWRSZWFkZXIucmVhZCh0QnVmZiwgMCwgdEJ1ZmYubGVuZ3RoKSkgIT0gLTEpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHRCdWZmLCAwLCBudW1SZWFkKTsKLQkJCX0KLQkJCS8vIHJlbWVtYmVyIC0tIHdlIGRpZG4ndCBvcGVuIHN0cmVhbSAuLi4gc28gd2UgZG9uJ3QgY2xvc2UgaXQKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gaW50IHBvcyA9IGUuZ2V0SW5wdXRMZW5ndGgoKTsKLQkJCUVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byA9IGdldEVuY29kaW5nTWVtZW50bygpOwotCQkJYm9vbGVhbiBjb3VsZFJlc2V0ID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmNvZGluZ05hbWVJbkVycm9yID0gbG9jYWxFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0JCQlpZiAoZW5jb2RpbmdOYW1lSW5FcnJvciA9PSBudWxsKSB7Ci0JCQkJZW5jb2RpbmdOYW1lSW5FcnJvciA9IGxvY2FsRW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJYnVmZmVyZWRSZWFkZXIucmVzZXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiByZXNldEV4Y2VwdGlvbikgewotCQkJCS8vIHRoZSBvbmx5IGVycnJvIHRoYXQgY2FuIG9jY3VyIGR1cmluZyByZXNldCBpcyBhbgotCQkJCS8vIElPRXhjZXB0aW9uCi0JCQkJLy8gZHVlIHRvIGFscmVhZHkgYmVpbmcgcGFzdCB0aGUgcmVzdCBtYXJrLiBJbiB0aGF0IGNhc2UsIHdlCi0JCQkJLy8gdGhyb3cgbW9yZSBnZW5lcmljIG1lc3NhZ2UKLQkJCQljb3VsZFJlc2V0ID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyAtMSBjYW4gYmUgdXNlZCBieSBVSSBsYXllciBhcyBhIGNvZGUgdGhhdCAicG9zaXRpb24gY291bGQgbm90Ci0JCQkvLyBiZQotCQkJLy8gZGV0ZXJtaW5lZCIKLQkJCWludCBjaGFyUG9zdGlvbiA9IC0xOwotCQkJaWYgKGNvdWxkUmVzZXQpIHsKLQotCQkJCWNoYXJQb3N0aW9uID0gZ2V0Q2hhclBvc3Rpb25PZkZhaWx1cmUoYnVmZmVyZWRSZWFkZXIpOwotCQkJCS8vIGdldENoYXJQb3N0aW9uT2ZGYWlsdXJlKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblN0cmVhbSwKLQkJCQkvLyBqYXZhRW5jb2RpbmdOYW1lSW5FcnJvcikpOwotCQkJfQotCQkJLy8gYWxsIG9mIHRoYXQganVzdCB0byB0aHJvdyBtb3JlIGFjY3VyYXRlIGVycm9yCi0JCQkvLyBub3RlOiB3ZSBkbyB0aGUgY29udmVyc2lvbiB0byBpYW5hTmFtZSwgaW5zdGVhZCBvZiB1c2luZyB0aGUKLQkJCS8vIGxvY2FsCi0JCQkvLyB2YXJpYWJsZSwKLQkJCS8vIGJlY2F1c2UgdGhpcyBpcyB1bHRpbWF0ZWx5IG9ubHkgZm9yIHRoZSB1c2VyIGVycm9yIG1lc3NhZ2UKLQkJCS8vICh0aGF0Ci0JCQkvLyBpcywKLQkJCS8vIHRoZSBlcnJvciBvY2N1cnJlZAotCQkJLy8gaW4gY29udGV4dCBvZiBqYXZhRW5jb2RpbmdOYW1lIG5vIG1hdHRlciB3aGF0IGlhbmFFbmNvZGluZ05hbWUKLQkJCS8vIGlzCi0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGVuY29kaW5nTmFtZUluRXJyb3IsIENvZGVkSU8uZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChlbmNvZGluZ05hbWVJbkVycm9yKSwgY2hhclBvc3Rpb24sICFjb3VsZFJlc2V0LCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IGJ1ZmZlcjsKLQkJZW5jb2RlZERvY3VtZW50LnNldChzdHJpbmdidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlTdHJpbmdCdWZmZXIgYWxsVGV4dCA9IHJlYWRJbnB1dFN0cmVhbShyZWFkZXIpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KGFsbFRleHQudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ4YTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotLyoqCi0gKiBBIGphdmEuaW8uUmVhZGVyIHRoYXQgY2FuIG9wZXJhdGUgb2ZmIG9mIGFuIElEb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50UmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgaW50IG1hcmsgPSAwOwotCXByaXZhdGUgaW50IHBvc2l0aW9uID0gMDsKLQotCXB1YmxpYyBEb2N1bWVudFJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoZG9jdW1lbnQsIDApOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpbml0aWFsUG9zaXRpb24pIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXBvc2l0aW9uID0gaW5pdGlhbFBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI21hcmsoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQltYXJrID0gcG9zaXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZihmRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJCi0JCWNoYXJbXSByZWFkQ2hhcnMgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHBvc2l0aW9uID49IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQkvLyB0aGUgSURvY3VtZW50IGlzIGxpa2VseSB1c2luZyBhIEdhcFRleHRTdG9yZSwgc28gd2UgY2FuJ3QKLQkJCS8vIHJldHJpZXZlIGEgY2hhcltdIGRpcmVjdGx5Ci0JCQlpZiAocG9zaXRpb24gKyBsZW4gPiBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmVhZENoYXJzID0gZkRvY3VtZW50LmdldChwb3NpdGlvbiwgZkRvY3VtZW50LmdldExlbmd0aCgpIC0gcG9zaXRpb24pLnRvQ2hhckFycmF5KCk7Ci0JCQllbHNlCi0JCQkJcmVhZENoYXJzID0gZkRvY3VtZW50LmdldChwb3NpdGlvbiwgbGVuKS50b0NoYXJBcnJheSgpOwotCQkJU3lzdGVtLmFycmF5Y29weShyZWFkQ2hhcnMsIDAsIGNidWYsIG9mZiwgcmVhZENoYXJzLmxlbmd0aCk7Ci0JCQkvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBwb3NpdGlvbiArICI6IiArIHJlYWRDaGFycy5sZW5ndGggKyAiICIKLQkJCS8vICsgU3RyaW5nVXRpbHMuZXNjYXBlKG5ldyBTdHJpbmcocmVhZENoYXJzKSkpOwotCQkJcG9zaXRpb24gKz0gcmVhZENoYXJzLmxlbmd0aDsKLQkJCXJldHVybiByZWFkQ2hhcnMubGVuZ3RoOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcmVhZGluZyBmcm9tIElEb2N1bWVudDogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXBvc2l0aW9uID0gbWFyazsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpbml0aWFsUG9zaXRpb24pIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXBvc2l0aW9uID0gaW5pdGlhbFBvc2l0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5SZWFkZXIjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGludCBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXBvc2l0aW9uID0gcG9zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5SZWFkZXIjc2tpcChsb25nKQotCSAqLwotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZihmRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCi0JCWxvbmcgc2tpcHBlZCA9IG47Ci0JCWlmIChwb3NpdGlvbiArIG4gPiBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNraXBwZWQgPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSBwb3NpdGlvbjsKLQkJCXBvc2l0aW9uID0gZkRvY3VtZW50LmdldExlbmd0aCgpOwotCQl9IGVsc2UgewotCQkJcG9zaXRpb24gKz0gbjsKLQkJfQotCQlyZXR1cm4gc2tpcHBlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YjcwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCXZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZiN2I0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRMb2FkZXIgewotCi0JSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFRoaXMgQVBJIGlzIGxpa2UgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50LCBleGNlcHQgaXQgc2hvdWxkIHBvcHVsYXRlCi0JICogdGhlIHN0cnVjdHVyZWREb2N1bWVudCB3aXRoIHRoZSBjb250ZW50cyBvZiBJRmlsZS4gQWxzbywgdGhvc2UKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRzIHdoaWNoIGFyZSBzZW5zaXRpdmUgdG8gdGhlIGlucHV0ICh0aGF0IGlzLCB0aGUKLQkgKiBwYXJzZXIgb3IgcGFyc2VyIGluaXRpYWxpemF0aW9uIG15IHJlcXVpcmUgdGhlIGlucHV0KSBzaG91bGQKLQkgKiBhZGRpdGlvbmFsbHkgaW5pdGlhbGl6ZSB0aGUgcGFyc2VyLCBldGMuLCBhcHByb3ByaWF0ZSB0byB0aGUgaW5wdXQuCi0JICogCi0JICogQXMgYWx3YXlzLCB0aGUgYXBwcm9wcmlhdGUgZGVjb2Rpbmcgc2hvdWxkIGJlIHVzZWQuCi0JICovCi0JSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSUVuY29kZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGx5IGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaXN0cmVhbSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlzdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQotCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKTsKLQotCS8qKgotCSAqIEEgdXRpbGl0eSBtZXRob2QsIGJ1dCBkZXBlbmRzIG9uIHN1YmNsYXNzZXMgdG8gaW1wbGltZW50IHRoZSBwcmVmZXJyZWQKLQkgKiBlbmQgb2YgbGluZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZS4gTm90ZTogc3ViY2xhc3NlcyBzaG91bGQgbm90Ci0JICogcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kICh0aGVyZSdzIG5vIHJlYXNvbiB0bywgZXZlbiB0aG91Z2ggaXRzIHBhcnQgb2YKLQkgKiBpbnRlcmZhY2UpLiBUaGlzIG1ldGhvZCBub3Qgb25seSBjb252ZXJ0cyBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLCBpZgotCSAqIG5lZWRlZCwgYnV0IHNldHMgdGhlIGNvcnJlY3QgZW5kLW9mLWxpbmUgZGVsaW1pdGVyIGluCi0JICogc3RydWN0dXJlZERvY3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgZWl0aGVyIHRoZSBvcmlnaW5hbCBzdHJpbmcsCi0JICogaWYgbm8gY29udmVyc2lvbiBpcyBuZWVkZWQsIG9yIGEgbmV3IHN0cmluZyB3aXRoIGVuZC1vZi1saW5lcwotCSAqIGNvbnZlcnRlZC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgaGFuZGxlTGluZURlbGltaXRlcihTdHJpbmdCdWZmZXIgb3JpZ2luYWxTdHJpbmcsIElFbmNvZGVkRG9jdW1lbnQgdGhlU3RydWN0dXJlZERvY3VtZW50KTsKLQotCXZvaWQgcmVsb2FkKElFbmNvZGVkRG9jdW1lbnQgZG9jdW1lbnQsIFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNWRmMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBBdCB0aGUgbW9tZW50LCB0aGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCBhcyBhIGNvbnZlbmllbmNlIHRvIGhlbHAgc3dpdGNoCi0gKiBiZXR3ZWVuIHZhcmlvdXMgdHlwZXMgb2YgdGhyZWFkaW5nIG1vZGVscyBpbiB0aGUgZG9jdW1lbnQsIGFsbCBpbiBhIGNlbnRyYWwKLSAqIHBpZWNlIG9mIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV1JJVEVfU1lOQ0hST05JWkVEID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVCA9IFdSSVRFX1NZTkNIUk9OSVpFRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5TWU5DSFJPTklaRUQgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShpbnQgdHlwZSwgUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBVTlNZTkNIUk9OSVpFRCA6Ci0JCQkJcmVzdWx0ID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50KHBhcnNlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdSSVRFX1NZTkNIUk9OSVpFRCA6Ci0JCQkJcmVzdWx0ID0gbmV3IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQocGFyc2VyKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVxdWVzdCBkb2N1bWVudCB0eXBlIHdhcyBub3Qga25vd24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgKHN5c3RlbSBkZWZhdWx0KSBzdHJ1Y3R1cmVkIGRvY3VtZW50IGluaXRpYWxpemVkIHdpdGggdGhlCi0JICogcGFyc2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJcmV0dXJuIGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKERFRkFVTFQsIHBhcnNlcik7Ci0JfQotCi0JLyoqCi0JICogTm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZAotCSAqIAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRVdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWVjNTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHRleHQgZnVuY3Rpb25zLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIG1hcmtlZCBhcyBkZXByZWNhdGVkIHRvIHJlbWluZCB1cyB0byBwaGFzZSB0aGlzIG91dCAoYW5kL29yCi0gKiAgICAgICAgICAgICBtb3ZlIHRvICJmaW5pc2hlZCIgdmVyc2lvbikuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0VXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGlmIHBvc3NpYmxlLCBpdHMgYmVzdCB0byB1c2UKLQkgKiAgICAgICAgICAgICBJRG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBmZ0RlbGltaXRlcnMgPSBuZXcgU3RyaW5nW117IlxuIiwgIlxyIiwgIlxyXG4ifTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERldGVybWluZXMgd2hpY2ggb25lIG9mIGZnRGVsaW1pdGVycyBhcHBlYXJzIGZpcnN0IGluIHRoZSB0ZXh0LiBJZiBub25lCi0JICogb2YgdGhlbSB0aGUgaGludCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRlcm1pbmVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyLCBTdHJpbmdbXSBwb3NzaWJsZXMsIFN0cmluZyBoaW50KSB7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPOiBhdm9pZCB1c2Ugb2YgU3RyaW5nIGluc3RhbmNlCi0JCQlTdHJpbmcgdGV4dCA9IHRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCWludFtdIGluZm8gPSBpbmRleE9mKHBvc3NpYmxlcywgdGV4dCwgMCk7Ci0JCQlyZXR1cm4gcG9zc2libGVzW2luZm9bMV1dOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24geCkgewotCQl9Ci0JCXJldHVybiBoaW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgZ3JlYXRlciB0aGFuIG9mZnNldCBvZiB0aGUgbG9uZ2VzdAotCSAqIG1hdGNoaW5nIHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gaW5kZXhPZihTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCwgaW50IG9mZnNldCkgewotCi0JCWludFtdIHJlc3VsdCA9IHstMSwgLTF9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKHNlYXJjaFN0cmluZ3NbaV0sIG9mZnNldCk7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCi0JCQkJaWYgKHJlc3VsdFswXSA9PSAtMSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4IDwgcmVzdWx0WzBdKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gcmVzdWx0WzBdICYmIHNlYXJjaFN0cmluZ3NbaV0ubGVuZ3RoKCkgPiBzZWFyY2hTdHJpbmdzW3Jlc3VsdFsxXV0ubGVuZ3RoKCkpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZmlsZWJ1ZmZlcnMvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2ZpbGVidWZmZXJzL0Jhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjkyNDBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZmlsZWJ1ZmZlcnMvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBHZW5lcmljIElEb2N1bWVudEZhY3RvcnkgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnRzIHRvIGJlIHVzZWQgYnkgdGhlCi0gKiBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24gZXh0ZW5zaW9uIHBvaW50LiBUaGlzIGNsYXNzCi0gKiBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkgaW1wbGVtZW50cyBJRG9jdW1lbnRGYWN0b3J5LCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLQkvKgotCSAqIFRoZSBjb250ZW50IHR5cGUgSUQgdXNlZCB0byBkZWNsYXJlIHRoaXMgZmFjdG9yeTsgaXQgaXMgdXNlZCB0byBmaW5kCi0JICogdGhlIGNvcnJlc3BvbmRpbmcgc3VwcG9ydCBmb3IgY3JlYXRpbmcgdGhlIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlSWRlbnRpZmllciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvciwgb25seSB0byBiZSB1c2VkIGJ5IHRoZQotCSAqIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeSNjcmVhdGVEb2N1bWVudCgpCi0JICovCi0JcHVibGljIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQl3aGlsZSAoaGFuZGxlciA9PSBudWxsICYmICFJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQuZXF1YWxzKGNvbnRlbnRUeXBlLmdldElkKCkpKSB7Ci0JCQloYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWRvY3VtZW50ID0gbmV3IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gZkNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKgotCSAqIExvYWRzIHRoZSBjb250ZW50IHR5cGUgSUQgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBTdHJ1Y3R1cmVkIERvY3VtZW50LiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZDb250ZW50VHlwZUlkZW50aWZpZXIgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJjb250ZW50VHlwZUlkIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCWZDb250ZW50VHlwZUlkZW50aWZpZXIgPSAoU3RyaW5nKSBkYXRhOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ4ZWMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSBpbml0aWFsIElEb2N1bWVudEV4dGVuc2lvbjQgc3VwcG9ydCAtICMxMDI4MjIKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcyA9IHRydWU7IC8vIHNwZWNpYWwgZmxhZyBmb3IgSlVuaXQKLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUNsb3NlZChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCi0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gaW5wdXQ7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciByZWFkLiBXaWxsIHJldHVybiBmb3JtYXR0ZWQKLQkJCS8vIHN0cmluZyBhbmQgTk9UIHNhdmUgbW9kZWwuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArICIuIiArIGdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dDsKLQotCQlpZiAoKHN0YXJ0ID49IDApICYmIChsZW5ndGggPj0gMCkgJiYgKHN0YXJ0ICsgbGVuZ3RoIDw9IGlucHV0Lmxlbmd0aCgpKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgcmVhZC4gV2lsbCByZXR1cm4gZm9ybWF0dGVkCi0JCQkJLy8gc3RyaW5nIGFuZCBOT1Qgc2F2ZSBtb2RlbC4KLQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyAiLiIgKyBnZXRGaWxlRXh0ZW5zaW9uKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkJLy8gZm9ybWF0Ci0JCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA+PSAwKSAmJiAoc3RhcnQgKyBsZW5ndGggPD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZgotCQkJCS8vIG1vZGVsIGNoYW5nZWQuCi0JCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0KLQkJCQkvLyBmb3JtYXQKLQkJCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQl9Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyB3aGVuZXZlciBmb3JtYXR0aW5nIG1vZGVsLCBmaXJlIGFib3V0dG9jaGFuZ2UvbW9kZWxjaGFuZ2VkCi0JCQkJc3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCkgPyBudWxsIDogZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0KLQkJCQlpZiAoKHN0YXJ0ID09IDApICYmIChsZW5ndGggPT0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKSkKLQkJCQkJc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoc3RydWN0dXJlZE1vZGVsLCBmYWxzZSk7Ci0JCQkJZWxzZQotCQkJCQlzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChzdHJ1Y3R1cmVkTW9kZWwsIHRydWUpOwotCi0JCQkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoID49IDApICYmIChzdGFydCArIGxlbmd0aCA8PSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCUxpc3QgYWN0aXZlTm9kZXMgPSBnZXRBbGxBY3RpdmVOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCQlpZiAoYWN0aXZlTm9kZXMuc2l6ZSgpID4gMCkgewotCQkJCQkJTm9kZSBmaXJzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZ2V0KDApOwotCQkJCQkJTm9kZSBsYXN0Tm9kZSA9IChOb2RlKSBhY3RpdmVOb2Rlcy5nZXQoYWN0aXZlTm9kZXMuc2l6ZSgpIC0gMSk7Ci0KLQkJCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCQkJTm9kZSBlYWNoTm9kZSA9IGZpcnN0Tm9kZTsKLQkJCQkJCU5vZGUgbmV4dE5vZGUgPSBudWxsOwotCQkJCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJCQkJLy8gdXBkYXRlICJkb25lIgotCQkJCQkJCWRvbmUgPSAoZWFjaE5vZGUgPT0gbGFzdE5vZGUpOwotCi0JCQkJCQkJLyoKLQkJCQkJCQkgKiBnZXQgbmV4dCBzaWJsaW5nIGJlZm9yZSBmb3JtYXQgYmVjYXVzZSBlYWNoTm9kZQotCQkJCQkJCSAqIG1heSBiZSBkZWxldGVkLCBmb3IgZXhhbXBsZSB3aGVuIGl0J3MgYW4gZW1wdHkKLQkJCQkJCQkgKiB0ZXh0IG5vZGUKLQkJCQkJCQkgKi8KLQkJCQkJCQluZXh0Tm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQkvLyBmb3JtYXQgZWFjaCBub2RlCi0JCQkJCQkJZm9ybWF0Tm9kZShlYWNoTm9kZSk7Ci0KLQkJCQkJCQkvLyB1cGRhdGUgZWFjaCBub2RlCi0JCQkJCQkJaWYgKChuZXh0Tm9kZSAhPSBudWxsKSAmJiAobmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpKQotCQkJCQkJCQkvLyBuZXh0Tm9kZSBpcyBkZWxldGVkIGR1cmluZyBmb3JtYXQKLQkJCQkJCQkJZWFjaE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZWFjaE5vZGUgPSBuZXh0Tm9kZTsKLQotCQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UKLQkJCQkJCQkvLyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHdpdGggZWFjaE5vZGUuCi0JCQkJCQkJLy8gV2UgZG9uJ3Qgd2FudCBhbiBpbmZpbml0ZSBsb29wIGhlcmUuCi0JCQkJCQkJaWYgKGVhY2hOb2RlID09IG51bGwpCi0JCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyB3ZSBuZWVkIHR3byBmaW5hbGx5J3MsIGp1c3QgaW4gY2FzZSBmaXJzdCBmYWlscwotCQkJCXRyeSB7Ci0JCQkJCWlmICgoZG9jRXh0NCAhPSBudWxsKSAmJiAocmV3cml0ZVNlc3Npb24gIT0gbnVsbCkpCi0JCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQkvLyBhbHdheXMgbWFrZSBzdXJlIHRvIGZpcmUgY2hhbmdlZG1vZGVsIHdoZW4gZG9uZQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0Tm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQkJLy8gZm9ybWF0IHRoZSBvd25lciBub2RlIGlmIGl0J3MgYW4gYXR0cmlidXRlIG5vZGUKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQluZXdOb2RlID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQotCQkJLy8gcmVmcmVzaCBmb3JtYXQgcHJlZmVyZW5jZXMgYmVmb3JlIGdldHRpbmcgZm9ybWF0dGVyCi0JCQlpZiAocmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKQotCQkJCXJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcygpOwotCi0JCQkvLyBnZXQgZm9ybWF0dGVyIGFuZCBmb3JtYXQgY29udHJhaW50cwotCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gZ2V0Rm9ybWF0dGVyKG5ld05vZGUpOwotCQkJLy8gVE9ET19mdXR1cmU6IGFkZGVkIGFzc2VydCB0byByZXBsYWNlICJyZWR1bmRhbnQgbnVsbCBjaGVjayIuCi0JCQkvLyBpZiBmb3JtYXR0ZXIgaXMgZXZlciBudWxsLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lCi0JCQkvLyBkZWZhdWx0IGZvcm1hdHRlciB0byBzZXJ2ZSBhcyBwbGFjZSBob2xkZXIuCi0JCQlBc3NlcnQuaXNOb3ROdWxsKGZvcm1hdHRlciwgImZvcm1hdHRlciB3YXMgbnVsbCBmb3IgYSBub2RlLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBmb3JtYXR0ZXIuZ2V0Rm9ybWF0Q29udHJhaW50cygpOwotCQkJZm9ybWF0Q29udHJhaW50cy5zZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCh0cnVlKTsKLQkJCS8vIGZvcm1hdCBlYWNoIG5vZGUKLQkJCWZvcm1hdHRlci5mb3JtYXQobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0QWxsQWN0aXZlTm9kZXMgaW5zdGVhZAotCSAqLwotCXByb3RlY3RlZCBWZWN0b3IgZ2V0QWN0aXZlTm9kZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydE5vZGVPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJTGlzdCBhbGxBY3RpdmVOb2RlcyA9IGdldEFsbEFjdGl2ZU5vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnROb2RlT2Zmc2V0LCBsZW5ndGgpOwotCQlyZXR1cm4gbmV3IFZlY3RvcihhbGxBY3RpdmVOb2Rlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QWxsQWN0aXZlTm9kZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydE5vZGVPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJTGlzdCBhY3RpdmVOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCU5vZGUgc3RhcnROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCk7Ci0JCQkvLyBzZWUgaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ3MTEKLQkJCS8vCi0JCQkvLyBXZSBoYXZlIHRvIHdhdGNoIGZvciBzZWxlY3Rpb24gYm91bmRhcnkgY29uZGl0aW9ucy4gVXNlIHRoaXMgYXMKLQkJCS8vIGFuIGV4YW1wbGU6IDxhPnRleHQ8L2E+PGI+dGV4dDwvYj4sCi0JCQkvLyBJZiB0aGUgd2hvbGUgPGE+IG5vZGUgaXMgc2VsZWN0ZWQsIGxpa2U6Ci0JCQkvLyB8PGE+dGV4dDwvYT58PGI+dGV4dDwvYj4sIHdlIG5lZWQgdG8gc3Vic3RyYWN0IHRoZSBsZW5ndGggYnkgMQotCQkJLy8gdG8gZmluZAotCQkJLy8gdGhlIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uOgotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoIC0gMSksCi0JCQkvLyBvciBlbHNlCi0JCQkvLyB3ZSdkIGZpbmQgdGhlIG5leHQgYWRqYWNlbnQgbm9kZS4KLQkJCS8vCi0JCQkvLyBIb3dldmVyLCB3aGVuIHRoZSBzZWxlY3Rpb24gbGVuZ3RoIGlzIDAgKG1lYW5pbmcgbm8gdGV4dCBpcwotCQkJLy8gc2VsZWN0ZWQpLCB0aGUgY3Vyc29yIGlzIGF0IHRoZSBiZWdpbm5pbmcKLQkJCS8vIG9mIHRoZSBub2RlIHdlIHdhbnQgdG8gZm9ybWF0OiB8PGE+dGV4dDwvYT48Yj50ZXh0PC9iPiwgdGhlCi0JCQkvLyBub2RlIGF0IHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiBpczoKLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCkuCi0JCQlpbnQgZW5kTm9kZU9mZnNldCA9IGxlbmd0aCA+IDAgPyBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxIDogc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoOwotCQkJTm9kZSBlbmROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGVuZE5vZGVPZmZzZXQpOwotCi0JCQkvLyBtYWtlIHN1cmUgaXQncyBhbiBub24tZW1wdHkgZG9jdW1lbnQKLQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkgewotCQkJCXdoaWxlIChpc1NpYmxpbmdPZihzdGFydE5vZGUsIGVuZE5vZGUpID09IGZhbHNlKSB7Ci0JCQkJCWlmIChlbmROb2RlICE9IG51bGwpCi0JCQkJCQllbmROb2RlID0gZW5kTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChlbmROb2RlID09IG51bGwpIHsKLQkJCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkvLyBzZWUKLQkJCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzExCi0JCQkJCQkvLyBhbmQgbm90ZXMgYWJvdmUKLQkJCQkJCWVuZE5vZGVPZmZzZXQgPSBsZW5ndGggPiAwID8gc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoIC0gMSA6IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aDsKLQkJCQkJCWVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oZW5kTm9kZU9mZnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl3aGlsZSAoc3RhcnROb2RlICE9IGVuZE5vZGUpIHsKLQkJCQkJYWN0aXZlTm9kZXMuYWRkKHN0YXJ0Tm9kZSk7Ci0JCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCQlpZiAoc3RhcnROb2RlICE9IG51bGwpCi0JCQkJCWFjdGl2ZU5vZGVzLmFkZChzdGFydE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2ZU5vZGVzOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCWlmICgoZkZvcm1hdENvbnRyYWludHMgPT0gbnVsbCkgJiYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApOwotCi0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gZ2V0Rm9ybWF0dGVyKG5vZGUpOwotCQkJCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJCQlmRm9ybWF0Q29udHJhaW50cyA9IGZvcm1hdHRlci5nZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRDb250cmFpbnRzOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoTm9kZSBub2RlKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2libGluZ09mKE5vZGUgbm9kZSwgTm9kZSBlbmROb2RlKSB7Ci0JCWlmIChlbmROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSB7Ci0JCQlOb2RlIHNpYmxpbmdOb2RlID0gbm9kZTsKLQkJCXdoaWxlIChzaWJsaW5nTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNpYmxpbmdOb2RlID09IGVuZE5vZGUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJc2libGluZ05vZGUgPSBzaWJsaW5nTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCkgewotCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAotCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyA9IGdldEZvcm1hdENvbnRyYWludHMoc3RydWN0dXJlZE1vZGVsKTsKLQotCQlpZiAoZm9ybWF0Q29udHJhaW50cyAhPSBudWxsKQotCQkJZm9ybWF0Q29udHJhaW50cy5zZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChmb3JtYXRXaXRoU2libGluZ0luZGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RjNzIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0vKioKLSAqIFRoZXNlIGFyZSBpdGVtcyB0aGF0IGNoYW5nZSBmcm9tIGVsZW1lbnQgdG8gZWxlbWVudC4KLSAqIFBhc3NlZCBmcm9tIG5vZGUgdG8gbm9kZSBpbiBhIHJlY3Vyc2l2ZSBjYWxsLgotICogZWcuIGN1cnJlbnQgaW5kZW50IGlzIDIgZGVlcCwgYnV0IGZvciB0aGUgbmV4dCBub2RlIG1pZ2h0IGJlIDMuLi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgewotCWJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQlTdHJpbmcgZ2V0Q3VycmVudEluZGVudCgpOwotCi0JYm9vbGVhbiBnZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpOwotCi0JYm9vbGVhbiBnZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCk7Ci0KLQkvKiogCi0JICogc29tZSBzcGVjaWFsIGVsZW1lbnRzIGNhbiBpZ25vcmUgY2xlYXJpbmcgYmxhbmsgbGluZXMKLQkgKiAqLwotCXZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKTsKLQotCXZvaWQgc2V0Q3VycmVudEluZGVudChTdHJpbmcgY3VycmVudEluZGVudCk7Ci0KLQl2b2lkIHNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGJvb2xlYW4gZm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQpOwotCQotCXZvaWQgc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChib29sZWFuIGluUHJlc2VydmVTcGFjZUVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzgxOWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotLyoqCi0gKiBUaGVzZSBhcmUgaXRlbXMgdGhhdCBkbyBub3QgY2hhbmdlIGZyb20gZWxlbWVudCB0byBlbGVtZW50LgotICogUGFzc2VkIGZyb20gbm9kZSB0byBub2RlIGluIGEgcmVjdXJzaXZlIGNhbGwgYmVjYXVzZSBzb21ldGltZXMKLSAqIGNoaWxkIG5vZGVzIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCQotCWJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQlTdHJpbmcgZ2V0SW5kZW50KCk7Ci0KLQlpbnQgZ2V0TGluZVdpZHRoKCk7Ci0KLQl2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyk7Ci0KLQl2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KTsKLQotCXZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjQ4MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoZSBtYWluIGZvcm1hdHRpbmcgZW5naW5lLiAgCi0gKiBMb29wcyB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgaW4gYW4gSVN0cnVjdHVyZWRNb2RlbC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhbiBJRG9jdW1lbnQgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSURvY3VtZW50J3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgZm9ybWF0cyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlCi0JICogbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYW4gSUZpbGUgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSUZpbGUncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBmb3JtYXRzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXRGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGEgbW9kZWwgYXMgaW5wdXQsIGFuZCBmb3JtYXRzCi0JICogdGhlIHdob2xlIG1vZGVsLgotCSAqLwotCXZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGZvcm1hdHMKLQkgKiB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGguCi0JICovCi0Jdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGEgbm9kZSBhcyBpbnB1dCwgYW5kIGZvcm1hdHMgdGhlCi0JICogbm9kZSBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGZvcm1hdE5vZGUoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoaXMgPGNvZGU+SVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I8L2NvZGU+LgotCSAqIFRoZSBtb25pdG9yIGlzIHVzZWQgdG8gZGlzcGxheSBwcm9ncmVzcyBvciBjYW5jZWwgaWYgdGhlIGZvcm1hdHRlciBpcyBydW4gCi0JICogaW4gYSBiYWNrZ3JvdW5kIGpvYi4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyZWU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBLbm93cyBob3cgdG8gZm9ybWF0IGEgcGFydGljdWxhciBub2RlLgotICogCi0gKiBlZy4gZ2VuZXJpYyBub2RlLCB0ZXh0IG5vZGUsIGRvY3VtZW50IG5vZGUsIGNvbW1lbnQsIGV0Yy4uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIHsKLQkKLQl2b2lkIGZvcm1hdChOb2RlIG5vZGUpOwotCi0Jdm9pZCBmb3JtYXQoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZ2V0Rm9ybWF0Q29udHJhaW50cygpOwotCi0JSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpOwotCi0Jdm9pZCBzZXRGb3JtYXRQcmVmZXJlbmNlcyhJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKTsKLQotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5NWM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0geG1sOnNwYWNlPSdwcmVzZXJ2ZScgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRJbmRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluUHJlc2VydmVTcGFjZUVsZW1lbnQgPSBmYWxzZTsKLQotCXB1YmxpYyBib29sZWFuIGdldENsZWFyQWxsQmxhbmtMaW5lcygpIHsKLQkJcmV0dXJuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50SW5kZW50KCkgewotCQlyZXR1cm4gZkN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSB7Ci0JCXJldHVybiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKSB7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMgPSBjbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGVudChTdHJpbmcgY3VycmVudEluZGVudCkgewotCQlmQ3VycmVudEluZGVudCA9IGN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCkgewotCQlmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmb3JtYXRXaXRoU2libGluZ0luZGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkgewotCQlyZXR1cm4gZkluUHJlc2VydmVTcGFjZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChib29sZWFuIGluUHJlc2VydmVTcGFjZUVsZW1lbnQpIHsKLQkJZkluUHJlc2VydmVTcGFjZUVsZW1lbnQgPSBpblByZXNlcnZlU3BhY2VFbGVtZW50OwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhZDdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCXByaXZhdGUgYm9vbGVhbiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCXByaXZhdGUgU3RyaW5nIGZJbmRlbnQ7Ci0JcHJpdmF0ZSBpbnQgZkxpbmVXaWR0aDsKLQotCXB1YmxpYyBib29sZWFuIGdldENsZWFyQWxsQmxhbmtMaW5lcygpIHsKLQkJcmV0dXJuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmRlbnQoKSB7Ci0JCXJldHVybiBmSW5kZW50OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZVdpZHRoKCkgewotCQlyZXR1cm4gZkxpbmVXaWR0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhckFsbEJsYW5rTGluZXMoYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMpIHsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnQoU3RyaW5nIGluZGVudCkgewotCQlmSW5kZW50ID0gaW5kZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmVXaWR0aChpbnQgbGluZVdpZHRoKSB7Ci0JCWZMaW5lV2lkdGggPSBsaW5lV2lkdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0Fic3RyYWN0TW9kZWxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvQWJzdHJhY3RNb2RlbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5ZmEyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvQWJzdHJhY3RNb2RlbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLlBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlcjsKLQotLyoqCi0gKiBJU1NVRTogbmVlZCB0byBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBpbXByb3ZlZCBBUEkuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0JcHJpdmF0ZSBTdHJpbmcgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZXR0aW5nOwotCXByaXZhdGUgU3RyaW5nIG1vZGVsSGFuZGxlcklEOwotCi0JcHVibGljIEFic3RyYWN0TW9kZWxIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZXNlIGZhY3RvcmllcyBhcmUgYWRkZWQgYXV0b21hdGljYWxseSBieSBtb2RlbCBtYW5hZ2VyCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gaG9sZEZhY3RvcmllcyA9IFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZhY3Rvcmllcyh0aGlzKTsKLQkJaWYgKGhvbGRGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZEFsbChob2xkRmFjdG9yaWVzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKSB7Ci0JCXJldHVybiBhc3NvY2lhdGVkQ29udGVudFR5cGVJZDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBtb2RlbEhhbmRsZXJJRDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0U2V0dGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZCA9IGNvbnRlbnRUeXBlSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChib29sZWFuIGRlZmF1bHRQYXJhbSkgewotCQlkZWZhdWx0U2V0dGluZyA9IGRlZmF1bHRQYXJhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJbW9kZWxIYW5kbGVySUQgPSBpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzN2Q1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkVHlwZUhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlc2UgQWRhcHRlckZhY3RvcmllcyBhcmUgTk9UIGFkZGVkIHRvIElTdHJ1Y3R1cmVkTW9kZWwncwotCSAqIElBZGFwdGVyRmFjdG9yeSBSZWdpc3RyeSAuLi4gdGhleSBhcmUgZm9yIHVzZSBieSAiSlNQIEF3YXJlCi0JICogQWRhcHRlckZhY3RvcmllcyIgVGhlIGFyZSBhZGRlZCB0byB0aGUgInJlZ2lzdHJ5IiBpbiB0aGUKLQkgKiBQYWdlRGlyZWN0aXZlQWRhcHRlci4KLQkgKi8KLQlMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29udGVudCB0eXBlIGZhbWlseSB0aGlzCi0JICogQ29udGVudFR5cGVEZXNjcmlwdGlvbiBiZWxvbmdzIHRvLgotCSAqLwotCVN0cmluZyBnZXRGYW1pbHlJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWltZSB0eXBlcyAoYXMgU3RyaW5ncykgdGhpcyBoYW5kbGVyIGlzIGFwcHJvcHJpYXRlCi0JICogZm9yCi0JICovCi0JTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKTsKLQkKLQkvKioKLQkgKiBJZiB0aGlzIGhhbmRlciBjYW4gaGFuZGxlIGEgZ2l2ZW4gbWltZVR5cGUuCi0JICogCi0JICogVGhpcyBpcyBhIGxvb3NlciBjaGVjayB0aGFuIHNpbXBseSBjaGVja2luZyBpZiBhIGdpdmUgbWltZVR5cGUKLQkgKiBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgdHlwZXMsIHNvIGl0IHNob3VsZCBiZSB1c2VkIHdpdGggdGhhdAotCSAqIGluIG1pbmQuICBUaGF0IGlzLCB0aGUgc3VwcG9ydGVkIG1pbWVUeXBlIGxpc3Qgc2hvdWxkIGlkZWFsbHkgYmUKLQkgKiBjaGVja2VkIGZpcnN0LgotCSAqIAotCSAqIGVnLiBpZiBhIG1pbWUgdHlwZSBlbmRzIHdpdGggIit4bWwiLCBsaWtlIHZvaWNlK3htbAotCSAqICAgICB0aGUgRW1iZWRkZWRYTUwgaGFuZGxlciBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgaXQKLQkgKiAgICAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgaGFuZGxlciB0aGlua3MgY2FuIGhhbmRsZSB0aGUgZ2l2ZW4gbWltZVR5cGUKLQkgKi8KLQlib29sZWFuIGNhbkhhbmRsZU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSk7Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gZ2l2ZSB0aGUgRW1iZWRkZWRDb250ZW50VHlwZSBhbiBvcHBvcnR1bml0eSB0byBhZGQKLQkgKiBmYWN0b3JpZXMgZGlyZWN0bHkgdG8gdGhlIElTdHJ1Y3R1cmVkTW9kZWwncyBJQWRhcHRlckZhY3RvcnkgcmVnaXN0cnkuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSk7Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplUGFyc2VyIEl0cyBwdXJwb3NlIGlzIHRvIHNldEJsb2NrVGFncwotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcik7Ci0KLQlib29sZWFuIGlzRGVmYXVsdCgpOwotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCXZvaWQgdW5pbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JRG9jdW1lbnRUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGM4NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBhbGxvdyBjdXN0b20gY29udGVudCB0eXBlcyB0byBiZSBkZWZpbmVkIGFzIGV4dGVuc2lvbiBwb2ludHMKLSAqIGluIHBsdWdpbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50VHlwZUhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlIExvYWRlciBpcyByZXBvbnNpYmxlIGZvciBkZWNvZGluZyB0aGUgUmVzb3VyY2UsCi0JICovCi0JSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIGxpa2VseSB0byBnbyBhd2F5LCBzbyBJIG1hcmtlZCBhcyBkZXByZWNhdGVkIHRvCi0JICogICAgICAgICAgICAgZGlzY291cnNhZ2UgdXNlCi0JICovCi0JSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKTsKLQotCS8qKgotCSAqIE11c3QgcmV0dXJuIHVuaXF1ZSBJRCB0aGF0IGlzIHRoZSBzYW1lIGFzIGlkZW50aWZpZWQgaW4gcGx1Z2luIHJlZ2lzdHJ5Ci0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSU1vZGVsSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lNb2RlbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyYjNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSU1vZGVsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEhhbmRsZXIgZXh0ZW5kcyBJRG9jdW1lbnRUeXBlSGFuZGxlciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBGYWN0b3JpZXMgd2hpY2ggYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkKLQkgKiBJTW9kZWxNYW5hZ2VyLiBUaGlzIGNhbiBhbmQgd2lsbCBvZnRlbiBiZSBhbiBlbXB0eSBMaXN0IChvciBudWxsKSwKLQkgKiBzaW5jZSBzb21lIEFkYXB0ZXJGYWN0b3JpZXMgbXVzdCBiZSBhZGRlZCBieSBMb2FkZXIgZGlyZWN0bHksIGFuZCBtb3N0Ci0JICogc2hvdWxkIGJlIGFkZGVkIGJ5IEVkaXRvcnMuIEZvcm1hdEFkYXB0ZXJGYWN0b3J5IGlzIGFuIGV4YW1wbGUgb2Ygb25lCi0JICogdGhhdCBjYW4gYmUgcmV0dXJuZWQgaGVyZSwgc2luY2UgdGhlIHRpbWluZyBvZiBhZGRpbmcgaXQgaXMgbm90Ci0JICogY3JpdGljYWwsIGJ1dCBpdCBtYXkgYmUgbmVlZGVkIGV2ZW4gd2hlbiBhbiBlZGl0b3IgaXMgbm90IGJlaW5nIHVzZWQuCi0JICovCi0JTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhlIGFzc29jaWF0ZWQgQ29udGVudFR5cGVIYW5kbGVyIEJ1dCBpcyBuZWVkZWQgZm9yCi0JICogbm93LgotCSAqLwotCVN0cmluZyBnZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogVGhlIExvYWRlciBpcyByZXBvbnNpYmxlIGZvciBkZWNvZGluZyB0aGUgUmVzb3VyY2UsCi0JICovCi0JSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCk7Ci0KLQlib29sZWFuIGlzRGVmYXVsdCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3ZmY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tNYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogSVNTVUU6IG5lZWQgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGluIGltcHJvdmVkIEFQSS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja01hcmtlciBleHRlbmRzIFRhZ01hcmtlciB7Ci0KLQkvLyBhbGxvdyBmb3IgSlNQIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgYmxvY2sKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmQWxsb3dKU1AgPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkNhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotCS8vIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudHMgb2YgdGhpcyB0YWcgKEJMT0NLX1RFWFQsIEpTUF9DT05URU5ULAotCS8vIGV0Yy4pCi0JcHJvdGVjdGVkIFN0cmluZyBmQ29udGV4dDsKLQotCS8qKgotCSAqIEl0J3Mgbm90IGFwcHJvcHJpYXRlIHRvIG1ha2UgImVtcHR5IiBCbG9ja01hcmtlciwgc28gd2UnbGwgbWFyayBhcwotCSAqIHByaXZhdGUuCi0JICovCi0JcHJpdmF0ZSBCbG9ja01hcmtlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIG1hcmtlciwgU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhpcyh0YWdOYW1lLCBtYXJrZXIsIGNvbnRleHQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXModGFnTmFtZSwgbWFya2VyLCBjb250ZXh0LCBjYXNlU2Vuc2l0aXZlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIG1hcmtlciwgU3RyaW5nIGNvbnRleHQsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSwgYm9vbGVhbiBhbGxvd0pTUCkgewotCQlzdXBlcih0YWdOYW1lLCBtYXJrZXIpOwotCQlzZXRDb250ZXh0KGNvbnRleHQpOwotCQlzZXRDYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmUpOwotCQlzZXRBbGxvd0pTUChhbGxvd0pTUCk7Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgcmVnaW9uQ29udGV4dCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXModGFnTmFtZSwgbnVsbCwgcmVnaW9uQ29udGV4dCwgY2FzZVNlbnNpdGl2ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFsbG93SlNQLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbGxvd3NKU1AoKSB7Ci0JCXJldHVybiBmQWxsb3dKU1A7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBmQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBmQ2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGxvd0pTUC4KLQkgKiAKLQkgKiBAcGFyYW0gYWxsb3dKU1AKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd0pTUCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0pTUChib29sZWFuIGFsbG93SlNQKSB7Ci0JCWZBbGxvd0pTUCA9IGFsbG93SlNQOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBzZW5zaXRpdmUpIHsKLQkJZkNhc2VTZW5zaXRpdmUgPSBzZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgY29udGV4dCkgewotCQlmQ29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUYWdQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1RhZ1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzVkNGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1RhZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBCbG9ja1RhZ1BhcnNlciB7Ci0KLQl2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcik7Ci0KLQl2b2lkIGJlZ2luQmxvY2tTY2FuKFN0cmluZyB0YWdOYW1lKTsKLQotCUJsb2NrTWFya2VyIGdldEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKTsKLQotCUxpc3QgZ2V0QmxvY2tNYXJrZXJzKCk7Ci0KLQl2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcik7Ci0KLQl2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODNjNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2tUb2tlbml6ZXIgewotCi0Jdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGNvbnRleHQpOwotCi0Jdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSk7Ci0KLQlMaXN0IGdldEJsb2NrTWFya2VycygpOwotCi0JSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JaW50IGdldE9mZnNldCgpOwotCi0JYm9vbGVhbiBpc0VPRigpOwotCi0JQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpOwotCi0Jdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KTsKLQotCXZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KElucHV0U3RyZWFtIGluKTsKLQotCXZvaWQgcmVzZXQoSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpOwotCi0Jdm9pZCByZXNldChSZWFkZXIgaW4pOwotCi0Jdm9pZCByZXNldChSZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0lCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlYWIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGp1c3QgbGlrZSBhbiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0gKiBleGNlcHQgcmVzdWx0cyBmcm9tIHBhcnNpbmcgYSAiYmxvY2sgdGFnIiAoc3VjaCBhcyBTQ1JJUFQgb3IgU1RZTEUpLgotICogQmVjYXVzZSB0aGVzZSBhcmUgInZhcmlhYmxlIiBwYXJ0aXRpb24gdHlwZXMsIGl0cyBvZnRlbiBoYW5keSAoZWZmaWNpZW50KQotICogdG8ga2VlcCB0cmFjayBvZiB0aGUgcGFydGl0aW9uIHR5cGUuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJ0aW9uIHR5cGUgZm9yIHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcnRpb24gdHlwZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFydGlvbiB0eXBlLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmUtcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICovCi0Jdm9pZCBzZXRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSlNQQ2FwYWJsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjdmNWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQQ2FwYWJsZVBhcnNlciBleHRlbmRzIFJlZ2lvblBhcnNlciwgQmxvY2tUYWdQYXJzZXIgewotCXZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcik7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBUYWdNYXJrZXJzIGZvciBwcmVmaXhlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIG5lc3RhYmxlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUxpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpOwotCi0Jdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgdGFnTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGU5NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1JlZ2lvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBSZWdpb25QYXJzZXIgewotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKTsKLQotCUxpc3QgZ2V0UmVnaW9ucygpOwotCi0JLyoqCi0JICogVGhlICduZXdJbnN0YW5jZScgbWV0aG9kIGlzIHNpbWlsYXIgdG8gJ2Nsb25lJywgYnV0IGRvZXMgbm90IGluY2x1ZGUKLQkgKiB0aGUgY29weWluZyBvZiBhbnkgY29udGVudC4gRm9yIGEgcHVyZSBSZWdpb25QYXJzZXIgaXRzZWxmLCB0aGVyZSB3b3VsZAotCSAqIGJlIGxpdHRsZSBzdGF0ZSB0byAiY2xvbmUiLCBidXQgZm9yIHNvbWUgc3VidHlwZXMsIHN1Y2ggYXMKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIgYW5kIEpTUENhcGFibGVQYXJzZXIsIHRoZXJlIGNvdWxkIHRoZQotCSAqIG1vcmUgaW50ZXJuYWwgZGF0YSB0byAiY2xvbmUiLCBzdWNoIGFzIHRoZSBpbnRlcm5hbCB0b2tlbml6ZXIgc2hvdWxkIGJlCi0JICogY2xvbmVkIChpbmNsdWRpbmcgYmxvY2sgdGFncywgZXRjKS4KLQkgKi8KLQlSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKTsKLQotCXZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlcik7Ci0KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIG9mZnNldCBmb3IgdXNlIHdpdGggYW55IHBvc2l0aW9uLWRlcGVuZGFudCBwYXJzaW5nIHJ1bGVzCi0JICovCi0Jdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgb2Zmc2V0KTsKLQotCXZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KTsKLQotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgb2Zmc2V0IGZvciB1c2Ugd2l0aCBhbnkgcG9zaXRpb24tZGVwZW5kYW50IHBhcnNpbmcgcnVsZXMKLQkgKi8KLQl2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCwgaW50IG9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljZTMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCi0JLy8gU2VudCB3aGVuIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBmaXJzdCBwYXJzZWQKLQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JLy8gU2VudCB3aGVuIHRoZSBjYWxsaW5nIHBhcnNlcidzIG1vZGVsIHVuZGVyZ29lcyBhIGZ1bGwgcmVzZXQKLQkvLyAgIGFuZCBhbnkgaW5mb3JtYXRpb24gYmFzZWQgdXBvbiB0aGUgb2xkIG1vZGVsIHNob3VsZCBiZQotCS8vICAgY2xlYXJlZAotCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWRiMjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhMjQ5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIgZXh0ZW5kcyBSZWdpb25QYXJzZXIgewotCi0Jdm9pZCBhZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcik7Ci0KLQl2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKTsKLQotCXZvaWQgcmVzZXRIYW5kbGVycygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Q4YzFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgbGlzdGVuaW5nCi0JICogdG8gdGhpcyBwYXJzZXIuCi0JICogCi0JICogQHJldHVybiBMaXN0IC0gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLCB0aGUgbGlzdCBtYXkgbm90IGJlIG51bGwgYW5kIGVhY2gKLQkgKiAgICAgICAgIGVsZW1lbnQgaW4gaXQgbXVzdCBpbXBsZW1lbnQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcgotCSAqLwotCUxpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9UYWdNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9UYWdNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMmU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvVGFnTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogSVNTVUU6IG5lZWQgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGluIGltcHJvdmVkIEFQSS4gCi0gKi8KLQotcHVibGljIGNsYXNzIFRhZ01hcmtlciB7Ci0KLQkvLyBhIElUZXh0UmVnaW9uIChtZWFudCB0byBiZSB1cGRhdGVkIHdpdGggdGhlIG1vZGVsKSBtYXJraW5nIHRoZSBwb3NpdGlvbgotCS8vIHdoZXJlIHRoaXMgdGFnbmFtZSBiZWNvbWVzIGVmZmVjdGl2ZQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBmTWFya2VyID0gbnVsbDsKLQotCS8vIHRoZSB0YWduYW1lCi0JcHJvdGVjdGVkIFN0cmluZyBmVGFnTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFRhZ01hcmtlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhZ05hbWUodGFnbmFtZSk7Ci0JfQotCi0JcHVibGljIFRhZ01hcmtlcihTdHJpbmcgdGFnbmFtZSwgSVRleHRSZWdpb24gbWFya2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhZ05hbWUodGFnbmFtZSk7Ci0JCXNldE1hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXRNYXJrZXIoKSB7Ci0JCXJldHVybiBmTWFya2VyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJcmV0dXJuIGZUYWdOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkgewotCQlyZXR1cm4gZk1hcmtlciA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdNYXJrZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRNYXJrZXIoSVRleHRSZWdpb24gbmV3TWFya2VyKSB7Ci0JCWZNYXJrZXIgPSBuZXdNYXJrZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1RhZ25hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JCWZUYWdOYW1lID0gbmV3VGFnTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0Fic3RyYWN0TW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTUxMmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhIGZpbGUgYW5kIGNyZWF0ZXMgYW4gU3RydWN0dXJlZCBNb2RlbC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxMb2FkZXIgaW1wbGVtZW50cyBJTW9kZWxMb2FkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IGVuY29kaW5nTmFtZVNlYXJjaExpbWl0ID0gMTAwMDsKLQotCXByaXZhdGUgc3RhdGljIGxvbmcgY29tcHV0ZU1lbSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCVN5c3RlbS5nYygpOwotCQkJU3lzdGVtLnJ1bkZpbmFsaXphdGlvbigpOwotCQl9Ci0JCXJldHVybiBSdW50aW1lLmdldFJ1bnRpbWUoKS50b3RhbE1lbW9yeSgpIC0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByb3RlY3RlZCBJRG9jdW1lbnRMb2FkZXIgZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQotCS8qKgotCSAqIEFic3RyYWN0TG9hZGVyIGNvbnN0cnVjdG9yIGFsc28gaW5pdGlhbGl6ZXMgZW5jb2RpbmcgY29udmVydGVyL21hcHBlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBMaXN0IGZhY3RvcnlMaXN0KSB7Ci0JCUFzc2VydC5pc05vdE51bGwobW9kZWwpOwotCQlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSwgIklTdHJ1Y3R1cmVkTW9kZWwgIiArIG1vZGVsLmdldElkKCkgKyAiIGhhcyBhIG51bGwgRmFjdG9yeVJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoZmFjdG9yeUxpc3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3J5TGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBwZXJmb3JtIGFsbCB0aGUgbW9kZWwgaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgYmVmb3JlCi0JICogaXQgY29udGFpbnMgY29udGVudCwgbmFtZWx5LCBpdCBzaG91bGQgY2FsbCBuZXdNb2RlbCwgdGhlCi0JICogY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCksIHRoZW4gYWRkIHRob3NlIGFkYXB0ZXIgZmFjdG9yaWVzIHdoaWNoCi0JICogbXVzdCBiZSBzZXQgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieQotCSAqICJsb2FkIiBtZXRob2QuICh0aGlzIGlzIHRlbnRhdGl2ZSBBUEkpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3TW9kZWwoKTsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJYWRkRmFjdG9yaWVzKG1vZGVsLCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkJLy8KLQkJCWluaXRFbWJlZGRlZFR5cGVQcmUobW9kZWwpOwotCQkJaW5pdEVtYmVkZGVkVHlwZVBvc3QobW9kZWwpOwotCQkJLy8gRm9yIHR5cGVzIHdpdGggcHJvcGFnYXRpbmcgYWRhcHRlcnMsIGl0cyBpbXBvcnRhbnQKLQkJCS8vIHRoYXQgdGhlIHByb3BhZ2F0aW5nIGFkYXB0ZXIgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb250ZW50cwotCQkJLy8gYXJlIHNldC4KLQkJCXByZUxvYWRBZGFwdChtb2RlbCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIpIHsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXdNb2RlbCgpOwotCQltb2RlbC5zZXRCYXNlTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQkJCi0JCS8vIGhhbmRsZXIgbXVzdCBiZSBzZXQgZWFybHksIGluY2FzZSBhIHJlLWluaXQgaXMgCi0JCS8vIHJlcXVpcmVkIGR1cmluZyBjcmVhdGlvbi4KLQkJbW9kZWwuc2V0TW9kZWxIYW5kbGVyKGhhbmRsZXIpOwotCQkKLQkJYWRkRmFjdG9yaWVzKG1vZGVsLCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkvLyBGb3IgdHlwZXMgd2l0aCBwcm9wYWdhdGluZyBhZGFwdGVycywgaXQncyBpbXBvcnRhbnQKLQkJLy8gdGhhdCB0aGUgcHJvcGFnYXRpbmcgYWRhcHRlciBiZSBpbiBwbGFjZSBiZWZvcmUgdGhlIGNvbnRlbnRzCi0JCS8vIGFyZSBzZXQuCi0JCXByZUxvYWRBZGFwdChtb2RlbCk7Ci0JCWluaXRFbWJlZGRlZFR5cGVQcmUobW9kZWwpOwotCi0JCW1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLwotCQlpbml0RW1iZWRkZWRUeXBlUG9zdChtb2RlbCk7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNsb25pbmcgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBuZXdNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IG9sZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotCQluZXdNb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gTk9URTogd2UgRE8gTk9UIHNpbXBseSBhZGQgdGhlIHN0YW5kYXJkIG9uZXMgdG8gdGhlIG5ldyBtb2RlbAotCQkvLyBhZGRGYWN0b3JpZXMobmV3TW9kZWwsIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCS8vIE5vdywgd2UgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkIEZhY3RvcmllcyBmcm9tIHRoZSBvbGRNb2RlbCdzCi0JCS8vIHJlZ2lzdHJ5IHRvIHRoZSBuZXcgbW9kZWwncyByZWdpc3RyeSAuLiBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5Ci0JCS8vIGV4aXN0IHRoZXJlLgotCQlkdXBsaWNhdGVGYWN0b3J5UmVnaXN0cnkobmV3TW9kZWwsIG9sZE1vZGVsKTsKLQkJaWYgKG5ld01vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIG5ld01vZGVsKS5zZXRDb250ZW50VHlwZUlkZW50aWZpZXIob2xkTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCS8vIGFkZEZhY3RvcmllcyhuZXdNb2RlbCwgb2xkTW9kZWwpOwotCQlpbml0RW1iZWRkZWRUeXBlKG9sZE1vZGVsLCBuZXdNb2RlbCk7Ci0JCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdHMgaW1wb3J0YW50Ci0JCS8vIHRoYXQgdGhlIHByb3BhZ2F0aW5nIGFkYXB0ZXIgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb250ZW50cwotCQkvLyBhcmUgc2V0LgotCQlwcmVMb2FkQWRhcHQobmV3TW9kZWwpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGR1cGxpY2F0ZUZhY3RvcnlSZWdpc3RyeShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB7Ci0JCUxpc3Qgb2xkQWRhcHRlckZhY3RvcmllcyA9IG9sZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOwotCQlMaXN0IG5ld0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIG9sZExpc3RJdGVyYXRvciA9IG9sZEFkYXB0ZXJGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG9sZExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlOb2RlQWRhcHRlckZhY3Rvcnkgb2xkQWRhcHRlckZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgb2xkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIG5vdyAiY2xvbmUiIHRoZSBhZGFwdGVyZmFjdG9yeQotCQkJbmV3QWRhcHRlckZhY3Rvcmllcy5hZGQob2xkQWRhcHRlckZhY3RvcnkuY29weSgpKTsKLQkJfQotCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSAiY2xvbmVkIiBsaXN0LCBhZGQgdG8gbmV3IG1vZGVsCi0JCWFkZEZhY3RvcmllcyhuZXdNb2RlbCwgbmV3QWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJLy8gYWJzdHJhY3QgbWV0aG9kIHJldHVybnMgbm9uZQotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdEVtYmVkZGVkVHlwZS4gTm90aGluZyB0byBkbyBoZXJlIGluIHN1cGVyIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGVQcmUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCX0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUG9zdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuIE5vdGhpbmcgdG8gZG8gaGVyZSBpbiBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTW9kZWwKLQkgKiBAcGFyYW0gbmV3TW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQllbHNlCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlKTsKLQotCQkvLyBUT0RPOiBuZWVkIHRvIHN0cmFpZ2h0ZW4gb3V0IElFbmNvZGVkRG9jdW1lbnQgbWVzcwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXRyYW5zZm9ybUluc3RhbmNlKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCAoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJZWxzZQotCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0KLQkJLy8gb3JpZ2luYWwgaGFjawotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vICgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5maXJlTmV3RG9jdW1lbnQodGhpcyk7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQkvLyB0ZWNobmljcSBvZiBmdXR1cmUKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGUgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFzc3VtZSdzIG1vZGVsIGhhcyBiZWVuIGluaXRpYWxpemVkIGFscmVhZHkgd2l0aCBiYXNlIGxvY2F0aW9uCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgaW5wdXRTdHJlYW0sIGVuY29kaW5nUnVsZSk7Ci0JCQkvLyBUT0RPOiBtb2RlbCdzIG5vdCBkZXNpZ25lZCBmb3IgdGhpcyEKLQkJCS8vIHdlIHdhbnQgdG8gbW92ZSB0byB0aGlzICJzZXQiIG1ldGhvZCwgYnV0IHRoZSAnZmlyZScgd2FzIG5lZWRlZAotCQkJLy8gYXMKLQkJCS8vIGEgd29yayBhcm91bmQgZm9yIHN0cnVjdXRyZWRNb2RlbCBub3QgaGFuZGxpbmcgJ3NldCcgcmlnaHQsIGJ1dAotCQkJLy8gdGhhdCAnZmlyZU5ld0RvY3VtZW50JyBtZXRob2Qgd2FzIGNhdXNpbmcgdW5iYWxhbmNlCi0JCQkvLyAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIgotCQkJLy8gZXZlbnRzLgotCQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCS8vICgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCS8vIHN0cnVjdHVyZWREb2N1bWVudCkuZmlyZU5ld0RvY3VtZW50KHRoaXMpOwotCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0KLQkJfQotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgLS0gdXNlIEVuY29kaW5nUnVsZSBmb3JtCi0JICovCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGUgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQkvLyBURU1QIHdvcmsgYXJvdW5kIHRvIG1haW50YWluIHByZXZpb3VzIGZ1bmN0aW9uLAotCQkvLyB1bnRpbCBldmVyeW9uZSBjYW4gY2hhbmdlIHRvIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUCi0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCAmJiBlbmNvZGluZ05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIHJlZGlyZWN0IHRvIG5ldyBtZXRob2QKLQkJCWxvYWQoaW5wdXRTdHJlYW0sIG1vZGVsLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb2FkKGlucHV0U3RyZWFtLCBtb2RlbCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcganVuaywgU3RyaW5nIGR1bW15KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkJbG9uZyBtZW1vcnlVc2VkID0gMDsKLQkJaWYgKERFQlVHKSB7Ci0JCQltZW1vcnlVc2VkID0gY29tcHV0ZU1lbSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtZWFzdXJpbmcgaGVhcCBtZW1vcnkgZm9yICIgKyBmaWxlbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGVhcCBtZW1vcnkgdXNlZCBiZWZvcmUgbG9hZDogIiArCi0JCQkvLyBtZW1vcnlVc2VkKTsKLQkJfQotCi0JCS8vIGR1cmluZyBhbiBpbml0aWFsIGxvYWQsIHdlIGV4cGVjdCB0aGUgb2xkZG9jdW1lbnQgdG8gYmUgZW1wdHkKLQkJLy8gZHVyaW5nIHJlLWxvYWQsIGhvd2V2ZXIsIGl0IHdvdWxkIGJlIGZ1bGwuCi0JCUlFbmNvZGVkRG9jdW1lbnQgbmV3c3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJSUVuY29kZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkvLyBnZXQgbmV3IGRvY3VtZW50Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQluZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3c3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCWxvbmcgbWVtb3J5QXRFbmQgPSBjb21wdXRlTWVtKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXAgbWVtb3J5IHVzZWQgYWZ0ZXIgbG9hZGluZyBuZXcKLQkJCS8vIGRvY3VtZW50OiAiICsgbWVtb3J5QXRFbmQpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgaGVhcCBtZW1vcnkgaW1wbGllZCB1c2VkIGJ5IGRvY3VtZW50OiAiICsgKG1lbW9yeUF0RW5kIC0gbWVtb3J5VXNlZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCS8vIFRPRE86IG5lZWQgdG8gc3RyYWlnaHRlbiBvdXQgSUVuY29kZWREb2N1bWVudCBtZXNzCi0JCWlmIChuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQl0cmFuc2Zvcm1JbnN0YW5jZSgoSVN0cnVjdHVyZWREb2N1bWVudCkgb2xkU3RydWN0dXJlZERvY3VtZW50LCAoSVN0cnVjdHVyZWREb2N1bWVudCkgbmV3c3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIGRvbid0IHJlYWxseSBleHBlY3QgdGhpcyBjYXNlLCBqdXN0IGluY2x1ZGVkIGZvciBzYWZldHkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5zZXQobmV3c3RydWN0dXJlZERvY3VtZW50LmdldCgpKTsKLQkJfQotCQkvLyBvcmlnaW5hbCBoYWNrCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gKChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmZpcmVOZXdEb2N1bWVudCh0aGlzKTsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCS8vIHRlY2huaWNxIG9mIGZ1dHVyZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlpZiAoREVCVUcpIHsKLQkJCWxvbmcgbWVtb3J5QXRFbmQgPSBjb21wdXRlTWVtKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXAgbWVtb3J5IHVzZWQgYWZ0ZXIgc2V0dGluZyB0byBtb2RlbDogIgotCQkJLy8gKyBtZW1vcnlBdEVuZCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBoZWFwIG1lbW9yeSBpbXBsaWVkIHVzZWQgYnkgZG9jdW1lbnQgYW5kIG1vZGVsOiAiICsgKG1lbW9yeUF0RW5kIC0gbWVtb3J5VXNlZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlcXVpcmVkIGJ5IGludGVyZmFjZSwgYmVpbmcgZGVjbGFyZWQgaGVyZSBhYnN0cmFjdGx5IGp1c3QgYXMgYW5vdGhlcgotCSAqIHJlbWluZGVyLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQkvKioKLQkgKiBUaGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZSBpbiBhYnN0cmFjdCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFkYXB0ZXJzLgotCSAqIFN1YmNsYXNzZXMgY2FuIGFuZCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHByb3ZpZGUgcHJvcGVyCi0JICogaW50aWFsaXphdGlvbiAoRm9yIGV4YW1wbGUsIHRvIGdldCBET00gZG9jdW1lbnQgYW5kICdnZXRBZGFwdGVyJyBvbiBpdCwKLQkgKiBzbyB0aGF0IHRoZSBmaXJzdCBub2RlL25vdGlmaWVyIGhhcyB0aGUgYWRhcHRlciBvbiBpdC4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQotCX0KLQotCS8qKgotCSAqIE5vcm1hbGx5LCBoZXJlIGluIHRoZSBhYnN0YWN0IGNsYXNzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8sIGJ1dCB3ZSB3aWxsCi0JICogcmVzZXQgdGV4dCwgc2luY2UgdGhpcyBNSUdIVCBlbmQgdXAgYmVpbmcgY2FsbGVkIHRvIHJlY292ZXIgZnJvbSBlcnJvcgotCSAqIGNvbmRpdGlvbnMgKGUuZy4gSVN0cnVjdHVyZWREb2N1bWVudCBleGNlcHRpb25zKSBBbmQsIGNhbiBiZSBjYWxsZWQgYnkKLQkgKiBzdWJjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCS8vIE5vdGU6IHRoZSAibWluaW11bWl6YXRpb24iIHJvdXRpbmVzCi0JCS8vIG9mICdyZXBsYWNlVGV4dCcgYWxsb3cgbWFueSBvbGQgbm9kZXMgdG8gcGFzcyB0aHJvdWdoLCB3aGVuCi0JCS8vIHJlYWxseSBpdHMgYXNzdW1lZCB0aGV5IGFyZSBjcmVhdGVkIGFuZXcuCi0JCS8vIHNvIHdlIG5lZWQgdG8gdXNlICdzZXRUZXh0JyAoSSB0aGluayAic2V0VGV4dCcgZW5kcyB1cAotCQkvLyB0aHJvd2luZyBhICduZXdNb2RlbCcgZXZlbnQgdGhvdWdoLCB0aGF0IG1heSBoYXZlIHNvbWUKLQkJLy8gaW1wbGljYXRpb25zLgotCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRUZXh0KHRoaXMsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZXMgdGhlIG1vZGVscwotCSAqIC4uLiBieSBhIGNhbGwgdG8gc2V0VGV4dCBvbiB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1ldGhvZCBpcwotCSAqIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlIHNoYXJpbmcgYSBtb2RlbCBhbmQgdGhlbiBjaGFuZ2VzCi0JICogY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvciBhbmQgc2V2ZXJhbCAiZGlzcGxheXMiIGFyZQotCSAqIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcywgdGhlbgotCSAqIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5IHNob3VsZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsCi0JICogdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQl0cnkgewotCQkJLy8gdGVtcCBzb2x1dGlvbiAuLi4gd2Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gYmV0dGVyIChtb3JlCi0JCQkvLyBlZmZpY2llbnQpIGluIGZ1dHVyZS4KLQkJCS8vIEFkYXB0ZXJzIHdpbGwgKHByb2JhYmx5KSBuZWVkIHRvIGJlIHNlbnNpdGl2ZSB0byB0aGUgZmFjdCB0aGF0Ci0JCQkvLyB0aGUgZG9jdW1lbnQgaW5zdGFuY2UgY2hhbmdlZAotCQkJLy8gKGJ5IGJlaW5nIGxpZmUgY3ljbGUgbGlzdGVuZXJzKQotCQkJbG9hZChpbnB1dFN0cmVhbSwgc3RydWN0dXJlZE1vZGVsLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0KLQkJCS8vIC8vIE5vdGU6IHdlIGFwcGFyZW50bHkgcmVhZCB0aGUgZGF0YSAoYW5kIGVuY29kaW5nKSBjb3JyZWN0bHkKLQkJCS8vIC8vIGJlZm9yZSwgd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBmb2xsb3dlZCB0aGUgc2FtZSBydWxlCi0JCQkvLyBhcwotCQkJLy8gLy8gYmVmb3JlLgotCQkJLy8gRW5jb2RpbmdNZW1lbnRvIHByZXZpb3VzTWVtZW50byA9Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQkvLyBFbmNvZGluZ1J1bGUgcHJldmlvdXNSdWxlID0gcHJldmlvdXNNZW1lbnRvLmdldEVuY29kaW5nUnVsZSgpOwotCQkJLy8gLy9JRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGVGb3Ioc3RydWN0dXJlZE1vZGVsKTsKLQkJCS8vIC8vIE5vdGU6IHRoZXJlJ3Mgb3Bwb3J0dW5pdHkgaGVyZSBmb3Igc29tZSBvZGQgYmVoYXZpb3IsIGlmIHRoZQotCQkJLy8gLy8gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIGZyb20gdGhlIGZpcnN0IGxvYWQgdG8gdGhlIHJlbG9hZC4KLQkJCS8vIEJ1dCwKLQkJCS8vIC8vIGhvcGVmdWxseSwKLQkJCS8vIC8vIHdpbGwgcmVzdWx0IGluIHRoZSBpbnRlbmRlZCBiZWhhdmlvci4KLQkJCS8vIFJlYWRlciBhbGxUZXh0UmVhZGVyID0KLQkJCS8vIGdldERvY3VtZW50TG9hZGVyKCkucmVhZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBwcmV2aW91c1J1bGUpOwotCQkJLy8KLQkJCS8vIC8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJCS8vIGdldERvY3VtZW50TG9hZGVyKCkucmVsb2FkKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwKLQkJCS8vIGFsbFRleHRSZWFkZXIpOwotCQkJLy8gLy8gYW5kIG5vdyAicmVzZXQiIGVuY29kaW5nIG1lbWVudG8gdG8ga2VlcCBpdCBjdXJyZW50IHdpdGggdGhlCi0JCQkvLyAvLyBvbmUKLQkJCS8vIC8vIHRoYXQgd2FzIGp1c3QgZGV0ZXJtaW5lZC4KLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRFbmNvZGluZ01lbWVudG8oZ2V0RG9jdW1lbnRMb2FkZXIoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NZ3IgPQotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQkvLyBpZiAodW5kb01nciAhPSBudWxsKSB7Ci0JCQkvLyB1bmRvTWdyLnJlc2V0KCk7Ci0JCQkvLyB9Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gcmVhc29uIHRoZSBlbmNvZGluZwotCQkJLy8gY291bGQgbm90IGJlIHVzZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gKGNvbW1vbikgcmVhc29uIGl0Ci0JCQkvLyBjb3VsZG4ndCBiZSBsb2FkZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgd29yayBpcyBkb25lIGJldHRlciBlbHNld2hlcmUsIGJ1dCBkb25lIGhlcmUgZm9yIHRoaXMgdmVyc2lvbiB0bwotCSAqIHJlZHVjZSBjaGFuZ2VzLiBlc3BlY2lhbGx5IHNpbmNlIHRoZSBuZWVkIGZvciBpdCBzaG91bGQgZ28gYXdheSBvbmNlIHdlCi0JICogbm8gbG9uZ2VyIG5lZWQgdG8gcmUtdXNlIG9sZCBkb2N1bWVudCBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmb3JtSW5zdGFuY2UoSVN0cnVjdHVyZWREb2N1bWVudCBvbGRJbnN0YW5jZSwgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSkgewotCQkvKioKLQkJICogaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MjAKLQkJICogCi0JCSAqIEpTUCB0YWdsaWIgc3VwcG9ydCBicm9rZW4sIGNvcnJlY3QgYnkgZHVwbGljYXRpbmcgZXh0ZW5kZWQgc2V0dXAKLQkJICogaW5mb3JtYXRpb24gKEJsb2NrVGFnUGFyc2VyIGV4dGVuc2lvbiwKLQkJICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuc2lvbnMpCi0JCSAqLwotCQlSZWdpb25QYXJzZXIgb2xkUGFyc2VyID0gb2xkSW5zdGFuY2UuZ2V0UGFyc2VyKCk7Ci0JCVJlZ2lvblBhcnNlciBuZXdQYXJzZXIgPSBuZXdJbnN0YW5jZS5nZXRQYXJzZXIoKS5uZXdJbnN0YW5jZSgpOwotCQkvLyBSZWdpc3RlciBhbGwgb2YgdGhlIG9sZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyBvbiB0aGUgbmV3Ci0JCS8vIHBhcnNlcgotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgewotCQkJTGlzdCBvbGRIYW5kbGVycyA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSBvbGRQYXJzZXIpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBvbGRIYW5kbGVycy5nZXQoaSkpOwotCQkJCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgewotCQkJCQkvKioKLQkJCQkJICogU2tpcCB0aGUgdHJhbnNmZXJyaW5nIGhlcmUsIHRoZSBoYW5kbGVyIHdpbGwgZG8gdGhpcwotCQkJCQkgKiBhZnRlciBldmVyeXRoaW5nIGVsc2UgYnV0IHRoZSBzb3VyY2UgaXMgdHJhbnNmZXJyZWQuCi0JCQkJCSAqLwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIG9sZFBhcnNlcikucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihoYW5kbGVyKTsKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIG5ld1BhcnNlcikuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihoYW5kbGVyKTsKLQkJCQkJaGFuZGxlci5yZXNldE5vZGVzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIEFkZCBhbnkgZ2xvYmFsIEJsb2NrTWFya2VycyB0byB0aGUgbmV3IHBhcnNlcgotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgQmxvY2tUYWdQYXJzZXIgJiYgbmV3UGFyc2VyIGluc3RhbmNlb2YgQmxvY2tUYWdQYXJzZXIpIHsKLQkJCUxpc3Qgb2xkQmxvY2tNYXJrZXJzID0gKChCbG9ja1RhZ1BhcnNlcikgb2xkUGFyc2VyKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoKEJsb2NrTWFya2VyKSBvbGRCbG9ja01hcmtlcnMuZ2V0KGkpKTsKLQkJCQlpZiAoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkgewotCQkJCQkoKEJsb2NrVGFnUGFyc2VyKSBuZXdQYXJzZXIpLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBvbGRJbnN0YW5jZSkuc2V0UGFyc2VyKG5ld1BhcnNlcik7Ci0KLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgb2xkSW5zdGFuY2UpLnNldFJlUGFyc2VyKG5ld0luc3RhbmNlLmdldFJlUGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0KLQkJaWYgKG5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIHsKLQkJCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBudWxsOwotCQkJaWYgKG9sZEluc3RhbmNlIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyAmJiBuZXdJbnN0YW5jZSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCQlwYXJ0aXRpb25lciA9ICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgKChJRG9jdW1lbnRFeHRlbnNpb24zKSBuZXdJbnN0YW5jZSkuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKSk7Ci0JCQkJaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCQkJcGFydGl0aW9uZXIgPSAoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgcGFydGl0aW9uZXIubmV3SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQkJKChJRG9jdW1lbnRFeHRlbnNpb24zKSBvbGRJbnN0YW5jZSkuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBwYXJ0aXRpb25lcik7Ci0JCQl9Ci0JCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJCXBhcnRpdGlvbmVyID0gKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgbmV3SW5zdGFuY2UuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKS5uZXdJbnN0YW5jZSgpOwotCQkJCW9sZEluc3RhbmNlLnNldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uZXIpOwotCQkJfQotCQkJaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCQlwYXJ0aXRpb25lci5jb25uZWN0KG9sZEluc3RhbmNlKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBleGlzdGluZ0xpbmVEZWxpbWl0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJZXhpc3RpbmdMaW5lRGVsaW1pdGVyID0gbmV3SW5zdGFuY2UuZ2V0TGluZURlbGltaXRlcigwKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gaWYgZW1wdHkgZmlsZSwgYXNzdW1lIHBsYXRmb3JtIGRlZmF1bHQKLQkJCS8vIFRPRE86IHNob3VsZCBiZSB1c2luZyB1c2VyIHNldCBwcmVmZXJlbmNlLCBwZXIgY29udGVudCB0eXBlPwotCQkJZXhpc3RpbmdMaW5lRGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlvbGRJbnN0YW5jZS5zZXRMaW5lRGVsaW1pdGVyKGV4aXN0aW5nTGluZURlbGltaXRlcik7IC8vJE5PTi1OTFMtMSQpOwotCQlpZiAobmV3SW5zdGFuY2UuZ2V0RW5jb2RpbmdNZW1lbnRvKCkgIT0gbnVsbCkgewotCQkJb2xkSW5zdGFuY2Uuc2V0RW5jb2RpbmdNZW1lbnRvKChFbmNvZGluZ01lbWVudG8pIG5ld0luc3RhbmNlLmdldEVuY29kaW5nTWVtZW50bygpLmNsb25lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTIwCi0JCSAqIAotCQkgKiBKU1AgdGFnbGliIHN1cHBvcnQgYnJva2VuLCBjb3JyZWN0IGJ5IGR1cGxpY2F0aW5nIGV4dGVuZGVkIHNldHVwCi0JCSAqIGluZm9ybWF0aW9uIChCbG9ja1RhZ1BhcnNlciBleHRlbnNpb24sCi0JCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBleHRlbnNpb25zKQotCQkgKi8KLQkJaWYgKG9sZFBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbiAmJiBuZXdQYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24pIHsKLQkJCUxpc3Qgb2xkSGFuZGxlcnMgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgb2xkUGFyc2VyKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRIYW5kbGVycy5zaXplKCk7IGkrKykgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlciA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgb2xkSGFuZGxlcnMuZ2V0KGkpKTsKLQkJCQlpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24pIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiBoYW5kbGVyRXh0ZW5zaW9uID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24pIGhhbmRsZXI7Ci0JCQkJCWhhbmRsZXJFeHRlbnNpb24uc2V0U3RydWN0dXJlZERvY3VtZW50KG9sZEluc3RhbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGhvbGRTdHJpbmcgPSBuZXdJbnN0YW5jZS5nZXQoKTsKLQkJbmV3SW5zdGFuY2UgPSBudWxsOwotCQlvbGRJbnN0YW5jZS5zZXQoaG9sZFN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuRG9jdW1lbnRDaGFuZ2VkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX01BTkFHRVJfTlVMTCA9ICJXYXJuaW5nOiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDo6Y2xvc2U6ICBtb2RlbCBtYW5hZ2VyIHdhcyBudWxsIGR1cmluZyBhIGNsb3NlIG9mIGEgbW9kZWwgKHdoaWNoIHNob3VsZCBiZSBpbXBvc3NpYmxlKSI7IC8vJE5PTi1OTFMtMSQKLQotCWNsYXNzIERpcnR5U3RhdGVXYXRjaGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCS8vIEkgZG9uJ3QgdGhpbmsgaXRzIHNhZmUgdG8gYXNzdW1lIGEgbmV3IG1vZGVsCi0JCQkvLyBpcyBhbHdheXMgImZyZXNoIiwgc28gd2UnbGwgbGVhdmUgZGlydHkgc3RhdGUKLQkJCS8vIHVuY2hhbmdlZDsKLQkJCS8vIGJ1dCB3ZSdsbCB0ZWxsIGV2ZXJ5b25lIGFib3V0IGl0LgotCQkJc2V0RGlydHlTdGF0ZShmRGlydHlTdGF0ZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCS8vIGRvbid0IGNoYW5nZSBkaXJ0eSBzdGF0ZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJc2V0RGlydHlTdGF0ZSh0cnVlKTsKLQkJCS8vIG5vIG5lZWQgdG8gbGlzdGVuIGFueSBtb3JlCi0JCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBJZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBhcmUgYWJvdXQgdG8KLQkJCS8vIGNoYW5nZSBiYXNlZCBvbiBvdXIgdW5kZXJseWluZyBkb2N1bWVudCBjaGFuZ2luZy4KLQkJCS8vIElmIHdlIGRpZCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgd2UsIG9yIGNsaWVudCwgc2hvdWxkIGhhdmUKLQkJCS8vIGFscmVhZHkgY2FsbGVkIGFib3V0VG9DaGFuZ2VNb2RlbC4KLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQlhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNuZXdNb2RlbChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbm9DaGFuZ2Uob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vZGVzUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeTsKLQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uOwotCWJvb2xlYW4gZkRpcnR5U3RhdGU7Ci0JRGlydHlTdGF0ZVdhdGNoZXIgZkRpcnR5U3RhdGVXYXRjaGVyOwotCURvY3VtZW50VG9Nb2RlbE5vdGlmaWVyIGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcjsKLQlwcml2YXRlIFN0cmluZyBmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZklkOwotCi0JcHJpdmF0ZSBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyIGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZkxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByb3RlY3RlZCBJTG9jayBmTG9ja09iamVjdDsKLQkvLyBwcml2YXRlIFN0cmluZyBmTGluZURlbGltaXRlcjsKLQkvLyBwcml2YXRlIE9iamVjdCBmVHlwZTsKLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZk1vZGVsSGFuZGxlcjsKLQkvLyBpc3N1ZTogd2Ugc2hvdWxkIG5vdCAiaG9sZCBvbiIgdG8gbW9kZWwgbWFuYWdlciwgY2FuIAotCS8vIGVhc2lseSBnZXQgd2l0aCBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCS8vIGJ1dCB3aWxsIG5lZWQgdG8gYWRkIG1vcmUgbnVsbCBjaGVja3MuCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGZNb2RlbE1hbmFnZXI7Ci0JcHJpdmF0ZSBpbnQgZk1vZGVsU3RhdGVDaGFuZ2luZzsKLQlwcml2YXRlIE9iamVjdFtdIGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCXByaXZhdGUgYm9vbGVhbiBmTmV3U3RhdGUgPSBmYWxzZTsKLQlwcml2YXRlIFVSSVJlc29sdmVyIGZSZXNvbHZlcjsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCS8qKgotCSAqIFRoZSB0aW1lIHN0YW1wIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlJ3MgbW9kaWZpY2F0aW9uIGRhdGUsIGF0IHRoZQotCSAqIHRpbWUgdGhpcyBtb2RlbCB3YXMgY3JlYXRlZCwgb3IgdGhlIGxhc3QgdGltZSBpdCB3YXMgc2F2ZWQuIE5vdGU6IGZvcgotCSAqIHRoaXMgdmVyc2lvbiwgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc2V0IGF1dG9tYXRpY2FsbHksIGJlIG5lZWRzIHRvIGJlCi0JICogbWFuYWdlZCBieSBjbGllbnQuIFRoZSBGaWxlTW9kZWxQcm92aWRlciBkb2VzIHRoaXMgZm9yIG1vc3QgY2FzZXMsIGJ1dAotCSAqIGlmIGNsaWVudCBkbyBub3QgdXNlIEZpbGVNb2RlbFByb3ZpZGVyLCB0aGV5IG11c3Qgc2V0IHRoaXMgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgbG9uZyBmU3luY2hyb25pemF0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQlwcml2YXRlIGJvb2xlYW4gcmVpbml0aWFsaXphdGlvbk5lZWRlZDsKLQlwcml2YXRlIE9iamVjdCByZWluaXRpYWxpemVTdGF0ZURhdGE7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCgpIHsKLQotCQlzdXBlcigpOwotCQlmRGlydHlTdGF0ZVdhdGNoZXIgPSBuZXcgRGlydHlTdGF0ZVdhdGNoZXIoKTsKLQkJZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyID0gbmV3IERvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IGZvciBnZXR0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBtYW5hZ2VyIG9mIHRoZQotCSAqIHJpZ2h0IEltcGwgdHlwZSwgdG8gYmUgdXNlZCAiaW50ZXJuYWxseSIgZm9yIG1ha2luZyBwcm90ZWN0ZWQgY2FsbHMKLQkgKiBkaXJlY3RseSB0byB0aGUgaW1wbCBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIE1vZGVsTWFuYWdlckltcGwgX2dldE1vZGVsTWFuYWdlcigpIHsKLQkJLy8gVE9ET19mdXR1cmU6IHJlZGVzaWduIHNvIHdlIGRvbid0IG5lZWQgdGhpcyAnSW1wbCcgdmVyc2lvbgotCQlpZiAoZk1vZGVsTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmTW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCi0JCXJldHVybiAoTW9kZWxNYW5hZ2VySW1wbCkgZk1vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uIE5vdGUgdGhhdCBpbgotCSAqIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdGVuZXJzIGlzIHNlbnQgb25seQotCSAqIG9uY2UuIE5vdGUgdGhhdCB0aGUgY2xpZW50IHdobyBpcyBtYWtpbmcgdGhlc2UgY2hhbmdlcyBoYXMgdGhlCi0JICogcmVzcG9uc2liaWxpdHkgdG8gcmVzdG9yZSB0aGUgbW9kZWxzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUKLQkgKiBjaGFuZ2VzLiBTZWUgZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLiBUaGUgbWV0aG9kCi0JICogaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbAotCSAqIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0NoYW5nZU1vZGVsKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJaW50ZXJuYWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKSB7Ci0KLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQkJCWlmIChmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlcigpOwotCQkJfQotCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKCFVdGlsaXRpZXMuY29udGFpbnMoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmTW9kZWxTdGF0ZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZNb2RlbFN0YXRlTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmTW9kZWxTdGF0ZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9jayB0byBsb2NrIHRoZSBzbWFsbCBiaXRzIG9mIGRhdGEgYW5kIG9wZXJhdGlvbnMgaW4gdGhlIG1vZGVscwotCSAqIHRoZW1zZWxmZXMuIHRoaXMgbG9jayBpcyAic2hhcmVkIiB3aXRoIGRvY3VtZW50LCBzbywgZXZlbnR1YWxseSwKLQkgKiBjaGFuZ2VzIGNhbiBiZSBtYWRlIHNhZmVmbHkgZnJvbSBlaXRoZXIgc2lkZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBiZWdpbkxvY2soKSB7Ci0KLQkJLy8gaWYgd2UgZ2V0IGEgZGlmZmVyZW50IGxvY2sgb2JqZWN0Ci0JCS8vIHRoYW4gd2UgaGFkIGJlZm9yZSwgYmVzdXJlIHRvIHJlbGVhc2UKLQkJLy8gb2xkIG9uZSBmaXJzdCBiZWZvcmUgbG9zaW5nIGl0LgotCQkvLyBJU1NVRTogdGhpcyBzbWVsbHMgbGlrZSBhbiBlcnJvciBjb25kaXRpb24sCi0JCS8vIHdoZW4gd291bGQgdGhpcyBoYXBwZW4/IGJldHRlciB0byBjaGVjayBpbiBzZXQgZG9jdW1lbnQ/Ci0JCUlMb2NrIGRvY3VtZW50TG9jayA9IGdldExvY2tPYmplY3RGcm9tRG9jdW1lbnQoKTsKLQotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCAmJiBmTG9ja09iamVjdCAhPSBkb2N1bWVudExvY2spIHsKLQkJCWZMb2NrT2JqZWN0LnJlbGVhc2UoKTsKLQkJCWlmIChMb2dnZXIuREVCVUcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWwgbG9jayByZWxlYXNlZCBlYXJseSIgKyBmTG9ja09iamVjdCArICIgYXBwYXJlbnRseSBkb2N1bWVudCBzd2l0Y2hlZD8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJfQotCQlmTG9ja09iamVjdCA9IGRvY3VtZW50TG9jazsKLQkJaWYgKGZMb2NrT2JqZWN0ICE9IG51bGwpIHsKLQkJCWZMb2NrT2JqZWN0LmFjcXVpcmUoKTsKLQkJCWlmIChMb2dnZXIuREVCVUcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWwgbG9jayBhY3F1aXJlZDogIiArIGZMb2NrT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBudWxsLCBudWxsLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbiwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgKm11c3QqIGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwKLQkgKiAuLi4gb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlCi0JICogY2hhbmdlZCBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEKLQkgKiBmaW5hbGx5IGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbAotCSAqIHdpdGhvdXQgY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkCi0JICogY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICovCi0JcHVibGljIHZvaWQgY2hhbmdlZE1vZGVsKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJaW50ZXJuYWxNb2RlbENoYW5nZWQoKTsKLQkJLy8gYWxzbyBub3RlIQotCQkvLyBpZiB3ZSd2ZSBiZWVuICJjaGFuZ2VkIiBieSBhIGNsaWVudCwgd2UgbWlnaHQgc3RpbGwgbmVlZAotCQkvLyB0byBiZSByZS1pbml0aWFsaXplZCwgc28gd2UnbGwgY2hlY2sgYW5kIGhhbmRsZSB0aGF0IGhlcmUuCi0JCS8vIE5vdGUgb25seSBkb2VzIHRoaXMgcHJvdmlkZSBhIHNvbHV0aW9uIHRvIHNvbWUgIm1pc3NlZCIKLQkJLy8gcmUtaW5pdHMsIGluIHByb3ZpZGVzIGEgYnVpbHQgaW4gd2F5IGZvciBjbGllbnRzIHRvCi0JCS8vICJmb3JjZSIgdGhlIG1vZGVsIHRvIGhhbmRsZSBpdHNlbGYsIGJ5IGJyYWNrZXRpbmcgYW55Ci0JCS8vIGNoYW5nZXMgd2l0aCBhYm91dFRvQ2hhbmdlIGFuZCBjaGFuZ2VkLCB0aGUgbW9kZWwgaXRzZWxmCi0JCS8vIHdpbGwgY2hlY2suIEJ1dCBvbmx5IGNhbGwgcmUtaW5pdCBpZiBhbGwgb3RoZXIgcGVuZGluZwotCQkvLyBtb2RlbENoYW5nZWQgc3RhdGVzIGhhdmUgYmVlbiBoYW5kbGVkLgotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA9PSAwICYmIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQlyZWluaXQoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQmFzZWQgb24gc2ltaWxhciBtZXRob2QgaW4gRmlsZURvY3VtZW50UHJvdmlkZXIuIEl0IHdpbGwgcHJvdmlkZSB3aGF0Ci0JICogdGhlIG1vZGlmaWNhdGlvblN0YW1wIHdvdWxkIGJlIGlmIHJlc2V0U3luY2hyb256YXRpb25TdGFtcChyZXNvdXJjZSkKLQkgKiB3ZXJlIHVzZWQsIGFsdGhvdWdoIGZvciB0aGlzICdjb21wdXRlJyBBUEksIG5vIGNoYW5nZXMgdG8gdGhlIGluc3RhbmNlCi0JICogYXJlIG1hZGUuCi0JICovCi0JcHVibGljIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0KLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcCA9IHJlc291cmNlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJLy8gTm90ZTogY2hlY2tpbmcgZXhpc3RlbmNlIG9mIGZpbGUgaXMgYSBsaXR0bGUgZGlmZmVyZW50IHRoYW4KLQkJLy8gaW1wbCBpbgotCQkvLyB0aGUgRmlsZURvY3VtZW50UHJvdmlkZXIuIFNlZSBkZWZlY3QgbnVtYmVyIDIyMzc5MC4KLQkJRmlsZSBmaWxlID0gcGF0aC50b0ZpbGUoKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBmaWxlLmxhc3RNb2RpZmllZCgpOwotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCi0KLQkvKioKLQkgKiBQcm92aWRlcyBhIGNvcHkgb2YgdGhlIG1vZGVsLCBidXQgYSBuZXcgSUQgbXVzdCBiZSBwcm92aWRlZC4gVGhlCi0JICogcHJpbmNpcGxlIG9mIHRoaXMgY29weSBpcyBub3QgdG8gY29weSBmaWVsZHMsIGV0Yy4sIGFzIGlzIHR5cGljYWxseQotCSAqIGRvbmUgaW4gYSBjbG9uZSBtZXRob2QsIGJ1dCB0byByZXR1cm4gYSBtb2RlbCB3aXRoIHRoZSBzYW1lIGNvbnRlbnQgaW4KLQkgKiB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBOb3RlOiBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0bwotCSAqIHNldEJhc2VMb2NhdGlvbiwgbGlzdG5lcnMsIGV0Yy4sIGFzIGFwcHJvcHJpYXRlLiBUeXBlIGFuZCBFbmNvZGluZyBhcmUKLQkgKiB0aGUgb25seSBmaWVsZHMgc2V0IGJ5IHRoaXMgbWV0aG9kLiBJZiB0aGUgbmV3SWQgcHJvdmlkZWQgYWxyZWFkeSBleGlzdAotCSAqIGluIHRoZSBtb2RlbCBtYW5hZ2VyLCBhIFJlc291cmNlSW5Vc2UgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjb3B5KFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIHRoaXMgZmlyc3Qgb25lIHNob3VsZCBmYWlsLCBpZiBub3QsIGl0cyB0cmVhdGVkIGFzIGFuIGVycm9yCi0JCS8vIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gdXNlIGFuIGV4aXN0aW5nIG9uZSwgdGhleSBjYW4gY2FsbAotCQkvLyBnZXRFeGlzdGluZwotCQkvLyBhZnRlciB0aGlzIGZhaWx1cmUKLQkJbmV3TW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChuZXdJZCk7Ci0JCWlmIChuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBiZSBzdXJlIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB3ZSBnb3QgImJ5IGFjY2lkZW50IiAoYW5kCi0JCQkvLyBubwotCQkJLy8gbG9uZ2VyIG5lZWQpCi0JCQluZXdNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCX0KLQkJbmV3TW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5jb3B5TW9kZWxGb3JFZGl0KGdldElkKCksIG5ld0lkKTsKLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBlbmRMb2NrIGlzIHByb3RlY3RlZCBvbmx5IGZvciBhIHZlcnkgc3BlY2lhbCBwdXJwb3NlLiBTbyBzdWJjbGFzc2VzIGNhbgotCSAqIGNhbGwgaXQgdG8gZW5kIHRoZSBsb2NrIGFmdGVyIHVwZGF0ZXMgaGF2ZSBiZWVuIG1hZGUsIGJ1dCBiZWZvcmUKLQkgKiBub3RpZmljYXRpb25zIGFyZSBzZW50Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5kTG9jaygpIHsKLQkJaWYgKGZMb2NrT2JqZWN0ICE9IG51bGwpIHsKLQkJCWZMb2NrT2JqZWN0LnJlbGVhc2UoKTsKLQkJCWlmIChMb2dnZXIuREVCVUcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWwgbG9jayByZWxlYXNlZDogIiArIGZMb2NrT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5lbmRSZWNvcmRpbmcocmVxdWVzdGVyLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyB0aGF0IHRoZSB0aGUgbW9kZWwgaXMKLQkgKiBhYm91dCB0byB1bmRlciBnbyBhIGNoYW5nZS4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudHMKLQkgKiBvciBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwncyBpZCBvciBiYXNlIGxvY2F0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlTW9kZWxBYm91dFRvQmVDaGFuZ2VkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCS8vIGZyb20gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxBYm91dFRvQmVDaGFuZ2VkKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBOT1RFOiB0cmljayBmb3IgdHJhbnNpdGlvbi4gV2UgYWN0dWFsIHVzZSB0aGUgc2FtZQotCQkJCS8vIGxpc3RlbmVycwotCQkJCS8vIGFzIG1vZGVsU3RhdGUsIGJ1dCBvbmx5IHNlbmQgdGhpcyB0byB0aG9zZSB0aGF0IGhhdmUKLQkJCQkvLyBpbXBsZW1lbnRlZCBNb2RlbFN0YXRlRXh0ZW5kZWQuCi0JCQkJSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCWxpc3RlbmVyLm1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlTW9kZWxDaGFuZ2VkKCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMKLQkJLy8gdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQKLQkJLy8gYW5kIHJlbW92ZSBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lcgotCQkvLyBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJCQl9Ci0JCQkJLy8gaXRzIHNvIGNyaXRpY2lhbCB0aGF0IHRoZSBiZWdpbi9lbmQgYXJyaXZlIGluCi0JCQkJLy8gcGFpcnMsCi0JCQkJLy8gaWYgdGhlcmUgaGFwcGVuZHMgdG8gYmUgYW4gZXJyb3IgaW4gb25lIG9mIHRoZQotCQkJCS8vIG1vZGVsQ2hhbmdlZCwKLQkJCQkvLyB0aGV5IHdlIHdhbnQgdG8gYmUgc3VyZSByZXN0IGNvbXBsZXRlIG9rLgotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlCi0JICogZGlydHkgc3RhdGUgb2YgdGhlIG1vZGVsLiBUaGUgZGlydHkgc3RhdGUgaXMgZW50aXJlbHkgYWJvdXQgY2hhbmdlcyBpbgotCSAqIHRoZSBjb250ZW50IG9mIHRoZSBtb2RlbCAobm90LCBmb3IgZXhhbXBsZSwgYWJvdXQgY2hhbmdlcyB0byBpZCwgb3IKLQkgKiBiYXNlIGxvY2F0aW9uIC0tIHNlZSBtb2RlbE1vdmVkKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIGVsZW1lbnQsIGJvb2xlYW4gaXNEaXJ0eSkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbERpcnR5U3RhdGVDaGFuZ2VkKGVsZW1lbnQsIGlzRGlydHkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsUmVpbml0aWFsaXplZCgpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZWluaXRpYWxpemVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCWxpc3RlbmVyLm1vZGVsUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIGFib3V0IHRoZSBkZWxldGlvbiBvZiBhCi0JICogbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIGVsZW1lbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZXNvdXJjZURlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsUmVzb3VyY2VEZWxldGVkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmVzb3VyY2UKLQkgKiB1bmRlcmx5aW5nIGEgbW9kZWwgaGFzIGJlZW4gbW92ZWQuIFRoaXMgaXMgdHlwaWNhbGx5IHJlZmxlY3RlZCBpbiBhCi0JICogY2hhbmdlIHRvIHRoZSBpZCwgYmFzZUxvY2F0aW9uLCBvciBib3RoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvcmlnaW5hbEVsZW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW92ZWRFbGVtZW50KSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsUmVzb3VyY2VNb3ZlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxSZXNvdXJjZU1vdmVkKG9yaWdpbmFsRWxlbWVudCwgbW92ZWRFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCYXNlTG9jYXRpb24oKSB7Ci0KLQkJcmV0dXJuIGZCYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbCNnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkgewotCQlpZiAoZkV4cGxpY2l0Q29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwpCi0JCQlyZXR1cm4gZkV4cGxpY2l0Q29udGVudFR5cGVJZGVudGlmaWVyOwotCQlyZXR1cm4gZk1vZGVsSGFuZGxlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoZmFjdG9yeVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZhY3RvcnlSZWdpc3RyeSA9IG5ldyBGYWN0b3J5UmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKiAKLQkgKiBASVNTVUUgLSBubyBvbmUgc2hvdWxkIG5lZWQgdG8ga25vdyBJRCwgc28gdGhpcyBzaG91bGQgYmUgZGVmYXVsdCBhY2Nlc3MgZXZlbnR1YWxseS4gCi0JICogSWYgY2xpZW50cyBiZWxpZXZlIHRoZXkgZG8gbmVlZCBJRCwgYmUgc3VyZSB0byBsZXQgdXMga25vdyAob3BlbiBhIGJ1ZykuIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0KLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUxvY2sgZ2V0TG9ja09iamVjdEZyb21Eb2N1bWVudCgpIHsKLQotCQkvLyB3ZSBhbHdheXMgImdldCBhZnJlc2giIHRoZSBsb2NrIG9iamVjdCBmcm9tIG91ciBkb2N1bWVudCwKLQkJLy8ganVzdCBpbiBjYXNlIHRoZSBpbnN0YW5jZSBvZiB0aGUgZG9jdW1lbnQgY2hhbmdlcy4KLQkJSUxvY2sgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBmU3RydWN0dXJlZERvY3VtZW50OwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJTG9ja2FibGUpIHsKLQkJCQkvLyByZW1lbWJlciwgbW9yZSB0aGFuIG9uZSBjbGllbnQgY2FuIGdldCB0aGUKLQkJCQkvLyBsb2NrIG9iamVjdCwgaXRzIGR1cmluZyB0aGUgYXF1aXJlIHRoYXQgdGhlCi0JCQkJLy8gbG9jayBvbiB0aGUgdGhyZWFkIGlzIG9idGFpbmVkLgotCQkJCXJlc3VsdCA9ICgoSUxvY2thYmxlKSBkb2MpLmdldExvY2tPYmplY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldE1vZGVsSGFuZGxlcigpIHsKLQotCQlyZXR1cm4gZk1vZGVsSGFuZGxlcjsKLQl9Ci0KLQotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQotCQlyZXR1cm4gX2dldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCS8vIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdCgpIHsKLQotCi0KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGdldE1vZGVsTWFuYWdlcigpLmdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKCkgewotCi0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKGdldElkKCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCkgewotCi0JCXJldHVybiByZWluaXRpYWxpemVTdGF0ZURhdGE7Ci0JfQotCi0KLQotCXB1YmxpYyBVUklSZXNvbHZlciBnZXRSZXNvbHZlcigpIHsKLQotCQlyZXR1cm4gZlJlc29sdmVyOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAyOjMwOjI2Ci0JICogUE0pCi0JICogCi0JICogQHJldHVybiBsb25nCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSB7Ci0KLQkJcmV0dXJuIGZTeW5jaHJvbml6YXRpb25TdGFtcDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0KLQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFVuZG9NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdElkKFN0cmluZyBpZCkgewotCQlmSWQgPSBpZDsKLQl9Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFib3V0VG9CZUNoYW5nZWQoKSB7Ci0KLQkJLy8gbm90aWNlIHdlIG9ubHkgZmlyZSB0aGlzIGV2ZW50IGlmIHdlIGFyZSBub3QKLQkJLy8gYWxyZWFkeSBpbiBhIG1vZGVsIHN0YXRlIGNoYW5naW5nIHNlcXVlbmNlCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlmaXJlTW9kZWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgbm90aWZ5aW5nIG1vZGVsIHN0YXRlIGxpc3RlcnMgb2YgYWJvdXQgdG8gY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGJlZ2luIGxvY2sgYWZ0ZXIgbGlzdGVuZXJzIG5vdGlmaWVkLCBvdGhlcndpc2UKLQkJCQkvLyBkZWFkbG9jayBjb3VsZCBvY2N1ciBpZiB0aGV5IGNhbGwgdXMgYmFjay4KLQkJCQliZWdpbkxvY2soKTsKLQkJCX0KLQotCQl9Ci0JCS8vIHdlIGFsd2F5cyBpbmNyZW1lbnQgY291bnRlciwgZm9yIGV2ZXJ5IHJlcXVlc3QgKHNvICptdXN0KiByZWNlaXZlCi0JCS8vIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mICdjaGFuZ2VkTW9kZWwnIHJlcXVlc3RzKQotCQlmTW9kZWxTdGF0ZUNoYW5naW5nKys7Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCBhbiBpbXBlbmRpbmcgY2hhbmdlCi0JICogaXMgbm93IGNvbXBsZXRlLiBUaGlzIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGJ5ICdtb2RlbENoYW5nZWQnCi0JICogc2luY2UgaXQga2VlcHMgdHJhY2sgb2YgY291bnRzLgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGludGVybmFsTW9kZWxDaGFuZ2VkKCkgewotCi0JCS8vIGFsd2F5cyBkZWNyZW1lbnQKLQkJZk1vZGVsU3RhdGVDaGFuZ2luZy0tOwotCi0KLQkJLy8gQ2hlY2sgaW50ZWdyaXR5Ci0JCS8vIHRvIGJlIGxlc3MgdGhhbiB6ZXJvIGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsCi0JCS8vIGJ1dCB3ZSdsbCByZXNldCB0byB6ZXJvCi0JCS8vIGFuZCB0cnkgdG8gY29udGludWUKLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPCAwKSB7Ci0JCQlmTW9kZWxTdGF0ZUNoYW5naW5nID0gMDsKLQkJCS8vIHNob3VsZCBub3QgYmUgbG9ja2VkLCBidXQganVzdCBpbiBjYXNlCi0JCQllbmRMb2NrKCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBtb2RlbFN0YXRlQ2hhbmdpbmcgd2FzIGxlc3MgdGhhbiB6ZXJvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJLy8gV2Ugb25seSBmaXJlIHRoaXMgZXZlbnQgaWYgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXJlIGRvbmUuCi0JCS8vIFRoYXQgaXMsIGlmIHdlJ3ZlIHJlY2VpdmVkIHRoZSBzYW1lIG51bWJlciBvZiBtb2RlbENoYW5nZWQgYXMKLQkJLy8gd2UgaGF2ZSBhYm91dFRvQ2hhbmdlTW9kZWwuCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbENoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWVuZExvY2soKTsKLQkJCS8vIG5vdGlmaWZ5IGxpc3RlbmVycyBvdXRzaWRlIG9mIGxvY2tlZCBzdGF0ZSAob3IgZGVhZGxvY2sKLQkJCS8vIGNhbiBvY2N1ciBpZiBvbmUgb2YgdGhlbSBjYWxscyB1cyBiYWNrLgotCQkJZmlyZU1vZGVsQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQotCQlyZXR1cm4gZkRpcnR5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaGFzIHZlcnkgc3BlY2lhbCBwdXJwb3NlLCBpdHMgdXNlZCBpbiBzdWJjbGFzcwotCSAqICdjaGFuZ2VkTW9kZWwnIHRvIGtub3cgd2hlbiB0byBkbyAiZW5kaW5nIiBzb3J0cyBvZiB0aGluZ3MsIHJpZ2h0Ci0JICogYmVmb3JlIGEgY2FsbCB0byBzdXBlci5DaGFuZ2VkTW9kZWwgd291bGQgaW4gZGVlZCBwdXQgdGhlIG1vZGVsIGluCi0JICogJ2VuZCcgc3RhdGUuIFB1dCBhbm90aGVyIHdheSwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ViY2xhc3NlcydzCi0JICogY2hhbmdlZE1vZGVsLCB0aGUgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgaXMgdHJ1ZSwgYnV0IGF0IGVuZCwgaXQgd2lsbCBiZQotCSAqIGZhbHNlLiBTbywgdGhpcyBtZXRob2QgYWxsb3dzIGEgc21hbGwgInBlZWsgYWhlYWQiLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTW9kZWxDaGFuZ2VTdGF0ZU9uVmVyZ2VPZkVuZGluZygpIHsKLQotCi0JCXJldHVybiBmTW9kZWxTdGF0ZUNoYW5naW5nID09IDE7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKSB7Ci0KLQotCQlyZXR1cm4gZk1vZGVsU3RhdGVDaGFuZ2luZyA+IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0KLQkJcmV0dXJuIGZOZXdTdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSB7Ci0KLQkJcmV0dXJuIHJlaW5pdGlhbGl6YXRpb25OZWVkZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCi0KLQkJaWYgKCFpc1NoYXJlZEZvckVkaXQoKSkKLQkJCXJldHVybiBpc0RpcnR5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWRGb3JFZGl0KGdldElkKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldE1vZGVsTWFuYWdlcigpLmlzU2hhcmVkRm9yUmVhZChnZXRJZCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZCgpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbFJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdJbnN0YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIHdlIGRlbGVnYXRlIHRvIHRoZSBtb2RlbCBtYW5hZ2VyLCBzbyBsb2FkZXIsIGV0Yy4sIGNhbiBiZQotCQkvLyB1c2VkLgotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZU5ld0luc3RhbmNlKHRoaXMpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0KCkgewotCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA9PSAwKSB7Ci0JCQl0cnkgewotCQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCWFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpOwotCQkJCXJlc3VsdCA9IF9nZXRNb2RlbE1hbmFnZXIoKS5yZWluaXRpYWxpemUodGhpcyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRSZWluaXRpYWxpemVOZWVkZWQoZmFsc2UpOwotCQkJCXNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShudWxsKTsKLQkJCQltb2RlbFJlaW5pdGlhbGl6ZWQoKTsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChMb2dnZXIuREVCVUcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiaW5kZWVkISEhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIG1vZGVsIHRvIGZyZWUgdXAgYW55IHJlc291cmNlcyBpdCBtaWdodCBiZQotCSAqIHVzaW5nLiBJbiBwYXJ0aWN1bGFyLCBpdHNlbGYsIGFzIHN0b3JlZCBpbiB0aGUgSU1vZGVsTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNT0RFTF9NQU5BR0VSX05VTEwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogQmUgc3VyZSB0byBjaGVjayB0aGUgc2hhcmVkIHN0YXRlIGJlZm9yZSByZWxlYXNpbmcuIChTaW5jZQotCQkJICogaXNTaGFyZWQgYXNzdW1lcyBhIGNvdW50IG9mIDEgbWVhbnMgbm90IHNoYXJlZCAuLi4gYW5kIHdlIHdhbnQKLQkJCSAqIG91ciAnMScgdG8gYmUgdGhhdCBvbmUuKSBUaGUgcHJvYmxlbSwgb2YgY291cnNlLCBpcyB0aGF0Ci0JCQkgKiBiZXR3ZWVuIHByZS1jeWNsZSBub3RpZmljYXRpb24gYW5kIHBvc3QtcmVsZWFzZSBub3RpZmljYXRpb24sCi0JCQkgKiB0aGUgbW9kZWwgY291bGQgb25jZSBhZ2FpbiBoYXZlIGJlY29tZSBzaGFyZWQsIHJlbmRlcmluZyB0aGUKLQkJCSAqIHJlbGVhc2Ugbm90aWZpY2F0aW9uIGluY29ycmVjdC4KLQkJCSAqLwotCQkJYm9vbGVhbiBpc1NoYXJlZCA9IGlzU2hhcmVkKCk7Ci0KLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQcmVMaWZlQ3ljbGVFdmVudFJlbGVhc2UodGhpcyk7Ci0JCQl9Ci0KLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5yZWxlYXNlRnJvbUVkaXQodGhpcyk7Ci0JCQlpZiAoIWlzU2hhcmVkKSB7Ci0JCQkJc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmVsZWFzZSh0aGlzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIG1vZGVsIHRvIGZyZWUgdXAgYW55IHJlc291cmNlcyBpdCBtaWdodCBiZQotCSAqIHVzaW5nLiBJbiBwYXJ0aWN1bGFyLCBpdHNlbGYsIGFzIHN0b3JlZCBpbiB0aGUgSU1vZGVsTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTU9ERUxfTUFOQUdFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLyoKLQkJCSAqIEJlIHN1cmUgdG8gY2hlY2sgdGhlIHNoYXJlZCBzdGF0ZSBiZWZvcmUgcmVsZWFzaW5nLiAoU2luY2UKLQkJCSAqIGlzU2hhcmVkIGFzc3VtZXMgYSBjb3VudCBvZiAxIG1lYW5zIG5vdCBzaGFyZWQgLi4uIGFuZCB3ZSB3YW50Ci0JCQkgKiBvdXIgJzEnIHRvIGJlIHRoYXQgb25lLikgVGhlIHByb2JsZW0sIG9mIGNvdXJzZSwgaXMgdGhhdAotCQkJICogYmV0d2VlbiBwcmUtY3ljbGUgbm90aWZpY2F0aW9uIGFuZCBwb3N0LXJlbGVhc2Ugbm90aWZpY2F0aW9uLAotCQkJICogdGhlIG1vZGVsIGNvdWxkIG9uY2UgYWdhaW4gaGF2ZSBiZWNvbWUgc2hhcmVkLCByZW5kZXJpbmcgdGhlCi0JCQkgKiByZWxlYXNlIG5vdGlmaWNhdGlvbiBpbmNvcnJlY3QuCi0JCQkgKi8KLQkJCWJvb2xlYW4gaXNTaGFyZWQgPSBpc1NoYXJlZCgpOwotCi0JCQlpZiAoIWlzU2hhcmVkKSB7Ci0JCQkJc2lnbmFsUHJlTGlmZUN5Y2xlRXZlbnRSZWxlYXNlKHRoaXMpOwotCQkJfQotCi0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkucmVsZWFzZUZyb21SZWFkKHRoaXMpOwotCi0JCQlpZiAoIWlzU2hhcmVkKSB7Ci0JCQkJc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmVsZWFzZSh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXBsZW5pc2hlcyB0aGUgbW9kZWwgd2l0aCB0aGUgcmVzb3VyY2Ugd2l0aG91dCBzYXZpbmcKLQkgKiBhbnkgcG9zc2libGUgY2hhbmdlcy4gSXQgaXMgdXNlZCB3aGVuIG9uZSBlZGl0b3IgbWF5IGJlIGNsb3NpbmcsIGFuZAotCSAqIHNwZWNpZmlhbGx5IHNheXMgbm90IHRvIHNhdmUgdGhlIG1vZGVsLCBidXQgYW5vdGhlciAiZGlzcGxheSIgb2YgdGhlCi0JICogbW9kZWwgc3RpbGwgbmVlZHMgdG8gaGFuZyBvbiB0byBzb21lIG1vZGVsLCBzbyBuZWVkcyBhIGZyZXNoIGNvcHkuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCXJlc3VsdCA9IF9nZXRNb2RlbE1hbmFnZXIoKS5yZWxvYWRNb2RlbChnZXRJZCgpLCBpbnB1dFN0cmVhbSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCS8vIGlmIG1hbmFnZXIgaXMgbnVsbCwgdGhlbiBub25lIGhhdmUgYmVlbiBhZGRlZCwgc28KLQkJLy8gbm8gbmVlZCB0byByZW1vdmUgYW55Ci0JCWlmIChmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQkJCWZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTW9kZWxTdGF0ZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSBmTW9kZWxTdGF0ZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCS8vIHJlbW92aW5nCi0JCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmTW9kZWxTdGF0ZUxpc3RlbmVyc1tpXTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZQotCQkJCS8vIG9sZAotCQkJCS8vIG9uZQotCQkJCWZNb2RlbFN0YXRlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBBIG1ldGhvZCB0aGF0IG1vZGlmaWVzIHRoZSBtb2RlbCdzIHN5bmNocm9uaXphdGlvbiBzdGFtcCB0byBtYXRjaCB0aGUKLQkgKiByZXNvdXJjZS4gVHVybnMgb3V0IHRoZXJlJ3Mgc2V2ZXJhbCB3YXlzIG9mIGRvaW5nIGl0LCBzbyB0aGlzIGVuc3VyZXMgYQotCSAqIGNvbW1vbiBhbGdvcml0aG0uCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQotCi0JCXNldFN5bmNocm9uaXphdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IHRvIGluaXRpYXRlIG5vdGlmaWNhdGlvbiB0byBhbGwgaW50ZXJlc3RlZAotCSAqIHBhcnRpZXMgdGhhdCBhIG1vZGVsJ3MgdW5kZXJseWluZyByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlRGVsZXRlZCgpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbFJlc291cmNlRGVsZXRlZCh0aGlzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFsbG93cyBhIG1vZGVsIGNsaWVudCB0byBpbml0aWF0ZSBub3RpZmljYXRpb24gdG8gYWxsCi0JICogaW50ZXJlc3RlZCBwYXJ0aWVzIHRoYXQgYSBtb2RlbCdzIHVuZGVybHlpbmcgcmVzb3VyY2UgbG9jYXRpb24gaGFzCi0JICogY2hhbmdlZC4gTm90ZTogd2UgYXNzdW1lIGNhbGxlciBoYXMgYWxyZWFkeSBjaGFuZ2VkIGJhc2VMb2NhdGlvbiwgSWQsCi0JICogZXRjLiwgc2luY2UgaXRzIHJlYWxseSB1cCB0byB0aGUgY2xpZW50IHRvIGRldGVybWluZSB3aGF0J3MgIm5ldyIgYWJvdXQKLQkgKiBhIG1vdmVkIG1vZGVsLiBDYXV0aW9uOiAndGhpcycgYW5kICduZXdNb2RlbCcgbWF5IGJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBUaGlzIGlzIHRoZSBjYXNlIGZvciBjdXJyZW50IHdvcmtpbmcgd2l0aCBGaWxlTW9kZWxQcm92aWRlciwgYnV0IGhhdmUKLQkgKiBsZWZ0IHRoZSBkdWFsIGFyZ3VtZW50IGZvciBmdXR1cmUgcG9zc2liaWxpdGllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbFJlc291cmNlTW92ZWQodGhpcywgbmV3TW9kZWwpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cmluZ0lkID0gZ2V0SWQoKTsKLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5zYXZlTW9kZWwoc3RyaW5nSWQsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCi0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpb24gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cmluZ0lkID0gZ2V0SWQoKTsKLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5zYXZlTW9kZWwoc3RyaW5nSWQsIGVuY29kaW5nUnVsZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGlvbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cmluZ0lkID0gZ2V0SWQoKTsKLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5zYXZlTW9kZWwoaUZpbGUsIHN0cmluZ0lkLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChpRmlsZSwgc3RyaW5nSWQsIGVuY29kaW5nUnVsZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGlvb24gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cmluZ0lkID0gZ2V0SWQoKTsKLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5zYXZlTW9kZWwoc3RyaW5nSWQsIG91dHB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGlvbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHR5cGljYWxseSB1c2VkIHRvIGRlbm90ZSB0aGUgbW9kZWwncyB1bmRlcmx5aW5nCi0JICogcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZUxvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcgbmV3QmFzZUxvY2F0aW9uKSB7Ci0KLQkJZkJhc2VMb2NhdGlvbiA9IG5ld0Jhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZUlkZW50aWZpZXIoU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllcikgewotCQlmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXIgPSBjb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlydHlTdGF0ZShib29sZWFuIGRpcnR5U3RhdGUpIHsKLQotCQkvLyBubyBuZWVkIHRvIHByb2Nlc3MgKHNldCBvciBmaXJlIGV2ZW50KSwgaWYgc2FtZSB2YWx1ZQotCQlpZiAoZkRpcnR5U3RhdGUgIT0gZGlydHlTdGF0ZSkgewotCQkJLy8gcHJlLWNoYW5nZSBub3RpZmljYXRpb24KLQkJCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ESVJUWV9TVEFURSB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCi0JCQkvLyB0aGUgYWN0dWFsIGNoYW5nZQotCQkJZkRpcnR5U3RhdGUgPSBkaXJ0eVN0YXRlOwotCi0JCQkvLyBvbGQgbm90aWZpY2F0aW9uCi0JCQkvLyBUT0RPOiBDMyByZW1vdmUgb2xkIG5vdGlmaWNhdGlvbgotCQkJaWYgKGZEaXJ0eVN0YXRlID09IGZhbHNlKSB7Ci0JCQkJLy8gaWYgd2UgYXJlIGJlaW5nIHNldCB0byBub3QgZGlydHkgKHN1Y2ggYXMganVzdCBiZWVuIHNhdmVkKQotCQkJCS8vIHRoZW4gd2UgbmVlZCB0byBzdGFydCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMKLQkJCQkvLyBhZ2FpbiB0byBrbm93IHdoZW4gdG8gc2V0IHN0YXRlIHRvIHRydWU7Ci0JCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJCWZpcmVNb2RlbERpcnR5U3RhdGVDaGFuZ2VkKHRoaXMsIGRpcnR5U3RhdGUpOwotCi0KLQkJCS8vIHBvc3QgY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRElSVFlfU1RBVEUgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gd2lsbCBsaWtlbHkgYmUgZGVwcmVjYXRlZCBzb29uLCBpbiBmYXZvciBvZiBkaXJlY3QgJ2FkZHMnCi0JICogICAgICAgICAgICAgLi4uIGJ1dCB0YWtlcyBzb21lIHJlZGVzaWduLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZmFjdG9yeVJlZ2lzdHJ5ID0gZmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwuIElmCi0JICogaXQgaXMgYmVpbmcgc2V0IGhlcmUsIGl0IG1lYW5zIHRoZSBtb2RlbCBtYW5nZXIgaXMgYWxyZWFkeSBtYW5hZ2luZyB0aGUKLQkgKiBtb2RlbCB3aXRoIGFub3RoZXIgaWQsIHNvIHdlIGhhdmUgdG8ga2VlcCBpdCBpbiBzeW5jLiBUaGlzIG1ldGhvZCBjYWxscwotCSAqIG5vdGlmaWVzIGxpc3RuZXJzLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBub3RpZmllZCBhbHJlYWR5LCB0aGF0IGEgIm1vZGVsCi0JICogc3RhdGUgY2hhbmdlIiBpcyBhYm91dCB0byBvY2N1ci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQotCi0JCS8vIEl0IG1ha2VzIG5vIHNlbnNlLCBJIGRvbid0IHRoaW5rLCB0byBoYXZlIGFuIGlkIG9mIG51bGwsIHNvCi0JCS8vIHdlJ2xsIHRocm93IGFuIGlsbGVnYWwgYXJndW1lbnQgZXhjZXB0aW9uIGlmIHNvbWVvbmUgdHJ5cy4gTm90ZToKLQkJLy8gdGhlIElNb2RlbE1hbmFnZXIgY291bGQgbm90IG1hbmFnZSBhIG1vZGVsIHdpdGggYW4gaWQgb2YgbnVsbCwKLQkJLy8gc2luY2UgaXQgdXNlcyBoYXNodGFibGVzLCBhbmQgeW91IGNhbid0IGhhdmUgYSBudWxsIGlkIGZvciBhCi0JCS8vIGhhc2h0YWJsZS4KLQkJaWYgKG5ld0lkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFNTRUNvcmVNZXNzYWdlcy5BX21vZGVsX3NfaWRfY2FuX25vdF9iZV9udV9FWENfKTsgLy8kTk9OLU5MUy0xJCA9ICJBIG1vZGVsJ3MgaWQgY2FuIG5vdCBiZSBudWxsIgotCQkvLyBUbyBndWFyZCBhZ2FpbnN0IHRocm93aW5nIGEgc3B1cmlvdXMgUmVzb3VyY2VJblVzZSBleGNlcHRpb24sCi0JCS8vIHdoaWNoIGNhbiBvY2N1ciB3aGVuIHR3byBwaWVjZXMgb2YgY29kZSBib3RoIHdhbnQgdG8gY2hhbmdlIHRoZSBpZCwKLQkJLy8gc28gdGhlIHNlY29uZCByZXF1ZXN0IGlzIHNwdXJpb3VzLCB3ZSdsbCBpZ25vcmUgYW55IHJlcXVlc3RzIHRoYXQKLQkJLy8gYXR0ZW1wdCB0byBjaGFuZ2UgdGhlIGlkIHRvIHdoYXQgaXQgYWxyZWFkeSBpcyAuLi4gbm90ZSwgd2UgdXNlCi0JCS8vICdlcXVhbHMnLCBub3QgaWRlbnRpdHkgKCc9PScpIHNvIHRoYXQgdGhpbmdzIGxpa2UKLQkJLy8gc3RyaW5ncyBjYW4gYmUgdXNlZC4gVGhpcyBpcyB0aGUgc2FtZSBjcml0ZXJpYSB0aGF0IGlkcyBhcmUKLQkJLy8gZm91bmQgaW4gbW9kZWwgbWFuYWdlciAtLSB3ZWxsLCBhY3R1YWxseSwgSSBqdXN0IGNoZWNrZWQsIGFuZCBmb3IKLQkJLy8gdGhlIGhhc2h0YWJsZSBpbXBsLCB0aGUgY3JpdGVyaWEgdXNlcyAuZXF1YWxzIEFORCB0aGUgY29uZGl0aW9uCi0JCS8vIHRoYXQgdGhlIGhhc2ggdmFsdWVzIGJlIGlkZW50aWNhbCAoSSdtIGFzc3VtaW5nIHRoaXMgaXMgYWx3YXlzCi0JCS8vIHRydWUsIGlmIGVxdWFscyBpcyB0cnVlLCBmb3Igbm93LCBJJ20gbm90IHN1cmUKLQkJLy8gd2UgY2FuIGFzc3VtZSB0aGF0IGhhc2h0YWJsZSB3aWxsIGFsd2F5cyBiZSB1c2VkLCBidXQgaW4KLQkJLy8gZ2VuZXJhbCwgc2hvdWxkIG1hdGNoLikKLQkJLy8KLQkJaWYgKG5ld0lkLmVxdWFscyhmSWQpKQotCQkJcmV0dXJuOwotCQkvLyB3ZSBtdXN0IGd1YXJkIGFnYWluc3QgcmVhc3NpZ25pbmcgYW4gaWQgdG8gb25lIHRoYXQgd2UgYWxyZWFkeQotCQkvLyBhcmUgbWFuYWdpbmcuCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQobmV3SWQpOwotCQkJaWYgKG5ld01vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBiZSBzdXJlIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB3ZSBnb3QgdW5leGVwZWN0YW50bHkKLQkJCQkvLyAoYW5kIG5vIGxvbmdlciBuZWVkKQotCQkJCW5ld01vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIG5vcm1hbCBjb2RlIHBhdGgKLQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJU3RyaW5nIG9sZElkID0gZklkOwotCQkJZklkID0gbmV3SWQ7Ci0JCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCS8vIGlmIG1hbmFnZWQgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgbm90aWZ5IHRvCi0JCQkJLy8gSU1vZGVsTWFuYWdlcgotCQkJCS8vIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbiBub3QgdG8gZG8gdGhhdAotCQkJCWlmIChvbGRJZCAhPSBudWxsICYmIG5ld0lkICE9IG51bGwgJiYgIW5ld0lkLmVxdWFscyhvbGRJZCkpIHsKLQkJCQkJZ2V0TW9kZWxNYW5hZ2VyKCkubW92ZU1vZGVsKG9sZElkLCBuZXdJZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gbWFrZSBzdXJlIHRoaXMgZmluYWxseSBpcyBvbmx5IGV4ZWN1dGVkIGlmICdhYm91dCB0byBDaGFuZ2UKLQkJCS8vIG1vZGVsJyBoYXMKLQkJCS8vIGJlZW4gZXhlY3V0ZWQuCi0JCQljaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50VHlwZURlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsSGFuZGxlcihJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlcikgewotCi0JCS8vIG5vIG5lZWQgdG8gZmlyZSBldmVudHMgaWYgbW9kZWxIYW5kbGVyIGhhcyBiZWVuIG51bGwKLQkJLy8gZm9yIHRoaXMgbW9kZWwgLS0KLQkJLy8gdGhpcyBpcyBhbiBhdHRlbXB0IGF0IGluaXRpYWxpemF0aW9uIG9wdGltaXphdGlvbiBhbmQgbWF5IG5lZWQKLQkJLy8gdG8gY2hhbmdlIGluIGZ1dHVyZS4KLQkJYm9vbGVhbiB0cnVlQ2hhbmdlID0gZmFsc2U7Ci0JCWlmIChmTW9kZWxIYW5kbGVyICE9IG51bGwpCi0JCQl0cnVlQ2hhbmdlID0gdHJ1ZTsKLQkJaWYgKHRydWVDaGFuZ2UpIHsKLQkJCWludGVybmFsQWJvdXRUb0JlQ2hhbmdlZCgpOwotCQl9Ci0JCWZNb2RlbEhhbmRsZXIgPSBtb2RlbEhhbmRsZXI7Ci0JCWlmICh0cnVlQ2hhbmdlKSB7Ci0JCQlpbnRlcm5hbE1vZGVsQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsTWFuYWdlcihJTW9kZWxNYW5hZ2VyIG5ld01vZGVsTWFuYWdlcikgewotCi0JCWZNb2RlbE1hbmFnZXIgPSBuZXdNb2RlbE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3U3RhdGUoYm9vbGVhbiBuZXdTdGF0ZSkgewotCi0JCWZOZXdTdGF0ZSA9IG5ld1N0YXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSAiZmxhZyIgdGhhdCByZWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWluaXRpYWxpemVOZWVkZWQoYm9vbGVhbiBuZWVkZWQpIHsKLQotCQlyZWluaXRpYWxpemF0aW9uTmVlZGVkID0gbmVlZGVkOwotCX0KLQotCS8qKgotCSAqIEhvbGRzIGFueSBkYXRhIHRoYXQgdGhlIHJlaW5pdCBwcm9jZWR1cmUgbWlnaHQgZmluZCB1c2VmdWwgaW4KLQkgKiByZWluaXRpYWxpemluZyB0aGUgbW9kZWwuIFRoaXMgaXMgaGFuZHksIHNpbmNlIHRoZSByZWluaXRpYWxpemF0aW9uIG1heQotCSAqIG5vdCB0YWtlIHBsYWNlIGF0IG9uY2UsIGFuZCBzb21lICJvbGQiIGRhdGEgbWF5IGJlIG5lZWRlZCB0byBwcm9wZXJseQotCSAqIHVuZG8gcHJldmlvdXMgc2V0dGluZ3MuIE5vdGU6IHRoZSBwYXJhbWV0ZXIgd2FzIGludGVudGlvbmFsbHkgbWFkZSB0bwotCSAqIGJlIG9mIHR5cGUgJ09iamVjdCcgc28gZGlmZmVyZW50IG1vZGVscyBjYW4gdXNlIGluIGRpZmZlcmVudCB3YXlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJcmVpbml0aWFsaXplU3RhdGVEYXRhID0gb2JqZWN0OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgbmV3UmVzb2x2ZXIpIHsKLQotCQlmUmVzb2x2ZXIgPSBuZXdSZXNvbHZlcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlib29sZWFuIGxpZmVDeWNsZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCQkvLyBwcmVjaGFuZ2Ugbm90aWZpY2F0aW9uCi0JCQlsaWZlQ3ljbGVOb3RpZmljYXRpb24gPSB0cnVlOwotCQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IERvY3VtZW50Q2hhbmdlZChNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVCwgdGhpcywgZlN0cnVjdHVyZWREb2N1bWVudCwgbmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0KLQkJLy8gaG9sZCBmb3IgbGlmZSBjeWNsZSBub3RpZmljYXRpb24KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBwcmV2aW91c0RvY3VtZW50ID0gZlN0cnVjdHVyZWREb2N1bWVudDsKLQkJLy8gdGhlIGFjdHVhbCBjaGFuZ2UKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudDsKLQotCi0JCS8vIGF0IHRoZSBzdXBlciBjbGFzcyBsZXZlbCwgd2UnbGwgbGlzdGVuIGZvciBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJLy8gY2hhbmdlcwotCQkvLyBzbyB3ZSBjYW4gc2V0IG91ciBkaXJ0eSBzdGF0ZSBmbGFnCi0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJfQotCi0JCWlmIChsaWZlQ3ljbGVOb3RpZmljYXRpb24pIHsKLQkJCS8vIHBvc3QgY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IERvY3VtZW50Q2hhbmdlZChNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQsIHRoaXMsIHByZXZpb3VzRG9jdW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDI6MzA6MjYKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3luY2hyb25pemF0aW9uU3RhbXAKLQkgKiAgICAgICAgICAgIGxvbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTeW5jaHJvbml6YXRpb25TdGFtcChsb25nIG5ld1N5bmNocm9uaXphdGlvblN0YW1wKSB7Ci0KLQkJZlN5bmNocm9uaXphdGlvblN0YW1wID0gbmV3U3luY2hyb25pemF0aW9uU3RhbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRvY3VtZW50IHdhcyBudWxsIHdoZW4gdW5kbyBtYW5hZ2VyIHNldCBvbiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc3RydWN0dXJlZERvY3VtZW50LnNldFVuZG9NYW5hZ2VyKHVuZG9NYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBiZSBjYWxsZWQgb25seSBieSAiZnJpZW5kbHkiIGNsYXNzZXMsIHN1Y2ggYXMgTW9kZWxNYW5hZ2VyLCBhbmQKLQkgKiBzdWJjbGFzc2VzLgotCSAqLwotCXZvaWQgc2lnbmFsTGlmZWN5Y2xlRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuc2lnbmFsTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRUxFQVNFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJLy8gd2hhdCdzIHdyb25nIHdpdGggdGhpcyBkZXNpZ24gdGhhdCBhIGNhc3QgaXMgbmVlZGVkIGhlcmUhPwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQoc3RydWN0dXJlZE1vZGVsLCB0eXBlKTsKLQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVMRUFTRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJLy8gd2hhdCdzIHdyb25nIHdpdGggdGhpcyBkZXNpZ24gdGhhdCBhIGNhc3QgaXMgbmVlZGVkIGhlcmUhPwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQoc3RydWN0dXJlZE1vZGVsLCB0eXBlKTsKLQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9GYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzY3MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9GYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc2ltcGx5IG1haW50YWlucyB0aGUgbGlzdCBvZiBmYWN0b3JpZXMgYW5kIHJldHVybnMgc2luZ2xldG9uCi0gKiBpbnN0YW5jZXMgb2YgdGhlbS4gU29tZSAiYnVpbHQgaW4iIHR5cGVzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9ybQotICogRmFjdG9yeUNvbmZpZywgaWYgbm90IGZvdW5kIHJlZ2lzdGVyZCwgYnV0IG5vcm1hbGx5IGNsaWVudHMgY2FuL3Nob3VsZAotICogcmVnaXN0ZXIgdGhlaXIgb3duIGZhY3Rvcmllcy4KLSAqIAotICogTm90IGludGVuZGVkIGZvciBjbGllbnRzIHRvIHN1YmNsYXNzIG9yIGluc3RhbnRpYXRlLgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWN0b3J5UmVnaXN0cnkgewotCi0JcHJpdmF0ZSBMaXN0IGZhY3RvcmllczsKLQotCS8qKgotCSAqIGludGVudGlvbmFsbHkgZGVmYXVsdCBhY2Nlc3MKLQkgKi8KLQlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIExpc3QgX2dldEZhY3RvcmllcygpIHsKLQotCQlpZiAoZmFjdG9yaWVzID09IG51bGwpIHsKLQkJCS8vIG1heSBuZWVkIHRvIHVzZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdCgpIGlmCi0JCQkvLyBzeW5jcm9uaXphdGlvbiBiZWNvbWVzCi0JCQkvLyBuZWNlc3NhcnkgKGFuZCBpZiBzbywgcmVtZW1iZXIgdG8gc3luY2hyb25pemUgb24gZmFjdG9yaWVzKQotCQkJZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmYWN0b3JpZXM7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlfZ2V0RmFjdG9yaWVzKCkuYWRkKGZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyRmFjdG9yaWVzKCkgewotCQlmYWN0b3JpZXMuY2xlYXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRmFjdG9yeVJlZ2lzdHJ5I2NvbnRhaW5zKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgdHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdyZSBub3QgdXNpbmcgY2xvbmVkIGxpc3QsIHNvIHN0cmljdGx5IHNwZWFraW5nCi0JCS8vIGlzIG5vdCB0aHJlYWQgc2FmZS4KLQkJTGlzdCBpbnRlcm5hbExpc3QgPSBfZ2V0RmFjdG9yaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJuYWxMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaW50ZXJuYWxMaXN0LmdldChpKTsKLQkJCWlmIChmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGUgbGlzdCBvZiBmYWN0b3JpZXMgaW4gdGhlIHJlZ2lzdHJ5LiBOb3RlOgotCSAqIHRoaXMgY2FuIG5vdCBiZSB1c2VkIHRvIGFkZC9yZW1vdmUgZmFjdG9yaWVzLiBJdHMgcHJpbWFyaWx5IHByb3ZpZGVkCi0JICogZm9yIHRob3NlIGZldyBjYXNlcyB3aGVyZSBhIGxpc3Qgb2YgZmFjdG9yaWVzIG11c3QgYmUgY29waWVkIGZyb20gb25lCi0JICogbW9kZWwgYW5kIGFkZGVkIHRvIGFub3RoZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKCkgewotCQkvLyBub3RlOiBmb3Igb2JqZWN0IGludGVncml0eSwgd2UgZG9uJ3QgbGV0IGFueW9uZSBnZXQKLQkJLy8gb3VyIG1haW4gbGlzdCAoc28gdGhleSBoYXZlIHRvIGFkZCB0aHJvdWdoIGFkZEZhY3RvcnkpLAotCQkvLyBidXQgd2Ugd2lsbCByZXR1cm4gYSBzaGFsbG93ICJjbG9uZWQiIGxpc3QuCi0JCUxpc3QgZmFjdG9yeUxpc3QgPSBuZXcgQXJyYXlMaXN0KF9nZXRGYWN0b3JpZXMoKSk7Ci0JCXJldHVybiBmYWN0b3J5TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG5vdCBhIHB1cmUgcmVzaXN0cnkuIEZhY3RvcmllcyByZXRyaWV2ZWQgYmFzZWQgb24KLQkgKiB0aGVpciByZXNwb25zZSB0byAiaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSIuIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBtb3JlCi0JICogdGhhbiBvbmUgZmFjdG9yeSB0aGF0IGNhbiBhbnN3ZXIgJ3RydWUnIHRoYXQgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQKLQkgKiBmYWN0b3J5IGlzIHVzZWQuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvcihPYmplY3QgdHlwZSkgewotCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZhY3RvcmllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsaXN0U2l6ZSA9IGZhY3Rvcmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkvLyBJdCBpcyB0aGUgYWRhcHRlciBmYWN0b3JpZXMgcmVzcG9uc2liaWxpdHkgdG8gYW5zd2VyCi0JCQkvLyBpc0ZhY3RvcnlGb3JUeXBlIHNvIGl0IGdldHMgY2hvb3Nlbi4KLQkJCS8vIE5vdGljZSB3ZSBhcmUgZ29pbmcgdGhyb3VnaCB0aGUgbGlzdCBiYWNrd2FyZHMgdG8gZ2V0IHRoZQotCQkJLy8gZmFjdG9yeSBhZGRlZCBsYXN0LgotCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBhID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlpZiAoYS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJcmVzdWx0ID0gYTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbW9kaWZpZWQgdG8gd29yayBvbiBjb3B5IG9mIGxpc3QsIGZvciBWNVBURjEKLQkJLy8gc2VuZCByZWxlYXNlIHRvIGxvY2FsIGNvcHkgb2YgbGlzdAotCQkvLyBvZiBmYWN0b3JpZXMsIHNpbmNlIHNvbWUgZmFjdG9yaWVzLCBkdXJpbmcKLQkJLy8gdGhlaXIgcmVsZWFzZSBmdW5jdGlvbiwgbWF5IHJlbW92ZQotCQkvLyB0aGVtc2VsdmVzIGZyb20gdGhlIHJlZ2lzdHJ5LgotCQlMaXN0IGxvY2FsTGlzdCA9IGdldEZhY3RvcmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsTGlzdC5zaXplKCk7IGkrKykgewotCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBhID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGxvY2FsTGlzdC5nZXQoaSk7Ci0JCQkvLyBUbyBoZWxwIGJ1bGxldCBwcm9vZiBjb2RlLCB3ZSdsbCBjYXRjaCBhbmQgbG9nCi0JCQkvLyBhbnkgbWVzc2FnZXMgdGhyb3duIGJ5IGZhY3RvcmllcyBkdXJpbmcgcmVsZWFzZSwKLQkJCS8vIGJ1dCB3ZSdsbCBhdHRlbXB0IHRvIGtlZXAgZ29pbmcuCi0JCQkvLyBJbiBuZWFybHkgYWxsIGNhc2VzLCB0aG91Z2gsIHN1Y2ggZXJyb3JzIGFyZQotCQkJLy8gc2V2ZXJlIGZvciBwcm9kdWN0L2NsaWVudCwgYW5kIG5lZWQgdG8gYmUgZml4ZWQuCi0JCQl0cnkgewotCQkJCWEucmVsZWFzZSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvZ3JhbSBwcm9ibGVtIHJlbGVhc2luZyBmYWN0b3J5IiArIGEsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgZmFjdG9yeSBpZiBpdCBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldEZhY3RvcnlGb3IodHlwZSkuIElmCi0JICogdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgYWxsIGFyZSByZW1vdmVkLiBJZiB0aGVyZSBpcyBub25lLCB0aGUgY2FsbAotCSAqIHNpbXBseSByZXR1cm5zICh0aGF0IGlzLCBpdCBpcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvcikuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmFjdG9yaWVzRm9yKGphdmEubGFuZy5PYmplY3QgdHlwZSkgewotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWludCBsaXN0U2l6ZSA9IGZhY3Rvcmllcy5zaXplKCk7Ci0JCQkvLyB3ZSdsbCBnbyBiYWNrd2FyZHMgdGhyb3VnaCBsaXN0LCBzaW5jZSB3ZSdyZSByZW1vdmluZywgc28KLQkJCS8vICdzaXplJyBjaGFuZ2Ugd29uJ3QgbWF0dGVyLgotCQkJLy8gTm90ZTogSSdtIGFzc3VtaW5nIG90aGVyIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGRvIG5vdCBjaGFuZ2UKLQkJCS8vIHBvc2l0aW9uCi0JCQkvLyBzaW1wbHkgYmVjYXVzZSBhbm90aGVyIHdhcyByZW1vdmVkLgotCQkJZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkvLyBJdCBpcyB0aGUgYWRhcHRlciBmYWN0b3JpZXMgcmVzcG9uc2liaWxpdHkgdG8gYW5zd2VyCi0JCQkJLy8gaXNGYWN0b3J5Rm9yVHlwZSBzbyBpdCBnZXRzIGNob29zZW4uCi0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBhID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJaWYgKGEuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCQlmYWN0b3JpZXMucmVtb3ZlKGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCV9nZXRGYWN0b3JpZXMoKS5yZW1vdmUoZmFjdG9yeSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9MaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmE5MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9MaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBGb3IgImludGVybmFsIHVzZSIgb25seSBieSBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbAotICovCi0KLWNsYXNzIExpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgewotCXByaXZhdGUgT2JqZWN0W10gZkxpc3RlbmVyczsKLQotCUxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBjb3B5IG9mIHRoZSBnaXZlbiBsaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBMaWZlIEN5Y2xlCi0JICogTGlzdGVuZXJzLgotCSAqIAotCSAqIE11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBsaXN0ZW5lciBhcmUgYWxsb3dlZC4gVGhpcyBpcyByZXF1aXJlZCB0bwotCSAqIHN1cHBvcnQgdGhyZWFkZWQgbGlzdGVuZXIgbWFuYWdlbWVudCBwcm9wZXJseSBhbmQgZm9yIG1vZGVsLWRyaXZlbiBtb3ZlCi0JICogdG8gd29yay4gRm9yIGV4YW1wbGUsIHR3byBhZGRzIGFuZCBhIHNpbmdsZSByZW1vdmUgc2hvdWxkIHJlc3VsdCBpbiB0aGUKLQkgKiBsaXN0ZW5lciBzdGlsbCBsaXN0ZW5pbmcgZm9yIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZExpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChMb2dnZXIuREVCVUcgJiYgVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIklNb2RlbExpZmVjeWNsZUxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgbGlzdGVuaW5nIG1vcmUgdGhhbiBvbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWludCBvbGRTaXplID0gMDsKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yIGZpcnN0Ci0JCQkvLyB0aW1lIHRocm91Z2gKLQkJCW9sZFNpemUgPSBmTGlzdGVuZXJzLmxlbmd0aDsKLQkJfQotCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCX0KLQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkvLwotCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCWZMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHNpbmdsZSBjb3B5IG9mIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIExpZmUgQ3ljbGUKLQkgKiBMaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCWludCBvbGRTaXplID0gZkxpc3RlbmVycy5sZW5ndGg7Ci0JCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlib29sZWFuIHJlbW92ZWRPbmNlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCWlmIChmTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyICYmICFyZW1vdmVkT25jZSkgewotCQkJCQkvLyBpZ25vcmUgb24gdGhlIGZpcnN0IG1hdGNoCi0JCQkJCXJlbW92ZWRPbmNlID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXQncyBub3QgdGhlIG9uZSB3ZSBhcmUgcmVtb3ZpbmcKLQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZkxpc3RlbmVyc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZSBvbGQKLQkJCS8vIG9uZQotCQkJZkxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHICYmIFV0aWxpdGllcy5jb250YWlucyhmTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHJlbW92ZWQgb25jZSBidXQgc3RpbGwgbGlzdGVuaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jdm9pZCBzaWduYWxMaWZlY3ljbGVFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChMb2dnZXIuREVCVUdfTElGRUNZQ0xFKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWxMaWZlY3ljbGVFdmVudCBmaXJlZCBmb3IgIiArIGV2ZW50LmdldE1vZGVsKCkuZ2V0SWQoKSArICI6ICIgKyBldmVudC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGVsTGlmZWN5Y2xlRXZlbnQgZmlyZWQgZm9yICIgKyBldmVudC5nZXRNb2RlbCgpLmdldElkKCkgKyAiOiAiICsgZXZlbnQudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCS8vIFdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlIGxpc3RlbmVyIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZQotCQkvLyBsaXN0ZW5lciBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJLy8gb25seSBvbmUgdHlwZSBvZiBsaXN0ZW5lciBmb3Igbm93IC4uLiB0aGlzIGNvdWxkIGJlY29tZQotCQkJCS8vIG1vcmUgY29tcGxleAotCQkJCWlmICgoZXZlbnQuZ2V0SW50ZXJuYWxUeXBlKCkgJiBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQpIHsKLQkJCQkJbGlzdGVuZXIucHJvY2Vzc1ByZU1vZGVsRXZlbnQoZXZlbnQpOwotCQkJCX0KLQkJCQlpZiAoKGV2ZW50LmdldEludGVybmFsVHlwZSgpICYgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQpIHsKLQkJCQkJbGlzdGVuZXIucHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTGlmZWN5Y2xlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FiNmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLS8qKgotICogVGhpcyBpcyBhbiBlYXJseSB2ZXJzaW9uIG9mIGEgY2xhc3MgdGhhdCBtYXkgY2hhbmdlIG92ZXIgdGhlIG5leHQgZmV3Ci0gKiBtaWxlc3RvbmVzLgotICovCi0KLQotcHVibGljIGNsYXNzIE1vZGVsTGlmZWN5Y2xlRXZlbnQgewotCi0KLQkvLyB0aGlzIGxpc3QgaXMgZm9yICJwdWJsaWMiIGNvbnN1bXB0aW9uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfU0FWRUQgPSAweDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVMRUFTRUQgPSAweDAwMDAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0RPQ1VNRU5UX0NIQU5HRUQgPSAweDAwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfRElSVFlfU1RBVEUgPSAweDAwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVWRVJUPSAweDAwMDU7Ci0KLQkvLyBUT0RPOiBmaW5pc2ggc3VwcG9ydCBmb3IgdGhlc2UKLQkvLyBmb2xsb3dpbmcgbm90IGltcGxlbWVudGVkIHlldAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFSU5JVElBTElaRUQgPSAweDAwMDY7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBREFQVEVSU19OT1RJRklFRCA9IDB4MDAwNzsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFU09VUkNFX01PVkVEID0gMHgwMDA4OwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCA9IDB4MDAwOTsKLQotCS8vIFRoaXMgbGlzdCAodXBwZXIgdHdvIGJ5dGVzKSBpcyBmb3Igb25seSBpbnRlcm5hbCBtZWNoYW5pc21zIGFuZAotCS8vIHN1YmNsYXNzZXMKLQkvLyBGb3Igc2ltcGxpY2l0eSB0aGV5IGFyZSAibWFza2VkIG91dCIgd2hlbiBjbGllbnQgY2FsbHMgZ2V0VHlwZSgpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFJFX0VWRU5UID0gMHgwMTAwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVNLID0gMHgwMEZGOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBPU1RfRVZFTlQgPSAweDAyMDA7Ci0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0JcHJpdmF0ZSBpbnQgZlR5cGU7Ci0KLQlwdWJsaWMgTW9kZWxMaWZlY3ljbGVFdmVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxMaWZlY3ljbGVFdmVudChpbnQgdHlwZSkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxMaWZlY3ljbGVFdmVudChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHR5cGUpIHsKLQkJdGhpcyh0eXBlKTsKLQkJZk1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlYnVnU3RyaW5nKGludCB0eXBlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUgJiBNQVNLKSB7Ci0JCQljYXNlIE1PREVMX1NBVkVEIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfU0FWRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVMX1JFTEVBU0VEIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfUkVMRUFTRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVMX0RPQ1VNRU5UX0NIQU5HRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9ET0NVTUVOVF9DSEFOR0VEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFTF9ESVJUWV9TVEFURSA6Ci0JCQkJcmVzdWx0ID0gIk1PREVMX0RJUlRZX1NUQVRFIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJLyoKLQkJCSAqIGNhc2UgTU9ERUxfUkVJTklUSUFMSVpFRCA6IHJlc3VsdCA9ICJNT0RFTF9SRUlOSVRJQUxJWkVEIjsKLQkJCSAqIGJyZWFrOyBjYXNlIE1PREVMX1JFTE9BREVEIDogcmVzdWx0ID0gIk1PREVMX1JFTE9BREVEIjsgYnJlYWs7Ci0JCQkgKiBjYXNlIEFEQVBURVJTX05PVElGSUVEIDogcmVzdWx0ID0gIkFEQVBURVJTX05PVElGSUVEIjsgYnJlYWs7Ci0JCQkgKiBjYXNlIE1PREVMX1JFU09VUkNFX01PVkVEIDogcmVzdWx0ID0gIk1PREVMX1JFU09VUkNFX01PVkVEIjsKLQkJCSAqIGJyZWFrOyBjYXNlIE1PREVMX1JFU09VUkNFX0RFTEVURUQgOiByZXN1bHQgPQotCQkJICogIk1PREVMX1JFU09VUkNFX0RFTEVURUQiOyBicmVhazsKLQkJCSAqLwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTW9kZWxMaWZlY3ljbGVFdmVudCBkaWQgbm90IGhhdmUgdmFsaWQgdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEludGVybmFsVHlwZSgpIHsKLQotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0KLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0KLQkJLy8gZm9yIG5vdywgd2UnbGwgbWFzayB0eXBlIHRvICJwdWJsaWMiIG9uZXMgdGhpcyBlYXN5Ci0JCS8vIHdheSAuLi4gYnV0IEkga25vdyB0aGVyZSBtdXN0IGJlIGEgYmV0dGVyIHdheQotCQlyZXR1cm4gZlR5cGUgJiBNQVNLOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSAiTW9kZWxMaWZlY3ljbGVFdmVudDogIiArIGRlYnVnU3RyaW5nKGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbE1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjMzAwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5OdWxsTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Qcm9qZWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0vKioKLSAqIE5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLCByZWZlcmVuY2VkIG9yIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZywgcmV0cml2aW5nLCBhbmQgY2FjaGluZwotICogU3RydWN0dXJlZE1vZGVscyBJdCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBvYmplY3RzIGJ5IGFuIGlkIHdoaWNoIGlzCi0gKiB0eXBpY2FsbHkgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZXNvdXJjZXMgVVJJLiBOb3RlOiBJdHMgaW1wb3J0YW50IHRoYXQKLSAqIGFsbCBjbGllbnRzIHRoYXQgc2hhcmUgYSByZXNvdXJjZSBkbyBzbyB1c2luZyA8Yj5pZGVudGljYWwgPC9iPgotICogaWRlbnRpZmllcnMsIG9yIGVsc2UgZGlmZmVyZW50IGluc3RhbmNlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHJpZXZlZCwKLSAqIGV2ZW4gaWYgdGhleSBhbGwgdGVjaG5pY2FsbHkgcG9pbnQgdG8gdGhlIHNhbWUgcmVzb3VyY2Ugb24gdGhlIGZpbGUgc3lzdGVtLgotICogVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGVzIGEgY29udmVuaWVudCBwbGFjZSB0byByZWdpc3RlciBNb2RlbCBMb2FkZXJzIGFuZAotICogRHVtcGVycyBiYXNlZCBvbiAndHlwZScuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbE1hbmFnZXJJbXBsIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlciB7Ci0KLQlzdGF0aWMgY2xhc3MgRW51bWVyYXRlZE1vZGVsSWRzIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotCi0JCUVudW1lcmF0aW9uIGZTaGFyZWRPYmplY3RLZXlzOwotCi0JCXByb3RlY3RlZCBFbnVtZXJhdGVkTW9kZWxJZHMoRGljdGlvbmFyeSBzaGFyZWRPYmplY3RzKSB7Ci0KLQkJCWlmIChzaGFyZWRPYmplY3RzID09IG51bGwpIHsKLQkJCQkvLyBpZiBubyBzaGFyZWQgb2JqZWN0cyB5ZXQsIHJldHVybiBlbXB0eSBlbnVtZXJhdGlvbgotCQkJCWZTaGFyZWRPYmplY3RLZXlzID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTaGFyZWRPYmplY3RLZXlzID0gc2hhcmVkT2JqZWN0cy5rZXlzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0KLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZlNoYXJlZE9iamVjdEtleXMgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBmU2hhcmVkT2JqZWN0S2V5cy5oYXNNb3JlRWxlbWVudHMoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCi0JCQlpZiAoZlNoYXJlZE9iamVjdEtleXMgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJcmV0dXJuIGZTaGFyZWRPYmplY3RLZXlzLm5leHRFbGVtZW50KCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUmVhZEVkaXRUeXBlIHsKLQkJUmVhZEVkaXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIERhdGEgY2xhc3MgdG8gdHJhY2sgb3VyIHNoYXJlZCBvYmplY3RzCi0JICovCi0Jc3RhdGljIGNsYXNzIFNoYXJlZE9iamVjdCB7Ci0JCWludCByZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCWludCByZWZlcmVuY2VDb3VudEZvclJlYWQ7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgdGhlU2hhcmVkTW9kZWw7Ci0KLQkJU2hhcmVkT2JqZWN0KElTdHJ1Y3R1cmVkTW9kZWwgc2hhcmVkTW9kZWwpIHsKLQkJCXRoZVNoYXJlZE1vZGVsID0gc2hhcmVkTW9kZWw7Ci0JCQlyZWZlcmVuY2VDb3VudEZvclJlYWQgPSAwOwotCQkJcmVmZXJlbmNlQ291bnRGb3JFZGl0ID0gMDsKLQkJfQotCX0KLQotCXByaXZhdGUgRXhjZXB0aW9uIGRlYnVnRXhjZXB0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIE91ciBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNb2RlbE1hbmFnZXJJbXBsIGluc3RhbmNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBSRUFEX0JVRkZFUl9TSVpFID0gNDA5NjsKLQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgd2lsbCBiZSBtYWRlIHJlc3RyaWN0ZWQgYWNjZXNzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJTW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCi0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBNb2RlbE1hbmFnZXJJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgZmluYWwgUmVhZEVkaXRUeXBlIEVESVQgPSBuZXcgUmVhZEVkaXRUeXBlKCJlZGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPdXIgY2FjaGUgb2YgbWFuYWdlZCBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSBEaWN0aW9uYXJ5IGZNYW5hZ2VkT2JqZWN0czsKLQotCXByaXZhdGUgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotCXByaXZhdGUgaW50IG1vZGVsTWFuYWdlclN0YXRlQ2hhbmdpbmc7Ci0JcHJpdmF0ZSBmaW5hbCBSZWFkRWRpdFR5cGUgUkVBRCA9IG5ldyBSZWFkRWRpdFR5cGUoInJlYWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW50ZW50aWFsbHkgZGVmYXVsdCBhY2Nlc3Mgb25seS4KLQkgKiAKLQkgKi8KLQlNb2RlbE1hbmFnZXJJbXBsKCkgewotCi0JCXN1cGVyKCk7Ci0JCWZNYW5hZ2VkT2JqZWN0cyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkNyZWF0ZU1vZGVsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKHNoYXJlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlkLCBoYW5kbGVyLCByZXNvbHZlcik7Ci0JCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCQlsb2FkZXIubG9hZChVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIG1vZGVsLCBlbmNvZGluZ1J1bGUpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3ZlIGFscmVhZHkgZm91bmQKLQkJCQloYW5kbGVQcm9ncmFtRXJyb3IoZSk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGFkZCB0byBvdXIgY2FjaGUKLQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG1vZGVsKTsKLQkJCQlfaW5pdENvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgc2hhcmVkIG9iamVjdCBpcyBpbml0aWFsbHkgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseQotCQkJLy8gaW5jcmVtZW50IGl0cyByZWYgY291bnQsCi0JCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJfQotCQkvLyB3ZSBleHBlY3QgdG8gYWx3YXlzIHJldHVybiBzb21ldGhpbmcKLQkJaWYgKHNoYXJlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQlkZWJ1Z0V4Y2VwdGlvbiA9IG5ldyBFeGNlcHRpb24oImluc3RhbmNlIG9ubHkgZm9yIHN0YWNrIHRyYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IG5vIG1vZGVsIHJlY29yZGVkIGZvciBpZCAiICsgaWQsIGRlYnVnRXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQkvLyBub3RlOiBjbGllbnRzIG11c3QgY2FsbCByZWxlYXNlIGZvciBlYWNoIHRpbWUgdGhleSBjYWxsIGdldC4KLQkJcmV0dXJuIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkNyZWF0ZU1vZGVsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGlkIG1heSBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKHNoYXJlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlkLCBoYW5kbGVyLCByZXNvbHZlcik7Ci0JCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAibW9kZWwgd2FzIHJlcXVlc3RlZCBmb3IgaWQgIiArIGlkICsgIiB3aXRob3V0IGEgY29udGVudCBJbnB1dFN0cmVhbSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJbG9hZGVyLmxvYWQoaWQsIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgbW9kZWwsIGVuY29kaW5nLCBsaW5lRGVsaW1pdGVyKTsKLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5IGZvdW5kCi0JCQkJaGFuZGxlUHJvZ3JhbUVycm9yKGUpOwotCQkJfQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChtb2RlbCk7Ci0JCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW5pdGlhbGx5IGluIG91ciBjYWNoZSwgdGhlbiBzaW1wbHkKLQkJCS8vIGluY3JlbWVudCBpdHMgcmVmIGNvdW50LAotCQkJLy8gYW5kIHJldHVybiB0aGUgb2JqZWN0LgotCQkJX2luY3JDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCX0KLQkJLy8gd2UgZXhwZWN0IHRvIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbCBnZXQuCi0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25DcmVhdGVNb2RlbChTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGxvYWRlci5jcmVhdGVNb2RlbCgpOwotCQkvLyBpbiB0aGUgcGFzdCwgaWQgd2FzIG51bGwgZm9yICJ1bm1hbmFnZWQiIGNhc2UsIHNvIHdlIHdvbid0Ci0JCS8vIHRyeSBhbmQgc2V0IGl0Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0SWQoaWQpOwotCQl9Ci0JCXJlc3VsdC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCXJlc3VsdC5zZXRSZXNvbHZlcihyZXNvbHZlcik7Ci0JCS8vIHNvbWUgb2J2aW91cyByZWR1bmFuY3kgaGVyZSB0aGF0IG1heWJlIGNvdWxkIGJlIGltcHJvdmVkCi0JCS8vIGluIGZ1dHVyZSwgYnV0IGlzIG5lY2Vzc2FyeSBmb3Igbm93Ci0JCXJlc3VsdC5zZXRCYXNlTG9jYXRpb24oaWQpOwotCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJcmVzb2x2ZXIuc2V0RmlsZUJhc2VMb2NhdGlvbihpZCk7Ci0JCX0KLQkJYWRkRmFjdG9yaWVzKHJlc3VsdCwgaGFuZGxlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBpRmlsZSwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkJaWYgKGlGaWxlICE9IG51bGwgJiYgaUZpbGUuZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjYWxjdWxhdGVVUklSZXNvbHZlcihpRmlsZSk7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlGaWxlLmdldENvbnRlbnRzKHRydWUpKTsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaW5wdXRTdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLCBlbmNvZGluZ1J1bGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBpRmlsZSwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjYWxjdWxhdGVVUklSZXNvbHZlcihpRmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLCBlbmNvZGluZywgbGluZURlbGltaXRlcik7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uR2V0TW9kZWwoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIsIFVSSVJlc29sdmVyIHJlc29sdmVyLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGlkIG1heSBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCQltb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChmaWxlKTsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobW9kZWwpOwotCQkJCQlfaW5pdENvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBzaGFyZWQgb2JqZWN0IGlzIGluaXRpYWxseSBpbiBvdXIgY2FjaGUsIHRoZW4gc2ltcGx5Ci0JCQkJLy8gaW5jcmVtZW50IGl0cyByZWYgY291bnQsCi0JCQkJLy8gYW5kIHJldHVybiB0aGUgb2JqZWN0LgotCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJfQotCi0JCQkvLyBpZiB3ZSBkb24ndCBrbm93IGhvdyB0byBjcmVhdGUgYSBtb2RlbAotCQkJLy8gZm9yIHRoaXMgdHlwZSBvZiBmaWxlLCByZXR1cm4gbnVsbAotCQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbAotCQkJCS8vIGdldC4KLQkJCQltb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIFNoYXJlZE9iamVjdCBfY29tbW9uTmV3TW9kZWwoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBhU2hhcmVkTW9kZWwgPSBudWxsOwotCQkvLyBGaXJzdCwgY2hlY2sgaWYgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgb24gZmlsZSBzeXN0ZW0uCi0JCS8vIGlmIGlzIGRvZXMsIHRoZW4gdGhyb3cgUmVzb3VyY2UgaW4gVXNlIGlmZiBmb3JjZT09ZmFsc2UKLQotCQlpZiAoaUZpbGUuZXhpc3RzKCkgJiYgIWZvcmNlKSB7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKCk7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwgJiYgIWZvcmNlKSB7Ci0JCQkvLyBpZiBpbiBjYWNoZSBhbHJlYWR5LCBhbmQgZm9yY2UgaXMgbm90IHRydWUsIHRoZW4gdGhpcyBpcyBhbgotCQkJLy8gZXJyb3IKLQkJCS8vIGluIGNhbGwKLQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCX0KLQotCQkvLyBpZiB3ZSBnZXQgdG8gaGVhciB3aXRob3V0IGFib3ZlIGV4Y2VwdGlvbnMsIHRoZW4gYWxsIGlzIG9rCi0JCS8vIHRvIGdldCBtb2RlbCBsaWtlIG5vcm1hbCwgYnV0IHNldCAnbmV3JyBhdHRyaWJ1dGUgKHdoZXJlIHRoZQotCQkvLyAnbmV3JyBhdHRyaWJ1dGUgbWVhbnMgdGhpcyBpcyBhIG1vZGVsIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nCi0JCS8vIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JCWFTaGFyZWRNb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChpRmlsZSk7Ci0JCWFTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZSh0cnVlKTsKLQkJc2hhcmVkT2JqZWN0ID0gYWRkVG9DYWNoZShpZCwgYVNoYXJlZE1vZGVsKTsKLQkJLy8gd2hlbiByZXNvdXJjZSBpcyBwcm92aWRlZCwgd2UgY2FuIHNldAotCQkvLyBzeW5jaHJvbml6YXRpb24gc3RhbXAgLi4uIG90aGVyd2lzZSBjbGllbnQgc2hvdWxkCi0JCS8vIE5vdGU6IG9uZSBjbGllbnQgd2hpY2ggZG9lcyB0aGlzIGlzIEZpbGVNb2RlbFByb3ZpZGVyLgotCQlhU2hhcmVkTW9kZWwucmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcChpRmlsZSk7Ci0JCXJldHVybiBzaGFyZWRPYmplY3Q7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgX2dldE1vZGVsRm9yKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFJlYWRFZGl0VHlwZSBhY2Nlc3NUeXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlTdHJpbmcgaWQgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2FsY3VsYXRlSWQoZG9jdW1lbnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAidW5rbm93biBJU3RydWN0dXJlZERvY3VtZW50ICIgKyBkb2N1bWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJX2luY3JDb3VudChzaGFyZWRPYmplY3QsIGFjY2Vzc1R5cGUpOwotCQkJbW9kZWwgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChkb2N1bWVudCk7Ci0JCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG1vZGVsKTsKLQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCBhY2Nlc3NUeXBlKTsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBfaW5jckNvdW50KFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QsIFJlYWRFZGl0VHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlID09IFJFQUQpIHsKLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQrKzsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IEVESVQpIHsKLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQrKzsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pbml0Q291bnQoU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCwgUmVhZEVkaXRUeXBlIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gUkVBRCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBFRElUKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID0gMTsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb2RlbCwgIm1vZGVsIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5LCAiRmFjdG9yeSBSZWdpc3RyeSBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZhY3RvcnlMaXN0ID0gaGFuZGxlci5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCWFkZEZhY3Rvcmllcyhtb2RlbCwgZmFjdG9yeUxpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTGlzdCBmYWN0b3J5TGlzdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZGVsLCAibW9kZWwgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnksICJGYWN0b3J5IFJlZ2lzdHJ5IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIE5vdGU6IHdlIGFkZCBhbGwgb2YgdGhlbSBmcm9tIGhhbmRsZXIsIGV2ZW4gaWYKLQkJLy8gYWxyZWFkeSBleGlzdHMuIE1heSBuZWVkIHRvIHJlY29uc2lkZXIgdGhpcy4KLQkJaWYgKGZhY3RvcnlMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjdG9yeUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXJlZE9iamVjdCBhZGRUb0NhY2hlKFN0cmluZyBpZCwgSVN0cnVjdHVyZWRNb2RlbCBhU2hhcmVkTW9kZWwpIHsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdDsKLQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChhU2hhcmVkTW9kZWwpOwotCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQlyZXR1cm4gc2hhcmVkT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBpZCBwcm92aWRlcyBhIGNvbW1vbiB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBpZCBmcm9tIHRoZSBpbnB1dAotCSAqIC4uLiBuZWVkZWQgdG8gZ2V0IGFuZCBzYXZlIHRoZSBtb2RlbC4gSXQgaXMgYSBzaW1wbGUgY2xhc3MgdXRpbGl0eSwgYnV0Ci0JICogaXMgYW4gaW5zdGFuY2UgbWV0aG9kIHNvIGNhbiBiZSBhY2Nlc3NlZCB2aWEgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNhbGN1bGF0ZUlkKGZpbGUpOwotCX0KLQotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBjYWxjdWxhdGVUeXBlKElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIElNb2RlbE1hbmFnZXIgbW0gPSAoKE1vZGVsTWFuYWdlclBsdWdpbikKLQkJLy8gUGxhdGZvcm0uZ2V0UGx1Z2luKE1vZGVsTWFuYWdlclBsdWdpbi5JRCkpLmdldE1vZGVsTWFuYWdlcigpOwotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgY2QgPSBjci5nZXRIYW5kbGVyRm9yKGlGaWxlKTsKLQkJcmV0dXJuIGNkOwotCX0KLQotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBjYWxjdWxhdGVUeXBlKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBjZCA9IGNyLmdldEhhbmRsZXJGb3IoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJcmV0dXJuIGNkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgVVJJUmVzb2x2ZXIgY2FsY3VsYXRlVVJJUmVzb2x2ZXIoSUZpbGUgZmlsZSkgewotCQkvLyBOb3RlOiBzZWUgY29tbWVudCBpbiBwbHVnaW4ueG1sIGZvciBwb3RlbnRpYWxseQotCQkvLyBicmVha2luZyBjaGFuZ2UgaW4gYmVoYXZpb3IuCi0KLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKTsKLQkJaWYgKHJlc29sdmVyID09IG51bGwpCi0JCQlyZXNvbHZlciA9IG5ldyBQcm9qZWN0UmVzb2x2ZXIocHJvamVjdCk7Ci0JCXJlc29sdmVyLnNldEZpbGVCYXNlTG9jYXRpb24oZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0JLyoKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBhcHBlYXJzIGluIGJvdGggTW9kZWxNYW5hZ2VySW1wbCBhbmQgSlNFZGl0b3IgKHdpdGgKLQkgKiBqdXN0IGEgbWlub3IgZGlmZmVyZW5jZSkuIFRoZXkgc2hvdWxkIGJlIGtlcHQgdGhlIHNhbWUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBoYW5kbGVkIGJ5IHBsYXRmb3JtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnZlcnRMaW5lRGVsaW1pdGVycyhJRG9jdW1lbnQgZG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGU6IGNhbGN1bGF0ZVR5cGUoaUZpbGUpIHJldHVybnMgYSBkZWZhdWx0IHhtbCBtb2RlbCBoYW5kbGVyIGlmCi0JCS8vIGNvbnRlbnQgdHlwZSBpcyBudWxsLgotCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JCVN0cmluZyBlbmRPZkxpbmVDb2RlID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJZCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSk7Ci0JCS8vIGVuZE9mTGluZUNvZGUgPT0gbnVsbCBtZWFucyB0aGUgY29udGVudCB0eXBlIGRvZXMgbm90IHN1cHBvcnQgdGhpcwotCQkvLyBmdW5jdGlvbiAoZS5nLiBEVEQpCi0JCS8vIGVuZE9mTGluZUNvZGUgPT0gIiIgbWVhbnMgbm8gdHJhbnNsYXRpb24KLQkJaWYgKGVuZE9mTGluZUNvZGUgIT0gbnVsbCAmJiBlbmRPZkxpbmVDb2RlLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXJUb1VzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVuZE9mTGluZUNvZGUuZXF1YWxzKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKSkKLQkJCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1I7Ci0JCQllbHNlIGlmIChlbmRPZkxpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikpCi0JCQkJbGluZURlbGltaXRlclRvVXNlID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0xGOwotCQkJZWxzZSBpZiAoZW5kT2ZMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRikpCi0JCQkJbGluZURlbGltaXRlclRvVXNlID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSTEY7Ci0KLQkJCVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJaW50IGxpbmVDb3VudCA9IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCQlpbnQgbGluZVN0YXJ0T2Zmc2V0ID0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCBsaW5lTGVuZ3RoID0gbGluZUluZm8uZ2V0TGVuZ3RoKCk7Ci0JCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gbGluZVN0YXJ0T2Zmc2V0ICsgbGluZUxlbmd0aDsKLQotCQkJCQlpZiAoaSA8IGxpbmVDb3VudCAtIDEpIHsKLQkJCQkJCVN0cmluZyBjdXJyZW50TGluZURlbGltaXRlciA9IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSk7Ci0JCQkJCQlpZiAoY3VycmVudExpbmVEZWxpbWl0ZXIgIT0gbnVsbCAmJiBjdXJyZW50TGluZURlbGltaXRlci5jb21wYXJlVG8obGluZURlbGltaXRlclRvVXNlKSAhPSAwKQotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KGxpbmVFbmRPZmZzZXQsIGN1cnJlbnRMaW5lRGVsaW1pdGVyLmxlbmd0aCgpLCBsaW5lRGVsaW1pdGVyVG9Vc2UpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChtdWx0aVRleHRFZGl0LmdldENoaWxkcmVuU2l6ZSgpID4gMCkKLQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShkb2N1bWVudCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJLy8ganVzdCBhZGRpbmcgZ2VuZXJpYyBydW50aW1lIGhlcmUsIHVudGlsIHdob2xlIG1ldGhvZAotCQkJCS8vIGRlbGV0ZWQuCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHVzZWQgdG8gYmUgaW4gbG9hZGVyLCBidXQgaGFzIGJlZW4gbW92ZWQgaGVyZQotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBjb3B5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCA9IG1vZGVsOwotCQlJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlciA9IG9sZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gbW9kZWxIYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCS8vIG5ld01vZGVsID0gbG9hZGVyLm5ld01vZGVsKCk7Ci0JCW5ld01vZGVsID0gbG9hZGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJLy8gbmV3SWQsIG9sZE1vZGVsLmdldFJlc29sdmVyKCksIG9sZE1vZGVsLmdldE1vZGVsTWFuYWdlcigpKTsKLQkJbmV3TW9kZWwuc2V0TW9kZWxIYW5kbGVyKG1vZGVsSGFuZGxlcik7Ci0JCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0KLQkJLy8gb2xkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50ID0KLQkJLy8gb2xkU3RydWN0dXJlZERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0JCS8vIG5ld01vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQluZXdNb2RlbC5zZXRSZXNvbHZlcihvbGRNb2RlbC5nZXRSZXNvbHZlcigpKTsKLQkJbmV3TW9kZWwuc2V0TW9kZWxNYW5hZ2VyKG9sZE1vZGVsLmdldE1vZGVsTWFuYWdlcigpKTsKLQkJLy8gZHVwbGljYXRlRmFjdG9yeVJlZ2lzdHJ5KG5ld01vZGVsLCBvbGRNb2RlbCk7Ci0JCW5ld01vZGVsLnNldElkKG5ld0lkKTsKLQkJLy8gc2V0IHRleHQgb2YgbmV3IG9uZSBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZQotCQlTdHJpbmcgY29udGVudHMgPSBvbGRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRUZXh0KCk7Ci0JCW5ld01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldFRleHQodGhpcywgY29udGVudHMpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGNvcHlNb2RlbEZvckVkaXQoU3RyaW5nIG9sZElkLCBTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIGdldCB0aGUgZXhpc3RpbmcgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwob2xkSWQpOwotCQkvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCBpZ25vcmUgcmVxdWVzdCAodGhvdWdoIHRoaXMgd291bGQgbm9ybWFsbHkKLQkJLy8gYmUgYSBwcm9ncmFtbWluZyBlcnJvci4KLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gbm93IGJlIHN1cmUgbmV3TW9kZWwgZG9lcyBub3QgZXhpc3QKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQobmV3SWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCX0KLQkJLy8gZ2V0IGxvYWRlciBiYXNlZCBvbiBleGlzdGluZyB0eXBlIChub3RlIHRoZSB0eXBlIGFzc3VtcHRpb24pCi0JCS8vIE9iamVjdCB0eXBlID0gKChJU3RydWN0dXJlZE1vZGVsKSBtb2RlbCkuZ2V0VHlwZSgpOwotCQkvLyBJTW9kZWxIYW5kbGVyIHR5cGUgPSBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJLy8gSU1vZGVsTG9hZGVyIGxvYWRlciA9IChJTW9kZWxMb2FkZXIpIGdldE1vZGVsTG9hZGVycygpLmdldCh0eXBlKTsKLQkJLy8gSU1vZGVsTG9hZGVyIGxvYWRlciA9IChJTW9kZWxMb2FkZXIpIGdldE1vZGVsTG9hZGVycygpLmdldCh0eXBlKTsKLQkJLy8gYXNrIHRoZSBsb2FkZXIgdG8gY29weQotCQluZXdNb2RlbCA9IGNvcHkobW9kZWwsIG5ld0lkKTsKLQkJaWYgKG5ld01vZGVsICE9IG51bGwpIHsKLQkJCS8vIGFkZCB0byBvdXIgY2FjaGUKLQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobmV3TW9kZWwpOwotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9IDE7Ci0JCQlmTWFuYWdlZE9iamVjdHMucHV0KG5ld0lkLCBzaGFyZWRPYmplY3QpOwotCQkJdHJhY2UoImNvcGllZCBtb2RlbCIsIG5ld0lkLCBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhlIG5ldyBpbnN0YW5jZSBoYXMgbm8gY29udGVudC4gTm90ZTogdGhpcwotCSAqIHByb2R1Y2VzIGFuIHVubWFuYWdlZCBtb2RlbCwgZm9yIHRlbXBvcmFyeSB1c2UuIElmIGEgdHJ1ZSBzaGFyZWQgbW9kZWwKLQkgKiBpcyBkZXNpcmVkLCB1c2UgImNvcHkiLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVOZXdJbnN0YW5jZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBvbGRNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IGxvYWRlci5jcmVhdGVNb2RlbChvbGRNb2RlbCk7Ci0JCW5ld01vZGVsLnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJaWYgKG5ld01vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIG5ld01vZGVsKS5zZXRDb250ZW50VHlwZUlkZW50aWZpZXIob2xkTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCVVSSVJlc29sdmVyIG9sZFJlc29sdmVyID0gb2xkTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJbmV3TW9kZWwuc2V0UmVzb2x2ZXIob2xkUmVzb2x2ZXIpOwotCQl0cnkgewotCQkJbmV3TW9kZWwuc2V0SWQoRFVQTElDQVRFRF9NT0RFTCk7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2UgdGhpcyBpcyBhbiB1bm1hbmFnZWQgbW9kZWwKLQkJfQotCQkvLyBiYXNlIGxvY2F0aW9uIHNob3VsZCBiZSBudWxsLCBidXQgd2UnbGwgc2V0IHRvCi0JCS8vIG51bGwgdG8gYmUgc3VyZS4KLQkJbmV3TW9kZWwuc2V0QmFzZUxvY2F0aW9uKG51bGwpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBpdHMgYXNzdW1lIHRoYXQgSUZpbGUgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgYXMKLQkgKiBhIHJlc291cmNlIHlldC4gSWYgaXQgZG9lcywgUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgdGhlIHJlc291cmNlIGRvZXMgYWxyZWFkeSBleGlzdCwgdGhlbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IgaXMKLQkgKiB0aGUgcmlnaHQgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IFJlc291cmNlQWxyZWFkeUV4aXN0cyhpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQkJLy8gV2lsbCByZWNvbnNpZGVyIGluIGZ1dHVyZSB2ZXJzaW9uCi0JCS8vIFN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJLy8gaWYgKGlzUmVzb3VyY2VJblVzZShpZCkpIHsKLQkJLy8gdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoaUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkvLyB9Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQkvLyBmb3IgdGhpcyBBUEksICJjcmVhdGVOZXciIHdlIGFzc3VtZSB0aGUgSUZpbGUgZG9lcyBub3QgZXhpc3QgeWV0Ci0JCS8vIGFzIGNoZWNrZWQgYWJvdmUsIHNvIGp1c3QgY3JlYXRlIGVtcHR5IGRvY3VtZW50LgotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBjbGllbnRzIHNob3VsZCB2ZXJpZnkgSUZpbGUgZXhpc3RzIGJlZm9yZSB1c2luZwotCSAqIHRoaXMgbWV0aG9kLiBJZiB0aGlzIElGaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuCi0JICogY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50IGlzIHRoZSBjb3JyZWN0IEFQSSB0byB1c2UuCi0JICogCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFpRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQkJLy8gV2lsbCByZWNvbnNpZGVyIGluIGZ1dHVyZSB2ZXJzaW9uCi0JCS8vIFN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJLy8gaWYgKGlzUmVzb3VyY2VJblVzZShpZCkpIHsKLQkJLy8gdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoaUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkvLyB9Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGlGaWxlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhbiBlbXB0eQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBuZWVkZWQuIE90aGVyd2lzZSwgdXNlIElGaWxlIGZvcm0uCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBUT0RPOiB0byBiZSByZW1vdmVkIGJ5IEM0IGRvIHdlIHJlYWxseSBuZWVkIHRoaXM/IEkKLQkgKiAgICAgICAgICAgICByZWNvbW1lbmQgdG8gLSB1c2UgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKGZpbGVuYW1lLAotCSAqICAgICAgICAgICAgIG51bGwsIG51bGwpIC0gdGhlIGZpbGVuYW1lIGRvZXMgbm90IG5lZWQgdG8gcmVwcmVzZW50IGEKLQkgKiAgICAgICAgICAgICByZWFsIC0gZmlsZSwgYnV0IGNhbiB0YWtlIGZvciBmb3JtIG9mIGR1bW15LmpzcCwgdGVzdC54bWwsCi0JICogICAgICAgICAgICAgZXRjLiAtIFRoYXQgd2F5IHdlIGRvbid0IGhhcmQgY29kZSB0aGUgaGFuZGxlciwgYnV0IHNwZWNpZnkKLQkgKiAgICAgICAgICAgICB3ZSAtIHdhbnQgdGhlIGhhbmRsZXIgdGhhdCAiZ29lcyB3aXRoIiBhIGNlcnRhaW4gdHlwZSBvZiAtCi0JICogICAgICAgICAgICAgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNyLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGNvbnRlbnRUeXBlSWQpOwotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJQcm9ncmFtIGVycm9yOiBubyBtb2RlbCBoYW5kbGVyIGZvdW5kIGZvciAiICsgY29udGVudFR5cGVJZCk7IC8vJE5PTi1OTFMtMSQKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEKLQkgKiBwcm9wZXIgcGFyc2VyIGFzc2lnbmVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0tIC0gVE9ETzogdG8gYmUgcmVtb3ZlZCBieSBDNCBJIG1hcmtlZCBhcyBkZXByZWNhdGVkIHRvCi0JICogICAgICAgICAgICAgZGlzY291YWdlIHVzZSBvZiB0aGlzIG1ldGhvZC4gSXQgZG9lcyBub3QgcmVhbGx5IHdvcmsgZm9yCi0JICogICAgICAgICAgICAgSlNQIGZyYWdtZW50cywgc2luY2UgSlNQIEZyYWdtZW50cyBuZWVkIGFuIElGaWxlIHRvCi0JICogICAgICAgICAgICAgY29ycmVjdGx5IGxvb2sgdXAgdGhlIGNvbnRlbnQgc2V0dGluZ3MuIFVzZSBJRmlsZSBmb3JtCi0JICogICAgICAgICAgICAgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpc3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pOwotCQlpZiAoaXN0cmVhbSAhPSBudWxsKSB7Ci0JCQlpc3RyZWFtLnJlc2V0KCk7Ci0JCX0KLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShmaWxlbmFtZSwgaXN0cmVhbSk7Ci0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGVuYW1lLCBpc3RyZWFtKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNwZWNpYWwgY2FzZSBtZXRob2QuIFRoaXMgbWV0aG9kIHdhcyBjcmVhdGVkIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlCi0JICogdGhlcmUgaXMgYW4gZW5jb2RpbmcgZm9yIGlucHV0IHN0cmVhbSB0aGF0IHNob3VsZCBvdmVycmlkZSBhbGwgdGhlCi0JICogbm9ybWFsIHJ1bGVzIGZvciBlbmNvZGluZy4gRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGFuIGVuY29kaW5nCi0JICogKGNoYXJzZXQpIHNwZWNpZmllZCBpbiBIVFRQIHJlc3BvbnNlIGhlYWRlciwgdGhlbiB0aGF0IGVuY29kaW5nIGlzIHVzZWQKLQkgKiB0byB0cmFuc2xhdGUgdGhlIGlucHV0IHN0cmVhbSB0byBhIHN0cmluZywgYnV0IHRoZW4gdGhlIG5vcm1hbCBlbmNvZGluZwotCSAqIHJ1bGVzIGFyZSBpZ25vcmVkLCBzbyB0aGF0IHRoZSBzdHJpbmcgaXMgbm90IHRyYW5zbGF0ZWQgdHdpY2UgKGZvcgotCSAqIGV4YW1wbGUsIGlmIGl0cyBhbiBIVE1MICJmaWxlIiwgdGhlbiBldmVuIGlmIGl0IGNvbnRhaW5zIGEgY2hhcnNldCBpbgotCSAqIG1ldGEgdGFnLCBpdHMgaWdub3JlZCBzaW5jZSBpdHMgYXNzdW1lZCBpdHMgYWxsIGNvcnJlY3RseSBkZWNvZGVkIGJ5Ci0JICogdGhlIEhUVFAgY2hhcnNldC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBlbmNvZGluZyk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKGZpbGVuYW1lLCBjb250ZW50LCByZXNvbHZlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB3aGVuIHRoZSByZXNvdXJjZSBkb2VzIG5vdAotCSAqIHJlYWxseSBleGlzdCAoZS5nLiB3aGVuIGNvbnRlbnQgaXMgYmVpbmcgY3JlYXRlZCwgYnV0IGhhc24ndCBiZWVuCi0JICogd3JpdHRlbiB0byBkaXNrIHlldCkuIE5vdGUgdGhhdCBzaW5jZSB0aGUgY29udGVudCBpcyBiZWluZyBwcm92aWRlZCBhcwotCSAqIGEgU3RyaW5nLCBpdCBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgZGVjb2RlZCBjb3JyZWN0bHkgc28gbm8KLQkgKiB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgY29udGVudCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE86IGF2b2lkIGFsbCB0aGVzZSBTdHJpbmcgaW5zdGFuY2VzCi0JCVN0cmluZ0J1ZmZlciBjb250ZW50QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihjb250ZW50KTsKLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoZmlsZW5hbWUsIG51bGwpOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJU3RyaW5nQnVmZmVyIGNvbnZlcnRlZENvbnRlbnQgPSBsb2FkZXIuaGFuZGxlTGluZURlbGltaXRlcihjb250ZW50QnVmZmVyLCByZXN1bHQpOwotCQlyZXN1bHQuc2V0RW5jb2RpbmdNZW1lbnRvKG5ldyBOdWxsTWVtZW50bygpKTsKLQkJcmVzdWx0LnNldFRleHQodGhpcywgY29udmVydGVkQ29udGVudC50b1N0cmluZygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRFbXB0eU1vZGVsRm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpRmlsZSk7Ci0JCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjYWxjdWxhdGVVUklSZXNvbHZlcihpRmlsZSk7Ci0KLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IF9jb21tb25DcmVhdGVNb2RlbChpZCwgaGFuZGxlciwgcmVzb2x2ZXIpOwotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3JlIG5vdCBzaGFyaW5nCi0JCQkvLyAoZXZlbiBpZiBpdCByZWFsbHkgaXMgaW4gdXNlIC4uLiB3ZSBkb24ndCBjYXJlKQotCQkJLy8gdGhpcyBtYXkgbmVlZCB0byBiZSByZS1leGFtaW5lZC4KLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxNQU5BR0VSKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbE1hbmdlckltcGw6OmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvci4gTW9kZWwgdW5leHBlY3RlZGx5IGluIHVzZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjcmVhdGVVbk1hbmFnZWRFbXB0eU1vZGVsRm9yKGlGaWxlKTsKLQotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gcmVzdWx0LmdldE1vZGVsSGFuZGxlcigpLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGlGaWxlKTsKLQotCQlyZXN1bHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0VGV4dCh0aGlzLCBkb2N1bWVudC5nZXQoKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJcmV0dXJuIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJTW9kZWxIYW5kbGVyUmVnaXN0cnkgY3IgPSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjci5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChjb250ZW50VHlwZUlkKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IF9jb21tb25DcmVhdGVNb2RlbChVTk1BTkFHRURfTU9ERUwsIGhhbmRsZXIsIHJlc29sdmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3JlIG5vdCBzaGFyaW5nCi0JCQkvLyAoZXZlbiBpZiBpdCByZWFsbHkgaXMgaW4gdXNlIC4uLiB3ZSBkb24ndCBjYXJlKQotCQkJLy8gdGhpcyBtYXkgbmVlZCB0byBiZSByZS1leGFtaW5lZC4KLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxNQU5BR0VSKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbE1hbmdlckltcGw6OmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvci4gTW9kZWwgdW5leHBlY3RlZGx5IGluIHVzZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0ZWRNb2RlbElkcyBnZXRFbnVtZXJhdGVkTW9kZWxJZHMoKSB7Ci0JCS8vIHJldHVybiBuZXcgaW5zdGFuY2UgZWFjaCB0aW1lIHNvIHdpbGwgImFjdCBsaWtlIiBwcm9wZXIgZW51bWVyYXRpb24KLQkJLy8gdG8gY2xpZW50Ci0JCS8vIChpZiB3ZSBjYWNoZWQsIG1heSBub3QgYmUgYXQgYmVnaW5uaW5nKS4KLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkTW9kZWxJZHMoZk1hbmFnZWRPYmplY3RzKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbChPYmplY3QgaWQpIHsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJLy8gaWYgbm90LCB0aGVuIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbAotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlFbnVtZXJhdGlvbiBpZHMgPSBnZXRFbnVtZXJhdGVkTW9kZWxJZHMoKTsKLQkJd2hpbGUgKGlkcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IHBvdGVudGlhbElkID0gaWRzLm5leHRFbGVtZW50KCk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHRlbXBSZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsKHBvdGVudGlhbElkKTsKLQkJCWlmIChkb2N1bWVudCA9PSB0ZW1wUmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQocG90ZW50aWFsSWQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBnZXRNb2RlbCBtZXRob2QsIGV4Y2VwdCB0aGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGNyZWF0ZSBhIG1vZGVsLiBUaGlzIG1ldGhvZCBkb2VzIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IChpZiBpdAotCSAqIGV4aXN0cykuIElmIHRoZSBtb2RlbCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBjYWNoZSBvZiBtb2RlbHMsCi0JICogbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdCBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBnZXRNb2RlbCBtZXRob2QsIGV4Y2VwdCB0aGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGNyZWF0ZSBhIG1vZGVsLiBUaGlzIG1ldGhvZCBkb2VzIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IChpZiBpdAotCSAqIGV4aXN0cykuIElmIHRoZSBtb2RlbCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBjYWNoZSBvZiBtb2RlbHMsCi0JICogbnVsbCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgZm9ybSAtIHRoaXMgb25lIHdpbGwgYmVjb21lIHByb3RlY3RlZCBvciBwcml2YXRlCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KE9iamVjdCBpZCkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkvLyBpZiBzaGFyZWQgb2JqZWN0IGlzIGluIG91ciBjYWNoZSwgdGhlbiBzaW1wbHkgaW5jcmVtZW50IGl0cyByZWYKLQkJCS8vIGNvdW50LAotCQkJLy8gYW5kIHJldHVybiB0aGUgb2JqZWN0LgotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCsrOwotCQkJcmVzdWx0ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQkJdHJhY2UoImdvdCBleGlzdGluZyBtb2RlbCBmb3IgRWRpdDogIiwgaWQpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFjZSgiICAgaW5jcmVtZW50ZWQgcmVmZXJlbmNlQ291bnRGb3JFZGl0ICIsIGlkLCBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogdXNlcnMgb2YgdGhpcyAnbW9kZWwnIG11c3Qgc3RpbGwgcmVsZWFzZSBpdCB3aGVuIGZpbmlzaGVkLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSdzIG5vdCBhIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCUVudW1lcmF0aW9uIGlkcyA9IGdldEVudW1lcmF0ZWRNb2RlbElkcygpOwotCQl3aGlsZSAoaWRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3QgcG90ZW50aWFsSWQgPSBpZHMubmV4dEVsZW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGVtcFJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWwocG90ZW50aWFsSWQpOwotCQkJaWYgKGRvY3VtZW50ID09IHRlbXBSZXN1bHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpIHsKLQkJCQlyZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChwb3RlbnRpYWxJZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdCBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBnZXRNb2RlbCBtZXRob2QsIGV4Y2VwdCB0aGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGNyZWF0ZSBhIG1vZGVsLiBUaGlzIG1ldGhvZCBkb2VzIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IChpZiBpdAotCSAqIGV4aXN0cykuIElmIHRoZSBtb2RlbCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBjYWNoZSBvZiBtb2RlbHMsCi0JICogbnVsbCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgZm9ybSAtIHRoaXMgb25lIHdpbGwgYmVjb21lIHByb3RlY3RlZCBvciBwcml2YXRlCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKE9iamVjdCBpZCkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkvLyBpZiBzaGFyZWQgb2JqZWN0IGlzIGluIG91ciBjYWNoZSwgdGhlbiBzaW1wbHkgaW5jcmVtZW50IGl0cyByZWYKLQkJCS8vIGNvdW50LAotCQkJLy8gYW5kIHJldHVybiB0aGUgb2JqZWN0LgotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCsrOwotCQkJcmVzdWx0ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRE1XOiBUb20sIHRoaXMgaXMgInNwZWNpYWwiIGZvciBsaW5rcyBidWlsZGVyIEFzc3VtaW5nIGl0cwotCSAqICAgICAgICAgICAgIHN0aWxsIG5lZWRlZCwgd291bGRuJ3QgaXQgYmUgYmV0dGVyIHRvIGNoYW5nZSB0bwotCSAqICAgICAgICAgICAgIGdldEV4aXN0aW5nTW9kZWxzKCk/IC0tIHdpbGwgYmUgcmVtb3ZlZC4gSXRzIG5vdCB0aHJlYWQKLQkgKiAgICAgICAgICAgICBzYWZlIGZvciBvbmUgdGhyZWFkIHRvIGdldCB0aGUgRW51bWVyYXRpb24sIHdoZW4gdW5kZXJseWluZwotCSAqICAgICAgICAgICAgIGRhdGEgY291bGQgYmUgY2hhbmdlZCBpbiBhbm90aGVyIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEVudW1lcmF0aW9uIGdldEV4aXN0aW5nTW9kZWxJZHMoKSB7Ci0KLQkJRW51bWVyYXRpb24gcmVzdWx0ID0gZ2V0RW51bWVyYXRlZE1vZGVsSWRzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETzogcmVwbGFjZSAob3Igc3VwcGxlbWVudCkgdGhpcyBpcyBhICJtb2RlbCBpbmZvIiBhc3NvY2lhdGlvbiB0byB0aGUKLQkvLyBJRmlsZSB0aGF0IGNyZWF0ZWQgdGhlIG1vZGVsCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCU9iamVjdCBpZCA9IG1vZGVsLmdldElkKCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXBhdGggPSBpZC50b1N0cmluZygpOwotCQl9Ci0JCS8vIFRPT0RPIG5lZWRzIHJld29yayBmb3IgbGlua2VkIHJlc291cmNlcwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBwcmltYXJ5IGZvcm1zIHRvIGdldCBhIG1hbmFnZWQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIEVESVQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBFRElULCBlbmNvZGluZ1J1bGUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIEVESVQsIGVuY29kaW5nLCBsaW5lRGVsaW1pdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIF9nZXRNb2RlbEZvcihkb2N1bWVudCwgRURJVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIG9yIFN0cmluZyBmb3JtCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChPYmplY3QgaWQsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0cmluZ0lkID0gaWQudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGdldE1vZGVsRm9yRWRpdChzdHJpbmdJZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCByZXNvbHZlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgSUZpbGUgb3IgU3RyaW5nIGZvcm0KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KE9iamVjdCBpZCwgT2JqZWN0IG1vZGVsVHlwZSwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0cmluZ0lkID0gaWQudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGdldE1vZGVsRm9yRWRpdChzdHJpbmdJZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCByZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChTdHJpbmcgaWQsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGlkIG1heSBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCi0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaWQsIGlzdHJlYW0pOwotCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaXN0cmVhbSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCBFRElULCBudWxsLCBudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJubyBtb2RlbCBoYW5kbGVyIGZvdW5kIGZvciBpZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByaW1hcnkgZm9ybXMgdG8gZ2V0IGEgbWFuYWdlZCBtb2RlbAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBSRUFELCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIFJFQUQsIGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBSRUFELCBlbmNvZGluZ05hbWUsIGxpbmVEZWxpbWl0ZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gX2dldE1vZGVsRm9yKGRvY3VtZW50LCBSRUFEKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgb3IgU3RyaW5nIGZvcm0KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKE9iamVjdCBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0cmluZ0lkID0gaWQudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGdldE1vZGVsRm9yUmVhZChzdHJpbmdJZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCByZXNvbHZlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIGZvcm0KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKE9iamVjdCBpZCwgT2JqZWN0IG1vZGVsVHlwZSwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHJpbmdJZCA9IGlkLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBnZXRNb2RlbEZvclJlYWQoc3RyaW5nSWQsIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgcmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoU3RyaW5nIGlkLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaWQsIGlzdHJlYW0pOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IF9jb21tb25DcmVhdGVNb2RlbChpc3RyZWFtLCBpZCwgaGFuZGxlciwgcmVzb2x2ZXIsIFJFQUQsIG51bGwsIG51bGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gb25seSB0ZW1wb3JhcmlseSB2aXNpYmxlCi0JICovCi0JcHVibGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCkgewotCQlpZiAoZk1vZGVsSGFuZGxlclJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZNb2RlbEhhbmRsZXJSZWdpc3RyeSA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZNb2RlbEhhbmRsZXJSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIjZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gX2NvbW1vbk5ld01vZGVsKGlGaWxlLCBmb3JjZSk7Ci0JCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQlyZXR1cm4gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IF9jb21tb25OZXdNb2RlbChpRmlsZSwgZm9yY2UpOwotCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID0gMTsKLQkJcmV0dXJuIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSZWZlcmVuY2VDb3VudChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkKLQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCArIHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpCi0JCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpCi0JCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQ7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ29udmVydExpbmVEZWxpbWl0ZXJzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSwgRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwsIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSA+IDEpIHsKLQkJCWNvbnZlcnRMaW5lRGVsaW1pdGVycyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIGlGaWxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9ncmFtRXJyb3IoVGhyb3dhYmxlIHQpIHsKLQotCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJJbXBvc3NpYmxlIFByb2dyYW0gRXJyb3IiLCB0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2hhcmVkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKQotCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkICsgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJcmVzdWx0ID0gY291bnQgPiAxOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NoYXJlZEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpCi0JCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCXJlc3VsdCA9IGNvdW50ID4gMTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKQotCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkOwotCQlyZXN1bHQgPSBjb3VudCA+IDE7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIG1hbmFnZXIgaXMgd2l0aGluIGEKLQkgKiAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIiBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTdGF0ZUNoYW5naW5nKCkgewotCi0JCXJldHVybiBtb2RlbE1hbmFnZXJTdGF0ZUNoYW5naW5nID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBpZCBvZiB0aGUgbW9kZWwuIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb3ZlTW9kZWwoT2JqZWN0IG9sZElkLCBPYmplY3QgbmV3SWQpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0LmlzTm90TnVsbChvbGRJZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChvbGRJZCk7Ci0JCS8vIGlmIG5vdCBmb3VuZCBpbiBjYWNoZSwgaWdub3JlIHJlcXVlc3QuCi0JCS8vIHRoaXMgd291bGQgbm9ybWFsbHkgYmUgYSBwcm9ncmFtIGVycm9yCi0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShvbGRJZCk7Ci0JCQlmTWFuYWdlZE9iamVjdHMucHV0KG5ld0lkLCBzaGFyZWRPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgaWFuYUVuY29kaW5nTmFtZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgYWxsVGV4dCA9IG51bGw7Ci0JCWlmICgoaWFuYUVuY29kaW5nTmFtZSAhPSBudWxsKSAmJiAoaWFuYUVuY29kaW5nTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJU3RyaW5nIGVuYyA9IENvZGVkSU8uZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChpYW5hRW5jb2RpbmdOYW1lKTsKLQkJCWlmIChlbmMgPT0gbnVsbCkgewotCQkJCS8vIGlmIG5vIGNvbnZlcnNpb24gd2FzIHBvc3NpYmxlLCBsZXQncyBhc3N1bWUgdGhhdAotCQkJCS8vIHRoZSBlbmNvZGluZyBpcyBhbHJlYWR5IGEgamF2YSBlbmNvZGluZyBuYW1lLCBzbyB3ZSdsbAotCQkJCS8vIHByb2NlZWQgd2l0aCB0aGF0IGFzc3VtcHRpb24uIFRoaXMgaXMgdGhlIGNhc2UsIGZvcgotCQkJCS8vIGV4YW1wbGUsCi0JCQkJLy8gZm9yIHRoZSByZWxvYWQoKSBwcm9jZWR1cmUuCi0JCQkJLy8gSWYgaW4gZmFjdCBpdCBpcyBub3QgYSB2YWxpZCBqYXZhIGVuY29kaW5nLCB0aGVuCi0JCQkJLy8gdGhlICJhbGxUZXh0PSIgbGluZSB3aWxsIGNhdXNlIGFuCi0JCQkJLy8gVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCQkJCWVuYyA9IGlhbmFFbmNvZGluZ05hbWU7Ci0JCQl9Ci0JCQlhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgZW5jKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3ZSBub3JtYWxseSBhc3N1bWUgZW5jb2RpbmcgaXMgcHJvdmlkZWQgZm9yIHRoaXMgbWV0aG9kLCBidXQgaWYKLQkJCS8vIG5vdCwKLQkJCS8vIHdlJ2xsIHVzZSBwbGF0Zm9ybSBkZWZhdWx0Ci0JCQlhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOwotCQl9Ci0JCXJldHVybiBhbGxUZXh0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlYWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbVJlYWRlciBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgbnVtUmVhZCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgdEJ1ZmZbXSA9IG5ldyBjaGFyW1JFQURfQlVGRkVSX1NJWkVdOwotCQl3aGlsZSAoKG51bVJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKHRCdWZmLCAwLCB0QnVmZi5sZW5ndGgpKSAhPSAtMSkgewotCQkJYnVmZmVyLmFwcGVuZCh0QnVmZiwgMCwgbnVtUmVhZCk7Ci0JCX0KLQkJLy8gcmVtZW1iZXIgLS0gd2UgZGlkbid0IG9wZW4gc3RyZWFtIC4uLiBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIjcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJLy8gZ2V0SGFuZGxlciAoYXNzdW1lIGl0cyB0aGUgIm5ldyBvbmUiKQotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJLy8gZ2V0TG9hZGVyIGZvciB0aGF0IG5ldyBvbmUKLQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJLy8gYXNrIGl0IHRvIHJlaW5pdGlhbGl6ZQotCQltb2RlbCA9IGxvYWRlci5yZWluaXRpYWxpemUobW9kZWwpOwotCQkvLyB0aGUgbG9hZGVyIHNob3VsZCBjaGVjayB0byBzZWUgaWYgdGhlIG9uZSBpdCByZWNlaXZlZAotCQkvLyBpcyB0aGUgc2FtZSB0eXBlIGl0IHdvdWxkIG5vcm1hbGx5IGNyZWF0ZS4KLQkJLy8gaWYgbm90LCBpdCBtdXN0ICJzdGFydCBmcm9tIHNjcmF0Y2giIGFuZCBjcmVhdGUgYSB3aG9sZQotCQkvLyBuZXcgb25lLgotCQkvLyBpZiBpdCBpcyBvZiB0aGUgc2FtZSB0eXBlLCBpdCBzaG91bGQganVzdCAncmVwbGFjZSB0ZXh0JwotCQkvLyByZXBsYWNpbmcgYWxsIHRoZSBleGlzdGluZyB0ZXh0IHdpdGggdGhlIG5ldyB0ZXh0LgotCQkvLyB0aGUgaW1wb3J0YW50IG9uZSBpcyB0aGUgSlNQIGxvYWRlciAuLi4gaXQgc2hvdWxkIGdvIHRocm91Z2gKLQkJLy8gaXRzIGVtYmVkZGVkIGNvbnRlbnQgY2hlY2tpbmcgYW5kIGluaXRpYWxpemF0aW9uCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlRnJvbUVkaXQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJT2JqZWN0IGlkID0gc3RydWN0dXJlZE1vZGVsLmdldElkKCk7Ci0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCWNsZWFudXBEaXNjYXJkZWRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVsZWFzZUZyb21FZGl0KGlkKTsKLQkJfQotCi0JfQotCQotCXN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2VGcm9tUmVhZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlPYmplY3QgaWQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SWQoKTsKLQkJaWYgKGlkLmVxdWFscyhVTk1BTkFHRURfTU9ERUwpIHx8IGlkLmVxdWFscyhEVVBMSUNBVEVEX01PREVMKSkgewotCQkJY2xlYW51cERpc2NhcmRlZE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZWxlYXNlRnJvbVJlYWQoaWQpOwotCQl9Ci0KLQl9Ci0JLyoqCi0JICogZGVmYXVsdCBmb3IgdXNlIGluIHNhbWUgcGFja2FnZSwgbm90IHN1YmNsYXNzZXMKLQkgKiAKLQkgKi8KLQlzeW5jaHJvbml6ZWQgcHJpdmF0ZSB2b2lkIHJlbGVhc2VGcm9tRWRpdChPYmplY3QgaWQpIHsKLQkJLy8gSVNTVUU6IG1hbnkgb2YgdGhlc2UgYXNzZXJ0cyBzaG91bGQgYmUgY2hhbmdlZCB0byAibG9ncyIKLQkJLy8gYW5kIGNvbnRpbnVlIHRvIGxpbXAgYWxvbmc/Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQotCQkvLyBJU1NVRTogaGVyZSB3ZSBuZWVkIGJldHRlciAic3BlYyIgd2hhdCB0byBkbyB3aXRoCi0JCS8vIHVubWFuYWdlZCBvciBkdXBsaWNhdGVkIG1vZGVscy4gUmVsZWFzZSBzdGlsbCBuZWVkcwotCQkvLyB0byBiZSBjYWxsZWQgb24gdGhlbSwgZm9yIG5vdywgYnV0IHRoZSBtb2RlbCBtYW5hZ2VyCi0JCS8vIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KLQkJaWYgKGlkLmVxdWFscyhVTk1BTkFHRURfTU9ERUwpIHx8IGlkLmVxdWFscyhEVVBMSUNBVEVEX01PREVMKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWRzIG9mIFVOTUFOQUdFRF9NT0RFTCBvciBEVVBMSUNBVEVEX01PREVMIGFyZSBpbGxlZ2FsIGhlcmUiKTsKLQkJfQotCQllbHNlIHsKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJQXNzZXJ0LmlzTm90TnVsbChzaGFyZWRPYmplY3QsICJyZWxlYXNlIHdhcyByZXF1ZXN0ZWQgb24gYSBtb2RlbCB0aGF0IHdhcyBub3QgYmVpbmcgbWFuYWdlZCIpOyAvLyROT04tTkxTLTEkCi0KLQotCQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdC0tOwotCQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9PSAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSkgewotCQkJCQlkaXNjYXJkTW9kZWwoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJfQotCQkJCS8vIGlmIGVkaXQgZ29lcyB0byB6ZXJvLCBidXQgc3RpbGwgb3BlbiBmb3IgcmVhZCwKLQkJCQkvLyB0aGVuIHdlIHNob3VsZCByZWxvYWQgaGVyZSwgc28gd2UgYXJlIGluIHN5bmNoIHdpdGgKLQkJCQkvLyBjb250ZW50cyBvbiBkaXNrLgotCQkJCS8vIElTU1VFOiBzaG91bGQgd2UgY2hlY2sgaXNEaXJ0eSBoZXJlPwotCQkJCS8vIEFOU1dFUjogaGVyZSwgZm9yIG5vdyBub3cuIG1vZGVsIHN0aWxsIGhhcyBpdHMgb3duIGRpcnR5Ci0JCQkJLy8gZmxhZyBmb3Igc29tZSByZWFzb24uCi0JCQkJLy8gd2UgbmVlZCB0byBhZGRyZXNzICogdGhhdCAqIHRvby4KLQkJCQlpZiAoKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPiAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSAmJiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuaXNEaXJ0eSgpKSB7Ci0JCQkJCXNpZ25hbFByZUxpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJCXJldmVydE1vZGVsKGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkJCXNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJldmVydChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgZm9yIG5vdywgdGhvdWdoIHB1YmxpYyBmb3JtcyBoYXZlIGJlZW4gcmVxdWVzdGVkLCBpbiBwYXN0LgotCXByaXZhdGUgdm9pZCByZXZlcnRNb2RlbChPYmplY3QgaWQsIFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZXZlcnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUHJlTGlmZUN5Y2xlTGlzdGVuZXJSZXZlcnQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFVkVSVCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRVZFUlQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCS8vIHdoYXQncyB3cm9uZyB3aXRoIHRoaXMgZGVzaWduIHRoYXQgYSBjYXN0IGlzIG5lZWRlZCBoZXJlIT8KLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHN0cnVjdHVyZWRNb2RlbCwgdHlwZSk7Ci0JCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuc2lnbmFsTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNjYXJkTW9kZWwoT2JqZWN0IGlkLCBTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0KSB7Ci0JCWZNYW5hZ2VkT2JqZWN0cy5yZW1vdmUoaWQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFQ29yZVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgIkF0dGVtcHRlZCB0byBkaXNjYXJkIGEgc3RydWN0dXJlZCBtb2RlbCBidXQgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gbnVsbDogIiArIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgbnVsbCkpOwotCQl9Ci0KLQkJY2xlYW51cERpc2NhcmRlZE1vZGVsKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBEaXNjYXJkZWRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJLyoKLQkJICogVGhpcyBjYWxsIChhbmQgc2V0dGluZyB0aGUgU3RydWN0dXJlZERvY3VtZW50IHRvIG51bGwpIHdlcmUKLQkJICogcHJldmlvdXNseSBkb25lIHdpdGhpbiB0aGUgbW9kZWwgaXRzZWxmLCBidXQgZm9yIGNvbmN1cnJlbmN5IGl0Ci0JCSAqIG11c3QgYmUgZG9uZSBoZXJlIGR1cmluZyBhIHN5bmNocm9uaXplZCByZWxlYXNlLgotCQkgKi8KLQkJc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLnJlbGVhc2UoKTsKLQotCQkvKgotCQkgKiBGb3Igc3RydWN0dXJlZCBkb2N1bWVudHMgb3JpZ2luYXRpbmcgZnJvbSBmaWxlIGJ1ZmZlcnMsIGRpc2Nvbm5lY3QKLQkJICogdXMgZnJvbSB0aGUgZmlsZSBidWZmZXIsIG5vdy4KLQkJICovCi0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlTW9kZWwoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQkvKgotCQkgKiBTZXR0aW5nIHRoZSBkb2N1bWVudCB0byBudWxsIGlzIHJlcXVpcmVkIHNpbmNlIHNvbWUgc3ViY2xhc3NlcyBvZgotCQkgKiBtb2RlbCBtaWdodCBoYXZlICJjbGVhbnVwIiBvZiBsaXN0ZW5lcnMsIGV0Yy4sIHRvIHJlbW92ZSwgd2hpY2gKLQkJICogd2VyZSBpbml0aWFsaXplZCBkdXJpbmcgdGhlIGluaXRpYWwgc2V0U3RydWN0dXJlZERvY3VtZW50LgotCQkgKiAKLQkJICogVGhlIG1vZGVsIGl0c2VsZiBpbiBwYXJ0aWN1bGFyIG1heSBoYXZlIGludGVybmFsIGxpc3RlbmVycyB1c2VkIHRvCi0JCSAqIGNvb3JkaW5hdGUgdGhlIGRvY3VtZW50IHdpdGggaXRzIG93biAic3RydWN0dXJlIi4KLQkJICovCi0JCXN0cnVjdHVyZWRNb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBmb3IgdXNlIGluIHNhbWUgcGFja2FnZSwgbm90IHN1YmNsYXNzZXMKLQkgKiAKLQkgKi8KLQlzeW5jaHJvbml6ZWQgcHJpdmF0ZSB2b2lkIHJlbGVhc2VGcm9tUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJZHMgb2YgVU5NQU5BR0VEX01PREVMIG9yIERVUExJQ0FURURfTU9ERUwgYXJlIGlsbGVnYWwgaGVyZSIpOwotCQl9Ci0JCWVsc2UgewotCi0JCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAicmVsZWFzZSB3YXMgcmVxdWVzdGVkIG9uIGEgbW9kZWwgdGhhdCB3YXMgbm90IGJlaW5nIG1hbmFnZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkLS07Ci0JCQlpZiAoKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPT0gMCkgJiYgKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPT0gMCkpIHsKLQkJCQlkaXNjYXJkTW9kZWwoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZQotCSAqIHRoZSBjYWNoZWQgdmVyc2lvbiwgYnV0IGZvcmNlcyB0aGUgY2FjaGVkIHZlcnNpb24gdG8gYmUgcmVwbGFjZWQgd2l0aCBhCi0JICogZnJlc2gsIHVuY2hhbmdlZCB2ZXJzaW9uLiBOb3RlOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgYW55Ci0JICogcmVmZXJlbmNlIGNvdW50cy4gQWxzbywgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUKLQkgKiBtb2RlbCwgdGhlbiB0aGlzIGNhbGwgaXMgZXNzZW50aWFsbHkgaWdub3JlZCAodGhhdCBpcywgaXQgZG9lcyBub3QgcHV0Ci0JICogYSBtb2RlbCBpbiB0aGUgY2FjaGUpIGFuZCByZXR1cm5zIG51bGwuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQsIHVzZSByZWxvYWQgZGlyZWN0bHkgb24gbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkTW9kZWwoT2JqZWN0IGlkLCBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQotCQkvLyBnZXQgdGhlIGV4aXN0aW5nIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbChpZCk7Ci0JCS8vIGZvciB0aGUgbW9kZWwgdG8gYmUgbnVsbCBpcyBwcm9iYWJseSBhbiBlcnJvciAodGhhdCBpcywKLQkJLy8gcmVsb2FkIHNob3VsZCBub3QgaGF2ZSBiZWVuIGNhbGxlZCwgYnV0IHdlJ2xsIGd1YXJkIGFnYWluc3QKLQkJLy8gYSBudWxsIHBvaW50ZXIgZXhhbXBsZSBhbmQgcmV0dXJuIG51bGwgaWYgd2UgYXJlIG5vIGxvbmdlciBtYW5hZ2luZwotCQkvLyB0aGF0IG1vZGVsLgotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIGdldCBsb2FkZXIgYmFzZWQgb24gZXhpc3RpbmcgdHlwZQotCQkJLy8gZG13VE9ETyBldmFsdWF0ZSB3aGVuIHJlbG9hZCBzaG91bGQgb2NjdXIKLQkJCS8vIHdpdGggcG90ZW50aWFsbHkgbmV3IHR5cGUgKGUuZy4gaHRtbCAnc2F2ZSBhcycganNwKS4KLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IHN0cnVjdHVyZWRNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCQkvLyBhc2sgdGhlIGxvYWRlciB0byByZS1sb2FkCi0JCQlsb2FkZXIucmVsb2FkKFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgc3RydWN0dXJlZE1vZGVsKTsKLQkJCXRyYWNlKCJyZS1sb2FkaW5nIG1vZGVsIiwgaWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWwoSUZpbGUgaUZpbGUsIFN0cmluZyBpZCwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwgfHwgc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU1NFQ29yZU1lc3NhZ2VzLlByb2dyYW1fRXJyb3JfX01vZGVsTWFuYWdlX0VYQ18pOyAvLyROT04tTkxTLTEkID0gIlByb2dyYW0gRXJyb3I6IE1vZGVsTWFuYWdlckltcGw6OnNhdmVNb2RlbC4gTW9kZWwgc2hvdWxkIGJlIGluIHRoZSBjYWNoZSIKLQkJfQotCQllbHNlIHsKLQkJCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLQkJCS8vIGlmIHRoaXMgbW9kZWwgd2FzIGJhc2VkIG9uIGEgRmlsZSBCdWZmZXIgYW5kIHdlJ3JlIHdyaXRpbmcgYmFjawotCQkJLy8gdG8gdGhlIHNhbWUgbG9jYXRpb24sIHVzZSB0aGUgYnVmZmVyIHRvIGRvIHRoZSB3cml0aW5nCi0JCQlpZiAoRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzRXhpc3RpbmdCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJSVBhdGggZmlsZUxvY2F0aW9uID0gRmlsZUJ1ZmZlcnMubm9ybWFsaXplTG9jYXRpb24oaUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGVMb2NhdGlvbi5lcXVhbHMoYnVmZmVyLmdldExvY2F0aW9uKCkpKSB7Ci0JCQkJCWJ1ZmZlci5jb21taXQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQkJCXNhdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXNhdmVkKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJc2F2ZVN0cnVjdHVyZWREb2N1bWVudChkb2N1bWVudCwgaUZpbGUsIGVuY29kaW5nUnVsZSk7Ci0JCQkJdHJhY2UoInNhdmluZyBtb2RlbCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldERpcnR5U3RhdGUoZmFsc2UpOwotCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldE5ld1N0YXRlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmluZyB0aGUgbW9kZWwgcmVhbGx5IGp1c3QgbWVhbnMgdG8gc2F2ZSBpdCdzIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIG91dHB1dFN0cmVhbQotCSAqIEBwYXJhbSBlbmNvZGluZ1J1bGUKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGVsKFN0cmluZyBpZCwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU1NFQ29yZU1lc3NhZ2VzLlByb2dyYW1fRXJyb3JfX01vZGVsTWFuYWdlX0VYQ18pOyAvLyROT04tTkxTLTEkID0gIlByb2dyYW0gRXJyb3I6IE1vZGVsTWFuYWdlckltcGw6OnNhdmVNb2RlbC4gTW9kZWwgc2hvdWxkIGJlIGluIHRoZSBjYWNoZSIKLQkJfQotCQllbHNlIHsKLQkJCS8vIGlmIHRoaXMgbW9kZWwgd2FzIGJhc2VkIG9uIGEgRmlsZSBCdWZmZXIgYW5kIHdlJ3JlIHdyaXRpbmcgYmFjawotCQkJLy8gdG8gdGhlIHNhbWUgbG9jYXRpb24sIHVzZSB0aGUgYnVmZmVyIHRvIGRvIHRoZSB3cml0aW5nCi0JCQlpZiAoRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzRXhpc3RpbmdCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJYnVmZmVyLmNvbW1pdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlGaWxlIGlGaWxlID0gZ2V0RmlsZUZvcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQsIGlGaWxlKTsKLQkJCQl0cmFjZSgic2F2aW5nIG1vZGVsIiwgaWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldERpcnR5U3RhdGUoZmFsc2UpOwotCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdGhpcyBtZXRob2QgaXMgbGVzcyBlZmZpY2llbnQgdGhhbiBJRmlsZSBmb3JtLCBzaW5jZSBpdAotCSAqICAgICAgICAgICAgIHJlcXVpcmVzIGFuIGV4dHJhICJjb3B5IiBvZiBieXRlIGFycmF5LCBhbmQgc2hvdWxkIGJlIGF2b2lkCi0JICogICAgICAgICAgICAgaW4gZmF2b3Igb2YgdGhlIElGaWxlIGZvcm0uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGVsKFN0cmluZyBpZCwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXQoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldElkKCksIG5ldyBEb2N1bWVudFJlYWRlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXRQcmV2aW91c0VuY29kaW5nTWVtZW50byhzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCkpOwotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbShlbmNvZGluZ1J1bGUpOwotCQkJYnl0ZVtdIG91dHB1dEJ5dGVzID0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0JCQlvdXRwdXRTdHJlYW0ud3JpdGUob3V0cHV0Qnl0ZXMpOwotCQkJdHJhY2UoInNhdmluZyBtb2RlbCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldE5ld1N0YXRlKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJc2F2ZVN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGlGaWxlLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNFeGlzdGluZ0J1ZmZlcihzdHJ1Y3R1cmVkRG9jdW1lbnQpKSB7Ci0JCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJaWYgKGlGaWxlLmdldExvY2F0aW9uKCkuZXF1YWxzKGJ1ZmZlci5nZXRMb2NhdGlvbigpKSkgewotCQkJCWJ1ZmZlci5jb21taXQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJCS8vIElEb2N1bWVudER1bXBlciBkdW1wZXIgPSBoYW5kbGVyLmdldERvY3VtZW50RHVtcGVyKCk7Ci0JCQlDb2RlZFN0cmVhbUNyZWF0b3IgY29kZWRTdHJlYW1DcmVhdG9yID0gbmV3IENvZGVkU3RyZWFtQ3JlYXRvcigpOwotCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldChpRmlsZSwgcmVhZGVyKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXRQcmV2aW91c0VuY29kaW5nTWVtZW50byhzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0RW5jb2RpbmdNZW1lbnRvKCkpOwotCQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDdXJyZW50RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkJCS8vIGJlIHN1cmUgZG9jdW1lbnQncyBpcyB1cGRhdGVkLCBpbiBjYXNlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4KLQkJCS8vIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTWVtZW50byk7Ci0KLQkJCS8vIENvbnZlcnQgbGluZSBkZWxpbWl0ZXJzIGFmdGVyIGVuY29kaW5nIG1lbWVudG8gaXMgZmlndXJlZCBvdXQsCi0JCQkvLyBidXQKLQkJCS8vIGJlZm9yZSB3cml0aW5nIHRvIG91dHB1dCBzdHJlYW0uCi0JCQloYW5kbGVDb252ZXJ0TGluZURlbGltaXRlcnMoc3RydWN0dXJlZERvY3VtZW50LCBpRmlsZSwgZW5jb2RpbmdSdWxlLCBlbmNvZGluZ01lbWVudG8pOwotCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29kZWRCeXRlU3RyZWFtID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGVuY29kaW5nUnVsZSk7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb2RlZEJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQlpZiAoaUZpbGUuZXhpc3RzKCkpCi0JCQkJaUZpbGUuc2V0Q29udGVudHMoY29kZWRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJZWxzZQotCQkJCWlGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJY29kZWRCeXRlU3RyZWFtLmNsb3NlKCk7Ci0JCQljb2RlZFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHRyYWNlIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFjZShTdHJpbmcgbXNnLCBPYmplY3QgaWQpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyArICIgIiArIFV0aWxpdGllcy5tYWtlU2hvcnRJZChpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbW1vbiB0cmFjZSBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhY2UoU3RyaW5nIG1zZywgT2JqZWN0IGlkLCBpbnQgdmFsdWUpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyArIFV0aWxpdGllcy5tYWtlU2hvcnRJZChpZCkgKyAiICgiICsgdmFsdWUgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDc1NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0KLS8qKgotICogVGhlIGVudHJpZXMgaW4gdGhpcyByZWdpc3RyeSBhcmUsIGNvbmNlcHR1YWxseSwgc2luZ2xldG9uJ3MgU2luY2Ugb25seSBvbmUKLSAqIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gdGhlIHJlZ2lzdHJ5LCBhbmQgdGhlbiB0aGF0IGluc3RhbmNlIHJldHVybmVkIHdoZW4KLSAqIHJlcXVpcmVkLgotICogCi0gKiBOb3RlIHRoYXQgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyAncmVtb3ZlJyBtZXRob2QsIFNpbmNlIHRoZSByZWdpc3RyeQotICogaXRzZWxmIGlzIHJlYWQgaXQgd2hlbiBvbmNlLCBmcm9tIHRoZSBwbGF0Zm9ybSdzIHBsdWdpbiByZWdpc3RyeSwgYW5kIGlzCi0gKiBub3QgaW50ZW5kZWQgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgdGhhdC4gQSBjaGFuZ2UgaW4gYW4gZXh0ZW5zdGlvbiBpbiBhCi0gKiBwbHVnaW4ueG1sIHdpbGwgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSB3b3JrYmVuY2ggaXMgcmUtc3RhcnRlZC4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gcmV0dXJuIHRoZSBzcGVjaWZpYyB0eXBlIGZvciB0aGUgc3BlY2lmaWMgbWltZXR5cGUuCi0JICovCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0VHlwZUZvcihTdHJpbmcgbWltZVR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE4OGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBFbWJlZGRlZFR5cGVSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFbWJlZGRlZFR5cGVSZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFbWJlZGRlZFR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbCgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hTZXQgaGFzaFNldCA9IG51bGw7Ci0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPSBudWxsOwotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRUeXBlUmVnaXN0cnkjZ2V0VHlwZUZvcihTdHJpbmcpCi0JICovCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbnRlbnRUeXBlUmVnaXN0cnlJbXBsLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsKCkgewotCQlzdXBlcigpOwotCQloYXNoU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJbmV3IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KGhhc2hTZXQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29udGVudFR5cGVSZWdpc3RyeSNhZGQoQ29udGVudFR5cGVEZXNjcmlwdGlvbikKLQkgKi8KLQl2b2lkIGFkZChJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCWhhc2hTZXQuYWRkKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCkgewotCQlyZXR1cm4gZ2V0VHlwZUZvcigidGV4dC9odG1sIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0UmVnaXN0cnlEZWZhdWx0LiBXZSBjYWNoZSB0aGUgZGVmYXVsdCBoYW5kbGVyLCBzaW5jZSBjYW4ndAotCSAqIGNoYW5nZSBvbmNlIHBsdWdpbiBkZXNjcmlwdG9ycyBhcmUgbG9hZGVkLgotCSAqIAotCSAqIEByZXR1cm4gRW1iZWRkZWRUeXBlSGFuZGxlcgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRSZWdpc3RyeURlZmF1bHQoKSB7Ci0JCWlmIChyZWdpc3RyeURlZmF1bHRIYW5kbGVyID09IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gaGFzaFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKChyZWdpc3RyeURlZmF1bHRIYW5kbGVyID09IG51bGwpICYmIChpdC5oYXNOZXh0KCkpKSB7IC8vIHNhZmUKLQkJCQkvLyBjYXN0Ci0JCQkJLy8gc2luY2UKLQkJCQkvLyAnYWRkJwotCQkJCS8vIHJlcXVpcmVzCi0JCQkJLy8gRW1iZWRkZWRDb250ZW50VHlwZURlc2NyaXB0aW9uCi0JCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpdGVtID0gKEVtYmVkZGVkVHlwZUhhbmRsZXIpIGl0Lm5leHQoKTsKLQkJCQlpZiAoKGl0ZW0gIT0gbnVsbCkgJiYgKGl0ZW0uaXNEZWZhdWx0KCkpKSB7Ci0JCQkJCXJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPSBpdGVtOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gYmFzZWQgb24gbGl0ZXJhbCBpZC4gSXRzIGJhc2ljYWxseSBhCi0JICogImZpcnN0IGZvdW5kIGZpcnN0IHJldHVybmVkIi4gTm90ZSB0aGUgb3JkZXIgaXMgZmFpcmx5IHVucHJlZGljdGFibGUsCi0JICogc28gbm9uLXVuaXF1ZSBpZHMgd291bGQgY2F1c2UgcHJvYmxlbXMuCi0JICovCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0VHlwZUZvcihTdHJpbmcgbWltZVR5cGUpIHsKLQkJLy8gTm90ZTogdGhlIHJlYXNvbiB3ZSBoYXZlIHRoaXMgcHJlY29uZGl0aW9uIGlzIHRoYXQgdGhlCi0JCS8vIGRlZmF1bHQgaXMgZGlmZmVyZW50IGluc2lkZSB0aGUgcmVnaXN0cnkgdGhhbiB3aGVuIGNhbGxlZCwKLQkJLy8gZm9yIGV4YW1wbGUsIGZyb20gdGhlIEpTUExvYWRlci4gRm9yIHRoZSBKU1BMb2FkZXIsIGlmIHRoZXJlCi0JCS8vIGlzIG5vIG1pbWV0eXBlLCB0aGUgZGVmYXVsdCBzaG91bGQgYmUgSFRNTC4gSGVyZSwgaWYgdGhlcmUgaXMKLQkJLy8gc29tZSBtaW1ldHlwZSwgYnV0IGl0IGlzIG5vdCByZWNvZ25pemVkLCB3ZSByZXR1cm4gYSBkZWZhdWx0Ci0JCS8vIGZvciBYTUwuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHZhcmlvdXMgdm9pY2UgeG1sIHR5cGVzLCBldGMuCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZm91bmQgPSBudWxsOwotCQlpZiAobWltZVR5cGUgPT0gbnVsbCB8fCBtaW1lVHlwZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZm91bmQgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlJdGVyYXRvciBpdCA9IGhhc2hTZXQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlICgoZm91bmQgPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsgLy8gc2FmZSBjYXN0IHNpbmNlCi0JCQkJLy8gJ2FkZCcgcmVxdWlyZXMKLQkJCQkvLyBFbWJlZGRlZENvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGl0ZW0gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgaXQubmV4dCgpOwotCQkJCWlmICgoaXRlbSAhPSBudWxsKSAmJiAoaXRlbS5nZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKS5jb250YWlucyhtaW1lVHlwZSkpKSB7Ci0JCQkJCWZvdW5kID0gaXRlbTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gaWYgbm8gZXhhY3QgbWF0Y2gsIGRvIHRoZSAibG9vc2VyIiBjaGVjawotCQkJaWYoZm91bmQgPT0gbnVsbCkgewotCQkJCWl0ID0gaGFzaFNldC5pdGVyYXRvcigpOwotCQkJCXdoaWxlICgoZm91bmQgPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsgCi0JCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgaXRlbSA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBpdC5uZXh0KCk7Ci0JCQkJCWlmICgoaXRlbSAhPSBudWxsKSAmJiAoaXRlbS5jYW5IYW5kbGVNaW1lVHlwZShtaW1lVHlwZSkpKSB7Ci0JCQkJCQlmb3VuZCA9IGl0ZW07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBubyBtYXRjaGVzLCB1c2UgZGVmYXVsdAotCQlpZiAoZm91bmQgPT0gbnVsbCkgewotCQkJZm91bmQgPSBnZXRSZWdpc3RyeURlZmF1bHQoKTsKLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NDE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZW1iZWRkZWRUeXBlSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJvdGVjdGVkIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgVEFHX05BTUUgPSAiZW1iZWRkZWRUeXBlSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBFbWJlZGRlZFR5cGVIYW5kbGVyIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCXRyeSB7Ci0JCQkJY29udGVudFR5cGVEZXNjcmlwdGlvbiA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24sICJFcnJvciByZWFkaW5nIGNvbnRlbnQgdHlwZSBkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb250ZW50VHlwZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFdlIHNpbXBseSByZXF1aXJlIGFuICdhZGQnIG1ldGhvZCwgb2Ygd2hhdCBldmVyIGl0IGlzIHdlIGFyZSB0byByZWFkCi0JICogaW50bwotCSAqLwotCXZvaWQgcmVhZFJlZ2lzdHJ5KFNldCBzZXQpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUgPSByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQkJLy8gbnVsbCBjYW4gYmUgcmV0dXJuZWQgaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIHRoZQotCQkJCS8vIGVsZW1lbnQKLQkJCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCXNldC5hZGQoZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjNjZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJSZWdpc3RyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgTW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGRlZmF1bHRIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlcigpOwotCi0JcHJpdmF0ZSBNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJcmVhZGVyID0gbmV3IE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRlZmF1bHQgbW9kZWwgaGFuZGxlci4gTm90ZTogd2Ugc3RpbGwgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cnkKLQkgKiB0byBiZSBzdXJlIHRvIGdldCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UsIGJ1dCB0aGVuIHdlIGRvIHJlbWVtYmVyIGl0LCBzbwotCSAqIHN1YnNlcXVlbnQgcmVxdWVzdHMgd2lsbCBiZSBmYXN0ZXIuIFRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHdlIGRvIGNoZWNrCi0JICogdGhlIHdob2xlIGxpc3QsIHRvIGJlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUuCi0JICogCi0JICovCi0JZmluYWwgcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0RGVmYXVsdCgpIHsKLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gb2ZJbnRlcmVzdCA9IHJlYWRlci5pc0VsZW1lbnREZWZhdWx0KGVsZW1lbnRzW2ldKTsKLQkJCQlpZiAob2ZJbnRlcmVzdCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiwgaGVyZSB3aXRoaW4gdGhlIHNlYXJjaCBsb29wIHdlJ3ZlIGFscmVhZHkgZm91bmQgb25lCi0JCQkJCSAqIGRlZmF1bHRIYW5kbGVyLCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZyEKLQkJCQkJICovCi0JCQkJCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlkZWZhdWx0SGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShlbGVtZW50c1tpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBNb3JlIHRoYW4gb25lIGRlZmF1bHQgY29udGVudCBoYW5kbGVyIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGVycm9yU3RyaW5nKTsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXJyb3JTdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBObyBkZWZhdWx0IGNvbnRlbnQgdHlwZSBoYW5kbGVyIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBlcnJvclN0cmluZyk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBNb2RlbEhhbmRsZXIgYmFzZWQgb24gbGl0ZXJhbCBleHRlbnNpb24gaWQuIEl0J3MgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBObyBzcGVjaWZpYyBvcmRlciBpcyBndWFyYW50ZWVkIGFuZCB0aGUKLQkgKiB1bmlxdWVuZXNzIG9mIElEcyBpcyBub3QgY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uSWQKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBleHRlbnNpb24sIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uSWQpIHsKLQkJSU1vZGVsSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBjdXJyZW50SWQgPSByZWFkZXIuZ2V0SWQoZWxlbWVudHNbaV0pOwotCQkJCWlmIChleHRlbnNpb25JZC5lcXVhbHMoY3VycmVudElkKSkgewotCQkJCQlJTW9kZWxIYW5kbGVyIGl0ZW0gPSByZWFkZXIuZ2V0SW5zdGFuY2UoZWxlbWVudHNbaV0pOwotCQkJCQlmb3VuZCA9IGl0ZW07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKExvZ2dlci5ERUJVRyl7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlcmUgd2VyZSBubyBNb2RlbCBIYW5kbGVyIGZvdW5kIGluIHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBmaWxlJ3MgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuCi0JICogICAgICAgICBmaWxlLiBJZiBhbiBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoCi0JICogICAgICAgICBhY2NvcmRpbmcgdG8gSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZQotCSAqICAgICAgICAgYXJlIGZvdW5kLCBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yKElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWJvb2xlYW4gYWNjZXNzaWJsZSA9IGZpbGUuaXNBY2Nlc3NpYmxlKCk7Ci0JCWlmIChhY2Nlc3NpYmxlKSB7Ci0JCQkvKiBUcnkgdGhlIG9wdGltaXplZCBtZXRob2QgZmlyc3QgYXMgdGhlIGRlc2NyaXB0aW9uIG1heSBiZSBjYWNoZWQgKi8KLQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkvLyB1c2UgdGhlIHByb3ZpZGVkIGRlc2NyaXB0aW9uCi0JCQkJY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIHVzZSB0aGUgbW9yZSB0aG9yb3VnaCBkaXNjb3ZlcnkgbWV0aG9kIHRvIGdldCBhIGRlc2NyaXB0aW9uICovCi0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGZpbGUuZ2V0TmFtZSgpLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RoaW5nIGZ1cnRoZXIgY2FuIGJlIGRvbmUsIGJ1dCB3aWxsIGxvZyBmb3IgZGVidWdnaW5nCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJLy8gbm90aGluZyBjYW4gYmUgZG9uZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgY291bGRuJ3QgZ2V0IHRoZSBjb250ZW50IHR5cGUgZnJvbSBhIGRlc2NyaXB0aW9uLCB0cnkgYmFzaW5nCi0JCSAqIGl0IG9uIGp1c3QgdGhlIGZpbGVuYW1lCi0JCSAqLwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCW1vZGVsSGFuZGxlciA9IGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBoYXJkIGNvZGluZyBmb3IgbnVsbCBjb250ZW50IHR5cGUKLQkJCW1vZGVsSGFuZGxlciA9IGdldEhhbmRsZXJFeHRlbnNpb24oSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gbW9kZWxIYW5kbGVyOwotCX0KLQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBJbnB1dFN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXROYW1lCi0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICogQHJldHVybiBUaGUgSU1vZGVsSGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgaW5wdXQuIElmIGFuIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2gKLQkgKiAgICAgICAgIGFjY29yZGluZyB0byBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lCi0JICogICAgICAgICBhcmUgZm91bmQsIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yKFN0cmluZyBpbnB1dE5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpU3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pOwotCQlJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlciA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKFV0aWxpdGllcy5nZXRMaW1pdGVkU3RyZWFtKGlTdHJlYW0pLCBpbnB1dE5hbWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGlTdHJlYW0gIT0gbnVsbCAmJiBpU3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCQlpU3RyZWFtLnJlc2V0KCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGlucHV0TmFtZSk7Ci0JCX0KLQkJLy8gaWYgYWxsIGVsc2UgZmFpbGVkLCB0cnkgdG8gZGV0ZWN0IHNvbGVseSBvbiBjb250ZW50czsgZG9uZSBsYXN0IGZvcgotCQkvLyBwZXJmb3JtYW5jZSByZWFzb25zCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihVdGlsaXRpZXMuZ2V0TGltaXRlZFN0cmVhbShpU3RyZWFtKSwgbnVsbCk7Ci0JCX0KLQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIG1vZGVsSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgcmVnaXN0ZXJlZCBJTW9kZWxIYW5kbGVyIGZvciBhIGdpdmVuIElDb250ZW50VHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUuIElmIGFuCi0JICogICAgICAgICBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoIGFjY29yZGluZyB0bwotCSAqICAgICAgICAgSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZSBhcmUgZm91bmQsCi0JICogICAgICAgICBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGV4YWN0Q29udGVudFR5cGVFbGVtZW50ID0gbnVsbDsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBraW5kT2ZDb250ZW50VHlwZUVsZW1lbnQgPSBudWxsOwotCQkJaW50IGtpbmRPZkNvbnRlbnRUeXBlRGVwdGggPSAwOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWFkZXIuZWxlbWVudHM7Ci0JCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoICYmIGV4YWN0Q29udGVudFR5cGVFbGVtZW50ID09IG51bGw7IGkrKykgewotCQkJCQlTdHJpbmcgY3VycmVudElkID0gcmVhZGVyLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKGVsZW1lbnRzW2ldKTsKLQkJCQkJSUNvbnRlbnRUeXBlIGFzc29jaWF0ZWRDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGN1cnJlbnRJZCk7Ci0JCQkJCWlmIChjb250ZW50VHlwZS5lcXVhbHMoYXNzb2NpYXRlZENvbnRlbnRUeXBlKSkgewotCQkJCQkJZXhhY3RDb250ZW50VHlwZUVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjb250ZW50VHlwZS5pc0tpbmRPZihhc3NvY2lhdGVkQ29udGVudFR5cGUpKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogVXBkYXRlIHRoZSBraW5kT2ZFbGVtZW50IHZhcmlhYmxlIG9ubHkgaWYgdGhpcwotCQkJCQkJICogZWxlbWVudCdzIGNvbnRlbnQgdHlwZSBpcyAiZGVlcGVyIiAoZGVwdGggdGVzdAotCQkJCQkJICogZW5zdXJlcyB0aGUgZmlyc3QgY29udGVudCB0eXBlIGlzIHJlbWVtYmVyZWQpCi0JCQkJCQkgKi8KLQkJCQkJCUlDb250ZW50VHlwZSB0ZXN0Q29udGVudFR5cGUgPSBhc3NvY2lhdGVkQ29udGVudFR5cGU7Ci0JCQkJCQlpbnQgdGVzdERlcHRoID0gMDsKLQkJCQkJCXdoaWxlICh0ZXN0Q29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQkJCXRlc3REZXB0aCsrOwotCQkJCQkJCXRlc3RDb250ZW50VHlwZSA9IHRlc3RDb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRlc3REZXB0aCA+IGtpbmRPZkNvbnRlbnRUeXBlRGVwdGgpIHsKLQkJCQkJCQlraW5kT2ZDb250ZW50VHlwZUVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJCQlraW5kT2ZDb250ZW50VHlwZURlcHRoID0gdGVzdERlcHRoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoTG9nZ2VyLkRFQlVHKXsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlcmUgd2VyZSBubyBNb2RlbCBIYW5kbGVyIGZvdW5kIGluIHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChleGFjdENvbnRlbnRUeXBlRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShleGFjdENvbnRlbnRUeXBlRWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChraW5kT2ZDb250ZW50VHlwZUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWhhbmRsZXIgPSByZWFkZXIuZ2V0SW5zdGFuY2Uoa2luZE9mQ29udGVudFR5cGVFbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCS8vIHRlbXAgaGFyZCBjb2RpbmcgZm9yIG51bGwgY29udGVudCB0eXBlIGFyZ3VtZW50cwotCQkJaGFuZGxlciA9IGdldEhhbmRsZXJFeHRlbnNpb24oSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBjb250ZW50IHR5cGUgSUQuIE5vCi0JICogc3BlY2lmaWMgb3JkZXIgaXMgZ3VhcmFudGVlZCBhbmQgdGhlIHVuaXF1ZW5lc3Mgb2YgSURzIGlzIG5vdAotCSAqIGNvbnNpZGVyZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBUaGUgSU1vZGVsSGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIElELiBJZgotCSAqICAgICAgICAgYW4gZXhhY3QgbWF0Y2ggaXMgbm90IGZvdW5kLCB0aGUgbW9zdC1zcGVjaWZpYyBtYXRjaCBhY2NvcmRpbmcKLQkgKiAgICAgICAgIHRvIElDb250ZW50VHlwZS5pc0tpbmRPZigpIHdpbGwgYmUgcmV0dXJuZWQuIElmIG5vbmUgYXJlIGZvdW5kLAotCSAqICAgICAgICAgZWl0aGVyIGEgZGVmYXVsdCBvciBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCXJldHVybiBnZXRIYW5kbGVyRm9yQ29udGVudFR5cGUoY29udGVudFR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzY1YjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MganVzdCBjb252ZXJ0cyB3aGF0J3MgaW4gdGhlIHBsdWdpbnMgcmVnaXN0cnkgaW50byBhIGZvcm0gbW9yZQotICogZWFzaWx5IHVzZWFibGUgYnkgb3RoZXJzLCB0aGUgQ29udGVudFR5cGVSZWdpc3RyeS4KLSAqLwotY2xhc3MgTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgSGFzaE1hcCBhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQVNTT0NJQVRFRF9DT05URU5UX1RZUEUgPSAiYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzOwotCXByb3RlY3RlZCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gIm1vZGVsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQkvLwotCXByb3RlY3RlZCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIFRBR19OQU1FID0gIm1vZGVsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vCi0JLyoqCi0JICogQ29udGVudFR5cGVSZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCU1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCVN0cmluZyBnZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQVNTT0NJQVRFRF9DT05URU5UX1RZUEUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JU3RyaW5nIGdldElkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBpZFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJcmV0dXJuIGlkVmFsdWU7Ci0JfQotCi0Jc3luY2hyb25pemVkIElNb2RlbEhhbmRsZXIgZ2V0SW5zdGFuY2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gTWF5IG5lZWQgdG8gcmVjb25zaWRlciwgYnV0IGZvciBub3csIHdlJ2xsIGFzc3VtZSBhbGwgY2xpZW50cyBtdXN0Ci0JCS8vIHN1YmNsYXNzIEFic3RyYWN0Q29udGVudFR5cGVJZGVudGlmaWVyLiBJdHMgZWFzaWVyIGFuZCBzYWZlciwgZm9yCi0JCS8vIHRoaXMKLQkJLy8gbG93IGxldmVsICJzeXN0ZW0iIG9iamVjdC4gKFRoYXQgaXMsIHdlIGNhbiBjaGVjayBhbmQgc2V0ICJwYWNrYWdlCi0JCS8vIHByb3RlY3RlZCIKLQkJLy8gYXR0cmlidXRlcy4KLQkJQWJzdHJhY3RNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyID0gKEFic3RyYWN0TW9kZWxIYW5kbGVyKSBhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcy5nZXQoZ2V0SWQoZWxlbWVudCkpOwotCQlpZiAobW9kZWxIYW5kbGVyID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWxIYW5kbGVyID0gKEFic3RyYWN0TW9kZWxIYW5kbGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCQlpZiAobW9kZWxIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJYWxsUmVhZHlDcmVhdGVJbnN0YW5jZXMucHV0KGdldElkKGVsZW1lbnQpLCBtb2RlbEhhbmRsZXIpOwotCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFRkFVTFQpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgInRydWUiLmVxdWFscyhkZWZhdWx0VmFsdWUpKSAvLyROT04tTkxTLTEkCi0JCQkJCQltb2RlbEhhbmRsZXIuc2V0RGVmYXVsdCh0cnVlKTsKLQkJCQkJZWxzZQotCQkJCQkJbW9kZWxIYW5kbGVyLnNldERlZmF1bHQoZmFsc2UpOwotCQkJCQkvLyBUT0RPIC0tIHNldCBhbmQgY2hlY2sgYXR0cmlidXRlcyB2cy4gY3JlYXRlZCBpbnN0YW5jZQotCQkJCQkvL2NvbnRlbnRUeXBlSWRlbnRpZmllci5zZXRPckNoZWNrSWQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREZWZhdWx0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGQVVMVCk7Ci0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIgcmVhZFJlZ2lzdHJ5KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQkvLyBqdXN0IHJlbWVtYmVyIHRoZSBlbGVtZW50cywgc28gcGx1Z2lucyBkb24ndCBoYXZlIHRvCi0JCQkvLyBiZSBhY3RpdmF0ZWQsIHVubGVzcyBleHRlbnNpb24gbWF0Y2hlcyB0aG9zZSAib2YgaW50ZXJlc3QiLgotCQkJZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWVmM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqIExpa2VseSBhIHRlbXBvcmFyeSBjbGFzcyB0byBiZSByZXBsYWNlZCBieSBwbHVnaW4sIGV2ZW50dWFsbHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJVdGlsaXR5IHsKLQotCXByaXZhdGUgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNvbnRlbnRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgc3RhdGljIElEb2N1bWVudFR5cGVIYW5kbGVyIGdldENvbnRlbnRUeXBlRm9yKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRUeXBlUmVnaXN0cnkoKS5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChzdHJpbmcpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCWlmIChjb250ZW50VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlUmVnaXN0cnkgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXREZWZhdWx0RW1iZWRkZWRUeXBlKCkgewotCQlyZXR1cm4gZ2V0RW1iZWRkZWRDb250ZW50VHlwZUZvcigidGV4dC9odG1sIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRDb250ZW50VHlwZUZvcihTdHJpbmcgc3RyaW5nKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgaW5zdGFuY2UgPSBudWxsOwotCQlpbnN0YW5jZSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3Ioc3RyaW5nKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJVdGlsaXR5KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1BsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NDUzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIAotICogQ2xpZW50cyBjYW4gbWFrZSB1c2Ugb2YgSUV4ZWN1dGFibGVFeHRlbnNpb24gdG8gaGFuZGxlIHRoZSBvcHRpb25hbCBhZGFwdGVyCi0gKiBjbGFzcyBhbmQga2V5LiBUeXBpY2FsbHksIG1hbnkgY2xpZW50cyB1c2UgYSB0eXBpY2FsIHBhdHRlcm4gb2YgcHJvdmlkaW5nCi0gKiBhbiBhZGFwdGVyIGNsYXNzIGFuZCBrZXkgaW4gdGhlaXIgbnVsbCBhcmd1bWVudCBjb25zdHJ1Y3RvciBhbnl3YXksIHNvCi0gKiB0aGV5J2Qgb25seSBoYXZlIHRvIHVzZSBJRXhlY3V0YWJsZUV4dGVuc2lvbiBpZiB0aGUgZmFjdG9yeSB3YXMgZm9yIG1vcmUKLSAqIHRoYW4gb25lLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyIHsKLQkvLwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQURBUFRFUktFWSA9ICJhZGFwdGVyS2V5Q2xhc3MiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfUkVHSVNURVJBREFQVEVSID0gInJlZ2lzdGVyQWRhcHRlcnMiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZWFkZXIgPSBuZXcgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NPTlRFTlRUWVBFID0gImNvbnRlbnRUeXBlSWRlbnRpZmVySWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoSURvY3VtZW50VHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KGhhbmRsZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlckZhY3RvcnkgbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIE9iamVjdCByZXF1ZXN0ZXJUeXBlKSB7Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NPTlRFTlRUWVBFKTsKLQkJCWlmICghcmVxdWVzdGVyVHlwZS5lcXVhbHMoY29udGVudFR5cGUpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ0xBU1MpOwotCQkJLy8JCQlTdHJpbmcgYWRhcHRlcktleUNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9BREFQVEVSS0VZKTsKLQkJCS8vCQkJU3RyaW5nIHJlZ2lzdGVyQWRhcHRlcnMgPQotCQkJLy8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9SRUdJU1RFUkFEQVBURVIpOwotCi0JCQkvLyBpZiBjbGFzc05hbWUgaXMgbnVsbCwgdGhlbiBubyBvbmUgZGVmaW5lZCB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyBmb3IgYWRhcHRlciBmYWN0b3JpZXMKLQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiBhbiBlcnJvciBvY2N1cnMgaGVyZSwgaXRzIHByb2JhYmx5IHRoYXQgdGhlIHBsdWdpbgotCQkJCQkvLyBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkCi0JCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjbGFzczogIiArIGNsYXNzTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiBhbiBlcnJvciBvY2N1cnMgaGVyZSwgaXRzIHByb2JhYmx5IHRoYXQgdGhlIHBsdWdpbgotCQkJCQkvLyBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkIC0tIGJ1dCBpbiBhbnkgY2FzZSB3ZSBqdXN0Ci0JCQkJCS8vIHdhbnQKLQkJCQkJLy8gdG8gbG9nIHRoZSBlcnJvciBhbmQgY29udGludWUgcnVubmluZyBhbmQgYmVzdCB3ZSBjYW4uCi0JCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjbGFzczogIiArIGNsYXNzTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8JCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJLy8JCQkJCWZhY3RvcnkgPSBvbGRBdHRyaWJ1dGVzQ29kZShlbGVtZW50LCBmYWN0b3J5LCBjbGFzc05hbWUsCi0JCQkJLy8gcGx1Z2luKTsKLQkJCQkvLwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgbG9hZFJlZ2lzdHJ5KE9iamVjdCBjb250ZW50VHlwZSkgewotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbnVsbDsgLy8gbmV3IFZlY3RvcigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChTU0VDb3JlUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJLy8gdGhpcyBpcyBjYWxsZWQgYSBsb3QsIHNvIGRvbid0IGNyZWF0ZSB2ZWN0b3IgdW5sZXNzIHJlYWxseQotCQkJCS8vIG5lZWRlZAotCQkJCS8vIFRPRE86IGNvdWxkIGV2ZW50dWFsbHkgY2FjaGUgaW4gYSBoYXNodGFibGUsIG9yIHNvbWV0aGluZywKLQkJCQkvLyB0byBhdm9pZCByZXBlYXQgcHJvY2Vzc2luZwotCQkJCWZhY3RvcnlMaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoZWxlbWVudHNbaV0sIGNvbnRlbnRUeXBlKTsKLQkJCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJCWZhY3RvcnlMaXN0LmFkZChmYWN0b3J5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyODc2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFJlZ2lvbnMgb2YgdGhpcyBjbGFzcyBhcmUgaW50ZW5kZWQgc3BlY2lmaWNhbGx5IGZvciBYTUwvSFRNTC9KU1BzLiBPdGhlcgotICogbGFuZ3VhZ2VzIG1heSBuZWVkIHRoZWlyIG93biBzdWJjbGFzc2VzLiAoU2VlIHRoZSB1cGRhdGVNb2RlbCBtZXRob2QpLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgaW50IGZTdGFydDsKLQlwcm90ZWN0ZWQgaW50IGZUZXh0TGVuZ3RoOwotCXByb3RlY3RlZCBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGV4dFJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCkgewotCQlmVHlwZSA9IG5ld0NvbnRleHQ7Ci0JCWZTdGFydCA9IG5ld1N0YXJ0OwotCQlmVGV4dExlbmd0aCA9IG5ld1RleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBuZXdMZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCWJvb2xlYW4gYWxsTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNoZWNrIHRoYXQgYSBKYXZhIExldHRlciBvciBEaWdpdCBpcwotCQkJLy8gdGhlIHNhbWUgdGhpbmcgYXMgYW4gWE1MIGxldHRlciBvciBkaWdpdAotCQkJaWYgKCEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFuZ2VzLmNoYXJBdChpKSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlib29sZWFuIGFsbFdoaXRlU3BhY2UoU3RyaW5nIGNoYW5nZXMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYW5nZXMuY2hhckF0KGkpKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlib29sZWFuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKGdldFRleHRFbmQoKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKGdldEVuZCgpID4gZ2V0VGV4dEVuZCgpKSB7Ci0JCQkvLyBubyBuZWVkIHRvIGFkZCBvbmUgdG8gZW5kIG9mIHRleHQsIGFzIHdlIHVzZWQgdG8sIHNpbmNlIHdlCi0JCQkvLyBjaGFuZ2UgZGVmaW5pdGlvbiBvZiBsZW5ndGggdG8gZXF1YXRlIHRvIG9mZnNldCBwbHVzIG9uZS4KLQkJCWlmIChyZXF1ZXN0U3RhcnQgPiBnZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7Ci0KLQkJcmV0dXJuIGZTdGFydCA8PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBzdHJpbmcpIHsKLQkJZlR5cGUgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lICsgIi0tPiAiICsgZ2V0VHlwZSgpICsgIjogIiArIGdldFN0YXJ0KCkgKyAiLSIgKyBnZXRUZXh0RW5kKCkgKyAoZ2V0VGV4dEVuZCgpICE9IGdldEVuZCgpID8gKCIvIiArIGdldEVuZCgpKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIHRoZSBmb3VyIHR5cGVzIHdlIHVzZWQgdG8gaGFuZGxlIGhlcmUsIGhhdmUgYWxsIGJlZW4gbW92ZWQgdG8KLQkJLy8gc3BlY2lmaWMgcmVnaW9uIGNsYXNzZXMuCi0JCS8vIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFCi0JCS8vIFhNTF9UQUdfQVRUUklCVVRFX05BTUUKLQkJLy8gWE1MX0NPTlRFTlQKLQkJLy8gWE1MX0NEQVRBX1RFWFQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODZkMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvRm9yZWlnblJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRm9yZWlnblJlZ2lvbiBleHRlbmRzIENvbnRleHRSZWdpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN1cnJvdW5kaW5nVGFnID0gbnVsbDsKLQotCS8qKgotCSAqIEZvcmVpZ25SZWdpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEZvcmVpZ25SZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25SZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgpIHsKLQkJc3VwZXIobmV3Q29udGV4dCwgbmV3U3RhcnQsIG5ld1RleHRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25SZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgsIFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlzdXBlcihuZXdDb250ZXh0LCBuZXdTdGFydCwgbmV3VGV4dExlbmd0aCwgbmV3TGVuZ3RoKTsKLQkJc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlyZXR1cm4gbGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3Vycm91bmRpbmdUYWcoKSB7Ci0JCXJldHVybiBzdXJyb3VuZGluZ1RhZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TGFuZ3VhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShqYXZhLmxhbmcuU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCWxhbmd1YWdlID0gbmV3TGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N1cnJvdW5kaW5nVGFnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3Vycm91bmRpbmdUYWcoamF2YS5sYW5nLlN0cmluZyBuZXdTdXJyb3VuZGluZ1RhZykgewotCQlzdXJyb3VuZGluZ1RhZyA9IG5ld1N1cnJvdW5kaW5nVGFnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRk9SRUlHTjogIiArIHN1cGVyLnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQoZmxhdG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBmbGF0bm9kZSwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE1MTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzIGFyZSBub3cgbWFuYWdlZCBieSBlYWNoIGluZGl2aWR1YWwKLSAqICAgICAgICAgICAgIGNvbnRlbnQgdHlwZS4gKFhYQ29yZVByZWZlcmVuY2VOYW1lcykKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzIHsKLQlTdHJpbmcgVEFCX1dJRFRIID0gInRhYldpZHRoIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIExJTkVfV0lEVEggPSAibGluZVdpZHRoIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNQTElUX01VTFRJX0FUVFJTID0gInNwbGl0TXVsdGlBdHRycyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTkRFTlRfVVNJTkdfVEFCUyA9ICJpbmRlbnRVc2luZ1RhYnMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gImNsZWFyQWxsQmxhbmtMaW5lcyI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFRBR19OQU1FX0NBU0UgPSAidGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0NBU0UgPSAiYXR0ck5hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRk9STUFUVElOR19TVVBQT1JURUQgPSAiZm9ybWF0dGluZ1N1cHBvcnRlZCI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFBSRUZFUlJFRF9NQVJLVVBfQ0FTRV9TVVBQT1JURUQgPSAicHJlZmVycmVkTWFya3VwQ2FzZVN1cHBvcnRlZCI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFRBU0tfVEFHX1RBR1MgPSAidGFzay10YWctdGFncyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFTS19UQUdfUFJJT1JJVElFUyA9ICJ0YXNrLXRhZy1wcmlvcml0aWVzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQVNLX1RBR19FTkFCTEUgPSAidGFzay10YWdzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQVNLX1RBR19QUk9KRUNUU19JR05PUkVEID0gInRhc2stdGFnLXByb2plY3RzLXRvSWdub3JlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiB0aGVzZSBhcmUgcHJlZmVyZW5jZXMgdGhhdCBzaG91bGQgYmUgaW5oZXJpdGVkIGZyb20gdGhlICJlbWJlZGRlZAotCSAqIHByZWZlcmVuY2Ugc3RvcmUiIGZvciBleGFtcGxlOiBpZiB5b3UgYXNrIGZvciB0aCBPVkVSVklFV19SVUxFUgotCSAqIHByZWZlcmVuY2UgZm9yIEpTUCwgeW91IHdpbGwgYXV0b21hdGljYWxseSBnZXQgdGhlIHByZWZlcmVuY2UgZnJvbSB0aGUKLQkgKiBIVE1MIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JU3RyaW5nIEVNQkVEREVEX0NPTlRFTlRfVFlQRV9QUkVGRVJFTkNFU1tdID0ge1RBQl9XSURUSCwgTElORV9XSURUSCwgU1BMSVRfTVVMVElfQVRUUlMsIElOREVOVF9VU0lOR19UQUJTLCBDTEVBUl9BTExfQkxBTktfTElORVMsIFRBR19OQU1FX0NBU0UsIEFUVFJfTkFNRV9DQVNFLH07Ci0KLQlTdHJpbmcgRk9STUFUVElOR19QUkVGRVJFTkNFU1tdID0ge1RBQl9XSURUSCwgTElORV9XSURUSCwgU1BMSVRfTVVMVElfQVRUUlMsIElOREVOVF9VU0lOR19UQUJTLCBDTEVBUl9BTExfQkxBTktfTElORVMsfTsKLQotCVN0cmluZyBBVVRPID0gIkF1dG8iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVRGXzggPSAiVVRGLTgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSVNPXzg4NTlfMSA9ICJJU08tODg1OS0xIjsvLyROT04tTkxTLTEkCi0KLQlpbnQgQVNJUyA9IDA7Ci0JaW50IExPV0VSID0gMTsKLQlpbnQgVVBQRVIgPSAyOwotCi0JLy8gY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JU3RyaW5nIENMRUFOVVBfVEFHX05BTUVfQ0FTRSA9ICJjbGVhbnVwVGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSA9ICJjbGVhbnVwQXR0ck5hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUyA9ICJjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5TRVJUX1JFUVVJUkVEX0FUVFJTID0gImluc2VydFJlcXVpcmVkQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5TRVJUX01JU1NJTkdfVEFHUyA9ICJpbnNlcnRNaXNzaW5nVGFncyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRk9STUFUX1NPVVJDRSA9ICJmb3JtYXRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMRUFOVVBfRU9MX0NPREUgPSAiY2xlYW51cEVPTENvZGUiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBMQVNUX0FDVElWRV9QQUdFID0gImxhc3RBY3RpdmVQYWdlIjsvLyROT04tTkxTLTEkCQotCi0JLy8gbmVlZCB0byBwdXQgZGVmYXVsdCB0YWIgd2lkdGggcHJlZmVyZW5jZSBoZXJlIHNvIGl0IGlzIGFjY2Vzc2libGUgYnkKLQkvLyBib3RoIG1vZGVsIGFuZCBlZGl0b3IKLQkvLyB0aGlzIHdheSwgZWRpdG9yIGRvZXMgbm90IG5lZWQgdG8gcXVlcnkgbW9kZWwncyBkZWZhdWx0IHRhYiB3aWR0aAotCS8vIHByZWZlcmVuY2UKLQlpbnQgREVGQVVMVF9UQUJfV0lEVEggPSA0OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjFmMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHRhc2tUYWdEZWZhdWx0cyA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQl0YXNrVGFnRGVmYXVsdHMucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCAiVE9ETyxGSVhNRSxYWFgiKTsgLy8kTk9OLU5MUy0xJAotCQl0YXNrVGFnRGVmYXVsdHMucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCAiMSwyLDEiKTsgLy8kTk9OLU5MUy0xJAotCQl0YXNrVGFnRGVmYXVsdHMucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTljODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgSUFkYXB0ZXJGYWN0b3J5LiBBbGwgaW1wbGVtZW50ZXJzIG9mCi0gKiBJQWRhcHRlckZhY3Rvcnkgc2hvdWxkIHN1YmNsYXNzIHRoaXMgY2xhc3MuIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZXMKLSAqIGl0c2VsZiAodGhpcykgYXMgdGhlIGtleS4gU3ViY2xhc3NlcyBuZWVkIHRvIHByb3ZpZGUgYSB3YXkgdG8gY3JlYXRlIHRoZQotICogYWRhcHRlciwgYW5kIGNhbiBvdmVycmlkZSBvciBjYWxsIG90aGVyIG1ldGhvZHMuCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQotCi0JcHJpdmF0ZSBPYmplY3QgZkFkYXB0ZXJLZXk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZFJlZ2lzdGVyQWRhcHRlcjsKLQotCS8qKgotCSAqIElmIHRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VkLCBzZXRBZGFwdGVyS2V5IGFuZCBzZXRTaG91bGRSZWdpc3RlcgotCSAqIHNob3VsZCBiZSB1c2VkIHRvIHByb3Blcmx5IGluaXRpYWxpemUuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0KLQl9Ci0KLQotCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5KSB7Ci0JCXRoaXMoYWRhcHRlcktleSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VjbGFzc2VzIG1heSBleHRlbmRlZCB0aGlzIGNvbnN0cnVjdG9yLCBpZiBuZWVkZWQuCi0JICovCi0KLQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0KLQkJc3VwZXIoKTsKLQkJZkFkYXB0ZXJLZXkgPSBhZGFwdGVyS2V5OwotCQlmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyID0gcmVnaXN0ZXJBZGFwdGVyczsKLQotCX0KLQotCS8qKgotCSAqIElTU1VFOiBzaG91bGQgYmUgZmluYWwuIFNlZSB0aG9zZSB0aGF0IGltcGxlbWVudCBpdCAKLQkgKiBmb3IgY29tcGxpY2F0aW5nIGRldGFpbHMgYW5kICJ1bmtub3ducyIuIAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSB0YXJnZXQuZ2V0RXhpc3RpbmdBZGFwdGVyKGZBZGFwdGVyS2V5KTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCQlhZGFwdGVyID0gYWRhcHROZXcodGFyZ2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBub3JtYWxseSBpbXBsZW1lbnQgdGhlaXIgb3duICdjb3B5JyBtZXRob2QuIEJ5Ci0JICogZGVmYXVsdCwgd2UnbGwgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlLCBmb3IgY29udmVuaWVuY2Ugb2YgdGhvc2UgdXNpbmcKLQkgKiBzaW5nbGV0b24gZmFjdG9yaWVzICh3aGljaCBoYXZlIG5vIHN0YXRlLCBhbmQgc28gbmVlZCB0byBkbyBhbnl0aGluZyBvbgotCSAqICdyZWxlYXNlJykuCi0JICogCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbmVlZHMgdG8gcmV0dXJuIHRydWUgb2YgdGhpcyBmYWN0b3J5IGlzIGZvciBhZGFwdGVycyBvZgotCSAqIHR5cGUgJ3R5cGUnLiBJdCBpcyByZXF1aXJlZCB0aGF0IGl0IHJldHVybiB0cnVlIGlmICdlcXVhbHMnIGFuZCB0aGlzCi0JICogZGVmYXVsdCBiZWhhdmlvciBpcyBwcm92aWRlZCBieSB0aGlzIHN1cGVyIGNsYXNzLiBDbGllbnRzIG1heSBleHRlbmQKLQkgKiB0aGlzIGJlaGF2aW9yIGlmIG1vcmUgY29tcGxleCBsb2dpYyBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhmQWRhcHRlcktleSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgbmVlZCB0byAiY2xlYW51cCIgdGhlaXIgYWRhcHRlciBmYWN0b3J5LCByZWxlYXNlCi0JICogYWRhcHRlcnMsIHJlc291cmNlcywgZXRjLiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgaWYgc3VjaAotCSAqIGNsZWFuIHVwIGlzIHJlcXVpcmVkLiBOb3RlOiB3aGlsZSBjdXJyZW50IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcsCi0JICogc3ViY2xhc3NlcyBzaG91bGQgbm90IGFzc3VtZSB0aGlzIHdvdWxkIGFsd2F5cyBiZSB0cnVlLCBzbyBzaG91bGQKLQkgKiBhbHdheXMgY2FsbCBzdXBlci5yZWxlYXNlIGF0IHRoZSBlbmQgb2YgdGhlaXIgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGRlZmF1bHQgZm9yIHN1cGVyY2xhc3MgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIE9ubHkgZm9yIHNwZWNpYWwgY2FzZXMgdGhlcmUgdGhlIGFkYXB0ZXIga2V5IGNhbiBiZSBzZXQgaW4gdGhlCi0JICogY29uc3RydWN0b3IuIEl0IGNhbiBiZSBzZXQgaGVyZS4gSWYgaXQgaXMgc2V0IG1vcmUgdGhhbiwgYW5kCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgc2V0QWRhcHRlcktleShPYmplY3Qga2V5KSB7Ci0JCWlmIChmQWRhcHRlcktleSAhPSBudWxsICYmICEoZkFkYXB0ZXJLZXkuZXF1YWxzKGtleSkpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSU5vZGVBZGFwdGVyIEtleSBjYW5ub3QgYmUgY2hhbmdlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlmQWRhcHRlcktleSA9IGtleTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gYmUgY2FsbGVkIGJ5IHN1YmNsYXNzZXMgZHVyaW5nICdhZGFwdCcgcHJvY2VzcywgYnV0IG11c3Qgbm90IGJlCi0JICogb3ZlcnJpZGRlbiBvciByZWltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSU5vZGVBZGFwdGVyIGFkYXB0TmV3KElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlQWRhcHRlcih0YXJnZXQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoZlNob3VsZFJlZ2lzdGVyQWRhcHRlcikgewotCQkJCXRhcmdldC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIEl0IGlzIGNhbGxlZCBieSBpbmZyYXN0cnVjdHVyZQotCSAqIHdoZW4gYW4gaW5zdGFuY2UgaXMgbmVlZGVkLiBJdCBpcyBwcm92aWRlZCB0aGUgbm9kZSBub3RpZmllciwgd2hpY2ggbWF5Ci0JICogb3IgbWF5IG5vdCBiZSByZWxldmVudCB3aGVuIGNyZWF0aW5nIHRoZSBhZGFwdGVyLiBOb3RlOiB0aGUgYWRhcHRlcgotCSAqIGRvZXMgbm90IGhhdmUgdG8gbGl0ZXJhbGx5IGJlIGEgbmV3IGludGFuY2UgYW5kIGlzIGFjdHVhbGx5IHJlY29tbWVuZGVkCi0JICogdG8gdHlwaWNhbGx5IGJlIGEgc2luZ2xldG9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KTsKLQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyOwotCX0KLQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2hvdWxkUmVnaXN0ZXJBZGFwdGVyKGJvb2xlYW4gc2hvdWxkUmVnaXN0ZXJBZGFwdGVyKSB7Ci0JCS8vIElTU1VFOiB0ZWNobmljYWxseSB3ZSBwcm9iYWJseSBzaG91bGQgbm90IGFsbG93IHRoaXMgdmFsdWUgdG8KLQkJLy8gY2hhbmdlLCBhZnRlciBpbml0aWFsaXphdGlvbiwgYnV0IGlzIG5vdCBzbyBlYXN5IHRvIGRvLAotCQkvLyBhbmQgSSdtIG5vdCBzdXJlIGl0cyAid29ydGgiIHRoZSBwcm90ZWN0aW9uLgotCQlmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyID0gc2hvdWxkUmVnaXN0ZXJBZGFwdGVyOwotCX0KLQotCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBnZXRBZGFwdGVyS2V5KCkgewotCQlyZXR1cm4gZkFkYXB0ZXJLZXk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdE5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0Tm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxNDI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0Tm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLQotCi0KLS8qKgotICogQWJzdHJhY3ROb3RpZmllciBpcyBzaW1pbGFyIHRvIChhbmQgYmFzZWQgb24pIHRoZSBFTUYgTm90aWZpZXJJbXBsIGNsYXNzLAotICogYnV0IGlzIG5vdCByZWxhdGVkIHRvIEVNRiBwZXIgc2UuIFRoaXMgY2xhc3MgaXMgc2ltcGxlciAodGhhdCBpcywgbm90IGFzCi0gKiBtYW55IGZ1bmN0aW9ucykuCi0gKiAKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIElOb2RlTm90aWZpZXIgbXVzdCBzdWJjbGFzcyB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIElOb2RlTm90aWZpZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBncm93dGhDb25zdGFudCA9IDM7Ci0JcHJpdmF0ZSBpbnQgYWRhcHRlckNvdW50ID0gMDsKLQotCXByaXZhdGUgSU5vZGVBZGFwdGVyW10gZkFkYXB0ZXJzOwotCi0JLyoqCi0JICogQWJzdHJhY3ROb3RpZmllciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdE5vdGlmaWVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGFkZEFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEFkYXB0ZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpIHsKLQotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbnN1cmVDYXBhY2l0eShhZGFwdGVyQ291bnQgKyAxKTsKLQkJZkFkYXB0ZXJzW2FkYXB0ZXJDb3VudCsrXSA9IGFkYXB0ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBuZWVkZWQpIHsKLQkJaWYgKGZBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQkvLyBmaXJzdCB0aW1lCi0JCQlmQWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW25lZWRlZCArIGdyb3d0aENvbnN0YW50XTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgb2xkTGVuZ3RoID0gZkFkYXB0ZXJzLmxlbmd0aDsKLQkJaWYgKG9sZExlbmd0aCA8IG5lZWRlZCkgewotCQkJSU5vZGVBZGFwdGVyW10gb2xkQWRhcHRlcnMgPSBmQWRhcHRlcnM7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBuZXdBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRBZGFwdGVycywgMCwgbmV3QWRhcHRlcnMsIDAsIGFkYXB0ZXJDb3VudCk7Ci0JCQlmQWRhcHRlcnMgPSBuZXdBZGFwdGVyczsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5PVCBBUEk6IHVzZWQgb25seSBmb3IgdGVzdGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWRhcHRlckNvdW50KCkgewotCQlyZXR1cm4gYWRhcHRlckNvdW50OwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYmVoYXZpb3IgZm9yIGdldHRpbmcgYW4gYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGdldEFkYXB0ZXJGb3IoT2JqZWN0IHR5cGUpIHsKLQkJLy8gZmlyc3QsIHdlJ2xsIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lCi0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBnZXRFeGlzdGluZ0FkYXB0ZXIodHlwZSk7Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCBhbHJlYWR5LAotCQkvLyBsZXQncyBjcmVhdGUgaXQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSByZWcuZ2V0RmFjdG9yeUZvcih0eXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGZhY3RvcnkuYWRhcHQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gV2Ugd29uJ3QgcHJldmVudCBudWxsIGZyb20gYmVpbmcgcmV0dXJuZWQsIGJ1dCBpdCB3b3VsZCBiZQotCQkJLy8gdW51c3VhbC4KLQkJCS8vIEl0IG1pZ2h0IGJlIGJlY2F1c2UgRmFjdG9yeSBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHksIG9yCi0JCQkvLyBub3QgaW5zdGFsbGVkLCBzbyB3ZSdsbCBhbGxvdyB3YXJuaW5nIG1lc3NhZ2UuCi0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogbm8gYWRhcHRlciB3YXMgZm91bmQgb3IgY3JlYXRlZCBmb3IgIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiBsaXN0LCBzaW5jZSBjbGllbnRzIHNob3VsZCBub3QgbWFuaXB1bGF0ZQotCSAqIG91ciBsaXN0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgYWRkL3JlbW92ZUFkYXB0ZXIuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRhcHRlcnMoKSB7Ci0JCWlmIChmQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXJDb3VudCA9PSAwKSB7Ci0JCQkJZkFkYXB0ZXJzID0gbnVsbDsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gbWFrZSBhIG5ldyBhcnJheSwgdG8gYmUgc3VyZQotCQkJCS8vIGl0IGRvZXNuJ3QgY29udGFpbiBudWxscyBhdCBlbmQsIHdoaWNoIG1heSBiZQotCQkJCS8vIHByZXNlbnQgdGhlcmUgZm9yICJncm93dGgiLgotCQkJCUlOb2RlQWRhcHRlcltdIHRlbXBBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbYWRhcHRlckNvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZBZGFwdGVycywgMCwgdGVtcEFkYXB0ZXJzLCAwLCBhZGFwdGVyQ291bnQpOwotCQkJCS8vIEVNRiB1c2VzIHRoZSB1bm1vZGlmaWFibGVDb2xsZWN0aW9uLiBJdHMgYSBiaXQgb2YgYQotCQkJCS8vIHBlcmZvcm1hbmNlCi0JCQkJLy8gZHJhaW4sIGJ1dCBtYXkgd2FudCB0byBsZWF2ZSBpbiBzaW5jZQotCQkJCS8vIGl0IHdvdWxkICJmYWlsIGZhc3QiIGlmIHNvbWVvbmUgd2FzIHRyeWluZyB0byBtb2RpZnkgdGhlCi0JCQkJLy8gbGlzdC4KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KHRlbXBBZGFwdGVycykpOwotCQkJCS8vIHJldHVybiBBcnJheXMuYXNMaXN0KG5ld0FkYXB0ZXJzKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZ2V0QWRhcHRlclRpbWVDcml0ZXJpYSgpIHsKLQkJLy8gdG8gInJlLWdldCIgdGhlIHByb3BlcnR5IGVhY2ggdGltZSBpcyBhIGxpdHRsZSBhd2t3YXJkLCBidXQgd2UKLQkJLy8gZG8gaXQgdGhhdCB3YXkgdG8gYXZvaWQgYWRkaW5nIGluc3RhbmNlIHZhcmlhYmxlIGp1c3QgZm9yCi0JCS8vIGRlYnVnZ2luZy4KLQkJLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGRlYnVnQWRhcHRlck5vdGlmY2F0aW9uVGltZQotCQkvLyBpcyB0cnVlLgotCQlmaW5hbCBTdHJpbmcgY3JpdGVyaWFTdHIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvbS9hZGFwdGVyL25vdGlmaWNhdGlvbi90aW1lL2NyaXRlcmlhIik7IC8vJE5PTi1OTFMtMSQKLQkJbG9uZyBjcml0ZXJpYSA9IC0xOwotCQlpZiAoY3JpdGVyaWFTdHIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljcml0ZXJpYSA9IExvbmcucGFyc2VMb25nKGNyaXRlcmlhU3RyKTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhdGNoIHRvIGJlIHN1cmUgd2UgZG9uJ3QgYnVyYiBpbiBub3RpZmljYXRpb24gbG9vcCwKLQkJCQkvLyBidXQgaWdub3JlLCBzaW5jZSBqdXN0IGEgZGVidWcgYWlkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyaXRlcmlhOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKE9iamVjdCB0eXBlKSB7Ci0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJDb3VudDsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYSA9IGZBZGFwdGVyc1tpXTsKLQkJCWlmIChhLmlzQWRhcHRlckZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSBhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCwKLQkJLy8gcmV0dXJuIHRoZSBudWxsIHJlc3VsdAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnkoaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCi0JCWlmIChmQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJaW50IGxvY2FsQWRhcHRlckNvdW50ID0gMDsKLQkJCUlOb2RlQWRhcHRlcltdIGxvY2FsQWRhcHRlcnMgPSBudWxsOwotCi0JCQkvLyBsb2NrIG9iamVjdCB3aGlsZSBtYWtpbmcgbG9jYWwgYXNzaWdubWVudHMKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWxvY2FsQWRhcHRlckNvdW50ID0gYWRhcHRlckNvdW50OwotCQkJCWxvY2FsQWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2xvY2FsQWRhcHRlckNvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZBZGFwdGVycywgMCwgbG9jYWxBZGFwdGVycywgMCwgbG9jYWxBZGFwdGVyQ291bnQpOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsQWRhcHRlckNvdW50OyBpKyspIHsKLQkJCQlJTm9kZUFkYXB0ZXIgYSA9IGxvY2FsQWRhcHRlcnNbaV07Ci0KLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX0FEQVBURVJOT1RJRklDQVRJT05USU1FKSB7Ci0JCQkJCWxvbmcgZ2V0QWRhcHRlclRpbWVDcml0ZXJpYSA9IGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEoKTsKLQkJCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJLy8gKioga2VlcCB0aGlzIGxpbmUgaWRlbnRpY2FsIHdpdGggbm9uLWRlYnVnIHZlcnNpb24hIQotCQkJCQlhLm5vdGlmeUNoYW5nZWQodGhpcywgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotCQkJCQlsb25nIG5vdGlmeUR1cmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJCWlmIChnZXRBZGFwdGVyVGltZUNyaXRlcmlhID49IDAgJiYgbm90aWZ5RHVyYXRpb24gPiBnZXRBZGFwdGVyVGltZUNyaXRlcmlhKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkYXB0ZXIgbm90aWZ5RHVyYXRpb246ICIgKyBub3RpZnlEdXJhdGlvbiArICIgIGNsYXNzOiAiICsgYS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyAqKiBrZWVwIHRoaXMgbGluZSBpZGVudGljYWwgd2l0aCBkZWJ1ZyB2ZXJzaW9uISEKLQkJCQkJCWEubm90aWZ5Q2hhbmdlZCh0aGlzLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJdHMgaW1wb3J0YW50IHRvICJrZWVwIGdvaW5nIiwgc2luY2Ugbm90aWZpY2F0aW9ucwotCQkJCQkJLy8gb2NjdXIgYmV0d2VlbiBhbgotCQkJCQkJLy8gYWJvdXRUb0NoYW5nZSBldmVudCBhbmQgYSBjaGFuZ2VkIGV2ZW50IC0tIHRoZQotCQkJCQkJLy8gY2hhbmdlZCBldmVudCB0eXBpY2FsbHkgYmVpbmcgcmVxdWlyZQotCQkJCQkJLy8gdG8gcmVzdG9yZSBzdGF0ZSwgZXRjLiBTbywgd2UganVzdCBsb2cgbWVzc2FnZSwgZG8KLQkJCQkJCS8vIG5vdCByZS10aHJvdyBpdCwgYnV0Ci0JCQkJCQkvLyB0eXBpY2FsbHkgdGhlIGV4Y2VwdGlvbiBkb2VzIGluZGljYXRlIGEgc2VyaW91cwotCQkJCQkJLy8gcHJvZ3JhbSBlcnJvci4KLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQsICIgKyBhICsgIiB0aHJldyBmb2xsb3dpbmcgZXhjZXB0aW9uIGR1cmluZyBhZGFwdGVyIG5vdGlmaWNhdGlvbiAoIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiICkiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFkYXB0ZXIoSU5vZGVBZGFwdGVyIGEpIHsKLQkJaWYgKGZBZGFwdGVycyA9PSBudWxsIHx8IGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJSU5vZGVBZGFwdGVyW10gbmV3QWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2ZBZGFwdGVycy5sZW5ndGhdOwotCQlpbnQgb2xkQWRhcHRlckNvdW50ID0gYWRhcHRlckNvdW50OwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRBZGFwdGVyQ291bnQ7IG9sZEluZGV4KyspIHsKLQkJCUlOb2RlQWRhcHRlciBjYW5kaWRhdGUgPSBmQWRhcHRlcnNbb2xkSW5kZXhdOwotCQkJaWYgKGEgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJYWRhcHRlckNvdW50LS07Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQkJZWxzZQotCQkJCW5ld0FkYXB0ZXJzW25ld0luZGV4KytdID0gZkFkYXB0ZXJzW29sZEluZGV4XTsKLQkJfQotCQlpZiAoZm91bmQpCi0JCQlmQWRhcHRlcnMgPSBuZXdBZGFwdGVyczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvRG9jdW1lbnRDaGFuZ2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0RvY3VtZW50Q2hhbmdlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDk4N2RjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvRG9jdW1lbnRDaGFuZ2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudENoYW5nZWQgZXh0ZW5kcyBNb2RlbExpZmVjeWNsZUV2ZW50IHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZk5ld0RvY3VtZW50OwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZPbGREb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudENoYW5nZWQoKSB7Ci0KLQkJc3VwZXIoTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEKTsKLQotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudENoYW5nZWQoaW50IGFkZGl0aW9uYWxUeXBlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJc3VwZXIobW9kZWwsIE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCB8IGFkZGl0aW9uYWxUeXBlKTsKLQotCX0KLQotCXB1YmxpYyBEb2N1bWVudENoYW5nZWQoaW50IGFkZGl0aW9uYWxUeXBlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50IG9sZERvY3VtZW50LCBJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0KLQkJdGhpcyhhZGRpdGlvbmFsVHlwZSwgbW9kZWwpOwotCQlmT2xkRG9jdW1lbnQgPSBvbGREb2N1bWVudDsKLQkJZk5ld0RvY3VtZW50ID0gbmV3RG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZOZXdEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRPbGREb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZk9sZERvY3VtZW50OwotCX0KLQotCXZvaWQgc2V0TmV3RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCi0JCWZOZXdEb2N1bWVudCA9IG5ld0RvY3VtZW50OwotCX0KLQotCXZvaWQgc2V0T2xkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBvbGREb2N1bWVudCkgewotCi0JCWZPbGREb2N1bWVudCA9IG9sZERvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiN2U5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbExpZmVjeWNsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgaXMgYW4gZWFybHkgdmVyc2lvbiBvZiBhIGNsYXNzIHRoYXQgbWF5IGNoYW5nZSBvdmVyIHRoZSBuZXh0IGZldwotICogbWlsZXN0b25lcy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIHsKLQotCXZvaWQgcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpOwotCi0Jdm9pZCBwcm9jZXNzUHJlTW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2JmZjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgbmV3IE1vZGVsIGZyb20gYSByZXNvdXJjZSwgb3IgYXMgYSBuZXcsIGVtcHR5Ci0gKiBpbnN0YW5jZS4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbExvYWRlciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHBlcmZvcm0gYWxsIHRoZSBtb2RlbCBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiZWZvcmUKLQkgKiBpdCBjb250YWlucyBjb250ZW50LCBuYW1lbHksIGl0IHNob3VsZCBjYWxsIG5ld01vZGVsLCB0aGUKLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgdGhlbiBzZXRBZGFwdGVyRmFjdG9yaWVzLiAodGhpcyBpcwotCSAqIHRlbnRhdGl2ZSkKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlTW9kZWwuIENyZWF0ZXMgYSBuZXcgbW9kZWwgYmFzZWQgb24gb2xkIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTW9kZWwKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0KLQl2b2lkIGxvYWQoSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIGxvYWQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCUlNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gYW4gbmV3LCBlbXB0eSBTdHJ1Y3R1cmVkIE1vZGVsCi0JICogYXBwcm9wcmlhdGUgZm9yIGl0c2VsZi4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBnZXQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZSB0aGUKLQkgKiBtb2RlbHMgLi4uIG5vcm1hbGx5IGJ5IGEgY2FsbCB0byBzZXRUZXh0IG9uIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZvcgotCSAqIFN0cnVjdHVyZWRNb2RlbHMuIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlCi0JICogc2hhcmluZyBhIG1vZGVsIGFuZCB0aGVuIGNoYW5nZXMgY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvcgotCSAqIGFuZCBzZXZlcmFsICJkaXNwbGF5cyIgYXJlIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQKLQkgKiB3aXRob3V0IHNhdmluZyBjaGFuZ2VzLCB0aGVuIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5Ci0JICogc2hvdWxkIHJldmVydCB0byB0aGUgb3JpZ2luYWwgdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXZvaWQgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIFN0cnVjdHVyZWQgTW9kZWwgd2l0aCB0aGUgZ2l2ZW4gU3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlIGFzCi0JICogaXRzIGRvY3VtZW50IChpbnN0ZWFkIG9mIGEgbmV3IGRvY3VtZW50IGluc3RhbmNlIGFzIHdlbGwpCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzE1NWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci0KLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgc2V0IG9mIEFQSXMgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIG1hbmFnZXIsCi0gKiBmb3IgbWFuYWdpbmcgKGFkZCBvciByZW1vdmUpIG1vZGVsIGxvYWRlcnMgYW5kIG1vZGVsIGR1bXBlcnMsIGFuZCBmb3IKLSAqIG1hbmFnaW5nIChnZXQsIHJlbGVhc2UsIHNhdmUsIGFuZCBzYXZlIGFzKSBtb2RlbHMuCi0gKiAKLSAqIENsaWVudHMgY2FuIHJlZmVyZW5jZSwgYnV0IHNob3VsZCBub3QgaW1wbGVtZW50LgotICogCi0gKiBAc2VlIFN0cnVjdHVyZWRNb2RlbE1hbmdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE1hbmFnZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRFVQTElDQVRFRF9NT0RFTCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlci5EVVBMSUNBVEVEX01PREVMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOTUFOQUdFRF9NT0RFTCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlci5VTk1BTkFHRURfTU9ERUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDYWxjdWxhdGUgaWQgcHJvdmlkZXMgYSBjb21tb24gd2F5IHRvIGRldGVybWluZSB0aGUgaWQgZnJvbSB0aGUgaW5wdXQKLQkgKiAuLi4gbmVlZGVkIHRvIGdldCBhbmQgc2F2ZSB0aGUgbW9kZWwuIEl0IGlzIGEgc2ltcGxlIGNsYXNzIHV0aWxpdHksIGJ1dAotCSAqIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBzbyBjYW4gYmUgYWNjZXNzZWQgdmlhIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElGaWxlIGZpbGUpOwotCi0JSVN0cnVjdHVyZWRNb2RlbCBjb3B5TW9kZWxGb3JFZGl0KFN0cmluZyBvbGRJZCwgU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZTsKLQotCS8qKgotCSAqIGNyZWF0ZU5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGUgbmV3IGluc3RhbmNlIGhhcyBubwotCSAqIGNvbnRlbnQuIE5vdGU6IHRoaXMgcHJvZHVjZXMgYW4gdW5tYW5hZ2VkIG1vZGVsLCBmb3IgdGVtcG9yYXJ5IHVzZS4gSWYKLQkgKiBhIHRydWUgc2hhcmVkIG1vZGVsIGlzIGRlc2lyZWQsIHVzZSAiY29weSIuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTmV3SW5zdGFuY2UoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBpdHMgYXNzdW1lIHRoYXQgSUZpbGUgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgYXMKLQkgKiBhIHJlc291cmNlIHlldC4gSWYgaXQgZG9lcywgUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgdGhlIHJlc291cmNlIGRvZXMgYWxyZWFkeSBleGlzdCwgdGhlbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IgaXMKLQkgKiB0aGUgcmlnaHQgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGNsaWVudHMgc2hvdWxkIHZlcmlmeSBJRmlsZSBleGlzdHMgYmVmb3JlIHVzaW5nCi0JICogdGhpcyBtZXRob2QuIElmIHRoaXMgSUZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4KLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgdGhlIGNvcnJlY3QgQVBJIHRvIHVzZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEKLQkgKiBwcm9wZXIgcGFyc2VyIGFzc2lnbmVkLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYW4gZW1wdHkKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgbmVlZGVkLiBPdGhlcndpc2UsIHVzZSBJRmlsZSBmb3JtLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBjb250ZW50VHlwZUlkKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0tIEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gZGlzY291YWdlIHVzZSBvZiB0aGlzIG1ldGhvZC4KLQkgKiAgICAgICAgICAgICBJdCBkb2VzIG5vdCByZWFsbHkgd29yayBmb3IgSlNQIGZyYWdtZW50cywgc2luY2UgSlNQCi0JICogICAgICAgICAgICAgRnJhZ21lbnRzIG5lZWQgYW4gSUZpbGUgdG8gY29ycmVjdGx5IGxvb2sgdXAgdGhlIGNvbnRlbnQKLQkgKiAgICAgICAgICAgICBzZXR0aW5ncy4gVXNlIElGaWxlIGZvcm0gaW5zdGVhZC4gTm90ZTogc29tZSBjb25mdXN0aW9uCi0JICogICAgICAgICAgICAgd2l0aCBpdCBhbmQgdGhlIGZvcm0gZm9yIEhUUFAgZW5jb2RpbmcsIHNvIG9uY2UgYSBudWxsIGFyZwotCSAqICAgICAgICAgICAgIGlzIGFsbG93ZWQgaW4gdGhhdCBBUEkgLi4uIHdlIGNhbiByZW1vdmUgdGhpcyBvbmUuIChhZnRlcgotCSAqICAgICAgICAgICAgIHZlcmlmeWluZyBhZ2FpbiB3aXRoIFRvbS9MaW5rc2J1aWxkKQotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIGlhbmFFbmNvZGluZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkKTsKLQotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkLCBVUklSZXNvbHZlciByZXNvbHZlcik7Ci0KLQkvKioKLQkgKiBOb3RlOiB1c2VycyBvZiB0aGlzICdtb2RlbCcgbXVzdCBzdGlsbCByZWxlYXNlIGl0IHdoZW4gZmluaXNoZWQuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZXJlJ3Mgbm90IGEgbW9kZWwgY29ycmVzcG9uZGluZyB0byBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBOb3RlOiB1c2VycyBvZiB0aGlzICdtb2RlbCcgbXVzdCBzdGlsbCByZWxlYXNlIGl0IHdoZW4gZmluaXNoZWQuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZXJlJ3Mgbm90IGEgbW9kZWwgY29ycmVzcG9uZGluZyB0byBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RXhpc3RpbmdNb2RlbElkcygpOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZERvY3VtZW50IHRleHRGaWxlQnVmZmVyRG9jdW1lbnQpOwotCi0JLyoKLQkgKiBAZGVwcmVjYXRlZCAtIGEgVVJJIHJlc29sdmVyIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbgotCSAqICAgICAgICAgICAgIG5lZWRlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChTdHJpbmcgaWQsIElucHV0U3RyZWFtIGluU3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgYW5kIGxpbmUgZGVsaW1pdGVycyBhcmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWREb2N1bWVudCB0ZXh0RmlsZUJ1ZmZlckRvY3VtZW50KTsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBhIFVSSSByZXNvbHZlciBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHdoZW4KLQkgKiAgICAgICAgICAgICBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNyZWF0ZSBhIG5ldyBtb2RlbCBpZiBpdCBhbHJlYWR5IGV4aXN0cyAuLi4gaWYKLQkgKiBmb3JjZSBpcyBmYWxzZS4gVGhlIGlkZWEgaXMgdGhhdCBhIGNsaWVudCBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbmNlCi0JICogd2l0aCBmb3JjZSBzZXQgdG8gZmFsc2UuIElmIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHByb21wdCBjbGllbnQKLQkgKiBpZiB0aGV5IHdhbnQgdG8gb3ZlcndyaXRlLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNyZWF0ZSBhIG5ldyBtb2RlbCBpZiBpdCBhbHJlYWR5IGV4aXN0cyAuLi4gaWYKLQkgKiBmb3JjZSBpcyBmYWxzZS4gVGhlIGlkZWEgaXMgdGhhdCBhIGNsaWVudCBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbmNlCi0JICogd2l0aCBmb3JjZSBzZXQgdG8gZmFsc2UuIElmIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHByb21wdCBjbGllbnQKLQkgKiBpZiB0aGV5IHdhbnQgdG8gb3ZlcndyaXRlLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50KE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgbWFuYWdlciBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVDaGFuZ2luZygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIG1vZGVsLiBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXZvaWQgbW92ZU1vZGVsKE9iamVjdCBvbGRJZCwgT2JqZWN0IG5ld0lkKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGVudCB0eXBlIG9mIGEgbW9kZWwgY2hhbmdlcy4gSXRzCi0JICogYXNzdW1lZCB0aGUgY29udGVudFR5cGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkLCBhbmQgdGhpcyBtZXRob2QgdXNlcwotCSAqIHRoZSB0ZXh0IG9mIHRoZSBvbGQgb25lLCB0byByZXBvcHVsYXRlIHRoZSB0ZXh0IG9mIHRoZSBuZXcgb25lLiBJbgotCSAqIHRoZW9yeSwgdGhlIGFjdHVhbCBpbnN0YW5jZSBjb3VsZCBjaGFuZ2UsIChlLmcuIHVzaW5nICdzYXZlQXMnIHRvIGdvCi0JICogZnJvbSB4bWwgdG8gZHRkKSwgYnV0IGluIHByYWN0aWNlLCB0aGUgaW50ZW50IG9mIHRoaXMgQVBJIGlzIHRvIHJldHVybgotCSAqIHRoZSBzYW1lIGluc3RhbmNlLCBqdXN0IHVzaW5nIGRpZmZlcmVudCBoYW5kbGVycywgYWRhcHRlciBmYWN0b3JpZXMsCi0JICogZXRjLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QgdXNlCi0JICogdGhlIGNhY2hlZCB2ZXJzaW9uLCBidXQgZm9yY2VzIHRoZSBjYWNoZWQgdmVyc2lvbiB0byBiZSByZXBsYWNlZCB3aXRoIGEKLQkgKiBmcmVzaCwgdW5jaGFuZ2VkIHZlcnNpb24uIE5vdGU6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoYW5nZSBhbnkKLQkgKiByZWZlcmVuY2UgY291bnRzLiBBbHNvLCBpZiB0aGVyZSBpcyBub3QgYWxyZWFkeSBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZQotCSAqIG1vZGVsLCB0aGVuIHRoaXMgY2FsbCBpcyBlc3NlbnRpYWxseSBpZ25vcmVkICh0aGF0IGlzLCBpdCBkb2VzIG5vdCBwdXQKLQkgKiBhIG1vZGVsIGluIHRoZSBjYWNoZSkgYW5kIHJldHVybnMgbnVsbC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkTW9kZWwoT2JqZWN0IGlkLCBJbnB1dFN0cmVhbSBpblN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLQl2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxTdGF0ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmRkOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxTdGF0ZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aG9zZSB3YW50aW5nIHRvIGxpc3RlbiB0byBhIG1vZGVsJ3Mgc3RhdGUgY2hhbmdpbmcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuIFRoaXMgdHlwaWNhbGx5IGlzIGluaXRpYXRlZCBieSBvbmUKLQkgKiBjbGllbnQgb2YgdGhlIG1vZGVsLCB0byBzaWduYWwgYSBsYXJnZSBjaGFuZ2UgYW5kL29yIGEgY2hhbmdlIHRvIHRoZQotCSAqIG1vZGVsJ3MgSUQgb3IgYmFzZSBMb2NhdGlvbi4gQSB0eXBpY2FsIHVzZSBtaWdodCBiZSBpZiBhIGNsaWVudCBtaWdodAotCSAqIHdhbnQgdG8gc3VzcGVuZCBwcm9jZXNzaW5nIHVudGlsIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotCSAqLwotCXZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IHRoZSBjaGFuZ2VzIGZvcmV0b2xkIGJ5IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCBoYXZlIGJlZW4KLQkgKiBtYWRlLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIHRvIHJlZnJlc2gsIG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIHRoYXQKLQkgKiB3YXMgc3VzcGVuZGVkIGFzIGEgcmVzdWx0IG9mIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZC4KLQkgKi8KLQl2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgYSBtb2RlbCdzIGRpcnR5IHN0YXRlIGhhcyBjaGFuZ2VkLCBhbmQgcGFzc2VzIHRoYXQgc3RhdGUKLQkgKiBpbiBpc0RpcnR5LiBBIG1vZGVsIGJlY29tZXMgZGlydHkgd2hlbiBhbnkgY2hhbmdlIGlzIG1hZGUsIGFuZCBiZWNvbWVzCi0JICogbm90LWRpcnR5IHdoZW4gdGhlIG1vZGVsIGlzIHNhdmVkLgotCSAqLwotCXZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpOwotCi0JLyoqCi0JICogQSBtb2RlbERlbGV0ZWQgbWVhbnMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZC4gVGhlCi0JICogbW9kZWwgaXRzZWxmIGlzIG5vdCByZW1vdmVkIGZyb20gbW9kZWwgbWFuYWdlbWVudCB1bnRpbCBhbGwgaGF2ZQotCSAqIHJlbGVhc2VkIGl0LiBOb3RlOiBiYXNlTG9jYXRpb24gaXMgbm90IChuZWNlc3NhcmlseSkgY2hhbmdlZCBpbiB0aGlzCi0JICogZXZlbnQsIGJ1dCBtYXkgbm90IGJlIGFjY3VyYXRlLgotCSAqLwotCXZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGhhcyBiZWVuIHJlbmFtZWQgb3IgY29waWVkIChhcyBpbiBzYXZlQXMuLikuIEluIHRoZSByZW5hbWVkCi0JICogY2FzZSwgdGhlIHR3byBwYXJhbWVudGVycyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIGFuZCBvbmx5IGNvbnRhaW4gdGhlCi0JICogbmV3IGluZm8gZm9yIGlkIGFuZCBiYXNlIGxvY2F0aW9uLgotCSAqLwotCXZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotCi0Jdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0Jdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODE0MThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3Mgbm9kZXMgdG8gYmUgYWRhcHRlZC4KLSAqIAotICogVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgdHlwZSBvZiBhZGFwdGVyIChJQWRhcHRhYmxlKSBhbmQgYmFzZQotICogYWRhcHRlciBpcyB0aGF0IHRoZXNlIGFkYXB0ZXJzIGFyZSBub3RpZmllZCBvZiBjaGFuZ2VzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBUaGUgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMgdGhpcyBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhZGFwdGVyIGlzCi0JICogYXBwcm9wcmlhdGUgZm9yICd0eXBlJy4gVHlwaWNhbGx5LCBhZGFwdGVycyByZXR1cm4gdHJ1ZSBiYXNlZCBvbgotCSAqIGlkZW50aXR5IGNvbXBhcmlzb24gdG8gJ3R5cGUnLCBidXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIHRoYXQgaXMsIHRoZQotCSAqIGRlY2lzaW9uIGNhbiBiZSBiYXNlZCBvbiBjb21wbGV4IGxvZ2ljLgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiBTZW50IHRvIGFkYXB0ZXIgd2hlbiBub3RpZmllciBjaGFuZ2VzLiBFYWNoIG5vdGlmaWVyIGlzIHJlc3BvbnNpYmxlIGZvcgotCSAqIGRlZmluaW5nIHNwZWNpZmljIGV2ZW50VHlwZXMsIGZlYXR1cmUgY2hhbmdlZCwgZXRjLgotCSAqIAotCSAqIElTU1VFOiBtYXkgYmUgbW9yZSBldm9sdmFibGUgaWYgdGhlIGFyZ3VtZW50IHdhcyBvbmUgYmlnICdub3RpZmllcgotCSAqIGV2ZW50JyBpbnN0YW5jZS4KLQkgKi8KLQl2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTY3YzQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogSU5vZGVOb3RpZmllcnMgY2FuIGJlIGFkYXB0ZWQgYnkgSU5vZGVBZGFwdGVycy4gVGhpcyBmYWN0b3J5IGludGVyZmFjZQotICogcHJvdmlkZXMgYSB3YXkgdG8gcHJvdmlkZSBmYWN0b3JpZXMgd2hpY2ggYXJlIGludm9rZWQgYnkgdGhlIGluZnJhc3RydWN0dXJlCi0gKiB0byBtYW5hZ2UgdGhpcyBwcm9jZXNzLCBmcm9tIGNyZWF0aW5nLCB0byBhZGFwdGluZywgdG8gcmVsZWFzaW5nLCBpZgotICogcmVxdWlyZWQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGFuIGFkYXB0ZXIgZmFjdG9yeSBpcyB0byBjcmVhdGUgYW4gYWRhcHRlciBhbmQKLQkgKiBhc3NvY2lhdGUgaXQgd2l0aCBhbiBJTm9kZU5vdGlmaWVyLiBUaGlzIGFkYXB0IG1ldGhvZCBNZXRob2QgdGhhdAotCSAqIHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIFRoZQotCSAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciwgaWYgYXBwcm9wcmlhdGUuCi0JICogCi0JICogTm90ZTogdGhlIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIHJldHVybmVkIG1heSBiZSBhIHNpbmdsZXRvbiBvciBub3QKLQkgKiAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUgSU5vZGVBZGFwdGVyIC4uLiBidXQgaW4gZ2VuZXJhbCBpdCBpcwotCSAqIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlIHN0YXRlbGVzcywgc28gdGhlIGVmZmljaWVuY2llcyBvZiBhCi0JICogc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG5vZGUgbm90aWZpZXIgdG8gYmUgYWRhcHRlZAotCSAqLwotCUlOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG9iamVjdCk7Ci0KLQkvKioKLQkgKiBVbmxpa2UgY2xvbmUsIHRoaXMgbWV0aG9kIG1heSBvciBtYXkgbm90IHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSwgc3VjaAotCSAqIGFzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBJQWRhcHRlckZhY3RvcnkgaXMgaW50ZW5kZWQgdG8gYmUgYSBzaW5nbGV0b24uCi0JICogCi0JICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCk7Ci0KLQkvKioKLQkgKiBpc0ZhY3RvcnlGb3JUeXBlIGlzIGNhbGxlZCBieSBpbmZyYXN0cnVjdHVyZSB0byBkZWNpZGUgaWYgdGhpcyBhZGFwdGVyCi0JICogZmFjdG9yeSBpcyBhcHBvcmlhdGUgdG8gdXNlIGZvciBhbiBhZGFwdGVyIHJlcXVlc3QgdGhhdCBzcGVjaWZpZXMKLQkgKiAndHlwZScuCi0JICogCi0JICogQHBhcmFtIHR5cGUgLQotCSAqICAgICAgICAgICAgc2FtZSBvYmplY3QgdXNlZCB0byBpZGVudGlmeS9yZXF1ZXN0IGFkYXB0ZXJzLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmYWN0b3J5IGlzIGFwcHJvcHJpYXRlIGZvciB0eXBlLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgaXMgY2FsbGVkIGJ5IGluZnJhc3RydWN0dXJlIHdoZW4gdGhlIGZhY3RvcnkgcmVnaXN0cnkgaXMKLQkgKiByZWxlYXNlZCAod2hpY2ggaXMgZG9uZSB3aGVuIGEgc3RydWN0dXJlZCBtb2RlbCBpcyByZWxlYXNlZCkuIFRoaXMKLQkgKiBpbnRlbmVkIGZvciB0aGUgZmFjdG9yeSB0byBiZSBhbGxvd2VkIHRvIGNsZWFuIHVwIGFueSBzdGF0ZSBpbmZvcm1hdGlvbgotCSAqIGl0IG1heSBoYXZlLgotCSAqIAotCSAqIE5vdGU6IHdoaWxlIG5vdCByZWNvbW1lbmRlZCwgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGlmIGluZGl2aWR1YWwKLQkgKiBhZGFwdGVycyBuZWVkIHNvbWUgY2xlYW51cCAob3IgbmVlZCB0byBiZSByZWxlYXNlZCkgaXQgaXMgKHR5cGljYWxseSkKLQkgKiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeSB0byB0cmFjayB0aGVtLCBhbmQgaW5pdGlhdGUKLQkgKiB3aGF0IGV2ZXIgY2xlYW4gdXAgaXMgbmVlZGVkLiBJbiBvdGhlciB3b3JrcywgY2xlYW51cCBhdCB0aGUgYWRhdHBlcgotCSAqIGxldmVsIGlzIG5vdCBwcm92aWRlZCBieSBpbmZyYXN0cnVjdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZU5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTAzYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZU5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogSU5vZGVOb3RpZmllcnMgYW5kIElOb2RlQWRhcHRlcnMgZm9ybSBhIGNvbGxhYm9yYXRpb24gdGhhdCBhbGxvd3MgY2xpZW50cwotICogdG8gdXNlIHRoZSB0eXBpY2FsIGFkYXB0ZXIgcGF0dGVybiBidXQgd2l0aCBub3RpZmljYXRpb24gYWRkZWQsIHRoYXQgaXMsCi0gKiBjbGllbnQncyBhZGFwdGVycyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIG5vZGVOb3RpZmllciBjaGFuZ2VzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlTm90aWZpZXIgewotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgbm9uLXN0cnVjdHVyYWwgY2hhbmdlLCBzZW50IHRvIG5vZGUgbm90aWZpZXIncwotCSAqIHBhcmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IENIQU5HRSA9IDE7Ci0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGFuIGFkZCBldmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFERCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSByZW1vdmUgZXZlbnQuCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAzOwotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgc3RydWN0dXJhbCBjaGFuZ2UsIHNlbnQgdG8gbGVhc3QtY29tbW9uIHBhcmVudAotCSAqIG9mIG5vZGUgbm90aWZpZXJzIGludm9sdmVkIGluIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgU1RSVUNUVVJFX0NIQU5HRUQgPSA0OwotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgbm90aWZpY2F0aW9uIHRvIHBhcmVudCBub3RpZmllciB0aGFuIGl0cwotCSAqIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0hBTkdFRCA9IDU7Ci0KLQotCS8qKgotCSAqIE5PVCBBUEk6IHRoZXNlIHN0cmluZ3MgYXJlIGZvciBwcmludGluZywgc3VjaCBhcyBkdXJpbmcgZGVidWdpbmcKLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gRVZFTlRfVFlQRV9TVFJJTkdTID0gbmV3IFN0cmluZ1tdeyJ1bmRlZmluZWQiLCAiQ0hBTkdFIiwgIkFERCIsICJSRU1PVkUiLCAiU1RSVUNVVFJFRF9DSEFOR0VEIiwgIkNPTlRFTlRfQ0hBTkdFRCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCi0KLQkvKioKLQkgKiBBZGQgYW4gYWRhcHRlciBvZiB0aGlzIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgYWRhcHRlciB0byBiZSBhZGRlZAotCSAqIAotCSAqLwotCXZvaWQgYWRkQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc2l0aW5nIGFkYXB0ZXIgb2YgdHlwZSAidHlwZSIgb3IgaWYgbm9uZSBmb3VuZCBjcmVhdGUgYQotCSAqIG5ldyBhZGFwdGVyIHVzaW5nIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlJTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlckZvcihPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSByZWFkLW9ubHkgQ29sbGVjdGlvbiBvZiB0aGUgQWRhcHRlcnMgdG8gdGhpcyBub3RpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgYWRhcHRlcnMuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRBZGFwdGVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGV4aXNpdGluZyBhZGFwdGVyIG9mIHR5cGUgInR5cGUiIG9yIG51bGwgaWYgbm9uZSBmb3VuZAotCSAqLwotCUlOb2RlQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoT2JqZWN0IHR5cGUpOwotCi0JLyoqCi0JICogc2VudCB0byBhZGFwdGVyIHdoZW4gaXRzIG5vZGVOb3RpZmllciBjaGFuZ2VzLgotCSAqLwotCXZvaWQgbm90aWZ5KGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFuIGFkYXB0ZXIgb2YgdGhpcyBub3RpZmllci4gSWYgdGhlIGFkYXB0ZXIgZG9lcyBub3QgZXhpc3QgZm9yCi0JICogdGhpcyBub2RlIG5vdGlmaWVyLCB0aGlzIHJlcXVlc3QgaXMgaWdub3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgdG8gcmVtb3ZlCi0JICovCi0Jdm9pZCByZW1vdmVBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVN0cnVjdHVyZWRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzlhYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZE1vZGVscyBhcmUgbWFpbmx5IGludGVyZXN0aW5nIGJ5IHRoZWlyIGV4dGVuc2lvbnMgYW5kCi0gKiBpbXBsZW1lbnRlcnMuIFRoZSBtYWluIHB1cnBvc2VkIG9mIHRoaXMgYWJzdHJhY3Rpb24gaXMgdG8gcHJvdmlkZSBhIGNvbW1vbgotICogbWVhbnMgdG8gbWFuYWdlIG1vZGVscyB0aGF0IGhhdmUgYW4gYXNzb2NpYXRlZCBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAyLjAKLSAqIAotICogPHA+Ci0gKiBJU1NVRTogdGhpcyBpbnRlcmZhY2UgbmVlZHMgdG9uIG9mIGNsZWFudXAhCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRNb2RlbCBleHRlbmRzIElBZGFwdGFibGUgewotCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICogCi0JICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdGVuZXJzIGlzCi0JICogc2VudCBvbmx5IG9uY2UuCi0JICogCi0JICogTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkKLQkgKiB0byByZXN0b3JlIHRoZSBtb2RlbCdzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUgY2hhbmdlcy4gU2VlCi0JICogZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLgotCSAqIAotCSAqIFRoZSBtZXRob2QgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmCi0JICogdGhlIG1vZGVsIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIgdG8gY2hhbmdlZE1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQKLQkgKiBiZWZvcmUgY2hhbmdlZE1vZGVsLiBBIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0IG5vciBjYWxsIGFib3V0VG9DaGFuZ2VNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBjaGFuZ2VkTW9kZWwgbGF0ZXIgZnJvbSB0aGUgc2FtZSBUaHJlYWQuCi0JICovCi0Jdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCXZvaWQgYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIGFkZE1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBhIGNsaWVudCBjb250cm9sbGVkIHdheSBvZiBub3RpZnlpbmcgYWxsIE1vZGVsRXZlbnQKLQkgKiBsaXN0ZW5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkCi0JICogcGFpciB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwKLQkgKiAuLi4gb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlCi0JICogY2hhbmdlZCBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEKLQkgKiBmaW5hbGx5IGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbAotCSAqIHdpdGhvdXQgY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuCi0JICogCi0JICogSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VkTW9kZWwoKTsKLQotCWxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY29weShTdHJpbmcgaWQpIHRocm93cyBSZXNvdXJjZUluVXNlLCBSZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci0KLQkvKioKLQkgKiBEaXNhYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQl2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5hYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQl2b2lkIGVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0KLQkvKioKLQkgKiBFbmQgcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogRW5kIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNsaWVudC1kZWZpbmVkIHZhbHVlIGZvciB3aGF0IHRoYXQgY2xpZW50IChhbmQvb3IgbG9hZGVyKQotCSAqIGNvbnNpZGVycyB0aGUgImJhc2UiIG9mIHRoZSBzdHJ1Y3R1cmVkIG1vZGVsLiBGcmVxdWVudGx5IHRoZSBsb2NhdGlvbgotCSAqIGlzIGVpdGhlciBhIHdvcmtzcGFjZSByb290LXJlbGF0aXZlIHBhdGggb2YgYSB3b3Jrc3BhY2UgcmVzb3VyY2Ugb3IgYW4KLQkgKiBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyIChTdHJpbmcpIGZvciB0aGlzIG1vZGVsLgotCSAqLwotCVN0cmluZyBnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG1vZGVsJ3MgRmFjdG9yeVJlZ2lzdHJ5LiBBIG1vZGVsIGlzIG5vdCB2YWxpZCB3aXRob3V0IG9uZS4KLQkgKi8KLQlGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdGhlIGlkIHRoYXQgdGhlIG1vZGVsIG1hbmFnZXIgdXNlcyB0byBpZGVudGlmeSB0aGlzIG1vZGVsCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBhIHRleHQgb2Zmc2V0IHdpdGhpbiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gSW5kZXhlZFJlZ2lvbiBjb250YWluaW5nIHRoaXMgb2Zmc2V0IG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCk7Ci0KLQlJTW9kZWxIYW5kbGVyIGdldE1vZGVsSGFuZGxlcigpOwotCi0JSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbAotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlZGl0LXJlc3BvbnNpYmxlIHJlZmVyZW5jZSBjb3VudCBvZgotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVhZGVyIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKCk7Ci0KLQlPYmplY3QgZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCk7Ci0KLQkvKioKLQkgKiBHZXQgVVJJIHJlc29sdXRpb24gaGVscGVyCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlVUklSZXNvbHZlciBnZXRSZXNvbHZlcigpOwotCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHVuZGVybHlpbmcgcmVzb3VyY2UsIHdoZW4gdGhpcyBtb2RlbCB3YXMgb3Blbiwgb3IKLQkgKiBsYXN0IHNhdmVkLiAoTm90ZTogZm9yIHRoaXMgdmVyc2lvbiwgdGhlIGNsaWVudCBtdXN0IG1hbmFnZSB0aGUKLQkgKiBhY2N1cmFjeSBvZiB0aGlzIGRhdGEpCi0JICovCi0JbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCi0JLyoqCi0JICogR2V0IHVuZG8gbWFuYWdlci4KLQkgKi8KLQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpOwotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0RpcnR5KCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgaXMgd2l0aGluIGEKLQkgKiAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIiBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGVsU3RhdGVDaGFuZ2luZygpOwotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc05ldygpOwotCi0JYm9vbGVhbiBpc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiBpZiB0aGUgbW9kZWwgaXMgZGlydHkgYW5kIGlmIHRoZSBtb2RlbCBpcwotCSAqIHNoYXJlZCBmb3Igd3JpdGUgYWNjZXNzLiBUaGUgbGFzdCB3cml0ZXIgYXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIGJlCi0JICogc3VyZSB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBzYXZlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgZWl0aGVyIGlzU2hhcmVkRm9yUmVhZCBvciBpc1NoYXJlZEZvckVkaXQKLQkgKiBpcyB0cnVlLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZEZvckVkaXQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoKTsKLQotCS8qKgotCSAqIG5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGF0IHRoZSBuZXdJbnN0YW5jZSBjb250YWlucwotCSAqIG5vIGNvbnRlbnQuIEl0cyBwdXJwb3NlIGlzIHNvIGNsaWVudHMgY2FuIGdldCBhIHRlbXBvcmFyeSwgdW5tYW5hZ2VkLAotCSAqIG1vZGVsIG9mIHRoZSBzYW1lICJ0eXBlIiBhcyB0aGUgb3JpZ2luYWwuIE5vdGU6IHRoZSBjbGllbnQgbWF5IHN0aWxsCi0JICogbmVlZCB0byBkbyBzb21lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBtb2RlbCByZXR1cm5lZCBieSBuZXdJbnN0YW5jZSwKLQkgKiBkZXBlbmRpbmcgb24gZGVzaXJlZCB1c2UuIEZvciBleGFtcGxlLCB0aGUgb25seSBmYWN0b3JpZXMgaW4gdGhlCi0JICogbmV3SW5zdGFuY2UgYXJlIHRob3NlIHRoYXQgd291bGQgYmUgbm9ybWFsbHkgYmUgY3JlYXRlZCBmb3IgYSBtb2RlbCBvZgotCSAqIHRoZSBnaXZlbiBjb250ZW50VHlwZS4gT3RoZXJzIGFyZSBub3QgY29waWVkIGF1dG9tYXRpY2FsbHksIGFuZCBpZgotCSAqIGRlc2lyZWQsIHNob3VsZCBiZSBhZGRlZCBieSBjbGllbnQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBuZXdJbnN0YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFBlcmZvcm1zIGEgcmVpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUuIEZvciB0aGlzIG1vZGVsLiBOb3RlIGZvciBmdXR1cmU6Ci0JICogdGhlcmUgbWF5IGJlIGEgZGF5IHdoZXJlIHRoZSBtb2RlbCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGlzIGEKLQkgKiBkaWZmZXJlbnQgaW5zdGFuY2UgdGhhbiB0aGUgaW5zdGFuY2UgaXQgd2FzIGNhbGxlZCBvbi4gVGhpcyB3aWxsIG9jY3VyCi0JICogd2hlbiB0aGVyZSBpcyBmdWxsIHN1cHBvcnQgZm9yICJzYXZlIGFzIiB0eXBlIGZ1bmN0aW9ucywgd2hlcmUgdGhlCi0JICogbW9kZWwgY291bGQgdGhlb3JldGljYWxseSBjaGFuZ2UgY29tcGxldGVseS4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBtb2RlbCB0byBmcmVlIHVwIGFueSByZXNvdXJjZXMgaXQgbWlnaHQgYmUKLQkgKiB1c2luZy4gSW4gcGFydGljdWxhciwgaXRzZWxmLCBhcyBzdG9yZWQgaW4gdGhlIElNb2RlbE1hbmFnZXIuCi0JICogCi0JICovCi0Jdm9pZCByZWxlYXNlRnJvbUVkaXQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBtb2RlbCB0byBmcmVlIHVwIGFueSByZXNvdXJjZXMgaXQgbWlnaHQgYmUKLQkgKiB1c2luZy4gSW4gcGFydGljdWxhciwgaXRzZWxmLCBhcyBzdG9yZWQgaW4gdGhlIElNb2RlbE1hbmFnZXIuCi0JICogCi0JICovCi0Jdm9pZCByZWxlYXNlRnJvbVJlYWQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmVwbGVuaXNoZXMgdGhlIG1vZGVsIHdpdGggdGhlIHJlc291cmNlIHdpdGhvdXQgc2F2aW5nCi0JICogYW55IHBvc3NpYmxlIGNoYW5nZXMuIEl0IGlzIHVzZWQgd2hlbiBvbmUgZWRpdG9yIG1heSBiZSBjbG9zaW5nLCBhbmQKLQkgKiBzcGVjaWZpY2FsbHkgc2F5cyBub3QgdG8gc2F2ZSB0aGUgbW9kZWwsIGJ1dCBhbm90aGVyICJkaXNwbGF5IiBvZiB0aGUKLQkgKiBtb2RlbCBzdGlsbCBuZWVkcyB0byBoYW5nIG9uIHRvIHNvbWUgbW9kZWwsIHNvIG5lZWRzIGEgZnJlc2ggY29weS4KLQkgKiAKLQkgKiBPbmx5IHZhbGlkIGZvciB1c2Ugd2l0aCBtYW5hZ2VkIG1vZGVscy4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCByZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgcmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQSBtZXRob2QgdGhhdCBtb2RpZmllcyB0aGUgbW9kZWwncyBzeW5jaHJvbml6YXRpb24gc3RhbXAgdG8gbWF0Y2ggdGhlCi0JICogcmVzb3VyY2UuIFR1cm5zIG91dCB0aGVyZSdzIHNldmVyYWwgd2F5cyBvZiBkb2luZyBpdCwgc28gdGhpcyBlbnN1cmVzIGEKLQkgKiBjb21tb24gYWxnb3JpdGhtLgotCSAqLwotCXZvaWQgcmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0Jdm9pZCByZXNvdXJjZURlbGV0ZWQoKTsKLQotCXZvaWQgcmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLQotCXZvaWQgc2F2ZSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQl2b2lkIHNhdmUoSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2V0QmFzZUxvY2F0aW9uKFN0cmluZyBuZXdCYXNlTG9jYXRpb24pOwotCi0JcHVibGljIHZvaWQgc2V0RGlydHlTdGF0ZShib29sZWFuIGRpcnR5U3RhdGUpOwotCi0Jdm9pZCBzZXRGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlSW5Vc2U7Ci0KLQl2b2lkIHNldE1vZGVsSGFuZGxlcihJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlcik7Ci0KLQl2b2lkIHNldE1vZGVsTWFuYWdlcihJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdTdGF0ZShib29sZWFuIG5ld1N0YXRlKTsKLQotCS8qKgotCSAqIFNldHMgYSAiZmxhZyIgdGhhdCByZWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQl2b2lkIHNldFJlaW5pdGlhbGl6ZU5lZWRlZChib29sZWFuIGIpOwotCi0JLyoqCi0JICogSG9sZHMgYW55IGRhdGEgdGhhdCB0aGUgcmVpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgbWlnaHQgZmluZCB1c2VmdWwgaW4KLQkgKiByZWluaXRpYWxpemluZyB0aGUgbW9kZWwuIFRoaXMgaXMgaGFuZHksIHNpbmNlIHRoZSByZWluaXRpYWxpemF0aW9uIG1heQotCSAqIG5vdCB0YWtlIHBsYWNlIGF0IG9uY2UsIGFuZCBzb21lICJvbGQiIGRhdGEgbWF5IGJlIG5lZWRlZCB0byBwcm9wZXJseQotCSAqIHVuZG8gcHJldmlvdXMgc2V0dGluZ3MuIE5vdGU6IHRoZSBwYXJhbWV0ZXIgd2FzIGludGVudGlvbmFsbHkgbWFkZSB0bwotCSAqIGJlIG9mIHR5cGUgJ09iamVjdCcgc28gZGlmZmVyZW50IG1vZGVscyBjYW4gdXNlIGluIGRpZmZlcmVudCB3YXlzLgotCSAqLwotCXZvaWQgc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogU2V0IHRoZSBVUkkgcmVzb2x1dGlvbiBoZWxwZXIKLQkgKi8KLQl2b2lkIHNldFJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKTsKLQotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KTsKLQotCS8qKgotCSAqIFNldCB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0luZGV4ZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSW5kZXhlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY1ZGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSW5kZXhlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIHBvc2l0aW9ucyBhbmQgbGVuZ3RocyBpbiBzb3VyY2UuIE5vdGljZSB0aGF0Ci0gKiB3aGlsZSBnZXRFbmRPZmZzZXQgYW5kIGdldExlbmd0aCBhcmUgcmVkdW5kYW50LCBnaXZlbiB0aGF0Ci0gKiAKLSAqIDxwcmU+Ci0gKiA8Y29kZT4KLSAqICAgICAgICAgIGdldEVuZE9mZnNldCgpID09IGdldFN0YXJ0T2Zmc2V0KCkgKyBnZXRMZW5ndGgoKTsgCi0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIAotICogd2UgcHJvdmlkZSAocmVxdWlyZSkgYm90aCBzaW5jZSBpbiBzb21lIGNhc2VzIGltcGxlbWVudG9ycyBtYXkgYmUgYWJsZSB0bwotICogcHJvdmlkZSBvbmUgb3IgdGhlIG90aGVyIG1vcmUgZWZmaWNpZW50bHkuCi0gKiAKLSAqIE5vdGU6IGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QgdGhhdCBpbXBsZW1lbnRvcnMgb2YgSW5kZXhlZFJlZ2lvbiAtLQotICogYXMgYSB3aG9sZSBjb2xsZWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgc291cmNlIC0tIG11c3QgY29tcGxldGVseSBjb3ZlciB0aGUKLSAqIG9yaWdpbmFsIHNvdXJjZS4gVGhleSBjdXJyZW50bHkgb2Z0ZW4gZG8sIHNvIHRob3VnaHQgSSdkIG1lbnRpb24gZXhwbGljaXRseQotICogdGhpcyBtYXkgbm90IGFsd2F5cyBiZSB0cnVlLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkUmVnaW9uIHsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIHRlc3QgaWYgdGhlIGluZGV4ZWQgcmVnaW9ucyBjb250YWlucyB0aGUgdGVzdCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdFBvc2l0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHRlc3QgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHN0YXJ0IG9mZnNldAotCSAqICAgICAgICAgYW5kIGxlc3MgdGhhbiBzdGFydCBvZmZzZXQgcGx1cyBsZW5ndGguCi0JICovCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGVzdFBvc2l0aW9uKTsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIGdldCBlbmQgb2Zmc2V0IG9mIHNvdXJjZSB0ZXh0LCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLQkgKiBkb2N1bW50LiBJbXBsZW1lbnRlcnMgc2hvdWxkIHJldHVybiAtMSBpZiwgb3Igc29tZSByZWFzb24sIHRoZSByZWdpb24KLQkgKiBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHJldHVybiBlbmRvZmZzZXQKLQkgKi8KLQlpbnQgZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgc291cmNlIHBvc3Rpb24gb2YgYmVnaW5uaW5nIG9mIGluZGV4ZWQgcmVnaW9uLgotCSAqIEltcGxlbWVudGVycyBzaG91bGQgcmV0dXJuIC0xIGlmLCBvciBzb21lIHJlYXNvbiwgdGhlIHJlZ2lvbiBpcyBub3QKLQkgKiB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBzdGFydCBvZiBpbmRleCByZWdpb24uCi0JICovCi0JaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIHRleHQuIEltcGxlbWVudGVycyBzaG91bGQKLQkgKiByZXR1cm4gLTEgaWYsIG9yIHNvbWUgcmVhc29uLCB0aGUgcmVnaW9uIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBsZW5ndGggb2YgaW5kZXggcmVnaW9uLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxNmZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbE1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ2xhc3MgdG8gYWxsb3cgYWNjZXNzIHRvIE1vZGVsTWFuYWdlci4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIG9uZSB0aGF0IGlzIGluCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3R0cnVjdHVyZWRNb2RlbE1hbmFnZXIKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIgewotCS8qKgotCSAqIERvIG5vdCBhbGxvdyBpbnN0YW5jZXMgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBvZiBJTW9kZWxNYW5hZ2VyLiBSZXR1cm5zIG51bGwgaWYgbW9kZWwKLQkgKiBtYW5hZ2VyIGNhbiBub3QgYmUgY3JlYXRlZCBvciBpcyBub3QgdmFsaWQgKHN1Y2ggYXMsIHdoZW4gd29ya2JlbmNoIGlzCi0JICogc2h1dHRpbmcgZG93bikuCi0JICogCi0JICogQHJldHVybiBJTW9kZWxNYW5hZ2VyIC0gcmV0dXJucyB0aGUgb25lIG1vZGVsIG1hbmFnZXIgZm9yIHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIG1vZGVsCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIG9uZSB0aGF0IGlzIGluCi0JICogICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0dHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJYm9vbGVhbiBpc1JlYWR5ID0gZmFsc2U7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJd2hpbGUgKCFpc1JlYWR5KSB7Ci0JCQlCdW5kbGUgbG9jYWxCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoU1NFQ29yZVBsdWdpbi5JRCk7Ci0JCQlpbnQgc3RhdGUgPSBsb2NhbEJ1bmRsZS5nZXRTdGF0ZSgpOwotCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQkvLyBnZXRJbnN0YW5jZSBpcyBhIHN5bmNocm9uaXplZCBzdGF0aWMgbWV0aG9kLgotCQkJCW1vZGVsTWFuYWdlciA9IE1vZGVsTWFuYWdlckltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVEFSVElORykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0KLQkJCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUsIGp1c3QgbG9vcCBhZ2FpbgotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVE9QUElORyB8fCBzdGF0ZSA9PSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm90IHN1cmUgYWJvdXQgb3RoZXIgc3RhdGVzLCAncmVzb2x2ZWQnLCAnaW5zdGFsbGVkJwotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lFbmNvZGVkRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUVuY29kZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODE5NGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUVuY29kZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHN0cmljdGx5IHRvIGRlZmluZSBpbXBvcnRhbnQgImRvY3VtZW50IHByb3BlcnRpZXMiIG5vdAotICogZm91bmQgaW4gSURvY3VtZW50LCBidXQgbm90IGNlbnRyYWwgdG8gIlN0cnVjdHVyZWREb2N1bWVudCIuCi0gKiAKLSAqIEl0cyBub3QgdG8gYmUgYmUgaW1wbG1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElFbmNvZGVkRG9jdW1lbnQgZXh0ZW5kcyBJRG9jdW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqLwotCUVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBsaW5lIGRlbGltaXRlciBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKiAKLQkgKiBJcyBub3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYWxFbmNvZGluZ01lbWVudG8KLQkgKi8KLQl2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gbG9jYWxFbmNvZGluZ01lbWVudG8pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJlZmVycmVkTGluZURlbGltaXRlci4gSXMgbm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCBvbmx5Ci0JICogZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmFibGVMaW5lRGVsaW1pdGVyCi0JICovCi0Jdm9pZCBzZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKFN0cmluZyBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnRQcm9wb3NlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU3RydWN0dXJlZERvY3VtZW50UHJvcG9zZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZGQ2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnRQcm9wb3NlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotCi0vKioKLSAqIEEgSVN0cnVjdHVyZWREb2N1bWVudCBpcyBhIGNvbGxlY3Rpb24gb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy4gSXQncwotICogb2Z0ZW4gY2FsbGVkIGEgImZsYXQgbW9kZWwiIGJlY2F1c2UgaXRzIGRvZXMgY29udGFpbiBzb21lIHN0cnVjdHVyYWwKLSAqIGluZm9ybWF0aW9uLCBidXQgbm90IHZlcnkgbXVjaCwgdXN1YWxseSwgYXQgbW9zdCwgYSBmZXcgbGV2ZWxzIG9mCi0gKiBjb250YWlubWVudC4KLSAqIAotICogQ2xpZW50cyBzaG91bGQgbm90IGltcGxlbWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIGV4dGVuZHMgSURvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogVGhlIGRvY3VtZW50IGNoYW5naW5nIGxpc3RlbmVycyByZWNlaXZlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhlCi0JICogZG9jdW1lbnQgbGlzdGVuZXJzLCBidXQgdGhlIGRpZmZlcmVuY2UgaXMgdGhlIHRpbWluZyBhbmQKLQkgKiBzeW5jaHJvbml6YXRpb24gb2YgZGF0YSBjaGFuZ2VzIGFuZCBub3RpZmljYXRpb25zLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIHRoaXMgQVBJIGVuc3VyZXMgdGhhdCBhbnkgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIHN0YXJ0T2ZmIHRvCi0JICogbGVuZ3RoIGlzIG5vdCByZWFkb25seSAodGhhdCBpcywgdGhhdCBpdHMgZWRpdGFibGUpLiBOb3RlIHRoYXQgaWYgdGhlCi0JICogcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBvdGhlciByZWFkb25seSByZWdpb25zLCB0aG9zZSBvdGhlciByZWFkb25seQotCSAqIHJlZ2lvbnMgd2lsbCBiZSBhZGp1c3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0Jdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgYW55IHBvcnRpb24gb2Ygc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIGlzIHJlYWRvbmx5Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiBjb250YWluZWQgYnkgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJlc3R1cm5zIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIE5vdGU6IHBvc3NpYmx5IGV4cGVuc2l2ZSBjYWxsLCBub3QgdG8gYmUgdXNlZCBjYXN1YWxseS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIFNhbWUgYXMgJ2dldCcgaW4gc3VwZXIgY2xhc3MsIGFkZGVkIGZvciBkZXNjcmlwdGl2ZW5lc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBjYXVzZXMgdGhhdCBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCBmcm9tIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCB0byBiZQotCSAqIG1hcmtlZCBhcyByZWFkb25seS4gTm90ZSB0aGF0IGlmIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBzb21lIG90aGVyCi0JICogcmVnaW9uIHdpdGggaXMgcmVhZG9ubHksIHRoZSByZWdpb25zIGFyZSBlZmZlY3Rpdmx5IGNvbWJpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IGl0IGNvbnRhaW5zIG5vIGRhdGEuIE9uZQotCSAqIGltcG9ydGFudCB0aGluZyB0byBkdXBsaWNhdGUgaXMgdGhlIHBhcnNlciwgd2l0aCB0aGUgcGFyc2VyIGNvcnJlY3RseQotCSAqICJjbG9uZWQiLCBpbmNsdWRpbmcgaXRzIHRva2VuaW56ZXIsIGJsb2NrIHRhZ3MsIGV0Yy4KLQkgKiAKLQkgKiBOT1RFOiBldmVuIGFmdGVyIG9idGFpbmluZyBhICduZXdJbnN0YW5jZScgdGhlIGNsaWVudCBtYXkgaGF2ZSB0byBkbwotCSAqIHNvbWUgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlLCBpdCBtYXkgbmVlZCB0byBhZGQgaXRzIG93biBtb2RlbAotCSAqIGxpc3RlbmVycy4gT3IsIGFzIGFub3RoZXIgZXhhbXBsZSwgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGEKLQkgKiBwYXJzZXIgb2YgdHlwZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIHRoZW4gdGhlIGNsaWVudCBtYXkgbmVlZAotCSAqIHRvIGFkZCBpdHMgb3duIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgdG8gdGhhdCBwYXJzZXIsIGlmIGl0IGlzCi0JICogaW4gZmFjdCBuZWVkZWQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgY2hhbmdpbmcgbGlzdGVuZXJzIHJlY2VpdmVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGUKLQkgKiBkb2N1bWVudCBsaXN0ZW5lcnMsIGJ1dCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgdGltaW5nIGFuZAotCSAqIHN5bmNocm9uaXphdGlvbiBvZiBkYXRhIGNoYW5nZXMgYW5kIG5vdGlmaWNhdGlvbnMuCi0JICovCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogcmVwbGFjZVRleHQgcmVwbGFjZXMgdGhlIHRleHQgZnJvbSBvbGRTdGFydCB0byBvbGRFbmQgd2l0aCB0aGUgbmV3IHRleHQKLQkgKiBmb3VuZCBpbiB0aGUgcmVxdWVzdGVkQ2hhbmdlIHN0cmluZy4gSWYgb2xkU3RhcnQgYW5kIG9sZEVuZCBhcmUgZXF1YWwsCi0JICogaXQgaXMgYW4gaW5zZXJ0aW9uIHJlcXVlc3QuIElmIHJlcXVlc3RlZENoYW5nZSBpcyBudWxsIChvciBlbXB0eSkgaXQgaXMKLQkgKiBhIGRlbGV0ZSByZXF1ZXN0LiBPdGhlcndpc2UgaXQgaXMgYSByZXBsYWNlIHJlcXVlc3QuCi0JICogCi0JICogU2ltaWxhciB0byAncmVwbGFjZScgaW4gc3VwZXIgY2xhc3MuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogTm90ZSwgc2FtZSBhcyByZXBsYWNlVGV4dCBBUEksIGJ1dCB3aWxsIGFsbG93IHJlYWRvbmx5IGFyZWFzIHRvIGJlCi0JICogcmVwbGFjZWQuIFRoaXMgbWV0aG9kIGlzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seQotCSAqIGluZnJhc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwgb25lIGNhc2Ugd2hlcmUgaXRzIG9rIGlzIHdpdGggdW5kbwotCSAqIG9wZXJhdGlvbnMgKHNpbmNlLCBwcmVzdW1hYmx5LCBpZiB1c2VyIGp1c3QgZGlkIHNvbWV0aGluZyB0aGF0Ci0JICogaGFwcGVuZGVkIHRvIGludm9sdmUgc29tZSBpbnNlcnRpbmcgcmVhZG9ubHkgdGV4dCwgdGhleSBzaG91bGQgbm9ybWFsbHkKLQkgKiBiZSBhbGxvd2VkIHRvIHN0aWxsIHVuZG8gdGhhdCBvcGVyYXRpb24uIFRoZXJlIG1pZ2h0IGJlIG90aGVyIGNhc2VzCi0JICogd2hlcmUgaXRzIHVzZWQgdG8gZ2l2ZSB0aGUgdXNlciBhIGNob2ljZSwgZS5nLiAieW91IGFyZSBhYm91dCB0bwotCSAqIG92ZXJ3cml0ZSByZWFkIG9ubHkgcG9ydGlvbnMsIGRvIHlvdSB3YW50IHRvIGNvbnRpbnVlIi4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBvdmVycmlkZVJlYWRPbmx5cmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgVGV4dC4KLQkgKiAKLQkgKiBUaGUgc2V0VGV4dCBtZXRob2QgcmVwbGFjZXMgYWxsIHRleHQgaW4gdGhlIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCByZXF1ZXN0aW5nIHRoZSBkb2N1bWVudCBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBhbGxUZXh0IC0KLQkgKiAgICAgICAgICAgIGFsbCB0aGUgdGV4dCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBOZXdEb2N1bWVudEV2ZW50IC0gYmVzaWRlcyBjYXVzaW5nIHRoaXMgZXZlbnQgdG8gYmUgc2VudCB0bwotCSAqICAgICAgICAgZG9jdW1lbnQgbGlzdGVuZXJzLCB0aGUgZXZlbnQgaXMgcmV0dXJuZWQuCi0JICovCi0JTmV3RG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBhbGxUZXh0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqIHN0b3JhZ2UuCi0JICogCi0JICogQHJldHVybiBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqICAgICAgICAgc3RvcmFnZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGV0ZWN0ZWRMaW5lRGVsaW1pdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIElzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seSBkb2N1bWVudCBjcmVhdGlvbiBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhbEVuY29kaW5nTWVtZW50bwotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXRlY3RlZCBsaW5lIGRlbGltaXRlciB3aGVuIHRoZSBkb2N1bWVudCB3YXMgcmVhZC4gSXMgbm90IHRvCi0JICogYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmFibGVMaW5lRGVsaW1pdGVyCi0JICovCi0Jdm9pZCBzZXREZXRlY3RlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcik7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IGZvciBjbGllbnRzIHRvIGNvbXBhcmUgYSBzdHJpbmcgd2l0aCBhCi0JICogcmVnaW9uIG9mIHRoZSBkb2N1bW5ldCwgd2l0aG91dCBoYXZpbmcgdG8gcmV0cmlldmUgKGNyZWF0ZSkgYSBzdHJpbmcKLQkgKiBmcm9tIHRoZSBkb2N1bWVudCwgdGh1cyBtb3JlIGVmZmljaWVudCBvZiBsb3RzIG9mIGNvbXBhcmlzb25zIGJlaW5nCi0JICogZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZSAtCi0JICogICAgICAgICAgICBpZiB0cnVlIHRoZSBjaGFyYWN0ZXJzIGFyZSBjb21wYXJlZCBiYXNlZCBvbiBpZGVudGl0eS4gSWYKLQkgKiAgICAgICAgICAgIGZhbHNlLCB0aGUgc3RyaW5nIGFyZSBjb21wYXJlZCB3aXRoIGNhc2UgYWNjb3VudGVkIGZvci4KLQkgKiBAcGFyYW0gdGVzdFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBpbiB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBjb21wYXJpc29uLgotCSAqIEBwYXJhbSBsZW5ndGggLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBpbiB0aGUgZG9jdW1lbnQgdG8gY29tcGFyZSAoTm90ZTogdGVjaG5pY2FsbHksCi0JICogICAgICAgICAgICBjbGllbnRzIGNvdWxkIGp1c3QgcHJvdmlkZSB0aGUgc3RyaW5nLCBhbmQgd2UgY291bGQgaW5mZXIKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggZnJvbSB0aGUgc3RyaW5nIHN1cHBsaWVkLCBidXQgdGhpcyBsZWF2ZXMgZXZlcnkKLQkgKiAgICAgICAgICAgIGNsaWVudCB0byBjb3JyZWN0bHkgbm90IGV2ZW4gYXNrIHVzIGlmIHRoZSB0aGUgc3RyaW5nIGxlbmd0aAotCSAqICAgICAgICAgICAgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoLCBzbyB0aGlzIGlzIGFuIGVmZm9ydCB0bwotCSAqICAgICAgICAgICAgbWF4aW1pemUgcGVyZm9ybWFuY2Ugd2l0aCBjb3JyZWN0IGNvZGUuCi0JICogQHJldHVybiB0cnVlIGlmIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIHN0cmluZ01hdGNoZXMoYm9vbGVhbiBpZ25vcmVDYXNlLCBTdHJpbmcgdGVzdFN0cmluZywgaW50IGRvY3VtZW50T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvQWJvdXRUb0JlQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZTc1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyBzZW5kIHRvIHN0cnVjdHVyZWQgZG9jdW1lbnQgbGlzdGVuZXJzLiBJdCBpcyBwZXJmZWN0bHkKLSAqIGFuYWxhZ291cyB0byBpdHMgY29ycmVzcG9uZGluZyBqZmFjZSBEb2N1bWVudEV2ZW50IGFuZCBpcyBwcm92aWRlZCBzaW1wbHkKLSAqIHRvIGFsbG93IGNsaWVudHMgdG8gZGlzdGluZ3Vpc2ggdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBkb2N1bWVudCBpbnZvbHZlZCBpbiB0aGUgY2hhbmdlCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICBzb3VyY2Ugb2Ygb3JpZ2luYWwgcmVxdWVzdAotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICogICAgICAgICAgICB0aGUgdGV4dCBjaGFuZ2VzCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgb2Zmc2V0IG9mIHJlcXVlc3QKLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlCi0JICogICAgICAgICAgICBhbW91bnQsIGlmIGFueSwgb2YgcmVwbGFjZWQgdGV4dAotCSAqLwotCXB1YmxpYyBBYm91dFRvQmVDaGFuZ2VkRXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyLCBTdHJpbmcgY2hhbmdlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlzdXBlcihkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY4MTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi0KLQotLyoqCi0gKiBDbGllbnRzIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGFuZCByZWdpc3RlciB3aXRoIHRoZQotICogc3RydWN0dXJlZERvY3VtZW50IHVzaW5nIGFkZEFib3V0VG9CZUNoYW5nZWRMaXN0bmVyIHRvIGJlIG5vdGlmaWVkIHRoYXQgdGhlCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgYWJvdXQgdG8gYmUgY2hhbmdlZCwgYnV0IGhhc24ndCBiZWVuIGNoYW5nZWQgYXQgdGhlCi0gKiB0aW1lIHRoaXMgZXZlbnQgaXMgZmlyZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIHsKLQotCXZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKEFib3V0VG9CZUNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjYyYTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBzaW5jZSB3ZSBub3cgc3ViY2xhc3MgRG9jdW1lbnRFdmVudC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50Q29udGVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmQxNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhlIE5ld0RvY3VtZW50Q29udGVudEV2ZW50IGlzIGZpcmVkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgYQotICogSVN0cnVjdHVyZWREb2N1bWVudCByZXBsYWNlcyBhbGwgb2YgaXRzIHRleHQuCi0gKiAKLSAqIElTU1VFOiBub3QgY3VycmVudGx5IHVzZWQsIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgZWZmaWNpZW5jaWVzIHRvIGJlIGhhZCBzbwotICogcGxhbiB0byBpbXBsZW1lbnQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQgZXh0ZW5kcyBOZXdEb2N1bWVudEV2ZW50IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZAotCSAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3RlcgotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIE5ld0RvY3VtZW50Q29udGVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQlzdXBlcihkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzhjZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgTmV3RG9jdW1lbnRFdmVudCBpcyBmaXJlZCB3aGVuIGFuIGluc3RhbmNlIG9mIGEgSVN0cnVjdHVyZWREb2N1bWVudAotICogc2V0cyBvciByZXBsYWNlcyBhbGwgb2YgaXRzIHRleHQuCi0gKiAKLSAqIElTU1VFOiBuZWVkIHRvIGNoYW5nZSBzbyB0aGlzIGlzIHVzZWQgZm9yICdzZXQnIG9ubHkuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3RG9jdW1lbnRFdmVudCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgTmV3RG9jdW1lbnRFdmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGJlaW5nIGNoYW5nZWQKLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIKLQkgKiAgICAgICAgICAgIHNvdXJjZSBvZiByZXF1ZXN0Ci0JICovCi0JcHVibGljIE5ld0RvY3VtZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3Rlcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lc24ndCBtZWFuIHF1aXRlIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JICogRXZlbnRzIGluIHRoZSBzdXBlciBjbGFzcy4gSXQgYWx3YXlzIHdpbGwgcmV0dXJuIHplcm8uCi0JICogCi0JICogQHJldHVybiBpbnQgZm9yIGEgbmV3RG9jdW1lbnQsIHRoZSBvZmZzZXQgb2YgaXMgYWx3YXlzIDAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRm9yIGEgbmV3IGRvY3VtZW50LCB0aGUgdGV4dCBpbnZvbHZlZCBpcyB0aGUgY29tcGxldGUgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdGV4dCB0aGF0IGlzIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoZSBkb2N1bW5ldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHRzID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0VGV4dCgpOwotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9Ob0NoYW5nZUV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9Ob0NoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNWU3ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTm9DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbnQgaWYsIGFmdGVyIGFuYWx5c2lzLCBpdCBpcyBmb3VuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KLSAqIGNoYW5nZSB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1pZ2h0IG9jY3VyLCBmb3IgZXhhbXBsZSwgaWYgc29tZW9uZQotICogcGFzdGVzIGluIHRoZSBleGFjdCBzYW1lIHRleHQgdGhhdCB0aGV5IGFyZSByZXBsYWNpbmcsIG9yIGlmIHNvbWVvbmUgdHJpZXMKLSAqIHRvIGNoYW5nZSBhIHJlYWQtb25seSByZWdpb24uCi0gKiAKLSAqIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50LCBmb3IgZXhhbXBsZSwgaWYgc29tZSBzdGF0ZSB2YXJpYWJsZXMgYXJlIHNldCBvbiBhbgotICogImFib3V0IHRoZSBjaGFuZ2UiIGV2ZW50LiB0aGVuIGlmIHRoZXJlIGlzIG5vIGNoYW5nZSAoaS5lLm5vIG90aGVyIGV2ZW50IGlzCi0gKiBmaXJlZCksIHRob3NlIHN0YXRlIHZhcmlhYmxlcyBjb3VsZCByZXNldCwgb3Igd2hhdGV2ZXIsIHVwb24gcmVjZWl2aW5nIHRoaXMKLSAqIGV2ZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vQ2hhbmdlRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0JLyoqCi0JICogTk9fQ09OVEVOVF9DSEFOR0UgbWVhbnMgdGhhdCBhIHNvbWUgdGV4dCB3YXMgcmVxdWVzdGVkIHRvIGJlIHJlcGxhY2VkCi0JICogd2l0aCBpZGVudGljYWwgdGV4dCwgc28gbm8gY2hhbmdlIGlzIGFjdHVhbGx5IGRvbmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fQ09OVEVOVF9DSEFOR0UgPSAyOwotCS8qKgotCSAqIE5PX0VWRU5UIGlzIHVzZWQgaW4gcmFyZSBlcnJvciBjb25kaXRpb25zLCB3aGVuLCBiYXNpY2FsbHksIGEgcmVxdWVzdAotCSAqIHRvIGNoYW5nZSB0aGUgZG9jdW1lbnQgaXMgbWFkZSBiZWZvcmUgdGhlIHByZXZpb3VzIHJlcXVlc3QgaGFzCi0JICogY29tcGxldGVkLiBUaGlzIGV2ZW50IHRvIHVzZWQgc28gYWJvdXRUb0NoYW5nZS9DaGFuZ2VkIGN5Y2xlcyBjYW4KLQkgKiBjb21wbGV0ZSBhcyByZXF1aXJlZCwgYnV0IHRoZSBkb2N1bWVudCBpcyBtb3N0IGxpa2VseSBub3QgbW9kaWZpZWQgYXMKLQkgKiBleHBlY3RlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19FVkVOVCA9IDg7Ci0JLyoqCi0JICogUkVBRF9PTkxZX1NUQVRFX0NIQU5HRSBtZWFucyB0aGF0IHRoZSAicmVhZCBvbmx5IiBzdGF0ZSBvZiB0aGUgdGV4dCB3YXMKLQkgKiBjaGFuZ2VkLCBub3QgdGhlIGNvbnRlbnQgaXRzZWxmLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQURfT05MWV9TVEFURV9DSEFOR0UgPSA0OwotCi0JLyoqCi0JICogc2V0IHRvIG9uZSBvZiB0aGUgYWJvdmUgZGV0YWlsZWQgcmVhc29ucyBmb3Igd2h5IG5vIGNoYW5nZSB3YXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYXNvbiA9IDA7Ci0KLQkvKioKLQkgKiBOb0NoYW5nZUV2ZW50IGNvbnN0cnVjdG9yLiBUaGlzIGV2ZW50IGNhbiBvY2N1ciBpZiB0aGVyZSB3YXMgYSByZXF1ZXN0Ci0JICogdG8gbW9kaWZ5IGEgZG9jdW1lbnQgb3IgaXRzIHByb3BlcnRpZXMsIGJ1dCB0aGVyZSBhcyBub3QgcmVhbGx5IGlzIG5vCi0JICogY2hhbmdlIHRvIGEgZG9jdW1lbnQncyBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxTb3VyY2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBOb0NoYW5nZUV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9SZWdpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWM5MzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCB3aGVuIGEgZG9jdW1lbnQgcmVnaW9uIGNoYW5nZXMgaW4gYSBub24tc3RydWN0dXJhbCB3YXkuCi0gKiBOb24tc3RydWN0dXJhbCwgdGhhdCBpcywgYXMgZmFyIGFzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGlzIGNvbmNlcm5lZC4KLSAqIFRoZSB3aG9sZSByZWdpb24sIGFsb25nIHdpdGggdGhlIG5ldyB0ZXh0IGlzIHNlbnQsIGp1c3QgaW4gY2FzZSBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIHRyZWUgbW9kZWwpIG1pZ2h0IG1ha2UgaXRzIG93biBkZXRlcm1pbmF0aW9uIG9mIHdoYXQgdG8gZG8sIGFuZAotICogbmVlZHMgdGhlIHdob2xlIHJlZ2lvbiB0byBhY3QgYXBwcm9wcmlhdGVseS4KLSAqIAotICogTm90ZTogdXNlcnMgc2hvdWxkIG5vdCBtYWtlIGFzc3VtcHRpb25zIGFib3V0IHdoZXRoZXIgdGhlIHJlZ2lvbiBpcwotICogbGl0ZXJhbGx5IHRoZSBzYW1lIGluc3RhbmNlIG9yIG5vdCAtLSBpdCBpcyBjdXJyZW50bHkgYSBkaWZmZXJlbnQgaW5zdGFuY2UKLSAqIHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbGQgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCByZWdpb24sIGJ1dCB0aGlzCi0gKiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbkNoYW5nZWRFdmVudCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGZDaGFuZ2VkUmVnaW9uOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBpbnN0YW5jZSBvZiBhIFJlZ2lvbkNoYW5nZWRFdmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3RlcgotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBtYWtpbmcgdGhlIHJlcXVlc3QgZm9yIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgcmVnaW9uCi0JICogQHBhcmFtIGNoYW5nZWRSZWdpb24KLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gdGhhdCBoYXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIGxlbmd0aFRvUmVwbGFjZQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBzcGVjaWZpZWQgdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIFJlZ2lvbkNoYW5nZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjaGFuZ2VkUmVnaW9uLCBTdHJpbmcgY2hhbmdlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlzdXBlcihkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJZkNoYW5nZWRSZWdpb24gPSBjaGFuZ2VkUmVnaW9uOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCByZWdpb24gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHJlZ2lvbiBjaGFuZ2VkCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZDaGFuZ2VkUmVnaW9uOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgcmVnaW9uIGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgZG9jdW1lbnQgcmVnaW9uIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9SZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWEyZTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCB3aGVuIGEgbm9kZSdzIHJlZ2lvbnMgY2hhbmdlLCBidXQgdGhlIGRvY3VtZW50IHJlZ2lvbgotICogaXRzZWxmIGRvZXNuJ3QuIFRoaXMgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGRvY3VtZW50Ci0gKiByZWdpb24sIHRoYXQgbWF5IHN0aWxsIGhhdmUgY2hhbmdlZC4gQWxzbywgaXRzIGFzc3VtZWQvcmVxdWlyZWQgdGhhdCBhbGwKLSAqIHRoZSByZWdpb25zIGFyZSByZXBsYWNlZCAoZXZlbiB0aG9zZSB0aGF0IG1heSBub3QgaGF2ZSBjaGFuZ2VkKS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpb25zUmVwbGFjZWRFdmVudCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBmTmV3UmVnaW9uczsKLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBmT2xkUmVnaW9uczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFJlZ2lvbnNSZXBsYWNlZEV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBkb2N1bWVudCBiZWluZyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3RlciAtCi0JICogICAgICAgICAgICByZXF1ZXN0ZXIgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC0KLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gY29udGFpbmluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvbGRSZWdpb25zIC0KLQkgKiAgICAgICAgICAgIHRoZSBvbGQgUmVnaW9ucyBiZWluZyByZXBsYWNlZC4KLQkgKiBAcGFyYW0gbmV3UmVnaW9ucyAtCi0JICogICAgICAgICAgICB0aGUgbmV3IHJlZ2lvbnMgYmVpbmcgYWRkZWQuCi0JICogQHBhcmFtIGNoYW5nZXMgLQotCSAqICAgICAgICAgICAgdGhlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gb2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlIC0KLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGV4dCB0byByZXBsYWNlLgotCSAqLwotCXB1YmxpYyBSZWdpb25zUmVwbGFjZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlmT2xkUmVnaW9ucyA9IG9sZFJlZ2lvbnM7Ci0JCWZOZXdSZWdpb25zID0gbmV3UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXcgdGV4dCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyB0ZXh0IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXROZXdSZWdpb25zKCkgewotCQlyZXR1cm4gZk5ld1JlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIHRleHQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvbGQgdGV4dCByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0T2xkUmVnaW9ucygpIHsKLQkJcmV0dXJuIGZPbGRSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1N0cnVjdHVyZWREb2N1bWVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTQ4Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIGFmdGVyCi0gKiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBhY3RzIG9uIGEgcmVxdWVzdC4gTm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCwKLSAqIGV4Y2VwdCBieSBzdWJjbGFzc2VzIGluIGluZnJhc3RydWN0dXJlLiBOb3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieQotICogY2xpZW50cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBleHRlbmRzIERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgU3RyaW5nIGZEZWxldGVkVGV4dDsKLQlwcml2YXRlIE9iamVjdCBmT3JpZ2luYWxSZXF1ZXN0ZXI7Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBubyBwdWJsaWMgbnVsbC1hcmcgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogV2UgYXNzdW1lIChhbmQgcmVxdWlyZSkgdGhhdCBhbiBJU3RydWN0dXJlZERvY3VtZW50J3MgYXJlIGFsd2F5cyB0aGUKLQkgKiBzb3VyY2Ugb2YgU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIHNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT3JpZ2luYWxSZXF1ZXN0ZXIgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgKGFuZCByZXF1aXJlKSB0aGF0IGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnQncyBhcmUgYWx3YXlzIHRoZQotCSAqIHNvdXJjZSBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQl0aGlzKGRvY3VtZW50KTsKLQkJZk9yaWdpbmFsUmVxdWVzdGVyID0gb3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogV2UgYXNzdW1lIChhbmQgcmVxdWlyZSkgdGhhdCBhbiBJU3RydWN0dXJlZERvY3VtZW50J3MgYXJlIGFsd2F5cyB0aGUKLQkgKiBzb3VyY2Ugb2YgU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmV3IHRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlIC0KLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGV4dCB0byByZXBsYWNlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJdGhpcyhkb2N1bWVudCk7Ci0JCWZPcmlnaW5hbFJlcXVlc3RlciA9IG9yaWdpbmFsUmVxdWVzdGVyOwotCQlmVGV4dCA9IGNoYW5nZXM7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZMZW5ndGggPSBsZW5ndGhUb1JlcGxhY2U7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLCBvciBudWxsIGlmIG5vbmUgaXMgYmVpbmcKLQkgKiAgICAgICAgIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWxldGVkVGV4dCgpIHsKLQkJcmV0dXJuIGZEZWxldGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBvcmlnaW5hbGx5IGNhdXNlZCB0aGUgZXZlbnQgdG8KLQkgKiBmaXJlLiBUaGlzIGlzIHR5cGljYWxseSBub3QgdGhlIG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIGV2ZW50ICh0aGUKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50KSBidXQgaW5zdGVhZCB0aGUgb2JqZWN0IHRoYXQgbWFkZSBhIHJlcXVlc3QgdG8gdGhlCi0JICogSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBtYWRlIHRoZSByZXF1ZXN0IHRvIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byAnZ2V0RG9jdW1lbnQnIGV4Y2VwdCBpdCByZXR1cm5zIGFuIG9iamVjdAotCSAqIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIChuYW1lbHksIGEgSVN0cnVjdHVyZWREb2N1bWVudCwgaW5zdGVhZCBvZgotCSAqIElEb2N1bWVudCkuCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtbnQgLSB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJLy8gYSBzYWZlIGNhc2UsIHNpbmNlIGNvbnN0cnVjdG9yIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGEKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudAotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgcGFyc2VycyBhbmQgcmVwYXJzZXJzLiAod2lsbAotCSAqIGV2ZW50dWFsbHkgYmUgbW92ZWQgdG8gYW4gU1BJIHBhY2thZ2UpLgotCSAqIAotCSAqIEBwYXJhbSBuZXdEZWxldGVkVGV4dCAtCi0JICogICAgICAgICAgICB0aGUgdGV4dCB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZFRleHQoU3RyaW5nIG5ld0RlbGV0ZWRUZXh0KSB7Ci0JCWZEZWxldGVkVGV4dCA9IG5ld0RlbGV0ZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcgb25seQotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gbmVlZCB0byBmaXggdW5pdCB0ZXN0cyB3aGljaCBkZXBlbmQgb24gdGhpcyBleGFjdCBmb3JtYXQsCi0JICogICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhpcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbc291cmNlPSIgKyBzb3VyY2UgKyAiXSI7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZTRkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGRlbGV0ZWQsIG9yIHJlcGxhY2VkCi0gKiB3aXRoIG1vcmUgdGhhbiBvbmUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb3Igd2hlbiBzaW1wbHkgbW9yZSB0aGFuIG9uZQotICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjaGFuZ2VzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmTmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudAotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIC0KLQkgKiAgICAgICAgICAgIHRoZSBvbGQgZG9jdW1lbnQgcmVnaW9ucyByZW1vdmVkLgotCSAqIEBwYXJhbSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIC0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgZG9jdW1lbnQgcmVnaW9ucyBhZGRlZC4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRleHQgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UgLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0ZXh0IHJlcXVlc3RlZCB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBTdHJpbmcgY2hhbmdlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlzdXBlcihkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCQlmTmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV3IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZk5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvbGQgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTIzM2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUFscmVhZHlFeGlzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlc291cmNlQWxyZWFkeUV4aXN0cyhTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VJblVzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlSW5Vc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYWM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VJblVzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9uczsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluVXNlIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VJblVzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUluVXNlKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsTWFuYWdlclByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbE1hbmFnZXJQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjljNmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsTWFuYWdlclByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBJU3RydWN0dXJlZE1vZGVscy4KLSAqIAotICogVGhpcyBhbGxvd3MgY2xpZW50cyB0byBzaGFyZSBtb2RlbHMsIHNvIHRoZXkgZG8gbm90IGhhdmUgdG8gYmUgcmUtY3JlYXRlZAotICogb3IgcGFzc2VkIGFyb3VuZCBmcm9tIG9uZSBjbGllbnQgdG8gYW5vdGhlci4gQ2xpZW50cyBzaG91bGQgaW50ZXJuYWxseQotICogZW5mb3JjZSB0aGF0IG1vZGVscyBhcmUgZ290dGVuIGFuZCByZWxlYXNlZCBmcm9tIGxvY2F0aW9ucyBjbG9zZSB0byBlYWNoCi0gKiBvdGhlciB0byBwcmV2ZW50IG1vZGVsIGxlYWtzLgotICogCi0gKiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBnZXQgYSBtb2RlbCBiYXNlZCBvbiB1c2FnZSBhbmQgcmVzcG9uc2liaWxpdHk6IGZvcgotICogJ01PRElGWScsIGp1c3QgZm9yICdTSEFSRUQnLCBhbmQgJ1VOU0hBUkVEJy4gQ29udHJhcnkgdG8gdGhlaXIgbmFtZXMsIGEKLSAqIG1vZGVsIGNhbiB0ZWNobmljYWxseSBiZSBtb2RpZmllZCwgYW5kIGFsbCBtb2RpZmljYXRpb25zIGRpcmVjdGx5IGFmZmVjdAotICogdGhlIGNvbW1vbmx5IHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBtb2RlbC4gSXQgaXMgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LAotICogaG93ZXZlciwgdGhhdCBjbGllbnRzIHdobyBnZXQgYSBtb2RlbCBmb3IgU0hBUkVEIGRvIG5vdCBtb2RpZnkgaXQuIFRoZQotICogc2lnbmlmaWNhbmNlIG9mIHRoZSAnTU9ESUZZJyBtb2RlbCBpcyB0aGF0IHRoZSBjbGllbnQgaXMgcmVnaXN0ZXJpbmcgdGhlaXIKLSAqIGludGVyZXN0IGluIHNhdmluZyBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4KLSAqIAotICogQ2xpZW50cyBjYW4gcmVmZXJlbmNlIHRoaXMgaW50ZXJmYWNlLCBidXQgc2hvdWxkIG5vdCBpbXBsZW1lbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXIKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE1hbmFnZXJQcm9wb3NlZCB7Ci0KLQkvKioKLQkgKiBBY2Nlc3NUeXBlIGlzIHVzZWQgaW50ZXJuYWxseSBhcyBhIEpSRSAxLjQgY29tcGF0aWJsZSBlbnVtZXJhdGVkIHR5cGUuCi0JICogTm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgQWNjZXNzVHlwZSB7Ci0JCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JCS8qKgotCQkgKiBkZWZhdWx0IGFjY2VzcyBjb250cnVjdG9yIHdlIHVzZSB0byBjcmVhdGUgb3VyIHNwZWNpZmljIGNvbnN0YW50cy4KLQkJICogCi0JCSAqIEBwYXJhbSB0eXBlCi0JCSAqLwotCQlBY2Nlc3NUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJZlR5cGUgPSB0eXBlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBkZWJ1ZyBwdXJwb3NlcyBvbmx5LgotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTW9kZWwgQWNjZXNzIFR5cGU6ICIgKyBmVHlwZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gcHJvdmlkZSBjb21waWxlIHRpbWUgc2FmZSBwYXJhbWV0ZXIuIDxjb2RlPk5PVFNIQVJFRDwvY29kZT5zaWduaWZpZXMKLQkgKiB0aGUgY2xpZW50IGludGVudGlhbGx5IHdhbnRzIGEgbW9kZWwgdGhhdCBpcyBub3Qgc2hhcmVkIHdpdGggb3RoZXIKLQkgKiBjbGllbnRzLiBOT1RTSEFSRUQgbW9kZWxzIGNhbiBub3QgYmUgc2F2ZWQuCi0JICovCi0JZmluYWwgQWNjZXNzVHlwZSBOT1RTSEFSRUQgPSBuZXcgQWNjZXNzVHlwZSgiTk9UU0hBUkVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHRvIHByb3ZpZGUgY29tcGlsZS10aW1lIHNhZmUgcGFyYW1ldGVyLiA8Y29kZT5TSEFSRUQ8L2NvZGU+c2lnbmlmaWVzCi0JICogdGhlIGNsaWVudCBpcyBub3QgaW50ZW5kaW5nIHRvIG1ha2UgY2hhbmdlcyBhbmQgZG9lcyBub3QgY2FyZSB3aGV0aGVyCi0JICogdGhlIG1vZGVsIGFjY2Vzc2VkIGlzIHNhdmVkLgotCSAqLwotCWZpbmFsIEFjY2Vzc1R5cGUgU0hBUkVEID0gbmV3IEFjY2Vzc1R5cGUoIlNIQVJFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCB0byBwcm92aWRlIGNvbXBpbGUtdGltZSBzYWZlIHBhcmFtZXRlci4gPGNvZGU+TU9ESUZZPC9jb2RlPnNpZ25pZmllcwotCSAqIHRoZSBjbGllbnQgaXMgaW50ZW5kaW5nIHRvIG1ha2UgY2hhbmdlcyBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHNhdmluZwotCSAqIGNoYW5nZXMgKG9yIG5vdCkgaWYgdGhleSBhcmUgdGhlIGxhc3Qgb25lIGhvbGRpbmcgTU9ESUZZIGFjY2VzcyB0byB0aGUKLQkgKiBtb2RlbCBiZWZvcmUgaXQncyByZWxlYXNlZC4KLQkgKi8KLQlmaW5hbCBBY2Nlc3NUeXBlIE1PRElGWSA9IG5ldyBBY2Nlc3NUeXBlKCJNT0RJRlkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogY29weU1vZGVsIGlzIHNpbWlsYXIgdG8gYSBkZWVwIGNsb25lLiBUaGUgcmVzdWx0aW5nIG1vZGVsIGlzIHNoYXJlZCwKLQkgKiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIFJlYWRFZGl0VHlwZS4gSWYgYSBtb2RlbCBhbHJlYWR5IGlzIGJlaW5nCi0JICogbWFuYWdlZCBmb3IgJ25ld0xvY2F0aW9uJyB0aGVuIGEgUmVzb3VyY2VJblVzZSBleGNlcHRpb24gaXMgdGhyb3duLAotCSAqIHVubGVzcyB0aGUgUmVhZEVkaXRUeXBlIGlzIE5PVFNIQVJFRCwgaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0aW5nIG1vZGVsCi0JICogY2FuIG5vdCBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTG9jYXRpb24KLQkgKiBAcGFyYW0gbmV3TG9jYXRpb24KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKiAKLQkgKiBJU1NVRTogaXMgdGhpcyBpbXBvcnRhbnQgZW5vdWdoIHRvIGJlIEFQSSwgb3IgY2FuIGNsaWVudHMgc29sdmUKLQkgKiB0aGVtc2VsdmVzCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjb3B5TW9kZWwoSVBhdGggb2xkTG9jYXRpb24sIElQYXRoIG5ld0xvY2F0aW9uLCBBY2Nlc3NUeXBlIHR5cGUpIHRocm93cyBSZXNvdXJjZUluVXNlOwotCi0JLyoqCi0JICogY3JlYXRlTmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IHRoZSBuZXcgaW5zdGFuY2UgaGFzIG5vCi0JICogdGV4dCBjb250ZW50LiBOb3RlOiB0aGlzIHByb2R1Y2VzIGFuIFVOU0hBUkVEIG1vZGVsLCBmb3IgdGVtcG9yYXJ5IHVzZSwKLQkgKiB0aGF0IGhhcyB0aGUgc2FtZSBjaGFyYWN0ZXJpc3RpY3MgYXMgb3JpZ2luYWwgbW9kZWwuIElmIGEgdHJ1ZSBzaGFyZWQKLQkgKiBtb2RlbCBpcyBkZXNpcmVkLCB1c2UgImNvcHkiLgotCSAqIAotCSAqIElTU1VFOiBzdGlsbCBuZWVkZWQ/Ci0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTmV3SW5zdGFuY2UoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBpdHMgYXNzdW1lIHRoYXQgSVBhdGggZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgYXMKLQkgKiBhIHJlc291cmNlIHlldC4gSWYgaXQgZG9lcywgUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgdGhlIHJlc291cmNlIGRvZXMgYWxyZWFkeSBleGlzdCwgdGhlbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IgaXMKLQkgKiB0aGUgcmlnaHQgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXMgdmlhIG1vZGVsIG1hbmFnZXIsIG9yIGVsc2Ugd2hlcmU/Ci0JICogSVNTVUU6IGRvIHdlIG5lZWQgdHdvIG9mIHRoZXNlPyBXaGF0J3MgbGVnYWN5IHVzZSBjYXNlPwotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSVBhdGggbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogY2xpZW50cyBzaG91bGQgdmVyaWZ5IHRoYXQgdGhlIHJlc291cmNlCi0JICogaWRlbnRpZmllZCBieSB0aGUgSVBhdGggZXhpc3RzIGJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZC4gSWYgdGhpcyBJRmlsZQotCSAqIGRvZXMgbm90IGV4aXN0LCB0aGVuIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCBpcyB0aGUgY29ycmVjdCBBUEkgdG8KLQkgKiB1c2UuCi0JICogCi0JICogSVNTVUU6IGRvIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGlzIHZpYSBtb2RlbCBtYW5hZ2VyLCBvciBlbHNlIHdoZXJlPwotCSAqIElTU1VFOiBkbyB3ZSBuZWVkIHR3byBvZiB0aGVzZT8gV2hhdCdzIGxlZ2FjeSB1c2UgY2FzZT8KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihJUGF0aCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5vdGU6IGNhbGxlcnMgb2YgdGhpcyBtZXRob2QgbXVzdCBzdGlsbCByZWxlYXNlIHRoZSBtb2RlbCB3aGVuCi0JICogZmluaXNoZWQuIFJldHVybnMgdGhlIG1vZGVsIGZvciB0aGlzIGRvY3VtZW50IGlmIGl0IGFscmVhZHkgZXhpc3RzIGFuZAotCSAqIGlzIGJlaW5nIHNoYXJlZC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBUaGUgUmVhZEVkaXRUeXBlCi0JICogbXVzdCBiZSBlaXRoZXIgTU9ESUZZIG9yIFNIQVJFRC4KLQkgKiAKLQkgKiBJU1NVRTogc2hvdWxkIHdlIGFjY2VwdCBJRG9jdW1lbnQgb24gcGFyYW1ldGVyIGZvciBmdXR1cmUgZXZvbHV0aW9uLAotCSAqIGFuZCBjb25zdHJhaW4gdG8gU3RydWN0dXJlZERvY3VtZW50cyBhdCBydW50aW1lPwotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgQWNjZXNzVHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogQ2FsbGVycyBvZiB0aGlzIG1ldGhvZCBtdXN0IHN0aWxsIHJlbGVhc2UgdGhlIG1vZGVsIHdoZW4gZmluaXNoZWQuCi0JICogUmV0dXJucyB0aGUgbW9kZWwgZm9yIHRoaXMgbG9jYXRpb24gaWYgaXQgYWxyZWFkeSBleGlzdHMgYW5kIGlzIGJlaW5nCi0JICogc2hhcmVkLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UuIFRoZSBSZWFkRWRpdFR5cGUgbXVzdCBiZQotCSAqIGVpdGhlciBNT0RJRlkgb3IgU0hBUkVELgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIEFjY2Vzc1R5cGUgdHlwZSwgSVBhdGggbG9jYXRpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBkb2N1bWVudCBhcyBpdHMgc3RydWN0dXJlZAotCSAqIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgQWNjZXNzVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSURvY3VtZW50IGRvY3VtZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIGJhc2VkIG9uIHRoZSBjb250ZW50IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCi0JICogCi0JICogTm90ZTogaWYgdGhlIE1vZGVsTWFuYWdlciBkb2VzIG5vdCBrbm93IGhvdyB0byBjcmVhdGUgYSBtb2RlbCBmb3IgCi0JICogc3VjaCBhIGZpbGUgZm9yIGNvbnRlbnQsIG51bGwgaXMgcmV0dXJuLgotCSAqIElTU1VFOiBzaG91bGQgd2UgdGhyb3cgc29tZSBzcGVjaWFsLCBtZWFuaW5nZnVsLCBjaGVja2VkIAotCSAqIGV4Y2VwdGlvbiBpbnN0ZWFkPwotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIEFjY2Vzc1R5cGUgdHlwZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElQYXRoIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjcmVhdGUgYSBuZXcgbW9kZWwgaWYgaXQgYWxyZWFkeSBleGlzdHMgLi4uIGlmCi0JICogZm9yY2UgaXMgZmFsc2UuIFRoZSBpZGVhIGlzIHRoYXQgYSBjbGllbnQgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgb25jZQotCSAqIHdpdGggZm9yY2Ugc2V0IHRvIGZhbHNlLiBJZiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biwgdGhlbiBwcm9tcHQgY2xpZW50Ci0JICogaWYgdGhleSB3YW50IHRvIG92ZXJ3cml0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIGZvcmNlCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVBhdGggbG9jYXRpb24sIGJvb2xlYW4gZm9yY2UsIEFjY2Vzc1R5cGUgdHlwZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZChJUGF0aCBsb2NhdGlvbik7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLCBzaGFyZWQgaW4gdGhlIHNwZWNpZmllZCB3YXkuIFRoZSBSZWFkRWRpdFR5cGUgbXVzdCBiZQotCSAqIGVpdGhlciBNT0RJRlkgb3IgU0hBUkVELgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWQoSVBhdGggbG9jYXRpb24sIEFjY2Vzc1R5cGUgdHlwZSk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnQgdHlwZSBvZiBhIG1vZGVsIGNoYW5nZXMuIEl0cwotCSAqIGFzc3VtZWQgdGhlIGNvbnRlbnRUeXBlIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCwgYW5kIHRoaXMgbWV0aG9kIHVzZXMKLQkgKiB0aGUgdGV4dCBvZiB0aGUgb2xkIG9uZSwgdG8gcmVwb3B1bGF0ZSB0aGUgdGV4dCBvZiB0aGUgbmV3IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIGJ5IGNsaWVudHMgdG8gc2lnbmlmeSB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkIHdpdGggYSBtb2RlbAotCSAqIGFuZCB3aWxsIG5vIGxvbmdlciBhY2Nlc3MgaXQgb3IgYW55IG9mIGl0cyB1bmRlcmx5aW5nIGRhdGEgKHN1Y2ggYXMgaXRzCi0JICogc3RydWN0dXJlZCBkb2N1bWVudCkuIFRoZSBSZWFkRWRpdFR5cGUgbXVzdCBtYXRjaCB3aGF0IGV2ZXIgdGhlIGNsaWVudAotCSAqIHVzZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgJ2dldCcgbWV0aG9kLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGZvciBldmVyeSAnZ2V0Jy4gQ2xpZW50cyBzaG91bGQgdXNlIHRoZQotCSAqIHRyeS9maW5hbGx5IHBhdHRlcm4gdG8gZW5zdXJlIHRoZSByZWxlYXNlIGlzIGNhbGxlZCBldmVuIGlmIHRoZXJlIGlzIGFuCi0JICogdW5leHBlY3RlZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkTW9kZWwKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXZvaWQgcmVsZWFzZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBBY2Nlc3NUeXBlIHR5cGUpOwotCi0JLyoqCi0JICogV3JpdGVzIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50IHRvIHRoZSBJUGF0aC4KLQkgKiAKLQkgKiBJU1NVRTogd2Ugd2FudCB0byBqdXN0ICJkdW1wIiBjb250ZW50cyB0byBsb2NhdGlvbiwgYnV0IG5lZWQgdG8gc3BlYy4KLQkgKiBhbGwgdGhlIGRpZmZlcmVudCBjYXNlcyBvZiBzaGFyZWQsIGV0Yy4KLQkgKiAKLQkgKiA/SWYgdG8gc2FtZSBsb2NhdGlvbiBhcyAnZ2V0JywgdGhlbiBzYW1lIGluc3RhbmNlIG9mIG1vZGVsLCBJZiB0bwotCSAqIGRpZmZlcmVudCBsb2NhdGlvbiAoZXNwLiBpZiBzaGFyZWQpIHRoZW4gbmVlZCB0byBsZWF2ZSBvbGQgaW5zdGFuY2Ugb2YKLQkgKiBtb2RlbCwgY3JlYXRlIG5ldyBtb2RlbCwgYW5kIHNhdmUgdG8gbmV3IGxvY2F0aW9uLiA/Ci0JICogCi0JICogQ2FzZXM6IElQYXRoIGlzIG51bGwsIHdyaXRlIHRvIElQYXRoIGNyZWF0ZWQgd2l0aCBJUGF0aCBzcGVjaWZpY2VkIGFuZAotCSAqIGVxdWFscyBJUGF0aCBjcmVhdGVkIHdpdGgsIHdyaXRlIHRvIElQYXRoIElQYXRoIHNwZWNpZmllZCBhbmQgbm90Ci0JICogZXF1YWxzIElQYXRoIGNyZWF0ZWQgd2l0aCwgZHVtcHMgdG8gbmV3IElQYXRoLCBubyBjaGFuZ2UgaW4gY3VycmVudAotCSAqIG1vZGVsIHN0YXRlLgotCSAqIAotCSAqIElTU1VFOiB0aGluayB0aHJvdWdoICdub3JtYWxpemF0aW9uJyBjYXNlcwotCSAqIAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkTW9kZWwKLQkgKiBAcGFyYW0gbG9jYXRpb24gLSBhbHJlYWR5IG5vcm1hbGl6ZWQ/Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBJU1NVRTogcmVzb3VyY2UgYWxlYWR5IGV4aXN0cz8gdmV0byBvdmVycmlkZQotCSAqLwotCXZvaWQgc2F2ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJUGF0aCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgdW5kZXJseWluZyBkb2N1bWVudCB0byB0aGUgSVBhdGggaWYgdGhlIG1vZGVsIGlzIG9ubHkgc2hhcmVkCi0JICogZm9yIEVESVQgYnkgb25lIGNsaWVudC4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IGZvciAnYmFja2dyb3VuZAotCSAqIGpvYnMnIHRvIHNhdmUgbW9kZWxzLCBpbiBjYXNlIHRoZSBtb2RlbCBpcyBiZWluZyBzaGFyZWQgYnkgYW4gZWRpdG9yLAotCSAqIG9yIG90aGVyIGNsaWVudCB0aGF0IG1pZ2h0IGRlc2lyZSB1c2VyIGludGVydmVudGlvbiB0byBzYXZlIGEgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWRNb2RlbAotCSAqIEBwYXJhbSBsb2NhdGlvbiAtIGFscmVhZHkgbm9ybWFsaXplZD8KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIElTU1VFOiBpcyBsb2NhaXRvbiBuZWVkZWQgaW4gdGhpcyBjYXNlLCBvciBqdXN0IHVzZSB0aGUgb25lIGl0IHdhcwotCSAqIGNyZWF0ZWQgd2l0aAotCSAqLwotCXZvaWQgc2F2ZU1vZGVsSWZOb3RTaGFyZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElQYXRoIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxTdGF0ZUxpc3RlbmVyUHJvcG9zZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsU3RhdGVMaXN0ZW5lclByb3Bvc2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTRiYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxTdGF0ZUxpc3RlbmVyUHJvcG9zZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aG9zZSB3YW50aW5nIHRvIGxpc3RlbiB0byBhIG1vZGVsJ3Mgc3RhdGUgY2hhbmdpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZCB7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuIFRoZSBldmVudCBvYmplY3QgaXRzZWxmIHNpZ25pZmllcyB3aGljaAotCSAqIG1vZGVsLCBhbmQgYW55IHBlcnRpbmVudCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IHRoZSBjaGFuZ2VzIGZvcmV0b2xkIGJ5IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCBoYXZlIGJlZW4KLQkgKiBtYWRlLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIHRvIHJlZnJlc2gsIG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIHRoYXQKLQkgKiB3YXMgc3VzcGVuZGVkIGFzIGEgcmVzdWx0IG9mIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZC4KLQkgKi8KLQl2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmQxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTm9kZUFkYXB0ZXJGYWN0b3J5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLS8qKgotICogUHJvdmlkZXMgYSBtZWFucyBmb3IgY2xpZW50cyB0byByZWdpc3RlciBJQWRhcHRlckZhY3RvcmllcyBmb3IgdXNlCi0gKiBieSBpbmZyYXN0cnVjdHVyZSB3aGVuIFN0cnVjdHVyZWRNb2RlbHMgYXJlIGNyZWF0ZWQuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0Jdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElDb250ZW50VHlwZSBjb250ZW50VHlwZSk7Ci0KLQl2b2lkIHJlbW92ZUFkYXB0ZXJGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JU3RydWN0dXJlZE1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1YTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZE1vZGVsRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JU3RydWN0dXJlZE1vZGVsUHJvcG9zZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ODRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogSVN0cnVjdHVyZWRNb2RlbCdzIGFyZSBtYWlubHkgaW50ZXJlc3RpbmcgYnkgdGhlaXIgZXh0ZW5zaW9ucyBhbmQKLSAqIGltcGxlbWVudGVycy4gVGhlIG1haW4gcHVycG9zZWQgb2YgdGhpcyBhYnN0cmFjdGlvbiBpdCB0byBwcm92aWRlIGEgY29tbW9uCi0gKiB3YXkgdG8gbWFuYWdlIG1vZGVscyB0aGF0IGhhdmUgYW4gYXNzb2NpYXRlZCBzdHJ1Y3R1cmVkIGRvY3VtbmV0LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZCBleHRlbmRzIElBZGFwdGFibGUgewotCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICogCi0JICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdGVuZXJzIGlzCi0JICogc2VudCBvbmx5IG9uY2UuCi0JICogCi0JICogTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkKLQkgKiB0byByZXN0b3JlIHRoZSBtb2RlbCdzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUgY2hhbmdlcy4gU2VlCi0JICogZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLgotCSAqIAotCSAqIFRoZSBtZXRob2QgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmCi0JICogdGhlIG1vZGVsIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIgdG8gY2hhbmdlZE1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQKLQkgKiBiZWZvcmUgY2hhbmdlZE1vZGVsLiBBIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0IG5vciBjYWxsIGFib3V0VG9DaGFuZ2VNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBjaGFuZ2VkTW9kZWwgbGF0ZXIgZnJvbSB0aGUgc2FtZSBUaHJlYWQuCi0JICovCi0Jdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCXZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsIC4uLgotCSAqIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZSBjaGFuZ2VkCi0JICogZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhIGZpbmFsbHkKLQkgKiBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlZE1vZGVsKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2xpZW50LWRlZmluZWQgdmFsdWUgZm9yIHdoYXQgdGhhdCBjbGllbnQgKGFuZC9vciBsb2FkZXIpCi0JICogY29uc2lkZXJzIHRoZSAiYmFzZSIgb2YgdGhlIHN0cnVjdHVyZWQgbW9kZWwuIEZyZXF1ZW50bHkgdGhlIGxvY2F0aW9uCi0JICogaXMgZWl0aGVyIGEgd29ya3NwYWNlIHJvb3QtcmVsYXRpdmUgcGF0aCBvZiBhIHdvcmtzcGFjZSByZXNvdXJjZSBvciBhbgotCSAqIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotCSAqLwotCUlQYXRoIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyIChTdHJpbmcpIGZvciB0aGlzIG1vZGVsLgotCSAqLwotCUlDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgbW9kZWwncyBGYWN0b3J5UmVnaXN0cnkuIEEgbW9kZWwgaXMgbm90IHZhbGlkIHdpdGhvdXQgb25lLgotCSAqLwotCUZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggcmVnaW9uIGF0IG9mZnNldC4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vCi0JICogSW5kZXhlZFJlZ2lvbiB0aGF0IGNvbnRhaW5zIG9mZnNldC4KLQkgKi8KLQlJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBJU1NVRTogZG8gd2Ugd2FudCB0byBwcm92aWRlIHRoaXM/IEhvdyB0byBlbnN1cmUgam9iL3RocmVhZCBzYWZldHkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSW5kZXhlZFJlZ2lvbltdIGdldEluZGV4ZWRSZWdpb25zKCk7Ci0KLQkvKioKLQkgKiBScmV0dXJucyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCB0aGF0IHVuZGVybGllcyB0aGlzIG1vZGVsCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzRGlydHkoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxTdGF0ZUNoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzTmV3KCk7Ci0KLQlib29sZWFuIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIGlmIHRoZSBtb2RlbCBpcyBkaXJ0eSBhbmQgaWYgdGhlIG1vZGVsIGlzCi0JICogc2hhcmVkIGZvciB3cml0ZSBhY2Nlc3MuIFRoZSBsYXN0IHdyaXRlciBhcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gYmUKLQkgKiBzdXJlIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIHNhdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhhdCB0aGUgbmV3SW5zdGFuY2UgY29udGFpbnMKLQkgKiBubyBjb250ZW50LiBJdHMgcHVycG9zZSBpcyBzbyBjbGllbnRzIGNhbiBnZXQgYSB0ZW1wb3JhcnksIHVubWFuYWdlZCwKLQkgKiBtb2RlbCBvZiB0aGUgc2FtZSAidHlwZSIgYXMgdGhlIG9yaWdpbmFsLiBOb3RlOiB0aGUgY2xpZW50IG1heSBzdGlsbAotCSAqIG5lZWQgdG8gZG8gc29tZSBpbnRpYWxpemF0aW9uIG9mIHRoZSBtb2RlbCByZXR1cm5lZCBieSBuZXdJbnN0YW5jZSwKLQkgKiBkZXBlbmRpbmcgb24gZGVzaXJlZCB1c2UuIEZvciBleGFtcGxlLCB0aGUgb25seSBmYWN0b3JpZXMgaW4gdGhlCi0JICogbmV3SW5zdGFuY2UgYXJlIHRob3NlIHRoYXQgd291bGQgYmUgbm9ybWFsbHkgYmUgY3JlYXRlZCBmb3IgYSBtb2RlbCBvZgotCSAqIHRoZSBnaXZlbiBjb250ZW50VHlwZS4gT3RoZXJzIGFyZSBub3QgY29waWVkIGF1dG9tYXRpY2FsbHksIGFuZCBpZgotCSAqIGRlc2lyZWQsIHNob3VsZCBiZSBhZGRlZCBieSBjbGllbnQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkIG5ld0luc3RhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCByZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmZjc4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotCi0KLS8qKgotICogQSBJU3RydWN0dXJlZERvY3VtZW50IGlzIGEgY29sbGVjdGlvbiBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLiBJdCdzCi0gKiBvZnRlbiBjYWxsZWQgImZsYXQiIGJlY2F1c2UgaXRzIGNvbnRlbnRzIGJ5IGRlc2lnbiBkbyBub3QgY29udGFpbiBtdWNoCi0gKiBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGJleW9uZCBjb250YWlubWVudC4gQ2xpZW50cyBzaG91bGQgbm90IGltcGxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZERvY3VtZW50IGV4dGVuZHMgSUVuY29kZWREb2N1bWVudCwgSURvY3VtZW50RXh0ZW5zaW9uLCBJQWRhcHRhYmxlIHsKLQotCXZvaWQgYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYW5kIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBhcmUgdmVyeQotCSAqIHNpbWlsYXIuIFRoZXkgYm90aCByZWNlaXZlIGlkZW50aWNhbCBldmVudHMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoZQotCSAqIHRpbWluZy4gVGhlICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgYmVmb3JlIG90aGVyLCByZWxhdGVkIG1vZGVscwotCSAqIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBzdWNoIGFzIHRoZSBTdHJ1Y3R1cmFsIE1vZGVsLiBUaGUgU3RydWN0dXJhbAotCSAqIG1vZGVsIGlzIGluIGZhY3QgaXRzZWxmIGEgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXIuIFRoZQotCSAqIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBjYW4gcmVzdCBhc3N1cmVkIHRoYXQgYWxsIG1vZGVscyBhbmQgZGF0YSBoYXZlCi0JICogYmVlbiB1cGRhdGVkIGZyb20gdGhlIGNoYW5nZSBieSB0aGUgdGllbSB0aGV5IGFyZSBub3RpZmllZC4gVGhpcyBpcwotCSAqIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciB0aGUgdGV4dCB3aWRnZXQsIGZvciBleGFtcGxlLCB3aGljaCBtYXkgcmVseQotCSAqIG9uIGJvdGggc3RydWN0dXJlZERvY3VtZW50IGFuZCBzdHJ1Y3R1cmFsIG1vZGVsIGluZm9ybWF0aW9uLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYW5kIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBhcmUgdmVyeQotCSAqIHNpbWlsYXIuIFRoZXkgYm90aCByZWNlaXZlIGlkZW50aWNhbCBldmVudHMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoZQotCSAqIHRpbWluZy4gVGhlICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgYmVmb3JlIG90aGVyLCByZWxhdGVkIG1vZGVscwotCSAqIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBzdWNoIGFzIHRoZSBTdHJ1Y3R1cmFsIE1vZGVsLiBUaGUgU3RydWN0dXJhbAotCSAqIG1vZGVsIGlzIGluIGZhY3QgaXRzZWxmIGEgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXIuIFRoZQotCSAqIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBjYW4gcmVzdCBhc3N1cmVkIHRoYXQgYWxsIG1vZGVscyBhbmQgZGF0YSBoYXZlCi0JICogYmVlbiB1cGRhdGVkIGZyb20gdGhlIGNoYW5nZSBieSB0aGUgdGllbSB0aGV5IGFyZSBub3RpZmllZC4gVGhpcyBpcwotCSAqIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciB0aGUgdGV4dCB3aWRnZXQsIGZvciBleGFtcGxlLCB3aGljaCBtYXkgcmVseQotCSAqIG9uIGJvdGggc3RydWN0dXJlZERvY3VtZW50IGFuZCBzdHJ1Y3R1cmFsIG1vZGVsIGluZm9ybWF0aW9uLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiB0aGlzIEFQSSBlbnN1cmVzIHRoYXQgYW55IHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBzdGFydE9mZiB0bwotCSAqIGxlbmd0aCBpcyBub3QgcmVhZG9ubHkgKHRoYXQgaXMsIHRoYXQgaXRzIGVkaXRhYmxlKS4gTm90ZSB0aGF0IGlmIHRoZQotCSAqIHJhbmdlIG92ZXJsYXBzIHdpdGggb3RoZXIgcmVhZG9ubHkgcmVnaW9ucywgdGhvc2Ugb3RoZXIgcmVhZG9ubHkKLQkgKiByZWdpb25zIHdpbGwgYmUgYWRqdXN0ZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqLwotCXZvaWQgY2xlYXJSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGFueSBwb3J0aW9uIG9mIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCBpcyByZWFkb25seQotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byByZW1lbWJlciBpbmZvIGFib3V0IHRoZSBlbmNvZGluZyBXaGVuIHRoZSByZXNvdXJjZQotCSAqIHdhcyBsYXN0IGxvYWRlZCBvciBzYXZlZC4gTm90ZTogaXQgaXMgbm90IGtlcHQgImN1cnJlbnQiLCB0aGF0IGlzLCBjYW4KLQkgKiBub3QgYmUgZGVwZW5kZWQgb24gYmxpbmRseSB0byByZWZsZWN0IHdoYXQgZW5jb2RpbmcgdG8gdXNlLiBGb3IgdGhhdCwKLQkgKiBtdXN0IGdvIHRocm91Z2ggdGhlIG5vcm1hbCBydWxlcyBleHByZXNzZWQgaW4gTG9hZGVycyBhbmQgRHVtcGVycy4KLQkgKi8KLQotCUVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogVGhpcyBjYW4gYmUgY29uc2lkZXJlZCB0aGUgcHJlZmVycmVkIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKTsKLQotCWludCBnZXRMaW5lT2ZPZmZzZXQoaW50IG9mZnNldCk7IC8vIHRocm93cyBTb3VyY2VFZGl0aW5nRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIHBhcnNlciBpcyBub3cgcmVxdWlyZWQgb24gY29uc3RydWN0b3IsIHNvIHRoZXJlIGFyZSBvY2Nhc2lvbnMgaXQKLQkgKiBuZWVkcyB0byBiZSByZXRyaWV2ZWQsIHN1Y2ggYXMgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgRW1iZWRkZWRDb250ZW50VHlwZQotCSAqLwotCVJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0UmVnaW9uTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT4gYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQuCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gdGhlIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+IGF0IHRoZSBnaXZlbiBjaGFyYWN0ZXIgb2Zmc2V0LgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPnMgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4gPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT5zIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoaW50IG9mZnNldCwgaW50IGxlbmd0aCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT5zIGluIHRoZSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIGFsbCA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPnMgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCi0JLyoqCi0JICogTm90ZTogdGhpcyBtZXRob2Qgd2FzIG1hZGUgcHVibGljLCBhbmQgcGFydCBvZiB0aGUgaW50ZXJmYWNlLCBmb3IKLQkgKiBlYXNpZXIgdGVzdGluZy4gQ2xpZW50cyBub3JtYWxseSBuZXZlciBtYW5pcHVsYXRlIHRoZSByZXBhcnNlciBkaXJlY3RseQotCSAqIChub3Igc2hvdWxkIHRoZXkgbmVlZCB0bykuCi0JICovCi0JSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZ2V0UmVQYXJzZXIoKTsKLQotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpOwotCi0JLyoqCi0JICogY2F1c2VzIHRoYXQgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgZnJvbSBzdGFydE9mZnNldCB0byBsZW5ndGggdG8gYmUKLQkgKiBtYXJrZWQgYXMgcmVhZG9ubHkuIE5vdGUgdGhhdCBpZiB0aGlzIHJhbmdlIG92ZXJsYXBzIHdpdGggc29tZSBvdGhlcgotCSAqIHJlZ2lvbiB3aXRoIGlzIHJlYWRvbmx5LCB0aGUgcmVnaW9ucyBhcmUgZWZmZWN0aXZseSBjb21iaW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0Jdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIG5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCBpdCBjb250YWlucyBubyBkYXRhLiBPbmUKLQkgKiBpbXBvcnRhbnQgdGhpbmcgdG8gZHVwbGljYXRlIGlzIHRoZSBwYXJzZXIsIHdpdGggdGhlIHBhcnNlciBjb3JyZWN0bHkKLQkgKiAiY2xvbmVkIiwgaW5jbHVkaW5nIGl0cyB0b2tlbmluemVyLCBibG9jayB0YWdzLCBldGMuCi0JICogCi0JICogTk9URTogZXZlbiBhZnRlciBvYnRhaW5pbmcgYSAnbmV3SW5zdGFuY2UnIHRoZSBjbGllbnQgbWF5IGhhdmUgdG8gZG8KLQkgKiBzb21lIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZSwgaXQgbWF5IG5lZWQgdG8gYWRkIGl0cyBvd24gbW9kZWwKLQkgKiBsaXN0ZW5lcnMuIE9yLCBhcyBhbm90aGVyIGV4YW1wbGUsIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGhhcyBhCi0JICogcGFyc2VyIG9mIHR5cGUgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyLCB0aGVuIHRoZSBjbGllbnQgbWF5IG5lZWQKLQkgKiB0byBhZGQgaXRzIG93biBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHRvIHRoYXQgcGFyc2VyLCBpZiBpdCBpcwotCSAqIGluIGZhY3QgbmVlZGVkLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3SW5zdGFuY2UoKTsKLQotCXZvaWQgcmVtb3ZlRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKiAKLQkgKiByZXBsYWNlVGV4dCByZXBsYWNlcyB0aGUgdGV4dCBmcm9tIG9sZFN0YXJ0IHRvIG9sZEVuZCB3aXRoIHRoZSBuZXcgdGV4dAotCSAqIGZvdW5kIGluIHRoZSByZXF1ZXN0ZWRDaGFuZ2Ugc3RyaW5nLiBJZiBvbGRTdGFydCBhbmQgb2xkRW5kIGFyZSBlcXVhbCwKLQkgKiBpdCBpcyBhbiBpbnNlcnRpb24gcmVxdWVzdC4gSWYgcmVxdWVzdGVkQ2hhbmdlIGlzIG51bGwgKG9yIGVtcHR5KSBpdCBpcwotCSAqIGEgZGVsZXRlIHJlcXVlc3QuIE90aGVyd2lzZSBpdCBpcyBhIHJlcGxhY2UgcmVxdWVzdC4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3Qgc291cmNlLCBpbnQgb2xkU3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHJlcXVlc3RlZENoYW5nZSk7Ci0KLQkvKioKLQkgKiBOb3RlLCBzYW1lIGFzIHJlcGxhY2VUZXh0IEFQSSwgYnV0IHdpbGwgYWxsb3cgcmVhZG9ubHkgYXJlYXMgdG8gYmUKLQkgKiByZXBsYWNlZC4gVGhpcyBzaG91bGQgc2VsZG9tIGJlIGNhbGxlZCB3aXRoIGEgdmFsdWUgb2YgInRydWUiIGZvcgotCSAqIGlnbm9yZVJlYWRPbmx5U2V0dGluZy4gT25lIGNhc2Ugd2hlcmUgaXRzIG9rIGlzIHdpdGggdW5kbyBvcGVyYXRpb25zCi0JICogKHNpbmNlLCBwcmVzdW1hYmx5LCBpZiB1c2VyIGp1c3QgZGlkIHNvbWV0aGluZyB0aGF0IGhhcHBlbmRlZCB0bwotCSAqIGludm9sdmUgc29tZSBpbnNlcnRpbmcgcmVhZG9ubHkgdGV4dCwgdGhleSBzaG91bGQgbm9ybWFsbHkgYmUgYWxsb3dlZAotCSAqIHRvIHN0aWxsIHVuZG8gdGhhdCBvcGVyYXRpb24uIE90aGVyd2lzZSwgSSBjYW4ndCB0aGluayBvZiBhIHNpbmdsZQotCSAqIGV4YW1wbGUsIHVubGVzcyBpdHMgdG8gZ2l2ZSB0aGUgdXNlciBhIGNob2ljZSwgZS5nLiAieW91IGFyZSBhYm91dCB0bwotCSAqIG92ZXJ3cml0ZSByZWFkIG9ubHkgcG9ydGlvbnMsIGRvIHlvdSB3YW50IHRvIGNvbnRpbnVlIi4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3Qgc291cmNlLCBpbnQgb2xkU3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHJlcXVlc3RlZENoYW5nZSwgYm9vbGVhbiBpZ25vcmVSZWFkT25seVNldHRpbmcpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gcmVtZW1iZXIgaW5mbyBhYm91dCB0aGUgZW5jb2RpbmcgV2hlbiB0aGUgcmVzb3VyY2UKLQkgKiB3YXMgbGFzdCBsb2FkZWQgb3Igc2F2ZWQuIE5vdGU6IGl0IGlzIG5vdCBrZXB0ICJjdXJyZW50IiwgdGhhdCBpcywgY2FuCi0JICogbm90IGJlIGRlcGVuZGVkIG9uIGJsaW5kbHkgdG8gcmVmbGVjdCB3aGF0IGVuY29kaW5nIHRvIHVzZS4gRm9yIHRoYXQsCi0JICogbXVzdCBnbyB0aHJvdWdoIHRoZSBub3JtYWwgcnVsZXMgZXhwcmVzc2VkIGluIExvYWRlcnMgYW5kIER1bXBlcnMuCi0JICovCi0Jdm9pZCBzZXRFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgVGV4dC4KLQkgKiAKLQkgKiBUaGUgc2V0VGV4dCBtZXRob2QgcmVwbGFjZXMgYWxsIHRleHQgaW4gdGhlIG1vZGVsLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHNldFRleHQoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGFsbFRleHQpOwotCi0Jdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRkMWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBBIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2YgSVRleHRSZWdpb25zLiBJdCBpcyBhIHN0cnVjdHVyYWwKLSAqIHVuaXQsIGJ1dCBhIG1pbmltYWwgb25lLiBGb3IgZXhhbXBsZSwgaW4gbWlnaHQgY29uc2lzdCBvZiBhICJzdGFydCB0YWciIGJ1dAotICogbm90IGEgd2hvbGUgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBBZGRzIGEgdGV4dCByZWdpb24gdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbiBvZiByZWdpb25zIGNvbnRhaW5lZCBieQotCSAqIHRoaXMgcmVnaW9uLiBJdCBpcyB0aGUgcGFyc2VycyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXRzIGEKLQkgKiBjb3JyZWN0IHJlZ2lvbiAodGhhdCBpcywgaXRzIHN0YXJ0IG9mZnNldCBpcyBvbmUgZ3JlYXRlciB0aGFuIHByZXZpb3VzCi0JICogcmVnaW9ucyBlbmQgb2Zmc2V0KQotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IGZvbGxvd3MgdGhpcyBvbmUgb3IgbnVsbCBpZgotCSAqIGF0IGVuZCBvZiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IGZvbGxvd3MgdGhpcyBvbmUuCi0JICogCi0JICogSVNTVUU6IGZvciB0aHJlYWQgc2FmZXR5LCB0aGlzIHNob3VsZCBiZSBtb3JlIHJlc3RyaWN0aXZlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHJlZ2lvbnMgcGFyZW50IGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyByZWdpb25zIHBhcmVudCBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IHByZWNlZWRzIHRoaXMgb25lIG9yIG51bGwKLQkgKiBpZiBhdCBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gdGhhdCBmb2xsb3dzIHRoaXMgb25lLgotCSAqIAotCSAqIElTU1VFOiBmb3IgdGhyZWFkIHNhZmV0eSwgdGhpcyBzaG91bGQgYmUgbW9yZSByZXN0cmljdGl2ZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkLCBhbmQgaXMgbm8gbG9uZ2VyIHBhcnQKLQkgKiBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZWQgZG9jdW1lbnQuIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgaW4KLQkgKiBtdWx0aS10aHJlYWRlZCBvcGVyYXRpb25zLCB3aGljaCBtYXkgcmV0cmlldmUgYSBsb25nIGxpc3Qgb2YgcmVnaW9ucwotCSAqIGFuZCBiZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGVtIGF0IHRoZSBzYW1lIHRpbWUgdGhlIGRvY3VtZW50IGlzCi0JICogbW9kaWZpZWQsIGFuZCByZWdpb25zIGRlbGV0ZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVnaW9uIGlzIG5vIGxvbmdlciBwYXJ0IG9mIGRvY3VtZW50LgotCSAqLwotCWJvb2xlYW4gaXNEZWxldGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB3YXMgZW5kZWQgIm5hdHVyYWxseSIKLQkgKiBieSBzeW50YWN0aWMgcnVsZXMsIG9yIGlmIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBzbyBhbm90aGVyIGNvdWxkIGJlCi0JICogc3RhcnRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgcmVnaW9uIGhhcyBzeW50YWN0aWMgZW5kLgotCSAqLwotCWJvb2xlYW4gaXNFbmRlZCgpOwotCi0JLyoqCi0JICogVGVzdHMgaXMgcmVnaW9uIGlzIGVxdWFsIHRvIHRoaXMgb25lLCBpZ25vcmluZyBwb3NpdGlvbiBvZmZzZXRzIG9mCi0JICogc2hpZnQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHBhcmFtIHNoaWZ0Ci0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpOwotCi0JLyoqCi0JICogVGVzdHMgaWYgPGNvZGU+b2xkUmVnaW9uPC9jb2RlPiBpcyBzYW1lIGFzIDxjb2RlPm5ld1JlZ2lvbjwvY29kZT4sCi0JICogaWdub3JpbmcgcG9zaXRpb24gb2Zmc2V0cyBvZiA8Y29kZT5zaGlmdDwvY29kZT4uCi0JICogCi0JICogSVNTVUU6IHdoaWNoIGRvY3VtZW50IHJlZ2lvbiBhcmUgb2xkIGFuZCBuZXcgaW4/Ci0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUmVnaW9uCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIG5ld1JlZ2lvbgotCSAqIEBwYXJhbSBzaGlmdAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KTsKLQotCS8qKgotCSAqIFNldCB0byB0cnVlIGlmL3doZW4gdGhpcyByZWdpb24gaXMgcmVtb3ZlZCBmcm9tIGEgZG9jdW1lbnQsIGR1cmluZyB0aGUKLQkgKiBwcm9jZXNzIG9mIHJlLXBhcnNpbmcuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZXRlZAotCSAqLwotCXZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpOwotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgYnkgcGFyc2VyL3JlcGFyc2VyIGlmIHJlZ2lvbiBkZWVtZWQgdG8gZW5kIHN5bnRhY3RpY2FsbHkuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gaGFzRW5kCi0JICovCi0Jdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCk7Ci0KLQkvKioKLQkgKiBTZXRzIGxlbmd0aCBvZiByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKTsKLQotCS8qKgotCSAqIEFzc2lnbnMgcG9pbnRlciB0byBuZXh0IHJlZ2lvbiwgb3IgbnVsbCBpZiBsYXN0IHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpOwotCi0JLyoqCi0JICogQXNzaWducyBwYXJlbnQgZG9jdW1uZXQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogQXNzaWducyBwb2ludGVyIHRvIHByZXZpb3VzIHJlZ2lvbiwgb3IgbnVsbCBpZiBmaXJzdCByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFByZXZpb3VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMpOwotCi0JLyoqCi0JICogU2V0cyBzdGFydCBvZmZzZXQgb2YgcmVnaW9uLCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCk7Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdkYjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgY2xhc3MgdXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBzbyB0aGUKLSAqIGltcGxlbWVudGF0aW9uIG9mIGhvdyB0aGUgbGlzdCBpcyBmb3JtZWQgY2FuIGJlIGhpZGRlbiAoZW5jYXBzdWxhdGVkIGJ5Ci0gKiB0aGlzIGNsYXNzKS4KLSAqIAotICogSVNTVUU6IHNob3VsZCBleHRlbmQgSVRleHRSZWdpb25MaXN0IGluc3RlYWQ/Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgewotCi0JLyoqCi0JICogUmV0dXJucyBlbnVtZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGVudW1lcmF0aW9uLgotCSAqLwotCUVudW1lcmF0aW9uIGVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNpemUgb2YgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHNpemUgb2YgbGlzdC4KLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBhdCBpbmRleCBpLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBpbmRleCBvZiByZWdpb24gdG8gcmV0dXJuCi0JICogQHJldHVybiB0aGUgcmVnaW9uIGF0IHNwZWNpZmllZCBvZmZzZXQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpdGVtKGludCBpKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzdiODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uaW5nIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRzLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMgewotCi0JU3RyaW5nIERFRkFVTFRfUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5LTk9XTl9QQVJUSVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5VTktOT1dOX1BBUlRJVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlOTQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotICogSWRlbnRpZmllcyB0aGUgd2F5IHRoYXQgRG9jdW1lbnRzIGFyZSBwYXJ0aXRpb25lZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcgewotCQotCS8qKiBTdHJpbmcgdG8gaWRlbnRpZnkgZGVmYXVsdCBwYXJ0aXRpb25pbmcqLwotCVN0cmluZyBERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kZWZhdWx0X3N0cnVjdHVyZWRfdGV4dF9wYXJ0aXRpb25pbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY0Yzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbjsKLQotCi0vKioKLSAqIEEgcGFydGl0aW9uZXIgaW50ZXJmYWNlIHJlcXVpcmVkIGZvciBoYW5kbGluZyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlIAotICogcHJvcGVybHkuIAotICogCi0gKiBJU1NVRTogbmVlZCB0byBpbnZlc3RpZ2F0ZSBuZWNlc3NpdHkgb2YgdGhlc2UgbWV0aG9kcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGV4dGVuZHMgSURvY3VtZW50UGFydGl0aW9uZXIgewotCi0JLyoqCi0JICogVXNlZCBieSBKU1AgcGFydGl0aW9uZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHBhcnRpdGlvbmVyIG9mIHRoZQotCSAqIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSBnZXRzIHRvIGNyZWF0ZSB0aGUgcGFydGl0aW9uIGluIGNhc2UgdGhlIHNwZWNpZmljCi0JICogY2xhc3NlcyBhcmUgaW1wb3J0YW50LgotCSAqIAotCSAqIElTU1VFOiBpbnZlc3RpZ2F0ZSBpZiB3ZSByZWFsbHkgbmVlZCB0aGlzLi4uCi0JICovCi0JSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHBhcnRpdGlvblR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGVmYXVsdCBwYXJ0aXRpb24gdHlwZSBmb3IgdGhpcyBwYXJ0aXRpb25lci4KLQkgKiA8cD4KLQkgKiBlZzoKLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDwvY29kZT4KLQkgKiA8L3A+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucwotCSAqIAotCSAqIEByZXR1cm4gdGhlIERlZmF1bHQgcGFydGl0aW9uIHR5cGUgZm9yIHRoaXMgcGFydGl0aW9uZXIuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uL29mZnNldC4KLQkgKiA8cD4KLQkgKiBlZzoKLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJlZ2lvbiBvZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQgaW4gdGhlIElTdHJ1Y3R1cmVkRG91Y21lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uL29mZnNldC4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5nIG9mIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIAotCSAqIGJldHdlZW4gdGhlIDIgcmVnaW9uIHBhcmFtZXRlcnMuCi0JICogVXNlZnVsIGZvciBmaW5kaW5nIHRoZSBwYXJ0aXRpb24gdHlwZSBvZiBhIDAgbGVuZ3RoIHJlZ2lvbi4KLQkgKiBlZy4KLQkgKiA8cHJlPgotCSAqIAk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+fDwvc2NyaXB0PgotCSAqIDwvcHJlPgotCSAqIEBwYXJhbSBwcmV2aW91c05vZGUKLQkgKiBAcGFyYW0gbmV4dE5vZGUKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb24gdHlwZSBvZiB0aGUgbm9kZSBiZXR3ZWVuIHByZXZpb3VzTm9kZSBhbmQgbmV4dE5vZGUKLQkgKiBAZGVwcmVjYXRlZCBtb3ZlIHRvIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMiAtPgotCSAqICBTdHJpbmcgZ2V0Q29udGVudFR5cGUoaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucyk7Ci0JICovCi0JU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NjVmYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCi0vKioKLSAqIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGRlc2NyaWJlcyB0aGUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXNwb25zaWJpbGl0aWVzCi0gKiBmb3IgcmVwYXJzaW5nIGEgc3RydWN0dXJlZCBkb2N1bWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgewotCi0JLyoqCi0JICogQmVnaW5zIHRoZSBwcm9jZXNzIG9mIHJlcGFyc2luZywgYnkgcHJvdmlkaW5nIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQKLQkgKiBmb3IgdGhlIHJlcGFyc2UuIFRoZSByZXBhcnNlIGlzIGFjdHVhbGx5IHBlcmZvcm1lZCB3aGVuIHRoZSByZXBhcnNlCi0JICogbWV0aG9kIGlzIGNhbGxlZC4gV2lsbCB0aHJvdWdoIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBkb2N1bWVudCBhcwotCSAqIG5vdCBiZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZShPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIHRvIGVuYWJsZSBtdWx0aXBsZSB0aHJlYWRzIHRvIHJlcGFyc2UgYQotCSAqIGRvY3VtZW50LiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUgaW50aWFsaXplIG1ldGhvZCBzZXRzIHN0YXRlCi0JICogdmFyaWFibGVzIHRoYXQgbXVzdCBiZSAiaW4gc3luYyIgd2l0aCB0aGUgc3RydWN0dXJlZERvY3VtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyc2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHJlcGFyc2VyLCB1c2VkIHdoZW4gY2xvbmluZyBkb2N1bWVudHMuCi0JICogCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHJlcGFyc2VyLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgbmVlZHMgdG8gY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQKLQkgKiBhbmQgZGlydHkgZW5kIGluIHRlcm1zIG9mIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyBiYXNlZCBvbiB0aGUKLQkgKiBzdGFydCBwb2ludCBhbmQgbGVuZ3RoIG9mIHRoZSBjaGFuZ2VzLCB3aGljaCBhcmUgcHJvdmlkZWQgYnkgdGhlCi0JICogaW5pdGlhbGl6ZSBtZXRob2QuIFdpbGwgdGhyb3VnaCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgZG9jdW1lbnQgYXMKLQkgKiBub3QgYmUgc2V0LgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKCk7Ci0KLQotCi0JLyoqCi0JICogVGhlIHJlcGFyc2VyIGlzIGluaXRpYWxpemVkIHdpdGggaXRzIGRvY3VtZW50LCBlaXRoZXIgaW4gb3Igc2hvcnRseQotCSAqIGFmdGVyIGl0cyBjb25zdHJ1Y3RlZCBpcyBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI4MWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCi0vKioKLSAqIEEgc2ltcGxlIGRlc2NyaXB0aW9uIG9mIGEgYml0IG9mIHRleHQgKHRlY2huaWNhbGx5LCBhIGJpdCBvZiBhIHRleHQgYnVmZmVyKQotICogdGhhdCBoYXMgYSAidHlwZSIgYXNzb2NpYXRlZCB3aXRoIGl0LiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBYTUwgdGV4dAotICogIiZMVDtJTUcmR1Q7IiwgdGhlICcgPCcgbWlnaHQgZm9ybSBhIHJlZ2lvbiBvZiB0eXBlICJvcGVuIGJyYWNrZXQiIHdoZXJlIGFzCi0gKiB0aGUgdGV4dCAiSU1HIiBtaWdodCBmb3JtIGEgcmVnaW9uIG9mIHR5cGUgInRhZyBuYW1lIi4KLSAqIAotICogTm90ZSB0aGF0IHRoZXJlIGFyZSB0aHJlZSBwb3NpdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcmVnaW9uLCB0aGUgc3RhcnQsCi0gKiB0aGUgZW5kLCBhbmQgdGhlIGVuZCBvZiB0aGUgdGV4dC4gVGhlIGVuZCBvZiB0aGUgcmVnaW9uIHNob3VsZCBhbHdheXMgYmUKLSAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBiZWNhdXNlIHRoZSBlbmQgb2YgdGhlIHRleHQKLSAqIHNpbXBseSBpbmNsdWRlcyBhbnkgd2hpdGUgc3BhY2UgdGhhdCBtaWdodCBmb2xsb3cgdGhlIG5vbi13aGl0ZXNwYWNlCi0gKiBwb3J0aW9uIG9mIHRoZSByZWdpb24uIFRoaXMgd2hpdGVzcGFjZSBpcyBhc3N1bWVkIHRvIGJlIGlnbm9yYWJsZSBleGNlcHQKLSAqIGZvciByZWFzb25zIG9mIG1haW50YWluaW5nIGl0IGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBmb3IgZm9ybWF0dGluZywKLSAqIGFwcGVhcmFuY2UsIGV0Yy4KLSAqIAotICogRm9sbG93cyB0aGUgUHJpbWUgRGlyZWN0aXZlczoKLSAqIAotICogZ2V0RW5kKCkgPT0gZ2V0U3RhcnQoKSArIGdldExlbmd0aCgpCi0gKiAKLSAqIGdldFRleHRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0VGV4dExlbmd0aCgpOwotICogCi0gKiBFdmVudCB0aG91Z2ggJ2VuZCcgYW5kICdsZW5ndGgnIGFyZSByZWR1bmRhbnQgKGdpdmVuIHN0YXJ0KSwgYm90aCBtZXRob2RzCi0gKiBhcmUgcHJvdmlkZWQsIHNpbmNlIHNvbWUgcGFyc2Vycy9pbXBsZW1lbnRhdGlvbnMgZmF2b3Igb25lIG9yIHRoZSBvdGhlciBmb3IKLSAqIGVmZmljaWVuY3kuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVnaW9uIHsKLQotCS8qKgotCSAqIENoYW5nZXMgbGVuZ3RoIG9mIHJlZ2lvbi4gTWF5IGJlIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbgotCSAqIHplcm8uIEl0IG1heSBub3QsIGhvd2V2ZXIsIGNhdXNlIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbiB0byBiZSBsZXNzCi0JICogdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBvciBhbiBpbGxlZ2FsIGFyZ3VtZW50IGFjY2VwdGlvbiBtYXkgYmUgdGhyb3duCi0JICogYXQgcnVudGltZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKTsKLQotCS8qKgotCSAqIENoYW5nZXMgc3RhcnQgb2Zmc2V0IG9mIHJlZ2lvbi4gTWF5IGJlIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIKLQkgKiB0aGFuIHplcm8uIEl0IG1heSBub3QsIGhvd2V2ZXIsIGNhdXNlIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbiB0byBiZQotCSAqIGxlc3MgdGhhbiB6ZXJvLCBvciBhbiBpbGxlZ2FsIGFyZ3VtZW50IGFjY2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0JICogcnVudGltZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgYWRqdXN0U3RhcnQoaW50IGkpOwotCi0JLyoqCi0JICogQ2hhbmdlcyB0ZXh0IGxlbmd0aCBvZiByZWdpb24uCi0JICogCi0JICogTWF5IGJlIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLiBJdCBtYXkgbm90LCBob3dldmVyLAotCSAqIGNhdXNlIHRoZSB0ZXh0IGxlbmd0aCBvZiB0aGUgcmVnaW9uIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIGEKLQkgKiByZWdpb24sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQgcnVudGltZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSk7Ci0KLQkvKioKLQkgKiBNYWtlcyB0aGlzIHJlZ2lvbnMgc3RhcnQsIGxlbmd0aCwgYW5kIHRleHQgbGVuZ3RoIGVxdWFsIHRvIHRoZQotCSAqIHBhcmVtdGVyJ3Mgc3RhcnQsIGxlbmd0aCwgYW5kIHRleHQgbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQl2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHJlZ2lvbi4gV2hldGhlciBpcyByZWxhdGl2ZSB0byB0aGUKLQkgKiBkb2N1bWVudCwgb3IgYW5vdGhlciByZWdpb24gZGVwZW5kcyBvbiB0aGUgc3VidHlwZS4KLQkgKiAKLQkgKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmU6IGdldEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRMZW5ndGgoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyByZWdpb24uCi0JICovCi0JaW50IGdldEVuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24uCi0JICogCi0JICogRm9sbG93cyB0aGUgUHJpbWUgRGlyZWN0aXZlOiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLiBXaGV0aGVyIGlzIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCwKLQkgKiBvciBhbm90aGVyIHJlZ2lvbiBkZXBlbmRzIG9uIHRoZSBzdWJ0eXBlLgotCSAqIAotCSAqIEZvbGxvd3MgdGhlIFByaW1lIERpcmVjdGl2ZTogZ2V0RW5kKCkgPT0gZ2V0U3RhcnQoKSArIGdldExlbmd0aCgpCi0JICogCi0JICogQHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24uCi0JICogCi0JICogSW4gc29tZSBpbXBsZW1lbnRhdGlvbnMsIHRoZSAiZW5kIiBvZiB0aGUgcmVnaW9uIChhY2Nlc3NpYmxlIHZpYQotCSAqIGdldEVuZCgpKSBhbHNvIGNvbnRhaW5zIGFueSBhbmQgYWxsIHdoaXRlIHNwYWNlIHRoYXQgbWF5IG9yIG1heSBub3QgYmUKLQkgKiBwcmVzZW50IGFmdGVyIHRoZSAidG9rZW4iIChyZWFkOiByZWxldmFudCkgcGFydCBvZiB0aGUgcmVnaW9uLiBUaGlzCi0JICogbWV0aG9kLCBnZXRUZXh0RW5kKCksIGlzIHNwZWNpZmljIGZvciB0aGUgInRva2VuIiBwYXJ0IG9mIHRoZSByZWdpb24sCi0JICogd2l0aG91dCB0aGUgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRUZXh0RW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24uCi0JICogCi0JICogVGhlIHRleHQgbGVuZ3RoIGlzIGVxdWFsIHRvIGxlbmd0aCBpZiB0aGVyZSBpcyBubyB3aGl0ZSBzcGFjZSBhdCB0aGUKLQkgKiBlbmQgb2YgYSByZWdpb24uIE90aGVyd2lzZSBpdCBpcyBzbWFsbGVyIHRoYW4gbGVuZ3RoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0VGV4dExlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBAc2VlIHJlZ2lvbnR5cGVzLCBzdHJ1Y3R1cmVkZG9jdW1lbnRyZWdpb250eXBlcwotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyByZWdpb24uCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEFsbG93cyB0aGUgcmVnaW9uIGl0c2VsZiB0byBwYXJ0aWNpcGF0ZSBpbiByZXBhcnNpbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBUaGUgcmVnaW9uIGl0c2VsZiBjYW4gZGVjaWRlIGlmIGl0IGNhbiBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50Ci0JICogdG8gcmV0dXJuLCBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGNoYW5nZS4gSWYgaXQgY2FuIG5vdCwgdGhpcyBtZXRob2QKLQkgKiBtdXN0IHJldHVybiBudWxsLCBzbyBhICJoaWdoZXIgbGV2ZWwiIHJlcGFyc2luZyBwcm9jZXNzIHdpbGwgYmUgZ2l2ZW4KLQkgKiB0aGUgb3BwdXJ0dW5pdHkgdG8gZGVjaWRlLiBJZiBpdCByZXR1cm5zIGFuIEV2ZW50LCB0aGF0J3MgaXQsIG5vdCBvdGhlcgotCSAqIHJlcGFyc2luZyBwcm9jZXNzIHdpbGwgZ2V0IGFuIG9wcHVydHVuaXR5IHRvIHJlcGFyc2UuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODg5MGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIElUZXh0UmVnaW9uQ29sbGVjdGlvbiwgYXMgaXRzIG5hbWUgaW1wbGllcywgaXMgYSBjb2xsZWN0aW9uIG9mCi0gKiBJVGV4dFJlZ2lvbnMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBleHRlbmRzIElUZXh0UmVnaW9uIHsKLQotCS8qKgotCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcmVnaW9uIGNvbnRhaW5zIGEgcGFydGljdWxhciBvZmZzZXQsIHdoZXJlCi0JICogb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVnaW9ucyBzdGFydCBhbmQKLQkgKiAgICAgICAgIGxlc3MgdGhhbiBpdHMgZW5kIG9mZnNldC4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogVXNlZCB0byBkZXRlcm1pbmUgaWYgYSByZWdpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIG9mZnNldC4KLQkgKiAKLQkgKiBJU1NVRTogSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGlzIGlzIHJlYWxseSBmb3IhICh0aGF0IGlzLCBob3cgdG8KLQkgKiBkZXNjcmliZSBpdCwgb3IgaWYgc3RpbGwgbmVlZGVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVnaW9ucyBzdGFydCBhbmQKLQkgKiAgICAgICAgIGxlc3MgdGhhbiBpdHMgZW5kIG9mZnNldC4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLQkgKiBkb2N1bWVudC4KLQkgKiAKLQkgKiBGb3Igc29tZSBzdWJ0eXBlcywgYnV0IG5vdCBhbGwsIGl0IGlzIGVxdWl2aWxlbnQgdG8gZ2V0RW5kKCkuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0LCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudCBvZgotCSAqIHRoZSBjb250YWluZWQgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZWRSZWdpb24KLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLgotCSAqLwotCWludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aG9zZSBjb250YWluZWQgYnkgdGhpcyByZWdpb24gY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGwgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgaW5jbHVkaW5nIHdoaXRlc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZnVsbCB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbFRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGwgdGV4dCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgaW5jbHVkaW5nIHdoaXRlc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhc3QgcmVnaW9uIG9mIHRob3NlIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbiBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhc3QgcmVnaW9uLgotCSAqLwotCUlUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaW9ucyBjb250YWluZWQgYnkgdGhpcyByZWdpb24uCi0JICovCi0JaW50IGdldE51bWJlck9mUmVnaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9uIHRoYXQgY29udGFpbnMgb2Zmc2V0LiBJbiB0aGUgY2FzZSBvZiAibmVzdGVkIgotCSAqIHJlZ2lvbnMsIHJldHVybnMgdGhlIHRvcCBtb3N0IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogQHJldHVybiB0aGUgcmVnaW9uIHRoYXQgY29udGFpbnMgb2Zmc2V0LiBJbiB0aGUgY2FzZSBvZiAibmVzdGVkIgotCSAqICAgICAgICAgcmVnaW9ucywgcmV0dXJucyB0aGUgdG9wIG1vc3QgcmVnaW9uLgotCSAqLwotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9ucyBjb250YWluZWQgYnkgdGhpcyByZWdpb24uCi0JICogCi0JICogTm90ZTogbm8gYXNzdW1wdGlvbnMgc2hvdWxkIGJlIG1hZGUgYWJvdXQgdGhlIG9iamVjdCBpZGVudGl0eSBvZiB0aGUKLQkgKiByZWdpb25zIHJldHVybmVkLiBQdXQgYW5vdGhlciB3YXksIGR1ZSB0byBtZW1vcnkgdXNlIG9wdGltaXphdGlvbnMsCi0JICogZXZlbiBpZiB0aGUgdW5kZXJseWluZyB0ZXh0IGhhcyBub3QgY2hhbmdlZCwgdGhlIHJlZ2lvbnMgbWF5IG9yIG1heSBub3QKLQkgKiBiZSB0aGUgc2FtZSBvbmVzIHJldHVybmVkIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVnaW9ucyBjb250YWluZWQgYnkgdGhpcyByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGlzIHJlZ2lvbiwgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZgotCSAqIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhpcyByZWdpb24KLQkgKi8KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgcmVsYXRpdmUgdG8gdGhlCi0JICogYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24KLQkgKi8KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhpcyByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUgc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlCi0JICogc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZQotCSAqICAgICAgICAgc3BhY2UuCi0JICovCi0JaW50IGdldFRleHRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdAotCSAqIGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBub3QKLQkgKiAgICAgICAgIGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogQXNzaWducyB0aGUgY29sbGVjdGlvbiBjb250YWluZWQgaW4gdGhpcyByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVkUmVnaW9ucwotCSAqLwotCXZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgY29udGFpbmVkUmVnaW9ucyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTRjYTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWlucyBvdGhlciByZWdpb25zLCBsaWtlIGEgSVRleHRSZWdpb25Db2xsZWN0aW9uCi0gKiBidXQgaXMgaXRzZWxmIGEgcmVnaW9uIGluIGFuIElUZXh0UmVnaW9uQ29sbGVjdGlvbiwgc28gaXRzICJwYXJlbnQiIHJlZ2lvbgotICogaXMgbWFpbnRhaW5lZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25Db250YWluZXIgZXh0ZW5kcyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcmVnaW9uLgotCSAqLwotCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgSVRleHRSZWdpb25Db2xsZWN0aW9uIHRoaXMgcmVnaW9uIGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQl2b2lkIHNldFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxMzU3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBJVGV4dFJlZ2lvbkxpc3QgaXMgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgcmVnaW9ucy4gSXQgY2FuIGJlIHVzZWQgc28gY2xpZW50cwotICogZG8gbm90IG5lZWQgdG8gYmUgYXdhcmUgb2YgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dFJlZ2lvbkxpc3QgewotCi0JLyoqCi0JICogQWRkcyByZWdpb24gdG8gdGhlIGxpc3QuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiBBZGRzIG5ldyByZWdpb25zIHRvIHRoZSBsaXN0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogQHBhcmFtIG5ld1JlZ2lvbnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbnNlcnRQb3MsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZ2lvbnMgZnJvbSB0aGUgbGlzdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9uIGF0IDxjb2RlPmluZGV4PC9jb2RlPiwgd2hlcmUgMCBpcyBmaXJzdCBvbmUgaW4KLQkgKiB0aGUgbGlzdC4gVGhyb3dzIGFuIDxjb2RlPkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjwvY29kZT4gaWYKLQkgKiBsaXN0IGlzIGVtcHR5LCBvciBpZiBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZGV4IG9mIDxjb2RlPnJlZ2lvbjwvY29kZT4gb3IgLTEgaWYgPGNvZGU+cmVnaW9uPC9jb2RlPgotCSAqIGlzIG5vdCBpbiB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgaW5kZXhPZihJVGV4dFJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGxpc3QgaGFzIG5vIHJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGxpc3QgaGFzIG5vIHJlZ2lvbnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGlzIGxpc3QuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgdGhpcyBsaXN0LgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcmVnaW9uIGF0IGluZGV4LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gcmVtb3ZlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJVGV4dFJlZ2lvbiByZWdpb24pOwotCi0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCByZWdpb25MaXN0IGZyb20gdGhpcyBsaXN0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSByZWdpb25zIGluIGFuIGFycmF5LiBObyBhc3N1bXB0aW9ucyBzaG91bGQgYmUKLQkgKiBtYWRlIGlmIHRoZSByZWdpb25zIGluIHRoZSBhcnJheSBhcmUgY2xvbmVzIGFyZSBzYW1lIGluc3RhbmNlIG9mCi0JICogb3JpZ2luYWwgcmVnaW9uLgotCSAqIAotCSAqIElTU1VFOiBkbyB3ZSBuZWVkIHRvIHNwZWNpZnkgaWYgY2xvbmVkIGNvcGllcyBvciBub3Q/Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbltdIHRvQXJyYXkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0YWUwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gaW5pdGlhbCBJRG9jdW1lbnRFeHRlbnNpb240IHN1cHBvcnQgLSAjMTAyODIyCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklMaW5lVHJhY2tlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBUaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2Ygc3RydWN0dXJlZCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudCwgSURvY3VtZW50RXh0ZW5zaW9uLCBJRG9jdW1lbnRFeHRlbnNpb24zLCBJRG9jdW1lbnRFeHRlbnNpb240LCBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIFRoaXMgVGhyZWFkTG9jYWwgY29uc3RydWN0IGlzIHVzZWQgc28gZWFjaCB0aHJlYWQgY2FuIG1haW50YWluIGl0cyBvbmx5Ci0JICogcG9pbnRlciB0byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IHRoYXQgbWFuYWdlcyB0aGUgZG9jdW1lbnRzIHJlZ2lvbnMuCi0JICogVGhlIG9ubHkgdGhpbmcgd2UgImdhdXJkIiBmb3IgaXMgdGhhdCBhIHByZXZpb3VzbHkgY2FjaGVkIHJlZ2lvbiBoYXMKLQkgKiBiZWVuIGRlbGV0ZWQuCi0JICogCi0JICogVGhlIG9iamVjdCB0aGF0IGlzIGtlcHQgaW4gdGhlIHRocmVhZCBsb2NhbCdzIG1hcCwgaXMganVzdCBhIHBvaW50ZXIgdG8KLQkgKiBhbiBhcnJheSBwb3NpdGlvbi4gVGhhdCdzIGJlY2F1c2UgdGhlIG9iamVjdCB0aGVyZSBuZWVkcyB0byBiZSAiZnJlZSIKLQkgKiBmcm9tIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cywgb3IgaXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZSB7Ci0JCS8vIEknbSBhc3N1bWluZyBmb3Igbm93IHRoZXJlIHdvdWxkIG5ldmVyIGJlIHNvIG1hbnkgdGhyZWFkcyB0aGF0Ci0JCS8vIHRoaXMgYXJyYXlMaXN0IG5lZWRzIHRvIGJlIGJvdW5kZWQsIG9yICdjbGVhbmVkIHVwJy4KLQkJLy8gdGhpcyBhc3N1bXB0aW9uIHNob3VsZCBiZSB0ZXN0ZWQgaW4gcHJhY3RpY2UgYW5kIGxvbmcgcnVubmluZwotCQkvLyBqb2JzIC0tIGZvdW5kIG5vdCB0byBiZSBhIGdvb2QgYXNzdW1wdGlvbi4gU2VlIGJlbG93LgotCQlwcml2YXRlIExpc3QgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdCgpKTsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgaW50IE1BWF9TSVpFID0gNTA7Ci0KLQotCQlwcml2YXRlIFRocmVhZExvY2FsIHRocmVhZExvY2FsQ2FjaGVQb3NpdGlvbiA9IG5ldyBUaHJlYWRMb2NhbCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0KCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJaW50IHBvcyA9IGdldFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuZ2V0KHBvcyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZXZlbiB0aG91Z2ggdGhlIGNhY2hlZFJlZ2lvblBvc2l0aW9uIGlzIHN5bmNocm9uaXplZCwKLQkJCQkvLyB0aGF0IGp1c3QgbWVhbnMgZWFjaCBhY2Nlc3MgaXMgc3luY3Jvbml6ZWQsIGl0cwotCQkJCS8vIHN0aWxsIHBvc3NpYmxlIGZvciBhbm90aGVyIHRocmVhZCB0byBjYXVzZSBpdCB0bwotCQkJCS8vIGJlIGNsZWFyZWQsIGFmdGVyIHRoaXMgdGhyZWFkIGdldHMgaXQgcG9zaXRpb24uCi0JCQkJLy8gU28sIGlmIHRoYXQgaGFwcGVucywgYWxsIHdlIGNhbiBkbyBpcyByZXNldCB0byBiZWdpbm5pbmcuCi0JCQkJLy8gVGhpcyBzaG91bGQgYmUgZXh0cmVtZWx5IHJhcmUgKGluIG90aGVyIHdvcmRzLCBwcm9iYWJseQotCQkJCS8vIG5vdCB3b3J0aCB1c2luZyBzeW5jaHJvbml6ZWQgYmxvY2tzCi0JCQkJLy8gdG8gYWNjZXNzIGNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuCi0JCQkJcmVpbml0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJCXJlc2V0VG9Jbml0aWFsU3RhdGUoKTsKLQkJCX0KLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCXJlZ2lvbiA9IHJlc2V0VG9Jbml0aWFsU3RhdGUoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCS8vIHJlZ2lvbiBub3QgbnVsbAotCQkJaWYgKHJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCXJlZ2lvbiA9IHJlc2V0VG9Jbml0aWFsU3RhdGUoKTsKLQkJCX0KLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQlwcml2YXRlIGludCBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCkgewotCQkJT2JqZWN0IHRocmVhZExvY2FsT2JqZWN0ID0gdGhyZWFkTG9jYWxDYWNoZVBvc2l0aW9uLmdldCgpOwotCQkJaW50IHBvcyA9IC0xOwotCQkJaWYgKHRocmVhZExvY2FsT2JqZWN0ID09IG51bGwpIHsKLQotCQkJCXBvcyA9IHJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBvcyA9ICgoSW50ZWdlcikgdGhyZWFkTG9jYWxPYmplY3QpLmludFZhbHVlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcG9zOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgaW50IHJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKSB7Ci0JCQlJbnRlZ2VyIHBvc2l0aW9uOwotCQkJaW50IHBvczsKLQkJCS8vIFRPRE9fZnV0dXJlOiB0aGluayBvZiBhIGJldHRlciBzb2x1dGlvbiB0aGF0IGRvZXNuJ3QKLQkJCS8vIHJlcXVpcmUgdGhpcyBrbHVkZ2UuIFRoaXMgaXMgZXNwZWNpYWxseSByZXF1aXJlZCBiZWNhdXNlCi0JCQkvLyBzb21lIGluZnJhc3R1cmUsIHN1Y2ggYXMgcmVjb25jaWxlciwgYWN0dWFsbHkgbnVsbCBvdXQKLQkJCS8vIHRoZWlyIHRocmVhZCBvYmplY3QgYW5kIHJlY3JlYXRlIGl0LCA1MDAgbXNlY3MgbGF0ZXIKLQkJCS8vIChhcHByb3hpbWF0ZWx5KS4KLQkJCS8vIE5vdGU6IHRoZSBsaWtlbHkgc29sdXRpb24gaW4gZnV0dXJlIGlzIHRvIGNsZWFyIGFmdGVyIGV2ZXJ5Ci0JCQkvLyBoZWF2eSB1c2Ugb2YgZ2V0Q2FjaGVkUmVnaW9uLCBzdWNoIGFzIGluIGNyZWF0aW5nIG5vZGUKLQkJCS8vIGxpc3RzLCBvciByZXBhcnNpbmcgb3IgcGFydGlvbmluZy4KLQkJCWlmIChjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LnNpemUoKSA+IE1BWF9TSVpFKSB7Ci0JCQkJY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5jbGVhcigpOwotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkgY2xlYXJlZCBhdCBzaXplICIgKyBNQVhfU0laRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlwb3NpdGlvbiA9IG5ldyBJbnRlZ2VyKGNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2l6ZSgpKTsKLQkJCXRocmVhZExvY2FsQ2FjaGVQb3NpdGlvbi5zZXQocG9zaXRpb24pOwotCQkJY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5hZGQocG9zaXRpb24uaW50VmFsdWUoKSwgbnVsbCk7Ci0JCQlwb3MgPSBwb3NpdGlvbi5pbnRWYWx1ZSgpOwotCQkJcmV0dXJuIHBvczsKLQkJfQotCi0JCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXNldFRvSW5pdGlhbFN0YXRlKCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb247Ci0JCQlyZWdpb24gPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJc2V0KHJlZ2lvbik7Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0KLQkJLy8gVE9ETzogbWFrZSBwcml2aXRlIGlmIHVzZWQsIGVsc2UgZGVsZXRlCi0JCXZvaWQgc2V0KGludCBwb3MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCQljYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LnNldChwb3MsIHJlZ2lvbik7Ci0JCX0KLQotCQl2b2lkIHNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQkJdHJ5IHsKLQkJCQlpbnQgcG9zID0gZ2V0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2V0KHBvcywgcmVnaW9uKTsKLQkJCX0KLQkJCWNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBldmVuIHRob3VnaCB0aGUgY2FjaGVkUmVnaW9uUG9zaXRpb24gaXMgc3luY2hyb25pemVkLAotCQkJCS8vIHRoYXQganVzdCBtZWFucyBlYWNoIGFjY2VzcyBpcyBzeW5jcm9uaXplZCwgaXRzCi0JCQkJLy8gc3RpbGwgcG9zc2libGUgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGNhdXNlIGl0IHRvCi0JCQkJLy8gYmUgY2xlYXJlZCwgYWZ0ZXIgdGhpcyB0aHJlYWQgZ2V0cyBpdCBwb3NpdGlvbi4KLQkJCQkvLyBTbywgaWYgdGhhdCBoYXBwZW5zLCBhbGwgd2UgY2FuIGRvIGlzIHJlc2V0IHRvIGJlZ2lubmluZy4KLQkJCQkvLyBUaGlzIHNob3VsZCBiZSBleHRyZW1lbHkgcmFyZSAoaW4gb3RoZXIgd29yZHMsIHByb2JhYmx5Ci0JCQkJLy8gbm90IHdvcnRoIHVzaW5nIHN5bmNocm9uaXplZCBibG9ja3MKLQkJCQkvLyB0byBhY2Nlc3MgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS4KLQkJCQlyZWluaXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQkJcmVzZXRUb0luaXRpYWxTdGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBOdWxsRG9jdW1lbnRFdmVudCBpcyB1c2VkIHRvIGNvbXBsZXRlIHRoZSAiYWJvdXRUb0NoYW5nZSIgYW5kCi0JICogImNoYW5nZWQiIGN5Y2xlLCB3aGVuIGluIGZhY3QgdGhlIG9yaWdpbmFsIGNoYW5nZSBpcyBubyBsb25nZXIgdmFsaWQuCi0JICogVGhlIG9ubHkga25vd24gKHZhbGlkKSBjYXNlIG9mIHRoaXMgaXMgd2hlbiBhIG1vZGVsIHJlLWluaXRpYWxpemUgdGFrZXMKLQkgKiBwbGFjZSwgd2hpY2ggY2F1c2VzIHNldFRleHQgdG8gYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2Ygc29tZSBwcmV2aW91cwotCSAqIGNoYW5nZS4gW1RoaXMgYXJjaGl0ZWN0dXJlIHdpbGwgYmUgaW1wcm92ZWQgaW4gZnV0dXJlXS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgTnVsbERvY3VtZW50RXZlbnQgZXh0ZW5kcyBEb2N1bWVudEV2ZW50IHsKLQkJcHVibGljIE51bGxEb2N1bWVudEV2ZW50KCkgewotCQkJdGhpcyhCYXNpY1N0cnVjdHVyZWREb2N1bWVudC50aGlzLCAwLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgTnVsbERvY3VtZW50RXZlbnQoSURvY3VtZW50IGRvYywgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJCXN1cGVyKGRvYywgb2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCQl9Ci0JfQotCi0JY2xhc3MgUmVnaXN0ZXJlZFJlcGxhY2UgewotCQkvKiogVGhlIG93bmVyIG9mIHRoaXMgcmVwbGFjZSBvcGVyYXRpb24uICovCi0JCUlEb2N1bWVudExpc3RlbmVyIGZPd25lcjsKLQkJLyoqIFRoZSByZXBsYWNlIG9wZXJhdGlvbiAqLwotCQlJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgZlJlcGxhY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgYnVuZGxlIG9iamVjdC4KLQkJICogCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBsaXN0ZW5lciBvd25pbmcgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uCi0JCSAqIEBwYXJhbSByZXBsYWNlCi0JCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uCi0JCSAqLwotCQlSZWdpc3RlcmVkUmVwbGFjZShJRG9jdW1lbnRMaXN0ZW5lciBvd25lciwgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHJlcGxhY2UpIHsKLQkJCWZPd25lciA9IG93bmVyOwotCQkJZlJlcGxhY2UgPSByZXBsYWNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhlc2UgY29udHJvbCB2YXJpYWJsZSBpc24ndCBtYXJrIGFzICdmaW5hbCcgc2luY2UgdGhlcmUncyBzb21lIHVuaXQKLQkgKiB0ZXN0cyB0aGF0IG1hbmlwdWxhdGUgaXQuIEZvciBmaW5hbCBwcm9kdWN0LCBpdCBzaG91bGQgYmUuCi0JICovCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIFVTRV9MT0NBTF9USFJFQUQgPSB0cnVlOwotCi0JLyoqCi0JICogcHVyZWx5IGZvciBkZWJ1Z2dpbmcvcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzIEluIHByYWN0aWNlLCB3b3VsZCBhbHdheXMKLQkgKiBiZSAndHJ1ZScuIChhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBieSBjYWxsZWQgYnkgY2xpZW50cykuIEl0cyBub3QKLQkgKiAnZmluYWwnIG9yIHByaXZhdGUganVzdCBzbyBpdCBjYW4gYmUgdmFyaWVkIGR1cmluZwotCSAqIGRlYnVnZ2luZy9wZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBydW5zLgotCSAqIAotCSAqIEBwYXJhbSB1c2VfbG9jYWxfdGhyZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVTRV9MT0NBTF9USFJFQUQoZmluYWwgYm9vbGVhbiB1c2VfbG9jYWxfdGhyZWFkKSB7Ci0JCVVTRV9MT0NBTF9USFJFQUQgPSB1c2VfbG9jYWxfdGhyZWFkOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjYWNoZWREb2N1bWVudFJlZ2lvbjsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG87Ci0JcHJpdmF0ZSBib29sZWFuIGZBY2NlcHRQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZXMgPSB0cnVlOwotCXByaXZhdGUgQ3VycmVudERvY3VtZW50UmVnaW9uQ2FjaGUgZkN1cnJlbnREb2N1bW5ldFJlZ2lvbkNhY2hlOwotCXByaXZhdGUgRG9jdW1lbnRFdmVudCBmRG9jdW1lbnRFdmVudDsKLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyW10gZkRvY3VtZW50TGlzdGVuZXJzOwotCi0JLyoqCi0JICogVGhlIHJlZ2lzdGVyZWQgZG9jdW1lbnQgcGFydGl0aW9uZXJzLgotCSAqLwotCXByaXZhdGUgTWFwIGZEb2N1bWVudFBhcnRpdGlvbmVyczsKLQkvKiogVGhlIHJlZ2lzdGVyZWQgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGxpc3RlbmVycyAqLwotCXByaXZhdGUgTGlzdCBmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBSZWdpb25QYXJzZXIgZlBhcnNlcjsKLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIgZlBvc2l0aW9uTWFuYWdlcjsKLQlwcml2YXRlIExpc3QgZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXJbXSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyczsKLQlwcml2YXRlIGludCBmUmVlbnRyYW5jZUNvdW50ID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGZSZVBhcnNlcjsKLQlwcml2YXRlIGludCBmU3RvcHBlZENvdW50ID0gMDsKLQotCXByaXZhdGUgSVRleHRTdG9yZSBmU3RvcmU7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyczsKLQlwcml2YXRlIE9iamVjdFtdIGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzOwotCXByaXZhdGUgT2JqZWN0W10gZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBMaXN0IGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZlRyYWNrZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBmVW5kb01hbmFnZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3REb2N1bWVudFJlZ2lvbjsKLQotCXByaXZhdGUgYnl0ZVtdIGxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgTnVsbERvY3VtZW50RXZlbnQgTlVMTF9ET0NVTUVOVF9FVkVOVDsKLQotCS8vCi0JLyoqCi0JICogaW4gY2FzZSBwcmVmZXJyZWQgZGVsaW1pdGVyIGlzIG5vdCBzZXQsIHdlJ2xsIGFzc3VtZSB0aGUgcGxhdGZvcm0KLQkgKiBkZWZhdWx0IE5vdGU6IGl0IGlzIG5vdCBmaW5hbCBzdGF0aWMgdG8gbWFrZSBzdXJlIGl0IHdvbid0IGJlIGlubGluZWQKLQkgKiBieSBjb21waWxlci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQbGF0Zm9ybUxpbmVEZWxpbWl0ZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiB0aGVvcmV0aWNhbGx5LCBhIGRvY3VtZW50IGNhbiBjb250YWluIG1peGVkIGxpbmUgZGVsaW1pdGVycwotCSAqLwotCXByaXZhdGUgU3RyaW5nIHByZWZlcmVkRGVsaW1pdGVyOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZID0gIl9SRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWV8iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQ3VycmVudCByZXdyaXRlIHNlc3Npb24sIG9yIG5vbmUgaWYgbm90IHByZXNlbnRseSByZXdyaXRpbmcuCi0JICovCi0JcHJpdmF0ZSBEb2N1bWVudFJld3JpdGVTZXNzaW9uIGZBY3RpdmVSZXdyaXRlU2Vzc2lvbjsKLQkvKioKLQkgKiBMYXN0IG1vZGlmaWNhdGlvbiBzdGFtcCwgYXV0b21hdGljYWxseSB1cGRhdGVkIG9uIGNoYW5nZS4KLQkgKi8KLQlwcml2YXRlIGxvbmcgZk1vZGlmaWNhdGlvblN0YW1wOwotCS8qKgotCSAqIGRlYnVnIHZhcmlhYmxlIG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICovCi0JcHJpdmF0ZSBsb25nIHN0YXJ0U3RyZWFtVGltZTsKLQkvKioKLQkgKiBkZWJ1ZyB2YXJpYWJsZSBvbmx5Ci0JICogCi0JICogQHBhcmFtIHBhcnNlcgotCSAqLwotCXByaXZhdGUgbG9uZyBzdGFydFRpbWU7Ci0KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDdXJyZW50RG9jdW1uZXRSZWdpb25DYWNoZSA9IG5ldyBDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZSgpOwotCQlmU3RvcmUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlKDUwLCAzMDApOwotCQlzZXRMaW5lVHJhY2tlcihuZXcgRGVmYXVsdExpbmVUcmFja2VyKCkpOwotCQlOVUxMX0RPQ1VNRU5UX0VWRU5UID0gbmV3IE51bGxEb2N1bWVudEV2ZW50KCk7Ci0KLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCWludGVybmFsX2FkZFBvc2l0aW9uVXBkYXRlcihuZXcgRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpKTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGdldCBhIG5ldyBzdHJ1Y3R1cmVkRG9jdW1lbnQuIEl0cyBiZXN0IHRvCi0JICogdXNlIHRoZSBmYWN0b3J5IG1ldGhvZHMgaW4gTW9kZWxNYW5nZXIgdG8gY3JlYXRlIGEgbmV3Ci0JICogSVN0cnVjdHVyZWREb2N1bWVudCwgc2luY2UgaXQgd2lsbCBnZXQgYW5kIGluaXRpYWxpemUgdGhlIHBhcnNlcgotCSAqIGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBjb250ZW50IHR5cGUuCi0JICovCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcygpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnNlciwgIlByb2dyYW0gRXJyb3I6IElTdHJ1Y3R1cmVkRG9jdW1lbnQgY2FuIG5vdCBiZSBjcmVhdGVkIHdpdGggbnVsbCBwYXJzZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBnbyB0aHJvdWdoIHNldHRlciBpbiBjYXNlIHRoZXJlIGlzIHNpZGUgZWZmZWN0cwotCQlpbnRlcm5hbF9zZXRQYXJzZXIocGFyc2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2NsZWFyRG9jdW1lbnRFdmVudCgpIHsKLQkJLy8gbm8gaGFyZCBhbmQgZmFzdCByZXF1aXJlbWVudCB0byBudWxsIG91dCAuLi4ganVzdCBzZWVtcyBsaWtlCi0JCS8vIGEgZ29vZCBpZGVhLCBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIGl0LgotCQlmRG9jdW1lbnRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKE9iamVjdFtdIGxpc3RlbmVycykgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSQotCQkJLy8gZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKGZEb2N1bWVudEV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0Fib3V0VG9DaGFuZ2UoRG9jdW1lbnRFdmVudCBkb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IGZEb2N1bWVudFBhcnRpdGlvbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcCA9IChJRG9jdW1lbnRQYXJ0aXRpb25lcikgZS5uZXh0KCk7Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCXAuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKGRvY3VtZW50RXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRG9jdW1lbnRDaGFuZ2VkKE9iamVjdFtdIGxpc3RlbmVycywgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5PVEU6IGRvY3VtZW50IGV2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZSBUZXh0IEFQSSBhbmQgc2V0VGV4dAotCQkJLy8gQVBJCi0JCQkvLyBub3cgZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkvLyBOb3RlczogZkRvY3VtZW50RXZlbnQgY2FuIGJlICJzdWRkZW5seSIgbnVsbCwgaWYgb25lIG9mCi0JCQkJCS8vIHRoZQotCQkJCQkvLyBwcmV2aW91cyBjaGFuZ2VzCi0JCQkJCS8vIGNhdXNlZCBhICJzZXRUZXh0IiB0byBiZSBjYWxsZWQuIFRoZSBvbmx5IGtub3duIGNhc2Ugb2YKLQkJCQkJLy8gdGhpcwotCQkJCQkvLyBpcyBhIG1vZGVsIHJlc2V0Ci0JCQkJCS8vIGR1ZSB0byBwYWdlIGRpcmVjdGl2ZSBjaGFuZ2luZy4gRXZlbnR1YWxseSB3ZSBzaG91bGQKLQkJCQkJLy8gY2hhbmdlCi0JCQkJCS8vIGFyY2hldGVjdHVyZSB0byBoYXZlCi0JCQkJCS8vIGV2ZW50IHF1ZSBhbmQgYmUgYWJsZSB0byAiY2FuY2VsIiBwZW5kaW5nIGV2ZW50cywgYnV0Ci0JCQkJCS8vIGZvcgotCQkJCQkvLyBub3csIHdlJ2xsIGp1c3QgcGFzcyBhCi0JCQkJCS8vIE51bGxEb2N1bWVudEV2ZW50LiBCeSB0aGUgd2F5LCBpdCBpcyBpbXBvcnRhbnQgdG8gc2VuZAotCQkJCQkvLyBzb21ldGhpbmcsIHNpbmNlIGNsaWVudHMgbWlnaHQKLQkJCQkJLy8gaGF2ZSBpbmRldGVybWluYW50IHN0YXRlIGR1ZSB0byAiYWJvdXRUb0NoYW5nZSIgYmVpbmcKLQkJCQkJLy8gc2VudAotCQkJCQkvLyBlYXJsaWVyLgotCQkJCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRDaGFuZ2VkKE5VTExfRE9DVU1FTlRfRVZFTlQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZG9jdW1lbnRFdmVudCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIHAgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGUubmV4dCgpOwotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQlpZiAocCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQkvLyBJUmVnaW9uIGNoYW5nZWRQYXJ0aW9uID0KLQkJCQkJCSgoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24pIHApLmRvY3VtZW50Q2hhbmdlZDIoZG9jdW1lbnRFdmVudCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwLmRvY3VtZW50Q2hhbmdlZChkb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubm9DaGFuZ2UoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRXZlbnQoT2JqZWN0W10gbGlzdGVuZXJzLCBSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkucmVnaW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLnJlZ2lvbnNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm5vZGVzUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShPYmplY3RbXSBsaXN0ZW5lcnMpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQkvLyBOb3RlOiB0aGUgZG9jRXZlbnQgaXMgY3JlYXRlZCBpbiByZXBsYWNlVGV4dCBBUEkKLQkJCS8vIGZpcmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIG5vdGljZSB0aGUgQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IGlzIGNyZWF0ZWQgZnJvbSB0aGUKLQkJCQkJLy8gRG9jdW1lbnRFdmVudCwgc2luY2UgaXQgaXMgKG5lYXJseSkKLQkJCQkJLy8gdGhlIHNhbWUgaW5mb3JtYXRpb24uID9XaGF0IHRvIGRvIGFib3V0Ci0JCQkJCS8vIG9yaWdpbmFsUmVxdWVzdGVyPwotCQkJCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJCQkJfQotCQkJCQlBYm91dFRvQmVDaGFuZ2VkRXZlbnQgYWJvdXRUb0JlQ2hhbmdlZEV2ZW50ID0gbmV3IEFib3V0VG9CZUNoYW5nZWRFdmVudCh0aGlzLCBudWxsLCBmRG9jdW1lbnRFdmVudC5nZXRUZXh0KCksIGZEb2N1bWVudEV2ZW50LmdldE9mZnNldCgpLCBmRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQoYWJvdXRUb0JlQ2hhbmdlZEV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjcXVpcmVMb2NrKCkgewotCQkvLyBkbyBub3RoaW5nIGhlcmUgaW4gc3VwZXIgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBhZGRNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8KLQkJCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVycyBhbmQgTW9kZWxDaGFnbmVkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gc3RydWN0dXJlZERvY3VtZW50LiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgYWRkZWRlZCBtb3JlIHRoYW4gb25jZS4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIuIEFkZGluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJCS8vIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZCwKLQkJCQkvLyBzZW5kIHRoZSBuZXcgbW9kZWwgZXZlbnQgdG8gdGhhdCBvbmUgcGFydGljdWxhciBsaXN0ZW5lciwKLQkJCQkvLyBzbyBpdAotCQkJCS8vIGNhbiBpbml0aWFsaXplIGl0c2VsZiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RlbAotCQkJCS8vIGxpc3RlbmVyLm5ld01vZGVsKG5ldyBOZXdNb2RlbEV2ZW50KHRoaXMsIGxpc3RlbmVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuIFJlcXVlc3QgdG8gYWRkIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBhZGRlZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci4gQWRkaW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCQkvLyB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQsCi0JCQkJLy8gc2VuZCB0aGUgbmV3IG1vZGVsIGV2ZW50IHRvIHRoYXQgb25lIHBhcnRpY3VsYXIgbGlzdGVuZXIsCi0JCQkJLy8gc28gaXQKLQkJCQkvLyBjYW4gaW5pdGlhbGl6ZSBpdHNlbGYgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kZWwKLQkJCQkvLyBsaXN0ZW5lci5uZXdNb2RlbChuZXcgTmV3TW9kZWxFdmVudCh0aGlzLCBsaXN0ZW5lcikpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgbWFuYWdlIG91ciBvd24gZG9jdW1lbnQgbGlzdG5lcnMsIGluc3RlYWQgb2YgZGVsZWdhdGluZyB0byBvdXIKLQkgKiBwYXJlbnREb2N1bWVudCwgc28gd2UgY2FuIGZpcmUgYXQgdmVyeSBlbmQgKGFuZCBub3Qgd2hlbiB0aGUKLQkgKiBwYXJlbnREb2N1bWVudCBjaGFuZ2VzKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmRG9jdW1lbnRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZkRvY3VtZW50TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZkRvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG51bGw7Ci0JCQkJbmV3TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyW25ld1NpemVdOwotCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZEb2N1bWVudExpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZEb2N1bWVudExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIpCi0JICogCi0JICogUmVnaXN0ZXJzIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgbGlzdGVuZXIgd2l0aCB0aGUgZG9jdW1lbnQuIEFmdGVyCi0JICogcmVnaXN0cmF0aW9uIHRoZSBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBpcyBpbmZvcm1lZCBhYm91dCBlYWNoCi0JICogcGFydGl0aW9uIGNoYW5nZSBjYXVzZSBieSBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbi4gSWYgYSBkb2N1bWVudAotCSAqIHBhcnRpdGlvbmluZyBsaXN0ZW5lciBpcyBhbHNvIGEgZG9jdW1lbnQgbGlzdGVuZXIsIHRoZSBmb2xsb3dpbmcKLQkgKiBub3RpZmljYXRpb24gc2VxdWVuY2UgaXMgZ3VhcmFudGVlZCBpZiBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbiBjaGFuZ2VzCi0JICogdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZzogMSkKLQkgKiBsaXN0ZW5lci5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCk7IDIpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKCk7IDMpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpOyBJZiB0aGUgbGlzdGVuZXIgaXMgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQgbm90aGluZyBoYXBwZW5zLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgcG9zaXRpb24gdG8gdGhlIGRvY3VtZW50J3MgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeS4gVGhlCi0JICogZGVmYXVsdCBjYXRlZ29yeSBtdXN0IGJlIHNwZWNpZmllZCBieSB0aGUgaW1wbGVtZW50ZXIuIEEgcG9zaXRpb24gdGhhdAotCSAqIGhhcyBiZWVuIGFkZGVkIHRvIGEgcG9zaXRpb24gY2F0ZWdvcnkgaXMgdXBkYXRlZCBhdCBlYWNoIGNoYW5nZSBhcHBsaWVkCi0JICogdG8gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2FkZFBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24oY2F0ZWdvcnksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNhZGRQb3NpdGlvbkNhdGVnb3J5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjYWRkUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlpbnRlcm5hbF9hZGRQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgYXMgb25lIHdoaWNoIGlzIG5vdGlmaWVkIGJlZm9yZSB0aG9zZQotCSAqIGRvY3VtZW50IGxpc3RlbmVycyBhZGRlZCB3aXRoIDxjb2RlPmFkZERvY3VtZW50TGlzdGVuZXI8L2NvZGU+IGFyZQotCSAqIG5vdGlmaWVkLiBJZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgYWxzbyByZWdpc3RlcmVkIHVzaW5nCi0JICogPGNvZGU+YWRkRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4gaXQgd2lsbCBiZSBub3RpZmllZCB0d2ljZS4gSWYgdGhlCi0JICogbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIG5vdGhpbmcgaGFwcGVucy4KLQkgKiA8cD4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgZm9yIHB1YmxpYyB1c2UsIGl0IG1heSBvbmx5IGJlIGNhbGxlZCBieQotCSAqIGltcGxlbWVudGVycyBvZiA8Y29kZT5JRG9jdW1lbnRBZGFwdGVyPC9jb2RlPiBhbmQgb25seSBpZiB0aG9zZQotCSAqIGltcGxlbWVudGVycyBuZWVkIHRvIGltcGxlbWVudCA8Y29kZT5JRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50QWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIGFzIHByZW5vdGlmaWVkIGRvY3VtZW50IGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWludCBwcmV2aW91c1NpemUgPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJSURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbcHJldmlvdXNTaXplICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgMCwgbGlzdGVuZXJzLCAwLCBwcmV2aW91c1NpemUpOwotCQkJCWxpc3RlbmVyc1twcmV2aW91c1NpemVdID0gZG9jdW1lbnRBZGFwdGVyOwotCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbMV07Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnNbMF0gPSBkb2N1bWVudEFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGFyZzApIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDaGFyKDApOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBBUEkgcmVtb3ZlcyBhbGwgcmVhZCBvbmx5IHBvc2l0aW9ucywgYXMgc2hvdWxkIGJlIGRvbmUKLQkgKiB3ZSAnc2V0VGV4dCcgaXMgY2FsbGVkLiBOb3RlOiBhbiBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gbWF5IHNpbXBseQotCSAqIHJlbW92ZSB0aGUgY2F0ZWdvcnkgKGFuZCBpdCB3b3VsZCBnZXQgYWRkZWQgYmFjayBpbiBsYXRlciwgaWYvd2hlbgotCSAqIHJlYWRvbmx5IHJlZ2lvbnMgYWRkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyUmVhZE9ubHkoKSB7Ci0JCVBvc2l0aW9uW10gcG9zaXRpb25zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBvc2l0aW9ucyA9IGdldFBvc2l0aW9ucyhSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvZ3JhbSBlcnJvcjogc2hvdWxkIG5ldmVyIG9jY3VyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkvLyBub3RlIHdlIGRvbid0IGZpcmUgdGhlICJhYm91dCB0byBjaGFuZ2UiIG9yICJjaGFuZ2VkIiBldmVudHMsCi0JCQkvLyBzaW5jZSBwcmVzdW1hYmx5LCB0ZXh0IGlzIGFsbCBnb2luZyBhd2F5IGFuZCBiZWluZyByZXBsYWNlZAotCQkJLy8gYW55d2F5LgotCQkJcG9zaXRpb24uZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE8gRFcgSSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBzbWFydGVyIGFsZ29yaXRobSB0aGF0Ci0JCS8vIGFkdXN0IGV4aXN0aW5nIFJPIHJlZ2lvbnMsIGlmIG5lZWRlZC4gRm9yIG5vdywgSSdsbCBqdXN0Ci0JCS8vIHJlbW92ZSBhbnkgdGhhdCBvdmVybGFwLgotCQl0cnkgewotCQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBnZXRQb3NpdGlvbnMoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKLQkJCQlpZiAocG9zaXRpb24ub3ZlcmxhcHNXaXRoKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpKSB7Ci0JCQkJCVN0cmluZyBlZmZlY3RlZFRleHQgPSB0aGlzLmdldChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJLy8gZkRvY3VtZW50RXZlbnQgPSBuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydE9mZnNldCwKLQkJCQkJLy8gbGVuZ3RoLCBlZmZlY3RlZFRleHQpOwotCQkJCQlmaXJlUmVhZE9ubHlBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQkJCXBvc2l0aW9uLmRlbGV0ZSgpOwotCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBlZmZlY3RlZFRleHQsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCQkJZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgbWVhbnMgbm8gcmVhZG9ubHkgcmVnaW9ucyBiZWVuIGRlZmluZWQgeWV0Ci0JCQkvLyBzbyBub3RoaW5nIHRvIGRvLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluZGV4IGF0IHdoaWNoIGEgPGNvZGU+UG9zaXRpb248L2NvZGU+IHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG9mZnNldCB3b3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBjYXRlZ29yeS4gQXMgdGhlCi0JICogb3JkZXJpbmcgaW5zaWRlIGEgY2F0ZWdvcnkgb25seSBkZXBlbmRzIG9uIHRoZSBvZmZzZXQsIHRoZSBpbmRleCBtdXN0Ci0JICogYmUgY2hvb3NlbiB0byBiZSB0aGUgZmlyc3Qgb2YgYWxsIHBvc2l0aW9ucyB3aXRoIHRoZSBzYW1lIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeSBpbiB3aGljaCB3b3VsZCBiZSBhZGRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZmZzZXQgdG8gYmUgY29uc2lkZXJlZAotCSAqIEByZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIGNhdGVnb3J5Ci0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKiBAZXhjZXB0aW9uIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBjYXRlZ29yeSBpcyB1bmRlZmluZWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29tcHV0ZUluZGV4SW5DYXRlZ29yeShjYXRlZ29yeSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0LiBGb3IgYSBnaXZlbiBpbXBsZW1lbnRlcgotCSAqIG9mIHRoaXMgaW50ZXJmYWNlIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNhbWUgcmVzdWx0IGFzCi0JICogPGNvZGU+c2V0KHRleHQpOyBnZXROdW1iZXJPZkxpbmVzKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB3aG9zZSBudW1iZXIgb2YgbGluZXMgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0Ci0JICovCi0JcHVibGljIGludCBjb21wdXRlTnVtYmVyT2ZMaW5lcyhTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmNvbXB1dGVOdW1iZXJPZkxpbmVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIGdpdmVuIGRvY3VtZW50IHJhbmdlIHVzaW5nIHRoZQotCSAqIGRvY3VtZW50J3MgcGFydGl0aW9uZXIuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IG9mZnNldCBhdCB3aGljaCB0aGUgcmFuZ2Ugc3RhcnRzCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmFuZ2UKLQkgKiBAcmV0dXJuIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmFuZ2UncyBwYXJ0aXRpb25pbmcKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uW10gY29tcHV0ZVBhcnRpdGlvbmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb25bXSB0eXBlZFJlZ2lvbnMgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZWRSZWdpb25zID0gY29tcHV0ZVBhcnRpdGlvbmluZyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAodHlwZWRSZWdpb25zID09IG51bGwpIHsKLQkJCXR5cGVkUmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCX0KLQkJcmV0dXJuIHR5cGVkUmVnaW9uczsKLQl9Ci0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaW5jbHVkZVplcm9MZW5ndGhQYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKDAgPiBsZW5ndGgpIHx8IChvZmZzZXQgKyBsZW5ndGggPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5jb21wdXRlUGFydGl0aW9uaW5nKG9mZnNldCwgbGVuZ3RoLCBpbmNsdWRlWmVyb0xlbmd0aFBhcnRpdGlvbnMpOwotCQllbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmNvbXB1dGVQYXJ0aXRpb25pbmcob2Zmc2V0LCBsZW5ndGgpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbltde25ldyBUeXBlZFJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgREVGQVVMVF9DT05URU5UX1RZUEUpfTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29udGFpbnNQb3NpdGlvbihjYXRlZ29yeSwgb2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb25DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gZ2V0UG9zaXRpb25zKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKHBvc2l0aW9uLm92ZXJsYXBzV2l0aChzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBtZWFucyBubyByZWFkb25seSByZWdpb25zIGJlZW4gZGVmaW5lZCB5ZXQKLQkJCS8vIHNvIG9idmlvdXNseSBmYWxzZQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVBvc3ROb3RpZmljYXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlN0b3BwZWRDb3VudCA+IDApCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJTGlzdCBjaGFuZ2VzID0gZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGUgPSBjaGFuZ2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlSZWdpc3RlcmVkUmVwbGFjZSByZXBsYWNlID0gKFJlZ2lzdGVyZWRSZXBsYWNlKSBlLm5leHQoKTsKLQkJCQlyZXBsYWNlLmZSZXBsYWNlLnBlcmZvcm0odGhpcywgcmVwbGFjZS5mT3duZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCkgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCi0JCV9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyk7Ci0JCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSSEgKG9yIHNldCBUZXh0KQotCQlfZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzQWJvdXRUb0NoYW5nZShmRG9jdW1lbnRFdmVudCk7Ci0JCV9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZEb2N1bWVudExpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogRmlyZXMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBjaGFuZ2VkIG5vdGlmaWNhdGlvbiB0byBhbGwgcmVnaXN0ZXJlZAotCSAqIGRvY3VtZW50IHBhcnRpdGlvbmluZyBsaXN0ZW5lcnMuIFVzZXMgYSByb2J1c3QgaXRlcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGNoYW5nZWQgZXZlbnQKLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyA9PSBudWxsIHx8IGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbCA9IChJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikgZS5uZXh0KCk7Ci0JCQlpZiAobCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMiBleHRlbnNpb24yID0gKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgbDsKLQkJCQlleHRlbnNpb24yLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIHsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIGw7Ci0JCQkJZXh0ZW5zaW9uLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCh0aGlzLCBldmVudC5nZXRDb3ZlcmFnZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWwuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5QWJvdXRUb0JlQ2hhbmdlZCgpIHsKLQkJX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzKTsKLQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJISAob3Igc2V0IFRleHQpCi0JCS8vIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzKTsKLQkJLy8gX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoZkRvY3VtZW50TGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQoTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQkvLyBfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCV9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCdzIGNvbXBsZXRlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoKSB7Ci0JCXJldHVybiBnZXRTdG9yZSgpLmdldCgwLCBnZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBsZW5ndGggY2hhcmFjdGVycyBmcm9tIHRoZSBkb2N1bWVudCdzIHRleHQgc3RhcnRpbmcgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgcG9zaXRpb24uCi0JICogCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB0aGUgcmFuZ2UgaXMgbm90IHZhbGlkIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWludCBteUxlbmd0aCA9IGdldExlbmd0aCgpOwotCQlpZiAoMCA+IG9mZnNldCkKLQkJCW9mZnNldCA9IDA7Ci0JCWlmICgwID4gbGVuZ3RoKQotCQkJbGVuZ3RoID0gMDsKLQkJaWYgKG9mZnNldCArIGxlbmd0aCA+IG15TGVuZ3RoKSB7Ci0JCQkvLyBmaXJzdCB0cnkgYWRqdXN0aW5nIGxlbmd0aCB0byBmaXQKLQkJCWludCBsZXNzTGVuZ3RoID0gbXlMZW5ndGggLSBvZmZzZXQ7Ci0JCQlpZiAoKGxlc3NMZW5ndGggPj0gMCkgJiYgKG9mZnNldCArIGxlc3NMZW5ndGggPT0gbXlMZW5ndGgpKSB7Ci0JCQkJbGVuZ3RoID0gbGVzc0xlbmd0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNlY29uZCwgdHJ5IG9mZnNldAotCQkJCWludCBtb3JlT2Zmc2V0ID0gbXlMZW5ndGggLSBsZW5ndGg7Ci0JCQkJaWYgKChtb3JlT2Zmc2V0ID49IDApICYmIChtb3JlT2Zmc2V0ICsgbGVuZ3RoID09IG15TGVuZ3RoKSkgewotCQkJCQlvZmZzZXQgPSBtb3JlT2Zmc2V0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gY2FuIGhhcHBlbiBpZiBteUxlbmd0aCBpcyAwLgotCQkJCQkvLyBubyBhZGp1c3RtZW50IHBvc3NpYmxlLgotCQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdG9yZSgpLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCXJlc3VsdCA9IGZDdXJyZW50RG9jdW1uZXRSZWdpb25DYWNoZS5nZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNhY2hlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0Q2hhcgotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3MpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWNoYXIgcmVzdWx0ID0gMHgwMDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFN0b3JlKCkuZ2V0KHBvcyk7Ci0JCX0KLQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRvY3VtZW50IHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBnaXZlbgotCSAqIGNoYXJhY3RlciBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkuZ2V0Q29udGVudFR5cGUob2Zmc2V0KTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gewotCQlpZiAoKDAgPiBvZmZzZXQpIHx8IChvZmZzZXQgPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5nZXRDb250ZW50VHlwZShvZmZzZXQsIHByZWZlck9wZW5QYXJ0aXRpb25zKTsKLQkJZWxzZSBpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJ0aXRpb25lci5nZXRDb250ZW50VHlwZShvZmZzZXQpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIERFRkFVTFRfQ09OVEVOVF9UWVBFOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKSB7Ci0JCS8vIHNwZWNpZmljIHByZWZlcnJlZCBsaW5lIGRlbGltaXRlcgotCQlpZiAocHJlZmVyZWREZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwcmVmZXJlZERlbGltaXRlcjsKLQotCi0JCS8vIG5vIGxpbmUgZGVsaW1pdGVyIGhhcyBiZWVuIHVzZWQgc28ganVzdCB1c2UgcGxhdGZvcm0ncyBkZWZhdWx0Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gbnVsbDsKLQkJU3RyaW5nIHN5c0xpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybUxpbmVEZWxpbWl0ZXI7Ci0JCVN0cmluZ1tdIGRlbGltaXRlcnMgPSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCUFzc2VydC5pc1RydWUoZGVsaW1pdGVycy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxpbWl0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGVsaW1pdGVyc1tpXS5lcXVhbHMoc3lzTGluZURlbGltaXRlcikpIHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gc3lzTGluZURlbGltaXRlcjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIG5vIHBsYXRmb3JtIGRlZmF1bHQgc28ganVzdCB1c2UgZmlyc3QgbGVnYWwgZGVsaW1pdGVyCi0JCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyID0gZGVsaW1pdGVyc1swXTsKLQotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCdzIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50UGFydGl0aW9uZXIoSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORyk7Ci0JfQotCi0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uaW5nKSB7Ci0KLQkJSURvY3VtZW50UGFydGl0aW9uZXIgZG9jdW1lbnRQYXJ0aXRpb25lciA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJZG9jdW1lbnRQYXJ0aXRpb25lciA9IChJRG9jdW1lbnRQYXJ0aXRpb25lcikgZkRvY3VtZW50UGFydGl0aW9uZXJzLmdldChwYXJ0aXRpb25pbmcpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFBhcnRpdGlvbmVyOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXR1cm4gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQkvLyBzaG91bGQgd2UgdXBkYXRlIGNhY2hlZE5vZGU/Ci0JCS8vIFdlIHNob3VsZCB0byBrZWVwIGNvbnNpc3RlbnQgcGhpbG9zb3BoeSBvZiByZW1lbWJlcmluZyBsYXN0Ci0JCS8vIHJlcXVlc3RlZCBwb3NpdGlvbiwKLQkJLy8gZm9yIGVmZmljaWVuY3kuCi0JCXNldENhY2hlZERvY3VtZW50UmVnaW9uKGZpcnN0RG9jdW1lbnRSZWdpb24pOwotCQlyZXR1cm4gZmlyc3REb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQkvLyBzaG91bGQgd2UgdXBkYXRlIGNhY2hlZE5vZGU/Ci0JCS8vIFdlIHNob3VsZCB0byBrZWVwIGNvbnNpc3RlbnQgcGhpbG9zb3BoeSBvZiByZW1lbWJlcmluZyBsYXN0Ci0JCS8vIHJlcXVlc3RlZCBwb3NpdGlvbiwKLQkJLy8gZm9yIGVmZmljaWVuY3kuCi0JCXNldENhY2hlZERvY3VtZW50UmVnaW9uKGxhc3REb2N1bWVudFJlZ2lvbik7Ci0JCXJldHVybiBsYXN0RG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwYXJ0aXRpb25zCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldExlZ2FsQ29udGVudFR5cGVzKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpOwotCQl9Ci0JCWNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcyhTdHJpbmcgcGFydGl0aW9uaW5nKSB0aHJvd3MgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIHsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBnZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZyk7Ci0JCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmdldExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCWlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtERUZBVUxUX0NPTlRFTlRfVFlQRX07Ci0JCXRocm93IG5ldyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLSBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsTGluZURlbGltaXRlcnMoKSB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2dldExlbmd0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0U3RvcmUoKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjZ2V0TGluZURlbGltaXRlcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIGRlbGltaXRlciBvZiB0aGF0IGxpbmUKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGxpbmUgbnVtYmVyIGlzIGludmFsaWQgaW4gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZURlbGltaXRlcihsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmllZCBsaW5lLiBUaGUgbGluZSBpcyBkZXNjcmliZWQgYnkKLQkgKiBpdHMgb2Zmc2V0IGFuZCBpdHMgbGVuZ3RoIGV4Y2x1ZGluZyB0aGUgbGluZSdzIGRlbGltaXRlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZQotCSAqICAgICAgICAgICAgdGhlIGxpbmUgb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIGEgbGluZSBkZXNjcmlwdGlvbgotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGluZSBudW1iZXIgaXMgaW52YWxpZCBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb24oaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBvZmZzZXQuIFRoZSBkZXNjcmlwdGlvbgotCSAqIGNvbnRhaW5zIHRoZSBvZmZzZXQgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGxpbmUgZXhjbHVkaW5nIHRoZSBsaW5lJ3MKLQkgKiBkZWxpbWl0ZXIuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aG9zZSBsaW5lIHNob3VsZCBiZSBkZXNjcmliZWQKLQkgKiBAcmV0dXJuIGEgcmVnaW9uIGRlc2NyaWJpbmcgdGhlIGxpbmUKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIGludmFsaWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaW50IG9mZnNldCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxpbmUgaW5mb3JtYXRpb24KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aChpbnQgbGluZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVMZW5ndGgobGluZSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGdpdmVuIGxpbmUuCi0JICogCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIHRoZSBsaW5lIG9mIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgZG9jdW1lbnQgb2Zmc2V0Ci0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsaW5lIG51bWJlciBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVPZmZzZXQoaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU9mT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0VHJhY2tlcigpLmdldExpbmVOdW1iZXJPZk9mZnNldChvZmZzZXQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0RPQ1VNRU5UKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJEZXYuIFByb2dyYW0gSW5mbyBPbmx5OiBJU3RydWN0dXJlZERvY3VtZW50OjpnZXRMaW5lT2ZPZmZzZXQ6IG9mZnNldCBvdXQgb2YgcmFuZ2UsIHplcm8gYXNzdW1lZC4gb2Zmc2V0ID0gIiArIG9mZnNldCwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmVzdWx0ID0gMDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzIGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bWJlck9mTGluZXMoKSB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsaW5lcyB3aGljaCBhcmUgb2NjdXBpZWQgYnkgYSBnaXZlbiB0ZXh0IHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgc3BlY2lmaWVkIHRleHQgcmFuZ2UKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgb2NjdXBpZWQgYnkgdGhlIHNwZWNpZmllZCByYW5nZQotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBzcGVjaWZpZWQgcmFuZ2UgaXMgaW52YWxpZCBpbiB0aGlzIHRyYWNrZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bWJlck9mTGluZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldE51bWJlck9mTGluZXMob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgcHVibGljLCB0ZW1wb3JhcmlseSwgZm9yIHVzZSBieSB0YWcgbGliIGNsYXNzZXMuCi0JICovCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChmUGFyc2VyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmdldFBhcnNlci4gUGFyc2VyIG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBwYXJ0aXRpb24gaW4gd2hpY2ggdGhlIHBvc2l0aW9uIGlzIGxvY2F0ZWQuIFRoZQotCSAqIHBhcnRpdGlvbiBpcyBzcGVjaWZpZWQgYXMgdHlwZWQgcmVnaW9uLgotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJcGFydGl0aW9uID0gZ2V0UGFydGl0aW9uKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWlmIChwYXJ0aXRpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEVycm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvbjsKLQl9Ci0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKFN0cmluZyBwYXJ0aXRpb25pbmcsIGludCBvZmZzZXQsIGJvb2xlYW4gcHJlZmVyT3BlblBhcnRpdGlvbnMpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIHsKLQkJaWYgKCgwID4gb2Zmc2V0KSB8fCAob2Zmc2V0ID4gZ2V0TGVuZ3RoKCkpKQotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCUlUeXBlZFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCi0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikgewotCQkJcmVzdWx0ID0gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5nZXRQYXJ0aXRpb24ob2Zmc2V0LCBwcmVmZXJPcGVuUGFydGl0aW9ucyk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcGFydGl0aW9uZXIuZ2V0UGFydGl0aW9uKG9mZnNldCk7Ci0JCX0KLQkJZWxzZSBpZiAoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORy5lcXVhbHMocGFydGl0aW9uaW5nKSkgewotCQkJcmVzdWx0ID0gbmV3IFR5cGVkUmVnaW9uKDAsIGdldExlbmd0aCgpLCBERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JCX0KLQkJZWxzZQotCQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcnRpdGlvbmluZ3MoKSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBwYXJ0aXRpb25pbmdzID0gbmV3IFN0cmluZ1tmRG9jdW1lbnRQYXJ0aXRpb25lcnMuc2l6ZSgpXTsKLQkJZkRvY3VtZW50UGFydGl0aW9uZXJzLmtleVNldCgpLnRvQXJyYXkocGFydGl0aW9uaW5ncyk7Ci0JCXJldHVybiBwYXJ0aXRpb25pbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHBvc2l0aW9uIGNhdGVnb3JpZXMgYWRkZWQgdG8gdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UG9zaXRpb25DYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuZ2V0UG9zaXRpb25DYXRlZ29yaWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwb3NpdGlvbk1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljUG9zaXRpb25NYW5hZ2VyIGdldFBvc2l0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGZQb3NpdGlvbk1hbmFnZXIgPT0gbnVsbCkgewotCQkJZlBvc2l0aW9uTWFuYWdlciA9IG5ldyBHZW5lcmljUG9zaXRpb25NYW5hZ2VyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBmUG9zaXRpb25NYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIFBvc2l0aW9ucyBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gY2F0ZWdvcnkuCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgY2F0ZWdvcnkgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldFBvc2l0aW9ucyhTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuZ2V0UG9zaXRpb25zKGNhdGVnb3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNnZXRQb3NpdGlvblVwZGF0ZXJzCi0JICovCi0JcHVibGljIElQb3NpdGlvblVwZGF0ZXJbXSBnZXRQb3NpdGlvblVwZGF0ZXJzKCkgewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuZ2V0UG9zaXRpb25VcGRhdGVycygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgd2hpY2ggaXMgdGhlIGNhc2UgaWYgdGhlIG9mZnNldCBpcyBqdXN0Ci0JICogYmVmb3JlIG9yIGp1c3QgYWZ0ZXIgdGhlIGV4aXN0aW5nIHRleHQuIENvbXBhcmUgd2l0aAotCSAqIGdldE5vZGVBdENoYXJhY3Rlck9mZnNldC4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQotCQkvLyBGSVhNRTogbmVlZCB0byBzeW5jaCBvbiAnY2FjaGVkUmVnaW9uJyAoYnV0IHNpbmNlIHRoYXQncyBhCi0JCS8vIGNvbnN0YW50bHkgY2hhbmdpbmcgb2JqZWN0LCB3ZQotCQkvLyBjYW4ndCwgc28gbmVlZCB0byBhZGQgYSAicmVnaW9uX2xvY2siIG9iamVjdCwgYW5kIHVzZSBpdCBoZXJlLCBhbmQKLQkJLy8gaW4gcmUtcGFyc2VyLgotCQkvLyBPaCwgYW5kIG5lZWQgdG8gbWFrZSBzdXJlLCBhZnRlciBzeW5jaCwgdGhhdCB0aGUgcmVnaW9uIGlzIG5vdAotCQkvLyBkZWxldGVkLCBhbmQgaWYgc28sIEkgZ3Vlc3MgZ28gYmFjawotCQkvLyB0byB0aGUgYmVnaW5uaW5nIQotCi0JCS8vIGNhY2hlZCBub2RlIGNhbiBiZSBudWxsIHdoZW4gZG9jdW1lbnQgaXMgZW1wdHkKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwb3RlbnRpYWxDYWNoZWRSZWdpb24gPSBnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAocG90ZW50aWFsQ2FjaGVkUmVnaW9uICE9IG51bGwpIHsKLQotCQkJLy8gCi0KLQkJCS8vIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbm9kZSwgcmV0dXJuIHRoYXQuCi0JCQlpZiAocG90ZW50aWFsQ2FjaGVkUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQlyZXN1bHQgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb247Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBmaXJzdCwgZmluZCBvdXQgd2hhdCBkaXJlY3Rpb24gdG8gZ28sIHJlbGF0aXZlIHRvCi0JCQkJLy8gY2FjaGVkTm9kZS4KLQkJCQkvLyBuZWdhdGl2ZSBtZWFucyAidG93YXJkcyB0aGUgZnJvbnQiIG9mIHRoZSBmaWxlLAotCQkJCS8vIHBvc3RpdGl2ZQotCQkJCS8vIG1lYW5zCi0JCQkJLy8gdG93YXJkcyB0aGUgZW5kLgotCQkJCWludCBkaXJlY3Rpb24gPSBvZmZzZXQgLSBwb3RlbnRpYWxDYWNoZWRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQlpZiAoZGlyZWN0aW9uIDwgMCkgewotCQkJCQkvLyBzZWFyY2ggdG93YXJkcyBiZWdpbm5pbmcKLQkJCQkJd2hpbGUgKCFwb3RlbnRpYWxDYWNoZWRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0ZW1wTm9kZSA9IHBvdGVudGlhbENhY2hlZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJCQkJaWYgKHRlbXBOb2RlID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXBvdGVudGlhbENhY2hlZFJlZ2lvbiA9IHRlbXBOb2RlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBzZWFyY2ggdG93YXJkcyBlbmQKLQkJCQkJLy8gVGhlcmUgaXMgYSBsZWdpdGFtYXQgY29uZGl0aW9uIHdoZXJlIHRoZQotCQkJCQkvLyBvZmZzZXQgd2lsbCBub3QgYmUgY29udGFpbmVkIGluIGFueSBub2RlLAotCQkJCQkvLyB3aGljaCBpcyBpZiB0aGUgb2Zmc2V0IGlzIGp1c3QgcGFzdCB0aGUgbGFzdAotCQkJCQkvLyBjaGFyYWN0ZXIgb2YgdGV4dC4KLQkJCQkJLy8gQW5kLCB3ZSBtdXN0IGdhdXJkIGFnYWluc3Qgc2V0dGluZyBjYWNoZWROb2RlIHRvCi0JCQkJCS8vIG51bGwhCi0JCQkJCXdoaWxlICghcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGVtcE5vZGUgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb24uZ2V0TmV4dCgpOwotCQkJCQkJaWYgKHRlbXBOb2RlID09IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gdGVtcE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb247Ci0JCX0KLQkJLy8ganVzdCB0byBiZSBkb3VibHkgc3VyZSB3ZSBuZXZlciBhc3NpZ24gbnVsbCB0byBhbiBhbHJlYWR5IHZhbGlkCi0JCS8vIGNhY2hlZFJlZ2lvbi4KLQkJLy8gSSBiZWxpZXZlIGFueSB0aW1lICdyZXN1bHQnIGlzIG51bGwgYXQgdGhpcyBwb2ludCwgdGhhdCBqdXN0IG1lYW5zCi0JCS8vIHdlIGhhdmUgYW4KLQkJLy8gZW1wdHkgZG9jdW1lbnQsIGFuZCB0aGUgY2FjaGVkUmVnaW9uIGlzIGFscmVhZHkgbnVsbCwgYnV0IHdlIGNoZWNrCi0JCS8vIGFuZCBwcmludAotCQkvLyB3YXJuaW5nLCBqdXN0IHNvIGR1cmluZyBkZXZlbG9wbWVudCB3ZSBiZSBzdXJlIHdlIG5ldmVyIGFjY2lkZW50bHkKLQkJLy8gYnJlYWsgdGhpcyBhc3N1bXB0aW9uLgotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQllbHNlIGlmIChnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IG5vIHJlZ2lvbiBjb3VsZCBiZSBmb3VuZCB0byBjYWNoZSwgYnV0IGNhY2hlIHdhcyBub24gbnVsbC4gSW5kaWNhdGVzIGNvcnJ1cHRlZCBtb2RlbCBvciByZWdpb24gbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRSZWdpb25MaXN0KCkgewotCQlDb3JlTm9kZUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBDb3JlTm9kZUxpc3QobnVsbCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IG5ldyBDb3JlTm9kZUxpc3QoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoMCwgZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEluIHRoZSBjYXNlIG9mIDAgbGVuZ3RoLCB0aGUgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT4KLQkgKiBhdCB0aGUgY2hhcmFjdGVyIG9mZnNldCBpcyByZXR1cmVuZWQuIEluIG90aGVyIHdvcmRzLCB0aGUgcmVnaW9uIHRvIHRoZQotCSAqIHJpZ2h0IG9mIHRoZSBjYXJldCBpcyByZXR1cm5lZC4gZXhjZXB0IGZvciBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCwKLQkgKiB0aGVuIHRoZSBsYXN0IHJlZ2lvbiBpcyByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogT3RoZXJ3aXNlIGFsbCB0aGUgcmVnaW9ucyAiaW5iZXR3ZWVuIiB0aGUgaW5kaWNhdGVkIHJhbmdlIGFyZSByZXR1cm5lZCwKLQkgKiBpbmNsdWRpbmcgdGhlIHJlZ2lvbnMgd2hpY2ggb3ZlcmxhcCB0aGUgcmVnaW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8YnI+Ci0JICogZWcuCi0JICogPHA+Ci0JICogPGJyPgotCSAqIGVnLgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRtbCZndDtbJmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0O10mbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAgICA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2h0W21sJmd0OyZsdDtoZWFkJmd0OyZsdDsvaGVdYWQmZ3Q7Jmx0Oy9odG1sJmd0OyByZXR1cm5zICZsdDtodG1sJmd0OywmbHQ7aGVhZCZndDssJmx0Oy9oZWFkJmd0OwotCSAqIDwvcHJlPgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtodG1sJmd0O1smbHQ7aGVhZCZndDsmbHQ7L2hlYWQmZ3Q7XSZsdDsvaHRtbCZndDsgcmV0dXJucyAmbHQ7aGVhZCZndDssJmx0Oy9oZWFkJmd0OwotCSAqIDwvcHJlPgotCSAqICAgIDxwcmU+Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtodFttbCZndDsmbHQ7aGVhZCZndDsmbHQ7L2hlXWFkJmd0OyZsdDsvaHRtbCZndDsgcmV0dXJucyAmbHQ7aHRtbCZndDssJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChsZW5ndGggPCAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuJ3QgaGF2ZSBuZWdhdGl2ZSBsZW5ndGgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoaXMgd2lsbCBtYWtlIHRoZSByaWdodCBlZGdlIG9mIHRoZSByYW5nZSBwb2ludCBpbnRvIHRoZSBzZWxlY3Rpb24KLQkJLy8gZWcuIDxodG1sPls8aGVhZD48L2hlYWQ+XTwvaHRtbD4KLQkJLy8gd2lsbCByZXR1cm4gPGhlYWQ+LDwvaGVhZD4gaW5zdGVhZCBvZiA8aGVhZD4sPC9oZWFkPiw8L2h0bWw+Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJbGVuZ3RoLS07Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIHN0YXJ0IHRocmVhZCBzYWZlIGJsb2NrCi0JCXRyeSB7Ci0JCQlhY3F1aXJlTG9jaygpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0ICsgbGVuZ3RoKTsKLQkJCXdoaWxlIChjdXJyZW50UmVnaW9uICE9IGVuZFJlZ2lvbiAmJiBjdXJyZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXN1bHRzLmFkZChjdXJyZW50UmVnaW9uKTsKLQkJCQljdXJyZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQl9Ci0JCQkvLyBuZWVkIHRvIGFkZCB0aGF0IGxhc3QgZW5kIHJlZ2lvbgotCQkJLy8gY2FuIGJlIG51bGwgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHkgZG9jdW1lbnQKLQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXN1bHRzLmFkZChlbmRSZWdpb24pOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJcmVsZWFzZUxvY2soKTsKLQkJfQotCQkvLyBlbmQgdGhyZWFkIHNhZmUgYmxvY2sKLQotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogd2FzIG1hZGUgcHVibGljIGZvciBlYXNpZXIgdGVzdGluZy4gTm9ybWFsbHkgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYnkKLQkgKiBjbGllbnQgY29kZXMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGdldFJlUGFyc2VyKCkgewotCQlpZiAoZlJlUGFyc2VyID09IG51bGwpIHsKLQkJCWZSZVBhcnNlciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQkJZlJlUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZlJlUGFyc2VyOwotCX0KLQotCXByaXZhdGUgSVRleHRTdG9yZSBnZXRTdG9yZSgpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmU3RvcmUpOwotCQlyZXR1cm4gZlN0b3JlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGdldCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyLiBBc3N1bWVzIHRoYXQgdGhlIGRvY3VtZW50IGhhcyBiZWVuCi0JICogaW5pdGlhbGl6ZWQgd2l0aCBhIGxpbmUgdHJhY2tlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCdzIGxpbmUgdHJhY2tlcgotCSAqLwotCXByaXZhdGUgSUxpbmVUcmFja2VyIGdldFRyYWNrZXIoKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZlRyYWNrZXIpOwotCQlyZXR1cm4gZlRyYWNrZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKCkgewotCQlpZiAoZlVuZG9NYW5hZ2VyID09IG51bGwpIHsKLQkJCWZVbmRvTWFuYWdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGZVbmRvTWFuYWdlcjsKLQl9Ci0KLQl2b2lkIGluaXRpYWxpemVGaXJzdEFuZExhc3REb2N1bWVudFJlZ2lvbigpIHsKLQkJLy8gY2FjaGVkIE5vZGUgbXVzdCBhbHNvIGJlIGZpcnN0LCBhdCB0aGUgaW5pdGlhbCBwb2ludC4gT25seQotCQkvLyB2YWxpZAotCQkvLyB0byBjYWxsIHRoaXMgbWV0aG9kIHJpZ2h0IGFmdGVyIHRoZSBmaXJzdCBwYXJzZS4KLQkJLy8gCi0JCS8vIHdoZW4gc3RhcnRpbmcgYWZyZXNoLCBvdXIgY2FjaGVkTm9kZSBzaG91bGQgYmUgb3VyIGZpcnN0Tm9kZSwKLQkJLy8gc28gYmUgc3VyZSB0byBpbml0aWFsaXplIHRoZSBmaXJzdE5vZGUKLQkJZmlyc3REb2N1bWVudFJlZ2lvbiA9IGdldENhY2hlZERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIGJlIHN1cmUgdG8gdXNlICdnZXROZXh0JyBmb3IgdGhpcyBpbml0aWFsIGZpbmRpbmcgb2YgdGhlIGxhc3QKLQkJLy8gbm9kZSwKLQkJLy8gc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIG5vZGUuZ2V0TGFzdE5vZGUgbWF5IHNpbXBseSBjYWxsCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFOb2RlID0gZmlyc3REb2N1bWVudFJlZ2lvbjsKLQkJaWYgKGFOb2RlID09IG51bGwpIHsKLQkJCS8vIGRlZmVjdCAyNTQ2MDc6IHRvIGhhbmRsZSBlbXB0eSBkb2N1bWVudHMgcmlnaHQsIGlmCi0JCQkvLyBmaXJzdG5vZGUgaXMKLQkJCS8vIG51bGwsIG1ha2Ugc3VyZSBsYXN0IG5vZGUgaXMgbnVsbCB0b28KLQkJCWxhc3REb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJCWxhc3REb2N1bWVudFJlZ2lvbiA9IGFOb2RlOwotCQkJCWFOb2RlID0gYU5vZGUuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjaW5zZXJ0UG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0UG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlciwgaW50IGluZGV4KSB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLmluc2VydFBvc2l0aW9uVXBkYXRlcih1cGRhdGVyLCBpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsX2FkZFBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLmFkZFBvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbF9hZGRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLmFkZFBvc2l0aW9uVXBkYXRlcih1cGRhdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxfc2V0UGFyc2VyKFJlZ2lvblBhcnNlciBuZXdQYXJzZXIpIHsKLQkJZlBhcnNlciA9IG5ld1BhcnNlcjsKLQl9Ci0KLQlTdHJpbmcgaW50ZXJuYWxHZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaW50IG15TGVuZ3RoID0gZ2V0TGVuZ3RoKCk7Ci0JCS8vIGlmICgoMCA+IG9mZnNldCkgfHwgKDAgPiBsZW5ndGgpIHx8IChvZmZzZXQgKyBsZW5ndGggPiBteUxlbmd0aCkpCi0JCS8vIHRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXN1bHQgPSBnZXRTdG9yZSgpLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSByZXBsYWNlbWVudExlbmd0aAotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgaW50ZXJuYWxSZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIGNoYW5nZXMsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQlpZiAoY2hhbmdlcyA9PSBudWxsKQotCQkJY2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIAotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjpyZXBsYWNlVGV4dCgiICsgc3RhcnQgKyAiLCIgKyByZXBsYWNlbWVudExlbmd0aCArICIsIiArIGNoYW5nZXMgKyAiKSIpOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWlmIChEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkgfHwgRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5KSB7Ci0JCQlzdGFydFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQl0cnkgewotCQkJLy8gTm90ZTogZXZlbnQgbXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgJ2ZpcmUnIG1ldGhvZCBjYWxsZWQKLQkJCWZEb2N1bWVudEV2ZW50ID0gbmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzKTsKLQkJCWZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJYWNxdWlyZUxvY2soKTsKLQotCQkJCWlmICghaWdub3JlUmVhZE9ubHlTZXR0aW5ncyAmJiAoY29udGFpbnNSZWFkT25seShzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpKSkgewotCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCByZXF1ZXN0ZXIsIGNoYW5nZXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCQkJCW5vQ2hhbmdlRXZlbnQucmVhc29uID0gTm9DaGFuZ2VFdmVudC5SRUFEX09OTFlfU1RBVEVfQ0hBTkdFOwotCQkJCQlyZXN1bHQgPSBub0NoYW5nZUV2ZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gdXBkYXRlTW9kZWwocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXJlbGVhc2VMb2NrKCk7Ci0JCQl9Ci0KLQotCQkJaWYgKERlYnVnLnBlcmZUZXN0UmF3U3RydWN0dXJlZERvY3VtZW50T25seSB8fCBEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCWxvbmcgc3RvcFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgVGltZSBmb3IgSVN0cnVjdHVyZWREb2N1bWVudCByYXcgcmVwbGFjZVRleHQ6ICIgKyAoc3RvcFN0cmVhbVRpbWUgLSBzdGFydFN0cmVhbVRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJldmVudCB0eXBlIHJldHVybmVkIGJ5IHJlcGxhY2VUZXh0V2l0aE5vRGVidWdnaW5nVGhyZWFkOiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gRlVUVVJFX1RPX0RPOiBpbXBsZW1lbnQgY2FsbGJhY2sgbWVjaGFuaXNtPyB0byBhdm9pZCBpbnN0YW5jZW9mCi0JCQkvLyBhbmQgY2FzdGluZwotCQkJLy8gZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG11c3QgYmUgY2FsbGVkIGluIG9yZGVyIHRvIGVuZAotCQkJLy8gZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkIHN0YXRlCi0KLQkJCS8vIGluY3JlbWVudCBtb2RpZmljYXRpb24gc3RhbXAgaWYgbW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKQotCQkJCWZNb2RpZmljYXRpb25TdGFtcCsrOwotCi0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkvLyByZXN1bHQgc2hvdWxkIG5vdCBiZSBudWxsLCBidXQgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24sCi0JCQkJLy8gaXQgd2lsbCBiZQotCQkJCS8vIHNvIHNlbmQgYSBub0NoYW5nZUV2ZW50IGFuZCBsb2cgdGhlIHByb2JsZW0KLQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCByZXF1ZXN0ZXIsIGNoYW5nZXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50Lk5PX0VWRU5UOwotCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChub0NoYW5nZUV2ZW50KTsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIlByb2dyYW0gRXJyb3I6IGludmFsaWQgc3RydWN0dXJlZCBkb2N1bWVudCBldmVudCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVnaW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoUmVnaW9uQ2hhbmdlZEV2ZW50KSByZXN1bHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSB7Ci0JCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSByZXN1bHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSB7Ci0JCQkJCQkJLy8gcHJvYmFibHkgbW9yZSBlZmZpY2llbnQgdG8gbWFyayBvbGQgcmVnaW9ucyBhcwotCQkJCQkJCS8vICdkZWxldGVkJyBhdCB0aGUgdGltZQotCQkJCQkJCS8vIHRoYXQgYXJlIGRldGVybWluZWQgdG8gYmUgZGVsZXRlZCwgYnV0IEknbGwgZG8KLQkJCQkJCQkvLyBoZXJlCi0JCQkJCQkJLy8gaW4gdGhlbiBjZW50cmFsIHNwb3QKLQkJCQkJCQkvLyBmb3IgcHJvZ3JhbW1pbmcgZWFzZS4KLQkJCQkJCQl1cGRhdGVEZWxldGVkRmllbGRzKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgcmVzdWx0KTsKLQkJCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSByZXN1bHQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpIHsKLQkJCQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KChOb0NoYW5nZUV2ZW50KSByZXN1bHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gaWYgaGVyZSwgdGhpcyBtZWFucyBhIG5ldyBldmVudCB3YXMgY3JlYXRlZAotCQkJCQkJCQkvLyBhbmQgbm90IGhhbmRsZWQgaGVyZQotCQkJCQkJCQkvLyBqdXN0IHNlbmQgYSBubyBldmVudCB1bnRpbCB0aGlzIGlzc3VlIGlzCi0JCQkJCQkJCS8vIHJlc29sdmVkLgotCQkJCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCByZXF1ZXN0ZXIsIGNoYW5nZXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCQkJCQkJCW5vQ2hhbmdlRXZlbnQucmVhc29uID0gTm9DaGFuZ2VFdmVudC5OT19FVkVOVDsKLQkJCQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiUHJvZ3JhbSBFcnJvcjogdW5leHBlY3RlZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGV2ZW50OiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkpIHsKLQkJCQlsb25nIHN0b3BTdHJlYW1UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IFRvdGFsIFRpbWUgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnQgc2lnbmFsaW5nL3Byb2Nlc3NpbmcgaW4gcmVwbGFjZVRleHQ6ICIgKyAoc3RvcFN0cmVhbVRpbWUgLSBzdGFydFN0cmVhbVRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCi0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJLy8gZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSByZWFkb25seSByZWdpb24gb2YgMCBsZW5ndGgsCi0JCS8vIHNvIHdlJ2xsIGlnbm9yZSB0aG9zZSByZXF1ZXN0cwotCQlpZiAobGVuZ3RoIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBhZmZlY3RlZFRleHQgPSB0aGlzLmdldChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJLy8gYSBkb2N1bWVudCBldmVudCBmb3IgInJlYWQgb25seSIgY2hhbmdlIC4uLiBtdXN0Ci0JCS8vIGJlIGZvbGxvd2VkIGJ5ICJubyBjaGFuZ2UiIHN0cnVjdHVyZWREb2N1bWVudCBldmVudAotCQkvLyBmRG9jdW1lbnRFdmVudCA9IG5ldyBEb2N1bWVudEV2ZW50KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsCi0JCS8vIGFmZmVjdGVkVGV4dCk7Ci0JCWZpcmVSZWFkT25seUFib3V0VG9CZUNoYW5nZWQoKTsKLQkJLy8gaWYgKGNvbnRhaW5zUmVhZE9ubHkoc3RhcnRPZmZzZXQsIGxlbmd0aCkpIHsKLQkJLy8gYWRqdXN0UmVhZE9ubHlSZWdpb25zKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkvLyB9IGVsc2UgewotCQkvLyB3ZSBjYW4gYmxpbmRseSBhZGQgY2F0ZWdvcnksIHNpbmNlIG5vIGhhcm0gZG9uZSBpZiBhbHJlYWR5Ci0JCS8vIGV4aXN0cy4KLQkJYWRkUG9zaXRpb25DYXRlZ29yeShSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCVBvc2l0aW9uIG5ld1Bvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQl0cnkgewotCQkJYWRkUG9zaXRpb24oUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlksIG5ld1Bvc2l0aW9uKTsKLQkJCS8vIEZJWE1FOiBuZWVkIHRvIGNoYW5nZSBBUEkgdG8gcGFzcyBpbiByZXF1ZXN0ZXIsIHNvIHRoaXMgZXZlbnQKLQkJCS8vIGNhbiBiZQotCQkJLy8gY3JlYXRlZCBjb3JyZWN0bHksIGluc3RlYWQgb2YgdXNpbmcgbnVsbC4KLQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIG51bGwsIGFmZmVjdGVkVGV4dCwgc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCWZpcmVSZWFkT25seVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmb3Igbm93LCBsb2cgYW5kIGlnbm9yZS4gUGVyaGFwcyBsYXRlciB3ZQotCQkJLy8gY291bGQgYWRqdXN0IHRvIGhhbmRsZSBzb21lIGNhc2VzPwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigoImNvdWxkIG5vdCBjcmVhdGUgcmVhZG9ubHkgcmVnaW9uIGF0ICIgKyBzdGFydE9mZnNldCArICIgdG8gIiArIGxlbmd0aCksIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbmV2ZXIgb2NjdXIsIHNpbmNlIHdlIGFkZCBjYXRlZ29yeQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgbmV3SW5zdGFuY2UpLnNldFJlUGFyc2VyKGdldFJlUGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCWlmIChnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSB7Ci0JCQluZXdJbnN0YW5jZS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKCgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKS5uZXdJbnN0YW5jZSgpKTsKLQkJCW5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKS5jb25uZWN0KG5ld0luc3RhbmNlKTsKLQkJfQotCQluZXdJbnN0YW5jZS5zZXRMaW5lRGVsaW1pdGVyKGdldExpbmVEZWxpbWl0ZXIoKSk7Ci0JCWlmIChnZXRFbmNvZGluZ01lbWVudG8oKSAhPSBudWxsKSB7Ci0JCQluZXdJbnN0YW5jZS5zZXRFbmNvZGluZ01lbWVudG8oKEVuY29kaW5nTWVtZW50bykgZ2V0RW5jb2RpbmdNZW1lbnRvKCkuY2xvbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGUjcmVnaW9uTWF0Y2hlcyhpbnQsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUlUZXh0U3RvcmUgc3RvcmUgPSBnZXRTdG9yZSgpOwotCQlpZiAoc3RvcmUgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgc3RvcmUpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXQob2Zmc2V0LCBsZW5ndGgpLmVxdWFscyhzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJVGV4dFN0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHN0b3JlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIHN0b3JlKS5yZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldChvZmZzZXQsIGxlbmd0aCkuZXF1YWxzSWdub3JlQ2FzZShzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNyZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKElEb2N1bWVudExpc3RlbmVyIG93bmVyLCBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgcmVwbGFjZSkgewotCQlpZiAoZkFjY2VwdFBvc3ROb3RpZmljYXRpb25SZXBsYWNlcykgewotCQkJaWYgKGZQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcyA9PSBudWxsKQotCQkJCWZQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQlmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMuYWRkKG5ldyBSZWdpc3RlcmVkUmVwbGFjZShvd25lciwgcmVwbGFjZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZUxvY2soKSB7Ci0JCS8vIGRvIG5vdGhpbmcgaGVyZSBpbiBzdXBlciBjbGFzcwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJCWludCBvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJCS8vIHJlbW92aW5nCi0JCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyc1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZQotCQkJCQkvLyBvbGQKLQkJCQkJLy8gb25lCi0JCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZkRvY3VtZW50TGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmRG9jdW1lbnRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZEb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCUlEb2N1bWVudExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyW25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZEb2N1bWVudExpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmRG9jdW1lbnRMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I3JlbW92ZURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyAhPSBudWxsKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+UG9zaXRpb248L2NvZGU+IGZyb20gdGhlIGRvY3VtZW50J3MgZGVmYXVsdAotCSAqIHBvc2l0aW9uIGNhdGVnb3J5LiBUaGUgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeSBpcyB0byBiZSBkZWZpbmVkIGJ5Ci0JICogdGhlIGltcGxlbWVudGVycy4gSWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCdzIGRlZmF1bHQKLQkgKiBjYXRlZ29yeSBub3RoaW5nIGhhcHBlbnMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uKGNhdGVnb3J5LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25DYXRlZ29yeQotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5yZW1vdmVQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgZnJvbSB0ZWggZG9jdW1lbnQncyBsaXN0IG9mCi0JICogcHJlbm90aWZpZWQgZG9jdW1lbnQgbGlzdGVuZXJzLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aAotCSAqIHRoZSBkb2N1bWVudCBub3RoaW5nIGhhcHBlbnMuCi0JICogPHA+Ci0JICogCi0JICogVGhpcyBtZXRob2QgaXMgbm90IGZvciBwdWJsaWMgdXNlLCBpdCBtYXkgb25seSBiZSBjYWxsZWQgYnkKLQkgKiBpbXBsZW1lbnRlcnMgb2YgPGNvZGU+SURvY3VtZW50QWRhcHRlcjwvY29kZT4gYW5kIG9ubHkgaWYgdGhvc2UKLQkgKiBpbXBsZW1lbnRlcnMgbmVlZCB0byBpbXBsZW1lbnQgPGNvZGU+SURvY3VtZW50TGlzdGVuZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkCi0JICogCi0JICogQHNlZSAjYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBkb2N1bWVudEFkYXB0ZXIpKSB7Ci0JCQkJaW50IHByZXZpb3VzU2l6ZSA9IGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpZiAocHJldmlvdXNTaXplID4gMSkgewotCQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltwcmV2aW91c1NpemUgLSAxXTsKLQkJCQkJaW50IHByZXZpb3VzSW5kZXggPSAwOwotCQkJCQlpbnQgbmV3SW5kZXggPSAwOwotCQkJCQl3aGlsZSAocHJldmlvdXNJbmRleCA8IHByZXZpb3VzU2l6ZSkgewotCQkJCQkJaWYgKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzW3ByZXZpb3VzSW5kZXhdICE9IGRvY3VtZW50QWRhcHRlcikKLQkJCQkJCQlsaXN0ZW5lcnNbbmV3SW5kZXgrK10gPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyc1twcmV2aW91c0luZGV4XTsKLQkJCQkJCXByZXZpb3VzSW5kZXgrKzsKLQkJCQkJfQotCQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgSU5URVJOQUwgVVNFIE9OTFkgYW5kIGlzIE5PVCBBUEkuCi0JICogCi0JICogUmVidWlsZHMgdGhlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjaGFpbiBmcm9tIHRoZSBleGlzdGluZyB0ZXh0LgotCSAqIEZpbGVCdWZmZXIgc3VwcG9ydCBkb2VzIG5vdCBhbGxvdyBjbGllbnRzIHRvIGtub3cgdGhlIGRvY3VtZW50J3MKLQkgKiBsb2NhdGlvbiBiZWZvcmUgdGhlIHRleHQgY29udGVudHMgYXJlIHNldC4KLQkgKiAKLQkgKiBAc2VlIHNldChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwYXJzZShPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQljbGVhclJlYWRPbmx5KCk7Ci0KLQkJYWNxdWlyZUxvY2soKTsKLQkJdHJ5IHsKLQkJCUNoYXJTZXF1ZW5jZVJlYWRlciBzdWJTZXRUZXh0U3RvcmVSZWFkZXIgPSBuZXcgQ2hhclNlcXVlbmNlUmVhZGVyKChDaGFyU2VxdWVuY2UpIGdldFN0b3JlKCksIDAsIGdldFN0b3JlKCkuZ2V0TGVuZ3RoKCkpOwotCQkJcmVzZXRQYXJzZXIoc3ViU2V0VGV4dFN0b3JlUmVhZGVyLCAwKTsKLQkJCS8vCi0JCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihnZXRQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKSk7Ci0JCQkvLyB3aGVuIHN0YXJ0aW5nIGFmcmVzaCwgb3VyIGNhY2hlZE5vZGUgc2hvdWxkIGJlIG91ciBmaXJzdE5vZGUsCi0JCQkvLyBzbyBiZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0Tm9kZSBhbmQgbGFzdE5vZGUKLQkJCWluaXRpYWxpemVGaXJzdEFuZExhc3REb2N1bWVudFJlZ2lvbigpOwotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlyZWxlYXNlTG9jaygpOwotCQl9Ci0KLQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNyZXBsYWNlCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvcywgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RlOiBJU3RydWN0dXJlZERvY3VtZW50OjpyZXBsYWNlKGludCwgaW50LCBTdHJpbmcpIC4uLi4gaXRzIGJldHRlciB0byB1c2UgcmVwbGFjZVRleHQoc291cmNlLCBzdHJpbmcsIGludCwgaW50KSBBUEkgZm9yIHN0cnVjdHVyZWREb2N1bWVudCB1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXBsYWNlVGV4dCh0aGlzLCBwb3MsIGxlbmd0aCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZSBOb25lIG9mIHRoZSBvZmZzZXRzIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIGRlbGltaXRlcnMgb2YgcHJlY2VlZGluZyBsaW5lcy4gT2Zmc2V0IDAgaXMgdGhlIGZpcnN0Ci0JICogICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSByZXBsYWNlTGVuZ3RoCi0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiAgICAgICAgICAgIDxwPgotCSAqICAgICAgICAgICAgSW1wbGVtZW50b3JzIGhhdmUgdG8gbm90aWZ5IFRleHRDaGFuZ2VkIGxpc3RlbmVycyBhZnRlciB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIFRleHRDaGFuZ2VkRXZlbnQgc2hvdWxkIGJlIHNldAotCSAqICAgICAgICAgICAgYXMgZm9sbG93czoKLQkgKiAKLQkgKiBldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZCBldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogZXZlbnQubnVtUmVwbGFjZWRMaW5lcyA9IG51bWJlciBvZiByZXBsYWNlZCBsaW5lcyBldmVudC5udW1OZXdMaW5lcyA9Ci0JICogbnVtYmVyIG9mIG5ldyBsaW5lcyBldmVudC5yZXBsYWNlZExlbmd0aCA9IGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIGV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiAKLQkgKiBOT1RFOiBudW1OZXdMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIGFuZCBudW1SZXBsYWNlZExpbmVzCi0JICogaXMgdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzIGJhc2VkIG9uIHRoZSBjaGFuZ2UgdGhhdCBvY2N1cnMKLQkgKiB2aXN1YWxseS4gRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcmVwbGFjZWRUZXh0IG5ld1RleHQgbnVtUmVwbGFjZWRMaW5lcyBudW1OZXdMaW5lcyAiIiAiXG4iIDAgMSAiXG5cbiIKLQkgKiAiYSIgMiAwICJhIiAiXG5cbiIgMCAyCi0JICovCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIGNoYW5nZXMsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlyZXR1cm4gaW50ZXJuYWxSZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgaWdub3JlUmVhZE9ubHlTZXR0aW5ncyk7Ci0JfQotCi0Jdm9pZCByZXNldFBhcnNlcihpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCUlUZXh0U3RvcmUgdGV4dFN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHRleHRTdG9yZSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewotCQkJQ2hhclNlcXVlbmNlUmVhZGVyIHN1YlNldFRleHRTdG9yZVJlYWRlciA9IG5ldyBDaGFyU2VxdWVuY2VSZWFkZXIoKENoYXJTZXF1ZW5jZSkgdGV4dFN0b3JlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJcGFyc2VyLnJlc2V0KHN1YlNldFRleHRTdG9yZVJlYWRlciwgc3RhcnRPZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5ld05vZGVUZXh0ID0gZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCQlwYXJzZXIucmVzZXQobmV3Tm9kZVRleHQsIHN0YXJ0T2Zmc2V0KTsKLQotCQl9Ci0KLQl9Ci0KLQl2b2lkIHJlc2V0UGFyc2VyKFJlYWRlciByZWFkZXIsIGludCBzdGFydE9mZnNldCkgewotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5yZXNldChyZWFkZXIsIHN0YXJ0T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJLS1mU3RvcHBlZENvdW50OwotCQlpZiAoZlN0b3BwZWRDb3VudCA9PSAwICYmIGZSZWVudHJhbmNlQ291bnQgPT0gMCkKLQkJCWV4ZWN1dGVQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcygpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MgaW4gMy4wIC0gdXNlIGEgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgICBkaXJlY3RseQotCSAqIEBzZWUgSURvY3VtZW50I3NlYXJjaAotCSAqLwotCXB1YmxpYyBpbnQgc2VhcmNoKGludCBzdGFydFBvc2l0aW9uLCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkvLyAoZG13KSBJIGFkZGVkIHRoaXMgd2FybmluZywgdG8ga25vdyBpZiBzdGlsbCBiZWluZyB1c2VkLiBJJ20gbm90Ci0JCS8vIHN1cmUgaXQKLQkJLy8gd29ya3MgYXMgZXhwZWN0ZWQgYW55IGxvbmdlci4KLQkJLy8gYnV0IHRoZSB3YXJuaW5nIHNob3VsZCBiZSByZW1vdmVkLCBvbmNlIGtub3cuCi0JCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJXQVJOSU5HOiB1c2luZyB1bnN1cHBvcnRlZCBkZXByZWNhdGVkIG1ldGhvZCAnc2VhcmNoJyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSAtMTsKLQkJSVJlZ2lvbiBtYXRjaCA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcih0aGlzKS5maW5kKHN0YXJ0UG9zaXRpb24sIGZpbmRTdHJpbmcsIGZvcndhcmRTZWFyY2gsIGNhc2VTZW5zaXRpdmUsIHdob2xlV29yZCwgZmFsc2UpOwotCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gbWF0Y2guZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGU6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnNldFRleHQoU3RyaW5nKSAuLi4uIGl0cyBiZXR0ZXIgdG8gdXNlIHNldFRleHQoc291cmNlLCBzdHJpbmcpIEFQSSBmb3Igc3RydWN0dXJlZERvY3VtZW50IHVwZGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFRleHQobnVsbCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1heSBiZSBtYXJrZWQgcHVibGljLCBidXQgc2hvdWxkIGJlIHBhY2thZ2VkIHByb3RlY3RlZCwgb25jZQotCSAqIHJlZmFjdG9yaW5nIGlzIGNvbXBsZXRlIChpbiBvdGhlciB3b3Jkcywgbm90IGZvciBjbGllbnQgdXNlKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWRSZWdpb24pIHsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCWZDdXJyZW50RG9jdW1uZXRSZWdpb25DYWNoZS5zZXQoc3RydWN0dXJlZFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWNoZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWRSZWdpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXNldERvY3VtZW50UGFydGl0aW9uZXIoSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORywgcGFydGl0aW9uZXIpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uaW5nLCBJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgewotCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzLnJlbW92ZShwYXJ0aXRpb25pbmcpOwotCQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMuc2l6ZSgpID09IDApCi0JCQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycy5wdXQocGFydGl0aW9uaW5nLCBwYXJ0aXRpb25lcik7Ci0JCX0KLQkJRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQodGhpcyk7Ci0JCWV2ZW50LnNldFBhcnRpdGlvbkNoYW5nZShwYXJ0aXRpb25pbmcsIDAsIGdldExlbmd0aCgpKTsKLQkJZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHsKLQkJdGhpcy5lbmNvZGluZ01lbWVudG8gPSBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0Jdm9pZCBzZXRGaXJzdERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWZpcnN0RG9jdW1lbnRSZWdpb24gPSByZWdpb247Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzZXRJbml0aWFsTGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJLy8gbWFrZSBzdXJlIG91ciBwcmVmZXJyZWQgZGVsaW1pdGVyIGlzCi0JCS8vIG9uZSBvZiB0aGUgbGVnYWwgb25lcwotCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zU3RyaW5nKGdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgZGVsaW1pdGVyKSkgewotCQkJcHJlZmVyZWREZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0RPQ1VNRU5UKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJBdHRlbXB0IHRvIHNldCBsaW5lZGVsaW1pdGVyIHRvIG5vbi1sZWdhbCBkZWxpbWl0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlwcmVmZXJlZERlbGltaXRlciA9IFBsYXRmb3JtTGluZURlbGltaXRlcjsKLQkJfQotCX0KLQotCXZvaWQgc2V0TGFzdERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWxhc3REb2N1bWVudFJlZ2lvbiA9IHJlZ2lvbjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNzZXRMaW5lRGVsaW1pdGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCXNldEluaXRpYWxMaW5lRGVsaW1pdGVyKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIuIE11c3QgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YKLQkgKiB0aGUgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHRyYWNrZXIKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCdzIGxpbmUgdHJhY2tlcgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRMaW5lVHJhY2tlcihJTGluZVRyYWNrZXIgdHJhY2tlcikgewotCQlmVHJhY2tlciA9IHRyYWNrZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyKFJlZ2lvblBhcnNlciBuZXdQYXJzZXIpIHsKLQkJaW50ZXJuYWxfc2V0UGFyc2VyKG5ld1BhcnNlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBvc2l0aW9uTWFuYWdlcgotCSAqICAgICAgICAgICAgVGhlIHBvc2l0aW9uTWFuYWdlciB0byBzZXQuCi0JICovCi0JLy8gVE9ETzogbWFrZSBwcml2YXRlIGlzIG5lZWRlZCwgZWxzZSByZW1vdmUKLQl2b2lkIHNldFBvc2l0aW9uTWFuYWdlcihHZW5lcmljUG9zaXRpb25NYW5hZ2VyIHBvc2l0aW9uTWFuYWdlcikgewotCQlmUG9zaXRpb25NYW5hZ2VyID0gcG9zaXRpb25NYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlUGFyc2VyKElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld1JlUGFyc2VyKSB7Ci0JCWZSZVBhcnNlciA9IG5ld1JlUGFyc2VyOwotCQlpZiAoZlJlUGFyc2VyICE9IG51bGwpIHsKLQkJCWZSZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpbiB0ZXJtcyBvZiB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyB0aGVTdHJpbmcpIHsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCXJlc3VsdCA9IHJlcGxhY2VUZXh0KHJlcXVlc3RlciwgMCwgZ2V0TGVuZ3RoKCksIHRoZVN0cmluZywgdHJ1ZSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHRleHQgc3RvcmUuIE11c3QgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0JICogY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHN0b3JlCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQncyB0ZXh0IHN0b3JlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRTdG9yZShJVGV4dFN0b3JlIHN0b3JlKSB7Ci0JCWZTdG9yZSA9IHN0b3JlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKSB7Ci0KLQkJLy8gaWYgdGhlIHVuZG8gbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuIHNldCwgdGhlbgotCQkvLyBmYWlsIGZhc3QsIHNpbmNlIGNoYW5naW5nIHRoZSB1bmRvIG1hbmFnZXIgd2lsbCBsZWFkCi0JCS8vIHRvIHVudXN1YWwgcmVzdWx0cyAob3IgYXQgbGVhc3QgbG9zcyBvZiB1bmRvIHN0YWNrKS4KLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsICYmIGZVbmRvTWFuYWdlciAhPSB1bmRvTWFuYWdlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjaGFuZ2UgdW5kbyBtYW5hZ2VyIG9uY2UgaXRzIGJlZW4gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWZVbmRvTWFuYWdlciA9IHVuZG9NYW5hZ2VyOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplZCkgewotCQlJVGV4dFN0b3JlIHN0b3JlID0gbmV3IFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlKGdldFN0b3JlKCkpOwotCQlzZXRUZXh0U3RvcmUoc3RvcmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCSsrZlN0b3BwZWRDb3VudDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpIHsKLQkJaWYgKGdldFN0b3JlKCkgaW5zdGFuY2VvZiBTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZSkgewotCQkJU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgc3J3cyA9IChTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZSkgZ2V0U3RvcmUoKTsKLQkJCUlUZXh0U3RvcmUgc291cmNlID0gc3J3cy5nZXRTb3VyY2VTdG9yZSgpOwotCQkJc2V0VGV4dFN0b3JlKHNvdXJjZSk7Ci0JCQlzcndzLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBhcmcwLCBpbnQgYXJnMSkgewotCQlyZXR1cm4gZ2V0KGFyZzAsIGFyZzEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVsZXRlZEZpZWxkcyhTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gZXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZ2lvbnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBvbGRSZWdpb25zLml0ZW0oaSk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uc2V0RGVsZXRlZCh0cnVlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHJlLXBhcnNlci4gTm90ZTogdGhpcyBtZXRob2QgbWF5IGJlICJwdWJsaWMiIGJ1dCBzaG91bGQgb25seQotCSAqIGJlIGNhbGxlZCBieSByZS1wYXJzZXJzIGluIHRoZSByaWdodCBjaXJjdW1zdGFuY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZURvY3VtZW50RGF0YShpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQlnZXRTdG9yZSgpLnJlcGxhY2Uoc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCXRyeSB7Ci0JCQlnZXRUcmFja2VyKCkucmVwbGFjZShzdGFydCwgbGVuZ3RoVG9SZXBsYWNlLCBjaGFuZ2VzKTsKLQkJfQotCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSBoZXJlLCBidXQgd2lsbCBsb2cgZm9yIG5vdwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAoZlBvc2l0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmUG9zaXRpb25NYW5hZ2VyLnVwZGF0ZVBvc2l0aW9ucyhuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydCwgbGVuZ3RoVG9SZXBsYWNlLCBjaGFuZ2VzKSk7Ci0JCX0KLQkJZk1vZGlmaWNhdGlvblN0YW1wKys7Ci0JCXJlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHJlUGFyc2VyID0gZ2V0UmVQYXJzZXIoKTsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgd2l0aCB0aGUgc3RhbmRhcmQgZGF0YQotCQkvLyB0aGF0J3MKLQkJLy8gYWx3YXlzIG5lZWRlZAotCQlyZVBhcnNlci5pbml0aWFsaXplKHJlcXVlc3Rlciwgc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCXJlc3VsdCA9IHJlUGFyc2VyLnJlcGFyc2UoKTsKLQkJLy8gaWYgcmVzdWx0IGlzIG51bGwgYXQgdGhpcyBwb2ludCwgdGhlbiB0aGVyZSBtdXN0IGJlIGFuIGVycm9yLCBzaW5jZQotCQkvLyBldmVuIGlmIHRoZXJlCi0JCS8vIHdhcyBubyBjaGFuZ2UgKGVpdGhlciBkaXNhbGxvdyBkdWUgdG8gcmVhZG9ubHksIG9yIGEgcGVyc29uIHBhc3RlZAotCQkvLyB0aGUgc2FtZSB0aGluZwotCQkvLyB0aGV5IGhhZCBzZWxlY3RlZCkgdGhlbiBhICJOb0NoYW5nZSIgZXZlbnQgc2hvdWxkIGhhdmUgYmVlbiBmaXJlZC4KLQkJQXNzZXJ0LmlzTm90TnVsbChyZXN1bHQsICJubyBzdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnQgd2FzIGNyZWF0ZWQgaW4gSVN0cnVjdHVyZWREb2N1bWVudDo6dXBkYXRlU3RydWN0dXJlZERvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50I2dldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMaW5lRGVsaW1pdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudCNzZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihTdHJpbmcgcHJvYmFibGVMaW5lRGVsaW1pdGVyKSB7Ci0JCXNldEluaXRpYWxMaW5lRGVsaW1pdGVyKHByb2JhYmxlTGluZURlbGltaXRlcik7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIENsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIHJld3JpdGFibGUgc2Vzc2lvbiBmb3IgdGhlIFNTRS4KLQkgKiAKLQkgKi8KLQljbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBleHRlbmRzIERvY3VtZW50UmV3cml0ZVNlc3Npb24gewotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IHNlc3Npb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gc2Vzc2lvblR5cGUKLQkJICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGlzIHNlc3Npb24KLQkJICovCi0JCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkgewotCQkJc3VwZXIoc2Vzc2lvblR5cGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjc3RhcnRSZXdyaXRlU2Vzc2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlKQotCSAqLwotCXB1YmxpYyBEb2N1bWVudFJld3JpdGVTZXNzaW9uIHN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQkvLyBkZWxlZ2F0ZSB0byBzdWItY2xhc3MsIHNvIFVJIHRocmVhZGluZyBpcyBoYW5kbGVkIGNvcnJlY3RseQotCQlyZXR1cm4gaW50ZXJuYWxTdGFydFJld3JpdGVTZXNzaW9uKHNlc3Npb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QtQVBJLiBGaW5hbCBwcm90ZWN0ZWQgc28gY2xpZW50cyBtYXkgY2FsbCB0aGlzIG1ldGhvZCBpZiBuZWVkZWQsIGJ1dAotCSAqIGNhbm5vdCBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Vzc2lvblR5cGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlpZiAoZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0JCURvY3VtZW50UmV3cml0ZVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uVHlwZSk7Ci0JCURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCBldmVudCA9IG5ldyBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQodGhpcywgc2Vzc2lvbiwgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50LlNFU1NJT05fU1RBUlQpOwotCQlmaXJlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50KGV2ZW50KTsKLQotCQlJTGluZVRyYWNrZXIgdHJhY2tlciA9IGdldFRyYWNrZXIoKTsKLQkJaWYgKHRyYWNrZXIgaW5zdGFuY2VvZiBJTGluZVRyYWNrZXJFeHRlbnNpb24pIHsKLQkJCUlMaW5lVHJhY2tlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUxpbmVUcmFja2VyRXh0ZW5zaW9uKSB0cmFja2VyOwotCQkJZXh0ZW5zaW9uLnN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JCX0KLQotCQlpZiAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuU0VRVUVOVElBTCA9PSBzZXNzaW9uVHlwZSkKLQkJCXN0YXJ0U2VxdWVudGlhbFJld3JpdGUoZmFsc2UpOwotCQllbHNlIGlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TVFJJQ1RMWV9TRVFVRU5USUFMID09IHNlc3Npb25UeXBlKQotCQkJc3RhcnRTZXF1ZW50aWFsUmV3cml0ZSh0cnVlKTsKLQotCQlmQWN0aXZlUmV3cml0ZVNlc3Npb24gPSBzZXNzaW9uOwotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJLy8gZGVsZWdhdGUgdG8gc3ViLWNsYXNzLCBzbyBVSSB0aHJlYWRpbmcgaXMgaGFuZGxlZCBjb3JyZWN0bHkKLQkJaW50ZXJuYWxTdG9wUmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JfQotCi0JLyoqCi0JICogTk9ULUFQSS4gRmluYWwgcHJvdGVjdGVkIHNvIGNsaWVudHMgbWF5IGNhbGwgdGhpcyBtZXRob2QgaWYgbmVlZGVkLCBidXQKLQkgKiBjYW5ub3Qgb3ZlcnJpZGUuCi0JICogCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGZBY3RpdmVSZXdyaXRlU2Vzc2lvbiA9PSBzZXNzaW9uKSB7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSA9IHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKTsKLQkJCWlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TRVFVRU5USUFMID09IHNlc3Npb25UeXBlIHx8IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlNUUklDVExZX1NFUVVFTlRJQUwgPT0gc2Vzc2lvblR5cGUpCi0JCQkJc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCk7Ci0KLQkJCUlMaW5lVHJhY2tlciB0cmFja2VyID0gZ2V0VHJhY2tlcigpOwotCQkJaWYgKHRyYWNrZXIgaW5zdGFuY2VvZiBJTGluZVRyYWNrZXJFeHRlbnNpb24pIHsKLQkJCQlJTGluZVRyYWNrZXJFeHRlbnNpb24gZXh0ZW5zaW9uID0gKElMaW5lVHJhY2tlckV4dGVuc2lvbikgdHJhY2tlcjsKLQkJCQlleHRlbnNpb24uc3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24sIGdldCgpKTsKLQkJCX0KLQotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCh0aGlzLCBzZXNzaW9uLCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVE9QKTsKLQkJCWZpcmVEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQoZXZlbnQpOwotCQkJZkFjdGl2ZVJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I2dldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBnZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpIHsKLQkJcmV0dXJuIGZBY3RpdmVSZXdyaXRlU2Vzc2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNhZGREb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I3JlbW92ZURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQlmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjcmVwbGFjZShpbnQsIGludCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCQlmTW9kaWZpY2F0aW9uU3RhbXAgPSBtb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzZXQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0LCBsb25nIG1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCS8vIGJ1ZyAxNTEwNjkgLSBvdmVyd3JpdGUgcmVhZCBvbmx5IHJlZ2lvbnMgd2hlbiBzZXR0aW5nIGVudGlyZSBkb2N1bWVudAotCQkgcmVwbGFjZVRleHQobnVsbCwgMCwgZ2V0TGVuZ3RoKCksIHRleHQsIHRydWUpOwotCi0JCWZNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIGZNb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhbiBldmVudCwgYXMgc3BlY2lmaWVkLCB0byB0aGUgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gZmlyZSwgZWl0aGVyIGEgc3RhcnQgb3Igc3RvcCBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudChEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzID09IG51bGwgfHwgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBsID0gKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpIGUubmV4dCgpOwotCQkJbC5kb2N1bWVudFJld3JpdGVTZXNzaW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTU1OWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUT1JFX05PVF9BU1NJR05FRCA9ICJ0ZXh0IHN0b3JlIG5vdCBhc3NpZ25lZCB5ZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOREVGSU5FRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuc3RydWN0dXJlZERvY3VtZW50LlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IF9yZWdpb25zOwotCXByaXZhdGUgYm9vbGVhbiBmSXNEZWxldGVkID0gZmFsc2U7Ci0JLy8gcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0JLyoqCi0JICogYWxsb3cgYSBwb2ludGVyIGJhY2sgdG8gdGhpcyBub2RlcyBtb2RlbAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmUGFyZW50RG9jdW1lbnQ7Ci0JLyoqCi0JICogd2FzIHRoaXMgbm9kZSB0ZXJtaW5hdGVkIG5vcm1hbGx5Ci0JICovCi0JLy8gMCA9PSBmYWxzZSwgMSA9PSB0cnVlCi0JcHJpdmF0ZSBieXRlIGhhc0VuZCA9IDA7Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0ID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgc3RhcnQ7Ci0KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCV9yZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JfQotCi0JLyoqCi0JICogRXZlbiBpbnNpZGUtdGhpcyBjbGFzcyB1c2VzIG9mICdyZWdpb25zJyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kLCBhcwotCSAqIHRoaXMgaXMgd2hlcmUgKHNvZnQpIG1lbW9yeSBtYW5hZ2VtZW50L3JlcGFyc2luZywgZXRjLiwgd2lsbCBiZQotCSAqIGNlbnRyYWxpemVkLgotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IF9nZXRSZWdpb25zKCkgewotCi0JCXJldHVybiBfcmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQlfZ2V0UmVnaW9ucygpLmFkZChhUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJc3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpIDw9IGkgJiYgaSA8IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZCBhbmQgZ2V0RW5kT2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kIGFuZCBnZXRFbmRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCkuZ2V0KDApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0UGFyZW50RG9jdW1lbnQoKS5nZXQoc3RhcnQsIGZMZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaW50IHJlZ2lvblN0YXJ0ID0gYVJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaW50IHJlZ2lvbkxlbmd0aCA9IGFSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlyZXN1bHQgPSBmUGFyZW50RG9jdW1lbnQuZ2V0KHN0YXJ0ICsgcmVnaW9uU3RhcnQsIHJlZ2lvbkxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCS8vIERNVzogbG9vcGluZyBpcyBmYXN0ZXIgdGhhbiBlbnVtZXJhdGlvbiwKLQkJLy8gc28gc3dpdGNoZWQgYXJvdW5kIDIvMTIvMDMKLQkJLy8gRW51bWVyYXRpb24gZSA9IGdldFJlZ2lvbnMoKS5lbGVtZW50cygpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBjb250ZXh0KQotCQkJCXJlc3VsdCArPSBnZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCkuZ2V0KF9nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZQYXJlbnREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgb2Zmc2V0IHJlZmVycyB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChfZ2V0UmVnaW9ucygpICE9IG51bGwpIHsKLQkJCS8vIHRyYW5zZm9ybSB0aGUgcmVxdWVzdGVkIG9mZnNldCB0byB0aGUgInNjYWxlIiB0aGF0Ci0JCQkvLyByZWdpb25zIGFyZSBzdG9yZWQgaW4sIHdoaWNoIGFyZSBhbGwgcmVsYXRpdmUgdG8gdGhlCi0JCQkvLyBzdGFydCBwb2ludC4KLQkJCS8vIGludCB0cmFuc2Zvcm1lZE9mZnNldCA9IG9mZnNldCAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkvLwotCQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWdpb24ocykgaW4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjo6Z2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQ6ICIgKyByZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlcXVlc3RlZCBvZmZzZXQ6ICIgKyBvZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIHRyYW5zZm9ybWVkT2Zmc2V0OiAiICsKLQkJCQkJLy8gdHJhbnNmb3JtZWRPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBzdGFydDogIiArIHJlZ2lvbi5nZXRTdGFydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gZW5kOiAiICsgcmVnaW9uLmdldEVuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gdHlwZTogIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBjbGFzczogIiArIHJlZ2lvbi5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmICgoZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBnZXRFbmRPZmZzZXQocmVnaW9uKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBfZ2V0UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0IGFuZCBnZXRTdGFydE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN1dHJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydCBhbmQgZ2V0U3RhcnRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdXRyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQkvLyBhc3NlcnQ6IGNvbnRhaW5lZFJlZ2lvbiBjYW4gbm90IGJlIG51bGwKLQkJLy8gKG1pZ2h0IGJlIHBlcmZvcm1hbmNlIGhpdCBpZiBsaXRlcmFsbHkgcHV0IGluIGFzc2VydCBjYWxsLAotCQkvLyBidXQgY29udGFpbmVkUmVnaW9uIGNhbiBub3QgYmUgbnVsbCkuIE5lZWRzIHRvIGJlIGNoZWNrZWQKLQkJLy8gYnkgY2FsbGluZyBjb2RlLgotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZlBhcmVudERvY3VtZW50ID09IG51bGwpIHsKLQkJCQkvLyBsaWtlbHkgdG8gaGFwcGVuIGR1cmluZyBpbnNwZWN0aW5nCi0JCQkJcmVzdWx0ID0gVEVYVF9TVE9SRV9OT1RfQVNTSUdORUQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBmUGFyZW50RG9jdW1lbnQuZ2V0KHN0YXJ0LCBmTGVuZ3RoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIGFzc2VydDogYVJlZ2lvbiBjYW4gbm90IGJlIG51bGwKLQkJLy8gKG1pZ2h0IGJlIHBlcmZvcm1hbmNlIGhpdCBpZiBsaXRlcmFsbHkgcHV0IGluIGFzc2VydCBjYWxsLAotCQkvLyBidXQgYVJlZ2lvbiBjYW4gbm90IGJlIG51bGwpLiBOZWVkcyB0byBiZSBjaGVja2VkCi0JCS8vIGJ5IGNhbGxpbmcgY29kZS4KLQkJdHJ5IHsKLQkJCXJldHVybiBmUGFyZW50RG9jdW1lbnQuZ2V0KHRoaXMuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbiksIGFSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBmaXJzdCByZWdpb24gd2l0aCB0aGUgbWF0Y2hpbmcgY29udGV4dCB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCS8vIERNVzogbG9vcGluZyBpcyBmYXN0ZXIgdGhhbiBlbnVtZXJhdGlvbiwKLQkJLy8gc28gc3dpdGNoZWQgYXJvdW5kIDIvMTIvMDMKLQkJLy8gRW51bWVyYXRpb24gZSA9IGdldFJlZ2lvbnMoKS5lbGVtZW50cygpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBjb250ZXh0KSB7Ci0JCQkJcmVzdWx0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChfZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgdHlwZSBvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC4uLiBub3QgdG8gYmUgY29uZnVzZWQKLQkgKiB3aXRoIHR5cGUgb2YgWE1MIG5vZGUhIFRoaXMgaXMgc3ViY2xhc3NlZCwgaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gdHlwZQotCSAqIG9mIGZpcnN0IHJlZ2lvbiBpcyBkZXNpcmVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IFVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHN1YnJlZ2lvbnMgPSBnZXRSZWdpb25zKCk7Ci0JCWlmIChzdWJyZWdpb25zICE9IG51bGwgJiYgc3VicmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHN1YnJlZ2lvbnMuZ2V0KDApOwotCQkJaWYgKGZpcnN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBmaXJzdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jaXNEZWxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCXJldHVybiBmSXNEZWxldGVkIHx8IChmUGFyZW50RG9jdW1lbnQgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJcmV0dXJuIChoYXNFbmQgPT0gMSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgcmVnaW9uID09IG51bGwsIHdlIHJldHVybiBmYWxzZTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBpZiB0aGUgcmVnaW9ucyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIHRoZXkgYXJlIGVxdWFsCi0JCQlpZiAodGhpcyA9PSByZWdpb24pIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgbm9uLXRyaXZpYWwgcGFydAotCQkJCS8vIG5vdGU6IHdlIGNoYW5nZSBmb3IgdHlwZSBmaXJzdCwgdGhlbiBzdGFydCBvZmZzZXQgYW5kIGVuZAotCQkJCS8vIG9mZnNldCwKLQkJCQkvLyBzaW5jZSB0aGF0IHdvdWxkIGRlY2lkZSBtYW55IGNhc2VzIHJpZ2h0IGF3YXkgYW5kIGF2b2lkIHRoZQotCQkJCS8vIHRleHQgY29tcGFyaXNvbgotCQkJCWlmIChnZXRUeXBlKCkgPT0gcmVnaW9uLmdldFR5cGUoKSkgewotCQkJCQlpZiAoc2FtZU9mZnNldHNBcyhyZWdpb24sIHNoaWZ0KSAmJiBzYW1lVGV4dEFzKHJlZ2lvbiwgc2hpZnQpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld0RvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBhbnkgcmVnaW9uIGlzIG51bGwsIHdlIHJldHVybiBmYWxzZSAoZXZlbiBpZiBib3RoIGFyZSEpCi0JCWlmICgob2xkUmVnaW9uICE9IG51bGwpICYmIChuZXdSZWdpb24gIT0gbnVsbCkpIHsKLQkJCS8vIGlmIHRoZSByZWdpb25zIGFyZSB0aGUgc2FtZSBpbnN0YW5jZSwgdGhleSBhcmUgZXF1YWwKLQkJCWlmIChvbGRSZWdpb24gPT0gbmV3UmVnaW9uKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoaXMgaXMgdGhlIG5vbi10cml2aWFsIHBhcnQKLQkJCQkvLyBub3RlOiB3ZSBjaGFuZ2UgZm9yIHR5cGUgZmlyc3QsIHRoZW4gc3RhcnQgb2Zmc2V0IGFuZCBlbmQKLQkJCQkvLyBvZmZzZXQsCi0JCQkJLy8gc2luY2UgdGhhdCB3b3VsZCBkZWNpZGUgbWFueSBjYXNlcyByaWdodCBhd2F5IGFuZCBhdm9pZCB0aGUKLQkJCQkvLyB0ZXh0IGNvbXBhcmlzb24KLQkJCQlpZiAob2xkUmVnaW9uLmdldFR5cGUoKSA9PSBuZXdSZWdpb24uZ2V0VHlwZSgpKSB7Ci0JCQkJCWlmIChzYW1lT2Zmc2V0c0FzKG9sZFJlZ2lvbiwgbmV3RG9jdW1lbnRSZWdpb24sIG5ld1JlZ2lvbiwgc2hpZnQpKSB7Ci0JCQkJCQlpZiAoc2FtZVRleHRBcyhvbGRSZWdpb24sIG5ld0RvY3VtZW50UmVnaW9uLCBuZXdSZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSAtIHNoaWZ0KSB7Ci0JCQlpZiAoZ2V0RW5kT2Zmc2V0KCkgPT0gcmVnaW9uLmdldEVuZE9mZnNldCgpIC0gc2hpZnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuZXdSZWdpb24pIC0gc2hpZnQpIHsKLQkJCWlmIChnZXRFbmRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQobmV3UmVnaW9uKSAtIHNoaWZ0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChnZXRUZXh0KCkuZXF1YWxzKHJlZ2lvbi5nZXRUZXh0KCkpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBJU1NVRTogd2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMKLQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoZ2V0VGV4dChvbGRSZWdpb24pLmVxdWFscyhkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5ld1JlZ2lvbikpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0RGVsZXRlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGlzRGVsZXRlZCkgewotCQlmSXNEZWxldGVkID0gaXNEZWxldGVkOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0hhc0VuZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gbmV3SGFzRW5kKSB7Ci0JCWlmIChuZXdIYXNFbmQpIHsKLQkJCWhhc0VuZCA9IDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQloYXNFbmQgPSAwOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJLy8gdGV4dExlbmd0aCA9IG5ld0xlbmd0aDsKLQkJZkxlbmd0aCA9IG5ld0xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQluZXh0ID0gbmV3TmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZQYXJlbnREb2N1bWVudCA9IGRvY3VtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQlwcmV2aW91cyA9IG5ld1ByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGNvbnRhaW5lZFJlZ2lvbnMpIHsKLQkJX3JlZ2lvbnMgPSBjb250YWluZWRSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQlzdGFydCA9IG5ld1N0YXJ0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQkvLyBBbHNvIG5vdGUsIHRoaXMgbWV0aG9kIGNhbiBub3QgYmUgY2hhbmdlZCwgd2l0aG91dCAiYnJlYWtpbmciCi0JCS8vIHVuaXQgdGVzdHMsIHNpbmNlIHNvbWUgb2YgdGhlbSBjb21wYXJlIGN1cnJlbnQgcmVzdWx0cyB0byBwcmV2aW91cwotCQkvLyByZXN1bHRzLgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gIlsiICsgZ2V0U3RhcnQoKSArICIsICIgKyBnZXRFbmQoKSArICJdICgiICsgZ2V0VGV4dCgpICsgIikiOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURvd25TdHJlYW1SZWdpb25zKElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIGludCBsZW5ndGhEaWZmZXJlbmNlKSB7Ci0JCWludCBsaXN0TGVuZ3RoID0gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJLy8gZmlyc3QsIGxvb3AgdGhyb3VnaCB0byBmaW5kIGluZGV4IG9mIHdoZXJlIHRvIHN0YXJ0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCWlmIChyZWdpb24gPT0gY2hhbmdlZFJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBvbmUgdGhhdCB3YXMgY2hhbmdlZCwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IHBvc3Rpb25zLgotCQlzdGFydEluZGV4Kys7Ci0JCWZvciAoaW50IGogPSBzdGFydEluZGV4OyBqIDwgbGlzdExlbmd0aDsgaisrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChqKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydChsZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJLy8gR2V0IHRoZSByZWdpb24gcG9pbnRlZCB0byBieSB0aGUgcmVxdWVzdFN0YXJ0IHBvc3Rpb24sIGFuZCBnaXZlCi0JCS8vIHRoYXQgcmVnaW9uIGEgY2hhbmNlIHRvIGVmZmVjdAotCQkvLyB0aGUgdXBkYXRlLgotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZXF1ZXN0U3RhcnQpOwotCQkvLyBpZiB0aGVyZSBpcyBubyByZWdpb24sIHRoZW4gdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIG11c3QgY29tZSByaWdodAotCQkvLyBhZnRlciB0aGUKLQkJLy8gbm9kZSAoYW5kIHJpZ2h0IGFmdGVyIHRoZSBsYXN0IHJlZ2lvbikuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsCi0JCS8vIHdoZW4gc29tZW9uZQotCQkvLyB0eXBlcyBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIG9yIG1vcmUgY29tbW9ubHksIHdoZW4KLQkJLy8gdGhleSBhcmUgcmlnaHQKLQkJLy8gYXQgdGhlIGJlZ2lubmluZyBvZiBvbmUgbm9kZSwgYW5kIHRoZSBkaXJ0eSBzdGFydCBpcyB0aGVyZWZvcmUKLQkJLy8gY2FsY3VsYXRlZCB0byBiZSB0aGUKLQkJLy8gcHJldmlvdXMgbm9kZS4KLQkJLy8gU28sIGluIHRoaXMgY2FzZSwgd2UnbGwgZ2l2ZSB0aGUgbGFzdCByZWdpb24gYSBjaGFuY2UgdG8gc2VlIGlmIGl0Ci0JCS8vIHdhbnRzIHRvCi0JCS8vIHN3YWxsb3cgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIC0tIGJ1dCBvbmx5IGZvciBpbnNlcnRzIC0tIGRlbGV0ZXMKLQkJLy8gYW5kICJyZXBsYWNlcyIKLQkJLy8gc2hvdWxkIGJlIHJlcGFyc2VkIGlmIHRoZXkgYXJlIGluIHRoZXNlIGJvcmRlciByZWdpb25zLCBhbmQgb25seSBpZgotCQkvLyB0aGUKLQkJaWYgKChyZWdpb24gPT0gbnVsbCkgJiYgKGxlbmd0aFRvUmVwbGFjZSA9PSAwKSkgewotCQkJcmVnaW9uID0gX2dldFJlZ2lvbnMoKS5nZXQoX2dldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJCS8vIG1ha2Ugc3VyZSB0aGUgcmVnaW9uIGlzIGNvbnRpZ3VvdXMKLQkJCWlmIChnZXRFbmRPZmZzZXQocmVnaW9uKSA9PSByZXF1ZXN0U3RhcnQpIHsKLQkJCQlyZXN1bHQgPSByZWdpb24udXBkYXRlUmVnaW9uKHJlcXVlc3RlciwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8KLQkJCQkvLyBJZiB0aGUgcmVxdWVzdGVkIGNoYW5nZSBzcGFucyBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgdGhlbgotCQkJCS8vIHdlIGRvbid0IGdpdmUgdGhlIHJlZ2lvbiBhIGNoYW5jZSB0byB1cGRhdGUuCi0JCQkJaWYgKChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCkpICYmIChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCArIGxlbmd0aFRvUmVwbGFjZSkpKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbi51cGRhdGVSZWdpb24ocmVxdWVzdGVyLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIHJlc3VsdCBpcyBub3QgbnVsbCwgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZAotCQkvLyBwb3N0aW9ucyBvZiB0aGUgcmVnaW9ucyB0aGF0IGZvbGxvdyB0aGlzIG9uZQotCQkvLyBpZiByZXN1bHQgaXMgbnVsbCwgdGhlbiBhcHBseSB0aGUgZmxhdG5vZGUgc3BlY2lmaWMgY2hlY2tzIG9uIHdoYXQKLQkJLy8gaXQgY2FuIGNoYW5nZQotCQkvLyAoaS5lLiBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgYnV0IG5vIGNoYW5nZSB0byB0aGUgbm9kZSBpdHNlbGYpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJLy8gVGhhdCBpcywgYSByZWdpb24gZGVjaWRlZCBpdCBjb3VsZCBoYW5kbGUgdGhlIGNoYW5nZSBhbmQKLQkJCS8vIGNyZWF0ZWQKLQkJCS8vIGEgcmVnaW9uIGNoYW5nZWQgZXZlbnQuCi0JCQlBc3NlcnQuaXNUcnVlKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCwgIlByb2dyYW0gRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMoKChSZWdpb25DaGFuZ2VkRXZlbnQpIHJlc3VsdCkuZ2V0UmVnaW9uKCksIGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gUExVUywgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG93biBub2RlIGVuZCBwb2ludCAobGVuZ3RoKQotCQkJc2V0TGVuZ3RoKGdldExlbmd0aCgpICsgbGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFmNjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9DaGFyU2VxdWVuY2VSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGNsYXNzIENoYXJTZXF1ZW5jZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRQb3NpdGlvbjsKLQlwcml2YXRlIGludCBmTWF4aW11bVJlYWRPZmZzZXQ7Ci0KLQlwcml2YXRlIENoYXJTZXF1ZW5jZSBmT3JpZ2luYWxTb3VyY2U7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIENoYXJTZXF1ZW5jZVJlYWRlcihDaGFyU2VxdWVuY2Ugb3JpZ2luYWxTb3VyY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZmFpbCBmYXN0IiBpZiByZXF1ZXN0ZWQgbGVuZ3RoIGlzIG1vcmUgdGhhbiB0aGVyZQotCQkvLyBpcz8KLQkJZk9yaWdpbmFsU291cmNlID0gb3JpZ2luYWxTb3VyY2U7Ci0JCWludCBzdGFydE9mZnNldCA9IG9mZnNldDsKLQkJaW50IG1heFJlcXVlc3RlZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotCQlpbnQgbWF4UG9zc2libGVPZmZzZXQgPSAwICsgb3JpZ2luYWxTb3VyY2UubGVuZ3RoKCk7Ci0JCWZNYXhpbXVtUmVhZE9mZnNldCA9IE1hdGgubWluKG1heFJlcXVlc3RlZE9mZnNldCwgbWF4UG9zc2libGVPZmZzZXQpOwotCi0JCWZDdXJyZW50UG9zaXRpb24gPSBzdGFydE9mZnNldDsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2NrCi0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKE9iamVjdCBsb2NrKSB7Ci0JCXN1cGVyKGxvY2spOwotCQkvLyBmb3IgdGhyZWFkIHNhZmV0eSwgbWF5IG5lZWQgdG8gYWRkIGJhY2sgbG9ja2luZyBtZWNoYW5pc20KLQkJLy8gaW4gb3VyIGN1c3RvbSBjb25zdHJ1Y3Rvci4gVGhpcyBjb25zdHJ1Y3RvciBsZWZ0IGhlcmUganVzdAotCQkvLyBmb3IgYSByZW1pbmRlci4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gd2hlbiB3ZSBjbG9zZQotCQkvLyAobWF5IGJlIHRvIGV2ZW50dWFsbHkgInVubG9jayIgb3IgbnVsbCBvdXQgc29tZSB2YXJpYmxlcwotCQkvLyBqdXN0IGZvciBoeWdlbmUuCi0JCS8vIG9yLCBwZXJoYXBzIGlmIGFscmVhZHkgY2xvc2VkIG9uY2UgdGhyb3cgSU9FeGNlcHRpb24/IGZvcgotCQkvLyBjb25zaXN0ZW5jeT8KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yaWdpbmFsU291cmNlLgotCSAqIEBkZXByZWNhdGVkIC0gb25seSB0ZW1wb3JhcmlseSBwdWJsaWMsIHNob3VsZCBiZSAnZGVmYXVsdCcgZXZlbnR1YWxseQotCSAqICAgICAgICAgICAgIG9yIGdvIGF3YXkgYWx0b2dldGhlci4KLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGdldE9yaWdpbmFsU291cmNlKCkgewotCQlyZXR1cm4gZk9yaWdpbmFsU291cmNlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCQkJcmVzdWx0ID0gZk9yaWdpbmFsU291cmNlLmNoYXJBdChmQ3VycmVudFBvc2l0aW9uKyspOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBjaGFyYWN0ZXJzIGludG8gYSBwb3J0aW9uIG9mIGFuIGFycmF5LiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrCi0JICogdW50aWwgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlCi0JICogc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogCi0JICogQHBhcmFtIGNidWYKLQkgKiAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgotCSAqIEBwYXJhbSBvZmYKLQkgKiAgICAgICAgICAgIE9mZnNldCBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIGNoYXJhY3RlcnMKLQkgKiBAcGFyYW0gbGVuCi0JICogICAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLQkgKiAgICAgICAgIGhhcyBiZWVuIHJlYWNoZWQKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotCSAqLwotCi0JcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY2hhcnNUb1JlYWQgPSAtMTsKLQkJLy8gaWYgYWxyZWFkeSBvdmVyIG1heCwganVzdCByZXR1cm4gLTEKLQkJLy8gcmVtZW1iZXIsIGN1cnJlbnRQb3NpdGlvbiBpcyB3aGF0IGlzIGdldHRpbmcgcmVhZHkgdG8gYmUgcmVhZAotCQkvLyAodGhhdCBpcywgaXRzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZCBpbiByZWFkKCkpLgotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCi0KLQkJCWludCBidWZmTWF4VG9SZWFkID0gY2J1Zi5sZW5ndGggLSBvZmY7Ci0JCQlpbnQgbWluUmVxdWVzdGVkID0gTWF0aC5taW4oYnVmZk1heFRvUmVhZCwgbGVuKTsKLQkJCWludCBsZW5ndGhSZW1haW5pbmcgPSBmTWF4aW11bVJlYWRPZmZzZXQgLSBmQ3VycmVudFBvc2l0aW9uOwotCQkJY2hhcnNUb1JlYWQgPSBNYXRoLm1pbihtaW5SZXF1ZXN0ZWQsIGxlbmd0aFJlbWFpbmluZyk7Ci0KLQotCQkJQ2hhclNlcXVlbmNlIHNlcSA9IGZPcmlnaW5hbFNvdXJjZS5zdWJTZXF1ZW5jZShmQ3VycmVudFBvc2l0aW9uLCBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQpOwotCQkJLy8gZm9yIG5vdywgaGFyZCBhc3N1bXB0aW9uIHRoYXQgb3JpZ2luYWwgaXMgYSBTdHJpbmcgc2luY2Ugc291cmNlCi0JCQkvLyBpcyBhc3N1bWVkIHRvIGJlIGRvY3VtZW50LCBvciB0ZXh0IHN0b3JlCi0JCQlTdHJpbmcgc2VxU3RyaW5nID0gKFN0cmluZykgc2VxOwotCQkJc2VxU3RyaW5nLmdldENoYXJzKDAsIHNlcVN0cmluZy5sZW5ndGgoKSwgY2J1Ziwgb2ZmKTsKLQotCi0KLQkJCWZDdXJyZW50UG9zaXRpb24gPSBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQ7Ci0KLQotCQl9Ci0JCXJldHVybiBjaGFyc1RvUmVhZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjc0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NvcmVOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ29yZU5vZGVMaXN0IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgewotCWludCBjb3VudGVkTGVuZ3RoOwotCWludCBjdXJyZW50SW5kZXggPSAtMTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBmbGF0Tm9kZXM7Ci0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkOwotCi0JLyoqCi0JICogQ29yZU5vZGVMaXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvcmVOb2RlTGlzdCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gY3JlYXRlIGFuIGFycmF5LCBldmVuIGlmIHplcm8gbGVuZ3RoCi0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uWzBdOwotCX0KLQotCXB1YmxpYyBDb3JlTm9kZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdIZWFkKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHNhdmUgaGVhZAotCQloZWFkID0gbmV3SGVhZDsKLQkJaW50IGNvdW50ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBuZXdIZWFkOwotCQkvLyB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGxpc3Qgb25jZSwgdG8gZ2V0IGl0cwotCQkvLyBsZW5ndGggaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBhcnJheQotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCWNvdW50Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCS8vIGNyZWF0ZSBhbiBhcnJheSwgZXZlbiBpZiB6ZXJvIGxlbmd0aAotCQlmbGF0Tm9kZXMgPSBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltjb3VudF07Ci0JCS8vIHN0YXJ0IGNvdW50Tm9kZSBvdmVyIGFnYWluLCBzbyB0byBzcGVhay4KLQkJY291bnROb2RlID0gbmV3SGVhZDsKLQkJY291bnQgPSAwOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCWZsYXROb2Rlc1tjb3VudCsrXSA9IGNvdW50Tm9kZTsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJY3VycmVudEluZGV4ID0gMDsKLQkJCS8vIGVsc2UgaXQgc3RheXMgYXQgLTEgaW5pdGlhbGl6ZWQgYXQgb2JqZWN0IGNyZWF0aW9uCi0JCQkvLwotCQkJLy8gc2F2ZSBsZW5ndGgKLQkJCWNvdW50ZWRMZW5ndGggPSBjb3VudDsKLQkJfQotCX0KLQotCXB1YmxpYyBDb3JlTm9kZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJLy8gc2F2ZSBoZWFkCi0JCWhlYWQgPSBzdGFydDsKLQkJaW50IGNvdW50ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBzdGFydDsKLQkJaWYgKChzdGFydCA9PSBudWxsKSB8fCAoZW5kID09IG51bGwpKSB7Ci0JCQkvLyBlcnJvciBjb25kaXRpb24KLQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBwcm92aWRlIHN0YXJ0IGFuZCBlbmQKLQkJCS8vIG5vZGVzIHRvIGNvbnN0cnVjdCBDb3JlTm9kZUxpc3QiKTsKLQkJfSBlbHNlIHsKLQkJCWNvdW50ID0gMTsKLQkJCXdoaWxlICgoY291bnROb2RlICE9IG51bGwpICYmIChjb3VudE5vZGUgIT0gZW5kKSkgewotCQkJCWNvdW50Kys7Ci0JCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBlbmRlZCBiZWNhdXNlIHRoZSBsYXN0IG9uZSB3YXMgbnVsbCwKLQkJLy8gYmFja3VwIG9uZS4KLQkJaWYgKGNvdW50Tm9kZSA9PSBudWxsKQotCQkJY291bnQtLTsKLQkJaWYgKGNvdW50IDwgMCkgewotCQkJY291bnQgPSAwOwotCQl9Ci0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW2NvdW50XTsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJZmxhdE5vZGVzWzBdID0gY291bnROb2RlID0gc3RhcnQ7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlmbGF0Tm9kZXNbaV0gPSBmbGF0Tm9kZXNbaSAtIDFdLmdldE5leHQoKTsKLQkJCX0KLQotCQl9Ci0JCWN1cnJlbnRJbmRleCA9IDA7Ci0JCWNvdW50ZWRMZW5ndGggPSBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoZmxhdE5vZGVzICE9IG51bGwpICYmIChmbGF0Tm9kZXMubGVuZ3RoID4gMCkpCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oZmxhdE5vZGVzWzBdLCBmbGF0Tm9kZXNbZmxhdE5vZGVzLmxlbmd0aCAtIDFdKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uKG51bGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZmxhdE5vZGVzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhPYmplY3QgbykgewotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhdE5vZGVzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZsYXROb2Rlc1tpXSA9PSBvKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXRlbShpbnQgaSkgewotCQlyZXR1cm4gZmxhdE5vZGVzW2ldOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9EZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0RlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGZkNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0RlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdFBvc2l0aW9uVXBkYXRlcjsKLQotLyoqCi0gKiBGb2xsb3dzIHRoZSBiZWhhdmlvciBvZiBEZWZhdWx0UG9zaXRpb25VcGRhdGVyIGV4Y2VwdCBpbiBhZGRpdGlvbiB0bwotICogZGVsZXRpbmcvb3ZlcndyaXRpbmcgdGV4dCB3aGljaCBjb21wbGV0ZWx5IGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBkZWxldGVzCi0gKiB0aGUgcG9zaXRpb24sIGRlbGV0aW5nIHRleHQgdGhhdCBlcXVhbHMgdGhlIHRleHQgaW4gcG9zaXRpb24gYWxzbyBkZWxldGVzCi0gKiB0aGUgcG9zaXRpb24uCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlciBleHRlbmRzIERlZmF1bHRQb3NpdGlvblVwZGF0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICovCi0JcHVibGljIERlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyKFN0cmluZyBjYXRlZ29yeSkgewotCQlzdXBlcihjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50bHkgaW52ZXN0aWdhdGVkIHBvc2l0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKLQkgKiBieSB0aGUgcmVwbGFjZSBvcGVyYXRpb24gc3BlY2lmaWVkIGluIHRoZSBjdXJyZW50IGV2ZW50LiBJZiBzbywgaXQKLQkgKiBkZWxldGVzIHRoZSBwb3NpdGlvbiBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBkb2N1bWVudCdzIHBvc2l0aW9uCi0JICogY2F0ZWdvcnkuCi0JICogCi0JICogTk9URTogcG9zaXRpb24gaXMgZGVsZXRlZCBpZiBjdXJyZW50IGV2ZW50IGNvbXBsZXRlbHkgb3ZlcndyaXRlcwotCSAqIHBvc2l0aW9uIE9SIGlmIGN1cnJlbnQgZXZlbnQgZGVsZXRlcyB0aGUgYXJlYSBzdXJyb3VuZGluZy9pbmNsdWRpbmcgdGhlCi0JICogcG9zaXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBvc2l0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3REZWxldGVkKCkgewotCQkvLyBwb3NpdGlvbiBpcyBkZWxldGVkIGlmIGN1cnJlbnQgZXZlbnQgY29tcGxldGVseSBvdmVyd3JpdGVzIHBvc2l0aW9uCi0JCS8vIE9SIGlmCi0JCS8vIGN1cnJlbnQgZXZlbnQgZGVsZXRlcyB0aGUgYXJlYSBzdXJyb3VuZGluZy9pbmNsdWRpbmcgdGhlIHBvc2l0aW9uCi0JCWlmICgoZk9mZnNldCA8IGZQb3NpdGlvbi5vZmZzZXQgJiYgKGZQb3NpdGlvbi5vZmZzZXQgKyBmUG9zaXRpb24ubGVuZ3RoIDwgZk9mZnNldCArIGZMZW5ndGgpKSB8fCAoZk9mZnNldCA8PSBmUG9zaXRpb24ub2Zmc2V0ICYmIChmUG9zaXRpb24ub2Zmc2V0ICsgZlBvc2l0aW9uLmxlbmd0aCA8PSBmT2Zmc2V0ICsgZkxlbmd0aCkgJiYgZlJlcGxhY2VMZW5ndGggPT0gMCkpIHsKLQotCQkJZlBvc2l0aW9uLmRlbGV0ZSgpOwotCi0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZW1vdmVQb3NpdGlvbihnZXRDYXRlZ29yeSgpLCBmUG9zaXRpb24pOwotCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB4KSB7Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODM3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZkNoYXJTZXF1ZW5jZTsKLQotCi0KLQlwcml2YXRlIE1hcCBmUG9zaXRpb25zOwotCS8qKiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCBwb3NpdGlvbiB1cGRhdGVycyAqLwotCXByaXZhdGUgTGlzdCBmUG9zaXRpb25VcGRhdGVyczsKLQotCS8qKgotCSAqIGRvbid0IGFsbG93IGluc3RhbnRpYXRpb24gd2l0aCBvdXQgZG9jdW1lbnQgcG9pbnRlcgotCSAqICAKLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBHZW5lcmljUG9zaXRpb25NYW5hZ2VyKENoYXJTZXF1ZW5jZSBjaGFyU2VxdWVuY2UpIHsKLQkJdGhpcygpOwotCQkvLyB3ZSBvbmx5IHVzZSBjaGFyU2VxdWVuY2UgZm9yICJsZW5ndGgiLCB0bwotCQkvLyBtYWRlIG1vcmUgZ2VuZXJpYyB0aGFuICJkb2N1bWVudCIgZXZlbiAidGV4dCBzdG9yZSIKLQkJZkNoYXJTZXF1ZW5jZSA9IGNoYXJTZXF1ZW5jZTsKLQkJY29tcGxldGVJbml0aWFsaXphdGlvbigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJYWRkUG9zaXRpb24oSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlksIHBvc2l0aW9uKTsKLQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCgwID4gcG9zaXRpb24ub2Zmc2V0KSB8fCAoMCA+IHBvc2l0aW9uLmxlbmd0aCkgfHwgKHBvc2l0aW9uLm9mZnNldCArIHBvc2l0aW9uLmxlbmd0aCA+IGdldERvY3VtZW50TGVuZ3RoKCkpKQotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCWxpc3QuYWRkKGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KGxpc3QsIHBvc2l0aW9uLm9mZnNldCksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjYWRkUG9zaXRpb25DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpKQotCQkJZlBvc2l0aW9ucy5wdXQoY2F0ZWdvcnksIG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uVXBkYXRlcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlpbnNlcnRQb3NpdGlvblVwZGF0ZXIodXBkYXRlciwgZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRvY3VtZW50IGxpc3RlbmVycywgcG9zaXRpb25zLCBhbmQgcG9zaXRpb24gdXBkYXRlcnMuIE11c3QKLQkgKiBiZSBjYWxsZWQgaW5zaWRlIHRoZSBjb25zdHJ1Y3RvciBhZnRlciB0aGUgaW1wbGVtZW50YXRpb24gcGx1Zy1pbnMgaGF2ZQotCSAqIGJlZW4gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKSB7Ci0KLQkJZlBvc2l0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZQb3NpdGlvblVwZGF0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWFkZFBvc2l0aW9uQ2F0ZWdvcnkoSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlkpOwotCQlhZGRQb3NpdGlvblVwZGF0ZXIobmV3IERlZmF1bHRQb3NpdGlvblVwZGF0ZXIoSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlkpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjY29tcHV0ZUluZGV4SW5DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKDAgPiBvZmZzZXQgfHwgb2Zmc2V0ID4gZ2V0RG9jdW1lbnRMZW5ndGgoKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCUxpc3QgYyA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCXJldHVybiBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChjLCBvZmZzZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluZGV4IGluIHRoZSBsaXN0IG9mIHBvc2l0aW9ucyBhdCB3aGljaCBhIHBvc2l0aW9uIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gb2Zmc2V0IHdvdWxkIGJlIGluc2VydGVkLiBUaGUgcG9zaXRpb24gaXMgc3VwcG9zZWQgdG8gYmVjb21lCi0JICogdGhlIGZpcnN0IGluIHRoaXMgbGlzdCBvZiBhbGwgcG9zaXRpb25zIHdpdGggdGhlIHNhbWUgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IGluIHdoaWNoIHRoZSBpbmRleCBpcyBjb21wdXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZm9yIHdoaWNoIHRoZSBpbmRleCBpcyBjb21wdXRlZAotCSAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIGluZGV4Ci0JICogCi0JICogQHNlZSBJRG9jdW1lbnQjY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KExpc3QgcG9zaXRpb25zLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaWYgKHBvc2l0aW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCWludCBsZWZ0ID0gMDsKLQkJaW50IHJpZ2h0ID0gcG9zaXRpb25zLnNpemUoKSAtIDE7Ci0JCWludCBtaWQgPSAwOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQotCQl3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0KLQkJCW1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLQotCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChtaWQpOwotCQkJaWYgKG9mZnNldCA8IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlpZiAobGVmdCA9PSBtaWQpCi0JCQkJCXJpZ2h0ID0gbGVmdDsKLQkJCQllbHNlCi0JCQkJCXJpZ2h0ID0gbWlkIC0gMTsKLQkJCX0gZWxzZSBpZiAob2Zmc2V0ID4gcC5nZXRPZmZzZXQoKSkgewotCQkJCWlmIChyaWdodCA9PSBtaWQpCi0JCQkJCWxlZnQgPSByaWdodDsKLQkJCQllbHNlCi0JCQkJCWxlZnQgPSBtaWQgKyAxOwotCQkJfSBlbHNlIGlmIChvZmZzZXQgPT0gcC5nZXRPZmZzZXQoKSkgewotCQkJCWxlZnQgPSByaWdodCA9IG1pZDsKLQkJCX0KLQotCQl9Ci0KLQkJaW50IHBvcyA9IGxlZnQ7Ci0JCXAgPSAoUG9zaXRpb24pIHBvc2l0aW9ucy5nZXQocG9zKTsKLQkJaWYgKG9mZnNldCA+IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCS8vIGFwcGVuZCB0byB0aGUgZW5kCi0JCQlwb3MrKzsKLQkJfSBlbHNlIHsKLQkJCS8vIGVudHJ5IHdpbGwgYmVjYW1lIHRoZSBmaXJzdCBvZiBhbGwgZW50cmllcyB3aXRoIHRoZSBzYW1lCi0JCQkvLyBvZmZzZXQKLQkJCWRvIHsKLQkJCQktLXBvczsKLQkJCQlpZiAocG9zIDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChwb3MpOwotCQkJfSB3aGlsZSAob2Zmc2V0ID09IHAuZ2V0T2Zmc2V0KCkpOwotCQkJKytwb3M7Ci0JCX0KLQotCQlBc3NlcnQuaXNUcnVlKDAgPD0gcG9zICYmIHBvcyA8PSBwb3NpdGlvbnMuc2l6ZSgpKTsKLQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaW5kZXggPSBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChsaXN0LCBvZmZzZXQpOwotCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQlQb3NpdGlvbiBwID0gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCk7Ci0JCQl3aGlsZSAocCAhPSBudWxsICYmIHAub2Zmc2V0ID09IG9mZnNldCkgewotCQkJCWlmIChwLmxlbmd0aCA9PSBsZW5ndGgpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCSsraW5kZXg7Ci0JCQkJcCA9IChpbmRleCA8IHNpemUpID8gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCkgOiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmIChjYXRlZ29yeSAhPSBudWxsKQotCQkJcmV0dXJuIGZQb3NpdGlvbnMuY29udGFpbnNLZXkoY2F0ZWdvcnkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmQ2hhclNlcXVlbmNlLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHBvc2l0aW9ucyBtYW5hZ2VkIGJ5IHRoZSBkb2N1bWVudCBncm91cGVkIGJ5IGNhdGVnb3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgcG9zaXRpb25zCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXREb2N1bWVudE1hbmFnZWRQb3NpdGlvbnMoKSB7Ci0JCXJldHVybiBmUG9zaXRpb25zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKSB7Ci0JCVN0cmluZ1tdIGNhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW2ZQb3NpdGlvbnMuc2l6ZSgpXTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZQb3NpdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKQotCQkJY2F0ZWdvcmllc1tpXSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQotCXB1YmxpYyBQb3NpdGlvbltdIGdldFBvc2l0aW9ucyhTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBuZXcgUG9zaXRpb25bYy5zaXplKCldOwotCQljLnRvQXJyYXkocG9zaXRpb25zKTsKLQkJcmV0dXJuIHBvc2l0aW9uczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycygpCi0JICovCi0JcHVibGljIElQb3NpdGlvblVwZGF0ZXJbXSBnZXRQb3NpdGlvblVwZGF0ZXJzKCkgewotCQlJUG9zaXRpb25VcGRhdGVyW10gdXBkYXRlcnMgPSBuZXcgSVBvc2l0aW9uVXBkYXRlcltmUG9zaXRpb25VcGRhdGVycy5zaXplKCldOwotCQlmUG9zaXRpb25VcGRhdGVycy50b0FycmF5KHVwZGF0ZXJzKTsKLQkJcmV0dXJuIHVwZGF0ZXJzOwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjaW5zZXJ0UG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyLCBpbnQgaW5kZXgpIHsKLQotCQlmb3IgKGludCBpID0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChmUG9zaXRpb25VcGRhdGVycy5nZXQoaSkgPT0gdXBkYXRlcikKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaW5kZXggPT0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpKQotCQkJZlBvc2l0aW9uVXBkYXRlcnMuYWRkKHVwZGF0ZXIpOwotCQllbHNlCi0JCQlmUG9zaXRpb25VcGRhdGVycy5hZGQoaW5kZXgsIHVwZGF0ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVQb3NpdGlvbihJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSwgcG9zaXRpb24pOwotCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHBvc2l0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCUxpc3QgYyA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCS8vIHJlbW92ZSBiYXNlZCBvbiBpZGVudGl0eSBub3QgZXF1YWxpdHkKLQkJaW50IHNpemUgPSBjLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwb3NpdGlvbiA9PSBjLmdldChpKSkgewotCQkJCWMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbkNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSkpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCWZQb3NpdGlvbnMucmVtb3ZlKGNhdGVnb3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWZvciAoaW50IGkgPSBmUG9zaXRpb25VcGRhdGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGZQb3NpdGlvblVwZGF0ZXJzLmdldChpKSA9PSB1cGRhdGVyKSB7Ci0JCQkJZlBvc2l0aW9uVXBkYXRlcnMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyBhbGwgcG9zaXRpb25zIG9mIGFsbCBjYXRlZ29yaWVzIHRvIHRoZSBjaGFuZ2UgZGVzY3JpYmVkIGJ5IHRoZQotCSAqIGRvY3VtZW50IGV2ZW50LiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCB1cGRhdGVycyBhcmUgY2FsbGVkIGluIHRoZQotCSAqIHNlcXVlbmNlIHRoZXkgaGF2ZSBiZWVuIGFycmFuZ2VkLiBVc2VzIGEgcm9idXN0IGl0ZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGV2ZW50IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB0byB3aGljaCB0byBhZGFwdAotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBvc2l0aW9ucyhEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZlBvc2l0aW9uVXBkYXRlcnMpOwotCQlJdGVyYXRvciBlID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlQb3NpdGlvblVwZGF0ZXIgdSA9IChJUG9zaXRpb25VcGRhdGVyKSBlLm5leHQoKTsKLQkJCXUudXBkYXRlKGV2ZW50KTsKLQkJfQotCX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmViNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklFeGVjdXRpb25EZWxlZ2F0ZTsKLQotcHVibGljIGludGVyZmFjZSBJRXhlY3V0aW9uRGVsZWdhdGFibGUgewotCi0Jdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzMDQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZ2lvbkNvbXBhcmlibGUgewotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKTsKLQotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhhYWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSUV4ZWN1dGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudCBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGltcGxlbWVudHMgSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLCBJTG9ja2FibGUgewotCi0JcHJpdmF0ZSBJRXhlY3V0aW9uRGVsZWdhdGUgZkV4ZWN1dGlvbkRlbGVnYXRlOwotCXByaXZhdGUgSUxvY2sgZkxvY2thYmxlID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQotCXB1YmxpYyBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQlzdXBlcihwYXJzZXIpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWNxdWlyZUxvY2soKSB7Ci0JCWdldExvY2tPYmplY3QoKS5hY3F1aXJlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJRXhlY3V0aW9uRGVsZWdhdGUgZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKSB7Ci0JCXJldHVybiBmRXhlY3V0aW9uRGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUxvY2thYmxlI2dldExvY2soKQotCSAqLwotCi0JcHVibGljIElMb2NrIGdldExvY2tPYmplY3QoKSB7Ci0JCXJldHVybiBmTG9ja2FibGU7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWxlYXNlTG9jaygpIHsKLQkJZ2V0TG9ja09iamVjdCgpLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjcmVwbGFjZVRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChmaW5hbCBPYmplY3QgcmVxdWVzdGVyLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCByZXBsYWNlbWVudExlbmd0aCwgZmluYWwgU3RyaW5nIGNoYW5nZXMsIGZpbmFsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCA9IG51bGw7Ci0JCWlmIChnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpID09IG51bGwpIHsKLQkJCS8vIGlmIHRoZSBkZWxlZ2F0ZSBoYXMgbm90IGJlZW4gc2V0LCB3ZSBleGVjdXRlIG9uIGN1cnJlbnQKLQkJCS8vIHRocmVhZCwgbGlrZSAibm9ybWFsIi4gVGhpcyBpcyB0aGUgY2FzZSBmb3Igbm9ybWFsCi0JCQkvLyBub24tZWRpdG9yCi0JCQkvLyB1c2UgKHdoaWNoIHNob3VsZCBzdGlsbCwgdWx0aW1hdGVseSwgYmUgcHJvdGVjdGVkIGJ5Ci0JCQkvLyBhIHNjaGVkdWxpbmcgcnVsZSkuCi0JCQlldmVudCA9IHN1cGVyLnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzLCBpZ25vcmVSZWFkT25seVNldHRpbmdzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIElmIGRvY3VtZW50IGlzIGJlaW5nIHVzZWQgYnkgYW4gZWRpdG9yLCBhIHJ1bm5hYmxlIGlzCi0JCQkvLyBjcmVhdGVkLAotCQkJLy8gZXZlbiBpZiBsYXRlciAoaW4gdGhlIGV4ZWN1dGlvbiBkZWxlZ2F0ZSBpbnN0YW5jZSkgaXQgaXMKLQkJCS8vIGRlY2lkZWQKLQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgKHRoYXQgaXMsIGluIGZhY3QgYmVpbmcgY2FsbGVkCi0JCQkvLyBmcm9tCi0JCQkvLyBlZGl0b3IncyBkaXNwbGF5IHRocmVhZCwgaW4gd2hpY2ggY2FzZSBpdHMganVzdCBleGVjdXRlZCkKLQkJCWZpbmFsIE9iamVjdFtdIHJlc3VsdFNsb3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuc3VwZXIucmVwbGFjZVRleHQocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJLy8gc3Ryb25nbHkgYXNzdW1lcyBzeW5jaHJvbm91cyBjYWxsLCB0byAid2FpdCIgZm9yCi0JCQkvLyByZXN1bHRzCi0JCQkvLyBiYXNpY2FsbHkganVzdCByb3V0ZXMgdG8gRGlzcGxheS5zeW5jaEV4ZWMocnVubmFibGUpLAotCQkJLy8gaWYgbm90IGFscmVhZHkgcnVubmluZyBvbiBkaXNwbGF5IHRocmVhZC4KLQkJCWdldEV4ZWN1dGlvbkRlbGVnYXRlKCkuZXhlY3V0ZShydW5uYWJsZSk7Ci0KLQkJCS8vIHRoaXMgcmVtZW1iZXJpbmcgYW5kIHJlLXRocm93aW5nIG9mIGV4Y2VwdGlvbiBpcyBqdXN0IHRvCi0JCQkvLyBnZXQgYW4KLQkJCS8vIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIG9uIG9uZSB0aHJlYWQsIHRvIGJlIHRocm93biBvbgotCQkJLy8gY2FsbGVycwotCQkJLy8gdGhyZWFkLgotCQkJaWYgKHJlc3VsdFNsb3RbMF0gaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoVGhyb3dhYmxlKSByZXN1bHRTbG90WzBdKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJZkV4ZWN1dGlvbkRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChmaW5hbCBPYmplY3QgcmVxdWVzdGVyLCBmaW5hbCBTdHJpbmcgdGhlU3RyaW5nKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJaWYgKGdldEV4ZWN1dGlvbkRlbGVnYXRlKCkgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCWV2ZW50ID0gc3VwZXIuc2V0VGV4dChyZXF1ZXN0ZXIsIHRoZVN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJZiBkb2N1bWVudCBpcyBiZWluZyB1c2VkIGJ5IGFuIGVkaXRvciwgYSBydW5uYWJsZSBpcwotCQkJLy8gY3JlYXRlZCwKLQkJCS8vIGV2ZW4gaWYgbGF0ZXIgKGluIHRoZSBleGVjdXRpb24gZGVsZWdhdGUgaW5zdGFuY2UpIGl0IGlzCi0JCQkvLyBkZWNpZGVkCi0JCQkvLyBub3RoaW5nIHNwZWNpYWwgaXMgbmVlZGVkICh0aGF0IGlzLCBpbiBmYWN0IGJlaW5nIGNhbGxlZAotCQkJLy8gZnJvbQotCQkJLy8gZWRpdG9yJ3MgZGlzcGxheSB0aHJlYWQsIGluIHdoaWNoIGNhc2UgaXRzIGp1c3QgZXhlY3V0ZWQpCi0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnNldFRleHQocmVxdWVzdGVyLCB0aGVTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJLy8gc3Ryb25nbHkgYXNzdW1lcyBzeW5jaHJvbm91cyBjYWxsLCB0byAid2FpdCIgZm9yCi0JCQkvLyByZXN1bHRzCi0JCQkvLyBiYXNpY2FsbHkganVzdCByb3V0ZXMgdG8gRGlzcGxheS5zeW5jaEV4ZWMocnVubmFibGUpLAotCQkJLy8gaWYgbm90IGFscmVhZHkgcnVubmluZyBvbiBkaXNwbGF5IHRocmVhZC4KLQkJCWdldEV4ZWN1dGlvbkRlbGVnYXRlKCkuZXhlY3V0ZShydW5uYWJsZSk7Ci0KLQkJCS8vIHRoaXMgcmVtZW1iZXJpbmcgYW5kIHJlLXRocm93aW5nIG9mIGV4Y2VwdGlvbiBpcyBqdXN0IHRvCi0JCQkvLyBnZXQgYW4KLQkJCS8vIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIG9uIG9uZSB0aHJlYWQsIHRvIGJlIHRocm93biBvbgotCQkJLy8gY2FsbGVycwotCQkJLy8gdGhyZWFkLgotCQkJaWYgKHJlc3VsdFNsb3RbMF0gaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoVGhyb3dhYmxlKSByZXN1bHRTbG90WzBdKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHNlc3Npb25UeXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKLQkJaWYgKGdldEV4ZWN1dGlvbkRlbGVnYXRlKCkgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCXNlc3Npb24gPSBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvblR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSWYgZG9jdW1lbnQgaXMgYmVpbmcgdXNlZCBieSBhbiBlZGl0b3IsIGEgcnVubmFibGUgaXMKLQkJCS8vIGNyZWF0ZWQsCi0JCQkvLyBldmVuIGlmIGxhdGVyIChpbiB0aGUgZXhlY3V0aW9uIGRlbGVnYXRlIGluc3RhbmNlKSBpdCBpcwotCQkJLy8gZGVjaWRlZAotCQkJLy8gbm90aGluZyBzcGVjaWFsIGlzIG5lZWRlZCAodGhhdCBpcywgaW4gZmFjdCBiZWluZyBjYWxsZWQKLQkJCS8vIGZyb20KLQkJCS8vIGVkaXRvcidzIGRpc3BsYXkgdGhyZWFkLCBpbiB3aGljaCBjYXNlIGl0cyBqdXN0IGV4ZWN1dGVkKQotCQkJZmluYWwgT2JqZWN0W10gcmVzdWx0U2xvdCA9IG5ldyBPYmplY3RbMV07Ci0JCQlmaW5hbCBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBmaW5hbFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gaW50ZXJuYWxTdGFydFJld3JpdGVTZXNzaW9uKGZpbmFsU2Vzc2lvblR5cGUpOwotCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gZTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkvLyBzdHJvbmdseSBhc3N1bWVzIHN5bmNocm9ub3VzIGNhbGwsIHRvICJ3YWl0IiBmb3IKLQkJCS8vIHJlc3VsdHMKLQkJCS8vIGJhc2ljYWxseSBqdXN0IHJvdXRlcyB0byBEaXNwbGF5LnN5bmNoRXhlYyhydW5uYWJsZSksCi0JCQkvLyBpZiBub3QgYWxyZWFkeSBydW5uaW5nIG9uIGRpc3BsYXkgdGhyZWFkLgotCQkJZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKS5leGVjdXRlKHJ1bm5hYmxlKTsKLQotCQkJLy8gdGhpcyByZW1lbWJlcmluZyBhbmQgcmUtdGhyb3dpbmcgb2YgZXhjZXB0aW9uIGlzIGp1c3QgdG8KLQkJCS8vIGdldCBhbgotCQkJLy8gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgb24gb25lIHRocmVhZCwgdG8gYmUgdGhyb3duIG9uCi0JCQkvLyBjYWxsZXJzCi0JCQkvLyB0aHJlYWQuCi0JCQlpZiAocmVzdWx0U2xvdFswXSBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKChUaHJvd2FibGUpIHJlc3VsdFNsb3RbMF0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2Vzc2lvbiA9IChEb2N1bWVudFJld3JpdGVTZXNzaW9uKSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGdldEV4ZWN1dGlvbkRlbGVnYXRlKCkgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCWludGVybmFsU3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSWYgZG9jdW1lbnQgaXMgYmVpbmcgdXNlZCBieSBhbiBlZGl0b3IsIGEgcnVubmFibGUgaXMKLQkJCS8vIGNyZWF0ZWQsCi0JCQkvLyBldmVuIGlmIGxhdGVyIChpbiB0aGUgZXhlY3V0aW9uIGRlbGVnYXRlIGluc3RhbmNlKSBpdCBpcwotCQkJLy8gZGVjaWRlZAotCQkJLy8gbm90aGluZyBzcGVjaWFsIGlzIG5lZWRlZCAodGhhdCBpcywgaW4gZmFjdCBiZWluZyBjYWxsZWQKLQkJCS8vIGZyb20KLQkJCS8vIGVkaXRvcidzIGRpc3BsYXkgdGhyZWFkLCBpbiB3aGljaCBjYXNlIGl0cyBqdXN0IGV4ZWN1dGVkKQotCQkJZmluYWwgT2JqZWN0W10gcmVzdWx0U2xvdCA9IG5ldyBPYmplY3RbMV07Ci0JCQlmaW5hbCBEb2N1bWVudFJld3JpdGVTZXNzaW9uIGZpbmFsU2Vzc2lvbiA9IHNlc3Npb247Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihmaW5hbFNlc3Npb24pOwotCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gZTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkvLyBzdHJvbmdseSBhc3N1bWVzIHN5bmNocm9ub3VzIGNhbGwsIHRvICJ3YWl0IiBmb3IKLQkJCS8vIHJlc3VsdHMKLQkJCS8vIGJhc2ljYWxseSBqdXN0IHJvdXRlcyB0byBEaXNwbGF5LnN5bmNoRXhlYyhydW5uYWJsZSksCi0JCQkvLyBpZiBub3QgYWxyZWFkeSBydW5uaW5nIG9uIGRpc3BsYXkgdGhyZWFkLgotCQkJZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKS5leGVjdXRlKHJ1bm5hYmxlKTsKLQotCQkJLy8gdGhpcyByZW1lbWJlcmluZyBhbmQgcmUtdGhyb3dpbmcgb2YgZXhjZXB0aW9uIGlzIGp1c3QgdG8KLQkJCS8vIGdldCBhbgotCQkJLy8gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgb24gb25lIHRocmVhZCwgdG8gYmUgdGhyb3duIG9uCi0JCQkvLyBjYWxsZXJzCi0JCQkvLyB0aHJlYWQuCi0JCQlpZiAocmVzdWx0U2xvdFswXSBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKChUaHJvd2FibGUpIHJlc3VsdFNsb3RbMF0pOwotCQkJfQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkNjNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvTWluaW1hbERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotCi0KLS8qKgotICogUHVyZWx5IGEgZHVtbXkgIm1hcmtlciIgaW5zdGFuY2UgZm9yIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgd2hpY2ggYXJlCi0gKiBjcmVhdGVkIHRlbW9yYXJpbHkgaW4gdGhlIGNvdXJzZSBvZiByZS1wYXJzaW5nLiBQcmltYXJpbHkgYSBwbGFjZSBob2xkZXIsCi0gKiBidXQgY2FuIGJlIG5lZWRlZCB0byBnZXQgdGV4dCBmcm9tLgotICovCi1wdWJsaWMgY2xhc3MgTWluaW1hbERvY3VtZW50IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudCB7Ci0JcHJpdmF0ZSBTdWJTZXRUZXh0U3RvcmUgZGF0YTsKLQotCS8qKgotCSAqIE1hcmtlZCBwcml2YXRlIHRvIGJlIHN1cmUgbmV2ZXIgY3JlYXRlZCB3aXRob3V0IGRhdGEgYmVpbmcgaW5pdGlhbGl6ZWQuCi0JICogIAotCSAqLwotCXByaXZhdGUgTWluaW1hbERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNaW5pbWFsRG9jdW1lbnQoU3ViU2V0VGV4dFN0b3JlIGluaXRpYWxDb250ZW50cykgewotCQl0aGlzKCk7Ci0JCWRhdGEgPSBpbml0aWFsQ29udGVudHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgZG9jdW1lbnRBZGFwdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgY2FsbGVkIGZyb20gbm90aWZpZXIgbG9vcCBpbmFwcHJvcHJpYXRlbHkKLQkJLy8JdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgY29tcHV0ZU51bWJlck9mTGluZXMoU3RyaW5nIHRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlTmV3RG9jdW1lbnQoT2JqZWN0IHJlcXVlc3RlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGRhdGEuZ2V0KDAsIGRhdGEuZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGF0YS5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZGF0YS5nZXQob2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQkvLyB0ZW1wIGZpeAotCQlyZXR1cm4gbnVsbDsKLQkJLy8JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsTGluZURlbGltaXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZGF0YS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcmVkTGluZURlbGltaXRlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb24oaW50IGxpbmUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aChpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQW4gaW5zdGFuY2Ugb2YgTWluaW1hbERvY3VtZW50IHdhcyBhc2tlZCBmb3IgaXRzIHBhcnRpdGlvbiwgc29tZXRpbWUgaW5kaWNhdGluZyBhIGRlbGV0ZWQgcmVnaW9uIHdhcyBiZWluZyBhY2Nlc3NlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFR5cGVkUmVnaW9uKDAsMCwgInVuZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0UG9zaXRpb25zKFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBvc2l0aW9uVXBkYXRlcltdIGdldFBvc2l0aW9uVXBkYXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZGF0YS5nZXQoMCwgZGF0YS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I2dldFVuZG9NYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIsIGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgY2FsbGVkIGZyb20gbm90aWZpZXIgbG9vcCBpbmFwcHJvcHJpYXRlbHkKLQkJLy8JdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3JlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2Uob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UoSURvY3VtZW50TGlzdGVuZXIgb3duZXIsIElSZXBsYWNlIHJlcGxhY2UpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCWRhdGEucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNyZXBsYWNlVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZykgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBzZWFyY2goaW50IHN0YXJ0T2Zmc2V0LCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vCQlkYXRhLnNldCh0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgYWxsVGV4dCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjc2V0VW5kb01hbmFnZXIob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0YXJ0U2VxdWVudGlhbFJld3JpdGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wU2VxdWVudGlhbFJld3JpdGUoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljN2I1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5GaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjZW50cmFsaXplZCBwbGFjZSB0byBwdXQgInJlcGFyc2luZyIgbG9naWMuIFRoaXMgaXMKLSAqIHRoZSBsb2dpYyB0aGF0IHJlcGFyc2VzIHRoZSB0ZXh0IGluY3JlbWVudGFsbHksIGFzIGEgdXNlciB0eXBlcyBpbiBuZXcKLSAqIGNoYXJhY3RlcnMsIG9yIERPTSBub2RlcyBhcmUgaW5zZXJ0ZWQgb3IgZGVsZXRlZC4gTm90ZTogaXQgaXMgbm90IGEgdGhyZWFkCi0gKiBzYWZlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQgPSBudWxsOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIGRvdWJsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcIid9KTsKLQlwcm90ZWN0ZWQgZmluYWwgQ29yZU5vZGVMaXN0IEVNUFRZX0xJU1QgPSBuZXcgQ29yZU5vZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmQ2hhbmdlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZEZWxldGVkVGV4dDsKLQotCXByaXZhdGUgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGhEaWZmZXJlbmNlOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aFRvUmVwbGFjZTsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZSZXF1ZXN0ZXI7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0JLy8gbm90ZTogdGhpcyBpcyB0aGUgaW1wbCBjbGFzcyBvZiBJU3RydWN0dXJlZERvY3VtZW50LCBub3QgdGhlIGludGVyZmFjZQotCS8vIEZVVFVSRV9UT19ETzogSSBiZWxpZXZlIHNvbWUgb2YgdGhlc2UgY2FuIGJlIG1hZGUgcHJpdmF0ZSBub3cuPwotCXByb3RlY3RlZCBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCi0JLyoqCi0JICogdmFyaWFibGUgdXNlZCBpbiBhbnRpY2lhcGF0aW9uIG9mIG11bHRpdGhyZWFkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJzaW5nOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIHNpbmdsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcJyd9KTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NoZWNrQmxvY2tOb2RlTGlzdChMaXN0IGJsb2NrVGFnTGlzdCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoYmxvY2tUYWdMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tUYWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXIgYmxvY2tUYWcgPSAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXIpIGJsb2NrVGFnTGlzdC5nZXQoaSk7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBibG9ja1RhZy5nZXRUYWdOYW1lKCk7Ci0JCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbE5hbWUoIjwiICsgdGFnTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxOYW1lKCI8LyIgKyB0YWdOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdXRpbGl0eSBmb3IgY2hlY2tpbmcgZm9yIGNyaXRpY2FsIHdvcmQgc3VjaCBhcyAiIDxTQ1JJUFQ+IgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NoZWNrRm9yQ3JpdGljYWxXb3JkKFN0cmluZyBjcml0aWNhbFRhcmdldCwgYm9vbGVhbiBjaGVja0VuZCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgZG9jdW1lbnRMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQlpbnQgcHJvcExlbiA9IGZMZW5ndGhUb1JlcGxhY2U7Ci0JCWlmIChwcm9wTGVuID4gZG9jdW1lbnRMZW5ndGgpCi0JCQlwcm9wTGVuID0gZG9jdW1lbnRMZW5ndGg7Ci0JCWludCBzdGFydE5laWdoYm9yaG9vZCA9IGZTdGFydCAtIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQlpbnQgYWRqdXN0SW5zZXJ0ID0gMDsKLQkJaWYgKHN0YXJ0TmVpZ2hib3Job29kIDwgMCkgewotCQkJYWRqdXN0SW5zZXJ0ID0gMCAtIHN0YXJ0TmVpZ2hib3Job29kOwotCQkJc3RhcnROZWlnaGJvcmhvb2QgPSAwOwotCQl9Ci0JCWludCBlbmROZWlnaGJvcmhvb2QgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlICsgY3JpdGljYWxUYXJnZXQubGVuZ3RoKCkgLSAxOwotCQlpZiAoZW5kTmVpZ2hib3Job29kID4gZG9jdW1lbnRMZW5ndGgpCi0JCQllbmROZWlnaGJvcmhvb2QgPSBkb2N1bWVudExlbmd0aCAtIDE7Ci0JCWludCBvbGRsZW4gPSBlbmROZWlnaGJvcmhvb2QgLSBzdGFydE5laWdoYm9yaG9vZDsgLy8gKyAxOwotCQlpZiAob2xkbGVuICsgc3RhcnROZWlnaGJvcmhvb2QgPiBkb2N1bWVudExlbmd0aCkgewotCQkJb2xkbGVuID0gZG9jdW1lbnRMZW5ndGggLSBzdGFydE5laWdoYm9yaG9vZDsKLQkJfQotCQlTdHJpbmcgb2xkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0TmVpZ2hib3Job29kLCBvbGRsZW4pOwotCQlTdHJpbmcgcGVlayA9IFN0cmluZ1V0aWxzLnBhc3RlKG9sZFRleHQsIGZDaGFuZ2VzLCBjcml0aWNhbFRhcmdldC5sZW5ndGgoKSAtIGFkanVzdEluc2VydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gaXNDcml0aWNhbFN0cmluZyA9IGNoZWNrVGFnTmFtZXMob2xkVGV4dCwgY3JpdGljYWxUYXJnZXQsIGNoZWNrRW5kKTsKLQkJYm9vbGVhbiB0b0JlQ3JpdGljYWxTdHJpbmcgPSBjaGVja1RhZ05hbWVzKHBlZWssIGNyaXRpY2FsVGFyZ2V0LCBjaGVja0VuZCk7Ci0JCWlmICgoaXNDcml0aWNhbFN0cmluZyAhPSB0b0JlQ3JpdGljYWxTdHJpbmcpIHx8IC8vIE9SIGlmIGJvdGggYXJlCi0JCQkJCS8vIGNyaXRpY2FsIGFuZCB0aGVyZSdzCi0JCQkJCS8vIGEgY2hhbmdlIGluIHRoZSBlbmQKLQkJCQkJLy8gdGFnICgnPicpCi0JCQkJCSgoaXNDcml0aWNhbFN0cmluZyAmJiB0b0JlQ3JpdGljYWxTdHJpbmcpICYmIChjaGFuZ2VJbklzRW5kZWRTdGF0ZShvbGRUZXh0LCBwZWVrKSkpKSB7Ci0JCQkvLyBpZiBpdCBpbnZvbHZlcyBhIGNoYW5nZSBvZiBhIGNyaXRpY2FsIHN0cmluZyAobWFraW5nIG9uZSB3aGVyZQotCQkJLy8gdGhlcmUgd2Fzbid0LCBvciByZW1vdmluZwotCQkJLy8gb25lIHdoZXJlIHRoZXJlIHdhcyBvbmUpIHRoZW4gcmVwYXJzZSBldmVydGhpbmcuCi0JCQlyZXN1bHQgPSByZXBhcnNlKDAsIGRvY3VtZW50TGVuZ3RoIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBfY29tcHV0ZVN0YXJ0T2ZEaWZmZXJlbmNlcyhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlpbnQgc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCWludCBuZXdOb2Rlc0xlbmd0aCA9IG5ld05vZGVzLmdldExlbmd0aCgpOwotCQlib29sZWFuIGZvdW5kRGlmZmVyZW5jZSA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJLy8gd2UnbGwgY29udHJvbCBvdXIgbG9vcCBiYXNlZCBvbiB0aGUgb2xkIExpc3QgbGVuZ3RoCi0JCWludCBvbGROb2Rlc0xlbmd0aCA9IG9sZE5vZGVzLmdldExlbmd0aCgpOwotCQkvLyBiZSBzdXJlIHRvIGNoZWNrICdkb25lJyBmaXJzdCwgc28gc3RhcnRPZkRpZmZlcmVuY2VzIGlzbid0Ci0JCS8vIGljcmVtZW50ZWQgaWYgZG9uZSBpcyB0cnVlCi0JCWRvbmUgOiB3aGlsZSAoKCFkb25lKSAmJiAoKytzdGFydE9mRGlmZmVyZW5jZXMgPCBvbGROb2Rlc0xlbmd0aCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSA9IG9sZE5vZGVzLml0ZW0oc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCS8vIHRoaXMgbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbiBpcyB0byBjaGVjayB0byBiZSBzdXJlIHRoZSBub2RlIGlzCi0JCQkvLyBpbmZhY3QgYSBjYW5kaWRhdGUKLQkJCS8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgIm9sZCIuIFRoaXMgY2hlY2sgaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZQotCQkJLy8gd2hlcmUgc29tZQotCQkJLy8gdGV4dCBpcyByZXBsYWNlaW5nIHRleHQgdGhhdAotCQkJLy8gYXBwZWFycyBpZGVudGljYWwsIGJ1dCBpcyBhIGRpZmZlcmVudCBpbnN0YW5jZS4gRm9yIGV4YW1wbGUsIGlmCi0JCQkvLyB0aGUgdGV4dAotCQkJLy8gaXMgPFA+PEI+PC9CPjwvUD4gYW5kIDxCPjwvQj4gaXMgaW5zZXJ0ZWQgYXQgcG9zdGlvbiAzLAotCQkJLy8gcmVzdWx0aW5nIGluIDxQPjxCPjwvQj48Qj48L0I+PC9QPgotCQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlCi0JCQkvLyBmaXJzdCA8Qj4gdG8gYmUgY29uc2lkZXJlZCBvbGQgLi4uIGl0IGlzIHRoZSBuZXcgb25lLCB0aGUKLQkJCS8vIHNlY29uZAotCQkJLy8gPEI+IGlzIHRoZSBvbGQgb25lLgotCQkJaWYgKF9sZXNzVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGUpKSB7Ci0JCQkJLy8gYmUgc3VyZSB0byBjaGVjayB0aGF0IHdlIGhhdmUgbmV3IG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdC4KLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gbmV3Tm9kZXNMZW5ndGgpIHsKLQkJCQkJZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCWRvbmUgPSB0cnVlOwotCQkJCQljb250aW51ZSBkb25lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCi0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG5ld05vZGVzLml0ZW0oc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCQkJLy8gbm90ZTogc2hpZnQgaXMgMCB3aGlsZSBhdCBiZWdpbm5pbmcgb2YgbGlzdCwgYmVmb3JlIHRoZQotCQkJCQkvLyBpbnNlcnRpb24gKG9yIGRlbGV0aW9uKSBwb2ludC4gQWZ0ZXIgdGhhdCwgaXQgaXMKLQkJCQkJLy8gZlN0YXJ0K2ZMZW5ndGhEaWZmZXJlbmNlCi0JCQkJCWlmICghKG9sZE5vZGUuc2FtZUFzKG5ld05vZGUsIDApKSkgewotCQkJCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJY29udGludWUgZG9uZTsKLQkJCQkJfSBlbHNlIHsgLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZQotCQkJCQkJLy8gb2xkIG9uZSwgc28KLQkJCQkJCS8vIHdlIG5lZWQgdG8gYmUgc3VyZSBpdHMgcGFyZW50RG9jdW1lbnQgaXMgc2V0IGJhY2sKLQkJCQkJCS8vIHRvCi0JCQkJCQkvLyB0aGUgcmlnaHQgaW5zdGFuY2UKLQkJCQkJCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGRpZG4ndCBsaXRlcmFsbHkgZmluZCBhIGRpZmZlcmVuY2UsIGJ1dCB3ZSBjb3VudCBpdCBhcwotCQkJCS8vIHN1Y2ggYnkgaW1wbGljYXRpb24KLQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgbGl0ZXJhbGx5IGZvdW5kIGEgZGlmZmVyZW5jZSwgdGhlbiBhbGwgaXMgb2sgYW5kIHdlIGNhbgotCQkvLyByZXR1cm4KLQkJLy8gaXQuCi0JCS8vIGlmIHdlIGRpZCBub3QgbGl0ZXJhbGx5IGZpbmQgb25lLCB0aGVuIHdlIGhhdmUgdG8gZGVjaWRlIHdoeS4KLQkJaWYgKCFmb3VuZERpZmZlcmVuY2UpIHsKLQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA9PSBvbGROb2Rlc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCS8vIGlkZW50aWNhbAotCQkJCS8vIChhbmQgbWF5IGJlIG9mIHplcm8KLQkJCQkvLyBsZW5ndGgpCi0JCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA+IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCS8vIGlkZW50aWNhbCBleGNlcHQgZm9yCi0JCQkJCS8vIG5ld05vZGVzIGFkZGVkCi0JCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG9sZE5vZGVzTGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA8IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCQkvLyBpZGVudGljYWwgZXhjZXB0Ci0JCQkJCQkvLyBmb3Igb2xkIE5vZGVzCi0JCQkJCQkvLyBkZWxldGVkCi0JCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdOb2Rlc0xlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnRPZkRpZmZlcmVuY2VzOwotCX0KLQotCXByaXZhdGUgaW50IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZVBhcmFtLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlUGFyYW0sIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKSB7Ci0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJaW50IG5ld1JlZ2lvbnNMZW5ndGggPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJYm9vbGVhbiBmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCS8vIHdlJ2xsIGNvbnRyb2wgb3VyIGxvb3AgYmFzZWQgb24gdGhlIG9sZCBMaXN0IGxlbmd0aAotCQlpbnQgb2xkUmVnaW9uc0xlbmd0aCA9IG9sZFJlZ2lvbnMuc2l6ZSgpOwotCQkvLyBiZSBzdXJlIHRvIGNoZWNrICdkb25lJyBmaXJzdCwgc28gc3RhcnRPZkRpZmZlcmVuY2VzIGlzbid0Ci0JCS8vIGljcmVtZW50ZWQgaWYgZG9uZSBpcyB0cnVlCi0JCWRvbmUgOiB3aGlsZSAoKCFkb25lKSAmJiAoKytzdGFydE9mRGlmZmVyZW5jZXMgPCBvbGRSZWdpb25zTGVuZ3RoKSkgewotCQkJSVRleHRSZWdpb24gb2xkUmVnaW9uID0gb2xkUmVnaW9ucy5nZXQoc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCS8vIHRoaXMgbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbiBpcyB0byBjaGVjayB0byBiZSBzdXJlIHRoZSBub2RlIGlzCi0JCQkvLyBpbmZhY3QgYSBjYW5kaWRhdGUKLQkJCS8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgIm9sZCIuIFRoaXMgY2hlY2sgaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZQotCQkJLy8gd2hlcmUgc29tZQotCQkJLy8gdGV4dCBpcyByZXBsYWNlaW5nIHRleHQgdGhhdAotCQkJLy8gYXBwZWFycyBpZGVudGljYWwsIGJ1dCBpcyBhIGRpZmZlcmVudCBpbnN0YW5jZS4gRm9yIGV4YW1wbGUsIGlmCi0JCQkvLyB0aGUgdGV4dAotCQkJLy8gaXMgPFA+PEI+PC9CPjwvUD4gYW5kIDxCPjwvQj4gaXMgaW5zZXJ0ZWQgYXQgcG9zdGlvbiAzLAotCQkJLy8gcmVzdWx0aW5nIGluIDxQPjxCPjwvQj48Qj48L0I+PC9QPgotCQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlCi0JCQkvLyBmaXJzdCA8Qj4gdG8gYmUgY29uc2lkZXJlZCBvbGQgLi4uIGl0IGlzIHRoZSBuZXcgb25lLCB0aGUKLQkJCS8vIHNlY29uZAotCQkJLy8gPEI+IGlzIHRoZSBvbGQgb25lLgotCQkJaWYgKF9sZXNzVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGVQYXJhbSwgb2xkUmVnaW9uKSkgewotCQkJCS8vIGJlIHN1cmUgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG5ldyBub2RlcyB0byBjb21wYXJlIGFnYWluc3QuCi0JCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IG5ld1JlZ2lvbnNMZW5ndGgpIHsKLQkJCQkJZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCWRvbmUgPSB0cnVlOwotCQkJCQljb250aW51ZSBkb25lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KHN0YXJ0T2ZEaWZmZXJlbmNlcyk7Ci0JCQkJCS8vIG5vdGU6IHNoaWZ0IGlzIDAgd2hpbGUgYXQgYmVnaW5uaW5nIG9mIGxpc3QsIGJlZm9yZSB0aGUKLQkJCQkJLy8gaW5zZXJ0aW9uIChvciBkZWxldGlvbikgcG9pbnQuIEFmdGVyIHRoYXQsIGl0IGlzCi0JCQkJCS8vIGZTdGFydCtmTGVuZ3RoRGlmZmVyZW5jZQotCQkJCQlpZiAoIShvbGROb2RlUGFyYW0uc2FtZUFzKG9sZFJlZ2lvbiwgbmV3Tm9kZVBhcmFtLCBuZXdSZWdpb24sIDApKSkgewotCQkJCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJY29udGludWUgZG9uZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHdlIHdpbGwgYmUga2VlcGluZyB0aGUgb2xkCi0JCQkJCQkvLyBvbmUuCi0JCQkJCQkvLyB1bmxpa2UgdGhlIGZsYXRub2RlIGNhc2UsIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotCQkJCQkJLy8gdXBkYXRlCi0JCQkJCQkvLyB0aGUgdGV4dHN0b3JlLCBzaW5jZSBpdHMgdGhlIHNhbWUgdGV4dCBzdG9yZSBpbgotCQkJCQkJLy8gZWl0aGVyIGNhc2UKLQkJCQkJCS8vIChzaW5jZSBpdHMgdGhlIHNhbWUgZmxhdG5vZGUpCi0JCQkJCQkvL29sZFJlZ2lvbi5zZXRUZXh0U3RvcmUoZlN0cnVjdHVyZWREb2N1bWVudC5wYXJlbnREb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGRpZG4ndCBsaXRlcmFsbHkgZmluZCBhIGRpZmZlcmVuY2UsIGJ1dCB3ZSBjb3VudCBpdCBhcwotCQkJCS8vIHN1Y2ggYnkgaW1wbGljYXRpb24KLQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgbGl0ZXJhbGx5IGZvdW5kIGEgZGlmZmVyZW5jZSwgdGhlbiBhbGwgaXMgb2sgYW5kIHdlIGNhbgotCQkvLyByZXR1cm4KLQkJLy8gaXQuCi0JCS8vIGlmIHdlIGRpZCBub3QgbGl0ZXJhbGx5IGZpbmQgb25lLCB0aGVuIHdlIGhhdmUgdG8gZGVjaWRlIHdoeS4KLQkJaWYgKCFmb3VuZERpZmZlcmVuY2UpIHsKLQkJCWlmIChuZXdSZWdpb25zTGVuZ3RoID09IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkvLyBpZGVudGljYWwgKGFuZCBtYXkKLQkJCQkvLyBiZSBvZiB6ZXJvIGxlbmd0aCkKLQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5ld1JlZ2lvbnNMZW5ndGggPiBvbGRSZWdpb25zTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCS8vIGlkZW50aWNhbCBleGNlcHQKLQkJCQkJLy8gZm9yIG5ld1JlZ2lvbnMKLQkJCQkJLy8gYWRkZWQKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkUmVnaW9uc0xlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobmV3UmVnaW9uc0xlbmd0aCA8IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cwotCQkJCQkJLy8gYXJlIGlkZW50aWNhbAotCQkJCQkJLy8gZXhjZXB0IGZvcgotCQkJCQkJLy8gb2xkIE5vZGVzCi0JCQkJCQkvLyBkZWxldGVkCi0JCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdSZWdpb25zTGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydE9mRGlmZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogUGFydCAxIG9mIDIgc3RlcHMgdG8gZG8gYSBjb3JlX3JlcGFyc2UKLQkgKiAKLQkgKiBQYXJzZXMgYSBwb3J0aW9uIG9mIHRoZSBjdXJyZW50IHRleHQgaW4gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kCi0JICogcmV0dXJucyB0aGUgcmF3IHJlc3VsdAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBfY29yZV9yZXBhcnNlX3RleHQoaW50IHJlc2NhblN0YXJ0LCBpbnQgcmVzY2FuRW5kKSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVzZXRQYXJzZXIocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIFBhcnQgMiBvZiAyIHN0ZXBzIHRvIGRvIGEgY29yZV9yZXBhcnNlCi0JICogCi0JICogSW50ZWdyYXRlcyBhIGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudAotCSAqIHRleHQgY29udGVudHMgb2YgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW50byB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIGRhdGEgc3RydWN0dXJlCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBfY29yZV9yZXBhcnNlX3VwZGF0ZV9tb2RlbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGVzSGVhZCwgaW50IHJlc2NhblN0YXJ0LCBpbnQgcmVzY2FuRW5kLCBDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIGJvb2xlYW4gZmlyc3RUaW1lKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBuZXdOb2RlcyA9IG51bGw7Ci0JCS8vIHJlc2NhbgotCQluZXdOb2RlcyA9IG5ldyBDb3JlTm9kZUxpc3QobmV3Tm9kZXNIZWFkKTsKLQkJLy8gYWRqdXN0IG91ciBuZXdOb2RlIGNoYWluIHNvIHRoZSBvZmZzZXQgcG9zaXRpb25zIG1hdGNoCi0JCS8vIG91ciB0ZXh0IHN0b3JlIChub3QgdGhlIHNpbXBsZSBzdHJpbmcgb2YgdGV4dCByZXBhcnNlZCkKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQobmV3Tm9kZXNIZWFkLCByZXNjYW5TdGFydCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHBhcmVudERvY3VtZW50IHZhcmlhYmxlIG9mIGVhY2ggaW5zdGFuY2UgaW4gdGhlIG5ldwotCQkvLyBjaGFpbgotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRQYXJlbnREb2N1bWVudChuZXdOb2Rlc0hlYWQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgdmFyaWFibGUgb2YgZWFjaCBpbnN0YW5jZSBpbiB0aGUKLQkJLy8gbmV3IGNoYWluCi0JCS8vU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld05vZGVzSGVhZCwKLQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vCi0JCWlmIChmaXJzdFRpbWUpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24obmV3Tm9kZXNIZWFkKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuaW5pdGlhbGl6ZUZpcnN0QW5kTGFzdERvY3VtZW50UmVnaW9uKCk7Ci0JCQkvLyBub3RlOiBzaW5jZSB3ZSBhcmUgaW5zZXJ0aW5nIG5vZGVzLCBmb3IgdGhlIGZpcnN0IHRpbWUsIHRoZXJlCi0JCQkvLyBpcwotCQkJLy8gbm8gYWRqdXN0bWVudHMKLQkJCS8vIHRvIGRvd25zdHJlYW0gc3R1ZmYgbmVjZXNzYXJ5LgotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGVzLCBuZXdOb2RlcywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiBpbnRlZ3JhdGVzIGNoYW5nZXMgaW50byBtb2RlbCBhcyBhIHNpZGUgZWZmZWN0Ci0JCQlyZXN1bHQgPSBtaW5pbXVtRXZlbnQob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJfQotCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvcmVOb2RlTGlzdCBfZm9ybU1pbmltdW1MaXN0KENvcmVOb2RlTGlzdCBmbGF0bm9kZXMsIGludCBzdGFydE9mRGlmZmVyZW5jZXMsIGludCBlbmRPZkRpZmZlcmVuY2VzKSB7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTm9kZXMgPSBudWxsOwotCQkvLyBpZiBzdGFydE9mRGlmZmVyY2VzIGlzIHN0aWxsIGl0cyBpbml0aWFsIHZhbHVlLCB0aGVuIHdlIGhhdmUgYW4KLQkJLy8gZW1wdHkgZG9jdW1lbnQKLQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA9PSAtMSkgewotCQkJbWluaW1hbE5vZGVzID0gRU1QVFlfTElTVDsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGFueSBmbGF0bm9kZSBpbiBvdXIgZmxhdG5vZGUgbGlzdCwgdGhlbgotCQkJLy8gc2ltcGx5Ci0JCQkvLyByZXR1cm4gb3VyIHN0YW5kYXJkIGVtcHR5IGxpc3QKLQkJCWlmIChmbGF0bm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCW1pbmltYWxOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIHN0YXJ0T2ZEaWZmZXJlbmNlcyBpcyBncmVhdGVyIHRoYW4gZW5kT2ZEaWZmZXJlbmNlcywKLQkJCQkvLyB0aGVuCi0JCQkJLy8gdGhhdCBtZWFucyB0aGUgY2FsY3VsYXRpb25zICJjcm9zc2VkIiBlYWNoIG90aGVyLCBhbmQKLQkJCQkvLyBoZW5jZSwKLQkJCQkvLyB0aGVyZSByZWFsbHkgaXMgbm8gZGlmZmVyZW5jZXMsIHNvLCBhZ2FpbiwgcmV0dXJuIHRoZSBlbXB0eQotCQkJCS8vIGxpc3QKLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gZW5kT2ZEaWZmZXJlbmNlcykgewotCQkJCQltaW5pbWFsTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSBsYXN0IGNoZWNrIGJlIHN1cmUgd2UgaGF2ZSBzb21lIGRpZmZlcm5jZXMKLQkJCQkJaWYgKChlbmRPZkRpZmZlcmVuY2VzID4gLTEpKSB7Ci0JCQkJCQltaW5pbWFsTm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KGZsYXRub2Rlcy5pdGVtKHN0YXJ0T2ZEaWZmZXJlbmNlcyksIGZsYXRub2Rlcy5pdGVtKGVuZE9mRGlmZmVyZW5jZXMpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHRoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXMsIHRoZSBsaXN0IHdhc24ndAotCQkJCQkJLy8gbWluaW1pemVkLCBzbyBzaW1wbHkgcmV0dXJuIGl0LgotCQkJCQkJbWluaW1hbE5vZGVzID0gZmxhdG5vZGVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtaW5pbWFsTm9kZXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgbm9kZVN0YXJ0ID0gb2xkTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgY2hhbmdlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSBub2RlU3RhcnQgPiBjaGFuZ2VkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvbGROb2RlLmdldFN0YXJ0T2Zmc2V0KG9sZFJlZ2lvbik7Ci0JCWludCBlZmZlY3RlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSByZWdpb25TdGFydE9mZnNldCA+IGVmZmVjdGVkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldCgpIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbiBvbGRSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldChvbGRSZWdpb24pIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX3JlZ2lvbnNTYW1lS2luZChJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvbmUgcmVnaW9uIGlzIGEgY29udGFpbmVyIHJlZ2lvbiwgYW5kIHRoZSBvdGhlciBub3QsIGFsd2F5cwotCQkvLyByZXR1cm4gZmFsc2UKLQkJLy8gZWxzZSwganVzdCBjaGVjayB0aGVpciB0eXBlLgotCQkvLyAgICAgIERXIGRydWluZyByZWZhY3RvcmluZywgbG9va3MgbGlrZSBhICJ0eXBvIiBoZXJlLCB1c2luZyAnb2xkJyBpbgotCQkvLyBib3RoLgotCQkvLwkJaWYgKGlzQ29udGFpbmVyUmVnaW9uKG9sZFJlZ2lvbikgIT0gaXNDb250YWluZXJSZWdpb24ob2xkUmVnaW9uKSkKLQkJaWYgKGlzQ29sbGVjdGlvblJlZ2lvbihvbGRSZWdpb24pICE9IGlzQ29sbGVjdGlvblJlZ2lvbihuZXdSZWdpb24pKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkgPT0gbmV3UmVnaW9uLmdldFR5cGUoKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8JcHJpdmF0ZSBib29sZWFuIGhhc0NvbGxlY3Rpb25SZWdpb25zKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkvLwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkvLwkJaWYgKGFSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkvLwkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb25Db250YWludGVyID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikKLQkvLyBhUmVnaW9uOwotCS8vCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSByZWdpb25Db250YWludGVyLmdldFJlZ2lvbnMoKTsKLQkvLwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCS8vCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCS8vCQkJCWlmIChhUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JLy8JCQkJCXJlc3VsdCA9IHRydWU7Ci0JLy8JCQkJCWJyZWFrOwotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfQotCS8vCQlyZXR1cm4gcmVzdWx0OwotCS8vCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBzcGVjaWZpY2FsbHkgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gJ2lzRW5kZWQnIHN0YXRlLAotCSAqIGFsdGhvdWdoIGl0IHN0aWxsIGRvZXMgc28gd2l0aCBoZXVyaXN0aWNzLiBJZiBudW1iZXIgb2YgJz4nIGNoYW5nZXMsCi0JICogYXNzdW1lIHRoZSBpc0VuZGVkIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VJbklzRW5kZWRTdGF0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJaW50IG5PbGQgPSBTdHJpbmdVdGlscy5vY2N1cnJlbmNlc09mKG9sZFRleHQsICc+Jyk7Ci0JCWludCBuTmV3ID0gU3RyaW5nVXRpbHMub2NjdXJyZW5jZXNPZihuZXdUZXh0LCAnPicpOwotCQlyZXR1cm4gIShuT2xkID09IG5OZXcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0FuZEFzc2lnblBhcmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KG9sZE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiB0ZXh0UmVnaW9uQ29sbGVjdGlvbiA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbjsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gdGV4dFJlZ2lvbkNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gaW5uZXJSZWdpb24gPSByZWdpb25MaXN0LmdldChpKTsKLQkJCQljaGVja0FuZEFzc2lnblBhcmVudChvbGROb2RlLCBpbm5lclJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNoYW5nZSB0byBhIENEQVRBIHRhZyBjYW4gcmVzdWx0IGluIGFsbCBiZWluZyByZXBhcnNlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ0RBVEEoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwhW0NEQVRBWyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIl1dPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgYSBjb21tZW50IHN0YXJ0IG9yIGVuZCB0YWcgaXMgYmVpbmcgYWRkZWQgb3IgZGVsZXRlZCwgd2UnbGwgcmVzY2FuCi0JICogdGhlIHdob2xlIGRvY3VtZW50LiBUaGUgcmVhc29uIGlzIHRoYXQgY29udGVudCB0aGF0IGlzIHJldmVhbGVkIG9yCi0JICogY29tbWVudGVkIG91dCBjYW4gZWZmZWN0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVzdCBvZiB0aGUKLQkgKiBkb2N1bWVudC4gTm90ZTogZm9yIG5vdyB0aGlzIGlzIHZlcnkgWE1MIHNwZWNpZmljLCBjYW4gcmVmYWN0b3IvaW1wcm92ZQotCSAqIGxhdGVyLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNvbW1lbnRzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8IS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiLS0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gd2UnbGwgYWxzbyBjaGVjayBmb3IgdGhlc2UgZGVnZW5lcmF0ZSBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8IS0tLT4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbW1vbiB1dGlsaXR5IGZvciBjaGVja2luZyBmb3IgY3JpdGljYWwgd29yZCBzdWNoIGFzICIgPFNDUklQVD4iCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3JpdGljYWxLZXkoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0KSB7Ci0JCXJldHVybiBfY2hlY2tGb3JDcml0aWNhbFdvcmQoY3JpdGljYWxUYXJnZXQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdXRpbGl0eSBmb3IgY2hlY2tpbmcgZm9yIGNyaXRpY2FsIHdvcmQgc3VjaCBhcyAiIDxTQ1JJUFQ+IgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcml0aWNhbE5hbWUoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0KSB7Ci0JCXJldHVybiBfY2hlY2tGb3JDcml0aWNhbFdvcmQoY3JpdGljYWxUYXJnZXQsIHRydWUpOwotCX0KLQotCS8vCS8qKgotCS8vCSAqIEN1cnJlbnRseSB0aGlzIG1ldGhvZCBpcyBwcmV0dHkgc3BlY2lmaWMgdG8gP01MCi0JLy8JICogQGRlcHJlY2F0ZWQgLSBub3QgcmVhbGx5IGRlcHJlY2F0ZWQsIGJ1dCBwbGFuIHRvIG1ha2UKLQkvLwkgKiBwcm90ZWN0ZWQgLi4uIEknbSBub3Qgc3VyZSB3aHkgaXRzIHB1YmxpYyBvciBtaXNzcGVsbGVkPwotCS8vCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBDYXNlIDE6IFNlZSBpZiB0aGUgbGFuZ3VhZ2UncyBzeW50YXggcmVxdWlyZXMgdGhhdCBtdWx0aXBsZQotCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGJlIHJlc2Nhbm5lZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKTsKLQkJfQotCQkvLyBDYXNlIDI6ICJibG9jayB0YWdzIiB3aG9zZSBjb250ZW50IGlzIGxlZnQgdW5wYXJzZWQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBCbG9ja1RhZ1BhcnNlcikgewotCQkJCUxpc3QgYmxvY2tUYWdzID0gKChCbG9ja1RhZ1BhcnNlcikgcGFyc2VyKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCQlyZXN1bHQgPSBfY2hlY2tCbG9ja05vZGVMaXN0KGJsb2NrVGFncyk7Ci0JCQl9Ci0JCX0KLQkJLy8gRlVUVVJFX1RPX0RPOiBpcyB0aGVyZSBhIGJldHRlciBwbGFjZSB0byBkbyB0aGlzPwotCQkvLyBvciEgZG8gd2UgYWxyZWFkeSBkbyBpdCBzb21lIG90aGVyIG1vcmUgY2VudHJhbCBwbGFjZT8KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFsbG93IGEgcmVwYXJzZXIgdG8gY2hlY2sgZm9yIGV4dHJhIHN5bnRhY3RpYyBjYXNlcyB0aGF0IHJlcXVpcmUKLQkgKiBwYXJzaW5nIGJleW9uZCB0aGUgZmxhdE5vZGUgYm91bmRhcnkuCi0JICogCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IFhNTC1jZW50cmljLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0JCS8vIENhc2UgMTogUXVvdGUgY2hhcmFjdGVycyBhcmUgaW52b2x2ZWQKLQkJcmVzdWx0ID0gY2hlY2tGb3JRdW90ZXMoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDI6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBjb21tZW50IGJlZ2lubmluZyBvcgotCQkJLy8gY29tbWVudAotCQkJLy8gZW5kCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNvbW1lbnRzKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDM6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0JCQlyZXN1bHQgPSBjaGVja0ZvclBJKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDQ6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBDREFUQSBzZWN0aW9uCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNEQVRBKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIGNoYW5nZSByZXF1ZXN0IGV4YWN0bHkgbWF0Y2hlcyB0aGUgdGV4dCBpdCB3b3VsZCBiZQotCSAqIHJlcGxhY2luZy4gKEluIGZ1dHVyZSwgdGhpcywgb3Igc2ltaWxhciBtZXRob2QgaXMgd2hlcmUgdG8gY2hlY2sgZm9yCi0JICogInJlYWQgb25seSIgYXR0ZW1wdGVkIGNoYW5nZS4pCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0Zvck5vQ2hhbmdlKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBkb24ndCBjaGVjayBlcXVhbHMgdW5sZXNzIGxlbmd0aHMgbWF0Y2gKLQkJLy8gc2hvdWxkIGJlIGEgdGlueSBiaXQgZmFzdGVyLCBzaW5jZSB1c3VhbGx5IG5vdAotCQkvLyBvZiBlcXVhbCBsZW5ndGhzIChJJ20gc3VycHJpc2VkIFN0cmluZydzIGVxdWFscyBtZXRob2QKLQkJLy8gZG9lc24ndCBkbyB0aGlzLikKLQkJaWYgKChmQ2hhbmdlcyAhPSBudWxsKSAmJiAoZkRlbGV0ZWRUZXh0ICE9IG51bGwpICYmIChmQ2hhbmdlcy5sZW5ndGgoKSA9PSBmRGVsZXRlZFRleHQubGVuZ3RoKCkpICYmIChmQ2hhbmdlcy5lcXVhbHMoZkRlbGV0ZWRUZXh0KSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBOb0NoYW5nZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBjaGFuZ2UgdG8gYSBQSSB0YWcgY2FuIHJlc3VsdCBpbiBhbGwgYmVpbmcgcmVwYXJzZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvclBJKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8PyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyAgRm9yIHNpbXBsaWNpdHksIGlmIGVpdGhlciB0ZXh0IHRvIGJlIGRlbGV0ZWQsIG9yIHRleHQgdG8gYmUgaW5zZXJ0ZWQKLQkvLyBjb250YWlucyBhdCBsZWFzdAotCS8vICBvbmUgcXVvdGUsIHdlJ2xsIHNlYXJjaCBmb3IgcHJldmlvdXMgcXVvdGUgaW4gZG9jdW1lbnQsIGlmIGFueSwgYW5kIHVzZQotCS8vIHRoYXQgZmxhdG5vZGUgYXMKLQkvLyAgYSBkaXJ0eSBzdGFydCwgYW5kIHdlJ2xsIHVzZSBlbmQgb2YgZG9jdW1lbnQgYXMgZGlydHkgZW5kLiBXZSBuZWVkIHRvCi0JLy8gYXNzdW1lIGVpdGhlciBcIiBvcgotCS8vICBcJyBpcyBhbiBleGNlcHRhYmxlIHF1b3RlLiAoTk9URTogdGhpcyBpcywgbG9vc2VseSwgYW4gWE1MIGFzc3VtcHRpb24KLQkvLyAtLQotCS8vIG90aGVyIGxhbmd1YWdlcwotCS8vICB3b3VsZCBkaWZmZXIsIGJ1dCB3ZSdsbCAiaGFyZCBjb2RlIiBmb3IgWE1MIGZvciBub3cuCi0JLy8gZnV0dXJlX1RPRE86IHRoaXMgaXMgYSByZWFsbHkgYmFkIGhldXJpc3RpYyAuLi4gd2Ugc2hvdWxkIGJlIGxvb2tpbmcKLQkvLyBmb3IKLQkvLyBvZGQgbnVtYmVyIG9mIHF1b3RlcwotCS8vIHdpdGhpbiBhIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAob3Igc29tZXRoaW5nISkgVGhpcyBjYXVzZXMgd2F5IHRvbwotCS8vIG11Y2ggcmVwYXJzaW5nIG9uCi0JLy8gc2ltcGxlIGNhc2VzLCBsaWtlIGRlbGV0aW5nIGEgdGFnIHdpdGggYSBxdW90ZWQgYXR0cmlidXRlIQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JRdW90ZXMoKSB7Ci0JCS8vIHJvdXRpbmUgaXMgc3VwcG9ydGVkIHdpdGggbnVsbCBvciBlbXB0eSBzdHJpbmcgbWVhbmluZyB0aGUgc2FtZQotCQkvLyB0aGluZzogZGVsZXRpb24KLQkJaWYgKGZDaGFuZ2VzID09IG51bGwpCi0JCQlmQ2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgZGlydHlTdGFydFBvcyA9IC0xOwotCQkJU3RyaW5nIHByb3Bvc2VkRGVsZXRpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKGZTdGFydCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAoKGZDaGFuZ2VzLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpIHx8IChwcm9wb3NlZERlbGV0aW9uLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpKSB7Ci0JCQkJCUlSZWdpb24gc2luZ2xlUXVvdGVSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZlN0YXJ0LCBzaW5nbGVRdW90ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoc2luZ2xlUXVvdGVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZGlydHlTdGFydFBvcyA9IHNpbmdsZVF1b3RlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoZkNoYW5nZXMuaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkgfHwgKHByb3Bvc2VkRGVsZXRpb24uaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkpIHsKLQkJCQkJSVJlZ2lvbiBkb3VibGVRdW90ZVJlZ2lvbiA9IGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkuZmluZChmU3RhcnQsIGRvdWJsZVF1b3RlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChkb3VibGVRdW90ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlkaXJ0eVN0YXJ0UG9zID0gZG91YmxlUXVvdGVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlydHlTdGFydFBvcyA+IC0xKSB7Ci0JCQkJLy8gdGhlbiB3ZSBmb3VuZCBvbmUsIGRvIGNyZWF0ZSBuZXcgc3RydWN0dXJlZERvY3VtZW50IGV2ZW50Ci0JCQkJLy8gYmFzZWQgb24gdGhlIHByZXZpb3VzIHF1b3RlIHRvIGVuZCBvZiBkb2N1bWVudAotCQkJCS8vIGV4Y2VwdCwgd2UgbmVlZCB0byBiZSBwb3NpdGl2ZSB0aGF0IHRoZSBwcmV2aW91cyBxdW90ZSBpcwotCQkJCS8vIGluIGEgInNhZmUgc3RhcnQiIHJlZ2lvbiAoZS5nLiBpZiBpbiBKU1AgY29udGVudCwgd2UgbmVlZAotCQkJCS8vIHRvCi0JCQkJLy8gYmFja3VwIHRpbGwgd2UgaW5jbHVkZSB0aGUgd2hvbGUgSlNQIHJlZ2lvbiwgaW4gb3JkZXIgZm9yCi0JCQkJLy8gaXQKLQkJCQkvLyB0byBiZSBjb3JyZWN0bHkgcmUtcGFyc2VkLiBUaGUgYmFja2luZyB1cCBpcyBkb25lIGluIHRoZQotCQkJCS8vIHJlcGFyc2UvZmluZCBkaXJ0eSBzdGFydCBmcm9tIGhpbnQKLQkJCQkvLyBtZXRob2QuCi0JCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0UG9zLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tIZXVyaXN0aWNzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0Zvck5vQ2hhbmdlKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlcygpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVpY2tDaGVjaygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGFrZXMgaW50byBhY2NvdW50ICJ0YWcgbmFtZSIgcnVsZXMgZm9yIGNvbXBhcmlzb25zOyBjYXNlLWluc2Vuc2l0aXZlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1RhZ05hbWVzKFN0cmluZyBjb21wYXJlVGV4dCwgU3RyaW5nIGNyaXRpY2FsVGFyZ2V0LCBib29sZWFuIGNoZWNrRW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICgoY29tcGFyZVRleHQgPT0gbnVsbCkgfHwgKGNyaXRpY2FsVGFyZ2V0ID09IG51bGwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgcG9zT2ZDcml0aWNhbFdvcmQgPSBjb21wYXJlVGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoY3JpdGljYWxUYXJnZXQudG9Mb3dlckNhc2UoKSk7Ci0JCXJlc3VsdCA9IHBvc09mQ3JpdGljYWxXb3JkID4gLTE7Ci0JCWlmIChjaGVja0VuZCAmJiByZXN1bHQpIHsKLQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRydWUgcmlnaHQgYXdheSwgd2UnbGwgb25seSByZXR1cm4gdHJ1ZQotCQkJLy8gdGhlCi0JCQkvLyBwb3RlbnRpYWxseSBtYXRjaGVkIHRhZyBpcyBpbmRlZWQgYSB0YWcsIGZvciBleGFtcGxlLCBpZgotCQkJLy8gPFNDUklQVAotCQkJLy8gYmVjb21lcyA8U0NSSVBUUyB3ZSBkb24ndCB3YW50IHRvIHNheSB0aGUgbGF0dGVyIGlzIGEgY3JpdGljYWwKLQkJCS8vIHRhZwotCQkJaW50IGxhc3RQb3MgPSBwb3NPZkNyaXRpY2FsV29yZCArIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQkJaWYgKGxhc3RQb3MgPCBjb21wYXJlVGV4dC5sZW5ndGgoKSkgewotCQkJCWNoYXIgbGFzdENoYXIgPSBjb21wYXJlVGV4dC5jaGFyQXQobGFzdFBvcyk7Ci0JCQkJLy8gRnV0dXJlOiBjaGVjayBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGlzIGphdmEgbWV0aG9kLCB2cy4KLQkJCQkvLyBYTUwKLQkJCQkvLyBwYXJzaW5nIHJ1bGVzCi0JCQkJcmVzdWx0ID0gKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGxhc3RDaGFyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZSwgYW5kIHRoZSB0ZXh0IHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNvcmVfcmVwYXJzZShpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQsIENvcmVOb2RlTGlzdCBvbGROb2RlcywgYm9vbGVhbiBmaXJzdFRpbWUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2Rlc0hlYWQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQluZXdOb2Rlc0hlYWQgPSBfY29yZV9yZXBhcnNlX3RleHQocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJlc3VsdCA9IF9jb3JlX3JlcGFyc2VfdXBkYXRlX21vZGVsKG5ld05vZGVzSGVhZCwgcmVzY2FuU3RhcnQsIHJlc2NhbkVuZCwgb2xkTm9kZXMsIGZpcnN0VGltZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHN0YXRlIHRvICJub3QgcGFyc2luZyIKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuZFJlUGFyc2UoKSB7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQlkaXJ0eVN0YXJ0ID0gbnVsbDsKLQkJZGlydHlFbmQgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmREaXJ0eUVuZChpbnQgZW5kKSB7Ci0JCS8vIENhdXRpb246IGhlcmUncyBvbmUgcGxhY2Ugd2UgaGF2ZSB0byBjYXN0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkvLyBpZiBub3Qgd2VsbCBmb3JtZWQsIGdldCBvbmUgcGFzdCwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmICghcmVzdWx0LmlzRW5kZWQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGFsc28sIGdldCBvbmUgcGFzdCBpZiBleGFjdGx5IGVxdWFsIHRvIHRoZSBlbmQgKHRoaXMgd2FzIG5lZWRlZAotCQkvLyBhcyBhIHNpbXBsZSBmaXggdG8gd2hlbiBhIHdob2xlIGV4YWN0IHJlZ2lvbiBpcyBkZWxldGVkLgotCQkvLyB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHdheS4KLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKGVuZCA9PSByZXN1bHQuZ2V0RW5kKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQkvLyAxMi82LzIwMDEgLSBTaW5jZSB3ZSd2ZSBjaGFuZ2VkIHRoZSBwYXJzZXIvc2Nhbm5lciB0byBhbGxvdyBhIGxvbmUKLQkJLy8gJzwnIHdpdGhvdXQKLQkJLy8gYWx3YXlzIGludGVycHJldHRpbmcgaXQgYXMgc3RhcnQgb2YgYSB0YWcgbmFtZSwgd2UgbmVlZCB0byBiZSBhCi0JCS8vIGxpdHRsZSBmYW5jaWVyLCBpbiBvcmRlcgotCQkvLyB0byAic2tpcCIgb3ZlciBhbnkgcGxhaW4gJ29sIGNvbnRlbnQgYmV0d2VlbiB0aGUgbG9uZSAnPCcgYW5kIGFueQotCQkvLyBwb3RlbnRpYWwgbWVhdGluZwotCQkvLyByZWdpb25zIHBhc3QgcGxhaW4gJ29sIGNvbnRlbnQuCi0JCS8vCQlpZiAoaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KHJlc3VsdCkgJiYgKHJlc3VsdC5nZXROZXh0KCkgIT0KLQkJLy8gbnVsbCkpIHsKLQkJLy8JCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkvLwkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluZERpcnR5U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCS8vIGhldXJpc3RpYzogaWYgdGhlIHBvc3Rpb24gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RhcnQsIHRoZW4KLQkJLy8gZ28gYmFjayBvbmUgbW9yZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHByZXZlbnRzIHByb2JsZW1zIHdpdGgKLQkJLy8gaW5zZXJ0aW9ucwotCQkvLyBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBwcmV2aW91cyBub2RlIGluc3RlYWQgb2YKLQkJLy8gc2ltcGx5IGh1bmcKLQkJLy8gb2ZmIG9mIGl0IGFzIGEgc2VwYXJhdGUgbm9kZSAoZXguOiBYTUwgY29udGVudCBpbnNlcnRlZCByaWdodAotCQkvLyBiZWZvcmUKLQkJLy8gYW4gb3BlbgotCQkvLyBicmFja2V0IHNob3VsZCBiZWNvbWUgcGFydCBvZiB0aGUgcHJldmlvdXMgY29udGVudCBub2RlKQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSByZXN1bHQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmICgocHJldmlvdXMgIT0gbnVsbCkgJiYgKCghKHByZXZpb3VzLmlzRW5kZWQoKSkpIHx8IChzdGFydCA9PSByZXN1bHQuZ2V0U3RhcnQoKSkpKSB7Ci0JCQkJcmVzdWx0ID0gcHJldmlvdXM7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBhcmUgbm93IGF0IHRoZSBlbmQgb2YgYSAidGFnIGRlcGVuZGVudCIgY29udGVudCBhcmVhIChvcgotCQkJLy8gSlNQIGFyZWEpCi0JCQkvLyB0aGVuIHdlIG5lZWQgdG8gYmFjayB1cCBhbGwgdGhlIHdheSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoYXQuCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBvdGVudGlhbCA9IHJlc3VsdDsKLQkJCS8vIG1vdmVkIHRvIHN1YmNsYXNzIHRvIHNwZWVkIHRyYW5zaXRpb24KLQkJCS8vCQkJd2hpbGUgKGlzUGFydE9mQmxvY2tSZWdpb24ocG90ZW50aWFsKSkgewotCQkJLy8JCQkJcG90ZW50aWFsID0gcG90ZW50aWFsLmdldFByZXZpb3VzKCk7Ci0JCQkvLwkJCX0KLQkJCWlmIChwb3RlbnRpYWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHBvdGVudGlhbDsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZGlydHlTdGFydCA9IHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29yZU5vZGVMaXN0IGZvcm1PbGROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJQ29yZU5vZGVMaXN0IG9sZE5vZGVzID0gbmV3IENvcmVOb2RlTGlzdChkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCS8vIE5vdyBzYXZlIHRoZSBvbGQgdGV4dCwgdGhhdCAiZ29lcyB3aXRoIiB0aGUgb2xkIG5vZGVzIGFuZCByZWdpb25zLgotCQkvLyBOb3RpY2Ugd2UgYXJlIGdldHRpbmcgaXQgZGlyZWN0bHkgZnJvbSB0aGUgdGV4dCBzdG9yZQotCQlTdHJpbmcgb2xkVGV4dCA9IG51bGw7Ci0JCWludCBvbGRTdGFydCA9IC0xOwotCQlpbnQgb2xkRW5kID0gLTE7Ci0JCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBzb21lIHRleHQsIGlmIG5vdCwgdXNlIGVtcHR5IHN0cmluZwotCQkvLyAoaWYgb25lIG5vZGUgaXMgbm90IG51bGwsIHRoZSBvdGhlciBzaG91bGQgQUxXQVlTIGJlIG5vdCBudWxsIHRvbywKLQkJLy8gc2luY2UgaXQKLQkJLy8gd291bGQgYXQgbGVhc3QgYmUgZXF1YWwgdG8gaXQuKQotCQlpZiAoZGlydHlTdGFydCAhPSBudWxsKSB7Ci0JCQlvbGRTdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJCW9sZEVuZCA9IGRpcnR5RW5kLmdldEVuZCgpOwotCQkJb2xkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KG9sZFN0YXJ0LCBvbGRFbmQgLSBvbGRTdGFydCk7Ci0JCX0gZWxzZSB7Ci0JCQlvbGRTdGFydCA9IDA7Ci0JCQlvbGRFbmQgPSAwOwotCQkJb2xkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IHRleHQgc3RvcmUgZm9yIHRoaXMgdGV4dAotCQlTdWJTZXRUZXh0U3RvcmUgc3ViVGV4dFN0b3JlID0gbmV3IFN1YlNldFRleHRTdG9yZShvbGRUZXh0LCBvbGRTdGFydCwgb2xkRW5kLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJLy8gTm93IHVwZGF0ZSB0aGUgdGV4dCBzdG9yZSBvZiB0aGUgb2xkTm9kZXMKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQob2xkTm9kZXMsIG5ldyBNaW5pbWFsRG9jdW1lbnQoc3ViVGV4dFN0b3JlKSk7Ci0JCXJldHVybiBvbGROb2RlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpIHsKLQkJaWYgKGZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9PSBudWxsKSB7Ci0JCQlmRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPSBuZXcgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcjsKLQl9Ci0KLQkvLyBOb3RlOiBpZiB0aGVhZCBzYWZldHkgaXMgbmVlZGVkLCB0aGlzIGFuZCBhbGwgdGhlIG90aGVyIHB1YmxpYyBtZXRob2RzCi0JLy8gb2YgdGhpcyBjbGFzcwotCS8vIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQuCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWlzUGFyc2luZyA9IHRydWU7Ci0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoVG9SZXBsYWNlID0gbGVuZ3RoVG9SZXBsYWNlOwotCQlmQ2hhbmdlcyA9IGNoYW5nZXM7Ci0JCS8vIG5vdGljZSB0aGlzIG9uZSBpcyBkZXJpdmVkCi0JCWZMZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoZkNoYW5nZXMsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQlmRGVsZXRlZFRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNPbGROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRPbGROb2RlLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5ldyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5ldyA9IG51bGw7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkUHJldmlvdXMgPSBwcmV2aW91c09sZE5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTmV4dCA9IG5leHRPbGROb2RlOwotCQkvLwotCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBnZXQgcG9pbnRlcnMKLQkJCWZpcnN0TmV3ID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCWxhc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkvLyBzd2l0Y2ggc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucycgcmVmZXJlbmNlcyB0bwotCQkJLy8gbGlzdHMKLQkJCWlmIChvbGRQcmV2aW91cyAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzLnNldE5leHQoZmlyc3ROZXcpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCW9sZE5leHQuc2V0UHJldmlvdXMobGFzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFNJREUgRUZGRUNUCi0JCQkJLy8gaWYgb2xkTmV4dCBpcyBudWxsLCB0aGF0IG1lYW5zIHdlIGFyZSByZXBsYWNlaW5nIHRoZQotCQkJCS8vIGxhc3ROb2RlIGluIHRoZSBjaGFpbiwKLQkJCQkvLyBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RydWN0dXJlZERvY3VtZW50cyBsYXN0Tm9kZSBhcwotCQkJCS8vIHRoZQotCQkJCS8vIGxhc3Qgb2YgdGhlIG5ldyBub2Rlcy4KLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldExhc3REb2N1bWVudFJlZ2lvbihuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSkpOwotCQkJfQotCQkJaWYgKGZpcnN0TmV3ICE9IG51bGwpCi0JCQkJZmlyc3ROZXcuc2V0UHJldmlvdXMob2xkUHJldmlvdXMpOwotCQkJaWYgKGxhc3ROZXcgIT0gbnVsbCkKLQkJCQlsYXN0TmV3LnNldE5leHQob2xkTmV4dCk7Ci0JCX0KLQkJLy8gZWxzZSBub3RoaW5nIHRvIGluc2VydAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRSZWdpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb2xsZWN0aW9uUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJcmV0dXJuIChhUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNpbmcoKSB7Ci0JCXJldHVybiBpc1BhcnNpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1pbmltaXphdGlvbiBhbGdvcml0aG0gc2ltcGx5IGNoZWNrcyB0aGUgb2xkIG5vZGVzIHRvIHNlZSBpZiBhbnkgb2YKLQkgKiB0aGVtICJzdXJ2aXZlZCIgdGhlIHJlc2NhbiBhbmQgYXJlIHVuY2hhbmdlZC4gSWYgc28sIHRoZSBpbnN0YW5jZSBvZgotCSAqIHRoZSBvbGQgbm9kZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIG5ldyBub2RlLiBCZWZvcmUgdGhlIHJlcXVlc3RlZAotCSAqIGNoYW5nZSwgbmVlZCB0byBjaGVjayB0eXBlLCBvZmZzZXRzLCBhbmQgdGV4dCB0byBkZXRlcm1pbmUgaWYgdGhlIHNhbWUuCi0JICogQWZ0ZXIgdGhlIHJlcXVlc3RlZCBjaGFuZ2UsIG5lZWQgdG8gY2hlY2sgdHlwZSBhbmQgdGV4dCwgYnV0IGFkanVzdCB0aGUKLQkgKiBvZmZzZXRzIHRvIHdoYXQgZXZlciB0aGUgY2hhbmdlIHdhcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgbWluaW11bUV2ZW50KENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJQ29yZU5vZGVMaXN0IG1pbmltYWxPbGROb2RlcyA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTmV3Tm9kZXMgPSBudWxsOwotCQkvLyBUbyBtaW5pbWl6ZSBub2Rlcywgd2UnbGwgY29sbGVjdCBhbGwgdGhvc2UKLQkJLy8gdGhhdCBhcmUgbm90IGVxdWFsIGludG8gb2xkIGFuZCBuZXcgbGlzdHMKLQkJLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgb2xkIGFuZCBuZXcgbm9kZXMKLQkJLy8gYXJlIGJhc2ljYWxseSBjb250aWd1b3VzIC0tIGFuZCB3ZSBmb3JjZSBpdCB0byBiZSBzbywKLQkJLy8gYnkgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyB0bwotCQkvLyBmaW5kIGZpcnN0IGRpZmZlcmVuY2UsIGFuZCB0aGVuIHN0YXJ0aW5nIGF0IHRoZSBlbmQgdG8gZmluZAotCQkvLyBsYXN0IGRpZmZlcmVuY2UuIEV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3ZSBhc3N1bWUgaXMgZGlmZmVyZW50LgotCQkvLwotCQkvLwotCQkvLwotCQkvLyBzdGFydE9mRGlmZmVyZW5jZXMgaXMgdGhlIGluZGV4IGludG8gdGhlIGNvcmUgbm9kZSBsaXN0IHdoZXJlIHRoZQotCQkvLyBmaXJzdCBkaWZmZXJlbmNlCi0JCS8vIG9jY3Vycy4gQnV0IGl0IG1heSBwb2ludCBpbnRvIHRoZSBvbGQgb3IgdGhlIG5ldyBsaXN0LgotCQlpbnQgc3RhcnRPZkRpZmZlcmVuY2VzID0gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNPbGQgPSAtMTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNOZXcgPSAtMTsKLQkJLy8gaWYgb25lIG9mIHRoZSBsaXN0cyBhcmUgc2hvcnRlciB0aGFuIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBzdGFydCwKLQkJLy8gdGhlbgotCQkvLyB0aGVuIHNvbWUgcG9ydGlvbiBvZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbAotCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBvbGROb2Rlcy5nZXRMZW5ndGgoKSkgfHwgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSkpIHsKLQkJCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA8IG5ld05vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gVGhlbiB0aGVyZSBhcmUgbmV3IHJlZ2lvbnMgdG8gYWRkCi0JCQkJLy8gICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCBvbmVzIHRvIG5vdAotCQkJCS8vICAgICBoYXZlIGFueSBlbGVtZW50cywgYW5kIHRoZSB2ZWN0b3Igb2YgbmV3IHJlZ2lvbnMgdG8gaGF2ZQotCQkJCS8vICAgICBqdXN0IHRoZSBuZXcgb25lcyBub3QgaW4gY29tbW9uIHdpdGggdGhlIG9sZCBvbmVzCi0JCQkJLy9zdGFydE9mRGlmZmVyZW5jZXMgc2hvdWxkIGVxdWFsIG9sZE5vZGVzLmdldExlbmd0aCgpLAotCQkJCS8vIGNhbGN1bGF0ZWQgYWJvdmUgb24gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMKLQkJCQltaW5pbWFsT2xkTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkJbWluaW1hbE5ld05vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChuZXdOb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzTmV3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9sZE5vZGVzLmdldExlbmd0aCgpID4gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJLy8gZGVsZXRlIG9sZAotCQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBvbGQgcmVnaW9ucyB0byBkZWxldGUKLQkJCQkJLy8gICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIHJlZ2lvbnMgdG8KLQkJCQkJLy8gICAgY29udGFpbiB0aGUgb25lcyB0byBkZWxldGUsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldwotCQkJCQkvLyByZWdpb25zCi0JCQkJCS8vICAgIG5vdCBoYXZlIGFueSBlbGVtZW50cwotCQkJCQkvL3N0YXJ0T2ZEaWZmZXJlbmNlcyBzaG91bGQgZXF1YWwgbmV3Tm9kZXMuZ2V0TGVuZ3RoKCksCi0JCQkJCS8vIGNhbGN1bGF0ZWQgYWJvdmUgb24gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMKLQkJCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZE5vZGVzLmdldExlbmd0aCgpIC0gMTsKLQkJCQkJbWluaW1hbE9sZE5vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChvbGROb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzT2xkKTsKLQkJCQkJbWluaW1hbE5ld05vZGVzID0gRU1QVFlfTElTVDsKLQkJCQl9IGVsc2UKLQkJCQkJLy8gdW5saWtlbHkgZXZlbnQKLQkJCQkJZXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFdlIGZvdW5kIGEgbm9ybWFsIHN0YXJ0T2ZEaWZmZXJuY2VzLCBidXQgaGF2ZSBub3QgeWV0IGZvdW5kIHRoZQotCQkJLy8gZW5kcy4KLQkJCS8vIFdlJ2xsIGxvb2sgZm9yIHRoZSBlbmQgb2YgZGlmZmVyZW5jZXMgYnkgZ29pbmcgYmFja3dhcmRzIGRvd24KLQkJCS8vIHRoZSB0d28gbGlzdHMuCi0JCQkvLyBIZXJlIHdlIG5lZWQgYSBzZXBlcmF0ZSBpbmRleCBmb3IgZWFjaCBhcnJheSwgc2luY2UgdGhleSBtYXkgYmUKLQkJCS8vIChhbmQKLQkJCS8vIHByb2JhYmx5IGFyZSkgb2YgZGlmZmVyZW50IGxlbmd0aHMuCi0JCQlpbnQgaW5kZXhPbGQgPSBvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQlpbnQgaW5kZXhOZXcgPSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkvLyBUaGUgZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbiBpcyBpbXBvcnRhbnQgdG8gZ2F1cmQgYWdhaW5zdAotCQkJLy8gaW5jb3JyZWN0IGNvdW50aW5nCi0JCQkvLyB3aGVuIHNvbWV0aGluZyBpZGVudGljYWwgaXMgaW5zZXJ0ZWQgdG8gd2hhdCdzIGFscmVhZHkgdGhlcmUKLQkJCS8vIChzZWUgbWluaW1pemF0aW9uIHRlc3QgY2FzZSA1KQotCQkJLy8gTm90ZTogdGhlIGluZGV4T2xkID4gc3RhcnRPZkRpZmZlcmVuY2VzIGtlZXBzIGluZGV4T2xkIGZyb20KLQkJCS8vIGdldHRpbmcgdG9vIHNtYWxsLAotCQkJLy8gc28gdGhhdCB0aGUgc3Vic2VxdWVudCBvbGROb2Rlcy5pdGVtKGluZGV4T2xkKSBpcyBhbHdheXMgdmFsaWQuCi0JCQl3aGlsZSAoKGluZGV4T2xkID49IHN0YXJ0T2ZEaWZmZXJlbmNlcykgJiYgKF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGVzLml0ZW0oaW5kZXhPbGQpKSkpIHsKLQkJCQlpZiAoIShvbGROb2Rlcy5pdGVtKGluZGV4T2xkKS5zYW1lQXMobmV3Tm9kZXMuaXRlbShpbmRleE5ldyksIGZMZW5ndGhEaWZmZXJlbmNlKSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZSBvbGQgb25lLAotCQkJCQkvLyBzbwotCQkJCQkvLyB3ZSBuZWVkIHRvIGJlIHN1cmUgaXRzIHBhcmVudERvY3VtZW50IGlzIHNldCBiYWNrIHRvCi0JCQkJCS8vIHRoZQotCQkJCQkvLyByaWdodCBpbnN0YW5jZQotCQkJCQlvbGROb2Rlcy5pdGVtKGluZGV4T2xkKS5zZXRQYXJlbnREb2N1bWVudChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQl9Ci0JCQkJaW5kZXhPbGQtLTsKLQkJCQlpbmRleE5ldy0tOwotCQkJfQotCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IGluZGV4T2xkOwotCQkJZW5kT2ZEaWZmZXJlbmNlc05ldyA9IGluZGV4TmV3OwotCQkJbWluaW1hbE9sZE5vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChvbGROb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzT2xkKTsKLQkJCW1pbmltYWxOZXdOb2RlcyA9IF9mb3JtTWluaW11bUxpc3QobmV3Tm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc05ldyk7Ci0JCX0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdERvd25TdHJlYW1Ob2RlID0gbnVsbDsKLQkJZXZlbnQgPSByZWdpb25DaGVjayhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlmaXJzdERvd25TdHJlYW1Ob2RlID0gbWluaW1hbE9sZE5vZGVzLml0ZW0oMCkuZ2V0TmV4dCgpOwotCQkJaWYgKGZpcnN0RG93blN0cmVhbU5vZGUgIT0gbnVsbCAmJiBmTGVuZ3RoRGlmZmVyZW5jZSAhPSAwKSB7IC8vIGlmCi0JCQkJLy8gZmlyc3REb3duU3RyZWFtCi0JCQkJLy8gaXMKLQkJCQkvLyBudWxsLAotCQkJCS8vIHRoZW4KLQkJCQkvLyB3ZSdyZQotCQkJCS8vIGF0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZW5kCi0JCQkJLy8gb2YKLQkJCQkvLyB0aGUKLQkJCQkvLyBkb2N1bWVudAotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmFkanVzdFN0YXJ0KGZpcnN0RG93blN0cmVhbU5vZGUsIGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJCX0gLy8KLQkJfSBlbHNlIHsKLQkJCWV2ZW50ID0gbm9kZXNSZXBsYWNlZENoZWNrKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCS8vIG5vdyBzcGxpY2UgdGhlIG5ldyBjaGFpbiBvZiBub2RlcyB0byB3aGVyZSB0aGUgb2xkIGNoYWluIGlzIChvcgotCQkJLy8gd2FzKQotCQkJLy8gdGhlIGZpcnN0RG93blN0cmVhbU5vZGUgKHRoZSBmaXJzdCBvZiB0aG9zZSBhZnRlciB0aGUgbmV3Ci0JCQkvLyBub2RlcykKLQkJCS8vIGlzCi0JCQkvLyByZW1lbWJlcmVkIGFzIGEgdGlueSBvcHRpbWl6YXRpb24uCi0JCQlpZiAobWluaW1hbE9sZE5vZGVzLmdldExlbmd0aCgpID09IDAgJiYgbWluaW1hbE5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCS8vIGlmIG5vIG9sZCBub2RlcyBhcmUgYmVpbmcgZGVsZXRlZCwgdGhlbiB1c2UgdGhlCi0JCQkJLy8gdGhlIG5ld05vZGVzIG9mZnNldCAobWludXMgb25lKSB0byBmaW5kIHRoZSBwb2ludCB0bwotCQkJCS8vIHVwZGF0ZSBkb3duc3RyZWFtIG5vZGVzLCBhbmQgYWZ0ZXIgdXBkYXRpbmcgZG93bnN0cmVhbQotCQkJCS8vIG5vZGVzIHBvc3Rpb25zLCBpbnNlcnQgdGhlIG5ldyBvbmVzLgotCQkJCWludCBpbnNlcnRPZmZzZXQgPSBtaW5pbWFsTmV3Tm9kZXMuaXRlbSgwKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE9sZFVuY2hhbmdlZE5vZGUgPSBudWxsOwotCQkJCWlmIChpbnNlcnRPZmZzZXQgPiAwKSB7Ci0JCQkJCWxhc3RPbGRVbmNoYW5nZWROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRPZmZzZXQgLSAxKTsKLQkJCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IGxhc3RPbGRVbmNoYW5nZWROb2RlLmdldE5leHQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB3ZSdyZSBpbnNlcnRpbmcgYXQgdmVyeSBiZWdpbm5pbmcKLQkJCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJLy8gU0lERSBFRkZFQ1Q6IGNoYW5nZSB0aGUgZmlyc3ROb2RlIHBvaW50ZXIgaWYgd2UncmUKLQkJCQkJLy8gaW5zZXJ0aW5nIGF0IGJlZ2lubmluZwotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldEZpcnN0RG9jdW1lbnRSZWdpb24obWluaW1hbE5ld05vZGVzLml0ZW0oMCkpOwotCQkJCX0KLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJaW5zZXJ0Tm9kZXMobGFzdE9sZFVuY2hhbmdlZE5vZGUsIGZpcnN0RG93blN0cmVhbU5vZGUsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkJLy8gdGhpcyAobm9kZXMgcmVwbGFjZWQpIGlzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgd2UgbmVlZCB0bwotCQkJCS8vIHVwZGF0ZSB0aGUgY2FjaGVkIE5vZGUKLQkJCQlyZVNldENhY2hlZE5vZGUobWluaW1hbE9sZE5vZGVzLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlmaXJzdERvd25TdHJlYW1Ob2RlID0gc3dpdGNoTm9kZUxpc3RzKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCQkvLyBubyBuZWVkIHRvIGFkanVzdCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgbm9kZXMgdGhlbXNlbHZlcywKLQkJCQkvLyB0aGV5Ci0JCQkJLy8gYXJlIGFscmVhZHkgY29ycmVjdCwgYnV0IHdlIGRvIG5lZWQgdG8KLQkJCQkvLyBhZGp1c3QgYWxsICJkb3duIHN0cmVhbSIgbm9kZXMgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZQotCQkJCS8vIGluc2VydGlvbiBvciBkZWxldGlvbgotCQkJCS8vIC0tLSBhZGp1c3RtZW50IG1vdmVkIHRvIGNhbGxpbmcgbWV0aG9kLgotCQkJCWlmIChmaXJzdERvd25TdHJlYW1Ob2RlICE9IG51bGwpIHsKLQkJCQkJLy8gJiYgZXZlbnQgIT0gbnVsbAotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJfSAvLwotCQkJCS8vIHRoaXMgKG5vZGVzIHJlcGxhY2VkKSBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUgdGhlIGNhY2hlZCBOb2RlCi0JCQkJcmVTZXRDYWNoZWROb2RlKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYWJzdHJhY3QuCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG5vZGVzUmVwbGFjZWRDaGVjayhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLyBhY3R1YWxseSwgbm90aGluZyB0byBjaGVjayBoZXJlLCBzaW5jZSAoYW5kIGFzc3VtaW5nKSB3ZSd2ZSBhbHJlYWR5Ci0JCS8vIG1pbmltaXplZCB0aGUgbnVtYmVyIG9mIG5vZGVzLCBhbmQgcnVsZWQgb3V0IG1lcmUgcmVnaW9uIGNoYW5nZXMKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGVzLCBuZXdOb2RlcywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gYWxsb3cgYW55IGhldXJpc3RpYyAicXVpY2sgY2hlY2tzIiB0aGF0IG1pZ2h0IGNvdmVyIG1hbnkKLQkgKiBtYW55IGNhc2VzLCBiZWZvcmUgZXhwZW5kaW5nIHRoZSB0aW1lIG9uIGEgZnVsbCByZXBhcnNlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcXVpY2tDaGVjaygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIGRpcnR5IHN0YXJ0IGlzIG51bGwsIHRoZW4gd2UgaGF2ZSBhbiBlbXB0eSBkb2N1bWVudC4KLQkJLy8gaW4gd2hpY2ggY2FzZSB3ZSdsbCByZXR1cm4gbnVsbCBzbyBldmVyeXRoaW5nIGNhbiBiZQotCQkvLyByZXBhcnNlZCAiZnJvbSBzY3JhdGNoIiAuIElmIGl0cyBub3QgbnVsbCwgd2UnbGwgZ2l2ZSB0aGUgZmxhdG5vZGUKLQkJLy8gYQotCQkvLyBjaGFuY2UKLQkJLy8gdG8gaGFuZGxlLCBidXQgb25seSBpZiB0aGVyZSBpcyBvbmUgZmxhdG5vZGUgaW52b2x2ZWQuCi0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwgJiYgZGlydHlTdGFydCA9PSBkaXJ0eUVuZCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YXJnZXROb2RlID0gZGlydHlTdGFydDsKLQkJCXJlc3VsdCA9IGRpcnR5U3RhcnQudXBkYXRlUmVnaW9uKGZSZXF1ZXN0ZXIsIHRhcmdldE5vZGUsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJLy8gYXQgdGhpcyBwb2ludCBvbmx5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGV4dCBzdG9yZSBhbmQKLQkJCQkvLyBhbmQgZG93bnN0cmVhbSBub2Rlcy4KLQkJCQkvLyBGVVRVUkVfVE9fRE86IGNhbiB0aGlzIGRlcGVuZGVuY3kgb24gc3RydWN0dXJlZERvY3VtZW50Ci0JCQkJLy8gbWV0aG9kIGJlIGVsaW1pbmF0ZWQ/Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC51cGRhdGVEb2N1bWVudERhdGEoZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlLCBmQ2hhbmdlcyk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdERvd25TdHJlYW1Ob2RlID0gdGFyZ2V0Tm9kZS5nZXROZXh0KCk7Ci0JCQkJLy8gdGhlbiBmbGF0bm9kZSBtdXN0IGhhdmUgYmVlbiB0aGUgbGFzdCBvbmUsIHNvIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUKLQkJCQkvLyBhbnkgZG93bnN0cmVhbSBvbmVzCi0JCQkJaWYgKGZpcnN0RG93blN0cmVhbU5vZGUgIT0gbnVsbCkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnNldERlbGV0ZWRUZXh0KGZEZWxldGVkVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBvbmx5IG9uZSBub2RlIGlzIGludm9sdmVkLCBzZWVzIGhvdyBtYW55IHJlZ2lvbnMgYXJlIGNoYW5nZWQuIElmCi0JICogb25seSBvbmUsIHRoZW4gaXRzIGEgJ3JlZ2lvbkNoYW5nZWQnIGV2ZW50IC4uLiBpZiBtb3JlIHRoYW4gb25lLCBpdHMgYQotCSAqICdyZWdpb25zUmVwbGFjZWQnIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZWdpb25DaGVjayhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnJlZ2lvbnNSZXBsYWNlZENoZWNrIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCi0JCS8vIHRoZSAicmVnaW9uc1JlcGxhY2VkIiBldmVudCBjb3VsZCBvbmx5IGJlIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlCi0JCS8vIG5vZGVsaXN0cwotCQkvLyBhcmUgZWFjaCBvbmx5ICIxIiBpbiBsZW5ndGguCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBvbGRMZW5ndGggPSBvbGROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJaW50IG5ld0xlbmd0aCA9IG5ld05vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoKG9sZExlbmd0aCAhPSAxKSB8fCAobmV3TGVuZ3RoICE9IDEpKSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlID0gb2xkTm9kZXMuaXRlbSgwKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG5ld05vZGVzLml0ZW0oMCk7Ci0JCQlyZXN1bHQgPSByZWdpb25DaGVjayhvbGROb2RlLCBuZXdOb2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIG9ubHkgb25lIG5vZGUgaXMgaW52b2x2ZWQsIHNlZXMgaG93IG1hbnkgcmVnaW9ucyBhcmUgY2hhbmdlZC4gSWYKLQkgKiBvbmx5IG9uZSwgdGhlbiBpdHMgYSAncmVnaW9uQ2hhbmdlZCcgZXZlbnQgLi4uIGlmIG1vcmUgdGhhbiBvbmUsIGl0cyBhCi0JICogJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlZ2lvbkNoZWNrKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlKSB7Ci0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gb2xkTm9kZS5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gbmV3Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uW10gb2xkUmVnaW9uc0FycmF5ID0gb2xkUmVnaW9ucy50b0FycmF5KCk7Ci0JCUlUZXh0UmVnaW9uW10gbmV3UmVnaW9uc0FycmF5ID0gbmV3UmVnaW9ucy50b0FycmF5KCk7Ci0JCS8vCi0JCS8vIGZvciB0aGUgJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQsIHdlIGRvbid0IGNhcmUgaWYKLQkJLy8gdGhlIHJlZ2lvbnMgY2hhbmdlZCBkdWUgdG8gdHlwZSwgb3IgdGV4dCwKLQkJLy8gd2UnbGwganVzdCBjb2xsZWN0IGFsbCB0aG9zZSB0aGF0IGFyZSBub3QgZXF1YWwKLQkJLy8gaW50byB0aGUgb2xkIGFuZCBuZXcgcmVnaW9uIGxpc3RzLgotCQkvLyBOb3RlOiB3ZSwgb2YgY291cnNlLCBhc3N1bWUgdGhhdCBvbGQgYW5kIG5ldyByZWdpb25zCi0JCS8vIGFyZSBiYXNpY2FsbHkgY29udGlndW91cyAtLSBhbmQgd2UgZm9yY2UgaXQgdG8gYmUgc28sCi0JCS8vIGV2ZW4gaWYgbm90IGxpdGVyYWxseSBzbywgYnkgc3RhcnRpbmcgYXQgYmVnaW5uaW5nIHRvCi0JCS8vIGZpbmQgZmlyc3QgZGlmZmVyZW5jZSwgYW5kIHRoZW4gc3RhcnRpbmcgYXQgZW5kIHRvIGZpbmQKLQkJLy8gbGFzdCBkaWZmZXJlbmNlLiBFdmVyeXRoaW5nIGluIGJldHdlZW4gd2UgYXNzdW1lIGlzIGRpZmZlcmVudC4KLQkJLy8KLQkJLy8gZ29pbmcgdXAgaXMgZWFzeSwgd2Ugc3RhcnQgYXQgemVybyBpbiBlYWNoLCBhbmQgY29udGludWUKLQkJLy8gdGlsbCByZWdpb25zIGFyZSBub3QgdGhlIHNhbWUuCi0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSBfY29tcHV0ZVN0YXJ0T2ZEaWZmZXJlbmNlcyhvbGROb2RlLCBvbGRSZWdpb25zLCBuZXdOb2RlLCBuZXdSZWdpb25zKTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNPbGQgPSAtMTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNOZXcgPSAtMTsKLQkJLy8KLQkJLy8KLQkJLy8gaWYgb25lIG9mIHRoZSBsaXN0cyBhcmUgc2hvcnRlciB0aGFuIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBzdGFydCwKLQkJLy8gdGhlbgotCQkvLyB0aGVuIHNvbWUgcG9ydGlvbiBvZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbAotCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBvbGRSZWdpb25zLnNpemUoKSkgfHwgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBuZXdSZWdpb25zLnNpemUoKSkpIHsKLQkJCWlmIChvbGRSZWdpb25zLnNpemUoKSA8IG5ld1JlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJLy8gSU5TRVJUIENBU0UKLQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBuZXcgcmVnaW9ucyB0byBhZGQKLQkJCQkvLyAgICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIG9uZXMgdG8gbm90Ci0JCQkJLy8gICAgIGhhdmUgYW55IGVsZW1lbnRzLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcgcmVnaW9ucyB0byBoYXZlCi0JCQkJLy8gICAgIGp1c3QgdGhlIG5ldyBvbmVzLgotCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGg7Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoIC0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpID4gbmV3UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJLy8gREVMRVRFIENBU0UKLQkJCQkJLy8gdGhlbiB0aGVyZSBhcmUgb2xkIHJlZ2lvbnMgdG8gZGVsZXRlCi0JCQkJCS8vICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCByZWdpb25zIHRvCi0JCQkJCS8vICAgIGNvbnRhaW4gdGhlIG9uZXMgdG8gZGVsZXRlLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyAgICBub3QgaGF2ZSBhbnkgZWxlbWVudHMKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aDsKLQkJCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZWxzZSB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCEKLQkJCQkJLy8gdW5saWtlbHkgZXZlbnQsIHByb2JhYmx5IGVycm9yIGluIGN1cnJlbnQgZGVzaWduLCBzaW5jZQotCQkJCQkvLyB3ZSBjaGVjayBmb3IgaWRlbnRpdHkgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCi0JCQkJCS8vIHJlcGFyc2luZy4KLQkJCQkJcmVzdWx0ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChzdGFydE9mRGlmZmVyZW5jZXMgPiAtMSkgJiYgKGVuZE9mRGlmZmVyZW5jZXNPbGQgPCAwKSAmJiAoZW5kT2ZEaWZmZXJlbmNlc05ldyA8IDApKSB7Ci0JCQkJLy8gV2UgZm91bmQgYSBub3JtYWwgc3RhcnRPZkRpZmZlcm5jZXMsIGJ1dCBoYXZlIG5vdCB5ZXQgZm91bmQKLQkJCQkvLyB0aGUgZW5kcy4KLQkJCQkvLyBXZSdsbCBsb29rIGZvciB0aGUgZW5kIG9mIGRpZmZlcmVuY2VzIGJ5IGdvaW5nIGJhY2t3YXJkcwotCQkJCS8vIGRvd24gdGhlIHR3byBsaXN0cy4KLQkJCQkvLyBIZXJlIHdlIG5lZWQgYSBzZXBlcmF0ZSBpbmRleCBmb3IgZWFjaCBhcnJheSwgc2luY2UgdGhleQotCQkJCS8vIG1heQotCQkJCS8vIGJlIChhbmQKLQkJCQkvLyBwcm9iYWJseSBhcmUpIG9mIGRpZmZlcmVudCBsZW5ndGhzLgotCQkJCWludCBpbmRleE9sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCWludCBpbmRleE5ldyA9IG5ld1JlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCXdoaWxlICgoaW5kZXhPbGQgPj0gc3RhcnRPZkRpZmZlcmVuY2VzKSAmJiAoX2dyZWF0ZXJUaGFuRWZmZWN0ZWRSZWdpb24ob2xkTm9kZSwgb2xkUmVnaW9uc0FycmF5W2luZGV4T2xkXSkpKSB7Ci0JCQkJCWlmICgoIShvbGROb2RlLnNhbWVBcyhvbGRSZWdpb25zQXJyYXlbaW5kZXhPbGRdLCBuZXdOb2RlLCBuZXdSZWdpb25zQXJyYXlbaW5kZXhOZXddLCBmTGVuZ3RoRGlmZmVyZW5jZSkpKSkgewotCQkJCQkJLy9lbmRPZkRpZmZlcmVuY2VzT2xkID0gaW5kZXhPbmU7Ci0JCQkJCQkvL2VuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleFR3bzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWluZGV4T2xkLS07Ci0JCQkJCWluZGV4TmV3LS07Ci0JCQkJfQotCQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9sZDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gaW5kZXhOZXc7Ci0JCQl9Ci0JCX0KLQkJLy8KLQkJLy8gcmVzdWx0ICE9IG51bGwgbWVhbnMgdGhlIGltcG9zc2libGUgY2FzZSBhYm92ZSBvY2N1cnJlZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIE5vdyBmb3JtIHRoZSB0d28gdmVjdG9ycyBvZiBkaWZmZXJlbnQgcmVnaW9ucwotCQkJSVRleHRSZWdpb25MaXN0IGhvbGRPbGRSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQkJSVRleHRSZWdpb25MaXN0IGhvbGROZXdSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xICYmIGVuZE9mRGlmZmVyZW5jZXNPbGQgPiAtMSkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydE9mRGlmZmVyZW5jZXM7IGkgPD0gZW5kT2ZEaWZmZXJlbmNlc09sZDsgaSsrKSB7Ci0JCQkJCWhvbGRPbGRSZWdpb25zLmFkZChvbGRSZWdpb25zQXJyYXlbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzdGFydE9mRGlmZmVyZW5jZXMgPiAtMSAmJiBlbmRPZkRpZmZlcmVuY2VzTmV3ID4gLTEpIHsKLQkJCQlmb3IgKGludCBpID0gc3RhcnRPZkRpZmZlcmVuY2VzOyBpIDw9IGVuZE9mRGlmZmVyZW5jZXNOZXc7IGkrKykgewotCQkJCQlob2xkTmV3UmVnaW9ucy5hZGQobmV3UmVnaW9uc0FycmF5W2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaG9sZE9sZFJlZ2lvbnMuc2l6ZSgpID09IDAgJiYgaG9sZE5ld1JlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCQkvLyB0aGVuIHRoaXMgbWVhbnMgdGhlIHJlZ2lvbnMgd2VyZSBpZGVudGljYWwsIHdoaWNoIG1lYW5zCi0JCQkJLy8gc29tZW9uZQotCQkJCS8vIHBhc3RlZCBleGFjdGx5IHRoZSBzYW1lIHRoaW5nIHRoZXkgaGFkIHNlbGVjdGVkLCBvciAhISEKLQkJCQkvLyBzb21lb25lIGRlbGV0ZWQgdGhlIGVuZCBicmFja2V0IG9mIHRoZSB0YWcuICEhIT8KLQkJCQlyZXN1bHQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9JZiBib3RoIGhvbGRPbGRSZWdpb25zIGFuZCBob2xkTmV3UmVnaW9ucyBhcmUgb2YgbGVuZ3RoIDEsCi0JCQkJLy8gdGhlbiBpdHMKLQkJCQkvLyBhICJyZWdpb24gY2hhbmdlZCIgZXZlbnQsIGVsc2UgYSAicmVnaW9ucyByZXBsYWNlZCIgZXZlbnQuCi0JCQkJLy8gc28gd2Ugd2FudCB0aGUgbmV3IGluc3RhbmNlIG9mIHJlZ2lvbiB0byBiZWNvbWUgcGFydCBvZiB0aGUKLQkJCQkvLyBvbGQgaW5zdGFuY2Ugb2Ygb2xkIG5vZGUKLQkJCQlpZiAoKGhvbGRPbGRSZWdpb25zLnNpemUoKSA9PSAxKSAmJiAoaG9sZE5ld1JlZ2lvbnMuc2l6ZSgpID09IDEpICYmIF9yZWdpb25zU2FtZUtpbmQoKGhvbGROZXdSZWdpb25zLmdldCgwKSksIChob2xkT2xkUmVnaW9ucy5nZXQoMCkpKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXdPbGRSZWdpb24gPSBzd2FwTmV3Rm9yT2xkUmVnaW9uKG9sZE5vZGUsIGhvbGRPbGRSZWdpb25zLmdldCgwKSwgbmV3Tm9kZSwgaG9sZE5ld1JlZ2lvbnMuZ2V0KDApKTsKLQkJCQkJLy8gLS0gbmVlZCB0byB1cGRhdGUgYW55IGRvd24gc3RyZWFtIHJlZ2lvbnMsIHdpdGhpbiB0aGlzCi0JCQkJCS8vICdvbGROb2RlJwotCQkJCQl1cGRhdGVEb3duU3RyZWFtUmVnaW9ucyhvbGROb2RlLCBuZXdPbGRSZWdpb24pOwotCQkJCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGUsIG5ld09sZFJlZ2lvbiwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVwbGFjZVJlZ2lvbnMob2xkTm9kZSwgaG9sZE9sZFJlZ2lvbnMsIG5ld05vZGUsIGhvbGROZXdSZWdpb25zKTsKLQkJCQkJLy8gLS0gbmVlZCB0byB1cGRhdGUgYW55IGRvd24gc3RyZWFtIHJlZ2lvbnMsIHdpdGhpbiB0aGlzCi0JCQkJCS8vICdvbGROb2RlJwotCQkJCQkvLyBkb24ndCBuZWVkIHdpdGggdGhlIHdheSByZXBsYWNlUmVnaW9ucyBpcyBpbXBsZW1lbnRlZC4KLQkJCQkJLy8gSXQgaGFuZGxlcy4KLQkJCQkJLy9pZihob2xkTmV3UmVnaW9ucy5zaXplKCkgPiAwKQotCQkJCQkvL3VwZGF0ZURvd25TdHJlYW1SZWdpb25zKG9sZE5vZGUsIChJVGV4dFJlZ2lvbikKLQkJCQkJLy8gaG9sZE5ld1JlZ2lvbnMubGFzdEVsZW1lbnQoKSk7Ci0JCQkJCXJlc3VsdCA9IG5ldyBSZWdpb25zUmVwbGFjZWRFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBvbGROb2RlLCBob2xkT2xkUmVnaW9ucywgaG9sZE5ld1JlZ2lvbnMsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFuIGVudHJ5IHBvaW50IGZvciByZXBhcnNpbmcuIEl0IGNhbGN1bGF0ZXMgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eQotCSAqIGVuZCBmbGF0bm9kZXMgYmFzZWQgb24gdGhlIHN0YXJ0IHBvaW50IGFuZCBsZW5ndGggb2YgdGhlIGNoYW5nZXMuCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNhY2hlZE5vZGUsIHRoZW4gdGhlIGRvY3VtZW50Ci0JCS8vIG11c3QgYmUgZW1wdHksIHNvIHNpbXBseSB1c2UgJ251bGwnIGFzIHRoZSBkaXJ0eVN0YXJ0IGFuZCBkaXJ0eUVuZAotCQkvLyBvdGhlcndpc2UsIGZpbmQgdGhlbS4KLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlmaW5kRGlydHlTdGFydChmU3RhcnQpOwotCQkJaW50IGVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2U7Ci0JCQlmaW5kRGlydHlFbmQoZW5kKTsKLQkJfQotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrSGV1cmlzdGljcygpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCX0KLQkJZW5kUmVQYXJzZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFuIGVudHJ5IHBvaW50IGZvciByZXBhcnNpbmcuIEl0IGNhbGN1bGF0ZXMgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eQotCSAqIGVuZCBmbGF0bm9kZXMgYmFzZWQgb24gc3VnZ2VzdGVkIHBvc2l0aW9ucyB0byBiZWdpbiBhbmQgZW5kLiBUaGlzIGlzCi0JICogbmVlZGVkIGZvciBjYXNlcyB3aGVyZSBwYXJzaW5nIG11c3QgZ28gYmV5b25kIHRoZSBpbW1lZGlhdGUgbm9kZSBhbmQKLQkgKiBpdHMgZGlyZWN0IG5laWdoYm9ycy4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoaW50IHJlU2NhblN0YXJ0SGludCwgaW50IHJlU2NhbkVuZEhpbnQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgd2UgZG8gbm90IGhhdmUgYSBjYWNoZWROb2RlLCB0aGVuIHRoZSBkb2N1bWVudAotCQkvLyBtdXN0IGJlIGVtcHR5LCBzbyBzaW1wbHkgdXNlICdudWxsJyBhcyB0aGUgZGlydHlTdGFydCBhbmQgZGlydHlFbmQKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlmaW5kRGlydHlTdGFydChyZVNjYW5TdGFydEhpbnQpOwotCQkJZmluZERpcnR5RW5kKHJlU2NhbkVuZEhpbnQpOwotCQl9Ci0JCXJlc3VsdCA9IHJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCQlpc1BhcnNpbmcgPSBmYWxzZTsKLQkJLy8gZGVidWcKLQkJLy92ZXJpZnlTdHJ1Y3R1cmVkKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvcmUgcmVwYXJzaW5nIG1ldGhvZCAuLi4gYWZ0ZXIgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eSBlbmQgaGF2ZQotCSAqIGJlZW4gY2FsY3VsYXRlZCBlbHNld2hlcmUuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eVN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5RW5kKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCByZXNjYW5TdGFydCA9IC0xOwotCQlpbnQgcmVzY2FuRW5kID0gLTE7Ci0JCWJvb2xlYW4gZmlyc3RUaW1lID0gZmFsc2U7Ci0JCS8vCi0JCS8vICJzYXZlIiB0aGUgb2xkTm9kZXMgKHRoYXQgbWF5IGJlIHJlcGxhY2VkKSBpbiBhIGxpc3QKLQkJQ29yZU5vZGVMaXN0IG9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJaWYgKGRpcnR5U3RhcnQgPT0gbnVsbCB8fCBkaXJ0eUVuZCA9PSBudWxsKSB7Ci0JCQkvLyBkaXJ0eVN0YXJ0IG9yIGRpcnR5IGVuZCBhcmUgbnVsbCwgdGhlbiB0aGF0IG1lYW5zIHdlIGRpZG4ndAotCQkJLy8gaGF2ZQotCQkJLy8gYQotCQkJLy8gY2FjaGVkIG5vZGUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgYW4gZW1wdHkgZG9jdW1lbnQsIHNvIHdlCi0JCQkvLyBqdXN0IG5lZWQgdG8gcmVzY2FuIHRoZSBjaGFuZ2VzCi0JCQlyZXNjYW5TdGFydCA9IDA7Ci0JCQlyZXNjYW5FbmQgPSBmQ2hhbmdlcy5sZW5ndGgoKTsKLQkJCWZpcnN0VGltZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJcmVzY2FuU3RhcnQgPSBkaXJ0eVN0YXJ0LmdldFN0YXJ0KCk7Ci0JCQkvLwotCQkJLy8gc2V0IHRoZSBlbmQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQkvLyBub3RpY2Ugd2UgdXNlIHRoZSBzYW1lIHJhdGlvbmFsZSBhcyBmb3IgdGhlIHJlc2NhblN0YXJ0LAotCQkJLy8gd2l0aCB0aGUgYWRkZWQgY2F2ZWF0IHRoYXQgbGVuZ3RoIGhhcyB0byBiZSBhZGRlZCB0byBpdCwKLQkJCS8vIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBuZXcgdGV4dCB3aGljaCBoYXMgYmVlbiBhZGRlZCBvciBkZWxldGVkLgotCQkJLy8gSWYgY2hhbmdlcyBoYXMgemVybyBsZW5ndGgsIHRoZW4gImxlbmd0aCIgd2lsbCBiZSBuZWdhdGl2ZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyB3ZSBhcmUgZGVsZXRpbmcgdGV4dC4gT3RoZXJ3aXNlLCB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkJLy8gd2hhdCdzIHNlbGVjdGVkIHRvIGJlIHJlcGxhY2VkIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgdGV4dC4KLQkJCXJlc2NhbkVuZCA9IGRpcnR5RW5kLmdldEVuZCgpICsgZkxlbmd0aERpZmZlcmVuY2U7Ci0JCX0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgb2xkIHN0dWZmICJzYXZlZCIgYXdheSwgdXBkYXRlIHRoZSBkb2N1bWVudAotCQkvLyB3aXRoIHRoZSBjaGFuZ2VzLgotCQkvLyBGVVRVUkVfVE9fRE8gLS0gZG9uJ3QgZmlyZSAiZG9jdW1lbnQgY2hhbmdlZCIgZXZlbnQgdGlsbCBsYXRlcgotCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tIG5vdyB0aGUgcmVhbCB3b3JrCi0JCXJlc3VsdCA9IGNvcmVfcmVwYXJzZShyZXNjYW5TdGFydCwgcmVzY2FuRW5kLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJLy8KLQkJLy8gZXZlbnQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW5jYXNlIHRoZXJlIGlzCi0JCS8vIHNvbWUgb3BpdG1pemF0aW9uIHRoZXkgY2FuIGRvCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucykgewotCQlpbnQgaW5zZXJ0UG9zID0gLTE7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gb2xkTm9kZS5nZXRSZWdpb25zKCk7Ci0JCS8vIG1ha2UgYSBmYWtlIGZsYXRub2RlIHRvIGJlIG5ldyBwYXJlbnQgb2Ygb2xkUmVnaW9ucywgc28gdGhlaXIgdGV4dAotCQkvLyB3aWxsIGJlIHJpZ2h0LgotCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaG9sZE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldwotCQkvLyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGROb2RlKTsKLQkJLy8KLQkJLy8gbmVlZCB0byByZXNldCB0aGUgcGFyZW50IG9mIHRoZSBuZXcgdG8tYmUtaW5zZXJ0ZWQgcmVnaW9ucyB0byBiZQotCQkvLyB0aGUKLQkJLy8gc2FtZSBvbGROb2RlIHRoYXQgaXMgdGhlIG9uZSBoYXZpbmcgaXRzIHJlZ2lvbnMgY2hhbmdlZAotCQkvLyBEVywgNC8xNi8yMDAzLCByZW1vdmVkIHNpbmNlIElUZXh0UmVnaW9uIG5vIGxvbmdlciBoYXMgcGFyZW50LgotCQkvLyAJCUlUZXh0UmVnaW9uQ29udGFpbmVyIG9sZFBhcmVudCA9IG9sZE5vZGU7Ci0JCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1JlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCQlBYnN0cmFjdFJlZ2lvbiByZWdpb24gPSAoQWJzdHJhY3RSZWdpb24pIG5ld1JlZ2lvbnMuZWxlbWVudEF0KGkpOwotCQkvLwkJCXJlZ2lvbi5zZXRQYXJlbnQob2xkUGFyZW50KTsKLQkJLy8JCX0KLQkJLy8gaWYgdGhlcmUgYXJlIG5vIG9sZCByZWdpb25zLCBpbnNlcnQgdGhlIG5ldyByZWdpb25zIGFjY29yZGluZyB0bwotCQkvLyBvZmZzZXQKLQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCUlUZXh0UmVnaW9uIGZpcnN0TmV3UmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoMCk7Ci0JCQlpbnQgZmlyc3RPZmZzZXQgPSBuZXdOb2RlLmdldFN0YXJ0T2Zmc2V0KGZpcnN0TmV3UmVnaW9uKTsKLQkJCS8vIGlmIGF0IGJlZ2lubmluZywgaW5zZXJ0IHRoZXJlCi0JCQlpZiAoZmlyc3RPZmZzZXQgPT0gMCkgewotCQkJCWluc2VydFBvcyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8vCi0JCQkJSVRleHRSZWdpb24gcmVnaW9uQXRPZmZzZXQgPSBvbGROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZpcnN0T2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uQXRPZmZzZXQgPT0gbnVsbCkKLQkJCQkJaW5zZXJ0UG9zID0gcmVnaW9ucy5zaXplKCk7Ci0JCQkJZWxzZQotCQkJCQlpbnNlcnRQb3MgPSByZWdpb25zLmluZGV4T2YocmVnaW9uQXRPZmZzZXQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gZWxzZSwgZGVsZXRlIG9sZCBvbmVzIGJlZm9yZSBpbnNlcnRpbmcgbmV3IG9uZXMgaW4gdGhlaXIgcGxhY2UKLQkJCUlUZXh0UmVnaW9uIGZpcnN0T2xkUmVnaW9uID0gb2xkUmVnaW9ucy5nZXQoMCk7Ci0JCQlpbnNlcnRQb3MgPSByZWdpb25zLmluZGV4T2YoZmlyc3RPbGRSZWdpb24pOwotCQkJcmVnaW9ucy5yZW1vdmVBbGwob2xkUmVnaW9ucyk7Ci0JCX0KLQkJcmVnaW9ucy5hZGRBbGwoaW5zZXJ0UG9zLCBuZXdSZWdpb25zKTsKLQkJLy8gbm93IHJlZ2lvbnMgdmVjdG9yIG9mIGVhY2ggbm9kZSBzaG91bGQgYmUgb2YgZXF1YWwgbGVuZ3RoLAotCQkvLyBzbyBnbyB0aHJvdWdoIGVhY2gsIGFuZCBtYWtlIHN1cmUgdGhlIG9sZCByZWdpb25zCi0JCS8vIG9mZnNldHMgbWF0Y2hlcyB0aGUgbmV3IHJlZ2lvbnMgb2Zmc2V0cwotCQkvLyAod2UnbGwganVzdCBhc3NpZ24gdGhlbSBhbGwsIGJ1dCBjb3VsZCBiZSBzbGlnaHRseSBtb3JlIGVmZmllY2llbnQpCi0JCUlUZXh0UmVnaW9uTGlzdCBhbGxOZXdSZWdpb25zID0gbmV3Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gbmV4dE9sZGlzaFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJSVRleHRSZWdpb24gbmV4dE5ld1JlZ2lvbiA9IGFsbE5ld1JlZ2lvbnMuZ2V0KGkpOwotCQkJbmV4dE9sZGlzaFJlZ2lvbi5lcXVhdGVQb3NpdGlvbnMobmV4dE5ld1JlZ2lvbik7Ci0JCQljaGVja0FuZEFzc2lnblBhcmVudChvbGROb2RlLCBuZXh0T2xkaXNoUmVnaW9uKTsKLQkJfQotCQlvbGROb2RlLnNldExlbmd0aChuZXdOb2RlLmdldExlbmd0aCgpKTsKLQkJb2xkTm9kZS5zZXRFbmRlZChuZXdOb2RlLmlzRW5kZWQoKSk7Ci0JCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQobmV3Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpKTsKLQkJLy8gcmVtb3ZlZCBjb25jZXB0IG9mIHBhcnQgb2YgdGhlc2UgcmVnaW9ucywgc28gbm8gbG9uZ2VyIG5lZWQgdG8gZG8uCi0JCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIG9sZFJlZ2lvbnMuZWxlbWVudEF0KGkpOwotCQkvLwkJCXJlZ2lvbi5zZXRQYXJlbnQoaG9sZE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCS8vCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlU2V0Q2FjaGVkTm9kZShDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLyB1c2UgdGhlIGxhc3QgbmV3Tm9kZSBhcyB0aGUgbmV3IGNhY2hlZE5vZGUgcG9zdGlvbiwgdW5sZXNzIGl0cyBudWxsCi0JCS8vIChlLmcuIHdoZW4gbm9kZXMgYXJlIGRlbGV0ZWQpIGluIHdoaWNoIGNhc2UsIGFzc2lnbgotCQkvLyBpdCB0byBhICJzYWZlIiBub2RlIHNvIHdlIGRvbid0IGxvc2UgcmVmZXJlbmNlIHRvIHRoZQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQhCi0JCWlmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCS8vIHVzZSBsYXN0IG5ldyBub2RlIGFzIHRoZSBjYWNoZQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSkpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgY2FjaGVkTm9kZSBpcyBhbiBvbGQgbm9kZSwgdGhlbiB3ZSdyZSBpbiB0cm91YmxlOgotCQkJLy8gd2UgY2FuJ3QgbGVhdmUgaXQgYXMgdGhlIGNhY2hlZCBub2RlISBhbmQgaXRzIGFscmVhZHkKLQkJCS8vIGJlZW4gZGlzY29ubmVjdGVkIGZyb20gdGhlIG1vZGVsLCBzbyB3ZSBjYW4ndCBkbyBnZXROZXh0Ci0JCQkvLyBvciBnZXRQcmV2aW91cywgc28gd2UnbGwgZ2V0IG9uZSB0aGF0IGlzIHJpZ2h0IGJlZm9yZQotCQkJLy8gKG9yIHJpZ2h0IGFmdGVyKSB0aGUgb2Zmc2V0IG9mIHRoZSBvbGQgbm9kZXMgdGhhdCBhcmUgYmVpbmcKLQkJCS8vIGRlbGV0ZWQuCi0JCQkvLyAKLQkJCS8vIGlmIG5ld05vZGVzSGVhZCBhbmQgY2FjaGVkTm9kZSBhcmUgYm90aCBudWxsLCB0aGVuCi0JCQkvLyBpdCBtZWFucyB3ZSB3ZXJlIGFza2VkIHRvIGluc2VydCBhbiBlbXB0eSBzdHJpbmcgaW50bwotCQkJLy8gYW4gZW1wdHkgZG9jdW1lbnQuIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlCi0JCQkvLyAodGhhdCBpcywgd2UgaGF2ZSBubyBub2RlIHRvIGNhY2hlKQotCQkJLy8gc2ltaWxhcmx5IGlmIHRoZXJlIGFyZSBubyBuZXcgbm9kZXMgYW5kIG5vIG9sZCBub2RlcyB0aGVuCi0JCQkvLyBub3RoaW5nIHRvIGRvIChidXQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuIC4uLiB3ZSBzaG91bGRuJ3QKLQkJCS8vIGdldCB0aGVyZSBpZiB0aGVyZSBpcyBubyBldmVudCB0byBnZW5lcmF0ZSkuCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJCS8vIG5vdGU6IHdlIGNhbid0IHNpbXBsZSB1c2Ugbm9kZUF0Q2hhcmFjdGVyT2Zmc2V0LCBzaW5jZSBpdAotCQkJCS8vIGRlcGVuZHMgb24gY2FjaGVkTm9kZS4KLQkJCQlpZiAob2xkTm9kZXMuaW5jbHVkZXMoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpKSkKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJfQotCQkJaWYgKChmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgJiYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgaGFwcGVuIG5vdyBsZWdpdGFtYXRlbHkgd2hlbiBhbGwgdGV4dCBpcyBkZWxldGVkCi0JCQkJLy8gZnJvbSBhIGRvY3VtZW50Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjo6cmVTZXRDYWNoZWROb2RlOiBjb3VsZCBub3QgZmluZCBhIG5vZGUgdG8gY2FjaGUhIChpdHMgb2sgaWYgYWxsIHRleHQgZGVsZXRlZCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCS8vIE5PVEU6IHRoaXMgbWV0aG9kIChhbmQgY2xhc3MpIGRlcGVuZCBvbiBiZWluZyBhYmxlIHRvCi0JCS8vIGRvIHRoZSBmb2xsb3dpbmcgY2FzdCAoaS5lLiByZWZlcmVuY2VzIHNvbWUgZmllbGRzIGRpcmVjdGx5KQotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCWZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNwbGljZShDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0T2xkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5ldyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE9sZCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5ldyA9IG51bGw7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkUHJldmlvdXMgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5leHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0ID0gbnVsbDsKLQkJLy8KLQkJLy8gaWYgY2FsbGVkIHdpdGggYm90aCBhcmd1bWVudHMgZW1wdHkgbGlzdHMsIHdlIGNhbiBkaXNyZWdhcmQuCi0JCS8vIHRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIHdoZW4gc29tZSB0ZXh0IGlzIHJlcGxhY2VkIHdpdGggdGhlCi0JCS8vIGlkZW50aWNhbCB0ZXh0LgotCQlpZiAoKG9sZE5vZGVzLmdldExlbmd0aCgpID09IDApICYmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gZ2V0IHBvaW50ZXJzCi0JCWlmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWZpcnN0TmV3ID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCWxhc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJLy8KLQkJaWYgKG9sZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJZmlyc3RPbGQgPSBvbGROb2Rlcy5pdGVtKDApOwotCQkJbGFzdE9sZCA9IG9sZE5vZGVzLml0ZW0ob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWlmIChmaXJzdE9sZCAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzID0gZmlyc3RPbGQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChsYXN0T2xkICE9IG51bGwpCi0JCQkJb2xkTmV4dCA9IGxhc3RPbGQuZ2V0TmV4dCgpOwotCQl9Ci0JCS8vIGhhbmRsZSBzd2l0Y2gKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gc3dpdGNoIHN1cnJvdW5kaW5nIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMnIHJlZmVyZW5jZXMgdG8KLQkJCS8vIGxpc3RzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KGZpcnN0TmV3KTsKLQkJCWlmIChuZXdQcmV2aW91cyAhPSBudWxsKQotCQkJCW5ld1ByZXZpb3VzLnNldE5leHQoZmlyc3RPbGQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKGxhc3ROZXcpOwotCQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCQluZXdOZXh0LnNldFByZXZpb3VzKGxhc3RPbGQpOwotCQkJLy8gc3dpdGNoIGxpc3QgcG9pbnRlcnMgdG8gc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJaWYgKGZpcnN0T2xkICE9IG51bGwpCi0JCQkJZmlyc3RPbGQuc2V0UHJldmlvdXMobmV3UHJldmlvdXMpOwotCQkJaWYgKGxhc3RPbGQgIT0gbnVsbCkKLQkJCQlsYXN0T2xkLnNldE5leHQobmV3TmV4dCk7Ci0JCQlpZiAoZmlyc3ROZXcgIT0gbnVsbCkKLQkJCQlmaXJzdE5ldy5zZXRQcmV2aW91cyhvbGRQcmV2aW91cyk7Ci0JCQlpZiAobGFzdE5ldyAhPSBudWxsKQotCQkJCWxhc3ROZXcuc2V0TmV4dChvbGROZXh0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNob3J0IGNpcmN1aXQgd2hlbiB0aGVyZSBhcmUgbm8gbmV3IG5vZGVzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KG9sZE5leHQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJfQotCQkvLwotCQkvLyBTSURFIEVGRkVDVHMKLQkJLy8gaWYgd2UgaGF2ZSBvbGROb2RlcywgYW5kIGlmIG9sZE5leHQgb3Igb2xkUHJldmlvdXMgaXMgbnVsbCwKLQkJLy8gdGhhdCBtZWFucyB3ZSBhcmUgcmVwbGFjaW5nCi0JCS8vIHRoZSBsYXN0Tm9kZSBvciBmaXJzdE5vZGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMncyBjaGFpbiBvZiBub2RlcywKLQkJLy8gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMgbGFzdCBvciBmaXJzdCBOb2RlCi0JCS8vIGFzIHRoZSBsYXN0IG9yIGZpcnN0IG9mIHRoZSBuZXcgbm9kZXMuCi0JCS8vIChhbmQgc29tZXRpbWVzIGV2ZW4gdGhlc2Ugd2lsbCBiZSBudWxsISBzdWNoIGFzIHdoZW4gZGVsZXRpbmcgYWxsCi0JCS8vIHRleHQgaW4gYSBkb2N1bWVudCkuCi0JCWlmICgob2xkTmV4dCA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0TGFzdERvY3VtZW50UmVnaW9uKGxhc3ROZXcpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBpbiB0aGlzIGNhc2UsIHRoZSBsYXN0IG5vZGUgaXMgYmVpbmcgZGVsZXRlZCwgYnV0IG5vdAotCQkJCS8vIHJlcGxhY2VkCi0JCQkJLy8gd2l0aCBhbnl0aGluZy4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4ganVzdCBiYWNrIHVwIG9uZQotCQkJCS8vIGZyb20gdGhlIGZpcnN0IG9sZCBub2RlCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24oZmlyc3RPbGQuZ2V0UHJldmlvdXMoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKChvbGRQcmV2aW91cyA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Rmlyc3REb2N1bWVudFJlZ2lvbihmaXJzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluIHRoaXMgY2FzZSB0aGUgZmlyc3Qgbm9kZSBpcyBiZWluZyBkZWxldGVkLCBidXQgbm90Ci0JCQkJLy8gcmVwbGFjZWQKLQkJCQkvLyB3aXRoIGFueXRoaW5nLiBTbywgd2UganVzdCBnbyBvbmUgZm9yd2FyZCBwYXN0IHRoZSBsYXN0IG9sZAotCQkJCS8vIG5vZGUuCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKGxhc3RPbGQuZ2V0TmV4dCgpKTsKLQkJCX0KLQkJfQotCQkvLyBhcyBhIHRpbnkgb3B0aW1pemF0aW9uLCB3ZSByZXR1cm4gdGhlIGZpcnN0IG9mIHRoZSBkb3duc3RyZWFtCi0JCS8vIG5vZGVzLAotCQkvLyBpZiBhbnkKLQkJcmV0dXJuIG9sZE5leHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInJldXNlIiB0aGUgb2xkIGNvbnRhaW5lciByZWdpb24sIHdoZW4KLQkgKiBmb3VuZCB0byBiZSBzYW1lIChzbyBzYW1lIGluc3RhbmNlIGRvZXNuJ3QgY2hhbmdlKS4gVGhlIGdvYWwgaXMgdG8KLQkgKiAidHJhbnNmb3JtIiB0aGUgb2xkIHJlZ2lvbiwgc28gaXRzIGVxdWl2ZWxlbnQgdG8gdGhlIG5ld2x5IHBhcnNlZCBvbmUuCi0JICogIAotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb24gc3dhcE5ld0Zvck9sZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24pIHsKLQkJLy8gbWFrZXMgdGhlIG9sZCByZWdpb24gaW5zdGFuY2UgdGhlIGNvcnJlY3Qgc2l6ZS4KLQkJb2xkUmVnaW9uLmVxdWF0ZVBvc2l0aW9ucyhuZXdSZWdpb24pOwotCQkvLyBhZGp1c3RzIG9sZCBub2RlIGluc3RhbmNlIGFwcHJvcHJpYXRlbHkKLQkJb2xkTm9kZS5zZXRMZW5ndGgobmV3Tm9kZS5nZXRMZW5ndGgoKSk7Ci0JCW9sZE5vZGUuc2V0RW5kZWQobmV3Tm9kZS5pc0VuZGVkKCkpOwotCQkvLyB3ZSBkbyBoYXZlIHRvIHNldCB0aGUgcGFyZW50IGRvY3VtZW50LCBzaW5jZSB0aGUgb2xkTm9kZSdzCi0JCS8vIHdlcmUgc2V0IHRvIGEgdGVtcG9yYXJ5IG9uZSwgdGhlbiBuZXdOb2RlJ3MgaGF2ZSB0aGUKLQkJLy8gcmlnaHQgb25lLgotCQlvbGROb2RlLnNldFBhcmVudERvY3VtZW50KG5ld05vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSk7Ci0JCS8vIGlmIHdlJ3JlIHRyYW5zZm9ybWluZyBhIGNvbnRhaW5lciByZWdpb24sIHdlIG5lZWQgdG8gYmUgc3VyZSB0bwotCQkvLyB0cmFuc2ZlciB0aGUgbmV3IGVtYmVkZGVkIHJlZ2lvbnMsIHRvIHRoZSBvbGQgcGFyZW50Ci0JCS8vIE5vdGU6IGlmIG9sZFJlZ2lvbiBoYXNFbWJlZGRlZFJlZ2lvbnMsIHRoZW4gd2Uga25vdyB0aGUKLQkJLy8gbmV3UmVnaW9uIGRvZXMgdG9vLCBzaW5jZSB3ZSBnb3QgaGVyZSBiZWNhdXNlIHRoZXkgd2VyZSB0aGUKLQkJLy8gc2FtZSB0eXBlLgotCQlpZiAoaXNDb2xsZWN0aW9uUmVnaW9uKG9sZFJlZ2lvbikpIHsgLy8gfHwKLQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMob2xkUmVnaW9uKSkKLQkJCS8vIHsKLQkJCXRyYW5zZmVyRW1iZWRkZWRSZWdpb25zKG9sZE5vZGUsIChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgb2xkUmVnaW9uLCAoSVRleHRSZWdpb25Db250YWluZXIpIG5ld1JlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIG9sZFJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3dpdGNoTm9kZUxpc3RzKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gc3BsaWNlKG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCS8vIGVuc3VyZSB0aGF0IHRoZSBvbGQgbm9kZXMgaG9sZCBubyByZWZlcmVuY2VzIHRvIHRoZSBleGlzdGluZyBtb2RlbAotCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0SXRlbSA9IG9sZE5vZGVzLml0ZW0oMCk7Ci0JCQlmaXJzdEl0ZW0uc2V0UHJldmlvdXMobnVsbCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RJdGVtID0gb2xkTm9kZXMuaXRlbShvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJbGFzdEl0ZW0uc2V0TmV4dChudWxsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvICJyZXVzZSIgdGhlIG9sZCBjb250YWluZXIgcmVnaW9uLCB3aGVuCi0JICogZm91bmQgdG8gYmUgc2FtZSAoc28gc2FtZSBpbnN0YW5jZSBkb2Vzbid0IGNoYW5nZSkuIFRoZSBnb2FsIGlzIHRvCi0JICogInRyYW5zZm9ybSIgdGhlIG9sZCByZWdpb24sIHNvIGl0cyBlcXVpdmVsZW50IHRvIHRoZSBuZXdseSBwYXJzZWQgb25lLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmZXJFbWJlZGRlZFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbkNvbnRhaW5lciBvbGRSZWdpb24sIElUZXh0UmVnaW9uQ29udGFpbmVyIG5ld1JlZ2lvbikgewotCQkvLyB0aGUgb2xkUmVnaW9uIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IHBhcmVudCwgc2luY2UKLQkJLy8gd2UgZ290IGhlcmUgYmVjYXVzZSBhbGwncyBlcXVpdmVsZW50IGV4Y2VwdCB0aGUgcmVnaW9uCi0JCS8vIHBvc3Rpb25zIGhhdmUgY2hhbmdlZC4KLQkJLy9vbGRSZWdpb24uc2V0UGFyZW50KG5ld1JlZ2lvbi5nZXRQYXJlbnQoKSk7Ci0JCS8vIGJ1dCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlcmUncyAibmVzdGVkIiBlbWJlZGRlZCByZWdpb25zLCBhbmQgaWYKLQkJLy8gc28sIHdlIGNhbiBqdXN0IG1vdmUgdGhlbSBvdmVyLiBzZXR0aW5nIHRoZWlyIHBhcmVudCBhcyB0aGlzIG9sZAotCQkvLyByZWdpb24uCi0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zVG9UcmFuc2ZlciA9IG5ld1JlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCW9sZFJlZ2lvbi5zZXRSZWdpb25zKG5ld1JlZ2lvbnNUb1RyYW5zZmVyKTsKLQkJSXRlcmF0b3IgbmV3UmVnaW9uc0luT2xkT25lID0gbmV3UmVnaW9uc1RvVHJhbnNmZXIuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG5ld1JlZ2lvbnNJbk9sZE9uZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIG5ld09uZSA9IChJVGV4dFJlZ2lvbikgbmV3UmVnaW9uc0luT2xkT25lLm5leHQoKTsKLQkJCWlmIChpc0NvbGxlY3Rpb25SZWdpb24obmV3T25lKSkgeyAvLyB8fAotCQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMobmV3T25lKSkgewotCQkJCS8vKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbmV3T25lKS5zZXRQYXJlbnQob2xkUmVnaW9uKTsKLQkJCQlvbGRSZWdpb24uc2V0UmVnaW9ucyhuZXdSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEb3duU3RyZWFtUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiBsYXN0S25vd25SZWdpb24pIHsKLQkJLy8gc28gYWxsIHJlZ2lvbnMgYWZ0ZXIgdGhlIGxhc3Qga25vd24gcmVnaW9uIChsYXN0IGtub3duIHRvIGJlIG9rKQotCQkvLyBoYXZlIHRvIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgYWRqdXN0ZWQuCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpbnQgbGlzdExlbmd0aCA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCS8vIGZpcnN0LCBsb29wIHRocm91Z2ggdG8gZmluZCB3aGVyZSB0byBzdGFydAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uID09IGxhc3RLbm93blJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBsYXN0IGtub3duIG9uZSwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zdGlvbnMuCi0JCXN0YXJ0SW5kZXgrKzsKLQkJZm9yIChpbnQgaiA9IHN0YXJ0SW5kZXg7IGogPCBsaXN0TGVuZ3RoOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjIwYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotCi0JcHJpdmF0ZSBpbnQgY291bnQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZEhlYWQ7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld0hlYWQpIHsKLQkJc3VwZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBoZWFkID0gbmV3SGVhZDsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQljb3VudCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAoRGVidWcuREVCVUcgPiA1KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk4gTm9kZXMgaW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gQ29udHJ1Y3RvcjogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBoZWFkID0gc3RhcnQ7Ci0JCWlmICgoc3RhcnQgPT0gbnVsbCkgfHwgKGVuZCA9PSBudWxsKSkgewotCQkJLy8gZXJyb3IgY29uZGl0aW9uCi0JCQljb3VudCA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy9JZiBib3RoIG5vZGVzIGFyZSBub24tbnVsbCwgd2UgYXNzdW1lIHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUKLQkJLy8gaXRlbQotCQljb3VudCA9IDE7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gZW5kKSB7Ci0JCQljb3VudCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuREVCVUcgPiA1KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk4gTm9kZXMgaW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gQ29udHJ1Y3RvcjogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogaGFzTW9yZUVsZW1lbnRzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBjb3VudCA+IDA7Ci0JfQotCi0JLyoqCi0JICogbmV4dEVsZW1lbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCWNvdW50LS07Ci0JCQlvbGRIZWFkID0gaGVhZDsKLQkJCWhlYWQgPSBoZWFkLmdldE5leHQoKTsKLQkJCXJldHVybiBvbGRIZWFkOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyMjJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRqdXN0U3RhcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSwgaW50IGFkanVzdG1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuYWRqdXN0U3RhcnQoYWRqdXN0bWVudCk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgY291bnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZsYXROb2Rlcy5pdGVtKGkpOwotCQkJCS8vIGRvbid0IGtub3cgd2h5LCBidXQgd2UncmUgZ2V0dGluZyBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQkJCS8vIGluIHRoaXMgbWV0aG9kCi0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQgKyBub2RlLmdldE51bWJlck9mUmVnaW9ucygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldFRleHQoQ29yZU5vZGVMaXN0IGZsYXROb2RlcykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBudWxsOwotCQkJaW50IGxlbmd0aCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmLmFwcGVuZChmbGF0Tm9kZXMuaXRlbShpKS5nZXRUZXh0KCkpOwotCQkJfQotCQkJcmVzdWx0ID0gYnVmZi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb3JlTm9kZUxpc3Qgc2V0UGFyZW50RG9jdW1lbnQoQ29yZU5vZGVMaXN0IG5vZGVsaXN0LCBJU3RydWN0dXJlZERvY3VtZW50IHRleHRTdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGVsaXN0LCAibm9kZWxpc3Qgd2FzIG51bGwgaW4gQ29yZU5vZGVMaXN0OjpzZXRUZXh0U3RvcmUoQ29yZU5vZGVMaXN0LCBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW4gPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbm9kZWxpc3QuaXRlbShpKTsKLQkJCS8vQXNzZXJ0LmlzTm90TnVsbChub2RlLCAid2hvJ3MgcHV0dGluZyBudWxsIGluIHRoZSBub2RlIGxpc3Q/IGluCi0JCQkvLyBDb3JlTm9kZUxpc3Q6OnNldFRleHRTdG9yZShDb3JlTm9kZUxpc3QsCi0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLnNldFBhcmVudERvY3VtZW50KHRleHRTdG9yZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVsaXN0OwotCX0KLQotCS8vCXB1YmxpYyBmaW5hbCBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCS8vIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlLAotCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCS8vCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFOb2RlID0gaGVhZE5vZGU7Ci0JLy8JCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JLy8JCQlhTm9kZS5zZXRQYXJlbnREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCS8vCQkJYU5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgYU5vZGUuZ2V0TmV4dCgpOwotCS8vCQl9Ci0JLy8JCXJldHVybiBoZWFkTm9kZTsKLQkvLwl9Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgVmVjdG9yIHRvVmVjdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCXYuYWRkRWxlbWVudChhTm9kZSk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvcigpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzMxYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5TZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlIGV4dGVuZHMgU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUoSVRleHRTdG9yZSBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXQoaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0lnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyB3ZSBjaGVjayBib3RoIGNhc2UgY29udmVyc2lvbnMgdG8gaGFuZGxlIHRob3NlIGZldyBjYXNlcywKLQkJLy8gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgVHVya2lzaCwgd2hpY2ggaGF2ZSBzb21lIGNoYXJhY3RlcnMKLQkJLy8gd2hpY2ggc29ydCBvZiBoYXZlIDMgY2FzZXMuCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIGFsbCBsZW5ndGhzIGhhdmUgYmVlbiBjaGVja2VkIGFuZCBmYWxsIHdpdGhpbnQKLQkgKiBleGNlcHRhYmxlIGxpbWl0cwotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gc3RyaW5nVG9Db21wYXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY2hhckF0KGkpICE9IHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghbWF0Y2hlc0lnbm9yZUNhc2UoY2hhckF0KGkpLCBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCi0JCXJldHVybiBnZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0NmU2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBWaWFjaGVzbGF2IEthYmFub3ZpY2gvRXhhZGVsIDk3ODE3IFdyb25nIGFsZ29yaXRtIGluIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZQotICogICAgIAkJCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzgxNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5HYXBUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlIGltcGxlbWVudHMgSVRleHRTdG9yZSwgQ2hhclNlcXVlbmNlLCBJUmVnaW9uQ29tcGFyaWJsZSB7Ci0KLQlwcml2YXRlIEdhcFRleHRTdG9yZSBmSW50ZXJuYWxTdG9yZTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlKCkgewotCQl0aGlzKDUwLCAzMDApOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb3dXYXRlcm1hcmsKLQkgKiBAcGFyYW0gaGlnaFdhdGVybWFyawotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoaW50IGxvd1dhdGVybWFyaywgaW50IGhpZ2hXYXRlcm1hcmspIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsU3RvcmUgPSBuZXcgR2FwVGV4dFN0b3JlKGxvd1dhdGVybWFyaywgaGlnaFdhdGVybWFyayk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2NoYXJBdChpbnQpCi0JICovCi0JcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KGluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXQoaW50KQotCSAqLwotCXB1YmxpYyBjaGFyIGdldChpbnQgb2Zmc2V0KSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChvZmZzZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0TGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBsZW5ndGgoKSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldExlbmd0aCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzSWdub3JlQ2FzZShjaGFyIGMxLCBjaGFyIGMyKSB7Ci0JCS8vIHdlIGNoZWNrIGJvdGggY2FzZSBjb252ZXJzaW9ucyB0byBoYW5kbGUgdGhvc2UgZmV3IGNhc2VzLAotCQkvLyBpbiBsYW5ndWFnZXMgc3VjaCBhcyBUdXJraXNoLCB3aGljaCBoYXZlIHNvbWUgY2hhcmFjdGVycwotCQkvLyB3aGljaCBzb3J0IG9mIGhhdmUgMyBjYXNlcy4KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMyKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMyKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlcyhvZmZzZXQsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgYWxsIGxlbmd0aHMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIGZhbGwgd2l0aGludAotCSAqIGV4Y2VwdGFibGUgbGltaXRzCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBzdHJpbmdUb0NvbXBhcmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gb2Zmc2V0ICsgc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChjaGFyQXQoaSkgIT0gc3RyaW5nVG9Db21wYXJlLmNoYXJBdChzdHJpbmdPZmZzZXQrKykpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IGNvbXBhcmVMZW5ndGggPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWlmIChjb21wYXJlTGVuZ3RoID09IGxlbmd0aCkgewotCQkJaW50IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKLQkJCWlmIChlbmRPZmZzZXQgPD0gbGVuZ3RoKCkpIHsKLQkJCQlyZXN1bHQgPSByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaW50IHN0cmluZ09mZnNldCA9IDA7Ci0JCWludCBsZW4gPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCFtYXRjaGVzSWdub3JlQ2FzZShjaGFyQXQoaSksIHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjcmVwbGFjZShpbnQsIGludCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlmSW50ZXJuYWxTdG9yZS5yZXBsYWNlKG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3NldChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQlmSW50ZXJuYWxTdG9yZS5zZXQodGV4dCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJLy8gY29udmVydCAnZW5kJyB0byAnbGVuZ3RoJwotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWNhOGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdWJTZXRUZXh0U3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaXMgYSBjb252aWVuY2Ugb3IgdXRpbGl0eSBjbGFzcyB0aGF0IGFsbG93cyB5b3UgdG8gbWFrZSBhIGNvcHkgb2YgYQotICogcGFydCBvZiBhIGxhcmdlciB0ZXh0IHN0b3JlLCBidXQgaGF2ZSB0aGUgY29weSBiZWhhdmUgYXMgaWYgaXQgd2FzIHRoZQotICogbGFyZ2VyIHRleHQgc3RvcmUuCi0gKiAKLSAqIEluIG90aGVyIHdvcmRzLCBpdCBwcm92aWRlcyBhIHN1YnNldCBvZiBhIGxhcmdlciBkb2N1bWVudCwgdGhhdCAibG9va3MgbGlrZSIKLSAqIHRoZSBvcmdpbmFsIGRvY3VtZW50LiBUaGF0IGlzLCAibG9va3MgbGlrZSIgaW4gdGVybXMgb2Ygb2Zmc2V0cyBhbmQgbGVuZ3Rocy4KLSAqIFZhbGlkIGFjY2VzcyBjYW4gb25seSBiZSBtYWRlIHRvIGRhdGEgYmV0d2VlbiB0aGUgb3JpZ25hbCBvZmZzZXRzLCBldmVuCi0gKiB0aG91Z2ggdGhvc2Ugb2Zmc2V0cyBhcmUgaW4gdGhlIHNhbWUgdW5pdHMgYXQgdGhlIG9yaWdpbmFsLCBhbmQgZXZlbiB0aG91Z2gKLSAqIHRoZSBsZW5ndGggYXBwZWFycyB0byBiZSBsb25nLgotICogCi0gKiBGb3IgZXhhbXBsZSwgaWYgYSBzdWJzZXR0ZXh0IHN0b3JlIGlzIGNyZWF0ZWQgZm9yIHRoZSBkZWYgcGFydCBvZiBhYmNkZWZnaCwKLSAqIHRoZW4gZ2V0KDMsNSkgaXMgdmFsaWQsIGdldExlbmd0aCBpcyA4LiBBbnkgb3RoZXIgYWNjZXNzLCBzdWNoIGFzCi0gKiBnZXRDaGFyKDIpLCB3b3VsZCBiZSBpbnZhbGlkLgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotCi0vKioKLSAqIFNpbWlsYXIgdG8gYmFzaWNzIG9mIElEb2N1bWVudCwgYnV0IHRoZSBvZmZzZXRzIGFyZSBtYXBwZWQgZnJvbSBjb29yZGluYXRlcwotICogb2YgdW5kZXJseWluZyBzdG9yYWdlIHRvIGEgInZpcnR1YWwiIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgU3ViU2V0VGV4dFN0b3JlIGltcGxlbWVudHMgSVRleHRTdG9yZSB7Ci0JcHJpdmF0ZSBpbnQgcHNldWRvQmVnaW5PZmZzZXQ7IC8vIG1hcHMgdG8gInplcm8iIHBvc3Rpb24gb2YgbmV3IHRleHQKLQkvL3ByaXZhdGUgaW50IHBzZXVkb0VuZE9mZnNldDsKLQlwcml2YXRlIGludCBwc2V1ZG9MZW5ndGg7IC8vIGxlbmd0aCBvZiBvbGQvb3JpZ2luYWwgZG9jdW1lbnQKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkvKioKLQkgKiBTdWJTZXRUZXh0U3RvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5pdGlhbENvbnRlbnQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3ViU2V0VGV4dFN0b3JlKFN0cmluZyBpbml0aWFsQ29udGVudCwgaW50IGJlZ2luT2Zmc2V0LCBpbnQgZW5kT2Zmc2V0LCBpbnQgb3JpZ2luYWxEb2N1bWVudExlbmd0aCkgewotCQlzdXBlcigpOwotCQlwc2V1ZG9CZWdpbk9mZnNldCA9IGJlZ2luT2Zmc2V0OwotCQkvL3BzZXVkb0VuZE9mZnNldCA9IGVuZE9mZnNldDsKLQkJLy8gdXNlZCB0byBiZSBvcmlnaW5hbERvY3VtZW50LmdldExlbmd0aCAuLi4gbm90IHN1cmUgaWYgdXNlZCwgb3IKLQkJLy8gd2hpY2gKLQkJLy8gaXMgcmlnaHQKLQkJcHNldWRvTGVuZ3RoID0gb3JpZ2luYWxEb2N1bWVudExlbmd0aDsKLQkJc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihpbml0aWFsQ29udGVudCk7Ci0JCS8vc2V0KGluaXRpYWxDb250ZW50KTsKLQl9Ci0KLQkvLyB0aGlzIGlzIG91ciAicHJpdmF0ZSIgZ2V0LCB3aGljaCBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkCi0JLy8gdXNlIHRvIGdldCB1c2luZyAicmVhbCIgY29vcmRpbmF0ZXMgb2YgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4KLQlwcml2YXRlIFN0cmluZyBfZ2V0KGludCBiZWdpbiwgaW50IGxlbmd0aCkgewotCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3JjRW5kID0gYmVnaW4gKyBsZW5ndGg7Ci0JCXN0cmluZ0J1ZmZlci5nZXRDaGFycyhiZWdpbiwgc3JjRW5kLCBjaGFycywgMCk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXQoaW50IG9mZnNldCkgewotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLmNoYXJBdChvZmZzZXQgLSBwc2V1ZG9CZWdpbk9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGJlZ2luCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChpbnQgYmVnaW4sIGludCBsZW5ndGgpIHsKLQkJLy8gcmVtYXAgdGhlIGJlZ2luIGFuZCBlbmQgdG8gImFwcGVhciIgdG8gYmUgaW4gdGhlCi0JCS8vIHNhbWUgY29vcmRpbmF0ZXMgb2YgdGhlIG9yaWdpbmFsIHBhcmVudERvY3VtZW50Ci0JCXJldHVybiBfZ2V0KGJlZ2luIC0gcHNldWRvQmVnaW5PZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGJlZ2luCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3MpIHsKLQkJLy8gcmVtYXAgdGhlIGJlZ2luIGFuZCBlbmQgdG8gImFwcGVhciIgdG8gYmUgaW4gdGhlCi0JCS8vIHNhbWUgY29vcmRpbmF0ZXMgb2YgdGhlIG9yaWdpbmFsIHBhcmVudERvY3VtZW50Ci0JCXJldHVybiBnZXQocG9zIC0gcHNldWRvQmVnaW5PZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIFdlIHJlZGVmaW5lIGdldExlbmd0aCBzbyBpdHMgbm90IHRoZSB0cnVlIGxlbmd0aCBvZiB0aGlzIHN1Yi1zZXQKLQkgKiBkb2N1bWVudCwgYnV0IHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsLiBUaGlzIGlzIG5lZWRlZCwgYXMgYSBzaW1wbGUKLQkgKiBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBzZWUgaWYgdGhlIHBzZXVkbyBlbmQgaXMgZXF1YWwgdGhlIGxhc3QKLQkgKiBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBwc2V1ZG9MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIGFzIGlmIGNvbnNpZGVyZWQgYSB0cnVlLCBzdGFuZGFsb25lIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXRUcnVlTGVuZ3RoKCkgewotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLmxlbmd0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2hhbmdlcykgewotCQkvLyByZW1hcCB0aGUgYmVnaW4gYW5kIGVuZCB0byAiYXBwZWFyIiB0byBiZSBpbiB0aGUKLQkJLy8gc2FtZSBjb29yZGluYXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFyZW50RG9jdW1lbnQKLQkJaW50IGVuZCA9IGJlZ2luICsgbGVuZ3RoOwotCQlzdHJpbmdCdWZmZXIucmVwbGFjZShiZWdpbiAtIHBzZXVkb0JlZ2luT2Zmc2V0LCBlbmQsIGNoYW5nZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQlzdHJpbmdCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwYzI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvVGV4dFJlZ2lvbkxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgVGV4dFJlZ2lvbkxpc3RJbXBsIGltcGxlbWVudHMgSVRleHRSZWdpb25MaXN0IHsKLQotCXByaXZhdGUgY2xhc3MgTnVsbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgTnVsbEl0ZXJhdG9yKCkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbiBub3QgcmVtb3ZlIHJlZ2lvbnMgdmlhIGl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwcml2YXRlIElUZXh0UmVnaW9uW10gZkl0ZXJhdG9yUmVnaW9uczsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbWF4aW5kZXggPSAtMTsKLQotCQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoKSB7Ci0JCQlmSXRlcmF0b3JSZWdpb25zID0gdG9BcnJheSgpOwotCQkJbWF4aW5kZXggPSBmSXRlcmF0b3JSZWdpb25zLmxlbmd0aCAtIDE7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGluZGV4IDwgbWF4aW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlpZiAoIShpbmRleCA8IG1heGluZGV4KSkKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJcmV0dXJuIGZJdGVyYXRvclJlZ2lvbnNbKytpbmRleF07Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbiBub3QgcmVtb3ZlIHJlZ2lvbnMgdmlhIGl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgZ3Jvd3RoQ29uc3RhbnQgPSAyOwotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbltdIGZSZWdpb25zOwotCXByaXZhdGUgaW50IGZSZWdpb25zQ291bnQgPSAwOwotCi0JcHVibGljIFRleHRSZWdpb25MaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJlZ2lvbkxpc3RJbXBsKElUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0KSB7Ci0JCXRoaXMoKTsKLQkJZlJlZ2lvbnMgPSAoSVRleHRSZWdpb25bXSkgcmVnaW9uTGlzdC50b0FycmF5KCkuY2xvbmUoKTsKLQkJZlJlZ2lvbnNDb3VudCA9IGZSZWdpb25zLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0KLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgMSk7Ci0JCWZSZWdpb25zW2ZSZWdpb25zQ291bnQrK10gPSByZWdpb247Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5zZXJ0UG9zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucykgewotCQkvLyBiZWdpbm5pbmcgb2YgbGlzdCBpcyAwIHRvIGluc2VydFBvcy0xCi0JCS8vIHJlbWFpbmRlciBvZiBsaXN0IGlzIGluc2VydFBvcyB0byBmUmVnaW9uc0NvdW50Ci0JCS8vIHJlc3VsdGluZyB0b3RhbCB3aWxsIGJlIGJlIGZSZWdpb25zQ291bnQgKyBuZXdSZWdpb25zLnNpemUoKQotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCBpbnNlcnRQb3MgPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluc2VydFBvcyk7Ci0JCX0KLQotCQlpbnQgbmV3UmVnaW9uc1NpemUgPSBuZXdSZWdpb25zLnNpemUoKTsKLQotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgbmV3UmVnaW9uc1NpemUpOwotCi0JCWludCBudW1Nb3ZlZCA9IGZSZWdpb25zQ291bnQgLSBpbnNlcnRQb3M7Ci0JCWlmIChudW1Nb3ZlZCA+IDApCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCBpbnNlcnRQb3MsIGZSZWdpb25zLCBpbnNlcnRQb3MgKyBuZXdSZWdpb25zU2l6ZSwgbnVtTW92ZWQpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UmVnaW9uc1NpemU7IGkrKykKLQkJCWZSZWdpb25zW2luc2VydFBvcysrXSA9IG5ld1JlZ2lvbnMuZ2V0KGkpOwotCi0JCWZSZWdpb25zQ291bnQgKz0gbmV3UmVnaW9uc1NpemU7Ci0JCXJldHVybiBuZXdSZWdpb25zU2l6ZSAhPSAwOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vdGU6IHNpemUgb2YgYXJyYXkgaXMgbm90IHJlZHVjZWQhCi0JCWZSZWdpb25zQ291bnQgPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbmVlZGVkKSB7Ci0JCWlmIChmUmVnaW9ucyA9PSBudWxsKSB7Ci0JCQkvLyBmaXJzdCB0aW1lCi0JCQlmUmVnaW9ucyA9IG5ldyBJVGV4dFJlZ2lvbltuZWVkZWRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmUmVnaW9ucy5sZW5ndGg7Ci0JCWlmIChvbGRMZW5ndGggPCBuZWVkZWQpIHsKLQkJCUlUZXh0UmVnaW9uW10gb2xkQWRhcHRlcnMgPSBmUmVnaW9uczsKLQkJCUlUZXh0UmVnaW9uW10gbmV3QWRhcHRlcnMgPSBuZXcgSVRleHRSZWdpb25bbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRBZGFwdGVycywgMCwgbmV3QWRhcHRlcnMsIDAsIGZSZWdpb25zQ291bnQpOwotCQkJZlJlZ2lvbnMgPSBuZXdBZGFwdGVyczsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4KTsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZXN1bHQgPSBmUmVnaW9uc1tpbmRleF07Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCi0JCWludCByZXN1bHQgPSAtMTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZlJlZ2lvbnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHJlZ2lvbi5lcXVhbHMoZlJlZ2lvbnNbaV0pKSB7Ci0JCQkJCQlyZXN1bHQgPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZlJlZ2lvbnNDb3VudCA9PSAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJaWYgKHNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxJdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJLy8gbXVjaCBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGltcGxlbWVudCB0aGlzLCBidXQKLQkJLy8gSSBkb3VidCBpZiBjYWxsZWQgb2Z0ZW4KLQkJSVRleHRSZWdpb24gb25lVG9SZW1vdmUgPSBnZXQoaW5kZXgpOwotCQlyZW1vdmUob25lVG9SZW1vdmUpOwotCQlyZXR1cm4gb25lVG9SZW1vdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKElUZXh0UmVnaW9uIGEpIHsKLQkJaWYgKGZSZWdpb25zID09IG51bGwgfHwgYSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlJVGV4dFJlZ2lvbltdIG5ld1JlZ2lvbnMgPSBuZXcgSVRleHRSZWdpb25bZlJlZ2lvbnNDb3VudF07Ci0JCWludCBvbGRSZWdpb25Db3VudCA9IGZSZWdpb25zQ291bnQ7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgb2xkSW5kZXggPSAwOyBvbGRJbmRleCA8IG9sZFJlZ2lvbkNvdW50OyBvbGRJbmRleCsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjYW5kaWRhdGUgPSBmUmVnaW9uc1tvbGRJbmRleF07Ci0JCQlpZiAoYSA9PSBjYW5kaWRhdGUpIHsKLQkJCQlmUmVnaW9uc0NvdW50LS07Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkJbmV3UmVnaW9uc1tuZXdJbmRleCsrXSA9IGZSZWdpb25zW29sZEluZGV4XTsKLQkJfQotCQlpZiAoZm91bmQpCi0JCQlmUmVnaW9ucyA9IG5ld1JlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKElUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0KSB7Ci0JCS8vIG11Y2ggbW9yZSBlZmZpY2llbnQgd2F5cyB0byBpbXBsZW1lbnQgdGhpcywgYnV0Ci0JCS8vIEkgZG91YnQgaWYgY2FsbGVkIG9mdGVuCi0JCWlmIChyZWdpb25MaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9uTGlzdC5zaXplKCk7IGkrKykgewotCQkJCXRoaXMucmVtb3ZlKHJlZ2lvbkxpc3QuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gZlJlZ2lvbnNDb3VudDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25bXSB0b0FycmF5KCkgewotCQkvLyByZXR1cm4gImNsb25lIiBvZiBpbnRlcm5hbCBhcnJheQotCQlJVGV4dFJlZ2lvbltdIG5ld0FycmF5ID0gbmV3IElUZXh0UmVnaW9uW2ZSZWdpb25zQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCAwLCBuZXdBcnJheSwgMCwgZlJlZ2lvbnNDb3VudCk7Ci0JCXJldHVybiBuZXdBcnJheTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTgxMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0vKioKLSAqIExpa2Ugc3VwZXIgY2xhc3MgZXhjZXB0IGFsbG93cyBsZW5ndGggYW5kIG9mZnNldCB0byBiZSBtb2RpZmllZC4gVGhpcyBpcwotICogY29udmVuaWVudCBmb3Igc29tZSBhbGdvcml0aG1zLCBhbmQgYWxsb3dzIHJlZ2lvbiBvYmplY3RzIHRvIGJlIHJldXNlZC4KLSAqIE5vdGU6IFRoZXJlIE1JR0hUIGJlIHNvbWUgY29kZSB0aGF0IGFzc3VtZXMgcmVnaW9ucyBhcmUgaW1tdXRhYmxlLiBUaGlzCi0gKiBjbGFzcyB3b3VsZCBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRob3NlIHVzZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRSZWdpb24gZXh0ZW5kcyBJUmVnaW9uIHsKLQl2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKTsKLQotCXZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTE0YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBTaW1pbGFyIHRvIGV4dGVuZGVkIGludGVyZmFjZSwgZXhjZXB0IGl0IGFsbG93cyB0aGUgbGVuZ3RoLCBvZmZzZXQsIGFuZAotICogdHlwZSB0byBiZSBzZXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggYSBudW1iZXIgb2YgInNtYWxsIgotICogcmVnaW9ucywgdGhhdCBhbGwgbWFwIHRvIHRoZSB0aGUgc2FtZSBwYXJ0aW9uIHJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIElTdHJ1Y3R1cmVkUmVnaW9uLCBJVHlwZWRSZWdpb24gewotCXZvaWQgc2V0VHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWVmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotCi0KLS8qKgotICogU2ltaWxhciB0byBqZmFjZSByZWdpb24gZXhjZXB0IHdlIHdhbnRlZCBhIHNldHRpbmcgb24gbGVuZ3RoCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdHJ1Y3R1cmVkUmVnaW9uIGltcGxlbWVudHMgSVN0cnVjdHVyZWRSZWdpb24gewotCS8qKiBUaGUgcmVnaW9uIGxlbmd0aCAqLwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0KLQkvKiogVGhlIHJlZ2lvbiBvZmZzZXQgKi8KLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RydWN0dXJlZFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogVHdvIHJlZ2lvbnMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBvZmZzZXQgYW5kIGxlbmd0aC4KLQkgKiAKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQlJUmVnaW9uIHIgPSAoSVJlZ2lvbikgbzsKLQkJCXJldHVybiByLmdldE9mZnNldCgpID09IGZPZmZzZXQgJiYgci5nZXRMZW5ndGgoKSA9PSBmTGVuZ3RoOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlZ2lvbiNnZXRMZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWdpb24jZ2V0T2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlIGhhc2NvZGUgaXMgb3ZlcnJpZGRlbiBzaW5jZSB3ZSBwcm92aWRlIG91ciBvd24KLQkgKiAgICAgIGVxdWFscy4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGZPZmZzZXQgPDwgMjQpIHwgKGZMZW5ndGggPDwgMTYpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICBUaGUgbGVuZ3RoIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwZDU0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi0KLQotCi0vKioKLSAqIFNpbWlsYXIgamFjZSBUeXBlZFJlZ2lvbiwgYnV0IGhhZCB0byBzdWJjbGFzcyBvdXIgdmVyc2lvbiB3aGljaCBhbGxvd2VkCi0gKiBsZW5ndGggdG8gYmUgc2V0LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uIGV4dGVuZHMgU2ltcGxlU3RydWN0dXJlZFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gewotCi0JLyoqIFRoZSByZWdpb24ncyB0eXBlICovCi0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdHlwZWQgcmVnaW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBzcGVjaWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24ncyBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3MgbGVuZ3RoCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24ncyB0eXBlCi0JICovCi0JcHVibGljIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUd28gdHlwZWQgcG9zaXRpb25zIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgb2Zmc2V0LCBsZW5ndGgsIGFuZAotCSAqIHR5cGUuCi0JICogCi0JICogQHNlZSBPYmplY3QjZXF1YWxzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uKSB7Ci0JCQlTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gciA9IChTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24pIG87Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKHIpICYmICgoZlR5cGUgPT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBudWxsKSB8fCBmVHlwZS5lcXVhbHMoci5nZXRUeXBlKCkpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUeXBlZFJlZ2lvbiNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IHR5cGUgPSBmVHlwZSA9PSBudWxsID8gMCA6IGZUeXBlLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpIHwgdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzLmFwcGVuZChnZXRPZmZzZXQoKSk7Ci0JCXMuYXBwZW5kKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJcy5hcHBlbmQoZ2V0TGVuZ3RoKCkpOwotCQlzLmFwcGVuZCgiIC0gIik7IC8vJE5PTi1OTFMtMSQKLQkJcy5hcHBlbmQoZ2V0VHlwZSgpKTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRhMmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLQotCi0vKioKLSAqIEJhc2UgRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuIEJMT0NLX1RFWFQgSVRleHRSZWdpb25zCi0gKiBoYXZlIGEgcGFydGl0aW9uIHR5cGUgb2YgQkxPQ0sgb3IgQkxPQ0s6VEFHTkFNRSBpZiBhIHN1cnJvdW5kaW5nIHRhZ25hbWUKLSAqIHdhcyByZWNvcmRlZC4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRQYXJ0aXRpb25lciwgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0Jc3RhdGljIGNsYXNzIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyB7Ci0JCWludCBmTGVuZ3RoOwotCQlpbnQgZk9mZnNldDsKLQkJSVR5cGVkUmVnaW9uW10gZlBhcnRpdGlvbnM7Ci0JCWJvb2xlYW4gaXNJblZhbGlkOwotCi0JCUNhY2hlZENvbXB1dGVkUGFydGl0aW9ucyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zKSB7Ci0JCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJZkxlbmd0aCA9IGxlbmd0aDsKLQkJCWZQYXJ0aXRpb25zID0gcGFydGl0aW9uczsKLQkJCWlzSW5WYWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyBjYWNoZWRQYXJ0aXRpb25zID0gbmV3IENhY2hlZENvbXB1dGVkUGFydGl0aW9ucygtMSwgLTEsIG51bGwpOwotCXByb3RlY3RlZCBTdHJpbmdbXSBmU3VwcG9ydGVkVHlwZXMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbigwLCAwLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04pOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uaW5nIG9mIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgY29ubmVjdGVkIGRvY3VtZW50LgotCSAqIFRoZXJlIG11c3QgYmUgYSBkb2N1bWVudCBjb25uZWN0ZWQgdG8gdGhpcyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBOb3RlOiB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyY3RseSBieSBjbGllbnRzLCB1bmxlc3MgdGhleSBjb250cm9sCi0JICogdGhlIHRocmVhZGluZyB0aGF0IGluY2x1ZGVzIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50LiBPdGhlcndpc2UKLQkgKiB0aGUgZG9jdW1lbnQgY291bGQgYmUgbW9kaWZpZWQgd2hpbGUgcGFydGl0aW9ucyBhcmUgYmVpbmcgY29tcHV0ZWQuIFdlCi0JICogYWR2aXNlIHRoYXQgY2xpZW50cyB1c2UgdGhlIGNvbXB1dGVQYXJ0aXRpb25zIEFQSSBkaXJlY3RseSBmcm9tIHRoZQotCSAqIGRvY3VtZW50LCBzbyB0aGV5IHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSBvZiBpbnRlcmVzdAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgcGFydGl0aW9uaW5nIG9mIHRoZSByYW5nZQotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgcGFydGl0aW9uZXIgaXMgbm90IGNvbm5lY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVR5cGVkUmVnaW9uW10gcmVzdWx0cyA9IG51bGw7Ci0KLQotCi0JCWlmICgoIWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkKSAmJiAob2Zmc2V0ID09IGNhY2hlZFBhcnRpdGlvbnMuZk9mZnNldCkgJiYgKGxlbmd0aCA9PSBjYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGgpKSB7Ci0JCQlyZXN1bHRzID0gY2FjaGVkUGFydGl0aW9ucy5mUGFydGl0aW9uczsKLQkJfSBlbHNlIHsKLQotCQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bXXtnZXRQYXJ0aXRpb24ob2Zmc2V0KX07Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbnQgZW5kUG9zID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJCWlmIChlbmRQb3MgPiBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBtb2RlbCBpbnN0YW5jZSBpcyBiZWluZwotCQkJCQkvLyBjaGFuZ2VkCi0JCQkJCS8vIGFuZCBldmVyeW9uZSdzIG5vdCB5ZXQgdXAgdG8gZGF0ZQotCQkJCQlyZXR1cm4gbmV3IElUeXBlZFJlZ2lvbltde2NyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgZ2V0VW5rbm93bigpKX07Ci0JCQkJfQotCQkJCWludCBjdXJyZW50UG9zID0gb2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcHJldmlvdXNQYXJ0aXRpb24gPSBudWxsOwotCQkJCXdoaWxlIChjdXJyZW50UG9zIDwgZW5kUG9zKSB7Ci0JCQkJCWludGVybmFsR2V0UGFydGl0aW9uKGN1cnJlbnRQb3MsIGZhbHNlKTsKLQkJCQkJY3VycmVudFBvcyArPSBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBwYXJ0aXRpb24ganVzdCBjb250aW51ZXMgbGFzdCBvbmUKLQkJCQkJLy8gKHR5cGUgaXMgdGhlIHNhbWUpLAotCQkJCQkvLyBpZiBzbywganVzdCBleHRlbmQgbGVuZ3RoIG9mIGxhc3Qgb25lLCBub3QgbmVlZCB0bwotCQkJCQkvLyBjcmVhdGUgbmV3Ci0JCQkJCS8vIGluc3RhbmNlLgotCQkJCQlpZiAocHJldmlvdXNQYXJ0aXRpb24gIT0gbnVsbCAmJiBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkuZXF1YWxzKHByZXZpb3VzUGFydGl0aW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCS8vIHNhbWUgcGFydGl0aW9uIHR5cGUKLQkJCQkJCXByZXZpb3VzUGFydGl0aW9uLnNldExlbmd0aChwcmV2aW91c1BhcnRpdGlvbi5nZXRMZW5ndGgoKSArIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vdCB0aGUgc2FtZSwgc28gYWRkIHRvIGxpc3QKLQkJCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcGFydGl0aW9uID0gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKTsKLQkJCQkJCWxpc3QuYWRkKHBhcnRpdGlvbik7Ci0JCQkJCQkvLyBhbmQgbWFrZSBjdXJyZW50LCBwcmV2aW91cwotCQkJCQkJcHJldmlvdXNQYXJ0aXRpb24gPSBwYXJ0aXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJCWxpc3QudG9BcnJheShyZXN1bHRzKTsKLQkJCX0KLQkJCWlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkvLyB0cnVuY2F0ZSByZXR1cm5lZCByZXN1bHRzIHRvIHJlcXVlc3RlZCByYW5nZQotCQkJCWlmIChyZXN1bHRzWzBdLmdldE9mZnNldCgpIDwgb2Zmc2V0ICYmIHJlc3VsdHNbMF0gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFJlZ2lvbikgewotCQkJCQkoKElTdHJ1Y3R1cmVkUmVnaW9uKSByZXN1bHRzWzBdKS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQl9Ci0JCQkJaW50IGxhc3RFbmQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0T2Zmc2V0KCkgKyByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKGxhc3RFbmQgPiBvZmZzZXQgKyBsZW5ndGggJiYgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRSZWdpb24pIHsKLQkJCQkJKChJU3RydWN0dXJlZFJlZ2lvbikgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdKS5zZXRMZW5ndGgob2Zmc2V0ICsgbGVuZ3RoIC0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGggPSBsZW5ndGg7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZQYXJ0aXRpb25zID0gcmVzdWx0czsKLQkJCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0KLQotCS8qKgotCSAqIENvbm5lY3RzIHRoZSBkb2N1bWVudCB0byB0aGUgcGFydGl0aW9uZXIsIGkuZS4gaW5kaWNhdGVzIHRoZSBiZWdpbiBvZgotCSAqIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmlzSW5WYWxpZCA9IHRydWU7Ci0JCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGlzIGNsYXNzIGFuZCBBUEkgYXJlIGZvciBTdHJ1Y3R1cmVkIERvY3VtZW50cyBvbmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIElUZXh0UmVnaW9uQ29udGFpbmVyIGl0c2VsZiBjb250YWlucyBhbm90aGVyCi0JICogSVRleHRSZWdpb25Db250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gSVRleHRSZWdpb25Db250YWluZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0VtYmVkZGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWJvb2xlYW4gY29udGFpbnNFbWJlZGRlZFJlZ2lvbiA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNvbnRhaW5zRW1iZWRkZWRSZWdpb24gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluc0VtYmVkZGVkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVOZXdQYXJ0aXRpb25JbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UuZ2V0T2Zmc2V0KCksIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpLCBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbmNyZXRlIHBhcnRpdGlvbiBmcm9tIHRoZSBnaXZlbiB2YWx1ZXMuIFJldHVybnMgYSBuZXcKLQkgKiBpbnN0YW5jZSBmb3IgZWFjaCBjYWxsLgotCSAqIAotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIElUeXBlZFJlZ2lvbgotCSAqIAotCSAqIFRPRE86IHNob3VsZCBiZSBwcm90ZWN0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3RzIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBwYXJ0aXRpb25lciwgaS5lLiBpbmRpY2F0ZXMgdGhlIGVuZAotCSAqIG9mIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNkaXNjb25uZWN0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJY2FjaGVkUGFydGl0aW9ucy5pc0luVmFsaWQgPSB0cnVlOwotCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWJvdXQgYSBmb3J0aGNvbWluZyBkb2N1bWVudCBjaGFuZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIHBhcnRpdGlvbmVyIHVwZGF0ZXMgdGhlIHNldCBvZgotCSAqIHJlZ2lvbnMgYW5kIHJldHVybnMgd2hldGhlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcKLQkgKiBoYXMgYmVlbiBjaGFuZ2VkLCBpLmUuIHdoZXRoZXIgcGFydGl0aW9ucyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCS8vIHBhcnRpdGlvbnMgZG9uJ3QgYWx3YXlzIGNoYW5nZSB3aGlsZSBkb2N1bWVudCByZWdpb25zIGRvLAotCQkJLy8gYnV0IHRoYXQncyB0aGUgb25seSAicXVpY2sgY2hlY2siIHdlIGhhdmUuCi0JCQkvLyBJJ20gbm90IHN1cmUgaWYgc29tZXRoaW5nIG1vcmUgc29waGlzdGljYXRlZCB3aWxsIGJlIG5lZWRlZAotCQkJLy8gaW4gdGhlIGZ1dHVyZS4gKGRtdywgMDIvMTgvMDQpLgotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgKGNvbmNlcHR1YWxseSkgYWJzdHJhY3QgbWV0aG9kIGlzIG5vdCBjb25jZXJuZWQgd2l0aAotCQkvLyBzcGVjaWZpYyByZWdpb24gdHlwZXMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5Ci0JICogYmVlbiBjb25uZWN0ZWQgdG8gdGhlIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRDb250ZW50VHlwZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRQYXJ0aXRpb24ob2Zmc2V0KS5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBkZWZhdWx0IQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0KLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGNvbnRlbnQgdHlwZXMgdGhlIHBhcnRpdG9uZXIgc3VwcG9ydHMuCi0JICogSS5lLiBBbnkgcmVzdWx0IGRlbGl2ZXJlZCBieSB0aGlzIHBhcnRpdGlvbmVyIG1heSBub3QgY29udGFpbiBhIGNvbnRlbnQKLQkgKiB0eXBlIHdoaWNoIHdvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGlzIG1ldGhvZCdzIHJlc3VsdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZ2V0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCWlmIChmU3VwcG9ydGVkVHlwZXMgPT0gbnVsbCkgewotCQkJaW5pdExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZTdXBwb3J0ZWRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZQotCSAqIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkgYmVlbiBjb25uZWN0ZWQgdG8gdGhlCi0JICogcGFydGl0aW9uZXIuCi0JICogCi0JICogTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmN0bHkgYnkgY2xpZW50cywgdW5sZXNzIHRoZXkgY29udHJvbAotCSAqIHRoZSB0aHJlYWRpbmcgdGhhdCBpbmNsdWRlcyBtb2RpZmljYXRpb25zIHRvIHRoZSBkb2N1bWVudC4gT3RoZXJ3aXNlCi0JICogdGhlIGRvY3VtZW50IGNvdWxkIGJlIG1vZGlmaWVkIHdoaWxlIHBhcnRpdGlvbnMgYXJlIGJlaW5nIGNvbXB1dGVkLiBXZQotCSAqIGFkdmlzZSB0aGF0IGNsaWVudHMgdXNlIHRoZSBnZXRQYXJ0aXRpb24gQVBJIGRpcmVjdGx5IGZyb20gdGhlCi0JICogZG9jdW1lbnQsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LgotCSAqIAotCSAqIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRQYXJ0aXRpb24oaW50KQotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBvZmZzZXQpIHsKLQkJaW50ZXJuYWxHZXRQYXJ0aXRpb24ob2Zmc2V0LCB0cnVlKTsKLQkJcmV0dXJuIGNyZWF0ZU5ld1BhcnRpdGlvbkluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHBhcnNlciBzZW5zaXRpdmUgY29kZSB3YXMgbW92ZWQgdG8gc3ViY2xhc3MgZm9yIHF1aWNrIHRyYW5zaXRpb24KLQkJLy8gdGhpcyAoY29uY2VwdHVhbGx5KSBhYnN0cmFjdCB2ZXJzaW9uIGlzbid0IGNvbmNlcm5lZCB3aXRoIGJsb2NrZWQKLQkJLy8gdGV4dAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAodGFnbmFtZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0s6IiArIHRhZ25hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0siOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBibG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCS8vIHJlZ2lvbnMgc2hvdWxkIG5ldmVyIGJlIG51bGwsIG9yIGhvbGQgemVybyByZWdpb25zLCBidXQganVzdCBpbgotCQkvLyBjYXNlLi4uCi0JCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMSkgewotCQkJCS8vIGlmIG9ubHkgb25lLCB0aGVuIGl0cyBhICJwdXJlIiBibG9ja2VkIG5vdGUuCi0JCQkJLy8gaWYgbW9yZSB0aGFuIG9uZSwgdGhlbiBtdXN0IGNvbnRhaW4gc29tZSBlbWJlZGRlZCByZWdpb24KLQkJCQkvLyBjb250YWluZXIKLQkJCQlJVGV4dFJlZ2lvbiBibG9ja2VkUmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQkJLy8gZG91YmxlIGNoZWNrIGZvciBjb2RlIHNhZmVmeSwgdGhvdWdoIHNob3VsZCBhbHdheXMgYmUgdHJ1ZQotCQkJCWlmIChibG9ja2VkUmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChGb3JlaWduUmVnaW9uKSBibG9ja2VkUmVnaW9uLCBvZmZzZXQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbXVzdCBoYXZlIHNvbWUgZW1iZWRkZWQgcmVnaW9uIGNvbnRhaW5lciwgc28gd2UnbGwgbWFrZQotCQkJCS8vIHN1cmUgd2UnbGwgZ2V0IHRoZSBhcHByb3ByaWF0ZSBvbmUKLQkJCQlyZXN1bHQgPSBnZXRSZWxldmVudFJlZ2lvblR5cGUoYmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRQYXJ0aXRpb25UeXBlLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIGlmIGl0IGdldCdzIHRvIHRoaXMgInJhdyIgbGV2ZWwsIHRoZW4KLQkJLy8gbXVzdCBiZSBkZWZhdWx0LgotCQlyZXR1cm4gZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gYmFzZWQgb24gcmVnaW9uIHR5cGUuIFRoaXMgYmFzaWNhbGx5IG1hcHMgZnJvbQotCSAqIG9uZSByZWdpb24tdHlwZSBzcGFjZSB0byBhbm90aGVyLCBoaWdoZXIgbGV2ZWwsIHJlZ2lvbi10eXBlIHNwYWNlLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCQkvLwkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb25Db250YWluZXIpIHsKLQkJLy8JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQkvLwkJfSBlbHNlIHsKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0KLQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uRnJvbUJsb2NrZWRUZXh0KHJlZ2lvbiwgb2Zmc2V0LCByZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIG1ldGhvZCB3aXRoICdJVGV4dFJlZ2lvbicgYXMgYXJndW1lbnQsIGV4Y2VwdCBmb3IKLQkgKiBSZWdpb25Db250YWluZXJzLCBpZiBpdCBoYXMgZW1iZWRkZWQgcmVnaW9ucywgdGhlbiB3ZSBuZWVkIHRvIGRyaWxsCi0JICogZG93biBhbmQgcmV0dXJuIERvY3VtZW50UGFydGl0aW9uIGJhc2VkIG9uICJsb3dlc3QgbGV2ZWwiIHJlZ2lvbiB0eXBlLgotCSAqIEZvciBleGFtcGxlLCBpbiA8Ym9keSBpZD0iIDwlPSBvYmplY3QuZ2V0SUQoKSAlPiIgPiBUaGUgdGV4dCBiZXR3ZWVuCi0JICogPCU9IGFuZCAlPiB3b3VsZCBiZSBhICJqYXZhIHJlZ2lvbiIgbm90IGFuICJIVE1MIHJlZ2lvbiIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uQ29udGFpbmVyIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyBUT0RPIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlICdjbGVhbmVkIHVwJyBhZnRlciByZWZhY3RvcmluZwotCQkvLyBpdHMgaW5zdGFuY2VvZiBsb2dpYyBzZWVtcyBtZXNzZWQgdXAgbm93LgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjb3JlUmVnaW9uID0gcmVnaW9uOwotCQkJaWYgKGNvcmVSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uLCAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uKS5nZXRSZWdpb25zKCksIG9mZnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUocmVnaW9uKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uKSByZWdpb24sIG9mZnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb25Db250YWluZXIgY29yZVJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMsIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoY29yZVJlZ2lvbi5jb250YWluc09mZnNldChyZWdpb24sIG9mZnNldCkpIHsKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3IgdGhlIHplcm8tbGVuZ3RoIHBhcnRpdGlvbiBiZXR3ZWVuIGEKLQkgKiBzdGFydCB0YWcgYW5kIGVuZCB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSByZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbgotCSAqIEBwYXJhbSBuZXh0RW5kVGFnTmFtZVJlZ2lvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElUZXh0UmVnaW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuIEZvciBtb3N0IGNhc2VzLCB0aGlzIHdpbGwKLQkgKiBiZSB0aGUgZmxhdE5vZGUgaXRzZWxmLiBTaG91bGQgaXQgY29udGFpbiBhbiBlbWJlZGRlZAotCSAqIElUZXh0UmVnaW9uQ29udGFpbmVyLCB3aWxsIHJldHVybiB0aGUgaW50ZXJuYWwgcmVnaW9uIGF0IHRoZSBvZmZzZXQKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBJVGV4dFJlZ2lvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFJlbGV2ZW50UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vCQkqIE5vdGU6IHRoZSBvcmlnaW5hbCBmb3JtIG9mIHRoaXMgbWV0aG9kIC0tIHdoaWNoIHJldHVybmVkICJkZWVwIgotCQkvLyByZWdpb24sIGlzbid0IHRoYXQKLQkJLy8JCSogdXNlZnVsLCBhZnRlciBkb2luZyBwYXJlbnQgZWxpbWluYXRpb24gcmVmYWN0b3JpbmcsCi0JCS8vCQkqIHNpbmNlIG9uY2UgdGhlIGRlZXAgcmVnaW9uIGlzIHJldHVybmVkLCBpdHMgaGFyZCB0byBnZXQgaXRzIHRleHQKLQkJLy8gb3Igb2Zmc2V0IHdpdGhvdXQKLQkJLy8JCSogcHJvcGVyIHBhcmVudC4KLQkJSVRleHRSZWdpb24gcmVzdWx0UmVnaW9uID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5zRW1iZWRkZWRSZWdpb24oZmxhdE5vZGUpKSB7Ci0JCQlyZXN1bHRSZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKHJlc3VsdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJcmVzdWx0UmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHJlc3VsdFJlZ2lvbikuZ2V0UmVnaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJCQlyZXN1bHRSZWdpb24gPSByZWdpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdFJlZ2lvbiA9IGZsYXROb2RlOwotCQl9Ci0JCXJldHVybiByZXN1bHRSZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFRvIGJlIHVzZWQsIGluc3RlYWQgb2YgZGVmYXVsdCwgd2hlbiB0aGVyZSBpcyBzb21lIHRoaW5nIHN1cnByaXNpbmcKLQkgKiBhYm91dCBhcmUgYXR0ZW1wdCB0byBwYXJ0aXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVua25vd24oKSB7Ci0JCXJldHVybiBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0JfQotCi0JLyoqCi0JICogdG8gYmUgYWJzdHJhY3QgZXZlbnR1YWxseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde0lTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZQotCSAqIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkgYmVlbiBjb25uZWN0ZWQgdG8gdGhlCi0JICogcGFydGl0aW9uZXIuIElmIHRoZSBjaGVja0JldHdlZW4gcGFyYW1ldGVyIGlzIHRydWUsIGFuIG9mZnNldCBiZXR3ZWVuIGEKLQkgKiBzdGFydCBhbmQgZW5kIHRhZyB3aWxsIHJldHVybiBhIHplcm8tbGVuZ3RoIHJlZ2lvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxHZXRQYXJ0aXRpb24oaW50IG9mZnNldCwgYm9vbGVhbiBjaGVja0JldHdlZW4pIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgcGFydGl0aW9uZXIgaXMgbm90IGNvbm5lY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlib29sZWFuIHBhcnRpdGlvbkZvdW5kID0gZmFsc2U7Ci0JCWludCBkb2NMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQkvLyBnZXQgZG9jdW1lbnQgcmVnaW9uIHR5cGUgYW5kIG1hcCB0byBwYXJ0aXRpb24gdHlwZSA6Ci0JCS8vIE5vdGU6IGEgcGFydGlvbiBjYW4gYmUgc21hbGxlciB0aGFuIGEgZmxhdG5vZGUsIGlmIHRoYXQgZmxhdG5vZGUKLQkJLy8gY29udGFpbnMgYSByZWdpb24gY29udGFpbmVyLgotCQkvLyBUaGF0J3Mgd2h5IHdlIG5lZWQgdG8gZ2V0ICJyZWxldmVudCByZWdpb24iLgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJLy8gZmxhdE5vZGUgaXMgbnVsbCBpZiBlbXB0eSBkb2N1bWVudAotCQkvLyB0aGlzIGlzIGtpbmcgb2YgYSAibm9ybWFsIGNhc2UiIGZvciBlbXB0eSBkb2N1bWVudAotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgJiYgZG9jTGVuZ3RoID09IDApIHsKLQkJCS8vIEluIG9yZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgZXJyb3IgbG9vcHMsIHRoaXMgcGFydGl0aW9uIG11c3QKLQkJCS8vIG5ldmVyIGhhdmUgYSB6ZXJvIGxlbmd0aAotCQkJLy8gdW5sZXNzIHRoZSBkb2N1bWVudCBpcyBhbHNvIHplcm8gbGVuZ3RoCi0JCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDAsIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkpOwotCQkJcGFydGl0aW9uRm91bmQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsICYmIGRvY0xlbmd0aCAhPSAwKSB7Ci0JCQkvLyB0aGlzIGNhc2UgaXMgInVudXN1YWwiLiBXaGVuIHdvdWxkIHJlZ2lvbiBiZSBudWxsLCBhbmQgZG9jdW1lbnQKLQkJCS8vIGxvbmdlcgotCQkJLy8gdGhhbiAwLiBJIHRoaW5rIHRoaXMgbWVhbnMgc29tZXRoaW5ncyAib3V0IG9mIHN5bmMiLiBBbmQgd2UgbWF5Ci0JCQkvLyB3YW50Ci0JCQkvLyB0byAiZmxhZyIgdGhhdCBmYWN0IGFuZCBqdXN0IHJldHVybiBvbmUgYmlnIHJlZ2lvbiBvZgotCQkJLy8gJ3Vua25vd24nLCBpbnN0ZWFkCi0JCQkvLyBvZiBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4KLQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0VW5rbm93bigpKTsKLQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjaGVja0JldHdlZW4pIHsKLQkJCS8vIGRtdzogbWluaW1pemVzIG91dCB0byB0aGUgZmlyc3QgaWYgdGVzdCBhYm92ZQotCQkJLy8JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgJiYgZG9jTGVuZ3RoID09IDApIHsKLQkJCS8vCQkJCS8vIGtub3duIHNwZWNpYWwgY2FzZSBmb3IgYW4gZW1wdHkgZG9jdW1lbnQKLQkJCS8vCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdCgpKTsKLQkJCS8vCQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJCS8vCQkJfQotCQkJLy8JCQllbHNlCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPT0gb2Zmc2V0KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJCWlmIChwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQkJSVRleHRSZWdpb24gcHJldmlvdXNTdGFydCA9IHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQlwYXJ0aXRpb25Gb3VuZCA9IGRvUGFyc2VyU3BlY2lmaWNDaGVjayhvZmZzZXQsIHBhcnRpdGlvbkZvdW5kLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBuZXh0LCBwcmV2aW91c1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZG13OiBHaXZlbiB0aGUgZmlyc3QgdHdvIHRlc3RzIGFib3ZlIG1pbmltaXplIHRvIHRoaXMsIHRoaXMgYmxvY2sKLQkJLy8gY2FuIG5ldmVyIHJ1biwgcmlnaHQ/Ci0JCS8vCQllbHNlIGlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkvLwkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdCgpKTsKLQkJLy8JCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCS8vCQl9Ci0KLQkJaWYgKCFwYXJ0aXRpb25Gb3VuZCkgewotCQkJSVRleHRSZWdpb24gcmVzdWx0UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlwYXJ0aXRpb25Gb3VuZCA9IGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlc3VsdFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCWlmICghcGFydGl0aW9uRm91bmQpIHsKLQkJCQkvLyBOb3RlOiB0aGlzIG5ldyBsb2dpYyBkb2Vzbid0IGhhbmRsZSBjb250YWluZXIgcmVnaW9ucwotCQkJCS8vIGluc2lkZSBvZgotCQkJCS8vIGNvbnRhaW5lciByZWdpb25zIC4uLiBtYXkgbmVlZCB0byBtYWtlIHRoaXMgZmlyc3QgY2xhdXNlCi0JCQkJLy8gYSByZWN1cnNpdmUgbWV0aG9kCi0JCQkJaWYgKHJlc3VsdFJlZ2lvbiAhPSBudWxsICYmIHJlc3VsdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lclJlZ2lvbiA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVzdWx0UmVnaW9uOwotCQkJCQkvLyB0aGVuIG5lZWQgdG8gImRyaWxsIGRvd24iIGZvciByZWxldmVudCByZWdpb24gYW5kCi0JCQkJCS8vIHJlbGV2ZW50IG9mZnNldAotCQkJCQlJVGV4dFJlZ2lvbiBkZWVwUmVnaW9uID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSBjb250YWluZXJSZWdpb24uZ2V0RW5kT2Zmc2V0KGRlZXBSZWdpb24pOwotCQkJCQlTdHJpbmcgdHlwZSA9IGdldFBhcnRpdGlvblR5cGUoZGVlcFJlZ2lvbiwgZW5kT2Zmc2V0KTsKLQkJCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQsIHR5cGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyZXN1bHRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKHJlc3VsdFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChyZXN1bHRSZWdpb24pIC0gb2Zmc2V0LCB0eXBlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNhbiBoYXBwZW4gYXQgRU9GCi0JCQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDEsIGdldFVua25vd24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBmb3IgYSBwZXItU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG92ZXJyaWRlIHNlbGVjdGluZyB0aGUKLQkgKiBwYXJ0aXRpb24gdHlwZSB1c2luZyBtb3JlIHRoYW4ganVzdCBhIHNpbmdsZSBJVGV4dFJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICB0aGUgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbnRhaW5lZENoaWxkUmVnaW9uCi0JICogICAgICAgICAgICBhbiBJVGV4dFJlZ2lvbiB3aXRoaW4gdGhlIGdpdmVuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhhdCB3b3VsZCBub3JtYWxseSBkZXRlcm1pbmUgdGhlIHBhcnRpdGlvbiB0eXBlIGJ5IGl0c2VsZgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcnRpdGlvbiB0eXBlIHdpbGwgYmUgb3ZlcnJpZGRlbiwgZmFsc2UgdG8KLQkgKiAgICAgICAgIGNvbnRpbnVlIG5vcm1hbCBwcm9jZXNzaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb250YWluZWRDaGlsZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLnNldFR5cGUodHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMzJmNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0NvbW1hbmRDdXJzb3JQb3NpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEN1cnNvclBvc2l0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVkb1NlbGVjdGlvbkxlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFVuZG9DdXJzb3JQb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzODgyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudAotCSAqLwotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0JLyoqCi0JICogU2V0cyBhIG5ldyBzZWxlY3Rpb24gaW4gdGhlIGRvY3VtZW50IGFzIGEgcmVzdWx0IG9mIGFuIHVuZG8gb3BlcmF0aW9uLgotCSAqIAotCSAqIFVuZG9Eb2N1bWVudEV2ZW50IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHVuZG8gb3BlcmF0aW9uLCBhbmQgdGhlCi0JICogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIG5ldyBzZWxlY3Rpb24uIEltcGxlbWVudGF0aW9uIG9mCi0JICogSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgY2FuIGNoZWNrIGlmIGl0J3MgdGhlIHJlcXVlc3RlciB0aGF0IGNhdXNlZAotCSAqIHRoZSBuZXcgc2VsZWN0aW9uLCBhbmQgZGVjaWRlIGlmIHRoZSBuZXcgc2VsZWN0aW9uIHNob3VsZCBiZSBhcHBsaWVkLgotCSAqLwotCXZvaWQgdW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQoVW5kb0RvY3VtZW50RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjNzQxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBDb25uZWN0IHRoZSBtZWRpYXRvciB0byB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcik7Ci0KLQkvKioKLQkgKiBEaXNhYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQl2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGUgbWVkaWF0b3IgZnJvbSB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcik7Ci0KLQkvKioKLQkgKiBFbmFibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBFbmQgcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBOb3JtYWxseSwgdGhlIHVuZG8gbWFuYWdlciBjYW4gZmlndXJlIG91dCB0aGUgYmVzdCB0aW1lcyB3aGVuIHRvIGVuZCBhCi0JICogcGVuZGluZyBjb21tYW5kIGFuZCBiZWdpbiBhIG5ldyBvbmUgLi4uIHRvIHRoZSBzdHJ1Y3R1cmUgb2YgYSBzdHJ1Y3R1ZWQKLQkgKiBkb2N1bWVudC4gVGhlcmUgYXJlIHRpbWVzLCBob3dldmVyLCB3aGVuIGNsaWVudHMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUKLQkgKiB0aG9zZSBhbGdvcml0aG1zIGFuZCBlbmQgb25lIGVhcmxpZXIgdGhhbiBub3JtYWwuIFRoZSBvbmUga25vd24gY2FzZSBpcwotCSAqIGZvciBtdWx0aXBhZ2UgZWRpdG9ycy4gSWYgYSB1c2VyIGlzIG9uIG9uZSBwYWdlLCBhbmQgdHlwZSAnMTIzJyBhcwotCSAqIGF0dHJpYnV0ZSB2YWx1ZSwgdGhlbiBjbGljayBhcm91bmQgdG8gb3RoZXIgcGFydHMgb2YgcGFnZSwgb3IgZGlmZmVyZW50Ci0JICogcGFnZXMsIHRoZW4gcmV0dXJuIHRvICcxMjN8JyBhbmQgdHlwZSA0NTYsIHRoZW4gInVuZG8iIHRoZXkgdHlwaWNhbGx5Ci0JICogZXhwZWN0IHRoZSB1bmRvIHRvIGp1c3QgdW5kbyB3aGF0IHRoZXkganVzdCB0eXBlZCwgdGhlIDQ1Niwgbm90IHRoZQotCSAqIHdob2xlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGVyZSBpcyBubyBwZW5kaW5nIGNvbW1hbmQsIHRoZSByZXF1ZXN0IGlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJyZW50UG9zaXRpb24sIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogU29tZSBjbGllbnRzIG5lZWQgdG8gZG8gY29tcGxpY2F0ZWQgdGhpbmdzIHdpdGggdW5kbyBzdGFjay4gUGx1cywgaW4KLQkgKiBzb21lIGNhc2VzLCBpZiBjbGllbnRzIHNldENvbW1hbmRTdGFjayB0ZW1wb3JhcmlseSwgdGhleSBoYXZlCi0JICogcmVwb25zaWJpbGl0eSB0byBzZXQgYmFjayB0byBvcmlnaW5hbCBvbmUgd2hlbiBmaW5pc2hlZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpOwotCi0JLyoqCi0JICogR2V0IHRoZSByZWRvIGNvbW1hbmQgZXZlbiBpZiBpdCdzIG5vdCBjb21taXR0ZWQgeWV0LgotCSAqLwotCUNvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdW5kbyBjb21tYW5kIGV2ZW4gaWYgaXQncyBub3QgY29tbWl0dGVkIHlldC4KLQkgKi8KLQlDb21tYW5kIGdldFVuZG9Db21tYW5kKCk7Ci0KLQkvKioKLQkgKiBSZWRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIHJlZG8oKTsKLQotCS8qKgotCSAqIFJlZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyIGFuZCBub3RpZnkgdGhlIHJlcXVlc3RlcgotCSAqIGFib3V0IHRoZSBuZXcgc2VsZWN0aW9uLgotCSAqLwotCXZvaWQgcmVkbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSB0ZXh0IGNoYW5nZSBjYW4gYmUgcmVwZWF0ZWQuIEEgdGV4dCBjaGFuZ2UKLQkgKiBjYW4gYmUgcmVwZWF0ZWQgb25seSBpZiBpdCB3YXMgZXhlY3V0ZWQgYW5kIHJvbGxlZCBiYWNrLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb24gdGV4dCBjaGFuZ2UgY2FuIGJlIHJlcGVhdGVkCi0JICovCi0JYm9vbGVhbiByZWRvYWJsZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBjb21tYW5kIHN0YWNrLgotCSAqLwotCXZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spOwotCi0JLyoqCi0JICogVW5kbyB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCB1bmRvKCk7Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlciBhbmQgbm90aWZ5IHRoZSByZXF1ZXN0ZXIKLQkgKiBhYm91dCB0aGUgbmV3IHNlbGVjdGlvbi4KLQkgKi8KLQl2b2lkIHVuZG8oSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhdCBsZWFzdCBvbmUgdGV4dCBjaGFuZ2UgY2FuIGJlIHJvbGxlZCBiYWNrLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIHRleHQgY2hhbmdlIGNhbiBiZSByb2xsZWQKLQkgKiAgICAgICAgIGJhY2sKLQkgKi8KLQlib29sZWFuIHVuZG9hYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2FkMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZFRleHRDb21tYW5kIHsKLQotCVN0cmluZyBnZXRUZXh0RGVsZXRlZCgpOwotCi0JaW50IGdldFRleHRFbmQoKTsKLQotCVN0cmluZyBnZXRUZXh0SW5zZXJ0ZWQoKTsKLQotCWludCBnZXRUZXh0U3RhcnQoKTsKLQotCXZvaWQgc2V0VGV4dERlbGV0ZWQoU3RyaW5nIHRleHREZWxldGVkKTsKLQotCXZvaWQgc2V0VGV4dEVuZChpbnQgdGV4dEVuZCk7Ci0KLQl2b2lkIHNldFRleHRJbnNlcnRlZChTdHJpbmcgdGV4dEluc2VydGVkKTsKLQotCXZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTI4MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkVGV4dENvbW1hbmQgewotCi0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOyAvLyBuZWVkZWQgZm9yIHVwZGF0aW5nIHRoZSB0ZXh0Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dERlbGV0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRFbmQgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0SW5zZXJ0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRTdGFydCA9IC0xOwotCi0JLyoqCi0JICogV2UgaGF2ZSBuby1hcmcgY29uc3RydWN0b3Igbm9uLXB1YmxpYyB0byBmb3JjZSBkb2N1bWVudCB0byBiZSBzcGVjZmllZC4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7IC8vIG5lZWRlZCBmb3IgdXBkYXRpbmcgdGhlIHRleHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qKgotCSAqIGdldFRleHREZWxldGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHREZWxldGVkKCkgewotCQlyZXR1cm4gZlRleHREZWxldGVkOwotCX0KLQotCS8qKgotCSAqIHRleHRFbmQgaXMgdGhlIHNhbWUgYXMgKHRleHRTdGFydCArIHRleHRJbnNlcnRlZC5sZW5ndGgoKSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmVGV4dEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0SW5zZXJ0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dEluc2VydGVkKCkgewotCQlyZXR1cm4gZlRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0JCXJldHVybiBmVGV4dFN0YXJ0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyBub3RlOiBvbmUgb2YgdGhlIGZldyBwbGFjZXMgd2UgcHJvZ3JhbWF0aWNhbGx5IGlnbm9yZSByZWFkLW9ubHkKLQkJCS8vIHNldHRpbmdzCi0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVwbGFjZVRleHQodGhpcywgZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJZkRvY3VtZW50LnJlcGxhY2UoZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBhc3N1bWVkIGltcG9zc2libGUsIGZvciBub3cKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0VGV4dERlbGV0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlbGV0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0RGVsZXRlZCkgewotCQlmVGV4dERlbGV0ZWQgPSB0ZXh0RGVsZXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0RW5kIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRFbmQoaW50IHRleHRFbmQpIHsKLQkJZlRleHRFbmQgPSB0ZXh0RW5kOwotCX0KLQotCS8qKgotCSAqIHNldFRleHRJbnNlcnRlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5zZXJ0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0SW5zZXJ0ZWQpIHsKLQkJZlRleHRJbnNlcnRlZCA9IHRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpIHsKLQkJZlRleHRTdGFydCA9IHRleHRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJLy8gbm90ZTogb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdlIHByb2dyYW1hdGljYWxseSBpZ25vcmUgcmVhZC1vbmx5Ci0JCQkvLyBzZXR0aW5ncwotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlcGxhY2VUZXh0KHRoaXMsIGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZXBsYWNlKGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gYXNzdW1lZCBpbXBvc3NpYmxlLCBmb3Igbm93Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjYTRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotCi0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRDdXJzb3JQb3NpdGlvbiB7Ci0JcHJvdGVjdGVkIGludCBmUmVkb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIGludCBmUmVkb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQlwcm90ZWN0ZWQgaW50IGZVbmRvQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCkgewotCQlzdXBlcihyZXN1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIoY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgc2V0IHRvIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZG9DdXJzb3JQb3NpdGlvbigpIHsKLQkJaW50IGN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkJaWYgKGZSZWRvQ3Vyc29yUG9zaXRpb24gIT0gLTEpCi0JCQljdXJzb3JQb3NpdGlvbiA9IGZSZWRvQ3Vyc29yUG9zaXRpb247Ci0JCWVsc2UgaWYgKCFjb21tYW5kTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWludCBjb21tYW5kTGlzdFNpemUgPSBjb21tYW5kTGlzdC5zaXplKCk7Ci0JCQlDb21tYW5kIGxhc3RDb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRMaXN0LmdldChjb21tYW5kTGlzdFNpemUgLSAxKTsKLQotCQkJaWYgKGxhc3RDb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZEN1cnNvclBvc2l0aW9uKQotCQkJCWN1cnNvclBvc2l0aW9uID0gKChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGxhc3RDb21tYW5kKS5nZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJfQotCi0JCXJldHVybiBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKCkgewotCQlyZXR1cm4gZlJlZG9TZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVbmRvQ3Vyc29yUG9zaXRpb24oKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCi0JCWlmIChmVW5kb0N1cnNvclBvc2l0aW9uICE9IC0xKQotCQkJY3Vyc29yUG9zaXRpb24gPSBmVW5kb0N1cnNvclBvc2l0aW9uOwotCQllbHNlIGlmICghY29tbWFuZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkvLyBuZXZlciB1c2VkCi0JCQkvL2ludCBjb21tYW5kTGlzdFNpemUgPSBjb21tYW5kTGlzdC5zaXplKCk7Ci0JCQlDb21tYW5kIGZpcnN0Q29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQoMCk7Ci0KLQkJCWlmIChmaXJzdENvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kQ3Vyc29yUG9zaXRpb24pCi0JCQkJY3Vyc29yUG9zaXRpb24gPSAoKENvbW1hbmRDdXJzb3JQb3NpdGlvbikgZmlyc3RDb21tYW5kKS5nZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJfQotCi0JCXJldHVybiBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCkgewotCQlyZXR1cm4gZlVuZG9TZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHVzZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCWZSZWRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZG9TZWxlY3Rpb25MZW5ndGgoaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQlmUmVkb1NlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuZG9DdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJZlVuZG9DdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQwMjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gaW5pdGlhbCBJRG9jdW1lbnRFeHRlbnNpb240IHN1cHBvcnQgLSAjMTAyODIyCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB7Ci0KLQljbGFzcyBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGltcGxlbWVudHMgQ29tbWFuZFN0YWNrTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJfQotCX0KLQotCWNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIERvIG5vdGhpbmcuIERvIG5vdCBwdXNoIHRoZSBuZXcgbW9kZWwncyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCS8vIGNoYW5nZXMKLQkJCS8vIG9udG8gdGhlIHVuZG8gY29tbWFuZCBzdGFjaywgb3IgZWxzZSB0aGUgdXNlciBtYXkgYmUgYWJsZSB0bwotCQkJLy8gdW5kbwotCQkJLy8gYW4gZXhpc3RpbmcgZmlsZSB0byBhbiBlbXB0eSBmaWxlLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gU2luY2UgIm5vIGNoYW5nZSIsIGRvIG5vdGhpbmcuCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJpbmcgdGV4dERlbGV0ZWQsIFN0cmluZyB0ZXh0SW5zZXJ0ZWQsIGludCB0ZXh0U3RhcnQsIGludCB0ZXh0RW5kKSB7Ci0JCQlpZiAoZlRleHRDb21tYW5kICE9IG51bGwgJiYgdGV4dFN0YXJ0ID09IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBhcHBlbmQgdG8gdGhlIHRleHQgY29tbWFuZAotCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0RGVsZXRlZChmVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKS5jb25jYXQodGV4dERlbGV0ZWQpKTsKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dEluc2VydGVkKGZUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5jb25jYXQodGV4dEluc2VydGVkKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRFbmQodGV4dEVuZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmVGV4dENvbW1hbmQgIT0gbnVsbCAmJiB0ZXh0U3RhcnQgPT0gZlRleHRDb21tYW5kLmdldFRleHRTdGFydCgpIC0gKHRleHRFbmQgLSB0ZXh0U3RhcnQgKyAxKSAmJiB0ZXh0RW5kIDw9IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkgLSAodGV4dEVuZCAtIHRleHRTdGFydCArIDEpICYmIHRleHREZWxldGVkLmxlbmd0aCgpID09IDEgJiYgdGV4dEluc2VydGVkLmxlbmd0aCgpID09IDApIHsKLQkJCQkvLyBiYWNrc3BhY2UgcHJlc3NlZAotCi0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIganVzdCBpbnNlcnRlZAotCQkJCWlmIChmVGV4dENvbW1hbmQuZ2V0VGV4dEluc2VydGVkKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQoZlRleHRDb21tYW5kLmdldFRleHRJbnNlcnRlZCgpLnN1YnN0cmluZygwLCBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIC0gZlRleHRDb21tYW5kLmdldFRleHRTdGFydCgpIC0gMSkpOwotCQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJCQl9Ci0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUKLQkJCQllbHNlIHsKLQkJCQkJZlRleHRDb21tYW5kLnNldFRleHREZWxldGVkKHRleHREZWxldGVkLmNvbmNhdChmVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKSkpOwotCQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dFN0YXJ0KHRleHRTdGFydCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3JlYXRlTmV3VGV4dENvbW1hbmQodGV4dERlbGV0ZWQsIHRleHRJbnNlcnRlZCwgdGV4dFN0YXJ0LCB0ZXh0RW5kKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBjdXJzb3IgcG9zaXRpb24KLQkJCWZDdXJzb3JQb3NpdGlvbiA9IHRleHRFbmQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBOb3RlOiBmTGlzdGVuaW5nIHRlbGxzIHVzIGlmIHdlIHNob3VsZCBsaXN0ZW4gdG8gdGhlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4KLQkJCS8vIGZMaXN0ZW5pbmcgaXMgc2V0IHRvIGZhbHNlIHJpZ2h0IGJlZm9yZSB0aGUgdW5kby9yZWRvIHByb2Nlc3MKLQkJCS8vIGFuZAotCQkJLy8gdGhlbiBzZXQgdG8gdHJ1ZSBhZ2FpbgotCQkJLy8gcmlnaHQgYWZ0ZXIgdGhlIHVuZG8vcmVkbyBwcm9jZXNzIHRvIGJsb2NrIG91dCBhbmQgaWdub3JlIGFsbAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnRzIGdlbmVyYXRlZAotCQkJLy8gYnkgdGhlIHVuZG8vcmVkbyBwcm9jZXNzLgotCi0JCQkvLyBQcm9jZXNzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGlmIGZMaXN0ZW5pbmcgaXMgdHJ1ZS4KLQkJCS8vCi0JCQkvLyBXZSBhcmUgZXhlY3V0aW5nIGEgY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrIGlmIHRoZQotCQkJLy8gcmVxdWVzdGVyCi0JCQkvLyBpcyBhIGNvbW1hbmQgKGZvciBleGFtcGxlLCB1bmRvL3JlZG8pLgotCQkJLy8gV2Ugc2hvdWxkIG5vdCBwcm9jZXNzIHRoZSBmbGF0IG1vZGVsIGV2ZW50IHdoZW4gd2UgYXJlCi0JCQkvLyBleGVjdXRpbmcgYQotCQkJLy8gY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrLgotCQkJaWYgKGZVbmRvTWFuYWdlbWVudEVuYWJsZWQgJiYgIShzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpIGluc3RhbmNlb2YgQ29tbWFuZCkpIHsKLQkJCQkvLyBjaGVjayByZXF1ZXN0ZXIgaWYgbm90IHJlY29yZGluZwotCQkJCWlmICghZlJlY29yZGluZykKLQkJCQkJY2hlY2tSZXF1ZXN0ZXIoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSk7Ci0KLQkJCQkvLyBwcm9jZXNzIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCQkJCVN0cmluZyB0ZXh0RGVsZXRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldERlbGV0ZWRUZXh0KCk7Ci0JCQkJU3RyaW5nIHRleHRJbnNlcnRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFRleHQoKTsKLQkJCQlpbnQgdGV4dFN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IHRleHRFbmQgPSB0ZXh0U3RhcnQgKyB0ZXh0SW5zZXJ0ZWQubGVuZ3RoKCk7Ci0JCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHRleHREZWxldGVkLCB0ZXh0SW5zZXJ0ZWQsIHRleHRTdGFydCwgdGV4dEVuZCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hBTkdFX1RFWFQgPSBTU0VDb3JlTWVzc2FnZXMuVGV4dF9DaGFuZ2VfVUlfOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgZkNvbW1hbmRTdGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ29tcG91bmRDb21tYW5kTGFiZWwgPSBudWxsOwotCWludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGZJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyOwotCS8vIHByaXZhdGUgTWFwIGZUZXh0Vmlld2VyVG9MaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcltdIGZNZWRpYXRvcnMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUmVjb3JkaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZlJlY29yZGluZ0NvdW50ID0gMDsKLQlwcml2YXRlIE9iamVjdCBmUmVxdWVzdGVyOwotCVN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZlRleHRDb21tYW5kID0gbnVsbDsKLQlwcml2YXRlIGludCBmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JYm9vbGVhbiBmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIGludCBmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpIHsKLQkJdGhpcyhuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIoQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCWludCBvbGRTaXplID0gMDsKLQotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmTWVkaWF0b3JzLmxlbmd0aDsKLQkJCX0KLQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW10gbmV3TWVkaWF0b3JzID0gbmV3IElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW25ld1NpemVdOwotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1lZGlhdG9ycywgMCwgbmV3TWVkaWF0b3JzLCAwLCBvbGRTaXplKTsKLQkJCX0KLQotCQkJLy8gYWRkIHRoZSBuZXcgdW5kbyBtZWRpYXRvciB0byBsYXN0IHBvc2l0aW9uCi0JCQluZXdNZWRpYXRvcnNbbmV3U2l6ZSAtIDFdID0gbWVkaWF0b3I7Ci0KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQkJCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJLy8gc2F2ZSB0aGUgcmVxdWVzdGVyCi0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0KLQkJLy8gdXBkYXRlIGxhYmVsIGFuZCBkZXNjIG9ubHkgb24gdGhlIGZpcnN0IGxldmVsIHdoZW4gcmVjb3JkaW5nIGlzCi0JCS8vIG5lc3RlZAotCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IGxhYmVsOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmRMYWJlbCA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCS8vIGNsZWFyIGNvbW1hbmRzCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQlmUmVjb3JkaW5nQ291bnQrKzsKLQkJZlJlY29yZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aCBzcGVjaWZpZWQKLQkJLy8gcmVzZXQgdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aAotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCXZvaWQgY2hlY2tSZXF1ZXN0ZXIoT2JqZWN0IHJlcXVlc3RlcikgewotCQlpZiAoZlJlcXVlc3RlciAhPSBudWxsICYmICFmUmVxdWVzdGVyLmVxdWFscyhyZXF1ZXN0ZXIpKSB7Ci0JCQkvLyBGb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyBzbyB0aGUgbGFzdCBjb21wb3VuZCBjb21tYW5kIGlzCi0JCQkvLyBjbG9zZWQuCi0JCQkvLwotCQkJLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5vdCBmb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyB3aGVuIHRoZQotCQkJLy8gcmVxdWVzdCBjYW1lIGZyb20gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciBvcgotCQkJLy8gWE1MTW9kZWxJbXBsCi0JCQkvLyBiZWNhdXNlIGN1dC9wYXN0ZSByZXF1ZXN0cyBhbmQgY2hhcmFjdGVyIGluc2VydHMgdG8gdGhlCi0JCQkvLyB0ZXh0Vmlld2VyIGFyZSBmcm9tIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIsCi0JCQkvLyBhbmQgcmVxdWVzdHMgdG8gZGVsZXRlIGEgbm9kZSBpbiB0aGUgWE1MVGFibGVUcmVlVmlld2VyIGFyZQotCQkJLy8gZnJvbSBYTUxNb2RlbEltcGwgKHdoaWNoIGltcGxlbWVudHMgSVN0cnVjdHVyZWRNb2RlbCkuCi0KLQkJCWlmICghKHJlcXVlc3RlciBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwgfHwgcmVxdWVzdGVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWVkaWF0b3IpOwotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCS8vIGFkZCB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQlmRG9jdW1lbnQgPSBtZWRpYXRvci5nZXREb2N1bWVudCgpOwotCQkJLy8gZnV0dXJlX1RPRE86IGV2ZW50dWFsbHkgd2Ugd2FudCB0byByZWZhY3RvciBvciBhbGxvdyBlaXRoZXIKLQkJCS8vIHR5cGUgb2YgZG9jdW1lbnQsIGJ1dCBmb3Igbm93LCB3ZSdsbCBkbyBpbnN0YW5jZW9mIGNoZWNrLCBhbmQKLQkJCS8vIGZhaWwKLQkJCS8vIGlmIG5vdCByaWdodCB0eXBlCi0JCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihnZXRJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25seSBtZWRpdGF0b3Igd2l0aCBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBjdXJyZW50bHkgaGFuZGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGhhZCBvdXIgZG9jdW1lbnQgc2V0LCB3ZSdsbCBqdXN0IGRvIHRoaXMgZmFpbAotCQkJLy8gZmFzdCBpbnRlZ3JpdHkgY2hlY2sKLQkJCWlmICghZkRvY3VtZW50LmVxdWFscyhtZWRpYXRvci5nZXREb2N1bWVudCgpKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIHRvIHVuZG8gbWFuYWdlciBmYWlsZWQuIERvY3VtZW50IGZvciBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IgaW5jb25pc3RlbnQgd2l0aCB1bmRvIG1hbmFnZXIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCX0KLQotCXZvaWQgY3JlYXRlTmV3VGV4dENvbW1hbmQoU3RyaW5nIHRleHREZWxldGVkLCBTdHJpbmcgdGV4dEluc2VydGVkLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCkgewotCQlTdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsIHRleHRDb21tYW5kID0gbmV3IFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoZkRvY3VtZW50KTsKLQkJdGV4dENvbW1hbmQuc2V0TGFiZWwoVEVYVF9DSEFOR0VfVEVYVCk7Ci0JCXRleHRDb21tYW5kLnNldERlc2NyaXB0aW9uKFRFWFRfQ0hBTkdFX1RFWFQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0U3RhcnQodGV4dFN0YXJ0KTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQodGV4dEluc2VydGVkKTsKLQotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgPT0gbnVsbCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb21wb3VuZENvbW1hbmQgPSBuZXcgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKCk7Ci0JCQkJY29tcG91bmRDb21tYW5kLnNldFVuZG9DdXJzb3JQb3NpdGlvbihmVW5kb0N1cnNvclBvc2l0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChmVW5kb1NlbGVjdGlvbkxlbmd0aCk7Ci0KLQkJCQljb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoZkNvbXBvdW5kQ29tbWFuZExhYmVsKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0RGVzY3JpcHRpb24oZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKHRleHRDb21tYW5kKTsKLQkJCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLQotCQkJCWZDb21wb3VuZENvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ29tcG91bmRDb21tYW5kLmFwcGVuZCh0ZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUodGV4dENvbW1hbmQpOwotCQl9Ci0KLQkJZlRleHRDb21tYW5kID0gdGV4dENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQotCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID09IDAgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQkvLyBmdXR1cmVfVE9ETzogZXZlbnR1YWxseSB3ZSB3YW50IHRvIHJlZmFjdG9yIG9yIGFsbG93IGVpdGhlcgotCQkJLy8gdHlwZSBvZiBkb2N1bWVudCwgYnV0IGZvciBub3csIHdlJ2xsIGRvIGluc3RhbmNlb2YgY2hlY2ssIGFuZAotCQkJLy8gZmFpbAotCQkJLy8gaWYgbm90IHJpZ2h0IHR5cGUKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGdldEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbmx5IG1lZGl0YXRvciB3aXRoIHN0cnVjdHVyZWQgZG9jdW1lbnRzIGN1cnJlbnRseSBoYW5kbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGlmIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQsIHRoZW4gZG9udCBldmVuIHRyYWNrIGl0Ci0JCQkvLyBhbnltb3JlCi0JCQkvLyAodGhpcyBhbGxvd3MgY29ubmVjdCB0byByZWNvbm5lY3QgdG8gZG9jdW1lbnQgYWdhaW4pCi0JCQlmRG9jdW1lbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0JCWZVbmRvTWFuYWdlbWVudEVuYWJsZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IChmVGV4dENvbW1hbmQgIT0gbnVsbCkgPyBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIDogLTE7Ci0JCWludCBzZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJLy8gUmVjb3JkaW5nIGNvdWxkIGJlIHN0b3BwZWQgYnkgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKCkuIE1ha2Ugc3VyZQotCQkvLyB3ZSBhcmUgc3RpbGwgcmVjb3JkaW5nIGJlZm9yZSBwcm9jZWVkaW5nLCBvciBlbHNlIGZSZWNvcmRpbmdDb3VudAotCQkvLyBtYXkgbm90IGJlIGJhbGFuY2VkLgotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgIT0gbnVsbCkgewotCQkJCWZDb21wb3VuZENvbW1hbmQuc2V0UmVkb0N1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJCQlmQ29tcG91bmRDb21tYW5kLnNldFJlZG9TZWxlY3Rpb25MZW5ndGgoc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCX0KLQotCQkJLy8gZW5kIHJlY29yZGluZyBpcyBhIGxvZ2ljYWwgc3RvcHBpbmcgcG9pbnQgZm9yIHRleHQgY29tbWFuZCwKLQkJCS8vIGV2ZW4gd2hlbiBmUmVjb3JkaW5nQ291bnQgPiAwIChpbiBuZXN0ZWQgYmVnaW5SZWNvcmRpbmcpCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQkJaWYgKGZSZWNvcmRpbmdDb3VudCA+IDApCi0JCQkJZlJlY29yZGluZ0NvdW50LS07Ci0JCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCQlmUmVjb3JkaW5nID0gZmFsc2U7Ci0KLQkJCQkvLyByZXNldCBjb21wb3VuZCBjb21tYW5kIG9ubHkgd2hlbiBmUmVjb3JkaW5nQ291bnQgPT0KLQkJCQkvLyAwCi0JCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCQkJZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gbnVsbDsKLQkJCQlmQ29tcG91bmRDb21tYW5kRGVzY3JpcHRpb24gPSBudWxsOwotCi0JCQkJLy8gQWxzbyByZXNldCBmUmVxdWVzdGVyCi0JCQkJZlJlcXVlc3RlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBmaW5kIG1vZGVsIGdpdmVuIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZpbmRTdHJ1Y3R1cmVkTW9kZWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIjZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnJlbnRQb3NpdGlvbiwgaW50IGxlbmd0aCkgewotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnJlbnRQb3NpdGlvbiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJcmVzZXRJbnRlcm5hbENvbW1hbmRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciNnZXRDb21tYW5kU3RhY2soKQotCSAqLwotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tMaXN0ZW5lciBnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZ2V0SW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFJlZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFVuZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJcmVkbyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZmluZFN0cnVjdHVyZWRNb2RlbChmRG9jdW1lbnQpOwotCi0JCWlmIChyZWRvYWJsZSgpKSB7Ci0JCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSBnZXRSZWRvQ29tbWFuZCgpOwotCQkJCWlmIChyZWRvQ29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCAmJgotCQkJCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOgotCQkJCQlkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCS8vIG1ha2Ugc3VyZSB0byByZWRvIGJlZm9yZSBzZXR0aW5nIGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCWZDb21tYW5kU3RhY2sucmVkbygpOwotCi0JCQkJLy8gc2V0IGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCXNldFJlZG9Eb2N1bWVudFNlbGVjdGlvbihyZXF1ZXN0ZXIsIHJlZG9Db21tYW5kKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWRvYWJsZSgpIHsKLQkJcmV0dXJuIGZDb21tYW5kU3RhY2suY2FuUmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCWlmIChmTWVkaWF0b3JzICE9IG51bGwgJiYgbWVkaWF0b3IgIT0gbnVsbCkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgYXJyYXksIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNZWRpYXRvcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbXSBuZXdNZWRpYXRvcnMgPSBuZXcgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1lZGlhdG9yc1tpXSA9PSBtZWRpYXRvcikgeyAvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdNZWRpYXRvcnNbaW5kZXgrK10gPSBmTWVkaWF0b3JzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlIG9sZAotCQkJCS8vIG9uZQotCQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlc2V0SW50ZXJuYWxDb21tYW5kcygpIHsKLQkJLy8gRWl0aGVyIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgY2hhbmdlIGV2ZW50IGlzCi0JCS8vIGNoYW5nZWQsIG9yIHRoZSBjb21tYW5kIHN0YWNrIGlzIGNoYW5nZWQuIE5lZWQgdG8gcmVzZXQgaW50ZXJuYWwKLQkJLy8gY29tbWFuZHMgc28gd2Ugd29uJ3QgY29udGludWUgdG8gYXBwZW5kIGNoYW5nZXMuCi0JCWZDb21wb3VuZENvbW1hbmQgPSBudWxsOwotCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCS8vIEFsc28gcmVzZXQgZlJlcXVlc3RlcgotCQlmUmVxdWVzdGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZkNvbW1hbmRTdGFjayAhPSBudWxsKQotCQkJZkNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkpOwotCi0JCWZDb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0KLQkJaWYgKGZDb21tYW5kU3RhY2sgIT0gbnVsbCkKLQkJCWZDb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoZ2V0SW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVkb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5sZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjdXJzb3JQb3NpdGlvbiA+IC0xICYmIGZNZWRpYXRvcnMgIT0gbnVsbCAmJiBmTWVkaWF0b3JzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk1lZGlhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZNZWRpYXRvcnNbaV0uZ2V0RG9jdW1lbnQoKTsKLQkJCQlmTWVkaWF0b3JzW2ldLnVuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKG5ldyBVbmRvRG9jdW1lbnRFdmVudChyZXF1ZXN0ZXIsIGRvY3VtZW50LCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpLmxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGN1cnNvclBvc2l0aW9uID4gLTEgJiYgZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWVkaWF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZk1lZGlhdG9yc1tpXS5nZXREb2N1bWVudCgpOwotCQkJCWZNZWRpYXRvcnNbaV0udW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQobmV3IFVuZG9Eb2N1bWVudEV2ZW50KHJlcXVlc3RlciwgZG9jdW1lbnQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXVuZG8obnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpIHsKLQkJLy8gRm9yY2UgYW4gZW5kUmVjb3JkaW5nIGJlZm9yZSB1bmRvLgotCQkvLwotCQkvLyBGb3IgZXhhbXBsZSwgcmVjb3JkaW5nIHdhcyB0dXJuZWQgb24gb24gdGhlIERlc2lnbiBQYWdlIG9mCi0JCS8vIFBhZ2VEZXNpZ25lci4KLQkJLy8gVGhlbiB1bmRvIGlzIGludm9rZWQgb24gdGhlIFNvdXJjZSBQYWdlLiBSZWNvcmRpbmcgc2hvdWxkIGJlCi0JCS8vIHN0b3BwZWQgYmVmb3JlIHdlIHVuZG8uCi0JCS8vIE5vdGUgdGhhdCByZWRvIHNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gd2Ugc3dpdGNoIHRvIHRoZSBTb3VyY2UKLQkJLy8gUGFnZS4KLQkJLy8gVGhlcmVmb3JlLCB0aGlzIGZvcmNlIGVuZGluZyBvZiByZWNvcmRpbmcgaXMgbm90IG5lZWRlZCBpbiByZWRvLgotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQotCQlpZiAodW5kb2FibGUoKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGZpbmRTdHJ1Y3R1cmVkTW9kZWwoZkRvY3VtZW50KTsKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlDb21tYW5kIHVuZG9Db21tYW5kID0gZ2V0VW5kb0NvbW1hbmQoKTsKLQkJCQlpZiAodW5kb0NvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQgJiYKLQkJCQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCkgPyBudWxsIDoKLQkJCQkJZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0JCQkJCi0JCQkJLy8gbWFrZSBzdXJlIHRvIHVuZG8gYmVmb3JlIHNldHRpbmcgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJZkNvbW1hbmRTdGFjay51bmRvKCk7Ci0KLQkJCQkvLyBzZXQgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKHJlcXVlc3RlciwgdW5kb0NvbW1hbmQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjay5jYW5VbmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1VuZG9Eb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyZjhkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFVuZG9Eb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCXByaXZhdGUgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgZlJlcXVlc3RlcjsKLQotCXB1YmxpYyBVbmRvRG9jdW1lbnRFdmVudChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlmUmVxdWVzdGVyID0gcmVxdWVzdGVyOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIGdldFJlcXVlc3RlcigpIHsKLQkJcmV0dXJuIGZSZXF1ZXN0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTIwYTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzIGluCi0gKiBjb2RlLiBUaGUgcHJlZGljYXRlIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUgdHlwZSBvZgotICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90IGhvbGQuCi0gKiA8cD4KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZSB0aHJvd24gd2hlbgotICogc29tZXRoaW5nIGlzIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkgdW5zcGVjaWZpZWQKLSAqIGJlaGF2aW9yOyBjb25zZXF1ZW50bHksIGNsaWVudHMgc2hvdWxkIG5ldmVyIHJlbHkgb24gdGhlc2UgYmVpbmcgdGhyb3duCi0gKiAoYW5kIGNlcnRhaW5seSBzaG91bGQgbm90IGJlaW5nIGNhdGNoaW5nIHRoZW0gc3BlY2lmaWNhbGx5KS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0KLQkvKioKLQkgKiA8Y29kZT5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb248L2NvZGU+IGlzIGEgcnVudGltZSBleGNlcHRpb24gdGhyb3duCi0JICogYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiA8Y29kZT5Bc3NlcnQ8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgY2xhc3MgaXMgbm90IGRlY2xhcmVkIHB1YmxpYyB0byBwcmV2ZW50IHNvbWUgbWlzdXNlczsgcHJvZ3JhbXMKLQkgKiB0aGF0IGNhdGNoIG9yIG90aGVyd2lzZSBkZXBlbmQgb24gYXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBzdXNjZXB0aWJsZSB0bwotCSAqIHVuZXhwZWN0ZWQgYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqIDwvcD4KLQkgKi8KLQljbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCQlzdXBlcihkZXRhaWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcwotCSAqIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNMZWdhbChleHByZXNzaW9uLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCkgewotCQlpc05vdE51bGwob2JqZWN0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJLy9Mb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIm51bGxfYXJndW1lbnQ6ICIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGYwMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVidWcgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjaGVja0Zvck1lbW9yeUxlYWtzID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29sbGVjdFN0YXRzID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUJVRyA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEhSRUFETE9DQUwgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0JyZWFrcG9pbnRzID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnQ2FyZXRNZWRpYXRvciA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0Rpc3BsYXlUcmVlUG9zaXRpb25zID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdNZWRpYXRvciA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdOb3RpZnlEZWZlcnJlZCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1JlY29uY2lsaW5nID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdSdGZGb3JtYXRQcm92aWRlciA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnU3RydWN0dXJlZERvY3VtZW50ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVGFnbGlicyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVG9rZW5pemVyID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdUcmVlTW9kZWwgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdVcGRhdGVUcmVlUG9zaXRpb25zID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlJbmZvID0gZmFsc2U7Ci0KLQkvKiogZWZmZWN0cyBvdXRwdXQgb2YgTG9nZ2VyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlUb0NvbnNvbGUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5V2FybmluZ3MgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoZWFkUGFyc2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBqc0RlYnVnQ29udGV4dEFzc2lzdCA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGpzRGVidWdTeW50YXhDb2xvcmluZyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0tTID0gZmFsc2U7Ci0JLy8gCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0QWRhcHRlckNsYXNzTG9hZGluZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdEZvcm1hdCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdFJhd1N0cnVjdHVyZWREb2N1bWVudE9ubHkgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5ID0gZmFsc2U7Ci0KLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzeW50YXhIaWdobGlnaHRpbmcgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VTdGFuZGFyZEVvbEluV2lkZ2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGb3IgdGVzdHMgYW5kIGRlYnVnIG9ubHkKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWR1bXAoc3RydWN0dXJlZERvY3VtZW50LCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZmxhdE5vZGUgPSBudWxsOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkR1bXAgb2Ygc3RydWN0dXJlZERvY3VtZW50OiIpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCUVudW1lcmF0aW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBmbGF0Tm9kZXMuZWxlbWVudHMoKTsKLQkJd2hpbGUgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWZsYXROb2RlID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCF2ZXJib3NlKSB7Ci0JCQkJU3RyaW5nIG91dFN0cmluZyA9IGZsYXROb2RlLnRvU3RyaW5nKCk7Ci0JCQkJb3V0U3RyaW5nID0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzLmVzY2FwZShvdXRTdHJpbmcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihvdXRTdHJpbmcpOwotCQkJfSBlbHNlIHsKLQkJCQlkdW1wKGZsYXROb2RlLCB2ZXJib3NlKTsKLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9ID0gPSA9ID0gPSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqIEBwYXJhbSB2ZXJib3NlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbiwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHZlcmJvc2UpIHsKLQkJCXByaW50UGFyZW50KHJlZ2lvbik7Ci0JCX0KLQkJcHJpbnRDaGlsZFJlZ2lvbnMocmVnaW9uLCAwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50Q2hpbGRSZWdpb25zKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24sIGludCBkZXB0aCkgewotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vID09PiAvLyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uQ29sbGVjdGlvbiA9IHJlZ2lvbjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZWdpb24pOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbkxpc3QuZ2V0KGkpOwotCQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByYyA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHI7Ci0JCQkJCXByaW50Q2hpbGRSZWdpb25zKHJjLCBkZXB0aCsrKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3BhY2UoZGVwdGgpICsgcik7Ci0JCQkJCWRlcHRoLS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2ltcGxlIHV0aWxpdHkgdG8gbWFrZSBzdXJlIHByaW50bG4ncyBhcmUgc29tZSB3aGF0IGluIG9yZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBwcmludGxuKFN0cmluZyBtc2cpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIlx0IiArIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudERvY3VtZW50KCkpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcmludFBhcmVudCgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKTsKLQkJfSBlbHNlIGlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJcHJpbnRQYXJlbnQoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pOwotCQl9IGVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyAiKG5hKSIgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVRleHRSZWdpb25Db250YWluZXIgcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3BhY2UoaW50IGRlcHRoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiICAiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJcmVzdWx0ICs9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nVXRpbChJU3RydWN0dXJlZERvY3VtZW50IG9iamVjdCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lOwotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nVXRpbChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWU7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogRGVidWcgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGVidWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50SW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjU5YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50SW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY3VtZW50SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZNYXJrID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlBvc2l0aW9uID0gMDsKLQotCXB1YmxpYyBEb2N1bWVudElucHV0U3RyZWFtKElEb2N1bWVudCBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gc291cmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0JCWZNYXJrID0gZlBvc2l0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrU3VwcG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChmUG9zaXRpb24gPCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRDaGFyKGZQb3NpdGlvbisrKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVzZXQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZQb3NpdGlvbiA9IGZNYXJrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWxvbmcgc2tpcHBlZCA9IG47Ci0JCWlmIChuIDwgZkRvY3VtZW50LmdldExlbmd0aCgpIC0gZlBvc2l0aW9uKSB7Ci0JCQlza2lwcGVkID0gbjsKLQkJCWZQb3NpdGlvbiArPSBza2lwcGVkOwotCQl9IGVsc2UgewotCQkJc2tpcHBlZCA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQkJCWZQb3NpdGlvbiA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gc2tpcHBlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDYzYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0phclV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmFyVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvZXJyYXRhXzFfMV9hXzA0MjgwMC5odG1sLCBJc3N1ZXMKLQkgKiAgICAgIDggJiA5Ci0JICogCi0JICogIlRoZXJlIGFyZSB0d28gY2FzZXMuIEluIGJvdGggY2FzZXMgdGhlIFRMRF9VUkkgaXMgdG8gYmUgaW50ZXJwcmV0ZWQKLQkgKiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSB0aGUKLQkgKiBUTERfVVJJIHJlZmVycyB0byBhIFRMRCBmaWxlIGRpcmVjdGx5LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBUTERfVVJJCi0JICogcmVmZXJzIHRvIGEgSkFSIGZpbGUuIElmIHNvLCB0aGF0IEpBUiBmaWxlIHNob3VsZCBoYXZlIGEgVExEIGF0Ci0JICogbG9jYXRpb24gTUVUQS1JTkYvdGFnbGliLnRsZC4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVEFHTElCID0gIk1FVEEtSU5GL3RhZ2xpYi50bGQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VKYXJGaWxlKFppcEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkphclV0aWxpdGllczogQ291bGQgbm90IGNsb3NlIGZpbGUgIiArIGZpbGUuZ2V0TmFtZSgpLCBpb2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHN0cmVhbSB0byBhIGxvY2FsIGNvcHkgb2YgdGhlIGlucHV0IG9yIG51bGwgaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRDYWNoZWRJbnB1dFN0cmVhbShTdHJpbmcgamFyRmlsZW5hbWUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGphckZpbGVuYW1lKTsKLQkJaWYgKCF0ZXN0RmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlucHV0U3RyZWFtIGNhY2hlID0gbnVsbDsKLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShqYXJGaWxlbmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKYXJVdGlsaXRpZXM6ICIgKyBqYXJGaWxlbmFtZSwgaW9FeGMpOyAvLyROT04tTkxTLTEkCi0JCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCX0KLQotCQlpZiAoamFyZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVppcEVudHJ5IHplbnRyeSA9IGphcmZpbGUuZ2V0RW50cnkoZW50cnlOYW1lKTsKLQkJCQlpZiAoemVudHJ5ICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gZW50cnlJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQllbnRyeUlucHV0U3RyZWFtID0gamFyZmlsZS5nZXRJbnB1dFN0cmVhbSh6ZW50cnkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSmFyVXRpbGl0aWVzOiAiICsgamFyRmlsZW5hbWUsIGlvRXhjKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKGVudHJ5SW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJaW50IGM7Ci0JCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbnVsbDsKLQkJCQkJCWlmICh6ZW50cnkuZ2V0U2l6ZSgpID4gMCkgewotCQkJCQkJCWJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKGludCkgemVudHJ5LmdldFNpemUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQkJCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd2hpbGUgKChjID0gZW50cnlJbnB1dFN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQkJCQlidWZmZXIud3JpdGUoYnl0ZXMsIDAsIGMpOwotCQkJCQkJCX0KLQkJCQkJCQljYWNoZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWVudHJ5SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW50cnlOYW1lcyhJUmVzb3VyY2UgamFyUmVzb3VyY2UpIHsKLQkJaWYgKGphclJlc291cmNlID09IG51bGwgfHwgamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCXJldHVybiBnZXRFbnRyeU5hbWVzKGphclJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSkgewotCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhqYXJGaWxlbmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSwgYm9vbGVhbiBleGNsdWRlRGlyZWN0b3JpZXMpIHsKLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJTGlzdCBlbnRyeU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJamFyZmlsZSA9IG5ldyBaaXBGaWxlKGphckZpbGVuYW1lKTsKLQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJmaWxlLmVudHJpZXMoKTsKLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJWmlwRW50cnkgeiA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmICghKHouaXNEaXJlY3RvcnkoKSAmJiBleGNsdWRlRGlyZWN0b3JpZXMpKQotCQkJCQllbnRyeU5hbWVzLmFkZCh6LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFppcEV4Y2VwdGlvbiB6RXhjKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSmFyVXRpbGl0aWVzIFppcEV4Y2VwdGlvbjogIiArIGphckZpbGVuYW1lICsgIiAiICsgekV4Yy5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJKYXJVdGlsaXRpZXMgSU9FeGNlcHRpb246ICIgKyBqYXJGaWxlbmFtZSArICIgIiArIGlvRXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBlbnRyeU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElSZXNvdXJjZSBqYXJSZXNvdXJjZSwgU3RyaW5nIGVudHJ5TmFtZSkgewotCQlpZiAoamFyUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW0oamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCBlbnRyeU5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGphckZpbGVuYW1lLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCS8vIGNoZWNrIHNhbml0eQotCQlpZiAoamFyRmlsZW5hbWUgPT0gbnVsbCB8fCBqYXJGaWxlbmFtZS5sZW5ndGgoKSA8IDEgfHwgZW50cnlOYW1lID09IG51bGwgfHwgZW50cnlOYW1lLmxlbmd0aCgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEpBUiBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBsZWFkaW5nICcvJyBpbiBtZW1iZXIgbmFtZXMKLQkJU3RyaW5nIGludGVybmFsTmFtZSA9IG51bGw7Ci0JCWlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDEpOwotCQllbHNlCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWU7Ci0KLQkJcmV0dXJuIGdldENhY2hlZElucHV0U3RyZWFtKGphckZpbGVuYW1lLCBpbnRlcm5hbE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUGF0aEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzEyMDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQ29sbGVjdGlvbiBvZiBoZWxwZXIgbWV0aG9kcyB0byBtYW5hZ2UgYW5kIGNvbnZlcnQgbGlua3MgT3JpZ2luYWxseSBwYXJ0IG9mCi0gKiB0aGUgTGlua3NNYW5hZ2VyIAotICovCi1wdWJsaWMgY2xhc3MgUGF0aEhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1dBUkRfU0xBU0ggPSAiXFwiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfU0xBU0ggPSAiLyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEFUSVZFX1BBVEhfU0lHID0gIi4uLyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYWRqdXN0IHJlbGF0aXZlIHBhdGggaXNzaWRlIHRoZSBhYnNvbHV0ZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRqdXN0UGF0aChTdHJpbmcgcGF0aCkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICgoaSA9IHBhdGguaW5kZXhPZihSRUxBVElWRV9QQVRIX1NJRykpID4gMCkgewotCQkJLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHR3bwotCQkJU3RyaW5nIHBhcnQxID0gcGF0aC5zdWJzdHJpbmcoMCwgaSAtIDEpOwotCQkJU3RyaW5nIHBhcnQyID0gcGF0aC5zdWJzdHJpbmcoaSArIFJFTEFUSVZFX1BBVEhfU0lHLmxlbmd0aCgpIC0gMSk7Ci0JCQkvLyBzdHJpcCBvbmUgcGF0aCBzZWcgZnJvbSBwYXJ0MQotCQkJaW50IGogPSBwYXJ0MS5sYXN0SW5kZXhPZihGT1JXQVJEX1NMQVNIKTsKLQkJCWlmIChqID09IC0xKSB7Ci0JCQkJLy8gY2FuJ3QgcmVzb2x2ZS4gcGFzc2VkIHBhdGggaXMgbGlrZQotCQkJCS8vIEU6L2VjbGlwc2Vwcm9qZWN0Ly4uLy4uL3NhbXBsZS5jc3MuCi0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhcnQxID0gcGFydDEuc3Vic3RyaW5nKDAsIGopOwotCQkJcGF0aCA9IHBhcnQxICsgcGFydDI7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRyYWlsaW5nIHVybCBzbGFzaCBpZiBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRUcmFpbGluZ1VSTFNsYXNoKFN0cmluZyBpbnB1dCkgewotCQkvLyBjaGVjayB0byBzZWUgYWxyZWFkeSBhIHNsYXNoCi0JCWlmICghaW5wdXQuZW5kc1dpdGgoRk9SV0FSRF9TTEFTSCkpIHsKLQkJCWlucHV0ICs9IEZPUldBUkRfU0xBU0g7Ci0JCX0KLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gcmVsYXRpdmUgdXJsIGJhc2VkIG9uIGJhc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZWxhdGl2ZShTdHJpbmcgaW5wdXQsIFN0cmluZyBiYXNlKSB7Ci0JCS8vIHRva2VuaXplIHRoZSBzdHJpbmdzCi0JCVN0cmluZ1Rva2VuaXplciBpbnB1dFRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5wdXQsIEZPUldBUkRfU0xBU0gpOwotCQlTdHJpbmdUb2tlbml6ZXIgYmFzZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYmFzZSwgRk9SV0FSRF9TTEFTSCk7Ci0JCVN0cmluZyB0b2tlbjEgPSAiIiwgdG9rZW4yID0gIiI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJLy8KLQkJLy8gR28gdGhyb3VnaCB1bnRpbCBlcXVscwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKCFpbnB1dFRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgfHwgIWJhc2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCQkJCWJyZWFrOwotCQkJdG9rZW4xID0gYmFzZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCXRva2VuMiA9IGlucHV0VG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKCF0b2tlbjEuZXF1YWxzKHRva2VuMikpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gbm93IGdlbmVyYXRlIHRoZSBiYWNrcwotCQlTdHJpbmcgb3V0cHV0ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQl3aGlsZSAoYmFzZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWJhc2VUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlvdXRwdXQgKz0gIi4uLyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlvdXRwdXQgKz0gdG9rZW4yOwotCQkvLyBnZW5lcmF0ZSB0aGUgcmVzdAotCQl3aGlsZSAoaW5wdXRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlvdXRwdXQgPSBvdXRwdXQgKyBGT1JXQVJEX1NMQVNIICsgaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5pbmcgZm9sZGVyIHBhdGguIFdpbGwgaGFuZGxlIGJvdGggdXJsIGFuZCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250YWluaW5nRm9sZGVyUGF0aChTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmV0VmFsdWUgPSBwYXRoOwotCi0JCWludCB1cmxTbGFzaEluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihGT1JXQVJEX1NMQVNIKTsKLQkJaW50IGZpbGVQYXRoU2xhc2hJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotCQlpbnQgaW5kZXggPSBmaWxlUGF0aFNsYXNoSW5kZXg7Ci0JCWlmICh1cmxTbGFzaEluZGV4ID4gZmlsZVBhdGhTbGFzaEluZGV4KQotCQkJaW5kZXggPSB1cmxTbGFzaEluZGV4OwotCQlpZiAoaW5kZXggPj0gMCkKLQkJCXJldFZhbHVlID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQlyZXR1cm4gcmV0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nUGF0aFNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGaWxlLnNlcGFyYXRvci5sZW5ndGgoKSk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGaWxlLnNlcGFyYXRvci5sZW5ndGgoKSk7Ci0JCWVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aChGT1JXQVJEX1NMQVNIKSB8fCBwYXRoLnN0YXJ0c1dpdGgoQkFDS1dBUkRfU0xBU0gpKQotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKEZPUldBUkRfU0xBU0gubGVuZ3RoKCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2ggdG8gZmlsZSBwYXRoIHNsYXNoZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hUb0ZpbGVQYXRoU2xhc2hlcyhTdHJpbmcgcGF0aCkgewotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZPUldBUkRfU0xBU0guY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEJBQ0tXQVJEX1NMQVNILmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoIHRvIGZpbGUgcGF0aCBzbGFzaGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoVG9Gb3J3YXJkU2xhc2hlcyhTdHJpbmcgcGF0aCkgewotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgRk9SV0FSRF9TTEFTSC5jaGFyQXQoMCkpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEJBQ0tXQVJEX1NMQVNILmNoYXJBdCgwKSwgRk9SV0FSRF9TTEFTSC5jaGFyQXQoMCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUHJvamVjdFJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUHJvamVjdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTJmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Byb2plY3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGUgVVJJUmVzb2x2ZXIgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgcmVzb2x2ZXIgZnJvbQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQlwcml2YXRlIFN0cmluZyBmRmlsZUJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGNsaWVudHMgdXNlCi0JICogcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSB0byBvYnRhaW4gYSBVUklSZXNvbHZlciBhd2FyZSBvZgotCSAqIHRoZSBQcm9qZWN0J3Mgc3BlY2lhbCByZXF1aXJlbWVudHMuIE5vdGUgdGhhdCBhIFVSSVJlc29sdmVyIG1heSBub3QgYmUKLQkgKiByZXR1cm5lZCBhdCBhbGwgc28gbWFudWFsbHkgY3JlYXRpbmcgdGhpcyBvYmplY3QgbWF5IHN0aWxsIGJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBQcm9qZWN0UmVzb2x2ZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZkZpbGVCYXNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCkpOwotCX0KLQotCS8vIGRlZmVjdCAyNDQ4MTcgZW5kCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgKHBvc3NpYmx5IHJlbGF0aXZlKSBVUkkgYWNvcmRpbmcgdG8gUkZDMTgwOCB1c2luZyB0aGUKLQkgKiBkZWZhdWx0IGZpbGUgYmFzZSBsb2NhdGlvbi4gUmVzb2x2ZXMgcmVzb3VyY2UgcmVmZXJlbmNlcyBpbnRvIGFic29sdXRlCi0JICogcmVzb3VyY2UgbG9jYXRpb25zIHdpdGhvdXQgZW5zdXJpbmcgdGhhdCB0aGUgcmVzb3VyY2UgYWN0dWFsbHkgZXhpc3RzLgotCSAqIAotCSAqIE5vdGU6IGN1cnJlbnRseSByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgaWdub3JlZCBpbiB0aGlzCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQlpZiAodXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLyoKLQkJICogZGVmZWN0IDI0NDgxNyB0cnkgeyBVUkwgYVVSTCA9IG5ldyBVUkwodXJpKTsKLQkJICovCi0JCS8qKgotCQkgKiBBbiBhY3R1YWwgVVJMIHdhcyBnaXZlbiwgYnV0IG9ubHkgdGhlICJmaWxlOi8vLyIgcHJvdG9jb2wgaXMKLQkJICogc3VwcG9ydGVkLiBSZXNvbHZlIHRoZSBVUkkgYnkgZmluZGluZyB0aGUgZmlsZSB0byB3aGljaCBpdCBwb2ludHMuCi0JCSAqLwotCQkvKgotCQkgKiBkZWZlY3QgMjQ0ODE3IGlmICghYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgewotCQkgKiAvLyROT04tTkxTLTEkIGlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYKLQkJICogKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0KLQkJICogMCkpIHsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQgcmV0dXJuIGFVUkwuZ2V0RmlsZSgpOyB9IHJldHVybgotCQkgKiB1cmk7IH0gfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgeyB9Ci0JCSAqLwotCQkvLyBkZWZlY3QgMjQ0ODE3IHN0YXJ0Ci0JCWlmIChpc0ZpbGVVUkwodXJpKSkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJCXJldHVybiBnZXRQYXRoKHVybCk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkvLyBkZWZlY3QgMjQ0ODE3IGVuZAotCi0JCS8vIHdoaWNoIG9mIHRoZSBzZXJ2ZXJhbCBhcmUgd2Ugc3VwcG9zZSB0byB1c2UgaGVyZT8KLQkJLy8KLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyMjMKLQkJLy8gV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBpbiBVUklIZWxwZXI7IHVyaXMgc3RhcnRpbmcgd2l0aCAnLycgYXJlCi0JCS8vIHJldHVybmVkIGFzLWlzLgotCQlTdHJpbmcgbG9jYXRpb24gPSB1cmk7Ci0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAocCAhPSBudWxsICYmIHAuZXhpc3RzKCkpCi0JCQkJbG9jYXRpb24gPSBwLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArIHVyaTsKLQkJfQotCQllbHNlIHsKLQkJCWxvY2F0aW9uID0gVVJJSGVscGVyLm5vcm1hbGl6ZSh1cmksIGJhc2VSZWZlcmVuY2UsIGdldFJvb3RMb2NhdGlvblN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBOb3RlOiBjdXJyZW50bHkgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIGlzIGlnbm9yZWQgaW4gdGhpcwotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBob3N0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXRoKElQYXRoIHBhdGgsIFN0cmluZyBob3N0KSB7Ci0JCUlQYXRoIG5ld1BhdGggPSBwYXRoOwotCQkvLyBUaGV5IGFyZSBwb3RlbnRpYWxseSBmb3Igb25seSBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0uCi0JCS8vIGEuKSBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoIElQYXRoLlNFUEFSQVRPUiwKLQkJLy8gcmVtb3ZlIGl0Ci0JCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwotCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCW5ld1BhdGggPSBwYXRoLnNldERldmljZShuZXdEZXZpY2UpOwotCQkJfQotCQl9Ci0JCS8vIGIuKSBpZiBpdCBoYXMgYSBob3N0bmFtZSwgaXQgaXMgVU5DIG5hbWUuLi4gQW55IGphdmEgb3IgZWNsaXBzZSBhcGkKLQkJLy8gaGVscHMgaXQgPz8KLQkJaWYgKHBhdGggIT0gbnVsbCAmJiBob3N0ICE9IG51bGwgJiYgaG9zdC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlJUGF0aCB1bmNQYXRoID0gbmV3IFBhdGgoaG9zdCk7Ci0JCQl1bmNQYXRoID0gdW5jUGF0aC5hcHBlbmQocGF0aCk7Ci0JCQluZXdQYXRoID0gdW5jUGF0aC5tYWtlVU5DKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyByZWYgPSB1cmwuZ2V0UmVmKCkgPT0gbnVsbCA/ICIiIDogIiMiICsgdXJsLmdldFJlZigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nIHN0clBhdGggPSB1cmwuZ2V0RmlsZSgpICsgcmVmOwotCQlJUGF0aCBwYXRoOwotCQlpZiAoc3RyUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwYXRoID0gUGF0aC5ST09UOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IG5ldyBQYXRoKHN0clBhdGgpOwotCQkJU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLQkJCVN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0clBhdGgsICI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCB0b2tlbkNvdW50ID0gcGFyc2VyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpKTsKLQkJCQlxdWVyeSA9IChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpOwotCQkJfQotCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKLQkJCQlwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgudG9TdHJpbmcoKSwgIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRva2VuQ291bnQgPSBwYXJzZXIuY291bnRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJCXBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKSBwYXJzZXIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYXRoKHBhdGgsIHVybC5nZXRIb3N0KCkpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290TG9jYXRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmUHJvamVjdC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIGRlZmVjdCAyNDQ4MTcgc3RhcnQKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFzc2VkU3BlYwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpbGVVUkwoU3RyaW5nIHBhc3NlZFNwZWMpIHsKLQkJaWYgKHBhc3NlZFNwZWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsIFN0cmluZyBzcGVjID0gcGFzc2VkU3BlYy50cmltKCk7Ci0JCWlmIChzcGVjLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmaW5hbCBpbnQgbGltaXQgPSBzcGVjLmxlbmd0aCgpOwotCQlTdHJpbmcgbmV3UHJvdG9jb2wgPSBudWxsOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGltaXQ7IGluZGV4KyspIHsKLQkJCWZpbmFsIGNoYXIgcCA9IHNwZWMuY2hhckF0KGluZGV4KTsKLQkJCWlmIChwID09ICcvJykgeyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocCA9PSAnOicpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5ld1Byb3RvY29sID0gc3BlYy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAobmV3UHJvdG9jb2wgIT0gbnVsbCAmJiBuZXdQcm90b2NvbC5jb21wYXJlVG9JZ25vcmVDYXNlKCJmaWxlIikgPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdGaWxlQmFzZUxvY2F0aW9uKSB7Ci0JCWZGaWxlQmFzZUxvY2F0aW9uID0gbmV3RmlsZUJhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJZlByb2plY3QgPSBuZXdQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyYzhjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gbWFrZXMgYXNzdW1wdGlvbnMgb24gYmVoYWxmIG9mIHRoZSByZXF1ZXN0ZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVXRpbCB7Ci0KLQkvKioKLQkgKiBPYnRhaW5zIHRoZSBJRmlsZSBmb3IgYSBtb2RlbAotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgdGhlIG1vZGVsIHRvIHVzZQotCSAqIEByZXR1cm4gdGhlIElGaWxlIHVzZWQgdG8gY3JlYXRlIHRoZSBtb2RlbCwgaWYgaXQgY2FtZSBmcm9tIGFuIElGaWxlLAotCSAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCUlQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkvLyBpZiB0aGUgcGF0aCBpcyBub3QgYSBwYXRoIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgdGhlcmUgYXJlIGF0IGxlYXN0Ci0JCS8vIDIgc2VnbWVudHMsIGl0IG1pZ2h0IGJlIGluIHRoZSB3b3Jrc3BhY2UKLQkJSUZpbGVbXSBmaWxlcyA9IHJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJZmlsZSA9IGZpbGVzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGxvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJLy8gcmVtZW1iZXIsIHRoaXMgSUZpbGUgaXNuJ3QgZ3VhcmFudGVlZCB0byBleGlzdAotCQkJZmlsZSA9IHJvb3QuZ2V0RmlsZShsb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogT2J0YWluIElGaWxlcyBmcm9tIElTdHJ1Y3R1cmVkTW9kZWwgKGluY2x1ZGVzIGxpbmtlZFJlc291cmNlcykKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UsIG9yIGFuIGVtcHR5IGFycmF5IGlmCi0JICogICAgICAgICBub25lCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZVtdIGdldEZpbGVzRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRmlsZVtdIGZpbGVzID0gbnVsbDsKLQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyBpZiB0aGUgcGF0aCBpcyBub3QgYSBwYXRoIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgdGhlcmUgYXJlIGF0IGxlYXN0Ci0JCS8vIDIgc2VnbWVudHMsIGl0IG1pZ2h0IGJlIGluIHRoZSB3b3Jrc3BhY2UKLQkJaWYgKCFsb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSAmJiBsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCS8vIHJlbWVtYmVyLCB0aGlzIElGaWxlIGlzbid0IGd1YXJhbnRlZWQgdG8gZXhpc3QKLQkJCWZpbGVzID0gbmV3IElGaWxlW117cm9vdC5nZXRGaWxlKGxvY2F0aW9uKX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaWxlcyA9IHJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24obG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU2NyaXB0TGFuZ3VhZ2VLZXlzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU2NyaXB0TGFuZ3VhZ2VLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZTI2OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBDb250YWlucyBsaXN0IG9mIHNjcmlwdCBsYW5ndWFnZXMgYW5kIG1pbWUgdHlwZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBTY3JpcHRMYW5ndWFnZUtleXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmEifTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVNDUklQVCA9ICJqYXZhc2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0geyJqYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4wIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4xIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4yIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4zIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS40IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS41IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS42IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUyA9IHsidGV4dC9qYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2pzY3JpcHQiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvc2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1RleHRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmOTRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLS8qKgotICogQ29sbGVjdGlvbiBvZiB0ZXh0IGZ1bmN0aW9ucy4KLSAqIEBkZXByZWNhdGVkIC0gdGhlIEpGYWNlIGNsYXNzIGlzIHB1YmxpYyBpbiAzLjEKLSAqLwotLy8gVGhpcyBjbGFzcyB3YXMgb3JpZ2luYWxseSBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LCBhbmQgbWFkZQotLy8gcHVibGljCi1wdWJsaWMgY2xhc3MgVGV4dFV0aWxpdGllcyB7Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB0ZXh0IGVuZHMgd2l0aCBvbmUgb2YgdGhlIGdpdmVuIHNlYXJjaCBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aChTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0ZXh0LmVuZHNXaXRoKHNlYXJjaFN0cmluZ3NbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIGdyZWF0ZXIgdGhhbiBvZmZzZXQgb2YgdGhlIGxvbmdlc3QKLQkgKiBtYXRjaGluZyBzZWFyY2ggc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gaW5kZXhPZihTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCwgaW50IG9mZnNldCkgewotCi0JCWludFtdIHJlc3VsdCA9IHstMSwgLTF9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKHNlYXJjaFN0cmluZ3NbaV0sIG9mZnNldCk7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCi0JCQkJaWYgKHJlc3VsdFswXSA9PSAtMSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4IDwgcmVzdWx0WzBdKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gcmVzdWx0WzBdICYmIHNlYXJjaFN0cmluZ3NbaV0ubGVuZ3RoKCkgPiBzZWFyY2hTdHJpbmdzW3Jlc3VsdFsxXV0ubGVuZ3RoKCkpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VUklSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1VSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzQ0NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1VSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBTaG91bGQgdXNlIGV4dGVuc2libGUgVVJJUmVzb2x2ZXIgZnJvbSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyCi0gKiBpbnN0ZWFkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXIgewotCi0JU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIGdldExvY2F0aW9uQnlVUkkgYWN0aW9uIHVzaW5nIHRoZSBiYXNlUmVmZXJlbmNlIGFzIHRoZQotCSAqIHBvaW50IG9mIHJlZmVyZW5jZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvciB0aGlzIHJlc29sdmVyCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UpOwotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQlJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgZGlyZWN0IGlucHV0c3RyZWFtIHRvIHRoZSBnaXZlbiBVUkkgd2hpY2ggbXVzdCBiZQotCSAqIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IHBvaW50IG9mIHJlZmVyZW5jZS4KLQkgKiAKLQkgKi8KLQlJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSk7Ci0KLQl2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKTsKLQotCXZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzUxMDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQnVmZmVyZWRMaW1pdGVkU3RyZWFtOwotCi0KLQotcHVibGljIGNsYXNzIFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBhIGNvbW1vbiBjYWxjdWxhdGlvbiBpbiBzb21lIG9mIHRoZSBwYXJzaW5nIG1ldGhvZHMgKGUuZy4gaW4KLQkgKiBDb250ZXh0UmVnaW9uIGFuZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoU3RyaW5nIGNoYW5nZXMsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggYnkgdGhlIHRleHQgaXRzZWxmLCBvciwgaWYgdGhlcmUgaXMgbm8gdGV4dCB0bwotCQkvLyBpbnNlcnQgKGkuZS4gd2UgYXJlIGRvaW5nIGEgZGVsZXRlKSB0aGVuIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIGFzCi0JCS8vIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGRlbm90ZSB0aGUgYW1vdW50IHRvIGRlbGV0ZS4KLQkJLy8gRm9yIGEgc3RyYWlnaHQgaW5zZXJ0LCB0aGUgc2VsZWN0aW9uIExlbmd0aCB3aWxsIGJlIHplcm8uCi0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gMDsKLQkJaWYgKGNoYW5nZXMgPT0gbnVsbCkgewotCQkJLy8gdGhlIGRlbGV0ZSBjYXNlCi0JCQlsZW5ndGhEaWZmZXJlbmNlID0gMCAtIGxlbmd0aFRvUmVwbGFjZTsKLQkJfQotCQllbHNlIHsKLQkJCWxlbmd0aERpZmZlcmVuY2UgPSBjaGFuZ2VzLmxlbmd0aCgpIC0gbGVuZ3RoVG9SZXBsYWNlOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsZW5ndGhEaWZmZXJlbmNlOiAiICsgbGVuZ3RoRGlmZmVyZW5jZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBsZW5ndGhEaWZmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZmYgYm90aCBwYXJhbWV0ZXJzIGFyZSBub3QgbnVsbCBhbmQgdGhlIG9iamVjdCBpcyB3aXRoaW4KLQkgKiB0aGUgYXJyYXkuIENhcmVmdWwsIHRoaXMgdXNlcyBpZGVudGl0eS4gTm90IGdvb2QgZm9yIGJhc2ljIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIG9iamVjdEFycmF5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIG9iamVjdCBvciBvYmplY3RBcnJheSBpcyBudWxsLCByZXR1cm4gZmFsc2UKLQkJaWYgKChvYmplY3RBcnJheSAhPSBudWxsKSAmJiAob2JqZWN0ICE9IG51bGwpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9iamVjdEFycmF5W2ldID09IG9iamVjdCkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNTdHJpbmcoU3RyaW5nW10gb2JqZWN0QXJyYXksIFN0cmluZyBvYmplY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgb2JqZWN0IG9yIG9iamVjdEFycmF5IGlzIG51bGwsIHJldHVybiBmYWxzZQotCQlpZiAoKG9iamVjdEFycmF5ICE9IG51bGwpICYmIChvYmplY3QgIT0gbnVsbCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob2JqZWN0QXJyYXlbaV0uZXF1YWxzKG9iamVjdCkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQsIGlzIHJlYWRsaW1pdCBpcwotCSAqIHNldCwgYW5kIHRoYXQgdGhlIHN0cmVhbSBpcyAibGltaXRhYmxlIiAodGhhdCBpcywgcmVwb3J0cyAiZW5kIG9mCi0JICogaW5wdXQiIHJhdGhlciB0aGFuIGFsbG93IGdvaW5nIHBhc3QgbWFyaykuIFRoaXMgaXMgdmVyeSBzcGVjaWFsaXplZAotCSAqIHN0cmVhbSBpbnRyb2R1Y2VkIHRvIG92ZXJjb21lCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3MjExLiBTZWUgYWxzbwotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODU2NQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0TGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob3JpZ2luYWwgaW5zdGFuY2VvZiBCdWZmZXJlZExpbWl0ZWRTdHJlYW0pCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKG9yaWdpbmFsLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEl0J3Mgdml0YWwgdGhhdCBhIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gPGI+bm90PC9iPiBiZSB3cmFwcGVkIGluIGFub3RoZXIKLQkgKiBCdWZmZXJlZElucHV0U3RyZWFtIGFzIGVhY2ggY2FuIHByZWVtcHRpdmVseSBjb25zdW1lIDxpPm48L2k+IGJ5dGVzCi0JICogKGUuZy4gMjA0OCkgZnJvbSB0aGUgcGFyZW50IHN0cmVhbSBiZWZvcmUgYW55IHJlcXVlc3RzIGFyZSBtYWRlLiBUaGUKLQkgKiBjYXNjYWRpbmcgZWZmZWN0IGlzIHRoYXQgdGhlIHNlY29uZC9pbm5lciBCdWZmZXJlZElucHV0U3RyZWFtIGNhbiBuZXZlcgotCSAqIHJld2luZCBpdHNlbGYgdG8gdGhlIGZpcnN0IDxpPm48L2k+IGJ5dGVzIHNpbmNlIHRoZXkgd2VyZSBhbHJlYWR5Ci0JICogY29uc3VtZWQgYnkgaXRzIHBhcmVudC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRNYXJrU3VwcG9ydGVkU3RyZWFtKElucHV0U3RyZWFtIG9yaWdpbmFsKSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvcmlnaW5hbC5tYXJrU3VwcG9ydGVkKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCUlucHV0U3RyZWFtIGJ1ZmZlcmVkID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ob3JpZ2luYWwsIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJYnVmZmVyZWQubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlyZXR1cm4gYnVmZmVyZWQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBmb3IgbG9nL3RyYWNlIG1lc3NhZ2VzLiBJZCBpcyBhc3N1bWVkIHRvIGJlIHNvbWUgZm9ybSBvZiBhCi0JICogZmlsZW5hbWUuIFNlZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VTaG9ydElkKE9iamVjdCBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCWlkID0gIk5PSUQiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHdob2xlID0gaWQudG9TdHJpbmcoKTsKLQkJU3RyaW5nIHBhcnQgPSB3aG9sZS5zdWJzdHJpbmcod2hvbGUubGFzdEluZGV4T2YoIi8iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiLi4uIiArIHBhcnQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFV0aWxpdGllcyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBVdGlsaXRpZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg1YWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25BZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKTsKLQotCS8qKgotCSAqLwotCXZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjYTlmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPUk1BVElPTiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBvZmZzZXQsIGludCBzZXZlcml0eSkgewotCQl0aGlzKG1lc3NhZ2UsIG9mZnNldCwgMCwgc2V2ZXJpdHkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IHNldmVyaXR5KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gdGhpcy5zZXZlcml0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25SZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzM2Q1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25SZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUmVwb3J0ZXIgewotCi0JLyoqCi0JICovCi0Jdm9pZCByZXBvcnQoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOWRmN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb25pbmcgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRQYXJ0aXRpb25zIHsKLQotCVN0cmluZyBERUZBVUxUX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVOS05PV05fUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuVU5LTk9XTl9QQVJUSVRJT05fVFlQRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbHMvU3RyaW5nVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbHMvU3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyY2VkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWxzL1N0cmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbHMgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUEVSU1RBTkQgPSAiJiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTVBFUlNUQU5EX0VOVElUWSA9ICImJjsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FSUklBR0VfUkVUVVJOID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBUlJJQUdFX1JFVFVSTl9FTlRJVFkgPSAiXFxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVJTID0gIiBcdFxuXHJcZiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URV9DSEFSID0gJ1wiJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URV9FTlRJVFkgPSAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxfU0lHTiA9ICI9IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUFMX1NJR05fRU5USVRZID0gIiYjNjE7IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU4gPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU5fRU5USVRZID0gIiZndDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOX0VOVElUWSA9ICImbHQ7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRCA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfRU5USVRZID0gIlxcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfVEFHID0gIjxkbD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9UQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9UQUJfRU5USVRZID0gIlxcdCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1RBQl9UQUcgPSAiPGRkPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEUgPSAiJyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFX0NIQVIgPSAnXCcnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1FVT1RFX0VOVElUWSA9ICImIzAzOTsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9FTlRJVFkgPSAiJm5ic3A7IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBcHBlbmQgYXBwZW5kU3RyaW5nIHRvIHRoZSBlbmQgb2YgYVN0cmluZyBvbmx5IGlmIGFTdHJpbmcgZG9lcyBub3QgZW5kCi0JICogd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZElmTm90RW5kV2l0aChTdHJpbmcgYVN0cmluZywgU3RyaW5nIGFwcGVuZFN0cmluZykgewotCQlpZiAoKGFTdHJpbmcgIT0gbnVsbCkgJiYgKGFwcGVuZFN0cmluZyAhPSBudWxsKSkKLQkJCWlmIChhU3RyaW5nLmVuZHNXaXRoKGFwcGVuZFN0cmluZykpCi0JCQkJcmV0dXJuIGFTdHJpbmc7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGFTdHJpbmcgKyBhcHBlbmRTdHJpbmc7Ci0JCWVsc2UKLQkJCXJldHVybiBhU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgc3BhY2Utc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOwotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHN0b2submV4dFRva2VuKCkpOwotCQl9Ci0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IGRlbGltLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4ibm8gY29tbWVudCI8L2NvZGU+IGludG8gYW4gYXJyYXkgPGNvZGU+YVswXT0ibm8iPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5hWzFdPSAiY29tbWVudCI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0FycmF5KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRlbGltKSB7Ci0JCXJldHVybiBhc0FycmF5KHZhbHVlLCBkZWxpbSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgZGVsaW0tc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0sIGJvb2xlYW4gcmV0dXJuVG9rZW5zKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsIGRlbGltLCByZXR1cm5Ub2tlbnMpOwotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHN0b2submV4dFRva2VuKCkpOwotCQl9Ci0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IGRlbGltLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4iYWJjLCxkZWYiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09ImFiYyI8L2NvZGU+LAotCSAqIDxjb2RlPmFbMV09bnVsbDwvY29kZT4sIGFuZCA8Y29kZT5hWzJdPSAiZGVmIjwvY29kZT4gd2hlcmUgIiwiIGlzCi0JICogdGhlIGRlbGltLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0ZpeGVkQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0pIHsKLQkJU3RyaW5nIGFycmF5W10gPSBhc0FycmF5KHZhbHVlLCBkZWxpbSwgdHJ1ZSk7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJYm9vbGVhbiBzdHJpbmdGb3VuZCA9IGZhbHNlOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0b2tlbiA9IGFycmF5W2ldOwotCQkJaWYgKHRva2VuLmNvbXBhcmVUbyhkZWxpbSkgPT0gMCkgewotCQkJCWlmICghc3RyaW5nRm91bmQpCi0JCQkJCWxpc3QuYWRkKG51bGwpOwotCQkJCXN0cmluZ0ZvdW5kID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsaXN0LmFkZCh0b2tlbik7Ci0JCQkJc3RyaW5nRm91bmQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFkZCBvbmUgbW9yZSBudWxsIGlmIGxhc3QgdG9rZW4gaXMgdGhlIGRlbGltCi0JCWlmICghc3RyaW5nRm91bmQpCi0JCQlsaXN0LmFkZChudWxsKTsKLQotCQlTdHJpbmcgcmVzdWx0W10gPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvcChTdHJpbmcgc291cmNlKSB7Ci0JCXJldHVybiBjaG9wKHNvdXJjZSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNob3AoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlbGltaXRlcikgewotCQlyZXR1cm4gc291cmNlLnN1YnN0cmluZygwLCBzb3VyY2UubGFzdEluZGV4T2YoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIGFycmF5T2ZTdHJpbmdzLCBTdHJpbmcgbmVlZGxlLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5lZWRsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXJyYXlPZlN0cmluZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY2FzZVNlbnNpdGl2ZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheU9mU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZWVkbGUuZXF1YWxzKGFycmF5T2ZTdHJpbmdzW2ldKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5T2ZTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5lZWRsZS5lcXVhbHNJZ25vcmVDYXNlKGFycmF5T2ZTdHJpbmdzW2ldKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNMZXR0ZXJzKFN0cmluZyBmdWxsVmFsdWUpIHsKLQotCQlpZiAoZnVsbFZhbHVlID09IG51bGwgfHwgZnVsbFZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJY2hhcltdIGNoYXJzID0gZnVsbFZhbHVlLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFZhbHVlLmxlbmd0aCgpOyBpKyspCi0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGNoYXJzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZykgIT0gLTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydExpbmVEZWxpbWl0ZXJzKFN0cmluZyBhbGxUZXh0LCBTdHJpbmcgbGluZURlbGltaXRlclRvVXNlKSB7Ci0JCUlEb2N1bWVudCB0ZW1wRG9jID0gbmV3IERvY3VtZW50KGFsbFRleHQpOwotCi0JCWlmIChsaW5lRGVsaW1pdGVyVG9Vc2UgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxpbmVDb3VudCA9IHRlbXBEb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBsaW5lSW5mbyA9IHRlbXBEb2MuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCWludCBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgbGluZUxlbmd0aCA9IGxpbmVJbmZvLmdldExlbmd0aCgpOwotCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gbGluZVN0YXJ0T2Zmc2V0ICsgbGluZUxlbmd0aDsKLQkJCQluZXdUZXh0ICs9IGFsbFRleHQuc3Vic3RyaW5nKGxpbmVTdGFydE9mZnNldCwgbGluZUVuZE9mZnNldCk7Ci0KLQkJCQlpZiAoKGkgPCBsaW5lQ291bnQgLSAxKSAmJiAodGVtcERvYy5nZXRMaW5lRGVsaW1pdGVyKGkpICE9IG51bGwpKQotCQkJCQluZXdUZXh0ICs9IGxpbmVEZWxpbWl0ZXJUb1VzZTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogSFRNTCBlbnRpdHkgZXF1aXZhbGVudC4gV0FSTklORyBvbmx5IHVzZSB0aGlzIG1ldGhvZCBmb3Igc3RyaW5ncyB0aGF0Ci0JICogZG9udCBhbHJlYWR5IGhhdmUgSFRNTC1zcGVjaWZpYyBpdGVtcyBzdWNoIGFzIHRhZ3MgYW5kIGVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgU3RyaW5nIHRvIGNvbnZlcnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29udmVydGVkIHN0cmluZwotCSAqIEBzZWUgSFRNTFByaW50ZXIjY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX0ZFRUQsIExJTkVfRkVFRF9UQUcpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX1RBQiwgTElORV9UQUJfVEFHKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU0lOR0xFX1FVT1RFLCBTSU5HTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgRE9VQkxFX1FVT1RFLCBET1VCTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU1BBQ0UgKyBTUEFDRSwgU1BBQ0VfRU5USVRZICsgU1BBQ0VfRU5USVRZKTsgLy8gcmVwbGFjaW5nCi0JCS8vIGV2ZXJ5Ci0JCS8vIHNwYWNlCi0JCS8vIHdvdWxkCi0JCS8vIGJlCi0JCS8vIHRvbwotCQkvLyBtdWNoCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aCBzYXZpbmcgaXQKLQkgKiBpbnRvIGFuIElOSSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBub3JtYWxTdHJpbmcpIHsKLQkJaWYgKG5vcm1hbFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBlc2NhcGVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5vcm1hbFN0cmluZywgRVFVQUxfU0lHTiArIExJTkVfRkVFRCArIENBUlJJQUdFX1JFVFVSTiArIExJTkVfVEFCLCB0cnVlKTsKLQkJU3RyaW5nIGNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJY2h1bmsgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCWlmIChjaHVuay5lcXVhbHMoRVFVQUxfU0lHTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChFUVVBTF9TSUdOX0VOVElUWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaHVuay5lcXVhbHMoTElORV9GRUVEKSkgewotCQkJCWVzY2FwZWRCdWZmZXIuYXBwZW5kKExJTkVfRkVFRF9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSBpZiAoY2h1bmsuZXF1YWxzKENBUlJJQUdFX1JFVFVSTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChDQVJSSUFHRV9SRVRVUk5fRU5USVRZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNodW5rLmVxdWFscyhMSU5FX1RBQikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChMSU5FX1RBQl9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXNjYXBlZEJ1ZmZlci5hcHBlbmQoY2h1bmspOwotCQkJfQotCQl9Ci0JCXJldHVybiBlc2NhcGVkQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZ2l2ZW4gdGV4dCB3aXRob3V0IGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlyc3RMaW5lT2YoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0KTsKLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jLmdldExpbmVPZk9mZnNldCgwKTsKLQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQlyZXR1cm4gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZywgaW50IG9mZnNldCkgewotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlpZiAoYVN0cmluZyAhPSBudWxsICYmIGFTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbmRleCA9IGFTdHJpbmcubGFzdEluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihDUiwgb2Zmc2V0KTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihMRiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIoU3RyaW5nIGFTdHJpbmcsIGludCBvZmZzZXQpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJaWYgKGFTdHJpbmcgIT0gbnVsbCAmJiBhU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5pbmRleE9mKENSLCBvZmZzZXQpOwotCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoTEYsIG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTm9uYmxhbmsoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpbmRleCA9IC0xOwotCi0JCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBhU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoREVMSU1JVEVSUy5pbmRleE9mKGFTdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxKSkgPT0gLTEpIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGluc2VydFN0cmluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGFTdHJpbmcgb25seSBpZiBhU3RyaW5nIGRvZXMKLQkgKiBub3Qgc3RhcnQgd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElmTm90U3RhcnRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgaW5zZXJ0U3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuc3RhcnRzV2l0aChpbnNlcnRTdHJpbmcpKQotCQkJCXJldHVybiBhU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiBpbnNlcnRTdHJpbmcgKyBhU3RyaW5nOwotCQllbHNlCi0JCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkpOwotCX0KLQotCS8qKgotCSAqIFVuaXQgdGVzdHMuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gdGVzdFBhc3RlKCk7Ci0JCXRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbWVyZ2VkIGZvcm0gb2YgYm90aCBzdHJpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2UoU3RyaW5nIG5ld1N0YXJ0LCBTdHJpbmcgbmV3RW5kKSB7Ci0JCVN0cmluZ1tdIHJlZ2lvbnMgPSBvdmVybGFwUmVnaW9ucyhuZXdTdGFydCwgbmV3RW5kKTsKLQkJcmV0dXJuIHJlZ2lvbnNbMF0gKyByZWdpb25zWzFdICsgcmVnaW9uc1syXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlc09mKFN0cmluZyBzZWFyY2hTdHJpbmcsIGNoYXIgdGFyZ2V0Q2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaW50IGxlbiA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRhcmdldENoYXIgPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKSkKLQkJCQlyZXN1bHQrKzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIFJldHVybnMgYSAzIFN0cmluZyBhcnJheSBjb250YWluaW5nIHVuaXF1ZSB0ZXh0IGZyb20gdGhlIHN0YXJ0LAotCSAqIGR1cGxpY2F0ZWQgdGV4dCB0aGF0IG92ZXJsYXBzIHRoZSBzdGFydCBhbmQgZW5kLCBhbmQgdGhlIHVuaXF1ZSB0ZXh0Ci0JICogZnJvbSB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG92ZXJsYXBSZWdpb25zKFN0cmluZyBzdGFydCwgU3RyaW5nIGVuZCkgewotCQlTdHJpbmdbXSByZXN1bHRzID0gbnVsbDsKLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kID09IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBuZXcgU3RyaW5nW117c3RhcnQsICIiLCAiIn07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsIGVuZH07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgPT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRMZW5ndGggPSBzdGFydC5sZW5ndGgoKTsKLQkJCWludCBlbmRMZW5ndGggPSBlbmQubGVuZ3RoKCk7Ci0KLQkJCWlmIChzdGFydExlbmd0aCA9PSAwIHx8IGVuZExlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHRzID0gbmV3IFN0cmluZ1szXTsKLQkJCQlTdHJpbmcgdGVzdFN0YXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGVzdEVuZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG1lcmdlTGVuZ3RoID0gTWF0aC5taW4oc3RhcnRMZW5ndGgsIGVuZExlbmd0aCk7Ci0JCQkJYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotCQkJCXdoaWxlIChtZXJnZUxlbmd0aCA+IDAgJiYgIWZpbmlzaGVkKSB7Ci0JCQkJCXRlc3RTdGFydCA9IHN0YXJ0LnN1YnN0cmluZyhzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJdGVzdEVuZCA9IGVuZC5zdWJzdHJpbmcoMCwgbWVyZ2VMZW5ndGgpOwotCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZQotCQkJCQlpZiAodGVzdFN0YXJ0LmVxdWFscyh0ZXN0RW5kKSkgewotCQkJCQkJZmluaXNoZWQgPSB0cnVlOwotCQkJCQkJcmVzdWx0c1swXSA9IHN0YXJ0LnN1YnN0cmluZygwLCBzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJCXJlc3VsdHNbMV0gPSBzdGFydC5zdWJzdHJpbmcoc3RhcnRMZW5ndGggLSBtZXJnZUxlbmd0aCk7Ci0JCQkJCQlyZXN1bHRzWzJdID0gZW5kLnN1YnN0cmluZyhtZXJnZUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJbWVyZ2VMZW5ndGgtLTsKLQkJCQl9Ci0JCQkJaWYgKCFmaW5pc2hlZCkgewotCQkJCQlyZXN1bHRzWzBdID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdHNbMV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHRzWzJdID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBQYWNrcyBhbiBhcnJheSBvZiBTdHJpbmdzIGludG8gYSBzaW5nbGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2soU3RyaW5nW10gc3RyaW5ncykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmdzW2ldLCAiLCIsICImY29tbWE7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChpIDwgc3RyaW5ncy5sZW5ndGggLSAxKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFBhc3RlcyB0aGUgbmV3IHRleHQgaW50byB0aGUgb2xkIGF0IHRoZSBzdGFydCBwb3NpdGlvbiwgcmVwbGFjaW5nIHRleHQKLQkgKiBpbXBsaWVkIGJ5IGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnRJbmRleCA9IHN0YXJ0OwotCQlpbnQgZW5kSW5kZXggPSBzdGFydCArIGxlbmd0aDsKLQkJaWYgKHN0YXJ0SW5kZXggPiBvbGRUZXh0Lmxlbmd0aCgpKSB7Ci0JCQlzdGFydEluZGV4ID0gb2xkVGV4dC5sZW5ndGgoKTsKLQkJfQotCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkpOwotCQkvLyBudWxsIG9yIGVtcHR5IG5ldyB0ZXh0IGFjY29tcGxpY2hlcyBhIGRlbGV0ZQotCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQobmV3VGV4dCk7Ci0JCX0KLQkJaWYgKGVuZEluZGV4IDwgb2xkVGV4dC5sZW5ndGgoKSkgewotCi0JCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoZW5kSW5kZXgpKTsKLQkJfQotCQlyZXN1bHQgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgbWF0Y2hpbmcgbGl0ZXJhbCBwb3J0aW9ucyBvZiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotCQlpZiAoYVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBub3JtYWxTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gYVN0cmluZy5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IHNwYWNlciA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJd2hpbGUgKHBvc2l0aW9uICsgc3BhY2VyIC0gMSA8IGxlbmd0aCAmJiBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwb3NpdGlvbikgPiAtMSkgewotCQkJcG9zaXRpb24gPSBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwcmV2aW91cyk7Ci0JCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwcmV2aW91cywgcG9zaXRpb24pICsgdGFyZ2V0OwotCQkJcG9zaXRpb24gKz0gc3BhY2VyOwotCQkJcHJldmlvdXMgPSBwb3NpdGlvbjsKLQkJfQotCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwb3NpdGlvbiwgYVN0cmluZy5sZW5ndGgoKSk7Ci0KLQkJcmV0dXJuIG5vcm1hbFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRoZSBlbnRpdHkgcmVmZXJlbmNlcyBmb3IgbWFya3VwIGRlbGltaXRlcnMgaW4gdGV4dCB3aGVyZSB0aGV5Ci0JICogaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBwcm9wZXIgVW5pY29kZSB2YWx1ZXMgdGhyb3VnaCBhIERPTSB0ZXh0Ci0JICogcGFyc2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RvcmVNYXJrZXJzKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gdGV4dDsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGV4dHJhIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhbmQgcXVvdGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXAoU3RyaW5nIHF1b3RlZFN0cmluZykgewotCQlpZiAocXVvdGVkU3RyaW5nID09IG51bGwgfHwgcXVvdGVkU3RyaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gcXVvdGVkU3RyaW5nOwotCQlTdHJpbmcgdHJpbW1lZCA9IHF1b3RlZFN0cmluZy50cmltKCk7Ci0JCWlmICh0cmltbWVkLmxlbmd0aCgpIDwgMikKLQkJCXJldHVybiBxdW90ZWRTdHJpbmc7Ci0KLQkJY2hhciBmaXJzdCA9IHRyaW1tZWQuY2hhckF0KDApOwotCQljaGFyIG5leHRUb0xhc3QgPSB0cmltbWVkLmNoYXJBdCh0cmltbWVkLmxlbmd0aCgpIC0gMik7Ci0JCWNoYXIgbGFzdCA9IHRyaW1tZWQuY2hhckF0KHRyaW1tZWQubGVuZ3RoKCkgLSAxKTsKLQotCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInICYmIG5leHRUb0xhc3QgIT0gJ1xcJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnICYmIG5leHRUb0xhc3QgIT0gJ1xcJykpIHsKLQkJCXJldHVybiB0cmltbWVkLnN1YnN0cmluZygxLCB0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHRyaW1tZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RyaXBzIGFueXRoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nIHRoYXQKLQkgKiBpcyBub3QgYSBsZXR0ZXIgb3IgZGlnaXQuIEl0IGlzIHVzZWQgYnkgc29tZSBlbmNvZGluZyBkZXRlY3RvcnMgdG8gY29tZQotCSAqIHVwIHdpdGggdGhlIGVuY29kaW5nIG5hbWUgZnJvbSBpbGxmb3JtZWQgaW5wdXQgKGUuZyBpbiA8P3htbAotCSAqIGVuY29kaW5nPSJhYmM/PiAtLSB3aGVyZSBmaW5hbCBxdW90ZSBpcyBsZWZ0IG9mZiwgdGhlICc+JyBpcyByZXR1cm5lZAotCSAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAnYWJjJykuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBOb25MZXR0ZXJEaWdpdHMoU3RyaW5nIGZ1bGxWYWx1ZSkgewotCQlpZiAoZnVsbFZhbHVlID09IG51bGwgfHwgZnVsbFZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZnVsbFZhbHVlOwotCQlpbnQgZnVsbFZhbHVlTGVuZ3RoID0gZnVsbFZhbHVlLmxlbmd0aCgpOwotCQlpbnQgZmlyc3RQb3MgPSAwOwotCQl3aGlsZSAoZmlyc3RQb3MgPCBmdWxsVmFsdWVMZW5ndGggJiYgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoZnVsbFZhbHVlLmNoYXJBdChmaXJzdFBvcykpKSB7Ci0JCQlmaXJzdFBvcysrOwotCQl9Ci0JCWludCBsYXN0UG9zID0gZnVsbFZhbHVlTGVuZ3RoIC0gMTsKLQkJd2hpbGUgKGxhc3RQb3MgPiBmaXJzdFBvcyAmJiAhQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChmdWxsVmFsdWUuY2hhckF0KGxhc3RQb3MpKSkgewotCQkJbGFzdFBvcy0tOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBmdWxsVmFsdWU7Ci0JCWlmIChmaXJzdFBvcyAhPSAwIHx8IGxhc3RQb3MgIT0gZnVsbFZhbHVlTGVuZ3RoKSB7Ci0JCQlyZXN1bHQgPSBmdWxsVmFsdWUuc3Vic3RyaW5nKGZpcnN0UG9zLCBsYXN0UG9zICsgMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIHN0cmlwLCBleGNlcHQgcXVvdGVzIGRvbid0IG5lZWQgdG8gbWF0Y2ggc3VjaCBhcyAiVVRGJyBpcwotCSAqIHN0aWxsIHN0cmlwcGVkIG9mIGJvdGggcXVvdGVzLiAoUGx1cywgdGhpcyBvbmUgZG9lcyBub3QgZGV0ZWN0IGVzY2FwZWQKLQkgKiBxdW90ZXMpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHF1b3RlZFZhbHVlKSB7Ci0JCWlmIChxdW90ZWRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIG5vcm1hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcywKLQkJLy8gYnV0IGlmIGl0IGRvZXMsIHdlJ2xsIGRvIGxlbmllbnQgaW50ZXJwcmV0YXRpb24KLQkJcmV0dXJuIHN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShxdW90ZWRWYWx1ZSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIExpa2Ugc3RyaXAgcXVvdGVzLCBleGNlcHQgbGVhdmVzIHRoZSBzdGFydCBhbmQgZW5kIHNwYWNlIGluc2lkZSB0aGUKLQkgKiBxdW90ZXMKLQkgKiAKLQkgKiBAcGFyYW0gcXVvdGVkVmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKFN0cmluZyBxdW90ZWRWYWx1ZSkgewotCQlpZiAocXVvdGVkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub21hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcyAuLi4gYnV0IGp1c3QgaW4KLQkJLy8gY2FzZS4KLQkJU3RyaW5nIHJlc3VsdCA9IHF1b3RlZFZhbHVlLnRyaW0oKTsKLQkJaW50IGxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCWNoYXIgZmlyc3RDaGFyID0gcmVzdWx0LmNoYXJBdCgwKTsKLQkJCWlmICgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSB8fCAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMSwgbGVuKTsKLQkJCX0KLQkJCWxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJY2hhciBsYXN0Q2hhciA9IHJlc3VsdC5jaGFyQXQobGVuIC0gMSk7Ci0JCQkJaWYgKChsYXN0Q2hhciA9PSBTSU5HTEVfUVVPVEVfQ0hBUikgfHwgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UGFzdGUoKSB7Ci0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoZSBxdWljayBicm93biBmb3ggLi4uIjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNikpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIiIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgImZhc3QiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJmYXN0ICIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIkJ1dCAiLCAwLCAwKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKCIiLCAiYnVycCIsIDQsIDYpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFN0cmlwTm9uTGV0dGVyRGlnaXRzKCkgewotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJhYmMiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYmNcIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYi1jMT8iOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIisrKyI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjPSI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjICI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuIGJvb2xlYW5WYWx1ZSkgewotCQlpZiAoYm9vbGVhblZhbHVlKQotCQkJcmV0dXJuIFRSVUU7Ci0JCWVsc2UKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgImVzY2FwZWQiIGNoYXJzIGZyb20gYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIGFTdHJpbmcpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gcmVwbGFjZShhU3RyaW5nLCBFUVVBTF9TSUdOX0VOVElUWSwgRVFVQUxfU0lHTik7Ci0JCW5vcm1hbFN0cmluZyA9IHJlcGxhY2Uobm9ybWFsU3RyaW5nLCBMSU5FX0ZFRURfRU5USVRZLCBMSU5FX0ZFRUQpOwotCQlub3JtYWxTdHJpbmcgPSByZXBsYWNlKG5vcm1hbFN0cmluZywgQ0FSUklBR0VfUkVUVVJOX0VOVElUWSwgQ0FSUklBR0VfUkVUVVJOKTsKLQkJbm9ybWFsU3RyaW5nID0gcmVwbGFjZShub3JtYWxTdHJpbmcsIExJTkVfVEFCX0VOVElUWSwgTElORV9UQUIpOwotCQlyZXR1cm4gbm9ybWFsU3RyaW5nOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZUVuZE9mKFN0cmluZyBuZXdTdGFydCwgU3RyaW5nIG5ld0VuZCkgewotCQlTdHJpbmdbXSByZWdpb25zID0gb3ZlcmxhcFJlZ2lvbnMobmV3U3RhcnQsIG5ld0VuZCk7Ci0JCXJldHVybiByZWdpb25zWzJdOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgYSBjb21tYSBkZWxpbWl0ZWQgU3RyaW5nIGludG8gYW4gYXJyYXkgb2YgU3RyaW5ncwotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB1bnBhY2soU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkvLyBzaW5jZSB3ZSdyZSBzZXBhcmF0aW5nIHRoZSB2YWx1ZXMgd2l0aCAnLCcsIGVzY2FwZSAnLCcgaW4gdGhlCi0JCQkvLyB2YWx1ZXMKLQkJCWxpc3QuYWRkKFN0cmluZ1V0aWxzLnJlcGxhY2UodG9rZXIubmV4dFRva2VuKCksICImY29tbWE7IiwgIiwiKS50cmltKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1V0aWxzKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhZTlkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy8iIC8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9InNyYyIKLSAgICAgICAgcGF0aD0ic3JjLWV4dGVuc2lvbnMvIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy1lbmNvZGluZyIgLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAga2luZD0ic3JjIgotICAgICAgICBwYXRoPSJzcmMtdGFza3RhZ3MiIC8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9ImNvbiIKLSAgICAgICAgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiCi0gICAgICAgIGtpbmQ9ImNvbiI+Ci0gICAgICAgIDxhY2Nlc3NydWxlcz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlCi0gICAgICAgICAgICAgICAga2luZD0iYWNjZXNzaWJsZSIKLSAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiIC8+Ci0gICAgICAgIDwvYWNjZXNzcnVsZXM+Ci0gICAgPC9jbGFzc3BhdGhlbnRyeT4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAga2luZD0ib3V0cHV0IgotICAgICAgICBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmJjNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotZWRpdG9yLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LnNzZS51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjOGVjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvdHJhY2VmaWx0ZXI9Ci0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5BY3Rpb25Db250cmlidXRlci5fc2hvd0RlYnVnU3RhdHVzCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2FjdGlvbmNvbnRyaWJ1dG9yL2RlYnVnc3RhdHVzZmllbGRzPWZhbHNlCi0KLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLlRyYW5zZmVyQnVpbGRlci5kZWJ1Z1RpbWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvdHJhbnNmZXJidWlsZGVyL3RpbWU9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGNvbmZpZ3VyYXRpb25idWlsZGVyPXRydWUKLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmRlYnVnVGltZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGNvbmZpZ3VyYXRpb25idWlsZGVyL3RpbWU9ZmFsc2UKLQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlcj10cnVlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdSZWFkVGltZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvcmVhZHRpbWU9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5kZWJ1Z0NvbnRyaWJ1dGVUaW1lCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9jb250cmlidXRldGltZT1mYWxzZQotCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdNZW51Ci1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z21lbnU9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5kZWJ1Z1BvcHVwCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3BvcHVwPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdUb29sYmFyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3Rvb2xiYXI9ZmFsc2UKLQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5GaWxlTW9kZWxQcm92aWRlci5kZWJ1Z09wZXJhdGlvbnMKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZmlsZW1vZGVscHJvdmlkZXIvb3BlcmF0aW9ucz1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5GaWxlTW9kZWxQcm92aWRlci5kZWJ1Z0xpZmVjeWNsZWxpc3RlbmVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ZpbGVtb2RlbHByb3ZpZGVyL2xpZmVjeWNsZWxpc3RlbmVyPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLkZpbGVNb2RlbFByb3ZpZGVyLmRlYnVnTW9kZWxTdGF0ZWxpc3RlbmVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ZpbGVtb2RlbHByb3ZpZGVyL21vZGVsc3RhdGVsaXN0ZW5lcj1mYWxzZQotCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0b3JhZ2VNb2RlbFByb3ZpZGVyLmRlYnVnT3BlcmF0aW9ucwotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdG9yYWdlbW9kZWxwcm92aWRlci9vcGVyYXRpb25zPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0b3JhZ2VNb2RlbFByb3ZpZGVyLmRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RvcmFnZW1vZGVscHJvdmlkZXIvZWxlbWVudHN0YXRlbGlzdGVuZXI9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9jb250ZW50T3V0bGluZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eVNoZWV0PWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5kZWJ1Zwotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW09ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkdvdG9Bbm5vdGF0aW9uQWN0aW9uLl9kZWJ1Zwotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9nb3RvTmV4dEFubm90YXRpb249ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlclNwZWxsaW5nPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJkOTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz48L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjNDMwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzEwMGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNzZS51aSwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lbmNvZGluZy51aTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmh5cGVybGluazt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3BlbGxpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnVpO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9yczt2aXNpYmlsaXR5Oj1yZWV4cG9ydDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zd3Q7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb247YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTQ1MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoZSBiYXNlIGVkaXRvciBvZiB0aGUgc3NlIGZyYW1ld29yay4gSXQgcHJvdmlkZXMgdGhlIGhvb2tzIGZvciBjb250ZW50IGFzc2lzdCwKLWJyZWFrcG9pbnRzLCBkZWJ1Z2dpbmcsIG9wZW4tb24sIHF1aWNrZml4LCBzcGVsbCBjaGVja2luZyBhbmQgYSBjb250ZW50IG91dGxpbmUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Yjc3YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSB0b2MueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RUb2MueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgaHRtbC8KLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHNyYy1leHRlbnNpb25zLyxcCi0gICAgICAgICAgIHNyYy1lbmNvZGluZyxcCi0gICAgICAgICAgIHNyYy10YXNrdGFncy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL21haW50b3BpYy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvbWFpbnRvcGljLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NzYwNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvbWFpbnRvcGljLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5NYWluIFRvcGljPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+TWFpbiBUb3BpYzwvaDE+Ci1QbGVhc2UgZW50ZXIgeW91ciB0ZXh0IGhlcmUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvc3VidG9waWMuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL3N1YnRvcGljLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjFjNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvc3VidG9waWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlN1YiBUb3BpYzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPlN1YiBUb3BpYzwvaDE+Ci1QbGVhc2UgZW50ZXIgeW91ciB0ZXh0IGhlcmUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvdG9jLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC90b2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2ZjBhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC90b2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlRhYmxlIG9mIENvbnRlbnRzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPgotUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2N0b29sMTYvc3BlbGxjaGVjay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3NwZWxsY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFkZTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2N0b29sMTYvc3BlbGxjaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2RlbGV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZGVsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxOTdjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZGVsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWU1NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NwZWxsY2hlY2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zcGVsbGNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZjU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NwZWxsY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9kZWxldGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTZkZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWNlZmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zcGVsbGNoZWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvc3BlbGxjaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MWRlMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zcGVsbGNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L29jY19tYXRjaC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2NfbWF0Y2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTAzM2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L29jY19tYXRjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcmVmZXJlbmNlcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcmVmZXJlbmNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDdmZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJlZmVyZW5jZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvcF9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlYzY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkNTI3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjoyMDoxMCBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmJiNTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIEVkaXRvcgotU3RhbmRhbG9uZV9TdHJ1Y3R1cmVkX1NvdXJjZV9FZGl0b3IubmFtZT1TdGFuZGFsb25lIFN0cnVjdHVyZWQgU291cmNlIEVkaXRvcgotIyBOYW1lIG9uIHByZWZlcmVuY2VzIHBhZ2UKLVdFQl9BTkRfWE1MX0ZpbGVzLm5hbWU9V2ViIGFuZCBYTUwKLVN0cnVjdHVyZWRfVGV4dF9FZGl0b3IubmFtZT1TdHJ1Y3R1cmVkIFRleHQgRWRpdG9ycwotVGFza19UYWdzX1ByZWZlcmVuY2VzLm5hbWU9VGFzayBUYWdzCi0KLSMKLXNvdXJjZUVkaXRvckZvbnREZWZpbml0b24ubGFiZWw9U3RydWN0dXJlZCBUZXh0IEVkaXRvciBUZXh0IEZvbnQKLXNvdXJjZUVkaXRvckZvbnREZWZpbnRpb24uZGVzY3JpcHRpb249VGhlIFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgdGV4dCBmb250IGlzIHVzZWQgYnkgU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuCi0KLUFkYXB0ZXJfRmFjdG9yeV9EZXNjcmlwdGlvbl9FeHRlbnNpb24ubmFtZT1BZGFwdGVyIEZhY3RvcnkgRGVzY3JpcHRpb24gRXh0ZW5zaW9uCi1FeHRlbmRlZF9FZGl0b3JfQWN0aW9uc19FeHRlbnNpb24ubmFtZT1FeHRlbmRlZCBFZGl0b3IgQWN0aW9ucyBFeHRlbnNpb24KLURyb3BfVGFyZ2V0X1RyYW5zZmVyc19FeHRlbnNpb24ubmFtZT1Ecm9wIFRhcmdldCBUcmFuc2ZlcnMgRXh0ZW5zaW9uCi1FeHRlbmRlZF9FZGl0b3JfQ29uZmlndXJhdGlvbl9FeHRlbnNpb24ubmFtZT1FeHRlbmRlZCBFZGl0b3IgQ29uZmlndXJhdGlvbiBFeHRlbnNpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4gV29ya2JlbmNoIEtleXMgUHJlZmVyZW5jZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zY29wZS5zdHJ1Y3R1cmVkVGV4dEVkaXRvci5uYW1lPUVkaXRpbmcgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvcnMKLXNjb3BlLnN0cnVjdHVyZWRUZXh0RWRpdG9yLmRlc2NyaXB0aW9uPUVkaXRpbmcgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvcnMKLWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQubmFtZT1Ub2dnbGUgQ29tbWVudAotY29tbWFuZC50b2dnbGUuY29tbWVudC5kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5uYW1lPUFkZCBCbG9jayBDb21tZW50Ci1jb21tYW5kLmFkZC5ibG9jay5jb21tZW50LmRlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1jb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50Lm5hbWU9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLWNvbW1hbmQucmVtb3ZlLmJsb2NrLmNvbW1lbnQuZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLWNvbW1hbmQuY2xlYW51cC5kb2N1bWVudC5uYW1lPUNsZWFudXAgRG9jdW1lbnQKLWNvbW1hbmQuY2xlYW51cC5kb2N1bWVudC5kZXNjcmlwdGlvbj1DbGVhbnVwIGRvY3VtZW50Ci1jb21tYW5kLmZvcm1hdC5kb2N1bWVudC5uYW1lPUZvcm1hdCBEb2N1bWVudAotY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQuZGVzY3JpcHRpb249Rm9ybWF0IGRvY3VtZW50Ci1jb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMubmFtZT1Gb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi1jb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMuZGVzY3JpcHRpb249Rm9ybWF0IGFjdGl2ZSBlbGVtZW50cwotY29tbWFuZC5vcGVuLmZpbGUuZnJvbS5zb3VyY2UubmFtZT1PcGVuIFNlbGVjdGlvbgotY29tbWFuZC5vcGVuLmZpbGUuZnJvbS5zb3VyY2UuZGVzY3JpcHRpb249T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLWNvbW1hbmQuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMubmFtZT1PY2N1cnJlbmNlcyBpbiBGaWxlCi1jb21tYW5kLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzLmRlc2NyaXB0aW9uPUZpbmQgb2NjdXJyZW5jZXMgb2YgdGhlIHNlbGVjdGlvbiBpbiB0aGUgZmlsZQotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RFbmNsb3NpbmcubmFtZT1TZWxlY3QgRW5jbG9zaW5nIEVsZW1lbnQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0RW5jbG9zaW5nLmRlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3ROZXh0Lm5hbWU9U2VsZWN0IE5leHQgRWxlbWVudAotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3ROZXh0LmRlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0UHJldmlvdXMubmFtZT1TZWxlY3QgUHJldmlvdXMgRWxlbWVudAotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RQcmV2aW91cy5kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RMYXN0Lm5hbWU9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RMYXN0LmRlc2NyaXB0aW9uPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLUFjdGlvbkRlZmluaXRpb24uc2hvd0phdmFkb2MubmFtZT1TaG93IFRvb2x0aXAgRGVzY3JpcHRpb24KLUFjdGlvbkRlZmluaXRpb24uc2hvd0phdmFkb2MuZGVzY3JpcHRpb249RGlzcGxheXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50Ci1BY3Rpb25EZWZpbml0aW9uLnF1aWNrRml4Lm5hbWU9UXVpY2sgRml4Ci1BY3Rpb25EZWZpbml0aW9uLnF1aWNrRml4LmRlc2NyaXB0aW9uPVF1aWNrIEZpeAotCi0jCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4gZmlsZSBhbmQgY29udGFpbmVyIHJlc291cmNlIHBvcHVwIG1lbnUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Tb3VyY2U9JlNvdXJjZQotRm9ybWF0RG9jdW1lbnQ9JkZvcm1hdCBkb2N1bWVudAotIyMKLUJyZWFrcG9pbnRfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9QnJlYWtwb2ludCBFeHRlbnNpb24gUG9pbnQKLVNvdXJjZV9WYWxpZGF0aW9uX0V4dGVuc2lvbl9Qb2ludC5uYW1lPVJlY29uY2lsZSBWYWxpZGF0b3IgRXh0ZW5zaW9uIFBvaW50Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBmb2xsb3dpbmcgcHJvcGVydHkga2V5cyBtYXliZSB1bnVzZWQuIENvbW1lbnRlZCBvdXQgb24gNC8xMi8yMDA1LiBVbmNvbW1lbnQgaWYgbmVlZGVkLgotI0JlYW5fSW5mb19Qcm92aWRlcl9FeHRlbnNpb24ubmFtZT1CZWFuIEluZm8gUHJvdmlkZXIgRXh0ZW5zaW9uCi0jU3BlbGxDaGVja19FeHRlbnNpb25fUG9pbnQubmFtZT1TcGVsbENoZWNrIEV4dGVuc2lvbiBQb2ludAotI09wZW5fT25fRXh0ZW5zaW9uX1BvaW50Lm5hbWU9T3BlbiBPbiBFeHRlbnNpb24gUG9pbnQKLSNTcGVsbF9DaGVja19sYWJlbD1TcGVsbCBDaGVjawotI1NwZWxsX0NoZWNrX3Rvb2x0aXA9U3BlbGwgQ2hlY2sKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDE5ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIgotCQluYW1lPSIlQWRhcHRlcl9GYWN0b3J5X0Rlc2NyaXB0aW9uX0V4dGVuc2lvbi5uYW1lIiAvPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImV4dGVuZGVkRWRpdG9yQWN0aW9ucyIKLQkJbmFtZT0iJUV4dGVuZGVkX0VkaXRvcl9BY3Rpb25zX0V4dGVuc2lvbi5uYW1lIiAvPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImRyb3BUYXJnZXRUcmFuc2ZlcnMiCi0JCW5hbWU9IiVEcm9wX1RhcmdldF9UcmFuc2ZlcnNfRXh0ZW5zaW9uLm5hbWUiIC8+Ci0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iZWRpdG9yQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iJUV4dGVuZGVkX0VkaXRvcl9Db25maWd1cmF0aW9uX0V4dGVuc2lvbi5uYW1lIgotCQlzY2hlbWE9InNjaGVtYS9lZGl0b3Jjb25maWd1cmF0aW9uLmV4c2QiIC8+Ci0KLQotCTwhLS0gTWFrZSBzdXJlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMgYXJlIHNldCBhdCBydW50aW1lIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0KLQk8IS0tIHJldXNhYmxlIGV4dGVuc2lvbnMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiAvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gYXNzb2NpYXRlIHRoZSBOYXZpZ2F0ZUFjdGlvblNldCB3aXRoIHZhcmlvdXMgcGFydHMgb2YgdGhlIFhNTCBwZXJzcGVjdGl2ZS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydAotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIj4KLQkJCTwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8IS0tCi0JCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIi8+Ci0JCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIi8+Ci0JCQktLT4KLQkJCTwhLS0KLQkJCQlzaG91bGQgcHJvYmFibHkgb25seSAiZm9yY2UiIGFzc29jaWF0aW9uIG9mIGFjdGlvbiBzZXRzIGZvciB3b3JrYmVuY2ggcGFydHMgdGhhdCB3ZSBvd24KLQkJCQlvciBvbmx5IGlmIHRoZSB2aWV3IGlzIGZvY3Vzc2UgaW4gdGhlIFhNTFBlcnNwZWN0aXZlCi0JCQktLT4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8IS0tIFJPT1QgUFJFRkVSRU5DRSBQQUdFIEZPUiBXRUIgQU5EIFhNTCBGSUxFUyAtLT4KLQkJPCEtLSAgQ29tbWVudCBvdXQgZm9yIG5vdyBzaW5jZSB0aGlzIHByZWZlcmVuY2UgcGFnZSBpcyBub3QgdXNlZAotCQkJPHBhZ2UKLQkJCW5hbWU9IiVXRUJfQU5EX1hNTF9GaWxlcy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuRmlsZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMiPgotCQkJPC9wYWdlPgotCQktLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXRUJfQU5EX1hNTF9GaWxlcy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcyI+Ci0JCTwvcGFnZT4KLQkJPCEtLSAiY29tbW9uIiB0YXNrIHRhZ3MgcHJlZmVyZW5jZSBwYWdlIC0tPgotCQk8cGFnZQotCQkJbmFtZT0iJVRhc2tfVGFnc19QcmVmZXJlbmNlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5UYXNrVGFnUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy50YXNrdGFncyI+Ci0JCTwvcGFnZT4KLQotCQk8IS0tIFNvdXJjZSBFZGl0b3IgUHJlZmVyZW5jZSBwYWdlIHVuZGVyIFdvcmtiZW5jaC0+RWRpdG9ycyAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVTdHJ1Y3R1cmVkX1RleHRfRWRpdG9yLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkVkaXRvcnMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gY29tbW9uIHRhc2sgdGFncyBwcm9wZXJ0eSBwYWdlIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCQk8cGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJvamVjdC5wcm9wZXJ0aWVzLnRhc2t0YWdzIgotCQkJbmFtZT0iJVRhc2tfVGFnc19QcmVmZXJlbmNlcy5uYW1lIgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotCQkJYWRhcHRhYmxlPSJ0cnVlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuVGFza1RhZ1ByZWZlcmVuY2VQYWdlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLQotCQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkcmFnU291cmNlVHJhbnNmZXJzIiBuYW1lPSJEcmFnIFNvdXJjZSBUcmFuc2ZlcnMiLz4KLQktLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTwhLS0gRWRpdCBjb21tYW5kcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdEVuY2xvc2luZy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdEVuY2xvc2luZy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdE5leHQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3ROZXh0LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdFByZXZpb3VzLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0UHJldmlvdXMuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdExhc3QubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RMYXN0LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNob3dKYXZhZG9jLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24uc2hvd0phdmFkb2MuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2hvdy5qYXZhZG9jIj4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24ucXVpY2tGaXgubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5xdWlja0ZpeC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnRleHQuamF2YS5jb3JyZWN0aW9uLmFzc2lzdC5wcm9wb3NhbHMiPgotCQk8L2NvbW1hbmQ+Ci0JCTwhLS0gU291cmNlIGNvbW1hbmRzIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC50b2dnbGUuY29tbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmFkZC5ibG9jay5jb21tZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuY2xlYW51cC5kb2N1bWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmNsZWFudXAuZG9jdW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmZvcm1hdC5kb2N1bWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmZvcm1hdC5kb2N1bWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuZG9jdW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIj4KLQkJPC9jb21tYW5kPgotCQk8IS0tIE5hdmlnYXRlIGNvbW1hbmRzIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQub3Blbi5maWxlLmZyb20uc291cmNlLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQub3Blbi5maWxlLmZyb20uc291cmNlLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLm9wZW4uZmlsZS5mcm9tLnNvdXJjZSI+Ci0JCTwvY29tbWFuZD4KLQkJPCEtLSBGaW5kIE9jY3VycmVuY2VzIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5zZWFyY2guZmluZC5vY2N1cnJlbmNlcy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyI+Ci0JCTwvY29tbWFuZD4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIEtleWJpbmRpbmcgc2NvcGUgZm9yIHNvdXJjZSBlZGl0b3IgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotCQk8Y29udGV4dAotCQkJbmFtZT0iJXNjb3BlLnN0cnVjdHVyZWRUZXh0RWRpdG9yLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2UudWkudGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkVGV4dEVkaXRvci5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiPgotCQk8L2NvbnRleHQ+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBLZXliaW5kaW5ncyBmb3Igc291cmNlIGVkaXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0JICAgIDwhLS0gIHdpbjMyOiAgTTE9Q1RSTCwgTTI9U0hJRlQsIE0zPUFMVCAtLT4KLQkJPCEtLSBFZGl0IGNvbW1hbmRzIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrQVJST1dfVVAiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19SSUdIVCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19MRUZUIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19ET1dOIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9IkYyIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2hvdy5qYXZhZG9jIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xKzEiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnRleHQuamF2YS5jb3JyZWN0aW9uLmFzc2lzdC5wcm9wb3NhbHMiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8IS0tIFNvdXJjZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0MiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMisvIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErTTIrXCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0YiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuZG9jdW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErSSIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8IS0tIE5hdmlnYXRlIGNvbW1hbmRzIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iRjMiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5vcGVuLmZpbGUuZnJvbS5zb3VyY2UiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8IS0tIEZpbmQgT2NjdXJyZW5jZXMgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitBIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gRm9udCBhbmQgY29sb3JzIGNvbnRyaWJ1dGlvbnMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lRWxlbWVudENhdGVnb3J5Ci0JCQlsYWJlbD0iJVN0cnVjdHVyZWRfVGV4dF9FZGl0b3IubmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIj4KLQkJPC90aGVtZUVsZW1lbnRDYXRlZ29yeT4KLQkJPGZvbnREZWZpbml0aW9uCi0JCQlsYWJlbD0iJXNvdXJjZUVkaXRvckZvbnREZWZpbml0b24ubGFiZWwiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIgotCQkJZGVmYXVsdHNUbz0ib3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCI+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJJXNvdXJjZUVkaXRvckZvbnREZWZpbnRpb24uZGVzY3JpcHRpb24KLQkJCTwvZGVzY3JpcHRpb24+Ci0JCTwvZm9udERlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5kcm9wVGFyZ2V0VHJhbnNmZXJzIj4KLQkJPGRyb3BUYXJnZXRDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkVHJhbnNmZXJzIj4KLQkJCTx0cmFuc2ZlcgotCQkJCXByaW9yaXR5PSJtaWQiCi0JCQkJc2luZ2xldG9uPSJ0cnVlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLQkJCQltZXRob2Q9ImdldEluc3RhbmNlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciI+Ci0JCQk8L3RyYW5zZmVyPgotCQkJPGRyb3BBY3Rpb24KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5GaWxlRHJvcEFjdGlvbiIKLQkJCQl0cmFuc2ZlcklEPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5GaWxlRHJvcEFjdGlvbiI+Ci0JCQk8L2Ryb3BBY3Rpb24+Ci0JCQk8dHJhbnNmZXIKLQkJCQlwcmlvcml0eT0ibG93IgotCQkJCXNpbmdsZXRvbj0idHJ1ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0JCQkJbWV0aG9kPSJnZXRJbnN0YW5jZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiPgotCQkJPC90cmFuc2Zlcj4KLQkJCTxkcm9wQWN0aW9uCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuVGV4dERyb3BBY3Rpb24iCi0JCQkJdHJhbnNmZXJJRD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuVGV4dERyb3BBY3Rpb24iPgotCQkJPC9kcm9wQWN0aW9uPgotCQk8L2Ryb3BUYXJnZXRDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmFubm90YXRpb25UeXBlcyI+Ci0JCTx0eXBlCi0JCQlzdXBlcj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuZXJyb3IiCi0JCQltYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnByb2JsZW0iCi0JCQluYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiCi0JCQltYXJrZXJTZXZlcml0eT0iMiI+Ci0JCTwvdHlwZT4KLQkJPHR5cGUKLQkJCXN1cGVyPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci53YXJuaW5nIgotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5wcm9ibGVtIgotCQkJbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciCi0JCQltYXJrZXJTZXZlcml0eT0iMSI+Ci0JCTwvdHlwZT4KLQotCQk8dHlwZQotCQkJc3VwZXI9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmluZm8iCi0JCQltYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnByb2JsZW0iCi0JCQluYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuaW5mbyIKLQkJCW1hcmtlclNldmVyaXR5PSIwIj4KLQkJPC90eXBlPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubWFya2VyQW5ub3RhdGlvblNwZWNpZmljYXRpb24iPgotCi0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPCEtLSBzYW1lIGFzIGVjbGlwc2UgdGV4dCB1aSAoaW5jbHVkaW5nIHByZWZlcmVuY2Uga2V5cyksIGV4Y2VwdCBmb3IgdmVydGljYWwgcnVsZXIgJiBwcmVmZXJlbmNlIHBhZ2UgLS0+Ci0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPHNwZWNpZmljYXRpb24KLQkJCWFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLQkJCXZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJzc2VFcnJvckluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0JCQlpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0iZmFsc2UiPgotCQk8L3NwZWNpZmljYXRpb24+Ci0JCTxzcGVjaWZpY2F0aW9uCi0JCQlhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0JCQl2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0ic3NlV2FybmluZ0luZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0JCQlpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0iZmFsc2UiPgotCQk8L3NwZWNpZmljYXRpb24+Ci0JCTxzcGVjaWZpY2F0aW9uCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5pbmZvIj4KLQkJPC9zcGVjaWZpY2F0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gZHluYW1pYyBjb250ZW50IHR5cGUgc3VwcG9ydGluZyBlZGl0b3IsIG5vIHN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnMgYnkgZGVmYXVsdCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJVN0YW5kYWxvbmVfU3RydWN0dXJlZF9Tb3VyY2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciI+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFjdGlvbnMuQ29udGFpbmVyU291cmNlQWN0aW9ucyI+Ci0JCQk8bWVudQotCQkJCWxhYmVsPSIlU291cmNlIgotCQkJCXBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ic291cmNlIj4KLQkJCQk8Z3JvdXBNYXJrZXIgbmFtZT0ic291cmNlR3JvdXAiPjwvZ3JvdXBNYXJrZXI+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVGb3JtYXREb2N1bWVudCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkZvcm1hdEFjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJzb3VyY2Uvc291cmNlR3JvdXAiCi0JCQkJZW5hYmxlc0Zvcj0iKyIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hY3Rpb25zLkNvbnRhaW5lclNvdXJjZUFjdGlvbnMuRm9ybWF0Ij4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWN0aW9ucy5GaWxlU291cmNlQWN0aW9ucyI+Ci0JCQk8bWVudQotCQkJCWxhYmVsPSIlU291cmNlIgotCQkJCXBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ic291cmNlIj4KLQkJCQk8Z3JvdXBNYXJrZXIgbmFtZT0ic291cmNlR3JvdXAiPjwvZ3JvdXBNYXJrZXI+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVGb3JtYXREb2N1bWVudCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkZvcm1hdEFjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJzb3VyY2Uvc291cmNlR3JvdXAiCi0JCQkJZW5hYmxlc0Zvcj0iKyIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hY3Rpb25zLkZpbGVTb3VyY2VBY3Rpb25zLkZvcm1hdCI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAJPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0gICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gY29udHJpYnV0ZSBhIFNlYXJjaFJlc3VsdFZpZXdQYWdlIGZvciBPY2N1cnJlbmNlcyBpbiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0iT2NjdXJyZW5jZXMgc2VhcmNoIHBhZ2UiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5zZWFyY2guc2VhcmNoUmVzdWx0Vmlld1BhZ2VzIj4KLQkJPHZpZXdQYWdlCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHRQYWdlIgotCQkJc2VhcmNoUmVzdWx0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UiPgotCQk8L3ZpZXdQYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBleHRlbnNpb24gcG9pbnQgZm9yIGJyZWFrcG9pbnQgZXh0ZW5zaW9uIC0tPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImJyZWFrcG9pbnQiCi0JCW5hbWU9IiVCcmVha3BvaW50X0V4dGVuc2lvbl9Qb2ludC5uYW1lIiAvPgotCTwhLS0gZXh0ZW5zaW9uIHBvaW50IGZvciBzb3VyY2UgdmFsaWRhdGlvbiAtLT4KLQk8IS0tIGludGVyZmFjZXMgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSBmb3VuZCBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiAtLT4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJzb3VyY2V2YWxpZGF0aW9uIgotCQluYW1lPSIlU291cmNlX1ZhbGlkYXRpb25fRXh0ZW5zaW9uX1BvaW50Lm5hbWUiCi0JCXNjaGVtYT0ic2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkIiAvPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcmVleHBvcnQtaW5mby50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcmVleHBvcnQtaW5mby50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGM3YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3JlZXhwb3J0LWluZm8udHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi13ZSByZWV4cG9ydCBlY2xpcHNlLnVpLmVkaXRvcnMgCi1zaW5jZSBvbmUgb2Ygb3VyIEFQSXMsIFN0cnVjdHVyZWRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIAotcmVxdWlyZXMgaXQuIAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2VkaXRvcmNvbmZpZ3VyYXRpb24uZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvZWRpdG9yY29uZmlndXJhdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZjOTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvZWRpdG9yY29uZmlndXJhdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJlZGl0b3JDb25maWd1cmF0aW9uIiBuYW1lPSJFZGl0b3IgQ29uZmlndXJhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgU1NFIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGlzIGludGVuZGVkIHRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLiAgTXVjaCBvZiBpdHMgZGVzaWduIGNlbnRlcnMgYXJvdW5kIHRoZSBub3Rpb24gb2YgZGVmaW5pbmcgYW5kIHJlZGVmaW5pbmcgaXRzIGJlaGF2aW9yIGFuZCBhcHBlYXJhbmNlIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUgb2YgaXRzIGlucHV0LiAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSBhbiBlZGl0b3IgY29uZmlndXJhdGlvbiB0byB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3Igd2l0aG91dCBoYXZpbmcgdG8gc3ViY2xhc3MgdGhlIGVkaXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic291cmNlVmlld2VyQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvdmlzaW9uYWxDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3Zpc2lvbmFsRGVmaW5pdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbiwgYWZmZWN0aW5nIHN5bnRheCBoaWdobGlnaHRpbmcsIGNvbnRlbnQgYXNzaXN0LCBob3ZlciBoZWxwLCBhbmQgbW9yZSBpbiB0aGUgY3VycmVudCBlZGl0b3IuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHN0cmluZyBkZWZpbmluZyB3aGVuIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgZWl0aGVyIGFuIGVkaXRvciBvciBjb250ZW50IHR5cGUgaWQuICBNdWx0aXBsZSB0YXJnZXRzIG1heSBiZSBnaXZlbiBhcyBhIGNvbW1hIGRlbGltaXRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBNdXN0IHN1YmNsYXNzIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBob3cgdGhlIGN1cnJlbnQgZWRpdG9yJmFwb3M7cyBpbnB1dCBtYXBzIHRvIGVsZW1lbnRzIHdpdGggaW4gYSBUcmVlIGNvbnRyb2wsIGFzIHdlbGwgYXMgc2VsZWN0aW9uIGZpbHRlcmluZywgdG9vbGJhciBhbmQgbWVudSBjb250cmlidXRpb25zLCBldGMgaW4gdGhlIE91dGxpbmUgdmlldy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE11c3Qgc3ViY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgaG93IHRoZSBjdXJyZW50IGVkaXRvciZhcG9zO3MgaW5wdXQgbWFwcyB0byBwcm9wZXJ0aWVzIGluIGEgVGFibGUgY29udHJvbCwgYXMgd2VsbCBhcyB0b29sYmFyIGNvbnRyaWJ1dGlvbnMsIGV0YyBpbiB0aGUgUHJvcGVydGllcyB2aWV3LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24sIGVpdGhlciBhbiBlZGl0b3Igb3IgY29udGVudCB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTXVzdCBzdWJjbGFzcyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvdmlzaW9uYWxDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIGNsYXNzIGZ1bGZpbGxpbmcgdGhlIHJlcXVpcmVtZW50cyBvZiBhIHR5cGUgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHRhcmdldChzKS4KLU5vdGU6IHRoaXMgaXMgbm90IEFQSSBhbmQgaXMgb25seSB1c2VkIGZvciBwcm92aXNpb25hbCBjb25maWd1cmF0aW9uIHR5cGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24sIGVpdGhlciBhbiBlZGl0b3Igb3IgY29udGVudCB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBjb25maWd1cmF0aW9uIHRvIGZpbmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoaXMgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvdmlzaW9uYWxEZWZpbml0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGEgdmFsdWUgZm9yIGEgdHlwZSB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0KHMpLgotTm90ZTogdGhpcyBpcyBub3QgQVBJIGFuZCBpcyBvbmx5IHVzZWQgZm9yIHByb3Zpc2lvbmFsIGNvbmZpZ3VyYXRpb24gdHlwZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZGVmaW5pdGlvbiB0byBmaW5kLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGRlZmluaXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7IS0tIGFzc29jaWF0aW5nIGEgc291cmNlIHZpZXdlciBjb25maWd1cmF0aW9uIHRvIGFuIGlucHV0JmFwb3M7cyBjb250ZW50IHR5cGUtLSZndDsKLSAgICAgICZsdDtzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MJnF1b3Q7Ci0gICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlJnF1b3Q7LyZndDsKLSAgICAgICZsdDshLS0gYXNzb2NpYXRpbmcgYW4gb3V0bGluZSBjb25maWd1cmF0aW9uIHRvIGFuIGlucHV0JmFwb3M7cyBjb250ZW50IHR5cGUgLS0mZ3Q7Ci0gICAgICAmbHQ7Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLlhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiZxdW90OwotICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwmcXVvdDsvJmd0OwotICAgICAgJmx0OyEtLSBhc3NvY2lhdGluZyBhIHByb3BlcnR5IHNoZWV0IGNvbmZpZ3VyYXRpb24gdG8gbXVsdGlwbGUgY29udGVudCB0eXBlcyAtLSZndDsKLSAgICAgICZsdDtwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5wcm9wZXJ0aWVzLlhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uJnF1b3Q7Ci0gICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS5jb250ZW50dHlwZS54bWwsIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSwgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIHNlZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlN0cnVjdHVyZWRQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MGQzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJzb3VyY2V2YWxpZGF0aW9uIiBuYW1lPSJTb3VyY2UgVmFsaWRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwcm92aWRlZCB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgYSB2YWxpZGF0b3IgKCZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciZsdDsvY29kZSZndDspCi1mb3IgYXMteW91LXR5cGUgKHNvdXJjZSkgdmFsaWRhdGlvbi4mbHQ7YnImZ3Q7Ci0KLUlmIHlvdXIgdmFsaWRhdG9yIGNhbiBoYW5kbGUgJnF1b3Q7cGFydGlhbCBkb2N1bWVudCZxdW90OyB2YWxpZGF0aW9uLCBpdCBzaG91bGQgYWxzbyBpbXBsZW1lbnQgSVNvdXJjZVZhbGlkYXRvci4gIFRoZSB2YWxpZGF0ZSBjYWxsIG9uIElTb3VyY2VWYWxpZGF0b3IgZ2V0cyBwYXNzZWQgYW4gSVJlZ2lvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgdGhhdCZhcG9zO3MgZGlydHkuJmx0O2JyJmd0OwotCi1UaGlzIHNob3VsZCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gdmFsaWRhdGluZyB0aGUgZW50aXJlIGZpbGUgZWFjaCB0aW1lIHNvbWVvbmUgdHlwZXMuJmx0O2JyJmd0OwotCi1UaGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgZm9yIHNwZWNpZmljIGNvbnRlbnQgdHlwZS9wYXJ0aXRpb24gY29tYmluYXRpb25zLiZsdDticiZndDsKLQotUmVxdWlyZWQgcGx1Z2lucyBhcmU6Jmx0O2JyJmd0OwotICAgb3JnLmVjbGlwc2Uud3N0LnNzZS51aSZsdDticiZndDsKLSAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZhbGlkYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlSWRlbnRpZmllciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhcnRpdGlvblR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudFR5cGVJZGVudGlmaWVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFydGl0aW9uVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeGFtcGxlIGRlbW9uc3RyYXRpbmcgaG93IEhUTUxWYWxpZGF0b3IgY29udHJpYnV0ZXMgdG8gYXMteW91LXR5cGUgdmFsaWRhdGlvbiBpbiB0aGUgc291cmNlIGVkaXRvci4KLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5zb3VyY2V2YWxpZGF0aW9uJnF1b3Q7Jmd0OwotICAgICAgJmx0O3ZhbGlkYXRvcgotICAgICAgICAgICAgc2NvcGU9JnF1b3Q7dG90YWwmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmh0bWwuSFRNTFZhbGlkYXRvciZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaHRtbHNvdXJjZXZhbGlkYXRvciZxdW90OyZndDsKLSAgICAgICAgICZsdDtjb250ZW50VHlwZUlkZW50aWZpZXIKLSAgICAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQmcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9jb250ZW50VHlwZUlkZW50aWZpZXImZ3Q7Ci0gICAgICAgICAmbHQ7Y29udGVudFR5cGVJZGVudGlmaWVyCi0gICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O3BhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L2NvbnRlbnRUeXBlSWRlbnRpZmllciZndDsKLSAgICAgICZsdDsvdmFsaWRhdG9yJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDtwJmd0OwotVXNpbmcgSVNvdXJjZVZhbGlkYXRvcgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JZiB5b3VyIHZhbGlkYXRvciBjYW4gaGFuZGxlICZxdW90O3BhcnRpYWwgZG9jdW1lbnQmcXVvdDsgdmFsaWRhdGlvbiwgaXQgc2hvdWxkICBpbXBsZW1lbnQgSVNvdXJjZVZhbGlkYXRvci4gIAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgdmFsaWRhdGUgY2FsbCBvbiBJU291cmNlVmFsaWRhdG9yIGdldHMgcGFzc2VkIGFuIElSZWdpb24gb2YgdGhlIGRvY3VtZW50IHdoaWNoIHJlcHJlc2VudHMganVzdCB0aGUgcGFydCB0aGF0JmFwb3M7cyBkaXJ0eS4gIFRoaXMgc2hvdWxkIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiB2YWxpZGF0aW5nIHRoZSBlbnRpcmUgZmlsZSBlYWNoIHRpbWUgc29tZW9uZSB0eXBlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSVNvdXJjZVZhbGlkYXRvciBoYXMgaXRzICZxdW90O2Nvbm5lY3QoSURvY3VtZW50IGRvYykmcXVvdDsgbWV0aG9kIGNhbGxlZCB3aGVuIGl0JmFwb3M7cyBob29rZWQgdXAgdG8gdGhlIGRvY3VtZW50ICh3aGVuIHRoZSBlZGl0b3IgaXMgb3BlbmVkKSwgYW5kICZxdW90O2Rpc2Nvbm5lY3QoSURvY3VtZW50IGRvYykmcXVvdDsgY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBjbG9zZWQsIHdoZXJlIGFueSAmcXVvdDt1bmhvb2tpbmcmcXVvdDsgc2hvdWxkIHRha2UgcGxhY2UuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEN1cnJlbnRseSB0aGVyZSBpcyBubyBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBmb3IgSVZhbGlkYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VuY29kaW5nL3VpL0VuY29kaW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lbmNvZGluZy91aS9FbmNvZGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2YzZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VuY29kaW5nL3VpL0VuY29kaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZW5jb2RpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Db2RlZFJlc291cmNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHRoaXMgc2hvdWxkIG5vdCBiZSBoYW5kbGVkIGJ5IHRoZSBwbGF0Zm9ybSBhbmQgbm90IFdUUAotICovCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCUJ1dHRvbiBmVXNlM0J5dGVCT01XaXRoVVRGOENoZWNrQm94ID0gbnVsbDsKLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5MRUZUIHwgU1dULldSQVApOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBDb2RlZFJlc291cmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5FbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzA7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIElTU1VFOiB0aGUgZm9sbG93aW5nIHRvIGxpbmVzIGxvb2sgcmVkdW5kYW50LCAKLQkJLy8gbm90IHN1cmUgd2hhdCB3YXMgdHJ5aW5nIHRvIGJlIGFjY29tcGxpc2hlZC4gCi0JCS8vIE1heSBiZSBkZWFkIGNvZGUuIAotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIGRlc2NyaXB0aW9uKTsKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgY2hlY2tCb3hMYWJlbCA9IFNTRVVJTWVzc2FnZXMuRW5jb2RpbmdQcmVmZXJlbmNlUGFnZV8xOyAvLyROT04tTkxTLTEkCi0JCWZVc2UzQnl0ZUJPTVdpdGhVVEY4Q2hlY2tCb3ggPSBjcmVhdGVDaGVja0JveChjb21wb3NpdGUsIGNoZWNrQm94TGFiZWwpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJYm9vbGVhbiBkZWZhdWx0U2VsZWN0aW9uID0gQ29kZWRSZXNvdXJjZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCk7Ci0JCWZVc2UzQnl0ZUJPTVdpdGhVVEY4Q2hlY2tCb3guc2V0U2VsZWN0aW9uKGRlZmF1bHRTZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJQ29kZWRSZXNvdXJjZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCwgZlVzZTNCeXRlQk9NV2l0aFVURjhDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCUNvZGVkUmVzb3VyY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjE1Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0lHTiA9ICIuZGVzaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRSA9ICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKElFZGl0b3JQYXJ0IHBhcnQsIFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIHN1YkNvbnRleHQsIENsYXNzIHJvb3RDbGFzcykgewotCQlDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yIGNhbGN1bGF0b3IgPSBuZXcgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvcigpOwotCQljYWxjdWxhdG9yLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJY2FsY3VsYXRvci5zZXRQYXJ0KHBhcnQpOwotCQljYWxjdWxhdG9yLnNldFJvb3RDbGFzcyhyb290Q2xhc3MpOwotCQljYWxjdWxhdG9yLnNldFN1YkNvbnRleHQoc3ViQ29udGV4dCk7Ci0JCXJldHVybiBjYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZDb250ZW50VHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGZQYXJ0ID0gbnVsbDsKLQotCXByb3RlY3RlZCBDbGFzcyBmUm9vdENsYXNzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdWJDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkgewotCQlMaXN0IHBvaW50cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0KLQkJSUVkaXRvclNpdGUgc2l0ZSA9IGZQYXJ0LmdldEVkaXRvclNpdGUoKTsKLQkJU3RyaW5nIGlkID0gc2l0ZS5nZXRJZCgpOwotCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDAgJiYgIWlkLmVxdWFscyhmUm9vdENsYXNzLmdldE5hbWUoKSkpCi0JCQlwb2ludHMuYWRkKGlkKTsKLQotCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclNpdGUpIHsKLQkJCVN0cmluZyBtdWx0aXBhZ2VJRCA9ICgoTXVsdGlQYWdlRWRpdG9yU2l0ZSkgc2l0ZSkuZ2V0TXVsdGlQYWdlRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCQlpZiAoIXBvaW50cy5jb250YWlucyhtdWx0aXBhZ2VJRCkpCi0JCQkJcG9pbnRzLmFkZChtdWx0aXBhZ2VJRCk7Ci0JCQlTdHJpbmcgc291cmNlUGFnZUlEID0gKChNdWx0aVBhZ2VFZGl0b3JTaXRlKSBzaXRlKS5nZXRNdWx0aVBhZ2VFZGl0b3IoKS5nZXRTaXRlKCkuZ2V0SWQoKSArICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFwb2ludHMuY29udGFpbnMoc291cmNlUGFnZUlEKSkKLQkJCQlwb2ludHMuYWRkKHNvdXJjZVBhZ2VJRCk7Ci0JCX0KLQkJaWYgKHNpdGUgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JTaXRlKSB7Ci0JCQlTdHJpbmcgbXVsdGlwYWdlQ2xhc3NOYW1lID0gKChNdWx0aVBhZ2VFZGl0b3JTaXRlKSBzaXRlKS5nZXRNdWx0aVBhZ2VFZGl0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKG11bHRpcGFnZUNsYXNzTmFtZSkpCi0JCQkJcG9pbnRzLmFkZChtdWx0aXBhZ2VDbGFzc05hbWUpOwotCQl9Ci0JCUNsYXNzIGVkaXRvckNsYXNzID0gZlBhcnQuZ2V0Q2xhc3MoKTsKLQkJd2hpbGUgKGVkaXRvckNsYXNzICE9IG51bGwgJiYgZlJvb3RDbGFzcyAhPSBudWxsICYmICFlZGl0b3JDbGFzcy5lcXVhbHMoZlJvb3RDbGFzcykpIHsKLQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKGVkaXRvckNsYXNzLmdldE5hbWUoKSkpCi0JCQkJcG9pbnRzLmFkZChlZGl0b3JDbGFzcy5nZXROYW1lKCkpOwotCQkJZWRpdG9yQ2xhc3MgPSBlZGl0b3JDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCX0KLQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShmQ29udGVudFR5cGUpOwotCQl3aGlsZSAoY29udGVudFR5cGUgIT0gbnVsbCAmJiAhY29udGVudFR5cGUuZ2V0SWQoKS5lcXVhbHMoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKSkgewotCQkJaWYgKCFwb2ludHMuY29udGFpbnMoY29udGVudFR5cGUuZ2V0SWQoKSkpCi0JCQkJcG9pbnRzLmFkZChjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCi0JCWlmICghcG9pbnRzLmNvbnRhaW5zKGZSb290Q2xhc3MuZ2V0TmFtZSgpKSkKLQkJCXBvaW50cy5hZGQoZlJvb3RDbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gKFN0cmluZ1tdKSBwb2ludHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRlbnRUeXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJ0LgotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRQYXJ0KCkgewotCQlyZXR1cm4gZlBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByb290Q2xhc3MuCi0JICovCi0JcHVibGljIENsYXNzIGdldFJvb3RDbGFzcygpIHsKLQkJcmV0dXJuIGZSb290Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzdWJDb250ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViQ29udGV4dCgpIHsKLQkJcmV0dXJuIGZTdWJDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqICAgICAgICAgICAgVGhlIGNvbnRlbnRUeXBlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJZkNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJ0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0KElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJZlBhcnQgPSBwYXJ0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByb290Q2xhc3MKLQkgKiAgICAgICAgICAgIFRoZSByb290Q2xhc3MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3RDbGFzcyhDbGFzcyByb290Q2xhc3MpIHsKLQkJZlJvb3RDbGFzcyA9IHJvb3RDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3ViQ29udGV4dAotCSAqICAgICAgICAgICAgVGhlIHN1YkNvbnRleHQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1YkNvbnRleHQoU3RyaW5nIHN1YkNvbnRleHQpIHsKLQkJZlN1YkNvbnRleHQgPSBzdWJDb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVkYzIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIGEgbWFya2VyIGludGVyZmFjZSB0byBjb250cm9sIFZhbGlkYXRlRWRpdCBjYWxsIFVzdWFsbHkgZnJhbWV3b3JrCi0gKiBjYWxscyBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IjdmFsaWRhdGVFZGl0KCkgYmVmb3JlIGNhbGxpbmcKLSAqIElFeHRlbmRlZEVkaXRvckFjdGlvbidzIHJ1bigpIG1ldGhvZC4gSG93ZXZlciwgaWYgdGhlIGFjdGlvbiBpbXBsZW1lbnRzCi0gKiB0aGlzIGludGVyZmFjZSwgZnJhbWV3b3JrIHdvbid0IGNhbGwgdmFsaWRhdGVFZGl0KCkgbWV0aG9kLgotICogCi0gKiBUaGUgYWN0aW9uIHNob3VsZCBjYWxsIHZhbGlkYXRlRWRpdCgpIGF0IHRoZWlyIG93biBhcHByb3ByaWF0ZSB0aW1pbmcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24gewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0lTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0lTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGVkZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZSBjb252ZW5pZW50IGZ1bmN0aW9ucyBmb3IgZWRpdG9ycyB0aGF0IG1heSBub3QgYmUKLSAqIElUZXh0RWRpdG9ycywgYnV0IG5lZWQgdG8gZXhwb3NlIHByb3BlcnRpZXMgdXN1YWxseSBmb3VuZCBpbiB0ZXh0IGVkaXRvcnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU291cmNlRWRpdGluZ1RleHRUb29scyB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBvZmZzZXQgYXQgd2hpY2ggdGhlIENhcmV0IGlzIGxvY2F0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENhcmV0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJRG9jdW1lbnQgYmVpbmcgZWRpdGVkLiBJZiB0aGlzIGVkaXRvciBzdXBwb3J0cyBtdWx0aXBsZQotCSAqICAgICAgICAgZG9jdW1lbnRzLCB0aGUgZG9jdW1lbnQgY3VycmVudGx5IHBvc3Nlc3NpbmcgdGhlIGNhcmV0IHdpbGwgYmUKLQkgKiAgICAgICAgIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIElFZGl0b3JQYXJ0IGluc3RhbmNlIGZvciB0aGlzIGVkaXRvciB0aGF0IGlzIGtub3duIHRvIHRoZQotCSAqICAgICAgICAgd29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoaW4gdGhlIGVkaXRvci4gSW1wbGVtZW50b3JzIG1heQotCSAqICAgICAgICAgc3VwcG9ydCBvdGhlciB0eXBlcyBvZiBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIElUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50Q29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4ZTQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQ7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJlYWtwb2ludENvbnN0YW50cyB7Ci0JU3RyaW5nIEFUVFJfSElEREVOID0gImhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTT1VSQ0VfUEFUSCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5wYXRoIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODU1ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZSBicmVha3BvaW50IGNyZWF0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyZWFrcG9pbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBBZGRzIGJyZWFrcG9pbnQgdG8gc3BlY2lmaWVkIHBvc2l0aW9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBJRG9jdW1lbnQgb2JqZWN0Ci0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBjdXJyZW50IGVkaXRvciBpbnB1dCwgbm90IG5lY2Vzc2FyaWx5IGFuIElGaWxlRWRpdG9ySW5wdXQgb3IKLQkgKiAgICAgICAgICAgIGxpbmtlZCB0byBhIHJlc291cmNlIGluIGFueSB3YXkKLQkgKiBAcGFyYW0gbGluZU51bWJlcgotCSAqICAgICAgICAgICAgY3VycmVudCBsaW5lIG51bWJlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGN1cnJlbnQgY2FyZXQgb2Zmc2V0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHJldHVybiBJU3RhdHVzIHRoZSBzdGF0dXMgYWZ0ZXIgYmVpbmcgYXNrZWQgdG8gYWRkIGEgYnJlYWtwb2ludC4gVGhlCi0JICogICAgICAgICBTZXZlcml0eSBvZiBFUlJPUiBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoZSBsb2NhdGlvbgotCSAqICAgICAgICAgaW5mb3JtYXRpb24gaXMgYm90aCB2YWxpZCBmb3IgYSBicmVha3BvaW50IGFuZCBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBhZGRlZC4KLQkgKi8KLQlJU3RhdHVzIGFkZEJyZWFrcG9pbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgaW5wdXQsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgY29ycmVzcG9uZGluZyByZXNvdXJjZSBmcm9tIGVkaXRvciBpbnB1dAotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gSVJlc291cmNlCi0JICovCi0JSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBTZXQgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIHRvb2wKLQkgKiAgICAgICAgICAgIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIG9iamVjdAotCSAqLwotCXZvaWQgc2V0U291cmNlRWRpdGluZ1RleHRUb29scyhJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29sKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0MTQ3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcjsKLQotcHVibGljIGludGVyZmFjZSBJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQgZXh0ZW5kcyBJU3RvcmFnZUVkaXRvcklucHV0IHsKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBlbGVtZW50IHN0YXRlIGxpc3RlbmVyIHRvIHRoaXMgaW5wdXQuIEhhcyBubyBlZmZlY3QgaWYKLQkgKiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBUeXBpY2FsbHkgdXNlZCBieSB0aGUKLQkgKiBJRG9jdW1lbnRQcm92aWRlciB0byByZWdpc3RlciBpdHNlbGYgZm9yIGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZEVsZW1lbnRTdGF0ZUxpc3RlbmVyKElFbGVtZW50U3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IHN0YXRlIGxpc3RlbmVyIGZyb20gdGhpcyBpbnB1dC4gSGFzIG5vIGFmZmVjdAotCSAqIGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlRWxlbWVudFN0YXRlTGlzdGVuZXIoSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9Ob2RlTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9Ob2RlTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3NGQ5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTm9kZUxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZUxvY2F0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbmQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLCAtMSBvZiB0aGVyZSBpcyBubyBlbmQKLQkgKiB0YWcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldEVuZFRhZ0VuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLCAtMSBvZiB0aGVyZSBpcyBubyBlbmQKLQkgKiB0YWcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldEVuZFRhZ1N0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbmQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcsIC0xIG9mIHRoZXJlIGlzIG5vCi0JICogc3RhcnQgdGFnCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRTdGFydFRhZ0VuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgc3RhcnQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcsIC0xIG9mIHRoZXJlIGlzIG5vCi0JICogc3RhcnQgdGFnCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRTdGFydFRhZ1N0YXJ0T2Zmc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9OdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc1OGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9OdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotcHVibGljIGNsYXNzIE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGltcGxlbWVudHMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInNvdXJjZWVkaXRpbmd0ZXh0dG9vbHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJVGV4dEVkaXRvciBmVGV4dEVkaXRvcjsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJU291cmNlRWRpdGluZ1RleHRUb29scyBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBOdWxsU291cmNlRWRpdGluZ1RleHRUb29scygpOwotCX0KLQotCXByaXZhdGUgTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDYXJldE9mZnNldCgpIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCXJldHVybiAoKElUZXh0U2VsZWN0aW9uKSBzZWwpLmdldE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JcHVibGljIElUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gVGV4dFNlbGVjdGlvbi5lbXB0eVNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRFZGl0b3IoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCWZUZXh0RWRpdG9yID0gZWRpdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FeGNsdXNpb25zVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRXhjbHVzaW9uc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2ZjZGZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FeGNsdXNpb25zVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Tb3J0ZXI7Ci0KLWNsYXNzIEV4Y2x1c2lvbnNUYWIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVRhYiB7Ci0JcHJpdmF0ZSBjbGFzcyBBcnJheVRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBBcnJheVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RbXSkKLQkJCQlyZXR1cm4gZkNvbnRlbnRUeXBlU29ydGVyLnNvcnQoKE9iamVjdFtdKSBwYXJlbnRFbGVtZW50KTsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRUeXBlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlPYmplY3QgbyA9IGVsZW1lbnQ7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJbyA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoby50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJQ29udGVudFR5cGUpIHsKLQkJCQkJcmV0dXJuICgoSUNvbnRlbnRUeXBlKSBvKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIFF1aWNrU29ydGVyIHRoYXQgc29ydHMgYW5kIHJldHVybnMgYSBJQ29udGVudFR5cGUtdHlwZWQgYXJyYXkKLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRUeXBlU29ydGVyIGV4dGVuZHMgU29ydGVyIHsKLQkJcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJcmV0dXJuIChjb2xsYXRvci5jb21wYXJlKCgoSUNvbnRlbnRUeXBlKSBlbGVtZW50T25lKS5nZXROYW1lKCksICgoSUNvbnRlbnRUeXBlKSBlbGVtZW50VHdvKS5nZXROYW1lKCkpKSA8IDA7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gc29ydChPYmplY3RbXSB1blNvcnRlZENvbGxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIHR5cGVzID0gc3VwZXIuc29ydCh1blNvcnRlZENvbGxlY3Rpb24pOwotCQkJSUNvbnRlbnRUeXBlW10gc29ydGVkVHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW3R5cGVzLmxlbmd0aF07Ci0JCQlpZiAodHlwZXMubGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZXMsIDAsIHNvcnRlZFR5cGVzLCAwLCBzb3J0ZWRUeXBlcy5sZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIHNvcnRlZFR5cGVzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50VHlwZVRyZWVQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIENvbnRlbnRUeXBlVHJlZVByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCQlib29sZWFuIGVxdWFscyhPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQlyZXR1cm4gbGVmdCA9PSBudWxsID8gcmlnaHQgPT0gbnVsbCA6ICgocmlnaHQgIT0gbnVsbCkgJiYgbGVmdC5lcXVhbHMocmlnaHQpKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotCQkJCXJldHVybiAoT2JqZWN0W10pIHBhcmVudEVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElDb250ZW50VHlwZSkgewotCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQkJCUlDb250ZW50VHlwZVtdIGFsbFR5cGVzID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRBbGxDb250ZW50VHlwZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5jb250YWlucyhhbGxUeXBlc1tpXSkgJiYgZXF1YWxzKGFsbFR5cGVzW2ldLmdldEJhc2VUeXBlKCksIHBhcmVudEVsZW1lbnQpKSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoYWxsVHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmQ29udGVudFR5cGVTb3J0ZXIuc29ydChlbGVtZW50cy50b0FycmF5KCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250ZW50VHlwZSkgewotCQkJCXBhcmVudCA9ICgoSUNvbnRlbnRUeXBlKSBlbGVtZW50KS5nZXRCYXNlVHlwZSgpOwotCQkJfQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBRdWlja1NvcnRlciB0aGF0IHNvcnRzIGFuZCByZXR1cm5zIGEgU3RyaW5nLXR5cGVkIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBTdHJpbmdTb3J0ZXIgZXh0ZW5kcyBTb3J0ZXIgewotCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJcmV0dXJuIChjb2xsYXRvci5jb21wYXJlKGVsZW1lbnRPbmUudG9TdHJpbmcoKSwgZWxlbWVudFR3by50b1N0cmluZygpKSA8IDApOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIHNvcnQoT2JqZWN0W10gdW5Tb3J0ZWRDb2xsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBzb3J0ZWRDb2xsZWN0aW9uID0gc3VwZXIuc29ydCh1blNvcnRlZENvbGxlY3Rpb24pOwotCQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbc29ydGVkQ29sbGVjdGlvbi5sZW5ndGhdOwotCQkJLy8gY29weSB0aGUgYXJyYXkgc28gY2FuIHJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbgotCQkJaWYgKHN0cmluZ3MubGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoc29ydGVkQ29sbGVjdGlvbiwgMCwgc3RyaW5ncywgMCwgc3RyaW5ncy5sZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIHN0cmluZ3M7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1ByZWZlcmVuY2VzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciBmQ29udGVudFR5cGVMaXN0OwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVNYW5hZ2VyIGZDb250ZW50VHlwZU1hbmFnZXIgPSBudWxsOwotCi0JQ29udGVudFR5cGVTb3J0ZXIgZkNvbnRlbnRUeXBlU29ydGVyID0gbmV3IENvbnRlbnRUeXBlU29ydGVyKCk7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGZJZ25vcmVDb250ZW50VHlwZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmT3JpZ2luYWxJZ25vcmVDb250ZW50VHlwZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgZk93bmVyID0gbnVsbDsKLQotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBmU3VwcG9ydGVkQ29udGVudFR5cGVzID0gbnVsbDsKLQotCXB1YmxpYyBFeGNsdXNpb25zVGFiKFRhc2tUYWdQcmVmZXJlbmNlUGFnZSBwYXJlbnQsIElQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlLCBJU2NvcGVDb250ZXh0W10gbG9va3VwT3JkZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyID0gcGFyZW50OwotCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IGxvb2t1cE9yZGVyOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gcHJlZmVyZW5jZXNTZXJ2aWNlOwotCQlmQ29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0KLQkJU3RyaW5nW10gc3VwcG9ydGVkQ29udGVudFR5cGVJRHMgPSBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldFN1cHBvcnRlZENvbnRlbnRUeXBlSWRzKCk7Ci0JCWZTdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KHN1cHBvcnRlZENvbnRlbnRUeXBlSURzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwcG9ydGVkQ29udGVudFR5cGVJRHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShzdXBwb3J0ZWRDb250ZW50VHlwZUlEc1tpXSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5hZGQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gaWdub3JlQ29udGVudFR5cGVzID0gU3RyaW5nVXRpbHMudW5wYWNrKGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsIFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQpLCBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcikpOwotCQlMaXN0IGNvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShpZ25vcmVDb250ZW50VHlwZXNbaV0pOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRUeXBlcy5hZGQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZk9yaWdpbmFsSWdub3JlQ29udGVudFR5cGVzID0gZklnbm9yZUNvbnRlbnRUeXBlcyA9IChJQ29udGVudFR5cGVbXSkgY29udGVudFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVtjb250ZW50VHlwZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCVRleHQgZGVzY3JpcHRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ0V4Y2x1c2lvblRhYl8wMik7Ci0JCWRlc2NyaXB0aW9uLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJZkNvbnRlbnRUeXBlTGlzdCA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb250ZW50VHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheVRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRJbnB1dChmU3VwcG9ydGVkQ29udGVudFR5cGVzLnRvQXJyYXkoKSk7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKGZTdXBwb3J0ZWRDb250ZW50VHlwZXMudG9BcnJheSgpKTsKLQkJZkNvbnRlbnRUeXBlTGlzdC5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZklnbm9yZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkKGZJZ25vcmVDb250ZW50VHlwZXNbaV0sIGZhbHNlKTsKLQkJfQotCi0JCUJ1dHRvbiBzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE3KTsKLQkJc2VsZWN0QWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JCXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmQ29udGVudFR5cGVMaXN0LnNldENoZWNrZWRFbGVtZW50cyhmU3VwcG9ydGVkQ29udGVudFR5cGVzLnRvQXJyYXkoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBzZWxlY3ROb25lID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc2VsZWN0Tm9uZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTgpOwotCQlzZWxlY3ROb25lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JCXNlbGVjdE5vbmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkRWxlbWVudHMobmV3IE9iamVjdFswXSk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0KLQkJVGV4dCBhZmZlY3RlZFR5cGVzTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlhZmZlY3RlZFR5cGVzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQlhZmZlY3RlZFR5cGVzTGFiZWwuc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJYWZmZWN0ZWRUeXBlc0xhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnRXhjbHVzaW9uVGFiXzAzKTsKLQotCQlmaW5hbCBUcmVlVmlld2VyIGNvbnRlbnRUeXBlVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb250ZW50VHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbnRlbnRUeXBlVHJlZVByb3ZpZGVyKCkpOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0SW5wdXQobmV3IE9iamVjdFswXSk7Ci0JCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0KLQkJZkNvbnRlbnRUeXBlTGlzdC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCU9iamVjdFtdIG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQkJCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0SW5wdXQobyk7Ci0JCQkJCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCQkJaWYgKG8ubGVuZ3RoID4gMCkgewotCQkJCQkJY29udGVudFR5cGVUcmVlVmlld2VyLnJldmVhbChvWzBdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnRXhjbHVzaW9uVGFiXzAxOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgZGVmYXVsdHMgaW4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXNbXSBkZWZhdWx0UHJlZmVyZW5jZXMgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlc1tmUHJlZmVyZW5jZXNMb29rdXBPcmRlci5sZW5ndGggLSAxXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBkZWZhdWx0UHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlZmF1bHRQcmVmZXJlbmNlc1tpIC0gMV0gPSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcltpXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJfQotCQlTdHJpbmdbXSBkZWZhdWx0SWdub3JlVHlwZXMgPSBTdHJpbmdVdGlscy51bnBhY2soZlByZWZlcmVuY2VzU2VydmljZS5nZXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVELCBudWxsLCBkZWZhdWx0UHJlZmVyZW5jZXMpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3QgY29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRJZ25vcmVUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBmQ29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGRlZmF1bHRJZ25vcmVUeXBlc1tpXSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJY29udGVudFR5cGVzLmFkZCh0eXBlKTsKLQkJCX0KLQkJfQotCQlmSWdub3JlQ29udGVudFR5cGVzID0gKElDb250ZW50VHlwZVtdKSBjb250ZW50VHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW2NvbnRlbnRUeXBlcy5zaXplKCldKTsKLQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkRWxlbWVudHMoZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRBbGxDb250ZW50VHlwZXMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZklnbm9yZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkKGZJZ25vcmVDb250ZW50VHlwZXNbaV0sIGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJTGlzdCBpZ25vcmVkSWRzID0gc2F2ZSgpOwotCQlTdHJpbmdbXSBpZ25vcmVJRHMgPSAoU3RyaW5nW10pIG5ldyBTdHJpbmdTb3J0ZXIoKS5zb3J0KGlnbm9yZWRJZHMudG9BcnJheSgpKTsKLQkJZklnbm9yZUNvbnRlbnRUeXBlcyA9IG5ldyBJQ29udGVudFR5cGVbaWdub3JlSURzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmSWdub3JlQ29udGVudFR5cGVzW2ldID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShpZ25vcmVJRHNbaV0pOwotCQl9Ci0KLQkJaWYgKCFBcnJheXMuZXF1YWxzKGZPcmlnaW5hbElnbm9yZUNvbnRlbnRUeXBlcywgZklnbm9yZUNvbnRlbnRUeXBlcykpIHsKLQkJCWZPd25lci5yZXF1ZXN0UmVkZXRlY3Rpb24oKTsKLQkJfQotCQlmT3JpZ2luYWxJZ25vcmVDb250ZW50VHlwZXMgPSBmSWdub3JlQ29udGVudFR5cGVzOwotCX0KLQotCXByaXZhdGUgTGlzdCBzYXZlKCkgewotCQlMaXN0IGlnbm9yZWRJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgY2hlY2tlZCA9IEFycmF5cy5hc0xpc3QoZkNvbnRlbnRUeXBlTGlzdC5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFjaGVja2VkLmNvbnRhaW5zKGZTdXBwb3J0ZWRDb250ZW50VHlwZXMuZ2V0KGkpKSkgewotCQkJCWlnbm9yZWRJZHMuYWRkKCgoSUNvbnRlbnRUeXBlKSBmU3VwcG9ydGVkQ29udGVudFR5cGVzLmdldChpKSkuZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0KLQkJSUVjbGlwc2VQcmVmZXJlbmNlc1tdIGRlZmF1bHRQcmVmZXJlbmNlcyA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzW2ZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyLmxlbmd0aCAtIDFdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGRlZmF1bHRQcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJZGVmYXVsdFByZWZlcmVuY2VzW2kgLSAxXSA9IGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyW2ldLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpOwotCQl9Ci0KLQkJU3RyaW5nIGRlZmF1bHRJZ25vcmVkQ29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy5wYWNrKChTdHJpbmdbXSkgbmV3IFN0cmluZ1NvcnRlcigpLnNvcnQoU3RyaW5nVXRpbHMudW5wYWNrKGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgIiIsIGRlZmF1bHRQcmVmZXJlbmNlcykpKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGlnbm9yZWRDb250ZW50VHlwZUlkcyA9IFN0cmluZ1V0aWxzLnBhY2soKFN0cmluZ1tdKSBuZXcgU3RyaW5nU29ydGVyKCkuc29ydChpZ25vcmVkSWRzLnRvQXJyYXkoKSkpOwotCQlpZiAoaWdub3JlZENvbnRlbnRUeXBlSWRzLmVxdWFscyhkZWZhdWx0SWdub3JlZENvbnRlbnRUeXBlSWRzKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVEICsgIiBmcm9tIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCArICIgXCIiICsgaWdub3JlZENvbnRlbnRUeXBlSWRzICsgIlwiIGluIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgaWdub3JlZENvbnRlbnRUeXBlSWRzKTsKLQkJfQotCQlyZXR1cm4gaWdub3JlZElkczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvTWFpblRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL01haW5UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0NTY1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvTWFpblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLlRhc2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1jbGFzcyBNYWluVGFiIGltcGxlbWVudHMgSVByZWZlcmVuY2VUYWIgewotCXB1YmxpYyBjbGFzcyBUYXNrVGFnRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkJcHVibGljIFRhc2tUYWcgdGFza1RhZyA9IG51bGw7Ci0KLQkJQ29tYm8gcHJpb3JpdHlDb21ibyA9IG51bGw7Ci0JCVRleHQgdGFnVGV4dCA9IG51bGw7Ci0KLQkJcHVibGljIFRhc2tUYWdEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQkJbmV3U2hlbGwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0YXNrVGFnID09IG51bGwgfHwgdGFza1RhZy5nZXRUYWcoKS5sZW5ndGgoKSA+IDApOwotCQkJcmV0dXJuIGM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC8gNTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzYpOyAvLyROT04tTkxTLTEkCi0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCXRhZ1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCXRhZ1RleHQuc2V0VGV4dCh0YXNrVGFnICE9IG51bGwgPyB0YXNrVGFnLmdldFRhZygpIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQl0YWdUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJdGFnVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyB0ZXN0VGFnID0gdGFnVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCVN0cmluZ1tdIHRhZ3MgPSBuZXcgU3RyaW5nW2ZUYXNrVGFncy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRhZ3NbaV0gPSBmVGFza1RhZ3NbaV0uZ2V0VGFnKCk7Ci0JCQkJCX0KLQkJCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodGFnVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwICYmICFBcnJheXMuYXNMaXN0KHRhZ3MpLmNvbnRhaW5zKHRlc3RUYWcpKTsKLQkJCQkJdGFza1RhZyA9IG5ldyBUYXNrVGFnKHRhZ1RleHQuZ2V0VGV4dCgpLCBwcmlvcml0eUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl83KTsgLy8kTk9OLU5MUy0xJAotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQlwcmlvcml0eUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUpOwotCQkJcHJpb3JpdHlDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW117U1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8wLCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzEsIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMn0pOwotCQkJcHJpb3JpdHlDb21iby5zZWxlY3QodGFza1RhZyAhPSBudWxsID8gdGFza1RhZy5nZXRQcmlvcml0eSgpIDogVGFza1RhZy5QUklPUklUWV9OT1JNQUwpOwotCQkJcHJpb3JpdHlDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXByaW9yaXR5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0YXNrVGFnID0gbmV3IFRhc2tUYWcodGFza1RhZy5nZXRUYWcoKSwgcHJpb3JpdHlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCQl0YXNrVGFnID0gbmV3IFRhc2tUYWcodGFnVGV4dC5nZXRUZXh0KCksIHByaW9yaXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBUYXNrVGFnVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgVGFza1RhZ1RhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYgKGNvbHVtbkluZGV4IDwgMSkKLQkJCQlyZXR1cm4gKChUYXNrVGFnKSBlbGVtZW50KS5nZXRUYWcoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZUYXNrVGFnc1tpXS5lcXVhbHMoZWxlbWVudCkpIHsKLQkJCQkJaWYgKGZUYXNrVGFnc1tpXS5nZXRQcmlvcml0eSgpID09IElNYXJrZXIuUFJJT1JJVFlfTE9XKSB7Ci0JCQkJCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8wOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZlRhc2tUYWdzW2ldLmdldFByaW9yaXR5KCkgPT0gSU1hcmtlci5QUklPUklUWV9ISUdIKSB7Ci0JCQkJCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8zOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1ByZWZlcmVuY2VzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIENvbnRyb2wgZkNvbnRyb2w7Ci0KLQlwcml2YXRlIFRhc2tUYWdbXSBmT3JpZ2luYWxUYXNrVGFnczsKLQlwcml2YXRlIFRhc2tUYWdQcmVmZXJlbmNlUGFnZSBmT3duZXIgPSBudWxsOwotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQotCXByaXZhdGUgVGFza1RhZ1tdIGZUYXNrVGFnczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmFsdWVUYWJsZSA9IG51bGw7Ci0KLQotCXB1YmxpYyBNYWluVGFiKFRhc2tUYWdQcmVmZXJlbmNlUGFnZSBwYXJlbnQsIElQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlLCBJU2NvcGVDb250ZXh0W10gbG9va3VwT3JkZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyID0gcGFyZW50OwotCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IGxvb2t1cE9yZGVyOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gcHJlZmVyZW5jZXNTZXJ2aWNlOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRhZygpIHsKLQkJVGFza1RhZ0RpYWxvZyBkbGcgPSBuZXcgVGFza1RhZ0RpYWxvZyhmQ29udHJvbC5nZXRTaGVsbCgpKTsKLQkJaW50IHJlc3VsdCA9IGRsZy5vcGVuKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQlUYXNrVGFnIG5ld1RhZyA9IGRsZy50YXNrVGFnOwotCQkJTGlzdCBuZXdUYWdzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYXNrVGFncykpOwotCQkJbmV3VGFncy5hZGQobmV3VGFnKTsKLQkJCWZUYXNrVGFncyA9IChUYXNrVGFnW10pIG5ld1RhZ3MudG9BcnJheShuZXcgVGFza1RhZ1tuZXdUYWdzLnNpemUoKV0pOwotCQkJdmFsdWVUYWJsZS5zZXRJbnB1dChmVGFza1RhZ3MpOwotCQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihmVGFza1RhZ3MubGVuZ3RoIC0gMSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgdGFiRm9sZGVyKSB7Ci0JCWxvYWRQcmVmZXJlbmNlVmFsdWVzKCk7Ci0JCWZPcmlnaW5hbFRhc2tUYWdzID0gZlRhc2tUYWdzOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWZDb250cm9sID0gY29tcG9zaXRlOwotCi0JCVRleHQgZGVzY3JpcHRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbi5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDQwMwotCQlQb2ludCBzaXplSGludCA9IGRlc2NyaXB0aW9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWdkLndpZHRoSGludCA9IHNpemVIaW50Lng7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QpOwotCi0JCXZhbHVlVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXZhbHVlVGFibGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlUYWJsZUNvbHVtbiB0ZXh0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHZhbHVlVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUsIDApOwotCQl0ZXh0Q29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xMik7IC8vJE5PTi1OTFMtMSQKLQkJVGFibGVDb2x1bW4gcHJpb3JpdHlDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odmFsdWVUYWJsZS5nZXRUYWJsZSgpLCBTV1QuTk9ORSwgMSk7Ci0JCXByaW9yaXR5Q29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xMyk7IC8vJE5PTi1OTFMtMSQKLQkJdmFsdWVUYWJsZS5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQl2YWx1ZVRhYmxlLnNldExhYmVsUHJvdmlkZXIobmV3IFRhc2tUYWdUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSwgMTQwLCB0cnVlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25zLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0KLQkJZmluYWwgQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlhZGRCdXR0b24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE0KTsgLy8kTk9OLU5MUy0xJAotCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWZpbmFsIEJ1dHRvbiBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE1KTsgLy8kTk9OLU5MUy0xJAotCQllZGl0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlmaW5hbCBCdXR0b24gcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTYpOyAvLyROT04tTkxTLTEkCi0JCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJTGFiZWwgd2FybmluZyA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJd2FybmluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJd2FybmluZy5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTkpOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkRm9yU2VsZWN0aW9uID0gIXZhbHVlVGFibGUuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpOwotCQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkRm9yU2VsZWN0aW9uKTsKLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkRm9yU2VsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQkJdmFsdWVUYWJsZS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRUYWcoKTsKLQkJCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKGZUYXNrVGFncy5sZW5ndGggLSAxKTsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJCX0KLQkJfSk7Ci0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IGkgPSB2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQllZGl0VGFnKGkpOwotCQkJCWlmIChpID49IDApIHsKLQkJCQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihpKTsKLQkJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpID0gdmFsdWVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJcmVtb3ZlVGFnKHZhbHVlVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQlpZiAoaSA+PSAwICYmIGkgPCBmVGFza1RhZ3MubGVuZ3RoKSB7Ci0JCQkJCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdmFsdWVUYWJsZS5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgaSA9IHZhbHVlVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWVkaXRUYWcoaSk7Ci0JCQkJaWYgKGkgPj0gMCkgewotCQkJCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKGkpOwotCQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZhbHVlVGFibGUuc2V0SW5wdXQoZlRhc2tUYWdzKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdFRhZyhpbnQgaSkgewotCQlpZiAoaSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZWxlY3Rpb24gPSB2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJVGFza1RhZ0RpYWxvZyBkbGcgPSBuZXcgVGFza1RhZ0RpYWxvZyhmQ29udHJvbC5nZXRTaGVsbCgpKTsKLQkJZGxnLnRhc2tUYWcgPSBmVGFza1RhZ3Nbc2VsZWN0aW9uXTsKLQkJaW50IHJlc3VsdCA9IGRsZy5vcGVuKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQlmVGFza1RhZ3Nbc2VsZWN0aW9uXSA9IGRsZy50YXNrVGFnOwotCQkJdmFsdWVUYWJsZS5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFByZWZlcmVuY2VWYWx1ZXMoKSB7Ci0JCVN0cmluZyB0YWdzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCAiIiwgZlByZWZlcmVuY2VzTG9va3VwT3JkZXIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwcmlvcml0aWVzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCAiIiwgZlByZWZlcmVuY2VzTG9va3VwT3JkZXIpOyAvLyROT04tTkxTLTEkCi0JCWxvYWRUYWdzQW5kUHJpb3JpdGllc0Zyb20odGFncywgcHJpb3JpdGllcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhZ3MKLQkgKiBAcGFyYW0gcHJpb3JpdGllcwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkVGFnc0FuZFByaW9yaXRpZXNGcm9tKFN0cmluZyB0YWdTdHJpbmcsIFN0cmluZyBwcmlvcml0eVN0cmluZykgewotCQlTdHJpbmdbXSB0YWdzID0gU3RyaW5nVXRpbHMudW5wYWNrKHRhZ1N0cmluZyk7Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmlvcml0eVN0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlJbnRlZ2VyIG51bWJlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW51bWJlciA9IEludGVnZXIudmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQludW1iZXIgPSBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX05PUk1BTCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChudW1iZXIpOwotCQl9Ci0JCUludGVnZXJbXSBwcmlvcml0aWVzID0gKEludGVnZXJbXSkgbGlzdC50b0FycmF5KG5ldyBJbnRlZ2VyWzBdKTsKLQotCQlmVGFza1RhZ3MgPSBuZXcgVGFza1RhZ1tNYXRoLm1pbih0YWdzLmxlbmd0aCwgcHJpb3JpdGllcy5sZW5ndGgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWZUYXNrVGFnc1tpXSA9IG5ldyBUYXNrVGFnKHRhZ3NbaV0sIHByaW9yaXRpZXNbaV0uaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXNhdmUoKTsKLQotCQlpZiAoIUFycmF5cy5lcXVhbHMoZk9yaWdpbmFsVGFza1RhZ3MsIGZUYXNrVGFncykpIHsKLQkJCWZPd25lci5yZXF1ZXN0UmVkZXRlY3Rpb24oKTsKLQkJfQotCQlmT3JpZ2luYWxUYXNrVGFncyA9IGZUYXNrVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGRlZmF1bHRzIGluICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRWNsaXBzZVByZWZlcmVuY2VzW10gcHJlZmVyZW5jZXMgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlc1tmUHJlZmVyZW5jZXNMb29rdXBPcmRlci5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcmVmZXJlbmNlc1tpXSA9IGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyW2ldLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpOwotCQl9Ci0JCVN0cmluZyB0YWdzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MsIG51bGwsIHByZWZlcmVuY2VzKTsKLQkJU3RyaW5nIHByaW9yaXRpZXMgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgbnVsbCwgcHJlZmVyZW5jZXMpOwotCQlsb2FkVGFnc0FuZFByaW9yaXRpZXNGcm9tKHRhZ3MsIHByaW9yaXRpZXMpOwotCQlpbnQgc2VsZWN0aW9uID0gdmFsdWVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXZhbHVlVGFibGUuc2V0SW5wdXQoZlRhc2tUYWdzKTsKLQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJcGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVUYWcoaW50IGkpIHsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCB0YXNrVGFncyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFza1RhZ3MpKTsKLQkJdGFza1RhZ3MucmVtb3ZlKGkpOwotCQlmVGFza1RhZ3MgPSAoVGFza1RhZ1tdKSB0YXNrVGFncy50b0FycmF5KG5ldyBUYXNrVGFnW3Rhc2tUYWdzLnNpemUoKV0pOwotCQl2YWx1ZVRhYmxlLnNldElucHV0KGZUYXNrVGFncyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdFByZWZlcmVuY2VzID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpOwotCQlTdHJpbmcgZGVmYXVsdFRhZ3MgPSBkZWZhdWx0UHJlZmVyZW5jZXMuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCBudWxsKTsKLQkJU3RyaW5nIGRlZmF1bHRQcmlvcml0aWVzID0gZGVmYXVsdFByZWZlcmVuY2VzLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgbnVsbCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmLmFwcGVuZChmVGFza1RhZ3NbaV0uZ2V0VGFnKCkpOwotCQl9Ci0JCVN0cmluZyBjdXJyZW50VGFncyA9IGJ1Zi50b1N0cmluZygpOwotCQlpZiAoY3VycmVudFRhZ3MuZXF1YWxzKGRlZmF1bHRUYWdzKSAmJiAhZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpLmVxdWFscyhEZWZhdWx0U2NvcGUuU0NPUEUpKSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyArICIgZnJvbSBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmT3duZXIucmVxdWVzdFJlZGV0ZWN0aW9uKCk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTICsgIiBcIiIgKyBjdXJyZW50VGFncyArICJcIiBpbiBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgY3VycmVudFRhZ3MpOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZjIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlidWYyLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWYyLmFwcGVuZChTdHJpbmcudmFsdWVPZihmVGFza1RhZ3NbaV0uZ2V0UHJpb3JpdHkoKSkpOwotCQl9Ci0JCVN0cmluZyBwcmlvcml0aWVzID0gYnVmMi50b1N0cmluZygpOwotCi0JCWlmIChwcmlvcml0aWVzLmVxdWFscyhkZWZhdWx0UHJpb3JpdGllcykgJiYgIWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKS5lcXVhbHMoRGVmYXVsdFNjb3BlLlNDT1BFKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMgKyAiIGZyb20gc2NvcGUgIiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKSArICI6IiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMpOwotCQl9Ci0JCWVsc2UgewotCQkJZk93bmVyLnJlcXVlc3RSZWRldGVjdGlvbigpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUyArICIgXCIiICsgcHJpb3JpdGllcyArICJcIiBpbiBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgcHJpb3JpdGllcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MDk1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3ByZWZlcmVuY2VzLXByb3BlcnRpZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qCi0JICogRGlzYWJsZSBsaW5rIGRhdGEsIHByZXZlbnRzIHRoZSBkaXNwbGF5IG9mIGEgIndvcmtzcGFjZSIgb3IgInByb2plY3QiCi0JICogc2V0dGluZ3MgbGluayB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBkaWFsb2cgbGF1bmNoaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IERJU0FCTEVfTElOSyA9ICJESVNBQkxFX0xJTksiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBmRGF0YSA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmRW5hYmxlUHJvamVjdFNldHRpbmdzOwotCi0JcHJpdmF0ZSBMaW5rIGZQcm9qZWN0U2V0dGluZ3NMaW5rOwotCi0JcHVibGljIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHlEYXRhKE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyLmFwcGx5RGF0YShkYXRhKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHsKLQkJCWZEYXRhID0gKE1hcCkgZGF0YTsKLQkJCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgY29tcG9zaXRlKTsKLQotCXB1YmxpYyBmaW5hbCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNoZWNrTGlua0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY2hlY2tMaW5rQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncyA9IG5ldyBCdXR0b24oY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuRW5hYmxlUHJvamVjdFNldHRpbmdzKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlib29sZWFuIGVuYWJsZWRGb3JQcm9qZWN0ID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZ2V0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZmFsc2UpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRTZWxlY3Rpb24oZW5hYmxlZEZvclByb2plY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCXNwYWNlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCi0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rID0gbmV3IExpbmsoY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyoKLQkJICogImVsZW1lbnQiIHNob3VsZCBiZSBhIHByb2plY3QsIGlmIG51bGwsIGxpbmsgdG8gcGVyLXByb2plY3QKLQkJICogcHJvcGVydGllcwotCQkgKi8KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRUZXh0KCI8YT4iICsgU1NFVUlNZXNzYWdlcy5Db25maWd1cmVXb3Jrc3BhY2VTZXR0aW5ncyArICI8L2E+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRUZXh0KCI8YT4iICsgU1NFVUlNZXNzYWdlcy5Db25maWd1cmVQcm9qZWN0U2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJdXBkYXRlTGlua0VuYWJsZW1lbnQoKTsKLQotCQlmUHJvamVjdFNldHRpbmdzTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQkJCW9wZW5Qcm9qZWN0U2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW9wZW5Xb3Jrc3BhY2VTZXR0aW5ncygpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQkJbGluZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJfQotCi0JCWZpbmFsIENvbnRyb2wgY29tbW9uID0gY3JlYXRlQ29tbW9uQ29udGVudHMoY29tcG9zaXRlKTsKLQkJY29tbW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWlmIChmRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwpIHsKLQkJCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUNvbnRyb2xFbmFibGVTdGF0ZSBlbmFibGVtZW50cyA9IG51bGw7Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCQlpZiAoZkVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJaWYgKGVuYWJsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCQllbmFibGVtZW50cy5yZXN0b3JlKCk7Ci0JCQkJCQkJZW5hYmxlbWVudHMgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZW5hYmxlbWVudHMgPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShjb21tb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXNlbGVjdGlvbkFkYXB0ZXIud2lkZ2V0U2VsZWN0ZWQobnVsbCk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkFkYXB0ZXIpOwotCQl9Ci0JCQotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQl9Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVNjb3BlQ29udGV4dFtdIGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBQcm9qZWN0U2NvcGUocHJvamVjdCksIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCX0KLQkJcmV0dXJuIG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKTsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiAoSVByb2plY3QpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkgewotCQlyZXR1cm4gZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsICYmIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0Jdm9pZCBvcGVuUHJvamVjdFNldHRpbmdzKCkgewotCQlMaXN0RGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0RGlhbG9nKGdldFNoZWxsKCkpIHsKLQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJQ29udHJvbCBhcmVhID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQkJCWdldFRhYmxlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0JCQkJcmV0dXJuIGFyZWE7Ci0JCQl9Ci0JCX07Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFNTRVVJTWVzc2FnZXMuUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMik7Ci0JCWRpYWxvZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJV29ya3NwYWNlKSBpbnB1dEVsZW1lbnQpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDEpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChyZXN1bHQubGVuZ3RoID4gMCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIHByb2plY3QsIGdldFByb3BlcnR5UGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcm9wZXJ0eVBhZ2VJRCgpfSwgZGF0YSkub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBvcGVuV29ya3NwYWNlU2V0dGluZ3MoKSB7Ci0JCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlSUQoKSwgbmV3IFN0cmluZ1tde2dldFByZWZlcmVuY2VQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJaWYgKGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCQl9Ci0JCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgZnJvbSBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTGlua0VuYWJsZW1lbnQoKSB7Ci0JCWlmIChmRGF0YSAhPSBudWxsICYmIGZQcm9qZWN0U2V0dGluZ3NMaW5rICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldEVuYWJsZWQoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZkRhdGEuZ2V0KERJU0FCTEVfTElOSykpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UYXNrVGFnUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UYXNrVGFnUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwNWNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGFza1RhZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrU2Nhbm5pbmdTY2hlZHVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5UYWJGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3ByZWZlcmVuY2VzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLyBSZW1lbWJlciB0aGUgbGFzdCBkaXNwbGF5ZWQgdGFiIGZvciBjb252ZW5pZW5jZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19MQVNUX1RBQiA9ICJ0YXNrLXRhZy1sYXN0LXRhYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGRldGVjdGlvblJlcXVlc3RlZCA9IDA7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmRW5hYmxlQ2hlY2tib3ggPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmFibGVUYXNrVGFncyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZk9yaWdpbmFsRW5hYmxlVGFza1RhZ3MgPSB0cnVlOwotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZlJlZGV0ZWN0QnV0dG9uOwotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmVGFiRW5hYmxlbWVudExpc3RlbmVyOwotCi0JcHJpdmF0ZSBUYWJGb2xkZXIgZlRhYkZvbGRlcjsKLQlwcml2YXRlIElQcmVmZXJlbmNlVGFiW10gZlRhYnMgPSBudWxsOwotCi0JcHVibGljIFRhc2tUYWdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyArPSAyOwotCQkJZlJlZGV0ZWN0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJCWZSZWRldGVjdEJ1dHRvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VQYWdlXzMyKTsgLy8kTk9OLU5MUy0xJAotCQkJZlJlZGV0ZWN0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkJZlJlZGV0ZWN0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmUmVkZXRlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlKb2IgcmVkZXRlY3RKb2IgPSBuZXcgSm9iKFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjcpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQotCQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5yZWZyZXNoKCk7Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZGV0ZWN0Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlMYWJlbCBzcGFjZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQkJfQotCQlzdXBlci5jb250cmlidXRlQnV0dG9ucyhwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbW1vbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgY29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQljb21wb3NpdGVMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGNvbXBvc2l0ZUxheW91dCk7Ci0KLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWZPcmlnaW5hbEVuYWJsZVRhc2tUYWdzID0gZkVuYWJsZVRhc2tUYWdzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRCb29sZWFuKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCksIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlLCBwcmVmZXJlbmNlU2NvcGVzKTsKLQkJZkVuYWJsZUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZFbmFibGVDaGVja2JveC5zZXRTZWxlY3Rpb24oZkVuYWJsZVRhc2tUYWdzKTsKLQkJZkVuYWJsZUNoZWNrYm94LnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMSk7IC8vJE5PTi1OTFMtMSQKLQkJZkVuYWJsZUNoZWNrYm94LnNldFNlbGVjdGlvbihmRW5hYmxlVGFza1RhZ3MpOwotCQlmRW5hYmxlQ2hlY2tib3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcsIEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0KLQkJZlRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZUYWJGb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7Ci0JCWZUYWJGb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0KLQkJVGFiSXRlbSB0YXNrSXRlbSA9IG5ldyBUYWJJdGVtKGZUYWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJTWFpblRhYiBtYWluVGFiID0gbmV3IE1haW5UYWIodGhpcywgZlByZWZlcmVuY2VzU2VydmljZSwgcHJlZmVyZW5jZVNjb3Blcyk7Ci0JCXRhc2tJdGVtLnNldFRleHQobWFpblRhYi5nZXRUaXRsZSgpKTsKLQkJZmluYWwgQ29udHJvbCB0YXNrVGFnc0NvbnRyb2wgPSBtYWluVGFiLmNyZWF0ZUNvbnRlbnRzKGZUYWJGb2xkZXIpOwotCQl0YXNrSXRlbS5zZXRDb250cm9sKHRhc2tUYWdzQ29udHJvbCk7Ci0KLQkJVGFiSXRlbSBleGNsdXNpb25JdGVtID0gbmV3IFRhYkl0ZW0oZlRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlFeGNsdXNpb25zVGFiIGV4Y2x1c2lvbnNUYWIgPSBuZXcgRXhjbHVzaW9uc1RhYih0aGlzLCBmUHJlZmVyZW5jZXNTZXJ2aWNlLCBwcmVmZXJlbmNlU2NvcGVzKTsKLQkJZXhjbHVzaW9uSXRlbS5zZXRUZXh0KGV4Y2x1c2lvbnNUYWIuZ2V0VGl0bGUoKSk7Ci0JCWZpbmFsIENvbnRyb2wgZXhjbHVzaW9uQ29udHJvbCA9IGV4Y2x1c2lvbnNUYWIuY3JlYXRlQ29udGVudHMoZlRhYkZvbGRlcik7Ci0JCWV4Y2x1c2lvbkl0ZW0uc2V0Q29udHJvbChleGNsdXNpb25Db250cm9sKTsKLQotCQlmVGFicyA9IG5ldyBJUHJlZmVyZW5jZVRhYltde21haW5UYWIsIGV4Y2x1c2lvbnNUYWJ9OwotCi0JCWZUYWJFbmFibGVtZW50TGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUNvbnRyb2xFbmFibGVTdGF0ZVtdIGxhc3RFbmFibGVTdGF0ZXMgPSBudWxsOwotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZkVuYWJsZVRhc2tUYWdzID0gZkVuYWJsZUNoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChmRW5hYmxlVGFza1RhZ3MpIHsKLQkJCQkJaWYgKGxhc3RFbmFibGVTdGF0ZXMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXN0RW5hYmxlU3RhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKGxhc3RFbmFibGVTdGF0ZXNbaV0gIT0gbnVsbCkgewotCQkJCQkJCQlsYXN0RW5hYmxlU3RhdGVzW2ldLnJlc3RvcmUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0RW5hYmxlU3RhdGVzID0gbnVsbDsKLQkJCQkJCWZUYWJGb2xkZXIucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGFzdEVuYWJsZVN0YXRlcyA9PSBudWxsKSB7Ci0JCQkJCWxhc3RFbmFibGVTdGF0ZXMgPSBuZXcgQ29udHJvbEVuYWJsZVN0YXRlW2ZUYWJzLmxlbmd0aCArIDFdOwotCQkJCQlsYXN0RW5hYmxlU3RhdGVzWzBdID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUodGFza1RhZ3NDb250cm9sKTsKLQkJCQkJbGFzdEVuYWJsZVN0YXRlc1sxXSA9IENvbnRyb2xFbmFibGVTdGF0ZS5kaXNhYmxlKGV4Y2x1c2lvbkNvbnRyb2wpOwotCQkJCQlpZiAoZlJlZGV0ZWN0QnV0dG9uICE9IG51bGwpIHsKLQkJCQkJCWxhc3RFbmFibGVTdGF0ZXNbMl0gPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShmUmVkZXRlY3RCdXR0b24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlmVGFiRW5hYmxlbWVudExpc3RlbmVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQlmRW5hYmxlQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIoZlRhYkVuYWJsZW1lbnRMaXN0ZW5lcik7Ci0KLQkJLy8gcmVzdG9yZSBsYXN0IHNlbGVjdGVkIHRhYgotCQlpbnQgYWN0aXZlVGFiID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZ2V0SW50KFRBU0tfVEFHX0xBU1RfVEFCLCAwKTsKLQkJaWYgKGFjdGl2ZVRhYiA+IDApIHsKLQkJCWZUYWJGb2xkZXIuc2V0U2VsZWN0aW9uKGFjdGl2ZVRhYik7Ci0JCX0KLQotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRldFQlhfVEFTS1RBR1NfSEVMUElEKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkgewotCQlyZXR1cm4gVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudGFza3RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgewotCQlyZXR1cm4gVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcm9qZWN0LnByb3BlcnRpZXMudGFza3RhZ3MiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXN1cGVyLnBlcmZvcm1BcHBseSgpOwotCQlzYXZlKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybUFwcGx5KCk7Ci0JCX0KLQotCQlwcm9tcHRGb3JSZWRldGVjdElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0UHJlZmVyZW5jZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKClbMV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJZkVuYWJsZVRhc2tUYWdzID0gZGVmYXVsdFByZWZlcmVuY2VzLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQlmRW5hYmxlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZFbmFibGVUYXNrVGFncyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JCWZUYWJFbmFibGVtZW50TGlzdGVuZXIud2lkZ2V0U2VsZWN0ZWQobnVsbCk7Ci0JCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGRlZmF1bHRzIGluICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlzYXZlKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybU9rKCk7Ci0JCX0KLQotCQlwcm9tcHRGb3JSZWRldGVjdElmTmVjZXNzYXJ5KCk7Ci0KLQkJLy8gc2F2ZSBsYXN0IHRhYiAodXNlIERlZmF1bHQgc2NvcGUgc2luY2UgaXQgd29uJ3QgYmUgcGVyc2lzdGVkKQotCQluZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRJbnQoVEFTS19UQUdfTEFTVF9UQUIsIGZUYWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQkJSVNjb3BlQ29udGV4dFtdIGNvbnRleHRzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQkvLyByZW1vdmUgcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpZiBpdCdzIG5vdCBlbmFibGVkCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIGNvbnRleHRzWzBdLmdldE5hbWUoKSArICI6IiArIGNvbnRleHRzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUyk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIGNvbnRleHRzWzBdLmdldE5hbWUoKSArICI6IiArIGNvbnRleHRzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTKTsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRleHRzW2ldLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZmx1c2goKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gc2F2aW5nIHByZWZlcmVuY2Ugc2V0dGluZ3MgdG8gc2NvcGUgIiArIGNvbnRleHRzW2ldLmdldE5hbWUoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvazsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBwcm9tcHRGb3JSZWRldGVjdElmTmVjZXNzYXJ5KCkgewotCQlpZiAoZGV0ZWN0aW9uUmVxdWVzdGVkID4gMCkgewotCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjIsIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXRJbWFnZSgpLCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzIzLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW117U1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNCwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNSwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNn0sIDIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWludCBidXR0b24gPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKGJ1dHRvbiA9PSAwKSB7Ci0JCQkJSm9iIHJlZGV0ZWN0Sm9iID0gbmV3IEpvYihTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzI3KSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IHJlc2Nhbm5pbmcgYWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiByZXNjYW5uaW5nICIgKyBnZXRQcm9qZWN0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5yZWZyZXNoKGdldFByb2plY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJcmVkZXRlY3RKb2Iuc2NoZWR1bGUoNTAwKTsKLQkJCX0KLQkJCWRldGVjdGlvblJlcXVlc3RlZCA9IDA7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlcXVlc3RSZWRldGVjdGlvbigpIHsKLQkJZGV0ZWN0aW9uUmVxdWVzdGVkKys7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCWlmIChmRW5hYmxlVGFza1RhZ3MgIT0gZk9yaWdpbmFsRW5hYmxlVGFza1RhZ3MpIHsKLQkJCXJlcXVlc3RSZWRldGVjdGlvbigpOwotCQl9Ci0JCWZPcmlnaW5hbEVuYWJsZVRhc2tUYWdzID0gZkVuYWJsZVRhc2tUYWdzOwotCi0JCUlTY29wZUNvbnRleHRbXSBwcmVmZXJlbmNlU2NvcGVzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGRlZmF1bHRQcmVmZXJlbmNlcyA9IHByZWZlcmVuY2VTY29wZXNbMV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJYm9vbGVhbiBkZWZhdWx0RW5hYmxlID0gZGVmYXVsdFByZWZlcmVuY2VzLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQlpZiAoZkVuYWJsZVRhc2tUYWdzID09IGRlZmF1bHRFbmFibGUpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUgKyAiIFwiIiArIGZFbmFibGVUYXNrVGFncyArICJcIiBpbiBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmRW5hYmxlVGFza1RhZ3MpOwotCQl9Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJfQotCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNULCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgZnJvbSBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0Um9vdE5vZGUoKS5mbHVzaCgpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGl0LCB0aGVyZSBpcyBubyByZWNvdmVyeQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9FZGl0b3JFeGVjdXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRWRpdG9yRXhlY3V0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODhhMjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9FZGl0b3JFeGVjdXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSUV4ZWN1dGlvbkRlbGVnYXRlOwotCi0KLQotY2xhc3MgRWRpdG9yRXhlY3V0aW9uQ29udGV4dCBpbXBsZW1lbnRzIElFeGVjdXRpb25EZWxlZ2F0ZSB7Ci0KLQotCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGZFZGl0b3I7Ci0KLQlwdWJsaWMgRWRpdG9yRXhlY3V0aW9uQ29udGV4dChTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoKTsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRXhlY3V0aW9uRGVsZWdhdGUjZXhlY3V0ZShqYXZhLmxhbmcuUnVubmFibGUpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHdvcmtiZW5jaC5nZXREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCS8vIGlmIGFscmVhZHkgaW4gZGlzcGxheSB0aHJlYWQsIHdlIGNhbiBzaW1wbHkgcnVuLCAiYXMgdXN1YWwiCi0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHRoaXMgaXMgdGhlIHBhcnQgdGhhdCdzIHJlYWxseSBuZXcsIHRoYXQKLQkJCS8vIGFjY29taWRhdGUncyBhIGNoYW5nZSBpbiBhIGRvY3VtZW50Ci0JCQkvLyBmcm9tIGJhY2tncm91bmQgdGhyZWFkLCBieSBmb3JjaW5nIGl0IG9uCi0JCQkvLyB0aGUgZGlzcGxheSB0aHJlYWQuCi0JCQlmaW5hbCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlZGl0b3IgPSBmRWRpdG9yOwotCQkJLy8gaWYgbm90IGluIGRpc3BsYXkgdGhyZWFkLCB3ZSAiZm9yY2UiIHRvIHJ1biBvbiBkaXNwbGF5IHRocmVhZC4KLQkJCS8vIHNlZSBlZGl0b3JzIGJlZ2luL2VuZCBiYWNrZ3JvdW5kIGpvYiBmb3Igb3RoZXIKLQkJCS8vIGFjdGl2aXRpZXMgdG8gYmVzdCBhY2NvbWlkYXRlIChmb3IgZXhhbXBsZSwgdGhlcmUKLQkJCS8vIGlzIGEgInRpbWVkIGRlbGF5IiBiZWZvcmUgdGhlIGVkaXRvciBpdHNlbGYgbGVhdmVzCi0JCQkvLyBiYWNrZ3JvdW5kLXVwZGF0ZSBtb2RlKS4KLQkJCS8vIE5PVEU6IHRoaXMgZXhlY3V0ZSBtZXRob2QgaXRzZWxmIGlzIGFsd2F5cyBjYWxsZWQgZnJvbQotCQkJLy8gaW5zaWRlIG9mIGFuIElMb2NrIGJsb2NrLCBzbyBhbm90aGVyCi0JCQkvLyBibG9jayBpcyBub3Qgbm90IG5lZWRlZCBoZXJlIGZvciBhbGwgdGhlc2Ugc3ljbkV4ZWMncwotCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQkJZWRpdG9yLmJlZ2luQmFja2dyb3VuZE9wZXJhdGlvbigpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBoZXJlJ3Mgd2hlcmUgdGhlIGRvY3VtZW50IHVwZGF0ZS9tb2RpZmljYXRpb24KLQkJCQkJCQkvLyBvY2N1cnMKLQkJCQkJCQlydW5uYWJsZS5ydW4oKTsKLQotCQkJCQkJCS8vIGZvciBmdXR1cmUsIHBvc3NpYmx5IGV4cGxvcmUgc29sdXRpb25zIHN1Y2ggYXMKLQkJCQkJCQkvLyB0aGlzCi0JCQkJCQkJLy8JCQkJCQkJSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2Ugam9iU2VydmljZSA9Ci0JCQkJCQkJLy8gKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlKQotCQkJCQkJCS8vIGVkaXRvci5nZXRFZGl0b3JQYXJ0KCkuZ2V0U2l0ZSgpLmdldEFkYXB0ZXIoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MpOwotCQkJCQkJCS8vCQkJCQkJCWpvYlNlcnZpY2UucnVuSW5VSSh4eHh4eCkKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJLy8gdGhpcyAnZW5kJyBpcyBqdXN0IGEgc2lnbmFsIHRvIGVkaXRvciB0aGF0IHRoaXMKLQkJCQkJCQkvLyBwYXJ0aWN1bGFyIHVwZGF0ZSBpcyBkb25lLiBJdHMgdXAgdG8gdGhlIGVkaXRvcgotCQkJCQkJCS8vIHRvIGRlY2lkZSBleGFjdGx5IHdoZW4gdG8gbGVhdmUgaXRzICJiYWNrZ3JvdW5kCi0JCQkJCQkJLy8gbW9kZSIKLQkJCQkJCQllZGl0b3IuZW5kQmFja2dyb3VuZE9wZXJhdGlvbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9Gb2xkaW5nQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9Gb2xkaW5nQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MmFjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dE9wZXJhdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUZvbGRpbmdDb21tYW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0T3BlcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci0KLWNsYXNzIEZvbGRpbmdBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKLQkJUHJlZmVyZW5jZUFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIGludCBzdHlsZSkgewotCQkJc3VwZXIoYnVuZGxlLCBwcmVmaXgsIHN0eWxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBQcmVmZXJlbmNlQWN0aW9uIGZUb2dnbGU7Ci0JcHJpdmF0ZSBmaW5hbCBUZXh0T3BlcmF0aW9uQWN0aW9uIGZFeHBhbmRBbGw7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdGlvbkxpc3RlbmVyIGZQcm9qZWN0aW9uTGlzdGVuZXI7Ci0JcHJpdmF0ZSBmaW5hbCBUZXh0T3BlcmF0aW9uQWN0aW9uIGZDb2xsYXBzZUFsbDsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0aW9uIGFjdGlvbiBncm91cCBmb3IgPGNvZGU+ZWRpdG9yPC9jb2RlPi4gSWYKLQkgKiB0aGUgc3VwcGxpZWQgdmlld2VyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA8Y29kZT5Qcm9qZWN0aW9uVmlld2VyPC9jb2RlPiwKLQkgKiB0aGUgYWN0aW9uIGdyb3VwIGlzIGRpc2FibGVkLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGVkaXRvciB0byBvcGVyYXRlIG9uCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciBvZiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIEZvbGRpbmdBY3Rpb25Hcm91cChmaW5hbCBJVGV4dEVkaXRvciBlZGl0b3IsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlpZiAoISh2aWV3ZXIgaW5zdGFuY2VvZiBQcm9qZWN0aW9uVmlld2VyKSkgewotCQkJZlRvZ2dsZSA9IG51bGw7Ci0JCQlmRXhwYW5kQWxsID0gbnVsbDsKLQkJCWZDb2xsYXBzZUFsbCA9IG51bGw7Ci0JCQlmUHJvamVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZWaWV3ZXIgPSAoUHJvamVjdGlvblZpZXdlcikgdmlld2VyOwotCi0JCWZQcm9qZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVByb2plY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfTsKLQotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcihmUHJvamVjdGlvbkxpc3RlbmVyKTsKLQotCQlmVG9nZ2xlID0gbmV3IFByZWZlcmVuY2VBY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbl9Ub2dnbGVfIiwgSUFjdGlvbi5BU19DSEVDS19CT1gpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJYm9vbGVhbiBjdXJyZW50ID0gc3RvcmUuZ2V0Qm9vbGVhbihJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIuRk9MRElOR19FTkFCTEVEKTsKLQkJCQlzdG9yZS5zZXRWYWx1ZShJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIuRk9MRElOR19FTkFCTEVELCAhY3VycmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCQlJVGV4dE9wZXJhdGlvblRhcmdldCB0YXJnZXQgPSAoSVRleHRPcGVyYXRpb25UYXJnZXQpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0T3BlcmF0aW9uVGFyZ2V0LmNsYXNzKTsKLQotCQkJCWJvb2xlYW4gaXNFbmFibGVkID0gKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5jYW5Eb09wZXJhdGlvbihQcm9qZWN0aW9uVmlld2VyLlRPR0dMRSkpOwotCQkJCXNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQkJCX0KLQkJfTsKLQkJZlRvZ2dsZS5zZXRDaGVja2VkKHRydWUpOwotCQlmVG9nZ2xlLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19UT0dHTEUpOwotCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nVG9nZ2xlIiwgZlRvZ2dsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmRXhwYW5kQWxsID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbl9FeHBhbmRBbGxfIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkVYUEFORF9BTEwsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZFeHBhbmRBbGwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX0VYUEFORF9BTEwpOwotCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nRXhwYW5kQWxsIiwgZkV4cGFuZEFsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmQ29sbGFwc2VBbGwgPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJQcm9qZWN0aW9uX0NvbGxhcHNlQWxsXyIsIGVkaXRvciwgUHJvamVjdGlvblZpZXdlci5DT0xMQVBTRV9BTEwsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZDb2xsYXBzZUFsbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfQ09MTEFQU0VfQUxMKTsKLQkJZWRpdG9yLnNldEFjdGlvbigiRm9sZGluZ0NvbGxhcHNlQWxsIiwgZkNvbGxhcHNlQWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdyb3VwIGlzIGVuYWJsZWQuCi0JICogCi0JICogPHByZT4KLQkgKiAgICAgICAgSW52YXJpYW50OiBpc0VuYWJsZWQoKSAmbHQ7PSZndDsgZlZpZXdlciBhbmQgYWxsIGFjdGlvbnMgYXJlICE9IG51bGwuCi0JICogPC9wcmU+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ3JvdXAgaXMgZW5hYmxlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKGZQcm9qZWN0aW9uTGlzdGVuZXIpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCWZUb2dnbGUudXBkYXRlKCk7Ci0JCQlmVG9nZ2xlLnNldENoZWNrZWQoZlZpZXdlci5pc1Byb2plY3Rpb25Nb2RlKCkpOwotCQkJZkV4cGFuZEFsbC51cGRhdGUoKTsKLQkJCWZDb2xsYXBzZUFsbC51cGRhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBtZW51IHdpdGggYWxsIGZvbGRpbmcgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIG1lbnUgbWFuYWdlciBmb3IgdGhlIGZvbGRpbmcgc3VibWVudQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJdXBkYXRlKCk7Ci0JCQltYW5hZ2VyLmFkZChmVG9nZ2xlKTsKLQkJCW1hbmFnZXIuYWRkKGZFeHBhbmRBbGwpOwotCQkJbWFuYWdlci5hZGQoZkNvbGxhcHNlQWxsKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwI3VwZGF0ZUFjdGlvbkJhcnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbkJhcnMoKSB7Ci0JCXVwZGF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9JbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjg0NzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9JbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uMjsKLQotLyoqCi0gKiBJbmZvcm1hdGlvbiBwcm92aWRlciB1c2VkIHRvIHByZXNlbnQgdGhlIGluZm9ybWF0aW9uLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkphdmFFZGl0b3IjSW5mb3JtYXRpb25EaXNwYXRjaEFjdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yI0luZm9ybWF0aW9uRGlzcGF0Y2hBY3Rpb24KLSAqLwotY2xhc3MgSW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24yIHsKLQotCXByaXZhdGUgSVJlZ2lvbiBmSG92ZXJSZWdpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZkhvdmVySW5mbzsKLQlwcml2YXRlIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGZDb250cm9sQ3JlYXRvcjsKLQotCUluZm9ybWF0aW9uUHJvdmlkZXIoSVJlZ2lvbiBob3ZlclJlZ2lvbiwgU3RyaW5nIGhvdmVySW5mbywgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgY29udHJvbENyZWF0b3IpIHsKLQkJZkhvdmVyUmVnaW9uID0gaG92ZXJSZWdpb247Ci0JCWZIb3ZlckluZm8gPSBob3ZlckluZm87Ci0JCWZDb250cm9sQ3JlYXRvciA9IGNvbnRyb2xDcmVhdG9yOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldFN1YmplY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBpbnZvY2F0aW9uT2Zmc2V0KSB7Ci0JCXJldHVybiBmSG92ZXJSZWdpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXIjZ2V0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SW5mb3JtYXRpb24yKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZkhvdmVySW5mbzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjIjZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXJDb250cm9sQ3JlYXRvcigpCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKCkgewotCQlyZXR1cm4gZkNvbnRyb2xDcmVhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTRkOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVNlbGVjdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dE9wZXJhdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuTGluZUNoYW5nZUhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQ2hhaW5lZFByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkRlZmF1bHRSYW5nZUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVN0YXR1c0ZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRPcGVyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JRXhlY3V0aW9uRGVsZWdhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVBvcHVwTWVudUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RvcmFnZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkTGluZUNoYW5nZUhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Vbmtub3duQ29udGVudFR5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zy5CcmVha3BvaW50UnVsZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zy5FZGl0QnJlYWtwb2ludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnLk1hbmFnZUJyZWFrcG9pbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zy5Ub2dnbGVCcmVha3BvaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkLkhUTUxUZXh0UHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvck1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaHlwZXJsaW5rLk9wZW5IeXBlcmxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLklTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNob3dQcm9wZXJ0aWVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5OdWxsU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TZWxlY3Rpb25IaXN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dC5Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEEgVGV4dCBFZGl0b3IgZm9yIGVkaXRpbmcgc3RydWN0dXJlZCBtb2RlbHMgYW5kIHN0cnVjdHVyZWQgZG9jdW1lbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBzdWJjbGFzc2VkLjxiciAvPgotICogTmV3IGNvbnRlbnQgdHlwZXMgbWF5IGFzc29jaWF0ZSBzb3VyY2Ugdmlld2VyLCBjb250ZW50IG91dGxpbmUsIGFuZAotICogcHJvcGVydHkgc2hlZXQgY29uZmlndXJhdGlvbnMgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBmdW5jdGlvbmFsaXR5LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGV4dGVuZHMgVGV4dEVkaXRvciB7Ci0KLQotCS8vIElTU1VFOiBUaGlzIHVzZSBjYXNlIGlzIG5vdCBjbGVhciB0byBtZS4KLQkvLyBJcyB0aGlzIGxpc3RuZXIgYW5kIGRhbmNlIHdpdGggZGlydHkgc3RhdGUgZm9yIG5vbi1lZGl0b3IgZHJpdmVuCi0JLy8gdXBkYXRlcz8KLQljbGFzcyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCS8vIFRoaXMgaXMgZm9yIHRoZSBJRG9jdW1lbnRMaXN0ZW5lciBpbnRlcmZhY2UKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWZEaXJ0eUJlZm9yZURvY3VtZW50RXZlbnQgPSBpc0RpcnR5KCk7Ci0JCX0KLQotCQkvLyBUaGlzIGlzIGZvciB0aGUgSURvY3VtZW50TGlzdGVuZXIgaW50ZXJmYWNlCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoaXNFZGl0b3JJbnB1dFJlYWRPbmx5KCkpIHsKLQkJCQkvLyBzdG9wIGxpc3RlbmluZyB0byBkb2N1bWVudCBldmVudAotCQkJCS8vIGNhdXNlZCBieSB0aGUgdW5kbyBhZnRlciB2YWxpZGF0ZUVkaXQKLQkJCQlmaW5hbCBpbnQgb2Zmc2V0ID0gZXZlbnQuZ2V0T2Zmc2V0KCkgKyBldmVudC5nZXRMZW5ndGgoKTsKLQkJCQlmaW5hbCBJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCQkJZkN1cnJlbnRSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKCFmRWRpdG9yRGlzcG9zZWQpIHsKLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IHZhbGlkYXRlRWRpdG9ySW5wdXRTdGF0ZSgpOwotCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCWlmIChpbnRlcm5hbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCWludGVybmFsTW9kZWwuZ2V0VW5kb01hbmFnZXIoKS51bmRvKCk7Ci0JCQkJCQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5zZXRTZWxlY3RlZFJhbmdlKG9mZnNldCwgMCk7Ci0JCQkJCQkJCQlpZiAoIWZEaXJ0eUJlZm9yZURvY3VtZW50RXZlbnQpIHsKLQkJCQkJCQkJCQkvLyByZXNldCBkaXJ0eSBzdGF0ZSBpZgotCQkJCQkJCQkJCS8vIG1vZGVsIG5vdCBkaXJ0eSBiZWZvcmUKLQkJCQkJCQkJCQkvLyBkb2N1bWVudCBldmVudAotCQkJCQkJCQkJCWludGVybmFsTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmQ3VycmVudFJ1bm5hYmxlID0gbnVsbDsKLQkJCQkJfQotCQkJCX07Ci0JCQkJLyoKLQkJCQkgKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgcnVuIHZpYSAnYXN5bmNFeGVjJyBzaW5jZQotCQkJCSAqIHRoZXNlIG5vdGlmaWNhdGlvbnMgY2FuIGNvbWUgZnJvbSBhIG5vbi11aSB0aHJlYWQuCi0JCQkJICogCi0JCQkJICogVGhlIG5vbi11aSB0aHJlYWQgY2FsbCB3b3VsZCBvY2N1ciB3aGVuIGNyZWF0aW5nIGEgbmV3IGZpbGUKLQkJCQkgKiB1bmRlciBDbGVhckNhc2UgKG9yIG90aGVyIGxpYnJhcnkpIGNvbnRyb2wuIFRoZSBjcmVhdGlvbiBvZgotCQkJCSAqIHRoZSBuZXcgZmlsZSB3b3VsZCB0cmlnZ2VyIGEgdmFsaWRhdGVFZGl0IGNhbGwsIG9uIGFub3RoZXIKLQkJCQkgKiB0aHJlYWQsIHRoYXQgd291bGQgcHJvbXB0IHRoZSB1c2VyIHRvIGFkZCB0aGUgbmV3IGZpbGUgdG8KLQkJCQkgKiB2ZXJzaW9uIGNvbnRyb2wuCi0JCQkJICovCi0JCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQkJCWlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkJCQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgIT0gZGlzcGxheS5nZXRUaHJlYWQoKSkKLQkJCQkJCS8vIGZ1dHVyZV9UT0RPOiB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyCi0JCQkJCQkvLyB3YXkgdGhhbiByZWx5aW5nIG9uIGFzeWNuRXhlYwotCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMoZkN1cnJlbnRSdW5uYWJsZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWZDdXJyZW50UnVubmFibGUucnVuKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJaWYgKGdldFRleHRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0VGV4dFZpZXdlcigpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCWlmIChnZXRUZXh0Vmlld2VyKCkgIT0gbnVsbCkgewotCQkJCS8vIGdldFRleHRWaWV3ZXIoKS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCWdldFRleHRWaWV3ZXIoKS51bmNvbmZpZ3VyZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCWlmIChnZXRUZXh0Vmlld2VyKCkgIT0gbnVsbCkgewotCQkJCS8vIGdldFRleHRWaWV3ZXIoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQkJLy8gU2luY2UgdGhlIG1vZGVsIGNhbiBiZSBjaGFuZ2VkIG9uIGEgYmFja2dyb3VuZAotCQkJCS8vIHRocmVhZCwgd2Ugd2lsbCB1cGRhdGUgbWVudXMgb24gZGlzcGxheSB0aHJlYWQsCi0JCQkJLy8gaWYgd2UgYXJlIG5vdCBhbHJlYWR5IG9uIGRpc3BsYXkgdGhyZWFkLAotCQkJCS8vIGFuZCBpZiB0aGVyZSBpcyBub3QgYW4gdXBkYXRlIGFscmVhZHkgcGVuZGluZy4KLQkJCQkvLyAod2UgY2FuIGdldCBsb3RzIG9mICdtb2RlbENoYW5nZWQnIGV2ZW50cyBpbiByYXBpZAotCQkJCS8vIHN1Y2Nlc3Npb24sIHNvIG9ubHkgbmVlZCB0byBkbyBvbmUuCi0JCQkJaWYgKCFmVXBkYXRlTWVudVRleHRQZW5kaW5nKSB7Ci0JCQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXVwZGF0ZU1lbnVUZXh0KCk7Ci0JCQkJCQkJZlVwZGF0ZU1lbnVUZXh0UGVuZGluZyA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjZmcgPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJCWdldFNvdXJjZVZpZXdlcigpLmNvbmZpZ3VyZShjZmcpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMTY2Ci0JCQkJLy8gaW52ZXN0aWdhdGUgZWFjaCBlcnJvciBjYXNlIHBvc3QgYmV0YQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gdHJ5aW5nIHRvIGNvbmZpZ3VyZSBhZnRlciBtb2RlbCBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gc28gd2UgZG9uJ3QgZnJlZXplIHdvcmtiZW5jaCAoZWcuIGR1cmluZyBwYWdlIGxhbmd1YWdlIG9yCi0JCQkJLy8gY29udGVudCB0eXBlIGNoYW5nZSkKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSBnZXRTb3VyY2VWaWV3ZXIoKSkuc2V0UmVkcmF3KHRydWUpOwotCQkJfQotCQl9Ci0KLQkJLy8gTm90ZTogdGhpcyBvbmUgc2hvdWxkIHByb2JhYmx5IGJlIHVzZWQgdG8KLQkJLy8gY29udHJvbCB2aWV3ZXIKLQkJLy8gaW5zdGVhZCBvZiB2aWV3ZXIgaGF2aW5nIGl0cyBvd24gbGlzdGVuZXIKLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb3JpZ2luYWxtb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBtb3ZlZG1vZGVsKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogVGhpcyAnUnVubmFibGUnIHNob3VsZCBiZSB2ZXJ5IGJyaWVmLCBhbmQgc2hvdWxkIG5vdCAiY2FsbCBvdXQiIHRvCi0JCSAqIG90aGVyIGNvZGUgZXNwZWNpYWxseSBpZiBpdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZSBvZiB0aGUgbW9kZWwuCi0JCSAqIAotCQkgKiBAcGFyYW0gcgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZWQoUnVubmFibGUgcikgewotCQkJLy8gaWYgdGhlcmUgaXMgbm8gRGlzcGxheSBhdCBhbGwgKHRoYXQgaXMsIHJ1bm5pbmcgaGVhZGxlc3MpLAotCQkJLy8gb3IgaWYgd2UgYXJlIGFscmVhZHkgcnVubmluZyBvbiB0aGUgZGlzcGxheSB0aHJlYWQsIHRoZW4KLQkJCS8vIHNpbXBseSBleGVjdXRlIHRoZSBydW5uYWJsZS4KLQkJCWlmIChnZXREaXNwbGF5KCkgPT0gbnVsbCB8fCAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBnZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkpKSB7Ci0JCQkJci5ydW4oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG90aGVyd2lzZSBmb3JjZSB0aGUgcnVubmFibGUgdG8gcnVuIG9uIHRoZSBkaXNwbGF5IHRocmVhZC4KLQkJCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKHIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgTW91c2VUcmFja2VyIGV4dGVuZHMgTW91c2VUcmFja0FkYXB0ZXIgaW1wbGVtZW50cyBNb3VzZU1vdmVMaXN0ZW5lciB7Ci0JCS8qKiBUaGUgdHJhY2tlcidzIHN1YmplY3QgY29udHJvbC4gKi8KLQkJcHJpdmF0ZSBDb250cm9sIGZTdWJqZWN0Q29udHJvbDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBtb3VzZSB0cmFja2VyLgotCQkgKi8KLQkJcHVibGljIE1vdXNlVHJhY2tlcigpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBldmVudCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJob3ZlcjogIitldmVudC54ICsgIngiICsgZXZlbnQueSk7Ci0JCQlob3ZlclggPSBldmVudC54OwotCQkJaG92ZXJZID0gZXZlbnQueTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lciNtb3VzZU1vdmUob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJaG92ZXJYID0gZS54OwotCQkJaG92ZXJZID0gZS55OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFN0YXJ0cyB0aGlzIG1vdXNlIHRyYWNrZXIuIFRoZSBnaXZlbiBjb250cm9sIGJlY29tZXMgdGhpcyB0cmFja2VyJ3MKLQkJICogc3ViamVjdCBjb250cm9sLiBJbnN0YWxscyBpdHNlbGYgYXMgbW91c2UgdHJhY2sgbGlzdGVuZXIgb24gdGhlCi0JCSAqIHN1YmplY3QgY29udHJvbC4KLQkJICogCi0JCSAqIEBwYXJhbSBzdWJqZWN0Q29udHJvbAotCQkgKiAgICAgICAgICAgIHRoZSBzdWJqZWN0IGNvbnRyb2wKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0KENvbnRyb2wgc3ViamVjdENvbnRyb2wpIHsKLQkJCWZTdWJqZWN0Q29udHJvbCA9IHN1YmplY3RDb250cm9sOwotCQkJaWYgKGZTdWJqZWN0Q29udHJvbCAhPSBudWxsICYmICFmU3ViamVjdENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZlN1YmplY3RDb250cm9sLmFkZE1vdXNlTW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWZTdWJqZWN0Q29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIodGhpcyk7Ci0JCQkJZlN1YmplY3RDb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCQkJc3RvcCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU3RvcHMgdGhpcyBtb3VzZSB0cmFja2VyLiBSZW1vdmVzIGl0c2VsZiBhcyBtb3VzZSB0cmFjaywgbW91c2UKLQkJICogbW92ZSwgYW5kIHNoZWxsIGxpc3RlbmVyIGZyb20gdGhlIHN1YmplY3QgY29udHJvbC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCQlpZiAoZlN1YmplY3RDb250cm9sICE9IG51bGwgJiYgIWZTdWJqZWN0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlmU3ViamVjdENvbnRyb2wucmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZlN1YmplY3RDb250cm9sLnJlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lcih0aGlzKTsKLQkJCQlmU3ViamVjdENvbnRyb2wgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb3VibGUtY2xpY2sgYW5kIHNlbGVjdGlvbiBmcm9tIHRoZSBvdXRsaW5lIHBhZ2UKLQkgKi8KLQlwcml2YXRlIGNsYXNzIE91dGxpbmVQYWdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRG91YmxlQ2xpY2tMaXN0ZW5lciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCi0JCQlpbnQgc3RhcnQgPSAtMTsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChjdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJT2JqZWN0IGN1cnJlbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjdXJyZW50U2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCQkJCU9iamVjdCBuZXdTZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQkJCQlpZiAoIWN1cnJlbnQuZXF1YWxzKG5ld1NlbGVjdGlvbikpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlPYmplY3QgbyA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJCXN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCWxlbmd0aCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0RW5kT2Zmc2V0KCkgLSBzdGFydDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbikgewotCQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCQlsZW5ndGggPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRFbmQoKSAtIHN0YXJ0OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElSZWdpb24pIHsKLQkJCQkJCQlzdGFydCA9ICgoSVRleHRSZWdpb24pIG8pLmdldFN0YXJ0KCk7Ci0JCQkJCQkJbGVuZ3RoID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJc3RhcnQgPSAoKElUZXh0U2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0T2Zmc2V0KCk7Ci0JCQkJbGVuZ3RoID0gKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldExlbmd0aCgpOwotCQkJfQotCQkJaWYgKHN0YXJ0ID4gLTEpIHsKLQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oc3RhcnQsIGxlbmd0aCwgZmFsc2UpOwotCQkJCXNlbGVjdEFuZFJldmVhbChzdGFydCwgbGVuZ3RoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkvKgotCQkJICogRG8gbm90IGFsbG93IHNlbGVjdGlvbiBmcm9tIG90aGVyIHBhcnRzIHRvIGFmZmVjdCBzZWxlY3Rpb24gaW4KLQkJCSAqIHRoZSB0ZXh0IHdpZGdldCBpZiBpdCBoYXMgZm9jdXMsIG9yIGlmIHdlJ3JlIHN0aWxsIGZpcmluZyBhCi0JCQkgKiBjaGFuZ2Ugb2Ygc2VsZWN0aW9uLiBTZWxlY3Rpb24gZXZlbnRzICJib3VuY2luZyIgb2ZmIG9mIG90aGVyCi0JCQkgKiBwYXJ0cyBhcmUgYWxsIHRoYXQgd2UgY2FuIHJlY2VpdmUgaWYgd2UgaGF2ZSBmb2N1cyAoc2luY2Ugd2UKLQkJCSAqIGZvcndhcmRlZCBvdXIgc2VsZWN0aW9uIHRvIHRoZSBzZXJ2aWNlIGp1c3QgYSBtb21lbnQgYWdvKSwgYW5kCi0JCQkgKiBvbmx5IHRoZSB1c2VyIHNob3VsZCBhZmZlY3Qgc2VsZWN0aW9uIGlmIHdlIGhhdmUgZm9jdXMuCi0JCQkgKi8KLQotCQkJLyogVGhlIGlzRmlyaW5nU2VsZWN0aW9uIGNoZWNrIG9ubHkgd29ya3MgaWYgYSBzZWxlY3Rpb24gbGlzdGVuZXIgKi8KLQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkgfHwgZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlci5pc0ZpcmluZ1NlbGVjdGlvbigpKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwgJiYgZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpICE9IG51bGwgJiYgIWdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5pc0Rpc3Bvc2VkKCkgJiYgIWdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQkJaW50IHN0YXJ0ID0gLTE7Ci0JCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJSVNlbGVjdGlvbiBjdXJyZW50ID0gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJT2JqZWN0W10gY3VycmVudFNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN1cnJlbnQpLnRvQXJyYXkoKTsKLQkJCQkJCU9iamVjdFtdIG5ld1NlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7Ci0JCQkJCQlpZiAoIUFycmF5cy5lcXVhbHMoY3VycmVudFNlbGVjdGlvbiwgbmV3U2VsZWN0aW9uKSkgewotCQkJCQkJCWlmIChuZXdTZWxlY3Rpb24ubGVuZ3RoID4gMCkgewotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBObyBvcmRlcmluZyBpcyBndWFyYW50ZWVkIGZvciBtdWx0aXBsZQotCQkJCQkJCQkgKiBzZWxlY3Rpb24KLQkJCQkJCQkJICovCi0JCQkJCQkJCU9iamVjdCBvID0gbmV3U2VsZWN0aW9uWzBdOwotCQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCQkJCXN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJCQlpZiAobmV3U2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG5ld1NlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlzdGFydCA9IE1hdGgubWluKHN0YXJ0LCAoKEluZGV4ZWRSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCQkJCQkJCWVuZCA9IE1hdGgubWF4KGVuZCwgKChJbmRleGVkUmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldEVuZE9mZnNldCgpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJbGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQkJCQlzdGFydCA9ICgoSVRleHRSZWdpb24pIG8pLmdldFN0YXJ0KCk7Ci0JCQkJCQkJCQlpbnQgZW5kID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0RW5kKCk7Ci0JCQkJCQkJCQlpZiAobmV3U2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG5ld1NlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlzdGFydCA9IE1hdGgubWluKHN0YXJ0LCAoKElUZXh0UmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldFN0YXJ0KCkpOwotCQkJCQkJCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSVRleHRSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0RW5kKCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVJlZ2lvbikgewotCQkJCQkJCQkJc3RhcnQgPSAoKElSZWdpb24pIG8pLmdldE9mZnNldCgpOwotCQkJCQkJCQkJaW50IGVuZCA9IHN0YXJ0ICsgKChJUmVnaW9uKSBvKS5nZXRMZW5ndGgoKTsKLQkJCQkJCQkJCWlmIChuZXdTZWxlY3Rpb24ubGVuZ3RoID4gMSkgewotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbmV3U2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSVJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRPZmZzZXQoKSk7Ci0JCQkJCQkJCQkJCWVuZCA9IE1hdGgubWF4KGVuZCwgKChJUmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldE9mZnNldCgpICsgKChJUmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldExlbmd0aCgpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJbGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlzdGFydCA9ICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJaWYgKHN0YXJ0ID4gLTEpIHsKLQkJCQkJdXBkYXRlUmFuZ2VJbmRpY2F0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJc2VsZWN0QW5kUmV2ZWFsKHN0YXJ0LCBsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2hvd0luVGFyZ2V0TGlzdEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvd0luVGFyZ2V0TGlzdCB7Ci0JCS8qKgotCQkgKiBBcnJheSBvZiBJRCBTdHJpbmdzIHRoYXQgZGVmaW5lIHRoZSBkZWZhdWx0IHNob3cgaW4gdGFyZ2V0cyBmb3IKLQkJICogdGhpcyBlZGl0b3IuCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3QjZ2V0U2hvd0luVGFyZ2V0SWRzKCkKLQkJICogQHJldHVybiB0aGUgYXJyYXkgb2YgSUQgU3RyaW5ncyB0aGF0IGRlZmluZSB0aGUgZGVmYXVsdCBzaG93IGluCi0JCSAqICAgICAgICAgdGFyZ2V0cyBmb3IgdGhpcyBlZGl0b3IuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U2hvd0luVGFyZ2V0SWRzKCkgewotCQkJcmV0dXJuIGZTaG93SW5UYXJnZXRJZHM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIHBvc3Qgc2VsZWN0aW9uIHByb3ZpZGVyIHRoYXQgd3JhcHMgdGhlIHByb3ZpZGVyIGltcGxlbWVudGVkIGluCi0JICogQWJzdHJhY3RUZXh0RWRpdG9yIHRvIHByb3ZpZGUgYSBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbiB0byBwb3N0Ci0JICogc2VsZWN0aW9uIGxpc3RlbmVycy4gTGlzdGVucyB0byBzZWxlY3Rpb24gY2hhbmdlcyBmcm9tIHRoZSBzb3VyY2UKLQkgKiB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVBvc3RTZWxlY3Rpb25Qcm92aWRlciwgSVNlbGVjdGlvblZhbGlkYXRvciB7Ci0JCS8qKgotCQkgKiBBICJoeWJyaWQiIHRleHQgYW5kIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGNsYXNzLiBDb252ZXJ0cyB0aGUgc291cmNlCi0JCSAqIHZpZXdlciB0ZXh0IHNlbGVjdGlvbiB0byBhIGdlbmVyaWMgImdldEluZGV4ZWRSZWdpb24iLWRlcml2ZWQKLQkJICogc3RydWN0dXJlZCBzZWxlY3Rpb24sIGFsbG93aW5nIHNlbGVjdGlvbiBjaGFuZ2VkIGxpc3RlbmVycyB0bwotCQkgKiBwb3NzaWJseSBub3QgbmVlZCB0byByZWZlcmVuY2UgdGhlIG1vZGVsIGRpcmVjdGx5LgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RydWN0dXJlZFRleHRTZWxlY3Rpb24gZXh0ZW5kcyBUZXh0U2VsZWN0aW9uIGltcGxlbWVudHMgSVN0cnVjdHVyZWRTZWxlY3Rpb24sIElUZXh0U2VsZWN0aW9uIHsKLQkJCXByaXZhdGUgV2Vha1JlZmVyZW5jZSB3ZWFrU2VsZWN0ZWRTdHJ1Y3R1cmVkOwotCQkJcHJpdmF0ZSBJbnRlcm5hbFRleHRTZWxlY3Rpb24gZkludGVybmFsVGV4dFNlbGVjdGlvbjsKLQotCQkJU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCQkvLyBub3RlOiB3ZSBkbyBub3QgY3VycmVudGx5IHVzZSBzdXBlciBjbGFzcyBhdCBhbGwsIGJ1dCwgb25seQotCQkJCS8vIHN1YmNsYXNzIFRleHRTZWxlY3Rpb24sCi0JCQkJLy8gYmVjYXVzZSBzb21lIGluZnJhc3RydWN0dXJlIGNvZGUgdXNlcyAiaW5zdGFuY2VvZgotCQkJCS8vIFRleHRTZWxlY3Rpb24iIGluc3RlYWQgb2YgSVRleHRTZWxlY3Rpb24uCi0JCQkJc3VwZXIoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZJbnRlcm5hbFRleHRTZWxlY3Rpb24gPSBuZXcgSW50ZXJuYWxUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJd2Vha1NlbGVjdGVkU3RydWN0dXJlZCA9IG5ldyBXZWFrUmVmZXJlbmNlKGluaXRpYWxpemVJbmZlcnJlZFNlbGVjdGVkT2JqZWN0cyhzZWxlY3Rpb24sIG1vZGVsKSk7Ci0JCQl9Ci0KLQkJCVN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiwgT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCQlzdXBlcihzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkludGVybmFsVGV4dFNlbGVjdGlvbiA9IG5ldyBJbnRlcm5hbFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQl3ZWFrU2VsZWN0ZWRTdHJ1Y3R1cmVkID0gbmV3IFdlYWtSZWZlcmVuY2Uoc2VsZWN0ZWRPYmplY3RzKTsKLQkJCX0KLQotCQkJU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMpIHsKLQkJCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJZkludGVybmFsVGV4dFNlbGVjdGlvbiA9IG5ldyBJbnRlcm5hbFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQl3ZWFrU2VsZWN0ZWRTdHJ1Y3R1cmVkID0gbmV3IFdlYWtSZWZlcmVuY2Uoc2VsZWN0ZWRPYmplY3RzKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRGaXJzdEVsZW1lbnQoKSB7Ci0JCQkJT2JqZWN0W10gc2VsZWN0ZWRTdHJ1Y3R1cmVzID0gZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCk7Ci0JCQkJcmV0dXJuIHNlbGVjdGVkU3RydWN0dXJlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRTdHJ1Y3R1cmVzWzBdIDogbnVsbDsKLQkJCX0KLQotCQkJcHJpdmF0ZSBPYmplY3RbXSBnZXRTZWxlY3RlZFN0cnVjdHVyZXMoKSB7Ci0JCQkJT2JqZWN0W10gc2VsZWN0ZWRTdHJ1Y3R1cmVzID0gKE9iamVjdFtdKSB3ZWFrU2VsZWN0ZWRTdHJ1Y3R1cmVkLmdldCgpOwotCQkJCWlmIChzZWxlY3RlZFN0cnVjdHVyZXMgPT0gbnVsbCkgewotCQkJCQlzZWxlY3RlZFN0cnVjdHVyZXMgPSBuZXcgT2JqZWN0WzBdOwotCQkJCX0KLQkJCQlyZXR1cm4gc2VsZWN0ZWRTdHJ1Y3R1cmVzOwotCQkJfQotCi0JCQlwcml2YXRlIE9iamVjdFtdIGluaXRpYWxpemVJbmZlcnJlZFNlbGVjdGVkT2JqZWN0cyhJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCQlPYmplY3RbXSBsb2NhbFNlbGVjdGVkU3RydWN0dXJlcyA9IG51bGw7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiByZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCWludCBlbmQgPSBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJaWYgKGVuZCA8PSByZWdpb24uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCQkvLyBzaW5nbGUgc2VsZWN0aW9uCi0JCQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQkJCWxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzWzBdID0gcmVnaW9uOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gbXVsdGlwbGUgc2VsZWN0aW9uCi0JCQkJCQkJaW50IG1heExlbmd0aCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJCQkJCUxpc3Qgc3RydWN0dXJlcyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJCQkJd2hpbGUgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSA8PSBlbmQgJiYgcmVnaW9uLmdldEVuZE9mZnNldCgpIDwgbWF4TGVuZ3RoKSB7Ci0JCQkJCQkJCXN0cnVjdHVyZXMuYWRkKHJlZ2lvbik7Ci0JCQkJCQkJCXJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24ocmVnaW9uLmdldEVuZE9mZnNldCgpICsgMSk7Ci0JCQkJCQkJfQotCQkJCQkJCWxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzID0gc3RydWN0dXJlcy50b0FycmF5KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzID09IG51bGwpIHsKLQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBuZXcgT2JqZWN0WzBdOwotCQkJCX0KLQkJCQlyZXR1cm4gbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uaXNFbXB0eSgpICYmIGdldFNlbGVjdGVkU3RydWN0dXJlcygpLmxlbmd0aCA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIHRvTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCkubGVuZ3RoOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaXN0IHRvTGlzdCgpIHsKLQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRTZWxlY3RlZFN0cnVjdHVyZXMoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyAiOiIgKyBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpICsgIkAiICsgZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0KLQkJCXByaXZhdGUgc3RhdGljIGNsYXNzIEludGVybmFsVGV4dFNlbGVjdGlvbiBpbXBsZW1lbnRzIElUZXh0U2VsZWN0aW9uIHsKLQotCi0JCQkJcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIHdlYWtEb2N1bWVudDsKLQotCQkJCS8qKiBPZmZzZXQgb2YgdGhlIHNlbGVjdGlvbiAqLwotCQkJCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0JCQkJLyoqIExlbmd0aCBvZiB0aGUgc2VsZWN0aW9uICovCi0JCQkJcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQotCi0JCQkJLyoqCi0JCQkJICogQ3JlYXRlcyBhbiBlbXB0eSB0ZXh0IHNlbGVjdGlvbi4KLQkJCQkgKi8KLQkJCQlwcml2YXRlIEludGVybmFsVGV4dFNlbGVjdGlvbigpIHsKLQkJCQkJdGhpcyhudWxsLCAtMSwgLTEpOwotCQkJCX0KLQotCQkJCS8qKgotCQkJCSAqIENyZWF0ZXMgYSB0ZXh0IHNlbGVjdGlvbiBmb3IgdGhlIGdpdmVuIHJhbmdlLiBUaGlzCi0JCQkJICogc2VsZWN0aW9uIG9iamVjdCBkZXNjcmliZXMgZ2VuZXJpY2FsbHkgYSB0ZXh0IHJhbmdlIGFuZCBpcwotCQkJCSAqIGludGVuZGVkIHRvIGJlIGFuIGFyZ3VtZW50IGZvciB0aGUKLQkJCQkgKiA8Y29kZT5zZXRTZWxlY3Rpb248L2NvZGU+IG1ldGhvZCBvZiBzZWxlY3Rpb24gcHJvdmlkZXJzLgotCQkJCSAqIAotCQkJCSAqIEBwYXJhbSBvZmZzZXQKLQkJCQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlCi0JCQkJICogQHBhcmFtIGxlbmd0aAotCQkJCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UKLQkJCQkgKi8KLQkJCQlJbnRlcm5hbFRleHRTZWxlY3Rpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJCQl0aGlzKG51bGwsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQl9Ci0KLQkJCQkvKioKLQkJCQkgKiBDcmVhdGVzIGEgdGV4dCBzZWxlY3Rpb24gZm9yIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZ2l2ZW4KLQkJCQkgKiBkb2N1bWVudC4gVGhpcyBzZWxlY3Rpb24gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgc2VsZWN0aW9uCi0JCQkJICogcHJvdmlkZXJzIGluIHJlc3BvbmRzIDxjb2RlPmdldFNlbGVjdGlvbjwvY29kZT4uCi0JCQkJICogCi0JCQkJICogQHBhcmFtIGRvY3VtZW50Ci0JCQkJICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgd2hvc2UgdGV4dCByYW5nZSBpcyBzZWxlY3RlZCBpbiBhCi0JCQkJICogICAgICAgICAgICB2aWV3ZXIKLQkJCQkgKiBAcGFyYW0gb2Zmc2V0Ci0JCQkJICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBzZWxlY3RlZCByYW5nZQotCQkJCSAqIEBwYXJhbSBsZW5ndGgKLQkJCQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdGVkIHJhbmdlCi0JCQkJICovCi0JCQkJSW50ZXJuYWxUZXh0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJCQl3ZWFrRG9jdW1lbnQgPSBuZXcgV2Vha1JlZmVyZW5jZShkb2N1bWVudCk7Ci0JCQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQkJCWZMZW5ndGggPSBsZW5ndGg7Ci0JCQkJfQotCi0JCQkJLyoqCi0JCQkJICogCi0JCQkJICogUmV0dXJucyB0cnVlIGlmIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgc21hbGxlciB0aGFuIDAuIEEKLQkJCQkgKiBzZWxlY3Rpb24gb2YgbGVuZ3RoIDAsIGlzIGEgdmFsaWQgdGV4dCBzZWxlY3Rpb24gYXMgaXQKLQkJCQkgKiBkZXNjcmliZXMsIGUuZy4sIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4gYSB2aWV3ZXIuCi0JCQkJICogCi0JCQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlbGVjdGlvbiBpcyBlbXB0eQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uI2lzRW1wdHkoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJCXJldHVybiBmT2Zmc2V0IDwgMCB8fCBmTGVuZ3RoIDwgMDsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRPZmZzZXQoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJCQlyZXR1cm4gZk9mZnNldDsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRMZW5ndGgoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCQlyZXR1cm4gZkxlbmd0aDsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRTdGFydExpbmUoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0U3RhcnRMaW5lKCkgewotCi0JCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCQkJCXJldHVybiBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJfQotCi0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRFbmRMaW5lKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGdldEVuZExpbmUoKSB7Ci0JCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IGVuZE9mZnNldCA9IGZPZmZzZXQgKyBmTGVuZ3RoOwotCQkJCQkJCWlmIChmTGVuZ3RoICE9IDApCi0JCQkJCQkJCWVuZE9mZnNldC0tOwotCQkJCQkJCXJldHVybiBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kT2Zmc2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uI2dldFRleHQoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgd2Vha0RvY3VtZW50LmdldCgpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIGRvY3VtZW50LmdldChmT2Zmc2V0LCBmTGVuZ3RoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCQlpZiAob2JqID09IHRoaXMpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCQlpZiAob2JqID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQlJbnRlcm5hbFRleHRTZWxlY3Rpb24gcyA9IChJbnRlcm5hbFRleHRTZWxlY3Rpb24pIG9iajsKLQkJCQkJYm9vbGVhbiBzYW1lUmFuZ2UgPSAocy5mT2Zmc2V0ID09IGZPZmZzZXQgJiYgcy5mTGVuZ3RoID09IGZMZW5ndGgpOwotCQkJCQlpZiAoc2FtZVJhbmdlKSB7Ci0KLQkJCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQkJCUlEb2N1bWVudCBzRG9jdW1lbnQgPSBzLmdldERvY3VtZW50KCk7Ci0KLQkJCQkJCS8vIElTU1VFOiB3aHkgZG9lcyBub3QgSURvY3VtZW50IC5lcXVhbHMgc3VmZmljZT8KLQkJCQkJCWlmIChzRG9jdW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudCA9PSBudWxsKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJaWYgKHNEb2N1bWVudCA9PSBudWxsIHx8IGRvY3VtZW50ID09IG51bGwpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJCQl0cnkgewotCQkJCQkJCS8vIElTU1VFOiBwcmljZXkhIChhIGNhY2hlZCBoYXNoIG1pZ2h0IGJlIGluIG9yZGVyLCBpZiB0aGlzIAotCQkJCQkJCS8vIHdhcyBldmVyIHJlYWxseSBldmVyIHVzZWQgdmVyeSBvZnRlbi4KLQkJCQkJCQlTdHJpbmcgc0NvbnRlbnQgPSBzRG9jdW1lbnQuZ2V0KGZPZmZzZXQsIGZMZW5ndGgpOwotCQkJCQkJCVN0cmluZyBjb250ZW50ID0gZG9jdW1lbnQuZ2V0KGZPZmZzZXQsIGZMZW5ndGgpOwotCQkJCQkJCXJldHVybiBzQ29udGVudC5lcXVhbHMoY29udGVudCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCQkJCS8vIHJldHVybiBmYWxzZSwgY2FuIG5vdCBiZSBlcXVhbAotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSB3ZWFrRG9jdW1lbnQuZ2V0KCk7Ci0JCQkJCWludCBsb3cgPSBkb2N1bWVudCAhPSBudWxsID8gZG9jdW1lbnQuaGFzaENvZGUoKSA6IDA7Ci0JCQkJCXJldHVybiAoZk9mZnNldCA8PCAyNCkgfCAoZkxlbmd0aCA8PCAxNikgfCBsb3c7Ci0JCQkJfQotCi0JCQkJcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCQkJCWlmICh3ZWFrRG9jdW1lbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQlyZXR1cm4gKElEb2N1bWVudCkgd2Vha0RvY3VtZW50LmdldCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQl9Ci0KLQotCQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U3RhcnRMaW5lKCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldEVuZExpbmUoKSB7Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uZ2V0RW5kTGluZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uZ2V0VGV4dCgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIHdlYWtEb2N1bWVudDsKLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlBhcmVudFByb3ZpZGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uID0gZmFsc2U7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcG9zdExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJcHJpdmF0ZSBJU2VsZWN0aW9uIGZMYXN0U2VsZWN0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGZMYXN0VXBkYXRlZFNlbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXByaXZhdGUgV2Vha1JlZmVyZW5jZSB3ZWFrRWRpdG9yOwotCi0KLQkJU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBwYXJlbnRQcm92aWRlciwgU3RydWN0dXJlZFRleHRFZGl0b3Igc3RydWN0dXJlZFRleHRFZGl0b3IpIHsKLQkJCWZQYXJlbnRQcm92aWRlciA9IHBhcmVudFByb3ZpZGVyOwotCQkJd2Vha0VkaXRvciA9IG5ldyBXZWFrUmVmZXJlbmNlKHN0cnVjdHVyZWRUZXh0RWRpdG9yKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJfQotCQkJZlBhcmVudFByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWlmIChmUGFyZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBmUGFyZW50UHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQloYW5kbGVQb3N0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJcG9zdExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCwgTGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCkgewotCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCQkJaXNGaXJpbmdTZWxlY3Rpb24gPSB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGwgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWwuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCWlzRmlyaW5nU2VsZWN0aW9uID0gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIElTZWxlY3Rpb25Qcm92aWRlciBnZXRQYXJlbnRQcm92aWRlcigpIHsKLQkJCXJldHVybiBmUGFyZW50UHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQlmTGFzdFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlmTGFzdFNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLQkJCWZMYXN0VXBkYXRlZFNlbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0KLQkJCS8qCi0JCQkgKiBXaGVuIGEgY2xpZW50IGV4cGxpY2l0bHkgYXNrcyBmb3Igc2VsZWN0aW9uLCBwcm92aWRlIHRoZSBoeWJyaWQKLQkJCSAqIHJlc3VsdC4KLQkJCSAqLwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRQYXJlbnRQcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgbG9jYWxFZGl0b3IgPSBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCQkJCWlmIChsb2NhbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsID0gbG9jYWxFZGl0b3IuZ2V0TW9kZWwoKTsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uLCBnZXREb2N1bWVudCgpLCBtb2RlbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24sIGdldERvY3VtZW50KCksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzZWxlY3Rpb247Ci0JCX0KLQotCQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGdldFN0cnVjdHVyZWRUZXh0RWRpdG9yKCkgewotCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yID0gbnVsbDsKLQkJCWlmICh3ZWFrRWRpdG9yICE9IG51bGwpIHsKLQkJCQllZGl0b3IgPSAoU3RydWN0dXJlZFRleHRFZGl0b3IpIHdlYWtFZGl0b3IuZ2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWRpdG9yOwotCQl9Ci0KLQkJdm9pZCBoYW5kbGVQb3N0U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCB1cGRhdGVkRXZlbnQgPSBudWxsOwotCQkJaWYgKGZMYXN0U2VsZWN0aW9uID09IGV2ZW50LmdldFNlbGVjdGlvbigpICYmIGZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgPT0gZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkgewotCQkJCXVwZGF0ZWRFdmVudCA9IGZMYXN0VXBkYXRlZFNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXVwZGF0ZWRFdmVudCA9IHVwZGF0ZUV2ZW50KGV2ZW50KTsKLQkJCX0KLQkJCS8vIG9ubHkgdXBkYXRlIHRoZSByYW5nZSBpbmRpY2F0b3Igb24gcG9zdCBzZWxlY3Rpb24KLQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGxvY2FsRWRpdG9yID0gKFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB3ZWFrRWRpdG9yLmdldCgpOwotCi0JCQlpZiAobG9jYWxFZGl0b3IgIT0gbnVsbCkgewotCQkJCWxvY2FsRWRpdG9yLnVwZGF0ZVJhbmdlSW5kaWNhdGlvbih1cGRhdGVkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKHVwZGF0ZWRFdmVudCwgcG9zdExpc3RlbmVycyk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgdXBkYXRlZEV2ZW50ID0gZXZlbnQ7Ci0JCQlpZiAoZkxhc3RTZWxlY3Rpb24gIT0gZXZlbnQuZ2V0U2VsZWN0aW9uKCkgfHwgZkxhc3RTZWxlY3Rpb25Qcm92aWRlciAhPSBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKSB7Ci0JCQkJZkxhc3RTZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmTGFzdFNlbGVjdGlvblByb3ZpZGVyID0gZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCQlmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSB1cGRhdGVkRXZlbnQgPSB1cGRhdGVFdmVudChldmVudCk7Ci0JCQl9Ci0JCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZCh1cGRhdGVkRXZlbnQsIGxpc3RlbmVycyk7Ci0JCX0KLQotCQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKHdlYWtEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURvY3VtZW50KSB3ZWFrRG9jdW1lbnQuZ2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCX0KLQotCi0JCWJvb2xlYW4gaXNGaXJpbmdTZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gaXNGaXJpbmdTZWxlY3Rpb247Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkvLyBJU1NVRTogaXMgbm90IGNsZWFyIGRlZmF1bHQgYmVoYXZpb3Igc2hvdWxkIGJlIHRydWU/Ci0JCQkvLyBCdXQgbm90IGNsZWFyIGlzIHRoaXMgZGVmYXVsdCB3b3VsZCBhcHBseSBmb3Igb3VyIGVkaXRvci4KLQkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJCS8vIGlmIGVkaXRvciBpcyAiZ29uZSIsIGNhbiBub3QgYmUgdmFsaWQKLQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGUgPSBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOyAKLQkJCWlmIChlID09IG51bGwgfHwgZS5mRWRpdG9yRGlzcG9zZWQpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIGVsc2UgZGVmZXIgdG8gcGFyZW50Ci0JCQllbHNlIGlmIChnZXRQYXJlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSVNlbGVjdGlvblZhbGlkYXRvcikgewotCQkJCXJlc3VsdCA9ICgoSVNlbGVjdGlvblZhbGlkYXRvcikgZ2V0UGFyZW50UHJvdmlkZXIoKSkuaXNWYWxpZChzZWxlY3Rpb24pOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJcG9zdExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoaXNGaXJpbmdTZWxlY3Rpb24oKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZkxhc3RTZWxlY3Rpb24gPSBudWxsOwotCQkJZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCQlmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCi0JCQlJU2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSB1cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCWdldFBhcmVudFByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKHRleHRTZWxlY3Rpb24pOwotCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgbG9jYWxFZGl0b3IgPSBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCQkJaWYgKGxvY2FsRWRpdG9yICE9IG51bGwpIHsKLQkJCQlsb2NhbEVkaXRvci51cGRhdGVSYW5nZUluZGljYXRpb24odGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIGEgY29ycmVzcG9uZGluZyBldmVudCB0aGF0IGNvbnRhaW5zIGEKLQkJICogU3RydWN0dXJlZFRleHRzZWxlY3Rpb24KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZWRFdmVudCB1cGRhdGVFdmVudChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24gJiYgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgbG9jYWxFZGl0b3IgPSBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCQkJCWlmIChsb2NhbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCXN0cnVjdHVyZWRNb2RlbCA9IGxvY2FsRWRpdG9yLmdldEludGVybmFsTW9kZWwoKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCksIGdldERvY3VtZW50KCksIHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQl9Ci0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgbmV3RXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCksIHNlbGVjdGlvbik7Ci0JCQlyZXR1cm4gbmV3RXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIGEgY29ycmVzcG9uZGluZyBTdHJ1Y3R1cmVkVGV4dHNlbGVjdGlvbgotCQkgKiAKLQkJICogQHBhcmFtIHNlbGVjdGlvbgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIElTZWxlY3Rpb24gdXBkYXRlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlJU2VsZWN0aW9uIHVwZGF0ZWQgPSBzZWxlY3Rpb247Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQkJaW50IHN0YXJ0ID0gLTE7Ci0JCQkJCWludCBsZW5ndGggPSAwOwotCi0JCQkJCS8vIG5vIG9yZGVyaW5nIGlzIGd1YXJhbnRlZWQgZm9yIG11bHRpcGxlIHNlbGVjdGlvbgotCQkJCQlPYmplY3QgbyA9IHNlbGVjdGVkT2JqZWN0c1swXTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJbmRleGVkUmVnaW9uKSBzZWxlY3RlZE9iamVjdHNbaV0pLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSW5kZXhlZFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJaW50IGVuZCA9ICgoSVRleHRSZWdpb24pIG8pLmdldEVuZCgpOwotCQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJVGV4dFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRTdGFydCgpKTsKLQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKElUZXh0UmVnaW9uKSBzZWxlY3RlZE9iamVjdHNbaV0pLmdldEVuZCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoc3RhcnQgPiAtMSkgewotCQkJCQkJdXBkYXRlZCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbihnZXREb2N1bWVudCgpLCBzdGFydCwgbGVuZ3RoLCBzZWxlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHVwZGF0ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCXdlYWtEb2N1bWVudCA9IG5ldyBXZWFrUmVmZXJlbmNlKGRvY3VtZW50KTsKLQkJfQotCX0KLQotCWNsYXNzIFRpbWVPdXRFeHBpcmVkIGV4dGVuZHMgVGltZXJUYXNrIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXREaXNwbGF5KCkgIT0gbnVsbCAmJiAhZ2V0RGlzcGxheSgpLmlzRGlzcG9zZWQoKSkKLQkJCQkJCWVuZEJ1c3lTdGF0ZUludGVybmFsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29uZmlndXJhdGlvbkFuZFRhcmdldCB7Ci0JCXByaXZhdGUgU3RyaW5nIGZUYXJnZXRJZDsKLQkJcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQkJcHVibGljIENvbmZpZ3VyYXRpb25BbmRUYXJnZXQoU3RyaW5nIHRhcmdldElkLCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQlmVGFyZ2V0SWQgPSB0YXJnZXRJZDsKLQkJCWZDb25maWd1cmF0aW9uID0gY29uZmlnOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUYXJnZXRJZCgpIHsKLQkJCXJldHVybiBmVGFyZ2V0SWQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjdGlvbiBiZWhhdmVzIGluIHR3byBkaWZmZXJlbnQgd2F5czogSWYgdGhlcmUgaXMgbm8gY3VycmVudCB0ZXh0Ci0JICogaG92ZXIsIHRoZSBqYXZhZG9jIGlzIGRpc3BsYXllZCB1c2luZyBpbmZvcm1hdGlvbiBwcmVzZW50ZXIuIElmIHRoZXJlCi0JICogaXMgYSBjdXJyZW50IHRleHQgaG92ZXIsIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGEgaW5mb3JtYXRpb24gcHJlc2VudGVyCi0JICogaW4gb3JkZXIgdG8gbWFrZSBpdCBzdGlja3kuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5KYXZhRWRpdG9yI0luZm9ybWF0aW9uRGlzcGF0Y2hBY3Rpb24KLQkgKi8KLQljbGFzcyBJbmZvcm1hdGlvbkRpc3BhdGNoQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0KLQkJLyoqIFRoZSB3cmFwcGVkIHRleHQgb3BlcmF0aW9uIGFjdGlvbi4gKi8KLQkJcHJpdmF0ZSBmaW5hbCBUZXh0T3BlcmF0aW9uQWN0aW9uIGZUZXh0T3BlcmF0aW9uQWN0aW9uOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgZGlzcGF0Y2ggYWN0aW9uLgotCQkgKiAKLQkJICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIGJ1bmRsZQotCQkgKiBAcGFyYW0gcHJlZml4Ci0JCSAqICAgICAgICAgICAgdGhlIHByZWZpeAotCQkgKiBAcGFyYW0gdGV4dE9wZXJhdGlvbkFjdGlvbgotCQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IG9wZXJhdGlvbiBhY3Rpb24KLQkJICovCi0JCXB1YmxpYyBJbmZvcm1hdGlvbkRpc3BhdGNoQWN0aW9uKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBTdHJpbmcgcHJlZml4LCBmaW5hbCBUZXh0T3BlcmF0aW9uQWN0aW9uIHRleHRPcGVyYXRpb25BY3Rpb24pIHsKLQkJCXN1cGVyKHJlc291cmNlQnVuZGxlLCBwcmVmaXgsIFN0cnVjdHVyZWRUZXh0RWRpdG9yLnRoaXMpOwotCQkJaWYgKHRleHRPcGVyYXRpb25BY3Rpb24gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQlmVGV4dE9wZXJhdGlvbkFjdGlvbiA9IHRleHRPcGVyYXRpb25BY3Rpb247Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHNvdXJjZVZpZXdlciA9PSBudWxsKSB7Ci0JCQkJZlRleHRPcGVyYXRpb25BY3Rpb24ucnVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb240KSB7Ci0JCQkJSVRleHRWaWV3ZXJFeHRlbnNpb240IGV4dGVuc2lvbjQgPSAoSVRleHRWaWV3ZXJFeHRlbnNpb240KSBzb3VyY2VWaWV3ZXI7Ci0JCQkJaWYgKGV4dGVuc2lvbjQubW92ZUZvY3VzVG9XaWRnZXRUb2tlbigpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICghKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikpIHsKLQkJCQlmVGV4dE9wZXJhdGlvbkFjdGlvbi5ydW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uMiB0ZXh0Vmlld2VyRXh0ZW5zaW9uMiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjIpIHNvdXJjZVZpZXdlcjsKLQotCQkJLy8gZG9lcyBhIHRleHQgaG92ZXIgZXhpc3Q/Ci0JCQlJVGV4dEhvdmVyIHRleHRIb3ZlciA9IHRleHRWaWV3ZXJFeHRlbnNpb24yLmdldEN1cnJlbnRUZXh0SG92ZXIoKTsKLQkJCWlmICh0ZXh0SG92ZXIgPT0gbnVsbCkgewotCQkJCWZUZXh0T3BlcmF0aW9uQWN0aW9uLnJ1bigpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJUG9pbnQgaG92ZXJFdmVudExvY2F0aW9uID0gdGV4dFZpZXdlckV4dGVuc2lvbjIuZ2V0SG92ZXJFdmVudExvY2F0aW9uKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gY29tcHV0ZU9mZnNldEF0TG9jYXRpb24oc291cmNlVmlld2VyLCBob3ZlckV2ZW50TG9jYXRpb24ueCwgaG92ZXJFdmVudExvY2F0aW9uLnkpOwotCQkJaWYgKG9mZnNldCA9PSAtMSkgewotCQkJCWZUZXh0T3BlcmF0aW9uQWN0aW9uLnJ1bigpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkvLyBnZXQgdGhlIHRleHQgaG92ZXIgY29udGVudAotCQkJCVN0cmluZyBjb250ZW50VHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUoc291cmNlVmlld2VyLmdldERvY3VtZW50KCksIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgdHJ1ZSk7Ci0KLQkJCQlJUmVnaW9uIGhvdmVyUmVnaW9uID0gdGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHNvdXJjZVZpZXdlciwgb2Zmc2V0KTsKLQkJCQlpZiAoaG92ZXJSZWdpb24gPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJU3RyaW5nIGhvdmVySW5mbyA9IHRleHRIb3Zlci5nZXRIb3ZlckluZm8oc291cmNlVmlld2VyLCBob3ZlclJlZ2lvbik7Ci0KLQkJCQlJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBjb250cm9sQ3JlYXRvciA9IG51bGw7Ci0JCQkJaWYgKHRleHRIb3ZlciBpbnN0YW5jZW9mIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uMikKLQkJCQkJY29udHJvbENyZWF0b3IgPSAoKElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uMikgdGV4dEhvdmVyKS5nZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKCk7Ci0KLQkJCQlJSW5mb3JtYXRpb25Qcm92aWRlciBpbmZvcm1hdGlvblByb3ZpZGVyID0gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXIoaG92ZXJSZWdpb24sIGhvdmVySW5mbywgY29udHJvbENyZWF0b3IpOwotCi0JCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLnNldE9mZnNldChvZmZzZXQpOwotCQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIuc2V0SW5mb3JtYXRpb25Qcm92aWRlcihpbmZvcm1hdGlvblByb3ZpZGVyLCBjb250ZW50VHlwZSk7Ci0JCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLnNob3dJbmZvcm1hdGlvbigpOwotCi0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIE5vIGdvb2QgaW5mb3JtYXRpb24gdG8gZGlzcGxheQotCQkJfQotCQl9Ci0KLQkJLy8gbW9kaWZpZWQgdmVyc2lvbiBmcm9tIFRleHRWaWV3ZXIKLQkJcHJpdmF0ZSBpbnQgY29tcHV0ZU9mZnNldEF0TG9jYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IHgsIGludCB5KSB7Ci0KLQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCXRyeSB7Ci0JCQkJaW50IHdpZGdldExvY2F0aW9uID0gc3R5bGVkVGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCh4LCB5KSk7Ci0JCQkJaWYgKHRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHRleHRWaWV3ZXI7Ci0JCQkJCXJldHVybiBleHRlbnNpb24ud2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KHdpZGdldExvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlSZWdpb24gdmlzaWJsZVJlZ2lvbiA9IHRleHRWaWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJCQlyZXR1cm4gd2lkZ2V0TG9jYXRpb24gKyB2aXNpYmxlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXJbXSBCUkFDS0VUUyA9IHsneycsICd9JywgJygnLCAnKScsICdbJywgJ10nfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQlVTWV9TVEFURV9ERUxBWSA9IDEwMDA7Ci0JLyoqCi0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTlRFWFRfTUVOVV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yLkVkaXRvckNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9DT05URVhUX01FTlVfU1VGRklYID0gIi5zb3VyY2UuRWRpdG9yQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKiogTm9uLU5MUyBzdHJpbmdzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9LRVlCSU5ESU5HX1NDT1BFX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUVfQURESVRJT05TID0gImFkZGl0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUVfRk9STUFUID0gIkZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUVfRk9STUFUX0VYVCA9ICJGb3JtYXQuZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fQUNUSU9OX0RFU0MgPSBTU0VVSU1lc3NhZ2VzLlJlZG9fX18wX19fVUlfOyAvLyROT04tTkxTLTEkID0gIlJlZG86IHswfS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fQUNUSU9OX0RFU0NfREVGQVVMVCA9IFNTRVVJTWVzc2FnZXMuUmVkb19UZXh0X0NoYW5nZV9fVUlfOyAvLyROT04tTkxTLTEkID0gIlJlZG8gVGV4dCBDaGFuZ2UuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPX0FDVElPTl9URVhUID0gU1NFVUlNZXNzYWdlcy5fUmVkb19fMF9fX0N0cmxfWV9VSV87IC8vJE5PTi1OTFMtMSQgPSAiJlJlZG8gezB9IEBDdHJsK1kiCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fQUNUSU9OX1RFWFRfREVGQVVMVCA9IFNTRVVJTWVzc2FnZXMuX1JlZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWV9VSV87IC8vJE5PTi1OTFMtMSQgPSAiJlJlZG8gVGV4dCBDaGFuZ2UgQEN0cmwrWSIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVMRVJfQ09OVEVYVF9NRU5VX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IuUnVsZXJDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVUxFUl9DT05URVhUX01FTlVfU1VGRklYID0gIi5zb3VyY2UuUnVsZXJDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVSU0NPUkUgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkvKiogVHJhbnNsYXRhYmxlIHN0cmluZ3MgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19BQ1RJT05fREVTQyA9IFNTRVVJTWVzc2FnZXMuVW5kb19fXzBfX19VSV87IC8vJE5PTi1OTFMtMSQgPSAiVW5kbzogezB9LiIKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0FDVElPTl9ERVNDX0RFRkFVTFQgPSBTU0VVSU1lc3NhZ2VzLlVuZG9fVGV4dF9DaGFuZ2VfX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJVbmRvIFRleHQgQ2hhbmdlLiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19BQ1RJT05fVEVYVCA9IFNTRVVJTWVzc2FnZXMuX1VuZG9fXzBfX19DdHJsX1pfVUlfOyAvLyROT04tTkxTLTEkID0gIiZVbmRvIHswfSBAQ3RybCtaIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0FDVElPTl9URVhUX0RFRkFVTFQgPSBTU0VVSU1lc3NhZ2VzLl9VbmRvX1RleHRfQ2hhbmdlX19DdHJsX1pfVUlfOyAvLyROT04tTkxTLTEkID0gIiZVbmRvIFRleHQgQ2hhbmdlIEBDdHJsK1oiCi0JLy8gZGV2ZWxvcG1lbnQgdGltZS9kZWJ1ZyB2YXJpYWJsZXMgb25seQotCXByaXZhdGUgaW50IGFkYXB0ZXJSZXF1ZXN0czsKLQotCXByaXZhdGUgbG9uZyBhZGFwdGVyVGltZTsKLQlwcml2YXRlIGJvb2xlYW4gZkJhY2tncm91bmRKb2JFbmRlZDsKLQlwcml2YXRlIGJvb2xlYW4gZkJ1c3lTdGF0ZTsKLQlwcml2YXRlIFRpbWVyIGZCdXN5VGltZXI7Ci0JUnVubmFibGUgZkN1cnJlbnRSdW5uYWJsZSA9IG51bGw7Ci0JYm9vbGVhbiBmRGlydHlCZWZvcmVEb2N1bWVudEV2ZW50ID0gZmFsc2U7Ci0JcHJpdmF0ZSBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyIGZEcm9wQWRhcHRlcjsKLQlwcml2YXRlIERyb3BUYXJnZXQgZkRyb3BUYXJnZXQ7Ci0JYm9vbGVhbiBmRWRpdG9yRGlzcG9zZWQgPSBmYWxzZTsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3JQYXJ0OwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcjsKLQlwcml2YXRlIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQlwcml2YXRlIE1vdXNlVHJhY2tlciBmTW91c2VUcmFja2VyOwotCXByaXZhdGUgSUNvbnRlbnRPdXRsaW5lUGFnZSBmT3V0bGluZVBhZ2U7Ci0KLQlwcml2YXRlIE91dGxpbmVQYWdlTGlzdGVuZXIgZk91dGxpbmVQYWdlTGlzdGVuZXIgPSBudWxsOwotCS8qKiBUaGlzIGVkaXRvcidzIHByb2plY3Rpb24gbW9kZWwgdXBkYXRlciAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyOwotCS8qKiBUaGlzIGVkaXRvcidzIHByb2plY3Rpb24gc3VwcG9ydCAqLwotCXByaXZhdGUgUHJvamVjdGlvblN1cHBvcnQgZlByb2plY3Rpb25TdXBwb3J0OwotCXByaXZhdGUgSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQlwcml2YXRlIFN0cmluZyBmUmVtZW1iZXJUaXRsZTsKLQkvKiogVGhlIHJ1bGVyIGNvbnRleHQgbWVudSB0byBiZSBkaXNwb3NlZC4gKi8KLQlwcml2YXRlIE1lbnUgZlJ1bGVyQ29udGV4dE1lbnU7Ci0JLyoqIFRoZSBydWxlciBjb250ZXh0IG1lbnUgbWFuYWdlciB0byBiZSBkaXNwb3NlZC4gKi8KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIGZSdWxlckNvbnRleHRNZW51TWFuYWdlcjsKLQotCVN0cmluZ1tdIGZTaG93SW5UYXJnZXRJZHMgPSBuZXcgU3RyaW5nW117SVBhZ2VMYXlvdXQuSURfUkVTX05BVn07Ci0KLQlwcml2YXRlIElBY3Rpb24gZlNob3dQcm9wZXJ0aWVzQWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZlN0cnVjdHVyZWRNb2RlbDsKLQlTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JLyoqIFRoZSB0ZXh0IGNvbnRleHQgbWVudSB0byBiZSBkaXNwb3NlZC4gKi8KLQlwcml2YXRlIE1lbnUgZlRleHRDb250ZXh0TWVudTsKLQkvKiogVGhlIHRleHQgY29udGV4dCBtZW51IG1hbmFnZXIgdG8gYmUgZGlzcG9zZWQuICovCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBmVGV4dENvbnRleHRNZW51TWFuYWdlcjsKLQlwcml2YXRlIFN0cmluZyBmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkOwotCS8qKiBUaGUgc2VsZWN0aW9uIGhpc3Rvcnkgb2YgdGhlIGVkaXRvciAqLwotCXByaXZhdGUgU2VsZWN0aW9uSGlzdG9yeSBmU2VsZWN0aW9uSGlzdG9yeTsKLQkvKiogVGhlIGluZm9ybWF0aW9uIHByZXNlbnRlci4gKi8KLQlwcml2YXRlIEluZm9ybWF0aW9uUHJlc2VudGVyIGZJbmZvcm1hdGlvblByZXNlbnRlcjsKLQlwcml2YXRlIGJvb2xlYW4gZlVwZGF0ZU1lbnVUZXh0UGVuZGluZzsKLQlpbnQgaG92ZXJYID0gLTE7Ci0JaW50IGhvdmVyWSA9IC0xOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZENsb3NlID0gZmFsc2U7Ci0JcHJpdmF0ZSBsb25nIHN0YXJ0UGVyZlRpbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZpc1JlbGVhc2VkOwotCS8qKgotCSAqIFRoZSBhY3Rpb24gZ3JvdXAgZm9yIGZvbGRpbmcuCi0JICovCi0JcHJpdmF0ZSBGb2xkaW5nQWN0aW9uR3JvdXAgZkZvbGRpbmdHcm91cDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgU3RydWN0dXJlZCBUZXh0IEVkaXRvci4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemVEb2N1bWVudFByb3ZpZGVyKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhYm91dFRvU2F2ZU1vZGVsKCkgewotCQlpZiAoZ2V0SW50ZXJuYWxNb2RlbCgpICE9IG51bGwpIHsKLQkJCWdldEludGVybmFsTW9kZWwoKS5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhYnN0cmFjdFRleHRFZGl0b3JDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfVU5ETykpOwotCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfU0FWRSkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0NPUFkpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9QUklOVCkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9GSU5EKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HUk9VUF9BREQpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9SRVNUKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlpZiAoaXNFZGl0YWJsZSgpKSB7Ci0JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfVU5ETywgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETyk7Ci0JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfVU5ETywgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVWRVJUX1RPX1NBVkVEKTsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9TQVZFLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TQVZFKTsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DVVQpOwotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0NPUFksIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNPUFkpOwotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0NPUFksIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlBBU1RFKTsKLQkJfQotCQllbHNlIHsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DT1BZKTsKLQkJfQotCi0JCS8vIGZyb20gQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yCi0JCUlBY3Rpb24gcHJlZmVyZW5jZXNBY3Rpb24gPSBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ09OVEVYVF9QUkVGRVJFTkNFUyk7Ci0JCW1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9TRVRUSU5HUykpOwotCQltZW51LmFwcGVuZFRvR3JvdXAoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfU0VUVElOR1MsIHByZWZlcmVuY2VzQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZXh0TWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gT25seSBvZmZlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZSB0ZXh0IGlmIHRoZSB2aWV3ZXIgYWxsb3dzCi0JCS8vIG1vZGlmaWNhdGlvbiBhbmQgc3VwcG9ydHMgYW55IG9mIHRoZXNlIG9wZXJhdGlvbnMKLQkJSUFjdGlvbiBmb3JtYXRBbGwgPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UKTsKLQkJSUFjdGlvbiBmb3JtYXRTZWxlY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JCUlBY3Rpb24gY2xlYW51cEFsbCA9IGdldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DTEVBTlVQX0RPQ1VNRU5UKTsKLQkJYm9vbGVhbiBlbmFibGVGb3JtYXRNZW51ID0gKGZvcm1hdEFsbCAhPSBudWxsICYmIGZvcm1hdEFsbC5pc0VuYWJsZWQoKSkgfHwgKGZvcm1hdFNlbGVjdGlvbiAhPSBudWxsICYmIGZvcm1hdFNlbGVjdGlvbi5pc0VuYWJsZWQoKSkgfHwgKGNsZWFudXBBbGwgIT0gbnVsbCAmJiBjbGVhbnVwQWxsLmlzRW5hYmxlZCgpKTsKLQotCQlpZiAoZ2V0U291cmNlVmlld2VyKCkuaXNFZGl0YWJsZSgpICYmIGVuYWJsZUZvcm1hdE1lbnUpIHsKLQkJCVN0cmluZyBsYWJlbCA9IFNTRVVJTWVzc2FnZXMuRm9ybWF0TWVudV9sYWJlbDsgLy8kTk9OLU5MUy0xJCA9ICJGb3JtYXQiCi0JCQlNZW51TWFuYWdlciBzdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGxhYmVsLCBHUk9VUF9OQU1FX0ZPUk1BVCk7Ci0JCQlzdWJNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoR1JPVVBfTkFNRV9GT1JNQVRfRVhUKSk7Ci0JCQlhZGRBY3Rpb24oc3ViTWVudSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UKTsKLQkJCWFkZEFjdGlvbihzdWJNZW51LCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQkJCXN1Yk1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihHUk9VUF9OQU1FX0FERElUSU9OUykpOwotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIHN1Yk1lbnUpOwotCQl9Ci0KLQkJLy8gU29tZSBEZXNpZ24gZWRpdG9ycyAoRFREKSByZWx5IG9uIHRoaXMgdmlldyBmb3IgdGhlaXIgb3duIHVzZXMKLQkJbWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR1JPVVBfQURELCBmU2hvd1Byb3BlcnRpZXNBY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlbmRlZENvbnRleHRNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgYyA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQlpZiAoYyBpbnN0YW5jZW9mIElQb3B1cE1lbnVDb250cmlidXRvcikgewotCQkJKChJUG9wdXBNZW51Q29udHJpYnV0b3IpIGMpLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJfQotCQllbHNlIHsKLQkJCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQkJSUV4dGVuZGVkQ29udHJpYnV0b3IgcG1jID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkpOwotCQkJaWYgKHBtYyAhPSBudWxsKSB7Ci0JCQkJcG1jLnNldEFjdGl2ZUVkaXRvcih0aGlzKTsKLQkJCQlwbWMuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZW5kZWRSdWxlckNvbnRleHRNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBub25lIGF0IHRoaXMgbGV2ZWwKLQl9Ci0KLQotCi0JLyoqCi0JICogU3RhcnRzIGJhY2tncm91bmQgbW9kZS4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKi8KLQl2b2lkIGJlZ2luQmFja2dyb3VuZE9wZXJhdGlvbigpIHsKLQkJZkJhY2tncm91bmRKb2JFbmRlZCA9IGZhbHNlOwotCQkvLyBpZiBhbHJlYWR5IGluIGJ1c3kgc3RhdGUsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJLy8gYW5kLCB3ZSBvbmx5IHN0YXJ0LCBvciByZXNldCwgdGhlIHRpbWVkIGJ1c3kKLQkJLy8gc3RhdGUgd2hlbiB3ZSBnZXQgdGhlICJlbmRCYWNrZ3JvdW5kT3BlcmF0aW9uIiBjYWxsLgotCQlpZiAoIWluQnVzeVN0YXRlKCkpIHsKLQkJCWJlZ2luQnVzeVN0YXRlSW50ZXJuYWwoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpbkJ1c3lTdGF0ZUludGVybmFsKCkgewotCi0JCWZCdXN5U3RhdGUgPSB0cnVlOwotCQlzdGFydEJ1c3lUaW1lcigpOwotCi0JCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgewotCQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5iZWdpbkJhY2tncm91bmRVcGRhdGUoKTsKLQotCQl9Ci0JCXNob3dCdXN5KHRydWUpOwotCX0KLQotCS8vIHByaXZhdGUgdm9pZCBhZGRGaW5kT2NjdXJyZW5jZXNBY3Rpb24oU3RyaW5nIG1hdGNoVHlwZSwgU3RyaW5nCi0JLy8gbWF0Y2hUZXh0LCBJTWVudU1hbmFnZXIgbWVudSkgewotCS8vCi0JLy8gQWJzdHJhY3RGaW5kT2NjdXJyZW5jZXNBY3Rpb24gYWN0aW9uID0gbmV3Ci0JLy8gQWJzdHJhY3RGaW5kT2NjdXJyZW5jZXNBY3Rpb24oZ2V0RmlsZUluRWRpdG9yKCksIG5ldwotCS8vIFNlYXJjaFVJQ29uZmlndXJhdGlvbigpLCAoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0RG9jdW1lbnQoKSwKLQkvLyBtYXRjaFR5cGUsIG1hdGNoVGV4dCwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCS8vIGFjdGlvbi5zZXRUZXh0KCJPY2N1cnJlbmNlcyBvZiBcIiIgKyBtYXRjaFRleHQgKyAiXCIgaW4gRmlsZSIpOwotCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9FRElULCBhY3Rpb24pOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvciNjbG9zZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKGZpbmFsIGJvb2xlYW4gc2F2ZSkgewotCQkvKgotCQkgKiBJbnN0ZWFkIG9mIHVzIGNsb3NpbmcgZGlyZWN0bHksIHdlIGhhdmUgdG8gY2xvc2Ugd2l0aCBvdXIKLQkJICogY29udGFpbmluZyAobXVsdGlwYWdlKSBlZGl0b3IsIGlmIGl0IGV4aXN0cy4KLQkJICovCi0JCWlmIChnZXRTaXRlKCkgPT0gbnVsbCkgewotCQkJLy8gaWYgc2l0ZSBoYXNuJ3QgYmVlbiBzZXQgeWV0LCB0aGVuIHdlJ3JlIG5vdAotCQkJLy8gY29tcGxldGVseSBvcGVuCi0JCQkvLyBzbyBzZXQgYSBmbGFnIG5vdCB0byBvcGVuCi0JCQlzaG91bGRDbG9zZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0RWRpdG9yUGFydCgpICE9IG51bGwpIHsKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoZ2V0RWRpdG9yUGFydCgpLCBzYXZlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3VwZXIuY2xvc2Uoc2F2ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yI2NvbGxlY3RDb250ZXh0TWVudVByZWZlcmVuY2VQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbGxlY3RDb250ZXh0TWVudVByZWZlcmVuY2VQYWdlcygpIHsKLQkJTGlzdCBhbGxJZHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCS8vIGdldCBjb250cmlidXRlZCBwcmVmZXJlbmNlIHBhZ2VzCi0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gY29uZmlndXJhdGlvbklkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBkZWZpbml0aW9ucyA9IGJ1aWxkZXIuZ2V0RGVmaW5pdGlvbnMoInByZWZlcmVuY2VwYWdlcyIsIGNvbmZpZ3VyYXRpb25JZHNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlZmluaXRpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3RyaW5nIHNvbWVJZHMgPSBkZWZpbml0aW9uc1tqXTsKLQkJCQlpZiAoc29tZUlkcyAhPSBudWxsICYmIHNvbWVJZHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCS8vIHN1cHBvcnRzIG11bHRpcGxlIGNvbW1hLWRlbGltaXRlZCBwYWdlIElEcyBpbiBvbmUKLQkJCQkJLy8gZWxlbWVudAotCQkJCQlTdHJpbmdbXSBpZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc29tZUlkcyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQkJCQlTdHJpbmcgaWQgPSBpZHNba10udHJpbSgpOwotCQkJCQkJaWYgKCFhbGxJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJYWxsSWRzLmFkZChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgcGFnZXMgY29udHJpYnV0ZWQgYnkgc3VwZXIKLQkJU3RyaW5nW10gc3VwZXJQYWdlcyA9IHN1cGVyLmNvbGxlY3RDb250ZXh0TWVudVByZWZlcmVuY2VQYWdlcygpOwotCQlmb3IgKGludCBtID0gMDsgbSA8IHN1cGVyUGFnZXMubGVuZ3RoOyBtKyspIHsKLQkJCS8vIHRyaW0sIGp1c3QgdG8ga2VlcCB0aGluZ3MgY2xlYW4KLQkJCVN0cmluZyBpZCA9IHN1cGVyUGFnZXNbbV0udHJpbSgpOwotCQkJaWYgKCFhbGxJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJYWxsSWRzLmFkZChpZCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKFN0cmluZ1tdKSBhbGxJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlIGFuZCBzZXQgZG91YmxlLWNsaWNrIGFjdGlvbiBmb3IgdGhlIHZlcnRpY2FsIHJ1bGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVBbmRTZXREb3VibGVDbGlja0FjdGlvbigpIHsKLQkJLyoKLQkJICogTWFrZSBkb3VibGUtY2xpY2tpbmcgb24gdGhlIHJ1bGVyIHRvZ2dsZSBhIGJyZWFrcG9pbnQgaW5zdGVhZCBvZgotCQkgKiB0b2dnbGluZyBhIGJvb2ttYXJrLiBGb3IgbGluZXMgd2hlcmUgYSBicmVha3BvaW50IHdvbid0IGJlIGNyZWF0ZWQsCi0JCSAqIGNyZWF0ZSBhIGJvb2ttYXJrIHRocm91Z2ggdGhlIGNvbnRyaWJ1dGVkIFJ1bGVyRG91YmxlQ2xpY2sgYWN0aW9uLgotCQkgKi8KLQkJc2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJVTEVSX0RPVUJMRV9DTElDSywgbmV3IFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpLCBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUlVMRVJfRE9VQkxFX0NMSUNLKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5FeHRlbmRlZFRleHRFZGl0b3IjY29uZmlndXJlU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Tb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydChTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCBzdXBwb3J0KSB7Ci0JCXN1cHBvcnQuc2V0Q2hhcmFjdGVyUGFpck1hdGNoZXIoY3JlYXRlQ2hhcmFjdGVyUGFpck1hdGNoZXIoKSk7Ci0JCXN1cHBvcnQuc2V0TWF0Y2hpbmdDaGFyYWN0ZXJQYWludGVyUHJlZmVyZW5jZUtleXMoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuTUFUQ0hJTkdfQlJBQ0tFVFNfQ09MT1IpOwotCi0JCXN1cGVyLmNvbmZpZ3VyZVNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KHN1cHBvcnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkvLyBUZXh0VmlldyBBY3Rpb24gLSBtb3ZpbmcgdGhlIHNlbGVjdGVkIHRleHQgdG8KLQkJLy8gdGhlIGNsaXBib2FyZAotCQkvLyBvdmVycmlkZSB0aGUgY3V0L3Bhc3RlL2RlbGV0ZSBhY3Rpb24gdG8gbWFrZQotCQkvLyB0aGVtIHJ1biBvbiByZWFkLW9ubHkKLQkJLy8gZmlsZXMKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiRWRpdG9yX0N1dF8iLCB0aGlzLCBJVGV4dE9wZXJhdGlvblRhcmdldC5DVVQsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuQ1VUKTsKLQkJc2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNVVCwgYWN0aW9uKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLkNVVF9BQ1RJT04pOwotCQkvLyBUZXh0VmlldyBBY3Rpb24gLSBpbnNlcnRpbmcgdGhlIGNsaXBib2FyZAotCQkvLyBjb250ZW50IGF0IHRoZSBjdXJyZW50Ci0JCS8vIHBvc2l0aW9uCi0JCS8vIG92ZXJyaWRlIHRoZSBjdXQvcGFzdGUvZGVsZXRlIGFjdGlvbiB0byBtYWtlCi0JCS8vIHRoZW0gcnVuIG9uIHJlYWQtb25seQotCQkvLyBmaWxlcwotCQlhY3Rpb24gPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIkVkaXRvcl9QYXN0ZV8iLCB0aGlzLCBJVGV4dE9wZXJhdGlvblRhcmdldC5QQVNURSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5QQVNURSk7Ci0JCXNldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5QQVNURSwgYWN0aW9uKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLlBBU1RFX0FDVElPTik7Ci0JCS8vIFRleHRWaWV3IEFjdGlvbiAtIGRlbGV0aW5nIHRoZSBzZWxlY3RlZCB0ZXh0IG9yCi0JCS8vIGlmIHNlbGVjdGlvbiBpcwotCQkvLyBlbXB0eSB0aGUgY2hhcmFjdGVyIGF0IHRoZSByaWdodCBvZiB0aGUgY3VycmVudAotCQkvLyBwb3NpdGlvbgotCQkvLyBvdmVycmlkZSB0aGUgY3V0L3Bhc3RlL2RlbGV0ZSBhY3Rpb24gdG8gbWFrZQotCQkvLyB0aGVtIHJ1biBvbiByZWFkLW9ubHkKLQkJLy8gZmlsZXMKLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsICJFZGl0b3JfRGVsZXRlXyIsIHRoaXMsIElUZXh0T3BlcmF0aW9uVGFyZ2V0LkRFTEVURSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5ERUxFVEUpOwotCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuREVMRVRFLCBhY3Rpb24pOwotCQloZWxwU3lzdGVtLnNldEhlbHAoYWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuREVMRVRFX0FDVElPTik7Ci0JCS8vIFNvdXJjZVZpZXcgQWN0aW9uIC0gcmVxdWVzdGluZyBpbmZvcm1hdGlvbiBhdAotCQkvLyB0aGUgY3VycmVudCBpbnNlcnRpb24KLQkJLy8gcG9zaXRpb24KLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9JTkZPUk1BVElPTiArIFVOREVSU0NPUkUsIHRoaXMsIElTb3VyY2VWaWV3ZXIuSU5GT1JNQVRJT04sIHRydWUpOwotCQlhY3Rpb24gPSBuZXcgSW5mb3JtYXRpb25EaXNwYXRjaEFjdGlvbihTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0lORk9STUFUSU9OICsgVU5ERVJTQ09SRSwgKFRleHRPcGVyYXRpb25BY3Rpb24pIGFjdGlvbik7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5JTkZPUk1BVElPTik7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9JTkZPUk1BVElPTiwgYWN0aW9uKTsKLQkJbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfSU5GT1JNQVRJT04sIHRydWUpOwotCQkvLyBTb3VyY2VWaWV3IEFjdGlvbiAtIHJlcXVlc3RpbmcgY29udGVudCBhc3Npc3QgdG8KLQkJLy8gc2hvdyBjb21wbGV0ZXRpb24KLQkJLy8gcHJvcG9zYWxzIGZvciB0aGUgY3VycmVudCBpbnNlcnQgcG9zaXRpb24KLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTICsgVU5ERVJTQ09SRSwgdGhpcywgSVNvdXJjZVZpZXdlci5DT05URU5UQVNTSVNUX1BST1BPU0FMUywgdHJ1ZSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElIZWxwQ29udGV4dElkcy5DT05UTU5VX0NPTlRFTlRBU1NJU1RfSEVMUElEKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUywgdHJ1ZSk7Ci0JCS8vIFNvdXJjZVZpZXcgQWN0aW9uIC0gcmVxdWVzdGluZyBjb250ZW50IGFzc2lzdCB0bwotCQkvLyBzaG93IHRoZSBjb250ZW50Ci0JCS8vIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBpbnNlcnQgcG9zaXRpb24KLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04gKyBVTkRFUlNDT1JFLCB0aGlzLCBJU291cmNlVmlld2VyLkNPTlRFTlRBU1NJU1RfQ09OVEVYVF9JTkZPUk1BVElPTik7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04pOwotCQlzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04sIHRydWUpOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBBY3Rpb24gLSByZXF1ZXN0aW5nCi0JCS8vIGNvcnJlY3Rpb24gYXNzaXN0IHRvIHNob3cKLQkJLy8gY29ycmVjdGlvbiBwcm9wb3NhbHMgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9RVUlDS19GSVggKyBVTkRFUlNDT1JFLCB0aGlzLCBTdHJ1Y3R1cmVkVGV4dFZpZXdlci5RVUlDS19GSVgsIHRydWUpOwotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuUVVJQ0tfRklYKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1FVSUNLX0ZJWCwgYWN0aW9uKTsKLQkJbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfUVVJQ0tfRklYLCB0cnVlKTsKLQkJLy8gU3RydWN0dXJlZFRleHRWaWV3ZXIgQWN0aW9uIC0gcmVxdWVzdGluZyBmb3JtYXQKLQkJLy8gb2YgdGhlIHdob2xlCi0JCS8vIGRvY3VtZW50Ci0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQgKyBVTkRFUlNDT1JFLCB0aGlzLCBTdHJ1Y3R1cmVkVGV4dFZpZXdlci5GT1JNQVRfRE9DVU1FTlQpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoYWN0aW9uLCBJSGVscENvbnRleHRJZHMuQ09OVE1OVV9GT1JNQVRfRE9DX0hFTFBJRCk7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfRE9DVU1FTlQpOwotCQlzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5ULCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQsIHRydWUpOwotCQltYXJrQXNTZWxlY3Rpb25EZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5ULCB0cnVlKTsKLQkJLy8gU3RydWN0dXJlZFRleHRWaWV3ZXIgQWN0aW9uIC0gcmVxdWVzdGluZyBmb3JtYXQKLQkJLy8gb2YgdGhlIGFjdGl2ZQotCQkvLyBlbGVtZW50cwotCQlhY3Rpb24gPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUyArIFVOREVSU0NPUkUsIHRoaXMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyLkZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoYWN0aW9uLCBJSGVscENvbnRleHRJZHMuQ09OVE1OVV9GT1JNQVRfRUxFTUVOVFNfSEVMUElEKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpOwotCQlzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUywgYWN0aW9uKTsKLQkJbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUywgdHJ1ZSk7Ci0JCW1hcmtBc1NlbGVjdGlvbkRlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTLCB0cnVlKTsKLQotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBhZGQgYnJlYWtwb2ludHMgKGZhbGxpbmcgYmFjayB0byB0aGUKLQkJLy8gY3VycmVudCBkb3VibGUtY2xpY2sgaWYgdGhleSBjYW4ndCBiZSBhZGRlZCkKLQkJYWN0aW9uID0gbmV3IFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuVE9HR0xFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBtYW5hZ2UgYnJlYWtwb2ludHMKLQkJYWN0aW9uID0gbmV3IE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuTUFOQUdFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBlZGl0IGJyZWFrcG9pbnRzCi0JCWFjdGlvbiA9IG5ldyBFZGl0QnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5FRElUX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBBY3Rpb24gLSBvcGVuIGZpbGUgb24gc2VsZWN0aW9uCi0JCWFjdGlvbiA9IG5ldyBPcGVuSHlwZXJsaW5rQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9PUEVOX0ZJTEUgKyBVTkRFUlNDT1JFLCB0aGlzLCBnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5PUEVOX0ZJTEUpOwotCQlzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFLCBhY3Rpb24pOwotCi0JCWNvbXB1dGVBbmRTZXREb3VibGVDbGlja0FjdGlvbigpOwotCi0JCWZTaG93UHJvcGVydGllc0FjdGlvbiA9IG5ldyBTaG93UHJvcGVydGllc0FjdGlvbigpOwotCQlmRm9sZGluZ0dyb3VwID0gbmV3IEZvbGRpbmdBY3Rpb25Hcm91cCh0aGlzLCBnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmVDaGFuZ2VIb3ZlciBjcmVhdGVDaGFuZ2VIb3ZlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkTGluZUNoYW5nZUhvdmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciBjcmVhdGVDaGFyYWN0ZXJQYWlyTWF0Y2hlcigpIHsKLQkJSUNoYXJhY3RlclBhaXJNYXRjaGVyIG1hdGNoZXIgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IG1hdGNoZXIgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQltYXRjaGVyID0gKElDaGFyYWN0ZXJQYWlyTWF0Y2hlcikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuSUQsIGlkc1tpXSk7Ci0JCX0KLQkJaWYgKG1hdGNoZXIgPT0gbnVsbCkgewotCQkJbWF0Y2hlciA9IG5ldyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQkJCQlyZXR1cm4gSUNoYXJhY3RlclBhaXJNYXRjaGVyLkxFRlQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGlEb2N1bWVudCwgaW50IGkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gbWF0Y2hlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgY29tYmluZXMgdGhlIHNvdXJjZSBlZGl0b3IgcHJlZmVyZW5jZXMKLQkgKiB3aXRoIHRoZSBiYXNlIGVkaXRvcidzIHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEByZXR1cm4gSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBjcmVhdGVDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzc2VFZGl0b3JQcmVmcyA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJSVByZWZlcmVuY2VTdG9yZSBiYXNlRWRpdG9yUHJlZnMgPSBFZGl0b3JzVUkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBuZXcgQ2hhaW5lZFByZWZlcmVuY2VTdG9yZShuZXcgSVByZWZlcmVuY2VTdG9yZVtde3NzZUVkaXRvclByZWZzLCBiYXNlRWRpdG9yUHJlZnN9KTsKLQl9Ci0KLQlwcml2YXRlIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBjcmVhdGVDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBjZmcgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGNmZyA9PSBudWxsICYmIGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCWNmZyA9IChDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24pIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLkNPTlRFTlRPVVRMSU5FQ09ORklHVVJBVElPTiwgaWRzW2ldKTsKLQkJfQotCQlyZXR1cm4gY2ZnOwotCX0KLQotCS8qKgotCSAqIE9ubHkgZ2V0cyB0aGUgY29ycmVjdGlvbiBhc3Npc3RhbnQgYXNzb2NpdGVkIHdpdGggdGhlIGN1cnJlbnQgc291cmNlCi0JICogdmlld2VyIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBJQ29udGVudEFzc2lzdGFudCBvciBudWxsCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdGFudCBjcmVhdGVDb3JyZWN0aW9uQXNzaXN0YW50KCkgewotCQlJQ29udGVudEFzc2lzdGFudCBhc3Npc3QgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCUNvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlciBwcm92aWRlciA9IChDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIpIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbigiY29ycmVjdGlvbmFzc2lzdGFudCIsIGZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlhc3Npc3QgPSBwcm92aWRlci5nZXRDb3JyZWN0aW9uQXNzaXN0YW50KGdldFNvdXJjZVZpZXdlcigpKTsKLQkJfQotCQlyZXR1cm4gYXNzaXN0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1vZGVsRGVwZW5kZW50RmllbGRzKCkgewotCQkvLyBub25lIGF0IHRoaXMgbGV2ZWwKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogVXNlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBpZiBhIHZpZXdlcmNvbmZpZ3VyYXRpb24gaGFzIG5vdAotCSAqIGFscmVhZHkgYmVlbiBzZXQuIEFsc28gaW5pdGlhbGl6ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpID09IG51bGwpIHsKLQkJCUNvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY2F0ID0gY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJZlZpZXdlckNvbmZpZ3VyYXRpb25UYXJnZXRJZCA9IGNhdC5nZXRUYXJnZXRJZCgpOwotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIG5ld1ZpZXdlckNvbmZpZ3VyYXRpb24gPSBjYXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJc2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbihuZXdWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJfQotCi0JCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0KLQkJLy8gaW5zdGVhZCBvZiBjYWxsaW5nIHNldElucHV0IHR3aWNlLCB1c2UgaW5pdGlhbGl6ZVNvdXJjZVZpZXdlcigpIHRvCi0JCS8vIGhhbmRsZSBzb3VyY2Ugdmlld2VyIGluaXRpYWxpemF0aW9uIHByZXZpb3VzbHkgaGFuZGxlZCBieSBzZXRJbnB1dAotCQlpbml0aWFsaXplU291cmNlVmlld2VyKCk7Ci0KLQkJLy8gdXBkYXRlIGVkaXRvciBjb250ZXh0IG1lbnUsIHZlcnRpY2FsIHJ1bGVyIGNvbnRleHQgbWVudSwgaW5mb3BvcAotCQlpZiAoZ2V0SW50ZXJuYWxNb2RlbCgpICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVkaXRvckNvbnRyb2xzRm9yQ29udGVudFR5cGUoZ2V0SW50ZXJuYWxNb2RlbCgpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZUVkaXRvckNvbnRyb2xzRm9yQ29udGVudFR5cGUobnVsbCk7Ci0JCX0KLQotCQkvLyB1c2VkIGZvciBTaG93IFRvb2x0aXAgRGVzY3JpcHRpb24KLQkJSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgaW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciA9IG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBzaGVsbCkgewotCQkJCWJvb2xlYW4gY3V0RG93biA9IGZhbHNlOwotCQkJCWludCBzdHlsZSA9IGN1dERvd24gPyBTV1QuTk9ORSA6IChTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJCXJldHVybiBuZXcgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChzaGVsbCwgU1dULlJFU0laRSB8IFNXVC5UT09MLCBzdHlsZSwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKGN1dERvd24pKTsKLQkJCX0KLQkJfTsKLQotCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIgPSBuZXcgSW5mb3JtYXRpb25QcmVzZW50ZXIoaW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcik7Ci0JCWZJbmZvcm1hdGlvblByZXNlbnRlci5zZXRTaXplQ29uc3RyYWludHMoNjAsIDEwLCB0cnVlLCB0cnVlKTsKLQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLmluc3RhbGwoZ2V0U291cmNlVmlld2VyKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjcmVhdGVQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpIHsKLQkJUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY2ZnID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBjZmcgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZmcgPSAoUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24pIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLlBST1BFUlRZU0hFRVRDT05GSUdVUkFUSU9OLCBpZHNbaV0pOwotCQl9Ci0JCXJldHVybiBjZmc7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIFNob3cgSW4gVGFyZ2V0IElEcyBmcm9tIHRoZSBFeHRlbmRlZCBDb25maWd1cmF0aW9uIGV4dGVuc2lvbgotCSAqIHBvaW50LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGNyZWF0ZVNob3dJblRhcmdldElkcygpIHsKLQkJTGlzdCBhbGxJZHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJzaG93aW50YXJnZXQiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQlTdHJpbmdbXSBpZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc29tZUlkcyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQkJCQlTdHJpbmcgaWQgPSBpZHNba10udHJpbSgpOwotCQkJCQkJaWYgKCFhbGxJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJYWxsSWRzLmFkZChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJfQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9PVVRMSU5FKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBhbGxJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU291cmNlRWRpdGluZ1RleHRUb29scyBjcmVhdGVTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgewotCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29scyA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgdG9vbHMgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0b29scyA9IChJU291cmNlRWRpdGluZ1RleHRUb29scykgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLklELCBpZHNbaV0pOwotCQl9Ci0JCWlmICh0b29scyA9PSBudWxsKSB7Ci0JCQl0b29scyA9IE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldEluc3RhbmNlKCk7Ci0JCQkoKE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSB0b29scykuc2V0VGV4dEVkaXRvcih0aGlzKTsKLQkJfQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJbWV0aG9kID0gdG9vbHMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNldFRleHRFZGl0b3IiLCBuZXcgQ2xhc3NbXXtTdHJ1Y3R1cmVkVGV4dEVkaXRvci5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1ldGhvZCA9IHRvb2xzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRUZXh0RWRpdG9yIiwgbmV3IENsYXNzW117SVRleHRFZGl0b3IuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1ldGhvZCA9IHRvb2xzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRUZXh0RWRpdG9yIiwgbmV3IENsYXNzW117SUVkaXRvclBhcnQuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlpZiAoIW1ldGhvZC5pc0FjY2Vzc2libGUoKSkgewotCQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQltZXRob2QuaW52b2tlKHRvb2xzLCBuZXcgT2JqZWN0W117dGhpc30pOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvYmxlbSBjcmVhdGluZyBJU291cmNlRWRpdGluZ1RleHRUb29scyBpbXBsZW1lbnRhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdG9vbHM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc291cmNlIHZpZXdlciB0byBiZSB1c2VkIGJ5IHRoaXMgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIElTb3VyY2VWaWV3ZXIgY3JlYXRlU291cmNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElWZXJ0aWNhbFJ1bGVyIHZlcnRpY2FsUnVsZXIsIGludCBzdHlsZXMpIHsKLQkJZkFubm90YXRpb25BY2Nlc3MgPSBjcmVhdGVBbm5vdGF0aW9uQWNjZXNzKCk7Ci0JCWZPdmVydmlld1J1bGVyID0gY3JlYXRlT3ZlcnZpZXdSdWxlcihnZXRTaGFyZWRDb2xvcnMoKSk7Ci0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyIHNvdXJjZVZpZXdlciA9IGNyZWF0ZVN0cnVjdGVkVGV4dFZpZXdlcihwYXJlbnQsIHZlcnRpY2FsUnVsZXIsIHN0eWxlcyk7Ci0JCWluaXRTb3VyY2VWaWV3ZXIoc291cmNlVmlld2VyKTsKLQkJcmV0dXJuIHNvdXJjZVZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJQ29uZmlndXJhdGlvbkFuZFRhcmdldCBjYXQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY2ZnID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBjZmcgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZmcgPSAoU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5TT1VSQ0VWSUVXRVJDT05GSUdVUkFUSU9OLCBpZHNbaV0pOwotCQkJY2F0ID0gbmV3IENvbmZpZ3VyYXRpb25BbmRUYXJnZXQoaWRzW2ldLCBjZmcpOwotCQl9Ci0JCWlmIChjZmcgPT0gbnVsbCkgewotCQkJY2ZnID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJU3RyaW5nIHRhcmdldGlkID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCQljYXQgPSBuZXcgQ29uZmlndXJhdGlvbkFuZFRhcmdldCh0YXJnZXRpZCwgY2ZnKTsKLQkJfQotCQlyZXR1cm4gY2F0OwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBjcmVhdGVTdHJ1Y3RlZFRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSVZlcnRpY2FsUnVsZXIgdmVydGljYWxSdWxlciwgaW50IHN0eWxlcykgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgdmVydGljYWxSdWxlciwgZ2V0T3ZlcnZpZXdSdWxlcigpLCBpc092ZXJ2aWV3UnVsZXJWaXNpYmxlKCksIHN0eWxlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCkgewotCQkvLyBvdmVycmlkZGVuIHRvIGFkZCBpY29ucyB0byBhY3Rpb25zCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE4NzcKLQkJc3VwZXIuY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETyk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0RWRpdG9yOjpkaXNwb3NlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcucGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGNhbGxzIHRvIGdldEFkYXB0ZXI6ICIgKyBhZGFwdGVyUmVxdWVzdHMpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHRpbWUgaW4gZ2V0QWRhcHRlcjogIiArIGFkYXB0ZXJUaW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBdmVyYWdlIHRpbWUgcGVyIGNhbGw6ICIgKyAoYWRhcHRlclRpbWUgLyBhZGFwdGVyUmVxdWVzdHMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZGlzcG9zZSBvZiBpbmZvcm1hdGlvbiBwcmVzZW50ZXIKLQkJaWYgKGZJbmZvcm1hdGlvblByZXNlbnRlciAhPSBudWxsKSB7Ci0JCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIuZGlzcG9zZSgpOwotCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyID0gbnVsbDsKLQkJfQotCi0JCS8vIGRpc3Bvc2Ugb2Ygc2VsZWN0aW9uIGhpc3RvcnkKLQkJaWYgKGZTZWxlY3Rpb25IaXN0b3J5ICE9IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25IaXN0b3J5LmRpc3Bvc2UoKTsKLQkJCWZTZWxlY3Rpb25IaXN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCS8vIGRpc3Bvc2Ugb2YgZG9jdW1lbnQgZm9sZGluZyBzdXBwb3J0Ci0JCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci51bmluc3RhbGwoKTsKLQkJCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChmUHJvamVjdGlvblN1cHBvcnQgIT0gbnVsbCkgewotCQkJZlByb2plY3Rpb25TdXBwb3J0LmRpc3Bvc2UoKTsKLQkJCWZQcm9qZWN0aW9uU3VwcG9ydCA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZkZvbGRpbmdHcm91cCAhPSBudWxsKSB7Ci0JCQlmRm9sZGluZ0dyb3VwLmRpc3Bvc2UoKTsKLQkJCWZGb2xkaW5nR3JvdXAgPSBudWxsOwotCQl9Ci0KLQkJLy8gc3ViY2xhc3MgbWF5IG5vdCBoYXZlIG1vdXNlIHRyYWNrZXIgY3JlYXRlZAotCQkvLyBuZWVkIHRvIGNoZWNrIGZvciBudWxsIGJlZm9yZSBzdG9wcGluZwotCQlpZiAoZk1vdXNlVHJhY2tlciAhPSBudWxsKSB7Ci0JCQlmTW91c2VUcmFja2VyLnN0b3AoKTsKLQkJCWZNb3VzZVRyYWNrZXIgPSBudWxsOwotCQl9Ci0KLQkJLy8gZGlzcG9zZSBvZiBtZW51cyB0aGF0IHdlcmUgYmVpbmcgdHJhY2tlZAotCQlpZiAoZlRleHRDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQlmVGV4dENvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZlJ1bGVyQ29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJZlJ1bGVyQ29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmVGV4dENvbnRleHRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5yZW1vdmVNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihnZXRDb250ZXh0TWVudUxpc3RlbmVyKCkpOwotCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8vIGFkZGVkIHRoaXMgMi8yMC8yMDA0IGJhc2VkIG9uIHByb2JlIHJlc3VsdHMgLS0KLQkJLy8gc2VlbXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgc2V0TW9kZWwobnVsbCksIGJ1dAotCQkvLyB0aGF0J3MgYSBtb3JlIHJhZGljYWwgY2hhbmdlLgotCQkvLyBhbmQsIHRlY2huaWNhbGx5IHNwZWFraW5nLCBzaG91bGQgbm90IGJlIG5lZWRlZCwKLQkJLy8gYnV0IG1ha2VzIGEgbWVtb3J5IGxlYWsKLQkJLy8gbGVzcyBzZXZlcmUuCi0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCWlmIChmU3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZ2V0SW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZlN0cnVjdHVyZWRNb2RlbC5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCX0KLQotCQkvLyBCVUcxNTUzMzUgLSBpZiB0aGVyZSB3YXMgbm8gZG9jdW1lbnQgcHJvdmlkZXIsIHRoZXJlIHdhcyBub3RoaW5nIGFkZGVkCi0JCS8vIHRvIGRvY3VtZW50LCBzbyBub3RoaW5nIHRvIHJlbW92ZQotCQlpZiAoZ2V0RG9jdW1lbnRQcm92aWRlcigpICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQlkb2MucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihnZXRJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgewotCQkJCQkoKElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgZG9jKS5zZXRFeGVjdXRpb25EZWxlZ2F0ZShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzb21lIHRoaW5ncyBpbiB0aGUgY29uZmlndXJhdGlvbiBuZWVkIHRvIGNsZWFuCi0JCS8vIHVwIGFmdGVyIHRoZW1zZWx2ZXMKLQkJaWYgKGZPdXRsaW5lUGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAoZk91dGxpbmVQYWdlIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlICYmIGZPdXRsaW5lUGFnZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgZk91dGxpbmVQYWdlKS5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGZPdXRsaW5lUGFnZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWlmIChmT3V0bGluZVBhZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJZk91dGxpbmVQYWdlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZVBhZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlmRWRpdG9yRGlzcG9zZWQgPSB0cnVlOwotCQlkaXNwb3NlTW9kZWxEZXBlbmRlbnRGaWVsZHMoKTsKLQotCQlpZiAoZkRyb3BUYXJnZXQgIT0gbnVsbCkKLQkJCWZEcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUobnVsbCk7Ci0KLQkJLy8gc3RyaWN0bHkgc3BlYWtpbmcsIGJ1dCBmb2xsb3dpbmcgbnVsbCBvdXRzCi0JCS8vIHNob3VsZCBub3QgYmUgbmVlZGVkLAotCQkvLyBidXQgaW4gdGhlIGV2ZW50IG9mIGEgbWVtb3J5IGxlYWssIHRoZXkgbWFrZSB0aGUKLQkJLy8gbWVtb3J5IGxlYWsgbGVzcwotCQkvLyBzZXZlcmUKLQkJZkRyb3BBZGFwdGVyID0gbnVsbDsKLQkJZkRyb3BUYXJnZXQgPSBudWxsOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRFZGl0b3I6OmRpc3Bvc2UgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yI2Rpc3Bvc2VEb2N1bWVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRG9jdW1lbnRQcm92aWRlcigpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiAhZmlzUmVsZWFzZWQgJiYgIShnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikpIHsKLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmaXNSZWxlYXNlZCA9IHRydWU7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZURvY3VtZW50UHJvdmlkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBtb2RlbCBzcGVjaWZpYyBlZGl0b3IgaGVscGVycyBzdWNoIGFzIHN0YXR1c0xpbmVIZWxwZXIuCi0JICogQmFzaWNhbGx5IGFueSBjb2RlIHJlcGVhdGVkIGluIHVwZGF0ZSgpICYgZGlzcG9zZSgpIHNob3VsZCBiZSBwbGFjZWQKLQkgKiBoZXJlLgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwb3NlTW9kZWxEZXBlbmRlbnRGaWVsZHMoKSB7Ci0JCS8vIG5vbmUgYXQgdGhpcyBsZXZlbAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvciNkb1JldmVydFRvU2F2ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvUmV2ZXJ0VG9TYXZlZCgpIHsKLQkJc3VwZXIuZG9SZXZlcnRUb1NhdmVkKCk7Ci0JCWlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCAmJiBmT3V0bGluZVBhZ2UgaW5zdGFuY2VvZiBJVXBkYXRlKSB7Ci0JCQkoKElVcGRhdGUpIGZPdXRsaW5lUGFnZSkudXBkYXRlKCk7Ci0JCX0KLQkJLy8gcmVzZXQgdW5kbwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2MpLmdldFVuZG9NYW5hZ2VyKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJfQotCi0JCS8vIHVwZGF0ZSBtZW51IHRleHQKLQkJdXBkYXRlTWVudVRleHQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0cnkgewotCQkJYWJvdXRUb1NhdmVNb2RlbCgpOwotCQkJdXBkYXRlRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdXBlci5kb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNhdmVkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZG9TZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogaWYgb3BlbmVkIGluIG1vcmUgdGhhbiBvbmUgZWRpdG9yLCB0aGlzIHdpbGwgY2F1c2UKLQkJLy8gcHJvYmxlbXMuCi0JCUlFZGl0b3JJbnB1dCBvbGRJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgb2xkZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KG9sZElucHV0KTsKLQkJCWlmIChvbGRkb2MgIT0gbnVsbCAmJiBvbGRkb2MgaW5zdGFuY2VvZiBJRXhlY3V0aW9uRGVsZWdhdGFibGUpIHsKLQkJCQkoKElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgb2xkZG9jKS5zZXRFeGVjdXRpb25EZWxlZ2F0ZShudWxsKTsKLQkJCX0KLQkJfQotCi0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgIShnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikpIHsKLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQotCQlzdXBlci5kb1NldElucHV0KGlucHV0KTsKLQotCQlJRG9jdW1lbnQgbmV3RG9jdW1lbnQgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlpZiAobmV3RG9jdW1lbnQgaW5zdGFuY2VvZiBJRXhlY3V0aW9uRGVsZWdhdGFibGUpIHsKLQkJCSgoSUV4ZWN1dGlvbkRlbGVnYXRhYmxlKSBuZXdEb2N1bWVudCkuc2V0RXhlY3V0aW9uRGVsZWdhdGUobmV3IEVkaXRvckV4ZWN1dGlvbkNvbnRleHQodGhpcykpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCS8vIGlmIHdlIGhhdmUgYSBNb2RlbCBwcm92aWRlciwgZ2V0IHRoZSBtb2RlbCBmcm9tIGl0Ci0JCWlmIChnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikgewotCQkJbW9kZWwgPSAoKElNb2RlbFByb3ZpZGVyKSBnZXREb2N1bWVudFByb3ZpZGVyKCkpLmdldE1vZGVsKGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKCFtb2RlbC5pc1NoYXJlZCgpKSB7Ci0JCQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKG1vZGVsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChuZXdEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkvLyBjb3JyZXNwb25kaW5nIHJlbGVhc2VGcm9tRWRpdCBvY2N1cnMgaW4KLQkJCQkvLyBkaXNwb3NlKCkKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBuZXdEb2N1bWVudCk7Ci0JCQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKG1vZGVsKTsKLQkJCX0KLQotCQkJZWxzZSB7Ci0JCQkJbG9nVW5leHBlY3RlZERvY3VtZW50S2luZChpbnB1dCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsIHx8IG1vZGVsICE9IG51bGwpIHsKLQkJCXNldE1vZGVsKG1vZGVsKTsKLQkJfQotCi0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShnZXRJbnRlcm5hbE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShudWxsKTsKLQkJfQotCi0JCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKQotCQkJZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIHN0YXJ0IGVkaXRvciB3aXRoIHNtYXJ0IGluc2VydCBtb2RlCi0JCXNldEluc2VydE1vZGUoU01BUlRfSU5TRVJUKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHVwIHRoaXMgZWRpdG9yJ3MgY29udGV4dCBtZW51IGJlZm9yZSBpdCBpcyBtYWRlIHZpc2libGUuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlZHVjZWQgdG8gcHJvdGVjdGVkIG1ldGhvZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudQotCSAqICAgICAgICAgICAgdGhlIG1lbnUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0b3JDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIFRvIGJlIGNvbnNpc3RhbnQgd2l0aCB0aGUgSmF2YSBFZGl0b3IsIHdlIHdhbnQKLQkJLy8gdG8gcmVtb3ZlCi0JCS8vIFNoaWZ0UmlnaHQgYW5kIFNoaWZ0TGVmdCBmcm9tIHRoZSBjb250ZXh0IG1lbnUuCi0JCS8vCi0JCS8vIFNoaWZ0UmlnaHQgYW5kIFNoaWZ0TGVmdCB3ZXJlIGFkZGVkIGluIHRoZSBzdXBlcgotCQkvLyBpbXBsZW1lbmF0aW9uIG9mCi0JCS8vIHRoaXMgbWV0aG9kLiBXZSB3YW50IHRvIHNraXAgaXQgYW5kIGNhbGwKLQkJLy8gQWJzdHJhY3RUZXh0RWRpdG9yJ3MKLQkJLy8gaW1wbGVtZW50YXRpb24gZGlyZWN0bHkuIFRoZSBlYXNpZXN0IHdheSBpcyB0bwotCQkvLyBjb3B5IHRoZSBtZXRob2QgaGVyZS4KLQotCQkvLyBzdXBlci5lZGl0b3JDb250ZXh0TWVudUFib3V0VG9TaG93KG1lbnUpOwotCQlhYnN0cmFjdFRleHRFZGl0b3JDb250ZXh0TWVudUFib3V0VG9TaG93KG1lbnUpOwotCi0JCWFkZENvbnRleHRNZW51QWN0aW9ucyhtZW51KTsKLQkJYWRkRXh0ZW5kZWRDb250ZXh0TWVudUFjdGlvbnMobWVudSk7Ci0JfQotCi0JLyoqCi0JICogRW5kIGJhY2tncm91bmQgbW9kZS4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKi8KLQl2b2lkIGVuZEJhY2tncm91bmRPcGVyYXRpb24oKSB7Ci0JCWZCYWNrZ3JvdW5kSm9iRW5kZWQgPSB0cnVlOwotCQkvLyBub3RlLCB3ZSBkb24ndCBpbW1lZGlhdGVseSBlbmQgb3VyICdpbnRlcm5hbCBidXN5JyBzdGF0ZSwKLQkJLy8gc2luY2Ugd2UgbWF5IGdldCBtYW55IGNhbGxzIGluIGEgc2hvcnQgcGVyaW9kIG9mCi0JCS8vIHRpbWUuIFdlIGFsd2F5cyB3YWl0IGZvciB0aGUgdGltZSBvdXQuCi0JCXJlc2V0QnVzeVN0YXRlKCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZSB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGluZGlyZWN0bHkgZnJvbSBiYWNrZ3JvdW5kIGpvYiBvcGVyYXRpb24KLQkgKiAuLi4gYnV0IGV4cGVjdGVkIHRvIGJlIGdhdXJkZWQgdGhlcmUgd2l0aCBJTG9jaywgcGx1cywgY2FuIGJlIGNhbGxlZAotCSAqIGRpcmVjdGx5IGZyb20gdGltZXIgdGhyZWFkLCBzbyB0aGUgdGltZXIncyBydW4gbWV0aG9kIGd1YXJkcyB3aXRoIElMb2NrCi0JICogdG9vLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmRCdXN5U3RhdGVJbnRlcm5hbCgpIHsKLQkJaWYgKGZCYWNrZ3JvdW5kSm9iRW5kZWQpIHsKLQkJCWZCdXN5VGltZXIuY2FuY2VsKCk7Ci0JCQlzaG93QnVzeShmYWxzZSk7Ci0KLQkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmVuZEJhY2tncm91bmRVcGRhdGUoKTsKLQkJCX0KLQkJCWZCdXN5U3RhdGUgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIHdpbGwgb25seSBiZSBpbiB0aGlzIGJyYW5jaCBmb3IgYSBiYWNrIGdyb3VuZCBqb2IgdGhhdCBpcwotCQkJLy8gdGFraW5nCi0JCQkvLyBsb25nZXIgdGhhbiBvdXIgbm9ybWFsIHRpbWUtb3V0IHBlcmlvZCAobWVhbmluZyB3ZSBnb3Qgbm90aWZpZWQKLQkJCS8vIG9mCi0JCQkvLyB0aGUgdGltZW91dCAiaW5iZXR3ZWVuIiBjYWxscyB0byAnYmVnaW4nIGFuZAotCQkJLy8gJ2VuZEJhY2tncm91bmRPcGVyYXRpb24nLgotCQkJLy8gKHdoaWNoLCByZW1lbWJlciwgY2FuIG9ubHkgaGFwcGVuIHNpbmNlIHRoZXJlIGFyZSBtYW55IGNhbGxzIHRvCi0JCQkvLyBiZWdpbi9lbmQgaW4gYSBzaG9ydCBwZXJpb2Qgb2YgdGltZSwgYW5kIHdlIG9ubHkgInJlc2V0IiBvbiB0aGUKLQkJCS8vICdlbmRzJykuCi0JCQkvLyBJbiB0aGlzIGV2ZW50LCB0aGVyZSdzIHJlYWxseSBub3RoaW5nIHRvIGRvLCB3ZSdyZSBzdGlsbCBpbgotCQkJLy8gImJ1c3kgc3RhdGUiCi0JCQkvLyBhbmQgc2hvdWxkIHN0YXJ0IGEgbmV3IHJlc2V0IGN5Y2xlIG9uY2UgZW5kQmFja2dyb3VuZGpvYiBpcwotCQkJLy8gY2FsbGVkLgotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgcmVxdWlyZWQpIHsKLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLnBlcmZUZXN0QWRhcHRlckNsYXNzTG9hZGluZykgewotCQkJc3RhcnRQZXJmVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkvLyB0ZXh0IGVkaXRvcgotCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCWlmIChJVGV4dEVkaXRvci5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXN1bHQgPSB0aGlzOwotCQl9Ci0JCWVsc2UgaWYgKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJldHVybiBnZXRFZGl0b3JQYXJ0KCkuZ2V0U2l0ZSgpLmdldEFkYXB0ZXIoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MpOwotCQl9Ci0JCS8vIGNvbnRlbnQgb3V0bGluZSBwYWdlCi0JCWVsc2UgaWYgKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJaWYgKGZPdXRsaW5lUGFnZSA9PSBudWxsIHx8IGZPdXRsaW5lUGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoY2ZnICE9IG51bGwpIHsKLQkJCQkJQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmVQYWdlID0gbmV3IENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSgpOwotCQkJCQlvdXRsaW5lUGFnZS5zZXRDb25maWd1cmF0aW9uKGNmZyk7Ci0JCQkJCWlmIChpbnRlcm5hbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJCW91dGxpbmVQYWdlLnNldElucHV0Q29udGVudFR5cGVJZGVudGlmaWVyKGludGVybmFsTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQkJCQkJb3V0bGluZVBhZ2Uuc2V0SW5wdXQoaW50ZXJuYWxNb2RlbCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZk91dGxpbmVQYWdlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCQkJZk91dGxpbmVQYWdlTGlzdGVuZXIgPSBuZXcgT3V0bGluZVBhZ2VMaXN0ZW5lcigpOwotCQkJCQl9Ci0KLQkJCQkJb3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZPdXRsaW5lUGFnZUxpc3RlbmVyKTsKLQkJCQkJb3V0bGluZVBhZ2UuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihmT3V0bGluZVBhZ2VMaXN0ZW5lcik7Ci0KLQkJCQkJZk91dGxpbmVQYWdlID0gb3V0bGluZVBhZ2U7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gZk91dGxpbmVQYWdlOwotCQl9Ci0JCS8vIHByb3BlcnR5IHNoZWV0IHBhZ2UsIGJ1dCBvbmx5IGlmIHRoZSBpbnB1dCdzIGVkaXRhYmxlCi0JCWVsc2UgaWYgKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpICYmIGlzRWRpdGFibGUoKSkgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsIHx8IGZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCBmUHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCVByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGNmZyA9IGNyZWF0ZVByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGNmZyAhPSBudWxsKSB7Ci0JCQkJCUNvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlID0gbmV3IENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQkJCXByb3BlcnR5U2hlZXRQYWdlLnNldENvbmZpZ3VyYXRpb24oY2ZnKTsKLQkJCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gcHJvcGVydHlTaGVldFBhZ2U7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gZlByb3BlcnR5U2hlZXRQYWdlOwotCQl9Ci0JCWVsc2UgaWYgKElEb2N1bWVudC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXN1bHQgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gY3JlYXRlU291cmNlRWRpdGluZ1RleHRUb29scygpOwotCQl9Ci0JCWVsc2UgaWYgKElUb2dnbGVCcmVha3BvaW50c1RhcmdldC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXN1bHQgPSBUb2dnbGVCcmVha3BvaW50c1RhcmdldC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCWVsc2UgaWYgKElTaG93SW5UYXJnZXRMaXN0LmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJldHVybiBuZXcgU2hvd0luVGFyZ2V0TGlzdEFkYXB0ZXIoKTsKLQkJfQotCQllbHNlIGlmIChTZWxlY3Rpb25IaXN0b3J5LmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCWlmIChmU2VsZWN0aW9uSGlzdG9yeSA9PSBudWxsKQotCQkJCWZTZWxlY3Rpb25IaXN0b3J5ID0gbmV3IFNlbGVjdGlvbkhpc3RvcnkodGhpcyk7Ci0JCQlyZXR1cm4gZlNlbGVjdGlvbkhpc3Rvcnk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgaW50ZXJuYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gaW50ZXJuYWxNb2RlbC5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQkJCX0KLQkJCS8vIG90aGVycwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IHN1cGVyLmdldEFkYXB0ZXIocmVxdWlyZWQpOwotCQl9Ci0JCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5wZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcpIHsKLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJYWRhcHRlclJlcXVlc3RzKys7Ci0JCQlhZGFwdGVyVGltZSArPSAoc3RvcCAtIHN0YXJ0UGVyZlRpbWUpOwotCQl9Ci0JCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5wZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgY2FsbHMgdG8gZ2V0QWRhcHRlcjogIiArIGFkYXB0ZXJSZXF1ZXN0cyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgdGltZSBpbiBnZXRBZGFwdGVyOiAiICsgYWRhcHRlclRpbWUpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF2ZXJhZ2UgdGltZSBwZXIgY2FsbDogIiArIChhZGFwdGVyVGltZSAvIGFkYXB0ZXJSZXF1ZXN0cykpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkZW50aWZpZXJJRCA9IG51bGw7Ci0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJY29udGVudFR5cGVJZGVudGlmaWVySUQgPSBnZXRJbnRlcm5hbE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCX0KLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IuZ2V0Q29uZmlndXJhdGlvblBvaW50cyh0aGlzLCBjb250ZW50VHlwZUlkZW50aWZpZXJJRCwgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5TT1VSQ0UsIFN0cnVjdHVyZWRUZXh0RWRpdG9yLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRlZCBjaGVja3MgdG8gb3ZlcmNvbWUgYnVnIHN1Y2ggdGhhdCBpZiB3ZSBhcmUgc2h1dHRpbmcgZG93biBpbiBhbgotCSAqIGVycm9yIGNvbmRpdGlvbiwgdGhlbiB2aWV3ZXIgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gdGhpcyBtYXkgYmUgdG9vIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZgotCQkvLyBwZXJmb3JtYW5jZSwgdG8gZG8gdGhpcyBjaGVjawotCQkvLyBldmVyeSB0aW1lLCBqdXN0IHRvIGdhdXJkIGFnYWluc3QgZXJyb3IKLQkJLy8gY29uZGl0aW9uLgotCQkvLyBwZXJoYXBzIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5PwotCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCAmJiAhZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmlzRGlzcG9zZWQoKSkgewotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9ICIwOjAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCURpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBlZGl0b3IgcGFydC4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgZWRpdG9yIHBhcnQKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJaWYgKGZFZGl0b3JQYXJ0ID09IG51bGwpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIGZFZGl0b3JQYXJ0OwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZ2V0SW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsRG9jdW1lbnRMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCX0KLQotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0SW50ZXJuYWxNb2RlbCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBlZGl0b3IncyBTdHJ1Y3R1cmVkTW9kZWwuCi0JICogPHA+Ci0JICogTm90IEFQSS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0aGlzIGVkaXRvcidzIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIFRoaXMgbWV0aG9kIGFsbG93ZWQgZm9yIHVuY29udHJvbGxlZCBhY2Nlc3MgdG8gdGhlIG1vZGVsCi0JICogICAgICAgICAgICAgaW5zdGFuY2UgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBJdCBpcwotCSAqICAgICAgICAgICAgIHJlY29tbWVuZGVkIHRoYXQgdGhlIGN1cnJlbnQgZG9jdW1lbnQgcHJvdmlkZXIgYmUgYXNrZWQgZm9yCi0JICogICAgICAgICAgICAgdGhlIGN1cnJlbnQgZG9jdW1lbnQgYW5kIHRoZSBJTW9kZWxNYW5hZ2VyIHRoZW4gYXNrZWQgZm9yCi0JICogICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwgd2l0aAotCSAqICAgICAgICAgICAgIGdldEV4aXN0aW5nTW9kZWxGb3IqKElEb2N1bWVudCkuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCWlmIChnZXREb2N1bWVudFByb3ZpZGVyKCkgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBpbmRpY2F0ZWQgYW4gZXJyb3IgaW4gc3RhcnR1cCBzZXF1ZW5jZQotCQkJTG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpLCAiUHJvZ3JhbSBJbmZvIE9ubHk6IGRvY3VtZW50IHByb3ZpZGVyIHdhcyBudWxsIHdoZW4gbW9kZWwgcmVxdWVzdGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWJvb2xlYW4gaW5pdGlhbE1vZGVsTnVsbCA9IGZhbHNlOwotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCA9PSBudWxsKQotCQkJaW5pdGlhbE1vZGVsTnVsbCA9IHRydWU7Ci0JCWlmIChmU3RydWN0dXJlZE1vZGVsID09IG51bGwpIHsKLQkJCS8vIGxhemlseSBzZXQgdGhlIG1vZGVsIGluc3RhbmNlLCBhbHRob3VnaCB0aGlzIGlzIGFuIEFCTk9STUFMCi0JCQkvLyBDT0RFIFBBVEgKLQkJCWlmIChnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikgewotCQkJCWZTdHJ1Y3R1cmVkTW9kZWwgPSAoKElNb2RlbFByb3ZpZGVyKSBnZXREb2N1bWVudFByb3ZpZGVyKCkpLmdldE1vZGVsKGdldEVkaXRvcklucHV0KCkpOwotCQkJCWZpc1JlbGVhc2VkID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvYyk7Ci0JCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBkb2MpOwotCQkJCQl9Ci0JCQkJCWZTdHJ1Y3R1cmVkTW9kZWwgPSBtb2RlbDsKLQkJCQkJZmlzUmVsZWFzZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIElTU1VFOiB0aGlzIGxvb2tzIGJhZCAuLi4gZWRpdC10aW1lIGZhY3RvcmllcyBub3QgaW5pdGlhbGl6ZWQKLQkJCS8vIHVubGVzcyBzb21lb25lIGNhbGxzIGdldE1vZGVsPwotCQkJLy8gZmFjdG9yaWVzIHdpbGwgbm90IGJlIHJlLWFkZGVkIGlmIGFscmVhZHkgZXhpc3RzCi0JCQlFZGl0b3JNb2RlbFV0aWwuYWRkRmFjdG9yaWVzVG8oZlN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCWlmIChpbml0aWFsTW9kZWxOdWxsICYmIGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCS8qCi0JCQkJICogRE1XOiA5LzEvMjAwMiAtLSB3aHkgaXMgdXBkYXRlIGNhbGxlZCBoZXJlPyBObyBjaGFuZ2UgaGFzCi0JCQkJICogYmVlbiBpbmRpY2F0ZWQ/IEknZCBsaWtlIHRvIHJlbW92ZSwgYnV0IHdpbGwgbGVhdmUgZm9yIG5vdwotCQkJCSAqIHRvIGF2b2lkIGJyZWFraW5nIHRoaXMgaGFjay4gU2hvdWxkIG1lYXN1cmUvYnJlYWtwb2ludCB0bwotCQkJCSAqIHNlZSBob3cgbGFyZ2UgdGhlIHByb2JsZW0gaXMuIE1heSBjYXVzZSBwZXJmb3JtYW5jZQotCQkJCSAqIHByb2JsZW1zLgotCQkJCSAqIAotCQkJCSAqIERNVzogOS84LzIwMDIgLS0gbm90IHN1cmUgd2h5IHRoaXMgd2FzIGhlcmUgaW5pdGlhbGx5LCBidXQKLQkJCQkgKiB0aGUgaW50ZW50L2hhY2sgbXVzdCBoYXZlIGJlZW4gdG8gY2FsbCB1cGRhdGUgaWYgdGhpcyB3YXMKLQkJCQkgKiB0aGUgZmlyc3QgdGltZSBmU3RydWN0dXJlZE1vZGVsIHdhcyBzZXQuIFNvLCBJIGFkZGVkIHRoZQotCQkJCSAqIGxvZ2ljIHRvIGNoZWNrIGZvciB0aGF0ICJmaXJzdCB0aW1lIiBjYXNlLiBJdCB3b3VsZCBhcHBlYXIKLQkJCQkgKiB3ZSBkb24ndCByZWFsbHkgbmVlZC4gbWF5IHJlbW92ZSBpbiBmdXR1cmUgd2hlbiBjYW4gdGVzdAotCQkJCSAqIG1vcmUuCi0JCQkJICovCi0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklXb3JrYmVuY2hQYXJ0T3JpZW50YXRpb24jZ2V0T3JpZW50YXRpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JpZW50YXRpb24oKSB7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODcxNAotCQlyZXR1cm4gU1dULkxFRlRfVE9fUklHSFQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yI2dldFNlbGVjdGlvblByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblByb3ZpZGVyKCkgewotCQlpZiAoZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcGFyZW50UHJvdmlkZXIgPSBzdXBlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHBhcmVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlcihwYXJlbnRQcm92aWRlciwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlci4gVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgdG8gZXhwb3NlCi0JICogdGhlIHByb3RlY3RlZCBmaW5hbCBnZXRTb3VyY2VWaWV3ZXIoKSBtZXRob2QuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2hhbmRsZUN1cnNvclBvc2l0aW9uQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ3Vyc29yUG9zaXRpb25DaGFuZ2VkKCkgewotCQlzdXBlci5oYW5kbGVDdXJzb3JQb3NpdGlvbkNoYW5nZWQoKTsKLQkJdXBkYXRlU3RhdHVzRmllbGQoU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNoYW5kbGVQcmVmZXJlbmNlU3RvcmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcmVmZXJlbmNlU3RvcmVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotCQlpZiAoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9URVhUX0hPVkVSX01PRElGSUVSUy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQl1cGRhdGVIb3ZlckJlaGF2aW9yKCk7Ci0JCX0KLQotCQlpZiAoSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgaW5zdGFuY2VvZiBQcm9qZWN0aW9uVmlld2VyKSB7Ci0JCQkJLy8gaW5zdGFsbCBwcm9qZWN0aW9uIHN1cHBvcnQgaWYgaXQgaGFzIG5vdCBldmVuIGJlZW4KLQkJCQkvLyBpbnN0YWxsZWQgeWV0Ci0JCQkJaWYgKGlzRm9sZGluZ0VuYWJsZWQoKSAmJiAoZlByb2plY3Rpb25TdXBwb3J0ID09IG51bGwpICYmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciA9PSBudWxsKSkgewotCQkJCQlpbnN0YWxsUHJvamVjdGlvblN1cHBvcnQoKTsKLQkJCQl9Ci0JCQkJUHJvamVjdGlvblZpZXdlciBwdiA9IChQcm9qZWN0aW9uVmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJCQlpZiAocHYuaXNQcm9qZWN0aW9uTW9kZSgpICE9IGlzRm9sZGluZ0VuYWJsZWQoKSkgewotCQkJCQlpZiAocHYuY2FuRG9PcGVyYXRpb24oUHJvamVjdGlvblZpZXdlci5UT0dHTEUpKQotCQkJCQkJcHYuZG9PcGVyYXRpb24oUHJvamVjdGlvblZpZXdlci5UT0dHTEUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcmVmZXJlbmNlU3RvcmVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5CdXN5U3RhdGUoKSB7Ci0JCXJldHVybiBmQnVzeVN0YXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJLy8gaWYgd2UndmUgZ290dGVuIGFuIGVycm9yIGVsc2V3aGVyZSwgYmVmb3JlCi0JCS8vIHdlJ3ZlIGFjdHVhbGx5IG9wZW5lZCwgdGhlbiBkb24ndCBvcGVuLgotCQlpZiAoc2hvdWxkQ2xvc2UpIHsKLQkJCXNldFNpdGUoc2l0ZSk7Ci0JCQljbG9zZShmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZG9jdW1lbnQgcHJvdmlkZXIgZm9yIHRoaXMgZWRpdG9yLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudFByb3ZpZGVyCi0JICogICAgICAgICAgICBkb2N1bWVudFByb3ZpZGVyIHRvIGluaXRpYWxpemUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRG9jdW1lbnRQcm92aWRlcihJRG9jdW1lbnRQcm92aWRlciBkb2N1bWVudFByb3ZpZGVyKSB7Ci0JCWlmIChkb2N1bWVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNldERvY3VtZW50UHJvdmlkZXIoZG9jdW1lbnRQcm92aWRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRHJvcChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0JCWZEcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCksIG9wZXJhdGlvbnMpOwotCQlmRHJvcEFkYXB0ZXIgPSBuZXcgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyKHRydWUpOwotCQlmRHJvcEFkYXB0ZXIuc2V0VGFyZ2V0RWRpdG9yKHRoaXMpOwotCQlmRHJvcEFkYXB0ZXIuc2V0VGFyZ2V0SURzKGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSk7Ci0JCWZEcm9wQWRhcHRlci5zZXRUZXh0Vmlld2VyKHRleHRWaWV3ZXIpOwotCQlmRHJvcFRhcmdldC5zZXRUcmFuc2ZlcihmRHJvcEFkYXB0ZXIuZ2V0VHJhbnNmZXJzKCkpOwotCQlmRHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIoZkRyb3BBZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yI2luaXRpYWxpemVFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0b3IoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVFZGl0b3IoKTsKLQkJLy8gRklYTUU6IGhlcmUncyB3aGVyZSB0byBhZGQgYmFjayBpbiBvdXIgY3VzdG9tIGVuY29kaW5nIHN1cHBvcnQKLQkJZkVuY29kaW5nU3VwcG9ydCA9IG51bGw7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShjcmVhdGVDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpKTsKLQotCQlzZXRSYW5nZUluZGljYXRvcihuZXcgRGVmYXVsdFJhbmdlSW5kaWNhdG9yKCkpOwotCQlzZXRFZGl0b3JDb250ZXh0TWVudUlkKEVESVRPUl9DT05URVhUX01FTlVfSUQpOwotCQlpbml0aWFsaXplRG9jdW1lbnRQcm92aWRlcihudWxsKTsKLQkJLy8gc2V0IHRoZSBpbmZvcG9wIGZvciBzb3VyY2Ugdmlld2VyCi0JCVN0cmluZyBoZWxwSWQgPSBnZXRIZWxwQ29udGV4dElkKCk7Ci0JCS8vIG5vIGluZm9wb3Agc2V0IG9yIHVzaW5nIGRlZmF1bHQgdGV4dCBlZGl0b3IgaGVscCwgdXNlIGRlZmF1bHQKLQkJaWYgKGhlbHBJZCA9PSBudWxsIHx8IElUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuVEVYVF9FRElUT1IuZXF1YWxzKGhlbHBJZCkpCi0JCQloZWxwSWQgPSBJSGVscENvbnRleHRJZHMuWE1MX1NPVVJDRV9WSUVXX0hFTFBJRDsKLQkJc2V0SGVscENvbnRleHRJZChoZWxwSWQpOwotCQkvLyBkZWZlY3QgMjAzMTU4IC0gZGlzYWJsZSBydWxlciBjb250ZXh0IG1lbnUgZm9yCi0JCS8vIGJldGEKLQkJLy8gc2V0UnVsZXJDb250ZXh0TWVudUlkKFJVTEVSX0NPTlRFWFRfTUVOVV9JRCk7Ci0JCWNvbmZpZ3VyZUluc2VydE1vZGUoU01BUlRfSU5TRVJULCB0cnVlKTsKLQotCQkvLyBlbmFibGUgdGhlIGJhc2Ugc291cmNlIGVkaXRvciBhY3Rpdml0eSB3aGVuIGVkaXRvciBvcGVucwotCQl0cnkgewotCQkJLy8gRklYTUU6IC0gY29tbWVudGVkIG91dCB0byBhdm9pZCBtaW5vciBkZXBlbmRhbmN5IGR1cmluZwotCQkJLy8gdHJhbnNpdGlvbiB0byBvcmcuZWNsaXBzZQotCQkJLy8gV1RQQWN0aXZpdHlCcmlkZ2UuZ2V0SW5zdGFuY2UoKS5lbmFibGVBY3Rpdml0eShDT1JFX1NTRV9BQ1RJVklUWV9JRCwKLQkJCS8vIHRydWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCBlbmFibGluZyBhY3Rpdml0eSwganVzdCBsb2cgdGhlCi0JCQkvLyBlcnJvciBidXQgZG9udAotCQkJLy8gaGF2ZSBpdCBicmVhayB0aGUgZWRpdG9yCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCB0LmdldE1lc3NhZ2UoKSwgdCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yI2luaXRpYWxpemVLZXlCaW5kaW5nU2NvcGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplS2V5QmluZGluZ1Njb3BlcygpIHsKLQkJc2V0S2V5QmluZGluZ1Njb3BlcyhuZXcgU3RyaW5nW117RURJVE9SX0tFWUJJTkRJTkdfU0NPUEVfSUR9KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlciBhbmQgb3RoZXIgaXRlbXMgdGhhdCB3ZXJlIHNvdXJjZQotCSAqIHZpZXdlci1kZXBlbmRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTb3VyY2VWaWV3ZXIoKSB7Ci0JCUlBY3Rpb24gY29udGVudEFzc2lzdEFjdGlvbiA9IGdldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUyk7Ci0JCWlmIChjb250ZW50QXNzaXN0QWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJKChJVXBkYXRlKSBjb250ZW50QXNzaXN0QWN0aW9uKS51cGRhdGUoKTsKLQkJfQotCQlJQWN0aW9uIG9wZW5IeXBlcmxpbmtBY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKTsKLQkJaWYgKG9wZW5IeXBlcmxpbmtBY3Rpb24gaW5zdGFuY2VvZiBPcGVuSHlwZXJsaW5rQWN0aW9uKSB7Ci0JCQkoKE9wZW5IeXBlcmxpbmtBY3Rpb24pIG9wZW5IeXBlcmxpbmtBY3Rpb24pLnNldEh5cGVybGlua0RldGVjdG9ycyhnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGdldFNvdXJjZVZpZXdlcigpKSk7Ci0JCX0KLQotCQkvLyBkbyBub3QgZXZlbiBpbnN0YWxsIHByb2plY3Rpb24gc3VwcG9ydCB1bnRpbCBmb2xkaW5nIGlzIGFjdHVhbGx5Ci0JCS8vIGVuYWJsZWQKLQkJaWYgKGlzRm9sZGluZ0VuYWJsZWQoKSkgewotCQkJaW5zdGFsbFByb2plY3Rpb25TdXBwb3J0KCk7Ci0JCX0KLQotCQkvLyBpbml0aWFsaXplIHNvdXJjZSB2aWV3ZXIncyBjb3JyZWN0aW9uIGFzc2lzdGFudAotCQlJQ29udGVudEFzc2lzdGFudCBjb3JyZWN0aW9uQXNzaXN0YW50ID0gY3JlYXRlQ29ycmVjdGlvbkFzc2lzdGFudCgpOwotCQlnZXRUZXh0Vmlld2VyKCkuc2V0Q29ycmVjdGlvbkFzc2lzdGFudChjb3JyZWN0aW9uQXNzaXN0YW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U291cmNlVmlld2VyKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvLyBlbnN1cmUgZGVjb3JhdGlvbiBzdXBwb3J0IGlzIGNvbmZpZ3VyZWQKLQkJZ2V0U291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoc291cmNlVmlld2VyKTsKLQkJZk1vdXNlVHJhY2tlciA9IG5ldyBNb3VzZVRyYWNrZXIoKTsKLQkJZk1vdXNlVHJhY2tlci5zdGFydChzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpKTsKLQkJaW5pdGlhbGl6ZURyb3Aoc291cmNlVmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yI2luc3RhbGxFbmNvZGluZ1N1cHBvcnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxFbmNvZGluZ1N1cHBvcnQoKSB7Ci0JCS8vIFRPRE86IGluc3RhbGwgb3VyIGN1c3RvbSBzdXBwb3J0IHRoYXQgY2FuCi0JCS8vIHVwZGF0ZSBkb2N1bWVudCBhcHByb3ByaWF0ZWx5Ci0JCS8vIHN1cGVyLmluc3RhbGxFbmNvZGluZ1N1cHBvcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGdldCBkb2N1bWVudCBmb2xkaW5nIHdvcmtpbmcgYW5kIGVuYWJsZQotCSAqIGRvY3VtZW50IGZvbGRpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFByb2plY3Rpb25TdXBwb3J0KCkgewotCQlQcm9qZWN0aW9uVmlld2VyIHByb2plY3Rpb25WaWV3ZXIgPSAoUHJvamVjdGlvblZpZXdlcikgZ2V0U291cmNlVmlld2VyKCk7Ci0KLQkJZlByb2plY3Rpb25TdXBwb3J0ID0gbmV3IFByb2plY3Rpb25TdXBwb3J0KHByb2plY3Rpb25WaWV3ZXIsIGdldEFubm90YXRpb25BY2Nlc3MoKSwgZ2V0U2hhcmVkQ29sb3JzKCkpOwotCQlmUHJvamVjdGlvblN1cHBvcnQuYWRkU3VtbWFyaXphYmxlQW5ub3RhdGlvblR5cGUoIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJZlByb2plY3Rpb25TdXBwb3J0LmFkZFN1bW1hcml6YWJsZUFubm90YXRpb25UeXBlKCJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci53YXJuaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJZlByb2plY3Rpb25TdXBwb3J0LnNldEhvdmVyQ29udHJvbENyZWF0b3IobmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCXJldHVybiBuZXcgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQpOwotCQkJfQotCQl9KTsKLQkJZlByb2plY3Rpb25TdXBwb3J0Lmluc3RhbGwoKTsKLQotCQlJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIgdXBkYXRlciA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgdXBkYXRlciA9PSBudWxsICYmIGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCXVwZGF0ZXIgPSAoSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLklELCBpZHNbaV0pOwotCQl9Ci0KLQkJZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgPSB1cGRhdGVyOwotCQlpZiAoZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgIT0gbnVsbCkKLQkJCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyLmluc3RhbGwocHJvamVjdGlvblZpZXdlcik7Ci0KLQkJaWYgKGlzRm9sZGluZ0VuYWJsZWQoKSkKLQkJCXByb2plY3Rpb25WaWV3ZXIuZG9PcGVyYXRpb24oUHJvamVjdGlvblZpZXdlci5UT0dHTEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGRvY3VtZW50IGZvbGRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHByZWZlcmVuY2Ugc3RvcmUgc2V0dGluZ3MuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBkb2N1bWVudCBmb2xkaW5nIHNob3VsZCBiZSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9sZGluZ0VuYWJsZWQoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJLy8gY2hlY2sgYm90aCBwcmVmZXJlbmNlIHN0b3JlIGFuZCB2bSBhcmd1bWVudAotCQlyZXR1cm4gKHN0b3JlLmdldEJvb2xlYW4oSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dVbmV4cGVjdGVkRG9jdW1lbnRLaW5kKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkvLyBkaXNwbGF5IGEgZGlhbG9nIGluZm9ybWluZyB1c2VyIG9mIHVrbm93biBjb250ZW50IHR5cGUKLQkJaWYgKFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKEVkaXRvclByZWZlcmVuY2VOYW1lcy5TSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRykpIHsKLQkJCUpvYiBqb2IgPSBuZXcgVUlKb2IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvcl8wKSB7Ci0JCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBVbmtub3duQ29udGVudFR5cGVEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCksIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0KLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlN0cnVjdHVyZWRUZXh0RWRpdG9yIGJlaW5nIHVzZWQgd2l0aG91dCBTdHJ1Y3R1cmVkRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQluYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9ICJpbnB1dCB3YXMgbnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiICAgICAgICAgSW5wdXQgTmFtZTogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpbXBsQ2xhc3MgPSBudWxsOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaW1wbENsYXNzID0gZG9jdW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbXBsQ2xhc3MgPSAiZG9jdW1lbnQgd2FzIG51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIiAgICAgICAgVW5leHBlY3RlZCBJRG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbjogIiArIGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIiAgICAgICAgVW5leHBlY3RlZCBJRG9jdW1lbnQgaW1wbGVtZW50YXRpb246ICIgKyBpbXBsQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI3BlcmZvcm1SZXZlcnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1SZXZlcnQoKSB7Ci0JCVByb2plY3Rpb25WaWV3ZXIgcHJvamVjdGlvblZpZXdlciA9IChQcm9qZWN0aW9uVmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJcHJvamVjdGlvblZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQl0cnkgewotCi0JCQlib29sZWFuIHByb2plY3Rpb25Nb2RlID0gcHJvamVjdGlvblZpZXdlci5pc1Byb2plY3Rpb25Nb2RlKCk7Ci0JCQlpZiAocHJvamVjdGlvbk1vZGUpIHsKLQkJCQlwcm9qZWN0aW9uVmlld2VyLmRpc2FibGVQcm9qZWN0aW9uKCk7Ci0JCQkJaWYgKGZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyICE9IG51bGwpCi0JCQkJCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyLnVuaW5zdGFsbCgpOwotCQkJfQotCi0JCQlzdXBlci5wZXJmb3JtUmV2ZXJ0KCk7Ci0KLQkJCWlmIChwcm9qZWN0aW9uTW9kZSkgewotCQkJCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKQotCQkJCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci5pbnN0YWxsKHByb2plY3Rpb25WaWV3ZXIpOwotCQkJCXByb2plY3Rpb25WaWV3ZXIuZW5hYmxlUHJvamVjdGlvbigpOwotCQkJfQotCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlwcm9qZWN0aW9uVmlld2VyLnNldFJlZHJhdyh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVkdWNlZCB0byBwcm90ZWN0ZWQgbWV0aG9kIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbWVtYmVyU2VsZWN0aW9uKCkgewotCQkvKgotCQkgKiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwdWJsaWMgZm9yIHVzZSBieSBlZGl0b3JzIHRoYXQgdXNlCi0JCSAqIFN0cnVjdHVyZWRUZXh0RWRpdG9yIChsaWtlIHNvbWUgY2xpZW50cykKLQkJICovCi0JCXN1cGVyLnJlbWVtYmVyU2VsZWN0aW9uKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBib3RoIHN0YXJ0cyBhbmQgcmVzZXRzIHRoZSBidXN5IHN0YXRlIHRpbWVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QnVzeVN0YXRlKCkgewotCQkvLyByZXNldCB0aGUgImJ1c3kiIHRpbWVvdXQKLQkJaWYgKGZCdXN5VGltZXIgIT0gbnVsbCkgewotCQkJZkJ1c3lUaW1lci5jYW5jZWwoKTsKLQkJfQotCQlzdGFydEJ1c3lUaW1lcigpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVkdWNlZCB0byBwcm90ZWN0ZWQgbWV0aG9kIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVTZWxlY3Rpb24oKSB7Ci0JCS8qCi0JCSAqIFRoaXMgbWV0aG9kIHdhcyBtYWRlIHB1YmxpYyBmb3IgdXNlIGJ5IGVkaXRvcnMgdGhhdCB1c2UKLQkJICogU3RydWN0dXJlZFRleHRFZGl0b3IgKGxpa2Ugc29tZSBjbGllbnRzKQotCQkgKi8KLQkJLy8gY2F0Y2ggb2RkIGNhc2Ugd2hlcmUgc291cmNlIHZpZXdlciBoYXMgbm8gdGV4dAotCQkvLyB3aWRnZXQgKGRlZmVjdAotCQkvLyAyMjc2NzApCi0JCWlmICgoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCkgJiYgKGdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKSAhPSBudWxsKSkKLQkJCXN1cGVyLnJlc3RvcmVTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI3J1bGVyQ29udGV4dE1lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1bGVyQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5ydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0KLQkJSU1lbnVNYW5hZ2VyIGZvbGRpbmdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFNTRVVJTWVzc2FnZXMuRm9sZGluZywgInByb2plY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQltZW51LmFwcGVuZFRvR3JvdXAoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfUlVMRVJTLCBmb2xkaW5nTWVudSk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb24oIkZvbGRpbmdUb2dnbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb2xkaW5nTWVudS5hZGQoYWN0aW9uKTsKLQkJYWN0aW9uID0gZ2V0QWN0aW9uKCJGb2xkaW5nRXhwYW5kQWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGluZ01lbnUuYWRkKGFjdGlvbik7Ci0JCWFjdGlvbiA9IGdldEFjdGlvbigiRm9sZGluZ0NvbGxhcHNlQWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGluZ01lbnUuYWRkKGFjdGlvbik7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gZ2V0SW50ZXJuYWxNb2RlbCgpOwotCQlpZiAoaW50ZXJuYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGRlYnVnZ2luZ0F2YWlsYWJsZSA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5pc0F2YWlsYWJsZShpbnRlcm5hbE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpLCBCcmVha3BvaW50UnVsZXJBY3Rpb24uZ2V0RmlsZUV4dGVuc2lvbihnZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQlpZiAoZGVidWdnaW5nQXZhaWxhYmxlKSB7Ci0JCQkJLy8gYXBwZW5kIGFjdGlvbnMgdG8gImRlYnVnIiBncm91cCAoY3JlYXRlZCBpbgotCQkJCS8vIEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvci5ydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cCgiZGVidWciLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cCgiZGVidWciLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5NQU5BR0VfQlJFQUtQT0lOVFMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cCgiZGVidWciLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5FRElUX0JSRUFLUE9JTlRTKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFkZEV4dGVuZGVkUnVsZXJDb250ZXh0TWVudUFjdGlvbnMobWVudSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogT3ZlcnJpZGRlbiB0byBleHBvc2UgcGFydCBhY3RpdmF0aW9uIGhhbmRsaW5nIGZvciBtdWx0aS1wYWdlIGVkaXRvcnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZWR1Y2VkIHRvIHByb3RlY3RlZCBtZXRob2QgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNzYWZlbHlTYW5pdHlDaGVja1N0YXRlKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYWZlbHlTYW5pdHlDaGVja1N0YXRlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zYWZlbHlTYW5pdHlDaGVja1N0YXRlKGlucHV0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZWRNb2RlbCgpIHsKLQkJaWYgKGdldEludGVybmFsTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlnZXRJbnRlcm5hbE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBJRG9jdW1lbnRQcm92aWRlciBpcyB1c2VkLiBGb3IgZGlyZWN0IG1vZGVscywgYQotCSAqIHNwZWNpYWwgcHJvdmlkZXIgaXMgdXNlZC4gRm9yIFN0b3JhZ2VFZGl0b3JJbnB1dHMsIHVzZSBhIGN1c3RvbQotCSAqIHByb3ZpZGVyIHRoYXQgY3JlYXRlcyBhIHVzYWJsZSBSZXNvdXJjZUFubm90YXRpb25Nb2RlbC4gRm9yIGV2ZXJ5dGhpbmcKLQkgKiBlbHNlLCB1c2UgdGhlIGJhc2Ugc3VwcG9ydC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yI3NldERvY3VtZW50UHJvdmlkZXIob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCS8vIGxhcmdlbHkgdW50ZXN0ZWQKLQkJCXNldERvY3VtZW50UHJvdmlkZXIoU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKLQkJfQotCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQgJiYgIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpICYmICEoaW5wdXQgaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSkgewotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihTdG9yYWdlTW9kZWxQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGVkaXRvciBwYXJ0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yUGFydAotCSAqICAgICAgICAgICAgZWRpdG9yIHBhcnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCWZFZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RlbCBmaWVsZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBjYW4gZXZlbnR1YWxseSBiZSBlbGltaW5hdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXREb2N1bWVudFByb3ZpZGVyKCksICJkb2N1bWVudCBwcm92aWRlciBjYW4gbm90IGJlIG51bGwgd2hlbiBzZXR0aW5nIG1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihnZXRJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlmU3RydWN0dXJlZE1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpKTsKLQkJfQotCQlmU3RydWN0dXJlZE1vZGVsID0gbmV3TW9kZWw7Ci0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCWlmIChmU3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIoZ2V0SW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZlN0cnVjdHVyZWRNb2RlbC5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCX0KLQkJLy8gdXBkYXRlKCkgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgbW9kZWwgaXMKLQkJLy8gc2V0IG9yIGNoYW5nZWQKLQkJdXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlciBjb25maWd1cmF0aW9uIHdoaWNoIGl0IHVzZXMgdG8KLQkgKiBjb25maWd1cmUgaXQncyBpbnRlcm5hbCBzb3VyY2Ugdmlld2VyLiBUaGlzIG1ldGhvZCB3YXMgb3ZlcndyaXR0ZW4gc28KLQkgKiB0aGF0IHZpZXdlciBjb25maWd1cmF0aW9uIGNvdWxkIGJlIHNldCBhZnRlciBlZGl0b3IgcGFydCB3YXMgY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyLnNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJU3RydWN0dXJlZFRleHRWaWV3ZXIgc3R2ID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAoc3R2ICE9IG51bGwpIHsKLQkJCS8vIHRoZXJlIHNob3VsZCBiZSBubyBuZWVkIHRvIHVuY29uZmlndXJlCi0JCQkvLyBiZWZvcmUgY29uZmlndXJlIGJlY2F1c2UKLQkJCS8vIGNvbmZpZ3VyZSB3aWxsCi0JCQkvLyBhbHNvIHVuY29uZmlndXJlIGJlZm9yZSBjb25maWd1cmluZwotCQkJc3R2LnVuY29uZmlndXJlKCk7Ci0JCQlzdHYuY29uZmlndXJlKGNvbmZpZyk7Ci0KLQkJCS8vIHVwZGF0ZSBzb3VyY2Ugdmlld2VyJ3MgY29ycmVjdGlvbiBhc3Npc3RhbnQgYXMgd2VsbAotCQkJSUNvbnRlbnRBc3Npc3RhbnQgY29ycmVjdGlvbkFzc2lzdGFudCA9IGNyZWF0ZUNvcnJlY3Rpb25Bc3Npc3RhbnQoKTsKLQkJCXN0di5zZXRDb3JyZWN0aW9uQXNzaXN0YW50KGNvcnJlY3Rpb25Bc3Npc3RhbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2hvd0J1c3koYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93QnVzeShib29sZWFuIGJ1c3kpIHsKLQkJaWYgKGJ1c3kpIHsKLQkJCWZSZW1lbWJlclRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkJCS8vIHVwZGF0ZSB0aXRsZSBhbmQvb3IgZm9udHMgYW5kL29yIGJhY2tncm91bmQKLQkJCS8vCi0JCQkvLyB0ZW1wIHNvbHV0aW9uLCBmb3IgdGVzdGluZywgdXNlcyAiYnVzeSIKLQkJCXNldFBhcnROYW1lKFNTRVVJTWVzc2FnZXMuYnVzeSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJlc2V0IHRvIHdoYXQgaXQgd2FzCi0JCQlzZXRQYXJ0TmFtZShmUmVtZW1iZXJUaXRsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRCdXN5VGltZXIoKSB7Ci0JCS8vIFRPRE86IHdlIG5lZWQgYSByZXNldHRhYmxlIHRpbWVyLCBzbyBub3Qgc28KLQkJLy8gbWFueSBhcmUgY3JlYXRlZAotCQlmQnVzeVRpbWVyID0gbmV3IFRpbWVyKHRydWUpOwotCQlmQnVzeVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lT3V0RXhwaXJlZCgpLCBCVVNZX1NUQVRFX0RFTEFZKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgbW9kZWwgaXMgc2V0IG9yIGNoYW5nZWQgKGFzIGluCi0JICogc3dhcHBlZCkKLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCAmJiBmT3V0bGluZVBhZ2UgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIHsKLQkJCUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKTsKLQkJCSgoQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKSBmT3V0bGluZVBhZ2UpLnNldENvbmZpZ3VyYXRpb24oY2ZnKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgaW50ZXJuYWxNb2RlbCA9IGdldEludGVybmFsTW9kZWwoKTsKLQkJCSgoQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKSBmT3V0bGluZVBhZ2UpLnNldElucHV0Q29udGVudFR5cGVJZGVudGlmaWVyKGludGVybmFsTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQkJKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkuc2V0SW5wdXQoaW50ZXJuYWxNb2RlbCk7Ci0JCX0KLQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmIGZQcm9wZXJ0eVNoZWV0UGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCQlQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpOwotCQkJKChDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSkgZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRDb25maWd1cmF0aW9uKGNmZyk7Ci0JCX0KLQkJZGlzcG9zZU1vZGVsRGVwZW5kZW50RmllbGRzKCk7Ci0KLQkJZlNob3dJblRhcmdldElkcyA9IGNyZWF0ZVNob3dJblRhcmdldElkcygpOwotCi0JCXVwZGF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCWlmIChmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIuc2V0RG9jdW1lbnQoZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJfQotCi0JCWNyZWF0ZU1vZGVsRGVwZW5kZW50RmllbGRzKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBhbGwgY29udGVudCBkZXBlbmRlbnQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZW50RGVwZW5kZW50QWN0aW9ucygpIHsKLQkJc3VwZXIudXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKTsKLQkJLy8gc3VwZXIudXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMgb25seSB1cGRhdGVzCi0JCS8vIHRoZSBlbmFibGUvZGlzYWJsZQotCQkvLyBzdGF0ZSBvZiBhbGwKLQkJLy8gdGhlIGNvbnRlbnQgZGVwZW5kZW50IGFjdGlvbnMuCi0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yJ3MgdW5kbyBhbmQgcmVkbyBhY3Rpb25zCi0JCS8vIGhhdmUgYSBkZXRhaWwgbGFiZWwgYW5kCi0JCS8vIGRlc2NyaXB0aW9uLgotCQkvLyBUaGV5IG5lZWRlZCB0byBiZSB1cGRhdGVkLgotCQlpZiAoIWZFZGl0b3JEaXNwb3NlZCkKLQkJCXVwZGF0ZU1lbnVUZXh0KCk7Ci0JfQotCi0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlZGl0b3IgY29udGV4dCBtZW51IGJ5IGNyZWF0aW5nIGEgbmV3IGNvbnRleHQgbWVudSB3aXRoIHRoZQotCSAqIGdpdmVuIG1lbnUgaWQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dE1lbnVJZAotCSAqICAgICAgICAgICAgQ2Fubm90IGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRWRpdG9yQ29udGV4dE1lbnVJZChTdHJpbmcgY29udGV4dE1lbnVJZCkgewotCQkvLyB1cGRhdGUgZWRpdG9yIGNvbnRleHQgbWVudSBpZCBpZiB1cGRhdGluZyB0byBhIG5ldyBpZCBvciBpZiBjb250ZXh0Ci0JCS8vIG1lbnUgaXMgbm90IGFscmVhZHkgc2V0IHVwCi0JCWlmICghY29udGV4dE1lbnVJZC5lcXVhbHMoZ2V0RWRpdG9yQ29udGV4dE1lbnVJZCgpKSB8fCAoZlRleHRDb250ZXh0TWVudSA9PSBudWxsKSkgewotCQkJc2V0RWRpdG9yQ29udGV4dE1lbnVJZChjb250ZXh0TWVudUlkKTsKLQotCQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNwb3NlIG9mIHByZXZpb3VzIGNvbnRleHQgbWVudQotCQkJCQlpZiAoZlRleHRDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQkJCQlmVGV4dENvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlpZiAoZlRleHRDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0JCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQkJfQotCi0JCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKGdldEVkaXRvckNvbnRleHRNZW51SWQoKSwgZ2V0RWRpdG9yQ29udGV4dE1lbnVJZCgpKTsKLQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQotCQkJCQlmVGV4dENvbnRleHRNZW51ID0gZlRleHRDb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoc3R5bGVkVGV4dCk7Ci0JCQkJCXN0eWxlZFRleHQuc2V0TWVudShmVGV4dENvbnRleHRNZW51KTsKLQotCQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShnZXRFZGl0b3JDb250ZXh0TWVudUlkKCksIGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQotCQkJCQkvLyBhbHNvIHJlZ2lzdGVyIHRoaXMgbWVudSBmb3Igc291cmNlIHBhZ2UgcGFydCBhbmQKLQkJCQkJLy8gc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpZHMKLQkJCQkJU3RyaW5nIHBhcnRJZCA9IGdldFNpdGUoKS5nZXRJZCgpOwotCQkJCQlpZiAocGFydElkICE9IG51bGwpIHsKLQkJCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KHBhcnRJZCArIEVESVRPUl9DT05URVhUX01FTlVfU1VGRklYLCBmVGV4dENvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoRURJVE9SX0NPTlRFWFRfTUVOVV9JRCwgZlRleHRDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgZWRpdG9yIGNvbnRleHQgbWVudSwgdmVydGljYWwgcnVsZXIgbWVudSwgaGVscCBjb250ZXh0IGlkIGZvcgotCSAqIG5ldyBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCXVwZGF0ZUVkaXRvckNvbnRleHRNZW51SWQoRURJVE9SX0NPTlRFWFRfTUVOVV9JRCk7Ci0JCQl1cGRhdGVSdWxlckNvbnRleHRNZW51SWQoUlVMRVJfQ09OVEVYVF9NRU5VX0lEKTsKLQkJCXVwZGF0ZUhlbHBDb250ZXh0SWQoSVRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5URVhUX0VESVRPUik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250ZXh0TWVudUlkKGNvbnRlbnRUeXBlICsgRURJVE9SX0NPTlRFWFRfTUVOVV9TVUZGSVgpOwotCQkJdXBkYXRlUnVsZXJDb250ZXh0TWVudUlkKGNvbnRlbnRUeXBlICsgUlVMRVJfQ09OVEVYVF9NRU5VX1NVRkZJWCk7Ci0JCQl1cGRhdGVIZWxwQ29udGV4dElkKGNvbnRlbnRUeXBlICsgIl9zb3VyY2VfSGVscElkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVFbmNvZGluZ01lbWVudG8oKSB7Ci0JCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgaW50ZXJuYWxNb2RlbCA9IGdldEludGVybmFsTW9kZWwoKTsKLQkJaWYgKGludGVybmFsTW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBpbnRlcm5hbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJRW5jb2RpbmdNZW1lbnRvIG1lbWVudG8gPSBkb2MuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBpbnRlcm5hbE1vZGVsLmdldE1vZGVsSGFuZGxlcigpLmdldEVuY29kaW5nRGV0ZWN0b3IoKTsKLQkJCWlmIChtZW1lbnRvICE9IG51bGwgJiYgZGV0ZWN0b3IgIT0gbnVsbCkKLQkJCQlkZXRlY3Rvci5zZXQoZG9jKTsKLQkJCXRyeSB7Ci0JCQkJZGV0ZWN0b3IuZ2V0RW5jb2RpbmcoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCX0KLQkJCS8vIGJlIHN1cmUgdG8gdXNlIHRoZSBuZXcgaW5zdGFuY2UKLQkJCS8vIGJ1dCBvbmx5IGlmIG5vIGV4Y2VwdGlvbiBvY2N1cnJlZC4KLQkJCS8vICh3ZSBtYXkgZmluZCBjYXNlcyB3ZSBuZWVkIHRvIGRvIG1vcmUgZXJyb3IgcmVjb3ZlciB0aGVyZSkKLQkJCS8vIHNob3VsZCBiZSBuZWFyIGltcG9zc2libGUgdG8gZ2V0IElPRXhjZXB0aW9uIGZyb20gcHJvY2Vzc2luZwotCQkJLy8gdGhlCi0JCQkvLyAqZG9jdW1lbnQqCi0JCQlpZiAoIWZhaWxlZCkgewotCQkJCWRvYy5zZXRFbmNvZGluZ01lbWVudG8obWVtZW50byk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBoZWxwIGNvbnRleHQgb2YgdGhlIGVkaXRvciB3aXRoIHRoZSBnaXZlbiBoZWxwIGNvbnRleHQgaWQKLQkgKiAKLQkgKiBAcGFyYW0gaGVscENvbnRleHRJZAotCSAqICAgICAgICAgICAgQ2Fubm90IGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSGVscENvbnRleHRJZChTdHJpbmcgaGVscENvbnRleHRJZCkgewotCQlpZiAoIWhlbHBDb250ZXh0SWQuZXF1YWxzKGdldEhlbHBDb250ZXh0SWQoKSkpIHsKLQkJCXNldEhlbHBDb250ZXh0SWQoaGVscENvbnRleHRJZCk7Ci0KLQkJCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpOwotCQkJCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkJCQloZWxwU3lzdGVtLnNldEhlbHAoc3R5bGVkVGV4dCwgZ2V0SGVscENvbnRleHRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgaG92ZXJpbmcgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHRoZSBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSG92ZXJCZWhhdmlvcigpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQlTdHJpbmdbXSB0eXBlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCi0JCQlTdHJpbmcgdCA9IHR5cGVzW2ldOwotCi0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgewotCQkJCS8vIFJlbW92ZSBleGlzdGluZyBob3ZlcnMKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgc291cmNlVmlld2VyKS5yZW1vdmVUZXh0SG92ZXJzKHQpOwotCi0JCQkJaW50W10gc3RhdGVNYXNrcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZFRleHRIb3ZlclN0YXRlTWFza3MoZ2V0U291cmNlVmlld2VyKCksIHQpOwotCi0JCQkJaWYgKHN0YXRlTWFza3MgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlTWFza3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWludCBzdGF0ZU1hc2sgPSBzdGF0ZU1hc2tzW2pdOwotCQkJCQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIHQsIHN0YXRlTWFzayk7Ci0JCQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgc291cmNlVmlld2VyKS5zZXRUZXh0SG92ZXIodGV4dEhvdmVyLCB0LCBzdGF0ZU1hc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVGV4dEhvdmVyIHRleHRIb3ZlciA9IGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgdCk7Ci0JCQkJCSgoSVRleHRWaWV3ZXJFeHRlbnNpb24yKSBzb3VyY2VWaWV3ZXIpLnNldFRleHRIb3Zlcih0ZXh0SG92ZXIsIHQsIElUZXh0Vmlld2VyRXh0ZW5zaW9uMi5ERUZBVUxUX0hPVkVSX1NUQVRFX01BU0spOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQlzb3VyY2VWaWV3ZXIuc2V0VGV4dEhvdmVyKGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgdCksIHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lbnVUZXh0KCkgewotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsICYmICFmU3RydWN0dXJlZE1vZGVsLmlzTW9kZWxTdGF0ZUNoYW5naW5nKCkgJiYgZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKSAhPSBudWxsKSB7Ci0JCQkvLyBwZXJmb3JtYW5jZTogZG9uJ3QgZm9yY2UgYW4gdXBkYXRlIG9mIHRoZSBhY3Rpb24gYmFycyB1bmxlc3MKLQkJCS8vIHJlcXVpcmVkIGFzIGl0IGlzIGV4cGVuc2l2ZQotCQkJU3RyaW5nIHByZXZpb3VzVW5kb1RleHQgPSBudWxsOwotCQkJU3RyaW5nIHByZXZpb3VzVW5kb0Rlc2MgPSBudWxsOwotCQkJU3RyaW5nIHByZXZpb3VzUmVkb1RleHQgPSBudWxsOwotCQkJU3RyaW5nIHByZXZpb3VzUmVkb0Rlc2MgPSBudWxsOwotCQkJYm9vbGVhbiB1cGRhdGVBY3Rpb25zID0gZmFsc2U7Ci0JCQlJQWN0aW9uIHVuZG9BY3Rpb24gPSBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETyk7Ci0JCQlJQWN0aW9uIHJlZG9BY3Rpb24gPSBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETyk7Ci0JCQlpZiAodW5kb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJcHJldmlvdXNVbmRvVGV4dCA9IHVuZG9BY3Rpb24uZ2V0VGV4dCgpOwotCQkJCXByZXZpb3VzVW5kb0Rlc2MgPSB1bmRvQWN0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgcHJldmlvdXNVbmRvVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzVW5kb0Rlc2MgPT0gbnVsbDsKLQkJCQl1bmRvQWN0aW9uLnNldFRleHQoVU5ET19BQ1RJT05fVEVYVF9ERUZBVUxUKTsKLQkJCQl1bmRvQWN0aW9uLnNldERlc2NyaXB0aW9uKFVORE9fQUNUSU9OX0RFU0NfREVGQVVMVCk7Ci0JCQl9Ci0JCQlpZiAocmVkb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJcHJldmlvdXNSZWRvVGV4dCA9IHJlZG9BY3Rpb24uZ2V0VGV4dCgpOwotCQkJCXByZXZpb3VzUmVkb0Rlc2MgPSByZWRvQWN0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgcHJldmlvdXNSZWRvVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzUmVkb0Rlc2MgPT0gbnVsbDsKLQkJCQlyZWRvQWN0aW9uLnNldFRleHQoUkVET19BQ1RJT05fVEVYVF9ERUZBVUxUKTsKLQkJCQlyZWRvQWN0aW9uLnNldERlc2NyaXB0aW9uKFJFRE9fQUNUSU9OX0RFU0NfREVGQVVMVCk7Ci0JCQl9Ci0JCQlpZiAoZlN0cnVjdHVyZWRNb2RlbC5nZXRVbmRvTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlciA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCQkvLyBnZXQgdW5kbyBjb21tYW5kCi0JCQkJQ29tbWFuZCB1bmRvQ29tbWFuZCA9IHVuZG9NYW5hZ2VyLmdldFVuZG9Db21tYW5kKCk7Ci0JCQkJLy8gc2V0IHVuZG8gbGFiZWwgYW5kIGRlc2NyaXB0aW9uCi0JCQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKHVuZG9NYW5hZ2VyLnVuZG9hYmxlKCkpOwotCQkJCWlmICh1bmRvQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBsYWJlbCA9IHVuZG9Db21tYW5kLmdldExhYmVsKCk7Ci0JCQkJCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgY3VzdG9tVGV4dCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVORE9fQUNUSU9OX1RFWFQsIG5ldyBTdHJpbmdbXXtsYWJlbH0pOwotCQkJCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgY3VzdG9tVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzVW5kb1RleHQgPT0gbnVsbCB8fCAhY3VzdG9tVGV4dC5lcXVhbHMocHJldmlvdXNVbmRvVGV4dCk7Ci0JCQkJCQl1bmRvQWN0aW9uLnNldFRleHQoY3VzdG9tVGV4dCk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGRlc2MgPSB1bmRvQ29tbWFuZC5nZXREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgY3VzdG9tRGVzYyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVORE9fQUNUSU9OX0RFU0MsIG5ldyBTdHJpbmdbXXtkZXNjfSk7Ci0JCQkJCQl1cGRhdGVBY3Rpb25zID0gdXBkYXRlQWN0aW9ucyB8fCBjdXN0b21EZXNjID09IG51bGwgfHwgcHJldmlvdXNSZWRvRGVzYyA9PSBudWxsIHx8ICFjdXN0b21EZXNjLmVxdWFscyhwcmV2aW91c1VuZG9EZXNjKTsKLQkJCQkJCXVuZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oY3VzdG9tRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZ2V0IHJlZG8gY29tbWFuZAotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSB1bmRvTWFuYWdlci5nZXRSZWRvQ29tbWFuZCgpOwotCQkJCS8vIHNldCByZWRvIGxhYmVsIGFuZCBkZXNjcmlwdGlvbgotCQkJCXJlZG9BY3Rpb24uc2V0RW5hYmxlZCh1bmRvTWFuYWdlci5yZWRvYWJsZSgpKTsKLQkJCQlpZiAocmVkb0NvbW1hbmQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbGFiZWwgPSByZWRvQ29tbWFuZC5nZXRMYWJlbCgpOwotCQkJCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGN1c3RvbVRleHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSRURPX0FDVElPTl9URVhULCBuZXcgU3RyaW5nW117bGFiZWx9KTsKLQkJCQkJCXVwZGF0ZUFjdGlvbnMgPSB1cGRhdGVBY3Rpb25zIHx8IGN1c3RvbVRleHQgPT0gbnVsbCB8fCBwcmV2aW91c1JlZG9UZXh0ID09IG51bGwgfHwgIWN1c3RvbVRleHQuZXF1YWxzKHByZXZpb3VzUmVkb1RleHQpOwotCQkJCQkJcmVkb0FjdGlvbi5zZXRUZXh0KGN1c3RvbVRleHQpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBkZXNjID0gcmVkb0NvbW1hbmQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGN1c3RvbURlc2MgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSRURPX0FDVElPTl9ERVNDLCBuZXcgU3RyaW5nW117ZGVzY30pOwotCQkJCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgY3VzdG9tRGVzYyA9PSBudWxsIHx8IHByZXZpb3VzUmVkb0Rlc2MgPT0gbnVsbCB8fCAhY3VzdG9tRGVzYy5lcXVhbHMocHJldmlvdXNSZWRvRGVzYyk7Ci0JCQkJCQlyZWRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGN1c3RvbURlc2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gdGVsbCB0aGUgYWN0aW9uIGJhcnMgdG8gdXBkYXRlCi0JCQlpZiAodXBkYXRlQWN0aW9ucykgewotCQkJCWlmIChnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpICE9IG51bGwpIHsKLQkJCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldEVkaXRvclBhcnQoKSAhPSBudWxsICYmIGdldEVkaXRvclBhcnQoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpICE9IG51bGwpIHsKLQkJCQkJZ2V0RWRpdG9yUGFydCgpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlUmFuZ2VJbmRpY2F0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmFuZ2VVcGRhdGVkID0gZmFsc2U7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAhKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCWlmIChvYmplY3RzLmxlbmd0aCA+IDAgJiYgb2JqZWN0c1swXSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG9iamVjdHNbMF0pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1swXSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJaWYgKG9iamVjdHMubGVuZ3RoID4gMSkgewotCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1tpXSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1tpXSkuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdldFNvdXJjZVZpZXdlcigpLnNldFJhbmdlSW5kaWNhdGlvbihzdGFydCwgZW5kIC0gc3RhcnQsIGZhbHNlKTsKLQkJCQlyYW5nZVVwZGF0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghcmFuZ2VVcGRhdGVkKSB7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKSwgKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0U291cmNlVmlld2VyKCkucmVtb3ZlUmFuZ2VJbmRpY2F0aW9uKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVkaXRvciB2ZXJ0aWNhbCBydWxlciBtZW51IGJ5IGNyZWF0aW5nIGEgbmV3IHZlcnRpY2FsIHJ1bGVyCi0JICogY29udGV4dCBtZW51IHdpdGggdGhlIGdpdmVuIG1lbnUgaWQKLQkgKiAKLQkgKiBAcGFyYW0gcnVsZXJNZW51SWQKLQkgKiAgICAgICAgICAgIENhbm5vdCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bGVyQ29udGV4dE1lbnVJZChTdHJpbmcgcnVsZXJNZW51SWQpIHsKLQkJLy8gdXBkYXRlIHJ1bGVyIGNvbnRleHQgbWVudSBpZCBpZiB1cGRhdGluZyB0byBhIG5ldyBpZCBvciBpZiBjb250ZXh0Ci0JCS8vIG1lbnUgaXMgbm90IGFscmVhZHkgc2V0IHVwCi0JCWlmICghcnVsZXJNZW51SWQuZXF1YWxzKGdldFJ1bGVyQ29udGV4dE1lbnVJZCgpKSB8fCAoZlJ1bGVyQ29udGV4dE1lbnUgPT0gbnVsbCkpIHsKLQkJCXNldFJ1bGVyQ29udGV4dE1lbnVJZChydWxlck1lbnVJZCk7Ci0KLQkJCWlmIChnZXRWZXJ0aWNhbFJ1bGVyKCkgIT0gbnVsbCkgewotCQkJCS8vIGRpc3Bvc2Ugb2YgcHJldmlvdXMgcnVsZXIgY29udGV4dCBtZW51Ci0JCQkJaWYgKGZSdWxlckNvbnRleHRNZW51ICE9IG51bGwpIHsKLQkJCQkJZlJ1bGVyQ29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpZiAoZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihnZXRDb250ZXh0TWVudUxpc3RlbmVyKCkpOwotCQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKGdldFJ1bGVyQ29udGV4dE1lbnVJZCgpLCBnZXRSdWxlckNvbnRleHRNZW51SWQoKSk7Ci0JCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0KLQkJCQlDb250cm9sIHJ1bGVyQ29udHJvbCA9IGdldFZlcnRpY2FsUnVsZXIoKS5nZXRDb250cm9sKCk7Ci0JCQkJZlJ1bGVyQ29udGV4dE1lbnUgPSBmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocnVsZXJDb250cm9sKTsKLQkJCQlydWxlckNvbnRyb2wuc2V0TWVudShmUnVsZXJDb250ZXh0TWVudSk7Ci0KLQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShnZXRSdWxlckNvbnRleHRNZW51SWQoKSwgZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQotCQkJCS8vIGFsc28gcmVnaXN0ZXIgdGhpcyBtZW51IGZvciBzb3VyY2UgcGFnZSBwYXJ0IGFuZCBzdHJ1Y3R1cmVkCi0JCQkJLy8gdGV4dCBlZGl0b3IgaWRzCi0JCQkJU3RyaW5nIHBhcnRJZCA9IGdldFNpdGUoKS5nZXRJZCgpOwotCQkJCWlmIChwYXJ0SWQgIT0gbnVsbCkgewotCQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShwYXJ0SWQgKyBSVUxFUl9DT05URVhUX01FTlVfU1VGRklYLCBmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJCX0KLQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShSVUxFUl9DT05URVhUX01FTlVfSUQsIGZSdWxlckNvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkvLyBubyBuZWVkIHRvIHVwZGF0ZSBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24gaWYgb25lIGRvZXMgbm90IGV4aXN0Ci0JCS8vIHlldAotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZG8gbm90IGNvbmZpZ3VyZSBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24gdHdpY2UKLQkJYm9vbGVhbiBjb25maWd1cmVkID0gZmFsc2U7Ci0KLQkJLy8gc3RydWN0dXJlZHRleHR2aWV3ZXIgb25seSB3b3JrcyB3aXRoCi0JCS8vIHN0cnVjdHVyZWR0ZXh0dmlld2VyY29uZmlndXJhdGlvbgotCQlpZiAoIShjb25maWd1cmF0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSkgewotCQkJQ29uZmlndXJhdGlvbkFuZFRhcmdldCBjYXQgPSBjcmVhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkID0gY2F0LmdldFRhcmdldElkKCk7Ci0JCQljb25maWd1cmF0aW9uID0gY2F0LmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCXNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0JCQljb25maWd1cmVkID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCUNvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY2F0ID0gY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIG5ld1ZpZXdlckNvbmZpZ3VyYXRpb24gPSBjYXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJaWYgKCEoY2F0LmdldFRhcmdldElkKCkuZXF1YWxzKGZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQpKSkgewotCQkJCS8vIGQyODI4OTQgdXNlIG5ld1ZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCQlmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkID0gY2F0LmdldFRhcmdldElkKCk7Ci0JCQkJY29uZmlndXJhdGlvbiA9IG5ld1ZpZXdlckNvbmZpZ3VyYXRpb247Ci0JCQkJc2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLQkJCQljb25maWd1cmVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkvLyBub3Qgc3VyZSBpZiByZWFsbHkgbmVlZCB0byByZWNvbmZpZ3VyZSB3aGVuIGlucHV0IGNoYW5nZXMKLQkJCS8vIChtYXliZSBvbmx5IG5lZWQgdG8gcmVzZXQgdmlld2VyY29uZmlnJ3MgZG9jdW1lbnQpCi0JCQlpZiAoIWNvbmZpZ3VyZWQpCi0JCQkJZ2V0U291cmNlVmlld2VyKCkuY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOwotCQkJSUFjdGlvbiBjb250ZW50QXNzaXN0QWN0aW9uID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKTsKLQkJCWlmIChjb250ZW50QXNzaXN0QWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJCSgoSVVwZGF0ZSkgY29udGVudEFzc2lzdEFjdGlvbikudXBkYXRlKCk7Ci0JCQl9Ci0JCQlJQWN0aW9uIG9wZW5IeXBlcmxpbmtBY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKTsKLQkJCWlmIChvcGVuSHlwZXJsaW5rQWN0aW9uIGluc3RhbmNlb2YgT3Blbkh5cGVybGlua0FjdGlvbikgewotCQkJCSgoT3Blbkh5cGVybGlua0FjdGlvbikgb3Blbkh5cGVybGlua0FjdGlvbikuc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRIeXBlcmxpbmtEZXRlY3RvcnMoZ2V0U291cmNlVmlld2VyKCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0ZpZWxkKFN0cmluZyBjYXRlZ29yeSkgewotCQlzdXBlci51cGRhdGVTdGF0dXNGaWVsZChjYXRlZ29yeSk7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNUQVRVU19DQVRFR09SWV9PRkZTRVQuZXF1YWxzKGNhdGVnb3J5KSkgewotCQkJSVN0YXR1c0ZpZWxkIGZpZWxkID0gZ2V0U3RhdHVzRmllbGQoY2F0ZWdvcnkpOwotCQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBvZmZzZXQxID0gd2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KGdldFNvdXJjZVZpZXdlcigpLCBzZWxlY3Rpb24ueCk7Ci0JCQkJaW50IG9mZnNldDIgPSB3aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQoZ2V0U291cmNlVmlld2VyKCksIHNlbGVjdGlvbi55KTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKG9mZnNldDEgIT0gb2Zmc2V0MikKLQkJCQkJdGV4dCA9ICJbIiArIG9mZnNldDEgKyAiLSIgKyBvZmZzZXQyICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVsc2UKLQkJCQkJdGV4dCA9ICJbICIgKyBvZmZzZXQxICsgIiBdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZmllbGQuc2V0VGV4dCh0ZXh0ID09IG51bGwgPyBmRXJyb3JMYWJlbCA6IHRleHQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2EyNjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLkluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJlc2VudGF0aW9uLklQcmVzZW50YXRpb25SZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkNoYWluZWRQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQuSFRNTFRleHRQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbmsuSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcy5Db21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLkJlc3RNYXRjaEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5Qcm9ibGVtQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotCi0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHNvdXJjZSB2aWV3ZXIgdXNlZCBieSBTdHJ1Y3R1cmVkVGV4dEVkaXRvci48YnIgLz4KLSAqIE5vdGU6IFdoaWxlIElTb3VyY2VWaWV3ZXIgaXMgcGFzc2VkIGluIGZvciBlYWNoIGdldCBjb25maWd1cmF0aW9uLCBjbGllbnRzCi0gKiBzaG91bGQgY3JlYXRlIGEgbmV3IHZpZXdlciBjb25maWd1cmF0aW9uIGluc3RhbmNlIGZvciBlYWNoIGluc3RhbmNlIG9mCi0gKiBzb3VyY2Ugdmlld2VyIGFzIHNvbWUgbWV0aG9kcyByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgYW4gb2JqZWN0LAotICogcmVnYXJkbGVzcyBvZiB0aGUgc291cmNldmlld2VyLgotICogPHA+Ci0gKiBDbGllbnRzIHNob3VsZCBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUKLSAqIHNwZWNpZmljIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgVGV4dFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2UgY3JlYXRpbmcgYSBzZWNvbmQgYXNzaXN0YW50IHRoYXQKLQkgKiBpcyBhZGRlZCB0byBhIHZpZXdlciBjYW4gY2F1c2Ugb2RkIGtleS1lYXRpbmcgYnkgdGhlIHdyb25nIG9uZS4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50IGZDb250ZW50QXNzaXN0YW50ID0gbnVsbDsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgSVJlY29uY2lsZXIgZlJlY29uY2lsZXI7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdHJ1Y3R1cmVkIHRleHQgdmlld2VyIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gaW5pdGlhbGl6ZSBmUHJlZmVyZW5jZVN0b3JlIHdpdGggc2FtZSBwcmVmZXJlbmNlIHN0b3JlIHVzZWQgaW4KLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IKLQkJZlByZWZlcmVuY2VTdG9yZSA9IGNyZWF0ZUNvbWJpbmVkUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGNvbWJpbmVzIHRoZSBzb3VyY2UgZWRpdG9yIHByZWZlcmVuY2VzCi0JICogd2l0aCB0aGUgYmFzZSBlZGl0b3IncyBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgYmFzZUVkaXRvclByZWZzID0gRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gbmV3IENoYWluZWRQcmVmZXJlbmNlU3RvcmUobmV3IElQcmVmZXJlbmNlU3RvcmVbXXtzc2VFZGl0b3JQcmVmcywgYmFzZUVkaXRvclByZWZzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiBob3ZlciB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIHRvIGJlCi0JICogc2hvd24gaW4gYSBob3ZlciBwb3B1cCB3aW5kb3cgd2hlbiByZXF1ZXN0ZWQgZm9yIHRoZSBnaXZlbiBzb3VyY2UKLQkgKiB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEKLQkgKiBzcGVjaWFsbHkgY29uZmlndXJlZCBBbm5vdGF0aW9uIEhvdmVyIGZvciB0aGUgU3RydWN0dXJlZFRleHRWaWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFuIGFubm90YXRpb24gaG92ZXIgc3BlY2lhbGx5IGNvbmZpZ3VyZWQgZm9yCi0JICogICAgICAgICBTdHJ1Y3R1cmVkVGV4dFZpZXdlcgotCSAqLwotCWZpbmFsIHB1YmxpYyBJQW5ub3RhdGlvbkhvdmVyIGdldEFubm90YXRpb25Ib3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvKgotCQkgKiBUaGlzIGltcGxtZW50YXRpb24gcmV0dXJucyBhbiBhbm5vdGF0aW9uIGhvdmVyIHRoYXQgd29ya3Mgd2l0aAotCQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBhbmQgYnJlYWtwb2ludHMuIEltcG9ydGFudCEgbXVzdCByZW1lbWJlciB0bwotCQkgKiByZWxlYXNlIGl0IHdoZW4gZG9uZSB3aXRoIGl0IChkdXJpbmcgdmlld2VyLnVuY29uZmlndXJlKQotCQkgKi8KLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQgcGFydGl0aW9uaW5nIGZvciB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci4gVGhlCi0JICogcGFydGl0aW9uaW5nIGlzIHVzZWQgd2hlbiB0aGUgcXVlcnlpbmcgY29udGVudCB0eXBlcyBmcm9tIHRoZSBzb3VyY2UKLQkgKiB2aWV3ZXIncyBpbnB1dCBkb2N1bWVudC48YnIgLz4KLQkgKiBOb3RlOiBDbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhdCB0aGlzIHRpbWUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIHBhcnRpdGlvbmluZwotCSAqIEBzZWUgI2dldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlmaW5hbCBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvKgotCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgZGVmYXVsdCBzdHJ1Y3R1cmVkIHRleHQgcGFydGl0aW9uaW5nCi0JCSAqLwotCQlyZXR1cm4gSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORzsKLQl9Ci0KLQlwdWJsaWMgaW50W10gZ2V0Q29uZmlndXJlZFRleHRIb3ZlclN0YXRlTWFza3MoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQkvKgotCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgY29uZmlndXJlZCB0ZXh0IGhvdmVyIHN0YXRlIG1hc2tzIGZvcgotCQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcnMKLQkJICovCi0JCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcltdIGhvdmVyRGVzY3MgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmdldFRleHRIb3ZlcnMoKTsKLQkJaW50IHN0YXRlTWFza3NbXSA9IG5ldyBpbnRbaG92ZXJEZXNjcy5sZW5ndGhdOwotCQlpbnQgc3RhdGVNYXNrc0xlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaG92ZXJEZXNjcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGhvdmVyRGVzY3NbaV0uaXNFbmFibGVkKCkpIHsKLQkJCQlpbnQgaiA9IDA7Ci0JCQkJaW50IHN0YXRlTWFzayA9IGNvbXB1dGVTdGF0ZU1hc2soaG92ZXJEZXNjc1tpXS5nZXRNb2RpZmllclN0cmluZygpKTsKLQkJCQl3aGlsZSAoaiA8IHN0YXRlTWFza3NMZW5ndGgpIHsKLQkJCQkJaWYgKHN0YXRlTWFza3Nbal0gPT0gc3RhdGVNYXNrKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWorKzsKLQkJCQl9Ci0JCQkJaWYgKGogPT0gc3RhdGVNYXNrc0xlbmd0aCkKLQkJCQkJc3RhdGVNYXNrc1tzdGF0ZU1hc2tzTGVuZ3RoKytdID0gc3RhdGVNYXNrOwotCQkJfQotCQl9Ci0JCWlmIChzdGF0ZU1hc2tzTGVuZ3RoID09IGhvdmVyRGVzY3MubGVuZ3RoKQotCQkJcmV0dXJuIHN0YXRlTWFza3M7Ci0KLQkJaW50W10gc2hvcnRlbmVkU3RhdGVNYXNrcyA9IG5ldyBpbnRbc3RhdGVNYXNrc0xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RhdGVNYXNrcywgMCwgc2hvcnRlbmVkU3RhdGVNYXNrcywgMCwgc3RhdGVNYXNrc0xlbmd0aCk7Ci0JCXJldHVybiBzaG9ydGVuZWRTdGF0ZU1hc2tzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgYXNzaXN0YW50IHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB0aGUgZ2l2ZW4gc291cmNlCi0JICogdmlld2VyLjxiciAvPgotCSAqIE5vdGU6IFRoZSBzYW1lIGluc3RhbmNlIG9mIElDb250ZW50QXNzaXN0YW50IGlzIHJldHVybmVkIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgc291cmNlIHZpZXdlciBwYXNzZWQgaW4uCi0JICogPHA+Ci0JICogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIEluc3RlYWQsIGNsaWVudHMgd2FudGluZyB0byBhZGQKLQkgKiB0aGVpciBvd24gcHJvY2Vzc29ycyBzaG91bGQgb3ZlcnJpZGUKLQkgKiA8Y29kZT5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyLCBTdHJpbmcpPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb250ZW50IGFzc2lzdGFudAotCSAqIEBzZWUgI2dldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIsIFN0cmluZykKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvKgotCQkgKiBOb3RlOiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBmaW5hbCBzbyB0aGF0IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0IGlzCi0JCSAqIGFsd2F5cyB1c2VkIGFuZCBjb250ZW50IGFzc2lzdCBleHRlbnNpb24gcG9pbnQgYWx3YXlzIHdvcmtzLgotCQkgKi8KLQkJaWYgKGZDb250ZW50QXNzaXN0YW50ID09IG51bGwpIHsKLQkJCWZDb250ZW50QXNzaXN0YW50ID0gbmV3IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50KCk7Ci0KLQkJCS8vIGNvbnRlbnQgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb25zCi0JCQlmQ29udGVudEFzc2lzdGFudC5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5lbmFibGVBdXRvQWN0aXZhdGlvbih0cnVlKTsKLQkJCWZDb250ZW50QXNzaXN0YW50LnNldEF1dG9BY3RpdmF0aW9uRGVsYXkoNTAwKTsKLQkJCWZDb250ZW50QXNzaXN0YW50LnNldFByb3Bvc2FsUG9wdXBPcmllbnRhdGlvbihJQ29udGVudEFzc2lzdGFudC5QUk9QT1NBTF9PVkVSTEFZKTsKLQkJCWZDb250ZW50QXNzaXN0YW50LnNldENvbnRleHRJbmZvcm1hdGlvblBvcHVwT3JpZW50YXRpb24oSUNvbnRlbnRBc3Npc3RhbnQuQ09OVEVYVF9JTkZPX0FCT1ZFKTsKLQkJCWZDb250ZW50QXNzaXN0YW50LnNldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoZ2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcihzb3VyY2VWaWV3ZXIpKTsKLQotCQkJLy8gYWRkIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgZm9yIGVhY2ggcGFydGl0aW9uIHR5cGUKLQkJCVN0cmluZ1tdIHR5cGVzID0gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0eXBlID0gdHlwZXNbaV07Ci0KLQkJCQkvLyBhZGQgYWxsIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgZm9yIGN1cnJlbnQgcGFydGl0b24gdHlwZQotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKHNvdXJjZVZpZXdlciwgdHlwZSk7Ci0JCQkJaWYgKHByb2Nlc3NvcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb2Nlc3NvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWZDb250ZW50QXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IocHJvY2Vzc29yc1tqXSwgdHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb250ZW50QXNzaXN0YW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGNvbnRlbnQKLQkgKiBhc3Npc3QgaW4gdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIgYW5kIGZvciB0aGUgZ2l2ZW4gcGFydGl0aW9uIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycwotCSAqICAgICAgICAgICAgYXJlIGFwcGxpY2FibGUKLQkgKiBAcmV0dXJuIElDb250ZW50QXNzaXN0UHJvY2Vzc29ycyBvciBudWxsIGlmIHNob3VsZCBub3QgYmUgc3VwcG9ydGVkCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgZm9ybWF0dGVyIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB0aGUgZ2l2ZW4gc291cmNlCi0JICogdmlld2VyLgotCSAqIDxwPgotCSAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0aGF0IGNsaWVudHMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgaXQgbWF5Ci0JICogYmVjb21lIDxjb2RlPmZpbmFsPC9jb2RlPiBpbiB0aGUgZnV0dXJlIGFuZCByZXBsYWNlZCBieSBhbiBleHRlbnNpYmxlCi0JICogZnJhbWV3b3JrLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb250ZW50IGZvcm1hdHRlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBmb3JtYXR0aW5nIHNob3VsZAotCSAqICAgICAgICAgbm90IGJlIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGh5cGVybGluayBwcmVzZW50ZXIgZm9yIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLjxiciAvPgotCSAqIE5vdGU6IENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGJlY2F1c2UgdGhpcyBtZXRob2QgcmV0dXJucyBhCi0JICogc3BlY2lhbGx5IGNvbmZpZ3VyZWQgaHlwZXJsaW5rIHByZXNlbnRlciBmb3IgdGhlIFN0cnVjdHVyZWRUZXh0Vmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGh5cGVybGluayBwcmVzZW50ZXIgc3BlY2lhbGx5IGNvbmZpZ3VyZWQgZm9yCi0JICogICAgICAgICBTdHJ1Y3R1cmVkVGV4dFZpZXdlcgotCSAqLwotCWZpbmFsIHB1YmxpYyBJSHlwZXJsaW5rUHJlc2VudGVyIGdldEh5cGVybGlua1ByZXNlbnRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvKgotCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBoeXBlcmxpbmsgcHJlc2VudGVyIHRoYXQgdXNlcwotCQkgKiBIaWdobGl0aGVyIGluc3RlYWQgb2YgUHJlc2VudGF0aW9uUmVjb25jaWxlcgotCQkgKi8KLQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEh5cGVybGlua1ByZXNlbnRlcihzb3VyY2VWaWV3ZXIpOwotCQl9Ci0JCXJldHVybiBuZXcgSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIoZlByZWZlcmVuY2VTdG9yZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yLiBUaGUgY3JlYXRvciBpcyBhIGZhY3RvcnkKLQkgKiBjcmVhdGluZyBpbmZvcm1hdGlvbiBjb250cm9scyBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXQgdGhpcyB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yCi0JICovCi0JZmluYWwgcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLy8gdXNlZCBieSBob3ZlciBoZWxwCi0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgU1dULk5PTkUsIG5ldyBIVE1MVGV4dFByZXNlbnRlcih0cnVlKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gcHJlc2VudGVyIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBzb3VyY2Ugdmlld2VyLgotCSAqIDxwPgotCSAqIENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCBjbGllbnRzIHdhbnRpbmcgdG8gYWRkCi0JICogdGhlaXIgb3duIGluZm9ybWF0aW9uIHByb3ZpZGVycyBzaG91bGQgb3ZlcnJpZGUKLQkgKiA8Y29kZT5nZXRJbmZvcm1hdGlvblByb3ZpZGVyKElTb3VyY2VWaWV3ZXIsIFN0cmluZyk8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGNvbnRlbnQgYXNzaXN0YW50Ci0JICogQHNlZSAjZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJU291cmNlVmlld2VyLCBTdHJpbmcpCi0JICovCi0JZmluYWwgcHVibGljIElJbmZvcm1hdGlvblByZXNlbnRlciBnZXRJbmZvcm1hdGlvblByZXNlbnRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIgPSBuZXcgSW5mb3JtYXRpb25QcmVzZW50ZXIoZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXJDb250cm9sQ3JlYXRvcihzb3VyY2VWaWV3ZXIpKTsKLQotCQkvLyBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgY29uZmlndXJhdGlvbnMKLQkJcHJlc2VudGVyLnNldFNpemVDb25zdHJhaW50cyg2MCwgMTAsIHRydWUsIHRydWUpOwotCQlwcmVzZW50ZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCi0JCS8vIGFkZCBpbmZvcm1hdGlvbiBwcm92aWRlcnMgZm9yIGVhY2ggcGFydGl0aW9uIHR5cGUKLQkJU3RyaW5nW10gdHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0eXBlID0gdHlwZXNbaV07Ci0KLQkJCUlJbmZvcm1hdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihzb3VyY2VWaWV3ZXIsIHR5cGUpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlwcmVzZW50ZXIuc2V0SW5mb3JtYXRpb25Qcm92aWRlcihwcm92aWRlciwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJlc2VudGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVyIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBpbmZvcm1hdGlvbgotCSAqIHByZXNlbnRhdGlvbiBpbiB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlciBhbmQgZm9yIHRoZSBnaXZlbiBwYXJ0aXRpb24KLQkgKiB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVyIGlzCi0JICogICAgICAgICAgICBhcHBsaWNhYmxlCi0JICogQHJldHVybiBJSW5mb3JtYXRpb25Qcm92aWRlciBvciBudWxsIGlmIHNob3VsZCBub3QgYmUgc3VwcG9ydGVkCi0JICovCi0JcHJvdGVjdGVkIElJbmZvcm1hdGlvblByb3ZpZGVyIGdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIHByZXNlbnRlciBjb250cm9sIGNyZWF0b3IuIFRoZSBjcmVhdG9yIGlzIGEKLQkgKiBmYWN0b3J5IGNyZWF0aW5nIHRoZSBwcmVzZW50ZXIgY29udHJvbHMgZm9yIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbiBpbmZvcm1hdGlvbiBjb250cm9sIGNyZWF0b3IKLQkgKi8KLQlwcml2YXRlIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlpbnQgc2hlbGxTdHlsZSA9IFNXVC5SRVNJWkUgfCBTV1QuVE9PTDsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEw7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgc2hlbGxTdHlsZSwgc3R5bGUsIG5ldyBIVE1MVGV4dFByZXNlbnRlcihmYWxzZSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpbmUgc3R5bGUgcHJvdmlkZXJzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBzeW50YXgKLQkgKiBoaWdobGlnaHRpbmcgaW4gdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuCi0JICogPHA+Ci0JICogTm90IGZ1bGx5IEFQSSBzaW5jZSByZXR1cm4gdHlwZSBMaW5lU3R5bGVQcm92aWRlciBpcyBub3QgQVBJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBsaW5lU3R5bGVQcm92aWRlcnMgYXJlCi0JICogICAgICAgICAgICBhcHBsaWNhYmxlCi0JICogQHJldHVybiBMaW5lU3R5bGVQcm92ZGVycyBvciBudWxsIGlmIHNob3VsZCBub3QgYmUgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBwcmVzZW50YXRpb24KLQkgKiByZWNvbmNpbGVyLCBzbyBjbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93bgotCSAqIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyLiA8YnIgLz4KLQkgKiBTZWUgPGNvZGU+Z2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIsIFN0cmluZyk8L2NvZGU+IGZvcgotCSAqIGFsdGVybmF0aXZlIHdheSB0byBwcm92aWRlIGhpZ2hsaWdodGluZyBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybnMgbnVsbAotCSAqIEBzZWUgI2dldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyLCBTdHJpbmcpCi0JICovCi0JZmluYWwgcHVibGljIElQcmVzZW50YXRpb25SZWNvbmNpbGVyIGdldFByZXNlbnRhdGlvblJlY29uY2lsZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgYmVjYXVzZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBkb2VzCi0JCSAqIG5vdCB1c2UgcHJlc2VudGF0aW9uIHJlY29uY2lsZXIKLQkJICovCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlY29uY2lsZXIgcmVhZHkgdG8gYmUgdXNlZCB3aXRoIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLjxiciAvPgotCSAqIE5vdGU6IFRoZSBzYW1lIGluc3RhbmNlIG9mIElSZWNvbmNpbGVyIGlzIHJldHVybmVkIHJlZ2FyZGxlc3Mgb2YgdGhlCi0JICogc291cmNlIHZpZXdlciBwYXNzZWQgaW4uCi0JICogPHA+Ci0JICogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIEluc3RlYWQsIGNsaWVudHMgd2FudGluZyB0byBhZGQKLQkgKiB0aGVpciBvd24gcmVjb25jaWxpbmcgc3RyYXRlZ3kgc2hvdWxkIHVzZSB0aGUKLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbjwvY29kZT4KLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIHJlY29uY2lsZXIKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSVJlY29uY2lsZXIgZ2V0UmVjb25jaWxlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlib29sZWFuIHJlY29uY2lsaW5nRW5hYmxlZCA9IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TKTsKLQkJaWYgKHNvdXJjZVZpZXdlciA9PSBudWxsIHx8ICFyZWNvbmNpbGluZ0VuYWJsZWQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvKgotCQkgKiBPbmx5IGNyZWF0ZSByZWNvbmNpbGVyIGlmIHNvdXJjZXZpZXdlciBpcyBwcmVzZW50Ci0JCSAqLwotCQlpZiAoZlJlY29uY2lsZXIgPT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvciByZWNvbmNpbGVyID0gbmV3IFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IoKTsKLQotCQkJLy8gcmVjb25jaWxlciBjb25maWd1cmF0aW9ucwotCQkJcmVjb25jaWxlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7Ci0KLQkJCWZSZWNvbmNpbGVyID0gcmVjb25jaWxlcjsKLQkJfQotCQlyZXR1cm4gZlJlY29uY2lsZXI7Ci0JfQotCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUsIGludCBzdGF0ZU1hc2spIHsKLQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBudWxsOwotCi0JCS8qCi0JCSAqIFJldHVybnMgYSBkZWZhdWx0IHByb2JsZW0sIGFubm90YXRpb24sIGFuZCBiZXN0IG1hdGNoIGhvdmVyCi0JCSAqIGRlcGVuZGluZyBvbiBzdGF0ZU1hc2sKLQkJICovCi0JCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcltdIGhvdmVyRGVzY3MgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmdldFRleHRIb3ZlcnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGhvdmVyRGVzY3MubGVuZ3RoICYmIHRleHRIb3ZlciA9PSBudWxsKSB7Ci0JCQlpZiAoaG92ZXJEZXNjc1tpXS5pc0VuYWJsZWQoKSAmJiBjb21wdXRlU3RhdGVNYXNrKGhvdmVyRGVzY3NbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKSkgPT0gc3RhdGVNYXNrKSB7Ci0JCQkJU3RyaW5nIGhvdmVyVHlwZSA9IGhvdmVyRGVzY3NbaV0uZ2V0SWQoKTsKLQkJCQlpZiAoVGV4dEhvdmVyTWFuYWdlci5QUk9CTEVNX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkKLQkJCQkJdGV4dEhvdmVyID0gbmV3IFByb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKTsKLQkJCQllbHNlIGlmIChUZXh0SG92ZXJNYW5hZ2VyLkFOTk9UQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKQotCQkJCQl0ZXh0SG92ZXIgPSBuZXcgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yKCk7Ci0JCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5DT01CSU5BVElPTl9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpCi0JCQkJCXRleHRIb3ZlciA9IG5ldyBCZXN0TWF0Y2hIb3ZlcihudWxsKTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gdGV4dEhvdmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVuZG8gbWFuYWdlciBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEKLQkgKiBzcGVjaWFsbHkgY29uZmlndXJlZCB1bmRvIG1hbmFnZXIgZm9yIHRoZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gdW5kbyBtYW5hZ2VyIHNwZWNpYWxseSBjb25maWd1cmVkIGZvciBTdHJ1Y3R1cmVkVGV4dFZpZXdlcgotCSAqLwotCWZpbmFsIHB1YmxpYyBJVW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFuIFVuZG9NYW5hZ2VyIHRoYXQgaXMgdXNlZCBleGNsdXNpdmVseQotCQkgKiBpbiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcgotCQkgKi8KLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyVW5kb01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzk3YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyVW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotCi0vKioKLSAqIFVuZG8gbWFuYWdlciBleGNsdXNpdmVseSBmb3IgU3RydWN0dXJlZFRleHRWaWV3ZXJzIE9OTFkuIFRoaXMgdW5kbyBtYW5hZ2VyCi0gKiBpcyBhd2FyZSB0aGF0IHN0cnVjdHVyZWQgZG9jdW1lbnRzIGhhdmUgdGhlaXIgb3duIHVuZG8gbWFuYWdlci4gVGhpcwotICogaGFuZGxlcyBjb21tdW5pY2F0aW9uIGJldHdlZW4gSVVuZG9NYW5hZ2VyIGFuZCBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci4KLSAqLwotY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJVbmRvTWFuYWdlciBpbXBsZW1lbnRzIElVbmRvTWFuYWdlciB7Ci0JY2xhc3MgVW5kb05vdGlmaWVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoKGZVbmRvTWFuYWdlciAhPSBudWxsKSAmJiAoZXZlbnQgIT0gbnVsbCkpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlmVW5kb01hbmFnZXIuZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKHRoaXMsICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRPZmZzZXQoKSwgKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlRleHRWaWV3ZXIgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZlVuZG9NYW5hZ2VyID0gbnVsbDsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZlVuZG9Ob3RpZmllciA9IG5ldyBVbmRvTm90aWZpZXIoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjYmVnaW5Db21wb3VuZENoYW5nZSgpCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5Db21wb3VuZENoYW5nZSgpIHsKLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWZVbmRvTWFuYWdlci5iZWdpblJlY29yZGluZyhmVGV4dFZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHZpZXdlciB0byB0aGlzIHVuZG8gbWFuYWdlciBhbmQgYWxzbyBhdHRlbXB0cyB0byBnZXQgdGhlCi0JICogY29ycmVjdCBkb2N1bWVudC1zcGVjaWZpYyB1bmRvIG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBBc3N1bWVzIHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gZnV0dXJlX1RPRE8gY291bGQgcHJvYmFibHkgb3B0aW1pemUgdGhpcyB0byBjaGVjayBpZiBhbHJlYWR5Ci0JCS8vIGNvbm5lY3RlZCB0byBzYW1lIHZpZXdlci91bmRvIG1hbmFnZXIsIGRvbnQgZG8gYW55dGhpbmcKLQotCQkvLyBkaXNjb25uZWN0IGZyb20gYW55IG9sZCBtYW5hZ2VyL3ZpZXdlcgotCQlkaXNjb25uZWN0KCk7Ci0KLQkJLy8gY29ubmVjdCB0byBuZXcgdmlld2VyL3VuZG8gbWFuYWdlcgotCQlmVGV4dFZpZXdlciA9IChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyOwotCQlJRG9jdW1lbnQgZG9jID0gZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYzsKLQkJCXNldERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCS8vIGRpc2Nvbm5lY3QgdGhlIHZpZXdlciBmcm9tIHRoZSB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVGV4dFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVuZG9Ob3RpZmllcik7Ci0JCQlmVW5kb01hbmFnZXIuZGlzY29ubmVjdChmVGV4dFZpZXdlcik7Ci0JCX0KLQotCQkvLyBudWxsIG91dCB0aGUgdmlld2VyIGFuZCB1bmRvIG1hbmFnZXIKLQkJZlRleHRWaWV3ZXIgPSBudWxsOwotCQlmVW5kb01hbmFnZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjZW5kQ29tcG91bmRDaGFuZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZENvbXBvdW5kQ2hhbmdlKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLmVuZFJlY29yZGluZyhmVGV4dFZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLnJlZG8oZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjcmVkb2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZG9hYmxlKCkgewotCQlib29sZWFuIGNhblJlZG8gPSBmYWxzZTsKLQotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJY2FuUmVkbyA9IGZVbmRvTWFuYWdlci5yZWRvYWJsZSgpOwotCi0JCXJldHVybiBjYW5SZWRvOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkvLyBjYW5ub3QgcmVhbGx5IHJlc2V0IG1vZGVsLWJhc2VkIHVuZG8gbWFuYWdlciBiZWNhdXNlIG90aGVyIGNsaWVudHMKLQkJLy8gd2lsbCBiZSBhZmZlY3RlZAotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgb2xkIHVuZG8gbWFuYWdlciBhbmQgY29ubmVjdCB0byB0aGUgdW5kbyBtYW5hZ2VyCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZG9jdW1lbnQgaXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJZlRleHRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZVbmRvTm90aWZpZXIpOwotCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoZlRleHRWaWV3ZXIpOwotCQl9Ci0KLQkJZlVuZG9NYW5hZ2VyID0gZG9jdW1lbnQuZ2V0VW5kb01hbmFnZXIoKTsKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIuY29ubmVjdChmVGV4dFZpZXdlcik7Ci0JCQlmVGV4dFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVuZG9Ob3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI3NldE1heGltYWxVbmRvTGV2ZWwoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heGltYWxVbmRvTGV2ZWwoaW50IHVuZG9MZXZlbCkgewotCQkvLyBjYW5ub3QgcmVhbGx5IHNldCBtYXhpbWFsIHVuZG8gbGV2ZWwgb24gbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCS8vIGJlY2F1c2Ugb3RoZXIgY2xpZW50cyB3aWxsIGJlIGFmZmVjdGVkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLnVuZG8oZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjdW5kb2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlib29sZWFuIGNhblVuZG8gPSBmYWxzZTsKLQotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJY2FuVW5kbyA9IGZVbmRvTWFuYWdlci51bmRvYWJsZSgpOwotCi0JCXJldHVybiBjYW5VbmRvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9BYnN0cmFjdERyb3BBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9BYnN0cmFjdERyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3NzFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQWJzdHJhY3REcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERyb3BBY3Rpb24gaW1wbGVtZW50cyBJRHJvcEFjdGlvbiB7Ci0KLQkvKgotCSAqIFJlcGxhY2VzIHRhcmdldEVkaXRvcidzIGN1cnJlbnQgc2VsZWN0aW9uIGJ5ICJ0ZXh0IgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluc2VydChTdHJpbmcgdGV4dCwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSBudWxsOwotCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JCUlTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzID0gKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSB0YXJnZXRFZGl0b3IuZ2V0QWRhcHRlcihJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcyk7Ci0JCWlmICh0b29scyAhPSBudWxsKSB7Ci0JCQlkb2MgPSB0b29scy5nZXREb2N1bWVudCgpOwotCQkJc2VsZWN0aW9uID0gdG9vbHMuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSB0YXJnZXRFZGl0b3I7Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCkgewotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgKChJQWRhcHRhYmxlKSB0YXJnZXRFZGl0b3IpLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwgJiYgdG9vbHMgIT0gbnVsbCAmJiB0b29scy5nZXRFZGl0b3JQYXJ0KCkgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgdG9vbHMuZ2V0RWRpdG9yUGFydCgpOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwgJiYgdG9vbHMgIT0gbnVsbCAmJiB0b29scy5nZXRFZGl0b3JQYXJ0KCkgIT0gbnVsbCkgewotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgdG9vbHMuZ2V0RWRpdG9yUGFydCgpLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsICYmIHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQl9Ci0JCWlmIChkb2MgPT0gbnVsbCAmJiB0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWRvYyA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCXRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCXRyeSB7Ci0JCQkJZG9jLnJlcGxhY2UodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgdGV4dCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNwID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJSVRleHRTZWxlY3Rpb24gc2VsID0gbmV3IFRleHRTZWxlY3Rpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dC5sZW5ndGgoKSk7Ci0JCQlzcC5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKHNlbC5nZXRPZmZzZXQoKSwgc2VsLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkRGF0YShPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBydW4oRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0NhcmV0TWVkaWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9DYXJldE1lZGlhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OGQ0NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0NhcmV0TWVkaWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzLkNhcmV0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50cy5JQ2FyZXRMaXN0ZW5lcjsKLQotLyoqCi0gKiBIYXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGxpc3RlbmluZyBmb3Iga2V5IGV2ZW50cywgYW5kIG1vdXNlIGV2ZW50cywKLSAqIGRlY2lkaW5nIGlmIHRoZSBjYXJldCBoYXMgbW92ZWQgKHdpdGhvdXQgYSB0ZXh0IGNoYW5nZSksIGFuZCBpZiBzbywgd2lsbAotICogbm90aWZ5IENhcmV0TGlzdGVuZXJzIHRoYXQgdGhlIGNhcmV0IGhhcyBtb3ZlZC4gT2JqZWN0cyB3aGljaCBhcmUKLSAqIGludGVyZXN0ZWQgaW4gQUxMIGNhcmV0IHBvc3Rpb24gY2hhbmdlcyB3aWxsIGFsc28gaGF2ZSB0byBsaXN0ZW4gZm9yCi0gKiB0ZXh0Q2hhbmdlZCBldmVudHMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlIGJhc2Ugc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2FyZXRNZWRpYXRvciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCWNsYXNzIENhcmV0TWVkaWF0b3JMaXN0ZW5lciBpbXBsZW1lbnRzIEtleUxpc3RlbmVyLCBNb3VzZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbEtleVByZXNzZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbEtleVJlbGVhc2VkKGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCWludGVybmFsTW91c2VEb3duKGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCWludGVybmFsTW91c2VVcChlKTsKLQkJfQotCX0KLQotCWNsYXNzIFJlZnJlc2hEZWxheUpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgaW50IGZEZWxheSA9IDA7Ci0JCVJlZnJlc2hEZWxheUpvYihpbnQgZGVsYXkpIHsKLQkJCXN1cGVyKFNTRVVJTWVzc2FnZXMuY2FyZXRfdXBkYXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJZkRlbGF5ID0gZGVsYXk7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0dXAgYSBkZWxheWVkIENhcmV0RXZlbnQgZmlyaW5nCi0JCSAqLwotCQl2b2lkIHRvdWNoKCkgewotCQkJY2FuY2VsKCk7Ci0JCQlzY2hlZHVsZShmRGVsYXkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaGFuZGxlRXZlbnQobnVsbCk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQkKLQlSZWZyZXNoRGVsYXlKb2IgZkRlbGF5ZXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxBWSA9IDMwMDsKLQotCS8qKiB1c2VkIGp1c3QgZm9yIGRlYnVnIHByaW50IG91dHMgKi8KLQlwcml2YXRlIGxvbmcgZW5kVGltZTsKLQlwcml2YXRlIGxvbmcgc3RhcnRUaW1lOwotCi0JcHJvdGVjdGVkIElDYXJldExpc3RlbmVyW10gZkNhcmV0TGlzdGVuZXJzOwotCXByb3RlY3RlZCBDYXJldE1lZGlhdG9yTGlzdGVuZXIgaW50ZXJuYWxMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgU3R5bGVkVGV4dCB0ZXh0V2lkZ2V0OwotCi0JLyoqCi0JICogQ2FyZXRNZWRpYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDYXJldE1lZGlhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENhcmV0TWVkaWF0b3IgY29uc3RydWN0b3IgY29tbWVudC4gTXVzdCBhbHdheXMgcHJvdmlkZSB0aGUgd2lkZ2V0IGl0cwotCSAqIHN1cHBvc2VkIHRvIGxpc3RlbiB0by4KLQkgKi8KLQlwdWJsaWMgQ2FyZXRNZWRpYXRvcihTdHlsZWRUZXh0IHN0eWxlZFRleHRXaWRnZXQpIHsKLQkJdGhpcygpOwotCQlzZXRUZXh0V2lkZ2V0KHN0eWxlZFRleHRXaWRnZXQpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDYXJldExpc3RlbmVyKElDYXJldExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXJldE1lZGlhdG9yOjphZGRDYXJldExpc3RlbmVyLiBSZXF1ZXN0IHRvIGFkZCBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBjYXJldGxpc3RuZXIuIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBtYWtlIHN1cmUgbGlzdGVuZXIgaXMgbm90IGFscmVhZHkgaW4gbGlzdGVuaW5nIGFycmF5Ci0JCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0KLQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmQ2FyZXRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FyZXRNZWRpYXRvcjo6YWRkQ2FyZXRMaXN0ZW5lci4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuICIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhcmV0TWVkaWF0b3I6OmFkZENhcmV0TGlzdGVuZXIuIEFkZGluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBjYXJldCBtZWRpYXRvci4iKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IG9sZFNpemUgPSAwOwotCQkJaWYgKGZDYXJldExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yIGZpcnN0Ci0JCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJb2xkU2l6ZSA9IGZDYXJldExpc3RlbmVycy5sZW5ndGg7Ci0JCQl9Ci0JCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJSUNhcmV0TGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgSUNhcmV0TGlzdGVuZXJbbmV3U2l6ZV07Ci0JCQlpZiAoZkNhcmV0TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZDYXJldExpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCX0KLQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkvLwotCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJZkNhcmV0TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQ2FyZXRFdmVudChDYXJldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQ2FyZXRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlIHRvIGJlIHRocmVhZCBzYWZlLAotCQkJLy8gc2luY2UgdGhlIGFkZCBhbmQgcmVtb3ZlIGxpc3RuZXIgbWV0aG9kcwotCQkJLy8gY2FuIGNoYW5nZSB0aGlzIG9iamVjdCdzIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkKLQkJCS8vIGZyb20gYW5vdGhlciB0aHJlYWQKLQkJCS8vIChhbmQgc2luY2Ugb2JqZWN0IGFzc2lnbm1lbnQgaXMgYXRvbWljLCB3ZSBkb24ndCBuZWVkIHRvCi0JCQkvLyBzeW5jaHJvbml6ZQotCQkJSUNhcmV0TGlzdGVuZXJbXSBob2xkTGlzdGVuZXJzID0gZkNhcmV0TGlzdGVuZXJzOwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWhvbGRMaXN0ZW5lcnNbaV0uY2FyZXRNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0KLQkJaWYgKERlYnVnLmRlYnVnQ2FyZXRNZWRpYXRvcikgewotCQkJZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lciBmaXJlZDogIiArIChlbmRUaW1lIC0gc3RhcnRUaW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGNoZWNrIGlmICdva1RvVXNlJwotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJZGlzcGxheSA9IHRleHRXaWRnZXQuZ2V0RGlzcGxheSgpOwotCQkJaWYgKChkaXNwbGF5ICE9IG51bGwpICYmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWZpcmVDYXJldEV2ZW50KG5ldyBDYXJldEV2ZW50KHRleHRXaWRnZXQsIHRleHRXaWRnZXQuZ2V0Q2FyZXRPZmZzZXQoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQlmRGVsYXllci5jYW5jZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJc3dpdGNoIChlLmtleUNvZGUpIHsKLQkJCWNhc2UgU1dULkFSUk9XX0RPV04gOgotCQkJY2FzZSBTV1QuQVJST1dfVVAgOgotCQkJY2FzZSBTV1QuQVJST1dfTEVGVCA6Ci0JCQljYXNlIFNXVC5BUlJPV19SSUdIVCA6Ci0JCQljYXNlIFNXVC5IT01FIDoKLQkJCWNhc2UgU1dULkVORCA6Ci0JCQljYXNlIFNXVC5QQUdFX0RPV04gOgotCQkJY2FzZSBTV1QuUEFHRV9VUCA6IHsKLQkJCQlmRGVsYXllci50b3VjaCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQkvLyBhbHdheXMgdXBkYXRlIGN1cnNvciBwb3N0aW9uLCBldmVuIGR1cmluZyBub3JtYWwgdHlwaW5nCi0JCQkJLy8gKHRoZSBsb2dpYyBtYXkgbG9vayBmdW5ueSwgc2luY2Ugd2UgYWx3YXlzIHRvIHRoZSBzYW1lCi0JCQkJLy8gdGhpbmcsIGJ1dCB3ZSBoYXZlbid0IGFsd2F5cyBkb25lIHRoZSBzYW1lIHRoaW5nLCBzbyBJCi0JCQkJLy8gd2FudGVkIHRvIGxlYXZlIHRoYXQgZmFjdCBkb2N1bWVudGVkIHZpYSBjb2RlLikKLQkJCQlmRGVsYXllci50b3VjaCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxNb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCWZEZWxheWVyLmNhbmNlbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsTW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJLy8gTm90ZSwgZXZlbiBkdXJpbmcgYSBzd2lwZSBzZWxlY3QsIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBnb2VzIHVwLAotCQkvLyBhbmQgdGhlIHdpZGdldCBpcwotCQkvLyBxdWVyaWVkIGZvciB0aGUgY3VycmVudCBjYXJldCBwb3N0aW9uLCBpdCBhbHdheXMgcmV0dXJucyB0aGUKLQkJLy8gYmVnaW5uaW5nIG9mIHRoZSBzZWxlY3Rpb24sCi0JCS8vIHdoaWNoIGlzIGRlc2lyYWJsZSAoYXQgbGVhc3QgZm9yIHRoZSBrbm93biB1c2Ugb2YgdGhpcyBmZWF0dXJlLAotCQkvLyB3aGljaCBpcyB0byBzaWduYWwKLQkJLy8gdGhhdCB0aGUgcHJvcGVydHkgc2hlZXQgY2FuIHVwZGF0ZSBpdHNlbGYuCi0JCWZEZWxheWVyLnRvdWNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZkRlbGF5ZXIuY2FuY2VsKCk7Ci0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwgJiYgIXRleHRXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0ZXh0V2lkZ2V0LnJlbW92ZUtleUxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotCQkJdGV4dFdpZGdldC5yZW1vdmVNb3VzZUxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotCQkJdGV4dFdpZGdldCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ2FyZXRMaXN0ZW5lcihJQ2FyZXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoKGZDYXJldExpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZDYXJldExpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSBmQ2FyZXRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJSUNhcmV0TGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgSUNhcmV0TGlzdGVuZXJbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZkNhcmV0TGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUgcmVtb3ZpbmcKLQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZDYXJldExpc3RlbmVyc1tpXTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZSBvbGQKLQkJCQkvLyBvbmUKLQkJCQlmQ2FyZXRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V2lkZ2V0KFN0eWxlZFRleHQgbmV3VGV4dFdpZGdldCkgewotCQlpZihmRGVsYXllciA9PSBudWxsKSB7Ci0JCQlmRGVsYXllciA9IG5ldyBSZWZyZXNoRGVsYXlKb2IoREVMQVkpOwotCQl9Ci0KLQkJLy8gdW5ob29rIGZyb20gcHJldmlvdXMsIGlmIGFueQotCQlpZiAodGhpcy50ZXh0V2lkZ2V0ICE9IG51bGwpIHsKLQkJCWZEZWxheWVyLmNhbmNlbCgpOwotCQkJdGhpcy50ZXh0V2lkZ2V0LnJlbW92ZUtleUxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotCQkJdGhpcy50ZXh0V2lkZ2V0LnJlbW92ZU1vdXNlTGlzdGVuZXIoaW50ZXJuYWxMaXN0ZW5lcik7Ci0JCX0KLQotCQl0aGlzLnRleHRXaWRnZXQgPSBuZXdUZXh0V2lkZ2V0OwotCi0JCWlmIChpbnRlcm5hbExpc3RlbmVyID09IG51bGwpIHsKLQkJCWludGVybmFsTGlzdGVuZXIgPSBuZXcgQ2FyZXRNZWRpYXRvckxpc3RlbmVyKCk7Ci0JCX0KLQotCQlpZiAodGhpcy50ZXh0V2lkZ2V0ICE9IG51bGwpIHsKLQkJCXRoaXMudGV4dFdpZGdldC5hZGRLZXlMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRoaXMudGV4dFdpZGdldC5hZGRNb3VzZUxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODk5NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTaW1wbGUgZ2VuZXJpYyBJRCB0byBjbGFzcyB0byBtYXBwaW5nLiBMb2FkcyBhIHNwZWNpZmllZCBjbGFzcyBkZWZpbmVkIGluIGEKLSAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudCB3aXRoIHRoZSBtYXRjaGluZyB0eXBlIGFuZCB0YXJnZXQgSUQuIEV4YW1wbGUKLSAqIHBsdWdpbi54bWwgc2VjdGlvbjoKLSAqIAotICogJmx0O2V4dGVuc2lvbgotICogcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uJnF1b3Q7Jmd0O2NvbnRlbnRvdXRsaW5lY29uZmlndXJhdGlvbgotICogdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuZHRkLmNvcmUuZHRkc291cmNlJnF1b3Q7Ci0gKiBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmR0ZC52aWV3cy5jb250ZW50b3V0bGluZS5EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24mcXVvdDsvJmd0OwotICogJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKiAKLSAqIFVzZWQgaW4gY29kZSBieSBnZXRDb25maWd1cmF0aW9uKCZxdW90O2NvbnRlbnRvdXRsaW5lY29uZmlndXJhdGlvbiZxdW90OywKLSAqICZxdW90O29yZy5lY2xpcHNlLndzdC5kdGQudWkuU3RydWN0dXJlZFRleHRFZGl0b3JEVEQmcXVvdDspOwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCS8qKgotCSAqIEV4dGVuc2lvbiB0eXBlIHRvIHBhc3MgaW50byBnZXRDb25maWd1cmF0aW9ucyB0byBnZXQgY29udGVudCBvdXRsaW5lCi0JICogY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRPVVRMSU5FQ09ORklHVVJBVElPTiA9ICJjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRXh0ZW5zaW9uIHR5cGUgdG8gcGFzcyBpbnRvIGdldENvbmZpZ3VyYXRpb25zIHRvIGdldCBwcm9wZXJ0eSBzaGVldAotCSAqIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWVNIRUVUQ09ORklHVVJBVElPTiA9ICJwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBFeHRlbnNpb24gdHlwZSB0byBwYXNzIGludG8gZ2V0Q29uZmlndXJhdGlvbnMgdG8gZ2V0IHNvdXJjZSB2aWV3ZXIKLQkgKiBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFVklFV0VSQ09ORklHVVJBVElPTiA9ICJzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT04gPSAicHJvdmlzaW9uYWxDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1hcCBjb25maWd1cmF0aW9uTWFwID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnVGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkY29uZmlndXJhdGlvbmJ1aWxkZXIvdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OID0gInByb3Zpc2lvbmFsRGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBfRVhURU5ERURDT05GSUdVUkFUSU9OID0gImVkaXRvckNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBpbnN0YW5jZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZyBlbGVtZW50IGRlZmluaW5nIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgY2FycnlpbmcgdGhlIGNsYXNzCi0JICogQHJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3QgaWYgc3VjY2Vzc2Z1bC4gSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4KLQkgKiAgICAgICAgICBjcmVhdGVpbmcgZXhlY3V0YWJsZSBleHRlbnNpb24sIHRoZSBleGNlcHRpb24gaXMgbG9nZ2VkLCBhbmQKLQkgKiAgICAgICAgICBudWxsIHJldHVybmVkLgotCSAqLwotCXN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUsIGZpbmFsIFN0cmluZyB0YXJnZXRJRCkgewotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyB0aGUgZXh0ZW5zaW9uCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgbG9hZGluZyBjbGFzcyAiICsgY2xhc3NBdHRyaWJ1dGUgKyAiIGZvciAiICsgdGFyZ2V0SUQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhc3NBdHRyaWJ1dGUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyBBTlkgZXhjZXB0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciBsb2FkaW5nIGNsYXNzICIgKyBjbGFzc0F0dHJpYnV0ZSArICIgZm9yICIgKyB0YXJnZXRJRCwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCWxvbmcgdGltZTAgPSAwOwotCi0JcHJpdmF0ZSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdCBjcmVhdGVDb25maWd1cmF0aW9ucyhMaXN0IGNvbmZpZ3VyYXRpb25zLCBTdHJpbmcgZXh0ZW5zaW9uVHlwZSwgU3RyaW5nIHRhcmdldElEKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBjb25maWd1cmF0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhleHRlbnNpb25UeXBlKSB8fCAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKENPTkZJR1VSQVRJT04pICYmIGV4dGVuc2lvblR5cGUuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKSkpKSkgewotCQkJCVN0cmluZ1tdIHRhcmdldHMgPSBTdHJpbmdVdGlscy51bnBhY2soZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RBUkdFVCkpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFyZ2V0cy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAodGFyZ2V0SUQuZXF1YWxzKHRhcmdldHNbal0udHJpbSgpKSkgewotCQkJCQkJT2JqZWN0IG8gPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTLCB0YXJnZXRJRCk7Ci0JCQkJCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzdWx0LmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmluZENvbmZpZ3VyYXRpb25FbGVtZW50cyhMaXN0IGNvbmZpZ3VyYXRpb25zLCBTdHJpbmcgZXh0ZW5zaW9uVHlwZSwgU3RyaW5nIHRhcmdldElEKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF07Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBjb25maWd1cmF0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhleHRlbnNpb25UeXBlKSB8fCAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERFRklOSVRJT04pICYmIGV4dGVuc2lvblR5cGUuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKSkpKSkgewotCQkJCVN0cmluZ1tdIHRhcmdldHMgPSBTdHJpbmdVdGlscy51bnBhY2soZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RBUkdFVCkpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFyZ2V0cy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAodGFyZ2V0SUQuZXF1YWxzKHRhcmdldHNbal0udHJpbSgpKSkgewotCQkJCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSByZXN1bHQudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvblR5cGUgbWF0Y2hpbmcgdGhlCi0JICogdGFyZ2V0SUQsIGlmIG9uZSBpcyBhdmFpbGFibGUuIElmIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpcwotCSAqIGRlZmluZWQsIHRoZSBmaXJzdCBvbmUgZm91bmQgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblR5cGUKLQkgKiBAcGFyYW0gdGFyZ2V0SUQKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIGlmIG9uZSB3YXMgZGVmaW5lZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlndXJhdGlvbihTdHJpbmcgZXh0ZW5zaW9uVHlwZSwgU3RyaW5nIHRhcmdldElEKSB7Ci0JCWlmICh0YXJnZXRJRCA9PSBudWxsIHx8IHRhcmdldElELmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBjb25maWd1cmF0aW9ucyA9IGdldENvbmZpZ3VyYXRpb25zKGV4dGVuc2lvblR5cGUsIHRhcmdldElEKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY29uZmlndXJhdGlvbnMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uVHlwZSBtYXRjaGluZyB0aGUKLQkgKiB0YXJnZXRJRCwgaWYgYW55IGFyZSBhdmFpbGFibGUuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblR5cGUKLQkgKiBAcGFyYW0gdGFyZ2V0SUQKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiBjb25maWd1cmF0aW9uIG9iamVjdHMsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGVtcHR5Ci0JICovCi0JcHVibGljIExpc3QgZ2V0Q29uZmlndXJhdGlvbnMoU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAodGFyZ2V0SUQgPT0gbnVsbCB8fCB0YXJnZXRJRC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCWlmIChjb25maWd1cmF0aW9uTWFwID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25NYXAgPSBuZXcgSGFzaE1hcCgwKTsKLQkJCXN5bmNocm9uaXplZCAoY29uZmlndXJhdGlvbk1hcCkgewotCQkJCXJlYWRSZWdpc3RyeShQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBTU0VVSVBsdWdpbi5JRCwgRVBfRVhURU5ERURDT05GSUdVUkFUSU9OKTsKLQkJCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjcmVhZFJlZ2lzdHJ5KCk6ICAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGV4dGVuc2lvbnMgPSAoTGlzdCkgY29uZmlndXJhdGlvbk1hcC5nZXQoZXh0ZW5zaW9uVHlwZSk7Ci0JCUxpc3QgY29uZmlndXJhdGlvbnMgPSBjcmVhdGVDb25maWd1cmF0aW9ucyhleHRlbnNpb25zLCBleHRlbnNpb25UeXBlLCB0YXJnZXRJRCk7Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCWlmICghY29uZmlndXJhdGlvbnMuaXNFbXB0eSgpKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0Q29uZmlndXJhdGlvbigiICsgZXh0ZW5zaW9uVHlwZSArICIsICIgKyB0YXJnZXRJRCArICIpOiBjb25maWd1cmF0aW9ucyBsb2FkZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXRDb25maWd1cmF0aW9uKCIgKyBleHRlbnNpb25UeXBlICsgIiwgIiArIHRhcmdldElEICsgIik6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZGVjbGFyZWQgZGVmaW5pdGlvbnMgZm9yIHRoZSBnaXZlbiBleHRlbnNpb25UeXBlIG1hdGNoaW5nCi0JICogdGhlIHRhcmdldElELCBpZiBhbnkgYXJlIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uVHlwZQotCSAqIEBwYXJhbSB0YXJnZXRJRAotCSAqIEByZXR1cm4gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMsIGVtcHR5IGlmIG5vbmUgd2VyZQotCSAqICAgICAgICAgZGVjbGFyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RGVmaW5pdGlvbnMoU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAodGFyZ2V0SUQgPT0gbnVsbCB8fCB0YXJnZXRJRC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb25NYXAgPT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKDApOwotCQkJc3luY2hyb25pemVkIChjb25maWd1cmF0aW9uTWFwKSB7Ci0JCQkJcmVhZFJlZ2lzdHJ5KFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksIFNTRVVJUGx1Z2luLklELCBFUF9FWFRFTkRFRENPTkZJR1VSQVRJT04pOwotCQkJCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNyZWFkUmVnaXN0cnkoKTogICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3QgZGVmaW5pdGlvbnMgPSAoTGlzdCkgY29uZmlndXJhdGlvbk1hcC5nZXQoZXh0ZW5zaW9uVHlwZSk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZmluZENvbmZpZ3VyYXRpb25FbGVtZW50cyhkZWZpbml0aW9ucywgZXh0ZW5zaW9uVHlwZSwgdGFyZ2V0SUQpOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW2VsZW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YWx1ZXNbaV0gPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoVkFMVUUpOwotCQl9Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCWlmICh2YWx1ZXMubGVuZ3RoID4gMCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERlZmluaXRpb25zKCIgKyBleHRlbnNpb25UeXBlICsgIiwgIiArIHRhcmdldElEICsgIik6IGRlZmluaXRpb24gbG9hZGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0RGVmaW5pdGlvbnMoIiArIGV4dGVuc2lvblR5cGUgKyAiLCAiICsgdGFyZ2V0SUQgKyAiKTogcmFuIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzKENPTkZJR1VSQVRJT04pIHx8IG5hbWUuZXF1YWxzKERFRklOSVRJT04pKQotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLQkJTGlzdCBjb25maWd1cmF0aW9ucyA9IChMaXN0KSBjb25maWd1cmF0aW9uTWFwLmdldChuYW1lKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25zID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCWNvbmZpZ3VyYXRpb25NYXAucHV0KG5hbWUsIGNvbmZpZ3VyYXRpb25zKTsKLQkJfQotCQljb25maWd1cmF0aW9ucy5hZGQoZWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3Zjc0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JS2V5QmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkFjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcmVnaXN0cnkgZm9yIGV4dGVuc2lvbnMgdGhhdCBwbHVnIGludG8gJ2VkaXRvckFjdGlvbnMnCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLQotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBjbGFzcyBFeHRlbmRlZENvbnRyaWJ1dG9yIGltcGxlbWVudHMgSUV4dGVuZGVkQ29udHJpYnV0b3IsIElNZW51TGlzdGVuZXIgewotCQlwcml2YXRlIElFeHRlbmRlZFNpbXBsZUVkaXRvciBhY3RpdmVFeHRlbmRlZEVkaXRvciA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBMaXN0IGNhY2hlOwotCQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlwcml2YXRlIElNZW51TWFuYWdlciBtZW51QmFyID0gbnVsbDsKLQotCQlwcml2YXRlIFNldCBtZW51cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcHVibGljIEV4dGVuZGVkQ29udHJpYnV0b3IoTGlzdCBjYWNoZSkgewotCQkJdGhpcy5jYWNoZSA9IGNhY2hlOwotCQl9Ci0KLQkJcHJpdmF0ZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgY29tcHV0ZUV4dGVuZGVkRWRpdG9yKGZpbmFsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQkJSUV4dGVuZGVkU2ltcGxlRWRpdG9yIHNpbXBsZUVkaXRvciA9IG51bGw7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSB7Ci0JCQkJc2ltcGxlRWRpdG9yID0gKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgZWRpdG9yOwotCQkJfQotCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIHNpbXBsZUVkaXRvciA9PSBudWxsKSB7Ci0JCQkJZmluYWwgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGVkaXRvci5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJCQlpZiAodG9vbHMgIT0gbnVsbCkgewotCQkJCQlzaW1wbGVFZGl0b3IgPSBuZXcgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKCkgewotCQkJCQkJcHVibGljIGludCBnZXRDYXJldFBvc2l0aW9uKCkgewotCQkJCQkJCXJldHVybiB0b29scy5nZXRDYXJldE9mZnNldCgpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJCQkJCXJldHVybiB0b29scy5nZXREb2N1bWVudCgpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJCQkJCQlyZXR1cm4gdG9vbHMuZ2V0RWRpdG9yUGFydCgpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uUmFuZ2UoKSB7Ci0JCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gdG9vbHMuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJcmV0dXJuIG5ldyBQb2ludChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2ltcGxlRWRpdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkJbWVudUJhciA9IG1lbnU7Ci0JCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBtZW51RWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQkJaWYgKChtZW51RWxlbWVudC5nZXROYW1lKCkpLmVxdWFscyhUQUdfTUVOVSkpIHsKLQkJCQkJCWNvbnRyaWJ1dGVNZW51KG1lbnVFbGVtZW50LCBtZW51LCB0cnVlKTsKLQkJCQkJCWlmIChkZWJ1Z01lbnUpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9NZW51KCkgYWRkZWQ6ICIgKyBtZW51RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJCUlNZW51TWFuYWdlciBtbSA9IGNvbnRyaWJ1dGVNZW51QWN0aW9uKGFkLCBtZW51LCB0cnVlLCBmYWxzZSk7Ci0JCQkJCQlpZiAobW0gIT0gbnVsbCkgewotCQkJCQkJCW1hcC5wdXQoYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpLCBtbSk7Ci0JCQkJCQkJbW0uYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQkJCQkJCW1lbnVzLmFkZChtbSk7Ci0JCQkJCQkJaWYgKGRlYnVnTWVudSkKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9NZW51KCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY29udHJpYnV0aW5nIHRvIG1lbnUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlYnVnQ29udHJpYnV0ZVRpbWUpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9NZW51KCk6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBtZW51RWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQkJaWYgKChtZW51RWxlbWVudC5nZXROYW1lKCkpLmVxdWFscyhUQUdfUE9QVVBNRU5VKSkgewotCQkJCQkJY29udHJpYnV0ZU1lbnUobWVudUVsZW1lbnQsIG1lbnUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGlvbkRlc2NyaXB0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSAoQWN0aW9uRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJSUFjdGlvbiBhID0gYWQuZ2V0QWN0aW9uKCk7Ci0JCQkJCQlpZiAoYSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikgewotCQkJCQkJCS8vIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgY291bGQgY2F1c2UgdGhlIG1lbnUgdG8gbm90Ci0JCQkJCQkJLy8gYmUgc2hvd24KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoKChhZC5nZXRQb3B1cE1lbnVQYXRoKCkgIT0gbnVsbCkgfHwgKGFkLmdldFBvcHVwTWVudUdyb3VwKCkgIT0gbnVsbCkpICYmIChhIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcpKSB7Ci0JCQkJCQkJCSAgICAoKElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKWEpLnJlYWxpemUoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCUlFeHRlbmRlZEVkaXRvckFjdGlvbiBlZWEgPSAoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhOwotCQkJCQkJCQllZWEuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IoYWN0aXZlRXh0ZW5kZWRFZGl0b3IpOwotCQkJCQkJCQllZWEudXBkYXRlKCk7Ci0JCQkJCQkJCWlmIChlZWEuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQkJCUlNZW51TWFuYWdlciBwYXJlbnQgPSBjb250cmlidXRlTWVudUFjdGlvbihhZCwgbWVudSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQkJCQlpZiAoZGVidWdQb3B1cCAmJiBwYXJlbnQgIT0gbnVsbCkKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1BvcHVwTWVudSgpIGFkZGVkOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUlNZW51TWFuYWdlciBwYXJlbnQgPSBjb250cmlidXRlTWVudUFjdGlvbihhZCwgbWVudSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQkJaWYgKGRlYnVnUG9wdXAgJiYgcGFyZW50ICE9IG51bGwpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvUG9wdXBNZW51KCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY29udHJpYnV0aW5nIHRvIHBvcHVwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkZWJ1Z0NvbnRyaWJ1dGVUaW1lKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvUG9wdXBNZW51KCk6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCQkJLy8gbm90aGluZyBmcm9tIGhlcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJCUlBY3Rpb24gYSA9IGFkLmdldEFjdGlvbigpOwotCQkJCQkJaWYgKGEgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkJCQlpZiAoKChhZC5nZXRUb29sYmFyUGF0aCgpICE9IG51bGwpIHx8IChhZC5nZXRUb29sYmFyR3JvdXAoKSAhPSBudWxsKSkgJiYgKGEgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZykpIHsKLQkJCQkJCQkgICAgKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZylhKS5yZWFsaXplKCk7Ci0JCQkJCQkJfQotCQkJCQkJCUlFeHRlbmRlZEVkaXRvckFjdGlvbiBlZWEgPSAoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhOwotCQkJCQkJCWVlYS5zZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihhY3RpdmVFeHRlbmRlZEVkaXRvcik7Ci0JCQkJCQkJZWVhLnVwZGF0ZSgpOwotCQkJCQkJCWlmIChlZWEuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQkJYm9vbGVhbiBjb250cmlidXRlZCA9IGNvbnRyaWJ1dGVUb29sYmFyQWN0aW9uKGFkLCBtYW5hZ2VyLCB0cnVlKTsKLQkJCQkJCQkJaWYgKGRlYnVnVG9vbGJhciAmJiBjb250cmlidXRlZCkKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvVG9vbEJhcigpIGFkZGVkOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWlmIChkZWJ1Z1Rvb2xiYXIpCi0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoKTogW3NraXBwZWRdICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWJvb2xlYW4gY29udHJpYnV0ZWQgPSBjb250cmlidXRlVG9vbGJhckFjdGlvbihhZCwgbWFuYWdlciwgdHJ1ZSk7Ci0JCQkJCQkJaWYgKGRlYnVnVG9vbGJhciAmJiBjb250cmlidXRlZCkKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Ub29sQmFyKCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY29udHJpYnV0aW5nIHRvIHRvb2xiYXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlYnVnQ29udHJpYnV0ZVRpbWUpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Ub29sQmFyKCk6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gbWVudXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotCQkJCQkoKElNZW51TWFuYWdlcikgbykucmVtb3ZlTWVudUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJLy8gbm90aGluZyBmcm9tIGhlcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkJLy8gc2xvd3MgZG93biB0aGUgbWVudSBhbmQgaW50ZXJmZXJlcyB3aXRoIGl0IGZvciBvdGhlciBlZGl0b3JzOwotCQkJLy8gb3B0aW1pemUgb24gdmlzaWJpbGl0eQotCQkJSUVkaXRvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCQlib29sZWFuIGFjdGl2ZUVkaXRvcklzVmlzaWJsZSA9IGZhbHNlOwotCi0JCQlpZiAoYWN0aXZlRXh0ZW5kZWRFZGl0b3IgIT0gbnVsbCAmJiBhY3RpdmVFeHRlbmRlZEVkaXRvci5nZXRFZGl0b3JQYXJ0KCkgIT0gbnVsbCkKLQkJCQlzaXRlID0gYWN0aXZlRXh0ZW5kZWRFZGl0b3IuZ2V0RWRpdG9yUGFydCgpLmdldEVkaXRvclNpdGUoKTsKLQkJCWlmIChzaXRlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBFY2xpcHNlIGJ1ZyA0ODc4NCAtIFtNUEVdIENsYXNzQ2FzdCBleGNlcHRpb24gV29ya2JlbmNoIHBhZ2UKLQkJCS8vIGlzUGFydFZpc2lhYmxlIGZvciBNdWx0aVBhZ2VTaXRlCi0JCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclNpdGUpIHsKLQkJCQlPYmplY3QgbXVsdGlQYWdlRWRpdG9yID0gKChNdWx0aVBhZ2VFZGl0b3JTaXRlKSBzaXRlKS5nZXRNdWx0aVBhZ2VFZGl0b3IoKTsKLQkJCQlhY3RpdmVFZGl0b3JJc1Zpc2libGUgPSBtdWx0aVBhZ2VFZGl0b3IuZXF1YWxzKHNpdGUuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpKSB8fCBtdWx0aVBhZ2VFZGl0b3IuZXF1YWxzKHNpdGUuZ2V0UGFnZSgpLmdldEFjdGl2ZVBhcnQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3RpdmVFZGl0b3JJc1Zpc2libGUgPSBzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpLmVxdWFscyhhY3RpdmVFeHRlbmRlZEVkaXRvci5nZXRFZGl0b3JQYXJ0KCkpOwotCQkJfQotCQkJLy8gZHVlIHRvIGEgZGVsYXkgY2xhc3MgbG9hZGluZywgZG9uJ3QgcmV0dXJuIG5vdwotLy8JCQlpZiAoIWFjdGl2ZUVkaXRvcklzVmlzaWJsZSkKLS8vCQkJCXJldHVybjsKLQotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJCS8vIGFkZCBtZW51IGxpc3RlbmVyIHRvIHN1Ym1lbnUKLQkJCQlpZiAoaXRlbXNbaV0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLQkJCQkJKChJTWVudU1hbmFnZXIpIGl0ZW1zW2ldKS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCQkJCW1lbnVzLmFkZChpdGVtc1tpXSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTZXQga2V5cyA9IG1hcC5rZXlTZXQoKTsKLQkJCUl0ZXJhdG9yIGl0ID0ga2V5cy5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiBuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSA9IGZhbHNlOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGl0Lm5leHQoKTsKLQkJCQlJTWVudU1hbmFnZXIgbW0gPSAoSU1lbnVNYW5hZ2VyKSBtYXAuZ2V0KGl0ZW0pOwotCQkJCWlmIChtZW51LmdldElkKCkgIT0gbnVsbCAmJiBtZW51LmdldElkKCkuZXF1YWxzKG1tLmdldElkKCkpICYmIGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCk7Ci0KLQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZykgewotCQkJCQkJICAgIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nIGVlYSA9IChJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZylhY3Rpb247Ci0JCQkJCQkgICAgaWYgKGVlYS5pc1JlYWxpemVkKCkgPT0gZmFsc2UpIHsKLQkJCQkJCSAgICAgICAgZWVhLnJlYWxpemUoKTsKLQkJCQkJCSAgICAgICAgbmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUgPSB0cnVlOwotCQkJCQkJICAgIH0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKGFjdGl2ZUVkaXRvcklzVmlzaWJsZSB8fCBuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSkgewotCQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJVXBkYXRlKSB7Ci0JCQkJCQkJCSgoSVVwZGF0ZSkgYWN0aW9uKS51cGRhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChhY3RpdmVFZGl0b3JJc1Zpc2libGUgfHwgbmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUpIHsKLQkJCQkJCQlib29sZWFuIHZpc2libGUgPSB0cnVlOwotCQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkJCQkJdmlzaWJsZSA9ICgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhY3Rpb24pLmlzVmlzaWJsZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlpdGVtLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSkgewotCQkJCQkJICAgICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSlpdGVtKS51cGRhdGUoKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigidXBkYXRpbmcgYWN0aW9ucyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWN0aXZlRWRpdG9ySXNWaXNpYmxlIHx8IG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlKSB7Ci0JCQkgICAgaWYgKG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlKSB7Ci0JCQkgICAgICAgIC8vIHRoZSBhY3Rpb24gaXMgcmVhbGl6ZWQgc28gdGhhdCBuZWVkIHRvIHVwZGF0ZSB0aGUgbWVudSB3LwotCQkJICAgICAgICAvLyBmb3JjZSBzZXQgdG8gdHJ1ZQotCQkJICAgICAgICBtZW51LnVwZGF0ZSh0cnVlKTsKLQkJCSAgICB9IGVsc2UgewotCQkJICAgICAgICBtZW51LnVwZGF0ZShmYWxzZSk7Ci0JCQkgICAgfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQkJYWN0aXZlRXh0ZW5kZWRFZGl0b3IgPSBjb21wdXRlRXh0ZW5kZWRFZGl0b3IoZWRpdG9yKTsKLQkJCUlLZXlCaW5kaW5nU2VydmljZSBzdmMgPSAoZWRpdG9yICE9IG51bGwpID8gZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpIDogbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSAoQWN0aW9uRGVzY3JpcHRvcikgb2JqOwotCQkJCQl0cnkgewotCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBhZC5nZXRBY3Rpb24oKTsKLQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkJCQkoKElFeHRlbmRlZEVkaXRvckFjdGlvbikgYWN0aW9uKS5zZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihhY3RpdmVFeHRlbmRlZEVkaXRvcik7Ci0JCQkJCQkJKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIGFjdGlvbikudXBkYXRlKCk7Ci0JCQkJCQkJLy8gdXBkYXRlIHZpc2liaWxpdHkgcmlnaHQgbm93IHNvIHRoYXQgdGhlIG1lbnUKLQkJCQkJCQkvLyB3aWxsIHNob3cvaGlkZSBwcm9wZXJseQotCQkJCQkJCWlmICghKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIGFjdGlvbikuaXNWaXNpYmxlKCkgJiYgYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpICE9IG51bGwpCi0JCQkJCQkJCWFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCQlpZiAoc3ZjICE9IG51bGwgJiYgYWN0aW9uLmdldEFjdGlvbkRlZmluaXRpb25JZCgpICE9IG51bGwpIHsKLQkJCQkJCQkJc3ZjLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigic2V0dGluZyBhY3RpdmUgZWRpdG9yIG9uIGFjdGlvbnMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobWVudUJhciAhPSBudWxsICYmIGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJLy8gQ2xhc3MgY2x6ID0gZWRpdG9yLmdldENsYXNzKCk7Ci0JCQkJLy8gd2hpbGUgKGNseiAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgKGNsei5nZXROYW1lKCkuZXF1YWxzKHRhcmdldElEKSkgewotCQkJCS8vIGNvbnRyaWJ1dGVUb01lbnUobWVudUJhcik7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCQkJCS8vIGNseiA9IGNsei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQkJLy8gfQotCQkJCWlmICh0YXJnZXRJRHMuY29udGFpbnMoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRJZCgpKSkgewotCQkJCQljb250cmlidXRlVG9NZW51KG1lbnVCYXIpOwotCQkJCX0KLQkJCX0KLQotCQkJdXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZS5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGlvbkRlc2NyaXB0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSAoQWN0aW9uRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJaWYgKGFkLmdldFRvb2xiYXJQYXRoKCkgIT0gbnVsbCkgewotCQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gYWQuZ2V0QWN0aW9uKCk7Ci0JCQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElVcGRhdGUpIHsKLQkJCQkJCQkJKChJVXBkYXRlKSBhY3Rpb24pLnVwZGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInVwZGF0aW5nIHRvb2xiYXIgYWN0aW9ucyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UQVJHRVRfSUQgPSAidGFyZ2V0SUQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnQ29udHJpYnV0ZVRpbWUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvY29udHJpYnV0ZXRpbWUiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z01lbnUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvZGVidWdtZW51IikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1BvcHVwID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2RlYnVncG9wdXAiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQ7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUmVhZFRpbWUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvcmVhZHRpbWUiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdUb29sYmFyID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2RlYnVndG9vbGJhciIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRFRF9FRElUT1IgPSAiZXh0ZW5kZWRFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTF9FWFRFTkRFRF9FRElUT1JfQUNUSU9OUyA9ICJleHRlbmRlZEVkaXRvckFjdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNUSU9OID0gImFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05UUklCVVRJT05fVFlQRSA9ICJlZGl0b3JDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QT1BVUE1FTlUgPSAicG9wdXBtZW51IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SVUxFUk1FTlUgPSAicnVsZXJtZW51IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TRVBBUkFUT1IgPSAic2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIExpc3QgcmVhZGluZ0NhY2hlOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0JcHJvdGVjdGVkIExpc3QgdGFyZ2V0SURzOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1lbnUgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIG1lbnUgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICogYW5kIGFkZHMgaXQgaW50byB0aGUgcHJvdmlkZWQgbWVudSBtYW5hZ2VyLiBJZiAnYXBwZW5kSWZNaXNzaW5nJyBpcwotCSAqIHRydWUsIGFuZCBtZW51IHBhdGggc2xvdCBpcyBub3QgZm91bmQsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgbWVudSB3aWxsCi0JICogYmUgYWRkZWQgaW50byBpdC4gT3RoZXJ3aXNlLCBhZGQgb3BlcmF0aW9uIHdpbGwgZmFpbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlTWVudShJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWVudUVsZW1lbnQsIElNZW51TWFuYWdlciBtbmcsIGJvb2xlYW4gYXBwZW5kSWZNaXNzaW5nKSB7Ci0JCS8vIEdldCBjb25maWcgZGF0YS4KLQkJU3RyaW5nIGlkID0gbWVudUVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCVN0cmluZyBsYWJlbCA9IG1lbnVFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTEFCRUwpOwotCQlTdHJpbmcgcGF0aCA9IG1lbnVFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUEFUSCk7Ci0JCWlmIChsYWJlbCA9PSBudWxsKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgTWVudSBFeHRlbnNpb24gKGxhYmVsID09IG51bGwpOiAiICsgaWQpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDYWxjdWxhdGUgbWVudSBwYXRoIGFuZCBncm91cC4KLQkJU3RyaW5nIGdyb3VwID0gbnVsbDsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaW50IGxvYyA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsb2MgIT0gLTEpIHsKLQkJCQlncm91cCA9IHBhdGguc3Vic3RyaW5nKGxvYyArIDEpOwotCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBsb2MpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gYXNzdW1lIHRoYXQgcGF0aCByZXByZXNlbnRzIGEgc2xvdAotCQkJCS8vIHNvIGFjdHVhbCBwYXRoIHBvcnRpb24gc2hvdWxkIGJlIG51bGwKLQkJCQlncm91cCA9IHBhdGg7Ci0JCQkJcGF0aCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBGaW5kIHBhcmVudCBtZW51LgotCQlJTWVudU1hbmFnZXIgcGFyZW50ID0gbW5nOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQgPSBtbmcuZmluZE1lbnVVc2luZ1BhdGgocGF0aCk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQkvLyBMb2dnZXIubG9nKCJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChQYXRoIGlzIGludmFsaWQpOiAiICsKLQkJCQkvLyBpZCk7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIElNZW51TWFuYWdlci5maW5kTWVudVVzaW5nUGF0aCgpIHJldHVybnMgaW52aXNpYmxlIG1lbnUgaXRlbSBpZgotCQkJLy8gdGhlIG1hbmFnZXIgY2FuJ3QgZmluZAotCQkJLy8gdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBjcmVhdGUgbmV3IE1lbnVNYW5hZ2VyIGZvciBpdC4KLQkJCS8vIEkgZG9uJ3Qga25vdyB0aGlzIGlzIGEgc3BlY2lmaWNhdGlvbiBvciBidWcuCi0JCQkvLyBBbnl3YXksIHRvIGVuc3VyZSB0aGUgbWVudSBjYW4gYmUgdmlzaWJsZSwgc2V0VmlzaWJsZSh0cnVlKQotCQkJLy8gbmVlZHMgdG8gYmUgY2FsbGVkLgotCQkJcGFyZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCQkvLyBGaW5kIHJlZmVyZW5jZSBncm91cC4KLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlncm91cCA9IElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TOwotCQlJQ29udHJpYnV0aW9uSXRlbSBzZXAgPSBwYXJlbnQuZmluZChncm91cCk7Ci0JCWlmIChzZXAgPT0gbnVsbCkgewotCQkJaWYgKGFwcGVuZElmTWlzc2luZykKLQkJCQlwYXJlbnQuYWRkKG5ldyBTZXBhcmF0b3IoZ3JvdXApKTsKLQkJCWVsc2UgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAoR3JvdXAgaXMgaW52YWxpZCk6ICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBJZiB0aGUgbWVudSBkb2VzIG5vdCBleGlzdCBjcmVhdGUgaXQuCi0JCUlNZW51TWFuYWdlciBuZXdNZW51ID0gcGFyZW50LmZpbmRNZW51VXNpbmdQYXRoKGlkKTsKLQkJaWYgKG5ld01lbnUgPT0gbnVsbCkKLQkJCW5ld01lbnUgPSBuZXcgTWVudU1hbmFnZXIobGFiZWwsIGlkKTsKLQotCQkvLyBDcmVhdGUgc2VwYXJhdG9ycy4KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBtZW51RWxlbWVudC5nZXRDaGlsZHJlbihUQUdfU0VQQVJBVE9SKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJY29udHJpYnV0ZVNlcGFyYXRvcihuZXdNZW51LCBjaGlsZHJlbltpXSk7Ci0JCX0KLQotCQkvLyBBZGQgbmV3IG1lbnUKLQkJdHJ5IHsKLQkJCXBhcmVudC5pbnNlcnRBZnRlcihncm91cCwgbmV3TWVudSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgTWVudSBFeHRlbnNpb24gKEdyb3VwIGlzIG1pc3NpbmcpOiAiICsgaWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb250cmlidXRlcyBhY3Rpb24gZnJvbSBhY3Rpb24gZGVzY3JpcHRvciBpbnRvIHRoZSBwcm92aWRlZCBtZW51Ci0JICogbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNvbnRyaWJ1dGVNZW51QWN0aW9uKEFjdGlvbkRlc2NyaXB0b3IgYWQsIElNZW51TWFuYWdlciBtZW51LCBib29sZWFuIGFwcGVuZElmTWlzc2luZywgYm9vbGVhbiBwb3B1cG1lbnUpIHsKLQkJaWYgKGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSA9PSBudWxsIHx8IGFkLmdldEFjdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBHZXQgY29uZmlnIGRhdGEuCi0JCVN0cmluZyBtcGF0aCA9IHBvcHVwbWVudSA/IGFkLmdldFBvcHVwTWVudVBhdGgoKSA6IGFkLmdldE1lbnVQYXRoKCk7Ci0JCVN0cmluZyBtZ3JvdXAgPSBwb3B1cG1lbnUgPyBhZC5nZXRQb3B1cE1lbnVHcm91cCgpIDogYWQuZ2V0TWVudUdyb3VwKCk7Ci0JCWlmIChtcGF0aCA9PSBudWxsICYmIG1ncm91cCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gRmluZCBwYXJlbnQgbWVudS4KLQkJSU1lbnVNYW5hZ2VyIHBhcmVudCA9IG1lbnU7Ci0JCWlmIChtcGF0aCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZmluZE1lbnVVc2luZ1BhdGgobXBhdGgpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJLy8gTG9nZ2VyLmxvZygiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAoUGF0aCBpcyBpbnZhbGlkKTogIiArCi0JCQkJLy8gYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCS8vIElNZW51TWFuYWdlci5maW5kTWVudVVzaW5nUGF0aCgpIHJldHVybnMgaW52aXNpYmxlIG1lbnUgaXRlbSBpZgotCQkJLy8gdGhlIG1hbmFnZXIgY2FuJ3QgZmluZAotCQkJLy8gdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBjcmVhdGUgbmV3IE1lbnVNYW5hZ2VyIGZvciBpdC4KLQkJCS8vIEkgZG9uJ3Qga25vdyB0aGlzIGlzIGEgc3BlY2lmaWNhdGlvbiBvciBidWcuCi0JCQkvLyBBbnl3YXksIHRvIGVuc3VyZSB0aGUgbWVudSBjYW4gYmUgdmlzaWJsZSwgc2V0VmlzaWJsZSh0cnVlKQotCQkJLy8gbmVlZHMgdG8gYmUgY2FsbGVkLgotCQkJcGFyZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCQkvLyBGaXJzdCByZW1vdmUgZXhpc3RpbmcgbWVudSBpdGVtCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBwYXJlbnQuZmluZChhZC5nZXRJZCgpKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJcGFyZW50LnJlbW92ZShhZC5nZXRJZCgpKTsKLQkJfQotCi0JCS8vIEZpbmQgcmVmZXJlbmNlIGdyb3VwLgotCQlpZiAobWdyb3VwID09IG51bGwpCi0JCQltZ3JvdXAgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUzsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2VwID0gcGFyZW50LmZpbmQobWdyb3VwKTsKLQkJaWYgKHNlcCA9PSBudWxsKSB7Ci0JCQlpZiAoYXBwZW5kSWZNaXNzaW5nKQotCQkJCXBhcmVudC5hZGQoc2VwID0gbmV3IFNlcGFyYXRvcihtZ3JvdXApKTsKLQkJCWVsc2UgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAoR3JvdXAgaXMgaW52YWxpZCk6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGFjdGlvbi4KLQkJdHJ5IHsKLQkJCWlmIChwb3B1cG1lbnUpIHsKLQkJCQkvLyBDb250ZXh0IG1lbnUgbmVlZCBhIG5ld2x5IGNyZWF0ZWQgY29udHJpYnV0aW9uIGl0ZW0KLQkJCQlpZiAoc2VwICE9IG51bGwgJiYgc2VwLmlzR3JvdXBNYXJrZXIoKSkKLQkJCQkJcGFyZW50LmFwcGVuZFRvR3JvdXAoc2VwLmdldElkKCksIGFkLmdldEFjdGlvbigpKTsKLQkJCQllbHNlCi0JCQkJCXBhcmVudC5pbnNlcnRBZnRlcihtZ3JvdXAsIGFkLmdldEFjdGlvbigpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIE5vcm1hbCBtZW51IG5lZWQgdG8gYWRkIGV4aXN0aW5nIGNvbnRyaWJ1dGlvbiBpdGVtIHRvCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gbWVudSBsaXN0ZW5lcgotCQkJCWlmIChzZXAgIT0gbnVsbCAmJiBzZXAuaXNHcm91cE1hcmtlcigpKQotCQkJCQlwYXJlbnQuYXBwZW5kVG9Hcm91cChzZXAuZ2V0SWQoKSwgYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpKTsKLQkJCQllbHNlCi0JCQkJCXBhcmVudC5pbnNlcnRBZnRlcihtZ3JvdXAsIGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgTWVudSBFeHRlbnNpb24gKEdyb3VwIGlzIG1pc3NpbmcpOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuYW1lZCBtZW51IHNlcGFyYXRvciBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGVsZW1lbnQuIElmIHRoZSBzZXBhcmF0b3IgYWxyZWFkeSBleGlzdHMgZG8gbm90IGNyZWF0ZSBhCi0JICogc2Vjb25kLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRyaWJ1dGVTZXBhcmF0b3IoSU1lbnVNYW5hZ2VyIG1lbnUsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPD0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2VwID0gbWVudS5maW5kKGlkKTsKLQkJaWYgKHNlcCAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKGlkKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnRyaWJ1dGVzIGFjdGlvbiBmcm9tIHRoZSBhY3Rpb24gZGVzY3JpcHRvciBpbnRvIHRoZSBwcm92aWRlZCB0b29sCi0JICogYmFyIG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udHJpYnV0ZVRvb2xiYXJBY3Rpb24oQWN0aW9uRGVzY3JpcHRvciBhZCwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xiYXIsIGJvb2xlYW4gYXBwZW5kSWZNaXNzaW5nKSB7Ci0JCWlmIChhZC5nZXRDb250cmlidXRpb25JdGVtKCkgPT0gbnVsbCB8fCBhZC5nZXRBY3Rpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIEdldCBjb25maWcgZGF0YS4KLQkJU3RyaW5nIHRwYXRoID0gYWQuZ2V0VG9vbGJhclBhdGgoKTsKLQkJU3RyaW5nIHRncm91cCA9IGFkLmdldFRvb2xiYXJHcm91cCgpOwotCQlpZiAodHBhdGggPT0gbnVsbCAmJiB0Z3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBGaXJzdCByZW1vdmUgZXhpc3RpbmcgdG9vbGJhciBpdGVtCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSB0b29sYmFyLmZpbmQoYWQuZ2V0SWQoKSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXRvb2xiYXIucmVtb3ZlKGFkLmdldElkKCkpOwotCQl9Ci0KLQkJLy8gRmluZCByZWZlcmVuY2UgZ3JvdXAuCi0JCWlmICh0Z3JvdXAgPT0gbnVsbCkKLQkJCXRncm91cCA9IElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TOwotCQlJQ29udHJpYnV0aW9uSXRlbSBzZXAgPSB0b29sYmFyLmZpbmQodGdyb3VwKTsKLQkJaWYgKHNlcCA9PSBudWxsKSB7Ci0JCQlpZiAoYXBwZW5kSWZNaXNzaW5nKQotCQkJCXRvb2xiYXIuYWRkKG5ldyBTZXBhcmF0b3IodGdyb3VwKSk7Ci0JCQllbHNlIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgVG9vbGJhciBFeHRlbnNpb24gKEdyb3VwIGlzIGludmFsaWQpOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgYWN0aW9uIHRvIHRvb2wgYmFyLgotCQl0cnkgewotCQkJaWYgKHNlcCAhPSBudWxsICYmIHNlcC5pc0dyb3VwTWFya2VyKCkpCi0JCQkJdG9vbGJhci5hcHBlbmRUb0dyb3VwKHNlcC5nZXRJZCgpLCBhZC5nZXRBY3Rpb24oKSk7Ci0JCQllbHNlCi0JCQkJdG9vbGJhci5pbnNlcnRBZnRlcih0Z3JvdXAsIGFkLmdldEFjdGlvbigpKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBUb29sYmFyIEV4dGVuc2lvbiAoR3JvdXAgaXMgbWlzc2luZyk6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZmFjdG9yeSBtZXRob2QgcmV0dXJucyBhIG5ldyBBY3Rpb25EZXNjcmlwdG9yIGZvciB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGVsZW1lbnQuIEl0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgotCSAqLwotCXByb3RlY3RlZCBBY3Rpb25EZXNjcmlwdG9yIGNyZWF0ZUFjdGlvbkRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhZCA9IG5ldyBBY3Rpb25EZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJLy8gdGhlc2UgY2FzZXMgbGlrZSAiY2xhc3Mgbm90IGZvdW5kIiBhcmUgaGFuZGxlZAotCQkJLy8gYXQgbG93ZXIgbGV2ZWwsIHNvIG5vIGFjdGlvbiBpZiBmb3JtZWQuIEluIHRoYXQKLQkJCS8vIGNhc2UsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBmb3JtIGFuIGFjdGlvbiBkZXNjcmlwdG9yLgotCQkJaWYgKChhZCAhPSBudWxsKSAmJiAoYWQuZ2V0QWN0aW9uKCkgPT0gbnVsbCkpIHsKLQkJCQlhZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIudHJhY2VFeGNlcHRpb24oRVhURU5ERURfRURJVE9SLCBlKTsKLQkJCWFkID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFydCBJRCBhdHRyaWJ1dGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKLQkgKiB0YXJnZXQgZXh0ZW5zaW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0SUQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RBUkdFVF9JRCk7Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiPz8/IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJlYWRzIGVkaXRvciBjb250cmlidXRvciBpZiBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlICdlZGl0b3InCi0JICogZXh0ZW5zaW9uIHBvaW50LCBhbmQgYWxsIGV4dGVybmFsIGNvbnRyaWJ1dGlvbnMgZm9yIHRoaXMgZWRpdG9yJ3MgSUQKLQkgKiByZWdpc3RlcmVkIGluICdlZGl0b3JBY3Rpb25zJyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIElFeHRlbmRlZENvbnRyaWJ1dG9yIHJlYWRBY3Rpb25FeHRlbnNpb25zKFN0cmluZyBlZGl0b3JJZCkgewotCQlyZXR1cm4gcmVhZEFjdGlvbkV4dGVuc2lvbnMobmV3IFN0cmluZ1tde2VkaXRvcklkfSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgZWRpdG9yIGNvbnRyaWJ1dG9yIGlmIHNwZWNpZmllZCBkaXJlY3RseSBpbiB0aGUgJ2VkaXRvcicKLQkgKiBleHRlbnNpb24gcG9pbnQsIGFuZCBhbGwgZXh0ZXJuYWwgY29udHJpYnV0aW9ucyBmb3IgdGhpcyBlZGl0b3IncyBJRAotCSAqIHJlZ2lzdGVyZWQgaW4gJ2VkaXRvckFjdGlvbnMnIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgSUV4dGVuZGVkQ29udHJpYnV0b3IgcmVhZEFjdGlvbkV4dGVuc2lvbnMoU3RyaW5nW10gaWRzKSB7Ci0JCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJRXh0ZW5kZWRDb250cmlidXRvciBleHQgPSBudWxsOwotCQlyZWFkQ29udHJpYnV0aW9ucyhpZHMsIFRBR19DT05UUklCVVRJT05fVFlQRSwgUExfRVhURU5ERURfRURJVE9SX0FDVElPTlMpOwotCQlpZiAoZGVidWdSZWFkVGltZSkgewotCQkJU3RyaW5nIGlkbGlzdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaWRzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZGxpc3QgKz0gaWRzW2ldOwotCQkJCQlpZiAoaSA8IGlkcy5sZW5ndGggLSAxKQotCQkJCQkJaWRsaXN0ICs9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjcmVhZEFjdGlvbkV4dGVuc2lvbnMoIiArIGlkbGlzdCArICIpOiByZWFkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgWyIgKyAocmVhZGluZ0NhY2hlICE9IG51bGwgPyByZWFkaW5nQ2FjaGUuc2l6ZSgpIDogMCkgKyAiIGNvbnRyaWJ1dGlvbnNdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlpZiAocmVhZGluZ0NhY2hlICE9IG51bGwpIHsKLQkJCWV4dCA9IG5ldyBFeHRlbmRlZENvbnRyaWJ1dG9yKHJlYWRpbmdDYWNoZSk7Ci0JCQlyZWFkaW5nQ2FjaGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBleHQ7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElEcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmdbXSBpZHMsIFN0cmluZyB0YWcsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlyZWFkaW5nQ2FjaGUgPSBudWxsOwotCQl0YXJnZXRJRHMgPSBBcnJheXMuYXNMaXN0KGlkcyk7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRzIGFic3RyYWN0IG1ldGhvZCB0byBoYW5kbGUgdGhlIHByb3ZpZGVkIFhNTCBlbGVtZW50IGluIHRoZQotCSAqIHJlZ2lzdHJ5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKHRhZy5lcXVhbHModGFyZ2V0Q29udHJpYnV0aW9uVGFnKSkgewotCQkJU3RyaW5nIGlkID0gZ2V0VGFyZ2V0SUQoZWxlbWVudCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCAhdGFyZ2V0SURzLmNvbnRhaW5zKGlkKSkgewotCQkJCS8vIFRoaXMgaXMgbm90IG9mIGludGVyZXN0IHRvIHVzIC0gZG9uJ3QgZ28gZGVlcGVyCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfTUVOVSkpIHsKLQkJCWlmIChyZWFkaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQlyZWFkaW5nQ2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyZWFkaW5nQ2FjaGUuYWRkKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7IC8vIGp1c3QgY2FjaGUgdGhlIGVsZW1lbnQgLSBkb24ndCBnbyBpbnRvIGl0Ci0JCX0KLQkJZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfUE9QVVBNRU5VKSkgewotCQkJaWYgKHJlYWRpbmdDYWNoZSA9PSBudWxsKQotCQkJCXJlYWRpbmdDYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlYWRpbmdDYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgZWxlbWVudCAtIGRvbid0IGdvIGludG8gaXQKLQkJfQotCQllbHNlIGlmICh0YWcuZXF1YWxzKFRBR19SVUxFUk1FTlUpKSB7Ci0JCQlpZiAocmVhZGluZ0NhY2hlID09IG51bGwpCi0JCQkJcmVhZGluZ0NhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVhZGluZ0NhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0FDVElPTikpIHsKLQkJCWlmIChyZWFkaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQlyZWFkaW5nQ2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gY3JlYXRlQWN0aW9uRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChhZCAhPSBudWxsKQotCQkJCXJlYWRpbmdDYWNoZS5hZGQoYWQpOwotCQkJcmV0dXJuIHRydWU7IC8vIGp1c3QgY2FjaGUgdGhlIGFjdGlvbiAtIGRvbid0IGdvIGludG8KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI1YzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYXJldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlRyYW5zZmVyQnVpbGRlci5UcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nOwotCi0vKioKLSAqIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIgZXh0ZW5kcyBEcm9wVGFyZ2V0QWRhcHRlciB7Ci0KLQlwcml2YXRlIFBvaW50IGNhcmV0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGVkaXRvcklkczsKLQlwcml2YXRlIGludCBvcmdPZmZzZXQgPSAwOwotCXByaXZhdGUgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yID0gbnVsbDsKLQlwcml2YXRlIElUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlUHJveHk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlcihib29sZWFuIHVzZVByb3h5KSBmb3IKLQkgKiAgICAgICAgICAgICB0aGUgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQotCi0JcHVibGljIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIoYm9vbGVhbiB1c2VQcm94eSkgewotCQlzdXBlcigpOwotCQl0aGlzLnVzZVByb3h5ID0gdXNlUHJveHk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9Ecm9wKFRyYW5zZmVyIHRyYW5zZmVyLCBEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJVHJhbnNmZXJCdWlsZGVyIHRiID0gbmV3IFRyYW5zZmVyQnVpbGRlcih1c2VQcm94eSk7Ci0KLQkJSURyb3BBY3Rpb25bXSBhcyA9IG51bGw7Ci0JCWlmIChlZGl0b3JJZHMgIT0gbnVsbCAmJiBlZGl0b3JJZHMubGVuZ3RoID4gMCkKLQkJCWFzID0gdGIuZ2V0RHJvcEFjdGlvbnMoZWRpdG9ySWRzLCB0cmFuc2Zlcik7Ci0JCWVsc2UKLQkJCWFzID0gdGIuZ2V0RHJvcEFjdGlvbnMoZ2V0VGFyZ2V0RWRpdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHRyYW5zZmVyKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFzLmxlbmd0aDsgKytpKSB7Ci0JCQlJRHJvcEFjdGlvbiBkYSA9IGFzW2ldOwotCQkJVHJhbnNmZXIgYWN0dWFsVHJhbnNmZXI7Ci0JCQlpZiAodHJhbnNmZXIgaW5zdGFuY2VvZiBUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKSB7Ci0JCQkJYWN0dWFsVHJhbnNmZXIgPSAoKFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcpIHRyYW5zZmVyKS5nZXRUcmFuc2ZlckNsYXNzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3R1YWxUcmFuc2ZlciA9IHRyYW5zZmVyOwotCQkJfQotCQkJaWYgKGFjdHVhbFRyYW5zZmVyIGluc3RhbmNlb2YgRmlsZVRyYW5zZmVyKSB7Ci0JCQkJaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIk5vIGRhdGEgaW4gRHJvcFRhcmdldEV2ZW50IGZyb20gIiArIGV2ZW50LndpZGdldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlTdHJpbmdbXSBzdHJzID0gKFN0cmluZ1tdKSBldmVudC5kYXRhOwotCQkJCWJvb2xlYW5bXSBicyA9IG5ldyBib29sZWFuW3N0cnMubGVuZ3RoXTsKLQkJCQlpbnQgYyA9IDA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdHJzLmxlbmd0aDsgKytqKSB7Ci0JCQkJCWJzW2pdID0gZmFsc2U7Ci0JCQkJCWlmIChkYS5pc1N1cHBvcnRlZERhdGEoc3Ryc1tqXSkpIHsKLQkJCQkJCWV2ZW50LmRhdGEgPSBuZXcgU3RyaW5nW117c3Ryc1tqXX07Ci0JCQkJCQlpZiAoIWRhLnJ1bihldmVudCwgdGFyZ2V0RWRpdG9yKSkgewotCQkJCQkJCWJzW2pdID0gdHJ1ZTsKLQkJCQkJCQljKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlic1tqXSA9IHRydWU7Ci0JCQkJCQljKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGMgPT0gMCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpbnQgayA9IDA7Ci0JCQkJU3RyaW5nW10gcmVzdHMgPSBuZXcgU3RyaW5nW2NdOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3Rycy5sZW5ndGg7ICsraikgewotCQkJCQlpZiAoYnNbal0pCi0JCQkJCQlyZXN0c1trKytdID0gc3Ryc1tqXTsKLQkJCQl9Ci0JCQkJZXZlbnQuZGF0YSA9IHJlc3RzOwotCQkJfQotCQkJZWxzZSBpZiAoZGEuaXNTdXBwb3J0ZWREYXRhKGV2ZW50LmRhdGEpKSB7Ci0JCQkJaWYgKGRhLnJ1bihldmVudCwgdGFyZ2V0RWRpdG9yKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQljYXJldCA9IG51bGw7Ci0JCVRyYW5zZmVyRGF0YSBkYXRhID0gbnVsbDsKLQkJVHJhbnNmZXJbXSB0cyA9IGdldFRyYW5zZmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGg7IGorKykgewotCQkJCWlmICh0c1tpXS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2pdKSkgewotCQkJCQlkYXRhID0gZXZlbnQuZGF0YVR5cGVzW2pdOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZGF0YTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCW9yZ09mZnNldCA9IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCVN0eWxlZFRleHQgc3QgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCXN0LnNldENhcmV0T2Zmc2V0KG9yZ09mZnNldCk7Ci0JCQlzdC5yZWRyYXcoKTsKLQkJCXN0LnVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50Lm9wZXJhdGlvbnMgJj0gfkRORC5EUk9QX01PVkU7Ci0JCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0KLQkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJUG9pbnQgcHQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCVN0eWxlZFRleHQgc3QgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQotCQkJLy8gYXV0byBzY3JvbGwKLQkJCVJlY3RhbmdsZSBjYSA9IHN0LmdldENsaWVudEFyZWEoKTsKLQkJCWludCBtYXJnaW4gPSBzdC5nZXRMaW5lSGVpZ2h0KCk7Ci0KLQkJCWlmIChwdC55IDwgbWFyZ2luKSB7IC8vIHVwCi0JCQkJc3QuaW52b2tlQWN0aW9uKFNULkxJTkVfVVApOwotCQkJfQotCQkJZWxzZSBpZiAocHQueSA+IGNhLmhlaWdodCAtIG1hcmdpbikgeyAvLyBkb3duCi0JCQkJc3QuaW52b2tlQWN0aW9uKFNULkxJTkVfRE9XTik7Ci0JCQl9Ci0KLQkJCS8vIGRyYXcgaW5zZXJ0aW9uIHBvaW50Ci0JCQlpbnQgb2Zmc2V0ID0gZ2V0RHJvcE9mZnNldChzdCwgcHQpOwotCQkJaWYgKG9mZnNldCAhPSBzdC5nZXRDYXJldE9mZnNldCgpKSB7Ci0JCQkJc3Quc2V0Q2FyZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQlzdC5zZXRTZWxlY3Rpb24ob2Zmc2V0KTsKLQkJCX0KLQotCQkJUG9pbnQgbmV3Q2FyZXQgPSBzdC5nZXRMb2NhdGlvbkF0T2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAobmV3Q2FyZXQuZXF1YWxzKGNhcmV0KSkKLQkJCQlyZXR1cm47Ci0KLQkJCUNhcmV0IGN0ID0gc3QuZ2V0Q2FyZXQoKTsKLQkJCVBvaW50IHNpemUgPSBjdC5nZXRTaXplKCk7Ci0KLQkJCUdDIGdjID0gbmV3IEdDKHN0KTsKLQkJCWdjLnNldExpbmVXaWR0aChzaXplLngpOwotCi0JCQkvLyBlcmFzZSBvbGQgY2FyZXQKLQkJCWlmIChjYXJldCAhPSBudWxsKSB7Ci0JCQkJQ29sb3Igb3JpZ2luYWxGb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCWdjLnNldEZvcmVncm91bmQoc3QuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCQlnYy5kcmF3UmVjdGFuZ2xlKGNhcmV0LngsIGNhcmV0LnksIHNpemUueCwgc2l6ZS55KTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKG9yaWdpbmFsRm9yZWdyb3VuZCk7Ci0JCQl9Ci0KLQkJCXN0LnJlZHJhdygpOwotCQkJc3QudXBkYXRlKCk7Ci0KLQkJCS8vIGRyYXcgbmV3IGNhcmV0Ci0JCQljYXJldCA9IG5ld0NhcmV0OwotCQkJaWYgKGN0LmdldEltYWdlKCkgIT0gbnVsbCkKLQkJCQlnYy5kcmF3SW1hZ2UoY3QuZ2V0SW1hZ2UoKSwgY2FyZXQueCwgY2FyZXQueSk7Ci0JCQllbHNlIHsKLQkJCQlnYy5kcmF3TGluZShjYXJldC54LCBjYXJldC55LCBjYXJldC54LCBjYXJldC55ICsgc2l6ZS55KTsKLQkJCX0KLQotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50Lm9wZXJhdGlvbnMgPT0gRE5ELkRST1BfTk9ORSkKLQkJCXJldHVybjsKLQotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQlQb2ludCBwdCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJU3R5bGVkVGV4dCBzdCA9IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCi0JCQlpbnQgb2Zmc2V0ID0gZ2V0RHJvcE9mZnNldChzdCwgcHQpOwotCQkJaWYgKG9mZnNldCAhPSBzdC5nZXRDYXJldE9mZnNldCgpKSB7Ci0JCQkJc3Quc2V0Q2FyZXRPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQotCQkJLy8gSVNlbGVjdGlvblByb3ZpZGVyIHNwID0gdGV4dFZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJLy8gSVNlbGVjdGlvbiBzZWwgPSBuZXcgVGV4dFNlbGVjdGlvbihvZmZzZXQsIDApOwotCQkJLy8gc3Auc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCQkvLyBCVUcxNDUzOTIgLSBuZWVkIHRvIGFjY291bnQgZm9yIGZvbGRlZCByZWdpb25zCi0JCQlpZiAodGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJCW9mZnNldCA9ICgoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB0ZXh0Vmlld2VyKS53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCXRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShvZmZzZXQsIDApOwotCQl9Ci0KLQkJVHJhbnNmZXJbXSB0cyA9IGdldFRyYW5zZmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodHNbaV0uaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCQlpZiAoZG9Ecm9wKHRzW2ldLCBldmVudCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXREcm9wT2Zmc2V0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlQb2ludCBwdCA9IGdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCVN0eWxlZFRleHQgc3QgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJcmV0dXJuIGdldERyb3BPZmZzZXQoc3QsIHB0KTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXREcm9wT2Zmc2V0KFN0eWxlZFRleHQgc3QsIFBvaW50IHB0KSB7Ci0JCWludCBvZmZzZXQgPSBzdC5nZXRDYXJldE9mZnNldCgpOwotCQl0cnkgewotCQkJb2Zmc2V0ID0gc3QuZ2V0T2Zmc2V0QXRMb2NhdGlvbihwdCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIG5vcm1hbCBjYXNlIGlmIG1vdXNlIGN1cnNvciBpcyBvbiBvdXRzaWRlIG9mIHZhbGlkCi0JCQkvLyB0ZXh0LgotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJUG9pbnQgcCA9IG5ldyBQb2ludCgocHQueCA+IDAgPyBwdC54IDogMCksIHB0LnkpOwotCQkJLy8gc2VhcmNoIG5lYXJlc3QgY2hhcmFjdGVyCi0JCQlmb3IgKDsgcC54ID4gLTE7IHAueC0tKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb2Zmc2V0ID0gc3QuZ2V0T2Zmc2V0QXRMb2NhdGlvbihwKTsKLQotCQkJCQkvKgotCQkJCQkgKiBOb3cgdGhhdCBhIHZhbGlkIG9mZnNldCBoYXMgYmVlbiBmb3VuZCwgdHJ5IHRvIHBsYWNlIGF0Ci0JCQkJCSAqIHRoZSBlbmQgb2YgdGhlIGxpbmUKLQkJCQkJICovCi0JCQkJCS8qCi0JCQkJCSAqIHBhcnRpYWwgbGluZSBmb2xkaW5nIGludmFsaWRhdGVzIGFueSAibW92ZSB0byBFT0wiCi0JCQkJCSAqIGFjdGlvbiB3ZSBtaWdodCB0YWtlCi0JCQkJCSAqLwotCQkJCQkvLyBpZiAodGV4dFZpZXdlciAhPSBudWxsICYmIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSAhPQotCQkJCQkvLyBudWxsKSB7Ci0JCQkJCS8vIElSZWdpb24gbGluZUluZm8gPSBudWxsOwotCQkJCQkvLyB0cnkgewotCQkJCQkvLyBpZiAodGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJCQkvLyBsaW5lSW5mbyA9Ci0JCQkJCS8vIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldCgoKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSl0ZXh0Vmlld2VyKS53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQob2Zmc2V0KSk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gZWxzZSB7Ci0JCQkJCS8vIGxpbmVJbmZvID0KLQkJCQkJLy8gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQkJLy8gfQotCQkJCQkvLyBpZiAobGluZUluZm8gIT0gbnVsbCkKLQkJCQkJLy8gb2Zmc2V0ID0gbGluZUluZm8uZ2V0T2Zmc2V0KCkgKyBsaW5lSW5mby5nZXRMZW5ndGgoKTsKLQkJCQkJLy8gfQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJb2Zmc2V0ID0gc3QuZ2V0Q2hhckNvdW50KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0VGFyZ2V0RWRpdG9yKCkgewotCQlyZXR1cm4gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyBJVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gdGV4dFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJbXQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlcltdIGdldFRyYW5zZmVycygpIHsKLQkJaWYgKHRyYW5zZmVycyA9PSBudWxsKSB7Ci0JCQlUcmFuc2ZlckJ1aWxkZXIgdGIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKHVzZVByb3h5KTsKLQkJCWlmIChlZGl0b3JJZHMgPT0gbnVsbCB8fCBlZGl0b3JJZHMubGVuZ3RoID09IDApCi0JCQkJdHJhbnNmZXJzID0gdGIuZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhnZXRUYXJnZXRFZGl0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJdHJhbnNmZXJzID0gdGIuZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhlZGl0b3JJZHMpOwotCQl9Ci0JCXJldHVybiB0cmFuc2ZlcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQl0aGlzLnRhcmdldEVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRJRHMoU3RyaW5nW10gaWRzKSB7Ci0JCWVkaXRvcklkcyA9IGlkczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Vmlld2VyKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJdGhpcy50ZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IHRvQ29udHJvbChQb2ludCBwb2ludCkgewotCQlyZXR1cm4gKHRleHRWaWV3ZXIgIT0gbnVsbCA/IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnRvQ29udHJvbChwb2ludCkgOiBwb2ludCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0ZpbGVEcm9wQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRmlsZURyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhM2IzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRmlsZURyb3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQWN0aW9uIGZvciBmaWxlIGRyb3AKLSAqLwotcHVibGljIGNsYXNzIEZpbGVEcm9wQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3REcm9wQWN0aW9uIHsKLQlwdWJsaWMgYm9vbGVhbiBydW4oRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJU3RyaW5nW10gc3RycyA9IChTdHJpbmdbXSkgZXZlbnQuZGF0YTsKLQkJaWYgKHN0cnMgPT0gbnVsbCB8fCBzdHJzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgc3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgKytpKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoc3Ryc1tpXSk7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlwYXRoID0gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQl9Ci0KLQkJCXN0ciArPSAiXCIiICsgcGF0aC50b1N0cmluZygpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gaW5zZXJ0KHN0ciwgdGFyZ2V0RWRpdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0Zvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiYWRmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgc3RhdGljIEZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIgaW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlcigpOwotCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJaW5zdGFuY2UucmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiwgImZvcm1hdFByb2Nlc3NvcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkgVE9ETzogcHJpdmF0ZSBmaWVsZCBuZXZlciByZWFkIGxvY2FsbHkKLQlTdHJpbmcgcHJvY2Vzc29yQ2xhc3NOYW1lOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlpZiAoY29udGVudFR5cGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbnVsbDsKLQkJaWYgKG1hcC5jb250YWluc0tleShjb250ZW50VHlwZUlkKSkgewotCQkJZm9ybWF0UHJvY2Vzc29yID0gKElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yKSBtYXAuZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQl9IGVsc2UgewotCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQlJQ29udGVudFR5cGUgcXVlcnlDb250ZW50VHlwZSA9IG1hbmFnZXIuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnRDb250ZW50VHlwZUlkID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJSUNvbnRlbnRUeXBlIGVsZW1lbnRDb250ZW50VHlwZSA9IG1hbmFnZXIuZ2V0Q29udGVudFR5cGUoZWxlbWVudENvbnRlbnRUeXBlSWQpOwotCQkJCWlmIChxdWVyeUNvbnRlbnRUeXBlLmlzS2luZE9mKGVsZW1lbnRDb250ZW50VHlwZSkpIHsKLQkJCQkJZm9ybWF0UHJvY2Vzc29yID0gKElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yKSBtYXAuZ2V0KGVsZW1lbnRDb250ZW50VHlwZUlkKTsKLQkJCQkJbWFwLnB1dChjb250ZW50VHlwZUlkLCBmb3JtYXRQcm9jZXNzb3IpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFmb3VuZCkKLQkJCQltYXAucHV0KGNvbnRlbnRUeXBlSWQsIG51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIGZvcm1hdFByb2Nlc3NvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygicHJvY2Vzc29yIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY29udGVudFR5cGVJZCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcHJvY2Vzc29yQ2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwbHVnaW5JRCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQotCQkJdHJ5IHsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBwcm9jZXNzb3IgPSAoSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IpYnVuZGxlLmxvYWRDbGFzcyhwcm9jZXNzb3JDbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJbWFwLnB1dChjb250ZW50VHlwZUlkLCBwcm9jZXNzb3IpOwotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0dvdG9Bbm5vdGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvR290b0Fubm90YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlZGVkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvR290b0Fubm90YXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Bbm5vdGF0aW9uUHJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFZGl0b3JTdGF0dXNMaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLQotLyoqCi0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5Hb3RvQW5ub3RhdGlvbkFjdGlvbiBhbmQKLSAqIHRoZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YUVkaXRvcidzIGdvdG9FcnJvcigpIG1ldGhvZC4gUmV3cml0dGVuCi0gKiBiYXNlZCBvbiAzLjBNNyB2ZXJzaW9uIHRvIG9wZXJhdGUgZ2VuZXJpY2FsbHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuR290b0Fubm90YXRpb25BY3Rpb24KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR290b0Fubm90YXRpb25BY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZ290b05leHRBbm5vdGF0aW9uIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHN0YXR1cyBsaW5lIG9uIHNlbGVjdGlvbiBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTdGF0dXNMaW5lQ2xlYXJlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlJU3RhdHVzTGluZU1hbmFnZXIgZlN0YXR1c0xpbmVNYW5hZ2VyID0gbnVsbDsKLQotCQlwcm90ZWN0ZWQgU3RhdHVzTGluZUNsZWFyZXIoSVN0YXR1c0xpbmVNYW5hZ2VyIG1ncikgewotCQkJc3VwZXIoKTsKLQkJCWZTdGF0dXNMaW5lTWFuYWdlciA9IG1ncjsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihTdGF0dXNMaW5lQ2xlYXJlci50aGlzKTsKLQotCQkJZlN0YXR1c0xpbmVNYW5hZ2VyLnNldEVycm9yTWVzc2FnZShudWxsLCBudWxsKTsKLQkJCWZTdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZGb3J3YXJkOwotCXByaXZhdGUgU3RyaW5nIGZMYWJlbDsKLQotCXByaXZhdGUgU3RyaW5nIGZQcmVmaXg7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBHb3RvQW5ub3RhdGlvbkFjdGlvbihTdHJpbmcgcHJlZml4LCBib29sZWFuIGZvcndhcmQpIHsKLQkJc3VwZXIoU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCBwcmVmaXgsIG51bGwpOwotCQlmRm9yd2FyZCA9IGZvcndhcmQ7Ci0JCWZQcmVmaXggPSBwcmVmaXg7Ci0JCWZMYWJlbCA9IFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoZlByZWZpeCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGxhYmVsIHVzZWQgZm9yIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TGFiZWwoKSB7Ci0JCXJldHVybiBmTGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiBjbG9zZXN0IHRvIHRoZSBnaXZlbiByYW5nZSByZXNwZWN0aW5nIHRoZSBnaXZlbgotCSAqIGRpcmVjdGlvbi4gSWYgYW4gYW5ub3RhdGlvbiBpcyBmb3VuZCwgdGhlIGFubm90YXRpb25zIGN1cnJlbnQgcG9zaXRpb24KLQkgKiBpcyBjb3BpZWQgaW50byB0aGUgcHJvdmlkZWQgYW5ub3RhdGlvbiBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgcmVnaW9uIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gbGVuZ3RoCi0JICogQHBhcmFtIGZvcndhcmQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGZvciBmb3J3YXJkcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvcgotCSAqICAgICAgICAgICAgYmFja3dhcmQKLQkgKiBAcGFyYW0gYW5ub3RhdGlvblBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGZvdW5kIGFubm90YXRpb24KLQkgKiBAcmV0dXJuIHRoZSBmb3VuZCBhbm5vdGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0TmV4dEFubm90YXRpb24oZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxlbmd0aCwgYm9vbGVhbiBmb3J3YXJkLCBQb3NpdGlvbiBhbm5vdGF0aW9uUG9zaXRpb24pIHsKLQkJQW5ub3RhdGlvbiBuZXh0QW5ub3RhdGlvbiA9IG51bGw7Ci0JCVBvc2l0aW9uIG5leHRBbm5vdGF0aW9uUG9zaXRpb24gPSBudWxsOwotCQlBbm5vdGF0aW9uIGNvbnRhaW5pbmdBbm5vdGF0aW9uID0gbnVsbDsKLQkJUG9zaXRpb24gY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbiA9IG51bGw7Ci0JCWJvb2xlYW4gY3VycmVudEFubm90YXRpb24gPSBmYWxzZTsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJaW50IGVuZE9mRG9jdW1lbnQgPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJaW50IGRpc3RhbmNlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IGdldFRleHRFZGl0b3IoKS5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0QW5ub3RhdGlvbk1vZGVsKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJLy8gZXh0ZXJuYWwgZmlsZXMgbWF5IG5vdCBoYXZlIGFuIGFubm90YXRpb24gbW9kZWwKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBtb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUFubm90YXRpb24gYSA9IChBbm5vdGF0aW9uKSBlLm5leHQoKTsKLQkJCQlpZiAoIWlzTmF2aWdhdGlvblRhcmdldChhKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbW9kZWwuZ2V0UG9zaXRpb24oYSk7Ci0JCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoZm9yd2FyZCAmJiBwLm9mZnNldCA9PSBvZmZzZXQgfHwgIWZvcndhcmQgJiYgcC5vZmZzZXQgKyBwLmdldExlbmd0aCgpID09IG9mZnNldCArIGxlbmd0aCkgewotCQkJCQlpZiAoY29udGFpbmluZ0Fubm90YXRpb24gPT0gbnVsbCB8fCAoZm9yd2FyZCAmJiBwLmxlbmd0aCA+PSBjb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uLmxlbmd0aCB8fCAhZm9yd2FyZCAmJiBwLmxlbmd0aCA+PSBjb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uLmxlbmd0aCkpIHsKLQkJCQkJCWNvbnRhaW5pbmdBbm5vdGF0aW9uID0gYTsKLQkJCQkJCWNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24gPSBwOwotCQkJCQkJY3VycmVudEFubm90YXRpb24gPSBwLmxlbmd0aCA9PSBsZW5ndGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBjdXJyZW50RGlzdGFuY2UgPSAwOwotCi0JCQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJCQljdXJyZW50RGlzdGFuY2UgPSBwLmdldE9mZnNldCgpIC0gb2Zmc2V0OwotCQkJCQkJaWYgKGN1cnJlbnREaXN0YW5jZSA8IDApIHsKLQkJCQkJCQljdXJyZW50RGlzdGFuY2UgPSBlbmRPZkRvY3VtZW50ICsgY3VycmVudERpc3RhbmNlOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoY3VycmVudERpc3RhbmNlIDwgZGlzdGFuY2UgfHwgY3VycmVudERpc3RhbmNlID09IGRpc3RhbmNlICYmIHAubGVuZ3RoIDwgbmV4dEFubm90YXRpb25Qb3NpdGlvbi5sZW5ndGgpIHsKLQkJCQkJCQlkaXN0YW5jZSA9IGN1cnJlbnREaXN0YW5jZTsKLQkJCQkJCQluZXh0QW5ub3RhdGlvbiA9IGE7Ci0JCQkJCQkJbmV4dEFubm90YXRpb25Qb3NpdGlvbiA9IHA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljdXJyZW50RGlzdGFuY2UgPSBvZmZzZXQgKyBsZW5ndGggLSAocC5nZXRPZmZzZXQoKSArIHAubGVuZ3RoKTsKLQkJCQkJCWlmIChjdXJyZW50RGlzdGFuY2UgPCAwKQotCQkJCQkJCWN1cnJlbnREaXN0YW5jZSA9IGVuZE9mRG9jdW1lbnQgKyBjdXJyZW50RGlzdGFuY2U7Ci0KLQkJCQkJCWlmIChjdXJyZW50RGlzdGFuY2UgPCBkaXN0YW5jZSB8fCBjdXJyZW50RGlzdGFuY2UgPT0gZGlzdGFuY2UgJiYgcC5sZW5ndGggPCBuZXh0QW5ub3RhdGlvblBvc2l0aW9uLmxlbmd0aCkgewotCQkJCQkJCWRpc3RhbmNlID0gY3VycmVudERpc3RhbmNlOwotCQkJCQkJCW5leHRBbm5vdGF0aW9uID0gYTsKLQkJCQkJCQluZXh0QW5ub3RhdGlvblBvc2l0aW9uID0gcDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbiAhPSBudWxsICYmICghY3VycmVudEFubm90YXRpb24gfHwgbmV4dEFubm90YXRpb24gPT0gbnVsbCkpIHsKLQkJCWFubm90YXRpb25Qb3NpdGlvbi5zZXRPZmZzZXQoY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0TGVuZ3RoKGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJcmV0dXJuIGNvbnRhaW5pbmdBbm5vdGF0aW9uOwotCQl9Ci0JCWlmIChuZXh0QW5ub3RhdGlvblBvc2l0aW9uICE9IG51bGwpIHsKLQkJCWFubm90YXRpb25Qb3NpdGlvbi5zZXRPZmZzZXQobmV4dEFubm90YXRpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0TGVuZ3RoKG5leHRBbm5vdGF0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG5leHRBbm5vdGF0aW9uOwotCX0KLQotCXByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgewotCQkvLyBUaGUgb3JpZ2luYWwgSmF2YUVkaXRvciBNNyBpbXBsZW1lbnRhdGlvbiBtYWRlIHVzZSBvZiBhbiBhZGFwdGVyLAotCQkvLyBidXQgdGhhdCBhcHByb2FjaAotCQkvLyBmYWlscyB3aXRoIGEgTXVsdGlQYWdlRWRpdG9yU2l0ZQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHBhZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJcmV0dXJuICgoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIGNvbnRyaWJ1dG9yKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGFiZWwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBKdW1wcyB0byB0aGUgZXJyb3IgbmV4dCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGRpcmVjdGlvbiBiYXNlZCBvZmYKLQkgKiBKYXZhRWRpdG9yI2dvdG9Bbm5vdGF0aW9uKCkKLQkgKiAKLQkgKiBAcGFyYW0gZm9yd2FyZAotCSAqICAgICAgICAgICAgaXMgdGhlIGRpcmVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9Bbm5vdGF0aW9uKGJvb2xlYW4gZm9yd2FyZCkgewotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlQb3NpdGlvbiBwb3NpdGlvbiA9IG5ldyBQb3NpdGlvbigwLCAwKTsKLQkJaWYgKGZhbHNlIC8qIGRlbGF5ZWQgLSBzZWUgYnVnIDE4MzE2ICovKSB7Ci0JCQlnZXROZXh0QW5ub3RhdGlvbihzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgZm9yd2FyZCwgcG9zaXRpb24pOwotCQkJZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChwb3NpdGlvbi5nZXRPZmZzZXQoKSwgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UgLyogbm8gZGVsYXkgLSBzZWUgYnVnIDE4MzE2ICovewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0TmV4dEFubm90YXRpb24oc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCksIGZvcndhcmQsIHBvc2l0aW9uKTsKLQkJCUlFZGl0b3JTdGF0dXNMaW5lIGVkaXRvclN0YXR1c0xpbmUgPSAoSUVkaXRvclN0YXR1c0xpbmUpIGdldFRleHRFZGl0b3IoKS5nZXRBZGFwdGVyKElFZGl0b3JTdGF0dXNMaW5lLmNsYXNzKTsKLQkJCWlmIChlZGl0b3JTdGF0dXNMaW5lICE9IG51bGwpIHsKLQkJCQllZGl0b3JTdGF0dXNMaW5lLnNldE1lc3NhZ2UodHJ1ZSwgbnVsbCwgbnVsbCk7Ci0JCQkJZWRpdG9yU3RhdHVzTGluZS5zZXRNZXNzYWdlKGZhbHNlLCBudWxsLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlTdGF0dXNMaW5lTWFuYWdlciBtZ3IgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCQltZ3Iuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCQltZ3Iuc2V0TWVzc2FnZShudWxsLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdXBkYXRlQW5ub3RhdGlvblZpZXdzKGFubm90YXRpb24pOwotCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3QgYW5kIHJldmVhbCAiICsgYW5ub3RhdGlvbi5nZXRUeXBlKCkgKyAiQCIgKyBwb3NpdGlvbi5nZXRPZmZzZXQoKSArICI6IiArIHBvc2l0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChwb3NpdGlvbi5nZXRPZmZzZXQoKSwgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChlZGl0b3JTdGF0dXNMaW5lICE9IG51bGwpIHsKLQkJCQkJZWRpdG9yU3RhdHVzTGluZS5zZXRNZXNzYWdlKHRydWUsIG51bGwsIG51bGwpOwotCQkJCQllZGl0b3JTdGF0dXNMaW5lLnNldE1lc3NhZ2UoZmFsc2UsIGFubm90YXRpb24uZ2V0VGV4dCgpLCBudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlTdGF0dXNMaW5lTWFuYWdlciBtZ3IgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJCW1nci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCQltZ3Iuc2V0TWVzc2FnZShudWxsLCBhbm5vdGF0aW9uLmdldFRleHQoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBTdGF0dXNMaW5lQ2xlYXJlcihtZ3IpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGFubm90YXRpb24gaXMgY29uZmlndXJlZCBhcyBhIHRhcmdldCBmb3IgdGhlCi0JICogIkdvIHRvIE5leHQvUHJldmlvdXMgQW5ub3RhdGlvbiIgYWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHRhcmdldCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKiBAc2VlIEVjbGlwc2UgMy4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYXZpZ2F0aW9uVGFyZ2V0KEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEVkaXRvcnNVSS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlBbm5vdGF0aW9uUHJlZmVyZW5jZSBwcmVmZXJlbmNlID0gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYW5ub3RhdGlvbik7Ci0JCS8vIFNlZSBidWcgNDE2ODkKLQkJLy8gU3RyaW5nIGtleT0gZm9yd2FyZCA/IHByZWZlcmVuY2UuZ2V0SXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXkoKQotCQkvLyA6IHByZWZlcmVuY2UuZ2V0SXNHb1RvUHJldmlvdXNOYXZpZ2F0aW9uVGFyZ2V0S2V5KCk7Ci0JCVN0cmluZyBrZXkgPSBwcmVmZXJlbmNlID09IG51bGwgPyBudWxsIDogcHJlZmVyZW5jZS5nZXRJc0dvVG9OZXh0TmF2aWdhdGlvblRhcmdldEtleSgpOwotCQlyZXR1cm4gKGtleSAhPSBudWxsICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlnb3RvQW5ub3RhdGlvbihmRm9yd2FyZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlci5zZXRFZGl0b3IoZWRpdG9yKTsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgYW5ub3RhdGlvbiB2aWV3cyB0aGF0IHNob3cgdGhlIGdpdmVuIGFubm90YXRpb24uCi0JICogCi0JICogQHBhcmFtIGFubm90YXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQW5ub3RhdGlvblZpZXdzKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlJTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikKLQkJCW1hcmtlciA9ICgoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0TWFya2VyKCk7Ci0KLQkJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJCUlWaWV3UGFydCB2aWV3ID0gbnVsbDsKLQkJCQkJCWlmIChtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5QUk9CTEVNKSkgewotCQkJCQkJCXZpZXcgPSBwYWdlLmZpbmRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5UQVNLKSkgewotCQkJCQkJCXZpZXcgPSBwYWdlLmZpbmRWaWV3KElQYWdlTGF5b3V0LklEX1RBU0tfTElTVCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5CT09LTUFSSykpIHsKLQkJCQkJCQl2aWV3ID0gcGFnZS5maW5kVmlldyhJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQkJCQkJfQotCQkJCQkJLy8gSWYgdGhlIHZpZXcgaXNuJ3Qgb3BlbiBvbiB0aGlzIHBlcnNwZWN0aXZlLCBkb24ndAotCQkJCQkJLy8gaW50ZXJhY3Qgd2l0aCBpdAotCQkJCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCQkJCU1ldGhvZCBtZXRob2QgPSB2aWV3LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRTZWxlY3Rpb24iLCBuZXcgQ2xhc3NbXXtJU3RydWN0dXJlZFNlbGVjdGlvbi5jbGFzcywgYm9vbGVhbi5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCQkJCW1ldGhvZC5pbnZva2UodmlldywgbmV3IE9iamVjdFtde25ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1hcmtlciksIEJvb2xlYW4uVFJVRX0pOwotCQkJCQkJCQlwYWdlLmJyaW5nVG9Ub3Aodmlldyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gaWdub3JlIGV4Y2VwdGlvbnMsIGRvbid0IHVwZGF0ZSBhbnkgb2YgdGhlIGxpc3RzLCBqdXN0IHNldAotCQkJLy8gc3RhdHVzbGluZQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJCS8vCi0JCQl9Ci0JCQljYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geCkgewotCQkJCS8vCi0JCQl9Ci0JCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JQWN0aW9uVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUFjdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQ2ZWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JQWN0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvblZhbGlkYXRvciB7Ci0JYm9vbGVhbiBpc1ZhbGlkQWN0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSURyb3BBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzJhNzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJRHJvcEFjdGlvbiB7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBEcm9wVGFyZ2V0RXZlbnQuZGF0YSB3aWxsIGJlIHBhc3NlZC4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBmb3Igc3VwcG9ydGVkIGRhdGEgdHlwZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkRGF0YShPYmplY3QgZGF0YSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBmb3IgdGhlIGFjdGlvbiBpcyBhY3R1YWxseSBwcm9jZXNzZWQgZmFsc2UgZm9yIHRoZQotCSAqICAgICAgICAgYWN0aW9uIGlzIG5vdCBwcm9jZXNzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKERyb3BUYXJnZXRFdmVudCBldmVudCwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZENvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzlmZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZHMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLCBJUG9wdXBNZW51Q29udHJpYnV0b3IgewotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpOwotCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkRWRpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkRWRpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDc3MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZEVkaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLQotcHVibGljIGludGVyZmFjZSBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24gZXh0ZW5kcyBJVXBkYXRlIHsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGFjdGlvbiBpdGVtIGlzIHZpc2libGUKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXRlbSBpcyB2aXNpYmxlLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSBlZGl0b3IgZm9yIHRoZSBhY3Rpb24uIEltcGxlbWVudG9ycyBzaG91bGQgZGlzY29ubmVjdAotCSAqIGZyb20gdGhlIG9sZCBlZGl0b3IsIGNvbm5lY3QgdG8gdGhlIG5ldyBlZGl0b3IsIGFuZCB1cGRhdGUgdGhlIGFjdGlvbgotCSAqIHRvIHJlZmxlY3QgdGhlIG5ldyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHRhcmdldEVkaXRvcgotCSAqICAgICAgICAgICAgdGhlIG5ldyBlZGl0b3IgdGFyZ2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IoSUV4dGVuZGVkU2ltcGxlRWRpdG9yIHRhcmdldEVkaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkTWFya3VwRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkTWFya3VwRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWVhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZE1hcmt1cEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBJRXh0ZW5kZWRNYXJrdXBFZGl0b3IKLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBlZGl0b3IncyBJU291cmNlRWRpdGluZ1RleHRUb29scyBhZGFwdGVyIGFuZCBjYXN0IHRvCi0gKiAgICAgICAgICAgICBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scyB3aGVuIGFwcHJvcHJpYXRlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuZGVkTWFya3VwRWRpdG9yICB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuZ2V0Tm9kZShpbnQpIG1ldGhvZAotCSAqICAgICAgICAgICAgIHdpdGggSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuZ2V0Q2FyZXRPZmZzZXQoKQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDYXJldE5vZGUoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIG1ldGhvZCBvbiBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scwotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRET01Eb2N1bWVudCgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBzb21lIGVkaXRvcnMgd2lsbCBwcm92aWRlIHRoZSBsaXN0IG9mIHNlbGVjdGVkIG5vZGVzIGFzCi0JICogICAgICAgICAgICAgcGFydCBvZiBJU291cmNlRWRpdGluZ1RleHRUb29scy5nZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkTm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRTaW1wbGVFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRTaW1wbGVFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzYWQ1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkU2ltcGxlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQsIG9idGFpbiBhIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGFkYXB0ZXIgZnJvbSB0aGUgZWRpdG9yIHBhcnQKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZFNpbXBsZUVkaXRvciB7Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0UG9zaXRpb24oKTsKLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCk7Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lNb2RlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ZDczOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxQcm92aWRlciBleHRlbmRzIElEb2N1bWVudFByb3ZpZGVyIHsKLQlJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKE9iamVjdCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUG9wdXBNZW51Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUG9wdXBNZW51Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNTE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVBvcHVwTWVudUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLQotcHVibGljIGludGVyZmFjZSBJUG9wdXBNZW51Q29udHJpYnV0b3IgewotCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUmVsZWFzYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lSZWxlYXNhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MDY4MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lSZWxlYXNhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbGVhc2FibGUgewotCS8qKgotCSAqIEdlbmVyaWMgY2F0Y2gtYWxsIGZvciByZWxlYXNpbmcgcmVzb3VyY2VzIGFuZCBvdGhlciByZWZlcmVuY2VzCi0JICovCi0Jdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MjU1ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogRW5hYmxlcyBkaXNhYmxlcyBhY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBzb3VyY2Ugdmlld2VyIChhbmQKLQkgKiBzaG91bGQgb25seSB3b3JrIHdoZW4gdGhlIHNvdXJjZSB2aWV3ZXIgaXMgZW5hYmxlZCkKLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqICAgICAgICAgICAgdHJ1ZSBpZiBzb3VyY2Ugdmlld2VyIGlzIGN1cnJlbnRseSBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVRlbXBvcmFyeUFubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzI1NjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUZW1wb3JhcnlBbm5vdGF0aW9uIHsKLQlPYmplY3QgZ2V0S2V5KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjY1ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiNTZkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcy5Db21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci0KLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyB1c2UgdGhlIGJhc2UgYW5ub3RhdGlvbiAmIHF1aWNrIGRpZmYgcHJlZmVyZW5jZSBwYWdlCi0JCUVkaXRvcnNVSS51c2VBbm5vdGF0aW9uc1ByZWZlcmVuY2VQYWdlKHN0b3JlKTsKLQkJRWRpdG9yc1VJLnVzZVF1aWNrRGlmZlByZWZlcmVuY2VQYWdlKHN0b3JlKTsKLQotCQkvLyBsZXQgYW5ub3RhdGlvbnMgc2hvdyB1cCBpbiB0aGUgdmVydGljYWwgcnVsZXIgaWYgdGhhdCdzIHdoYXQgdGhlCi0JCS8vIHByZWZlcmVuY2UgaXMKLQkJLy8JCS8vIHRoZXNlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgaGF2ZSBhIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlIHRoYW4KLQkJLy8gdGhlIG9uZSB0aGUgYmFzZSBwcm92aWRlcwotCQkvLwkJc3RvcmUuc2V0RGVmYXVsdCgiZXJyb3JJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIiwgZmFsc2UpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQlzdG9yZS5zZXREZWZhdWx0KCJ3YXJuaW5nSW5kaWNhdGlvbkluVmVydGljYWxSdWxlciIsIGZhbHNlKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoZXNlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgYXJlIG5vdCBwYXJ0IG9mIGJhc2UgdGV4dCBlZGl0b3IKLQkJLy8gcHJlZmVyZW5jZQotCQlzdG9yZS5zZXREZWZhdWx0KENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMsIHRydWUpOwotCi0JCXNldE1hdGNoaW5nQnJhY2tldHNQcmVmZXJlbmNlcyhzdG9yZSk7Ci0KLQkJLy8gaG92ZXIgaGVscCBwcmVmZXJlbmNlcyBhcmUgbm90IHBhcnQgb2YgYmFzZSB0ZXh0IGVkaXRvciBwcmVmZXJlbmNlCi0JCVN0cmluZyBtb2QyTmFtZSA9IEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoU1dULk1PRDIpOyAvLyBTV1QuQ09NTUFORAotCQkvLyBvbiBNYWM7Ci0JCS8vIFNXVC5DT05UUk9MCi0JCS8vIGVsc2V3aGVyZQotCQlzdG9yZS5zZXREZWZhdWx0KEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMsICJjb21iaW5hdGlvbkhvdmVyfHRydWV8MDtwcm9ibGVtSG92ZXJ8ZmFsc2V8MDtkb2N1bWVudGF0aW9uSG92ZXJ8ZmFsc2V8MDthbm5vdGF0aW9uSG92ZXJ8dHJ1ZXwiICsgbW9kMk5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gc2V0IGRlZmF1bHQgcmVhZC1vbmx5IGZvcmVncm91bmQgY29sb3Igc2NhbGUgdmFsdWUKLQkJc3RvcmUuc2V0RGVmYXVsdChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUsIDMwKTsKLQkJCi0JCS8vIHNldCBkZWZhdWx0IGVuYWJsZSBmb2xkaW5nIHZhbHVlCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCwgZmFsc2UpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgZm9yIHNob3cgbWVzc2FnZSBkaWFsb2cgd2hlbiB1bmtub3duIGNvbnRlbnQgdHlwZSBpbiBlZGl0b3IKLQkJc3RvcmUuc2V0RGVmYXVsdChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuU0hPV19VTktOT1dOX0NPTlRFTlRfVFlQRV9NU0csIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNYXRjaGluZ0JyYWNrZXRzUHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQkvLyBtYXRjaGluZyBicmFja2V0cyBpcyBub3QgcGFydCBvZiBiYXNlIHRleHQgZWRpdG9yIHByZWZlcmVuY2UKLQkJc3RvcmUuc2V0RGVmYXVsdChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuTUFUQ0hJTkdfQlJBQ0tFVFMsIHRydWUpOwotCQlQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUU19DT0xPUiwgbmV3IFJHQigxOTIsIDE5MiwgMTkyKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9SZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9SZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiMGI5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlciBleHRlbmRzIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyKGJvb2xlYW4gdXNlUHJveHkpIGZvcgotCSAqICAgICAgICAgICAgIHRoZSBwZXJmb3JtYW5jZQotCSAqLwotCXB1YmxpYyBSZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlcihib29sZWFuIHVzZVByb3h5KSB7Ci0JCXN1cGVyKHVzZVByb3h5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRUZXh0Vmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJaWYgKCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmNvbnRhaW5zUmVhZE9ubHkoZ2V0RHJvcE9mZnNldChldmVudCksIDApKSB7Ci0JCQkJZXZlbnQub3BlcmF0aW9ucyA9IERORC5EUk9QX05PTkU7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQlnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLnJlZHJhdygpOwotCQkJCWdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkudXBkYXRlKCk7Ci0JCQkJZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCQkJfQotCQl9Ci0JCXN1cGVyLmRyb3AoZXZlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODA5YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBTU0UgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTU0VVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIFNTRVVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNTRVVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29wZW5pbmdfZmlsZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZpbGVfaXNfcmVhZF9vbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8zMmNvbmNhdF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpcGxlX2Vycm9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVW5kb19UZXh0X0NoYW5nZV9fQ3RybF9aX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRvX1RleHRfQ2hhbmdlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VuZG9fXzBfX19DdHJsX1pfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZG9fX18wX19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9SZWRvX1RleHRfQ2hhbmdlX19DdHJsX1lfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZG9fVGV4dF9DaGFuZ2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfUmVkb19fMF9fX0N0cmxfWV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVkb19fXzBfX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0TWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRfRG9jdW1lbnRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdF9BY3RpdmVfRWxlbWVudHNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfQ3V0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0X1Bhc3RlX1VJXzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBfRG9jdW1lbnRfVUlfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0N1dF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ3V0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0N1dF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ3V0X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db3B5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db3B5X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvcHlfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvcHlfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX1Bhc3RlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9QYXN0ZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9QYXN0ZV9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfUGFzdGVfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0RlbGV0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfRGVsZXRlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0RlbGV0ZV9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfRGVsZXRlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdFByb3Bvc2Fsc19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0UHJvcG9zYWxzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdFByb3Bvc2Fsc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXREb2N1bWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXREb2N1bWVudF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGl2ZUVsZW1lbnRzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGl2ZUVsZW1lbnRzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd1Rvb2x0aXBEZXNjX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dUb29sdGlwRGVzY190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dUb29sdGlwRGVzY19pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93VG9vbHRpcERlc2NfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0X1NoaWZ0X1JpZ2h0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0X1NoaWZ0X0xlZnRfVUlfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzRjb25jYXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF90eXBlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9yZWdyb3VuZF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFja2dyb3VuZF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9sZF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSXRhbGljc19VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXN0b3JlX0RlZmF1bHRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhbXBsZV90ZXh0X19VSV87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCcmVha3BvaW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJyZWFrcG9pbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCcmVha3BvaW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJyZWFrcG9pbnRfZXJyb3JfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJyZWFrcG9pbnRfZXJyb3JfZGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQnJlYWtwb2ludF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVCcmVha3BvaW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQnJlYWtwb2ludF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmFibGVCcmVha3BvaW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuYWJsZUJyZWFrcG9pbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmFibGVCcmVha3BvaW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2FibGVCcmVha3BvaW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2FibGVCcmVha3BvaW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzYWJsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfYWRkX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX3JlbW92ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX2FkZGluZ190aXRsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX21lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RDb2xvclBhZ2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JNb2RlbFV0aWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JNb2RlbFV0aWxfMTsKLQotCS8vIFRPRE86IFRoZXNlIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzCi0JLy8gZGVsZXRlZAotCS8vIHdlYiBjb250ZW50IHNldHRpbmdzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfRGVmYXVsdF9IVE1MX0RPQ1RZUEVfSURfX18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0NTU19wcm9maWxlX19fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9UYXJnZXRfRGV2aWNlX19fMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Ub2dnbGVJbnNlcnRNb2RlX2xhYmVsOwotCi0JLy8KLQkvLyBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIFdvcmtiZW5jaCBtZW51IGJhcgotCS8vCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kU2VsZWN0aW9uVG9NZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvdXJjZU1lbnVfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dQcm9wZXJ0aWVzQWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RPcGVuT25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZV9qb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGlvbkRlbGVnYXRlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aW9uRGVsZWdhdGVfNTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzMwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VQYWdlXzMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdFeGNsdXNpb25UYWJfMDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ0V4Y2x1c2lvblRhYl8wMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnRXhjbHVzaW9uVGFiXzAzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVCcmVha3BvaW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0QnJlYWtwb2ludEFjdGlvbl8wOwotCS8vIFVzZWQgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvciBQcmVmZXJlbmNlIFBhZ2UgLyBIb3ZlcnMgVGFiCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2hvdmVyUHJlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9rZXlNb2RpZmllcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkRm9ySG92ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kdXBsaWNhdGVNb2RpZmllcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX25hbWVDb2x1bW5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVyQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZWxpbWl0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnREZWxpbWl0ZXJBbmRNb2RpZmllckFuZERlbGltaXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydE1vZGlmaWVyQW5kRGVsaW1pdGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXI7Ci0KLQkvLyB1c2VkIGR5bmFtaWNhbGx5Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tYmluYXRpb25Ib3Zlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21iaW5hdGlvbkhvdmVyX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvYmxlbUhvdmVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1Ib3Zlcl9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvY3VtZW50YXRpb25Ib3Zlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb2N1bWVudGF0aW9uSG92ZXJfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbm5vdGF0aW9uSG92ZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW5ub3RhdGlvbkhvdmVyX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0U3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlc0FjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlTWFuYWdlcl8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93Vmlld19lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2NfZGlydHlfcmVnaW9uc18wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGV4dEhvdmVyTWFrZVN0aWNreUhpbnQ7Ci0KLQkvLyBFbmNvZGluZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidXN5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcmV0X3VwZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTk7Ci0KLQkvKgotCSAqICoqKioqQmVsb3cgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIHJlbW92ZWQgKioqKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtc19EdXJpbmdfU2F2ZV9Bc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZV9jb3VsZF9ub3RfYmVfY29tcGxldGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JlbW92aW5nX3RpdGxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZW1vdmluZ19tZXNzYWdlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZXRyaWV2aW5nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfZXJyb3Jfc2F2ZV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9lcnJvcl9zYXZlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl93YXJuaW5nX3NhdmVfZGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJldmlvdXNfYW5ub3RhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXh0X2Fubm90YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfRXJyb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UeXBlc19XYXJuaW5nczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfVGFza3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX1NlYXJjaFJlc3VsdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX0Jvb2ttYXJrczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfT3RoZXJzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvV2luZG93c19pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvV2luZG93c19kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9VTklYX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9VTklYX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1VOSVhfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1VOSVhfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvTWFjX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9NYWNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvTWFjX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9NYWNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydExpbmVEZWxpbWl0ZXJzTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV9qb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlXzQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2Fubm90YXRpb25Sb2xsb3ZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX3Nob3dBZmZvcmRhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfZW5hYmxlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljRmluZE9jY3VycmVuY2VzQWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdGlvblByZWZlcmVuY2VUYWJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1vZGVsUHJvdmlkZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKRmFjZU5vZGVBZGFwdGVyXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVQcm9qZWN0U2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlUHJvamVjdFNldHRpbmdzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9hZGluZ1JlZmVyZW5jZWRHcmFtbWFyczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvbGRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Ub2dnbGVfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Ub2dnbGVfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0V4cGFuZEFsbF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0V4cGFuZEFsbF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fQ29sbGFwc2VBbGxfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fQ29sbGFwc2VBbGxfaW1hZ2U7Ci0KLQkvLyBUaGVzZSBzdHJpbmdzIGFyZSBhY2Nlc3NlZCB1c2luZyByZXNvdXJjZSBidW5kbGUgYW5kIGluIHByb3BlcnRpZXMKLQkvLyBmaWxlLCBuZWVkIHRvIHVzZSAnLicgaW5zdGVhZCBvZiAnXycgaW4gc29tZSBrZXlzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX2FkZF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX3JlbW92ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX2FkZF9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19lcnJvcl9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19lcnJvcl9kaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19hZGRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX3JlbW92ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19lcnJvcl9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2Vycm9yX2RpYWxvZ19tZXNzYWdlOwotCS8qCi0JICogKioqKipBYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZCoqKioqCi0JICovCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25Db250ZW50VHlwZURpYWxvZ18wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25Db250ZW50VHlwZURpYWxvZ18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25Db250ZW50VHlwZURpYWxvZ18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0eWxlZFRleHRDb2xvclBpY2tlcl8wOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3ODNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1NjYW5uaW5nU2NoZWR1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBTU0VVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBTU0VVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFNTRVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTU0VVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgVGV4dEhvdmVyTWFuYWdlciBmVGV4dEhvdmVyTWFuYWdlcjsKLQotCXB1YmxpYyBTU0VVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRleHQgaG92ZXIgbWFuYWdlcgotCSAqIAotCSAqIEByZXR1cm4gVGV4dEhvdmVyTWFuYWdlcgotCSAqLwotCXB1YmxpYyBUZXh0SG92ZXJNYW5hZ2VyIGdldFRleHRIb3Zlck1hbmFnZXIoKSB7Ci0JCWlmIChmVGV4dEhvdmVyTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmVGV4dEhvdmVyTWFuYWdlciA9IG5ldyBUZXh0SG92ZXJNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0SG92ZXJNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvKioKLQkJICogSWYgdGhlIHVzZXIgc3RhcnRzIHRoZSB3b3JrYmVuY2ggd2l0aAotCQkgKiAtRG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lcj1vZmYsIHRoZSBzY2FubmVyIHNob3VsZCBiZQotCQkgKiBkaXNhYmxlZAotCQkgKi8KLQkJU3RyaW5nIHNjYW4gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzY2FuID09IG51bGwgfHwgIXNjYW4uZXF1YWxzSWdub3JlQ2FzZSgib2ZmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnN0YXJ0dXAoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnNodXRkb3duKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlMjBjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVycm9yX29wZW5pbmdfZmlsZV9VSV89RXJyb3Igb3BlbmluZyBmaWxlCi1fVUlfRmlsZV9pc19yZWFkX29ubHk9RmlsZSB7MH0gaXMgcmVhZC1vbmx5LgotXzMyY29uY2F0X0VYQ189RWRpdG9yIGNvdWxkIG5vdCBiZSBvcGVuIG9uIHswfQotTXVsdGlwbGVfZXJyb3JzPU11bHRpcGxlIGFubm90YXRpb25zIGZvdW5kIGF0IHRoaXMgbGluZToKLV9VbmRvX1RleHRfQ2hhbmdlX19DdHJsX1pfVUlfPSZVbmRvIFRleHQgQ2hhbmdlIEBDdHJsK1oKLVVuZG9fVGV4dF9DaGFuZ2VfX1VJXz1VbmRvIFRleHQgQ2hhbmdlLgotX1VuZG9fXzBfX19DdHJsX1pfVUlfPSZVbmRvIHswfSBAQ3RybCtaCi1VbmRvX19fMF9fX1VJXz1VbmRvOiB7MH0uCi1fUmVkb19UZXh0X0NoYW5nZV9fQ3RybF9ZX1VJXz0mUmVkbyBUZXh0IENoYW5nZSBAQ3RybCtZCi1SZWRvX1RleHRfQ2hhbmdlX19VSV89UmVkbyBUZXh0IENoYW5nZS4KLV9SZWRvX18wX19fQ3RybF9ZX1VJXz0mUmVkbyB7MH0gQEN0cmwrWQotUmVkb19fXzBfX19VSV89UmVkbzogezB9LgotRm9ybWF0TWVudV9sYWJlbD1GJm9ybWF0Ci1Gb3JtYXRfRG9jdW1lbnRfVUlfPUZvcm1hdCBEb2N1bWVudAotRm9ybWF0X0FjdGl2ZV9FbGVtZW50c19VSV89Rm9ybWF0IEFjdGl2ZSBFbGVtZW50cwotVGV4dF9DdXRfVUlfPVRleHQgQ3V0Ci1UZXh0X1Bhc3RlX1VJXz1UZXh0IFBhc3RlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DbGVhbnVwX0RvY3VtZW50X1VJXz1DbGVhbnVwIERvY3VtZW50Ci0KLUVkaXRvcl9DdXRfbGFiZWw9Q3UmdEBDdHJsK1gKLUVkaXRvcl9DdXRfdG9vbHRpcD1DdXQKLUVkaXRvcl9DdXRfaW1hZ2U9Ci1FZGl0b3JfQ3V0X2Rlc2NyaXB0aW9uPUN1dAotCi1FZGl0b3JfQ29weV9sYWJlbD0mQ29weUBDdHJsK0MKLUVkaXRvcl9Db3B5X3Rvb2x0aXA9Q29weQotRWRpdG9yX0NvcHlfaW1hZ2U9Ci1FZGl0b3JfQ29weV9kZXNjcmlwdGlvbj1Db3B5Ci0KLUVkaXRvcl9QYXN0ZV9sYWJlbD0mUGFzdGVAQ3RybCtWCi1FZGl0b3JfUGFzdGVfdG9vbHRpcD1QYXN0ZQotRWRpdG9yX1Bhc3RlX2ltYWdlPQotRWRpdG9yX1Bhc3RlX2Rlc2NyaXB0aW9uPVBhc3RlCi0KLUVkaXRvcl9EZWxldGVfbGFiZWw9JkRlbGV0ZUBEZWxldGUKLUVkaXRvcl9EZWxldGVfdG9vbHRpcD1EZWxldGUKLUVkaXRvcl9EZWxldGVfaW1hZ2U9Ci1FZGl0b3JfRGVsZXRlX2Rlc2NyaXB0aW9uPURlbGV0ZQotCi1Db250ZW50QXNzaXN0UHJvcG9zYWxzX2xhYmVsPUNvbiZ0ZW50IEFzc2lzdAotQ29udGVudEFzc2lzdFByb3Bvc2Fsc190b29sdGlwPUNvbnRlbnQgQXNzaXN0Ci1Db250ZW50QXNzaXN0UHJvcG9zYWxzX2Rlc2NyaXB0aW9uPUNvbnRlbnQgQXNzaXN0Ci0KLVF1aWNrRml4X2xhYmVsPSZRdWljayBGaXgKLVF1aWNrRml4X3Rvb2x0aXA9UXVpY2sgRml4Ci1RdWlja0ZpeF9pbWFnZT0KLVF1aWNrRml4X2Rlc2NyaXB0aW9uPVF1aWNrIEZpeAotCi1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2cmbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X2ltYWdlPQotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCAmQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9pbWFnZT0KLUFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jJmsgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9pbWFnZT0KLVJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1SZW1vdmUgQmxvY2sgQ29tbWVudAotQ2xlYW51cERvY3VtZW50X2xhYmVsPUMmbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfaW1hZ2U9Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotRm9ybWF0RG9jdW1lbnRfbGFiZWw9JkRvY3VtZW50Ci1Gb3JtYXREb2N1bWVudF90b29sdGlwPUZvcm1hdCBEb2N1bWVudAotRm9ybWF0RG9jdW1lbnRfaW1hZ2U9Ci1Gb3JtYXREb2N1bWVudF9kZXNjcmlwdGlvbj1Gb3JtYXQgRG9jdW1lbnQKLUZvcm1hdEFjdGl2ZUVsZW1lbnRzX2xhYmVsPUFjdCZpdmUgRWxlbWVudHMKLUZvcm1hdEFjdGl2ZUVsZW1lbnRzX3Rvb2x0aXA9Rm9ybWF0IEFjdGl2ZSBFbGVtZW50cwotRm9ybWF0QWN0aXZlRWxlbWVudHNfaW1hZ2U9Ci1Gb3JtYXRBY3RpdmVFbGVtZW50c19kZXNjcmlwdGlvbj1Gb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi1PcGVuRmlsZUZyb21Tb3VyY2VfbGFiZWw9T3AmZW4gU2VsZWN0aW9uCi1PcGVuRmlsZUZyb21Tb3VyY2VfdG9vbHRpcD1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotT3BlbkZpbGVGcm9tU291cmNlX2ltYWdlPQotT3BlbkZpbGVGcm9tU291cmNlX2Rlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1TaG93VG9vbHRpcERlc2NfbGFiZWw9U2hvdyAmVG9vbHRpcCBEZXNjcmlwdGlvbgotU2hvd1Rvb2x0aXBEZXNjX3Rvb2x0aXA9RGlzcGxheXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50Ci1TaG93VG9vbHRpcERlc2NfaW1hZ2U9Ci1TaG93VG9vbHRpcERlc2NfZGVzY3JpcHRpb249RGlzcGxheXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9JkVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9Jk5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9JlByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsPSZSZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9kZXNjcmlwdGlvbj1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi1UZXh0X1NoaWZ0X1JpZ2h0X1VJXz1UZXh0IFNoaWZ0IFJpZ2h0Ci1UZXh0X1NoaWZ0X0xlZnRfVUlfPVRleHQgU2hpZnQgTGVmdAotCi1fNGNvbmNhdD0nJ3swfScnIGlzIG5vdCBhIHZhbGlkIGlucHV0Ci0jIyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgYXJlIGZvciAiWE1MLT5YTUwgU291cmNlLT5YTUwgU3R5bGUiIFByZWZlcmVuY2VzLCAiV2ViIFRvb2xzLT5Tb3VyY2UtPkhUTUwgU3R5bGUiIFByZWZlcmVuY2VzLCBhbmQgIldlYiBUb29scy0+U291cmNlLT5KYXZhU2NyaXB0IFN0eWxlIiBQcmVmZXJlbmNlcwotQ29udGVudF90eXBlX19VSV89Q28mbnRlbnQgdHlwZToKLUZvcmVncm91bmRfVUlfPSZGb3JlZ3JvdW5kOgotQmFja2dyb3VuZF9VSV89JkJhY2tncm91bmQ6Ci1Cb2xkX1VJXz1CJm9sZAotSXRhbGljc19VST1JdGFsaWNzCi1SZXN0b3JlX0RlZmF1bHRfVUlfPSZSZXN0b3JlIERlZmF1bHQKLVNhbXBsZV90ZXh0X19VSV89JlNhbXBsZSB0ZXh0OgotIyMKLUFkZEJyZWFrcG9pbnRfbGFiZWw9QWRkICZCcmVha3BvaW50Ci1BZGRCcmVha3BvaW50X3Rvb2x0aXA9QWRkIEJyZWFrcG9pbnQKLUFkZEJyZWFrcG9pbnRfZGVzY3JpcHRpb249QWRkIEJyZWFrcG9pbnQKLUFkZEJyZWFrcG9pbnRfZXJyb3JfZGlhbG9nX3RpdGxlPUFkZCBCcmVha3BvaW50Ci1BZGRCcmVha3BvaW50X2Vycm9yX2RpYWxvZ19tZXNzYWdlPUNhbm5vdCBhZGQgYnJlYWtwb2ludAotIyMKLVRvZ2dsZUJyZWFrcG9pbnRfbGFiZWw9VG9nZ2xlIEJyZWFrcG9pbnQKLVRvZ2dsZUJyZWFrcG9pbnRfdG9vbHRpcD1Ub2dnbGUgQnJlYWtwb2ludAotVG9nZ2xlQnJlYWtwb2ludF9kZXNjcmlwdGlvbj1Ub2dnbGUgQnJlYWtwb2ludAotIyMKLUVuYWJsZUJyZWFrcG9pbnRfbGFiZWw9RW5hYmxlIEJyZWFrcG9pbnQKLUVuYWJsZUJyZWFrcG9pbnRfdG9vbHRpcD1FbmFibGUgQnJlYWtwb2ludAotRW5hYmxlQnJlYWtwb2ludF9kZXNjcmlwdGlvbj1FbmFibGUgQnJlYWtwb2ludAotIyMKLURpc2FibGVCcmVha3BvaW50X2xhYmVsPURpc2FibGUgQnJlYWtwb2ludAotRGlzYWJsZUJyZWFrcG9pbnRfdG9vbHRpcD1EaXNhYmxlIEJyZWFrcG9pbnQKLURpc2FibGVCcmVha3BvaW50X2Rlc2NyaXB0aW9uPURpc2FibGUgQnJlYWtwb2ludAotIyMKLU1hbmFnZUJyZWFrcG9pbnRzX2FkZF9sYWJlbD1BZGQgJkJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX3JlbW92ZV9sYWJlbD1SZW1vdmUgQnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfdG9vbHRpcD1BZGQvUmVtb3ZlIEJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX2FkZGluZ190aXRsZTE9QWRkIEJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX2FkZGluZ19tZXNzYWdlMT1DYW5ub3QgYWRkIGJyZWFrcG9pbnQKLQotQWJzdHJhY3RDb2xvclBhZ2VEZXNjcmlwdGlvbj1DdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgYnkgc2VsZWN0aW5nIHRoZSB0eXBlIG9mIHRleHQgd2hvc2Ugc3R5bGUgeW91IHdhbnQgdG8gY3VzdG9taXplIGZyb20gZWl0aGVyIHRoZSBjb21ibyBib3ggb3IgdGhlIHNhbXBsZSB0ZXh0IGFyZWEKLSMjCi1FZGl0b3JNb2RlbFV0aWxfMD1tb2RlbCBpbiBpbnZhbGlkIHN0YXRlCi1FZGl0b3JNb2RlbFV0aWxfMT1UaGVyZSB3YXMgYSBwcm9ibGVtIGFkZGluZyBhZGFwdGVyIGZhY3RvcmllcwotCi0jIHdlYiBjb250ZW50IHNldHRpbmdzCi1VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzE9JkRvY3VtZW50IHR5cGU6Ci1VSV9DU1NfcHJvZmlsZV9fXzI9JkNTUyBwcm9maWxlOgotVUlfVGFyZ2V0X0RldmljZV9fXzM9JlRhcmdldCBkZXZpY2U6Ci0KLUVkaXRvcl9Ub2dnbGVJbnNlcnRNb2RlX2xhYmVsPVNtYSZydCBJbnNlcnQgTW9kZQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIFdvcmtiZW5jaCBtZW51IGJhcgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUV4cGFuZFNlbGVjdGlvblRvTWVudV9sYWJlbD1FJnhwYW5kIFNlbGVjdGlvbiBUbwotU291cmNlTWVudV9sYWJlbD0mU291cmNlCi0jCi1GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wPUN1cnJlbnQgc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gYSBzZWFyY2hhYmxlIGVsZW1lbnQKLVJlbW92ZUFjdGlvbl8wPVJlbW92ZSBQcm9wZXJ0eQotU2hvd1Byb3BlcnRpZXNBY3Rpb25fMD1QJnJvcGVydGllcwotQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzA9Q29sbGFwc2UgQWxsCi1Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMT1MaW5rIHdpdGggRWRpdG9yCi1BYnN0cmFjdE9wZW5Pbl8wPUN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBhIGZpbGUKLUZvcm1hdEFjdGlvbkRlbGVnYXRlX2pvYk5hbWU9Rm9ybWF0dGluZyBkb2N1bWVudHMKLUZvcm1hdEFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZT1FeGNlcHRpb25zIG9jY3VycmVkIHdoaWxlIGZvcm1hdHRpbmcgZG9jdW1lbnRzCi1Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV8zPUZvcm1hdHRpbmcgezB9Ci1Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80PUV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBmb3JtYXR0aW5nIGRvY3VtZW50IHswfQotRm9ybWF0QWN0aW9uRGVsZWdhdGVfNT1NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBmb3JtYXR0aW5nIGRvY3VtZW50IHswfQotVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYl8wPVJlYWQtT25seSB0ZXh0IHN0eWxlCi1UcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiXzE9UmVhZC1Pbmx5IGNvbnRyYXN0IHBlcmNlbnRhZ2U6Ci1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzI9TWF0Y2hpbmcgYnJhY2tldHMgaGlnaGxpZ2h0Ci1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzY9VGhlIGZvbGxvd2luZyBwcmVmZXJlbmNlcyBhcHBseSB0byB0aGUgSFRNTCwgSlNQLCBYTUwsIGFuZCBvdGhlciBzb3VyY2UgZWRpdG9ycy4KLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjA9SGlnaGxpZ2h0ICZtYXRjaGluZyBicmFja2V0cwotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMz1BcHBlYXJhbmNlIGNvJmxvciBvcHRpb25zOgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yND1DJm9sb3I6Ci1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzMwPSZSZXBvcnQgcHJvYmxlbXMgYXMgeW91IHR5cGUKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzc9RW1wdHkgaW5wdXQKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzg9aXMgbm90IGEgdmFsaWQgaW5wdXQuCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM5PUluZm9ybSB3aGVuIHVuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSBpcyBpbiBlZGl0b3IKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDA9QWxzbyBzZWUgdGhlIDxhPicnezB9Jyc8L2E+IHByZWZlcmVuY2VzLgotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMD1Mb3cKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE9Tm9ybWFsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yPUhpZ2gKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzM9Ti9BCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl81PVRhc2sgVGFnCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl82PVRhZzoKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzc9UHJpb3JpdHk6Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xMj1UYWcKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzEzPVByaW9yaXR5Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xND1OZXcuLi4KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE1PUVkaXQuLi4KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE2PVJlbW92ZQotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTc9U2VsZWN0IEFsbAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTg9RGVzZWxlY3QgQWxsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xOT1Ob3RlOiB0YWdzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMD1UYXNrIFRhZ3MKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzIyPVRhc2sgVGFncyBTZXR0aW5ncyBDaGFuZ2VkCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMz1UaGUgdGFzayB0YWdzIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4gIE1ha2UgdGhlc2UgY2hhbmdlcyBlZmZlY3RpdmUgbm93PwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjQ9WWVzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNT1ObwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjY9Q2FuY2VsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNz1TY2FubmluZyBmaWxlcyBmb3IgdGFza3MKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzI4PWRldGVjdGlvbiBhYm9ydGVkCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yOT1kZXRlY3Rpb24gY29tcGxldGVkCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMD1kZXRlY3Rpb24gZW5jb3VudGVyZWQgZXJyb3JzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMT1FbmFibGUgc2VhcmNoaW5nIGZvciBUYXNrIFRhZ3MKLVRhc2tUYWdQcmVmZXJlbmNlUGFnZV8zMj1DbGVhbiBhbmQgcmVkZXRlY3QgVGFza3MKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzPVRhZ3MgaW4gY29tbWVudHMgaW5kaWNhdGluZyBUYXNrczoKLVRhc2tUYWdFeGNsdXNpb25UYWJfMDE9RmlsdGVycwotVGFza1RhZ0V4Y2x1c2lvblRhYl8wMj1TY2FuIHRoZSBzZWxlY3RlZCBDb250ZW50IFR5cGVzOgotVGFza1RhZ0V4Y2x1c2lvblRhYl8wMz1BZmZlY3RlZCBDb250ZW50IFR5cGVzOgotCi1Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAxPVByb2plY3QgU3BlY2lmaWMgQ29uZmlndXJhdGlvbgotUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMj1TZWxlY3QgdGhlIHByb2plY3QgdG8gY29uZmlndXJlOgotCi1GaWxlUHJlZmVyZW5jZVBhZ2VfMD1FeHBhbmQgdGhlIHRyZWUgdG8gZWRpdCBwcmVmZXJlbmNlcyBmb3IgYSBzcGVjaWZpYyBjb250ZW50IHR5cGUuCi1Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbF8wPU5vIGNvcnJlY3Rpb25zIGF2YWlsYWJsZQotVG9nZ2xlQnJlYWtwb2ludEFjdGlvbl8wPVRvZ2dsZSAmQnJlYWtwb2ludHMKLU1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMD0mRW5hYmxlIEJyZWFrcG9pbnRzCi1NYW5hZ2VCcmVha3BvaW50QWN0aW9uXzE9JkRpc2FibGUgQnJlYWtwb2ludHMKLUVkaXRCcmVha3BvaW50QWN0aW9uXzA9QnJlYWtwb2ludCAmUHJvcGVydGllcy4uLgotIyMgVXNlZCBpbiBTdHJ1Y3R1cmVkIFRleHQgRWRpdG9yIFByZWZlcmVuY2UgUGFnZSAvIEhvdmVycyBUYWIKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfdGl0bGU9SG92ZXJzCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2hvdmVyUHJlZmVyZW5jZXM9VGV4dCAmSG92ZXIga2V5IG1vZGlmaWVyIHByZWZlcmVuY2VzOgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9rZXlNb2RpZmllcj1QcmVzc2VkIGtleSAmbW9kaWZpZXIgd2hpbGUgaG92ZXJpbmc6Ci1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2Rlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWQ9TW9kaWZpZXIgJyd7MH0nJyBpcyBub3QgdmFsaWQuCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVySXNOb3RWYWxpZEZvckhvdmVyPU1vZGlmaWVyICcnezB9JycgZm9yICcnezF9JycgaG92ZXIgaXMgbm90IHZhbGlkLgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kdXBsaWNhdGVNb2RpZmllcj0nJ3swfScnIGhvdmVyIHVzZXMgdGhlIHNhbWUgbW9kaWZpZXIgYXMgJyd7MX0nJyBob3Zlci4KLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfbmFtZUNvbHVtblRpdGxlPVRleHQgSG92ZXIgTmFtZQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllckNvbHVtblRpdGxlPVByZXNzZWQgS2V5IE1vZGlmaWVyIFdoaWxlIEhvdmVyaW5nCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2RlbGltaXRlcj0rCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyQW5kRGVsaW1pdGVyPVwgKyB7MH0gKwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnRNb2RpZmllckFuZERlbGltaXRlcj1cIHswfSArCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyPVwgKyB7MH0KLWNvbWJpbmF0aW9uSG92ZXJfbGFiZWw9Q29tYmluZWQgSG92ZXIKLWNvbWJpbmF0aW9uSG92ZXJfZGVzYz1UcmllcyB0aGUgaG92ZXJzIGluIHRoZSBzZXF1ZW5jZSBsaXN0ZWQgaW4gdGhlIHRhYmxlIGJlbG93IHRoaXMgb25lIGFuZCB1c2VzIHRoZSBvbmUgd2hpY2ggZml0cyBiZXN0IGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCBhbmQgdGhlIGN1cnJlbnQgY29udGV4dC4KLXByb2JsZW1Ib3Zlcl9sYWJlbD1Qcm9ibGVtIERlc2NyaXB0aW9uCi1wcm9ibGVtSG92ZXJfZGVzYz1TaG93cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlbGVjdGVkIHByb2JsZW0uCi1kb2N1bWVudGF0aW9uSG92ZXJfbGFiZWw9RG9jdW1lbnRhdGlvbiBEZXNjcmlwdGlvbgotZG9jdW1lbnRhdGlvbkhvdmVyX2Rlc2M9U2hvd3MgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQuCi1hbm5vdGF0aW9uSG92ZXJfbGFiZWw9QW5ub3RhdGlvbiBEZXNjcmlwdGlvbgotYW5ub3RhdGlvbkhvdmVyX2Rlc2M9U2hvd3MgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uLgotRWRpdFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZXNBY3Rpb25fMD1FZGl0b3IgUHJlZmVyZW5jZXMKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMD1BcHBlYXJhbmNlCi1QcmVmZXJlbmNlTWFuYWdlcl8wPU9yaWdpbmFsIEVycm9yOgotCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IE9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLVNob3dWaWV3X2Vycm9yVGl0bGU9UHJvYmxlbXMgU2hvd2luZyBWaWV3Ci1wcm9jX2RpcnR5X3JlZ2lvbnNfMCA9IFByb2Nlc3NpbmcgRGlydHkgUmVnaW9ucwotCi10ZXh0SG92ZXJNYWtlU3RpY2t5SGludD1QcmVzcyAnJ3swfScnIGZvciBmb2N1cy4KLQotIyMgRW5jb2RpbmcKLUVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMD1FbmNvZGluZyBzZXR0aW5ncyBmb3IgV2ViIGFuZCBYTUwgZmlsZXM6Ci1FbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzE9VXNlIDMgYnl0ZSBCT00gKEJ5dGUgT3JkZXIgTWFyaykgd2hlbiBzYXZpbmcgVVRGLTggZW5jb2RlZCBmaWxlcwotYnVzeT1idXN5Ci1jYXJldF91cGRhdGU9Y2FyZXQgdXBkYXRlCi1FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wPUV4cGFuZCB0aGUgdHJlZSB0byBlZGl0IHByZWZlcmVuY2VzIGZvciBhIHNwZWNpZmljIGNvbnRlbnQgdHlwZS4KLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzA9U2VsZWN0aW9uIEluZm9ybWF0aW9uOgotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMj1QYXJ0aXRpb25zCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8zPUlUZXh0UmVnaW9ucwotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fND1TdHJ1Y3R1cmVkIE1vZGVsIENvbnRlbnQtVHlwZTogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV81PU1vZGVsIEhhbmRsZXI6IAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNj1Eb2N1bWVudCBDbGFzczogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV83PURvY3VtZW50IFByb3ZpZGVyIENsYXNzOiAKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzg9UGFydGl0aW9uaW5nczoKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzk9U3RhcnQKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEwPUxlbmd0aAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTE9VHlwZQotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTI9SW5wdXQgVHlwZTogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMz1QYXJ0aXRpb25lcjogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xND1TZWxlY3Rpb24KLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE1PVN0YXJ0Ci1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNj1MZW5ndGgKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE3PVRleHQgTGVuZ3RoCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xOD1Db250ZXh0Ci1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xOT1Xb3JrYmVuY2ggU2VsZWN0aW9uCi0KLVN0cnVjdHVyZWRUZXh0RWRpdG9yXzA9VW5zdXBwb3J0ZWQgY29udGVudCB0eXBlIHdhcm5pbmcKLVVua25vd25Db250ZW50VHlwZURpYWxvZ18wPVVuc3VwcG9ydGVkIENvbnRlbnQgVHlwZQotVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nXzE9RG8gbm90IHNob3cgdGhpcyBtZXNzYWdlIGFnYWluCi1Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMj1VbnN1cHBvcnRlZCBjb250ZW50IHR5cGUgaW4gZWRpdG9yLlxuVG8gYXNzb2NpYXRlIGZpbGUgZXh0ZW5zaW9uIHdpdGggYSBzdXBwb3J0ZWQgY29udGVudCB0eXBlLFxucGxlYXNlIHNlZSA8YT5Db250ZW50IFR5cGVzIFByZWZlcmVuY2UgUGFnZTwvYT4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIEJlbG93IGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSByZW1vdmVkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU2F2ZV9sYWJlbD0mU2F2ZQotQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW5fRVJST1JfPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIHJldHJpZXZpbmcgcmVzb3VyY2VzIGZvciB0aGUgc291cmNlIGVkaXRvci4gVGhlIEVjbGlwc2UgV29ya2JlbmNoIGluc3RhbGxhdGlvbiBtYXkgaGF2ZSBiZWVuIGNvcnJ1cHRlZC4KLSMjIHNhdmUgYXMgcHJvYmxlbXMgKG5leHQgdHdvKSBzaG91bGQgbWF0Y2ggd2hhdCBpcyBpbiB3b3JrYmVuY2gKLVByb2JsZW1zX0R1cmluZ19TYXZlX0FzX1VJXz1Qcm9ibGVtcyBEdXJpbmcgU2F2ZSBBcy4uLgotU2F2ZV9jb3VsZF9ub3RfYmVfY29tcGxldGVfVUlfPVNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZC4KLU1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JlbW92aW5nX3RpdGxlMT1SZW1vdmUgQnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfcmVtb3ZpbmdfbWVzc2FnZTE9Q2Fubm90IHJlbW92ZSBicmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZXRyaWV2aW5nX21lc3NhZ2U9UmV0cmlldmluZyBtYXJrZXJzIGZhaWxlZDoKLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlRGVzY3JpcHRpb249RW1iZWRkZWQgY29udGVudCB0eXBlXCdzIHNvdXJjZSBwcmVmZXJlbmNlcyB3aWxsIGJlIHVzZWQuIFNlbGVjdCB0aGUgZmlsZSB0eXBlIGZvciBjdXN0b21pemF0aW9uCi0jIFRoZSBmb2xsb3dpbmcgbGluZXMgY29waWVkIGZyb20gb3JnXGVjbGlwc2VcdWlcZWRpdG9yc1x0ZXh0XFRleHRFZGl0b3JNZXNzYWdlcy5wcm9wZXJ0aWVzIGluIG9yZy5lY2xpcHNlLnVpIHBsdWdpbgotRWRpdG9yX2Vycm9yX3NhdmVfbWVzc2FnZT1TYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIHswfQotRWRpdG9yX2Vycm9yX3NhdmVfdGl0bGU9UHJvYmxlbXMgRHVyaW5nIFNhdmUgQXMuLi4KLUVkaXRvcl93YXJuaW5nX3NhdmVfZGVsZXRlPVRoZSBvcmlnaW5hbCBmaWxlICcnezB9JycgaGFzIGJlZW4gZGVsZXRlZC4KLQotIyBhY3Rpb25zCi1QcmV2aW91c19hbm5vdGF0aW9uPVByZXZpb3VzIEFubm90YXRpb24KLU5leHRfYW5ub3RhdGlvbj1OZXh0IEFubm90YXRpb24KLSMgQW5ub3RhdGlvbiBUeXBlcwotQW5ub3RhdGlvblR5cGVzX0Vycm9ycz1FcnJvcnMKLUFubm90YXRpb25UeXBlc19XYXJuaW5ncz1XYXJuaW5ncwotQW5ub3RhdGlvblR5cGVzX1Rhc2tzPVRhc2tzCi1Bbm5vdGF0aW9uVHlwZXNfU2VhcmNoUmVzdWx0cz1TZWFyY2ggUmVzdWx0cwotQW5ub3RhdGlvblR5cGVzX0Jvb2ttYXJrcz1Cb29rbWFya3MKLUFubm90YXRpb25UeXBlc19PdGhlcnM9T3RoZXJzCi0KLUVkaXRvcl9Db252ZXJ0VG9XaW5kb3dzX2xhYmVsPSZXaW5kb3dzCi1FZGl0b3JfQ29udmVydFRvV2luZG93c190b29sdGlwPUNvbnZlcnRzIGxpbmUgZGVsaW1pdGVycyB0byBXaW5kb3dzCi1FZGl0b3JfQ29udmVydFRvV2luZG93c19pbWFnZT0KLUVkaXRvcl9Db252ZXJ0VG9XaW5kb3dzX2Rlc2NyaXB0aW9uPUNvbnZlcnRzIGxpbmUgZGVsaW1pdGVycyB0byBXaW5kb3dzCi0KLUVkaXRvcl9Db252ZXJ0VG9VTklYX2xhYmVsPSZVTklYCi1FZGl0b3JfQ29udmVydFRvVU5JWF90b29sdGlwPUNvbnZlcnRzIGxpbmUgZGVsaW1pdGVycyB0byBVTklYCi1FZGl0b3JfQ29udmVydFRvVU5JWF9pbWFnZT0KLUVkaXRvcl9Db252ZXJ0VG9VTklYX2Rlc2NyaXB0aW9uPUNvbnZlcnRzIGxpbmUgZGVsaW1pdGVycyB0byBVTklYCi0KLUVkaXRvcl9Db252ZXJ0VG9NYWNfbGFiZWw9Jk1hYwotRWRpdG9yX0NvbnZlcnRUb01hY190b29sdGlwPUNvbnZlcnRzIGxpbmUgZGVsaW1pdGVycyB0byBNYWMKLUVkaXRvcl9Db252ZXJ0VG9NYWNfaW1hZ2U9Ci1FZGl0b3JfQ29udmVydFRvTWFjX2Rlc2NyaXB0aW9uPUNvbnZlcnRzIGxpbmUgZGVsaW1pdGVycyB0byBNYWMKLUNvbnZlcnRMaW5lRGVsaW1pdGVyc01lbnVfbGFiZWw9Q28mbnZlcnQgTGluZSBEZWxpbWl0ZXJzIHRvCi1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9TyZjY3VycmVuY2VzIGluIEZpbGUKLQotQ29udmVydExpbmVEZWxpbWl0ZXJzVG9DUkxGQWN0aW9uRGVsZWdhdGVfam9iTmFtZT1Db252ZXJ0aW5nIGxpbmUgZGVsaW1pdGVycwotQ29udmVydExpbmVEZWxpbWl0ZXJzVG9DUkxGQWN0aW9uRGVsZWdhdGVfZXJyb3JTdGF0dXNNZXNzYWdlPUV4Y2VwdGlvbnMgb2NjdXJyZWQgd2hpbGUgY29udmVydGluZyBsaW5lIGRlbGltaXRlcnMKLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlXzM9Q29udmVydGluZyBsaW5lIGRlbGltaXRlcnMgZm9yIHswfQotQ29udmVydExpbmVEZWxpbWl0ZXJzVG9DUkxGQWN0aW9uRGVsZWdhdGVfND1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgY29udmVydGluZyBsaW5lIGRlbGltaXRlcnMgZm9yIGRvY3VtZW50IHswfQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9hbm5vdGF0aW9uUm9sbG92ZXI9JkVuYWJsZSBhbm5vdGF0aW9uIHJvbGwtb3ZlciAob24gbmV3IGVkaXRvcnMpCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX3Nob3dBZmZvcmRhbmNlPSZTaG93IGFmZm9yZGFuY2UgaW4gaG92ZXIgb24gaG93IHRvIG1ha2UgaXQgc3RpY2t5Ci1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2VuYWJsZWQ9JkVuYWJsZWQKLQotQmFzaWNGaW5kT2NjdXJyZW5jZXNBY3Rpb25fMD1yZWdpb24gbWF0Y2g6Ci1CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXJfMD1saW5lCi1OYXZpZ2F0aW9uUHJlZmVyZW5jZVRhYl8wPU1vZGlmaWVyICcnezB9JycgaXMgbm90IHZhbGlkLgotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8xPXswfSAtIDEgT2NjdXJyZW5jZSBpbiB7MX0KLUZpbGVNb2RlbFByb3ZpZGVyXzA9RXJyb3IgcmVsb2FkaW5nIHswfQotSkZhY2VOb2RlQWRhcHRlcl8wPVVwZGF0ZSBPdXRsaW5lCi0KLUNvbmZpZ3VyZVByb2plY3RTZXR0aW5ncz1Db25maWd1cmUgUHJvamVjdCBTcGVjaWZpYyBTZXR0aW5ncy4uLgotQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3M9Q29uZmlndXJlIFdvcmtzcGFjZSBTZXR0aW5ncy4uLgotRW5hYmxlUHJvamVjdFNldHRpbmdzPUVuYWJsZSBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzCi0KLUxvYWRpbmdSZWZlcmVuY2VkR3JhbW1hcnM9TG9hZGluZyByZWZlcmVuY2VkIGdyYW1tYXJzCi0KLSMjIEZvbGRpbmcKLUZvbGRpbmc9Rm9sZGluZwotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zPUVuYWJsZSAmZm9sZGluZwotUHJvamVjdGlvbl9Ub2dnbGVfbGFiZWw9ICZFbmFibGUgRm9sZGluZwotUHJvamVjdGlvbl9Ub2dnbGVfdG9vbHRpcD0gVG9nZ2xlcyBGb2xkaW5nCi1Qcm9qZWN0aW9uX1RvZ2dsZV9kZXNjcmlwdGlvbj0gVG9nZ2xlcyBmb2xkaW5nIGZvciB0aGUgY3VycmVudCBlZGl0b3IKLVByb2plY3Rpb25fVG9nZ2xlX2ltYWdlPQotUHJvamVjdGlvbl9FeHBhbmRBbGxfbGFiZWw9IEV4cGFuZCAmQWxsCi1Qcm9qZWN0aW9uX0V4cGFuZEFsbF90b29sdGlwPSBFeHBhbmRzIEFsbCBDb2xsYXBzZWQgUmVnaW9ucwotUHJvamVjdGlvbl9FeHBhbmRBbGxfZGVzY3JpcHRpb249IEV4cGFuZHMgYW55IGNvbGxhcHNlZCByZWdpb25zIGluIHRoZSBjdXJyZW50IGVkaXRvcgotUHJvamVjdGlvbl9FeHBhbmRBbGxfaW1hZ2U9Ci1Qcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2xhYmVsPSBDb2xsYXBzZSBBJmxsCi1Qcm9qZWN0aW9uX0NvbGxhcHNlQWxsX3Rvb2x0aXA9IENvbGxhcHNlcyBBbGwgRXhwYW5kZWQgUmVnaW9ucwotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9kZXNjcmlwdGlvbj0gQ29sbGFwc2UgYW55IGV4cGFuZGVkIHJlZ2lvbnMgaW4gdGhlIGN1cnJlbnQgZWRpdG9yCi1Qcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2ltYWdlPQotCi0jIyBUaGVzZSBhcmUgY29waWVkIGZyb20gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5FZGl0b3JNZXNzYWdlcy5wcm9wZXJ0aWVzCi0jIyBUaGV5IGFyZSBuZWVkZWQgdGVtcG9yYXJpbHkgdW50aWwgQ01WQyBkZWZlY3QgMjAzMTU4IC8gQnVnemlsbGEgZGVmZWN0IDIwMDU0IGlzIGZpeGVkCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX3Rvb2x0aXA9QWRkcyBhbmQgUmVtb3ZlcyBCb29rbWFya3MKLUVkaXRvcl9NYW5hZ2VCb29rbWFya3NfaW1hZ2U9Ci1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2Rlc2NyaXB0aW9uPUFkZHMgYW5kIHJlbW92ZXMgQm9va21hcmtzCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2FkZF9sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX3JlbW92ZV9sYWJlbD1SZW1vdmUgQm9vJmttYXJrCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2FkZF9kaWFsb2dfdGl0bGU9QWRkIEJvb2ttYXJrCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2FkZF9kaWFsb2dfbWVzc2FnZT1FbnRlciBCb29rbWFyayBuYW1lCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2Vycm9yX2RpYWxvZ190aXRsZT1NYW5hZ2luZyBCb29rbWFya3MKLUVkaXRvcl9NYW5hZ2VCb29rbWFya3NfZXJyb3JfZGlhbG9nX21lc3NhZ2U9UHJvYmxlbXMgbWFuYWdpbmcgYm9va21hcmtzCi0KLUVkaXRvcl9NYW5hZ2VUYXNrc190b29sdGlwPUFkZHMgYW5kIFJlbW92ZXMgVGFza3MKLUVkaXRvcl9NYW5hZ2VUYXNrc19pbWFnZT0KLUVkaXRvcl9NYW5hZ2VUYXNrc19kZXNjcmlwdGlvbj1BZGRzIGFuZCByZW1vdmVzIFRhc2tzCi1FZGl0b3JfTWFuYWdlVGFza3NfYWRkX2xhYmVsPUFkZCAmVGFzay4uLgotRWRpdG9yX01hbmFnZVRhc2tzX3JlbW92ZV9sYWJlbD1SZW1vdmUgJlRhc2sKLUVkaXRvcl9NYW5hZ2VUYXNrc19hZGRfZGlhbG9nX3RpdGxlPUFkZCBUYXNrCi1FZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ19tZXNzYWdlPUVudGVyIFRhc2sgZGVzY3JpcHRpb24KLUVkaXRvcl9NYW5hZ2VUYXNrc19lcnJvcl9kaWFsb2dfdGl0bGU9TWFuYWdpbmcgVGFza3MKLUVkaXRvcl9NYW5hZ2VUYXNrc19lcnJvcl9kaWFsb2dfbWVzc2FnZT1Qcm9ibGVtcyBtYW5hZ2luZyB0YXNrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIEFib3ZlIGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSByZW1vdmVkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1TdHlsZWRUZXh0Q29sb3JQaWNrZXJfMD1QaWNrIGEgY29sb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TaG93Vmlld0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1Nob3dWaWV3QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDNmMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1Nob3dWaWV3QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogU3VyZmFjZXMgYSBWaWV3LgotICogCi0gKiBAYXV0aG9yIE5pdGluIERhaHlhYmhhaQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2hvd1ZpZXdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQlzdXBlcih0ZXh0LCBpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlzdXBlcih0ZXh0LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Vmlld0lEKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCQlzaG93VmlldygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnJ1bldpdGhFdmVudChldmVudCk7Ci0JCXNob3dWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93VmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXBhZ2Uuc2hvd1ZpZXcoZ2V0Vmlld0lEKCkpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwgU1NFVUlNZXNzYWdlcy5TaG93Vmlld19lcnJvclRpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0b3JhZ2VNb2RlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RvcmFnZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2Y2MwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RvcmFnZU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkZpbGVEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRSZWFkZXJDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuQnJlYWtwb2ludFJ1bGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvck1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBBIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyIHRoYXQgaXMgSVN0cnVjdHVyZWRNb2RlbCBhd2FyZQotICovCi1wdWJsaWMgY2xhc3MgU3RvcmFnZU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgY2xhc3MgSW50ZXJuYWxFbGVtZW50U3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50U3RhdGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZDogIiArICgoSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyB3ZSBqdXN0IGZvcndhcmQgdGhlIGV2ZW50Ci0JCQlTdG9yYWdlTW9kZWxQcm92aWRlci50aGlzLmZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnRSZXBsYWNlZChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBlbGVtZW50Q29udGVudFJlcGxhY2VkOiAiICsgKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJU3RvcmFnZUluZm8gaW5mbyA9IChTdG9yYWdlSW5mbykgZ2V0RWxlbWVudEluZm8oZWxlbWVudCk7Ci0KLQkJCS8qKgotCQkJICogRm9yY2UgYSByZWxvYWQgb2YgdGhlIG1hcmtlcnMgaW50byBhbm5vdGF0aW9ucyBzaW5jZSB0aGVpcgotCQkJICogcHJldmlvdXMgUG9zaXRpb25zIGhhdmUgYmVlbiBkZWxldGVkLiBEaXNjb25uZWN0aW5nIGFuZAotCQkJICogcmVjb25uZWN0aW5nIGZvcmNlcyBhIGNhbGwgdG8gdGhlIHByaXZhdGUgY2F0Y2h1cFdpdGhNYXJrZXJzCi0JCQkgKiBtZXRob2QuCi0JCQkgKi8KLQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5mTW9kZWwgIT0gbnVsbCkgewotCQkJCWluZm8uZk1vZGVsLmRpc2Nvbm5lY3QoaW5mby5mRG9jdW1lbnQpOwotCQkJfQotCi0JCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgaW5uZXJkb2N1bWVudCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIHVwZGF0ZSBkb2N1bWVudCBmcm9tIGlucHV0J3MgY29udGVudHMKLQkJCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcihjYWxjdWxhdGVJRCgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCksIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKCgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldENvbnRlbnRzKCkpKTsKLQkJCQlyZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQotCQkJCWlubmVyZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgaW5mby5mRG9jdW1lbnQ7Ci0KLQkJCQlpbnQgb3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSBpbm5lcmRvY3VtZW50LmdldExlbmd0aCgpOwotCi0JCQkJU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlpbnQgYnVmZmVyU2l6ZSA9IDIwNDg7Ci0JCQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOwotCQkJCWludCBuUmVhZCA9IDA7Ci0JCQkJYm9vbGVhbiBlb2YgPSBmYWxzZTsKLQkJCQl3aGlsZSAoIWVvZikgewotCQkJCQluUmVhZCA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7Ci0JCQkJCWlmIChuUmVhZCA9PSAtMSkgewotCQkJCQkJZW9mID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBuUmVhZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaW5uZXJkb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCBvcmlnaW5hbExlbmd0aFRvUmVwbGFjZSwgc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCksIHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJLy8gd291bGQgYmUgaGlnaGx5IHVudXN1YWwKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmb3J3YXJkIHRoZSBldmVudAotCQkJaWYgKGluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCQlpbmZvLmZDYW5CZVNhdmVkID0gZmFsc2U7Ci0JCQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhlbGVtZW50LCBpbmZvKTsKLQkJCX0KLQkJCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGVsZW1lbnQpOwotCQkJZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChlbGVtZW50LCBmYWxzZSk7Ci0KLQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5mTW9kZWwgIT0gbnVsbCkgewotCQkJCWluZm8uZk1vZGVsLmNvbm5lY3QoaW5mby5mRG9jdW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudERlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZWxlbWVudERlbGV0ZWQ6ICIgKyAoKElFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gd2UganVzdCBmb3J3YXJkIHRoZSBldmVudAotCQkJU3RvcmFnZU1vZGVsUHJvdmlkZXIudGhpcy5maXJlRWxlbWVudERlbGV0ZWQoZWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJaWYgKGRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBlbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQ6ICIgKyAoKElFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0TmFtZSgpICsgIiAoIiArIGlzRGlydHkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJLy8gd2UganVzdCBmb3J3YXJkIHRoZSBldmVudAotCQkJU3RvcmFnZU1vZGVsUHJvdmlkZXIudGhpcy5maXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKGVsZW1lbnQsIGlzRGlydHkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudE1vdmVkKE9iamVjdCBvcmlnaW5hbEVsZW1lbnQsIE9iamVjdCBtb3ZlZEVsZW1lbnQpIHsKLQkJCWlmIChkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZWxlbWVudE1vdmVkICIgKyBvcmlnaW5hbEVsZW1lbnQgKyAiIC0tPiAiICsgbW92ZWRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkvLyB3ZSBqdXN0IGZvcndhcmQgdGhlIGV2ZW50Ci0JCQlTdG9yYWdlTW9kZWxQcm92aWRlci50aGlzLmZpcmVFbGVtZW50TW92ZWQob3JpZ2luYWxFbGVtZW50LCBtb3ZlZEVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdGlvbiBvZiBpbmZvIHRoYXQgZ29lcyB3aXRoIGEgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNb2RlbEluZm8gewotCQlwdWJsaWMgSUVkaXRvcklucHV0IGZFbGVtZW50OwotCQlwdWJsaWMgYm9vbGVhbiBmU2hvdWxkUmVsZWFzZU9uSW5mb0Rpc3Bvc2U7Ci0JCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGZTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQkJcHVibGljIE1vZGVsSW5mbyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgSUVkaXRvcklucHV0IGVsZW1lbnQsIGJvb2xlYW4gc2VsZkNyZWF0ZWQpIHsKLQkJCWZFbGVtZW50ID0gZWxlbWVudDsKLQkJCWZTdHJ1Y3R1cmVkTW9kZWwgPSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCQlmU2hvdWxkUmVsZWFzZU9uSW5mb0Rpc3Bvc2UgPSBzZWxmQ3JlYXRlZDsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdG9yYWdlbW9kZWxwcm92aWRlci9lbGVtZW50c3RhdGVsaXN0ZW5lciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdPcGVyYXRpb25zID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RvcmFnZW1vZGVscHJvdmlkZXIvb3BlcmF0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBTdG9yYWdlTW9kZWxQcm92aWRlciBmSW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3RvcmFnZU1vZGVsUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkKLQkJCWZJbnN0YW5jZSA9IG5ldyBTdG9yYWdlTW9kZWxQcm92aWRlcigpOwotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIGZJbnRlcm5hbExpc3RlbmVyOwotCS8qKiBJU3RydWN0dXJlZE1vZGVsIGluZm9ybWF0aW9uIG9mIGFsbCBjb25uZWN0ZWQgZWxlbWVudHMgKi8KLQlwcml2YXRlIE1hcCBmTW9kZWxJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGJvb2xlYW4gZlJldXNlTW9kZWxEb2N1bWVudCA9IHRydWU7Ci0KLQlwcml2YXRlIFN0b3JhZ2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbEVsZW1lbnRTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JU3RyaW5nIGNhbGN1bGF0ZUJhc2VMb2NhdGlvbihJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJU3RvcmFnZSBzdG9yYWdlID0gaW5wdXQuZ2V0U3RvcmFnZSgpOwotCQkJaWYgKHN0b3JhZ2UgIT0gbnVsbCkgewotCQkJCUlQYXRoIHN0b3JhZ2VQYXRoID0gc3RvcmFnZS5nZXRGdWxsUGF0aCgpOwotCQkJCVN0cmluZyBuYW1lID0gc3RvcmFnZS5nZXROYW1lKCk7Ci0JCQkJaWYgKHN0b3JhZ2VQYXRoICE9IG51bGwpIHsKLQkJCQkJLy8gSWYgdGhleSBhcmUgZGlmZmVyZW50LCB0aGUgSVN0b3JhZ2UgY29udHJhY3QgaXMgbm90Ci0JCQkJCS8vIGJlaW5nIGhvbm9yZWQKLQkJCQkJLy8gKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzA5OCkuCi0JCQkJCS8vIEZhdm9yIHRoZSBuYW1lLgotCQkJCQlpZiAoIXN0b3JhZ2VQYXRoLmxhc3RTZWdtZW50KCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlJUGF0aCB3b3JraW5nUGF0aCA9IHN0b3JhZ2VQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCQkJCQlsb2NhdGlvbiA9IHdvcmtpbmdQYXRoLmFwcGVuZChuYW1lKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbG9jYXRpb24gPSBzdG9yYWdlUGF0aC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJCQlsb2NhdGlvbiA9IG5hbWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJCWxvY2F0aW9uID0gaW5wdXQuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgY2FsY3VsYXRlSUQoSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkvKioKLQkJICogVHlwaWNhbGx5IENWUyB3aWxsIHJldHVybiBhIHBhdGggb2YgImZpbGVuYW1lLmV4dCIgYW5kIHRoZSBpbnB1dCdzCi0JCSAqIG5hbWUgd2lsbCBiZSAiZmlsZW5hbWUuZXh0IHZlcnNpb24iLiBUaGUgcGF0aCBtdXN0IGJlIHVzZWQgdG8gbG9hZAotCQkgKiB0aGUgbW9kZWwgc28gdGhhdCB0aGUgc3VmZml4IHdpbGwgYmUgYXZhaWxhYmxlIHRvIGNvbXB1dGUgdGhlCi0JCSAqIGNvbnRlbnRUeXBlIHByb3Blcmx5LiBUaGUgZWRpdG9yIGlucHV0IG5hbWUgY2FuIHRoZW4gYmUgc2V0IGFzIHRoZQotCQkgKiBiYXNlIGxvY2F0aW9uIGZvciBkaXNwbGF5IG9uIHRoZSBlZGl0b3IgdGl0bGUgYmFyLgotCQkgKiAKLQkJICovCi0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJYm9vbGVhbiBhZGRIYXNoID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJU3RvcmFnZSBzdG9yYWdlID0gaW5wdXQuZ2V0U3RvcmFnZSgpOwotCQkJaWYgKHN0b3JhZ2UgIT0gbnVsbCkgewotCQkJCUlQYXRoIHN0b3JhZ2VQYXRoID0gc3RvcmFnZS5nZXRGdWxsUGF0aCgpOwotCQkJCVN0cmluZyBuYW1lID0gc3RvcmFnZS5nZXROYW1lKCk7Ci0JCQkJLy8gaWYgZWl0aGVyIHRoZSBuYW1lIG9yIHN0b3JhZ2UgcGF0aCBhcmUgbnVsbCBvciB0aGV5IGFyZQotCQkJCS8vIGlkZW50aWNhbCwgYWRkIGEgaGFzaCB0byBpdCB0byBndWFyYW50ZWUgdW5pcXVlbmVzcwotCQkJCWFkZEhhc2ggPSBzdG9yYWdlUGF0aCA9PSBudWxsIHx8IHN0b3JhZ2VQYXRoLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpOwotCQkJCWlmIChzdG9yYWdlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCS8vIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgdGhlIElTdG9yYWdlIGNvbnRyYWN0IGlzIG5vdAotCQkJCQkvLyBiZWluZyBob25vcmVkCi0JCQkJCS8vIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMwOTgpLgotCQkJCQkvLyBGYXZvciB0aGUgbmFtZS4KLQkJCQkJaWYgKCFzdG9yYWdlUGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscyhuYW1lKSkgewotCQkJCQkJSVBhdGggd29ya2luZ1BhdGggPSBzdG9yYWdlUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQkJCQkJcGF0aCA9IHdvcmtpbmdQYXRoLmFwcGVuZChuYW1lKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcGF0aCA9IHN0b3JhZ2VQYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJcGF0aCA9IG5hbWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChwYXRoID09IG51bGwpCi0JCQkJcGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGFkZEhhc2gpCi0JCQlwYXRoID0gaW5wdXQuaGFzaENvZGUoKSArIHBhdGg7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIGNhblNhdmVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb25Nb2RlbCBjcmVhdGVBbm5vdGF0aW9uTW9kZWwoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVBbm5vdGF0aW9uTW9kZWwgZm9yICIgKyAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZUFubm90YXRpb25Nb2RlbCBmb3IgIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQlJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0ID0gKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgY29udGVudFR5cGUgPSAoZ2V0TW9kZWwoaW5wdXQpICE9IG51bGwgPyBnZXRNb2RlbChpbnB1dCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkgOiBudWxsKTsKLQkJCVN0cmluZyBleHQgPSBCcmVha3BvaW50UnVsZXJBY3Rpb24uZ2V0RmlsZUV4dGVuc2lvbigoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJCUlSZXNvdXJjZSByZXMgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UoaW5wdXQsIGNvbnRlbnRUeXBlLCBleHQpOwotCQkJU3RyaW5nIGlkID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJaWYgKGlucHV0LmdldFN0b3JhZ2UoKSAhPSBudWxsICYmIGlucHV0LmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpICE9IG51bGwpIHsKLQkJCQlpZCA9IGlucHV0LmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQkvLyB3ZSBjYW4gb25seSBjcmVhdGUgYSByZXNvdXJjZSBtYXJrZXIgYW5ub3RhdGlvbm1vZGVsIG9mZiBvZiBhCi0JCQkvLyB2YWxpZCByZXNvdXJjZQotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCW1vZGVsID0gbmV3IFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChyZXMsIGlkKTsKLQkJCWVsc2UKLQkJCQltb2RlbCA9IG5ldyBBbm5vdGF0aW9uTW9kZWwoKTsKLQkJfQotCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJbW9kZWwgPSBzdXBlci5jcmVhdGVBbm5vdGF0aW9uTW9kZWwoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KQotCQkJCXRyeSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZURvY3VtZW50IGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVEb2N1bWVudCBmb3IgIiArIGVsZW1lbnQgKyAiKGV4Y2VwdGlvbiBjYXVnaHQpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZURvY3VtZW50IGZvciAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIFRoZSBmb2xsb3dpbmcgaXMgbGFyZ2VseSBjb3BpZWQgZnJvbSBGaWxlTW9kZWxQcm92aWRlcgotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvcklucHV0KSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgSURvY3VtZW50IGZvciB0aGUgZWxlbWVudDsgc2hvdWxkIGFsd2F5cyByZWZsZWN0Ci0JCQkvLyB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlCi0JCQlNb2RlbEluZm8gaW5mbyA9IGdldE1vZGVsSW5mb0ZvcigoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBjb3JyZXNwb25kaW5nIG1vZGVsIGluZm8gZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGluZm8uZlN0cnVjdHVyZWRNb2RlbDsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmUmV1c2VNb2RlbERvY3VtZW50ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJCVJlYWRlciByZWFkZXIgPSBudWxsOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGlubmVyZG9jdW1lbnQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJLy8gdXBkYXRlIGRvY3VtZW50IGZyb20gaW5wdXQncyBjb250ZW50cwotCi0JCQkJCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcihjYWxjdWxhdGVJRCgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCksIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKCgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldENvbnRlbnRzKCkpKTsKLQkJCQkJCXJlYWRlciA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRDb2RlZFJlYWRlcigpOwotCi0JCQkJCQlpbm5lcmRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJCWludCBvcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IGlubmVyZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBUT0RPX2Z1dHVyZTogd2UgY291bGQgaW1wbGVtZW50IHdpdGggc2VxdWVudGlhbAotCQkJCQkJICogcmV3cml0ZSwgaWYgd2UgZG9uJ3QgcGlja3VwIGF1dG9tYXRpY2FsbHkgZnJvbQotCQkJCQkJICogRmlsZUJ1ZmZlciBzdXBwb3J0LCBzbyBub3Qgc28gbXVjaCBoYXMgdG8gYmUgcHVsbGVkCi0JCQkJCQkgKiBpbnRvIG1lbW9yeSAoYXMgYW4gZXh0cmEgYmlnIHN0cmluZyksIGJ1dCB3ZSBuZWVkCi0JCQkJCQkgKiB0byBjYXJyeSB0aGF0IEFQSSB0aHJvdWdoIHNvIHRoYXQgU3RydWN0dXJlZE1vZGVsCi0JCQkJCQkgKiBpcyBub3Qgbm90aWZpZWQgdW50aWwgZG9uZS4KLQkJCQkJCSAqLwotCi0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LnN0YXJ0U2VxdWVudGlhbFJld3JpdGUodHJ1ZSk7Ci0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsCi0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LmdldExlbmd0aCgpLCAiIik7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJaW50IGJ1ZmZlclNpemUgPSAyMDQ4OwotCQkJCQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOwotCQkJCQkJaW50IG5SZWFkID0gMDsKLQkJCQkJCWJvb2xlYW4gZW9mID0gZmFsc2U7Ci0JCQkJCQl3aGlsZSAoIWVvZikgewotCQkJCQkJCW5SZWFkID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCBidWZmZXJTaXplKTsKLQkJCQkJCQlpZiAoblJlYWQgPT0gLTEpIHsKLQkJCQkJCQkJZW9mID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBuUmVhZCk7Ci0JCQkJCQkJCS8vIGlubmVyZG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywKLQkJCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5nZXRMZW5ndGgoKSwgMCwgbmV3Ci0JCQkJCQkJCS8vIFN0cmluZyhidWZmZXIsIDAsIG5SZWFkKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaWdub3JlIHJlYWQtb25seSBzZXR0aW5ncyBpZiByZXZlcnRpbmcgd2hvbGUKLQkJCQkJCS8vIGRvY3VtZW50Ci0JCQkJCQlpbm5lcmRvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIG9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlLCBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkJCQltb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCS8vIHdvdWxkIGJlIGhpZ2hseSB1bnVzdWFsCi0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGlmIChpbm5lcmRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCS8vIGlubmVyZG9jdW1lbnQuc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCk7Ci0JCQkJCQkvLyB9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCQlkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQWxzbyBjcmVhdGUgTW9kZWxJbmZvIC0gZXh0cmEgcmVzb3VyY2Ugc3luY2hyb25pemF0aW9uIGNsYXNzZXMgc2hvdWxkCi0JICogYmUgc3RvcmVkIHdpdGhpbiB0aGUgTW9kZWxJbmZvCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBNb2RlbEluZm8gaWYgbmVjZXNzYXJ5Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVFbGVtZW50SW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGdldE1vZGVsSW5mb0ZvcigoSUVkaXRvcklucHV0KSBlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQljcmVhdGVNb2RlbEluZm8oKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCX0KLQotCQlFbGVtZW50SW5mbyBpbmZvID0gc3VwZXIuY3JlYXRlRWxlbWVudEluZm8oZWxlbWVudCk7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsSW5mbyhJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGdldE1vZGVsSW5mb0ZvcihpbnB1dCkgPT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBzZWxmQ3JlYXRlTW9kZWwoaW5wdXQpOwotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJY3JlYXRlTW9kZWxJbmZvKGlucHV0LCBzdHJ1Y3R1cmVkTW9kZWwsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCB3aGVuIG1vZGVsIGlzIHByb3ZpZGVkIHRvIHVzLCBlbnN1cmVzIHRoYXQgd2hlbiBzZXRJbnB1dCBpcwotCSAqIHVzZWQgb24gdGhpcyBpbnB1dCwgdGhlIGdpdmVuIG1vZGVsIHdpbGwgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbEluZm8oSUVkaXRvcklucHV0IGlucHV0LCBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgYm9vbGVhbiByZWxlYXNlTW9kZWxPbkRpc2Nvbm5lY3QpIHsKLQkJLy8gd2UgaGF2ZSB0byBtYWtlIHN1cmUgZmFjdG9yaWVzIGFyZSBhZGRlZCwgd2hldGhlciB3ZSBjcmVhdGVkIG9yCi0JCS8vIG5vdC4KLQkJaWYgKGdldE1vZGVsSW5mb0ZvcihpbnB1dCkgIT0gbnVsbCB8fCBnZXRNb2RlbEluZm9Gb3Ioc3RydWN0dXJlZE1vZGVsKSAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCi0JCQkJCXRyeSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBEVVBMSUNBVEUgY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogRFVQTElDQVRFIGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArIGlucHV0ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdG9yYWdlTW9kZWxQcm92aWRlcjogRFVQTElDQVRFIGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArIGlucHV0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyBpbnB1dCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgaW5wdXQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJKChJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5hZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0JCX0KLQotCQlFZGl0b3JNb2RlbFV0aWwuYWRkRmFjdG9yaWVzVG8oc3RydWN0dXJlZE1vZGVsKTsKLQotCQlNb2RlbEluZm8gbW9kZWxJbmZvID0gbmV3IE1vZGVsSW5mbyhzdHJ1Y3R1cmVkTW9kZWwsIGlucHV0LCByZWxlYXNlTW9kZWxPbkRpc2Nvbm5lY3QpOwotCQlmTW9kZWxJbmZvTWFwLnB1dChpbnB1dCwgbW9kZWxJbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQsIEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZUVsZW1lbnRJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9ySW5wdXQpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IChJRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlNb2RlbEluZm8gbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yKGlucHV0KTsKLQkJCWRpc3Bvc2VNb2RlbEluZm8obW9kZWxJbmZvKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlRWxlbWVudEluZm8oZWxlbWVudCwgaW5mbyk7Ci0JfQotCi0JLyoqCi0JICogZGlzY29ubmVjdCBmcm9tIHRoaXMgbW9kZWwgaW5mbwotCSAqIAotCSAqIEBwYXJhbSBpbmZvCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZU1vZGVsSW5mbyhNb2RlbEluZm8gaW5mbykgewotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoaW5mby5mRWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlTW9kZWxJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbmZvLmZFbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlTW9kZWxJbmZvIGZvciAiICsgaW5mby5mRWxlbWVudCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZU1vZGVsSW5mbyBmb3IgIiArIGluZm8uZkVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoaW5mby5mRWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCWlmIChpbmZvLmZFbGVtZW50IGluc3RhbmNlb2YgSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJKChJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIGluZm8uZkVsZW1lbnQpLnJlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKGZJbnRlcm5hbExpc3RlbmVyKTsKLQkJCX0KLQkJCWlmIChpbmZvLmZTaG91bGRSZWxlYXNlT25JbmZvRGlzcG9zZSkgewotCQkJCWluZm8uZlN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCQlmTW9kZWxJbmZvTWFwLnJlbW92ZShpbmZvLmZFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2RvUmVzZXREb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZXNldERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZlJldXNlTW9kZWxEb2N1bWVudCA9IGZhbHNlOwotCQlzdXBlci5kb1Jlc2V0RG9jdW1lbnQoZWxlbWVudCwgbW9uaXRvcik7Ci0JCWZSZXVzZU1vZGVsRG9jdW1lbnQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXIjZG9TYXZlRG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW5ldyBGaWxlRG9jdW1lbnRQcm92aWRlcigpLnNhdmVEb2N1bWVudChtb25pdG9yLCBlbGVtZW50LCBkb2N1bWVudCwgb3ZlcndyaXRlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChJRWRpdG9ySW5wdXQgZWxlbWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCU1vZGVsSW5mbyBpbmZvID0gZ2V0TW9kZWxJbmZvRm9yKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBpbmZvLmZTdHJ1Y3R1cmVkTW9kZWw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSU1vZGVsUHJvdmlkZXIjZ2V0TW9kZWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JJbnB1dCkKLQkJCXJldHVybiBnZXRNb2RlbCgoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbEluZm8gZ2V0TW9kZWxJbmZvRm9yKElFZGl0b3JJbnB1dCBlbGVtZW50KSB7Ci0JCU1vZGVsSW5mbyByZXN1bHQgPSAoTW9kZWxJbmZvKSBmTW9kZWxJbmZvTWFwLmdldChlbGVtZW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE1vZGVsSW5mbyBnZXRNb2RlbEluZm9Gb3IoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJTW9kZWxJbmZvIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTW9kZWxJbmZvW10gbW9kZWxJbmZvcyA9IChNb2RlbEluZm9bXSkgZk1vZGVsSW5mb01hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBNb2RlbEluZm9bMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbEluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTW9kZWxJbmZvIGluZm8gPSBtb2RlbEluZm9zW2ldOwotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZXF1YWxzKGluZm8uZlN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJcmVzdWx0ID0gaW5mbzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxvYWRNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBsb2FkTW9kZWwoSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gbG9hZE1vZGVsKGlucHV0LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxvYWRNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gbG9nRXhjZXB0aW9ucwotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGxvYWRNb2RlbChJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0LCBib29sZWFuIGxvZ0V4Y2VwdGlvbnMpIHsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSUQoaW5wdXQpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50cyA9IGlucHV0LmdldFN0b3JhZ2UoKS5nZXRDb250ZW50cygpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIG5vU3RvcmFnZUV4YykgewotCQkJaWYgKGxvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihOTFMuYmluZChTU0VVSU1lc3NhZ2VzLl8zMmNvbmNhdF9FWENfLCBuZXcgT2JqZWN0W117aW5wdXQuZ2V0TmFtZSgpfSksIG5vU3RvcmFnZUV4Yyk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIHVuaXF1ZQotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgY29udGVudHMsIG51bGwpOwotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGNhbGN1bGF0ZUJhc2VMb2NhdGlvbihpbnB1dCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobG9nRXhjZXB0aW9ucykKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuXzMyY29uY2F0X0VYQ18sIG5ldyBPYmplY3RbXXtpbnB1dH0pLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgc2VsZkNyZWF0ZU1vZGVsKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gbG9hZE1vZGVsKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5OTNmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFic3RyYWN0RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRBZGFwdGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlcGFpcmFibGVEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJvamVjdGlvbi5Qcm9qZWN0aW9uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2luZ0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSUxvY2thYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEFkYXB0cyBJU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cyBhbmQgbWV0aG9kcyB0byBTdHlsZWRUZXh0Q29udGVudCBldmVudHMKLSAqIGFuZCBtZXRob2RzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyIGltcGxlbWVudHMgSURvY3VtZW50QWRhcHRlciwgSURvY3VtZW50QWRhcHRlckV4dGVuc2lvbiB7Ci0KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50Q2xvbmUgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50IHsKLQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGNsb25lIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gY29udGVudAotCQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50Ci0JCSAqIEBwYXJhbSBsaW5lRGVsaW1pdGVycwotCQkgKiAgICAgICAgICAgIHRoZSBsaW5lIGRlbGltaXRlcnMKLQkJICovCi0JCXB1YmxpYyBEb2N1bWVudENsb25lKFN0cmluZyBjb250ZW50LCBTdHJpbmdbXSBsaW5lRGVsaW1pdGVycykgewotCQkJc3VwZXIoKTsKLQkJCXNldFRleHRTdG9yZShuZXcgU3RyaW5nVGV4dFN0b3JlKGNvbnRlbnQpKTsKLQkJCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIHRyYWNrZXIgPSBuZXcgQ29uZmlndXJhYmxlTGluZVRyYWNrZXIobGluZURlbGltaXRlcnMpOwotCQkJc2V0TGluZVRyYWNrZXIodHJhY2tlcik7Ci0JCQlnZXRUcmFja2VyKCkuc2V0KGNvbnRlbnQpOwotCQkJY29tcGxldGVJbml0aWFsaXphdGlvbigpOwotCQl9Ci0JfQotCi0JLy8gQSBwcmUtbm90aWZpY2F0aW9uIGxpc3RlbmVyIGZvciB0aGUgdmlld2VyJ3MgRG9jdW1lbnQKLQljbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxUZXh0Q2hhbmdlZCA9IGZhbHNlOwotCi0JCXByb3RlY3RlZCBEb2N1bWVudEV2ZW50IGN1cnJlbnRFdmVudDsKLQotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKQotCQkJCXJldHVybjsKLQotCQkJcGVuZGluZ0RvY3VtZW50Q2hhbmdlZEV2ZW50ID0gdHJ1ZTsKLQkJCWFsbFRleHRDaGFuZ2VkID0gZXZlbnQuZ2V0T2Zmc2V0KCkgPD0gMCAmJiBldmVudC5nZXRMZW5ndGgoKSA+PSBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMuZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJCWN1cnJlbnRFdmVudCA9IGV2ZW50OwotCi0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMucmVsYXlUZXh0Q2hhbmdpbmcoZXZlbnQuZ2V0T2Zmc2V0KCksIGV2ZW50LmdldExlbmd0aCgpLCBldmVudC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChjdXJyZW50RXZlbnQgIT0gbnVsbCAmJiBldmVudCA9PSBjdXJyZW50RXZlbnQpIHsKLQkJCQlpZiAoYWxsVGV4dENoYW5nZWQpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLnJlbGF5VGV4dFNldCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGVtcCB3b3JrIGFyb3VuZCBmb3IgaW1tZWRpYXRlIHRocmVhZAotCQkJCQkvLyBwcm9ibGVtLgotCQkJCQkvLyBzaG91bGQgaGF2ZSBtb3JlIGdlbmVyYWwgc29sdXRpb24KLQkJCQkJLy8gc29vbi4gJ3N5bmNFeGVjJyBhcmUgcnVtb3JlZCB0byBiZQotCQkJCQkvLyBwcm9uZSB0byBoYW5nLgotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMucmVsYXlUZXh0Q2hhbmdlZCgpOwotCQkJCX0KLQkJCX0KLQotCQkJY3VycmVudEV2ZW50ID0gbnVsbDsKLQkJCXBlbmRpbmdEb2N1bWVudENoYW5nZWRFdmVudCA9IGZhbHNlOwotCQkJaGFuZGxlUGVuZGluZ0V2ZW50cygpOwotCQkJbGFzdEV2ZW50ID0gbnVsbDsKLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nVGV4dFN0b3JlIGltcGxlbWVudHMgSVRleHRTdG9yZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIHRleHQgc3RvcmUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBjb250ZW50Ci0JCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdUZXh0U3RvcmUoU3RyaW5nIGNvbnRlbnQpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoY29udGVudCwgImNvbnRlbnQgY2FuIG5vdCBiZSBudWxsIHdoZW4gc2V0dGluZyB0ZXh0IHN0b3JlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb250ZW50ID0gY29udGVudDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldChpbnQpCi0JCSAqLwotCQlwdWJsaWMgY2hhciBnZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIGZDb250ZW50LmNoYXJBdChvZmZzZXQpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0KGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuIGZDb250ZW50LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXRMZW5ndGgoKQotCQkgKi8KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gZkNvbnRlbnQubGVuZ3RoKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNyZXBsYWNlKGludCwgaW50LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNzZXQoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRvIHRoZSBEb2N1bWVudC9JU3RydWN0dXJlZERvY3VtZW50IGNhbiBleHRlbmQgYmV5b25kIHRoZSB0ZXh0Ci0JICogY2hhbmdlIGFyZWEgYW5kIHJlcXVpcmUgbW9yZSByZWRyYXdpbmcgdG8ga2VlcCB0aGUgaGlsaWdodGluZyBjb3JyZWN0LgotCSAqIFRoZSBldmVudCBtdXN0IGJlIHNhdmVkIHNvIHRoYXQgdGhlIHJlZHJhdyBpcyBvbmx5IHNlbnQgYWZ0ZXIgYQotCSAqIHRleHRDaGFuZ2VkIGV2ZW50IGlzIHJlY2VpdmVkLgotCSAqLwotCWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQkJLy8gaWYKLQkJCQkvLyAoU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmZTdG9wUmVsYXlpbmdDaGFuZ2VzKQotCQkJCS8vIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGVkIHJlbGF5aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gc2hvdWxkIHVzZSB0ZXh0U2V0IHdoZW4gYWxsIGNvbnRlbnRzIGhhdmUKLQkJCS8vIGNoYW5nZWQKLQkJCS8vIG90aGVyd2lzZSBuZWVkIHRvIHVzZSB0aGUgcGFpciBvZgotCQkJLy8gdGV4dENoYW5naW5nIGFuZAotCQkJLy8gdGV4dENoYW5nZWQuCi0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMubGFzdEV2ZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShmaW5hbCBOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2tpcHBlZCByZWxheWluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQucmVhc29uID09IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRSkgewotCQkJCWlmIChwZW5kaW5nRG9jdW1lbnRDaGFuZ2VkRXZlbnQpIHsKLQkJCQkJaWYgKGxhc3RFdmVudFF1ZXVlID09IG51bGwpIHsKLQkJCQkJCWxhc3RFdmVudFF1ZXVlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQl9Ci0JCQkJCWxhc3RFdmVudFF1ZXVlLmFkZChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMubGFzdEV2ZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJCS8vIGlmCi0JCQkJLy8gKFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5mU3RvcFJlbGF5aW5nQ2hhbmdlcykKLQkJCQkvLyB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IHJlbGF5aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmxhc3RFdmVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCQkvLyBpZgotCQkJCS8vIChTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMuZlN0b3BSZWxheWluZ0NoYW5nZXMpCi0JCQkJLy8gewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCByZWxheWluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5sYXN0RXZlbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJCS8vIGlmCi0JCQkJLy8gKFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5mU3RvcFJlbGF5aW5nQ2hhbmdlcykKLQkJCQkvLyB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IHJlbGF5aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmxhc3RFdmVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIHJlZHJhd0JhY2tncm91bmQgPSB0cnVlOwotCi0JLyoqIFRoZSB2aXNpYmxlIGNoaWxkIGRvY3VtZW50LiAqLwotCXByaXZhdGUgUHJvamVjdGlvbkRvY3VtZW50IGZDaGlsZERvY3VtZW50OwotCi0JLyoqIFRoZSBtYXN0ZXIgZG9jdW1lbnQgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqIFRoZSBkb2N1bWVudCBjbG9uZSBmb3IgdGhlIG5vbi1mb3J3YXJkaW5nIGNhc2UuICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50Q2xvbmU7Ci0KLQkvLyBvbmx5IHVzZSB0aGlzIHRlbXAgd29yayBhcm91bmQgaWYgb24gR1RLCi0JLy8gaXQgY2F1c2VzIGZ1bm55ICJjdXJzb3IgYmxpbmtpbmciIGlmIHVzZWQgb24gd2luZG93cwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmb3JjZVJlZHJhd09uUmVnaW9uQ2hhbmdlZCA9IFBsYXRmb3JtLmdldFdTKCkuZXF1YWxzKCJndGsiKTsgLy8kTk9OLU5MUy0xJAotCS8qKiBUaGUgb3JpZ2luYWwgY29udGVudCAqLwotCXByaXZhdGUgU3RyaW5nIGZPcmlnaW5hbENvbnRlbnQ7Ci0JLyoqIFRoZSBvcmlnaW5hbCBsaW5lIGRlbGltaXRlcnMgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzOwotCi0JcHJpdmF0ZSBpbnQgZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cyA9IDA7Ci0KLQlwcml2YXRlIFN0eWxlZFRleHQgZlN0eWxlZFRleHRXaWRnZXQ7Ci0KLQkvKiogVGhlIHJlZ2lzdGVyZWQgdGV4dCBjaGFuZ2VkIGxpc3RlbmVycyAqLwotCVRleHRDaGFuZ2VMaXN0ZW5lcltdIGZUZXh0Q2hhbmdlTGlzdGVuZXJzOwotCXByb3RlY3RlZCBEb2N1bWVudExpc3RlbmVyIGludGVybmFsRG9jdW1lbnRMaXN0ZW5lcjsKLQotCS8vIFRoZSBsaXN0ZW5lcnMgZm9yIHJlbGF5aW5nIERvY3VtZW50RXZlbnRzIGFuZAotCS8vIHJlcXVlc3RpbmcgcmVwYWludHMKLQkvLyBhZnRlciBtb2RpZmljYXRpb24KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBpbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGxhc3RFdmVudCA9IG51bGw7Ci0JTGlzdCBsYXN0RXZlbnRRdWV1ZTsKLQlib29sZWFuIHBlbmRpbmdEb2N1bWVudENoYW5nZWRFdmVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRFU1QgT05MWSAtIFRFU1QgT05MWSAtIFRFU1QgT05MWSBOT1QgQVBJIHVzZSB0aGlzIGNvbnN0cnVjdG9yIG9ubHkgZm9yCi0JICogdGVzdHMuIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgYWRhcHRlciB3aGljaCBpcyBpbml0aWFsbGx5IG5vdCBjb25uZWN0ZWQKLQkgKiB0byBhbnkgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIoKSB7Ci0KLQkJaW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlpbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCQkvLyBmb3IgdGVzdGluZyBvbmx5Ci0JCS8vIHNldERvY3VtZW50KGdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkZW50aWZpZXJGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGFkYXB0ZXIgd2hpY2ggaXMgaW5pdGlhbGxseSBub3QgY29ubmVjdGVkIHRvIGFueQotCSAqIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyKFN0eWxlZFRleHQgc3R5bGVkVGV4dFdpZGdldCkgewotCi0JCS8vIGRvIG5vdCB1c2UgJ3RoaXMoKScgaW4gdGhpcyBjYXNlCi0JCXN1cGVyKCk7Ci0JCWludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJaW50ZXJuYWxEb2N1bWVudExpc3RlbmVyID0gbmV3IERvY3VtZW50TGlzdGVuZXIoKTsKLQkJZlN0eWxlZFRleHRXaWRnZXQgPSBzdHlsZWRUZXh0V2lkZ2V0OwotCX0KLQotCXByaXZhdGUgdm9pZCBfc2V0RG9jdW1lbnQoSURvY3VtZW50IG5ld0RvYykgewotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0JCWZEb2N1bWVudCA9IG5ld0RvYzsKLQkJaWYgKCFpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlmRG9jdW1lbnRDbG9uZSA9IG51bGw7Ci0JCQlmT3JpZ2luYWxDb250ZW50ID0gZ2V0RG9jdW1lbnQoKSAhPSBudWxsID8gZ2V0RG9jdW1lbnQoKS5nZXQoKSA6IG51bGw7Ci0JCQlmT3JpZ2luYWxMaW5lRGVsaW1pdGVycyA9IGdldERvY3VtZW50KCkgIT0gbnVsbCA/IGdldERvY3VtZW50KCkuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpIDogbnVsbDsKLQkJfQotCi0JCWlmIChERUJVRyAmJiBmRG9jdW1lbnQgIT0gbnVsbCAmJiAhKGZEb2N1bWVudCBpbnN0YW5jZW9mIElMb2NrYWJsZSkpIHsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBub24gSUxvY2thYmxlIGRvY3VtZW50IHVzZWQgaW4gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgIGRvY3VtZW50IHVwZGF0ZXMgb24gbm9uLWRpc3BsYXkgdGhyZWFkIHdpbGwgbm90IGJlIHNhZmUgaWYgZWRpdG9yIG9wZW4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoaW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQjYWRkVGV4dENoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkvLyAoYW5kIGlmIGl0IGlzLCBwcmludCBhIHdhcm5pbmcgdG8gYWlkIGRlYnVnZ2luZywKLQkJLy8gaWYgbmVlZGVkKQotCi0JCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlRleHRDaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcjo6YWRkVGV4dENoYW5nZWRMaXN0ZW5lcnMuIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcjo6YWRkVGV4dENoYW5nZWRMaXN0ZW5lcnMuIEFkZGluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiB0ZXh0IGFkYXB0ZXIuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlCi0JCQkJLy8gc3VyZSwgZm9yIGZpcnN0IHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmVGV4dENoYW5nZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQl9Ci0JCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJVGV4dENoYW5nZUxpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IFRleHRDaGFuZ2VMaXN0ZW5lcltuZXdTaXplXTsKLQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmVGV4dENoYW5nZUxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCX0KLQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkvLwotCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJZlRleHRDaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkvLwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQjZ2V0Q2hhckNvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQotCQkvLyBnZXREb2N1bWVudCBjYW4gc29tZXRpbWVzIGJlIG51bGwgZHVyaW5nIHN0YXJ0dXAKLQkJLy8gYW5kIGRpc3Bvc2UKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFNhZmVEb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0Q2xvbmVkRG9jdW1lbnQoKSB7Ci0JCWlmIChmRG9jdW1lbnRDbG9uZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudCA9IGZPcmlnaW5hbENvbnRlbnQgPT0gbnVsbCA/ICIiIDogZk9yaWdpbmFsQ29udGVudDsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZGVsaW1zID0gZk9yaWdpbmFsTGluZURlbGltaXRlcnMgPT0gbnVsbCA/IERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTIDogZk9yaWdpbmFsTGluZURlbGltaXRlcnM7Ci0JCQlmRG9jdW1lbnRDbG9uZSA9IG5ldyBEb2N1bWVudENsb25lKGNvbnRlbnQsIGRlbGltcyk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudENsb25lOwotCX0KLQotCURpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQotCQkvLyBOb3RlOiB0aGUgd29ya2JlbmNoIHNob3VsZCBhbHdheXMgaGF2ZSBhIGRpc3BsYXkKLQkJLy8gKHVubGVzcyBydW5uaW5nIGhlYWRsZXNzKSwgd2hlcmVhcyBEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkvLyBvbmx5IHJldHVybnMgdGhlIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkCi0JCS8vIGhhcyBvbmUuCi0JCWlmIChQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKQotCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQotCQlpZiAoZkNoaWxkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmRG9jdW1lbnQ7Ci0JCXJldHVybiBmQ2hpbGREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHJlZ2lvbiBpbiBtYXN0ZXIgZG9jdW1lbnQgb2YgZ2l2ZW4gcmVnaW9uIChzaG91bGQgYmUgcmVnaW9uIGluCi0JICogcHJvamVjdGlvbiBkb2N1bWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIHJlZ2lvbiBpZiBubyBwcm9qZWN0aW9uIGRvY3VtZW50IGV4aXN0cywgcmVnaW9uIG9mIG1hc3RlcgotCSAqICAgICAgICAgZG9jdW1lbnQgaWYgcG9zc2libGUsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBJUmVnaW9uIGdldFByb2plY3Rpb25Ub01hc3RlclJlZ2lvbihJUmVnaW9uIHJlZ2lvbikgewotCQlJUmVnaW9uIG9yaWdpbmFsUmVnaW9uID0gcmVnaW9uOwotCQlpZiAoZkNoaWxkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlvcmlnaW5hbFJlZ2lvbiA9IGZDaGlsZERvY3VtZW50LmdldFByb2plY3Rpb25NYXBwaW5nKCkudG9PcmlnaW5SZWdpb24ocmVnaW9uKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcmlnaW5hbFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9mZnNldCBpbiBwcm9qZWN0aW9uIGRvY3VtZW50IG9mIGdpdmVuIG9mZnNldCAoc2hvdWxkIGJlIG9mZnNldAotCSAqIGluIG1hc3RlciBkb2N1bWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIG9mZnNldCBpZiBubyBwcm9qZWN0aW9uIGRvY3VtZW50IGV4aXN0cywgb2Zmc2V0IG9mIHByb2plY3Rpb24KLQkgKiAgICAgICAgIGRvY3VtZW50IGlmIHBvc3NpYmxlLCAtMSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGludCBnZXRNYXN0ZXJUb1Byb2plY3Rpb25PZmZzZXQoaW50IG9mZnNldCkgewotCQlpbnQgb3JpZ2luYWxPZmZzZXQgPSBvZmZzZXQ7Ci0JCWlmIChmQ2hpbGREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW9yaWdpbmFsT2Zmc2V0ID0gZkNoaWxkRG9jdW1lbnQuZ2V0UHJvamVjdGlvbk1hcHBpbmcoKS50b0ltYWdlT2Zmc2V0KG9mZnNldCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3JpZ2luYWxPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBjaGFyYWN0ZXIgb2Zmc2V0IHdpdGhvdXQgZGVsaW1pdGVycy4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBvZmZzZXQgb2YgdGhlIGxpbmUgdG8gcmV0dXJuLiBEb2VzIG5vdCBpbmNsdWRlIGRlbGltaXRlcnMgb2YKLQkgKiAgICAgICAgICAgIHByZWNlZWRpbmcgbGluZXMuIE9mZnNldCAwIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlCi0JICogICAgICAgICAgICBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIHRoZSBsaW5lIHRleHQgd2l0aG91dCBkZWxpbWl0ZXJzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGluZShpbnQgbGluZU51bWJlcikgewotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAobGluZU51bWJlciA+PSBnZXRMaW5lQ291bnQoKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGV2ZWxvcG1lbnQgRGVidWc6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6Z2V0TGluZSgpIGVycm9yLiBsaW5lTnVtYmVyIHJlcXVlc3RlZCAoIiArIGxpbmVOdW1iZXIgKyAiKSB3YXMgZ3JlYXRlciB0aGFuIG51bWJlciBvZiBsaW5lcygiICsgZ2V0TGluZUNvdW50KCkgKyAiKS4gRW1wdHlTdHJpbmcgcmV0dXJuZWQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIHIgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVOdW1iZXIpOwotCQkJCQlpZiAoci5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCXJlc3VsdCA9IGRvYy5nZXQoci5nZXRPZmZzZXQoKSwgci5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRyaWVzIHRvIHJlcGFpciB0aGUgbGluZSBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudAotCSAqIEBzZWUgSVJlcGFpcmFibGVEb2N1bWVudCNyZXBhaXJMaW5lSW5mb3JtYXRpb24oKQotCSAqIEBzZWUgRWNsaXBzZSAzLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwYWlyTGluZUluZm9ybWF0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJUmVwYWlyYWJsZURvY3VtZW50KSB7Ci0JCQlJUmVwYWlyYWJsZURvY3VtZW50IHJlcGFpcmFibGUgPSAoSVJlcGFpcmFibGVEb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQlyZXBhaXJhYmxlLnJlcGFpckxpbmVJbmZvcm1hdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaW5lIGluZGV4IGF0IHRoZSBnaXZlbiBjaGFyYWN0ZXIgb2Zmc2V0LgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIG9mZnNldCBvZiB0aGUgbGluZSB0byByZXR1cm4uIFRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlCi0JICogICAgICAgICAgICBkb2N1bWVudCBpcyBhdCBvZmZzZXQgMC4gQW4gb2Zmc2V0IG9mIGdldExlbmd0aCgpIGlzIHZhbGlkCi0JICogICAgICAgICAgICBhbmQgc2hvdWxkIGFuc3dlciB0aGUgbnVtYmVyIG9mIGxpbmVzLgotCSAqIEByZXR1cm4gdGhlIGxpbmUgaW5kZXguIFRoZSBmaXJzdCBsaW5lIGlzIGF0IGluZGV4IDAuIElmIHRoZSBjaGFyYWN0ZXIKLQkgKiAgICAgICAgIGF0IG9mZnNldCBpcyBhIGRlbGltaXRlciBjaGFyYWN0ZXIsIGFuc3dlciB0aGUgbGluZSBpbmRleCBvZgotCSAqICAgICAgICAgdGhlIGxpbmUgdGhhdCBpcyBkZWxpbWl0ZWQuIEZvciBleGFtcGxlLCB0ZXh0ID0gIlxyXG5cclxuIiwKLQkgKiAgICAgICAgIGRlbGltaXRlciA9ICJcclxuIiwgdGhlbjogZ2V0TGluZUF0T2Zmc2V0KDApID09IDAKLQkgKiAgICAgICAgIGdldExpbmVBdE9mZnNldCgxKSA9PSAwIGdldExpbmVBdE9mZnNldCgyKSA9PSAxCi0JICogICAgICAgICBnZXRMaW5lQXRPZmZzZXQoMykgPT0gMSBnZXRMaW5lQXRPZmZzZXQoNCkgPT0gMgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSURvY3VtZW50IGRvYyA9IGdldFNhZmVEb2N1bWVudCgpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gZG9jLmdldExpbmVPZk9mZnNldChvZmZzZXQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQlyZXBhaXJMaW5lSW5mb3JtYXRpb24oZG9jKTsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHQgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4MikgewotCQkJCQkvLyBzaG91bGQgbm90IG9jY3VyLCBidXQgc2VlbXMgdG8gZm9yIHByb2plY3Rpb24KLQkJCQkJLy8gZG9jdW1lbnRzLCByZWxhdGVkIHRvIHJlcGFpbnRpbmcgb3ZlcnZpZXcgcnVsZXIKLQkJCQkJcmVzdWx0ID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBkb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQjZ2V0TGluZURlbGltaXRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRQYXJlbnREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJcmVzdWx0ID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBnZXRQYXJlbnREb2N1bWVudCgpKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCQlyZXN1bHQgPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvYyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZ2l2ZW4gbGluZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZUluZGV4Ci0JICogICAgICAgICAgICBpbmRleCBvZiB0aGUgbGluZS4gVGhlIGZpcnN0IGxpbmUgaXMgYXQgaW5kZXggMC4KLQkgKiBAcmV0dXJuIG9mZnNldCBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZS4gVGhlIGZpcnN0Ci0JICogICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50IGlzIGF0IG9mZnNldCAwLiBUaGUgcmV0dXJuIHZhbHVlCi0JICogICAgICAgICBzaG91bGQgaW5jbHVkZSBsaW5lIGRlbGltaXRlcnMuIEZvciBleGFtcGxlLCB0ZXh0ID0KLQkgKiAgICAgICAgICJcclxudGVzdFxyXG4iLCBkZWxpbWl0ZXIgPSAiXHJcbiIsIHRoZW46IGdldE9mZnNldEF0TGluZSgwKSA9PQotCSAqICAgICAgICAgMCBnZXRPZmZzZXRBdExpbmUoMSkgPT0gMiBnZXRPZmZzZXRBdExpbmUoMikgPT0gOCBOT1RFOiBXaGVuCi0JICogICAgICAgICB0aGVyZSBpcyBubyB0ZXh0IChpLmUuLCBubyBsaW5lcyksIGdldE9mZnNldEF0TGluZSgwKSBpcyBhCi0JICogICAgICAgICB2YWxpZCBjYWxsIHRoYXQgc2hvdWxkIHJldHVybiAwLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0QXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSURvY3VtZW50IGRvYyA9IGdldFNhZmVEb2N1bWVudCgpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gZG9jLmdldExpbmVPZmZzZXQobGluZUluZGV4KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVzdWx0ID0gMDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGRvY3VtZW50IHRvIHVzZSBmb3IgcmVxdWVzdCBmcm9tIHRoZSBTdHlsZWRUZXh0IHdpZGdldC4gSXRzCi0JICogZWl0aGVyIHRoZSBsaXZlIGRvY3VtbmV0IG9yIGEgY2xvbmUgb2YgaXQsIGRlcGVuZGluZyBvbiBzdG9wL3Jlc3VtZQotCSAqIHN0YXRlLgotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGdldFNhZmVEb2N1bWVudCgpIHsKLQkJSURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlyZXN1bHQgPSBnZXRDbG9uZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gbm90ZSwgdGhpcyBkb2N1bWVudCBjYW4gYmUgbm9ybWFsIHN0cnVjdHVyZWQgdGV4dCBkb2N1bWVudCwKLQkJCS8vIG9yIHRoZSBwcm9qZWN0aW9uL2NoaWxkIGRvY3VtZW50Ci0JCQlyZXN1bHQgPSBnZXREb2N1bWVudCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQKLQkgKi8KLQlTdHlsZWRUZXh0IGdldFN0eWxlZFRleHRXaWRnZXQoKSB7Ci0JCXJldHVybiBmU3R5bGVkVGV4dFdpZGdldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29udGVudCBhdCB0aGUgZ2l2ZW4gcmFuZ2UuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0ZXh0IHRvIHJldHVybi4gT2Zmc2V0IDAgaXMgdGhlCi0JICogICAgICAgICAgICBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdG8gcmV0dXJuCi0JICogQHJldHVybiB0aGUgdGV4dCBhdCB0aGUgZ2l2ZW4gcmFuZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCQlyZXN1bHQgPSBkb2MuZ2V0KHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgb25seSBmb3IgIm5vIGNoYW5nZSIgZXZlbnRzLCBmb3Igbm93Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGVuZGluZ0V2ZW50cygpIHsKLQotCQlpZiAobGFzdEV2ZW50UXVldWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxhc3RFdmVudFF1ZXVlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IChOb0NoYW5nZUV2ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZWRyYXdOb0NoYW5nZShub0NoYW5nZUV2ZW50KTsKLQkJfQotCi0JCWxhc3RFdmVudFF1ZXVlID0gbnVsbDsKLQkJbGFzdEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlib29sZWFuIGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkgewotCQlyZXR1cm4gZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cyA+IDA7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBtZXRob2QgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQgb25seSBmb3IgcmVhZCBvbmx5IHJlZ2lvbiBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZHJhd05vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkKLQkJCXJldHVybjsKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1heWJlIHJlZHJhdyBzdHVmZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc3RhcnRPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldExlbmd0aCgpOwotCQlyZWRyYXdSYW5nZVdpdGhMZW5ndGgoc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IGEgcmVkcmF3IG9mIHRoZSB0ZXh0IHJhbmdlIG9jY3VwaWVkIGJ5IHRoZSBnaXZlbgotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50Ci0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3Tm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKQotCQkJcmV0dXJuOwotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWF5YmUgcmVkcmF3IHN0dWZmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBqdXN0IHRoZSBuZXcgc3R1ZmYKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQotCQlpbnQgbk5ld05vZGVzID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKTsKLQkJaWYgKG5OZXdOb2RlcyA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShuTmV3Tm9kZXMgLSAxKTsKLQkJCXJlZHJhd1JhbmdlKGZpcnN0Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBsYXN0Tm9kZS5nZXRFbmRPZmZzZXQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWRyYXdzIHRoZSBnaXZlIG9mZnNldHMgaW4gdGVybXMgb2YgdGhlIFN0cnVjdHVyZWREb2N1bWVudC4gSWYgb25seQotCSAqIHBhcnQgb2YgdGhlIG1vZGVsIGlzIHZpc2libGUsIGVuc3VyZXMgdGhhdCBvbmx5IHRoZSB2aXNpYmxlIHBvcnRpb24gb2YKLQkgKiB0aGUgZ2l2ZW4gcmFuZ2UgaXMgcmVkcmF3bi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRNb2RlbE9mZnNldAotCSAqIEBwYXJhbSBlbmRNb2RlbE9mZnNldAotCSAqLwotCXByaXZhdGUgdm9pZCByZWRyYXdSYW5nZShmaW5hbCBpbnQgc3RhcnRNb2RlbE9mZnNldCwgZmluYWwgaW50IGVuZE1vZGVsT2Zmc2V0KSB7Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZHJhdyBzdHVmZjogIiArIHN0YXJ0TW9kZWxPZmZzZXQgKyAiLSIgKyBlbmRNb2RlbE9mZnNldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChmQ2hpbGREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWdldFN0eWxlZFRleHRXaWRnZXQoKS5yZWRyYXdSYW5nZShzdGFydE1vZGVsT2Zmc2V0LCBlbmRNb2RlbE9mZnNldCAtIHN0YXJ0TW9kZWxPZmZzZXQsIHJlZHJhd0JhY2tncm91bmQpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgaGlnaCA9IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSBnZXRNYXN0ZXJUb1Byb2plY3Rpb25PZmZzZXQoc3RhcnRNb2RlbE9mZnNldCk7Ci0KLQkJCWludCBlbmRPZmZzZXQgPSBnZXRNYXN0ZXJUb1Byb2plY3Rpb25PZmZzZXQoZW5kTW9kZWxPZmZzZXQpOwotCi0JCQkvLyBpZiBvZmZzZXRzIHdlcmUgbm90IHZpc2libGUsIGp1c3QgdHJ5IHRvIHJlZHJhdyBldmVyeXRoaW5nIGluCi0JCQkvLyB0aGUgY2hpbGQgZG9jdW1lbnQKLQkJCS8vIC8vIG5vdCB2aXNpYmxlCi0JCQkvLyBpZiAoZW5kT2Zmc2V0IDwgMCB8fCBzdGFydE9mZnNldCA+IGhpZ2gpCi0JCQkvLyByZXR1cm47Ci0JCQkvLyByZXN0cmljdCBsb3dlciBib3VuZAotCQkJaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gMDsKLQkJCX0KLQkJCS8vIHJlc3RyaWN0IHVwcGVyIGJvdW5kCi0JCQkvLyBpZiAoZW5kT2Zmc2V0ID4gaGlnaCkgewotCQkJLy8gZW5kT2Zmc2V0ID0gaGlnaDsKLQkJCS8vIH0KLQkJCWlmIChlbmRPZmZzZXQgPCAwKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gaGlnaDsKLQkJCX0KLQotCQkJaW50IGxlbmd0aCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OwotCQkJLy8gcmVkcmF3QmFja2dyb3VuZCB3aXRoIGZhbHNlIHdvdWxkIGJlIGZhc3RlcgotCQkJLy8gYnV0IGFzc3VtZXMgYmFja2dyb3VuZCAob3IgZm9udCkgaXMgbm90Ci0JCQkvLyBjaGFuZ2luZwotCQkJZmluYWwgaW50IGZpbmFsU3RhcnRPZmZzZXQgPSBzdGFydE9mZnNldDsKLQkJCWZpbmFsIGludCBmaW5hbGxlbmd0aCA9IGxlbmd0aDsKLQotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlnZXRTdHlsZWRUZXh0V2lkZ2V0KCkucmVkcmF3UmFuZ2UoZmluYWxTdGFydE9mZnNldCwgZmluYWxsZW5ndGgsIHJlZHJhd0JhY2tncm91bmQpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWRyYXdzIHRoZSBnaXZlIG9mZnNldHMgaW4gdGVybXMgb2YgdGhlIEZsYXQgTm9kZSBtb2RlbC4gSWYgb25seSBwYXJ0Ci0JICogb2YgdGhlIG1vZGVsIGlzIHZpc2libGUsIGVuc3VyZXMgdGhhdCBvbmx5IHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlCi0JICogZ2l2ZW4gcmFuZ2UgaXMgcmVkcmF3bi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRNb2RlbE9mZnNldAotCSAqIEBwYXJhbSBlbmRNb2RlbE9mZnNldAotCSAqLwotCXByaXZhdGUgdm9pZCByZWRyYXdSYW5nZVdpdGhMZW5ndGgoZmluYWwgaW50IHN0YXJ0TW9kZWxPZmZzZXQsIGZpbmFsIGludCBsZW5ndGgpIHsKLQotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVkcmF3IHN0dWZmOiAiICsgc3RhcnRNb2RlbE9mZnNldCArICItIiArIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChmQ2hpbGREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWdldFN0eWxlZFRleHRXaWRnZXQoKS5yZWRyYXdSYW5nZShzdGFydE1vZGVsT2Zmc2V0LCBsZW5ndGgsIHJlZHJhd0JhY2tncm91bmQpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IGhpZ2ggPSBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJLy8gVE9ETyBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHNlZ21lbnRlZCB2aXNpYmxlIHJlZ2lvbnMKLQkJCWludCBzdGFydE9mZnNldCA9IGdldE1hc3RlclRvUHJvamVjdGlvbk9mZnNldChzdGFydE1vZGVsT2Zmc2V0KTsKLQkJCS8vIG5vdCB2aXNpYmxlCi0JCQlpZiAoc3RhcnRPZmZzZXQgPiBoaWdoIHx8IGxlbmd0aCA8IDEpCi0JCQkJcmV0dXJuOwotCQkJLy8gcmVzdHJpY3QgbG93ZXIgYm91bmQKLQkJCWlmIChzdGFydE9mZnNldCA8IDApIHsKLQkJCQlzdGFydE9mZnNldCA9IDA7Ci0JCQl9Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsZW5ndGggLSAxOwotCQkJLy8gcmVzdHJpY3QgdXBwZXIgYm91bmQKLQkJCWlmIChlbmRPZmZzZXQgPiBoaWdoKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gaGlnaDsKLQkJCX0KLQotCQkJLy8gbm90ZTogbGVuZ3RoIG9mIHRoZSBjaGlsZCBkb2N1bW5ldCBzaG91bGQgYmUKLQkJCS8vIHVwZGF0ZWQsCi0JCQkvLyBuZWVkIHRvIGludmVzdGlnYXRlIHdoeSBpdHMgbm90IGF0IHRoaXMKLQkJCS8vIHBvaW50LCBidXQgaXMKLQkJCS8vIHByb2JhYmx5IGp1c3QgYmVjYXVzZSB0aGUgZG9jdW1lbnQgZXZlbnQKLQkJCS8vIGhhbmRsaW5nIGlzIG5vdAotCQkJLy8gY29tcGxldGVseSBmaW5pc2hlZC4KLQkJCWludCBuZXdMZW5ndGggPSBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsgLy8gZDI4MzAwNwotCi0JCQkvLyByZWRyYXdCYWNrZ3JvdW5kIHdpdGggZmFsc2Ugd291bGQgYmUgZmFzdGVyCi0JCQkvLyBidXQgYXNzdW1lcyBiYWNrZ3JvdW5kIChvciBmb250KSBpcyBub3QKLQkJCS8vIGNoYW5naW5nCi0JCQlmaW5hbCBpbnQgZmluYWxTdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotCQkJZmluYWwgaW50IGZpbmFsTmV3TGVuZ3RoID0gbmV3TGVuZ3RoOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlnZXRTdHlsZWRUZXh0V2lkZ2V0KCkucmVkcmF3UmFuZ2UoZmluYWxTdGFydE9mZnNldCwgZmluYWxOZXdMZW5ndGgsIHJlZHJhd0JhY2tncm91bmQpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdCBhIHJlZHJhdyBvZiB0aGUgdGV4dCByYW5nZSBvY2N1cGllZCBieSB0aGUgZ2l2ZW4KLQkgKiBSZWdpb25DaGFuZ2VkRXZlbnQgZm9yIGNlcnRhaW4gKG5vdCBhbGwpIElUZXh0UmVnaW9uIGNvbnRleHRzCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3UmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXliZSByZWRyYXcgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQkvLyAobnNkKSBUT0RPOiB0cnkgdG8gbWFrZSB0aGlzIHJlbGlhYmxlIHNvbWVob3cKLQkJLy8gd2l0aG91dCBiZWluZyBkaXJlY3RseSBjb250ZW50IGRlcGVuZGVudAotCQkvLyBpZiAoKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB8fAotCQkvLyAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5CTE9DS19URVhUKSB8fAotCQkvLyAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkpIHsKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9Ci0JCS8vIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyAvLyByZWRyYXcgYmFja2dyb3VuZCBvZiBmYWxzZSBpcyBmYXN0ZXIsCi0JCS8vIC8vIGJ1dCBhc3N1bWVzIGJhY2tncm91bmQgKG9yIGZvbnQpIGlzIG5vdAotCQkvLyBjaGFuZ2luZwotCQkvLyByZWRyYXdSYW5nZShmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLAotCQkvLyBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSk7Ci0JCS8vIH0KLQkJaWYgKGZvcmNlUmVkcmF3T25SZWdpb25DaGFuZ2VkKSB7Ci0JCQkvLyB3b3JrYXJvdW5kIGZvciByZWRyYXdpbmcgcHJvYmxlbXMgb24gTGludXgtR1RLCi0JCQlpbnQgc3RhcnRPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPZmZzZXQoKTsKLQkJCWludCBlbmRPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPZmZzZXQoKSArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldExlbmd0aCgpOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIHN0YXJ0TGluZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZEb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChzdGFydE9mZnNldCk7Ci0JCQkJSVJlZ2lvbiBlbmRMaW5lID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZkRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZE9mZnNldCk7Ci0JCQkJaWYgKHN0YXJ0TGluZSAhPSBudWxsICYmIGVuZExpbmUgIT0gbnVsbCkgewotCQkJCQlyZWRyYXdSYW5nZShzdGFydExpbmUuZ2V0T2Zmc2V0KCksIGVuZExpbmUuZ2V0T2Zmc2V0KCkgKyBlbmRMaW5lLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdGhpbmcgZm9yIG5vdwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdCBhIHJlZHJhdyBvZiB0aGUgdGV4dCByYW5nZSBvY2N1cGllZCBieSB0aGUgZ2l2ZW4KLQkgKiBSZWdpb25zUmVwbGFjZWRFdmVudAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZHJhd1JlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKQotCQkJcmV0dXJuOwotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWF5YmUgcmVkcmF3IHN0dWZmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJaW50IG5SZWdpb25zID0gbmV3UmVnaW9ucy5zaXplKCk7Ci0JCWlmIChuUmVnaW9ucyA+IDApIHsKLQkJCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoMCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoblJlZ2lvbnMgLSAxKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJlZHJhd1JhbmdlKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGZpcnN0UmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KGxhc3RSZWdpb24pKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZHJhd1RleHRDaGFuZ2VkKCkgewotCi0JCWlmIChsYXN0RXZlbnQgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIGRpc3BsYXksIHNpbmNlIHNvbWUgY2FzZXMgY2FuIGVmZmVjdAotCQkJLy8gaGlnaGxpZ2h0aW5nIGJleW9uZCB0aGUgY2hhbmdlZCB0ZXh0IGFyZWEuCi0JCQlpZiAobGFzdEV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpCi0JCQkJcmVkcmF3Tm9kZXNSZXBsYWNlZCgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIGxhc3RFdmVudCk7Ci0JCQlpZiAobGFzdEV2ZW50IGluc3RhbmNlb2YgUmVnaW9uc1JlcGxhY2VkRXZlbnQpCi0JCQkJcmVkcmF3UmVnaW9uc1JlcGxhY2VkKChSZWdpb25zUmVwbGFjZWRFdmVudCkgbGFzdEV2ZW50KTsKLQkJCWlmIChsYXN0RXZlbnQgaW5zdGFuY2VvZiBSZWdpb25DaGFuZ2VkRXZlbnQpCi0JCQkJcmVkcmF3UmVnaW9uQ2hhbmdlZCgoUmVnaW9uQ2hhbmdlZEV2ZW50KSBsYXN0RXZlbnQpOwotCQkJLy8gbW92ZWQgZm9sbG93aW5nIGxpbmUgdG8gJ2RvY3VtZW50IGNoYW5nZWQnIHNvCi0JCQkvLyB0aGUgImxhc3QgZXZlbnQiIGNhbiBiZQotCQkJLy8gcmUtZHJhd24gYWZ0ZXIgcGVuZGluZyByZS1kcmF3cwotCQkJLy8gbGFzdEV2ZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgdGV4dCByZXBsYWNlIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxheVRleHRDaGFuZ2VkKCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJOT1QgcmVsYXlpbmcgdGV4dCBjaGFuZ2VkICgiICsgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVsYXlpbmcgdGV4dCBjaGFuZ2VkICgiICsgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZpbmFsIFRleHRDaGFuZ2VkRXZlbnQgdGV4dENoYW5nZWRFdmVudCA9IG5ldyBUZXh0Q2hhbmdlZEV2ZW50KHRoaXMpOwotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UKLQkJLy8gdGhlIGFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZQotCQkvLyBsaXN0ZW5lciBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0KLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZUZXh0Q2hhbmdlTGlzdGVuZXJzOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RlbmVycwotCQkJCQkJLy8gcmVxdWlyZXMgYSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJCSgoVGV4dENoYW5nZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS50ZXh0Q2hhbmdlZCh0ZXh0Q2hhbmdlZEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQkJcmVkcmF3VGV4dENoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZW5kcyBhIHRleHQgY2hhbmdlIHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGF5VGV4dENoYW5naW5nKGludCByZXF1ZXN0ZWRTdGFydCwgaW50IHJlcXVlc3RlZExlbmd0aCwgU3RyaW5nIHJlcXVlc3RlZENoYW5nZSkgewotCi0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJOT1QgcmVsYXlpbmcgdGV4dCBjaGFuZ2luZzogIiArIHJlcXVlc3RlZFN0YXJ0ICsgIjoiICsgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVsYXlpbmcgdGV4dCBjaGFuZ2luZzogIiArIHJlcXVlc3RlZFN0YXJ0ICsgIjoiICsgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWxhc3RFdmVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBUZXh0Q2hhbmdpbmdFdmVudCB0ZXh0Q2hhbmdpbmdFdmVudCA9IG5ldyBUZXh0Q2hhbmdpbmdFdmVudCh0aGlzKTsKLQotCQkJdGV4dENoYW5naW5nRXZlbnQuc3RhcnQgPSByZXF1ZXN0ZWRTdGFydDsKLQkJCXRleHRDaGFuZ2luZ0V2ZW50LnJlcGxhY2VDaGFyQ291bnQgPSByZXF1ZXN0ZWRMZW5ndGg7Ci0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5uZXdDaGFyQ291bnQgPSAocmVxdWVzdGVkQ2hhbmdlID09IG51bGwgPyAwIDogcmVxdWVzdGVkQ2hhbmdlLmxlbmd0aCgpKTsKLQkJCXRleHRDaGFuZ2luZ0V2ZW50LnJlcGxhY2VMaW5lQ291bnQgPSBnZXREb2N1bWVudCgpLmdldE51bWJlck9mTGluZXMocmVxdWVzdGVkU3RhcnQsIHJlcXVlc3RlZExlbmd0aCkgLSAxOwotCQkJdGV4dENoYW5naW5nRXZlbnQubmV3VGV4dCA9IHJlcXVlc3RlZENoYW5nZTsKLQkJCXRleHRDaGFuZ2luZ0V2ZW50Lm5ld0xpbmVDb3VudCA9IChyZXF1ZXN0ZWRDaGFuZ2UgPT0gbnVsbCA/IDAgOiBnZXREb2N1bWVudCgpLmNvbXB1dGVOdW1iZXJPZkxpbmVzKHJlcXVlc3RlZENoYW5nZSkpOwotCi0JCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsCi0JCQkvLyBzaW5jZSB0aGUgYWRkIGFuZCByZW1vdmUgbGlzdG5lcgotCQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlCi0JCQkvLyBsaXN0ZW5lciBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCQlUZXh0Q2hhbmdlTGlzdGVuZXJbXSBob2xkTGlzdGVuZXJzID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnM7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZQotCQkJCQkJCS8vIGFkZExpc3RlbmVycyByZXF1aXJlcyBhCi0JCQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCQkJaG9sZExpc3RlbmVyc1tpXS50ZXh0Q2hhbmdpbmcodGV4dENoYW5naW5nRXZlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZW5kcyBhIHRleHQgc2V0IGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy4gV2lkZ2V0IHNob3VsZAotCSAqIHJlZHJhdyBpdHNlbGYgYXV0b21hdGljYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxheVRleHRTZXQoKSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5PVCByZWxheWluZyB0ZXh0IHNldCAoIiArIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbGF5aW5nIHRleHQgc2V0ICgiICsgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWxhc3RFdmVudCA9IG51bGw7Ci0JCWZpbmFsIFRleHRDaGFuZ2VkRXZlbnQgdGV4dENoYW5nZWRFdmVudCA9IG5ldyBUZXh0Q2hhbmdlZEV2ZW50KHRoaXMpOwotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UKLQkJLy8gdGhlIGFkZCBhbmQgcmVtb3ZlIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlCi0JCS8vIGxpc3RlbmVyIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJVGV4dENoYW5nZUxpc3RlbmVyW10gaG9sZExpc3RlbmVycyA9IGZUZXh0Q2hhbmdlTGlzdGVuZXJzOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWhvbGRMaXN0ZW5lcnNbaV0udGV4dFNldCh0ZXh0Q2hhbmdlZEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQjcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoZmluYWwgVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJaWYgKChmVGV4dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZQotCQkJLy8gcmVxdWVzdAotCQkJaWYgKCFVdGlsaXRpZXMuY29udGFpbnMoZlRleHRDaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyOjpyZW1vdmVUZXh0Q2hhbmdlZExpc3RlbmVycy4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgbm90IHByZXNlbnQuICIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXI6OmFkZFRleHRDaGFuZ2VkTGlzdGVuZXJzLiBSZW1vdmluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiB0ZXh0IGFkYXB0ZXIuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWZpbmFsIGludCBvbGRTaXplID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJZmluYWwgVGV4dENoYW5nZUxpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IFRleHRDaGFuZ2VMaXN0ZW5lcltuZXdTaXplXTsKLQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnNbaV0gIT0gbGlzdGVuZXIpIHsKLQkJCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlCi0JCQkJCQkJCS8vIG9uZSB3ZSBhcmUgcmVtb3ZpbmcKLQkJCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnNbaV07Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzCi0JCQkJLy8gc3dpdGNoIGl0IGZvciB0aGUgb2xkIG9uZQotCQkJCWZUZXh0Q2hhbmdlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgdGV4dCB3aXRoICJuZXdUZXh0IiBzdGFydGluZyBhdCBwb3NpdGlvbiAic3RhcnQiIGZvciBhCi0JICogbGVuZ3RoIG9mICJyZXBsYWNlTGVuZ3RoIi4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRvcnMgaGF2ZSB0byBub3RpZnkgVGV4dENoYW5nZWQgbGlzdGVuZXJzIGFmdGVyIHRoZSBjb250ZW50IGhhcwotCSAqIGJlZW4gdXBkYXRlZC4gVGhlIFRleHRDaGFuZ2VkRXZlbnQgc2hvdWxkIGJlIHNldCBhcyBmb2xsb3dzOgotCSAqIDx1bD4KLQkgKiA8bGk+ZXZlbnQudHlwZSA9IFNXVC5UZXh0UmVwbGFjZWQKLQkgKiA8bGk+ZXZlbnQuc3RhcnQgPSBzdGFydCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIDxsaT5ldmVudC5udW1SZXBsYWNlZExpbmVzID0gbnVtYmVyIG9mIHJlcGxhY2VkIGxpbmVzCi0JICogPGxpPmV2ZW50Lm51bU5ld0xpbmVzID0gbnVtYmVyIG9mIG5ldyBsaW5lcwotCSAqIDxsaT5ldmVudC5yZXBsYWNlZExlbmd0aCA9IGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIDxsaT5ldmVudC5uZXdMZW5ndGggPSBsZW5ndGggb2YgdGhlIG5ldyB0ZXh0Ci0JICogPC91bD4KLQkgKiA8Yj5OT1RFOiA8L2I+IG51bU5ld0xpbmVzIGlzIHRoZSBudW1iZXIgb2YgaW5zZXJ0ZWQgbGluZXMgYW5kCi0JICogbnVtUmVwbGFjZWRMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGRlbGV0ZWQgbGluZXMgYmFzZWQgb24gdGhlIGNoYW5nZQotCSAqIHRoYXQgb2NjdXJzIHZpc3VhbGx5LiBGb3IgZXhhbXBsZToKLQkgKiA8dWw+Ci0JICogPGxpPihyZXBsYWNlZFRleHQsIG5ld1RleHQpID09PiAobnVtUmVwbGFjZWRMaW5lcywgbnVtTmV3TGluZXMpCi0JICogPGxpPigiIiwgIlxuIikgPT0+ICgwLCAxKQotCSAqIDxsaT4oIlxuXG4iLCAiYSIpID09PiAoMiwgMCkKLQkgKiA8bGk+KCJhIiwgIlxuXG4iKSA9PT4gKDAsIDIpCi0JICogPGxpPigiXG4iLCAiIikgPT0+ICgxLCAwKQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZSwgbm9uZSBvZiB0aGUgb2Zmc2V0cyBpbmNsdWRlCi0JICogICAgICAgICAgICBkZWxpbWl0ZXJzIG9mIHByZWNlZWRpbmcgbGluZXMsIG9mZnNldCAwIGlzIHRoZSBmaXJzdAotCSAqICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBkb2N1bWVudAotCSAqIEBwYXJhbSByZXBsYWNlTGVuZ3RoCi0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dFJhbmdlKGludCBzdGFydCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0KLQkJaWYgKGdldFBhcmVudERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyB0aGUgc3RydWN0dXJlZERvY3VtZW50IGluaXRpYXRlcyB0aGUgImNoYW5naW5nIgotCQkJLy8gYW5kICJjaGFuZ2VkIiBldmVudHMuCi0JCQkvLyB0aGV5IGFyZSBib3RoIGZpcmVkIGJ5IHRoZSB0aW1lIHRoaXMgbWV0aG9kCi0JCQkvLyByZXR1cm5zLgotCQkJSVJlZ2lvbiByZWdpb24gPSBnZXRQcm9qZWN0aW9uVG9NYXN0ZXJSZWdpb24obmV3IFJlZ2lvbihzdGFydCwgcmVwbGFjZUxlbmd0aCkpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBnZXRQYXJlbnREb2N1bWVudCgpKS5yZXBsYWNlVGV4dCh0aGlzLCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgdGV4dCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIGRlZmF1bHQgaXMgdG8ganVzdCB0cnkgYW5kIHJlcGxhY2UgdGV4dCByYW5nZSBpbiBjdXJyZW50IGRvY3VtZW50Ci0JCXRyeSB7Ci0JCQlnZXREb2N1bWVudCgpLnJlcGxhY2Uoc3RhcnQsIHJlcGxhY2VMZW5ndGgsIHRleHQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXJFeHRlbnNpb24jcmVzdW1lRm9yd2FyZGluZ0RvY3VtZW50Q2hhbmdlcygpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lRm9yd2FyZGluZ0RvY3VtZW50Q2hhbmdlcygpIHsKLQotCQkvLyBmcm9tIHJlLXJlYWRpbmcgdGhlIHRleHRTZXQgQVBJIGluIFN0eWxlZFRleHQsIHdlCi0JCS8vIG11c3QgY2FsbAotCQkvLyB0ZXh0U2V0IGlmIGFsbCB0aGUgY29udGVudHMgY2hhbmdlZC4gSWYgYWxsIHRoZQotCQkvLyBjb250ZW50cyBkaWQKLQkJLy8gbm90IGNoYW5nZSwgd2UgbmVlZCB0byBjYWxsIHRoZSBwYWlyIG9mIEFQSXMsCi0JCS8vIHRleHRDaGFuZ2luZyBhbmQKLQkJLy8gdGV4dENoYW5nZWQuIFNvLCBpZiB3ZSBldmVyIGtlZXAgY2FyZWZ1bCB0cmFjayBvZgotCQkvLyBjaGFuZ2VzCi0JCS8vIGR1cmluZyBzdG9wIGZvcndhcmRpbmcgYW5kIHJlc3VtZSBmb3J3YXJkaW5nLCB3ZQotCQkvLyBjYW4KLQkJLy8gaW52ZXN0aWdhdGUgY2hhbmdlIG1ha2UgdXNlIG9mIHRoZSBwYWlyIG9mIEFQSXMuCi0JCWZTdG9wUmVsYXlpbmdDaGFuZ2VzUmVxdWVzdHMtLTsKLQkJaWYgKGZTdG9wUmVsYXlpbmdDaGFuZ2VzUmVxdWVzdHMgPT0gMCkgewotCQkJLy8gZklzRm9yd2FyZGluZz0gdHJ1ZTsKLQkJCWZEb2N1bWVudENsb25lID0gbnVsbDsKLQkJCWZPcmlnaW5hbENvbnRlbnQgPSBudWxsOwotCQkJZk9yaWdpbmFsTGluZURlbGltaXRlcnMgPSBudWxsOwotCQkJLy8gZmlyZVRleHRTZXQoKTsKLQkJCXJlbGF5VGV4dFNldCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyAnUnVubmFibGUnIHNob3VsZCBiZSB2ZXJ5IGJyaWVmLCBhbmQgc2hvdWxkIG5vdCAiY2FsbCBvdXQiIHRvCi0JICogb3RoZXIgY29kZSB3aGljaCBpdHNlbGYgbWlnaHQgY2FsbCBzeW5jRXhlYywgb3IgZGVhZGxvY2sgbWlnaHQgb2NjdXIuCi0JICogCi0JICogQHBhcmFtIHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKFJ1bm5hYmxlIHIpIHsKLQkJLy8gaWYgdGhlcmUgaXMgbm8gRGlzcGxheSBhdCBhbGwgKHRoYXQgaXMsIHJ1bm5pbmcgaGVhZGxlc3MpLAotCQkvLyBvciBpZiB3ZSBhcmUgYWxyZWFkeSBydW5uaW5nIG9uIHRoZSBkaXNwbGF5IHRocmVhZCwgdGhlbgotCQkvLyBzaW1wbHkgZXhlY3V0ZSB0aGUgcnVubmFibGUuCi0JCWlmIChnZXREaXNwbGF5KCkgPT0gbnVsbCB8fCAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBnZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkpKSB7Ci0JCQlyLnJ1bigpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gb3RoZXJ3aXNlIGZvcmNlIHRoZSBydW5uYWJsZSB0byBydW4gb24gdGhlIGRpc3BsYXkgdGhyZWFkLgotCQkJLy8KLQkJCS8vIEl0cyB1bmNsZWFyIGlmIHdlIG5lZWQgdGhpcyBhdCBhbGwsIG9uY2UKLQkJCS8vIHdlICJmb3JjZSIgZG9jdW1lbnQgdXBkYXRlIHRvIGFsd2F5cyB0YWtlIHBsYWNlIG9uIGRpc3BsYXkKLQkJCS8vIHRocmVhZC4KLQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElMb2NrYWJsZSkgewotCi0JCQkJSUxvY2sgbG9jayA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9jayA9ICgoSUxvY2thYmxlKSBkb2MpLmdldExvY2tPYmplY3QoKTsKLQkJCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJCWdldERpc3BsYXkoKS5zeW5jRXhlYyhyKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChsb2NrICE9IG51bGwpIHsKLQkJCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZWxzZSwgaWdub3JlISwgc2luY2UgcmlzayBvZiBkZWFkbG9jawotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vbiBsb2NrYWJsZSBkb2N1bWVudCB1c2VkIGZvciBzdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCi0JCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkucmVtb3ZlUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKGludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQkJbGFzdEV2ZW50ID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgUHJvamVjdGlvbkRvY3VtZW50KSB7Ci0JCQlmQ2hpbGREb2N1bWVudCA9IChQcm9qZWN0aW9uRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJX3NldERvY3VtZW50KGZDaGlsZERvY3VtZW50LmdldE1hc3RlckRvY3VtZW50KCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZkNoaWxkRG9jdW1lbnQgPSBudWxsOwotCQkJX3NldERvY3VtZW50KGRvY3VtZW50KTsKLQkJfQotCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlnZXREb2N1bWVudCgpLmFkZFByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihpbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjc2V0VGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cmluZykgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlmRG9jdW1lbnRDbG9uZSA9IG51bGw7Ci0JCQlmT3JpZ2luYWxDb250ZW50ID0gZ2V0RG9jdW1lbnQoKS5nZXQoKTsKLQkJCWZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzID0gZ2V0RG9jdW1lbnQoKS5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0UGFyZW50RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0RG9jdW1lbnQoKSkuc2V0VGV4dCh0aGlzLCBzdHJpbmcpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2V0RG9jdW1lbnQoKS5zZXQoc3RyaW5nKTsKLQkJfQotCQlyZWxheVRleHRTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgYWRkZWQgdG8gbWFrZSB0ZXN0aW5nIGVhc2llci4gTm9ybWFsbHksIHRoZSB3aWRnZXQgaXMKLQkgKiBzcGVjaWZpZWQgb24gdGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZGdldChTdHlsZWRUZXh0IHdpZGdldCkgewotCi0JCWZTdHlsZWRUZXh0V2lkZ2V0ID0gd2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRBZGFwdGVyRXh0ZW5zaW9uI3N0b3BGb3J3YXJkaW5nRG9jdW1lbnRDaGFuZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wRm9yd2FyZGluZ0RvY3VtZW50Q2hhbmdlcygpIHsKLQotCQlmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzKys7Ci0JCS8vIG9ubHkgbmVlZCB0byB0YWtlIHNuYXBzaG90IG9uIGZpcnN0IHJlcXVlc3QKLQkJaWYgKGZTdG9wUmVsYXlpbmdDaGFuZ2VzUmVxdWVzdHMgPT0gMSkgewotCQkJZkRvY3VtZW50Q2xvbmUgPSBudWxsOwotCQkJZk9yaWdpbmFsQ29udGVudCA9IGdldERvY3VtZW50KCkuZ2V0KCk7Ci0JCQlmT3JpZ2luYWxMaW5lRGVsaW1pdGVycyA9IGdldERvY3VtZW50KCkuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRMaW5lQ2hhbmdlSG92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkTGluZUNoYW5nZUhvdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWRjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRMaW5lQ2hhbmdlSG92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5MaW5lQ2hhbmdlSG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRXNjYXBlcyBkaWZmIGhvdmVyIHByZXNlbnRhdGlvbiB0ZXh0IChjb252ZXJ0cyA8IHRvICZsdDsgPiB0byAmZ3Q7IGV0Yy4uLikKLSAqIHNvIHRoYXQgaHRtbCBpbiB0aGUgZGlmZiBmaWxlIChkaXNwbGF5ZWQgaW4gaG92ZXIpIGlzbid0IHByZXNlbnRlZCBhcyBzdHlsZQotICogKGJvbGQsIGl0YWxpYywgY29sb3JzLCBldGMuLi4pCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkTGluZUNoYW5nZUhvdmVyIGV4dGVuZHMgTGluZUNoYW5nZUhvdmVyIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uSG92ZXJFeHRlbnNpb24jZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpCi0JICovCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEhvdmVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCS8vIHVzZSB0aGUgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIGNyZWF0b3IgdGhhdCBqdXN0IGRpc3BsYXlzIHRleHQKLQkJLy8gYXMgdGV4dCwgbm90IGh0bWwgY29udGVudAotCQkvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHNwZWNpYWwgaHRtbCB0aGF0IHNob3VsZCBiZSBwcmVzZW50ZWQgd2hlbiBqdXN0Ci0JCS8vIHNob3dpbmcgZGlmZgotCQkvLyBpbiB0aGUgZnV0dXJlLCBzb3VyY2V2aWV3ZXIgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIHBsYWluCi0JCS8vIHRleHQgY29udHJvbCBsaWtlIGphdmEgdXNlcwotCQkvLyBTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2wKLQkJcmV0dXJuIG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTdiYjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvblByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgb3ZlcnJpZGRlbiB0byBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIG9mIGJlaW5nIHJlZ2lzdGVyZWQgYXMgYQotICogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5wcm9ibGVtbWFya2VyIHJhdGhlciB0aGFuIGEKLSAqIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2UucHJvYmxlbW1hcmtlciBjYXVzaW5nIGFsbCBwcm9ibGVtcyB0byBiZSBza2lwcGVkCi0gKiBpbiB0aGUgT3ZlcnZpZXdSdWxlcgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gZXh0ZW5kcyBNYXJrZXJBbm5vdGF0aW9uIGltcGxlbWVudHMgSUFubm90YXRpb25QcmVzZW50YXRpb24gewotCS8vIGNvbnRyb2xzIGlmIGljb24gc2hvdWxkIGJlIHBhaW50ZWQgZ3JheQotCXByaXZhdGUgYm9vbGVhbiBmSXNHcmF5ZWQgPSBmYWxzZTsKLQlTdHJpbmcgZkFubm90YXRpb25UeXBlID0gbnVsbDsKLQotCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCXN1cGVyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbm5vdGF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGZBbm5vdGF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudHVhbGx5IHdpbGwgaGF2ZSB0byB1c2UgSUFubm90YXRpb25QcmVzZW50YXRpb24gJgotCSAqIElBbm5vdGF0aW9uRXh0ZW5zaW9uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb24jZ2V0SW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKGZBbm5vdGF0aW9uVHlwZSA9PSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SKSB7Ci0JCQlpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOwotCQl9Ci0JCWVsc2UgaWYgKGZBbm5vdGF0aW9uVHlwZSA9PSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkcpIHsKLQkJCWltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJfQotCQllbHNlIGlmIChmQW5ub3RhdGlvblR5cGUgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9JTkZPKSB7Ci0JCQlpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSyk7Ci0JCX0KLQotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpc0dyYXllZCgpKQotCQkJc2V0SW1hZ2UoZ2V0R3JheUltYWdlKGRpc3BsYXksIGltYWdlKSk7Ci0JCWVsc2UKLQkJCXNldEltYWdlKGltYWdlKTsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZGlzcGxheSk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRHcmF5SW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBJbWFnZSBpbWFnZSkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJU3RyaW5nIGtleSA9IEludGVnZXIudG9TdHJpbmcoaW1hZ2UuaGFzaENvZGUoKSk7Ci0JCQkvLyBtYWtlIHN1cmUgd2UgY2FjaGUgdGhlIGdyYXkgaW1hZ2UKLQkJCUltYWdlIGdyYXlJbWFnZSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJCWlmIChncmF5SW1hZ2UgPT0gbnVsbCkgewotCQkJCWdyYXlJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZSwgU1dULklNQUdFX0dSQVkpOwotCQkJCUpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBncmF5SW1hZ2UpOwotCQkJfQotCQkJaW1hZ2UgPSBncmF5SW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzR3JheWVkKCkgewotCQlyZXR1cm4gZklzR3JheWVkOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEdyYXllZChib29sZWFuIGdyYXllZCkgewotCQlmSXNHcmF5ZWQgPSBncmF5ZWQ7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb24ncyBpY29uIHJlcHJlc2VudGF0aW9uIGFuZCBpdHMgZHJhd2luZyBsYXllcgotCSAqIGJhc2VkIHVwb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHVuZGVybHlpbmcgbWFya2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBbm5vdGF0aW9uVHlwZSgpIHsKLQotCQlJTWFya2VyIG1hcmtlciA9IGdldE1hcmtlcigpOwotCQlmQW5ub3RhdGlvblR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1VOS05PV047Ci0JCXRyeSB7Ci0JCQlpZiAobWFya2VyLmlzU3VidHlwZU9mKElNYXJrZXIuUFJPQkxFTSkpIHsKLQkJCQlpbnQgc2V2ZXJpdHkgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQlzd2l0Y2ggKHNldmVyaXR5KSB7Ci0JCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUiA6Ci0JCQkJCQlmQW5ub3RhdGlvblR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HIDoKLQkJCQkJCWZBbm5vdGF0aW9uVHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTyA6Ci0JCQkJCQlmQW5ub3RhdGlvblR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0lORk87Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmNWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50Q29uc3RhbnRzOwotCi0KLS8qKgotICogU291cmNlIGVkaXRvciByZXNvdXJjZSBtYXJrZXIgYW5ub3RhdGlvbiBtb2RlbCBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsIGV4dGVuZHMgUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFQ09OREFSWV9JRF9LRVkgPSBJQnJlYWtwb2ludENvbnN0YW50cy5SRVNPVVJDRV9QQVRIOwotCXByb3RlY3RlZCBJUmVzb3VyY2UgZk1hcmtlclJlc291cmNlOwotCXByb3RlY3RlZCBTdHJpbmcgZlNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlcihyZXNvdXJjZSk7Ci0JCWZNYXJrZXJSZXNvdXJjZSA9IHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgc2Vjb25kYXJ5SUQpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQlmTWFya2VyUmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJZlNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlID0gc2Vjb25kYXJ5SUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsI2NyZWF0ZU1hcmtlckFubm90YXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwcm90ZWN0ZWQgTWFya2VyQW5ub3RhdGlvbiBjcmVhdGVNYXJrZXJBbm5vdGF0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgaWYgbWFya2VyIGlzIGEgdmFsaWRhdGlvbgotCQkgKiAoYWthIHByb2JsZW0pIG1hcmtlciBvciBpZiBtYXJrZXIgaXMgYSBicmVha3BvaW50IG1hcmtlciBzbyBjcmVhdGUKLQkJICogYSBzcGVjaWFsIG1hcmtlciBhbm5vdGF0aW9uIGZvciB0aG9zZSBtYXJrZXJzLiBPdGhlcndpc2UsIHVzZQotCQkgKiBkZWZhdWx0LgotCQkgKi8KLQkJaWYgKE1hcmtlclV0aWxpdGllcy5pc01hcmtlclR5cGUobWFya2VyLCBJTWFya2VyLlBST0JMRU0pKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKG1hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZU1hcmtlckFubm90YXRpb24obWFya2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwjZ2V0TWFya2VyUG9zaXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb24gZ2V0TWFya2VyUG9zaXRpb24oSU1hcmtlciBtYXJrZXIpIHsKLQkJUG9zaXRpb24gcG9zID0gc3VwZXIuZ2V0TWFya2VyUG9zaXRpb24obWFya2VyKTsKLQotCQkvLyBpZiAoKHBvcyA9PSBudWxsIHx8IHBvcy5nZXRMZW5ndGgoKSA9PSAwKSAmJiBtYXJrZXIuZ2V0VHlwZSgpID09Ci0JCS8vIElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCkgewotCQlpZiAocG9zID09IG51bGwgfHwgcG9zLmdldExlbmd0aCgpID09IDApIHsKLQkJCS8vIFdlIHByb2JhYmx5IHNob3VsZCBjcmVhdGUgcG9zaXRpb24gZnJvbSBtYXJrZXIgaWYgbWFya2VyCi0JCQkvLyBhdHRyaWJ1dGVzIHNwZWNpZnkgYSB2YWxpZCBwb3NpdGlvbgotCQkJcG9zID0gY3JlYXRlUG9zaXRpb25Gcm9tTWFya2VyKG1hcmtlcik7Ci0JCX0KLQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCNpc0FjY2VwdGFibGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjY2VwdGFibGUoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdHRyID0gbWFya2VyLmdldEF0dHJpYnV0ZShJQnJlYWtwb2ludENvbnN0YW50cy5BVFRSX0hJRERFTik7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoQm9vbGVhbikgYXR0cikuZXF1YWxzKEJvb2xlYW4uVFJVRSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQkJaWYgKGZTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLmlzQWNjZXB0YWJsZShtYXJrZXIpOwotCQlTdHJpbmcgbWFya2VyU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFNFQ09OREFSWV9JRF9LRVksICIiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGlzU2FtZUZpbGUgPSBmU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWUuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZSk7Ci0JCXJldHVybiBzdXBlci5pc0FjY2VwdGFibGUobWFya2VyKSAmJiBpc1NhbWVGaWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDQ3NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5OwotCi0vKioKLSAqIAotICogQGF1dGhvciBuc2QKLSAqIAotICogVXNlZCBieSB0aGUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiBleHRlbnNpb24KLSAqIHBvaW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IGV4dGVuZHMgUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklBbm5vdGF0aW9uTW9kZWxGYWN0b3J5I2NyZWF0ZUFubm90YXRpb25Nb2RlbChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKElQYXRoIGxvY2F0aW9uKSB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQltb2RlbCA9IG5ldyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwoZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltb2RlbCA9IG5ldyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgbG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDNlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdNb2RlbFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSG92ZXIgewotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBzZXQgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcgSFRNTCBwYWdlcy4gVGFrZW4KLQkgKiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkhUTUxQcmludGVyCi0JICovCi0JY2xhc3MgSFRNTFByaW50ZXIgewotCi0JCUhUTUxQcmludGVyKCkgewotCQl9Ci0KLQkJdm9pZCBhZGRCdWxsZXQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGJ1bGxldCkgewotCQkJaWYgKGJ1bGxldCAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiPGxpPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChidWxsZXQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXZvaWQgYWRkUGFnZUVwaWxvZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8L2ZvbnQ+PC9ib2R5PjwvaHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdm9pZCBhZGRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJCWluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBidWZmZXIubGVuZ3RoKCkpOwotCQl9Ci0KLQkJdm9pZCBhZGRQYXJhZ3JhcGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgUmVhZGVyIHBhcmFncmFwaFJlYWRlcikgewotCQkJaWYgKHBhcmFncmFwaFJlYWRlciAhPSBudWxsKQotCQkJCWFkZFBhcmFncmFwaChidWZmZXIsIHJlYWQocGFyYWdyYXBoUmVhZGVyKSk7Ci0JCX0KLQotCQl2b2lkIGFkZFBhcmFncmFwaChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgcGFyYWdyYXBoKSB7Ci0JCQlpZiAocGFyYWdyYXBoICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCI8cD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQocGFyYWdyYXBoKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgYWRkU21hbGxIZWFkZXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGhlYWRlcikgewotCQkJaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiPGg1PiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChoZWFkZXIpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIjwvaDU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBjb252ZXJ0VG9IVE1MQ29udGVudChTdHJpbmcgY29udGVudCkgewotCQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgJzwnLCAiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVwbGFjZShjb250ZW50LCAnPicsICImZ3Q7Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXZvaWQgZW5kQnVsbGV0TGlzdChTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8L3VsPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uKSB7Ci0JCQlidWZmZXIuaW5zZXJ0KHBvc2l0aW9uLCAiPGh0bWw+PGJvZHkgdGV4dD1cIiMwMDAwMDBcIiBiZ2NvbG9yPVwiI0ZGRkY4OFwiPjxmb250IHNpemU9LTE+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyByZWFkKFJlYWRlciByZCkgewotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQotCQkJdHJ5IHsKLQkJCQlpbnQgbiA9IHJkLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJCW4gPSByZC5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCX0KLQkJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHRleHQsIGNoYXIgYywgU3RyaW5nIHMpIHsKLQotCQkJaW50IHByZXZpb3VzID0gMDsKLQkJCWludCBjdXJyZW50ID0gdGV4dC5pbmRleE9mKGMsIHByZXZpb3VzKTsKLQotCQkJaWYgKGN1cnJlbnQgPT0gLTEpCi0JCQkJcmV0dXJuIHRleHQ7Ci0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl3aGlsZSAoY3VycmVudCA+IC0xKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhwcmV2aW91cywgY3VycmVudCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQocyk7Ci0JCQkJcHJldmlvdXMgPSBjdXJyZW50ICsgMTsKLQkJCQljdXJyZW50ID0gdGV4dC5pbmRleE9mKGMsIHByZXZpb3VzKTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcocHJldmlvdXMpKTsKLQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJdm9pZCBzdGFydEJ1bGxldExpc3QoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQkJYnVmZmVyLmFwcGVuZCgiPHVsPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIElEZWJ1Z01vZGVsUHJlc2VudGF0aW9uIGZEZWJ1Z01vZGVsUHJlc2VudGF0aW9uOwotCi0JcHJpdmF0ZSBIVE1MUHJpbnRlciBwcmludGVyID0gbmV3IEhUTUxQcmludGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSB0byB0aGUgcnVsZXIgbGluZS4KLQkgKi8KLQlwcml2YXRlIGludCBjb21wYXJlUnVsZXJMaW5lKFBvc2l0aW9uIHBvc2l0aW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBsaW5lKSB7Ci0KLQkJaWYgKHBvc2l0aW9uLmdldE9mZnNldCgpID4gLTEgJiYgcG9zaXRpb24uZ2V0TGVuZ3RoKCkgPiAtMSkgewotCQkJdHJ5IHsKLQkJCQlpbnQgbWFya2VyTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJaWYgKGxpbmUgPT0gbWFya2VyTGluZSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJaWYgKG1hcmtlckxpbmUgPD0gbGluZSAmJiBsaW5lIDw9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbi5nZXRPZmZzZXQoKSArIHBvc2l0aW9uLmdldExlbmd0aCgpKSkKLQkJCQkJcmV0dXJuIDI7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBGb3JtYXRzIHRoZSBtZXNzYWdlIG9mIHRoaXMgaG92ZXIgdG8gZml0IG9udG8gdGhlIHNjcmVlbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRIb3ZlclRleHQoU3RyaW5nIHRleHQsIElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgbGluZURlbGltID0gbmV3IFN0cmluZygpOwotCQl0cnkgewotCQkJbGluZURlbGltID0gc291cmNlVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigwKTsKLQkJfQotCQljYXRjaCAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIHNraXAsIGp1c3QgdXNlIGRlZmF1bHQKLQkJfQotCQlEaXNwbGF5IGRpc3BsYXkgPSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldERpc3BsYXkoKTsKLQotCQkvLyByZXBsYWNlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0ZXh0IHdpdGggaHRtbCBlbnRpdHkgKGxpa2UgPCwgPiwgJgotCQkvLyB0byAmbHQ7LCAmZ3Q7LCAmJjspCi0JCXRleHQgPSBTdHJpbmdVdGlscy5jb252ZXJ0VG9IVE1MQ29udGVudCh0ZXh0KTsKLQotCQlSZWFkZXIgdGV4dFJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIodGV4dCk7Ci0JCUdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOwotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQkJU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyKHRleHRSZWFkZXIsIGdjLCBnZXRIb3ZlcldpZHRoKGRpc3BsYXkpKTsKLQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQl3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGJ1Zi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCWJ1Zi5hcHBlbmQobGluZURlbGltKTsKLQkJCQl9Ci0JCQkJYnVmLmFwcGVuZChsaW5lKTsKLQkJCQlsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEZvcm1hdHMgc2V2ZXJhbCBtZXNzYWdlIGFzIEhUTUwgdGV4dC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRNdWx0aXBsZUhvdmVyVGV4dChMaXN0IG1lc3NhZ2VzKSB7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcHJpbnRlci5hZGRQYWdlUHJvbG9nKGJ1ZmZlcik7Ci0JCXByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgU1NFVUlNZXNzYWdlcy5NdWx0aXBsZV9lcnJvcnMpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJpbnRlci5zdGFydEJ1bGxldExpc3QoYnVmZmVyKTsKLQkJSXRlcmF0b3IgZSA9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkKLQkJCXByaW50ZXIuYWRkQnVsbGV0KGJ1ZmZlciwgcHJpbnRlci5jb252ZXJ0VG9IVE1MQ29udGVudCgoU3RyaW5nKSBlLm5leHQoKSkpOwotCQlwcmludGVyLmVuZEJ1bGxldExpc3QoYnVmZmVyKTsKLQotCQlwcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZlcnRpY2FsUnVsZXJIb3ZlciNnZXRIb3ZlckluZm8oSVNvdXJjZVZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBpbnQgbGluZU51bWJlcikgewotCQlJTWFya2VyIG1hcmtlciA9IGdldE1hcmtlcihzb3VyY2VWaWV3ZXIsIGxpbmVOdW1iZXIpOwotCQlMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdChtYXJrZXIgPT0gbnVsbCA/IDAgOiAxKTsKLQkJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAoU3RyaW5nKSBudWxsKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQodGV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0cnkgewotCQkJCQlpZiAobWFya2VyLmlzU3VidHlwZU9mKElCcmVha3BvaW50LkJSRUFLUE9JTlRfTUFSS0VSKSkgewotCQkJCQkJSUJyZWFrcG9pbnRNYW5hZ2VyIG1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJCQkJCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBtYW5hZ2VyLmdldEJyZWFrcG9pbnRzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJSUJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IGJyZWFrcG9pbnRzW2ldOwotCQkJCQkJCWlmIChicmVha3BvaW50LmdldE1hcmtlcigpLmVxdWFscyhtYXJrZXIpKSB7Ci0JCQkJCQkJCWlmIChmRGVidWdNb2RlbFByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJCQlmRGVidWdNb2RlbFByZXNlbnRhdGlvbiA9IERlYnVnVUlUb29scy5uZXdEZWJ1Z01vZGVsUHJlc2VudGF0aW9uKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJdGV4dCA9IGZEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmdldFRleHQoYnJlYWtwb2ludCk7Ci0JCQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJCW1lc3NhZ2VzLmFkZCh0ZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3QgdGVtcG9yYXJ5QW5ub3RhdGlvbnMgPSBnZXRUZW1wb3JhcnlBbm5vdGF0aW9uc0ZvckxpbmUoc291cmNlVmlld2VyLCBsaW5lTnVtYmVyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wb3JhcnlBbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAoKEFubm90YXRpb24pIHRlbXBvcmFyeUFubm90YXRpb25zLmdldChpKSkuZ2V0VGV4dCgpOwotCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZHVwbGljYXRlZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWVzc2FnZXMuc2l6ZSgpOyBqKyspCi0JCQkJCWR1cGxpY2F0ZWQgPSBkdXBsaWNhdGVkIHx8IG1lc3NhZ2VzLmdldChqKS5lcXVhbHMobWVzc2FnZSk7Ci0JCQkJaWYgKCFkdXBsaWNhdGVkKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCQltZXNzYWdlcy5hZGQoKChJVGVtcG9yYXJ5QW5ub3RhdGlvbikgdGVtcG9yYXJ5QW5ub3RhdGlvbnMuZ2V0KGkpKS50b1N0cmluZygpKTsKLQkJfQotCQlpZiAobWVzc2FnZXMuc2l6ZSgpID4gMSkKLQkJCXJldHVybiBmb3JtYXRNdWx0aXBsZUhvdmVyVGV4dChtZXNzYWdlcyk7Ci0JCWVsc2UgaWYgKG1lc3NhZ2VzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gZm9ybWF0SG92ZXJUZXh0KG1lc3NhZ2VzLmdldCgwKS50b1N0cmluZygpLCBzb3VyY2VWaWV3ZXIpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRIb3ZlcldpZHRoKERpc3BsYXkgZGlzcGxheSkgewotCQlSZWN0YW5nbGUgZGlzcGxheUJvdW5kcyA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JCWludCBob3ZlcldpZHRoID0gZGlzcGxheUJvdW5kcy53aWR0aCAtIChkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCkueCAtIGRpc3BsYXlCb3VuZHMueCk7Ci0JCWhvdmVyV2lkdGggLT0gMTI7IC8vIFhYWDogQWRkIHNvbWUgc3BhY2UgdG8gdGhlIGJvcmRlciwgUmV2aXNpdAotCQlpZiAoaG92ZXJXaWR0aCA8IDIwMCkgewotCQkJaG92ZXJXaWR0aCA9IDIwMDsKLQkJfQotCQlyZXR1cm4gaG92ZXJXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBtYXJrZXIgd2hpY2ggaW5jbHVkZXMgdGhlIHJ1bGVyJ3MgbGluZSBvZiBhY3Rpdml0eS4KLQkgKi8KLQlwcml2YXRlIElNYXJrZXIgZ2V0TWFya2VyKElTb3VyY2VWaWV3ZXIgdmlld2VyLCBpbnQgbGluZSkgewotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gdmlld2VyLmdldEFubm90YXRpb25Nb2RlbCgpOwotCi0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTGlzdCBleGFjdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbmNsdWRpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSXRlcmF0b3IgZSA9IG1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gZS5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24pIHsKLQkJCQlNYXJrZXJBbm5vdGF0aW9uIGEgPSAoTWFya2VyQW5ub3RhdGlvbikgbzsKLQkJCQlzd2l0Y2ggKGNvbXBhcmVSdWxlckxpbmUobW9kZWwuZ2V0UG9zaXRpb24oYSksIGRvY3VtZW50LCBsaW5lKSkgewotCQkJCQljYXNlIDEgOgotCQkJCQkJZXhhY3QuYWRkKGEuZ2V0TWFya2VyKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMiA6Ci0JCQkJCQlpbmNsdWRpbmcuYWRkKGEuZ2V0TWFya2VyKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNlbGVjdChleGFjdCwgaW5jbHVkaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBtYXJrZXIgd2hpY2ggaW5jbHVkZXMgdGhlIHJ1bGVyJ3MgbGluZSBvZiBhY3Rpdml0eS4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VGVtcG9yYXJ5QW5ub3RhdGlvbnNGb3JMaW5lKElTb3VyY2VWaWV3ZXIgdmlld2VyLCBpbnQgbGluZSkgewotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gdmlld2VyLmdldEFubm90YXRpb25Nb2RlbCgpOwotCi0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTGlzdCBleGFjdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbmNsdWRpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSXRlcmF0b3IgZSA9IG1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gZS5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJSVRlbXBvcmFyeUFubm90YXRpb24gYSA9IChJVGVtcG9yYXJ5QW5ub3RhdGlvbikgbzsKLQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IG1vZGVsLmdldFBvc2l0aW9uKChBbm5vdGF0aW9uKSBhKTsKLQkJCQlpZiAocG9zaXRpb24gPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlzd2l0Y2ggKGNvbXBhcmVSdWxlckxpbmUocG9zaXRpb24sIGRvY3VtZW50LCBsaW5lKSkgewotCQkJCQljYXNlIDEgOgotCQkJCQkJZXhhY3QuYWRkKGEpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMiA6Ci0JCQkJCQlpbmNsdWRpbmcuYWRkKGEpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGV4YWN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JUmVsZWFzYWJsZSNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkRlYnVnTW9kZWxQcmVzZW50YXRpb24gIT0gbnVsbCkgewotCQkJZkRlYnVnTW9kZWxQcmVzZW50YXRpb24uZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBvbmUgbWFya2VyIGZyb20gdGhlIHR3byBsaXN0cy4KLQkgKi8KLQlwcml2YXRlIElNYXJrZXIgc2VsZWN0KExpc3QgZmlyc3RDaG9pY2UsIExpc3Qgc2Vjb25kQ2hvaWNlKSB7Ci0JCWlmICghZmlyc3RDaG9pY2UuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChJTWFya2VyKSBmaXJzdENob2ljZS5nZXQoMCk7Ci0JCWlmICghc2Vjb25kQ2hvaWNlLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSU1hcmtlcikgc2Vjb25kQ2hvaWNlLmdldCgwKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0MGZhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi0vKgotICogTm90IGEgcmVhbCByZWFkZXIuIENvdWxkIGNoYW5nZSBpZiByZXF1ZXN0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyIHsKLQlwcml2YXRlIEdDIGZHQzsKLQlwcml2YXRlIGludCBmSW5kZXg7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxpbmU7Ci0JcHJpdmF0ZSBpbnQgZk1heFdpZHRoOwotCi0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRlciB0aGF0IGJyZWFrcyBhbiBpbnB1dCB0ZXh0IHRvIGZpdCBpbiBhIGdpdmVuIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiAgICAgICAgICAgIFJlYWRlciBvZiB0aGUgaW5wdXQgdGV4dAotCSAqIEBwYXJhbSBnYwotCSAqICAgICAgICAgICAgVGhlIGdyYXBoaWMgY29udGV4dCB0aGF0IGRlZmluZXMgdGhlIGN1cnJlbnRseSB1c2VkIGZvbnQKLQkgKiAgICAgICAgICAgIHNpemVzCi0JICogQHBhcmFtIG1heExpbmVXaWR0aAotCSAqICAgICAgICAgICAgVGhlIG1heCB3aWR0aCAocGl4ZXMpIHdoZXJlIHRoZSB0ZXh0IGhhcyB0byBmaXQgaW4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIoUmVhZGVyIHJlYWRlciwgR0MgZ2MsIGludCBtYXhMaW5lV2lkdGgpIHsKLQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotCQlmR0MgPSBnYzsKLQkJZk1heFdpZHRoID0gbWF4TGluZVdpZHRoOwotCQlmTGluZSA9IG51bGw7Ci0JCWZJbmRleCA9IDA7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZE5leHRCcmVha0luZGV4KGludCBjdXJySW5kZXgpIHsKLQkJaW50IGN1cnJXaWR0aCA9IDA7Ci0JCWludCBsaW5lTGVuZ3RoID0gZkxpbmUubGVuZ3RoKCk7Ci0KLQkJd2hpbGUgKGN1cnJJbmRleCA8IGxpbmVMZW5ndGgpIHsKLQkJCWNoYXIgY2ggPSBmTGluZS5jaGFyQXQoY3VyckluZGV4KTsKLQkJCWludCBuZXh0SW5kZXggPSBjdXJySW5kZXggKyAxOwotCQkJLy8gbGVhZGluZyB3aGl0ZXNwYWNlcyBhcmUgY291bnRlZCB0byB0aGUgZm9sbG93aW5nIHdvcmQKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkgewotCQkJCXdoaWxlIChuZXh0SW5kZXggPCBsaW5lTGVuZ3RoICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkxpbmUuY2hhckF0KG5leHRJbmRleCkpKSB7Ci0JCQkJCW5leHRJbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlIChuZXh0SW5kZXggPCBsaW5lTGVuZ3RoICYmICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZMaW5lLmNoYXJBdChuZXh0SW5kZXgpKSkgewotCQkJCW5leHRJbmRleCsrOwotCQkJfQotCQkJU3RyaW5nIHdvcmQgPSBmTGluZS5zdWJzdHJpbmcoY3VyckluZGV4LCBuZXh0SW5kZXgpOwotCQkJaW50IHdvcmRXaWR0aCA9IGZHQy50ZXh0RXh0ZW50KHdvcmQpLng7Ci0JCQlpbnQgbmV4dFdpZHRoID0gd29yZFdpZHRoICsgY3VycldpZHRoOwotCQkJaWYgKG5leHRXaWR0aCA+IGZNYXhXaWR0aCAmJiB3b3JkV2lkdGggPCBmTWF4V2lkdGgpIHsKLQkJCQlyZXR1cm4gY3VyckluZGV4OwotCQkJfQotCQkJY3VycldpZHRoID0gbmV4dFdpZHRoOwotCQkJY3VyckluZGV4ID0gbmV4dEluZGV4OwotCQl9Ci0JCXJldHVybiBjdXJySW5kZXg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZFdvcmRCZWdpbihpbnQgaWR4KSB7Ci0JCXdoaWxlIChpZHggPCBmTGluZS5sZW5ndGgoKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZMaW5lLmNoYXJBdChpZHgpKSkgewotCQkJaWR4Kys7Ci0JCX0KLQkJcmV0dXJuIGlkeDsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgbmV4dCBsaW5lLiBUaGUgbGVuZ3RocyBvZiB0aGUgbGluZSB3aWxsIG5vdCBleGNlZWQgdGhlIGdpdmVkCi0JICogbWF4aW11bSB3aWR0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZMaW5lID09IG51bGwpIHsKLQkJCVN0cmluZyBsaW5lID0gZlJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaW50IGxpbmVMZW4gPSBmR0MudGV4dEV4dGVudChsaW5lKS54OwotCQkJaWYgKGxpbmVMZW4gPCBmTWF4V2lkdGgpIHsKLQkJCQlyZXR1cm4gbGluZTsKLQkJCX0KLQkJCWZMaW5lID0gbGluZTsKLQkJCWZJbmRleCA9IDA7Ci0JCX0KLQkJaW50IGJyZWFrSWR4ID0gZmluZE5leHRCcmVha0luZGV4KGZJbmRleCk7Ci0JCVN0cmluZyByZXMgPSBmTGluZS5zdWJzdHJpbmcoZkluZGV4LCBicmVha0lkeCk7Ci0JCWlmIChicmVha0lkeCA8IGZMaW5lLmxlbmd0aCgpKSB7Ci0JCQlmSW5kZXggPSBmaW5kV29yZEJlZ2luKGJyZWFrSWR4KTsKLQkJfSBlbHNlIHsKLQkJCWZMaW5lID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMWRmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCBieSB0aGUgU291cmNlRWRpdG9yVHJlZVZpZXdlciB0byB0ZWxsIHRoZQotICogVmlld2VyU2VsZWN0aW9uTWFuYWdlciB0aGF0IHRoZSBzZWxlY3Rpb24gcmVhbGx5IGNhbWUgZnJvbSBhIHVzZXIgY2xpY2sgb24KLSAqIHRoZSBjb250ZW50IG91dGxpbmVyLCBpbnN0ZWFkIG9mIGJlaW5nIHNldCBwcm9ncmFtYXRpY2FsbHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudCBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoc291cmNlLCBzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzRkMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnByb2plY3Rpb24uUHJvamVjdGlvbkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklPdmVydmlld1J1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFZGl0b3JTdGF0dXNMaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5VbmRvRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGV4dGVuZHMgUHJvamVjdGlvblZpZXdlciBpbXBsZW1lbnRzIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKiogVGV4dCBvcGVyYXRpb24gY29kZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRSA9IFByb2plY3Rpb25WaWV3ZXIuQ09MTEFQU0VfQUxMOyAvLyBzZWUKLQkvLyBQcm9qZWN0aW9uVmlld2VyLkNPTExBUFNFX0FMTAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTEVBTlVQX0RPQ1VNRU5UID0gQkFTRSArIDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9IEJBU0UgKyAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFNfVEVYVCA9IFNTRVVJTWVzc2FnZXMuRm9ybWF0X0FjdGl2ZV9FbGVtZW50c19VSV87IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRE9DVU1FTlQgPSBCQVNFICsgMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0RPQ1VNRU5UX1RFWFQgPSBTU0VVSU1lc3NhZ2VzLkZvcm1hdF9Eb2N1bWVudF9VSV87IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUlDS19GSVggPSBCQVNFICsgNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVQgPSBTU0VVSU1lc3NhZ2VzLlRleHRfQ3V0X1VJXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BBU1RFID0gU1NFVUlNZXNzYWdlcy5UZXh0X1Bhc3RlX1VJXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NISUZUX0xFRlQgPSBTU0VVSU1lc3NhZ2VzLlRleHRfU2hpZnRfTGVmdF9VSV87IC8vJE5PTi1OTFMtMSQgPSAiVGV4dCBTaGlmdCBMZWZ0IgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NISUZUX1JJR0hUID0gU1NFVUlNZXNzYWdlcy5UZXh0X1NoaWZ0X1JpZ2h0X1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJUZXh0IFNoaWZ0IFJpZ2h0IgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfRVhDRVBUSU9OUyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkJhY2tncm91bmR1cGRhdGVJblByb2dyZXNzOwotCXByaXZhdGUgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciBmQ29udGVudENsZWFudXBIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIElDb250ZW50QXNzaXN0YW50IGZDb3JyZWN0aW9uQXNzaXN0YW50OwotCXByaXZhdGUgYm9vbGVhbiBmQ29ycmVjdGlvbkFzc2lzdGFudEluc3RhbGxlZDsKLQlwcml2YXRlIElEb2N1bWVudEFkYXB0ZXIgZkRvY0FkYXB0ZXI7Ci0KLQlwcml2YXRlIEhpZ2hsaWdodGVyIGZIaWdobGlnaHRlcjsKLQotCS8vIHByaXZhdGUgVmlld2VyU2VsZWN0aW9uTWFuYWdlciBmVmlld2VyU2VsZWN0aW9uTWFuYWdlcjsKLQlwcml2YXRlIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlciNTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlLAotCSAqICAgICAgSVZlcnRpY2FsUnVsZXIsIElPdmVydmlld1J1bGVyLCBib29sZWFuLCBpbnQpCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElWZXJ0aWNhbFJ1bGVyIHZlcnRpY2FsUnVsZXIsIElPdmVydmlld1J1bGVyIG92ZXJ2aWV3UnVsZXIsIGJvb2xlYW4gc2hvd0Fubm90YXRpb25zT3ZlcnZpZXcsIGludCBzdHlsZXMpIHsKLQkJc3VwZXIocGFyZW50LCB2ZXJ0aWNhbFJ1bGVyLCBvdmVydmlld1J1bGVyLCBzaG93QW5ub3RhdGlvbnNPdmVydmlldywgc3R5bGVzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYmVlcCgpIHsKLQkJZ2V0VGV4dFdpZGdldCgpLmdldERpc3BsYXkoKS5iZWVwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5CYWNrZ3JvdW5kVXBkYXRlKCkgewotCQlmQmFja2dyb3VuZHVwZGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOwotCQlkaXNhYmxlUmVkcmF3aW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0T3BlcmF0aW9uVGFyZ2V0I2NhbkRvT3BlcmF0aW9uKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Eb09wZXJhdGlvbihpbnQgb3BlcmF0aW9uKSB7Ci0JCWlmIChmQmFja2dyb3VuZHVwZGF0ZUluUHJvZ3Jlc3MpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlzd2l0Y2ggKG9wZXJhdGlvbikgewotCQkJY2FzZSBDT05URU5UQVNTSVNUX1BST1BPU0FMUyA6IHsKLQkJCQkvLyAocGEpIGlmIHBvc2l0aW9uIGlzbid0IFJFQURfT05MWSAoY29udGFpbnNSZWFkT25seSgpCi0JCQkJLy8gcmV0dXJucyBmYWxzZSksCi0JCQkJLy8gT3RoZXJ3aXNlLCB5b3UgRE8gd2FudCBjb250ZW50IGFzc2lzdCAocmV0dXJuIHRydWUpCi0JCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJcmV0dXJuIGlzRWRpdGFibGUoKSAmJiAoISgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jKS5jb250YWluc1JlYWRPbmx5KGdldFNlbGVjdGVkUmFuZ2UoKS54LCAwKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBRVUlDS19GSVggOiB7Ci0JCQkJcmV0dXJuIGlzRWRpdGFibGUoKTsKLQkJCX0KLQkJCWNhc2UgQ0xFQU5VUF9ET0NVTUVOVCA6IHsKLQkJCQlyZXR1cm4gKGZDb250ZW50Q2xlYW51cEhhbmRsZXIgIT0gbnVsbCAmJiBpc0VkaXRhYmxlKCkpOwotCQkJfQotCQkJY2FzZSBGT1JNQVRfRE9DVU1FTlQgOgotCQkJY2FzZSBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTIDogewotCQkJCXJldHVybiAoZkNvbnRlbnRGb3JtYXR0ZXIgIT0gbnVsbCAmJiBpc0VkaXRhYmxlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5Eb09wZXJhdGlvbihvcGVyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCBiZSBpZGVudGljYWwgdG8gc3VwZXJjbGFzcyB2ZXJzaW9uLiBQbHVzLCB3ZSBnZXQgb3VyIG93biBzcGVjaWFsCi0JICogSGlnaGxpZ2h0ZXIuIFBsdXMgd2UgdW5pbnN0YWxsIGJlZm9yZSBpbnN0YWxsaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQotCQlpZiAoZ2V0VGV4dFdpZGdldCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcodGhpcykpOwotCi0JCS8vIGFsd2F5cyB1bmluc3RhbGwgaGlnaGxpZ2h0ZXIgYW5kIG51bGwgaXQgb3V0IG9uIG5ldyBjb25maWd1cmF0aW9uCi0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZkhpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZkhpZ2hsaWdodGVyID0gbnVsbDsKLQkJfQotCi0JCS8vIGluc3RhbGwgY29udGVudCB0eXBlIGluZGVwZW5kZW50IHBsdWdpbnMKLQkJaWYgKGZQcmVzZW50YXRpb25SZWNvbmNpbGVyICE9IG51bGwpCi0JCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlci51bmluc3RhbGwoKTsKLQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIgPSBjb25maWd1cmF0aW9uLmdldFByZXNlbnRhdGlvblJlY29uY2lsZXIodGhpcyk7Ci0JCWlmIChmUHJlc2VudGF0aW9uUmVjb25jaWxlciAhPSBudWxsKQotCQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIuaW5zdGFsbCh0aGlzKTsKLQotCQlJUmVjb25jaWxlciBuZXdSZWNvbmNpbGVyID0gY29uZmlndXJhdGlvbi5nZXRSZWNvbmNpbGVyKHRoaXMpOwotCi0JCWlmIChuZXdSZWNvbmNpbGVyICE9IGZSZWNvbmNpbGVyIHx8IG5ld1JlY29uY2lsZXIgPT0gbnVsbCB8fCBmUmVjb25jaWxlciA9PSBudWxsKSB7Ci0KLQkJCWlmIChmUmVjb25jaWxlciAhPSBudWxsKSB7Ci0JCQkJZlJlY29uY2lsZXIudW5pbnN0YWxsKCk7Ci0JCQl9Ci0KLQkJCWZSZWNvbmNpbGVyID0gbmV3UmVjb25jaWxlcjsKLQotCQkJaWYgKGZSZWNvbmNpbGVyICE9IG51bGwpIHsKLQkJCQlmUmVjb25jaWxlci5pbnN0YWxsKHRoaXMpOwotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODU4Ci0JCQkJLy8gc3RpbGwgbmVlZCBzZXQgZG9jdW1lbnQgb24gdGhlIHJlY29uY2lsZXIgKHN0cmF0ZWdpZXMpCi0JCQkJKChTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yKSBmUmVjb25jaWxlcikuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlJQ29udGVudEFzc2lzdGFudCBuZXdBc3Npc3RhbnQgPSBjb25maWd1cmF0aW9uLmdldENvbnRlbnRBc3Npc3RhbnQodGhpcyk7Ci0JCWlmIChuZXdBc3Npc3RhbnQgIT0gZkNvbnRlbnRBc3Npc3RhbnQgfHwgbmV3QXNzaXN0YW50ID09IG51bGwgfHwgZkNvbnRlbnRBc3Npc3RhbnQgPT0gbnVsbCkgewotCQkJaWYgKGZDb250ZW50QXNzaXN0YW50ICE9IG51bGwpCi0JCQkJZkNvbnRlbnRBc3Npc3RhbnQudW5pbnN0YWxsKCk7Ci0KLQkJCWZDb250ZW50QXNzaXN0YW50ID0gbmV3QXNzaXN0YW50OwotCi0JCQlpZiAoZkNvbnRlbnRBc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJCWZDb250ZW50QXNzaXN0YW50Lmluc3RhbGwodGhpcyk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnRJbnN0YWxsZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gMjQ4MDM2Ci0JCQkJLy8gZGlzYWJsZSB0aGUgY29udGVudCBhc3Npc3Qgb3BlcmF0aW9uIGlmIG5vIGNvbnRlbnQKLQkJCQkvLyBhc3Npc3RhbnQKLQkJCQllbmFibGVPcGVyYXRpb24oQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMsIGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWZDb250ZW50Rm9ybWF0dGVyID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50Rm9ybWF0dGVyKHRoaXMpOwotCi0JCS8vIGRvIG5vdCB1bmluc3RhbGwgb2xkIGluZm9ybWF0aW9uIHByZXNlbnRlciBpZiBpdCdzIHRoZSBzYW1lCi0JCUlJbmZvcm1hdGlvblByZXNlbnRlciBuZXdJbmZvcm1hdGlvblByZXNlbnRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXIodGhpcyk7Ci0JCWlmIChuZXdJbmZvcm1hdGlvblByZXNlbnRlciA9PSBudWxsIHx8IGZJbmZvcm1hdGlvblByZXNlbnRlciA9PSBudWxsIHx8ICEobmV3SW5mb3JtYXRpb25QcmVzZW50ZXIuZXF1YWxzKGZJbmZvcm1hdGlvblByZXNlbnRlcikpKSB7Ci0JCQlpZiAoZkluZm9ybWF0aW9uUHJlc2VudGVyICE9IG51bGwpCi0JCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLnVuaW5zdGFsbCgpOwotCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyID0gbmV3SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci0JCQlpZiAoZkluZm9ybWF0aW9uUHJlc2VudGVyICE9IG51bGwpCi0JCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLmluc3RhbGwodGhpcyk7Ci0JCX0KLQotCQkvLyBkaXNjb25uZWN0IGZyb20gdGhlIG9sZCB1bmRvIG1hbmFnZXIgYmVmb3JlIHNldHRpbmcgdGhlIG5ldyBvbmUKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIuZGlzY29ubmVjdCgpOwotCQl9Ci0JCXNldFVuZG9NYW5hZ2VyKGNvbmZpZ3VyYXRpb24uZ2V0VW5kb01hbmFnZXIodGhpcykpOwotCi0JCS8vIHJlbGVhc2Ugb2xkIGFubm90YXRpb24gaG92ZXIgYmVmb3JlIHNldHRpbmcgbmV3IG9uZQotCQlpZiAoZkFubm90YXRpb25Ib3ZlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSBmQW5ub3RhdGlvbkhvdmVyKS5yZWxlYXNlKCk7Ci0JCX0KLQkJc2V0QW5ub3RhdGlvbkhvdmVyKGNvbmZpZ3VyYXRpb24uZ2V0QW5ub3RhdGlvbkhvdmVyKHRoaXMpKTsKLQotCQkvLyByZWxlYXNlIG9sZCBhbm5vdGF0aW9uIGhvdmVyIGJlZm9yZSBzZXR0aW5nIG5ldyBvbmUKLQkJaWYgKGZPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIGZPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyKS5yZWxlYXNlKCk7Ci0JCX0KLQkJc2V0T3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3Zlcihjb25maWd1cmF0aW9uLmdldEFubm90YXRpb25Ib3Zlcih0aGlzKSk7Ci0KLQkJZ2V0VGV4dFdpZGdldCgpLnNldFRhYnMoY29uZmlndXJhdGlvbi5nZXRUYWJXaWR0aCh0aGlzKSk7Ci0JCXNldEhvdmVyQ29udHJvbENyZWF0b3IoY29uZmlndXJhdGlvbi5nZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKHRoaXMpKTsKLQotCQkvLyBpZiBoeXBlcmxpbmsgbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIHVuaW5zdGFsbCBpdAotCQlpZiAoZkh5cGVybGlua01hbmFnZXIgIT0gbnVsbCkgewotCQkJc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKG51bGwsIFNXVC5OT05FKTsKLQkJfQotCQlzZXRIeXBlcmxpbmtQcmVzZW50ZXIoY29uZmlndXJhdGlvbi5nZXRIeXBlcmxpbmtQcmVzZW50ZXIodGhpcykpOwotCQlJSHlwZXJsaW5rRGV0ZWN0b3JbXSBoeXBlcmxpbmtEZXRlY3RvcnMgPSBjb25maWd1cmF0aW9uLmdldEh5cGVybGlua0RldGVjdG9ycyh0aGlzKTsKLQkJaW50IGV2ZW50U3RhdGVNYXNrID0gY29uZmlndXJhdGlvbi5nZXRIeXBlcmxpbmtTdGF0ZU1hc2sodGhpcyk7Ci0JCXNldEh5cGVybGlua0RldGVjdG9ycyhoeXBlcmxpbmtEZXRlY3RvcnMsIGV2ZW50U3RhdGVNYXNrKTsKLQotCQkvLyBpbnN0YWxsIGNvbnRlbnQgdHlwZSBzcGVjaWZpYyBwbHVnaW5zCi0JCVN0cmluZ1tdIHR5cGVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHRoaXMpOwotCi0JCS8vIGNsZWFyIGF1dG9pbmRlbnQvYXV0b2VkaXQgc3RyYXRlZ2llcwotCQlmQXV0b0luZGVudFN0cmF0ZWdpZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdCA9IHR5cGVzW2ldOwotCQkJc2V0QXV0b0VkaXRTdHJhdGVnaWVzKGNvbmZpZ3VyYXRpb24uZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHRoaXMsIHQpLCB0KTsKLQkJCXNldFRleHREb3VibGVDbGlja1N0cmF0ZWd5KGNvbmZpZ3VyYXRpb24uZ2V0RG91YmxlQ2xpY2tTdHJhdGVneSh0aGlzLCB0KSwgdCk7Ci0KLQkJCWludFtdIHN0YXRlTWFza3MgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRUZXh0SG92ZXJTdGF0ZU1hc2tzKHRoaXMsIHQpOwotCQkJaWYgKHN0YXRlTWFza3MgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3RhdGVNYXNrcy5sZW5ndGg7IGorKykgewotCQkJCQlpbnQgc3RhdGVNYXNrID0gc3RhdGVNYXNrc1tqXTsKLQkJCQkJc2V0VGV4dEhvdmVyKGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHRoaXMsIHQsIHN0YXRlTWFzayksIHQsIHN0YXRlTWFzayk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0VGV4dEhvdmVyKGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHRoaXMsIHQpLCB0LCBJVGV4dFZpZXdlckV4dGVuc2lvbjIuREVGQVVMVF9IT1ZFUl9TVEFURV9NQVNLKTsKLQkJCX0KLQotCQkJU3RyaW5nW10gcHJlZml4ZXMgPSBjb25maWd1cmF0aW9uLmdldEluZGVudFByZWZpeGVzKHRoaXMsIHQpOwotCQkJaWYgKHByZWZpeGVzICE9IG51bGwgJiYgcHJlZml4ZXMubGVuZ3RoID4gMCkKLQkJCQlzZXRJbmRlbnRQcmVmaXhlcyhwcmVmaXhlcywgdCk7Ci0KLQkJCXByZWZpeGVzID0gY29uZmlndXJhdGlvbi5nZXREZWZhdWx0UHJlZml4ZXModGhpcywgdCk7Ci0JCQlpZiAocHJlZml4ZXMgIT0gbnVsbCAmJiBwcmVmaXhlcy5sZW5ndGggPiAwKQotCQkJCXNldERlZmF1bHRQcmVmaXhlcyhwcmVmaXhlcywgdCk7Ci0KLQkJCS8vIGFkZCBoaWdobGlnaHRlci9saW5lc3R5bGVwcm92aWRlcgotCQkJLy8gQlVHMTM5NzUzIC0gb25seSBjcmVhdGUgSGlnaGxpZ2h0ZXIgaWYgd2UgaGF2ZSBhIHZhbGlkIGRvY3VtZW50Ci0JCQlpZiAoY29uZmlndXJhdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiAmJiBnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gKChTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24pLmdldExpbmVTdHlsZVByb3ZpZGVycyh0aGlzLCB0KTsKLQkJCQlpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm92aWRlcnMubGVuZ3RoOyArK2opIHsKLQkJCQkJCS8vIGRlbGF5IGNyZWF0aW9uIG9mIGhpZ2hsaWdodGVyIHRpbGwKLQkJCQkJCS8vIGxpbmVzdHlsZXByb3ZpZGVyIG5lZWRzIHRvIGJlIGFkZGVkCi0JCQkJCQlpZiAoZkhpZ2hsaWdodGVyID09IG51bGwpCi0JCQkJCQkJZkhpZ2hsaWdodGVyID0gbmV3IEhpZ2hsaWdodGVyKCk7Ci0JCQkJCQlmSGlnaGxpZ2h0ZXIuYWRkUHJvdmlkZXIodCwgcHJvdmlkZXJzW2pdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGluaXRpYWxpemUgaGlnaGxpZ2h0ZXIgYWZ0ZXIgbGluZXN0eWxlcHJvdmlkZXJzIHdlcmUgYWRkZWQKLQkJaWYgKGZIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQlmSGlnaGxpZ2h0ZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcodGhpcykpOwotCQkJZkhpZ2hsaWdodGVyLmluc3RhbGwodGhpcyk7Ci0JCQlmSGlnaGxpZ2h0ZXIuc2V0RG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCkpOwotCQl9Ci0KLQkJYWN0aXZhdGVQbHVnaW5zKCk7Ci0KLQkJZkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBlbmRPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlpbnQgc3RhcnQgPSBzdGFydE9mZnNldDsKLQkJaW50IGVuZCA9IGVuZE9mZnNldDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBQcm9qZWN0aW9uRG9jdW1lbnQpIHsKLQkJCQlJRG9jdW1lbnQgZG9jID0gKChQcm9qZWN0aW9uRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRNYXN0ZXJEb2N1bWVudCgpOwotCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQkJCWludCBhZGp1c3QgPSAoKFByb2plY3Rpb25Eb2N1bWVudCkgZG9jdW1lbnQpLmdldFByb2plY3Rpb25NYXBwaW5nKCkuZ2V0Q292ZXJhZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQkJc3RhcnQgPSBhZGp1c3QgKyBzdGFydDsKLQkJCQkJZW5kID0gYWRqdXN0ICsgZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCWludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJRG9jdW1lbnRBZGFwdGVyIGNyZWF0ZURvY3VtZW50QWRhcHRlcigpIHsKLQotCQlmRG9jQWRhcHRlciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyKGdldFRleHRXaWRnZXQoKSk7Ci0JCXJldHVybiBmRG9jQWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRPcGVyYXRpb25UYXJnZXQjZG9PcGVyYXRpb24oaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvT3BlcmF0aW9uKGludCBvcGVyYXRpb24pIHsKLQotCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJc3dpdGNoIChvcGVyYXRpb24pIHsKLQkJCWNhc2UgQ1VUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX0NVVCwgVEVYVF9DVVQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCXN1cGVyLmRvT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0JCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCWN1cnNvclBvc2l0aW9uID0gc2VsZWN0aW9uLng7Ci0JCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBBU1RFIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1BBU1RFLCBURVhUX1BBU1RFLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQlzdXBlci5kb09wZXJhdGlvbihvcGVyYXRpb24pOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05URU5UQVNTSVNUX1BST1BPU0FMUyA6Ci0JCQkJLy8gbWF5YmUgbm90IGNvbmZpZ3VyZWQ/Ci0JCQkJaWYgKGZDb250ZW50QXNzaXN0YW50ICE9IG51bGwgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCS8vIENNVkMgMjYzMjY5Ci0JCQkJCS8vIG5lZWQgYW4gZXhwbGljaXQgY2hlY2sgaGVyZSBiZWNhdXNlIHRoZQotCQkJCQkvLyBjb250ZW50QXNzaXN0QWN0aW9uIGlzIG5vIGxvbmdlciBiZWluZyB1cGRhdGVkIG9uCi0JCQkJCS8vIGN1cnNvcgotCQkJCQkvLyBwb3NpdGlvbgotCQkJCQlpZiAoY2FuRG9PcGVyYXRpb24oQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyID0gZkNvbnRlbnRBc3Npc3RhbnQuc2hvd1Bvc3NpYmxlQ29tcGxldGlvbnMoKTsKLQkJCQkJCWlmIChlcnIgIT0gbnVsbCkgewotCQkJCQkJCS8vIGRvbid0IHdhbm5hIGJlZXAgaWYgdGhlcmUgaXMgbm8gZXJyb3IKLQkJCQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyKTsKLQkJCQkJCX0KLQkJCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQliZWVwKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04gOgotCQkJCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBlcnIgPSBmQ29udGVudEFzc2lzdGFudC5zaG93Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheUVycm9yTWVzc2FnZShlcnIpOwotCQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCQkJCS8vIHNldEVycm9yTWVzc2FnZShlcnIpOwotCQkJCQkvLyBuZXcgT25lVGltZUxpc3RlbmVyKGdldFRleHRXaWRnZXQoKSwgbmV3Ci0JCQkJCS8vIENsZWFyRXJyb3JNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgUVVJQ0tfRklYIDoKLQkJCQlpZiAoaXNFZGl0YWJsZSgpICYmIGZDb3JyZWN0aW9uQXNzaXN0YW50ICE9IG51bGwgJiYgZkNvcnJlY3Rpb25Bc3Npc3RhbnRJbnN0YWxsZWQpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IGZDb3JyZWN0aW9uQXNzaXN0YW50LnNob3dQb3NzaWJsZUNvbXBsZXRpb25zKCk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShtc2cpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0hJRlRfUklHSFQgOgotCQkJCWJlZ2luUmVjb3JkaW5nKFRFWFRfU0hJRlRfUklHSFQsIFRFWFRfU0hJRlRfUklHSFQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCXVwZGF0ZUluZGVudGF0aW9uUHJlZml4ZXMoKTsKLQkJCQlzdXBlci5kb09wZXJhdGlvbihTSElGVF9SSUdIVCk7Ci0JCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCWN1cnNvclBvc2l0aW9uID0gc2VsZWN0aW9uLng7Ci0JCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNISUZUX0xFRlQgOgotCQkJCWJlZ2luUmVjb3JkaW5nKFRFWFRfU0hJRlRfTEVGVCwgVEVYVF9TSElGVF9MRUZULCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQl1cGRhdGVJbmRlbnRhdGlvblByZWZpeGVzKCk7Ci0JCQkJc3VwZXIuZG9PcGVyYXRpb24oU0hJRlRfTEVGVCk7Ci0JCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCWN1cnNvclBvc2l0aW9uID0gc2VsZWN0aW9uLng7Ci0JCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZPUk1BVF9ET0NVTUVOVCA6Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCWJlZ2luUmVjb3JkaW5nKEZPUk1BVF9ET0NVTUVOVF9URVhULCBGT1JNQVRfRE9DVU1FTlRfVEVYVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkJCQkJLy8gZm9ybWF0Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gZ2V0TW9kZWxDb3ZlcmFnZSgpOwotCQkJCQlpZiAoZkNvbnRlbnRGb3JtYXR0ZXIgaW5zdGFuY2VvZiBJQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbikgewotCQkJCQkJSUNvbnRlbnRGb3JtYXR0ZXJFeHRlbnNpb24gZXh0ZW5zaW9uID0gKElDb250ZW50Rm9ybWF0dGVyRXh0ZW5zaW9uKSBmQ29udGVudEZvcm1hdHRlcjsKLQkJCQkJCUlGb3JtYXR0aW5nQ29udGV4dCBjb250ZXh0ID0gbmV3IEZvcm1hdHRpbmdDb250ZXh0KCk7Ci0JCQkJCQljb250ZXh0LnNldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX0RPQ1VNRU5ULCBCb29sZWFuLlRSVUUpOwotCQkJCQkJY29udGV4dC5zZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04sIHJlZ2lvbik7Ci0JCQkJCQlleHRlbnNpb24uZm9ybWF0KGdldERvY3VtZW50KCksIGNvbnRleHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZkNvbnRlbnRGb3JtYXR0ZXIuZm9ybWF0KGdldERvY3VtZW50KCksIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCQlzZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTIDoKLQkJCQl0cnkgewotCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJYmVnaW5SZWNvcmRpbmcoRk9STUFUX0FDVElWRV9FTEVNRU5UU19URVhULCBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTX1RFWFQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JCQkJCS8vIGZvcm1hdAotCQkJCQlQb2ludCBzID0gZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ocy54LCBzLnkpOwotCQkJCQlmQ29udGVudEZvcm1hdHRlci5mb3JtYXQoZ2V0RG9jdW1lbnQoKSwgcmVnaW9uKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCQlzZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJc3VwZXIuZG9PcGVyYXRpb24ob3BlcmF0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRSZWNvcmRpbmcoaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jOwotCQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCXVuZG9NYW5hZ2VyLmVuZFJlY29yZGluZyh0aGlzLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRPRE86IGhvdyB0byBoYW5kbGUgb3RoZXIgZG9jdW1lbnQgdHlwZXM/Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVnaW5SZWNvcmRpbmcoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYzsKLQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQl1bmRvTWFuYWdlci5iZWdpblJlY29yZGluZyh0aGlzLCBsYWJlbCwgZGVzY3JpcHRpb24sIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvdGhlciBkb2N1bWVudCB0eXBlcz8KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEJhY2tncm91bmRVcGRhdGUoKSB7Ci0JCWZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQllbmFibGVkUmVkcmF3aW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0Vmlld2VyOjpoYW5kbGVEaXNwb3NlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIGJlZm9yZSB3ZSBkaXNwb3NlLCB3ZSBzZXQgYSBzcGVjaWFsICJlbXB0eSIgc2VsZWN0aW9uLCB0byBwcmV2ZW50Ci0JCS8vIHRoZSAibGVhayBvbmUgZG9jdW1lbnQiIHRoYXQKLQkJLy8gb3RoZXJ3aXNlIG9jY3VycyB3aGVuIGVkaXRvciBjbG9zZWQgKHNpbmNlIGxhc3Qgc2VsZWN0aW9uIHN0YXlzIGluCi0JCS8vIFNlbGVjdGVkUmVzb3VyY2VNYW5hZ2VyLgotCQkvLyB0aGUgb2NjdXJhbmNlIG9mIHRoZSAibGVhayIgaXNuJ3Qgc28gYmFkLCBidXQgbWFrZXMgZGVidWdnaW5nIG90aGVyCi0JCS8vIGxlYWtzIHZlcnkgaGFyZC4KLQkJc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQlmSGlnaGxpZ2h0ZXIudW5pbnN0YWxsKCk7Ci0JCQlmSGlnaGxpZ2h0ZXIgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoKTsKLQotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRWaWV3ZXI6OmhhbmRsZURpc3Bvc2UgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKgotCSAqIE92ZXJyaWRkZW4gZm9yIHNwZWNpYWwgc3VwcG9ydCBvZiBiYWNrZ3JvdW5kIHVwZGF0ZSBhbmQgcmVhZC1vbmx5Ci0JICogcmVnaW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVZlcmlmeUV2ZW50KFZlcmlmeUV2ZW50IGUpIHsKLQkJSVJlZ2lvbiBtb2RlbFJhbmdlID0gZXZlbnQyTW9kZWxSYW5nZShlKTsKLQkJaWYgKGV4cG9zZU1vZGVsUmFuZ2UobW9kZWxSYW5nZSkpIHsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGZFdmVudENvbnN1bWVyICE9IG51bGwpIHsKLQkJCWZFdmVudENvbnN1bWVyLnByb2Nlc3NFdmVudChlKTsKLQkJCWlmICghZS5kb2l0KQotCQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkJhY2tncm91bmR1cGRhdGVJblByb2dyZXNzKSB7Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWJlZXAoKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBmb3IgcmVhZC1vbmx5IHN1cHBvcnQKLQkJaWYgKGNvbnRhaW5zUmVhZE9ubHkoZ2V0VmlzaWJsZURvY3VtZW50KCksIGUuc3RhcnQsIGUuZW5kKSkgewotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQliZWVwKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJc3VwZXIuaGFuZGxlVmVyaWZ5RXZlbnQoZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBub3RlLCB3ZSBjYXRjaCBhbmQgbG9nIGFueSBleGNlcHRpb24sCi0JCQkvLyBzaW5jZSBhbiBvdGhlcndpc2UgY2FuIGFjdHVhbGx5IHByZXZlbnQgdHlwaW5nIQotCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEzMTgKLQotCQkJaWYgKFRSQUNFX0VYQ0VQVElPTlMpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiU3RydWN0dXJlZFRleHRWaWV3ZXIuZXhjZXB0aW9uLnZlcmlmeVRleHQiLCB4KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG1vZGVsTGluZTJXaWRnZXRMaW5lKGludCBtb2RlbExpbmUpIHsKLQkJLyoqCi0JCSAqIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgYSB3b3JrYXJvdW5kIGZvciBCdWcgODU3MDkKLQkJICovCi0JCWlmIChmSW5mb3JtYXRpb25NYXBwaW5nID09IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlSZWdpb24gbW9kZWxMaW5lUmVnaW9uID0gZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb24obW9kZWxMaW5lKTsKLQkJCQkJSVJlZ2lvbiByZWdpb24gPSBnZXRNb2RlbENvdmVyYWdlKCk7Ci0JCQkJCWlmIChtb2RlbExpbmVSZWdpb24gIT0gbnVsbCAmJiByZWdpb24gIT0gbnVsbCkgewotCQkJCQkJaW50IG1vZGVsRW5kID0gbW9kZWxMaW5lUmVnaW9uLmdldE9mZnNldCgpICsgbW9kZWxMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJCS8vIHJldHVybnMgLTEgaWYgbW9kZWxMaW5lIGlzIGludmFsaWQKLQkJCQkJCWlmICgobW9kZWxMaW5lUmVnaW9uLmdldE9mZnNldCgpIDwgcmVnaW9uLmdldE9mZnNldCgpKSB8fCAobW9kZWxFbmQgPiByZWdpb25FbmQpKQotCQkJCQkJCXJldHVybiAtMTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkvLyByZXR1cm5zIC0xIGlmIG1vZGVsTGluZSBpcyBpbnZhbGlkCi0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm1vZGVsTGluZTJXaWRnZXRMaW5lKG1vZGVsTGluZSk7Ci0JfQotCi0JcHVibGljIGludCBtb2RlbE9mZnNldDJXaWRnZXRPZmZzZXQoaW50IG1vZGVsT2Zmc2V0KSB7Ci0JCS8qKgotCQkgKiBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIGEgd29ya2Fyb3VuZCBmb3IgQnVnIDg1NzA5Ci0JCSAqLwotCQlpZiAoZkluZm9ybWF0aW9uTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlJUmVnaW9uIHJlZ2lvbiA9IGdldE1vZGVsQ292ZXJhZ2UoKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCS8vIHJldHVybnMgLTEgaWYgbW9kZWxPZmZzZXQgaXMgaW52YWxpZAotCQkJCWlmIChtb2RlbE9mZnNldCA8IHJlZ2lvbi5nZXRPZmZzZXQoKSB8fCBtb2RlbE9mZnNldCA+IChyZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChtb2RlbE9mZnNldCk7Ci0JfQotCi0JcHVibGljIElSZWdpb24gbW9kZWxSYW5nZTJXaWRnZXRSYW5nZShJUmVnaW9uIG1vZGVsUmFuZ2UpIHsKLQkJLy8gbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyB3b3JrYXJvdW5kIGZvciBCdWc4NTcwOQotCQlpZiAoZkluZm9ybWF0aW9uTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlJUmVnaW9uIHJlZ2lvbiA9IGdldE1vZGVsQ292ZXJhZ2UoKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiBtb2RlbFJhbmdlICE9IG51bGwpIHsKLQkJCQlpbnQgbW9kZWxFbmQgPSBtb2RlbFJhbmdlLmdldE9mZnNldCgpICsgbW9kZWxSYW5nZS5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgcmVnaW9uRW5kID0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIHJldHVybnMgbnVsbCBpZiBtb2RlbFJhbmdlIGlzIGludmFsaWQKLQkJCQlpZiAoKG1vZGVsUmFuZ2UuZ2V0T2Zmc2V0KCkgPCByZWdpb24uZ2V0T2Zmc2V0KCkpIHx8IChtb2RlbEVuZCA+IHJlZ2lvbkVuZCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5tb2RlbFJhbmdlMldpZGdldFJhbmdlKG1vZGVsUmFuZ2UpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvcnJlY3Rpb24gYXNzaXN0YW50IGZvciB0aGUgdmlld2VyLiBUaGlzIG1ldGhvZCBpcyB0ZW1wb3JhcnkKLQkgKiB3b3JrYXJvdW5kIHVudGlsIHRoZSBiYXNlIGFkZHMgYSBnZW5lcmljIHdheSB0byBhZGQKLQkgKiBxdWlja2ZpeC9xdWlja2Fzc2lzdC4KLQkgKiAKLQkgKiBAcGFyYW0gY29ycmVjdGlvbkFzc2lzdGFudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcnJlY3Rpb25Bc3Npc3RhbnQoSUNvbnRlbnRBc3Npc3RhbnQgY29ycmVjdGlvbkFzc2lzdGFudCkgewotCQkvLyBjb3JyZWN0aW9uIGFzc2lzdGFudAotCQlpZiAoZkNvcnJlY3Rpb25Bc3Npc3RhbnQgIT0gbnVsbCkKLQkJCWZDb3JyZWN0aW9uQXNzaXN0YW50LnVuaW5zdGFsbCgpOwotCQlmQ29ycmVjdGlvbkFzc2lzdGFudCA9IGNvcnJlY3Rpb25Bc3Npc3RhbnQ7Ci0JCWlmIChmQ29ycmVjdGlvbkFzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQkvLyBjb25maWd1cmF0aW9uCi0JCQlpZiAoZkNvcnJlY3Rpb25Bc3Npc3RhbnQgaW5zdGFuY2VvZiBDb250ZW50QXNzaXN0YW50KSB7Ci0JCQkJKChDb250ZW50QXNzaXN0YW50KSBmQ29ycmVjdGlvbkFzc2lzdGFudCkuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSk7Ci0JCQl9Ci0KLQkJCWZDb3JyZWN0aW9uQXNzaXN0YW50Lmluc3RhbGwodGhpcyk7Ci0JCQlmQ29ycmVjdGlvbkFzc2lzdGFudEluc3RhbGxlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBkaXNhYmxlIHRoZSBjb3JyZWN0aW9uIGFzc2lzdCBvcGVyYXRpb24gaWYgbm8gY29ycmVjdGlvbgotCQkJLy8gYXNzaXN0YW50Ci0JCQllbmFibGVPcGVyYXRpb24oUVVJQ0tfRklYLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIjc2V0RG9jdW1lbnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsLCBpbnQgbW9kZWxSYW5nZU9mZnNldCwgaW50IG1vZGVsUmFuZ2VMZW5ndGgpIHsKLQkJLy8gcGFydGlhbCBmaXggZm9yOgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTk3MAotCQkvLyB3aGVuIG91ciBkb2N1bWVudCBpcyBzZXQsIGVzcGVjaWFsbHkgdG8gbnVsbCBkdXJpbmcgY2xvc2UsCi0JCS8vIGltbWVkaWF0ZWx5IHVuaW5zdGFsbCB0aGUgcmVjb25jaWxlci4KLQkJLy8gdGhpcyBpcyB0byBhdm9pZCBhbiB1bm5lY2Vzc2FyeSBmaW5hbCAicmVjb25jaWxlIgotCQkvLyB0aGF0IGJsb2NrcyBkaXNwbGF5IHRocmVhZAotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJaWYgKGZSZWNvbmNpbGVyICE9IG51bGwpIHsKLQkJCQlmUmVjb25jaWxlci51bmluc3RhbGwoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnNldERvY3VtZW50KGRvY3VtZW50LCBhbm5vdGF0aW9uTW9kZWwsIG1vZGVsUmFuZ2VPZmZzZXQsIG1vZGVsUmFuZ2VMZW5ndGgpOwotCi0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCi0JCQkvLyBub3RpZnkgaGlnaGxpZ2h0ZXIKLQkJCXVwZGF0ZUhpZ2hsaWdodGVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJCS8vIHNldCBkb2N1bWVudCBpbiB0aGUgdmlld2VyLWJhc2VkIHVuZG8gbWFuYWdlcgotCQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJCQlmVW5kb01hbmFnZXIuY29ubmVjdCh0aGlzKTsKLQkJCX0KLQkJCS8vIENhcmV0RXZlbnQgaXMgbm90IHNlbnQgdG8gVmlld2VyU2VsZWN0aW9uTWFuYWdlciBhZnRlciBTYXZlIEFzLgotCQkJLy8gTmVlZCB0byBub3RpZnkgVmlld2VyU2VsZWN0aW9uTWFuYWdlciBoZXJlLgotCQkJLy8gbm90aWZ5Vmlld2VyU2VsZWN0aW9uTWFuYWdlcihnZXRTZWxlY3RlZFJhbmdlKCkueCwKLQkJCS8vIGdldFNlbGVjdGVkUmFuZ2UoKS55KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgYWN0aXZlIGVkaXRvciB0byBzZXQgYSBzdGF0dXMgbGluZSBtZXNzYWdlCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJSUVkaXRvclN0YXR1c0xpbmUgc3RhdHVzTGluZSA9IChJRWRpdG9yU3RhdHVzTGluZSkgZWRpdG9yLmdldEFkYXB0ZXIoSUVkaXRvclN0YXR1c0xpbmUuY2xhc3MpOwotCQkJCQlpZiAoc3RhdHVzTGluZSAhPSBudWxsKQotCQkJCQkJc3RhdHVzTGluZS5zZXRNZXNzYWdlKHRydWUsIG1zZywgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVW5pbnN0YWxscyBhbnl0aGluZyB0aGF0IHdhcyBpbnN0YWxsZWQgYnkgY29uZmlndXJlCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dFZpZXdlcjo6dW5jb25maWd1cmUgZW50cnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZkhpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZkhpZ2hsaWdodGVyID0gbnVsbDsKLQkJfQotCQlpZiAoZkNvcnJlY3Rpb25Bc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJZkNvcnJlY3Rpb25Bc3Npc3RhbnQudW5pbnN0YWxsKCk7Ci0JCX0KLQotCQlpZiAoZkFubm90YXRpb25Ib3ZlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSBmQW5ub3RhdGlvbkhvdmVyKS5yZWxlYXNlKCk7Ci0JCX0KLQotCQlpZiAoZk92ZXJ2aWV3UnVsZXJBbm5vdGF0aW9uSG92ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgewotCQkJKChTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgZk92ZXJ2aWV3UnVsZXJBbm5vdGF0aW9uSG92ZXIpLnJlbGVhc2UoKTsKLQkJfQotCi0JCS8vIGRvZXNuJ3Qgc2VlbSB0byBiZSBoYW5kbGVkIGVsc2V3aGVyZSwgc28gd2UnbGwgYmUgc3VyZSBlcnJvcgotCQkvLyBtZXNzYWdlcydzIGFyZSBjbGVhcmVkLgotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJc3VwZXIudW5jb25maWd1cmUoKTsKLQkJZkNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRWaWV3ZXI6OnVuY29uZmlndXJlIGV4aXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciN1bmRvT3BlcmF0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5VbmRvRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvT3BlcmF0aW9uU2VsZWN0aW9uQ2hhbmdlZChVbmRvRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UmVxdWVzdGVyKCkgIT0gbnVsbCAmJiBldmVudC5nZXRSZXF1ZXN0ZXIoKS5lcXVhbHModGhpcykgJiYgZXZlbnQuZ2V0RG9jdW1lbnQoKS5lcXVhbHMoZ2V0RG9jdW1lbnQoKSkpIHsKLQkJCS8vIEJVRzEwNzY4NzogVW5kby9yZWRvIGRvIG5vdCBzY3JvbGwgZWRpdG9yCi0JCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihldmVudC5nZXRPZmZzZXQoKSwgZXZlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSGlnaGxpZ2h0ZXIoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZiBoaWdobGlnaHRlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQsIGluaXRpYWxpemUgYW5kIGluc3RhbGwgaXQKLQkJaWYgKGZIaWdobGlnaHRlciA9PSBudWxsICYmIGZDb25maWd1cmF0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSB7Ci0JCQlTdHJpbmdbXSB0eXBlcyA9IGZDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXModGhpcyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHQgPSB0eXBlc1tpXTsKLQotCQkJCS8vIGFkZCBoaWdobGlnaHRlci9saW5lc3R5bGVwcm92aWRlcgotCQkJCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gKChTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIGZDb25maWd1cmF0aW9uKS5nZXRMaW5lU3R5bGVQcm92aWRlcnModGhpcywgdCk7Ci0JCQkJaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvdmlkZXJzLmxlbmd0aDsgKytqKSB7Ci0JCQkJCQkvLyBkZWxheSBjcmVhdGlvbiBvZiBoaWdobGlnaHRlciB0aWxsCi0JCQkJCQkvLyBsaW5lc3R5bGVwcm92aWRlciBuZWVkcyB0byBiZSBhZGRlZAotCQkJCQkJLy8gZG8gbm90IGNyZWF0ZSBoaWdobGlnaHRlciBpZiBubyB2YWxpZCBkb2N1bWVudAotCQkJCQkJaWYgKGZIaWdobGlnaHRlciA9PSBudWxsKQotCQkJCQkJCWZIaWdobGlnaHRlciA9IG5ldyBIaWdobGlnaHRlcigpOwotCQkJCQkJZkhpZ2hsaWdodGVyLmFkZFByb3ZpZGVyKHQsIHByb3ZpZGVyc1tqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGluaXRpYWxpemUgaGlnaGxpZ2h0ZXIgYWZ0ZXIgbGluZXN0eWxlcHJvdmlkZXJzIHdlcmUgYWRkZWQKLQkJCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhmQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcodGhpcykpOwotCQkJCWZIaWdobGlnaHRlci5pbnN0YWxsKHRoaXMpOwotCQkJfQotCQl9Ci0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkKLQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBzdXJlIGluZGVudGF0aW9uIGlzIGNvcnJlY3QgYmVmb3JlIHVzaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVJbmRlbnRhdGlvblByZWZpeGVzKCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBmQ29uZmlndXJhdGlvbjsKLQkJaWYgKGZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHR5cGVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHRoaXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZ1tdIHByZWZpeGVzID0gY29uZmlndXJhdGlvbi5nZXRJbmRlbnRQcmVmaXhlcyh0aGlzLCB0eXBlc1tpXSk7Ci0JCQkJaWYgKHByZWZpeGVzICE9IG51bGwgJiYgcHJlZml4ZXMubGVuZ3RoID4gMCkKLQkJCQkJc2V0SW5kZW50UHJlZml4ZXMocHJlZml4ZXMsIHR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9UZXh0RHJvcEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RleHREcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDE5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RleHREcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogVGV4dERyb3BBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIFRleHREcm9wQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3REcm9wQWN0aW9uIHsKLQlwdWJsaWMgYm9vbGVhbiBydW4oRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJcmV0dXJuIGluc2VydCgoU3RyaW5nKSBldmVudC5kYXRhLCB0YXJnZXRFZGl0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9UcmFuc2ZlckJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9UcmFuc2ZlckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwODlkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVHJhbnNmZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uRHJvcEFjdGlvblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBCdWlsZHMgZHJvcCB0YXJnZXQgdHJhbnNmZXJzLCBkcmFnIHNvdXJjZSB0cmFuc2ZlcnMsIGFuZCBkcm9wIGFjdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX01FVEhPRCA9ICJtZXRob2QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BSSU9SSVRZID0gInByaW9yaXR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TSU5HTEVUT04gPSAic2luZ2xldG9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UQVJHRVRfSUQgPSAidGFyZ2V0SUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RSQU5TRkVSX0lEID0gInRyYW5zZmVySUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnVGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RyYW5zZmVyYnVpbGRlci90aW1lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTF9EUkFHX1NPVVJDRV9UUkFOU0ZFUlMgPSAiZHJhZ1NvdXJjZVRyYW5zZmVycyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTF9EUk9QX1RBUkdFVF9UUkFOU0ZFUlMgPSAiZHJvcFRhcmdldFRyYW5zZmVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUklPUklUSUVTID0geyJoaWdoZXN0IiwgImhpZ2giLCAibWlkIiwgImxvdyIsICJsb3dlc3QifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRFJBR19TT1VSQ0VfQ09OVFJJQlVUSU9OID0gImRyYWdTb3VyY2VDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RST1BfQUNUSU9OID0gImRyb3BBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RST1BfVEFSR0VUX0NPTlRSSUJVVElPTiA9ICJkcm9wVGFyZ2V0Q29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RSQU5TRkVSID0gInRyYW5zZmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBib29sZWFuIHVzZVByb3h5OwotCi0JY2xhc3MgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZyBleHRlbmRzIFRyYW5zZmVyIHsKLQkgICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NBdHRyaWJ1dGU7Ci0JICAgIHByaXZhdGUgVHJhbnNmZXIgcHJveHk7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIGdldFR5cGVJZHNNZXRob2QsIGdldFR5cGVOYW1lc01ldGhvZCwgamF2YVRvTmF0aXZlTWV0aG9kLCBuYXRpdmVUb0phdmFNZXRob2Q7Ci0KLQkgICAgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZygpIHsKLQkgICAgICAgIHN1cGVyKCk7Ci0JICAgIH0KLQotCSAgICBUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbG0sIFN0cmluZyBjbHNBdHRyKSB7Ci0JICAgICAgICBzdXBlcigpOwotCSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxtOwotCSAgICAgICAgdGhpcy5jbGFzc0F0dHJpYnV0ZSA9IGNsc0F0dHI7Ci0JICAgIH0KLQkgICAgCi0JICAgIHByaXZhdGUgVHJhbnNmZXIgbmV3SW5zdGFuY2UoKSB7Ci0JICAgICAgICBpZiAoKGVsZW1lbnQgIT0gbnVsbCkgJiYgKGNsYXNzQXR0cmlidXRlICE9IG51bGwpKSB7Ci0JCSAgICAgICAgT2JqZWN0IG8gPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVHJhbnNmZXIpIHsKLQkJICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7Ci0JCSAgICAgICAgICAgIGNsYXNzQXR0cmlidXRlID0gbnVsbDsKLQkJICAgICAgICAgICAgcmV0dXJuIChUcmFuc2ZlcilvOwotCQkgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0KLQkgICAgcHVibGljIFRyYW5zZmVyRGF0YVtdIGdldFN1cHBvcnRlZFR5cGVzKCkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotCSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2ZlckRhdGFbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFR5cGVJZHNNZXRob2QgPT0gbnVsbCkgewotICAgIAkgICAgICAgICAgICBDbGFzcyBydW50aW1lQ2xhc3MgPSBwcm94eS5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW50aW1lQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAJICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgCSAgICAgICAgICAgICAgICBnZXRUeXBlSWRzTWV0aG9kID0gcnVudGltZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRUeXBlSWRzIiwgbmV3IENsYXNzWzBdKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZUlkc01ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChnZXRUeXBlSWRzTWV0aG9kID09IG51bGwpICYmIChlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChnZXRUeXBlSWRzTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIEludGVnZXJbXSByZXR1cm4gdHlwZSB0byBpbnRbXQotICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gciA9IChpbnRbXSlnZXRUeXBlSWRzTWV0aG9kLmludm9rZShwcm94eSwgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgIT0gbnVsbCkgJiYgKHIubGVuZ3RoID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSByZXQgPSBuZXcgaW50W3IubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRbaV0gPSByW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IGludFswXTsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChnZXRUeXBlTmFtZXNNZXRob2QgPT0gbnVsbCkgewotICAgIAkgICAgICAgICAgICBDbGFzcyBydW50aW1lQ2xhc3MgPSBwcm94eS5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW50aW1lQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAJICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgCSAgICAgICAgICAgICAgICBnZXRUeXBlTmFtZXNNZXRob2QgPSBydW50aW1lQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldFR5cGVOYW1lcyIsIG5ldyBDbGFzc1swXSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVOYW1lc01ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChnZXRUeXBlTmFtZXNNZXRob2QgPT0gbnVsbCkgJiYgKGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdldFR5cGVOYW1lc01ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKWdldFR5cGVOYW1lc01ldGhvZC5pbnZva2UocHJveHksIG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZFR5cGUoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotCSAgICAgICAgICAgIHJldHVybiBwcm94eS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKTsKLQkgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChqYXZhVG9OYXRpdmVNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBydW50aW1lQ2xhc3MgPSBwcm94eS5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW50aW1lQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAJICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgCSAgICAgICAgICAgICAgICBqYXZhVG9OYXRpdmVNZXRob2QgPSBydW50aW1lQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImphdmFUb05hdGl2ZSIsIG5ldyBDbGFzc1tde29iamVjdC5nZXRDbGFzcygpLCB0cmFuc2ZlckRhdGEuZ2V0Q2xhc3MoKX0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgCSAgICAgICAgICAgICAgICBqYXZhVG9OYXRpdmVNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoamF2YVRvTmF0aXZlTWV0aG9kID09IG51bGwpICYmIChlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChqYXZhVG9OYXRpdmVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YVRvTmF0aXZlTWV0aG9kLmludm9rZShwcm94eSwgbmV3IE9iamVjdFtde29iamVjdCwgdHJhbnNmZXJEYXRhfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZVRvSmF2YU1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHJ1bnRpbWVDbGFzcyA9IHByb3h5LmdldENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bnRpbWVDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVRvSmF2YU1ldGhvZCA9IHJ1bnRpbWVDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgibmF0aXZlVG9KYXZhIiwgbmV3IENsYXNzW117dHJhbnNmZXJEYXRhLmdldENsYXNzKCl9KTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlVG9KYXZhTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hdGl2ZVRvSmF2YU1ldGhvZCA9PSBudWxsKSAmJiAoZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmF0aXZlVG9KYXZhTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAJICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVUb0phdmFNZXRob2QuaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0W117dHJhbnNmZXJEYXRhfSk7Ci0gICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotICAgIAkgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUzKTsKLSAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgVHJhbnNmZXIgZ2V0VHJhbnNmZXJDbGFzcygpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIHByb3h5OwotICAgICAgICB9Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogQHJldHVybiBPYmplY3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCU9iamVjdCBvYmogPSBudWxsOwotCi0JCVN0cmluZyBzaW5nbGV0b24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU0lOR0xFVE9OKTsKLQkJU3RyaW5nIG1ldGhvZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9NRVRIT0QpOwotCQlpZiAoVFJVRS5lcXVhbHNJZ25vcmVDYXNlKHNpbmdsZXRvbikgJiYgbWV0aG9kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJQ2xhc3MgY2xzID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKS5sb2FkQ2xhc3MobmFtZSk7Ci0JCQkJTWV0aG9kIG10ZCA9IGNscy5nZXRNZXRob2QobWV0aG9kLCBuZXcgQ2xhc3NbXXt9KTsKLQotCQkJCW9iaiA9IG10ZC5pbnZva2UobnVsbCwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlvYmogPSBudWxsOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlvYmogPSBudWxsOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJb2JqID0gbnVsbDsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCW9iaiA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvYmogPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhc3NBdHRyaWJ1dGUpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHsKLQkJLy8gSWYgcGx1Z2luIGhhcyBiZWVuIGxvYWRlZCBjcmVhdGUgZXh0ZW5zaW9uLgotCQkvLyBPdGhlcndpc2UsIHNob3cgYnVzeSBjdXJzb3IgdGhlbiBjcmVhdGUgZXh0ZW5zaW9uLgotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFswXSA9IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENvbnRyaWJ1dGlvblRhZzsKLQotCXByb3RlY3RlZCBMaXN0IHRhcmdldElEczsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBJRHJvcEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBJRHJvcEFjdGlvbiBjcmVhdGVEcm9wQWN0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCU9iamVjdCBvYmogPSBudWxsOwotCQlvYmogPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSURyb3BBY3Rpb24pID8gKElEcm9wQWN0aW9uKSBEcm9wQWN0aW9uUHJveHkubmV3SW5zdGFuY2Uob2JqKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zZmVySWQKLQkgKiBAcmV0dXJuIElEcm9wQWN0aW9uW10KLQkgKi8KLQlwcm90ZWN0ZWQgSURyb3BBY3Rpb25bXSBjcmVhdGVEcm9wQWN0aW9ucyhTdHJpbmcgdHJhbnNmZXJJZCkgewotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSURyb3BBY3Rpb25bMF07Ci0KLQkJZmluYWwgaW50IG51bSA9IGNhY2hlLnNpemUoKTsKLQkJaWYgKG51bSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJRHJvcEFjdGlvblswXTsKLQotCQlJRHJvcEFjdGlvbltdIGFzID0gbmV3IElEcm9wQWN0aW9uW251bV07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBQUklPUklUSUVTLmxlbmd0aDsgcCsrKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCWlmICghKFRBR19EUk9QX0FDVElPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB8fCAhKHRyYW5zZmVySWQuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UUkFOU0ZFUl9JRCkpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoUFJJT1JJVElFU1twXS5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKSkgfHwgKHAgPT0gMiAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJJT1JJVFkpID09IG51bGwpKSB7Ci0JCQkJCUlEcm9wQWN0aW9uIGEgPSBjcmVhdGVEcm9wQWN0aW9uKGVsZW1lbnQpOwotCQkJCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQkJCQlhc1tqXSA9IGE7Ci0JCQkJCQlqKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobnVtID09IGopCi0JCQlyZXR1cm4gYXM7Ci0KLQkJSURyb3BBY3Rpb25bXSBhczIgPSBuZXcgSURyb3BBY3Rpb25bal07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCQlhczJbaV0gPSBhc1tpXTsKLQkJfQotCi0JCXJldHVybiBhczI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zZmVyIGNyZWF0ZVRyYW5zZmVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JICAgIE9iamVjdCBvYmogPSBudWxsOwotCSAgICBpZiAodXNlUHJveHkpIHsKLQkgICAgICAgIG9iaiA9IG5ldyBUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgICBvYmogPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkgICAgfQotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUcmFuc2ZlcikgPyAoVHJhbnNmZXIpIG9iaiA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zZmVyW10gY3JlYXRlVHJhbnNmZXJzKCkgewotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVHJhbnNmZXJbMF07Ci0KLQkJZmluYWwgaW50IG51bSA9IGNhY2hlLnNpemUoKTsKLQkJaWYgKG51bSA9PSAwKQotCQkJcmV0dXJuIG5ldyBUcmFuc2ZlclswXTsKLQotCQlUcmFuc2ZlcltdIHRzID0gbmV3IFRyYW5zZmVyW251bV07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBQUklPUklUSUVTLmxlbmd0aDsgcCsrKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCWlmICghVEFHX1RSQU5TRkVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKFBSSU9SSVRJRVNbcF0uZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUklPUklUWSkpIHx8IChwID09IDIgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKSA9PSBudWxsKSkgewotCQkJCQlUcmFuc2ZlciB0ID0gY3JlYXRlVHJhbnNmZXIoZWxlbWVudCk7Ci0JCQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQkJCXRzW2pdID0gdDsKLQkJCQkJCWorKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChudW0gPT0gaikKLQkJCXJldHVybiB0czsKLQotCQlUcmFuc2ZlcltdIHRzMiA9IG5ldyBUcmFuc2ZlcltqXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCXRzMltpXSA9IHRzW2ldOwotCQl9Ci0KLQkJcmV0dXJuIHRzMjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJbXSBnZXREcmFnU291cmNlVHJhbnNmZXJzKFN0cmluZyBlZGl0b3JJZCkgewotCQlyZXR1cm4gZ2V0RHJhZ1NvdXJjZVRyYW5zZmVycyhuZXcgU3RyaW5nW117ZWRpdG9ySWR9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWRzCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJhZ1NvdXJjZVRyYW5zZmVycyhTdHJpbmdbXSBlZGl0b3JJZHMpIHsKLQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlyZWFkQ29udHJpYnV0aW9ucyhlZGl0b3JJZHMsIFRBR19EUkFHX1NPVVJDRV9DT05UUklCVVRJT04sIFBMX0RSQUdfU09VUkNFX1RSQU5TRkVSUyk7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gY3JlYXRlVHJhbnNmZXJzKCk7Ci0JCWlmIChkZWJ1Z1RpbWUpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERyYWdTb3VyY2VUcmFuc2ZlcnMoIiArIGVkaXRvcklkcyArICIpOiAiICsgdHJhbnNmZXJzLmxlbmd0aCArICIgdHJhbnNmZXJzIGNyZWF0ZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCXJldHVybiB0cmFuc2ZlcnM7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldERyb3BBY3Rpb25zKFN0cmluZyBlZGl0b3JJZCwgVHJhbnNmZXIgdHJhbnNmZXIpIGZvciB0aGUgcGVyZm9ybWFuY2UKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nIGVkaXRvcklkLCBTdHJpbmcgdHJhbnNmZXJDbGFzc05hbWUpIHsKLQkJcmV0dXJuIGdldERyb3BBY3Rpb25zKG5ldyBTdHJpbmdbXXtlZGl0b3JJZH0sIHRyYW5zZmVyQ2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHBhcmFtIGNsYXNzCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nIGVkaXRvcklkLCBUcmFuc2ZlciB0cmFuc2ZlcikgewotCQlyZXR1cm4gZ2V0RHJvcEFjdGlvbnMobmV3IFN0cmluZ1tde2VkaXRvcklkfSwgdHJhbnNmZXIpOwotCX0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RHJvcEFjdGlvbnMoU3RyaW5nW10gZWRpdG9ySWRzLCBUcmFuc2ZlciB0cmFuc2ZlcikgZm9yIHRoZSBwZXJmb3JtYW5jZQotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuIElEcm9wQWN0aW9uW10KLQkgKi8KLQlwdWJsaWMgSURyb3BBY3Rpb25bXSBnZXREcm9wQWN0aW9ucyhTdHJpbmdbXSBlZGl0b3JJZHMsIFN0cmluZyB0cmFuc2ZlckNsYXNzTmFtZSkgewotCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXJlYWRDb250cmlidXRpb25zKGVkaXRvcklkcywgVEFHX0RST1BfVEFSR0VUX0NPTlRSSUJVVElPTiwgUExfRFJPUF9UQVJHRVRfVFJBTlNGRVJTKTsKLQkJU3RyaW5nIHRyYW5zZmVySWQgPSBnZXRUcmFuc2ZlcklkT2ZDbGFzc05hbWUodHJhbnNmZXJDbGFzc05hbWUpOwotCQlJRHJvcEFjdGlvbltdIGFjdGlvbnMgPSBjcmVhdGVEcm9wQWN0aW9ucyh0cmFuc2ZlcklkKTsKLQkJaWYgKGRlYnVnVGltZSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0RHJvcEFjdGlvbnMoIiArIGVkaXRvcklkcyArICIpOiAiICsgYWN0aW9ucy5sZW5ndGggKyAiIGRyb3AgYWN0aW9ucyBjcmVhdGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcGFyYW0gY2xhc3MKLQkgKiBAcmV0dXJuIElEcm9wQWN0aW9uW10KLQkgKi8KLQlwdWJsaWMgSURyb3BBY3Rpb25bXSBnZXREcm9wQWN0aW9ucyhTdHJpbmdbXSBlZGl0b3JJZHMsIFRyYW5zZmVyIHRyYW5zZmVyKSB7Ci0JICAgIFN0cmluZyB0cmFuc2ZlckNsYXNzTmFtZTsKLQkgICAgaWYgKHRyYW5zZmVyIGluc3RhbmNlb2YgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZykgewotCSAgICAgICAgdHJhbnNmZXJDbGFzc05hbWUgPSAoKFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcpdHJhbnNmZXIpLmdldFRyYW5zZmVyQ2xhc3MoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHRyYW5zZmVyQ2xhc3NOYW1lID0gdHJhbnNmZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGdldERyb3BBY3Rpb25zKGVkaXRvcklkcywgdHJhbnNmZXJDbGFzc05hbWUpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJbXSBnZXREcm9wVGFyZ2V0VHJhbnNmZXJzKFN0cmluZyBlZGl0b3JJZCkgewotCQlyZXR1cm4gZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhuZXcgU3RyaW5nW117ZWRpdG9ySWR9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWRzCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhTdHJpbmdbXSBlZGl0b3JJZHMpIHsKLQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlyZWFkQ29udHJpYnV0aW9ucyhlZGl0b3JJZHMsIFRBR19EUk9QX1RBUkdFVF9DT05UUklCVVRJT04sIFBMX0RST1BfVEFSR0VUX1RSQU5TRkVSUyk7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gY3JlYXRlVHJhbnNmZXJzKCk7Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCVN0cmluZyBpZGxpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVkaXRvcklkcy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWRsaXN0ICs9IGVkaXRvcklkc1tpXTsKLQkJCQkJaWYgKGkgPCBlZGl0b3JJZHMubGVuZ3RoIC0gMSkKLQkJCQkJCWlkbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERyb3BUYXJnZXRUcmFuc2ZlcnMoIiArIGlkbGlzdCArICIpOiAiICsgdHJhbnNmZXJzLmxlbmd0aCArICIgdHJhbnNmZXJzIGNyZWF0ZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIHRyYW5zZmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJ0IElEIGF0dHJpYnV0ZSB0aGF0IGlzIGV4cGVjdGVkIGluIHRoZQotCSAqIHRhcmdldCBleHRlbnNpb24uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0SUQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RBUkdFVF9JRCk7Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiPz8/IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFRyYW5zZmVySWRPZkNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjYWNoZSA9PSBudWxsIHx8IG51bSA9PSAwKQotCQkJcmV0dXJuIGlkOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBvYmo7Ci0JCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKSkpIHsKLQkJCQkJaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGlkLmxlbmd0aCgpICE9IDAgPyBpZCA6IGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmdbXSBpZHMsIFN0cmluZyB0YWcsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQljYWNoZSA9IG51bGw7Ci0JCXRhcmdldElEcyA9IEFycmF5cy5hc0xpc3QoaWRzKTsKLQkJdGFyZ2V0Q29udHJpYnV0aW9uVGFnID0gdGFnOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlyZWFkUmVnaXN0cnkocmVnaXN0cnksIFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKHRhZy5lcXVhbHModGFyZ2V0Q29udHJpYnV0aW9uVGFnKSkgewotCQkJU3RyaW5nIGlkID0gZ2V0VGFyZ2V0SUQoZWxlbWVudCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCAhdGFyZ2V0SURzLmNvbnRhaW5zKGlkKSkgewotCQkJCS8vIFRoaXMgaXMgbm90IG9mIGludGVyZXN0IHRvIHVzIC0gZG9uJ3QgZ28gZGVlcGVyCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfVFJBTlNGRVIpKSB7Ci0JCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCQljYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0RST1BfQUNUSU9OKSkgewotCQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQkJY2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvL2NhY2hlLmFkZChjcmVhdGVBY3Rpb25EZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCWNhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBhY3Rpb24gLSBkb24ndCBnbyBpbnRvCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZWFkRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgVHJhbnNmZXJCdWlsZGVyKGJvb2xlYW4gdXNlUHJveHkpIGZvciB0aGUgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJCdWlsZGVyKCkgewotICAgICAgICB0aGlzKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHJhbnNmZXJCdWlsZGVyKGJvb2xlYW4gdXNlUHJveHkpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy51c2VQcm94eSA9IHVzZVByb3h5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Vbmtub3duQ29udGVudFR5cGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Vbmtub3duQ29udGVudFR5cGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkMmY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLQotLyoqCi0gKiBNZXNzYWdlIGRpYWxvZyBpbmZvcm1pbmcgdXNlciB0aGF0IGFuIGVkaXRvciB3YXMgb3BlbiBvbiB1bnN1cHBvcnRlZAotICogY29udGVudCB0eXBlCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duQ29udGVudFR5cGVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSB7Ci0KLQlwdWJsaWMgVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nKFNoZWxsIHBhcmVudCwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIGtleSkgewotCQkvLyBzZXQgbWVzc2FnZSB0byBudWxsIGluIHN1cGVyIHNvIHRoYXQgbWVzc2FnZSBkb2VzIG5vdCBhcHBlYXIgdHdpY2UKLQkJc3VwZXIocGFyZW50LCBTU0VVSU1lc3NhZ2VzLlVua25vd25Db250ZW50VHlwZURpYWxvZ18wLCBudWxsLCBudWxsLCBJTkZPUk1BVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBTU0VVSU1lc3NhZ2VzLlVua25vd25Db250ZW50VHlwZURpYWxvZ18xLCBmYWxzZSk7Ci0JCXNldFByZWZTdG9yZShzdG9yZSk7Ci0JCXNldFByZWZLZXkoa2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQotCQkvLyBvdmVyd3JpdHRlbiBzbyB0aGF0IHZhbHVlIHN0b3JlZCBpcyBib29sZWFuLCBub3Qgc3RyaW5nCi0JCWlmIChidXR0b25JZCAhPSBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCAmJiBnZXRUb2dnbGVTdGF0ZSgpICYmIGdldFByZWZTdG9yZSgpICE9IG51bGwgJiYgZ2V0UHJlZktleSgpICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoYnV0dG9uSWQpIHsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX0lEIDoKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCA6Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLlBST0NFRURfSUQgOgotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5PS19JRCA6Ci0JCQkJCWdldFByZWZTdG9yZSgpLnNldFZhbHVlKGdldFByZWZLZXkoKSwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fSUQgOgotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfSUQgOgotCQkJCQlnZXRQcmVmU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmS2V5KCksIHRydWUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlTWVzc2FnZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCQlMaW5rIG1lc3NhZ2VMaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1lc3NhZ2VMaW5rLnNldFRleHQoU1NFVUlNZXNzYWdlcy5Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMik7Ci0JCW1lc3NhZ2VMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9ICJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuQ29udGVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgcGFnZUlkLCBuZXcgU3RyaW5nW117cGFnZUlkfSwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNGUzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkdvdG9Bbm5vdGF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudWkuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW07Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG11bHRpIHBhZ2UgZWRpdG9yJ3MKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yLCBzaW5jZSBjYXNjYWRlZCBpbml0KCkgY2FsbCBmcm9tIHRoZQotICogQWN0aW9uQmFyQ29udHJpYnV0b3Igd2lsbCBjYXVzZXMgZXhjZXB0aW9uIGFuZCBpdCBsZWFkcyB0byBsb3NlIHdob2xlCi0gKiB0b29sYmFycy4KLSAqIAotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3Igb2YKLSAqIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvciBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvciBpbXBsZW1lbnRzIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciwgSUV4dGVuZGVkQ29udHJpYnV0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIF9zaG93RGVidWdTdGF0dXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9hY3Rpb25jb250cmlidXRvci9kZWJ1Z3N0YXR1c2ZpZWxkcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJRXh0ZW5kZWRDb250cmlidXRvciBleHRlbmRlZENvbnRyaWJ1dG9yOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkFkZEJsb2NrQ29tbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU2VwYXJhdG9yIGZDb21tYW5kc1NlcGFyYXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIGZEZWJ1Z1N0YXR1c09mZnNldCA9IG51bGw7Ci0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUgPSBudWxsOwotCXByb3RlY3RlZCBHcm91cE1hcmtlciBmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyID0gbnVsbDsKLQlwcm90ZWN0ZWQgR290b0Fubm90YXRpb25BY3Rpb24gZk5leHRBbm5vdGF0aW9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBHb3RvQW5ub3RhdGlvbkFjdGlvbiBmUHJldmlvdXNBbm5vdGF0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZSZW1vdmVCbG9ja0NvbW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlNoaWZ0TGVmdCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU2hpZnRSaWdodCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nQWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTdHJ1Y3R1cmVTZWxlY3ROZXh0QWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c0FjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZUb2dnbGVDb21tZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uOwotCXByb3RlY3RlZCBHcm91cE1hcmtlciBmVG9vbGJhckFkZGl0aW9uc0dyb3VwTWFya2VyID0gbnVsbDsKLQlwcm90ZWN0ZWQgU2VwYXJhdG9yIGZUb29sYmFyU2VwYXJhdG9yID0gbnVsbDsKLQotCXB1YmxpYyBBY3Rpb25Db250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQotCQlmQ29tbWFuZHNTZXBhcmF0b3IgPSBuZXcgU2VwYXJhdG9yKCk7Ci0KLQkJLy8gZWRpdCBjb21tYW5kcwotCQlmU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nQWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9FTkNMT1NJTkcgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfRU5DTE9TSU5HKTsKLQotCQlmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfTkVYVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRPVCk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3ROZXh0QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfTkVYVCk7Ci0KLQkJZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUyArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRPVCk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5TVFJVQ1RVUkVfU0VMRUNUX1BSRVZJT1VTKTsKLQotCQlmU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfSElTVE9SWSArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRPVCk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfSElTVE9SWSk7Ci0KLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudSA9IG5ldyBNZW51TWFuYWdlcihTU0VVSU1lc3NhZ2VzLkV4cGFuZFNlbGVjdGlvblRvTWVudV9sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ0FjdGlvbik7Ci0JCWZFeHBhbmRTZWxlY3Rpb25Ub01lbnUuYWRkKGZTdHJ1Y3R1cmVTZWxlY3ROZXh0QWN0aW9uKTsKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uKTsKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24pOwotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlmU2hpZnRSaWdodCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX1JJR0hUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRE9UKTsKLQkJZlNoaWZ0UmlnaHQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5TSElGVF9SSUdIVCk7Ci0KLQkJZlNoaWZ0TGVmdCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX0xFRlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmU2hpZnRMZWZ0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuU0hJRlRfTEVGVCk7Ci0KLQkJZlRvZ2dsZUNvbW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9UT0dHTEVfQ09NTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRPVCk7Ci0JCWZUb2dnbGVDb21tZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9DT01NRU5UKTsKLQotCQlmQWRkQmxvY2tDb21tZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQUREX0JMT0NLX0NPTU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmQWRkQmxvY2tDb21tZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkFERF9CTE9DS19DT01NRU5UKTsKLQotCQlmUmVtb3ZlQmxvY2tDb21tZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfUkVNT1ZFX0JMT0NLX0NPTU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmUmVtb3ZlQmxvY2tDb21tZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlJFTU9WRV9CTE9DS19DT01NRU5UKTsKLQotCQkvLyBnb3RvIHByZXYvbmV4dCBlcnJvcgotCQkvLyBDTVZDIDI0OTAxNyBmb3IgSmF2YUVkaXRvciBjb25zaXN0YW5jeQotCQlmUHJldmlvdXNBbm5vdGF0aW9uID0gbmV3IEdvdG9Bbm5vdGF0aW9uQWN0aW9uKCJQcmV2aW91c19hbm5vdGF0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWZQcmV2aW91c0Fubm90YXRpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5wcmV2aW91cyIpOyAvLyROT04tTkxTLTEkCi0KLQkJZk5leHRBbm5vdGF0aW9uID0gbmV3IEdvdG9Bbm5vdGF0aW9uQWN0aW9uKCJOZXh0X2Fubm90YXRpb24iLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV4dEFubm90YXRpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5uZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBSZWFkIGFjdGlvbiBleHRlbnNpb25zLgotCQlFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIoKTsKLQkJZXh0ZW5kZWRDb250cmlidXRvciA9IGJ1aWxkZXIucmVhZEFjdGlvbkV4dGVuc2lvbnMoZ2V0RXh0ZW5zaW9uSURzKCkpOwotCi0JCWZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIgPSBuZXcgR3JvdXBNYXJrZXIoU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfTkFNRV9NRU5VX0FERElUSU9OUyk7Ci0JCWZUb29sYmFyU2VwYXJhdG9yID0gbmV3IFNlcGFyYXRvcigpOwotCQlmVG9vbGJhckFkZGl0aW9uc0dyb3VwTWFya2VyID0gbmV3IEdyb3VwTWFya2VyKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX05BTUVfVE9PTEJBUl9BRERJVElPTlMpOwotCi0JCWZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIkVkaXRvci5Ub2dnbGVJbnNlcnRNb2RlLiIsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsgLy8kTk9OLU5MUy0xJAotCQlmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9JTlNFUlRfTU9ERSk7Ci0KLQkJaWYgKF9zaG93RGVidWdTdGF0dXMpIHsKLQkJCWZEZWJ1Z1N0YXR1c09mZnNldCA9IG5ldyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbShTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TVEFUVVNfQ0FURUdPUllfT0ZGU0VULCB0cnVlLCAyMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IFNTRVVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc291cmNlTWVudUlkID0gInNvdXJjZU1lbnVJZCI7IC8vIFRoaXMgaXMganVzdCBhIG1lbnUgaWQuIE5vIC8vJE5PTi1OTFMtMSQKLQkJLy8gbmVlZCB0byB0cmFuc2xhdGUuCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIHNvdXJjZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoc291cmNlTWVudUxhYmVsLCBzb3VyY2VNZW51SWQpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCBzb3VyY2VNZW51KTsKLQkJaWYgKHNvdXJjZU1lbnUgIT0gbnVsbCkgewotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZUb2dnbGVDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZBZGRCbG9ja0NvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZlJlbW92ZUJsb2NrQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGFkZCBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChfc2hvd0RlYnVnU3RhdHVzKSB7Ci0JCQltYW5hZ2VyLmFkZChmRGVidWdTdGF0dXNPZmZzZXQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQoZlRvb2xiYXJTZXBhcmF0b3IpOwotCQl0b29sQmFyTWFuYWdlci5hZGQoZlRvb2xiYXJBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQotCQlhZGRUb01lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9NZW51KG1lbnUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5JUG9wdXBNZW51Q29udHJpYnV0b3IjY29udHJpYnV0ZVRvUG9wdXBNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJYWRkVG9Qb3B1cE1lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9Qb3B1cE1lbnUobWVudSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvU3RhdHVzTGluZShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQotCQlhZGRUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCWFkZFRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBuZWVkIHRvIGNhbGwgc2V0QWN0aXZlRWRpdG9yIGJlZm9yZSBzdXBlci5kaXNwb3NlIGJlY2F1c2UgaW4gYm90aAotCQkvLyBzZXRBY3RpdmVFZGl0b3IgJiBzdXBlci5zZXRBY3RpdmVFZGl0b3IgaWYgZ2V0RWRpdG9yUGFydCA9PQotCQkvLyBhY3RpdmVFZGl0b3IsCi0JCS8vIHRoZSBtZXRob2QgaXMganVzdCByZXR1cm5lZC4gc28gdG8gZ2V0IGJvdGggbWV0aG9kcyB0byBydW4sCi0JCS8vIHNldEFjdGl2ZUVkaXRvcgotCQkvLyBuZWVkcyB0byBiZSBjYWxsZWQgc28gdGhhdCBpdCBjb3JyZWN0bHkgY2FsbHMgc3VwZXIuc2V0QWN0aXZlRWRpdG9yCi0JCXNldEFjdGl2ZUVkaXRvcihudWxsKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBFRElUT1JfSURTOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwgJiYgZWRpdG9yICE9IG51bGwpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCXJldHVybiB0ZXh0RWRpdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJc3VwZXIuaW5pdChiYXJzLCBwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZ2V0QWN0aXZlRWRpdG9yUGFydCgpID09IGFjdGl2ZUVkaXRvcikKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkdPVE9fTkVYVF9BTk5PVEFUSU9OLCBmTmV4dEFubm90YXRpb24pOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5HT1RPX1BSRVZJT1VTX0FOTk9UQVRJT04sIGZQcmV2aW91c0Fubm90YXRpb24pOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJFVklPVVMuZ2V0SWQoKSwgZlByZXZpb3VzQW5ub3RhdGlvbik7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ORVhULmdldElkKCksIGZOZXh0QW5ub3RhdGlvbik7Ci0KLQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSURFQWN0aW9uRmFjdG9yeS5BRERfVEFTSy5nZXRJZCgpLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSURFQWN0aW9uRmFjdG9yeS5BRERfVEFTSy5nZXRJZCgpKSk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElERUFjdGlvbkZhY3RvcnkuQk9PS01BUksuZ2V0SWQoKSwgZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElERUFjdGlvbkZhY3RvcnkuQk9PS01BUksuZ2V0SWQoKSkpOwotCQkJfQotCQl9Ci0KLQkJZlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ0FjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfRU5DTE9TSU5HKSk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3ROZXh0QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9ORVhUKSk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c0FjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfUFJFVklPVVMpKTsKLQkJZlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0hJU1RPUlkpKTsKLQotCQlmU2hpZnRSaWdodC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX1JJR0hUKSk7Ci0JCWZTaGlmdExlZnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TSElGVF9MRUZUKSk7Ci0KLQkJZlRvZ2dsZUNvbW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9UT0dHTEVfQ09NTUVOVCkpOwotCQlmQWRkQmxvY2tDb21tZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQUREX0JMT0NLX0NPTU1FTlQpKTsKLQkJZlJlbW92ZUJsb2NrQ29tbWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1JFTU9WRV9CTE9DS19DT01NRU5UKSk7Ci0KLQkJLy8gZ28gdG8gcHJldi9uZXh0IGVycm9yCi0JCS8vIENNVkMgMjQ5MDE3IGZvciBKYXZhRWRpdG9yIGNvbnNpc3RhbmN5Ci0JCWZQcmV2aW91c0Fubm90YXRpb24uc2V0RWRpdG9yKHRleHRFZGl0b3IpOwotCQlmTmV4dEFubm90YXRpb24uc2V0RWRpdG9yKHRleHRFZGl0b3IpOwotCi0JCWZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVE9HR0xFX0lOU0VSVF9NT0RFKSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJfQotCi0JCWlmIChfc2hvd0RlYnVnU3RhdHVzICYmIHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbikgewotCQkJKChJVGV4dEVkaXRvckV4dGVuc2lvbikgdGV4dEVkaXRvcikuc2V0U3RhdHVzRmllbGQoZkRlYnVnU3RhdHVzT2Zmc2V0LCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TVEFUVVNfQ0FURUdPUllfT0ZGU0VUKTsKLQkJCWZEZWJ1Z1N0YXR1c09mZnNldC5zZXRBY3RpdmVFZGl0b3IodGV4dEVkaXRvcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yI3NldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlmU2hpZnRSaWdodC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmU2hpZnRMZWZ0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZOZXh0QW5ub3RhdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUHJldmlvdXNBbm5vdGF0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJLyoKLQkJICogZkNvbW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsgZlVuY29tbWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkgKi8KLQkJZlRvZ2dsZUNvbW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZkFkZEJsb2NrQ29tbWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUmVtb3ZlQmxvY2tDb21tZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCS8vIGNvbnZlcnQgbGluZSBkZWxpbWl0ZXJzIGFyZSBub3Qgc291cmNlIHZpZXdlci1zcGVjaWZpYwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uSUV4dGVuZGVkQ29udHJpYnV0b3IjdXBkYXRlVG9vbGJhckFjdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCkgewotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25EZWZpbml0aW9uSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmRhZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotCi0vKioKLSAqIERlZmluZXMgdGhlIGRlZmluaXRpb25zIGlkcyBmb3IgZWRpdG9yIGFjdGlvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uRGVmaW5pdGlvbklkcyB7Ci0JLy9UT0RPOiBDYW4gdGhlc2UgYmUgYmV0dGVyIGRlZmluZWQgd2l0aCBhICJwbHVnaW4gcHJlZml4IiB0byBiZSBtb3JlIHBvcnRhYmxlPyAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfQkxPQ0tfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEVBTlVQX0RPQ1VNRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRURJVF9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnRzLmVkaXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSU5EX09DQ1VSUkVOQ0VTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElORk9STUFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2hvdy5qYXZhZG9jIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFOQUdFX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludHMubWFuYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1BFTl9GSUxFID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkub3Blbi5maWxlLmZyb20uc291cmNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUVVJQ0tfRklYID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC50ZXh0LmphdmEuY29ycmVjdGlvbi5hc3Npc3QucHJvcG9zYWxzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0JMT0NLX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUlVDVFVSRV9TRUxFQ1RfRU5DTE9TSU5HID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJVQ1RVUkVfU0VMRUNUX0hJU1RPUlkgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJVQ1RVUkVfU0VMRUNUX05FWFQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJVQ1RVUkVfU0VMRUNUX1BSRVZJT1VTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRPR0dMRV9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUT0dHTEVfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50cy50b2dnbGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTkNPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS51bmNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGl2ZUVkaXRvckFjdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGl2ZUVkaXRvckFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5NWQ2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgYWN0aW9ucyBhcmUgbm90IHByb3Blcmx5IGFjdGl2YXRlZCB3aXRoIHRoaXMgaGFuZGxlciBzbyBkbyBub3QKLSAqICAgICAgICAgICAgIHVzZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZlRWRpdG9yQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgZkFjdGlvbklkOwotCXByaXZhdGUgSVdvcmtiZW5jaFNpdGUgZlNpdGU7Ci0JcHJpdmF0ZSBJQWN0aW9uIGZUYXJnZXRBY3Rpb247Ci0KLQlwdWJsaWMgQWN0aXZlRWRpdG9yQWN0aW9uSGFuZGxlcihJV29ya2JlbmNoU2l0ZSBzaXRlLCBTdHJpbmcgaWQpIHsKLQkJc3VwZXIoKTsKLQkJZkFjdGlvbklkID0gaWQ7Ci0JCWZTaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRBY2NlbGVyYXRvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBY2NlbGVyYXRvcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRBY2NlbGVyYXRvcigpIDogMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRBY3Rpb25EZWZpbml0aW9uSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldEFjdGlvbkRlZmluaXRpb25JZCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXREZXNjcmlwdGlvbigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIZWxwTGlzdGVuZXIoKQotCSAqLwotCXB1YmxpYyBIZWxwTGlzdGVuZXIgZ2V0SGVscExpc3RlbmVyKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldEhlbHBMaXN0ZW5lcigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldE1lbnVDcmVhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSU1lbnVDcmVhdG9yIGdldE1lbnVDcmVhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFN0eWxlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0eWxlKCkgewotCQlyZXR1cm4gSUFjdGlvbi5BU19QVVNIX0JVVFRPTjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRUZXh0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldFRvb2xUaXBUZXh0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzQ2hlY2tlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmlzQ2hlY2tlZCgpIDogdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5pc0VuYWJsZWQoKSA6IGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzSGFuZGxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmlzSGFuZGxlZCgpIDogZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJaWYgKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCkKLQkJCWZUYXJnZXRBY3Rpb24ucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlpZiAoZlRhcmdldEFjdGlvbiAhPSBudWxsKQotCQkJZlRhcmdldEFjdGlvbi5ydW5XaXRoRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIE5PVCBTVVBQT1JURUQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEFjY2VsZXJhdG9yKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWN0aW9uRGVmaW5pdGlvbklkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBpZCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0Q2hlY2tlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEhlbHBMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRJZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRNZW51Q3JlYXRvcihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lbnVDcmVhdG9yKElNZW51Q3JlYXRvciBjcmVhdG9yKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0VG9vbFRpcFRleHQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdGV4dCkgewotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXJnZXRBY3Rpb24oKSB7Ci0JCWlmIChmU2l0ZSAhPSBudWxsICYmIGZTaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpICE9IG51bGwgJiYgZlNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBmU2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlJVGV4dEVkaXRvciBlZGl0b3IgPSBudWxsOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQllZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQ7Ci0JCQllbHNlCi0JCQkJZWRpdG9yID0gKElUZXh0RWRpdG9yKSAocGFydCAhPSBudWxsID8gcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKSA6IG51bGwpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJZlRhcmdldEFjdGlvbiA9IGVkaXRvci5nZXRBY3Rpb24oZkFjdGlvbklkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZlRhcmdldEFjdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJZlRhcmdldEFjdGlvbiA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE1NjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGVhbnVwQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0JcHJvdGVjdGVkIERpYWxvZyBmQ2xlYW51cERpYWxvZzsKLQotCXB1YmxpYyBDbGVhbnVwQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGJ1bmRsZSwgcHJlZml4LCBlZGl0b3IpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEaWFsb2cgZ2V0Q2xlYW51cERpYWxvZyhTaGVsbCBzaGVsbCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldFRleHRFZGl0b3IoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQlmaW5hbCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlZGl0b3IgPSAoU3RydWN0dXJlZFRleHRFZGl0b3IpIGdldFRleHRFZGl0b3IoKTsKLQkJCURpYWxvZyBjbGVhbnVwRGlhbG9nID0gZ2V0Q2xlYW51cERpYWxvZyhlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKGNsZWFudXBEaWFsb2cgIT0gbnVsbCkgewotCQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQkJaWYgKGNsZWFudXBQcm9jZXNzb3IgIT0gbnVsbCkKLQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwoZWRpdG9yLmdldE1vZGVsKCkpOwotCQkJCQkJfQotCQkJCQl9OwotCi0JCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnCi0JCQkJCQkJLy8gbW9kZWwgY2hhbmdlCi0JCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCQkvLyBydW4KLQkJCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0VGV4dFZpZXdlcigpLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCQkvLyBtb2RlbAotCQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvRm9ybWF0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0Zvcm1hdEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmM2MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvRm9ybWF0QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFJlc291cmNlQWN0aW9uRGVsZWdhdGUgewotCi0JY2xhc3MgRm9ybWF0Sm9iIGV4dGVuZHMgSm9iIHsKLQotCQlwdWJsaWMgRm9ybWF0Sm9iKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gY29udGFpbmVyCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgaW50IGdldFJlc291cmNlQ291bnQoSVJlc291cmNlW10gbWVtYmVycykgewotCQkJaW50IGNvdW50ID0gMDsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG1lbWJlcnNbaV0gaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIG1lbWJlcnNbaV07Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb3VudCArPSBnZXRSZXNvdXJjZUNvdW50KGNvbnRhaW5lci5tZW1iZXJzKCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHNraXAgY291bnRpbmcKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQljb3VudCsrOwotCQkJfQotCi0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVsZW1lbnRzCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgaW50IGdldFJlc291cmNlQ291bnQoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJCWludCBjb3VudCA9IDA7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIGVsZW1lbnRzW2ldOwotCQkJCQl0cnkgewotCQkJCQkJY291bnQgKz0gZ2V0UmVzb3VyY2VDb3VudChjb250YWluZXIubWVtYmVycygpKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBza2lwIGNvdW50aW5nCi0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJY291bnQrKzsKLQkJCX0KLQotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGZTZWxlY3Rpb24udG9BcnJheSgpOwotCQkJaW50IHJlc291cmNlQ291bnQgPSBnZXRSZXNvdXJjZUNvdW50KGVsZW1lbnRzKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCByZXNvdXJjZUNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQlwcm9jZXNzKG1vbml0b3IsIChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldKTsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci5kb25lKCk7Ci0KLQkJCWlmIChmRXJyb3JTdGF0dXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQkJc3RhdHVzID0gZkVycm9yU3RhdHVzOwotCQkJCWZFcnJvclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2UsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgTXVsdGlTdGF0dXMgZkVycm9yU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBnZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQlpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwgJiYgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzMsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQlmb3JtYXRQcm9jZXNzb3Iuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXRGaWxlKGZpbGUpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzUsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJZm9ybWF0KG1vbml0b3IsIGZpbGUpOwotCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0KLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yID09IG51bGwgfHwgIW1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJZm9ybWF0KG1vbml0b3IsIG1lbWJlcnNbaV0pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117cmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXJldHVybiBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0Rm9ybWF0UHJvY2Vzc29yKGNvbnRlbnRUeXBlSWQpOwotCX0KLQotCXByb3RlY3RlZCBKb2IgZ2V0Sm9iKCkgewotCQlyZXR1cm4gbmV3IEZvcm1hdEpvYihTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlX2pvYk5hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5SZXNvdXJjZUFjdGlvbkRlbGVnYXRlI3Byb2Nlc3Mob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3JtYXQobW9uaXRvciwgcmVzb3VyY2UpOwotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde3Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSNwcm9jZXNzb3JBdmFpbGFibGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NvckF2YWlsYWJsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCi0JCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG51bGw7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJCWZvcm1hdFByb2Nlc3NvciA9IGdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwpCi0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0JCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnM7Ci0JCQkJCW1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWJvb2xlYW4gYXZhaWxhYmxlID0gcHJvY2Vzc29yQXZhaWxhYmxlKG1lbWJlcnNbaV0pOwotCi0JCQkJCQlpZiAoYXZhaWxhYmxlKSB7Ci0JCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjY4NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFJlc291cmNlQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIEpvYiBnZXRKb2IoKSB7Ci0JCS8vIFJlc291cmNlQWN0aW9uRGVsZWdhdGUgZG9lcyBub3QgY3JlYXRlIGJhY2tncm91bmQgam9iCi0JCS8vIHN1YmNsYXNzIGNyZWF0ZXMgdGhlIGJhY2tncm91bmQgam9iIGZvciB0aGUgYWN0aW9uCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NvckF2YWlsYWJsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSByZXR1cm5zIGZhbHNlIGJ5IGRlZmF1bHQKLQkJLy8gc3ViY2xhc3MgcmV0dXJucyB0cnVlIGlmIHByb2Nlc3NvciBpcyBhdmFpbGFibGU7IGZhbHNlIG90aGVyd2lzZQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZlNlbGVjdGlvbiAhPSBudWxsICYmICFmU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJSm9iIGpvYiA9IGdldEpvYigpOwotCQkJaWYgKGpvYiAhPSBudWxsKQotCQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWJvb2xlYW4gYXZhaWxhYmxlID0gZmFsc2U7Ci0KLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gZlNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJCWF2YWlsYWJsZSA9IHByb2Nlc3NvckF2YWlsYWJsZSgoSVJlc291cmNlKSBlbGVtZW50c1tpXSk7Ci0KLQkJCQkJaWYgKGF2YWlsYWJsZSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJYWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1N0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDExYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLQotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfQUREX0JMT0NLX0NPTU1FTlQgPSAiQWRkQmxvY2tDb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfQ0xFQU5VUF9ET0NVTUVOVCA9ICJDbGVhbnVwRG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9DT01NRU5UID0gIkNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04gPSAiQ29udGVudEFzc2lzdENvbnRleHRJbmZvcm1hdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTID0gIkNvbnRlbnRBc3Npc3RQcm9wb3NhbHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9GSU5EX09DQ1VSUkVOQ0VTID0gIkZpbmRPY2N1cnJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTID0gIkZvcm1hdEFjdGl2ZUVsZW1lbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UID0gIkZvcm1hdERvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfSU5GT1JNQVRJT04gPSAiU2hvd1Rvb2x0aXBEZXNjIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfTUFOQUdFX0JSRUFLUE9JTlRTID0gIk1hbmFnZUJyZWFrcG9pbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfT1BFTl9GSUxFID0gIk9wZW5GaWxlRnJvbVNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1FVSUNLX0ZJWCA9ICJRdWlja0ZpeCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1JFTU9WRV9CTE9DS19DT01NRU5UID0gIlJlbW92ZUJsb2NrQ29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfRU5DTE9TSU5HID0gIlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfSElTVE9SWSA9ICJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9ORVhUID0gIlN0cnVjdHVyZVNlbGVjdE5leHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX1BSRVZJT1VTID0gIlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfVE9HR0xFX0NPTU1FTlQgPSAiVG9nZ2xlQ29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1VOQ09NTUVOVCA9ICJVbmNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERPVCA9ICIuIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHUk9VUF9OQU1FX01FTlVfQURESVRJT05TID0gIk1lbnVBZGRpdGlvbnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHUk9VUF9OQU1FX1RPT0xCQVJfQURESVRJT05TID0gIlRvb2xiYXJBZGRpdGlvbnMiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFUVVNfQ0FURUdPUllfT0ZGU0VUID0gIk9mZnNldCI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0ZjBlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmNvbnRlbnRhc3Npc3QuSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZW50YXNzaXN0LklTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLQotLyoqCi0gKiBBIHByb2Nlc3NvciB0aGF0IGFnZ3JlZ2F0ZXMgdGhlIHByb3Bvc2FscyBvZiBtdWx0aXBsZSBvdGhlciBwcm9jZXNzb3JzLgotICogV2hlbiBwcm9wb3NhbHMgYXJlIHJlcXVlc3RlZCwgdGhlIGNvbnRhaW5lZCBwcm9jZXNzb3JzIGFyZSBxdWVyaWVkIGluIHRoZQotICogb3JkZXIgdGhleSB3ZXJlIGFkZGVkIHRvIHRoZSBjb21wb3VuZCBvYmplY3QuIENvcGllZCBmcm9tCi0gKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5Db21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuCi0gKiBNb2RpZmljYXRpb24gd2FzIG1hZGUgdG8gYWRkIGEgZGlzcG9zZSgpIG1ldGhvZC4KLSAqLwotY2xhc3MgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb24gewotCQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb24gZkluZm87Ci0JCXByaXZhdGUgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZlByb2Nlc3NvcjsKLQotCQlXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCQlmUHJvY2Vzc29yID0gcHJvY2Vzc29yOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBmSW5mby5lcXVhbHMob2JqKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0Q29udGV4dERpc3BsYXlTdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb250ZXh0RGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiBmSW5mby5nZXRDb250ZXh0RGlzcGxheVN0cmluZygpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRJbWFnZSgpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCQlyZXR1cm4gZkluZm8uZ2V0SW1hZ2UoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIGZJbmZvLmdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gZkluZm8uaGFzaENvZGUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGZJbmZvLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoKSB7Ci0JCQlyZXR1cm4gZlByb2Nlc3NvcjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgewotCQlMaXN0IGZWYWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGZWYWxpZGF0b3I7Ci0KLQkJdm9pZCBhZGQoSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJCWZWYWxpZGF0b3JzLmFkZCh2YWxpZGF0b3IpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpbnN0YWxsKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyBpbnN0YWxsIGVpdGhlciB0aGUgdmFsaWRhdG9yIGluIHRoZSBpbmZvLCBvciBhbGwgdmFsaWRhdG9ycwotCQkJZlZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihpbmZvKTsKLQkJCWlmIChmVmFsaWRhdG9yICE9IG51bGwpCi0JCQkJZlZhbGlkYXRvci5pbnN0YWxsKGluZm8sIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQllbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlZhbGlkYXRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHYgPSAoSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikgaXQubmV4dCgpOwotCQkJCQl2Lmluc3RhbGwoaW5mbywgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldFZhbGlkYXRvcihJQ29udGV4dEluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWlmIChpbmZvIGluc3RhbmNlb2YgV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbikgewotCQkJCVdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24gd3JhcCA9IChXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uKSBpbmZvOwotCQkJCXJldHVybiB3cmFwLmdldFByb2Nlc3NvcigpLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyB1c2UgZWl0aGVyIHRoZSB2YWxpZGF0b3IgaW4gdGhlIGluZm8sIG9yIGFsbCB2YWxpZGF0b3JzCi0JCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQkJCWlmIChmVmFsaWRhdG9yICE9IG51bGwpCi0JCQkJaXNWYWxpZCA9IGZWYWxpZGF0b3IuaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmVmFsaWRhdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgdiA9IChJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBpdC5uZXh0KCk7Ci0JCQkJCWlzVmFsaWQgfD0gdi5pc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBpc1ZhbGlkOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JFeCBleHRlbmRzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB7Ci0KLQkJLyoKLQkJICogQHNlZSBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uLAotCQkgKiAgICAgIElDb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIGluc3RhbGwgZWl0aGVyIHRoZSB2YWxpZGF0b3IgaW4gdGhlIGluZm8sIG9yIGFsbCB2YWxpZGF0b3JzCi0JCQlmVmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKGluZm8pOwotCQkJaWYgKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpCi0JCQkJKChJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGZWYWxpZGF0b3IpLmluc3RhbGwoaW5mbywgY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmVmFsaWRhdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCWlmIChpdC5uZXh0KCkgaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpCi0JCQkJCQkoKElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikgaXQubmV4dCgpKS5pbnN0YWxsKGluZm8sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIFNldCBmUHJvY2Vzc29ycyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3aXRoIG9uZSBjaGlsZCBwcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3NvciB0byBhZGQKLQkgKi8KLQlwdWJsaWMgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvcikgewotCQlhZGQocHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcHJvY2Vzc29yIHRvIHRoaXMgY29tcG91bmQgcHJvY2Vzc29yLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9jZXNzb3IgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKHByb2Nlc3Nvcik7Ci0JCWZQcm9jZXNzb3JzLmFkZChwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBwcm9jZXNzb3IgZnJvbSB0aGlzIGNvbXBvdW5kIHByb2Nlc3Nvci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJvY2Vzc29yIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJZlByb2Nlc3NvcnMucmVtb3ZlKHByb2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBhbmQgYWRkcyBhbGwgc3BlY2lmaWVkIHByb2Nlc3NvcnMuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZChwcm9jZXNzb3JzW2ldKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUxpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsKQotCQkJCXJldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9wb3NhbHMpKTsKLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmV0LnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmV0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgb2JqZWN0cyBhcmUgd3JhcHBlciBvYmplY3RzIGFyb3VuZCB0aGUgcmVhbCBpbmZvcm1hdGlvbgotCSAqIGNvbnRhaW5lcnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIGluZm9ybWF0aW9ucyA9IHAuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCWlmIChpbmZvcm1hdGlvbnMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9ybWF0aW9ucy5sZW5ndGg7IGkrKykKLQkJCQkJcmV0LmFkZChuZXcgV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbihpbmZvcm1hdGlvbnNbaV0sIHApKTsKLQkJfQotCQlyZXR1cm4gKElDb250ZXh0SW5mb3JtYXRpb25bXSkgcmV0LnRvQXJyYXkobmV3IElDb250ZXh0SW5mb3JtYXRpb25bcmV0LnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJU2V0IHJldCA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQljaGFyW10gY2hhcnMgPSBwLmdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCQkJaWYgKGNoYXJzICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykKLQkJCQkJcmV0LmFkZChuZXcgQ2hhcmFjdGVyKGNoYXJzW2ldKSk7Ci0JCX0KLQotCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltyZXQuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmV0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgaSsrKSB7Ci0JCQlDaGFyYWN0ZXIgY2ggPSAoQ2hhcmFjdGVyKSBpdC5uZXh0KCk7Ci0JCQljaGFyc1tpXSA9IGNoLmNoYXJWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBjaGFyczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCVNldCByZXQgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJY2hhcltdIGNoYXJzID0gcC5nZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKTsKLQkJCWlmIChjaGFycyAhPSBudWxsKQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspCi0JCQkJCXJldC5hZGQobmV3IENoYXJhY3RlcihjaGFyc1tpXSkpOwotCQl9Ci0KLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbcmV0LnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7IGkrKykgewotCQkJQ2hhcmFjdGVyIGNoID0gKENoYXJhY3RlcikgaXQubmV4dCgpOwotCQkJY2hhcnNbaV0gPSBjaC5jaGFyVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gY2hhcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3Qgbm9uLSA8Y29kZT5udWxsPC9jb2RlPiBlcnJvciBtZXNzYWdlIG9mIGFueQotCSAqIGNvbnRhaW5lZCBwcm9jZXNzb3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2Nlc3NvciBoYXMgYW4KLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldEVycm9yTWVzc2FnZSgpCi0JICogQHJldHVybiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZXJyID0gcC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCWlmIChlcnIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgdmFsaWRhdG9yIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIHZhbGlkYXRvcnMgcHJvdmlkZWQgYnkKLQkgKiB0aGUgY2hpbGQgcHJvY2Vzc29ycy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCWJvb2xlYW4gaGFzVmFsaWRhdG9yID0gZmFsc2U7Ci0JCWJvb2xlYW4gaGFzRXh0ZW5zaW9uID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHYgPSBwLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCQkJaWYgKHYgaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIHsKLQkJCQloYXNFeHRlbnNpb24gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAodiAhPSBudWxsKSB7Ci0JCQkJaGFzVmFsaWRhdG9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCUNvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQlpZiAoaGFzRXh0ZW5zaW9uKQotCQkJdmFsaWRhdG9yID0gbmV3IENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvckV4KCk7Ci0JCWVsc2UgaWYgKGhhc1ZhbGlkYXRvcikKLQkJCXZhbGlkYXRvciA9IG5ldyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3IoKTsKLQotCQlpZiAodmFsaWRhdG9yICE9IG51bGwpCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHYgPSBwLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCQkJCWlmICh2ICE9IG51bGwpCi0JCQkJCXZhbGlkYXRvci5hZGQodik7Ci0JCQl9Ci0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvcikgewotCQkJCUlTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBvOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChwcm9wb3NhbHMgIT0gbnVsbCkKLQkJCQkJcmV0LmFkZEFsbChBcnJheXMuYXNMaXN0KHByb3Bvc2FscykpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHJldC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3JldC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIG9iamVjdHMgYXJlIHdyYXBwZXIgb2JqZWN0cyBhcm91bmQgdGhlIHJlYWwgaW5mb3JtYXRpb24KLQkgKiBjb250YWluZXJzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmNvbnRlbnRhc3Npc3QuSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFN1YmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElDb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wgY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIHsKLQkJCQlJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvcikgbzsKLQkJCQlJQ29udGV4dEluZm9ybWF0aW9uW10gaW5mb3JtYXRpb25zID0gcC5jb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChpbmZvcm1hdGlvbnMgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcm1hdGlvbnMubGVuZ3RoOyBpKyspCi0JCQkJCQlyZXQuYWRkKG5ldyBXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uKGluZm9ybWF0aW9uc1tpXSwgcCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbnRleHRJbmZvcm1hdGlvbltdKSByZXQudG9BcnJheShuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltyZXQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBvZiBhbnkgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyB0aGF0IG5lZWQgZGlzcG9zaW5nCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBsaXN0IG9mIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgYW5kIGRpc3Bvc2UKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCWlmIChwIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpIHsKLQkJCQkoKElSZWxlYXNhYmxlKSBwKS5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJZlByb2Nlc3NvcnMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZW50QXNzaXN0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGYxMmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50QXNzaXN0VXRpbHMgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xvc2VzdCBJbmRleGVkUmVnaW9uIGZvciB0aGUgb2Zmc2V0IGFuZCB2aWV3ZXIgYWxsb3dpbmcKLQkgKiBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiB2aWV3ZXIgb2Zmc2V0cyBhbmQgbW9kZWwgcG9zaXRpb25zLiBub3RlOiB0aGlzCi0JICogbWV0aG9kIHJldHVybnMgYW4gSW5kZXhlZFJlZ2lvbiBmb3IgcmVhZCBvbmx5Ci0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHByb3Bvc2FscwotCSAqIEBwYXJhbSBkb2N1bWVudE9mZnNldAotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbXBsZXRpb25zIHNob3VsZAotCSAqICAgICAgICAgICAgYmUgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIGFuIEluZGV4ZWRSZWdpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluZGV4ZWRSZWdpb24gZ2V0Tm9kZUF0KElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0KLQkJaWYgKHZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBub2RlID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtbSA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAobW0gIT0gbnVsbCkKLQkJCW1vZGVsID0gbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCQl0cnkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGFzdE9mZnNldCA9IGRvY3VtZW50T2Zmc2V0OwotCQkJCW5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50T2Zmc2V0KTsKLQkJCQl3aGlsZSAobm9kZSA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJCQlsYXN0T2Zmc2V0LS07Ci0JCQkJCW5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsb3Nlc3QgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmb3IgdGhlIG9mZmVzdCBhbmQKLQkgKiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudE9mZnNldAotCSAqIEByZXR1cm4gdGhlIGNsb3Nlc3QgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmb3IgdGhlIG9mZmVzdCBhbmQKLQkgKiAgICAgICAgIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBudWxsOwotCQlpZiAodmlld2VyID09IG51bGwgfHwgdmlld2VyLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBsYXN0T2Zmc2V0ID0gZG9jdW1lbnRPZmZzZXQ7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlzZFJlZ2lvbiA9IGRvYy5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudE9mZnNldCk7Ci0JCXdoaWxlIChzZFJlZ2lvbiA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJbGFzdE9mZnNldC0tOwotCQkJc2RSZWdpb24gPSBkb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobGFzdE9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHNkUmVnaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21Db21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzNzk5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21Db21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJQ29tcGxldGlvblByb3Bvc2FsIHdob3NlIHZhbHVlcyBjYW4gYmUgcmVhZCBhZnRlcgotICogY3JlYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiwgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0gICAgCi0JcHJpdmF0ZSBTdHJpbmcgZkFkZGl0aW9uYWxQcm9wb3NhbEluZm87Ci0KLSAgICBwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb24gZkNvbnRleHRJbmZvcm1hdGlvbjsKLQotICAgIHByaXZhdGUgaW50IGZDdXJzb3JQb3NpdGlvbiA9IDA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmRGlzcGxheVN0cmluZzsKLQotICAgIHByaXZhdGUgSW1hZ2UgZkltYWdlOwotCi0gICAgcHJpdmF0ZSBpbnQgZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGg7Ci0KLSAgICBwcml2YXRlIGludCBmUmVsZXZhbmNlID0gSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkU7Ci0KLSAgICBwcml2YXRlIGludCBmUmVwbGFjZW1lbnRMZW5ndGggPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgZlJlcGxhY2VtZW50T2Zmc2V0ID0gMDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZSZXBsYWNlbWVudFN0cmluZyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZlVwZGF0ZUxlbmd0aE9uVmFsaWRhdGU7Ci0KLSAgICBwcml2YXRlIGNoYXJbXSBmVHJpZ2dlcnM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHJlbGV2YW5jZSBhbmQgcmVwbGFjZW1lbnQgbGVuZ3RoIHVwZGF0ZSBmbGFnLgotICAgICAqIAotICAgICAqIElmIHRoZSA8Y29kZT51cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGU8L2NvZGU+IGZsYWcgaXMgdHJ1ZSwKLSAgICAgKiB0aGVuIHdoZW4gdGhlIHVzZXIgdHlwZXMsIHRoZSByZXBsYWNlbWVudCBsZW5ndGggd2lsbCBiZSBpbmNyZW1lbnRlZCBieQotICAgICAqIHRoZSBudW1iZXIgb2YgbmV3IGNoYXJhY3RlcnMgaW5zZXJ0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcG9zaXRpb24uCi0gICAgICogT3RoZXJ3aXNlIHRoZSByZXBsYWNlbWVudCBsZW5ndGggd2lsbCBub3QgY2hhbmdlIG9uIHZhbGlkYXRlLgotICAgICAqIAotICAgICAqIGV4LgotICAgICAqIAotICAgICAqIDx0YWcgfG5hbWU9ImF0dHIiPiAtIHRoZSByZXBsYWNlbWVudCBsZW5ndGggaXMgNCA8dGFnIGl8bmFtZT0iYXR0ciI+IC0KLSAgICAgKiB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIGlzIG5vdyA1IDx0YWcgaWR8bmFtZT0iYXR0ciI+IC0gdGhlIHJlcGxhY2VtZW50Ci0gICAgICogbGVuZ3RoIGlzIG5vdyA2IDx0YWcgfG5hbWU9ImF0dHIiPiAtIHRoZSByZXBsYWNlbWVudGxlbmd0aCBpcyBub3cgNCBhZ2FpbgotICAgICAqIDx0YWcgfG5hbWU9ImF0dHIiPiAtIHRoZSByZXBsYWNtZW50IGxlbmd0aCByZW1haW5zIDQKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLAotICAgICAgICAgICAgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotICAgICAgICBmUmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKLSAgICAgICAgZlJlcGxhY2VtZW50T2Zmc2V0ID0gcmVwbGFjZW1lbnRPZmZzZXQ7Ci0gICAgICAgIGZSZXBsYWNlbWVudExlbmd0aCA9IHJlcGxhY2VtZW50TGVuZ3RoOwotICAgICAgICBmQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLSAgICAgICAgZkltYWdlID0gaW1hZ2U7Ci0gICAgICAgIGZEaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLSAgICAgICAgZkNvbnRleHRJbmZvcm1hdGlvbiA9IGNvbnRleHRJbmZvcm1hdGlvbjsKLSAgICAgICAgZkFkZGl0aW9uYWxQcm9wb3NhbEluZm8gPSBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvOwotICAgICAgICBmUmVsZXZhbmNlID0gcmVsZXZhbmNlOwotICAgICAgICBmVXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZTsKLSAgICAgICAgZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGggPSBmUmVwbGFjZW1lbnRMZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywKLSAgICAgICAgICAgIElDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uLCBTdHJpbmcgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgaW50IHJlbGV2YW5jZSkgewotICAgICAgICB0aGlzKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGN1cnNvclBvc2l0aW9uLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICBDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKGdldFJlcGxhY2VtZW50U3RyaW5nKCksIGdldFJlcGxhY2VtZW50T2Zmc2V0KCksIGdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGdldEN1cnNvclBvc2l0aW9uKCksIGdldEltYWdlKCksIGdldERpc3BsYXlTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSwgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpKTsKLSAgICAgICAgcHJvcG9zYWwuYXBwbHkoZG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0gICAgICogICAgICBjaGFyLCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLSAgICAgICAgQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChnZXRSZXBsYWNlbWVudFN0cmluZygpLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBnZXRSZXBsYWNlbWVudExlbmd0aCgpLCBnZXRDdXJzb3JQb3NpdGlvbigpLCBnZXRJbWFnZSgpLCBnZXREaXNwbGF5U3RyaW5nKCksCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dEluZm9ybWF0aW9uKCksIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSk7Ci0gICAgICAgIC8vIHdlIGN1cnJlbnRseSBkb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB3aGljaCBjaGFyYWN0ZXIKLSAgICAgICAgLy8gc2VsZWN0ZWQgdGhlIHByb3Bvc2FsLCBhbmQgd2hlcmUgdGhlIGN1cnNvciBvZmZzZXQgaXMKLSAgICAgICAgLy8gYnV0IHdlIG1pZ2h0IGluIHRoZSBmdXR1cmUuLi4KLSAgICAgICAgcHJvcG9zYWwuYXBwbHkoZG9jdW1lbnQpOwotICAgICAgICAvLyB3ZSB3YW50IHRvIENvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlci51cGRhdGVQcmVzZW50YXRpb24oKSBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLSAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIC8vIENNVkMgMjUyNjM0IHRvIGNvbXBlbnNhdGUgZm9yICJpbnZpc2libGUiIGluaXRpYWwgcmVnaW9uCi0gICAgICAgIGludCBjYXJldE9mZnNldCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLSAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotICAgICAgICAgICAgSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLSAgICAgICAgICAgIGNhcmV0T2Zmc2V0ID0gZXh0ZW5zaW9uLndpZGdldE9mZnNldDJNb2RlbE9mZnNldChjYXJldE9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYXJldE9mZnNldCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKSArIHZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCkuZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FyZXRPZmZzZXQgPT0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSkgewotICAgICAgICAgICAgYXBwbHkoZG9jdW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgdGV4dCB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FyZXQgUG9zaXRpb24gYXMgdGhpcwotICAgICAgICAgICAgLy8gY2F1c2VzIHRoZSBjdXJzb3IgdG8gbW92ZSBvbiBpdHMgb3duCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCBlbmRPZmZzZXRPZkNoYW5nZXMgPSBnZXRSZXBsYWNlbWVudFN0cmluZygpLmxlbmd0aCgpICsgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHBvcnRpb24gb2YgdGhlIG5ldyB0ZXh0IHRoYXQgY29tZXMgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgLy8gY3VycmVudCBjYXJldCBwb3NpdGlvbgotICAgICAgICAgICAgICAgIGlmIChlbmRPZmZzZXRPZkNoYW5nZXMgPj0gY2FyZXRPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoID0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgLSBjYXJldE9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZUNhcmV0UmVwbGFjZW1lbnRMZW5ndGggPSBnZXRSZXBsYWNlbWVudFN0cmluZygpLmxlbmd0aCgpIC0gKGVuZE9mZnNldE9mQ2hhbmdlcyAtIGNhcmV0T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKiogcG9zdENhcmV0UmVwbGFjZW1lbnRMZW5ndGggd2FzIG5lZ2F0aXZlOiAiICsgcG9zdENhcmV0UmVwbGFjZW1lbnRMZW5ndGgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgYSBxdWljayBmaXggd2hpbGUgSSBmaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VtZW50IGxlbmd0aCBpcyBzdXBwb3NlZCB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gZWFjaCBjYXNlLCBvdGhlcndpc2Ugd2UnbGwgZ2V0IG5lZ2F0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNtZW50IGxlbmd0aCBzb21ldGltZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZXBsYWNlKGNhcmV0T2Zmc2V0LCBwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCwgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5zdWJzdHJpbmcocHJlQ2FyZXRSZXBsYWNlbWVudExlbmd0aCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHBvcnRpb24gb2YgdGhlIG5ldyB0ZXh0IHRoYXQgY29tZXMgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgY2FyZXQgcG9zaXRpb24KLSAgICAgICAgICAgICAgICAvLyBEb25lIHNlY29uZCBzaW5jZSBvZmZzZXRzIHdvdWxkIGNoYW5nZSBmb3IgdGhlIHBvc3QgdGV4dAotICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZQotICAgICAgICAgICAgICAgIC8vIE91dHJpZ2h0IGluc2VydGlvbnMgYXJlIGhhbmRsZWQgaGVyZQotICAgICAgICAgICAgICAgIGlmIChjYXJldE9mZnNldCA+IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZUNhcmV0VGV4dExlbmd0aCA9IGNhcmV0T2Zmc2V0IC0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVwbGFjZShnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBwcmVDYXJldFRleHRMZW5ndGgsIGdldFJlcGxhY2VtZW50U3RyaW5nKCkuc3Vic3RyaW5nKDAsIHByZUNhcmV0VGV4dExlbmd0aCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgICAgICBhcHBseShkb2N1bWVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhcHBseShkb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0gICAgICAgIC8vIHJldHVybiBmUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotICAgICAgICByZXR1cm4gZkFkZGl0aW9uYWxQcm9wb3NhbEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotICAgICAgICAvLyByZXR1cm4gZlByb3Bvc2FsLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotICAgICAgICByZXR1cm4gZkNvbnRleHRJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mbykgewotICAgICAgICBmQ29udGV4dEluZm9ybWF0aW9uID0gY29udGV4dEluZm87Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiNnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnNvclBvc2l0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBmQ3Vyc29yUG9zaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IHBvcykgewotICAgICAgICBmQ3Vyc29yUG9zaXRpb24gPSBwb3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheVN0cmluZyhTdHJpbmcgbmV3RGlzcGxheVN0cmluZykgewotICAgIAlmRGlzcGxheVN0cmluZyA9IG5ld0Rpc3BsYXlTdHJpbmc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLSAgICAgICAgLy8gcmV0dXJuIGZQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBmRGlzcGxheVN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgIC8vIHJldHVybiBmUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLSAgICAgICAgcmV0dXJuIGZJbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJlbGV2YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGZSZWxldmFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IG5ld1JlcGxhY2VtZW50TGVuZ3RoKSB7Ci0gICAgICAgIGZSZXBsYWNlbWVudExlbmd0aCA9IG5ld1JlcGxhY2VtZW50TGVuZ3RoOwotICAgIH0gIAotICAgIHB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBmUmVwbGFjZW1lbnRMZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSZXBsYWNlbWVudE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIGZSZXBsYWNlbWVudE9mZnNldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VtZW50U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZlJlcGxhY2VtZW50U3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIC8vIHJldHVybiBmUHJvcG9zYWwuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLSAgICAgICAgQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChnZXRSZXBsYWNlbWVudFN0cmluZygpLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBnZXRSZXBsYWNlbWVudExlbmd0aCgpLCBnZXRDdXJzb3JQb3NpdGlvbigpLCBnZXRJbWFnZSgpLCBnZXREaXNwbGF5U3RyaW5nKCksCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dEluZm9ybWF0aW9uKCksIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSk7Ci0gICAgICAgIHJldHVybiBwcm9wb3NhbC5nZXRTZWxlY3Rpb24oZG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jZ2V0VHJpZ2dlckNoYXJhY3RlcnMoKQotICAgICAqLwotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUcmlnZ2VyQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGZUcmlnZ2VyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmlnZ2VyQ2hhcmFjdGVycyhjaGFyW10gdHJpZ2dlcnMpIHsKLSAgICAgICAgZlRyaWdnZXJzID0gdHJpZ2dlcnM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiNpc1ZhbGlkRm9yKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotICAgICAqICAgICAgaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRGb3IoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZShkb2N1bWVudCwgb2Zmc2V0LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNzZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotICAgICAqICAgICAgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLSAgICB9Ci0KLSAgICAvLyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gSmF2YUNvbXBsZXRpb25Qcm9wb3NhbAotICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0c1dpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgd29yZCkgewotCQotICAgIAlpbnQgd29yZExlbmd0aCA9IHdvcmQgPT0gbnVsbCA/IDAgOiB3b3JkLmxlbmd0aCgpOwotICAgICAgICBpZiAob2Zmc2V0ID4gZlJlcGxhY2VtZW50T2Zmc2V0ICsgd29yZExlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IG9mZnNldCAtIGZSZXBsYWNlbWVudE9mZnNldDsKLSAgICAgICAgICAgIFN0cmluZyBzdGFydCA9IGRvY3VtZW50LmdldChmUmVwbGFjZW1lbnRPZmZzZXQsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB3b3JkLnN1YnN0cmluZygwLCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RhcnQpOwotICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYm9ycm93ZWQgZnJvbSBKYXZhQ29tcGxldGlvblByb3Bvc2FsCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0gICAgICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IGZSZXBsYWNlbWVudE9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBzdGFydHNXaXRoKGRvY3VtZW50LCBvZmZzZXQsIGZEaXNwbGF5U3RyaW5nKTsKLQotICAgICAgICBpZiAoZlVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpIHsKLQotICAgICAgICAgICAgLy8gaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSAib3JpZ2luYWxDdXJzb3JQb3NpdGlvbiIgaW5zdGVhZCBvZgotICAgICAgICAgICAgLy8gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgYnV0IHdlIGRvbid0IGhhdmUgdGhhdCBpbmZvLgotICAgICAgICAgICAgaW50IG5ld0xlbmd0aCA9IG9mZnNldCAtIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0gICAgICAgICAgICBpbnQgZGVsdGEgPSBuZXdMZW5ndGggLSBmT3JpZ2luYWxSZXBsYWNlbWVudExlbmd0aDsKLSAgICAgICAgICAgIGZSZXBsYWNlbWVudExlbmd0aCA9IGRlbHRhICsgZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGg7Ci0gICAgICAgICAgICAKLSAgICAgICAgCS8vIGlmIGl0J3MgYW4gYXR0cmlidXRlIHZhbHVlLCByZXBsYWNlbWVudCBvZmZzZXQgaXMKLSAgICAgICAgICAgIC8vIGdvaW5nIHRvIGJlIG9uZSBvZmYgZnJvbSB0aGUgYWN0dWFsIGN1cnNvciBvZmZzZXQuLi4KLSAgICAgICAgCWNoYXIgZmlyc3RDaGFyID0gZG9jdW1lbnQuZ2V0KCkuY2hhckF0KGdldFJlcGxhY2VtZW50T2Zmc2V0KCkpOwotICAgICAgICAJaWYoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykKLSAgICAgICAgCQlmUmVwbGFjZW1lbnRMZW5ndGggKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlcGxhY2VtZW50T2Zmc2V0IFRoZSBmUmVwbGFjZW1lbnRPZmZzZXQgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50T2Zmc2V0KGludCByZXBsYWNlbWVudE9mZnNldCkgewotICAgICAgICBmUmVwbGFjZW1lbnRPZmZzZXQgPSByZXBsYWNlbWVudE9mZnNldDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlcGxhY2VtZW50U3RyaW5nIFRoZSBmUmVwbGFjZW1lbnRTdHJpbmcgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50U3RyaW5nKFN0cmluZyByZXBsYWNlbWVudFN0cmluZykgewotICAgICAgICBmUmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2IxMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uUHJvcG9zYWwgd2l0aCBhIHJlbGV2YW5jZSB2YWx1ZS4gVGhlIHJlbGV2YW5jZSB2YWx1ZSBpcyB1c2VkIHRvCi0gKiBzb3J0IHRoZSBjb21wbGV0aW9uIHByb3Bvc2Fscy4gUHJvcG9zYWxzIHdpdGggaGlnaGVyIHJlbGV2YW5jZSBzaG91bGQgYmUKLSAqIGxpc3RlZCBiZWZvcmUgcHJvcG9zYWxzIHdpdGggbG93ZXIgcmVsZXZhbmNlLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGV2YW5jZSBvZiB0aGUgcHJvcG9zYWwuCi0JICovCi0JaW50IGdldFJlbGV2YW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTVhMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lSZWxldmFuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZWxldmFuY2VDb25zdGFudHMgewotCWludCBSX05PTkUgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1N0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZWU2YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQgZXh0ZW5kcyBDb250ZW50QXNzaXN0YW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfUFJPQ0VTU09SX0VYVEVOREVEX0lEID0gImNvbnRlbnRhc3Npc3Rwcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBwZXJzb25hbCBsaXN0IG9mIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMKLQkgKi8KLQlwcml2YXRlIE1hcCBmUHJvY2Vzc29yczsKLQkvKioKLQkgKiBsaXN0IG9mIHBhcnRpdGlvbiB0eXBlcyB3aGVyZSBleHRlbmRlZCBwcm9jZXNzb3JzIGhhdmUgYmVlbiBpbnN0YWxsZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzOwotCi0JLyoqCi0JICogRWFjaCBzZXQgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGlzIHBsYWNlZCBpbnNpZGUgYQotCSAqIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciB3aGljaCBhbGxvd3MgbXVsdGlwbGUgcHJvY2Vzc29ycyBwZXIKLQkgKiBwYXJ0aXRpb24gdHlwZQotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgdG8gcmVnaXN0ZXIsIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgYW4gZXhpc3Rpbmcgb25lCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0eXBlIHVuZGVyIHdoaWNoIHRvIHJlZ2lzdGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJZlByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCUNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciBjb21wb3VuZFByb2Nlc3NvciA9IGdldEV4aXN0aW5nQ29udGVudEFzc2lzdFByb2Nlc3NvcihwYXJ0aXRpb25UeXBlKTsKLQotCQkvLyBpZiBwcm9jZXNzb3IgaXMgbnVsbCwgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBwcm9jZXNzb3JzIG9mCi0JCS8vIGNvbnRlbnRUeXBlCi0JCWlmIChwcm9jZXNzb3IgPT0gbnVsbCAmJiBjb21wb3VuZFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQljb21wb3VuZFByb2Nlc3Nvci5kaXNwb3NlKCk7Ci0JCQlmUHJvY2Vzc29ycy5yZW1vdmUocGFydGl0aW9uVHlwZSk7Ci0JCQljb21wb3VuZFByb2Nlc3NvciA9IG51bGw7Ci0JCX0KLQkJaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgY29tcG91bmRwcm9jZXNzIGlmIHRoZXJlIGFscmVhZHkgaXNudCBvbmUKLQkJCWlmIChjb21wb3VuZFByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQkJY29tcG91bmRQcm9jZXNzb3IgPSBuZXcgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQl9Ci0JCQkvLyBhZGQgcHJvY2Vzc29yIHRvIGNvbXBvdW5kIHByb2Nlc3NvcgotCQkJY29tcG91bmRQcm9jZXNzb3IuYWRkKHByb2Nlc3Nvcik7Ci0JCQkvLyBhZGQgY29tcG91bmQgcHJvY2Vzb3IgdG8gcHJvY2Vzc29ycyBsaXN0ICh3aWxsIHJlcGxhY2Ugb2xkIG9uZSwKLQkJCS8vIGV2ZW4gaWYgc2FtZSBpbnN0YW5jZSkKLQkJCWZQcm9jZXNzb3JzLnB1dChwYXJ0aXRpb25UeXBlLCBjb21wb3VuZFByb2Nlc3Nvcik7Ci0JCX0KLQkJc3VwZXIuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb21wb3VuZFByb2Nlc3NvciwgcGFydGl0aW9uVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0RXhpc3RpbmdDb250ZW50QXNzaXN0UHJvY2Vzc29yKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciBjb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBudWxsOwotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBzdXBlci5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKHBhcnRpdGlvblR5cGUpOwotCQlpZiAocHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCWlmIChwcm9jZXNzb3IgaW5zdGFuY2VvZiBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIHsKLQkJCQljb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSAoQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBwcm9jZXNzb3I7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudCB1c2UgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBjb250ZW50Ci0JICogdHlwZS4gQWxzbyBpbnN0YWxscyBhbnkgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyB0aGF0IHdlcmUgYWRkZWQgYnkKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGVudCBmb3Igd2hpY2ggdGhpcyBjb250ZW50IGFzc2lzdGFudCBpcwotCSAqICAgICAgICAgICAgdG8gYmUgcmVxdWVzdGVkCi0JICogQHJldHVybiBhbiBpbnN0YW5jZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIG5vbmUgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZQotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgPT0gbnVsbCB8fCAhZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzLmNvbnRhaW5zKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQkvLyBnZXQgZXh0ZW5kZWQgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyB0aGF0IGhhdmUgbm90IGFscmVhZHkKLQkJCS8vIGJlZW4gc2V0Ci0JCQlMaXN0IHByb2Nlc3NvcnMgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoQ09OVEVOVF9BU1NJU1RfUFJPQ0VTU09SX0VYVEVOREVEX0lELCBwYXJ0aXRpb25UeXBlKTsKLQkJCWlmIChwcm9jZXNzb3JzICE9IG51bGwgJiYgIXByb2Nlc3NvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IHByb2Nlc3NvcnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdGVyLm5leHQoKTsKLQkJCQkJc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihwcm9jZXNzb3IsIHBhcnRpdGlvblR5cGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGFkZCBwYXJ0aXRpb24gdHlwZSB0byBsaXN0IG9mIGV4dGVuZGVkIHBhcnRpdGlvbiB0eXBlcwotCQkJLy8gaW5zdGFsbGVkIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGFueSBleHRlbmRlZCBjb250ZW50Ci0JCQkvLyBhc3Npc3QgcHJvY2Vzc29ycyB3ZXJlIGluc3RhbGxlZCBiZWNhdXNlIGRvbnQgd2FudCB0byBsb29rIGl0Ci0JCQkvLyB1cCBldmVyeSB0aW1lKQotCQkJaWYgKGZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlcyA9PSBudWxsKQotCQkJCWZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlcy5hZGQocGFydGl0aW9uVHlwZSk7Ci0JCX0KLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBzdXBlci5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKHBhcnRpdGlvblR5cGUpOwotCQlyZXR1cm4gcHJvY2Vzc29yOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJLy8gZGlzcG9zZSBvZiBhbGwgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycwotCQlpZiAoZlByb2Nlc3NvcnMgIT0gbnVsbCAmJiAhZlByb2Nlc3NvcnMuaXNFbXB0eSgpKSB7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBmUHJvY2Vzc29ycy52YWx1ZXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkoKENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXRlci5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZQcm9jZXNzb3JzLmNsZWFyKCk7Ci0JCX0KLQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgaW5zdGFsbGVkIGNvbnRlbnQgdHlwZXMKLQkJaWYgKGZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlcyAhPSBudWxsKSB7Ci0JCQlmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMuY2xlYXIoKTsKLQkJfQotCQlzdXBlci51bmluc3RhbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGI1MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuRGVsZWdhdGluZ0RyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuRGVsZWdhdGluZ0Ryb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCS8qCi0JICogTWVudSBsaXN0ZW5lciB0byBjcmVhdGUgdGhlIGFkZGl0aW9ucyBncm91cCBhbmQgYWRkIGFueSBtZW51IGl0ZW1zCi0JICogY29udHJpYnV0ZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb247IHJlcXVpcmVkIHNpbmNlIHRoZSBjb250ZXh0IG1lbnUgaXMKLQkgKiBjbGVhcmVkIGV2ZXJ5IHRpbWUgaXQgaXMgc2hvd24KLQkgKi8KLQljbGFzcyBBZGRpdGlvbkdyb3VwQWRkZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uZ2V0SWQoKSAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5pbnNlcnRBZnRlcihpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5nZXRJZCgpLCBuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQkJfQotCi0JCQkvLyBhZGQgY29uZmlndXJhdGlvbidzIG1lbnUgaXRlbXMKLQkJCUlNZW51TGlzdGVuZXIgbGlzdGVuZXIgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWVudUxpc3RlbmVyKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWxpc3RlbmVyLm1lbnVBYm91dFRvU2hvdyhtYW5hZ2VyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGRvdWJsZS1jbGljayByZWdpc3RyYXRpb24gc28gaXQgY2FuIGJlIGRvbmUgYmVmb3JlIHRoZSBDb250cm9sCi0JICogaXMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvdWJsZUNsaWNrUHJvdmlkZXIgaW1wbGVtZW50cyBJRG91YmxlQ2xpY2tMaXN0ZW5lciB7Ci0JCXByaXZhdGUgSURvdWJsZUNsaWNrTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBudWxsOwotCi0JCXZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBuZXdMaXN0ZW5lcikgewotCQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJbGlzdGVuZXJzID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyW117bmV3TGlzdGVuZXJ9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSURvdWJsZUNsaWNrTGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXJbbGlzdGVuZXJzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCQkJCW5ld0xpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoXSA9IG5ld0xpc3RlbmVyOwotCQkJCWxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCWZpcmVEb3VibGVDbGlja0V2ZW50KGV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaXJlRG91YmxlQ2xpY2tFdmVudChmaW5hbCBEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQlJRG91YmxlQ2xpY2tMaXN0ZW5lcltdIGZpcmluZ0xpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlyaW5nTGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSURvdWJsZUNsaWNrTGlzdGVuZXIgbCA9IGZpcmluZ0xpc3RlbmVyc1tpXTsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsLmRvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIG9sZExpc3RlbmVyKSB7Ci0JCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAxICYmIGxpc3RlbmVyc1swXS5lcXVhbHMob2xkTGlzdGVuZXIpKSB7Ci0JCQkJCWxpc3RlbmVycyA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMaXN0IG5ld0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChsaXN0ZW5lcnMpKTsKLQkJCQkJbmV3TGlzdGVuZXJzLnJlbW92ZShvbGRMaXN0ZW5lcik7Ci0JCQkJCWxpc3RlbmVycyA9IChJRG91YmxlQ2xpY2tMaXN0ZW5lcltdKSBuZXdMaXN0ZW5lcnMudG9BcnJheShuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXJbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHBvc3Qgc2VsZWN0aW9uIGZyb20gdGhlIHNlbGVjdGlvbiBzZXJ2aWNlLCBhcHBseWluZyBpdCB0bwotCSAqIHRoZSB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3RTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkvLyBmcm9tIHNlbGVjdGlvbiBzZXJ2aWNlCi0JCQlpZiAoX0RFQlVHKSB7Ci0JCQkJX0RFQlVHX1RJTUUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0gLyoKLQkJCQkgKiBCdWcgMTM2MzEwLCB1bmxlc3MgdGhpcyBwYWdlIGlzIHRoYXQgcGFydCdzCi0JCQkJICogSUNvbnRlbnRPdXRsaW5lUGFnZSwgaWdub3JlIHRoZSBzZWxlY3Rpb24gY2hhbmdlCi0JCQkJICovCi0JCQlpZiAocGFydCA9PSBudWxsIHx8IHBhcnQuZ2V0QWRhcHRlcihJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSA9PSBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UudGhpcykgewotCQkJCUlTZWxlY3Rpb24gdmFsaWRDb250ZW50U2VsZWN0aW9uID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFNlbGVjdGlvbihnZXRUcmVlVmlld2VyKCksIHNlbGVjdGlvbik7Ci0KLQkJCQlib29sZWFuIGlzTGlua2VkID0gZ2V0Q29uZmlndXJhdGlvbigpLmlzTGlua2VkV2l0aEVkaXRvcihnZXRUcmVlVmlld2VyKCkpOwotCQkJCWlmIChpc0xpbmtlZCkgewotCQkJCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKHZhbGlkQ29udGVudFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKE86IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkcyBwb3N0LXNlbGVjdGlvbiBmcm9tIHRoZSB0cmVlIHZpZXdlciB0byB0aGUgbGlzdGVuZXJzIHdoaWxlCi0JICogYWN0aW5nIGFzIHRoaXMgcGFnZSdzIHNlbGVjdGlvbiBwcm92aWRlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVBvc3RTZWxlY3Rpb25Qcm92aWRlciB7Ci0JCXByaXZhdGUgY2xhc3MgUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWlzRmlyaW5nU2VsZWN0aW9uKCkpIHsKLQkJCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQsIHBvc3RMaXN0ZW5lcnMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmICghaXNGaXJpbmdTZWxlY3Rpb24oKSkgewotCQkJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCwgbGlzdGVuZXJzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNGaXJpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlwcml2YXRlIExpc3RlbmVyTGlzdCBwb3N0TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgcG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0JCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlwb3N0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQsIExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QpIHsKLQkJCWlzRmlyaW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJaWYgKGdldFRyZWVWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZ2V0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcmV0dXJuIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIGlzRmlyaW5nU2VsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlwb3N0TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmICghaXNGaXJpbmdTZWxlY3Rpb24pIHsKLQkJCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNob3dJblRhcmdldCBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXQgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldCNzaG93KG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3coU2hvd0luQ29udGV4dCBjb250ZXh0KSB7Ci0JCQlzZXRTZWxlY3Rpb24oY29udGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlyZXR1cm4gZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpLmVxdWFscyhjb250ZXh0LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIE5VTExfQ09ORklHVVJBVElPTiA9IG5ldyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQkJcmV0dXJuIG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUTElORV9DT05URVhUX01FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5PdXRsaW5lQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRMSU5FX0NPTlRFWFRfTUVOVV9TVUZGSVggPSAiLnNvdXJjZS5PdXRsaW5lQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVRyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2NvbnRlbnRPdXRsaW5lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCi0JcHJpdmF0ZSBsb25nIF9ERUJVR19USU1FID0gMDsKLQotCXByaXZhdGUgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBmQWN0aXZlRHJhZ0xpc3RlbmVyczsKLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZkFjdGl2ZURyb3BMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIE1lbnUgZkNvbnRleHRNZW51OwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0TWVudUlkOwotCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBmQ29udGV4dE1lbnVNYW5hZ2VyOwotCXByaXZhdGUgRG91YmxlQ2xpY2tQcm92aWRlciBmRG91YmxlQ2xpY2tQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIERlbGVnYXRpbmdEcmFnQWRhcHRlciBmRHJhZ0FkYXB0ZXI7Ci0JcHJpdmF0ZSBEcmFnU291cmNlIGZEcmFnU291cmNlOwotCXByaXZhdGUgRGVsZWdhdGluZ0Ryb3BBZGFwdGVyIGZEcm9wQWRhcHRlcjsKLQlwcml2YXRlIERyb3BUYXJnZXQgZkRyb3BUYXJnZXQ7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBmR3JvdXBBZGRlciA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgZklucHV0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGZJbnB1dENvbnRlbnRUeXBlSWRlbnRpZmllciA9IG51bGw7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uTGlzdGVuZXIgZlNlbGVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQotCVNlbGVjdGlvblByb3ZpZGVyIGZTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBBIENvbnRlbnRPdXRsaW5lUGFnZSB0aGF0IGFic3RyYWN0IGFzIG11Y2ggYmVoYXZpb3IgYXMgcG9zc2libGUgYXdheQotCSAqIGZyb20gdGhlIENvbnRyb2xzIGFuZCB2YXJpZXMgaXQgYnkgY29udGVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZHcm91cEFkZGVyID0gbmV3IEFkZGl0aW9uR3JvdXBBZGRlcigpOwotCQlmU2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgU2VsZWN0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYSBsaXN0IG9mIHRob3NlIG5vdGlmaWVkIHdoZW4gc29tZW9uZSBkb3VibGUtY2xpY2tzCi0JICogaW4gdGhlIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIG5ld0xpc3RlbmVyIC0KLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIG5ld0xpc3RlbmVyKSB7Ci0JCWlmIChmRG91YmxlQ2xpY2tQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmRG91YmxlQ2xpY2tQcm92aWRlciA9IG5ldyBEb3VibGVDbGlja1Byb3ZpZGVyKCk7Ci0JCX0KLQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXdMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUNvbnRleHRNZW51SUQoKSB7Ci0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCWlmIChmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCkgewotCQkJaWQgPSBmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgKyBPVVRMSU5FX0NPTlRFWFRfTUVOVV9TVUZGSVg7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29udGVudE91dGxpbmVQYWdlI2NyZWF0ZUNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCi0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlmRWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJfQotCi0JCWZEcmFnQWRhcHRlciA9IG5ldyBEZWxlZ2F0aW5nRHJhZ0FkYXB0ZXIoKTsKLQkJZkRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShnZXRDb250cm9sKCksIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSyk7Ci0JCWZEcm9wQWRhcHRlciA9IG5ldyBEZWxlZ2F0aW5nRHJvcEFkYXB0ZXIoKTsKLQkJZkRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldChnZXRDb250cm9sKCksIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSyk7Ci0KLQkJc2V0Q29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCi0JCS8qCi0JCSAqIENvbnRlbnRPdXRsaW5lUGFnZSBvbmx5IGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyIHdoaWxlIHRoZQotCQkgKiB0cmVlIHZpZXdlciBpbXBsZW1lbnRzIGJvdGggSVNlbGVjdGlvblByb3ZpZGVyIGFuZAotCQkgKiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyLiBVc2UgYW4gSVNlbGVjdGlvblByb3ZpZGVyIHRoYXQgbGlzdGVucyB0bwotCQkgKiBwb3N0IHNlbGVjdGlvbiBmcm9tIHRoZSB0cmVlIHZpZXdlciBhbmQgZm9yd2FyZCBvbmx5IHBvc3Qgc2VsZWN0aW9uCi0JCSAqIHRvIHRoZSBzZWxlY3Rpb24gc2VydmljZS4KLQkJICovCi0JCWdldFRyZWVWaWV3ZXIoKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTZWxlY3Rpb25Qcm92aWRlci5nZXRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQlnZXRUcmVlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCWlmIChmRG91YmxlQ2xpY2tQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmRG91YmxlQ2xpY2tQcm92aWRlciA9IG5ldyBEb3VibGVDbGlja1Byb3ZpZGVyKCk7Ci0JCX0KLQkJZ2V0VHJlZVZpZXdlcigpLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZkRvdWJsZUNsaWNrUHJvdmlkZXIpOwotCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoZlNlbGVjdGlvblByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihnZXRTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIoKSk7Ci0JCWlmIChmRG91YmxlQ2xpY2tQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlnZXRUcmVlVmlld2VyKCkucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihmRG91YmxlQ2xpY2tQcm92aWRlcik7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG1lbnUgY29udHJvbHMKLQkJaWYgKGZDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmQ29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlTWVudUxpc3RlbmVyKGZHcm91cEFkZGVyKTsKLQkJCWZDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQlmQ29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCQlzZXRDb25maWd1cmF0aW9uKE5VTExfQ09ORklHVVJBVElPTik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBudWxsOwotCQlpZiAoa2V5LmVxdWFscyhJU2hvd0luVGFyZ2V0LmNsYXNzKSkgewotCQkJYWRhcHRlciA9IG5ldyBTaG93SW5UYXJnZXQoKTsKLQkJfQotCQlmaW5hbCBJRWRpdG9yUGFydCBlZGl0b3IgPSBmRWRpdG9yOwotCi0JCWlmIChrZXkuZXF1YWxzKElTaG93SW5Tb3VyY2UuY2xhc3MpICYmIGVkaXRvciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gbmV3IElTaG93SW5Tb3VyY2UoKSB7Ci0JCQkJcHVibGljIFNob3dJbkNvbnRleHQgZ2V0U2hvd0luQ29udGV4dCgpIHsKLQkJCQkJcmV0dXJuIG5ldyBTaG93SW5Db250ZXh0KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpLCBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcykgJiYgZWRpdG9yICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihrZXkpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSB1c2VkIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWZDb25maWd1cmF0aW9uID0gTlVMTF9DT05GSUdVUkFUSU9OOwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXByaXZhdGUgSVNlbGVjdGlvbkxpc3RlbmVyIGdldFNlbGVjdGlvblNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJaWYgKGZTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgUG9zdFNlbGVjdGlvblNlcnZpY2VMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VCb29rVmlld1BhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElQYWdlU2l0ZSBwYWdlU2l0ZSkgewotCQlzdXBlci5pbml0KHBhZ2VTaXRlKTsKLQkJcGFnZVNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihnZXRTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIGEgbGlzdCBvZiB0aG9zZSBub3RpZmllZCB3aGVuIHNvbWVvbmUKLQkgKiBkb3VibGUtY2xpY2tzIGluIHRoZSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaXN0ZW5lciAtCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBvbGRMaXN0ZW5lcikgewotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihvbGRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIChvciByZWNvbmZpZ3VyZXMpIHRoZSBwYWdlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkvLyBpbnRlbnRpb25hbGx5IGRvIG5vdCBjaGVjayB0byBzZWUgaWYgdGhlIG5ldyBjb25maWd1cmF0aW9uICE9IG9sZAotCQkvLyBjb25maWd1cmF0aW9uCi0JCWlmIChnZXRUcmVlVmlld2VyKCkgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIHRoZSBrZXkgbGlzdGVuZXJzCi0JCQlpZiAoZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlLZXlMaXN0ZW5lcltdIGxpc3RlbmVycyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRLZXlMaXN0ZW5lcnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWdldENvbnRyb2woKS5yZW1vdmVLZXlMaXN0ZW5lcihsaXN0ZW5lcnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlJQ29udHJpYnV0aW9uTWFuYWdlciB0b29sYmFyID0gZ2V0U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJaWYgKHRvb2xiYXIgIT0gbnVsbCkgewotCQkJCUlDb250cmlidXRpb25JdGVtW10gdG9vbGJhckl0ZW1zID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFRvb2xiYXJDb250cmlidXRpb25zKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKHRvb2xiYXJJdGVtcyAhPSBudWxsICYmIHRvb2xiYXJJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbGJhckl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0b29sYmFyLnJlbW92ZSh0b29sYmFySXRlbXNbaV0pOwotCQkJCQl9Ci0JCQkJCXRvb2xiYXIudXBkYXRlKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlDb250cmlidXRpb25NYW5hZ2VyIG1lbnViYXIgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCQlpZiAobWVudWJhciAhPSBudWxsKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBtZW51SXRlbXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWVudUNvbnRyaWJ1dGlvbnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAobWVudUl0ZW1zICE9IG51bGwgJiYgbWVudUl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCW1lbnViYXIucmVtb3ZlKG1lbnVJdGVtc1tpXSk7Ci0JCQkJCX0KLQkJCQkJbWVudWJhci5yZW1vdmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpOwotCQkJCQltZW51YmFyLnVwZGF0ZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2xlYXIgdGhlIERuRCBsaXN0ZW5lcnMgYW5kIHRyYW5zZmVyIHR5cGVzCi0JCQlpZiAoZkRyYWdBZGFwdGVyICE9IG51bGwgJiYgIWZEcmFnQWRhcHRlci5pc0VtcHR5KCkgJiYgZkRyYWdTb3VyY2UgIT0gbnVsbCAmJiAhZkRyYWdTb3VyY2UuaXNEaXNwb3NlZCgpICYmIGZEcmFnU291cmNlLmdldFRyYW5zZmVyKCkubGVuZ3RoID4gMCkgewotCQkJCWlmIChmQWN0aXZlRHJhZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkFjdGl2ZURyYWdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWZEcmFnQWRhcHRlci5yZW1vdmVEcmFnU291cmNlTGlzdGVuZXIoZkFjdGl2ZURyYWdMaXN0ZW5lcnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZBY3RpdmVEcmFnTGlzdGVuZXJzID0gbnVsbDsKLQkJCQlmRHJhZ1NvdXJjZS5yZW1vdmVEcmFnTGlzdGVuZXIoZkRyYWdBZGFwdGVyKTsKLQkJCQlmRHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbMF0pOwotCQkJfQotCQkJaWYgKGZEcm9wQWRhcHRlciAhPSBudWxsICYmICFmRHJvcEFkYXB0ZXIuaXNFbXB0eSgpICYmIGZEcm9wVGFyZ2V0ICE9IG51bGwgJiYgIWZEcm9wVGFyZ2V0LmlzRGlzcG9zZWQoKSAmJiBmRHJvcFRhcmdldC5nZXRUcmFuc2ZlcigpLmxlbmd0aCA+IDApIHsKLQkJCQlpZiAoZkFjdGl2ZURyb3BMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY3RpdmVEcm9wTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlmRHJvcEFkYXB0ZXIucmVtb3ZlRHJvcFRhcmdldExpc3RlbmVyKGZBY3RpdmVEcm9wTGlzdGVuZXJzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmQWN0aXZlRHJvcExpc3RlbmVycyA9IG51bGw7Ci0JCQkJZkRyb3BUYXJnZXQucmVtb3ZlRHJvcExpc3RlbmVyKGZEcm9wQWRhcHRlcik7Ci0JCQkJZkRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyWzBdKTsKLQkJCX0KLQkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRDb250ZW50UHJvdmlkZXIoZ2V0VHJlZVZpZXdlcigpKS5pbnB1dENoYW5nZWQoZ2V0VHJlZVZpZXdlcigpLCBmSW5wdXQsIG51bGwpOwotCQkJLy8gcmVsZWFzZSBhbnkgdGllcyB0byB0aGlzIHRyZWUgdmlld2VyCi0JCQlnZXRDb25maWd1cmF0aW9uKCkudW5jb25maWd1cmUoZ2V0VHJlZVZpZXdlcigpKTsKLQkJfQotCi0JCWZDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQotCQlpZiAoZ2V0VHJlZVZpZXdlcigpICE9IG51bGwgJiYgZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCS8vIChyZSlzZXQgdGhlIHByb3ZpZGVycwotCQkJZ2V0VHJlZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIoZ2V0Q29uZmlndXJhdGlvbigpLmdldExhYmVsUHJvdmlkZXIoZ2V0VHJlZVZpZXdlcigpKSk7Ci0JCQlnZXRUcmVlVmlld2VyKCkuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb250ZW50UHJvdmlkZXIoZ2V0VHJlZVZpZXdlcigpKSk7Ci0KLQkJCS8vIHZpZXcgdG9vbGJhcgotCQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgdG9vbGJhciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIHRvb2xiYXJJdGVtcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRUb29sYmFyQ29udHJpYnV0aW9ucyhnZXRUcmVlVmlld2VyKCkpOwotCQkJCWlmICh0b29sYmFySXRlbXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xiYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJdG9vbGJhci5hZGQodG9vbGJhckl0ZW1zW2ldKTsKLQkJCQkJfQotCQkJCQl0b29sYmFyLnVwZGF0ZSh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB2aWV3IG1lbnUKLQkJCUlDb250cmlidXRpb25NYW5hZ2VyIG1lbnUgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBtZW51SXRlbXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWVudUNvbnRyaWJ1dGlvbnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAobWVudUl0ZW1zICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCW1lbnVJdGVtc1tpXS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJbWVudS5hZGQobWVudUl0ZW1zW2ldKTsKLQkJCQkJCW1lbnVJdGVtc1tpXS51cGRhdGUoKTsKLQkJCQkJfQotCQkJCQltZW51LnVwZGF0ZSh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgdGhlIGFsbG93ZWQgRG5EIGxpc3RlbmVycyBhbmQgdHlwZXMKLQkJCVRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZHJhZ0xpc3RlbmVycyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCWlmIChmRHJhZ0FkYXB0ZXIgIT0gbnVsbCAmJiBkcmFnTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRyYWdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZkRyYWdBZGFwdGVyLmFkZERyYWdTb3VyY2VMaXN0ZW5lcihkcmFnTGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQkJZkFjdGl2ZURyYWdMaXN0ZW5lcnMgPSBkcmFnTGlzdGVuZXJzOwotCQkJCWZEcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihmRHJhZ0FkYXB0ZXIpOwotCQkJCWZEcmFnU291cmNlLnNldFRyYW5zZmVyKGZEcmFnQWRhcHRlci5nZXRUcmFuc2ZlcnMoKSk7Ci0JCQl9Ci0JCQlUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGRyb3BMaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAoZkRyb3BBZGFwdGVyICE9IG51bGwgJiYgZHJvcExpc3RlbmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZEcm9wQWRhcHRlci5hZGREcm9wVGFyZ2V0TGlzdGVuZXIoZHJvcExpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJCWZBY3RpdmVEcm9wTGlzdGVuZXJzID0gZHJvcExpc3RlbmVyczsKLQkJCQlmRHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIoZkRyb3BBZGFwdGVyKTsKLQkJCQlmRHJvcFRhcmdldC5zZXRUcmFuc2ZlcihmRHJvcEFkYXB0ZXIuZ2V0VHJhbnNmZXJzKCkpOwotCQkJfQotCQkJLy8gYWRkIHRoZSBrZXkgbGlzdGVuZXJzCi0JCQlLZXlMaXN0ZW5lcltdIGxpc3RlbmVycyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRLZXlMaXN0ZW5lcnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmSW5wdXQgIT0gbnVsbCkgewotCQkJc2V0SW5wdXQoZklucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBJRWRpdG9yUGFydCB0aGF0ICJvd25zIiB0aGlzIHBhZ2UuIFVzZWQgdG8gc3VwcG9ydCB0aGUKLQkgKiAgICAgICAgICAgICJTaG93IEluLi4uIiBtZW51LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0lucHV0Ci0JICogICAgICAgICAgICBUaGUgaW5wdXQgZm9yIHRoZSBwYWdlJ3Mgdmlld2VyLiBTaG91bGQgb25seSBiZSBzZXQgYWZ0ZXIgYQotCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBuZXdJbnB1dCkgewotCQlmSW5wdXQgPSBuZXdJbnB1dDsKLQkJLyoKLQkJICogSW50ZW50aW9uYWxseSBub3Qgb3B0aW1pemVkIGZvciBjaGVja2luZyBuZXcgaW5wdXQgdnMuIG9sZCBpbnB1dCBzbwotCQkgKiB0aGF0IGFueSBleGlzdGluZyBjb250ZW50IHByb3ZpZGVycyBjYW4gYmUgdXBkYXRlZAotCQkgKi8KLQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQoZklucHV0KTsKLQkJCXVwZGF0ZUNvbnRleHRNZW51SWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZCAtCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0eXBlIGlkZW50aWZpZXIgdG8gdXNlIGZvciBmdXJ0aGVyIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0Q29udGVudFR5cGVJZGVudGlmaWVyKFN0cmluZyBpZCkgewotCQlmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBvdXRsaW5lIHBhZ2UncyBjb250ZXh0IG1lbnUgZm9yIHRoZSBjdXJyZW50IGlucHV0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRleHRNZW51SWQoKSB7Ci0JCVN0cmluZyBjb21wdXRlZENvbnRleHRNZW51SWQgPSBudWxsOwotCQkvLyB1cGRhdGUgb3V0bGluZSB2aWV3J3MgY29udGV4dCBtZW51IGNvbnRyb2wgYW5kIElECi0KLQkJaWYgKGZFZGl0b3IgPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJZkVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0JCX0KLQotCQljb21wdXRlZENvbnRleHRNZW51SWQgPSBjb21wdXRlQ29udGV4dE1lbnVJRCgpOwotCi0JCWlmIChjb21wdXRlZENvbnRleHRNZW51SWQgPT0gbnVsbCkgewotCQkJY29tcHV0ZWRDb250ZXh0TWVudUlkID0gT1VUTElORV9DT05URVhUX01FTlVfSUQ7Ci0JCX0KLQotCQkvKgotCQkgKiBVcGRhdGUgb3V0bGluZSBjb250ZXh0IG1lbnUgaWQgaWYgdXBkYXRpbmcgdG8gYSBuZXcgaWQgb3IgaWYKLQkJICogY29udGV4dCBtZW51IGlzIG5vdCBhbHJlYWR5IHNldCB1cAotCQkgKi8KLQkJaWYgKCFjb21wdXRlZENvbnRleHRNZW51SWQuZXF1YWxzKGZDb250ZXh0TWVudUlkKSB8fCAoZkNvbnRleHRNZW51ID09IG51bGwpKSB7Ci0JCQlmQ29udGV4dE1lbnVJZCA9IGNvbXB1dGVkQ29udGV4dE1lbnVJZDsKLQotCQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJLy8gZGlzcG9zZSBvZiBwcmV2aW91cyBjb250ZXh0IG1lbnUKLQkJCQlpZiAoZkNvbnRleHRNZW51ICE9IG51bGwpIHsKLQkJCQkJZkNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGZDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihmR3JvdXBBZGRlcik7Ci0JCQkJCWZDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCWZDb250ZXh0TWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCWZDb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoZkNvbnRleHRNZW51SWQsIGZDb250ZXh0TWVudUlkKTsKLQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQotCQkJCWZDb250ZXh0TWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGZHcm91cEFkZGVyKTsKLQotCQkJCWZDb250ZXh0TWVudSA9IGZDb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZ2V0Q29udHJvbCgpKTsKLQkJCQlnZXRDb250cm9sKCkuc2V0TWVudShmQ29udGV4dE1lbnUpOwotCi0JCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoZkNvbnRleHRNZW51SWQsIGZDb250ZXh0TWVudU1hbmFnZXIsIHRoaXMpOwotCi0JCQkJLyoKLQkJCQkgKiBhbHNvIHJlZ2lzdGVyIHRoaXMgbWVudSBmb3Igc291cmNlIHBhZ2UgcGFydCBhbmQgc3RydWN0dXJlZAotCQkJCSAqIHRleHQgb3V0bGluZSB2aWV3IGlkcwotCQkJCSAqLwotCQkJCWlmIChmRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhcnRJZCA9IGZFZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCQkJCWlmIChwYXJ0SWQgIT0gbnVsbCkgewotCQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUocGFydElkICsgT1VUTElORV9DT05URVhUX01FTlVfU1VGRklYLCBmQ29udGV4dE1lbnVNYW5hZ2VyLCB0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShPVVRMSU5FX0NPTlRFWFRfTUVOVV9JRCwgZkNvbnRleHRNZW51TWFuYWdlciwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9JSkZhY2VOb2RlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTZkNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBJSkZhY2VOb2RlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG5vZGUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIFRoZXNlIGFyZSB0aGUgdG9wIGxldmVsIGl0ZW1zIGluIGEgbGlzdCwgdHJlZSwgdGFibGUsIGV0Yy4uLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgbm9kZSk7Ci0KLQkvKioKLQkgKiBGZXRjaGVzIHRoZSBsYWJlbCBpbWFnZSBzcGVjaWZpYyB0byB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0TGFiZWxJbWFnZShPYmplY3Qgbm9kZSk7Ci0KLQkvKioKLQkgKiBGZXRjaGVzIHRoZSBsYWJlbCB0ZXh0IHNwZWNpZmljIHRvIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KE9iamVjdCBub2RlKTsKLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBub2RlKTsKLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9JSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9JSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0N2ZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiByZXR1cm5zICJjb3B5IiBzbyBubyBvbmUgY2FuIG1vZGlmeSBvdXIgbGlzdC4gSXRzIGlzIGEgc2hhbGxvdyBjb3B5LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExpc3RlbmVycygpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTM4YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci0KLS8qKgotICogQW4gSUFjdGlvbi5BU19DSEVDS19CT1ggYWN0aW9uIHRoYXQgc2V0cyBhbmQgZ2V0cyBpdHMgY2hlY2tlZCBzdGF0ZSBhbG9uZwotICogd2l0aCBhIHZhbHVlIGZyb20gYSBwcmVmZXJlbmNlIHN0b3JlLiBTaG91bGQgYmUgdXNlZCB3aXRoCi0gKiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gdG8gbGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlCi0gKiBzdG9yZSBhbmQgdXBkYXRlIHRoZSBjaGVja2VkIHN0YXRlIGZyb20gUHJvcGVydHlDaGFuZ2VFdmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCXByaXZhdGUgU3RyaW5nIGZQcmVmZXJlbmNlS2V5OwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0JcHJpdmF0ZSBib29sZWFuIGZVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UgPSB0cnVlOwotCi0JcHVibGljIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uKFN0cmluZyB0ZXh0LCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlmUHJlZmVyZW5jZUtleSA9IHByZWZlcmVuY2VLZXk7Ci0JCWZTdG9yZSA9IHN0b3JlOwotCQlmU3RvcmUuc2V0RGVmYXVsdChnZXRQcmVmZXJlbmNlS2V5KCksIGRlZmF1bHRWYWx1ZSk7Ci0JCXNldElkKGdldFByZWZlcmVuY2VLZXkoKSk7Ci0JCXNldENoZWNrZWQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihnZXRQcmVmZXJlbmNlS2V5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yZGVyUHJlZmVyZW5jZUtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcmVuY2VLZXkoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZUtleTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0b3JlLgotCSAqLwotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIGZTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSgpIHsKLQkJcmV0dXJuIGZVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2U7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQkJZlN0b3JlLnNldFZhbHVlKGdldFByZWZlcmVuY2VLZXkoKSwgaXNDaGVja2VkKCkpOwotCQlpZiAoIWlzVXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlKCkpCi0JCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlCi0JICogICAgICAgICAgICBUaGUgdXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UoYm9vbGVhbiB1cGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UpIHsKLQkJZlVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSA9IHVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXNldENoZWNrZWQoZlN0b3JlLmdldEJvb2xlYW4oZ2V0UHJlZmVyZW5jZUtleSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjQyZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci0KLS8qKgotICogQSBsaXN0ZW5lciBvbiB0aGUgZ2l2ZW4gYWN0aW9uJ3MgUHJlZmVyZW5jZVN0b3JlLiBJdCBjYWxscyAudXBkYXRlKCkgb24gdGhlCi0gKiBhY3Rpb24gd2hlbiB0aGUgZ2l2ZW4ga2V5IGNoYW5nZXMgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZXh0ZW5kcyBBY3Rpb25Db250cmlidXRpb25JdGVtIHsKLQotCXByaXZhdGUgY2xhc3MgUHJlZmVyZW5jZVVwZGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoZlByb3BlcnR5KSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZlByb3BlcnR5ICsgIiBwcmVmZXJlbmNlIGNoYW5nZWQsIHVwZGF0aW5nICIgKyBnZXRBY3Rpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJKChJVXBkYXRlKSBnZXRBY3Rpb24oKSkudXBkYXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJDsKLQotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZkxpc3RlbmVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZlByb3BlcnR5ID0gbnVsbDsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOwotCi0JcHVibGljIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiBhY3Rpb24pIHsKLQkJc3VwZXIoYWN0aW9uKTsKLQkJZlByb3BlcnR5ID0gYWN0aW9uLmdldFByZWZlcmVuY2VLZXkoKTsKLQkJZlN0b3JlID0gYWN0aW9uLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlmTGlzdGVuZXIgPSBuZXcgUHJlZmVyZW5jZVVwZGF0ZUxpc3RlbmVyKCk7Ci0JCWNvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIHN0YXJ0ZWQgbGlzdGVuaW5nIGZvciAiICsgZlByb3BlcnR5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmU3RvcmUgIT0gbnVsbCkgewotCQkJZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gc3RvcHBlZCBsaXN0ZW5pbmcgZm9yICIgKyBmUHJvcGVydHkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZTdG9yZSAhPSBudWxsKSB7Ci0JCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlkaXNjb25uZWN0KCk7Ci0JCWZQcm9wZXJ0eSA9IG51bGw7Ci0JCWZTdG9yZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGdldEFjdGlvbigpLmdldElkKCkgIT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKHRleHQ9IiArIGdldEFjdGlvbigpLmdldFRleHQoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbWJvTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbWJvTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhlYjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBlb3BsZSBzaG91bGQgbWFuYWdlIHRoZWlyIG93biBjb21iby9saXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0xpc3QgewotCXByaXZhdGUgQ29tYm8gY29tYm87Ci0KLQotCXByaXZhdGUgTGlzdCBsaXN0OwotCi0JcHVibGljIENvbWJvTGlzdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0JCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0KLQkvKgotCSAqIGZvbGxvd2luZyBtZXRob2RzIGlzIG9yaWdpbmFsIG1ldGhvZCBvZiBDb21ibyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLmFkZChrZXkpOwotCQlsaXN0LmFkZChrZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcga2V5LCBpbnQgaW5kZXgpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5hZGQoa2V5LCBpbmRleCk7Ci0JCWxpc3QuYWRkKGluZGV4LCBrZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5hZGQoa2V5KTsKLQkJbGlzdC5hZGQodmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIGludCBpbmRleCkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLmFkZChrZXksIGluZGV4KTsKLQkJbGlzdC5hZGQoaW5kZXgsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY29tYm8uYWRkRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFcnJvcigpIHsKLQkJaWYgKCFpc0NvbnNpc3RlbmN5KCkpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJEaWZmZXJlbmNlIGJldHdlZW4gdGhlIG51bWJlciBvZiBrZXlzWyIgKyBjb21iby5nZXRJdGVtQ291bnQoKSArICJdIGFuZCB0aGUgbnVtYmVyIG9mIHZhbHVlc1siICsgbGlzdC5zaXplKCkgKyAiXSBpbiBDb21ib0xpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsKLQkJcmV0dXJuIGNvbWJvLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCk7Ci0JfQotCi0JcHVibGljIE1hcCBjcmVhdGVIYXNodGFibGUoKSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJTWFwIG0gPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKLQkJCW0ucHV0KGNvbWJvLmdldEl0ZW0oaSksIGxpc3QuZ2V0KGkpKTsKLQkJcmV0dXJuIG07Ci0JfQotCi0JcHVibGljIHZvaWQgZGVzZWxlY3QoaW50IGkpIHsKLQkJY29tYm8uZGVzZWxlY3QoaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVzZWxlY3RBbGwoKSB7Ci0JCWNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGNvbWJvLmVxdWFscyhvYmopOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGNoYW5nZVBvc2l0aW9uKGludCBpLCBpbnQgaikgewotCQlTdHJpbmcgdG1wS2V5ID0gZ2V0SXRlbShpKTsKLQkJT2JqZWN0IHRtcFZhbHVlID0gbGlzdC5yZW1vdmUoaSk7Ci0KLQkJY29tYm8uc2V0SXRlbShpLCBnZXRJdGVtKGopKTsKLQkJbGlzdC5hZGQoaSwgbGlzdC5yZW1vdmUoaiAtIDEpKTsKLQotCQljb21iby5zZXRJdGVtKGosIHRtcEtleSk7Ci0JCWxpc3QuYWRkKGosIHRtcFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNBc0tleShTdHJpbmcgc3RyKSB7Ci0JCWlmIChjb21iby5pbmRleE9mKHN0cikgPj0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzQXNWYWx1ZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChsaXN0LmluZGV4T2Yoc3RyKSA+PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0RW5hYmxlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotCQlyZXR1cm4gY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IC0xOwotCQljaGVja0Vycm9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJaWYgKCFsaXN0LmdldChpKS5lcXVhbHModmFsdWUpKQotCQkJCWNvbnRpbnVlOwotCQkJaW5kZXggPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJcmV0dXJuIGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldExheW91dERhdGEoKSB7Ci0JCXJldHVybiBjb21iby5nZXRMYXlvdXREYXRhKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFZhbHVlKCkgewotCQljaGVja0Vycm9yKCk7Ci0JCWludCBpbmRleCA9IGdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldFZhbHVlKGdldEl0ZW0oaW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4KCkgewotCQlyZXR1cm4gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBjb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJY2hlY2tFcnJvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbWJvLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLQkJCWlmICghY29tYm8uZ2V0SXRlbShpKS5lcXVhbHMoa2V5KSkKLQkJCQljb250aW51ZTsKLQkJCWluZGV4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCXJldHVybiAoU3RyaW5nKSBsaXN0LmdldChpbmRleCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBjb21iby5pbmRleE9mKHN0cik7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnNpc3RlbmN5KCkgewotCi0JCWlmIChsaXN0LnNpemUoKSA9PSBjb21iby5nZXRJdGVtQ291bnQoKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8ucmVtb3ZlKGluZGV4KTsKLQkJbGlzdC5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgc3RyKSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8ucmVtb3ZlKHN0cik7Ci0JCWxpc3QucmVtb3ZlKHN0cik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0KGludCBpbmRleCkgewotCQljb21iby5zZWxlY3QoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWNvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7Ci0JCXJldHVybiBjb21iby5zZXRGb2N1cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgc3RyKSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uc2V0SXRlbShpbmRleCwgc3RyKTsKLQkJbGlzdC5yZW1vdmUoaW5kZXgpOwotCQlsaXN0LmFkZChpbmRleCwgc3RyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtKFN0cmluZ1tdIHN0ckFycmF5KSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uc2V0SXRlbXMoc3RyQXJyYXkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0ckFycmF5Lmxlbmd0aDsgaSsrKQotCQkJbGlzdC5hZGQoc3RyQXJyYXlbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExheW91dChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQgbG8pIHsKLQkJY29tYm8uc2V0TGF5b3V0KGxvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWNvbWJvLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFBvaW50IHBvaW50KSB7Ci0JCWNvbWJvLnNldFNlbGVjdGlvbihwb2ludCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgc3RyKSB7Ci0JCWNvbWJvLnNldFRleHQoc3RyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzb3J0QnlLZXkoaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSkKLQkJCXJldHVybjsKLQkJY2hlY2tFcnJvcigpOwotCQkvLwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgY29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IGNvbWJvLmdldEl0ZW1Db3VudCgpOyBqKyspIHsKLQkJCQlpZiAoZ2V0SXRlbShpKS5jb21wYXJlVG8oZ2V0SXRlbShqKSkgPiAwKSB7Ci0JCQkJCWV4Y2hhbmdlUG9zaXRpb24oaSwgaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3RPblByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDZjNTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3RPblByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQZW9wbGUgc2hvdWxkIG1hbmFnZSB0aGVpciBvd24gY29tYm8vbGlzdAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBDb21ib0xpc3QgewotCi0KLQlwcml2YXRlIFN0cmluZyBjdXJyZW50QXBwbHlWYWx1ZTsKLQotCXB1YmxpYyBDb21ib0xpc3RPblByb3BlcnR5UGFnZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRBcHBseVZhbHVlKCkgewotCQlyZXR1cm4gY3VycmVudEFwcGx5VmFsdWU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0QXBwbHlWYWx1ZShTdHJpbmcgY3VycmVudEFwcGx5VmFsdWUpIHsKLQkJdGhpcy5jdXJyZW50QXBwbHlWYWx1ZSA9IGN1cnJlbnRBcHBseVZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjE1MDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5Db250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5Db250ZW50U2V0dGluZ3NDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSUNvbnRlbnRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UKLSAqICAgICAgICAgICAgIG9yCi0gKiAgICAgICAgICAgICBlY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlCi0gKiAgICAgICAgICAgICBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgU1RBVFVTX0VSUk9SID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5JTkZPLCAiRVJST1IiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZm9yIHZhbGlkYXRlRWRpdCgpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBTVEFUVVNfT0sgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCAiT0siLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWV0aG9kIHZhbGlkYXRlRWRpdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcmV0dXJuIElTdGF0dXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJRmlsZSBmaWxlLCBTaGVsbCBjb250ZXh0KSB7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwotCQlpZiAoIShmaWxlLmlzUmVhZE9ubHkoKSkpCi0JCQlyZXR1cm4gU1RBVFVTX09LOwotCi0JCUlQYXRoIGZ1bGxJUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQotCQlmaW5hbCBsb25nIGJlZm9yZU1vZGlmaWVkRnJvbUphdmFJTyA9IGZ1bGxJUGF0aC50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJZmluYWwgbG9uZyBiZWZvcmVNb2RpZmllZEZyb21JRmlsZSA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW117ZmlsZX0sIGNvbnRleHQpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCi0JCWZpbmFsIGxvbmcgYWZ0ZXJNb2RpZmllZEZyb21KYXZhSU8gPSBmdWxsSVBhdGgudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JCWZpbmFsIGxvbmcgYWZ0ZXJNb2RpZmllZEZyb21JRmlsZSA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlpZiAoYmVmb3JlTW9kaWZpZWRGcm9tSmF2YUlPICE9IGFmdGVyTW9kaWZpZWRGcm9tSmF2YUlPKSB7Ci0JCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmICghbW9kZWwuaXNEaXJ0eSgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgoYmVmb3JlTW9kaWZpZWRGcm9tSmF2YUlPICE9IGFmdGVyTW9kaWZpZWRGcm9tSmF2YUlPKSB8fCAoYmVmb3JlTW9kaWZpZWRGcm9tSUZpbGUgIT0gYWZ0ZXJNb2RpZmllZEZyb21JRmlsZSkpIHsKLQkJCS8vIHRoZSBmaWxlIGlzIHJlcGxhY2VkLiBNb2RpZmljYXRpb24gY2Fubm90IGJlCi0JCQkvLyBhcHBsaWVkLgotCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKLQkJfQotCQlyZXR1cm4gU1RBVFVTX09LOwotCX0KLQotCXByb3RlY3RlZCBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtdIGNvbWJvOwotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIElDb250ZW50U2V0dGluZ3MgY29udGVudFNldHRpbmdzOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ1NTX0xBQkVMID0gU1NFVUlNZXNzYWdlcy5VSV9DU1NfcHJvZmlsZV9fXzI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFVklDRV9MQUJFTCA9IFNTRVVJTWVzc2FnZXMuVUlfVGFyZ2V0X0RldmljZV9fXzM7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTEFCRUwgPSBTU0VVSU1lc3NhZ2VzLlVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBpbnQgbnVtYmVyT2ZDb21ibzsKLQlwcm90ZWN0ZWQgaW50IG51bUNvbHMgPSAxOwotCXByb3RlY3RlZCBpbnQgbnVtUm93cyA9IDE7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwcm9wZXJ0eVBhZ2U7Ci0KLQlwdWJsaWMgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhblVwKCkgewotCQkvLyBBcmUgVGhlcmUgYW55IHdheSB0byBndWFyYW50ZWUgdG8gY2FsbCBjbGVhblVwKCkgdG8gcmUtbG9hZAotCQkvLyBkb3dubG9hZGVkIC5jb250ZW50c2V0dGluZ3MgZmlsZQotCQkvLyBhZnRlciBDb250ZW50U2V0dGluZ3MucmVsZWFzZUNhY2hlKCkgaW4gQ29udGVudFNldHRpbmdTZWxmSGFuZGxlcgotCQkvLyBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIGJ5IHJlc291cmNlQ2hhbmdlRXZlbnQKLQl9Ci0KLQotCXByb3RlY3RlZCBDb21ib0xpc3RPblByb3BlcnR5UGFnZSBjcmVhdGVDb21ib0JveE9mKFN0cmluZyB0aXRsZSkgewotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRpdGxlKTsKLQkJaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUuc3RhcnRzV2l0aChTU0VVSU1lc3NhZ2VzLlVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gbmV3IENvbWJvTGlzdE9uUHJvcGVydHlQYWdlKHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCS8vIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucywgaW50IG51bVJvd3MpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCS8vIGRhdGEuaG9yaXpvbnRhbFNwYW49bnVtQ29sdW1uczsKLQkJLy8gZGF0YS52ZXJ0aWNhbFNwYW49bnVtUm93czsKLQotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb250ZW50U2V0dGluZ3MgPSBDb250ZW50U2V0dGluZ3NDcmVhdG9yLmNyZWF0ZSgpOwotCi0JCXByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHMsIG51bVJvd3MpOwotCi0JCWNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpOwotCi0JCXJldHVybiBwcm9wZXJ0eVBhZ2U7Ci0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpOwotCi0JLy8gcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXBwbHlTZWxlY3RlZFByb3BlcnR5VmFsdWUoU3RyaW5nIHN0cixpbnQKLQkvLyBpbmRleCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGVsZXRlTm9uZVByb3BlcnR5KGludCBpbmRleCk7Ci0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbml0VmFsdWVDaGFuZ2VkKFN0cmluZyBiZWZvcmUsIFN0cmluZyBhZnRlcikgewotCQlpZiAoYmVmb3JlID09IG51bGwgJiYgYWZ0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGJlZm9yZSAhPSBudWxsICYmIGJlZm9yZS5lcXVhbHMoYWZ0ZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJLy8gc2VsZWN0ZWQoYXBwbGllZCkgaXRlbSBpcyByZXN0b3JlZC4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkNvbWJvOyBpKyspIHsKLQkJCS8vIFN0cmluZyBhcHBsaWVkVmFsdWUgPSBjb21ib1tpXS5nZXRBcHBseVZhbHVlKCk7Ci0JCQkvLyBzZXRTZWxlY3Rpb25JdGVtKGNvbWJvW2ldLGFwcGxpZWRWYWx1ZSk7Ci0JCQljb21ib1tpXS5zZWxlY3QoMCk7IC8vIHNlbGVjdCBub25lLgotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWlmICh2YWxpZGF0ZVN0YXRlKCkgPT0gZmFsc2UpIHsKLQkJCWNsZWFuVXAoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZDb21ibzsgaSsrKSB7Ci0JCQkvLyBnZXQgc2VsZWN0ZWQgaXRlbSBpbiBDb21ibyBib3guCi0JCQlTdHJpbmcgc3RyID0gY29tYm9baV0uZ2V0U2VsZWN0ZWRWYWx1ZSgpOwotCQkJaWYgKHN0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgbm8gY2hhbmdlLCBza2lwIHNldFByb3BlcnR5Ci0JCQlpZiAoIWlzSW5pdFZhbHVlQ2hhbmdlZChjb21ib1tpXS5nZXRBcHBseVZhbHVlKCksIHN0cikpCi0JCQkJY29udGludWU7Ci0JCQkvLyBpZiBOT05FIGlzIHNlbGVjdGVkLCBkZWxldGUgYXR0ciBpbnN0YW5jZSAoYW5kIHdyaXRlCi0JCQkvLyAuY29udGVudHNldHRpbmdzLikKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCQlkZWxldGVOb25lUHJvcGVydHkoaSk7Ci0JCQllbHNlCi0JCQkJcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8ocHJvcGVydGllcywgc3RyLCBpKTsKLQkJCS8vIGFwcGx5U2VsZWN0ZWRQcm9wZXJ0eVZhbHVlKHN0cixpKTsKLQotCQkJLy8gc2V0IGFwcGx5IHZhbHVlIGluIENvbWJvTGlzdE9uUHJvcGVydHlQYWdlLgotCQkJY29tYm9baV0uc2V0QXBwbHlWYWx1ZShzdHIpOwotCQl9Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJY29udGVudFNldHRpbmdzLnNldFByb3BlcnRpZXMoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBwcm9wZXJ0aWVzKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCXByb3BlcnRpZXMuY2xlYXIoKTsKLQkJcHJvcGVydGllcyA9IG51bGw7Ci0JCWlmICghY29udGVudFNldHRpbmdzLmV4aXN0c1Byb3BlcnRpZXMoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpKSkKLQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVBbGxQcm9wZXJ0aWVzKChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgc3RyLCBpbnQgaSk7Ci0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvbkl0ZW0oQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UgY29tYm8sIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY29tYm8uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJY29tYm8uc2V0QXBwbHlWYWx1ZSh2YWx1ZSk7Ci0JCVN0cmluZyBpdGVtID0gY29tYm8uZ2V0S2V5KHZhbHVlKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCWNvbWJvLnNlbGVjdChjb21iby5pbmRleE9mKGl0ZW0pKTsKLQkJZWxzZQotCQkJY29tYm8uc2VsZWN0KDApOwotCi0JfQotCi0JLyoKLQkgKiBWYWxpZGF0ZSBFZGl0LiBTaW1pbGFyIGZ1bmN0aW9uIHdpbGwgYmUgaW4gSFRNTENvbW1hbmQuamF2YQotCSAqIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIENTU0FjdGlvbk1hbmFnZXIuamF2YQotCSAqIERlc2lnblJlZG9BY3Rpb24uamF2YSBEZXNpZ25VbmRvQWN0aW9uLmphdmEKLQkgKiBIVE1MQ29udmVyc2lvblByb2Nlc3Nvci5qYXZhCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlU3RhdGUoKSB7Ci0KLQkJLy8gZ2V0IElGaWxlIG9mIC5jb250ZW50c2V0dGluZ3MKLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBDb250ZW50U2V0dGluZ3MuZ2V0Q29udGVudFNldHRpbmdzTmFtZSgpOwotCQlmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCk7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUobmFtZSk7Ci0KLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOyAvLyBJcyB0aGlzIHJlYWxseSBPSz8KLQkJLy8gSWYgZmFsc2Ugc2hvdWxkIGJlIHJldHVybmVkLAotCQkvLyBUaGlzIHN0YXRlbWFudCBjYW4gYmUgcmVtb3ZlZCwKLQkJLy8gc2luY2UgTW9kZWxNYW5hZ2VyVXRpbC52YWxpZGF0ZUVkaXQoKQotCQkvLyByZXR1cm5zIGVycm9yIHRvIHRoaXMgY2FzZS4KLQotCQlTaGVsbCBzaGVsbCA9IGdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRWRpdChmaWxlLCBzaGVsbCk7Ci0JCXJldHVybiBzdGF0dXMuaXNPSygpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2ZGYwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIENvbnRyaWJ1dGVkUHJvY2Vzc29yRGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkNvbmZpZ3VyYXRpb25FbGVtZW50OwotCXByaXZhdGUgT2JqZWN0IGZQcm9jZXNzb3JJbnN0YW5jZTsKLQotCXB1YmxpYyBDb250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJZkNvbmZpZ3VyYXRpb25FbGVtZW50ID0gZWxlbWVudDsKLQkJZlByb2Nlc3Nvckluc3RhbmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb2Nlc3NvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZQcm9jZXNzb3JJbnN0YW5jZSA9PSBudWxsICYmIGZDb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ySW5zdGFuY2UgPSBmQ29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JJbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTExZmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYXBwcm9wcmlhdGUgY29ycmVjdGlvbiBhc3Npc3RhbnQgZm9yIGEgZ2l2ZW4gc291cmNlIHZpZXdlci4KLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYmFzZSBpbXBsZW1lbnRzIGEgY29tbW9uCi0gKiB3YXkgZm9yIHF1aWNrZml4L3F1aWNrIGFzc2lzdC4KLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29ycmVjdGlvbiBhc3Npc3RhbnQgZm9yIHRoZSBnaXZlbiBzb3VyY2V2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29ycmVjdGlvbkFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRlMDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBjYW4gYXNzaXN0IGF0IHRoZSBnaXZlbiBvZmZzZXQuIFRoaXMgdGVzdAotCSAqIHNob3VsZCBiZSBhbiBvcHRpbWlzdGljIGd1ZXNzIGFuZCBiZSBleHRyZW1seSBjaGVhcC4KLQkgKi8KLQlib29sZWFuIGNhbkFzc2lzdChTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQ29sbGVjdHMgcHJvcG9zYWxzIGZvciBhc3Npc3RhbnQgYXQgdGhlIGdpdmVuIG9mZnNldC4KLQkgKi8KLQlJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tGaXhQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0ZpeFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ0MWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0ZpeFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzb3IgY2FuIGZpeCB0aGUgZ2l2ZW4gcHJvYmxlbS4gVGhpcyB0ZXN0Ci0JICogc2hvdWxkIGJlIGFuIG9wdGltaXN0aWMgZ3Vlc3MgYW5kIGJlIGV4dHJlbWx5IGNoZWFwLgotCSAqLwotCWJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ubm90YXRpb24pOwotCi0JLyoqCi0JICogQ29sbGVjdHMgcHJvcG9zYWxzIGZvciBmaXhpbmcgdGhlIGdpdmVuIHByb2JsZW0uCi0JICovCi0JSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhBbm5vdGF0aW9uIGFubm5vdGF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL05vTW9kaWZpY2F0aW9uQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOThiYjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL05vTW9kaWZpY2F0aW9uQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbF8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTgzYjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENvcnJlY3Rpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElBbm5vdGF0aW9uTW9kZWwgZkFubm90YXRpb25Nb2RlbDsKLQlwcm90ZWN0ZWQgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIGZRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLQlwcm90ZWN0ZWQgSVF1aWNrRml4UHJvY2Vzc29yIGZRdWlja0ZpeFByb2Nlc3NvcjsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlmQW5ub3RhdGlvbk1vZGVsID0gc291cmNlVmlld2VyLmdldEFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFF1aWNrQXNzaXN0UHJvcG9zYWxzKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgQXJyYXlMaXN0IHByb3Bvc2FscywgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlJUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCAmJiBwcm9jZXNzb3IuY2FuQXNzaXN0KHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlcyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHModmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcmVzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlwcm9wb3NhbHMuYWRkKHJlc1trXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFF1aWNrRml4UHJvcG9zYWxzKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgQXJyYXlMaXN0IHByb3Bvc2FscywgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBmQW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCVBvc2l0aW9uIHBvcyA9IGZBbm5vdGF0aW9uTW9kZWwuZ2V0UG9zaXRpb24oYW5ub3RhdGlvbik7Ci0JCQlpZiAocG9zICE9IG51bGwgJiYgZG9jdW1lbnRPZmZzZXQgPj0gcG9zLm9mZnNldCAmJiBkb2N1bWVudE9mZnNldCA8PSBwb3Mub2Zmc2V0ICsgcG9zLmxlbmd0aCkgewotCQkJCUlRdWlja0ZpeFByb2Nlc3NvciBwcm9jZXNzb3IgPSBnZXRRdWlja0ZpeFByb2Nlc3NvcigpOwotCQkJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCAmJiBwcm9jZXNzb3IuY2FuRml4KGFubm90YXRpb24pKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fscyhhbm5vdGF0aW9uKTsKLQkJCQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcmVzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCXByb3Bvc2Fscy5hZGQocmVzW2tdKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlBcnJheUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgewotCQkJYWRkUXVpY2tGaXhQcm9wb3NhbHMoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIHByb3Bvc2FscywgZG9jdW1lbnRPZmZzZXQpOwotCi0JCQlpZiAocHJvcG9zYWxzLmlzRW1wdHkoKSkgewotCQkJCWFkZFF1aWNrQXNzaXN0UHJvcG9zYWxzKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBwcm9wb3NhbHMsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wb3NhbHMuaXNFbXB0eSgpKQotCQkJcHJvcG9zYWxzLmFkZChuZXcgTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWwoKSk7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIGdldFF1aWNrQXNzaXN0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVF1aWNrRml4UHJvY2Vzc29yIGdldFF1aWNrRml4UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0N2Q2NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0JyZWFrcG9pbnRSdWxlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1ZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJlYWtwb2ludFJ1bGVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTW91c2VVcGRhdGVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nIChoZXJlKQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCXRyeSB7Ci0JCQkJcGF0aCA9ICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0JCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpbmRleCA9PSAobmFtZS5sZW5ndGgoKSAtIDEpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0JCQlyZXNvdXJjZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCi0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0JCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVBhcnRTZXJ2aWNlIHNlcnZpY2UgPSB3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKTsKLQkJCQkJaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IHBhcnQgPSBzZXJ2aWNlLmdldEFjdGl2ZVBhcnQoKTsKLQkJCQkJCWlmIChwYXJ0ICE9IG51bGwgJiYgcGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCQkJZWRpdG9yUGFydCA9IChJRWRpdG9yUGFydCkgcGFydDsKLQkJCQkJCQlpZiAoZWRpdG9yUGFydCAhPSBudWxsKSB7Ci0JCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0OwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCkgewotCQkJCQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJSURvY3VtZW50IHRleHREb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGlucHV0KTsKLQkJCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodGV4dERvY3VtZW50KTsKLQkJCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlyZXNvdXJjZSA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZShpbnB1dCwgbW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCksIGdldEZpbGVFeHRlbnNpb24oaW5wdXQpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQkJCQkJCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0QnJlYWtwb2ludFByb3ZpZGVycyhlZGl0b3JQYXJ0LCBudWxsLCBnZXRGaWxlRXh0ZW5zaW9uKGlucHV0KSk7Ci0JCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoICYmIHJlc291cmNlID09IG51bGw7IGkrKykgewotCQkJCQkJCQkJCQlyZXNvdXJjZSA9IHByb3ZpZGVyc1tpXS5nZXRSZXNvdXJjZShpbnB1dCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW91c2VMaXN0ZW5lciBmTW91c2VMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVZlcnRpY2FsUnVsZXJJbmZvIGZSdWxlckluZm8gPSBudWxsOwotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBmVGV4dEVkaXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgQnJlYWtwb2ludFJ1bGVyQWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXJJbmZvIHJ1bGVySW5mbykgewotCQlzdXBlcigpOwotCQlmVGV4dEVkaXRvciA9IGVkaXRvcjsKLQkJaWYocnVsZXJJbmZvICE9IG51bGwpIHsKLQkJCWZSdWxlckluZm8gPSBydWxlckluZm87Ci0JCQlmTW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZVVwZGF0ZXIoKTsKLQkJCXJ1bGVySW5mby5nZXRDb250cm9sKCkuYWRkTW91c2VMaXN0ZW5lcihmTW91c2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbDwvY29kZT4gb2YgdGhlCi0JICogZWRpdG9yJ3MgaW5wdXQuCi0JICogCi0JICogQHJldHVybiB0aGUgbWFya2VyIGFubm90YXRpb24gbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgZ2V0QW5ub3RhdGlvbk1vZGVsKCkgewotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IHByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwpCi0JCQlyZXR1cm4gKEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsKSBtb2RlbDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gZ2V0QnJlYWtwb2ludHMoSU1hcmtlcltdIG1hcmtlcnMpIHsKLQkJSUJyZWFrcG9pbnRNYW5hZ2VyIG1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJTGlzdCBicmVha3BvaW50cyA9IG5ldyBBcnJheUxpc3QobWFya2Vycy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlCcmVha3BvaW50IGJyZWFrcG9pbnQgPSBtYW5hZ2VyLmdldEJyZWFrcG9pbnQobWFya2Vyc1tpXSk7Ci0JCQlpZiAoYnJlYWtwb2ludCAhPSBudWxsKSB7Ci0JCQkJYnJlYWtwb2ludHMuYWRkKGJyZWFrcG9pbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUJyZWFrcG9pbnRbXSkgYnJlYWtwb2ludHMudG9BcnJheShuZXcgSUJyZWFrcG9pbnRbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPklEb2N1bWVudDwvY29kZT4gb2YgdGhlIGVkaXRvcidzIGlucHV0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IG9mIHRoZSBlZGl0b3IncyBpbnB1dAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlyZXR1cm4gcHJvdmlkZXIuZ2V0RG9jdW1lbnQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgbWFya2VycyB3aGljaCBpbmNsdWRlIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtYXJrZXJzIHdoaWNoIGluY2x1ZGUgdGhlIHJ1bGVyJ3MgbGluZSBvZiBhY3Rpdml0eQotCSAqLwotCXByb3RlY3RlZCBJTWFya2VyW10gZ2V0TWFya2VycygpIHsKLQkJTGlzdCBtYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCUFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGdldEFubm90YXRpb25Nb2RlbCgpOwotCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIGFubm90YXRpb25Nb2RlbCAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXJbXSBhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSUJyZWFrcG9pbnQuQlJFQUtQT0lOVF9NQVJLRVIsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlpZiAoYWxsTWFya2VycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGluY2x1ZGVzUnVsZXJMaW5lKGFubm90YXRpb25Nb2RlbC5nZXRNYXJrZXJQb3NpdGlvbihhbGxNYXJrZXJzW2ldKSwgZG9jdW1lbnQpKSB7Ci0JCQkJCQkJbWFya2Vycy5hZGQoYWxsTWFya2Vyc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChJTWFya2VyW10pIG1hcmtlcnMudG9BcnJheShuZXcgSU1hcmtlclswXSk7Ci0JfQotCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGlucHV0KTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcnVsZXJJbmZvLgotCSAqLwotCXB1YmxpYyBJVmVydGljYWxSdWxlckluZm8gZ2V0UnVsZXJJbmZvKCkgewotCQlyZXR1cm4gZlJ1bGVySW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRleHRFZGl0b3IuCi0JICovCi0JcHVibGljIElUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNYXJrZXJzKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCBtb2RlbCA9IGdldEFubm90YXRpb25Nb2RlbCgpOwotCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIG1vZGVsICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhJQnJlYWtwb2ludC5MSU5FX0JSRUFLUE9JTlRfTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJaWYgKGFsbE1hcmtlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpbmNsdWRlc1J1bGVyTGluZShtb2RlbC5nZXRNYXJrZXJQb3NpdGlvbihhbGxNYXJrZXJzW2ldKSwgZG9jdW1lbnQpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIHBvc2l0aW9uIGluY2x1ZGVzIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gdG8gYmUgY2hlY2tlZAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoZSBwb3NpdGlvbiByZWZlcnMgdG8KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaW5lIGlzIGluY2x1ZGVkIGJ5IHRoZSBnaXZlbgotCSAqICAgICAgICAgcG9zaXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlc1J1bGVyTGluZShQb3NpdGlvbiBwb3NpdGlvbiwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChwb3NpdGlvbiAhPSBudWxsICYmIGZSdWxlckluZm8gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgbWFya2VyTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJaW50IGxpbmUgPSBnZXRSdWxlckluZm8oKS5nZXRMaW5lT2ZMYXN0TW91c2VCdXR0b25BY3Rpdml0eSgpOwotCQkJCWlmIChsaW5lID09IG1hcmtlckxpbmUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCS8vIGNvbW1lbnRlZCBiZWNhdXNlIG9mICIxR0VVT1o5OiBJVFBKVUk6QUxMIC0gQ29uZnVzaW5nIFVJCi0JCQkJLy8gZm9yCi0JCQkJLy8gbXVsdGlsaW5lIEJvb2ttYXJrcyBhbmQgVGFza3MiCi0JCQkJLy8gcmV0dXJuIChtYXJrZXJMaW5lIDw9IGxpbmUgJiYgbGluZSA8PQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbi5nZXRPZmZzZXQoKSArCi0JCQkJLy8gcG9zaXRpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvRGVidWdUZXh0RWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvRGVidWdUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzliODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0RlYnVnVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1ZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5GaWxlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyUnVsZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVBvcHVwTWVudUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogQSB0ZXh0IGVkaXRvciBjYXBhYmxlIG9mIHVzaW5nIHRoZSBJQnJlYWtwb2ludFByb3ZpZGVyIGZyYW1ld29yay4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudHMgd2hvIHdpc2ggdG8gdXNlIHRoZQotICogSUJyZWFrcG9pbnRQcm92aWRlciBmcmFtZXdvcmsgYnV0IG5vdCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IsIGUuZy4gVkJTCi0gKiBzb3VyY2UgZWRpdG9ycy4gSXQgaXMgcHJvdmlkZWQgQVMtSVMgYW5kIG1hcmtlZCBpbnRlcm5hbCBhcyBpdCBpcwotICogdW5zdXBwb3J0ZWQgYW5kIHN1YmplY3QgdG8gY2hhbmdlIGF0IGFueSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgRGVidWdUZXh0RWRpdG9yIGV4dGVuZHMgVGV4dEVkaXRvciB7Ci0KLQlwcml2YXRlIGNsYXNzIFNob3dJblRhcmdldExpc3RlciBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXRMaXN0IHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBmU2hvd0luVGFyZ2V0SWRzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRQcm92aWRlciBmb3IgSVN0b3JhZ2VFZGl0b3JJbnB1dHMgLSBzdXBwb3J0cwotCSAqIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCBub3RpZmljYXRpb25zIGFuZCBhc3NpZ25pbmcgYnJlYWtwb2ludAotCSAqIG1hcmtlcnMuCi0JICovCi0JY2xhc3MgU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMgSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCUlTdG9yYWdlRWRpdG9ySW5wdXQgc3RvcmFnZUlucHV0ID0gKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgZXh0ID0gQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oc3RvcmFnZUlucHV0KTsKLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0RWRpdG9ySW5wdXRDb250ZW50VHlwZXMoc3RvcmFnZUlucHV0KTsKLQkJCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IHJlcyA9PSBudWxsICYmIGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlcyA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZShzdG9yYWdlSW5wdXQsIHR5cGVzW2ldLmdldElkKCksIGV4dCk7Ci0JCQl9Ci0JCQlTdHJpbmcgaWQgPSBzdG9yYWdlSW5wdXQuZ2V0TmFtZSgpOwotCQkJaWYgKHN0b3JhZ2VJbnB1dC5nZXRTdG9yYWdlKCkgIT0gbnVsbCkgewotCQkJCUlQYXRoIGZ1bGxQYXRoID0gc3RvcmFnZUlucHV0LmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpOwotCQkJCWlmIChmdWxsUGF0aCAhPSBudWxsKQotCQkJCQlpZCA9IGZ1bGxQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQlpZCA9IHN0b3JhZ2VJbnB1dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAocmVzICE9IG51bGwpCi0JCQkJbW9kZWwgPSBuZXcgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKHJlcywgaWQpOwotCQkJZWxzZQotCQkJCW1vZGVsID0gbmV3IFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBpZCk7Ci0KLQkJCXJldHVybiBtb2RlbDsKLQkJfQotCi0JCXByb3RlY3RlZCBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIuRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJKChJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmFkZEVsZW1lbnRTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5yZW1vdmVFbGVtZW50U3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyI2RvU2F2ZURvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBib29sZWFuKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gdW50ZXN0ZWQKLQkJCW5ldyBGaWxlRG9jdW1lbnRQcm92aWRlcigpLnNhdmVEb2N1bWVudChtb25pdG9yLCBlbGVtZW50LCBkb2N1bWVudCwgb3ZlcndyaXRlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnRSZXBsYWNlZChPYmplY3QgZWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoZWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50RGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnREZWxldGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgaXNEaXJ0eSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50TW92ZWQoT2JqZWN0IG9yaWdpbmFsRWxlbWVudCwgT2JqZWN0IG1vdmVkRWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnRNb3ZlZChvcmlnaW5hbEVsZW1lbnQsIG1vdmVkRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlTdHJpbmdbXSBmU2hvd0luVGFyZ2V0SWRzID0gbmV3IFN0cmluZ1tde0lQYWdlTGF5b3V0LklEX1JFU19OQVZ9OwotCXByaXZhdGUgSVNob3dJblRhcmdldExpc3QgZlNob3dJblRhcmdldExpc3RBZGFwdGVyID0gbmV3IFNob3dJblRhcmdldExpc3RlcigpOwotCi0JSURvY3VtZW50UHJvdmlkZXIgZlN0b3JhZ2VJbnB1dERvY3VtZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHVibGljIERlYnVnVGV4dEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSB0b2dnbGUgYnJlYWtwb2ludHMKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQkJSUxvY2F0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUxvY2F0aW9uUHJvdmlkZXIpIGdldEVkaXRvcklucHV0KCkuZ2V0QWRhcHRlcihJTG9jYXRpb25Qcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJSVBhdGggbG9jYXRpb24gPSBwcm92aWRlci5nZXRQYXRoKGdldEVkaXRvcklucHV0KCkpOwotCQkJCQlyZXR1cm4gZGV0ZWN0Q29udGVudFR5cGUobG9jYXRpb24pLmdldElkKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0JCQkJCUlQYXRoIGxvY2F0aW9uID0gKChJUGF0aEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKS5nZXRQYXRoKCk7Ci0JCQkJCXJldHVybiBkZXRlY3RDb250ZW50VHlwZShsb2NhdGlvbikuZ2V0SWQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVDsKLQkJCX0KLQkJfTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuVE9HR0xFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBtYW5hZ2UgYnJlYWtwb2ludHMKLQkJYWN0aW9uID0gbmV3IE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuTUFOQUdFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBlZGl0IGJyZWFrcG9pbnRzCi0JCWFjdGlvbiA9IG5ldyBFZGl0QnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5FRElUX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBTaG93IEluIFRhcmdldCBJRHMgZnJvbSB0aGUgRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBleHRlbnNpb24KLQkgKiBwb2ludC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNyZWF0ZVNob3dJblRhcmdldElkcygpIHsKLQkJTGlzdCBhbGxJZHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJzaG93aW50YXJnZXQiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQlTdHJpbmdbXSBpZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc29tZUlkcyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQkJCQlTdHJpbmcgaWQgPSBpZHNba10udHJpbSgpOwotCQkJCQkJaWYgKCFhbGxJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJYWxsSWRzLmFkZChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBhbGxJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQlJQ29udGVudFR5cGUgZGV0ZWN0Q29udGVudFR5cGUoSVBhdGggbG9jYXRpb24pIHsKLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIE9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCXR5cGUgPSBkLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBTaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0U3lzdGVtRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoaW5wdXQsIGxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQotCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgYyA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQlpZiAoYyBpbnN0YW5jZW9mIElQb3B1cE1lbnVDb250cmlidXRvcikgewotCQkJKChJUG9wdXBNZW51Q29udHJpYnV0b3IpIGMpLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJfQotCQllbHNlIHsKLQkJCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQkJSUV4dGVuZGVkQ29udHJpYnV0b3IgcG1jID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkpOwotCQkJaWYgKHBtYyAhPSBudWxsKSB7Ci0JCQkJcG1jLnNldEFjdGl2ZUVkaXRvcih0aGlzKTsKLQkJCQlwbWMuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgcmVxdWlyZWQpIHsKLQkJLy8gTmF2aWdhdGUgYWN0aW9uIHNldCBtZW51Ci0JCWlmIChJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKQotCQkJcmV0dXJuIGZTaG93SW5UYXJnZXRMaXN0QWRhcHRlcjsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIocmVxdWlyZWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHModGhpcywgZ2V0SW5wdXRDb250ZW50VHlwZShnZXRFZGl0b3JJbnB1dCgpKSwgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5TT1VSQ0UsIERlYnVnVGV4dEVkaXRvci5jbGFzcyk7Ci0JfQotCi0JSUNvbnRlbnRUeXBlW10gZ2V0RWRpdG9ySW5wdXRDb250ZW50VHlwZXMoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gbnVsbDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlpZiAoaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcykgIT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSAoSUZpbGUpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQl9Ci0JCWVsc2UgaWYgKGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde2QuZ2V0Q29udGVudFR5cGUoKX07Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUgdHlwZQotCQkJCS8vIGNoZWNrIGFib3ZlCi0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCXR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihpbnB1dC5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySW5wdXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRDb250ZW50VHlwZShJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBnZXRFZGl0b3JJbnB1dENvbnRlbnRUeXBlcyhlZGl0b3JJbnB1dCk7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZXNbMF0uZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdnaW5nQXZhaWxhYmxlKCkgewotCQlib29sZWFuIGRlYnVnZ2luZ0F2YWlsYWJsZSA9IGZhbHNlOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGdldEVkaXRvcklucHV0Q29udGVudFR5cGVzKGdldEVkaXRvcklucHV0KCkpOwotCQlmb3IgKGludCBpID0gMDsgIWRlYnVnZ2luZ0F2YWlsYWJsZSAmJiBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlYnVnZ2luZ0F2YWlsYWJsZSA9IGRlYnVnZ2luZ0F2YWlsYWJsZSB8fCBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuaXNBdmFpbGFibGUodHlwZXNbaV0uZ2V0SWQoKSwgQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQl9Ci0JCXJldHVybiBkZWJ1Z2dpbmdBdmFpbGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmIChpc0RlYnVnZ2luZ0F2YWlsYWJsZSgpKSB7Ci0JCQltZW51LmFkZChnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsKLQkJCW1lbnUuYWRkKGdldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLk1BTkFHRV9CUkVBS1BPSU5UUykpOwotCQkJbWVudS5hZGQoZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuRURJVF9CUkVBS1BPSU5UUykpOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjb3VsZCBub3QgZW5hYmxlIGRlYnVnZ2luZyBhY3Rpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzdXBlci5ydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgSURvY3VtZW50UHJvdmlkZXIgaXMgdXNlZC4gRm9yIElGaWxlIGFuZCBGaWxlcywKLQkgKiB0aGUgZGVmYXVsdCBwcm92aWRlciB3aXRoIGEgc3BlY2lmaWVkIEFubm90YXRpb25Nb2RlbEZhY3RvcnkgaXMgdXNlZC4KLQkgKiBGb3IgU3RvcmFnZUVkaXRvcklucHV0cywgdXNlIGEgY3VzdG9tIHByb3ZpZGVyIHRoYXQgY3JlYXRlcyBhIHVzYWJsZQotCSAqIFJlc291cmNlQW5ub3RhdGlvbk1vZGVsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNzZXREb2N1bWVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0ICYmICEoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkgewotCQkJaWYgKGZTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlmU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlciA9IG5ldyBTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKGZTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciN1cGRhdGVDb250ZW50RGVwZW5kZW50QWN0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zKCk7Ci0JCWlmIChpc0RlYnVnZ2luZ0F2YWlsYWJsZSgpKSB7Ci0JCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUlVMRVJfRE9VQkxFX0NMSUNLLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRoZSBEZWZhdWx0IFRleHQgRWRpdG9yIHVzZXMgZWRpdG9yQ29udHJpYnV0aW9uIHRvIHBlcmZvcm0gdGhpcwotCQkJLy8gbWFwcGluZywgYnV0IHNpbmNlIGl0IHJlbGllcyBvbiB0aGUgSUVkaXRvclNpdGUgSUQsIGl0IGNhbid0IGJlCi0JCQkvLyByZWxpZWQgb24gZm9yIE11bHRpUGFnZUVkaXRvclBhcnRzLiBJbnN0ZWFkLCBmb3JjZSB0aGUgYWN0aW9uCi0JCQkvLyByZWdpc3RyYXRpb24gbWFudWFsbHkuCi0JCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUlVMRVJfRE9VQkxFX0NMSUNLLCBuZXcgTWFya2VyUnVsZXJBY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiRWRpdG9yLk1hbmFnZUJvb2ttYXJrcy4iLCB0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCksIElNYXJrZXIuQk9PS01BUkssIHRydWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZTaG93SW5UYXJnZXRJZHMgPSBjcmVhdGVTaG93SW5UYXJnZXRJZHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvRWRpdEJyZWFrcG9pbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9FZGl0QnJlYWtwb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM0NGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9FZGl0QnJlYWtwb2ludEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRWRpdEJyZWFrcG9pbnRBY3Rpb24gZXh0ZW5kcyBCcmVha3BvaW50UnVsZXJBY3Rpb24gewotCXByb3RlY3RlZCBJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcGFyYW0gcnVsZXJJbmZvCi0JICovCi0JcHVibGljIEVkaXRCcmVha3BvaW50QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXIgcnVsZXJJbmZvKSB7Ci0JCXN1cGVyKGVkaXRvciwgcnVsZXJJbmZvKTsKLQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkVkaXRCcmVha3BvaW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlQcm9wZXJ0eURpYWxvZ0FjdGlvbiBhY3Rpb24gPSBuZXcgUHJvcGVydHlEaWFsb2dBY3Rpb24oZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSwgbmV3IElTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJyZWFrcG9pbnRzKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCWFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlVGhpc0FjdGlvbiA9IGhhc01hcmtlcnMoKTsKLQkJc2V0RW5hYmxlZChlbmFibGVUaGlzQWN0aW9uKTsKLQkJYnJlYWtwb2ludHMgPSBnZXRCcmVha3BvaW50cyhnZXRNYXJrZXJzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9NYW5hZ2VCcmVha3BvaW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvTWFuYWdlQnJlYWtwb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM3YWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9NYW5hZ2VCcmVha3BvaW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24gLSBFbmFibGVzIGFuZCBEaXNhYmxlcwotICovCi1wdWJsaWMgY2xhc3MgTWFuYWdlQnJlYWtwb2ludEFjdGlvbiBleHRlbmRzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGRvRW5hYmxlID0gdHJ1ZTsKLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcGFyYW0gcnVsZXJJbmZvCi0JICovCi0JcHVibGljIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlciBydWxlckluZm8pIHsKLQkJc3VwZXIoZWRpdG9yLCBydWxlckluZm8pOwotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlQnJlYWtwb2ludHMoSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWJyZWFrcG9pbnRzW2ldLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUJyZWFrcG9pbnRzKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlicmVha3BvaW50c1tpXS5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGRvRW5hYmxlKQotCQkJZW5hYmxlQnJlYWtwb2ludHMoYnJlYWtwb2ludHMpOwotCQllbHNlCi0JCQlkaXNhYmxlQnJlYWtwb2ludHMoYnJlYWtwb2ludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJLy8gZG9FbmFibGUgbWVhbnMgImVuYWJsZSIgaW5zdGVhZCBvZiAiZGlzYWJsZSIKLQkJZG9FbmFibGUgPSB0cnVlOwotCQlicmVha3BvaW50cyA9IGdldEJyZWFrcG9pbnRzKGdldE1hcmtlcnMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBkb0VuYWJsZSAmJiBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCUlCcmVha3BvaW50IGJyZWFrcG9pbnQgPSBicmVha3BvaW50c1tpXTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpIHsKLQkJCQkJZG9FbmFibGUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJicmVha3BvaW50IG5vdCByZXNwb25kaW5nIHRvIGlzRW5hYmxlZDogIiArIGJyZWFrcG9pbnQsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc2V0RW5hYmxlZChicmVha3BvaW50cyAhPSBudWxsICYmIGJyZWFrcG9pbnRzLmxlbmd0aCA+IDApOwotCQlpZiAoZG9FbmFibGUpCi0JCQlzZXRUZXh0KFNTRVVJTWVzc2FnZXMuTWFuYWdlQnJlYWtwb2ludEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlzZXRUZXh0KFNTRVVJTWVzc2FnZXMuTWFuYWdlQnJlYWtwb2ludEFjdGlvbl8xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OTM3YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLQotLyoqCi0gKiBUb2dnbGVCcmVha3BvaW50QWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVCcmVha3BvaW50QWN0aW9uIGV4dGVuZHMgQnJlYWtwb2ludFJ1bGVyQWN0aW9uIHsKLQlJQWN0aW9uIGZGYWxsYmFja0FjdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcGFyYW0gcnVsZXJJbmZvCi0JICovCi0JcHVibGljIFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlckluZm8gcnVsZXJJbmZvKSB7Ci0JCXN1cGVyKGVkaXRvciwgcnVsZXJJbmZvKTsKLQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRvZ2dsZUJyZWFrcG9pbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIElWZXJ0aWNhbFJ1bGVySW5mbyBydWxlckluZm8sIElBY3Rpb24gZmFsbGJhY2tBY3Rpb24pIHsKLQkJdGhpcyhlZGl0b3IsIHJ1bGVySW5mbyk7Ci0JCWZGYWxsYmFja0FjdGlvbiA9IGZhbGxiYWNrQWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZUJyZWFrcG9pbnRzKGludCBsaW5lTnVtYmVyKSB7Ci0JCS8qCi0JCSAqIE5vdGU6IHdlJ2xsIGFsd2F5cyBhbGxvdyBwcm9jZXNzaW5nIHRvIGNvbnRpbnVlLCBldmVuIGZvciBhICJyZWFkCi0JCSAqIG9ubHkiIElTdG9yYWdlRWRpdG9ySW5wdXQsIGZvciB0aGUgQWN0aXZlU2NyaXB0IGRlYnVnZ2VyLiBCdXQgdGhpcwotCQkgKiBtZWFucyBzb21ldGltZXMgdGhlIEFjdGl2ZVNjcmlwdCBwcm92aWRlciBtaWdodCBnZXQgYW4gaW5wdXQgZnJvbQotCQkgKiBDVlMgb3Igc29tZXRoaW5nIHRoYXQgaXMgbm90IHJlbGF0ZWQgdG8gZGVidWdnaW5nLgotCQkgKi8KLQotCQlJVGV4dEVkaXRvciBlZGl0b3IgPSBnZXRUZXh0RWRpdG9yKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGlucHV0KTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoZG9jdW1lbnQpOwotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldEJyZWFrcG9pbnRQcm92aWRlcnMoZWRpdG9yLCBjb250ZW50VHlwZSwgZ2V0RmlsZUV4dGVuc2lvbihpbnB1dCkpOwotCi0JCWludCBwb3MgPSAtMTsKLQkJSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGVkaXRvci5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJaWYgKHRvb2xzICE9IG51bGwpIHsKLQkJCXBvcyA9IHRvb2xzLmdldENhcmV0T2Zmc2V0KCk7Ci0JCX0KLQotCQlmaW5hbCBpbnQgbiA9IHByb3ZpZGVycy5sZW5ndGg7Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnQnJlYWtwb2ludHMpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm92aWRlcnNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGluZyBicmVha3BvaW50IHRvIGxpbmUgIiArIGxpbmVOdW1iZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBwcm92aWRlcnNbaV0uYWRkQnJlYWtwb2ludChkb2N1bWVudCwgaW5wdXQsIGxpbmVOdW1iZXIsIHBvcyk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCWVycm9ycy5hZGQoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXJyb3JzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgYnJlYWtwb2ludCIsIHQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKLQkJCVNoZWxsIHNoZWxsID0gZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJTXVsdGlTdGF0dXMgYWxsU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLklORk8sIChJU3RhdHVzW10pIGVycm9ycy50b0FycmF5KG5ldyBJU3RhdHVzWzBdKSwgU1NFVUlNZXNzYWdlcy5NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfbWVzc2FnZTEsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkvKgotCQkJICogU2hvdyBmb3IgY29uZGl0aW9ucyBtb3JlIHNldmVyZSB0aGFuIElORk8gb3Igd2hlbiBubwotCQkJICogYnJlYWtwb2ludHMgd2VyZSBjcmVhdGVkCi0JCQkgKi8KLQkJCWlmIChhbGxTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA+IElTdGF0dXMuSU5GTyB8fCBnZXRCcmVha3BvaW50cyhnZXRNYXJrZXJzKCkpLmxlbmd0aCA8IDEpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIFNTRVVJTWVzc2FnZXMuTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX3RpdGxlMSwgU1NFVUlNZXNzYWdlcy5NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfbWVzc2FnZTEsIGFsbFN0YXR1cyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBBbHRob3VnaCBubyBlcnJvcnMgd2VyZSByZXBvcnRlZCwgbm8gYnJlYWtwb2ludHMgZXhpc3Qgb24gdGhpcyBsaW5lCi0JCSAqIGFmdGVyIGhhdmluZyBydW4gdGhlIGV4aXN0aW5nIHByb3ZpZGVycy4gUnVuIHRoZSBmYWxsYmFjayBhY3Rpb24uCi0JCSAqLwotCQllbHNlIGlmIChmRmFsbGJhY2tBY3Rpb24gIT0gbnVsbCAmJiAhaGFzTWFya2VycygpKSB7Ci0JCQlpZiAoZkZhbGxiYWNrQWN0aW9uIGluc3RhbmNlb2YgSVNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQkJKChJU2VsZWN0aW9uTGlzdGVuZXIpIGZGYWxsYmFja0FjdGlvbikuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBudWxsKTsKLQkJCX0KLQkJCWZGYWxsYmFja0FjdGlvbi5ydW4oKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJTW9kZWxNYW5hZ2VyIG1nciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCVN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0KLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNCkgewotCQkJdHJ5IHsKLQkJCQlJQ29udGVudFR5cGUgdHlwZSA9ICgoSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240KSBwcm92aWRlcikuZ2V0Q29udGVudFR5cGUoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCQkJY29udGVudFR5cGUgPSB0eXBlLmdldElkKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLyoKLQkJCQkgKiBBIGZhaWx1cmUgYWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIHN0b3JlIHJlYWxseSBpc24ndAotCQkJCSAqIGludGVyZXN0aW5nLCBhbHRob3VnaCBpdCBjYW4gYmUgYSBwcm9ibGVtIGZvcgotCQkJCSAqIElTdG9yYWdlRWRpdG9ySW5wdXRzLgotCQkJCSAqLwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1nci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJY29udGVudFR5cGUgPSBtb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUJyZWFrcG9pbnRzKGludCBsaW5lTnVtYmVyKSB7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gZ2V0QnJlYWtwb2ludHMoZ2V0TWFya2VycygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlicmVha3BvaW50c1tpXS5nZXRNYXJrZXIoKS5kZWxldGUoKTsKLQkJCQlicmVha3BvaW50TWFuYWdlci5yZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnRzW2ldLCB0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpbnQgbGluZU51bWJlciA9IGZSdWxlckluZm8uZ2V0TGluZU9mTGFzdE1vdXNlQnV0dG9uQWN0aXZpdHkoKSArIDE7Ci0JCWJvb2xlYW4gZG9BZGQgPSAhaGFzTWFya2VycygpOwotCQlpZiAoZG9BZGQpCi0JCQljcmVhdGVCcmVha3BvaW50cyhsaW5lTnVtYmVyKTsKLQkJZWxzZQotCQkJcmVtb3ZlQnJlYWtwb2ludHMobGluZU51bWJlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkZDMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBuc2QKLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IGltcGxlbWVudHMgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IHsKLQlzdGF0aWMgZmluYWwgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IGluc3RhbmNlID0gbmV3IFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIElUb2dnbGVCcmVha3BvaW50c1RhcmdldCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCNjYW5Ub2dnbGVMaW5lQnJlYWtwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlTGluZUJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPiAtMSkgewotCQkJCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCQkJdHJ5IHsKLQkJCQkJbGluZU51bWJlciA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJaWYgKGxpbmVOdW1iZXIgPj0gMCkgewotCQkJCQlUb2dnbGVCcmVha3BvaW50QWN0aW9uIHRvZ2dsZXIgPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihlZGl0b3IsIG51bGwpOwotCQkJCQl0b2dnbGVyLnVwZGF0ZSgpOwotCQkJCQlyZXR1cm4gdG9nZ2xlci5pc0VuYWJsZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlV2F0Y2hwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlV2F0Y2hwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgSUJyZWFrcG9pbnRbXSBnZXRCcmVha3BvaW50cyhJUmVzb3VyY2UgcmVzb3VyY2UsIElEb2N1bWVudCBkb2N1bWVudCwgQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbW9kZWwsIGludCBsaW5lTnVtYmVyKSB7Ci0JCUxpc3QgbWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgbW9kZWwgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJTWFya2VyW10gYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElCcmVha3BvaW50LkxJTkVfQlJFQUtQT0lOVF9NQVJLRVIsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlpZiAoYWxsTWFya2VycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldE1hcmtlclBvc2l0aW9uKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJaW50IG1hcmtlckxpbmUgPSAtMTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWFya2VyTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwLmdldE9mZnNldCgpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQkJaWYgKG1hcmtlckxpbmUgPT0gbGluZU51bWJlcikgewotCQkJCQkJCW1hcmtlcnMuYWRkKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJfQotCQl9Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUxpc3QgYnJlYWtwb2ludHMgPSBuZXcgQXJyYXlMaXN0KG1hcmtlcnMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gbWFuYWdlci5nZXRCcmVha3BvaW50KChJTWFya2VyKSBtYXJrZXJzLmdldChpKSk7Ci0JCQlpZiAoYnJlYWtwb2ludCAhPSBudWxsKSB7Ci0JCQkJYnJlYWtwb2ludHMuYWRkKGJyZWFrcG9pbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUJyZWFrcG9pbnRbXSkgYnJlYWtwb2ludHMudG9BcnJheShuZXcgSUJyZWFrcG9pbnRbMF0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjdG9nZ2xlTGluZUJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZUxpbmVCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpbnQgbGluZU51bWJlciA9IC0xOwotCQkJdHJ5IHsKLQkJCQlsaW5lTnVtYmVyID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlmIChsaW5lTnVtYmVyID49IDApIHsKLQkJCQlUb2dnbGVCcmVha3BvaW50QWN0aW9uIHRvZ2dsZXIgPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihlZGl0b3IsIG51bGwpOwotCQkJCXRvZ2dsZXIudXBkYXRlKCk7Ci0JCQkJaWYgKHRvZ2dsZXIuaXNFbmFibGVkKCkpIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdG9nZ2xlci5nZXRSZXNvdXJjZSgpOwotCQkJCQlBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCBtb2RlbCA9IHRvZ2dsZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCQkJCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBnZXRCcmVha3BvaW50cyhyZXNvdXJjZSwgZG9jdW1lbnQsIG1vZGVsLCBsaW5lTnVtYmVyKTsKLQkJCQkJaWYgKGJyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWJyZWFrcG9pbnRzW2ldLmdldE1hcmtlcigpLmRlbGV0ZSgpOwotCQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludHNbaV0sIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdG9nZ2xlci5jcmVhdGVCcmVha3BvaW50cyhsaW5lTnVtYmVyICsgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I3RvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCN0b2dnbGVXYXRjaHBvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0b2dnbGVXYXRjaHBvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTDJUZXh0UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MMlRleHRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhNjM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MMlRleHRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkhUTUwyVGV4dFJlYWRlciBNb2RpZmljYXRpb25zCi0gKiB3ZXJlIG1hZGUgdG8gYWRkIGJyLyB0YWcgYW5kIGZpeCB3YXJuaW5ncwotICovCi0vKioKLSAqIFJlYWRzIHRoZSB0ZXh0IGNvbnRlbnRzIGZyb20gYSByZWFkZXIgb2YgSFRNTCBjb250ZW50cyBhbmQgdHJhbnNsYXRlcyB0aGUKLSAqIHRhZ3Mgb3IgY3V0IHRoZW0gb3V0LgotICovCi1wdWJsaWMgY2xhc3MgSFRNTDJUZXh0UmVhZGVyIGV4dGVuZHMgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBmZ0VudGl0eUxvb2t1cDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgZmdUYWdzOwotCi0Jc3RhdGljIHsKLQotCQlmZ1RhZ3M9IG5ldyBIYXNoU2V0KCk7Ci0JCWZnVGFncy5hZGQoImIiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJiciIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImJyLyIpOy8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiaDUiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJwIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiZGwiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJkdCIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImRkIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgibGkiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJ1bCIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoInByZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZmdFbnRpdHlMb29rdXA9IG5ldyBIYXNoTWFwKDcpOwotCQlmZ0VudGl0eUxvb2t1cC5wdXQoImx0IiwgIjwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZnRW50aXR5TG9va3VwLnB1dCgiZ3QiLCAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJuYnNwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZnRW50aXR5TG9va3VwLnB1dCgiYW1wIiwgIiYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZnRW50aXR5TG9va3VwLnB1dCgiY2lyYyIsICJeIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZ0VudGl0eUxvb2t1cC5wdXQoInRpbGRlIiwgIn4iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZnRW50aXR5TG9va3VwLnB1dCgicXVvdCIsICJcIiIpOwkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgaW50IGZDb3VudGVyPSAwOwotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBmVGV4dFByZXNlbnRhdGlvbjsKLQlwcml2YXRlIGludCBmQm9sZD0gMDsKLQlwcml2YXRlIGludCBmU3RhcnRPZmZzZXQ9IC0xOwotCXByaXZhdGUgYm9vbGVhbiBmSW5QYXJhZ3JhcGg9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNQcmVmb3JtYXR0ZWRUZXh0PSBmYWxzZTsKLQotCS8qKgotCSAqIFRyYW5zZm9ybXMgdGhlIGh0bWwgdGV4dCBmcm9tIHRoZSByZWFkZXIgdG8gZm9ybWF0dGVkIHRleHQuCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbiBJZiBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGZvcm1hdHRpbmdzIHdpbGwgYmUgYXBwbGllZCB0bwotCSAqIHRoZSBwcmVzZW50YXRpb24uCi0JKi8KLQlwdWJsaWMgSFRNTDJUZXh0UmVhZGVyKFJlYWRlciByZWFkZXIsIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCXN1cGVyKG5ldyBQdXNoYmFja1JlYWRlcihyZWFkZXIpKTsKLQkJZlRleHRQcmVzZW50YXRpb249IHByZXNlbnRhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYz0gc3VwZXIucmVhZCgpOwotCQlpZiAoYyAhPSAtMSkKLQkJCSsrIGZDb3VudGVyOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydEJvbGQoKSB7Ci0JCWlmIChmQm9sZCA9PSAwKQotCQkJZlN0YXJ0T2Zmc2V0PSBmQ291bnRlcjsKLQkJKysgZkJvbGQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRQcmVmb3JtYXR0ZWRUZXh0KCkgewotCQlmSXNQcmVmb3JtYXR0ZWRUZXh0PSB0cnVlOwotCQlzZXRTa2lwV2hpdGVzcGFjZShmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcFByZWZvcm1hdHRlZFRleHQoKSB7Ci0JCWZJc1ByZWZvcm1hdHRlZFRleHQ9IGZhbHNlOwotCQlzZXRTa2lwV2hpdGVzcGFjZSh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wQm9sZCgpIHsKLQkJLS0gZkJvbGQ7Ci0JCWlmIChmQm9sZCA9PSAwKSB7Ci0JCQlpZiAoZlRleHRQcmVzZW50YXRpb24gIT0gbnVsbCkgewotCQkJCWZUZXh0UHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoZlN0YXJ0T2Zmc2V0LCBmQ291bnRlciAtIGZTdGFydE9mZnNldCwgbnVsbCwgbnVsbCwgU1dULkJPTEQpKTsKLQkJCX0KLQkJCWZTdGFydE9mZnNldD0gLTE7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuU3Vic3RpdHV0aW9uVGV4dFJlYWRlciNjb21wdXRlU3Vic3RpdHV0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVTdWJzdGl0dXRpb24oaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKGMgPT0gJzwnKQotCQkJcmV0dXJuICBwcm9jZXNzSFRNTFRhZygpOwotCQllbHNlIGlmIChjID09ICcmJykKLQkJCXJldHVybiBwcm9jZXNzRW50aXR5KCk7Ci0JCWVsc2UgaWYgKGZJc1ByZWZvcm1hdHRlZFRleHQpCi0JCQlyZXR1cm4gcHJvY2Vzc1ByZWZvcm1hdHRlZFRleHQoYyk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgaHRtbDJUZXh0KFN0cmluZyBodG1sKSB7Ci0KLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCi0JCVN0cmluZyB0YWc9IGh0bWw7Ci0JCWlmICgnLycgPT0gdGFnLmNoYXJBdCgwKSkKLQkJCXRhZz0gdGFnLnN1YnN0cmluZygxKTsKLQotCQlpZiAoIWZnVGFncy5jb250YWlucyh0YWcpKQotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQotCi0JCWlmICgicHJlIi5lcXVhbHMoaHRtbCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnRQcmVmb3JtYXR0ZWRUZXh0KCk7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0KLQkJaWYgKCIvcHJlIi5lcXVhbHMoaHRtbCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RvcFByZWZvcm1hdHRlZFRleHQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoZklzUHJlZm9ybWF0dGVkVGV4dCkKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKCJiIi5lcXVhbHMoaHRtbCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnRCb2xkKCk7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0KLQkJaWYgKCJoNSIuZXF1YWxzKGh0bWwpIHx8ICJkdCIuZXF1YWxzKGh0bWwpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc3RhcnRCb2xkKCk7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0KLQkJaWYgKCJkbCIuZXF1YWxzKGh0bWwpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gTElORV9ERUxJTTsKLQotCQlpZiAoImRkIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKCJsaSIuZXF1YWxzKGh0bWwpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gTElORV9ERUxJTSArICJcdCIgKyAiLSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAoIi9iIi5lcXVhbHMoaHRtbCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RvcEJvbGQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoInAiLmVxdWFscyhodG1sKSkgIHsgLy8kTk9OLU5MUy0xJAotCQkJZkluUGFyYWdyYXBoPSB0cnVlOwotCQkJcmV0dXJuIExJTkVfREVMSU07Ci0JCX0KLQotCQlpZiAoImJyIi5lcXVhbHMoaHRtbCkgfHwgImJyLyIuZXF1YWxzKGh0bWwpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCi0JCWlmICgiL3AiLmVxdWFscyhodG1sKSkgIHsgLy8kTk9OLU5MUy0xJAotCQkJYm9vbGVhbiBpblBhcmFncmFwaD0gZkluUGFyYWdyYXBoOwotCQkJZkluUGFyYWdyYXBoPSBmYWxzZTsKLQkJCXJldHVybiBpblBhcmFncmFwaCA/IEVNUFRZX1NUUklORyA6IExJTkVfREVMSU07Ci0JCX0KLQotCQlpZiAoIi9oNSIuZXF1YWxzKGh0bWwpIHx8ICIvZHQiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0b3BCb2xkKCk7Ci0JCQlyZXR1cm4gTElORV9ERUxJTTsKLQkJfQotCi0JCWlmICgiL2RkIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCi0JCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JfQotCi0JLyoKLQkgKiBBICc8JyBoYXMgYmVlbiByZWFkLiBQcm9jZXNzIGEgaHRtbCB0YWcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzSFRNTFRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCWRvIHsKLQotCQkJY2g9IG5leHRDaGFyKCk7Ci0KLQkJCXdoaWxlIChjaCAhPSAtMSAmJiBjaCAhPSAnPicpIHsKLQkJCQlidWYuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpKTsKLQkJCQljaD0gbmV4dENoYXIoKTsKLQkJCQlpZiAoY2ggPT0gJyInKXsKLQkJCQkJYnVmLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGNoKSk7Ci0JCQkJCWNoPSBuZXh0Q2hhcigpOwotCQkJCQl3aGlsZSAoY2ggIT0gLTEgJiYgY2ggIT0gJyInKXsKLQkJCQkJCWJ1Zi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKChjaGFyKSBjaCkpOwotCQkJCQkJY2g9IG5leHRDaGFyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNoID09ICc8Jyl7Ci0JCQkJCXVucmVhZChjaCk7Ci0JCQkJCXJldHVybiAnPCcgKyBidWYudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaCA9PSAtMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaW50IHRhZ0xlbj0gYnVmLmxlbmd0aCgpOwotCQkJLy8gbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNvbW1lbnRzCi0JCQlpZiAoKHRhZ0xlbiA+PSAzICYmICIhLS0iLmVxdWFscyhidWYuc3Vic3RyaW5nKDAsIDMpKSkgLy8kTk9OLU5MUy0xJAotCQkJCSYmICEodGFnTGVuID49IDUgJiYgIi0tIi5lcXVhbHMoYnVmLnN1YnN0cmluZyh0YWdMZW4gLSAyKSkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyB1bmZpbmlzaGVkIGNvbW1lbnQKLQkJCQlidWYuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gd2hpbGUgKHRydWUpOwotCi0JCXJldHVybiBodG1sMlRleHQoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHByb2Nlc3NQcmVmb3JtYXR0ZWRUZXh0KGludCBjKSB7Ci0JCWlmICAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKLQkJCWZDb3VudGVyKys7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHVucmVhZChpbnQgY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCSgoUHVzaGJhY2tSZWFkZXIpIGdldFJlYWRlcigpKS51bnJlYWQoY2gpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZW50aXR5MlRleHQoU3RyaW5nIHN5bWJvbCkgewotCQlpZiAoc3ltYm9sLmxlbmd0aCgpID4gMSAmJiBzeW1ib2wuY2hhckF0KDApID09ICcjJykgewotCQkJaW50IGNoOwotCQkJdHJ5IHsKLQkJCQlpZiAoc3ltYm9sLmNoYXJBdCgxKSA9PSAneCcpIHsKLQkJCQkJY2g9IEludGVnZXIucGFyc2VJbnQoc3ltYm9sLnN1YnN0cmluZygyKSwgMTYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoPSBJbnRlZ2VyLnBhcnNlSW50KHN5bWJvbC5zdWJzdHJpbmcoMSksIDEwKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVNUFRZX1NUUklORyArIChjaGFyKWNoOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgcHJvYmxlbT8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBzdHI9IChTdHJpbmcpIGZnRW50aXR5TG9va3VwLmdldChzeW1ib2wpOwotCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiYiICsgc3ltYm9sOyAvLyBub3QgZm91bmQgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQSAnJicgaGFzIGJlZW4gcmVhZC4gUHJvY2VzcyBhIGVudGl0eQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHByb2Nlc3NFbnRpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaD0gbmV4dENoYXIoKTsKLQkJd2hpbGUgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoKGNoYXIpY2gpIHx8IGNoID09ICcjJykgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQkJY2g9IG5leHRDaGFyKCk7Ci0JCX0KLQotCQlpZiAoY2ggPT0gJzsnKQotCQkJcmV0dXJuIGVudGl0eTJUZXh0KGJ1Zi50b1N0cmluZygpKTsKLQotCQlidWYuaW5zZXJ0KDAsICcmJyk7Ci0JCWlmIChjaCAhPSAtMSkKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL0hUTUxUZXh0UHJlc2VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MVGV4dFByZXNlbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc0MzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL0hUTUxUZXh0UHJlc2VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSFRNTFRleHRQcmVzZW50ZXIKLSAqIE1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlIHRvIHVzZSBvd24gTG9nZ2VyIHRvIGxvZyBleGNlcHRpb24sIGFuZCB0aGUKLSAqIGVsbGlwc2VzIGNvbnN0YW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVGV4dFByZXNlbnRlciBpbXBsZW1lbnRzIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wuSUluZm9ybWF0aW9uUHJlc2VudGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxMSVBTRVMgPSAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0RFTElNID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgaW50IGZDb3VudGVyOwotCXByaXZhdGUgYm9vbGVhbiBmRW5mb3JjZVVwcGVyTGluZUxpbWl0OwotCi0JcHVibGljIEhUTUxUZXh0UHJlc2VudGVyKGJvb2xlYW4gZW5mb3JjZVVwcGVyTGluZUxpbWl0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZFbmZvcmNlVXBwZXJMaW5lTGltaXQgPSBlbmZvcmNlVXBwZXJMaW5lTGltaXQ7Ci0JfQotCi0JcHVibGljIEhUTUxUZXh0UHJlc2VudGVyKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkZXIgY3JlYXRlUmVhZGVyKFN0cmluZyBob3ZlckluZm8sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSFRNTDJUZXh0UmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaG92ZXJJbmZvKSwgcHJlc2VudGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdFRleHRQcmVzZW50YXRpb24oVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIGludCBvZmZzZXQsIGludCBpbnNlcnRMZW5ndGgpIHsKLQotCQlpbnQgeW91cnNTdGFydCA9IG9mZnNldDsKLQkJaW50IHlvdXJzRW5kID0gb2Zmc2V0ICsgaW5zZXJ0TGVuZ3RoIC0gMTsKLQkJeW91cnNFbmQgPSBNYXRoLm1heCh5b3Vyc1N0YXJ0LCB5b3Vyc0VuZCk7Ci0KLQkJSXRlcmF0b3IgZSA9IHByZXNlbnRhdGlvbi5nZXRBbGxTdHlsZVJhbmdlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0KLQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSAoU3R5bGVSYW5nZSkgZS5uZXh0KCk7Ci0KLQkJCWludCBteVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7Ci0JCQlpbnQgbXlFbmQgPSByYW5nZS5zdGFydCArIHJhbmdlLmxlbmd0aCAtIDE7Ci0JCQlteUVuZCA9IE1hdGgubWF4KG15U3RhcnQsIG15RW5kKTsKLQotCQkJaWYgKG15RW5kIDwgeW91cnNTdGFydCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKG15U3RhcnQgPCB5b3Vyc1N0YXJ0KQotCQkJCXJhbmdlLmxlbmd0aCArPSBpbnNlcnRMZW5ndGg7Ci0JCQllbHNlCi0JCQkJcmFuZ2Uuc3RhcnQgKz0gaW5zZXJ0TGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgc3RyaW5nLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCi0JCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQotCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQlhZGFwdFRleHRQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uLCBmQ291bnRlciwgbGVuZ3RoKTsKLQotCQlmQ291bnRlciArPSBsZW5ndGg7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50KFN0cmluZyBsaW5lKSB7Ci0JCWludCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotCi0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBsZW5ndGggJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsaW5lLmNoYXJBdChpKSkpCi0JCQkrK2k7Ci0KLQkJcmV0dXJuIChpID09IGxlbmd0aCA/IGxpbmUgOiBsaW5lLnN1YnN0cmluZygwLCBpKSkgKyAiICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUhvdmVySW5mb3JtYXRpb25QcmVzZW50ZXIjdXBkYXRlUHJlc2VudGF0aW9uKERpc3BsYXkgZGlzcGxheSwKLQkgKiAgICAgIFN0cmluZywgVGV4dFByZXNlbnRhdGlvbiwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyB1cGRhdGVQcmVzZW50YXRpb24oRGlzcGxheSBkaXNwbGF5LCBTdHJpbmcgaG92ZXJJbmZvLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiwgaW50IG1heFdpZHRoLCBpbnQgbWF4SGVpZ2h0KSB7Ci0KLQkJaWYgKGhvdmVySW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJR0MgZ2MgPSBuZXcgR0MoZGlzcGxheSk7Ci0JCXRyeSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgbWF4TnVtYmVyT2ZMaW5lcyA9IE1hdGgucm91bmQobWF4SGVpZ2h0IC8gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7Ci0KLQkJCWZDb3VudGVyID0gMDsKLQkJCUxpbmVCcmVha2luZ1JlYWRlciByZWFkZXIgPSBuZXcgTGluZUJyZWFraW5nUmVhZGVyKGNyZWF0ZVJlYWRlcihob3ZlckluZm8sIHByZXNlbnRhdGlvbiksIGdjLCBtYXhXaWR0aCk7Ci0KLQkJCWJvb2xlYW4gbGFzdExpbmVGb3JtYXR0ZWQgPSBmYWxzZTsKLQkJCVN0cmluZyBsYXN0TGluZUluZGVudCA9IG51bGw7Ci0KLQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQlib29sZWFuIGxpbmVGb3JtYXR0ZWQgPSByZWFkZXIuaXNGb3JtYXR0ZWRMaW5lKCk7Ci0JCQlib29sZWFuIGZpcnN0TGluZVByb2Nlc3NlZCA9IGZhbHNlOwotCi0JCQl3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0KLQkJCQlpZiAoZkVuZm9yY2VVcHBlckxpbmVMaW1pdCAmJiBtYXhOdW1iZXJPZkxpbmVzIDw9IDApCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGZpcnN0TGluZVByb2Nlc3NlZCkgewotCQkJCQlpZiAoIWxhc3RMaW5lRm9ybWF0dGVkKQotCQkJCQkJYXBwZW5kKGJ1ZmZlciwgTElORV9ERUxJTSwgbnVsbCk7Ci0JCQkJCWVsc2UgewotCQkJCQkJYXBwZW5kKGJ1ZmZlciwgTElORV9ERUxJTSwgcHJlc2VudGF0aW9uKTsKLQkJCQkJCWlmIChsYXN0TGluZUluZGVudCAhPSBudWxsKQotCQkJCQkJCWFwcGVuZChidWZmZXIsIGxhc3RMaW5lSW5kZW50LCBwcmVzZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYXBwZW5kKGJ1ZmZlciwgbGluZSwgbnVsbCk7Ci0JCQkJZmlyc3RMaW5lUHJvY2Vzc2VkID0gdHJ1ZTsKLQotCQkJCWxhc3RMaW5lRm9ybWF0dGVkID0gbGluZUZvcm1hdHRlZDsKLQkJCQlpZiAoIWxpbmVGb3JtYXR0ZWQpCi0JCQkJCWxhc3RMaW5lSW5kZW50ID0gbnVsbDsKLQkJCQllbHNlIGlmIChsYXN0TGluZUluZGVudCA9PSBudWxsKQotCQkJCQlsYXN0TGluZUluZGVudCA9IGdldEluZGVudChsaW5lKTsKLQotCQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQlsaW5lRm9ybWF0dGVkID0gcmVhZGVyLmlzRm9ybWF0dGVkTGluZSgpOwotCi0JCQkJbWF4TnVtYmVyT2ZMaW5lcy0tOwotCQkJfQotCi0JCQlpZiAobGluZSAhPSBudWxsICYmIGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCQlhcHBlbmQoYnVmZmVyLCBMSU5FX0RFTElNLCBsaW5lRm9ybWF0dGVkID8gcHJlc2VudGF0aW9uIDogbnVsbCk7Ci0JCQkJYXBwZW5kKGJ1ZmZlciwgRUxMSVBTRVMsIHByZXNlbnRhdGlvbik7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cmltKGJ1ZmZlciwgcHJlc2VudGF0aW9uKTsKLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQotCQl9IGZpbmFsbHkgewotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdHJpbShTdHJpbmdCdWZmZXIgYnVmZmVyLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCi0JCWludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoKCk7Ci0KLQkJaW50IGVuZCA9IGxlbmd0aCAtIDE7Ci0JCXdoaWxlIChlbmQgPj0gMCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGJ1ZmZlci5jaGFyQXQoZW5kKSkpCi0JCQktLWVuZDsKLQotCQlpZiAoZW5kID09IC0xKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVuZCA8IGxlbmd0aCAtIDEpCi0JCQlidWZmZXIuZGVsZXRlKGVuZCArIDEsIGxlbmd0aCk7Ci0JCWVsc2UKLQkJCWVuZCA9IGxlbmd0aDsKLQotCQlpbnQgc3RhcnQgPSAwOwotCQl3aGlsZSAoc3RhcnQgPCBlbmQgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShidWZmZXIuY2hhckF0KHN0YXJ0KSkpCi0JCQkrK3N0YXJ0OwotCi0JCWJ1ZmZlci5kZWxldGUoMCwgc3RhcnQpOwotCQlwcmVzZW50YXRpb24uc2V0UmVzdWx0V2luZG93KG5ldyBSZWdpb24oc3RhcnQsIGJ1ZmZlci5sZW5ndGgoKSkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvTGluZUJyZWFraW5nUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9MaW5lQnJlYWtpbmdSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmN2Y2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9MaW5lQnJlYWtpbmdSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci0KLS8qKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuTGluZUJyZWFraW5nUmVhZGVyLgotICogTW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUgdG8gZml4IHdhcm5pbmdzLgotICovCi0vKgotICogTm90IGEgcmVhbCByZWFkZXIuIENvdWxkIGNoYW5nZSBpZiByZXF1ZXN0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmVCcmVha2luZ1JlYWRlciB7Ci0JcHJpdmF0ZSBHQyBmR0M7Ci0KLQlwcml2YXRlIFN0cmluZyBmTGluZTsKLQotCXByaXZhdGUgQnJlYWtJdGVyYXRvciBmTGluZUJyZWFrSXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgZk1heFdpZHRoOwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkZXIgdGhhdCBicmVha3MgYW4gaW5wdXQgdGV4dCB0byBmaXQgaW4gYSBnaXZlbiB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICBSZWFkZXIgb2YgdGhlIGlucHV0IHRleHQKLQkgKiBAcGFyYW0gZ2MKLQkgKiAgICAgICAgICAgIFRoZSBncmFwaGljIGNvbnRleHQgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50bHkgdXNlZCBmb250Ci0JICogICAgICAgICAgICBzaXplcwotCSAqIEBwYXJhbSBtYXhMaW5lV2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSBtYXggd2lkdGggKHBpeGVzKSB3aGVyZSB0aGUgdGV4dCBoYXMgdG8gZml0IGluCi0JICovCi0JcHVibGljIExpbmVCcmVha2luZ1JlYWRlcihSZWFkZXIgcmVhZGVyLCBHQyBnYywgaW50IG1heExpbmVXaWR0aCkgewotCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0JCWZHQyA9IGdjOwotCQlmTWF4V2lkdGggPSBtYXhMaW5lV2lkdGg7Ci0JCWZPZmZzZXQgPSAwOwotCQlmTGluZSA9IG51bGw7Ci0JCWZMaW5lQnJlYWtJdGVyYXRvciA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZE5leHRCcmVha09mZnNldChpbnQgY3Vyck9mZnNldCkgewotCQlpbnQgY3VycldpZHRoID0gMDsKLQkJaW50IG5leHRPZmZzZXQgPSBmTGluZUJyZWFrSXRlcmF0b3IuZm9sbG93aW5nKGN1cnJPZmZzZXQpOwotCQl3aGlsZSAobmV4dE9mZnNldCAhPSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCVN0cmluZyB3b3JkID0gZkxpbmUuc3Vic3RyaW5nKGN1cnJPZmZzZXQsIG5leHRPZmZzZXQpOwotCQkJaW50IHdvcmRXaWR0aCA9IGZHQy50ZXh0RXh0ZW50KHdvcmQpLng7Ci0JCQlpbnQgbmV4dFdpZHRoID0gd29yZFdpZHRoICsgY3VycldpZHRoOwotCQkJaWYgKG5leHRXaWR0aCA+IGZNYXhXaWR0aCkgewotCQkJCWlmIChjdXJyV2lkdGggPiAwKSB7Ci0JCQkJCXJldHVybiBjdXJyT2Zmc2V0OwotCQkJCX0KLQkJCQlyZXR1cm4gbmV4dE9mZnNldDsKLQkJCX0KLQkJCWN1cnJXaWR0aCA9IG5leHRXaWR0aDsKLQkJCWN1cnJPZmZzZXQgPSBuZXh0T2Zmc2V0OwotCQkJbmV4dE9mZnNldCA9IGZMaW5lQnJlYWtJdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5leHRPZmZzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZFdvcmRCZWdpbihpbnQgaWR4KSB7Ci0JCXdoaWxlIChpZHggPCBmTGluZS5sZW5ndGgoKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZMaW5lLmNoYXJBdChpZHgpKSkgewotCQkJaWR4Kys7Ci0JCX0KLQkJcmV0dXJuIGlkeDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Zvcm1hdHRlZExpbmUoKSB7Ci0JCXJldHVybiBmTGluZSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBuZXh0IGxpbmUuIFRoZSBsZW5ndGhzIG9mIHRoZSBsaW5lIHdpbGwgbm90IGV4Y2VlZCB0aGUgZ2l2ZWQKLQkgKiBtYXhpbXVtIHdpZHRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkxpbmUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGxpbmUgPSBmUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQlpZiAobGluZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlpbnQgbGluZUxlbiA9IGZHQy50ZXh0RXh0ZW50KGxpbmUpLng7Ci0JCQlpZiAobGluZUxlbiA8IGZNYXhXaWR0aCkgewotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCQkJZkxpbmUgPSBsaW5lOwotCQkJZkxpbmVCcmVha0l0ZXJhdG9yLnNldFRleHQobGluZSk7Ci0JCQlmT2Zmc2V0ID0gMDsKLQkJfQotCQlpbnQgYnJlYWtPZmZzZXQgPSBmaW5kTmV4dEJyZWFrT2Zmc2V0KGZPZmZzZXQpOwotCQlTdHJpbmcgcmVzOwotCQlpZiAoYnJlYWtPZmZzZXQgIT0gQnJlYWtJdGVyYXRvci5ET05FKSB7Ci0JCQlyZXMgPSBmTGluZS5zdWJzdHJpbmcoZk9mZnNldCwgYnJlYWtPZmZzZXQpOwotCQkJZk9mZnNldCA9IGZpbmRXb3JkQmVnaW4oYnJlYWtPZmZzZXQpOwotCQkJaWYgKGZPZmZzZXQgPT0gZkxpbmUubGVuZ3RoKCkpIHsKLQkJCQlmTGluZSA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBmTGluZS5zdWJzdHJpbmcoZk9mZnNldCk7Ci0JCQlmTGluZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTdkODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5qYXZhZG9jLlNpbmdsZUNoYXJSZWFkZXIuCi0gKiBNb2RpZmljYXRpb24gd2FzIG1hZGUgdG8gZml4IHN0YXRlbWVudCB1bm5lY2Vzc2FyaWx5IG5lc3RlZCB3aXRoaW4gZWxzZQotICogY2xhdXNlIHdhcm5pbmcgaW4gcmVhZCguLikuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW5nbGVDaGFyUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoY2hhcltdLGludCxpbnQpCi0JICovCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgZW5kID0gb2ZmICsgbGVuOwotCQlmb3IgKGludCBpID0gb2ZmOyBpIDwgZW5kOyBpKyspIHsKLQkJCWludCBjaCA9IHJlYWQoKTsKLQkJCWlmIChjaCA9PSAtMSkgewotCQkJCWlmIChpID09IG9mZikgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiBpIC0gb2ZmOwotCQkJfQotCQkJY2J1ZltpXSA9IChjaGFyKSBjaDsKLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgYXMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaDsKLQkJd2hpbGUgKChjaCA9IHJlYWQoKSkgIT0gLTEpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmQ5YjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1N1YnN0aXR1dGlvblRleHRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5TdWJzdGl0dXRpb25UZXh0UmVhZGVyLgotICogTW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUgdG8gcmVhZCgpIHRvIGFsbG93IHdoaXRlc3BhY2VzIGFuZCBmaXhlZCBzdGF0ZW1lbnQKLSAqIHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlIGNsYXVzZSB3YXJuaW5nIGluIG5leHRDaGFyKCkKLSAqLwotLyoqCi0gKiBSZWFkcyB0aGUgdGV4dCBjb250ZW50cyBmcm9tIGEgcmVhZGVyIGFuZCBjb21wdXRlcyBmb3IgZWFjaCBjaGFyYWN0ZXIgYQotICogcG90ZW50aWFsIHN1YnN0aXR1dGlvbi4gVGhlIHN1YnN0aXR1dGlvbiBtYXkgZWF0IG1vcmUgY2hhcmFjdGVycyB0aGFuIG9ubHkKLSAqIHRoZSBvbmUgcGFzc2VkIGludG8gdGhlIGNvbXB1dGF0aW9uIHJvdXRpbmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJzdGl0dXRpb25UZXh0UmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0RFTElNID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZldhc1doaXRlU3BhY2U7Ci0JcHJpdmF0ZSBpbnQgZkNoYXJBZnRlcldoaXRlU3BhY2U7Ci0KLQkvKioKLQkgKiBUZWxscyB3aGV0aGVyIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIHNraXBwZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZTa2lwV2hpdGVTcGFjZSA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlJlYWRGcm9tQnVmZmVyOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXI7Ci0JcHJpdmF0ZSBpbnQgZkluZGV4OwotCi0KLQlwcm90ZWN0ZWQgU3Vic3RpdHV0aW9uVGV4dFJlYWRlcihSZWFkZXIgcmVhZGVyKSB7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWZCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZJbmRleCA9IDA7Ci0JCWZSZWFkRnJvbUJ1ZmZlciA9IGZhbHNlOwotCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IC0xOwotCQlmV2FzV2hpdGVTcGFjZSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50IHRvIGNvbXB1dGUgdGhlIHN1YnN0aXR1dGlvbiBmb3IgdGhlIGdpdmVuIGNoYXJhY3RlciBhbmQgaWYKLQkgKiBuZWNlc3Nhcnkgc3Vic2VxdWVudCBjaGFyYWN0ZXJzLiBVc2UgPGNvZGU+bmV4dENoYXI8L2NvZGU+IHRvIHJlYWQKLQkgKiBzdWJzZXF1ZW50IGNoYXJhY3RlcnMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBjb21wdXRlU3Vic3RpdHV0aW9uKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCByZWFkZXIuCi0JICovCi0JcHJvdGVjdGVkIFJlYWRlciBnZXRSZWFkZXIoKSB7Ci0JCXJldHVybiBmUmVhZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyLgotCSAqLwotCXByb3RlY3RlZCBpbnQgbmV4dENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZEZyb21CdWZmZXIgPSAoZkJ1ZmZlci5sZW5ndGgoKSA+IDApOwotCQlpZiAoZlJlYWRGcm9tQnVmZmVyKSB7Ci0JCQljaGFyIGNoID0gZkJ1ZmZlci5jaGFyQXQoZkluZGV4KyspOwotCQkJaWYgKGZJbmRleCA+PSBmQnVmZmVyLmxlbmd0aCgpKSB7Ci0JCQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCQkJZkluZGV4ID0gMDsKLQkJCX0KLQkJCXJldHVybiBjaDsKLQkJfQotCQlpbnQgY2ggPSBmQ2hhckFmdGVyV2hpdGVTcGFjZTsKLQkJaWYgKGNoID09IC0xKSB7Ci0JCQljaCA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0JCWlmIChmU2tpcFdoaXRlU3BhY2UgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY2gpKSB7Ci0JCQlkbyB7Ci0JCQkJY2ggPSBmUmVhZGVyLnJlYWQoKTsKLQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKSk7Ci0JCQlpZiAoY2ggIT0gLTEpIHsKLQkJCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IGNoOwotCQkJCXJldHVybiAnICc7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IC0xOwotCQl9Ci0JCXJldHVybiBjaDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYzsKLQkJZG8gewotCi0JCQljID0gbmV4dENoYXIoKTsKLQkJCXdoaWxlICghZlJlYWRGcm9tQnVmZmVyKSB7Ci0JCQkJU3RyaW5nIHMgPSBjb21wdXRlU3Vic3RpdHV0aW9uKGMpOwotCQkJCWlmIChzID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzLmxlbmd0aCgpID4gMCkKLQkJCQkJZkJ1ZmZlci5pbnNlcnQoMCwgcyk7Ci0JCQkJYyA9IG5leHRDaGFyKCk7Ci0JCQl9Ci0KLQkJfSB3aGlsZSAoZlNraXBXaGl0ZVNwYWNlICYmIGZXYXNXaGl0ZVNwYWNlICYmICgoYyA9PSAnICcpICYmICFmUmVhZEZyb21CdWZmZXIpKTsKLQkJLyoKLQkJICogU1NFOiBGb3IgYWJvdmUgYW5kIGJlbG93IGNoZWNrLCBpZiB3aGl0ZXNwYWNlIGlzIHJlYWQgZnJvbSBidWZmZXIsCi0JCSAqIGRvIG5vdCBza2lwCi0JCSAqLwotCQlmV2FzV2hpdGVTcGFjZSA9ICgoYyA9PSAnICcgJiYgIWZSZWFkRnJvbUJ1ZmZlcikgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyk7Ci0JCXJldHVybiBjOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmUmVhZGVyLnJlYWR5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZSZWFkZXIucmVzZXQoKTsKLQkJZldhc1doaXRlU3BhY2UgPSB0cnVlOwotCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IC0xOwotCQlmQnVmZmVyLnNldExlbmd0aCgwKTsKLQkJZkluZGV4ID0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTa2lwV2hpdGVzcGFjZShib29sZWFuIHN0YXRlKSB7Ci0JCWZTa2lwV2hpdGVTcGFjZSA9IHN0YXRlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzU2tpcHBpbmdXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gZlNraXBXaGl0ZVNwYWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0L3V0aWwvU2hhcmVkRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0L3V0aWwvU2hhcmVkRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMTU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdC91dGlsL1NoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIFNoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9DT0xMQVBTRUFMTCA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9DT0xMQVBTRUFMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9ERUxFVEUgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RMQ0xfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NZTkNFRCA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9TWU5DRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfQ09MTEFQU0VBTEwgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfQ09MTEFQU0VBTEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfREVMRVRFID0gRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FTENMX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TWU5DRUQgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfU1lOQ0VEOwotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZnJvbSB0aGUgc291cmNlIGVkaXRvciBwbHVnaW4ncyBpbWFnZQotCSAqIHJlZ2lzdHJ5LiBOb3RlOiBUaGUgcmV0dXJuZWQgPGNvZGU+SW1hZ2U8L2NvZGU+IGlzIG1hbmFnZWQgYnkgdGhlCi0JICogd29ya2JlbmNoOyBjbGllbnRzIG11c3QgPGI+bm90IDwvYj4gZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlOyB0aGVyZSBhcmUgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgICAgICAgICBpbiB0aGlzIGNsYXNzIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlIHNvdXJjZQotCSAqICAgICAgICAgICAgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShzeW1ib2xpY05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3Igc3BlY2lmaWVkIGltYWdlIGZyb20gdGhlIHNvdXJjZQotCSAqIGVkaXRvciBwbHVnaW4ncyBpbWFnZSByZWdpc3RyeS4gVW5saWtlIDxjb2RlPkltYWdlPC9jb2RlPnMsIGltYWdlCi0JICogZGVzY3JpcHRvcnMgdGhlbXNlbHZlcyBkbyBub3QgbmVlZCB0byBiZSBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCi0JICogICAgICAgICAgICB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgaW1hZ2U7IHRoZXJlIGFyZSBjb25zdGFudHMgZGVjbGFyZWQKLQkgKiAgICAgICAgICAgIGluIHRoaXMgaW50ZXJmYWNlIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlCi0JICogICAgICAgICAgICBzb3VyY2UgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKHN5bWJvbGljTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGNhNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JNb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBJTlRFUk5BTCBVU0FHRSBPTkxZCi0gKiAKLSAqIEBhdXRob3IgbnNkCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JNb2RlbFV0aWwgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY3Rvcmllc1RvKGZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgYWRhcHRlclJlZ2lzdHJ5ID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKTsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0KLQkJSXRlcmF0b3IgYWRhcHRlckZhY3RvcnlQcm92aWRlcnMgPSBudWxsOwotCQlpZiAoYWRhcHRlclJlZ2lzdHJ5IGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbikgewotCQkJYWRhcHRlckZhY3RvcnlQcm92aWRlcnMgPSAoKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24pIGFkYXB0ZXJSZWdpc3RyeSkuZ2V0QWRhcHRlckZhY3Rvcmllcyhjb250ZW50VHlwZUlkKTsKLQkJfQotCQllbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzID0gYWRhcHRlclJlZ2lzdHJ5LmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQkJfQotCi0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCBTU0VVSU1lc3NhZ2VzLkVkaXRvck1vZGVsVXRpbF8wKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBBZGQgYWxsIHRob3NlIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgdHlwZSBvZiBjb250ZW50Ci0JCXdoaWxlIChhZGFwdGVyRmFjdG9yeVByb3ZpZGVycy5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgQWRhcHRlckZhY3RvcnlQcm92aWRlciBwcm92aWRlciA9IChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeVByb3ZpZGVycy5uZXh0KCk7Ci0JCQkJLyoKLQkJCQkgKiBDb250ZW50VHlwZSBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkIGFib3ZlLCB0aGlzCi0JCQkJICogY2hlY2sgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgZm9yIHRob3NlIHRoYXQKLQkJCQkgKiBkb24ndCBzcGVjaWZ5IGEgY29udGVudCB0eXBlCi0JCQkJICovCi0JCQkJaWYgKHByb3ZpZGVyLmlzRm9yKHN0cnVjdHVyZWRNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKSkpIHsKLQkJCQkJU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZShTU0VVSU1lc3NhZ2VzLkVkaXRvck1vZGVsVXRpbF8xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlwcm92aWRlci5hZGRBZGFwdGVyRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NjMzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBTU0VVSVBsdWdpbi5JRDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzODg0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTDE2X1NQRUxMQ0hFQ0sgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L3NwZWxsY2hlY2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9ERUxFVEUgPSAiaWNvbnMvZnVsbC9kbGNsMTYvZGVsZXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TWU5DRUQgPSAiaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0wxNl9TUEVMTENIRUNLID0gImljb25zL2Z1bGwvZHRvb2wxNi9zcGVsbGNoZWNrLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9DT0xMQVBTRUFMTCA9ICJpY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfREVMRVRFID0gImljb25zL2Z1bGwvZWxjbDE2L2RlbGV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU1lOQ0VEID0gImljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MMTZfU1BFTExDSEVDSyA9ICJpY29ucy9mdWxsL2V0b29sMTYvc3BlbGxjaGVjay5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9PQ0NfTUFUQ0ggPSAiaWNvbnMvZnVsbC9vYmoxNi9vY2NfbWF0Y2guZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QUkVGRVJFTkNFUyA9ICJpY29ucy9mdWxsL29iajE2L3ByZWZlcmVuY2VzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BST1BfUFMgPSAiaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2EyZGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgU291cmNlIEVkaXRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gU1NFVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBBYnN0cmFjdCBTb3VyY2UgRWRpdG9yIENvbnRleHQgTWVudQotCS8vIENvbnRlbnQgQXNzaXN0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVE1OVV9DT05URU5UQVNTSVNUX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBGb3JtYXQgRG9jdW1lbnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UTU5VX0ZPUk1BVF9ET0NfSEVMUElEID0gUFJFRklYICsgInhtbG0xMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UTU5VX0ZPUk1BVF9FTEVNRU5UU19IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEwNDAiOyAvLyROT04tTkxTLTEkCi0JLy8gQ2xlYW51cCBEb2N1bWVudAotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRNTlVfQ0xFQU5VUF9ET0NfSEVMUElEID0gUFJFRklYICsKLQkvLyAieG1sbTEwNTAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBQcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVE1OVV9QUk9QRVJUSUVTX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTA3MCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3IgUHJlZmVyZW5jZSBQYWdlCi0JLy8gQXBwZWFyYW5jZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTVEVfQVBQRUFSQU5DRV9IRUxQSUQgPSBQUkVGSVggKyAic3RlZDAwMDEiOyAvLyROT04tTkxTLTEkCi0JLy8gSG92ZXJzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNURV9IT1ZFUlNfSEVMUElEID0gUFJFRklYICsgInN0ZWQwMDAzIjsgLy8kTk9OLU5MUy0xJAotCi0vLwkvLyBSZWFkLU9ubHkgVGV4dCBTdHlsZQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRldFQlhfUkVBRE9OTFlfSEVMUElEID0gUFJFRklYICsgIndlYngwMDAxIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gV2ViIGFuZCBYTUwgUHJlZmVyZW5jZSBQYWdlCi0JLy8gVGFzayBUYWdzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRldFQlhfVEFTS1RBR1NfSEVMUElEID0gUFJFRklYICsgIndlYngwMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gU291cmNlIEVkaXRvciBWaWV3Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NPVVJDRV9WSUVXX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMjAwMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmZiY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVsZW1lbnRTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBuaXRpbgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzIElEb2N1bWVudFByb3ZpZGVyLCBJRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiwgSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240IHsKLQlwcml2YXRlIHN0YXRpYyBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyIF9pbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQl7Ci0JCV9pbnN0YW5jZSA9IG5ldyBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNhYm91dFRvQ2hhbmdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0NoYW5nZShPYmplY3QgZWxlbWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNhZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihJRWxlbWVudFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjY2FuU2F2ZURvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU2F2ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkTW9kZWwpIGVsZW1lbnQpLmlzRGlydHkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjY2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjY29ubmVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjZGlzY29ubmVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoT2JqZWN0IGVsZW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjZ2V0QW5ub3RhdGlvbk1vZGVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElBbm5vdGF0aW9uTW9kZWwgZ2V0QW5ub3RhdGlvbk1vZGVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNnZXREb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2dldE1vZGlmaWNhdGlvblN0YW1wKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jZ2V0U3RhdHVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNnZXRTeW5jaHJvbml6YXRpb25TdGFtcChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNpc0RlbGV0ZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNpc01vZGlmaWFibGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI2lzUmVhZE9ubHkoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jaXNTdGF0ZVZhbGlkYXRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVWYWxpZGF0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNtdXN0U2F2ZURvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdFNhdmVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5pc0RpcnR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI3JlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVsZW1lbnRTdGF0ZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKElFbGVtZW50U3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNyZXNldERvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXREb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNzYXZlRG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5zYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI3NldENhblNhdmVEb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhblNhdmVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNzeW5jaHJvbml6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI3VwZGF0ZVN0YXRlQ2FjaGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZUNhY2hlKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI3ZhbGlkYXRlU3RhdGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTdGF0ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IGNvbXB1dGF0aW9uQ29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKCgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vQWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9BY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjE1ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9BY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUFjdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogV2hlbiAnYWN0aW9uJyB0YWcgaXMgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LCBhbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcwotICogY3JlYXRlZC4gSXQgY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIG9iamVjdCBhbmQgY2FwdHVyZXMgaW5mb3JtYXRpb24KLSAqIHRoYXQgaXMgbGF0ZXIgdXNlZCB0byBhZGQgdGhpcyBhY3Rpb24gb2JqZWN0IGludG8gbWVudS90b29sIGJhci4gVGhpcyBjbGFzcwotICogaXMgcmV1c2VkIGZvciBnbG9iYWwgKHdvcmtiZW5jaCkgbWVudS90b29sIGJhciwgcG9wdXAgbWVudSBhY3Rpb25zLCBhcyB3ZWxsCi0gKiBhcyB2aWV3J3MgcHVsbGRvd24gYW5kIGxvY2FsIHRvb2wgYmFyLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGVzY3JpcHRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0FDQ0VMRVJBVE9SID0gImFjY2VsZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfREVGSU5JVElPTl9JRCA9ICJkZWZpbml0aW9uSWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ESVNBQkxFRElDT04gPSAiZGlzYWJsZWRJY29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IRUxQX0NPTlRFWFRfSUQgPSAiaGVscENvbnRleHRJZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSE9WRVJJQ09OID0gImhvdmVySWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTUVOVUJBUl9QQVRIID0gIm1lbnViYXJQYXRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QT1BVUE1FTlVfUEFUSCA9ICJwb3B1cG1lbnVQYXRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TVEFURSA9ICJzdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVE9PTEJBUl9QQVRIID0gInRvb2xiYXJQYXRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UT09MVElQID0gInRvb2x0aXAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZyBlbGVtZW50IGRlZmluaW5nIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgY2FycnlpbmcgdGhlIGNsYXNzCi0JICogQHJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3QgaWYgc3VjY2Vzc2Z1bC4gSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4KLQkgKiAgICAgICAgICBjcmVhdGVpbmcgZXhlY3V0YWJsZSBleHRlbnNpb24sIHRoZSBleGNlcHRpb24gaXMgbG9nZ2VkLCBhbmQKLQkgKiAgICAgICAgICBudWxsIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlKSB7Ci0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGFzc0F0dHJpYnV0ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludAotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhc3NBdHRyaWJ1dGUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyBBTlkgZXhjZXB0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihmaW5hbCBPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gaXRlbTsKLQlwcml2YXRlIFN0cmluZyBtZW51R3JvdXA7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVudVBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgcG9wdXBtZW51R3JvdXA7Ci0JcHJpdmF0ZSBTdHJpbmcgcG9wdXBtZW51UGF0aDsKLQlwcml2YXRlIFN0cmluZyB0b29sYmFyR3JvdXA7Ci0JcHJpdmF0ZSBTdHJpbmcgdG9vbGJhclBhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRlc2NyaXB0b3Igd2l0aCB0aGUgdGFyZ2V0VHlwZQotCSAqLwotCXB1YmxpYyBBY3Rpb25EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBhY3Rpb25FbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gQ2FsY3VsYXRlIG1lbnUgYW5kIHRvb2xiYXIgcGF0aHMuCi0JCVN0cmluZyBtcGF0aCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9NRU5VQkFSX1BBVEgpOwotCQlTdHJpbmcgbWdyb3VwID0gbnVsbDsKLQkJaWYgKG1wYXRoICE9IG51bGwpIHsKLQkJCWludCBsb2MgPSBtcGF0aC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGxvYyAhPSAtMSkgewotCQkJCW1ncm91cCA9IG1wYXRoLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCQltcGF0aCA9IG1wYXRoLnN1YnN0cmluZygwLCBsb2MpOwotCQkJfSBlbHNlIHsKLQkJCQltZ3JvdXAgPSBtcGF0aDsKLQkJCQltcGF0aCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJbWVudVBhdGggPSBtcGF0aDsKLQkJbWVudUdyb3VwID0gbWdyb3VwOwotCi0JCVN0cmluZyBwcGF0aCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QT1BVUE1FTlVfUEFUSCk7Ci0JCVN0cmluZyBwZ3JvdXAgPSBudWxsOwotCQlpZiAocHBhdGggIT0gbnVsbCkgewotCQkJaW50IGxvYyA9IHBwYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAobG9jICE9IC0xKSB7Ci0JCQkJcGdyb3VwID0gcHBhdGguc3Vic3RyaW5nKGxvYyArIDEpOwotCQkJCXBwYXRoID0gcHBhdGguc3Vic3RyaW5nKDAsIGxvYyk7Ci0JCQl9IGVsc2UgewotCQkJCXBncm91cCA9IHBwYXRoOwotCQkJCXBwYXRoID0gbnVsbDsKLQkJCX0KLQkJfQotCQlwb3B1cG1lbnVQYXRoID0gcHBhdGg7Ci0JCXBvcHVwbWVudUdyb3VwID0gcGdyb3VwOwotCi0JCVN0cmluZyB0cGF0aCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UT09MQkFSX1BBVEgpOwotCQlTdHJpbmcgdGdyb3VwID0gbnVsbDsKLQkJaWYgKHRwYXRoICE9IG51bGwpIHsKLQkJCWludCBsb2MgPSB0cGF0aC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGxvYyAhPSAtMSkgewotCQkJCXRncm91cCA9IHRwYXRoLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCQl0cGF0aCA9IHRwYXRoLnN1YnN0cmluZygwLCBsb2MpOwotCQkJfSBlbHNlIHsKLQkJCQl0Z3JvdXAgPSB0cGF0aDsKLQkJCQl0cGF0aCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJdG9vbGJhclBhdGggPSB0cGF0aDsKLQkJdG9vbGJhckdyb3VwID0gdGdyb3VwOwotCi0JCS8vIENyZWF0ZSBhY3Rpb24uCi0JCUlBY3Rpb24gYWN0aW9uID0gY3JlYXRlQWN0aW9uKGFjdGlvbkVsZW1lbnQpOwotCQlpZiAoYWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGxhYmVsID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlhY3Rpb24uc2V0VGV4dChsYWJlbCk7Ci0KLQkJaWQgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWQgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQl9Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJYWN0aW9uLnNldElkKGlkKTsKLQotCQlTdHJpbmcgZGVmSWQgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGSU5JVElPTl9JRCk7Ci0JCWlmIChkZWZJZCAhPSBudWxsICYmIGRlZklkLmxlbmd0aCgpICE9IDApIHsKLQkJCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoZGVmSWQpOwotCQl9Ci0KLQkJU3RyaW5nIHRvb2x0aXAgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVE9PTFRJUCk7Ci0JCWlmICh0b29sdGlwICE9IG51bGwpCi0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0KLQkJU3RyaW5nIGhlbHBDb250ZXh0SWQgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSEVMUF9DT05URVhUX0lEKTsKLQkJaWYgKGhlbHBDb250ZXh0SWQgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZ1bGxJRCA9IGhlbHBDb250ZXh0SWQ7Ci0JCQlpZiAoaGVscENvbnRleHRJZC5pbmRleE9mKCIuIikgPT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3ZSBhdXRvIHF1YWxpZnkgdGhlIGlkIGlmIGl0IGlzCi0JCQkJLy8gbm90IHF1YWxpZmllZCkKLQkJCQlmdWxsSUQgPSBhY3Rpb25FbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpICsgIi4iICsgaGVscENvbnRleHRJZDsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhY3Rpb24sIGZ1bGxJRCk7Ci0JCX0KLQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVTQ1JJUFRJT04pOwotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0KLQkJU3RyaW5nIHN0YXRlID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NUQVRFKTsKLQkJaWYgKHN0YXRlICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRDaGVja2VkKHN0YXRlLmVxdWFscygidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIGljb24gPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUNPTik7Ci0JCWlmIChpY29uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VVdGlsLmdldEltYWdlRGVzY3JpcHRvckZyb21FeHRlbnNpb24oYWN0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKSwgaWNvbikpOwotCQl9Ci0KLQkJU3RyaW5nIGhvdmVySWNvbiA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9IT1ZFUklDT04pOwotCQlpZiAoaG92ZXJJY29uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUV4dGVuc2lvbihhY3Rpb25FbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLCBob3Zlckljb24pKTsKLQkJfQotCi0JCVN0cmluZyBkaXNhYmxlZEljb24gPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRElTQUJMRURJQ09OKTsKLQkJaWYgKGRpc2FibGVkSWNvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VVdGlsLmdldEltYWdlRGVzY3JpcHRvckZyb21FeHRlbnNpb24oYWN0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKSwgZGlzYWJsZWRJY29uKSk7Ci0JCX0KLQotCQlTdHJpbmcgYWNjZWxlcmF0b3IgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQUNDRUxFUkFUT1IpOwotCQlpZiAoYWNjZWxlcmF0b3IgIT0gbnVsbCkKLQkJCXByb2Nlc3NBY2NlbGVyYXRvcihhY3Rpb24sIGFjY2VsZXJhdG9yKTsKLQotCQlpdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIGFjY2VsZXJhdG9yIHRleHQsIGFuZCBjb252ZXJ0cyBpdCB0byBhbiBhY2NlbGVyYXRvcgotCSAqIGtleSBjb2RlLgotCSAqIAotCSAqIEBwYXJhbSBhY2NlbGVyYXRvclRleHQKLQkgKiAgICAgICAgICAgIHRoZSBhY2NlbGVyYXRvciB0ZXh0Ci0JICogQHJlc3VsdCB0aGUgU1dUIGtleSBjb2RlLCBvciAwIGlmIHRoZXJlIGlzIG5vIGFjY2VsZXJhdG9yCi0JICovCi0JcHJpdmF0ZSBpbnQgY29udmVydEFjY2VsZXJhdG9yKFN0cmluZyBhY2NlbGVyYXRvclRleHQpIHsKLQkJaW50IGFjY2VsZXJhdG9yID0gMDsKLQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFjY2VsZXJhdG9yVGV4dCwgIisiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWludCBrZXlDb2RlID0gLTE7Ci0KLQkJYm9vbGVhbiBoYXNNb3JlVG9rZW5zID0gc3Rvay5oYXNNb3JlVG9rZW5zKCk7Ci0JCXdoaWxlIChoYXNNb3JlVG9rZW5zKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJaGFzTW9yZVRva2VucyA9IHN0b2suaGFzTW9yZVRva2VucygpOwotCQkJLy8gRXZlcnkgdG9rZW4gZXhjZXB0IHRoZSBsYXN0IG11c3QgYmUgb25lIG9mIHRoZSBtb2RpZmllcnMKLQkJCS8vIEN0cmwsIFNoaWZ0LCBvciBBbHQuCi0JCQlpZiAoaGFzTW9yZVRva2VucykgewotCQkJCWludCBtb2RpZmllciA9IEFjdGlvbi5maW5kTW9kaWZpZXIodG9rZW4pOwotCQkJCWlmIChtb2RpZmllciAhPSAwKSB7Ci0JCQkJCWFjY2VsZXJhdG9yIHw9IG1vZGlmaWVyOwotCQkJCX0gZWxzZSB7IC8vTGVhdmUgaWYgdGhlcmUgYXJlIG5vbmUKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlrZXlDb2RlID0gQWN0aW9uLmZpbmRLZXlDb2RlKHRva2VuKTsKLQkJCX0KLQkJfQotCQlpZiAoa2V5Q29kZSAhPSAtMSkgewotCQkJYWNjZWxlcmF0b3IgfD0ga2V5Q29kZTsKLQkJfQotCQlyZXR1cm4gYWNjZWxlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQWN0aW9uIGNyZWF0ZUFjdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYWN0aW9uRWxlbWVudCkgewotCQlPYmplY3QgYWN0aW9uID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcoYWN0aW9uRWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJaWYgKGFjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJQWN0aW9uVmFsaWRhdG9yKSB7Ci0JCQlpZiAoISgoSUFjdGlvblZhbGlkYXRvcikgYWN0aW9uKS5pc1ZhbGlkQWN0aW9uKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChhY3Rpb24gaW5zdGFuY2VvZiBJQWN0aW9uID8gKElBY3Rpb24pIEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkubmV3SW5zdGFuY2UoYWN0aW9uKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGlvbiBvYmplY3QgaGVsZCBpbiB0aGlzIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotCQlyZXR1cm4gKGl0ZW0gIT0gbnVsbCA/IGl0ZW0uZ2V0QWN0aW9uKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJQ29udHJpYnV0aW9uSXRlbSBvYmplY3QgaGVsZCBpbiB0aGlzIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIElDb250cmlidXRpb25JdGVtIGdldENvbnRyaWJ1dGlvbkl0ZW0oKSB7Ci0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWN0aW9uJ3MgaWQgYXMgZGVmaW5lZCBpbiB0aGUgcmVnaXN0cnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbmFtZWQgc2xvdCAoZ3JvdXApIGluIHRoZSBtZW51IHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZCBiZQotCSAqIGFkZGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVudUdyb3VwKCkgewotCQlyZXR1cm4gbWVudUdyb3VwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbWVudSBwYXRoIHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBhZGRlZC4gSWYgbnVsbCwgdGhlCi0JICogYWN0aW9uIHdpbGwgbm90IGJlIGFkZGVkIGludG8gdGhlIG1lbnUuCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldE1lbnVQYXRoKCkgewotCQlyZXR1cm4gbWVudVBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBuYW1lZCBzbG90IChncm91cCkgaW4gdGhlIHBvcHVwIG1lbnUgd2hlcmUgdGhpcyBhY3Rpb24gc2hvdWxkCi0JICogYmUgYWRkZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3B1cE1lbnVHcm91cCgpIHsKLQkJcmV0dXJuIHBvcHVwbWVudUdyb3VwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcG9wdXAgbWVudSBwYXRoIHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBhZGRlZC4gSWYgbnVsbCwgdGhlCi0JICogYWN0aW9uIHdpbGwgbm90IGJlIGFkZGVkIGludG8gdGhlIHBvcHVwIG1lbnUuCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcHVwTWVudVBhdGgoKSB7Ci0JCXJldHVybiBwb3B1cG1lbnVQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVkIHNsb3QgKGdyb3VwKSBpbiB0aGUgdG9vbCBiYXIgd2hlcmUgdGhpcyBhY3Rpb24gc2hvdWxkCi0JICogYmUgYWRkZWQuCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xiYXJHcm91cCgpIHsKLQkJcmV0dXJuIHRvb2xiYXJHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHBhdGggaW4gdGhlIHRvb2wgYmFyIHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBhZGRlZC4gSWYKLQkgKiBudWxsLCBhY3Rpb24gd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbGJhclBhdGgoKSB7Ci0JCXJldHVybiB0b29sYmFyUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBhY2NlbGVyYXRvciBkZWZpbml0aW9uLiBJZiBpdCBpcyBhIG51bWJlciB0aGVuIHByb2Nlc3MgdGhlCi0JICogY29kZSBkaXJlY3RseSAtIGlmIG5vdCB0aGVuIHBhcnNlIGl0IGFuZCBjcmVhdGUgdGhlIGNvZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0FjY2VsZXJhdG9yKElBY3Rpb24gYWN0aW9uLCBTdHJpbmcgYWNjZWxlcmF0b3JUZXh0KSB7Ci0KLQkJaWYgKGFjY2VsZXJhdG9yVGV4dC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCS8vSXMgaXQgYSBudW1lcmljIGRlZmluaXRpb24/Ci0JCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChhY2NlbGVyYXRvclRleHQuY2hhckF0KDApKSkgewotCQkJdHJ5IHsKLQkJCQlhY3Rpb24uc2V0QWNjZWxlcmF0b3IoSW50ZWdlci52YWx1ZU9mKGFjY2VsZXJhdG9yVGV4dCkuaW50VmFsdWUoKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIGFjY2VsZXJhdG9yIGRlY2xhcmF0aW9uOiAiICsgaWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZQotCQkJYWN0aW9uLnNldEFjY2VsZXJhdG9yKGNvbnZlcnRBY2NlbGVyYXRvcihhY2NlbGVyYXRvclRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgZGVidWdnaW5nIG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBY3Rpb25EZXNjcmlwdG9yKCIgKyBpZCArICIpIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0JyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTMzZjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludFByb3ZpZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBSZWFkcyBicmVha3BvaW50IGV4dGVuc2lvbiByZWdpc3RvcnkgYW5kIHJldHVybnMgYnJlYWtwb2ludCBwcm92aWRlcgotICogaW5zdGFuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ09OVEVOVF9UWVBFUyA9ICJjb250ZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9FWFRFTlNJT05TID0gImV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlciBpbnN0YW5jZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfQlJFQUtQT0lOVCA9ICJicmVha3BvaW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19CUkVBS1BPSU5UX0NPTlRSSUJVVElPTiA9ICJicmVha3BvaW50Q29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPVklERVIgPSAicHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIENyZWF0ZXMgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uIEBwYXJhbSBlbGVtZW50IHRoZSBjb25maWcgZWxlbWVudAotCSAqIGRlZmluaW5nIHRoZSBleHRlbnNpb24gQHBhcmFtIGNsYXNzQXR0cmlidXRlIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBjYXJyeWluZyB0aGUgY2xhc3MgQHJldHVybiB0aGUgZXh0ZW5zaW9uIG9iamVjdCBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZyBlbGVtZW50IGRlZmluaW5nIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgY2FycnlpbmcgdGhlIGNsYXNzCi0JICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIG9iamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFswXSA9IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyCi0JICogCi0JICogQHJldHVybiBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKE9iamVjdFtdIHJlc3VsdCwgVGhyb3dhYmxlIGUpIHsKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJcmVzdWx0WzBdID0gbnVsbDsKLQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNhY2hlOwotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENvbnRyaWJ1dGlvblRhZzsKLQotCS8qCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGEgYnJlYWtwb2ludCBwcm92aWRlciBvYmplY3QgdG8gZ2l2ZW4gZWxlbWVudCBAcGFyYW0gZWxlbWVudAotCSAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBvYmplY3QgQHJldHVybiBJQnJlYWtwb2ludFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIElCcmVha3BvaW50UHJvdmlkZXIgY3JlYXRlQnJlYWtwb2ludFByb3ZpZGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCU9iamVjdCBvYmogPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSUJyZWFrcG9pbnRQcm92aWRlcikgPyAoSUJyZWFrcG9pbnRQcm92aWRlcikgb2JqIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYnJlYWtwb2ludCBwcm92aWRlcnMgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSB0byB0aGUKLQkgKiB2YWx1ZSBvZiB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGF0dHJpYnV0ZSAiYXR0ck5hbWUiIEByZXR1cm4KLQkgKiBJQnJlYWtwb2ludFByb3ZpZGVyW10KLQkgKi8KLQlwcm90ZWN0ZWQgSUJyZWFrcG9pbnRQcm92aWRlcltdIGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcnMoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcga2V5KSB7Ci0JCWlmIChjYWNoZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyWzBdOwotCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChudW0gPT0gMCkKLQkJCXJldHVybiBuZXcgSUJyZWFrcG9pbnRQcm92aWRlclswXTsKLQotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gYnAgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltudW1dOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCWlmICghVEFHX1BST1ZJREVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWJvb2xlYW4gZG9DcmVhdGUgPSBmYWxzZTsKLQotCQkJU3RyaW5nIGF0dHJWYWx1ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0KLQkJCWlmIChhdHRyVmFsdWVzICE9IG51bGwpIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCWlmICh0eXBlLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKGtleS50cmltKCkpKSB7Ci0JCQkJCQlkb0NyZWF0ZSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGRvQ3JlYXRlKSB7Ci0JCQkJSUJyZWFrcG9pbnRQcm92aWRlciBiID0gY3JlYXRlQnJlYWtwb2ludFByb3ZpZGVyKGVsZW1lbnQpOwotCQkJCWlmIChiICE9IG51bGwpIHsKLQkJCQkJYnBbal0gPSBiOwotCQkJCQlqKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIGJwMiA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyW2pdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGo7IGkrKykgewotCQkJYnAyW2ldID0gYnBbaV07Ci0JCX0KLQotCQlyZXR1cm4gYnAyOwotCX0KLQotCS8qCi0JICogUmV0dXJucyBhIG1hdGNoaW5nIGFycmF5IG9mIGV4dGVuc2lvbiBwb2ludHMgbWF0Y2hpbmcgdGhpcyBrZXkuIERvZXNuJ3QKLQkgKiBjYXVzZSBpbnN0YW50aWF0aW9uIG9mIHByb3ZpZGVycy4gQHJldHVybiBJQnJlYWtwb2ludFByb3ZpZGVyW10KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmluZEVsZW1lbnRzKFN0cmluZyBrZXkpIHsKLQkJaW5pdENhY2hlKCk7Ci0KLQkJaWYgKGNhY2hlID09IG51bGwgfHwgY2FjaGUuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXTsKLQotCQlpbnQgbnVtID0gY2FjaGUuc2l6ZSgpOwotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkpCi0JCQkJY29udGludWU7Ci0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJaWYgKCFUQUdfUFJPVklERVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQotCQkJYm9vbGVhbiBhZGQgPSBmYWxzZTsKLQkJCVN0cmluZyB0eXBlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UX1RZUEVTKTsKLQkJCVN0cmluZyBleHRzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0VYVEVOU0lPTlMpOwotCi0JCQlpZiAodHlwZXMgPT0gbnVsbCAmJiBleHRzID09IG51bGwpIHsKLQkJCQlhZGQgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoIWFkZCAmJiB0eXBlcyAhPSBudWxsICYmIHR5cGVzLmxlbmd0aCgpID4gMCkgewotCQkJCUlDb250ZW50VHlwZSB0ZXN0VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGtleSk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHlwZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgdHlwZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUodHlwZSk7Ci0JCQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsICYmIHRlc3RUeXBlICE9IG51bGwgJiYgY29udGVudFR5cGUuaXNLaW5kT2YodGVzdFR5cGUpKSB7Ci0JCQkJCQlhZGQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghYWRkICYmIGV4dHMgIT0gbnVsbCkgewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4dHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgZXh0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQlpZiAoZXh0LnRyaW0oKS5lcXVhbHMoa2V5LnRyaW0oKSkpIHsKLQkJCQkJCWFkZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGFkZCkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnJlYWtwb2ludCBwcm92aWRlcnMgZm9yIGEgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZQotCSAqIGhhbmRsZXIKLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgYSBjb250ZW50IHR5cGUgaGFuZGxlcgotCSAqIEBwYXJhbSBleHQKLQkgKiAgICAgICAgICAgIGZpbGUgZXh0ZW5zaW9uCi0JICogQHJldHVybiBJQnJlYWtwb2ludFByb3ZpZGVyW10KLQkgKi8KLQlwdWJsaWMgSUJyZWFrcG9pbnRQcm92aWRlcltdIGdldEJyZWFrcG9pbnRQcm92aWRlcnMoSUVkaXRvclBhcnQgZWRpdG9ycGFydCwgU3RyaW5nIGNvbnRlbnRUeXBlSUQsIFN0cmluZyBleHQpIHsKLQkJaW5pdENhY2hlKCk7Ci0KLQkJLy8gR2V0IGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciB0aGlzIGNvbnRlbnQgdHlwZSBoYW5kbGVyCi0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMxID0gbmV3IElCcmVha3BvaW50UHJvdmlkZXJbMF07Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSUQpOwotCQlMaXN0IGhvbGRQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQl3aGlsZSAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IChJQnJlYWtwb2ludFByb3ZpZGVyW10pIG1hcC5nZXQoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQlpZiAocHJvdmlkZXJzID09IG51bGwpIHsKLQkJCQlwcm92aWRlcnMgPSBjcmVhdGVCcmVha3BvaW50UHJvdmlkZXJzKEFUVF9DT05URU5UX1RZUEVTLCBjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCQlpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKLQkJCQkJbWFwLnB1dChjb250ZW50VHlwZS5nZXRJZCgpLCBwcm92aWRlcnMpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHByb3ZpZGVycyB3ZXJlIHJldHJpZXZlZCBmcm9tIGNhY2hlIG9yIG5ld2x5IGNyZWF0ZWQKLQkJCWlmKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJaG9sZFByb3ZpZGVycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm92aWRlcnMpKTsKLQkJCX0KLQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCQlwcm92aWRlcnMxID0gKElCcmVha3BvaW50UHJvdmlkZXJbXSkgaG9sZFByb3ZpZGVycy50b0FycmF5KG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyW2hvbGRQcm92aWRlcnMuc2l6ZSgpXSk7Ci0KLQkJLy8gR2V0IGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciB0aGlzIGV4dGVuc2lvbgotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzMiA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyWzBdOwotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCXByb3ZpZGVyczIgPSAoSUJyZWFrcG9pbnRQcm92aWRlcltdKSBtYXAuZ2V0KGV4dCk7Ci0JCQlpZiAocHJvdmlkZXJzMiA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXJzMiA9IGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcnMoQVRUX0VYVEVOU0lPTlMsIGV4dCk7Ci0JCQkJaWYgKHByb3ZpZGVyczIgIT0gbnVsbCkgewotCQkJCQltYXAucHV0KGV4dCwgcHJvdmlkZXJzMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHNpbmdsZSBoYXNoIHNldCB0byByZW1vdmUgZHVwbGljYXRpb24KLQkJU2V0IHMgPSBuZXcgSGFzaFNldCgpOwotCQlzLmFkZEFsbChBcnJheXMuYXNMaXN0KHByb3ZpZGVyczEpKTsKLQkJcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm92aWRlcnMyKSk7Ci0KLQkJLy8gY3JlYXRlIElCcmVha3BvaW50UHJvdmlkZXJbXSB0byByZXR1cm4KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyW3Muc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRyID0gcy5pdGVyYXRvcigpOwotCQlpbnQgaSA9IDA7Ci0JCUlTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzID0gbnVsbDsKLQkJaWYgKGVkaXRvcnBhcnQgIT0gbnVsbCAmJiBpdHIuaGFzTmV4dCgpKQotCQkJdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGVkaXRvcnBhcnQuZ2V0QWRhcHRlcihJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcyk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlwcm92aWRlcnNbaV0gPSAoSUJyZWFrcG9pbnRQcm92aWRlcikgaXRyLm5leHQoKTsKLQkJCXByb3ZpZGVyc1tpXS5zZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKHRvb2xzKTsKLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29ycmVzcG9uZGluZyByZXNvdXJjZSBmcm9tIGdpdmVuIHBhcmFtZXRlcnMKLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqIEBwYXJhbSBleHQKLQkgKiBAcmV0dXJuIElSZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0LCBTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBleHQpIHsKLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IGdldEJyZWFrcG9pbnRQcm92aWRlcnMobnVsbCwgY29udGVudFR5cGUsIGV4dCk7Ci0JCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVycy5sZW5ndGg7IGkrKykgewotCQkJcmVzID0gcHJvdmlkZXJzW2ldLmdldFJlc291cmNlKGlucHV0KTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDYWNoZSgpIHsKLQkJaWYgKGNhY2hlID09IG51bGwpIHsKLQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVhZENvbnRyaWJ1dGlvbnMoVEFHX0JSRUFLUE9JTlRfQ09OVFJJQlVUSU9OLCBQTF9CUkVBS1BPSU5UKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnJlYWtwb2ludCBwcm92aWRlcnMgZm9yIGEgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZQotCSAqIGhhbmRsZXIKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIGEgY29udGVudCB0eXBlIElEIG9yIG51bGwKLQkgKiBAcGFyYW0gZXh0Ci0JICogICAgICAgICAgICBhIGZpbGVuYW1lIGV4dGVuc2lvbiBvciBudWxsCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgZXh0KSB7Ci0JCWJvb2xlYW4gYXZhaWxhYmxlID0gZmFsc2U7Ci0JCWlmIChleHQgIT0gbnVsbCkKLQkJCWF2YWlsYWJsZSA9IGZpbmRFbGVtZW50cyhleHQpLmxlbmd0aCA+IDA7Ci0JCWlmICghYXZhaWxhYmxlICYmIGNvbnRlbnRUeXBlICE9IG51bGwpCi0JCQlhdmFpbGFibGUgPSBmaW5kRWxlbWVudHMoY29udGVudFR5cGUpLmxlbmd0aCA+IDA7Ci0JCXJldHVybiBhdmFpbGFibGU7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmcgdGFnLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJdGFyZ2V0Q29udHJpYnV0aW9uVGFnID0gdGFnOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlyZWFkUmVnaXN0cnkocmVnaXN0cnksIFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKHRhZy5lcXVhbHModGFyZ2V0Q29udHJpYnV0aW9uVGFnKSkgewotCQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1BST1ZJREVSKSkgewotCQkJY2FjaGUuYWRkKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7IC8vIGp1c3QgY2FjaGUgdGhlIGVsZW1lbnQgLSBkb24ndCBnbyBpbnRvIGl0Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRHJvcEFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0Ryb3BBY3Rpb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWViZjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRHJvcEFjdGlvblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTZWxmVmFsaWRhdGVFZGl0QWN0aW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRHJvcEFjdGlvblByb3h5IGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJQ2xhc3MgY2xhenogPSBvYmouZ2V0Q2xhc3MoKTsKLQkJCXdoaWxlIChjbGF6eiAhPSBudWxsKSB7Ci0JCQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gY2xhenouZ2V0SW50ZXJmYWNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlzZXQuYWRkKGludGVyZmFjZXNbaV0pOwotCQkJCX0KLQkJCQljbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJCUNsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tzZXQuc2l6ZSgpXTsKLQkJCUl0ZXJhdG9yIGl0ciA9IHNldC5pdGVyYXRvcigpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQljbGFzc2VzW2ldID0gKENsYXNzKSBpdHIubmV4dCgpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWluc3RhbmNlID0gUHJveHkubmV3UHJveHlJbnN0YW5jZShvYmouZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLCBjbGFzc2VzLCBuZXcgRHJvcEFjdGlvblByb3h5KG9iaikpOwotCQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJveHlpbmcgYSBkcm9wIGFjdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZSA9IG9iajsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgZWRpdG9yID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZlJlY29yZGVyOwotCXByaXZhdGUgT2JqZWN0IG9iajsKLQotCXByaXZhdGUgRHJvcEFjdGlvblByb3h5KE9iamVjdCBvYmopIHsKLQkJdGhpcy5vYmogPSBvYmo7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlmUmVjb3JkZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJCS8vIFByZXBhcmUgZm9yIFVuZG8KLQkJCWlmIChmUmVjb3JkZXIgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVtID0gZlJlY29yZGVyLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQkJaWYgKHVtICE9IG51bGwpIHsKLQkJCQkJaWYgKHRoaXMub2JqIGluc3RhbmNlb2YgSUFjdGlvbikKLQkJCQkJCXVtLmJlZ2luUmVjb3JkaW5nKHRoaXMsICgoSUFjdGlvbikgdGhpcy5vYmopLmdldFRleHQoKSwgKChJQWN0aW9uKSB0aGlzLm9iaikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXVtLmJlZ2luUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRSZWNvcmRpbmcoKSB7Ci0JCWlmIChmUmVjb3JkZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW0gPSBmUmVjb3JkZXIuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCWlmICh1bSAhPSBudWxsKQotCQkJCXVtLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCWZSZWNvcmRlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCWZSZWNvcmRlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyI2ludm9rZShPYmplY3QsIE1ldGhvZCwKLQkgKiAgICAgIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG0sIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotCQlPYmplY3QgcmVzdWx0OwotCQlTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOwotCQl0cnkgewotCQkJaWYgKG5hbWUuZXF1YWxzKCJlcXVhbHMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gV29ya2Fyb3VuZCBmb3IgSkRLJ3MgYnVnIDQ2NTI4NzYKLQkJCQkvLyAiZXF1YWxzIiBhbHdheXMgcmV0dXJucyBmYWxzZSBldmVuIGlmIGJvdGgKLQkJCQkvLyBJbnZvY2F0aW9uSGFuZGxlcgotCQkJCS8vIGNsYXNzCi0JCQkJLy8gaG9sZCB0aGUgc2FtZSBvYmplY3RzCi0JCQkJLy8gU2VlCi0JCQkJLy8gaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQ2NTI4NzYuaHRtbAotCQkJCS8vIFRoaXMgcHJvYmxlbSBpcyBpbiB0aGUgSUJNIFNESyAxLjMuMQotCQkJCS8vIGJ1dCBJIGRvbid0IHNlZSB0aGUgYnVnIGluIFN1bidzIEpESyAxLjQuMSAoYmV0YSkKLQkJCQlPYmplY3QgYXJnID0gYXJnc1swXTsKLQkJCQlyZXR1cm4gKHByb3h5LmdldENsYXNzKCkgPT0gYXJnLmdldENsYXNzKCkgJiYgZXF1YWxzKFByb3h5LmdldEludm9jYXRpb25IYW5kbGVyKGFyZykpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJydW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFyZ3NbMV0gaW5zdGFuY2VvZiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIHsKLQkJCQkJZWRpdG9yID0gKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgYXJnc1sxXTsKLQkJCQl9Ci0JCQkJYmVnaW5SZWNvcmRpbmcoKTsKLQkJCQlpZiAoKGVkaXRvciAhPSBudWxsKSAmJiAhKG9iaiBpbnN0YW5jZW9mIElTZWxmVmFsaWRhdGVFZGl0QWN0aW9uKSkgewotCQkJCQkKLQkJCQkJLy8gVE9ETzogY2xlYW51cCB2YWxpZGF0ZUVkaXQKLQkJCQkJLy8ganVzdCBsZWF2aW5nIHRoaXMgY2hlY2sgYW5kIGZvbGxvd2luZyBjb2RlIGhlcmUgZm9yIHRyYW5zaXRpb24uIAotCQkJCQkvLyBJIGFzc3VtZSB3ZSdsbCByZW1vdmUgYWxsIG5lZWQgZm9yICd2YWxpZGF0ZUVkaXQnCi0JCQkJCS8vIG9yIG1vdmUgdG8gcGxhdGZvcm0gZWRpdG9yJ3MgdmFsaWRhdGVTdGF0ZSAKLQkJCQkJCi0vLwkJCQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0b3IudmFsaWRhdGVFZGl0KGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLS8vCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IG0uaW52b2tlKG9iaiwgYXJncyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWVuZFJlY29yZGluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjN2JiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZFNpbXBsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb247Ci0KLQotLyoqCi0gKiBCZWdpbnMgYW5kIGVuZHMgVW5kb01hbmFnZXIgcmVjb3JkaW5nIGFyb3VuZCBydW4oKSBhbmQgcnVuV2l0aEV2ZW50KC4uLikKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkgaW1wbGVtZW50cyBJbnZvY2F0aW9uSGFuZGxlciB7Ci0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoT2JqZWN0IG9iaikgewotCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJQ2xhc3MgY2xhenogPSBvYmouZ2V0Q2xhc3MoKTsKLQkJd2hpbGUgKGNsYXp6ICE9IG51bGwpIHsKLQkJCUNsYXNzW10gaW50ZXJmYWNlcyA9IGNsYXp6LmdldEludGVyZmFjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotCQkJCXNldC5hZGQoaW50ZXJmYWNlc1tpXSk7Ci0JCQl9Ci0JCQljbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQkJfQotCQlDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3Nbc2V0LnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ciA9IHNldC5pdGVyYXRvcigpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQljbGFzc2VzW2ldID0gKENsYXNzKSBpdHIubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBQcm94eS5uZXdQcm94eUluc3RhbmNlKG9iai5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIGNsYXNzZXMsIG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5KG9iaikpOwotCX0KLQotCXByaXZhdGUgSUV4dGVuZGVkU2ltcGxlRWRpdG9yIGVkaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZSZWNvcmRlcjsKLQlwcml2YXRlIE9iamVjdCBvYmo7Ci0KLQlwcml2YXRlIEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkoT2JqZWN0IG9iaikgewotCQl0aGlzLm9iaiA9IG9iajsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVnaW5SZWNvcmRpbmcoKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCWZSZWNvcmRlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQkJLy8gUHJlcGFyZSBmb3IgVW5kbwotCQkJaWYgKGZSZWNvcmRlciAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW0gPSBmUmVjb3JkZXIuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCQlpZiAodW0gIT0gbnVsbCkgewotCQkJCQl1bS5iZWdpblJlY29yZGluZyh0aGlzLCAoKElBY3Rpb24pIHRoaXMub2JqKS5nZXRUZXh0KCksICgoSUFjdGlvbikgdGhpcy5vYmopLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRSZWNvcmRpbmcoKSB7Ci0JCWlmIChmUmVjb3JkZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW0gPSBmUmVjb3JkZXIuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCWlmICh1bSAhPSBudWxsKSB7Ci0JCQkJdW0uZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJfQotCQkJZlJlY29yZGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJZlJlY29yZGVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXIjaW52b2tlKE9iamVjdCwgTWV0aG9kLAotCSAqICAgICAgT2JqZWN0W10pCi0JICovCi0JcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbSwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOwotCQl0cnkgewotCQkJaWYgKG5hbWUuZXF1YWxzKCJlcXVhbHMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gV29ya2Fyb3VuZCBmb3IgSkRLJ3MgYnVnIDQ2NTI4NzYKLQkJCQkvLyAiZXF1YWxzIiBhbHdheXMgcmV0dXJucyBmYWxzZSBldmVuIGlmIGJvdGgKLQkJCQkvLyBJbnZvY2F0aW9uSGFuZGxlcgotCQkJCS8vIGNsYXNzCi0JCQkJLy8gaG9sZCB0aGUgc2FtZSBvYmplY3RzCi0JCQkJLy8gU2VlCi0JCQkJLy8gaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQ2NTI4NzYuaHRtbAotCQkJCS8vIFRoaXMgcHJvYmxlbSBpcyBpbiB0aGUgSUJNIFNESyAxLjMuMQotCQkJCS8vIGJ1dCBJIGRvbid0IHNlZSB0aGUgYnVnIGluIFN1bidzIEpESyAxLjQuMSAoYmV0YSkKLQkJCQlPYmplY3QgYXJnID0gYXJnc1swXTsKLQkJCQlyZXR1cm4gKHByb3h5LmdldENsYXNzKCkgPT0gYXJnLmdldENsYXNzKCkgJiYgZXF1YWxzKFByb3h5LmdldEludm9jYXRpb25IYW5kbGVyKGFyZykpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJydW5XaXRoRXZlbnQiKSB8fCBuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWJlZ2luUmVjb3JkaW5nKCk7Ci0JCQkJaWYgKChlZGl0b3IgIT0gbnVsbCkgJiYgISh0aGlzLm9iaiBpbnN0YW5jZW9mIElTZWxmVmFsaWRhdGVFZGl0QWN0aW9uKSkgewotCQkJCQkKLQkJCQkJLy8gVE9ETzogY2xlYW51cCB2YWxpZGF0ZUVkaXQKLQkJCQkJLy8ganVzdCBsZWF2aW5nIHRoaXMgY2hlY2sgYW5kIGZvbGxvd2luZyBjb2RlIGhlcmUgZm9yIHRyYW5zaXRpb24uIAotCQkJCQkvLyBJIGFzc3VtZSB3ZSdsbCByZW1vdmUgYWxsIG5lZWQgZm9yICd2YWxpZGF0ZUVkaXQnCi0JCQkJCS8vIG9yIG1vdmUgdG8gcGxhdGZvcm0gZWRpdG9yJ3MgdmFsaWRhdGVTdGF0ZSAKLQotLy8JCQkJCUlTdGF0dXMgc3RhdHVzID0gZWRpdG9yLnZhbGlkYXRlRWRpdChnZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0vLwkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJzZXRBY3RpdmVFeHRlbmRlZEVkaXRvciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXJnc1swXSBpbnN0YW5jZW9mIElFeHRlbmRlZFNpbXBsZUVkaXRvcikgewotCQkJCQllZGl0b3IgPSAoSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSBhcmdzWzBdOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IG0uaW52b2tlKHRoaXMub2JqLCBhcmdzKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJLy90aHJvdyBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCWlmIChuYW1lLmVxdWFscygicnVuV2l0aEV2ZW50IikgfHwgbmFtZS5lcXVhbHMoInJ1biIpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkvLyBvbmx5IGV4cG9zZSB1c2VyLWRyaXZlbiBleGNlcHRpb25zIGZyb20gInJ1bm5pbmciIHRvIHRoZQotCQkJCS8vIHVzZXIKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoInJ1bldpdGhFdmVudCIpIHx8IG5hbWUuZXF1YWxzKCJydW4iKSkgeyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW5kUmVjb3JkaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU2NWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZFNpbXBsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZyBpbXBsZW1lbnRzIElFeHRlbmRlZEVkaXRvckFjdGlvbiwgSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcsIElBY3Rpb24gewotICAgIHByaXZhdGUgSUFjdGlvbiBwcm94eTsKLSAgICBwcml2YXRlIElBY3Rpb24gZHVtbXkgPSBuZXcgQWN0aW9uKCkgeyAvLyB0aGlzIGlzIGZvciBtYWlubHkgaXRzIHByb3BlcnR5IGNoYW5nZSBub3RpZnkuLi4KLSAgICB9OwotICAgIC8vIHByb3h5J2VkIHByb3BlcnRpZXMKLSAgICBwcml2YXRlIFN0cmluZyBwX2lkOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9pZDsKLSAgICBwcml2YXRlIFN0cmluZyBwX3RleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX3RleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcF90b29sVGlwVGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfdG9vbFRpcFRleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcF9hY3Rpb25EZWZpbml0aW9uSWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2FjdGlvbkRlZmluaXRpb25JZDsKLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBwX2ltYWdlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9pbWFnZTsKLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBwX2hvdmVySW1hZ2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2hvdmVySW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgcF9kaXNhYmxlZEltYWdlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9kaXNhYmxlZEltYWdlOwotICAgIHByaXZhdGUgaW50IHBfYWNjZWxlcmF0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2FjY2VsZXJhdG9yOwotICAgIHByaXZhdGUgaW50IHBfc3R5bGUgPSBBU19QVVNIX0JVVFRPTjsKLSAgICAvL3ByaXZhdGUgYm9vbGVhbiBzZXRfcF9zdHlsZTsKLSAgICBwcml2YXRlIEhlbHBMaXN0ZW5lciBwX2hlbHBMaXN0ZW5lcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfaGVscExpc3RlbmVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBwX2VuYWJsZWQgPSB0cnVlOyAvLyBzaG91bGQgYmUgc2FtZSBhcyB3aGF0IGlzIGRvbmUgaW4KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfZW5hYmxlZDsKLSAgICBwcml2YXRlIExpc3RlbmVyTGlzdCBwX2xpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoMyk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2xpc3RlbmVyczsKLSAgICBwcml2YXRlIGJvb2xlYW4gcF9jaGVja2VkOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9jaGVja2VkOwotICAgIHByaXZhdGUgSUV4dGVuZGVkU2ltcGxlRWRpdG9yIHBfdGFyZ2V0RWRpdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF90YXJnZXRFZGl0b3I7Ci0JcHJpdmF0ZSBib29sZWFuIHBfaXN2aXNpYmxlID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIHRydWUKLQkKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgU3RyaW5nIGNsYXNzQXR0cmlidXRlOwotCi0JIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcF9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgICAgc2V0X3BfbGlzdGVuZXJzID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0QWNjZWxlcmF0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QWNjZWxlcmF0b3IoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRBY2NlbGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2FjY2VsZXJhdG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkRlZmluaXRpb25JZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldEFjdGlvbkRlZmluaXRpb25JZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2FjdGlvbkRlZmluaXRpb25JZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBfaWQgKyAiOiBnZXREZXNjcmlwdGlvbiIpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9kaXNhYmxlZEltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SGVscExpc3RlbmVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVscExpc3RlbmVyIGdldEhlbHBMaXN0ZW5lcigpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldEhlbHBMaXN0ZW5lcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2hlbHBMaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9ob3ZlckltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SWQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRJZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2lkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldEltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2ltYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0TWVudUNyZWF0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBJTWVudUNyZWF0b3IgZ2V0TWVudUNyZWF0b3IoKSB7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocF9pZCArICI6IGdldE1lbnVDcmVhdG9yIik7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRNZW51Q3JlYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0U3R5bGUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRTdHlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX3N0eWxlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0VGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0VGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX3RleHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRUb29sVGlwVGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldFRvb2xUaXBUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfdG9vbFRpcFRleHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0NoZWNrZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmlzQ2hlY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2NoZWNrZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0VuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2VuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwX2xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBkdW1teS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcyBhIGtleSBhY2NlbGVyYXRvciwgZmlyc3QgdXBkYXRlIHRoaXMgYWN0aW9uIGFuZCB0bwotICAgICAgICAgICAgLy8gc2VlIGlmIHRoaXMgYWN0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgotICAgICAgICAgICAgaWYgKChwcm94eS5nZXRBY2NlbGVyYXRvcigpID4gMCkgfHwgKHByb3h5LmdldEFjdGlvbkRlZmluaXRpb25JZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJveHkucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm94eS5ydW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzYW1lIGFzIHJ1bigpCi0gICAgICAgICAgICBpZiAoKHByb3h5LmdldEFjY2VsZXJhdG9yKCkgPiAwKSB8fCAocHJveHkuZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBwcm94eS5ydW5XaXRoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJveHkucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWN0aW9uRGVmaW5pdGlvbklkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBpZCkgewotICAgICAgICBwX2FjdGlvbkRlZmluaXRpb25JZCA9IGlkOwotICAgICAgICBzZXRfcF9hY3Rpb25EZWZpbml0aW9uSWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0QWN0aW9uRGVmaW5pdGlvbklkKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0Q2hlY2tlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7Ci0gICAgICAgIHBfY2hlY2tlZCA9IGNoZWNrZWQ7Ci0gICAgICAgIHNldF9wX2NoZWNrZWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRDaGVja2VkKGNoZWNrZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0Q2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdGV4dCkgewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBfaWQgKyAiOiBzZXREZXNjcmlwdGlvbiIpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldERlc2NyaXB0aW9uKHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0gICAgICAgIHBfZGlzYWJsZWRJbWFnZSA9IG5ld0ltYWdlOwotICAgICAgICBzZXRfcF9kaXNhYmxlZEltYWdlID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IobmV3SW1hZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IobmV3SW1hZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRFbmFibGVkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgcF9lbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgc2V0X3BfZW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRIZWxwTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwX2hlbHBMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICBzZXRfcF9oZWxwTGlzdGVuZXIgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0SGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SG92ZXJJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotICAgICAgICBwX2hvdmVySW1hZ2UgPSBuZXdJbWFnZTsKLSAgICAgICAgc2V0X3BfaG92ZXJJbWFnZSA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SWQoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgcF9pZCA9IGlkOwotICAgICAgICBzZXRfcF9pZCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldElkKGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldElkKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0gICAgICAgIHBfaW1hZ2UgPSBuZXdJbWFnZTsKLSAgICAgICAgc2V0X3BfaW1hZ2UgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRJbWFnZURlc2NyaXB0b3IobmV3SW1hZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0SW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0TWVudUNyZWF0b3Iob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW51Q3JlYXRvcihJTWVudUNyZWF0b3IgY3JlYXRvcikgewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBfaWQgKyAiOiBzZXRNZW51Q3JlYXRvciIpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRNZW51Q3JlYXRvcihjcmVhdG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldE1lbnVDcmVhdG9yKGNyZWF0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBwX3RleHQgPSB0ZXh0OwotICAgICAgICBzZXRfcF90ZXh0ID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldFRleHQodGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldFRvb2xUaXBUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcF90b29sVGlwVGV4dCA9IHRleHQ7Ci0gICAgICAgIHNldF9wX3Rvb2xUaXBUZXh0ID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRUb29sVGlwVGV4dCh0ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWNjZWxlcmF0b3IoaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjY2VsZXJhdG9yKGludCBrZXljb2RlKSB7Ci0gICAgICAgIHBfYWNjZWxlcmF0b3IgPSBrZXljb2RlOwotICAgICAgICBzZXRfcF9hY2NlbGVyYXRvciA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldEFjY2VsZXJhdG9yKGtleWNvZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0QWNjZWxlcmF0b3Ioa2V5Y29kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkRWRpdG9yQWN0aW9uI3NldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKGNvbS5pYm0uc3NlLmVkaXRvci5leHRlbnNpb24uSUV4dGVuZGVkU2ltcGxlRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKElFeHRlbmRlZFNpbXBsZUVkaXRvciB0YXJnZXRFZGl0b3IpIHsKLQkJcF90YXJnZXRFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JCXNldF9wX3RhcmdldEVkaXRvciA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKChwcm94eSAhPSBudWxsKSAmJiAocHJveHkgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pKSB7Ci0gICAgICAgICAgICAoKElFeHRlbmRlZEVkaXRvckFjdGlvbilwcm94eSkuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IodGFyZ2V0RWRpdG9yKTsKLSAgICAgICAgfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLmVkaXRvci5leHRlbnNpb24uSUV4dGVuZGVkRWRpdG9yQWN0aW9uI2lzVmlzaWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmICgocHJveHkgIT0gbnVsbCkgJiYgKHByb3h5IGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuICgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKXByb3h5KS5pc1Zpc2libGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9pc3Zpc2libGU7Ci0JfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0hhbmRsZWQKLSAgICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhbmRsZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBzZWUgQWN0aW9uRGVzY3JpcHRvciNjcmVhdGVFeHRlbnNpb24KLQlwcml2YXRlIHN0YXRpYyBJQWN0aW9uIG5ld0luc3RhbmNlKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbG0sIGZpbmFsIFN0cmluZyBjbGEpIHsKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJLy8gSWYgcGx1Z2luIGhhcyBiZWVuIGxvYWRlZCBjcmVhdGUgZXh0ZW5zaW9uLgotCQkvLyBPdGhlcndpc2UsIHNob3cgYnVzeSBjdXJzb3IgdGhlbiBjcmVhdGUgZXh0ZW5zaW9uLgotCQlCdW5kbGUgYnVuZGxlPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxtLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsICYmIGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0WzBdID0gZWxtLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludAotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBlbG0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGEpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyBBTlkgZXhjZXB0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoKHJlc3VsdFswXSAhPSBudWxsKSAmJiAocmVzdWx0WzBdIGluc3RhbmNlb2YgSUFjdGlvbikpIHsKLQkJCXJldHVybiAoSUFjdGlvbilyZXN1bHRbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihmaW5hbCBPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0JfQotCi0JLyoqCi0gICAgICogSW5zdGFudGlhdGUgYSByZWFsIGNsYXNzIGhlcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFsaXplKCkgewotICAgICAgICBpZiAoKHByb3h5ID09IG51bGwpICYmIChlbGVtZW50ICE9IG51bGwpICYmIChjbGFzc0F0dHJpYnV0ZSAhPSBudWxsKSkgewotICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZShlbGVtZW50LCBjbGFzc0F0dHJpYnV0ZSk7Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotCSAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsOwotCSAgICAgICAgICAgIGNsYXNzQXR0cmlidXRlID0gbnVsbDsKLQkgICAgICAgICAgICAvLyBwcm9wYWdhdGUgcHJveHknZWQgcHJvcGVydGllcwotCSAgICAgICAgICAgIGlmIChzZXRfcF9saXN0ZW5lcnMgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBpZiAocF9saXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gbCA9IHBfbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCSAgICAgICAgICAgICAgICAgICAgaW50IGxzID0gbC5sZW5ndGg7Ci0JICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxzOyBpKyspIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwbCA9IChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbFtpXTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBwcm94eS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdW1teS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBsKTsgLy8gcmVtb3ZlIGxpc3RlbmVyIGZyb20gZHltbXkgc28gdGhhdCB3ZSBkb24ndCBzZW5kIG5vdGlmaWNhdGlvbnMgdHdpY2UgYW55bW9yZQotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9hY2NlbGVyYXRvciA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIHByb3h5LnNldEFjY2VsZXJhdG9yKHBfYWNjZWxlcmF0b3IpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfYWN0aW9uRGVmaW5pdGlvbklkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfYWN0aW9uRGVmaW5pdGlvbklkICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEFjdGlvbkRlZmluaXRpb25JZChwX2FjdGlvbkRlZmluaXRpb25JZCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2NoZWNrZWQgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBwcm94eS5zZXRDaGVja2VkKHBfY2hlY2tlZCk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9kaXNhYmxlZEltYWdlID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfZGlzYWJsZWRJbWFnZSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihwX2Rpc2FibGVkSW1hZ2UpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9lbmFibGVkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgcHJveHkuc2V0RW5hYmxlZChwX2VuYWJsZWQpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfaGVscExpc3RlbmVyID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaGVscExpc3RlbmVyICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEhlbHBMaXN0ZW5lcihwX2hlbHBMaXN0ZW5lcik7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2hvdmVySW1hZ2UgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBpZiAocF9ob3ZlckltYWdlICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHBfaG92ZXJJbWFnZSk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2lkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaWQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0SWQocF9pZCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2ltYWdlID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaW1hZ2UgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0SW1hZ2VEZXNjcmlwdG9yKHBfaW1hZ2UpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF90ZXh0ID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfdGV4dCAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRUZXh0KHBfdGV4dCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX3Rvb2xUaXBUZXh0ID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfdG9vbFRpcFRleHQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0VG9vbFRpcFRleHQocF90b29sVGlwVGV4dCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX3RhcmdldEVkaXRvciA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX3RhcmdldEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJICAgICAgICBpZiAocHJveHkgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkgICAgICAgICAgICAoKElFeHRlbmRlZEVkaXRvckFjdGlvbilwcm94eSkuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IocF90YXJnZXRFZGl0b3IpOwotCQkJCSAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFsaXplZCgpIHsKLSAgICAgICAgcmV0dXJuIChwcm94eSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAoKHByb3h5ICE9IG51bGwpICYmIChwcm94eSBpbnN0YW5jZW9mIElVcGRhdGUpKSB7Ci0gICAgICAgICAgICAoKElVcGRhdGUpIHByb3h5KS51cGRhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIHJlYWwgYWN0aW9uIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIHJldHVybiBwcm94eTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZXNlIGFyZSBBY3Rpb25zJ3MgY29uc3RydWN0b3JzCi0gICAgICovCi0gICAgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgfQotICAgIHB1YmxpYyBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgdGhpcy5jbGFzc0F0dHJpYnV0ZSA9IGNsYXNzQXR0cmlidXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1MmNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZyB7Ci0gICAgcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKCk7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFsaXplZCgpOwotICAgIHB1YmxpYyB2b2lkIHJlYWxpemUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSW1hZ2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0ltYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVjNjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSW1hZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBJbWFnZVV0aWwgewotCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBNZXRob2QuIFJldHVybnMgYW4gSW1hZ2VEZXNjcmlwdG9yIHdob3NlIHBhdGgsIHJlbGF0aXZlIHRvCi0JICogdGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSA8Y29kZT5leHRlbnNpb248L2NvZGU+IGlzCi0JICogPGNvZGU+c3ViZGlyZWN0b3J5QW5kRmlsZW5hbWU8L2NvZGU+LiBJZiB0aGVyZSBpc24ndCBhbnkgdmFsdWUKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgdGhlbiA8Y29kZT5udWxsCi0JICogPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBjb252ZW5pZW5jZSBhbmQgb25seSBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSB3b3JrYmVuY2gKLQkgKiBiZWNhdXNlIGl0IGV4cGxpY2l0bHkgdXNlcyB0aGUgd29ya2JlbmNoJ3MgcmVnaXN0cnkgZm9yCi0JICogY2FjaGluZy9yZXRyaWV2aW5nIGltYWdlcyBmcm9tIG90aGVyIGV4dGVuc2lvbnMgLS0gb3RoZXIgcGx1Z2lucyBtdXN0Ci0JICogdXNlciB0aGVpciBvd24gcmVnaXN0cnkuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIHN1YmplY3QgdG8gcmVtb3ZhbC4KLQkgKiAKLQkgKiBOb3RlOiBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSBtdXN0IG5vdCBoYXZlIGFueSBsZWFkaW5nICIuIiBvciBwYXRoCi0JICogc2VwYXJhdG9ycyAvIG9yIFwgSVNWJ3Mgc2hvdWxkIHVzZSBpY29ucy9teXNhbXBsZS5naWYgYW5kIG5vdAotCSAqIC4vaWNvbnMvbXlzYW1wbGUuZ2lmCi0JICogCi0JICogTm90ZTogVGhpcyBjb25zdWx0cyB0aGUgcGx1Z2luIGZvciBleHRlbnNpb24gYW5kIG9idGFpbnMgaXRzCi0JICogaW5zdGFsbGF0aW9uIGxvY2F0aW9uLiBhbGwgcmVxdWVzdGVkIGltYWdlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiBhCi0JICogZGlyZWN0b3J5IGJlbG93IGFuZCByZWxhdGl2ZSB0byB0aGF0IHBsdWdpbnMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3JGcm9tRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uLCBTdHJpbmcgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJcmV0dXJuIGdldEltYWdlRGVzY3JpcHRvckZyb21CdW5kbGUoYnVuZGxlLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgTWV0aG9kLiBSZXR1cm4gYW4gSW1hZ2VEZXNjcmlwdG9yIHdob3NlIHBhdGggcmVsYXRpdmUgdG8KLQkgKiB0aGUgcGx1Z2luIGRlc2NyaWJlZCBieSA8Y29kZT5idW5kbGU8L2NvZGU+IGlzCi0JICogPGNvZGU+c3ViZGlyZWN0b3J5QW5kRmlsZW5hbWU8L2NvZGU+LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gaW1hZ2UgY291bGQgYmUgZm91bmQuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgY29udmVuaWVuY2UgYW5kIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgd29ya2JlbmNoCi0JICogYmVjYXVzZSBpdCBleHBsaWNpdGx5IHVzZXMgdGhlIHdvcmtiZW5jaCdzIHJlZ2lzdHJ5IGZvcgotCSAqIGNhY2hpbmcvcmV0cmlldmluZyBpbWFnZXMgZnJvbSBvdGhlciBleHRlbnNpb25zIC0tIG90aGVyIHBsdWdpbnMgbXVzdAotCSAqIHVzZXIgdGhlaXIgb3duIHJlZ2lzdHJ5LiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBzdWJqZWN0IHRvIHJlbW92YWwuCi0JICogCi0JICogTm90ZTogc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUgbXVzdCBub3QgaGF2ZSBhbnkgbGVhZGluZyAiLiIgb3IgcGF0aAotCSAqIHNlcGFyYXRvcnMgLyBvciBcIElTVidzIHNob3VsZCB1c2UgaWNvbnMvbXlzYW1wbGUuZ2lmIGFuZCBub3QKLQkgKiAuL2ljb25zL215c2FtcGxlLmdpZgotCSAqIAotCSAqIE5vdGU6IFRoaXMgY29uc3VsdHMgdGhlIHBsdWdpbiBmb3IgZXh0ZW5zaW9uIGFuZCBvYnRhaW5zIGl0cwotCSAqIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4gYWxsIHJlcXVlc3RlZCBpbWFnZXMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gYQotCSAqIGRpcmVjdG9yeSBiZWxvdyBhbmQgcmVsYXRpdmUgdG8gdGhhdCBwbHVnaW5zIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlLCBTdHJpbmcgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpIHsKLQotCQlVUkwgcGF0aCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCVVSTCBmdWxsUGF0aFN0cmluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmdWxsUGF0aFN0cmluZyA9IG5ldyBVUkwocGF0aCwgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGZ1bGxQYXRoU3RyaW5nKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1JlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDQ0Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuU29ydGVyOwotCi0KLS8qKgotICogVGVtcGxhdGUgaW1wbGVtZW50YXRpb24gb2YgYSByZWdpc3RyeSByZWFkZXIgdGhhdCBjcmVhdGVzIG9iamVjdHMKLSAqIHJlcHJlc2VudGluZyByZWdpc3RyeSBjb250ZW50cy4gVHlwaWNhbGx5LCBhbiBleHRlbnNpb24gY29udGFpbnMgb25lCi0gKiBlbGVtZW50LCBidXQgdGhpcyByZWFkZXIgaGFuZGxlcyBtdWx0aXBsZSBlbGVtZW50cyBwZXIgZXh0ZW5zaW9uLgotICogCi0gKiBUbyBzdGFydCByZWFkaW5nIHRoZSBleHRlbnNpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciBhbiBleHRlbnNpb24gcG9pbnQsCi0gKiBjYWxsIHRoZSBtZXRob2QgPGNvZGU+cmVhZFJlZ2lzdHJ5PC9jb2RlPi4KLSAqIAotICogVG8gcmVhZCBjaGlsZHJlbiBvZiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQsIGNhbGwgdGhlIG1ldGhvZAotICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4gZnJvbSB5b3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPiwgYXMgaXQgd2lsbCBub3QgYmUgZG9uZSBieSBkZWZhdWx0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnaXN0cnlSZWFkZXIgewotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFJlZ2lzdHJ5UmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIGRlc2NyaXB0aW9uIGFzIGEgc3ViZWxlbWVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIHN0cmluZyBpZiBkZWZpbmVkLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbihUQUdfREVTQ1JJUFRJT04pOwotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlblswXS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSB3b3JrYmVuY2ggbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgYSByZWdpc3RyeSBlcnJvciB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgdW5rbm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dVbmtub3duRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlsb2dFcnJvcihlbGVtZW50LCAiVW5rbm93biBleHRlbnNpb24gdGFnIGZvdW5kOiAiICsgZWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXBwbHkgYSByZXByb2R1Y2FibGUgb3JkZXIgdG8gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBwcm92aWRlZCwgc3VjaAotCSAqIHRoYXQgdGhlIG9yZGVyIHdpbGwgbm90IGNoYW5nZSBhcyBleHRlbnNpb25zIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBJRXh0ZW5zaW9uW10gb3JkZXJFeHRlbnNpb25zKElFeHRlbnNpb25bXSBleHRlbnNpb25zKSB7Ci0JCS8vIEJ5IGRlZmF1bHQsIHRoZSBvcmRlciBpcyBiYXNlZCBvbiBwbHVnaW4gaWQgc29ydGVkCi0JCS8vIGluIGFzY2VuZGluZyBvcmRlci4gVGhlIG9yZGVyIGZvciBhIHBsdWdpbiBwcm92aWRpbmcKLQkJLy8gbW9yZSB0aGFuIG9uZSBleHRlbnNpb24gZm9yIGFuIGV4dGVuc2lvbiBwb2ludCBpcwotCQkvLyBkZXBlbmRlbnQgaW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGUgWE1MIGZpbGUuCi0JCVNvcnRlciBzb3J0ZXIgPSBuZXcgU29ydGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZXh0ZW5zaW9uMSwgT2JqZWN0IGV4dGVuc2lvbjIpIHsKLQkJCQlTdHJpbmcgczEgPSAoKElFeHRlbnNpb24pIGV4dGVuc2lvbjEpLmdldE5hbWVzcGFjZSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIHMyID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24yKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vUmV0dXJuIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lCi0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSkgPiAwOwotCQkJfQotCQl9OwotCi0JCU9iamVjdFtdIHNvcnRlZCA9IHNvcnRlci5zb3J0KGV4dGVuc2lvbnMpOwotCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bc29ydGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc29ydGVkLCAwLCBzb3J0ZWRFeHRlbnNpb24sIDAsIHNvcnRlZC5sZW5ndGgpOwotCQlyZXR1cm4gc29ydGVkRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZWFkIGVsZW1lbnQncyBhdHRyaWJ1dGVzLiBJZiBjaGlsZHJlbiBzaG91bGQKLQkgKiBhbHNvIGJlIHJlYWQsIHRoZW4gaW1wbGVtZW50b3IgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKLQkgKiA8Y29kZT5yZWFkRWxlbWVudENoaWxkcmVuPC9jb2RlPi4gSW1wbGVtZW50b3IgaXMgYWxzbyByZXNwb25zaWJsZQotCSAqIGZvciBsb2dnaW5nIG1pc3NpbmcgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCB3YXMgcmVjb2duaXplZCwgZmFsc2UgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIFJlYWQgdGhlIGVsZW1lbnQncyBjaGlsZHJlbi4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHN1YmNsYXNzJwotCSAqIHJlYWRFbGVtZW50IG1ldGhvZCB3aGVuIGl0IHdhbnRzIHRvIHJlYWQgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmVhZEVsZW1lbnRzKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBlYWNoIGVsZW1lbnQgb25lIGF0IGEgdGltZSBieSBjYWxsaW5nIHRoZSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbgotCSAqIG9mIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBMb2dzIGFuIGVycm9yIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgcmVjb2duaXplZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFyZWFkRWxlbWVudChlbGVtZW50c1tpXSkpCi0JCQkJbG9nVW5rbm93bkVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZCBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCXJlYWRFbGVtZW50cyhleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU3RhcnQgdGhlIHJlZ2lzdHJ5IHJlYWRpbmcgcHJvY2VzcyB1c2luZyB0aGUgc3VwcGxpZWQgcGx1Z2luIElEIGFuZAotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTdhZDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kgZXh0ZW5kcyBDb250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kgewotCi0JLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZGb3JtYXRQcm9jZXNzb3I7Ci0JLyoqIFBhcnRpdGlvbnMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZlBhcnRpdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGZvcm1hdFByb2Nlc3NvcgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvcikgewotCQlzdXBlcigpOwotCi0JCWZGb3JtYXRQcm9jZXNzb3IgPSBmb3JtYXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdCgpIHsKLQkJc3VwZXIuZm9ybWF0KCk7Ci0KLQkJZmluYWwgSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgZkRvY3VtZW50cy5yZW1vdmVGaXJzdCgpOwotCQlmaW5hbCBUeXBlZFBvc2l0aW9uIHBhcnRpdGlvbiA9IChUeXBlZFBvc2l0aW9uKSBmUGFydGl0aW9ucy5yZW1vdmVGaXJzdCgpOwotCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHBhcnRpdGlvbiAhPSBudWxsICYmIGZSZWdpb24gIT0gbnVsbCAmJiBmRm9ybWF0UHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZkZvcm1hdFByb2Nlc3Nvci5mb3JtYXREb2N1bWVudChkb2N1bWVudCwgZlJlZ2lvbi5nZXRPZmZzZXQoKSwgZlJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0KLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQkJZlJlZ2lvbiA9IChJUmVnaW9uKSBjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1JFR0lPTik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7Ci0KLQkJZlBhcnRpdGlvbnMuY2xlYXIoKTsKLQkJZkRvY3VtZW50cy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4NWZhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0hpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua1ByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLS8qKgotICogVGhlIGlzIGFsbW9zdCBhbiBleGFjdCBjb3B5IG9mIERlZmF1bHRIeXBlcmxpbmtQcmVzZW50ZXIuIEhvd2V2ZXIgdGhpcwotICogaHlwZXJsaW5rIHByZXNlbnRlciB3b3JrcyB3aXRoIHRoZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvcidzIEhpZ2hsaWdodGVyCi0gKiBpbnN0ZWFkIG9mIFRleHRQcmVzZW50YXRpb24uCi0gKiAKLSAqIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgPGNvZGU+dGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7PC9jb2RlPgotICogaXMgY2FsbGVkIGluc3RlYWQgb2YgcGFzc2luZyBmYWxzZSBmb3IgY2xlYXJCYWNrZ3JvdW5kLiBBbHNvIGFsbCBtZW50aW9uIG9mCi0gKiBUZXh0UHJlc2VudGF0aW9uIHdhcyByZW1vdmVkIHNpbmNlIGl0IGRvZXMgbm90IHJlYWxseSBhcHBseS4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5EZWZhdWx0SHlwZXJsaW5rUHJlc2VudGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBIaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlciBpbXBsZW1lbnRzIElIeXBlcmxpbmtQcmVzZW50ZXIsIFBhaW50TGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciwgSURvY3VtZW50TGlzdGVuZXIsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjb2xvciB1c2VkIGZvciBoeXBlcmxpbmtzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQSBSR0IgY29sb3IgdmFsdWUgZW5jb2RlZCBhcyBhCi0JICogc3RyaW5nIHVzaW5nIGNsYXNzIDxjb2RlPlByZWZlcmVuY2VDb252ZXJ0ZXI8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIWVBFUkxJTktfQ09MT1IgPSAiaHlwZXJsaW5rQ29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKiBUaGUgdGV4dCB2aWV3ZXIuICovCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVGV4dFZpZXdlcjsKLQkvKiogVGhlIGhhbmQgY3Vyc29yLiAqLwotCXByaXZhdGUgQ3Vyc29yIGZDdXJzb3I7Ci0JLyoqIFRoZSBsaW5rIGNvbG9yLiAqLwotCXByaXZhdGUgQ29sb3IgZkNvbG9yOwotCS8qKiBUZWxscyB3aGV0aGVyIHRvIGRpc3Bvc2UgdGhlIGNvbG9yIG9uIHVuaW5zdGFsbC4gKi8KLQlwcml2YXRlIGJvb2xlYW4gZkRpc3Bvc2VDb2xvcjsKLQkvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgcmVnaW9uLiAqLwotCXByaXZhdGUgSVJlZ2lvbiBmQWN0aXZlUmVnaW9uOwotCS8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBzdHlsZSByYW5nZSBhcyBwb3NpdGlvbi4gKi8KLQlwcml2YXRlIFBvc2l0aW9uIGZSZW1lbWJlcmVkUG9zaXRpb247Ci0JLyoqIFRoZSBvcHRpb25hbCBwcmVmZXJlbmNlIHN0b3JlICovCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmU7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZGVmYXVsdCBoeXBlcmxpbmsgcHJlc2VudGVyIHdoaWNoIHVzZXMKLQkgKiB7QGxpbmsgI0hZUEVSTElOS19DT0xPUn10byByZWFkIHRoZSBjb2xvciBmcm9tIHRoZSBnaXZlbiBwcmVmZXJlbmNlCi0JICogc3RvcmUuCi0JICogCi0JICogQHBhcmFtIHN0b3JlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXB1YmxpYyBIaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlcihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCWZQcmVmZXJlbmNlU3RvcmUgPSBzdG9yZTsKLQkJZkRpc3Bvc2VDb2xvciA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBkZWZhdWx0IGh5cGVybGluayBwcmVzZW50ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICB0aGUgaHlwZXJsaW5rIGNvbG9yLCB0byBiZSBkaXNwb3NlZCBieSB0aGUgY2FsbGVyCi0JICovCi0JcHVibGljIEhpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyKENvbG9yIGNvbG9yKSB7Ci0JCWZEaXNwb3NlQ29sb3IgPSBmYWxzZTsKLQkJZkNvbG9yID0gY29sb3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNob3dIeXBlcmxpbmtzKElIeXBlcmxpbmtbXSBoeXBlcmxpbmtzKSB7Ci0JCUFzc2VydC5pc0xlZ2FsKGh5cGVybGlua3MgIT0gbnVsbCAmJiBoeXBlcmxpbmtzLmxlbmd0aCA9PSAxKTsKLQkJaGlnaGxpZ2h0UmVnaW9uKGh5cGVybGlua3NbMF0uZ2V0SHlwZXJsaW5rUmVnaW9uKCkpOwotCQlhY3RpdmF0ZUN1cnNvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGhpZGVIeXBlcmxpbmtzKCkgewotCQlyZXBhaXJSZXByZXNlbnRhdGlvbigpOwotCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0ZXh0Vmlld2VyKTsKLQkJZlRleHRWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCQlmVGV4dFZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0JCQlpZiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKQotCQkJCWZDb2xvciA9IGNyZWF0ZUNvbG9yKGZQcmVmZXJlbmNlU3RvcmUsIEhZUEVSTElOS19DT0xPUiwgdGV4dC5nZXREaXNwbGF5KCkpOwotCQl9Ci0KLQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkKLQkJCWZQcmVmZXJlbmNlU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWZUZXh0Vmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCi0JCWlmIChmQ29sb3IgIT0gbnVsbCkgewotCQkJaWYgKGZEaXNwb3NlQ29sb3IpCi0JCQkJZkNvbG9yLmRpc3Bvc2UoKTsKLQkJCWZDb2xvciA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZkN1cnNvciAhPSBudWxsKSB7Ci0JCQlmQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCWZDdXJzb3IgPSBudWxsOwotCQl9Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXRleHQucmVtb3ZlUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQotCQlmVGV4dFZpZXdlciA9IG51bGw7Ci0KLQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkKLQkJCWZQcmVmZXJlbmNlU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xvciBjb2xvcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZUZXh0Vmlld2VyKTsKLQkJZkNvbG9yID0gY29sb3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhpZ2hsaWdodFJlZ2lvbihJUmVnaW9uIHJlZ2lvbikgewotCi0JCWlmIChyZWdpb24uZXF1YWxzKGZBY3RpdmVSZWdpb24pKQotCQkJcmV0dXJuOwotCi0JCXJlcGFpclJlcHJlc2VudGF0aW9uKCk7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0KLQkJLy8gVW5kZXJsaW5lCi0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKGZUZXh0Vmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgZlRleHRWaWV3ZXI7Ci0JCQlJUmVnaW9uIHdpZGdldFJhbmdlID0gZXh0ZW5zaW9uLm1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UocmVnaW9uKTsKLQkJCWlmICh3aWRnZXRSYW5nZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJb2Zmc2V0ID0gd2lkZ2V0UmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSB3aWRnZXRSYW5nZS5nZXRMZW5ndGgoKTsKLQotCQl9Ci0JCWVsc2UgewotCQkJb2Zmc2V0ID0gcmVnaW9uLmdldE9mZnNldCgpIC0gZlRleHRWaWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJLy8gbmVlZHMgdG8gY2xlYW4gYmFja2dyb3VuZCBkdWUgdG8gU3RydWN0dXJlZFRleHRFZGl0b3IncyBoaWdobGlnaHRlcgotCQl0ZXh0LnJlZHJhd1JhbmdlKG9mZnNldCwgbGVuZ3RoLCB0cnVlKTsKLQotCQkvLyBJbnZhbGlkYXRlIHJlZ2lvbiA9PT4gYXBwbHkgdGV4dCBwcmVzZW50YXRpb24KLQkJZkFjdGl2ZVJlZ2lvbiA9IHJlZ2lvbjsKLQotCQlpZiAoZlRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjIpCi0JCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgZlRleHRWaWV3ZXIpLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJZWxzZQotCQkJZlRleHRWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWN0aXZhdGVDdXJzb3IoKSB7Ci0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gdGV4dC5nZXREaXNwbGF5KCk7Ci0JCWlmIChmQ3Vyc29yID09IG51bGwpCi0JCQlmQ3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0hBTkQpOwotCQl0ZXh0LnNldEN1cnNvcihmQ3Vyc29yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXRDdXJzb3IoKSB7Ci0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0LnNldEN1cnNvcihudWxsKTsKLQotCQlpZiAoZkN1cnNvciAhPSBudWxsKSB7Ci0JCQlmQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCWZDdXJzb3IgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGFpclJlcHJlc2VudGF0aW9uKCkgewotCi0JCWlmIChmQWN0aXZlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IGZBY3RpdmVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBmQWN0aXZlUmVnaW9uLmdldExlbmd0aCgpOwotCQlmQWN0aXZlUmVnaW9uID0gbnVsbDsKLQotCQlyZXNldEN1cnNvcigpOwotCi0JCS8vIEludmFsaWRhdGUgPT0+IHJlbW92ZSBhcHBsaWVkIHRleHQgcHJlc2VudGF0aW9uCi0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikKLQkJCSgoSVRleHRWaWV3ZXJFeHRlbnNpb24yKSBmVGV4dFZpZXdlcikuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24ob2Zmc2V0LCBsZW5ndGgpOwotCQllbHNlCi0JCQlmVGV4dFZpZXdlci5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCi0JCS8vIFJlbW92ZSB1bmRlcmxpbmUKLQkJaWYgKGZUZXh0Vmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgZlRleHRWaWV3ZXI7Ci0JCQlvZmZzZXQgPSBleHRlbnNpb24ubW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KG9mZnNldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvZmZzZXQgLT0gZlRleHRWaWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0KLQkJCS8vIG5lZWRzIHRvIGNsZWFuIGJhY2tncm91bmQgZHVlIHRvIFN0cnVjdHVyZWRUZXh0RWRpdG9yJ3MKLQkJCS8vIGhpZ2hsaWdodGVyCi0JCQl0ZXh0LnJlZHJhd1JhbmdlKG9mZnNldCwgbGVuZ3RoLCB0cnVlKTsKLQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgewotCQkJLy8gaWdub3JlIC0gZG8gbm90IGxvZwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFBhaW50TGlzdGVuZXIjcGFpbnRDb250cm9sKFBhaW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZBY3RpdmVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCi0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCi0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgZlRleHRWaWV3ZXI7Ci0JCQlJUmVnaW9uIHdpZGdldFJhbmdlID0gZXh0ZW5zaW9uLm1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UoZkFjdGl2ZVJlZ2lvbik7Ci0JCQlpZiAod2lkZ2V0UmFuZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IHdpZGdldFJhbmdlLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gd2lkZ2V0UmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJfQotCQllbHNlIHsKLQotCQkJSVJlZ2lvbiByZWdpb24gPSBmVGV4dFZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCk7Ci0JCQlpZiAoIWluY2x1ZGVzKHJlZ2lvbiwgZkFjdGl2ZVJlZ2lvbikpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSBmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpIC0gcmVnaW9uLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8vIHN1cHBvcnQgZm9yIEJJREkKLQkJUG9pbnQgbWluTG9jYXRpb24gPSBnZXRNaW5pbXVtTG9jYXRpb24odGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotCQlQb2ludCBtYXhMb2NhdGlvbiA9IGdldE1heGltdW1Mb2NhdGlvbih0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0KLQkJaW50IHgxID0gbWluTG9jYXRpb24ueDsKLQkJaW50IHgyID0gbWF4TG9jYXRpb24ueCAtIDE7Ci0JCWludCB5ID0gbWluTG9jYXRpb24ueSArIHRleHQuZ2V0TGluZUhlaWdodCgpIC0gMTsKLQotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlpZiAoZkNvbG9yICE9IG51bGwgJiYgIWZDb2xvci5pc0Rpc3Bvc2VkKCkpCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKGZDb2xvcik7Ci0JCWVsc2UgaWYgKGZDb2xvciA9PSBudWxsICYmICEob2Zmc2V0IDwgMCAmJiBvZmZzZXQgPj0gdGV4dC5nZXRDaGFyQ291bnQoKSkpIHsKLQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChvZmZzZXQpOwotCQkJaWYgKHN0eWxlICE9IG51bGwpCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChzdHlsZS5mb3JlZ3JvdW5kKTsKLQkJfQotCQlnYy5kcmF3TGluZSh4MSwgeSwgeDIsIHkpOwotCX0KLQotCXByaXZhdGUgUG9pbnQgZ2V0TWluaW11bUxvY2F0aW9uKFN0eWxlZFRleHQgdGV4dCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpbnQgbWF4ID0gdGV4dC5nZXRDaGFyQ291bnQoKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRleHQuZ2V0Qm91bmRzKCk7Ci0JCVBvaW50IG1pbkxvY2F0aW9uID0gbmV3IFBvaW50KGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgayA9IG9mZnNldCArIGk7Ci0JCQlpZiAoayA8IDAgfHwgayA+IG1heCkKLQkJCQlicmVhazsKLQotCQkJUG9pbnQgbG9jYXRpb24gPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoayk7Ci0JCQlpZiAobG9jYXRpb24ueCA8IG1pbkxvY2F0aW9uLngpCi0JCQkJbWluTG9jYXRpb24ueCA9IGxvY2F0aW9uLng7Ci0JCQlpZiAobG9jYXRpb24ueSA8IG1pbkxvY2F0aW9uLnkpCi0JCQkJbWluTG9jYXRpb24ueSA9IGxvY2F0aW9uLnk7Ci0JCX0KLQotCQlyZXR1cm4gbWluTG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBnZXRNYXhpbXVtTG9jYXRpb24oU3R5bGVkVGV4dCB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVBvaW50IG1heExvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgayA9IG9mZnNldCArIGk7Ci0JCQlpZiAoayA8IDAgfHwgayA+IHRleHQuZ2V0Q2hhckNvdW50KCkpCi0JCQkJYnJlYWs7Ci0KLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KGspOwotCQkJaWYgKGxvY2F0aW9uLnggPiBtYXhMb2NhdGlvbi54KQotCQkJCW1heExvY2F0aW9uLnggPSBsb2NhdGlvbi54OwotCQkJaWYgKGxvY2F0aW9uLnkgPiBtYXhMb2NhdGlvbi55KQotCQkJCW1heExvY2F0aW9uLnkgPSBsb2NhdGlvbi55OwotCQl9Ci0KLQkJcmV0dXJuIG1heExvY2F0aW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlcyhJUmVnaW9uIHJlZ2lvbiwgSVJlZ2lvbiBwb3NpdGlvbikgewotCQlyZXR1cm4gcG9zaXRpb24uZ2V0T2Zmc2V0KCkgPj0gcmVnaW9uLmdldE9mZnNldCgpICYmIHBvc2l0aW9uLmdldE9mZnNldCgpICsgcG9zaXRpb24uZ2V0TGVuZ3RoKCkgPD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZBY3RpdmVSZWdpb24gIT0gbnVsbCkgewotCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpLCBmQWN0aXZlUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCXRyeSB7Ci0JCQkJZXZlbnQuZ2V0RG9jdW1lbnQoKS5hZGRQb3NpdGlvbihmUmVtZW1iZXJlZFBvc2l0aW9uKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmUmVtZW1iZXJlZFBvc2l0aW9uICE9IG51bGwpIHsKLQkJCWlmICghZlJlbWVtYmVyZWRQb3NpdGlvbi5pc0RlbGV0ZWQoKSkgewotCi0JCQkJZXZlbnQuZ2V0RG9jdW1lbnQoKS5yZW1vdmVQb3NpdGlvbihmUmVtZW1iZXJlZFBvc2l0aW9uKTsKLQkJCQlmQWN0aXZlUmVnaW9uID0gbmV3IFJlZ2lvbihmUmVtZW1iZXJlZFBvc2l0aW9uLmdldE9mZnNldCgpLCBmUmVtZW1iZXJlZFBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQotCQkJCVN0eWxlZFRleHQgd2lkZ2V0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCWlmICh3aWRnZXQgIT0gbnVsbCAmJiAhd2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJCQl3aWRnZXQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaGlkZUh5cGVybGlua3MoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQWN0aXZlUmVnaW9uID0gbnVsbDsKLQkJCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQkJCQloaWRlSHlwZXJsaW5rcygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyI2lucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWhpZGVIeXBlcmxpbmtzKCk7Ci0JCW9sZElucHV0LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyI2lucHV0RG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW5ld0lucHV0LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbG9yIGZyb20gdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBzdG9yZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUga2V5Ci0JICogQHBhcmFtIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIHRoZSBkaXNwbGF5Ci0JICogQHJldHVybiB0aGUgY29sb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaAotCSAqICAgICAgICAgaW5mb3JtYXRpb24gYXZhaWxhYmxlCi0JICovCi0JcHJpdmF0ZSBDb2xvciBjcmVhdGVDb2xvcihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcga2V5LCBEaXNwbGF5IGRpc3BsYXkpIHsKLQotCQlSR0IgcmdiID0gbnVsbDsKLQotCQlpZiAoc3RvcmUuY29udGFpbnMoa2V5KSkgewotCi0JCQlpZiAoc3RvcmUuaXNEZWZhdWx0KGtleSkpCi0JCQkJcmdiID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXREZWZhdWx0Q29sb3Ioc3RvcmUsIGtleSk7Ci0JCQllbHNlCi0JCQkJcmdiID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwga2V5KTsKLQotCQkJaWYgKHJnYiAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghSFlQRVJMSU5LX0NPTE9SLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkKLQkJCXJldHVybjsKLQotCQlpZiAoZkRpc3Bvc2VDb2xvciAmJiBmQ29sb3IgIT0gbnVsbCAmJiAhZkNvbG9yLmlzRGlzcG9zZWQoKSkKLQkJCWZDb2xvci5kaXNwb3NlKCk7Ci0JCWZDb2xvciA9IG51bGw7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0V2lkZ2V0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkKLQkJCWZDb2xvciA9IGNyZWF0ZUNvbG9yKGZQcmVmZXJlbmNlU3RvcmUsIEhZUEVSTElOS19DT0xPUiwgdGV4dFdpZGdldC5nZXREaXNwbGF5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvT3Blbkh5cGVybGlua0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2h5cGVybGluay9PcGVuSHlwZXJsaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTQ1MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2h5cGVybGluay9PcGVuSHlwZXJsaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci0KLS8qKgotICogT3BlbiBoeXBlcmxpbmsgYWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuSHlwZXJsaW5rQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0JcHJpdmF0ZSBJSHlwZXJsaW5rRGV0ZWN0b3JbXSBmSHlwZXJsaW5rRGV0ZWN0b3JzOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlRleHRWaWV3ZXI7Ci0KLQlwdWJsaWMgT3Blbkh5cGVybGlua0FjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvciwgSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKGJ1bmRsZSwgcHJlZml4LCBlZGl0b3IpOwotCQlmVGV4dFZpZXdlciA9IHZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtEZXRlY3RvcnMoSUh5cGVybGlua0RldGVjdG9yW10gZGV0ZWN0b3JzKSB7Ci0JCWZIeXBlcmxpbmtEZXRlY3RvcnMgPSBkZXRlY3RvcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZkh5cGVybGlua0RldGVjdG9ycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJSVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkIChmSHlwZXJsaW5rRGV0ZWN0b3JzKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZkh5cGVybGlua0RldGVjdG9ycy5sZW5ndGg7IGkgPCBsZW5ndGggJiYgaHlwZXJsaW5rID09IG51bGw7IGkrKykgewotCQkJCUlIeXBlcmxpbmtEZXRlY3RvciBkZXRlY3RvciA9IGZIeXBlcmxpbmtEZXRlY3RvcnNbaV07Ci0JCQkJaWYgKGRldGVjdG9yID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSUh5cGVybGlua1tdIGh5cGVybGlua3MgPSBkZXRlY3Rvci5kZXRlY3RIeXBlcmxpbmtzKGZUZXh0Vmlld2VyLCByZWdpb24sIGZhbHNlKTsKLQkJCQlpZiAoaHlwZXJsaW5rcyA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChoeXBlcmxpbmtzLmxlbmd0aCA+IDApCi0JCQkJCWh5cGVybGluayA9IGh5cGVybGlua3NbMF07Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGluayAhPSBudWxsKSB7Ci0JCQkvKioKLQkJCSAqIEZvcmNlIHRoZSBoaWdobGlnaHQgcmFuZ2UgdG8gY2hhbmdlIHdoZW4gdGhlIGh5cGVybGluayBpcwotCQkJICogb3BlbmVkIGJ5IGFsdGVyaW5nIHRoZSBoaWdobGlnaHRlZCByYW5nZSBiZWZvcmVoYW5kLgotCQkJICovCi0JCQlnZXRUZXh0RWRpdG9yKCkuc2V0SGlnaGxpZ2h0UmFuZ2UoTWF0aC5tYXgoMCwgcmVnaW9uLmdldE9mZnNldCgpIC0gMSksIDAsIGZhbHNlKTsKLQkJCWh5cGVybGluay5vcGVuKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0Fic3RyYWN0T3Blbk9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0Fic3RyYWN0T3Blbk9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiY2YyMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9BYnN0cmFjdE9wZW5Pbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotCi0vKioKLSAqIFRoaXMgYWN0aW9uIGNsYXNzIHJldHJpZXZlcyB0aGUgbGluay9maWxlIHNlbGVjdGVkIGJ5IHRoZSBjdXJzb3IgYW5kCi0gKiBhdHRlbXB0cyB0byBvcGVuIHRoZSBsaW5rL2ZpbGUgaW4gdGhlIGRlZmF1bHQgZWRpdG9yIG9yIHdlYiBicm93c2VyCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBiYXNlIHN1cHBvcnQgZm9yIGh5cGVybGluayBuYXZpZ2F0aW9uCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdE9wZW5PbiBpbXBsZW1lbnRzIElPcGVuT24gewotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ0FOTk9UX09QRU4gPSBTU0VVSU1lc3NhZ2VzLkFic3RyYWN0T3Blbk9uXzA7IC8vJE5PTi1OTFMtMSQKLQkvLyBkb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIG9wZW4KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6LyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiaHR0cDovLyI7Ly8kTk9OLU5MUy0xJAotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElSZWdpb24gZG9HZXRPcGVuT25SZWdpb24oaW50IG9mZnNldCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb09wZW5PbihJUmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCBvcGVuIG9uCi0JICogCi0JICogQHJldHVybiBJRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgdGhlIGVkaXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4gZWRpdG9yIGlkIG9mIHRoZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlIG5hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFZGl0b3JJZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJRWRpdG9yUmVnaXN0cnkgZWRpdG9yUmVnaXN0cnkgPSB3b3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGVkaXRvclJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZW5hbWUpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJcmV0dXJuIGRlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJcmV0dXJuIEVkaXRvcnNVSS5ERUZBVUxUX1RFWFRfRURJVE9SX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kCi0JICogZmlsZSBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyB1c2UgdGhlIGJhc2UgbG9jYXRpb24gdG8gb2J0YWluIHRoZSBpbi13b3Jrc3BhY2UgSUZpbGUKLQkJCQlJRmlsZSBtb2RlbEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJCQlpZiAobW9kZWxGaWxlICE9IG51bGwpIHsKLQkJCQkJLy8gZmluZCB0aGUgcmVmZXJlbmNlZCBmaWxlJ3MgbG9jYXRpb24gb24gZGlzawotCQkJCQlTdHJpbmcgZmlsZXN5c3RlbUxvY2F0aW9uID0gbW9kZWwuZ2V0UmVzb2x2ZXIoKS5nZXRMb2NhdGlvbkJ5VVJJKGZpbGVTdHJpbmcpOwotCQkJCQlpZiAoZmlsZXN5c3RlbUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCUlGaWxlW10gd29ya3NwYWNlRmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVzeXN0ZW1Mb2NhdGlvbikpOwotCQkJCQkJLy8gZmF2b3IgYSB3b3Jrc3BhY2UgZmlsZSBpbiB0aGUgc2FtZSBwcm9qZWN0Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZUZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCQkJCWlmICh3b3Jrc3BhY2VGaWxlc1tpXS5nZXRQcm9qZWN0KCkuZXF1YWxzKG1vZGVsRmlsZS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQkJCWZpbGUgPSB3b3Jrc3BhY2VGaWxlc1tpXTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpZiBub25lIHdlcmUgaW4gdGhlIHNhbWUgcHJvamVjdCwganVzdCBwaWNrIG9uZQotCQkJCQkJaWYgKGZpbGUgPT0gbnVsbCAmJiB3b3Jrc3BhY2VGaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZmlsZSA9IHdvcmtzcGFjZUZpbGVzWzBdOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZSA9PSBudWxsICYmIGZpbGVTdHJpbmcuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JT3Blbk9uI2dldE9wZW5PblJlZ2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRPcGVuT25SZWdpb24oSURvY3VtZW50IGRvYywgaW50IG9mZnNldCkgewotCQlJUmVnaW9uIHJlZ2lvbjsKLQkJLy8gc2V0IHRoZSBkb2N1bWVudCBmb3IgdGhpcyBhY3Rpb24KLQkJc2V0RG9jdW1lbnQoZG9jKTsKLQkJcmVnaW9uID0gZG9HZXRPcGVuT25SZWdpb24ob2Zmc2V0KTsKLQkJLy8gcmVzZXQgdGhlIGRvY3VtZW50IGJhY2sgdG8gbnVsbCBmb3IgdGhpcyBhY3Rpb24KLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogVHJ5IHRvIG9wZW4gdGhlIGV4dGVybmFsIGZpbGUsIGZpbGVTdHJpbmcgaW4gaXRzIGRlZmF1bHQgZWRpdG9yCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiBAcmV0dXJuIElFZGl0b3JQYXJ0IGVkaXRvciBvcGVuZWQgb3IgbnVsbCBpZiBlZGl0b3IgY291bGQgbm90IGJlIG9wZW5lZAotCSAqLwotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBvcGVuRXh0ZXJuYWxGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCS8vIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gd29ya3NwYWNlIHNvIHRyeSB0byBvcGVuIHVzaW5nIHN5c3RlbSBlZGl0b3IKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVN0cmluZyk7Ci0JCS8vIHRyeSB0byBvcGVuIGV4aXN0aW5nIGV4dGVybmFsIGZpbGUgaWYgaXQgZXhpc3RzCi0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoZmlsZSk7Ci0JCQlTdHJpbmcgZWRpdG9ySWQgPSBnZXRFZGl0b3JJZChmaWxlU3RyaW5nKTsKLQotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9ySWQsIHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdXNlciB0aGF0IG9wZW4gb24gc2VsZWN0aW9uIGFjdGlvbiBjb3VsZCBub3Qgc3VjY2Vzc2Z1bGx5IG9wZW4KLQkgKiB0aGUgc2VsZWN0aW9uICh3cml0ZXMgbWVzc2FnZSBvbiBzdGF0dXMgYmFyIGFuZCBiZWVwcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRmlsZUZhaWxlZCgpIHsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKENBTk5PVF9PUEVOKTsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBJRmlsZSwgaW5wdXQgaW4gaXRzIGRlZmF1bHQgZWRpdG9yLCBpZiBwb3NzaWJsZSwgYW5kIHJldHVybnMKLQkgKiB0aGUgZWRpdG9yIG9wZW5lZC4gUG9zc2libGUgcmVhc29ucyBmb3IgZmFpbHVyZTogaW5wdXQgY2Fubm90IGJlIGZvdW5kLAotCSAqIGlucHV0IGRvZXMgbm90IGV4aXN0IGluIHdvcmtiZW5jaCwgZWRpdG9yIGNhbm5vdCBiZSBvcGVuZWQuCi0JICogCi0JICogQHJldHVybiBJRWRpdG9yUGFydCBlZGl0b3Igb3BlbmVkIG9yIG51bGwgaWYgaW5wdXQgPT0gbnVsbCBvciBkb2VzIG5vdAotCSAqICAgICAgICAgZXhpc3QsIGV4dGVybmFsIGVkaXRvciB3YXMgb3BlbmVkLCBlZGl0b3IgY291bGQgbm90IGJlIG9wZW5lZAotCSAqLwotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBvcGVuRmlsZUluRWRpdG9yKElGaWxlIGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0LmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlyZXR1cm4gSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gb24KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBhcHByb3ByaWF0ZSBlZGl0b3IgZm9yIGZpbGVTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5GaWxlSW5FZGl0b3IoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gbnVsbDsKLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJLy8gb3BlbiB3ZWIgYnJvd3NlciBpZiB0aGlzIGlzIGEgd2ViIGFkZHJlc3MKLQkJCVN0cmluZyB0ZW1wID0gZmlsZVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRlbXAuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkgewotCQkJCVByb2dyYW0ubGF1bmNoKGZpbGVTdHJpbmcpOyAvLyBsYXVuY2hlcyB3ZWIgYnJvd3Nlci9leGVjdXRhYmxlCi0JCQkJLy8gYXNzb2NpYXRlZCB3aXRoIHVyaQotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIGNob3Agb2ZmIHRoZSBmaWxlIHByb3RvY29sCi0JCQlpZiAodGVtcC5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpKSB7Ci0JCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpOwotCQkJfQotCi0JCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UgYW5kIHJldHVybiBhbiBJRmlsZSBpZgotCQkJLy8gZm91bmQKLQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKGZpbGVTdHJpbmcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCS8vIGZpbGUgZXhpc3RzIGluIHdvcmtzcGFjZQotCQkJCWVkaXRvciA9IG9wZW5GaWxlSW5FZGl0b3IoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBmaWxlIGRvZXMgbm90IGV4aXN0IGluIHdvcmtzcGFjZQotCQkJCWVkaXRvciA9IG9wZW5FeHRlcm5hbEZpbGUoZmlsZVN0cmluZyk7Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gZWRpdG9yIHdhcyBvcGVuZWQKLQkJaWYgKGVkaXRvciA9PSBudWxsKSB7Ci0JCQlvcGVuRmlsZUZhaWxlZCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklPcGVuT24jb3Blbk9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5PbihJRG9jdW1lbnQgZG9jLCBJUmVnaW9uIHJlZ2lvbikgewotCQkvLyBzZXQgdGhlIGRvY3VtZW50IGZvciB0aGlzIGFjdGlvbgotCQlzZXREb2N1bWVudChkb2MpOwotCQkvLyBpZiBubyByZWdpb24gd2FzIGdpdmVuIHRoaXMgYWN0aW9uIGZhaWxzCi0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCW9wZW5GaWxlRmFpbGVkKCk7Ci0JCWVsc2UKLQkJCWRvT3Blbk9uKHJlZ2lvbik7Ci0JCS8vIHJlc2V0IHRoZSBkb2N1bWVudCBiYWNrIHRvIG51bGwgZm9yIHRoaXMgYWN0aW9uCi0JCXNldERvY3VtZW50KG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgY3VycmVudCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggb3BlbiBvbgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWI2NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogRWRpdG9ySW5wdXQgZm9yIGV4dGVybmFsIGZpbGVzLiBDb3BpZWQgZnJvbQotICogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9ycy50ZXh0LkphdmFGaWxlRWRpdG9ySW5wdXQKLSAqIAotICogQGRlcHJlY2F0ZWQgVXNlIGJhc2Ugc3VwcG9ydCBmb3IgaHlwZXJsaW5rIG5hdmlnYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZGaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBuZXcgUGF0aChpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9JT3Blbk9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0lPcGVuT24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0YjI5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0lPcGVuT24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBPcGVuIE9uLi4uIG5hdmlnYXRpb24KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVuT24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIGVudGlyZSByZWdpb24gcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgb2Zmc2V0IHdoZXJlIGFuCi0JICogb3BlbmFibGUgc291cmNlIHJlZ2lvbiBpcyBmb3VuZC4gbnVsbCBpZiBvZmZzZXQgZG9lcyBub3QgY29udGFpbiBhbgotCSAqIG9wZW5hYmxlIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIElEb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEByZXR1cm4gSVJlZ2lvbiBlbnRpcmUgcmVnaW9uIG9mIG9wZW5hYmxlIHNvdXJjZQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldE9wZW5PblJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogT3BlbnMgdGhlIGZpbGUvc291cmNlIHJlbGV2YW50IHRvIHJlZ2lvbiBpZiBwb3NzaWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBJVGV4dFZpZXdlcgotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIFJlZ2lvbiB0byBleGFtaW5lCi0JICovCi0JcHVibGljIHZvaWQgb3Blbk9uKElEb2N1bWVudCBkb2N1bWVudCwgSVJlZ2lvbiByZWdpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuRmlsZUh5cGVybGlua1RyYWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3BlbkZpbGVIeXBlcmxpbmtUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTg2NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuRmlsZUh5cGVybGlua1RyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLkh5cGVybGlua01hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIE9wZW5GaWxlSHlwZXJsaW5rVHJhY2tlciBpbXBsZW1lbnRzIEtleUxpc3RlbmVyLCBNb3VzZUxpc3RlbmVyLCBNb3VzZU1vdmVMaXN0ZW5lciwgRm9jdXNMaXN0ZW5lciwgUGFpbnRMaXN0ZW5lciwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIElEb2N1bWVudExpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIgewotCi0JLyoqIFRoZSBzZXNzaW9uIGlzIGFjdGl2ZS4gKi8KLQlwcml2YXRlIGJvb2xlYW4gZkFjdGl2ZTsKLQotCS8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBzdHlsZSByYW5nZS4gKi8KLQlwcml2YXRlIElSZWdpb24gZkFjdGl2ZVJlZ2lvbjsKLQkvKiogUHJlZmVyZW5jZSBrZXkgZm9yIGJyb3dzZXItbGlrZSBsaW5rcyB0byBiZSBlbmFibGVkICovCi0JcHJpdmF0ZSBTdHJpbmcgZkJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleTsKLQotCS8qKiBUaGUgbGluayBjb2xvci4gKi8KLQlwcml2YXRlIENvbG9yIGZDb2xvcjsKLQkvKiogVGhlIGhhbmQgY3Vyc29yLiAqLwotCXByaXZhdGUgQ3Vyc29yIGZDdXJzb3I7Ci0JLyoqIFRoZSBrZXkgbW9kaWZpZXIgbWFzay4gKi8KLQlwcml2YXRlIGludCBmS2V5TW9kaWZpZXJNYXNrOwotCS8qKiBQcmVmZXJlbmNlIGtleSBmb3IgaHlwZXJsaW5rIHVuZGVybGluZSBjb2xvciAqLwotCXByaXZhdGUgU3RyaW5nIGZMaW5rQ29sb3JLZXk7Ci0JLyoqIFRoZSBwcmVmZXJlbmNlIHN0b3JlICovCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmU7Ci0JLyoqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHN0eWxlIHJhbmdlIGFzIHBvc2l0aW9uLiAqLwotCXByaXZhdGUgUG9zaXRpb24gZlJlbWVtYmVyZWRQb3NpdGlvbjsKLQotCS8qKiBUaGUgdGV4dCB2aWV3ZXIgdGhpcyBoeXBlcmxpbmsgdHJhY2tlciBpcyBhc3NvY2lhdGVkIHdpdGggKi8KLQlwcml2YXRlIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBPcGVuRmlsZUh5cGVybGlua1RyYWNrZXIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlmVGV4dFZpZXdlciA9IHRleHRWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlQ3Vyc29yKElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlEaXNwbGF5IGRpc3BsYXkgPSB0ZXh0LmdldERpc3BsYXkoKTsKLQkJaWYgKGZDdXJzb3IgPT0gbnVsbCkKLQkJCWZDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSEFORCk7Ci0JCXRleHQuc2V0Q3Vyc29yKGZDdXJzb3IpOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVTdGF0ZU1hc2soU3RyaW5nIG1vZGlmaWVycykgewotCQlpZiAobW9kaWZpZXJzID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKG1vZGlmaWVycy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIFNXVC5OT05FOwotCi0JCWludCBzdGF0ZU1hc2sgPSAwOwotCQlTdHJpbmdUb2tlbml6ZXIgbW9kaWZpZXJUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1vZGlmaWVycywgIiw7LjorLSogIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKG1vZGlmaWVyVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJaW50IG1vZGlmaWVyID0gRWRpdG9yVXRpbGl0eS5maW5kTG9jYWxpemVkTW9kaWZpZXIobW9kaWZpZXJUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJaWYgKG1vZGlmaWVyID09IDAgfHwgKHN0YXRlTWFzayAmIG1vZGlmaWVyKSA9PSBtb2RpZmllcikKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzdGF0ZU1hc2sgPSBzdGF0ZU1hc2sgfCBtb2RpZmllcjsKLQkJfQotCQlyZXR1cm4gc3RhdGVNYXNrOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb2xvciBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGluZm9ybWF0aW9uCi0JICogYXZhaWxhYmxlLgotCSAqLwotCXByaXZhdGUgQ29sb3IgY3JlYXRlQ29sb3IoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIGtleSwgRGlzcGxheSBkaXNwbGF5KSB7Ci0KLQkJUkdCIHJnYiA9IG51bGw7Ci0KLQkJaWYgKHN0b3JlLmNvbnRhaW5zKGtleSkpIHsKLQotCQkJaWYgKHN0b3JlLmlzRGVmYXVsdChrZXkpKQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0RGVmYXVsdENvbG9yKHN0b3JlLCBrZXkpOwotCQkJZWxzZQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIGtleSk7Ci0JCX0KLQotCQlyZXR1cm4gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihyZ2IpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCWRlYWN0aXZhdGUoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoYm9vbGVhbiByZWRyYXdBbGwpIHsKLQkJaWYgKCFmQWN0aXZlKQotCQkJcmV0dXJuOwotCi0JCXJlcGFpclJlcHJlc2VudGF0aW9uKHJlZHJhd0FsbCk7Ci0JCWZBY3RpdmUgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlICYmIGZBY3RpdmVSZWdpb24gIT0gbnVsbCkgewotCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpLCBmQWN0aXZlUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCXRyeSB7Ci0JCQkJZXZlbnQuZ2V0RG9jdW1lbnQoKS5hZGRQb3NpdGlvbihmUmVtZW1iZXJlZFBvc2l0aW9uKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZSZW1lbWJlcmVkUG9zaXRpb24gIT0gbnVsbCkgewotCQkJaWYgKCFmUmVtZW1iZXJlZFBvc2l0aW9uLmlzRGVsZXRlZCgpKSB7Ci0KLQkJCQlldmVudC5nZXREb2N1bWVudCgpLnJlbW92ZVBvc2l0aW9uKGZSZW1lbWJlcmVkUG9zaXRpb24pOwotCQkJCWZBY3RpdmVSZWdpb24gPSBuZXcgUmVnaW9uKGZSZW1lbWJlcmVkUG9zaXRpb24uZ2V0T2Zmc2V0KCksIGZSZW1lbWJlcmVkUG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBudWxsOwotCi0JCQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQlTdHlsZWRUZXh0IHdpZGdldCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJCWlmICh3aWRnZXQgIT0gbnVsbCAmJiAhd2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJCQkJd2lkZ2V0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZGVhY3RpdmF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWZBY3RpdmVSZWdpb24gPSBudWxsOwotCQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBudWxsOwotCQkJCWRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIjZm9jdXNHYWluZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIjZm9jdXNMb3N0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldmVudCkgewotCQlkZWFjdGl2YXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudFRleHRPZmZzZXQoKSB7Ci0JCXRyeSB7Ci0JCQlTdHlsZWRUZXh0IHRleHQgPSBnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCQkJUG9pbnQgYWJzb2x1dGVQb3NpdGlvbiA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLQkJCVBvaW50IHJlbGF0aXZlUG9zaXRpb24gPSB0ZXh0LnRvQ29udHJvbChhYnNvbHV0ZVBvc2l0aW9uKTsKLQotCQkJaW50IHdpZGdldE9mZnNldCA9IHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihyZWxhdGl2ZVBvc2l0aW9uKTsKLQkJCWlmIChnZXRUZXh0Vmlld2VyKCkgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgZ2V0VGV4dFZpZXdlcigpOwotCQkJCXJldHVybiBleHRlbnNpb24ud2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KHdpZGdldE9mZnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB3aWRnZXRPZmZzZXQgKyBnZXRUZXh0Vmlld2VyKCkuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQkJfQotCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFBvaW50IGdldE1heGltdW1Mb2NhdGlvbihTdHlsZWRUZXh0IHRleHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJUG9pbnQgbWF4TG9jYXRpb24gPSBuZXcgUG9pbnQoSW50ZWdlci5NSU5fVkFMVUUsIEludGVnZXIuTUlOX1ZBTFVFKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJUG9pbnQgbG9jYXRpb24gPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQob2Zmc2V0ICsgaSk7Ci0KLQkJCWlmIChsb2NhdGlvbi54ID4gbWF4TG9jYXRpb24ueCkKLQkJCQltYXhMb2NhdGlvbi54ID0gbG9jYXRpb24ueDsKLQkJCWlmIChsb2NhdGlvbi55ID4gbWF4TG9jYXRpb24ueSkKLQkJCQltYXhMb2NhdGlvbi55ID0gbG9jYXRpb24ueTsKLQkJfQotCi0JCXJldHVybiBtYXhMb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IGdldE1pbmltdW1Mb2NhdGlvbihTdHlsZWRUZXh0IHRleHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJUG9pbnQgbWluTG9jYXRpb24gPSBuZXcgUG9pbnQoSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJUG9pbnQgbG9jYXRpb24gPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQob2Zmc2V0ICsgaSk7Ci0KLQkJCWlmIChsb2NhdGlvbi54IDwgbWluTG9jYXRpb24ueCkKLQkJCQltaW5Mb2NhdGlvbi54ID0gbG9jYXRpb24ueDsKLQkJCWlmIChsb2NhdGlvbi55IDwgbWluTG9jYXRpb24ueSkKLQkJCQltaW5Mb2NhdGlvbi55ID0gbG9jYXRpb24ueTsKLQkJfQotCi0JCXJldHVybiBtaW5Mb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0TmV3UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIElUZXh0Vmlld2VyIGdldFRleHRWaWV3ZXIoKSB7Ci0JCXJldHVybiBmVGV4dFZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGlnaGxpZ2h0UmVnaW9uKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24pIHsKLQotCQlpZiAocmVnaW9uLmVxdWFscyhmQWN0aXZlUmVnaW9uKSkKLQkJCXJldHVybjsKLQotCQlyZXBhaXJSZXByZXNlbnRhdGlvbigpOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQotCQkvLyBVbmRlcmxpbmUKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKG5ldyBSZWdpb24ocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCWlmICh3aWRnZXRSYW5nZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJb2Zmc2V0ID0gd2lkZ2V0UmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSB3aWRnZXRSYW5nZS5nZXRMZW5ndGgoKTsKLQotCQl9IGVsc2UgewotCQkJb2Zmc2V0ID0gcmVnaW9uLmdldE9mZnNldCgpIC0gdmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCQkvLyBuZWVkIGNsZWFyQmFja2dyb3VuZCB0byBiZSB0cnVlIGZvciBwYWludCBldmVudCB0byBiZSBmaXJlZAotCQl0ZXh0LnJlZHJhd1JhbmdlKG9mZnNldCwgbGVuZ3RoLCB0cnVlKTsKLQotCQlmQWN0aXZlUmVnaW9uID0gcmVnaW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlcyhJUmVnaW9uIHJlZ2lvbiwgSVJlZ2lvbiBwb3NpdGlvbikgewotCQlyZXR1cm4gcG9zaXRpb24uZ2V0T2Zmc2V0KCkgPj0gcmVnaW9uLmdldE9mZnNldCgpICYmIHBvc2l0aW9uLmdldE9mZnNldCgpICsgcG9zaXRpb24uZ2V0TGVuZ3RoKCkgPD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChvbGRJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlkZWFjdGl2YXRlKCk7Ci0JCW9sZElucHV0LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyI2lucHV0RG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW5ld0lucHV0LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCWZQcmVmZXJlbmNlU3RvcmUgPSBzdG9yZTsKLQkJSVRleHRWaWV3ZXIgdGV4dFZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHRleHRWaWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHlsZWRUZXh0IHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQl1cGRhdGVDb2xvcih0ZXh0Vmlld2VyKTsKLQotCQl0ZXh0Vmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQlkb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCi0JCXRleHQuYWRkS2V5TGlzdGVuZXIodGhpcyk7Ci0JCXRleHQuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5hZGRNb3VzZU1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJdXBkYXRlS2V5TW9kaWZpZXJNYXNrKCk7Ci0KLQkJZlByZWZlcmVuY2VTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyI2tleVByZXNzZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKGZBY3RpdmUpIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChldmVudC5rZXlDb2RlICE9IGZLZXlNb2RpZmllck1hc2spIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZBY3RpdmUgPSB0cnVlOwotCi0JCS8vCQkJcmVtb3ZlZCBmb3IgIzI1ODcxCi0JCS8vCi0JCS8vCQkJSVNvdXJjZVZpZXdlciB2aWV3ZXI9IGdldFNvdXJjZVZpZXdlcigpOwotCQkvLwkJCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJLy8JCQkJcmV0dXJuOwotCQkvLwkJCQotCQkvLwkJCUlSZWdpb24gcmVnaW9uPSBnZXRDdXJyZW50VGV4dFJlZ2lvbih2aWV3ZXIpOwotCQkvLwkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJLy8JCQkJcmV0dXJuOwotCQkvLwkJCQotCQkvLwkJCWhpZ2hsaWdodFJlZ2lvbih2aWV3ZXIsIHJlZ2lvbik7Ci0JCS8vCQkJYWN0aXZhdGVDdXJzb3Iodmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lciNrZXlSZWxlYXNlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKCFmQWN0aXZlKQotCQkJcmV0dXJuOwotCi0JCWRlYWN0aXZhdGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyI21vdXNlRG91YmxlQ2xpY2sob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvd24ob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKCFmQWN0aXZlKQotCQkJcmV0dXJuOwotCi0JCWlmIChldmVudC5zdGF0ZU1hc2sgIT0gZktleU1vZGlmaWVyTWFzaykgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lciNtb3VzZU1vdmUob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wgJiYgISgoQ29udHJvbCkgZXZlbnQud2lkZ2V0KS5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIWZBY3RpdmUpIHsKLQkJCWlmIChldmVudC5zdGF0ZU1hc2sgIT0gZktleU1vZGlmaWVyTWFzaykKLQkJCQlyZXR1cm47Ci0JCQkvLyBtb2RpZmllciB3YXMgYWxyZWFkeSBwcmVzc2VkCi0JCQlmQWN0aXZlID0gdHJ1ZTsKLQkJfQotCi0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSAhPSAwICYmIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSAhPSAwKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSBnZXRDdXJyZW50VGV4dE9mZnNldCgpOwotCQlJT3Blbk9uIG9wZW5PbiA9IE9wZW5PblByb3ZpZGVyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk9uKGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpLCBvZmZzZXQpOwotCQlpZiAob3Blbk9uICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IG9wZW5Pbi5nZXRPcGVuT25SZWdpb24oZ2V0VGV4dFZpZXdlcigpLmdldERvY3VtZW50KCksIG9mZnNldCk7Ci0JCX0KLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHJlZ2lvbi5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXBhaXJSZXByZXNlbnRhdGlvbigpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaGlnaGxpZ2h0UmVnaW9uKHZpZXdlciwgcmVnaW9uKTsKLQkJYWN0aXZhdGVDdXJzb3Iodmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyI21vdXNlVXAob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0KLQkJaWYgKCFmQWN0aXZlKQotCQkJcmV0dXJuOwotCi0JCWlmIChlLmJ1dHRvbiAhPSAxKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIHdhc0FjdGl2ZSA9IGZDdXJzb3IgIT0gbnVsbDsKLQkJSVJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IGZBY3RpdmVSZWdpb247Ci0KLQkJZGVhY3RpdmF0ZSgpOwotCi0JCWlmICh3YXNBY3RpdmUpIHsKLQkJCUlPcGVuT24gb3Blbk9uID0gT3Blbk9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuT24oZ2V0VGV4dFZpZXdlcigpLmdldERvY3VtZW50KCksIHByZXZpb3VzUmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChvcGVuT24gIT0gbnVsbCkgewotCQkJCW9wZW5Pbi5vcGVuT24oZ2V0VGV4dFZpZXdlcigpLmdldERvY3VtZW50KCksIHByZXZpb3VzUmVnaW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBQYWludExpc3RlbmVyI3BhaW50Q29udHJvbChQYWludEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCi0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0KLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQlJUmVnaW9uIHdpZGdldFJhbmdlID0gZXh0ZW5zaW9uLm1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UoZkFjdGl2ZVJlZ2lvbik7Ci0JCQlpZiAod2lkZ2V0UmFuZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IHdpZGdldFJhbmdlLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gd2lkZ2V0UmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJfSBlbHNlIHsKLQotCQkJSVJlZ2lvbiByZWdpb24gPSB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJaWYgKCFpbmNsdWRlcyhyZWdpb24sIGZBY3RpdmVSZWdpb24pKQotCQkJCXJldHVybjsKLQotCQkJb2Zmc2V0ID0gZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSAtIHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IGZBY3RpdmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvLyBzdXBwb3J0IGZvciBiaWRpCi0JCVBvaW50IG1pbkxvY2F0aW9uID0gZ2V0TWluaW11bUxvY2F0aW9uKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJUG9pbnQgbWF4TG9jYXRpb24gPSBnZXRNYXhpbXVtTG9jYXRpb24odGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotCi0JCWludCB4MSA9IG1pbkxvY2F0aW9uLng7Ci0JCWludCB4MiA9IG1pbkxvY2F0aW9uLnggKyBtYXhMb2NhdGlvbi54IC0gbWluTG9jYXRpb24ueCAtIDE7Ci0JCWludCB5ID0gbWluTG9jYXRpb24ueSArIHRleHQuZ2V0TGluZUhlaWdodCgpIC0gMTsKLQotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlpZiAoZkNvbG9yICE9IG51bGwgJiYgIWZDb2xvci5pc0Rpc3Bvc2VkKCkpCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKGZDb2xvcik7Ci0JCWdjLmRyYXdMaW5lKHgxLCB5LCB4MiwgeSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoZkxpbmtDb2xvcktleSkpIHsKLQkJCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCQl1cGRhdGVDb2xvcih2aWV3ZXIpOwotCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKGZCcm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXkpKSB7Ci0JCQl1cGRhdGVLZXlNb2RpZmllck1hc2soKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBhaXJSZXByZXNlbnRhdGlvbigpIHsKLQkJcmVwYWlyUmVwcmVzZW50YXRpb24oZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXBhaXJSZXByZXNlbnRhdGlvbihib29sZWFuIHJlZHJhd0FsbCkgewotCi0JCWlmIChmQWN0aXZlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IGZBY3RpdmVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBmQWN0aXZlUmVnaW9uLmdldExlbmd0aCgpOwotCQlmQWN0aXZlUmVnaW9uID0gbnVsbDsKLQotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCi0JCQlyZXNldEN1cnNvcih2aWV3ZXIpOwotCi0JCQkvLyBSZW1vdmUgdW5kZXJsaW5lCi0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLQkJCQlvZmZzZXQgPSBleHRlbnNpb24ubW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KG9mZnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCW9mZnNldCAtPSB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCi0JCQkJLy8gbmVlZCBjbGVhckJhY2tncm91bmQgdG8gYmUgdHJ1ZSBmb3IgcGFpbnQgZXZlbnQgdG8gYmUgZmlyZWQKLQkJCQl0ZXh0LnJlZHJhd1JhbmdlKG9mZnNldCwgbGVuZ3RoLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbih4KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldEN1cnNvcihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0LnNldEN1cnNvcihudWxsKTsKLQotCQlpZiAoZkN1cnNvciAhPSBudWxsKSB7Ci0JCQlmQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCWZDdXJzb3IgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rUHJlZmVyZW5jZUtleXMoU3RyaW5nIGxpbmtDb2xvcktleSwgU3RyaW5nIGJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleSkgewotCQlmTGlua0NvbG9yS2V5ID0gbGlua0NvbG9yS2V5OwotCQlmQnJvd3Nlckxpa2VMaW5rc0tleU1vZGlmaWVyS2V5ID0gYnJvd3Nlckxpa2VMaW5rc0tleU1vZGlmaWVyS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCi0JCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh0ZXh0Vmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGV4dFZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJZG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZSA9IGdldE5ld1ByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAocHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQlwcmVmZXJlbmNlU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotCQlTdHlsZWRUZXh0IHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQl0ZXh0LnJlbW92ZUtleUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LnJlbW92ZU1vdXNlTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQucmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5yZW1vdmVQYWludExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDb2xvcihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSB0ZXh0LmdldERpc3BsYXkoKTsKLQkJZkNvbG9yID0gY3JlYXRlQ29sb3IoZ2V0TmV3UHJlZmVyZW5jZVN0b3JlKCksIGZMaW5rQ29sb3JLZXksIGRpc3BsYXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVLZXlNb2RpZmllck1hc2soKSB7Ci0JCVN0cmluZyBtb2RpZmllcnMgPSBnZXROZXdQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoZkJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleSk7Ci0JCWZLZXlNb2RpZmllck1hc2sgPSBjb21wdXRlU3RhdGVNYXNrKG1vZGlmaWVycyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NDg3ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0KLS8qKgotICogRGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgSU9wZW5GaWxlQWN0aW9uIHRvIGNhbGwgYmFzZWQgb24gY3VycmVudAotICogcGFydGl0aW9uLgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk9uQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0JcHVibGljIE9wZW5PbkFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVRleHRFZGl0b3IgZWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCi0JCQkJLy8gZmlndXJlIG91dCBjdXJyZW50IG9mZnNldAotCQkJCWludCBvZmZzZXQgPSAtMTsKLQkJCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0ZXh0VG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGdldFRleHRFZGl0b3IoKS5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJCQlpZiAodGV4dFRvb2xzICE9IG51bGwpIHsKLQkJCQkJb2Zmc2V0ID0gdGV4dFRvb2xzLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGVkaXRvciBpbnN0YW5jZW9mIElFeHRlbmRlZFNpbXBsZUVkaXRvcikgewotCQkJCQlvZmZzZXQgPSAoKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgZWRpdG9yKS5nZXRDYXJldFBvc2l0aW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWwgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQkJCW9mZnNldCA9ICgoSVRleHRTZWxlY3Rpb24pIHNlbCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJSU9wZW5PbiBvcGVuT24gPSBPcGVuT25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5Pbihkb2N1bWVudCwgb2Zmc2V0KTsKLQkJCQlpZiAob3Blbk9uICE9IG51bGwpIHsKLQkJCQkJb3Blbk9uLm9wZW5Pbihkb2N1bWVudCwgbmV3IFJlZ2lvbihvZmZzZXQsIDApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MmRlNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotCi0KLS8qKgotICogUmVhZHMgZXh0ZW5zaW9ucyBmb3Igb3BlbiBvbiBleHRlbnNpb24gcG9pbnQsCi0gKiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMub3Blbm9uCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBiYXNlIHN1cHBvcnQgZm9yIGh5cGVybGluayBuYXZpZ2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuT25CdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIE9wZW5PbkJ1aWxkZXIgZkluc3RhbmNlOwotCS8vIGV4dGVuc2lvbiBwb2ludCBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX09QRU5PTiA9ICJvcGVub24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVEVOVF9UWVBFX0lERU5USUZJRVIgPSAiY29udGVudHR5cGVpZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09QRU5PTiA9ICJvcGVub24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUlRJVElPTl9UWVBFID0gInBhcnRpdGlvbnR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiByZXR1cm5zIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBPcGVuT25CdWlsZGVyCi0JICogCi0JICogQHJldHVybiBPcGVuT25CdWlsZGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgT3Blbk9uQnVpbGRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgT3Blbk9uQnVpbGRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRDb250ZW50VHlwZTsKLQlwcml2YXRlIE9wZW5PbkRlZmluaXRpb24gZkN1cnJlbnRPcGVuT25EZWZpbml0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBmT3Blbk9uRGVmcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENvbnRyaWJ1dGlvblRhZzsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcnQgSUQgYXR0cmlidXRlIHRoYXQgaXMgZXhwZWN0ZWQgaW4gdGhlCi0JICogdGFyZ2V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVuT25DbGFzcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIG9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3RzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPcGVuT25EZWZpbml0aW9uW10gZ2V0T3Blbk9uRGVmaW5pdGlvbnMoKSB7Ci0JCWluaXRDYWNoZSgpOwotCQlyZXR1cm4gKE9wZW5PbkRlZmluaXRpb25bXSkgZk9wZW5PbkRlZnMudG9BcnJheShuZXcgT3Blbk9uRGVmaW5pdGlvbltmT3Blbk9uRGVmcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgb3BlbiBvbiBkZWZpbml0aW9uIG9iamVjdHMgdmFsaWQgZm9yCi0JICogY29udGVudFR5cGUvcGFydGl0aW9uVHlwZQotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogQHJldHVybiBpZiBlaXRoZXIgY29udGVudFR5cGUgb3IgcGFydGl0aW9uVHlwZSBpcyBudWxsLCBudWxsIGlzCi0JICogICAgICAgICByZXR1cm5lZAotCSAqLwotCXB1YmxpYyBPcGVuT25EZWZpbml0aW9uW10gZ2V0T3Blbk9uRGVmaW5pdGlvbnMoU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBwYXJ0aXRpb25UeXBlID09IG51bGwpIHsKLQkJCS8vIHNob3VsZCBub3QgYmUgYWJsZSB0byBkZWZpbmUgYW4gb3Blbm9uIHdpdGhvdXQgYSBjb250ZW50IHR5cGUKLQkJCS8vIGJ1dCBpZiBpdCB3ZXJlIHBvc3NpYmxlIHRoZW4gd291bGQgbmVlZCB0byBzZWFyY2ggYWxsIG9wZW5vbgotCQkJLy8gZGVmaW5pdGlvbnMgZm9yCi0JCQkvLyBkZWZpbml0aW9ucyB3aXRoIGVtcHR5IGNvbnRlbnRUeXBlIGxpc3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gZW50aXJlIGxpc3Qgb2Ygb3Blbm9uIGRlZmluaXRpb24gb2JqZWN0cwotCQlPcGVuT25EZWZpbml0aW9uW10gYWxsRGVmcyA9IGdldE9wZW5PbkRlZmluaXRpb25zKCk7Ci0JCS8vIGN1cnJlbnQgbGlzdCBvZiBvcGVuIG9uIGRlZmluaXRpb25zIHZhbGlkIGZvcgotCQkvLyBjb250ZW50VHlwZS9wYXJ0aXRpb25UeXBlCi0JCUxpc3QgZGVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gZGVmYXVsdCBkZWZpbml0aW9ucyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byBlbmQgb2YgbGlzdCBvZiBvcGVuIG9uCi0JCS8vIGRlZmluaXRpb25zCi0JCUxpc3QgbGFzdERlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxEZWZzLmxlbmd0aDsgKytpKSB7Ci0JCQkvLyBmb3IgZWFjaCBvbmUgY2hlY2sgaWYgaXQgY29udGFpbnMgY29udGVudFR5cGUKLQkJCUxpc3QgcGFydGl0aW9ucyA9IChMaXN0KSBhbGxEZWZzW2ldLmdldENvbnRlbnRUeXBlcygpLmdldChjb250ZW50VHlwZSk7Ci0JCQlpZiAocGFydGl0aW9ucyAhPSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBvcGVub24gZGVmaW5pdGlvbiBpcyB2YWxpZCBmb3IgYWxsIHBhcnRpdGlvbiB0eXBlcyBmb3IKLQkJCQkvLyB0aGlzIGNvbnRlbnQgdHlwZQotCQkJCWlmIChwYXJ0aXRpb25zLmlzRW1wdHkoKSkgewotCQkJCQkvLyB0aGlzIHdpbGwgYmUgYWRkZWQgdG8gZW5kIG9mIGxpc3QgYmVjYXVzZSB0aGlzIGlzCi0JCQkJCS8vIGNvbnNpZGVyZWQgYSBkZWZhdWx0IG9wZW5vbgotCQkJCQlsYXN0RGVmcy5hZGQoYWxsRGVmc1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZXhhbWluZSB0aGUgcGFydGl0aW9uIHR5cGVzIG9mIHRoaXMgb3Blbm9uCi0JCQkJCWludCBqID0gMDsgLy8gY3VycmVudCBpbmRleCBpbiBsaXN0IG9mIHBhcnRpdGlvbnMKLQkJCQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOyAvLyBvcGVub24gaGFzIGJlZW4gYWRkZWQgdG8gbGlzdAotCQkJCQl3aGlsZSAoaiA8IHBhcnRpdGlvbnMuc2l6ZSgpICYmICFhZGRlZCkgewotCQkJCQkJLy8gdGhpcyBvcGVub24gZGVmaW5pdGlvbiBhcHBsaWVzIHRvIHBhcnRpdGlvblR5cGUgc28KLQkJCQkJCS8vIGFkZCB0byBsaXN0IG9mIHZhbGlkIG9wZW5vbnMKLQkJCQkJCWlmIChwYXJ0aXRpb25UeXBlLmVxdWFscyhwYXJ0aXRpb25zLmdldChqKSkpIHsKLQkJCQkJCQlkZWZzLmFkZChhbGxEZWZzW2ldKTsKLQkJCQkJCQlhZGRlZCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGNvbnRpbnVlIGNoZWNraW5nIHRvIHNlZSBpZiB0aGlzIG9wZW5vbgotCQkJCQkJCS8vIGRlZmluaXRpb24gaXMgdmFsaWQgZm9yIGN1cnJlbnQgcGFydGl0aW9uVHlwZQotCQkJCQkJCSsrajsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBhcHBlbmQgdGhlIGRlZmF1bHQgb3Blbm9uIGRlZmluaXRpb25zCi0JCWRlZnMuYWRkQWxsKGxhc3REZWZzKTsKLQotCQkvLyByZXR1cm4gdGhlIGxpc3QKLQkJcmV0dXJuIChPcGVuT25EZWZpbml0aW9uW10pIGRlZnMudG9BcnJheShuZXcgT3Blbk9uRGVmaW5pdGlvbltkZWZzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0Q2FjaGUoKSB7Ci0JCWlmIChmT3Blbk9uRGVmcyA9PSBudWxsKSB7Ci0JCQlmT3Blbk9uRGVmcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQlyZWFkQ29udHJpYnV0aW9ucyhUQUdfT1BFTk9OLCBQTF9PUEVOT04pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGEgY29uZmlndXJhdGlvbiBlbGVtZW50IHNwZWNpZnlpbmcgYQotCSAqIGNvbnRlbnQgdHlwZSBmb3IgdGhlIGN1cnJlbnQgb3BlbiBvbiB0YWcuIEFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhIHZhbGlkCi0JICogY3VycmVudCBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBjb250ZW50dHlwZWlkZW50aWZpZXIgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb250ZW50VHlwZVRhZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBhZGQgdG8gY3VycmVudCBvcGVuT25EZWZpbml0aW9uCi0JCVN0cmluZyB0aGVJZCA9IGdldElkKGVsZW1lbnQpOwotCi0JCWlmICh0aGVJZCAhPSBudWxsKSB7Ci0JCQlmQ3VycmVudENvbnRlbnRUeXBlID0gdGhlSWQ7Ci0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24uYWRkQ29udGVudFR5cGVJZChmQ3VycmVudENvbnRlbnRUeXBlKTsKLQkJfSBlbHNlIHsKLQkJCWZDdXJyZW50Q29udGVudFR5cGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGEgY29uZmlndXJhdGlvbiBlbGVtZW50IHNwZWNpZnlpbmcgYW4KLQkgKiBvcGVuIG9uIG9iamVjdC4gQ3JlYXRlcyBhIG5ldyBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0IGFuZCBhZGRzIGl0IHRvCi0JICogdGhlIGxpc3Qgb2Ygb3BlbiBvbiBkZWZpbml0aW9uIG9iamVjdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3Blbm9uIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzT3Blbk9uVGFnKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0aGVJZCA9IGdldElkKGVsZW1lbnQpOwotCQlTdHJpbmcgdGhlQ2xhc3MgPSBnZXRPcGVuT25DbGFzcyhlbGVtZW50KTsKLQotCQlpZiAodGhlSWQgIT0gbnVsbCAmJiB0aGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkvLyBzdGFydCBidWlsZGluZyBuZXcgT3Blbk9uRGVmaW5pdGlvbgotCQkJZkN1cnJlbnRPcGVuT25EZWZpbml0aW9uID0gbmV3IE9wZW5PbkRlZmluaXRpb24odGhlSWQsIHRoZUNsYXNzLCBlbGVtZW50KTsKLQkJCWZPcGVuT25EZWZzLmFkZChmQ3VycmVudE9wZW5PbkRlZmluaXRpb24pOwotCQl9IGVsc2UgewotCQkJZkN1cnJlbnRPcGVuT25EZWZpbml0aW9uID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyBlbGVtZW50IHdoaWNoIHNob3VsZCBiZSBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBzcGVjaWZ5aW5nIGEKLQkgKiBwYXJ0aXRpb24gdHlwZSBmb3IgdGhlIGN1cnJlbnQgb3BlbiBvbi9jb250ZW50IHR5cGUgdGFnLiBBc3N1bWVzIHRoYXQKLQkgKiB0aGVyZSBpcyBhIHZhbGlkIGN1cnJlbnQgb3BlbiBvbi9jb250ZW50IHR5cGUgdGFnLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBwYXJ0aXRpb250eXBlIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGFydGl0aW9uVHlwZVRhZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBhZGQgdG8gY3VycmVudCBvcGVuT25EZWZpbml0aW9uL2NvbnRlbnRUeXBlCi0JCVN0cmluZyB0aGVJZCA9IGdldElkKGVsZW1lbnQpOwotCi0JCWlmICh0aGVJZCAhPSBudWxsKSB7Ci0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24uYWRkUGFydGl0aW9uVHlwZShmQ3VycmVudENvbnRlbnRUeXBlLCB0aGVJZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgY29udHJpYnV0aW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgdGhlIHByb3ZpZGVkIHdvcmtiZW5jaAotCSAqIHBhcnQgYW5kIHRoZSBwcm92aWRlZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRDb250cmlidXRpb25zKFN0cmluZyB0YWcsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQl0YXJnZXRDb250cmlidXRpb25UYWcgPSB0YWc7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlYWRSZWdpc3RyeShyZWdpc3RyeSwgUExVR0lOX0lELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBlbGVtZW50LmdldE5hbWUoKTsKLQotCQlpZiAodGFnLmVxdWFscyh0YXJnZXRDb250cmlidXRpb25UYWcpKSB7Ci0JCQlwcm9jZXNzT3Blbk9uVGFnKGVsZW1lbnQpOwotCi0JCQkvLyBtYWtlIHN1cmUgcHJvY2Vzc2luZyBvZiBjdXJyZW50IG9wZW4gb24gdGFnIHJlc3VsdGVkIGluIGEKLQkJCS8vIGN1cnJlbnQgb3BlbiBvbiBkZWZpbml0aW9uCi0JCQkvLyBiZWZvcmUgY29udGludWUgcmVhZGluZyB0aGUgY2hpbGRyZW4KLQkJCWlmIChmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19DT05URU5UX1RZUEVfSURFTlRJRklFUikpIHsKLQkJCXByb2Nlc3NDb250ZW50VHlwZVRhZyhlbGVtZW50KTsKLQotCQkJLy8gbWFrZSBzdXJlIHByb2Nlc3Npbmcgb2YgY3VycmVudCBjb250ZW50IHR5cGUgcmVzdWx0ZWQgaW4gYQotCQkJLy8gdmFsaWQgY29udGVudCB0eXBlCi0JCQkvLyBiZWZvcmUgcmVhZGluZyB0aGUgY2hpbGRyZW4KLQkJCWlmIChmQ3VycmVudENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQlyZWFkRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfUEFSVElUSU9OX1RZUEUpKSB7Ci0JCQlwcm9jZXNzUGFydGl0aW9uVHlwZVRhZyhlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uRGVmaW5pdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTE1OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIE9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3QKLSAqIAotICogQGRlcHJlY2F0ZWQgVXNlIGJhc2Ugc3VwcG9ydCBmb3IgaHlwZXJsaW5rIG5hdmlnYXRpb24KLSAqLwotcHVibGljIGNsYXNzIE9wZW5PbkRlZmluaXRpb24gewotCXByaXZhdGUgU3RyaW5nIGZDbGFzc05hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkNvbmZpZ3VyYXRpb25FbGVtZW50ID0gbnVsbDsKLQotCS8vIGEgaGFzaCBtYXAgb2YgY29udGVudCB0eXBlIElkcyAoU3RyaW5nKSB0aGF0IHBvaW50cyB0byBsaXN0cyBvZgotCS8vIHBhcml0aW9uIHR5cGVzIChMaXN0IG9mIFN0cmluZ3MpCi0JLy8gY29udGVudFR5cGVJZCAtPiBMaXN0KHBhcml0aW9uVHlwZSwgcGFyaXRpb25UeXBlLCBwYXJ0aXRpb25UeXBlLCAuLi4pCi0JLy8gY29udGVudFR5cGVJZDIgLT4gTGlzdChwYXJ0aXRpb25UeXBlLCBwYXJ0aXRpb25UeXBlLCAuLi4pCi0JLy8gLi4uCi0JcHJpdmF0ZSBIYXNoTWFwIGZDb250ZW50VHlwZXMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZJZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gY2xhc3MxCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICovCi0JcHVibGljIE9wZW5PbkRlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgY2xhc3MxLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZklkID0gaWQ7Ci0JCWZDbGFzc05hbWUgPSBjbGFzczE7Ci0JCWZDb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCQlmQ29udGVudFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb250ZW50VHlwZUlkKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCWlmICghZkNvbnRlbnRUeXBlcy5jb250YWluc0tleShjb250ZW50VHlwZUlkKSkKLQkJCWZDb250ZW50VHlwZXMucHV0KGNvbnRlbnRUeXBlSWQsIG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFydGl0aW9uVHlwZShTdHJpbmcgY29udGVudFR5cGVJZCwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJaWYgKCFmQ29udGVudFR5cGVzLmNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlSWQpKQotCQkJZkNvbnRlbnRUeXBlcy5wdXQoY29udGVudFR5cGVJZCwgbmV3IEFycmF5TGlzdCgpKTsKLQotCQlMaXN0IHBhcnRpdGlvbkxpc3QgPSAoTGlzdCkgZkNvbnRlbnRUeXBlcy5nZXQoY29udGVudFR5cGVJZCk7Ci0JCXBhcnRpdGlvbkxpc3QuYWRkKHBhcnRpdGlvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZXh0ZW5zaW9uLiBJZiB0aGUgZXh0ZW5zaW9uIHBsdWdpbiBoYXMgbm90IGJlZW4gbG9hZGVkIGEKLQkgKiBidXN5IGN1cnNvciB3aWxsIGJlIGFjdGl2YXRlZCBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb2FkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXByaXZhdGUgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHByb3BlcnR5TmFtZTsKLQotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihuYW1lKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24obmFtZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSU9wZW5PbiBmb3IgdGhpcyBkZWZpbml0aW9uCi0JICovCi0JcHVibGljIElPcGVuT24gY3JlYXRlT3Blbk9uKCkgewotCQlJT3Blbk9uIG9wZW5PbiA9IG51bGw7Ci0KLQkJaWYgKGdldENsYXNzTmFtZSgpICE9IG51bGwpIHsKLQkJCW9wZW5PbiA9IChJT3Blbk9uKSBjcmVhdGVFeHRlbnNpb24oT3Blbk9uQnVpbGRlci5BVFRfQ0xBU1MpOwotCQl9Ci0KLQkJcmV0dXJuIG9wZW5PbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZDbGFzcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmQ29uZmlndXJhdGlvbkVsZW1lbnQuCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZDb250ZW50VHlwZXMuCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0Q29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gZkNvbnRlbnRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZJZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZklkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKE9iamVjdFtdIHJlc3VsdCwgVGhyb3dhYmxlIGUpIHsKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBvcGVuIG9uOiAiICsgZ2V0SWQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJcmVzdWx0WzBdID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDkwYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotCi0KLS8qKgotICogRGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgSU9wZW5PbiB0byBjYWxsIGJhc2VkIG9uIGN1cnJlbnQgcGFydGl0aW9uLgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk9uUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIE9wZW5PblByb3ZpZGVyIGZJbnN0YW5jZTsKLQotCS8qKgotCSAqIHJldHVybnMgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5PblByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiBPcGVuT25Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE9wZW5PblByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBPcGVuT25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBkb2N1bWVudCBpcyBub3QgbnVsbAotCSAqIEByZXR1cm4gU3RyaW5nIGNvbnRlbnQgdHlwZSBvZiBnaXZlbiBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQlJTW9kZWxNYW5hZ2VyIG1nciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtZ3IuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQl0eXBlID0gbW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIElPcGVuT24gZm9yIHRoZSBjdXJyZW50IHBhcnRpdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSU9wZW5PbiBnZXRPcGVuT24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCUlPcGVuT24gb3Blbk9uID0gbnVsbDsKLQotCQkvLyBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IGdldENvbnRlbnRUeXBlKGRvY3VtZW50KTsKLQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZShkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJRCk7Ci0KLQkJCXdoaWxlIChvcGVuT24gPT0gbnVsbCAmJiBjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJLy8gUXVlcnkgT3Blbk9uQnVpbGRlciBhbmQgZ2V0IHRoZSBsaXN0IG9mIE9wZW5PbnMgZm9yIHRoZQotCQkJCS8vIGN1cnJlbnQgcGFydGl0aW9uCi0JCQkJT3Blbk9uRGVmaW5pdGlvbltdIGRlZnMgPSBPcGVuT25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk9uRGVmaW5pdGlvbnMoY29udGVudFR5cGUuZ2V0SWQoKSwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCi0JCQkJLy8gSWYgbW9yZSB0aGFuIDEgb3Blbm9uIGlzIHJldHVybmVkLCBuZWVkIHRvIGZ1cnRoZXIgY2hlY2sKLQkJCQkvLyB3aGljaCBPcGVuT24gaXMgdGhlIGFwcHJvcHJpYXRlIG9uZSB0byByZXR1cm4KLQkJCQkvLyBmb3Igbm93IGp1c3QgcmV0dXJuaW5nIHRoZSBmaXJzdCBvbmUKLQkJCQlpZiAoZGVmcyAhPSBudWxsICYmIGRlZnMubGVuZ3RoID4gMCkgewotCQkJCQlvcGVuT24gPSBkZWZzWzBdLmNyZWF0ZU9wZW5PbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcGVuT247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIHR5cGUgbG9jYXRlZCBhdCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZG9jdW1lbnQgaXMgbm90IG51bGwKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBTdHJpbmcgcGFydGl0aW9uIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IHByb3ZpZGUgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIHNvIHdlJ3JlIG5vdCB1c2luZyBhIGRlZmF1bHQgbGlrZSB0aGlzCi0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJdHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUoZG9jdW1lbnQsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlUeXBlZFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24ob2Zmc2V0KTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0eXBlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTMwYzc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FZGl0b3JQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIFNTRSBVSQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUHJlZmVyZW5jZU5hbWVzIHsKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBvbi10aGUtZmx5IHZhbGlkYXRpb24KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMgPSBnZXRFdmFsdWF0ZVRlbXBvcmFyeVByb2JsZW1zS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXZhbHVhdGVUZW1wb3JhcnlQcm9ibGVtc0tleSgpIHsKLQkJcmV0dXJuICJldmFsdWF0ZVRlbXBvcmFyeVByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgYnJhY2tldCBtYXRjaGluZyBoaWdobGlnaHRpbmcKLQkgKiBpcyB0dXJuZWQgb24gb3Igb2ZmLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BVENISU5HX0JSQUNLRVRTID0gZ2V0TWF0Y2hpbmdCcmFja2V0c0tleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1hdGNoaW5nQnJhY2tldHNLZXkoKSB7Ci0JCXJldHVybiAibWF0Y2hpbmdCcmFja2V0cyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY29sb3IgdXNlZCB0byBoaWdobGlnaHQgbWF0Y2hpbmcKLQkgKiBicmFja2V0cy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVRDSElOR19CUkFDS0VUU19DT0xPUiA9IGdldE1hdGNoaW5nQnJhY2tldHNDb2xvcktleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1hdGNoaW5nQnJhY2tldHNDb2xvcktleSgpIHsKLQkJcmV0dXJuICJtYXRjaGluZ0JyYWNrZXRzQ29sb3IiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgZGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaG92ZXIgbW9kaWZpZXJzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTID0gZ2V0VGV4dEhvdmVyTW9kaWZpZXJzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dEhvdmVyTW9kaWZpZXJzS2V5KCkgewotCQlyZXR1cm4gImhvdmVyTW9kaWZpZXJzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGRlZmluZXMgcmVhZCBvbmx5IGNvbnRyYXN0IHNjYWxlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFID0gZ2V0UmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZWFkT25seUZvcmVncm91bmRTY2FsZUtleSgpIHsKLQkJcmV0dXJuICJyZWFkT25seUZvcmVncm91bmRTY2FsZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBkZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRvIHNob3cgYSBtZXNzYWdlIGRpYWxvZwotCSAqIGluZm9ybWluZyB1c2VyIG9mIHVua25vd24gY29udGVudCB0eXBlIGluIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRyA9ICJzaG93VW5rbm93bkNvbnRlbnRUeXBlTXNnIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDU0ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQW4gb3ZlcmxheWluZyBwcmVmZXJlbmNlIHN0b3JlLiBjb3BpZWQgZnJvbSBKRFQKLSAqLwotcHVibGljIGNsYXNzIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVN0b3JlIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheUtleSB7Ci0KLQkJVHlwZURlc2NyaXB0b3IgZkRlc2NyaXB0b3I7Ci0JCVN0cmluZyBmS2V5OwotCi0JCXB1YmxpYyBPdmVybGF5S2V5KFR5cGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFN0cmluZyBrZXkpIHsKLQkJCWZEZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJCWZLZXkgPSBrZXk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnR5TGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJT3ZlcmxheUtleSBrZXkgPSBmaW5kT3ZlcmxheUtleShldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCWlmIChrZXkgIT0gbnVsbCkKLQkJCQlwcm9wYWdhdGVQcm9wZXJ0eShmUGFyZW50LCBrZXksIGZTdG9yZSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZURlc2NyaXB0b3IgewotCQlwcml2YXRlIFR5cGVEZXNjcmlwdG9yKCkgewotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBCT09MRUFOID0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBET1VCTEUgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIEZMT0FUID0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBJTlQgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIExPTkcgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIFNUUklORyA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXByaXZhdGUgYm9vbGVhbiBmTG9hZGVkOwotCXByaXZhdGUgT3ZlcmxheUtleVtdIGZPdmVybGF5S2V5czsKLQotCi0JSVByZWZlcmVuY2VTdG9yZSBmUGFyZW50OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUxpc3RlbmVyIGZQcm9wZXJ0eUxpc3RlbmVyOwotCUlQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOwotCi0KLQlwdWJsaWMgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHBhcmVudCwgT3ZlcmxheUtleVtdIG92ZXJsYXlLZXlzKSB7Ci0JCWZQYXJlbnQgPSBwYXJlbnQ7Ci0JCWZPdmVybGF5S2V5cyA9IG92ZXJsYXlLZXlzOwotCQlmU3RvcmUgPSBuZXcgUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGtleXMgdG8gYWRkIHRvIHRoZSBsaXN0IG9mIG92ZXJsYXkga2V5cy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUge0BsaW5rICNsb2FkKCl9aXMgY2FsbGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5cwotCSAqIEBwbGFubmVkZm9yIDMuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleXMoT3ZlcmxheUtleVtdIGtleXMpIHsKLQkJQXNzZXJ0LmlzVHJ1ZSghZkxvYWRlZCk7Ci0JCUFzc2VydC5pc05vdE51bGwoa2V5cyk7Ci0KLQkJaW50IG92ZXJsYXlLZXlzTGVuZ3RoID0gZk92ZXJsYXlLZXlzLmxlbmd0aDsKLQkJT3ZlcmxheUtleVtdIHJlc3VsdCA9IG5ldyBPdmVybGF5S2V5W2tleXMubGVuZ3RoICsgb3ZlcmxheUtleXNMZW5ndGhdOwotCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvdmVybGF5S2V5c0xlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJcmVzdWx0W2ldID0gZk92ZXJsYXlLZXlzW2ldOwotCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJcmVzdWx0W292ZXJsYXlLZXlzTGVuZ3RoICsgaV0gPSBrZXlzW2ldOwotCi0JCWZPdmVybGF5S2V5cyA9IHJlc3VsdDsKLQotCQlpZiAoZkxvYWRlZCkKLQkJCWxvYWQoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2NvbnRhaW5zKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmNvbnRhaW5zKG5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb3ZlcnMoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKGZpbmRPdmVybGF5S2V5KGtleSkgIT0gbnVsbCk7Ci0JfQotCi0JT3ZlcmxheUtleSBmaW5kT3ZlcmxheUtleShTdHJpbmcga2V5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZk92ZXJsYXlLZXlzW2ldLmZLZXkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZPdmVybGF5S2V5c1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBuYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlmU3RvcmUuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0RG91YmxlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0RG91YmxlKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRGbG9hdChTdHJpbmcpCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRGbG9hdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0SW50KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0SW50KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRMb25nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TG9uZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRMb25nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RG91YmxlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERvdWJsZShuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRGbG9hdChTdHJpbmcpCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RmxvYXQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0SW50KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldEludChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRMb25nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0TG9uZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0U3RyaW5nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2lzRGVmYXVsdChTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuaXNEZWZhdWx0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQotCQkJbG9hZFByb3BlcnR5KGZQYXJlbnQsIGZPdmVybGF5S2V5c1tpXSwgZlN0b3JlLCB0cnVlKTsKLQotCQlmTG9hZGVkID0gdHJ1ZTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWREZWZhdWx0cygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlzZXRUb0RlZmF1bHQoZk92ZXJsYXlLZXlzW2ldLmZLZXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUHJvcGVydHkoSVByZWZlcmVuY2VTdG9yZSBvcmdpbiwgT3ZlcmxheUtleSBrZXksIElQcmVmZXJlbmNlU3RvcmUgdGFyZ2V0LCBib29sZWFuIGZvcmNlSW5pdGlhbGl6YXRpb24pIHsKLQkJVHlwZURlc2NyaXB0b3IgZCA9IGtleS5mRGVzY3JpcHRvcjsKLQkJaWYgKEJPT0xFQU4gPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIHRydWUpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRCb29sZWFuKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEJvb2xlYW4oa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKERPVUJMRSA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMS4wRCk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldERvdWJsZShrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHREb3VibGUoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKEZMT0FUID09IGQpIHsKLQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxLjBGKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0RmxvYXQoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0RmxvYXQoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKElOVCA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMSk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEludChrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRJbnQoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKExPTkcgPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDFMKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0TG9uZyhrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRMb25nKGtleS5mS2V5KSk7Ci0KLQkJfSBlbHNlIGlmIChTVFJJTkcgPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksICIxIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0U3RyaW5nKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdFN0cmluZyhrZXkuZktleSkpOwotCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNuZWVkc1NhdmluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNTYXZpbmcoKSB7Ci0JCXJldHVybiBmU3RvcmUubmVlZHNTYXZpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wYWdhdGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQotCQkJcHJvcGFnYXRlUHJvcGVydHkoZlN0b3JlLCBmT3ZlcmxheUtleXNbaV0sIGZQYXJlbnQpOwotCX0KLQotCXZvaWQgcHJvcGFnYXRlUHJvcGVydHkoSVByZWZlcmVuY2VTdG9yZSBvcmdpbiwgT3ZlcmxheUtleSBrZXksIElQcmVmZXJlbmNlU3RvcmUgdGFyZ2V0KSB7Ci0KLQkJaWYgKG9yZ2luLmlzRGVmYXVsdChrZXkuZktleSkpIHsKLQkJCWlmICghdGFyZ2V0LmlzRGVmYXVsdChrZXkuZktleSkpCi0JCQkJdGFyZ2V0LnNldFRvRGVmYXVsdChrZXkuZktleSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUeXBlRGVzY3JpcHRvciBkID0ga2V5LmZEZXNjcmlwdG9yOwotCQlpZiAoQk9PTEVBTiA9PSBkKSB7Ci0KLQkJCWJvb2xlYW4gb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRCb29sZWFuKGtleS5mS2V5KTsKLQkJCWJvb2xlYW4gdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0Qm9vbGVhbihrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChET1VCTEUgPT0gZCkgewotCi0JCQlkb3VibGUgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXREb3VibGUoa2V5LmZLZXkpOwotCQkJZG91YmxlIHRhcmdldFZhbHVlID0gdGFyZ2V0LmdldERvdWJsZShrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChGTE9BVCA9PSBkKSB7Ci0KLQkJCWZsb2F0IG9yaWdpblZhbHVlID0gb3JnaW4uZ2V0RmxvYXQoa2V5LmZLZXkpOwotCQkJZmxvYXQgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0RmxvYXQoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0gZWxzZSBpZiAoSU5UID09IGQpIHsKLQotCQkJaW50IG9yaWdpblZhbHVlID0gb3JnaW4uZ2V0SW50KGtleS5mS2V5KTsKLQkJCWludCB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRJbnQoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7Ci0KLQkJCWxvbmcgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRMb25nKGtleS5mS2V5KTsKLQkJCWxvbmcgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0TG9uZyhrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChTVFJJTkcgPT0gZCkgewotCi0JCQlTdHJpbmcgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpOwotCQkJU3RyaW5nIHRhcmdldFZhbHVlID0gdGFyZ2V0LmdldFN0cmluZyhrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gbnVsbCAmJiBvcmlnaW5WYWx1ZSAhPSBudWxsICYmICF0YXJnZXRWYWx1ZS5lcXVhbHMob3JpZ2luVmFsdWUpKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNwdXRWYWx1ZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUucHV0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBkb3VibGUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGZsb2F0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRUb0RlZmF1bHQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlmU3RvcmUuc2V0VG9EZWZhdWx0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCWlmIChmUHJvcGVydHlMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydHlMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JCQlmUGFyZW50LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZQYXJlbnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7Ci0JCQlmUHJvcGVydHlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVGFiRm9sZGVyTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVGFiRm9sZGVyTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjg5MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1RhYkZvbGRlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci0KLS8qKgotICogQ29waWVkIGZyb20gSkRUCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWJGb2xkZXJMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlpbnQgY291bnQgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCWludCBtYXhXaWR0aCA9IDAsIG1heEhlaWdodCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJUG9pbnQgcHQgPSBjaGlsZC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpOwotCQkJbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgcHQueCk7Ci0JCQltYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIHB0LnkpOwotCQl9Ci0KLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJbWF4V2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJbWF4SGVpZ2h0ID0gaEhpbnQ7Ci0KLQkJcmV0dXJuIG5ldyBQb2ludChtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdCk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0Q29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzgxZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0Q29sb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbG9yUGFnZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBPdmVybGF5UHJlZmVyZW5jZVN0b3JlIGZPdmVybGF5U3RvcmU7Ci0JcHJvdGVjdGVkIFN0eWxlZFRleHRDb2xvclBpY2tlciBmUGlja2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbG9yaW5nIGdyb3VwIHVzZWQgaW4gY3JlYXRlQ29udGVudHMgVGhpcyBtZXRob2QgY2FuIGJlCi0JICogb3ZlcndyaXR0ZW4gdG8gc2V0IHRoZSB0ZXh0IG9mIHRoZSBncm91cCBvciBwcm92aWRlIGFuIGluZm9wb3AKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbG9yaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbG9yaW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCXJldHVybiBjb2xvcmluZ0NvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbXBvc2l0ZSBjb250cm9sIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzY3JvbGxiYXJzIGZvciB0aGlzIHByZWZlcmVuY2UgcGFnZSB3aGVuIG5lZWRlZAotCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHNjMSwgMSk7Ci0JCXNjMS5zZXRDb250ZW50KHBhZ2VDb21wb25lbnQpOwotCQlzZXRTaXplKHBhZ2VDb21wb25lbnQpOwotCi0JCUxhYmVsIGRlc2NMYWJlbCA9IGNyZWF0ZURlc2NyaXB0aW9uTGFiZWwocGFnZUNvbXBvbmVudCwgU1NFVUlNZXNzYWdlcy5BYnN0cmFjdENvbG9yUGFnZURlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wb3NpdGUgY29sb3JpbmdDb21wb3NpdGUgPSBjcmVhdGVDb2xvcmluZ0NvbXBvc2l0ZShwYWdlQ29tcG9uZW50KTsKLQkJY3JlYXRlQ29udGVudHNGb3JQaWNrZXIoY29sb3JpbmdDb21wb3NpdGUpOwotCi0JCUdyaWREYXRhIGdkID0gKEdyaWREYXRhKSBkZXNjTGFiZWwuZ2V0TGF5b3V0RGF0YSgpOwotCQlnZC53aWR0aEhpbnQgPSAoY29sb3JpbmdDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSkueDsKLQkJc2V0U2l6ZShwYWdlQ29tcG9uZW50KTsKLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU3R5bGVkVGV4dENvbG9yUGlja2VyIHVzZWQgaW4gY3JlYXRlQ29udGVudHMgVGhpcyBtZXRob2QKLQkgKiBjYW4gYmUgb3ZlcndyaXR0ZW4gdG8gc2V0IHVwIFN0eWxlZFRleHRDb2xvclBpY2tlciBkaWZmZXJlbnRseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yUGlja2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHRoZSBjb2xvciBwaWNrZXIKLQkJZlBpY2tlciA9IG5ldyBTdHlsZWRUZXh0Q29sb3JQaWNrZXIocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZlBpY2tlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZQaWNrZXIuc2V0UHJlZmVyZW5jZVN0b3JlKGZPdmVybGF5U3RvcmUpOwotCQlzZXR1cFBpY2tlcihmUGlja2VyKTsKLQotCQlmUGlja2VyLnNldFRleHQoZ2V0U2FtcGxlVGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZGVzY3JpcHRpb24gbGFiZWwgZGlzcGxheWVkIGF0IHRvcCBvZiBwcmVmZXJlbmNlIHBhZ2UuIFRoaXMKLQkgKiBtZXRob2QvbGFiZWwgaXMgdXNlZCBpbnN0ZWFkIG9mIFByZWZlcmVuY2VQYWdlJ3MgZGVzY3JpcHRpb24gbGFiZWwKLQkgKiBiZWNhdXNlIHRoZSBTY3JvbGxlZENvbXBvc2l0ZSBjb250YWluZWQgaW4gdGhpcyBwYWdlIHdpbGwgbm90IGZ1bGx5Ci0JICogd29yayAoaG9yaXpvbnRhbCBzY3JvbGxpbmcpIHdpdGggUHJlZmVyZW5jZVBhZ2UncyBkZXNjcmlwdGlvbiBsYWJlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlRGVzY3JpcHRpb25MYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCB8IFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbXBvc2l0ZSBjb250cm9sIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotCSAqLwotCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbGFiZWwgaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQKLQkgKiBsYXlvdXQgZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSB0ZXh0IGluc3RhbmNlIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dAotCSAqIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVRleHQgdGV4dGZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuTEVGVCk7Ci0JCXRleHRmaWVsZC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl0ZXh0ZmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHRleHRmaWVsZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChmUGlja2VyICE9IG51bGwgJiYgIWZQaWNrZXIuaXNEaXNwb3NlZCgpKQotCQkJZlBpY2tlci5yZWxlYXNlUGlja2VyUmVzb3VyY2VzKCk7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0eWxlZFRleHRDb2xvclBpY2tlciBnZXRQaWNrZXIoKSB7Ci0JCXJldHVybiBmUGlja2VyOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgZm9yIHRoZSBnaXZlbiB3b3JrYmVuY2guCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYXMgdGhlIHByZWZlcmVuY2UgcGFnZSBpcyBiZWluZwotCSAqIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkLiBDbGllbnRzIG11c3Qgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIHRoZSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCWZPdmVybGF5U3RvcmUuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzIGluIHRoZQotCSAqIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmT3ZlcmxheVN0b3JlLmxvYWREZWZhdWx0cygpOwotCQlmUGlja2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWZPdmVybGF5U3RvcmUucHJvcGFnYXRlKCk7Ci0JCSBzYXZlUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJLy8gc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgaGVyZQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgY29tcG9zaXRlIHRvIHRoZSBkZWZhdWx0IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJLy8gTm90ZTogVGhlIGZvbnQgaXMgc2V0IGhlcmUgaW4gYW50aWNpcGF0aW9uIHRoYXQgdGhlIGNsYXNzIGluaGVyaXRpbmcKLQkJCS8vICAgICAgIHRoaXMgYmFzZSBjbGFzcyBtYXkgYWRkIHdpZGdldHMgdG8gdGhlIGRpYWxvZy4gICBzZXRTaXplCi0JCQkvLyAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB3ZSBnbyBsaXZlLgotCQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQlQb2ludCBtaW5TaXplID0gY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQljb21wb3NpdGUuc2V0U2l6ZShtaW5TaXplKTsKLQkJCS8vIHNldCBzY3JvbGxiYXIgY29tcG9zaXRlJ3MgbWluIHNpemUgc28gcGFnZSBpcyBleHBhbmRhYmxlIGJ1dAotCQkJLy8gaGFzIHNjcm9sbGJhcnMgd2hlbiBuZWVkZWQKLQkJCWlmIChjb21wb3NpdGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgewotCQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29tcG9zaXRlLmdldFBhcmVudCgpOwotCQkJCXNjMS5zZXRNaW5TaXplKG1pblNpemUpOwotCQkJCXNjMS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQkJCXNjMS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpOwotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJYm9vbGVhbiBkb1NocmluayA9IGZhbHNlOwotCQkvLyBsaW1pdGVyLCBmb3IgdGhlIHJlYWxseSBodWdlIGZvbnRzCi0JCWlmICh2aXNpYmxlKSB7Ci0JCQlnZXRQaWNrZXIoKS5yZWZyZXNoKCk7Ci0JCQlpbnQgeCA9IE1hdGgubWluKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLmdldFNpemUoKS54LCBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS53aWR0aCAqIDkgLyAxMCk7Ci0JCQlpbnQgeSA9IE1hdGgubWluKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLmdldFNpemUoKS55LCBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS5oZWlnaHQgKiA5IC8gMTApOwotCQkJYm9vbGVhbiBzaHJpbmtXaWR0aCA9ICh4ICE9IGdldENvbnRyb2woKS5nZXRTaGVsbCgpLmdldFNpemUoKS54KTsKLQkJCWJvb2xlYW4gc2hyaW5rSGVpZ2h0ID0gKHkgIT0gZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLnkpOwotCQkJZG9TaHJpbmsgPSBzaHJpbmtXaWR0aCB8fCBzaHJpbmtIZWlnaHQ7Ci0JCQlpZiAoZG9TaHJpbmspIHsKLQkJCQkvLyBtb2RpZnkganVzdCB0aGUgaGVpZ2h0Ci0JCQkJaWYgKHNocmlua0hlaWdodCAmJiAhc2hyaW5rV2lkdGgpCi0JCQkJCWdldFNoZWxsKCkuc2V0Qm91bmRzKGdldFNoZWxsKCkuZ2V0TG9jYXRpb24oKS54LCAwLCBnZXRTaGVsbCgpLmdldFNpemUoKS54LCBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQkJCS8vIG1vZGlmeSBqdXN0IHRoZSB3aWR0aAotCQkJCWVsc2UgaWYgKCFzaHJpbmtIZWlnaHQgJiYgc2hyaW5rV2lkdGgpCi0JCQkJCWdldFNoZWxsKCkuc2V0Qm91bmRzKDAsIGdldFNoZWxsKCkuZ2V0TG9jYXRpb24oKS55LCBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS53aWR0aCwgZ2V0U2hlbGwoKS5nZXRTaXplKCkueSk7Ci0JCQkJLy8gY2hhbmdlIHRoZSBlbnRpcmUgc2hlbGwgc2l6ZSB0byBvbmx5IGZpbGwgdGhlIGRpc3BsYXksIGFuZAotCQkJCS8vIG1vdmUgaXQgdG8gdGhlIG9yaWdpbgotCQkJCWVsc2UKLQkJCQkJZ2V0U2hlbGwoKS5zZXRCb3VuZHMoMCwgMCwgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKGRvU2hyaW5rKSB7Ci0JCQlnZXRDb250cm9sKCkuZ2V0U2hlbGwoKS5yZWRyYXcoKTsKLQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLnVwZGF0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTllOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogKHBhKSB3aHkgaXMgdGhpcyBjbGFzcyBhYnN0cmFjdCBpZiB0aGVyZSBhcmUgbm8gYWJzdHJhY3QgbWV0aG9kcz8KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFdJRFRIX1ZBTElEQVRJT05fTE9XRVJfTElNSVQgPSAwOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgV0lEVEhfVkFMSURBVElPTl9VUFBFUl9MSU1JVCA9IDk5OTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgZ3JvdXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlRHJvcERvd25Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21ibyBjb21ib0JveCA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29tYm9Cb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBncm91cCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2Nyb2xsYmFycyBmb3IgdGhpcyBwYXJlbnQgd2hlbiBuZWVkZWQKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHNjMSwgMSk7Ci0JCXNjMS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbm90IGNhbGxpbmcgc2V0U2l6ZSBmb3IgY29tcG9zaXRlIHdpbGwgcmVzdWx0IGluIGEgYmxhbmsgY29tcG9zaXRlLAotCQkvLyBzbyBjYWxsaW5nIGl0IGhlcmUgaW5pdGlhbGx5Ci0JCS8vIHNldFNpemUgYWN0dWFsbHkgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGFsbCBjb250cm9scyBhcmUgY3JlYXRlZCwKLQkJLy8gc28gc2Nyb2xsZWRDb21wb3NpdGUKLQkJLy8gaGFzIGNvcnJlY3QgbWluU2l6ZQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZVNlcGFyYXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uU3BhbikgewotCQkvLyBDcmVhdGUgYSBzcGFjZXIgbGluZQotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtblNwYW47Ci0KLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBzZXBhcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVWYWx1ZXMoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGxvYWRQcmVmZXJlbmNlcygpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWluaXRpYWxpemVWYWx1ZXMoKTsKLQkJCQl2YWxpZGF0ZVZhbHVlcygpOwotCQkJCWVuYWJsZVZhbHVlcygpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCS8vIElmIHdlIGFyZSBjYWxsZWQgdG9vIGVhcmx5LCBpLmUuIGJlZm9yZSB0aGUgY29udHJvbHMgYXJlIGNyZWF0ZWQKLQkJLy8gdGhlbiByZXR1cm4KLQkJLy8gdG8gYXZvaWQgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMKLQkJaWYgKGUud2lkZ2V0ICE9IG51bGwgJiYgZS53aWRnZXQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzYXZlUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZVByZWZlcmVuY2VzKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3RvcmVWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludmFsaWRJbnB1dE1lc3NhZ2UoU3RyaW5nIHdpZHRoVGV4dCkgewotCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5fNGNvbmNhdCwgKG5ldyBPYmplY3RbXXt3aWR0aFRleHR9KSk7Ci0JCXNldEVycm9yTWVzc2FnZShtc2cpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IFRoZSBmb250IGlzIHNldCBoZXJlIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBjbGFzcyBpbmhlcml0aW5nCi0JCQkvLyAgICAgICB0aGlzIGJhc2UgY2xhc3MgbWF5IGFkZCB3aWRnZXRzIHRvIHRoZSBkaWFsb2cuICAgc2V0U2l6ZQotCQkJLy8gICAgICAgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgd2UgZ28gbGl2ZS4KLQkJCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJUG9pbnQgbWluU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJY29tcG9zaXRlLnNldFNpemUobWluU2l6ZSk7Ci0JCQkvLyBzZXQgc2Nyb2xsYmFyIGNvbXBvc2l0ZSdzIG1pbiBzaXplIHNvIHBhZ2UgaXMgZXhwYW5kYWJsZSBidXQKLQkJCS8vIGhhcyBzY3JvbGxiYXJzIHdoZW4gbmVlZGVkCi0JCQlpZiAoY29tcG9zaXRlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQkJCQlzYzEuc2V0TWluU2l6ZShtaW5TaXplKTsKLQkJCQlzYzEuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJCQlzYzEuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVmFsdWVzKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXdpZGdldFNlbGVjdGVkKGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gSWYgd2UgYXJlIGNhbGxlZCB0b28gZWFybHksIGkuZS4gYmVmb3JlIHRoZSBjb250cm9scyBhcmUgY3JlYXRlZAotCQkvLyB0aGVuIHJldHVybgotCQkvLyB0byBhdm9pZCBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQlpZiAoZS53aWRnZXQgIT0gbnVsbCAmJiBlLndpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJZW5hYmxlVmFsdWVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJlZmVyZW5jZVRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJlZmVyZW5jZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDAxZjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEdlbmVyaWMgcHJlZmVyZW5jZSB0YWIgcGFnZSB0aGF0IGNvbnRhaW5zIGhlbHBmdWwgbWV0aG9kcwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFByZWZlcmVuY2VUYWIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVRhYiB7Ci0KLQlNYXAgZkNoZWNrQm94ZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkNoZWNrQm94TGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQlmT3ZlcmxheVN0b3JlLnNldFZhbHVlKChTdHJpbmcpIGZDaGVja0JveGVzLmdldChidXR0b24pLCBidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfTsKLQlwcml2YXRlIFByZWZlcmVuY2VQYWdlIGZNYWluUHJlZmVyZW5jZVBhZ2U7Ci0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBmTnVtYmVyRmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQludW1iZXJGaWVsZENoYW5nZWQoKFRleHQpIGUud2lkZ2V0KTsKLQkJfQotCX07Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZk51bWJlckZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlIGZPdmVybGF5U3RvcmU7Ci0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBmVGV4dEZpZWxkTGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGUud2lkZ2V0OwotCQkJZk92ZXJsYXlTdG9yZS5zZXRWYWx1ZSgoU3RyaW5nKSBmVGV4dEZpZWxkcy5nZXQodGV4dCksIHRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCX07Ci0JTWFwIGZUZXh0RmllbGRzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCBCdXR0b24gYWRkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnQgaW5kZW50YXRpb24pIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQobGFiZWwpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudGF0aW9uOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmQ2hlY2tCb3hMaXN0ZW5lcik7Ci0KLQkJZkNoZWNrQm94ZXMucHV0KGNoZWNrQm94LCBrZXkpOwotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNpemUgMjogLSBmaXJzdCBlbGVtZW50IGlzIG9mIHR5cGUKLQkgKiA8Y29kZT5MYWJlbDwvY29kZT4tIHNlY29uZCBlbGVtZW50IGlzIG9mIHR5cGUgPGNvZGU+VGV4dDwvY29kZT4KLQkgKiBVc2UgPGNvZGU+Z2V0TGFiZWxDb250cm9sPC9jb2RlPiBhbmQgPGNvZGU+Z2V0VGV4dENvbnRyb2w8L2NvZGU+IHRvCi0JICogZ2V0IHRoZSAyIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgQ29udHJvbFtdIGFkZExhYmVsbGVkVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtleSwgaW50IHRleHRMaW1pdCwgaW50IGluZGVudGF0aW9uLCBib29sZWFuIGlzTnVtYmVyKSB7Ci0JCUxhYmVsIGxhYmVsQ29udHJvbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWxDb250cm9sLnNldFRleHQobGFiZWwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnRhdGlvbjsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCVRleHQgdGV4dENvbnRyb2wgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHModGV4dENvbnRyb2wsIHRleHRMaW1pdCArIDEpOwotCQl0ZXh0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGV4dENvbnRyb2wuc2V0VGV4dExpbWl0KHRleHRMaW1pdCk7Ci0JCWZUZXh0RmllbGRzLnB1dCh0ZXh0Q29udHJvbCwga2V5KTsKLQkJaWYgKGlzTnVtYmVyKSB7Ci0JCQlmTnVtYmVyRmllbGRzLmFkZCh0ZXh0Q29udHJvbCk7Ci0JCQl0ZXh0Q29udHJvbC5hZGRNb2RpZnlMaXN0ZW5lcihmTnVtYmVyRmllbGRMaXN0ZW5lcik7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0Q29udHJvbC5hZGRNb2RpZnlMaXN0ZW5lcihmVGV4dEZpZWxkTGlzdGVuZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBDb250cm9sW117bGFiZWxDb250cm9sLCB0ZXh0Q29udHJvbH07Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgYWRkVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtleSwgaW50IHRleHRMaW1pdCwgaW50IGluZGVudGF0aW9uLCBib29sZWFuIGlzTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRUZXh0Q29udHJvbChhZGRMYWJlbGxlZFRleHRGaWVsZChjb21wb3NpdGUsIGxhYmVsLCBrZXksIHRleHRMaW1pdCwgaW5kZW50YXRpb24sIGlzTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgc3RhdHVzIHRvIHRoZSBzdGF0dXMgbGluZSBvZiBhIGRpYWxvZyBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseVRvU3RhdHVzTGluZShJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5PSyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkgewotCQkJCQltZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG51bGwpOwotCQkJCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4KLQkgKiBudW1iZXIgb2YgY2hhcmFjdGVycy4gVGhpcyBtZXRob2Qgd2FzIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGEKLQkgKiAgICAgICAgICAgIGNvbnRyb2wgaW4gdGhlIHBhZ2UKLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgKi8KLQlwcml2YXRlIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoQ29udHJvbCB0ZXN0Q29udHJvbCwgaW50IGNoYXJzKSB7Ci0JCS8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLQkJR0MgZ2MgPSBuZXcgR0ModGVzdENvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCi0JCS8vIHRlc3QgZm9yIGZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmb250TWV0cmljcywgY2hhcnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZk1haW5QcmVmZXJlbmNlUGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZVBhZ2UgZ2V0TWFpblByZWZlcmVuY2VQYWdlKCkgewotCQlyZXR1cm4gZk1haW5QcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZPdmVybGF5U3RvcmUuCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIFRleHQgZ2V0VGV4dENvbnRyb2woQ29udHJvbFtdIGxhYmVsbGVkVGV4dEZpZWxkKSB7Ci0JCXJldHVybiAoVGV4dCkgbGFiZWxsZWRUZXh0RmllbGRbMV07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJSXRlcmF0b3IgZSA9IGZDaGVja0JveGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmQ2hlY2tCb3hlcy5nZXQoYik7Ci0JCQliLnNldFNlbGVjdGlvbihmT3ZlcmxheVN0b3JlLmdldEJvb2xlYW4oa2V5KSk7Ci0JCX0KLQotCQllID0gZlRleHRGaWVsZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlUZXh0IHQgPSAoVGV4dCkgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZlRleHRGaWVsZHMuZ2V0KHQpOwotCQkJdC5zZXRUZXh0KGZPdmVybGF5U3RvcmUuZ2V0U3RyaW5nKGtleSkpOwotCQl9Ci0JfQotCi0Jdm9pZCBudW1iZXJGaWVsZENoYW5nZWQoVGV4dCB0ZXh0Q29udHJvbCkgewotCQlTdHJpbmcgbnVtYmVyID0gdGV4dENvbnRyb2wuZ2V0VGV4dCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlUG9zaXRpdmVOdW1iZXIobnVtYmVyKTsKLQkJaWYgKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkKLQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZlRleHRGaWVsZHMuZ2V0KHRleHRDb250cm9sKSwgbnVtYmVyKTsKLQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1haW5QcmVmZXJlbmNlUGFnZQotCSAqICAgICAgICAgICAgVGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UgdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1haW5QcmVmZXJlbmNlUGFnZShQcmVmZXJlbmNlUGFnZSBtYWluUHJlZmVyZW5jZVBhZ2UpIHsKLQkJZk1haW5QcmVmZXJlbmNlUGFnZSA9IG1haW5QcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3ZlcmxheVN0b3JlCi0JICogICAgICAgICAgICBUaGUgZk92ZXJsYXlTdG9yZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3ZlcmxheVN0b3JlKE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgb3ZlcmxheVN0b3JlKSB7Ci0JCWZPdmVybGF5U3RvcmUgPSBvdmVybGF5U3RvcmU7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHN0YXR1cyBvZiBtYWluIHByZWZlcmVuY2UgcGFnZQotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTnVtYmVyRmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGZOdW1iZXJGaWVsZHMuZ2V0KGkpOwotCQkJCUlTdGF0dXMgcyA9IHZhbGlkYXRlUG9zaXRpdmVOdW1iZXIodGV4dC5nZXRUZXh0KCkpOwotCQkJCXN0YXR1cyA9IHMuZ2V0U2V2ZXJpdHkoKSA+IHN0YXR1cy5nZXRTZXZlcml0eSgpID8gcyA6IHN0YXR1czsKLQkJCX0KLQkJfQotCi0JCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0VmFsaWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQkJYXBwbHlUb1N0YXR1c0xpbmUoc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQb3NpdGl2ZU51bWJlcihTdHJpbmcgbnVtYmVyKSB7Ci0JCVN0YXR1c0luZm8gc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJaWYgKG51bWJlci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdGF0dXMuc2V0RXJyb3IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3KTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotCQkJCWlmICh2YWx1ZSA8IDApCi0JCQkJCXN0YXR1cy5zZXRFcnJvcihudW1iZXIgKyBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuc2V0RXJyb3IobnVtYmVyICsgU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvckVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjRkNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQSAiYnV0dG9uIiBvZiBhIGNlcnRhaW4gY29sb3IgZGV0ZXJtaW5lZCBieSB0aGUgY29sb3IgcGlja2VyLgotICovCi1wdWJsaWMgY2xhc3MgQ29sb3JFZGl0b3IgewotCUJ1dHRvbiBmQnV0dG9uOwotCUNvbG9yIGZDb2xvcjsKLQlSR0IgZkNvbG9yVmFsdWU7Ci0KLQlwcml2YXRlIFBvaW50IGZFeHRlbnQ7Ci0JSW1hZ2UgZkltYWdlOwotCi0JcHVibGljIENvbG9yRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlmQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJZkV4dGVudCA9IGNvbXB1dGVJbWFnZVNpemUocGFyZW50KTsKLQkJZkltYWdlID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIGZFeHRlbnQueCwgZkV4dGVudC55KTsKLQotCQlHQyBnYyA9IG5ldyBHQyhmSW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZCdXR0b24uZ2V0QmFja2dyb3VuZCgpKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBmRXh0ZW50LngsIGZFeHRlbnQueSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQotCQlmQnV0dG9uLnNldEltYWdlKGZJbWFnZSk7Ci0KLQkJLy8gYnVnMjU0MSAtIGFzc29jaWF0ZSBjb2xvciB2YWx1ZSB0byBidXR0b24ncyB2YWx1ZSBmaWVsZAotCQlmQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyI2dldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGdldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikgewotCQkJCQlpZiAoZ2V0Q29sb3JWYWx1ZSgpICE9IG51bGwpCi0JCQkJCQllLnJlc3VsdCA9IGdldENvbG9yVmFsdWUoKS50b1N0cmluZygpOwotCQkJCQllbHNlCi0JCQkJCQllLnJlc3VsdCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhmQnV0dG9uLmdldFNoZWxsKCkpOwotCQkJCWNvbG9yRGlhbG9nLnNldFJHQihmQ29sb3JWYWx1ZSk7Ci0JCQkJUkdCIG5ld0NvbG9yID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChuZXdDb2xvciAhPSBudWxsKSB7Ci0JCQkJCWZDb2xvclZhbHVlID0gbmV3Q29sb3I7Ci0JCQkJCXVwZGF0ZUNvbG9ySW1hZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCdXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZkltYWdlICE9IG51bGwpIHsKLQkJCQkJZkltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJZkltYWdlID0gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKGZDb2xvciAhPSBudWxsKSB7Ci0JCQkJCWZDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCWZDb2xvciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZUltYWdlU2l6ZShDb250cm9sIHdpbmRvdykgewotCQlHQyBnYyA9IG5ldyBHQyh3aW5kb3cpOwotCQlGb250IGYgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKTsKLQkJZ2Muc2V0Rm9udChmKTsKLQkJaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJUG9pbnQgcCA9IG5ldyBQb2ludChoZWlnaHQgKiAzIC0gNiwgaGVpZ2h0KTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHVibGljIEJ1dHRvbiBnZXRCdXR0b24oKSB7Ci0JCXJldHVybiBmQnV0dG9uOwotCX0KLQotCXB1YmxpYyBSR0IgZ2V0Q29sb3JWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDb2xvclZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbG9yVmFsdWUoUkdCIHJnYikgewotCQlmQ29sb3JWYWx1ZSA9IHJnYjsKLQkJdXBkYXRlQ29sb3JJbWFnZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbG9ySW1hZ2UoKSB7Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gZkJ1dHRvbi5nZXREaXNwbGF5KCk7Ci0KLQkJR0MgZ2MgPSBuZXcgR0MoZkltYWdlKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDIsIGZFeHRlbnQueCAtIDEsIGZFeHRlbnQueSAtIDQpOwotCi0JCWlmIChmQ29sb3IgIT0gbnVsbCkKLQkJCWZDb2xvci5kaXNwb3NlKCk7Ci0KLQkJZkNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIGZDb2xvclZhbHVlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChmQ29sb3IpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDEsIDMsIGZFeHRlbnQueCAtIDIsIGZFeHRlbnQueSAtIDUpOwotCQlnYy5kaXNwb3NlKCk7Ci0KLQkJZkJ1dHRvbi5zZXRJbWFnZShmSW1hZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWVmZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29sb3JIZWxwZXIgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPTEQgPSAiYm9sZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gUkdCIFN0cmluZyBnaXZlbiB0aGUgaW50IHIsIGcsIGIgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29sb3JTdHJpbmcoaW50IHIsIGludCBnLCBpbnQgYikgewotCQlyZXR1cm4gIiMiICsgZ2V0SGV4U3RyaW5nKHIsIDIpICsgZ2V0SGV4U3RyaW5nKGcsIDIpICsgZ2V0SGV4U3RyaW5nKGIsIDIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SGV4U3RyaW5nKGludCB2YWx1ZSwgaW50IG1pbldpZHRoKSB7Ci0JCVN0cmluZyBoZXhTdHJpbmcgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZhbHVlKTsKLQkJZm9yIChpbnQgaSA9IGhleFN0cmluZy5sZW5ndGgoKTsgaSA8IG1pbldpZHRoOyBpKyspIHsKLQkJCWhleFN0cmluZyA9ICIwIiArIGhleFN0cmluZzsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGhleFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBwcmVmZXJlbmNlIHN0cmluZyB0byBiZSBwbGFjZWQgaW4gcHJlZmVyZW5jZXMgZnJvbSB0aGUKLQkgKiBnaXZlbiBTdHJpbmcgYXJyYXkuCi0JICogCi0JICogQHBhcmFtIHN0eWxlUHJlZnMKLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwgYW5kIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBTdHJpbmdbMF0gPQotCSAqICAgICAgICAgICAgRm9yZWdyb3VuZCBSR0IgU3RyaW5nLCBTdHJpbmdbMV0gPSBCYWNrZ3JvdW5kIFJHQiBTdHJpbmcsCi0JICogICAgICAgICAgICBTdHJpbmdbMl0gPSBCb2xkIHRydWUvZmFsc2UKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyBpbiB0aGUgZm9ybSBvZiBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcgfCBCYWNrZ3JvdW5kIFJHQgotCSAqICAgICAgICAgU3RyaW5nIHwgQm9sZCB0cnVlL2ZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja1N0eWxlUHJlZmVyZW5jZXMoU3RyaW5nW10gc3R5bGVQcmVmcykgewotCQlTdHJpbmdCdWZmZXIgc3R5bGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID09IDMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0JCQkJU3RyaW5nIHMgPSBzdHlsZVByZWZzW2ldOwotCQkJCXN0eWxlU3RyaW5nLmFwcGVuZChzKTsKLQotCQkJCS8vIGFkZCBpbiB0aGUgc2VwYXJhdG9yIChleGNlcHQgb24gbGFzdCBpdGVyYXRpb24pCi0JCQkJaWYgKGkgIT0gMikgewotCQkJCQlzdHlsZVN0cmluZy5hcHBlbmQoIiAiICsgU1RZTEVfU0VQQVJBVE9SICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN0eWxlU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCCi0JICogQHBhcmFtIGFuUkdCU3RyaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBSR0IgdG9SR0IoU3RyaW5nIGFuUkdCU3RyaW5nKSB7Ci0JCVJHQiByZXN1bHQgPSBudWxsOwotCQlpZiAoYW5SR0JTdHJpbmcubGVuZ3RoKCkgPiA2ICYmIGFuUkdCU3RyaW5nLmNoYXJBdCgwKSA9PSAnIycpIHsKLQkJCWludCByID0gMDsKLQkJCWludCBnID0gMDsKLQkJCWludCBiID0gMDsKLQkJCXRyeSB7Ci0JCQkJciA9IEludGVnZXIudmFsdWVPZihhblJHQlN0cmluZy5zdWJzdHJpbmcoMSwgMyksIDE2KS5pbnRWYWx1ZSgpOwotCQkJCWcgPSBJbnRlZ2VyLnZhbHVlT2YoYW5SR0JTdHJpbmcuc3Vic3RyaW5nKDMsIDUpLCAxNikuaW50VmFsdWUoKTsKLQkJCQliID0gSW50ZWdlci52YWx1ZU9mKGFuUkdCU3RyaW5nLnN1YnN0cmluZyg1LCA3KSwgMTYpLmludFZhbHVlKCk7Ci0JCQkJcmVzdWx0ID0gbmV3IFJHQihyLCBnLCBiKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZkV4YykgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlIGZvciBjb2xvciAiICsgYW5SR0JTdHJpbmcsIG5mRXhjKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYW5SR0IKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1JHQlN0cmluZyhSR0IgYW5SR0IpIHsKLQkJaWYgKGFuUkdCID09IG51bGwpCi0JCQlyZXR1cm4gIiMwMDAwMDAiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlZCA9IEludGVnZXIudG9IZXhTdHJpbmcoYW5SR0IucmVkKTsKLQkJd2hpbGUgKHJlZC5sZW5ndGgoKSA8IDIpCi0JCQlyZWQgPSAiMCIgKyByZWQ7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZ3JlZW4gPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGFuUkdCLmdyZWVuKTsKLQkJd2hpbGUgKGdyZWVuLmxlbmd0aCgpIDwgMikKLQkJCWdyZWVuID0gIjAiICsgZ3JlZW47Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgYmx1ZSA9IEludGVnZXIudG9IZXhTdHJpbmcoYW5SR0IuYmx1ZSk7Ci0JCXdoaWxlIChibHVlLmxlbmd0aCgpIDwgMikKLQkJCWJsdWUgPSAiMCIgKyBibHVlOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICIjIiArIHJlZCArIGdyZWVuICsgYmx1ZTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIGZvcmVncm91bmQgKFJHQiBTdHJpbmcpLCBiYWNrZ3JvdW5kIChSR0IgU3RyaW5nKSwgYm9sZAotCSAqIChib29sZWFuIFN0cmluZykgZnJvbSB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcgfCBCYWNrZ3JvdW5kCi0JICogICAgICAgICAgICBSR0IgU3RyaW5nIHwgQm9sZCB0cnVlL2ZhbHNlCi0JICogQHJldHVybiBTdHJpbmdbXSB3aGVyZSBTdHJpbmdbMF0gPSBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1sxXSA9Ci0JICogICAgICAgICBCYWNrZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1syXSA9IEJvbGQgdHJ1ZS9mYWxzZSBPUiBudWxsIGlmCi0JICogICAgICAgICByYW4gaW50byBwcm9ibGVtcyBleHRyYWN0aW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB1bnBhY2tTdHlsZVByZWZlcmVuY2VzKFN0cmluZyBwcmVmZXJlbmNlKSB7Ci0JCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBudWxsOwotCQlpZiAocHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByZWZlcmVuY2UsIFNUWUxFX1NFUEFSQVRPUik7Ci0JCQlpZiAoc3QuY291bnRUb2tlbnMoKSA9PSAzKSB7Ci0JCQkJU3RyaW5nIGZvcmVncm91bmQgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJU3RyaW5nIGJhY2tncm91bmQgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJU3RyaW5nIGJvbGQgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0KLQkJCQlzdHlsZVByZWZzID0gbmV3IFN0cmluZ1szXTsKLQkJCQlzdHlsZVByZWZzWzBdID0gZm9yZWdyb3VuZDsKLQkJCQlzdHlsZVByZWZzWzFdID0gYmFja2dyb3VuZDsKLQkJCQlzdHlsZVByZWZzWzJdID0gYm9sZDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdHlsZVByZWZzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvck5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDYwOTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvck5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbG9yTmFtZXMgewotCVN0cmluZyBCQUNLR1JPVU5EID0gImJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJPTEQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09MT1IgPSAiY29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQ09MT1JTID0gImNvbG9ycyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0VtcHR5RmlsZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjRiMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0VtcHR5RmlsZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IFNTRVVJTWVzc2FnZXMuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMDsgLy8kTk9OLU5MUy0xJAotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQkvLyBzb21lIHRoZW1lcyBvbiBHVEsgaGF2ZSBkaWZmZXJlbnQgYmFja2dyb3VuZCBjb2xvcnMgZm9yIFRleHQgYW5kIExhYmVscwotCQl0ZXh0LnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0JCXRleHQuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0KLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcGFyZW50IHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShzYzEsIDEpOwotCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCi0JCS8vIG5vdCBjYWxsaW5nIHNldFNpemUgZm9yIGNvbXBvc2l0ZSB3aWxsIHJlc3VsdCBpbiBhIGJsYW5rIGNvbXBvc2l0ZSwKLQkJLy8gc28gY2FsbGluZyBpdCBoZXJlIGluaXRpYWxseQotCQkvLyBzZXRTaXplIGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBhbGwgY29udHJvbHMgYXJlIGNyZWF0ZWQsCi0JCS8vIHNvIHNjcm9sbGVkQ29tcG9zaXRlCi0JCS8vIGhhcyBjb3JyZWN0IG1pblNpemUKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJLy8gTm90ZTogVGhlIGZvbnQgaXMgc2V0IGhlcmUgaW4gYW50aWNpcGF0aW9uIHRoYXQgdGhlIGNsYXNzIGluaGVyaXRpbmcKLQkJCS8vICAgICAgIHRoaXMgYmFzZSBjbGFzcyBtYXkgYWRkIHdpZGdldHMgdG8gdGhlIGRpYWxvZy4gICBzZXRTaXplCi0JCQkvLyAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB3ZSBnbyBsaXZlLgotCQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQlQb2ludCBtaW5TaXplID0gY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQljb21wb3NpdGUuc2V0U2l6ZShtaW5TaXplKTsKLQkJCS8vIHNldCBzY3JvbGxiYXIgY29tcG9zaXRlJ3MgbWluIHNpemUgc28gcGFnZSBpcyBleHBhbmRhYmxlIGJ1dAotCQkJLy8gaGFzIHNjcm9sbGJhcnMgd2hlbiBuZWVkZWQKLQkJCWlmIChjb21wb3NpdGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgewotCQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29tcG9zaXRlLmdldFBhcmVudCgpOwotCQkJCXNjMS5zZXRNaW5TaXplKG1pblNpemUpOwotCQkJCXNjMS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQkJCXNjMS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9GaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9GaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1YWY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRmlsZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlRhYkZvbGRlckxheW91dDsKLQotcHVibGljIGNsYXNzIEZpbGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VUYWJbXSBmVGFicyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5GaWxlUHJlZmVyZW5jZVBhZ2VfMDsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIGRlc2NyaXB0aW9uKTsKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlUYWJGb2xkZXIgZm9sZGVyID0gbmV3IFRhYkZvbGRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZm9sZGVyLnNldExheW91dChuZXcgVGFiRm9sZGVyTGF5b3V0KCkpOwotCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLS8vCQlUYWJJdGVtIHRhc2tJdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0vLwkJSVByZWZlcmVuY2VUYWIgdGFza3NUYWIgPSBuZXcgVGFza1RhZ1ByZWZlcmVuY2VUYWIoKTsKLS8vCQl0YXNrSXRlbS5zZXRUZXh0KHRhc2tzVGFiLmdldFRpdGxlKCkpOwotLy8JCUNvbnRyb2wgdGFza1RhZ3MgPSB0YXNrc1RhYi5jcmVhdGVDb250ZW50cyhmb2xkZXIpOwotLy8JCXRhc2tJdGVtLnNldENvbnRyb2wodGFza1RhZ3MpOwotCi0JCVRhYkl0ZW0gdHJhbnNsdWNlbmNlSXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlJUHJlZmVyZW5jZVRhYiB0cmFuc2x1Y2VuY2VUYWIgPSBuZXcgVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYih0aGlzKTsKLQkJdHJhbnNsdWNlbmNlSXRlbS5zZXRUZXh0KHRyYW5zbHVjZW5jZVRhYi5nZXRUaXRsZSgpKTsKLQkJQ29udHJvbCB0cmFuc2x1Y2VuY2VDb250cm9sID0gdHJhbnNsdWNlbmNlVGFiLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcik7Ci0JCXRyYW5zbHVjZW5jZUl0ZW0uc2V0Q29udHJvbCh0cmFuc2x1Y2VuY2VDb250cm9sKTsKLQotCQlmVGFicyA9IG5ldyBJUHJlZmVyZW5jZVRhYltdey8qdGFza3NUYWIsKi8gdHJhbnNsdWNlbmNlVGFifTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGRlc2t0b3ApIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybUFwcGx5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXN1cGVyLnBlcmZvcm1BcHBseSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFic1tpXS5wZXJmb3JtQXBwbHkoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFic1tpXS5wZXJmb3JtT2soKTsKLQkJfQotCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIG9rOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9JUHJlZmVyZW5jZVRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0lQcmVmZXJlbmNlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDQxMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0lQcmVmZXJlbmNlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZVRhYiB7Ci0KLQlDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSB0YWJGb2xkZXIpOwotCi0JU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQl2b2lkIHBlcmZvcm1BcHBseSgpOwotCi0Jdm9pZCBwZXJmb3JtRGVmYXVsdHMoKTsKLQotCXZvaWQgcGVyZm9ybU9rKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RhdHVzSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0YXR1c0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNWJiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RhdHVzSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci0KLS8qKgotICogQSBzZXR0YWJsZSBJU3RhdHVzLiBDYW4gYmUgYW4gZXJyb3IsIHdhcm5pbmcsIGluZm8gb3Igb2suIEZvciBlcnJvciwgaW5mbwotICogYW5kIHdhcm5pbmcgc3RhdGVzLCBhIG1lc3NhZ2UgZGVzY3JpYmVzIHRoZSBwcm9ibGVtLgotICogCi0gKiBUaGlzIGNsYXNzIHdhcyBjb3BpZWQgZnJvbSBvdGhlciBTdGF0dXNJbmZvIGNsYXNzZXMgdGhhdCBhcmUgbG9jYXRlZCBpbgotICogaW50ZXJuYWwgcGFja2FnZXMKLSAqLwotY2xhc3MgU3RhdHVzSW5mbyBpbXBsZW1lbnRzIElTdGF0dXMgewotCS8qKiBUaGUgc2V2ZXJpdHkgb2YgdGhpcyBzdGF0dXMuICovCi0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5OwotCi0JLyoqIFRoZSBtZXNzYWdlIG9mIHRoaXMgc3RhdHVzLiAqLwotCXByaXZhdGUgU3RyaW5nIGZTdGF0dXNNZXNzYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0YXR1cyBzZXQgdG8gT0sgKG5vIG1lc3NhZ2UpLgotCSAqLwotCXB1YmxpYyBTdGF0dXNJbmZvKCkgewotCQl0aGlzKE9LLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RhdHVzIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGFuZCBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqICAgICAgICAgICAgdGhlIHNldmVyaXR5IG9mIHRoaXMgc3RhdHVzOiBFUlJPUiwgV0FSTklORywgSU5GTyBhbmQgT0suCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIG9mIHRoaXMgc3RhdHVzLiBBcHBsaWVzIG9ubHkgZm9yIEVSUk9SLCBXQVJOSU5HCi0JICogICAgICAgICAgICBhbmQgSU5GTy4KLQkgKi8KLQlwdWJsaWMgU3RhdHVzSW5mbyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWZTdGF0dXNNZXNzYWdlID0gbWVzc2FnZTsKLQkJZlNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHNlZSBJU3RhdHVzI2dldENoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IElTdGF0dXNbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbHdheXMgdGhlIGVycm9yIHNldmVyaXR5LgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNnZXRDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvZGUoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHNlZSBJU3RhdHVzI2dldEV4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RhdHVzI2dldE1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZTdGF0dXNNZXNzYWdlOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RhdHVzI2dldFBsdWdpbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBFZGl0b3JzVUkuUExVR0lOX0lEOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gZlNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0YXR1cyBpbmRpY2F0ZXMgYW4gZXJyb3IuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YXR1cyBoYXMgc2V2ZXJpdHkKLQkgKiAgICAgICAgIHtAbGluayBJU3RhdHVzI0VSUk9SfWFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0YXR1cyBpbmRpY2F0ZXMgYW4gaW5mby4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc3RhdHVzIGhhcyBzZXZlcml0eQotCSAqICAgICAgICAge0BsaW5rIElTdGF0dXMjSU5GT31hbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5mbygpIHsKLQkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLklORk87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbHdheXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNpc011bHRpU3RhdHVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2lzT0soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT0soKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5PSzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzdGF0dXMgaW5kaWNhdGVzIGEgd2FybmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc3RhdHVzIGhhcyBzZXZlcml0eQotCSAqICAgICAgICAge0BsaW5rIElTdGF0dXMjV0FSTklOR31hbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkc7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdGF0dXMjbWF0Y2hlcyhpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhpbnQgc2V2ZXJpdHlNYXNrKSB7Ci0JCXJldHVybiAoZlNldmVyaXR5ICYgc2V2ZXJpdHlNYXNrKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cyB0byBFUlJPUi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZSB3aGljaCBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nLCBidXQgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChlcnJvck1lc3NhZ2UpOwotCQlmU3RhdHVzTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQkJZlNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gSU5GTy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5mb01lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBpbmZvIG1lc3NhZ2Ugd2hpY2ggY2FuIGJlIGFuIGVtcHR5IHN0cmluZywgYnV0IG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBpbmZvTWVzc2FnZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGluZm9NZXNzYWdlKTsKLQkJZlN0YXR1c01lc3NhZ2UgPSBpbmZvTWVzc2FnZTsKLQkJZlNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cyB0byBPSy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPSygpIHsKLQkJZlN0YXR1c01lc3NhZ2UgPSBudWxsOwotCQlmU2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cyB0byBXQVJOSU5HLgotCSAqIAotCSAqIEBwYXJhbSB3YXJuaW5nTWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIHdhcm5pbmcgbWVzc2FnZSB3aGljaCBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nLCBidXQgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdhcm5pbmcoU3RyaW5nIHdhcm5pbmdNZXNzYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwod2FybmluZ01lc3NhZ2UpOwotCQlmU3RhdHVzTWVzc2FnZSA9IHdhcm5pbmdNZXNzYWdlOwotCQlmU2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiYmQ1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlRhYkZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMuQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIEd1dHRlZCB2ZXJzaW9uIG9mIEphdmFFZGl0b3JQcmVmZXJlbmNlUGFnZQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIENvbG9yRWRpdG9yIGZBcHBlYXJhbmNlQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBMaXN0IGZBcHBlYXJhbmNlQ29sb3JMaXN0OwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXVtdIGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWwgPSBuZXcgU3RyaW5nW11bXXt7U1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUU19DT0xPUn19OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNYXAgZkNoZWNrQm94ZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkNoZWNrQm94TGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQlmT3ZlcmxheVN0b3JlLnNldFZhbHVlKChTdHJpbmcpIGZDaGVja0JveGVzLmdldChidXR0b24pLCBidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgTWFwIGZDb2xvckJ1dHRvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZk51bWJlckZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQkvKiogQnV0dG9uIGNvbnRyb2xsaW5nIGRlZmF1bHQgc2V0dGluZyBvZiB0aGUgc2VsZWN0ZWQgcmVmZXJlbmNlIHByb3ZpZGVyLiAqLwotCS8vIFRPRE86IHByaXZhdGUgZmllbGQgbmV2ZXIgcmVhZCBsb2NhbGx5Ci0JQnV0dG9uIGZTZXREZWZhdWx0QnV0dG9uOwotCXByaXZhdGUgSVByZWZlcmVuY2VUYWJbXSBmVGFicyA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlRleHRGaWVsZHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV82KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQcmVmZXJlbmNlU3RvcmUoU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQotCQlmT3ZlcmxheVN0b3JlID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCksIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYWRkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnQgaW5kZW50YXRpb24pIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQobGFiZWwpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudGF0aW9uOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmQ2hlY2tCb3hMaXN0ZW5lcik7Ci0KLQkJZkNoZWNrQm94ZXMucHV0KGNoZWNrQm94LCBrZXkpOwotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBzdGF0dXMgdG8gdGhlIHN0YXR1cyBsaW5lIG9mIGEgZGlhbG9nIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlUb1N0YXR1c0xpbmUoRGlhbG9nUGFnZSBwYWdlLCBJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5PSyA6Ci0JCQkJcGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJcGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJcGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkgewotCQkJCQltZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0JCQkJcGFnZS5zZXRNZXNzYWdlKG51bGwpOwotCQkJCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUFwcGVhcmFuY2VQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGFwcGVhcmFuY2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJYXBwZWFyYW5jZUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlTdHJpbmcgbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjA7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQ2hlY2tCb3goYXBwZWFyYW5jZUNvbXBvc2l0ZSwgbGFiZWwsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUUywgMCk7Ci0KLQkJbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzA7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQ2hlY2tCb3goYXBwZWFyYW5jZUNvbXBvc2l0ZSwgbGFiZWwsIENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMsIDApOwotCi0JCVByZWZlcmVuY2VMaW5rQXJlYSBjb250ZW50VHlwZUFyZWEgPSBuZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGFwcGVhcmFuY2VDb21wb3NpdGUsIFNXVC5OT05FLCAiVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIiwgU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQwLCAoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWNvbnRlbnRUeXBlQXJlYS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOTsKLQkJYWRkQ2hlY2tCb3goYXBwZWFyYW5jZUNvbXBvc2l0ZSwgbGFiZWwsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5TSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRywgMCk7Ci0KLQkJbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzsKLQkJYWRkQ2hlY2tCb3goYXBwZWFyYW5jZUNvbXBvc2l0ZSwgbGFiZWwsIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5GT0xESU5HX0VOQUJMRUQsIDApOwotCi0JCUxhYmVsIGwgPSBuZXcgTGFiZWwoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdkLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEpIC8gMjsKLQkJbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlsID0gbmV3IExhYmVsKGFwcGVhcmFuY2VDb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMyk7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbXBvc2l0ZSBlZGl0b3JDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGFwcGVhcmFuY2VDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZWRpdG9yQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllZGl0b3JDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZkFwcGVhcmFuY2VDb2xvckxpc3QgPSBuZXcgTGlzdChlZGl0b3JDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWZBcHBlYXJhbmNlQ29sb3JMaXN0LnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbXBvc2l0ZSBzdHlsZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGVkaXRvckNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzdHlsZXNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXN0eWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlsID0gbmV3IExhYmVsKHN0eWxlc0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkvLyBuZWVkcyB0byBiZSBtYWRlIGZpbmFsIHNvIGxhYmVsIGNhbiBiZSBzZXQgaW4KLQkJLy8gZm9yZWdyb3VuZGNvbG9yYnV0dG9uJ3MgYWNjIGxpc3RlbmVyCi0JCWZpbmFsIFN0cmluZyBidXR0b25MYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yNDsgLy8kTk9OLU5MUy0xJCAKLQkJbC5zZXRUZXh0KGJ1dHRvbkxhYmVsKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmQXBwZWFyYW5jZUNvbG9yRWRpdG9yID0gbmV3IENvbG9yRWRpdG9yKHN0eWxlc0NvbXBvc2l0ZSk7Ci0JCUJ1dHRvbiBmb3JlZ3JvdW5kQ29sb3JCdXR0b24gPSBmQXBwZWFyYW5jZUNvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlmb3JlZ3JvdW5kQ29sb3JCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZkFwcGVhcmFuY2VDb2xvckxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVBcHBlYXJhbmNlQ29sb3JMaXN0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQlmb3JlZ3JvdW5kQ29sb3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgaSA9IGZBcHBlYXJhbmNlQ29sb3JMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJU3RyaW5nIGtleSA9IGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWxbaV1bMV07Ci0KLQkJCQlQcmVmZXJlbmNlQ29udmVydGVyLnNldFZhbHVlKGZPdmVybGF5U3RvcmUsIGtleSwgZkFwcGVhcmFuY2VDb2xvckVkaXRvci5nZXRDb2xvclZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQkvLyBidWcyNTQxIC0gYXNzb2NpYXRlIGNvbG9yIGxhYmVsIHRvIGJ1dHRvbidzIGxhYmVsIGZpZWxkCi0JCWZvcmVncm91bmRDb2xvckJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gYnV0dG9uTGFiZWw7Ci0JCQl9Ci0JCX0pOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlBSRUZTVEVfQVBQRUFSQU5DRV9IRUxQSUQpOwotCQlyZXR1cm4gYXBwZWFyYW5jZUNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gbmVlZCB0byBjcmVhdGUgdGFicyBiZWZvcmUgbG9hZGluZy9zdGFydGluZyBvdmVybGF5c3RvcmUgaW4gY2FzZQotCQkvLyB0YWJzIGFsc28gYWRkIHZhbHVlcwotCQlJUHJlZmVyZW5jZVRhYiBob3ZlcnNUYWIgPSBuZXcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYih0aGlzLCBmT3ZlcmxheVN0b3JlKTsKLQotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCi0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7Ci0JCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8wKTsgLy8kTk9OLU5MUy0xJAotCQlpdGVtLnNldENvbnRyb2woY3JlYXRlQXBwZWFyYW5jZVBhZ2UoZm9sZGVyKSk7Ci0KLQkJaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoaG92ZXJzVGFiLmdldFRpdGxlKCkpOwotCQlpdGVtLnNldENvbnRyb2woaG92ZXJzVGFiLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcikpOwotCi0JCWZUYWJzID0gbmV3IElQcmVmZXJlbmNlVGFiW117aG92ZXJzVGFifTsKLQotCQlpbml0aWFsaXplKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChmb2xkZXIpOwotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotCQkvLyBJSmF2YUhlbHBDb250ZXh0SWRzLkpBVkFfRURJVE9SX1BSRUZFUkVOQ0VfUEFHRSk7Ci0JfQotCi0JcHJpdmF0ZSBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUU19DT0xPUikpOwotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUUykpOwotCi0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUykpOwotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIEVkaXRvclByZWZlcmVuY2VOYW1lcy5TSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRykpOwotCi0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCkpOwotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qCi0JICogQHNlZSBEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQkJZk92ZXJsYXlTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKSB7Ci0JCWludCBpID0gZkFwcGVhcmFuY2VDb2xvckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIGtleSA9IGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWxbaV1bMV07Ci0JCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGZPdmVybGF5U3RvcmUsIGtleSk7Ci0JCWZBcHBlYXJhbmNlQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShyZ2IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWwubGVuZ3RoOyBpKyspCi0JCQlmQXBwZWFyYW5jZUNvbG9yTGlzdC5hZGQoZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbFtpXVswXSk7Ci0JCWZBcHBlYXJhbmNlQ29sb3JMaXN0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChmQXBwZWFyYW5jZUNvbG9yTGlzdCAhPSBudWxsICYmICFmQXBwZWFyYW5jZUNvbG9yTGlzdC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZkFwcGVhcmFuY2VDb2xvckxpc3Quc2VsZWN0KDApOwotCQkJCQloYW5kbGVBcHBlYXJhbmNlQ29sb3JMaXN0U2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJSXRlcmF0b3IgZSA9IGZDb2xvckJ1dHRvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlDb2xvckVkaXRvciBjID0gKENvbG9yRWRpdG9yKSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmQ29sb3JCdXR0b25zLmdldChjKTsKLQkJCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGZPdmVybGF5U3RvcmUsIGtleSk7Ci0JCQljLnNldENvbG9yVmFsdWUocmdiKTsKLQkJfQotCi0JCWUgPSBmQ2hlY2tCb3hlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGIpOwotCQkJYi5zZXRTZWxlY3Rpb24oZk92ZXJsYXlTdG9yZS5nZXRCb29sZWFuKGtleSkpOwotCQl9Ci0KLQkJZSA9IGZUZXh0RmllbGRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJVGV4dCB0ID0gKFRleHQpIGUubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGZUZXh0RmllbGRzLmdldCh0KTsKLQkJCXQuc2V0VGV4dChmT3ZlcmxheVN0b3JlLmdldFN0cmluZyhrZXkpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybUFwcGx5KCk7Ci0JCX0KLQkJc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmT3ZlcmxheVN0b3JlLmxvYWREZWZhdWx0cygpOwotCi0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQotCQloYW5kbGVBcHBlYXJhbmNlQ29sb3JMaXN0U2VsZWN0aW9uKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gbmVlZCBmb3IgYSB2aWV3ZXIKLQkJLy8gZlByZXZpZXdWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1PaygpOwotCQl9Ci0KLQkJZk92ZXJsYXlTdG9yZS5wcm9wYWdhdGUoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCS8vIHRhYiB3aWR0aCBpcyBhbHNvIGEgbW9kZWwtc2lkZSBwcmVmZXJlbmNlIHNvIG5lZWQgdG8gc2V0IGl0Ci0JCS8vIFRPRE8gbmVlZCB0byBoYW5kbGUgdGFiIHdpZHRoIGZvciBmb3JtYXR0ZXIgc29tZWhvdwotCQkvLyBpbnQgdGFiV2lkdGggPQotCQkvLyBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfVEFCX1dJRFRIKTsKLQkJLy8gTW9kZWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFCX1dJRFRILAotCQkvLyB0YWJXaWR0aCk7Ci0JCS8vIE1vZGVsUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZOdW1iZXJGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZk51bWJlckZpZWxkcy5nZXQoaSk7Ci0JCQkJSVN0YXR1cyBzID0gdmFsaWRhdGVQb3NpdGl2ZU51bWJlcih0ZXh0LmdldFRleHQoKSk7Ci0JCQkJc3RhdHVzID0gcy5nZXRTZXZlcml0eSgpID4gc3RhdHVzLmdldFNldmVyaXR5KCkgPyBzIDogc3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJc2V0VmFsaWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQkJYXBwbHlUb1N0YXR1c0xpbmUodGhpcywgc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQb3NpdGl2ZU51bWJlcihTdHJpbmcgbnVtYmVyKSB7Ci0JCVN0YXR1c0luZm8gc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJaWYgKG51bWJlci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdGF0dXMuc2V0RXJyb3IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3KTsKLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotCQkJCWlmICh2YWx1ZSA8IDApCi0JCQkJCXN0YXR1cy5zZXRFcnJvcihudW1iZXIgKyBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzgpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJc3RhdHVzLnNldEVycm9yKG51bWJlciArIFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmIwOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgY29uZmlndXJhYmxlIGJ5IHNldHRpbmcgMyBwcm9wZXJ0aWVzOiAxKSBhbiBhcnJheSBvZiBTdHJpbmdzCi0gKiBhcyB0aGUgc3R5bGVOYW1lczsgb25lIHVuaXF1ZSBlbnRyeSBmb3IgZXZlcnkgc3R5bGUgdHlwZSBtZWFudCB0byBiZQotICogY29uZmlndXJhYmxlIGJ5IHRoZSB1c2VyIDIpIGEgRGljdGlvbmFyeSBvZiBkZXNjcmlwdGlvbnMsIG1hcHBpbmcgdGhlCi0gKiBzdHlsZU5hbWVzIHRvIHVuaXF1ZSBkZXNjcmlwdGlvbnMgLSBtZWFudCBmb3IgdXNlIHdpdGhpbiB0aGUgc2VsZWN0aW9uCi0gKiBDb21ib0JveCBUT0RPIChwYSkgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgd29ya2luZyBvZmYgZG9jdW1lbnQgcGFydGl0aW9ucwotICogbm93ICgyLjErKSAzKSBhIERpY3Rpb25hcnkgbWFwcGluZyBwYXJzZWQgSVRleHRSZWdpb24gY29udGV4dHMgKHN0cmluZ3MpIHRvCi0gKiB0aGUgbG9jYWxseSBkZWZpbmVkIHN0eWxlTmFtZXMKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlZFRleHRDb2xvclBpY2tlciBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGNsYXNzIERlc2NyaXB0aW9uU29ydGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlNvcnRlciB7Ci0JCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJLyoqCi0JCQkgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lIFRoaXMgaXMKLQkJCSAqIHRoZSAnb3JkZXJpbmcnIG1ldGhvZCBvZiB0aGUgc29ydCBvcGVyYXRpb24uIEVhY2ggc3ViY2xhc3MKLQkJCSAqIG92ZXJpZGVzIHRoaXMgbWV0aG9kIHdpdGggdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JCQkgKiAnZ3JlYXRlciB0aGFuJyBjb25jZXB0IGZvciB0aGUgb2JqZWN0cyBiZWluZyBzb3J0ZWQuCi0JCQkgKi8KLQkJCXJldHVybiAoY29sbGF0b3IuY29tcGFyZShlbGVtZW50T25lLnRvU3RyaW5nKCksIGVsZW1lbnRUd28udG9TdHJpbmcoKSkpIDwgMDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1IgPSAiY29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBuYW1lcyBmb3IgcHJlZmVyZW5jZSBlbGVtZW50cyAuLi4gbm9uLU5MUwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBzaG93SXRhbGljID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgYmFja2dyb3VuZEFjY0xpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyI2dldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikgewotCQkJCWUucmVzdWx0ID0gZ2V0Q29sb3JCdXR0b25WYWx1ZShmQmFja2dyb3VuZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgbmFtZWRTdHlsZSA9IGdldFN0eWxlTmFtZShmU3R5bGVDb21iby5nZXRJdGVtKGZTdHlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCWlmIChuYW1lZFN0eWxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUud2lkZ2V0ID09IGZGb3JlZ3JvdW5kKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhnZXRQcmVmZXJlbmNlS2V5KG5hbWVkU3R5bGUpKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gY2hhbmdlQ29sb3Iob2xkVmFsdWUpOwotCi0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSksIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBmQmFja2dyb3VuZCkgewotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoZ2V0UHJlZmVyZW5jZUtleShuYW1lZFN0eWxlKSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzFdOwotCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IGNoYW5nZUNvbG9yKG9sZFZhbHVlKTsKLQotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmZXJlbmNlS2V5KG5hbWVkU3R5bGUpLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gZkJvbGQpIHsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSkpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmZXJlbmNlS2V5KG5hbWVkU3R5bGUpLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc2hvd0l0YWxpYyAmJiBlLndpZGdldCA9PSBmSXRhbGljKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhnZXRQcmVmZXJlbmNlS2V5KG5hbWVkU3R5bGUpKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbM107Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZJdGFsaWMuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbM10gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmZXJlbmNlS2V5KG5hbWVkU3R5bGUpLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gZkNsZWFyU3R5bGUpIHsKLQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRUb0RlZmF1bHQoZ2V0UHJlZmVyZW5jZUtleShuYW1lZFN0eWxlKSk7Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBjb21ib0xpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWludCBzZWxlY3RlZEluZGV4ID0gZlN0eWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IHNlbGVjdGVkSW5kZXggPj0gMCA/IGZTdHlsZUNvbWJvLmdldEl0ZW0oc2VsZWN0ZWRJbmRleCkgOiBudWxsOwotCQkJYWN0aXZhdGUoZ2V0U3R5bGVOYW1lKGRlc2NyaXB0aW9uKSk7Ci0JCX0KLQl9OwotCXByb3RlY3RlZCBCdXR0b24gZkJhY2tncm91bmQ7Ci0JcHJvdGVjdGVkIExhYmVsIGZCYWNrZ3JvdW5kTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQm9sZDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDbGVhclN0eWxlOwotCS8vIERpY3Rpb25hcnkgbWFwcGluZyB0aGUgSVRleHRSZWdpb24gdHlwZXMgYWJvdmUgdG8gY29sb3IgbmFtZXMsIHdoaWNoCi0JLy8gYXJlLCBpbiB0dXJuLCBhdHRyaWJ1dGVzCi0JcHJvdGVjdGVkIERpY3Rpb25hcnkgZkNvbnRleHRTdHlsZU1hcCA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbG9yIGZEZWZhdWx0QmFja2dyb3VuZCA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQotCXByb3RlY3RlZCBDb2xvciBmRGVmYXVsdEZvcmVncm91bmQgPSBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JLy8gRGljdGlvbmFyeSBtYXBwaW5nIHRoZSBJVGV4dFJlZ2lvbiB0eXBlcyBhYm92ZSB0byBkaXNwbGF5IHN0cmluZ3MsIGZvcgotCS8vIHVzZSBpbiB0aGUgY29tYm8gYm94Ci0JcHJvdGVjdGVkIERpY3Rpb25hcnkgZkRlc2NyaXB0aW9ucyA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmRm9yZWdyb3VuZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLS8vCXByaXZhdGUgU3RyaW5nIGZHZW5lcmF0b3JLZXk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmSW5wdXQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBCdXR0b24gZkl0YWxpYzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmTm9kZXMgPSBudWxsOwotCS8vIGRlZmVjdCAyMDA3NjQgLSBBQ0M6ZGlzcGxheSB2YWx1ZXMgZm9yIGNvbG9yIGJ1dHRvbnMKLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciBmb3JlZ3JvdW5kQWNjTGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIjZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGdldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJZS5yZXN1bHQgPSBnZXRDb2xvckJ1dHRvblZhbHVlKGZGb3JlZ3JvdW5kKTsKLQkJCX0KLQkJfQotCX07Ci0JLy8gQSBSZWdpb25QYXJzZXIsIHdoaWNoIHdpbGwgdHVybiB0aGUgaW5wdXQgaW50bwotCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocykgYW5kIFJlZ2lvbnMKLQlwcm90ZWN0ZWQgUmVnaW9uUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmU7Ci0JcHJvdGVjdGVkIENvbWJvIGZTdHlsZUNvbWJvID0gbnVsbDsKLQkvLyBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgSVRleHRSZWdpb24gdHlwZXMgW1N0cmluZ3NdCi0JcHJvdGVjdGVkIExpc3QgZlN0eWxlTGlzdCA9IG51bGw7Ci0KLQkvLyBjb250cm9scyBpbiBwaWNrZXIKLQlwcm90ZWN0ZWQgU3R5bGVkVGV4dCBmVGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxUZXh0Q29sb3JQaWNrZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0Q29sb3JQaWNrZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVDb250cm9scyh0aGlzKTsKLQl9Ci0KLQkvLyBhY3RpdmF0ZSBjb250cm9scyBiYXNlZCBvbiB0aGUgZ2l2ZW4gbG9jYWwgY29sb3IgdHlwZQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZGb3JlZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKHNob3dJdGFsaWMpCi0JCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IAotCQllbHNlIHsJCQotCQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWlmIChzaG93SXRhbGljKQotCQkJCWZJdGFsaWMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQotCQl9Ci0JCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKG5hbWVkU3R5bGUpOwotCQlDb2xvciBjb2xvciA9IGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQljb2xvciA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJfQotCQlpZiAoZkZvcmVncm91bmQuZ2V0U2l6ZSgpLnggPiAwICYmIGZGb3JlZ3JvdW5kLmdldFNpemUoKS55ID4gMCAmJiAoZkZvcmVncm91bmQuZ2V0SW1hZ2UoKSA9PSBudWxsIHx8IGZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkgPT0gbnVsbCB8fCBmRm9yZWdyb3VuZC5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKSA9PSBudWxsIHx8IGZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpLmxlbmd0aCA8IDEgfHwgIWZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpWzBdLmVxdWFscyhjb2xvci5nZXRSR0IoKSkpKSB7Ci0JCQlpZiAoZkZvcmVncm91bmQuZ2V0SW1hZ2UoKSAhPSBudWxsKQotCQkJCWZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZGlzcG9zZSgpOwotCQkJSW1hZ2UgZm9yZWdyb3VuZCA9IG5ldyBJbWFnZShnZXREaXNwbGF5KCksIG5ldyBJbWFnZURhdGEoZkZvcmVncm91bmQuZ2V0U2l6ZSgpLngsIGZGb3JlZ3JvdW5kLmdldFNpemUoKS55LCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde2NvbG9yLmdldFJHQigpfSkpKTsKLQkJCWZGb3JlZ3JvdW5kLnNldEltYWdlKGZvcmVncm91bmQpOwotCQl9Ci0JCWNvbG9yID0gYXR0cmlidXRlLmdldEJhY2tncm91bmQoKTsKLQkJaWYgKGNvbG9yID09IG51bGwpIHsKLQkJCWNvbG9yID0gZkRlZmF1bHRCYWNrZ3JvdW5kOwotCQl9Ci0JCWlmIChmQmFja2dyb3VuZC5nZXRTaXplKCkueCA+IDAgJiYgZkJhY2tncm91bmQuZ2V0U2l6ZSgpLnkgPiAwICYmIChmQmFja2dyb3VuZC5nZXRJbWFnZSgpID09IG51bGwgfHwgZkJhY2tncm91bmQuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKSA9PSBudWxsIHx8IGZCYWNrZ3JvdW5kLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpID09IG51bGwgfHwgZkJhY2tncm91bmQuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKCkubGVuZ3RoIDwgMSB8fCAhZkJhY2tncm91bmQuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKClbMF0uZXF1YWxzKGNvbG9yLmdldFJHQigpKSkpIHsKLQkJCWlmIChmQmFja2dyb3VuZC5nZXRJbWFnZSgpICE9IG51bGwpCi0JCQkJZkJhY2tncm91bmQuZ2V0SW1hZ2UoKS5kaXNwb3NlKCk7Ci0JCQlJbWFnZSBiYWNrZ3JvdW5kID0gbmV3IEltYWdlKGdldERpc3BsYXkoKSwgbmV3IEltYWdlRGF0YShmQmFja2dyb3VuZC5nZXRTaXplKCkueCwgZkJhY2tncm91bmQuZ2V0U2l6ZSgpLnksIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117Y29sb3IuZ2V0UkdCKCl9KSkpOwotCQkJZkJhY2tncm91bmQuc2V0SW1hZ2UoYmFja2dyb3VuZCk7Ci0JCX0KLQkJZkJvbGQuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsKLQkJaWYgKHNob3dJdGFsaWMpCi0JCQlmSXRhbGljLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhcHBseVN0eWxlcygpIHsKLQkJaWYgKGZUZXh0ID09IG51bGwgfHwgZlRleHQuaXNEaXNwb3NlZCgpIHx8IGZJbnB1dCA9PSBudWxsIHx8IGZJbnB1dC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQkvLwkJTGlzdCByZWdpb25zID0gZlBhcnNlci5nZXRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZOb2RlczsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkvLyBsb29rdXAgdGhlIGxvY2FsIGNvbG9yaW5nIHR5cGUgYW5kIGFwcGx5IGl0Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBnZXRDb250ZXh0U3R5bGVNYXAoKS5nZXQoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkpOwotCQkJCWlmIChuYW1lZFN0eWxlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKG5hbWVkU3R5bGUpOwotCQkJCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKG5vZGUuZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0TGVuZ3RoKCksIGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKTsKLQkJCQlmVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUkdCIGNoYW5nZUNvbG9yKFJHQiBzdGFydFZhbHVlKSB7Ci0JCUNvbG9yRGlhbG9nIGNvbG9yRGxnID0gbmV3IENvbG9yRGlhbG9nKGdldFNoZWxsKCkpOwotCQlpZiAoc3RhcnRWYWx1ZSAhPSBudWxsKQotCQkJY29sb3JEbGcuc2V0UkdCKHN0YXJ0VmFsdWUpOwotCQlpZihjb2xvckRsZy5nZXRUZXh0KCkgPT0gbnVsbCB8fCBjb2xvckRsZy5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkKLQkJCWNvbG9yRGxnLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHlsZWRUZXh0Q29sb3JQaWNrZXJfMCk7Ci0JCWNvbG9yRGxnLm9wZW4oKTsKLQkJUkdCIG5ld1JHQiA9IGNvbG9yRGxnLmdldFJHQigpOwotCQlpZiAobmV3UkdCICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3UkdCOwotCQlyZXR1cm4gc3RhcnRWYWx1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjaGFuZ2VDb2xvcihTdHJpbmcgcmdiKSB7Ci0JCVN0cmluZyBjaGFuZ2VkQ29sb3IgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQotCQlSR0IgbmV3Q29sb3IgPSBjaGFuZ2VDb2xvcihDb2xvckhlbHBlci50b1JHQihyZ2IpKTsKLQkJLy8gbnVsbCBjaGVjayB0byBzZWUgaWYgdXNpbmcgZGVmYXVsdCB2YWx1ZQotCQlpZiAobmV3Q29sb3IgIT0gbnVsbCkKLQkJCWNoYW5nZWRDb2xvciA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKG5ld0NvbG9yKTsKLQkJcmV0dXJuIGNoYW5nZWRDb2xvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHNpemUgb2YgY29sb3IgYnV0dG9uIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkNvbG9yRWRpdG9yIDEgbW9kaWZpY2F0aW9uIC0KLQkgKiBhZGRlZCA0IHRvIGZpbmFsIGhlaWdodAotCSAqLwotCXByaXZhdGUgUG9pbnQgY29tcHV0ZUltYWdlU2l6ZShDb250cm9sIHdpbmRvdykgewotCQlHQyBnYyA9IG5ldyBHQyh3aW5kb3cpOwotCQlGb250IGYgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuREVGQVVMVF9GT05UKTsKLQkJZ2Muc2V0Rm9udChmKTsKLQkJaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJUG9pbnQgcCA9IG5ldyBQb2ludChoZWlnaHQgKiAzIC0gNiwgaGVpZ2h0ICsgNCk7Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gbmV3IGNoZWNrYm94IGluc3RhbmNlIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBncm91cAotCSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0ZSBpbiB3aGljaCB0byBjcmVhdGUgdGhlIGNoZWNrYm94Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHNldCBpbnRvIHRoZSBjaGVja2JveAotCSAqIEByZXR1cm4gdGhlIG5ldyBjaGVja2JveAotCSAqLwotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBncm91cCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuQ0VOVEVSKTsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQ7Ci0JCS8vCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGxhYmVscywgaW50IHNlbGVjdGVkSXRlbSkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uc2V0SXRlbXMobGFiZWxzKTsKLQkJaWYgKHNlbGVjdGVkSXRlbSA+PSAwKQotCQkJY29tYm8uc2VsZWN0KHNlbGVjdGVkSXRlbSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21wb3NpdGUgY29udHJvbCBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBzdHlsZVJvdyA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDMpOwotCQkvLyByb3cgMSAtIGNvbnRlbnQgdHlwZSBsYWJlbCwgY29tYm8gYm94LCByZXN0b3JlIGRlZmF1bHRzCi0JCWNyZWF0ZUxhYmVsKHN0eWxlUm93LCBTU0VVSU1lc3NhZ2VzLkNvbnRlbnRfdHlwZV9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJDb250ZW50IHR5cGU6IgotCQkvLyBDb250ZXh0cyBjb21ibyBib3gKLQkJZlN0eWxlQ29tYm8gPSBjcmVhdGVDb21ibyhzdHlsZVJvdywgbmV3IFN0cmluZ1swXSwgLTEpOwotCQlmQ2xlYXJTdHlsZSA9IGNyZWF0ZVB1c2hCdXR0b24oc3R5bGVSb3csIFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlDb21wb3NpdGUgc3R5bGVSb3cyOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCXN0eWxlUm93MiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDcpOwotCQllbHNlCi0JCQlzdHlsZVJvdzIgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCA2KTsKLQkJLy8gcm93IDIgLSBmb3JlZ3JvdW5kIGxhYmVsLCBidXR0b24sIGJhY2tncm91bmQgbGFiZWwsIGJ1dHRvbiwgYm9sZCwKLQkJLy8gaXRhbGljcz8KLQkJZkZvcmVncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKHN0eWxlUm93MiwgU1NFVUlNZXNzYWdlcy5Gb3JlZ3JvdW5kX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiRm9yZWdyb3VuZCIKLQkJZkZvcmVncm91bmQgPSBjcmVhdGVQdXNoQnV0dG9uKHN0eWxlUm93MiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXNldEFjY2Vzc2libGUoZkZvcmVncm91bmQsIGZGb3JlZ3JvdW5kTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZkZvcmVncm91bmQuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoZm9yZWdyb3VuZEFjY0xpc3RlbmVyKTsgLy8gZGVmZWN0Ci0JCS8vIDIwMDc2NAotCQkvLyAtCi0JCS8vIEFDQzpkaXNwbGF5Ci0JCS8vIHZhbHVlcwotCQkvLyBmb3IKLQkJLy8gY29sb3IKLQkJLy8gYnV0dG9ucwotCQlQb2ludCBidXR0b25TaXplID0gY29tcHV0ZUltYWdlU2l6ZShwYXJlbnQpOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGJ1dHRvblNpemUueDsKLQkJKChHcmlkRGF0YSkgZkZvcmVncm91bmQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gYnV0dG9uU2l6ZS55OwotCQlmQmFja2dyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJCYWNrZ3JvdW5kIgotCQlmQmFja2dyb3VuZCA9IGNyZWF0ZVB1c2hCdXR0b24oc3R5bGVSb3cyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0QWNjZXNzaWJsZShmQmFja2dyb3VuZCwgZkJhY2tncm91bmRMYWJlbC5nZXRUZXh0KCkpOwotCQlmQmFja2dyb3VuZC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihiYWNrZ3JvdW5kQWNjTGlzdGVuZXIpOyAvLyBkZWZlY3QKLQkJLy8gMjAwNzY0Ci0JCS8vIC0KLQkJLy8gQUNDOmRpc3BsYXkKLQkJLy8gdmFsdWVzCi0JCS8vIGZvcgotCQkvLyBjb2xvcgotCQkvLyBidXR0b25zCi0JCSgoR3JpZERhdGEpIGZCYWNrZ3JvdW5kLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gYnV0dG9uU2l6ZS54OwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBidXR0b25TaXplLnk7Ci0JCWNyZWF0ZUxhYmVsKHN0eWxlUm93MiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tCb3goc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkJvbGRfVUlfKTsKLQkJaWYgKHNob3dJdGFsaWMpCi0JCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tCb3goc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkl0YWxpY3NfVUkpOwotCQkvLwkJLy8gRGVmYXVsdHMgY2hlY2tib3gKLQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZCYWNrZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzaG93SXRhbGljKQotCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJQ29tcG9zaXRlIHNhbXBsZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQljcmVhdGVMYWJlbChzYW1wbGUsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJLy8gQlVHMTQxMDg5IC0gbWFrZSBzdXJlIHRleHQgaXMgbGVmdC1hbGlnbmVkCi0JCWZUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2FtcGxlLCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEJhY2tncm91bmQoZkRlZmF1bHRCYWNrZ3JvdW5kKTsKLQkJZlRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsgLy8gZGVmZWN0IDIyMDM3NyAtCi0JCS8vIFByb3ZpZGUgdGFiCi0JCS8vIHRyYXZlcnNhbCBmb3IKLQkJLy8gZlRleHQgd2lkZ2V0Ci0JCXNldEFjY2Vzc2libGUoZlRleHQsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJZkZvcmVncm91bmQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlmQmFja2dyb3VuZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0JCWZDbGVhclN0eWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1dHRvbkxpc3RlbmVyKTsKLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlmU3R5bGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBsYWJlbCBpbnN0YW5jZSBhbmQgc2V0cyB0aGUgZGVmYXVsdAotCSAqIGxheW91dCBkYXRhLgotCSAqLwotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJLy8JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZShnZXREZWZhdWx0Rm9yZWdyb3VuZCgpLCBnZXREZWZhdWx0QmFja2dyb3VuZCgpLCBTV1QuTk9STUFMKTsKLQotCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsICYmIGdldFByZWZlcmVuY2VTdG9yZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSkpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0JCQkJYm9vbGVhbiBib2xkID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbMl0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWlmIChib2xkKQotCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBTV1QuQk9MRDsKLQotCQkJCWlmIChzaG93SXRhbGljKSB7Ci0JCQkJCWJvb2xlYW4gaXRhbGljID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbM10pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoaXRhbGljKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0KLQkJCQl0YSA9IG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIGZvbnRNb2RpZmllcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCS8vIGRlZmVjdCAyMDA3NjQgLSBBQ0M6ZGlzcGxheSB2YWx1ZXMgZm9yIGNvbG9yIGJ1dHRvbnMKLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIGNvbG9yIEJ1dHRvbiBiJ3MgY3VycmVudCBSQkcgdmFsdWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDb2xvckJ1dHRvblZhbHVlKEJ1dHRvbiBiKSB7Ci0JCWlmICgoYiA9PSBudWxsKSB8fCAoYi5nZXRJbWFnZSgpID09IG51bGwpIHx8IChiLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkgPT0gbnVsbCkgfHwgKGIuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKCkgPT0gbnVsbCkgfHwgKGIuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKClbMF0gPT0gbnVsbCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHZhbCA9IGIuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKClbMF0udG9TdHJpbmcoKTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UHJlZmVyZW5jZVN0b3JlIGluc3RlYWQgbGVmdCBmb3IgbGVnYWN5IGNsaWVudHMsCi0JICogICAgICAgICAgICAgZGVsZXRlIGJ5IFdUUCBNNAotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbG9yc05vZGUoKSB7Ci0JCS8vcmV0dXJuIGZDb2xvcnNOb2RlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIERpY3Rpb25hcnkgZ2V0Q29udGV4dFN0eWxlTWFwKCkgewotCQlyZXR1cm4gZkNvbnRleHRTdHlsZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyBDb2xvciBnZXREZWZhdWx0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0QmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyBDb2xvciBnZXREZWZhdWx0Rm9yZWdyb3VuZCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIERpY3Rpb25hcnkgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uczsKLQl9Ci0KLQlwdWJsaWMgRm9udCBnZXRGb250KCkgewotCQlyZXR1cm4gZlRleHQuZ2V0Rm9udCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmSW5wdXQubGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZJbnB1dC5sZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJLy8gZmluZCB0aGUgSVRleHRSZWdpb24gYXQgdGhpcyBvZmZzZXQKLQkJaWYgKGZOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBmTm9kZXM7Ci0JCXdoaWxlIChhTm9kZSAhPSBudWxsICYmICFhTm9kZS5jb250YWluc09mZnNldChvZmZzZXQpKQotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCWlmIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gYU5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGFOb2RlLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZ2V0Q29udGV4dFN0eWxlTWFwKCkuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGp1c3Qga2V5IGtleSAobm8gbmVlZCBmb3IgZ2VuZXJhdG9yKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VLZXkoU3RyaW5nIGtleSkgewotCQlTdHJpbmcgbmV3S2V5ID0ga2V5OwotLy8JCWlmIChmR2VuZXJhdG9yS2V5ICE9IG51bGwpIHsKLS8vCQkJbmV3S2V5ID0gUHJlZmVyZW5jZUtleUdlbmVyYXRvci5nZW5lcmF0ZUtleShrZXksIGZHZW5lcmF0b3JLZXkpOwotLy8JCX0KLQkJcmV0dXJuIG5ld0tleTsKLQl9Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3R5bGVMaXN0KCkgewotCQlyZXR1cm4gZlN0eWxlTGlzdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHlsZU5hbWUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzdHlsZU5hbWUgPSBudWxsOwotCQlqYXZhLnV0aWwuRW51bWVyYXRpb24ga2V5cyA9IGdldERlc2NyaXB0aW9ucygpLmtleXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyB0ZXN0ID0ga2V5cy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KHRlc3QpLmVxdWFscyhkZXNjcmlwdGlvbikpIHsKLQkJCQlzdHlsZU5hbWUgPSB0ZXN0OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHlsZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZklucHV0OwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0vLyBDb21tZW50ZWQgb3V0IHdoZW4gbW92aW5nIHRvIFJDMiB0byByZW1vdmUgInVudXNlZCIgZXJyb3Ivd2FybmluZwkJCQotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXREb3VibGVTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0vLwkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0vLwkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0vLwkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCSgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLnNldFNlbGVjdGlvbihlLngpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyBkZWZlY3QgMjIwMzc3IC0gUHJvdmlkZSB0YWIgdHJhdmVyc2FsIGZvciBmVGV4dCB3aWRnZXQKLQlwcml2YXRlIFRyYXZlcnNlTGlzdGVuZXIgZ2V0VHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lciNrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaWYgKChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpIHx8IChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKSkKLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIHJlZnJlc2ggdGhlIEdVSSBhZnRlciBhIGNvbG9yIGNoYW5nZQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWZUZXh0LnNldFJlZHJhdyhmYWxzZSk7Ci0JCWludCBzZWxlY3RlZEluZGV4ID0gZlN0eWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gc2VsZWN0ZWRJbmRleCA+PSAwID8gZlN0eWxlQ29tYm8uZ2V0SXRlbShzZWxlY3RlZEluZGV4KSA6IG51bGw7Ci0JCWFjdGl2YXRlKGdldFN0eWxlTmFtZShkZXNjcmlwdGlvbikpOwotCQkvLyB1cGRhdGUgRm9udAotCQlmVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldFRleHRGb250KCkpOwotCQkvLyByZWFwcGx5U3R5bGVzCi0JCWFwcGx5U3R5bGVzKCk7Ci0JCWZUZXh0LnNldFJlZHJhdyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlUGlja2VyUmVzb3VyY2VzKCkgewotCQlpZiAoZkZvcmVncm91bmQgIT0gbnVsbCAmJiAhZkZvcmVncm91bmQuaXNEaXNwb3NlZCgpICYmIGZGb3JlZ3JvdW5kLmdldEltYWdlKCkgIT0gbnVsbCkKLQkJCWZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZGlzcG9zZSgpOwotCQlpZiAoZkJhY2tncm91bmQgIT0gbnVsbCAmJiAhZkJhY2tncm91bmQuaXNEaXNwb3NlZCgpICYmIGZCYWNrZ3JvdW5kLmdldEltYWdlKCkgIT0gbnVsbCkKLQkJCWZCYWNrZ3JvdW5kLmdldEltYWdlKCkuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXROYW1lZFN0eWxlQXRPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkgewotCQkJZlN0eWxlQ29tYm8uZGVzZWxlY3RBbGwoKTsKLQkJCWFjdGl2YXRlKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpIGdldERlc2NyaXB0aW9ucygpLmdldChuYW1lZFN0eWxlKTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpdGVtQ291bnQgPSBmU3R5bGVDb21iby5nZXRJdGVtQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQkJaWYgKGZTdHlsZUNvbWJvLmdldEl0ZW0oaSkuZXF1YWxzKGRlc2NyaXB0aW9uKSkgewotCQkJCWZTdHlsZUNvbWJvLnNlbGVjdChpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2FsbHkgc2V0IHRoZSByZXBvcnRpbmcgbmFtZSBvZiBhIGNvbnRyb2wgZm9yIGFjY2Vzc2liaWxpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzaWJsZShDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFN0cmluZyBuID0gbmFtZTsKLQkJY29udHJvbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gbjsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHNldFByZWZlcmVuY2VTdG9yZSBpbnN0ZWFkIGxlZnQgZm9yIGxlZ2FjeSBjbGllbnRzLAotCSAqICAgICAgICAgICAgIGRlbGV0ZSBieSBXVFAgTTQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2xvcnNOb2RlKE5vZGUgbmV3Q29sb3JzTm9kZSkgewotCQkvL2ZDb2xvcnNOb2RlID0gbmV3Q29sb3JzTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3Q29udGV4dFN0eWxlTWFwCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuRGljdGlvbmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IG5ld0NvbnRleHRTdHlsZU1hcCkgewotCQlmQ29udGV4dFN0eWxlTWFwID0gbmV3Q29udGV4dFN0eWxlTWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZWZhdWx0QmFja2dyb3VuZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEJhY2tncm91bmQoQ29sb3IgbmV3RGVmYXVsdEJhY2tncm91bmQpIHsKLQkJZkRlZmF1bHRCYWNrZ3JvdW5kID0gbmV3RGVmYXVsdEJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHNldFByZWZlcmVuY2VTdG9yZSBpbnN0ZWFkIGxlZnQgZm9yIGxlZ2FjeSBjbGllbnRzLAotCSAqICAgICAgICAgICAgIGRlbGV0ZSBieSBXVFAgTTQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29sb3JzTm9kZShOb2RlIG5ld0RlZmF1bHRDb2xvcnNOb2RlKSB7Ci0JCS8vZkRlZmF1bHRDb2xvcnNOb2RlID0gbmV3RGVmYXVsdENvbG9yc05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0RlZmF1bHRGb3JlZ3JvdW5kCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Rm9yZWdyb3VuZChDb2xvciBuZXdEZWZhdWx0Rm9yZWdyb3VuZCkgewotCQlmRGVmYXVsdEZvcmVncm91bmQgPSBuZXdEZWZhdWx0Rm9yZWdyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVzY3JpcHRpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuRGljdGlvbmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IG5ld0Rlc2NyaXB0aW9ucykgewotCQlmRGVzY3JpcHRpb25zID0gbmV3RGVzY3JpcHRpb25zOwotCQl1cGRhdGVTdHlsZUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotCQlmVGV4dC5zZXRGb250KGZvbnQpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBnZW5lcmF0b3Iga2V5IHNob3VsZCBubyBsb25nZXIgYmUgbmVlZGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yS2V5KFN0cmluZyBrZXkpIHsKLS8vCQlmR2VuZXJhdG9yS2V5ID0ga2V5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdQYXJzZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXIoUmVnaW9uUGFyc2VyIG5ld1BhcnNlcikgewotCQlmUGFyc2VyID0gbmV3UGFyc2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCWZQcmVmZXJlbmNlU3RvcmUgPSBzdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U3R5bGVMaXN0Ci0JICogICAgICAgICAgICBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0eWxlTGlzdChMaXN0IG5ld1N0eWxlTGlzdCkgewotCQlmU3R5bGVMaXN0ID0gbmV3U3R5bGVMaXN0OwotCQl1cGRhdGVTdHlsZUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzKSB7Ci0JCWZJbnB1dCA9IHM7Ci0JCWdldFBhcnNlcigpLnJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoZklucHV0LnRvQ2hhckFycmF5KCkpKTsKLQkJZk5vZGVzID0gZ2V0UGFyc2VyKCkuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGVuZ3RoIG9mIGlucHV0OiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgcy5sZW5ndGgoKSArICIsICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBnZXRQYXJzZXIoKS5nZXRSZWdpb25zKCkuc2l6ZSgpICsgIiByZWdpb25zLiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmVGV4dCAhPSBudWxsKQotCQkJZlRleHQuc2V0VGV4dChzKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCCi0JICogQHBhcmFtIGFuUkdCU3RyaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlZmF1bHRSR0IKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLQkgKi8KLQkvLyBUT0RPOiBuZXZlciB1c2VkCi0JIFJHQiB0b1JHQihTdHJpbmcgYW5SR0JTdHJpbmcsIFJHQiBkZWZhdWx0UkdCKSB7Ci0JCVJHQiByZXN1bHQgPSBDb2xvckhlbHBlci50b1JHQihhblJHQlN0cmluZyk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBkZWZhdWx0UkdCOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdHlsZUxpc3QoKSB7Ci0JCWlmIChmU3R5bGVMaXN0ID09IG51bGwgfHwgZkRlc2NyaXB0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBuZXcgU3RyaW5nW2ZTdHlsZUxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU3R5bGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoZlN0eWxlTGlzdC5nZXQoaSkgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbnNbaV0gPSAoU3RyaW5nKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoZlN0eWxlTGlzdC5nZXQoaSkpOwotCQkJZWxzZQotCQkJCWRlc2NyaXB0aW9uc1tpXSA9IChTdHJpbmcpIGZTdHlsZUxpc3QuZ2V0KGkpOwotCQl9Ci0JCU9iamVjdFtdIHNvcnRlZE9iamVjdHMgPSBuZXcgRGVzY3JpcHRpb25Tb3J0ZXIoKS5zb3J0KGRlc2NyaXB0aW9ucyk7Ci0JCVN0cmluZ1tdIHNvcnRlZERlc2NyaXB0aW9ucyA9IG5ldyBTdHJpbmdbZGVzY3JpcHRpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlzb3J0ZWREZXNjcmlwdGlvbnNbaV0gPSBzb3J0ZWRPYmplY3RzW2ldLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZlN0eWxlQ29tYm8uc2V0SXRlbXMoc29ydGVkRGVzY3JpcHRpb25zKTsKLQkJZlN0eWxlQ29tYm8uc2VsZWN0KDApOyAvL2RlZmVjdCAyMTk4NTUgLSBpbml0aWFsbHkgc2VsZWN0IGZpcnN0IGl0ZW0KLQkJLy8gaW4gY29tYm9Cb3gKLQkJLy8JCWZTdHlsZUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1RleHRIb3ZlclByZWZlcmVuY2VUYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOTIzOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1RleHRIb3ZlclByZWZlcmVuY2VUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLS8qKgotICogUHJlZmVyZW5jZSB0YWIgZm9yIFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaG92ZXIgaGVscCBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlVGFiIHsKLQotCXByaXZhdGUgY2xhc3MgSW50ZXJuYWxUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbnRlcm5hbFRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6IC8vIHRleHQgaG92ZXIgbGFiZWwKLQkJCQkJcmV0dXJuICgoVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRMYWJlbCgpOwotCi0JCQkJY2FzZSAxIDogLy8gdGV4dCBob3ZlciBzdGF0ZSBtYXNrCi0JCQkJCXJldHVybiAoKFRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TW9kaWZpZXJTdHJpbmcoKTsKLQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSID0gU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2RlbGltaXRlcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVGV4dCBmRGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBUYWJsZSBmSG92ZXJUYWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZIb3ZlclRhYmxlVmlld2VyOwotCXByaXZhdGUgVGFibGVDb2x1bW4gZk1vZGlmaWVyQ29sdW1uOwotCS8vIGZvciB0aGlzIHByZWZlcmVuY2UgcGFnZQotCXByaXZhdGUgVGV4dCBmTW9kaWZpZXJFZGl0b3I7Ci0JcHJpdmF0ZSBUYWJsZUNvbHVtbiBmTmFtZUNvbHVtbjsKLQotCXByaXZhdGUgVGV4dEhvdmVyRGVzY3JpcHRvcltdIGZUZXh0SG92ZXJzOyAvLyBjdXJyZW50IGxpc3Qgb2YgdGV4dCBob3ZlcnMKLQotCXB1YmxpYyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiKFByZWZlcmVuY2VQYWdlIG1haW5QcmVmZXJlbmNlUGFnZSwgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RvcmUpOwotCQlzZXRNYWluUHJlZmVyZW5jZVBhZ2UobWFpblByZWZlcmVuY2VQYWdlKTsKLQkJc2V0T3ZlcmxheVN0b3JlKHN0b3JlKTsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkuYWRkS2V5cyhjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcikgewotCQlDb21wb3NpdGUgaG92ZXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaG92ZXJDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWhvdmVyQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIGNvbW1lbnRlZCBvdXQgdW50aWwgdGhlc2UgcHJlZmVyZW5jZXMgYXJlIGFjdHVhbGx5IGhhbmRsZWQgaW4gc29tZQotCQkvLyB3YXkKLQkJLy8JCVN0cmluZyByb2xsT3ZlckxhYmVsPQotCQkvLyBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmFubm90YXRpb25Sb2xsb3ZlciIpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQlhZGRDaGVja0JveChob3ZlckNvbXBvc2l0ZSwgcm9sbE92ZXJMYWJlbCwKLQkJLy8gQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9BTk5PVEFUSU9OX1JPTExfT1ZFUiwgMCk7Ci0JCS8vCi0JCS8vCQkvLyBBZmZvcmRhbmNlIGNoZWNrYm94Ci0JCS8vCQlTdHJpbmcgc2hvd0FmZm9yZGFuY2VMYWJlbCA9Ci0JCS8vIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRleHRIb3ZlclByZWZlcmVuY2VUYWIuc2hvd0FmZm9yZGFuY2UiKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLwkJYWRkQ2hlY2tCb3goaG92ZXJDb21wb3NpdGUsIHNob3dBZmZvcmRhbmNlTGFiZWwsCi0JCS8vIENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfU0hPV19URVhUX0hPVkVSX0FGRk9SREFOQ0UsIDApOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2hvdmVyUHJlZmVyZW5jZXMpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmSG92ZXJUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGhvdmVyQ29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJLy8gSG92ZXIgdGFibGUKLQkJZkhvdmVyVGFibGUgPSBmSG92ZXJUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQlmSG92ZXJUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlmSG92ZXJUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ1MDcKLQkgICAgR0MgZ2MgPSBuZXcgR0MoZkhvdmVyVGFibGUpOwotCSAgICBnYy5zZXRGb250KGZIb3ZlclRhYmxlLmdldEZvbnQoKSk7Ci0JICAgIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkgICAgZ2MuZGlzcG9zZSgpOwotCQlpbnQgaGVpZ2h0SGludCA9IERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCA3KTsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCQotCQlmSG92ZXJUYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQlmSG92ZXJUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCWZIb3ZlclRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhvdmVyTGlzdFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlmTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmSG92ZXJUYWJsZSwgU1dULk5PTkUpOwotCQlmTmFtZUNvbHVtbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9uYW1lQ29sdW1uVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWZOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlmTW9kaWZpZXJDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZkhvdmVyVGFibGUsIFNXVC5OT05FKTsKLQkJZk1vZGlmaWVyQ29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVyQ29sdW1uVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWZNb2RpZmllckNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSW50ZXJuYWxUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCSgoQ2hlY2tib3hUYWJsZVZpZXdlcikgZkhvdmVyVGFibGVWaWV3ZXIpLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgaWQgPSAoKFRleHRIb3ZlckRlc2NyaXB0b3IpIGV2ZW50LmdldEVsZW1lbnQoKSkuZ2V0SWQoKTsKLQkJCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRUZXh0SG92ZXJNYW5hZ2VyKCkuZ2V0VGV4dEhvdmVycygpOwotCQkJCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvciBob3ZlckNvbmZpZyA9IG51bGw7Ci0JCQkJaW50IGkgPSAwLCBsZW5ndGggPSBmVGV4dEhvdmVycy5sZW5ndGg7Ci0JCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCQkJaWYgKGlkLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXRJZCgpKSkgewotCQkJCQkJaG92ZXJDb25maWcgPSBmVGV4dEhvdmVyc1tpXTsKLQkJCQkJCWhvdmVyQ29uZmlnLnNldEVuYWJsZWQoZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQkJCWZNb2RpZmllckVkaXRvci5zZXRFbmFibGVkKGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJCQlmSG92ZXJUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVzY3JpcHRvcnNbaV0pKTsKLQkJCQkJfQotCQkJCQlpKys7Ci0JCQkJfQotCi0JCQkJaGFuZGxlSG92ZXJMaXN0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlU3RhdHVzKGhvdmVyQ29uZmlnKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gVGV4dCBmaWVsZCBmb3IgbW9kaWZpZXIgc3RyaW5nCi0JCWxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2tleU1vZGlmaWVyKTsgLy8kTk9OLU5MUy0xJAotCQlmTW9kaWZpZXJFZGl0b3IgPSBuZXcgVGV4dChob3ZlckNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWZNb2RpZmllckVkaXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmTW9kaWZpZXJFZGl0b3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHJpdmF0ZSBib29sZWFuIGlzTW9kaWZpZXJDYW5kaWRhdGU7Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlzTW9kaWZpZXJDYW5kaWRhdGUgPSBlLmtleUNvZGUgPiAwICYmIGUuY2hhcmFjdGVyID09IDAgJiYgZS5zdGF0ZU1hc2sgPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChpc01vZGlmaWVyQ2FuZGlkYXRlICYmIGUuc3RhdGVNYXNrID4gMCAmJiBlLnN0YXRlTWFzayA9PSBlLnN0YXRlTWFzayAmJiBlLmNoYXJhY3RlciA9PSAwKSB7Ly8gJiYKLQkJCQkJLy8gZS50aW1lCi0JCQkJCS8vIC10aW1lCi0JCQkJCS8vIDwKLQkJCQkJLy8gMTAwMCkKLQkJCQkJLy8gewotCQkJCQlTdHJpbmcgdGV4dCA9IGZNb2RpZmllckVkaXRvci5nZXRUZXh0KCk7Ci0JCQkJCVBvaW50IHNlbGVjdGlvbiA9IGZNb2RpZmllckVkaXRvci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaW50IGkgPSBzZWxlY3Rpb24ueCAtIDE7Ci0JCQkJCXdoaWxlIChpID4gLTEgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQkJCWktLTsKLQkJCQkJfQotCQkJCQlib29sZWFuIG5lZWRzUHJlZml4RGVsaW1pdGVyID0gaSA+IC0xICYmICFTdHJpbmcudmFsdWVPZih0ZXh0LmNoYXJBdChpKSkuZXF1YWxzKERFTElNSVRFUik7Ci0KLQkJCQkJaSA9IHNlbGVjdGlvbi55OwotCQkJCQl3aGlsZSAoaSA8IHRleHQubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCQlib29sZWFuIG5lZWRzUG9zdGZpeERlbGltaXRlciA9IGkgPCB0ZXh0Lmxlbmd0aCgpICYmICFTdHJpbmcudmFsdWVPZih0ZXh0LmNoYXJBdChpKSkuZXF1YWxzKERFTElNSVRFUik7Ci0KLQkJCQkJU3RyaW5nIGluc2VydFN0cmluZzsKLQotCQkJCQlpZiAobmVlZHNQcmVmaXhEZWxpbWl0ZXIgJiYgbmVlZHNQb3N0Zml4RGVsaW1pdGVyKQotCQkJCQkJaW5zZXJ0U3RyaW5nID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyQW5kRGVsaW1pdGVyLCBuZXcgU3RyaW5nW117QWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhlLnN0YXRlTWFzayl9KTsKLQkJCQkJZWxzZSBpZiAobmVlZHNQcmVmaXhEZWxpbWl0ZXIpCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXIsIG5ldyBTdHJpbmdbXXtBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKX0pOwotCQkJCQllbHNlIGlmIChuZWVkc1Bvc3RmaXhEZWxpbWl0ZXIpCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0TW9kaWZpZXJBbmREZWxpbWl0ZXIsIG5ldyBTdHJpbmdbXXtBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKX0pOwotCQkJCQllbHNlCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKTsKLQotCQkJCQlpZiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpCi0JCQkJCQlmTW9kaWZpZXJFZGl0b3IuaW5zZXJ0KGluc2VydFN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmTW9kaWZpZXJFZGl0b3IuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaGFuZGxlTW9kaWZpZXJNb2RpZmllZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBEZXNjcmlwdGlvbgotCQlMYWJlbCBkZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVzY3JpcHRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkRlc2NyaXB0aW9uID0gbmV3IFRleHQoaG92ZXJDb21wb3NpdGUsIFNXVC5MRUZUIHwgU1dULldSQVAgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QpOwotCi0JCWluaXRpYWxpemUoKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGhvdmVyQ29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhvdmVyQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRlNURV9IT1ZFUlNfSEVMUElEKTsKLQkJcmV0dXJuIGhvdmVyQ29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTKSk7Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVUZXh0SG92ZXJTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGV4dEhvdmVycy5sZW5ndGg7IGkrKykgewotCQkJYnVmLmFwcGVuZChmVGV4dEhvdmVyc1tpXS5nZXRJZCgpKTsKLQkJCWJ1Zi5hcHBlbmQoVGV4dEhvdmVyTWFuYWdlci5IT1ZFUl9BVFRSSUJVVEVfU0VQQVJBVE9SKTsKLQkJCWJ1Zi5hcHBlbmQoQm9vbGVhbi50b1N0cmluZyhmVGV4dEhvdmVyc1tpXS5pc0VuYWJsZWQoKSkpOwotCQkJYnVmLmFwcGVuZChUZXh0SG92ZXJNYW5hZ2VyLkhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IpOwotCQkJU3RyaW5nIG1vZGlmaWVyID0gZlRleHRIb3ZlcnNbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKTsKLQkJCWlmIChtb2RpZmllciA9PSBudWxsIHx8IG1vZGlmaWVyLmxlbmd0aCgpID09IDApCi0JCQkJbW9kaWZpZXIgPSBUZXh0SG92ZXJNYW5hZ2VyLk5PX01PRElGSUVSOwotCQkJYnVmLmFwcGVuZChtb2RpZmllcik7Ci0JCQlidWYuYXBwZW5kKFRleHRIb3Zlck1hbmFnZXIuSE9WRVJfU0VQQVJBVE9SKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0SG92ZXJNYW5hZ2VyIGdldFRleHRIb3Zlck1hbmFnZXIoKSB7Ci0JCXJldHVybiBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXZvaWQgaGFuZGxlSG92ZXJMaXN0U2VsZWN0aW9uKCkgewotCQlpbnQgaSA9IGZIb3ZlclRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKGkgPT0gLTEpIHsKLQkJCWlmIChmSG92ZXJUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApCi0JCQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkID0gZlRleHRIb3ZlcnNbaV0uaXNFbmFibGVkKCk7Ci0JCWZNb2RpZmllckVkaXRvci5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmTW9kaWZpZXJFZGl0b3Iuc2V0VGV4dChmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZlRleHRIb3ZlcnNbaV0uZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlkZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZEZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlTW9kaWZpZXJNb2RpZmllZCgpIHsKLQkJaW50IGkgPSBmSG92ZXJUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA9PSAtMSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgbW9kaWZpZXJzID0gZk1vZGlmaWVyRWRpdG9yLmdldFRleHQoKTsKLQkJZlRleHRIb3ZlcnNbaV0uc2V0TW9kaWZpZXJTdHJpbmcobW9kaWZpZXJzKTsKLQotCQkvLyB1cGRhdGUgdGFibGUKLQkJZkhvdmVyVGFibGVWaWV3ZXIucmVmcmVzaChmVGV4dEhvdmVyc1tpXSk7Ci0KLQkJdXBkYXRlU3RhdHVzKGZUZXh0SG92ZXJzW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzdG9yZUZyb21PdmVybGF5KCk7Ci0JCWZIb3ZlclRhYmxlVmlld2VyLnNldElucHV0KGZUZXh0SG92ZXJzKTsKLQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVRhYiNpbml0aWFsaXplRmllbGRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQlzdXBlci5pbml0aWFsaXplRmllbGRzKCk7Ci0KLQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkvLyBpbml0aWFsaXplIGNoZWNrYm94ZXMgaW4gaG92ZXIgdGFibGUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGV4dEhvdmVycy5sZW5ndGg7IGkrKykKLQkJCWZIb3ZlclRhYmxlLmdldEl0ZW0oaSkuc2V0Q2hlY2tlZChmVGV4dEhvdmVyc1tpXS5pc0VuYWJsZWQoKSk7Ci0JCWZIb3ZlclRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybUFwcGx5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXBlcmZvcm1PaygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJU3RyaW5nIHRleHRIb3ZlclN0cmluZyA9IGdlbmVyYXRlVGV4dEhvdmVyU3RyaW5nKCk7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMsIHRleHRIb3ZlclN0cmluZyk7Ci0JCWdldFRleHRIb3Zlck1hbmFnZXIoKS5yZXNldFRleHRIb3ZlcnMoKTsgLy8gbm90aWZ5IHRleHQgaG92ZXIgbWFuYWdlcgotCQkvLyBpdCBzaG91bGQgcmVzZXQgdG8gZ2V0Ci0JCS8vIGxhdGVzdCBwcmVmZXJlbmNlcwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyBmVGV4dEhvdmVycyB3aXRoIHRleHQgaG92ZXIgZGVzY3JpcHRpb24gZnJvbSB0aGUgb3ZlcmxheQotCSAqIHN0b3JlICh3aGljaCBpcyB0aGUgcHJlZmVyZW5jZXMpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVGcm9tT3ZlcmxheSgpIHsKLQkJU3RyaW5nIGRlc2NyaXB0b3JzU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMpOwotCQlmVGV4dEhvdmVycyA9IGdldFRleHRIb3Zlck1hbmFnZXIoKS5nZW5lcmF0ZVRleHRIb3ZlckRlc2NyaXB0b3JzKGRlc2NyaXB0b3JzU3RyaW5nKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1cyhUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3IgaG92ZXJDb25maWcpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbygpOwotCi0JCWlmIChob3ZlckNvbmZpZyAhPSBudWxsICYmIGhvdmVyQ29uZmlnLmlzRW5hYmxlZCgpICYmIEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhob3ZlckNvbmZpZy5nZXRNb2RpZmllclN0cmluZygpKSA9PSAtMSkKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWQsIG5ldyBTdHJpbmdbXXtob3ZlckNvbmZpZy5nZXRNb2RpZmllclN0cmluZygpfSkpOwotCi0JCWludCBpID0gMDsKLQkJSGFzaE1hcCBzdGF0ZU1hc2tzID0gbmV3IEhhc2hNYXAoZlRleHRIb3ZlcnMubGVuZ3RoKTsKLQkJd2hpbGUgKHN0YXR1cy5pc09LKCkgJiYgaSA8IGZUZXh0SG92ZXJzLmxlbmd0aCkgewotCQkJaWYgKGZUZXh0SG92ZXJzW2ldLmlzRW5hYmxlZCgpKSB7Ci0JCQkJU3RyaW5nIGxhYmVsID0gZlRleHRIb3ZlcnNbaV0uZ2V0TGFiZWwoKTsKLQkJCQlJbnRlZ2VyIHN0YXRlTWFzayA9IG5ldyBJbnRlZ2VyKEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpKSk7Ci0JCQkJaWYgKHN0YXRlTWFzay5pbnRWYWx1ZSgpID09IC0xKQotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbyhJU3RhdHVzLkVSUk9SLCBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkRm9ySG92ZXIsIG5ldyBTdHJpbmdbXXtmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpLCBsYWJlbH0pKTsKLQkJCQllbHNlIGlmIChzdGF0ZU1hc2tzLmNvbnRhaW5zS2V5KHN0YXRlTWFzaykpCi0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kdXBsaWNhdGVNb2RpZmllciwgbmV3IFN0cmluZ1tde2xhYmVsLCAoU3RyaW5nKSBzdGF0ZU1hc2tzLmdldChzdGF0ZU1hc2spfSkpOwotCQkJCWVsc2UKLQkJCQkJc3RhdGVNYXNrcy5wdXQoc3RhdGVNYXNrLCBsYWJlbCk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQotCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1RyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5YjQxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSW50ZWdlckZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLQotcHVibGljIGNsYXNzIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVRhYiB7Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VQYWdlIGZNYWluUHJlZmVyZW5jZVBhZ2U7Ci0JcHJpdmF0ZSBJbnRlZ2VyRmllbGRFZGl0b3IgZlRyYW5zbHVjZW5jeVNjYWxlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGludCBNQVhfUEVSQ0VOVEFHRSA9IDEwMDsKLQotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsaWRpdHlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEZpZWxkRWRpdG9yLklTX1ZBTElEKSkKLQkJCQl1cGRhdGVWYWxpZFN0YXRlKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiKFByZWZlcmVuY2VQYWdlIG1haW5QcmVmZXJlbmNlUGFnZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JCXNldE1haW5QcmVmZXJlbmNlUGFnZShtYWluUHJlZmVyZW5jZVBhZ2UpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLklQcmVmZXJlbmNlVGFiI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgdGFiRm9sZGVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCVN0cmluZyB0ZXh0ID0gU1NFVUlNZXNzYWdlcy5UcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiXzE7IC8vJE5PTi1OTFMtMSQKLQkJZlRyYW5zbHVjZW5jeVNjYWxlID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUsIHRleHQsIGNvbXBvc2l0ZSk7Ci0KLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldEVycm9yTWVzc2FnZShKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlN0cmluZ0ZpZWxkRWRpdG9yLmVycm9yTWVzc2FnZSIpKTsvLyROT04tTkxTLTEkCi0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0UHJlZmVyZW5jZVBhZ2UoZ2V0TWFpblByZWZlcmVuY2VQYWdlKCkpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0VGV4dExpbWl0KEludGVnZXIudG9TdHJpbmcoTUFYX1BFUkNFTlRBR0UpLmxlbmd0aCgpKTsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFZhbGlkYXRlU3RyYXRlZ3koU3RyaW5nRmllbGRFZGl0b3IuVkFMSURBVEVfT05fS0VZX1NUUk9LRSk7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRWYWxpZFJhbmdlKDAsIE1BWF9QRVJDRU5UQUdFKTsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLmxvYWQoKTsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodmFsaWRpdHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlBSRUZXRUJYX1JFQURPTkxZX0hFTFBJRCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmTWFpblByZWZlcmVuY2VQYWdlLgotCSAqLwotCXByaXZhdGUgUHJlZmVyZW5jZVBhZ2UgZ2V0TWFpblByZWZlcmVuY2VQYWdlKCkgewotCQlyZXR1cm4gZk1haW5QcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZlcmVuY2Ugc3RvcmUgdXNlZCBpbiB0aGlzIHRhYgotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLklQcmVmZXJlbmNlVGFiI2dldFRpdGxlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiXzA7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybUFwcGx5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zdG9yZSgpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLklQcmVmZXJlbmNlVGFiI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmVHJhbnNsdWNlbmN5U2NhbGUubG9hZERlZmF1bHQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtT2soKSB7Ci0JCXBlcmZvcm1BcHBseSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYWluUHJlZmVyZW5jZVBhZ2UKLQkgKiAgICAgICAgICAgIFRoZSBmTWFpblByZWZlcmVuY2VQYWdlIHRvIHNldC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWFpblByZWZlcmVuY2VQYWdlKFByZWZlcmVuY2VQYWdlIG1haW5QcmVmZXJlbmNlUGFnZSkgewotCQlmTWFpblByZWZlcmVuY2VQYWdlID0gbWFpblByZWZlcmVuY2VQYWdlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVWYWxpZFN0YXRlKCkgewotCQlpZiAoZ2V0TWFpblByZWZlcmVuY2VQYWdlKCkgIT0gbnVsbCkgewotCQkJZ2V0TWFpblByZWZlcmVuY2VQYWdlKCkuc2V0VmFsaWQoZlRyYW5zbHVjZW5jeVNjYWxlLmlzVmFsaWQoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0lTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQ5YWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0lTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci0KLS8qKgotICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIHdoaWNoIHdpbGwgY3JlYXRlIGFuZCBtYWludGFpbgotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb259Ci0gKiBvYmplY3RzIHRoYXQgZGVmaW5lIGZvbGRlZCByZWdpb25zIGluIHRoZSB0aGUKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXJ9Zm9yIGEKLSAqIHN0cnVjdHVyZWQgbW9kZWwuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgZm9sZGluZyBpcyBlbmFibGVkIGluIHRoZQotCSAqIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3IuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9MRElOR19FTkFCTEVEID0gImZvbGRpbmdFbmFibGVkIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIGNvcGllZCBpbnRlcmZhY2UgZnJvbQotCS8vIG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmZvbGRpbmcuSUphdmFGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIKLQkvKioKLQkgKiBJbnN0YWxscyB0aGlzIHN0cnVjdHVyZSBwcm92aWRlciBvbiB0aGUgZ2l2ZW4gdmlld2VyLiBJbXBsZW1lbnRhdGlvbnMKLQkgKiBzaG91bGQgbGlzdGVuIHRvIHRoZSBwcm9qZWN0aW9uIGV2ZW50cyBnZW5lcmF0ZWQgYnkgPGNvZGU+dmlld2VyPC9jb2RlPgotCSAqIGFuZCBlbmFibGUgLyBkaXNhYmxlIGdlbmVyYXRpb24gb2YgcHJvamVjdGlvbiBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHkuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHByb2plY3Rpb24gdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGFubm90YXRpb25zIGNyZWF0ZWQKLQkgKiAgICAgICAgICAgIGJ5IHRoaXMgc3RydWN0dXJlIHByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcik7Ci0KLQkvKioKLQkgKiBVbmluc3RhbGxzIHRoaXMgc3RydWN0dXJlIHByb3ZpZGVyLiBBbnkgcmVmZXJlbmNlcyB0byB2aWV3ZXJzIHNob3VsZCBiZQotCSAqIGNsZWFyZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQWRhcHRlclByb3BlcnR5U2hlZXRFbnRyeUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FkYXB0ZXJQcm9wZXJ0eVNoZWV0RW50cnlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMGE1M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQWRhcHRlclByb3BlcnR5U2hlZXRFbnRyeUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUHJvcGVydHlTaGVldEVudHJ5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkgewotCQkJcmV0dXJuICgoSVByb3BlcnR5U2hlZXRFbnRyeSkgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkgPSAoSVByb3BlcnR5U2hlZXRFbnRyeSkgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElQcm9wZXJ0eVNoZWV0RW50cnkuY2xhc3MpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpCi0JCQkJcmV0dXJuIGVudHJ5LmdldEltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkgewotCQkJcmV0dXJuICgoSVByb3BlcnR5U2hlZXRFbnRyeSkgZWxlbWVudCkuZ2V0VmFsdWVBc1N0cmluZygpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IChJUHJvcGVydHlTaGVldEVudHJ5KSAoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEFkYXB0ZXJGb3IoSVByb3BlcnR5U2hlZXRFbnRyeS5jbGFzcyk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0VmFsdWVBc1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Db25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODIzNWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEEgY29uZmlndXJhYmxlIElQcm9wZXJ0eVNoZWV0UGFnZSBzaW5jZSB0aGUgc3RhbmRhcmQgUHJvcGVydHlTaGVldFBhZ2UgZG9lcwotICogbm90IGV4cG9zZSBpdHMgdmlld2VyIGZpZWxkLgotICovCi0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFByb3BlcnR5U2hlZXRQYWdlIHsKLQlwcml2YXRlIGNsYXNzIE51bGxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQkJcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eVNoZWV0IikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOzsKLQotCXByaXZhdGUgbG9uZyBfREVCVUdfVElNRSA9IDA7Ci0KLQlwcml2YXRlIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCXByaXZhdGUgT2JqZWN0W10gZlNlbGVjdGVkRW50cmllcyA9IG51bGw7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGZJbnB1dCA9IG51bGw7Ci0JcHJpdmF0ZSBJTWVudU1hbmFnZXIgZk1lbnVNYW5hZ2VyOwotCi0JcHJpdmF0ZSBSZW1vdmVBY3Rpb24gZlJlbW92ZUFjdGlvbjsKLQotCXByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIGZTdGF0dXNMaW5lTWFuYWdlcjsKLQotCXByaXZhdGUgSVRvb2xCYXJNYW5hZ2VyIGZUb29sQmFyTWFuYWdlcjsKLQotCXByaXZhdGUgZmluYWwgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gTlVMTF9DT05GSUdVUkFUSU9OID0gbmV3IE51bGxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpOwotCi0JcHVibGljIENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHRoaXMpKTsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXNldENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkucmVtb3ZlUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJZkNvbmZpZ3VyYXRpb24gPSBOVUxMX0NPTkZJR1VSQVRJT047Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFbnRyeVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkgJiYgc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXN1cGVyLmhhbmRsZUVudHJ5U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlmU2VsZWN0ZWRFbnRyaWVzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU2VsZWN0ZWRFbnRyaWVzID0gbnVsbDsKLQkJCX0KLQkJCWZSZW1vdmVBY3Rpb24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElQYWdlU2l0ZSBwYWdlU2l0ZSkgewotCQlzdXBlci5pbml0KHBhZ2VTaXRlKTsKLQkJcGFnZVNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOwotCQlmTWVudU1hbmFnZXIgPSBtZW51TWFuYWdlcjsKLQkJZlRvb2xCYXJNYW5hZ2VyID0gdG9vbEJhck1hbmFnZXI7Ci0JCWZTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOwotCi0JCWZSZW1vdmVBY3Rpb24gPSBuZXcgUmVtb3ZlQWN0aW9uKHRoaXMpOwotCQl0b29sQmFyTWFuYWdlci5hZGQoZlJlbW92ZUFjdGlvbik7Ci0JCW1lbnVNYW5hZ2VyLmFkZChmUmVtb3ZlQWN0aW9uKTsKLQkJZ2V0Q29uZmlndXJhdGlvbigpLmFkZENvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7Ci0KLQkJbWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCX0KLQotCXZvaWQgcmVtb3ZlKCkgewotCQlpZiAoZlNlbGVjdGVkRW50cmllcyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbnRyaWVzID0gZlNlbGVjdGVkRW50cmllczsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZklucHV0OwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVByb3BlcnR5U291cmNlIHNvdXJjZSA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHRoaXMpLmdldFByb3BlcnR5U291cmNlKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UgaW5zdGFuY2VvZiBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24pIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoZW50cmllc1tpXSBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCQkJCQlJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVudHJpZXNbaV07Ci0JCQkJCQkJKChJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24pIHNvdXJjZSkucmVtb3ZlUHJvcGVydHkoZW50cnkuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZpbHRlciB0aGUgc2VsZWN0aW9uIHRocm91Z2ggdGhlIGN1cnJlbnQgQ29uZmlndXJhdGlvbi4gTm90IGV2ZXJ5Ci0JICogc2VsZWN0aW9uIHJlY2VpdmVkIGlzIGEgU3RydWN0dXJlZCBzZWxlY3Rpb24gbm9yIGFyZSB0aGUgU3RydWN0dXJlZAotCSAqIHNlbGVjdGlvbidzIGVsZW1lbnRzIGFsbCB0byBiZSBkaXNwbGF5ZWQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChfREVCVUcpIHsKLQkJCV9ERUJVR19USU1FID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmIGdldENvbnRyb2woKS5pc1Zpc2libGUoKSAmJiAhZ2V0Q29udHJvbCgpLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldElucHV0U2VsZWN0aW9uKHBhcnQsIHNlbGVjdGlvbik7Ci0JCQkvKgotCQkJICogRG8gc29tZSBtaW5vciBjYWNoaW5nIG9mIHRoZSBzZWxlY3Rpb24uCi0JCQkgKiAKLQkJCSAqIEFzIGEgUHJvcGVydHlTaGVldFBhZ2UsIHdlJ3ZlIGFsd2F5cyBub3RpZmllZCBvZiBzZWxlY3Rpb24KLQkJCSAqIGNoYW5nZXMsIGJ1dCB3ZSd2ZSBhbHNvIHN1YnNjcmliZWQgdG8gcG9zdCBzZWxlY3Rpb24KLQkJCSAqIG5vdGlmaWNhdGlvbiBzbyB3ZSBjYW4gdHJhY2sgY2FyZXQgbW92ZW1lbnRzIGluIHNvdXJjZSB2aWV3ZXJzLgotCQkJICogV2hlbiBzZWxlY3RpbmcgYSBibG9jayBvZiB0ZXh0LCB3ZSdyZSB0aHVzIG5vdGlmaWVkIG9mIHRoZSBuZXcKLQkJCSAqIHNlbGVjdGlvbiB0d2ljZS4gUmVtZW1iZXJpbmcgd2hhdCBvdXIgbGFzdCAqZWZmZWN0aXZlKgotCQkJICogc2VsZWN0aW9uIHdhcyBhbGxvd3MgdXMgdG8gY3V0IG91dCBtb3N0IG9mIHRoZQotCQkJICogZG91YmxlLW5vdGlmaWNhdGlvbiBwZW5hbHR5LgotCQkJICovCi0JCQlpZiAoIXByZWZlcnJlZFNlbGVjdGlvbi5lcXVhbHMoZklucHV0KSkgewotCQkJCWZJbnB1dCA9IHByZWZlcnJlZFNlbGVjdGlvbjsKLQkJCQlmU2VsZWN0ZWRFbnRyaWVzID0gbnVsbDsKLQkJCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHByZWZlcnJlZFNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJCWlmIChfREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIihQOnNlcnZpY2UgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHByZWZlcnJlZFNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKF9ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbc2tpcHBlZF0gKFA6IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlpZiAoZkNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb24ucmVtb3ZlQ29udHJpYnV0aW9ucyhmTWVudU1hbmFnZXIsIGZUb29sQmFyTWFuYWdlciwgZlN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCWZDb25maWd1cmF0aW9uLnVuY29uZmlndXJlKCk7Ci0JCX0KLQotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0KLQkJaWYgKGZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCXNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoZkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcih0aGlzKSk7Ci0JCQlmQ29uZmlndXJhdGlvbi5hZGRDb250cmlidXRpb25zKGZNZW51TWFuYWdlciwgZlRvb2xCYXJNYW5hZ2VyLCBmU3RhdHVzTGluZU1hbmFnZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXN1cGVyLnNldEZvY3VzKCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCk7Ci0JCQkJaWYgKGVkaXRvclNpdGUgIT0gbnVsbCkgewotCQkJCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBlZGl0b3JTaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlzZWxlY3Rpb25DaGFuZ2VkKGFjdGl2ZUVkaXRvciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0N1c3RvbVByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjkwNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBQcm9wZXJ0eURlc2NyaXB0b3IgewotCi0JcHJvdGVjdGVkIENsYXNzIGNlbGxFZGl0b3JDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIGEgdW5pcXVlIG5hbWUgYW5kIGEgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIGZvciB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIGRpc3BsYXkgZm9yIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IGlkLCBTdHJpbmcgbmV3RGlzcGxheU5hbWUsIENsYXNzIGVkaXRvckNsYXNzKSB7Ci0JCXN1cGVyKGlkLCBuZXdEaXNwbGF5TmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKChTdHJpbmcpIGlkKTsKLQkJc2V0Q2VsbEVkaXRvckNsYXNzKGVkaXRvckNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIGEgdW5pcXVlIG5hbWUgYW5kIGEgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSB1bmlxdWVOYW1lCi0JICogICAgICAgICAgICB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIGRpc3BsYXlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSB0byBkaXNwbGF5IGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyB1bmlxdWVOYW1lLCBTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJdGhpcyh1bmlxdWVOYW1lLCBuZXdEaXNwbGF5TmFtZSwgVGV4dENlbGxFZGl0b3IuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBDZWxsRWRpdG9yIGNyZWF0ZVByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5RWRpdG9yKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldENlbGxFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIGNlbGxFZGl0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0b3IgdXNlZCB0byBlZGl0IHRoZSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVkaXRvciBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIENlbGxFZGl0b3IgZ2V0UHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZ2V0Q2VsbEVkaXRvckNsYXNzKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnN0cnVjdG9yID0gZ2V0Q2VsbEVkaXRvckNsYXNzKCkuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtDb21wb3NpdGUuY2xhc3N9KTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IocGFyZW50KTsKLQkJfQotCQlpZiAoY29uc3RydWN0b3IgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKENlbGxFZGl0b3IpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtwYXJlbnR9KTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLQkJCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDZWxsRWRpdG9yQ2xhc3MoQ2xhc3MgbmV3Q2VsbEVkaXRvckNsYXNzKSB7Ci0JCWNlbGxFZGl0b3JDbGFzcyA9IG5ld0NlbGxFZGl0b3JDbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9SZW1vdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1JlbW92ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhiMjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1JlbW92ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgZlBhZ2U7Ci0KLQlwdWJsaWMgUmVtb3ZlQWN0aW9uKENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJc3VwZXIoKTsKLQkJZlBhZ2UgPSBwYWdlOwotCQlzZXRUZXh0KGdldFRleHQoKSk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfREVMRVRFKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9ERUxFVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5SZW1vdmVBY3Rpb25fMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWZQYWdlLnJlbW92ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1Nob3dQcm9wZXJ0aWVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaG93UHJvcGVydGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWJiMzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1Nob3dQcm9wZXJ0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU2hvd1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotLyoqCi0gKiBTdXJmYWNlcyB0aGUgUHJvcGVydGllcyB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgTml0aW4gRGFoeWFiaGFpCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93UHJvcGVydGllc0FjdGlvbiBleHRlbmRzIFNob3dWaWV3QWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFNob3dQcm9wZXJ0aWVzQWN0aW9uKCkgewotCQlzdXBlcihTU0VVSU1lc3NhZ2VzLlNob3dQcm9wZXJ0aWVzQWN0aW9uXzAsIEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST1BfUFMpKTsgLy8kTk9OLU5MUy0xJAotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElIZWxwQ29udGV4dElkcy5DT05UTU5VX1BST1BFUlRJRVNfSEVMUElEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdJRCgpIHsKLQkJcmV0dXJuIFZJRVdfSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDlmODExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9wcmVmZXJlbmNlcy9Db21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogQ29tbW9uIGVkaXRvciBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSB0aGUgU3RydWN0dXJlZCBUZXh0IEVkaXRvci4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGFzLXlvdS10eXBlIHZhbGlkYXRpb24KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMgPSBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2RlYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLQotCS8vIFRPRE9faXNzdWU6IElEb2N1bWVudFR5cGVIYW5kbGVyIGRvZXNuJ3Qgc2VlbSBjb3JyZWN0IGluIHRoaXMgQVBJLgotCS8vIHJlZXhhbWluZSBhbmQgc2VlIGlmIHNob3VsZCBiZSBNb2RlbEhhbmRsZXIsIG9yIENvbnRlbnRUeXBlSWRlbnRpZmVyCi0JLy8gaW5zdGVhZC4KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGFkZCB0aG9zZSBmYWN0b3JpZXMgcmVsYXRlZCB0byBlbWJlZGRlZCBjb250ZW50Ci0JICogdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxOTkwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgYmFzaWNhbGx5IGEgImZhY3RvcnkgZm9yIGZhY3RvcmllcyIuIEl0IGlzIHRvIHVzZWQgdG8gYXNzb2NpYXRlCi0gKiAiZWRpdCB0aW1lIiBBZGFwdGVyRmFjdG9yaWVzIHdpdGggYSBTdHJ1Y3R1cmVkTW9kZWwsIGJhc2VkIG9uIHRoZQotICogSVN0cnVjdHVyZWRNb2RlbCdzIENvbnRlbnRUeXBlRGVzY3JpcHRpb24uIEluIHBsdWdpbi54bWwgZmlsZXMsIHRoZXJlCi0gKiBzaG91bGQgYmUgYW4gQWRhcHRlckZhY3RvcnlQcm92aWRlciBkZWZpbmVkIGZvciBldmVyeSBkZWZpbml0aW9uIG9mCi0gKiBDb250ZW50VHlwZURlc2NyaXB0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgewotCi0JLyoqCi0JICogUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIGEgQ29sbGVjdGlvbiBvZiBBZGFwdGVyRmFjdG9yeVByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjlmMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uIHsKLQlJdGVyYXRvciBnZXRBZGFwdGVyRmFjdG9yaWVzKFN0cmluZyBjb250ZW50VHlwZUlEKTsKLQotCUxpc3QgZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdChTdHJpbmcgY29udGVudFR5cGVJRCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY1YmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LCBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8vIHRoaXMgbWFwIGV4aXN0cyBzbyB0aGVyZSBpcyBvbmx5IG9uZSBwcm92aWRlcgotCS8vIGluc3RhbmNlIG5vdCBkdXBsaWNhdGUgcHJvdmlkZXJzIGZvciBkaWZmZXJlbnQgY29udGVudCB0eXBlcwotCXByaXZhdGUgSGFzaE1hcCBhZGFwdGVyUHJvdmlkZXJzID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCS8qKgotCSAqIFRoaXMgSGFzaE1hcCBjb250YWluczogW2NvbnRlbnRUeXBlSWQgLT4gZWxlbWVudDJwcm92aWRlck1hcF0gfCBWCi0JICogW2NvbmZpZ3VyYXRpb25FbGVtZW50IC0+IEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJdCi0JICogCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGhhc2hNYXAgPSBudWxsOwotCi0JLy8gcHJvdmlkZXJzIHdpdGggbm8gY29udGVudCB0eXBlIGFzc29jaWF0ZWQKLQkvLyBqdXN0IGFkZGVkIHRocm91Z2ggdGhlIGFkZCguLi4pIG1ldGhvZAotCXByaXZhdGUgSGFzaFNldCB1bmFzc29jaWF0ZWRQcm92aWRlcnMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5oYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy51bmFzc29jaWF0ZWRQcm92aWRlcnMgPSBuZXcgSGFzaFNldCgpOwotCQl0aGlzLmFkYXB0ZXJQcm92aWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGRvZXNuJ3QgaW5zdGFudGlhdGUgY2xhc3NlcywganVzdCBzdG9yZXMgY29uZmlndXJhdGlvbiBlbGVtZW50cwotCQlBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLnJlYWRSZWdpc3RyeShoYXNoTWFwKTsKLQl9Ci0KLQl2b2lkIGFkZChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpIHsKLQkJdGhpcy51bmFzc29jaWF0ZWRQcm92aWRlcnMuYWRkKGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiR0VUVElORyBBTEwgQURBUFRFUiBGQUNUT1JJRVMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGFkZCBwcm92aWRlcnMgdGhhdCBoYXZlIG5vIGNvbnRlbnQgdHlwZSBzcGVjaWZpY2F0aW9uCi0JCXJlc3VsdHMuYWRkQWxsKHRoaXMudW5hc3NvY2lhdGVkUHJvdmlkZXJzKTsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLmhhc2hNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQljb250ZW50VHlwZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCi0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgKyBmb3I6ICIgKyBjb250ZW50VHlwZUlkKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlyZXN1bHRzLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KGNvbnRlbnRUeXBlSWQpKTsKLQkJfQotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdHMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QWRhcHRlckZhY3RvcmllcyhTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiR0VUVElORyBBREFQVEVSIEZBQ1RPUklFUyBmb3I6ICIgKyBjb250ZW50VHlwZUlEKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGFkZCBwcm92aWRlcnMgdGhhdCBoYXZlIG5vIGNvbnRlbnQgdHlwZSBzcGVjaWZpY2F0aW9uCi0JCXJlc3VsdHMuYWRkQWxsKHVuYXNzb2NpYXRlZFByb3ZpZGVycyk7Ci0KLQkJLy8gYWRkIHVua25vd24gY29udGVudCB0eXBlIHByb3ZpZGVycyAoZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5KQotCQlyZXN1bHRzLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIuVU5LTk9XTl9DT05URU5UX1RZUEUpKTsKLQotCQkvLyBhZGQgcHJvdmlkZXJzIGZvciBzcGVjaWZpYyBjb250ZW50IHR5cGUKLQkJcmVzdWx0cy5hZGRBbGwoZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdChQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKSkpOwotCi0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUlDb250ZW50VHlwZSB0eXBlID0gY29udGVudFR5cGU7Ci0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHR5cGUgIT0gbnVsbCAmJiAhdHlwZS5nZXRJZCgpLmVxdWFscyhJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpKSB7Ci0JCQlyZXN1bHRzLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KHR5cGUuZ2V0SWQoKSkpOwotCQkJdHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBVc2luZyB0aGlzIG5ldyBBUEksIG9ubHkgQWRhcHRlckZhY3RvcnlQcm92aWRlcnMgZm9yIGEgY2VydGFpbiBjb250ZW50Ci0JICogdHlwZSBhcmUgaW5zdGFudGlhdGVkLiBUaGlzIHdpbGwgYWxsb3cgZm9yIHRoZSBtaW5pbXVtIG51bWJlciBvZgotCSAqIHBsdWdpbnMgdG8gYmUgbG9hZGVkIHJhdGhlciB0aGFuIGFsbCB0aGF0IGltcGxlbWVudCB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlECi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoU3RyaW5nIGNvbnRlbnRUeXBlSUQpIHsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gZ2V0IGVsZW1lbnQyUHJvdmlkZXIgbWFwIGZvciBzcGVjaWZpZWQgY29udGVudCB0eXBlCi0JCU9iamVjdCBvID0gaGFzaE1hcC5nZXQoY29udGVudFR5cGVJRCk7Ci0JCWlmIChvICE9IG51bGwpIHsKLQkJCS8vIGluc3RhbnRpYXRlIGlmIG5lY2Vzc2FyeSBmcm9tCi0JCQkvLyBlbGVtZW50MmFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIKLQkJCS8vIG1hcAotCQkJTWFwIGVsZW1lbnQyUHJvdmlkZXIgPSAoTWFwKSBvOwotCQkJSXRlcmF0b3IgaXQgPSBlbGVtZW50MlByb3ZpZGVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKLQkJCU9iamVjdCBleGlzdGluZyA9IG51bGw7Ci0JCQlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHAgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJbyA9IGVsZW1lbnQyUHJvdmlkZXIuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBwcm92aWRlciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhbHJlYWR5IGNyZWF0ZWQ6ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCXJlc3VsdHMuYWRkKG8pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbmVlZCB0byBjcmVhdGUgdGhlIHByb3ZpZGVyCi0JCQkJCXRyeSB7Ci0JCQkJCQljbGFzc25hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCi0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhYm91dCB0byBjcmVhdGU6ICIgKyBjbGFzc25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCS8vIGNoZWNrIGlmIHdlIGNyZWF0ZWQgb25lIGFscmVhZHkKLQkJCQkJCWV4aXN0aW5nID0gdGhpcy5hZGFwdGVyUHJvdmlkZXJzLmdldChjbGFzc25hbWUpOwotCQkJCQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKLQkJCQkJCQkvLyB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlCi0JCQkJCQkJLy8gQWRhcHRlckZhY3RvcnlQcm92aWRlcnMKLQkJCQkJCQkvLyBhcmUgY3JlYXRlZAotCQkJCQkJCXAgPSAoQWRhcHRlckZhY3RvcnlQcm92aWRlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7IC8vICROT04tTkxTLTEkCi0JCQkJCQkJdGhpcy5hZGFwdGVyUHJvdmlkZXJzLnB1dChjbGFzc25hbWUsIHApOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcCA9IChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBleGlzdGluZzsKLQkJCQkJCX0KLQotCQkJCQkJLy8gYWRkIHRvIGVsZW1lbnQyUHJvdmlkZXIgZm9yIHRoaXMgY29udGVudFR5cGUKLQkJCQkJCWVsZW1lbnQyUHJvdmlkZXIucHV0KGVsZW1lbnQsIHApOwotCQkJCQkJLy8gYWRkIHRvIHJlc3VsdHMgdG8gcmV0dXJuIGZvciB0aGlzIG1ldGhvZAotCQkJCQkJcmVzdWx0cy5hZGQocCk7Ci0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZiB0aGUgcHJvdmlkZXIgdGhyb3dzIGFueSBleGNlcHRpb24sIGp1c3QgbG9nCi0JCQkJCQkvLyBhbmQKLQkJCQkJCS8vIGNvbnRpbnVlCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDQ5ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MganVzdCBjb252ZXJ0cyB3aGF0J3MgaW4gdGhlIHBsdWdpbnMgcmVnaXN0cnkgaW50byBhIGZvcm0gbW9yZQotICogZWFzaWx5IHVzZWFibGUgYnkgb3RoZXJzLCB0aGUgQ29udGVudFR5cGVSZWdpc3RyeS4KLSAqLwotY2xhc3MgQWRhcHRlckZhY3RvcnlSZWdpc3RyeVJlYWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX0NPTlRFTlRfVFlQRSA9ICJjb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19OQU1FID0gImFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTktOT1dOX0NPTlRFTlRfVFlQRSA9ICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYWRkcyBjb25maWd1cmF0aW9uIGVsZW1lbnQgdG8gY29udGVudFR5cGVJZCBtYXAgW2NvbnRlbnRUeXBlSWQgLT4KLQkgKiBlbGVtZW50MnByb3ZpZGVyTWFwXSB8IFYgW2VsZW1lbnQgLT4gcHJvdmlkZXJdCi0JICogCi0JICogTk9URTogdGhpcyBkb2Vzbid0IGNyZWF0ZSB0aGUgcHJvdmlkZXIgeWV0LCB0aGF0IG11c3QgYmUgZG9uZSBvbiBkZW1hbmQKLQkgKiBhbmQgc3RvcmVkIGluIHRoZSBhcHByb3ByaWF0ZSBlbGVtZW50MnByb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlkCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEVsZW1lbnRGb3JDb250ZW50VHlwZShIYXNoTWFwIG1hcCwgU3RyaW5nIGNvbnRlbnRUeXBlSWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJT2JqZWN0IG8gPSBtYXAuZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQlIYXNoTWFwIGVsZW1lbnQycHJvdmlkZXIgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSBleGVjdXRhYmxlIGV4dGVuc2lvbiB5ZXQKLQkJCWVsZW1lbnQycHJvdmlkZXIucHV0KGVsZW1lbnQsIG51bGwpOwotCQkJbWFwLnB1dChjb250ZW50VHlwZUlkLCBlbGVtZW50MnByb3ZpZGVyKTsKLQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQgIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUykgKyAiLCBidXQgZGlkbid0IGNyZWF0ZSBleGVjIGV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIHsKLQkJCS8vIGFkZCBlbGVtZW50IHRvIHVua25vd24gbGlzdCAobm90IGV4ZWN1dGFibGUgZXh0IHlldC4uLikKLQkJCUhhc2hNYXAgZWxlbWVudDJwcm92aWRlciA9IChIYXNoTWFwKSBvOwotCQkJZWxlbWVudDJwcm92aWRlci5wdXQoZWxlbWVudCwgbnVsbCk7Ci0KLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpICsgIiB0byB1bmtub3duIGxpc3QsIGJ1dCBkaWRuJ3QgY3JlYXRlIGV4ZWMgZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhlIG1hcCBwYXNzZWQgaW46IFtjb250ZW50VHlwZUlkIC0+IGVsZW1lbnQycHJvdmlkZXJNYXBdIHwgViBbZWxlbWVudCAtPgotCSAqIHByb3ZpZGVyXQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIEhhc2hNYXAgbWFwKSB7Ci0KLQkJQWRhcHRlckZhY3RvcnlQcm92aWRlciBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCXRyeSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0JCQkJYm9vbGVhbiBzcGVjaWZpZWRDb250ZW50VHlwZSA9IGZhbHNlOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJLy8gY29udGVudCB0eXBlcyBhcmUgc3BlY2lmaWVkCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChjaGlsZHJlbltpXS5nZXROYW1lKCkuZXF1YWxzKFRBR19DT05URU5UX1RZUEUpKSB7Ci0JCQkJCQkJLy8gaXQncyBwb3NzaWJsZSB0byBoYXZlIG5vbi1jb250ZW50VHlwZSBjaGlsZHJlbnQKLQkJCQkJCQlzcGVjaWZpZWRDb250ZW50VHlwZSA9IHRydWU7Ci0JCQkJCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gY2hpbGRyZW5baV0uZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQkJCQkJYWRkRWxlbWVudEZvckNvbnRlbnRUeXBlKG1hcCwgY29udGVudFR5cGUsIGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghc3BlY2lmaWVkQ29udGVudFR5cGUpIHsKLQkJCQkJLy8gbm8gY29udGVudCB0eXBlIGFzc29jaWF0aW9uCi0JCQkJCWFkZEVsZW1lbnRGb3JDb250ZW50VHlwZShtYXAsIFVOS05PV05fQ09OVEVOVF9UWVBFLCBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIHRoZSBwcm92aWRlciB0aHJvd3MgYW55IGV4Y2VwdGlvbiwganVzdCBsb2cgYW5kIGNvbnRpbnVlCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBzaW1wbHkgcmVxdWlyZSBhbiAnYWRkJyBtZXRob2QsIG9mIHdoYXQgZXZlciBpdCBpcyB3ZSBhcmUgdG8gcmVhZAotCSAqIGludG8KLQkgKi8KLQlzdGF0aWMgdm9pZCByZWFkUmVnaXN0cnkoSGFzaE1hcCBtYXApIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSwgbWFwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IG51bGw7Ci0KLQkvLyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX0NMQVNTID0gImFkYXB0ZXJDbGFzcyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERPQ19UWVBFX0lEID0gImRvY1R5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfTElTVCA9ICJtaW1lVHlwZUxpc3QiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLwotCS8qKgotCSAqIENvbnRlbnRUeXBlUmVnaXN0cnlSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTk0YTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciB7Ci0JcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gaGF2ZSB0byBkbyBpdCB0aGlzIHdheSBzbyBvdGhlcnMgY2FuIG92ZXJyaWRlIHRoZSBtZXRob2QKLQkJCWhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCS8vIHByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JLy8gTm90ZTogdGhlIHZhcj14LmNsYXNzIGNvbnRydWN0cyB3ZXJlIHB1dCBpbnRvIHRoaXMgbWV0aG9kCi0JLy8gYXMgYSB3b3JrYXJvdW5kIGZvciBzbG93IFZBSmF2YSBjbGFzcyBsb29rdXBzLiBUaGV5IGNvbXBpbGVyCi0JLy8gYXNzaWducyB0aGVtIHRvIGEgdmFyaWFibGUgaW4gdGhlIEpESywgYnV0IENsYXNzLmZvck5hbWUoIngiKQotCS8vIGluIFZBSmF2YS4gSXQgaXMgd29ya2Fyb3VuZCBzcGVjaWZpYyBmb3IgVkFKYXZhIGVudmlyb25tZW50LCBzbyBjb3VsZAotCS8vIGJlIHNpbXBsaWZpZWQgaW4gZnV0dXJlLgotCXN0YXRpYyBDbGFzcyBMaW5lU3R5bGVQcm92aWRlckNsYXNzID0gTGluZVN0eWxlUHJvdmlkZXIuY2xhc3M7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgSGlnaGxpZ2h0ZXIgZkhpZ2hsaWdodGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLyoqIENvbnRhaW5zIGFsbCB0ZXh0IGF0dHJpYnV0ZXMgcHJldGFpbmluZyB0byB0aGlzIGxpbmUgc3R5bGUgcHJvdmlkZXIgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlRleHRBdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8vIHdlIGtlZXAgdHJhY2sgb2YgTG9nTWVzc2FnZSB0byBhdm9pZCB3cml0aW5nIGh1bmRyZWRzIG9mIG1lc3NhZ2VzLAotCS8vIGJ1dCBzdGlsbCBnaXZlIGEgaGludCB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGF0dHJpYnV0ZVByb3ZpZGVycwotCS8vIGFuZC9vciByZWdpb25zLgotCS8vIEl0J3Mgb25seSB3cml0dGVuIGluIHRoZSBjYXNlIG9mIGEgcHJvZ3JhbSBlcnJvciwgYnV0IHRoZXJlJ3Mgbm8gdXNlCi0JLy8gYWRkaW5nCi0JLy8gc2FsdCB0byB0aGUgd291bmQuCi0JLy8gcHJpdmF0ZSBib29sZWFuIHdyb3RlT25lTG9nTWVzc2FnZTsKLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgY29sb3JLZXkgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIGFkZHMgdGhlIHN0eWxlCi0JICogaW5mb3JtYXRpb24gdG8gbGlzdCBvZiBUZXh0QXR0cmlidXRlcwotCSAqIAotCSAqIEBwYXJhbSBjb2xvcktleQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCWlmIChnZXRDb2xvclByZWZlcmVuY2VzKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRDb2xvclByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKGNvbG9yS2V5KTsKLQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQkJUkdCIGJhY2tncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzFdKTsKLQkJCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tbW9uSW5pdChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmSGlnaGxpZ2h0ZXIgPSBoaWdobGlnaHRlcjsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHZlcnNpb24gZG9lcyAidHJpbSIgcmVnaW9ucyB0byBtYXRjaCByZXF1ZXN0Ci0JICovCi0JcHJpdmF0ZSBTdHlsZVJhbmdlIGNyZWF0ZVN0eWxlUmFuZ2UoSVRleHRSZWdpb25Db2xsZWN0aW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24sIFRleHRBdHRyaWJ1dGUgYXR0ciwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCWlmIChzdGFydCA8IHN0YXJ0T2Zmc2V0KQotCQkJc3RhcnQgPSBzdGFydE9mZnNldDsKLQkJaW50IG1heE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7IC8vIHVzZSBnZXQgbGVuZ3RoIGRpcmVjdGx5Ci0JCS8vIGluc3RlYWQgb2YgZW5kLXN0YXJ0PwotCQlpZiAoZW5kID4gbWF4T2Zmc2V0KQotCQkJZW5kID0gbWF4T2Zmc2V0OwotCQlTdHlsZVJhbmdlIHJlc3VsdCA9IG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGF0dHIuZ2V0QmFja2dyb3VuZCgpLCBhdHRyLmdldFN0eWxlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShSR0IgZm9yZWdyb3VuZCwgUkdCIGJhY2tncm91bmQsIGJvb2xlYW4gYm9sZCkgewotCQlyZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgYm9sZCA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCk7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSGlnaGxpZ2h0ZXIgZ2V0SGlnaGxpZ2h0ZXIoKSB7Ci0JCXJldHVybiBmSGlnaGxpZ2h0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaHRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSB0ZXh0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGluZQotCSAqIHN0eWxlIHByb3ZpZGVyLiBMYXppbHkgY3JlYXRlcyBhIGhhc2h0YWJsZSBpZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4KLQkgKiBjcmVhdGVkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcCBnZXRUZXh0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbG9hZENvbG9ycygpOwotCQl9Ci0JCXJldHVybiBmVGV4dEF0dHJpYnV0ZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBmb3JjZSBhIGZ1bGwgdXBkYXRlIG9mIHRoZSB0ZXh0IHZpZXdlcgotCQlmSGlnaGxpZ2h0ZXIucmVmcmVzaERpc3BsYXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCi0JCWNvbW1vbkluaXQoc3RydWN0dXJlZERvY3VtZW50LCBoaWdobGlnaHRlcik7Ci0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkKLQkJCXJldHVybjsKLQotCQlyZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0KLQkJc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBMaW5lU3R5bGVQcm92aWRlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCXJldHVybiBmSW5pdGlhbGl6ZWQ7Ci0JfQotCQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKTsKLQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IGxpbmVSZXF1ZXN0U3RhcnQsIGludCBsaW5lUmVxdWVzdExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlmaW5hbCBpbnQgcGFydGl0aW9uU3RhcnRPZmZzZXQgPSB0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJZmluYWwgaW50IHBhcnRpdGlvbkxlbmd0aCA9IHR5cGVkUmVnaW9uLmdldExlbmd0aCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocGFydGl0aW9uU3RhcnRPZmZzZXQpOwotCQlib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQotCQloYW5kbGVkID0gcHJlcGFyZVRleHRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCwgaG9sZFJlc3VsdHMpOwotCi0JCXJldHVybiBoYW5kbGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGhvbGRSZXN1bHRzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwcmVwYXJlVGV4dFJlZ2lvbihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gYmxvY2tlZFJlZ2lvbiwgaW50IHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBpbnQgcGFydGl0aW9uTGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCQlmaW5hbCBpbnQgcGFydGl0aW9uRW5kT2Zmc2V0ID0gcGFydGl0aW9uU3RhcnRPZmZzZXQgKyBwYXJ0aXRpb25MZW5ndGggLSAxOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGJsb2NrZWRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgblJlZ2lvbnMgPSByZWdpb25zLnNpemUoKTsKLQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVnaW9uczsgaSsrKSB7Ci0JCQlyZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0ciA9IG51bGw7Ci0JCQlUZXh0QXR0cmlidXRlIHByZXZpb3VzQXR0ciA9IG51bGw7Ci0JCQlpZiAoYmxvY2tlZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pID4gcGFydGl0aW9uRW5kT2Zmc2V0KQotCQkJCWJyZWFrOwotCQkJaWYgKGJsb2NrZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPD0gcGFydGl0aW9uU3RhcnRPZmZzZXQpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQloYW5kbGVkID0gcHJlcGFyZVRleHRSZWdpb24oKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCBwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoLCBob2xkUmVzdWx0cyk7Ci0JCQl9IGVsc2UgewotCi0JCQkJYXR0ciA9IGdldEF0dHJpYnV0ZUZvcihyZWdpb24pOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJaGFuZGxlZCA9IHRydWU7Ci0JCQkJCS8vIGlmIHRoaXMgcmVnaW9uJ3MgYXR0ciBpcyB0aGUgc2FtZSBhcyBwcmV2aW91cyBvbmUsIHRoZW4KLQkJCQkJLy8ganVzdCBhZGp1c3QgdGhlIHByZXZpb3VzIHN0eWxlIHJhbmdlCi0JCQkJCS8vIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2Ygb25lCi0JCQkJCS8vIG5vdGU6IHRvIHVzZSAnZXF1YWxzJyBpbiB0aGlzIGNhc2UgaXMgaW1wb3J0YW50LCBzaW5jZQotCQkJCQkvLyBzb21ldGltZXMKLQkJCQkJLy8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiBhdHRyaWJ1dGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggYQotCQkJCQkvLyByZWdpb24sIGV2ZW4gdGhlCi0JCQkJCS8vIHRoZSBhdHRyaWJ1dGUgaGFzIHRoZSBzYW1lIHZhbHVlcy4KLQkJCQkJLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSBpbXByb3ZlZCB0byBoYW5kbGUgcmVhZG9ubHkKLQkJCQkJLy8gcmVnaW9ucyBjb3JyZWN0bHkKLQkJCQkJaWYgKChzdHlsZVJhbmdlICE9IG51bGwpICYmIChwcmV2aW91c0F0dHIgIT0gbnVsbCkgJiYgKHByZXZpb3VzQXR0ci5lcXVhbHMoYXR0cikpKSB7Ci0JCQkJCQlzdHlsZVJhbmdlLmxlbmd0aCArPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdHlsZVJhbmdlID0gY3JlYXRlU3R5bGVSYW5nZShibG9ja2VkUmVnaW9uLCByZWdpb24sIGF0dHIsIHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgpOwotCQkJCQkJaG9sZFJlc3VsdHMuYWRkKHN0eWxlUmFuZ2UpOwotCQkJCQkJLy8gdGVjaG5pY2FsbHkgc3BlYWtpbmcsIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlCi0JCQkJCQkvLyBwcmV2aW91c0F0dHIKLQkJCQkJCS8vIGluIHRoZSBvdGhlciBjYXNlLCBiZWNhdXNlIHRoZSBvdGhlciBjYXNlIGlzIHdoZW4KLQkJCQkJCS8vIGl0IGhhc24ndCBjaGFuZ2VkCi0JCQkJCQlwcmV2aW91c0F0dHIgPSBhdHRyOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJldmlvdXNBdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByZXBhcmVUZXh0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaW50IHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBpbnQgcGFydGl0aW9uTGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCQlmaW5hbCBpbnQgcGFydGl0aW9uRW5kT2Zmc2V0ID0gcGFydGl0aW9uU3RhcnRPZmZzZXQgKyBwYXJ0aXRpb25MZW5ndGggLSAxOwotCQl3aGlsZSAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPD0gcGFydGl0aW9uRW5kT2Zmc2V0KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaW50IG5SZWdpb25zID0gcmVnaW9ucy5zaXplKCk7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVnaW9uczsgaSsrKSB7Ci0JCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyID0gbnVsbDsKLQkJCQlUZXh0QXR0cmlidXRlIHByZXZpb3VzQXR0ciA9IG51bGw7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pID4gcGFydGl0aW9uRW5kT2Zmc2V0KQotCQkJCQlicmVhazsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pIDw9IHBhcnRpdGlvblN0YXJ0T2Zmc2V0KQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQkJaGFuZGxlZCA9IHByZXBhcmVUZXh0UmVnaW9uKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwgcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCwgaG9sZFJlc3VsdHMpOwotCQkJCX0gZWxzZSB7Ci0KLQkJCQkJYXR0ciA9IGdldEF0dHJpYnV0ZUZvcihyZWdpb24pOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQkJCS8vIGlmIHRoaXMgcmVnaW9uJ3MgYXR0ciBpcyB0aGUgc2FtZSBhcyBwcmV2aW91cyBvbmUsCi0JCQkJCQkvLyB0aGVuIGp1c3QgYWRqdXN0IHRoZSBwcmV2aW91cyBzdHlsZSByYW5nZQotCQkJCQkJLy8gaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiBvbmUKLQkJCQkJCS8vIG5vdGU6IHRvIHVzZSAnZXF1YWxzJyBpbiB0aGlzIGNhc2UgaXMgaW1wb3J0YW50LAotCQkJCQkJLy8gc2luY2Ugc29tZXRpbWVzCi0JCQkJCQkvLyBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIGF0dHJpYnV0ZXMgYXJlIGFzc29jaWF0ZWQKLQkJCQkJCS8vIHdpdGggYSByZWdpb24sIGV2ZW4gdGhlCi0JCQkJCQkvLyB0aGUgYXR0cmlidXRlIGhhcyB0aGUgc2FtZSB2YWx1ZXMuCi0JCQkJCQkvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkIHRvIGhhbmRsZSByZWFkb25seQotCQkJCQkJLy8gcmVnaW9ucyBjb3JyZWN0bHkKLQkJCQkJCWlmICgoc3R5bGVSYW5nZSAhPSBudWxsKSAmJiAocHJldmlvdXNBdHRyICE9IG51bGwpICYmIChwcmV2aW91c0F0dHIuZXF1YWxzKGF0dHIpKSkgewotCQkJCQkJCXN0eWxlUmFuZ2UubGVuZ3RoICs9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3R5bGVSYW5nZSA9IGNyZWF0ZVN0eWxlUmFuZ2Uoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZWdpb24sIGF0dHIsIHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgpOwotCQkJCQkJCWhvbGRSZXN1bHRzLmFkZChzdHlsZVJhbmdlKTsKLQkJCQkJCQkvLyB0ZWNobmljYWxseSBzcGVha2luZywgd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUKLQkJCQkJCQkvLyBwcmV2aW91c0F0dHIKLQkJCQkJCQkvLyBpbiB0aGUgb3RoZXIgY2FzZSwgYmVjYXVzZSB0aGUgb3RoZXIgY2FzZSBpcwotCQkJCQkJCS8vIHdoZW4gaXQgaGFzbid0IGNoYW5nZWQKLQkJCQkJCQlwcmV2aW91c0F0dHIgPSBhdHRyOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldmlvdXNBdHRyID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChEZWJ1Zy5zeW50YXhIaWdobGlnaHRpbmcgJiYgIWhhbmRsZWQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgaGFuZGxlZCBpbiBwcmVwYXJlUmVnaW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZiAhPSBudWxsKSB7Ci0JCQlwcmVmLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJCWZUZXh0QXR0cmlidXRlcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5pdGlhbGl6ZWQKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsaXplZCB0byBzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SW5pdGlhbGl6ZWQoYm9vbGVhbiBpbml0aWFsaXplZCkgewotCQl0aGlzLmZJbml0aWFsaXplZCA9IGluaXRpYWxpemVkOwotCX0KLQotCXByaXZhdGUgdm9pZCB1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZiA9IGdldENvbG9yUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWYgIT0gbnVsbCkgewotCQkJcHJlZi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0hpZ2hsaWdodGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvSGlnaGxpZ2h0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlZTY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvSGlnaGxpZ2h0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRvIGRpcmVjdGx5IG1lZGlhdGUgYmV0d2VlbiB0aGUgU3RydWN0dXJlZCBEb2N1bWVudCBkYXRhCi0gKiBzdHJ1Y3R1cmUgYW5kIHRoZSB0ZXh0IHdpZGdldCdzIHRleHQgYW5kIGV2ZW50cy4gSXQgYXNzdW1lcyB0aGVyZSBvbmx5IHRoZQotICogbW9kZWwgaXMgaW50ZXJlc3RlZCBpbiB0ZXh0IGV2ZW50cywgYW5kIGFsbCBvdGhlciB2aWV3cyB3aWxsIHdvcmsgZnJvbSB0aGF0Ci0gKiBtb2RlbC4gQ2hhbmdlcyB0byB0aGUgdGV4dCB3aWRnZXRzIGlucHV0IGNhbiBjYXVzZSBjaGFuZ2VzIGluIHRoZSBtb2RlbCwKLSAqIHdoaWNoIGluIHR1cm4gY2F1c2UgY2hhbmdlcyB0byB0aGUgd2lkZ2V0J3MgZGlzcGxheS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0ZXIgaW1wbGVtZW50cyBJSGlnaGxpZ2h0ZXIgewotCi0JLyoqCi0JICogQSB1dGlsaXR5IGNsYXNzIHRvIGRvIHZhcmlvdXMgY29sb3IgbWFuaXB1bGF0aW9ucwotCSAqLwotCXByaXZhdGUgY2xhc3MgWVVWX1JHQkNvbnZlcnRlciB7Ci0JCS8qKgotCQkgKiBUaGlzIGNsYXNzICJob2xkcyIgdGhlIFlVViB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBSR0IgY29sb3IKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgWVVWIHsKLQotCQkJY2xhc3MgTm9ybWFsaXplZFJHQiB7Ci0JCQkJZG91YmxlIGJsdWU7Ci0JCQkJZG91YmxlIGdyZWVuOwotCQkJCXByaXZhdGUgZmluYWwgZG91YmxlIG1heFJHQiA9IDI1Ni4wOwotCQkJCWRvdWJsZSByZWQ7Ci0KLQkJCQlwdWJsaWMgTm9ybWFsaXplZFJHQihSR0IgcmdiKSB7Ci0JCQkJCS8vIGZpcnN0IG5vcm1hbGl6ZSB0byBiZXR3ZWVuIDAgLSAxCi0JCQkJCXJlZCA9IHJnYi5yZWQgLyBtYXhSR0I7Ci0JCQkJCWdyZWVuID0gcmdiLmdyZWVuIC8gbWF4UkdCOwotCQkJCQlibHVlID0gcmdiLmJsdWUgLyBtYXhSR0I7Ci0KLQkJCQkJcmVkID0gZ2FtbWFOb3JtYWxpemVkKHJlZCk7Ci0JCQkJCWdyZWVuID0gZ2FtbWFOb3JtYWxpemVkKGdyZWVuKTsKLQkJCQkJYmx1ZSA9IGdhbW1hTm9ybWFsaXplZChibHVlKTsKLQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBOb3JtYWxpemVkUkdCIG5vcm1hbGl6ZWRSR0I7Ci0KLQkJCVJHQiBvcmlnaW5hbFJHQjsKLQkJCXByaXZhdGUgZG91YmxlIHUgPSAtMTsKLQkJCXByaXZhdGUgZG91YmxlIHYgPSAtMTsKLQkJCXByaXZhdGUgZG91YmxlIHkgPSAtMTsKLQotCQkJcHJpdmF0ZSBZVVYoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIFlVVihkb3VibGUgeSwgZG91YmxlIHUsIGRvdWJsZSB2KSB7Ci0JCQkJdGhpcygpOwotCQkJCXRoaXMueSA9IHk7Ci0JCQkJdGhpcy51ID0gdTsKLQkJCQl0aGlzLnYgPSB2OwotCQkJfQotCi0JCQlwdWJsaWMgWVVWKFJHQiByZ2IpIHsKLQkJCQl0aGlzKCk7Ci0JCQkJb3JpZ2luYWxSR0IgPSByZ2I7Ci0JCQkJbm9ybWFsaXplZFJHQiA9IG5ldyBOb3JtYWxpemVkUkdCKHJnYik7Ci0JCQkJLy8gZm9yY2UgY2FsY3VsYXRpb25zCi0JCQkJZ2V0WSgpOwotCQkJCWdldFYoKTsKLQkJCQlnZXRVKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogbm9ybWFsaXplIHRvICJhdmVyYWdlIiBnYW1tYSAyLjIyMjIgb3IgMS8wLjQ1Ci0JCQkgKi8KLQkJCWRvdWJsZSBnYW1tYU5vcm1hbGl6ZWQoZG91YmxlIGNvbG9yQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGNvbG9yQ29tcG9uZW50IDwgMC4wMTgpIHsKLQkJCQkJcmV0dXJuIGNvbG9yQ29tcG9uZW50ICogMC40NTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiAxLjA5OSAqIE1hdGgucG93KGNvbG9yQ29tcG9uZW50LCAwLjQ1KSAtIDAuMDk5OwotCQkJCX0KLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIFJHQiBiYXNlZCBvbiBvcmlnaW5hbCBSR0IgYW5kIGN1cnJlbnQgWVVWIHZhbHVlczsKLQkJCSAqLwotCQkJcHVibGljIFJHQiBnZXRSR0IoKSB7Ci0JCQkJUkdCIHJlc3VsdCA9IG51bGw7Ci0JCQkJZG91YmxlIHIgPSBnZXRZKCkgKyAxLjE0ICogZ2V0VigpOwotCQkJCWRvdWJsZSBnID0gZ2V0WSgpIC0gMC4zOTUgKiBnZXRVKCkgLSAwLjU4ICogZ2V0VigpOwotCQkJCWRvdWJsZSBiID0gZ2V0WSgpICsgMi4wMzIgKiBnZXRVKCk7Ci0KLQkJCQlpbnQgcmVkID0gKGludCkgKGludmVyc2VHYW1tYU5vcm1hbGl6ZWQocikgKiAyNTYpOwotCQkJCWludCBncmVlbiA9IChpbnQpIChpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGcpICogMjU2KTsKLQkJCQlpbnQgYmx1ZSA9IChpbnQpIChpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGIpICogMjU2KTsKLQkJCQlpZiAocmVkIDwgMCkKLQkJCQkJcmVkID0gMDsKLQkJCQllbHNlIGlmIChyZWQgPiAyNTUpCi0JCQkJCXJlZCA9IDI1NTsKLQkJCQlpZiAoZ3JlZW4gPCAwKQotCQkJCQlncmVlbiA9IDA7Ci0JCQkJZWxzZSBpZiAoZ3JlZW4gPiAyNTUpCi0JCQkJCWdyZWVuID0gMjU1OwotCQkJCWlmIChibHVlIDwgMCkKLQkJCQkJYmx1ZSA9IDA7Ci0JCQkJZWxzZSBpZiAoYmx1ZSA+IDI1NSkKLQkJCQkJYmx1ZSA9IDI1NTsKLQotCQkJCXJlc3VsdCA9IG5ldyBSR0IocmVkLCBncmVlbiwgYmx1ZSk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHVibGljIGRvdWJsZSBnZXRVKCkgewotCQkJCWlmICh1ID09IC0xKSB7Ci0JCQkJCXUgPSAwLjQ5NDkgKiAobm9ybWFsaXplZFJHQi5ibHVlIC0gZ2V0WSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHU7Ci0KLQkJCX0KLQotCQkJcHVibGljIGRvdWJsZSBnZXRWKCkgewotCQkJCWlmICh2ID09IC0xKSB7Ci0JCQkJCXYgPSAwLjg3NyAqIChub3JtYWxpemVkUkdCLnJlZCAtIGdldFkoKSk7Ci0JCQkJfQotCQkJCXJldHVybiB2OwotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFkoKSB7Ci0JCQkJaWYgKHkgPT0gLTEpIHsKLQkJCQkJeSA9IDAuMjk5ICogbm9ybWFsaXplZFJHQi5yZWQgKyAwLjU4NyAqIG5vcm1hbGl6ZWRSR0IuZ3JlZW4gKyAwLjExNCAqIG5vcm1hbGl6ZWRSR0IuYmx1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHk7Ci0JCQl9Ci0KLQkJCWRvdWJsZSBpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGRvdWJsZSBjb2xvckNvbXBvbmVudCkgewotCQkJCWlmIChjb2xvckNvbXBvbmVudCA8IDAuMDE4KSB7Ci0JCQkJCXJldHVybiBjb2xvckNvbXBvbmVudCAqIC4yMjI7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gTWF0aC5wb3coKCguOTA5OSAqIGNvbG9yQ29tcG9uZW50ICsgMC4wOSkpLCAyLjIyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyBZVVZfUkdCQ29udmVydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBkb3VibGUgY2FsY3VsYXRlWUNvbXBvbmVudChDb2xvciB0YXJnZXRDb2xvcikgewotCQkJcmV0dXJuIG5ldyBZVVYodGFyZ2V0Q29sb3IuZ2V0UkdCKCkpLmdldFkoKTsKLQkJfQotCi0JCXB1YmxpYyBSR0IgdHJhbnNmb3JtUkdCKFJHQiBvcmlnaW5hbFJHQiwgZG91YmxlIHNjYWxlRmFjdG9yLCBkb3VibGUgdGFyZ2V0KSB7Ci0JCQlSR0IgdHJhbnNmb3JtZWRSR0IgPSBudWxsOwotCQkJLy8gQ0NJUjYwMSB5dXYgPSBuZXcgQ0NJUjYwMShvcmlnaW5hbFJHQik7Ci0JCQlZVVYgeXV2ID0gbmV3IFlVVihvcmlnaW5hbFJHQik7Ci0JCQlkb3VibGUgeSA9IHl1di5nZXRZKCk7Ci0JCQkvLyB6ZXJvIGlzIGJsYWNrLCBvbmUgaXMgd2hpdGUKLQkJCWlmICh5IDwgdGFyZ2V0KSB7Ci0JCQkJLy8gaXMgImRhcmsiIG1ha2UgbGlnaHRlcgotCQkJCXkgPSB5ICsgKCh0YXJnZXQgLSB5KSAqIHNjYWxlRmFjdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlzICJsaWdodCIgbWFrZSBkYXJrZXIKLQkJCQl5ID0geSAtICgoeSAtIHRhcmdldCkgKiBzY2FsZUZhY3Rvcik7Ci0JCQl9Ci0JCQkvLyB5dXYuc2V0WSh5KTsKLQkJCVlVViBuZXdZVVYgPSBuZXcgWVVWKHksIHl1di5nZXRVKCksIHl1di5nZXRWKCkpOwotCQkJLy8gQ0NJUjYwMSBuZXdZVVYgPSBuZXcgQ0NJUjYwMSh5LCB5dXYuZ2V0Q2I2MDEoKSwKLQkJCS8vIHl1di5nZXRDcjYwMSgpKTsKLQkJCXRyYW5zZm9ybWVkUkdCID0gbmV3WVVWLmdldFJHQigpOwotCQkJcmV0dXJuIHRyYW5zZm9ybWVkUkdCOwotCQl9Ci0KLQkJcHVibGljIFJHQiB0cmFuc2Zvcm1SR0JUb0dyZXkoUkdCIG9yaWdpbmFsUkdCLCBkb3VibGUgc2NhbGVGYWN0b3IsIGRvdWJsZSB0YXJnZXQpIHsKLQkJCVJHQiB0cmFuc2Zvcm1lZFJHQiA9IG51bGw7Ci0JCQkvLyB3ZSBsZWZ0IHRoZSAiZnVsbCIgQVBJIG1ldGhvZCBzaWduYXR1cmUsIGJ1dCB0aGlzCi0JCQkvLyB2ZXJzaW9uIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IG9yaWdpbmFsUkdCLCB0aG91Z2gKLQkJCS8vIGl0IG1pZ2h0IHNvbWVkYXkuCi0JCQkvLyBmb3Igbm93LCB3ZSdsbCBzaW1wbHkgbWFrZSB0aGUgbmV3IFJHQiBncmV5LCBlaXRoZXIgYSBsaXR0bGUKLQkJCS8vIGxpZ2h0ZXIsIG9yIGEgbGl0dGxlIGRhcmtlciB0aGFuIGJhY2tncm91bmQuCi0JCQlkb3VibGUgeSA9IDA7Ci0JCQlkb3VibGUgbWlkID0gMC41OwotCQkJLy8gemVybyBpcyBibGFjaywgb25lIGlzIHdoaXRlCi0JCQlpZiAodGFyZ2V0IDwgbWlkKSB7Ci0JCQkJLy8gaXMgImRhcmsiIG1ha2UgbGlnaHRlcgotCQkJCXkgPSB0YXJnZXQgKyBzY2FsZUZhY3RvcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlzICJsaWdodCIgbWFrZSBkYXJrZXIKLQkJCQl5ID0gdGFyZ2V0IC0gc2NhbGVGYWN0b3I7Ci0JCQl9Ci0JCQlpbnQgYyA9IChpbnQpIE1hdGgucm91bmQoeSAqIDI1NSk7Ci0JCQkvLyBqdXN0IHRvIGdhdXJkIGFnYWluc3QgbWlzLXVzZSwgb3Igc2NhbGUncyB2YWx1ZXMgZ3JlYXRlcgotCQkJLy8gdGhhbiBtaWQgcG9pbnQgKGFuZCBwb3NzaWJseSByb3VuZGluZyBlcnJvcikKLQkJCWlmIChjID4gMjU1KQotCQkJCWMgPSAyNTU7Ci0JCQlpZiAoYyA8IDApCi0JCQkJYyA9IDA7Ci0JCQl0cmFuc2Zvcm1lZFJHQiA9IG5ldyBSR0IoYywgYywgYyk7Ci0JCQlyZXR1cm4gdHJhbnNmb3JtZWRSR0I7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIFN0eWxlUmFuZ2VbXSBFTVBUWV9TVFlMRV9SQU5HRSA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NUWUxFX1BST1ZJREVSX0VYVEVOREVEX0lEID0gImxpbmVzdHlsZXByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNQkVSX1NUWUxFUyA9IDUwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9TVFlMRVNfU0laRSA9IDIwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfU1RZTEVTX1NJWkUgPSAyMDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JRERMRV9TVFlMRVNfU0laRSA9IDE7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZGb3JlZ3JvdW5kU2NhbGVMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLQkJCQlJUHJlZmVyZW5jZVN0b3JlIGVkaXRvclN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCXJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlRmFjdG9yID0gZWRpdG9yU3RvcmUuZ2V0SW50KEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSk7Ci0JCQkJZGlzcG9zZUNvbG9yVGFibGUoKTsKLQkJCQlyZWZyZXNoRGlzcGxheSgpOwotCQkJfQotCQl9Ci0JfTsKLQlwcml2YXRlIExpc3QgZkhvbGRTdHlsZVJlc3VsdHM7Ci0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvbmluZyA9IElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc7Ci0KLQlwcml2YXRlIGludCBmU2F2ZWRMZW5ndGggPSAtMTsKLQlwcml2YXRlIGludCBmU2F2ZWRPZmZzZXQgPSAtMTsKLQlwcml2YXRlIFN0eWxlUmFuZ2VbXSBmU2F2ZWRSYW5nZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBNYXAgZlRhYmxlT2ZQcm92aWRlcnM7Ci0KLQlwcml2YXRlIE1hcCBmRXh0ZW5kZWRQcm92aWRlcnM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGluZVN0eWxlUHJvdmlkZXIgTk9PUF9QUk9WSURFUiA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvck5vT3AoKTsKLQotCXByaXZhdGUgZG91YmxlIHJlYWRPbmx5QmFja2dyb3VuZFNjYWxlRmFjdG9yID0gMTA7Ci0JcHJpdmF0ZSBIYXNodGFibGUgcmVhZE9ubHlDb2xvclRhYmxlOwotCWRvdWJsZSByZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciA9IDMwOwotCi0JcHJpdmF0ZSBZVVZfUkdCQ29udmVydGVyIHJnYkNvbnZlcnRlcjsKLQlwcml2YXRlIElUZXh0Vmlld2VyIHRleHRWaWV3ZXI7Ci0JcHJpdmF0ZSBTdHlsZWRUZXh0IHRleHRXaWRnZXQ7Ci0KLQlwdWJsaWMgSGlnaGxpZ2h0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQkvLyBpbiB0aGUgJ2xpbWl0U2l6ZScgbWV0aG9kLCB3ZSBtYWtlIHRoaXMgc3Ryb25nIGFzc3VtcHRpb24sIHNvLCB3aWxsIGNoZWNrIGhlcmUsIAotCQkvLyBzbyBpZiB0d2Vha2VkIGluIGZ1dHVyZSwgd2UnbGwgZ2V0IGEgcXVpY2sgcmVtaW5kZXIuIAotCQlpZiAoTEVGVF9TVFlMRVNfU0laRSArIE1JRERMRV9TVFlMRVNfU0laRSArIFJJR0hUX1NUWUxFU19TSVpFID4gTUFYX05VTUJFUl9TVFlMRVMpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkhpZ2hsaWdoZXIgY29uc3RhbnRzIGFyZSBub3QgZGVmaW5lZCBjb3JyZWN0bHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlyZXN1bHQuc3RhcnQgPSBzdGFydDsKLQkJcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aDsKLQkJaG9sZFJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGEgZ2l2ZW4gbGluZSBzdHlsZSBwcm92aWRlciBmb3IgYSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlLgotCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBsaW5lIHN0eWxlIHByb3ZpZGVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgdGhlCi0JICogbmV3IGxpbmUgc3R5bGUgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZCBpbnN0ZWFkIG9mIHRoZSBvbGQgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBsaW5lIHN0eWxlIHByb3ZpZGVyIHRvIHJlZ2lzdGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgcmVtb3ZlIGFuIGV4aXN0aW5nIG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlcikgewotCQlnZXRUYWJsZU9mUHJvdmlkZXJzKCkucHV0KHBhcnRpdGlvblR5cGUsIHByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3QgdGhlIHN0eWxlIHJhbmdlcycgc3RhcnQgYW5kIGxlbmd0aCBzbyB0aGF0IHRoZXkgcmVmZXIgdG8gdGhlCi0JICogdGV4dHZpZXdlciB3aWRnZXQncyByYW5nZSBpbnN0ZWFkIG9mIHRoZSB0ZXh0dmlld2VyJ3MgZG9jdW1lbnQgcmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJhbmdlcwotCSAqIEBwYXJhbSBhZGp1c3RtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0KFN0eWxlUmFuZ2VbXSByYW5nZXMsIGludCBhZGp1c3RtZW50KSB7Ci0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQotCQlpZiAoYWRqdXN0bWVudCAhPSAwKSB7Ci0JCQkvLyBqdXN0IHVzZSB0aGUgYWRqdXN0bWVudCB2YWx1ZQotCQkJLy8gY29udmVydCBkb2N1bWVudCByZWdpb25zIGJhY2sgdG8gd2lkZ2V0IHJlZ2lvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8ganVzdCBhZGp1c3QgdGhlIHJhbmdlIHVzaW5nIHRoZSBnaXZlbiBhZGp1c3RtZW50Ci0JCQkJcmFuZ2VzW2ldLnN0YXJ0ICs9IGFkanVzdG1lbnQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkvLyB1c2UgSVRleHRWaWV3ZXJFeHRlbnNpb241Ci0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCi0JCQkvLyBjb252ZXJ0IGRvY3VtZW50IHJlZ2lvbnMgYmFjayB0byB3aWRnZXQgcmVnaW9ucwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBnZXQgZG9jdW1lbnQgcmFuZ2UsIHRha2luZyBpbnRvIGFjY291bnQgZm9sZGluZwotCQkJCS8vIHJlZ2lvbnMgaW4gdmlld2VyCi0JCQkJSVJlZ2lvbiByZWdpb24gPSBleHRlbnNpb24ubW9kZWxSYW5nZTJXaWRnZXRSYW5nZShuZXcgUmVnaW9uKHJhbmdlc1tpXS5zdGFydCwgcmFuZ2VzW2ldLmxlbmd0aCkpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQlyYW5nZXNbaV0uc3RhcnQgPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCXJhbmdlc1tpXS5sZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJfSAvLyBlbHNlIHdoYXQgaGFwcGVucyBpZiByZWdpb24gaXMgbm90IGZvdW5kPyEKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBSZWFkIE9ubHkgYXJlYXMgaGF2ZSB1bmNoYW5nZWQgYmFja2dyb3VuZCBjb2xvcnMKLQkgKi8KLQl2b2lkIGFkanVzdEJhY2tncm91bmQoU3R5bGVSYW5nZSBzdHlsZVJhbmdlKSB7Ci0JCVJHQiBvbGRSR0IgPSBudWxsOwotCQlDb2xvciBvbGRDb2xvciA9IHN0eWxlUmFuZ2UuYmFja2dyb3VuZDsKLQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCW9sZENvbG9yID0gZ2V0VGV4dFdpZGdldCgpLmdldEJhY2tncm91bmQoKTsKLQkJfQotCQlvbGRSR0IgPSBvbGRDb2xvci5nZXRSR0IoKTsKLQkJQ29sb3IgbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQlpZiAobmV3Q29sb3IgPT0gbnVsbCkgewotCQkJZG91YmxlIHRhcmdldCA9IGdldFJHQkNvbnZlcnRlcigpLmNhbGN1bGF0ZVlDb21wb25lbnQob2xkQ29sb3IpOwotCQkJLy8gaWYgYmFja2dyb3VuZCBpcyAibGlnaHQiIG1ha2UgaXQgZGFya2VyLCBhbmQgdmljZSB2ZXJzYQotCQkJaWYgKHRhcmdldCA8IDAuNSkKLQkJCQl0YXJnZXQgPSAxLjA7Ci0JCQllbHNlCi0JCQkJdGFyZ2V0ID0gMC4wOwotCQkJUkdCIG5ld1JHQiA9IGdldFJHQkNvbnZlcnRlcigpLnRyYW5zZm9ybVJHQihvbGRSR0IsIHJlYWRPbmx5QmFja2dyb3VuZFNjYWxlRmFjdG9yIC8gMTAwLjAsIHRhcmdldCk7Ci0KLQkJCWNhY2hlQ29sb3Iob2xkUkdCLCBuZXdSR0IpOwotCQkJbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQl9Ci0JCXN0eWxlUmFuZ2UuYmFja2dyb3VuZCA9IG5ld0NvbG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGp1c3RGb3JlZ3JvdW5kKFN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSkgewotCQlSR0Igb2xkUkdCID0gbnVsbDsKLQkJLy8gQ29sb3Igb2xkQ29sb3IgPSBzdHlsZVJhbmdlLmZvcmVncm91bmQ7Ci0JCUNvbG9yIG9sZENvbG9yID0gc3R5bGVSYW5nZS5iYWNrZ3JvdW5kOwotCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJLy8gb2xkUkdCID0gZ2V0VGV4dFdpZGdldCgpLmdldEZvcmVncm91bmQoKS5nZXRSR0IoKTsKLQkJCW9sZENvbG9yID0gZ2V0VGV4dFdpZGdldCgpLmdldEJhY2tncm91bmQoKTsKLQkJCW9sZFJHQiA9IG9sZENvbG9yLmdldFJHQigpOwotCQl9Ci0JCWVsc2UgewotCQkJb2xkUkdCID0gb2xkQ29sb3IuZ2V0UkdCKCk7Ci0JCX0KLQkJQ29sb3IgbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQlpZiAobmV3Q29sb3IgPT0gbnVsbCkgewotCQkJLy8gbWFrZSB0ZXh0ICJjbG9zZXIgdG8iIGJhY2tncm91bmQgbHVtYW5lbmNlCi0JCQlkb3VibGUgdGFyZ2V0ID0gZ2V0UkdCQ29udmVydGVyKCkuY2FsY3VsYXRlWUNvbXBvbmVudChvbGRDb2xvcik7Ci0JCQlSR0IgbmV3UkdCID0gZ2V0UkdCQ29udmVydGVyKCkudHJhbnNmb3JtUkdCVG9HcmV5KG9sZFJHQiwgcmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVGYWN0b3IgLyAxMDAuMCwgdGFyZ2V0KTsKLQotCQkJLy8gc2F2ZSBjb252ZXJzaW9uLCBzbyBjYWxjdWxhdGlvbnMgb25seSBuZWVkIHRvIGJlIGRvbmUgb25jZQotCQkJY2FjaGVDb2xvcihvbGRSR0IsIG5ld1JHQik7Ci0JCQluZXdDb2xvciA9IGdldENhY2hlZENvbG9yRm9yKG9sZFJHQik7Ci0JCX0KLQkJc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID0gbmV3Q29sb3I7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgcmVhZC1vbmx5IGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSBvbGRSR0IKLQkgKiBAcGFyYW0gbmV3Q29sb3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FjaGVDb2xvcihSR0Igb2xkUkdCLCBSR0IgbmV3Q29sb3IpIHsKLQkJaWYgKHJlYWRPbmx5Q29sb3JUYWJsZSA9PSBudWxsKSB7Ci0JCQlyZWFkT25seUNvbG9yVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJcmVhZE9ubHlDb2xvclRhYmxlLnB1dChvbGRSR0IsIG5ld0NvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3R5bGVSYW5nZVtdIGNvbnZlcnRSZWFkT25seVJlZ2lvbnMoU3R5bGVSYW5nZVtdIHJlc3VsdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQotCQkvKioKLQkJICogKGRtdykgRm9yIGNsaWVudC9wcm92aWRlciBzaW1wbGljaXR5IChhbmQgY29uc2lzdGVudCBsb29rIGFuZCBmZWVsKQotCQkgKiB3ZSdsbCBoYW5kbGUgcmVhZG9ubHkgcmVnaW9ucyBpbiBvbmUgc3BvdCwgaGVyZSBpbiB0aGUgSGlnaGxpZ2h0ZXIuCi0JCSAqIEN1cnJlbnRseSBpdCBpcyBhIGZhaXIgYXNzdW1wdGlvbiB0aGF0IGVhY2ggcmVhZG9ubHkgcmVnaW9uIHdpbGwgYmUKLQkJICogb24gYW4gSVRleHRSZWdpb24gYm91bmRhcnksIHNvIHdlIGNvbWJpbmUgY29uc2VjdXRpdmUgc3R5bGVzIHdoZW4KLQkJICogZm91bmQgdG8gYmUgZXF1aXZhbGVudC4gUGx1cywgZm9yIG5vdywgd2UnbGwganVzdCBhZGp1c3QKLQkJICogZm9yZWdyb3VuZC4gRXZlbnR1YWxseSB3aWxsIHVzZSBhICJkaW1taW5nIiBhbGdyb3JpdGhtIHRvIGFkanVzdAotCQkgKiBjb2xvcidzIHNhdHVhdGlvbi9icmlnaHRuZXNzLgotCQkgKi8KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHN0YXJ0LCBsZW5ndGgpKSB7Ci0JCQkvLyBzb21ldGhpbmcgaXMgcmVhZC1vbmx5IGluIHRoZSBsaW5lLCBzbyBnbyB0aHJvdWdoIGVhY2ggc3R5bGUsCi0JCQkvLyBhbmQgYWRqdXN0Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IHJlc3VsdFtpXTsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkoc3R5bGVSYW5nZS5zdGFydCwgc3R5bGVSYW5nZS5sZW5ndGgpKSB7Ci0JCQkJCWFkanVzdEZvcmVncm91bmQoc3R5bGVSYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSByZWFkT25seUNvbG9yVGFibGUKLQkgKi8KLQl2b2lkIGRpc3Bvc2VDb2xvclRhYmxlKCkgewotCQlpZiAocmVhZE9ubHlDb2xvclRhYmxlICE9IG51bGwpIHsKLQkJCXJlYWRPbmx5Q29sb3JUYWJsZS5jbGVhcigpOwotCQl9Ci0JCXJlYWRPbmx5Q29sb3JUYWJsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMganVzdCB0byBnZXQgZXhpc3RpbmcgcmVhZC1vbmx5IGNvbG9ycy4KLQkgKi8KLQlwcml2YXRlIENvbG9yIGdldENhY2hlZENvbG9yRm9yKFJHQiBvbGRSR0IpIHsKLQkJQ29sb3IgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAocmVhZE9ubHlDb2xvclRhYmxlICE9IG51bGwpIHsKLQkJCVJHQiByZWFkT25seVJHQiA9IChSR0IpIHJlYWRPbmx5Q29sb3JUYWJsZS5nZXQob2xkUkdCKTsKLQkJCXJlc3VsdCA9IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmVhZE9ubHlSR0IpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQWRqdXN0IHRoZSBnaXZlbiB3aWRnZXQgb2Zmc2V0IGFuZCBsZW5ndGggc28gdGhhdCB0aGV5IGFyZSB0aGUKLQkgKiB0ZXh0dmlld2VyIGRvY3VtZW50J3Mgb2Zmc2V0IGFuZCBsZW5ndGgsIHRha2luZyBpbnRvIGFjY291bnQgd2hhdCBpcwotCSAqIGFjdHVhbGx5IHZpc2libGUgaW4gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybiBhIHJlZ2lvbiBjb250YWluaW5nIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCB3aXRoaW4gdGhlCi0JICogICAgICAgICB0ZXh0dmlld2VyJ3MgZG9jdW1lbnQgb3IgbnVsbCBpZiB0aGUgb2Zmc2V0IGlzIG5vdCB3aXRoaW4gdGhlCi0JICogICAgICAgICBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBnZXREb2N1bWVudFJhbmdlRnJvbVdpZGdldFJhbmdlKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJSVJlZ2lvbiBzdHlsZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJLy8gZ2V0IGRvY3VtZW50IHJhbmdlLCB0YWtpbmcgaW50byBhY2NvdW50IGZvbGRpbmcgcmVnaW9ucyBpbgotCQkJLy8gdmlld2VyCi0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCQkJc3R5bGVSZWdpb24gPSBleHRlbnNpb24ud2lkZ2V0UmFuZ2UyTW9kZWxSYW5nZShuZXcgUmVnaW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBnZXQgZG9jdW1lbnQgcmFuZ2UsIHRha2luZyBpbnRvIGFjY291bnQgdmlld2VyIHZpc2libGUgcmVnaW9uCi0JCQkvLyBnZXQgdmlzaWJsZSByZWdpb24gaW4gdmlld2VyCi0JCQlJUmVnaW9uIHZyID0gbnVsbDsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCQl2ciA9IHZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCk7Ci0JCQllbHNlCi0JCQkJdnIgPSBuZXcgUmVnaW9uKDAsIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyBpZiBvZmZzZXQgaXMgbm90IHdpdGhpbiB2aXNpYmxlIHJlZ2lvbiwgdGhlbiB3ZSBkb24ndCByZWFsbHkKLQkJCS8vIGNhcmUKLQkJCWlmIChvZmZzZXQgPD0gdnIuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkvLyBBZGp1c3QgdGhlIG9mZnNldCB0byBiZSB3aXRoaW4gdmlzaWJsZSByZWdpb24KLQkJCQlzdHlsZVJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0ICsgdnIuZ2V0T2Zmc2V0KCksIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0eWxlUmVnaW9uOwotCX0KLQotCi0JcHJpdmF0ZSBNYXAgZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSB7Ci0JCWlmIChmRXh0ZW5kZWRQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJZkV4dGVuZGVkUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoMyk7Ci0JCX0KLQkJcmV0dXJuIGZFeHRlbmRlZFByb3ZpZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0UHJvdmlkZXJGb3IuCi0JICogCi0JICogQHBhcmFtIHR5cGVkUmVnaW9uCi0JICogQHJldHVybiBMaW5lU3R5bGVQcm92aWRlcgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0UHJvdmlkZXJGb3IoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gdHlwZWRSZWdpb24uZ2V0VHlwZSgpOwotCQlMaW5lU3R5bGVQcm92aWRlciByZXN1bHQgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGZUYWJsZU9mUHJvdmlkZXJzLmdldCh0eXBlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBOT1QgWUVUIEZJTkFMSVpFRCAtIERPIE5PVCBDT05TSURFUiBBUyBBUEkKLQkJCXN5bmNocm9uaXplZCAoZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSkgewotCQkJCWlmICghZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5jb250YWluc0tleSh0eXBlKSkgewotCQkJCQlMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oTElORV9TVFlMRV9QUk9WSURFUl9FWFRFTkRFRF9JRCwgdHlwZSk7Ci0JCQkJCWdldEV4dGVuZGVkUHJvdmlkZXJzKCkucHV0KHR5cGUsIHByb3ZpZGVyKTsKLQkJCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXByb3ZpZGVyLmluaXQoZ2V0RG9jdW1lbnQoKSwgdGhpcyk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gcHJvdmlkZXI7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGdldEV4dGVuZGVkUHJvdmlkZXJzKCkuZ2V0KHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IE5PT1BfUFJPVklERVI7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFlVVl9SR0JDb252ZXJ0ZXIgZ2V0UkdCQ29udmVydGVyKCkgewotCQlpZiAocmdiQ29udmVydGVyID09IG51bGwpIHsKLQkJCXJnYkNvbnZlcnRlciA9IG5ldyBZVVZfUkdCQ29udmVydGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJnYkNvbnZlcnRlcjsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRUYWJsZU9mUHJvdmlkZXJzKCkgewotCQlpZiAoZlRhYmxlT2ZQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJZlRhYmxlT2ZQcm92aWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmVGFibGVPZlByb3ZpZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0Vmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgSVRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIHRleHRWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHlsZWRUZXh0IGdldFRleHRXaWRnZXQoKSB7Ci0JCXJldHVybiB0ZXh0V2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIGhpZ2hsaWdodGVyIHN1cHBvcnQgb24gdGhlIGdpdmVuIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIgb24gd2hpY2ggY29udGVudCBhc3Npc3Qgd2lsbCB3b3JrCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciBuZXdUZXh0Vmlld2VyKSB7Ci0JCXRoaXMudGV4dFZpZXdlciA9IG5ld1RleHRWaWV3ZXI7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBlZGl0b3JTdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZWRpdG9yU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmRm9yZWdyb3VuZFNjYWxlTGlzdGVuZXIpOwotCQlyZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciA9IGVkaXRvclN0b3JlLmdldEludChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUpOwotCi0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwpIHsKLQkJCXRleHRXaWRnZXQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJdGV4dFdpZGdldCA9IG5ld1RleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQl0ZXh0V2lkZ2V0LmFkZExpbmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcmVmcmVzaERpc3BsYXkoKTsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVSYW5nZVtdIGxpbmVHZXRTdHlsZShpbnQgZXZlbnRMaW5lT2Zmc2V0LCBpbnQgZXZlbnRMaW5lTGVuZ3RoKSB7Ci0JCVN0eWxlUmFuZ2VbXSBldmVudFN0eWxlcyA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCQl0cnkgewotCQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCB8fCBldmVudExpbmVMZW5ndGggPT0gMCkgewotCQkJCS8vIGdldERvY3VtZW50KCkgPT0gbnVsbAotCQkJCS8vIGR1cmluZyBpbml0aWFsaXphdGlvbiwgdGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIGJlZm9yZSBvdXIKLQkJCQkvLyBzdHJ1Y3R1cmVkCi0JCQkJLy8gaXMgc2V0LCBpbiB3aGljaCBjYXNlIHdlIHNldCBzdHlsZXMgdG8gYmUgdGhlIGVtcHR5IHN0eWxlCi0JCQkJLy8gcmFuZ2UKLQkJCQkvLyAoZXZlbnQuc3R5bGVzIGNhbiBub3QgYmUgbnVsbCkKLQotCQkJCS8vIGV2ZW50TGluZUxlbmd0aCA9PSAwCi0JCQkJLy8gd2Ugc29tZXRpbWVzIGdldCBvZGQgcmVxdWVzdHMgZnJvbSB0aGUgdmVyeSBsYXN0IENSTEYgaW4KLQkJCQkvLyB0aGUKLQkJCQkvLyBkb2N1bWVudAotCQkJCS8vIGl0IGhhcyBubyBsZW5ndGgsIGFuZCB0aGVyZSBpcyBubyBub2RlIGZvciBpdCEKLQkJCQlldmVudFN0eWxlcyA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBMaW5lU3R5bGVQcm92aWRlcnMgd29yayB1c2luZyBhYnNvbHV0ZSBkb2N1bWVudCBvZmZzZXRzLiBUbwotCQkJCSAqIHN1cHBvcnQgdmlzaWJsZSByZWdpb25zLCBhZGp1c3QgdGhlIHJlcXVlc3RlZCByYW5nZSB1cCB0bwotCQkJCSAqIHRoZSBmdWxsIGRvY3VtZW50IG9mZnNldHMuCi0JCQkJICovCi0JCQkJSVJlZ2lvbiBzdHlsZVJlZ2lvbiA9IGdldERvY3VtZW50UmFuZ2VGcm9tV2lkZ2V0UmFuZ2UoZXZlbnRMaW5lT2Zmc2V0LCBldmVudExpbmVMZW5ndGgpOwotCQkJCWlmIChzdHlsZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCBzdGFydCA9IHN0eWxlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gc3R5bGVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IFRleHRVdGlsaXRpZXMuY29tcHV0ZVBhcnRpdGlvbmluZyhnZXREb2N1bWVudCgpLCBmUGFydGl0aW9uaW5nLCBzdGFydCwgbGVuZ3RoLCBmYWxzZSk7Ci0JCQkJCWV2ZW50U3R5bGVzID0gcHJlcGFyZVN0eWxlUmFuZ2VzQXJyYXkocGFydGl0aW9ucywgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkJLyoKLQkJCQkJICogSWYgdGhlcmUgaXMgYSBzdWJ0ZXh0IG9mZnNldCwgdGhlIHN0eWxlIHJhbmdlcyBtdXN0IGJlCi0JCQkJCSAqIGFkanVzdGVkIHRvIHRoZSBleHBlY3RlZCBvZmZzZXRzIGp1c3QgY2hlY2sgaWYKLQkJCQkJICogZXZlbnRMaW5lT2Zmc2V0IGlzIGRpZmZlcmVudCB0aGFuIHN0YXJ0IHRoZW4gYWRqdXN0LAotCQkJCQkgKiBvdGhlcndpc2UgdSBjYW4gbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHRoZXJlIGlzIHNwZWNpYWwKLQkJCQkJICogaGFuZGxpbmcgZm9yIGl0ZXh0dmlld2VyZXh0ZW5zaW9uNT8KLQkJCQkJICovCi0JCQkJCWlmIChzdGFydCAhPSBldmVudExpbmVPZmZzZXQpIHsKLQkJCQkJCWludCBvZmZzZXQgPSAwOwotCQkJCQkJLy8gZmlndXJlIG91dCB2aXNpYmxlIHJlZ2lvbiB0byB1c2UgZm9yIGFkanVzdG1lbnQKLQkJCQkJCS8vIG9ubHkgYWRqdXN0IGlmIG5lZWQgdG8KLQkJCQkJCWlmICghKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkpIHsKLQkJCQkJCQlJUmVnaW9uIHZyID0gZ2V0VGV4dFZpZXdlcigpLmdldFZpc2libGVSZWdpb24oKTsKLQkJCQkJCQlpZiAodnIgIT0gbnVsbCkgewotCQkJCQkJCQlvZmZzZXQgPSB2ci5nZXRPZmZzZXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlhZGp1c3QoZXZlbnRTdHlsZXMsIC1vZmZzZXQpOwotCQkJCQl9Ci0KLQkJCQkJZXZlbnRTdHlsZXMgPSBsaW1pdFNpemUoZXZlbnRTdHlsZXMpOwotCQkJCQkKLQkJCQkJLy8gZm9yIGRlYnVnZ2luZyBvbmx5Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJaWYgKCF2YWxpZChldmVudFN0eWxlcywgZXZlbnRMaW5lT2Zmc2V0LCBldmVudExpbmVMZW5ndGgpKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkhpZ2hsaWdodGVyOjpsaW5lR2V0U3R5bGUgZm91bmQgaW52YWxpZCBzdHlsZXMgYXQgb2Zmc2V0ICIgKyBldmVudExpbmVPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgQU5ZIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIGhpZ2hsaWdodGluZywKLQkJCS8vIGp1c3QgcmV0dXJuICJubyBoaWdobGlnaHRpbmciCi0JCQlldmVudFN0eWxlcyA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCQkJaWYgKERlYnVnLnN5bnRheEhpZ2hsaWdodGluZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyBoaWdobGlnaHRpbmchIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBldmVudFN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byBjZW50cmFsaXplIHRoZSBsb2dpYyBpbiBsaW1pdGluZyB0aGUgb3ZlcmFsbCBudW1iZXIgb2Ygc3R5bGUgcmFuZ2VzCi0JICogdGhhdCBtYWtlIGl0IHRvIHRoZSBzdHlsZWQgdGV4dCB3aWRnZXQuIAotCSAqIAotCSAqIFRvbyBtYW55IHN0eWxlcyBzZW50IHRvIFN0eWxlZFRleHQgcmVzdWx0cyBpbiBhcHBhcmVudCwgYnV0IG5vdCByZWFsLCAKLQkgKiBoYW5ncyBvZiBFY2xpcHNlIERpc3BsYXkgdGhyZWFkLiBTZWUgIAotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg4MDYKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRTdHlsZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JIHByaXZhdGUgU3R5bGVSYW5nZVtdIGxpbWl0U2l6ZShTdHlsZVJhbmdlW10gZXZlbnRTdHlsZXMpIHsKLQkJCi0JCS8vIHF1aWNrIHJldHVybiB3aXRoIHNhbWUgb2JqZWN0IGlmIG5vdCBtb2RpZmljYXRpb24gbmVlZGVkCi0JCWlmIChldmVudFN0eWxlcy5sZW5ndGggPCBNQVhfTlVNQkVSX1NUWUxFUykgewotCQkJcmV0dXJuIGV2ZW50U3R5bGVzOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gd2UgY291bGQganVzdCB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYW5kIHRydW5jYXRlLCBidXQgd2lsbCAKLQkJCS8vIGJlIG11Y2ggYmV0dGVyIGFwcGVhcmluZyBpZiBib3RoIHRoZSBzdGFydCBvZiB0aGUgbGluZSBhbmQgdGhlIAotCQkJLy8gZW5kIG9mIHRoZSBsaW5lIGFyZSBkaXNwbGF5ZWQgd2l0aCBzdHlsZXMuIFNpbmNlIHRoZXNlIGFyZSBib3RoCi0JCQkvLyB0aGUgcGFydHMgb2YgdGhlIGxpbmUgYSB1c2VyIGlzIGxpa2VseSB0byBsb29rIGF0LiBUaGUgbWlkZGxlIG9mIHRoZSAKLQkJCS8vIGxpbmUgd2lsbCBzdGlsbCBiZSAicGxhaW4iLiBQcmVzdW1hYmx5LCB0aGUgdXNlciB3b3VsZCByZS1mb3JtYXQgdGhlIAotCQkJLy8gZmlsZSB0byBhdm9pZCBsb25nIGxpbmVzLCBzbyB1bmxpa2VseSB0byBzZWUgdGhlIG1pZGRsZS4gCi0JCQlTdHlsZVJhbmdlW10gbmV3UmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbTEVGVF9TVFlMRVNfU0laRSArIFJJR0hUX1NUWUxFU19TSVpFICsgTUlERExFX1NUWUxFU19TSVpFXTsgCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGV2ZW50U3R5bGVzLCAwLCBuZXdSYW5nZXMsIDAsIExFRlRfU1RZTEVTX1NJWkUpOwotCQkJLy8KLQkJCS8vIGRvIGVuZCwgYmVmb3JlIHdlIGRvIG1pZGRsZQotCQkJU3lzdGVtLmFycmF5Y29weShldmVudFN0eWxlcywgZXZlbnRTdHlsZXMubGVuZ3RoLVJJR0hUX1NUWUxFU19TSVpFLCBuZXdSYW5nZXMsIExFRlRfU1RZTEVTX1NJWkUgKyBNSURETEVfU1RZTEVTX1NJWkUsIFJJR0hUX1NUWUxFU19TSVpFKTsKLQkJCS8vCi0JCQkvLyB0ZWNobmljYWxseSwgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlIGV4YWN0IG1pZGRsZSBhcyBvbmUgYmlnIHN0eWxlIHJhbmdlLCAKLQkJCS8vIHdpdGggZGVmYXVsdCBjb2xvcnMgYW5kIHN0eWxlcywgc28gaWYgc29tZW9uZSBkb2VzIGFjdHVhbGx5IHR5cGUgb3Igd29yayB3aXRoIAotCQkJLy8gZG9jdW1uZXQgYXMgaXMsIHdpbGwgc3RpbGwgYmUgY29ycmVjdC4gCi0JCQkvLwotCQkJU3R5bGVSYW5nZSBhbGxCbGFuayA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCQlTdHlsZVJhbmdlIGxhc3RLbm93biA9IG5ld1Jhbmdlc1tMRUZUX1NUWUxFU19TSVpFIC0gMV07Ci0JCQlhbGxCbGFuay5zdGFydCA9IGxhc3RLbm93bi5zdGFydCArIGxhc3RLbm93bi5sZW5ndGg7Ci0JCQlTdHlsZVJhbmdlIG5leHRLbm93biA9IG5ld1Jhbmdlc1tMRUZUX1NUWUxFU19TSVpFICsgTUlERExFX1NUWUxFU19TSVpFICsgMV07Ci0JCQlhbGxCbGFuay5sZW5ndGggPSBuZXh0S25vd24uc3RhcnQgLSBhbGxCbGFuay5zdGFydDsKLQkJCW5ld1Jhbmdlc1tMRUZUX1NUWUxFU19TSVpFXSA9IGFsbEJsYW5rOwotCQkJcmV0dXJuIG5ld1JhbmdlczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgcGFzc3Rocm91Z2ggbWV0aG9kIHRoYXQgZXh0cmFjdHMgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZQotCSAqIExpbmVTdHlsZUV2ZW50IGFuZCBwYXNzZXMgaXQgYWxvbmcuIFRoaXMgbWV0aG9kIHdhcyBzZXBhcmF0ZWQgZm9yCi0JICogcGVyZm9ybWFuY2UgdGVzdGluZyBwdXJwb3Nlcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZVN0eWxlTGlzdGVuZXIjbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQlpbnQgb2Zmc2V0ID0gZXZlbnQubGluZU9mZnNldDsKLQkJaW50IGxlbmd0aCA9IGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpOwotCi0JCS8qCi0JCSAqIEZvciBzb21lIHJlYXNvbiwgd2UgYXJlIHNvbWV0aW1lcyBhc2tlZCBmb3IgdGhlIHNhbWUgc3R5bGUgcmFuZ2UKLQkJICogb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gVGhpcyB3YXMgZm91bmQgdG8gaGFwcGVuIGR1cmluZyAncmV2ZXJ0JyBvZiBhCi0JCSAqIGZpbGUgd2l0aCBvbmUgbGluZSBpbiBpdCB0aGF0IGlzIDQwSyBsb25nISBTbywgd2hpbGUgd2UgZG9uJ3Qga25vdwotCQkgKiByb290IGNhdXNlLCBjYWNoaW5nIHRoZSBzdHlsZWQgcmFuZ2VzIGluIGNhc2UgdGhlIGV4YWN0IHNhbWUKLQkJICogcmVxdWVzdCBpcyBtYWRlIG11bHRpcGxlIHRpbWVzIHNlZW1zIGxpa2UgY2hlYXAgaW5zdXJhbmNlLgotCQkgKi8KLQkJaWYgKG9mZnNldCA9PSBmU2F2ZWRPZmZzZXQgJiYgbGVuZ3RoID09IGZTYXZlZExlbmd0aCAmJiBmU2F2ZWRSYW5nZXMgIT0gbnVsbCkgewotCQkJZXZlbnQuc3R5bGVzID0gZlNhdmVkUmFuZ2VzOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gbmVlZCB0byBhc3NpZ24gdGhpcyBhcnJheSBoZXJlLCBvciBlbHNlIHRoZSBmaWVsZCB3b24ndCBnZXQKLQkJCS8vIHVwZGF0ZWQKLQkJCWV2ZW50LnN0eWxlcyA9IGxpbmVHZXRTdHlsZShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkvLyBub3cgc2F2ZWQgImNhY2hlZCBkYXRhIiBmb3IgcmVwZWF0ZWQgcmVxdWVzdHMgd2hpY2ggYXJlIGV4YWNsdHkKLQkJCS8vIHNhbWUKLQkJCWZTYXZlZE9mZnNldCA9IG9mZnNldDsKLQkJCWZTYXZlZExlbmd0aCA9IGxlbmd0aDsKLQkJCWZTYXZlZFJhbmdlcyA9IGV2ZW50LnN0eWxlczsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGU6IGl0cyB2ZXJ5IGltcG9ydGFudCB0aGlzIG1ldGhvZCBuZXZlciByZXR1cm4gbnVsbCwgd2hpY2ggaXMgd2h5Ci0JICogdGhlIGZpbmFsIG51bGwgY2hlY2sgaXMgaW4gYSBmaW5hbGx5IGNsYXVzZQotCSAqLwotCi0JcHJvdGVjdGVkIFN0eWxlUmFuZ2VbXSBwcmVwYXJlU3R5bGVSYW5nZXNBcnJheShJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQotCQlTdHlsZVJhbmdlW10gcmVzdWx0ID0gRU1QVFlfU1RZTEVfUkFOR0U7Ci0KLQkJaWYgKGZIb2xkU3R5bGVSZXN1bHRzID09IG51bGwpIHsKLQkJCWZIb2xkU3R5bGVSZXN1bHRzID0gbmV3IEFycmF5TGlzdChwYXJ0aXRpb25zLmxlbmd0aCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmSG9sZFN0eWxlUmVzdWx0cy5jbGVhcigpOwotCQl9Ci0KLQkJLy8gVE9ETzogbWFrZSBzb21lIG9mIHRoZXNlIGluc3RhbmNlIHZhcmlhYmxlcyB0byBwcmV2ZW50IGNyZWF0aW9uIG9uCi0JCS8vIHN0YWNrCi0JCUxpbmVTdHlsZVByb3ZpZGVyIGN1cnJlbnRMaW5lU3R5bGVQcm92aWRlciA9IG51bGw7Ci0JCWJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlUeXBlZFJlZ2lvbiBjdXJyZW50UGFydGl0aW9uID0gcGFydGl0aW9uc1tpXTsKLQkJCWN1cnJlbnRMaW5lU3R5bGVQcm92aWRlciA9IGdldFByb3ZpZGVyRm9yKGN1cnJlbnRQYXJ0aXRpb24pOwotCQkJY3VycmVudExpbmVTdHlsZVByb3ZpZGVyLmluaXQoZ2V0RG9jdW1lbnQoKSwgdGhpcyk7Ci0JCQloYW5kbGVkID0gY3VycmVudExpbmVTdHlsZVByb3ZpZGVyLnByZXBhcmVSZWdpb25zKGN1cnJlbnRQYXJ0aXRpb24sIGN1cnJlbnRQYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIGN1cnJlbnRQYXJ0aXRpb24uZ2V0TGVuZ3RoKCksIGZIb2xkU3R5bGVSZXN1bHRzKTsKLQkJCWlmIChEZWJ1Zy5zeW50YXhIaWdobGlnaHRpbmcgJiYgIWhhbmRsZWQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRpZCBub3QgaGFuZGxlIGhpZ2hsaWdodGluZyBpbiBIaWdobGlnaHRlciBpbm5lciB3aGlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpbnQgcmVzdWx0U2l6ZSA9IGZIb2xkU3R5bGVSZXN1bHRzLnNpemUoKTsKLQkJaWYgKHJlc3VsdFNpemUgPiAwKSB7Ci0JCQlyZXN1bHQgPSAoU3R5bGVSYW5nZVtdKSBmSG9sZFN0eWxlUmVzdWx0cy50b0FycmF5KG5ldyBTdHlsZVJhbmdlW2ZIb2xkU3R5bGVSZXN1bHRzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gRU1QVFlfU1RZTEVfUkFOR0U7Ci0JCX0KLQkJcmVzdWx0ID0gY29udmVydFJlYWRPbmx5UmVnaW9ucyhyZXN1bHQsIHN0YXJ0LCBsZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaXNwbGF5KCkgewotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkKLQkJCXRleHRXaWRnZXQucmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaERpc3BsYXkoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwgJiYgIXRleHRXaWRnZXQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dFdpZGdldC5yZWRyYXdSYW5nZShzdGFydCwgbGVuZ3RoLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlnZXRUYWJsZU9mUHJvdmlkZXJzKCkucmVtb3ZlKHBhcnRpdGlvblR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCQlpZiAocGFydGl0aW9uaW5nICE9IG51bGwpIHsKLQkJCWZQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGFydGl0aW9uaW5nID0gSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgaGlnaGxpZ2h0ZXIgc3VwcG9ydCBmcm9tIHRoZSB0ZXh0IHZpZXdlciBpdCBoYXMgcHJldmlvdXNseQotCSAqIGJlIGluc3RhbGxlZCBvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwgJiYgIXRleHRXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0ZXh0V2lkZ2V0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXRleHRXaWRnZXQgPSBudWxsOwotCi0JCUNvbGxlY3Rpb24gcHJvdmlkZXJzID0gZ2V0VGFibGVPZlByb3ZpZGVycygpLnZhbHVlcygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlMaW5lU3R5bGVQcm92aWRlciBsaW5lU3R5bGVQcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJbGluZVN0eWxlUHJvdmlkZXIucmVsZWFzZSgpOwotCQkJLy8gdGhpcyByZW1vdmUgcHJvYmFibHkgaXNuJ3Qgc3RyaWN0bHkgbmVlZGVkLCBzaW5jZQotCQkJLy8gdHlwaWNhbGx5IGhpZ2hsaWdodGVyIGluc3RhbmNlIGFzIGEgd2hvbGUgd2lsbCBnbwotCQkJLy8gYXdheSAuLi4gYnV0IGluIGNhc2UgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgc2VlbXMgbGlrZQotCQkJLy8gYSBiZXR0ZXIgc3R5bGUuCi0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCAoZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSkgewotCQkJcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdChnZXRFeHRlbmRlZFByb3ZpZGVycygpLnZhbHVlcygpKTsKLQkJCWdldEV4dGVuZGVkUHJvdmlkZXJzKCkuY2xlYXIoKTsKLQkJfQotCQlpdGVyYXRvciA9IHByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlMaW5lU3R5bGVQcm92aWRlciBsaW5lU3R5bGVQcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpbmVTdHlsZVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlsaW5lU3R5bGVQcm92aWRlci5yZWxlYXNlKCk7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlJUHJlZmVyZW5jZVN0b3JlIGVkaXRvclN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQllZGl0b3JTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZGb3JlZ3JvdW5kU2NhbGVMaXN0ZW5lcik7Ci0JCWRpc3Bvc2VDb2xvclRhYmxlKCk7Ci0KLQkJLy8gY2xlYXIgb3V0IGNhY2hlZCB2YXJpYWJsZXMgKGQyODI4OTQpCi0JCWZTYXZlZE9mZnNldCA9IC0xOwotCQlmU2F2ZWRMZW5ndGggPSAtMTsKLQkJZlNhdmVkUmFuZ2VzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQdXJlbHkgYSBkZWJ1Z2dpbmcgYWlkZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWQoU3R5bGVSYW5nZVtdIGV2ZW50U3R5bGVzLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsaW5lTGVuZ3RoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChldmVudFN0eWxlcyAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnRTdHlsZXMubGVuZ3RoID4gMCkgewotCQkJCVN0eWxlUmFuZ2UgZmlyc3QgPSBldmVudFN0eWxlc1swXTsKLQkJCQlTdHlsZVJhbmdlIGxhc3QgPSBldmVudFN0eWxlc1tldmVudFN0eWxlcy5sZW5ndGggLSAxXTsKLQkJCQlpZiAoc3RhcnRPZmZzZXQgPiBmaXJzdC5zdGFydCkgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCQkJCQlpbnQgbGFzdE9mZnNldCA9IGxhc3Quc3RhcnQgKyBsYXN0Lmxlbmd0aDsKLQkJCQkJaWYgKGxhc3RPZmZzZXQgPiBsaW5lRW5kT2Zmc2V0KSB7Ci0JCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBhIHplcm8gbGVuZ3RoIGFycmF5IGlzIG9rCi0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9JSGlnaGxpZ2h0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9JSGlnaGxpZ2h0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyZmYxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvSUhpZ2hsaWdodGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGlnaGxpZ2h0ZXIgZXh0ZW5kcyBMaW5lU3R5bGVMaXN0ZW5lciB7Ci0Jdm9pZCBhZGRQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSwgTGluZVN0eWxlUHJvdmlkZXIgcHJvdmlkZXIpOwotCi0Jdm9pZCBpbnN0YWxsKElUZXh0Vmlld2VyIHZpZXdlcik7Ci0KLQl2b2lkIHJlbW92ZVByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlKTsKLQotCXZvaWQgc2V0RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQotCXZvaWQgdW5pbnN0YWxsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTBjZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIExpbmVTdHlsZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJvdmlkZXIgZm9yIHRoZSBnaXZlbiBIaWdobGlnaHRlciBhbmQgZG9jdW1lbnQuIFRoaXMKLQkgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgcHJlcGFyZVJlZ2lvbnMgaXMgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBoaWdobGlnaHRlcgotCSAqLwotCXZvaWQgaW5pdChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcik7Ci0KLQkvKioKLQkgKiBPcHRpb25hbGx5IGFwcGVuZHMgU3R5bGVSYW5nZXMgdG8gdGhlIHN0eWxlUmFuZ2VzIENvbGxlY3Rpb24sIGluIG9yZGVyLAotCSAqIGFuZCBvbmx5IGNvdmVyaW5nIHRoZSBnaXZlbiByYW5nZSB3aXRoaW4gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjdXJyZW50UmVnaW9uIC0KLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGRvY3VtZW50IHBhcnRpdGlvbgotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gc3R5bGVSYW5nZXMKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBMaW5lU3R5bGVQcm92aWRlciBoYW5kbGVkIHRoZSByZXF1ZXN0OyBoYW5kbGluZwotCSAqICAgICAgICAgaW5jbHVkZXMgbm90IGFkZGluZyBTdHlsZVJhbmdlcyBpZiB0aGF0IGlzIHN0aWxsIHRoZSBjb3JyZWN0Ci0JICogICAgICAgICBiZWhhdmlvcgotCSAqLwotCWJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIGN1cnJlbnRSZWdpb24sIGludCBzdGFydCwgaW50IGxlbmd0aCwgQ29sbGVjdGlvbiBzdHlsZVJhbmdlcyk7Ci0KLQkvKioKLQkgKiBJbnN0cnVjdHMgdGhpcyBwcm92aWRlciB0byBmcmVlIHVwIGFueSAicmVzb3VyY2VzIiBpdCBtaWdodCBiZSBob2xkaW5nCi0JICogb24gdG8gKHN1Y2ggYXMgbGlzdGVuaW5nIGZvciBwcmVmZXJlbmNlIGNoYW5nZXMpLiBJdCBpcyBvbmx5IGNhbGxlZAotCSAqIG9uY2UgaW4gdGhlIGxpZmV0aW1lIG9mIHRoaXMgcHJvdmlkZXIuCi0JICovCi0Jdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YzUxZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yTm9PcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGJ5IGRlZmF1bHQsIGlmIG5vIGF0dHJpYnV0ZSBwcm92aWRlciBpcyBmb3VuZCBmb3IgYQotICogY2VydGFpbiByZWdpb24gdHlwZS4gSXRzIHByb2JhYmx5IGFuIGVycm9yIGluIGEgZmFjdG9yeSBzb21ld2hlcmUgaWYgYW4KLSAqIGFkYXB0ZXIgaXMgbm90IGZvdW5kLCBidXQgdGhpcyBjbGFzcyBhbGxvd3MgdGhlIGxvZ2ljIHRvIHByb2NlZWQgYmFzaWNhbGx5Ci0gKiBzaW1wbHkgcHJvdmlkaW5nIGRlZmF1bHQgY29sb3JlZCBzeW50YXggaGlnaGxpZ2h0aW5nLgotICogCi0gKiBOb3QgdG8gYmUgc3ViY2xhc3NlZC4KLSAqLwotZmluYWwgcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yTm9PcCBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNwcmVwYXJlUmVnaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbiwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gY3VycmVudFJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCS8vIGFkZCBub3RoaW5nLCBidXQgc2F5IGhhbmRsZWQuCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0Fic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0Fic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTA0ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVRlbXBvcmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIEEgYmFzZSBSZWNvbmNpbGluZ1N0cmF0ZWd5LiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Ci0gKiBjcmVhdGVSZWNvbmNpbGVTdGVwcygpLiBUaGlzIGNsYXNzIHNob3VsZCBub3Qga25vdyBhYm91dAotICogSVN0cnVjdHVyZWREb2N1bWVudCwgb25seSBJRG9jdW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElSZWNvbmNpbGluZ1N0cmF0ZWd5LCBJUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbiwgSVJlbGVhc2FibGUgewotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlcmpvYiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyB0aGVzZSBsaW1pdHMgYXJlIHNhZmV0eXMgZm9yICJydW5hd2F5IiB2YWxpZGF0aW9uIGNhc2VzCi0JLy8gc2hvdWxkIGJlIHVzZWQgdG8gc2FmZWd1YXJkIHBvdGVudGlhbGx5IGRhbmdlcm91cyBsb29wcyBvciBwb3RlbnRpYWxseQotCS8vIGxvbmcgYW5ub3RhdGlvbnMKLQkvLyAoc2luY2UgdGhlIHBhaW50ZXIgc2VlbXMgdG8gYWZmZWN0IHBlcmZvcm1hbmNlIHdoZW4gcGFpbnRpbmcgbG9uZwotCS8vIGFubm90YXRpb25zKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOTk9UQVRJT05fTEVOR1RIX0xJTUlUID0gMjU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9FUlJPUl9MSU1JVCA9IDI1OwotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQkvLyBwcml2YXRlIElSZWNvbmNpbGVTdGVwIGZGaXJzdFN0ZXAgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQlwcml2YXRlIElTb3VyY2VWaWV3ZXIgZlNvdXJjZVZpZXdlciA9IG51bGw7Ci0vLwlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0KLQkvLyBsaXN0IG9mICJ2YWxpZGF0b3IiIGFubm90YXRpb25zCi0JLy8gZm9yIGdyYXkvdW4tZ3JheSBjYXBhYmlsaXR5Ci0JcHJpdmF0ZSBIYXNoU2V0IGZNYXJrZXJBbm5vdGF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHN0cmF0ZWd5LiBUaGUgZWRpdG9yIHBhcmFtZXRlciBpcyBmb3IgYWNjZXNzIHRvIHRoZQotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneShJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlmU291cmNlVmlld2VyID0gc291cmNlVmlld2VyOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB3aGVyZSB3ZSBhZGQgcmVzdWx0cyB0byB0aGUgYW5ub3RhdGlvbk1vZGVsLCBkb2luZyBhbnkgc3BlY2lhbAotCSAqICJleHRyYSIgcHJvY2Vzc2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXN1bHRUb0Fubm90YXRpb25Nb2RlbChJUmVjb25jaWxlUmVzdWx0IHJlc3VsdCkgewotCQlpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSkKLQkJCXJldHVybjsKLQkJLy8gY2FuIGJlIG51bGwgd2hlbiBjbG9zaW5nIHRoZSBlZGl0b3IKLQkJaWYgKGdldEFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpIHsKLQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGVtcEFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgcmVzdWx0OwotCi0JCQlTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbiBzbWEgPSBnZXRDb3JyZXNwb25kaW5nTWFya2VyQW5ub3RhdGlvbih0ZW1wQW5ub3RhdGlvbik7Ci0JCQlpZiAoc21hICE9IG51bGwpIHsKLQkJCQkvLyB1bi1ncmF5IG91dCB0aGUgbWFya2VyIGFubm90YXRpb24KLQkJCQlzbWEuc2V0R3JheWVkKGZhbHNlKTsKLQkJCX0KLQotCQkJZ2V0QW5ub3RhdGlvbk1vZGVsKCkuYWRkQW5ub3RhdGlvbih0ZW1wQW5ub3RhdGlvbiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBpZiB0aGlzIHN0cmF0ZWd5IGlzIHJlc3BvbmlzYmxlIGZvciBhZGRpbmcgdGhpcyB0eXBlIG9mIGtleQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkhhbmRsZVBhcnRpdGlvbihTdHJpbmcgcGFydGl0aW9uKSB7Ci0JCS8vIFN0cmluZ1tdIGhheXN0YWNrID0gZ2V0UGFydGl0aW9uVHlwZXMoKTsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBoYXlzdGFjay5sZW5ndGg7IGkrKykgewotCQkvLyBpZiAoaGF5c3RhY2tbaV0uZXF1YWxzKHBhcnRpdGlvbikpCi0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIC8qKgotCS8vICogQHBhcmFtIHN0ZXAKLQkvLyAqIEByZXR1cm4KLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKSB7Ci0JLy8gaWYgKGZGaXJzdFN0ZXAgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCkKLQkvLyByZXR1cm4gKChTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCkgZkZpcnN0U3RlcCkuaXNTaWJsaW5nU3RlcChzdGVwKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JLyoqCi0JICogVGhpcyBpcyB3aGVyZSB5b3Ugc2hvdWxkIGNyZWF0ZSB0aGUgc3RlcHMgZm9yIHRoaXMgc3RyYXRlZ3kKLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBjcmVhdGVSZWNvbmNpbGVTdGVwcygpOwotCi0JLyoqCi0JICogUmVtb3ZlIEFMTCB0ZW1wb3JhcnkgYW5ub3RhdGlvbnMgdGhhdCB0aGlzIHN0cmF0ZWd5IGNhbiBoYW5kbGUuCi0JICovCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUFubm90YXRpb25bXSBnZXRBbGxBbm5vdGF0aW9uc1RvUmVtb3ZlKCkgewotCQlMaXN0IHJlbW92YWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGdldEFubm90YXRpb25Nb2RlbCgpOwotCQlpZiAoYW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSVRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlUZW1wb3JhcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoSVRlbXBvcmFyeUFubm90YXRpb24pIG9iajsKLQkJCQlSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IChSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSBhbm5vdGF0aW9uLmdldEtleSgpOwotCQkJCS8vIHRoZW4gaWYgdGhpcyBzdHJhdGVneSBrbm93cyBob3cgdG8gYWRkL3JlbW92ZSB0aGlzCi0JCQkJLy8gcGFydGl0aW9uIHR5cGUKLQkJCQlpZiAoY2FuSGFuZGxlUGFydGl0aW9uKGtleS5nZXRQYXJ0aXRpb25UeXBlKCkpIC8qCi0JCQkJCQkJCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkJCQkJCQkgKiBjb250YWluc1N0ZXAoa2V5LmdldFN0ZXAoKSkKLQkJCQkJCQkJCQkJCQkJCQkgKi8pCi0JCQkJCXJlbW92YWxzLmFkZChhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRlbXBvcmFyeUFubm90YXRpb25bXSkgcmVtb3ZhbHMudG9BcnJheShuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbltyZW1vdmFscy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb25Nb2RlbCBnZXRBbm5vdGF0aW9uTW9kZWwoKSB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAoZlNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQltb2RlbCA9IGZTb3VyY2VWaWV3ZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByb3RlY3RlZCBUZW1wb3JhcnlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnNUb1JlbW92ZShEaXJ0eVJlZ2lvbiBkciwgTGlzdCBzdGVwc1J1bikgewotCi0JCUxpc3QgcmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGdldEFubm90YXRpb25Nb2RlbCgpOwotCQkvLyBjYW4gYmUgbnVsbCB3aGVuIGNsb3NpbmcgdGhlIGVkaXRvcgotCQlpZiAoZ2V0QW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCi0JCQkvLyBjbGVhciB2YWxpZGF0b3IgYW5ub3RhdGlvbnMKLQkJCWdldE1hcmtlckFubm90YXRpb25zKCkuY2xlYXIoKTsKLQotCQkJSXRlcmF0b3IgaSA9IGFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCi0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCi0JCQkJLy8gY2hlY2sgaWYgaXQncyBhIHZhbGlkYXRvciBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCS8vIGlmIGl0IGlzIHNhdmUgaXQgZm9yIGNvbXBhcmlzaW9uIGxhdGVyICh0byAiZ3JheSIgaWNvbnMpCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IChTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbikgb2JqOwotCi0JCQkJCWlmIChzbWEuZ2V0QW5ub3RhdGlvblR5cGUoKSA9PSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SIHx8IHNtYS5nZXRBbm5vdGF0aW9uVHlwZSgpID09IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORykKLQkJCQkJCWZNYXJrZXJBbm5vdGF0aW9ucy5hZGQoc21hKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgb2JqOwotCQkJCVJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gKFJlY29uY2lsZUFubm90YXRpb25LZXkpIGFubm90YXRpb24uZ2V0S2V5KCk7Ci0KLQkJCQkvLyB0aGVuIGlmIHRoaXMgc3RyYXRlZ3kga25vd3MgaG93IHRvIGFkZC9yZW1vdmUgdGhpcwotCQkJCS8vIHBhcnRpdGlvbiB0eXBlCi0JCQkJaWYgKGNhbkhhbmRsZVBhcnRpdGlvbihrZXkuZ2V0UGFydGl0aW9uVHlwZSgpKSAmJiBzdGVwc1J1bi5jb250YWlucyhrZXkuZ2V0U3RlcCgpKSkgewotCQkJCQlpZiAoa2V5LmdldFNjb3BlKCkgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMICYmIGFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5vdmVybGFwc1dpdGgoZHIuZ2V0T2Zmc2V0KCksIGRyLmdldExlbmd0aCgpKSkgewotCQkJCQkJcmVtb3ZlLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChrZXkuZ2V0U2NvcGUoKSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQlyZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSByZW1vdmUudG9BcnJheShuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbltyZW1vdmUuc2l6ZSgpXSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjb250YWluc1N0ZXAoSVJlY29uY2lsZVN0ZXAgc3RlcCk7Ci0KLQkvKioKLQkgKiBHZXRzIHBhcnRpdGlvbiB0eXBlcyBmcm9tIGFsbCBzdGVwcyBpbiB0aGlzIHN0cmF0ZWd5LgotCSAqIAotCSAqIEByZXR1cm4gcGFyaXRpb24gdHlwZXMgZnJvbSBhbGwgc3RlcHMKLQkgKi8KLQkvLyBwdWJsaWMgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JLy8gaWYgKGZGaXJzdFN0ZXAgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCkKLQkvLyByZXR1cm4gKChTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCkgZkZpcnN0U3RlcCkuZ2V0UGFydGl0aW9uVHlwZXMoKTsKLQkvLyByZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkvLyB9Ci0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJY3JlYXRlUmVjb25jaWxlU3RlcHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbiNpbml0aWFsUmVjb25jaWxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsUmVjb25jaWxlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCWlmIChERUJVRyAmJiAoZlByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIGZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKiogU1RSQVRFR1kgQ0FOQ0VMRUQgKio6IiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSByZWNvbmNpbGUgc3RlcHMgaW4gdGhpcyBzdHJhdGVneS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0cwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzKGZpbmFsIElSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzKSB7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4gU1RBUlRJTkcgUFJPQ0VTUyBNRVRIT0Qgd2l0aCAoIiArIHJlc3VsdHMubGVuZ3RoICsgIikgcmVzdWx0cyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAocmVzdWx0cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGggJiYgaSA8IEVMRU1FTlRfRVJST1JfTElNSVQgJiYgIWlzQ2FuY2VsZWQoKTsgaSsrKSB7Ci0KLQkJCWlmIChpc0NhbmNlbGVkKCkpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiBQUk9DRVNTIChhZGRpbmcpIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWFkZFJlc3VsdFRvQW5ub3RhdGlvbk1vZGVsKHJlc3VsdHNbaV0pOwotCQl9Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTdHJpbmdCdWZmZXIgdHJhY2VTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdHMubGVuZ3RoOyBqKyspCi0JCQkJdHJhY2VTdHJpbmcuYXBwZW5kKCJcbiAoKykgOiIgKyByZXN1bHRzW2pdICsgIjpcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4gUFJPQ0VTU0lORyAoIiArIHJlc3VsdHMubGVuZ3RoICsgIikgcmVzdWx0cyBpbiBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSAiICsgdHJhY2VTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQkvLyBub3QgdXNlZAotCQkvLyB3ZSBvbmx5IGhhdmUgdmFsaWRhdG9yIHN0cmF0ZWd5IG5vdwotCi0JCS8vIC8vIGV4dGVybmFsIGZpbGVzIG1heSBiZSBudWxsCi0JCS8vIGlmIChpc0NhbmNlbGVkKCkgfHwgZkZpcnN0U3RlcCA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vCi0JCS8vIFRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlID0gbmV3Ci0JCS8vIFRlbXBvcmFyeUFubm90YXRpb25bMF07Ci0JCS8vIElSZWNvbmNpbGVSZXN1bHRbXSBhbm5vdGF0aW9uc1RvQWRkID0gbmV3IElSZWNvbmNpbGVSZXN1bHRbMF07Ci0JCS8vIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwIHN0cnVjdHVyZWRTdGVwID0gKFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKQotCQkvLyBmRmlyc3RTdGVwOwotCQkvLyAgICAgICAgCi0JCS8vIGFubm90YXRpb25zVG9SZW1vdmUgPSBnZXRBbm5vdGF0aW9uc1RvUmVtb3ZlKGRpcnR5UmVnaW9uKTsKLQkJLy8gYW5ub3RhdGlvbnNUb0FkZCA9IHN0cnVjdHVyZWRTdGVwLnJlY29uY2lsZShkaXJ0eVJlZ2lvbiwKLQkJLy8gc3ViUmVnaW9uKTsKLQkJLy8gICAgICAgIAotCQkvLyBzbWFydFByb2Nlc3MoYW5ub3RhdGlvbnNUb1JlbW92ZSwgYW5ub3RhdGlvbnNUb0FkZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKElSZWdpb24gcGFydGl0aW9uKSB7Ci0JCS8vIG5vdCB1c2VkLCB3ZSB1c2U6Ci0JCS8vIHJlY29uY2lsZShEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24pCi0JfQotCi0JLyoqCi0JICogQ2FsbHMgcmVsZWFzZSgpIG9uIGFsbCB0aGUgc3RlcHMgaW4gdGhpcyBzdHJhdGVneS4gQ3VycmVudGx5IGRvbmUgaW4KLQkgKiBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yLlNvdXJjZVdpZGdldERpc3Bvc2VMaXN0ZW5lciN3aWRnZXREaXNwb3NlZCguLi4pCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gcmVsZWFzZSBzdGVwcyAoZWFjaCBzdGVwIGNhbGxzIHJlbGVhc2Ugb24gdGhlIG5leHQpCi0JCS8vIGlmIChmRmlyc3RTdGVwICE9IG51bGwgJiYgZkZpcnN0U3RlcCBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKQotCQkvLyAoKElSZWxlYXNhYmxlKSBmRmlyc3RTdGVwKS5yZWxlYXNlKCk7Ci0JCS8vIHdlIGRvbid0IHRvIG51bGwgb3V0IHRoZSBzdGVwcywgaW4gY2FzZQotCQkvLyBpdCdzIHJlY29uZmlndXJlZCBsYXRlcgotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVBbm5vdGF0aW9ucyhUZW1wb3JhcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnNUb1JlbW92ZSkgewotCi0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCS8vIGNhbiBiZSBudWxsIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yCi0JCWlmIChhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlzQ2FuY2VsZWQoKSkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+KiogUkVNT1ZBTCBXQVMgQ0FOQ0VMTEVEICoqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbiBzbWEgPSBnZXRDb3JyZXNwb25kaW5nTWFya2VyQW5ub3RhdGlvbihhbm5vdGF0aW9uc1RvUmVtb3ZlW2ldKTsKLQkJCQlpZiAoc21hICE9IG51bGwpIHsKLQkJCQkJLy8gZ3JheSBvdXQgdGhlIG1hcmtlciBhbm5vdGF0aW9uCi0JCQkJCXNtYS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCS8vIHJlbW92ZSB0aGUgdGVtcCBvbmUKLQkJCQlhbm5vdGF0aW9uTW9kZWwucmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uc1RvUmVtb3ZlW2ldKTsKLQotCQkJfQotCQl9Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTdHJpbmdCdWZmZXIgdHJhY2VTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zVG9SZW1vdmUubGVuZ3RoOyBpKyspCi0JCQkJdHJhY2VTdHJpbmcuYXBwZW5kKCJcbiAoLSkgOiIgKyBhbm5vdGF0aW9uc1RvUmVtb3ZlW2ldICsgIjpcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4gUkVNT1ZFRCAoIiArIGFubm90YXRpb25zVG9SZW1vdmUubGVuZ3RoICsgIikgYW5ub3RhdGlvbnMgaW4gQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgOiIgKyB0cmFjZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbiBnZXRDb3JyZXNwb25kaW5nTWFya2VyQW5ub3RhdGlvbihUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBBbm5vdGF0aW9uKSB7Ci0KLQkJSXRlcmF0b3IgaXQgPSBnZXRNYXJrZXJBbm5vdGF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIG1hcmtlckFubm90YXRpb24gPSAoU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJbWVzc2FnZSA9IChTdHJpbmcpIG1hcmtlckFubm90YXRpb24uZ2V0TWFya2VyKCkuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJLy8gaXQgd291bGQgYmUgbmljZSB0byBjaGVjayBsaW5lIG51bWJlciBoZXJlLi4uCi0JCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuZXF1YWxzKHRlbXBBbm5vdGF0aW9uLmdldFRleHQoKSkpCi0JCQkJcmV0dXJuIG1hcmtlckFubm90YXRpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFubm90YXRpb25zKCkgewotCQlyZW1vdmVBbm5vdGF0aW9ucyhnZXRBbGxBbm5vdGF0aW9uc1RvUmVtb3ZlKCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZG9jdW1lbnQgZm9yIHRoaXMgc3RyYXRlZ3kuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjc2V0RG9jdW1lbnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0KLQkJLy8gcmVtb3ZlIGFsbCBvbGQgYW5ub3RhdGlvbnMgc2luY2UgaXQncyBhIG5ldyBkb2N1bWVudAotCQlyZW1vdmVBbGxBbm5vdGF0aW9ucygpOwotCi0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmVsZWFzZSgpOwotCi0JCS8vIGlmIChnZXRGaXJzdFN0ZXAoKSAhPSBudWxsKQotCQkvLyBnZXRGaXJzdFN0ZXAoKS5zZXRJbnB1dE1vZGVsKG5ldyBEb2N1bWVudEFkYXB0ZXIoZG9jdW1lbnQpKTsKLQotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3lFeHRlbnNpb24jc2V0UHJvZ3Jlc3NNb25pdG9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JCS8vIGlmIChmRmlyc3RTdGVwICE9IG51bGwpCi0JCS8vIGZGaXJzdFN0ZXAuc2V0UHJvZ3Jlc3NNb25pdG9yKGZQcm9ncmVzc01vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGFscmVhZHkgdGhlcmUsIGlmIGl0IGlzLCBubyBuZWVkIHRvIHJlbW92ZQotCSAqIG9yIGFkZCBhZ2Fpbi4gVGhpcyB3aWxsIGF2b2lkIGEgbG90IG9mICJmbGlja2VyaW5nIiBiZWhhdmlvci4KLQkgKiAKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnNUb1JlbW92ZQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uc1RvQWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc21hcnRQcm9jZXNzKFRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlLCBJUmVjb25jaWxlUmVzdWx0W10gYW5ub3RhdGlvbnNUb0FkZCkgewotLy8JCUNvbXBhcmF0b3IgY29tcCA9IGdldFRlbXBvcmFyeUFubm90YXRpb25Db21wYXJhdG9yKCk7Ci0vLwkJTGlzdCBzb3J0ZWRSZW1vdmFscyA9IEFycmF5cy5hc0xpc3QoYW5ub3RhdGlvbnNUb1JlbW92ZSk7Ci0vLwkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRSZW1vdmFscywgY29tcCk7Ci0vLwotLy8JCUxpc3Qgc29ydGVkQWRkaXRpb25zID0gQXJyYXlzLmFzTGlzdChhbm5vdGF0aW9uc1RvQWRkKTsKLS8vCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEFkZGl0aW9ucywgY29tcCk7Ci0vLwotLy8JCUxpc3QgZmlsdGVyZWRSZW1vdmFscyA9IG5ldyBBcnJheUxpc3Qoc29ydGVkUmVtb3ZhbHMpOwotLy8JCUxpc3QgZmlsdGVyZWRBZGRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KHNvcnRlZEFkZGl0aW9ucyk7Ci0vLwotLy8JCWJvb2xlYW4gaWdub3JlID0gZmFsc2U7Ci0vLwkJaW50IGxhc3RGb3VuZEFkZGVkID0gMDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZFJlbW92YWxzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCVRlbXBvcmFyeUFubm90YXRpb24gcmVtb3ZhbCA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBzb3J0ZWRSZW1vdmFscy5nZXQoaSk7Ci0vLwkJCWZvciAoaW50IGogPSBsYXN0Rm91bmRBZGRlZDsgaiA8IHNvcnRlZEFkZGl0aW9ucy5zaXplKCk7IGorKykgewotLy8JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiBhZGRpdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBzb3J0ZWRBZGRpdGlvbnMuZ2V0KGopOwotLy8JCQkJLy8gcXVpY2sgcG9zaXRpb24gY2hlY2sgaGVyZQotLy8JCQkJaWYgKHJlbW92YWwuZ2V0UG9zaXRpb24oKS5lcXVhbHMoYWRkaXRpb24uZ2V0UG9zaXRpb24oKSkpIHsKLS8vCQkJCQlsYXN0Rm91bmRBZGRlZCA9IGo7Ci0vLwkJCQkJLy8gcmVtb3ZlIHBlcmZvcm1zIFRlbXBvcmFyeUFubm90YXRpb24uZXF1YWxzKCkKLS8vCQkJCQkvLyB3aGljaCBjaGVja3MgdGV4dCBhcyB3ZWxsCi0vLwkJCQkJZmlsdGVyZWRBZGRpdGlvbnMucmVtb3ZlKGFkZGl0aW9uKTsKLS8vCQkJCQlpZ25vcmUgPSB0cnVlOwotLy8JCQkJCWlmIChERUJVRykKLS8vCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgfiBzbWFydCBwcm9jZXNzIGlnbm9yaW5nOiAiICsgcmVtb3ZhbC5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWlmIChpZ25vcmUpIHsKLS8vCQkJCWZpbHRlcmVkUmVtb3ZhbHMucmVtb3ZlKHJlbW92YWwpOwotLy8JCQl9Ci0vLwkJCWlnbm9yZSA9IGZhbHNlOwotLy8JCX0KLQkJaWYgKGdldEFubm90YXRpb25Nb2RlbCgpIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgewotLy8JCQlUZW1wb3JhcnlBbm5vdGF0aW9uW10gZmlsdGVyZWRSZW1vdmFsQXJyYXkgPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSBmaWx0ZXJlZFJlbW92YWxzLnRvQXJyYXkobmV3IFRlbXBvcmFyeUFubm90YXRpb25bZmlsdGVyZWRSZW1vdmFscy5zaXplKCldKTsKLS8vCQkJLy8gYXBwbHkgImdyZXkiLW5lc3MKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZFJlbW92YWxBcnJheS5sZW5ndGg7IGkrKykgewotLy8JCQkJaWYgKGlzQ2FuY2VsZWQoKSkgewotLy8JCQkJCWlmIChERUJVRykKLS8vCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPioqIHJlcGxhY2luZyBXQVMgQ0FOQ0VMTEVEICoqIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwkJCQlTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbiBzbWEgPSBnZXRDb3JyZXNwb25kaW5nTWFya2VyQW5ub3RhdGlvbihmaWx0ZXJlZFJlbW92YWxBcnJheVtpXSk7Ci0vLwkJCQlpZiAoc21hICE9IG51bGwpIHsKLS8vCQkJCQkvLyBncmF5IG91dCB0aGUgbWFya2VyIGFubm90YXRpb24KLS8vCQkJCQlzbWEuc2V0R3JheWVkKHRydWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCU1hcCBhbm5vdGF0aW9uc1RvQWRkTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZEFkZGl0aW9ucy5zaXplKCk7IGkrKykgewotLy8JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wb3JhcnlBbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGZpbHRlcmVkQWRkaXRpb25zLmdldChpKTsKLS8vCQkJCWFubm90YXRpb25zVG9BZGRNYXAucHV0KHRlbXBvcmFyeUFubm90YXRpb24sIHRlbXBvcmFyeUFubm90YXRpb24uZ2V0UG9zaXRpb24oKSk7Ci0vLwkJCX0KLS8vCQkJaWYgKGlzQ2FuY2VsZWQoKSkgewotLy8JCQkJaWYgKERFQlVHKQotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiBQUk9DRVNTIChyZXBsYWNpbmcpIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJcmV0dXJuOwotLy8JCQl9Ci0vLwkJCS8qCi0vLwkJCSAqIFVzaW5nIHRoZSBleHRlbnNpb24gbWVhbnMgd2UgY2FuJ3QgZW5mb3JjZSB0aGUKLS8vCQkJICogRUxFTUVOVF9FUlJPUl9MSU1JVCBsaW1pdC4KLS8vCQkJICovCi0vLwkJCSgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgZ2V0QW5ub3RhdGlvbk1vZGVsKCkpLnJlcGxhY2VBbm5vdGF0aW9ucyhmaWx0ZXJlZFJlbW92YWxBcnJheSwgYW5ub3RhdGlvbnNUb0FkZE1hcCk7Ci0KLQkJCU1hcCBhbm5vdGF0aW9uc1RvQWRkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNUb0FkZC5sZW5ndGg7IGkrKykgewotCQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGVtcG9yYXJ5QW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uc1RvQWRkW2ldOwotCQkJCWFubm90YXRpb25zVG9BZGRNYXAucHV0KHRlbXBvcmFyeUFubm90YXRpb24sIHRlbXBvcmFyeUFubm90YXRpb24uZ2V0UG9zaXRpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+KiogUFJPQ0VTUyAocmVwbGFjaW5nKSBXQVMgQ0FOQ0VMTEVEICoqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkoKElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIGdldEFubm90YXRpb25Nb2RlbCgpKS5yZXBsYWNlQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnNUb1JlbW92ZSwgYW5ub3RhdGlvbnNUb0FkZE1hcCk7Ci0JCX0KLQkJZWxzZSB7Ci0vLwkJCXJlbW92ZUFubm90YXRpb25zKChUZW1wb3JhcnlBbm5vdGF0aW9uW10pIGZpbHRlcmVkUmVtb3ZhbHMudG9BcnJheShuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbltmaWx0ZXJlZFJlbW92YWxzLnNpemUoKV0pKTsKLS8vCQkJcHJvY2VzcygoSVJlY29uY2lsZVJlc3VsdFtdKSBmaWx0ZXJlZEFkZGl0aW9ucy50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2ZpbHRlcmVkQWRkaXRpb25zLnNpemUoKV0pKTsKLQkJCXJlbW92ZUFubm90YXRpb25zKGFubm90YXRpb25zVG9SZW1vdmUpOwotCQkJcHJvY2Vzcyhhbm5vdGF0aW9uc1RvQWRkKTsKLQkJfQotCX0KLQotLy8JcHJpdmF0ZSBDb21wYXJhdG9yIGdldFRlbXBvcmFyeUFubm90YXRpb25Db21wYXJhdG9yKCkgewotLy8JCWlmIChmQ29tcGFyYXRvciA9PSBudWxsKSB7Ci0vLwkJCWZDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0vLwkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0vLwkJCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0YTEgPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYXJnMDsKLS8vCQkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRhMiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhcmcxOwotLy8JCQkJCWludCByZXN1bHQgPSB0YTEuZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSAtIHRhMi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpOwotLy8JCQkJCWlmKHJlc3VsdCAhPSAwKQotLy8JCQkJCQlyZXR1cm4gcmVzdWx0OwotLy8JCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGExLmdldFRleHQoKSwgdGEyLmdldFRleHQoKSk7Ci0vLwkJCQl9Ci0vLwkJCX07Ci0vLwkJfQotLy8JCXJldHVybiBmQ29tcGFyYXRvcjsKLS8vCX0KLQotCXB1YmxpYyBIYXNoU2V0IGdldE1hcmtlckFubm90YXRpb25zKCkgewotCQlpZiAoZk1hcmtlckFubm90YXRpb25zID09IG51bGwpCi0JCQlmTWFya2VyQW5ub3RhdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQlyZXR1cm4gZk1hcmtlckFubm90YXRpb25zOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRGlydHlSZWdpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRGlydHlSZWdpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZmUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RpcnR5UmVnaW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgSm9iIGhvbGRzIGEgcXVldWUgb2YgdXBkYXRlcyBmcm9tIHRoZSBlZGl0b3IgKERpcnR5UmVnaW9ucykgdG8KLSAqIHByb2Nlc3MuIFdoZW4gYSBuZXcgcmVxdWVzdCBjb21lcyBpbiwgdGhlIGN1cnJlbnQgcnVuIGlzIGNhbmNlbGVkLCB0aGUgbmV3Ci0gKiByZXF1ZXN0IGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgdGhlbiB0aGUgam9iIGlzIHJlLXNjaGVkdWxlZC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIERpcnR5UmVnaW9uUHJvY2Vzc29yIGV4dGVuZHMgSm9iIGltcGxlbWVudHMgSVJlY29uY2lsZXIsIElSZWNvbmNpbGVyRXh0ZW5zaW9uLCBJQ29uZmlndXJhYmxlUmVjb25jaWxlciB7Ci0JY2xhc3MgRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHNhdmUgcGFydGl0aW9uIHR5cGUgKHRvIHNlZSBpZiBpdCBjaGFuZ2VzIGluIGRvY3VtZW50Q2hhbmdlZCgpKQotCQkJZkxhc3RQYXJ0aXRpb25zID0gZ2V0UGFydGl0aW9ucyhldmVudC5nZXRPZmZzZXQoKSwgZXZlbnQuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChwYXJ0aXRpb25zQ2hhbmdlZChldmVudCkpIHsKLQkJCQkvLyBwYV9UT0RPCi0JCQkJLy8gdGhpcyBpcyBhIHNpbXBsZSB3YXkgdG8gZW5zdXJlIG9sZAotCQkJCS8vIGFubm90YXRpb25zIGFyZSByZW1vdmVkIHdoZW4gcGFydGl0aW9uIGNoYW5nZXMKLQotCQkJCS8vIGl0IG1pZ2h0IGJlIGEgcGVyZm9ybWFuY2UgaGl0IHRob3VnaAotCQkJCXNldEVudGlyZURvY3VtZW50RGlydHkoZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIE5vdGUgdGhhdCBjcmVhdGluZyBEaXJ0eVJlZ2lvbnMgKm5vdyogbWVhbnMgdGhhdCB0aGUgd3JvbmcKLQkJCQkgKiB0ZXh0IG1heSBiZSBpbmNsdWRlZAotCQkJCSAqLwotCQkJCURpcnR5UmVnaW9uIGRyID0gbnVsbDsKLQkJCQlpZiAoZXZlbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJdCdzIGFuIGluc2VydC0tIHdlIHVzZSB0ZXh0IGxlbmd0aCB0aG91Z2ggc28gdGhhdCB0aGUKLQkJCQkJICogbmV3IHJlZ2lvbiBnZXRzIHZhbGlkYXRlZC4uLgotCQkJCQkgKi8KLQkJCQkJZHIgPSBjcmVhdGVEaXJ0eVJlZ2lvbihldmVudC5nZXRPZmZzZXQoKSwgMCwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICgiIi5lcXVhbHMoZXZlbnQuZ2V0VGV4dCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBpdCdzIGEgZGVsZXRlCi0JCQkJCQlkciA9IGNyZWF0ZURpcnR5UmVnaW9uKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSwgRGlydHlSZWdpb24uUkVNT1ZFKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGl0J3MgYSByZXBsYWNlCi0JCQkJCQlkciA9IGNyZWF0ZURpcnR5UmVnaW9uKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwcm9jZXNzRGlydHlSZWdpb24oZHIpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENoZWNrcyBwcmV2aW91cyBwYXJ0aXRpb25zIGZyb20gdGhlIHNwYW4gb2YgdGhlIGV2ZW50IHcvIHRoZSBuZXcKLQkJICogcGFydGl0aW9ucyBmcm9tIHRoZSBzcGFuIG9mIHRoZSBldmVudC4gSWYgcGFydGl0aW9ucyBjaGFuZ2VkLAotCQkgKiByZXR1cm4gdHJ1ZSwgZWxzZSByZXR1cm4gZmFsc2UKLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcGFydGl0aW9uc0NoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCQlpbnQgbGVuZ3RoID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCWlmIChldmVudC5nZXRMZW5ndGgoKSA9PSAwICYmIGV2ZW50LmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBpdCdzIGFuIGluc2VydCwgd2Ugd2FudCBwYXJ0aXRpb25zIG9mIHRoZSBuZXcgdGV4dAotCQkJCWxlbmd0aCA9IGV2ZW50LmdldFRleHQoKS5sZW5ndGgoKTsKLQkJCX0KLQotCQkJU3RyaW5nW10gbmV3UGFydGl0aW9ucyA9IGdldFBhcnRpdGlvbnMoZXZlbnQuZ2V0T2Zmc2V0KCksIGxlbmd0aCk7Ci0JCQlpZiAoZkxhc3RQYXJ0aXRpb25zICE9IG51bGwpIHsKLQkJCQlpZiAoZkxhc3RQYXJ0aXRpb25zLmxlbmd0aCAhPSBuZXdQYXJ0aXRpb25zLmxlbmd0aCkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkxhc3RQYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoIWZMYXN0UGFydGl0aW9uc1tpXS5lcXVhbHMobmV3UGFydGl0aW9uc1tpXSkpIHsKLQkJCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGFuZ2VkOwotCQl9Ci0KLQotCX0KLQotCS8qKgotCSAqIFJlY29uY2lsZXMgdGhlIGVudGlyZSBkb2N1bWVudCB3aGVuIHRoZSBkb2N1bWVudCBpbiB0aGUgdmlld2VyIGlzCi0JICogY2hhbmdlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGRvY3VtZW50IGlzIGluaXRpYWxseSBvcGVuZWQsIGFzIHdlbGwgYXMKLQkgKiBhZnRlciBhIHNhdmUtYXMuCi0JICogCi0JICogQWxzbyBzZWUgcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KC4uLikgZm9yIHNpbWlsYXIgYmVoYXZpb3Igd2hlbiBkb2N1bWVudAotCSAqIGZvciB0aGUgbW9kZWwgaXMgY2hhbmdlZC4KLQkgKi8KLQljbGFzcyBUZXh0SW5wdXRMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkJaGFuZGxlSW5wdXREb2N1bWVudENoYW5nZWQob2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJfQotCX0KLQotCS8qKiBkZWJ1ZyBmbGFnICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gNzUwOwotCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlcmpvYiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZkRlbGF5OwotCi0KLQkvKiogbG9jYWwgcXVldWUgb2YgZGlydHkgcmVnaW9ucyAoY3JlYXRlZCBoZXJlKSB0byBiZSByZWNvbmNpbGVkICovCi0JcHJpdmF0ZSBMaXN0IGZEaXJ0eVJlZ2lvblF1ZXVlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0KCkpOwotCi0JLyoqIGRvY3VtZW50IHRoYXQgdGhpcyByZWNvbmNpbGVyIHdvcmtzIG9uICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCS8qKgotCSAqIHNldCB0cnVlIGFmdGVyIGZpcnN0IGluc3RhbGwgdG8gcHJldmVudCBkdXBsaWNhdGUgd29yayBkb25lIGluIHRoZQotCSAqIGluc3RhbGwgbWV0aG9kIChzaW5jZSBpbnN0YWxsIGdldHMgY2FsbGVkIG11bHRpcGxlIHRpbWVzKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNJbnN0YWxsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIHNvIHdlIGNhbiB0ZWxsIGlmIGEgcGFydGl0aW9uIGNoYW5nZWQgYWZ0ZXIgdGhlIGxhc3QgZWRpdAotCSAqLwotCVN0cmluZ1tdIGZMYXN0UGFydGl0aW9uczsKLQotCUxpc3QgZk5vbkluY3JlbWVudGFsU3RyYXRlZ2llc0FscmVhZHlQcm9jZXNzZWQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCi0JLyoqCi0JICogVGhlIHBhcnRpdGlvbmluZyB0aGlzIHJlY29uY2lsZXIgdXNlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uaW5nOwotCi0JTWFwIGZSZWNvbmNpbGluZ1N0cmF0ZWdpZXMgPSBudWxsOwotCi0JLyoqIGZvciBpbml0aWFsIHJlY29uY2lsZSB3aGVuIGRvY3VtZW50IGlzIG9wZW5lZCAqLwotCXByaXZhdGUgVGV4dElucHV0TGlzdGVuZXIgZlRleHRJbnB1dExpc3RlbmVyID0gbnVsbDsKLQkvKiogdGhlIHRleHQgdmlld2VyICovCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVmlld2VyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yCi0JICovCi0JcHVibGljIERpcnR5UmVnaW9uUHJvY2Vzc29yKCkgewotCQkvLyBpbml0IGpvYiBzdHVmZgotCQlzdXBlcihTU0VVSU1lc3NhZ2VzLnByb2NfZGlydHlfcmVnaW9uc18wKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQotCQkvLyBpbml0IHJlY29uY2lsZXIgc3R1ZmYKLQkJc2V0RGVsYXkoVVBEQVRFX0RFTEFZKTsKLQkJZlJlY29uY2lsaW5nU3RyYXRlZ2llcyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcmVzb3VyY2UgdG8gdGhlIHNldCBvZiByZXNvdXJjZXMgdGhhdCBuZWVkIHJlZnJlc2hpbmcuCi0JICogU3luY2hyb25pemVkIGluIG9yZGVyIHRvIHByb3RlY3QgdGhlIGNvbGxlY3Rpb24gZHVyaW5nIGFkZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlcXVlc3QoRGlydHlSZWdpb24gbmV3RGlydHlSZWdpb24pIHsKLQkJLy8gTk9URTogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGEgbG90IHNvIG1ha2Ugc3VyZSBpdCdzIGZhc3QKLQkJTGlzdCBkaXJ0eVJlZ2lvblF1ZXVlID0gZ2V0RGlydHlSZWdpb25RdWV1ZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlydHlSZWdpb25RdWV1ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBnbyB0aHJvdWdoIGxpc3Qgb2YgZXhpc3RpbmcgZGlydHkgcmVnaW9ucyBhbmQgY2hlY2sgaWYgYW55Ci0JCQkvLyBkaXJ0eSByZWdpb25zIG5lZWQgdG8gYmUgZGlzY2FyZGVkCi0JCQlEaXJ0eVJlZ2lvbiBjdXJyZW50RXhpc3RpbmcgPSAoRGlydHlSZWdpb24pIGl0Lm5leHQoKTsKLQkJCURpcnR5UmVnaW9uIG91dGVyID0gZ2V0T3V0ZXJSZWdpb24oY3VycmVudEV4aXN0aW5nLCBuZXdEaXJ0eVJlZ2lvbik7Ci0JCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXF1ZXN0IHdoaWNoIGNvbnRhaW5zIHRoZSBuZXcgcmVxdWVzdCwKLQkJCS8vIGRpc2NhcmQgdGhlIG5ldyByZXF1ZXN0Ci0JCQlpZiAob3V0ZXIgPT0gY3VycmVudEV4aXN0aW5nKQotCQkJCXJldHVybjsKLQkJCS8vIGlmIG5ldyByZXF1ZXN0IGNvbnRhaW5zIGFueSBleGlzdGluZyByZXF1ZXN0cywKLQkJCS8vIHJlbW92ZSB0aG9zZQotCQkJaWYgKG91dGVyID09IG5ld0RpcnR5UmVnaW9uKQotCQkJCWl0LnJlbW92ZSgpOwotCQl9Ci0JCWRpcnR5UmVnaW9uUXVldWUuYWRkKG5ld0RpcnR5UmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBzdWJjbGFzc2VzIHRoYXQgcHJvY2Vzc2luZyBvZiBtdWx0aXBsZSBkaXJ0eSByZWdpb25zIGhhcyBiZWd1bgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luUHJvY2Vzc2luZygpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCWludCBkck9mZnNldCA9IGRpcnR5UmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgZHJMZW5ndGggPSBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQotCQlyZXR1cm4gY29tcHV0ZVBhcnRpdGlvbmluZyhkck9mZnNldCwgZHJMZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBkck9mZnNldCwgaW50IGRyTGVuZ3RoKSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpbnQgZG9jTGVuZ3RoID0gZG9jLmdldExlbmd0aCgpOwotCi0JCUlUeXBlZFJlZ2lvbltdIHRyID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQotCQlpZiAoZHJPZmZzZXQgPiBkb2NMZW5ndGgpIHsKLQkJCWRyT2Zmc2V0ID0gZG9jTGVuZ3RoOwotCQkJZHJMZW5ndGggPSAwOwotCQl9Ci0JCWVsc2UgaWYgKGRyT2Zmc2V0ICsgZHJMZW5ndGggPiBkb2NMZW5ndGgpIHsKLQkJCWRyTGVuZ3RoID0gZG9jTGVuZ3RoIC0gZHJPZmZzZXQ7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gZGlydHkgcmVnaW9uIG1heSBzcGFuIG11bHRpcGxlIHBhcnRpdGlvbnMKLQkJCXRyID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGRvYywgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSwgZHJPZmZzZXQsIGRyTGVuZ3RoLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIGluZm8gPSAiZHI6IFsiICsgZHJPZmZzZXQgKyAiOiIgKyBkckxlbmd0aCArICJdIGRvYzogWyIgKyBkb2NMZW5ndGggKyAiXSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGluZm8sIGUpOwotCQkJdHIgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCQl9Ci0JCXJldHVybiB0cjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBpZiBvbmUgZGlydHkgcmVnaW9uIGNvbnRhaW5zIHRoZSBvdGhlciBhbmQgaWYgc28sCi0JICogd2hpY2ggaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIGl0LgotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybiB0aGUgb3V0ZXIgZGlydHkgcmVnaW9uIGlmIGl0IGNvbnRhaW5zIHRoZSBvdGhlciBkaXJ0eSByZWdpb24sCi0JICogICAgICAgICBudWxsIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBEaXJ0eVJlZ2lvbiBnZXRPdXRlclJlZ2lvbihEaXJ0eVJlZ2lvbiByb290LCBEaXJ0eVJlZ2lvbiBwb3NzaWJsZSkgewotCQlEaXJ0eVJlZ2lvbiBvdXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRhaW5lZChyb290LCBwb3NzaWJsZSkpCi0JCQlvdXRlciA9IHJvb3Q7Ci0JCWVsc2UgaWYgKGlzQ29udGFpbmVkKHBvc3NpYmxlLCByb290KSkKLQkJCW91dGVyID0gcG9zc2libGU7Ci0JCXJldHVybiBvdXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBvZiBhICJwb3NzaWJsZSIgZGlydHkgcmVnaW9uIGNhbiBiZSBkaXNjYXJkZWQgaW4KLQkgKiBmYXZvciBvZiB1c2luZyBqdXN0IHRoZSAicm9vdCIgZGlydHkgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gaWYgdGhlIHJvb3QgZGlydHkgcmVnaW9uIGNvbnRhaW5zIHBvc3NpYmxlLCByZXR1cm4gdHJ1ZSwKLQkgKiAgICAgICAgIG90aGVyd2lzZSByZXR1cm4gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWQoRGlydHlSZWdpb24gcm9vdCwgRGlydHlSZWdpb24gcG9zc2libGUpIHsKLQkJaW50IHJvb3RTdGFydCA9IHJvb3QuZ2V0T2Zmc2V0KCk7Ci0JCWludCByb290RW5kID0gcm9vdFN0YXJ0ICsgcm9vdC5nZXRMZW5ndGgoKTsKLQkJaW50IHBvc3NTdGFydCA9IHBvc3NpYmxlLmdldE9mZnNldCgpOwotCQlpbnQgcG9zc0VuZCA9IHBvc3NTdGFydCArIHBvc3NpYmxlLmdldExlbmd0aCgpOwotCQlpZiAocm9vdFN0YXJ0IDw9IHBvc3NTdGFydCAmJiByb290RW5kID49IHBvc3NFbmQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBEaXJ0eVJlZ2lvbiBjcmVhdGVEaXJ0eVJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlEaXJ0eVJlZ2lvbiBkdXJ0eSA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCi0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJLy8gc2FmZXR5IGZvciBCTEUKLQkJCWludCBkb2NMZW4gPSBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jTGVuKSB7Ci0JCQkJb2Zmc2V0ID0gZG9jTGVuOwotCQkJCWxlbmd0aCA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChvZmZzZXQgKyBsZW5ndGggPj0gZG9jTGVuKQotCQkJCWxlbmd0aCA9IGRvY0xlbiAtIG9mZnNldDsKLQkJCXRyeSB7Ci0JCQkJZHVydHkgPSBuZXcgRGlydHlSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUsIGRvYy5nZXQob2Zmc2V0LCBsZW5ndGgpKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIGluZm8gPSAiZHI6IFsiICsgb2Zmc2V0ICsgIjoiICsgbGVuZ3RoICsgIl0gZG9jOiBbIiArIGRvY0xlbiArICJdICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGluZm8sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkdXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlydHlSZWdpb24gY3JlYXRlRGlydHlSZWdpb24oSVR5cGVkUmVnaW9uIHRyLCBTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gY3JlYXRlRGlydHlSZWdpb24odHIuZ2V0T2Zmc2V0KCksIHRyLmdldExlbmd0aCgpLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaERpcnR5UmVnaW9uUXVldWUoKSB7Ci0JCWZEaXJ0eVJlZ2lvblF1ZXVlLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgc3ViY2xhc3NlcyB0aGF0IHByb2Nlc3Npbmcgb2YgbXVsdGlwbGUgZGlydHkgcmVnaW9ucyBoYXMKLQkgKiBlbmRlZCwgZm9yIG5vdwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZFByb2Nlc3NpbmcoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCS8qKgotCSAqIERlbGF5IGJldHdlZW4gcHJvY2Vzc2luZyBvZiBEaXJ0eVJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWxvbmcgZ2V0RGVsYXkoKSB7Ci0JCXJldHVybiBmRGVsYXk7Ci0JfQotCi0JTGlzdCBnZXREaXJ0eVJlZ2lvblF1ZXVlKCkgewotCQlyZXR1cm4gZkRpcnR5UmVnaW9uUXVldWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIElEb2N1bWVudCBvbiB3aGljaCB0aGlzIHJlY29uY2lsZXIgb3BlcmF0ZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCkgewotCQlpZiAoZlBhcnRpdGlvbmluZyA9PSBudWxsKQotCQkJcmV0dXJuIElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc7Ci0JCXJldHVybiBmUGFydGl0aW9uaW5nOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25zKGludCBkck9mZnNldCwgaW50IGRyTGVuZ3RoKSB7Ci0KLQkJSVR5cGVkUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCWludCBkb2NMZW5ndGggPSBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCi0JCWlmIChkck9mZnNldCA+IGRvY0xlbmd0aCkgewotCQkJZHJPZmZzZXQgPSBkb2NMZW5ndGg7Ci0JCQlkckxlbmd0aCA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoZHJPZmZzZXQgKyBkckxlbmd0aCA+IGRvY0xlbmd0aCkgewotCQkJZHJMZW5ndGggPSBkb2NMZW5ndGggLSBkck9mZnNldDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZWdpb25zID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGdldERvY3VtZW50KCksIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCksIGRyT2Zmc2V0LCBkckxlbmd0aCwgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZWdpb25zID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQkJfQotCQlTdHJpbmdbXSBwYXJ0aXRpb25zID0gbmV3IFN0cmluZ1tyZWdpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykKLQkJCXBhcnRpdGlvbnNbaV0gPSByZWdpb25zW2ldLmdldFR5cGUoKTsKLQkJcmV0dXJuIHBhcnRpdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVjb25jaWxpbmcgc3RyYXRlZ3kgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWNvbmNpbGVyIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgcGFydGl0aW9uIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3Igd2hpY2ggdG8gZGV0ZXJtaW5lIHRoZSByZWNvbmNpbGluZwotCSAqICAgICAgICAgICAgc3RyYXRlZ3kKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWNvbmNpbGluZyBzdHJhdGVneSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gcGFydGl0aW9uCi0JICogICAgICAgICB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIHN0cmF0ZWd5Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXIjZ2V0UmVjb25jaWxpbmdTdHJhdGVneShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUmVjb25jaWxpbmdTdHJhdGVneSBnZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJUmVjb25jaWxpbmdTdHJhdGVneSkgZlJlY29uY2lsaW5nU3RyYXRlZ2llcy5nZXQocGFydGl0aW9uVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWxzbyBzeW5jaHJvbml6ZWQgYmVjYXVzZSBpdCBhY2Nlc3NlcyB0aGUgZlJlcXVlc3RzIHF1ZXVlCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBOb2RlcyB0byByZWZyZXNoCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRGlydHlSZWdpb25bXSBnZXRSZXF1ZXN0cygpIHsKLQkJRGlydHlSZWdpb25bXSB0b1JlZnJlc2ggPSAoRGlydHlSZWdpb25bXSkgZkRpcnR5UmVnaW9uUXVldWUudG9BcnJheShuZXcgRGlydHlSZWdpb25bZkRpcnR5UmVnaW9uUXVldWUuc2l6ZSgpXSk7Ci0JCWZEaXJ0eVJlZ2lvblF1ZXVlLmNsZWFyKCk7Ci0JCXJldHVybiB0b1JlZnJlc2g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCB2aWV3ZXIgdGhpcyByZWNvbmNpbGVyIGlzIGluc3RhbGxlZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHZpZXdlciB0aGlzIHJlY29uY2lsZXIgaXMgaW5zdGFsbGVkIG9uCi0JICovCi0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGdldFRleHRWaWV3ZXIoKSB7Ci0JCXJldHVybiBmVmlld2VyOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvbGRJbnB1dAotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqLwotCXZvaWQgaGFuZGxlSW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gZG9uJ3QgYm90aGVyIGlmIHJlY29uY2lsZXIgbm90IGluc3RhbGxlZAotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCi0JCQlyZWNvbmNpbGVyRG9jdW1lbnRDaGFuZ2VkKG5ld0lucHV0KTsKLQkJCXNldERvY3VtZW50KG5ld0lucHV0KTsKLQkJCXNldEVudGlyZURvY3VtZW50RGlydHkobmV3SW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXIjaW5zdGFsbChJVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJLy8gd2UgbWlnaHQgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgdmlld2UuciwKLQkJLy8gbWF5YmUgYWZ0ZXIgYmVpbmcgdW5pbnN0YWxsZWQgYXMgd2VsbCwgc28gdHJhY2sgc2VwYXJhdGVseQotCQlpZiAoIWlzSW5zdGFsbGVkKCkpIHsKLQkJCWZWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCQkJZlRleHRJbnB1dExpc3RlbmVyID0gbmV3IFRleHRJbnB1dExpc3RlbmVyKCk7Ci0JCQl0ZXh0Vmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKGZUZXh0SW5wdXRMaXN0ZW5lcik7Ci0JCQlzZXRJbnN0YWxsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlld2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIFJlY29uY2lsZXIuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB2aWV3ZXIgaGFzIGJlZW4gc2V0IG9uIHRoaXMgUmVjb25jaWxlciwgZmFsc2UKLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZJc0luc3RhbGxlZDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgZm9yIHNwZWNpZmljIGhhbmRsaW5nIG9mIGRpcnR5IHJlZ2lvbnMuIFRoZQotCSAqIG1ldGhvZCBpcyBpbnZva2VkIGZvciBlYWNoIGRpcnR5IHJlZ2lvbiBpbiB0aGUgSm9iJ3MgcXVldWUuCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbikgewotCQkvKgotCQkgKiBCcmVhayB0aGUgZGlydHkgcmVnaW9uIGludG8gYSBzZXF1ZW5jZSBvZiBwYXJ0aXRpb25zIGFuZCBmaW5kIHRoZQotCQkgKiBjb3JyZXNwb25kaW5nIHN0cmF0ZWd5IHRvIHJlY29uY2lsZSB0aG9zZSBwYXJ0aXRpb25zLiBJZiBhIHN0cmF0ZWd5Ci0JCSAqIGltcGxlbWVudHMgSU5vbkluY3JlbWVudGFsUmVjb25jaWxpbmdTdHJhdGVneSwgb25seSBjYWxsIGl0IG9uY2UKLQkJICogcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBwYXJ0aXRpb25zLgotCQkgKi8KLQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IGNvbXB1dGVQYXJ0aXRpb25pbmcoZGlydHlSZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZWNvbmNpbGluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0UmVjb25jaWxpbmdTdHJhdGVneShwYXJ0aXRpb25zW2ldLmdldFR5cGUoKSk7Ci0JCQlpZiAoc3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCXN0cmF0ZWd5LnJlY29uY2lsZShwYXJ0aXRpb25zW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEludm9rZSBkaXJ0eSByZWdpb24gcHJvY2Vzc2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NEaXJ0eVJlZ2lvbihEaXJ0eVJlZ2lvbiBkcikgewotCQlpZiAoZHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljYW5jZWwoKTsKLQkJYWRkUmVxdWVzdChkcik7Ci0JCXNjaGVkdWxlKGdldERlbGF5KCkpOwotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRlZCByZXF1ZXN0IGZvcjogWyIgKyBkci5nZXRUZXh0KCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicXVldWUgc2l6ZSBpcyBub3c6ICIgKyBnZXREaXJ0eVJlZ2lvblF1ZXVlKCkuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVpbml0aWFsaXplcyBsaXN0ZW5lcnMgYW5kIHNldHMgbmV3IGRvY3VtZW50IG9uYWxsIHN0cmF0ZWdpZXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuQWJzdHJhY3RSZWNvbmNpbGVyI3JlY29uY2lsZXJEb2N1bWVudENoYW5nZWQoSURvY3VtZW50KQotCSAqLwotCXZvaWQgcmVjb25jaWxlckRvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJSURvY3VtZW50IGN1cnJlbnREb2MgPSBnZXREb2N1bWVudCgpOwotCi0JCS8vIHVuaG9vayBvbGQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGN1cnJlbnREb2MgIT0gbnVsbCkKLQkJCWN1cnJlbnREb2MucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCS8vIGhvb2sgdXAgbmV3IGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChuZXdEb2N1bWVudCAhPSBudWxsKQotCQkJbmV3RG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0KLQkJLy8gc2V0cyBkb2N1bWVudCBvbiBhbGwgc3RyYXRlZ2llcwotCQlzZXREb2N1bWVudChuZXdEb2N1bWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQliZWdpblByb2Nlc3NpbmcoKTsKLQotCQkJRGlydHlSZWdpb25bXSB0b1JlZnJlc2ggPSBnZXRSZXF1ZXN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlZnJlc2gubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCXByb2Nlc3ModG9SZWZyZXNoW2ldKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM2NzYKLQkJCS8vIHN0b3AgZXJyb3JzIGZyb20gcG9wcGluZyB1cCBhIGRpYWxvZwotCQkJLy8gZnJvbSB0aGUgam9iIG1hbmFnZXIKLQotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjA1MgotCQkJLy8gZG9uJ3QgbG9nIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JCQlpZiAoIShlIGluc3RhbmNlb2YgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pKQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gd2l0aCByZWNvbmNpbGluZyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRQcm9jZXNzaW5nKCk7Ci0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVsYXkobG9uZyBkZWxheSkgewotCQlmRGVsYXkgPSBkZWxheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgZm9yIHRoaXMgcmVjb25jaWxlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uaW5nCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGZvciB0aGlzIHJlY29uY2lsZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmluZyhTdHJpbmcgcGFydGl0aW9uaW5nKSB7Ci0JCWZQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogQmFzaWNhbGx5IG1lYW5zIHByb2Nlc3MgdGhlIGVudGlyZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbnRpcmVEb2N1bWVudERpcnR5KElEb2N1bWVudCBkb2N1bWVudCkgewotCi0JCS8vIG1ha2UgdGhlIGVudGlyZSBkb2N1bWVudCBkaXJ0eQotCQkvLyB0aGlzIGFsc28gaGFwcGVucyBvbiBhICJzYXZlIGFzIgotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBpc0luc3RhbGxlZCgpKSB7Ci0KLQkJCS8vIHNpbmNlIHdlJ3JlIG1hcmtpbmcgdGhlIGVudGlyZSBkb2MgZGlydHkKLQkJCWdldERpcnR5UmVnaW9uUXVldWUoKS5jbGVhcigpOwotCQkJRGlydHlSZWdpb24gZW50aXJlRG9jdW1lbnQgPSBjcmVhdGVEaXJ0eVJlZ2lvbigwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQkJCXByb2Nlc3NEaXJ0eVJlZ2lvbihlbnRpcmVEb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNJbnN0YWxsZWQKLQkgKiAgICAgICAgICAgIFRoZSBpc0luc3RhbGxlZCB0byBzZXQuCi0JICovCi0Jdm9pZCBzZXRJbnN0YWxsZWQoYm9vbGVhbiBpc0luc3RhbGxlZCkgewotCQlmSXNJbnN0YWxsZWQgPSBpc0luc3RhbGxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KFN0cmluZyBwYXJ0aXRpb25UeXBlLCBJUmVjb25jaWxpbmdTdHJhdGVneSBzdHJhdGVneSkgewotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlpZiAoc3RyYXRlZ3kgPT0gbnVsbCkgewotCQkJZlJlY29uY2lsaW5nU3RyYXRlZ2llcy5yZW1vdmUocGFydGl0aW9uVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUmVjb25jaWxpbmdTdHJhdGVnaWVzLnB1dChwYXJ0aXRpb25UeXBlLCBzdHJhdGVneSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlciN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCS8vIHJlbW92ZXMgd2lkZ2V0IGxpc3RlbmVyCi0JCQlnZXRUZXh0Vmlld2VyKCkucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIoZlRleHRJbnB1dExpc3RlbmVyKTsKLQkJCXNldEluc3RhbGxlZChmYWxzZSk7Ci0JCQkvLyByZW1vdmVzIGRvY3VtZW50IGxpc3RlbmVycwotCQkJcmVjb25jaWxlckRvY3VtZW50Q2hhbmdlZChudWxsKTsKLQkJfQotCQlzZXREb2N1bWVudChudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRG9jdW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDlkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsYWJsZU1vZGVsOwotCi0vKioKLSAqIEFkYXB0cyBhbiA8Y29kZT5JRG9jdW1lbnQ8L2NvZGU+IHRvIGEgPGNvZGU+SVJlY29uY2lsYWJsZU1vZGVsPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRBZGFwdGVyIGltcGxlbWVudHMgSVJlY29uY2lsYWJsZU1vZGVsIHsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXh0IG1vZGVsIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgbW9kZWwncyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCdzIGlucHV0IGRvY3VtZW50Ci0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50UmVnaW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50UmVnaW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzU2ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudFJlZ2lvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLlZhbGlkYXRvckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5WYWxpZGF0b3JTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNwZWxsaW5nLlNwZWxsY2hlY2tTdHJhdGVneTsKLQotLyoqCi0gKiBBZGRzIHRvIERpcnR5UmVnaW9uUHJvY2Vzc29yIEpvYjogLSBJRG9jdW1lbnRMaXN0ZW5lciAtIFZhbGlkYXRvclN0cmF0ZWd5IC0KLSAqIFRleHQgdmlld2VyKGRpc3Bvc2UsIGlucHV0IGNoYW5nZWQpIGxpc3RlbmVycy4gLSBkZWZhdWx0LCBzcGVsbGluZywgYW5kCi0gKiB2YWxpZGF0b3Igc3RyYXRlZ2llcyAtIERpcnR5UmVnaW9uIHByb2Nlc3NpbmcgbG9naWMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJlZ2lvblByb2Nlc3NvciBleHRlbmRzIERpcnR5UmVnaW9uUHJvY2Vzc29yIHsKLQotCS8qKgotCSAqIEEgc3RyYXRlZ3kgdG8gdXNlIHRoZSBkZWZpbmVkIGRlZmF1bHQgU3BlbGxpbmcgc2VydmljZS4KLQkgKi8KLQlwcml2YXRlIFNwZWxsY2hlY2tTdHJhdGVneSBmU3BlbGxjaGVja1N0cmF0ZWd5OwotCi0JLyoqCi0JICogVGhlIHN0cmF0ZWd5IHRoYXQgcnVucyB2YWxpZGF0b3JzIGNvbnRyaWJ1dGVkIHZpYQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5zb3VyY2V2YWxpZGF0aW9uPC9jb2RlPgotCSAqIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yU3RyYXRlZ3kgZlZhbGlkYXRvclN0cmF0ZWd5OwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1NFX1VJX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpblByb2Nlc3NpbmcoKSB7Ci0JCXN1cGVyLmJlZ2luUHJvY2Vzc2luZygpOwotCQlWYWxpZGF0b3JTdHJhdGVneSB2YWxpZGF0b3JTdHJhdGVneSA9IGdldFZhbGlkYXRvclN0cmF0ZWd5KCk7Ci0JCWlmICh2YWxpZGF0b3JTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0b3JTdHJhdGVneS5iZWdpblByb2Nlc3NpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZFByb2Nlc3NpbmcoKSB7Ci0JCXN1cGVyLmVuZFByb2Nlc3NpbmcoKTsKLQkJVmFsaWRhdG9yU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBnZXRWYWxpZGF0b3JTdHJhdGVneSgpOwotCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJdmFsaWRhdG9yU3RyYXRlZ3kuZW5kUHJvY2Vzc2luZygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQotCQkvLyBwYV9UT0RPIGl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBnZXQgZmlsZW5hbWUgZnJvbQotCQkvLyBJRG9jdW1lbnQuLi4KLQkJLy8gYmVjYXVzZSBpdCBzZWVtcyB0aGF0IGdldHRpbmcgY29udGVudCB0eXBlIGZyb20gaW5wdXQgc3RyZWFtCi0JCS8vIGlzbid0IGFsbCB0aGF0IGFjY3VyYXRlIChlZy4gdy8gYSBqYXZhc2NyaXB0IGZpbGUpCi0KLQkJLy8gSUNvbnRlbnRUeXBlIGN0ID0KLQkJLy8gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKCJ0ZXN0LmpzIik7Ci0JCUlDb250ZW50VHlwZSBjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZG9jLmdldCgpLmdldEJ5dGVzKCkpLCBudWxsLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJY3QgPSBkZXNjLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJaWYgKGN0ICE9IG51bGwpCi0JCQkJCWNvbnRlbnRUeXBlSWQgPSBjdC5nZXRJZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGJhaWwKLQkJfQotCQlyZXR1cm4gY29udGVudFR5cGVJZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IGdldFNwZWxsY2hlY2tTdHJhdGVneSgpIHsKLQkJaWYgKGZTcGVsbGNoZWNrU3RyYXRlZ3kgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBnZXRDb250ZW50VHlwZShnZXREb2N1bWVudCgpKTsKLQkJCWlmIChjb250ZW50VHlwZUlkICE9IG51bGwpIHsKLQkJCQlpZiAoZ2V0VGV4dFZpZXdlcigpIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlcikgewotCQkJCQlJU291cmNlVmlld2VyIHZpZXdlciA9IChJU291cmNlVmlld2VyKSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQkJCWZTcGVsbGNoZWNrU3RyYXRlZ3kgPSBuZXcgU3BlbGxjaGVja1N0cmF0ZWd5KHZpZXdlciwgY29udGVudFR5cGVJZCk7Ci0JCQkJCWZTcGVsbGNoZWNrU3RyYXRlZ3kuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCWZTcGVsbGNoZWNrU3RyYXRlZ3kuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmU3BlbGxjaGVja1N0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgVmFsaWRhdG9yU3RyYXRlZ3kuCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRvclN0cmF0ZWd5IGdldFZhbGlkYXRvclN0cmF0ZWd5KCkgewotCQlpZiAoZlZhbGlkYXRvclN0cmF0ZWd5ID09IG51bGwpIHsKLQkJCVZhbGlkYXRvclN0cmF0ZWd5IHZhbGlkYXRvclN0cmF0ZWd5ID0gbnVsbDsKLQotCQkJaWYgKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXIpIHsKLQkJCQlJU291cmNlVmlld2VyIHZpZXdlciA9IChJU291cmNlVmlld2VyKSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBudWxsOwotCi0JCQkJSURvY3VtZW50IGRvYyA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJCWNvbnRlbnRUeXBlSWQgPSBnZXRDb250ZW50VHlwZShkb2MpOwotCi0JCQkJaWYgKGNvbnRlbnRUeXBlSWQgIT0gbnVsbCkgewotCQkJCQl2YWxpZGF0b3JTdHJhdGVneSA9IG5ldyBWYWxpZGF0b3JTdHJhdGVneSh2aWV3ZXIsIGNvbnRlbnRUeXBlSWQpOwotCQkJCQlWYWxpZGF0b3JCdWlsZGVyIHZCdWlsZGVyID0gbmV3IFZhbGlkYXRvckJ1aWxkZXIoKTsKLQkJCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gdkJ1aWxkZXIuZ2V0VmFsaWRhdG9yTWV0YURhdGEoU1NFX1VJX0lEKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAodm1kc1tpXS5jYW5IYW5kbGVDb250ZW50VHlwZShjb250ZW50VHlwZUlkKSkKLQkJCQkJCQl2YWxpZGF0b3JTdHJhdGVneS5hZGRWYWxpZGF0b3JNZXRhRGF0YSh2bWRzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZWYWxpZGF0b3JTdHJhdGVneSA9IHZhbGlkYXRvclN0cmF0ZWd5OwotCQl9Ci0JCXJldHVybiBmVmFsaWRhdG9yU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbikgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIucHJvY2VzcyhkaXJ0eVJlZ2lvbik7Ci0KLQkJLy8gQWxzbyBjYWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBzcGVsbC1jaGVjayBzdHJhdGVnaWVzCi0JCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBjb21wdXRlUGFydGl0aW9uaW5nKGRpcnR5UmVnaW9uKTsKLQotCQlEaXJ0eVJlZ2lvbiBkaXJ0eSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJLy8gW3NvdXJjZV12YWxpZGF0b3IgKGV4dGVuc2lvbikgZm9yIHRoaXMgcGFydGl0aW9uCi0JCQlpZiAoZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKSAhPSBudWxsKSB7Ci0JCQkJZGlydHkgPSBjcmVhdGVEaXJ0eVJlZ2lvbihwYXJ0aXRpb25zW2ldLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCWdldFZhbGlkYXRvclN0cmF0ZWd5KCkucmVjb25jaWxlKHBhcnRpdGlvbnNbaV0sIGRpcnR5KTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gc2luZ2xlIHNwZWxsLWNoZWNrIGZvciBldmVyeXRoaW5nCi0JCWlmIChnZXRTcGVsbGNoZWNrU3RyYXRlZ3koKSAhPSBudWxsKSB7Ci0JCQlnZXRTcGVsbGNoZWNrU3RyYXRlZ3koKS5yZWNvbmNpbGUoZGlydHlSZWdpb24sIGRpcnR5UmVnaW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQkJSVJlY29uY2lsaW5nU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBnZXRWYWxpZGF0b3JTdHJhdGVneSgpOwotCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJdmFsaWRhdG9yU3RyYXRlZ3kuc2V0RG9jdW1lbnQoZG9jKTsKLQkJfQotCQlpZiAoZlNwZWxsY2hlY2tTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQlmU3BlbGxjaGVja1N0cmF0ZWd5LnNldERvY3VtZW50KGRvYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRpcnR5UmVnaW9uUHJvY2Vzc29yI3VuaW5zdGFsbCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCi0JCQljYW5jZWwoKTsKLQotCQkJSVJlY29uY2lsaW5nU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBnZXRWYWxpZGF0b3JTdHJhdGVneSgpOwotCi0JCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCWlmICh2YWxpZGF0b3JTdHJhdGVneSBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKQotCQkJCQkoKElSZWxlYXNhYmxlKSB2YWxpZGF0b3JTdHJhdGVneSkucmVsZWFzZSgpOwotCQkJfQotCQkJaWYgKGZTcGVsbGNoZWNrU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCWZTcGVsbGNoZWNrU3RyYXRlZ3kuc2V0RG9jdW1lbnQobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudW5pbnN0YWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JQ29uZmlndXJhYmxlUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JQ29uZmlndXJhYmxlUmVjb25jaWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjhiMjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSUNvbmZpZ3VyYWJsZVJlY29uY2lsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci0KLS8qKgotICogQSByZWNvbmNpbGVyIHRoYXQgYWxsb3dzIElSZWNvbmNpbGluZ1N0cmF0ZWdpZXMgdG8gYmUgYXNzaWduZWQgdG8gcGFydGl0aW9uCi0gKiB0eXBlcy4gVGhlIHJlY29uY2lsZXIgd2lsbCBjYWxsIHRoZSByZWdpc3RlcmVkIElSZWNvbmNpbGluZ1N0cmF0ZWd5IHdoZW4KLSAqIGRpcnR5IHJlZ2lvbnMgd2hpY2ggY29udGFpbiBwYXJ0aXRpb25zIG9mIGEgc3BlY2lmaWMgdHlwZSBuZWVkIHRvIGJlCi0gKiByZWNvbmNpbGVkLgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYWJsZVJlY29uY2lsZXIgewotCS8qKgotCSAqIFNldHMgdGhlIHJlY29uY2lsaW5nIHN0cmF0ZWd5IGZvciB0aGUgcmVjb25jaWxlciB0byB1c2UgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjb250ZW50IHR5cGUuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdHlwZQotCSAqIEBwYXJhbSBzdHJhdGVneQotCSAqICAgICAgICAgICAgdGhlIHJlY29uY2lsaW5nIHN0cmF0ZWd5Ci0JICovCi0Jdm9pZCBzZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KFN0cmluZyBwYXJ0aXRpb25UeXBlLCBJUmVjb25jaWxpbmdTdHJhdGVneSBzdHJhdGVneSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MmRmMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlU3RlcDsKLQotLyoqCi0gKiBEZWZpbmVzIGFuIGFubm90YXRpb24ga2V5IHRoYXQgdGhlCi0gKiA8Y29kZT5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTwvY29kZT4ga25vd3MgaG93IHRvCi0gKiByZW1vdmUgYXBwcm9wcmlhdGVseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgbm90IEFQSSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYmVjb21lIGFuIGFic3RyYWN0IGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlY29uY2lsZUFubm90YXRpb25LZXkgewotCXN0YXRpYyBmaW5hbCBpbnQgUEFSVElBTCA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBUT1RBTCA9IDA7Ci0KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpOwotCi0JLy9pbnQgZ2V0U2NvcGUoKTsKLQotCUlSZWNvbmNpbGVTdGVwIGdldFN0ZXAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWJiNWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqIEBkZXByZWNhdGVkIHN0aWxsIHdvcmtpbmcgb3V0IEFQSSAob3IgaWYgYW55dGhpbmcgaGVyZSBzaG91bGQgYmUgQVBJKQotICogCi0gKiBJbnRlcmZhY2UgZm9yIGEgc3RlcCBpbiBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yIGZyYW1ld29yay4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgZXh0ZW5kcyBJUmVjb25jaWxlU3RlcCB7Ci0JLyoqCi0JICogUGFydGl0aW9ucyBmb3Igd2hpY2ggdGhpcyBzdGVwIGNhbiBhZGQvcmVtb3ZlIGFubm90aW9ucwotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHBhcnRpdGlvbnMgZm9yIHdoaWNoIHRoaXMgc3RlcCBjYW4gYWRkL3JlbW92ZQotCSAqICAgICAgICAgYW5ub3Rpb25zCi0JICovCi0JU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNjb3BlIGZvciB3aGljaCB0aGlzIHN0ZXAgYWRkcyBhbm5vdGF0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzY29wZSBmb3Igd2hpY2ggdGhpcyBzdGVwIGFkZHMgYW5ub3RhdGlvbnMKLQkgKi8KLQkvL2ludCBnZXRTY29wZSgpOwotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBzdGVwIGlzIGVxdWFsIHRvIHRoaXMgc3RlcCBvciBhbnkgb2YgdGhlIHNpYmxpbmcKLQkgKiBzdGVwcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc1NpYmxpbmdTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApOwotCi0JLyoqCi0JICogQWRkcyBhd2FyZW5lc3MgdGhhdCB0aGUgUmVjb25jaWxlciBpcyByZWNvbmNpbGluZyB0aGUgZW50aXJlIGRvY3VtZW50Ci0JICogdGhpcyBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqIEBwYXJhbSBzdWJSZWdpb24KLQkgKiBAcGFyYW0gcmVmcmVzaEFsbAotCSAqIEByZXR1cm4KLQkgKi8KLQlJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbiwgYm9vbGVhbiByZWZyZXNoQWxsKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBTdHJhdGVneS4gRm9yIGV4YW1wbGU6IGFueSBmbGFncyB0aGF0Ci0JICogbmVlZCB0byBiZSByZXNldCBhZnRlciBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24gbGlrZSBwcm9jZXNzQWxsKCkuCi0JICovCi0Jdm9pZCByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JU3RydWN0dXJlZFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDQxNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JU3RydWN0dXJlZFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneTsKLQotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igc3RydWN0dXJlZCByZWNvbmNpbGluZyBzdHJhdGVnaWVzLgotICogCi0gKiBAZGVwcmVjYXRlZCBkb2Vzbid0IG5lZWQgdG8gYmUgQVBJIGFuZCBtaWdodCBnbyBhd2F5Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRSZWNvbmNpbGluZ1N0cmF0ZWd5IGV4dGVuZHMgSVJlY29uY2lsaW5nU3RyYXRlZ3kgewotCS8qKgotCSAqIEFkZHMgYXdhcmVuZXNzIHRoYXQgdGhlIHJlY29uY2lsZXIgaXMgcHJvY2Vzc2luZyB0aGUgZW50aXJlIGRvY3VtZW50Ci0JICogdmlhIHJlZnJlc2hBbGwgZmxhZy4KLQkgKiAKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKiBAcGFyYW0gc3ViUmVnaW9uCi0JICogQHBhcmFtIHJlZnJlc2hBbGwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uLCBib29sZWFuIHJlZnJlc2hBbGwpOwotCi0JLyoqCi0JICogVXNlZCB0byByZXNldCB0aGUgc3RhdGUgb2YgdGhlIFN0cmF0ZWd5LiBGb3IgZXhhbXBsZTogYW55IGZsYWdzIHRoYXQKLQkgKiBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgbG9uZyBydW5uaW5nIG9wZXJhdGlvbiBsaWtlIHByb2Nlc3NBbGwoKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9SZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1JlY29uY2lsZUFubm90YXRpb25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4OWUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1JlY29uY2lsZUFubm90YXRpb25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JUmVjb25jaWxlQW5ub3RhdGlvbktleTwvY29kZT4gbm90ZTogY2xpZW50cwotICogc2hvdWxkIHVzZSB0aGUgbWV0aG9kIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwI2NyZWF0ZUtleShTdHJpbmcKLSAqIHBhcnRpdGlvblR5cGUsIGludCBzY29wZSkKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFJlY29uY2lsZUFubm90YXRpb25LZXkgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRJQUwgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVEFMID0gMDsKLSAgICAKLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uVHlwZSA9IG51bGw7Ci0KLQlwcml2YXRlIElSZWNvbmNpbGVTdGVwIGZSZWNvbmNpbGVTdGVwID0gbnVsbDsKLQlwcml2YXRlIGludCBmU2NvcGU7Ci0KLQlwdWJsaWMgUmVjb25jaWxlQW5ub3RhdGlvbktleShJUmVjb25jaWxlU3RlcCBzdGVwLCBTdHJpbmcgcGFydGl0aW9uVHlwZSwgaW50IHNjb3BlKSB7Ci0JCWZSZWNvbmNpbGVTdGVwID0gc3RlcDsKLQkJZlBhcnRpdGlvblR5cGUgPSBwYXJ0aXRpb25UeXBlOwotCQlmU2NvcGUgPSBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBmUGFydGl0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQlyZXR1cm4gZlNjb3BlOwotCX0KLQotCXB1YmxpYyBJUmVjb25jaWxlU3RlcCBnZXRTdGVwKCkgewotCQlyZXR1cm4gZlJlY29uY2lsZVN0ZXA7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKSArICJcclxuaWQ6ICIgKyBmUGFydGl0aW9uVHlwZTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhODg3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkFic3RyYWN0UmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGFibGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBSZWNvbmNpbGVTdGVwIHRoYXQga25vd3MgYWJvdXQgdGhlIGFubm90YXRpb24gdGhhdCBpdCBhZGRzIHRvIHRoZQotICogQW5ub3RhdGlvbk1vZGVsLiBJdCBrbm93cyBob3cgdG8gY3JlYXRlIGFuIGFubm90YXRpb24ga2V5IChmb3Igc21hcnQKLSAqIHJlbW92YWwgbGF0ZXIpIEl0IGtub3dzIHRoZSBwYXJ0aXRpb24gdHlwZXMgb24gd2hpY2ggaXQgY2FuIG9wZXJhdGUuIEl0Ci0gKiBrbm93cyB0aGUgc2NvcGUgb24gd2hpY2ggaXQgb3BlcmF0ZXMgKGZvciBzaG9ydCBjaXJjdWl0aW5nKSBJdCBrbm93cyBpZiB0aGUKLSAqIFJlY29uY2lsZXIgaXMgcmVjb25jaWxpbmcgdGhlIGVudGlyZSBkb2N1bWVudC4KLSAqIAotICogQ2xpZW50cyBtdXN0IHN1YmNsYXNzIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCBleHRlbmRzIEFic3RyYWN0UmVjb25jaWxlU3RlcCBpbXBsZW1lbnRzIElSZWxlYXNhYmxlIHsKLQotCS8qKiBkZWJ1ZyBmbGFnICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlY29uY2lsZXJqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIElSZWNvbmNpbGVSZXN1bHRbXSBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVCA9IG5ldyBJUmVjb25jaWxlUmVzdWx0WzBdOwotCQotCS8qKgotCSAqIEl0J3MgcG9zc2libGUgZm9yIGEgcGFydGlhbCBzdGVwIHRvIGdldCBjYWxsZWQgb24gdGhlIHNhbWUgYXJlYSB0d2ljZQotCSAqIChhcyB3LyBhIGZ1bGwgZG9jdW1lbnQgcmVjb25jaWxlKSB0aGlzIGxpc3Qga2VlcHMgdHJhY2sgb2YgYXJlYSBhbHJlYWR5Ci0JICogY292ZXJlZC4gU2hvdWxkIGJlIHJlc2V0KCkgYWZ0ZXIgdGhlICJiYXRjaCIgb2YgcmVjb25jaWxpbmcgaXMKLQkgKiBmaW5pc2hlZC4KLQkgKi8KLQlwcml2YXRlIEhhc2hTZXQgZlBhcnRpdGlvblR5cGVzID0gbnVsbDsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCgpIHsKLQkJc3VwZXIoKTsKLQkJZlBhcnRpdGlvblR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwdWJsaWMgUmVjb25jaWxlQW5ub3RhdGlvbktleSBjcmVhdGVLZXkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgaW50IHNjb3BlKSB7Ci0KLQkJSVR5cGVkUmVnaW9uIHRyID0gZ2V0UGFydGl0aW9uKHNkUmVnaW9uKTsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSAodHIgIT0gbnVsbCkgPyB0ci5nZXRUeXBlKCkgOiBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0JCXJldHVybiBjcmVhdGVLZXkocGFydGl0aW9uVHlwZSwgc2NvcGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUeXBlZFJlZ2lvbiB0ciA9IG51bGw7Ci0JCWlmICghc2RSZWdpb24uaXNEZWxldGVkKCkpCi0JCQl0ciA9IGdldFBhcnRpdGlvbihzZFJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJcmV0dXJuIHRyOwotCX0KLQotCXByaXZhdGUgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB7Ci0JCUlUeXBlZFJlZ2lvbiB0ciA9IG51bGw7Ci0JCS8vIG5vdCBzdXJlIHdoeSBkb2N1bWVudCB3b3VsZCBldmVyIGJlIG51bGwsIGJ1dCBwdXQgaW4gdGhpcyAKLQkJLy8gZ3VhcmQgZm9yIAotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODYwNjkKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRyID0gVGV4dFV0aWxpdGllcy5nZXRQYXJ0aXRpb24oZG9jLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gZ2V0dGluZyBwYXJ0aXRpb24gYXQ6ICIgKyBvZmZzZXQsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRyOwotCX0KLQotCS8qKgotCSAqIENsaWVudHMgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYW5ub3RhdGlvbiBrZXlzIGFzIGl0Ci0JICogcmVnaXN0ZXJzIHRoZSBrZXkgZm9yIHJlbW92YWwgbGF0ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlY29uY2lsZUFubm90YXRpb25LZXkgY3JlYXRlS2V5KFN0cmluZyBwYXJ0aXRpb25UeXBlLCBpbnQgc2NvcGUpIHsKLQkJZlBhcnRpdGlvblR5cGVzLmFkZChwYXJ0aXRpb25UeXBlKTsKLQkJcmV0dXJuIG5ldyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KHRoaXMsIHBhcnRpdGlvblR5cGUsIHNjb3BlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJSVJlY29uY2lsYWJsZU1vZGVsIHJNb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChyTW9kZWwgaW5zdGFuY2VvZiBEb2N1bWVudEFkYXB0ZXIpIHsKLQkJCWRvYyA9ICgoRG9jdW1lbnRBZGFwdGVyKSByTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQlwdWJsaWMgSVJlY29uY2lsYWJsZU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gZ2V0SW5wdXRNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB7Ci0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2MsIG9mZnNldCk7Ci0JCXJldHVybiAodHIgIT0gbnVsbCkgPyB0ci5nZXRUeXBlKCkgOiBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQkvLyB1c2luZyBoYXNoIHNldCB0byBhdXRvbWF0aWNhbGx5IGdldCByaWQgb2YgZHVwZXMKLQkJSGFzaFNldCB0ZW1wUmVzdWx0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCS8vIGFkZCB0aGVzZSBwYXJ0aXRpb24gdHlwZXMKLQkJdGVtcFJlc3VsdHMuYWRkQWxsKGZQYXJ0aXRpb25UeXBlcyk7Ci0JCXJldHVybiAoU3RyaW5nW10pIHRlbXBSZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1t0ZW1wUmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXNEb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0RG9jdW1lbnQoKTsKLQkJcmV0dXJuIHNEb2M7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBkdXBsaWNhdGVzLgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRzMQotCSAqIEBwYXJhbSByZXN1bHRzMgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIG1lcmdlKElSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzMSwgSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMyKSB7Ci0JCWlmIChyZXN1bHRzMSA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdHMyOwotCQlpZiAocmVzdWx0czIgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHRzMTsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzdWx0czEpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzMi5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0cy5hZGQocmVzdWx0czJbaV0pOwotCQl9Ci0JCXJldHVybiAoSVJlY29uY2lsZVJlc3VsdFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IElSZWNvbmNpbGVSZXN1bHRbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5BYnN0cmFjdFJlY29uY2lsZVN0ZXAjcmVjb25jaWxlTW9kZWwob3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlTW9kZWwoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCXJldHVybiBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBzdGVwIGhlcmUgYXMgbmVlZGVkLiBCZSBzdXJlIHRvIGNhbGwKLQkgKiBzdXBlci5yZWxlYXNlKCkgd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgdG8gcHJvcGFnYXRlIHRoZQotCSAqIHJlbGVhc2UgdGhyb3VnaCBhbGwgc3RlcHMuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlZ2lvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGYzOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBBbiBJU3RydWN0dXJlZE1vZGVsIGF3YXJlIFJlZ2lvbiBQcm9jZXNzb3IuIEFkZHMgTW9kZWxMaWZlY3ljbGUgbGlzdGVuZXIuCi0gKiBNb2RlbExpZmVjeWNsZSBsaXN0ZW5lciBub3RpZmllcyB1cyB0aGF0IHNvbWUgcmVpbml0aWFsaXphdGlvbiBuZWVkcyB0bwotICogdGFrZSBwbGFjZS4KLSAqIAotICogTW9kZWwgYXdhcmUgInByb2Nlc3MoKSIgSW1wbGVtZW50cyBhIEluZGV4ZWRSZWdpb24tYmFzZWQgImNvbnRhaW5zKCkiCi0gKiBtZXRob2QgdXNpbmcgSVN0cnVjdHVyZWRNb2RlbC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvciBleHRlbmRzIERvY3VtZW50UmVnaW9uUHJvY2Vzc29yIHsKLQotCWNsYXNzIE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciNwcm9jZXNzUG9zdE1vZGVsRXZlbnQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCi0JCQkvLyBpZiB1bmRlcmx5aW5nIFN0cnVjdHVyZWREb2N1bWVudCBjaGFuZ2VkLCBuZWVkIHRvIHJlY29ubmVjdCBpdAotCQkJLy8gaGVyZS4uLgotCQkJLy8gZXguIGZpbGUgaXMgbW9kaWZpZWQgb3V0c2lkZSB0aGUgd29ya2JlbmNoCi0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCkgewotCi0JCQkJLy8gY2hlY2sgdGhhdCBpdCdzIHRoaXMgbW9kZWwgdGhhdCBjaGFuZ2VkCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCB0aGlzTW9kZWwgPSBnZXRTdHJ1Y3R1cmVkTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmICh0aGlzTW9kZWwgIT0gbnVsbCAmJiBldmVudC5nZXRNb2RlbCgpLmVxdWFscyh0aGlzTW9kZWwpKSB7Ci0KLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IGV2ZW50LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3I6IERPQ1VNRU5UIE1PREVMIENIQU5HRUQgVE86ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNEb2MuZ2V0KCkpOwotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXNldERvY3VtZW50KHNEb2MpOwotCQkJCQkJLy8gcHJvcGFnYXRlIGRvY3VtZW50IGNoYW5nZQotCQkJCQkJLy8gc2V0RG9jdW1lbnRPbkFsbFN0cmF0ZWdpZXMoc0RvYyk7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCB0aGUgZG9jdW1lbnQgaXMgcmUtcmVjb25jaWxlZAotCQkJCQkJc2V0RW50aXJlRG9jdW1lbnREaXJ0eShzRG9jKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHRoaXNNb2RlbCAhPSBudWxsKQotCQkJCQkJdGhpc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciNwcm9jZXNzUHJlTW9kZWxFdmVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb2Nlc3NQcmVNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQpIHsKLQotCQkJCWZsdXNoRGlydHlSZWdpb25RdWV1ZSgpOwotCQkJCS8vIG5vdGU6IG9sZCBhbm5vdGF0aW9ucyBhcmUgcmVtb3ZlZCB2aWEgdGhlIHN0cmF0ZWdpZXMgb24KLQkJCQkvLyBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSNzZXREb2N1bWVudCguLi4pCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGZMaWZlQ3ljbGVMaXN0ZW5lciA9IG5ldyBNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRpcnR5UmVnaW9uUHJvY2Vzc29yI2dldE91dGVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbikKLQkgKi8KLQlwcm90ZWN0ZWQgRGlydHlSZWdpb24gZ2V0T3V0ZXJSZWdpb24oRGlydHlSZWdpb24gcm9vdCwgRGlydHlSZWdpb24gcG9zc2libGUpIHsKLQkJLy8gZmlyc3QgdHJ5IHNpbXBsZSByZWdpb24gY2hlY2sgaWYgb25lIHJlZ2lvbiBjb250YWlucyB0aGUgb3RoZXIKLQkJRGlydHlSZWdpb24gb3V0ZXIgPSBzdXBlci5nZXRPdXRlclJlZ2lvbihyb290LCBwb3NzaWJsZSk7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQkvLyBub3cgY29tcGFyZSBub2RlcwotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBnZXRTdHJ1Y3R1cmVkTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJdHJ5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiByb290UmVnaW9uID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocm9vdC5nZXRPZmZzZXQoKSk7Ci0JCQkJCUluZGV4ZWRSZWdpb24gcG9zc1JlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHBvc3NpYmxlLmdldE9mZnNldCgpKTsKLQkJCQkJaWYgKHJvb3RSZWdpb24gIT0gbnVsbCAmJiBwb3NzUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWludCByb290U3RhcnQgPSByb290UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgcG9zc1N0YXJ0ID0gcG9zc1JlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJLy8gZmlyc3QganVzdCBjaGVjayBpZiByb290cmVnaW9uIHN0YXJ0cyBiZWZvcmUKLQkJCQkJCS8vIHBvc3NyZWdpb24KLQkJCQkJCWlmIChyb290U3RhcnQgPD0gcG9zc1N0YXJ0KSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgcG9zc3JlZ2lvbiBpcyBpbnNpZGUgcm9vdHJlZ2lvbgotCQkJCQkJCW91dGVyID0gX2dldE91dGVyUmVnaW9uKHJvb3QsIHBvc3NpYmxlLCBzTW9kZWwsIHJvb3RTdGFydCwgcG9zc1N0YXJ0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG90aGVyd2lzZSBpZiByb290cmVnaW9uIGlzIGluc2lkZSBwb3NzcmVnaW9uCi0JCQkJCQkJb3V0ZXIgPSBfZ2V0T3V0ZXJSZWdpb24ocG9zc2libGUsIHJvb3QsIHNNb2RlbCwgcG9zc1N0YXJ0LCByb290U3RhcnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dGVyOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZXMgdGhhdCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgcmVnaW9uMSdzIG5vZGUgc3RhcnQgb2Zmc2V0ID49Ci0JICogcmVnaW9uMidzIG5vZGUgc3RhcnQgb2Zmc2V0LiBEZXRlcm1pbmVzIGlmIHJlZ2lvbjEgY29udGFpbnMgcmVnaW9uMiBvcgotCSAqIHZpY2UgdmVyc2EuIFJldHVybnMgcmVnaW9uMSBpZjoKLQkgKiA8dWw+Ci0JICogPGxpPnJlZ2lvbjEncyBub2RlIHJlZ2lvbiA9PSByZWdpb24yJ3Mgbm9kZSByZWdpb248L2xpPgotCSAqIDxsaT5yZWdpb24xJ3Mgbm9kZSByZWdpb24gY29udGFpbnMgcmVnaW9uMidzIG5vZGUgcmVnaW9uPC9saT4KLQkgKiA8L3VsPgotCSAqIFJldHVybnMgcmVnaW9uMiBpZjoKLQkgKiA8dWw+Ci0JICogPGxpPnJlZ2lvbjEncyBub2RlIHJlZ2lvbiBhbmQgcmVnaW9uMidzIG5vZGUgcmVnaW9uIHN0YXJ0cyBhdCBzYW1lCi0JICogb2Zmc2V0IGJ1dCByZWdpb24yJ3Mgbm9kZSByZWdpb24gaXMgbG9uZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFJldHVybnMgbnVsbCBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbjEKLQkgKiBAcGFyYW0gcmVnaW9uMgotCSAqIEBwYXJhbSBzTW9kZWwKLQkgKiBAcGFyYW0gcmVnaW9uMU5vZGVTdGFydAotCSAqIEBwYXJhbSByZWdpb24yTm9kZVN0YXJ0Ci0JICogQHJldHVybiBvdXRlciBkaXJ0eSByZWdpb24gb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwcml2YXRlIERpcnR5UmVnaW9uIF9nZXRPdXRlclJlZ2lvbihEaXJ0eVJlZ2lvbiByZWdpb24xLCBEaXJ0eVJlZ2lvbiByZWdpb24yLCBJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCwgaW50IHJlZ2lvbjFOb2RlU3RhcnQsIGludCByZWdpb24yTm9kZVN0YXJ0KSB7Ci0JCURpcnR5UmVnaW9uIG91dGVyID0gbnVsbDsKLQkJaW50IHJlZ2lvbjFOb2RlRW5kID0gLTE7Ci0JCWludCByZWdpb24yTm9kZUVuZCA9IC0xOwotCQkvLyB0aGVuIGNoZWNrIGlmIHJlZ2lvbjEncyBlbmQgYXBwZWFycyBhZnRlcgotCQkvLyByZWdpb24yJ3MgZW5kCi0JCUluZGV4ZWRSZWdpb24gcmVnaW9uMUVuZE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb24xLmdldE9mZnNldCgpICsgcmVnaW9uMS5nZXRMZW5ndGgoKSk7Ci0JCWlmIChyZWdpb24xRW5kTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBpZiBubyBlbmQsIGp1c3QgYXNzdW1lIHJlZ2lvbiBzcGFucyBhbGwgdGhlCi0JCQkvLyB3YXkgdG8gdGhlIGVuZCBzbyBpdCBpbmNsdWRlcyBvdGhlciByZWdpb24KLQkJCW91dGVyID0gcmVnaW9uMTsKLQkJfQotCQllbHNlIHsKLQkJCXJlZ2lvbjFOb2RlRW5kID0gcmVnaW9uMUVuZE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlJbmRleGVkUmVnaW9uIHJlZ2lvbjJFbmROb2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocmVnaW9uMi5nZXRPZmZzZXQoKSArIHJlZ2lvbjIuZ2V0TGVuZ3RoKCkpOwotCQkJcmVnaW9uMk5vZGVFbmQgPSByZWdpb24yRW5kTm9kZSAhPSBudWxsID8gcmVnaW9uMkVuZE5vZGUuZ2V0RW5kT2Zmc2V0KCkgOiBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJaWYgKHJlZ2lvbjFOb2RlRW5kID49IHJlZ2lvbjJOb2RlRW5kKSB7Ci0JCQkJLy8gcm9vdCBjb250YWlucyBvciBpcyBlcXVhbCB0byBwb3NzaWJsZQotCQkJCW91dGVyID0gcmVnaW9uMTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbjFOb2RlU3RhcnQgPT0gcmVnaW9uMk5vZGVTdGFydCAmJiByZWdpb24yTm9kZUVuZCA+PSByZWdpb24xTm9kZUVuZCkgewotCQkJCS8vIHBvc3NpYmxlIGNvbnRhaW5zIHJvb3QgYmVjYXVzZSB0aGV5Ci0JCQkJLy8gYm90aCBzdGFydCBhdCBzYW1lIHBsYWNlIGJ1dCBwb3NzaWJsZQotCQkJCS8vIGlzIGxvbmdlcgotCQkJCW91dGVyID0gcmVnaW9uMjsKLQkJCX0KLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCWlmIChvdXRlciAhPSBudWxsKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgaWYgWyIgKyByZWdpb24xTm9kZVN0YXJ0ICsgIjoiICsgcmVnaW9uMU5vZGVFbmQgKyAiXSBjb250YWlucyBbIiArIHJlZ2lvbjJOb2RlU3RhcnQgKyAiOiIgKyByZWdpb24yTm9kZUVuZCArICJdIC4uLiAiICsgb3V0ZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgaWYgWyIgKyByZWdpb24xTm9kZVN0YXJ0ICsgIjoiICsgcmVnaW9uMU5vZGVFbmQgKyAiXSBjb250YWlucyBbIiArIHJlZ2lvbjJOb2RlU3RhcnQgKyAiOiIgKyByZWdpb24yTm9kZUVuZCArICJdIC4uLiBOTyBDT05UQUlOIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci0JCXJldHVybiBvdXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhbHJlYWR5IGtub3cgY29udGVudCB0eXBlIGZyb20gd2hlbiB3ZSBjcmVhdGVkIHRoZSBtb2RlbCwgc28ganVzdAotCSAqIHVzZSB0aGF0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvYykgewotCi0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJY29udGVudFR5cGVJZCA9IHNNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBSZW1lbWJlciB0byByZWxlYXNlIG1vZGVsIGFmdGVyIHVzZSEhCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRTdHJ1Y3R1cmVkTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2MpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQlpZiAoZG9jICE9IG51bGwpCi0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCXJldHVybiBzTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhvb2tVcE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihmTGlmZUN5Y2xlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoRGlydHlSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyB1c2Ugc3RydWN0dXJlZCBtb2RlbCB0byBkZXRlcm1pbmUgYXJlYSB0byBwcm9jZXNzCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCWludCBzdGFydCA9IGRpcnR5UmVnaW9uLmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBzdGFydCArIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCUluZGV4ZWRSZWdpb24gaXJTdGFydCA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0KTsKLQkJCQlJbmRleGVkUmVnaW9uIGlyRW5kID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oZW5kKTsKLQotCQkJCWlmIChpclN0YXJ0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgaXJTdGFydC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQkJaWYgKGlyRW5kICE9IG51bGwpIHsKLQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCBpckVuZC5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJCXN1cGVyLnByb2Nlc3MoY3JlYXRlRGlydHlSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0LCBEaXJ0eVJlZ2lvbi5JTlNFUlQpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWluaXRpYWxpemVzIGxpc3RlbmVycyBhbmQgc2V0cyBuZXcgZG9jdW1lbnQgb25hbGwgc3RyYXRlZ2llcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5BYnN0cmFjdFJlY29uY2lsZXIjcmVjb25jaWxlckRvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjb25jaWxlckRvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQotCQlJRG9jdW1lbnQgY3VycmVudERvYyA9IGdldERvY3VtZW50KCk7Ci0KLQkJLy8gdW5ob29rIG9sZCBsaWZlY3ljbGUgbGlzdG5lcgotCQl1bmhvb2tNb2RlbExpZmVjeWNsZUxpc3RlbmVyKGN1cnJlbnREb2MpOwotCQkvLyBhZGQgbmV3IGxpZmVjeWNsZSBsaXN0ZW5lcgotCQlpZiAobmV3RG9jdW1lbnQgIT0gbnVsbCkKLQkJCWhvb2tVcE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIobmV3RG9jdW1lbnQpOwotCi0JCXN1cGVyLnJlY29uY2lsZXJEb2N1bWVudENoYW5nZWQobmV3RG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmhvb2tNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKGZMaWZlQ3ljbGVMaXN0ZW5lcik7Ci0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0KLQkJLy8gcmVtb3ZlcyBtb2RlbCBsaXN0ZW5lcnMKLQkJdW5ob29rTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihnZXREb2N1bWVudCgpKTsKLQkJc3VwZXIudW5pbnN0YWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWVmZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiBVc2VzIElTdHJ1Y3R1cmVkTW9kZWwgbm9kZXMgdG8gY2hlY2sgIm92ZXJsYXBzKCkiIHdoZW4gZ2V0dGluZyBhbm5vdGF0aW9ucyB0byByZW1vdmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSB7Ci0JCi0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXN1cGVyKHNvdXJjZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgcG9zaXRpb24gb3ZlcmxhcHMgYW55IG9mIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVnaW9ucycKLQkgKiBjb3JyZXN0cG9uZGluZyBJbmRleGVkUmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3MKLQkgKiBAcGFyYW0gZHIKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvc2l0aW9uIG92ZXJsYXBzIGFueSBvZiB0aGUgcmVnaW9ucywgb3RoZXJ3aXNlCi0JICogICAgICAgICBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVybGFwcyhQb3NpdGlvbiBwb3MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBzZFJlZ2lvbnMpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBlbmQgPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZFJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJICAgIGlmKCFzZFJlZ2lvbnNbaV0uaXNEZWxldGVkKCkpIHsKLSAgICAJCQlJbmRleGVkUmVnaW9uIGNvcnJlc3BvbmRpbmcgPSBnZXRDb3JyZXNwb25kaW5nTm9kZShzZFJlZ2lvbnNbaV0pOwotICAgICAgICAgICAgICAgIGlmKGNvcnJlc3BvbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAJCQlpZiAoc3RhcnQgPT0gLTEgfHwgc3RhcnQgPiBjb3JyZXNwb25kaW5nLmdldFN0YXJ0T2Zmc2V0KCkpCi0gICAgICAgIAkJCQlzdGFydCA9IGNvcnJlc3BvbmRpbmcuZ2V0U3RhcnRPZmZzZXQoKTsKLSAgICAgICAgCQkJaWYgKGVuZCA9PSAtMSB8fCBlbmQgPCBjb3JyZXNwb25kaW5nLmdldEVuZE9mZnNldCgpKQotICAgICAgICAJCQkJZW5kID0gY29ycmVzcG9uZGluZy5nZXRFbmRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCX0KLQkJcmV0dXJuIHBvcy5vdmVybGFwc1dpdGgoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgZm9yIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JICogCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBub2RlIGZvciBzZFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldENvcnJlc3BvbmRpbmdOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotICAgICAgICBJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKSAKLSAgICAgICAgICAgICAgICBpbmRleGVkUmVnaW9uID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnQoKSk7ICAgIAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9UZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTA1YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9UZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkFjY2Vzc0V4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvblByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JbWFnZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFubm90YXRpb25QcmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2VMb29rdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIElUZW1wb3JhcnlBbm5vdGF0aW9uIEAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wb3JhcnlBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiBpbXBsZW1lbnRzIElUZW1wb3JhcnlBbm5vdGF0aW9uLCBJUmVjb25jaWxlUmVzdWx0LCBJQW5ub3RhdGlvblByZXNlbnRhdGlvbiB7Ci0JLy8gcmVtZW1iZXIgdG8gY2hhbmdlIHRoZXNlIGlmIGl0IGNoYW5nZXMgaW4gdGhlIGV4dGVuc2lvbiBwb2ludAotCS8vIG1heSBuZWVkIGEgZGlmZmVyZW50IGhvbWUgZm9yIHRoZW0gaW4gdGhlIGZ1dHVyZSwgYnV0IHRoZXkncmUgaGVyZSBmb3IKLQkvLyBub3cKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVF9FUlJPUiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RfSU5GTyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHBhX1RPRE8gd2hhdCBzaG91bGQgdGhlIElEIGJlIGZvciB0aGlzPwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UX1VOS05PV04gPSBBbm5vdGF0aW9uLlRZUEVfVU5LTk9XTjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVF9XQVJOSU5HID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC53YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gY29waWVkIGZyb20gQ29tcGlsYXRpb25Vbml0RG9jdW1lbnRQcm92aWRlci5Qcm9ibGVtQW5ub3RhdGlvbgotICAgIC8vWFhYOiBUbyBiZSBmdWxseSBjb3JyZWN0IHRoZXNlIGNvbnN0YW50cyBzaG91bGQgYmUgbm9uLXN0YXRpYwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElORk9fTEFZRVI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19MQVlFUjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUl9MQVlFUjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwIGxvb2t1cD0gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCk7Ci0gICAgICAgIElORk9fTEFZRVI9IGNvbXB1dGVMYXllcigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmluZm8iLCBsb29rdXApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFdBUk5JTkdfTEFZRVI9IGNvbXB1dGVMYXllcigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciLCBsb29rdXApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEVSUk9SX0xBWUVSPSBjb21wdXRlTGF5ZXIoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5lcnJvciIsIGxvb2t1cCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVMYXllcihTdHJpbmcgYW5ub3RhdGlvblR5cGUsIEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwIGxvb2t1cCkgewotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb249IG5ldyBBbm5vdGF0aW9uKGFubm90YXRpb25UeXBlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIEFubm90YXRpb25QcmVmZXJlbmNlIHByZWZlcmVuY2U9IGxvb2t1cC5nZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShhbm5vdGF0aW9uKTsKLSAgICAgICAgaWYgKHByZWZlcmVuY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwcmVmZXJlbmNlLmdldFByZXNlbnRhdGlvbkxheWVyKCkgKyAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gSUFubm90YXRpb25BY2Nlc3NFeHRlbnNpb24uREVGQVVMVF9MQVlFUiArIDE7Ci0gICAgfQotICAgIAotICAgIAotCXByaXZhdGUgT2JqZWN0IGZBZGRpdGlvbmFsRml4SW5mbyA9IG51bGw7Ci0KLQlwcml2YXRlIE9iamVjdCBmS2V5ID0gbnVsbDsKLQlwcml2YXRlIFBvc2l0aW9uIGZQb3NpdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBmUHJvYmxlbUlEOwotCi0gICAgcHJpdmF0ZSBpbnQgZkxheWVyID0gREVGQVVMVF9MQVlFUjsKLSAgICAKLSAgICBwcml2YXRlIEltYWdlIGZJbWFnZSA9IG51bGw7Ci0KLQlwdWJsaWMgVGVtcG9yYXJ5QW5ub3RhdGlvbihQb3NpdGlvbiBwLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG1lc3NhZ2UsIFJlY29uY2lsZUFubm90YXRpb25LZXkga2V5KSB7Ci0JCXN1cGVyKCk7Ci0JCWZQb3NpdGlvbiA9IHA7Ci0JCXNldFR5cGUodHlwZSk7Ci0JCWZLZXkgPSBrZXk7Ci0JCXNldFRleHQobWVzc2FnZSk7Ci0gICAgICAgIGluaXRMYXllcigpOwotICAgICAgICBpbml0SW1hZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGVtcG9yYXJ5QW5ub3RhdGlvbihQb3NpdGlvbiBwLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG1lc3NhZ2UsIFJlY29uY2lsZUFubm90YXRpb25LZXkga2V5LCBpbnQgcHJvYmxlbUlkKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQb3NpdGlvbiA9IHA7Ci0JCWZLZXkgPSBrZXk7Ci0JCXNldFR5cGUodHlwZSk7Ci0JCXNldFRleHQobWVzc2FnZSk7Ci0JCWZQcm9ibGVtSUQgPSBwcm9ibGVtSWQ7Ci0gICAgICAgIGluaXRMYXllcigpOwotICAgICAgICBpbml0SW1hZ2UoKTsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdExheWVyKCkgewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBnZXRUeXBlKCk7Ci0gICAgICAgIGlmKHR5cGUuZXF1YWxzKEFOTk9UX0VSUk9SKSkgewotICAgICAgICAgICAgZkxheWVyID0gRVJST1JfTEFZRVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih0eXBlLmVxdWFscyhBTk5PVF9XQVJOSU5HKSkgewotICAgICAgICAgICAgZkxheWVyID0gV0FSTklOR19MQVlFUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHR5cGUuZXF1YWxzKEFOTk9UX0lORk8pKSB7Ci0gICAgICAgICAgICBmTGF5ZXIgPSBJTkZPX0xBWUVSOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0SW1hZ2UoKSB7Ci0gICAgICAgIC8vIGxhdGVyIHdlIGNhbiBhZGQgc3VwcG9ydCBmb3IgcXVpY2sgZml4IGltYWdlcy4KLSAgICAgICAgU3RyaW5nIHR5cGUgPSBnZXRUeXBlKCk7Ci0gICAgICAgIGlmKHR5cGUuZXF1YWxzKEFOTk9UX0VSUk9SKSkgewotICAgICAgICAgICAgZkltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHR5cGUuZXF1YWxzKEFOTk9UX1dBUk5JTkcpKSB7Ci0gICAgICAgICAgICBmSW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYodHlwZS5lcXVhbHMoQU5OT1RfSU5GTykpIHsKLSAgICAgICAgICAgIGZJbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJLy8gdGhpcyBjaGVjayBkb2Vzbid0IHRha2UgaW50byBjb25zaWRlcmF0aW9uIHRoYXQgYW5ub3RhdGlvbgotCQkvLyBwb3NpdGlvbnMgdGhhdCBjaGFuZ2UgZnJvbSBhIHRleHQgZWRpdCBiZWZvcmUgaXQKLQkJLy8gd2Ugc2hvdWxkIGJlIGNoZWNraW5nIGlmIHRoZSBhbm5vdGF0aW9uIGlzIHN0aWxsIG9uIHRoZSBzYW1lIGxpbmUsCi0JCS8vIGFuZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgaXMgdGhlIHNhbWUKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQotCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0YSA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBvYmo7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gc2FtZVBvc2l0aW9uID0gdGEuZ2V0UG9zaXRpb24oKS5lcXVhbHModGhpcy5nZXRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc2FtZVRleHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYodGEuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGhpcy5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0YS5nZXRUZXh0KCkuZXF1YWxzKHRoaXMuZ2V0VGV4dCgpKSkKLSAgICAgICAgICAgICAgICBzYW1lVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmKHRhLmdldFRleHQoICk9PSBudWxsICYmIHRoaXMuZ2V0VGV4dCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgc2FtZVRleHQgPSB0cnVlOwotICAgICAgICAgICAgCi0JCQlyZXR1cm4gIHNhbWVUZXh0ICYmIHNhbWVQb3NpdGlvbjsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JfQotCi0JLyoqCi0JICogQWRkaXRpb25hbCBpbmZvIHJlcXVpcmVkIHRvIGZpeCB0aGlzIHByb2JsZW0uCi0JICogCi0JICogQHJldHVybiBhbiBPYmplY3QgdGhhdCBjb250YWlucyBhZGRpdGlvbmFsIGluZm8gb24gaG93IHRvIGZpeCB0aGlzCi0JICogICAgICAgICBwcm9ibGVtLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGl0aW9uYWxGaXhJbmZvKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uYWxGaXhJbmZvOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JVGVtcG9yYXJ5QW5ub3RhdGlvbiNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJcmV0dXJuIGZLZXk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZlBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvYmxlbUlELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJvYmxlbUlEKCkgewotCQlyZXR1cm4gZlByb2JsZW1JRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb24jaXNQZXJzaXN0ZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdXNlZnVsIHRvIGZpeGluZyB0aGlzIHByb2JsZW0uCi0JICogCi0JICogQHBhcmFtIGFuCi0JICogICAgICAgICAgICBPYmplY3QgdGhhdCBjb250YWlucyBhZGRpdGlvbmFsIGluZm8gb24gaG93IHRvIGZpeCB0aGlzCi0JICogICAgICAgICAgICBwcm9ibGVtCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEZpeEluZm8oT2JqZWN0IGluZm8pIHsKLQkJZkFkZGl0aW9uYWxGaXhJbmZvID0gaW5mbzsKLQl9Ci0KLSAgICBwdWJsaWMgaW50IGdldExheWVyKCkgewotICAgICAgICByZXR1cm4gZkxheWVyOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgQW5ub3RhdGlvbiNwYWludAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBDYW52YXMgY2FudmFzLCBSZWN0YW5nbGUgcikgewotICAgICAgICAvL2luaXRpYWxpemVJbWFnZXMoKTsKLSAgICAgICAgaWYgKGZJbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgSW1hZ2VVdGlsaXRpZXMuZHJhd0ltYWdlKGZJbWFnZSwgZ2MsIGNhbnZhcywgciwgU1dULkNFTlRFUiwgU1dULlRPUCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiIiArIGZQb3NpdGlvbi5nZXRPZmZzZXQoKSArICc6JyArIGZQb3NpdGlvbi5nZXRMZW5ndGgoKSArICI6ICIgKyBnZXRUZXh0KCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0Fubm90YXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9Bbm5vdGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk0MjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0Fubm90YXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogSG9sZHMgaW5mbyB0byBjcmVhdGUgYSBUZW1wb3JhcnlBbm5vdGF0aW9uLgotICoKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25JbmZvIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19QUk9CTEVNX0lEID0gLTE7Ci0JcHJpdmF0ZQlJTWVzc2FnZSBmTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgZkFkZGl0aW9uYWxGaXhJbmZvID0gbnVsbDsKLQlwcml2YXRlIGludCBmUHJvYmxlbUlkID0gTk9fUFJPQkxFTV9JRDsKLQkKLQlwdWJsaWMgQW5ub3RhdGlvbkluZm8oSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlmTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCQotCX0KLQlwdWJsaWMgQW5ub3RhdGlvbkluZm8oSU1lc3NhZ2UgbWVzc2FnZSwgaW50IHByb2JsZW1JZCwgT2JqZWN0IGFkZGl0aW9uYWxGaXhJbmZvKSB7Ci0JCXRoaXMobWVzc2FnZSk7Ci0JCWZQcm9ibGVtSWQgPSBwcm9ibGVtSWQ7Ci0JCWZBZGRpdGlvbmFsRml4SW5mbyA9IGFkZGl0aW9uYWxGaXhJbmZvOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSU1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZNZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldEFkZGl0aW9uYWxGaXhJbmZvKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uYWxGaXhJbmZvOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldFByb2JsZW1JZCgpIHsKLQkJcmV0dXJuIGZQcm9ibGVtSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSVNvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSVNvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTA5OTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0lTb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBhbGxvdyBmb3IgInBhcnRpYWwgZG9jdW1lbnQiIGFzIHlvdSB0eXBlIHZhbGlkYXRpb24uCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VWYWxpZGF0b3IgewotCQotCS8qKgotCSAqIEFzIHlvdSB0eXBlIHZhbGlkYXRpb24gaXMgZ2V0dGluZyAiaG9va2VkIHVwIiB0byB0aGlzIElEb2N1bWVudC4KLQkgKiBUaGlzIGlzIHRoZSBpbnN0YW5jZSBvZiBJRG9jdW1lbnQgdGhhdCB0aGUgdmFsaWRhdG9yIHNob3VsZAotCSAqIG9wZXJhdGUgb24gZm9yIGVhY2ggdmFsaWRhdGUgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQl2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KTsKLQkKLQkvKioKLQkgKiBUaGUgc2FtZSBJRG9jdW1lbnQgcGFzc2VkIGluIGZyb20gdGhlIGNvbm5lY3QoKSBtZXRob2QuCi0JICogVGhpcyBpbmRpY2F0ZXMgdGhhdCBhcyB5b3UgdHlwZSB2YWxpZGF0aW9uIGlzICJzaHV0dGluZyBkb3duIgotCSAqIGZvciB0aGlzIElEb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQl2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KTsKLQkKLQkvKioKLQkgKiBMaWtlIElWYWxpZGF0b3IjdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotCSAqIGV4Y2VwdCBwYXNzZXMgdGhlIGRpcnR5IHJlZ2lvbiwgc28gZG9jdW1lbnQgdmFsaWRhdGlvbiBjYW4gYmUgYmV0dGVyCi0JICogb3B0aW1pemVkLgotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQl2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzY2UzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSW5jcmVtZW50YWxIZWxwZXIgaW1wbGVtZW50cyBJVmFsaWRhdGlvbkNvbnRleHQgewotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0KLQlwcml2YXRlIFN0cmluZyBmVVJJID0gbnVsbDsKLQkKLQlwdWJsaWMgSW5jcmVtZW50YWxIZWxwZXIoSURvY3VtZW50IHNvdXJjZURvY3VtZW50LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBPYmplY3RbXSBwYXJtcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQl2b2lkIHNldFVSSShTdHJpbmcgdXJpKSB7Ci0JCWZVUkkgPSB1cmk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRVUklzKCkgewotCQlpZihmVVJJICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde2ZVUkl9OwotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2N2RhZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotCi0vKioKLSAqIFJpZ2h0IG5vdyB3ZSdsbCBvbmx5IHVzZSBvbmUgcmVwb3J0ZXIgcGVyIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIEluY3JlbWVudGFsUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yOwotCXByaXZhdGUgSGFzaE1hcCBtZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgSW5jcmVtZW50YWxSZXBvcnRlcihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlzdXBlcigpOwotCQlmUHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJYWRkQW5ub3RhdGlvbkluZm8odmFsaWRhdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRBbm5vdGF0aW9uSW5mbyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgQW5ub3RhdGlvbkluZm8gaW5mbykgewotCQlPYmplY3QgZXhpc3RpbmdWYWx1ZSA9IG1lc3NhZ2VzLmdldCh2YWxpZGF0b3IpOwotCQlpZiAoZXhpc3RpbmdWYWx1ZSAhPSBudWxsKSB7Ci0JCQkoKEhhc2hTZXQpIGV4aXN0aW5nVmFsdWUpLmFkZChpbmZvKTsKLQkJfQotCQllbHNlIHsKLQkJCUhhc2hTZXQgbmV3VmFsdWUgPSBuZXcgSGFzaFNldCgxKTsKLQkJCW5ld1ZhbHVlLmFkZChpbmZvKTsKLQkJCW1lc3NhZ2VzLnB1dCh2YWxpZGF0b3IsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAobWVzc2FnZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJZlByb2dyZXNzTW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UuZ2V0VGV4dCh2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIG1lc3NhZ2VzIGlzIGEgbGlzdCBvZjoKLQkJLy8gdmFsaWRhdG9ycyA9PiBIYXNoU2V0KEFubm90YXRpb25JbmZvMSwgQW5ub3RhdGlvbkluZm8yLCAuLi4pCi0JCS8vIChvbmUgSGFzaFNldCBwZXIgdmFsaWRhdG9yLi4uKQotCQlPYmplY3RbXSBsaXN0cyA9IG1lc3NhZ2VzLnZhbHVlcygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0cy5sZW5ndGg7IGkrKykgewotCQkJSXRlcmF0b3IgaXQgPSAoKEhhc2hTZXQpbGlzdHNbaV0pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IChBbm5vdGF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJCXJlc3VsdC5hZGQoaW5mby5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uSW5mb1tdIGdldEFubm90YXRpb25JbmZvKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gaW5mb3MgPSBtZXNzYWdlcy52YWx1ZXMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoKEhhc2hTZXQpaW5mb3NbaV0pOwotCQl9Ci0JCXJldHVybiAoQW5ub3RhdGlvbkluZm9bXSlyZXN1bHQudG9BcnJheShuZXcgQW5ub3RhdGlvbkluZm9bcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQlpZiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJT2JqZWN0IG8gPSBtZXNzYWdlcy5nZXQodmFsaWRhdG9yKTsKLQkJaWYobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBIYXNoU2V0KSB7Ci0JCQkoKEhhc2hTZXQpbykuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JfQotCi0JLy8gZ3JvdXAgbmFtZXMgYXJlIHVuc3VwcG9ydGVkCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlyZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1JlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1JlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2ZDMyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9SZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxhYmxlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlJlY29uY2lsZUFubm90YXRpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotCi0vKioKLSAqIEEgcmVjb25jaWxlIHN0ZXAgZm9yIGFuIElWYWxpZGF0b3IgZm9yIHJlY29uY2lsZS4gVXNlZCB0aGUgcmVjb25jaWxlCi0gKiBmcmFtZXdvcmsgdG8gY3JlYXRlIFRlbXBvcmFyeUFubm90YXRpb25zIGZyb20gdGhlIHZhbGlkYXRvciBtZXNzYWdlcy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFJlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCB7Ci0KLQkvKiogZGVidWcgZmxhZyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgZmluYWwgSVJlY29uY2lsZVJlc3VsdFtdIEVNUFRZX1JFQ09OQ0lMRV9SRVNVTFRfU0VUID0gbmV3IElSZWNvbmNpbGVSZXN1bHRbMF07Ci0JcHJpdmF0ZSBJbmNyZW1lbnRhbEhlbHBlciBmSGVscGVyID0gbnVsbDsKLQlwcml2YXRlIEluY3JlbWVudGFsUmVwb3J0ZXIgZlJlcG9ydGVyID0gbnVsbDsKLQlwcml2YXRlIGludCBmU2NvcGUgPSAtMTsKLQlwcml2YXRlIElWYWxpZGF0b3IgZlZhbGlkYXRvciA9IG51bGw7Ci0KLQotCXB1YmxpYyBSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yKElWYWxpZGF0b3IgdiwgaW50IHNjb3BlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHYgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbGlkYXRvciBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlZhbGlkYXRvciA9IHY7Ci0JCWZTY29wZSA9IHNjb3BlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgbWFwIG9mIElWYWxpZGF0b3JGb3JSZWNvbmNpbGUgdG8gTGlzdCB0byBhbm5vdGF0aW9ucyBiYXNlZAotCSAqIG9uIHRob3NlIG1lc3NhZ2VzCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VzCi0JICogQHJldHVybgotCSAqLwotLy8JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSBjcmVhdGVBbm5vdGF0aW9ucyhMaXN0IG1lc3NhZ2VMaXN0KSB7Ci0vLwkJTGlzdCBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0vLwkJCUlNZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gKElNZXNzYWdlKSBtZXNzYWdlTGlzdC5nZXQoaSk7Ci0vLwotLy8JCQlpbnQgb2Zmc2V0ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0T2Zmc2V0KCk7Ci0vLwotLy8JCQlpZiAob2Zmc2V0IDwgMCkKLS8vCQkJCWNvbnRpbnVlOwotLy8KLS8vCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gbnVsbDsKLS8vCQkJdHJ5IHsKLS8vCQkJCW1lc3NhZ2VUZXh0ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VGV4dCh2YWxpZGF0aW9uTWVzc2FnZS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotLy8JCQl9Ci0vLwkJCWNhdGNoIChFeGNlcHRpb24gdCkgewotLy8JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIHJlcG9ydGluZyBtZXNzYWdlIGZyb20gdmFsaWRhdG9yIiwgdCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWNvbnRpbnVlOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlTdHJpbmcgdHlwZSA9IGdldFNldmVyaXR5KHZhbGlkYXRpb25NZXNzYWdlKTsKLS8vCQkJLy8gdGhpcyBwb3NpdGlvbiBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlIHBvc3NpYmx5IGJlIHRoZSB3cm9uZwotLy8JCQkvLyBsZW5ndGgKLS8vCQkJaW50IGxlbmd0aCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldExlbmd0aCgpOwotLy8JCQlpZiAobGVuZ3RoID49IDApIHsKLS8vCQkJCVBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpOwotLy8JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSBjcmVhdGVLZXkoZ2V0UGFydGl0aW9uVHlwZShnZXREb2N1bWVudCgpLCBvZmZzZXQpLCBnZXRTY29wZSgpKTsKLS8vCQkJCWFubm90YXRpb25zLmFkZChuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbihwLCB0eXBlLCBtZXNzYWdlVGV4dCwga2V5KSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiAoSVJlY29uY2lsZVJlc3VsdFtdKSBhbm5vdGF0aW9ucy50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2Fubm90YXRpb25zLnNpemUoKV0pOwotLy8JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBtYXAgb2YgSVZhbGlkYXRvckZvclJlY29uY2lsZSB0byBMaXN0IHRvIGFubm90YXRpb25zIGJhc2VkCi0JICogb24gdGhvc2UgbWVzc2FnZXMKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSBjcmVhdGVBbm5vdGF0aW9ucyhBbm5vdGF0aW9uSW5mb1tdIGluZm9zKSB7Ci0JCQotCQotCQlMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkKLQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBpbmZvc1tpXTsKLQkJCQotCQkJSU1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSBpbmZvLmdldE1lc3NhZ2UoKTsKLQkJCWludCBvZmZzZXQgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRPZmZzZXQoKTsKLQkJCWlmIChvZmZzZXQgPCAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltZXNzYWdlVGV4dCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFRleHQodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiByZXBvcnRpbmcgbWVzc2FnZSBmcm9tIHZhbGlkYXRvciIsIHQpOyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFNldmVyaXR5KHZhbGlkYXRpb25NZXNzYWdlKTsKLQkJCS8vIHRoaXMgcG9zaXRpb24gc2VlbXMgbGlrZSBpdCB3b3VsZCBiZSBwb3NzaWJseSBiZSB0aGUgd3JvbmcKLQkJCS8vIGxlbmd0aAotCQkJaW50IGxlbmd0aCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldExlbmd0aCgpOwotCQkJaWYgKGxlbmd0aCA+PSAwKSB7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkJCQlSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IGNyZWF0ZUtleShnZXRQYXJ0aXRpb25UeXBlKGdldERvY3VtZW50KCksIG9mZnNldCksIGdldFNjb3BlKCkpOwotCQkJCQotCQkJCWlmKGluZm8uZ2V0UHJvYmxlbUlkKCkgPT0gQW5ub3RhdGlvbkluZm8uTk9fUFJPQkxFTV9JRCkgewotCQkJCQkvLyBjcmVhdGUgYW4gYW5ub3RhdGlvbiB3LyBubyBmaXggaW5mbwotCQkJCQlhbm5vdGF0aW9ucy5hZGQobmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwgdHlwZSwgbWVzc2FnZVRleHQsIGtleSkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gY3JlYXRlIGFuIGFubm90YXRpb24gdy8gcHJvYmxlbSBJRCBhbmQgZml4IGluZm8KLQkJCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwgdHlwZSwgbWVzc2FnZVRleHQsIGtleSwgaW5mby5nZXRQcm9ibGVtSWQoKSk7Ci0JCQkJCWFubm90YXRpb24uc2V0QWRkaXRpb25hbEZpeEluZm8oaW5mby5nZXRBZGRpdGlvbmFsRml4SW5mbygpKTsKLQkJCQkJYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElSZWNvbmNpbGVSZXN1bHRbXSkgYW5ub3RhdGlvbnMudG9BcnJheShuZXcgSVJlY29uY2lsZVJlc3VsdFthbm5vdGF0aW9ucy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTZXZlcml0eShJTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSkgewotCQlTdHJpbmcgdHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfSU5GTzsKLQkJc3dpdGNoICh2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpKSB7Ci0JCQljYXNlIElNZXNzYWdlLkhJR0hfU0VWRVJJVFkgOgotCQkJCXR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkgOgotCQkJCXR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNZXNzYWdlLkxPV19TRVZFUklUWSA6Ci0JCQkJdHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1lc3NhZ2UuRVJST1JfQU5EX1dBUk5JTkcgOgotCQkJCXR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJLy8gVGhlIGJhc2VMb2NhdGlvbiBtYXkgYmUgYSBwYXRoIG9uIGRpc2sgb3IgcmVsYXRpdmUgdG8gdGhlCi0JCQkJLy8gd29ya3NwYWNlIHJvb3QuIERvbid0IHRyYW5zbGF0ZSBvbi1kaXNrIHBhdGhzIHRvCi0JCQkJLy8gaW4td29ya3NwYWNlIHJlc291cmNlcy4KLQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSAmJiAhYmFzZVBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIEluY3JlbWVudGFsSGVscGVyIGdldEhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChmSGVscGVyID09IG51bGwpCi0JCQlmSGVscGVyID0gbmV3IEluY3JlbWVudGFsSGVscGVyKGdldERvY3VtZW50KCksIHByb2plY3QpOwotCQlyZXR1cm4gZkhlbHBlcjsKLQl9Ci0KLQlwcml2YXRlIEluY3JlbWVudGFsUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoKSB7Ci0JCWlmIChmUmVwb3J0ZXIgPT0gbnVsbCkKLQkJCWZSZXBvcnRlciA9IG5ldyBJbmNyZW1lbnRhbFJlcG9ydGVyKGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcmV0dXJuIGZSZXBvcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHZhbGlkYXRvciBpcyBwYXJ0aWFsIG9yIHRvdGFsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBmU2NvcGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbFJlY29uY2lsZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlTW9kZWwoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4gcmVjb25jaWxpbmcgbW9kZWwgaW4gVkFMSURBVE9SIHN0ZXAgdy8gZGlydHkgcmVnaW9uOiBbIiArIGRpcnR5UmVnaW9uLmdldFRleHQoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCUlSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzID0gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQ7Ci0JCWlmIChkaXJ0eVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU291cmNlVmFsaWRhdG9yKSB7Ci0JCQkJCXJlc3VsdHMgPSB2YWxpZGF0ZShkaXJ0eVJlZ2lvbiwgc3ViUmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdHMgPSB2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFWEVQVElPTiBJTiBSRUNPTkNJTEUgU1RFUCBGT1IgVkFMSURBVE9SIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+IFZBTElEQVRPUiBzdGVwIGRvbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbGlkYXRvclN0ZXA6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmVmFsaWRhdG9yICE9IG51bGwpCi0JCQlkZWJ1Z1N0cmluZy5hcHBlbmQoZlZhbGlkYXRvci5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gZGVidWdTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSB2YWxpZGF0ZSgpIHsKLQkJSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMgPSBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVDsKLQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCi0JCXRyeSB7Ci0JCQlJbmNyZW1lbnRhbEhlbHBlciBoZWxwZXIgPSBnZXRIZWxwZXIoZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsKTsKLQkJCUluY3JlbWVudGFsUmVwb3J0ZXIgcmVwb3J0ZXIgPSBnZXRSZXBvcnRlcigpOwotCi0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCQloZWxwZXIuc2V0VVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCX0KLQotCQkJZlZhbGlkYXRvci52YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQotCQkJLy8gcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldE1lc3NhZ2VzKCkpOwotCQkJcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldEFubm90YXRpb25JbmZvKCkpOwotCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZlZhbGlkYXRvcik7Ci0JCQkKLQkJCWZWYWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnB1dE1vZGVsKElSZWNvbmNpbGFibGVNb2RlbCBpbnB1dE1vZGVsKSB7Ci0JCWlmKGlucHV0TW9kZWwgaW5zdGFuY2VvZiBEb2N1bWVudEFkYXB0ZXIpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9ICgoRG9jdW1lbnRBZGFwdGVyKWlucHV0TW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlpZihkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJaWYoZlZhbGlkYXRvciBpbnN0YW5jZW9mIElTb3VyY2VWYWxpZGF0b3IpIHsKLQkJCQkJLy8gbm90aWZ5IHRoYXQgZG9jdW1lbnQgY29ubmVjdGluZwotCQkJCQkoKElTb3VyY2VWYWxpZGF0b3IpZlZhbGlkYXRvcikuY29ubmVjdChkb2N1bWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLnNldElucHV0TW9kZWwoaW5wdXRNb2RlbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU291cmNlVmFsaWRhdG9yKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQkJaWYoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIG5vdGlmeSB0aGF0IGRvY3VtZW50IGRpc2Nvbm5lY3RpbmcKLQkJCQkoKElTb3VyY2VWYWxpZGF0b3IpZlZhbGlkYXRvcikuZGlzY29ubmVjdChkb2N1bWVudCk7Ci0JCQl9Ci0JCQlmVmFsaWRhdG9yLmNsZWFudXAoZ2V0UmVwb3J0ZXIoKSk7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIHZhbGlkYXRlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0cyA9IEVNUFRZX1JFQ09OQ0lMRV9SRVNVTFRfU0VUOwotCi0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0KLQkJdHJ5IHsKLQkJCUluY3JlbWVudGFsSGVscGVyIGhlbHBlciA9IGdldEhlbHBlcihmaWxlICE9IG51bGwgPyBmaWxlLmdldFByb2plY3QoKSA6IG51bGwpOwotCQkJLyoKLQkJCSAqIFNldHRpbmcgdGhlIFVSSSBpc24ndCBuZWNlc3NhcnkgZm9yIGFsbCBzb3VyY2UgdmFsaWRhdG9ycywgd2UKLQkJCSAqIGNhbiBzdGlsbCBjb250aW51ZSB3aXRob3V0IGl0Ci0JCQkgKi8KLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCWhlbHBlci5zZXRVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJfQotCi0JCQlpZiAoZlZhbGlkYXRvciBpbnN0YW5jZW9mIElTb3VyY2VWYWxpZGF0b3IpIHsKLQkJCQlJbmNyZW1lbnRhbFJlcG9ydGVyIHJlcG9ydGVyID0gZ2V0UmVwb3J0ZXIoKTsKLQkJCQkoKElTb3VyY2VWYWxpZGF0b3IpIGZWYWxpZGF0b3IpLnZhbGlkYXRlKGRpcnR5UmVnaW9uLCBoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCQkvLyBjYWxsIElWYWxpZGF0b3IuY2xlYW51cCgpIGR1cmluZyByZWxlYXNlKCkKLQkJCQkvLyByZXN1bHRzID0gY3JlYXRlQW5ub3RhdGlvbnMocmVwb3J0ZXIuZ2V0TWVzc2FnZXMoKSk7Ci0JCQkJcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldEFubm90YXRpb25JbmZvKCkpOwotCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGZWYWxpZGF0b3IpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTFmMDg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotCi0KLS8qKgotICogQmFzZWQgb2ZmIG9mIFRyYW5zZmVyQnVpbGRlci4gUmVhZHMgdGhlIGV4dGVuc2lvbiBwb2ludCBmb3IKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5zb3VyY2V2YWxpZGF0aW9uPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yQnVpbGRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLSAgICAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsaWRhdG9yTWV0YURhdGFbXSBFTVRQWV9WTURfQVJSQVkgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbMF07Ci0KLQkvLyBleHRlbnNpb24gcG9pbnQgSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTF9TT1VSQ0VfVkFMSURBVElPTiA9ICJzb3VyY2V2YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRFTlRfVFlQRV9JREVOVElGSUVSID0gImNvbnRlbnRUeXBlSWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFSVElUSU9OX1RZUEUgPSAicGFydGl0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19WQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VfRklMVEVSID0gInJlY29uY2lsZV92YWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRDVElEOwotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgZkN1cnJlbnRWTUQgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVm1kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENvbnRyaWJ1dGlvblRhZzsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldElEOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVU5LTk9XTiA9ICI/Pz8iOyAvLyROT04tTkxTLTEkCi0gICAgCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFydCBJRCBhdHRyaWJ1dGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKLQkgKiB0YXJnZXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldElEKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBVTktOT1dOOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogVU5LTk9XTjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqIEByZXR1cm4gVHJhbnNmZXJbXQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFZhbGlkYXRvck1ldGFEYXRhKFN0cmluZyBlZGl0b3JJZCkgewotCQlyZWFkQ29udHJpYnV0aW9ucyhlZGl0b3JJZCwgVEFHX1ZBTElEQVRPUiwgUExfU09VUkNFX1ZBTElEQVRJT04pOwotCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGZWbWRzLnRvQXJyYXkobmV3IFZhbGlkYXRvck1ldGFEYXRhW2ZWbWRzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9yU2NvcGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NDT1BFKTsKLQkJcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IFVOS05PV047IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgY29udHJpYnV0aW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgdGhlIHByb3ZpZGVkIHdvcmtiZW5jaAotCSAqIHBhcnQgYW5kIHRoZSBwcm92aWRlZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHRhZwotCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRDb250cmlidXRpb25zKFN0cmluZyBpZCwgU3RyaW5nIHRhZywgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRhcmdldElEID0gaWQ7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCS8vaWUuIHRhcmdldENvbnRyaWJ1dGlvblRhZyA9PSB2YWxpZGF0b3IKLQkJaWYgKHRhZy5lcXVhbHModGFyZ2V0Q29udHJpYnV0aW9uVGFnKSkgewotCQkJU3RyaW5nIHZJZCA9IGdldElEKGVsZW1lbnQpOwotCQkJU3RyaW5nIHZDbGFzcyA9IGdldFZhbGlkYXRvckNsYXNzKGVsZW1lbnQpOwotCQkJU3RyaW5nIHZTY29wZSA9IGdldFZhbGlkYXRvclNjb3BlKGVsZW1lbnQpOwotCi0JCQlpZiAodklkID09IG51bGwpIHsKLQkJCQkvLyBUaGlzIGlzIG5vdCBvZiBpbnRlcmVzdCB0byB1cyAtIGRvbid0IGdvIGRlZXBlcgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJLy8gc3RhcnQgYnVpbGRpbmcgYSBWTUQKLQkJCWZDdXJyZW50Vk1EID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhKGVsZW1lbnQsIHZJZCwgdkNsYXNzLCB2U2NvcGUpOwotCQkJZlZtZHMuYWRkKGZDdXJyZW50Vk1EKTsKLQotCQkJaWYgKExvZ2dlci5pc1RyYWNpbmcoVmFsaWRhdG9yQnVpbGRlci5UUkFDRV9GSUxURVIpKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQgcmVjb25jaWxlIHZhbGlkYXRvcjogIiArIHZJZCArICI6IiArIHZDbGFzcyArICI6IiArIHZTY29wZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0gZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfQ09OVEVOVF9UWVBFX0lERU5USUZJRVIpKSB7Ci0JCQkvLyBhZGQgdG8gY3VycmVudCBWTUQKLQkJCWZDdXJyZW50Q1RJRCA9IGdldElEKGVsZW1lbnQpOwotCQkJZkN1cnJlbnRWTUQuYWRkQ29udGVudFR5cGVJZChmQ3VycmVudENUSUQpOwotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1BBUlRJVElPTl9UWVBFKSkgewotCQkJLy8gYWRkIHRvIGN1cnJlbnQgVk1ECi0JCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IGdldElEKGVsZW1lbnQpOwotCQkJZkN1cnJlbnRWTUQuYWRkUGFyaXRpb25UeXBlKGZDdXJyZW50Q1RJRCwgcGFydGl0aW9uVHlwZSk7Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JNZXRhRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViYzg5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JNZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlJlY29uY2lsZUFubm90YXRpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBPYmplY3QgdGhhdCBob2xkcyBpbmZvcm1hdGlvbiByZWxldmFudCB0byB0aGUgY3JlYXRpb24gb2YgYSB2YWxpZGF0b3IgZm9yCi0gKiB0aGUgcmVjb25jaWxpbmcgZnJhbWV3b3JrLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGEgewotCXByaXZhdGUgU3RyaW5nIGZDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkNvbmZpZ3VyYXRpb25FbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmSWQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGZTY29wZTsKLQotCS8vIGEgaGFzaCBtYXAgb2YgY29udGVudCB0eXBlIElkcyAoU3RyaW5nKSB0aGF0IHBvaW50cyB0byBsaXN0cyBvZgotCS8vIHBhcnRpdGlvbiB0eXBlcyAoTGlzdCBvZiBTdHJpbmdzKQotCS8vIGNvbnRlbnRUeXBlSWQgLT4gTGlzdChwYXJpdGlvblR5cGUsIHBhcml0aW9uVHlwZSwgcGFydGl0aW9uVHlwZSwgLi4uKQotCS8vIGNvbnRlbnRUeXBlSWQyIC0+IExpc3QocGFydGl0aW9uVHlwZSwgcGFydGl0aW9uVHlwZSwgLi4uKQotCS8vIC4uLgotCXByaXZhdGUgSGFzaE1hcCBmTWF0cml4ID0gbnVsbDsKLQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZJZCwgU3RyaW5nIHZDbGFzcywgU3RyaW5nIHZTY29wZSkgewotCQlmSWQgPSB2SWQ7Ci0JCWZDbGFzcyA9IHZDbGFzczsKLQkJZkNvbmZpZ3VyYXRpb25FbGVtZW50ID0gZWxlbWVudDsKLQkJZlNjb3BlID0gdlNjb3BlOwotCQlmTWF0cml4ID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBUT0RPOiBUaGlzIGV4YWN0IG1ldGhvZCBpcyBhbHNvIGluIFZhbGlkYXRvclN0cmF0ZWd5LiBTaG91bGQgYmUgaW4gYSBjb21tb24gcGxhY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlSWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhTdHJpbmcgY29udGVudFR5cGVJZCkgewotCi0gICAgICAgIFNldCBwYXJlbnRUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIAotICAgICAgICBJQ29udGVudFR5cGVNYW5hZ2VyIGN0TWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOyAgICAKLSAgICAgICAgSUNvbnRlbnRUeXBlIGN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotICAgICAgICBTdHJpbmcgaWQgPSBjb250ZW50VHlwZUlkOwotCi0gICAgICAgIHdoaWxlKGN0ICE9IG51bGwgJiYgaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBwYXJlbnRUeXBlcy5hZGQoaWQpOwotICAgICAgICAgICAgY3QgPSBjdE1hbmFnZXIuZ2V0Q29udGVudFR5cGUoaWQpOwotICAgICAgICAgICAgaWYoY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElDb250ZW50VHlwZSBiYXNlVHlwZSA9IGN0LmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWQgPSAoYmFzZVR5cGUgIT0gbnVsbCkgPyBiYXNlVHlwZS5nZXRJZCgpIDogbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXBhcmVudFR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1twYXJlbnRUeXBlcy5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgYWRkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlpZiAoIWZNYXRyaXguY29udGFpbnNLZXkoY29udGVudFR5cGVJZCkpCi0JCQlmTWF0cml4LnB1dChjb250ZW50VHlwZUlkLCBuZXcgQXJyYXlMaXN0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhcml0aW9uVHlwZShTdHJpbmcgY29udGVudFR5cGVJZCwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJaWYgKCFmTWF0cml4LmNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlSWQpKQotCQkJZk1hdHJpeC5wdXQoY29udGVudFR5cGVJZCwgbmV3IEFycmF5TGlzdCgpKTsKLQotCQlMaXN0IHBhcnRpdGlvbkxpc3QgPSAoTGlzdCkgZk1hdHJpeC5nZXQoY29udGVudFR5cGVJZCk7Ci0JCXBhcnRpdGlvbkxpc3QuYWRkKHBhcnRpdGlvblR5cGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICAvLyBuZWVkIHRvIGl0ZXJhdGUgaGllcmFyY2h5Ci0gICAgICAgIFN0cmluZ1tdIGNvbnRlbnRIaWVyYXJjaHkgPSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhjb250ZW50VHlwZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudEhpZXJhcmNoeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYoZk1hdHJpeC5jb250YWluc0tleShjb250ZW50SGllcmFyY2h5W2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlUGFydGl0aW9uVHlwZShTdHJpbmcgY29udGVudFR5cGVJZHNbXSwgU3RyaW5nIHBhcml0aW9uVHlwZSkgewotICAgICAgICBmb3IoaW50IGk9MDsgaTxjb250ZW50VHlwZUlkcy5sZW5ndGg7IGkrKykgewotICAgIAkJaWYgKGZNYXRyaXguY29udGFpbnNLZXkoY29udGVudFR5cGVJZHNbaV0pKSB7Ci0gICAgCQkJTGlzdCBwYXJ0aXRpb25zID0gKExpc3QpIGZNYXRyaXguZ2V0KGNvbnRlbnRUeXBlSWRzW2ldKTsKLSAgICAJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcnRpdGlvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAJCQkJaWYgKHBhcml0aW9uVHlwZS5lcXVhbHMocGFydGl0aW9ucy5nZXQoaikpKQotICAgIAkJCQkJcmV0dXJuIHRydWU7Ci0gICAgCQkJfQotICAgIAkJfQotICAgICAgICB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJb2JqID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsICJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSB2YWxpZGF0b3IgaW5zdGFuY2UgYmFzZWQgb24gdGhpcyBWYWxpZGF0b3JNZXRhRGF0YSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCW9iaiA9IGNyZWF0ZUV4dGVuc2lvbigpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSVZhbGlkYXRvcikgPyAoSVZhbGlkYXRvcikgb2JqIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25FbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBmQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQl2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQkvKioKLQkgKiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMIG9yICBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgcHVibGljIGludCBnZXRWYWxpZGF0b3JTY29wZSgpIHsKLSAgICAgICAgcmV0dXJuIGZTY29wZS5lcXVhbHNJZ25vcmVDYXNlKCJ0b3RhbCIpID8gUmVjb25jaWxlQW5ub3RhdGlvbktleS5UT1RBTCA6IFJlY29uY2lsZUFubm90YXRpb25LZXkuUEFSVElBTDsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbGlkYXRvck1ldGFEYXRhOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmSWQgIT0gbnVsbCkKLQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiIFtpZDoiICsgZklkICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBkZWJ1Z1N0cmluZy50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZkZmI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBTcGVjaWFsIHZhbGlkYXRvciBzdHJhdGVneS4gUnVucyB2YWxpZGF0b3Igc3RlcHMgY29udHJpYnV0ZWQgdmlhIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLnNvdXJjZXZhbGlkYXRpb248L2NvZGU+IGV4dGVuc2lvbgotICogcG9pbnQKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQotCXByaXZhdGUgU3RyaW5nW10gZkNvbnRlbnRUeXBlSWRzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZk1ldGFEYXRhID0gbnVsbDsKLQkvKiogdmFsaWRhdG9yIGlkIChhcyBkZWNsYXJlZCBpbiBleHQgcG9pbnQpIC0+IFJlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IgKiAqLwotCXByaXZhdGUgSGFzaE1hcCBmVmlkVG9WU3RlcE1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9qZWN0Q29uZmlndXJhdGlvbiBmUHJvamVjdENvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0JLyoKLQkgKiBMaXN0IG9mIFZhbGlkYXRvck1ldGFEYXRhcyBvZiB0b3RhbCBzY29wZSB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIHJ1bgotCSAqIHNpbmNlIGJlZ2luUHJvY2Vzc2luZygpIHdhcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW47Ci0KLQlwdWJsaWMgVmFsaWRhdG9yU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlzdXBlcihzb3VyY2VWaWV3ZXIpOwotCQlmTWV0YURhdGEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDb250ZW50VHlwZUlkcyA9IGNhbGN1bGF0ZVBhcmVudENvbnRlbnRUeXBlSWRzKGNvbnRlbnRUeXBlKTsKLQkJZlZpZFRvVlN0ZXBNYXAgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvck1ldGFEYXRhKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlmTWV0YURhdGEuYWRkKHZtZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5Qcm9jZXNzaW5nKCkgewotCQlpZiAoZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1biA9PSBudWxsKQotCQkJZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1biA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIHBhc3NlZCBpbiBzaG91bGQgYmUgdGhlIG1vc3Qgc3BlY2lmaWMgb25lLiBUT0RPOiBUaGlzCi0JICogZXhhY3QgbWV0aG9kIGlzIGFsc28gaW4gVmFsaWRhdG9yTWV0YURhdGEuIFNob3VsZCBiZSBpbiBhIGNvbW1vbiBwbGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhTdHJpbmcgY29udGVudFR5cGVJZCkgewotCi0JCVNldCBwYXJlbnRUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjdE1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJSUNvbnRlbnRUeXBlIGN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlTdHJpbmcgaWQgPSBjb250ZW50VHlwZUlkOwotCi0JCXdoaWxlIChjdCAhPSBudWxsICYmIGlkICE9IG51bGwpIHsKLQotCQkJcGFyZW50VHlwZXMuYWRkKGlkKTsKLQkJCWN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGlkKTsKLQkJCWlmIChjdCAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGJhc2VUeXBlID0gY3QuZ2V0QmFzZVR5cGUoKTsKLQkJCQlpZCA9IChiYXNlVHlwZSAhPSBudWxsKSA/IGJhc2VUeXBlLmdldElkKCkgOiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHBhcmVudFR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1twYXJlbnRUeXBlcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5IYW5kbGVQYXJ0aXRpb24oU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWV0YURhdGEuc2l6ZSgpOyBpKyspIHsKLQkJCXZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgZk1ldGFEYXRhLmdldChpKTsKLQkJCWlmICh2bWQuY2FuSGFuZGxlUGFydGl0aW9uVHlwZShnZXRDb250ZW50VHlwZUlkcygpLCBwYXJ0aXRpb25UeXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApIHsKLQkJcmV0dXJuIGZWaWRUb1ZTdGVwTWFwLmNvbnRhaW5zVmFsdWUoc3RlcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSNjcmVhdGVSZWNvbmNpbGVTdGVwcygpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUmVjb25jaWxlU3RlcHMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcsIHN0ZXBzIGFyZSBjcmVhdGVkCi0JfQotCi0JcHVibGljIHZvaWQgZW5kUHJvY2Vzc2luZygpIHsKLQkJZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1bi5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEFsbCBjb250ZW50IHR5cGVzIG9uIHdoaWNoIHRoaXMgVmFsaWRhdG9yU3RyYXRlZ3kgY2FuIHJ1bgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVJZHMoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGVJZHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRyCi0JICogICAgICAgICAgICBQYXJ0aXRpb24gb2YgdGhlIHJlZ2lvbiB0byByZWNvbmNpbGUuCi0JICogQHBhcmFtIGRyCi0JICogICAgICAgICAgICBEaXJ0eSByZWdpb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGVkIHJlZ2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZShJVHlwZWRSZWdpb24gdHIsIERpcnR5UmVnaW9uIGRyKSB7Ci0KLQkJaWYgKGlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJLy8gZm9yIGV4dGVybmFsIGZpbGVzLCB0aGlzIGNhbiBiZSBudWxsCi0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IHRyLmdldFR5cGUoKTsKLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBudWxsOwotCQlMaXN0IGFubm90YXRpb25zVG9BZGQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgc3RlcHNSYW5PblRoaXNEaXJ0eVJlZ2lvbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCS8qCi0JCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIHJlbGV2YW50IHZhbGlkYXRvciBtZXRhIGRhdGEgdG8gZmluZAotCQkgKiBzdXBwb3J0aW5nIHZhbGlkYXRvcnMgZm9yIHRoaXMgcGFydGl0aW9uIHR5cGUuIERvbid0IGNoZWNrCi0JCSAqIHRoaXMuY2FuSGFuZGxlUGFydGl0aW9uKCkgYmVmb3JlLWhhbmQgc2luY2UgaXQganVzdCBsb29wcyB0aHJvdWdoCi0JCSAqIGFuZCBjYWxscyB2bWQuY2FuSGFuZGxlUGFydGl0aW9uVHlwZSgpLi4ud2hpY2ggd2UncmUgYWxyZWFkeSBkb2luZwotCQkgKiBoZXJlIGFueXdheSB0byBmaW5kIHRoZSByaWdodCB2bWQuCi0JCSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZNZXRhRGF0YS5zaXplKCkgJiYgIWlzQ2FuY2VsZWQoKTsgaSsrKSB7Ci0JCQl2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGZNZXRhRGF0YS5nZXQoaSk7Ci0JCQlpZiAodm1kLmNhbkhhbmRsZVBhcnRpdGlvblR5cGUoZ2V0Q29udGVudFR5cGVJZHMoKSwgcGFydGl0aW9uVHlwZSkpIHsKLQkJCQkvKgotCQkJCSAqIENoZWNrIGlmIHZhbGlkYXRvciBpcyBlbmFibGVkIGFjY29yZGluZyB0byB2YWxpZGF0aW9uCi0JCQkJICogcHJlZmVyZW5jZXMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY3JlYXRlL3VzZSBpdAotCQkJCSAqLwotCQkJCWlmIChpc1ZhbGlkYXRvckVuYWJsZWQodm1kKSkgewotCQkJCQlpbnQgdmFsaWRhdG9yU2NvcGUgPSB2bWQuZ2V0VmFsaWRhdG9yU2NvcGUoKTsKLQkJCQkJUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvciB2YWxpZGF0b3JTdGVwID0gbnVsbDsKLQkJCQkJLy8gZ2V0IHN0ZXAgZm9yIHBhcnRpdGlvbiB0eXBlCi0JCQkJCU9iamVjdCBvID0gZlZpZFRvVlN0ZXBNYXAuZ2V0KHZtZC5nZXRWYWxpZGF0b3JJZCgpKTsKLQkJCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yU3RlcCA9IChSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yKSBvOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaWYgZG9lc24ndCBleGlzdCwgY3JlYXRlIG9uZQotCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB2bWQuY3JlYXRlVmFsaWRhdG9yKCk7Ci0KLQkJCQkJCXZhbGlkYXRvclN0ZXAgPSBuZXcgUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvcih2YWxpZGF0b3IsIHZhbGlkYXRvclNjb3BlKTsKLQkJCQkJCXZhbGlkYXRvclN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvYykpOwotCi0JCQkJCQlmVmlkVG9WU3RlcE1hcC5wdXQodm1kLmdldFZhbGlkYXRvcklkKCksIHZhbGlkYXRvclN0ZXApOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFmVG90YWxTY29wZVZhbGlkYXRvcnNBbHJlYWR5UnVuLmNvbnRhaW5zKHZtZCkpIHsKLQkJCQkJCWFubm90YXRpb25zVG9BZGQuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsaWRhdG9yU3RlcC5yZWNvbmNpbGUoZHIsIGRyKSkpOwotCQkJCQkJc3RlcHNSYW5PblRoaXNEaXJ0eVJlZ2lvbi5hZGQodmFsaWRhdG9yU3RlcCk7Ci0KLQkJCQkJCWlmICh2YWxpZGF0b3JTY29wZSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQkJLy8gbWFyayB0aGlzIHZhbGlkYXRvciBhcyAicnVuIgotCQkJCQkJCWZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW4uYWRkKHZtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlUZW1wb3JhcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldEFubm90YXRpb25zVG9SZW1vdmUoZHIsIHN0ZXBzUmFuT25UaGlzRGlydHlSZWdpb24pOwotCQlpZiAoYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGggKyBhbm5vdGF0aW9uc1RvQWRkLnNpemUoKSA+IDApCi0JCQlzbWFydFByb2Nlc3MoYW5ub3RhdGlvbnNUb1JlbW92ZSwgKElSZWNvbmNpbGVSZXN1bHRbXSkgYW5ub3RhdGlvbnNUb0FkZC50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2Fubm90YXRpb25zVG9BZGQuc2l6ZSgpXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJSXRlcmF0b3IgaXQgPSBmVmlkVG9WU3RlcE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlJUmVjb25jaWxlU3RlcCBzdGVwID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJc3RlcCA9IChJUmVjb25jaWxlU3RlcCkgaXQubmV4dCgpOwotCQkJaWYgKHN0ZXAgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkKLQkJCQkoKElSZWxlYXNhYmxlKSBzdGVwKS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5I3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCi0JCXN1cGVyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQotCQkvLyB2YWxpZGF0b3Igc3RlcHMgYXJlIGluICJmVklkVG9WU3RlcE1hcCIgKGFzIG9wcG9zZWQgdG8gZkZpcnN0U3RlcCA+Ci0JCS8vIG5leHQgc3RlcCBldGMuLi4pCi0JCUl0ZXJhdG9yIGl0ID0gZlZpZFRvVlN0ZXBNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSVJlY29uY2lsZVN0ZXAgc3RlcCA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXN0ZXAgPSAoSVJlY29uY2lsZVN0ZXApIGl0Lm5leHQoKTsKLQkJCXN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYWNjb3JkaW5nIHRvIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gdm1kCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRvckVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbigpOwotCQlvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YSBtZXRhZGF0YSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKSk7Ci0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwgJiYgbWV0YWRhdGEgIT0gbnVsbCkgewotCQkJaWYgKCFjb25maWd1cmF0aW9uLmlzQnVpbGRFbmFibGVkKG1ldGFkYXRhKSAmJiAhY29uZmlndXJhdGlvbi5pc01hbnVhbEVuYWJsZWQobWV0YWRhdGEpKQotCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGN1cnJlbnQgdmFsaWRhdGlvbiBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gY3VycmVudCBwcm9qZWN0Ci0JICogKHdoaWNoIGlzIGJhc2VkIG9uIGN1cnJlbnQgZG9jdW1lbnQpCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0Q29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgUHJvamVjdENvbmZpZ3VyYXRpb24gZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmUHJvamVjdENvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZlByb2plY3RDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmUHJvamVjdENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyBJRmlsZSBmcm9tIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWxlIHRoZSBJRmlsZSwgbnVsbCBpZiBubyBzdWNoIGZpbGUgZXhpc3RzCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkvLyBUaGUgYmFzZUxvY2F0aW9uIG1heSBiZSBhIHBhdGggb24gZGlzayBvciByZWxhdGl2ZSB0byB0aGUKLQkJCQkvLyB3b3Jrc3BhY2Ugcm9vdC4gRG9uJ3QgdHJhbnNsYXRlIG9uLWRpc2sgcGF0aHMgdG8KLQkJCQkvLyBpbi13b3Jrc3BhY2UgcmVzb3VyY2VzLgotCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGUgSUZpbGUgZG9lc24ndCAgZXhpc3QsIG1ha2Ugc3VyZSBpdCdzIG5vdAotCQkJCQkgKiByZXR1cm5lZAotCQkJCQkgKi8KLQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCQkJZmlsZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzZDU0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLQotCi0KLS8qKgotICogQmFzaWMgbGFiZWwgcHJvdmlkZXIgdGhhdCBqdXN0IHByb3ZpZGVzIGFuIGltYWdlIGFuZCBkZWZhdWx0IHRleHQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX09DQ19NQVRDSCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWF0Y2gpIHsKLQkJCU1hdGNoIG0gPSAoTWF0Y2gpIGVsZW1lbnQ7Ci0KLQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG0uZ2V0RWxlbWVudCgpOwotCQkJaWYgKG1hcmtlci5leGlzdHMoKSkgewotCQkJCVN0cmluZyByZXN1bHRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlyZXN1bHRUZXh0ID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQl0ZXh0LmFwcGVuZChyZXN1bHRUZXh0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRleHQuYXBwZW5kKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2ZmJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU2VhcmNoUXVlcnkgaW1wbGVtZW50cyBJU2VhcmNoUXVlcnkgewotCi0JLyoqIGF0dHJpYnV0ZSB0byBpZGVudGlmeSBtYXJrZXJzIGFkZGVkIGJ5IGZpbmQgb2NjdXJyZW5jZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09DQ1VSUkVOQ0VTX01BUktFUiA9ICJvY2N1cnJlbmNlc19tYXJrZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTElORV9MRU5HVEhfTElNSVQgPSAyMDA7Ci0KLQkvKiogdGhlIGZpbGUgd2UncmUgc2VhcmNoaW5nICogKi8KLQlwcml2YXRlIElGaWxlIGZGaWxlID0gbnVsbDsKLQkvKiogb2NjdXJyZW5jZSBzZWFyY2ggbWF0Y2hlcyAqICovCi0JcHJpdmF0ZSBMaXN0IGZNYXRjaGVzID0gbnVsbDsKLQotCXB1YmxpYyBCYXNpY1NlYXJjaFF1ZXJ5KElGaWxlIGZpbGUpIHsKLQkJdGhpcy5mRmlsZSA9IGZpbGU7Ci0JCXRoaXMuZk1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgbWF0Y2hTdGFydCwgaW50IG1hdGNoRW5kKSB7Ci0KLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KG1hdGNoU3RhcnQpOwotCQkJaW50IGxpbmVTdGFydCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0JCQlpbnQgbGluZUxlbmd0aCA9IGRvY3VtZW50LmdldExpbmVMZW5ndGgobGluZU51bWJlcik7Ci0KLQkJCVN0cmluZyBzZWFyY2hSZXN1bHRTdHJpbmcgPSBkb2N1bWVudC5nZXQoKS5zdWJzdHJpbmcobGluZVN0YXJ0LCBsaW5lU3RhcnQgKyBsaW5lTGVuZ3RoKS50cmltKCk7Ci0KLQkJCS8vIGNyZWF0ZSBzZWFyY2ggbWFya2VyIChzbyBhbm5vdGF0aW9ucyBzaG93IHVwIGluIGVkaXRvcikKLQkJCUlNYXJrZXIgbWFya2VyID0gY3JlYXRlU2VhcmNoTWFya2VyKG1hdGNoU3RhcnQsIG1hdGNoRW5kLCBsaW5lTnVtYmVyLCBzZWFyY2hSZXN1bHRTdHJpbmcpOwotCi0JCQlhZGRNYXRjaChuZXcgTWF0Y2gobWFya2VyLCBNYXRjaC5VTklUX0NIQVJBQ1RFUiwgbWF0Y2hTdGFydCwgbWF0Y2hTdGFydCArIG1hdGNoRW5kKSk7Ci0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRNYXRjaChNYXRjaCBtYXRjaCkgewotCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJCXRoaXMuZk1hdGNoZXMuYWRkKG1hdGNoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUmVydW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhck1hdGNoZXMoKSB7Ci0JCXRoaXMuZk1hdGNoZXMuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1hcmtlciBjcmVhdGVTZWFyY2hNYXJrZXIoaW50IG1hdGNoU3RhcnQsIGludCBtYXRjaEVuZCwgaW50IGxpbmVOdW1iZXIsIFN0cmluZyBzZWFyY2hSZXN1bHRTdHJpbmcpIHsKLQotCQlJTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RmlsZSgpICE9IG51bGwpIHsKLQotCQkJCW1hcmtlciA9IGdldEZpbGUoKS5jcmVhdGVNYXJrZXIoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUik7Ci0JCQkJSGFzaE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoNik7Ci0KLQkJCQlNYXJrZXJVdGlsaXRpZXMuc2V0Q2hhclN0YXJ0KGF0dHJpYnV0ZXMsIG1hdGNoU3RhcnQpOwotCQkJCU1hcmtlclV0aWxpdGllcy5zZXRDaGFyRW5kKGF0dHJpYnV0ZXMsIG1hdGNoRW5kKTsKLQkJCQlNYXJrZXJVdGlsaXRpZXMuc2V0TGluZU51bWJlcihhdHRyaWJ1dGVzLCBsaW5lTnVtYmVyKTsKLQotCQkJCS8vIHRoaXMgbWlnaHQgYmUgYmFkIGlmIGxpbmUgb2YgdGV4dCBpcyBWRVJZIGxvbmc/Ci0JCQkJaWYgKHNlYXJjaFJlc3VsdFN0cmluZy5sZW5ndGgoKSA+IExJTkVfTEVOR1RIX0xJTUlUKQotCQkJCQlzZWFyY2hSZXN1bHRTdHJpbmcgPSBzZWFyY2hSZXN1bHRTdHJpbmcuc3Vic3RyaW5nKDAsIExJTkVfTEVOR1RIX0xJTUlUKSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCQkJTWFya2VyVXRpbGl0aWVzLnNldE1lc3NhZ2UoYXR0cmlidXRlcywgc2VhcmNoUmVzdWx0U3RyaW5nKTsKLQotCQkJCS8vIHNvIHdlIGNhbiByZW1vdmUgdGhlbSBsYXRlcgotCQkJCWF0dHJpYnV0ZXMucHV0KEFUVFJfT0NDVVJSRU5DRVNfTUFSS0VSLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0KLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBtYXJrZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZU9jY3VycmVuY2VzTWFya2VycygpIHsKLQotCQlmaW5hbCBMaXN0IHJlbW92YWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJLy8gY2xlYXIgYWxsIG9sZCBmaW5kIG9jY3VycmVuY2VzIG1hcmtlcnMKLQkJCUlNYXJrZXJbXSBzZWFyY2hNYXJrZXJzID0gZkZpbGUuZmluZE1hcmtlcnMoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvID0gc2VhcmNoTWFya2Vyc1tpXS5nZXRBdHRyaWJ1dGUoQmFzaWNTZWFyY2hRdWVyeS5BVFRSX09DQ1VSUkVOQ0VTX01BUktFUik7Ci0JCQkJaWYgKG8gIT0gbnVsbCAmJiAoKEJvb2xlYW4pIG8pLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJCXJlbW92YWxzLmFkZChzZWFyY2hNYXJrZXJzW2ldKTsKLQotCQkJfQotCi0JCQlpZiAocmVtb3ZhbHMuc2l6ZSgpID4gMCkgewotCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZhbHMuc2l6ZSgpOyBpKyspCi0JCQkJCQkJKChJTWFya2VyKSByZW1vdmFscy5nZXQoaSkpLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdXRhbCB3b3JrIG9mIHRoZSBxdWVyeS4gV2lsbCBiZSBydW4gaW4gYSBiYWNrZ3JvdW5kIEpvYgotCSAqIGF1dG9tYXRpY2FsbHkgaWYgY2FuUnVuSW5CYWNrZ3JvdW5kKC4uKSByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGRvUXVlcnkoKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogcHVibGljIHRvIGF2b2lkIHN5bnRoZXRpYyBtZXRob2QgYWNjZXNzIGZyb20gaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgTWF0Y2hbXSBnZXRNYXRjaGVzKCkgewotCQkvLyBnZXQgcmlkIG9mIHRoZSBvbGQgbWFya2VycwotCQlpZihmRmlsZS5leGlzdHMoKSkgewotCQkJZGVsZXRlT2NjdXJyZW5jZXNNYXJrZXJzKCk7Ci0JCQlkb1F1ZXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIChNYXRjaFtdKSB0aGlzLmZNYXRjaGVzLnRvQXJyYXkobmV3IE1hdGNoW3RoaXMuZk1hdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB1c2VkIGluIHNlYXJjaCByZXN1bHQgZGlzcGxheSBsYWJlbHMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWFyY2hUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZGVmZXIgdG8gImdldCguLi4pIgotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YmI0MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGFjdGlvbiBjYWxsIGJhc2VkIG9uCi0gKiBzZWxlY3Rpb24uIENsaWVudHMgY2FuIGFkZCBwcm9jZXNzb3JzIGZvciBkaWZmZXJlbnQgcGFydGl0aW9ucyB2aWEKLSAqIDxjb2RlPmdldFByb2Nlc3NvcnM8L2NvZGU+Ci0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJYm9vbGVhbiBva2F5ID0gZmFsc2U7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGNsZWFyIHN0YXR1cyBtZXNzYWdlCi0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgYWN0aW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYWN0aW9uID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKGFjdGlvbi5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlZ2lvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzlkMDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogPHA+Ci0gKiBGaW5kcyBvY2N1cnJlbmNlcyBvZiBhIHNwZWNpZmllZCByZWdpb24gdHlwZSB3LyByZWdpb24gdGV4dCBpbiBhbgotICogSVN0cnVjdHVyZWREb2N1bWVudC4gQ2xpZW50cyBtdXN0IGltcGxlbWVudCBnZXRQYXJ0aXRpb25UeXBlcygpIGFuZAotICogZ2V0UmVnaW9uVHlwZXMoKSB0byBpbmRpY2F0ZSB3aGljaCBwYXJ0aXRpb24gdHlwZXMgYW5kIHJlZ2lvbiB0eXBlcyBpdCBjYW4KLSAqIG9wZXJhdGUgb24uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgPGNvZGU+Z2V0U2VhcmNoUXVlcnkoKTwvY29kZT4gaW4gb3JkZXIgdG8gcHJvdmlkZQotICogdGhlaXIgb3duIHR5cGUgb2YgInNlYXJjaCIgKGVnLiBzZWFyY2hpbmcgZm9yIFhNTCBzdGFydCB0YWdzLCBzZWFyY2hpbmcgZm9yCi0gKiBKYXZhIGVsZW1lbnRzLCBldGMuLi4pCi0gKiA8L3A+Ci0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0JcHVibGljIGJvb2xlYW4gZmluZE9jY3VycmVuY2VzKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiwgSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGZpbmRPY2N1cnJlbmNlcyA9IGZhbHNlOwotCi0JCS8vIGRldGVybWluZSBpZiBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSByLmdldFR5cGUoKTsKLQkJCQkJaWYgKGVuYWJsZWRGb3JSZWdpb25UeXBlKHR5cGUpKSB7Ci0JCQkJCQlTdHJpbmcgbWF0Y2hUZXh0ID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQotCQkJCQkJLy8gZmlyc3Qgb2YgYWxsIGFjdGl2YXRlIHRoZSB2aWV3Ci0JCQkJCQlOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLQotCQkJCQkJaWYgKG1hdGNoVGV4dCAhPSBudWxsICYmIHR5cGUgIT0gbnVsbCkgewotCQkJCQkJCUlTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IGdldFNlYXJjaFF1ZXJ5KGZpbGUsIHN0cnVjdHVyZWREb2N1bWVudCwgbWF0Y2hUZXh0LCB0eXBlLCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQkJCQlpZiAoc2VhcmNoUXVlcnkgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoc2VhcmNoUXVlcnkuY2FuUnVuSW5CYWNrZ3JvdW5kKCkpCi0JCQkJCQkJCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5Gb3JlZ3JvdW5kKG51bGwsIHNlYXJjaFF1ZXJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluZE9jY3VycmVuY2VzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmluZE9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBjYW4gb3BlcmF0ZSBvbiB0aGlzIHJlZ2lvbgotCSAqICAgICAgICAgdHlwZSAoSVRleHRSZWdpb24pLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWRGb3JSZWdpb25UeXBlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0KLQkJU3RyaW5nW10gYWNjZXB0ID0gZ2V0UmVnaW9uVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWdpb25UeXBlLmVxdWFscyhhY2NlcHRbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGNlcnRhaW4KLQkgKiBwYXJ0aXRpb24ocykuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCk7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGRpZmZlcmVudAotCSAqIHJlZ2lvbiB0eXBlKHMpLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpOwotCi0JLyoqCi0JICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgdG8gcHJvdmlkZSB0aGVpciBvd24gc2VhcmNoIGZvciB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlYXJjaFF1ZXJ5IGdldFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZWdpb25UZXh0LCBTdHJpbmcgcmVnaW9uVHlwZSwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9jY3VycmVuY2VzU2VhcmNoUXVlcnkoZmlsZSwgZG9jdW1lbnQsIHJlZ2lvblRleHQsIHJlZ2lvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBjYW4gb3BlcmF0ZSBvbiB0aGlzIHR5cGUgb2YKLQkgKiAgICAgICAgIHBhcnRpdGlvbiwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbmFibGVkRm9yUGFyaXRpdGlvbihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlTdHJpbmdbXSBhY2NlcHQgPSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKGFjY2VwdFtpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNTFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBmUmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZlJlc3VsdCAhPSBudWxsKQotCQkJdGhpcy5mUmVzdWx0LmNsZWFyTWF0Y2hlcygpOwotCQlpZiAodGhpcy5mVGFibGVWaWV3ZXIgIT0gbnVsbCkKLQkJCXRoaXMuZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCi0JCS8vVE9ETzogY29waWVkIGZyb20gSmF2YVNlYXJjaFRhYmxlQ29udGVudFByb3ZpZGVyCi0JCWludCBhZGRDb3VudCA9IDA7Ci0JCWludCByZW1vdmVDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5mUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodGhpcy5mVGFibGVWaWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkKLQkJCQkJdGhpcy5mVGFibGVWaWV3ZXIucmVmcmVzaCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5mVGFibGVWaWV3ZXIuYWRkKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJYWRkQ291bnQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5mVGFibGVWaWV3ZXIucmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJcmVtb3ZlQ291bnQrKzsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQotCQl0aGlzLmZSZXN1bHQgPSAoT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQpIGlucHV0RWxlbWVudDsKLQkJcmV0dXJuIHRoaXMuZlJlc3VsdC5nZXRNYXRjaGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpCi0JCQl0aGlzLmZUYWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCQl0aGlzLmZSZXN1bHQgPSAoT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQpIG5ld0lucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLQkJaWYgKHRoaXMuZlRhYmxlVmlld2VyICE9IG51bGwpCi0JCQl0aGlzLmZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkOTAzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBCYXNpYyBJU2VhcmNoUXVlcnkgdGhhdCBmaW5kcyBtYXRjaGVzIG9mIHJlZ2lvbiB0eXBlIGFuZCByZWdpb24gdGV4dC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE9jY3VycmVuY2VzU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQotCS8qKgotCSAqIFdlIG5lZWQgYSBydW5uYWJsZSBzbyB0aGF0IHRoZSBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluIHRoZSBsaXZlCi0JICogZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBGaW5kUmVnaW9ucyBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZGaW5kUmVnaW9uc0RvY3VtZW50ID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZk1hdGNoTmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZNYXRjaFJlZ2lvblR5cGUgPSBudWxsOwotCi0JCXB1YmxpYyBGaW5kUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbWF0Y2hUZXh0LCBTdHJpbmcgbWF0Y2hSZWdpb25UeXBlKSB7Ci0KLQkJCXRoaXMuZkZpbmRSZWdpb25zRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCXRoaXMuZk1hdGNoTmFtZSA9IG1hdGNoVGV4dDsKLQkJCXRoaXMuZk1hdGNoUmVnaW9uVHlwZSA9IG1hdGNoUmVnaW9uVHlwZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaW5kT2NjdXJyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCWlmICghaXNDYW5jZWxlZChtb25pdG9yKSkgewotCi0JCQkJaW50IG1hdGNoU3RhcnQgPSAtMTsKLQkJCQlpbnQgbWF0Y2hFbmQgPSAtMTsKLQkJCQlTdHJpbmcgZmluZFJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBudWxsOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudCA9IHRoaXMuZkZpbmRSZWdpb25zRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJCS8vIHRoaXMgaXMgdGhlIG1haW4gbG9vcCB0aGF0IGl0ZXJhdGVzIHRoZSBkb2N1bWVudAotCQkJCXdoaWxlIChjdXJyZW50ICE9IG51bGwgJiYgIWlzQ2FuY2VsZWQobW9uaXRvcikpIHsKLQkJCQkJcmVnaW9ucyA9IGN1cnJlbnQuZ2V0UmVnaW9ucygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpICYmICFpc0NhbmNlbGVkKG1vbml0b3IpOyBpKyspIHsKLQotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCi0JCQkJCQkvLyBtYXliZSB0aGlzIGlzIHRoZSBlcXVhbHMgY2hlY2sgd2hlcmUgc29tZSB2YWxpZAotCQkJCQkJLy8gbWF0Y2hlcyBhcmUgZmFpbGluZyAobGlrZSBzZWFyY2hpbmcgb24gZW5kIHRhZykKLQkJCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHModGhpcy5mTWF0Y2hSZWdpb25UeXBlKSAmJiBjdXJyZW50LmdldFRleHQocikuZXF1YWxzKHRoaXMuZk1hdGNoTmFtZSkpIHsKLQotCQkJCQkJCWZpbmRSZWdpb25UZXh0ID0gY3VycmVudC5nZXRUZXh0KHIpOwotCi0JCQkJCQkJLy8gcmVnaW9uIGZvdW5kCi0JCQkJCQkJbWF0Y2hTdGFydCA9IGN1cnJlbnQuZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJbWF0Y2hFbmQgPSBtYXRjaFN0YXJ0ICsgZmluZFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpOwotCi0JCQkJCQkJYWRkTWF0Y2godGhpcy5mRmluZFJlZ2lvbnNEb2N1bWVudCwgbWF0Y2hTdGFydCwgbWF0Y2hFbmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCXRyeSB7Ci0JCQkJZmluZE9jY3VycmVuY2VzKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gZW5kIGlubmVyIGNsYXNzIEZpbmRSZWdpb25zCi0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZSZWdpb25UZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmUmVnaW9uVHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXRoaXMuZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXRoaXMuZlJlZ2lvblRleHQgPSByZWdpb25UZXh0OwotCQl0aGlzLmZSZWdpb25UeXBlID0gcmVnaW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJLy8gcGFfVE9ETyBpbnZlc3RpZ2F0ZSB3aGF0IGlzIHJlcXVpcmVkIHRvIGRvIHRoaXMgc2FmZWx5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoUXVlcnkjZG9RdWVyeSgpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQotCQljbGVhck1hdGNoZXMoKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCUZpbmRSZWdpb25zIGZpbmRSZWdpb25zID0gbmV3IEZpbmRSZWdpb25zKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZSZWdpb25UZXh0LCB0aGlzLmZSZWdpb25UeXBlKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oZmluZFJlZ2lvbnMsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNTRVVJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOyAvLyROT04tTkxTLTEkICJmaWxlIgotCQlpZiAoZ2V0RmlsZSgpICE9IG51bGwpCi0JCQlmaWxlbmFtZSA9IGdldEZpbGUoKS5nZXROYW1lKCkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCVN0cmluZyBsYWJlbCA9IFNTRVVJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIGFyZ3MgPSB7Z2V0U2VhcmNoVGV4dCgpLCBnZXRPY2N1cnJlbmNlc0NvdW50VGV4dCgpLCBnZXRGaWxlbmFtZSgpfTsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxhYmVsLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSB7Ci0JCVN0cmluZyBjb3VudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHBhX1RPRE8gZHluYW1pY2FsbHkgY2hhbmdlIGNvdW50Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgSVNlYXJjaFJlc3VsdCBnZXRTZWFyY2hSZXN1bHQoKSB7Ci0JCXJldHVybiBuZXcgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWFyY2hUZXh0KCkgewotCQlyZXR1cm4gdGhpcy5mUmVnaW9uVGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2Y3MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hBZGFwdGVyLCBJRmlsZU1hdGNoQWRhcHRlciB7Ci0KLQlwcml2YXRlIElTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgTWF0Y2hbXSBOT19NQVRDSEVTID0gbmV3IE1hdGNoWzBdOwotCi0JcHVibGljIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0KElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQl0aGlzLmZRdWVyeSA9IHF1ZXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyTWF0Y2hlcygpIHsKLQkJaWYgKGdldFF1ZXJ5KCkgaW5zdGFuY2VvZiBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5KQotCQkJKChPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5KSBnZXRRdWVyeSgpKS5jbGVhck1hdGNoZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXIjY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0LAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotCQkJcmV0dXJuIGNvbXB1dGVDb250YWluZWRNYXRjaGVzKHJlc3VsdCwgZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuTk9fTUFUQ0hFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklGaWxlTWF0Y2hBZGFwdGVyI2NvbXB1dGVDb250YWluZWRNYXRjaGVzKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBNYXRjaFtdIGNvbXB1dGVDb250YWluZWRNYXRjaGVzKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGdldE1hdGNoZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSUVkaXRvck1hdGNoQWRhcHRlciBnZXRFZGl0b3JNYXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXIjZ2V0RmlsZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIHJldHVybiB0aGUgZmlsZSBmb3IgdGhlIG1hdGNoCi0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0IGZpbGUgZm9yOiIrZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJSVJlc291cmNlIHIgPSAoKElNYXJrZXIpIGVsZW1lbnQpLmdldFJlc291cmNlKCk7Ci0JCQlpZiAociBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJZmlsZSA9IChJRmlsZSkgcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGVNYXRjaEFkYXB0ZXIgZ2V0RmlsZU1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9PQ0NfTUFUQ0gpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbGFiZWwgc2hvd3MgdXAgaW4gdGhlIHNlYXJjaCBoaXN0b3J5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGdldFF1ZXJ5KCkuZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgTWF0Y2hbXSBnZXRNYXRjaGVzKCkgewotCQkvLyBlbnN1cmUgdGhhdCBxdWVyeSBpcyBkb25lIHJ1bm5pbmcKLQkJcmV0dXJuICgoT2NjdXJyZW5jZXNTZWFyY2hRdWVyeSkgZ2V0UXVlcnkoKSkuZ2V0TWF0Y2hlcygpOwotCX0KLQotCXB1YmxpYyBJU2VhcmNoUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLmZRdWVyeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0JCXJldHVybiBnZXRMYWJlbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNpc1Nob3duSW5FZGl0b3Iob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2gsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNTZWFyY2hWaWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDU0MTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNTZWFyY2hWaWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIEJhc2UgcGFnZSBmb3IgT2NjdXJyZW5jZXMgaW4gZmlsZSBzZWFyY2ggcmVzdWx0cy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE9jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSB7Ci0KLQlwcml2YXRlIE9jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHVibGljIE9jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UoKSB7Ci0JCXN1cGVyKEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlLkZMQUdfTEFZT1VUX0ZMQVQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY2xlYXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5mQ29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQl0aGlzLmZDb250ZW50UHJvdmlkZXIuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRhYmxlVmlld2VyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVGFibGVWaWV3ZXIoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0KLQkJLy8gcGFfVE9ETyBuZWVkIHNvcnRlcj8KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcigpKTsKLQkJdGhpcy5mQ29udGVudFByb3ZpZGVyID0gbmV3IE9jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyKCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodGhpcy5mQ29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRyZWVWaWV3ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRyZWVWaWV3ZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNlbGVtZW50c0NoYW5nZWQoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWlmICh0aGlzLmZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJdGhpcy5mQ29udGVudFByb3ZpZGVyLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmNlUmVmcmVzaCgpIHsKLQkJdGhpcy5mQ29udGVudFByb3ZpZGVyLnJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0KLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjZ2V0RGlzcGxheWVkTWF0Y2hlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBNYXRjaFtdIGdldERpc3BsYXllZE1hdGNoZXMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI2NDAKLQkJLy8gd2Ugb25seSBldmVyIHNob3cgb25lIGF0IGEgdGltZSwgdGhlIGVsZW1lbnQgcGFzc2VkIGluIGlzIHRoZSBtYXRjaAotCQkvLyBzdXBlciB3YXMgcmV0dXJuaW5nIG51bGwKLQkJcmV0dXJuIG5ldyBNYXRjaFtdeyhNYXRjaCkgZWxlbWVudH07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3coSU1hcmtlciBtYXJrZXIpIHsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0KLQkJCQkvLyBvcGVuIGVkaXRvciBpZiBuZWVkZWQKLQkJCQlJREUub3BlbkVkaXRvcihnZXRBY3RpdmVQYWdlKCksIG1hcmtlcik7Ci0KLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlJR290b01hcmtlciBnb3RvTWFya2VyID0gKElHb3RvTWFya2VyKSBlZGl0b3IuZ2V0QWRhcHRlcihJR290b01hcmtlci5jbGFzcyk7Ci0JCQkJCWlmIChnb3RvTWFya2VyICE9IG51bGwpCi0JCQkJCQlnb3RvTWFya2VyLmdvdG9NYXJrZXIobWFya2VyKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJLy8gcG9zc2libGUgZXhjZXB0aW9uIHRyeWluZyB0byBvcGVuIGVkaXRvcgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2Ujc2hvd01hdGNoKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLAotCSAqICAgICAgaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd01hdGNoKE1hdGNoIG1hdGNoLCBpbnQgY3VycmVudE9mZnNldCwgaW50IGN1cnJlbnRMZW5ndGgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBvID0gbWF0Y2guZ2V0RWxlbWVudCgpOwotCQlpZiAobyBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCXNob3coKElNYXJrZXIpIG8pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25IaXN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbkhpc3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNTIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbkhpc3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25IaXN0b3J5IHsKLQlwcml2YXRlIElUZXh0RWRpdG9yIGZFZGl0b3I7Ci0JcHJpdmF0ZSBMaXN0IGZIaXN0b3J5OwotCXByaXZhdGUgTGlzdCBmSGlzdG9yeUFjdGlvbnM7Ci0JcHJpdmF0ZSBpbnQgZlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyQ291bnRlcjsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZlNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHVibGljIFNlbGVjdGlvbkhpc3RvcnkoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQkJZkhpc3RvcnkgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXIgPT0gMCkKLQkJCQkJZmx1c2goKTsKLQkJCX0KLQkJfTsKLQkJZkVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWlmIChmSGlzdG9yeSAhPSBudWxsICYmICFmSGlzdG9yeS5pc0VtcHR5KCkpIHsKLQkJCWZIaXN0b3J5LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGZIaXN0b3J5QWN0aW9ucyAhPSBudWxsICYmICFmSGlzdG9yeUFjdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQlmSGlzdG9yeUFjdGlvbnMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQlpZiAoZkhpc3RvcnkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlmSGlzdG9yeS5jbGVhcigpOwotCQl1cGRhdGVIaXN0b3J5QWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0TGFzdCgpIHsKLQkJaWYgKGlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgc2l6ZSA9IGZIaXN0b3J5LnNpemUoKTsKLQkJSVJlZ2lvbiByZXN1bHQgPSAoSVJlZ2lvbikgZkhpc3RvcnkucmVtb3ZlKHNpemUgLSAxKTsKLQkJdXBkYXRlSGlzdG9yeUFjdGlvbigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKSB7Ci0JCWZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXIrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZkhpc3RvcnkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpIHsKLQkJZlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyQ291bnRlci0tOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbWVtYmVyKElSZWdpb24gcmVnaW9uKSB7Ci0JCWZIaXN0b3J5LmFkZChyZWdpb24pOwotCQl1cGRhdGVIaXN0b3J5QWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGlzdG9yeUFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbik7Ci0JCQotCQlpZiAoZkhpc3RvcnlBY3Rpb25zID09IG51bGwpCi0JCQlmSGlzdG9yeUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghZkhpc3RvcnlBY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpCi0JCQlmSGlzdG9yeUFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQotCQkvLyB1cGRhdGUgYWN0aW9uCi0JCWlmIChmSGlzdG9yeSAhPSBudWxsICYmICFmSGlzdG9yeS5pc0VtcHR5KCkpCi0JCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJZWxzZQotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVIaXN0b3J5QWN0aW9uKCkgewotCQlpZiAoZkhpc3RvcnlBY3Rpb25zICE9IG51bGwgJiYgIWZIaXN0b3J5QWN0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQkJaWYgKGZIaXN0b3J5ICE9IG51bGwgJiYgIWZIaXN0b3J5LmlzRW1wdHkoKSkKLQkJCQllbmFibGVkID0gdHJ1ZTsKLQotCQkJSXRlcmF0b3IgaXRlciA9IGZIaXN0b3J5QWN0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJKChJQWN0aW9uKWl0ZXIubmV4dCgpKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGYyZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIGluc3RlYWQKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlU2VsZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgZkVkaXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIFNlbGVjdGlvbkhpc3RvcnkgZkhpc3Rvcnk7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgU3RydWN0dXJlU2VsZWN0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQkJZkhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWZWaWV3ZXIgPSBlZGl0b3IuZ2V0VGV4dFZpZXdlcigpOwotCQlmTW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVmlld2VyKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbnQgbGFzdE9mZnNldCA9IG9mZnNldDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZkVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZkVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl3aGlsZSAoaW5kZXhlZFJlZ2lvbiA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJCQlsYXN0T2Zmc2V0LS07Ci0JCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oTm9kZSBub2RlLCBSZWdpb24gcmVnaW9uKTsKLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUmVnaW9uIGN1cnJlbnRSZWdpb24gPSBuZXcgUmVnaW9uKGZWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLngsIGZWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnkpOwotCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSA9PSBmVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm47Ci0KLQkJSW5kZXhlZFJlZ2lvbiBjdXJzb3JJbmRleGVkUmVnaW9uID0gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbigpOwotCQlpZiAoY3Vyc29ySW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBjdXJzb3JJbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotCQkJCQljdXJzb3JJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihjdXJzb3JJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnNvckluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBjdXJzb3JJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50UmVnaW9uLmdldE9mZnNldCgpICsgY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50UmVnaW9uLmdldE9mZnNldCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpKQotCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbihjdXJzb3JOb2RlLCBjdXJyZW50UmVnaW9uKTsKLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCi0JCQlpZiAobmV3UmVnaW9uICE9IG51bGwpIHsKLQkJCQlmSGlzdG9yeS5yZW1lbWJlcihjdXJyZW50UmVnaW9uKTsKLQkJCQl0cnkgewotCQkJCQlmSGlzdG9yeS5pZ25vcmVTZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQkJCWZFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTc0NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbiBleHRlbmRzIFN0cnVjdHVyZVNlbGVjdEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCXB1YmxpYyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCQlzZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VG9vbFRpcFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXApOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9kZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQl1cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihOb2RlIG5vZGUsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJUmVnaW9uIG9sZCA9IGZIaXN0b3J5LmdldExhc3QoKTsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZIaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQlmRWRpdG9yLnNlbGVjdEFuZFJldmVhbChvbGQuZ2V0T2Zmc2V0KCksIG9sZC5nZXRMZW5ndGgoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzZXRFbmFibGVkKCFmSGlzdG9yeS5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTBjMjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgU2VsZWN0aW9uSGlzdG9yeSBmSGlzdG9yeTsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFZGl0b3IgPSBudWxsOwotCQlmSGlzdG9yeSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJLy8gZGV0ZXJtaW5lIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiBkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPCBkb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQkvLyBnZXQgY3VycmVudCBpbmRleGVkIHJlZ2lvbgotCQkJCQlJbmRleGVkUmVnaW9uIGN1cnNvckluZGV4ZWRSZWdpb24gPSBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQotCQkJCQkvLyBkZXRlcm1pbmUgbmV3IHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50IGluZGV4ZWQgcmVnaW9uCi0JCQkJCVJlZ2lvbiBuZXdTZWxlY3Rpb25SZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24oY3Vyc29ySW5kZXhlZFJlZ2lvbiwgdGV4dFNlbGVjdGlvbik7Ci0KLQkJCQkJLy8gc2VsZWN0IG5ldyBzZWxlY3Rpb24KLQkJCQkJaWYgKG5ld1NlbGVjdGlvblJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlmSGlzdG9yeS5yZW1lbWJlcihuZXcgUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZkhpc3RvcnkuaWdub3JlU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG5ld1NlbGVjdGlvblJlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3U2VsZWN0aW9uUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JCWlmIChmRWRpdG9yICE9IG51bGwpCi0JCQlmSGlzdG9yeSA9IChTZWxlY3Rpb25IaXN0b3J5KSBmRWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWVsc2UKLQkJCWZIaXN0b3J5ID0gbnVsbDsKLQl9Ci0JCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pOwotCQotCWFic3RyYWN0IHByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCBieSB1c2luZyBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWludCBsYXN0T2Zmc2V0ID0gb2Zmc2V0OwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCXdoaWxlIChpbmRleGVkUmVnaW9uID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQkJCWxhc3RPZmZzZXQtLTsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZGM1YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFNlbGVjdGlvbiBoaXN0b3J5IGFjdGlvbiBkZWxlZ2F0ZS4gS2VlcHMgdHJhY2sgb2Ygc2VsZWN0aW9uIHdpdGhpbiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25IaXN0b3J5IGZIaXN0b3J5OwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZIaXN0b3J5ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJUmVnaW9uIG9sZCA9IGZIaXN0b3J5LmdldExhc3QoKTsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZIaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkoKElUZXh0RWRpdG9yKSBmRWRpdG9yKS5zZWxlY3RBbmRSZXZlYWwob2xkLmdldE9mZnNldCgpLCBvbGQuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZkhpc3RvcnkubGlzdGVuVG9TZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCQlpZiAoZkVkaXRvciAhPSBudWxsKQotCQkJZkhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZkVkaXRvci5nZXRBZGFwdGVyKFNlbGVjdGlvbkhpc3RvcnkuY2xhc3MpOwotCQllbHNlCi0JCQlmSGlzdG9yeSA9IG51bGw7Ci0JCWlmIChmSGlzdG9yeSAhPSBudWxsKSB7Ci0JCQlmSGlzdG9yeS5zZXRIaXN0b3J5QWN0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxjaGVja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxjaGVja1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDFjMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL1NwZWxsY2hlY2tTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zcGVsbGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5TY29wZWRQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZy5JU3BlbGxpbmdQcm9ibGVtQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdFbmdpbmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBBIHJlY29uY2lsaW5nIHN0cmF0ZWd5IHRoYXQgcXVlcmllcyB0aGUgU3BlbGxpbmdTZXJ2aWNlIHVzaW5nIGl0cyBkZWZhdWx0Ci0gKiBlbmdpbmUuIFJlc3VsdHMgYXJlIHNob3cgYXMgdGVtcG9yYXJ5IGFubm90YXRpb25zLgotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBTcGVsbGNoZWNrU3RyYXRlZ3kgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgewotCi0JY2xhc3MgU3BlbGxDaGVja1ByZWZlcmVuY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RpbmdQcm9wZXJ0eShPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBTcGVsbGluZ1NlcnZpY2UuUFJFRkVSRU5DRV9TUEVMTElOR19FTkFCTEVELmVxdWFscyhwcm9wZXJ0eSkgfHwgU3BlbGxpbmdTZXJ2aWNlLlBSRUZFUkVOQ0VfU1BFTExJTkdfRU5HSU5FLmVxdWFscyhwcm9wZXJ0eSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoaXNJbnRlcmVzdGluZ1Byb3BlcnR5KGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQkJaWYgKGV2ZW50LmdldE9sZFZhbHVlKCkgPT0gbnVsbCB8fCBldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwgfHwgIWV2ZW50LmdldE5ld1ZhbHVlKCkuZXF1YWxzKGV2ZW50LmdldE9sZFZhbHVlKCkpKSB7Ci0JCQkJCXJlY29uY2lsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgU3BlbGxpbmdQcm9ibGVtQ29sbGVjdG9yIGltcGxlbWVudHMgSVNwZWxsaW5nUHJvYmxlbUNvbGxlY3RvciB7Ci0JCUxpc3QgYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIHZvaWQgYWNjZXB0KFNwZWxsaW5nUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbihuZXcgUG9zaXRpb24ocHJvYmxlbS5nZXRPZmZzZXQoKSwgcHJvYmxlbS5nZXRMZW5ndGgoKSksIFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORywgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KTsKLQkJCS8qCi0JCQkgKiBUT0RPOiBjcmVhdGUgYW5kIHVzZSBhbiBJUXVpY2tGaXhQcm9jZXNzb3IgdGhhdCB1c2VzCi0JCQkgKiBwcm9ibGVtLmdldFByb3Bvc2FscygpIGZvciBmaXhlcyBbbm90ZSwgdGhlIGRlZmF1bHQgZW5naW5lCi0JCQkgKiBkb2Vzbid0IHByb3Bvc2UgZml4ZXMsIGF0IGxlYXN0IHdpdGhvdXQgYSBkaWN0aW9uYXJ5XS4KLQkJCSAqLwotCQkJYW5ub3RhdGlvbi5zZXRBZGRpdGlvbmFsRml4SW5mbyhwcm9ibGVtKTsKLQkJCWFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCWlmIChfREVCVUdfU1BFTExJTkcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCBwcm9ibGVtLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBiZWdpbkNvbGxlY3RpbmcoKSB7Ci0JCX0KLQotCQl2b2lkIGNsZWFyKCkgewotCQkJYW5ub3RhdGlvbnMuY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVuZENvbGxlY3RpbmcoKSB7Ci0JCX0KLQotCQlJUmVjb25jaWxlUmVzdWx0W10gZ2V0UmVzdWx0cygpIHsKLQkJCXJldHVybiAoSVJlY29uY2lsZVJlc3VsdFtdKSBhbm5vdGF0aW9ucy50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2Fubm90YXRpb25zLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTcGVsbGluZ1N0ZXAgZXh0ZW5kcyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCB7Ci0JCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlTW9kZWwoZmluYWwgRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCQlTcGVsbGluZ1NlcnZpY2Ugc2VydmljZSA9IGdldFNwZWxsaW5nU2VydmljZShmQ29udGVudFR5cGVJZCArICIuIiArIFNwZWxsaW5nU2VydmljZS5QUkVGRVJFTkNFX1NQRUxMSU5HX0VOR0lORSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChfREVCVUdfU1BFTExJTkcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiU3BlbGwgY2hlY2tpbmcgWyIgKyBzdWJSZWdpb24uZ2V0T2Zmc2V0KCkgKyAiLSIgKyAoc3ViUmVnaW9uLmdldE9mZnNldCgpICsgc3ViUmVnaW9uLmdldExlbmd0aCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJc2VydmljZS5jaGVjayhnZXREb2N1bWVudCgpLCBuZXcgSVJlZ2lvbltde3N1YlJlZ2lvbn0sIGZTcGVsbGluZ0NvbnRleHQsIGZQcm9ibGVtQ29sbGVjdG9yLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQlJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0cyA9IGZQcm9ibGVtQ29sbGVjdG9yLmdldFJlc3VsdHMoKTsKLQkJCWZQcm9ibGVtQ29sbGVjdG9yLmNsZWFyKCk7Ci0JCQlyZXR1cm4gcmVzdWx0czsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVR19TUEVMTElORyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmciKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9UWVBFID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5zcGVsbGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRFRF9CVUlMREVSX1RZUEUgPSAic3BlbGxpbmdzdXBwb3J0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuc3BlbGxpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBmRG9jdW1lbnRQYXJ0aXRpb25pbmc7Ci0KLQlTcGVsbGluZ1Byb2JsZW1Db2xsZWN0b3IgZlByb2JsZW1Db2xsZWN0b3IgPSBuZXcgU3BlbGxpbmdQcm9ibGVtQ29sbGVjdG9yKCk7Ci0KLQkvKgotCSAqIEtleWluZyBvdXIgVGVtcG9yYXJ5IEFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBwYXJ0aXRpb24gZG9lc24ndCBoZWxwCi0JICogdGhpcyBzdHJhdGVneSB0byBvbmx5IHJlbW92ZSBpdHMgb3duIFRlbXBvcmFyeUFubm90YXRpb25zIHNpbmNlIGl0J3MKLQkgKiBwb3NzaWJseSBydW4gb24gYWxsIHBhcnRpdGlvbnMuIEluc3RlYWQsIHNldCB0aGUga2V5IHRvIHVzZSBhbgotCSAqIGFyYml0cmFyeSBwYXJ0aXRpb24gdHlwZSB0aGF0IHdlIGNhbiBjaGVjayBmb3IgdXNpbmcgb3VyIG93bgotCSAqIGltcGxlbWVudGF0aW9uIG9mIGdldEFubm90YXRpb25zVG9SZW1vdmUoRGlydHlSZWdpb24pLgotCSAqIAotCSAqIFZhbHVlIGluaXRpYWxpemVkIHRocm91Z2gKLQkgKiAKLQkgKiBzdXBlcihJU291cmNlVmlld2VyKS0+c3VwZXIuaW5pdCgpLT5jcmVhdGVSZWNvbmNpbGVTdGVwcygpCi0JICovCi0JUmVjb25jaWxlQW5ub3RhdGlvbktleSBmUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZTcGVsbENoZWNrUHJlZmVyZW5jZUxpc3RlbmVyOwotCi0JU3BlbGxpbmdDb250ZXh0IGZTcGVsbGluZ0NvbnRleHQ7Ci0KLQkvKgotCSAqIFZhbHVlIGluaXRpYWxpemVkIHRocm91Z2gKLQkgKiAKLQkgKiBzdXBlcihJU291cmNlVmlld2VyKS0+c3VwZXIuaW5pdCgpLT5jcmVhdGVSZWNvbmNpbGVTdGVwcygpCi0JICovCi0JSVJlY29uY2lsZVN0ZXAgZlNwZWxsaW5nU3RlcDsKLQotCVN0cmluZ1tdIGZTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlczsKLQotCXB1YmxpYyBTcGVsbGNoZWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciB2aWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXN1cGVyKHZpZXdlcik7Ci0JCWZDb250ZW50VHlwZUlkID0gY29udGVudFR5cGVJZDsKLQotCQlmU3BlbGxpbmdDb250ZXh0ID0gbmV3IFNwZWxsaW5nQ29udGV4dCgpOwotCQlmU3BlbGxpbmdDb250ZXh0LnNldENvbnRlbnRUeXBlKFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGZDb250ZW50VHlwZUlkKSk7Ci0JCWZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5ID0gbmV3IFJlY29uY2lsZUFubm90YXRpb25LZXkoZlNwZWxsaW5nU3RlcCwgS0VZX0NPTlRFTlRfVFlQRSwgUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMKTsKLQotCQlTdHJpbmdbXSBkZWZpbml0aW9ucyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXREZWZpbml0aW9ucyhFWFRFTkRFRF9CVUlMREVSX1RZUEUsIGZDb250ZW50VHlwZUlkKTsKLQkJTGlzdCBkZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmluaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWZzLmFkZEFsbChBcnJheXMuYXNMaXN0KFN0cmluZ1V0aWxzLnVucGFjayhkZWZpbml0aW9uc1tpXSkpKTsKLQkJfQotCQlmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXMgPSAoU3RyaW5nW10pIGRlZnMudG9BcnJheShuZXcgU3RyaW5nW2RlZnMuc2l6ZSgpXSk7Ci0KLQkJZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgU3BlbGxDaGVja1ByZWZlcmVuY2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKSB7Ci0JCXJldHVybiBmU3BlbGxpbmdTdGVwLmVxdWFscyhzdGVwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVSZWNvbmNpbGVTdGVwcygpIHsKLQkJZlNwZWxsaW5nU3RlcCA9IG5ldyBTcGVsbGluZ1N0ZXAoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRQYXJ0aXRpb25pbmcgPT0gbnVsbCA/IElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkcgOiBmRG9jdW1lbnRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wb3JhcnlBbm5vdGF0aW9uW10gZ2V0U3BlbGxpbmdBbm5vdGF0aW9uc1RvUmVtb3ZlKElSZWdpb24gcmVnaW9uKSB7Ci0JCUxpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCS8vIGNhbiBiZSBudWxsIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yCi0JCWlmIChnZXRBbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJCQljb250aW51ZTsKLQotCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBvYmo7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSAoUmVjb25jaWxlQW5ub3RhdGlvbktleSkgYW5ub3RhdGlvbi5nZXRLZXkoKTsKLQotCQkJCS8vIHRoZW4gaWYgdGhpcyBzdHJhdGVneSBrbm93cyBob3cgdG8gYWRkL3JlbW92ZSB0aGlzCi0JCQkJLy8gcGFydGl0aW9uIHR5cGUKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhmUmVjb25jaWxlQW5ub3RhdGlvbktleSkpIHsKLQkJCQkJUG9zaXRpb24gcG9zaXRpb24gPSBhbm5vdGF0aW9uLmdldFBvc2l0aW9uKCk7Ci0JCQkJCWlmIChrZXkuZ2V0U2NvcGUoKSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwgJiYgcG9zaXRpb24ub3ZlcmxhcHNXaXRoKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQkJdG9SZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGtleS5nZXRTY29wZSgpID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuVE9UQUwpIHsKLQkJCQkJCXRvUmVtb3ZlLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSB0b1JlbW92ZS50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3RvUmVtb3ZlLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbmdpbmVJRAotCSAqIEByZXR1cm4gdGhlIFNwZWxsaW5nU2VydmljZSB3aXRoIHRoZSBwcmVmZXJyZWQgZW5naW5lCi0JICovCi0JU3BlbGxpbmdTZXJ2aWNlIGdldFNwZWxsaW5nU2VydmljZShTdHJpbmcgZW5naW5lSUQpIHsKLQkJU3BlbGxpbmdTZXJ2aWNlIGRlZmF1bHRTZXJ2aWNlID0gRWRpdG9yc1VJLmdldFNwZWxsaW5nU2VydmljZSgpOwotCi0JCVNwZWxsaW5nU2VydmljZSBwcmVmZXJyZWRTZXJ2aWNlID0gZGVmYXVsdFNlcnZpY2U7Ci0KLQkJaWYgKGVuZ2luZUlEICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBTZXQgdXAgYSBwcmVmZXJlbmNlIHN0b3JlIGluZGljYXRpbmcgdGhhdCB0aGUgZ2l2ZW4gZW5naW5lCi0JCQkgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHByZWZlcmVuY2Ugc3RvcmUncwotCQkJICogZGVmYXVsdAotCQkJICovCi0JCQlTcGVsbGluZ0VuZ2luZURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRlZmF1bHRTZXJ2aWNlLmdldFNwZWxsaW5nRW5naW5lRGVzY3JpcHRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZW5naW5lSUQuZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldElkKCkpKSB7Ci0JCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBuZXcgU2NvcGVkUHJlZmVyZW5jZVN0b3JlKG5ldyBJbnN0YW5jZVNjb3BlKCksIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJCXN0b3JlLnNldFZhbHVlKFNwZWxsaW5nU2VydmljZS5QUkVGRVJFTkNFX1NQRUxMSU5HX0VOR0lORSwgZW5naW5lSUQpOwotCQkJCQlwcmVmZXJyZWRTZXJ2aWNlID0gbmV3IFNwZWxsaW5nU2VydmljZShzdG9yZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VydmljZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWJvb2xlYW4gc3VwcG9ydGVkID0gZmFsc2U7Ci0JCWlmIChmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXMgPT0gbnVsbCB8fCBmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCXN1cHBvcnRlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0eXBlLmVxdWFscyhmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXNbaV0pKSB7Ci0JCQkJCXN1cHBvcnRlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcG9ydGVkOwotCX0KLQotCXZvaWQgcmVjb25jaWxlKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG5ldyBSZWdpb24oMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJcmVjb25jaWxlKGRvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlpZiAoaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCVRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlID0gbnVsbDsKLQkJSVJlY29uY2lsZVJlc3VsdFtdIGFubm90YXRpb25zVG9BZGQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCBzdHJ1Y3R1cmVkU3RlcCA9IChTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCkgZlNwZWxsaW5nU3RlcDsKLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGRvY3VtZW50LCBnZXREb2N1bWVudFBhcnRpdGlvbmluZygpLCBkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaXNTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlKHBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpKSkgewotCQkJCQkJYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldFNwZWxsaW5nQW5ub3RhdGlvbnNUb1JlbW92ZShwYXJ0aXRpb25zW2ldKTsKLQkJCQkJCWFubm90YXRpb25zVG9BZGQgPSBzdHJ1Y3R1cmVkU3RlcC5yZWNvbmNpbGUoZGlydHlSZWdpb24sIHBhcnRpdGlvbnNbaV0pOwotCi0JCQkJCQlpZiAoYW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgewotCQkJCQkJCUlBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24gbW9kZWxFeHRlbnNpb24gPSAoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgYW5ub3RhdGlvbk1vZGVsOwotCQkJCQkJCU1hcCBhbm5vdGF0aW9uc1RvQWRkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFubm90YXRpb25zVG9BZGQubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQoYW5ub3RhdGlvbnNUb0FkZFtqXSwgKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uc1RvQWRkW2pdKS5nZXRQb3NpdGlvbigpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbW9kZWxFeHRlbnNpb24ucmVwbGFjZUFubm90YXRpb25zKGFubm90YXRpb25zVG9SZW1vdmUsIGFubm90YXRpb25zVG9BZGRNYXApOwotCQkJCQkJfQotCi0JCQkJCQllbHNlIHsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFubm90YXRpb25zVG9BZGQubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJYW5ub3RhdGlvbk1vZGVsLmFkZEFubm90YXRpb24oKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb25zVG9BZGRbal0sICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbnNUb0FkZFtqXSkuZ2V0UG9zaXRpb24oKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGorKykgewotCQkJCQkJCQlhbm5vdGF0aW9uTW9kZWwucmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uc1RvUmVtb3ZlW2pdKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJRGlydHlSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gbmV3IERpcnR5UmVnaW9uKHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5JTlNFUlQsIGRvY3VtZW50LmdldChwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIHBhcnRpdGlvbi5nZXRMZW5ndGgoKSkpOwotCQkJCXJlY29uY2lsZShyZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0KLQkJc3VwZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGZTcGVsbGluZ1N0ZXAgPT0gbnVsbCkgewotCQkJCWNyZWF0ZVJlY29uY2lsZVN0ZXBzKCk7Ci0JCQl9Ci0JCQlmU3BlbGxpbmdTdGVwLnNldElucHV0TW9kZWwobmV3IERvY3VtZW50QWRhcHRlcihkb2N1bWVudCkpOwotCQl9Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Fic3RyYWN0SG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Fic3RyYWN0SG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhMjc5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9BYnN0cmFjdEhvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQuSFRNTFRleHRQcmVzZW50ZXI7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIHByb3ZpZGluZyBob3ZlciBpbmZvcm1hdGlvbiBmb3IgU291cmNlIGVkaXRvci4gSW5jbHVkZXMKLSAqIGEgaG92ZXIgY29udHJvbCBjcmVhdG9yIHdoaWNoIGhhcyB0aGUgIlByZXNzIEYyIGZvciBmb2N1cyIgbWVzc2FnZSBidWlsdAotICogaW4uCi0gKiAKLSAqIEBzaW5jZSBXVFAgMS41Ci0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdEhvdmVyUHJvY2Vzc29yIGltcGxlbWVudHMgSVRleHRIb3ZlciwgSVRleHRIb3ZlckV4dGVuc2lvbiB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXJFeHRlbnNpb24jZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpCi0JICovCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEhvdmVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgU1dULk5PTkUsIG5ldyBIVE1MVGV4dFByZXNlbnRlcih0cnVlKSwgZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hvcnQgY3V0IGFzc2lnbmVkIHRvIHRoZSBzdWIgbWVudSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHNob3J0IGN1dCBpcyBhc3NpZ25lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaG9ydCBjdXQgYXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTaG9ydEN1dFN0cmluZygpIHsKLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlmaW5hbCBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSB3b3JrYmVuY2guZ2V0QWRhcHRlcihJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEFjdGl2ZUJpbmRpbmdzRm9yKEFjdGlvbkRlZmluaXRpb25JZHMuSU5GT1JNQVRJT04pOwotCQlpZiAoYWN0aXZlQmluZGluZ3MubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIGFjdGl2ZUJpbmRpbmdzWzBdLmZvcm1hdCgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCB0aXAgYWZmb3JkYW5jZSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgYWZmb3JkYW5jZSBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZGlzYWJsZWQgb3Igbm8KLQkgKiAgICAgICAgIGtleSBiaW5kaW5nIGlzIGRlZmluZWQKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSB7Ci0JCVN0cmluZyBzdGlja3kgPSBudWxsOwotCQlTdHJpbmcga2V5U2VxdWVuY2UgPSBnZXRTaG9ydEN1dFN0cmluZygpOwotCQlpZiAoa2V5U2VxdWVuY2UgIT0gbnVsbCkgewotCQkJc3RpY2t5ID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy50ZXh0SG92ZXJNYWtlU3RpY2t5SGludCwga2V5U2VxdWVuY2UpOwotCQl9Ci0JCXJldHVybiBzdGlja3k7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4NDc1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5DaGFpbmVkUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklUZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEhvdmVyIGhlbHAgdGhhdCBkaXNwbGF5cyBhbm5vdGF0aW9ucyBzaG93biBpbiB0ZXh0IG9mIGVkaXRvci4gQ3VycmVudGx5LAotICogdGhpcyB0ZXh0IGhvdmVyIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBBYnN0cmFjdFRleHRIb3ZlclByb2Nlc3Nvci4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfQkVHSU4gPSAiPHVsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9FTEVNRU5UID0gIjxsaT4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9FTkQgPSAiPC9wPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX1NUQVJUID0gIjxwPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyBhIG1zZyB0byBhIHByb3BlciBodG1sIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gbXNnIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbXNnIGlzIG5laXRoZXIgbnVsbCBub3IgZW1wdHkgc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCk7Ci0JCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQobXNnKSk7Ci0JCWJ1Zi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIG11bHRpcGxlIG1lc3NhZ2VzIGludG8gcHJvcGVyIGh0bWwgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRNZXNzYWdlcyhMaXN0IG1lc3NhZ2VzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUKTsKLQkJYnVmZmVyLmFwcGVuZChTU0VVSU1lc3NhZ2VzLk11bHRpcGxlX2Vycm9ycyk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChMSVNUX0JFR0lOKTsKLQotCQlJdGVyYXRvciBlID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKExJU1RfRUxFTUVOVCk7Ci0JCQlidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KChTdHJpbmcpIGUubmV4dCgpKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24uIChjb3BpZWQKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuaG92ZXIuQW5ub3RhdGlvbkhvdmVyKQotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbgotCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uUHJlZmVyZW5jZSBnZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQotCQlpZiAoYW5ub3RhdGlvbi5pc01hcmtlZERlbGV0ZWQoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSAoKFNvdXJjZVZpZXdlcikgdmlld2VyKS5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbW9kZWwuZ2V0UG9zaXRpb24oYSk7Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhbiBhbm5vdGF0aW9uIGluIHRoZSByZWdpb24gd2UgYXJlCi0JCQkJLy8gY29uY2VybmVkIHdpdGgKLQkJCQlpZiAocC5vdmVybGFwc1dpdGgoaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCksIGhvdmVyUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQlTdHJpbmcgbXNnID0gYS5nZXRUZXh0KCk7Ci0JCQkJCWlmICgobXNnICE9IG51bGwpICYmIG1zZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvLyBpdCBpcyBwb3NzaWJsZSBmb3IgdGVtcG9yYXJ5IGFubm90YXRpb25zIHRvCi0JCQkJCQkvLyBkdXBsaWNhdGUgb3RoZXIgYW5ub3RhdGlvbnMgc28gbWFrZSBzdXJlIG5vdCB0byBhZGQKLQkJCQkJCS8vIGR1cHMKLQkJCQkJCWlmIChhIGluc3RhbmNlb2YgSVRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCQlib29sZWFuIGR1cGxpY2F0ZWQgPSBmYWxzZTsKLQkJCQkJCQlpbnQgaiA9IDA7Ci0JCQkJCQkJd2hpbGUgKGogPCBtZXNzYWdlcy5zaXplKCkgJiYgIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJZHVwbGljYXRlZCA9IG1lc3NhZ2VzLmdldChqKS5lcXVhbHMobXNnKTsKLQkJCQkJCQkJKytqOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWVzc2FnZXMuc2l6ZSgpID4gMSkgewotCQkJCXJldHVybiBmb3JtYXRNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChtZXNzYWdlcy5zaXplKCkgPiAwKSB7Ci0JCQkJcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZ2V0KDApLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gKChTb3VyY2VWaWV3ZXIpIHRleHRWaWV3ZXIpLmdldEFubm90YXRpb25Nb2RlbCgpOwotCQlSZWdpb24gaG92ZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0JCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldFBvc2l0aW9uKGEpOwotCQkJCWlmIChwLmluY2x1ZGVzKG9mZnNldCkpIHsKLQkJCQkJLy8gZmluZCB0aGUgc21hbGxlc3QgcmVnaW9uIGNvbnRhaW5pbmcgb2Zmc2V0Ci0JCQkJCWlmICgoaG92ZXJSZWdpb24gPT0gbnVsbCkgfHwgKGhvdmVyUmVnaW9uLmdldExlbmd0aCgpID4gcC5nZXRMZW5ndGgoKSkpIHsKLQkJCQkJCWhvdmVyUmVnaW9uID0gbmV3IFJlZ2lvbihwLmdldE9mZnNldCgpLCBwLmdldExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaG92ZXJSZWdpb247Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIHRoZSBwcmVmZXJlbmNlIHN0b3JlIElmIG5vIHByZWZlcmVuY2Ugc3RvcmUgaXMgY3VycmVudGx5Ci0JICogc3RvcmVkLCByZXRyZWl2ZSB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlIGJhc2VFZGl0b3JQcmVmcyA9IEVkaXRvcnNVSS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCWZQcmVmZXJlbmNlU3RvcmUgPSBuZXcgQ2hhaW5lZFByZWZlcmVuY2VTdG9yZShuZXcgSVByZWZlcmVuY2VTdG9yZVtde3NzZUVkaXRvclByZWZzLCBiYXNlRWRpdG9yUHJlZnN9KTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlib29sZWFuIGlzQW5ub3RhdGlvblZhbGlkKEFubm90YXRpb24gYSkgewotCQlBbm5vdGF0aW9uUHJlZmVyZW5jZSBwcmVmZXJlbmNlID0gZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYSk7Ci0JCWlmIChwcmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0ZXh0UHJlZmVyZW5jZUtleSA9IHByZWZlcmVuY2UuZ2V0VGV4dFByZWZlcmVuY2VLZXkoKTsKLQkJU3RyaW5nIGhpZ2hsaWdodFByZWZlcmVuY2VLZXkgPSBwcmVmZXJlbmNlLmdldEhpZ2hsaWdodFByZWZlcmVuY2VLZXkoKTsKLQkJaWYgKHRleHRQcmVmZXJlbmNlS2V5ID09IG51bGwgfHwgIShnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKHRleHRQcmVmZXJlbmNlS2V5KSkgfHwgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleSA9PSBudWxsIHx8IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oaGlnaGxpZ2h0UHJlZmVyZW5jZUtleSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Jlc3RNYXRjaEhvdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9CZXN0TWF0Y2hIb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFjNjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Jlc3RNYXRjaEhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYmVzdCBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gKGJ5IHVzaW5nIG90aGVyIGhvdmVyIGhlbHAKLSAqIHByb2Nlc3NvcnMpIFByaW9yaXR5IG9mIGhvdmVyIGhlbHAgcHJvY2Vzc29ycyBpczogUHJvYmxlbUhvdmVyUHJvY2Vzc29yLAotICogVGFnSW5mb1Byb2Nlc3NvciwgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBCZXN0TWF0Y2hIb3ZlciBpbXBsZW1lbnRzIElUZXh0SG92ZXIsIElUZXh0SG92ZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmQmVzdE1hdGNoSG92ZXI7IC8vIGN1cnJlbnQgYmVzdCBtYXRjaCB0ZXh0IGhvdmVyCi0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUYWdJbmZvSG92ZXI7IC8vIGRvY3VtZW50YXRpb24vaW5mb3JtYXRpb24gaG92ZXIKLQlwcml2YXRlIExpc3QgZlRleHRIb3ZlcnM7IC8vIGxpc3Qgb2YgdGV4dCBob3ZlcnMgdG8gY29uc2lkZXIgaW4gYmVzdAotCS8vIG1hdGNoCi0KLQlwdWJsaWMgQmVzdE1hdGNoSG92ZXIoSVRleHRIb3ZlciBpbmZvdGFnaG92ZXIpIHsKLQkJZlRhZ0luZm9Ib3ZlciA9IGluZm90YWdob3ZlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBsaXN0IG9mIHRleHQgaG92ZXJzIGFwcGxpY2FibGUgdG8gdGhpcyBiZXN0IG1hdGNoIGhvdmVyCi0JICogcHJvY2Vzc29yCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIElUZXh0SG92ZXIgLSBpbiBhYnN0cmFjdCBjbGFzcyB0aGlzIGlzIGVtcHR5IGxpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgY3JlYXRlVGV4dEhvdmVyc0xpc3QoKSB7Ci0JCUxpc3QgaG92ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBpZiBjdXJyZW50bHkgZGVidWdnaW5nLCB0aGVuIGFkZCB0aGUgZGVidWcgaG92ZXIgdG8gdGhlIGxpc3Qgb2YKLQkJLy8gYmVzdCBtYXRjaAotCQlpZiAoTG9nZ2VyLmlzVHJhY2luZyhEZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5UUkFDRUZJTFRFUikpIHsKLQkJCWhvdmVyTGlzdC5hZGQobmV3IERlYnVnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCQl9Ci0KLQkJaG92ZXJMaXN0LmFkZChuZXcgUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvcigpKTsKLQkJaWYgKGZUYWdJbmZvSG92ZXIgIT0gbnVsbCkgewotCQkJaG92ZXJMaXN0LmFkZChmVGFnSW5mb0hvdmVyKTsKLQkJfQotCQlob3Zlckxpc3QuYWRkKG5ldyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKSk7Ci0JCXJldHVybiBob3Zlckxpc3Q7Ci0JfQotCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEhvdmVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCUlJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGNyZWF0b3IgPSBudWxsOwotCi0JCWlmIChmQmVzdE1hdGNoSG92ZXIgaW5zdGFuY2VvZiBJVGV4dEhvdmVyRXh0ZW5zaW9uKSB7Ci0JCQljcmVhdG9yID0gKChJVGV4dEhvdmVyRXh0ZW5zaW9uKSBmQmVzdE1hdGNoSG92ZXIpLmdldEhvdmVyQ29udHJvbENyZWF0b3IoKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlckluZm8ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gaG92ZXJSZWdpb24pIHsKLQkJU3RyaW5nIGRpc3BsYXlUZXh0ID0gbnVsbDsKLQotCQkvLyBhbHJlYWR5IGhhdmUgYSBiZXN0IG1hdGNoIGhvdmVyIHBpY2tlZCBvdXQgZnJvbSBnZXRIb3ZlclJlZ2lvbiBjYWxsCi0JCWlmIChmQmVzdE1hdGNoSG92ZXIgIT0gbnVsbCkgewotCQkJZGlzcGxheVRleHQgPSBmQmVzdE1hdGNoSG92ZXIuZ2V0SG92ZXJJbmZvKHZpZXdlciwgaG92ZXJSZWdpb24pOwotCQl9Ci0JCS8vIGVpdGhlciBoYWQgbm8gYmVzdCBtYXRjaCBob3ZlciBvciBiZXN0IG1hdGNoIGhvdmVyIHJldHVybmVkIG51bGwKLQkJaWYgKGRpc3BsYXlUZXh0ID09IG51bGwpIHsKLQkJCS8vIGdvIHRocm91Z2ggbGlzdCBvZiB0ZXh0IGhvdmVycyBhbmQgcmV0dXJuIGZpcnN0IGRpc3BsYXkgc3RyaW5nCi0JCQlJdGVyYXRvciBpID0gZ2V0VGV4dEhvdmVycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoKGkuaGFzTmV4dCgpKSAmJiAoZGlzcGxheVRleHQgPT0gbnVsbCkpIHsKLQkJCQlJVGV4dEhvdmVyIGhvdmVyID0gKElUZXh0SG92ZXIpIGkubmV4dCgpOwotCQkJCWRpc3BsYXlUZXh0ID0gaG92ZXIuZ2V0SG92ZXJJbmZvKHZpZXdlciwgaG92ZXJSZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaXNwbGF5VGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlclJlZ2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJUmVnaW9uIGhvdmVyUmVnaW9uID0gbnVsbDsKLQotCQkvLyBnbyB0aHJvdWdoIGxpc3Qgb2YgdGV4dCBob3ZlcnMgYW5kIHJldHVybiBmaXJzdCBob3ZlciByZWdpb24KLQkJSVRleHRIb3ZlciBob3ZlciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRUZXh0SG92ZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKChpLmhhc05leHQoKSkgJiYgKGhvdmVyUmVnaW9uID09IG51bGwpKSB7Ci0JCQlob3ZlciA9IChJVGV4dEhvdmVyKSBpLm5leHQoKTsKLQkJCWhvdmVyUmVnaW9uID0gaG92ZXIuZ2V0SG92ZXJSZWdpb24odmlld2VyLCBvZmZzZXQpOwotCQl9Ci0KLQkJLy8gc3RvcmUgdGhlIHRleHQgaG92ZXIgcHJvY2Vzc29yIHRoYXQgZm91bmQgcmVnaW9uCi0JCWlmIChob3ZlclJlZ2lvbiAhPSBudWxsKQotCQkJZkJlc3RNYXRjaEhvdmVyID0gaG92ZXI7Ci0JCWVsc2UKLQkJCWZCZXN0TWF0Y2hIb3ZlciA9IG51bGw7Ci0KLQkJcmV0dXJuIGhvdmVyUmVnaW9uOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRUZXh0SG92ZXJzKCkgewotCQlpZiAoZlRleHRIb3ZlcnMgPT0gbnVsbCkgewotCQkJZlRleHRIb3ZlcnMgPSBjcmVhdGVUZXh0SG92ZXJzTGlzdCgpOwotCQl9Ci0JCXJldHVybiBmVGV4dEhvdmVyczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9EZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vRGVidWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyOTJhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9EZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGRlYnVnIGhvdmVyIGhlbHAKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIKLSAqLwotcHVibGljIGNsYXNzIERlYnVnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVIgPSAiZGVidWdpbmZvaG92ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0KLQlwdWJsaWMgRGVidWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCVN0cmluZyBkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCWlmICgoaG92ZXJSZWdpb24gPT0gbnVsbCkgfHwgKHZpZXdlciA9PSBudWxsKSB8fCAodmlld2VyLmdldERvY3VtZW50KCkgPT0gbnVsbCkpIHsKLQkJCWRpc3BsYXlUZXh0ID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWludCBvZmZzZXQgPSBob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKTsKLQotCQkJSVR5cGVkUmVnaW9uIHJlZ2lvbjsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gdmlld2VyLmdldERvY3VtZW50KCkuZ2V0UGFydGl0aW9uKG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWRpc3BsYXlUZXh0ID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRpc3BsYXlUZXh0ID0gIk51bGwgUmVnaW9uIHdhcyByZXR1cm5lZD8hIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzcGxheVRleHQgPSAiQmFkTG9jYXRpb25FeGNlcHRpb24gT2NjdXJyZWQhPyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBkaXNwbGF5VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb24gdG8gaG92ZXIgdGhlIHRleHQgb3ZlciBiYXNlZCBvbiB0aGUgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqIAotCSAqIEByZXR1cm4gSVJlZ2lvbiByZWdpb24gdG8gaG92ZXIgb3ZlciBpZiBvZmZzZXQgaXMgbm90IG92ZXIgaW52YWxpZAotCSAqICAgICAgICAgd2hpdGVzcGFjZS4gb3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNlZSBJVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKCh0ZXh0Vmlld2VyID09IG51bGwpIHx8ICh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkgPT0gbnVsbCkpIHsKLQkJCXJlZ2lvbiA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE0YzAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL1Byb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkRlZmF1bHRNYXJrZXJBbm5vdGF0aW9uQWNjZXNzOwotCi0vKioKLSAqIEhvdmVyIGhlbHAgdGhhdCBkaXNwbGF5cyBwcm9ibGVtIGFubm90YXRpb25zIHdoZW4gc2hvd24gaW4gdGV4dCBvZiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFByb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IgZXh0ZW5kcyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IgewotCi0JLy8gdGhlc2Ugc3RyaW5ncyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhbm5vdGF0aW9uVHlwZXMgZXh0ZW5zaW9uIGluCi0JLy8gb3JnLmVjbGlwc2UudWkuZWRpdG9ycyBwbHVnaW4KLQkvLyBpZiB0aG9zZSBzdHJpbmdzIGNoYW5nZSwgdGhlbiB0aGVzZSBzdHJpbmdzIG5lZWQgdG8gY2hhbmdlIGFzIHdlbGwKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBBTk5PVEFUSU9OX0VSUk9SID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5lcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBBTk5PVEFUSU9OX1dBUk5JTkcgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBEZWZhdWx0TWFya2VyQW5ub3RhdGlvbkFjY2VzcyBmQW5ub3RhdGlvbkFjY2VzcyA9IG5ldyBEZWZhdWx0TWFya2VyQW5ub3RhdGlvbkFjY2VzcygpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBQcm9ibGVtQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRhZ2luZm8uQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yI2lzQW5ub3RhdGlvblZhbGlkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uVmFsaWQoQW5ub3RhdGlvbiBhKSB7Ci0JCVN0cmluZyB0eXBlID0gYS5nZXRUeXBlKCk7Ci0JCWlmIChmQW5ub3RhdGlvbkFjY2Vzcy5pc1N1YnR5cGUodHlwZSwgQU5OT1RBVElPTl9FUlJPUikgfHwgZkFubm90YXRpb25BY2Nlc3MuaXNTdWJ0eXBlKHR5cGUsIEFOTk9UQVRJT05fV0FSTklORykpCi0JCQlyZXR1cm4gc3VwZXIuaXNBbm5vdGF0aW9uVmFsaWQoYSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9UZXh0SG92ZXJNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9UZXh0SG92ZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWFmMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vVGV4dEhvdmVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIE1hbmFnZXMgdGV4dCBob3ZlcnMgZm9yIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFRleHRIb3Zlck1hbmFnZXIgewotCS8qKgotCSAqIENvbnRhaW5zIGRlc2NyaXB0aW9uIG9mIGEgdGV4dCBob3ZlcgotCSAqLwotCXB1YmxpYyBjbGFzcyBUZXh0SG92ZXJEZXNjcmlwdG9yIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCQlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZWQ7Ci0JCXByaXZhdGUgU3RyaW5nIGZJZDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkxhYmVsOwotCQlwcml2YXRlIFN0cmluZyBmTW9kaWZpZXJTdHJpbmc7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBpZAotCQkgKiBAcGFyYW0gbGFiZWwKLQkJICogQHBhcmFtIGRlc2MKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYykgewotCQkJZklkID0gaWQ7Ci0JCQlmTGFiZWwgPSBsYWJlbDsKLQkJCWZEZXNjcmlwdGlvbiA9IGRlc2M7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGlkCi0JCSAqIEBwYXJhbSBsYWJlbAotCQkgKiBAcGFyYW0gZGVzYwotCQkgKiBAcGFyYW0gZW5hYmxlZAotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYywgYm9vbGVhbiBlbmFibGVkLCBTdHJpbmcgbW9kaWZpZXJTdHJpbmcpIHsKLQkJCWZJZCA9IGlkOwotCQkJZkxhYmVsID0gbGFiZWw7Ci0JCQlmRGVzY3JpcHRpb24gPSBkZXNjOwotCQkJZkVuYWJsZWQgPSBlbmFibGVkOwotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmRGVzY3JpcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZJZC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gZklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkxhYmVsCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGZMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZNb2RpZmllclN0cmluZy4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXJTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZk1vZGlmaWVyU3RyaW5nOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkVuYWJsZWQuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gZkVuYWJsZWQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVuYWJsZWQKLQkJICogICAgICAgICAgICBUaGUgZkVuYWJsZWQgdG8gc2V0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWZFbmFibGVkID0gZW5hYmxlZDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICogICAgICAgICAgICBUaGUgZk1vZGlmaWVyU3RyaW5nIHRvIHNldC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyU3RyaW5nKFN0cmluZyBtb2RpZmllclN0cmluZykgewotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0hPVkVSID0gImFubm90YXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3Qgb2YgZGlmZmVyZW50IHR5cGVzIG9mIFNvdXJjZSBlZGl0b3IgaG92ZXJzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklOQVRJT05fSE9WRVIgPSAiY29tYmluYXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBob3ZlciBkZXNjcmlwdGlvbnMgYXJlIGluIC5wcm9wZXJ0aWVzIGZpbGUgd2l0aCB0aGUga2V5IGluIHRoZSBmb3JtIG9mCi0JLy8gIltpZF1fZGVzYyIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fS0VZID0gIl9kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fSE9WRVIgPSAiZG9jdW1lbnRhdGlvbkhvdmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1ZFUl9TRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGhvdmVyIGxhYmVscyBhcmUgaW4gLnByb3BlcnRpZXMgZmlsZSB3aXRoIHRoZSBrZXkgaW4gdGhlIGZvcm0gb2YKLQkvLyAiW2lkXV9sYWJlbCIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfS0VZID0gIl9sYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01PRElGSUVSID0gIjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9IT1ZFUiA9ICJwcm9ibGVtSG92ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBURVhUX0hPVkVSX0lEUyA9IG5ldyBTdHJpbmdbXXtDT01CSU5BVElPTl9IT1ZFUiwgUFJPQkxFTV9IT1ZFUiwgRE9DVU1FTlRBVElPTl9IT1ZFUiwgQU5OT1RBVElPTl9IT1ZFUn07Ci0JLyoqCi0JICogQ3VycmVudCBsaXN0IG9mIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3IgdGV4dCBob3ZlcnMKLQkgKi8KLQlwcml2YXRlIFRleHRIb3ZlckRlc2NyaXB0b3JbXSBmVGV4dEhvdmVyczsKLQotCXB1YmxpYyBUZXh0SG92ZXJNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlc3QgbWF0Y2ggaG92ZXIgd2l0aCB0aGUgZ2l2ZSB0ZXh0IGhvdmVyIGFzIHRoZSBkb2N1bWVudGF0aW9uCi0JICogaG92ZXIKLQkgKiAKLQkgKiBAcGFyYW0gaW5mb0hvdmVyCi0JICogQHJldHVybiBJVGV4dEhvdmVyCi0JICovCi0JcHVibGljIElUZXh0SG92ZXIgY3JlYXRlQmVzdE1hdGNoSG92ZXIoSVRleHRIb3ZlciBpbmZvSG92ZXIpIHsKLQkJcmV0dXJuIG5ldyBCZXN0TWF0Y2hIb3ZlcihpbmZvSG92ZXIpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIGEgbGlzdCBvZiB0ZXh0IGhvdmVyIGRlc2NyaXB0b3JzIGZyb20gdGhlIGdpdmVuIGRlbGltaXRlZAotCSAqIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB0ZXh0SG92ZXJTdHJpbmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yW10gZ2VuZXJhdGVUZXh0SG92ZXJEZXNjcmlwdG9ycyhTdHJpbmcgdGV4dEhvdmVyU3RyaW5ncykgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHRIb3ZlclN0cmluZ3MsIEhPVkVSX1NFUEFSQVRPUik7Ci0KLQkJLy8gcmVhZCBmcm9tIHByZWZlcmVuY2UgYW5kIGxvYWQgaWQtZGVzY3JpcHRvciBtYXBwaW5nIHRvIGEgaGFzaCB0YWJsZQotCQlIYXNoTWFwIGlkVG9Nb2RpZmllciA9IG5ldyBIYXNoTWFwKHN0LmNvdW50VG9rZW5zKCkpOwotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdGV4dEhvdmVyU3RyaW5nID0gc3QubmV4dFRva2VuKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0SG92ZXJTdHJpbmcsIEhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IpOwotCQkJaWYgKHN0Mi5jb3VudFRva2VucygpID09IDMpIHsKLQkJCQlTdHJpbmcgaWQgPSBzdDIubmV4dFRva2VuKCk7Ci0JCQkJYm9vbGVhbiBlbmFibGVkID0gQm9vbGVhbi52YWx1ZU9mKHN0Mi5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJU3RyaW5nIG1vZGlmaWVyU3RyaW5nID0gc3QyLm5leHRUb2tlbigpOwotCQkJCWlmIChtb2RpZmllclN0cmluZy5lcXVhbHMoTk9fTU9ESUZJRVIpKQotCQkJCQltb2RpZmllclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGlkICsgTEFCRUxfS0VZKTsKLQkJCQkJZGVzY3JpcHRpb24gPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGlkICsgREVTQ1JJUFRJT05fS0VZKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJVGV4dEhvdmVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRIb3ZlckRlc2NyaXB0b3IoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZW5hYmxlZCwgbW9kaWZpZXJTdHJpbmcpOwotCQkJCS8vIHNob3VsZCBjaGVjayB0byBzZWUgaWYgaWRzIGFwcGVhciBtb3JlIHRoYW4gb25jZQotCQkJCWlkVG9Nb2RpZmllci5wdXQoaWQsIGRlc2NyaXB0b3IpOwotCQkJfQotCQl9Ci0KLQkJLy8gZ28gdGhyb3VnaCBhbGwgZGVmaW5lZCB0ZXh0IGhvdmVycyBhbmQgbWF0Y2ggd2l0aCB0aGVpciBwcmVmZXJlbmNlCi0JCVRleHRIb3ZlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBUZXh0SG92ZXJEZXNjcmlwdG9yW1RFWFRfSE9WRVJfSURTLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVYVF9IT1ZFUl9JRFMubGVuZ3RoOyBpKyspIHsKLQkJCVRleHRIb3ZlckRlc2NyaXB0b3IgZGVzYyA9IChUZXh0SG92ZXJEZXNjcmlwdG9yKSBpZFRvTW9kaWZpZXIuZ2V0KFRFWFRfSE9WRVJfSURTW2ldKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9yc1tpXSA9IGRlc2M7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKFRFWFRfSE9WRVJfSURTW2ldICsgTEFCRUxfS0VZKTsKLQkJCQkJZGVzY3JpcHRpb24gPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKFRFWFRfSE9WRVJfSURTW2ldICsgREVTQ1JJUFRJT05fS0VZKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgVGV4dEhvdmVyRGVzY3JpcHRvcihURVhUX0hPVkVSX0lEU1tpXSwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgaG92ZXJzIGZvciBTdHJ1Y3R1cmVkIFRleHQgZWRpdG9yLiBJZiBmVGV4dEhvdmVyIGhhcwotCSAqIG5vdCBiZWVuIGluaXRpYWxpZWQsIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmVGV4dEhvdmVycy4KLQkgKi8KLQlwdWJsaWMgVGV4dEhvdmVyRGVzY3JpcHRvcltdIGdldFRleHRIb3ZlcnMoKSB7Ci0JCWlmIChmVGV4dEhvdmVycyA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGV4dEhvdmVyU3RyaW5ncyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTKTsKLQkJCWZUZXh0SG92ZXJzID0gZ2VuZXJhdGVUZXh0SG92ZXJEZXNjcmlwdG9ycyh0ZXh0SG92ZXJTdHJpbmdzKTsKLQkJfQotCQlyZXR1cm4gZlRleHRIb3ZlcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmVGV4dEhvdmVycyB0byBudWxsIHNvIHRoYXQgbmV4dCB0aW1lIGdldFRleHRIb3ZlcnMgaXMgY2FsbGVkLAotCSAqIGZUZXh0SG92ZXJzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIGxhdGVzdCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFRleHRIb3ZlcnMoKSB7Ci0JCWZUZXh0SG92ZXJzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGV4dC9Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGV4dC9Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZDIwZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RleHQvRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogTWF0Y2hlcyB0aGUgc3RhcnQgYW5kIGVuZGluZyBjaGFyYWN0ZXJzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHdpdGgKLSAqIHRoZSBnaXZlbiBhbGxvd2VkIHR5cGVzLiBOb3RlIHRoYXQgRWNsaXBzZSBSM004IG9ubHkgcGFpbnRzIHNpbmdsZQotICogY2hhcmFjdGVyLXdpZGUgbWF0Y2hlcyBhbmQgdGhpcyBpc24ndCB0cnVlIHBhaXIgbWF0Y2hpbmcgYmVoYXZpb3IuIFNlZSBSRkUKLSAqICM1NjgzNiBhdCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTY4MzYuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNoYXJhY3RlcnBhaXJtYXRjaGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGludCBmQW5jaG9yOwotCi0JcHJvdGVjdGVkIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciBmTmV4dE1hdGNoZXI7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmUmVnaW9uVHlwZXM7Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcihTdHJpbmdbXSB2YWxpZENvbnRleHRzLCBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgbmV4dE1hdGNoZXIpIHsKLQkJZlJlZ2lvblR5cGVzID0gQXJyYXlzLmFzTGlzdCh2YWxpZENvbnRleHRzKTsKLQkJZk5leHRNYXRjaGVyID0gbmV4dE1hdGNoZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChmTmV4dE1hdGNoZXIgIT0gbnVsbCkKLQkJCWZOZXh0TWF0Y2hlci5jbGVhcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmTmV4dE1hdGNoZXIgIT0gbnVsbCkKLQkJCWZOZXh0TWF0Y2hlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJaWYgKGZBbmNob3IgPCAwICYmIGZOZXh0TWF0Y2hlciAhPSBudWxsKQotCQkJcmV0dXJuIGZOZXh0TWF0Y2hlci5nZXRBbmNob3IoKTsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjbWF0Y2gob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWlmKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IGRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJUmVnaW9uIG1hdGNoID0gbnVsbDsKLQkJaWYgKCFmUmVnaW9uVHlwZXMuaXNFbXB0eSgpICYmIGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGRvY1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gbG9vayBhdCB0aGUgcHJldmlvdXMgZG9jdW1lbnQgcmVnaW9uIGZpcnN0IHNpbmNlIGl0cyBlbmQgPT0KLQkJCQkvLyB0aGlzIG9uZSdzIHN0YXJ0Ci0JCQkJaWYgKGRvY1JlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgZG9jUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0RW5kT2Zmc2V0KCkgPT0gb2Zmc2V0ICYmIGZSZWdpb25UeXBlcy5jb250YWlucyhkb2NSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRUeXBlKCkpKSB7Ci0JCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuUklHSFQ7Ci0JCQkJCW1hdGNoID0gbmV3IFJlZ2lvbihkb2NSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgZm9yIG9mZnNldCBpbiB0aGUgbGFzdCB0ZXh0IHJlZ2lvbiBmb3IgYSBtYXRjaCB0bwotCQkJCS8vIGRvY3VtZW50IHJlZ2lvbiBzdGFydCBvZmZzZXQKLQkJCQllbHNlIGlmIChmUmVnaW9uVHlwZXMuY29udGFpbnMoZG9jUmVnaW9uLmdldFR5cGUoKSkgJiYgZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGRvY1JlZ2lvbi5nZXRMYXN0UmVnaW9uKCkpIDw9IG9mZnNldCAmJiBvZmZzZXQgPD0gZG9jUmVnaW9uLmdldEVuZE9mZnNldChkb2NSZWdpb24uZ2V0TGFzdFJlZ2lvbigpKSkgewotCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLlJJR0hUOwotCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIDEpOwotCQkJCX0KLQkJCQkvLyBjaGVjayBmb3Igb2Zmc2V0IGluIHRoZSBmaXJzdCB0ZXh0IHJlZ2lvbiBmb3IgYSBtYXRjaCB0bwotCQkJCS8vIGRvY3VtZW50IHJlZ2lvbiBlbmQgb2Zmc2V0Ci0JCQkJZWxzZSBpZiAoZlJlZ2lvblR5cGVzLmNvbnRhaW5zKGRvY1JlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCWlmIChkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZG9jUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkpIDw9IG9mZnNldCAmJiBvZmZzZXQgPD0gZG9jUmVnaW9uLmdldEVuZE9mZnNldChkb2NSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKSkpIHsKLQkJCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQkJCQkJCW1hdGNoID0gbmV3IFJlZ2lvbihkb2NSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSAxLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobWF0Y2ggPT0gbnVsbCAmJiBmTmV4dE1hdGNoZXIgIT0gbnVsbCkgewotCQkJZkFuY2hvciA9IC0xOwotCQkJbWF0Y2ggPSBmTmV4dE1hdGNoZXIubWF0Y2goZG9jdW1lbnQsIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91aS9PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL09mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTdiZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL09mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNpbXBsZU1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBuc2QgQSBTdGF0dXMgTGluZSBjb250cmlidXRpb24gaW50ZW5kZWQgdG8gZGlzcGxheSB0aGUgc2VsZWN0ZWQKLSAqICAgICAgICAgb2Zmc2V0cyBpbiBhbiBlZGl0b3IuIERvdWJsZS1jbGlja2luZyBzaG93cyBpbmZvcm1hdGlvbiBhYm91dAotICogICAgICAgICBwYXJ0aXRpb25zLCBkb2N1bWVudCByZWdpb25zLCBhbm5vdGF0aW9ucywgYW5kIHNlbGVjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIGV4dGVuZHMgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gewotCi0JY2xhc3MgQW5ub3RhdGlvblByb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlIHsKLQkJQW5ub3RhdGlvbiBmQW5ub3RhdGlvbiA9IG51bGw7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCQlTdHJpbmdbXSBURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTID0gbmV3IFN0cmluZ1tdeyJQYXJ0aXRpb24gVHlwZSIsICJTdGVwIiwgIlNjb3BlIiwgIk9mZnNldCIsICJMZW5ndGgiLCAiRGVzY3JpcHRpb24ifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQotCQlwdWJsaWMgQW5ub3RhdGlvblByb3BlcnR5U291cmNlKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCWZBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQkJaWYgKGZEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkJTWFwIGF0dHJzID0gKChTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0TWFya2VyKCkuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJT2JqZWN0W10ga2V5cyA9IGF0dHJzLmtleVNldCgpLnRvQXJyYXkoKTsKLQotCQkJCQkJZkRlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3Jba2V5cy5sZW5ndGhdOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3Ioa2V5c1tpXS50b1N0cmluZygpLCBrZXlzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJCWZEZXNjcmlwdG9yc1tpXSA9IGRlc2NyaXB0b3I7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJCQlPYmplY3Qga2V5ID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0S2V5KCk7Ci0JCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJCVN0cmluZ1tdIGtleXMgPSBURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTOwotCQkJCQkJCWZEZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2tleXMubGVuZ3RoXTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3Ioa2V5c1tpXS50b1N0cmluZygpLCBrZXlzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJCQlmRGVzY3JpcHRvcnNbaV0gPSBkZXNjcmlwdG9yOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZEZXNjcmlwdG9ycyA9PSBudWxsKQotCQkJCWZEZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQkJcmV0dXJuIGZEZXNjcmlwdG9yczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQlpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJT2JqZWN0IG87Ci0JCQkJdHJ5IHsKLQkJCQkJbyA9ICgoU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZXMoKS5nZXQoaWQpOwotCQkJCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IG8udG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJaWYgKFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVNbMF0uZXF1YWxzKGlkKSkgewotCQkJCQlPYmplY3Qga2V5ID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0S2V5KCk7Ci0JCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkgaW5zdGFuY2VvZiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSB7Ci0JCQkJCQl2YWx1ZSA9ICgoUmVjb25jaWxlQW5ub3RhdGlvbktleSkga2V5KS5nZXRQYXJ0aXRpb25UeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1sxXS5lcXVhbHMoaWQpKSB7Ci0JCQkJCU9iamVjdCBrZXkgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRLZXkoKTsKLQkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleSBpbnN0YW5jZW9mIFJlY29uY2lsZUFubm90YXRpb25LZXkpIHsKLQkJCQkJCUlSZWNvbmNpbGVTdGVwIHN0ZXAgPSAoKFJlY29uY2lsZUFubm90YXRpb25LZXkpIGtleSkuZ2V0U3RlcCgpOwotCQkJCQkJaWYgKHN0ZXAgIT0gbnVsbCkgewotCQkJCQkJCXZhbHVlID0gc3RlcC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTWzJdLmVxdWFscyhpZCkpIHsKLQkJCQkJT2JqZWN0IGtleSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldEtleSgpOwotCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJaW50IHNjb3BlID0gKChSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSBrZXkpLmdldFNjb3BlKCk7Ci0JCQkJCQlpZiAoc2NvcGUgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMKSB7Ci0JCQkJCQkJdmFsdWUgPSAiUEFSVElBTCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzY29wZSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQkJdmFsdWUgPSAiVE9UQUwiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1szXS5lcXVhbHMoaWQpKSB7Ci0JCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihmQW5ub3RhdGlvbik7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gU3RyaW5nLnZhbHVlT2YocC5nZXRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1s0XS5lcXVhbHMoaWQpKSB7Ci0JCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihmQW5ub3RhdGlvbik7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gU3RyaW5nLnZhbHVlT2YocC5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1s1XS5lcXVhbHMoaWQpKSB7Ci0JCQkJCXZhbHVlID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCSgoU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmUoaWQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkoKE1hcmtlckFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRNYXJrZXIoKS5zZXRBdHRyaWJ1dGUoaWQudG9TdHJpbmcoKSwgdmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIEluZm9ybWF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCQlJRG9jdW1lbnQgZkRvY3VtZW50ID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCi0JCXB1YmxpYyBJbmZvcm1hdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uVGFiQ29udGVudHMoQ29tcG9zaXRlIGFubm90YXRpb25zVGFiQ29tcG9zaXRlKSB7Ci0JCQlhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkJZmluYWwgQ29tcG9zaXRlIGFubm90YXRpb25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJYW5ub3RhdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJCWZpbmFsIFRhYmxlVmlld2VyIGFubm90YXRpb25zVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoYW5ub3RhdGlvbnNDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJCWFubm90YXRpb25zVGFibGUuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJYW5ub3RhdGlvbnNUYWJsZS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCVN0cmluZ1tdIGNvbHVtbnMgPSBuZXcgU3RyaW5nW117IkxpbmUiLCAiT3duZXIiLCAiVHlwZSIsICJDbGFzcyIsICJNZXNzYWdlIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJYW5ub3RhdGlvbnNUYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBlbGVtZW50OwotCQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQkJCWNhc2UgMCA6Ci0JCQkJCQkJdGV4dCA9IGdldExpbmVOdW1iZXIoYW5ub3RhdGlvbik7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDEgOgotCQkJCQkJCXRleHQgPSBnZXRPd25lcihhbm5vdGF0aW9uKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJdGV4dCA9IGdldFR5cGUoYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJdGV4dCA9IGFubm90YXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQgOgotCQkJCQkJCXRleHQgPSBhbm5vdGF0aW9uLmdldFRleHQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAodGV4dCA9PSBudWxsKQotCQkJCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0ZXh0OwotCQkJCX0KLQotCi0JCQkJcHJpdmF0ZSBTdHJpbmcgZ2V0T3duZXIoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQkJCVN0cmluZyBvd25lciA9IG51bGw7Ci0JCQkJCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkJb3duZXIgPSAoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZSgib3duZXIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJCQlPYmplY3Qga2V5ID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRLZXkoKTsKLQkJCQkJCWlmIChrZXkgIT0gbnVsbCkgewotCQkJCQkJCWlmIChrZXkgaW5zdGFuY2VvZiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSB7Ci0JCQkJCQkJCWtleSA9IGtleS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGtleSAhPSBudWxsKQotCQkJCQkJCQlvd25lciA9IGtleS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBvd25lcjsKLQkJCQl9Ci0KLQkJCQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCQkJCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkJdHlwZSA9IE1hcmtlclV0aWxpdGllcy5nZXRNYXJrZXJUeXBlKCgoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0TWFya2VyKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdHlwZSA9IGFubm90YXRpb24uZ2V0VHlwZSgpOwotCQkJCQl9Ci0JCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCQl0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHR5cGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQkJCX0pOwotCi0JCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5zLmxlbmd0aF07Ci0JCQlpbnQgY29sdW1uV2lkdGhzW10gPSBuZXcgaW50W117RGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAxNCwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA3LCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDcsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gMTQsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gN307Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSkpOwotCQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKGFubm90YXRpb25zVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoY29sdW1uc1tpXSk7Ci0JCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJCXRjLnNldFdpZHRoKGNvbHVtbldpZHRoc1tpXSk7Ci0JCQl9Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5zKTsKLQkJCUxpc3QgbWF0Y2hpbmdBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlpZiAoYW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUFubm90YXRpb24gZWxlbWVudCA9IChBbm5vdGF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAodHJ1ZSkgewotCQkJCQkJCW1hdGNoaW5nQW5ub3RhdGlvbnMuYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYW5ub3RhdGlvbnNUYWJsZS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0SW5wdXQobWF0Y2hpbmdBbm5vdGF0aW9ucyk7Ci0KLQkJCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoKGFubm90YXRpb25zQ29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0KLQkJCWZpbmFsIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXQgPSBuZXcgUHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJCXByb3BlcnR5U2hlZXQuY3JlYXRlQ29udHJvbChhbm5vdGF0aW9uc0NvbXBvc2l0ZSk7Ci0JCQlwcm9wZXJ0eVNoZWV0LnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotCQkJCQkJSVByb3BlcnR5U291cmNlIGFubm90YXRpb25Qcm9wZXJ0eVNvdXJjZSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlTb3VyY2UoKChBbm5vdGF0aW9uKSBvYmplY3QpKTsKLQkJCQkJCXJldHVybiBhbm5vdGF0aW9uUHJvcGVydHlTb3VyY2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWFubm90YXRpb25zVGFibGUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXByb3BlcnR5U2hlZXQuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCQlhbm5vdGF0aW9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoZm9ybSk7Ci0KLQkJCUZvcm1EYXRhIHRhYmxlRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJdGFibGVEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXRhYmxlRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMik7Ci0JCQl0YWJsZURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXRhYmxlRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJYW5ub3RhdGlvbnNUYWJsZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YSh0YWJsZURhdGEpOwotCi0JCQlGb3JtRGF0YSBwcm9wZXJ0aWVzRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJcHJvcGVydGllc0RhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDIpOwotCQkJcHJvcGVydGllc0RhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXByb3BlcnRpZXNEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCQlwcm9wZXJ0aWVzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCXByb3BlcnR5U2hlZXQuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEocHJvcGVydGllc0RhdGEpOwotCi0JCQlmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDYwLCAwKTsKLQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlzYXNoRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQkJCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueSk7Ci0JCQkJCWFubm90YXRpb25zQ29tcG9zaXRlLmxheW91dCgpOwotCQkJCX0KLQkJCX0pOwotCQkJYW5ub3RhdGlvbnNDb21wb3NpdGUucGFjayh0cnVlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbDsKLQkJCXBhcmVudC5nZXRTaGVsbCgpLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8wICsgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArICItIiArICh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJCVRleHQgZG9jdW1lbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZG9jdW1lbnRUeXBlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlkb2N1bWVudFR5cGVMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNiArIGZEb2N1bWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJVGV4dCBkb2N1bWVudFByb3ZpZGVyTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZG9jdW1lbnRQcm92aWRlckxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJZG9jdW1lbnRQcm92aWRlckxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV83ICsgZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlUZXh0IGVkaXRvcklucHV0TGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZWRpdG9ySW5wdXRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWVkaXRvcklucHV0TGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEyICsgZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJVGV4dCBtb2RlbENvbnRlbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJbW9kZWxDb250ZW50VHlwZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsQ29udGVudFR5cGVMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNCArIG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJVGV4dCBtb2RlbEhhbmRsZXJDb250ZW50VHlwZUxhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQltb2RlbEhhbmRsZXJDb250ZW50VHlwZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsSGFuZGxlckNvbnRlbnRUeXBlTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzUgKyBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKSArICIgKCIgKyBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKS5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJCUxhYmVsIGJsYW5rUm93ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQlibGFua1Jvdy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0KLQkJCVRhYkZvbGRlciB0YWJmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJdGFiZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlUYWJJdGVtIHBhcnRpdGlvblRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQlwYXJ0aXRpb25UYWIuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzIpOyAvLyROT04tTkxTLTEkCi0JCQlDb21wb3NpdGUgcGFydGl0aW9ucyA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQlwYXJ0aXRpb25UYWIuc2V0Q29udHJvbChwYXJ0aXRpb25zKTsKLQkJCWNyZWF0ZVBhcnRpdGlvblRhYkNvbnRlbnRzKHBhcnRpdGlvbnMpOwotCi0JCQlUYWJJdGVtIGFubm90YXRpb25zVGFiID0gbmV3IFRhYkl0ZW0odGFiZm9sZGVyLCBTV1QuQk9SREVSKTsKLQkJCWFubm90YXRpb25zVGFiLnNldFRleHQoIkFubm90YXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbXBvc2l0ZSBhbm5vdGF0aW9ucyA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQlhbm5vdGF0aW9uc1RhYi5zZXRDb250cm9sKGFubm90YXRpb25zKTsKLQkJCWNyZWF0ZUFubm90YXRpb25UYWJDb250ZW50cyhhbm5vdGF0aW9ucyk7Ci0KLQkJCS8vIG9ubHkgY3JlYXRlIHRoZSBJVGV4dFJlZ2lvbnMgdGFiIGZvciBJU3RydWN0dXJlZERvY3VtZW50cwotCQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlUYWJJdGVtIHJlZ2lvblRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJcmVnaW9uVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8zKTsgLy8kTk9OLU5MUy0xJAotCQkJCVNhc2hGb3JtIHJlZ2lvbnMgPSBuZXcgU2FzaEZvcm0odGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQkJcmVnaW9ucy5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7Ci0JCQkJcmVnaW9uVGFiLnNldENvbnRyb2wocmVnaW9ucyk7Ci0JCQkJY3JlYXRlUmVnaW9uVGFiQ29udGVudHMocmVnaW9ucyk7Ci0JCQl9Ci0KLQkJCVRhYkl0ZW0gZWRpdG9yU2VsZWN0aW9uVGFiID0gbmV3IFRhYkl0ZW0odGFiZm9sZGVyLCBTV1QuQk9SREVSKTsKLQkJCWVkaXRvclNlbGVjdGlvblRhYi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTQpOwotCQkJQ29tcG9zaXRlIGVkaXRvclNlbGVjdGlvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQllZGl0b3JTZWxlY3Rpb25UYWIuc2V0Q29udHJvbChlZGl0b3JTZWxlY3Rpb25Db21wb3NpdGUpOwotCQkJZmlsbFNlbGVjdGlvblRhYkNvbnRlbnRzKGVkaXRvclNlbGVjdGlvbkNvbXBvc2l0ZSwgZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJCUlFZGl0b3JTaXRlIHNpdGUgPSBmVGV4dEVkaXRvci5nZXRFZGl0b3JTaXRlKCk7Ci0JCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJCQlJU2VsZWN0aW9uU2VydmljZSBzZXJ2aWNlID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKTsKLQkJCQkJaWYgKHNlcnZpY2UgIT0gbnVsbCAmJiAhc2VydmljZS5nZXRTZWxlY3Rpb24oKS5lcXVhbHMoZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSkpIHsKLQkJCQkJCVRhYkl0ZW0gc2VsZWN0aW9uU2VydmljZVRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJCQlzZWxlY3Rpb25TZXJ2aWNlVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xOSk7Ci0JCQkJCQlDb21wb3NpdGUgc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQkJCQlzZWxlY3Rpb25TZXJ2aWNlVGFiLnNldENvbnRyb2woc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSk7Ci0JCQkJCQlmaWxsU2VsZWN0aW9uVGFiQ29udGVudHMoc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSwgc2VydmljZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGFyZWEKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVQYXJ0aXRpb25UYWJDb250ZW50cyhDb21wb3NpdGUgYXJlYSkgewotCQkJYXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlhcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCQlDb21wb3NpdGUgcGFydGlvbmluZ0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoYXJlYSwgU1dULk5PTkUpOwotCQkJcGFydGlvbmluZ0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCXBhcnRpb25pbmdDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcnRpb25pbmdDb21wb3NpdGUsIFNXVC5TSU5HTEUpOwotCQkJbGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzgpOyAvLyROT04tTkxTLTEkCi0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQkJZmluYWwgQ29tYm8gcGFydGl0aW9uaW5nQ29tYm8gPSBuZXcgQ29tYm8ocGFydGlvbmluZ0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCQlwYXJ0aXRpb25pbmdDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0KLQkJCWZpbmFsIExhYmVsIHBhcnRpdGlvbmVySW5zdGFuY2VMYWJlbCA9IG5ldyBMYWJlbChwYXJ0aW9uaW5nQ29tcG9zaXRlLCBTV1QuU0lOR0xFKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJcGFydGl0aW9uZXJJbnN0YW5jZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlmaW5hbCBUYWJsZVZpZXdlciBmUGFydGl0aW9uVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIocGFydGlvbmluZ0NvbXBvc2l0ZSwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlmUGFydGl0aW9uVGFibGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQkJZlBhcnRpdGlvblRhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQlmUGFydGl0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJZlBhcnRpdGlvblRhYmxlLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkJU3RyaW5nW10gY29sdW1ucyA9IG5ldyBTdHJpbmdbXXtTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzksIFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTAsIFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTF9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJZlBhcnRpdGlvblRhYmxlLnNldExhYmVsUHJvdmlkZXIobmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IChJVHlwZWRSZWdpb24pIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQl0ZXh0ID0gSW50ZWdlci50b1N0cmluZyhwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQl0ZXh0ID0gSW50ZWdlci50b1N0cmluZyhwYXJ0aXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQl0ZXh0ID0gcGFydGl0aW9uLmdldFR5cGUoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAodGV4dCA9PSBudWxsKQotCQkJCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0ZXh0OwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5zLmxlbmd0aF07Ci0JCQlpbnQgY29sdW1uV2lkdGhzW10gPSBuZXcgaW50W117RGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAxNCwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAxNCwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA1fTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCXRsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxKSk7Ci0JCQkJVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4oZlBhcnRpdGlvblRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCQl0Yy5zZXRUZXh0KGNvbHVtbnNbaV0pOwotCQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQl0Yy5zZXRXaWR0aChjb2x1bW5XaWR0aHNbaV0pOwotCQkJfQotCQkJZlBhcnRpdGlvblRhYmxlLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbnMpOwotCQkJZmluYWwgU3RyaW5nW10gcGFydGl0aW9uaW5ncyA9IChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24zKSA/ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgZkRvY3VtZW50KS5nZXRQYXJ0aXRpb25pbmdzKCkgOiBuZXcgU3RyaW5nW117SURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklOR307Ci0JCQlwYXJ0aXRpb25pbmdDb21iby5zZXRJdGVtcyhwYXJ0aXRpb25pbmdzKTsKLQkJCXBhcnRpdGlvbmluZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgcGFydGl0aW9uZXJUZXh0ID0gZkRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyA/ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgZkRvY3VtZW50KS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZ0NvbWJvLmdldEl0ZW0ocGFydGl0aW9uaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpLnRvU3RyaW5nKCkgOiAoIiIgKyBmRG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGFydGl0aW9uZXJJbnN0YW5jZUxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMyArIHBhcnRpdGlvbmVyVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRJbnB1dChUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZkRvY3VtZW50LCBwYXJ0aXRpb25pbmdDb21iby5nZXRJdGVtKHBhcnRpdGlvbmluZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCB0cnVlKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQlmUGFydGl0aW9uVGFibGUuc2V0SW5wdXQobmV3IElUeXBlZFJlZ2lvblswXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHBhcnRpdGlvbmluZ3MubGVuZ3RoID4gMCkgewotCQkJCQlTdHJpbmcgc2VsZWN0ZWRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmdDb21iby5nZXRJdGVtKDApOwotCQkJCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKHBhcnRpdGlvbmluZ3MsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpKSB7Ci0JCQkJCQlzZWxlY3RlZFBhcnRpdGlvbmluZyA9IElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAocGFydGl0aW9uaW5nc1tpXS5lcXVhbHMoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORykpIHsKLQkJCQkJCQkJcGFydGl0aW9uaW5nQ29tYm8uc2VsZWN0KGkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXBhcnRpdGlvbmluZ0NvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbDsKLQkJCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IFRleHRVdGlsaXRpZXMuY29tcHV0ZVBhcnRpdGlvbmluZyhmRG9jdW1lbnQsIHNlbGVjdGVkUGFydGl0aW9uaW5nLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQkJZlBhcnRpdGlvblRhYmxlLnNldElucHV0KHBhcnRpdGlvbnMpOwotCQkJCQlTdHJpbmcgcGFydGl0aW9uZXJUZXh0ID0gZkRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyA/ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgZkRvY3VtZW50KS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZ0NvbWJvLmdldEl0ZW0ocGFydGl0aW9uaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpLnRvU3RyaW5nKCkgOiAoIiIgKyBmRG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwYXJ0aXRpb25lckluc3RhbmNlTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEzICsgcGFydGl0aW9uZXJUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRJbnB1dChmRG9jdW1lbnQuY29tcHV0ZVBhcnRpdGlvbmluZyh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZlBhcnRpdGlvblRhYmxlLnNldElucHV0KG5ldyBJVHlwZWRSZWdpb25bMF0pOwotCQkJfQotCQkJcGFydGl0aW9uaW5nQ29tYm8uc2V0Rm9jdXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVJlZ2lvblRhYkNvbnRlbnRzKFNhc2hGb3JtIHNhc2hGb3JtKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlmaW5hbCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQlmaW5hbCBMaXN0IGRvY3VtZW50UmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50OwotCQkJCWludCBwb3MgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3MpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCQkJaWYgKHBvcyA8IGVuZCkgewotCQkJCQl3aGlsZSAoZG9jUmVnaW9uICE9IGVuZFJlZ2lvbikgewotCQkJCQkJZG9jdW1lbnRSZWdpb25zLmFkZChkb2NSZWdpb24pOwotCQkJCQkJZG9jUmVnaW9uID0gZG9jUmVnaW9uLmdldE5leHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkb2N1bWVudFJlZ2lvbnMuYWRkKGRvY1JlZ2lvbik7Ci0JCQl9Ci0KLQkJCWZpbmFsIFRyZWVWaWV3ZXIgdHJlZSA9IG5ldyBUcmVlVmlld2VyKHNhc2hGb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJZmluYWwgU3RyaW5nIFNUQVJUID0gU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNTsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgU3RyaW5nIExFTkdUSCA9IFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTY7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbmFsIFN0cmluZyBURVhUTEVOR1RIID0gU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNzsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgU3RyaW5nIENPTlRFWFQgPSBTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE4OyAvLyROT04tTkxTLTEkCi0JCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZEFsbChkb2N1bWVudFJlZ2lvbnMpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHBhcmVudEVsZW1lbnQpLmdldFJlZ2lvbnMoKS50b0FycmF5KCkpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKENPTlRFWFQsICgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldFR5cGUoKSkpOwotCQkJCQkJY2hpbGRyZW4uYWRkKG5ldyBLZXlWYWx1ZVBhaXIoU1RBUlQsIEludGVnZXIudG9TdHJpbmcoKChJVGV4dFJlZ2lvbikgcGFyZW50RWxlbWVudCkuZ2V0U3RhcnQoKSkpKTsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKFRFWFRMRU5HVEgsIEludGVnZXIudG9TdHJpbmcoKChJVGV4dFJlZ2lvbikgcGFyZW50RWxlbWVudCkuZ2V0VGV4dExlbmd0aCgpKSkpOwotCQkJCQkJY2hpbGRyZW4uYWRkKG5ldyBLZXlWYWx1ZVBhaXIoTEVOR1RILCBJbnRlZ2VyLnRvU3RyaW5nKCgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldExlbmd0aCgpKSkpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb25MaXN0KSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoQXJyYXlzLmFzTGlzdCgoKElUZXh0UmVnaW9uTGlzdCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIHBhcmVudEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgcGFyZW50RWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt0ZXh0U2VsZWN0aW9ufTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCQlyZXR1cm4gKChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlbGVtZW50KS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQlyZXR1cm4gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIEtleVZhbHVlUGFpcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0cmVlLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgS2V5VmFsdWVQYWlyKQotCQkJCQkJcmV0dXJuICgoS2V5VmFsdWVQYWlyKSBlbGVtZW50KS5mS2V5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSArICI6ICIgKyAoKEtleVZhbHVlUGFpcikgZWxlbWVudCkuZlZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlbGVtZW50OwotCQkJCQkJaW50IHBhY2thZ2VOYW1lTGVuZ3RoID0gZG9jdW1lbnRSZWdpb24uZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJCQkJaWYgKHBhY2thZ2VOYW1lTGVuZ3RoID4gMCkKLQkJCQkJCQlwYWNrYWdlTmFtZUxlbmd0aCsrOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWVMZW5ndGgpOwotCQkJCQkJU3RyaW5nIHRleHQgPSAiWyIgKyBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgIi0iICsgZG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyAiXSAiICsgbmFtZSArICJAIiArIGVsZW1lbnQuaGFzaENvZGUoKSArICIgIiArIGRvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSBlbGVtZW50OwotCQkJCQkJaW50IHBhY2thZ2VOYW1lTGVuZ3RoID0gdGV4dFJlZ2lvbi5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQkJCQlpZiAocGFja2FnZU5hbWVMZW5ndGggPiAwKQotCQkJCQkJCXBhY2thZ2VOYW1lTGVuZ3RoKys7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IHRleHRSZWdpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VOYW1lTGVuZ3RoKTsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gIlsiICsgdGV4dFJlZ2lvbi5nZXRTdGFydCgpICsgIi0iICsgdGV4dFJlZ2lvbi5nZXRFbmQoKSArICJdICIgKyBuYW1lICsgIkAiICsgZWxlbWVudC5oYXNoQ29kZSgpICsgIiAiICsgdGV4dFJlZ2lvbi5nZXRUeXBlKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0cmVlLnNldElucHV0KGZEb2N1bWVudCk7Ci0KLQotCQkJZmluYWwgVGV4dCBkaXNwbGF5VGV4dCA9IG5ldyBUZXh0KHNhc2hGb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCQlkaXNwbGF5VGV4dC5zZXRCYWNrZ3JvdW5kKHNhc2hGb3JtLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQl0cmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIEtleVZhbHVlUGFpcikKLQkJCQkJCQlkaXNwbGF5VGV4dC5zZXRUZXh0KCgoS2V5VmFsdWVQYWlyKSBvKS5mVmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0ID0gKElUZXh0U2VsZWN0aW9uKSBvOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoZkRvY3VtZW50LmdldCh0ZXh0LmdldE9mZnNldCgpLCB0ZXh0LmdldExlbmd0aCgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24gPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBvOwotCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQocmVnaW9uLmdldEZ1bGxUZXh0KCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoIiIgKyBvKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlzYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXXszLCAyfSk7Ci0JCQlyZXR1cm4gc2FzaEZvcm07Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlsbFNlbGVjdGlvblRhYkNvbnRlbnRzKENvbXBvc2l0ZSBhcmVhLCBJU2VsZWN0aW9uIHNlbCkgewotCQkJYXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlhcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCQlMYWJlbCB0eXBlTmFtZSA9IG5ldyBMYWJlbChhcmVhLCBTV1QuV1JBUCk7Ci0JCQl0eXBlTmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCQl0eXBlTmFtZS5zZXRUZXh0KCJDbGFzczogIiArIHNlbC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJKG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSkpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCQkJU2FzaEZvcm0gc3RydWN0dXJlZFNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKGFyZWEsIFNXVC5OT05FKTsKLQkJCQlzdHJ1Y3R1cmVkU2FzaEZvcm0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQkJc3RydWN0dXJlZFNhc2hGb3JtLnNldE9yaWVudGF0aW9uKFNXVC5WRVJUSUNBTCk7Ci0KLQkJCQlmaW5hbCBUYWJsZVZpZXdlciBzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoc3RydWN0dXJlZFNhc2hGb3JtLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0KLQkJCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCQl9Ci0KLQkJCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCQkJCWNhc2UgMCA6IHsKLQkJCQkJCQkJCXRleHQgPSBTdHJpbmcudmFsdWVPZigoKExpc3QpIHN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRJbnB1dCgpKS5pbmRleE9mKGVsZW1lbnQpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgMSA6IHsKLQkJCQkJCQkJCXRleHQgPSBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSAyIDogewotCQkJCQkJCQkJdGV4dCA9IGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQkJdGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDcsIHRydWUpKTsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMjgsIHRydWUpKTsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGxheW91dCk7Ci0KLQkJCQlUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbihzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoIkl0ZW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQl0Yy5zZXRXaWR0aCg0MCk7Ci0KLQkJCQl0YyA9IG5ldyBUYWJsZUNvbHVtbihzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoIkNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQkJdGMuc2V0V2lkdGgoNDApOwotCi0JCQkJdGMgPSBuZXcgVGFibGVDb2x1bW4oc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCQl0Yy5zZXRUZXh0KCJUZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQkJdGMuc2V0V2lkdGgoNDApOwotCi0JCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQkJZmluYWwgTGlzdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkudG9MaXN0KCk7Ci0JCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLnNldElucHV0KGlucHV0KTsKLQotCQkJCWZpbmFsIFRyZWVWaWV3ZXIgaW5mb1RyZWUgPSBuZXcgVHJlZVZpZXdlcihzdHJ1Y3R1cmVkU2FzaEZvcm0sIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkJCWluZm9UcmVlLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlVmlld2VyICYmIGluZm9UcmVlLmdldElucHV0KCkgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXJGb3IgPSAoKElOb2RlTm90aWZpZXIpIGluZm9UcmVlLmdldElucHV0KCkpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJCWlmIChhZGFwdGVyRm9yICE9IG51bGwgJiYgYWRhcHRlckZvciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKSB7Ci0JCQkJCQkJCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXJGb3I7Ci0JCQkJCQkJCXJldHVybiBhZGFwdGVyLmdldExhYmVsSW1hZ2UoKGluZm9UcmVlLmdldElucHV0KCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCQkJCQlyZXR1cm4gIkNsYXNzOiAiICsgKChDbGFzcykgZWxlbWVudCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQkJCQlyZXR1cm4gIlJlZ2lzdGVyZWQgQWRhcHRlcnM6IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQkJCQkJcmV0dXJuICJJbmRleGVkIFJlZ2lvbiBvZmZzZXQgc3BhbjogWyIgKyAoKElSZWdpb24pIGVsZW1lbnQpLmdldE9mZnNldCgpICsgIi0iICsgKChJUmVnaW9uKSBlbGVtZW50KS5nZXRMZW5ndGgoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCX0KLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVHJlZVZpZXdlciAmJiBpbmZvVHJlZS5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgaW5mb1RyZWUuZ2V0SW5wdXQoKSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gYWRhcHRlci5nZXRMYWJlbFRleHQoKGluZm9UcmVlLmdldElucHV0KCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWluZm9UcmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLQkJCQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0JCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJCQkJCWlmIChpbnB1dEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyICYmICgoSU5vZGVOb3RpZmllcikgaW5wdXRFbGVtZW50KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWVsZW1lbnRzLmFkZChpbmZvVHJlZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsZW1lbnRzLmFkZChpbnB1dEVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCQkJZWxlbWVudHMuYWRkKG5ldyBSZWdpb24oKChJbmRleGVkUmVnaW9uKSBpbnB1dEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksICgoSW5kZXhlZFJlZ2lvbikgaW5wdXRFbGVtZW50KS5nZXRFbmRPZmZzZXQoKSkpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJCQllbGVtZW50cy5hZGQoKChJTm9kZU5vdGlmaWVyKSBpbnB1dEVsZW1lbnQpLmdldEFkYXB0ZXJzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBlbGVtZW50cy50b0FycmF5KCk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJaWYgKHNlbGVjdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJaW5mb1RyZWUuc2V0SW5wdXQoaW5wdXQuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpbmZvVHJlZS5zZXRJbnB1dChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJCWluZm9UcmVlLmV4cGFuZFRvTGV2ZWwoMik7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCXN0cnVjdHVyZWRTYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXXszLCAyfSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRMaW5lTnVtYmVyKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJaW50IGxpbmUgPSAtMTsKLQkJCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikgewotCQkJCWxpbmUgPSBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcigoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihhbm5vdGF0aW9uKTsKLQkJCQlpZiAocCAhPSBudWxsICYmICFwLmlzRGVsZXRlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChwLmdldE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcobGluZSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgS2V5VmFsdWVQYWlyIHsKLQkJT2JqZWN0IGZLZXk7Ci0JCVN0cmluZyBmVmFsdWU7Ci0KLQkJcHVibGljIEtleVZhbHVlUGFpcihPYmplY3Qga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCWZLZXkgPSBrZXk7Ci0JCQlmVmFsdWUgPSB2YWx1ZTsKLQkJfQotCX0KLQotCWNsYXNzIFNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXB1YmxpYyBTaG93RWRpdG9ySW5mb3JtYXRpb25BY3Rpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLyoqCi0JCQkgKiBUT0RPOiBQcm92aWRlIGEgbW9yZSB1c2VmdWwgY29udHJvbCwgbWF5YmUgYSB0YWJsZSB3aGVyZSB0aGUKLQkJCSAqIHNlbGVjdGlvbiBzaG93cyB5b3UgdGhlIHBhcnRpdGlvbidzIHRleHQgaW4gYSBTdHlsZWRUZXh0IHBhbmUKLQkJCSAqIGJlbmVhdGggaXQuCi0JCQkgKi8KLQkJCXN1cGVyLnJ1bigpOwotCQkJbmV3IEluZm9ybWF0aW9uRGlhbG9nKCgoQ29udHJvbCkgZlRleHRFZGl0b3IuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKSkuZ2V0U2hlbGwoKSkub3BlbigpOwotCQl9Ci0JfQotCi0JSUFjdGlvbiBmU2hvd0VkaXRvckluZm9ybWF0aW9uQWN0aW9uID0gbmV3IFNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbigpOwotCi0JSVRleHRFZGl0b3IgZlRleHRFZGl0b3IgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHVibGljIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHZpc2libGUKLQkgKiBAcGFyYW0gd2lkdGhJbkNoYXJzCi0JICovCi0JcHVibGljIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKFN0cmluZyBpZCwgYm9vbGVhbiB2aXNpYmxlLCBpbnQgd2lkdGhJbkNoYXJzKSB7Ci0JCXN1cGVyKGlkLCB2aXNpYmxlLCB3aWR0aEluQ2hhcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCWZUZXh0RWRpdG9yID0gdGV4dEVkaXRvcjsKLQkJc2V0QWN0aW9uSGFuZGxlcihmU2hvd0VkaXRvckluZm9ybWF0aW9uQWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkltYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzNWVkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyOwotCi0vKioKLSAqIEltYWdlIHByb3ZpZGVyIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGFubm90YXRpb25zLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZURlc2NyaXRwb3JJZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciNnZXRJbWFnZURlc2NyaXB0b3JJZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VEZXNjcmlwdG9ySWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0TWFuYWdlZEltYWdlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb24pCi0JICovCi0JcHVibGljIEltYWdlIGdldE1hbmFnZWRJbWFnZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJLy8gZnV0dXJlIHJldHVybiBkaWZmZXJlbnQgdHlwZXMgb2YgbWFuYWdlZCBpbWFnZXMgYXMgSkRUIGRvZXMKLQkJLy8gZWcuIG92ZXJsYXkgaWNvbiBpbWFnZXMsICJncmF5ZWQiIGltYWdlcywgcXVpY2sgZml4YWJsZSwgZXRjLi4uCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyYTViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0JY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQkJc3VwZXIoZGV0YWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0VkaXRvclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0VkaXRvclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1MDIxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9FZGl0b3JVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEhlbHBmdWwgbWV0aG9kcyB0byBiZSB1c2VkIHdpdGggdGhlIFNvdXJjZSBFZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclV0aWxpdHkgewotCi0JLyoqCi0JICogQXBwZW5kcyB0byBtb2RpZmllciBzdHJpbmcgb2YgdGhlIGdpdmVuIFNXVCBtb2RpZmllciBiaXQgdG8gdGhlIGdpdmVuCi0JICogbW9kaWZpZXJTdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVyU3RyaW5nCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZXIgc3RyaW5nCi0JICogQHBhcmFtIG1vZGlmaWVyCi0JICogICAgICAgICAgICBhbiBpbnQgd2l0aCBTV1QgbW9kaWZpZXIgYml0Ci0JICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGVkIG1vZGlmaWVyIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBhcHBlbmRNb2RpZmllclN0cmluZyhTdHJpbmcgbW9kaWZpZXJTdHJpbmcsIGludCBtb2RpZmllcikgewotCQlpZiAobW9kaWZpZXJTdHJpbmcgPT0gbnVsbCkKLQkJCW1vZGlmaWVyU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld01vZGlmaWVyU3RyaW5nID0gQWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhtb2RpZmllcik7Ci0JCWlmIChtb2RpZmllclN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ld01vZGlmaWVyU3RyaW5nOwotCQlyZXR1cm4gbW9kaWZpZXJTdHJpbmcgKyAiICsgIiArIG5ld01vZGlmaWVyU3RyaW5nOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHN0YXRlIG1hc2sgZm9yIHRoZSBnaXZlbiBtb2RpZmllciBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVycwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB3aXRoIHRoZSBtb2RpZmllcnMsIHNlcGFyYXRlZCBieSAnKycsICctJywgJzsnLAotCSAqICAgICAgICAgICAgJywnIG9yICcuJwotCSAqIEByZXR1cm4gdGhlIHN0YXRlIG1hc2sgb3IgLTEgaWYgdGhlIGlucHV0IGlzIGludmFsaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RhdGVNYXNrKFN0cmluZyBtb2RpZmllcnMpIHsKLQkJaWYgKG1vZGlmaWVycyA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmIChtb2RpZmllcnMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBTV1QuTk9ORTsKLQotCQlpbnQgc3RhdGVNYXNrID0gMDsKLQkJU3RyaW5nVG9rZW5pemVyIG1vZGlmaWVyVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RpZmllcnMsICIsOy46Ky0qICIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChtb2RpZmllclRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWludCBtb2RpZmllciA9IEVkaXRvclV0aWxpdHkuZmluZExvY2FsaXplZE1vZGlmaWVyKG1vZGlmaWVyVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCWlmIChtb2RpZmllciA9PSAwIHx8IChzdGF0ZU1hc2sgJiBtb2RpZmllcikgPT0gbW9kaWZpZXIpCi0JCQkJcmV0dXJuIC0xOwotCQkJc3RhdGVNYXNrID0gc3RhdGVNYXNrIHwgbW9kaWZpZXI7Ci0JCX0KLQkJcmV0dXJuIHN0YXRlTWFzazsKLQl9Ci0KLQkvKioKLQkgKiBNYXBzIHRoZSBsb2NhbGl6ZWQgbW9kaWZpZXIgbmFtZSB0byBhIGNvZGUgaW4gdGhlIHNhbWUgbWFubmVyIGFzCi0JICogI2ZpbmRNb2RpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBTV1QgbW9kaWZpZXIgYml0LCBvciA8Y29kZT4wPC9jb2RlPiBpZiBubyBtYXRjaCB3YXMgZm91bmQKLQkgKiBAc2VlIGZpbmRNb2RpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRMb2NhbGl6ZWRNb2RpZmllcihTdHJpbmcgdG9rZW4pIHsKLQkJaWYgKHRva2VuID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5DVFJMKSkpCi0JCQlyZXR1cm4gU1dULkNUUkw7Ci0JCWlmICh0b2tlbi5lcXVhbHNJZ25vcmVDYXNlKEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoU1dULlNISUZUKSkpCi0JCQlyZXR1cm4gU1dULlNISUZUOwotCQlpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5BTFQpKSkKLQkJCXJldHVybiBTV1QuQUxUOwotCQlpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5DT01NQU5EKSkpCi0JCQlyZXR1cm4gU1dULkNPTU1BTkQ7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogVGVtcG9yYXJ5IG1ldGhvZCB0byBoZWxwIG1pZ3JhdGUgZnJvbSB1c2luZyBTdHJ1Y3R1cmVkVGV4dENvbG9ycyB0bwotCSAqIHVzaW5nIGJhc2UgQ29sb3JSZWdpc3RyeS4gSW5zdGVhZCBvZiB1c2luZyBzeW1ib2xpYyBuYW1lcyBpbiB0aGUgY29sb3IKLQkgKiByZWdpc3RyeSwgd2UgYXJlIGN1cnJlbnRseSBtYXBwaW5nIHRoZSByZ2IudG9TdHJpbmcgdmFsdWUgdG8KLQkgKiBjb3JyZXNwb25kaW5nIGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSByZ2IKLQkgKiBAcmV0dXJuIENvbG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihSR0IgcmdiKSB7Ci0JCWlmIChyZ2IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGdldCB0aGUgY29sb3IgZnJvbSB0aGUgcGxhdGZvcm0gY29sb3IgcmVnaXN0cnkKLQkJQ29sb3IgY29sb3IgPSBKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0KHJnYi50b1N0cmluZygpKTsKLQotCQkvLyBpZiB0aGUgcGxhdGZvcm0gY29sb3IgcmVnaXN0cnkgZG9lcyBub3QgaGF2ZSB0aGlzIGNvbG9yIHlldCwgYWRkIHRvCi0JCS8vIHRoZSByZWdpc3RyeQotCQlpZiAoY29sb3IgPT0gbnVsbCkgewotCQkJSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLnB1dChyZ2IudG9TdHJpbmcoKSwgcmdiKTsKLQkJCWNvbG9yID0gSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldChyZ2IudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmaWVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIFNXVCBtb2RpZmllciBtb2RpZmllciBiaXRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZU1hc2sKLQkgKiAgICAgICAgICAgIHRoZSBTV1QgbW9kaWZpZXIgYml0cwotCSAqIEByZXR1cm4gdGhlIG1vZGlmaWVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZGlmaWVyU3RyaW5nKGludCBzdGF0ZU1hc2spIHsKLQkJU3RyaW5nIG1vZGlmaWVyU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgPT0gU1dULkNUUkwpCi0JCQltb2RpZmllclN0cmluZyA9IGFwcGVuZE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyU3RyaW5nLCBTV1QuQ1RSTCk7Ci0JCWlmICgoc3RhdGVNYXNrICYgU1dULkFMVCkgPT0gU1dULkFMVCkKLQkJCW1vZGlmaWVyU3RyaW5nID0gYXBwZW5kTW9kaWZpZXJTdHJpbmcobW9kaWZpZXJTdHJpbmcsIFNXVC5BTFQpOwotCQlpZiAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgPT0gU1dULlNISUZUKQotCQkJbW9kaWZpZXJTdHJpbmcgPSBhcHBlbmRNb2RpZmllclN0cmluZyhtb2RpZmllclN0cmluZywgU1dULlNISUZUKTsKLQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ09NTUFORCkgPT0gU1dULkNPTU1BTkQpCi0JCQltb2RpZmllclN0cmluZyA9IGFwcGVuZE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyU3RyaW5nLCBTV1QuQ09NTUFORCk7Ci0KLQkJcmV0dXJuIG1vZGlmaWVyU3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1BsYXRmb3JtU3RhdHVzTGluZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1BsYXRmb3JtU3RhdHVzTGluZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzNDRlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFV0aWxpdHkgdG8gZGlzcGxheSAoYW5kL29yIGNsZWFyKSBtZXNzYWdlcyBvbiB0aGUgc3RhdHVzIGxpbmUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENsZWFyRXJyb3JNZXNzYWdlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkaXNwbGF5TWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gY2xlYXIgbWVzc2FnZSBvbiBmb2N1cyBsb3NzLCBjaGFuZ2Ugb2Ygc2VsZWN0aW9uLCBrZXkgdHlwZSwKLQkgKiBldGMuLi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPbmVUaW1lTGlzdGVuZXIgZXh0ZW5kcyBGb2N1c0FkYXB0ZXIgaW1wbGVtZW50cyBWZXJpZnlLZXlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vdXNlTGlzdGVuZXIgewotCi0JCXByaXZhdGUgUnVubmFibGUgZlJ1bm5lciA9IG51bGw7Ci0JCXByaXZhdGUgU3R5bGVkVGV4dCBmU3R5bGVkVGV4dDsKLQotCQlwdWJsaWMgT25lVGltZUxpc3RlbmVyKFN0eWxlZFRleHQgdGFyZ2V0LCBSdW5uYWJsZSByKSB7Ci0JCQlmU3R5bGVkVGV4dCA9IHRhcmdldDsKLQkJCWZSdW5uZXIgPSByOwotCQkJZlN0eWxlZFRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5hZGRGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl1bmhvb2tBbmRSdW4oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkvLwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVuaG9va0FuZFJ1bigpIHsKLQkJCWZTdHlsZWRUZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMoZlJ1bm5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCXVuaG9va0FuZFJ1bigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXVuaG9va0FuZFJ1bigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGF0dXMgbGluZSB3aWxsIGJlIGNsZWFyZWQgdy8ga2V5IHR5cGUsIG9yIHNlbGVjdGlvbiBjaGFuZ2UKLQkgKiAKLQkgKiBAcGFyYW0gd2lkZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCkgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlZGl0b3IuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKTsKLQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCWFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCgoU3R5bGVkVGV4dCkgY29udHJvbCkpOwotCQkJCWFkZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoIWFkZGVkKSB7Ci0JCQkvLyBjbGVhciB0aGUgZXJyb3IgbWVzc2FnZSBpbW1lZGlhdGVseQotCQkJZGlzcGxheU1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKFN0eWxlZFRleHQgd2lkZ2V0KSB7Ci0JCW5ldyBPbmVUaW1lTGlzdGVuZXIod2lkZ2V0LCBuZXcgQ2xlYXJFcnJvck1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBzdGF0dXMgbGluZSBpbW1lZGlhdGVseQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclN0YXR1c0xpbmUoKSB7Ci0JCWRpc3BsYXlNZXNzYWdlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYSBtZXNzYWdlIG9uIHRoZSBzdGF0dXMgbGluZSAod2l0aCBhIGJlZXApCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwbGF5RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJZGlzcGxheU1lc3NhZ2UobXNnKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYSBtZXNzYWdlIG9uIHRoZSBzdGF0dXMgbGluZSAobm8gYmVlcCkKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3BsYXlNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRFcnJvck1lc3NhZ2UobXNnKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJfQotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCQllZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQl9Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JcHJpdmF0ZSBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsKCkgewotCQkvLyBmb3JjZSB1c2Ugb2Ygc2luZ2xldG9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODU5N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGVtcGxhdGUgaW1wbGVtZW50YXRpb24gb2YgYSByZWdpc3RyeSByZWFkZXIgdGhhdCBjcmVhdGVzIG9iamVjdHMKLSAqIHJlcHJlc2VudGluZyByZWdpc3RyeSBjb250ZW50cy4gVHlwaWNhbGx5LCBhbiBleHRlbnNpb24gY29udGFpbnMgb25lCi0gKiBlbGVtZW50LCBidXQgdGhpcyByZWFkZXIgaGFuZGxlcyBtdWx0aXBsZSBlbGVtZW50cyBwZXIgZXh0ZW5zaW9uLgotICogCi0gKiBUbyBzdGFydCByZWFkaW5nIHRoZSBleHRlbnNpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciBhbiBleHRlbnNpb24gcG9pbnQsCi0gKiBjYWxsIHRoZSBtZXRob2QgPGNvZGU+cmVhZFJlZ2lzdHJ5PC9jb2RlPi4KLSAqIAotICogVG8gcmVhZCBjaGlsZHJlbiBvZiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQsIGNhbGwgdGhlIG1ldGhvZAotICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4gZnJvbSB5b3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPiwgYXMgaXQgd2lsbCBub3QgYmUgZG9uZSBieSBkZWZhdWx0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnaXN0cnlSZWFkZXIgewotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFJlZ2lzdHJ5UmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIGRlc2NyaXB0aW9uIGFzIGEgc3ViZWxlbWVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIHN0cmluZyBpZiBkZWZpbmVkLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbihUQUdfREVTQ1JJUFRJT04pOwotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlblswXS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSB3b3JrYmVuY2ggbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgYSByZWdpc3RyeSBlcnJvciB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgdW5rbm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dVbmtub3duRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlsb2dFcnJvcihlbGVtZW50LCAiVW5rbm93biBleHRlbnNpb24gdGFnIGZvdW5kOiAiICsgZWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXBwbHkgYSByZXByb2R1Y2FibGUgb3JkZXIgdG8gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBwcm92aWRlZCwgc3VjaAotCSAqIHRoYXQgdGhlIG9yZGVyIHdpbGwgbm90IGNoYW5nZSBhcyBleHRlbnNpb25zIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBJRXh0ZW5zaW9uW10gb3JkZXJFeHRlbnNpb25zKElFeHRlbnNpb25bXSBleHRlbnNpb25zKSB7Ci0JCS8vIEJ5IGRlZmF1bHQsIHRoZSBvcmRlciBpcyBiYXNlZCBvbiBwbHVnaW4gaWQgc29ydGVkCi0JCS8vIGluIGFzY2VuZGluZyBvcmRlci4gVGhlIG9yZGVyIGZvciBhIHBsdWdpbiBwcm92aWRpbmcKLQkJLy8gbW9yZSB0aGFuIG9uZSBleHRlbnNpb24gZm9yIGFuIGV4dGVuc2lvbiBwb2ludCBpcwotCQkvLyBkZXBlbmRlbnQgaW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGUgWE1MIGZpbGUuCi0JCVNvcnRlciBzb3J0ZXIgPSBuZXcgU29ydGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZXh0ZW5zaW9uMSwgT2JqZWN0IGV4dGVuc2lvbjIpIHsKLQkJCQlTdHJpbmcgczEgPSAoKElFeHRlbnNpb24pIGV4dGVuc2lvbjEpLmdldE5hbWVzcGFjZSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIHMyID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24yKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vUmV0dXJuIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lCi0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSkgPiAwOwotCQkJfQotCQl9OwotCi0JCU9iamVjdFtdIHNvcnRlZCA9IHNvcnRlci5zb3J0KGV4dGVuc2lvbnMpOwotCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bc29ydGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc29ydGVkLCAwLCBzb3J0ZWRFeHRlbnNpb24sIDAsIHNvcnRlZC5sZW5ndGgpOwotCQlyZXR1cm4gc29ydGVkRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZWFkIGVsZW1lbnQncyBhdHRyaWJ1dGVzLiBJZiBjaGlsZHJlbiBzaG91bGQKLQkgKiBhbHNvIGJlIHJlYWQsIHRoZW4gaW1wbGVtZW50b3IgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKLQkgKiA8Y29kZT5yZWFkRWxlbWVudENoaWxkcmVuPC9jb2RlPi4gSW1wbGVtZW50b3IgaXMgYWxzbyByZXNwb25zaWJsZQotCSAqIGZvciBsb2dnaW5nIG1pc3NpbmcgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCB3YXMgcmVjb2duaXplZCwgZmFsc2UgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIFJlYWQgdGhlIGVsZW1lbnQncyBjaGlsZHJlbi4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHN1YmNsYXNzJwotCSAqIHJlYWRFbGVtZW50IG1ldGhvZCB3aGVuIGl0IHdhbnRzIHRvIHJlYWQgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmVhZEVsZW1lbnRzKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBlYWNoIGVsZW1lbnQgb25lIGF0IGEgdGltZSBieSBjYWxsaW5nIHRoZSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbgotCSAqIG9mIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBMb2dzIGFuIGVycm9yIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgcmVjb2duaXplZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFyZWFkRWxlbWVudChlbGVtZW50c1tpXSkpCi0JCQkJbG9nVW5rbm93bkVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZCBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCXJlYWRFbGVtZW50cyhleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU3RhcnQgdGhlIHJlZ2lzdHJ5IHJlYWRpbmcgcHJvY2VzcyB1c2luZyB0aGUgc3VwcGxpZWQgcGx1Z2luIElEIGFuZAotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Tb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2VlMDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLQotCi0vKioKLSAqIFRoZSBTb3J0T3BlcmF0aW9uIHRha2VzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzIGFuZCByZXR1cm5zIGEgc29ydGVkCi0gKiBjb2xsZWN0aW9uIG9mIHRoZXNlIG9iamVjdHMuIENvbmNyZXRlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHByb3ZpZGUgdGhlCi0gKiBjcml0ZXJpYSBmb3IgdGhlIHNvcnRpbmcgb2YgdGhlIG9iamVjdHMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZSBUaGlzIGlzIHRoZQotCSAqICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4gRWFjaCBzdWJjbGFzcyBvdmVyaWRlcyB0aGlzCi0JICogbWV0aG9kIHdpdGggdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgdGhlICdncmVhdGVyIHRoYW4nIGNvbmNlcHQKLQkgKiBmb3IgdGhlIG9iamVjdHMgYmVpbmcgc29ydGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGVsZW1lbnRPbmUsIE9iamVjdCBlbGVtZW50VHdvKTsKLQotCS8qKgotCSAqIFNvcnQgdGhlIG9iamVjdHMgaW4gc29ydGVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGF0IGNvbGxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBxdWlja1NvcnQoT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgewotCQlpbnQgb3JpZ2luYWxMZWZ0ID0gbGVmdDsKLQkJaW50IG9yaWdpbmFsUmlnaHQgPSByaWdodDsKLQkJT2JqZWN0IG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bKGxlZnQgKyByaWdodCkgLyAyXTsKLQotCQlkbyB7Ci0JCQl3aGlsZSAoY29tcGFyZShzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLCBtaWQpKQotCQkJCWxlZnQrKzsKLQkJCXdoaWxlIChjb21wYXJlKG1pZCwgc29ydGVkQ29sbGVjdGlvbltyaWdodF0pKQotCQkJCXJpZ2h0LS07Ci0JCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJCU9iamVjdCB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOwotCQkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKLQkJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKLQkJCQlsZWZ0Kys7Ci0JCQkJcmlnaHQtLTsKLQkJCX0KLQkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0KLQkJaWYgKG9yaWdpbmFsTGVmdCA8IHJpZ2h0KQotCQkJc29ydGVkQ29sbGVjdGlvbiA9IHF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbExlZnQsIHJpZ2h0KTsKLQkJaWYgKGxlZnQgPCBvcmlnaW5hbFJpZ2h0KQotCQkJc29ydGVkQ29sbGVjdGlvbiA9IHF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBsZWZ0LCBvcmlnaW5hbFJpZ2h0KTsKLQotCQlyZXR1cm4gc29ydGVkQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24gZnJvbSB0aGlzIHVuc29ydGVkIGNvbGxlY3Rpb24uIFNvcnQKLQkgKiB1c2luZyBxdWljayBzb3J0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBzb3J0KE9iamVjdFtdIHVuU29ydGVkQ29sbGVjdGlvbikgewotCQlpbnQgc2l6ZSA9IHVuU29ydGVkQ29sbGVjdGlvbi5sZW5ndGg7Ci0JCU9iamVjdFtdIHNvcnRlZENvbGxlY3Rpb24gPSBuZXcgT2JqZWN0W3NpemVdOwotCi0JCS8vY29weSB0aGUgYXJyYXkgc28gY2FuIHJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbgotCQlTeXN0ZW0uYXJyYXljb3B5KHVuU29ydGVkQ29sbGVjdGlvbiwgMCwgc29ydGVkQ29sbGVjdGlvbiwgMCwgc2l6ZSk7Ci0JCWlmIChzaXplID4gMSkKLQkJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCAwLCBzaXplIC0gMSk7Ci0KLQkJcmV0dXJuIHNvcnRlZENvbGxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0NhcmV0RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9DYXJldEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGZhMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0NhcmV0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqIAotICogU2ltcGx5IGhvbGRzIGRhdGEgdG8gYmUgcGFzc2VkIHRvIENhcmV0RXZlbnRMaXN0ZW5lcnMKLSAqLwotcHVibGljIGNsYXNzIENhcmV0RXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkvLyBpbml0aWFsaXplIHRvIGltcG9zc2libGUgbG9jYXRpb24KLQlpbnQgZlBvc2l0aW9uID0gLTE7Ci0KLQkvKioKLQkgKiBkb2VzbnQndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBDYXJldEV2ZW50IHdpdGhvdXQgdGhlIENhcmV0IHBvc3Rpb24sIHNvCi0JICogdXNlIG90aGVyIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIENhcmV0RXZlbnQoT2JqZWN0IHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ2FyZXRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgcG9zaXRpb24pIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJc2V0UG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zaXRpb247Ci0JfQotCi0Jdm9pZCBzZXRQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24pIHsKLQkJZlBvc2l0aW9uID0gbmV3UG9zaXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lDYXJldExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSUNhcmV0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiMTllYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSUNhcmV0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FyZXRMaXN0ZW5lciBleHRlbmRzIGphdmEudXRpbC5FdmVudExpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCBjYXJldE1vdmVkKENhcmV0RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lOb2RlU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JTm9kZVNlbGVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWMwZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lOb2RlU2VsZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIGJhc2Ugc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVTZWxlY3Rpb25MaXN0ZW5lciB7Ci0Jdm9pZCBub2RlU2VsZWN0aW9uQ2hhbmdlZChOb2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JVGV4dFNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSVRleHRTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjgzYmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JVGV4dFNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB1c2UgYmFzZSBzZWxlY3Rpb24gbm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRTZWxlY3Rpb25MaXN0ZW5lciB7Ci0Jdm9pZCB0ZXh0U2VsZWN0aW9uQ2hhbmdlZChUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQwYTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIE5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlpbnQgZkNhcmV0UG9zaXRpb247Ci0KLQlMaXN0IGZTZWxlY3RlZE5vZGVzOwotCi0JcHVibGljIE5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoT2JqZWN0IHNvdXJjZSwgTGlzdCBzZWxlY3RlZE5vZGVzLCBpbnQgY2FyZXRQb3NpdGlvbikgewotCQlzdXBlcihzb3VyY2UpOwotCQlmU2VsZWN0ZWROb2RlcyA9IHNlbGVjdGVkTm9kZXM7Ci0JCWZDYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ2FyZXRQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCkgewotCQlyZXR1cm4gZlNlbGVjdGVkTm9kZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL1RleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9UZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZGJmNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL1RleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlpbnQgZlRleHRTZWxlY3Rpb25FbmQ7Ci0KLQlpbnQgZlRleHRTZWxlY3Rpb25TdGFydDsKLQotCXB1YmxpYyBUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KE9iamVjdCBzb3VyY2UsIGludCB0ZXh0U2VsZWN0aW9uU3RhcnQsIGludCB0ZXh0U2VsZWN0aW9uRW5kKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWZUZXh0U2VsZWN0aW9uU3RhcnQgPSB0ZXh0U2VsZWN0aW9uU3RhcnQ7Ci0JCWZUZXh0U2VsZWN0aW9uRW5kID0gdGV4dFNlbGVjdGlvbkVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRTZWxlY3Rpb25FbmQoKSB7Ci0JCXJldHVybiBmVGV4dFNlbGVjdGlvbkVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRTZWxlY3Rpb25TdGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0U2VsZWN0aW9uU3RhcnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2YwZDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0vKioKLSAqIEJhc2ljIENvbmZpZ3VyYXRpb24gY2xhc3MgZm9yIE91dGxpbmUgUGFnZXMKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBBZGQgYSBjb2xsYXBzZSBhY3Rpb24gdG8gaGVscCB3aXRoIG5hdmlnYXRpb24uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb2xsYXBzZVRyZWVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXIgPSBudWxsOwotCi0JCXB1YmxpYyBDb2xsYXBzZVRyZWVBY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJCXN1cGVyKFNTRVVJTWVzc2FnZXMuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzAsIEFTX1BVU0hfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKENPTExBUFNFX0UpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQ09MTEFQU0VfRCk7Ci0JCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQkJZlRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzdXBlci5ydW4oKTsKLQkJCWZUcmVlVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHdoZXRoZXIgaW5jb21pbmcgc2VsZWN0aW9uIG5vdGlmaWNhdGlvbiBhZmZlY3RzIHVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUb2dnbGVMaW5rQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCQlwdWJsaWMgVG9nZ2xlTGlua0FjdGlvbihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZSkgewotCQkJc3VwZXIoU1NFVUlNZXNzYWdlcy5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMSwgc3RvcmUsIHByZWZlcmVuY2UsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoU1lOQ0VEX0QpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFNZTkNFRF9FKTsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJc3VwZXIudXBkYXRlKCk7Ci0JCQlzZXRMaW5rV2l0aEVkaXRvcihpc0NoZWNrZWQoKSk7Ci0JCX0KLQl9Ci0KLQlJbWFnZURlc2NyaXB0b3IgQ09MTEFQU0VfRCA9IEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9DT0xMQVBTRUFMTCk7Ci0JSW1hZ2VEZXNjcmlwdG9yIENPTExBUFNFX0UgPSBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfQ09MTEFQU0VBTEwpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0xpbmtXaXRoRWRpdG9yID0gZmFsc2U7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBmTWVudUNvbnRyaWJ1dGlvbnMgPSBudWxsOwotCXByaXZhdGUgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBmVG9vbGJhckNvbnRyaWJ1dGlvbnMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfTElOS19QUkVGID0gIm91dGxpbmUtbGluay1lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JSW1hZ2VEZXNjcmlwdG9yIFNZTkNFRF9EID0gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19ETENMX1NZTkNFRCk7Ci0JSW1hZ2VEZXNjcmlwdG9yIFNZTkNFRF9FID0gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FTENMX1NZTkNFRCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJpYnV0aW9ucyBmb3IgdGhlIHZpZXcncyBsb2NhbCBtZW51LiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG1lcmdlIHRoZWlyIGNvbnRyaWJ1dGlvbnMgd2l0aCB0aGVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBtZW51IGNvbnRyaWJ1dGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjcmVhdGVNZW51Q29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlJQ29udHJpYnV0aW9uSXRlbSB0b2dnbGVMaW5rSXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obmV3IFRvZ2dsZUxpbmtBY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfTElOS19QUkVGKSk7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bXXt0b2dnbGVMaW5rSXRlbX07Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0b29sYmFyIGNvbnRyaWJ1dGlvbnMuIFN1YmNsYXNzZXMgc2hvdWxkIG1lcmdlIHRoZWlyCi0JICogY29udHJpYnV0aW9ucyB3aXRoIHRoZXNlLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRvb2xiYXIgY29udHJpYnV0aW9ucwotCSAqLwotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtIGNvbGxhcHNlQWxsSXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKG5ldyBDb2xsYXBzZVRyZWVBY3Rpb24odmlld2VyKSk7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bXXtjb2xsYXBzZUFsbEl0ZW19OwotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29udGVudFByb3ZpZGVyIHRvIHVzZSB3aXRoIHRoZSBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIElDb250ZW50UHJvdmlkZXIgdG8gdXNlIHdpdGggdGhpcyB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBLZXlMaXN0ZW5lcnMgdG8gYXR0YWNoIHRvIHRoZSBnaXZlbiB2aWV3ZXIncwotCSAqIGNvbnRyb2wgb3IgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBLZXlMaXN0ZW5lcnMgdG8gYXR0YWNoIHRvIHRoZSBUcmVlVmlld2VyJ3MgQ29udHJvbCwKLQkgKiAgICAgICAgIG9yIG51bGwuIFRoZSBsaXN0ZW5lcnMgc2hvdWxkIGFkaGVyZSB0byB0aGUgS2V5RXZlbnQuZG9pdCBmaWVsZAotCSAqICAgICAgICAgdG8gZW5zdXJlIHByb3BlciBiZWhhdmlvcnMuIE9yZGVyaW5nIG9mIHRoZSBldmVudCBub3RpZmljYXRpb25zCi0JICogICAgICAgICBpcyBkZXBlbmRlbnQgb24gdGhlIENvbnRyb2wgaW4gdGhlIFRyZWVWaWV3ZXIuCi0JICovCi0JcHVibGljIEtleUxpc3RlbmVyW10gZ2V0S2V5TGlzdGVuZXJzKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIExhYmVsUHJvdmlkZXIgZm9yIHRoZSBpdGVtcyB3aXRoaW4gdGhlIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgSUxhYmVsUHJvdmlkZXIgZm9yIGl0ZW1zIHdpdGhpbiB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpCi0JCQlmTGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBmb3IgdGhlIGxvY2FsIG1lbnUgaW4gdGhlIG91dGxpbmUuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gSUNvbnRyaWJ1dGlvbkl0ZW1bXSBmb3IgdGhlIGxvY2FsIG1lbnUKLQkgKi8KLQlwdWJsaWMgZmluYWwgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRNZW51Q29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZk1lbnVDb250cmlidXRpb25zID09IG51bGwpIHsKLQkJCWZNZW51Q29udHJpYnV0aW9ucyA9IGNyZWF0ZU1lbnVDb250cmlidXRpb25zKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIGZNZW51Q29udHJpYnV0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZW51IGxpc3RlbmVyIHRvIG5vdGlmeSB3aGVuIHRoZSBnaXZlbiB2aWV3ZXIncyBjb250ZXh0Ci0JICogbWVudSBpcyBhYm91dCB0byBiZSBzaG93biBvciBudWxsLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBJTWVudUxpc3RlbmVyIHRvIG5vdGlmeSB3aGVuIHRoZSB2aWV3ZXIncyBjb250ZXh0IG1lbnUgaXMKLQkgKiAgICAgICAgIGFib3V0IHRvIGJlIHNob3duLCBvciBudWxsCi0JICovCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFByZWZlcmVuY2VTdG9yZSB0byB1c2UgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGluIHdoaWNoIHRvIHJlbWVtYmVyIHByZWZlcmVuY2VzIChzdWNoIGFzCi0JICogICAgICAgICB0aGUgbGluay13aXRoLWVkaXRvciB0b2dnbGUgc3RhdGUpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gU1NFVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAoZmlsdGVyZWQpIHNlbGVjdGlvbiBmcm9tIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgbW9kZWwgc2VsZWN0aW9uCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIChmaWx0ZXJlZCkgc2VsZWN0aW9uIGZyb20gdGhpcyBldmVudC4gVXNlcyBpbmNsdWRlIG1hcHBpbmcKLQkgKiAgICAgICAgIG1vZGVsIHNlbGVjdGlvbiBvbnRvIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyLgotCSAqICAgICAgICAgU2hvdWxkIG9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgVHJlZQotCSAqICAgICAgICAgQ29udHJvbC4KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb250cmlidXRpb24gaXRlbXMgZm9yIHRoZSBsb2NhbCB0b29sYmFyIGluIHRoZSBvdXRsaW5lLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIElDb250cmlidXRpb25JdGVtW10gZm9yIHRoZSBsb2NhbCB0b29sYmFyCi0JICovCi0JcHVibGljIGZpbmFsIElDb250cmlidXRpb25JdGVtW10gZ2V0VG9vbGJhckNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZUb29sYmFyQ29udHJpYnV0aW9ucyA9PSBudWxsKSB7Ci0JCQlmVG9vbGJhckNvbnRyaWJ1dGlvbnMgPSBjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiBmVG9vbGJhckNvbnRyaWJ1dGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQWRvcHRlZCBzaW5jZSB5b3UgY2FuJ3QgZWFzaWx5IHJlbW92ZURyYWdTdXBwb3J0IGZyb20KLQkgKiBTdHJ1Y3R1cmVkVmlld2Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyWzBdOwotCX0KLQotCS8qKgotCSAqIEFkb3B0ZWQgc2luY2UgeW91IGNhbid0IGVhc2lseSByZW1vdmVEcm9wU3VwcG9ydCBmcm9tCi0JICogU3RydWN0dXJlZFZpZXdlcnMuCi0JICogCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycwotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lclswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBzZWxlY3Rpb24gY2hhbmdlcyBhZmZlY3Qgc2VsZWN0aW9uIGluIHRoZQotCSAqIFRyZWVWaWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgb3V0bGluZSBpcyBjdXJyZW50bHkgbGlua2VkIHRvIHNlbGVjdGlvbiBpbiBlZGl0b3IsCi0JICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmtlZFdpdGhFZGl0b3IoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBmSXNMaW5rV2l0aEVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IG91dGxpbmUgdmlldyBzaG91bGQgYmUgbGlua2VkIHdpdGggc2VsZWN0aW9uIGluCi0JICogZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpc0xpbmtXaXRoRWRpdG9yCi0JICogICAgICAgICAgICBUaGUgaXNMaW5rV2l0aEVkaXRvciB0byBzZXQuCi0JICovCi0Jdm9pZCBzZXRMaW5rV2l0aEVkaXRvcihib29sZWFuIGlzTGlua1dpdGhFZGl0b3IpIHsKLQkJZklzTGlua1dpdGhFZGl0b3IgPSBpc0xpbmtXaXRoRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYWwgaG9vayBmb3IgcmVzb3VyY2UgcmVsZWFzaW5nIGFuZCBsaXN0ZW5lciByZW1vdmFsIHdoZW4KLQkgKiBjb25maWd1cmF0aW9ucyBjaGFuZ2Ugb3IgdGhlIHZpZXdlciBpcyBkaXNwb3NlZCBvZi4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIHN0b3BzIG9mIGFueSByZW1haW5pbmcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIGZyb20KLQkgKiBwcmVmZXJlbmNlIGxpc3RlbmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZUb29sYmFyQ29udHJpYnV0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZUb29sYmFyQ29udHJpYnV0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmVG9vbGJhckNvbnRyaWJ1dGlvbnNbaV0gaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJKChQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGZUb29sYmFyQ29udHJpYnV0aW9uc1tpXSkuZGlzY29ubmVjdCgpOwotCQkJCX0KLQkJCX0KLQkJCWZUb29sYmFyQ29udHJpYnV0aW9ucyA9IG51bGw7Ci0JCX0KLQkJaWYgKGZNZW51Q29udHJpYnV0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZNZW51Q29udHJpYnV0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmTWVudUNvbnRyaWJ1dGlvbnNbaV0gaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJKChQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGZNZW51Q29udHJpYnV0aW9uc1tpXSkuZGlzY29ubmVjdCgpOwotCQkJCX0KLQkJCX0KLQkJCWZNZW51Q29udHJpYnV0aW9ucyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTb3VyY2VFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRlZWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLS8qKgotICogRGVjbGFyZXMgdGhhdCB0aGlzIElQcm9wZXJ0eVNvdXJjZSBtaWdodCBzdXBwb3J0IG91dHJpZ2h0IHJlbW92YWwgb2YgYQotICogcHJvcGVydHkKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSByZW1vdmVkLAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBtYXRjaGluZyB0aGlzIG5hbWUgY2FuIGJlIHJlbW92ZWQKLQkgKi8KLQlib29sZWFuIGlzUHJvcGVydHlSZW1vdmFibGUoT2JqZWN0IG5hbWUpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gZGlzcGxheWVkIG5hbWUuIElmIG5vIHN1Y2ggcHJvcGVydHkKLQkgKiBleGlzdHMsIG5vdGhpbmcgaXMgZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGRpc3BsYXllZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHkoT2JqZWN0IG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWUzOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCi0KLS8qKgotICogQ29uZmlndXJhdGlvbiBjbGFzcyBmb3IgUHJvcGVydHkgU2hlZXQgUGFnZXMuIE5vdCBmaW5hbGl6ZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgY29udHJpYnV0aW9uIG1lbnUgaXRlbXMgdG8gdGhlIGdpdmVuIG1lbnVNYW5hZ2VyLCB0b29sYmFyTWFuYWdlciwKLQkgKiBzdGF0dXNMaW5lTWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudU1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtZW51IG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgbG9jYWwgdG9vbGJhciBtYW5hZ2VyIG9mIHRoZSBwcm9wZXJ0eSBzaGVldAotCSAqIEBwYXJhbSBzdGF0dXNMaW5lTWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIHN0YXR1cyBsaW5lIG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgZm9yIGZpbHRlcmF0aW9uIG9mIHNlbGVjdGlvbiBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RpbmdQYXJ0Ci0JICogICAgICAgICAgICBtYXkgYmUgbnVsbAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIG1vZGVsIHNlbGVjdGlvbgotCSAqIEByZXR1cm4gdGhlIChmaWx0ZXJlZCkgc2VsZWN0aW9uIHRvIGJlIHNlbnQgdG8gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldElucHV0U2VsZWN0aW9uKElXb3JrYmVuY2hQYXJ0IHNlbGVjdGluZ1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCS8vIGRvbid0IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBzZWxlY3RlZCBub2RlCi0JCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPiAxKQotCQkJCXByZWZlcnJlZFNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQkJcmV0dXJuIHByZWZlcnJlZFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gcGFnZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgY29udHJpYnV0aW9uIG1lbnUgaXRlbXMgZnJvbSB0aGUgZ2l2ZW4gbWVudU1hbmFnZXIsCi0JICogdG9vbGJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBtZW51TWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGxvY2FsIG1lbnUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbCB0b29sYmFyIG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICogQHBhcmFtIHN0YXR1c0xpbmVNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEdlbmVyYWwgaG9vayBmb3IgcmVzb3VyY2UgcmVsZWFzaW5nIGFuZCBsaXN0ZW5lciByZW1vdmFsIHdoZW4KLQkgKiBjb25maWd1cmF0aW9ucyBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Rlc3RUb2MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Rlc3RUb2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQyYjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS90ZXN0VG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MKLQlsYWJlbD0iVGVzdCBUT0MiCi0JdG9waWM9Imh0bWwvdG9jLmh0bWwiPgotCTxsaW5rIHRvYz0idG9jLnhtbCIgLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS90b2MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzBiYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iU2FtcGxlIFRhYmxlIG9mIENvbnRlbnRzIj4KLQk8dG9waWMKLQkJbGFiZWw9Ik1haW4gVG9waWMiCi0JCWhyZWY9Imh0bWwvbWFpbnRvcGljLmh0bWwiPgotCQk8dG9waWMKLQkJCWxhYmVsPSJTdWIgVG9waWMiCi0JCQlocmVmPSJodG1sL3N1YnRvcGljLmh0bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiIgLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2RjYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMtY29udGVudG1vZGVsIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjLXNlYXJjaCIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYy12YWxpZGF0aW9uIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjLWNhdGFsb2ciIGtpbmQ9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMtZW1mTW9kZWxTeW5jaCIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIga2luZD0iY29uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIga2luZD0iY29uIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0iYmluIiBraW5kPSJvdXRwdXQiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2Y4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi14bWxtb2RlbC5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MGRmODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE3NTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM0MzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgQXVnIDE5IDE2OjMxOjQzIEVEVCAyMDA2DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2U2NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotUyA9IChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDogKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0JLy8gZG9uJ3QgbWF0Y2ggaWYgY29udGFpbnMgdHJhaWxpbmcgb3IgZW1iZWRkZWQgc3BhY2UKLQl7TmFtZX0ge1N9KyAgICAgICAgIHtyZXR1cm4gZmFsc2U7fQotCXtOYW1lfSB7U30rIHtOYW1lfSAge3JldHVybiBmYWxzZTt9Ci0KLQl7TmFtZX0gICAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTt9Ci0KLQkvLyBtYXRjaCBhbnl0aGluZyBzaG91bGQgY29tZSBsYXN0Ci0JLiAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0Je3JldHVybiBmYWxzZTt9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTBhMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLSUlCi0KLSV7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIFhNTEhlYWRUb2tlbml6ZXIKLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuCi0ldHlwZSBTdHJpbmcKLSVjaGFyCi0ldW5pY29kZQotJWlnbm9yZWNhc2UgCi0vLyVkZWJ1ZwotJXN3aXRjaAotJWJ1ZmZlciA4MTkyCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotLy9TcGFjZUNoYXIgPSBbXHgyMFx4MDldCi0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdCi0KLUJlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4KLQotCi0lc3RhdGUgU1RfWE1MRGVjbAotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPiAgCi17Ci0JLy8gZm9yY2UgdG8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIGxpbmUgKF4pIGFuZCBhdCBiZWdpbm5pbmcgb2YgZmlsZSAoeXljaGFyID09IDApCi0JXntVVEYxNkJFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO319Ci0JXntVVEYxNkxFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO319Ci0JXntVVEY4M0J5dGVCT019ICAgCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO319Ci0JCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMKLQleIHtTfSogIjxcP3htbCIge1N9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQotCQotfQkKLQkKLTxTVF9YTUxEZWNsPiAKLXsKLQkidmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQotCSJlbmNvZGluZyIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQotCS8vIG5vdGUgdGhlICJmb3JjZWQgZW5kIiAodmlhICdoYXNNb3JlPWZhbHNlJykgb25jZSB0aGUgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotCS8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzIAotCS8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLiAKLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQkKLQotCQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19CQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLQlcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCXtTfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQotCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotLy8gdGhpcyBpcyB0aGUgZmFsbGJhY2sgKG1hdGNoICJhbnl0aGluZyIpIHJ1bGUgIChmb3IgdGhpcyBzY2FubmVyLCBpbnB1dCBpcyBpZ25vcmVkLCBhbmQgcG9zaXRpb24gYWR2YW5jZWQsIGlmIG5vdCByZWNvZ25pemVkKQotLnxcbiAgICAgICAgICAgICAge2lmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQotfQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQotCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGROYW1lcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NzU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IlhNTDEwTmFtZXMiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUwxME5hbWVzLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTDEwTmFtZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYxOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkhlYWRUb2tlbml6ZXIiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxIZWFkVG9rZW5pemVyLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkhlYWRUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmNGZhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQ7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3Rvcnk7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDtyZXNvbHV0aW9uOj1vcHRpb25hbDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO3Jlc29sdXRpb246PW9wdGlvbmFsO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIiwKLSBvcmcuYXBhY2hlLnhlcmNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydDtidW5kbGUtdmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlOyBleGNlcHRpb25zPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNjQ2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVEhlIFhNTCBzcGVjaWZpYyBtb2RlbCBpbXBsZW1lbnRhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjY4YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC8KLXNvdXJjZS4uID0gc3JjLWNhdGFsb2csXAotICAgICAgICAgICBzcmMtY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLyxcCi0gICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICBzcmMtZW1mTW9kZWxTeW5jaC8sXAotICAgICAgICAgICBzcmMtc2VhcmNoLwotCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDYxZWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL3htbC9vdmVydmlldy5odG1sIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJYTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2UiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS54ZXJjZXMiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkNTRmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIFhNTCBNb2RlbAotU3RydWN0dXJlZF9YTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIFhNTCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotWE1MX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCAoSWxsZm9ybWVkKQotIyBjb250ZW50bW9kZWwgc3RyaW5ncwotQ29udGVudF9Nb2RlbF9Eb2N1bWVudF9GYWN0b3JpZXNfRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBNb2RlbCBEb2N1bWVudCBGYWN0b3JpZXMKLUNvbnRlbnRfTW9kZWxfQW5ub3RhdGlvbl9GaWxlc19FeHRlbnNpb24ubmFtZT1Db250ZW50IE1vZGVsIEFubm90YXRpb24gRmlsZXMKLU1vZGVsX1F1ZXJ5X0V4dGVuc2lvbi5uYW1lPU1vZGVsIFF1ZXJ5IEV4dGVuc2lvbgotWE1MX0NhdGFsb2dfQ29udHJpYnV0aW9uc19FeHRlbnNpb25fUG9pbnQubmFtZT1YTUwgQ2F0YWxvZyBDb250cmlidXRpb25zIEV4dGVuc2lvbiBQb2ludAotWFNMX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhTTAotWE1JX0NvbnRlbnRfVHlwZT1YTUkKLVhNTF9WYWxpZGF0b3IubmFtZT1YTUwgVmFsaWRhdG9yCi1YTUxfVmFsaWRhdGlvbl9FcnJvcl9DdXN0b21pemVyLm5hbWU9WE1MIFZhbGlkYXRvciBFcnJvciBDdXN0b21pemVyIEV4dGVuc2lvbiBQb2ludApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzE1ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPCEtLSBBbiBleHRlbnNpb24gZm9yIGNvbnRyaWJ1dGluZyBhIFhNTCB2YWxpZGF0aW9uIGVycm9yIGN1c3RvbWl6ZXIuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXJyb3JDdXN0b21pemVyIiBuYW1lPSIlWE1MX1ZhbGlkYXRpb25fRXJyb3JfQ3VzdG9taXplci5uYW1lIiBzY2hlbWE9InNjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZCIvPgotCi0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmVtYmVkZGVkVHlwZUhhbmRsZXIiPgotCQk8ZW1iZWRkZWRUeXBlSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRYTUwiPgotCQk8L2VtYmVkZGVkVHlwZUhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCTwvZXh0ZW5zaW9uPgotCSAKLSAgIDwhLS0gSGVyZSB3ZSBkZWZpbmUgYSBuZXcgZXh0ZW5zaW9uIHBvaW50LiAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZAotICAgICAgICB0byBwcm9ncmFtbWF0aWNhbGx5IGNvbnRyaWJ1dGUgY2F0YWxvZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZy4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjYXRhbG9nQ29udHJpYnV0aW9ucyIgbmFtZT0iJVhNTF9DYXRhbG9nX0NvbnRyaWJ1dGlvbnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NhdGFsb2dDb250cmlidXRpb25zLmV4c2QiLz4KLQotICAgPCEtLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBleHRlbmRzIHRoZSBDb21tb24gRXh0ZW5zYmlsZSBVUkkgUmVzb2x2ZXIgc28gdGhhdAotICAgICAgICB0aGUgWE1MIENhdGFsb2cgY2FuIHBhcnRpY2lwYXJlIGluIHJlc29sdmluZyBwcm9jZXNzZXMuIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgICAgPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT0icG9zdG5vcm1hbGl6YXRpb24iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uIj4KLSAgICAgIDwvcmVzb2x2ZXJFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllczIiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX1hNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhzbHQiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZGFkeCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ3c2RsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Im5zdCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4bWkiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNkIj4KLQkJPC9maWxlVHlwZXM+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUwiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWwseHNsLHhzbHQsd3NkbCx4c2QsZXhzZCx4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ4bWxzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9yWE1MIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InhzbCx4c2x0IgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlWFNMX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9InhzbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwODMgLS0+XAotCTwhLS0gIEZZSTogdGhpcyB4bWkgdHlwZSAqc2hvdWxkKiBiZSBkZWZpbmVkIGluIEVNRiwgYnV0LCBzaW5jZSBpc24ndAotCQkJd2Ugd2lsbCBoZXJlLiBJbiBmdXR1cmUgdmVyc2lvbnMgaXMgY291bGQgYmUgcmVtb3ZlZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNSV9Db250ZW50X1R5cGUiCi0JCQlpZD0ieG1pc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUgeG1sIGNvcmUgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb2N1bWVudEZhY3RvcmllcyIgbmFtZT0iJUNvbnRlbnRfTW9kZWxfRG9jdW1lbnRfRmFjdG9yaWVzX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9kb2N1bWVudEZhY3Rvcmllcy5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyIgbmFtZT0iJU1vZGVsX1F1ZXJ5X0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9tb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhbm5vdGF0aW9uRmlsZXMiIG5hbWU9IiVDb250ZW50X01vZGVsX0Fubm90YXRpb25fRmlsZXNfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkIi8+CQotCQkKLQk8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBjb250ZXh0PSJVSSIKLSAgICAgICAgICAgIGtleT0icmVuZGVyZXJGYWN0b3J5IgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbC5FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5Ij4KLSAgICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgIGtleT0iVmFsaWRhdGVFZGl0Q29udGV4dCIKLSAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQiCi0gICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhNTCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotIDxleHRlbnNpb24KLSBpZD0ieG1sVmFsaWRhdG9yIgotCQluYW1lPSIlWE1MX1ZhbGlkYXRvci5uYW1lIgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgIDx2YWxpZGF0b3I+Ci0gICAgPCEtLSBUaGVyZSBpcyBhIGN1c3RvbSBYTUwgdmFsaWRhdG9yIGZvciBFSkJzIC0tPgotCQkJPHByb2plY3ROYXR1cmUKLQkJCQlpbmNsdWRlPSJmYWxzZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSI+Ci0JCQk8L3Byb2plY3ROYXR1cmU+Ci0JCQk8IS0tIFRoZXJlIGlzIGEgY3VzdG9tIFhNTCB2YWxpZGF0b3IgZm9yIEVBUnMgLS0+Ci0JCQk8cHJvamVjdE5hdHVyZQotCQkJCWluY2x1ZGU9ImZhbHNlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotCQkJPC9wcm9qZWN0TmF0dXJlPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQljYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLQkJCQluYW1lRmlsdGVyPSIqLnhtbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0JCQkJbmFtZUZpbHRlcj0iKi5ncGgiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCWNhc2VTZW5zaXRpdmU9ImZhbHNlIgotCQkJCW5hbWVGaWx0ZXI9Iioud2RvLWNvbm5lY3Rpb25zIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQljYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLQkJCQluYW1lRmlsdGVyPSIqLnRsZCIgLz4KLQkJCQkKLSAgICA8aGVscGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuSGVscGVyIj4KLQkJCTwvaGVscGVyPgotCQkJCi0gICAgICAgPHJ1bgotICAgICAgICAgICAgIGFzeW5jPSJ0cnVlIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgIGZ1bGxCdWlsZD0idHJ1ZSIKLSAgICAgICAgICAgICBpbmNyZW1lbnRhbD0idHJ1ZSIvPgotICAgIDwvdmFsaWRhdG9yPgotIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxN2Y1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkZpbGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJhbm5vdGF0aW9uRmlsZXMiIG5hbWU9IkNvbnRlbnQgTW9kZWwgQW5ub3RhdGlvbiBGaWxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5ub3RhdGlvbkZpbGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbkZpbGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdWJsaWNJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2NhdGFsb2dDb250cmlidXRpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwNTk3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImNhdGFsb2dDb250cmlidXRpb25zIiBuYW1lPSJYTUwgQ2F0YWxvZyBDb250cmlidXRpb25zIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdG8gc3BlY2lmeSBlbnRyaWVzIGZvciBYTUwgQ2F0YWxvZy4gIENhdGFsb2cgZW50cmllcyBoYXZlIGZvcm1hdCBzcGVjaWZpZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZG93bmxvYWQucGhwLzE0MDQxL3htbC1jYXRhbG9ncy5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvc3BlYy5odG1sJmx0Oy9hJmd0Oy4gIAotRWFjaCBjYXRhbG9nIGV4dGVuc2lvbiBjb25zaXN0cyBvZiBhIHNpbmdsZSBjYXRhbG9nQ29udHJpYnV0aW9uIGVsZW1lbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRhbG9nQ29udHJpYnV0aW9uIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0YWxvZ0NvbnRyaWJ1dGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIGNhdGFsb2dDb250cmlidXRpb24gZWxlbWVudCBtYXkgaGF2ZSBpZCwgYW5kIGl0IGlzIGp1c3QgYSBjb250YWluZXIgZm9yIHRoZSBjb250cmlidXRlZCBjYXRhbG9nIGVudHJpZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InB1YmxpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idXJpIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5leHRDYXRhbG9nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgY2F0YWxvZyB0byB3aGljaCBlbnRyaWVzIHdpbGwgYmUgYWRkZWQuIENvdWxkIGJlICZxdW90O2RlZmF1bHQmcXVvdDssIGFuZCBpZiBvbW1pdGVkLCBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgZGVmYXVsdCB3b3Jrc3BhY2UgY2F0YWxvZy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGljIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgcHVibGljIGVsZW1lbnQgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgcHVibGljIGlkZW50aXRpZXIgcG9ydGlvbiBvZiBhbiBleHRlcm5hbCBpZGVudGlmaWVyLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwdWJsaWMgaWRlbnRpZmllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWJVUkwiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3MgZm9yIHRoZSBwdWJsaWMgSUQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3lzdGVtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgc3lzdGVtIGVsZW1lbnRzIGFzc29jaWF0ZXMgYSBVUkkgcmVmZXJlbmNlIHdpdGggdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBlbGVtZW50LCBvcHRpb25hbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW1JZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIgcG9ydGlvbiBvZiBhbiBleHRlcm5hbCBpZGVudGlmaWVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSwgdXNlIHBsYXRmb3JtOi8gb3IgZmlsZTovIHByb3RvY29scy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InVyaSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIHVyaSBlbGVtZW50IGFzc29jaWF0ZXMgYSBVUkkgcmVmZXJlbmNlIHdpdGggdGhlIGEgVVJJIHJlZmVyZW5jZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgVVJJIHJlZmVyZW5jZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFuIGV4dGVybmFsIGlkZW50aXRpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5leHRDYXRhbG9nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgbmV4dENhdGFsb2cgZWxlbWVudHMgaW5kaWNhdGUgYWRkaXRpb25hbCBjYXRhbG9nIGVudHJ5IGZpbGUocykgdG8gYmUgY29uc2lkZXJlZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgcmVzb2x1dGlvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLmNhdGFsb2dDb250cmlidXRpb25zJnF1b3Q7Jmd0OwotICAgICAgJmx0O2NhdGFsb2dDb250cmlidXRpb24mZ3Q7IAotICAgICAgICAgJmx0O3N5c3RlbSAKLSAgICAgICAgICAgICAgIHN5c3RlbUlkPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvJnF1b3Q7Ci0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2Qvd3NkbC54bWwmcXVvdDsgJmd0OyAKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7d2ViVVJMJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L3N5c3RlbSZndDsKLSAgICAgICAgICZsdDt1cmkKLSAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyZxdW90OyAKLSAgICAgICAgICAgICAgIHVyaT0mcXVvdDtkYXRhL3hzZC9zb2FwLnhzZCZxdW90Oy8mZ3Q7IAotICAgICAgICAgJmx0O3B1YmxpYwotICAgICAgICAgICAgICAgcHVibGljSWQ9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJnF1b3Q7Ci0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2QvWFNMU2NoZW1hLnhzZCZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7d2ViVVJMJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L3B1YmxpYyZndDsKLSAgICAgICAgICZsdDtuZXh0Q2F0YWxvZwotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7bmVzdGVkQ2F0YWxvZyZxdW90OyAKLSAgICAgICAgICAgICAgIGNhdGFsb2c9JnF1b3Q7ZGF0YS9jYXRhbG9nMS54bWwmcXVvdDsvJmd0OyAKLSAgICAgICZsdDsvY2F0YWxvZ0NvbnRyaWJ1dGlvbiZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2RvY3VtZW50RmFjdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwZDkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImRvY3VtZW50RmFjdG9yaWVzIiBuYW1lPSJDb250ZW50IE1vZGVsIERvY3VtZW50IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ZjE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZXJyb3JDdXN0b21pemVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJlcnJvckN1c3RvbWl6ZXIiIG5hbWU9IlhNTCBWYWxpZGF0aW9uIEVycm9yIEN1c3RvbWl6ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGVycm9yIGN1c3RvbWl6ZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIGNsaWVudCB0byBjb250cmlidXRlIGFuIGVycm9yIGN1c3RvbWl6ZXIgZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlLiBUaGUgZXJyb3IgY3VzdG9taXplciBjYW4gcHJvdmlkZSBlcnJvciBtZXNzYWdlcyB0aGF0IGFyZSBtb3JlIGRvbWFpbiBzcGVjaWZpYyB0aGFuIHRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2VzIHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGdlbmVyaWMgWE1MIHZhbGlkYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXJyb3JDdXN0b21pemVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlcnJvckN1c3RvbWl6ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWVzcGFjZSBmb3Igd2hpY2ggdGhpcyBlcnJvciBjdXN0b21pemVyIHdpbGwgY29uc2lkZXIgZXJyb3IgY3VzdG9taXphdGlvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEVycm9yIEN1c3RvbWl6ZXIgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIGlkPSZxdW90O3NhbXBsZUVycm9yQ3VzdG9taXplciZxdW90OwotICAgICAgICAgbmFtZT0mcXVvdDtTYW1wbGUgRXJyb3IgQ3VzdG9taXplciZxdW90OwotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmVycm9yQ3VzdG9taXplciZxdW90OyZndDsKLSAgICAgICZsdDtlcnJvckN1c3RvbWl6ZXIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vc2FtcGxlLm5hbWVzcGFjZSZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLlNhbXBsZUVycm9yQ3VzdG9taXplciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL21vZGVsUXVlcnlFeHRlbnNpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkZGYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9Im1vZGVsUXVlcnlFeHRlbnNpb25zIiBuYW1lPSJNb2RlbCBRdWVyeSBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZGVsUXVlcnlFeHRlbnNpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGVsUXVlcnlFeHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTE3YTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1wdWJsaWMgY2xhc3MgQ2F0YWxvZyBpbXBsZW1lbnRzIElDYXRhbG9nCi17Ci0KLQljbGFzcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZSgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCW5ldyBDYXRhbG9nV3JpdGVyKCkud3JpdGUoQ2F0YWxvZy50aGlzLCBsb2NhdGlvbik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgRGVmYXVsdENhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCU5leHRDYXRhbG9nIHVzZXJDYXRhbG9nUmVmZXJlbmNlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCQl1c2VyQ2F0YWxvZ1JlZmVyZW5jZS5zZXRJZChYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRCk7Ci0JCQl1c2VyQ2F0YWxvZ1JlZmVyZW5jZS5zZXRDYXRhbG9nTG9jYXRpb24oVVNFUl9DQVRBTE9HX0ZJTEUpOwotCQkJYWRkQ2F0YWxvZ0VsZW1lbnQodXNlckNhdGFsb2dSZWZlcmVuY2UpOwotCi0JCQlOZXh0Q2F0YWxvZyBzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCQlzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlLnNldElkKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQpOwotCQkJc3lzdGVtQ2F0YWxvZ1JlZmVyZW5jZS5zZXRDYXRhbG9nTG9jYXRpb24oU1lTVEVNX0NBVEFMT0dfRklMRSk7Ci0JCQlhZGRDYXRhbG9nRWxlbWVudChzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlKTsKLQotCQkJLyoKLQkJCSAqIEhlcmUgd2Ugc2F2ZSB0aGUgZmlsZSBpbiBvcmRlciB0byAncmVmbGVjdCcgdGhlIGNhdGFsb2cgdGhhdAotCQkJICogd2UndmUgY3JlYXRlZCBmcm9tIHBsdWctaW4gZXh0ZW5zaW9ucyB0byBkaXNrLiBUaGUgJ2RlZmF1bHQnCi0JCQkgKiBjYXRhbG9nIGlzIG9ubHkgZXZlciB3cml0dGVuIHRvIGRpc2sgYW5kIG5ldmVyIHJlYWQgZnJvbSBkaXNrLgotCQkJICovCi0JCQlzYXZlKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbnRlcm5hbFJlc29sdmVyCi0JewotCQlwcm90ZWN0ZWQgTWFwIHB1YmxpY01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvdGVjdGVkIE1hcCBzeXN0ZW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByb3RlY3RlZCBNYXAgdXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlJbnRlcm5hbFJlc29sdmVyKCkKLQkJewotCQkJZm9yIChJdGVyYXRvciBpID0gY2F0YWxvZ0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSAoSUNhdGFsb2dFbGVtZW50KSBpLm5leHQoKTsKLQkJCQlpZiAoY2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKQotCQkJCXsKLQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLQkJCQkJTWFwIG1hcCA9IGdldEVudHJ5TWFwKGVudHJ5LmdldEVudHJ5VHlwZSgpKTsKLQkJCQkJbWFwLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgTWFwIGdldEVudHJ5TWFwKGludCBlbnRyeVR5cGUpCi0JCXsKLQkJCU1hcCBtYXAgPSBzeXN0ZW1NYXA7Ci0JCQlzd2l0Y2ggKGVudHJ5VHlwZSkKLQkJCXsKLQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCQltYXAgPSBwdWJsaWNNYXA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk6Ci0JCQkJbWFwID0gdXJpTWFwOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBtYXA7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBlZFVSSShNYXAgbWFwLCBTdHJpbmcga2V5KQotCQl7Ci0JCQlDYXRhbG9nRW50cnkgZW50cnkgPSAoQ2F0YWxvZ0VudHJ5KSBtYXAuZ2V0KGtleSk7Ci0JCQlpZihlbnRyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCVN0cmluZyB1cmkgPSBlbnRyeS5nZXRVUkkoKTsKLQkJCXRyeQotCQkJewotICAgICAgICAgICAgICAgIC8vIFRPRE8gQ1MgOiBkbyB3ZSByZWFsbHkgd2FudCB0byByZXNvbHZlIHRoZXNlIGhlcmU/Ci0gICAgICAgICAgICAgICAgLy8gSSdtIGd1ZXNzaW5nIHdlIHNob3VsZCByZXR1cm4gdGhlICdwbGF0Zm9ybTonIGZvcm0gb2YgdGhlIFVSSQotICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjYWxsZXIuCi0gICAgICAgICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHsgIAotCQkJCSAgVVJMIGVudHJ5VVJMID0gbmV3IFVSTChlbnRyeS5nZXRBYnNvbHV0ZVBhdGgodXJpKSk7ICAgICAgICAgICAgICAgIAotCQkJCSAgdXJpID0gUGxhdGZvcm0ucmVzb2x2ZShlbnRyeVVSTCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgVVJJJ3MgYXJlIG9mIGZvcm0gImZpbGU6Ly8vRDovWFhYIiBhbmQgTk9UICAKLSAgICAgICAgICAgICAgICAgIC8vICJmaWxlOkQ6L1hYWCIuICBPdGhlcndpc2UgdGhlIEVNRiBVUkkgY2xhc3MgZ2V0cyBjb25mdXNlZAotICAgICAgICAgICAgICAgICAgLy8gKHNlZSBidWcgMTAzNjA3KSAKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBGSUxFX1NDSEVNRSA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1NDSEVNRSkgJiYgIXVyaS5zdGFydHNXaXRoKEZJTEVfU0NIRU1FICsgIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1cmkgPSBGSUxFX1NDSEVNRSArICIvLy8iICsgdXJpLnN1YnN0cmluZyhGSUxFX1NDSEVNRS5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIHJldHVybiB1cmk7IAotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVB1YmxpYyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLQkJCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCQl7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHB1YmxpY01hcCwgcHVibGljSWQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IGdldE1hcHBlZFVSSShzeXN0ZW1NYXAsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCS8vIG91ciBjbGllbnRzIHVzZWQgdG8gcGFzcyBuYW1lc3BhY2UgaW4gcGxhY2Ugb2YgcHVibGljIGlkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHVyaSBtYXAgZm9yIHRob3NlCi0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHVyaU1hcCwgcHVibGljSWQpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQywgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlc29sdmVTeXN0ZW0oU3RyaW5nIHN5c3RlbUlkKQotCQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBnZXRNYXBwZWRVUkkoc3lzdGVtTWFwLCBzeXN0ZW1JZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNLCBudWxsLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0JCQkJSU9FeGNlcHRpb24KLQkJewotCQkJU3RyaW5nIHJlc3VsdCA9IGdldE1hcHBlZFVSSSh1cmlNYXAsIHVyaSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJLCBudWxsLCB1cmkpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCWNsYXNzIFN5c3RlbUNhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCW5ldyBDYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlcihDYXRhbG9nLnRoaXMpLnJlYWRSZWdpc3RyeSgpOwotCi0JCQkvKgotCQkJICogSGVyZSB3ZSBzYXZlIHRoZSBmaWxlIGluIG9yZGVyIHRvICdyZWZsZWN0JyB0aGUgY2F0YWxvZyB0aGF0Ci0JCQkgKiB3ZSd2ZSBjcmVhdGVkIGZyb20gcGx1Z2luIGV4dGVuc2lvbnMgdG8gZGlzay4gCi0JCQkgKiBUaGUgJ3N5c3RlbScgY2F0YWxvZyBpcyBvbmx5IGV2ZXIgd3JpdHRlbiB0byBkaXNrIGFuZCBuZXZlciByZWFkIGZyb20gZGlzay4KLQkJCSAqLwotCQkJc2F2ZSgpOwotCQl9Ci0JfQotCi0JY2xhc3MgVXNlckNhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeQotCQkJewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLQkJCQlpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZmljYXRpb25FbmFibGVkID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJY2xlYXIoKTsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCUNhdGFsb2dSZWFkZXIucmVhZChDYXRhbG9nLnRoaXMsIGlucHV0U3RyZWFtKTsKLQkJCQl9IGZpbmFsbHkKLQkJCQl7Ci0JCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZpY2F0aW9uRW5hYmxlZCk7Ci0JCQkJfQotCQkJCW5vdGlmeUNoYW5nZWQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJfSBmaW5hbGx5Ci0JCQl7Ci0JCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19GSUxFID0gImRlZmF1bHRfY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fQ0FUQUxPR19GSUxFID0gInN5c3RlbV9jYXRhbG9nLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ0FUQUxPR19GSUxFID0gInVzZXJfY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYXRhbG9nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ0xTIGNhdGFsb2dMUzsKLQotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLQlwcm90ZWN0ZWQgSW50ZXJuYWxSZXNvbHZlciBpbnRlcm5hbFJlc29sdmVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkOwotCi0JcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLQotCXByb3RlY3RlZCBDYXRhbG9nU2V0IHJlc291cmNlU2V0OwotCi0JcHVibGljIENhdGFsb2coQ2F0YWxvZ1NldCBjYXRhbG9nUmVzb3VyY2VTZXQsIFN0cmluZyBpZCwgU3RyaW5nIGxvY2F0aW9uKQotCXsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IGNhdGFsb2dSZXNvdXJjZVNldDsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0KLQkJaWYgKFhNTENvcmVQbHVnaW4uREVGQVVMVF9DQVRBTE9HX0lELmVxdWFscyhpZCkpCi0JCXsKLQkJCWNhdGFsb2dMUyA9IG5ldyBEZWZhdWx0Q2F0YWxvZ0xTKCk7Ci0JCX0gZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMoaWQpKQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgU3lzdGVtQ2F0YWxvZ0xTKCk7Ci0JCX0gZWxzZQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgVXNlckNhdGFsb2dMUygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpCi0JewotCQljYXRhbG9nRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQllbGVtZW50LnNldE93bmVyQ2F0YWxvZyh0aGlzKTsKLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeUFkZEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cmllc0Zyb21DYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpCi0JewotCQl0cnkKLQkJewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoY2F0YWxvZyAhPSBudWxsKQotCQkJewotCQkJCUlDYXRhbG9nRWxlbWVudFtdIGVudHJpZXMgPSAoKENhdGFsb2cpY2F0YWxvZykuZ2V0Q2F0YWxvZ0VsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJQ2F0YWxvZ0VsZW1lbnQgY2xvbmUgPSAoQ2F0YWxvZ0VsZW1lbnQpKChDYXRhbG9nRWxlbWVudCllbnRyaWVzW2ldKS5jbG9uZSgpOwotCQkJCQlhZGRDYXRhbG9nRWxlbWVudChjbG9uZSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQl7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJhcmd1bWVudCB3YXMgbnVsbCBpbiBDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseQotCQl7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQl9Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkKLQl7Ci0JCWNhdGFsb2dFbGVtZW50cy5jbGVhcigpOwotCQlpbnRlcm5hbFJlc29sdmVyID0gbnVsbDsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoaW50IHR5cGUpCi0JewotCQlzd2l0Y2ggKHR5cGUpCi0JCXsKLQkJY2FzZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWToKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VudHJ5KCk7Ci0JCWNhc2UgSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HOgotCQkJcmV0dXJuIG5ldyBOZXh0Q2F0YWxvZygpOwotCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM6Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbnRyeShJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDKTsKLQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRW50cnkoSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSk7Ci0JCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSToKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VudHJ5KElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkkpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRWxlbWVudCh0eXBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZSgpCi0JewotCQlyZXR1cm4gYmFzZTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Q2F0YWxvZ0VsZW1lbnRzKGludCB0eXBlKQotCXsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDYXRhbG9nRWxlbWVudFtdIGVsZW1lbnRzID0gKElDYXRhbG9nRWxlbWVudFtdKSBjYXRhbG9nRWxlbWVudHMKLQkJCQkudG9BcnJheShuZXcgSUNhdGFsb2dFbGVtZW50W2NhdGFsb2dFbGVtZW50cy5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJewotCQkJSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmdldFR5cGUoKSA9PSB0eXBlKQotCQkJewotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeVtdIGdldENhdGFsb2dFbnRyaWVzKCkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0Q2F0YWxvZ0VsZW1lbnRzKElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLQkJcmV0dXJuIChJQ2F0YWxvZ0VudHJ5W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBJQ2F0YWxvZ0VudHJ5W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ1NldCBnZXRDYXRhbG9nU2V0KCkKLQl7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLQl7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSU5leHRDYXRhbG9nW10gZ2V0TmV4dENhdGFsb2dzKCkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0Q2F0YWxvZ0VsZW1lbnRzKElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0JCXJldHVybiAoSU5leHRDYXRhbG9nW10pIHJlc3VsdC50b0FycmF5KG5ldyBJTmV4dENhdGFsb2dbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJbnRlcm5hbFJlc29sdmVyIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpCi0JewotCQlpZiAoaW50ZXJuYWxSZXNvbHZlciA9PSBudWxsKQotCQl7Ci0JCQlpbnRlcm5hbFJlc29sdmVyID0gbmV3IEludGVybmFsUmVzb2x2ZXIoKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxSZXNvbHZlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKQotCXsKLQkJcmV0dXJuIGlzTm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQljYXRhbG9nTFMubG9hZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUFkZEVsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVudHJ5KQotCXsKLQkJaWYgKGlzTm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJewotCQkJSUNhdGFsb2dFdmVudCBldmVudCA9IG5ldyBDYXRhbG9nRXZlbnQodGhpcywgZW50cnksCi0JCQkJCUlDYXRhbG9nRXZlbnQuRUxFTUVOVF9BRERFRCk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hhbmdlZCgpCi0JewotCQlJQ2F0YWxvZ0V2ZW50IGV2ZW50ID0gbmV3IENhdGFsb2dFdmVudCh0aGlzLCBudWxsLAotCQkJCUlDYXRhbG9nRXZlbnQuQ0hBTkdFRCk7Ci0JCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElDYXRhbG9nRXZlbnQgZXZlbnQpCi0JewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyID0gKElDYXRhbG9nTGlzdGVuZXIpIGkubmV4dCgpOwotCQkJbGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVtb3ZlRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChpc05vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCXsKLQkJCUlDYXRhbG9nRXZlbnQgZXZlbnQgPSBuZXcgQ2F0YWxvZ0V2ZW50KHRoaXMsIGVsZW1lbnQsCi0JCQkJCUlDYXRhbG9nRXZlbnQuRUxFTUVOVF9SRU1PVkVEKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWNhdGFsb2dFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlSZW1vdmVFbGVtZW50KGVsZW1lbnQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlUHVibGljKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRPckNyZWF0ZUludGVybmFsUmVzb2x2ZXIoKS5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlU3Vib3JkaW5hdGVDYXRhbG9ncyhpbnQgZW50cnlUeXBlLCBTdHJpbmcgcHVibGljSWQsCi0JCQlTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQlJQ2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCQl7Ci0JCQkJc3dpdGNoIChlbnRyeVR5cGUpCi0JCQkJewotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVVUkkoc3lzdGVtSWQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlU3lzdGVtKFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkucmVzb2x2ZVN5c3RlbShzeXN0ZW1JZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpLnJlc29sdmVVUkkodXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQljYXRhbG9nTFMuc2F2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJhc2UoU3RyaW5nIGJhc2UpCi0JewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pCi0JewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGIpCi0JewotCQlpc05vdGlmaWNhdGlvbkVuYWJsZWQgPSBiOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnRbXSBnZXRDYXRhbG9nRWxlbWVudHMoKQotCXsKLQkJcmV0dXJuIChJQ2F0YWxvZ0VsZW1lbnRbXSkgY2F0YWxvZ0VsZW1lbnRzLnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtjYXRhbG9nRWxlbWVudHMuc2l6ZSgpXSk7Ci0JfQotCQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ5Njk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNhdGFsb2dDb250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVFJJQlVUSU9OID0gImNhdGFsb2dDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0gIC8qCi0gICAqIHRoaXMgaXMgYSBzYW1wbGUgZXhwdGVuc2lvbiAKLSAgICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4gCi0gICAqIDxjYXRhbG9nQ29udHJpYnV0aW9uPgotICAgKiAgICA8dXJpCi0gICAqICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgKiAgICAgICAgICAgICB1cmk9InhzZC9zb2FwLnhzZCIvPiAKLSAgICogICAJPHB1YmxpYwotICAgKiAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICogICAgICAgICAgdXJpPSJkdGRzL3hodG1sMTEtZmxhdC5kdGQiLz4gCi0gICAqICAJPG5leHRDYXRhbG9nIGlkPSJuZXN0ZWRDYXRhbG9nIiBjYXRhbG9nPSJkYXRhL2NhdGFsb2cxLnhtbCIvPiAKLSAgICogIDwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4gCi0gICAqICA8L2V4dGVuc2lvbj4KLSAgICogIAotICAgKi8KLSAgcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBkZWNsYXJpbmdFeHRlbnNpb25JZDsKLSAgCi0gIHByb3RlY3RlZCBDYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlcihJQ2F0YWxvZyBhQ2F0YWxvZykKLSAgewotICAgIGNhdGFsb2cgPSBhQ2F0YWxvZzsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlUGF0aChVUkwgcGxhdGZvcm1VUkwsIFN0cmluZyBwYXRoKSAKLSAgeyAgICAgIAotCVN0cmluZyBmaWxlTG9jYXRpb24gPSBwYXRoOwotCWludCBqYXJQYXRoU3RhcnQgPSBwYXRoLmluZGV4T2YoImphcjoiKTsgLy8kTk9OLU5MUy0xJAotCWphclBhdGhTdGFydCA9IGphclBhdGhTdGFydCA8IDAgPyAwIDogamFyUGF0aFN0YXJ0ICsgImphcjoiLmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JaW50IGphclBhdGhFbmQgPSBwYXRoLmluZGV4T2YoIiEiKTsgLy8kTk9OLU5MUy0xJAotCWphclBhdGhFbmQgPSBqYXJQYXRoRW5kIDwgMCA/IHBhdGgubGVuZ3RoKCkgOiBqYXJQYXRoRW5kOwotCWZpbGVMb2NhdGlvbiA9IHBhdGguc3Vic3RyaW5nKGphclBhdGhTdGFydCwgamFyUGF0aEVuZCk7Ci0JCi0JU3RyaW5nIHJlc3VsdCA9IHBhdGg7Ci0JU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSBmaWxlTG9jYXRpb247Ci0JVVJMIHJlc29sdmVkVVJMID0gbnVsbDsKLSAgICBpZiAoZmlsZUxvY2F0aW9uLnN0YXJ0c1dpdGgoInBsYXRmb3JtOi9wbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIC8vIHRoaXMgaXMgdGhlIHNwZWNsaWFsIGNhc2UsIHdoZXJlIHRoZSByZXNvdXJjZSBpcyBsb2NhdGVkIHJlbGF0aXZlIAotICAgICAgLy8gdG8gYW5vdGhlciBwbHVnaW4gKG5vdCB0aGUgb25lIHRoYXQgZGVjbGFyZXMgdGhlIGV4dGVuc2lvbiBwb2ludCkKLSAgICAgIC8vCi0JCXRyeQotCQl7Ci0JCQlyZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChmaWxlTG9jYXRpb24pKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJLy8gZG8gbm90aGluZwotCQl9IAotICAgIH0KLSAgICBlbHNlewotICAgIAkgLy8gdGhpcyBpcyB0aGUgdHlwaWNhbCBjYXNlLCB3aGVyZSB0aGUgcmVzb3VyY2UgaXMgbG9jYXRlZCByZWxhdGl2ZQotICAgICAgICAvLyB0byB0aGUgcGx1Z2luIHRoYXQgZGVjbGFyZXMgdGhlIGV4dGVuc2lvbiBwb2ludAotICAgIAkgdHJ5IHsKLSAgICAJICAgICAJcmVzb2x2ZWRVUkwgPSBuZXcgVVJMKFBsYXRmb3JtLnJlc29sdmUocGxhdGZvcm1VUkwpLCBmaWxlTG9jYXRpb24pOwotICAgIAkgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgIAkgICAgCS8vIGRvIG5vdGhpbmcKLSAgICAJIH0KLSAgICB9Ci0gICAKLSAgIGlmKHJlc29sdmVkVVJMICE9IG51bGwpewotICAgIAlyZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZWRVUkwudG9FeHRlcm5hbEZvcm0oKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlRmlyc3QoZmlsZUxvY2F0aW9uLCByZXNvbHZlZExvY2F0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBVUkwgZ2V0UGxhdGZvcm1VUkwoU3RyaW5nIHBsdWdpbklkKXsKLQkgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCXsKLQkJCVVSTCBidW5kbGVFbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmKGJ1bmRsZUVudHJ5ICE9IG51bGwpewotCQkJCXRyeQotCQkJCXsKLQkJCQkJcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoYnVuZGxlRW50cnkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHJlc29sdmVQYXRoKFN0cmluZyBwYXRoKQotICB7Ci0JICByZXR1cm4gcmVzb2x2ZVBhdGgoZ2V0UGxhdGZvcm1VUkwoZGVjbGFyaW5nRXh0ZW5zaW9uSWQpLCBwYXRoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdHJ5Ci0gICAgewotCSAgZGVjbGFyaW5nRXh0ZW5zaW9uSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKFRBR19DT05UUklCVVRJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSl7Ci0gICAgCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCW1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCW1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG5leHRDYXRhbG9nRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfTkVYVF9DQVRBTE9HKTsKLSAgICAJcHJvY2Vzc05leHRDYXRhbG9nRWxlbWVudHMobmV4dENhdGFsb2dFbGVtZW50TGlzdCk7Ci0gICAgCQotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzTWFwcGluZ0luZm9FbGVtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZEVsZW1lbnRMaXN0KQotICB7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRWxlbWVudExpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IGNoaWxkRWxlbWVudExpc3RbaV07Ci0gICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLQkKLSAgICAgIGludCB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLSAgICAgIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQy5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpOwotICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRy5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXXtjaGlsZEVsZW1lbnR9KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgU3RyaW5nIGVudHJ5VVJJID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpOyAvLyBtYW5kYXRvcnkKLSAgICAgIGlmIChlbnRyeVVSSSA9PSBudWxsIHx8IGVudHJ5VVJJLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0gICAgICBpZiAoY2F0YWxvZ0VsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KQotICAgICAgewotICAgICAgICBJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2dFbGVtZW50OwotICAgICAgICBlbnRyeS5zZXRLZXkoa2V5KTsKLQkJU3RyaW5nIHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYXRoKGVudHJ5VVJJKTsKLQkJZW50cnkuc2V0VVJJKHJlc29sdmVkUGF0aCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOyAvLyBvcHRpb25hbAotICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgZW50cnkuc2V0SWQoaWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBwcm9jZXNzIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKVtqXTsKLSAgICAgICAgaWYgKCFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRykgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmICFhdHRyVmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkRWxlbWVudExpc3QpCi0gIHsKLSAgICBpZiAoY2F0YWxvZyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRFbGVtZW50TGlzdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGRFbGVtZW50ID0gY2hpbGRFbGVtZW50TGlzdFtpXTsKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRyk7IC8vIG1hbmRhdG9yeQotICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSBuZXcgTmV4dENhdGFsb2coKTsKLQkgIFN0cmluZyByZXNvbHZlZFBhdGggPSByZXNvbHZlUGF0aChsb2NhdGlvbik7Ci0gICAgICBuZXh0Q2F0YWxvZy5zZXRDYXRhbG9nTG9jYXRpb24ocmVzb2x2ZWRQYXRoKTsKLQkgIFN0cmluZyBpZCA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOwotCSAgaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgCi0JCSAgbmV4dENhdGFsb2cuc2V0SWQoaWQpOwotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChuZXh0Q2F0YWxvZyk7Ci0gICAgfQotICB9Ci0gIAotIAotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZmQwOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0JaW50IHR5cGU7Ci0KLQlTdHJpbmcgaWQ7Ci0KLQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlJQ2F0YWxvZyBvd25lckNhdGFsb2c7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0VsZW1lbnQoaW50IGFUeXBlKQotCXsKLQkJc3VwZXIoKTsKLQkJdHlwZSA9IGFUeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0JewotCQlhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJQ29sbGVjdGlvbiBjID0gYXR0cmlidXRlcy52YWx1ZXMoKTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjLnNpemUoKV07Ci0JCWF0dHJpYnV0ZXMua2V5U2V0KCkudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2cgZ2V0T3duZXJDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBvd25lckNhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJDYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpCi0JewotCQl0aGlzLm93bmVyQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbWFrZUFic29sdXRlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBsb2NhdGlvbikKLQl7Ci0JCVVSTCBsb2NhbCA9IG51bGw7Ci0JCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgnXFwnLCAnLycpOwotCQl0cnkKLQkJewotCQkJVVJMIGJhc2VVUkwgPSBuZXcgVVJMKGJhc2VMb2NhdGlvbik7Ci0JCQlsb2NhbCA9IG5ldyBVUkwoYmFzZVVSTCwgbG9jYXRpb24pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJewotCQl9Ci0KLQkJaWYgKGxvY2FsICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiBsb2NhbC50b1N0cmluZygpOwotCQl9IGVsc2UKLQkJewotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQl0cnkKLQkJewotCQkJVVJJIHVyaSA9IG5ldyBVUkkocGF0aCk7Ci0JCQlpZiAodXJpLmlzQWJzb2x1dGUoKSkKLQkJCXsKLQkJCQlyZXR1cm4gcGF0aDsKLQkJCX0KLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0JCXsKLQkJfQotCi0JCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCQlDYXRhbG9nIGNhdGFsb2cgPSAoQ2F0YWxvZykgZ2V0T3duZXJDYXRhbG9nKCk7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBiYXNlID0gY2F0YWxvZy5nZXRCYXNlKCk7Ci0JCQlpZiAoYmFzZSA9PSBudWxsIHx8IGJhc2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWJhc2UgPSBjYXRhbG9nLmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBtYWtlQWJzb2x1dGUoYmFzZSwgcGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JICAvKgotCSAgICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBldmVudHMgbm90aWZpY2F0aW9ucyBmb3IgZW50cnkgcHJvcGVydGllcywgY2xvbmUoKQotCSAgICogY291bGQgYWxsb3cgdG8gY29weSBhbmQgZWRpdCBlbnRyeSBhbmQgdGhlbiByZXBsYWNlIGl0IGluIGNhdGFsb2cuIEVudHJ5Ci0JICAgKiByZXBsYWNlbWVudCB3aWxsIHNpZ25hbCBJQ2F0YWxvZ0V2ZW50IEByZXR1cm4KLQkgICAqLwotCSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0JICB7Ci0JCUlDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gb3duZXJDYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotCSAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOyAgIAotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspCi0JICAgIHsKLQkgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2ldOwotCSAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSk7Ci0JICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkgICAgfQotCQllbGVtZW50LnNldE93bmVyQ2F0YWxvZyhvd25lckNhdGFsb2cpOwotCQllbGVtZW50LnNldElkKGlkKTsKLQkgICAgcmV0dXJuIGVsZW1lbnQ7Ci0JICB9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjQzNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnkgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudCBpbXBsZW1lbnRzIElDYXRhbG9nRW50cnksIENsb25lYWJsZQotewotICBpbnQgZW50cnlUeXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLSAgU3RyaW5nIGtleTsKLSAgU3RyaW5nIHVyaTsKLQotICBwcm90ZWN0ZWQgQ2F0YWxvZ0VudHJ5KGludCBhbkVudHJ5VHlwZSkKLSAgewotICAgIHN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLSAgICBlbnRyeVR5cGUgPSBhbkVudHJ5VHlwZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDYXRhbG9nRW50cnkoKQotICB7Ci0gICAgc3VwZXIoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW50cnlUeXBlKGludCB2YWx1ZSkKLSAgewotICAgIGVudHJ5VHlwZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbnRyeVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGVudHJ5VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBrZXkgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgewotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdXJpID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIENhdGFsb2dFbnRyeSBlbnRyeSA9IChDYXRhbG9nRW50cnkpc3VwZXIuY2xvbmUoKTsKLQllbnRyeS5zZXRFbnRyeVR5cGUoZW50cnlUeXBlKTsKLSAgICBlbnRyeS5zZXRLZXkoa2V5KTsKLSAgICBlbnRyeS5zZXRVUkkodXJpKTsKLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmY2M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIENhdGFsb2dFdmVudCBpbXBsZW1lbnRzIElDYXRhbG9nRXZlbnQKLXsKLSAgcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0gIHByb3RlY3RlZCBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQgZXZlbnRUeXBlOwotCi0gIHB1YmxpYyBDYXRhbG9nRXZlbnQoQ2F0YWxvZyBjYXRhbG9nLCBJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSkKLSAgewotICAgIHRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0gICAgdGhpcy5jYXRhbG9nRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy5ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgSUNhdGFsb2cgZ2V0Q2F0YWxvZygpCi0gIHsKLSAgICByZXR1cm4gY2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0Q2F0YWxvZ0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNhdGFsb2dFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGV2ZW50VHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQyZGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2F0YWxvZ1JlYWRlcgotewotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVhZChDYXRhbG9nIHhtbENhdGFsb2csIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpLCBuZXcgQ2F0YWxvZ0NvbnRlbnRIYW5kbGVyKHhtbENhdGFsb2cpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDYXRhbG9nQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7Ci0gICAgcHJvdGVjdGVkIENhdGFsb2cgY2F0YWxvZzsKLSAgICBwcm90ZWN0ZWQgU3RhY2sgYmFzZVVSSVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLSAgICBwdWJsaWMgQ2F0YWxvZ0NvbnRlbnRIYW5kbGVyKENhdGFsb2cgeG1sQ2F0YWxvZykKLSAgICB7Ci0gICAgICB0aGlzLmNhdGFsb2cgPSB4bWxDYXRhbG9nOwotICAgICAgYmFzZVVSSVN0YWNrLnB1c2goeG1sQ2F0YWxvZy5nZXRCYXNlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIC8vIHNldCBiYXNlCi0gICAgICBTdHJpbmcgYmFzZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0JBU0UpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoYmFzZSAhPSBudWxsICYmICFiYXNlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgICBiYXNlVVJJU3RhY2sucHVzaChiYXNlKTsgICAgCi0gICAgICB9Ci0KLQkgIC8vIHByb2Nlc3NpbmcgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgc3RhcnQKLQkgIGlmIChsb2NhbE5hbWUuZXF1YWxzKENvbXBhdGFiaWxpdHlDb25zdGFudHMuVEFHX1VTRVJfRU5UUlkpKQotICAgICAgewotCQlpbnQgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIENvbXBhdGFiaWxpdHlDb25zdGFudHMuQVRUX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHR5cGVOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoIlNZU1RFTSIpID09IDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJICBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotCSAgICAgIGlmIChjYXRhbG9nRWxlbWVudCBpbnN0YW5jZW9mIENhdGFsb2dFbnRyeSkKLQkgICAgICB7Ci0JICAgICAgICBDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKENhdGFsb2dFbnRyeSkgY2F0YWxvZ0VsZW1lbnQ7Ci0JCSAgICBTdHJpbmcga2V5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfSUQpOyAgIAkJICAgICAvLyROT04tTkxTLTEkCi0JICAgICAgICBjYXRhbG9nRW50cnkuc2V0S2V5KGtleSk7Ci0JICAgICAgICBTdHJpbmcgZW50cnlVcmkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9VUkkpOyAgICAvLyROT04tTkxTLTEkCi0JICAgICAgICBjYXRhbG9nRW50cnkuc2V0VVJJKGVudHJ5VXJpKTsgIAotCSAgICAgICAgU3RyaW5nIHdlYlVSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIENvbXBhdGFiaWxpdHlDb25zdGFudHMuQVRUX1dFQl9VUkwpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAod2ViVVJMICE9IG51bGwpCi0JCQl7Ci0JCQkJY2F0YWxvZ0VudHJ5LnNldEF0dHJpYnV0ZVZhbHVlKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwsIHdlYlVSTCk7Ci0JCQl9Ci0JICAgICAgfQotCQkgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotCQkgIHJldHVybjsKLSAgICAgIH0KLQkgIC8vICBwcm9jZXNzaW5nIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IHN0YXJ0Ci0gICAgICAKLQkgIGludCB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLQkgIFN0cmluZyBrZXkgPSBudWxsOwotCSAvL2R3IFN0cmluZyBjYXRhbG9nSWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCk7Ci0gICAgICBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19QVUJMSUMuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUkkuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ORVhUX0NBVEFMT0cuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXh0Q2F0YWxvZ0lkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRyk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTmV4dENhdGFsb2cgZGVsZWdhdGUgPSBuZXcgTmV4dENhdGFsb2coKTsKLSAgICAgICAgZGVsZWdhdGUuc2V0Q2F0YWxvZ0xvY2F0aW9uKGxvY2F0aW9uKTsgIAotICAgICAgICBkZWxlZ2F0ZS5zZXRJZChuZXh0Q2F0YWxvZ0lkKTsKLSAgICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChkZWxlZ2F0ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2V7Ci0gICAgCSAgLy8gZG8gbm90IGhhbmRsZSBvdGhlciBlbnRyaWVzCi0gICAgCSAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBlbnRyeVVSSSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSk7IC8vIG1hbmRhdG9yeSAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoZW50cnlVUkkgPT0gbnVsbCB8fCBlbnRyeVVSSS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV91cmlfbm90X3NldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAKLSAgICAgIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0gICAgICBpZiAoY2F0YWxvZ0VsZW1lbnQgaW5zdGFuY2VvZiBDYXRhbG9nRW50cnkpCi0gICAgICB7Ci0gICAgICAgIENhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLSAgICAgICAgY2F0YWxvZ0VudHJ5LnNldEtleShrZXkpOyAKLSAgICAgICAgY2F0YWxvZ0VudHJ5LnNldFVSSShlbnRyeVVSSSk7ICAgICAKLSAgICAgIH0KLSAgICAgIC8vIHByb2Nlc3MgYW55IG90aGVyIGF0dHJpYnV0ZXMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShqKTsKLSAgICAgICAgaWYgKCFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRykgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmICFhdHRyVmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChiYXNlVVJJU3RhY2suc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgYmFzZVVSSVN0YWNrLnBvcCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfSAgCi0gIAotICAvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQotICBpbnRlcmZhY2UgQ29tcGF0YWJpbGl0eUNvbnN0YW50c3sKLQkgIAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX1hNTF9DQVRBTE9HX1NFVFRJTkdTID0gIlhNTENhdGFsb2dTZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9VU0VSX0VOVFJJRVMgPSAiVXNlckVudHJpZXMiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVNFUl9FTlRSWSA9ICJVc2VyRW50cnkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0VCX1VSTCA9ICJXRUJfVVJMIjsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjBlNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotcHVibGljIGNsYXNzIENhdGFsb2dTZXQgewotCXByb3RlY3RlZCBNYXAgdXJpUmVzb3VyY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBNYXAgY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlwdWJsaWMgQ2F0YWxvZ1NldCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGEgQ2F0YWxvZyB3aXRoIHRoZSBnaXZlbiBJRC4gIElmIG9uZSBpcyBub3QgZm91bmQsIGNyZWF0ZSBvbmUgYXQgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdXJpIC0gdGhlIFVSSSwgdGhlIHBhcmVudCBvZiB0aGlzIGZpbGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENhdGFsb2cgbG9va3VwT3JDcmVhdGVDYXRhbG9nKFN0cmluZyBpZCwgU3RyaW5nIHVyaSkgewotCQlDYXRhbG9nIGNhdGFsb2cgPSBnZXRDYXRhbG9nKGlkLCB1cmkpOwotCQlpZiAoY2F0YWxvZyA9PSBudWxsKSB7Ci0JCQljYXRhbG9nID0gbmV3IENhdGFsb2codGhpcywgaWQsIHVyaSk7Ci0JCQl0cnkgewotCQkJCWNhdGFsb2cubG9hZCgpOwotCQkJCXVyaVJlc291cmNlTWFwLnB1dCh1cmksIGNhdGFsb2cpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2UgY2F0Y2ggYW5kIGxvZyBhbGwgZXhjZXB0aW9ucywgdG8gZGlzYWxsb3cKLQkJCQkvLyBvbmUgYmFkIGV4dGVuc2lvbiBpbnRlcmZlcmluZyB3aXRoIG90aGVycwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGxvYWRpbmcgY2F0YWxvZzogIiArIGlkICsgIiAiICsgdXJpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGFsb2c7Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nIGdldENhdGFsb2coU3RyaW5nIGlkLCBTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiAoQ2F0YWxvZykgdXJpUmVzb3VyY2VNYXAuZ2V0KHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oU3RyaW5nIGxvZ2ljYWxVUkksIFN0cmluZyBhY3R1YWxVUkkpIHsKLQkJY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zLnB1dChsb2dpY2FsVVJJLCBhY3R1YWxVUkkpOwotCX0KLQotCS8vIE5ldmVyIHVzZWQ/Ci0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGNhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9ucy5nZXQoaWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0MTUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogV3JpdGUgT0FTSVMgWE1MIENhdGFsb2cgZm9ybWF0Ci0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENhdGFsb2dXcml0ZXIKLXsKLSAgcHJpdmF0ZSBEb2N1bWVudCBkb2M7Ci0KLSAgcHVibGljIHZvaWQgd3JpdGUoSUNhdGFsb2cgeG1sQ2F0YWxvZywgU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIHZpc2l0Q2F0YWxvZyh4bWxDYXRhbG9nKTsKLSAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gZ2V0T3V0cHV0U3RyZWFtKHVyaSk7Ci0gICAgc2VyaWFsaXplKG91dHB1dFN0cmVhbSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZShJQ2F0YWxvZyBjYXRhbG9nLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoY2F0YWxvZyAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0Q2F0YWxvZyhjYXRhbG9nKTsKLSAgICAgIHNlcmlhbGl6ZShvcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHZpc2l0Q2F0YWxvZyhJQ2F0YWxvZyB4bWxDYXRhbG9nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIEVsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5uYW1lc3BhY2VOYW1lLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0NBVEFMT0cpOwotICAgIGRvYy5hcHBlbmRDaGlsZChjYXRhbG9nRWxlbWVudCk7Ci0gICAgcHJvY2Vzc0NhdGFsb2dFbnRyaWVzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgICBwcm9jZXNzTmV4dENhdGFsb2dzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2F0YWxvZ0VudHJpZXMoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBJQ2F0YWxvZ0VudHJ5W10gY2F0YWxvZ0VudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0gIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZ0VudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGNhdGFsb2dFbnRyaWVzW2ldOwotICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgU3RyaW5nIHVyaSA9IGVudHJ5LmdldFVSSSgpOwotCSAgU3RyaW5nIGlkID0gZW50cnkuZ2V0SWQoKTsKLQkgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLQkgCi0gICAgIHN3aXRjaCAoZW50cnkuZ2V0RW50cnlUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FLCBrZXkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQkgIGlmKGNoaWxkRWxlbWVudCAhPSBudWxsICYmIGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0JCSAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCwgaWQpOwotCSAgfQotICAgICAgCi0gICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gZW50cnkuZ2V0QXR0cmlidXRlcygpOyAgIAotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdOwotICAgICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCAmJiAhYXR0ck5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0JCSAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXh0Q2F0YWxvZ3MoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICAvLyBoYW5kbGUgY2F0YWxvZyBlbnRyaWVzCi0gICAgSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAvL2R3IFN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElOZXh0Q2F0YWxvZyBkZWxlZ2F0ZSA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRyk7Ci0gICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBkZWxlZ2F0ZS5nZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCQkgU3RyaW5nIGlkID0gZGVsZWdhdGUuZ2V0SWQoKTsKLQkJIGlmIChpZCAhPSBudWxsKQotCQkgewotCQkJIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQsIGlkKTsKLQkJIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIFVubGVzcyBhIHdpZHRoIGlzIHNldCwgdGhlcmUgd2lsbCBiZSBvbmx5IGxpbmUgYnJlYWtzIGJ1dCBubwotICAgICAgLy8gaW5kZW50YXRpb24uCi0gICAgICAvLyBUaGUgSUJNIEpESyBhbmQgdGhlIFN1biBKREsgZG9uJ3QgYWdyZWUgb24gdGhlIHByb3BlcnR5IG5hbWUsCi0gICAgICAvLyBzbyB3ZSBzZXQgdGhlbSBib3RoLgotICAgICAgLy8KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIGVuY29kaW5nID0gIlVURi04IjsgLy8gVEJEIC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBlbmNvZGluZyk7Ci0gICAgICB9Ci0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2MpLCBuZXcgU3RyZWFtUmVzdWx0KG91dHB1dFN0cmVhbSkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZpbGVQYXRoID0gcmVtb3ZlUHJvdG9jb2wodXJpKTsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0gICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOyAgCi0gICAgU3RyaW5nIHByb3RvY29sX3BhdHRlcm4gPSAiOiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YocHJvdG9jb2xfcGF0dGVybik7Ci0gICAgICBpZiAoaW5kZXggPiAyKQotICAgICAgewotICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGluZGV4ICsgcHJvdG9jb2xfcGF0dGVybi5sZW5ndGgoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL05leHRDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjBmMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgUmFqIE1hbmRheWFtLCBJQk0KLSAqICAgICAgICAgICAxMzY0MDAgTmV4dENhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKSB0YWtlcyBhIGxvdCBvZiB0aW1lIGNvbXB1dGluZyBjb25zdGFudCBpbmZvcm1hdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBOZXh0Q2F0YWxvZyBleHRlbmRzIENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSU5leHRDYXRhbG9nCi17Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nOwotCi0gIHB1YmxpYyBOZXh0Q2F0YWxvZygpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZyBnZXRSZWZlcmVuY2VkQ2F0YWxvZygpCi0gIHsKLSAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZlcmVuY2VkQ2F0YWxvZyA9ICgoQ2F0YWxvZylvd25lckNhdGFsb2cpLmdldENhdGFsb2dTZXQoKS5sb29rdXBPckNyZWF0ZUNhdGFsb2coZ2V0SWQoKSwgZ2V0QWJzb2x1dGVQYXRoKGxvY2F0aW9uKSk7Ci0gICAgfQotICAgIHJldHVybiByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENhdGFsb2dMb2NhdGlvbihTdHJpbmcgdXJpKQotICB7Ci0gICAgbG9jYXRpb24gPSB1cmk7Ci0gICAgcmVmZXJlbmNlZENhdGFsb2cgPSBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotCU5leHRDYXRhbG9nIG5leHRDYXRhbG9nID0gKE5leHRDYXRhbG9nKXN1cGVyLmNsb25lKCk7Ci0JbmV4dENhdGFsb2cuc2V0Q2F0YWxvZ0xvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICByZXR1cm4gbmV4dENhdGFsb2c7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL09BU0lTQ2F0YWxvZ0NvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTA3NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VOYW1lID0gInVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUeXBlcyBvZiB0aGUgY2F0YWxvZyBlbnRyaWVzICovCi0gIC8qKiBUaGUgQ0FUQUxPRyBlbGVtZW50IG5hbWUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgR1JPVVAgY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0dST1VQID0gImdyb3VwIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFBVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFVCTElDID0gInB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBTWVNURU0gY2F0YWxvZyBldG5yeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NZU1RFTSA9ICJzeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFJFV1JJVEVfU1lTVEVNIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVdSSVRFX1NZU1RFTSA9ICJyZXdyaXRlU3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFJFV1JJVEVfVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVdSSVRFX1VSSSA9ICJyZXdyaXRlUHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1BVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfUFVCTElDID0gImRlbGVnYXRlUHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1NZU1RFTSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfU1lTVEVNID0gImRlbGVnYXRlU3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1VSSSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfVVJJID0gImRlbGVnYXRlVXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIE5FWFRfQ0FUQUxPRyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkVYVF9DQVRBTE9HID0gIm5leHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlcyAqLwotICAvKiogQXR0cmlidXRlIGlkIHVzZWQgaW4gYWxsIGNhdGFsb2cgZW50cmllcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlIGlkIGJhc2UgaW4gYWxsIGNhdGFsb2cgZW50cmllcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0JBU0UgPSAieG1sOmJhc2UiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBBdHRyaWJ1dGUgaWQgcHJlZmVyZSBpbiBjYXRhbG9nIGVudHJpZXM6IENBVEFMT0csIEdST1VQICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJFRkVSRSA9ICJwcmVmZXJlIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFBVQkxJQyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBTWVNURU0KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1lTVEVNX0lEID0gInN5c3RlbUlkIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFVSSQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUFVCTElDLCBVUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgREVMRUdBVEVfU1lTVEVNCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NZU1RFTV9JRF9TVEFSVF9TVFJJTkcgPSAic3lzdGVtSWRTdGFydFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgUkVXUklURV9VUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVXUklURV9QUkVGSVggPSAicmV3cml0ZVByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBERUxFR0FURV9QVUJMSUMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFVCTElDX0lEX1NUQVJUX1NUUklORyA9ICJwdWJsaWNJZFN0YXJ0U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IERFTEVHQVRFX1BVQkxJQywKLSAgICogREVMRUdBVEVfU1lTVEVNLCBERUxFR0FURV9VUkksIE5FWFRfQ0FUQUxPRwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUkVXUklURV9VUkksIERFTEVHQVRFX1VSSQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VUklfU1RBUlRfU1RSSU5HID0gInVyaVN0YXJ0U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlOTVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluamVjdCB0aGUgWE1MQ2F0YWxvZyByZXNvbHV0aW9uIGJlaGF2aW91ciBpbnRvIHRoZQotICogQ29tbW9uIEV4dGVuc2libGUgVVJJIFJlc29sdmVyLiBUaGlzIGNsYXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlIFhNTCBDYXRhbG9nCi0gKiBwbHVnaW4ncyBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBVUklSZXNvbHZlckV4dGVuc2lvbgotewotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICAvLyBpZiB3ZSBoYXZlIGNhdGFsb2cgaW4gYSBwcm9qZWN0IHdlIG1heSBhZGQgaXQKLSAgICAvLyB0byB0aGUgY2F0YWxvZyBtYW5hZ2VyIGZpcnN0Ci0gICAgSUNhdGFsb2cgY2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2cpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIFN0cmluZyByZXNvbHZlZCA9IG51bGw7Ci0gICAgaWYgKHN5c3RlbUlkICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLSAgICAgICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVVSSShzeXN0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmwpOwotICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbik7Ci0gICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIENTIDogdGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBidWcgOTY3NzIKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRm9yIHNjaGVtYXMgd2UgYWx3YXlzIHVzZSBsb2NhdGlvbnMgd2hlcmUgYXZhaWxhYmxlIGFuZCBvbmx5IHVzZQotICAgICAgICAvLyBuYW1lc3BhY2Ugd2hlbiBubyBsb2NhdGlvbiBpcyBzcGVjaWZpZWQuICBGb3IgWE1MIGVudGl0aWVzIChzdWNoIGFzIERPQ1RZUEUpIAotICAgICAgICAvLyBkZWZhdWx0IGFsd2F5cyB1dGlsaXplIHRoZSBwdWJsaWMgY2F0YWxvZyBlbnRyeS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhpcyBsYW1lIHRlc3QgYmVsb3cgcm91Z2hseSBkaXNjcmltaW5hdGUgYmV0d2VlbiBzY2hlbWEgYW5kIFhNTCBlbnRpdGllcy4KLSAgICAgICAgLy8gVE9ETyAoYnVnIDEwMzI0MykgcmVtb3ZlIHRoaXMgbGFtZSB0ZXN0IG9uY2Ugd2UgbW92ZSB0byB0aGUgbmV3IFVSSVJlc29sdmVyIEFQSQotICAgICAgICAvLyBzaW5jZSB0aGUgbmV3IEFQSSBpcyBleHBsaWNpdCBhYm91dCBuYW1lc3BhY2UgYW5kIHB1YmxpY0lkCi0gICAgICAgIC8vIAotICAgICAgICBpZiAoIShzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLmVuZHNXaXRoKCIueHNkIikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVB1YmxpYyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlVVJJKHB1YmxpY0lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9tYWxmb3JtZWRfdXJsKTsKLSAgICAgICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGllKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbik7Ci0gICAgICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWNiNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2cKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNhdGFsb2cgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICogQHJldHVybiBjYXRhbG9nIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIGNhdGFsb2cgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2FibGUgUFVCTElDIG9yIFNZU1RFTSBpZGVudGlmaWVyLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNlYXJjaGVzIHRoZSBDYXRhbG9nIGFuZCByZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllcgotICAgICAqIHNwZWNpZmllZCBmb3IgdGhlIGdpdmVuIHN5c3RlbSBvciBwdWJsaWMgaWRlbnRpZmllcnMuIElmIG5vIGFwcHJvcHJpYXRlCi0gICAgICogUFVCTElDIG9yIFNZU1RFTSBlbnRyeSBpcyBmb3VuZCBpbiB0aGUgQ2F0YWxvZywgbnVsbCBpcyByZXR1cm5lZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHB1YmxpY0lkCi0gICAgICogICAgICAgICAgICBUaGUgcHVibGljIGlkZW50aWZpZXIgdG8gbG9jYXRlIGluIHRoZSBjYXRhbG9nLiBQdWJsaWMKLSAgICAgKiAgICAgICAgICAgIGlkZW50aWZpZXJzIGFyZSBub3JtYWxpemVkIGJlZm9yZSBjb21wYXJpc29uLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZAotICAgICAqICAgICAgICAgICAgVGhlIG5vbWluYWwgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZSBlbnRpdHkgaW4gcXVlc3Rpb24gKGFzCi0gICAgICogICAgICAgICAgICBwcm92aWRlZCBpbiB0aGUgc291cmNlIGRvY3VtZW50KS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBmb3JtYWwgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdAotICAgICAqICAgICAgICAgICAgIGJlIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciB0byB1c2UuIE5vdGUgdGhhdCB0aGUgbm9taW5hbCBzeXN0ZW0KLSAgICAgKiAgICAgICAgIGlkZW50aWZpZXIgaXMgbm90IHJldHVybmVkIGlmIGEgbWF0Y2ggaXMgbm90IGZvdW5kIGluIHRoZQotICAgICAqICAgICAgICAgY2F0YWxvZywgaW5zdGVhZCBudWxsIGlzIHJldHVybmVkIHRvIGluZGljYXRlIHRoYXQgbm8gbWF0Y2ggd2FzCi0gICAgICogICAgICAgICBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVQdWJsaWMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYXBwbGljYWJsZSBTWVNURU0gc3lzdGVtIGlkZW50aWZpZXIuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBTWVNURU0gZW50cnkgZXhpc3RzIGluIHRoZSBDYXRhbG9nIGZvciB0aGUgc3lzdGVtIElEIHNwZWNpZmllZCwKLSAgICAgKiByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogT24gV2luZG93cy1iYXNlZCBvcGVyYXRpbmcgc3lzdGVtcywgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3lzdGVtCi0gICAgICogaWRlbnRpZmllciBwcm92aWRlZCBhbmQgdGhlIFNZU1RFTSBlbnRyaWVzIGluIHRoZSBDYXRhbG9nIGlzCi0gICAgICogY2FzZS1pbnNlbnNpdGl2ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHN5c3RlbUlkCi0gICAgICogICAgICAgICAgICBUaGUgc3lzdGVtIElEIHRvIGxvY2F0ZSBpbiB0aGUgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBzeXN0ZW0gaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBmb3JtYWwgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdAotICAgICAqICAgICAgICAgICAgIGJlIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVTeXN0ZW0oU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2FibGUgVVJJLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIElmIGEgVVJJIGVudHJ5IGV4aXN0cyBpbiB0aGUgQ2F0YWxvZyBmb3IgdGhlIFVSSSBzcGVjaWZpZWQsIHJldHVybiB0aGUKLSAgICAgKiBtYXBwZWQgdmFsdWUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFVSSSBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogICAgICAgICAgICBUaGUgVVJJIHRvIGxvY2F0ZSBpbiB0aGUgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBVUkkuCi0gICAgICogCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBjYXRhbG9nIGVsZW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gb2YgdGhlIGNhdGFsb2cgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQgLQotICAgICAqICAgICAgICAgICAgY2F0YWxvZyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBjYXRhbG9nIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB0aGUgY2F0YWxvZyBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtCi0gICAgICogICAgICAgICAgICBjYXRhbG9nIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMgb2YgdHlwZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZ0VudHJ5W10gZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cyBvZiB0eXBlCi0gICAgICogSUNhdGFsb2dFbGVtZW50LlRZUEVfREVMRUdBVEUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSU5leHRDYXRhbG9nW10gZ2V0TmV4dENhdGFsb2dzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG5ldyBjYXRhbG9nIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUuIElmIHRoZSB0eXBlIGlzIG9uZQotICAgICAqIG9mIEVMRU1FTlRfVFlQRSwgdGhlIHJlc3VsdCBlbnRyeSB3aWxsIGhhdmUgY29ycmVzcG9uZGluZyBpbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoaW50IHR5cGUpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBjYXRhbG9nLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0gICAgCi0gICAgLy9wdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIExvYWRzIGNhdGFsb2cgZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiBFeHBlY3RpbmcgT0FTSVMgWE1MIENhdGFsb2cKLSAgICAgKiBmb3JtYXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gLQotICAgICAqICAgICAgICAgICAgdXJpIG9mIHRoZSBmaWxlIHdoZXJlIGNhdGFsb2cgd2lsbCBiZSBzYXZlZAotCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCi0gICAgICogICAgICAgICAgICAgcHJvYmxlbSBsb2FkaW5nIGZpbGUKLSAgICAgKiAKLSAgICAgKi8KLSAgICAvL3B1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogU2F2ZXMgY2F0YWxvZyB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIE9BU0lTIFhNTCBDYXRhbG9nIGZvcm1hdAotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhdGlvbiAtCi0gICAgICogICAgICAgICAgICB1cmkgb2YgdGhlIGZpbGUgd2hlcmUgY2F0YWxvZyB3aWxsIGJlIHNhdmVkCi0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICBwcm9ibGVtIHNhdmluZyBmaWxlCi0gICAgICogCi0gICAgICovCi0gICAgLy9wdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNvcGllcyBhbGwgY2F0YWxvZyBlbnRyaWVzIGZyb20gc291cmNlIGNhdGFsb2cgdG8gdGhpcyBvbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGFsb2cgLQotICAgICAqICAgICAgICAgICAgc291cmNlIGNhdGFsb2cKLSAgICAgKiBAcGFyYW0gaW5jbHVkZU5lc3RlZCAtCi0gICAgICogICAgICAgICAgICBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdldGhlciB0byBpbmNsdWRlIGVudHJpZXMgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzYW1lIHR5cGUgZnJvbSB0aGUgbmVzdGVkIGNhdGFsb2dzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRW50cmllc0Zyb21DYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtCi0gICAgICogICAgICAgICAgICBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiBAc2VlIElDYXRhbG9nRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLQotICAgICAqICAgICAgICAgICAgbGlzdGVuZXIgb2YgdGhlIGNhdGFsb2cgZXZlbnRzCi0gICAgICogQHNlZSBJQ2F0YWxvZ0V2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcik7ICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEzZDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRWxlbWVudAotewotICAgIC8qKiBUeXBlcyBvZiB0aGUgY2F0YWxvZyBlbnRyaWVzICovCi0gICAgLyoqIFRoZSBQVUJMSUMsIFVSSSBvciBTWVNURU0gQ2F0YWxvZyBFbnRyeS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VOVFJZID0gMTsKLQotICAgIC8qKiBUaGUgTkVYVF9DQVRBTE9HIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05FWFRfQ0FUQUxPRyA9IDEwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqLwotICAgIGludCBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpdGggc3BlY2lmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpZmllZCBuYW1lLgotICAgICAqIEBzZWUgI3NldEF0dHJpYnV0ZVZhbHVlKFN0cmluZykKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHdpbGwgYmUgc2V0Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSBuYW1lZCBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVmFsdWUoKQotICAgICAqLwotICAgIHZvaWQgc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcyBmb3IgYW55IGR5bmFtaWMgYXR0cmlidXRlcyB0aGF0IG1heSBleGlzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVmFsdWUoKQotICAgICAqIEBzZWUgI3NldEF0dHJpYnV0ZVZhbHVlKFN0cmluZykKLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBlbGVtZW50J3MgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICogQHJldHVybiBlbGVtZW50J3MgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgZWxlbWVudCdzIGlkIHN0cmluZwotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0T3duZXJDYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpOwotICAgIAotICAgIHB1YmxpYyBJQ2F0YWxvZyBnZXRPd25lckNhdGFsb2coKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzMzAxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRW50cnkgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVGhlIFNZU1RFTSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfVFlQRV9QVUJMSUMgPSAyOwotCi0gICAgLyoqIFRoZSBTWVNURU0gQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1RZUEVfU1lTVEVNID0gMzsKLQotICAgIC8qKiBUaGUgVVJJIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9UWVBFX1VSSSA9IDQ7Ci0KLSAgICAvKiogQXR0cmlidXRlIG5hbWUgZm9yIFdlYiBhZGRyZXNzIG9mIGNhdGFsb2cgZW50cnkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1dFQl9VUkwgPSAid2ViVVJMIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5VHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShpbnQgZW50cnlUeXBlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVudHJ5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZkYjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRXZlbnQKLXsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQURERUQgPSAxOwotCi0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9SRU1PVkVEID0gMjsKLQotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0Q2F0YWxvZygpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0Q2F0YWxvZ0VsZW1lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjNDRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgY2xpZW50cyBvZiB0aGUgY2F0YWxvZyB0aGF0IHdhbnQgdG8gbGlzdGVuIHRvIGNhdGFsb2cgY2hhbmdlcyBzaG91bGQKLSAqIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIAotICogQHNlZSBJQ2F0YWxvZywgSUNhdGFsb2dFdmVudCwKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRvIHJlYWN0IHRvIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IC0KLSAgICAgKiAgICAgICAgICAgIGFuIGV2ZW50IHRoYXQgY2xpZW50IHNob3VsZCByZWFjdCB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKElDYXRhbG9nRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZTAwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV4dENhdGFsb2cgT0FTSVMgWE1MIGNhdGFsb2cgZWxlbWVudC4gT2JqZWN0IG9mIHRoZQotICogY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHdvdWxkIHNlcnZlIGFzIGEgcmVmZXJlbmNlIHRvIHRoZQotICogY2F0YWxvZyBvYmplY3QuCi0gKiAKLSAqIEBzZWUgSUNhdGFsb2csIElDYXRhbG9nRWxlbWVudAotICogCi0gKiBUaGlzIGludGVyZmFjZSBjdXJyZW50bHkgaXMgdXNlZCBvbmx5IGJ5IHRoZSBjYXRhbG9nIGl0c2VsZi4gTmVlZCB0byBmaW5kIGlmCi0gKiB0aGVyZSBhcmUgYW55IGNsaWVudHMgdGhhdCBuZWVkIGl0LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5leHRDYXRhbG9nIGV4dGVuZHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0gICAgLyoqCi0gICAgICogU2V0IGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSAtCi0gICAgICogICAgICAgICAgICBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dMb2NhdGlvbihTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIEdldCBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAKLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQotICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDA2NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQW55RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNQW55RWxlbWVudCBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUFueUVsZW1lbnQgZXh0ZW5kcyBDTUNvbnRlbnQgewotLyoqCi0gKiBnZXROYW1lc3BhY2VVUkkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjFhNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBBdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01Ob2RlIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCAgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSElCSVRFRCA9IDQ7Ci0vKioKLSAqIGdldEF0dHJOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRBdHRyTmFtZSgpOwotLyoqCi0gKiBnZXRBdHRyVHlwZSBtZXRob2QKLSAqIEByZXR1cm4gQ01EYXRhVHlwZQotICovCi1DTURhdGFUeXBlIGdldEF0dHJUeXBlKCk7Ci0vKioKLSAqIGdldERlZmF1bHRWYWx1ZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICogQGRlcHJlY2F0ZWQgLS0gdG8gYmUgcmVwbGFjZWQgaW4gZnV0dXJlIHdpdGggYWRkaXRpb25hbCBDTURhdGFUeXBlIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICovCi1TdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vKioKLSAqIGdldEVudW1BdHRyIG1ldGhvZAotICogQHJldHVybiBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZSBtZXRob2RzIChjdXJyZW50bHkgZm91bmQgb24gQ01EYXRhVHlwZUhlbHBlcikKLSAqLwotRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKTsKLS8qKgotICogZ2V0VXNhZ2UgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0VXNhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjZWU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Db250ZW50IGV4dGVuZHMgQ01Ob2RlCi17Ci0vKioKLSAqIGdldE1heE9jY3VyIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0gKi8KLWludCBnZXRNYXhPY2N1cigpOwotLyoqCi0gKiBnZXRNaW5PY2N1ciBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogSWYgMCwgaXQncyBPUFRJT05BTC4KLSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0gKi8KLWludCBnZXRNaW5PY2N1cigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTNhYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTURhdGFUeXBlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01EYXRhVHlwZSBleHRlbmRzIENNTm9kZSB7Ci0gICAgCi0gIC8vIHRvZG8uLi4gYXQgc29tZSBwb2ludCB3ZSBzaG91bGQgcmVtb3ZlIHRoZXNlIG5hbWVzIHRvCi0gIC8vIGF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdmlhIHRoZSBpbnRlcmZhY2VzCi0gIC8vCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9ICJDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSAiSURSRUYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSAiRU5USVRJRVMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTiA9ICJOT1RBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU4gPSAiTk1UT0tFTiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TID0gIk5NVE9LRU5TIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gIk5VTUJFUiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNID0gIkVOVU0iOyAvLyROT04tTkxTLTEkCi0KLSAgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEX1ZBTFVFX05PTkUgICAgICAgICAgICAgPSAxOwotICBzdGF0aWMgZmluYWwgaW50IElNUExJRURfVkFMVUVfRklYRUQgICAgICAgICAgICA9IDI7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRF9WQUxVRV9ERUZBVUxUICAgICAgICAgID0gMzsKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCk7ICAgIAotCi0vKioKLSAqIGdldEltcGxpZWRWYWx1ZUtpbmQgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIFJldHVybnMgb25lIG9mIDoKLSAqIElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCwgSU1QTElFRF9WQUxVRV9ERUZBVUxULgotICovICAgICAgCi0KLWludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCk7ICAKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0gKgotICogUmV0dXJucyB0aGUgaW1wbGllZCB2YWx1ZSBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotICovCi1TdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotICoKLSAqLwotU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKgotICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotICovCi1TdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0ZTRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRG9jdW1lbnQgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudCBleHRlbmRzIENNTm9kZSB7Ci0vKioKLSAqIGdldEVsZW1lbnRzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCk7Ci0vKioKLSAqIGdldEVudGl0aWVzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKTsKLS8qKgotICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVzcGFjZQotICovCi1DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MjU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01Eb2N1bWVudGF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRhdGlvbiBleHRlbmRzIENNTm9kZSB7ICAgICAgICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxOGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRWxlbWVudERlY2xhcmF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRWxlbWVudERlY2xhcmF0aW9uIGV4dGVuZHMgQ01Db250ZW50IHsKLSAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5ZID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTVBUWSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlYRUQgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBDREFUQSA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0RBVEEgPSA1OyAvLyB0b2RvLi4uIGNsYXJpZnkgdGhpcyBvbmUKLS8qKgotICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKTsKLS8qKgotICogZ2V0Q01Db250ZW50IG1ldGhvZAotICogQHJldHVybiBDTUNvbnRlbnQKLSAqCi0gKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50J3MgY29udGVudCBtb2RlbC4KLSAqIFRoaXMgY2FuIGJlIGFuIENNRWxlbWVudERlY2xhcmF0aW9uIG9yIGEgQ01Hcm91cAotICovCi1DTUNvbnRlbnQgZ2V0Q29udGVudCgpOwotLyoqCi0gKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEuCi0gKi8KLXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKTsKLS8qKgotICogZ2V0RWxlbWVudE5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7Ci0KLS8qKgotICogZ2V0RGF0YVR5cGUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpOwotCi0vKioKLSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0gKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0gKgotICogUmV0dXJucyBhIGxpc3Qgb2YgbG9jYWxseSBkZWZpbmVkIGVsZW1lbnRzLgotICovCi1DTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbnRpdHlEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRW50aXR5RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2MjQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbnRpdHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRW50aXR5RGVjbGFyYXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01FbnRpdHlEZWNsYXJhdGlvbiBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXROYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXROYW1lKCk7Ci0vKioKLSAqIGdldFZhbHVlIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDlhMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUdyb3VwIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNR3JvdXAgZXh0ZW5kcyBDTUNvbnRlbnQgewotICAKLQlzdGF0aWMgZmluYWwgaW50IEFMTCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAxOwotLyoqCi0gKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotICogQHJldHVybiBDTU5vZGVMaXN0Ci0gKgotICogUmV0dXJucyBjaGlsZCBDTU5vZGVMaXN0LCB3aGljaCBpbmNsdWRlcyBFbGVtZW50RGVmaW5pdGlvbiBvciBDTUVsZW1lbnQuCi0gKi8KLUNNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpOwotCi0vKioKLSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0gKi8KLWludCBnZXRPcGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjYjRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0vKioKLSAqIE5hbWVkQ01Ob2RlTWFwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01OYW1lZE5vZGVNYXAgewotLyoqCi0gKiBnZXRMZW5ndGggbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0TGVuZ3RoKCk7Ci0vKioKLSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLSAqIEByZXR1cm4gQ01Ob2RlCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLUNNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpOwotLyoqCi0gKiBpdGVtIG1ldGhvZAotICogQHJldHVybiBDTU5vZGUKLSAqIEBwYXJhbSBpbmRleCBpbnQKLSAqLwotQ01Ob2RlIGl0ZW0oaW50IGluZGV4KTsKLQotLyoqCi0gKgotICovCi1JdGVyYXRvciBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNjA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5hbWVzcGFjZSBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5hbWVzcGFjZSBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXRQcmVmaXggbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFByZWZpeCgpOwotLyoqCi0gKiBnZXRVUkkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg4M2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5vZGUgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlIHsgICAgICAgIAotICAKLSAgc3RhdGljIGZpbmFsIGludCBBTllfRUxFTUVOVCAgICAgICAgICAgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0RFQ0xBUkFUSU9OID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IERBVEFfVFlQRSAgICAgICAgICAgICA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBET0NVTUVOVCAgICAgICAgICAgICAgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9ERUNMQVJBVElPTiAgID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IEVOVElUWV9ERUNMQVJBVElPTiAgICA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBHUk9VUCAgICAgICAgICAgICAgICAgPSA3OwotICBzdGF0aWMgZmluYWwgaW50IE5BTUVfU1BBQ0UgICAgICAgICAgICA9IDg7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRBVElPTiAgICAgICAgID0gOTsKLS8qKgotICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldE5vZGVOYW1lKCk7Ci0vKioKLSAqIGdldE5vZGVUeXBlIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKgotICovCi1pbnQgZ2V0Tm9kZVR5cGUoKTsKLQotLyoqCi0gKiBzdXBwb3J0cyBtZXRob2QKLSAqIEByZXR1cm4gYm9vbGVhbgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0gKgotICovCi1ib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0vKioKLSAqIGdldFByb3BlcnR5IG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0gKgotICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLSAqCi0gKi8KLU9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsgLy90b2RvIHRocm93IHVuc3VwcG9ydGVkIHByb3BlcnR5IGV4Y2VwdGlvbgotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0YjM4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNTm9kZUxpc3QgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlTGlzdCB7Ci0gIAotLyoqCi0gKiBnZXRMZW5ndGggbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0TGVuZ3RoKCk7Ci0vKioKLSAqIGl0ZW0gbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZQotICogQHBhcmFtIGluZGV4IGludAotICovCi1DTU5vZGUgaXRlbShpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTJjYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXI7Ci0KLQotLyoqCi0gKiBDb250ZW50TW9kZWxNYW5hZ2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxNYW5hZ2VyIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBwcml2YXRlIHN0YXRpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5IGluZmVycmVkR3JhbW1hckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHVibGljIENvbnRlbnRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQ29udGVudE1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmksIFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsICYmIHVyaSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzb3VyY2VUeXBlID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlDTURvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0Q01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkocmVzb3VyY2VUeXBlKTsKLQkJcmV0dXJuIGZhY3RvcnkgIT0gbnVsbCA/IGZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpIDogbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBnZXRDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQljbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCW5ldyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkuZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MocHVibGljSWQpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkgewotCQlpZiAoYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnkoKTsKLQkJCW5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKGFubm90YXRpb25GaWxlUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MGIyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0gICAgICAgICAKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uCi17ICAgICAgIAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQW5ub3RhdGlvbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNwZWMoU3RyaW5nIHNwZWMpCi0gIHsKLSAgICBoYXNodGFibGUucHV0KCJzcGVjIiwgc3BlYyk7IC8vJE5PTi1OTFMtMSQKLSAgfSAgICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaGFzaHRhYmxlLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgICAgIAotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQocHJvcGVydHlOYW1lKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KCkKLSAgewotICAgIHJldHVybiBudWxsOyAvLyB0b2RvCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3NTM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVQYXJzZXI7Ci0KLQotLyoqCi0gKiBBbm5vdGF0aW9uTWFwCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uTWFwIHsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSA9IHRydWU7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbk1hcCgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXMuaXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBzcGVjID0gYW5ub3RhdGlvbi5nZXRTcGVjKCk7Ci0JCWlmIChzcGVjICE9IG51bGwpIHsKLQkJCWxpc3QuYWRkKGFubm90YXRpb24pOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcGVjLCAiW118XHRcblxyXGYgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY21Ob2RlU3BlYyA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWFkZEFubm90YXRpb25Gb3JDTU5vZGVTcGVjKGNtTm9kZVNwZWMsIGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbkZvckNNTm9kZVNwZWMoU3RyaW5nIGNtTm9kZVNwZWMsIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlTdHJpbmcga2V5ID0gaXNDYXNlU2Vuc2l0aXZlID8gY21Ob2RlU3BlYyA6IGNtTm9kZVNwZWMudG9Mb3dlckNhc2UoKTsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIGhhc2h0YWJsZS5nZXQoa2V5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCQkJaGFzaHRhYmxlLnB1dChrZXksIGxpc3QpOwotCQl9Ci0JCWxpc3QuYWRkKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGNtTm9kZVNwZWMsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBrZXkgPSBpc0Nhc2VTZW5zaXRpdmUgPyBjbU5vZGVTcGVjIDogY21Ob2RlU3BlYy50b0xvd2VyQ2FzZSgpOwotCQlMaXN0IGFubm90YXRpb25MaXN0ID0gKExpc3QpIGhhc2h0YWJsZS5nZXQoa2V5KTsKLQkJaWYgKGFubm90YXRpb25MaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBpLm5leHQoKTsKLQkJCQlyZXN1bHQgPSBhbm5vdGF0aW9uLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoQ01Ob2RlIGNtTm9kZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGNtTm9kZVNwZWMgPSAoU3RyaW5nKSBjbU5vZGUuZ2V0UHJvcGVydHkoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY21Ob2RlU3BlYyA9PSBudWxsKSB7Ci0JCQljbU5vZGVTcGVjID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0JCX0KLQkJaWYgKGNtTm9kZVNwZWMgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0UHJvcGVydHkoY21Ob2RlU3BlYywgcHJvcGVydHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKFN0cmluZyB1cmksIFN0cmluZyBidW5kbGVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFubm90YXRpb25GaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBBbm5vdGF0aW9uRmlsZVBhcnNlcigpOwotCQlBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8gPSBuZXcgQW5ub3RhdGlvbkZpbGVJbmZvKHVyaSwgYnVuZGxlSWQpOwotCQlwYXJzZXIucGFyc2UodGhpcywgZmlsZUluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUFueUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BbnlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGM4ZjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUFueUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ01BbnlFbGVtZW50SW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkk7ICAKLQotICBwdWJsaWMgQ01BbnlFbGVtZW50SW1wbChTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgbWluT2NjdXIgPSAtMTsKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTm9kZU5hbWUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkgIT0gbnVsbCA/ICgiYW55IyIgKyB1cmkpIDogImFueSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBDTU5vZGUKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY29tcHV0ZU5vZGVOYW1lKG5hbWVzcGFjZVVSSSk7Ci0gIH0KLSAKLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQU5ZX0VMRU1FTlQ7Ci0gIH0gCi0KLSAgLy8gaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkYWFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBub2RlTmFtZTsgICAgCi0gIHByb3RlY3RlZCBpbnQgdXNhZ2U7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlZml4UXVhbGlmaWNhdGlvbjsKLSAgcHJvdGVjdGVkIExpc3QgeHNpVHlwZXM7Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChTdHJpbmcgbm9kZU5hbWUsIGludCB1c2FnZSkKLSAgewotICAgIHRoaXMobm9kZU5hbWUsIHVzYWdlLCBudWxsKTsKLSAgfSAgICAgCi0KLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKFN0cmluZyBub2RlTmFtZSwgaW50IHVzYWdlLCBDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7ICAgICAgICAKLSAgICB0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7Ci0gICAgdGhpcy51c2FnZSA9IHVzYWdlOwotICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsgCi0gIH0gICAgCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOyAgIAotICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJDTURvY3VtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbURvY3VtZW50OwotICAgIH0gCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiWFNJVHlwZXMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0geHNpVHlwZXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHByZWZpeFF1YWxpZmljYXRpb24gPyAicXVhbGlmaWVkIiA6ICJ1bnF1YWxpZmllZCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJlZml4UXVhbGlmaWNhdGlvbihib29sZWFuIHF1YWxpZmllZCkKLSAgewotICAgIHByZWZpeFF1YWxpZmljYXRpb24gPSBxdWFsaWZpZWQ7Ci0gIH0gICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFhTSVR5cGVzKExpc3QgbGlzdCkKLSAgewotICAgIHhzaVR5cGVzID0gbGlzdDsKLSAgfQotICAgICAKLSAgcHVibGljIHZvaWQgc2V0Q01Eb2N1bWVudChDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbm9kZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkKLSAgewotICAgIHJldHVybiBub2RlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFVzYWdlKCkKLSAgewotICAgIHJldHVybiB1c2FnZTsKLSAgfQotICAgICAgICAgICAKLSAgLyoqIEBkZXByZWNhdGVkICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9ICAgICAgICAgICAgICAgICAKLQotICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllODI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNQ29udGVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Db250ZW50Ci17Ci0gIHByb3RlY3RlZCBpbnQgbWluT2NjdXIgPSAwOwotICBwcm90ZWN0ZWQgaW50IG1heE9jY3VyID0gLTE7ICAgICAgIAotICAgICAgICAgICAgICAgIAotICAvLyBpbXBsZW1lbnRzIENNQ29udGVudAotICAvLwotICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgewotICAgIHJldHVybiBtYXhPY2N1cjsKLSAgfSAgICAgICAgICAKLSAKLSAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gIHsKLSAgICByZXR1cm4gbWluT2NjdXI7Ci0gIH0gIAotICAgICAKLSAgLy8gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMKLSAgLy8KLSAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXIoaW50IG4pCi0gIHsKLSAgICBtYXhPY2N1ciA9IG47Ci0gIH0gICAgICAgICAgCi0gCi0gIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VyKGludCBuKQotICB7Ci0gICAgbWluT2NjdXIgPSBuOwotICB9ICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRGF0YVR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2NGY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01EYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZU5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzOyAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgaW5zdGFuY2VWYWx1ZTsKLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlTmFtZTsKLSAgICB0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlcykKLSAgewotICAgIHRoaXMuZGF0YVR5cGVOYW1lID0gZGF0YVR5cGVOYW1lOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IGVudW1lcmF0ZWRWYWx1ZXM7ICAgCi0gICAgdGhpcy5pbnN0YW5jZVZhbHVlID0gZW51bWVyYXRlZFZhbHVlc1swXTsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRhdGFUeXBlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gIHsKLSAgICByZXR1cm4gSU1QTElFRF9WQUxVRV9OT05FOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gIHsKLSAgICByZXR1cm4gZW51bWVyYXRlZFZhbHVlczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZVZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjcyZDY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudAotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRQb29sOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRzOwotCi0gIHB1YmxpYyBDTURvY3VtZW50SW1wbChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBET0NVTUVOVDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAKLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldEFueUVsZW1lbnRzKCkKLSAgeyAKLSAgICBpZiAoYW55RWxlbWVudHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbnlFbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFueUVsZW1lbnRzOwotICB9Ci0gIAotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldExvY2FsRWxlbWVudFBvb2woKQotICB7IAotICAgIGlmIChsb2NhbEVsZW1lbnRQb29sID09IG51bGwpCi0gICAgewotICAgICAgbG9jYWxFbGVtZW50UG9vbCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbG9jYWxFbGVtZW50UG9vbDsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICB9Ci0KLSAgcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWY1NzRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotCi1wdWJsaWMgY2xhc3MgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgCi0gIHByb3RlY3RlZCBDTURvY3VtZW50IGNtRG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGxvY2FsRWxlbWVudE1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNQ29udGVudCBjb250ZW50OwotICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2NhbDsKLQotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgY21Eb2N1bWVudCwgU3RyaW5nIG5hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0gICAgIAotCi0gIC8vIGltcGxlbWVudHMgQ01Ob2RlCi0gIC8vCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAKLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gRUxFTUVOVF9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgICAgICAKLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNMb2NhbCA/ICJ1bnF1YWxpZmllZCIgOiAicXVhbGlmaWVkIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfSAgICAKLSAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJDTURvY3VtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbURvY3VtZW50OyAgICAgICAKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgICAgICAgICAgCi0gIC8vIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24KLSAgLy8KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQotICB7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZU1hcDsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIE1JWEVEOwotICB9ICAgICAgICAgICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkKLSAgeyAKLSAgICByZXR1cm4gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpCi0gIHsgCi0gICAgcmV0dXJuIGxvY2FsRWxlbWVudE1hcDsKLSAgfSAKLSAgICAKLSAgLy8KLSAgLy8KLSAgcHVibGljIHZvaWQgc2V0Q29udGVudChDTUNvbnRlbnQgY21Db250ZW50KQotICB7Ci0gICAgY29udGVudCA9IGNtQ29udGVudDsKLSAgfSAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoQ01EYXRhVHlwZSBjbURhdGFUeXBlKQotICB7Ci0gICAgZGF0YVR5cGUgPSBjbURhdGFUeXBlOwotICB9Ci0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXRBdHRyaWJ1dGVNYXAoKQotICB7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZU1hcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsKGJvb2xlYW4gaXNMb2NhbCkKLSAgewotICAgIHRoaXMuaXNMb2NhbCA9IGlzTG9jYWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVudGl0eURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRW50aXR5RGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MWI3ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRW50aXR5RGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUVudGl0eURlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLSAgcHVibGljIENNRW50aXR5RGVjbGFyYXRpb25JbXBsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLX0gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NGZmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01Hcm91cAotewotICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBub2RlTGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0b3I7ICAKLQotICBwdWJsaWMgQ01Hcm91cEltcGwoQ01Ob2RlTGlzdCBub2RlTGlzdCwgaW50IG9wZXJhdG9yKQotICB7Ci0gICAgdGhpcy5ub2RlTGlzdCA9IG5vZGVMaXN0OwotICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEdST1VQOwotICB9Ci0gCi0gIHB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVMaXN0OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRPcGVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0b3I7Ci0gIH0gCi19ICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDJiYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCAKLXsKLSAgcHVibGljIHN0YXRpYyBDTU5hbWVkTm9kZU1hcEltcGwgRU1QVFlfTkFNRURfTk9ERV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIENNTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgKi8KLSAgcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpCi0gIHsKLSAgCXN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogZ2V0TGVuZ3RoIG1ldGhvZAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHVibGljIGludCBnZXRMZW5ndGgoKQotICB7Ci0gIAlyZXR1cm4gdGFibGUuc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIGdldE5hbWVkSXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgKi8KLSAgcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgCXJldHVybiAoQ01Ob2RlKXRhYmxlLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBpdGVtIG1ldGhvZAotICAgKiBAcmV0dXJuIENNTm9kZQotICAgKiBAcGFyYW0gaW5kZXggaW50Ci0gICAqLwotICBwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0gICAgaWYgKGluZGV4IDwgc2l6ZSkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiB2YWx1ZXMgPSB0YWJsZS5lbGVtZW50cygpOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01Ob2RlKXZhbHVlcy5uZXh0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfSAgICAgICAgCi0gIAotICBwdWJsaWMgdm9pZCBwdXQoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHRhYmxlLnB1dChjbU5vZGUuZ2V0Tm9kZU5hbWUoKSwgY21Ob2RlKTsKLSAgfQotfQotICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2NlY2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZQoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luZmVycmVkID0gZmFsc2U7Ci0gICAKLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotIAotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IAotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKCJpc0luZmVycmVkIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzSW5mZXJyZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldEluZmVycmVkKGJvb2xlYW4gaXNJbmZlcnJlZCkKLSAgewotICAgIHRoaXMuaXNJbmZlcnJlZCA9IGlzSW5mZXJyZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjM1MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCAKLXsKLSAgcHVibGljIHN0YXRpYyBDTU5vZGVMaXN0SW1wbCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgcHVibGljIENNTm9kZUxpc3RJbXBsKCkKLSAgewotICAgIHRoaXMobmV3IFZlY3RvcigpKTsKLSAgfQotCi0gIHB1YmxpYyBDTU5vZGVMaXN0SW1wbChMaXN0IGxpc3QpCi0gIHsKLSAgICB0aGlzLmxpc3QgPSBsaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIGdldExlbmd0aCBtZXRob2QKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLSAgewotICAgIHJldHVybiBsaXN0LnNpemUoKTsKLSAgfQotICAvKioKLSAgICogaXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIGluZGV4IGludAotICAgKi8KLSAgcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkKLSAgewotICAgIHJldHVybiAoQ01Ob2RlKWxpc3QuZ2V0KGluZGV4KTsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICByZXR1cm4gbGlzdC5jb250YWlucyhjbU5vZGUpOwotICB9IAotICAKLSAgcHVibGljIHZvaWQgYWRkKENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBsaXN0LmFkZChjbU5vZGUpOwotICB9ICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTcxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0vLyB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIGEgZ3JhbW1hciBkb2N1bWVudCBnaXZlbiBhIGxvY2FsIGZpbGUgbmFtZQotLy8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudEZhY3RvcnkKLXsgICAKLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTE2YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotICBwcml2YXRlIENNRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZmFjdG9yeSA9IChDTURvY3VtZW50RmFjdG9yeSkgZkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbG9hZGluZyBDTURvY3VtZW50RmFjdG9yeSIsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxNTRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSAKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgaW5zdGFuY2U7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUkVTT1VSQ0VfVFlQRSA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIE1hcCByZXNvdXJjZVR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIFZlY3RvciBkb2N1bWVudEJ1aWxkZXJMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JcHVibGljIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0RmFjdG9yeShTdHJpbmcgcmVzb3VyY2VUeXBlLCBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZmFjdG9yeURlc2NyaXB0b3IpIHsKLQkJcmVzb3VyY2VUeXBlTWFwLnB1dChyZXNvdXJjZVR5cGUsIGZhY3RvcnlEZXNjcmlwdG9yKTsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgcmVzb3VyY2VUeXBlKSB7Ci0JCUNNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvciBmYWN0b3J5RGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJZmFjdG9yeURlc2NyaXB0b3IgPSAoQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKSByZXNvdXJjZVR5cGVNYXAuZ2V0KHJlc291cmNlVHlwZSk7Ci0JCX0KLQkJaWYgKGZhY3RvcnlEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCS8vIChkbXcpIGlzc3VlOiBhIGRlZmF1bHQgdHlwZSBvZiAnKicgbWVhbnMgd2hhdD8gcmVnaXN0ZXJlZCBhcwotCQkJLy8gJyonIGlzIHRoZSB3YXkgdGhpcyB3b3JrcyBub3cuIGlzIHRoYXQgdGhlIGludGVudD8gT3Igc2hvdWxkIGl0Ci0JCQkvLyBtZWFuIHJlZ2lzdGVyZWQgYXMgYW55IG90aGVyIHR5cGU/Ci0JCQlmYWN0b3J5RGVzY3JpcHRvciA9IChDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IpIHJlc291cmNlVHlwZU1hcC5nZXQoREVGQVVMVF9SRVNPVVJDRV9UWVBFKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeURlc2NyaXB0b3IgIT0gbnVsbCA/IGZhY3RvcnlEZXNjcmlwdG9yLmdldEZhY3RvcnkoKSA6IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjlkYWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkb2N1bWVudEZhY3RvcmllcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlIjsgICAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQ7Ci0gIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLSAgCi0gIHB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBTdHJpbmcgYnVuZGxlaWQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoYnVuZGxlaWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotICAgIHsKLSAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIGZpbGVuYW1lRXh0ZW5zaW9ucyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLSAgICAgIGlmIChmYWN0b3J5Q2xhc3MgIT0gbnVsbCAmJiBmaWxlbmFtZUV4dGVuc2lvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IoZWxlbWVudCk7Ci0gICAgICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbGVuYW1lRXh0ZW5zaW9ucywgIiwiKTsgc3QuaGFzTW9yZVRva2VucygpOyApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCXJlZ2lzdHJ5LnB1dEZhY3RvcnkodG9rZW4sIGRlc2NyaXB0b3IpOwkKLSAgICAgICAgICB9ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzYxYjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW5ub3RhdGlvbiBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZpbGVJbmZvIHsKLQlwcml2YXRlIFN0cmluZyBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmQnVuZGxlSWQ7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVJbmZvKFN0cmluZyBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJZkFubm90YXRpb25GaWxlTG9jYXRpb24gPSBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCQlmQnVuZGxlSWQgPSBidW5kbGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIGZpbGUgYXMgb3JpZ2luYWxseSBzcGVjaWZpZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJ1bmRsZSBpZCB3aGVyZSB0aGUgYW5ub3RhdGlvbiBmaWxlIGlzIGxvY2F0ZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZUlkKCkgewotCQlyZXR1cm4gZkJ1bmRsZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTczMDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUGFyc2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfQU5OT1RBVElPTlMgPSAiYWJzdHJhY3RHcmFtbWFyQW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX0FOTk9UQVRJT04gPSAiYW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcGFyc2UgYW4gYW5ub3RhdGlvbiBmaWxlIGFuZCBzdG9yZSB0aGUKLQkgKiBjb250ZW50cyBpbnRvIGFuIGFubm90YXRpb25NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2UoQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwLCBJbnB1dFN0cmVhbSBpbnB1dCwgQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbW92ZSB0byBYZXJjZXMtMi4uLi4gYWRkICdjb250ZXh0Q2xhc3NMb2FkZXInIHN0dWZmCi0JCUNsYXNzTG9hZGVyIHByZXZDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCXRyeSB7Ci0JCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSwgbmV3IEFubm90YXRpb25NYXBDb250ZW50SGFuZGxlcihhbm5vdGF0aW9uTWFwLCBmaWxlSW5mbykpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwYXJzZSBhbiBhbm5vdGF0aW9uIGZpbGUgYW5kIHN0b3JlIHRoZQotCSAqIGNvbnRlbnRzIGludG8gYW4gYW5ub3RhdGlvbk1hcAotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKEFubm90YXRpb25NYXAgbWFwLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoZmlsZUluZm8uZ2V0QnVuZGxlSWQoKSksIFBhdGguZnJvbU9TU3RyaW5nKGZpbGVJbmZvLmdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSkpOwotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJCXBhcnNlKG1hcCwgaW5wdXRTdHJlYW0sIGZpbGVJbmZvKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXRocm93IChlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEFubm90YXRpb25NYXBDb250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXA7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbiBjdXJyZW50QW5ub3RhdGlvbjsKLQkJcHJpdmF0ZSBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcHJvcGVydHlWYWx1ZUJ1ZmZlcjsKLQkJcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZUluZm8gZkZpbGVJbmZvOwotCi0JCXB1YmxpYyBBbm5vdGF0aW9uTWFwQ29udGVudEhhbmRsZXIoQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHsKLQkJCXRoaXMuYW5ub3RhdGlvbk1hcCA9IGFubm90YXRpb25NYXA7Ci0JCQl0aGlzLmZGaWxlSW5mbyA9IGZpbGVJbmZvOwotCQl9Ci0KLQkJcHJpdmF0ZSBVUkwgZ2VuZXJhdGVQcm9wZXJ0aWVzRmlsZVVSTChBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8sIFN0cmluZyBwcm9wZXJ0aWVzTG9jYXRpb24pIHsKLQkJCVVSTCBwcm9wZXJ0aWVzVVJMID0gbnVsbDsKLQotCQkJLy8gcHJlcGVuZCAkbmwkIHZhcmlhYmxlIHRvIGxvY2F0aW9uCi0JCQlJUGF0aCBhbm5vdGF0aW9uUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKCIkbmwkLyIgKyBmaWxlSW5mby5nZXRBbm5vdGF0aW9uRmlsZUxvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyByZW1vdmUgdGhlIGFubm90YXRpb24ueG1sIGZpbGUKLQkJCUlQYXRoIGFubm90YXRpb25Gb2xkZXIgPSBhbm5vdGF0aW9uUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkvLyBhcHBlbmQgbG9jYXRpb24gb2YgcHJvcGVydGlsZXMgZmlsZQotCQkJSVBhdGggcHJvcGVydGllc0ZpbGUgPSBhbm5vdGF0aW9uRm9sZGVyLmFwcGVuZChwcm9wZXJ0aWVzTG9jYXRpb24pOwotCQkJLy8gYXBwZW5kIC5wcm9wZXJ0aWVzIGV4dGVuc2lvbiBpZiBuZWVkZWQKLQkJCWlmIChwcm9wZXJ0aWVzRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IHByb3BlcnRpZXNGaWxlLmFkZEZpbGVFeHRlbnNpb24oInByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gY3JlYXRlIGEgVVJMIG91dCBvZiB0aGUgcHJvcGVydGllcyBmaWxlIGxvY2F0aW9uCi0JCQlwcm9wZXJ0aWVzVVJMID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoZmlsZUluZm8uZ2V0QnVuZGxlSWQoKSksIHByb3BlcnRpZXNGaWxlKTsKLQkJCXJldHVybiBwcm9wZXJ0aWVzVVJMOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCXByb3BlcnR5VmFsdWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfQU5OT1RBVElPTlMpKSB7Ci0JCQkJaW50IGF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0xlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSk7Ci0JCQkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JCQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygicHJvcGVydGllc0xvY2F0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJVVJMIGJ1bmRsZVVSTCA9IGdlbmVyYXRlUHJvcGVydGllc0ZpbGVVUkwoZkZpbGVJbmZvLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkJCQlpZiAoYnVuZGxlVVJMICE9IG51bGwpIHsKLQkJCQkJCQlJbnB1dFN0cmVhbSBidW5kbGVTdHJlYW0gPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWJ1bmRsZVN0cmVhbSA9IGJ1bmRsZVVSTC5vcGVuU3RyZWFtKCk7Ci0JCQkJCQkJCXJlc291cmNlQnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoYnVuZGxlU3RyZWFtKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWlmIChidW5kbGVTdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQkJCQlidW5kbGVTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgeC5nZXRNZXNzYWdlKCksIHgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJjYXNlU2Vuc2l0aXZlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJaWYgKGF0dHJpYnV0ZVZhbHVlLnRyaW0oKS5lcXVhbHMoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlhbm5vdGF0aW9uTWFwLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfQU5OT1RBVElPTikpIHsKLQkJCQljdXJyZW50QW5ub3RhdGlvbiA9IG51bGw7Ci0JCQkJU3RyaW5nIHNwZWNWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChzcGVjVmFsdWUgIT0gbnVsbCkgewotCQkJCQljdXJyZW50QW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKCk7Ci0JCQkJCWN1cnJlbnRBbm5vdGF0aW9uLnNldFNwZWMoc3BlY1ZhbHVlKTsKLQkJCQl9Ci0JCQkJYW5ub3RhdGlvbk1hcC5hZGRBbm5vdGF0aW9uKGN1cnJlbnRBbm5vdGF0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX1BST1BFUlRZKSkgewotCQkJCWlmIChjdXJyZW50QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAoY3VycmVudFByb3BlcnR5TmFtZSAhPSBudWxsICYmIGN1cnJlbnRBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQlpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcm9wZXJ0eVZhbHVlLnN0YXJ0c1dpdGgoIiUiKSAmJiByZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcHJvcGVydHlWYWx1ZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhwcm9wZXJ0eVZhbHVlLnN1YnN0cmluZygxKSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUgYW55IGV4Y2VwdGlvbiB0aGF0IG9jY3VycyB3aGlsZSB0cnlpbmcKLQkJCQkJCQkvLyB0byBmZXRjaCBhIHJlc291cmNlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudEFubm90YXRpb24uc2V0UHJvcGVydHkoY3VycmVudFByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfQU5OT1RBVElPTikpIHsKLQkJCQljdXJyZW50QW5ub3RhdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCQllbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9QUk9QRVJUWSkpIHsKLQkJCQljdXJyZW50UHJvcGVydHlOYW1lID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCWlmIChjdXJyZW50UHJvcGVydHlOYW1lICE9IG51bGwgJiYgY3VycmVudEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXByb3BlcnR5VmFsdWVCdWZmZXIuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTRjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYXNzb2NpYXRlIG9uZSBvciBtb3JlIGFubm90YXRpb24gZmlsZXMgd2l0aCBhIGdyYW1tYXIKLSAqIGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUmVnaXN0cnkgewotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpIHsKLQkJbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIodGhpcykucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdCBnZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhTdHJpbmcgcHVibGljSWQpIHsKLQkJTGlzdCB0aGVMaXN0ID0gKExpc3QpIG1hcC5nZXQocHVibGljSWQpOwotCQlyZXR1cm4gdGhlTGlzdCAhPSBudWxsID8gdGhlTGlzdCA6IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyA9PSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQltYXAucHV0KHB1YmxpY0lkLCBmaWxlSW5mb3MpOwotCQl9Ci0JCWZpbGVJbmZvcy5hZGQoZmlsZUluZm8pOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyAhPSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MucmVtb3ZlKGZpbGVJbmZvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3OGQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgYWRkcyBlYWNoIHNwZWNpZmllZCBncmFtYW1yCi0gKiBhbm5vdGF0aW9uIGZpbGUgd2l0aCB0aGUgQW5ub3RhdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiYW5ub3RhdGlvbkZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImFubm90YXRpb25GaWxlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QVUJMSUNfSUQgPSAicHVibGljSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlcihBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnkpIHsKLQkJdGhpcy5hbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KHBsdWdpbklkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLQkgKiAKLQkgKiA8ZXh0ZW5zaW9uCi0JICogcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbF9pbXBsZW1lbnRhdGlvbiI+Ci0JICogPHV0aWxfaW1wbGVtZW50YXRpb24gY2xhc3MgPQotCSAqIGNvcmcuZWNsaXBzZS53c3QuYmFzZXV0aWwuQ01VdGlsSW1wbGVtZW50YXRpb25JbXBsIC8+IDwvZXh0ZW5zaW9uPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFVCTElDX0lEKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MT0NBVElPTik7Ci0JCQlpZiAocHVibGljSWQgIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGJ1bmRsZUlkID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLQkJCQkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEFubm90YXRpb25GaWxlSW5mbyhsb2NhdGlvbiwgYnVuZGxlSWQpOwotCQkJCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmFkZEFubm90YXRpb25GaWxlKHB1YmxpY0lkLCBmaWxlSW5mbyk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGFkZGluZyBhbm5vdGF0aW9uIGZpbGUgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWNmYzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQW5ub3RhdGlvbnNGb3JHcmFtbWFyKFN0cmluZyBwdWJsaWNJZCwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCUxpc3QgYW5ub3RhdGlvbkZpbGVzID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEFubm90YXRpb25GaWxlc0luZm9zKHB1YmxpY0lkKTsKLQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoQW5ub3RhdGlvbk1hcCkgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiYW5ub3RhdGlvbk1hcCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYW5ub3RhdGlvbkZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCXRyeSB7Ci0JCQkJCUFubm90YXRpb25GaWxlSW5mbyBhbm5vdGF0aW9uRmlsZUluZm8gPSAoQW5ub3RhdGlvbkZpbGVJbmZvKSBpLm5leHQoKTsKLQkJCQkJQW5ub3RhdGlvbkZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEFubm90YXRpb25GaWxlUGFyc2VyKCk7Ci0JCQkJCXBhcnNlci5wYXJzZShtYXAsIGFubm90YXRpb25GaWxlSW5mbyk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNlMTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVIZWxwZXIKLXsKLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkksIExvY2FsZSB0YXJnZXRMb2NhbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCSAgLy8gdHJ5IHRvIGxvYWQgYnVuZGxlIGZyb20gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2VVUkkKLSAgICAvLyB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc291cmNlVVJJIHBvaW50cyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAgICAgICAgIAotICAgIGludCBpbmRleCA9IHJlc291cmNlVVJJLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCByZXNvdXJjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIC8vIEJlbG93IHdlIHNldCAncmVzb3VyY2VEaXJlY3RvcnknIHNvIHRoYXQgaXQgZW5kcyB3aXRoIGEgJy8nLgotICAgIC8vIEhlcmUncyBhbiBleGNlcnB0IGZyb20gdGhlIENsYXNzTG9hZGVyIEphdmFkb2MgLi4uCi0gICAgLy8gQW55IFVSTCB0aGF0IGVuZHMgd2l0aCBhICcvJyBpcyBhc3N1bWVkIHRvIHJlZmVyIHRvIGEgZGlyZWN0b3J5LiBPdGhlcndpc2UsIHRoZSBVUkwgaXMgYXNzdW1lZAotICAgIC8vIHRvIHJlZmVyIHRvIGEgSkFSIGZpbGUgd2hpY2ggd2lsbCBiZSBvcGVuZWQgYXMgbmVlZGVkLiAKLSAgICAvLwotICAgIFN0cmluZyByZXNvdXJjZURpcmVjdG9yeSA9IHJlc291cmNlVVJJLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgYSBjbGFzcyBsb2FkZXIgd2l0aCBhIGNsYXNzIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHJlc291cmNlIGJ1bmRsZSdzIGxvY2F0aW9uCi0gICAgLy8gICAgICAgICAKLSAgICBVUkxbXSBjbGFzc3BhdGggPSBuZXcgVVJMWzFdOwotICAgIGNsYXNzcGF0aFswXSA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChyZXNvdXJjZURpcmVjdG9yeSkpOwotCSAgQ2xhc3NMb2FkZXIgcmVzb3VyY2VMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoY2xhc3NwYXRoLCBudWxsKTsgCi0gICAgICAgCi0gIAlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSwgdGFyZ2V0TG9jYWxlLCByZXNvdXJjZUxvYWRlcik7Ci0JfSAgCi0KLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkkpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQkgIHJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZVVSSSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWM1OTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQW55RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotIAotCi1wdWJsaWMgY2xhc3MgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5KCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnRJbXBsIGNtZG9jdW1lbnQgPW5ldyBDTURvY3VtZW50SW1wbCh1cmkpOwotICAgIGNtZG9jdW1lbnQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIGNtZG9jdW1lbnQ7Ci0gIH0gICAgCi0gCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGNtRG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBpc0xvY2FsKQotICB7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50SW1wbCBjbURvY3VtZW50SW1wbCA9IChDTURvY3VtZW50SW1wbCljbURvY3VtZW50OwotCi0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRNYXAgPSBpc0xvY2FsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0TG9jYWxFbGVtZW50UG9vbCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0RWxlbWVudHMoKTsKLQotICAgIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpZWxlbWVudE1hcC5nZXROYW1lZEl0ZW0obG9jYWxOYW1lKTsKLSAgICBpZiAoZWQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIGVkICIgKyBsb2NhbE5hbWUpOwotICAgICAgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGNtRG9jdW1lbnQsIGxvY2FsTmFtZSk7Ci0gICAgICBlZC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgIGVkLnNldExvY2FsKGlzTG9jYWwpOwotICAgICAgZWQuc2V0TWF4T2NjdXIoMSk7Ci0gICAgICBDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChuZXcgQ01Ob2RlTGlzdEltcGwoKSwgQ01Hcm91cC5DSE9JQ0UpOwotICAgICAgZ3JvdXAuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICBncm91cC5zZXRNaW5PY2N1cigwKTsKLSAgICAgIGdyb3VwLnNldE1heE9jY3VyKC0xKTsKLSAgICAgIGVkLnNldENvbnRlbnQoZ3JvdXApOyAgICAgICAgICAgIAotICAgICAgZWxlbWVudE1hcC5wdXQoZWQpOwotICAgIH0gCi0KLSAgICAvLyBsb29rdXAgb3IgY3JlYXRlIHRoZSBhdHRyaWJ1dGVzCi0gICAgLy8KLSAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlTWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IGF0dHJpYnV0ZU1hcExlbmd0aCA9IGF0dHJpYnV0ZU1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU1hcExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJpYnV0ZU1hcC5pdGVtKGkpOwotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwpZWQuZ2V0QXR0cmlidXRlTWFwKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICBpZiAoYWQgPT0gbnVsbCkKLSAgICAgIHsgICAgIAotICAgICAgICAvLyB0b2RvLi4uIHVzZSBhbiBhdHRyaWJ1dGUgcG9vbCB0byBiZSBtb3JlIGVmZmljaWVudD8KLSAgICAgICAgYWQgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoYXR0ci5nZXROb2RlTmFtZSgpLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLSAgICAgICAgYWQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICAgIGVkLmdldEF0dHJpYnV0ZU1hcCgpLnB1dChhZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlZDsKLSAgfSAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNNQ29udGVudChDTURvY3VtZW50IHBhcmVudENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBDTURvY3VtZW50IGNoaWxkQ01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGRFZCwgYm9vbGVhbiBpc0xvY2FsLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgLy8gYWRkIGVsZW1lbnQgdG8gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICAvLyBjb25zaWRlciBhbGwgY29udGVudCB0byBiZSBvZiB0aGUgZm9ybSAoQSB8IEIgfCBDKSogICAgCi0gICAgLy8KLSAgICBDTUdyb3VwSW1wbCBncm91cCA9IChDTUdyb3VwSW1wbClwYXJlbnRFZC5nZXRDb250ZW50KCk7Ci0gICAgQ01Ob2RlTGlzdEltcGwgZ3JvdXBDaGlsZE5vZGVMaXN0ID0gKENNTm9kZUxpc3RJbXBsKWdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGlmIChwYXJlbnRDTURvY3VtZW50ID09IGNoaWxkQ01Eb2N1bWVudCkKLSAgICB7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjaGlsZEVkKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBDaGlsZE5vZGVMaXN0LmFkZChjaGlsZEVkKTsKLSAgICAgIH0KLSAgICAgIGlmIChpc0xvY2FsKQotICAgICAgewotICAgICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbG9jYWxFbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbClwYXJlbnRFZC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0gICAgICAgIGxvY2FsRWxlbWVudE1hcC5wdXQoY2hpbGRFZCk7Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTUFueUVsZW1lbnQgY21BbnlFbGVtZW50ID0gbG9va3VwT3JDcmVhdGVDTUFueUVsZW1lbnQoKENNRG9jdW1lbnRJbXBsKXBhcmVudENNRG9jdW1lbnQsIHVyaSk7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjbUFueUVsZW1lbnQpKQotICAgICAgewotICAgICAgICBncm91cENoaWxkTm9kZUxpc3QuYWRkKGNtQW55RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSAgICAgIAotICB9ICAgCi0KLSAgcHJvdGVjdGVkIENNQW55RWxlbWVudCBsb29rdXBPckNyZWF0ZUNNQW55RWxlbWVudChDTURvY3VtZW50SW1wbCBwYXJlbnRDTURvY3VtZW50LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRNYXAgPSBwYXJlbnRDTURvY3VtZW50LmdldEFueUVsZW1lbnRzKCk7Ci0gICAgQ01BbnlFbGVtZW50SW1wbCBhbnlFbGVtZW50ID0gKENNQW55RWxlbWVudEltcGwpYW55RWxlbWVudE1hcC5nZXROYW1lZEl0ZW0oQ01BbnlFbGVtZW50SW1wbC5jb21wdXRlTm9kZU5hbWUodXJpKSk7Ci0gICAgaWYgKGFueUVsZW1lbnQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSBhbnlFbGVtZW50ICIgKyB1cmkpOwotICAgICAgYW55RWxlbWVudCA9IG5ldyBDTUFueUVsZW1lbnRJbXBsKHVyaSk7Ci0gICAgICBhbnlFbGVtZW50LnNldEluZmVycmVkKHRydWUpOwotICAgICAgYW55RWxlbWVudE1hcC5wdXQoYW55RWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBhbnlFbGVtZW50OwotICB9IAotICAgICAgCi0KLSAgcHVibGljIHZvaWQgZGVidWdQcmludChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWl0ZXIubmV4dCgpOyAKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbURvY3VtZW50ICgiICsgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpICsiKSIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWxlbWVudE1hcC5pdGVtKGkpOwotICAgICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBFTEVNRU5UICIgKyBlZC5nZXROb2RlTmFtZSgpICsgIiA9ICIgKyBidWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oZWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotICB9ICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTZiZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbjsKLQotLyoqCi0gKiBEZXNjcmliZXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSA8Y29kZT5tb2RlbFF1ZXJ5RXh0ZW5zaW9uPC9jb2RlPiBleHRlbnNpb24KLSAqIHBvaW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0FUVFJJQlVURSA9ICJjb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9BVFRSSUJVVEUgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uOwotICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZUlkOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByaXZhdGUgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb247Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgY29uZmlndXJhdGlvbiA9IGVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgTW9kZWxRdWVyeUV4dGVuc2lvbiBjcmVhdGVNb2RlbFF1ZXJ5RXh0ZW5zaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGV4dGVuc2lvbiA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uKSBjb25maWd1cmF0aW9uLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1NfQVRUUklCVVRFKTsKLSAgICB9ICAKLSAgICByZXR1cm4gZXh0ZW5zaW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZUlkKCkKLSAgewotICAgIGlmIChjb250ZW50VHlwZUlkID09IG51bGwpCi0gICAgewotICAgICAgY29udGVudFR5cGVJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKENPTlRFTlRfVFlQRV9BVFRSSUJVVEUpOwotICAgIH0KLSAgICByZXR1cm4gY29udGVudFR5cGVJZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTljYjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyCi17ICAgICAgICAgICAKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkgPSBuZXcgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgcHVibGljIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlSWQoZWxlbWVudCk7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShjbU5vZGUpOwotICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmdldEFwcGxpY2FibGVFeHRlbnNpb25zKGNvbnRlbnRUeXBlSWQsIG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24paS5uZXh0KCk7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pCi0gICAgICB7ICAKLSAgICAgICAgdmFsdWVzID0gZXh0ZW5zaW9uLmdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXMgPSBleHRlbnNpb24uZ2V0RWxlbWVudFZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gbGlzdDsgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgY21ub2RlcywgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gZ2V0Q29udGVudFR5cGVJZChlbGVtZW50KTsKLSAgICBTdHJpbmcgcGFyZW50TmFtZXNwYWNlID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQotCUxpc3QgbW9kZWxRdWVyeUV4dGVuc2lvbnMgPSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkuZ2V0QXBwbGljYWJsZUV4dGVuc2lvbnMoY29udGVudFR5cGVJZCwgcGFyZW50TmFtZXNwYWNlKTsKLQkKLSAgICBmb3IgKEl0ZXJhdG9yIGogPSBjbW5vZGVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpai5uZXh0KCk7ICAKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoY21Ob2RlKTsKLSAgICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gaW5jbHVkZSA9IHRydWU7Ci0gICAgICBmb3IoaW50IGsgPSAwOyBrIDwgbW9kZWxRdWVyeUV4dGVuc2lvbnMuc2l6ZSgpICYmIGluY2x1ZGU7IGsrKykgewotICAgICAgewotICAgICAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24pbW9kZWxRdWVyeUV4dGVuc2lvbnMuZ2V0KGspOwotICAgICAgICAgIGluY2x1ZGUgPSBleHRlbnNpb24uaXNBcHBsaWNhYmxlQ2hpbGRFbGVtZW50KGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgaWYgKCFpbmNsdWRlKQotCQkgIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY21Ob2RlIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgIGoucmVtb3ZlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgICAgICAgICAgCi0gICAgeyAgICAgCi0gICAgICBuYW1lc3BhY2UgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlkKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKSBub2RlOwotICAgICAgY29udGVudFR5cGVJZCA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLSAgICB9ICAgCi0gICAgcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjYxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAibW9kZWxRdWVyeUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzOwotCi0gIHB1YmxpYyBMaXN0IGdldEFwcGxpY2FibGVFeHRlbnNpb25zKFN0cmluZyBjb250ZW50VHlwZUlkLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChjb250ZW50VHlwZUlkICE9IG51bGwpCi0gICAgewotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0xvYWRlZCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlSWQuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0Q29udGVudFR5cGVJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldE5hbWVzcGFjZSgpID09IG51bGwgfHwgIGRlc2NyaXB0b3IuZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSBkZXNjcmlwdG9yLmNyZWF0ZU1vZGVsUXVlcnlFeHRlbnNpb24oKTsKLSAgICAgICAgICAgICAgbGlzdC5hZGQoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGNyZWF0aW5nIG1vZGVsIHF1ZXJ5IGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIC8qCi0gICAqICBUT0RPIDogY29uc2lkZXIgcHJvdmlkaW5nIGEgbm9uLXBsdWdpbiBtZWFucyBhZGQvcmVtb3ZlIGV4dGVuc2lvbnMKLSAgICogICAKLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uKQotICB7ICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUV4dGVuc2lvbihNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVwcmVjYXRlZCBleHRlbnNpb24pCi0gIHsKLSAgfSovCi0KLSAgLyoqCi0gICAqIFJlYWRzIGFsbCBleHRlbnNpb25zLgotICAgKiA8cD4KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpbiBvcmRlciB0byByZWxvYWQgZnJvbSBhIGNoYW5nZWQKLSAgICogZXh0ZW5zaW9uIHJlZ2lzdHJ5LgotICAgKiA8L3A+Ci0gICAqLwotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbG9hZEV4dGVuc2lvbnMoKQotICB7Ci0gICAgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIGJ1bmRsZWlkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQgICAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGJ1bmRsZWlkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcihlbGVtZW50c1tpXSk7Ci0gICAgICBkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhlIGV4dGVuc2lvbnMgaGF2ZSBiZWVuIGxvYWRlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4dGVuc2lvbnNMb2FkZWQoKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpCi0gICAgewotICAgICAgcmVsb2FkRXh0ZW5zaW9ucygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5YzEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci0KLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVWYWx1ZUhlbHBlcgotewotICBwcm90ZWN0ZWQgaW50IGlkQ291bnQgPSAwOwotCi0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgCi0gICAgaWYgKGlzWFNJVHlwZShhZCkpICAgICAgICAgCi0gICAgeyAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IGdldFF1YWxpZmllZFhTSVR5cGVzKGFkLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB2YWx1ZSA9IGxpc3Quc2l6ZSgpID4gMCA/IChTdHJpbmcpbGlzdC5nZXQoMCkgOiBudWxsOwotICAgIH0gCi0KLSAgICAvLyBzaGFtZWxlc3MgaGFjawotICAgIC8vCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGFkLmdldEF0dHJOYW1lKCkuZXF1YWxzKCJ4bWw6bGFuZyIpKSAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICB2YWx1ZSA9ICJFTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gYWQuZ2V0QXR0clR5cGUoKTsKLSAgICAgIGlmIChkYXRhVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGdldFZhbHVlKGRhdGFUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgIHZhbHVlID0gZGF0YVR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBkYXRhVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gdmFsdWVzWzBdOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gZGF0YVR5cGUuZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCk7Ci0gICAgfSAgICAgICAgICAgICAgIAotCi0gICAgLy8gSGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBoYW5kbGUgRFREJ3MgSUQgcmVsYXRlZCBkYXRhdHlwZXMuCi0gICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgZ2VuZXJhdGVkL3ZhbGlkYXRlIGJ5IGNvbnNpZGVyaW5nIHRoZSBlbnRpcmUgeG1sIGZpbGUKLSAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHRoZSAnZ2VuZXJhdGVJbnN0YW5jZVZhbHVlJyBtZXRob2QuCi0gICAgLy8KLSAgICAvLyB0b2RvLi4uIGZpbmQgYSBuaWNlciB3YXkgdG8gaGFuZGxlIHRoaXMgICAgCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlLmdldERhdGFUeXBlTmFtZSgpOwotICAgICAgaWYgKGRhdGFUeXBlTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGF0YVR5cGVOYW1lLmVxdWFscygiSUQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSAiaWR2YWx1ZSIgKyBpZENvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkYXRhVHlwZU5hbWUuZXF1YWxzKCJJRFJFRiIpIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoIklEUkVGUyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gImlkdmFsdWUwIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgcmV0dXJuIHZhbHVlOwotICB9IAotICAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZEVtcHR5VmFsdWUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgeyAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0gICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gKFN0cmluZylkYXRhVHlwZS5nZXRQcm9wZXJ0eSgiaXNWYWxpZEVtcHR5VmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCAmJiBwcm9wZXJ0eVZhbHVlLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaXNYU0lUeXBlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChhZC5nZXROb2RlTmFtZSgpLmVxdWFscygidHlwZSIpKSAgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VOYW1lID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5hbWVzcGFjZU5hbWUgIT0gbnVsbCAmJiBuYW1lc3BhY2VOYW1lLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLQotICBwdWJsaWMgTGlzdCBnZXRRdWFsaWZpZWRYU0lUeXBlcyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSB0YWJsZSkKLSAgeyAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCB4c2lUeXBlcyA9IChMaXN0KWFkLmdldFByb3BlcnR5KCJYU0lUeXBlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHhzaVR5cGVzICE9IG51bGwgJiYgeHNpVHlwZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2lUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICBTdHJpbmdbXSBjb21wb25lbnRzID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKHVyaVF1YWxpZmllZE5hbWUpOyAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB0YWJsZS5nZXRQcmVmaXhGb3JVUkkoY29tcG9uZW50c1swXSAhPSBudWxsID8gY29tcG9uZW50c1swXSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICI6IiArIGNvbXBvbmVudHNbMV0gOiAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1sxXTsKLSAgICAgICAgbGlzdC5hZGQodHlwZU5hbWUpOwotICAgICAgfQotICAgIH0gICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczZjQ0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNVmlzaXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDTVZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvciBzdHJpbmdDb250ZW50Q29tcGFyaXRvciA9IG5ldyBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3IoKTsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBncmFwaE5vZGVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogR3JhcGhOb2RlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEdyYXBoTm9kZQotICB7Ci0gICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIHB1YmxpYyBib29sZWFuIGlzVGVybWluYWw7Ci0gICAgcHVibGljIFZlY3RvciBhcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIEdyYXBoTm9kZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFyYyhBcmMgYXJjKQotICAgIHsKLSAgICAgIGFyY0xpc3QuYWRkRWxlbWVudChhcmMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgIHJldHVybiAiW0dyYXBoTm9kZSAiICsgbmFtZSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogQXJjCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFyYwotICB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCAgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUEVBVCAgID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFVl9JTiAgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9ORVhUID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5LICAgICA9IDY7Ci0KLSAgICBwdWJsaWMgaW50IGtpbmQ7Ci0gICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIHB1YmxpYyBHcmFwaE5vZGUgbm9kZTsKLSAgICBwdWJsaWMgQ01Ob2RlIGNtTm9kZTsKLQotICAgIHB1YmxpYyBBcmMoaW50IGtpbmQsIEdyYXBoTm9kZSBub2RlLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMoa2luZCwgIiIsIG5vZGUsIGNtTm9kZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQXJjKGludCBraW5kLCBTdHJpbmcgbmFtZSwgR3JhcGhOb2RlIG5vZGUsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLm5vZGUgPSBub2RlOwotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogR3JhcGhHZW5lcmF0b3IKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3JhcGhHZW5lcmF0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBpbnQgaW5kZW50OwotICAgIHB1YmxpYyBpbnQgY291bnQ7Ci0gICAgcHVibGljIEdyYXBoTm9kZSBzdGFydEdyYXBoTm9kZTsKLSAgICBwdWJsaWMgQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb250ZXh0Ci0gICAgewotICAgICAgR3JhcGhOb2RlIGZyb207Ci0gICAgICBHcmFwaE5vZGUgdG87Ci0KLSAgICAgIENvbnRleHQoR3JhcGhOb2RlIGZyb20sIEdyYXBoTm9kZSB0bykKLSAgICAgIHsKLSAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKLSAgICAgICAgdGhpcy50byA9IHRvOwotICAgICAgfQotCi0gICAgICBHcmFwaE5vZGUgZ2V0TGFzdEdyYXBoTm9kZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAodG8gIT0gbnVsbCkgPyB0byA6IGZyb207Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgR3JhcGhHZW5lcmF0b3IoKQotICAgIHsKLSAgICAgIHN0YXJ0R3JhcGhOb2RlID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXJ0R3JhcGhOb2RlLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlR3JhcGgoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLQotICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDTU5vZGUoZWQuZ2V0Q29udGVudCgpKTsKLSAgICAgIH0KLSAgICAgIC8vIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQS4uLiBubyBncmFwaCByZXF1aXJlZAotICAgICAgLy8gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZLi4uIG5vIGdyYXBoIHJlcXVpcmVkCi0gICAgICBjb250ZXh0LmdldExhc3RHcmFwaE5vZGUoKS5pc1Rlcm1pbmFsID0gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R3JhcGhOb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICJuIiArIGNvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBHcmFwaE5vZGUgZ2V0U3RhcnRHcmFwaE5vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiBzdGFydEdyYXBoTm9kZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICAgICAgICAgICAgICAgIHJlcGVhdAotICAgICAqICAgICAgICAgICAgICstLS0tIy0tLS0tKwotICAgICAqICAgICAgICAgICAgIHwgICAgICAgICAgfAotICAgICAqICAgICAgICAgICAgIHYgICAgICAgICAgfAotICAgICAqICBwcmV2IC0tIy0+IGluIC0tJ3gnLT4gb3V0IC0tIy0+IG5leHQKLSAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0gICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAqICArLS0tLS0tLS0tLS0tLS0tLSMtLS0tLS0tLS0tLS0tLSsKLSAgICAgKiAgICAgICAgICAgICAgICBvcHRpb25hbAotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXJjcyhHcmFwaE5vZGUgaW4sIEdyYXBoTm9kZSBvdXQsIENNQ29udGVudCBjbUNvbnRlbnQpCi0gICAgewotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBjbUNvbnRlbnQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBcmNzKEdyYXBoTm9kZSBpbiwgR3JhcGhOb2RlIG91dCwgQ01Db250ZW50IGNtQ29udGVudCwgYm9vbGVhbiBpc0FsbEdyb3VwKQotICAgIHsKLSAgICAgIC8vcHJpbnRsbigiK2NyZWF0ZUFyY3MoKSAiICsgZWQuZ2V0RGVzY3JpcHRpb24oKSArICIgIiArIGVkLmdldE1pbk9jY3VyKCkpOwotICAgICAgR3JhcGhOb2RlIHByZXYgPSBjb250ZXh0LmZyb207Ci0gICAgICBHcmFwaE5vZGUgbmV4dCA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLQotICAgICAgcHJldi5hZGRBcmMobmV3IEFyYyhBcmMuUFJFVl9JTiwgaW4sIGNtQ29udGVudCkpOwotICAgICAgb3V0LmFkZEFyYyhuZXcgQXJjKEFyYy5PVVRfTkVYVCwgbmV4dCwgY21Db250ZW50KSk7Ci0KLSAgICAgIGlmIChjb250ZXh0LnRvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5leHQuYWRkQXJjKG5ldyBBcmMoQXJjLkxJTkssIGNvbnRleHQudG8sIGNtQ29udGVudCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb250ZXh0LmZyb20gPSBuZXh0OwotICAgICAgfQotCi0gICAgICBpZiAoY21Db250ZW50LmdldE1pbk9jY3VyKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gdG9kby4uLiBzaG91bGQgd2Ugc2VlIGlmIGFuIG9wdGlvbmFsIGFyYyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkPwotICAgICAgICBwcmV2LmFkZEFyYyhuZXcgQXJjKEFyYy5PUFRJT05BTCwgbmV4dCwgY21Db250ZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjbUNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA9PSAtMSB8fCBjbUNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA+IDEgfHwgaXNBbGxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgb3V0LmFkZEFyYyhuZXcgQXJjKEFyYy5SRVBFQVQsIGluLCBjbUNvbnRlbnQpKTsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsKLSAgICAgIENvbnRleHQgcHJldkNvbnRleHQgPSBjb250ZXh0OwotICAgICAgR3JhcGhOb2RlIGluID0gbmV3IEdyYXBoTm9kZSgiKCIgKyBnZXRHcmFwaE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZSgiKSIgKyBnZXRHcmFwaE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGludCBncm91cE9wZXJhdG9yID0gZ3JvdXAuZ2V0T3BlcmF0b3IoKTsKLSAgICAgIGlmIChncm91cE9wZXJhdG9yID09IENNR3JvdXAuU0VRVUVOQ0UpCi0gICAgICB7Ci0gICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dChpbiwgbnVsbCk7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICAgIGNvbnRleHQuZnJvbS5hZGRBcmMobmV3IEFyYyhBcmMuTElOSywgb3V0LCBncm91cCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLkNIT0lDRSB8fAotICAgICAgICAgICAgICAgZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLkFMTCkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KGluLCBvdXQpOwotICAgICAgICBzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotICAgICAgfQotCi0gICAgICBjb250ZXh0ID0gcHJldkNvbnRleHQ7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGdyb3VwLCBncm91cE9wZXJhdG9yID09IENNR3JvdXAuQUxMKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgR3JhcGhOb2RlIGluID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgR3JhcGhOb2RlIG91dCA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIGNyZWF0ZUFyY3MoaW4sIG91dCwgZWQpOwotICAgICAgaW4uYWRkQXJjKG5ldyBBcmMoQXJjLkVMRU1FTlQsIGVkLmdldEVsZW1lbnROYW1lKCksIG91dCwgZWQpKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgICB7Ci0gICAgICBHcmFwaE5vZGUgaW4gPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBhbnlFbGVtZW50KTsKLSAgICAgIGluLmFkZEFyYyhuZXcgQXJjKEFyYy5FTEVNRU5ULCAiYW55Iiwgb3V0LCBhbnlFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICAvLyB0b2RvLi4gaW1wbGVtZW50IGNhY2hlIHN0cmF0ZWd5IGhvb2ssIGhhbmRsZSBuYW1lIHNwYWNlcywgbG9jYWxzIGV0Yy4KLSAgLy8KLSAgcHVibGljIEdyYXBoTm9kZSBsb29rdXBPckNyZWF0ZUdyYXBoKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBPYmplY3Qga2V5ID0gZWxlbWVudDsKLSAgICBHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpZ3JhcGhOb2RlVGFibGUuZ2V0KGtleSk7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBub2RlID0gY3JlYXRlR3JhcGgoZWxlbWVudCk7Ci0gICAgICBncmFwaE5vZGVUYWJsZS5wdXQoa2V5LCBub2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBHcmFwaEdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgR3JhcGhHZW5lcmF0b3IoKTsKLSAgICBnZW5lcmF0b3IuZ2VuZXJhdGVHcmFwaChlbGVtZW50KTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmdldFN0YXJ0R3JhcGhOb2RlKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHByaW50R3JhcGgoR3JhcGhOb2RlIG5vZGUsIFZlY3RvciBuYW1lZEFyY0xpc3QsIFZlY3RvciB1bmFtZWRBcmNMaXN0LCBpbnQgaW5kZW50KQotICB7Ci0gICAgLy9TdHJpbmcgZGVjb3JhdGlvbiA9IG5vZGUuaXNUZXJtaW5hbCA/ICIgKiIgOiAiIjsKLSAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJHcmFwaE5vZGU6IiArIG5vZGUubmFtZSArIGRlY29yYXRpb24pOwotCi0gICAgaW5kZW50ICs9IDI7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbm9kZS5hcmNMaXN0LmVsZW1lbnRzKCkgOyBlLmhhc01vcmVFbGVtZW50cygpIDspCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpZS5uZXh0RWxlbWVudCgpOwotICAgICAgLy9ib29sZWFuIHZpc2l0ID0gZmFsc2U7Ci0gICAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJBcmM6IiArIGFyYy5uYW1lICsgIiAoIiArIGFyYy5raW5kICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgLy90YWJsZS5hZGQoY3VycmVudEdyYW1tYXJPYmplY3QsIGFyYy5ncmFtbWFyT2JqZWN0KTsKLSAgICAgICAgaWYgKCFuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIHByaW50R3JhcGgoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCF1bmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIHByaW50R3JhcGgoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludEdyYXBoKEdyYXBoTm9kZSBub2RlKQotICB7Ci0gICAgcHJpbnRHcmFwaChub2RlLCBuZXcgVmVjdG9yKCksIG5ldyBWZWN0b3IoKSwgMCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlRWxlbWVudExpc3QoRWxlbWVudExpc3QgbGlzdCwgR3JhcGhOb2RlIG5vZGUsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0LCBib29sZWFuIGxvb3BGbGFnKQotICB7Ci0gICAgLy9wcmludGxuKCIrdmFsaWRhdGVFbGVtZW50TGlzdCAiICsgbm9kZSArICIgIiArIGxpc3QpOwotICAgIGlmIChsaXN0ID09IG51bGwgJiYgbm9kZS5pc1Rlcm1pbmFsKQotICAgIHsKLSAgICAgIHJlc3VsdC5pc1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgICBib29sZWFuIHRyYXZlcnNlQXJjID0gZmFsc2U7Ci0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgY29tcGFyYXRvci5tYXRjaGVzKGxpc3QuaGVhZCwgYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9vcEZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyYXZlcnNlQXJjID0gdHJ1ZTsKLSAgICAgICAgICAgIGxpc3QgPSBsaXN0LnRhaWw7IC8vIGluY3JlbWVudCBvdXIgcG9zaXRpb24gaW4gdGhlIGxpc3QKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghbG9vcEZsYWcpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJhdmVyc2VBcmMgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBsb29wRmxhZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHJhdmVyc2VBcmMgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRyYXZlcnNlQXJjKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdGVzdCB0byBzZWUgaWYgd2UgY2FuIHB1c2ggdGhpcyBhcmMgZHVlIHRvIGZhY2V0IGNvbnN0cmFpbnRzCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAocmVzdWx0LmNhblB1c2goYXJjKSkKLSAgICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgICAgLy8gc2VlIGlmIHRoaXMgYXJjIGxlYWRzIHRvIGEgY29ycmVjdCBzb2x1dGlvbiAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyYyk7Ci0gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnRMaXN0KGxpc3QsIGFyYy5ub2RlLCBjb21wYXJhdG9yLCByZXN1bHQsIGxvb3BGbGFnKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuaXNWYWxpZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQucG9wKGFyYyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgRWxlbWVudExpc3QgY3JlYXRlRWxlbWVudExpc3QoaW50IGNvbnRlbnRUeXBlLCBMaXN0IHYsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgRWxlbWVudExpc3QgZmlyc3QgPSBudWxsOwotICAgIEVsZW1lbnRMaXN0IHByZXYgPSBudWxsOwotCi0gICAgaW50IHNpemUgPSB2LnNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IHYuZ2V0KGkpOwotICAgICAgaWYgKG8gIT0gbnVsbCAmJiAhY29tcGFyYXRvci5pc0lnbm9yYWJsZShvKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudExpc3QgbGlzdCA9IG5ldyBFbGVtZW50TGlzdCgpOwotICAgICAgICAgIGxpc3QuaGVhZCA9IG87Ci0KLSAgICAgICAgICBpZiAocHJldiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXYudGFpbCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZXYgPSBsaXN0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHJlc3VsdC5lcnJvckluZGV4ID0gaTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlID0gIkVsZW1lbnQgY2FuIG5vdCBpbmNsdWRlIFBDREFUQSBjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaXJzdDsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgZWxlbWVudENvbnRlbnQsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLQotICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgIHsKLSAgICAgIEVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gY3JlYXRlRWxlbWVudExpc3QoY29udGVudFR5cGUsIGVsZW1lbnRDb250ZW50LCBjb21wYXJhdG9yLCByZXN1bHQpOwotICAgICAgaWYgKHJlc3VsdC5pc1ZhbGlkID09IHRydWUpCi0gICAgICB7ICAKLSAgICAgICAgLy8gZGVmZWN0IDIyNjIxMyAuLi4gZWxlbWVudHMgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBjaGlsZHJlbiB3aWxsIGNhdXNlIHRoZSByZWN1cnNpb24gYmFzZWQgdmFsaWRhdGlvbgotICAgICAgICAvLyBhbGdvcml0aG0gdG8gc3RhY2sgb3ZlcmZsb3cgLi4uIGFzIGEgcXVpY2sgZml4IGFzc3VtZSBhbnkgZWxlbWVudCB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIGNoaWxkcmVuIGlzIHZhbGlkICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnRDb250ZW50LnNpemUoKSA8IDUwMCkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gaXNHcmFwaFZhbGlkYXRpb25OZWVkZWQgPSAhKGVsZW1lbnRMaXN0ID09IG51bGwgJiYgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpOwotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIGV4bGljaXR5IGhhbmRsZSAnQWxsJyBncm91cHMKLSAgICAgICAgICAvLwotICAgICAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgICAgIGlmIChjb250ZW50LmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cCljb250ZW50OwotICAgICAgICAgICAgaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5BTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzR3JhcGhWYWxpZGF0aW9uTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIHZhbGlkYXRBbGxHcm91cENvbnRlbnQoZWxlbWVudENvbnRlbnQsIGNvbXBhcmF0b3IsIGdyb3VwLCByZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgIH0gIAotICAgICAgICAgIAotICAgICAgICAgIGlmIChpc0dyYXBoVmFsaWRhdGlvbk5lZWRlZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgZWxlbWVudExpc3QgdXNpbmcgYSBncmFwaAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBHcmFwaE5vZGUgbm9kZSA9IGxvb2t1cE9yQ3JlYXRlR3JhcGgoZWQpOwotICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50TGlzdChlbGVtZW50TGlzdCwgbm9kZSwgY29tcGFyYXRvciwgcmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRDb250ZW50LnNpemUoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGVsZW1lbnRDb250ZW50LmdldChpKTsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JJbmRleCA9IGk7Ci0gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZSA9ICJFbGVtZW50IG1heSBvbmx5IGluY2x1ZGUgUENEQVRBIGNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0gICAgewotICAgICAgaW50IHNpemUgPSBlbGVtZW50Q29udGVudC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBlbGVtZW50Q29udGVudC5nZXQoaSk7Ci0gICAgICAgIGlmICghY29tcGFyYXRvci5pc0lnbm9yYWJsZShvKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVzdWx0LmVycm9ySW5kZXggPSBpOwotICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2UgPSAiRWxlbWVudCBtYXkgbm90IGNvbnRhaW4gUENEQVRBIG9yIEVsZW1lbnQgY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvL2Vsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSkKLSAgICAvLyB7Ci0gICAgLy8gICBhc3N1bWUgZWxlbWVudENvbnRlbnQgd2lsbCBhbHdheXMgYmUgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0gICAgLy8gfQotICB9Ci0gICAgCi0gIHN0YXRpYyBjbGFzcyBJdGVtQ291bnQKLSAgewotICAgIGludCBjb3VudCA9IDA7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdmFsaWRhdEFsbEdyb3VwQ29udGVudChMaXN0IGVsZW1lbnRDb250ZW50LCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgQ01Hcm91cCBhbGxHcm91cCwgUmVzdWx0IHJlc3VsdCkgCi0gIHsKLSAgICBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotICAgIGJvb2xlYW4gaXNQYXJ0aWFsbHlWYWxpZCA9IHRydWU7Ci0gICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIENNTm9kZUxpc3QgbGlzdCA9IGFsbEdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBqID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGogPj0gMDsgai0tKQotICAgIHsKLSAgICAgIENNTm9kZSBub2RlID0gbGlzdC5pdGVtKGopOyAgICAgIAotICAgICAgaWYgKG1hcC5nZXQobm9kZSkgPT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBtYXAucHV0KG5vZGUsIG5ldyBJdGVtQ291bnQoKSk7Ci0gICAgICB9ICAKLSAgICB9ICAgIAotICAgIGludCB2YWxpZGl0aW9uQ291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRDb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyB2YWxpZGl0aW9uQ291bnQrKykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOyAgICAgICAgCi0gICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgLy8gdGVzdCB0byBzZWUgaWYgdGhlIGVsZW1lbnQgaXMgbGlzdGVkIGluIHRoZSBhbGwgZ3JvdXAKLSAgICAgICAgLy8KLSAgICAgICAgQ01Ob2RlIG1hdGNoaW5nQ01Ob2RlID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaiA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZSBub2RlID0gbGlzdC5pdGVtKGopOwotICAgICAgICAgIGlmIChjb21wYXJhdG9yLm1hdGNoZXMobywgbm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2hpbmdDTU5vZGUgPSBub2RlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAobWF0Y2hpbmdDTU5vZGUgPT0gbnVsbCkKLSAgICAgICAgeyAgICAgCi0gICAgICAgICAgaXNQYXJ0aWFsbHlWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgIAotICAgICAgICAgIC8vIHRlc3QgdG8gc2VlIHRoYXQgdGhlIGVsZW1lbnQgb2NjdXJzIG9ubHkgb25jZQotICAgICAgICAgIC8vCi0gICAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpbWFwLmdldChtYXRjaGluZ0NNTm9kZSk7Ci0gICAgICAgICAgaWYgKGl0ZW1Db3VudCAhPSBudWxsKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgaWYgKGl0ZW1Db3VudC5jb3VudCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gYWxsb3cgdG9vIG1hbnkgZWxlbWVudHMhCi0gICAgICAgICAgICAgIC8vIHdlIGNvbnNpZGVyICdub3QgZW5vdWdoJyB0byBiZSBwYXJ0aWFsbHkgdmFsaWQuLi4gYnV0IG5vdCAndG9vIG1hbnknCi0gICAgICAgICAgICAgIGlzUGFydGlhbGx5VmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXRlbUNvdW50LmNvdW50Kys7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfQotICAgIGlmIChpc1ZhbGlkKQotICAgIHsgIAotICAgICAgZm9yIChpbnQgaiA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIG5vZGUgPSBsaXN0Lml0ZW0oaik7ICAgICAgCi0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICAgIHsgIAotICAgICAgICAgIENNQ29udGVudCBjb250ZW50ID0gKENNQ29udGVudClub2RlOwotICAgICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KW1hcC5nZXQobm9kZSk7Ci0vLyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJjb250ZW50ICIgKyBjb250ZW50LmdldE5vZGVOYW1lKCkgKyAiICIgKyBjb250ZW50LmdldE1pbk9jY3VyKCkpOwotICAgICAgICAgIGlmIChpdGVtQ291bnQuY291bnQgPCBjb250ZW50LmdldE1pbk9jY3VyKCkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCAmJiBpc1BhcnRpYWxseVZhbGlkKQotICAgIHsKLSAgICAgICgoRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQpcmVzdWx0KS5zZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KHZhbGlkaXRpb25Db3VudCk7Ci0gICAgfSAgCi0gICAgcmVzdWx0LmlzVmFsaWQgPSBpc1ZhbGlkOwotICB9ICAKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBnZXRPcmlnaW5BcnJheShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBlbGVtZW50Q29udGVudCwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIENNTm9kZVtdIGNtTm9kZUFycmF5ID0gbnVsbDsKLSAgICB2YWxpZGF0ZShlZCwgZWxlbWVudENvbnRlbnQsIGNvbXBhcmF0b3IsIHJlc3VsdCk7Ci0gICAgaWYgKHJlc3VsdC5pc1ZhbGlkKQotICAgIHsKLSAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBlZC5nZXREYXRhVHlwZSgpOwotICAgICAgaW50IHNpemUgPSBlbGVtZW50Q29udGVudC5zaXplKCk7Ci0gICAgICBjbU5vZGVBcnJheSA9IG5ldyBDTU5vZGVbc2l6ZV07Ci0gICAgICBWZWN0b3Igb3JpZ2luTGlzdCA9IHJlc3VsdC5nZXRFbGVtZW50T3JpZ2luTGlzdCgpOwotICAgICAgaW50IG9yaWdpbkxpc3RTaXplID0gb3JpZ2luTGlzdC5zaXplKCk7IAotICAgICAgaW50IG9yaWdpbkxpc3RJbmRleCA9IDA7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBlbGVtZW50Q29udGVudC5nZXQoaSk7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yLmlzRWxlbWVudChvKSkKLSAgICAgICAgeyAgICAgCi0gICAgICAgICAgaWYgKG9yaWdpbkxpc3RJbmRleCA8IG9yaWdpbkxpc3RTaXplKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNtTm9kZUFycmF5W2ldID0gKENNTm9kZSlvcmlnaW5MaXN0LmdldChvcmlnaW5MaXN0SW5kZXgpOwotICAgICAgICAgICAgb3JpZ2luTGlzdEluZGV4Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbXBhcmF0b3IuaXNQQ0RhdGEobykpCi0gICAgICAgIHsKLSAgICAgICAgICBjbU5vZGVBcnJheVtpXSA9IGRhdGFUeXBlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVsc2UgdGhlIENNTm9kZSBhdCB0aGlzIGluZGV4IGlzIG51bGwKLSAgICAgIH0KLSAgICAgIHJlc3VsdC5zZXRPcmlnaW5BcnJheShjbU5vZGVBcnJheSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY29sbGVjdE5hbWVkQXJjcyhHcmFwaE5vZGUgbm9kZSwgTGlzdCBuYW1lZEFyY0xpc3QsIGludCBpbmRlbnQpCi0gIHsKLSAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJHcmFwaE5vZGU6IiArIG5vZGUubmFtZSArIGRlY29yYXRpb24pOwotICAgIGluZGVudCArPSAyOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKSA7KQotICAgIHsKLSAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiQXJjOiIgKyBhcmMubmFtZSArICIgKCIgKyBhcmMua2luZCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7IAotICAgICAgICBpZiAoIW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIGNvbGxlY3ROYW1lZEFyY3MoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kICE9IEFyYy5SRVBFQVQgJiYgYXJjLmtpbmQgIT0gQXJjLk9QVElPTkFMKQotICAgICAgewotICAgICAgICBjb2xsZWN0TmFtZWRBcmNzKGFyYy5ub2RlLCBuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRNYXRjaGluZ0FyY3MoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIExpc3QgYXJjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbG9va3VwT3JDcmVhdGVHcmFwaChlZCk7Ci0gICAgaWYgKGVsZW1lbnROYW1lID09IG51bGwpCi0gICAgewotICAgICAgLy8gaGVyZSB3ZSBhZGQgdGhlICdyb290JyBhcmMKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyYXBoTm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpIDspCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICAgIHsKLSAgICAgICAgICBhcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsgCi0gICAgICBMaXN0IG5hbWVkQXJjcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGNvbGxlY3ROYW1lZEFyY3MoZ3JhcGhOb2RlLCBuYW1lZEFyY3MsIDApOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZWRBcmNzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgICBpZiAoYXJjLmNtTm9kZSAhPSBudWxsICYmIGVsZW1lbnROYW1lLmVxdWFscyhhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpKQotICAgICAgICB7ICAKLSAgICAgICAgICBhcmNMaXN0LmFkZChhcmMpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0gICAgICAKLSAgICByZXR1cm4gYXJjTGlzdDsKLSAgfQotCi0gIAotICBwcml2YXRlIHZvaWQgY29sbGVjdE5leHRTaWJsaW5ncyhHcmFwaE5vZGUgbm9kZSwgTGlzdCBuZXh0U2libGluZ0xpc3QsIExpc3QgbmFtZWRBcmNMaXN0LCBMaXN0IHVuYW1lZEFyY0xpc3QsIGludCBpbmRlbnQpCi0gIHsKLSAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJHcmFwaE5vZGU6IiArIG5vZGUubmFtZSArIGRlY29yYXRpb24pOwotICAgIGluZGVudCArPSAyOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgeyAgICAgICAKLSAgICAgICAgaWYgKCFuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhcmMuY21Ob2RlICE9IG51bGwpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBuZXh0U2libGluZ0xpc3QuYWRkKGFyYy5jbU5vZGUpOwotICAgICAgICAgICAgaWYgKGFyYy5jbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiB8fAotICAgICAgICAgICAgICAgIGFyYy5jbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQU5ZX0VMRU1FTlQpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgbmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgICAgICBDTUNvbnRlbnQgY21Ob2RlID0gKENNQ29udGVudClhcmMuY21Ob2RlOyAKLSAgICAgICAgICAgICAgaWYgKGNtTm9kZS5nZXRNaW5PY2N1cigpID09IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmFtZWRBcmNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGNvbGxlY3ROZXh0U2libGluZ3MoYXJjLm5vZGUsIG5leHRTaWJsaW5nTGlzdCwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghdW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgdW5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICBjb2xsZWN0TmV4dFNpYmxpbmdzKGFyYy5ub2RlLCBuZXh0U2libGluZ0xpc3QsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgfQotICAgIAotICBwdWJsaWMgQ01Ob2RlW10gZ2V0TmV4dFNpYmxpbmdzKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICBMaXN0IGFyY0xpc3QgPSBnZXRNYXRjaGluZ0FyY3MoZWQsIGVsZW1lbnROYW1lKTsKLSAgICBMaXN0IG5leHRTaWJsaW5nTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICBjb2xsZWN0TmV4dFNpYmxpbmdzKGFyYy5ub2RlLCBuZXh0U2libGluZ0xpc3QsIG5ldyBBcnJheUxpc3QoKSwgbmV3IEFycmF5TGlzdCgpLCAwKTsgICAgICAKLSAgICB9ICAKLSAgICBDTU5vZGVbXSByZXN1bHQgPSBuZXcgQ01Ob2RlW25leHRTaWJsaW5nTGlzdC5zaXplKCldOwotICAgIG5leHRTaWJsaW5nTGlzdC50b0FycmF5KHJlc3VsdCk7ICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludCgiZ2V0TmV4dFNpYmxpbmcoIiArZWxlbWVudE5hbWUgKyAiKSIpOwotICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgLy97Ci0gICAgLy8gIFN5c3RlbS5vdXQucHJpbnQoIlsiICsgcmVzdWx0W2ldLmdldE5vZGVOYW1lKCkgKyAiXSIpOwotICAgIC8vfSAgCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3VsdAotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0gICAgcHVibGljIGludCBlcnJvckluZGV4ID0gLTE7Ci0gICAgcHVibGljIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRUcmF2ZXJzZWQ7IC8vIGRldGVjdHMgaWYgYSByZXBlYXQgaGFzIGJlZW4gdHJhdmVyc2VkCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5QdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICAvLyBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHJlY29yZCB0cmF2ZXJzZWQgbm9kZXMKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcG9wKEFyYyBhcmMpCi0gICAgewotICAgICAgLy8gb3ZlcmlkZSB0aGlzIG1ldGhvZCB0byByZWNvcmQgdHJhdmVyc2VkIG5vZGVzCi0gICAgfQotICAgIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheSgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IGV4dGVuZHMgUmVzdWx0Ci0gIHsgIAotICAgIHByb3RlY3RlZCBMaXN0IGFjdGl2ZUl0ZW1Db3VudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJvdGVjdGVkIExpc3QgaW5hY3RpdmVJdGVtQ291bnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGVsZW1lbnRPcmlnaW5TdGFjayA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcm90ZWN0ZWQgQ01Ob2RlW10gb3JpZ2luQXJyYXkgPSBudWxsOwotICAgIHByb3RlY3RlZCBpbnQgcGFydGlhbFZhbGlkYXRpb25Db3VudCA9IDA7Ci0KLSAgICAKLSAgICAvLyB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHN1cHBvcnQgZmFjZXQgY291bnRzCi0gICAgLy8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5QdXNoKEFyYyBhcmMpCi0gICAgeyAgICAgCi0gICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgICAgICAKLSAgICAgIHRyeQotICAgICAgeyAgICAgICAgCi0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIGlmIChhcmMuY21Ob2RlIGluc3RhbmNlb2YgQ01Db250ZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNQ29udGVudCBjb250ZW50ID0gKENNQ29udGVudClhcmMuY21Ob2RlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gZG8gJ3NwZWNpYWwnIGZhY2V0IGNoZWNraW5nIGlmIHRoZSBtYXhPY2N1cnMgaXMgPiAxCi0gICAgICAgICAgICAvLyB2YWx1ZXMgb2YgJzAnIGFuZCAnLTEnICh1bmJvdW5kZWQpIHdvcmsgJ2ZvciBmcmVlJyB3aXRob3V0IGFueSBzcGVjaWFsIGNoZWNraW5nCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA+IDEpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIC8vIGhlcmUgd2UgbmVlZCB0byBjb21wdXRlIGlmIHdlIGNhbiBkbyBhbm90aGVyIHJlcGVhdAotICAgICAgICAgICAgICAvLyBpZiB3ZSBpbmNyZWFzZSB0aGUgcmVwZWF0IGNvdW50IGJ5ICcxJyB3aWxsIHRoaXMgdmlvbGF0ZSB0aGUgbWF4T2NjdXJzCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIGlmIChpdGVtQ291bnQuY291bnQgKyAxID49IGNvbnRlbnQuZ2V0TWF4T2NjdXIoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2FuUHVzaCBSRVBFQVQgKCIgKyBpdGVtQ291bnQuY291bnQgKyAiKSIgKyBjb250ZW50LmdldE5vZGVOYW1lKCkgKyAiIHJlc3VsdD0gIiArIHJlc3VsdCk7ICAgICAgICAgICAgCi0gICAgICAgICAgfSAKLSAgICAgICAgfSAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIC8vU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgZWxlbWVudE9yaWdpblN0YWNrLmFkZChhcmMuY21Ob2RlKTsKLSAgICAgICAgcGFydGlhbFZhbGlkYXRpb25Db3VudCA9IE1hdGgubWF4KGVsZW1lbnRPcmlnaW5TdGFjay5zaXplKCksIHBhcnRpYWxWYWxpZGF0aW9uQ291bnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QuYWRkKG5ldyBJdGVtQ291bnQoKSk7ICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuT1VUX05FWFQpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpICsgIlsiICsgYXJjICsgIl0iKTsKLSAgICAgICAgaW50IHNpemUgPSBhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoc2l6ZSAtIDEpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICAgIGluYWN0aXZlSXRlbUNvdW50TGlzdC5hZGQoaXRlbUNvdW50KTsgCi0gICAgICB9ICAgICAgCi0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOwotICAgICAgICBpdGVtQ291bnQuY291bnQrKzsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJlcGVhdCgiICsgaXRlbUNvdW50LmNvdW50ICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcChBcmMgYXJjKQotICAgIHsKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRPcmlnaW5TdGFjay5zaXplKCk7Ci0gICAgICAgIGVsZW1lbnRPcmlnaW5TdGFjay5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5yZW1vdmUoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLk9VVF9ORVhUKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGludCBzaXplID0gaW5hY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpaW5hY3RpdmVJdGVtQ291bnRMaXN0LmdldChzaXplIC0gMSk7Ci0gICAgICAgIGluYWN0aXZlSXRlbUNvdW50TGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LmFkZChpdGVtQ291bnQpOyAgICAgCi0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgaXRlbUNvdW50LmNvdW50LS07Ci0gICAgICB9ICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldEVsZW1lbnRPcmlnaW5MaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWxlbWVudE9yaWdpblN0YWNrOwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheSgpCi0gICAgewotICAgICAgcmV0dXJuIG9yaWdpbkFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9yaWdpbkFycmF5KENNTm9kZVtdIG9yaWdpbkFycmF5KQotICAgIHsKLSAgICAgIHRoaXMub3JpZ2luQXJyYXkgPSBvcmlnaW5BcnJheTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFydGlhbFZhbGlkYXRpb25Db3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KGludCBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50KQotICAgIHsKLSAgICAgIHRoaXMucGFydGlhbFZhbGlkYXRpb25Db3VudCA9IHBhcnRpYWxWYWxpZGF0aW9uQ291bnQ7Ci0gICAgfQotICB9ICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF0aFJlY29yZGluZ1Jlc3VsdCBleHRlbmRzIFJlc3VsdAotICB7Ci0gICAgcHJvdGVjdGVkIFZlY3RvciBhcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIHZvaWQgcHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIGFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wKEFyYyBhcmMpCi0gICAgewotICAgICAgaW50IHNpemUgPSBhcmNMaXN0LnNpemUoKTsKLSAgICAgIGFyY0xpc3QucmVtb3ZlKHNpemUgLSAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBcmNMaXN0KCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJjTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChhcmMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGUgZ2V0TWF0Y2hNb2RlbCgpCi0gICAgewotICAgICAgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyKGFyY0xpc3QpOwotICAgICAgYnVpbGRlci5idWlsZE1hdGNoTW9kZWwoKTsKLSAgICAgIHJldHVybiBidWlsZGVyLmdldFJvb3QoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWF0Y2hNb2RlbE5vZGUKLSAgewotICAgIHB1YmxpYyBDTU5vZGUgY21Ob2RlOwotICAgIHB1YmxpYyBMaXN0IGNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgIHB1YmxpYyBPYmplY3QgZGF0YTsKLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZShNYXRjaE1vZGVsTm9kZSBwYXJlbnQsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRNb2RlbChpbnQgaW5kZW50KQotICAgIHsKLSAgICAgIC8vU3RyaW5nIGNtTm9kZU5hbWUgPSBjbU5vZGUgIT0gbnVsbCA/IGNtTm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOwotICAgICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiTWF0Y2hNb2RlbE5vZGUgOiAiICsgY21Ob2RlTmFtZSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE1hdGNoTW9kZWxOb2RlIGNoaWxkID0gKE1hdGNoTW9kZWxOb2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgY2hpbGQucHJpbnRNb2RlbChpbmRlbnQgKyAyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGNoTW9kZWxOb2RlQnVpbGRlcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgYXJjTGlzdDsKLSAgICBwcm90ZWN0ZWQgTGlzdCBzdGFjayA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcm90ZWN0ZWQgTWF0Y2hNb2RlbE5vZGUgcm9vdDsKLSAgICBwcm90ZWN0ZWQgTWF0Y2hNb2RlbE5vZGUgY3VycmVudDsKLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIoTGlzdCBhcmNMaXN0KQotICAgIHsKLSAgICAgIHRoaXMuYXJjTGlzdCA9IGFyY0xpc3Q7Ci0gICAgICByb290ID0gbmV3IE1hdGNoTW9kZWxOb2RlKG51bGwsIG51bGwpOwotICAgICAgcHVzaChyb290KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwdXNoKE1hdGNoTW9kZWxOb2RlIG5vZGUpCi0gICAgewotICAgICAgY3VycmVudCA9IG5vZGU7Ci0gICAgICBzdGFjay5hZGQobm9kZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wKCkKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IHN0YWNrLnNpemUoKTsKLSAgICAgIHN0YWNrLnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICBjdXJyZW50ID0gKE1hdGNoTW9kZWxOb2RlKXN0YWNrLmdldChzaXplIC0gMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDTUdyb3VwKENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgcmV0dXJuIGNtTm9kZSAhPSBudWxsICYmIGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZE1hdGNoTW9kZWwoKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcmNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgY3VycmVudC5jaGlsZHJlbi5hZGQobmV3IE1hdGNoTW9kZWxOb2RlKGN1cnJlbnQsIGFyYy5jbU5vZGUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0NNR3JvdXAoYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTWF0Y2hNb2RlbE5vZGUgbmV3TW9kZWxOb2RlID0gbmV3IE1hdGNoTW9kZWxOb2RlKGN1cnJlbnQsIGFyYy5jbU5vZGUpOwotICAgICAgICAgICAgY3VycmVudC5jaGlsZHJlbi5hZGQobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICAgIHB1c2gobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLk9VVF9ORVhUKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzQ01Hcm91cChhcmMuY21Ob2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb3AoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0NNR3JvdXAoYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICBNYXRjaE1vZGVsTm9kZSBuZXdNb2RlbE5vZGUgPSBuZXcgTWF0Y2hNb2RlbE5vZGUoY3VycmVudCwgYXJjLmNtTm9kZSk7Ci0gICAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLmFkZChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgICAgcHVzaChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRSb290KCkKLSAgICB7Ci0gICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGludGVyZmFjZSBFbGVtZW50Q29udGVudENvbXBhcmF0b3IKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKE9iamVjdCBvKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BDRGF0YShPYmplY3Qgbyk7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KE9iamVjdCBvKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvLCBDTU5vZGUgY21Ob2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIGxpbmtlZCBsaXN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnRMaXN0Ci0gIHsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGhlYWQ7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnRMaXN0IHRhaWw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRMaXN0IGNyZWF0ZShMaXN0IHYpCi0gICAgewotICAgICAgRWxlbWVudExpc3QgZmlyc3QgPSBudWxsOwotICAgICAgRWxlbWVudExpc3QgcHJldiA9IG51bGw7Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB2Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnRMaXN0IGxpc3QgPSBuZXcgRWxlbWVudExpc3QoKTsKLSAgICAgICAgICBsaXN0LmhlYWQgPSBvOwotCi0gICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2LnRhaWwgPSBsaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZmlyc3QgPSBsaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmV2ID0gbGlzdDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZpcnN0OwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9ICJbIiArIGhlYWQgKyAiXSwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgaWYgKHRhaWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nICs9IHRhaWwudG9TdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RyaW5nRWxlbWVudENvbnRlbnRDb21wYXJhdG9yCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvciBpbXBsZW1lbnRzIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvcgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoT2JqZWN0IG8pCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IG8udG9TdHJpbmcoKTsKLSAgICAgIHJldHVybiBzdHJpbmcuc3RhcnRzV2l0aCgiISIpIHx8IHN0cmluZy5zdGFydHNXaXRoKCI/Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUENEYXRhKE9iamVjdCBvKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBvLnRvU3RyaW5nKCk7Ci0gICAgICByZXR1cm4gc3RyaW5nLnN0YXJ0c1dpdGgoIiciKSB8fCBzdHJpbmcuc3RhcnRzV2l0aCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiAhaXNJZ25vcmFibGUobykgJiYgIWlzUENEYXRhKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG8sIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgIHsgCi0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlOwotICAgICAgICBTdHJpbmcgbmFtZSA9IG8udG9TdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7ICAgICAgICAKLQotICAgICAgICAvLyBUT0RPLi4uIGhlcmUncyB3ZSBjb25zaWRlciBzdWJzdGl0dXRpb24gZ3JvdXBzLi4uIHJldmlzaXQgdG8gc2VlIGlmIHRoaXMgc2hvdWxkIGJlIG1vdmVkIGludG8gdmFsaWRhdG9yIGNvZGUKLSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGVMaXN0IGNtTm9kZUxpc3QgPSAoQ01Ob2RlTGlzdCllbGVtZW50LmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoY21Ob2RlTGlzdCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjbU5vZGVMaXN0TGVuZ3RoID0gY21Ob2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChjbU5vZGVMaXN0TGVuZ3RoID4gMSkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbU5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBhbHRlcm5hdGl2ZUNNRWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtTm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWx0TmFtZSA9IGFsdGVybmF0aXZlQ01FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoYWx0TmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0gICAKLSAgICAgIGVsc2UgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BTllfRUxFTUVOVCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgc3RyaW5nID0gby50b1N0cmluZygpOwotICAgICAgICBpZiAoc3RyaW5nLmVxdWFscygiKiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIENNQW55RWxlbWVudCBhbnlFbGVtZW50ID0gKENNQW55RWxlbWVudCljbU5vZGU7Ci0gICAgICAgICAgU3RyaW5nIGFueUVsZW1lbnRVUkkgPSBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyAgICAKLSAgICAgICAgICBpZiAoYW55RWxlbWVudFVSSSAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGFueUVsZW1lbnRVUkkuZXF1YWxzKCIjI2FueSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYW55RWxlbWVudFVSSS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgeyAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7ICAgIAotICAgICAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudClhbnlFbGVtZW50LmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2x1ZGVkVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZWRVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgU3RyaW5nIHNwZWNpZmllZFVSSSA9IGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVkVVJJICE9IG51bGwgJiYgZXhjbHVkZWRVUkkuZXF1YWxzKHNwZWNpZmllZFVSSSkpCi0gICAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgZWxzZSBpZiAoYW55RWxlbWVudFVSSS5lcXVhbHMoIiMjdGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpYW55RWxlbWVudC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgeyAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNwZWNpZmllZFVSSSA9IGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwZWNpZmllZFVSSSAhPSBudWxsICYmICF0YXJnZXROYW1lc3BhY2VVUkkuZXF1YWxzKHNwZWNpZmllZFVSSSkpCi0gICAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgIAotICAgICAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgIFN0cmluZyBzcGVjaWZpZWRVUkkgPSBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihzdHJpbmcpOwotICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVkVVJJICE9IG51bGwgJiYgIWFueUVsZW1lbnRVUkkuZXF1YWxzKHNwZWNpZmllZFVSSSkpCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0gICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgIH0gICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgIAotICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihTdHJpbmcgc3BlY2lmaWNhdGlvbikKLSAgICB7ICAgICAgICAgICAKLSAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgaW50IGluZGV4ID0gc3BlY2lmaWNhdGlvbi5pbmRleE9mKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IHNwZWNpZmljYXRpb24uc3Vic3RyaW5nKDEsIGluZGV4KTsKLSAgICAgIH0gCi0gICAgICByZXR1cm4gcmVzdWx0OyAgCi0gICAgfQotICB9ICAgICAgCi0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZVN0cmluZ0xpc3QoU3RyaW5nIGFyZ1tdLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDwgYXJnLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKGFyZ1tpXSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0ZGY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBBIHNwZWNpYWwgQ01WYWxpZGF0b3IgdGhhdCBrbm93cyBhYm91dCBET01zCi0gKi8KLXB1YmxpYyBjbGFzcyBET01WYWxpZGF0b3IgZXh0ZW5kcyBDTVZhbGlkYXRvcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAKLSAgICByZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAvL3JldHVybiBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICB9Ci0gICAgICAgICAgCi0KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrISEKLSAgLy8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGYWxsYmFja05hbWVwYWNlVVJJKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgCi0gICAgU3RyaW5nIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWVkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgcmV0dXJuIGZhbGxiYWNrTmFtZXBhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBFbGVtZW50J3MgTm9kZUxpc3QgYXMgYSBMaXN0IG9mIHN0cmluZ3MgdGhhdCB0aGUgdmFsaWRhdG9yIHJlY29nbml6ZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUgPSBpc05hbWVzcGFjZUF3YXJlKGVkKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAKLSAgICBmb3IgKE5vZGUgY2hpbGROb2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkTm9kZSAhPSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7IAotICAgICAgdi5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24oY2hpbGROb2RlLCBpc05hbWVzcGFjZUF3YXJlLCBpc05hbWVzcGFjZUF3YXJlID8gZ2V0RmFsbGJhY2tOYW1lcGFjZVVSSShlZCkgOiBudWxsKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICBwdWJsaWMgTGlzdCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoTGlzdCBub2RlTGlzdCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlID0gaXNOYW1lc3BhY2VBd2FyZShlZCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgCi0gCi0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgIHYuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKG5vZGUsIGlzTmFtZXNwYWNlQXdhcmUsIGdldEZhbGxiYWNrTmFtZXBhY2VVUkkoZWQpKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBOb2RlIGFzIGEgc3RyaW5nIHRoYXQgdGhlIHZhbGlkYXRvciByZWNvZ25pemVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKE5vZGUgbm9kZSwgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlLCBTdHJpbmcgZmFsbGJhY2tOYW1lcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsgIAotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7ICAKLSAgICAgICAgaWYgKG5vZGVOYW1lLnN0YXJ0c1dpdGgoImpzcDoiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRyZWF0IGl0IGFzIGEgY29tbWVudCBzbyB0aGF0IGl0J3MgaWdub3JlZCBieSB0aGUgdmFsaWRhdG9yIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNOYW1lc3BhY2VBd2FyZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUobm9kZU5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gIlsiICsgdXJpICsgIl0iICsgcmVzdWx0OyAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIGlmIChmYWxsYmFja05hbWVwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9ICJbIiArIGZhbGxiYWNrTmFtZXBhY2VVUkkgKyAiXSIgKyByZXN1bHQ7ICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5vZGVOYW1lOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuKCJyZXN1bHQgIiArIHJlc3VsdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICI/IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIlwiIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgewotICAgICAgICBTdHJpbmcgZGF0YSA9ICgoVGV4dClub2RlKS5nZXREYXRhKCk7Ci0gICAgICAgIC8vIGhlcmUgd2UgdGVzdCB0byBzZWUgaWYgdGhlIHRlc3Qgbm9kZSBpcyAnaWdub3JhYmxlJwotICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICJcIiIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRvZG8uLi4gdXNlIGFub3RoZXIgc3ltYm9sPyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIExpc3QgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc3dpdGNoIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25Gb3JDTUVsZW1lbnREZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlKSk7ICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIlwiIiArIGNtTm9kZS5nZXROb2RlTmFtZSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0Rm9yQ01Hcm91cCgoQ01Hcm91cCljbU5vZGUsIGxpc3QpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkFOWV9FTEVNRU5UIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiISIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gICAgIAotCi0gIC8qKgotICAgKiAKLSAgICovICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkZvckNNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAKLSAgICBDTURvY3VtZW50IGRvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyB1cmkgPSBkb2N1bWVudCAhPSBudWxsID8gKFN0cmluZylkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpIDogbnVsbDsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBzdHJpbmcgPSBlZC5nZXROb2RlTmFtZSgpOwotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBzdHJpbmcgPSAiWyIgKyB1cmkgKyAiXSIgKyBzdHJpbmc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci0gIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdEZvckNNR3JvdXAoQ01Hcm91cCBncm91cCwgTGlzdCBsaXN0KQotICB7ICAgICAgICAgCi0gICAgQ01Hcm91cENvbnRlbnRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ01Hcm91cENvbnRlbnRWaXNpdG9yKGdyb3VwLCBsaXN0KTsKLSAgICB2aXNpdG9yLnZpc2l0Q01Ob2RlKGdyb3VwKTsKLSAgfSAKLSAgICAgCi0gIHByb3RlY3RlZCBjbGFzcyBDTUdyb3VwQ29udGVudFZpc2l0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgeyAgCi0gICAgcHJvdGVjdGVkIENNR3JvdXAgcm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgICBwdWJsaWMgQ01Hcm91cENvbnRlbnRWaXNpdG9yKENNR3JvdXAgcm9vdCwgTGlzdCBsaXN0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnJvb3QgPSByb290OyAgICAgICAgCi0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBpZiAoZWQuZ2V0TWluT2NjdXIoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uRm9yQ01FbGVtZW50RGVjbGFyYXRpb24oZWQpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgeyAgIAotICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChncm91cCA9PSByb290IHx8IGdyb3VwLmdldE1pbk9jY3VyKCkgPiAwKQotICAgICAgewotICAgICAgICBpbnQgb3AgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgICAgICBpZiAob3AgPT0gQ01Hcm91cC5TRVFVRU5DRSkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob3AgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgICAgfSAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAKLSAgICByZXR1cm4gZWQgIT0gbnVsbCA/IGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaXNOYW1lU3BhY2VBd2FyZSIpICE9IG51bGwgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0ID0gbmV3IEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgZ2V0T3JpZ2luQXJyYXkoZWQsIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChlbGVtZW50LCBlZCksIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQuZ2V0T3JpZ2luQXJyYXkoKTsKLSAgfQotICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRNYXRjaE1vZGVsKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBNYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSA9IG51bGw7Ci0gICAgUGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQgPSBuZXcgUGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZWxlbWVudCwgZWQpLCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0LmlzVmFsaWQpCi0gICAgewotICAgICAgbWF0Y2hNb2RlbE5vZGUgPSByZXN1bHQuZ2V0TWF0Y2hNb2RlbCgpOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2hNb2RlbE5vZGU7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBMaXN0IGNsb25lKExpc3QgbGlzdCkKLSAgeyAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IFZlY3RvcihsaXN0LnNpemUoKSk7Ci0gICAgcmVzdWx0LmFkZEFsbChsaXN0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgICAgICAgICAKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIGluc2VydChjbG9uZWRMaXN0LCBpbnNlcnRJbmRleCwgY21Ob2RlKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGlzUGFydGlhbGx5VmFsaWQoZWQsIGNsb25lZExpc3QpOyAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBMaXN0IGNtTm9kZUxpc3QpCi0gIHsgICAgICAgICAgICAgIAotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgaW5zZXJ0KGNsb25lZExpc3QsIGluc2VydEluZGV4LCBjbU5vZGVMaXN0KTsKLSAgICByZXR1cm4gaXNWYWxpZChlZCwgY2xvbmVkTGlzdCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgpCi0gIHsKLSAgICByZXR1cm4gY2FuUmVtb3ZlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIHN0YXJ0UmVtb3ZlSW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCwgaW50IGVuZFJlbW92ZUluZGV4KQotICB7Ci0gICAgTGlzdCBjbG9uZWRMaXN0ID0gY2xvbmUoY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICByZW1vdmUoY2xvbmVkTGlzdCwgc3RhcnRSZW1vdmVJbmRleCwgZW5kUmVtb3ZlSW5kZXgpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGludCBzdGFydFJlbW92ZUluZGV4LCBpbnQgZW5kUmVtb3ZlSW5kZXgsIENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIHJlbW92ZShjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBlbmRSZW1vdmVJbmRleCk7IAotICAgIGluc2VydChjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBjbU5vZGUpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0LmlzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseVZhbGlkKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkKLSAgewotICAgIENNVmFsaWRhdG9yLkVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCA9IG5ldyBDTVZhbGlkYXRvci5FbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIGludCBjb3VudCA9IGdldEVsZW1lbnRDb3VudChjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbGVtZW50T3JpZ2luTGlzdCAiICsgcmVzdWx0LmdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKSArICJ2cyIgKyBjb3VudCk7Ci0gICAgcmV0dXJuIHJlc3VsdC5nZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KCkgPj0gY291bnQ7Ci0gIH0gIAotICAKLSAgcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdDb250ZW50Q29tcGFyaXRvci5pc0VsZW1lbnQoaS5uZXh0KCkpKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIFJlc3VsdCB2YWxpZGF0ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGVsZW1lbnQsIGVkKSwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKExpc3Qgc3RyaW5nTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgsIGludCBlbmRSZW1vdmVJbmRleCkKLSAgewotICAgIGlmIChzdGFydFJlbW92ZUluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSBzdGFydFJlbW92ZUluZGV4OyBpIDw9IGVuZFJlbW92ZUluZGV4OyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN0cmluZ0xpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIGlmIChpbnNlcnRJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgTGlzdCBjbU5vZGVMaXN0KQotICB7Ci0gICAgaWYgKGluc2VydEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGludCBpbnNlcnRMaXN0U2l6ZSA9IGNtTm9kZUxpc3Quc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IGluc2VydExpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWNtTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODBhZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0KLS8qKgotICogVGhlIENNRG9jdW1lbnRNYW5hZ2VyIGNhbiBiZSB2aXN1YWxpemVkIGFzIGEgdGFibGUgb2YgQ01Eb2N1bWVudAotICogcmVmZXJlbmNlcywgZWFjaCB3aXRoIGEgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBhIENNRG9jdW1lbnQgY2FjaGUuIFRoZQotICogQ01Eb2N1bWVudE1hbmFnZXIgYWxzbyBwZXJmb3JtcyB0aGUgdGFzayBvZiBsb2FkaW5nIENNRG9jdW1lbnRzIHByb3ZpZGluZwotICogc3VwcG9ydCBmb3Igc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBsb2FkaW5nLgotICogCi0gKiBwdWJsaWNJZFRhYmxlIENNRG9jdW1lbnRDYWNoZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHB1YmxpY0lkIHwgcmVzb2x2ZWRVUkkgfCAtPiB8Ci0gKiByZXNvbHZlZFVSSSB8IHN0YXR1cyB8IENNRG9jdW1lbnQgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IChudWxsKSB8IGZpbGU6L3guZHRkIHwgfAotICogZmlsZToveC5kdGQgfCBsb2FkaW5nIHwgKG51bGwpIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCBodHRwOi8uLi4gfCBmaWxlOi95LnhzZCB8IHwKLSAqIGZpbGU6L3kueHNkIHwgbG9hZGVkIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudE1hbmFnZXIgewotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIFdIRU4gQ01Eb2N1bWVudHMgYXJlIGxvYWRlZC4gU2V0dGluZyB0aGlzCi0JICogcHJvcGVydHkgdG8gdHJ1ZSBhbGxvd3MgdGhlIENNRG9jdW1lbnRNYW5hZ2VyIHRvIGxvYWQgQ01Eb2N1bWVudHMgb24KLQkgKiBkZW1hbmQuIFNldHRpbmdzIHRoaXMgcHJvcGVydHkgYSBmYWxzZSBwdXRzIHRoZSBvbnVzIG9uIHRoZSBjbGllbnQgdG8KLQkgKiBjYWxsIGFkZENNRG9jdW1lbnRSZWZlcmVuY2UoKSB0byBleHBsaWNpdHkgdHJpZ2dlciBhIGxvYWQuIFRoaXMgYWxsb3dzCi0JICogdGhlIGNsaWVudCB0byBjb250cm9sIGV4YWN0bHkgd2hlbiBsb2FkaW5nIHNob3VsZCB0YWtlIHBsYWNlLiApCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQVVUT19MT0FEID0gImF1dG9Mb2FkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBwcm9wZXJ0eSBzcGVjaWZpZXMgSE9XIENNRG9jdW1lbnRzIGFyZSBsb2FkZWQuIFdoZW4gc2V0IHRvIGZhbHNlLAotCSAqIHRoZSBnZXRDTURvY3VtZW50KCkgbWV0aG9kIHdpbGwgbG9hZCB0aGUgQ01Eb2N1bWVudCBzeW5jaHJvbm91c2x5IGFuZAotCSAqIHJldHVybiBhIENNRG9jdW1lbnQgb2JqZWN0IHdoZW4gbG9hZGluZyBpcyBzdWNjZXNzZnVsLiBXaGVuIHNldCB0bwotCSAqIHRydWUsIHRoZSBnZXRDTURvY3VtZW50KCkgd2lsbCBsb2FkIHRoZSBDTURvY3VtZW50IGFzeW5jaHJvbm91c2x5IGFuZAotCSAqIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIG51bGwuIFdoZW4gbG9hZGluZyBpcyBjb21wbGV0ZSwgdGhlCi0JICogQ01Eb2N1bWVudE1hbmFnZXIgd2lsbCBpbmZvcm0gaXRzIGxpc3RlbmVycyB0aGF0IHRoZSBDTURvY3VtZW50IGhhcwotCSAqIGJlZW4gbG9hZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FTWU5DX0xPQUQgPSAiYXN5bmNMb2FkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVNFX0NBQ0hFRF9SRVNPTFZFRF9VUkkgPSAidXNlQ2FjaGVkUmVzb3ZsZWRVUkkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBlbmFibGVkKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyLiBMaXN0ZW5lcnMgc2hvdWxkIGV4cGVjdCB0byByZWNlaXZlIGNhbGwgYmFja3Mgb24gYQotCSAqIHNlY29uZGFyeSB0aHJlYWQgd2hlbiBhc3luY2hyb25vdXNseSBsb2FkaW5nIGlzIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBMb29rdXAgb3IgY3JlYXRlIGEgQ01Eb2N1bWVudCAoZGVwZW5kaW5nIG9uIFBST1BFUlRZX0FVVE9fTE9BRCkuCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHBhcmFtIHR5cGUgLQotCSAqICAgICAgICAgICAgJ2R0ZCcsICd4c2QnLCAndGxkJywgZXRjLiBpZiBudWxsIGlzIGdpdmVuIGFzIHRoZSB0eXBlLCB0aGVuCi0JICogICAgICAgICAgICB0aGUgdHlwZSBpcyBjYWxjdWxhdGVkIGFzIGxhc3Qgc2VnbWVudCAoZS5nLiBmaWxlIGV4dGVuc2lvbikKLQkgKiAgICAgICAgICAgIG9mIHRoZSByZXNvbHZlZCBVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogTG9va3VwIGEgQ01Eb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN0YXR1cyBvZiBhIENNRG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDTURvY3VtZW50U3RhdHVzKFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgQ01Eb2N1bWVudCBhbmQgYWRkcyB0aGUgYXNzb2NpYXRlZCBDTURvY3VtZW50IHJlZmVyZW5jZQotCSAqIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHdheXMgdHJpZ2dlcnMgYQotCSAqIENNRG9jdW1lbnQgbG9hZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50UmVmZXJlbmNlKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXhpc3RpbmdDTURvY3VtZW50IGFuZCB0aGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgQ01Eb2N1bWVudENhY2hlIHRoYXQgaXMgdXNlZCB0byBzdG9yZSBsb2FkZWQgQ01Eb2N1bWVudHMgYW5kCi0JICogYXNzb2NpYXRlZCBzdGF0dXMuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKTsKLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgZ2l2ZW4gYSByZXNvdWx2ZWRVUkkuIE5vdGUgdGhhdCBubyBlbnRyaWVzIGFyZQotCSAqIGFkZGVkIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwYmVlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGVMaXN0ZW5lcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgZXh0ZW5kcyBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci19ICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGRmY2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudFJlZmVyZW5jZQotewotICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTMwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLSAKLS8qKgotICogVGhlIGludGVyZmFjZSBpcyB1c2VkIHRvIGFic3RyYWN0IHRoZSB0YXNrIG9mIGNvbXB1dGluZyB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBET00KLSAqIG9yIGEgcGFydGljdWxhciBub2RlIHdpdGhpbiB0aGUgRE9NLiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyCi17Ci0gIExpc3QgZ2V0Q01Eb2N1bWVudFJlZmVyZW5jZXMoTm9kZSBub2RlLCBib29sZWFuIGRlZXApOwotICBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODVlNzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgcGVyZm9ybWluZyBoaWdoZXIgbGV2ZWwgcXVlcmllcyBiYXNlZCBvbgotICogYSB4bWwgbW9kZWwgKERPTSkgYW5kIG9uZSBvciBtb3JlIGFzc29jaWF0ZWQgY29udGVudCBtb2RlbHMgKENNRG9jdW1lbnQpLgotICoKLSAqIFRoZSBxdWVyaWVzIHByb3ZpZGVkIGNhbiBiZSBvcmdhbml6ZWQgaW50byB0aHJlZSBncm91cHM6Ci0gKgotICogMSkgRE9NIE5vZGUgdG8gQ01Ob2RlIG1hcHBpbmcKLSAqICAgICAgR2l2ZW4gYSBncmFtbWF0aWNhbGx5IHZhbGlkIERPTSBOb2RlIHRoZSBjb3JyZXNwb25kaW5nIENNTm9kZSBjYW4gYmUgZGV0ZXJtaW5lZC4KLSAqICAgICAgKGkuZS4gRWxlbWVudCAtPiBDTUVsZW1lbnREZWNsYXJhdGlvbiwgQXR0ciAtPiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLCBDaGFyYWN0ZXJEYXRhIC0+IENNRGF0YVR5cGUpCi0gKgotICogMikgRE9NIGVkaXRpbmcgdGVzdHMgKCJDYW4gSSBkbyB0aGlzPyIpCi0gKiAgICAgIFF1ZXN0aW9ucyBzdWNoIGFzIGNhbkluc2VydCwgY2FuUmVtb3ZlLCBjYW5SZXBsYWNlIGNhbiBhc3Npc3QgaW4gdGhlIGVkaXRpbmcgb2YgYSBET00uCi0gKgotICogICAgICBUaGUgdmFsaWRpdHlDaGVja2luZyBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZSBzdHJpY3RuZXNzIG9mIHRoZSB2YWxpZGl0eSB0ZXN0aW5nIHRoYXQgb2NjdXJzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9OT05FICAgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBpZ25vcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBjb250ZW50IG1vZGVsIGlzIGNvbnNpZGVyZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGNvZGVhc3Npc3QgcmVsYXRlZCBxdWVyaWVzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9TVFJJQ1QgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBjb25zaWRlcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgb3BlcmF0aW9uIHByZXNlcnZlcyBjb250ZW50IHZhbGlkaXR5LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIERPTSBlZGl0aW5nIG5lZWRzIHRvIGJlIGNvbnN0cmFpbmVkIHRvIG1haW50YWluIHZhbGlkaXR5LgotICoKLSAqICAgICAgLSBWQUxJRElUWV9QQVJUSUFMIDogU29tZSBvcHRpbWl6ZWQgY29tcHJvbWlzZSBiZXR3ZWVuIHRoZSB0d28gb3B0aW9ucyBhYm92ZS4KLSAqCi0gKiAzKSBET00gZWRpdGluZyBhY3Rpb25zICgiV2hhdCBjYW4gSSBkbyBoZXJlPyIpCi0gKiAgICAgIFRoZXNlIG1ldGhvZHMgcmV0dXJuIE1vZGVsUXVlcnlBY3Rpb25zIHRoYXQgYXJlIHJlbGV2YW50IGF0IHNvbWUgc3BlY2lmaWVkIERPTSBOb2RlLgotICogICAgICBUaGUgYWN0aW9ucyBpbmRpY2F0ZSB3aGF0IGtpbmRzIG9mIERPTSBOb2RlIGNhbiBiZSBpbnNlcnRlZCB3aGVyZSAoYXQgd2hhdCBpbmRleCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRElUWV9OT05FID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURJVFlfUEFSVElBTCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElESVRZX1NUUklDVCA9IDI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BTEwgPSAweEZGOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0FUVFJJQlVURVMgPSAweDAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0NISUxEX05PREVTID0gMHgwMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9TRVFVRU5DRV9HUk9VUFMgPSAweDA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1RFWFRfTk9ERVMgPSAweDA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VOQ0xPU0lOR19SRVBMQUNFX0FDVElPTlMgPSAweDEwOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9VTkNPTlNUUkFJTkVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX0NPTlNUUkFJTkVEX0xFTklFTlQ9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QgPSAyOwotCi0KLSAgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpOwotCi0gIGludCAgZ2V0RWRpdE1vZGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4KLSAgICogb3IgbnVsbCBpZiBubyBDTURvY3VtZW50IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgQ01Ob2RlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgaXMgdmFsaWQKLSAgICovCi0gIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoRWxlbWVudCBlbGVtZW50KTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Ob2RlIG9mIHRoZSBwYXJlbnQgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwKLSAgICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbm9kZQotICAgKi8KLSAgQ01Ob2RlIGdldE9yaWdpbihOb2RlIG5vZGUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIENNTm9kZXMgb2YgdGhlIHBhcmVudCBlbGVtZW50J3MgY29udGVudCBtb2RlbAotICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBub2RlCi0gICAqLwotICBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgQ01Ob2RlICdtZXRhIGRhdGEnIHRoYXQgbWF5IGJlIHBvdGVudGlhbGx5IGFkZGVkIHRvIHRoZSBlbGVtZW50LgotICAgKi8KLSAgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgLyoqCi0gICAqIENhbiBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJyBiZSBhZGRlZCB0byB0aGUgcGFyZW50Ci0gICAqLwotICBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiBtdWx0aXBsZSBET00gTm9kZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbGlzdCBvZiBDTU5vZGUgJ21ldGEgZGF0YScgYmUgYWRkZWQgdG8gdGhlIHBhcmVudAotICAgKi8KLSAgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIExpc3QgY21Ob2RlTGlzdCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgRE9NIE5vZGUgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTm9kZSBub2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgbGlzdCBvZiBET00gTm9kZXMgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTGlzdCBub2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpOwotCi0gIC8qKgotICAgKiBDYW4gdGhlIGNoaWxkcmVuIHdpdGhpbiB0aGUgaW5kaWNhdGVkIGluZGljZXMgYmUgcmVwbGFjZWQgd2l0aCBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBDTU5vZGUgY21Ob2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgY2hpbGRyZW4gd2l0aGluIHRoZSBpbmRpY2F0ZWQgaW5kaWNlcyBiZSByZXBsYWNlZCB3aXRoIG11bHRpcGxlIERPTSBOb2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBMaXN0IGNtTm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICovCi0gIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGVkIGNoaWxkcmVuIG9mIHRoYXQgcGFyZW50IAotICAgKi8KLSAgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogIEBkZXByZWNhdGVkIC0gdXNlIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoKQotICAgKi8KLSAgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZSBvZiB0aGUgQ01Ob2RlIChlaXRoZXIgYW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBvciBhIENNRWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgU3RyaW5nW10gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgYSBDTURvY3VtZW50TWFuYWdlciBpcyBub3QgdXNlZCBieSB0aGUgTW9kZWxRdWVyeQotICAgKi8KLSAgQ01Eb2N1bWVudE1hbmFnZXIgZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIHRoZSBNb2RlbFF1ZXJ5IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgdXNlIG9mIGV4dGVuc2lvbnMKLSAgICovCi0gIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyIGdldEV4dGVuc2lvbk1hbmFnZXIoKTsgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjYmE3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU0VSVCAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRSA9IDQ7Ci0KLSAgcHVibGljIGludCBnZXRLaW5kKCk7Ci0gIC8qKgotICAgKiBpZiBzdGFydCBpbmRleCA9PSAtMSB0aGVuIG5vIGluc2VydCBpcyBwb3NzaWJsZQotICAgKiBpZiBzdGFydCBpbmRleCAhPSAtMSBhbmQgZW5kSW5kZXggPT0gLTEgdGhlbiBhbiBpbnNlcnQgYXQgYW55IHBvc2l0aW9uIGlzIHBvc3NpYmxlCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKTsKLSAgcHVibGljIGludCBnZXRFbmRJbmRleCgpOwotICBwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKTsKLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoKTsKLSAgcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpOwotICBwdWJsaWMgdm9pZCBzZXRVc2VyRGF0YShPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNkMTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgTW9kZWxRdWVyeUNNUHJvdmlkZXIKLXsKLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpOyAKLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpOwotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY0NGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlDTVByb3ZpZGVyCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLgotICAgKiBvciBudWxsIGlmIG5vIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI1ODY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uCi17ICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSB7fTsKLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVWYWx1ZXMoRWxlbWVudCBvd25lckVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEVsZW1lbnRWYWx1ZXMoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBFTVBUWV9TVFJJTkdfQVJSQVk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUNoaWxkRWxlbWVudChOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2E0NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIKLXsKLSAgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGF2YWlsYWJsZUNvbnRlbnQsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0Jhc2VBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMWQ0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEJhc2VBc3NvY2lhdGlvblByb3ZpZGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQXR0cilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01EYXRhVHlwZSgoVGV4dClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KQotICB7Ci0gICAgQ01EYXRhVHlwZSByZXN1bHQgPSBudWxsOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpcGFyZW50Tm9kZSk7Ci0gICAgICByZXN1bHQgPSBlZC5nZXREYXRhVHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzYzMzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudExvYWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZCA9IHRydWU7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGU7Ci0gIHByb3RlY3RlZCBpbnQgY291bnQgPSAwOwotICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIpCi0gIHsgICAKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50TWFuYWdlciA9IGNtRG9jdW1lbnRNYW5hZ2VyOyAgCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBsb2FkQ01Eb2N1bWVudHMoKQotICB7ICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tbG9hZENNRG9jdW1lbnRzIC0tLS0tLS0tLS0tLSIpOyAgICAgICAgICAKLSAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgIAotICAgIGJvb2xlYW4gd2Fsa0RvY3VtZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICBjbURvY3VtZW50TWFuYWdlci5yZW1vdmVBbGxSZWZlcmVuY2VzKCk7Ci0gICAgICAKLSAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IFhNTEFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGxvYWQgdGhlIGRvY3R5cGUgaWYgcmVxdWlyZWQKLSAgICAgIHdhbGtEb2N1bWVudCA9IGhhbmRsZUdyYW1tYXIoZG9jdHlwZUluZm9bMF0sIGRvY3R5cGVJbmZvWzFdLCAiRFREIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBuZXcgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7ICAgCi0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VUYWJsZS5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpCi0gICAgICAgIHsgICAKLSAgICAgICAgICB3YWxrRG9jdW1lbnQgPSB0cnVlOwotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpc05hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBudWxsOwotICAgICAgICAgIHdhbGtEb2N1bWVudCA9IGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZDsKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaXMgTk9UIG5hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAgCi0gICAgfSAKLQotICAgIGlmICh3YWxrRG9jdW1lbnQpCi0gICAgewotICAgICAgdmlzaXROb2RlKGRvY3VtZW50KTsgICAKLSAgICB9IAotCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBlbGFwc2VkIHRpbWUgKCIgKyBjb3VudCArICIpID0gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlR3JhbW1hcihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRTdGF0dXMocHVibGljSWQpOwotICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEKQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnRSZWZlcmVuY2UocHVibGljSWQsIHN5c3RlbUlkLCB0eXBlKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19FUlJPUikKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAgIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudE5TKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBjb3VudCsrOyAgICAgICAKLQotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsgICAgCi0gICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlRWxlbWVudChlbGVtZW50KTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZUVsZW1lbnROUyhlbGVtZW50KTsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIHZpc2l0Q2hpbGROb2Rlcyhub2RlKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGROb2RlcyhOb2RlIG5vZGUpCi0gIHsgICAKLQkgIGZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIAotICAgIHsKLQkgICAgdmlzaXROb2RlKGNoaWxkKTsKLSAgICB9Ci0JfSAgICAgICAgICAgICAKLQotCi0gIHByb3RlY3RlZCBjbGFzcyBDTURvY3VtZW50TG9hZGluZ05hbWVzcGFjZVRhYmxlIGV4dGVuZHMgTmFtZXNwYWNlVGFibGUKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBuZXdOYW1lc3BhY2VMaXN0OwotCi0gICAgcHVibGljIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN1cGVyKGRvY3VtZW50KTsgICAgIAotICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBudWxsOwotICAgICAgc3VwZXIuYWRkRWxlbWVudChlbGVtZW50KTsgIAotICAgICAgaWYgKG5ld05hbWVzcGFjZUxpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV3TmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgICAgaGFuZGxlR3JhbW1hcihpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcga2V5LCBOYW1lc3BhY2VJbmZvIGluZm8pCi0gICAgewotICAgICAgc3VwZXIuaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKGtleSwgaW5mbyk7ICAgICAgICAgICAKLSAgICAgIGlmIChuZXdOYW1lc3BhY2VMaXN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB9Ci0gICAgICBuZXdOYW1lc3BhY2VMaXN0LmFkZChpbmZvKTsgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWRjMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRNYW5hZ2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGU7Ci0gIHByb3RlY3RlZCBDTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIgY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgVmVjdG9yKCk7IAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgcHVibGljSWRUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudE1hbmFnZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlciBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50Q2FjaGUgPSBjbURvY3VtZW50Q2FjaGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyID0gY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotICAgIHNldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9BVVRPX0xPQUQsIHRydWUpOwotICAgIHNldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSwgZmFsc2UpOwotICB9ICAgICAgICAgCi0KLSAgICAgICAKLSAgcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKQotICB7Ci0gICAgcmV0dXJuIGNtRG9jdW1lbnRDYWNoZTsKLSAgfQotCi0gCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHZhbHVlKQotICB7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgcHJvcGVydHlOYW1lKTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGdldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgY21Eb2N1bWVudENhY2hlLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgCi0gICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwUmVzb2x2ZWRVUkkoU3RyaW5nIHB1YmxpY0lkKQotICB7Ci0gICAgU3RyaW5nIGtleSA9IHB1YmxpY0lkICE9IG51bGwgPyBwdWJsaWNJZCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChTdHJpbmcpcHVibGljSWRUYWJsZS5nZXQoa2V5KTsKLSAgfQotICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwT3JDcmVhdGVSZXNvbHZlZFVSSShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsgICAgICAgICAgICAgICAgICAKLQotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSkpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSAoU3RyaW5nKXB1YmxpY0lkVGFibGUuZ2V0KGtleSk7Ci0gICAgfSAgIAotCi0gICAgaWYgKHJlc29sdmVkVVJJID09IG51bGwpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIucmVzb2x2ZUdyYW1tYXJVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmIChyZXNvbHZlZFVSSSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBwdWJsaWNJZFRhYmxlLnB1dChrZXksIHJlc29sdmVkVVJJKTsgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgICByZXR1cm4gcmVzb2x2ZWRVUkk7Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0Q01Eb2N1bWVudFN0YXR1cyhTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IHN0YXR1cyA9IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRDsgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbG9va3VwUmVzb2x2ZWRVUkkocHVibGljSWQpOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAKLSAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotICAKLQotICAvKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlciNnZXRDTURvY3VtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQotICAgIGlmIChnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVVUT19MT0FEKSkKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cE9yQ3JlYXRlUmVzb2x2ZWRVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICB9IAotCi0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FERUQpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjbURvY3VtZW50ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgIAotICAgICAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FVVE9fTE9BRCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjbURvY3VtZW50ID0gbG9hZENNRG9jdW1lbnQocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlLCBnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVNZTkNfTE9BRCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbURvY3VtZW50OyAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBsb29rdXBPckNyZWF0ZVJlc29sdmVkVVJJKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgcmVzb2x2ZWRVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgc3RhdHVzID0gY21Eb2N1bWVudENhY2hlLmdldFN0YXR1cyhyZXNvbHZlZFVSSSk7Ci0gICAgICBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGxvYWRDTURvY3VtZW50KHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSwgZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FTWU5DX0xPQUQpKTsKLSAgICAgIH0gICAgICAgICAKLSAgICB9IAotICB9Ci0gICAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyByZXNvbHZlZFVSSSwgU3RyaW5nIHR5cGUsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgewotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpY0lkVGFibGUucHV0KGtleSwgcmVzb2x2ZWRVUkkpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5wdXRDTURvY3VtZW50KHJlc29sdmVkVVJJLCBjbURvY3VtZW50KTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgbG9hZENNRG9jdW1lbnQoZmluYWwgU3RyaW5nIHB1YmxpY0lkLCBmaW5hbCBTdHJpbmcgcmVzb2x2ZWRVUkksIGZpbmFsIFN0cmluZyB0eXBlLCBib29sZWFuIGFzeW5jKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhYm91dCB0byBidWlsZCBDTURvY3VtZW50KCIgKyBwdWJsaWNJZCArICIsICIgKyB1bnJlc29sdmVkVVJJICsgIiA9ICIgKyByZXNvbHZlZFVSSSArICIpIik7Ci0gICAgaWYgKGFzeW5jKQotICAgIHsgICAgIAotICAgICAgY21Eb2N1bWVudENhY2hlLnNldFN0YXR1cyhyZXNvbHZlZFVSSSwgQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FESU5HKTsKLSAgICAgIC8vVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IEFzeW5jQnVpbGRPcGVyYXRpb24ocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlKSk7Ci0gICAgICAvL3RocmVhZC5zdGFydCgpOwotICAgICAgSm9iIGpvYiA9IG5ldyBKb2IoWE1MQ29yZU1lc3NhZ2VzLmxvYWRpbmcgKyByZXNvbHZlZFVSSSkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IChmYW1pbHkgPT0gQ01Eb2N1bWVudE1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgIH0gICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotICAgIAotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BRElORyk7Ci0gIAotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsgICAgICAgICAKLSAgICBpbnQgeCA9IDE7Ci0gICAgeCsrOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsICYmIHJlc29sdmVkVVJJLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICAvLyBUT0RPLi4uIHBhc3MgdGhlIFRZUEUgdGhydSB0byB0aGUgQ01Eb2N1bWVudEJ1aWxkZXIKLSAgICAgIHJlc3VsdCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KHJlc29sdmVkVVJJLCB0eXBlKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsgCi0gICAgICAvLyBsb2FkIHRoZSBhbm5vdGF0aW9uIGZpbGVzIGZvciB0aGUgZG9jdW1lbnQgCi0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkKLSAgICAgIHsgICAgCi0gICAgICAgIEFubm90YXRpb25VdGlsaXR5LmxvYWRBbm5vdGF0aW9uc0ZvckdyYW1tYXIocHVibGljSWQsIHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgICBjbURvY3VtZW50Q2FjaGUucHV0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSwgcmVzdWx0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZmVyZW5jZXMoKQotICB7Ci0gICAgLy8gVE9ETy4uLiBpbml0aWF0ZSBhIHRpbWVkIHJlbGVhc2Ugb2YgdGhlIGVudHJpZXMgaW4gdGhlIENNRG9jdW1lbnRDYWNoZQotICAgIHB1YmxpY0lkVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyYjhhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50UmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50UmVmZXJlbmNlCi17ICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZDsKLSAgcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJZDsKLQotICBwdWJsaWMgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBwdWJsaWNJZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gc3lzdGVtSWQ7Ci0gIH0gICAgICAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJbIiArIHB1YmxpY0lkICsgIiwgIiArIHN5c3RlbUlkICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTQ2MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlciBleHRlbmRzIENNRG9jdW1lbnRMb2FkZXIKLXsgICAgIAotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgaW5mZXJyZWRDTURvY3VtZW50OwotICBwcm90ZWN0ZWQgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGNyZWF0ZWRDTURvY3VtZW50VGFibGU7Ci0KLSAgcHVibGljIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIoZG9jdW1lbnQsIGNtRG9jdW1lbnRNYW5hZ2VyKTsKLSAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgICAgICAgICAgICAKLSAgICBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5ID0gbmV3IEluZmVycmVkR3JhbW1hckZhY3RvcnkoKTsKLSAgfSAgICAgCi0KLSAgICAgCi0gIHB1YmxpYyB2b2lkIGxvYWRDTURvY3VtZW50cygpCi0gIHsgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLWxvYWRDTURvY3VtZW50cyAtLS0tLS0tLS0tLS0iKTsgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkR3JhbW1hckZhY3RvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgc3VwZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tIGVsYXBzZWQgdGltZSAoIiArIGNvdW50ICsgIikgPSAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotICAgICAgLy9pbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmRlYnVnUHJpbnQoY3JlYXRlZENNRG9jdW1lbnRUYWJsZS52YWx1ZXMoKSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgIHsgICAgIAotICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gImluZmVycmVkLWRvY3VtZW50IjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCgiIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudCgiIiwgIiIsIGNhY2hlS2V5LCAiRFREIiwgaW5mZXJyZWRDTURvY3VtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUucHV0KGNhY2hlS2V5LCBpbmZlcnJlZENNRG9jdW1lbnQpOwotICAgIH0gCi0KLSAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihpbmZlcnJlZENNRG9jdW1lbnQsIGVsZW1lbnQsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAKLSAgICBpZiAocGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KGluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBmYWxzZSwgbnVsbCk7Ci0gICAgfSAgICAgCi0gICAgICAgCi0KLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7ICAgCi0gICAgICAgICAgIAotICAgIC8vIHJlc2V0IHRoZSAnY3VycmVudCcgc3RhdGUgdG8gaW5pdGFsIHZhbHVlcwotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnROUyhFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgcGFyZW50SW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRDTURvY3VtZW50OwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICAgICAgICAKLSAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBudWxsOwotCi0gICAgLy8gYnkgYWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBuYW1lc3BhY2VUYWJsZSwgaGFuZGxlR3JhbW1hcigpIHdpbGwgZ2V0IGNhbGxlZCBmb3IgYW55IHNjaGVtYSByZWZlcmVuY2VzCi0gICAgaWYgKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpICE9IGRvY3VtZW50KQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgU3RyaW5nIHVyaSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeChwcmVmaXgpOwotCi0gICAgaWYgKHVyaSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpID09IGRvY3VtZW50KQotICAgIHsKLSAgICAgIC8vIHdoZW4gdGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbXBsaWVkICJubyBuYW1lc3BhY2Ugc2NoZW1hIGxvY2F0aW9uIgotICAgICAgdXJpID0gIm9tbWl0dGVkLW5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZE5hbWVzcGFjZUluZm8ocHJlZml4LCB1cmksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gIAotCi0gICAgLy8gaGVyZSdzIHdoZXJlIHdlIHVwZGF0ZSB0aGUgaW5mZXJyZWQgZ3JhbW1hciBpZiByZXF1aXJlZAotICAgIC8vIAotICAgIGJvb2xlYW4gY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24gPSB0cnVlOwotICAgICAgICAgIAotICAgIGJvb2xlYW4gaXNMb2NhbCA9ICh1cmkgPT0gbnVsbCAmJiBwcmVmaXggPT0gbnVsbCk7ICAgICAgICAgCi0gICAgaWYgKGlzTG9jYWwpCi0gICAgeyAgICAgICAgICAKLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gdGhpcyBpcyBhIGxvY2FsIGVsZW1lbnQuLi4gYW5kIHRoZSBwYXJlbnQgaXMgbm90IGluZmVycmVkIChlLmcpIGl0IGhhcyBhIGtub3duIGdyYW1tYXIKLSAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICAgIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uID0gZmFsc2U7IAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9ICJvbW1pdHRlZC1uYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgICAgICAgIAotICAgICAgaWYgKGlzTG9jYWwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IHBhcmVudEluZmVycmVkQ01Eb2N1bWVudDsKLSAgICAgICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oaW5mZXJyZWRDTURvY3VtZW50LCBlbGVtZW50LCB0cnVlKTsgICAgICAgCi0gICAgICB9ICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBib29sZWFuIGNyZWF0ZUNNRG9jdW1lbnQgPSBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgY2FjaGVLZXkgPSAiaW5mZXJyZWQtZG9jdW1lbnQiICsgdXJpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljcmVhdGVkQ01Eb2N1bWVudFRhYmxlLmdldChjYWNoZUtleSk7Ci0KLSAgICAgICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhbiBpbmZlcnJlZCBkb2N1bWVudCBmb3IgdGhpcyB1cmkgeWV0Li4uIGxldCdzIHNlZSBvZiB3ZSBuZWVkIG9uZQotICAgICAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50U3RhdHVzKHVyaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEIHx8IHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBkb2VzIG5vdCBjb250YWluIGEgJ3Byb3BlcicgQ01Eb2N1bWVudCBmb3IgdGhpcyB1cmkKLSAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGluZmVycmVkIG9uZQotICAgICAgICAgICAgY3JlYXRlQ01Eb2N1bWVudCA9IHRydWU7Ci0gICAgICAgICAgfSAKLSAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNyZWF0ZUNNRG9jdW1lbnQpCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbmNvdW50ZXJlZCBlbGVtZW50IHsiICsgZWxlbWVudC5nZXROb2RlTmFtZSgpICsgIn0gLi4uIGNyZWF0aW5nIGluZmVycmVkIENNRG9jdW1lbnQgZm9yICIgKyB1cmkpOwotICAgICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpOwotICAgICAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnQodXJpLCAiIiwgY2FjaGVLZXksICJYU0QiLCBpbmZlcnJlZENNRG9jdW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlLnB1dChjYWNoZUtleSwgaW5mZXJyZWRDTURvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZlcnJlZENNRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKGluZmVycmVkQ01Eb2N1bWVudCwgZWxlbWVudCwgZmFsc2UpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KHBhcmVudEluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpc0xvY2FsLCB1cmkpOwotICAgICAgfSAKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgCi0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICAgICAgCi0gICAgLy8gcmVzZXQgdGhlICdjdXJyZW50JyBzdGF0ZSB0byBpbml0YWwgdmFsdWVzCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgaW5mZXJyZWRDTURvY3VtZW50ID0gcGFyZW50SW5mZXJyZWRDTURvY3VtZW50OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTE0ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuQ01WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyCi17Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5SW1wbCBtb2RlbFF1ZXJ5OwotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQWN0aW9uIGltcGxlbWVudHMgTW9kZWxRdWVyeUFjdGlvbgotICB7Ci0gICAgcHVibGljIGludCBraW5kOwotICAgIHB1YmxpYyBpbnQgc3RhcnRJbmRleDsKLSAgICBwdWJsaWMgaW50IGVuZEluZGV4OwotICAgIHB1YmxpYyBOb2RlIHBhcmVudDsKLSAgICBwdWJsaWMgQ01Ob2RlIGNtTm9kZTsKLSAgICBwdWJsaWMgT2JqZWN0IHVzZXJEYXRhOwotCi0gICAgcHVibGljIEFjdGlvbihpbnQga2luZCwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIEFjdGlvbihpbnQga2luZCwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbU5vZGUsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gICAgewotICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgICB0aGlzLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OwotICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0S2luZCgpCi0gICAgewotICAgICAgcmV0dXJuIGtpbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdGFydEluZGV4KCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEVuZEluZGV4KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZW5kSW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0UGFyZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gY21Ob2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoKQotICAgIHsKLSAgICAgIHJldHVybiB1c2VyRGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyRGF0YShPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIHVzZXJEYXRhID0gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKQotICAgIHsKLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKE1vZGVsUXVlcnlJbXBsIG1vZGVsUXVlcnkpCi0gIHsKLSAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5OwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBnZXRBbGxBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICB9Ci0KLQotICAvLyBpbnNlcnQgYWN0aW9ucwotICAvLwotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpICE9IDApCi0gICAgewotICAgICAgZ2V0SW5zZXJ0QXR0cmlidXRlQWN0aW9ucyhwYXJlbnQsIGVkLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgICB9Ci0gICAgaW5jbHVkZU9wdGlvbnMgJj0gfk1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTOwotICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMpICE9IDApCi0gICAgewotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zQXRJbmRleChwYXJlbnQsIGVkLCBpbmRleCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zKHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgZ2V0SW5zZXJ0QXR0cmlidXRlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICAvLyBnZXQgYWN0aW9ucyBmb3IgZWFjaCBpbnNlcnRhYmxlIGF0dHJpYnV0ZQotICAgIC8vCi0gICAgTGlzdCBhdmFpbGFibGVBdHRyaWJ1dGVMaXN0ID0gbW9kZWxRdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KHBhcmVudCwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGF2YWlsYWJsZUF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICBpZiAobW9kZWxRdWVyeS5jYW5JbnNlcnQocGFyZW50LCBlZCwgYWQsIDAsIHZhbGlkaXR5Q2hlY2tpbmcpKQotICAgICAgewotICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBhZCk7Ci0gICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zQXRJbmRleChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBnZXQgYWN0aW9ucyBmb3IgZWFjaCBpbnNlcnRhYmxlIGF0dHJpYnV0ZQotICAgIC8vCi0gICAgaW50IHNpemUgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpOwotICAgIGlmIChpbmRleCA8PSBzaXplKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gbW9kZWxRdWVyeS5nZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50LCBlZCk7IAotICAgICAgTGlzdCBhdmFpbGFibGVDaGlsZE5vZGVMaXN0ID0gbW9kZWxRdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQotICAgICAgYm9vbGVhbiBpc1NpbXBsZUNob2ljZSA9IGlzU2ltcGxlQ2hvaWNlR3JvdXBDb250ZW50TW9kZWwoZWQpOwotICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpaS5uZXh0KCk7ICAgICAgCi0gICAgICAgIGlmIChpc1NpbXBsZUNob2ljZSB8fCBtb2RlbFF1ZXJ5LmNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGluZGV4LCB2YWxpZGl0eUNoZWNraW5nLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgY21Ob2RlLCBpbmRleCwgaW5kZXgpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgIAotIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbXBsZUNob2ljZUdyb3VwQ29udGVudE1vZGVsKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgQ01Ob2RlIGNtTm9kZSA9IGVkLmdldENvbnRlbnQoKTsKLSAgICBpZiAoY21Ob2RlICE9IG51bGwgJiYgY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKQotICAgIHsKLSAgICAgIENNR3JvdXAgY21Hcm91cCA9IChDTUdyb3VwKWNtTm9kZTsKLSAgICAgIGlmIChjbUdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UgJiYgY21Hcm91cC5nZXRNYXhPY2N1cigpID09IC0xKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgQ01Ob2RlTGlzdCBsaXN0ID0gY21Hcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIGludCBzaXplID0gcGFyZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IG1vZGVsUXVlcnkuZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudCwgZWQpOwotICAgIExpc3QgYXZhaWxhYmxlQ2hpbGROb2RlTGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgICBib29sZWFuIGlzU2ltcGxlQ2hvaWNlID0gaXNTaW1wbGVDaG9pY2VHcm91cENvbnRlbnRNb2RlbChlZCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXZhaWxhYmxlQ2hpbGROb2RlTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmb3IgKGludCBpID0gc2l6ZTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIGlmIChpc1NpbXBsZUNob2ljZSB8fCBtb2RlbFF1ZXJ5LmNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGksIHZhbGlkaXR5Q2hlY2tpbmcsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBjbU5vZGUsIGksIGkpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKERvY3VtZW50IHBhcmVudCwgQ01Eb2N1bWVudCBjbURvY3VtZW50LCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIC8vIGdldCB0aGUgcm9vdCBlbGVtZW50IGFuZCBkb2N0eXBlIGluZGV4IChpZiBhbnkpCi0gICAgLy8KLSAgICBpbnQgZG9jdHlwZUluZGV4ID0gLTE7Ci0gICAgRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBudWxsOwotICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICByb290RWxlbWVudCA9IChFbGVtZW50KWNoaWxkTm9kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgZG9jdHlwZSA9IChEb2N1bWVudFR5cGUpY2hpbGROb2RlOwotICAgICAgICBkb2N0eXBlSW5kZXggPSBpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJvb3QgZWxlbWVudHMgYXJlIG9ubHkgYWRkZWQgYWZ0ZXIgdGhlIGRvY3R5cGUgKGlmIGFueSkKLSAgICBpZiAocm9vdEVsZW1lbnQgPT0gbnVsbCAmJiBpbmRleCA+IGRvY3R5cGVJbmRleCkKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgICBpbnQgbWFwTGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IG1hcC5pdGVtKGkpOwotCi0gICAgICAgIGJvb2xlYW4gY2FuQWRkID0gdHJ1ZTsKLSAgICAgICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QpCi0gICAgICAgIHsKLSAgICAgICAgICBjYW5BZGQgPSBkb2N0eXBlID09IG51bGwgfHwgZG9jdHlwZS5nZXROYW1lKCkuZXF1YWxzKGNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYW5BZGQpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBjbU5vZGUsIGluZGV4LCBpbmRleCk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25UYWJsZShFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBIYXNodGFibGUgYWN0aW9uVGFibGUpCi0gIHsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSA9IG1vZGVsUXVlcnkuZ2V0VmFsaWRhdG9yKCkuZ2V0TWF0Y2hNb2RlbChlZCwgcGFyZW50KTsKLSAgICBpZiAobWF0Y2hNb2RlbE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNYXRjaE1vZGVsVmlzaXRvciB2aXNpdG9yID0gbmV3IE1hdGNoTW9kZWxWaXNpdG9yKHBhcmVudCwgYWN0aW9uTGlzdCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0TWF0Y2hNb2RlbE5vZGUobWF0Y2hNb2RlbE5vZGUpOwotICAgIH0gICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IHNlbGVjdGVkQ2hpbGRyZW4sIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIGludFtdIHJhbmdlID0gZ2V0UmFuZ2UocGFyZW50LCBzZWxlY3RlZENoaWxkcmVuKTsKLSAgICBpZiAocmFuZ2UgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGlzQ29udGlndW91cyhwYXJlbnQsIHJhbmdlLCBzZWxlY3RlZENoaWxkcmVuKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCB0ZW1wTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZ2V0UmVwbGFjZUFjdGlvbnMocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIHRlbXBMaXN0KTsKLSAgICAgICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIE1vZGVsUXVlcnkuSU5DTFVERV9FTkNMT1NJTkdfUkVQTEFDRV9BQ1RJT05TKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQWN0aW9uc05vdENvbnRhaW5pbmdSYW5nZSh0ZW1wTGlzdCwgcmFuZ2VbMF0sIHJhbmdlWzFdKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVBY3Rpb25zTm90TWF0Y2hpbmdSYW5nZSh0ZW1wTGlzdCwgcmFuZ2VbMF0sIHJhbmdlWzFdKTsgICAgCi0gICAgICAgIH0KLSAgICAgICAgYWN0aW9uTGlzdC5hZGRBbGwodGVtcExpc3QpOwotICAgICAgfQotICAgIH0gICAKLSAgICAKLSAgICBpZiAoc2VsZWN0ZWRDaGlsZHJlbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlzZWxlY3RlZENoaWxkcmVuLmdldCgwKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSAoRWxlbWVudClub2RlOyAgICAgICAKLSAgICAgICAgQ01Ob2RlIGNoaWxkRWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIGlmIChjaGlsZEVkICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAKLQotICAgICAgICAgIENNTm9kZSBjaGlsZE9yaWdpbj0gbW9kZWxRdWVyeS5nZXRPcmlnaW4oY2hpbGRFbGVtZW50KTsKLQotICAgICAgICAgIENNTm9kZUxpc3QgY21Ob2RlTGlzdCA9IGNoaWxkT3JpZ2luICE9IG51bGwgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5vZGVMaXN0KWNoaWxkT3JpZ2luLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpIDogLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTm9kZUxpc3QpY2hpbGRFZC5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgaWYgKGNtTm9kZUxpc3QgIT0gbnVsbCAmJiBjbU5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHJlcGxhY2VJbmRleCA9IGdldEluZGV4KHBhcmVudCwgY2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgIFN0cmluZyBjaGlsZEVkTmFtZSA9IGNoaWxkRWQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY21Ob2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgICBDTU5vZGUgc3Vic3RpdHV0aW9uID0gY21Ob2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGlvbi5nZXROb2RlTmFtZSgpLmVxdWFscyhjaGlsZEVkTmFtZSkgJiYgIUJvb2xlYW4uVFJVRS5lcXVhbHMoc3Vic3RpdHV0aW9uLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5SRVBMQUNFLCBwYXJlbnQsIGNtTm9kZUxpc3QuaXRlbShpKSwgcmVwbGFjZUluZGV4LCByZXBsYWNlSW5kZXgpOwotICAgICAgICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICB9Ci0gIH0gICAgIAotICAgICAgICAgICAKLSAgCi0gIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0ZWQgbm9kZXMgYXJlIGNvbnRpZ3VvdXMKLSAgLy8gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRpZ3VvdXMoRWxlbWVudCBwYXJlbnQsIGludFtdIHJhbmdlLCBMaXN0IHNlbGVjdGVkTm9kZUxpc3QpCi0gIHsgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCS8vIGlzc3VlOiBub2RlTGlzdExlbmd0aCB3YXMgbmV2ZXIgcmVhZCwgYnV0IGluIHRoZW9yeSwgCi0JLy8gbm9kZWxMaXN0LmdldExlbmd0aCgpIG1pZ2h0IGNhdXNlIHNvbWUgY2xlYXJpbmcgb2YgY2FjaGVkIAotCS8vIGRhdGEsIG9yIHNvbWV0aGluZywgc28gbGVhdmluZyBpbiBhIHBvdGVudGlhbCBtZWFuaW5nbGVzcyBjYWxsLCBmb3Igbm93LgotICAgIC8vaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0Jbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IHJhbmdlWzBdOyBpIDwgcmFuZ2VbMV07IGkrKykKLSAgICB7ICAgICAgIAotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsgICAgCi0gICAgICBpZiAoIWlzV2hpdGVzcGFjZU5vZGUobm9kZSkgJiYgIXNlbGVjdGVkTm9kZUxpc3QuY29udGFpbnMobm9kZSkpCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9ICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotIAotIAotICBwcm90ZWN0ZWQgaW50W10gZ2V0UmFuZ2UoRWxlbWVudCBwYXJlbnQsIExpc3QgbGlzdCkKLSAgewotICAgIGludFtdIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGZpcnN0ID0gLTE7Ci0gICAgaW50IGxhc3QgPSAtMTsgICAgICAgICAgICAgICAgICAgICAKLQotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgeyAgICAgICAKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7ICAgIAotICAgICAgaWYgKGxpc3QuY29udGFpbnMobm9kZSkpCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICBmaXJzdCA9IChmaXJzdCA9PSAtMSkgPyBpIDogTWF0aC5taW4oZmlyc3QsIGkpOyAgICAgICAgCi0gICAgICAgIGxhc3QgPSBNYXRoLm1heChsYXN0LCBpKTsKLSAgICAgIH0gICAgCi0gICAgfQotICAgCi0gICAgaWYgKGZpcnN0ICE9IC0xICYmIGxhc3QhPSAtMSkKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gbmV3IGludFsyXTsKLSAgICAgIHJlc3VsdFswXSA9IGZpcnN0OwotICAgICAgcmVzdWx0WzFdID0gbGFzdDsKLSAgICB9ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzV2hpdGVzcGFjZU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJgotICAgICAgICAgICBub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwOwotICB9IAotCi0KLSAgcHJvdGVjdGVkIGludCBnZXRJbmRleChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGQpCi0gIHsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBpbmRleCA9IC0xOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgaWYgKG5vZGVMaXN0Lml0ZW0oaSkgPT0gY2hpbGQpCi0gICAgICB7Ci0gICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjdGlvbkNvbnRhaW5pbmdSYW5nZShNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGludCBhY3Rpb25TdGFydEluZGV4ID0gYWN0aW9uLmdldFN0YXJ0SW5kZXgoKTsKLSAgICBpbnQgYWN0aW9uRW5kSW5kZXggPSBhY3Rpb24uZ2V0RW5kSW5kZXgoKTsKLQotICAgIHJldHVybiAoYWN0aW9uU3RhcnRJbmRleCA8PSBzdGFydEluZGV4ICYmCi0gICAgICAgICAgICBhY3Rpb25FbmRJbmRleCA+PSBlbmRJbmRleCk7Ci0gIH0gCi0gICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aW9uTWF0Y2hpbmdSYW5nZShNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGludCBhY3Rpb25TdGFydEluZGV4ID0gYWN0aW9uLmdldFN0YXJ0SW5kZXgoKTsKLSAgICBpbnQgYWN0aW9uRW5kSW5kZXggPSBhY3Rpb24uZ2V0RW5kSW5kZXgoKTsKLSAgICByZXR1cm4gKGFjdGlvblN0YXJ0SW5kZXggPT0gc3RhcnRJbmRleCAmJiAgICAgICAgCi0gICAgICAgICAgICBhY3Rpb25FbmRJbmRleCA9PSBlbmRJbmRleCk7Ci0gIH0gCi0gICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFjdGlvbnNOb3RDb250YWluaW5nUmFuZ2UoTGlzdCBhY3Rpb25MaXN0LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgZm9yIChpbnQgaSA9IGFjdGlvbkxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbilhY3Rpb25MaXN0LmdldChpKTsKLSAgICAgIGlmICghaXNBY3Rpb25Db250YWluaW5nUmFuZ2UoYWN0aW9uLCBzdGFydEluZGV4LCBlbmRJbmRleCkpCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbkxpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWN0aW9uc05vdE1hdGNoaW5nUmFuZ2UoTGlzdCBhY3Rpb25MaXN0LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgZm9yIChpbnQgaSA9IGFjdGlvbkxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbilhY3Rpb25MaXN0LmdldChpKTsKLSAgICAgIGlmICghaXNBY3Rpb25NYXRjaGluZ1JhbmdlKGFjdGlvbiwgc3RhcnRJbmRleCwgZW5kSW5kZXgpKQotICAgICAgewotICAgICAgICBhY3Rpb25MaXN0LnJlbW92ZShpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWF0Y2hNb2RlbFZpc2l0b3IKLSAgewotICAgIGludCBpbmRlbnQ7Ci0gICAgaW50IGVsZW1lbnRJbmRleDsKLSAgICBOb2RlIHBhcmVudDsKLSAgICBMaXN0IGFjdGlvbkxpc3Q7Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbFZpc2l0b3IoTm9kZSBwYXJlbnQsIExpc3QgYWN0aW9uTGlzdCkKLSAgICB7Ci0gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgIHRoaXMuYWN0aW9uTGlzdCA9IGFjdGlvbkxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbmRleE9mTmV4dEVsZW1lbnQoaW50IHN0YXJ0KQotICAgIHsKLSAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgIGludCByZXN1bHQgPSBsZW5ndGg7Ci0gICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNYXRjaE1vZGVsTm9kZShDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSkKLSAgICB7Ci0gICAgICBpbnQgc3RhcnRJbmRleCA9IGluZGV4T2ZOZXh0RWxlbWVudChlbGVtZW50SW5kZXgpOwotCi0gICAgICAvL1N0cmluZyBjbU5vZGVOYW1lID0gbWF0Y2hNb2RlbE5vZGUuY21Ob2RlICE9IG51bGwgPyBtYXRjaE1vZGVsTm9kZS5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsKLSAgICAgIC8vcHJpbnRJbmRlbnRlZChpbmRlbnQsICIrTWF0Y2hNb2RlbE5vZGUgOiAiICsgY21Ob2RlTmFtZSArICAiICIgKyBzdGFydEluZGV4KTsKLQotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWF0Y2hNb2RlbE5vZGUuY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIGNoaWxkID0gKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRNYXRjaE1vZGVsTm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQgLT0gMjsKLQotICAgICAgaWYgKG1hdGNoTW9kZWxOb2RlLmNtTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgbm9kZVR5cGUgPSBtYXRjaE1vZGVsTm9kZS5jbU5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgICAgaWYgKG5vZGVUeXBlID09IENNTm9kZS5HUk9VUCkKLSAgICAgICAgewotICAgICAgICAgIENNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cCltYXRjaE1vZGVsTm9kZS5jbU5vZGU7Ci0gICAgICAgICAgaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRkUmVwbGFjZUFjdGlvbnMobWF0Y2hNb2RlbE5vZGUsIGdyb3VwLCBzdGFydEluZGV4LCBlbGVtZW50SW5kZXggLSAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobm9kZVR5cGUgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50SW5kZXggPSBzdGFydEluZGV4ICsgMTsKLSAgICAgICAgfQotICAgICAgICAvL3ByaW50SW5kZW50ZWQoaW5kZW50LCAiLU1hdGNoTW9kZWxOb2RlIDogIiArIGNtTm9kZU5hbWUgKyAgIiAiICsgKGVsZW1lbnRJbmRleCAtIDEpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXBsYWNlQWN0aW9ucyhDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSwgQ01Hcm91cCBncm91cCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgICB7Ci0gICAgICBDTU5vZGUgZXhjbHVkZUNNTm9kZSA9IG51bGw7Ci0gICAgICBpZiAobWF0Y2hNb2RlbE5vZGUuY2hpbGRyZW4uc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgY2hpbGQgPSAoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUpbWF0Y2hNb2RlbE5vZGUuY2hpbGRyZW4uZ2V0KDApOwotICAgICAgICBleGNsdWRlQ01Ob2RlID0gY2hpbGQuY21Ob2RlOwotICAgICAgfQotCi0gICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBDTU5vZGUgYWx0ZXJuYXRpdmUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoYWx0ZXJuYXRpdmUgIT0gZXhjbHVkZUNNTm9kZSkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uUkVQTEFDRSwgcGFyZW50LCBhbHRlcm5hdGl2ZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvL3B1YmxpYyBzdGF0aWMgdm9pZCBwcmludEluZGVudGVkKGludCBpbmRlbnQsIFN0cmluZyBzdHJpbmcpCi0gIC8vewotICAvLyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgLy8gIHsKLSAgLy8gICAgU3lzdGVtLm91dC5wcmludCgiICIpOwotICAvLyAgfQotICAvLyAgU3lzdGVtLm91dC5wcmludGxuKHN0cmluZyk7Ci0gIC8vfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhMDMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNRGF0YVR5cGVWYWx1ZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsYXJnZSBwb3J0aW9uIG9mIHRoZSBNb2RlbFF1ZXJ5IGludGVyZmFjZXMuCi0gKiBTb21lIHdvcmsgaXMgZGVsZWdhdGVkIHRvIHRoZSBET01IZWxwZXIsIENNRG9jdW1lbnRNYW5hZ2VyLCBhbmQgRE9NVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Ci17Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgbW9kZWxRdWVyeUFjdGlvbkhlbHBlcjsKLSAgcHJvdGVjdGVkIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7ICAgCi0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwgZXh0ZW5zaW9uTWFuYWdlcjsgICAKLSAgcHJvdGVjdGVkIENNRGF0YVR5cGVWYWx1ZUhlbHBlciB2YWx1ZUhlbHBlcjsKLSAgcHJvdGVjdGVkIGludCBlZGl0TW9kZSA9IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlJbXBsKE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5tb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciA9IG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgPSBjcmVhdGVNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKCk7Ci0gICAgdmFsaWRhdG9yID0gbmV3IERPTVZhbGlkYXRvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBleHRlbnNpb25NYW5hZ2VyID0gbmV3IE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCgpOwotICAgIHZhbHVlSGVscGVyID0gbmV3IENNRGF0YVR5cGVWYWx1ZUhlbHBlcigpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKQotICB7Ci0gICAgcmV0dXJuIGVkaXRNb2RlOwotICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpCi0gIHsKLSAgICB0aGlzLmVkaXRNb2RlID1lZGl0TW9kZTsKLSAgfQotCi0KLSAgLy8gZmFjdG9yeSBtZXRob2RzCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyIGNyZWF0ZU1vZGVsUXVlcnlBY3Rpb25IZWxwZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKHRoaXMpOwotICB9IAotCi0gIHB1YmxpYyBET01WYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01Ob2RlKG5vZGUpOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01EYXRhVHlwZSh0ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gIH0KLQotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICB9Ci0gICAKLSAgcHVibGljIENNRG9jdW1lbnRNYW5hZ2VyIGdldENNRG9jdW1lbnRNYW5hZ2VyKCkKLSAgewotICAgIENNRG9jdW1lbnRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgCi0KLSAgLyoqCi0gICAqIEBkZXByZWN0ZWQgLSB1c2UgMyBhcmcgdmVyc2lvbiBiZWxvdwotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudExpc3QoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRMaXN0KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAKLSAgICAgIC8vIHRvZG8uLi4gcmV2aXN0Li4uIGhhbmRsZSBlYWNoICMjdGhpbmcgZXhwbGljaXRseQotICAgICAgLy8gICAgICAgICAgCi0gICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHVyaSA9ICIjI2FueSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gICAgICAgICAgICAgICAKLQotICAgICAgaWYgKHVyaS5lcXVhbHMoIiMjdGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQuYWRkKGNtRG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh1cmkuZXF1YWxzKCIjI2FueSIpIHx8IHVyaS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgZXhjbHVkZWRVUkkgPSBudWxsOwotICAgICAgICBpZiAodXJpLmVxdWFscygiIyNvdGhlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCllZC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZXhjbHVkZWRVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGNvbnNpZGVyIGFsbCBvZiB0aGUgc2NoZW1hIHJlbGF0ZWQgdG8gdGhpcyBkb2N1bWVudAotICAgICAgICAvLwotICAgICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOwotICAgICAgICAgIGlmIChpbmZvLnVyaSAhPSBudWxsICYmICFpbmZvLnVyaS5lcXVhbHMoZXhjbHVkZWRVUkkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoaW5mby51cmksIGluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQuYWRkKGRvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgIAotICAgICAgICBDTURvY3VtZW50IGRvY3VtZW50ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGVsZW1lbnQsIHVyaSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFkZChkb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0KLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoZWxlbWVudCwgdXJpKTsKLSAgICB9Ci0gICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG4oIk1vZGVsUXVlcnlJbXBsLmdldENNRG9jdW1lbnQoIiArIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSArICIsICIgKyB1cmkgKyAiKSA9ICIgKyByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIHJldHVybiBpc0NvbnRlbnRWYWxpZChlZCwgZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgIAotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsgCi0gICAgICAvLyBmaXJzdCBjaGVjayB0byBzZWUgaWYgYWxsIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50Ci0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKW1hcC5pdGVtKGkpOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhZCwgZWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIGlmIChhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBub3cgY2hlY2sgdG8gc2VlIG9mIHRoZSBjaGlsZHJlbiB2YWxpZGF0ZSBwcm9wZXJseQotICAgICAgLy8KLSAgICAgIGlmIChyZXN1bHQpIAotICAgICAgewotICAgICAgICBDTU5vZGVbXSBvcmlnaW5BcnJheSA9IGdldE9yaWdpbkFycmF5KGVsZW1lbnQpOwotICAgICAgICByZXN1bHQgPSBvcmlnaW5BcnJheSAhPSBudWxsICYmIG9yaWdpbkFycmF5Lmxlbmd0aCA9PSBlbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNTm9kZSBnZXRPcmlnaW4oTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgLy8gdG9kby4uLiBtYWtlIHN1cmUgcGFyZW50IGlzIHJpZ2h0Ci0gICAgLy8KLSAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXRQYXJlbnRPck93bmVyTm9kZShub2RlKTsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOwotICAgICAgQ01Ob2RlW10gYXJyYXkgPSBnZXRPcmlnaW5BcnJheShwYXJlbnRFbGVtZW50KTsKLSAgICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgbm9kZSk7Ci0gICAgICAgIGlmIChpbmRleCA8IGFycmF5Lmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGFycmF5W2luZGV4XTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgcmV0dXJuIChlZCAhPSBudWxsKSA/IGdldFZhbGlkYXRvcigpLmdldE9yaWdpbkFycmF5KGVkLCBlbGVtZW50KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEluZGV4T2ZOb2RlKE5vZGVMaXN0IG5vZGVMaXN0LCBOb2RlIG5vZGUpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgaWYgKG5vZGVMaXN0Lml0ZW0oaSkgPT0gbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIENNTm9kZSAnbWV0YSBkYXRhJyB0aGF0IG1heSBiZSBwb3RlbnRpYWxseSBhZGRlZCB0byB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKQotICB7Ci0gICAgQXZhaWxhYmxlQ29udGVudENNVmlzaXRvciB2aXNpdG9yID0gbmV3IEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoZWxlbWVudCwgZWQpOwotICAgIExpc3QgbGlzdCA9IHZpc2l0b3IuY29tcHV0ZUF2YWlsYWJsZUNvbnRlbnQoaW5jbHVkZU9wdGlvbnMpOwotICAgIGlmIChleHRlbnNpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBleHRlbnNpb25NYW5hZ2VyLmZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGxpc3QsIGVsZW1lbnQsIGVkKTsKLSAgICB9ICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfSAgCi0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIENNTm9kZSBjbU5vZGUsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGluZGV4LCB2YWxpZGl0eUNoZWNraW5nKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIHJldHVybiBjYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpbmRleCwgdmFsaWRpdHlDaGVja2luZywgbnVsbCk7Ci0gIH0gICAgICAgICAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nLCBPYmplY3QgcmV1c2VhYmxlRGF0YSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBzd2l0Y2ggKGNtTm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtTm9kZSwgcGFyZW50LCBudWxsKTsKLSAgICAgICAgcmVzdWx0ID0gcGFyZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlTmFtZSkgPT0gbnVsbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgIHsKLSAgICAgICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIGNyZWF0ZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IG51bGw7Ci0gICAgICAgICAgaWYgKHJldXNlYWJsZURhdGEgIT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gKExpc3QpcmV1c2VhYmxlRGF0YTsKLSAgICAgICAgICB9ICAgIAotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudCwgZWQpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5jYW5JbnNlcnQoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW5kZXgsIGNtTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENNTm9kZS5EQVRBX1RZUEUgOgotICAgICAgewotICAgICAgICBpbnQgY29udGVudFR5cGUgPSBlZC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICByZXN1bHQgPSAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSB8fAotICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBMaXN0IGNtTm9kZUxpc3QsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICAvLyB0b2RvCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShOb2RlIG5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgICAgIAotICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICB7Ci0gICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQXR0cilub2RlKTsKLSAgICAgICAgICBpZiAoYWQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgIGlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50Tm9kZTsKLSAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50RWxlbWVudCwgZWQpOwotICAgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgbm9kZSk7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmNhblJlbW92ZShlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShMaXN0IG5vZGVMaXN0LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBudWxsOwotICAgICAgTGlzdCBjaGlsZExpc3QgPSBudWxsOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLQotICAgICAgICBpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50RWxlbWVudCA9IGdldFBhcmVudE9yT3duZXJFbGVtZW50KG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgIT0gZ2V0UGFyZW50T3JPd25lckVsZW1lbnQobm9kZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmVudCBhcmUgdGhlIHNhbWUKLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgICBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghY2FuUmVtb3ZlKG5vZGUsIHZhbGlkaXR5Q2hlY2tpbmcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGlsZExpc3QgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZExpc3QgPSBub2RlTGlzdFRvTGlzdChwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoaWxkTGlzdC5yZW1vdmUobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHJlc3VsdCAmJiBjaGlsZExpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNoaWxkTGlzdCwgZWQpOwotICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmlzVmFsaWQoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShFbGVtZW50IHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgQ01Ob2RlIGNtTm9kZSwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3QgY21Ob2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSAgICAgCi0gICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbC4uLiB1c2UgYXQgeW91ciBvd24gcmlzawotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuV3JhcChFbGVtZW50IGNoaWxkRWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gd3JhcEVsZW1lbnQsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgCi0gICAgTm9kZSBwYXJlbnROb2RlID0gY2hpbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KXBhcmVudE5vZGU7ICAgICAgCi0gICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotICAgICAgaWYgKHBhcmVudEVkICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXhPZk5vZGUocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCksIGNoaWxkRWxlbWVudCk7Ci0KLSAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnRFbGVtZW50LCBwYXJlbnRFZCk7Ci0gICAgICAgICAgTGlzdCBzdWJMaXN0ID0gY29udGVudFNwZWNpZmljYXRpb25MaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgMSk7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuY2FuUmVwbGFjZShwYXJlbnRFZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbmRleCwgaW5kZXgsIHdyYXBFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmlzVmFsaWQod3JhcEVsZW1lbnQsIHN1Ykxpc3QpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgZWQsIGluZGV4LCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKERvY3VtZW50IHBhcmVudCwgQ01Eb2N1bWVudCBjbURvY3VtZW50LCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIGNtRG9jdW1lbnQsIGluZGV4LCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0UmVwbGFjZUFjdGlvbnMocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9ICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IHNlbGVjdGVkQ2hpbGRyZW4sIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0UmVwbGFjZUFjdGlvbnMocGFyZW50LCBlZCwgc2VsZWN0ZWRDaGlsZHJlbiwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uVGFibGUoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgSGFzaHRhYmxlIGFjdGlvblRhYmxlKQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25UYWJsZShwYXJlbnQsIGVkLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25UYWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRBY3Rpb25UYWJsZShFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIEhhc2h0YWJsZSBhY3Rpb25UYWJsZSkKLSAgewotICAgIC8vbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRBbGxBY3Rpb25zKHBhcmVudCwgZWQsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLQotICAvLyBzb21lIGhlbHBlciBtZXRob2RzCi0gIC8vCi0gIHByb3RlY3RlZCBOb2RlIGdldFBhcmVudE9yT3duZXJOb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpID8KLSAgICAgICAgICAgKChBdHRyKW5vZGUpLmdldE93bmVyRWxlbWVudCgpIDoKLSAgICAgICAgICAgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRQYXJlbnRPck93bmVyRWxlbWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIHBhcmVudCA9IGdldFBhcmVudE9yT3duZXJOb2RlKG5vZGUpOwotICAgIHJldHVybiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpID8gKEVsZW1lbnQpcGFyZW50IDogbnVsbDsKLSAgfQotICAgICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIExpc3Qgbm9kZUxpc3RUb0xpc3QoTm9kZUxpc3Qgbm9kZUxpc3QpCi0gIHsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcihzaXplKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChub2RlTGlzdC5pdGVtKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0gICAKLSAgIAotICAvKioKLSAgcHJvdGVjdGVkIExpc3QgZ2V0Q01Ob2RlTGlzdChOb2RlTGlzdCBub2RlTGlzdCkKLSAgewotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKHNpemUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKGdldENNTm9kZShub2RlTGlzdC5pdGVtKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLSAgKi8gIAotCi0gIHB1YmxpYyBjbGFzcyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yIGV4dGVuZHMgQ01WaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgSGFzaHRhYmxlIGNoaWxkTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHB1YmxpYyBIYXNodGFibGUgYXR0cmlidXRlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHVibGljIEVsZW1lbnQgcm9vdEVsZW1lbnQ7Ci0gICAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb247IAotICAgIHB1YmxpYyBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZVNlcXVlbmNlR3JvdXBzOwotCi0gICAgcHVibGljIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoRWxlbWVudCByb290RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50OwotICAgICAgdGhpcy5yb290RWxlbWVudERlY2xhcmF0aW9uID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIFN0cmluZyBrZXkgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIGtleSA9ICJbIiArIG5hbWVzcGFjZVVSSSArICJdIiArIGtleTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvVGFibGUoSGFzaHRhYmxlIHRhYmxlLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIFN0cmluZyBub2RlTmFtZSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lICE9IG51bGwgJiYgbm9kZU5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgeyAgCi0gICAgICAgIHRhYmxlLnB1dChnZXRLZXkoY21Ob2RlKSwgY21Ob2RlKTsKLSAgICAgIH0gIAotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGNvbXB1dGVBdmFpbGFibGVDb250ZW50KGludCBpbmNsdWRlT3B0aW9ucykKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7ICAKLQotICAgICAgaW50IGNvbnRlbnRUeXBlID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpOwotICAgICAgaW5jbHVkZVNlcXVlbmNlR3JvdXBzID0gKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTKSAhPSAwKTsKLSAgICAgIHZpc2l0Q01Ob2RlKHJvb3RFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgCi0gICAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9BVFRSSUJVVEVTKSAhPSAwKQotICAgICAgewotICAgICAgICB2LmFkZEFsbChhdHRyaWJ1dGVUYWJsZS52YWx1ZXMoKSk7Ci0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gbmlsbGFibGVBdHRyaWJ1dGUgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilyb290RWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmlsbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmlsbGFibGVBdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHYuYWRkKG5pbGxhYmxlQXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0KLSAgICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSAhPSAwKQotICAgICAgeyAgICAgIAotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICB2LmFkZEFsbChjaGlsZE5vZGVUYWJsZS52YWx1ZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gIChDTURvY3VtZW50KXJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2LmFkZChpLm5leHQoKSk7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgCi0gICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpCi0gICAgICAgIHsKLSAgICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXREYXRhVHlwZSgpOwotICAgICAgICAgIGlmIChkYXRhVHlwZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHYuYWRkKGRhdGFUeXBlKTsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB2OwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICAgIHsgICAgICAgICAgICAKLSAgICAgIFN0cmluZyB1cmkgPSBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBnZXRDTURvY3VtZW50TGlzdChyb290RWxlbWVudCwgcm9vdEVsZW1lbnREZWNsYXJhdGlvbiwgdXJpKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTURvY3VtZW50IGNtZG9jdW1lbnQgPSAoQ01Eb2N1bWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChjbWRvY3VtZW50ICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIENNTm9kZSBlZCA9IG1hcC5pdGVtKGkpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGFkKTsKLSAgICAgIGF0dHJpYnV0ZVRhYmxlLnB1dChhZC5nZXROb2RlTmFtZSgpLCBhZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBpZiAoZWQgPT0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbiAmJiAhaXNSb290VmlzaXRlZCkKLSAgICAgIHsKLSAgICAgICAgaXNSb290VmlzaXRlZCA9IHRydWU7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwID0gKENNTm9kZUxpc3QpZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3Vic3RpdHV0aW9uR3JvdXAoQ01Ob2RlTGlzdCBzdWJzdGl0dXRpb25Hcm91cCkKLSAgICB7Ci0gICAgICBpbnQgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPSBzdWJzdGl0dXRpb25Hcm91cC5nZXRMZW5ndGgoKTsKLSAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA+IDEpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZSBlZCA9IHN1YnN0aXR1dGlvbkdyb3VwLml0ZW0oaSk7Ci0gICAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZFRvVGFibGUoY2hpbGROb2RlVGFibGUsZWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsKLSAgICAgIGlmIChpbmNsdWRlU2VxdWVuY2VHcm91cHMpCi0gICAgICB7Ci0gICAgICAgIGlmIChncm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuU0VRVUVOQ0UgJiYKLSAgICAgICAgICAgIGdyb3VwLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA+IDEgJiYKLSAgICAgICAgICAgIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KGdyb3VwKSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBjaGlsZE5vZGVUYWJsZS5wdXQoZ3JvdXAsIGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgICBzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotICAgIH0gICAKLQotICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KENNR3JvdXAgZ3JvdXApCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGdyb3VwKTsKLSAgICAgIHJldHVybiBsaXN0LnNpemUoKSA+IDE7Ci0gICAgfQotICB9ICAgIAotCi0gCi0gIC8qKgotICAgKiBAZGVwcmVjdGVkIC0gdXNlIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGNtTm9kZSkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2RzIHJldHVybiBhbiBhcnJheSBvZiBwb3NzaWJsZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YXR5cGUgb2YgdGhlIENNTm9kZSAoZWl0aGVyIGFuIENNQXR0cmlidXRlRGVjbGFyYXRpb24gb3IgYSBDTUVsZW1lbnREZWNsYXJhdGlvbikKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGNtTm9kZSAhPSBudWxsKQotICAgIHsgICAgICAgCi0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gbnVsbDsKLSAgICAgIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotICAgICAgewotICAgICAgICBkYXRhVHlwZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiljbU5vZGUpLmdldEF0dHJUeXBlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgIHsKLSAgICAgICAgZGF0YVR5cGUgPSAoKENNRWxlbWVudERlY2xhcmF0aW9uKWNtTm9kZSkuZ2V0RGF0YVR5cGUoKTsKLSAgICAgIH0gICAgICAgICAKLSAgICAgCi0gICAgICBTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzID0gZGF0YVR5cGUgIT0gbnVsbCA/IGRhdGFUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSA6IG51bGw7ICAgICAgCi0gICAgICBpZiAoZW51bWVyYXRlZFZhbHVlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1lcmF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChlbnVtZXJhdGVkVmFsdWVzW2ldKTsKLSAgICAgICAgfSAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYWRkVmFsdWVzRm9yWFNJVHlwZShlbGVtZW50LCBjbU5vZGUsIGxpc3QpOwotICAgIAotICAgIGlmIChleHRlbnNpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBsaXN0LmFkZEFsbChleHRlbnNpb25NYW5hZ2VyLmdldERhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGNtTm9kZSkpOwotICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgbGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3RTaXplXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspCi0gICAgewotICAgICAgcmVzdWx0W2ldID0gKFN0cmluZylsaXN0LmdldChpKTsKLSAgICB9ICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZXNGb3JYU0lUeXBlKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSwgTGlzdCBsaXN0KQotICB7ICAgICAgICAgICAgICAgCi0gICAgaWYgKGNtTm9kZSAhPSBudWxsICYmIGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pY21Ob2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHZhbHVlSGVscGVyLmlzWFNJVHlwZShhZCkpCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICBOYW1lc3BhY2VUYWJsZSB0YWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIHRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgICBsaXN0LmFkZEFsbCh2YWx1ZUhlbHBlci5nZXRRdWFsaWZpZWRYU0lUeXBlcyhhZCwgdGFibGUpKTsgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlciBnZXRFeHRlbnNpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBleHRlbnNpb25NYW5hZ2VyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1NpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlMmE3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlDTVByb3ZpZGVyIG1vZGVsUXVlcnlDTVByb3ZpZGVyOwotICAgICAgICAgIAotICBwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcihNb2RlbFF1ZXJ5Q01Qcm92aWRlciBtb2RlbFF1ZXJ5Q01Qcm92aWRlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLm1vZGVsUXVlcnlDTVByb3ZpZGVyID0gbW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUNNUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGVsZW1lbnQpOwotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgeyAgICAgICAgCi0gICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9YTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzgyZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcgoteyAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlOyAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRNYW5hZ2VySW1wbCBkb2N1bWVudE1hbmFnZXI7Ci0KLSAgcHVibGljIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSkKLSAgewotICAgIHRoaXMuY21Eb2N1bWVudENhY2hlID0gY21Eb2N1bWVudENhY2hlOyAKLSAgICBkb2N1bWVudE1hbmFnZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJJbXBsKGNtRG9jdW1lbnRDYWNoZSwgdGhpcyk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ01Eb2N1bWVudE1hbmFnZXIgZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50TWFuYWdlcjsKLSAgfQotIAotICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RG9jdHlwZUluZm8oRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIERvY3VtZW50VHlwZSBkb2N0eXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCi0gICAgLy8gZGVmZWN0IDIwNjgzMyAuLi4gaGVyZSB3ZSB0ZXN0IGZvciBEVERzIHRoYXQgYXJlIGRlY2xhcmVkIGlubGluZQotICAgIC8vIHNpbmNlIHdlIGN1cnJlbnRseSBoYXZlIG5vIHdheSBvZiBtYWtpbmcgdXNlIG9mIGlubGluZSBEVERzIHdlIGluZ29yZSB0aGVtCi0gICAgLy8gc28gdGhhdCB0aGUgaW1wbGljdCBEVEQgKGlmIGFueSkgY2FuIGJlIHVzZWQKLSAgICBpZiAoZG9jdHlwZSAhPSBudWxsICYmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCB8fCBkb2N0eXBlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHJlc3VsdFswXSA9IGRvY3R5cGUuZ2V0UHVibGljSWQoKTsKLSAgICAgIHJlc3VsdFsxXSA9IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKTsKLSAgICB9ICAgCi0gICAgZWxzZSBpZiAoZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpOwotICAgIH0gICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0KLQotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGdldEltcGxpY3REb2N0eXBlKERvY3VtZW50IGRvY3VtZW50KQotICB7IAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgLyoKLSAgICBET01FeHRlbnNpb24gZG9tRXh0ZW5zaW9uID0gRE9NRXh0ZW5zaW9uUHJvdmlkZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERPTUV4dGVuc2lvbihkb2N1bWVudCk7Ci0gICAgaWYgKGRvbUV4dGVuc2lvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRvbUV4dGVuc2lvbi5nZXRJbXBsaWNpdERvY3R5cGUoKTsKLSAgICB9Ki8KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSwgdHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUsIGJvb2xlYW4gZ2V0RG9jdW1lbnRGcm9tQ01Ob2RlKQotICB7ICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudClub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAKLSAgICAgIFN0cmluZ1tdIGRvY3R5cGVJbmZvID0gZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotCi0gICAgICBpZiAoZG9jdHlwZUluZm8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudChkb2N0eXBlSW5mb1swXSwgZG9jdHlwZUluZm9bMV0sICJEVEQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gZGVmZWN0IDIxMTIzNiAuLi4gaW4gc29tZSBjYXNlcyBjYWxsaW5nIHRoaXMgbWV0aG9kIGNhbiByZXN1bHQgaW4gYSBjeWNsZQotICAgICAgLy8gd2UgdXNlIHRoZSBnZXREb2N1bWVudEZyb21DTU5vZGUgYXMgYSBmbGFnIHRvIGF2b2lkIHRoaXMgCi0gICAgICAvLyBUT0RPLi4uIHNlZSBpZiB0aGVyZSBpcyBhIHdheSB0byByZS1vcmdhbml6ZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgdGhpcyBmbGFnCi0gICAgICBlbHNlIGlmIChnZXREb2N1bWVudEZyb21DTU5vZGUpCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSBnZXRDTU5vZGUobm9kZSk7Ci0gICAgICAgIGlmIChjbU5vZGUgIT0gbnVsbCkgICAgICAgCi0gICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gdG9kby4uLiBhZGQgYSBnZXRDTURvY3VtZW50KCkgbWV0aG9kcyB0byBDTU5vZGUKLSAgICAgICAgICAvLyBmb3Igbm93IHVzZSB0aGUgZ2V0UHJvcGVydHkgaW50ZXJmYWNlCi0gICAgICAgICAgcmVzdWx0ID0gKENNRG9jdW1lbnQpY21Ob2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGxvY2F0aW5nIENNRG9jdW1lbnQgZm9yICIgKyBub2RlLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gICAgICAKLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpCi0gIHsKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgIE5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IG5hbWVzcGFjZVRhYmxlLmdldE5hbWVzcGFjZUluZm9Gb3JVUkkodXJpKTsKLSAgICBpZiAobmFtZXNwYWNlSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldENNRG9jdW1lbnQobmFtZXNwYWNlSW5mby51cmksIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgIAotICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIC8vU3RyaW5nIHJlc29sdmVkR3JhbW1hclVSSSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIHJldHVybiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgc3lzdGVtSWQsIHR5cGUpOyAgCi0gIH0KLQotICAvL3B1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAvL3sgICAgICAgICAgICAgICAgICAgCi0gIC8vICAvL1N0cmluZyByZXNvbHZlZEdyYW1tYXJVUkkgPSByZXNvbHZlR3JhbW1hclVSSShkb2N1bWVudCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgLy8gIHJldHVybiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgc3lzdGVtSWQpOyAgCi0gIC8vfQotICAgCi0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZUdyYW1tYXJVUkkobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCBpbiBvcmRlciB0byBpbXBsZW1lbnQgc3BlY2lhbGl6ZWQgdXJpIHJlc29sdXRpb24KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgcmV0dXJuIHN5c3RlbUlkOwotICB9Ci0gIAotCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IGdldERvY3R5cGVJbmZvKGRvY3VtZW50KTsKLSAgICBpZiAoZG9jdHlwZUluZm8gIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICAvLyB3ZSBoYXZlIGRldGVjdGVkIGRvY3R5cGUgaW5mb3JtYXRpb24gc28gd2UgYXNzdW1lIHRoYXQgd2UgY2FuIGxvY2F0ZSB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gCi0gICAgICAvLyBpbiB0aGUgQ01Eb2N1bWVudCdzIHRhYmxlIG9mIGdsb2JhbCBlbGVtZW50cyAKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGVsZW1lbnQsIGZhbHNlKTsKLQotICAgICAgLy8gVE9ETy4uLiBjb25zaWRlciByZXBsYWNpbmcgYWJvdmUgd2l0aCAKLSAgICAgIC8vIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoZG9jdW1lbnQsIGRvY3R5cGVJbmZvWzBdLCBkb2N0eXBlSW5mb1sxXSk7Ci0KLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudC5nZXROb2RlTmFtZSgpKTsgICAgCi0gICAgICAgICAgICAgICAgIAotICAgICAgICAvLyB0aGlzIGlzIGEgaGFjayB0byBnZXQgb3VyIHhzbCBjb2RlIGFzc2lzdCB3b3JraW5nLi4uIHdlIG1pZ2h0IHdhbnQgdG8gaGFuZGxlIHNpbWlsYXIKLSAgICAgICAgLy8gZ3JhbW1hciBiZWhhdmlvdXIgdmlhIHNvbWUgZXN0YWJsaXNoZWQgbW9kZWwgcXVlcnkgc2V0dGluZyAKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpcGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7ICAKLSAgICAgIC8vIGhlcmUgd2UgdXNlIGEgbmFtZXNwYWNlVGFibGUgdG8gY29uc2lkZXIgaWYgdGhlIHJvb3QgZWxlbWVudCBoYXMgYW55IG5hbWVzcGFjZSBpbmZvcm1hdGlvbgotICAgICAgLy8KLSAgICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgIExpc3QgbGlzdCA9IE5hbWVzcGFjZVRhYmxlLmdldEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IChFbGVtZW50KWxpc3QuZ2V0KDApOwotICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChyb290RWxlbWVudCk7Ci0gICAgICAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VUYWJsZS5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBYTUxTY2hlbWEgc3R5bGUgbmFtZXNwYWNlIGF3YXJlIGRvY3VtZW50Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQsIGxpc3QsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgCi0gICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IHRoaXMgaXMgYW4gaW5mZXJyZWQgQ01Eb2N1bWVudCBmb3IgYSBEVEQgc3R5bGUgJ25hbWVzcGFjZWxlc3MnIGRvY3VtZW50Ci0gICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoIiIsICIiLCAiRFREIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAgICAgCi0KLSAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgTGlzdCBsaXN0LCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgeyAgICAgICAgIAotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGN1cnJlbnRFRCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgeyAgICAKLSAgICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClsaXN0LmdldChpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKG5vZGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgobm9kZU5hbWUpOwotIAotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0gCi0gICAgICAgIC8vIHNlZSBpZiB0aGUgZWxlbWVudCBpcyBhIGxvY2FsIG9mIHRoZSBjdXJyZW50RUQKLSAgICAgICAgLy8gICAgICAgICAgICAgCi0gICAgICAgIGlmIChjdXJyZW50RUQgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY3VycmVudEVELmdldExvY2FsRWxlbWVudHMoKS5nZXROYW1lZEl0ZW0odW5wcmVmaXhlZE5hbWUpOwotICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZWQgPT0gbnVsbCkgCi0gICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvRm9yUHJlZml4KHByZWZpeCk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChuYW1lc3BhY2VJbmZvICE9IG51bGwpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQobmFtZXNwYWNlSW5mby51cmksIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKHVucHJlZml4ZWROYW1lKTsgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGN1cnJlbnRFRCA9IGVkOyAgICAgCi0KLSAgICAgICAgLy8gaGFuZGxlIFhTSVR5cGUgICAgIAotICAgICAgICBpZiAoY3VycmVudEVEICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZXJpdmVkRUQgPSBnZXREZXJpdmVkQ01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCwgY3VycmVudEVELCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgICAgaWYgKGRlcml2ZWRFRCAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGN1cnJlbnRFRCA9IGRlcml2ZWRFRDsKLSAgICAgICAgICB9ICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7IAotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGxvY2F0aW5nIGVsZW1lbnQgZGVjbGFyYXRpb24gZm9yICIgKyB0YXJnZXRFbGVtZW50LCBlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gCi0gIAotICAgIHJldHVybiBjdXJyZW50RUQ7Ci0gIH0gIAotICAgICAgCi0KLSAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIFN0cmluZyB4c2lQcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoeHNpUHJlZml4ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHhzaVR5cGVWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHhzaVByZWZpeCArICI6dHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoeHNpVHlwZVZhbHVlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KHhzaVR5cGVWYWx1ZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZSh4c2lUeXBlVmFsdWUpOwotICAgICAgICBTdHJpbmcgdHlwZVVSSSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeCh0eXBlUHJlZml4KTsKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gICAgICAgIGlmICh0eXBlVVJJICE9IG51bGwgJiYgdHlwZVVSSS5sZW5ndGgoKSA+IDApIAotICAgICAgICB7Ci0gICAgICAgICAgdXJpUXVhbGlmaWVkVHlwZU5hbWUgPSAiWyIgKyAgdHlwZVVSSSArICJdIiArIHR5cGVOYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWQuZ2V0UHJvcGVydHkoIkRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb249IiArIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsgICAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHVucHJlZml4ZWQgbmFtZSAgICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pZWQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShuYW1lKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB0b2RvLi4uIHBlcmhhcHMgdGhpcyBpcyBhIGdsb2JhbGx5IGRlZmluZWQgYXR0cmlidXRlLi4uIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgQ01Eb2N1bWVudFJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBub2RlIG9yIHN1YnRyZWUKLSAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50UmVmZXJlbmNlcyhOb2RlIG5vZGUsIGJvb2xlYW4gZGVlcCkKLSAgeyAKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgIERvY3VtZW50IGRvY3VtZW50ID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KW5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLSAgICAvLyBkZWZlY3QgMjA2ODMzIC4uLiBoZXJlIHdlIHRlc3QgZm9yIERURHMgdGhhdCBhcmUgZGVjbGFyZWQgaW5saW5lCi0gICAgLy8gc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIG1ha2luZyB1c2Ugb2YgaW5saW5lIERURHMgd2UgaW5nb3JlIHRoZW0KLSAgICAvLyBzbyB0aGF0IHRoZSBpbXBsaWN0IERURCAoaWYgYW55KSBjYW4gYmUgdXNlZAotICAgIGlmIChkb2N0eXBlICE9IG51bGwgJiYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBkb2N0eXBlLmdldFB1YmxpY0lkKCksIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChkb2N0eXBlLmdldFB1YmxpY0lkKCksIHVyaSkpOwotICAgIH0gICAKLSAgICBlbHNlIGlmIChnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmdbXSBpbXBsaWNpdERvY3R5cGUgPSBnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCk7Ci0gICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGltcGxpY2l0RG9jdHlwZVswXSwgaW1wbGljaXREb2N0eXBlWzFdKTsKLSAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGltcGxpY2l0RG9jdHlwZVswXSwgdXJpKSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7ICAgCi0gICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotCQkgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoZGVlcCkKLSAgICAgIHsKLSAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUobm9kZSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgfQotCSAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotCQkgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSAKLSAgICAgIHsKLQkJCSAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOyAgICAKLSAgICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQpOwotICAgICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChpbmZvLnVyaSwgdXJpKSk7Ci0JCSAgfQkKLSAgICB9IAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShOb2RlIG5vZGUsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkgIGlmIChub2RlTGlzdCAhPSBudWxsKSAKLSAgICB7Ci0JCSAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSAKLSAgICAgIHsKLQkJCSAgTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsgICAKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KChFbGVtZW50KWNoaWxkTm9kZSk7Ci0gICAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUoY2hpbGROb2RlLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgIH0KLQkJICB9Ci0JICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODQ1MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTURlc2NyaXB0aW9uQnVpbGRlciBleHRlbmRzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHNiOwotICBwcm90ZWN0ZWQgQ01Ob2RlIHJvb3Q7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0KLSAgcHVibGljIFN0cmluZyBidWlsZERlc2NyaXB0aW9uKENNTm9kZSBub2RlKQotICB7Ci0gICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcm9vdCA9IG5vZGU7Ci0gICAgaXNSb290VmlzaXRlZCA9IGZhbHNlOwotICAgIHZpc2l0Q01Ob2RlKG5vZGUpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9ICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7Ci0gICAgc2IuYXBwZW5kKCJuYW1lc3BhY2U6dXJpPVwiIiArIGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRGF0YVR5cGUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICAgIHNiLmFwcGVuZCgiI1BDREFUQSIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRG9jdW1lbnQoQ01Eb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGRvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobWFwLml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICB7Ci0gICAgaW50IG9wID0gZ3JvdXAuZ2V0T3BlcmF0b3IoKTsKLSAgICBpZiAob3AgPT0gQ01Hcm91cC5BTEwpCi0gICAgewotICAgICAgc2IuYXBwZW5kKCJhbGwiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHNiLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBTdHJpbmcgc2VwYXJhdG9yID0gIiwgIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKG9wID09IENNR3JvdXAuQ0hPSUNFKQotICAgIHsKLSAgICAgIHNlcGFyYXRvciA9ICIgfCAiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgICAgaWYgKGkgPCBzaXplIC0gMSkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHNiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkT2NjdXJlbmNlU3ltYm9sKGdyb3VwKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLSAgICBpZiAoZWQgPT0gcm9vdCAmJiAhaXNSb290VmlzaXRlZCkKLSAgICB7Ci0gICAgICBpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLSAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbnRlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuR1JPVVApCi0gICAgICAgIHsKLSAgICAgICAgICBzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotICAgICAgICAgIHNiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNiLmFwcGVuZChlZC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgIGFkZE9jY3VyZW5jZVN5bWJvbChlZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkT2NjdXJlbmNlU3ltYm9sKENNQ29udGVudCBjb250ZW50KQotICB7Ci0gICAgaW50IG1pbiA9IGNvbnRlbnQuZ2V0TWluT2NjdXIoKTsKLSAgICBpbnQgbWF4ID0gY29udGVudC5nZXRNYXhPY2N1cigpOwotICAgIGlmIChtaW4gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWF4ID4gMSB8fCBtYXggPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZCgiPyIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG1heCA+IDEgfHwgbWF4ID09IC0xKQotICAgIHsKLSAgICAgIHNiLmFwcGVuZCgiKyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJhOTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudENhY2hlCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTk9UX0xPQURFRCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19MT0FESU5HICAgID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0xPQURFRCAgICAgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRVJST1IgICAgICA9IDQ7Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEVudHJ5Ci0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHVyaTsKLSAgICBwdWJsaWMgaW50IHN0YXR1cyA9IFNUQVRVU19OT1RfTE9BREVEOwotICAgIHB1YmxpYyBmbG9hdCBwcm9ncmVzczsKLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotCi0gICAgcHVibGljIEVudHJ5KFN0cmluZyB1cmkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMudXJpID0gdXJpOyAgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBFbnRyeShTdHJpbmcgdXJpLCBpbnQgc3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMudXJpID0gdXJpOwotICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7ICAgICAgCi0gICAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQotICAvKioKLSAgICogdGVtcG9yYXJpbHkgcHVibGljIHVudGlsIGNhY2hpbmcgcHJvYmxlbSBpcyBzb2x2ZWQKLSAgICovCi0gIHB1YmxpYyBDTURvY3VtZW50Q2FjaGUoKQotICB7Ci0gICAgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIGdyYW1tYXJVUkkpCi0gIHsKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWhhc2h0YWJsZS5nZXQoZ3JhbW1hclVSSSk7Ci0gICAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZW50cnkuY21Eb2N1bWVudDsKLSAgICAgIH0gICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKFN0cmluZyBncmFtbWFyVVJJKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IFNUQVRVU19OT1RfTE9BREVEOwotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSloYXNodGFibGUuZ2V0KGdyYW1tYXJVUkkpOwotICAgICAgaWYgKGVudHJ5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVudHJ5LnN0YXR1czsKLSAgICAgIH0gICAgICAKLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgRW50cnkgbG9va3VwT3JDcmVhdGUoU3RyaW5nIGdyYW1tYXJVUkkpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSloYXNodGFibGUuZ2V0KGdyYW1tYXJVUkkpOwotICAgIGlmIChlbnRyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGVudHJ5ID0gbmV3IEVudHJ5KGdyYW1tYXJVUkkpOyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBoYXNodGFibGUucHV0KGdyYW1tYXJVUkksIGVudHJ5KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVudHJ5OwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBwdXRDTURvY3VtZW50KFN0cmluZyBncmFtbWFyVVJJLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsICYmIGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlKGdyYW1tYXJVUkkpOwotICAgICAgaW50IG9sZFN0YXR1cyA9IGVudHJ5LnN0YXR1czsKLSAgICAgIGVudHJ5LnN0YXR1cyA9IFNUQVRVU19MT0FERUQ7Ci0gICAgICBlbnRyeS5jbURvY3VtZW50ID0gY21Eb2N1bWVudDsgIAotICAgICAgbm90aWZ5Q2FjaGVVcGRhdGVkKGdyYW1tYXJVUkksIG9sZFN0YXR1cywgZW50cnkuc3RhdHVzLCBlbnRyeS5jbURvY3VtZW50KTsgIAotICAgIH0KLSAgfQotICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIGdyYW1tYXJVUkksIGludCBzdGF0dXMpCi0gIHsKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIEVudHJ5IGVudHJ5ID0gbG9va3VwT3JDcmVhdGUoZ3JhbW1hclVSSSk7Ci0gICAgICBpbnQgb2xkU3RhdHVzID0gZW50cnkuc3RhdHVzOwotICAgICAgZW50cnkuc3RhdHVzID0gc3RhdHVzOwotICAgICAgbm90aWZ5Q2FjaGVVcGRhdGVkKGdyYW1tYXJVUkksIG9sZFN0YXR1cywgZW50cnkuc3RhdHVzLCBlbnRyeS5jbURvY3VtZW50KTsgICAKLSAgICB9Ci0gIH0KLSAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXIoKQotICB7Ci0gICAgaGFzaHRhYmxlLmNsZWFyKCk7Ci0gICAgbm90aWZ5Q2FjaGVDbGVhcmVkKCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2FjaGVVcGRhdGVkKFN0cmluZyB1cmksIGludCBvbGRTdGF0dXMsIGludCBuZXdTdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgeyAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lciA9IChDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLmNhY2hlVXBkYXRlZCh0aGlzLCB1cmksIG9sZFN0YXR1cywgbmV3U3RhdHVzLCBjbURvY3VtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNhY2hlQ2xlYXJlZCgpCi0gIHsgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lciA9IChDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLmNhY2hlQ2xlYXJlZCh0aGlzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRzKCkKLSAgewotICAJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgCQotICAJZm9yIChJdGVyYXRvciBpID0gaGFzaHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gIAl7Ci0gIAkJRW50cnkgZW50cnkgPSAoRW50cnkpaS5uZXh0KCk7Ci0gIAkJbGlzdC5hZGQoZW50cnkuY21Eb2N1bWVudCk7Ci0gIAl9Ci0gIAlyZXR1cm4gbGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWY0ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogdG9kby4uLiBhZGQgbW9yZSBpbnRlcmZhY2UgbWV0aG9kcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyCi17Ci0gIC8qKiBUZWxscyB0aGUgY2xpZW50IHRoYXQgdGhlIGNhY2hlIGhhcyBiZWVuIGNsZWFyZWQuCi0gICAqICBUaGlzIGdpdmVzIGNsaWVudHMgYW4gb3Bwb3J0dW5pdHkgdG8gZmx1c2ggYW55IHN0YXRlIHRoYXQgZGVwZW5kcyBvbiB0aGUgQ01Eb2N1bWVudAotICAgKiAgc2luY2UgdGhpcyBDTURvY3VtZW50IHdpbGwgYmUgcmVjb21wdXRlZCBvbiBhIHN1YnNlcXVlbnQgJ2xvb2t1cCcgcmVxdWVzdAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSk7IAotCi0gIC8qKiAKLSAgICogIFRlbGxzIHRoZSBjbGllbnQgdGhhdCB0aGUgY2FjaGUgaGFzIGJlZW4gdXBkYXRlZC4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTE0YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgaW50IGluZGVudCA9IDA7Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTU5vZGUoQ01Ob2RlIG5vZGUpCi0gIHsKLSAgICBpZiAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuSW5kZW50ZWQoInZpc2l0Q01Ob2RlIDogIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICIgIiArIG5vZGUpOwotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIENNTm9kZS5BTllfRUxFTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQW55RWxlbWVudCgoQ01BbnlFbGVtZW50KW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oKENNQXR0cmlidXRlRGVjbGFyYXRpb24pbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01EYXRhVHlwZSgoQ01EYXRhVHlwZSlub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5ET0NVTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRG9jdW1lbnQoKENNRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbilub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNR3JvdXAoKENNR3JvdXApbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLSAgfQotICAgICAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Eb2N1bWVudChDTURvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShtYXAuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gIHsKLSAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIENNTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IHNpemUgPSBub2RlTWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG5vZGVNYXAuaXRlbShpKSk7Ci0gICAgfQotCi0gICAgdmlzaXRDTU5vZGUoZWQuZ2V0Q29udGVudCgpKTsKLQotICAgIHZpc2l0Q01EYXRhVHlwZShlZC5nZXREYXRhVHlwZSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWNkMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0gICAgICAgICAgICAgICAgICAgCi0vKioKLSAqIFRoaXMgY2xhc3MgbGV0cyB5b3UgdHJhdmVyc2UgYSAnQ00nIG1vZGVsIHByb3ZpZGluZyBjYWxsYmFja3MgdG8gYnVpbGQgY29udGVudC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRCdWlsZGVyIGV4dGVuZHMgQ01WaXNpdG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX0FMTF9DT05URU5UID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UID0gMjsKLSAgcHJvdGVjdGVkIGludCBidWlsZFBvbGljeSA9IEJVSUxEX0FMTF9DT05URU5UOwotCi0gIHByb3RlY3RlZCBib29sZWFuIGFsd2F5c1Zpc2l0OwotICBwcm90ZWN0ZWQgVmVjdG9yIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHVibGljIENvbnRlbnRCdWlsZGVyKCkKLSAgewotICB9Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBidWlsZFBvbGljeSkKLSAgewotICAgIHRoaXMuYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkUG9saWN5OwotICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlU3RhcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlRW5kKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0Tm9kZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlTm9kZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSkKLSAgewotICB9IAotIAotICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgaW50IGZvcmNlZE1pbiA9IChidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLSAgICBpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBpZiAobWluID4gMCAmJiAhdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5jb250YWlucyhlZCkpCi0gICAgewotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspCi0gICAgICB7ICAgICAgIAotICAgICAgICBjcmVhdGVFbGVtZW50Tm9kZVN0YXJ0KGVkKTsgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgICAgIC8vIHdlIGR1cGxpY2F0ZSB0aGUgY29kZSB3aXRoIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucwotICAgICAgICBDTU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLSAgICAgICAgfQotCi0gICAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWQuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpCi0gICAgICAgIHsKLSAgICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdENNRGF0YVR5cGUoZGF0YVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbmQgZHVwbGljYXRpb24KLSAgICAgICAgY3JlYXRlRWxlbWVudE5vZGVFbmQoZWQpOyAgCi0gICAgICB9Ci0gICAgICBpbnQgc2l6ZSA9IHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3Quc2l6ZSgpOwotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gICAgY3JlYXRlVGV4dE5vZGUoZGF0YVR5cGUpOyAgIAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBlKQotICB7IAotICAgIGludCBmb3JjZWRNaW4gPSAoYnVpbGRQb2xpY3kgPT0gQlVJTERfQUxMX0NPTlRFTlQgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0gICAgaW50IG1pbiA9IE1hdGgubWF4KGUuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgCi0gICAgICBpZiAoZS5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFKQotICAgICAgewotICAgICAgICAvLyBhZGQgb25seSAxIGVsZW1lbnQgZnJvbSB0aGUgZ3JvdXAKLSAgICAgICAgLy8gdG9kby4uLiBwZXJoYXBzIGFkZCBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lICAgICAgICAKLSAgICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy8gU0VRVUVOQ0UsIEFMTAotICAgICAgewotICAgICAgICAvLyB2aXNpdCBhbGwgb2YgdGhlIGNvbnRlbnQKLSAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGUpOwotICAgICAgfQotICAgIH0KLSAgfSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGlmIChhbHdheXNWaXNpdCB8fAotICAgICAgICBidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fAotICAgICAgICBhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgewotICAgICAgY3JlYXRlQXR0cmlidXRlTm9kZShhZCk7ICAgICAgCi0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgICAgCi0gIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7ICAKLSAgICBpbnQgZm9yY2VkTWluID0gKGJ1aWxkUG9saWN5ID09IEJVSUxEX0FMTF9DT05URU5UIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7IAotICAgIGludCBtaW4gPSBNYXRoLm1heChhbnlFbGVtZW50LmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNyZWF0ZUFueUVsZW1lbnROb2RlKGFueUVsZW1lbnQpOwotICAgIH0KLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NjJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBET01Db250ZW50QnVpbGRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9PUFRJT05BTF9BVFRSSUJVVEVTID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT1BUSU9OQUxfRUxFTUVOVFMgPSAxPDwxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9GSVJTVF9DSE9JQ0UgPSAxPDwyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9URVhUX05PREVTID0gMTw8MzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfRklSU1RfU1VCU1RJVFVUSU9OID0gMTw8NDsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAotICAgIEJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCA9Ci0gICAgICBCVUlMRF9GSVJTVF9DSE9JQ0UKLSAgICAgIHwgQlVJTERfVEVYVF9OT0RFUzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgCi0gICAgQlVJTERfQUxMX0NPTlRFTlQgPSAKLSAgICAgIEJVSUxEX09QVElPTkFMX0FUVFJJQlVURVMgCi0gICAgICB8IEJVSUxEX09QVElPTkFMX0VMRU1FTlRTIAotICAgICAgfCBCVUlMRF9GSVJTVF9DSE9JQ0UKLSAgICAgIHwgQlVJTERfVEVYVF9OT0RFUzsKLSAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CVUlMRF9CTEFOS19URVhUX05PREVTID0gImJ1aWxkQmxhbmtUZXh0Tm9kZXMiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpOwotICBwdWJsaWMgaW50ICBnZXRCdWlsZFBvbGljeSgpOwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpOwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotICBwdWJsaWMgTGlzdCBnZXRSZXN1bHQoKTsKLSAgcHVibGljIHZvaWQgYnVpbGQoTm9kZSBwYXJlbnQsIENNTm9kZSBjaGlsZCk7Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uLCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB0aHJvd3MgRXhjZXB0aW9uOwotICBwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Q29udGVudChOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU3YzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuQ01EYXRhVHlwZVZhbHVlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIHRvZG8uLi4gY29tbW9uIHVwIHRoaXMgY29kZSB3aXRoICdDb250ZW50QnVpbGRlcicKLSAqLwotcHVibGljIGNsYXNzIERPTUNvbnRlbnRCdWlsZGVySW1wbCBleHRlbmRzIENNVmlzaXRvciBpbXBsZW1lbnRzIERPTUNvbnRlbnRCdWlsZGVyIHsKLQlwcm90ZWN0ZWQgaW50IGJ1aWxkUG9saWN5ID0gQlVJTERfQUxMX0NPTlRFTlQ7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCByZXN1bHRMaXN0OwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgTm9kZSBjdXJyZW50UGFyZW50OwotCXByb3RlY3RlZCBOb2RlIHRvcFBhcmVudDsKLQlwcm90ZWN0ZWQgVmVjdG9yIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYXR0YWNoTm9kZXNUb1BhcmVudCA9IHRydWU7Ci0JcHJvdGVjdGVkIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlOwotCi0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgcm9vdEVsZW1lbnQ7IC8vIHRoaXMgaXMgdXNlZCBvbmx5IHRlcG9yYXJpbHkgdmlhCi0JCQkJCQkJCQkvLyBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQKLQlwcm90ZWN0ZWQgRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0OwotCi0JcHVibGljIGJvb2xlYW4gc3VwcmVzc0NyZWF0aW9uT2ZEb2N0eXBlQW5kWE1MRGVjbGFyYXRpb247Ci0KLQlwcm90ZWN0ZWQgQ01EYXRhVHlwZVZhbHVlSGVscGVyIHZhbHVlSGVscGVyID0gbmV3IENNRGF0YVR5cGVWYWx1ZUhlbHBlcigpOwotCi0JcHJvdGVjdGVkIGludCBudW1PZlJlcGVhdGFibGVFbGVtZW50cyA9IDE7Ci0JcHJvdGVjdGVkIFN0YWNrIGNtR3JvdXBTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHVibGljIGludGVyZmFjZSBFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IHsKLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQoRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KSB7Ci0JCXRoaXMuZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCA9IGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQ7Ci0JfQotCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVySW1wbChEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCW5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpIHsKLQkJdGhpcy5idWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKSB7Ci0JCXJldHVybiBidWlsZFBvbGljeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEFsbENvbnRlbnQoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX0FMTF9DT05URU5UKSA9PSBCVUlMRF9BTExfQ09OVEVOVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsRWxlbWVudHMoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX09QVElPTkFMX0VMRU1FTlRTKSA9PSBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUykgPT0gQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0Q2hvaWNlKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9DSE9JQ0UpID09IEJVSUxEX0ZJUlNUX0NIT0lDRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFRleHROb2RlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfVEVYVF9OT0RFUykgPT0gQlVJTERfVEVYVF9OT0RFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0U3Vic3RpdHV0aW9uKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9TVUJTVElUVVRJT04pID09IEJVSUxEX0ZJUlNUX1NVQlNUSVRVVElPTjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlwcm9wZXJ0eVRhYmxlLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYnVpbGQoTm9kZSBwYXJlbnQsIENNTm9kZSBjaGlsZCkgewotCQlyZXN1bHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCQl0b3BQYXJlbnQgPSBwYXJlbnQ7Ci0JCWN1cnJlbnRQYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQluYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZSgoRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCQlhdHRhY2hOb2Rlc1RvUGFyZW50ID0gZmFsc2U7Ci0JCWFsd2F5c1Zpc2l0ID0gdHJ1ZTsKLQkJdmlzaXRDTU5vZGUoY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbiwgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLQkJY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KGNtRG9jdW1lbnQsIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGNtRG9jdW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKCFzdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbikgewotCQkJLy8gVE9ETyBjcy4uLiBpbnZlc3RpZ2F0ZSB0byBzZWUgaWYgdGhpcyBjb2RlIHBhdGggaXMgZXZlciB1c2VkLAotCQkJLy8gZG9lc24ndCBzZWVtIHRvIGJlCi0JCQkvLyBmb3Igbm93IEknbSBzZXR0aW5nIHRoZSBlbmNvZGluZyB0byBVVEYtOCBqdXN0IGluY2FzZSB0aGlzIGNvZGUKLQkJCS8vIHBhdGggaXMgdXNlZCBzb21ld2hlcmUKLQkJCS8vCi0JCQlTdHJpbmcgcGlWYWx1ZSA9ICJ2ZXJzaW9uPVwiMS4wXCIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQlwaVZhbHVlICs9ICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgICAgICAKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgcGlWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKHBpKTsKLQotCQkJLy8gaWYgd2UgaGF2ZSBhICdkdGQnIHRoZW4gYWRkIGEgRE9DVFlQRSB0YWcKLQkJCS8vCi0JCQlpZiAoZ3JhbW1hckZpbGVOYW1lICE9IG51bGwgJiYgZ3JhbW1hckZpbGVOYW1lLmVuZHNXaXRoKCJkdGQiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCURPTUltcGxlbWVudGF0aW9uIGRvbUltcGwgPSBkb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQkJCURvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50VHlwZShyb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSwgZ3JhbW1hckZpbGVOYW1lLCBncmFtbWFyRmlsZU5hbWUpOwotCQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50VHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB3ZSBoYXZlIGEgc2NoZW1hIGFkZCBhbiB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCS8vCi0JCWlmIChncmFtbWFyRmlsZU5hbWUgIT0gbnVsbCAmJiBncmFtbWFyRmlsZU5hbWUuZW5kc1dpdGgoInhzZCIpICYmIG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCQkJU3RyaW5nIG5hbWUgPSByb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCQlpZiAoaW5mby5wcmVmaXggIT0gbnVsbCAmJiBpbmZvLnByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbmFtZSA9IGluZm8ucHJlZml4ICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJvb3RFbGVtZW50ID0gY3JlYXRlRWxlbWVudChyb290Q01FbGVtZW50RGVjbGFyYXRpb24sIG5hbWUsIGRvY3VtZW50KTsKLQkJCW1hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhyb290RWxlbWVudCwgbmFtZXNwYWNlSW5mb0xpc3QsIHRydWUpOwotCQl9Ci0JCWNyZWF0ZURlZmF1bHRDb250ZW50KGRvY3VtZW50LCByb290Q01FbGVtZW50RGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRDb250ZW50KE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQljdXJyZW50UGFyZW50ID0gcGFyZW50OwotCQlhbHdheXNWaXNpdCA9IHRydWU7Ci0JCXZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQpIHsKLQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCXJldHVybiBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoY21Ob2RlLCBwYXJlbnQsIHByZWZpeCwgbmFtZXNwYWNlVGFibGUpOwotCX0KLQotCS8vIG92ZXJpZGUgdGhlIGZvbGxvd2luZyAnY3JlYXRlJyBtZXRob2RzIHRvIGNvbnRyb2wgaG93IG5vZGVzIGFyZSBjcmVhdGVkCi0JLy8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHIgY3JlYXRlQXR0cmlidXRlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudCkgewotCQlyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHROb2RlKENNRGF0YVR5cGUgZGF0YVR5cGUsIFN0cmluZyB2YWx1ZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQdXNoUGFyZW50KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBvcFBhcmVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JfQotCi0JLy8gVGhlIHJhbmdlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OS4KLQlwdWJsaWMgdm9pZCBzZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cyhpbnQgaSkgewotCQludW1PZlJlcGVhdGFibGVFbGVtZW50cyA9IGk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bU9mUmVwZWF0YWJsZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJaW50IGZvcmNlZE1pbiA9IChidWlsZE9wdGlvbmFsRWxlbWVudHMoYnVpbGRQb2xpY3kpIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotCQlpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQotCQkvLyBDb3JyZWN0IHRoZSBtaW4gdmFsdWUgaWYgdGhlIGVsZW1lbnQgaXMgY29udGFpbmVkIGluCi0JCS8vIGEgZ3JvdXAuCi0JCWlmICghY21Hcm91cFN0YWNrLmlzRW1wdHkoKSkgewotCQkJQ01Hcm91cCBncm91cCA9IChDTUdyb3VwKSBjbUdyb3VwU3RhY2sucGVlaygpOwotCQkJaW50IGdtaW4gPSBncm91cC5nZXRNaW5PY2N1cigpOwotCQkJaWYgKGdtaW4gPT0gMCkKLQkJCQlpZiAoYnVpbGRPcHRpb25hbEVsZW1lbnRzKGJ1aWxkUG9saWN5KSkgeyAKLQkJCQkJLyogZG8gbm90aGluZzogbWluID0gbWluICovCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltaW4gPSBtaW4gKiBnbWluOyAvLyBtaW4gPSAwCi0JCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWluID0gbWluICogZ21pbjsKLQkJCX0KLQkJfQotCi0JCWludCBtYXggPSBNYXRoLm1pbihlZC5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQkJaWYgKG1heCA8IG1pbikKLQkJCW1heCA9IG1pbjsKLQotCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0JCS8vIE5vdGUgLSBlZCBtYXkgbm90IGJlIGFic3RyYWN0IGJ1dCBoYXMgc3Vic3RpdHV0aW9uR3JvdXBzCi0JCS8vIGludm9sdmVkLgotCQlpZiAoYnVpbGRGaXJzdFN1YnN0aXR1dGlvbihidWlsZFBvbGljeSkgfHwgaXNBYnN0cmFjdChlZCkpIC8vIGxlYXZlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIHRoaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGJhY2t3YXJkCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbXBhdGliaWxpdHkKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yIG5vdwotCQl7Ci0JCQkvLyBOb3RlIC0gVG8gY2hhbmdlIHNvIHRoYXQgaWYgZWQgaXMgb3B0aW9uYWwsIHdlIGRvIG5vdAotCQkJLy8gZ2VuZXJhdGUgYW55dGhpbmcgaGVyZS4KLQkJCWVkID0gZ2V0U3Vic3RpdHV0aW9uKGVkKTsKLQotCQkJLy8gTm90ZSAtIHRoZSByZXR1cm5lZCBlZCBtYXkgYmUgYW4gYWJzdHJhY3QgZWxlbWVudCBpbgotCQkJLy8gd2hpY2ggY2FzZSB0aGUgeG1sIHdpbGwgYmUgaW52YWxpZC4KLQkJfQotCi0JCWlmIChtaW4gPiAwICYmICF2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmNvbnRhaW5zKGVkKSkgewotCQkJdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCQkvLyBjcmVhdGUgYW4gRWxlbWVudCBmb3IgZWFjaAotCQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJCQlyb290RWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbGVtZW50ID0gY3JlYXRlRWxlbWVudChlZCwgY29tcHV0ZU5hbWUoZWQsIGN1cnJlbnRQYXJlbnQpLCBjdXJyZW50UGFyZW50KTsKLQkJCQl9Ci0KLQkJCQkvLyB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIEdyYW1tYXJFbGVtZW50Ci0JCQkJTm9kZSBvbGRQYXJlbnQgPSBjdXJyZW50UGFyZW50OwotCQkJCWN1cnJlbnRQYXJlbnQgPSBlbGVtZW50OwotCQkJCWhhbmRsZVB1c2hQYXJlbnQoZWxlbWVudCwgZWQpOwotCi0JCQkJbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLQotCQkJCWJvb2xlYW4gb2xkQXR0YWNoTm9kZXNUb1BhcmVudCA9IGF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IHRydWU7Ci0KLQkJCQkvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0JCQkJLy8gd2UgZHVwbGljYXRlIHRoZSBjb2RlIHdpdGggc29tZSBtaW5vciBtb2RpZmljYXRpb25zCi0JCQkJQ01OYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLQkJCQl9Ci0KLQkJCQlDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLQkJCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCXZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotCQkJCX0KLQotCQkJCWlmIChlZC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkgewotCQkJCQlDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJCXZpc2l0Q01EYXRhVHlwZShkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZW5kIGR1cGxpY2F0aW9uCi0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IG9sZEF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJaGFuZGxlUG9wUGFyZW50KGVsZW1lbnQsIGVkKTsKLQkJCQljdXJyZW50UGFyZW50ID0gb2xkUGFyZW50OwotCQkJCWxpbmtOb2RlKGVsZW1lbnQpOwotCQkJfQotCQkJaW50IHNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QucmVtb3ZlKHNpemUgLSAxKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJVGV4dCB0ZXh0ID0gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCQkvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLQkJLy8gUHJldmlvdXMgY29kZSB1c2VzIGEgcHJvcGVydHkgdmFsdWUgYnV0IG5ldyBvbmUgdXNlcwotCQkvLyBidWlsZFBvbGljeS4KLQkJaWYgKGdldFByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMpICE9IG51bGwgJiYgZ2V0UHJvcGVydHkoUFJPUEVSVFlfQlVJTERfQkxBTktfVEVYVF9OT0RFUykuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMSQKLQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgXiBCVUlMRF9URVhUX05PREVTOwotCi0JCWlmIChidWlsZFRleHROb2RlcyhidWlsZFBvbGljeSkpIHsKLQkJCXZhbHVlID0gdmFsdWVIZWxwZXIuZ2V0VmFsdWUoZGF0YVR5cGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsICYmIGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl2YWx1ZSA9IGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gInBjZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGV4dCA9IGNyZWF0ZVRleHROb2RlKGRhdGFUeXBlLCB2YWx1ZSwgY3VycmVudFBhcmVudCk7Ci0JCWxpbmtOb2RlKHRleHQpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZSkgewotCQljbUdyb3VwU3RhY2sucHVzaChlKTsKLQotCQlpbnQgZm9yY2VkTWluID0gKGJ1aWxkT3B0aW9uYWxFbGVtZW50cyhidWlsZFBvbGljeSkgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0JCWludCBtaW4gPSBNYXRoLm1heChlLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7Ci0KLQkJaW50IG1heCA9IDA7Ci0JCWlmIChlLmdldE1heE9jY3VyKCkgPT0gLTEpIC8vIHVuYm91bmRlZAotCQkJbWF4ID0gZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKTsKLQkJZWxzZQotCQkJbWF4ID0gTWF0aC5taW4oZS5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQotCQlpZiAobWF4IDwgbWluKQotCQkJbWF4ID0gbWluOwotCi0JCWFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmIChlLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UgJiYgYnVpbGRGaXJzdENob2ljZShidWlsZFBvbGljeSkpIHsKLQkJCQlDTU5vZGUgaGludE5vZGUgPSBudWxsOwotCi0JCQkJLy8gdG9kby4uLiB0aGUgQ01Hcm91cCBzaG91bGQgc3BlY2lmeSB0aGUgaGludC4uLiBidXQgaXQgc2VlbXMKLQkJCQkvLyBhcyB0aG91Z2gKLQkJCQkvLyB0aGUgWWFtYXRvIGd1eXMgYXJlIG1ha2luZyB0aGUgQ01FbGVtZW50IHNwZWNpZnkgdGhlIGhpbnQuCi0JCQkJLy8gSSBkbyBpdCB0aGF0IHdheSBmb3Igbm93IHVudGlsLi4uIHdlIHNob3VsZCBmaXggdGhpcyBwb3N0Ci0JCQkJLy8gR0EKLQkJCQkvLyAgICAKLQkJCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCQlpZiAobGlzdFNpemUgPiAwKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmdldChsaXN0U2l6ZSAtIDEpOwotCQkJCQlPYmplY3QgY29udGVudEhpbnQgPSBlZC5nZXRQcm9wZXJ0eSgiY29udGVudEhpbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29udGVudEhpbnQgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQkJCWhpbnROb2RlID0gKENNTm9kZSkgY29udGVudEhpbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzZWUgaWYgdGhpcyBoaW50IGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgY2hvaWNlCi0JCQkJLy8KLQkJCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQotCQkJCWlmIChoaW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZUxpc3RMZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGhpbnROb2RlID09IG5vZGVMaXN0Lml0ZW0oaikpIHsKLQkJCQkJCQljbU5vZGUgPSBoaW50Tm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIG5vIGNtTm9kZSBoYXMgYmVlbiBkZXRlcm1pbmVkIGZyb20gdGhlIGhpbnQsIGp1c3QgdXNlCi0JCQkJLy8gdGhlIGZpcnN0IGNob2ljZQotCQkJCS8vCi0JCQkJaWYgKGNtTm9kZSA9PSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJY21Ob2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjbU5vZGUgIT0gbnVsbCkgewotCQkJCQl2aXNpdENNTm9kZShjbU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkFMTCAvLyBBTEwKLQkJCQkJCXx8IGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLlNFUVVFTkNFKSAvLyBTRVFVRU5DRQotCQkJewotCQkJCS8vIHZpc2l0IGFsbCBvZiB0aGUgY29udGVudAotCQkJCXN1cGVyLnZpc2l0Q01Hcm91cChlKTsKLQkJCX0KLQkJfQotCi0JCWNtR3JvdXBTdGFjay5wb3AoKTsKLQl9Ci0KLQlzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCWlmIChhbHdheXNWaXNpdCB8fCBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhidWlsZFBvbGljeSkgfHwgYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCQkJU3RyaW5nIG5hbWUgPSBjb21wdXRlTmFtZShhZCwgY3VycmVudFBhcmVudCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB2YWx1ZUhlbHBlci5nZXRWYWx1ZShhZCwgbmFtZXNwYWNlVGFibGUpOwotCQkJQXR0ciBhdHRyID0gY3JlYXRlQXR0cmlidXRlKGFkLCBuYW1lLCBjdXJyZW50UGFyZW50KTsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlsaW5rTm9kZShhdHRyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3QoQ01Ob2RlIGVkKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gKHZhbHVlID09IEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3Vic3RpdHV0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IGVkOwotCQlDTU5vZGVMaXN0IGwgPSAoQ01Ob2RlTGlzdCkgZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGwgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2FuZGlkYXRlID0gbC5pdGVtKGkpOwotCQkJCWlmICghaXNBYnN0cmFjdChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikpIHsKLQkJCQkJcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjYW5kaWRhdGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRQYXJlbnRDTUVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJaWYgKGxpc3RTaXplID4gMCkgewotCQkJZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuZ2V0KGxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7Ci0JCS8vIGluZ25vcmUgYnVpbGRQb2xpY3kgZm9yIEFOWSBlbGVtZW50cy4uLiBvbmx5IGNyZWF0ZSBlbGVtZW50cyBpZgotCQkvLyBhYnNvbHV0ZWx5IG5lZWRlZAotCQkvLwotCQlpbnQgZm9yY2VkTWluID0gYWx3YXlzVmlzaXQgPyAxIDogMDsKLQkJaW50IG1pbiA9IE1hdGgubWF4KGFueUVsZW1lbnQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotCQlTdHJpbmcgdXJpID0gYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJU3RyaW5nIHRhcmdldE5TUHJvcGVydHkgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQkJQ01Eb2N1bWVudCBwYXJlbnRDTURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnRDTURvY3VtZW50ID0gIiArIHBhcmVudENNRG9jdW1lbnQpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCWlmIChwYXJlbnRDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuc3RhcnRzV2l0aCgiIyMiKSB8fCB1cmkuZXF1YWxzKHBhcmVudENNRG9jdW1lbnQuZ2V0UHJvcGVydHkodGFyZ2V0TlNQcm9wZXJ0eSkpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZWQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZ2V0UGFyZW50Q01FbGVtZW50RGVjbGFyYXRpb24oKSwgcGFyZW50Q01Eb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQotCi0JCWlmIChlZCA9PSBudWxsICYmIGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCAmJiAhdXJpLnN0YXJ0c1dpdGgoIiMjIikgJiYgY3VycmVudFBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJQ01Eb2N1bWVudCBleHRlcm5hbENNRG9jdW1lbnQgPSBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0LmdldENNRG9jdW1lbnQoKEVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHVyaSk7Ci0JCQlpZiAoZXh0ZXJuYWxDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQllZCA9IGdldFN1aXRhYmxlRWxlbWVudChudWxsLCBleHRlcm5hbENNRG9jdW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspIHsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBTlktRUxFTUVOVCIpOyAvLyROT04tTkxTLTEkCi0JCQkJbGlua05vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3VpdGFibGVFbGVtZW50KENNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWludCBzaXplID0gbmFtZU5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjYW5kaWRhdGUgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG5hbWVOb2RlTWFwLml0ZW0oaSk7Ci0JCQlpZiAoIXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuY29udGFpbnMoY2FuZGlkYXRlKSkgewotCQkJCXJlc3VsdCA9IGNhbmRpZGF0ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTdWl0YWJsZUVsZW1lbnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCi0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZWQuZ2V0TG9jYWxFbGVtZW50cygpKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFN1aXRhYmxlRWxlbWVudChjbURvY3VtZW50LmdldEVsZW1lbnRzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGxpbmtOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAoYXR0YWNoTm9kZXNUb1BhcmVudCAmJiBjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCSgoRWxlbWVudCkgY3VycmVudFBhcmVudCkuc2V0QXR0cmlidXRlTm9kZSgoQXR0cikgbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljdXJyZW50UGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc3VsdExpc3QgIT0gbnVsbCkgewotCQkJcmVzdWx0TGlzdC5hZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFBvcHVsYXRlRG9jdW1lbnRGcm9tR3JhbW1hckZpbGUoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBncmFtbWFyRmlsZU5hbWUsIFN0cmluZyByb290RWxlbWVudE5hbWUsIGJvb2xlYW4gaGFjaykgewotCQl0cnkgewotCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQoZ3JhbW1hckZpbGVOYW1lLCBudWxsKTsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRNYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TWFwLmdldE5hbWVkSXRlbShyb290RWxlbWVudE5hbWUpOwotCi0JCQlET01Db250ZW50QnVpbGRlckltcGwgY29udGVudEJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsKLQkJCWNvbnRlbnRCdWlsZGVyLnN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uID0gaGFjazsKLQkJCWNvbnRlbnRCdWlsZGVyLmNyZWF0ZURlZmF1bHRSb290Q29udGVudChjbURvY3VtZW50LCBlbGVtZW50KTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCURPTVdyaXRlciB3cml0ZXIgPSBuZXcgRE9NV3JpdGVyKCk7Ci0JCQlpZiAoaGFjaykgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCwgZ3JhbW1hckZpbGVOYW1lKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8vIHRlc3QKLQkvLwotCS8qCi0JICogcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ1tdKSB7IGlmIChhcmcubGVuZ3RoID49IDIpIHsgdHJ5IHsKLQkgKiBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJDTURvY3VtZW50QnVpbGRlcldpdGhDbGFzc05hbWUoIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9maW1wbC5DTURvY3VtZW50QnVpbGRlckltcGwiKTsKLQkgKiAKLQkgKiBTdHJpbmcgZ3JhbW1hckZpbGVOYW1lID0gYXJnWzBdOyBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gYXJnWzFdOwotCSAqIAotCSAqIERvY3VtZW50IGRvY3VtZW50ID0KLQkgKiAoRG9jdW1lbnQpQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbCIpLm5ld0luc3RhbmNlKCk7Ci0JICogdGVzdFBvcHVsYXRlRG9jdW1lbnRGcm9tR3JhbW1hckZpbGUoZG9jdW1lbnQsIGdyYW1tYXJGaWxlTmFtZSwKLQkgKiByb290RWxlbWVudE5hbWUsIHRydWUpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiRE9NQ29udGVudEJ1aWxkZXJJbXBsIGVycm9yIik7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0gfQotCSAqIGVsc2UgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YQotCSAqIG9yZy5lY2xpcHNlLndzdC54bWwudXRpbC5ET01Db250ZW50QnVpbGRpbmdDTVZpc2l0b3IgZ3JhbW1hckZpbGVOYW1lCi0JICogcm9vdEVsZW1lbnROYW1lIik7IH0gfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwOTZkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRE9NTmFtZXNwYWNlSGVscGVyCi17ICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVUklGb3JQcmVmaXgoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkgIFN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSAKLSAgICB7Ci0JCSAgbnNBdHRyTmFtZSA9ICJ4bWxuczoiICsgcHJlZml4OyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICBlbHNlIAotICAgIHsKLQkJICBuc0F0dHJOYW1lID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCSAgfQotICAgICAgICAgICAgCi0gICAgLy8gYXNzdW1lIHRoZSBub2RlIGlzIHF1YWxpZmllZC4uLiBsb29rIHVwIHRoZSBVUkkgYmFzZSBvbiB0aGUgcHJlZml4Ci0gICAgLy8KLQkgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIAotICAgIHsKLQkgICAJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCB0aGVFbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLQkJICAgIEF0dHIgYXR0ciA9IHRoZUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJICAgIGlmIChhdHRyICE9IG51bGwpIAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAgICAgIAotICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBzb21lIGluZm8gZnJvbSBhbiAnaW1wbGljaXQnIG5hbWVzcGFjZQotICAgIC8vCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlVGFibGUgdGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgcmVzdWx0ID0gdGFibGUuZ2V0VVJJRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsgICAgICAgICAgICAgICAKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgIHJlc3VsdCA9IGdldFVSSUZvclByZWZpeChlbGVtZW50LCBwcmVmaXgpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICB7ICAgICAgCi0gICAgICBBdHRyIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGF0dHIuZ2V0UHJlZml4KCk7Ci0gICAgICByZXN1bHQgPSBnZXRVUklGb3JQcmVmaXgoYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgcHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgICAgICAgCi0KLSAgLy8gdG9kby4uLiB0aGlzIGlzIGFuIHVnbHkgaGFjay4uLiBuZWVkcyB0byBiZSBmaXhlZAotICAvLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlUHJlZml4KENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGZvciAoTm9kZSBub2RlID0gcGFyZW50Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0UHJlZml4KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbnByZWZpeGVkTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsgICAgIAotICAgIHJldHVybiBjb21wdXRlTmFtZShjbU5vZGUsIHBhcmVudCwgcHJlZml4LCBudWxsKTsKLSAgfSAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCi0gICAgLy8gaWYgdGhlIGNtTm9kZSBoYXMgYSBoYXJkIGNvZGVkIHByZWZpeCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLSAgICAvLwotICAgIGlmIChnZXRQcmVmaXgocmVzdWx0KSA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHF1YWxpZmljYXRpb24gPSAoU3RyaW5nKWNtTm9kZS5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyBzZWUgaWYgd2UgbmVlZCBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgIC8vCi0gICAgICBpZiAocXVhbGlmaWNhdGlvbiAhPSBudWxsICYmIHF1YWxpZmljYXRpb24uZXF1YWxzKCJxdWFsaWZpZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpICAgICAgICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgIC8vIHRvZG8uLi4gYWRkIGdldENNRG9jdW1lbnQoKSBtZXRob2QgdG8gQ01Ob2RlCi0gICAgICAgICAgLy8gZm9yIG5vdyB1c2UgdGhpcyBnZXRQcm9wZXJ0eSgpIGhhY2sKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7ICAgCi0gICAgICAgICAgICAgIC8vIHVzZSB0aGUgTmFtZXNwYWNlVGFibGUgdG8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlIHVyaQotICAgICAgICAgICAgICAvLyAgICAgIAotICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudExpbmVhZ2UoKEVsZW1lbnQpcGFyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gcHJlZml4ICsgIjoiICsgcmVzdWx0OyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKFN0cmluZyB1cmlRdWFsaWZpZWROYW1lKQotICB7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICBpbnQgZmlyc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiWyIpOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGxhc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGZpcnN0SW5kZXggIT0gLTEgJiYgbGFzdEluZGV4ID4gZmlyc3RJbmRleCkKLSAgICB7Ci0gICAgICByZXN1bHRbMF0gPSB1cmlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhmaXJzdEluZGV4ICsgMSwgbGFzdEluZGV4KTsKLSAgICAgIHJlc3VsdFsxXSA9IHVyaVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHRbMV0gPSB1cmlRdWFsaWZpZWROYW1lOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZjhlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBET01OYW1lc3BhY2VJbmZvTWFuYWdlciAgICAgICAgICAKLSAqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTSV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCkKLSAgewotICB9ICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvUmVhZGVyIHJlYWRlciA9IG5ldyBOYW1lc3BhY2VJbmZvUmVhZGVyKCk7Ci0gICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLSAgfSAgICAgICAgICAgIAotICAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZUluZm8oRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAKLSAgICBOYW1lc3BhY2VJbmZvUmVtb3ZlciByZW1vdmVyID0gbmV3IE5hbWVzcGFjZUluZm9SZW1vdmVyKCk7Ci0gICAgcmVtb3Zlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mbyhFbGVtZW50IGVsZW1lbnQsIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QsIGJvb2xlYW4gbmVlZHNYU0kpCi0gIHsgIAotICAgIC8vIGZpcnN0IHdlIGNyZWF0ZSBhbiB4bWxucyBhdHRyaWJ1dGUgZm9yIGVhY2ggbmFtZXNwYWNlCi0gICAgLy8gICAgICAgICAgICAgICAgICAgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uVmFsdWUgPSAiIjsgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBuc0luZm8ubm9ybWFsaXplKCk7Ci0gICAgICAgICAgICAgICAKLSAgICAgIGlmIChuc0luZm8udXJpICE9IG51bGwpIAotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuc0luZm8ucHJlZml4ICE9IG51bGwgPyAieG1sbnM6IiArIG5zSW5mby5wcmVmaXggOiAieG1sbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQXR0ciBuYW1lc3BhY2VBdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGF0dHJOYW1lKTsgIAotICAgICAgICBuYW1lc3BhY2VBdHRyLnNldFZhbHVlKG5zSW5mby51cmkpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUobmFtZXNwYWNlQXR0cik7ICAgCi0KLSAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHVzZSB0aGUgYXR0cmlidXRlICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0gICAgICAgIC8vIGhlcmUgd2UgYnVpbGQgdXAgaXRzIHZhbHVlCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChuc0luZm8ubG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9IG5zSW5mby51cmk7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSAiICI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9IG5zSW5mby5sb2NhdGlvbkhpbnQ7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSAiICI7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSAgIAotCi0gICAgICAgIGlmIChuc0luZm8udXJpLmVxdWFscyhYU0lfVVJJKSkKLSAgICAgICAgewotICAgICAgICAgIG5lZWRzWFNJID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgIAotICAgICAgZWxzZSBpZiAobnNJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBhdHRyaWJ1dGUgInhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIgotICAgICAgICAvLwotICAgICAgICBBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoInhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBhdHRyLnNldFZhbHVlKG5zSW5mby5sb2NhdGlvbkhpbnQpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgICB9IAotICAgIH0gCi0KLSAgICBpZiAobmVlZHNYU0kpCi0gICAgewotICAgICAgLy8gd2UgYWRkIGFuIHhtbG5zOnhzaSBhdHRyaWJ1dGUgdG8gZGVmaW5lICd4c2k6c2NoZW1hTG9jYXRpb24nIGF0dHJpYnV0ZQotICAgICAgLy8gICAKLSAgICAgIEF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSgieG1sbnM6eHNpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGF0dHIuc2V0VmFsdWUoWFNJX1VSSSk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgfQotCi0gICAgaWYgKHNjaGVtYUxvY2F0aW9uVmFsdWUubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgInhzaTpzY2hlbWFMb2NhdGlvbiIgYXR0cmlidXRlCi0gICAgICAvLwotICAgICAgQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCJ4c2k6c2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXR0ci5zZXRWYWx1ZShzY2hlbWFMb2NhdGlvblZhbHVlKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAKLSAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5hbWVzcGFjZUluZm9SZWFkZXIgZXh0ZW5kcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi0gIHsgIAotICAgIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIHZpc2l0RWxlbWVudChlbGVtZW50KTsKLSAgICAgIHJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gdmFsdWU7ICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgIGluZm8udXJpID0gdXJpOwotICAgICAgaW5mby5wcmVmaXggPSBwcmVmaXg7ICAgICAgCi0gICAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBwcmVmaXgsIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICAgIHsgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSk7ICAgICAgICAgICAgCi0gICAgICBpZiAoaW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGluZm8gPSBjcmVhdGVOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgIGluZm8udXJpID0gdXJpOwotICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm9Gb3JVUkkoU3RyaW5nIHVyaSkKLSAgICB7ICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyByZXN1bHQgPSBudWxsOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgIGlmIChpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmVxdWFscyh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gaW5mbzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGNyZWF0ZU5hbWVzcGFjZUluZm8oKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0gIH0KLSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5hbWVzcGFjZUluZm9SZW1vdmVyIGV4dGVuZHMgTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvcgotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZUluZm8oRWxlbWVudCBlbGVtZW50KQotICAgIHsgIAotICAgICAgdmlzaXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgcmVtb3ZlQXR0cmlidXRlcygpOwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuYWRkKGF0dHIpOwotICAgIH0gICAgICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICB7ICAgCi0gICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuYWRkKGF0dHIpOwotICAgICAgc3VwZXIudmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgbmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5hZGQoYXR0cik7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlcygpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gYXR0cmlidXRlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWkubmV4dCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI2YmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8vIHRvZG8uLiBtb3ZlIHRoaXMgY2xhc3MgdG8gYW5vdGhlciBwYWNrYWdlIChwZXJoYXBzIHhtbHV0aWxpdHkpCi0vLwotcHVibGljIGNsYXNzIERPTVZpc2l0b3IKLXsgICAgICAgICAKLSAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0QXR0cigoQXR0cilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDb21tZW50KChDb21tZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXREb2N1bWVudCgoRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RG9jdW1lbnRUeXBlKChEb2N1bWVudFR5cGUpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRUZXh0KChUZXh0KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAKLSAgfSAgICAKLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAKLSAgICB2aXNpdENoaWxkTm9kZXNIZWxwZXIoZG9jdW1lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREb2N1bWVudFR5cGUoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gIHsgICAgICAgICAKLQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAKLSAgICB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoZWxlbWVudCk7Ci0gICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGVsZW1lbnQpOwotICB9IAotIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cihBdHRyIGF0dHIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFRleHQoVGV4dCB0ZXh0KQotICB7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhU2VjdGlvbikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gIH0gICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpCi0gIHsgICAgCi0gIH0KLSAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENoaWxkTm9kZXNIZWxwZXIoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgdmlzaXROb2RlKGNoaWxkcmVuLml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QXR0cmlidXRlc0hlbHBlcihOb2RlIG5vZGUpCi0gIHsKLSAgICBOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKyApCi0gICAgewotICAgICAgdmlzaXROb2RlKG1hcC5pdGVtKGkpKTsKLSAgICB9Ci0gIH0gICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVdyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDdkNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgaGFja2VkIHVwIGRvbSB3cml0ZXIgc3RvbGVuIGZyb20gYSBYZXJjZXMgc2FtcGxlLgotICogSSdkIGxpa2UgdG8gdXNlIGFuIGV4aXNpdG5nICdnZW5lcmljIERPTScgd3JpdGVyCi0gKiBJZiBhbnlvbmUgY2FuIGZpbmQgc3VjaCBhIHRoaW5nIHRoZW4gcGxlYXNlIGdvIGFoZWFkIGFuZCBqdW5rIHRoaXMuCi0gKgotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIERPTVdyaXRlcgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBmb3JtYXR0aW5nRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgYm9vbGVhbiBvdXRwdXREb2N0eXBlRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgb3V0OwotICAgcHJvdGVjdGVkIGludCBpbmRlbnQgPSAwOyAgCi0KLSAgIHB1YmxpYyBET01Xcml0ZXIoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgewotICAgICB0aGlzKFN5c3RlbS5vdXQpOwotICAgfQotCi0gICBwdWJsaWMgRE9NV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXRTdGVhbSkKLSAgIHsKLSAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFN0ZWFtKTsKLSAgIH0KLQotICAgcHVibGljIERPTVdyaXRlcihXcml0ZXIgd3JpdGVyKQotICAgewotICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0dGluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICAgewotICAgICBmb3JtYXR0aW5nRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICB9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGdldEZvcm1hdHRpbmdFbmFibGVkKCkKLSAgIHsKLSAgICAgcmV0dXJuIGZvcm1hdHRpbmdFbmFibGVkOwotICAgfQotCi0gICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREb2N0eXBlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gICB7Ci0gICAgIG91dHB1dERvY3R5cGVFbmFibGVkID0gZW5hYmxlZDsKLSAgIH0KLQotICAgcHVibGljIGNsYXNzIFhNTFZpc2l0b3IKLSAgIHsKLSAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzID0gZmFsc2U7Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgICAgIHsKLSAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0QXR0cigoQXR0cilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDb21tZW50KChDb21tZW50KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXREb2N1bWVudCgoRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RG9jdW1lbnRUeXBlKChEb2N1bWVudFR5cGUpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRUZXh0KChUZXh0KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICAgICB7Ci0gICAgICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGRvY3VtZW50KTsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N0eXBlKQotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBpZiAob3V0cHV0RG9jdHlwZUVuYWJsZWQpCi0gICAgICAgewotICAgICAgICAgU3RyaW5nIGRhdGEgPSBnZXREb2N1bWVudFR5cGVEYXRhKGRvY3R5cGUpOwotICAgICAgICAgcHJpbnQoIjwhRE9DVFlQRSAiICsgZGF0YSArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgaWYgKCFkb1Nob3coZWxlbWVudCkpCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgICBib29sZWFuIHBhcmVudEVsZW1lbnRIYXNDaGlsZE5vZGVzID0gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzOwotICAgICAgIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IGhhc0NoaWxkRWxlbWVudHMoZWxlbWVudCk7Ci0KLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgIHZpc2l0QXR0cmlidXRlc0hlbHBlcihlbGVtZW50KTsKLQotICAgICAgIGJvb2xlYW4gaGFzQ2hpbGROb2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMDsgICAgICAgICAgICAgICAgCi0gICAgICAgYm9vbGVhbiBpc1Jvb3RFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREU7Ci0gICAgICAgaWYgKGhhc0NoaWxkTm9kZXMgfHwgaXNSb290RWxlbWVudCkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzIHx8IGlzUm9vdEVsZW1lbnQpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICBwcmludCgiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICB9Ci0gICAgICAgICBpbmRlbnQgKz0gMjsKLSAgICAgICAgIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihlbGVtZW50KTsKLSAgICAgICAgIGluZGVudCAtPSAyOwotCi0gICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzIHx8IGlzUm9vdEVsZW1lbnQpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBwcmludCgiPC8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgcHJpbnQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgIHByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgcHJpbnRsbigiLz4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLQotICAgICAgIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IHBhcmVudEVsZW1lbnRIYXNDaGlsZE5vZGVzOwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyKEF0dHIgYXR0cikKLSAgICAgewotICAgICAgIHByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChhdHRyLmdldE5vZGVOYW1lKCkpOwotICAgICAgIHByaW50KCI9XCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEoYXR0ci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgcHJpbnQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0VGV4dChUZXh0IHRleHQpCi0gICAgIHsKLSAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzKQotICAgICAgIHsKLSAgICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgICBwcmludChjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKHRleHQuZ2V0Tm9kZVZhbHVlKCkpKTsKLSAgICAgICAgIHByaW50bG4oKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEodGV4dC5nZXROb2RlVmFsdWUoKSkpOwotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Q0RBVEFTZWN0aW9uKENEQVRBU2VjdGlvbiBjZGF0YVNlY3Rpb24pCi0gICAgIHsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gICAgIHsKLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8IS0tIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChjb21tZW50LmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICBwcmludGxuKCItLT4iKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKQotICAgICB7Ci0gICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICBwcmludCgiPD8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KHBpLmdldE5vZGVOYW1lKCkpOwotICAgICAgIHByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChwaS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgcHJpbnRsbigiPz4iKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0gICAgICAgICAgICAgCi0KLSAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRFbGVtZW50cyhOb2RlIG5vZGUpCi0gICAgIHsKLSAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIGlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRDaGlsZE5vZGVzSGVscGVyKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIHZpc2l0Tm9kZShjaGlsZHJlbi5pdGVtKGkpKTsKLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoTm9kZSBub2RlKQotICAgICB7Ci0gICAgICAgTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKysgKQotICAgICAgIHsKLSAgICAgICAgIHZpc2l0Tm9kZShtYXAuaXRlbShpKSk7Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgLyoqIGFuIHVnbHkgaGFjayB1bnRpbCBJIHJlc3RydWN0IHRoaXMgY29kZSBhIGxpdHRsZQotICAgKiAgCi0gICAqLyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGRvU2hvdyhFbGVtZW50IGVsZW1lbnQpICAgIAotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiBjb252ZXJ0cyBET00gdGV4dCB2YWx1ZXMgdG8gJ3ByaW50YWJsZScgdmFsdWVzIAotICAgKiAgLSBjb252ZXJ0cyAnJicgdG8gJyZhbXA7JwotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKFN0cmluZyBzdHJpbmcpCi0gIHsgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIGludCBpbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaW50IGFtcGVyc2FuZEluZGV4ID0gc3RyaW5nLmluZGV4T2YoIiYiLCBpbmRleCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChhbXBlcnNhbmRJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5zdWJzdHJpbmcoaW5kZXgsIGFtcGVyc2FuZEluZGV4KTsKLSAgICAgICAgcmVzdWx0ICs9ICImYW1wOyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5kZXggPSBhbXBlcnNhbmRJbmRleCArIDE7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IAotICAgIHJlc3VsdCArPSBzdHJpbmcuc3Vic3RyaW5nKGluZGV4KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiogUHJpbnRzIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmVjdXJzaXZlbHkuICovCi0gIHB1YmxpYyB2b2lkIHByaW50KE5vZGUgbm9kZSkKLSAgewotICAgIC8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgewotICAgICAgWE1MVmlzaXRvciB2aXNpdG9yID0gbmV3IFhNTFZpc2l0b3IoKTsKLSAgICAgIHZpc2l0b3IudmlzaXROb2RlKG5vZGUpOwotICAgIH0KLSAgICBvdXQuZmx1c2goKTsKLSAgfQotCi0gIC8qKiBhIHRlbXBvcmFyeSBoYWNrIHRvIHdvcmthcm91bmQgb3VyIGluYWJpbGl0eSB0byBjcmVhdGUgYSBEb2N1bWVudFR5cGUgdGFnKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBncmFtbWFyVVJMKQotICB7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLSAgICBpZiAoZ3JhbW1hclVSTC5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBpbnQgbGFzdFNsYXNoSW5kZXggPSBNYXRoLm1heChncmFtbWFyVVJMLmxhc3RJbmRleE9mKCIvIiksIGdyYW1tYXJVUkwubGFzdEluZGV4T2YoIlxcIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIGlmIChsYXN0U2xhc2hJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgc3lzdGVtSWQgPSBncmFtbWFyVVJMLnN1YnN0cmluZyhsYXN0U2xhc2hJbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludChkb2N1bWVudCwgIlVURi04IiwgZ3JhbW1hclVSTCwgbnVsbCwgc3lzdGVtSWQpOyAvLyROT04tTkxTLTEkCi0KLSAgfQotCi0gIC8qKiBhIHRlbXBvcmFyeSBoYWNrIHRvIHdvcmthcm91bmQgb3VyIGluYWJpbGl0eSB0byBjcmVhdGUgYSBEb2N1bWVudFR5cGUgdGFnKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIiArICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PiIpOyAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgaWYgKGdyYW1tYXJGaWxlTmFtZS5lbmRzV2l0aCgiLmR0ZCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgU3RyaW5nIGRvY1R5cGVMaW5lID0gIjwhRE9DVFlQRSAiICsgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICJQVUJMSUMgXCIiICsgcHVibGljSWQgKyAiXCIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZG9jVHlwZUxpbmUgKz0gIlwiIiArIHN5c3RlbUlkICsgIlwiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICI+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdXQucHJpbnRsbihkb2NUeXBlTGluZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkb2NUeXBlTGluZSArPSAiU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiID4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgb3V0LnByaW50bG4oZG9jVHlwZUxpbmUpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludChkb2N1bWVudCk7Ci0gIH0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERvY3VtZW50VHlwZURhdGEoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gIHsKLSAgICBTdHJpbmcgZGF0YSA9IGRvY3R5cGUuZ2V0TmFtZSgpOwotICAgIGlmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgUFVCTElDIFwiIiArIGRvY3R5cGUuZ2V0UHVibGljSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIHN5c3RlbUlkID0gZG9jdHlwZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgaWYgKHN5c3RlbUlkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN5c3RlbUlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGRhdGEgKz0gIiBcIiIgKyBzeXN0ZW1JZCArICJcIiI7ICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgU1lTVEVNIFwiIiArIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfSAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oc3RyaW5nKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludChzdHJpbmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50SW5kZW50KCkKLSAgeyAgICAgICAgICAgICAKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHN0cmluZykKLSAgewotICAgIG91dC5wcmludChzdHJpbmcpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkNDZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vLyB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIGEgZ3JhbW1hciBkb2N1bWVudCBnaXZlbiBhIGxvY2FsIGZpbGUgbmFtZQotLy8KLXB1YmxpYyBpbnRlcmZhY2UgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeQoteyAgIAotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpOyAKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgY21Eb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGlzTG9jYWwpOwotICBwdWJsaWMgdm9pZCBjcmVhdGVDTUNvbnRlbnQoQ01Eb2N1bWVudCBwYXJlbnRDTURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgQ01Eb2N1bWVudCBjaGlsZENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkRWQsIGJvb2xlYW4gaXNMb2NhbCwgU3RyaW5nIHVyaSk7Ci0gIHB1YmxpYyB2b2lkIGRlYnVnUHJpbnQoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTsgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MThjNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0NIRU1BX0lOU1RBTkNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyB4c2lQcmVmaXggPSAieHNpIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgeyAgIAotICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKFhNTF9TQ0hFTUFfSU5TVEFOQ0VfVVJJKSkKLSAgICB7Ci0gICAgICB4c2lQcmVmaXggPSBuYW1lc3BhY2VQcmVmaXg7Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOyAgICAgICAgICAKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnNVUkkgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0gICAgICBTdHJpbmcgbG9jYXRpb25IaW50ID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOyAgICAgICAgICAgIAotICAgICAgaWYgKG5zVVJJICE9IG51bGwgJiYgbG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgICB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKG5zVVJJLCBsb2NhdGlvbkhpbnQpOyAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTmFtZWROb2RlTWFwIG1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0ciltYXAuaXRlbShpKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIFN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgdW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoInhtbG5zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIHVucHJlZml4ZWROYW1lLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9IAotICAgICAgICBlbHNlIGlmIChwcmVmaXguZXF1YWxzKHhzaVByZWZpeCkgJiYgdW5wcmVmaXhlZE5hbWUuZXF1YWxzKCJzY2hlbWFMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKGF0dHIsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHJlZml4LmVxdWFscyh4c2lQcmVmaXgpICYmIHVucHJlZml4ZWROYW1lLmVxdWFscygibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoYXR0ciwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHVucHJlZml4ZWROYW1lLmVxdWFscygieG1sbnMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgIiIsIGF0dHIuZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfSAgICAgIAotICAgIH0KLSAgfSAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFhZjEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm8KLXsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFN0cmluZyB1cmk7Ci0gIHB1YmxpYyBTdHJpbmcgcHJlZml4OwotICBwdWJsaWMgU3RyaW5nIGxvY2F0aW9uSGludDsKLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmaXhSZXF1aXJlZDsgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlOwotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvKCkKLSAgewotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8oU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdXJpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gICAgdGhpcy5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gIH0gICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyhOYW1lc3BhY2VJbmZvIHRoYXQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdGhhdC51cmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnByZWZpeCA9IHRoYXQucHJlZml4OwotICAgIHRoaXMubG9jYXRpb25IaW50ID0gdGhhdC5sb2NhdGlvbkhpbnQ7Ci0gICAgLy8gdG9kby4uLiBzZWUgaWYgd2UgbmVlZCB0byBjbG9uZSB0aGUgaGFzdGFibGUgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKQotICB7Ci0gICAgdXJpID0gZ2V0Tm9ybWFsaXplZFZhbHVlKHVyaSk7Ci0gICAgcHJlZml4ICA9IGdldE5vcm1hbGl6ZWRWYWx1ZShwcmVmaXgpOwotICAgIGxvY2F0aW9uSGludD0gZ2V0Tm9ybWFsaXplZFZhbHVlKGxvY2F0aW9uSGludCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vcm1hbGl6ZWRWYWx1ZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApID8gbnVsbCA6IHN0cmluZzsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmIChoYXNodGFibGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgfQotICAgIGhhc2h0YWJsZS5wdXQocHJvcGVydHksIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIChoYXNodGFibGUgIT0gbnVsbCkgPyBoYXNodGFibGUuZ2V0KHByb3BlcnR5KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgY2xvbmVOYW1lc3BhY2VJbmZvTGlzdChMaXN0IG9sZExpc3QpCi0gIHsgIAotICAgIExpc3QgbmV3TGlzdCA9IG5ldyBWZWN0b3Iob2xkTGlzdC5zaXplKCkpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgIG5ld0xpc3QuYWRkKG5ldyBOYW1lc3BhY2VJbmZvKG9sZEluZm8pKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG5ld0xpc3Q7Ci0gIH0KLX0gICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJkYTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VUYWJsZSBleHRlbmRzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLXsgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHB1YmxpYyBOYW1lc3BhY2VUYWJsZShEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vRE9NRXh0ZW5zaW9uIGRvbUV4dGVuc2lvbiA9IERPTUV4dGVuc2lvblByb3ZpZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRET01FeHRlbnNpb24oZG9jdW1lbnQpOwotICAgIC8vaWYgKGRvbUV4dGVuc2lvbiAhPSBudWxsKQotICAgIC8veyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gIGFkZE5hbWVzcGFjZUluZm9MaXN0KGRvbUV4dGVuc2lvbi5nZXRJbXBsaWN0TmFtZXNwYWNlSW5mb0xpc3QoKSwgdHJ1ZSk7Ci0gICAgLy8gfQotICB9ICAgCi0KLSAgcHJpdmF0ZSBOYW1lc3BhY2VUYWJsZSgpCi0gIHsgICAgICAgIAotICB9ICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUVuY291bnRlcmVkKCkKLSAgewotICAgIHJldHVybiBoYXNodGFibGUudmFsdWVzKCkuc2l6ZSgpID4gMDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4Rm9yVVJJKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE5hbWVzcGFjZUluZm8gZW50cnkgPSBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSwgdHJ1ZSk7Ci0gICAgaWYgKGVudHJ5ICE9IG51bGwpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVudHJ5LnByZWZpeDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAgIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm9Gb3JQcmVmaXgocHJlZml4KTsKLSAgICBpZiAoaW5mbyAhPSBudWxsKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbmZvLnVyaTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaGluZ1N0cmluZyhTdHJpbmcgYSwgU3RyaW5nIGIpCi0gIHsKLSAgICByZXR1cm4gKChhID09IG51bGwgJiYgYiA9PSBudWxsKSB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSkpOwotICB9Ci0gICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSwgZmFsc2UpOwotICB9Ci0KLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gdGVzdEltcGxpZWQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gaGFzaHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOyAKLSAgICAgIGlmIChpc01hdGNoaW5nU3RyaW5nKG5zSW5mby51cmksIHVyaSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gbnNJbmZvOwotICAgICAgICBpZiAodGVzdEltcGxpZWQgJiYgbnNJbmZvLmdldFByb3BlcnR5KCJpc0ltcGxpZWQiKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb250aW51ZQotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLQotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbkhpbnRGb3JVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgeyAgICAgIAotICAgLy8gTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGhhc2h0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsgCi0gICAgICBpZiAoaXNNYXRjaGluZ1N0cmluZyhuc0luZm8udXJpLCB1cmkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclByZWZpeChTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcmVmaXggPSBwcmVmaXggIT0gbnVsbCA/IHByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChOYW1lc3BhY2VJbmZvKWhhc2h0YWJsZS5nZXQocHJlZml4KTsKLSAgfSAgIAotCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOyAgICAgIAotICAgIG5zSW5mby5wcmVmaXggPSBuYW1lc3BhY2VQcmVmaXg7Ci0gICAgbnNJbmZvLnVyaSA9IG5hbWVzcGFjZVVSSTsgICAgICAKLSAgIAotICAgIE5hbWVzcGFjZUluZm8gbWF0Y2hpbmdOYW1lc3BhY2VJbmZvID0gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShuYW1lc3BhY2VVUkkpOwotICAgIGlmIChtYXRjaGluZ05hbWVzcGFjZUluZm8gIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBuc0luZm8ubG9jYXRpb25IaW50ID0gbWF0Y2hpbmdOYW1lc3BhY2VJbmZvLmxvY2F0aW9uSGludDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhuYW1lc3BhY2VQcmVmaXgsIG5zSW5mbyk7Ci0KLSAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBuYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gIH0gCi0gICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBzZXRMb2NhdGlvbkhpbnRGb3JVUkkodXJpLCBsb2NhdGlvbkhpbnQpOwotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mbyhOYW1lc3BhY2VJbmZvIGluZm8pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcga2V5ICA9IChpbmZvLnByZWZpeCAhPSBudWxsKSA/IGluZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oa2V5LCBpbmZvKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcga2V5LCBOYW1lc3BhY2VJbmZvIGluZm8pCi0gIHsKLSAgICBoYXNodGFibGUucHV0KGtleSwgaW5mbyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QsIGJvb2xlYW4gaXNJbXBsaWVkKQotICB7ICAgICAgIAotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBjbG9uZSA9IG5ldyBOYW1lc3BhY2VJbmZvKGluZm8pOyAgICAKLSAgICAgICAgaWYgKGlzSW1wbGllZCkKLSAgICAgICAgewotICAgICAgICAgIGNsb25lLnNldFByb3BlcnR5KCJpc0ltcGxpZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBhZGROYW1lc3BhY2VJbmZvKGNsb25lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpCi0gIHsgIAotICAgIGFkZE5hbWVzcGFjZUluZm9MaXN0KGxpc3QsIGZhbHNlKTsgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIGFkZE5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24obG9jYXRpb25IaW50KTsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBhZGROb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7ICAgICAgCi0gICAgbnNJbmZvLnByZWZpeCA9IG51bGw7Ci0gICAgbnNJbmZvLnVyaSA9ICIiOyAgICAgICAvLyROT04tTkxTLTEkCi0gICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsgIAotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbygiIiwgbnNJbmZvKTsgLy8kTk9OLU5MUy0xJAotICB9IAotCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUluZm8oU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsgICAgICAKLSAgICBuc0luZm8ucHJlZml4ID0gcHJlZml4OwotICAgIG5zSW5mby51cmkgPSB1cmk7ICAgICAgCi0gICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsgIAotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhwcmVmaXggIT0gbnVsbCA/IHByZWZpeCA6ICIiLCBuc0luZm8pOyAvLyROT04tTkxTLTEkCi0gIH0gCi0KLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAKLSAgICB2aXNpdEVsZW1lbnQoZWxlbWVudCk7ICAKLSAgfSAgICAgIAotICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaW5lYWdlKEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IE5hbWVzcGFjZVRhYmxlLmdldEVsZW1lbnRMaW5lYWdlKHRhcmdldEVsZW1lbnQpOyAgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWkubmV4dCgpOwotICAgICAgYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICB9ICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0RWxlbWVudExpbmVhZ2UoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAKLSAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICByZXN1bHQuYWRkKDAsIG5vZGUpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXROYW1lc3BhY2VJbmZvQ29sbGVjdGlvbigpCi0gIHsgICAgICAgICAgICAgIAotICAgIHJldHVybiBoYXNodGFibGUudmFsdWVzKCk7Ci0gIH0gCi0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZEFsbChoYXNodGFibGUudmFsdWVzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci19IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzY4ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFQWRhcHRlciBleHRlbmRzIEVNRjJET01BZGFwdGVySW1wbCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIobm9kZSwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCX0KLQotCXB1YmxpYyBFTUYyRE9NU1NFQWRhcHRlcihOb3RpZmllciBvYmplY3QsIE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIob2JqZWN0LCBub2RlLCByZW5kZXJlciwgdHJhbnNsYXRvcik7Ci0JfQotCi0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSwgRG9jdW1lbnQgZG9jdW1lbnQsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKHJlc291cmNlLCBkb2N1bWVudCwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY2FsY0luZGVudFN0cmluZyhOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlLmdldFBhcmVudE5vZGUoKSwgIk5vZGUgbXVzdCBiZSBjb25uZWN0ZWQgaW50byB0aGUgdHJlZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gZ2V0TmV3bGluZVN0cmluZyhub2RlKTsKLQotCQkvLyBGaW5kIGluZGVudGF0aW9uIHN0cmluZyBmb3IgdGhpcyBub2RlIGJhc2VkIG9uIGl0cyBzaWJsaW5nIG9yCi0JCS8vIHBhcmVudAotCQlOb2RlIHByZXZpb3VzU2libGluZyA9IERPTVV0aWxpdGllcy5nZXRQcmV2aW91c05vZGVTaWJsaW5nKG5vZGUpOwotCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwpIHsKLQkJCWluZGVudFN0cmluZyA9IHByaW1HZXRJbmRlbnRTdHJpbmcocHJldmlvdXNTaWJsaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBwYXJlbnRJbmRlbnRTdHJpbmcgPSBwcmltR2V0SW5kZW50U3RyaW5nKHBhcmVudCk7Ci0JCQlpbmRlbnRTdHJpbmcgPSBwYXJlbnRJbmRlbnRTdHJpbmcgKyBET01VdGlsaXRpZXMuSU5ERU5UX1NUUklORzsKLQkJfQotCQlyZXR1cm4gaW5kZW50U3RyaW5nOwotCX0KLQotCS8qCi0JICogUHJpbnRzIG91dCBhIERPTSBub3RpZmljYXRpb24gZm9yIGRlYnVnZ2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWJ1Z0RPTU5vdGlmeShJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCVN0cmluZyBub3RpZlR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQUREIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCQlub3RpZlR5cGUgPSAiQ0hBTkdFIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIDoKLQkJCQkJbm90aWZUeXBlID0gIkNPTlRFTlRfQ0hBTkdFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIDoKLQkJCQkJbm90aWZUeXBlID0gIlNUUlVDVFVSRV9DSEFOR0UiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIkRPTSBDaGFuZ2U6ICIgKyBub3RpZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRub3RpZmllciAgICAgIDogIiArIG5vdGlmaWVyKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIlx0Y2hhbmdlZEZlYXR1cmU6ICIgKyBjaGFuZ2VkRmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdG9sZFZhbHVlICAgICAgOiAiICsgb2xkVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRuZXdWYWx1ZSAgICAgIDogIiArIG5ld1ZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50SWZOZWNlc3NhcnkoKSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldFhNTE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCW1vZGVsLmRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRYTUxNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQltb2RlbC5lbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3bGluZVN0cmluZyhOb2RlIG5vZGUpIHsKLQkJLyoKLQkJICogV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIElET01Ob2RlLCBhbmQgSVN0cnVjdHVyZWREb2N1bWVudCwgYW5kCi0JCSAqIGNvbnNxdWVudGx5IGEgdmFsaWQgInByZWZlcnJlZCIgbGluZSBkZWxpbWl0ZXIsIGJ1dCBqdXN0IHRvIGJlCi0JCSAqIHNhZmUsIHdlJ2xsIGFzc2lnbiBzb21ldGhpbmcgYnkgZGVmYXVsdC4KLQkJICovCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0geG1sTm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCWlmIChnZXROb2RlKCkgIT0gbnVsbCkKLQkJCXJldHVybiAoKElET01Ob2RlKSBnZXROb2RlKCkpLmdldE1vZGVsKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRYTUxOb2RlKCkgewotCQlyZXR1cm4gKElET01Ob2RlKSBnZXROb2RlKCk7Ci0JfQotCi0JLyoKLQkgKiBEbyBub3RoaW5nIGZvciBTU0UsIHdlIHdpbGwgdG9sZXJhdGUgYW55dGhpbmcgdGhleSBhZGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogRG8gbm90aGluZyBmb3IgU1NFLCB3ZSB3aWxsIHRvbGVyYXRlIGFueXRoaW5nIHRoZXkgYWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW52YWxpZE11bHRpTm9kZXMoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnQoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCAiTm9kZSBtdXN0IGJlIGNvbm5lY3RlZCBpbnRvIHRoZSB0cmVlIik7IC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gY2FsY0luZGVudFN0cmluZyhub2RlKTsKLQotCQkvLyBJbmRlbnQgYmVmb3JlIHRoZSBzdGFydCB0YWcKLQkJaW5kZW50U3RhcnRUYWcoaW5kZW50U3RyaW5nLCBub2RlLCBtYXApOwotCi0JCS8vIEluZGVudCBiZWZvcmUgdGhlIGVuZCB0YWcKLQkJaW5kZW50RW5kVGFnKGluZGVudFN0cmluZywgbm9kZSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRlbnQgYmVmb3JlIHRoZSBlbmQgdGFnIG9mIHRoZSA8bm9kZT5wYXNzZWQgaW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50RW5kVGFnKFN0cmluZyBpbmRlbnRTdHJpbmcsIE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJaWYgKCFtYXAuc2hvdWxkSW5kZW50RW5kVGFnKCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBkb21QYXRoID0gbWFwLmdldERPTVBhdGgoKTsKLQotCQlpZiAoKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiAhbWFwLmlzRE9NVGV4dFZhbHVlKCkpIHx8IChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiBkb21QYXRoLmxlbmd0aCgpICE9IDApICYmIG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZG9tUGF0aCkpIHsKLQkJCVRleHQgbmV3V1MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShnZXROZXdsaW5lU3RyaW5nKG5vZGUpICsgaW5kZW50U3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUobm9kZSwgbmV3V1MsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5kZW50IGJlZm9yZSB0aGUgc3RhcnQgdGFnIG9mIHRoZSA8bm9kZT5wYXNzZWQgaW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50U3RhcnRUYWcoU3RyaW5nIGluZGVudFN0cmluZywgTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlUZXh0IG5ld1dTID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoZ2V0TmV3bGluZVN0cmluZyhub2RlKSArIGluZGVudFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJRE9NVXRpbGl0aWVzLmluc2VydEFmdGVyTm9kZShwYXJlbnQsIG5ld1dTLCBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNOb2RlU2libGluZyhub2RlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eVRhZyhFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gKChFbGVtZW50SW1wbCkgcGFyZW50KS5pc0VtcHR5VGFnKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgRE9NIG5vZGUgY2hhbmdlcy4gSXQgYXR0ZW1wdHMgdG8gdXBkYXRlCi0JICogTU9GIG9iamVjdCBiYXNlZCBvbiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnRE9NTm90aWZ5KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCi0JCWlmIChub3RpZmllciAhPSBnZXROb2RlKCkgJiYgZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQkvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBub3RpZmljYXRpb24gd2FzIHNlbnQgZnJvbSBhCi0JCQkvLyBzdWIgbm9kZS4gVXNlIHRoZSBub3RpZmllcnMgbmFtZSB0byBkZXRlcm1pbmUgd2hpY2gKLQkJCS8vIE1PRiBmZWF0dXJlIHRvIHVwZGF0ZS4gTm90ZSB0aGF0IGlzIGlzIGFzc3VtZWQgdGhhdCBpZgotCQkJLy8gdGhlIGV2ZW50VHlwZSBpcyBDSEFOR0UgdGhlbiBpdCBhdHRyaWJ1dGUgb24gYSBwYXRoIG5vZGUKLQkJCS8vIGNoYW5naW5nLiBUaGlzIHdhcyBwdXQgaW4gZm9yIHRoZSBFR0wgZ3JvdXAuCi0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCQkJRWxlbWVudCBub3RpZnlpbmdOb2RlID0gKEVsZW1lbnQpIG5vdGlmaWVyOwotCQkJCQlUcmFuc2xhdG9yIG1hcCA9IGZpbmRUcmFuc2xhdG9yKG5vdGlmeWluZ05vZGUuZ2V0Tm9kZU5hbWUoKSwgZmFsc2UpOwotCQkJCQlpZiAobWFwICE9IG51bGwpCi0JCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFVwZGF0ZSBldmVyeXRoaW5nIG9uIFNUUlVDVFVSRV9DSEFOR0Ugb3IgQ09OVEVOVF9DSEFOR0UuCi0JCQkvLyBPdGhlciBldmVudCB0eXBlcyBvY2N1ciB0b28gb2Z0ZW4uCi0JCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQkJdXBkYXRlTU9GKCk7Ci0JCQl9Ci0JCQkvLyBVcGRhdGUganVzdCB0aGUgYXR0cmlidXRlIHRoYXQgY2hhbmdlZC4KLQkJCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gZmluZFRyYW5zbGF0b3IoY2hhbmdlZEZlYXR1cmUudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkJaWYgKG1hcCAhPSBudWxsKQotCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXN1cGVyLnByZVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQlkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1BZGRET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkuYWRkQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlFbGVtZW50IG5ld05vZGUgPSBjcmVhdGVOZXdOb2RlKG1vZk9iamVjdCwgY2hpbGRNYXApOwotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VBZGFwdGVyKG1vZk9iamVjdCwgbmV3Tm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihub2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCXJldHVybiAoRU1GMkRPTUFkYXB0ZXIpICgoSURPTU5vZGUpIGFOb2RlKS5nZXRFeGlzdGluZ0FkYXB0ZXIoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1HZXRJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZmxhdE1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWludCBub2RlU3RhcnRPZmYgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCWludCBzdGFydE9mZiA9IE1hdGgubWF4KDAsIG5vZGVTdGFydE9mZiAtIDEwMCk7Ci0JCWludCBlbmRPZmYgPSBub2RlU3RhcnRPZmY7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZXh0ID0gZmxhdE1vZGVsLmdldChzdGFydE9mZiwgZW5kT2ZmIC0gc3RhcnRPZmYpOwotCi0JCQlpbnQgaW54ID0gdGV4dC5sZW5ndGgoKSAtIDE7Ci0JCQlpZiAoaW54ID49IDApIHsKLQkJCQlmb3IgKDsgaW54ID49IDA7IGlueC0tKSB7Ci0JCQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpbngpOwotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkgJiYgY2ggIT0gJ1xuJyAmJiBjaCAhPSAnXHInKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpbngrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKGlueCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkucmVtb3ZlQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCByZW9yZGVyRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSwgTm9kZSBpbnNlcnRCZWZvcmVOb2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlzdXBlci5yZW9yZGVyRE9NQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBpbnNlcnRCZWZvcmVOb2RlLCBtYXApOwotCQkvLyBTaW5jZSByZW9yZGVyaW5nIGRlbGV0ZXMgYWxsIHRoZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgbm9kZSwgd2UKLQkJLy8gbXVzdCBpbmRlbnQgLgotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSAhPSBudWxsICYmIGluc2VydEJlZm9yZU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCWluZGVudFN0YXJ0VGFnKGNhbGNJbmRlbnRTdHJpbmcoaW5zZXJ0QmVmb3JlTm9kZSksIGluc2VydEJlZm9yZU5vZGUsIG1hcCk7Ci0JCWVsc2UKLQkJCWluZGVudFN0YXJ0VGFnKGNhbGNJbmRlbnRTdHJpbmcoY2hpbGROb2RlKSwgY2hpbGROb2RlLCBtYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVtcHR5VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQkoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5zZXRFbXB0eVRhZyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVET00oKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpOwotCQkJcHJpbVVwZGF0ZURPTSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmNlNDI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLlJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFUmVuZGVyZXIgZXh0ZW5kcyBFTUYyRE9NUmVuZGVyZXIgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyLCBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGFib3V0VG9DaGFuZ2VOb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQmF0Y2hDaGFuZ2VzID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTYXZpbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXI7Ci0KLQkvKiogVGhlIFhNTCBET00gbW9kZWwgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIHhtbE1vZGVsOwotCi0JLyoqIFVzZWQgaW50ZXJuYWxseTsgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHhtbCBtb2RlbCAqLwotCXByb3RlY3RlZCBTdHJpbmcgeG1sTW9kZWxJZDsKLQotCXByb3RlY3RlZCBib29sZWFuIHhtbE1vZGVsUmV2ZXJ0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBFTUYyRE9NU1NFUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQkJaWYgKCFyZXNvdXJjZS5pc05ldygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQkJZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7Ci0JCW1vZGVsQWNjZXNzRm9yV3JpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZWUgYmF0Y2hNb2RlbEVuZAotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgYmF0Y2hNb2RlRW5kKCkgewotCQlnZXRYTUxNb2RlbCgpLmNoYW5nZWRNb2RlbCgpOwotCQlzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQlpc0JhdGNoQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGJhdGNoTW9kZVN0YXJ0IGFuZCBiYXRjaE1vZGVFbmQgaXMgYSBwYWlyIHRoYXQgY29udHJvbHMgbm90aWZpY2F0aW9ucywKLQkgKiBhbmQgdHJlYWQgYWNjZXNzLiBUaGV5IHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGluIGEgdHJ5L2ZpbmFsbHkgYmxvY2suCi0JICogCi0JICogc2V0QmF0Y2hNb2RlbCBiZWdpbnMgdGhlIHByb2Nlc3Npbmcgd2hlcmUgbm90aWZpY2F0aW9ucyBhcmUgbm90IHNlbnQKLQkgKiBvdXQgb24gZWFjaCBjaGFuZ2UsIGJ1dCBzYXZlZCB1cCB1bnRpbCB0aGUgZW5kQmF0Y2hNb2RlIGNhbGxlZC4KLQkgKiAKLQkgKiBUaGlzIHBhaXIgb2YgY2FsbHMgY2FuIGFsc28sIGluZGlyZWN0bHksICJsb2NrIiB0aGUgRE9NIE1vZGVsIHRvIGFjY2VzcwotCSAqIGZyb20gb25seSBvbmUgdGhyZWFkLCBzbyBpdCBzaG91bGQgbm90IGJlIGxvY2tlZCBmb3IgbG9uZyBwZXJpb2RzIG9mCi0JICogdGltZS4gVGhhdCdzIGFsc28gd2h5IGl0IGlzIGltcG9ydGFudCB0byBoYXZlIHRoZSBlbmRCYXRjaE1vZGUgaW4gYQotCSAqIGZpbmFsbHkgYmxvY2sgdG8gYmUgc3VyZSBpdCBpcyBhbHdheXMgY2FsbGVkLCBvciB0aGUgRE9NIHdpbGwgYmUgbGVmdAotCSAqIGluIGEgbG9ja2VkLCB1bnVzYWJsZSwgc3RhdGUgYW5kIG9ubHkgc2hvcnRseSBhd2F5IGZyb20gc2V2ZXJlcmUKLQkgKiBwcm9ncmFtIGVycm9yLgotCSAqIAotCSAqIDxwcmU+PGNvZGU+Ci0JICogRXhhbXBsZQotCSAqIDwvY29kZT4KLQkgKiAgCi0JICogIHRyeSB7IAotCSAqICAJCWJhdGNoTW9kZWxTdGFydCgpOwotCSAqICAJCS4uLmRvIGEgc29tZSB3b3JrIC4uLgotCSAqICAJCX0KLQkgKiAgCWZpbmFsbHkgewotCSAqICAJCWVuZEJhdGNoTW9kZSgpOwotCSAqICAJCX0KLQkgKiAgCi0JICogIAotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyB2b2lkIGJhdGNoTW9kZVN0YXJ0KCkgewotCQlpc0JhdGNoQ2hhbmdlcyA9IHRydWU7Ci0JCWdldFhNTE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCXNldFJvb3ROb2RlQWRhcHRlck5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnQgZ2l2ZW4KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50KCkgewotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2UoKTsKLQkJcmVzLnNldERlZmF1bHRzKCk7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBET01VdGlsaXRpZXMuY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0ocmVzLmdldERvY3R5cGUoKSwgcmVzLmdldFB1YmxpY0lkKCksIHJlcy5nZXRTeXN0ZW1JZCgpKTsKLQkJaWYgKGlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCUxpc3QgZm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUgKG51bGwgIT0gY29udGFpbmVyICYmICFjb250YWluZXIuZXhpc3RzKCkgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlmb2xkZXJzLmFkZChjb250YWluZXIpOwotCQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCUlGb2xkZXIgZm9sZGVyID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbGRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJZm9sZGVyID0gKElGb2xkZXIpIGZvbGRlcnMuZ2V0KGkpOwotCQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0KLQkJCQlmaWxlLmNyZWF0ZShpcywgdHJ1ZSwgbnVsbCk7Ci0JCQkJZmlsZS5zZXRMb2NhbCh0cnVlLCAxLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobnVsbCAhPSBpcykgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWluaXRpYWxpemVYTUxNb2RlbChmaWxlLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSVdBRTAwMTdFIFVuZXhwZWN0ZWQgSU8gZXhjZXB0aW9uIG9jY3VycmVkIGNyZWF0aW5nIHhtbCBkb2N1bWVudCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKG5lZWRzVG9DcmVhdGVET00pCi0JCQljcmVhdGVET01UcmVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZVJvb3RET01BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VBZGFwdGVyKGdldFJlc291cmNlKCksIGRvY3VtZW50LCB0aGlzLCBnZXRSZXNvdXJjZSgpLmdldFJvb3RUcmFuc2xhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlUmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJeG1sTW9kZWwucmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZVJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJeG1sTW9kZWwucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZXJlZ2lzdGVyRnJvbVhNTE1vZGVsKCkgewotCQlkZVJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJZGVSZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCQkvLyBUaGlzIHRyeS9jYXRjaCBibG9jayBpcyBhIGhhY2sgdG8gZml4IGRlZmVjdCAyMDQxMTQuIFRoaXMgb2NjdXJzCi0JCS8vIGJlY2F1c2UKLQkJLy8gdGhlIG1vZGVsIG1hbmFnZXIgcGx1Z2luIGlzIHNodXQgZG93biBhbmQgdW5sb2FkZWQgYmVmb3JlIHRoZSBqMmVlCi0JCS8vIHBsdWdpbi4KLQkJLy8gQ2FsbGluZyBnZXRNb2RlbE1hbmFnZXIoKSBjYW4gcmVzdWx0IGluIGEgY2xhc3MgY2FzdCBleGNlcHRpb24gdGhhdAotCQkvLyBzaG91bGQKLQkJLy8gYmUgaWdub3JlZC4KLQkJLy8gTW9kZWxNYW5hZ2VyIG1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnZXRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQlpbnQgd3JpdGVDb3VudCA9IHJlc291cmNlLmdldFdyaXRlQ291bnQoKTsKLQkJCWludCByZWFkQ291bnQgPSByZXNvdXJjZS5nZXRSZWFkQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd3JpdGVDb3VudDsgaSsrKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHJlYWRDb3VudDsgaWkrKykKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihyZXNvdXJjZS5lQWRhcHRlcnMoKSwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIucmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQl9Ci0JCXhtbE1vZGVsID0gbnVsbDsKLQkJeG1sTW9kZWxJZCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlpc1NhdmluZyA9IHRydWU7Ci0JCQlpZiAobnVsbCAhPSBvdXRwdXRTdHJlYW0pIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzaG91bGQgbm90IHVzZSBhbiBPdXRwdXRTdHJlYW0gZm9yIHNhdmluZyIpO30gLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCk7Ci0JCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpLmdldFN5bmNocm9uaXplcigpOwotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUpOwotCQkJCXhtbE1vZGVsLnNhdmUoYUZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlzeW5jaHJvbml6ZXIucmVtb3ZlRnJvbVJlY2VudGx5U2F2ZWRMaXN0KGFGaWxlKTsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlzU2F2aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSB4Tm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJcmV0dXJuIChFTUYyRE9NU1NFQWRhcHRlcikgeE5vZGUuZ2V0QWRhcHRlckZvcihFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWlmIChtb2RlbE1hbmFnZXIgPT0gbnVsbCkKLQkJCW1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlkIHVzZWQgdG8ga2V5IHRoZSBYTUwgcmVzb3VyY2UgaW4gdGhlIFhNTCBNb2RlbE1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbE1hbmFnZXJJZCgpIHsKLQkJaWYgKHhtbE1vZGVsSWQgPT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWxJZCA9IGdldE1vZGVsTWFuYWdlcigpLmNhbGN1bGF0ZUlkKGZpbGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJeG1sTW9kZWxJZCA9IHJlc291cmNlLmdldFVSSSgpICsgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhtbE1vZGVsSWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG1vZGVsIGZvciB0aGlzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTE1vZGVsSWQoKSB7Ci0JCXJldHVybiB4bWxNb2RlbElkOwotCX0KLQotCXByaXZhdGUgSURPTU1vZGVsIGluaXRpYWxpemVYTUxNb2RlbChJRmlsZSBmaWxlLCBib29sZWFuIGZvcldyaXRlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigoZmlsZSA9PSBudWxsKSA/ICJudWxsIiA6IGZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAoZm9yV3JpdGUpIHsKLQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WE1MTW9kZWwoKElET01Nb2RlbCkgZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpKTsKLQkJCX0KLQkJCXNldFhNTE1vZGVsSWQoZ2V0WE1MTW9kZWwoKS5nZXRJZCgpKTsKLQkJCW5lZWRzVG9DcmVhdGVET00gPSBmYWxzZTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JCXN5bmNSZWZlcmVuY2VDb3VudHMoaWQsIGZvcldyaXRlKTsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQlkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpIHsKLQkJcmV0dXJuIGlzQmF0Y2hDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuaXNEaXJ0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCB8fCB4bWxNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4geG1sTW9kZWwuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsIHx8IHhtbE1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB4bWxNb2RlbC5pc1NoYXJlZEZvckVkaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobnVsbCAhPSBpbikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2hvdWxkIG5vdCB1c2UgYW4gSW5wdXRTdHJlYW0gZm9yIGxvYWRpbmciKTt9IC8vJE5PTi1OTFMtMSQKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpbml0aWFsaXplWE1MTW9kZWwoZmlsZSwgKHJlc291cmNlLmdldFdyaXRlQ291bnQoKSAhPSAwKSk7Ci0JCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW5hZ2VzRE9NQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgIT0gbnVsbCkKLQkJCWFib3V0VG9DaGFuZ2VOb2RlID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vZGVsQWNjZXNzRm9yV3JpdGUoKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1vZGVsTWFuYWdlcklkKCk7Ci0JCWdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAoaXNCYXRjaENoYW5nZXMpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpZiAoYWJvdXRUb0NoYW5nZU5vZGUgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gYWJvdXRUb0NoYW5nZU5vZGUpIHsKLQkJCQltb2RlbEFjY2Vzc0ZvcldyaXRlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJeG1sTW9kZWxSZXZlcnRlZCA9IHRydWU7Ci0JCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGdldFhNTE1vZGVsKCkgIT0gbnVsbCkKLQkJCQkJCWdldFhNTE1vZGVsKCkucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJYWJvdXRUb0NoYW5nZU5vZGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJaWYgKCFpc0RpcnR5ICYmIHJlc291cmNlLmlzTW9kaWZpZWQoKSkgeyAvLyBUaGUgWE1MTW9kZWwgd2FzIHNhdmVkCi0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCQlsb25nIHN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsKLQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLnNldFN5bmhyb25pemF0aW9uU3RhbXAocmVzb3VyY2UsIHN0YW1wKTsKLQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSAoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUpOwotCQl9Ci0JCWlmIChpc0RpcnR5KQotCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBwcmlvciB0byBiZWluZyByZW1vdmVkIGZyb20gdGhlIFJlc291cmNlU2V0LgotCSAqIEVuc3VyZSB0aGF0IGFsbCByZWZlcmVuY2UgY291bnRzIHRvIHRoZSBYTUxNb2RlbCBhcmUgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByZVVubG9hZCgpIHsKLQkJZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQcmVNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFpc1NhdmluZykgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEKSB7Ci0JCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpICgoUHJvamVjdFJlc291cmNlU2V0KSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJCXN5bmNocm9uaXplci5wcmVTYXZlKGFGaWxlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAxMDo0OTo1MwotCSAqIEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCSgoSURPTU5vZGUpIGFOb2RlKS5yZW1vdmVBZGFwdGVyKChFTUYyRE9NU1NFQWRhcHRlcikgYW5BZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi54bWwuRU1GMkRPTVJlbmRlcmVyI3JlcGxhY2VEb2N1bWVudFR5cGUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURvY3VtZW50VHlwZShTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlSW1wbCkgZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocHVibGljSWQgPT0gbnVsbCAmJiBzeXN0ZW1JZCA9PSBudWxsKQotCQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jVHlwZSk7Ci0JCWVsc2UgewotCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBiYXRjaE1vZGVTdGFydCBhbmQgQmF0Y2hNb2RlRW5kIGluc3RlYWQgZXZlbiBpZiB5b3UgZG8KLQkgKiAgICAgICAgICAgICBub3QgdXNlIGJhdGNoTW9kZWxTdGFydC9FbmQsIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSB0aGUKLQkgKiAgICAgICAgICAgICB0cnkvZmluYWxseSBwYXR0ZXJuIGRvY3VtZW50ZWQgdGhlcmUuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKSB7Ci0KLQkJLy8gVGhpcyBpcyBzb21lIGV4dHJhIHByb2Nlc3NpbmcgZm9yIGNsaWVudHMgdG8ga25vdyB0aGV5IG1heSBiZSB1c2luZwotCQkvLyBpbmNvcnJlY3RseQotCQlpZiAoaXNCYXRjaCkgewotCQkJaWYgKGlzQmF0Y2hDaGFuZ2VzKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgInNldEJhdGNoIHdhcyBzZXQgdG8gdHJ1ZSB3aGVuIGl0IHdhcyBhbHJlYWR5IHRydWUuIFRoaXMgY2FuIGJlIGFuIGluZGljYXRpb24gb2YgaW52YWxpZCBjYWxsaW5nIG9yZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0KLQkJaWYgKGlzQmF0Y2gpIHsKLQkJCWJhdGNoTW9kZVN0YXJ0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXRjaE1vZGVFbmQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikgewotCQlFT2JqZWN0IHJvb3QgPSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocm9vdCwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGIpOwotCQkJCWlmIChiKQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbW9kZWwgZm9yIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MTW9kZWwoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCWRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCXRoaXMueG1sTW9kZWwgPSB4bWxNb2RlbDsKLQkJcmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlyZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsSWQoU3RyaW5nIGlkKSB7Ci0JCXhtbE1vZGVsSWQgPSBpZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlZmVyZW5jZUNvdW50cyhTdHJpbmcgaWQsIGJvb2xlYW4gZm9yV3JpdGUpIHsKLQkJaW50IGVkaXRJbmRleCA9IDAsIHJlYWRJbmRleCA9IDA7Ci0JCWlmIChmb3JXcml0ZSkKLQkJCWVkaXRJbmRleCsrOwotCQllbHNlCi0JCQlyZWFkSW5kZXgrKzsKLQkJaW50IHdyaXRlQ291bnQgPSByZXNvdXJjZS5nZXRXcml0ZUNvdW50KCk7Ci0JCWludCByZWFkQ291bnQgPSByZXNvdXJjZS5nZXRSZWFkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IHdyaXRlQ291bnQ7IGkgPiBlZGl0SW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCWZvciAoaW50IGkgPSByZWFkQ291bnQ7IGkgPiByZWFkSW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKSB7Ci0JCXJldHVybiB4bWxNb2RlbFJldmVydGVkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWQ5OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5IGV4dGVuZHMgUmVuZGVyZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCi0JcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VSZW5kZXJlcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9Db21wb25lbnRTZWFyY2hDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzFkY2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9Db21wb25lbnRTZWFyY2hDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IgIHsKLQotCXByb3RlY3RlZCBIYXNoTWFwIGRlY2xhcmF0aW9uczsKLQotCXByb3RlY3RlZCBIYXNoTWFwIHJlZmVyZW5jZXM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gbmFtZXNwYWNlczsKLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybiBnZXREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBjb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiAoWE1MU2VhcmNoUGF0dGVybikgZ2V0RGVjbGFyYXRpb25zKCkuZ2V0KGNvbXBvbmVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0RGVjbGFyYXRpb25zKCkgewotCQlpZiAoZGVjbGFyYXRpb25zID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVEZWNsYXJhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0UmVmZXJlbmNlcygpIHsKLQkJaWYgKHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldFJlZmVyZW5jZXNQYXR0ZXJucyhRdWFsaWZpZWROYW1lIGNvbXBvbmVudE5hbWUpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gKExpc3QpIGdldFJlZmVyZW5jZXMoKS5nZXQoY29tcG9uZW50TmFtZSk7Ci0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXJldHVybiAoWE1MU2VhcmNoUGF0dGVybltdKSByZWZlcmVuY2VzCi0JCQkJCS50b0FycmF5KG5ldyBYTUxTZWFyY2hQYXR0ZXJuW3JlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hQYXR0ZXJuWzBdOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhRdWFsaWZpZWROYW1lIGNvbXBvbmVudE5hbWUpewotCQlyZXR1cm4gZ2V0UmVmZXJlbmNlc1BhdHRlcm5zKGNvbXBvbmVudE5hbWUpLmxlbmd0aCA+IDAgfHwKLQkJCWdldERlY2xhcmF0aW9uUGF0dGVybihjb21wb25lbnROYW1lKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWROYW1lc3BhY2VzKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplRGVjbGFyYXRpb25zKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplUmVmZXJlbmNlcygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVN1cHBvcnRlZE5hbWVzcGFjZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9UYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxYjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9UYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4gewotCQotCVN0cmluZyBuYW1lc3BhY2VVUkk7Ci0JCi0JcHVibGljIFRhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4oaW50IG1hdGNoUnVsZSwgU3RyaW5nIG5hbWVzcGFjZXVyaSkgewotCQlzdXBlcihtYXRjaFJ1bGUpOwotCQluYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2V1cmk7Ci0JfQotCQotCXB1YmxpYyBUYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuKFN0cmluZyBuYW1lc3BhY2V1cmkpIHsKLQkJc3VwZXIoKTsKLQkJbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNldXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWY0NzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4gZXh0ZW5kcyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIHsKLQotCXB1YmxpYyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7Ci0JCXN1cGVyKG51bGwsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lLCBtYXRjaFJ1bGUpOwotCQkKLQl9Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKG51bGwsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQl9Ci0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhhOGE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm57Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUsIG1hdGNoUnVsZSk7Ci0JCQotCX0KLQotCXB1YmxpYyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIobnVsbCwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0JCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiZDA0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotLyoqCi0gKiBYTUwgY29tcG9uZW50IHNlYXJjaCBwYXR0ZXJuIGlzIGEgY29tcG9zaXRlIHBhdHRlcm4gdGhhdCBjb21iaW5lcyBYTUwgZWxlbWVudCBwYXR0ZXJuLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4gZXh0ZW5kcyBDb21wb25lbnRTZWFyY2hQYXR0ZXJuIHsKLQkKLQkvKioKLQkgKiBDb250YWluaW5nIGVsZW1lbnQgcGF0dGVybnMKLQkgKi8KLQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRyZW4gPSBuZXcgWE1MU2VhcmNoUGF0dGVyblswXTsKLQkKLQotCXB1YmxpYyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0KLQlwdWJsaWMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldENoaWxkcmVuKCl7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oWE1MU2VhcmNoUGF0dGVybltdIHBhdHRlcm5zKXsKLQkJY2hpbGRyZW4gPSBwYXR0ZXJuczsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJjZWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkNvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkZpbGVSZWZlcmVuY2VQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuQ29udGVudFR5cGVTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuWE1MU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuLlhNTFF1aWNrU2NhbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1BlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC9wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBYTUxTZWFyY2hQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQkvKgotIHB1YmxpYyAgYm9vbGVhbiBpbml0aWFsaXplKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nW10gY29udGVudFR5cGVzKXsKLQkJCi0JICAgIHN1cGVyLmluaXRpYWxpemUocGF0dGVybiwgY29udGVudFR5cGVzKTsKLQkJdGhpcy5zdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7Ci0JCQotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfSovCi0KLQkKLQotCXB1YmxpYyBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0KLQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgsIHRoaXMpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJYTUwgc2VhcmNoIHBhcnRpY2lwYW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaERvY3VtZW50IGRvY3VtZW50LAotCQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgICAgIC8vIFRPRE8uLi4gdXRpbGl6ZSBzZWFyY2ggb3B0aW9ucyAodGhhdCBzaG91bGQgZ2V0IHBhc3NlZCBkb3duIHZpYSB0aGUgU2VhcmNoRW5naW5lKQotICAgICAgICAvLyB0byBzcGVjaWZ5IGlmIGFjY3VyYXRlIHNvdXJjZSBjb29yZGluYXRlcyBhcmUgcmVxJ2QgaWYgbm90LCBzaW1wbHkgdXNlIHRoZSBTQVggcmVzdWx0cwotICAgICAgICAvLwotICAgICAgICBpZiAocGF0dGVybi5nZXRNYXRjaFJ1bGUoKSA9PSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZG9jdW1lbnQuZ2V0UGF0aCgpKSk7Ci0gICAgICAgICAgLy8gVE9ETy4uIGRvbid0IGFzc3VtZSB0aGUgY2F0ZWdvcnkgaXMgQ09NUE9ORU5UX0RFQ0wuLi4gaGFuZGxlIGFueSBhcmJpdGFydHkgY2F0ZWdvcnkKLSAgICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wsIG51bGwsIDApOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPLi4gZG9uJ3QgYXNzdW1lIHRoaXMgaXMganVzdCBhIGNvbXBvbmVudCBkZWNsYXJhdGlvbiBlbnRyeSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBlbnRyeSA9IChDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5KWVudHJpZXNbaV07Ci0gICAgICAgICAgICBTZWFyY2hNYXRjaCBzZWFyY2hNYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChudWxsLCAwLCAwLCBmaWxlKTsKLSAgICAgICAgICAgIHNlYXJjaE1hdGNoLm1hcC5wdXQoIm5hbWUiLCBlbnRyeS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZWFyY2hNYXRjaC5tYXAucHV0KCJtZXRhTmFtZSIsIGVudHJ5LmdldE1ldGFOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVxdWVzdG9yLmFjY2VwdFNlYXJjaE1hdGNoKHNlYXJjaE1hdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsgIGlmIChkb2N1bWVudC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQkJSURPTUVsZW1lbnQgY29udGV4dE5vZGUgPSAoSURPTUVsZW1lbnQpIGRvbU1vZGVsLmdldERvY3VtZW50KCkKLQkJCQkJLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJRE9NVmlzaXRvciB2aXNpdG9yID0gbmV3IERPTVZpc2l0b3IoZG9jdW1lbnQuZ2V0UGF0aCgpLCBwYXR0ZXJuLAotCQkJCQlyZXF1ZXN0b3IpOwotCQkJdmlzaXRvci52aXNpdChjb250ZXh0Tm9kZSk7Ci0JCX0KLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIFBhdHRlcm5NYXRjaGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKFBhdHRlcm5NYXRjaGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyVHlwZSkgJiYKLQkJCQkoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybiB8fAotCQkJCWFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pICkgewotCQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcigpOwotCQl9IAotCQlyZXR1cm4gbnVsbDsgCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBET01WaXNpdG9yIHsKLQotCQlTdHJpbmcgcGF0aDsKLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yOwotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyOwotCi0JCQotCQlwcm90ZWN0ZWQgRE9NVmlzaXRvcihTdHJpbmcgcGF0aCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAotCQkJCVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJCQotCQkJbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlcilwYXR0ZXJuLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQl9Ci0JCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdChOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQltYXRjaCgoRWxlbWVudClub2RlKTsKLQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIGFOb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCQkJdmlzaXQoYU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBtYXRjaChFbGVtZW50IG5vZGUpIHsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLQkJCQkJbmV3IFBhdGgocGF0aCkpOwotCQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCQltYXRjaGVyLmxvY2F0ZU1hdGNoZXMocGF0dGVybiwgZmlsZSwgbm9kZSwgcmVxdWVzdG9yKTsKLQkJCX0KLQotCQkJCi0JCX0KLQotCX0KLQotCXB1YmxpYyBTZWFyY2hTY29wZSBzZWxlY3REb2N1bWVudExvY2F0aW9ucyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8qCi0JCSAqIGdhdGUgIzE6IHJlZHVjZSB0aGUgc2NvcGUgdG8gdGhlIGZpbGVzIHdpdGggdGhlIGNvbnRlbnQgdHlwZSB0aGF0Ci0JCSAqIGNvdWxkIGJlIHNlYXJjaGVkIHVzaW5nIHRoaXMgcGFydGljaXBhbnQKLQkJICovIAotCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZXMoKTsJCi0JCWlmKGNvbnRlbnRUeXBlcyAhPSBudWxsICYmIGNvbnRlbnRUeXBlcy5sZW5ndGggPiAwKXsKLQkJCXNjb3BlID0gbmV3IENvbnRlbnRUeXBlU2VhcmNoU2NvcGUoc2NvcGUsIGNvbnRlbnRUeXBlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNlbGVjdERvY3VtZW50TG9jYXRpb25zKHBhdHRlcm4sIHNjb3BlLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yIGdldFNlYXJjaENvbnRyaWJ1dG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIGJlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpIHsKLQkJCi0JCXN1cGVyLmJlZ2luU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKXsKLQkJCVhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldERlY2xhcmF0aW9uUGF0dGVybihjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJaWYoY2hpbGRQYXR0ZXJuICE9IG51bGwpewotCQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCSAgICAgCQkJY29tcG9uZW50UGF0dGVybi5zZXRDaGlsZHJlbihuZXcgWE1MU2VhcmNoUGF0dGVybltde2NoaWxkUGF0dGVybn0pOwotCQkJfQotCQkJCi0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybil7Ci0JCQlYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuIGNvbXBvbmVudFBhdHRlcm4gPSAoWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMgPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldFJlZmVyZW5jZXNQYXR0ZXJucyhjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBjaGlsZFBhdHRlcm5zW2ldOwotCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldExvY2FsTmFtZSgpKTsKLQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZSgpKTsJCQkJCi0JCQl9Ci0JCQljb21wb25lbnRQYXR0ZXJuLnNldENoaWxkcmVuKGNoaWxkUGF0dGVybnMpOwotCQkJCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogVGhlIGludGVuZCBvZiB0aGlzIG1ldGhvZCBpcyB0byBsaW1pdCB0aGUgc2VhcmNoIHRvIHRoZSBmaWxlcyB0aGF0IGhhdmUgY29udGVudCAKLQkgKiB3aGljaCBjYW4gYmUgc2VhcmNoZWQgZm9yIHRoZSBnaXZlbiBwYXR0ZXJuLiBJdCBpcyBjYWxsZWQgZnJvbSAKLQkgKiB7QGxpbmsgI3NlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4sIFNlYXJjaFNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybiB0aGUgc2VhcmNoIHBhdHRlcm4gdGhhdCBpcyBzZWFyY2hlZCBmb3IKLQkgKiBAcmV0dXJuIGNvbnRlbnQgdHlwZSdzIHVuaXF1ZSBpZGVudGlmaWVycyB0aGF0IGNvdWxkIGJlIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCk7Ci0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKXBhdHRlcm4uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCX0KLQkJWE1MUXVpY2tTY2FuLnBvcHVsYXRlU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnQsIG1hdGNoZXIsIHBhdHRlcm4pOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJLy8gVE9ETzogdXNlIHRoZSBmaWxlIHJlZmVyZW5jZSBlbnRyaWVzIGluIHRoZSBkb2N1bWVudHMgdG8gcmVkdWNlIHRoZSBzY29wZSB0byB0aGUgcmVmZXJlbmNlZCBmaWxlcyBvbmx5Ci0JCS8vIFNlYXJjaERvY3VtZW50W10gZG9jdW1lbnRzID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnRzKGlkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzZWFyY2ggcGF0dGVybiBpcyBxdWFsaWZpZWQgYnkgYSBmaWxlIGxvY2F0aW9uCi0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB3ZSBjYW4gdXNlIGZpbGUgc2NvcGluZyBydWxlcyB0byBwcnVuZSB0aGUgbWF0Y2hlcwotICAgICAgICBJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBDb21wb25lbnRTZWFyY2hQYXR0ZXJuKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U2VhcmNoUGF0dGVybiBjb21wb25lbnRTZWFyY2hQYXR0ZXJuID0gKENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLSAgICAgICAgICB0YXJnZXRGaWxlID0gY29tcG9uZW50U2VhcmNoUGF0dGVybi5nZXRGaWxlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0JCQotICAgICAgICAKLQkJLy8gaGVyZSB3ZSBzaG91bGQgaGF2ZSBpbiBzY29wZSBvbmx5IHJlZmVyZW5jZWQgZmlsZXMKLQkJSUZpbGVbXSBmaWxlcyA9IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCk7ICAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJewotCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCVNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnQocGF0aCwgaWQpOyAKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJeyAgICAgICAgICAgICAgCi0JCQlFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKGdldFNlYXJjaEVudHJ5Q2F0ZWdvcnkocGF0dGVybiksIG51bGwsIDApOyAgICAgICAgICAgCi0JCQlpZiAoKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHx8IChzZWFyY2hPcHRpb25zICE9IG51bGwgJiYgc2VhcmNoT3B0aW9ucy5nZXQoInNlYXJjaERpcnR5Q29udGVudCIpICE9IG51bGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL2ZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgIC8vICBFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVudHJ5ICIgKyBlbnRyeS5nZXRDYXRlZ29yeSgpICsgIiAiICsgZW50cnkuZ2V0S2V5KCkgKyAiICIgKyBlbnRyeS5nZXRDbGFzcygpLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy99ICAKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGJvb2xlYW4gaXNJblNjb3BlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKHRhcmdldEZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlzSW5TY29wZSA9IGlzTGlua2VkKGRvY3VtZW50U2V0LCAiZmlsZTovLy8iICsgcGF0aCwgImZpbGU6Ly8vIiArIHRhcmdldEZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAvL2lmIChwYXRoLmVuZHNXaXRoKCJDYW5jZWxTZWxlY3Rpb24ud3NkbCIpICAmJiBwYXRoLmluZGV4T2YoImNsb25lMSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAvLyAgZmlsZVJlZmVyZW5jZVRhYmxlLmRlYnVnKHF1YWxpZmllZFBhdGgsIDAsIDUpOwotICAgICAgICAgICAgICAgICAgLy99ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoaXNJblNjb3BlKQotICAgICAgICAgICAgICB7IAotCQkJICAgIHRoaXMubG9jYXRlTWF0Y2hlcyhwYXR0ZXJuLCBkb2N1bWVudCwgcmVxdWVzdG9yLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlpZiAoZGVidWdQZXJmKQotCQl7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGdldERlc2NyaXB0aW9uKCkKLQkJCQkJCQkrICI6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICJtcyBmb3IgbG9jYXRlTWF0Y2hlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCQotCX0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMaW5rZWQoU2VhcmNoRG9jdW1lbnRTZXQgc2V0LCBTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBpc0xpbmtlZChzZXQsIHNvdXJjZSwgdGFyZ2V0LCBuZXcgSGFzaE1hcCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkKFNlYXJjaERvY3VtZW50U2V0IHNldCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCwgSGFzaE1hcCB2aXNpdGVkKQotICAgIHsKLSAgICAgIGlmIChzb3VyY2UuZXF1YWxzKHRhcmdldCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6Ly8vIjsgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKGZpbGVQcm90b2NvbCkpCi0gICAgICB7ICAgIAotICAgICAgICAKLSAgICAgIFNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gc2V0Ll90ZW1wR2V0U2VhcmNoRG9jdW1ldG4oc291cmNlLnN1YnN0cmluZyhmaWxlUHJvdG9jb2wubGVuZ3RoKCkpKTsgICAgICAKLSAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsgICAgICAgIAotICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKElYTUxTZWFyY2hDb25zdGFudHMuUkVGLCBudWxsLCAwKTsKLSAgICAgICAgU3RyaW5nW10gcmVzb2x2ZUVudHJ5ID0gbmV3IFN0cmluZ1tlbnRyaWVzLmxlbmd0aF07ICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwotICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIEZpbGVSZWZlcmVuY2VFbnRyeSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlUmVmZXJlbmNlRW50cnkgZmlsZVJlZmVyZW5jZUVudHJ5ID0gKEZpbGVSZWZlcmVuY2VFbnRyeSllbnRyeTsKLSAgICAgICAgICAgIC8vIFRPRE8uLiByZWNvcmQgYW4gdXRpbGl6ZSB0aGUgcHVibGljIGlkIGZyb20gdGhlIGZpbGVSZWZlcmVuY2VFbnRyeQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChmaWxlUmVmZXJlbmNlRW50cnkuZ2V0UmVsYXRpdmVGaWxlUGF0aCgpICE9IG51bGwpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gdXJpUmVzb2x2ZXIucmVzb2x2ZShzb3VyY2UsIG51bGwsIGZpbGVSZWZlcmVuY2VFbnRyeS5nZXRSZWxhdGl2ZUZpbGVQYXRoKCkpOwotICAgICAgICAgICAgICByZXNvbHZlRW50cnlbal0gPSByZXNvbHZlZFVSSTsKLSAgICAgICAgICAgICAgaWYgKHJlc29sdmVkVVJJLmVxdWFscyh0YXJnZXQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbm93IHNlZSBpZiB0aGVyZSdzIGFuIGluZGlyZWN0IGxpbmsgZnJvbSB0aGUgc291cmNlIHRvIHRoZSB0YXJnZXQKLSAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB0aGUgbm9kZXMgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRvIGF2b2lkIGN5Y2xlcwotICAgICAgICBpZiAodmlzaXRlZC5nZXQoc291cmNlKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRlZC5wdXQoc291cmNlLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSByZXNvbHZlRW50cnlbal07Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCAmJiBpc0xpbmtlZChzZXQsIHJlc29sdmVFbnRyeVtqXSwgdGFyZ2V0LCB2aXNpdGVkKSkgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgIAotICAgICAgICAgIH0gICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgCi0gICAgICB9IAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgIAotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlYXJjaEVudHJ5Q2F0ZWdvcnkoU2VhcmNoUGF0dGVybiBwYXR0ZXJuKXsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybil7Ci0JCQlyZXR1cm4gSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfREVDTDsKLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKXsKLQkJCXJldHVybiBJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9SRUY7Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgRmlsZVJlZmVyZW5jZVBhdHRlcm4pewotCQkgICByZXR1cm4gSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2I1OGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFhNTFNlYXJjaFBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuewotCQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzZWFyY2hOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzZWFyY2hOYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHBhcmVudE5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgaW50IGRlcHRoID0gLTE7Ci0KLSAgICBwdWJsaWMgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lLFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAJdGhpcyhlbGVtZW50TmFtZXNwYWNlLCBwYXJlbnRFbGVtZW50TmFtZSwgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIC0xKTsKLSAgICB9Ci0JCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICB0aGlzKGVsZW1lbnROYW1lc3BhY2UsIG51bGwsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCAtMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgZGVwdGgpIHsKLSAgICAJdGhpcyhlbGVtZW50TmFtZXNwYWNlLCBudWxsLCBlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgZGVwdGgpOyAgICAgICAKLSAgICB9Ci0gICAgICAgICAgIAotICAgIHByaXZhdGUgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgZGVwdGgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICAgICAgICB0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnRFbGVtZW50TmFtZTsKLSAgICAgICAgdGhpcy5lbGVtZW50TmFtZXNwYWNlID0gZWxlbWVudE5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoOwotICAgIH0KLSAgICAKLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybigpewotCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gYXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaE5hbWUoKSB7Ci0JCXJldHVybiBzZWFyY2hOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gc2VhcmNoTmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaE5hbWUoU3RyaW5nIHNlYXJjaE5hbWUpIHsKLQkJdGhpcy5zZWFyY2hOYW1lID0gc2VhcmNoTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hOYW1lc3BhY2UoU3RyaW5nIHNlYXJjaE5hbWVzcGFjZSkgewotCQl0aGlzLnNlYXJjaE5hbWVzcGFjZSA9IHNlYXJjaE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZXNwYWNlKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWVzcGFjZSA9IGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCi0gIHB1YmxpYyBpbnQgZ2V0RGVwdGgoKQotICB7Ci0gICAgcmV0dXJuIGRlcHRoOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKQotICB7Ci0gICAgdGhpcy5kZXB0aCA9IGRlcHRoOwotICB9Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQlyZXR1cm4gcGFyZW50TmFtZTsKLX0KLQotcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgcGFyZW50TmFtZSkgewotCXRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7Ci19Ci0JCi0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9JWE1MU2VhcmNoQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9JWE1MU2VhcmNoQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjBkODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvSVhNTFNlYXJjaENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDsKLQotcHVibGljIGludGVyZmFjZSBJWE1MU2VhcmNoQ29uc3RhbnRzCi17Ci0JCVN0cmluZyBSRUY9ICJvdXRMaW5rIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ09NUE9ORU5UX0RFQ0wgPSAiY29tcG9uZW50RGVjbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENPTVBPTkVOVF9SRUYgPSAiY29tcG9uZW50RGVjbCI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FlMjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5pbXBsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0JCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGJpbmQobWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcGFyYW0gYmluZGluZyB0aGUgb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgYmluZGluZykgewotCQlyZXR1cm4gYmluZChtZXNzYWdlLCBuZXcgT2JqZWN0W10ge2JpbmRpbmd9KTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHBhcmFtIGJpbmRpbmcxIEFuIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIGJpbmRpbmcyIEEgc2Vjb25kIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGJpbmRpbmcxLCBPYmplY3QgYmluZGluZzIpIHsKLQkJcmV0dXJuIGJpbmQobWVzc2FnZSwgbmV3IE9iamVjdFtdIHtiaW5kaW5nMSwgYmluZGluZzJ9KTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHBhcmFtIGJpbmRpbmdzIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGJpbmRpbmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBiaW5kaW5ncyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9YTUxTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvWE1MU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwOGFkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9YTUxTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXJ0aWNpcGFudDsKLQotcHVibGljIGNsYXNzIFhNTFNlYXJjaERvY3VtZW50IGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCUlET01Nb2RlbCBtb2RlbDsKLQlNYXAgZW50cmllcyA9IG5ldyBIYXNoTWFwKCk7IC8vIGNhdGVnb3J5IC0+IHNldCAoZW50cnkpCQotCi0JcHVibGljIFhNTFNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgsIFhNTFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0JCXN1cGVyKGRvY3VtZW50UGF0aCwgcGFydGljaXBhbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoKSB7Ci0JCWlmKG1vZGVsID09IG51bGwpewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0aW5nIERPTSBmb3IgIiArIGdldFBhdGgoKSk7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZ2V0UGF0aCgpKSk7Ci0JCQlpZihmaWxlICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gKElET01Nb2RlbClTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBFbnRyeVtdIGdldEVudHJpZXMoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcga2V5LCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJLy8gVE9ETyB1c2UgbWF0Y2hSdWxlCi0JCVNldCByZXN1bHRzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYoY2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlTZXQgdmFsdWVzID0gKFNldCllbnRyaWVzLmdldChjYXRlZ29yeSk7Ci0JCQlpZih2YWx1ZXMgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuIG5ldyBFbnRyeVswXTsKLQkJCX0KLQkJCWlmKGtleSA9PSBudWxsIHx8ICIiLmVxdWFscyhrZXkpIHx8ICIqIi5lcXVhbHMoa2V5KSl7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGVudHJpZXMgd2l0aCBhbnkga2V5IGluIHRoZSBnaXZlbiBjYXRlZ29yeQotCQkJCXJlc3VsdHMuYWRkQWxsKHZhbHVlcyk7Ci0JCQl9Ci0JCQllbHNlewotCQkJCS8vIGVudHJpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCXsKLQkJCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlpZihrZXkuZXF1YWxzKGVudHJ5LmdldEtleSgpKSl7Ci0JCQkJCQlyZXN1bHRzLmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gKEVudHJ5W10pIHJlc3VsdHMudG9BcnJheShuZXcgRW50cnlbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShFbnRyeSBlbnRyeSkKLQl7Ci0JCWlmKGVudHJ5LmdldENhdGVnb3J5KCkgIT0gbnVsbCl7Ci0JCQlTZXQgdmFsdWVzID0gKFNldCllbnRyaWVzLmdldChlbnRyeS5nZXRDYXRlZ29yeSgpKTsKLQkJCWlmKHZhbHVlcyA9PSBudWxsKXsKLQkJCQllbnRyaWVzLnB1dChlbnRyeS5nZXRDYXRlZ29yeSgpLCB2YWx1ZXM9bmV3IEhhc2hTZXQoKSk7Ci0JCQl9Ci0JCQl2YWx1ZXMuYWRkKGVudHJ5KTsKLQkJfQotCQkKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7ICAgICAKLSAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOyAgICAgICAgCi0gICAgICB9ICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTBmNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgbWF0Y2hpbmcgaW1wbGVtZW50YXRpb24uICAKLSAqIDxwPgotICogU3ViY2xhc3NlcyBvZiB0aGUgUGF0dGVybk1hdGNoZXMgc2hvdWxkIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWNpZmljIHBhdHRlcm4gbWF0Y2hpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgb2YgdGhlIFBhdHRlcm5NYXRjaGVzIHNob3VsZCBiZSBzZXQgYXMgYWRhcHRlcnMgZm9yIHRoZSBwYXR0ZXJucyB0aGF0IHRoZXkgbWF0Y2guCi0gKiA8L3A+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQjc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoKX0gd2lsbCBjYWxsIAotICogeyBAbGluayBQYXR0ZXJuTWF0Y2hlciNtYXRjaGVzKCkgfSBvbiB0aGUgYWRhcHRlciBvbiBwYXR0ZXJuIG1hdGNoZXIuCi0gKiAKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCNsb2NhdGVNYXRjaGVzKCl9IHdpbGwgY2FsbCAKLSAqIHsgQGxpbmsgUGF0dGVybk1hdGNoZXIjbG9jYXRlTWF0Y2hlcygpIH0gb24gdGhlIGFkYXB0ZXIgb24gcGF0dGVybiBtYXRjaGVyLgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhdHRlcm5NYXRjaGVyIHsKLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGRpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uIHRvIHRoZSByZXF1ZXN0b3IgaWYgdGhlcmUgYXJlIG1hdGNoZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgYW5zd2VycyBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIGVsZW1lbnQsIGl0IGRvZXMgbm90IGdpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE9iamVjdCBlbGVtZW50KTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2VhcmNoTWF0Y2ggY3JlYXRlU2VhcmNoTWF0Y2goSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlKQotICAgIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmKGF0dHJpYnV0ZU5vZGUgaW5zdGFuY2VvZiBJRE9NQXR0cil7Ci0gICAgICAgICAgICBJRE9NQXR0ciBkb21BdHRyID0gKElET01BdHRyKWF0dHJpYnV0ZU5vZGU7Ci0gICAgICAgICAgICBzdGFydCA9IGRvbUF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotICAgICAgICAgICAgbGVuZ3RoID0gZG9tQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBTZWFyY2hNYXRjaCBtYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChhdHRyaWJ1dGVOb2RlLCBzdGFydCwgbGVuZ3RoLCBmaWxlKTsKLSAgICAgICAgcmV0dXJuIG1hdGNoOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXRjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElGaWxlIGZpbGUsIEF0dHIgYXR0cmlidXRlTm9kZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkTWF0Y2ggIiArIHBhdHRlcm4gKyAiICIgKyBhdHRyaWJ1dGVOb2RlLmdldE5hbWUoKSArICI9IiArIGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWUoKSk7Ci0JCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQlTZWFyY2hNYXRjaCBtYXRjaCA9IGNyZWF0ZVNlYXJjaE1hdGNoKGZpbGUsIGF0dHJpYnV0ZU5vZGUpOyAgICAgICAgICAgICAgICAKLQkJCQlpZihyZXF1ZXN0b3IgIT0gbnVsbCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXF1ZXN0b3IuYWNjZXB0U2VhcmNoTWF0Y2gobWF0Y2gpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvU0FYU2VhcmNoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVjNGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotcHVibGljIGNsYXNzIFNBWFNlYXJjaEVsZW1lbnR7Ci0JQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwotCVN0cmluZyBlbGVtZW50TmFtZTsKLQlTdHJpbmcgZWxlbWVudE5hbWVzcGFjZTsKLQlNYXAgbmFtZXNwYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsgLy8gTWFwIG9mIHN0cmluZyBwcmVmaXgga2V5cyBhbmQgbmFtZXNwYWNlCi0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIHBhcmVudE5hbWU7Ci0gICAgaW50IGRlcHRoID0gLTE7Ci0JCi0JcHVibGljIFNBWFNlYXJjaEVsZW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCXB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlTWFwKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlTWFwOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVzcGFjZShTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSkgewotCQl0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VNYXAoTWFwIG5hbWVzcGFjZU1hcCkgewotCQl0aGlzLm5hbWVzcGFjZU1hcCA9IG5hbWVzcGFjZU1hcDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotICBwdWJsaWMgaW50IGdldERlcHRoKCkKLSAgewotICAgIHJldHVybiBkZXB0aDsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpCi0gIHsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gIH0KLXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQlyZXR1cm4gcGFyZW50TmFtZTsKLX0KLXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIHBhcmVudE5hbWUpIHsKLQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotfQotCQotCQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9YTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWMzZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyIGV4dGVuZHMgUGF0dGVybk1hdGNoZXJ7Ci0JCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVOYW1lc3BhY2VGb3JQcmVmaXgoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotCXsKLQkgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCSAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkKLQkgIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJewotCQkgIEVsZW1lbnQgZSA9IChFbGVtZW50KW5vZGU7Ci0JCSAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAoInhtbG5zOiIgKyBwcmVmaXgpIDogInhtbG5zIjsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgIHJlc3VsdCA9IGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCQkgIGlmIChyZXN1bHQgIT0gbnVsbCkKLQkJICB7Ci0JCQkgYnJlYWs7ICAKLQkJICB9CSAgCi0JCX0JCi0JICB9CSAgCi0JICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWE1MU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBFbGVtZW50IGRvbUVsZW1lbnQpIHsKLQkKLQkJCXBhdHRlcm4uc2V0RWxlbWVudE5hbWUoZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0JCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lc3BhY2UoZG9tRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAvLyBUT0RPIChjcykgc2V0IHRoZSBkZXB0aCBhdHRyaWJ1dGUgb24gdGhlIHBhdHRlcm4KLSAgICAgICAgICAgIC8vCi0JCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShwYXR0ZXJuLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQkgaWYoYWN0dWFsVmFsdWUgIT0gbnVsbCl7Ci0JCQkJCWludCBuID0gYWN0dWFsVmFsdWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmKG4gPiAwKXsKLQkJCQkJCVN0cmluZyBwcmVmaXggPSBhY3R1YWxWYWx1ZS5zdWJzdHJpbmcoMCwgbik7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUuc3Vic3RyaW5nKG4rMSkpOyAgICAgIAotCQkJCQkJCi0JCQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gY29tcHV0ZU5hbWVzcGFjZUZvclByZWZpeChkb21FbGVtZW50LCBwcmVmaXgpOwotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUpOwotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoZG9tRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJICAgIH0KLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWE1MU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTQVhTZWFyY2hFbGVtZW50IHNheEVsZW1lbnQpIHsKLQkJCi0JCXBhdHRlcm4uc2V0RWxlbWVudE5hbWUoc2F4RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZXNwYWNlKHNheEVsZW1lbnQuZ2V0RWxlbWVudE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcGF0dGVybi5zZXREZXB0aChzYXhFbGVtZW50LmdldERlcHRoKCkpOwotICAgICAgICBwYXR0ZXJuLnNldFBhcmVudE5hbWUoc2F4RWxlbWVudC5nZXRQYXJlbnROYW1lKCkpOwotCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBzYXhFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShwYXR0ZXJuLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCSBpZihhY3R1YWxWYWx1ZSAhPSBudWxsKXsKLQkJCQlpbnQgbiA9IGFjdHVhbFZhbHVlLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKG4gPiAwKXsKLQkJCQkJU3RyaW5nIHByZWZpeCA9IGFjdHVhbFZhbHVlLnN1YnN0cmluZygwLCBuKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lKGFjdHVhbFZhbHVlLnN1YnN0cmluZyhuKzEpKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoKFN0cmluZylzYXhFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpLmdldChwcmVmaXgpKTsKLQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZSk7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKHNheEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQkJCX0KLQkJICAgIH0KLQkKLQl9Ci0JCi0JWE1MU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuOwotCQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JfQotCi0JCi0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGRpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uIHRvIHRoZSByZXF1ZXN0b3IgaWYgdGhlcmUgYXJlIG1hdGNoZXMKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXsKLQkJCVhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gKChYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKWNoaWxkUGF0dGVybnNbaV0uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQkJbWF0Y2hlciA9IHRoaXM7Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQkJCW1hdGNoZXIubG9jYXRlTWF0Y2hlcyhjaGlsZFBhdHRlcm5zW2ldLCBmaWxlLCBlbGVtZW50LCByZXF1ZXN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuKXsKLQkJCWlmKG1hdGNoZXMocGF0dGVybiwgZWxlbWVudCkpewotCQkJCUF0dHIgYXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCgoWE1MU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQkJCWFkZE1hdGNoKHBhdHRlcm4sIGZpbGUsIGF0dHJpYnV0ZSwgcmVxdWVzdG9yKTsKLQkJCX0KLQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgb25seSBhbnN3ZXJzIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgZWxlbWVudCwgaXQgZG9lcyBub3QgZ2l2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgT2JqZWN0IGVsZW1lbnQpewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRQYXR0ZXJucyA9ICgoWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlciljaGlsZFBhdHRlcm5zW2ldLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQkJCW1hdGNoZXIgPSB0aGlzOwotCQkJCX0KLQkJCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJCQlpZihtYXRjaGVyLm1hdGNoZXMoY2hpbGRQYXR0ZXJuc1tpXSwgZWxlbWVudCkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybil7Ci0JCQkKLQkJCVhNTFNlYXJjaFBhdHRlcm4gcG9zc2libGVNYXRjaCA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCk7Ci0JCQlwb3NzaWJsZU1hdGNoLnNldEF0dHJpYnV0ZU5hbWUoKChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCl7Ci0JCQkJaW5pdGlhbGl6ZShwb3NzaWJsZU1hdGNoLCAoRWxlbWVudCllbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFNBWFNlYXJjaEVsZW1lbnQpewotCQkJCWluaXRpYWxpemUocG9zc2libGVNYXRjaCwgKFNBWFNlYXJjaEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQlzZWFyY2hQYXR0ZXJuID0gKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLQkJCXJldHVybiBtYXRjaGVzUGF0dGVybihwb3NzaWJsZU1hdGNoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNQYXR0ZXJuKFNlYXJjaFBhdHRlcm4gcGF0dGVybikgewotCQlpZihzZWFyY2hQYXR0ZXJuICE9IG51bGwgJiYgcGF0dGVybiBpbnN0YW5jZW9mIFhNTFNlYXJjaFBhdHRlcm4pewotCQkJWE1MU2VhcmNoUGF0dGVybiBkZWNvZGVkUGF0dGVybiA9IChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm47Ci0gICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldEVsZW1lbnROYW1lKCkpICYmICAgICAgICAgICAgICAgICAgICAKLQkJCQkJc2VhcmNoUGF0dGVybi5nZXRFbGVtZW50TmFtZXNwYWNlKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldEVsZW1lbnROYW1lc3BhY2UoKSkpeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldFBhcmVudE5hbWUoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgZGVjb2RlZFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAhc2VhcmNoUGF0dGVybi5nZXRQYXJlbnROYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFBhcmVudE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgCi0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgaWYoc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIioiLmVxdWFscyhzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICBlbHNlIGlmKHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkgPT0gbnVsbCl7Ci0JCQkJCXJldHVybiBzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJcmV0dXJuIHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkpICYmCi0JCQkJCXNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFNlYXJjaE5hbWVzcGFjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0gICAgCi0gICAgcHJvdGVjdGVkIFNlYXJjaE1hdGNoIGNyZWF0ZVNlYXJjaE1hdGNoKElGaWxlIGZpbGUsIEF0dHIgYXR0cmlidXRlTm9kZSkKLSAgICB7Ci0gICAgICBTZWFyY2hNYXRjaCBtYXRjaCA9IHN1cGVyLmNyZWF0ZVNlYXJjaE1hdGNoKGZpbGUsIGF0dHJpYnV0ZU5vZGUpOwotICAgICAgLy8gdG9kby4uLiByZW1vdmUgdGhpcyB1Z2x5IGhhY2shIQotICAgICAgaWYgKCJuYW1lIi5lcXVhbHMoYXR0cmlidXRlTm9kZS5nZXROYW1lKCkpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKCJ0b2RvLWNvbXB1dGUtdGFyZ2V0TmFtZXNwYWNlIiwgYXR0cmlidXRlTm9kZS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtYXRjaC5tYXAucHV0KCJuYW1lIiwgcXVhbGlmaWVkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIC8vRWxlbWVudCBlbGVtZW50ID0gYXR0cmlidXRlTm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAvL2lmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpCi0gICAgICAvL3sgICAgICAgIAotICAgICAgLy99ICAKLSAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTY2NjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLnF1aWNrc2NhbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbgotewotICAgIC8qCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBmdWxsRmlsZVBhdGgpCi0JewotCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKCk7Ci0JCXBhcnNlRmlsZShmdWxsRmlsZVBhdGgsIGhhbmRsZXIpOwotCQlyZXR1cm4gaGFuZGxlci5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ki8KLQkKLQkvKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgbWF0Y2hlcyBlbmNvdW50ZXJlZCBiYXNlZCBvbiB0aGUgY3JpdGVyaWEKLQkgKiBwcm92aWRlZC4KLQkgKgotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNYXRjaChTdHJpbmcgZnVsbEZpbGVQYXRoLCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKG1hdGNoZXIsIHBhdHRlcm4pOwotCQlwYXJzZUZpbGUoZnVsbEZpbGVQYXRoLCBoYW5kbGVyKTsKLQkJcmV0dXJuIGhhbmRsZXIuaGFzTWF0Y2goKTsKLQl9Ki8KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcG9wdWxhdGVTZWFyY2hEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgUGF0dGVybk1hdGNoZXIgbWF0Y2hlciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKQotCXsKLQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihkb2N1bWVudCwgbWF0Y2hlciwgcGF0dGVybik7Ci0JCXBhcnNlRmlsZShkb2N1bWVudC5nZXRQYXRoKCksIGhhbmRsZXIpOwotCQlyZXR1cm4gaGFuZGxlci5oYXNNYXRjaCgpOwotCX0KLQotICAgIHByaXZhdGUgc3RhdGljIFhNTFJlYWRlciByZWFkZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MUmVhZGVyIGdldE9yQ3JlYXRlUmVhZGVyKCkKLSAgICB7Ci0gICAgICAgaWYgKHJlYWRlciA9PSBudWxsKQotICAgICAgIHsKLSAgICAgICAgIHRyeQotICAgICAgICAgewotICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOyAgCi0gICAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBJbnRlcm5hbEVycm9ySGFuZGxlcigpKTsgICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgIH0KLSAgICAgICB9IAotICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBjbGFzcyBJbnRlcm5hbEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlcgotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgeyAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgcGFyc2VGaWxlKFN0cmluZyBmdWxsRmlsZVBhdGgsCi0JCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyKQotCXsKLQkJRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5Ci0JCXsgICAgICAgICAgICAKLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmdWxsRmlsZVBhdGgpKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBnZXRPckNyZWF0ZVJlYWRlcigpOwotICAgICAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlRmlsZSIgKyByZWFkZXIgKyAiICgiICsgIGZ1bGxGaWxlUGF0aCArICIpIik7CQkJCi0JCQlyZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBza2lwIHRoZSBmaWxlCi0JCX0gCi0JCWZpbmFsbHl7Ci0JCQlpZihpbnB1dFN0cmVhbSAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY2FuIG5vdCBkbyBtdWNoIAotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkODdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5Db21wb25lbnRSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuU0FYU2VhcmNoRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBTQVggY29udGVudCBoYW5kbGVyLCBpdCBzaG91bGQgYmUgcmVjeWNsZWQgYmVmb3JlIHNjYW5uaW5nIGEgZmlsZSBmb3IgdGhlIG5ldyBTZWFyY2hQYXR0ZXJuLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLQlwcml2YXRlIE1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBNYXAgb2Ygc3RyaW5nIHByZWZpeCBrZXlzIGFuZCBuYW1lc3BhY2UKLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCXByaXZhdGUgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQ7ICAvLyB3ZSdsbCBhZGQgdXNlZnVsIGVudHJpZXMgaW4gdGhlIHNlYXJjaCBkb2N1bWVudCBhcyB3ZSBwYXJzaW5nCi0JcHJpdmF0ZSBTQVhTZWFyY2hFbGVtZW50IHNlYXJjaEVsZW1lbnQgPSBuZXcgU0FYU2VhcmNoRWxlbWVudCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdGFjayBjdXJyZW50UGF0aCA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgUGF0dGVybk1hdGNoZXIgbWF0Y2hlcjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7IC8vJE5PTi1OTFMtMSQKLQotCQotCXB1YmxpYyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQl9Ci0JCi0JcHVibGljIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQkKLQlwdWJsaWMgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwKLQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotCXsJCi0JCS8vIFNlYXJjaCBmb3IgdGFyZ2V0TmFtZXNwYWNlIGlmIHdlIGhhdmVuJ3QgZW5jb3VudGVyZWQgaXQgeWV0LgotCQlpZiAodGFyZ2V0TmFtZXNwYWNlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJaW50IG5BdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJpYnV0ZXM7IGkrKykKLQkJCXsKLQkJCQlpZiAoInRhcmdldE5hbWVzcGFjZSIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQl0YXJnZXROYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNvbGxlY3QgbGluayBpbmZvCi0gICAgCi0gICAgLy8gVE9ETyBUaGlzIGNvZGUgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gZGVsZWdhdGUgdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi0gICAgLy8gZGV0ZWN0IGxpbmtzIGJldHdlZW4gZmlsZXMgdG8gdGhlIHNlYXJjaCBwcm92aWRlcnMvY29udHJpYnV0b3JzLgotICAgIC8vIFRoZSBjdXJyZW50IGNvZGUgb25seSBoYW5kbGVzIHRoZSBYU0QgYW5kIFdTREwgY2FzZXMuIAotICAgIAotCQlpZigiaW1wb3J0Ii5lcXVhbHMobG9jYWxOYW1lKSAmJiBuYW1lc3BhY2VNYXRjaGVzKHVyaSkpeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlUmVmZXJlbmNlRW50cnkgZG9jdW1lbnRFbnRyeSA9IG5ldyBGaWxlUmVmZXJlbmNlRW50cnkoKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5SRUYpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRLZXkoImltcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZXNwYWNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKHVyaSkpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudEVudHJ5LnNldFB1YmxpY0lkZW50aWZpZXIobmFtZXNwYWNlKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0UmVsYXRpdmVGaWxlUGF0aChsb2NhdGlvbik7ICAgICAgICAgICAgCi0JCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJfQotCQlpZigoInJlZGVmaW5lIi5lcXVhbHMobG9jYWxOYW1lKXx8ICJpbmNsdWRlIi5lcXVhbHMobG9jYWxOYW1lKSkgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmFtZXNwYWNlTWF0Y2hlcyh1cmkpKXsKLQkJCUZpbGVSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IEZpbGVSZWZlcmVuY2VFbnRyeSgpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRDYXRlZ29yeShJWE1MU2VhcmNoQ29uc3RhbnRzLlJFRik7Ci0JCQlkb2N1bWVudEVudHJ5LnNldEtleSgiaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGdldExvY2F0aW9uQXR0cmlidXRlTmFtZSh1cmkpKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnRFbnRyeS5zZXRQdWJsaWNJZGVudGlmaWVyKHVyaSk7Ci0JCQlkb2N1bWVudEVudHJ5LnNldFJlbGF0aXZlRmlsZVBhdGgobG9jYXRpb24pOwotCQkJZG9jdW1lbnQucHV0RW50cnkoZG9jdW1lbnRFbnRyeSk7Ci0JCX0KLQkJCi0JCQotICAgICAgICAvLyBpc3N1ZSAoY3MpIHlvdSBtYXkgd2FudCB0byB0cnkgcGVyZiBtZWFzdXJlbWVudHMgdG8gY29tcGF0ZSByZXVzaW5nIHRoZSBzYW1lCi0gICAgICAgIC8vIGluc3RhbmNlIG9mIGEgU0FYU2VhcmNoRWxlbWVudCBpbnN0ZWFkIG9mIG5ld2luZyBvbmUgZWFjaCB0aW1lIAotCQkvL1hNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCBzZWFyY2hFbGVtZW50ID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCgpOwotCQlzZWFyY2hFbGVtZW50LnNldEVsZW1lbnROYW1lKGxvY2FsTmFtZSk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0RWxlbWVudE5hbWVzcGFjZSh1cmkpOwotCQlzZWFyY2hFbGVtZW50LnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0TmFtZXNwYWNlTWFwKG5hbWVzcGFjZU1hcCk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0JCWlmIChjdXJyZW50UGF0aC5zaXplKCkgPiAwKQotCQl7Ci0JCSAgU3RyaW5nIHBhcmVudE5hbWUgPSAoU3RyaW5nKWN1cnJlbnRQYXRoLnBlZWsoKTsKLQkJICBzZWFyY2hFbGVtZW50LnNldFBhcmVudE5hbWUocGFyZW50TmFtZSk7Ci0JCX0JCQkKLQkKLQotCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJaWYobWF0Y2hlci5tYXRjaGVzKHBhdHRlcm4sIHNlYXJjaEVsZW1lbnQpKXsKLQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJCQlDb21wb25lbnRSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZUVudHJ5KCk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGKTsKLQkJCQkJUXVhbGlmaWVkTmFtZSBuYW1lID0gbmV3IFF1YWxpZmllZE5hbWUodXJpLCBsb2NhbE5hbWUpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50LnB1dEVudHJ5KGRvY3VtZW50RW50cnkpOwotCQkJCX0KLQkJCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pewotCQkJCQlDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5IGRvY3VtZW50RW50cnkgPSBuZXcgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSgpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldENhdGVnb3J5KElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wpOwotICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIG5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSh0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKHVyaSwgbG9jYWxOYW1lKTsgICAgICAgICAgICAgICAgICAgIAotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0TWV0YU5hbWUobWV0YU5hbWUpOwotCQkJCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3VycmVudFBhdGgucHVzaChsb2NhbE5hbWUpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZiAoWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSkKLSAgICB7Ci0gICAgICByZXR1cm4gInNjaGVtYUxvY2F0aW9uIjsKLSAgICB9Ci0gICAgCi0gICAgZWxzZSBpZiAoV1NETF9OQU1FU1BBQ0UuZXF1YWxzKHVyaSkpCi0gICAgewotICAgICAgcmV0dXJuICJsb2NhdGlvbiI7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VNYXRjaGVzKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSB8fAotICAgICAgICAgIFdTRExfTkFNRVNQQUNFLmVxdWFscyh1cmkpOwotICB9Ci0JCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQljdXJyZW50UGF0aC5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsYmFjayBmb3IgU0FYIHBhcnNlcgotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQlpZiAoYXJnMCAhPSBudWxsICYmIGFyZzAubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQl0aGlzLm5hbWVzcGFjZU1hcC5wdXQoYXJnMCwgYXJnMSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNYXRjaCgpIHsKLQkJcmV0dXJuIGhhc01hdGNoOwotCX0KLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRvckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDRjNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB0aGUgWE1MIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBDcmFpZyBTYWx0ZXIsIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9ySGVscGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBMaXN0IG5hbWVzcGFjZVVSSUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzR3JhbW1hckVuY291bnRlcmVkID0gZmFsc2U7ICAgIAotICBwdWJsaWMgYm9vbGVhbiBpc0RUREVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHVibGljIFN0cmluZyBzY2hlbWFMb2NhdGlvblN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBpbnQgbnVtRFRERWxlbWVudHMgPSAwOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JIZWxwZXIoKQotICB7Ci0gIH0KLSAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYTUwgUmVhZGVyLgotICAgKiAKLSAgICogQHJldHVybiBBbiBYTUwgUmVhZGVyIGlmIG9uZSBjYW4gYmUgY3JlYXRlZCBvciBudWxsLgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgICAKLSAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAKLSAgICByZWFkZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKTsgICAgIAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZXh0ZXJuYWwtZHRkIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBNeUNvbnRlbnRIYW5kbGVyKHVyaSkpOwotICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IEludGVybmFsRXJyb3JIYW5kbGVyKCkpOyAKLQotICAgIExleGljYWxIYW5kbGVyIGxleGljYWxIYW5kbGVyID0gbmV3IExleGljYWxIYW5kbGVyKCkKLSAgICB7ICAgICAgCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydERURCAoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgewotICAgICAgICBpc0dyYW1tYXJFbmNvdW50ZXJlZCA9IHRydWU7ICAgCi0gICAgICAgIGlzRFRERW5jb3VudGVyZWQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLSAKLSAgICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQgKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfTsKLSAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGxleGljYWxIYW5kbGVyKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHJldHVybiByZWFkZXI7Ci0gIH0gIAotCi0gIC8qKgotICAgKiBBbiBlcnJvciBoYW5kbGVyIHRvIHN1cHByZXNzIGVycm9yIGFuZCB3YXJuaW5nIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICB7Ci0JcHVibGljIEludGVybmFsRXJyb3JIYW5kbGVyKCkKLQl7Ci0JICBzdXBlcigpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICB9Ci0KLSAKLSAgLyoqCi0gICAqIEZpZ3VyZXMgb3V0IHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlciBBIGhlbHBlciB0byByZXNvbHZlIGxvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXB1dGVWYWxpZGF0aW9uSW5mb3JtYXRpb24oU3RyaW5nIHVyaSwgUmVhZGVyIGNoYXJhY3RlclN0cmVhbSwgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gY3JlYXRlWE1MUmVhZGVyKHVyaSk7ICAKLSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICBpbnB1dFNvdXJjZS5zZXRDaGFyYWN0ZXJTdHJlYW0oY2hhcmFjdGVyU3RyZWFtKTsKLSAgICAgIHJlYWRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7ICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotICAKLSAKLQotICAvKioKLSAgICogSGFuZGxlIHRoZSBjb250ZW50IHdoaWxlIHBhcnNpbmcgdGhlIGZpbGUuCi0gICAqLwotICBjbGFzcyBNeUNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcgotICB7ICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIGJvb2xlYW4gaXNSb290RWxlbWVudCA9IHRydWU7Ci0gICAgU3RyaW5nIGJhc2VVUkk7Ci0gICAgCi0gICAgTXlDb250ZW50SGFuZGxlcihTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgIHRoaXMuYmFzZVVSSSA9IHVyaTsgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcHJlZml4OwotICAgIH0gICAgCi0gICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5wcmVmaXhlZE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhlZE5hbWUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCA/IHByZWZpeCArICI6IiArIGxvY2FsTmFtZSA6IGxvY2FsTmFtZTsgICAgICAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyByYXdOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpCi0gICAgeyAgICAgIAotICAgICAgLy9TdHJpbmcgZXhwbGljaXRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaXNSb290RWxlbWVudCkKLSAgICAgIHsgIAotICAgICAgICAKLSAgICAgICAgaXNSb290RWxlbWVudCA9IGZhbHNlOyAgCi0gICAgICAgIGludCBuQXR0cyA9IGF0dHMuZ2V0TGVuZ3RoKCk7ICAgIAotICAgICAgICBTdHJpbmcgc2NoZW1hSW5zdGFuY2VQcmVmaXggPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0wOyBpIDwgbkF0dHM7IGkrKykKLSAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRzLmdldFFOYW1lKGkpOyAgICAgICAKLSAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInhtbG5zIikgfHwgYXR0cmlidXRlTmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpc05hbWVzcGFjZUVuY291bnRlcmVkID0gdHJ1ZTsgICAgCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRzLmdldFZhbHVlKGkpOyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy53My5vcmcvIikgJiYgdmFsdWUuZW5kc1dpdGgoIi9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjaGVtYUluc3RhbmNlUHJlZml4ID0gYXR0cmlidXRlTmFtZS5lcXVhbHMoInhtbG5zIikgPyAiIiA6IGdldFVucHJlZml4ZWROYW1lKGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgocmF3TmFtZSk7Ci0gICAgICAgIFN0cmluZyByb290RWxlbWVudE5hbWVzcGFjZURlY2xhcmF0aW9uTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/ICJ4bWxuczoiICsgcHJlZml4IDogInhtbG5zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIFN0cmluZyByb290RWxlbWVudE5hbWVzcGFjZSA9IHJvb3RFbGVtZW50TmFtZXNwYWNlRGVjbGFyYXRpb25OYW1lICE9IG51bGwgPyBhdHRzLmdldFZhbHVlKHJvb3RFbGVtZW50TmFtZXNwYWNlRGVjbGFyYXRpb25OYW1lKSA6IG51bGw7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCB3ZSB1c2UgYW55ICd4c2k6c2NoZW1hTG9jYXRpb24nIG9yICd4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbicgYXR0cmlidXRlCi0gICAgICAgIC8vIHRvIGRldGVybWluZSBhIGxvY2F0aW9uCi0gICAgICAgIGlmIChzY2hlbWFJbnN0YW5jZVByZWZpeCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgbG9jYXRpb24gPSBhdHRzLmdldFZhbHVlKGdldFByZWZpeGVkTmFtZShzY2hlbWFJbnN0YW5jZVByZWZpeCwgIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIAlTdHJpbmcgc2NoZW1hTG9jID0gYXR0cy5nZXRWYWx1ZShnZXRQcmVmaXhlZE5hbWUoc2NoZW1hSW5zdGFuY2VQcmVmaXgsICJzY2hlbWFMb2NhdGlvbiIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGxvY2F0aW9uID0gZ2V0U2NoZW1hTG9jYXRpb25Gb3JOYW1lc3BhY2Uoc2NoZW1hTG9jLCByb290RWxlbWVudE5hbWVzcGFjZSk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgICBpZiAocm9vdEVsZW1lbnROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJvb3RFbGVtZW50TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VVUkksIHJvb3RFbGVtZW50TmFtZXNwYWNlLCBsb2NhdGlvbik7ICAgIAotICAgICAgICBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oYmFzZVVSSSwgcm9vdEVsZW1lbnROYW1lc3BhY2UsIGxvY2F0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIGlzR3JhbW1hckVuY291bnRlcmVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJLy8gRG8gbm90aGluZy4KLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgCWlmKGlzICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkgIHRyeQotICAgICAgICAJICB7Ci0gICAgICAgIAkgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgCSAgfQotICAgICAgICAJICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgCSAgewotICAgICAgICAJCS8vIERvIG5vdGhpbmcuCi0gICAgICAgIAkgIH0KLSAgICAgICAgCX0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0gICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNlbGVtZW50RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZWwpIAotICAgIHsKLSAgICAgIG51bURUREVsZW1lbnRzKys7Ci0gICAgfQotICAgIAotICAgIC8vIFRoZSB4c2lTY2hlbWFMb2NhdGlvblZhbHVlIGlzIGEgbGlzdCBvZiBuYW1lc3BhY2UvbG9jYXRpb24gcGFpcnMgdGhhdCBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgCi0gICAgLy8gdGhpcyBtZXRob2Qgd2Fsa3MgdGhlIGxpc3Qgb2YgcGFpcnMgbG9va2luZyBmb3IgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQKLSAgICAvLyBsb2NhdGlvbi4KLSAgICAvLyAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JOYW1lc3BhY2UoU3RyaW5nIHhzaVNjaGVtYUxvY2F0aW9uVmFsdWUsIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgeyAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoeHNpU2NoZW1hTG9jYXRpb25WYWx1ZSAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICAKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih4c2lTY2hlbWFMb2NhdGlvblZhbHVlKTsKLSAgICAgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoc3QubmV4dFRva2VuKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgICAKLSAgfSAgIAotICAgICAgIAotICAKLSAgLyoqCi0gICAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBpbiB0aGUgc3RyaW5nIG9mIHRoZSBvbGQgcGF0dGVybiB3aXRoIHRoZSBuZXcgcGF0dGVybi4KLSAgICogCi0gICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJucyBpbi4KLSAgICogQHBhcmFtIG9sZFBhdHRlcm4gVGhlIG9sZCBwYXR0ZXJuIHRvIHJlcGxhY2UuCi0gICAqIEBwYXJhbSBuZXdQYXR0ZXJuIFRoZSBwYXR0ZXJuIHVzZWQgZm9yIHJlcGxhY2VtZW50LgotICAgKiBAcmV0dXJuIFRoZSBtb2RpZmllZCBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyYW5jZXMgb2Ygb2xkUGF0dGVybiByZXBsYWNlZCBieSBuZXcgUGF0dGVybi4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIG9sZFBhdHRlcm4sIFN0cmluZyBuZXdQYXR0ZXJuKQotICB7ICAgICAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZFBhdHRlcm4sIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdQYXR0ZXJuICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIG9sZFBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgICBpbmRleCA9IGluZGV4ICsgb2xkUGF0dGVybi5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI3MDgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEFuIFhNTCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYWxsb3dzIHNldHRpbmcgc3BlY2lmaWMgY29uZmlndXJhdGlvbgotICogaW5mb3JtYXRpb24gZm9yIGEgV1RQIFhNTCB2YWxpZGF0aW9uIHJ1bi4gQW55IGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzCi0gKiBzZXQgb24gdGhpcyBjb25maWd1cmF0aW9uIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCB0aG9zZSBmcm9tCi0gKiBwYXJzZXJzIHN1Y2ggYXMgWGVyY2VzLiAoVGhpcyBvYmplY3QgZG9lcyBub3QgYnkgZGVmYXVsdCB3cmFwIGZlYXR1cmVzCi0gKiBhbmQgcHJvcGVydGllcyBmcm9tIHNwZWNpZmljIHBhcnNlcnMuKQotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5fTk9fR1JBTU1BUiA9ICJXQVJOX05PX0dSQU1NQVIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgYm9vbGVhbiB3YXJuX25vX2dyYW1tYXJfdmFsdWUgPSBmYWxzZTsKLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoV0FSTl9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIHdhcm5fbm9fZ3JhbW1hcl92YWx1ZSA9IHZhbHVlOwotCWVsc2UKLQkgIHRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGZlYXR1cmUuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCBkZWZpbmVkCi0gICAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGZlYXR1cmUncyB2YWx1ZSwgdHJ1ZSBvciBmYWxzZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoV0FSTl9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIHJldHVybiB3YXJuX25vX2dyYW1tYXJfdmFsdWU7Ci0JCi0JdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc5YmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLQotCi0vKioKLSAqIEEgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBvYmplY3Qgc3BlY2lmaWMgdG8gWE1MIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uSW5mbyBleHRlbmRzIFZhbGlkYXRpb25JbmZvIGltcGxlbWVudHMgWE1MVmFsaWRhdGlvblJlcG9ydAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZHRkRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbmFtZXNwYWNlRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGludCBlbGVtZW50RGVjbENvdW50ID0gMDsKLSAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RXJyb3JLZXk7Ci0gIHByb3RlY3RlZCBPYmplY3QgbWVzc2FnZUFyZ3VtZW50c1tdID0gbnVsbDsKLSAgcHJvdGVjdGVkIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIEEgc3RhY2sgb2Ygc3RhcnQgdGFnIGxvY2F0aW9ucywgdXNlZCB0byBtb3ZlIGVycm9ycwotICAgKiByZXBvcnRlZCBhdCB0aGUgY2xvc2UgdGFnIHRvIGJlIHJlcG9ydGVkIGF0IHRoZSBzdGFydCB0YWcuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RhY2sgc3RhcnRFbGVtZW50TG9jYXRpb25zID0gbmV3IFN0YWNrKCk7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhpcyByZXBvcnQgZGVzY3JpYmVzLgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25JbmZvKFN0cmluZyB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dyYW1tYXJFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gZ3JhbW1hckVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkIG9yIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSBncmFtbWFyRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHcmFtbWFyRW5jb3VudGVyZWQoYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQpCi0gIHsKLSAgICB0aGlzLmdyYW1tYXJFbmNvdW50ZXJlZCA9IGdyYW1tYXJFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQoKQotICB7Ci0gICAgcmV0dXJuIGR0ZEVuY291bnRlcmVkICYmIGVsZW1lbnREZWNsQ291bnQgPT0gMDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIGEgRFREIHdpdGhvdXQgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZHRkV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkIFNldCB0cnVlIGlmIGEgRFREIHdpdGhvdXQgYW4KLSAgICogICAgICAgICBlbGVtZW50IGRlY2xhcmF0aW9uIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RFRERW5jb3VudGVyZWQoYm9vbGVhbiBkdGRFbmNvdW50ZXJlZCkKLSAgewotICAgIHRoaXMuZHRkRW5jb3VudGVyZWQgPSBkdGRFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBhIG5hbWVzcGFjZSB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VFbmNvdW50ZXJlZChib29sZWFuIG5hbWVzcGFjZUVuY291bnRlcmVkKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VFbmNvdW50ZXJlZCA9IG5hbWVzcGFjZUVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogSW5jcmVhc2UgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY291bnQgZm9yIERURCBlbGVtZW50cyBieSBvbmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbmNyZWFzZUVsZW1lbnREZWNsYXJhdGlvbkNvdW50KCkKLSAgewotICAgIHRoaXMuZWxlbWVudERlY2xDb3VudCsrOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uQ291bnQoaW50IGNvdW50KQotICB7Ci0gIAllbGVtZW50RGVjbENvdW50ID0gY291bnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFhNTCBsb2NhdG9yIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYTUwgbG9jYXRvciBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgWE1MTG9jYXRvciBnZXRYTUxMb2NhdG9yKCkKLSAgewotICAgIHJldHVybiBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBYTUxMb2NhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGxvY2F0b3IgVGhlIFhNTExvY2F0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0WE1MTG9jYXRvcihYTUxMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IGVycm9yIGtleS4KLSAgICogCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudEVycm9yS2V5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50RXJyb3JLZXkoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRFcnJvcktleTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgY3VycmVudCBlcnJvciBrZXkuCi0gICAqIAotICAgKiBAcGFyYW0gY3VycmVudEVycm9yS2V5IFRoZSBjdXJyZW50RXJyb3JLZXkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVycm9yS2V5KFN0cmluZyBjdXJyZW50RXJyb3JLZXkpCi0gIHsKLSAgICB0aGlzLmN1cnJlbnRFcnJvcktleSA9IGN1cnJlbnRFcnJvcktleTsKLSAgfQotCi1wdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpIHsKLQlyZXR1cm4gbWVzc2FnZUFyZ3VtZW50czsKLX0KLQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlQXJndW1lbnRzKE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQl0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YXJ0IGVsZW1lbnRzIGxvY2F0aW9ucy4KLSAgICogCi0gICAqIEByZXR1cm4gCi0gICAqIAkJQSBzdGFjayBjb250YWluaW5nIHRoZSBzdGFydCBlbGVtZW50IGxvY2F0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBTdGFjayBnZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0RWxlbWVudExvY2F0aW9uczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgY3VzdG9taXphdGlvbiBtYW5hZ2VyIGZvciB0aGlzIHZhbGlkYXRpb24gcnVuLgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJVGhlIGVycm9yIGN1c3RvbWl6YXRpb24gbWFuYWdlciBmb3IgdGhpcyB2YWxpZGF0aW9uIHJ1bi4KLSAgICovCi0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKQotICB7Ci0JICBpZihlcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyID09IG51bGwpCi0JICB7Ci0JCSAgZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciA9IG5ldyBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCk7Ci0JICB9Ci0JICByZXR1cm4gZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDAyMmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBWYWxpZGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi54bWx2YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPQkxFTVNfVkFMSURBVElOR19VTktOT1dOX0hPU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfRklMRV9OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9OT19HUkFNTUFSOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblJlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk0ZDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW9uIGEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIFhNTCB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MVmFsaWRhdGlvblJlcG9ydCBleHRlbmRzIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHcmFtbWFyRW5jb3VudGVyZWQoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIGEgbmFtZXNwYWNlIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNkMmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTGF6eVVSTElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHZhbGlkYXRpb24gdXNpbmcgYSB4ZXJjZXMgc2F4IHBhcnNlci4gIAotICogSGVyZSdzIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIGRldGFpbHMgOiAKLSAqICAgLSBhbiBFcnJvckhhbmRsZXIgaXMgdXNlZCB0byBjb2xsZWN0IGVycm9ycyBpbnRvIGEgbGlzdCAoc28gdGhleSBtYXkgYmUgZGlzcGxheWVkIGJ5IHRoZSBVSSkKLSAqICAgLSBhbiBFbnRpdHlSZXNvbHZlciBpcyB1c2VkIGFsb25nIHdpdGggdGhlIHhlcmNlcyAiZXh0ZXJuYWwtc2NoZW1hTG9jYXRpb24iIHByb3BlcnR5IHRvIGltcGxlbWVudCBYTUwgQ2F0YWxvZyBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gbnVsbDsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBpbmdvcmVkRXJyb3JLZXlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJvdGVjdGVkIFNldCBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0ID0gbmV3IFRyZWVTZXQoKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfQUxXQVlTID0gIklHTk9SRV9BTFdBWVMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wgPSAiSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFTUFUVVJFX0VPRiA9ICJQcmVtYXR1cmVFT0YiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRUxFTUVOVF9UWVBFX01VU1RfTUFUQ0hfRE9DVFlQRURFQ0wgPSAiUm9vdEVsZW1lbnRUeXBlTXVzdE1hdGNoRG9jdHlwZWRlY2wiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19FTEVNRU5UX05PVF9ERUNMQVJFRCA9ICJNU0dfRUxFTUVOVF9OT1RfREVDTEFSRUQiOyAvLyROT04tTkxTLTEkCi0gIAotICAvLyBXVFAgWE1MIHZhbGlkYXRvciBzcGVjaWZpYyBrZXkuCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0dSQU1NQVJfRk9VTkQgPSAiTk9fR1JBTU1BUl9GT1VORCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05PVF9GT1VORF9LRVkgPSAiRklMRV9OT1RfRk9VTkQiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRvcigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEhlcmUgd2UgYWRkIHNvbWUgZXJyb3Iga2V5cyB0aGF0IHdlIG5lZWQgdG8gZmlsdGVyIG91dCB3aGVuIHdlJ3JlIHZhbGlkYXRpb24gCi0gICAgLy8gYWdhaW5zdCBhIERURCB3aXRob3V0IGFueSBlbGVtZW50IGRlY2xhcmF0aW9ucy4gICAgICAgCi0gICAgaW5nb3JlZEVycm9yS2V5VGFibGUucHV0KFBSRU1BVFVSRV9FT0YsIElHTk9SRV9BTFdBWVMpOwotICAgIGluZ29yZWRFcnJvcktleVRhYmxlLnB1dChST09UX0VMRU1FTlRfVFlQRV9NVVNUX01BVENIX0RPQ1RZUEVERUNMLCBJR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMKTsKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoTVNHX0VMRU1FTlRfTk9UX0RFQ0xBUkVELCBJR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMKTsKLSAgICAKLSAgICAvLyBIZXJlIHdlIGFkZCBzb21lIGVycm9yIGtleXMgdGhhdCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yLgotICAgIC8vIFRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkanVzdGVkIHRvIHBsYWNlIHRoZSBtZXNzYWdlIG9uIHRoZSBsaW5lIG9mIHRoZSBzdGFydGluZwotICAgIC8vIGVsZW1lbnQgaW5zdGVhZCBvZiBvbiB0aGUgbGluZSBvZiB0aGUgY2xvc2luZyBlbGVtZW50LgotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJNU0dfQ09OVEVOVF9JTlZBTElEIik7Ci0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoIk1TR19DT05URU5UX0lOQ09NUExFVEUiKTsKLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuYiIpOwotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJjdmMtY29tcGxleC10eXBlLjIuMyIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgVVJJIFJlc29sdmVyIHRvIHVzZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlciBUaGUgVVJJIFJlc29sdmVyIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gICAgdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotICAgIC8vZW50aXR5UmVzb2x2ZXIgPSBuZXcgTXlFbnRpdHlSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gIH0KLQotIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFhNTCBSZWFkZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIFhNTCByZWFkZXIgb3IgbnVsbCBpZiB1bnN1Y2Nlc3NmdWwuCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihmaW5hbCBYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvLCBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgICAKLSAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAvLyBtb3ZlIHRvIFhlcmNlcy0yLi4uIGFkZCB0aGUgY29udGV4dENsYXNzTG9hZGVyIHN0dWZmCi0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24odmFsaW5mbyk7Ci0gICAgICByZWFkZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoY29uZmlndXJhdGlvbikKLSAgICAgIHsKLSAgICAJcHJpdmF0ZSBYTUxMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotICAgIAkKLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciB0aGVMb2NhdG9yLCBqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nLCBOYW1lc3BhY2VDb250ZXh0IG5zY29udGV4dCwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMgYXVncykgCi0gICAgICAgIHsKLSAgICAgICAgICBsb2NhdG9yID0gdGhlTG9jYXRvcjsKLSAgICAgICAgICB2YWxpbmZvLnNldFhNTExvY2F0b3IodGhlTG9jYXRvcik7Ci0gICAgICAgICAgc3VwZXIuc3RhcnREb2N1bWVudCh0aGVMb2NhdG9yLCBlbmNvZGluZywgbnNjb250ZXh0LCBhdWdzKTsgCi0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5BYnN0cmFjdFNBWFBhcnNlciNzdGFydEVsZW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MQXR0cmlidXRlcywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUU5hbWUgYXJnMCwgWE1MQXR0cmlidXRlcyBhcmcxLCBBdWdtZW50YXRpb25zIGFyZzIpIHRocm93cyBYTklFeGNlcHRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnB1c2gobmV3IExvY2F0aW9uQ29vcmRpbmF0ZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCQkgIHN1cGVyLnN0YXJ0RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsKLQkJfQotICAgICAgICAKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjZW5kRWxlbWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWUsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kRWxlbWVudChRTmFtZSBhcmcwLCBBdWdtZW50YXRpb25zIGFyZzEpIHRocm93cyBYTklFeGNlcHRpb24gewotCQkJc3VwZXIuZW5kRWxlbWVudChhcmcwLCBhcmcxKTsKLQkJCXZhbGluZm8uZ2V0U3RhcnRFbGVtZW50TG9jYXRpb25zKCkucG9wKCk7Ci0JCX0KLSAgICAgIH07Ci0KLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwgdmFsaW5mby5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCB2YWxpbmZvLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSk7ICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgdmFsaW5mby5pc0dyYW1tYXJFbmNvdW50ZXJlZCgpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLCB2YWxpbmZvLmlzR3JhbW1hckVuY291bnRlcmVkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IERlZmF1bHRIYW5kbGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lKTsKLSAgICAgICAgfQotICAgICAgfSk7ICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1IIG1ha2Ugc3VyZSB2YWxpZGF0aW9uIHdvcmtzIGV2ZW4gd2hlbiBhIGN1c3RvbWVyIGVudGl0eVJlc29sdmVyIGlzIG5vdGUgc2V0IChpLmUuIHZpYSBzZXRVUklSZXNvbHZlcigpKQotICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9pbnRlcm5hbC9lbnRpdHktcmVzb2x2ZXIiLCBlbnRpdHlSZXNvbHZlcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gIAotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwgbmV3IE15RGVjbEhhbmRsZXIoKSk7ICAgICAgLy8kTk9OLU5MUy0xJAotICAgIH0gCi0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgeyAKLSAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2U7Ci0gICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gcmVhZGVyOwotICB9ICAKLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gVVJJLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwsIG5ldyBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpKTsgIAotICB9Ci0KLSAgZmluYWwgU3RyaW5nIGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgLy8gSGVyZSB3ZSBhcmUgcmVhZGluZyB0aGUgZmlsZSBhbmQgc3RvcmluZyB0byBhIHN0cmluZ2J1ZmZlci4KLSAgICBTdHJpbmdCdWZmZXIgZmlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgIlVURi04Iik7Ci0gICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW5wdXRSZWFkZXIpOwotICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMTAyNF07Ci0gICAgICBpbnQgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIHdoaWxlIChudW1iZXJSZWFkICE9IC0xKQotICAgICAgewotICAgICAgICBmaWxlU3RyaW5nLmFwcGVuZChjaGFycywgMCwgbnVtYmVyUmVhZCk7Ci0gICAgICAgIG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL1RPRE86IGxvZyBlcnJvciBtZXNzYWdlCi0gICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlU3RyaW5nLnRvU3RyaW5nKCk7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdGhlIGlucHV0U3RyZWFtIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEByZXR1cm4gUmV0dXJucyBhbiBYTUwgdmFsaWRhdGlvbiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotCXJldHVybiB2YWxpZGF0ZSh1cmksIGlucHV0U3RyZWFtLCBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSAKLSAgICogCQlUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0KLSAgICogCQlUaGUgaW5wdXRTdHJlYW0gb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUKLSAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICogCQlBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBzZXNzaW9uLgotICAgKiBAcmV0dXJuIAotICAgKiAJCVJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gIHsKLSAgICBSZWFkZXIgcmVhZGVyMSA9IG51bGw7IC8vIFVzZWQgZm9yIHRoZSBwcmVwYXJzZS4KLSAgICBSZWFkZXIgcmVhZGVyMiA9IG51bGw7IC8vIFVzZWQgZm9yIHZhbGlkYXRpb24gcGFyc2UuCi0gICAgCi0gICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBTdHJpbmcgc3RyaW5nID0gY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsKLSAgICAgIHJlYWRlcjIgPSBuZXcgU3RyaW5nUmVhZGVyKHN0cmluZyk7Ci0gICAgfSAKLSAgICAgICAgCi0gICAgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBYTUxWYWxpZGF0aW9uSW5mbyh1cmkpOwotICAgIE15RW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBuZXcgTXlFbnRpdHlSZXNvbHZlcih1cmlSZXNvbHZlcik7IAotICAgIFZhbGlkYXRvckhlbHBlciBoZWxwZXIgPSBuZXcgVmFsaWRhdG9ySGVscGVyKCk7IAotICAgIHRyeQotICAgIHsgIAotICAgICAgICBoZWxwZXIuY29tcHV0ZVZhbGlkYXRpb25JbmZvcm1hdGlvbih1cmksIHJlYWRlcjEsIHVyaVJlc29sdmVyKTsKLSAgICAgICAgdmFsaW5mby5zZXREVERFbmNvdW50ZXJlZChoZWxwZXIuaXNEVERFbmNvdW50ZXJlZCk7Ci0gICAgICAgIHZhbGluZm8uc2V0RWxlbWVudERlY2xhcmF0aW9uQ291bnQoaGVscGVyLm51bURUREVsZW1lbnRzKTsKLSAgICAgICAgdmFsaW5mby5zZXROYW1lc3BhY2VFbmNvdW50ZXJlZChoZWxwZXIuaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCk7Ci0gICAgICAgIHZhbGluZm8uc2V0R3JhbW1hckVuY291bnRlcmVkKGhlbHBlci5pc0dyYW1tYXJFbmNvdW50ZXJlZCk7Ci0gICAgICAgIAotICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gY3JlYXRlWE1MUmVhZGVyKHZhbGluZm8sIGVudGl0eVJlc29sdmVyKTsKLSAgICAgICAgWE1MRXJyb3JIYW5kbGVyIGVycm9yaGFuZGxlciA9IG5ldyBYTUxFcnJvckhhbmRsZXIodmFsaW5mbyk7Ci0gICAgICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JoYW5kbGVyKTsKLSAgICAgICAgCi0gICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICAgIGlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShyZWFkZXIyKTsKLSAgICAgICAgcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsgICAKLSAgICAgICAgaWYoY29uZmlndXJhdGlvbi5nZXRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLldBUk5fTk9fR1JBTU1BUikgJiYgCi0gICAgICAgIAkJdmFsaW5mby5pc1ZhbGlkKCkgJiYgIWhlbHBlci5pc0dyYW1tYXJFbmNvdW50ZXJlZCkKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gc2F4UGFyc2VFeGNlcHRpb24pCi0gICAgewotICAgICAgLy8gVGhlc2UgZXJyb3JzIGFyZSBjYXVnaHQgYnkgdGhlIGVycm9yIGhhbmRsZXIuCi0gICAgICAvL2FkZFZhbGlkYXRpb25NZXNzYWdlKHZhbGluZm8sIHNheFBhcnNlRXhjZXB0aW9uKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9FeGNlcHRpb24pCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UodmFsaW5mbywgaW9FeGNlcHRpb24pOwotICAgIH0gICAgICAgICAgICAgICAgIAotICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsgIAotICAgIAlMb2dnZXJGYWN0b3J5LmdldExvZ2dlckluc3RhbmNlKCkubG9nRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLSAgICB9Ci0gICAgIAotICAgIAotICAgIHJldHVybiB2YWxpbmZvOwotICAgICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIHRvLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgeyAKLSAgICBTdHJpbmcgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCVRocm93YWJsZSBjYXVzZSA9IGV4Y2VwdGlvbi5nZXRDYXVzZSgpICE9IG51bGwgPyBleGNlcHRpb24uZ2V0Q2F1c2UoKSA6IGV4Y2VwdGlvbjsKLQl3aGlsZSh2YWxpZGF0aW9uTWVzc2FnZVN0ciA9PSBudWxsICYmIGNhdXNlICE9IG51bGwpewotCQlTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSA9IGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkgICAgY2F1c2UgPSBjYXVzZS5nZXRDYXVzZSgpOwotCSAgICBpZihjYXVzZSA9PSBudWxsICYmIGxvY2FsaXplZE1lc3NhZ2UgIT0gbnVsbCApCi0JICAgIHsKLQkgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IGxvY2FsaXplZE1lc3NhZ2U7Ci0JICAgIH0KLQl9Ci0JCi0JaWYgKHZhbGlkYXRpb25NZXNzYWdlU3RyICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotICAgICAgewotICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCwgbmV3IE9iamVjdCBbXSB7IHZhbGlkYXRpb25NZXNzYWdlU3RyIH0pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBOTFMuYmluZChYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfVU5LTk9XTl9IT1NULCBuZXcgT2JqZWN0IFtdIHsgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgfSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGNhdXNlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYTUxMb2NhdG9yIGxvY2F0b3IgPSB2YWxpbmZvLmdldFhNTExvY2F0b3IoKTsKLSAgICAgIHZhbGluZm8uYWRkV2FybmluZyh2YWxpZGF0aW9uTWVzc2FnZVN0ciwgbG9jYXRvciAhPSBudWxsID8gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgOiAxLCBsb2NhdG9yICE9IG51bGwgPyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpIDogMCwgdmFsaW5mby5nZXRGaWxlVVJJKCksIEZJTEVfTk9UX0ZPVU5EX0tFWSwgbnVsbCk7Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgdG8uCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbywgU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKQotICB7IAotICAgIGlmIChleGNlcHRpb24uZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgeyAKLSAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBBIGN1c3RvbSBlbnRpdHkgcmVzb2x2ZXIgdGhhdCB1c2VzIHRoZSBVUkkgcmVzb2x2ZXIgc3BlY2lmaWVkIHRvIHJlc29sdmUgZW50aXRpZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyIAotICB7Ci0gICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlcjsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byB1c2Ugd2l0aCB0aGlzIGVudGl0eSByZXNvbHZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlFbnRpdHlSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgICB7Ci0gICAgICB0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByaWQpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBfaW50ZXJuYWxSZXNvbHZlRW50aXR5KHVyaVJlc29sdmVyLCByaWQpOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOyAgIAotICAgICAgfSAgICAgIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIAotICAvLyBjcyA6IEkndmUgcmVmYWN0b3JlZCB0aGUgY29tbW9uIFNBWCBiYXNlZCByZXNvbHV0aW9uIGNvZGUgaW50byB0aGlzIG1ldGhvZCBmb3IgdXNlIGJ5IG90aGVyIHZhbGlkYXRvcnMgCi0gIC8vIChpLmUuIFhNTCBTY2hlbWEsIFdTREwgZXRjKS4gICBUaGUgb3RoZXIgYXBwcm9hY2ggaXMgbWFpbnRhaW4gYSBjb3B5IGZvciBlYWNoIHZhbGlkYXRvciB0aGF0IGhhcwotICAvLyBpZGVudGljYWwgY29kZS4gIEluIGFueSBjYXNlIHdlIHNob3VsZCBzdHJpdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHZhbGlkYXRvcnMgcGVyZm9ybSByZXNvbHV0aW9uIGNvbnNpc3RlbnRseS4gCi0gIHB1YmxpYyBzdGF0aWMgWE1MSW5wdXRTb3VyY2UgX2ludGVybmFsUmVzb2x2ZUVudGl0eShVUklSZXNvbHZlciB1cmlSZXNvbHZlciwgWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJpZCkgdGhyb3dzICBJT0V4Y2VwdGlvbgotICB7Ci0gICAgWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlSZXNvbHZlciAhPSBudWxsKQotICAgIHsgICAgICAgICAKLSAgICAgIFN0cmluZyBpZCA9IHJpZC5nZXRQdWJsaWNJZCgpOwotICAgICAgaWYoaWQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWQgPSByaWQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCB8fCByaWQuZ2V0TGl0ZXJhbFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBsb2NhdGlvbiA9IHVyaVJlc29sdmVyLnJlc29sdmUocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgcmlkLmdldExpdGVyYWxTeXN0ZW1JZCgpKTsKLSAgICAgIH0gIAotICAgICAgCi0gICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBoeXNpY2FsID0gdXJpUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24ocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgbG9jYXRpb24pOwotICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShyaWQuZ2V0UHVibGljSWQoKSwgbG9jYXRpb24sIGxvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgYmxvY2sgY2hlY2tzIHRoYXQgdGhlIGZpbGUgZXhpc3RzLiBJZiBpdCBkb2Vzbid0IHdlIG5lZWQgdG8gdGhyb3cKLSAgICAgICAgLy8gYW4gZXhjZXB0aW9uIHNvIFhlcmNlcyB3aWxsIHJlcG9ydCBhbiBlcnJvci4gbm90ZTogVGhpcyBtYXkgbm90IGJlCi0gICAgICAgIC8vIG5lY2Vzc2FyeSB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBYZXJjZXMgYnV0IGhhcyBzcGVjaWZpY2FsbHkgYmVlbiAKLSAgICAgICAgLy8gZXhwZXJpZW5jZWQgd2l0aCB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBJQk0ncyAxLjQuMiBKREsuCi0gICAgICAgIElucHV0U3RyZWFtIGlzVGVtcCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaXNUZW1wID0gbmV3IFVSTChwaHlzaWNhbCkub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKGlzVGVtcCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVGVtcC5jbG9zZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzOyAgICAKLSAgfSAgICAgIAotICAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGhhbmRsZXIgdG8gY2F0Y2ggZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgRVJST1IgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IFdBUk5JTkcgPSAxOwotICAgIHByaXZhdGUgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIFhNTEVycm9ySGFuZGxlcihYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAgIHsKLSAgICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpCi0gICAgewotICAgICAgaWYoZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgCQotICAgIAlpbnQgbGluZU51bWJlciA9IGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCWludCBjb2x1bW5OdW1iZXIgPSBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgCQotICAgIAkvLyBGb3IgdGhlIGZvbGxvd2luZyB0aHJlZSBlcnJvcnMgdGhlIGxpbmUgbnVtYmVyIHdpbGwgYmUgbW9kaWZpZWQgdG8gdXNlIHRoYXQgb2YgdGhlIHN0YXJ0Ci0gICAgCS8vIHRhZyBpbnN0ZWFkIG9mIHRoZSBlbmQgdGFnLgotICAgIAlTdHJpbmcgY3VycmVudEVycm9yS2V5ID0gdmFsaW5mby5jdXJyZW50RXJyb3JLZXk7Ci0gICAgCWlmIChjdXJyZW50RXJyb3JLZXkgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmNvbnRhaW5zKGN1cnJlbnRFcnJvcktleSkpICAKLSAgICAJewotICAgIAkgIExvY2F0aW9uQ29vcmRpbmF0ZSBhZGp1c3RlZENvb3JkaW5hdGVzID0gKExvY2F0aW9uQ29vcmRpbmF0ZSl2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnBlZWsoKTsKLSAgICAJICBsaW5lTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCSAgY29sdW1uTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRDb2x1bW5OdW1uZXIoKTsKLSAgICAJfQotICAgIAkKLSAgICAgICAgaWYoc2V2ZXJpdHkgPT0gV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksIHZhbGluZm8uZ2V0Q3VycmVudEVycm9yS2V5KCksIHZhbGluZm8uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgRVJST1IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBXQVJOSU5HKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvdW50IHRoZSBlbGVtZW50RGVjbHMgdGhhdCBhcmUgZW5jb3VudGVyZWQgaW4gYSBEVEQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlEZWNsSGFuZGxlciBpbXBsZW1lbnRzIERlY2xIYW5kbGVyIAotICB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGluZm8gVGhlIFhNTFZhbGlkYXRpb25JbmZvIG9iamVjdCB0aGF0IHdpbGwgY291bnQgdGhlIGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlEZWNsSGFuZGxlcigpCi0gICAgewotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjYXR0cmlidXRlRGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZURlY2woU3RyaW5nIGVOYW1lLCBTdHJpbmcgYU5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSAKLSAgICB7Ci0gICAgICAvL3ZhbGluZm8uaW5jcmVhc2VFbGVtZW50RGVjbGFyYXRpb25Db3VudCgpOwotICAgIH0KLSAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4dGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIAotICAgIHsKLSAgICB9ICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gdGhhdCBjcmVhdGVzIGFuIGVycm9yIHJlcG9ydGVyIHdoaWNoIGNhbiBpZ25vcmUKLSAgICogRFREIGVycm9yIG1lc3NhZ2VzIGZvciBEVEQncyB3aXRoIG5vIGVsZW1lbnRzIGRlZmluZWQuCi0gICAqLwotCi0gIHByb3RlY3RlZCBjbGFzcyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbgotICB7Ci0gIAlYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbnVsbDsKLSAgICBMaXN0IHJlcG9ydGVkRXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsgCi0gIAkKLSAgCS8qKgotICAJICogQ29uc3RydWN0b3IuCi0gIAkgKiAKLSAgCSAqIEBwYXJhbSB2YWxpbmZvIFRoZSBYTUxWYWxpZGF0aW9uSW5mbyBvYmplY3QgdG8gdXNlLgotICAJICovCi0gIAlwdWJsaWMgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24oWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgCXsKLSAgCSAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRFREQ29uZmlndXJhdGlvbiNjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MRXJyb3JSZXBvcnRlciBjcmVhdGVFcnJvclJlcG9ydGVyKCkgCi0gICAgewotICAgIAlyZXR1cm4gbmV3IFhNTEVycm9yUmVwb3J0ZXIoKQotCQl7Ci0gICAgCQkvKiAobm9uLUphdmFkb2MpCi0gICAgCQkgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRXJyb3JSZXBvcnRlciNyZXBvcnRFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10sIHNob3J0KQotICAgIAkJICovCi0gICAgCQlwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMsIHNob3J0IHNldmVyaXR5KSB0aHJvd3MgWE5JRXhjZXB0aW9uIAotICAgIAkgICAgeyAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIGJvb2xlYW4gcmVwb3J0RXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICB2YWxpbmZvLnNldEN1cnJlbnRFcnJvcktleShrZXkpOyAgCi0JCQkgIHZhbGluZm8uc2V0TWVzc2FnZUFyZ3VtZW50cyhhcmd1bWVudHMpOwotCQkgICAgICBTdHJpbmcgaWdub3JlQ29uZGl0aW9uID0gKFN0cmluZylpbmdvcmVkRXJyb3JLZXlUYWJsZS5nZXQoa2V5KTsKLQkJICAgICAgaWYgKGlnbm9yZUNvbmRpdGlvbiAhPSBudWxsKQotCQkgICAgICB7Ci0JCSAgICAgICAgaWYgKGlnbm9yZUNvbmRpdGlvbi5lcXVhbHMoWE1MVmFsaWRhdG9yLklHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpKQotCQkgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAotCQkgICAgICAgICAgYm9vbGVhbiBpc0RURFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZCA9IHZhbGluZm8uaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQoKTsgCi0JCSAgICAgICAgICByZXBvcnRFcnJvciA9ICFpc0RURFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZDsgIAotCQkgICAgICAgIH0KLQkJICAgICAgICBlbHNlIAotCQkgICAgICAgIHsKLQkJICAgICAgICAgIHJlcG9ydEVycm9yID0gZmFsc2U7Ci0JCSAgICAgICAgfQotCQkgICAgICB9Ci0JCSAgICAgIGlmICgic2NoZW1hX3JlZmVyZW5jZS40Ii5lcXVhbHMoa2V5KSAmJiBhcmd1bWVudHMubGVuZ3RoID4gMCkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGxvY2F0aW9uID0gYXJndW1lbnRzWzBdOyAgCi0gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgICBpZihyZXBvcnRlZEV4Y2VwdGlvbnMuY29udGFpbnMobG9jYXRpb24pKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEV4Y2VwdGlvbnMuYWRkKGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgCi0JCSAgICAgIGlmIChyZXBvcnRFcnJvcikKLQkJICAgICAgewotCQkgICAgICAgIHN1cGVyLnJlcG9ydEVycm9yKGRvbWFpbiwga2V5LCBhcmd1bWVudHMsIHNldmVyaXR5KTsKLQkJICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5jb25zaWRlclJlcG9ydGVkRXJyb3IodmFsaW5mbywga2V5LCBhcmd1bWVudHMpOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCX07Ci0gICAgfQotICB9Ci0gIAotICAvKiogCi0gICAqIEEgbGluZSBhbmQgY29sdW1uIG51bWJlciBjb29yZGluYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIExvY2F0aW9uQ29vcmRpbmF0ZQotICB7CQotCXByaXZhdGUgaW50IGxpbmVObyA9IC0xOwotICAgIHByaXZhdGUgaW50IGNvbHVtbk5vID0gLTE7Ci0gICAgCi0gICAgcHVibGljIExvY2F0aW9uQ29vcmRpbmF0ZShpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgICB7Ci0gICAgICB0aGlzLmxpbmVObyA9IGxpbmVOdW1iZXI7Ci0gICAgICB0aGlzLmNvbHVtbk5vID0gY29sdW1uTnVtYmVyOwotICAgIH0KLSAgICAJCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgICB7IAotICAgICAgcmV0dXJuIHRoaXMubGluZU5vOwotICAgIH0KLSAgICAJCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1uZXIoKQotICAgIHsgCi0gICAgICByZXR1cm4gdGhpcy5jb2x1bW5ObzsKLSAgICB9IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZWExY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9BYnN0cmFjdE5lc3RlZFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCB2YWxpZGF0b3IgdGhhdCBhc3Npc3RzIHZhbGlkYXRvcnMgaW4gcnVubmluZyBhbmQgY29udHJpYnV0aW5nCi0gKiBuZXN0ZWQgbWVzc2FnZXMgaW4gdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4gCi0gKiAqbm90ZTogU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0byBjb250cmlidXRlIG5lc3RlZCBtZXNzYWdlcyBpbiBvcmRlciB0bwotICogYmVuZWZpdCBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBjbGFzcy4gVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGl0ZXJhdGluZwotICogdGhyb3VnaCByZXN1bHRzIGZvciB2YWxpZGF0b3JzIHRoYXQgdXNlIHRoZSBzdGFuZGFyZCBjb250ZXh0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIAotewotICAvLyBMb2NhbGx5IHVzZWQsIG5vbi1VSSBzdHJpbmdzLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gPSAicmVmZXJlbmNlZEZpbGVFcnJvcigiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UgPSAiKSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9OT19TTEFTSCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FID0gImdyb3VwTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUX1BST0pFQ1RfRklMRVMgPSAiZ2V0QWxsRmlsZXMiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9JTlBVVFNUUkVBTSA9ICJpbnB1dFN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8vIEludGVybmFsIHN0cmluZ3MuIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1vbiBhZGRpdGlvbiBpbmZvcm1hdGlvbiB0eXBlcy4KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUgPSAiY29sdW1uTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFID0gInNxdWlnZ2xlU2VsZWN0aW9uU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFID0gInNxdWlnZ2xlTmFtZU9yVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLSAgCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gCi0gIHsKLQlOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IG5lc3RlZGNvbnRleHQgPSBuZXcgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCgpOwotCXNldHVwVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQlTdHJpbmdbXSBmaWxlVVJJcyA9IGNvbnRleHQuZ2V0VVJJcygpOwotCWlmIChmaWxlVVJJcyAhPSBudWxsICYmIGZpbGVVUklzLmxlbmd0aCA+IDApIAotCXsKLQkgIGludCBudW1GaWxlcyA9IGZpbGVVUklzLmxlbmd0aDsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmlsZXMgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgCi0JICB7Ci0JICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVVUklzW2ldOwotCSAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkKLQkgICAgeyAgICAgICAgICAKLQkgICAgICBPYmplY3QgW11wYXJtcyA9IHtmaWxlTmFtZX07Ci0KLQkgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBjb250ZXh0LmxvYWRNb2RlbChHRVRfRklMRSwgcGFybXMpOwotCSAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgc2hvdWxkVmFsaWRhdGUoZmlsZSkpIAotCSAgICAgIHsgCi0JICAgIAkvLyBUaGUgaGVscGVyIG1heSBub3QgaGF2ZSBhIGZpbGUgc3RvcmVkIGluIGl0IGJ1dCBtYXkgaGF2ZSBhbiBJbnB1dFN0cmVhbSBpZiBiZWluZwotCSAgICAJLy8gY2FsbGVkIGZyb20gYSBzb3VyY2Ugb3RoZXIgdGhhbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc3VjaCBhcyBhbiBlZGl0b3IuCi0JICAgICAgICBpZiAoY29udGV4dC5sb2FkTW9kZWwoR0VUX0lOUFVUU1RSRUFNKSBpbnN0YW5jZW9mIElucHV0U3RyZWFtKSAvLyROT04tTkxTLTEkCi0JICAgICAgICB7Ci0JICAgICAgICAgIHZhbGlkYXRlKGZpbGUsIChJbnB1dFN0cmVhbSljb250ZXh0LmxvYWRNb2RlbChHRVRfSU5QVVRTVFJFQU0pLCByZXBvcnRlciwgbmVzdGVkY29udGV4dCk7IC8vZG8gd2UgbmVlZCB0aGUgZmlsZU5hbWU/ICB3aGF0IGlzIGludCBydWxlR3JvdXA/IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAgCSAgdmFsaWRhdGUoZmlsZSwgbnVsbCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCX0KLQkvLyBUT0RPOiBJcyB0aGlzIG5lZWRlZD8gU2hvdWxkbid0IHRoZSBmcmFtZXdvcmsgcGFzcyB0aGUgY29tcGxldGUgbGlzdD8gCi0JLy8gU2hvdWxkIEkga25vdyB0aGF0IEknbSB2YWxpZGF0aW5nIGEgcHJvamVjdCBhcyBvcHBvc2VkIHRvIGZpbGVzPwotCWVsc2UgCi0gICAgewotICAgICAgT2JqZWN0IFtdcGFybXMgPSB7Z2V0VmFsaWRhdG9ySUQoKX07Ci0gICAgICBDb2xsZWN0aW9uIGZpbGVzID0gKENvbGxlY3Rpb24pIGNvbnRleHQubG9hZE1vZGVsKEdFVF9QUk9KRUNUX0ZJTEVTLCBwYXJtcyk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgCi0gICAgICB7Ci0gICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGl0ZXIubmV4dCgpOwotICAgICAgICBpZihzaG91bGRWYWxpZGF0ZShmaWxlKSkKLSAgICAgICAgewotCSAgICAgIHZhbGlkYXRlKGZpbGUsIG51bGwsIHJlcG9ydGVyLCBuZXN0ZWRjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQkKLQl0ZWFyZG93blZhbGlkYXRpb24obmVzdGVkY29udGV4dCk7Ci0JaWYocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBpZCBvZiB0aGlzIHZhbGlkYXRvci4gVGhlIElEIGlzIHVzZWQgYnkgdGhlIHZhbGlkYXRpb24KLSAgICogZnJhbWV3b3JrLiBJdCB1c3VhbGx5IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICogaW1wbGVtZW50aW5nIHRoZSBJVmFsaWRhdG9yIGludGVyZmFjZS4KLSAgICogCi0gICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgSUQgb2YgdGhpcyB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRvcklEKCkKLSAgewotICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSBzZXQgdXAgYmVmb3JlIHZhbGlkYXRpb24gcnVucy4gU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHRoaXMKLSAgICogbWV0aG9kIHRvIHBlcmZvcm0gdmFsaWRhdGlvbiBzcGVjaWZpYyBzZXQgdXAuCi0gICAqIAotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7Ci0JLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gIH0KLSAgCi0gIC8qKgotICAgKiBQZXJmb3JtIHRlYXIgZG93biBhZnRlciB2YWxpZGF0aW9uIHJ1bnMuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB0aGlzCi0gICAqIG1ldGhvZCB0byBwZXJmb3JtIHZhbGlkYXRpb24gc3BlY2lmaWMgdGVhciBkb3duLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhcmRvd25WYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iI2dldFNjaGVkdWxpbmdSdWxlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0KQotICAgKi8KLSAgcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgYXJnMCkgCi0gIHsKLQkvLyBUT0RPIHJldmlldyB3aGV0aGVyIHJldHVybmluZyBhIG51bGwgcnVsZSBpcyBjb3JyZWN0LiBHYXJ5IGhhZCBhIHN1Z2dlc3Rpb24gaW4gdGhlIGJ1ZyByZXBvcnQuCi0JcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yI2NsZWFudXAob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciBhcmcwKSAKLSAgewotICAgIC8vIE5vIGNsZWFudXAgdG8gcGVyZm9ybS4gU3ViY2xhc3NlcyBhcmUgZnJlZSB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBhcmcwLCBJUmVwb3J0ZXIgYXJnMSkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gCi0gIHsgIAotCS8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQgYnkgdmFsaWR0b3JzIGltcGxlbWVudGluZyB0aGUgdmFsaWRhdGVJbkpvYgotCS8vIG1ldGhvZC4KLSAgfQotCQotCQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gZmlsZSBzaG91bGQgYmUgdmFsaWRhdGVkLiAKLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgbWF5IGJlIHZhbGlkYXRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIHNob3VsZCBiZSB2YWxpZGF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgCi0gIHsKLQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCWRvIAotCXsKLQkgIGlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgCi0JCSAgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSAKLQkgIHsKLQkJcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQl9d2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCi0JcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmlsZSBhbmQgdXNlIHRoZSByZXBvcnRlciBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gdGhlIHZhbGlkYXRpb24gbG9naWMgYnV0IHJhdGhlciBkZWxlZ2F0ZXMKLSAgICogdG8gdGhlIHZhbGlkYXRlIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRvIHZhbGlkYXRlLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZQotICAgKiBmb3IgcmVwb3J0aW5nIHRoZSBtZXNzYWdlcyB0aGF0IHJlc3VsdCBmcm9tIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSAKLSAgICogCQlBbiBJRmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtIAotICAgKiAJCUFuIElucHV0U3RyZWFtIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZS4gVGhlIElucHV0U3RyZWFtIG1heSBiZSBudWxsCi0gICAqIAkJaW4gd2hpY2ggY2FzZSB0aGUgZmlsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBmcm9tIHRoZSBJRmlsZS4KLSAgICogQHBhcmFtIHJlcG9ydGVyIAotICAgKiAJCVRoZSByZXBvcnRlciB3aXRoIHdoaWNoIHRvIHJlcG9ydCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIElSZXBvcnRlciByZXBvcnRlciwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7ICAKLQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICByZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLSAgICAKLQlJUGF0aCBwYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCVN0cmluZyB1cmkgPSBjcmVhdGVVUklGb3JGaWxlUGF0aChwYXRoLnRvU3RyaW5nKCkpOwotCi0JY2xlYXJNYXJrZXJzKGZpbGUsIHRoaXMsIHJlcG9ydGVyKTsKLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQpOwotCQotCWNyZWF0ZU1hcmtlcnMoZmlsZSwgdmFscmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpLCByZXBvcnRlcik7Ci0JICAgICAgICAKLQl0cnkKLQl7Ci0JICBmaWxlLnNldFNlc3Npb25Qcm9wZXJ0eShWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSwgdmFscmVwb3J0LmdldE5lc3RlZE1lc3NhZ2VzKCkpOwotCX0KLQljYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0JewotCSAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gc2V0IG5lc3RlZCBtZXNzYWdlcyBwcm9wZXJ0eS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgfQotCQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIHVzZSB0aGUgcmVwb3J0ZXIgZm9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBDbGllbnRzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHdpdGggdGhlaXIgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYy4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0gCi0gICAqIAkJQW4gSW5wdXRTdHJlYW0gdGhhdCByZXByZXNlbnRzIHRoZSBmaWxlLiBUaGUgSW5wdXRTdHJlYW0gbWF5IGJlIG51bGwKLSAgICogCQlpbiB3aGljaCBjYXNlIHRoZSBmaWxlcyBzaG91bGQgYmUgdmFsaWRhdGVkIGZyb20gdGhlIElGaWxlLgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqIEByZXR1cm4KLSAgICogCQlBIHZhbGlkYXRpb24gcmVwb3J0IHN1bW1hcml6aW5nIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCk7Ci0JICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgdGhlIG1hcmtlcnMgb24gdGhlIGdpdmVuIElGaWxlIGZvciBhIHNwZWNpZmllZAotICAgKiB2YWxpZGF0b3IuCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMuCi0gICAqIAotICAgKiBAcGFyYW0gaUZpbGUKLSAgICogCQlUaGUgSUZpbGUgZnJvbSB3aGljaCB0byBjbGVhciB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHZhbGlkYXRvcgotICAgKiAJCVRoZSB2YWxpZGF0b3IgZm9yIHdoaWNoIHRvIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqIAkJVGhlIHJlcG9ydGVyIHRoYXQgY2FuIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjbGVhck1hcmtlcnMoSUZpbGUgaUZpbGUsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLQlpZiAoZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0JewotCSAgcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBpRmlsZSk7Ci0JfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBpcyBhY2Nlc3NpYmxlIGFuZCBtYXkgYmUgdXNlZCBmb3IgdmFsaWRhdGlvbi4gQSBmaWxlIGlzIAotICAgKiBhdmFpbGFibGUgaWYgCi0gICAqIDEuIEl0IGlzIG5vdCBudWxsLgotICAgKiAyLiBJdCBleGlzdHMuIAotICAgKiAzLiBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSAKLSAgICogCQlUaGUgZmlsZSB0byBjaGVjayB0byBlbnN1cmUgaXQgaXMgYWNjZXNzaWJsZS4KLSAgICogQHJldHVybiAKLSAgICogCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmaWxlSXNBY2Nlc3NpYmxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBGb3JtYXQgYSBmaWxlIG5hbWUgaW50byBhIGNvcnJlY3QgVVJJLiAKLSAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAKLSAgICogCQlUaGUgZmlsZSBuYW1lIHRvIGZvcm1hdC4KLSAgICogQHJldHVybiAKLSAgICogCQkKLSAgICogVGhlIGZvcm1hdHRlZCBVUkkuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjcmVhdGVVUklGb3JGaWxlUGF0aChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLQlpZighZmlsZW5hbWUuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MX05PX1NMQVNIKSkKLQl7Ci0JICB3aGlsZShmaWxlbmFtZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkgIHsKLQkgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMSk7Ci0JICB9Ci0JICBmaWxlbmFtZSA9IEZJTEVfUFJPVE9DT0wgKyBmaWxlbmFtZTsKLQl9Ci0JcmV0dXJuIGZpbGVuYW1lOwotICB9Ci0JICAKLSAgLyoqCi0gICAqIENyZWF0ZSBtYXJrZXJzIGZvciB0aGUgdmFsaWF0aW9uIG1lc3NhZ2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBjcmVhdGUgdGhlIG1hcmtlcnMgb24uCi0gICAqIEBwYXJhbSB2YWxtZXNzYWdlcwotICAgKiAgICAgICAgICBUaGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSUZpbGUgaUZpbGUsIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIGlmICghZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbnVtbWVzc2FnZXMgPSB2YWxtZXNzYWdlcy5sZW5ndGg7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1tZXNzYWdlczsgaSsrKQotICAgIHsKLSAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsbWVzc2FnZXNbaV07Ci0gICAgICBTdHJpbmcgdXJpID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VXJpKCk7Ci0KLSAgICAgIExvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIAotICAgICAgICAJCXZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAKLSAgICAgICAgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgCi0gICAgICBtZXNzYWdlLnNldExpbmVObyh2YWxpZGF0aW9uTWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgYWRkSW5mb1RvTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZSwgbWVzc2FnZSk7Ci0gICAgICAKLSAgICAgIExpc3QgbmVzdGVkZXJyb3JzID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLSAgICAgIGlmIChuZXN0ZWRlcnJvcnMgIT0gbnVsbCAmJiAhbmVzdGVkZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZS5zZXRHcm91cE5hbWUoUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gKyB1cmkgKyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UpOwotICAgICAgfQotCi0gICAgICByZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCSAgICAgIAotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJTWFya2VyW10gbWFya2VycyA9IGlGaWxlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLSAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXBOYW1lID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHUk9VUF9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ3JvdXBOYW1lICE9IG51bGwgJiYgZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoUkVGRVJFTkNFRF9GSUxFX0VSUk9SKSkKLSAgICAgICAgewotICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5ET05FLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgYWRkaXRpb24gb2YgaW5mb3JtYXRpb24gdG8gdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotICAgKiBAcGFyYW0gdmFsaWRhdGlvbm1lc3NhZ2UKLSAgICogCQlUaGUgVmFsaWRhdGlvbk1lc3NhZ2UgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uIGZyb20uCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqIAkJVGhlIElNZXNzYWdlIHRvIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlIChWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9ubWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAKLQkvLyBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcmlkZGVuIGJ5IHN1YmNsYXNzZXMKLSAgfQotCSAgCi0gIC8qKgotICAgKiBBIGxvY2FsaXplZCBtZXNzYWdlIGlzIGEgc3BlY2lhbGl6ZWQgdHlwZSBvZiBJTWVzc2FnZSB0aGF0IGFsbG93cyBzZXR0aW5nCi0gICAqIGFuZCB1c2luZyBhIGxvY2FsaXplZCBtZXNzYWdlIHN0cmluZyBmb3IgYSBtZXNzYWdlLgotICAgKi8KLSAgY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgCi0gIHsKLSAgICBwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgCi0JewotCSAgdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSAKLQl7Ci0JICB0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgCi0JewotCSAgc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCSAgc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JICBzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSAKLQl7Ci0JICBfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgCi0JewotCSAgcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIAotCXsKLQkgIHJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDk3YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHZhbGlkYXRpb24gaW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAYXV0aG9yIEVybmVzdCBNYWggKGVybmVzdEBjYS5pYm0uY29tKQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgSGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUFJPSkVDVF9GSUxFUyA9ICJnZXRBbGxGaWxlcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgLy9kdyBwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29udGFpbmVyW10gTk9fQ09OVEFJTkVSUyA9IG5ldyBJQ29udGFpbmVyWzBdOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9PV05FUiA9ICJvd25lciI7ICAgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBIZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIC8vIHRoZSBmb2xsb3dpbmcgd2lsbCByZWdpc3RlciB0aGUgaGVscGVyJ3Mgc3ltYm9saWMgbWV0aG9kcwotICAgIENsYXNzIFtdIGFyZ3MgPSBuZXcgQ2xhc3NbMV0gOwotICAgIGFyZ3NbMF0gPSBTdHJpbmcuY2xhc3MgOyAgLy8gYSBzdHJpbmcgYXJndW1lbnQgZGVub3RpbmcgYSBzcGVjaWZpYyBKU1AuCi0gICAgCi0gICAgcmVnaXN0ZXJNb2RlbChHRVRfRklMRSwgImdldEZpbGUiLCBhcmdzKTsvLyROT04tTkxTLTEkCi0gICAgcmVnaXN0ZXJNb2RlbChHRVRfUFJPSkVDVF9GSUxFUywgImdldEZpbGVzIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSUZpbGUgZm9yIHRoZSBnaXZlbiBmaWxlbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZS4KLSAgICogQHJldHVybiBBbiBJRmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3BlY2lmaWVkIG9yIG51bGwgaWYgaXQgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0gICAqLwotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUgbmFtZSA9ICIgKyBmaWxlbmFtZSk7Ci0gICAgSVJlc291cmNlIHJlcyA9IGdldFByb2plY3QoKS5maW5kTWVtYmVyKGZpbGVuYW1lLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0gICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKElGaWxlKSByZXM7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIGZyb20gdGhlIHByb2plY3QgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZQotICAgKiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHJldHVybiBUaGUgY29sbGVjdGlvbiBvZiBmaWxlcyByZWxldmFudCBmb3IgdGhlIHZhbGlkYXRvciBjbGFzcyBzcGVjaWZpZWQuCi0gICAqLwotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRGaWxlcyhTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKQotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGdldEZpbGVzKGZpbGVzLCBwcm9qZWN0LCB2YWxpZGF0b3JDbGFzc05hbWUpOwotICAgIHJldHVybiBmaWxlczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlCi0gICAqIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGVzIFRoZSBmaWxlcyByZWxldmFudCBmb3IgdGhlIGNsYXNzIG5hbWUuCi0gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gbG9vayBmb3IgZmlsZXMgaW4uCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGdldEZpbGVzKENvbGxlY3Rpb24gZmlsZXMsIElDb250YWluZXIgcmVzb3VyY2UsIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgW10gcmVzb3VyY2VBcnJheSA9IHJlc291cmNlLm1lbWJlcnMoZmFsc2UpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlQXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgIAotICAgICAgICBpZiAoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNBcHBsaWNhYmxlVG8odmFsaWRhdG9yQ2xhc3NOYW1lLCByZXNvdXJjZUFycmF5W2ldKSkgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmVzb3VyY2VBcnJheVtpXSBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlcy5hZGQocmVzb3VyY2VBcnJheVtpXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotICAgICAgICAgZ2V0RmlsZXMoZmlsZXMsKElDb250YWluZXIpcmVzb3VyY2VBcnJheVtpXSwgdmFsaWRhdG9yQ2xhc3NOYW1lKSA7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgfQotCi0gIAotLyoqCi0gKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLCB3aXRob3V0IHRoZSBwcm9qZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIAotICogaW4gZnJvbnQuCi0gKgotICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBWYWxpZGF0aW9uT3BlcmF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbm9uLWVudmlyb25tZW50IAotICogc3BlY2lmaWMgbmFtZXMgb2YgdGhlIGZpbGVzLiBPbmx5IHRoZSBJV29ya2JlbmNoQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBrbm93cyBob3cgCi0gKiBtdWNoIGluZm9ybWF0aW9uIHRvIHN0cmlwIG9mZiBvZiB0aGUgSVJlc291cmNlIG5hbWUuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcwotICogYW4gRUpCIFByb2plY3QgbmFtZWQgIk15RUpCUHJvamVjdCIsIGFuZCBpdCB1c2VzIHRoZSBkZWZhdWx0IG5hbWVzIGZvciB0aGUgCi0gKiBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzLCAic291cmNlIiBhbmQgImVqYk1vZHVsZSIsIHJlc3BlY3RpdmVseSwgdGhlbiB0aGUKLSAqIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgRUpCIEhlbHBlciBrbm93cyBob3cgbXVjaCBvZiB0aGF0IHN0cnVjdHVyZSBpcyAKLSAqIGVjbGlwc2Utc3BlY2lmaWMuIAotICoKLSAqIFNpbmNlIHRoZSAic291cmNlIiBmb2xkZXIgY29udGFpbnMgSmF2YSBzb3VyY2UgZmlsZXMsIGEgcG9ydGFibGUgbmFtZSB3b3VsZAotICogYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLCB3aXRob3V0IHRoZSBlY2xpcHNlLXNwZWNpZmljCi0gKiBwcm9qZWN0IGFuZCBmb2xkZXIgbmFtZXMgaW4gZnJvbnQgb2YgdGhlIGZpbGUgbmFtZS4gVGhlIEVKQkhlbHBlciBrbm93cyB0aGF0IAotICogZXZlcnl0aGluZyB1cCB0byB0aGUgInNvdXJjZSIgZm9sZGVyLCBmb3IgZXhhbXBsZSwgY2FuIGJlIHJlbW92ZWQsIGJlY2F1c2UsIAotICogYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBFSkIgUHJvamVjdCwgZXZlcnl0aGluZyBjb250YWluZWQKLSAqIGluIHRoZSBzb3VyY2UgZm9sZGVyIGlzIGphdmEgc291cmNlIGNvZGUuIFNvIGlmIHRoZXJlIGlzIGFuIElSZXNvdXJjZSBpbiBhbgotICogRUpCIFByb2plY3QgbmFtZWQgIi9NeUVKQlByb2plY3Qvc291cmNlL2NvbS9pYm0vbXljbGFzc2VzL015SmF2YUZpbGUuamF2YSIsCi0gKiB0aGlzIG1ldGhvZCB3b3VsZCBtYWtlIHRoaXMgbmFtZSBwb3J0YWJsZSBieSBzdHJpcHBpbmcgb2ZmIHRoZQotICogIi9NeUVKQlByb2plY3Qvc291cmNlIiwgYW5kIHJldHVybmluZyAiY29tL2libS9teWNsYXNzZXMvTXlKYXZhRmlsZS5qYXZhIi4KLSAqCi0gKiBUaGUgb3V0cHV0IG9mIHRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFZhbGlkYXRpb25PcGVyYXRpb24sIHdoZW4gaXQKLSAqIGlzIGNhbGN1bGF0aW5nIHRoZSBsaXN0IG9mIGFkZGVkL2NoYW5nZWQvZGVsZXRlZCBmaWxlIG5hbWVzIGZvciBpbmNyZW1lbnRhbAotICogdmFsaWRhdGlvbi4gSWYgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSkgcmV0dXJucyBudWxsLCB0aGF0IG1lYW5zCi0gKiB0aGF0IHRoZSBJV29ya2JlbmNoQ29udGV4dCdzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhhdCBwYXJ0aWN1bGFyCi0gKiB0eXBlIG9mIHJlc291cmNlLCBhbmQgdGhlIHJlc291cmNlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFycmF5IG9mCi0gKiBJRmlsZURlbHRhIG9iamVjdHMgaW4gdGhlIElWYWxpZGF0b3IncyAidmFsaWRhdGUiIG1ldGhvZC4gCi0gKiAKLSAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gZ2V0IHRoZSBuYW1lIGZyb20uCi0gKiBAcmV0dXJuIFRoZSBwb3J0YWJsZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKQotICB7Ci0gICAgLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXQgcG9ydGFibGVuYW1lIGZvciAiICsgcmVzb3VyY2UpOwotICAgIHJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLSAgfQotCi0vKioKLSAqIFdoZW4gYW4gSVZhbGlkYXRvciBhc3NvY2lhdGVzIGEgdGFyZ2V0IG9iamVjdCB3aXRoIGFuIElNZXNzYWdlLAotICogdGhlIFdvcmtiZW5jaFJlcG9ydGVyIGV2ZW50dWFsbHkgcmVzb2x2ZXMgdGhhdCB0YXJnZXQgb2JqZWN0Ci0gKiB3aXRoIGFuIElSZXNvdXJjZS4gU29tZXRpbWVzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcwotICogdG8gdGhlIHNhbWUgSVJlc291cmNlICh1c3VhbGx5IHRoZSBJUHJvamVjdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQKLSAqIElSZXNvdXJjZSB3aGVuIGFuIElGaWxlIGNhbm5vdCBiZSBmb3VuZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKLSAqIGJ5IHRoZSBXb3JrYmVuY2hSZXBvcnRlciwgc28gdGhhdCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgY2FuIAotICogZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgSU1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgc2FtZSBJUmVzb3VyY2UsIAotICogYnV0IHJlZmVyIHRvIGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cy4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSAKLSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkgbWV0aG9kLCBzbyB0aGF0IHdoZW4gb25lCi0gKiB0YXJnZXQgb2JqZWN0IHJlbW92ZXMgYWxsIG9mIGl0cyBtZXNzYWdlcywgdGhhdCBpdCBkb2Vzbid0IHJlbW92ZQotICogYW5vdGhlciB0YXJnZXQgb2JqZWN0J3MgbWVzc2FnZXMuCi0gKgotICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIG9ubHkgaWYgb2JqZWN0IGlzIG51bGwuIE90aGVyd2lzZSwgYW4KLSAqIGlkIHdoaWNoIGNhbiB1bmlxdWVseSBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuCi0gKiBUaGUgaWQgbmVlZHMgdG8gYmUgdW5pcXVlIG9ubHkgd2l0aGluIG9uZSBwYXJ0aWN1bGFyIElWYWxpZGF0b3IuCi0gKiAKLSAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbmFtZS4KLSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIG9iamVjdCBvciBudWxsIGlmIHRoZSBvYmplY3QgaXMgbnVsbC4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpIAotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldCB0YXJnZXRuYW1lIGZvciAiICsgb2JqZWN0KTsKLSAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIG1hcmtlcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGZyb20gdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KLSAgICogCi0gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gZGVsZXRlIHRoZSBtYXJrZXJzIGZyb20uCi0gICAqIEBwYXJhbSBtYXJrZXJUeXBlIFRoZSB0eXBlIG9mIG1hcmtlcnMgdG8gZGVsZXRlIGZyb20gdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdoaWNoIHRoZSBtYXJrZXJzIG11c3QgaGF2ZSB0byBiZSBkZWxldGVkLgotICAgKiBAcGFyYW0gYXR0cmlidXRlVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byBhdHRyaWJ1dGVOYW1lIHdoaWNoIHRoZSBtYXJrZXJzIG11c3QgaGF2ZSB0byBiZSBkZWxldGVkLgotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1hcmtlclR5cGUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBmaW5hbCBPYmplY3QgYXR0cmlidXRlVmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsgICAgICAgICAgCi0gICAgZmluYWwgSU1hcmtlcltdIHY0MDBNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICBmaW5hbCBJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKG1hcmtlclR5cGUsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIAotICAgICB7Ci0gICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgICAgICB7ICAgIAotICAgICAgICAgLy8gdGhpcyBmaXhlcyBkZWZlY3QgMTkzNDA2Ci0gICAgICAgICAvLyBoZXJlIHdlIHJlbW92ZSBtYXJrZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZCBieSB0aGUgdjQwMCBjb2RlCi0gICAgICAgICAvLyBob3BlZnVsbHkgdGhlICcubWFya2VycycgbWV0YWRhdGEgZmlsZXMgd2lsbCBiZSByZW1vdmVkIGZvciB0aGUgVjUgaW5zdGFsbAotICAgICAgICAgLy8gYW5kIHRoaXMga2x1ZGdlIHdpbGwgbm90IGJlIG5lZWRlZCB0aGVyZQotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2NDAwTWFya2Vycy5sZW5ndGg7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOyAgICAgICAgICAgCi0gICAgICAgICAgIG1hcmtlci5kZWxldGUoKTsgICAgICAgICAgIAotICAgICAgICAgfQotICAgIAotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSAKLSAgICAgICAgIHsKLSAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotICAgICAgICAgICAKLSAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIHZhbHVlLmVxdWFscyhhdHRyaWJ1dGVWYWx1ZSkpIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgbWFya2VyLmRlbGV0ZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9OwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3AsIG51bGwpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eSBmb3IgdGhlIGdpdmVuIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSB0byBjb252ZXJ0IHRvIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNldmVyaXR5LgotICAgKiBAcmV0dXJuIFRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eSBmb3IgdGhlIGdpdmVuIHNldmVyaXR5LgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGlvbkZyYW1ld29ya1NldmVyaXR5KGludCBzZXZlcml0eSkKLSAgewotICAgIHN3aXRjaCAoc2V2ZXJpdHkpCi0gICAgewotICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLSAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk86Ci0gICAgICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0gICAgfQotICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTGF6eVVSTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGNiMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBhbGxvd3MgSW5wdXRTdHJlYW1zIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIHRvIHhlcmNlcyB3aXRob3V0Ci0gKiBhY3R1YWxseSBvcGVuaW5nIGZpbGUgaGFuZGxlcyBvciBuZXR3b3JrIGNvbm5lY3Rpb25zIHVudGlsIGl0IGlzIGFic29sdXRlbHkKLSAqIG5lY2Nlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5VVJMSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbQoteyAgCi0gIHByaXZhdGUgc3RhdGljIGludCBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50ID0gMDsgCi0gIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbm5lcjsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGVycm9yOwotICBib29sZWFuIGhhc01hcmtzOwotICBib29sZWFuIHByZXRlbmRGaWxlSXNTdGlsbE9wZW47Ci0KLSAgcHVibGljIExhenlVUkxJbnB1dFN0cmVhbShTdHJpbmcgdXJsKQotICB7Ci0gICAgdGhpcy51cmwgPSB1cmw7Ci0JaW5uZXIgPSBudWxsOwotCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChpbm5lciA9PSBudWxsICYmICFlcnJvcikKLSAgICB7Ci0gICAgICBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50Kys7Ci0gICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW5uZXIgPSBuZXcgVVJMKHVybCkub3BlblN0cmVhbSgpOwotCQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0JCWhhc01hcmtzID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5IAotICAgICAgewotICAgICAgICBpZiAoaW5uZXIgPT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbm5lciAhPSBudWxsICYmICFwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCQlpbm5lci5jbG9zZSgpOwotCQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IHRydWU7Ci0JCX0KLSAgCX0KLQotICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAwOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gaW5uZXIuYXZhaWxhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHsKLQkJLy8gU3RvcCBiZWhhdmluZyBhcyBpZiB0aGUgc3RyZWFtIHdlcmUgc3RpbGwgb3Blbi4KLQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCWlmIChpbm5lciAhPSBudWxsKSB7Ci0JCQlkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50LS07Ci0JCQlpbm5lci5jbG9zZSgpOwotCQl9Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybjsKLQloYXNNYXJrcyA9IHRydWU7Ci0JdHJ5IHsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlubmVyLm1hcmsocmVhZGxpbWl0KTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gZmFsc2U7Ci0JdHJ5IHsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpbm5lci5tYXJrU3VwcG9ydGVkKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoKTsKLQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQlyZXR1cm4gYnl0ZXNSZWFkOwotICB9Ci0KLQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoYik7Ci0JCWlmIChieXRlc1JlYWQgPT0gLTEgJiYgIWhhc01hcmtzKSBjbG9zZVN0cmVhbSgpOwotCQlyZXR1cm4gYnl0ZXNSZWFkOwotCX0KLQotICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7ICAgIAotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gLTE7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKGIsIG9mZiwgbGVuKTsKLQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQlyZXR1cm4gYnl0ZXNSZWFkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm47Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWlubmVyLnJlc2V0KCk7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsgICAKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIDA7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBpbm5lci5za2lwKG4pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL05lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI3MTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLQotLyoqCi0gKiBBIGNvbnRleHQgY2xhc3MgZm9yIHZhbGlkYXRvcnMgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgb2YKLSAqIGdpdmVuIHZhbGlkYXRpb24gc2Vzc2lvbi4gQ3VycmVudGx5IHRoaXMgY2xhc3MgaXMgb25seSB1c2VkIHRvIGlkZW50aWZ5Ci0gKiB0aGUgdW5pcXVlIGNvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJlMWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyBtZXNzYWdlcyBmcm9tIGEgdmFsaWRhdG9yLiBUaGlzIGNsYXNzIGNhbiBoYW5kbGUKLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkluZm8gaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiBXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCA9IHRydWU7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFNFVl9FUlJPUiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFNFVl9XQVJOSU5HID0gMTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpbmdfZmlsZV91cmkgPSBudWxsOwotICBwcml2YXRlIFVSTCB2YWxpZGF0aW5nX2ZpbGVfdXJsID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLSAgcHJpdmF0ZSBMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIEhhc2hNYXAgbmVzdGVkTWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIGZvciB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uSW5mbyhTdHJpbmcgdXJpKQotICB7Ci0gICAgaWYodXJpICE9IG51bGwpCi0gICAgewotICAgICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJpID0gdXJpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGluZ19maWxlX3VyaTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBudWxsLCBudWxsKTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgU3RyaW5nIGtleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAgICAKLSAgICBpZihhZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBTRVZfRVJST1IsIGtleSwgbWVzc2FnZUFyZ3VtZW50cykpCi0gICAgewotICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgd2FybmluZyBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN0cmluZyBtZXNzYWdlIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgYWRkV2FybmluZyhtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgICAgCi0gICAgYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgU0VWX1dBUk5JTkcsIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoZSBsaXN0LiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxpc3QuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBYZXJjZXMgZXJyb3Iga2V5IGZvciB0aGlzIGVycm9yCi0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGVycm9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIGludCBzZXZlcml0eSwgU3RyaW5nIGtleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgewotICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bGx5QWRkZWQgPSBmYWxzZTsKLSAgICAvLyBJZiB0aGUgbWVzc2FnZSBpZiBudWxsIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkLgotICAgIGlmKG1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gICAgfQotICAgIFN0cmluZyBlcnJvclVSSSA9IG5vcm1hbGl6ZSh1cmkpOwotICAgIFVSTCBlcnJvclVSTCA9IG51bGw7Ci0gICAgaWYgKGVycm9yVVJJICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVycm9yVVJMID0gbmV3IFVSTChlcnJvclVSSSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIC8vZXJyb3JVUkkgPSBub3JtYWxpemVVUkkoZXJyb3JVUkkpOwotICAgIH0KLSAgICAvL2Jvb2xlYW4gZG9EaWFsb2cgPSB0cnVlOwotICAgIGlmIChlcnJvclVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1Y2Nlc3NmdWxseUFkZGVkID0gdHJ1ZTsKLSAgICAgIC8vIEFkZCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdCBpZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBvZmYgb3IKLSAgICAgIC8vIHRoaXMgbWVzc2FnZSBpcyBmb3IgdGhlIGN1cnJlbnQgZmlsZS4KLSAgICAgIGlmICghV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQgfHwgdmFsaWRhdGluZ19maWxlX3VybC5zYW1lRmlsZShlcnJvclVSTCkpCi0gICAgICB7Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsbWVzID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UsIGxpbmUsCi0gICAgICAgICAgICBjb2x1bW4sIHZhbGlkYXRpbmdfZmlsZV91cmksIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBTRVZfRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxtZXMuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX05PUk1BTCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gU0VWX1dBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxtZXMuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZXMuYWRkKHZhbG1lcyk7Ci0gICAgICB9Ci0gICAgICAvLyBJZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBlbmFibGVkIGNyZWF0ZSBhIG5lc3RlZCBlcnJvci4KLSAgICAgIGVsc2UgaWYgKFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmVzdGVkdXJpID0gZXJyb3JVUkwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgbmVzdGVkbWVzcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCBuZXN0ZWR1cmksIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgICAgIGlmKHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXN0ZWRtZXNzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9OT1JNQUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgY29udGFpbmVyID0gKFZhbGlkYXRpb25NZXNzYWdlKSBuZXN0ZWRNZXNzYWdlcy5nZXQobmVzdGVkdXJpKTsKLSAgICAgICAgaWYoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250YWluZXIgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoTkxTLmJpbmQoWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLl9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFLCBuZXcgT2JqZWN0IFtdIHsgbmVzdGVkdXJpIH0pLCAxLCAwLCBuZXN0ZWR1cmkpOwotICAgICAgIAotICAgICAgICAgIC8vIEluaXRpYWxseSBzZXQgdGhlIG5lc3RlZCBlcnJvciB0byBhIHdhcm5pbmcuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAvLyB0byBhbiBlcnJvciBpZiBhIG5lc3RlZCBtZXNzYWdlIGhhcyBhIHNldmVyaXR5IG9mIGVycm9yLgotICAgICAgICAgIGNvbnRhaW5lci5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLSAgICAgICAgICBuZXN0ZWRNZXNzYWdlcy5wdXQobmVzdGVkdXJpLCBjb250YWluZXIpOwotICAgICAgICAgIG1lc3NhZ2VzLmFkZChjb250YWluZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRhaW5lci5hZGROZXN0ZWRNZXNzYWdlKG5lc3RlZG1lc3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQWRkIGEgbmVzdGVkIG1lc3NhZ2UgdG8gdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgc3RyaW5nIG1lc3NhZ2Ugb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHkpCi0vLyAgewotLy8gICAgVmFsaWRhdGlvbk1lc3NhZ2UgbmVzdGVkbWVzcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSk7Ci0vLyAgICBpZihzZXZlcml0eSA9PSBTRVZfV0FSTklORykKLS8vICAgIHsKLS8vICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKTsKLS8vICAgIH0KLS8vICAgIFZhbGlkYXRpb25NZXNzYWdlIGNvbnRhaW5lciA9IChWYWxpZGF0aW9uTWVzc2FnZSluZXN0ZWRNZXNzYWdlcy5nZXQodXJpKTsKLS8vICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotLy8gICAgewotLy8gICAgICBjb250YWluZXIgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoWE1MQ29yZVZhbGlkYXRpb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UsIHVyaSksIDEsIDAsIHZhbGlkYXRpbmdfZmlsZV91cmkpOwotLy8gICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBuZXN0ZWQgZXJyb3IgdG8gYSB3YXJuaW5nLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjaGFuZ2VkCi0vLyAgICAgIC8vIHRvIGFuIGVycm9yIGlmIGEgbmVzdGVkIG1lc3NhZ2UgaGFzIGEgc2V2ZXJpdHkgb2YgZXJyb3IuCi0vLyAgICAgIGNvbnRhaW5lci5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLS8vICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KHVyaSwgY29udGFpbmVyKTsKLS8vICAgICAgbWVzc2FnZXMuYWRkKGNvbnRhaW5lcik7Ci0vLyAgICB9Ci0vLyAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0I2dldFZhbGlkYXRpb25NZXNzYWdlcygpCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIChWYWxpZGF0aW9uTWVzc2FnZVtdKW1lc3NhZ2VzLnRvQXJyYXkobmV3IFZhbGlkYXRpb25NZXNzYWdlW21lc3NhZ2VzLnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIG5lc3RlZE1lc3NhZ2VzOwotICB9Ci0gIAotICAvKioKLSAgICogUHV0IHRoZSBVUkkgaW4gYSBzdGFuZGFyZCBmb3JtYXQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gcHV0IGludG8gYSBzdGFuZGFyZCBmb3JtYXQuCi0gICAqIEByZXR1cm4gVGhlIHN0YW5kYXJkIGZvcm1hdCBvZiB0aGUgVVJJLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB1cmkpCi0gIHsKLS8vICAgIGlmKHVyaS5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSkKLS8vICAgIHsKLS8vICAgICAgdHJ5Ci0vLyAgICAgIHsKLS8vICAgICAgICB1cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwodXJpKSkudG9TdHJpbmcoKTsKLS8vICAgICAgfQotLy8gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLS8vICAgICAgewotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgdXJpID0gdXJpLnJlcGxhY2VBbGwoIiUyMCIsIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgdXJpID0gdXJpLnJlcGxhY2VBbGwoIiU1RSIsICJeIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHVyaSA9IHVyaS5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICAKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY0ZDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBIGNsYXNzIGZvciBob2xkaW5nIHZhbGlkYXRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4gSG9sZHMgdGhlIG1lc3NhZ2UgYW5kIHRoZQotICogbWVzc2FnZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBFUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24iLCAiZXJyb3JNZXNzYWdlTWFwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBpbnQgbGluZU51bWJlcjsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW5OdW1iZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpOwotICBwcm90ZWN0ZWQgTGlzdCBuZXN0ZWRFcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2V5OwotICBwcm90ZWN0ZWQgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50czsKLSAgcHJvdGVjdGVkIGludCBzdGFydE9mZnNldDsKLSAgcHJvdGVjdGVkIGludCBzZXZlcml0eSA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgcHVibGljIHN0YXRpYyBpbnQgU0VWX0hJR0ggPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTk9STUFMID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTE9XID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgewotICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBudWxsKTsKLSAgfQotCi0gIC8qKiAKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICovCi0gICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gICAKLSAgIC8qKiAKLSAgICAqIENvbnN0cnVjdG9yLgotICAgICogCi0gICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICAqIEBwYXJhbSBrZXkgYSB1bmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IKLSAgICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIHRoZSBhcmd1bWVudHMgWGVyY2VzIHVzZXMgdG8gY3JlYXRlIHRoZSBtZXNzYWdlCi0gICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICAgewotICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgIHRoaXMua2V5ID0ga2V5OwotCSB0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotICAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gMDsgICAgCi0gICB9Ci0gICAKLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHVyaSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVcmkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQgYXMgYSBuZXN0ZWQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpCi0gIHsKLSAgICBpZiAobmVzdGVkRXJyb3JzID09IG51bGwpCi0gICAgewotICAgICAgbmVzdGVkRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLSAgICBuZXN0ZWRFcnJvcnMuYWRkKHZhbGlkYXRpb25NZXNzYWdlKTsKLSAgICBpbnQgdmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgaWYodmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9PSBTRVZfTk9STUFMIHx8IHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPT0gU0VWX0hJR0gpCi0gICAgewotICAgICAgc2V0U2V2ZXJpdHkoU0VWX05PUk1BTCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkRXJyb3JzICE9IG51bGwgPyBuZXN0ZWRFcnJvcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzZXZlcml0eSBvZiB0aGUgZGVmZWN0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhlIGRlZmVjdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKQotICB7Ci0gIAlyZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldiBUaGUgc2V2ZXJpdHkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldikKLSAgewotICAJc2V2ZXJpdHkgPSBzZXY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpCi0gIHsKLSAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpCi0gIHsKLQkgIHJldHVybiB0aGlzLm1lc3NhZ2VBcmd1bWVudHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwZTAyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSB2YWxpZGF0aW9uIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoZSByZXBvcnQgcmVmZXJzIHRvLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIGlzIHZhbGlkLiBUaGUgZmlsZSBtYXkgaGF2ZSB3YXJuaW5ncyBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhbiBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHJldHVybiBBbiBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gIAotICBwdWJsaWMgSGFzaE1hcCBnZXROZXN0ZWRNZXNzYWdlcygpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvQ29tbWFuZExpbmVMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Db21tYW5kTGluZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ5OTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Db21tYW5kTGluZUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBBIGxvZ2dlciB0aGF0IHdpbGwgcHJpbnQgbG9nIGluZm8gdG8gU3lzdGVtLm91dC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyCi17Ci0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvcik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIHdhcm5pbmcsIFRocm93YWJsZSBleGNlcHRpb24pCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4od2FybmluZyk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0VjbGlwc2VMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDY5NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0VjbGlwc2VMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIGxvZyB0byB0aGUgbG9nIGZpbGUgaW4gdGhlIGVjbGlwc2UgbWV0YWRhdGEgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIKLXsKLSAgCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBlcnJvciwgZXhjZXB0aW9uKSk7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgd2FybmluZywgZXhjZXB0aW9uKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI4MzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHN0YW5kYXJkIGxvZ2dlci4gQWxsb3dzIGZvciBsb2dnaW5nIGVycm9ycyBhbmQgd2FybmluZ3MuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nZ2VyCi17Ci0gIC8qKgotICAgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgbWVzc2FnZSB0byBsb2cuCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSBleGNlcHRpb24pOwotCi0gIC8qKgotICAgKiBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlIHRvIGxvZy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIHdhcm5pbmcsIFRocm93YWJsZSBleGNlcHRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Mb2dnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDljNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBUaGUgbG9nZ2VyIGZhY3RvcnkgYWxsb3dzIGZvciBzaW1wbGUgdXNlIG9mIHdoYXRldmVyIGxvZ2dpbmcgbWVjaGFuaXNtIGlzIGluCi0gKiBwbGFjZS4gVGhlIHRvb2wgY2FuIHNwZWNpZnkgYSBjdXN0b20gbG9nZ2luZyBjbGFzcyBhbmQgY2FuIHJlcXVlc3QgdGhlCi0gKiBsb2dnZXIgZnJvbSB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXJGYWN0b3J5Ci17Ci0gIHByaXZhdGUgc3RhdGljIElMb2dnZXIgICAgICBsb2dnZXIgICAgICAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyICBjbGFzc2xvYWRlciAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyAgICAgICBsb2dnZXJDbGFzcyAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb21tYW5kbGluZWxvZ2dlciA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5sb2dnaW5nLkNvbW1hbmRMaW5lTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWNsaXBzZWxvZ2dlciAgICAgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUubG9nZ2luZy5FY2xpcHNlTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgICAgICAgZGVmYXVsdGxvZ2dlciAgICAgPSBjb21tYW5kbGluZWxvZ2dlcjsKLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJTG9nZ2VyIGdldExvZ2dlckluc3RhbmNlKCkKLSAgewotICAgIGlmKGxvZ2dlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGxvZ2dlckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmKGNsYXNzbG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IGNsYXNzbG9hZGVyLmxvYWRDbGFzcyhsb2dnZXJDbGFzcyk7Ci0gICAgICAgICAgICBsb2dnZXIgPSAoSUxvZ2dlcikgbGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobG9nZ2VyQ2xhc3MpOwotICAgICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZihsb2dnZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZGVmYXVsdGxvZ2dlcik7Ci0gICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBsb2dnZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjbGFzc25hbWUKLSAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbG9nZ2VyIGNsYXNzLgotICAgKiBAcGFyYW0gbG9nZ2VyY2xhc3Nsb2FkZXIKLSAgICogICAgICAgICAgICBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGxvZ2dlci4gSWYgbnVsbCwgdGhlIGRlZmF1bHQKLSAgICogICAgICAgICAgICBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc3BlY2lmeUxvZ2dlcihTdHJpbmcgY2xhc3NuYW1lLCBDbGFzc0xvYWRlciBsb2dnZXJjbGFzc2xvYWRlcikKLSAgewotICAgIGxvZ2dlckNsYXNzID0gY2xhc3NuYW1lOwotICAgIGNsYXNzbG9hZGVyID0gbG9nZ2VyY2xhc3Nsb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBkZWZhdWx0IGxvZ2dlciB0byB0aGUgZWNsaXBzZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdXNlRWNsaXBzZUxvZ2dlcigpCi0gIHsKLSAgICBkZWZhdWx0bG9nZ2VyID0gZWNsaXBzZWxvZ2dlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE2NDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnLWluIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaW9uCi0gKiBlcnJvciBjdXN0b21pemVyIHdpdGggdGhlIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIgewotCQotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVycm9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZ05hbWUgPSBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0KLQkgIC8qKgotCSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBmb3IgdGhlIGVycm9yY3VzdG9taXplciBleHRlbnNpb24uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JICB7Ci0JICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkgICAgaWYgKHBvaW50ICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JICAgICAgewotCSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICAvKioKLQkgICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAgICoKLQkgICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lcnJvckN1c3RvbWl6ZXIiCi0JICAgKiAgICAgICAgICAgIGlkPSJzcGVjaWZpY0Vycm9yQ3VzdG9taXplciIKLQkgICAqICAgICAgICAgICAgbmFtZT0iU3BlY2lmaWMgRXJyb3IgQ3VzdG9taXplciI+Ci0JICAgKiAgIDxlcnJvckN1c3RvbWl6ZXIKLQkgICAqICAgCQkJbmFtZXNwYWNlPSJodHRwOi8vc3BlY2lmaWNuYW1lc3BhY2UiCi0JICAgKiAgIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuTXlTcGVjaWZpY0Vycm9yQ3VzdG9taXplci8+Ci0JICAgKiA8L2V4dGVuc2lvbj4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JICB7Ci0JICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JICAgIHsKLQkgICAgICBTdHJpbmcgZXJyb3JDdXN0b21pemVyQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLQotCSAgICAgIGlmIChlcnJvckN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRyeQotCSAgICAgICAgewotCSAgICAgICAgICBCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCSAgICAgICAgICBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlKHBsdWdpbkJ1bmRsZSwgZXJyb3JDdXN0b21pemVyQ2xhc3MpOwotCSAgICAgICAgICBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmFkZEVycm9yTWVzc2FnZUN1c3RvbWl6ZXIobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgICAgICB7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1OTJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gd2Fybk5vR3JhbW1hciA9IGZhbHNlOwotICAKLSAgLyoqCi0gICAqIFNldCBhbnkgcHJlZmVyZW5jZXMgZm9yIFhNTCB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3NldHVwVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCXN1cGVyLnNldHVwVmFsaWRhdGlvbihjb250ZXh0KTsKLQl3YXJuTm9HcmFtbWFyID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsgIAotCVhNTFZhbGlkYXRvciB2YWxpZGF0b3IgPSBYTUxWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotCVhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLQl0cnkKLQl7Ci0JICBjb25maWd1cmF0aW9uLnNldEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uV0FSTl9OT19HUkFNTUFSLCB3YXJuTm9HcmFtbWFyKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgLy8gVE9ETzogVW5hYmxlIHRvIHNldCB0aGUgcHJlZmVyZW5jZS4gTG9nIHRoaXMgcHJvYmxlbS4KLQl9Ci0JCi0JWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCWlmIChpbnB1dHN0cmVhbSAhPSBudWxsKQotCXsKLQkgIHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIGlucHV0c3RyZWFtLCBjb25maWd1cmF0aW9uKTsKLQl9Ci0JZWxzZQotCXsKLQkgIHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIG51bGwsIGNvbmZpZ3VyYXRpb24pOwotCX0KLQkJICAgICAgICAKLQlyZXR1cm4gdmFscmVwb3J0OwotICB9Ci0JICAKLSAgLyoqCi0gICAqIFN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4gRm9yIFhNTCB2YWxpZGF0aW9uIHRoZXJlCi0gICAqIGFyZSB0aHJlZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byBzdG9yZToKLSAgICogcGFyYW1bMF0gPSB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXJyb3IKLSAgICogcGFyYW1bMV0gPSB0aGUgJ3NxdWlnZ2xlIHNlbGVjdGlvbiBzdHJhdGVneScgZm9yIHdoaWNoIERPTSBwYXJ0IHRvIHNxdWlnZ2xlCi0gICAqIHBhcmFtWzJdID0gdGhlIG5hbWUgb3IgdmFsdWUgb2Ygd2hhdCBpcyB0byBiZSBzcXVpZ2dsZWQKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNhZGRJbmZvVG9NZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7IAotCVN0cmluZyBrZXkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRLZXkoKTsKLQlpZihrZXkgIT0gbnVsbCkKLQl7Ci0gICAgICBYTUxNZXNzYWdlSW5mb0hlbHBlciBtZXNzYWdlSW5mb0hlbHBlciA9IG5ldyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpOwotICAgICAgU3RyaW5nW10gbWVzc2FnZUluZm8gPSBtZXNzYWdlSW5mb0hlbHBlci5jcmVhdGVNZXNzYWdlSW5mbyhrZXksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0gICAgICAKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMF0pOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzFdKTsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyZmNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLS8qKgotICogVGhlIG1lc3NhZ2UgaW5mbyBoZWxwZXIgZGV0ZXJtaW5lcyB0aGUgc2VsZWN0aW9uIHN0cmF0ZWd5IGZvciBlbGVtZW50cwotICogaW4gYSBTU0UgZWRpdG9yLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTE1lc3NhZ2VJbmZvSGVscGVyCi17Ci0gIHB1YmxpYyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqICBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBzaG91bGQgYmUgdW5kZXJsaW5lZCB3aXRoIHRoZSByZWQgInNxdWlnZ2xlcyIKLSAgICogIHVzaW5nIHRoZSBlcnJvcktleSwgYW5kIHRoZSBtZXNzYWdlQXJndW1lbnRzLgotICAgKiAgPGJyPlBvc2l0aW9uIDAgb2YgdGhlIGFycmF5IHJldHVybmVkIGNvbnRhaW5zIHRoZSBzZWxlY3Rpb24gU3RyYXRlZ3ksIG9yIHdoYXQgRE9NIEVsZW1lbnQgdG8gdW5kZXJsaW5lLiAgCi0gICAqICBGb3IgZXhhbXBsZSAiQVRUUklCVVRFX05BTUUiICAKLSAgICogIDxicj5Qb3NpdGlvbiAxIGNvbnRhaW5zIHRoZSBuYW1lIG9yIHZhbHVlIHRvIHNxdWlnZ2xlLgotICAgKiAgPHA+Rm9yIGV4YW1wbGUsIGlmIHdlIHdhbnRlZCB0byBzcXVpZ2dsZSB0aGUgYXR0cmlidXRlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG5hbWUKLSAgICogIGZvbyB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4geyJBVFRSSUJVVEVfTkFNRSIsICJmb28ifQotICAgKiAgPC9wPgotICAgKiAgQHBhcmFtIGVycm9yS2V5IAotICAgKiAgCQlUaGUgZXJyb3Iga2V5IGdpdmVuIGJ5IHRoZSBYZXJjZXMgcGFyc2VyLgotICAgKiAgQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgCi0gICAqICAJCVRoZSBhcmd1bWVudHMgdXNlZCBieSBYZXJjZXMgdG8gImZpbGwgaW4gdGhlIGJsYW5rcyIgb2YgdGhlaXIgbWVzc2FnZXMuCi0gICAqICBAcmV0dXJuIAotICAgKiAgCQlBbiBhcnJheSBjb250YWluaW5nIHRoZSBzcXVpZ2dsZSBpbmZvcm1hdGlvbi4KLSAgICogIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IKLSAgICogIAotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGNyZWF0ZU1lc3NhZ2VJbmZvKFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAKLSAgICBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSBudWxsOwotICAgIFN0cmluZyBuYW1lT3JWYWx1ZSA9IG51bGw7Ci0gICAgCi0gICAgaWYoZXJyb3JLZXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5hIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5kIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5iIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQ09OVEVOVF9JTlZBTElEIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotICAgICAgICB8IGVycm9yS2V5LmVxdWFscygiTVNHX0NPTlRFTlRfSU5DT01QTEVURSIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX1JFUVVJUkVEX0FUVFJJQlVURV9OT1RfU1BFQ0lGSUVEIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjQiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiU1RBUlRfVEFHIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIlRFWFQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi4zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLXR5cGUuMy4xLjEiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJBTExfQVRUUklCVVRFUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjIuMiIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9OT1RfREVDTEFSRUQiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCSAgICAvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdW5kZXJsaW5lCi0JICAgIG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtYXR0cmlidXRlLjMiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19BVFRSSUJVVEVfVkFMVUVfTk9UX0lOX0xJU1QiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMy4xIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICB7CQotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJBVFRSSUJVVEVfVkFMVUUiOyAgIC8vJE5PTi1OTFMtMSQKLQkJLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgbmFtZSBvZiB0aGUgQXR0cmlidXRlCi0gICAgCWlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1hdHRyaWJ1dGUuMyIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjEiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCXsgCi0gICAgCSAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX1ZBTFVFX05PVF9JTl9MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJewkKLSAgICAJICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1swXTsKLSAgICAJfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtZWx0LjQuMiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7CQotICAgIAlzZWxlY3Rpb25TdHJhdGVneT0iVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUiOyAvLyROT04tTkxTLTEkCi0JCS8vaW4gdGhpcyBjYXNlIHdlIG5lZWQgbmFtZU9yVmFsdWUgdG8gYmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2Ugd2FudCB0byB1bmVybGluZQotICAgIAluYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsJCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVudGl0eU5vdERlY2xhcmVkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgIAkKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3k9IlRFWFRfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVsZW1lbnRVbnRlcm1pbmF0ZWQiKSkgLy8kTk9OLU5MUy0xJAotCSAgewotCQlzZWxlY3Rpb25TdHJhdGVneSA9ICJFTlRJUkVfRUxFTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLSAgICB9Ci0gICAgU3RyaW5nIG1lc3NhZ2VJbmZvW10gPSBuZXcgU3RyaW5nWzJdOwotICAgIG1lc3NhZ2VJbmZvWzBdID0gc2VsZWN0aW9uU3RyYXRlZ3kgIT0gbnVsbD8gc2VsZWN0aW9uU3RyYXRlZ3k6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgbWVzc2FnZUluZm9bMV0gPSBuYW1lT3JWYWx1ZTsKLSAgICByZXR1cm4gbWVzc2FnZUluZm87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk3MTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLS8qKgotICogQW4gWE1MIHZhbGlkYXRvciBzcGVjaWZpYyB0byBFY2xpcHNlLiBUaGlzIHZhbGlkYXRvciB3aWxsIHdyYXAgdGhlIGludGVybmFsCi0gKiBYTUwgdmFsaWRhdG9yIGFuZCBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LiBUaGlzIGNsYXNzIGFsc28KLSAqIHJlYWRzIGZyb20gdGhlIHBsdWctaW4gcmVnaXN0cnkgYW5kIHJlZ2lzdGVycyBhbGwgZXJyb3IgY3VzdG9taXplcnMgd2l0aCB0aGUKLSAqIHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIFhNTFZhbGlkYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIFhNTCB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3IKLSAgICogY2FuIGJlIHJldXNlZCBhbmQgY2Fubm90IGJlIGN1c3RvbWl6ZWQgc28gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGluc3RhbmNlIG9mIGl0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYTUwgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYTUxWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYTUxWYWxpZGF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlIHRoZSBYTUwgdmFsaWRhdG9yLCBzZXQgdGhlIFVSSSByZXNvbHZlciBhbmQKLSAgICogZ2V0IHRoZSBleHRlbnNpb24gZXJyb3IgY3VzdG9taXplcnMgZnJvbSB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MVmFsaWRhdG9yKCkKLSAgewotICAgIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkpOwotICAgIG5ldyBFcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRWxlbWVudEluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRWxlbWVudEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWM5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGFuIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluZm9ybWF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAJCVRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRWxlbWVudEluZm9ybWF0aW9uKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotCXJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvY2FsIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxuYW1lKCkKLSAgewotCXJldHVybiBsb2NhbE5hbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LiBUaGUgbGlzdCBjb250YWlucwotICAgKiBFbGVtZW50SW5mb3JtYXRpb24gb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLQlyZXR1cm4gY2hpbGRyZW47Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1YWNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdHJhY2tzIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJzZWQgZG9jdW1lbnQgdG8gaGVscCBpZGVudGlmeSBlcnJvcgotICogY29uZGl0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcgotewotICBwcm90ZWN0ZWQgU3RhY2sgZWxlbWVudEluZm9ybWF0aW9uU3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgcHJvdGVjdGVkIEVycm9yTWVzc2FnZUluZm9ybWF0aW9uIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBzdGFydCBlbGVtZW50IG1ldGhvZCBvZiB0aGUgWE1MIHZhbGlkYXRvcidzCi0gICAqIGNvbnRlbnQgaGFuZGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgeyAKLSAgICBFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm9ybWF0aW9uID0gbmV3IEVsZW1lbnRJbmZvcm1hdGlvbih1cmksIGxvY2FsTmFtZSk7Ci0gICAgaWYgKGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnNpemUoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudEluZm9ybWF0aW9uIHBhcmVudCA9IChFbGVtZW50SW5mb3JtYXRpb24pIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnBlZWsoKTsKLSAgICAgIHBhcmVudC5jaGlsZHJlbi5hZGQoZWxlbWVudEluZm9ybWF0aW9uKTsKLSAgICB9Ci0gICAgZWxlbWVudEluZm9ybWF0aW9uU3RhY2sucHVzaChlbGVtZW50SW5mb3JtYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGVuZCBlbGVtZW50IG1ldGhvZCBvZiB0aGUgWE1MIHZhbGlkYXRvcidzCi0gICAqIGNvbnRlbnQgaGFuZGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsgICAKLSAgICBpZiAoZWxlbWVudEluZm9ybWF0aW9uU3RhY2suc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm9ybWF0aW9uID0gKEVsZW1lbnRJbmZvcm1hdGlvbillbGVtZW50SW5mb3JtYXRpb25TdGFjay5wb3AoKTsKLSAgICAgIGlmIChtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10gY3VzdG9taXplcnMgPSBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEN1c3RvbWl6ZXJzKGVsZW1lbnRJbmZvcm1hdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGludCBudW1DdXN0b21pemVycyA9IGN1c3RvbWl6ZXJzLmxlbmd0aDsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bUN1c3RvbWl6ZXJzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGN1c3RvbWl6ZXJzW2ldLmN1c3RvbWl6ZU1lc3NhZ2UoZWxlbWVudEluZm9ybWF0aW9uLCBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5rZXksIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmFyZ3VtZW50cyk7Ci0gICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgCW1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLm1lc3NhZ2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgCWJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnNpZGVyIHRoZSByZXBvcnRlZCBlcnJvciBmb3IgY3VzdG9taXphdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxJbmZvCi0gICAqIAkJVGhlIGN1cnJlbnQgVmFsaWRhdGlvbkluZm8gb2JqZWN0IGNvbnRhaW5pbmcgdmFsaWRhdGlvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIGtleQotICAgKiAJCVRoZSBrZXkgcmVsYXRlZCB0byB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgKiAJCUFueSBtZXNzYWdlIGFyZ3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbnNpZGVyUmVwb3J0ZWRFcnJvcihWYWxpZGF0aW9uSW5mbyB2YWxJbmZvLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMpCi0gIHsKLSAgICBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiA9IG51bGw7Ci0gICAgVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcyA9IHZhbEluZm8uZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+IDApCi0gICAgeyAgCi0gICAgICBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiA9IG5ldyBFcnJvck1lc3NhZ2VJbmZvcm1hdGlvbigpOwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ua2V5ID0ga2V5OwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24uYXJndW1lbnRzID0gYXJndW1lbnRzOwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ubWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdOyAKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBIHNpbXBsZSBjbGFzcyB0byBob2xkIGVycm9yIG1lc3NhZ2UgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlSW5mb3JtYXRpb24KLSAgewotCXB1YmxpYyBTdHJpbmcga2V5ID0gbnVsbDsKLQlwdWJsaWMgT2JqZWN0W10gYXJndW1lbnRzID0gbnVsbDsKLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTQ4NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgZXJyb3IgY3VzdG9taXphdGlvbiByZWdzaXRyeSBtYW5hZ2VzIGFsbCByZWdpc3RlcmVkCi0gKiBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcnMgYnkgbmFtZXNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkgCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICBwcm90ZWN0ZWQgTWFwIGN1c3RvbWl6ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIC8qKgotICAgKiBSZXN0cmljdGVkIGNvbnN0cnVjdG9yIGluIGtlZXBpbmcgd2l0aCB0aGUgc2luZ2xldG9uIHBhdHRlcm4uCi0gICAqLwotICBwcm90ZWN0ZWQgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotCWlmKHJlZ2lzdHJ5ID09IG51bGwpCi0JewotCSAgcmVnaXN0cnkgPSBuZXcgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkoKTsKLQl9Ci0JcmV0dXJuIHJlZ2lzdHJ5OwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgY3VzdG9taXplciB0byB0aGUgcmVnaXN0cnkuIAotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiAJCVRoZSBuYW1lc3BhY2UgdGhlIGN1c3RvbWl6ZXIgd2lsbCBhY3Qgb24uCi0gICAqIEBwYXJhbSBjdXN0b21pemVyCi0gICAqIAkJVGhlIGVycm9yIGN1c3RvbWl6ZXIgdG8gcmVnaXN0ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2VDdXN0b21pemVyKFN0cmluZyBuYW1lc3BhY2UsIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIGN1c3RvbWl6ZXIpCi0gIHsKLQkvLyBUbyByZWdpc3RlciBhIGN1c3RvbWl6ZXIgZm9yIHRoZSBubyBuYW1lc3BhY2UgdXNlIGFuIGVtcHR5IHN0cmluZy4KLQlpZihuYW1lc3BhY2UgPT0gbnVsbCkKLQl7Ci0JICBuYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlMaXN0IGN1c3RvbWl6ZXJzRm9yTlMgPSAoTGlzdCljdXN0b21pemVycy5nZXQobmFtZXNwYWNlKTsKLQlpZihjdXN0b21pemVyc0Zvck5TID09IG51bGwpCi0JewotCSAgY3VzdG9taXplcnNGb3JOUyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIGN1c3RvbWl6ZXJzLnB1dChuYW1lc3BhY2UsIGN1c3RvbWl6ZXJzRm9yTlMpOwotCX0KLQlpZihjdXN0b21pemVyICE9IG51bGwpCi0JewotCSAgY3VzdG9taXplcnNGb3JOUy5hZGQoY3VzdG9taXplcik7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBjdXN0b21pemVycyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIGN1c3RvbWl6ZXJzLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQW4gYXJyYXkgb2YgY3VzdG9taXplcnMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJbXSBnZXRDdXN0b21pemVycyhTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0JaWYobmFtZXNwYWNlID09IG51bGwpCi0JewotCSAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JTGlzdCBjdXN0b21pemVyc0Zvck5TID0gKExpc3QpY3VzdG9taXplcnMuZ2V0KG5hbWVzcGFjZSk7Ci0JaWYoY3VzdG9taXplcnNGb3JOUyA9PSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCXJldHVybiAoSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJbXSljdXN0b21pemVyc0Zvck5TLnRvQXJyYXkobmV3IElFcnJvck1lc3NhZ2VDdXN0b21pemVyW2N1c3RvbWl6ZXJzRm9yTlMuc2l6ZSgpXSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxNDdjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBbiBlcnJvciBtZXNzYWdlIGN1c3RvbWl6ZXIgZGVsZWdhdGUgaXMgdXNlZCB0byBhbGxvdyBmb3IKLSAqIGxhenkgbG9hZGluZyBvZiBlcnJvciBjdXN0b21pemVycy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgaW1wbGVtZW50cyBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcgotewotICBwcm90ZWN0ZWQgQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKLSAgcHJvdGVjdGVkIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBudWxsOwotICAKLSAgcHVibGljIEVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZShCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NuYW1lKQotICB7Ci0JdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLklFcnJvck1lc3NhZ2VDdXN0b21pemVyI2N1c3RvbWl6ZU1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVsZW1lbnRJbmZvcm1hdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBjdXN0b21pemVNZXNzYWdlKEVsZW1lbnRJbmZvcm1hdGlvbiBlbGVtZW50SW5mbywgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBhcmd1bWVudHMpIAotICB7Ci0JaWYoY3VzdG9taXplciA9PSBudWxsKQotCXsKLQkgIGxvYWRDdXN0b21pemVyKCk7Ci0JfQotCWlmKGN1c3RvbWl6ZXIgPT0gbnVsbCkKLQl7Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGN1c3RvbWl6ZXIuY3VzdG9taXplTWVzc2FnZShlbGVtZW50SW5mbywgZXJyb3JLZXksIGFyZ3VtZW50cyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBMb2FkIHRoZSBjdXN0b21pemVyIGNsYXNzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbG9hZEN1c3RvbWl6ZXIoKQotICB7Ci0JdHJ5Ci0JewotCSAgQ2xhc3MgY3VzdG9taXplckNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotCSAgY3VzdG9taXplciA9IChJRXJyb3JNZXNzYWdlQ3VzdG9taXplciljdXN0b21pemVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJICBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgCi0JCQkJCSAgICAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIAotCQkJCQkgICAgIElTdGF0dXMuT0ssIAotCQkJCQkgICAgICJUaGUgWE1MIHZhbGlkYXRvciBlcnJvciBjdXN0b21pemVyIHdhcyB1bmFibGUgdG8gbG9hZCBjbGFzcyAiICsgY2xhc3NuYW1lLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIH0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2ZDFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi0vKioKLSAqIEFuIGVycm9yIG1lc3NhZ2UgY3VzdG9taXplciB3aWxsIGJlIGNhbGxlZCBieSB0aGUgWE1MIHZhbGlkYXRvciB0byBjdXN0b21pemUKLSAqIFhNTCB2YWxpZGF0aW9uIGVycm9ycyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UuIFRoZSBjdXN0b21pemVyIGNhbiBiZSB1c2VkIHRvIAotICogY3JlYXRlIGNsZWFyZXIgZXJyb3JzIGZvciBzcGVjaWZpYyBhcHBsaWNhdGlvbiBkb21haW5zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIAotewotICAvKioKLSAgICogUmV0dXJuIGEgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gTnVsbCBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICogaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIG5vdCBiZSBjdXN0b21pemVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnRJbmZvcm1hdGlvbgotICAgKiAJCVRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gY3VzdG9taXplIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIGVycm9yS2V5Ci0gICAqIAkJVGhlIGtleSBmb3IgdGhlIGVycm9yIGZvciB3aGljaCB0byByZXBsYWNlIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAqIAkJQXJndW1lbnRzIHJlbGF0ZWQgdGhlIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQSBjdXN0b21pemVkIGVycm9yIG1lc3NhZ2Ugb3IgbnVsbCBpZiB0aGlzIGN1c3RvbWl6ZXIgd2lsbCBub3QgY3VzdG9taXplIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBjdXN0b21pemVNZXNzYWdlKEVsZW1lbnRJbmZvcm1hdGlvbiBlbGVtZW50SW5mbywgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBhcmd1bWVudHMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg2YzE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi0hIFVzYWdlOgotISAgIHswfSByZXBsYWNlZCB3aXRoIHRoZSBob3N0IG5hbWUKLSEKLV9VSV9QUk9CTEVNU19WQUxJREFUSU5HX1VOS05PV05fSE9TVCAgICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXMgdGhlIGhvc3QgInswfSIgaXMgY3VycmVudGx5IHVucmVhY2hhYmxlLgotCi0hIFVzYWdlOgotISAgIHswfSByZXBsYWNlZCB3aXRoIHRoZSBmaWxlIG5hbWUKLSEKLV9VSV9QUk9CTEVNU19WQUxJREFUSU5HX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXMgdGhlIFhNTCBTY2hlbWEgInswfSIgdGhhdCBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmluZyB0aGUgc3ludGF4IG9mIHRoZSBmaWxlIGNhbm5vdCBiZSBsb2NhdGVkLgotCi1fVUlfUFJPQkxFTVNfQ09OTkVDVElPTl9SRUZVU0VEICAgICAgICAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZXJlIHdhcyBhIGNvbm5lY3Rpb24gcHJvYmxlbS4KLQotIQotISBSZWZlcmVuY2VkIEZpbGUgRGlhbG9nIFJlbGF0ZWQgTWVzc2FnZQotIQotX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByaWdodCBjbGljayBvbiB0aGUgbWVzc2FnZSBhbmQgc2VsZWN0ICJTaG93IERldGFpbHMuLi4iCi0KLSMgV2FybmluZyB3aGVuIG5vIGdyYW1tYXIgaXMgbG9jYXRlZC4KLV9XQVJOX05PX0dSQU1NQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5vIGdyYW1tYXIgY29uc3RyYWludHMgKERURCBvciBYTUwgc2NoZW1hKSBkZXRlY3RlZCBmb3IgdGhlIGRvY3VtZW50LgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMWMyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1ub3RlYm9vay5qcGFnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1NjYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotcHVibGljIGNsYXNzIERlYnVnQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgRGVidWdBZGFwdGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhJRGVidWdBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZkFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXByaXZhdGUgRGVidWdBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkvL25vbmUgZXhwZWN0ZWQKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IERlYnVnQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJRXZlcnlOb2RlRGVidWdBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IEV2ZXJ5Tm9kZURlYnVnQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJcmV0dXJuIElEZWJ1Z0FkYXB0ZXIuY2xhc3MgPT0gdHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5I3NldENvbnRyaWJ1dGVkRmFjdG9yaWVzKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJLy8gbm9uZSBleHBlY3RlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU0OTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi0vKioKLSAqIFB1cmVseSBmb3IgdXNlIGluIGRlYnVnZ2luZwotICovCi1wdWJsaWMgY2xhc3MgRXZlcnlOb2RlRGVidWdBZGFwdGVyIGltcGxlbWVudHMgSURlYnVnQWRhcHRlciB7Ci0KLQlzdGF0aWMgY2xhc3MgSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oIklkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQ6ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRGVidWcucHJpbnRsbigiSWRvY3VtZW50Q2hhbmdlZDogIiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQWJvdXRUb0JlQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbENoYW5nZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsRGlydHlTdGF0ZUNoYW5nZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsUmVzb3VyY2VEZWxldGVkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsUmVzb3VyY2VNb3ZlZDogIiArICJvbGRNb2RlbDogIiArIG9sZE1vZGVsICsgIm5ld01vZGVsOiAiICsgbmV3TW9kZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQ6ICIgKyAic3RydWN0dXJlZE1vZGVsOiAiICsgc3RydWN0dXJlZE1vZGVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZWluaXRpYWxpemVkOiAiICsgInN0cnVjdHVyZWRNb2RlbDogIiArIHN0cnVjdHVyZWRNb2RlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgaW1wbGVtZW50cyBJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKEFib3V0VG9CZUNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25ld01vZGVsKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRDb250ZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbmV3TW9kZWw6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub0NoYW5nZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9DaGFuZ2U6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub2Rlc1JlcGxhY2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9kZXNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbkNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbkNoYW5nZWQ6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbnNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlciBzaW5nbGV0b25JbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoc2luZ2xldG9uSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc2luZ2xldG9uSW5zdGFuY2UgPSBuZXcgRXZlcnlOb2RlRGVidWdBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkluc3RhbmNlOwotCX0KLQotCUludGVybmFsRG9jdW1lbnRMaXN0ZW5lciBmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCUludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZTsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotCUlTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKTsKLQkJZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSA9IG5ldyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UoKTsKLQkJZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHVibGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQl0aGlzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJRGVidWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllciwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJc2V0TW9kZWwoKChJRE9NTm9kZSkgbm90aWZpZXIpLmdldE1vZGVsKCkpOwotCQl9Ci0JCURlYnVnLnByaW50bG4oIm5vdGlmaWVyOiAiICsgbm90aWZpZXIgKyAiICIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tldmVudFR5cGVdICsgIiBjaGFuZ2VkRmVhdHVyZTogIiArIGNoYW5nZWRGZWF0dXJlICsgIiBvbGRWYWx1ZTogIiArIG9sZFZhbHVlICsgIiBuZXdWYWx1ZTogIiArIG5ld1ZhbHVlICsgIiBwb3M6ICIgKyBwb3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSURlYnVnQWRhcHRlciNzZXREb2N1bWVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50KQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpZiAoZk1vZGVsID09IHN0cnVjdHVyZWRNb2RlbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQkJCWZNb2RlbC5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKTsKLQkJCS8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKTsKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZNb2RlbCA9IHN0cnVjdHVyZWRNb2RlbDsKLQkJaWYgKGZNb2RlbCAhPSBudWxsKSB7Ci0KLQkJCWZNb2RlbC5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKTsKLQkJCS8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKTsKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvSURlYnVnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MmY4NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRGVidWdBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWE2YWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNWFkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9fZl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFhNTENvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTRkYTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLQotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYTUxDb3JlUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0NBVEFMT0dfSUQgPSAidXNlcl9jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19JRCA9ICJkZWZhdWx0X2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0NBVEFMT0dfSUQgPSAic3lzdGVtX2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDYXRhbG9nU2V0IGNhdGFsb2dTZXQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRDYXRhbG9nRmlsZVN0YXRlTG9jYXRpb247Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpIGRpcmVjdGx5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhNTENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSkudG9TdHJpbmcoKTsKLQkJU3RyaW5nIGZpbGVfcHJvdG9jb2wgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvbiAhPSBudWxsICYmICFsb2NhdGlvbi5zdGFydHNXaXRoKGZpbGVfcHJvdG9jb2wpKSB7Ci0JCQlsb2NhdGlvbiA9IGZpbGVfcHJvdG9jb2wgKyBsb2NhdGlvbjsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIElDYXRhbG9nIGdldERlZmF1bHRYTUxDYXRhbG9nKCkgewotCQlpZiAoY2F0YWxvZ1NldCA9PSBudWxsKSB7Ci0JCQljYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsKLQotCQkJZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbiA9IGdldFBsdWdpblN0YXRlTG9jYXRpb24oQ2F0YWxvZy5ERUZBVUxUX0NBVEFMT0dfRklMRSk7Ci0KLQkJCWNhdGFsb2dTZXQucHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oREVGQVVMVF9DQVRBTE9HX0lELCBkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uKTsKLQkJCWNhdGFsb2dTZXQucHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oU1lTVEVNX0NBVEFMT0dfSUQsIGdldFBsdWdpblN0YXRlTG9jYXRpb24oQ2F0YWxvZy5TWVNURU1fQ0FUQUxPR19GSUxFKSk7Ci0JCQljYXRhbG9nU2V0LnB1dENhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9uKFVTRVJfQ0FUQUxPR19JRCwgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLlVTRVJfQ0FUQUxPR19GSUxFKSk7Ci0JCX0KLQkJcmV0dXJuIGNhdGFsb2dTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKERFRkFVTFRfQ0FUQUxPR19JRCwgZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTlkYTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JbnZhbGlkX2NoYXJhY3Rlcl9sdF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCc8JykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX2d0X2ZvX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciAoJz4nKSBmb3VuZAotSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciAoJyYnKSBmb3VuZAotSW52YWxpZF9jaGFyYWN0ZXJfX2ZfRVhDXz1JbnZhbGlkIGNoYXJhY3RlciAoJ1wiJykgZm91bmQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgY29udGVudG1vZGVsIHN0cmluZ3MKLWxvYWRpbmc9bG9hZGluZyAKLSMgY2F0YWxvZyBzdHJpbmdzCi1DYXRhbG9nX2VudHJ5X2tleV9ub3Rfc2V0PUNhdGFsb2cgZW50cnkga2V5IGlzIG5vdCBzZXQKLUNhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQ9Q2F0YWxvZyBlbnRyeSB1cmkgaXMgbm90IHNldAotQ2F0YWxvZ19uZXh0X2NhdGFsb2dfbG9jYXRpb25fdXJpX25vdF9zZXQ9TmV4dCBjYXRhbG9nIGxvY2F0aW9uIHVyaSBpcyBub3Qgc2V0Ci1DYXRhbG9nX3Jlc29sdXRpb25fbnVsbF9jYXRhbG9nPUNhdGFsb2cgcmVzb2x1dGlvbiBhdHRlbXB0ZWQgd2l0aCBudWxsIGNhdGFsb2c7IGlnbm9yZWQKLUNhdGFsb2dfcmVzb2x1dGlvbl9tYWxmb3JtZWRfdXJsPU1hbGZvcm1lZCBVUkwgZXhjZXB0aW9uIHRyeWluZyB0byByZXNvbHZlCi1DYXRhbG9nX3Jlc29sdXRpb25faW9fZXhjZXB0aW9uPUkvTyBleGNlcHRpb24gdHJ5aW5nIHRvIHJlc29sdmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZjQxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENsZWFudXBQcm9jZXNzb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBDbGVhbnVwUHJlZmVyZW5jZXMKLQkJY2xlYW51cEhhbmRsZXIuc2V0Q2xlYW51cFByZWZlcmVuY2VzKGdldENsZWFudXBQcmVmZXJlbmNlcygpKTsKLQotCQlyZXR1cm4gY2xlYW51cEhhbmRsZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmI3NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVTID0gIlwiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVEFHX0NMT1NFID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9UQUdfT1BFTiA9ICI8LyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URVMgPSAiJyciOyAvLyROT04tTkxTLTEkCi0KLQkvKiogTm9uLU5MUyBzdHJpbmdzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHX09QRU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCU5vZGUgbmV3Tm9kZSA9IGNsZWFudXBDaGlsZHJlbihub2RlKTsKLQkJSURPTU5vZGUgcmVuYW1lZE5vZGUgPSBuZXdOb2RlIGluc3RhbmNlb2YgSURPTU5vZGUgPyAoSURPTU5vZGUpIG5ld05vZGUgOiBudWxsOwotCi0JCS8vIGNhbGwgcXVvdGVBdHRyVmFsdWUoKSBmaXJzdCBzbyBpdCB3aWxsIGNsb3NlIGFueSB1bmNsb3NlZCBhdHRyCi0JCS8vIHF1b3RlQXR0clZhbHVlKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBzdGFydCB0YWcgaWYgdGhlcmUgaXMgYQotCQkvLyBzdHJ1Y3R1cmUgY2hhbmdlCi0JCXJlbmFtZWROb2RlID0gcXVvdGVBdHRyVmFsdWUocmVuYW1lZE5vZGUpOwotCi0JCS8vIGluc2VydCB0YWcgY2xvc2UgaWYgbWlzc2luZwotCQkvLyBpZiBub2RlIGlzIG5vdCBjb21tZW50IHRhZwotCQkvLyBhbmQgbm90IGltcGxpY2l0IHRhZwotCQlpZiAoIWlzQ29tbWVudFRhZyhyZW5hbWVkTm9kZSkgJiYgIWlzSW1wbGljaXRUYWcocmVuYW1lZE5vZGUpKSB7Ci0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gcmVuYW1lZE5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJLy8gc2F2ZSBzdGFydCBvZmZzZXQgYmVmb3JlIGluc2VydFRhZ0Nsb3NlKCkKLQkJCS8vIG9yIGVsc2UgcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSB3aWxsIGJlIHplcm8gaWYKLQkJCS8vIHJlbmFtZWROb2RlIHJlcGxhY2VkIGJ5IGluc2VydFRhZ0Nsb3NlKCkKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZm9yIHN0YXJ0IHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJLy8gdXBkYXRlIHJlbmFtZWROb2RlIGFuZCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZnRlcgotCQkJLy8gaW5zZXJ0VGFnQ2xvc2UoKQotCQkJcmVuYW1lZE5vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCQkJc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQkvLyBmb3IgZW5kIHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0KLQkJLy8gY2FsbCBpbnNlcnRNaXNzaW5nVGFncygpIG5leHQsIGl0IHdpbGwgZ2VuZXJhdGUgaW1wbGljaXQgdGFncyBpZgotCQkvLyB0aGVyZSBhcmUgYW55Ci0JCS8vIGluc2VydE1pc3NpbmdUYWdzKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBtaXNzaW5nIHN0YXJ0IHRhZyBpZiBvbmUgaXMKLQkJLy8gbWlzc2luZwotCQlyZW5hbWVkTm9kZSA9IGluc2VydE1pc3NpbmdUYWdzKHJlbmFtZWROb2RlKTsKLQotCQlyZW5hbWVkTm9kZSA9IGNvbXByZXNzRW1wdHlFbGVtZW50VGFnKHJlbmFtZWROb2RlKTsKLQotCQlyZW5hbWVkTm9kZSA9IGluc2VydFJlcXVpcmVkQXR0cnMocmVuYW1lZE5vZGUpOwotCi0JCXJldHVybiByZW5hbWVkTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBjbGVhbnVwQ2hpbGRyZW4oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGdldCBjbGVhbnVwIGhhbmRsZXIKLQkJCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoY2hpbGROb2RlKTsKLQotCQkJCS8vIGNsZWFudXAgZWFjaCBjaGlsZAotCQkJCWNoaWxkTm9kZSA9IGNsZWFudXBIYW5kbGVyLmNsZWFudXAoY2hpbGROb2RlKTsKLQotCQkJCS8vIGdldCBuZXcgcGFyZW50IG5vZGUKLQkJCQlwYXJlbnROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCS8vIGdldCBuZXh0IGNoaWxkIG5vZGUKLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYXJlbnROb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgY29tcHJlc3NFbXB0eUVsZW1lbnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCWlmIChjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgJiYgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkvLyBmb3JtYXQgY2hpbGRyZW4gYW5kIGVuZCB0YWcgaWYgbm90IGVtcHR5IGVsZW1lbnQgdGFnCi0JCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5ld05vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWlmIChjaGlsZE5vZGVzID09IG51bGwgfHwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAwIHx8IChjaGlsZE5vZGVzLmdldExlbmd0aCgpID09IDEgJiYgKGNoaWxkTm9kZXMuaXRlbSgwKSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAoKGNoaWxkTm9kZXMuaXRlbSgwKSkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSkgewotCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbmV3Tm9kZS5nZXRNb2RlbCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5ld05vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IG9mZnNldCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0KLQkJCQkJb2Zmc2V0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIGxhc3RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCAwLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKSB7Ci0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIG9yZy53M2MuZG9tLk5vZGUuVEVYVF9OT0RFIDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgQ2xlYW51cFByZWZlcmVuY2VzCi0JCWNsZWFudXBIYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSk7Ci0KLQkJcmV0dXJuIGNsZWFudXBIYW5kbGVyOwotCX0KLQotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXJldHVybiBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KChEb2N1bWVudCkgbm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZEF0dHJzKE5vZGUgbm9kZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBnZXRNb2RlbFF1ZXJ5KG5vZGUpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGF0dHIuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGF0dHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydEVuZFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0KLQkJaWYgKGlzRW1wdHlFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCksIEVNUFRZX1RBR19DTE9TRSk7Ci0KLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25CZWZvcmVUYWdDbG9zZSA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSAtIDEpOwotCi0JCQkJLy8gaW5zZXJ0IGEgc3BhY2Ugc2VwYXJhdG9yIGJlZm9yZSB0YWcgY2xvc2UgaWYgdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIGRvZXMgbm90IGhhdmUgZXh0cmEgc3BhY2VzCi0JCQkJaWYgKHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlLmdldFRleHRMZW5ndGgoKSA9PSByZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRMZW5ndGgoKSkKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3RyaW5nIGVuZFRhZyA9IEVORF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0KLQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWludCBlbmRUYWdTdGFydE9mZnNldCA9IDA7Ci0JCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQkJLy8gaWYgdGhpcyBub2RlIGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnIGFmdGVyIHRoZQotCQkJCS8vIGxhc3QgY2hpbGQKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IGxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKTsKLQkJCWVsc2UKLQkJCQkvLyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcKLQkJCQkvLyBhZnRlciB0aGUgc3RhcnQgdGFnCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZFRhZ1N0YXJ0T2Zmc2V0LCAwLCBlbmRUYWcpOwotCQl9Ci0KLQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJLy8gbmV3Ci0JCS8vIG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydE1pc3NpbmdUYWdzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRNaXNzaW5nVGFncykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJLy8gaW1wbGljaXQgc3RhcnQgdGFnOyBnZW5lcmF0ZSB0YWcgZm9yIGl0Ci0JCQkJbmV3Tm9kZSA9IGluc2VydFN0YXJ0VGFnKG5vZGUpOwotCQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zICE9IG51bGwgJiYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucy5nZXQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zLnNpemUoKSAtIDEpKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gc3RhcnQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzU3RhcnRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhuZXdOb2RlKTsKLQkJCQl9IGVsc2UgaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGVuZCB0YWcgbWlzc2luZwotCQkJCQlpZiAoaXNFbmRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRFbmRUYWcobmV3Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRSZXF1aXJlZEF0dHJzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhuZXdOb2RlKTsKLQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQlOYW1lZE5vZGVNYXAgY3VycmVudEF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApCi0JCQkJCWluc2VydEF0dHJzLmFkZEFsbChyZXF1aXJlZEF0dHJzKTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyTmFtZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVxdWlyZWRBdHRycy5nZXQoaSkpLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJU3RyaW5nIGN1cnJlbnRBdHRyTmFtZSA9IGN1cnJlbnRBdHRycy5pdGVtKGopLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaW50IGluZGV4ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4LS07Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfSBlbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0KLQkJCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoaW50IGkgPSBpbnNlcnRBdHRycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5zZXJ0QXR0cnMuZ2V0KGkpOwotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyRGVjbC5nZXREZWZhdWx0VmFsdWUoKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCi0JCQkJCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG5hbWVBbmREZWZhdWx0VmFsdWUgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoaSA9PSAwICYmIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCkgPiBsYXN0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoaW5kZXgsIG5hbWVBbmREZWZhdWx0VmFsdWUpKTsKLQkJCQkJCQkvLyBCVUczMzgxOiBNdWx0aVRleHRFZGl0IGFwcGxpZXMgYWxsIGNoaWxkCi0JCQkJCQkJLy8gVGV4dEVkaXQncyBiYXNpbmcgb24gb2Zmc2V0cwotCQkJCQkJCS8vICAgICAgICAgIGluIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIGZpcnN0IFRleHRFZGl0LCBub3QKLQkJCQkJCQkvLyBhZnRlciBlYWNoCi0JCQkJCQkJLy8gICAgICAgICAgY2hpbGQgVGV4dEVkaXQuIFRoZXJlZm9yZSwgZG8gbm90IG5lZWQgdG8KLQkJCQkJCQkvLyBhZHZhbmNlIHRoZSBpbmRleC4KLQkJCQkJCQkvL2luZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KG5ld05vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRTdGFydFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgc3RhcnRUYWcgPSBTVEFSVF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ1N0YXJ0T2Zmc2V0LCAwLCBzdGFydFRhZyk7Ci0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydFRhZ0Nsb3NlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBmbGF0bm9kZVJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAoZmxhdG5vZGVSZWdpb25zICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gZmxhdG5vZGVSZWdpb25zLmdldChmbGF0bm9kZVJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGxhc3RSZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAoKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSAmJiAocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQkJLy8gaW5zZXJ0ICI+IiBhZnRlciBsYXN0UmVnaW9uIG9mIGZsYXROb2RlCi0JCQkJCQkvLyBhcyBpbiAiPGE8L2E+IiBpZiBmbGF0Tm9kZSBpcyBmb3Igc3RhcnQgdGFnLCBvciBpbgotCQkJCQkJLy8gIjxhPjwvYSIgaWYgZmxhdE5vZGUgaXMgZm9yIGVuZCB0YWcKLQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW5hbWVkTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnKE5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHJlbmFtZWROb2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHJlbmFtZWROb2RlOwotCQkJcmVzdWx0ID0gZWxlbWVudC5pc0NvbW1lbnRUYWcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWdSZXF1aXJlZChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQSB0YWcgaXMgaW1wbGljaXQgaWYgaXQgaGFzIG5vdCBjb3JyZXNwb25kaW5nIHJlZ2lvbiBpbiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVuYW1lZE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW1wbGljaXRUYWcoSURPTU5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJcmV0dXJuIHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIHRhZ3Mgb2YgSFRNTCBFTVBUWSBjb250ZW50IHR5cGUsIHN1Y2ggYXMgSU1HLCBhbmQgSFRNTAotCSAqIHVuZGVmaW5lZCB0YWdzIGFyZSBwYXJzZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdGFydCB0YWdzLiBTbyBpbnNlcnRpbmcKLQkgKiB0aGUgbWlzc2luZyBzdGFydCB0YWcgaXMgdXNlbGVzcyBhbmQgZXZlbiBoYXJtZnVsLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1N0YXJ0VGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hNTFR5cGUoSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGRvY3VtZW50LmlzWE1MVHlwZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIHF1b3RlQXR0clZhbHVlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0JCS8vWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0KLQkJaWYgKHF1b3RlQXR0clZhbHVlcykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJCQlhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCWF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCQlJRE9NQXR0ciBlYWNoQXR0ciA9IChJRE9NQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkvL0lUZXh0UmVnaW9uIG9sZEF0dHJWYWx1ZVJlZ2lvbiA9Ci0JCQkJCS8vIGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJCVN0cmluZyBvbGRBdHRyVmFsdWUgPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKG9sZEF0dHJWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKGlzWE1MVHlwZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9ICJcIiIgKyBlYWNoQXR0ci5nZXROYW1lUmVnaW9uVGV4dCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQlpZiAoZWFjaEF0dHIuZ2V0RXF1YWxSZWdpb24oKSAhPSBudWxsKQotCQkJCQkJCQkvLyBlcXVhbCByZWdpb24gZXhpc3RzCi0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldEVuZE9mZnNldCgpLCAwLCBuZXdBdHRyVmFsdWUpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJLy8gbm8gZXF1YWwgcmVnaW9uCi0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldE5hbWVSZWdpb25UZXh0RW5kT2Zmc2V0KCksIDAsICI9Ii5jb25jYXQobmV3QXR0clZhbHVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOyAvLyBzYXZlCi0JCQkJCQkJLy8gbmV3Ci0JCQkJCQkJLy8gbm9kZQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy9TdHJpbmcgb2xkQXR0clZhbHVlID0gb2xkQXR0clZhbHVlUmVnaW9uLmdldFRleHQoKTsKLQkJCQkJCWNoYXIgcXVvdGUgPSBTdHJpbmdVdGlscy5pc1F1b3RlZChvbGRBdHRyVmFsdWUpID8gb2xkQXR0clZhbHVlLmNoYXJBdCgwKSA6IERPVUJMRV9RVU9URTsKLQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoZWFjaEF0dHIsIHF1b3RlKTsKLQotCQkJCQkJLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluCi0JCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBub3cuLi4KLQkJCQkJCWlmIChvbGRBdHRyVmFsdWUubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkQXR0clZhbHVlLmNoYXJBdCgwKTsKLQkJCQkJCQlpZiAoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gU0lOR0xFX1FVT1RFUzsKLQkJCQkJCQllbHNlIGlmIChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKQotCQkJCQkJCQluZXdBdHRyVmFsdWUgPSBET1VCTEVfUVVPVEVTOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV3QXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAobmV3QXR0clZhbHVlLmNvbXBhcmVUbyhvbGRBdHRyVmFsdWUpICE9IDApIHsKLQkJCQkJCQkJaW50IGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCQlpbnQgYXR0clZhbHVlTGVuZ3RoID0gb2xkQXR0clZhbHVlLmxlbmd0aCgpOwotCQkJCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgYXR0clZhbHVlU3RhcnRPZmZzZXQsIGF0dHJWYWx1ZUxlbmd0aCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJCQkJCQkJLy8gbmV3Ci0JCQkJCQkJCS8vIG5vZGUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTdmZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cFByZWZlcmVuY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDk1YTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTFByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCByZW5hbWVkIHRvIFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMKLSAqIAotICogVE9ETyB3aWxsIGRlbGV0ZSBpbiBDNQotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsIGZJbnN0YW5jZTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJLy8gYWRkZWQgZm9yIG9uZSBtZXRob2QgaW4gQ2xlYW51cERpYWxvZyAuLi4gbWF5IGJlIGJldHRlciB3YXkKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZkF0dHJOYW1lQ2FzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkNvbnZlcnRFT0xDb2RlczsKLQlwcml2YXRlIFN0cmluZyBmRU9MQ29kZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcm1hdFNvdXJjZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluc2VydE1pc3NpbmdUYWdzOwotCS8vIHByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0JcHJpdmF0ZSBpbnQgZlRhZ05hbWVDYXNlOwotCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZBdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29udmVydEVPTENvZGVzKCkgewotCi0JCXJldHVybiBmQ29udmVydEVPTENvZGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RU9MQ29kZSgpIHsKLQotCQlyZXR1cm4gZkVPTENvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlKCkgewotCi0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluc2VydE1pc3NpbmdUYWdzKCkgewotCi0JCXJldHVybiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JfQotCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCi0JCWlmIChmUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZlByZWZlcmVuY2VzID0gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFF1b3RlQXR0clZhbHVlcygpIHsKLQotCQlyZXR1cm4gZlF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCi0JCXJldHVybiBmVGFnTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ck5hbWVDYXNlKGludCBhdHRyTmFtZUNhc2UpIHsKLQotCQlmQXR0ck5hbWVDYXNlID0gYXR0ck5hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2RlcykgewotCi0JCWZDb252ZXJ0RU9MQ29kZXMgPSBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSkgewotCi0JCWZFT0xDb2RlID0gRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpIHsKLQotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBpbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCi0JCWZQcmVmZXJlbmNlcyA9IHByZWZzOwotCQl1cGRhdGVPcHRpb25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVvdGVBdHRyVmFsdWVzKGJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzKSB7Ci0KLQkJZlF1b3RlQXR0clZhbHVlcyA9IHF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpIHsKLQotCQlmVGFnTmFtZUNhc2UgPSB0YWdOYW1lQ2FzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcHRpb25zKCkgewotCi0JCVByZWZlcmVuY2VzIHAgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlmVGFnTmFtZUNhc2UgPSBwLmdldEludChJWE1MUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSk7Ci0JCWZBdHRyTmFtZUNhc2UgPSBwLmdldEludChJWE1MUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpOwotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBwLmdldEJvb2xlYW4oSVhNTFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKTsKLQkJZlF1b3RlQXR0clZhbHVlcyA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKTsKLQkJZkZvcm1hdFNvdXJjZSA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpOwotCQlmQ29udmVydEVPTENvZGVzID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpOwotCQlmRU9MQ29kZSA9IHAuZ2V0U3RyaW5nKElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzQzOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciB7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuZFRhZzsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlcjsKLQotCXB1YmxpYyBDb21tZW50RWxlbWVudEFkYXB0ZXIoYm9vbGVhbiBpc0VuZFRhZywgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJZkVuZFRhZyA9IGlzRW5kVGFnOwotCQlmSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVDb21tZW50Q2xvc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQuaXNKU1BUYWcoKSkgPyAiLS0lPiIgOiAiLS0+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVDb21tZW50T3BlbihJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudC5pc0pTUFRhZygpKSA/ICI8JS0tIiA6ICI8IS0tIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBmSGFuZGxlci5nZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZChnZW5lcmF0ZUNvbW1lbnRPcGVuKGVsZW1lbnQpKTsKLQkJYnVmZmVyLmFwcGVuZChjb250ZW50KTsKLQkJYnVmZmVyLmFwcGVuZChnZW5lcmF0ZUNvbW1lbnRDbG9zZShlbGVtZW50KSk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlcklEKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldEhhbmRsZXJJRCgpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgY29udGVudCA9IGZIYW5kbGVyLmdlbmVyYXRlU3RhcnRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDb21tZW50RWxlbWVudEFkYXB0ZXIuY2xhc3MgfHwgdHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuICghZkhhbmRsZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJcmV0dXJuIGZFbmRUYWc7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDdmM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwcmVmaXggb2YgdGhlIGNvbW1lbnQgY29udGVudCBtYXRjaGVzCi0JICogdGhlIHN0cmluZyBzcGVjaWZpZWQgaW4gJmx0O3N0YXJ0c3dpdGggcHJlZml4PSIiLyZndDsgaW4gcGx1Z2luCi0JICogZXh0ZW5zaW9uLiBDb21tZW50IGNvbnRlbnQgaXMgcGFyc2VkIGFuZCBuZXcgRE9NIGVsZW1lbnQgaXMgY3JlYXRlZCBpbgotCSAqIHRoaXMgbWV0aG9kLiBJbXBsZW1lbnRvciBoYXMgdG8gZG8gZm9sbG93aW5nOgotCSAqIDxsaT5Gb3Igc3RhcnQgdGFnIDoKLQkgKiA8dWw+Ci0JICogPGxpPnBhcnNlIGNvbW1lbnQgY29udGVudCBhbmQgY3JlYXRlIG5ldyBlbGVtZW50IGluc3RhbmNlLjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L2xpPgotCSAqIDxsaT5Gb3IgZW5kIHRhZyA6Ci0JICogPHVsPgotCSAqIDxsaT5wYXJzZSBjb21tZW50IGNvbnRlbnQgYW5kIGNyZWF0ZSBuZXcgZWxlbWVudCBpbnN0YW5jZS48L2xpPgotCSAqIDxsaT5tYWtlIGlzRW5kVGFnIGZsYWcgdHJ1ZS48L2xpPgotCSAqIDxsaT5QYXJzZXIgZnJhbWV3b3JrIHNlYXJjaGVzIG1hY2hlZCBzdGFydCB0YWcgZWxlbWVudCBpbnN0YW5jZSBhZnRlcgotCSAqIHRoaXMgY3JlYXRlRWxlbWVudCBjYWxsLCBhbmQgbmV3IGluc3RhbmNlIGlzIGp1c3QgdGhyb3duIGF3YXkuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogPGxpPkZvciBlbXB0eSB0YWcgOgotCSAqIDx1bD4KLQkgKiA8bGk+cGFyc2UgY29tbWVudCBjb250ZW50IGFuZCBjcmVhdGUgbmV3IGVsZW1lbnQgaW5zdGFuY2UuPC9saT4KLQkgKiA8bGk+bWFrZSBpc0VuZFRhZyBmbGFnIHRydWUuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBwYXJlbnQgRE9NIGRvY3VtZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGNvbW1lbnQgY29udGVudC4gY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSksIHN1ZmZpeAotCSAqICAgICAgICAgICAgKC0tJmd0OyBvciAtLSUmZ3Q7KSwgYW5kIHN1cnJvdW5kaW5nIHNwYWNlcyBhcmUgdHJpbW1lZC4KLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1lbnQgaXMgSlNQIHN0eWxlIGNvbW1lbnQuIFRoaXMgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIG1heSBiZSByZXF1aXJlZCBieSBoYW5kbGVyIHdoZW4gdGhlIGhhbmRsZXIgYWNjZXB0cyBib3RoIFhNTAotCSAqICAgICAgICAgICAgc3R5bGUgYW5kIEpTUCBzdHlsZSBjb21tZW50IChuYW1lbHksCi0JICogICAgICAgICAgICBjb21tZW50dHlwZT0mcXVvdDtib3RoJnF1b3Q7IGluIHBsdWdpbi54bWwpLgotCSAqIEByZXR1cm4gY29tbWVudCBlbGVtZW50IGluc3RhbmNlIGlmIHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcmlnaHRseQotCSAqICAgICAgICAgcGFyc2VkLiBpZiBwYXJzZSBmYWlsZWQsIHJldHVybnMgbnVsbC4KLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgc291cmNlIHRleHQgb2YgdGhlIGVuZCB0YWcgZm9yIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBEbyBub3QgZ2VuZXJhdGUgY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSkgYW5kIHN1ZmZpeAotCSAqICgtLSZndDsgb3IgLS0lJmd0OykuIFhNTEdlbmVyYXRvciB1c2VzIHRoaXMgbWV0aG9kIHRvIGdlbmVyYXRlIFhNTC9IVE1MCi0JICogc291cmNlIGZvciBhIGNvbW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgZWxlbWVudAotCSAqIEByZXR1cm4gZ2VuZXJhdGVkIHRhZyBzdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgc3RhcnQgdGFnIGZvciB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gRG8gbm90IGdlbmVyYXRlIGNvbW1lbnQgcHJlZml4ICgmbHQ7IS0tIG9yICZsdDslLS0pIGFuZCBzdWZmaXgKLQkgKiAoLS0mZ3Q7IG9yIC0tJSZndDspLiBYTUxHZW5lcmF0b3IgdXNlcyB0aGlzIG1ldGhvZCB0byBnZW5lcmF0ZSBYTUwvSFRNTAotCSAqIHNvdXJjZSBmb3IgYSBjb21tZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGdlbmVyYXRlZCB0YWcgc3RyaW5nCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY29tbWVudCBlbGVtZW50IG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiB3aGV0aGVyIHRoaXMgZWxlbWVudCBjYW4gaGF2ZSBjaGlsZHJlbiBvciBub3QKLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JLy8JU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9CYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjgzOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLkNvbW1lbnRFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbC5UYWdTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotCi0vKioKLSAqLwotY2xhc3MgQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIgaW1wbGVtZW50cyBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHk7Ci0KLQlwdWJsaWMgQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIGlzRW1wdHkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotCQl0aGlzLmlzRW1wdHkgPSBpc0VtcHR5OwotCX0KLQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJU3RyaW5nIHN0ciA9IGRhdGEudHJpbSgpOwotCQlDb21tZW50RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDb21tZW50RWxlbWVudEZhY3RvcnkoZG9jdW1lbnQsIGlzSlNQVGFnLCB0aGlzKTsKLQkJaWYgKHN0ci5jaGFyQXQoMCkgPT0gJy8nKSB7IC8vIGVuZCB0YWcKLQkJCVRhZ1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBUYWdTY2FubmVyKHN0ciwgMSk7IC8vIHNraXAgJy8nCi0JCQlTdHJpbmcgbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQllbGVtZW50ID0gZmFjdG9yeS5jcmVhdGUobmFtZSwgQ29tbWVudEVsZW1lbnRGYWN0b3J5LklTX0VORCk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIHN0YXJ0IHRhZwotCQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoc3RyLCAwKTsKLQkJCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZShuYW1lLCAoaXNFbXB0eSkgPyBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfRU1QVFkgOiBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfU1RBUlQpOwotCQkJCS8vIHNldCBhdHRyaWJ1dGVzCi0JCQkJU3RyaW5nIGF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJCXdoaWxlIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRyVmFsdWUgPSBzY2FubmVyLm5leHRWYWx1ZSgpOwotCQkJCQlBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5hbWUpOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoYXR0clZhbHVlICE9IG51bGwpCi0JCQkJCQkJKChJRE9NQXR0cikgYXR0cikuc2V0VmFsdWVTb3VyY2UoYXR0clZhbHVlKTsKLQkJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQkJfQotCQkJCQlhdHRyTmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpc0VtcHR5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCIgLyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0ck5hbWUpOwotCQkJfQotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gaXNFbXB0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNTZlZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgTWFwIGZBdHRyaWJ1dGVzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkN1c3RvbTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVtcHR5OwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGZIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmSUQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmSlNQQ29tbWVudDsKLQlwcml2YXRlIFN0cmluZ1tdIGZQcmVmaXggPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmWE1MQ29tbWVudDsKLQotCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkVsZW1lbnQgPSBlbGVtZW50OwotCQlmQ3VzdG9tID0gKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImhhbmRsZXItY3VzdG9tIikpID8gdHJ1ZSA6IGZhbHNlOyAvLyROT04tTkxTLTEkCi0KLQkJZmlsbEF0dHJpYnV0ZXMoZWxlbWVudCk7Ci0KLQkJZlhNTENvbW1lbnQgPSBmSlNQQ29tbWVudCA9IGZhbHNlOwotCQlTdHJpbmcgY29tbWVudFR5cGUgPSBnZXRQcm9wZXJ0eSgiY29tbWVudHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29tbWVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZSgieG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZlhNTENvbW1lbnQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGNvbW1lbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImpzcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZKU1BDb21tZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb21tZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJib3RoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZlhNTENvbW1lbnQgPSBmSlNQQ29tbWVudCA9IHRydWU7Ci0JCX0KLQkJU3RyaW5nIGVtcHR5ID0gZ2V0UHJvcGVydHkoImlzZW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCQlmRW1wdHkgPSAoZW1wdHkgIT0gbnVsbCAmJiAhZW1wdHkuZXF1YWxzKCJmYWxzZSIpKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdEpTUENvbW1lbnQoKSB7Ci0JCXJldHVybiBmSlNQQ29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRYTUxDb21tZW50KCkgewotCQlyZXR1cm4gZlhNTENvbW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgZ2V0SGFuZGxlcigpLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIGRhdGEsIGlzSlNQVGFnKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBlbGVtZW50LmdldEFkYXB0ZXJGb3IoQ29tbWVudEVsZW1lbnRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldENvbmZpZ3VyYXRpb24odGhpcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxBdHRyaWJ1dGVzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmQXR0cmlidXRlcy5jbGVhcigpOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpOwotCQlpZiAobmFtZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBsZW5ndGggPSBuYW1lcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlmQXR0cmlidXRlcy5wdXQobmFtZS50b0xvd2VyQ2FzZSgpLCBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0JCWlmIChmSGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpc0N1c3RvbSgpKSB7Ci0JCQkJCQlmSGFuZGxlciA9IChDb21tZW50RWxlbWVudEhhbmRsZXIpIGZFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmSGFuZGxlciA9IG5ldyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlcihlbGVtZW50TmFtZSwgZkVtcHR5KTsKLQkJCQkJfQotCQkJCQkvLwkJCQkJKChBYnN0cmFjdENvbW1lbnRFbGVtZW50SGFuZGxlcilmSGFuZGxlcikuc2V0RWxlbWVudFByZWZpeChmRWxlbWVudC5nZXRBdHRyaWJ1dGUoInByZWZpeCIpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBjYXRjaCBhbmQgbG9nIChhbmQgaWdub3JlKSBBTlkgZXhjZXB0aW9uIGNyZWF0ZWQKLQkJCQkJLy8gYnkgZXhlY3V0YWJsZSBleHRlbnNpb24uCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCWZIYW5kbGVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZkhhbmRsZXIgPT0gbnVsbCkgewotCQkJCWZIYW5kbGVyID0gbmV3IENvbW1lbnRFbGVtZW50SGFuZGxlcigpIHsKLQkJCQkJcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLS8vIHJlbW92ZWQgaW4gUkMyLCBybyByZW1vdmVkICJ1bnVzZWQiIGVycm9yL3dhcm5pbmcKLS8vCQkJCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0JCXJldHVybiBmSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJJRCgpIHsKLQkJaWYgKGZJRCA9PSBudWxsKSB7Ci0JCQlmSUQgPSBnZXRQcm9wZXJ0eSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZJRCA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzQ3VzdG9tKCkpIHsKLQkJCQkJZklEID0gZ2V0UHJvcGVydHkoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJYnVmLmFwcGVuZChmRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQkJCWJ1Zi5hcHBlbmQoJy4nKTsKLQkJCQkJYnVmLmFwcGVuZChnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZklEID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmSUQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZml4KCkgewotCQlpZiAoZlByZWZpeCA9PSBudWxsKSB7Ci0JCQlpZiAoZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChpc0N1c3RvbSgpKSB7IC8vIGN1c3RvbQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwcmVmaXhlcyA9IGZFbGVtZW50LmdldENoaWxkcmVuKCJzdGFydHdpdGgiKTsgLy8kTk9OLU5MUy0xJAkKLQkJCQkJaWYgKHByZWZpeGVzICE9IG51bGwpIHsKLQkJCQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nW3ByZWZpeGVzLmxlbmd0aF07Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJZlByZWZpeFtpXSA9IHByZWZpeGVzW2ldLmdldEF0dHJpYnV0ZSgicHJlZml4Iik7IC8vJE5PTi1OTFMtMSQJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyBiYXNpYwotCQkJCQlTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChpc0VtcHR5KCkpIHsKLQkJCQkJCQlmUHJlZml4ID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJCQlmUHJlZml4WzBdID0gbmFtZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQkJZlByZWZpeFswXSA9IG5hbWU7Ci0JCQkJCQkJZlByZWZpeFsxXSA9ICcvJyArIG5hbWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZQcmVmaXggPT0gbnVsbCkgewotCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMV07Ci0JCQlmUHJlZml4WzBdID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZlByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZXMgIT0gbnVsbCkgPyAoU3RyaW5nKSBmQXR0cmlidXRlcy5nZXQobmFtZSkgOiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0N1c3RvbSgpIHsKLQkJcmV0dXJuIGZDdXN0b207Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBmRW1wdHk7Ci0JfQotCi0Jdm9pZCBzZXR1cENvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJZWxlbWVudC5zZXRDb21tZW50VGFnKHRydWUpOwotCQlDb21tZW50RWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb21tZW50RWxlbWVudEFkYXB0ZXIoZmFsc2UsIGZIYW5kbGVyKTsKLQkJYWRhcHRlci5zZXRDb25maWd1cmF0aW9uKHRoaXMpOwotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzUwYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29tbWVudEVsZW1lbnRIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gZkNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWVudEVsZW1lbnRSZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIENvbW1lbnRFbGVtZW50UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAoZkNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltlbGVtZW50cy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZkNvbmZpZ3VyYXRpb25zW2ldID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbihlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvblswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25zOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldHVwQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbnNbXSA9IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWludCBsZW5ndGggPSBjb25maWd1cmF0aW9ucy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25mID0gY29uZmlndXJhdGlvbnNbaV07Ci0JCQlib29sZWFuIGlzSlNQID0gZWxlbWVudC5pc0pTUFRhZygpOwotCQkJaWYgKGlzSlNQICYmIGNvbmYuYWNjZXB0SlNQQ29tbWVudCgpIHx8ICFpc0pTUCAmJiBjb25mLmFjY2VwdFhNTENvbW1lbnQoKSkgewotCQkJCUNvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyID0gY29uZi5nZXRIYW5kbGVyKCk7Ci0JCQkJaWYgKGhhbmRsZXIuaXNDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJCQljb25mLnNldHVwQ29tbWVudEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzUxYzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9Db21tZW50RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU19FTVBUWSA9IDQ4NjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfRU5EID0gMTgwODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX1NUQVJUID0gMjgwMTE7Ci0KLQlwcml2YXRlIERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlcjsKLQlwcml2YXRlIGJvb2xlYW4gZkpTUFRhZzsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21tZW50RWxlbWVudEZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50RmFjdG9yeShEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBpc0pTUFRhZywgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZKU1BUYWcgPSBpc0pTUFRhZzsKLQkJZkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZShTdHJpbmcgbmFtZSwgaW50IG5vZGVUeXBlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGZEb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJaWYgKG5vZGVUeXBlID09IElTX0VNUFRZKSB7Ci0JCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQl9Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKGZKU1BUYWcpOwotCi0JCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IENvbW1lbnRFbGVtZW50QWRhcHRlcigobm9kZVR5cGUgPT0gSVNfRU5EKSwgZkhhbmRsZXIpOwotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDljYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdTY2FubmVyIHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgaW50IG1lbU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gb25lTGluZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhZyA9IHRhZzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubWVtT2Zmc2V0ID0gLTE7Ci0JCWlmICh0YWcgIT0gbnVsbCkKLQkJCXRoaXMubGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQsIGJvb2xlYW4gb25lTGluZSkgewotCQl0aGlzKHRhZywgb2Zmc2V0KTsKLQotCQl0aGlzLm9uZUxpbmUgPSBvbmVMaW5lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJaW50IGk7Ci0JCWNoYXIgYzsKLQkJZm9yIChpID0gb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzUXVvdGUoYykpIHsKLQkJCQlpKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWlzU3BhY2UoYykgJiYgIWlzRXF1YWwoYykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm1lbU9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmQoY2hhciBjKSB7Ci0JCXJldHVybiAodGhpcy5vbmVMaW5lICYmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lKCkgewotCQlpZiAob25lTGluZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjOwotCQlmb3IgKGludCBpID0gbWVtT2Zmc2V0IC0gMTsgMCA8PSBpOyBpLS0pIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuZXh0Q2hhcigpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbmFtZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSB8fCBpc1NwYWNlKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzRXF1YWwoYykgJiYgdGhpcy5vZmZzZXQgPiBuYW1lT2Zmc2V0KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0aGlzLm9mZnNldCA9PSBuYW1lT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdGhpcy5tZW1PZmZzZXQgPSBuYW1lT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5leHRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY2hhciBzZXBlcmF0b3IgPSBuZXh0Q2hhcigpOwotCQlpZiAoIWlzRXF1YWwoc2VwZXJhdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQl0aGlzLm9mZnNldCsrOyAvLyBza2lwICc9JwotCQljaGFyIHF1b3RlID0gbmV4dENoYXIoKTsKLQkJaWYgKHF1b3RlID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGlzUXVvdGUocXVvdGUpKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJZWxzZQotCQkJcXVvdGUgPSAwOwotCi0JCWludCB2YWx1ZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkgewotCQkJCXF1b3RlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChxdW90ZSA9PSAwKSB7Ci0JCQkJaWYgKGlzU3BhY2UoYykpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0aGlzLm1lbU9mZnNldCA9IHZhbHVlT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzAwNzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy9jcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXZlcnkgc3ViY2xhc3MgbXVzdCBwcm92aWRlIGEgd2F5IHRvIHBhcnNlIHRoZSBpbnB1dC4gVGhpcyBtZXRob2QgaGFzCi0JICogc2V2ZXJhbCBjcml0aWNhbCByZXNwb25zaWJpbGl0aWVzOgotCSAqIDxsaT5zZXQgdGhlIGZFbmNvZGluZ01lbWVudG8gZmllbGQgYXBwcm9wcmlhdGVseSwgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHJlc3VsdHMgb2YgdGhlIHBhcnNlIG9mIGZSZWFkZXIuPC9saT4KLQkgKiA8bGk+c2V0IGZIYXJkZXJQYXJzZWQgdG8gdHJ1ZSwgdG8gYXZvaWQgd2FzdGVkIHJlLXBhcnNpbmcuPC9saT4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWU0NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQlmSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IGZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSBmQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IGZJbnB1dFN0cmVhbS5yZWFkKGZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSBmQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5NjE3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yWE1MIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JLyoqCi0JICogPGNvZGU+cmVzdHJpY3RlZE1vZGU8L2NvZGU+IGlzIHVzZWQganVzdCBmb3IgdGVzdGluZy9leHBlcmltZW50cy4KLQkgKiAKLQkgKiBJZiBpbiByZXN0cmljdGVkTW9kZSwgb3VyICJjdXN0b20iIGNvbnRlbnRUeXBlIGlzIHNlZW4gYXMgdmFsaWQgb25seSBpbgotCSAqIGNhc2VzIHRoYXQgdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmQgb25lIGRvZXMgbm90IGNvdmVyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZXN0cmljdGVkTW9kZSA9IHRydWU7Ci0JcHJpdmF0ZSBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgZlJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQlpZiAoZlJlc291cmNlRW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yID0gbmV3IFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBjYXNlLCBhbHdheXMgYXNzdW1lIGludmFsaWQsIHVubGVzcwotCQkvLyBvdXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIGFyZSBtZXQuCi0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBwdXJlbHkgcmVxdWVzdCBmb3IgdmFsaWR0eQotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkocmVzdWx0LCBjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKHJlc3VsdCwgY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBjYXNlLCBhbHdheXMgYXNzdW1lIGludmFsaWQsIHVubGVzcwotCQkvLyBvdXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIGFyZSBtZXQuCi0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBwdXJlbHkgcmVxdWVzdCBmb3IgdmFsaWR0eQotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkocmVzdWx0LCBjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKHJlc3VsdCwgY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZ2V0U3VwcG9ydGVkT3B0aW9ucygpCi0JICovCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGludCByZXN1bHQsIElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmV0dXJuUmVzdWx0ID0gcmVzdWx0OwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQljb250ZW50cy5yZXNldCgpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCXJldHVyblJlc3VsdCA9IGhhbmRsZUNhbGN1bGF0aW9ucyhyZXN1bHQsIGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShpbnQgcmVzdWx0LCBJbnB1dFN0cmVhbSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJY29udGVudHMucmVzZXQoKTsKLQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJcmV0dXJuUmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoZGV0ZWN0b3IsIHJldHVyblJlc3VsdCk7Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KGludCByZXN1bHQsIFJlYWRlciBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJY29udGVudHMucmVzZXQoKTsKLQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJcmV0dXJuUmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoZGV0ZWN0b3IsIHJldHVyblJlc3VsdCk7Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGludCByZXN1bHQsIFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCXJldHVyblJlc3VsdCA9IGhhbmRsZUNhbGN1bGF0aW9ucyhyZXN1bHQsIGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLyB9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFuZGxlQ2FsY3VsYXRpb25zKGludCByZXN1bHQsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCQkvLyBieSB0ZXh0IHR5cGUuCi0JCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsCi0JCQkJLy8gbWF5Ci0JCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJCX0KLQotCi0JCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKLQkJCQkvLyBpZiBpbnZhbGlkIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucwotCQkJCS8vIGFuICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCQl9Ci0KLQkJCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdAotCQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMKLQkJCQkJCS8vIG5lZWQgdG8gYWRkLgotCQkJCQkJLy8gVE9ETzogdGhpcyBpcyBwcm9iYWJseSBhIGRlYWQgYnJhbmNoIGluIGN1cnJlbnQKLQkJCQkJCS8vIGNvZGUsIHNob3VsZCByZS1leGFtaW5lIGZvciByZW1vdmFsLgotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm5SZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShkZXRlY3RvciwgcmV0dXJuUmVzdWx0KTsKLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IsIGludCByZXR1cm5SZXN1bHQpIHsKLQkJLy8gd2UgYWx3YXlzIGV4cGVjdCBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IsIGJ1dCBqdXN0IHRvIG1ha2Ugc2FmZQotCQkvLyBjYXN0LgotCQlpZiAoZGV0ZWN0b3IgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIHsKLQkJCVhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciB4bWxSZXNvdXJjZURldGVjdG9yID0gKFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3I7Ci0JCQlpZiAoeG1sUmVzb3VyY2VEZXRlY3Rvci5pc0RlY2xEZXRlY3RlZCgpKSB7Ci0JCQkJaWYgKHJlc3RyaWN0ZWRNb2RlKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGlzIG5vIGluaXRpYWwgd2hpdGVzcGFjZSwgdGhlbiBwbGF0Zm9ybSdzCi0JCQkJCS8vIGRlZmF1bHQgb25lIHdpbGwgZG8uCi0JCQkJCWlmICh4bWxSZXNvdXJjZURldGVjdG9yLmhhc0luaXRpYWxXaGl0ZVNwYWNlKCkpIHsKLQkJCQkJCXJldHVyblJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm5SZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwMDJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nUGFyc2VyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBFT0YgPSAiRU9GIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBJbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlID0gIkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUgPSAiSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgTUFYX0NIQVJTX1JFQUNIRUQgPSAiTUFYX0NIQVJTX1JFQUNIRUQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFN0cmluZ1ZhbHVlID0gInN0cnZhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSA9ICJVbkRlbGltaXRlZFN0cmluZ1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVVRGMTZCRSA9ICJVVEYxNkJFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVVRGMTZMRSA9ICJVVEYxNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjgzQnl0ZUJPTSA9ICJVVEY4M0J5dGVCT00iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE0YjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGNsYXNzIEhlYWRQYXJzZXJUb2tlbiB7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgSGVhZFBhcnNlclRva2VuKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBIZWFkUGFyc2VyVG9rZW4oU3RyaW5nIHR5cGUsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dCA9IHRleHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKCJ0ZXh0OiAiICsgZlRleHQgKyAiIG9mZnNldDogIiArIGZTdGFydCArICIgdHlwZTogIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTA1MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQ3MDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTERlY2xEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFiMjg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhNTERlY2xEZXRlY3RvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZfU0laRSA9IDEwMjQgKiA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTUFSS19TSVpFID0gMTAyNCAqIDg7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQlwcml2YXRlIGJvb2xlYW4gZklzWE1MOwotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQkvL3ByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJLy9mVW5pY29kZSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCWZpbmFsIHByaXZhdGUgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL3ByaXZhdGUgU3RyaW5nIGZVbmljb2RlOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBYTUxIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1hNTC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1hNTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQl9Ci0JCXJldHVybiBmSXNYTUw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCQkvLyB0aGlzIGlzIChvYnZpb3VzbHkpIG5vdCBhbHdheXMgdHJ1ZS4KLQkJCQkvLyBUT0RPOiBuZWVkIHRvIGZpeCBzbyB3ZSAicmVtZW1iZXIiIG9yaWdpbmFsIGlGaWxlIG9yCi0JCQkJLy8gaW5wdXRzdHJlYW0sIGFuZAotCQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBJbnB1dFN0cmVhbVJlYWRlci4KLQkJCQkvLyBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBmb3IgdGhlIHNldChyZWFkZXIpIGNhc2UgLi4uIGlmIGl0cwotCQkJCS8vIGV2ZW4gcmVsZXZlbnQuCi0JCQkJLy8gcGx1cywgZW5zdXJlIGFnYWluc3QgaW5maW5pdGUgbG9vcHMhCi0JCQkJZklzWE1MID0gdHJ1ZTsKLQkJCQkvL2ZSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZlJlYWRlciwgZlVuaWNvZGUpOwotCQkJCS8vIHBhcnNlSW5wdXQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRva2VuVHlwZSA9PSBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nKSB7Ci0JCQkJCWZJc1hNTCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZklzWE1MID0gZmFsc2U7Ci0JCS8vZlVuaWNvZGUgPSBudWxsOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0KElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaUZpbGUuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKE1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlciBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhYjY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzMgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDcvNS8wNSAxOjE5IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40Ci0gKiBvbiA3LzUvMDUgMToxOSBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5EOi9idWlsZHMvV29ya3NwYWNlcy9QdXJlSGVhZFdUUF9NNy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gODE5MjsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFFfU1RSSU5HID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FfU1RSSU5HID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNDsKLQotICAvKioKLSAgICogWlpfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWlpfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCA2Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTFcMFwxXDZcMVwxMVwyXDBcMVwxMFwyMlwwXDFcNlwxXDBcMVwzMlwyXDAiKwotICAgICJcMVwzNFwxXDBcMVwzM1wyNFwwXDFcMTJcMVw3XDFcMzFcMVwxM1wzXDBcMVwyNiIrCi0gICAgIlwxXDI3XDFcMjBcMVwwXDFcMzBcMVwwXDFcMjNcMlwwXDFcMTZcMVwxNVwxXDI1IisKLSAgICAiXDFcMjRcMlwwXDFcMjFcMVwyMlwyXDBcMVwxN1wxXDBcMVwxNFwxMlwwXDFcMjYiKwotICAgICJcMVwyN1wxXDIwXDFcMFwxXDMwXDFcMFwxXDIzXDJcMFwxXDE2XDFcMTVcMVwyNSIrCi0gICAgIlwxXDI0XDJcMFwxXDIxXDFcMjJcMlwwXDFcMTdcMVwwXDFcMTRcMTAyXDBcMVw0IisKLSAgICAiXDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDEiKwotICAgICJcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcN1wwXDExXDFcMlwyXDFcMVwxXDNcMVw0XDFcNVwxXDYiKwotICAgICJcMVw1XDFcN1wxXDVcMVw3XDFcNVwxXDEwXDJcMTFcMVwxMiIrCi0gICAgIlwxXDEzXDRcMFwxXDE0XDNcMFwxXDE1XDFcMFwxXDE2XDFcMTciKwotICAgICJcMTFcMFwxXDIwXDRcMFwxXDIxXDFcMFwxXDIyIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNjJdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB6elB1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0vLyAgcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4genpFT0ZEb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ek1hcmtlZFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAgICAgICAgICAgICAgIHp6UHVzaGJhY2tQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpDdXJyZW50UG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6U3RhcnRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgICAgICAgICAgICAqIGZyb20gaW5wdXQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekVuZFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotLy8gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE0OCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLSAgICB5eWNoYXIgPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHVibGljIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLQotICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgenpEb0VPRigpIHsKLSAgICBpZiAoIXp6RU9GRG9uZSkgewotICAgICAgenpFT0ZEb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBpZiAoenpNYXJrZWRQb3NMID4genpTdGFydFJlYWQpIHsKLSAgICAgICAgc3dpdGNoICh6ekJ1ZmZlckxbenpNYXJrZWRQb3NMLTFdKSB7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgY2FzZSAnXHUwMDBDJzoKLSAgICAgICAgY2FzZSAnXHUwMDg1JzoKLSAgICAgICAgY2FzZSAnXHUyMDI4JzoKLSAgICAgICAgY2FzZSAnXHUyMDI5JzoKLSAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiAKLSAgICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpCi0gICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgICAgICAgICAgaWYgKGVvZikgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICBpZiAoenpBdEJPTCkKLSAgICAgICAgenpTdGF0ZSA9IFpaX0xFWFNUQVRFW3p6TGV4aWNhbFN0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGVdOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB6eklucHV0ID0genpDTWFwTFt6eklucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4genpJc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB6ek5vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB6ekZvck5leHQ6IHsgc3dpdGNoICh6elN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSAzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA0OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA1NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGV2ZXIgcmVhY2hlZCwgdGhlcmUgaXMgYSBzZXJpb3VzIGJ1ZyBpbiBKRmxleAotICAgICAgICAgICAgICB6elNjYW5FcnJvcihaWl9VTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHp6SXNGaW5hbCApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoIHp6Tm9Mb29rQWhlYWQgKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIwOiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI1OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM2OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHp6RG9FT0YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJkMjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBYTUxEZWNsRW5kID0gIlhNTERlY2xFbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlY2xTdGFydCA9ICJYTUxEZWNsU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlbEVuY29kaW5nID0gIlhNTERlbEVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBYTUxEZWNsVmVyc2lvbiA9ICJYTUxEZWNsVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ5NTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZEZWNsRGV0ZWN0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy8gaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8gfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQotCQkJLy8gaGFuZGxlIHhtbCBjb250ZW50IHR5cGUgZGV0ZWN0aW9uCi0JCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0KSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IHRydWU7Ci0JCQkJU3RyaW5nIGRlY2xUZXh0ID0gdG9rZW4uZ2V0VGV4dCgpOwotCQkJCWlmIChkZWNsVGV4dC5zdGFydHNXaXRoKCI8PyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaGFuZGxlIGVuY29kaW5nIGRldGVjdGlvbgotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodG9rZW5UeXBlKSkgewotCQkJCQkJCVN0cmluZyBlbmMgPSB0b2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlY2xEZXRlY3RlZCgpIHsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQl0cnkgewotCQkJCXBhcnNlSW5wdXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJLy8gZkRlY2xEZXRlY3RlZCBpcyBzZXQgYXMgcGFydCBvZiBwYXJzaW5nLgotCQlyZXR1cm4gZkRlY2xEZXRlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsV2hpdGVTcGFjZSgpIHsKLQkJcmV0dXJuIGZJbml0aWFsV2hpdGVTcGFjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFsbCgpIHsKLQkgICAgc3VwZXIucmVzZXRBbGwoKTsKLQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDg2ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BdHRySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIEF0dHJJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRySW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgSURPTUF0dHIgewotCXByaXZhdGUgSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotCXByaXZhdGUgRWxlbWVudEltcGwgb3duZXJFbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBBdHRySW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBdHRySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRySW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBBdHRySW1wbAotCSAqLwotCXByb3RlY3RlZCBBdHRySW1wbChBdHRySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJCXRoaXMudmFsdWVTb3VyY2UgPSB0aGF0LmdldFZhbHVlU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlBdHRySW1wbCBjbG9uZWQgPSBuZXcgQXR0ckltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZWxlbWVudC5nZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IG9mZnNldCA9IHRoaXMub3duZXJFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy52YWx1ZVJlZ2lvbi5nZXRFbmQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmVxdWFsUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5uYW1lUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFcXVhbFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSB0aGlzLm5hbWUuaW5kZXhPZignOicpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVnaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCh0aGlzLm5hbWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCW5zQXR0ck5hbWUgPSBJWE1MTmFtZXNwYWNlLlhNTE5TX1BSRUZJWCArIHByZWZpeDsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCS8vIGRvZXMgbm90IGluaGVyaXQgbmFtZXNwYWNlIGZyb20gb3duZXIgZWxlbWVudAotCQkJLy8gaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHJldHVybgotCQkJLy8gdGhpcy5vd25lckVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXMub3duZXJFbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLm5hbWVzcGFjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSSUJVVEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMubmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiBuYW1lCi0JCWlmICh0aGlzLm5hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3BlY2lmaWVkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpbnQgb2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMubmFtZVJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlpZiAodGhpcy5lcXVhbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMuZXF1YWxSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLnZhbHVlUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZShnZXRWYWx1ZVNvdXJjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZhbHVlIGZvciB0aGUgc291cmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoc291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gc291cmNlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKGVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgZW5kKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQkJCQlpZiAocmVmID4gb2Zmc2V0KQotCQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgcmVmKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQkJCQlvZmZzZXQgPSBlbmQgKyAxOwotCQkJCQlyZWYgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogd2hhdCBzaG91bGQgYmVoYXZpb3IgYmUgaWYgdGhpcy52YWx1ZSA9PSBudWxsPyBJdCdzIGFuICJlcnJvciIKLQkgKiB0byBiZSBpbiB0aGF0IHN0YXRlLCBidXQgc2VlbXMgdG8gb2NjdXIgcmVsYXRpdmVseSBlYXNpbHkgLi4uIHByb2JhYmx5Ci0JICogZHVlIHRvIHRocmVhZGluZyBidWdzIC4uLiBidXQgdGhpcyBqdXN0IHNob3dzIGl0cyBuZWVkcyB0byBiZSBzcGVjJ2QuCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIHRoZSB2YWx1ZVJlZ2lvbiAtLSBzaG91bGQgbWFrZSBzbWFydGVyPwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBlbnN1cmUgd2UgbmV2ZXIgcGFzcyBudWxsIHRvIGdldFN0YXJ0T2Zmc2V0LgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRoaXMudmFsdWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVSZWdpb25UZXh0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQodGhpcy52YWx1ZVJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLnZhbHVlU291cmNlOwotCQkvLyBEVzogNC8xNi8yMDAzIGR1ZSB0byBjaGFuZ2UgaW4gc3RydWN0dXJlZERvY3VtZW50IC4uLiB3ZSBuZWVkIGEKLQkJLy8gZmxhdG5vZGUgdG8KLQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlIGZpcnN0Ci0JCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJLy8gRFc6IDQvMzAvMjAwMyBGb3Igc29tZSByZWFzb24sIHRoaXMgbWV0aG9kIGlzIGdldHRpbmcgY2FsbGVkIGEgbG90Ci0JCS8vIE5vdCBzdXJlIGlmIGl0cyBhIHRocmVhZGluZyBwcm9ibGVtLCBvciBhIGZ1bmRhbWVudGFsIGVycm9yCi0JCS8vIGVsc2V3aGVyZS4KLQkJLy8gSXQgbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uLCBidXQgaW4gdGhlIHVzZSBjYXNlcyBJJ3ZlIHNlZW4sCi0JCS8vIGRvZXNuJ3QKLQkJLy8gc2VlbSB0byBodXJ0IHRvIHNpbXBseSByZXR1cm4gbnVsbCBpbiB0aG9zZSBjYXNlcy4gSSBzYXcgdGhpcyBudWxsCi0JCS8vIGNhc2UsCi0JCS8vIHdoZW4gdHJ5aW50IGdvIGZvcm1hdCBhbiBYTUwgZmlsZS4KLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvd25lclJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChvd25lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUob3duZXJSZWdpb24sIHRoaXMudmFsdWVSZWdpb24pOwotCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlU291cmNlKEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCkgewotCQlpZiAodGhpcy52YWx1ZVNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMudmFsdWVTb3VyY2U7Ci0JCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkvLyBmbGF0bm9kZSB0bwotCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKG93bmVyRWxlbWVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcy52YWx1ZVJlZ2lvbik7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaW50IGFtcCA9IHZhbHVlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKGFtcCA+PSAwKSB7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJCWlmIChhbXAgPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0LCBhbXApKTsKLQkJCWJ1ZmZlci5hcHBlbmQoSVhNTENoYXJFbnRpdHkuQU1QX1JFRik7Ci0JCQlvZmZzZXQgPSBhbXAgKyAxOwotCQkJYW1wID0gdmFsdWUuaW5kZXhPZignJicsIG9mZnNldCk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHZhbHVlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBKU1AgaW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEodGhpcy52YWx1ZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0aGlzLnZhbHVlUmVnaW9uKS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IGlzTmVzdGVkTGFuZ3VhZ2VPcGVuaW5nKHJlZ2lvblR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05hbWVPbmx5KCkgewotCQlyZXR1cm4gKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsICYmIHRoaXMuZXF1YWxSZWdpb24gPT0gbnVsbCAmJiB0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1ByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5uYW1lLmluZGV4T2YoJzonKSA8PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gbmFtZQotCQlpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5vd25lckVsZW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncwotCQkJCS8vIGNhc2Ugc2Vuc2l0aXZlCi0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxBdHRyKCkgewotCQlpZiAoaGFzUHJlZml4KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5vd25lckVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hNTEF0dHIoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMub3duZXJFbGVtZW50LmlzWE1MVGFnKCkpIHsKLQkJCQlyZXR1cm4gaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiAhZG9jdW1lbnQuaXNYTUxUeXBlKCkpIHsKLQkJCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy5uYW1lID09IG51bGwpOwotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm5hbWUubGVuZ3RoKCkgIT0gbmFtZS5sZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMubmFtZS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpICYmIGlnbm9yZUNhc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOYW1lQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwubmFtZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVJlZ2lvbnMgbWV0aG9kCi0JICovCi0Jdm9pZCByZW1vdmVSZWdpb25zKCkgewotCQl0aGlzLm5hbWVSZWdpb24gPSBudWxsOwotCQl0aGlzLnZhbHVlUmVnaW9uID0gbnVsbDsKLQkJdGhpcy5lcXVhbFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoKSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZSgpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoRWxlbWVudEltcGwgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0Jdm9pZCBzZXRFcXVhbFJlZ2lvbihJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbikgewotCQl0aGlzLmVxdWFsUmVnaW9uID0gZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJCXN0YXJ0T2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIHZhbHVlLCBudWxsLCBzdGFydE9mZnNldCk7Ci0JCX0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIG51bGwsIHZhbHVlLCBzdGFydE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldE5hbWVSZWdpb24oSVRleHRSZWdpb24gbmFtZVJlZ2lvbikgewotCQl0aGlzLm5hbWVSZWdpb24gPSBuYW1lUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRWYWx1ZShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJFbGVtZW50KEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5vd25lckVsZW1lbnQuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBwcmVmaXhMZW5ndGggPSAocHJlZml4ICE9IG51bGwgPyBwcmVmaXgubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZSgpOwotCQlpZiAocHJlZml4TGVuZ3RoID09IDApIHsKLQkJCXNldE5hbWUobG9jYWxOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobG9jYWxOYW1lID09IG51bGwpCi0JCQlsb2NhbE5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBsb2NhbExlbmd0aCA9IGxvY2FsTmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4TGVuZ3RoICsgMSArIGxvY2FsTGVuZ3RoKTsKLQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJc2V0TmFtZShidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJbm90aWZ5TmFtZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gUmVtZW1iZXI6IGFzIHdlIGFjY291bnQgZm9yICJmbG9hdGVycyIgaW4KLQkJLy8gZnV0dXJlLCByZW1lbWJlciB0aGF0IHNvbWUgYXJlIGNyZWF0ZWQKLQkJLy8gaW4gdGhlIG5hdHVyYWwgcHJvY2VzcyBvZiBpbXBsZW1lbnRpbmcKLQkJLy8gRE9NIGFwaXMuCi0JCS8vIHRoaXMgInNlbGYgbm90aWZpY2F0aW9uIiBvZiBhYm91dC9jaGFuZ2VkLAotCQkvLyBpcyBhZGRlZCBmb3IgdGhpcyBjYXNlLCBiZWNhdXNlIGl0IGtub3duIHRvCi0JCS8vIGJlIGNhbGxlZCBmcm9tIHByb3BlcnRpZXMgcGFnZXMuIFNob3VsZCBiZSBhCi0JCS8vIGFkZGVkIHRvIGFsbCBET00gTW9kaWZpeWluZyBBUElzIGV2ZW50dWFsbHkuCi0JCXRyeSB7Ci0JCQlnZXRNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJc2V0VmFsdWVTb3VyY2UoZ2V0VmFsdWVTb3VyY2UodmFsdWUpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldFZhbHVlUmVnaW9uKElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uKSB7Ci0JCXRoaXMudmFsdWVSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQl0aGlzLnZhbHVlU291cmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsICYmICF0aGlzLm93bmVyRWxlbWVudC5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy52YWx1ZVNvdXJjZSA9IHNvdXJjZTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ0RBVEFTZWN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTMxMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBDREFUQVNlY3Rpb25JbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBDREFUQVNlY3Rpb25JbXBsIGV4dGVuZHMgVGV4dEltcGwgaW1wbGVtZW50cyBDREFUQVNlY3Rpb24gewotCi0JLyoqCi0JICogQ0RBVEFTZWN0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBDREFUQVNlY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENEQVRBU2VjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ0RBVEFTZWN0aW9uSW1wbAotCSAqLwotCXByb3RlY3RlZCBDREFUQVNlY3Rpb25JbXBsKENEQVRBU2VjdGlvbkltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNEQVRBU2VjdGlvbkltcGwgY2xvbmVkID0gbmV3IENEQVRBU2VjdGlvbkltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gaW5zdGVhZCBvZiBzdXBlcihUZXh0SW1wbCkuZ2V0RGF0YSgpLCBjYWxsIGdldENoYXJhY3RlckRhdGEoKQotCQlTdHJpbmcgZGF0YSA9IGdldENoYXJhY3RlckRhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJZGF0YSA9IGdldERhdGEoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQlkYXRhID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY29udGVudFJlZ2lvbiA9PSBudWxsKSB7IC8vIGZpcnN0IGNvbnRlbnQKLQkJCQljb250ZW50UmVnaW9uID0gcmVnaW9uOwotCQkJfSBlbHNlIHsgLy8gbXVsdGlwbGUgY29udGVudHMKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmbGF0Tm9kZS5nZXRUZXh0KGNvbnRlbnRSZWdpb24pKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NkYXRhLXNlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ0RBVEFfU0VDVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DTU5vZGVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwZjZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENNTm9kZVV0aWwgewotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKEF0dHJJbXBsKSBhdHRyKS5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5nZXREZWNsYXJhdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4ZTIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQ2hhcmFjdGVyRGF0YUltcGwgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYXJhY3RlckRhdGFJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBDaGFyYWN0ZXJEYXRhIHsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoQ2hhcmFjdGVyRGF0YUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRhdGEgPSB0aGF0LmdldERhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSBhcmc7Ci0JCWVsc2UKLQkJCWRhdGEgKz0gYXJnOwotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmIChjb3VudCA8IDAgfHwgb2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPT0gMCkgewotCQkJaWYgKGNvdW50ID4gbGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2hhcmFjdGVyRGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZGF0YS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlkYXRhID0gYXJnOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlkYXRhID0gYXJnICsgZGF0YTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKG9mZnNldCA9PSBsZW5ndGgpCi0JCQkJZGF0YSArPSBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcgKyBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0pTUENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBudWxsKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKGNvdW50ID09IGxlbmd0aCkKLQkJCQlkYXRhID0gYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBhcmcgKyBkYXRhLnN1YnN0cmluZyhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQl0aGlzLmRhdGEgPSBnZXREYXRhKCk7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0RGF0YShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmRhdGEgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1YnN0cmluZ0RhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHN1YnN0cmluZ0RhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID09IDAgJiYgY291bnQgPT0gbGVuZ3RoKQotCQkJcmV0dXJuIGRhdGE7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5vZGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RGF0YSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGJiNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIENvbW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50SW1wbCBleHRlbmRzIENoYXJhY3RlckRhdGFJbXBsIGltcGxlbWVudHMgQ29tbWVudCB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIENvbW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIENvbW1lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIENvbW1lbnRJbXBsKENvbW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5pc0pTUFRhZyA9IHRoYXQuaXNKU1BUYWc7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNvbW1lbnRJbXBsIGNsb25lZCA9IG5ldyBDb21tZW50SW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlTdHJpbmcgZGF0YSA9IGdldENoYXJhY3RlckRhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJZGF0YSA9IGdldERhdGEoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQlkYXRhID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSB8fCBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UocmVnaW9uVHlwZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uID09IG51bGwpIHsgLy8gZmlyc3QgY29udGVudAotCQkJCWNvbnRlbnRSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbXVsdGlwbGUgY29udGVudHMKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmbGF0Tm9kZS5nZXRUZXh0KGNvbnRlbnRSZWdpb24pKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ09NTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IGlzTmVzdGVkQ29tbWVudENsb3NlKHJlZ2lvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICogQHBhcmFtIHJlZ2lvblR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbkNsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCXB1YmxpYyBib29sZWFuIGlzSlNQVGFnKCkgewotCQlyZXR1cm4gdGhpcy5pc0pTUFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXRKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SlNQVGFnKGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJaWYgKGlzSlNQVGFnID09IHRoaXMuaXNKU1BUYWcpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChpc0pTUFRhZykgewotCQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgIWRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMuaXNKU1BUYWcgPSBpc0pTUFRhZzsKLQotCQlpZiAoZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkvLyBhbHJlYWR5IGluIHRoZSB0cmVlLCB1cGRhdGUgSVN0cnVjdHVyZWREb2N1bWVudAotCQkJc2V0RGF0YShnZXREYXRhKCkpOyAvLyBjYWxscyBub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTAxZWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFhNTE1vZGVsSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRE9NTW9kZWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElET01Nb2RlbCwgRE9NSW1wbGVtZW50YXRpb24gewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUUkFDRV9QQVJTRVJfTUFOQUdFTUVOVF9FWENFUFRJT04gPSAicGFyc2VyTWFuYWdlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE9iamVjdCBhY3RpdmUgPSBudWxsOwotCXByaXZhdGUgRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIFhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogWE1MTW9kZWxJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIERPTU1vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICogCi0JICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdG5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVscyBzdGF0ZSBvbmNlIGZpbmlzaGVkIHdpdGggdGhlIGNoYW5nZXMuIFNlZQotCSAqIGdldE1lbWVudG8gYW5kIHJlc3RvcmVTdGF0ZS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRldGVybWluZSBpZgotCSAqIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGluIGEgY2hhbmdlIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpIHsKLQkJc3VwZXIuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCS8vIHRlY2huaWNhbGx5LCBubyBuZWVkIHRvIGNhbGwgYmVnaW5DaGFuZ2luZyBzbyBvZnRlbiwKLQkJLy8gc2luY2UgYWJvdXRUb0NoYW5nZU1vZGVsIGNhbiBiZSBuZXN0ZWQuCi0JCS8vIGJ1dCB3aWxsIGxlYXZlIGFzIGlzIGZvciB0aGlzIHJlbGVhc2UuCi0JCS8vIHNlZSBtb2RlbENoYW5nZWQsIGFuZCBiZSBzdXJlIHN0YXlzIGNvb3JkaW5hdGVkIHRoZXJlLgotCQlnZXRNb2RlbE5vdGlmaWVyKCkuYmVnaW5DaGFuZ2luZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpIHsKLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJbm90aWZpZXIuY2FuY2VsUGVuZGluZygpOwotCQlzdXBlci5hYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXR0clJlcGxhY2VkKEVsZW1lbnQgZWxlbWVudCwgQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIucmVwbGFjZUF0dHIoZWxlbWVudCwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmF0dHJSZXBsYWNlZChlbGVtZW50LCBuZXdBdHRyLCBvbGRBdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwgLi4uCi0JICogb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlIGNoYW5nZWQKLQkgKiBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEgZmluYWxseQotCSAqIGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuCi0JICogCi0JICogSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2hhbmdlZE1vZGVsKCkgewotCQkvLyBOT1RFOiB0aGUgb3JkZXIgb2YgJ2NoYW5nZWRNb2RlbCcgYW5kICdlbmRDaGFuZ2luZycgaXMgc2lnbmlmaWNhbnQuCi0JCS8vIEJ5IGNhbGxpbmcgY2hhbmdlZE1vZGVsIGZpcnN0LCB0aGlzIGJhc2ljYWxseSBkZWNyZW1lbnRzIHRoZQotCQkvLyAiaXNDaGFuZ2luZyIgY291bnRlcgotCQkvLyBpbiBzdXBlciBjbGFzcyBhbmQgd2hlbiB6ZXJvIGFsbCBsaXN0ZW5lcnMgdG8gbW9kZWwgc3RhdGUgZXZlbnRzCi0JCS8vIHdpbGwgYmUgbm90aWZpZWQKLQkJLy8gdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gJ2VuZENoYW5naW5nJyB3aWxsIG5vdGlmeSBhbGwKLQkJLy8gZGVmZXJyZWQgYWRhcHRlcnMuCi0JCS8vIFNvLCB0aGUgc2lnbmlmaWNhbmNlIG9mIG9yZGVyIGlzIHRoYXQgYWRhcHRlcnMgKGFuZCBtZXRob2RzIHRoZXkKLQkJLy8gY2FsbCkKLQkJLy8gY2FuIGNvdW50IG9uIHRoZSBzdGF0ZSBvZiBtb2RlbCAiaXNDaGFuZ2luZyIgdG8gYmUgYWNjdXJhdGUuCi0JCS8vIEJ1dCwgcmVtZW1iZXIsIHRoYXQgdGhpcyBtZWFucyB0aGUgIm1vZGVsQ2hhbmdlZCIgZXZlbnQgY2FuIGJlCi0JCS8vIHJlY2VpdmVkIGJlZm9yZSBhbGwKLQkJLy8gYWRhcHRlcnMgaGF2ZSBmaW5pc2hlZCB0aGVpciBwcm9jZXNzaW5nLgotCQkvLyBOT1RFIE5PVEU6IFRoZSBhYm92ZSBub3RlIGlzIG9ic29sZXRlIGluIGZhY3QgKHRob3VnaCBzdGlsbCBzdGF0ZXMKLQkJLy8gaXNzdWUgY29ycmVjdGx5KS4KLQkJLy8gRHVlIHRvIHBvcHVsYXIgZGVtYW5kLCB0aGUgb3JkZXIgb2YgdGhlc2UgY2FsbHMgd2VyZSByZXZlcnNlZCBhbmQKLQkJLy8gYmVoYXZpb3IKLQkJLy8gY2hhbmdlZCBvbiAwNy8yMi8yMDA0LgotCQkvLyAKLQkJLy8gc2VlIGFsc28KLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQzMDIKLQkJLy8gZm9yIG1vdGl2YXRpb24gZm9yIHRoaXMgJ29uIHZlcmdlIG9mJyBjYWxsLgotCQkvLyB0aGlzIGNvdWxkIGJlIGltcHJvdmVkIGluIGZ1dHVyZSBpZiBub3RpZmllciBhbHNvIHVzZWQgY291bnRpbmcKLQkJLy8gZmxhZyB0byBhdm9pZCBuZXN0ZWQgY2FsbHMuIElmL3doZW4gY2hhbmdlZCBiZSBzdXJlIHRvIGNoZWNrIGlmCi0JCS8vIGFib3V0VG9DaGFuZ2VNb2RlbCBuZWVkcyBhbnkgY2hhbmdlcyB0b28uCi0JCWlmIChpc01vZGVsQ2hhbmdlU3RhdGVPblZlcmdlT2ZFbmRpbmcoKSkgewotCQkJLy8gZW5kIGxvY2sgYmVmb3JlIG5vdGljaWF0aW9uIGxvb3AsIHNpbmNlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKLQkJCS8vIHdlIG1heSBiZSAiY2FsbGVkIGZyb20gZm9yaWVnbiBjb2RlIiBkdXJpbmcgbm90aWZpY2F0aW9uLgotCQkJZW5kTG9jaygpOwotCQkJLy8gd2UgbnVsbCBvdXQgaGVyZSB0byBhdm9pZCBzcHVyaW91cyJ3YXJuaW5nIiBtZXNzYWdlIHdoaWxlIGRlYnVnCi0JCQkvLyB0cmFjaW5nIGlzIGVuYWJsZWQKLQkJCWZMb2NrT2JqZWN0ID0gbnVsbDsKLQkJCS8vIHRoZSBub3RpZmllciBpcyB3aGF0IGNvbnRyb2xzIGFkYXBlciBub3RpZmljYXRpb24sIHdoaWNoCi0JCQkvLyBzaG91bGQgYmUgc2VudCBvdXQgYmVmb3JlIHRoZSAnbW9kZWxDaGFuZ2VkJyBldmVudC4KLQkJCWdldE1vZGVsTm90aWZpZXIoKS5lbmRDaGFuZ2luZygpOwotCQl9Ci0JCS8vIGNoYW5nZWRNb2RlbCBoYW5kbGVzICduZXN0aW5nJywgc28gb25seSBvbmUgZXZlbnQgc2VudCBvdXQKLQkJLy8gd2hlbiBtdWxpdHBsZSBjYWxscyB0byAnYWJvdXRUb0NoYW5nZS9DaGFuZ2VkJy4KLQkJc3VwZXIuY2hhbmdlZE1vZGVsKCk7Ci0JCWhhbmRsZVJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRSZXBsYWNlZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIucmVwbGFjZUNoaWxkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmNoaWxkUmVwbGFjZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIFhNTCA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotCSAqIHdpdGggaXRzIGRvY3VtZW50IGVsZW1lbnQuIEhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvCi0JICogaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUklUaGUKLQkgKiAgICAgICAgICAgIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gY3JlYXRlLgotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lVGhlCi0JICogICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBkb2N0eXBlVGhlCi0JICogICAgICAgICAgICB0eXBlIG9mIGRvY3VtZW50IHRvIGJlIGNyZWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4uIFdoZW4KLQkgKiAgICAgICAgICAgIDxjb2RlPmRvY3R5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgaXRzCi0JICogICAgICAgICAgICA8Y29kZT5Ob2RlLm93bmVyRG9jdW1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQgdG8gdGhlCi0JICogICAgICAgICAgICBkb2N1bWVudCBiZWluZyBjcmVhdGVkLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkCi0JICogICAgICAgICAgICAgICAgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBtYWxmb3JtZWQsIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHByZWZpeCBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgb3IgaWYgdGhlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEgcHJlZml4IHRoYXQgaXMgInhtbCIKLQkgKiAgICAgICAgICAgICAgICBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gIgotCSAqICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgLjxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kb2N0eXBlPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gdXNlZCB3aXRoIGEgZGlmZmVyZW50IGRvY3VtZW50IG9yIHdhcwotCSAqICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIERPTSBMZXZlbCAyCi0JICovCi0JcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLCBEb2N1bWVudFR5cGUgZG9jdHlwZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlLiBFbnRpdHkgZGVjbGFyYXRpb25zCi0JICogYW5kIG5vdGF0aW9ucyBhcmUgbm90IG1hZGUgYXZhaWxhYmxlLiBFbnRpdHkgcmVmZXJlbmNlIGV4cGFuc2lvbnMgYW5kCi0JICogZGVmYXVsdCBhdHRyaWJ1dGUgYWRkaXRpb25zIGRvIG5vdCBvY2N1ci4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBhIGZ1dHVyZQotCSAqIHZlcnNpb24gb2YgdGhlIERPTSB3aWxsIHByb3ZpZGUgYSB3YXkgZm9yIHBvcHVsYXRpbmcgYQotCSAqIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4uPGJyPgotCSAqIEhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZVRoZQotCSAqICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRvY3VtZW50IHR5cGUgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gcHVibGljSWRUaGUKLQkgKiAgICAgICAgICAgIGV4dGVybmFsIHN1YnNldCBwdWJsaWMgaWRlbnRpZmllci4KLQkgKiBAcGFyYW0gc3lzdGVtSWRUaGUKLQkgKiAgICAgICAgICAgIGV4dGVybmFsIHN1YnNldCBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gbm9kZSB3aXRoCi0JICogICAgICAgICA8Y29kZT5Ob2RlLm93bmVyRG9jdW1lbnQ8L2NvZGU+IHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkCi0JICogICAgICAgICAgICAgICAgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBtYWxmb3JtZWQuCi0JICogQHNlZSBET00gTGV2ZWwgMgotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgY3JlYXRlRG9jdW1lbnRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50VHlwZUltcGwgZG9jdW1lbnRUeXBlID0gbmV3IERvY3VtZW50VHlwZUltcGwoKTsKLQkJZG9jdW1lbnRUeXBlLnNldE5hbWUocXVhbGlmaWVkTmFtZSk7Ci0JCWRvY3VtZW50VHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCWRvY3VtZW50VHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCXJldHVybiBkb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMucmVmcmVzaCkKLQkJCXJldHVybjsKLQkJLy8gdW5saWtlICdyZXNmcmVzaCcsICdyZWluaXRpYWxpemUnIGZpbmlzaGVzIGxvb3AKLQkJLy8gYW5kIGZsdXNoZXMgcmVtYWluaW5nIG5vdGlmaWNhdGlvbiBxdWUgYmVmb3JlCi0JCS8vIGFjdHVhbGx5IHJlaW5pdGlhbGl6aW5nLgotCQkvLyBJU1NVRTogc2hvdWxkIHJlaW5pdCBiZSB1c2VkIGluc3RlYWQgb2YgaGFuZGxlcmVmcmVzaD8KLQkJLy8gdGhpcy5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCWlmICh0aGlzLmFjdGl2ZSAhPSBudWxsIHx8IGdldE1vZGVsTm90aWZpZXIoKS5pc0NoYW5naW5nKCkpCi0JCQlyZXR1cm47IC8vIGRlZmVyCi0JCWhhbmRsZVJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWdldE1vZGVsTm90aWZpZXIoKS5lZGl0YWJsZUNoYW5nZWQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VFbmRUYWcoZWxlbWVudCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmVuZFRhZ0NoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFBhcnNlciBnZXRBY3RpdmVQYXJzZXIoKSB7Ci0JCWlmICh0aGlzLnBhcnNlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnBhcnNlciAhPSB0aGlzLmFjdGl2ZSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5wYXJzZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFVwZGF0ZXIgZ2V0QWN0aXZlVXBkYXRlcigpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgIT0gdGhpcy5hY3RpdmUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMudXBkYXRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChEb2N1bWVudC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBYTUxEb2N1bWVudAotCSAqLwotCXB1YmxpYyBJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU291cmNlR2VuZXJhdG9yIGdldEdlbmVyYXRvcigpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdG9yID0gWE1MR2VuZXJhdG9ySW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIHNlYXJjaCBpbiBkb2N1bWVudCBjaGlsZHJlbgotCQlJRE9NTm9kZSBwYXJlbnQgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gdGhpcy5kb2N1bWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG9mZnNldCAqIDIgPCBsZW5ndGgpIHsKLQkJCS8vIHNlYXJjaCBmcm9tIHRoZSBmaXJzdAotCQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIHRoaXMuZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0RW5kT2Zmc2V0KCkgPD0gb2Zmc2V0KSB7Ci0JCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpIDw9IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJLy8gZGlnIG1vcmUKLQkJCQlwYXJlbnQgPSBjaGlsZDsKLQkJCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBmcm9tIHRoZSBsYXN0Ci0JCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgdGhpcy5kb2N1bWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQkJY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpID4gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPD0gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQkvLyBkaWcgbW9yZQotCQkJCXBhcmVudCA9IGNoaWxkOwotCQkJCWNoaWxkID0gKElET01Ob2RlKSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgWE1MTW9kZWxOb3RpZmllciBnZXRNb2RlbE5vdGlmaWVyKCkgewotCQlpZiAodGhpcy5ub3RpZmllciA9PSBudWxsKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbmV3IFhNTE1vZGVsTm90aWZpZXJJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFBhcnNlciBnZXRNb2RlbFBhcnNlcigpIHsKLQkJaWYgKHRoaXMucGFyc2VyID09IG51bGwpIHsKLQkJCXRoaXMucGFyc2VyID0gY3JlYXRlTW9kZWxQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wYXJzZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyIGNyZWF0ZU1vZGVsUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsUGFyc2VyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIGdldE1vZGVsVXBkYXRlcigpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnVwZGF0ZXIgPSBjcmVhdGVNb2RlbFVwZGF0ZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy51cGRhdGVyOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbFVwZGF0ZXIgY3JlYXRlTW9kZWxVcGRhdGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsVXBkYXRlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVmcmVzaCgpIHsKLQkJaWYgKCF0aGlzLnJlZnJlc2gpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZyh0cnVlKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRoaXMuZG9jdW1lbnQucmVtb3ZlQ2hpbGROb2RlcygpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCXRoaXMucmVmcmVzaCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYSBzcGVjaWZpYyBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlVGhlCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QgKGNhc2UtaW5zZW5zaXRpdmUpLiBUaGUgdmFsdWVzCi0JICogICAgICAgICAgICB1c2VkIGJ5IERPTSBmZWF0dXJlcyBhcmUgZGVmaW5lZCB0aHJvdWdob3V0IHRoZSBET00gTGV2ZWwgMgotCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgYW5kIGxpc3RlZCBpbiB0aGUgc2VjdGlvbi4gVGhlIG5hbWUgbXVzdCBiZQotCSAqICAgICAgICAgICAgYW4gWE1MIG5hbWUuIFRvIGF2b2lkIHBvc3NpYmxlIGNvbmZsaWN0cywgYXMgYSBjb252ZW50aW9uLAotCSAqICAgICAgICAgICAgbmFtZXMgcmVmZXJyaW5nIHRvIGZlYXR1cmVzIGRlZmluZWQgb3V0c2lkZSB0aGUgRE9NCi0JICogICAgICAgICAgICBzcGVjaWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlIHVuaXF1ZSBieSByZXZlcnNpbmcgdGhlIG5hbWUgb2YKLQkgKiAgICAgICAgICAgIHRoZSBJbnRlcm5ldCBkb21haW4gbmFtZSBvZiB0aGUgcGVyc29uIChvciB0aGUgb3JnYW5pemF0aW9uCi0JICogICAgICAgICAgICB0aGF0IHRoZSBwZXJzb24gYmVsb25ncyB0bykgd2hvIGRlZmluZXMgdGhlIGZlYXR1cmUsCi0JICogICAgICAgICAgICBjb21wb25lbnQgYnkgY29tcG9uZW50LCBhbmQgdXNpbmcgdGhpcyBhcyBhIHByZWZpeC4gRm9yCi0JICogICAgICAgICAgICBpbnN0YW5jZSwgdGhlIFczQyBTVkcgV29ya2luZyBHcm91cCBkZWZpbmVzIHRoZSBmZWF0dXJlCi0JICogICAgICAgICAgICAib3JnLnczYy5kb20uc3ZnIi4KLQkgKiBAcGFyYW0gdmVyc2lvblRoaXMKLQkgKiAgICAgICAgICAgIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LiBJbiBMZXZlbCAyLAotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyICIyLjAiIG9yICIxLjAiLiBJZiB0aGUgdmVyc2lvbiBpcwotCSAqICAgICAgICAgICAgbm90IHNwZWNpZmllZCwgc3VwcG9ydGluZyBhbnkgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBjYXVzZXMKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgdG8gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQgaW4gdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgdmVyc2lvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIXZlcnNpb24uZXF1YWxzKCIxLjAiKSAmJiAhdmVyc2lvbi5lcXVhbHMoIjIuMCIpKSB7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChmZWF0dXJlLmVxdWFsc0lnbm9yZUNhc2UoIkNvcmUiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZlYXR1cmUuZXF1YWxzSWdub3JlQ2FzZSgiWE1MIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudEltcGwoKTsKLQkJZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlib29sZWFuIGlzUmVwYXJzaW5nKCkgewotCQlyZXR1cm4gKGFjdGl2ZSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBuYW1lQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5hbWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VOYW1lKG5vZGUpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCS8vIG5vdGlmaWNhdGlvbiBpcyBhbHJlYWR5IHNlbnQKLQl9Ci0KLQkvKioKLQkgKiBuZXdNb2RlbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBmb3IgdGhlIGNhc2UKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IHN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCWludGVybmFsU2V0TmV3RG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXROZXdEb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmICgoZmxhdE5vZGVzID09IG51bGwpIHx8IChmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBiZWluZyBjb25zdHJ1Y3RlZAotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIC8vIGZvciBuZXcgbW9kZWwsIHdlIG1pZ2h0IG5lZWQgdG8KLQkJCS8vIC8vIHJlLWluaXQsIGUuZy4gaWYgc29tZW9uZSBjYWxscyBzZXRUZXh0Ci0JCQkvLyAvLyBvbiBhbiBleGlzdGluZyBtb2RlbAotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCS8vIGNhbGwgZXZlbiBpZiBjaGFuZ2luZyB0byBub3RpZnkgZG9pbmcgbmV3IG1vZGVsCi0JCWdldE1vZGVsTm90aWZpZXIoKS5iZWdpbkNoYW5naW5nKHRydWUpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdGhpcy5kb2N1bWVudC5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCS8vIG1lYW5pbmdsZXNzIHRvIHJlZnJlc2gsIGJlY2F1c2UgdGhlIHJlc3VsdCBtaWdodCBiZSB0aGUgc2FtZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJZ2V0TW9kZWxOb3RpZmllcigpLmVuZENoYW5naW5nKCk7Ci0JCQl9Ci0JCQkvLyBpZ25vcmUgcmVmcmVzaAotCQkJdGhpcy5yZWZyZXNoID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCS8vIGNsZWFudXAgdXBkYXRlciBzdGFmZnMKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhudWxsLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIEkgZ3Vlc3Mgbm8gY2hhbmFnZSBtZWFucyB0aGUgbW9kZWwgY291bGQgbm90IG5lZWQgcmUtaW5pdAotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vZGVzUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWlmIChleC5nZXRDbGFzcygpLmVxdWFscyhTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmNsYXNzKSkgewotCQkJCQlMb2dnZXIudHJhY2VFeGNlcHRpb24oVFJBQ0VfUEFSU0VSX01BTkFHRU1FTlRfRVhDRVBUSU9OLCBleCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQloYW5kbGVSZWZyZXNoKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlub3RpZmllci5lbmRDaGFuZ2luZygpOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogcmVnaW9uQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLmNoYW5nZVJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQlub3RpZmllci5iZWdpbkNoYW5naW5nKCk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0cnkgewotCQkJcGFyc2VyLmNoYW5nZVJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQloYW5kbGVSZWZyZXNoKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlub3RpZmllci5lbmRDaGFuZ2luZygpOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJfQotCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIHJlZ2lvbnNSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gZXZlbnQuZ2V0T2xkUmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IGV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJaWYgKG9sZFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlUmVnaW9ucyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlUmVnaW9ucyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQkvLyB0aGlzLmRvY3VtZW50LnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlRG9jdW1lbnRUeXBlKCk7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZShPYmplY3QgYWN0aXZlKSB7Ci0JCXRoaXMuYWN0aXZlID0gYWN0aXZlOwotCQkvLyBzaWRlIGVmZmVjdAotCQkvLyB3aGVuIGV2ZXIgYmVjb21lcyBhY3RpdmUsIGJlc3VyZSB0YWdOYW1lQ2FjaGUgaXMgY2xlYXJlZAotCQkvLyAoYW5kIG5vdCB1c2VkKQotCQlpZiAoYWN0aXZlID09IG51bGwpIHsKLQkJCWRvY3VtZW50LmFjdGl2YXRlVGFnTmFtZUNhY2hlKHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJZG9jdW1lbnQuYWN0aXZhdGVUYWdOYW1lQ2FjaGUoZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3IoSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxOb3RpZmllcihYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbFBhcnNlcihYTUxNb2RlbFBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcy5wYXJzZXIgPSBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxVcGRhdGVyKFhNTE1vZGVsVXBkYXRlciB1cGRhdGVyKSB7Ci0JCXRoaXMudXBkYXRlciA9IHVwZGF0ZXI7Ci0JfQotCi0JLyoqCi0JICogc2V0U3RydWN0dXJlZERvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdXBlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlyZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaW50ZXJuYWxTZXROZXdEb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0VGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLnN0YXJ0VGFnQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZVZhbHVlKG5vZGUpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS52YWx1ZUNoYW5nZWQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIDMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RnJhZ21lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RnJhZ21lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDU4YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogRG9jdW1lbnRGcmFnbWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50RnJhZ21lbnRJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIERvY3VtZW50RnJhZ21lbnQgewotCi0JLyoqCi0JICogRG9jdW1lbnRGcmFnbWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRGcmFnbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRGcmFnbWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRGcmFnbWVudEltcGwoRG9jdW1lbnRGcmFnbWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50RnJhZ21lbnRJbXBsIGNsb25lZCA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNkb2N1bWVudC1mcmFnbWVudCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzY0MzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLy8gZm9yIG9yZy5hcGFjaGUueGVyY2VzIDMuMi4xCi0vLyBpbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbHMuWE1MQ2hhcmFjdGVyUHJvcGVydGllczsKLS8vIERNVyBtb2RpZmllZCBmb3IgWE1MNEogNC4wLjEKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLlRyZWVXYWxrZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5OYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuRG9jdW1lbnRSYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLkRvY3VtZW50VHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLlRyZWVXYWxrZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJRE9NRG9jdW1lbnQsIERvY3VtZW50UmFuZ2UsIERvY3VtZW50VHJhdmVyc2FsIHsKLQotCS8qKgotCSAqIEludGVybmFsLXVzZSBvbmx5IGNsYXNzLiBUaGlzIGNsYXNzIHdhcyBhZGRlZCB0byBiZXR0ZXIgYWJsZSB0byBoYW5kbGUKLQkgKiByZXBldGV0aXZlIHJlcXVlc3QgZm9yIGdldEVsZW1lbnRzQnlUYWdOYW1lLiBUaGUgY2FjaGUgaXMgY2xlYXJlZCB3aGVuCi0JICogZXZlciB0aGUgZG9jdW1lbnQgY2hhbmdlcyBhdCBhbGwsIHNvIHN0aWxsIG5vdCByZWFsIGVmZmljaWVudCwKLQkgKi8KLQljbGFzcyBUYWdOYW1lQ2FjaGUgewotCi0JCXByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSB0cnVlOwotCi0JCXByaXZhdGUgTWFwIGNhY2hlOwotCi0JCXB1YmxpYyBUYWdOYW1lQ2FjaGUoKSB7Ci0JCQlzdXBlcigpOwotCQkJY2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBiCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZShib29sZWFuIGIpIHsKLQkJCWFjdGl2ZSA9IGI7Ci0JCQlpZiAoIWIpCi0JCQkJY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEl0ZW0oU3RyaW5nIHRhZ25hbWUsIE5vZGVMaXN0SW1wbCBub2RlbGlzdCkgewotCQkJaWYgKHRhZ25hbWUgPT0gbnVsbCB8fCBub2RlbGlzdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWNhY2hlLnB1dCh0YWduYW1lLCBub2RlbGlzdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWNhY2hlLmNsZWFyKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZUxpc3RJbXBsIGdldEl0ZW0oU3RyaW5nIHRhZ05hbWUpIHsKLQkJCU5vZGVMaXN0SW1wbCByZXN1bHQgPSBudWxsOwotCQkJaWYgKGFjdGl2ZSkgewotCQkJCXJlc3VsdCA9IChOb2RlTGlzdEltcGwpIGNhY2hlLmdldCh0YWdOYW1lKTsKLQkJCQkvLyBpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnRzQnlUYWduYW1lIGZyb20gY2FjaGU6ICIgKwotCQkJCS8vIHRhZ05hbWUpOwotCQkJCS8vIH0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCX0KLQotCS8vIHRoaXMgaXMgYSBjb25zdGFudCBqdXN0IHRvIGdpdmUgY29tcGlsZS10aW1lIGNvbnRyb2wgb3ZlcgotCS8vIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgY2FjaGUuIElmLCBpbiBmdXR1cmUsIGl0cyBmb3VuZCB0aGF0Ci0JLy8gdGhlcmUgYXJlIG5vIChvciBmZXcpICJkdXBsaWNhdGUgcmVxdWVzdHMiIC4uLiB0aGVuIHRoaXMgY2FjaGUKLQkvLyBpcyBub3QgbmVlZGVkLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNldGFnbmFtZWNhY2hlID0gdHJ1ZTsKLQotCS8vIHByaXZhdGUgRG9jdW1lbnRUeXBlQWRhcHRlciBkb2N1bWVudFR5cGVBZGFwdGVyID0gbnVsbDsKLQotCXByaXZhdGUgRE9NTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIFRhZ05hbWVDYWNoZSB0YWdOYW1lQ2FjaGU7Ci0KLQkvKioKLQkgKiBEb2N1bWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQl0YWdOYW1lQ2FjaGUgPSBuZXcgVGFnTmFtZUNhY2hlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRG9jdW1lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50SW1wbChEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJdGFnTmFtZUNhY2hlID0gbmV3IFRhZ05hbWVDYWNoZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQl2b2lkIGFjdGl2YXRlVGFnTmFtZUNhY2hlKGJvb2xlYW4gYikgewotCQl0YWdOYW1lQ2FjaGUuYWN0aXZhdGUoYik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIENoYW5nZXMgdGhlIDxjb2RlPm93bmVyRG9jdW1lbnQ8L2NvZGU+IG9mIGEgbm9kZSwgaXRzIGNoaWxkcmVuLCBhcwotCSAqIHdlbGwgYXMgdGhlIGF0dGFjaGVkIGF0dHJpYnV0ZSBub2RlcyBpZiB0aGVyZSBhcmUgYW55LiBJZiB0aGUgbm9kZSBoYXMKLQkgKiBhIHBhcmVudCBpdCBpcyBmaXJzdCByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBjaGlsZCBsaXN0LiBUaGlzCi0JICogZWZmZWN0aXZlbHkgYWxsb3dzIG1vdmluZyBhIHN1YnRyZWUgZnJvbSBvbmUgZG9jdW1lbnQgdG8gYW5vdGhlci4gVGhlCi0JICogZm9sbG93aW5nIGxpc3QgZGVzY3JpYmVzIHRoZSBzcGVjaWZpY3MgZm9yIGVhY2ggdHlwZSBvZiBub2RlLgotCSAqIDxkbD4KLQkgKiA8ZHQ+QVRUUklCVVRFX05PREU8L2R0PgotCSAqIDxkZD5UaGUgPGNvZGU+b3duZXJFbGVtZW50PC9jb2RlPiBhdHRyaWJ1dGUgaXMgc2V0IHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSA8Y29kZT5zcGVjaWZpZWQ8L2NvZGU+IGZsYWcgaXMgc2V0IHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gb24gdGhlIGFkb3B0ZWQgPGNvZGU+QXR0cjwvY29kZT4uIFRoZQotCSAqIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2UgPGNvZGU+QXR0cjwvY29kZT4gYXJlIHJlY3Vyc2l2ZWx5IGFkb3B0ZWQuCi0JICogPC9kZD4KLQkgKiA8ZHQ+RE9DVU1FTlRfRlJBR01FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPlRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc291cmNlIG5vZGUgYXJlIHJlY3Vyc2l2ZWx5IGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RE9DVU1FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPkRvY3VtZW50PC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5ET0NVTUVOVF9UWVBFX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkVMRU1FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPlNwZWNpZmllZCBhdHRyaWJ1dGUgbm9kZXMgb2YgdGhlIHNvdXJjZSBlbGVtZW50IGFyZSBhZG9wdGVkLCBhbmQKLQkgKiB0aGUgZ2VuZXJhdGVkIDxjb2RlPkF0dHI8L2NvZGU+IG5vZGVzLiBEZWZhdWx0IGF0dHJpYnV0ZXMgYXJlCi0JICogZGlzY2FyZGVkLCB0aG91Z2ggaWYgdGhlIGRvY3VtZW50IGJlaW5nIGFkb3B0ZWQgaW50byBkZWZpbmVzIGRlZmF1bHQKLQkgKiBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgbmFtZSwgdGhvc2UgYXJlIGFzc2lnbmVkLiBUaGUgZGVzY2VuZGFudHMKLQkgKiBvZiB0aGUgc291cmNlIGVsZW1lbnQgYXJlIHJlY3Vyc2l2ZWx5IGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RU5USVRZX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5FbnRpdHk8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkVOVElUWV9SRUZFUkVOQ0VfTk9ERTwvZHQ+Ci0JICogPGRkPk9ubHkgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gbm9kZSBpdHNlbGYgaXMgYWRvcHRlZCwKLQkgKiB0aGUgZGVzY2VuZGFudHMgYXJlIGRpc2NhcmRlZCwgc2luY2UgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLQkgKiBkb2N1bWVudHMgbWlnaHQgaGF2ZSBkZWZpbmVkIHRoZSBlbnRpdHkgZGlmZmVyZW50bHkuIElmIHRoZSBkb2N1bWVudAotCSAqIGJlaW5nIGltcG9ydGVkIGludG8gcHJvdmlkZXMgYSBkZWZpbml0aW9uIGZvciB0aGlzIGVudGl0eSBuYW1lLCBpdHMKLQkgKiB2YWx1ZSBpcyBhc3NpZ25lZC48L2RkPgotCSAqIDxkdD5OT1RBVElPTl9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+Tm90YXRpb248L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSwgVEVYVF9OT0RFLCBDREFUQV9TRUNUSU9OX05PREUsCi0JICogQ09NTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+VGhlc2Ugbm9kZXMgY2FuIGFsbCBiZSBhZG9wdGVkLiBObyBzcGVjaWZpY3MuPC9kZD4KLQkgKiBTaG91bGQgdGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybiBudWxsIHdoZW4gaXQgZmFpbHM/IEhvdyAiZXhjZXB0aW9uYWwiCi0JICogaXMgZmFpbHVyZSBmb3IgdGhpcyBtZXRob2Q/U3RpY2sgd2l0aCByYWlzaW5nIGV4Y2VwdGlvbnMgb25seSBpbgotCSAqIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMsIHJldHVybiBudWxsIG9uIGZhaWx1cmUgKEYyRiAxOSBKdW4gMjAwMCkuQ2FuCi0JICogYW4gZW50aXR5IG5vZGUgcmVhbGx5IGJlIGFkb3B0ZWQ/Tm8sIG5laXRoZXIgY2FuIE5vdGF0aW9uIG5vZGVzIChUZWxjb24KLQkgKiAxMyBEZWMgMjAwMCkuRG9lcyB0aGlzIGFmZmVjdCBrZXlzIGFuZCBoYXNoQ29kZSdzIG9mIHRoZSBhZG9wdGVkCi0JICogc3VidHJlZSBub2Rlcz9JZiBzbywgd2hhdCBhYm91dCByZWFkb25seS1uZXNzIG9mIGtleSBhbmQgaGFzaENvZGU/aWYKLQkgKiBub3QsIHdvdWxkIGFwcGVuZENoaWxkIGFmZmVjdCBrZXlzL2hhc2hDb2RlcyBvciB3b3VsZCBpdCBnZW5lcmF0ZQotCSAqIGV4Y2VwdGlvbnMgaWYga2V5J3MgYXJlIGR1cGxpY2F0ZT8gVXBkYXRlOiBIYXNoY29kZXMgaGF2ZSBiZWVuIGRyb3BwZWQuCi0JICogR2l2ZW4gdGhhdCB0aGUga2V5IGlzIG9ubHkgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50IGFuIGFkb3B0ZWQgbm9kZQotCSAqIG5lZWRzIHRvIGJlIGdpdmVuIGEgbmV3IGtleSwgYnV0IHdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgYXBwbGljYXRpb24/Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIG5vZGUgdG8gbW92ZSBpbnRvIHRoaXMgZG9jdW1lbnQuCi0JICogQHJldHVybiBUaGUgYWRvcHRlZCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9wZXJhdGlvbgotCSAqICAgICAgICAgZmFpbHMsIHN1Y2ggYXMgd2hlbiB0aGUgc291cmNlIG5vZGUgY29tZXMgZnJvbSBhIGRpZmZlcmVudAotCSAqICAgICAgICAgaW1wbGVtZW50YXRpb24uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT1RfU1VQUE9SVEVEX0VSUjogUmFpc2VkIGlmIHRoZSBzb3VyY2Ugbm9kZSBpcyBvZiB0eXBlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+RE9DVU1FTlQ8L2NvZGU+LDxjb2RlPkRPQ1VNRU5UX1RZUEU8L2NvZGU+LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBzb3VyY2Ugbm9kZQotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBhZG9wdE5vZGUob3JnLnczYy5kb20uTm9kZSBzb3VyY2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrVGFnTmFtZVZhbGlkaXR5KFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgY3JlYXRlRE9NRXhjZXB0aW9uTWVzc2FnZShET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCB0YWdOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50SW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lZC5pbXBvcnRDaGlsZE5vZGVzKHRoaXMsIHRydWUpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsIGF0dHIgPSBuZXcgQXR0ckltcGwoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQXR0ckltcGwgYXR0ciA9IG5ldyBBdHRySW1wbCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJYXR0ci5zZXROYW1lc3BhY2VVUkkodXJpKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ0RBVEFTZWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ0RBVEFTZWN0aW9uIGNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIGFsbG93IENEQVRBIHNlY3Rpb24KLQkJLy8gaWYgKCFpc1hNTFR5cGUoKSkgewotCQkvLyB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbmV3Ci0JCS8vIFN0cmluZygpKTsKLQkJLy8gfQotCQlDREFUQVNlY3Rpb25JbXBsIGNkYXRhID0gbmV3IENEQVRBU2VjdGlvbkltcGwoKTsKLQkJY2RhdGEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNkYXRhLnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCWNvbW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNvbW1lbnQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gaXNKU1BUYWcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmICghaXNKU1BUeXBlKCkgJiYgaXNKU1BUYWcpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQllbGVtZW50LnNldEpTUFRhZyhpc0pTUFRhZyk7Ci0JCUNvbW1lbnRFbGVtZW50UmVnaXN0cnkgcmVnaXN0cnkgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCWlmIChyZWdpc3RyeS5zZXR1cENvbW1lbnRFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXN1bHQgPSBlbGVtZW50OwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKFN0cmluZyBuYW1lKSB7Ci0JCURvY3VtZW50VHlwZUltcGwgZG9jVHlwZSA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKCk7Ci0JCWRvY1R5cGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZG9jVHlwZS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gZG9jVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudEZyYWdtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSB7Ci0JCURvY3VtZW50RnJhZ21lbnRJbXBsIGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKCk7Ci0JCWZyYWdtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoZWNrVGFnTmFtZVZhbGlkaXR5KHRhZ05hbWUpOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGwoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCWVsZW1lbnQuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVudGl0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVudGl0eQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVudGl0eSBjcmVhdGVFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJRW50aXR5SW1wbCBlbnRpdHkgPSBuZXcgRW50aXR5SW1wbCgpOwotCQllbnRpdHkuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZW50aXR5LnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRW50aXR5UmVmZXJlbmNlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNYTUxUeXBlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJRW50aXR5UmVmZXJlbmNlSW1wbCByZWYgPSBuZXcgRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZWYuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcmVmLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVJdGVyYXRvciBjcmVhdGVOb2RlSXRlcmF0b3IoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyb290ID0gdGhpczsKLQkJcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3JJbXBsKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlTm90YXRpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob3RhdGlvbgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vdGF0aW9uIGNyZWF0ZU5vdGF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCU5vdGF0aW9uSW1wbCBub3RhdGlvbiA9IG5ldyBOb3RhdGlvbkltcGwoKTsKLQkJbm90YXRpb24uc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJbm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCk7Ci0JCXBpLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXBpLnNldFRhcmdldCh0YXJnZXQpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcGkuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHBpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBSYW5nZUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCVRleHRJbXBsIHRleHQgPSBuZXcgVGV4dEltcGwoKTsKLQkJdGV4dC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl0ZXh0LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0cmVlIHdhbGsKLQkgKi8KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Eb2N1bWVudFRyYXZlcnNhbCNjcmVhdGVUcmVlV2Fsa2VyKG9yZy53M2MuZG9tLk5vZGUsCi0JICogICAgICBpbnQsIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBUcmVlV2Fsa2VyIGNyZWF0ZVRyZWVXYWxrZXIoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCVN0cmluZyBtc2cgPSAiUHJvZ3JhbSBFcnJvcjogcm9vdCBub2RlIGNhbiBub3QgYmUgbnVsbCBmb3IgVHJlZVdhbGtlciI7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbXNnKTsKLQkJfQotCQkvLyBJU1NVRTogd2UganVzdCB1c2UgWGVyY2VzIGltcGxlbWVudGF0aW9uIGZvciBub3csIGJ1dCBsb25nZXIgdGVybSwKLQkJLy8gd2Ugc2hvdWxkIG1ha2UgYQotCQkvLyB0aHJlYWQvam9iIHNhZmUgdmVyc2lvbiAoYXMgd2VsbCBhcyBub3QgcmVseSBvbiBYZXJjZXMgImltcGwiCi0JCS8vIGNsYXNzLgotCQlyZXR1cm4gbmV3IFRyZWVXYWxrZXJJbXBsKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlciwgZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKTsKLQotCX0KLQotCXByaXZhdGUgRG9jdW1lbnRUeXBlIGZpbmREb2N0eXBlKE5vZGUgbm9kZSkgewotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9UWVBFX05PREUgJiYgY2hpbGQgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpIHsKLQkJCQlyZXR1cm4gKERvY3VtZW50VHlwZSkgY2hpbGQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IEVMRU1FTlRfTk9ERSAmJiAoKElET01FbGVtZW50KSBjaGlsZCkuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkvLyBzZWFyY2ggRE9DVFlQRSBpbnNpZGUgb2YgZ2VuZXJpYyBjb21tZW50IGVsZW1lbnQKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGZpbmREb2N0eXBlKGNoaWxkKTsKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NUeXBlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRWxlbWVudCBmaW5kRG9jdW1lbnRFbGVtZW50KFN0cmluZyBkb2NOYW1lLCBOb2RlIG5vZGUsIE5vZGVbXSBmaXJzdEZvdW5kKSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNoaWxkOwotCQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQlFbGVtZW50IGRvY0VsZW1lbnQgPSBmaW5kRG9jdW1lbnRFbGVtZW50KGRvY05hbWUsIGVsZW1lbnQsIGZpcnN0Rm91bmQpOwotCQkJCWlmIChkb2NFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRvY0VsZW1lbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhZGRlZCAnZWxzZSBjb250aW51ZScgdG8gYmV0dGVyIGhhbmRsZSBjYXNlcyB3aGVyZQotCQkJCQkvLyB0aGVyZSBpcyAibW9yZSB0aGFuIG9uZSByb290IiBlbGVtZW50Ci0JCQkJCS8vIGVzcGVjaWFsbHkgY29tcGxpY2F0ZWQgYnkgQ29tbWVudEVsZW1lbnRzLCB3aGljaCBhcmUKLQkJCQkJLy8gc29tZXRpbWVzIHRyZWF0ZWQgYXMgZWxlbWVudHMsIGJ1dCBzaG91bGQKLQkJCQkJLy8gYmUgdHJlYXRlZCBhcyBjb21tZW50cyBpbiB0aGlzIGNvbnRleHQuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vdGU6IHRoZSAibmFtZSIgd29uJ3QgbWF0Y2ggaW4gdGhlIGV2ZW50IG9mIGEganNwIHRhZyAuLi4gYnV0Ci0JCQkvLyBpbmNhc2UKLQkJCS8vIHRoZSBuYW1lIGlzIG51bGwsIHdlIGRvIG5vdCB3YW50IHRoZSBqc3AgZWxlbWVudCByZXR1cm5lZCBhcwotCQkJLy8gZG9jdW1lbnRFbGVtZW50Ci0JCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRvY05hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCS8vIHVzZSBsb2NhbCBuYW1lIGZvciBuYW1lc3BhY2UKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGlzWE1MVHlwZSgpKSB7Ci0JCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoZG9jTmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGRvY05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCWlmIChmaXJzdEZvdW5kWzBdID09IG51bGwpCi0JCQkJZmlyc3RGb3VuZFswXSA9IGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hhclZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5hbWUuY2hhckF0KDApID09ICcjJykgeyAvLyBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCQlpZiAobGVuZ3RoID09IDEpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpbnQgcmFkaXggPSAxMDsKLQkJCVN0cmluZyBzID0gbnVsbDsKLQkJCS8vIG5vdyBhbGxvdyBoZXhhZGVjaW1hbCBhbHNvIGZvciBub24gWE1MIGRvY3VtZW50Ci0JCQlpZiAobmFtZS5jaGFyQXQoMSkgPT0gJ3gnKSB7IC8vIGhleGFkZWNpbWFsCi0JCQkJcmFkaXggPSAxNjsKLQkJCQlzID0gbmFtZS5zdWJzdHJpbmcoMik7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gZGVjaW1hbAotCQkJCXMgPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHMuY2hhckF0KDApID09ICctJykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm8gbWludXMgYWNjZXB0ZWQKLQkJCWNoYXIgYyA9IDA7Ci0JCQl0cnkgewotCQkJCWMgPSAoY2hhcikgSW50ZWdlci5wYXJzZUludChzLCByYWRpeCk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGMpOwotCQl9Ci0KLQkJLy8gaW1wbGljaXQgY2hhcmFjdGVyIGVudGl0aWVzIGZvciBYTUwKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LkxUX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkxUX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuR1RfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuR1RfVkFMVUU7Ci0JCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5BTVBfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQU1QX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuUVVPVF9OQU1FKSkKLQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5RVU9UX1ZBTFVFOwotCQlpZiAoaXNYTUxUeXBlKCkpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5BUE9TX05BTUUpKQotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5BUE9TX1ZBTFVFOwotCQl9Ci0KLQkJQ01Eb2N1bWVudCBjbSA9IGdldENNRG9jdW1lbnQoKTsKLQkJaWYgKGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVudGl0aWVzKCk7Ci0JCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQlDTUVudGl0eURlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbnRpdHlEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGRlY2wuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJaW50IHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQkJCWlmICh2YWx1ZUxlbmd0aCA+IDEgJiYgdmFsdWUuY2hhckF0KDApID09ICcmJyAmJiB2YWx1ZS5jaGFyQXQoMSkgPT0gJyMnICYmIHZhbHVlLmNoYXJBdCh2YWx1ZUxlbmd0aCAtIDEpID09ICc7JykgewotCQkJCQkJLy8gY2hhcmFjdGVyIHJlZmVyZW5jZQotCQkJCQkJcmV0dXJuIGdldENoYXJWYWx1ZSh2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWVMZW5ndGggLSAxKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGhpcyk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpIHsKLQkJcmV0dXJuIGZpbmREb2N0eXBlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3VtZW50RWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudCBGcm9tIERPTSAyIFNwZWM6IGRvY3VtZW50RWxlbWVudCBvZiB0eXBlCi0JICogICAgICAgICBFbGVtZW50IFtwLjYyXSAsIHJlYWRvbmx5IFRoaXMgaXMgYSBjb252ZW5pZW5jZSBbcC4xMTldCi0JICogICAgICAgICBhdHRyaWJ1dGUgdGhhdCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgY2hpbGQgbm9kZSB0aGF0IGlzCi0JICogICAgICAgICB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4gRm9yIEhUTUwgZG9jdW1lbnRzLCB0aGlzIGlzCi0JICogICAgICAgICB0aGUgZWxlbWVudCB3aXRoIHRoZSB0YWdOYW1lICJIVE1MIi4gTm90ZTogd2UgZGlmZmVyIGZyb20gdGhpcwotCSAqICAgICAgICAgZGVmaW5pdGlvbiBhIGxpdHRsZSBpbiB0aGF0IHdlIGRvbid0IG5lY2Vzc2FyaWx5IHRha2UgdGhlIGZpcnN0Ci0JICogICAgICAgICBjaGlsZCBidXQgYWxzbyBsb29rIHRvIG1hdGNoIHRoZSBuYW1lLiBJbiBhIHdlbGwgZm9ybWVkCi0JICogICAgICAgICBkb2N1bWVudCwgb2YgY291cnNlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lLCBidXQgbm90Ci0JICogICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBpbiBhbiBpbGwtZm9ybWVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQluYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlFbGVtZW50IGZpcnN0W10gPSBuZXcgRWxlbWVudFsxXTsKLQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZmluZERvY3VtZW50RWxlbWVudChuYW1lLCB0aGlzLCBmaXJzdCk7Ci0JCWlmIChkb2NFbGVtZW50ID09IG51bGwpIHsKLQkJCWRvY0VsZW1lbnQgPSBmaXJzdFswXTsKLQkJfQotCi0JCXJldHVybiBkb2NFbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGUgZ2V0RG9jdW1lbnRUeXBlKCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBnZXREb2N0eXBlKCk7Ci0JCXJldHVybiBhZGFwdGVyLmdldERvY3VtZW50VHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCS8vIHByb3RlY3RlZCBEb2N1bWVudFR5cGVBZGFwdGVyIGdldERvY3VtZW50VHlwZUFkYXB0ZXIoKSB7Ci0JLy8gLy8gYmUgc3VyZSB0byByZWxlYXNlIHNpbmNlIHBvc3NpYmx5IGNoYW5naW5nCi0JLy8gaWYgKHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JLy8gdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyLnJlbGVhc2UoKTsKLQkvLyB9Ci0JLy8gdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpCi0JLy8gZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkvLyBpZiAodGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID09IG51bGwpIHsKLQkvLyAvLyBhZGQgZGVmYXVsdCBhZGFwdGVyCi0JLy8gdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID0gbmV3IERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsKHRoaXMpOwotCS8vIGFkZEFkYXB0ZXIodGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlcjsKLQkvLyB9Ci0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudFR5cGVJZCgpIHsKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgaWQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJaWQgPSBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlJZChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50c0J5VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbnVsbDsKLQotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQllbGVtZW50cyA9IHRhZ05hbWVDYWNoZS5nZXRJdGVtKHRhZ05hbWUpOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gaW50ZXJuYWxHZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKLQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKFN0cmluZyB1cmksIFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCU5vZGVJdGVyYXRvciBpdCA9IGNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPT0gMSAmJiB1cmkuY2hhckF0KDApID09ICcqJykgewotCQkJdXJpID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHModGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5zVVJJID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIERPTUltcGxlbWVudGF0aW9uIGdldEltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogb3RoZXIgbm9kZXMgd2lsbCBiZSByZWZlcnJpbmcgdG8gdGhpcyBvbmUgdG8gZ2V0IHRoZSBvd25pbmcgbW9kZWwKLQkgKi8KLQlwdWJsaWMgSURPTU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgd2hldGhlciB0aGlzCi0JICogZG9jdW1lbnQgaXMgc3RhbmRhbG9uZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RhbmRhbG9uZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZyB3aGV0aGVyIGVycm9ycyBjaGVja2luZyBpcyBlbmZvcmNlZCBvciBub3QuCi0JICogV2hlbiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byBub3QKLQkgKiB0ZXN0IGV2ZXJ5IHBvc3NpYmxlIGVycm9yIGNhc2Ugbm9ybWFsbHkgZGVmaW5lZCBvbiBET00gb3BlcmF0aW9ucywgYW5kCi0JICogbm90IHJhaXNlIGFueSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+LiBJbiBjYXNlIG9mIGVycm9yLCB0aGUKLQkgKiBiZWhhdmlvciBpcyB1bmRlZmluZWQuIFRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPnRydWU8L2NvZGU+IGJ5Ci0JICogZGVmYXVsdHMuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFN0cmljdEVycm9yQ2hlY2tpbmcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGFkYXB0ZXIuZ2V0VGFnTmFtZUNhc2UoKSAhPSBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbXBvcnRDaGlsZE5vZGVzKE5vZGUgcGFyZW50LCBib29sZWFuIGRlZXApIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCU5vZGUgaW1wb3J0ZWQgPSBpbXBvcnROb2RlKGNoaWxkLCBkZWVwKTsKLQkJCWlmIChpbXBvcnRlZCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJYXBwZW5kQ2hpbGQoaW1wb3J0ZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGUgaW1wb3J0Tm9kZShOb2RlIG5vZGUsIGJvb2xlYW4gZGVlcCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUltcGwgaW1wb3J0ZWQgPSAoTm9kZUltcGwpIG5vZGUuY2xvbmVOb2RlKGRlZXApOwotCQlpZiAoaW1wb3J0ZWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbXBvcnRlZC5zZXRPd25lckRvY3VtZW50KHRoaXMsIGRlZXApOwotCQlyZXR1cm4gaW1wb3J0ZWQ7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlTGlzdEltcGwgaW50ZXJuYWxHZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnRzQnlUYWduYW1lOiAiICsgdGFnTmFtZSk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoIWVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJdGFnTmFtZUNhY2hlLmFkZEl0ZW0odGFnTmFtZSwgZWxlbWVudHMpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUERvY3VtZW50KCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfUk9PVCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BUeXBlKCkgewotCQlpZiAodGhpcy5tb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSB0aGlzLm1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaWQgPSBoYW5kbGVyLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBJU1NVRTogLS0gYXZvaWQgdGhpcyBoYXJkY29kZWQgc3RyaW5nCi0JCXJldHVybiBpZC5lcXVhbHMoIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyAvLyBETVc6IG1vZGlmaWVkIGZvciBYTUw0SiA0LjAuMQotCQkvLyBpZiAoWE1MQ2hhci5pc1ZhbGlkTmFtZShuYW1lKSkgcmV0dXJuIHRydWU7Ci0JCWlmIChOYW1lVmFsaWRhdG9yLmlzVmFsaWQobmFtZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gc3BlY2lhbCBmb3IgaW52YWxpZCBkZWNsYXJhdGlvbgotCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAxICYmIG5hbWUuY2hhckF0KDApID09ICchJykKLQkJCXJldHVybiB0cnVlOwotCQkvLyBzcGVjaWFsIGZvciBKU1AgdGFnIGluIHRhZyBuYW1lCi0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gYWRhcHRlci5pc1hNTFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlRG9jdW1lbnRUeXBlKCkgewotCS8vIGlmICh0aGlzLmRvY3VtZW50VHlwZUFkYXB0ZXIgPT0gbnVsbCkKLQkvLyByZXR1cm47Ci0JLy8gdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyLnJlbGVhc2UoKTsKLQkvLyB0aGlzLmRvY3VtZW50VHlwZUFkYXB0ZXIgPSBudWxsOwotCS8vIH0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nKSB7Ci0JfQotCi0JLyoqCi0JICogc2V0TW9kZWwgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBYTUxNb2RlbAotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgd2hldGhlciB0aGlzCi0JICogZG9jdW1lbnQgaXMgc3RhbmRhbG9uZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhbG9uZShib29sZWFuIHN0YW5kYWxvbmUpIHsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcgd2hldGhlciBlcnJvcnMgY2hlY2tpbmcgaXMgZW5mb3JjZWQgb3Igbm90LgotCSAqIFdoZW4gc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gbm90Ci0JICogdGVzdCBldmVyeSBwb3NzaWJsZSBlcnJvciBjYXNlIG5vcm1hbGx5IGRlZmluZWQgb24gRE9NIG9wZXJhdGlvbnMsIGFuZAotCSAqIG5vdCByYWlzZSBhbnkgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPi4gSW4gY2FzZSBvZiBlcnJvciwgdGhlCi0JICogYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiBUaGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiBieQotCSAqIGRlZmF1bHRzLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpY3RFcnJvckNoZWNraW5nKGJvb2xlYW4gc3RyaWN0RXJyb3JDaGVja2luZykgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgdmVyc2lvbgotCSAqIG51bWJlciBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFhtbFN0YW5kYWxvbmUoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sU3RhbmRhbG9uZShib29sZWFuIHhtbFN0YW5kYWxvbmUpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sVmVyc2lvbigpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYbWxWZXJzaW9uKFN0cmluZyB4bWxWZXJzaW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VVJJKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50VVJJKFN0cmluZyBkb2N1bWVudFVSSSkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBET01Db25maWd1cmF0aW9uIGdldERvbUNvbmZpZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3JtYWxpemVEb2N1bWVudCgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgTm9kZSByZW5hbWVOb2RlKE5vZGUgbiwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1ZmY0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VHlwZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCXN0YXRpYyBmaW5hbCBpbnQgTE9XRVJfQ0FTRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBTVFJJQ1RfQ0FTRSA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBVUFBFUl9DQVNFID0gMTsKLQotCS8qKgotCSAqLwotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCS8qKgotCSAqLwotCURvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKTsKLQotCS8qKgotCSAqLwotCWludCBnZXRUYWdOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2ZDhiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRUeXBlQWRhcHRlciB7Ci0KLQlwcml2YXRlIElET01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnRUeXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0JCXJldHVybiBTVFJJQ1RfQ0FTRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSURPTURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0JCXJldHVybiBTVFJJQ1RfQ0FTRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1hNTFR5cGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpCi0JCQlyZXR1cm47Ci0JCWlmIChub3RpZmllciA9PSBudWxsIHx8ICEobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpKQotCQkJcmV0dXJuOwotCQl0aGlzLmRvY3VtZW50VHlwZSA9ICgoSURPTURvY3VtZW50KSBub3RpZmllcikuZ2V0RG9jdHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeURvY3VtZW50VHlwZUNoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLmRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Nb2RlbCBtb2RlbCA9IHRoaXMuZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCSgoRE9NTW9kZWxJbXBsKSBtb2RlbCkuZG9jdW1lbnRUeXBlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFR5cGUoRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSkgewotCQl0aGlzLmRvY3VtZW50VHlwZSA9IGRvY3VtZW50VHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJmMjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBEb2N1bWVudFR5cGUgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VHlwZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIElET01Eb2N1bWVudFR5cGUgewotCXByaXZhdGUgU3RyaW5nIGludGVybmFsU3Vic2V0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBEb2N1bWVudFR5cGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRUeXBlSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudFR5cGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoRG9jdW1lbnRUeXBlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRUeXBlSW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbnRpdGllcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJuYWxTdWJzZXQoKSB7Ci0JCXJldHVybiB0aGlzLmludGVybmFsU3Vic2V0OwotCX0KLQotCS8qKgotCSAqIGdldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfVFlQRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vdGF0aW9ucyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0Tm90YXRpb25zKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbFN1YnNldChTdHJpbmcgaW50ZXJuYWxTdWJzZXQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmludGVybmFsU3Vic2V0ID0gaW50ZXJuYWxTdWJzZXQ7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldFB1YmxpY0lkKCkpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTeXN0ZW1JZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzIyMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIFZhbGVudGluIEJhY2l1IC0gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTU1MgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotCi0KLS8qKgotICogRWxlbWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIElET01FbGVtZW50IHsKLQotCXByaXZhdGUgY2xhc3MgQXR0cmlidXRlcyBpbXBsZW1lbnRzIE5hbWVkTm9kZU1hcCB7Ci0JCUF0dHJpYnV0ZXMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlpZiAoYXR0ck5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlyZXR1cm4gYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGF0dHJOb2Rlcy5pdGVtKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJCXJldHVybiByZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbShOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZSgoQXR0ckltcGwpIGFyZyk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZU5TKChBdHRySW1wbCkgYXJnKTsKLQkJfQotCX0KLQotCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRUYWcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVRhZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIEVsZW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVsZW1lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKEVsZW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy50YWdOYW1lID0gdGhhdC50YWdOYW1lOwotCQkJdGhpcy5pc0VtcHR5VGFnID0gdGhhdC5pc0VtcHR5VGFnOwotCQkJdGhpcy5pc0pTUFRhZyA9IHRoYXQuaXNKU1BUYWc7Ci0JCQl0aGlzLmlzQ29tbWVudFRhZyA9IHRoYXQuaXNDb21tZW50VGFnOwotCi0JCQkvLyBjbG9uZSBhdHRyaWJ1dGVzCi0JCQl0aGF0LmNsb25lQXR0cmlidXRlcyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnKEVsZW1lbnQgZW5kVGFnKSB7Ci0JCWlmIChlbmRUYWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGhhc0VuZFRhZygpKQotCQkJcmV0dXJuOwotCQlFbGVtZW50SW1wbCBlbmQgPSAoRWxlbWVudEltcGwpIGVuZFRhZzsKLQotCQkvLyBtb3ZlIHRoZSBlbmQgZmxhdCBub2RlIGZyb20gdGhlIGVuZCB0YWcKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVuZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCXNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQXR0aWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgYXBwZW5kQXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlpZiAoYXR0ci5nZXRPd25lckVsZW1lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMuYXR0ck5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQl0aGlzLmF0dHJOb2Rlcy5hcHBlbmROb2RlKGF0dHIpOwotCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQotCQlub3RpZnlBdHRyUmVwbGFjZWQoYXR0ciwgbnVsbCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGNsb25lQXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUF0dHJpYnV0ZXMoRWxlbWVudCBuZXdPd25lcikgewotCQlpZiAobmV3T3duZXIgPT0gbnVsbCB8fCBuZXdPd25lciA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld093bmVyOwotCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZXMoKTsKLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJQXR0ciBjbG9uZWQgPSAoQXR0cikgbm9kZS5jbG9uZU5vZGUoZmFsc2UpOwotCQkJaWYgKGNsb25lZCAhPSBudWxsKQotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZShjbG9uZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbGVtZW50SW1wbCBjbG9uZWQgPSBuZXcgRWxlbWVudEltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsgLy8gZm91bmQKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50c0J5VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoIWVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPT0gMSAmJiB1cmkuY2hhckF0KDApID09ICcqJykgewotCQkJdXJpID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHModGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5zVVJJID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWdOYW1lKCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkRW5kVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkRW5kVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gdGhpcy50YWdOYW1lLmluZGV4T2YoJzonKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiB0aGlzLnRhZ05hbWU7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCVN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlNfUFJFRklYICsgcHJlZml4OwotCQl9Ci0JCWVsc2UgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlM7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5zQXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYWdOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVMRU1FTlRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMudGFnTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAodGhpcy50YWdOYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydEVuZE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAoZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWhhc0NoaWxkTm9kZXMoKSkgewotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuICh0aGlzLmF0dHJOb2RlcyAhPSBudWxsICYmIHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogaGFzRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZygpIHsKLQkJcmV0dXJuICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNQcmVmaXgoKSB7Ci0JCWlmICh0aGlzLnRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMudGFnTmFtZS5pbmRleE9mKCc6JykgPD0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gZXhjbHVkZSBKU1AgdGFnIGluIHRhZyBuYW1lCi0JCWlmICh0aGlzLnRhZ05hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaGFzU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3RhcnRUYWcoKSB7Ci0JCXJldHVybiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaWdub3JlQ2FzZSgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pZ25vcmVDYXNlKCkpIHsKLQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncyBjYXNlCi0JCQkvLyBzZW5zaXRpdmUgdGFnCi0JCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ciBpbnNlcnRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0ciwgaW50IGluZGV4KSB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJaWYgKGF0dHIuZ2V0T3duZXJFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJdGhpcy5hdHRyTm9kZXMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCXRoaXMuYXR0ck5vZGVzLmluc2VydE5vZGUoYXR0ciwgaW5kZXgpOwotCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQotCQlub3RpZnlBdHRyUmVwbGFjZWQoYXR0ciwgbnVsbCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGluc2VydEJlZm9yZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHNob3VsZCB0aHJvdyBET01FeGNlcHRpb24gaW5zdGVhZCBvZiByZXR1cm4gbnVsbD8KLQkJaWYgKG5ld0NoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpc0NvbnRhaW5lcigpKSB7IC8vIG5ldmVyIGJlIGNvbnRhaW5lcgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChuZXdDaGlsZC5nZXROb2RlVHlwZSgpICE9IFRFWFRfTk9ERSkgewotCQkJaWYgKGlzSlNQQ29udGFpbmVyKCkgfHwgaXNDREFUQUNvbnRhaW5lcigpKSB7IC8vIGFjY2VwdHMgb25seQotCQkJCS8vIFRleHQKLQkJCQkvLyBjaGlsZAotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDREFUQUNvbnRhaW5lcigpIHsKLQkJLy8gdXNlIEJsb2NrTWFrZXIgaW5zdGVhZCBvZiBDTUVsZW1lbnREZWNsYXJhdGlvbgotCQkvLyBiZWNhdXNlIDxzdHlsZT4gYW5kIDxzY3JpcHQ+IGluIFhIVE1MIGlzIG5vdCBDREFUQSBjb250ZW50IHR5cGUKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGVycm9yCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJvcgotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQlpZiAocGFyc2VyID09IG51bGwgfHwgIShwYXJzZXIgaW5zdGFuY2VvZiBYTUxTb3VyY2VQYXJzZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKCgoWE1MU291cmNlUGFyc2VyKSBwYXJzZXIpLmdldEJsb2NrTWFya2VyKHRoaXMudGFnTmFtZSkgIT0gbnVsbCk7Ci0JCS8qCi0JCSAqIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOyBpZiAoZGVjbCA9PSBudWxsKQotCQkgKiByZXR1cm4gZmFsc2U7IGlmIChkZWNsIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlcikgeyBkZWNsID0KLQkJICogKENNRWxlbWVudERlY2xhcmF0aW9uKSgoQ01Ob2RlV3JhcHBlcilkZWNsKS5nZXRPcmlnaW5Ob2RlKCk7IGlmCi0JCSAqIChkZWNsID09IG51bGwpIHJldHVybiBmYWxzZTsgfSBpZiAoZGVjbCBpbnN0YW5jZW9mCi0JCSAqIFRMREVsZW1lbnREZWNsYXJhdGlvbikgeyBTdHJpbmcgY29udGVudCA9Ci0JCSAqICgoVExERWxlbWVudERlY2xhcmF0aW9uKWRlY2wpLmdldEJvZHljb250ZW50KCk7IGlmIChjb250ZW50ID09Ci0JCSAqIG51bGwpIHJldHVybiBmYWxzZTsgcmV0dXJuCi0JCSAqIGNvbnRlbnQuZXF1YWxzKEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpOyB9IGlmCi0JCSAqICghaXNHbG9iYWxUYWcoKSkgcmV0dXJuIGZhbHNlOyByZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PQotCQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJaWYgKGlzRW1wdHlUYWcoKSB8fCAhaXNDb250YWluZXIoKSkgewotCQkJZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQl9Ci0JCWVsc2UgewotCQkJZmxhdE5vZGUgPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gbXVzdCBiZSBnZW5lcmF0ZWQKLQkJfQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAoaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaXNOZXN0ZWRDbG9zZWRDb21tZW50KHJlZ2lvblR5cGUpIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSk7Ci0JCX0KLQkJaWYgKGlzSlNQVGFnKCkpIHsKLQkJCXJldHVybiBpc05lc3RlZENsb3NlZChyZWdpb25UeXBlKTsKLQkJfQotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDbG9zZWRDb21tZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21tZW50VGFnKCkgewotCQlyZXR1cm4gdGhpcy5pc0NvbW1lbnRUYWc7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChhZGFwdGVyLmlzQ29udGFpbmVyKCkpOwotCQkJfQotCQkJcmV0dXJuIChnZXREZWNsYXJhdGlvbigpID09IG51bGwpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQkvLyBleGNsdWRlIEpTUCBkaXJlY3RpdmUKLQkJCXJldHVybiAobWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfU0NSSVBUTEVUKSB8fCBtYXRjaFRhZ05hbWUoSlNQVGFnLkpTUF9ERUNMQVJBVElPTikgfHwgbWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpOwotCQl9Ci0JCWlmICghaXNYTUxUYWcoKSkgeyAvLyBub24tWE1MIHRhZwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gdW5kZWZpbmVkIHRhZwotCQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGlzRW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eVRhZygpIHsKLQkJaWYgKGlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFpc1hNTFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5pc0VtcHR5VGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gKGhhc0VuZFRhZygpICYmICFoYXNTdGFydFRhZygpICYmICFoYXNDaGlsZE5vZGVzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsVGFnKCkgewotCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUYWcoKSB7Ci0JCWlmIChoYXNTdGFydFRhZygpIHx8IGhhc0VuZFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBpbiB0aGUgZG9jdW1lbnQgdHJlZQotCQkvLyBiZWNhdXNlIGlmIG5vdCBpbiB0aGUgZG9jdW1lbnQgdHJlZSwgbm8gdGFncyBhcmUgZ2VuZXJhdGVkIHlldAotCQlyZXR1cm4gKGdldENvbnRhaW5lckRvY3VtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BDb250YWluZXIoKSB7Ci0JCXJldHVybiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkgJiYgaXNDb250YWluZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGlzTmVzdGVkQ2xvc2VkQ29tbWVudChyZWdpb25UeXBlKSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQlpZiAoaXNDb250YWluZXIoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gc3RhcnQgdGFnIGFsd2F5cyBoYXMgYSBzaW5nbGUgcmVnaW9uCi0JCQlyZXR1cm4gaXNDbG9zZWROZXN0ZWREaXJlY3RpdmUocmVnaW9uVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MVGFnKCkgewotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmICFkb2N1bWVudC5pc1hNTFR5cGUoKSkgewotCQkJLy8gZXZlbiBpbiBub24tWE1MIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzIFhNTCB0YWcKLQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGlzSlNQVGFnKCkgJiYgIWlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGltcGwuaXNKU1BUYWcoKSAmJiAhaW1wbC5pc0NvbW1lbnRUYWcoKSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoVGFnTmFtZShlbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogbWF0Y2hUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gKHRoaXMudGFnTmFtZSA9PSBudWxsKTsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlnbm9yZUNhc2UoKSkKLQkJCXJldHVybiB0aGlzLnRhZ05hbWUuZXF1YWxzKHRhZ05hbWUpOwotCQlyZXR1cm4gdGhpcy50YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5QXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBdHRyUmVwbGFjZWQoQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5hdHRyUmVwbGFjZWQodGhpcywgbmV3QXR0ciwgb2xkQXR0cik7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUVuZFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZW5kVGFnQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlTdGFydFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuc3RhcnRUYWdDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZWZlckVtcHR5VGFnKCkgewotCQlpZiAoaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlzWE1MVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyIG9sZEF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2xkQXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkgeyAvLyBubyBhdHRyaWJ1dGUKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciAhPSBvbGRBdHRyKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCS8vIG5vdCBmb3VuZAotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQljb250aW51ZTsKLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuYXR0ck5vZGVzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVtb3ZlRW5kVGFnKCkgewotCQlpZiAoIWhhc0VuZFRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSB0aGlzLmF0dHJOb2RlczsKLQkJdGhpcy5hdHRyTm9kZXMgPSBudWxsOyAvLyBub3QgdG8gY29weSBhdHRyaWJ1dGVzCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgY2xvbmVOb2RlKGZhbHNlKTsKLQkJdGhpcy5hdHRyTm9kZXMgPSBhdHRyTm9kZXM7Ci0JCWlmIChlbmQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIG1vdmUgdGhlIGVuZCBmbGF0IG5vZGUgdG8gdGhlIGVuZCB0YWcKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVN0YXJ0VGFnKCkgewotCQlyZW1vdmVBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlpZiAodGhpcy5hdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXR0ci5yZXNldFJlZ2lvbnMoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyBmb3IgY2hpbGRyZW4KLQotCQl0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7IC8vIGNoYW5nZSB2YWx1ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmV3IGF0dHJpYnV0ZQotCQlEb2N1bWVudCBkb2MgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCX0KLQotCS8qKgotCSAqIHNldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJRWxlbWVudCBvd25lciA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQlpZiAob3duZXIgPT0gdGhpcykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUF0dHIgb2xkQXR0ciA9IHJlbW92ZUF0dHJpYnV0ZU5vZGUobmV3QXR0ci5nZXROYW1lKCkpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQlyZXR1cm4gb2xkQXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlFbGVtZW50IG93bmVyID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWlmIChvd25lciA9PSB0aGlzKQotCQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBuZXdBdHRyLmdldExvY2FsTmFtZSgpOwotCQlTdHJpbmcgdXJpID0gbmV3QXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLQkJQXR0ciBvbGRBdHRyID0gcmVtb3ZlQXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCXJldHVybiBvbGRBdHRyOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB3ZSBzaG91bGQgY2hlY2sgZm9yIGFuZCB0aHJvdyBOQU1FU1BBQ0VfRVJSLCBhY2NvcmRpbmcgdG8gc3BlYy4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTU1MgotCQkvLyBmaXggcHJvdmlkZWQgYnkgVmFsZW50aW4gQmFjaXUKLQkJaW50IGluZGV4ID0gcXVhbGlmaWVkTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBpbmRleCAhPSAtMSA/IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSkgOiBxdWFsaWZpZWROYW1lOwotCi0JCUF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIGxvY2FsTmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUpOyAvLyBjaGFuZ2UgdmFsdWUKLQkJfQotCQllbHNlIHsKLQotCQkJLy8gbmV3IGF0dHJpYnV0ZQotCQkJRG9jdW1lbnQgZG9jID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGVOUyh1cmksIHF1YWxpZmllZE5hbWUpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudFRhZyhib29sZWFuIGlzQ29tbWVudFRhZykgewotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuaXNDb21tZW50VGFnID0gaXNDb21tZW50VGFnOwotCX0KLQotCS8qKgotCSAqIHNldEVtcHR5VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBpc0VtcHR5VGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1wdHlUYWcoYm9vbGVhbiBpc0VtcHR5VGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0VtcHR5VGFnID0gaXNFbXB0eVRhZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICovCi0Jdm9pZCBzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCi0JCU5vZGVDb250YWluZXIgcGFyZW50ID0gKE5vZGVDb250YWluZXIpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuc3luY0NoaWxkRWRpdGFibGVTdGF0ZSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZykgewotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuaXNKU1BUYWcgPSBpc0pTUFRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQsIGRlZXApOwotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlhdHRyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IHByZWZpeExlbmd0aCA9IChwcmVmaXggIT0gbnVsbCA/IHByZWZpeC5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChwcmVmaXhMZW5ndGggPT0gMCkgewotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8IGxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLy8gaW52YWxpZCBsb2NhbCBuYW1lCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0VGFnTmFtZShsb2NhbE5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IGxvY2FsTGVuZ3RoID0gKGxvY2FsTmFtZSAhPSBudWxsID8gbG9jYWxOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXhMZW5ndGggKyAxICsgbG9jYWxMZW5ndGgpOwotCQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQkJYnVmZmVyLmFwcGVuZCgnOicpOwotCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJCXNldFRhZ05hbWUoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJYm9vbGVhbiBjaGFuZ2VFbmRUYWcgPSBoYXNFbmRUYWcoKTsKLQkJbm90aWZ5U3RhcnRUYWdDaGFuZ2VkKCk7Ci0JCWlmIChjaGFuZ2VFbmRUYWcpCi0JCQlub3RpZnlFbmRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICovCi0Jdm9pZCBzZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgdGFnTmFtZSA9IGdldFRhZ05hbWUoKTsKLQkJaWYgKGhhc1N0YXJ0VGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQlpZiAoaXNFbXB0eVRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgnLycpOwotCQlpZiAoaGFzRW5kVGFnKCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJy8nKTsKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKQotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzU1OGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBFbnRpdHlJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBFbnRpdHkgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbm90YXRpb25OYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLyoqCi0JICogRW50aXR5SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVudGl0eUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRW50aXR5SW1wbAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlJbXBsKEVudGl0eUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCQl0aGlzLnB1YmxpY0lkID0gdGhhdC5wdWJsaWNJZDsKLQkJCXRoaXMuc3lzdGVtSWQgPSB0aGF0LnN5c3RlbUlkOwotCQkJdGhpcy5ub3RhdGlvbk5hbWUgPSB0aGF0Lm5vdGF0aW9uTmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRW50aXR5SW1wbCBjbG9uZWQgPSBuZXcgRW50aXR5SW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBFTlRJVFlfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb3RhdGlvbk5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZykgewotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm90YXRpb25OYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub3RhdGlvbk5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIG5vdGF0aW9uTmFtZSkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMubm90YXRpb25OYW1lID0gbm90YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIHNldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgdmVyc2lvbgotCSAqIG51bWJlciBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2ZWNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEVudGl0eVJlZmVyZW5jZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5UmVmZXJlbmNlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgRW50aXR5UmVmZXJlbmNlIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogRW50aXR5UmVmZXJlbmNlSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVudGl0eVJlZmVyZW5jZUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRW50aXR5UmVmZXJlbmNlSW1wbAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlSZWZlcmVuY2VJbXBsKEVudGl0eVJlZmVyZW5jZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVudGl0eVJlZmVyZW5jZUltcGwgY2xvbmVkID0gbmV3IEVudGl0eVJlZmVyZW5jZUltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRU5USVRZX1JFRkVSRU5DRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0ludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxNjZlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0ludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiBUaHJvd24gYW4gaW52YWxpZCBjaGFyYWN0ZXIgaXMgc3BlY2lmaWVkIGluIDogWE1MTm9kZSNzZXRTb3VyY2UoU3RyaW5nKQotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBjaGFyIGludmFsaWRDaGFyID0gMDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJc3VwZXIocyk7Ci0JCXRoaXMuaW52YWxpZENoYXIgPSBjOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzLCBjaGFyIGMsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIocyk7Ci0JCXRoaXMuaW52YWxpZENoYXIgPSBjOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRJbnZhbGlkQ2hhcigpIHsKLQkJcmV0dXJuIHRoaXMuaW52YWxpZENoYXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjN2JiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIEpTUFRhZyBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BUYWcgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DTE9TRSA9ICItLSU+IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX09QRU4gPSAiPCUtLSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT05fVE9LRU4gPSAiISI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1RPS0VOID0gIkAiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fVE9LRU4gPSAiPSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OID0gImpzcDpkZWNsYXJhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRSA9ICJqc3A6ZGlyZWN0aXZlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRVhQUkVTU0lPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1QgPSAianNwOnJvb3QiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVCA9ICJqc3A6c2NyaXB0bGV0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiJT4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PUEVOID0gIjwlIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Nb2RlbFBhcnNlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2ZDRhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUGFyc2VyQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250YWluKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpOwotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlSW1wbGljaXRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbmRSb290TmFtZShTdHJpbmcgdGFnTmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Mjk2YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIE5vZGVDb250YWluZXIgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVDb250YWluZXIgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5vZGUsIE5vZGVMaXN0IHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ2hpbGROb2Rlc0NhY2hlIGltcGxlbWVudHMgTm9kZUxpc3QgewotCQlwcml2YXRlIE5vZGUgY3VyQ2hpbGQgPSBudWxsOwotCQlwcml2YXRlIGludCBjdXJJbmRleCA9IC0xOwotCQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JCUNoaWxkTm9kZXNDYWNoZSgpIHsKLQkJCWluaXRpYWxpemVDYWNoZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkvLyBhdG9taWMKLQkJCXJldHVybiB0aGlzLmxlbmd0aDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2FjaGUoKSB7Ci0JCQkvLyBub3RlIHdlIHVzZSB0aGUgb3V0dGVyIG9iamVjdHMgbG9ja29iamVjdAotCQkJLy8gKHNpbmNlIHdlIGFyZSB1c2luZyB0aGVpciAiY2hpbGRyZW4iLgotCQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQkJZm9yIChOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCXRoaXMubGVuZ3RoKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJCWlmICh0aGlzLmxlbmd0aCA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGgpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJaWYgKHRoaXMuY3VySW5kZXggPCAwKSB7IC8vIGZpcnN0IHRpbWUKLQkJCQkJaWYgKGluZGV4ICogMiA+PSB0aGlzLmxlbmd0aCkgeyAvLyBzZWFyY2ggZnJvbSB0aGUgbGFzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IHRoaXMubGVuZ3RoIC0gMTsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSBsYXN0Q2hpbGQ7Ci0JCQkJCX0gZWxzZSB7IC8vIHNlYXJjaCBmcm9tIHRoZSBmaXJzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IDA7Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gZmlyc3RDaGlsZDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmRleCA9PSB0aGlzLmN1ckluZGV4KQotCQkJCQlyZXR1cm4gdGhpcy5jdXJDaGlsZDsKLQotCQkJCWlmIChpbmRleCA+IHRoaXMuY3VySW5kZXgpIHsKLQkJCQkJd2hpbGUgKGluZGV4ID4gdGhpcy5jdXJJbmRleCkgewotCQkJCQkJdGhpcy5jdXJJbmRleCsrOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IHRoaXMuY3VyQ2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vIGluZGV4IDwgdGhpcy5jdXJJbmRleAotCQkJCQl3aGlsZSAoaW5kZXggPCB0aGlzLmN1ckluZGV4KSB7Ci0JCQkJCQl0aGlzLmN1ckluZGV4LS07Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gdGhpcy5jdXJDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB0aGlzLmN1ckNoaWxkOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBOb2RlTGlzdCBjaGlsZE5vZGVzQ2FjaGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZDaGlsZEVkaXRhYmxlID0gdHJ1ZTsKLQlOb2RlSW1wbCBmaXJzdENoaWxkID0gbnVsbDsKLQlOb2RlSW1wbCBsYXN0Q2hpbGQgPSBudWxsOwotCi0JT2JqZWN0IGxvY2tPYmplY3QgPSBuZXcgYnl0ZVswXTsKLQotCS8qKgotCSAqIE5vZGVDb250YWluZXIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlQ29udGFpbmVyIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVDb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcihOb2RlQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNsb25lQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoTm9kZSBuZXdQYXJlbnQsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50ID09IHRoaXMpCi0JCQlyZXR1cm47Ci0JCWlmICghKG5ld1BhcmVudCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpKQotCQkJcmV0dXJuOwotCi0JCU5vZGVDb250YWluZXIgY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG5ld1BhcmVudDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5maXJzdENoaWxkOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmxhc3RDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJaWYgKHRoaXMuY2hpbGROb2Rlc0NhY2hlID09IG51bGwpCi0JCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBuZXcgQ2hpbGROb2Rlc0NhY2hlKCk7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzQ2FjaGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gY2hpbGQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuZmlyc3RDaGlsZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRCZWZvcmUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZkNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChyZWZDaGlsZCAhPSBudWxsICYmIHJlZkNoaWxkLmdldFBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAobmV3Q2hpbGQgPT0gcmVmQ2hpbGQpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlpZiAobmV3Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7Ci0JCQkvLyBpbnNlcnQgY2hpbGQgbm9kZXMgaW5zdGVhZAotCQkJZm9yIChOb2RlIGNoaWxkID0gbmV3Q2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5ld0NoaWxkLmdldEZpcnN0Q2hpbGQoKSkgewotCQkJCW5ld0NoaWxkLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlpbnNlcnRCZWZvcmUoY2hpbGQsIHJlZkNoaWxkKTsKLQkJCX0KLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJfQotCQkvLyBzeW5jaHJvbml6ZWQgaW4gY2FzZSBhbm90aGVyIHRocmVhZCBpcyBnZXR0aW5nIGl0ZW0sIG9yIGxlbmd0aAotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCXRoaXMuY2hpbGROb2Rlc0NhY2hlID0gbnVsbDsgLy8gaW52YWxpZGF0ZSBjaGlsZCBub2RlcyBjYWNoZQotCQl9Ci0KLQkJTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSByZWZDaGlsZDsKLQkJTm9kZUltcGwgcHJldiA9IG51bGw7Ci0JCU5vZGUgb2xkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAob2xkUGFyZW50ICE9IG51bGwpCi0JCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQlpZiAobmV4dCA9PSBudWxsKSB7Ci0JCQlwcmV2ID0gdGhpcy5sYXN0Q2hpbGQ7Ci0JCQl0aGlzLmxhc3RDaGlsZCA9IGNoaWxkOwotCQl9IGVsc2UgewotCQkJcHJldiA9IChOb2RlSW1wbCkgbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLQkJfQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5maXJzdENoaWxkID0gY2hpbGQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG5leHQpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKHRoaXMpOwotCQkvLyBtYWtlIHN1cmUgaGF2aW5nIHRoZSBzYW1lIG93bmVyIGRvY3VtZW50Ci0JCWlmIChjaGlsZC5nZXRPd25lckRvY3VtZW50KCkgPT0gbnVsbCkgewotCQkJaWYgKGdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfTk9ERSkgewotCQkJCWNoaWxkLnNldE93bmVyRG9jdW1lbnQoKERvY3VtZW50KSB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChnZXRPd25lckRvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJbm90aWZ5Q2hpbGRSZXBsYWNlZChjaGlsZCwgbnVsbCk7Ci0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJaWYgKCFmQ2hpbGRFZGl0YWJsZSkgewotCQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmlzUmVwYXJzaW5nKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNoaWxkRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAodGhpcy5maXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5jaGlsZE5vZGVzQ2FjaGUgPT0gbnVsbCkKLQkJCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG5ldyBDaGlsZE5vZGVzQ2FjaGUoKTsKLQkJCXJldHVybiB0aGlzLmNoaWxkTm9kZXNDYWNoZS5pdGVtKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vdGlmeUNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hpbGRSZXBsYWNlZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNDaGlsZEVkaXRhYmxlU3RhdGUobmV3Q2hpbGQpOwotCi0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5jaGlsZFJlcGxhY2VkKHRoaXMsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplZCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGlzIGdldHRpbmcgaXRlbSwgb3IgbGVuZ3RoCi0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGNoaWxkIG5vZGVzIGNhY2hlCi0JCX0KLQotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgb2xkQ2hpbGQ7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWNoaWxkLnNldEVkaXRhYmxlKHRydWUsIHRydWUpOyAvLyBjbGVhciBSZWFkT25seSBmbGFncwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBuZXh0OwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKG5leHQpOwotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5sYXN0Q2hpbGQgPSBwcmV2OwotCQllbHNlCi0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqIEBwYXJhbSBmaXJzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGxhc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJlbW92ZUNoaWxkTm9kZXMoTm9kZSBmaXJzdENoaWxkLCBOb2RlIGxhc3RDaGlsZCkgewotCQlpZiAoIWhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChnZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX05PREUpCi0JCQlkb2N1bWVudCA9IChEb2N1bWVudCkgdGhpczsKLQkJZWxzZQotCQkJZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50RnJhZ21lbnQgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCWZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCWxhc3RDaGlsZCA9IGdldExhc3RDaGlsZCgpOwotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV4dENoaWxkKSB7Ci0JCQluZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJcmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJaWYgKGNoaWxkID09IGxhc3RDaGlsZCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCU5vZGUgbm9kZTsKLQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy51bmxvY2tOb2RlKChJRE9NTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy5sb2NrTm9kZSgoSURPTU5vZGUpIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJZkNoaWxkRWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NoaWxkRWRpdGFibGVTdGF0ZShOb2RlIGNoaWxkKSB7Ci0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCXJvYy5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlNjU5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0vKioKLSAqIE5vZGVJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlSW1wbCBleHRlbmRzIEFic3RyYWN0Tm90aWZpZXIgaW1wbGVtZW50cyBOb2RlLCBJRE9NTm9kZSB7Ci0JLy8gZGVmaW5lIG9uZSBlbXB0eSBub2RlbGlzdCwgZm9yIHJlcGVhdGVkIHVzZQotCXByaXZhdGUgZmluYWwgc3RhdGljIE5vZGVMaXN0IEVNUFRZX05PREVfTElTVCA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBmRGF0YUVkaXRhYmxlID0gdHJ1ZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgbmV4dFNpYmxpbmcgPSBudWxsOwotCi0JcHJpdmF0ZSBEb2N1bWVudEltcGwgb3duZXJEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwYXJlbnROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIHByZXZpb3VzU2libGluZyA9IG51bGw7Ci0KLQkvKioKLQkgKiBOb2RlSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBOb2RlSW1wbAotCSAqLwotCXByb3RlY3RlZCBOb2RlSW1wbChOb2RlSW1wbCB0aGF0KSB7Ci0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMub3duZXJEb2N1bWVudCA9IHRoYXQub3duZXJEb2N1bWVudDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udGFpbnMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCkgewotCQlyZXR1cm4gKG9mZnNldCA+PSBnZXRTdGFydE9mZnNldCgpICYmIG9mZnNldCA8IGdldEVuZE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlRE9NRXhjZXB0aW9uTWVzc2FnZShzaG9ydCBzLCBTdHJpbmcgdGFnTmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gVE9ETzogU2hvdWxkIGxvY2FsaXplIHRoZXNlIG1lc3NhZ2VzLCBhbmQgcHJvdmlkZSAvdSBlc2NhcGVkCi0JCS8vIHZlcnNpb24gb2YgdGFnTmFtZQotCQlyZXN1bHQgPSBsb29rdXBNZXNzYWdlKHMpICsgIiAiICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2hhclZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGRvY3VtZW50LmdldENoYXJWYWx1ZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJLy8gQXMgcGVyIERPTSBzcGVjLCBjb3JyZWN0IGJlaGF2aW9yIGZvciBnZXRDaGlsZE5vZGVzIGlzIHRvIHJldHVybiBhCi0JCS8vIHplcm8gbGVuZ3RoIE5vZGVMaXN0LCBub3QgbnVsbCwgd2hlbiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4uCi0JCS8vIFdlJ2xsIHVzZSBhIGNvbW1vbiBpbnN0YW5jZSBvZiBhbiBlbXB0eSBub2RlIGxpc3QsIGp1c3QgdG8gcHJldmVudAotCQkvLyBjcmVhdGluZyBhIHRyaXZhbCBvYmplY3QgbWFueSBtYW55IHRpbWVzLgotCi0JCXJldHVybiBFTVBUWV9OT0RFX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29tbW9uQW5jZXN0b3IgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDb21tb25BbmNlc3RvcihOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBuYSA9IG5vZGU7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKE5vZGUgdGEgPSB0aGlzOyB0YSAhPSBudWxsOyB0YSA9IHRhLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmICh0YSA9PSBuYSkKLQkJCQkJcmV0dXJuIHRhOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqIGdldENvbnRhaW5lckRvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSB7Ci0JCWZvciAoTm9kZSBub2RlID0gdGhpczsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJcmV0dXJuIChEb2N1bWVudCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJTm9kZSBub2RlID0gdGhpczsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0KLQotCQkJTm9kZSBsYXN0ID0gbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWlmIChsYXN0ICE9IG51bGwpIHsgLy8gZGlnIGludG8gdGhlIGxhc3QKLQkJCQlub2RlID0gbGFzdDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCXJldHVybiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCi0JCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCkgeyAvLyBtb3ZlIHRvIHRoZSBwcmV2aW91cwotCQkJCW5vZGUgPSBwcmV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJbm9kZSA9IG51bGw7Ci0JCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQkJCXJldHVybiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQl9Ci0JCQkJTm9kZSBwYXJlbnRQcmV2ID0gcGFyZW50LmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChwYXJlbnRQcmV2ICE9IG51bGwpIHsgLy8gbW92ZSB0byB0aGUgcHJldmlvdXMKLQkJCQkJbm9kZSA9IHBhcmVudFByZXY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlZzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5mbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsgLy8gZXJyb3IKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgPT0gdGhpcykKLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQlpbmRleCsrOwotCQl9Ci0JCXJldHVybiAtMTsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FuIGp1c3QgcmVmZXIgdG8gdGhlIG93bmluZyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBJRE9NTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLm93bmVyRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogYWxsIGJ1dCBhdHRyIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROZXh0U2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMubmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZUF0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCU5vZGUgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gdGhpczsKLQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBvZmZzZXQpIHsKLQkJCQljaGlsZCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkgPiBvZmZzZXQpCi0JCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQotCQkJLy8gZGlnIG1vcmUKLQkJCXBhcmVudCA9IGNoaWxkOwotCQkJY2hpbGQgPSAoSURPTU5vZGUpIHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPd25lckRvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFByZXZpb3VzU2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnByZXZpb3VzU2libGluZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLmZsYXROb2RlLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlOb2RlSW1wbCBwcmV2ID0gKE5vZGVJbXBsKSBnZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkKLQkJCXJldHVybiBwcmV2LmdldEVuZE9mZnNldCgpOwotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNTdGFydFRhZygpKQotCQkJCXJldHVybiBlbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCS8vIGZpbmFsIGZhbGxiYWNrIHRvIGxvb2sgaW50byBmaXJzdCBjaGlsZAotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjaGlsZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQljaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBub2RlIChpbmRpcmVjdGx5KSBrbm93cyBpdHMgc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogYWxsIGJ1dCBhdHRyIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU291cmNlKCkgewotCQlyZXR1cm4gZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGhhc0NoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGhhc1Byb3BlcnRpZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGluc2VydEJlZm9yZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFFZGl0YWJsZSgpIHsKLQkJaWYgKCFmRGF0YUVkaXRhYmxlKSB7Ci0JCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBnZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuaXNSZXBhcnNpbmcoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmRGF0YUVkaXRhYmxlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAodGhpcy5vd25lckRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCURPTUltcGxlbWVudGF0aW9uIGltcGwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLQkJaWYgKGltcGwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGltcGwuaGFzRmVhdHVyZShmZWF0dXJlLCB2ZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBsb29rdXBNZXNzYWdlKHNob3J0IHMpIHsKLQkJLy8gVE9ETzogbWFrZSBsb2NhbGl6ZWQgdmVyc2lvbgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJc3dpdGNoIChzKSB7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIgOgotCQkJCXJlc3VsdCA9ICJJTlZBTElEX0NIQVJBQ1RFUl9FUlIiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoKTsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIG5vcm1hbGl6ZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB7Ci0JCVRleHRJbXBsIHByZXZUZXh0ID0gbnVsbDsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgVEVYVF9OT0RFIDogewotCQkJCQlpZiAocHJldlRleHQgPT0gbnVsbCkgewotCQkJCQkJcHJldlRleHQgPSAoVGV4dEltcGwpIGNoaWxkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNoaWxkOwotCQkJCQlyZW1vdmVDaGlsZCh0ZXh0KTsKLQkJCQkJcHJldlRleHQuYXBwZW5kVGV4dCh0ZXh0KTsKLQkJCQkJY2hpbGQgPSBwcmV2VGV4dDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRUxFTUVOVF9OT0RFIDogewotCQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQkJCWVsZW1lbnQubm9ybWFsaXplKCk7Ci0JCQkJCXByZXZUZXh0ID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOgotCQkJCQlwcmV2VGV4dCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmVkaXRhYmxlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBub3RpZnlWYWx1ZUNoYW5nZWQgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5VmFsdWVDaGFuZ2VkKCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzeW5jRGF0YUVkaXRhYmxlU3RhdGUoKTsKLQotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGROb2RlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqIEBwYXJhbSBmaXJzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGxhc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJlbW92ZUNoaWxkTm9kZXMoTm9kZSBmaXJzdENoaWxkLCBOb2RlIGxhc3RDaGlsZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIGNoaWxkcmVuIHZhbHVlcyBmcm9tIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCWZvciAoTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWNoaWxkLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQl9Ci0JCXRoaXMuZmxhdE5vZGUgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoaWxkRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQkvLyBub3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpZiAoZkRhdGFFZGl0YWJsZSA9PSBlZGl0YWJsZSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUmVhZE9ubHlDb250cm9sbGVyIHJvYyA9IFJlYWRPbmx5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZWRpdGFibGUpIHsKLQkJCXJvYy51bmxvY2tEYXRhKHRoaXMpOwotCQl9Ci0JCWVsc2UgewotCQkJcm9jLmxvY2tEYXRhKHRoaXMpOwotCQl9Ci0KLQkJZkRhdGFFZGl0YWJsZSA9IGVkaXRhYmxlOwotCi0JCW5vdGlmeUVkaXRhYmxlQ2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAoZGVlcCkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGUuc2V0RWRpdGFibGUoZWRpdGFibGUsIGRlZXApOwotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCQlzZXRDaGlsZEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJc2V0RGF0YUVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROZXh0U2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV4dFNpYmxpbmcKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROZXh0U2libGluZyhOb2RlIG5leHRTaWJsaW5nKSB7Ci0JCXRoaXMubmV4dFNpYmxpbmcgPSAoTm9kZUltcGwpIG5leHRTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIHNldE93bmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG93bmVyRG9jdW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXRoaXMub3duZXJEb2N1bWVudCA9IChEb2N1bWVudEltcGwpIG93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50LCBib29sZWFuIGRlZXApIHsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQotCQlpZiAoZGVlcCkgewotCQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWNoaWxkLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCwgZGVlcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXRQYXJlbnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSBwYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQcmV2aW91c1NpYmxpbmcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzU2libGluZwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByZXZpb3VzU2libGluZyhOb2RlIHByZXZpb3VzU2libGluZykgewotCQl0aGlzLnByZXZpb3VzU2libGluZyA9IChOb2RlSW1wbCkgcHJldmlvdXNTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCXNldE5vZGVWYWx1ZShzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNEYXRhRWRpdGFibGVTdGF0ZSgpIHsKLQkJUmVhZE9ubHlDb250cm9sbGVyIHJvYyA9IFJlYWRPbmx5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZkRhdGFFZGl0YWJsZSkgewotCQkJcm9jLnVubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyb2MubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3RhcnQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGVuZCA9IGdldEVuZE9mZnNldCgpOwotCQkJaWYgKGVuZCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHNob3J0IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE5vZGUgb3RoZXIpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBhcmcpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVOb2RlKE5vZGUgb3RoZXIpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0Q29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBzZXRVc2VyRGF0YShTdHJpbmcga2V5LCBPYmplY3QgZGF0YSwgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXIpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUl0ZXJhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTI3OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKiBOb2RlSXRlcmF0b3JJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlSXRlcmF0b3JJbXBsIGltcGxlbWVudHMgTm9kZUl0ZXJhdG9yIHsKLQlwcml2YXRlIE5vZGVGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgbmV4dE5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBOb2RlIHJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCB3aGF0VG9TaG93ID0gTm9kZUZpbHRlci5TSE9XX0FMTDsKLQotCS8qKgotCSAqIE5vZGVJdGVyYXRvckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlSXRlcmF0b3JJbXBsKE5vZGUgcm9vdE5vZGUsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JCXRoaXMubmV4dE5vZGUgPSByb290Tm9kZTsKLQkJdGhpcy53aGF0VG9TaG93ID0gd2hhdFRvU2hvdzsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFjY2VwdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmICh0aGlzLndoYXRUb1Nob3cgIT0gTm9kZUZpbHRlci5TSE9XX0FMTCkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCXN3aXRjaCAodGhpcy53aGF0VG9TaG93KSB7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX1RFWFQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVOVElUWV9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX1RZUEUgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfTk9UQVRJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5OT1RBVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHRoaXMuZmlsdGVyLmFjY2VwdE5vZGUobm9kZSkgPT0gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRhY2hlcyB0aGUgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzZXQgd2hpY2ggaXQgaXRlcmF0ZWQKLQkgKiBvdmVyLCByZWxlYXNpbmcgYW55IGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIGFuZCBwbGFjaW5nIHRoZSBpdGVyYXRvciBpbgotCSAqIHRoZSBJTlZBTElEIHN0YXRlLiBBZnRlciA8Y29kZT5kZXRhY2g8L2NvZGU+IGhhcyBiZWVuIGludm9rZWQsIGNhbGxzCi0JICogdG8gPGNvZGU+bmV4dE5vZGU8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbCByYWlzZQotCSAqIHRoZSBleGNlcHRpb24gSU5WQUxJRF9TVEFURV9FUlIuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgewotCQl0aGlzLnJvb3ROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0JICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSBpdGVyYXRvci4gSWYgZmFsc2UsIHRoZXkgYW5kIHRoZWlyCi0JICogZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMgcmVqZWN0aW9uIHRha2VzIHByZWNlZGVuY2UKLQkgKiBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUgZmlsdGVyLiBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzCi0JICogY3VycmVudGx5IHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSA8Y29kZT5Ob2RlSXRlcmF0b3JzPC9jb2RlPiBtYXkKLQkgKiByZWplY3QgYSBjb21wbGV0ZSBzdWJ0cmVlIHJhdGhlciB0aGFuIHNraXBwaW5nIGluZGl2aWR1YWwgbm9kZXMuIDxicj4KLQkgKiA8YnI+Ci0JICogVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzIGV4cGFuZGVkCi0JICogYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIHRvIGhpZGUgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQKLQkgKiBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gdHJ1ZSB3aGVuIGNyZWF0aW5nIHRoZQotCSAqIGl0ZXJhdG9yLiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZQotCSAqIG5vZGVzIGJ1dCBubyBlbnRpdHkgZXhwYW5zaW9uLCB1c2UgdGhlIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzCi0JICogdG8gc2hvdyB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLQkgKiA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0JICovCi0JcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOb2RlIGdldE5leHROb2RlKCkgewotCQlpZiAodGhpcy5uZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMubmV4dE5vZGU7Ci0JCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCXRoaXMubmV4dE5vZGUgPSBjaGlsZDsKLQkJCXJldHVybiBvbGROZXh0OwotCQl9Ci0JCWZvciAoTm9kZSBub2RlID0gdGhpcy5uZXh0Tm9kZTsgbm9kZSAhPSBudWxsICYmIG5vZGUgIT0gdGhpcy5yb290Tm9kZTsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5uZXh0Tm9kZSA9IG5leHQ7Ci0JCQkJcmV0dXJuIG9sZE5leHQ7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXJldHVybiBvbGROZXh0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgTm9kZSBnZXRQcmV2aW91c05vZGUoKSB7Ci0JCWlmICh0aGlzLm5leHROb2RlID09IHRoaXMucm9vdE5vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBwcmV2ID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMucm9vdE5vZGU7IC8vIG5ldmVyIG51bGwKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCXRoaXMubmV4dE5vZGUgPSB0aGlzLm5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQkJCX0KLQkJfQotCQlOb2RlIGxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAobGFzdCAhPSBudWxsKSB7Ci0JCQlwcmV2ID0gbGFzdDsKLQkJCWxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCXRoaXMubmV4dE5vZGUgPSBwcmV2OwotCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+LCBhcyBzcGVjaWZpZWQgd2hlbiBpdAotCSAqIHdhcyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKLQkgKiBpdGVyYXRvci4gVGhlIGF2YWlsYWJsZSBzZXQgb2YgY29uc3RhbnRzIGlzIGRlZmluZWQgaW4gdGhlCi0JICogPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLiBOb2RlcyBub3QgYWNjZXB0ZWQgYnkKLQkgKiA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiB3aWxsIGJlIHNraXBwZWQsIGJ1dCB0aGVpciBjaGlsZHJlbiBtYXkgc3RpbGwKLQkgKiBiZSBjb25zaWRlcmVkLiBOb3RlIHRoYXQgdGhpcyBza2lwIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZmlsdGVyLCBpZgotCSAqIGFueS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdoYXRUb1Nob3coKSB7Ci0JCXJldHVybiB0aGlzLndoYXRUb1Nob3c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBzZXQgYW5kIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUKLQkgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gaXMgY3JlYXRlZCwKLQkgKiB0aGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0Tm9kZSgpPC9jb2RlPiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluCi0JICogdGhlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKE5vZGUgbm9kZSA9IGdldE5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGdldE5leHROb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gYmFja3dhcmRzIGluIHRoZSBzZXQuCi0JICogCi0JICogQHJldHVybiBUaGUgcHJldmlvdXMgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZAotCSAqICAgICAgICAgb3Zlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbgotCSAqICAgICAgICAgdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChOb2RlIG5vZGUgPSBnZXRQcmV2aW91c05vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gZ2V0UHJldmlvdXNOb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmZlZDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogTm9kZUxpc3RJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0KLQlPYmplY3QgbG9ja09iamVjdCA9IG5ldyBieXRlWzBdOwotCi0JcHJpdmF0ZSBWZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYXBwZW5kTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJdGhpcy5ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5ub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIHRoaXMubm9kZXMuc2l6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgaW5zZXJ0Tm9kZShOb2RlIG5vZGUsIGludCBpbmRleCkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpIHsKLQkJCXJldHVybiBhcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCXRoaXMubm9kZXMuaW5zZXJ0RWxlbWVudEF0KG5vZGUsIGluZGV4KTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIE5vZGUgcmVtb3ZlTm9kZShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBub2RlCi0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQotCQlOb2RlIHJlbW92ZWQgPSAoTm9kZSkgdGhpcy5ub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLm5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vdGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQ4OTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247Ci0KLS8qKgotICogTm90YXRpb25JbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbkltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5vdGF0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBOb3RhdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm90YXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGF0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBOb3RhdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgTm90YXRpb25JbXBsKE5vdGF0aW9uSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJCXRoaXMucHVibGljSWQgPSB0aGF0LnB1YmxpY0lkOwotCQkJdGhpcy5zeXN0ZW1JZCA9IHRoYXQuc3lzdGVtSWQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCU5vdGF0aW9uSW1wbCBjbG9uZWQgPSBuZXcgTm90YXRpb25JbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5PVEFUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2ZjgwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotCi0vKioKLSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0YXJnZXQgPSBudWxsOwotCi0JLyoqCi0JICogUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhcmdldCA9IHRoYXQudGFyZ2V0OwotCQkJdGhpcy5kYXRhID0gdGhhdC5nZXREYXRhKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY2xvbmVkID0gbmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCWlmICh0aGlzLmRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmRhdGE7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCi0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGRhdGFSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBjbG9zZVJlZ2lvbiA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgewotCQkJCWNsb3NlUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsKQotCQkJCQl0YXJnZXRSZWdpb24gPSByZWdpb247Ci0JCQkJZWxzZSBpZiAoZGF0YVJlZ2lvbiA9PSBudWxsKQotCQkJCQlkYXRhUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQl9Ci0JCWlmIChkYXRhUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpbnQgb2Zmc2V0ID0gZGF0YVJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChjbG9zZVJlZ2lvbiAhPSBudWxsKQotCQkJZW5kID0gY2xvc2VSZWdpb24uZ2V0U3RhcnQoKTsKLQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERhdGEoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYXJnZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCWlmICh0aGlzLnRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXRoaXMuZGF0YSA9IGdldERhdGEoKTsKLQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCX0KLQotCS8qKgotCSAqIHNldERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXREYXRhKG5vZGVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMuZGF0YSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0VGFyZ2V0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldFRhcmdldCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldERhdGEoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JhbmdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFiZTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlRXhjZXB0aW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2VJbXBsIGltcGxlbWVudHMgUmFuZ2UgewotCXByaXZhdGUgTm9kZSBlbmRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IDA7Ci0KLQlwcml2YXRlIE5vZGUgc3RhcnRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBSYW5nZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFJhbmdlSW1wbChSYW5nZUltcGwgdGhhdCkgewotCQlzdXBlcigpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRDb250YWluZXIgPSB0aGF0LnN0YXJ0Q29udGFpbmVyOwotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoYXQuc3RhcnRPZmZzZXQ7Ci0JCQl0aGlzLmVuZENvbnRhaW5lciA9IHRoYXQuZW5kQ29udGFpbmVyOwotCQkJdGhpcy5lbmRPZmZzZXQgPSB0aGF0LmVuZE9mZnNldDsKLQkJfQotCX0KLQotCS8qKgotCSAqIER1cGxpY2F0ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UKLQkgKiAKLQkgKiBAcmV0dXJuIEEgRG9jdW1lbnRGcmFnbWVudCB0aGF0IGNvbnRhaW5zIGNvbnRlbnQgZXF1aXZhbGVudCB0byB0aGlzCi0JICogICAgICAgICBSYW5nZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICB3b3VsZCBiZSBleHRyYWN0ZWQgaW50byB0aGUgbmV3IERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjbG9uZUNvbnRlbnRzKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHJvZHVjZXMgYSBuZXcgUmFuZ2Ugd2hvc2UgYm91bmRhcnktcG9pbnRzIGFyZSBlcXVhbCB0byB0aGUKLQkgKiBib3VuZGFyeS1wb2ludHMgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGR1cGxpY2F0ZWQgUmFuZ2UuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UgY2xvbmVSYW5nZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJhbmdlSW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsYXBzZSBhIFJhbmdlIG9udG8gb25lIG9mIGl0cyBib3VuZGFyeS1wb2ludHMKLQkgKiAKLQkgKiBAcGFyYW0gdG9TdGFydElmCi0JICogICAgICAgICAgICBUUlVFLCBjb2xsYXBzZXMgdGhlIFJhbmdlIG9udG8gaXRzIHN0YXJ0OyBpZiBGQUxTRSwKLQkgKiAgICAgICAgICAgIGNvbGxhcHNlcyBpdCBvbnRvIGl0cyBlbmQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb2xsYXBzZShib29sZWFuIHRvU3RhcnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodG9TdGFydCkgewotCQkJdGhpcy5lbmRDb250YWluZXIgPSB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCQkJdGhpcy5lbmRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQl9IGVsc2UgewotCQkJdGhpcy5zdGFydENvbnRhaW5lciA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoaXMuZW5kT2Zmc2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZSB0aGUgYm91bmRhcnktcG9pbnRzIG9mIHR3byBSYW5nZXMgaW4gYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaG93QQotCSAqICAgICAgICAgICAgY29kZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgY29tcGFyaXNvbiwgYXMgZGVmaW5lZCBhYm92ZS4KLQkgKiBAcGFyYW0gc291cmNlUmFuZ2VUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPlJhbmdlPC9jb2RlPiBvbiB3aGljaCB0aGlzIGN1cnJlbnQKLQkgKiAgICAgICAgICAgIDxjb2RlPlJhbmdlPC9jb2RlPiBpcyBjb21wYXJlZCB0by4KLQkgKiBAcmV0dXJuIC0xLCAwIG9yIDEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiAgICAgICAgIGJvdW5kYXJ5LXBvaW50IG9mIHRoZSBSYW5nZSBpcyByZXNwZWN0aXZlbHkgYmVmb3JlLCBlcXVhbCB0bywKLQkgKiAgICAgICAgIG9yIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGJvdW5kYXJ5LXBvaW50IG9mCi0JICogICAgICAgICA8Y29kZT5zb3VyY2VSYW5nZTwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiB0aGUgdHdvIFJhbmdlcyBhcmUgbm90IGluCi0JICogICAgICAgICAgICAgICAgdGhlIHNhbWUgRG9jdW1lbnQgb3IgRG9jdW1lbnRGcmFnbWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzaG9ydCBjb21wYXJlQm91bmRhcnlQb2ludHMoc2hvcnQgaG93LCBSYW5nZSBzb3VyY2VSYW5nZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2VSYW5nZSA9PSBudWxsKQotCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQotCQlOb2RlIGNvbnRhaW5lcjEgPSBudWxsOwotCQlpbnQgb2Zmc2V0MSA9IDA7Ci0JCU5vZGUgY29udGFpbmVyMiA9IG51bGw7Ci0JCWludCBvZmZzZXQyID0gMDsKLQotCQlzd2l0Y2ggKGhvdykgewotCQkJY2FzZSBTVEFSVF9UT19TVEFSVCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0Q29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVJUX1RPX0VORCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldEVuZENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5EX1RPX0VORCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLmVuZE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0RW5kQ29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldEVuZE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkRfVE9fU1RBUlQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLmVuZENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0Q29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gKHNob3J0KSAwOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIGNvbXBhcmVQb2ludHMoY29udGFpbmVyMSwgb2Zmc2V0MSwgY29udGFpbmVyMiwgb2Zmc2V0Mik7Ci0JfQotCi0JLyoKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgY29tcGFyZVBvaW50cyhOb2RlIGNvbnRhaW5lcjEsIGludCBvZmZzZXQxLCBOb2RlIGNvbnRhaW5lcjIsIGludCBvZmZzZXQyKSB7Ci0JCWlmIChjb250YWluZXIxID09IG51bGwgfHwgY29udGFpbmVyMiA9PSBudWxsKQotCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQotCQlpZiAoY29udGFpbmVyMSA9PSBjb250YWluZXIyKSB7Ci0JCQlpZiAob2Zmc2V0MSA+IG9mZnNldDIpCi0JCQkJcmV0dXJuIChzaG9ydCkgMTsKLQkJCWlmIChvZmZzZXQxIDwgb2Zmc2V0MikKLQkJCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLy8gZ2V0IG5vZGUgb2Zmc2V0cwotCQlJRE9NTm9kZSBub2RlMSA9IG51bGw7Ci0JCWlmIChjb250YWluZXIxLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZSBjaGlsZCA9IGNvbnRhaW5lcjEuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQxOyBpKyspIHsKLQkJCQlOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWNoaWxkID0gbmV4dDsKLQkJCX0KLQkJCW5vZGUxID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCW9mZnNldDEgPSAwOwotCQl9IGVsc2UgewotCQkJbm9kZTEgPSAoSURPTU5vZGUpIGNvbnRhaW5lcjE7Ci0JCX0KLQkJaW50IG5vZGVPZmZzZXQxID0gbm9kZTEuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSURPTU5vZGUgbm9kZTIgPSBudWxsOwotCQlpZiAoY29udGFpbmVyMi5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGUgY2hpbGQgPSBjb250YWluZXIyLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0MjsgaSsrKSB7Ci0JCQkJTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQljaGlsZCA9IG5leHQ7Ci0JCQl9Ci0JCQlub2RlMiA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCQlvZmZzZXQyID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGUyID0gKElET01Ob2RlKSBjb250YWluZXIxOwotCQl9Ci0JCWludCBub2RlT2Zmc2V0MiA9IG5vZGUyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJaWYgKG5vZGVPZmZzZXQxID4gbm9kZU9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAxOwotCQlpZiAobm9kZU9mZnNldDEgPCBub2RlT2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIC0xOwotCQlpZiAob2Zmc2V0MSA+IG9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAxOwotCQlpZiAob2Zmc2V0MSA8IG9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IKLQkgKiBkb2N1bWVudCBmcmFnbWVudCB3aXRob3V0IHJldHVybmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVtb3ZlZCBjb250ZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW55IHBvcnRpb24gb2YKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5IG9yIGFueSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBub2RlcyB0aGF0IGNvbnRhaW4gYW55IG9mIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBhcmUKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIFJhbmdlIGlzIG5vIGxvbmdlciBpbiB1c2UgYW5kIHRoYXQgdGhlCi0JICogaW1wbGVtZW50YXRpb24gbWF5IHJlbGlucXVpc2ggYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSYW5nZS4KLQkgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIGFueSBtZXRob2RzIG9yIGF0dHJpYnV0ZSBnZXR0ZXJzIG9uIHRoaXMgUmFuZ2Ugd2lsbAotCSAqIHJlc3VsdCBpbiBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gYmVpbmcgdGhyb3duIHdpdGggYW4gZXJyb3IgY29kZQotCSAqIG9mIDxjb2RlPklOVkFMSURfU1RBVEVfRVJSPC9jb2RlPi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRldGFjaCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gbnVsbDsKLQkJdGhpcy5zdGFydE9mZnNldCA9IDA7Ci0JCXRoaXMuZW5kQ29udGFpbmVyID0gbnVsbDsKLQkJdGhpcy5lbmRPZmZzZXQgPSAwOwotCX0KLQotCS8qKgotCSAqIE1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IgZG9jdW1lbnQKLQkgKiBmcmFnbWVudCB0byBhIG5ldyBEb2N1bWVudEZyYWdtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQSBEb2N1bWVudEZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCBjb250ZW50cy4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFueSBwb3J0aW9uIG9mCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seSBvciBhbnkgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgbm9kZXMgd2hpY2ggY29udGFpbiBhbnkgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGFyZQotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICB3b3VsZCBiZSBleHRyYWN0ZWQgaW50byB0aGUgbmV3IERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBleHRyYWN0Q29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUUlVFIGlmIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENvbGxhcHNlZCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5zdGFydENvbnRhaW5lciA9PSB0aGlzLmVuZENvbnRhaW5lciAmJiB0aGlzLnN0YXJ0T2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVlcGVzdCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyIG9mIHRoZSBSYW5nZSdzIHR3bwotCSAqIGJvdW5kYXJ5LXBvaW50cy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yQ29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnN0YXJ0Q29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoTm9kZUltcGwpIHRoaXMuc3RhcnRDb250YWluZXIpLmdldENvbW1vbkFuY2VzdG9yKHRoaXMuZW5kQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIHdpdGhpbiB3aGljaCB0aGUgUmFuZ2UgZW5kcwotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0RW5kQ29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmVuZENvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBPZmZzZXQgd2l0aGluIHRoZSBlbmRpbmcgbm9kZSBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5lbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogTm9kZSB3aXRoaW4gd2hpY2ggdGhlIFJhbmdlIGJlZ2lucwotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0U3RhcnRDb250YWluZXIoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuc3RhcnRDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogT2Zmc2V0IHdpdGhpbiB0aGUgc3RhcnRpbmcgbm9kZSBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLnN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgYSBub2RlIGludG8gdGhlIERvY3VtZW50IG9yIERvY3VtZW50RnJhZ21lbnQgYXQgdGhlIHN0YXJ0IG9mCi0JICogdGhlIFJhbmdlLiBJZiB0aGUgY29udGFpbmVyIGlzIGEgVGV4dCBub2RlLCB0aGlzIHdpbGwgYmUgc3BsaXQgYXQgdGhlCi0JICogc3RhcnQgb2YgdGhlIFJhbmdlIChhcyBpZiB0aGUgVGV4dCBub2RlJ3Mgc3BsaXRUZXh0IG1ldGhvZCB3YXMKLQkgKiBwZXJmb3JtZWQgYXQgdGhlIGluc2VydGlvbiBwb2ludCkgYW5kIHRoZSBpbnNlcnRpb24gd2lsbCBvY2N1ciBiZXR3ZWVuCi0JICogdGhlIHR3byByZXN1bHRpbmcgVGV4dCBub2Rlcy4gQWRqYWNlbnQgVGV4dCBub2RlcyB3aWxsIG5vdCBiZQotCSAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkLiBJZiB0aGUgbm9kZSB0byBiZSBpbnNlcnRlZCBpcyBhIERvY3VtZW50RnJhZ21lbnQKLQkgKiBub2RlLCB0aGUgY2hpbGRyZW4gd2lsbCBiZSBpbnNlcnRlZCByYXRoZXIgdGhhbiB0aGUgRG9jdW1lbnRGcmFnbWVudAotCSAqIG5vZGUgaXRzZWxmLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlVGhlCi0JICogICAgICAgICAgICBub2RlIHRvIGluc2VydCBhdCB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvcgotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld05vZGU8L2NvZGU+IGFuZAotCSAqICAgICAgICAgICAgICAgIHRoZSBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSB3ZXJlIG5vdCBjcmVhdGVkCi0JICogICAgICAgICAgICAgICAgZnJvbSB0aGUgc2FtZSBkb2N1bWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93Ci0JICogICAgICAgICAgICAgICAgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgPGNvZGU+bmV3Tm9kZTwvY29kZT4gb3IgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5uZXdOb2RlPC9jb2RlPiBpcyBhbiBhbmNlc3RvciBvZiB0aGUgY29udGFpbmVyLgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+bmV3Tm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBhbiBBdHRyLCBFbnRpdHksIE5vdGF0aW9uLCBvciBEb2N1bWVudCBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydE5vZGUoTm9kZSBuZXdOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSBub2RlIGFuZCBpdHMgY29udGVudHMKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBzZWxlY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LCBOb3RhdGlvbiBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZSBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3ROb2RlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXgpOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCB0aGUgY29udGVudHMgd2l0aGluIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlTm9kZQotCSAqICAgICAgICAgICAgdG8gc2VsZWN0IGZyb20KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24gb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3ROb2RlQ29udGVudHMoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChyZWZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSByZWZOb2RlOwotCQkJc2V0U3RhcnQocmVmTm9kZSwgMCk7Ci0JCQlzZXRFbmQocmVmTm9kZSwgdGV4dC5nZXRMZW5ndGgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gcmVmTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpbnQgbGVuZ3RoID0gKGNoaWxkTm9kZXMgIT0gbnVsbCA/IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgOiAwKTsKLQkJCXNldFN0YXJ0KHJlZk5vZGUsIDApOwotCQkJc2V0RW5kKHJlZk5vZGUsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIGVuZCBvZiBhIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZQotCSAqICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIG9mZnNldFRoZQotCSAqICAgICAgICAgICAgPGNvZGU+ZW5kT2Zmc2V0PC9jb2RlPiB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24sIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hpbGQgdW5pdHMgaW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gQ2hpbGQgdW5pdHMgYXJlIDE2LWJpdCB1bml0cyBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgdHlwZSBvZiBDaGFyYWN0ZXJEYXRhIG5vZGUKLQkgKiAgICAgICAgICAgICAgICAoZS5nLiwgYSBUZXh0IG9yIENvbW1lbnQgbm9kZSkgb3IgYQotCSAqICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLiBDaGlsZCB1bml0cyBhcmUgTm9kZXMgaW4gYWxsCi0JICogICAgICAgICAgICAgICAgb3RoZXIgY2FzZXMuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZW5kQ29udGFpbmVyID0gcmVmTm9kZTsKLQkJdGhpcy5lbmRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5kIG9mIGEgUmFuZ2UgdG8gYmUgYWZ0ZXIgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgZW5kcyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50IG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRBZnRlcihOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVuZCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIGVuZHMgYmVmb3JlIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IHZhbHVlLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCi0JICogICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gb2Zmc2V0VGhlCi0JICogICAgICAgICAgICA8Y29kZT5zdGFydE9mZnNldDwvY29kZT4gdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uLCBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkIHVuaXRzIGluCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4uIENoaWxkIHVuaXRzIGFyZSAxNi1iaXQgdW5pdHMgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIHR5cGUgb2YgQ2hhcmFjdGVyRGF0YSBub2RlCi0JICogICAgICAgICAgICAgICAgKGUuZy4sIGEgVGV4dCBvciBDb21tZW50IG5vZGUpIG9yIGEKLQkgKiAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbm9kZS4gQ2hpbGQgdW5pdHMgYXJlIE5vZGVzIGluIGFsbAotCSAqICAgICAgICAgICAgICAgIG90aGVyIGNhc2VzLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3RhcnRDb250YWluZXIgPSByZWZOb2RlOwotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGJlIGFmdGVyIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIHN0YXJ0cyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEFmdGVyKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFydCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgc3RhcnRzIGJlZm9yZSA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRTdGFydChwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBhcmVudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBSYW5nZSB0byB0aGUgZ2l2ZW4gbm9kZSBhbmQgaW5zZXJ0cyB0aGUKLQkgKiBub2RlIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdQYXJlbnRUaGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gc3Vycm91bmQgdGhlIGNvbnRlbnRzIHdpdGguCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvcgotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvZiBlaXRoZXIgYm91bmRhcnktcG9pbnQgb2YgdGhlIFJhbmdlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+IG5ld1BhcmVudDwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIHdlcmUgbm90Ci0JICogICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIGRvY3VtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgUmFuZ2UgaXMgb2YgYSB0eXBlIHRoYXQgZG9lcyBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgICAgICBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiA8Y29kZT5uZXdQYXJlbnQ8L2NvZGU+IG9yIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bmV3UGFyZW50PC9jb2RlPiBpcyBhbiBhbmNlc3RvciBvZiB0aGUgY29udGFpbmVyCi0JICogICAgICAgICAgICAgICAgb3IgaWYgPGNvZGU+bm9kZTwvY29kZT4gd291bGQgZW5kIHVwIHdpdGggYSBjaGlsZCBub2RlCi0JICogICAgICAgICAgICAgICAgb2YgYSB0eXBlIG5vdCBhbGxvd2VkIGJ5IHRoZSB0eXBlIG9mIDxjb2RlPm5vZGU8L2NvZGU+LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgQkFEX0JPVU5EQVJZUE9JTlRTX0VSUjogUmFpc2VkIGlmIHRoZSBSYW5nZSBwYXJ0aWFsbHkKLQkgKiAgICAgICAgICAgICAgICBzZWxlY3RzIGEgbm9uLXRleHQgbm9kZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPiBub2RlPC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIGFuIEF0dHIsIEVudGl0eSwgRG9jdW1lbnRUeXBlLCBOb3RhdGlvbiwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIHN1cnJvdW5kQ29udGVudHMoTm9kZSBuZXdQYXJlbnQpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlYWRPbmx5Q29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDUzYTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgUmVhZE9ubHlDb250cm9sbGVyIHsKLQotCWNsYXNzIFNwYW4gewotCQlpbnQgbGVuZ3RoOwotCQlpbnQgb2Zmc2V0OwotCi0JCVNwYW4oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlYWRPbmx5Q29udHJvbGxlciBmSW5zdGFuY2U7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIFJlYWRPbmx5Q29udHJvbGxlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgUmVhZE9ubHlDb250cm9sbGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGxvY2soSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWRvYy5tYWtlUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIHZvaWQgbG9jayhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZG9jLm1ha2VSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIHZvaWQgdW5sb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWRvYy5jbGVhclJlYWRPbmx5KG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSZWFkT25seUNvbnRyb2xsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuKElET01Ob2RlIG5vZGUpIHsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXJldHVybiBnZXREYXRhU3BhbkZvckVsZW1lbnQoKElET01FbGVtZW50KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXJldHVybiBnZXREYXRhU3BhbkZvclRleHQoKElET01UZXh0KSBub2RlKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNwYW4gZ2V0RGF0YVNwYW5Gb3JFbGVtZW50KElET01FbGVtZW50IG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCi0JCVN0cmluZyBzdGFydFR5cGU7Ci0JCVN0cmluZyBlbmRUeXBlOwotCQlpZiAobm9kZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJc3RhcnRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOOwotCQkJZW5kVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0U7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFydFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRTsKLQkJCWVuZFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0U7Ci0JCX0KLQotCQlpbnQgc3RhcnRPZmZzZXQgPSAtMTsKLQkJaW50IGVuZE9mZnNldCA9IC0xOwotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gc3RhcnRUeXBlKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSByZWdpb24uZ2V0RW5kKCk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gZW5kVHlwZSAmJiBwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQllbmRPZmZzZXQgPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCXByZXZSZWdpb24gPSByZWdpb247Ci0JCX0KLQotCQlpZiAoMCA8PSBzdGFydE9mZnNldCAmJiAwIDw9IGVuZE9mZnNldCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuRm9yVGV4dChJRE9NVGV4dCBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCQlyZXR1cm4gbmV3IFNwYW4oMCwgZG9jUmVnaW9uLmdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZyb20gcGFyZW50J3Mgc2V0Q2hpbGRFZGl0YWJsZSgpCi0JICogCi0JICogY2FzZSAxOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiLz4gPG5vZGUyPjwvcGFyZW50PgotCSAqIHgjIyMjIyMjIyMjIyMjIyMjIyMjI3ggY2FzZSAyOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiPiA8Y2hpbGQ+Ci0JICogPC9jaGlsZD4gPC9ub2RlPiA8L3BhcmVudD4geCMjIyMjIyMjIyMjIyMjIyMjIyM/ID8jIyMjIyMjeCAoPyA6Ci0JICogZWRpdGFibGUgaWYgbm9kZS5pc0VkaXRhYmxlKCkgPT0gdHJ1ZSkKLQkgKi8KLQl2b2lkIGxvY2tCb3RoKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSBmYWxzZTsKLQotCQkvLyBlbmQgbm9kZSAoZWxlbWVudCkKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQljYW5JbnNlcnQgPSBub2RlLmlzQ2hpbGRFZGl0YWJsZSgpOwotCQkJCWxvY2soZmxhdE5vZGUsIGNhbkluc2VydCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlsb2NrKGZsYXROb2RlLCBmYWxzZSwgY2FuSW5zZXJ0KTsKLQkJfQotCX0KLQotCXZvaWQgbG9ja0RhdGEoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCWxvY2sobm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBzcGFuLm9mZnNldCwgc3Bhbi5sZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2NrIGl0c2VsZiBhbmQgYWxsIGRlc2NlbmRhbnRzCi0JICovCi0Jdm9pZCBsb2NrRGVlcChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCi0JCWJvb2xlYW4gY2FuSW5zZXJ0ID0gdHJ1ZTsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCWNhbkluc2VydCA9IGZhbHNlOwotCQl9Ci0JCWxvY2sobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgb2Zmc2V0LCBsZW5ndGgsIGNhbkluc2VydCwgY2FuSW5zZXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZyb20gcGFyZW50J3Mgc2V0Q2hpbGRFZGl0YWJsZSgpCi0JICogCi0JICogY2FzZSAxOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiLz4gPG5vZGUyPjwvcGFyZW50PiB4IyMjIyMjeCB4IyN4Ci0JICogY2FzZSAyOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiPiA8Y2hpbGQ+PC9jaGlsZD4gPC9ub2RlPiA8L3BhcmVudD4KLQkgKiB4IyMjIyMjeCB4Iz8gPyMjIyMjIyN4ICg/IDogZWRpdGFibGUgaWYgbm9kZS5pc0VkaXRhYmxlKCkgPT0gdHJ1ZSkKLQkgKi8KLQl2b2lkIGxvY2tOb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghbm9kZS5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQlsb2NrQm90aChub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCWJvb2xlYW4gY2FuSW5zZXJ0ID0gZmFsc2U7Ci0KLQkJLy8gZW5kIG5vZGUgKGVsZW1lbnQpCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY2FuSW5zZXJ0ID0gbm9kZS5pc0NoaWxkRWRpdGFibGUoKTsKLQkJCQlsb2NrKGZsYXROb2RlLCBjYW5JbnNlcnQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCQlpZiAoMCA8PSBzcGFuLmxlbmd0aCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZmxhdE5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlpbnQgb2Zmc2V0LCBsZW5ndGg7Ci0JCQkJb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQlsZW5ndGggPSBzcGFuLm9mZnNldDsKLQkJCQlsb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJb2Zmc2V0ID0gb2Zmc2V0ICsgc3Bhbi5vZmZzZXQgKyBzcGFuLmxlbmd0aDsKLQkJCQlsZW5ndGggPSBmbGF0Tm9kZS5nZXRFbmQoKSAtIG9mZnNldDsKLQkJCQlsb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIGNhbkluc2VydCwgZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2NrKGZsYXROb2RlLCBmYWxzZSwgY2FuSW5zZXJ0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvY2soSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZG9jLmNsZWFyUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCXZvaWQgdW5sb2NrQm90aChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQl1bmxvY2soZmxhdE5vZGUpOwotCQl9Ci0JCS8vIGVuZCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVubG9ja0RhdGEoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCXVubG9jayhub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIHNwYW4ub2Zmc2V0LCBzcGFuLmxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVubG9ja0RlZXAoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQotCQl1bmxvY2sobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgb2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCXZvaWQgdW5sb2NrTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCS8vIGVuZCBub2RlCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCQkJaWYgKHNwYW4ubGVuZ3RoIDw9IDApIHsKLQkJCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZsYXROb2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJCWludCBvZmZzZXQsIGxlbmd0aDsKLQkJCQkJb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQkJbGVuZ3RoID0gc3Bhbi5vZmZzZXQgLSBvZmZzZXQ7Ci0JCQkJCXVubG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJb2Zmc2V0ID0gc3Bhbi5vZmZzZXQgKyBzcGFuLmxlbmd0aDsKLQkJCQkJbGVuZ3RoID0gZmxhdE5vZGUuZ2V0RW5kKCkgLSBzcGFuLm9mZnNldDsKLQkJCQkJdW5sb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU291cmNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM5YTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU291cmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBOb2RlSW1wbCBub2RlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTb3VyY2VWYWxpZGF0b3IoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJdGhpcy5ub2RlID0gKE5vZGVJbXBsKSBub2RlOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCS8vIHNldHVwIGNvbnZlcnNpb24gY29uZGl0aW9ucwotCQlib29sZWFuIGFjY2VwdFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdENsb3NlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0UXVvdGUgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRBbXBlcnNhbmQgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRFbnRpdHlSZWYgPSB0cnVlOwotCQlib29sZWFuIGFjY2VwdEpTUEVuZCA9IHRydWU7Ci0JCVN0cmluZyBlbmRUYWdOYW1lID0gbnVsbDsKLQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB0aGlzLm5vZGU7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJYWNjZXB0VGFnID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc291cmNlIGRvZXMgbm90IGluY2x1ZGUgc2luZ2xlIHF1b3RlLAotCQkJLy8gZG91YmxlIHF1b3RlIGlzIHZhbGlkCi0JCQlhY2NlcHRRdW90ZSA9IChzb3VyY2UuaW5kZXhPZignXCcnKSA8IDApOwotCQl9IGVsc2UgaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5vZGU7Ci0JCQlpZiAodGV4dC5pc0pTUENvbnRlbnQoKSkgewotCQkJCWludCBpbmRleCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiBzb3VyY2U7Ci0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCQlhY2NlcHRDbG9zZSA9IHRydWU7Ci0JCQkJYWNjZXB0UXVvdGUgPSB0cnVlOwotCQkJCWFjY2VwdEFtcGVyc2FuZCA9IHRydWU7Ci0JCQkJYWNjZXB0SlNQRW5kID0gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKHRleHQuaXNDREFUQUNvbnRlbnQoKSkgewotCQkJCWVuZFRhZ05hbWUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKS5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChlbmRUYWdOYW1lID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJCWFjY2VwdFF1b3RlID0gdHJ1ZTsKLQkJCQlhY2NlcHRBbXBlcnNhbmQgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJfQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgY29waWVkTGVuZ3RoID0gMDsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlZiA9IG51bGw7Ci0JCQljaGFyIGMgPSBzb3VyY2UuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtYXRjaEVuZFRhZyhzb3VyY2UsIGkgKyAxLCBlbmRUYWdOYW1lKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBza2lwID0gc2tpcFRhZyhzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCBKU1AgdGFnCi0JCQkJCX0KLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuTFRfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JyA6Ci0JCQkJCWlmIChhY2NlcHRDbG9zZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5HVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyYnIDoKLQkJCQkJaWYgKGFjY2VwdEFtcGVyc2FuZCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAoYWNjZXB0RW50aXR5UmVmKSB7Ci0JCQkJCQlpbnQgc2tpcCA9IHNraXBFbnRpdHlSZWYoc291cmNlLCBpICsgMSk7Ci0JCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJaSArPSBza2lwOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkFNUF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQkJaWYgKGFjY2VwdFF1b3RlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LlFVT1RfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICclJyA6Ci0JCQkJCWlmIChhY2NlcHRKU1BFbmQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKHNvdXJjZS5jaGFyQXQoaSArIDEpICE9ICc+JykKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpKys7Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkdUX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJCQl9Ci0JCQkJaWYgKGkgPiBjb3BpZWRMZW5ndGgpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKGNvcGllZExlbmd0aCwgaSkpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHJlZik7Ci0JCQkJY29waWVkTGVuZ3RoID0gaSArIDE7IC8vIHNraXAgdGhpcyBjaGFyYWN0ZXIKLQkJCX0KLQkJfQotCi0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvcGllZExlbmd0aCA8IGxlbmd0aCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhjb3BpZWRMZW5ndGgsIGxlbmd0aCkpOwotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1hdGNoRW5kVGFnKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBlbmRUYWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBsZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChzb3VyY2UuY2hhckF0KG9mZnNldCkgIT0gJy8nKQotCQkJcmV0dXJuIGZhbHNlOwotCQlvZmZzZXQrKzsKLQkJaW50IGVuZCA9IG9mZnNldCArIGVuZFRhZ05hbWUubGVuZ3RoKCk7Ci0JCWlmIChlbmQgPiBsZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBlbmRUYWdOYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHNraXBFbnRpdHlSZWYoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBzb3VyY2UubGVuZ3RoKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCi0JCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIG9mZnNldCk7Ci0JCWlmIChlbmQgPCAwIHx8IGVuZCA9PSBvZmZzZXQpCi0JCQlyZXR1cm4gLTE7Ci0JCVN0cmluZyBuYW1lID0gc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiAoZW5kICsgMSAtIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgc2tpcFRhZyhTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IHNvdXJjZS5sZW5ndGgoKSkKLQkJCXJldHVybiAtMTsKLQotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoc291cmNlLmNoYXJBdChvZmZzZXQpID09ICclJykgewotCQkJLy8gSlNQIHRhZwotCQkJaW50IGZvdW5kID0gc291cmNlLmluZGV4T2YoSlNQVGFnLlRBR19DTE9TRSwgb2Zmc2V0ICsgMSk7Ci0JCQlpZiAoZm91bmQgPCAwKQotCQkJCXJldHVybiAtMTsgLy8gaW52YWxpZCBKU1AgdGFnCi0JCQllbmQgPSBmb3VuZCArIDI7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3JtYWwgdGFnCi0JCQlpbnQgZm91bmQgPSBzb3VyY2UuaW5kZXhPZignPicsIG9mZnNldCk7Ci0JCQlpZiAoZm91bmQgPCAwKQotCQkJCXJldHVybiAtMTsgLy8gaW52YWxpZCB0YWcKLQkJCWVuZCA9IGZvdW5kICsgMTsKLQkJfQotCQlyZXR1cm4gKGVuZCAtIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRoaXMubm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0KLQkJLy8gc2V0dXAgdmFsaWRhdGlvbiBjb25kaXRpb25zCi0JCWJvb2xlYW4gYWNjZXB0VGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0Q2xvc2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRRdW90ZSA9IHRydWU7Ci0JCWJvb2xlYW4gYWNjZXB0RW50aXR5UmVmID0gdHJ1ZTsKLQkJU3RyaW5nIGVuZFRhZ05hbWUgPSBudWxsOwotCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIHRoaXMubm9kZTsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCQlhY2NlcHRUYWcgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIGlmIHRoZSBzb3VyY2UgZG9lcyBub3QgaW5jbHVkZSBzaW5nbGUgcXVvdGUsCi0JCQkvLyBkb3VibGUgcXVvdGUgaXMgdmFsaWQKLQkJCWFjY2VwdFF1b3RlID0gKHNvdXJjZS5pbmRleE9mKCdcJycpIDwgMCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubm9kZTsKLQkJCWlmICh0ZXh0LmlzSlNQQ29udGVudCgpKSB7Ci0JCQkJaW50IGluZGV4ID0gc291cmNlLmluZGV4T2YoSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQkJaWYgKGluZGV4IDwgMCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JCQkJdGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24obWVzc2FnZSwgJz4nLCBpbmRleCArIDEpOwotCQkJfSBlbHNlIGlmICh0ZXh0LmlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQllbmRUYWdOYW1lID0gdGV4dC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGVycm9yCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCQlhY2NlcHRDbG9zZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlOwotCQkJfSBlbHNlIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQl9Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQl9Ci0KLQkJY2hhciBjID0gMDsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJYyA9IHNvdXJjZS5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICc8JyA6Ci0JCQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQkJCWlmIChlbmRUYWdOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoIW1hdGNoRW5kVGFnKHNvdXJjZSwgaSArIDEsIGVuZFRhZ05hbWUpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IHNraXAgPSBza2lwVGFnKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJCWlmIChza2lwID49IDApIHsKLQkJCQkJCQkJaSArPSBza2lwOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnZhbGlkIHRhZwotCQkJCQl9Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfbHRfZm9fRVJST1JfOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JyA6Ci0JCQkJCWlmIChhY2NlcHRDbG9zZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2d0X2ZvX0VSUk9SXzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnJicgOgotCQkJCQlpZiAoYWNjZXB0RW50aXR5UmVmKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJaW50IHNraXAgPSBza2lwRW50aXR5UmVmKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCS8vIGludmFsaWQgZW50aXR5IHJlZmVyZW5jZQotCQkJCQl9Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIicgOgotCQkJCQlpZiAoYWNjZXB0UXVvdGUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9fZl9FWENfOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihtZXNzYWdlLCBjLCBpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTIzMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlciB7Ci0JU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlXcml0ZXIgdGVzdFdyaXRlciA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlcihXcml0ZXIgd3JpdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRlc3RXcml0ZXIgPSB3cml0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2hpbGROb2RlcyhOb2RlIG5vZGUpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2hlY2tOb2RlKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCWNoZWNrQ2hpbGROb2Rlcyhtb2RlbC5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOb2RlKE5vZGUgbm9kZSkgewotCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoZWNrQ2hpbGROb2Rlcyhub2RlKTsKLQkJCWNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCgoRWxlbWVudEltcGwpIG5vZGUpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IG4gPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoYyA9PSBudWxsKSB7Ci0JCQkJCXJlcG9ydEVycm9yKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGMpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKHN0YXJ0IDwgdGhpcy5vZmZzZXQpCi0JCQlyZXBvcnRFcnJvcigib3ZlcndyYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3RhcnQgPiB0aGlzLm9mZnNldCkKLQkJCXJlcG9ydEVycm9yKCJnYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0RW5kKCk7Ci0JCXRoaXMub2Zmc2V0ID0gZW5kOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHAgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChwID09IG51bGwpIHsKLQkJCQlyZXBvcnRFcnJvcigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IHMgPSBwLmdldFN0YXJ0KCk7Ci0JCQlpbnQgZSA9IHAuZ2V0RW5kKCk7Ci0JCQlpZiAocyA+IHN0YXJ0IHx8IGUgPCBlbmQpCi0JCQkJcmVwb3J0RXJyb3IoIm91dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocyA9PSBzdGFydCAmJiBlID09IGVuZCkKLQkJCQlyZXBvcnRXYXJuaW5nKCJ2YWluIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgbXNnID0gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgOiBlcnJvciA6ICIgKyBtZXNzYWdlOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZXN0V3JpdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGVzdFdyaXRlci53cml0ZShtc2cgKyBFT0wpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcnRXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZyBtc2cgPSAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlciA6IHdhcm5pbmcgOiAiICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVzdFdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRlc3RXcml0ZXIud3JpdGUobXNnICsgRU9MKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwMjIyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0KLQlwcml2YXRlIFZlY3RvciBmbGF0Tm9kZXMgPSBuZXcgVmVjdG9yKDIpOwotCi0JLyoqCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPiAwKSB7Ci0JCQkJdGhpcy5mbGF0Tm9kZXMuYWRkQWxsKGNvbnRhaW5lci5mbGF0Tm9kZXMpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5mbGF0Tm9kZXMuYWRkRWxlbWVudChmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVlcGVzdFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobGFzdCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBsYXN0LmdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWlmICh0aGlzLmZsYXROb2Rlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoMCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChzaXplIC0gMSk7Ci0JfQotCi0JLyoqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKGdldEVuZCgpIC0gZ2V0U3RhcnQoKSk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25Db250YWluZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZpcnN0LmdldFN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmlyc3QuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsYXROb2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqLwotCWludCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0VGV4dEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gKGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlpZiAoaW5kZXggPiBzaXplKQotCQkJcmV0dXJuOwotCQlpZiAoaW5kZXggPT0gc2l6ZSkgewotCQkJYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmZsYXROb2Rlcy5pbnNlcnRFbGVtZW50QXQoZmxhdE5vZGUsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxhdE5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCXRoaXMuZmxhdE5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQl0aGlzLmZsYXROb2Rlcy5yZW1vdmVFbGVtZW50QXQoaSk7Ci0JCQkJcmV0dXJuIGZsYXROb2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IGluZGV4KSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCk7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCXRoaXMuZmxhdE5vZGVzLnNldEVsZW1lbnRBdChmbGF0Tm9kZSwgaW5kZXgpOwotCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ3snKTsKLQkJaW50IGNvdW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKCJudWxsIik7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXRub2RlLCBTdHJpbmcgY2hhbmdlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCS8vIGlmIHNvbWVvbmUgImdldHMiIHRoZXNlIHRlbXAgcmVnaW9ucyBieQotCQkvLyBhY2NpZGVudCwgd2UnbGwgYWx3YXlzIHJldHVybiAiZGVsZXRlZCIuCi0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpIHsKLQkJLy8gZG8gbm90aGluZwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NjliMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24gY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoIklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWFuYWdlbWVudCBmYWlsZWQuIik7Ly8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlMzlmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0ICsgdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCWludCBnZXRPZmZzZXQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyB0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlcgotCQkvLyBiZSBjYWxsZWQiKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiAKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLmZsYXROb2RlLmdldFRleHQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCWludCBlbmQgPSB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcodGhpcy5vZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCS8vIEknbGwgYXNzdW1lIG5ldmVyIHJlYWxseSBuZWVkZWQgaGVyZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gaGFzRW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaGFkIHRvIG1ha2UgcHVibGljLCBkdWUgdG8gQVBJIHRyYW5zaXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgKz0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLm9mZnNldCAtPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQlidWZmZXIuYXBwZW5kKGdldEVuZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRoaXMuZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjgwMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnZlbmllbnQgZnVuY3Rpb25zIHRvIGhhbmRsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZAotICogSVRleHRSZWdpb24uCi0gKi8KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwgewotCi0JLyoqCi0JICogRXh0cmFjdHMgY29udGVudHMgZW5jbG9zZWQgd2l0aCBxdW90ZXMuIFF1b3RlcyBtYXkgYmUgZG91YmxlIG9yIHNpbmdsZS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEF0dHJWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWNoYXIgZmlyc3RDaGFyID0gdmFsdWUuY2hhckF0KDApOwotCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJaWYgKGxlbmd0aCA9PSAxKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHZhbHVlLmNoYXJBdChsZW5ndGggLSAxKSA9PSBmaXJzdENoYXIpCi0JCQkJbGVuZ3RoLS07Ci0JCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBuYW1lIHdpdGhvdXQgaGVhZGluZyAnJicgYW5kIHRhaWxpbmcgJzsnLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0RW50aXR5UmVmTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZWYgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWludCBsZW5ndGggPSByZWYubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiByZWY7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAocmVmLmNoYXJBdCgwKSA9PSAnJicpCi0JCQlvZmZzZXQgPSAxOwotCQlpZiAocmVmLmNoYXJBdChsZW5ndGggLSAxKSA9PSAnOycpCi0JCQlsZW5ndGgtLTsKLQkJaWYgKG9mZnNldCA+PSBsZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZi5zdWJzdHJpbmcob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZWdpb25zLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRGaXJzdFJlZ2lvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCXJldHVybiByZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRMYXN0UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQlyZXR1cm4gcmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZSkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0Jc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDhmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc0VuZFRhZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU2MDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUZXh0SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgVGV4dEltcGwgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhSW1wbCBpbXBsZW1lbnRzIElET01UZXh0IHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2xhc3MgU3RyaW5nUGFpciB7Ci0JCXByaXZhdGUgU3RyaW5nIGZGaXJzdCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZTZWNvbmQgPSBudWxsOwotCi0JCVN0cmluZ1BhaXIoU3RyaW5nIGZpcnN0LCBTdHJpbmcgc2Vjb25kKSB7Ci0JCQl0aGlzLmZGaXJzdCA9IGZpcnN0OwotCQkJdGhpcy5mU2Vjb25kID0gc2Vjb25kOwotCQl9Ci0KLQkJU3RyaW5nIGdldEZpcnN0KCkgewotCQkJcmV0dXJuIHRoaXMuZkZpcnN0OwotCQl9Ci0KLQkJU3RyaW5nIGdldFNlY29uZCgpIHsKLQkJCXJldHVybiB0aGlzLmZTZWNvbmQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmU291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRleHRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFRleHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRleHRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIFRleHRJbXBsCi0JICovCi0JcHJvdGVjdGVkIFRleHRJbXBsKFRleHRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5mU291cmNlID0gdGhhdC5nZXRTb3VyY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBuZXdTb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKG5ld1NvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlICsgbmV3U291cmNlKTsKLQkJZWxzZQotCQkJc2V0VGV4dFNvdXJjZShuZXdTb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZFRleHQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUZXh0KFRleHQgbmV3VGV4dCkgewotCQlpZiAobmV3VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV3VGV4dDsKLQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCAmJiBuZXdTb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlzZXRUZXh0U291cmNlKHNvdXJjZSArIG5ld1NvdXJjZSk7Ci0JCWVsc2UKLQkJCXNldFRleHRTb3VyY2UobmV3U291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVRleHRJbXBsIGNsb25lZCA9IG5ldyBUZXh0SW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBkZWxldGVEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGNvdW50IDwgMCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgY291bnQpOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJc291cmNlID0gZmlyc3Q7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpIHsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlzb3VyY2UgKz0gc2Vjb25kOwotCQkJZWxzZQotCQkJCXNvdXJjZSA9IHNlY29uZDsKLQkJfQotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7IC8vIGRlbGV0ZSBhbGwKLQkJc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXREYXRhKHRoaXMuZlNvdXJjZSk7Ci0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIGRhdGE7Ci0JCXJldHVybiBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGxlbmd0aCA9IGNvbnRhaW5lci5nZXRMZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPCAxNikKLQkJCQlsZW5ndGggPSAxNjsgLy8gZGVmYXVsdAotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoY29udGVudCk7Ci0JCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEVudGl0eVJlZk5hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBkb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZGF0YSBmb3IgdGhlIHNvdXJjZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChlbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIGVuZCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCQkJaWYgKHJlZiA+IG9mZnNldCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIHJlZikpOwotCQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQkJb2Zmc2V0ID0gZW5kICsgMTsKLQkJCQkJcmVmID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiN0ZXh0IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFRFWFRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuZlNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZlNvdXJjZTsKLQkJU3RyaW5nIGRhdGEgPSBzdXBlci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoZGF0YSk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2UgZm9yIHRoZSBkYXRhCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBtb2RlbC5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCXJldHVybiBnZW5lcmF0b3IuZ2VuZXJhdGVUZXh0RGF0YSh0aGlzLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZlNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGluc2VydERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydERhdGEoaW50IG9mZnNldCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlzZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgMCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIGFyZy5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJc291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJU3RyaW5nIHNlY29uZCA9IHBhaXIuZ2V0U2Vjb25kKCk7Ci0JCWlmIChzZWNvbmQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc2Vjb25kKTsKLQkJc2V0VGV4dFNvdXJjZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJaWYgKGZsYXROb2RlID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICogaW5zZXJ0VGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFRleHQoVGV4dCBuZXdUZXh0LCBpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1RleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV3VGV4dDsKLQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCAmJiBuZXdTb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgMCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIG5ld1NvdXJjZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJYnVmZmVyLmFwcGVuZChuZXdTb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NEQVRBQ29udGVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NEQVRBQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnZhbGlkKCkgewotCQlyZXR1cm4gaXNJbnZhbGlkKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGlzSW52YWxpZChjb250ZW50KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJcmV0dXJuIGlzSW52YWxpZChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCX0KLQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCAmJiBpc05vdE5lc3RlZENvbnRlbnQocmVnaW9uVHlwZSkgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFICYmIHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdE5lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRleHQgbm9kZSBjb250YWlucyA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLXhtbC1pbmZvc2V0LTIwMDQwMjA0I2luZm9pdGVtLmNoYXJhY3Rlcic+Ci0JICogZWxlbWVudCBjb250ZW50IHdoaXRlc3BhY2U8L2E+LCBvZnRlbiBhYnVzaXZlbHkgY2FsbGVkICJpZ25vcmFibGUKLQkgKiB3aGl0ZXNwYWNlIi4gVGhlIHRleHQgbm9kZSBpcyBkZXRlcm1pbmVkIHRvIGNvbnRhaW4gd2hpdGVzcGFjZSBpbgotCSAqIGVsZW1lbnQgY29udGVudCBkdXJpbmcgdGhlIGxvYWQgb2YgdGhlIGRvY3VtZW50IG9yIGlmIHZhbGlkYXRpb24gb2NjdXJzCi0JICogd2hpbGUgdXNpbmcgPGNvZGU+RG9jdW1lbnQubm9ybWFsaXplRG9jdW1lbnQoKTwvY29kZT4uCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gaXNXaGl0ZXNwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGRhdGEuY2hhckF0KGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCS8vIHJlbW92ZWQgd2l0aCBwcm94eQotCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpID09IDEpIHsKLQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkvLyByZW1vdmVkIHdpdGggcHJveHkKLQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPT0gMSkgewotCQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oMCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICogcmVwbGFjZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgYXJnLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCS8vIHByb3h5IG11c3Qgbm90IGJlIG5lc3RlZAotCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCX0KLQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCQkvLyBwcm94eSBtdXN0IG5vdCBiZSBuZXN0ZWQKLQkJCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCkKLQkJCXRoaXMuZlNvdXJjZSA9IHNvdXJjZTsKLQkJc3VwZXIucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBudWxsOwotCQlzdXBlci5zZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGhpcyk7Ci0JCWlmICh2YWxpZGF0b3IudmFsaWRhdGVTb3VyY2Uoc291cmNlKSkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5mU291cmNlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBzb3VyY2U7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKHRoaXMpOwotCQlzZXRUZXh0U291cmNlKHZhbGlkYXRvci5jb252ZXJ0U291cmNlKHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIHNwbGl0VGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0JCQlpbnQgY291bnQgPSBsZW5ndGggLSBvZmZzZXQ7Ci0JCQlzb3VyY2UgPSBzdWJzdHJpbmdTb3VyY2Uob2Zmc2V0LCBjb3VudCk7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQl9Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQl0ZXh0LnNldFRleHRTb3VyY2Uoc291cmNlKTsKLQotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0LCBnZXROZXh0U2libGluZygpKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlUZXh0IHNwbGl0VGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwgfHwgIShmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGluZGV4ID49IGNvdW50KSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBjYXNlIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBuZXcKLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCS8vIHNlYXJjaCBnYXAgYnkgb2Zmc2V0Ci0JCQlpbnQgb2Zmc2V0ID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpID49IG9mZnNldCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaW5kZXggPj0gY291bnQpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQkJaWYgKGluZGV4ID09IDApCi0JCQlyZXR1cm4gdGhpczsgLy8gbm90aGluZyB0byBkbwotCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCVRleHRJbXBsIG5leHRUZXh0ID0gKFRleHRJbXBsKSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJaWYgKG5leHRUZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlmb3IgKDsgaW5kZXggPCBjb3VudDsgY291bnQtLSkgewotCQkJbmV4dFRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpKTsKLQkJfQotCi0JCS8vIG5vcm1hbGl6ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCWlmIChpbmRleCA9PSAxKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCX0KLQotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5leHRUZXh0LCBnZXROZXh0U2libGluZygpKTsKLQkJcmV0dXJuIG5leHRUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHJ1bnMgZGF0YSBmb3IgdGhlIHJhbmdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RyaW5nRGF0YShTdHJpbmcgZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCQlpZiAoZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5OiBvZmZzZXQ6IGRhdGEgb2Zmc2V0IGNvdW50OgotCSAqIGRhdGEgY291bnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdTb3VyY2UoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKHRoaXMuZlNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHN1YnN0cmluZ1NvdXJjZSh0aGlzLmZTb3VyY2UsIG9mZnNldCwgY291bnQpOwotCi0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkYXRhID0gc3Vic3RyaW5nRGF0YShkYXRhLCBvZmZzZXQsIGNvdW50KTsKLQkJCWlmIChkYXRhID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoZGF0YSk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCi0JCXJldHVybiBzdWJzdHJpbmdTb3VyY2UoZ2V0U291cmNlKCksIG9mZnNldCwgY291bnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5OiBvZmZzZXQ6IGRhdGEgb2Zmc2V0IGNvdW50OgotCSAqIGRhdGEgY291bnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdTb3VyY2UoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCi0JCS8vIGZpbmQgY2hhcmFjdGVyIHJlZmVyZW5jZQotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpZiAocmVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWludCByZWZFbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKHJlZkVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgcmVmRW5kKTsKLQkJCQlpZiAoZ2V0Q2hhclZhbHVlKG5hbWUpICE9IG51bGwpIHsKLQkJCQkJLy8gZm91bmQsIHNoaWZ0IGZvciBzb3VyY2Ugb2Zmc2V0cwotCQkJCQlpbnQgcmVmQ291bnQgPSByZWZFbmQgLSByZWY7Ci0JCQkJCWlmIChyZWYgPCBvZmZzZXQpCi0JCQkJCQlvZmZzZXQgKz0gcmVmQ291bnQ7Ci0JCQkJCWlmIChyZWYgPCBlbmQpCi0JCQkJCQllbmQgKz0gcmVmQ291bnQ7Ci0JCQkJCXJlZiA9IHJlZkVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA+IGxlbmd0aCB8fCBlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YQotCSAqIG9mZnNldCBjb3VudDogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nUGFpciBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPT0gMCAmJiBjb3VudCA9PSAwKQotCQkJCXJldHVybiBuZXcgU3RyaW5nUGFpcihudWxsLCBudWxsKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCi0JCS8vIGZpbmQgY2hhcmFjdGVyIHJlZmVyZW5jZQotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpZiAocmVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWludCByZWZFbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKHJlZkVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgcmVmRW5kKTsKLQkJCQlpZiAoZ2V0Q2hhclZhbHVlKG5hbWUpICE9IG51bGwpIHsKLQkJCQkJLy8gZm91bmQsIHNoaWZ0IGZvciBzb3VyY2Ugb2Zmc2V0cwotCQkJCQlpbnQgcmVmQ291bnQgPSByZWZFbmQgLSByZWY7Ci0JCQkJCWlmIChyZWYgPCBvZmZzZXQpCi0JCQkJCQlvZmZzZXQgKz0gcmVmQ291bnQ7Ci0JCQkJCWlmIChyZWYgPCBlbmQpCi0JCQkJCQllbmQgKz0gcmVmQ291bnQ7Ci0JCQkJCXJlZiA9IHJlZkVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA+IGxlbmd0aCB8fCBlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGZpcnN0ID0gKG9mZnNldCA+IDAgPyBzb3VyY2Uuc3Vic3RyaW5nKDAsIG9mZnNldCkgOiBudWxsKTsKLQkJU3RyaW5nIHNlY29uZCA9IChlbmQgPCBsZW5ndGggPyBzb3VyY2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSA6IG51bGwpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1BhaXIoZmlyc3QsIHNlY29uZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaG9sZVRleHQoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IEltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgICAvKioKLQkgKiBSZXBsYWNlcyB0aGUgdGV4dCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgbG9naWNhbGx5LWFkamFjZW50IHRleHQKLQkgKiBub2RlcyB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4gQWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0IG5vZGVzIGFyZQotCSAqIHJlbW92ZWQgaW5jbHVkaW5nIHRoZSBjdXJyZW50IG5vZGUgdW5sZXNzIGl0IHdhcyB0aGUgcmVjaXBpZW50IG9mIHRoZQotCSAqIHJlcGxhY2VtZW50IHRleHQuIDxicj4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBub2RlIHdoaWNoIHJlY2VpdmVkIHRoZSByZXBsYWNlbWVudCB0ZXh0LiBUaGUKLQkgKiByZXR1cm5lZCBub2RlIGlzOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+bnVsbDwvY29kZT4sIHdoZW4gdGhlIHJlcGxhY2VtZW50IHRleHQgaXMgdGhlIGVtcHR5Ci0JICogc3RyaW5nOyA8L2xpPgotCSAqIDxsaT50aGUgY3VycmVudCBub2RlLCBleGNlcHQgd2hlbiB0aGUgY3VycmVudCBub2RlIGlzIHJlYWQtb25seTsgPC9saT4KLQkgKiA8bGk+IGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgb2YgdGhlIHNhbWUgdHlwZSAoCi0JICogPGNvZGU+VGV4dDwvY29kZT4gb3IgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPikgYXMgdGhlIGN1cnJlbnQKLQkgKiBub2RlIGluc2VydGVkIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwbGFjZW1lbnQuIDwvbGk+Ci0JICogPC91bD4KLQkgKiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIHdpdGggInlvIiBpbiBhcmd1bWVudCByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6IDxicj4KLQkgKiBXaGVyZSB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZCBhcmUgcmVhZC1vbmx5IGRlc2NlbmRhbnRzIG9mIGFuCi0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiwgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4KLQkgKiBtdXN0IGJlIHJlbW92ZWQgaW5zdGVhZCBvZiB0aGUgcmVhZC1vbmx5IG5vZGVzLiBJZiBhbnkKLQkgKiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IHRvIGJlIHJlbW92ZWQgaGFzIGRlc2NlbmRhbnRzIHRoYXQgYXJlCi0JICogbm90IDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIDxjb2RlPlRleHQ8L2NvZGU+LCBvcgotCSAqIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gbm9kZXMsIHRoZSA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPgotCSAqIG1ldGhvZCBtdXN0IGZhaWwgYmVmb3JlIHBlcmZvcm1pbmcgYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgZG9jdW1lbnQsCi0JICogcmFpc2luZyBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgY29kZQotCSAqIDxjb2RlPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjwvY29kZT4uIDxicj4KLQkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBleGFtcGxlIGJlbG93IGNhbGxpbmcKLQkgKiA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0Ci0JICogY29udGFpbnMgImJhciIgZmFpbHMsIGJlY2F1c2UgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gbm9kZQotCSAqICJlbnQiIGNvbnRhaW5zIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IG5vZGUgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50IG9mIHRoZSByZXBsYWNpbmcgPGNvZGU+VGV4dDwvY29kZT4gbm9kZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICBjb250ZW50LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgb25lIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzIGJlaW5nIHJlcGxhY2VkIGlzIHJlYWRvbmx5LgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLSAgICBwdWJsaWMgVGV4dCByZXBsYWNlV2hvbGVUZXh0KFN0cmluZyBjb250ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTEdlbmVyYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTcwOGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTENoYXJFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKiogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxHZW5lcmF0b3JJbXBsIGltcGxlbWVudHMgSVNvdXJjZUdlbmVyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0NMT1NFID0gIl1dPiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9PUEVOID0gIjwhW0NEQVRBWyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0NMT1NFID0gIi0tPiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX09QRU4gPSAiPCEtLSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX09QRU4gPSAiPCFET0NUWVBFIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0NMT1NFID0gIiAvPiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfT1BFTiA9ICI8LyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MR2VuZXJhdG9ySW1wbCBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0NMT1NFID0gIj8+IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX09QRU4gPSAiPD8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0lEID0gIlBVQkxJQyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJFRklYID0gInNzaSI7Ly8kTk9OLU5MUy0xJAotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GRUFUVVJFID0gIlNTSSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfVE9LRU4gPSAiIyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSAiU1lTVEVNIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTE9TRSA9ICI+IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJU291cmNlR2VuZXJhdG9yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFhNTEdlbmVyYXRvckltcGwoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqLwotCS8vcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudFRhZyhYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkvLwlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8JRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCllbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkvLwlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IGRvY3VtZW50LmdldERvY3VtZW50VHlwZUFkYXB0ZXIoKTsKLQkvLwlpZiAoYWRhcHRlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8JaWYgKCFhZGFwdGVyLmhhc0ZlYXR1cmUoU1NJX0ZFQVRVUkUpKSByZXR1cm4gZmFsc2U7Ci0JLy8JU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JLy8JcmV0dXJuIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKFNTSV9QUkVGSVgpKTsKLQkvL30KLQkvKioKLQkgKiBIZWxwZXIgdG8gbW9kaWZ5IHRoZSB0YWcgbmFtZSBpbiBzdWItY2xhc3NlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0VGFnTmFtZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgdGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIFhNTE1vZGVsR2VuZXJhdG9yIGNvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBYTUxHZW5lcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyTmFtZShBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKGF0dHJOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGF0dHJOYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkgewotCQkJaWYgKCFhdHRyTmFtZS5lbmRzV2l0aChKU1BUYWcuVEFHX0NMT1NFKSkgewotCQkJCS8vIGNsb3NlIEpTUAotCQkJCXJldHVybiAoYXR0ck5hbWUgKyBKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCX0KLQkJfQotCQlpZiAoKChJRE9NQXR0cikgYXR0cikuaXNHbG9iYWxBdHRyKCkgJiYgQ01Ob2RlVXRpbC5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKSAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKGdldEF0dHJOYW1lQ2FzZShhdHRyKSkgewotCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFIDoKLQkJCQkJYXR0ck5hbWUgPSBhdHRyTmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRSA6Ci0JCQkJCWF0dHJOYW1lID0gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCS8vIEFTSVNfQ0FTRQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0ck5hbWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShBdHRyIGF0dHIpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQXR0clZhbHVlKGF0dHIsIChjaGFyKSAwKTsgLy8gbm8gcXVvdGUgcHJlZmVyZW5jZQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyLCBjaGFyIHF1b3RlKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IoYXR0cik7Ci0JCVN0cmluZyB2YWx1ZSA9IHZhbGlkYXRvci5jb252ZXJ0U291cmNlKCgoSURPTU5vZGUpIGF0dHIpLmdldFZhbHVlU291cmNlKCkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuc3RhcnRzV2l0aChKU1BUYWcuVEFHX09QRU4pKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGlzQm9vbGVhbkF0dHIoYXR0cikpIHsKLQkJCQlpZiAoKChBdHRySW1wbCkgYXR0cikuaXNYTUxBdHRyKCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgdGhlIG5hbWUgYXMgdmFsdWUKLQkJCQkJdmFsdWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBub3QgdG8gZ2VuZXJhdGUgJz0nIGFuZCB2YWx1ZSBmb3IgSFRNTCBib29sZWFuCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2VuZXJhdGVBdHRyVmFsdWUodmFsdWUsIHF1b3RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKFN0cmluZyB2YWx1ZSwgY2hhciBxdW90ZSkgewotCQkvLyBhc3N1bWUgdGhlIHZhbGlkIGlzIGFscmVhZHkgdmFsaWRhdGVkIG5vdCB0byBpbmNsdWRlIGJvdGggcXVvdGVzCi0JCWlmIChxdW90ZSA9PSAnIicpIHsKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJyInKSA+PSAwKSkKLQkJCQlxdW90ZSA9ICdcJyc7IC8vIGZvcmNlCi0JCX0gZWxzZSBpZiAocXVvdGUgPT0gJ1wnJykgewotCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAodmFsdWUuaW5kZXhPZignXCcnKSA+PSAwKSkKLQkJCQlxdW90ZSA9ICciJzsgLy8gZm9yY2UKLQkJfSBlbHNlIHsgLy8gbm8gcHJlZmVyZW5jZQotCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAodmFsdWUuaW5kZXhPZignIicpIDwgMCkpCi0JCQkJcXVvdGUgPSAnIic7Ci0JCQllbHNlCi0JCQkJcXVvdGUgPSAnXCcnOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9ICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmxlbmd0aCgpKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgMik7Ci0JCWJ1ZmZlci5hcHBlbmQocXVvdGUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQlidWZmZXIuYXBwZW5kKHF1b3RlKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlQ0RBVEFTZWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQ0RBVEFTZWN0aW9uKENEQVRBU2VjdGlvbiBjZGF0YSkgewotCQlpZiAoY2RhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBkYXRhID0gY2RhdGEuZ2V0RGF0YSgpOwotCQlpbnQgbGVuZ3RoID0gKGRhdGEgIT0gbnVsbCA/IGRhdGEubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgMTYpOwotCQlidWZmZXIuYXBwZW5kKENEQVRBX09QRU4pOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJYnVmZmVyLmFwcGVuZChDREFUQV9DTE9TRSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNoaWxkKE5vZGUgcGFyZW50Tm9kZSkgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghcGFyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlTdHJpbmcgY2hpbGRTb3VyY2UgPSBnZW5lcmF0ZVNvdXJjZShjaGlsZCk7Ci0JCQlpZiAoY2hpbGRTb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKGNoaWxkU291cmNlKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNsb3NlVGFnKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCQkJcmV0dXJuIEpTUFRhZy5DT01NRU5UX0NMT1NFOwotCQkJCQlyZXR1cm4gQ09NTUVOVF9DTE9TRTsKLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJcmV0dXJuIEpTUFRhZy5UQUdfQ0xPU0U7Ci0JCQkJaWYgKGVsZW1lbnQuaXNFbXB0eVRhZygpKQotCQkJCQlyZXR1cm4gRU1QVFlfQ0xPU0U7Ci0JCQkJcmV0dXJuIFRBR19DTE9TRTsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJQ29tbWVudEltcGwgY29tbWVudCA9IChDb21tZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoY29tbWVudC5pc0pTUFRhZygpKQotCQkJCQlyZXR1cm4gSlNQVGFnLkNPTU1FTlRfQ0xPU0U7Ci0JCQkJcmV0dXJuIENPTU1FTlRfQ0xPU0U7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQlyZXR1cm4gVEFHX0NMT1NFOwotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIFBJX0NMT1NFOwotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIENEQVRBX0NMT1NFOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNvbW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkNvbW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQ29tbWVudChDb21tZW50IGNvbW1lbnQpIHsKLQkJaWYgKGNvbW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBkYXRhID0gY29tbWVudC5nZXREYXRhKCk7Ci0JCWludCBsZW5ndGggPSAoZGF0YSAhPSBudWxsID8gZGF0YS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJQ29tbWVudEltcGwgaW1wbCA9IChDb21tZW50SW1wbCkgY29tbWVudDsKLQkJaWYgKCFpbXBsLmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfT1BFTik7Ci0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLkNPTU1FTlRfT1BFTik7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQlpZiAoIWltcGwuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUVOVF9DTE9TRSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLkNPTU1FTlRfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVEb2N0eXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkb2NUeXBlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRG9jdHlwZShEb2N1bWVudFR5cGUgZG9jVHlwZSkgewotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBkb2NUeXBlLmdldE5hbWUoKTsKLQkJaW50IGxlbmd0aCA9IChuYW1lICE9IG51bGwgPyBuYW1lLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDE2KTsKLQkJYnVmZmVyLmFwcGVuZChET0NUWVBFX09QRU4pOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQlEb2N1bWVudFR5cGVJbXBsIGR0ID0gKERvY3VtZW50VHlwZUltcGwpIGRvY1R5cGU7Ci0JCVN0cmluZyBwdWJsaWNJRCA9IGR0LmdldFB1YmxpY0lkKCk7Ci0JCVN0cmluZyBzeXN0ZW1JRCA9IGR0LmdldFN5c3RlbUlkKCk7Ci0JCWlmIChwdWJsaWNJRCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlidWZmZXIuYXBwZW5kKFBVQkxJQ19JRCk7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHB1YmxpY0lEKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCWlmIChzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCQlidWZmZXIuYXBwZW5kKHN5c3RlbUlEKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKFNZU1RFTV9JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCQlidWZmZXIuYXBwZW5kKHN5c3RlbUlEKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQl9Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnPicpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpZiBlbXB0eSB0YWcgaXMgcHJlZmVycmFibGUsIGdlbmVyYXRlIGFzIGVtcHR5IHRhZwotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoaW1wbC5wcmVmZXJFbXB0eVRhZygpKQotCQkJaW1wbC5zZXRFbXB0eVRhZyh0cnVlKTsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgc3RhcnRUYWcgPSBnZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRUYWcpOwotCQlTdHJpbmcgY2hpbGQgPSBnZW5lcmF0ZUNoaWxkKGVsZW1lbnQpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2hpbGQpOwotCQlTdHJpbmcgZW5kVGFnID0gZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChlbmRUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZW5kVGFnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0KLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGFnIGFkYXB0ZXIgZXhpc3RzCi0JCVRhZ0FkYXB0ZXIgYWRhcHRlciA9IChUYWdBZGFwdGVyKSBpbXBsLmdldEV4aXN0aW5nQWRhcHRlcihUYWdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGVuZFRhZyA9IGFkYXB0ZXIuZ2V0RW5kVGFnKGltcGwpOwotCQkJaWYgKGVuZFRhZyAhPSBudWxsKQotCQkJCXJldHVybiBlbmRUYWc7Ci0JCX0KLQotCQlpZiAoaW1wbC5pc0VtcHR5VGFnKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpbXBsLmlzQ29udGFpbmVyKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGltcGwuaXNKU1BUYWcoKSkKLQkJCXJldHVybiBKU1BUYWcuVEFHX0NMT1NFOwotCi0JCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQlpbnQgbGVuZ3RoID0gKHRhZ05hbWUgIT0gbnVsbCA/IHRhZ05hbWUubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgNCk7Ci0JCWJ1ZmZlci5hcHBlbmQoRU5EX09QRU4pOwotCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJYnVmZmVyLmFwcGVuZCgnPicpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVFbnRpdHlSZWYgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVudGl0eVJlZgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUVudGl0eVJlZihFbnRpdHlSZWZlcmVuY2UgZW50aXR5UmVmKSB7Ci0JCWlmIChlbnRpdHlSZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBuYW1lID0gZW50aXR5UmVmLmdldE5vZGVOYW1lKCk7Ci0JCWludCBsZW5ndGggPSAobmFtZSAhPSBudWxsID8gbmFtZS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJYnVmZmVyLmFwcGVuZCgnJicpOwotCQlpZiAobmFtZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJYnVmZmVyLmFwcGVuZCgnOycpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVQSSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGkKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVQSShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpIHsKLQkJaWYgKHBpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdGFyZ2V0ID0gcGkuZ2V0VGFyZ2V0KCk7Ci0JCVN0cmluZyBkYXRhID0gcGkuZ2V0RGF0YSgpOwotCQlpbnQgbGVuZ3RoID0gKHRhcmdldCAhPSBudWxsID8gdGFyZ2V0Lmxlbmd0aCgpIDogMCk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlsZW5ndGggKz0gZGF0YS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCWJ1ZmZlci5hcHBlbmQoUElfT1BFTik7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodGFyZ2V0KTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJYnVmZmVyLmFwcGVuZChQSV9DTE9TRSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVNvdXJjZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoTm9kZSBub2RlKSB7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVFbGVtZW50KChFbGVtZW50KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZVRleHQoKFRleHQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlQ29tbWVudCgoQ29tbWVudCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVEb2N0eXBlKChEb2N1bWVudFR5cGUpIG5vZGUpOwotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUEkoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSk7Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbikgbm9kZSk7Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVFbnRpdHlSZWYoKEVudGl0eVJlZmVyZW5jZSkgbm9kZSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBET0NVTUVOVAotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBnZW5lcmF0ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCi0JCWlmIChpbXBsLmlzSlNQVGFnKCkpIHsKLQkJCS8vIGNoZWNrIGlmIEpTUCBjb250ZW50IHR5cGUgYW5kIEpTUCBEb2N1bWVudAotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkgewotCQkJCWlmIChkb2N1bWVudC5pc0pTUERvY3VtZW50KCkgJiYgIWltcGwuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWltcGwuc2V0SlNQVGFnKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWltcGwuc2V0SlNQVGFnKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlpZiAoaW1wbC5pc0NvbW1lbnRUYWcoKSAmJiBpbXBsLmdldEV4aXN0aW5nQWRhcHRlcihUYWdBZGFwdGVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQlDb21tZW50RWxlbWVudFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQkJcmVnaXN0cnkuc2V0dXBDb21tZW50RWxlbWVudChpbXBsKTsKLQkJfQotCi0JCS8vIGZpcnN0IGNoZWNrIGlmIHRhZyBhZGFwdGVyIGV4aXN0cwotCQlUYWdBZGFwdGVyIGFkYXB0ZXIgPSAoVGFnQWRhcHRlcikgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBzdGFydFRhZyA9IGFkYXB0ZXIuZ2V0U3RhcnRUYWcoaW1wbCk7Ci0JCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc3RhcnRUYWc7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChpbXBsLmlzQ29tbWVudFRhZygpKSB7Ci0JCQlpZiAoaW1wbC5pc0pTUFRhZygpKQotCQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLkNPTU1FTlRfT1BFTik7Ci0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChDT01NRU5UX09QRU4pOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0gZWxzZSBpZiAoaW1wbC5pc0pTUFRhZygpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5UQUdfT1BFTik7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJCWlmIChpbXBsLmlzQ29udGFpbmVyKCkpCi0JCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOyAvLyBKU1AgY29udGFpbmVyCi0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKCc8Jyk7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gZ2VuZXJhdGVBdHRyTmFtZShhdHRyKTsKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0ck5hbWUpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJLy8gYXR0ciBuYW1lIG9ubHkgZm9yIEhUTUwgYm9vbGVhbiBhbmQgSlNQCi0JCQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBjbG9zZVRhZyA9IGdlbmVyYXRlQ2xvc2VUYWcoZWxlbWVudCk7Ci0JCWlmIChjbG9zZVRhZyAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChjbG9zZVRhZyk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVUYWdOYW1lKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlET01FbGVtZW50IHhlID0gKElET01FbGVtZW50KSBlbGVtZW50OwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh4ZS5pc0pTUFRhZygpKSB7Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9FWFBSRVNTSU9OKSkKLQkJCQlyZXR1cm4gSlNQVGFnLkVYUFJFU1NJT05fVE9LRU47Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9ERUNMQVJBVElPTikpCi0JCQkJcmV0dXJuIEpTUFRhZy5ERUNMQVJBVElPTl9UT0tFTjsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX0RJUkVDVElWRSkpCi0JCQkJcmV0dXJuIEpTUFRhZy5ESVJFQ1RJVkVfVE9LRU47Ci0JCQlpZiAodGFnTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5KU1BfRElSRUNUSVZFKSkgewotCQkJCWludCBvZmZzZXQgPSBKU1BUYWcuSlNQX0RJUkVDVElWRS5sZW5ndGgoKSArIDE7IC8vIGFmdGVyICcuJwotCQkJCXJldHVybiAoSlNQVGFnLkRJUkVDVElWRV9UT0tFTiArIHRhZ05hbWUuc3Vic3RyaW5nKG9mZnNldCkpOwotCQkJfQotCQkJcmV0dXJuICh4ZS5pc0NvbW1lbnRUYWcoKSkgPyB0YWdOYW1lIDogbnVsbDsKLQkJfSBlbHNlIGlmICh0YWdOYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkgewotCQkJaWYgKCF0YWdOYW1lLmVuZHNXaXRoKEpTUFRhZy5UQUdfQ0xPU0UpKSB7Ci0JCQkJLy8gY2xvc2UgSlNQCi0JCQkJcmV0dXJuICh0YWdOYW1lICsgSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoeGUuaXNDb21tZW50VGFnKCkpIHsKLQkJCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotCQkJaWYgKHByZWZpeC5lcXVhbHMoU1NJX1BSRUZJWCkpIHsKLQkJCQlyZXR1cm4gKFNTSV9UT0tFTiArIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCF4ZS5pc0pTUFRhZygpICYmIHhlLmlzR2xvYmFsVGFnKCkgJiYgLy8gZ2xvYmFsIHRhZwotCQkJCQkJQ01Ob2RlVXRpbC5nZXRFbGVtZW50RGVjbGFyYXRpb24oeGUpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IHRhZ05hbWU7Ci0JCQkJc3dpdGNoIChnZXRUYWdOYW1lQ2FzZSh4ZSkpIHsKLQkJCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0UgOgotCQkJCQkJbmV3TmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRSA6Ci0JCQkJCQluZXdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChuZXdOYW1lICE9IHRhZ05hbWUpIHsKLQkJCQkJdGFnTmFtZSA9IG5ld05hbWU7Ci0JCQkJCXNldFRhZ05hbWUoZWxlbWVudCwgdGFnTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0YWdOYW1lOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVUZXh0KFRleHQgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVRleHRJbXBsIGltcGwgPSAoVGV4dEltcGwpIHRleHQ7Ci0JCVN0cmluZyBzb3VyY2UgPSBpbXBsLmdldFRleHRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJcmV0dXJuIGdlbmVyYXRlVGV4dERhdGEodGV4dCwgaW1wbC5nZXREYXRhKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVUZXh0RGF0YShUZXh0IHRleHQsIFN0cmluZyBkYXRhKSB7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlpZiAoaW1wbC5pc0pTUENvbnRlbnQoKSB8fCBpbXBsLmlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCXJldHVybiBuZXcgU291cmNlVmFsaWRhdG9yKGltcGwpLmNvbnZlcnRTb3VyY2UoZGF0YSk7Ci0JCX0KLQkJU3RyaW5nIHNvdXJjZSA9IGRhdGE7Ci0KLQkJLy8gY29udmVydCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGVudGl0aWVzCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2hhck5hbWUoZGF0YS5jaGFyQXQoaSkpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQkJaWYgKGkgPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZChkYXRhLnN1YnN0cmluZyhvZmZzZXQsIGkpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyYnKTsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCQlidWZmZXIuYXBwZW5kKCc7Jyk7Ci0JCQlvZmZzZXQgPSBpICsgMTsKLQkJfQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChsZW5ndGggPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZChkYXRhLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0QXR0ck5hbWVDYXNlKEF0dHIgYXR0cikgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRTsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0QXR0ck5hbWVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2hhck5hbWUoY2hhciBjKSB7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnPCcgOgotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5MVF9OQU1FOwotCQkJY2FzZSAnPicgOgotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5HVF9OQU1FOwotCQkJY2FzZSAnJicgOgotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5BTVBfTkFNRTsKLQkJCWNhc2UgJyInIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuUVVPVF9OQU1FOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgaW50IGdldFRhZ05hbWVDYXNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRTsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VGFnTmFtZUNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCb29sZWFuQXR0cihBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWNsID0gQ01Ob2RlVXRpbC5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ01EYXRhVHlwZSB0eXBlID0gZGVjbC5nZXRBdHRyVHlwZSgpOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgdmFsdWVzW10gPSB0eXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHZhbHVlcy5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbMF0uZXF1YWxzKGRlY2wuZ2V0QXR0ck5hbWUoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTc5OWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogWE1MTW9kZWxDb250ZXh0IGNsYXNzCi0gKi8KLWNsYXNzIFhNTE1vZGVsQ29udGV4dCB7Ci0JcHJpdmF0ZSBOb2RlIG5leHROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgcGFyZW50Tm9kZSA9IG51bGw7Ci0KLQkvLwlwcml2YXRlIFhNTE1vZGVsSW1wbCBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlIHJvb3ROb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIFhNTE1vZGVsQ29udGV4dCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSByb290Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCVhNTE1vZGVsQ29udGV4dChOb2RlIHJvb3ROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIGZpbmRFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlFbGVtZW50IGZpbmRFbmRUYWcoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKE5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJaWYgKGVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQkvLyBpZiBhbmNlc3RvciBlbGVtZW50IGhhcyBlbmQgdGFnIHN0b3Agc2VhcmNoCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudC5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlUZXh0IGZpbmROZXh0VGV4dCgpIHsKLQkJTm9kZSBub2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgIT0gdGhpcy5uZXh0Tm9kZSAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBub2RlOwotCQkJCS8vIHNraXAgZW1wdHkgdGV4dAotCQkJCWlmICh0ZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpCi0JCQkJCXJldHVybiB0ZXh0OwotCQkJfQotCQkJTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlub2RlID0gY2hpbGQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJbm9kZSA9IG5leHQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZmluZFByZXZpb3VzVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKi8KLQlUZXh0IGZpbmRQcmV2aW91c1RleHQoKSB7Ci0JCWlmICh0aGlzLnBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJbm9kZSA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWVsc2UKLQkJCW5vZGUgPSB0aGlzLnBhcmVudE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoVGV4dCkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlFbGVtZW50IGZpbmRTdGFydFRhZyhTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIHJvb3ROYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBjaGVjayBwcmV2aW91cyBmb3IgZW1wdHkgY29udGVudCBlbGVtZW50Ci0JCU5vZGUgcHJldiA9IG51bGw7Ci0JCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQlwcmV2ID0gdGhpcy5uZXh0Tm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJZWxzZSBpZiAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpCi0JCQlwcmV2ID0gdGhpcy5wYXJlbnROb2RlLmdldExhc3RDaGlsZCgpOwotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiAhZWxlbWVudC5pc0VtcHR5VGFnKCkgJiYgZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlmb3IgKE5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJaWYgKGVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQkJaWYgKHJvb3ROYW1lICE9IG51bGwgJiYgZWxlbWVudC5tYXRjaFRhZ05hbWUocm9vdE5hbWUpKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmV4dE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JTm9kZSBnZXROZXh0Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dE5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UGFyZW50Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Um9vdE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JTm9kZSBnZXRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogc2V0TGFzdCBtZXRob2QKLQkgKi8KLQl2b2lkIHNldExhc3QoKSB7Ci0JCWlmICh0aGlzLnBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBwcmV2ID0gdGhpcy5uZXh0Tm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChwcmV2ID09IG51bGwgfHwgcHJldi5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybjsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSB8fCAhZWxlbWVudC5pc0NvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNFbXB0eVRhZygpKQotCQkJCXJldHVybjsKLQkJCXNldFBhcmVudE5vZGUocHJldik7Ci0JCX0KLQotCQkvLyBmaW5kIGxhc3Qgb3BlbiBwYXJlbnQKLQkJTm9kZSBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCU5vZGUgbGFzdCA9IHBhcmVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJd2hpbGUgKGxhc3QgIT0gbnVsbCkgewotCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSB8fCAhZWxlbWVudC5pc0NvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNFbXB0eVRhZygpKQotCQkJCWJyZWFrOwotCQkJcGFyZW50ID0gZWxlbWVudDsKLQkJCWxhc3QgPSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCX0KLQkJaWYgKHBhcmVudCAhPSB0aGlzLnBhcmVudE5vZGUpCi0JCQlzZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogc2V0TmV4dE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5leHROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBzZXROZXh0Tm9kZShOb2RlIG5leHROb2RlKSB7Ci0JCXRoaXMubmV4dE5vZGUgPSBuZXh0Tm9kZTsKLQkJaWYgKG5leHROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMucGFyZW50Tm9kZSA9IG5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQYXJlbnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBzZXRQYXJlbnROb2RlKE5vZGUgcGFyZW50Tm9kZSkgewotCQl0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY3NzliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIAotICogWE1MTW9kZWxOb3RpZmllciBtYW5hZ2VzIHRoZSBub3RpZmljYXRpb24gcHJvY2Vzcy4gQ2xpZW50cyBzaG91bGQgbm90IHVzZQotICogZXh0ZW5kIG9yIHJlZmVyZW5jZS4KLSAqIAotICogSVNTVUU6IHNob3VsZCBiZSBpbnRlcm5hbGl6ZWQuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxNb2RlbE5vdGlmaWVyIHsKLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQl2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKTsKLQotCS8qKgotCSAqIFNpZ25hbCB0aGF0IGNoYW5naW5nIGlzIHN0YXJ0aW5nLgotCSAqIAotCSAqLwotCXZvaWQgYmVnaW5DaGFuZ2luZygpOwotCi0JLyoqCi0JICogU2lnbmFsIHRoYXQgY2hhbmdpbmcgaXMgc3RhcnRpbmcgd2l0aCBhIGJyYW5kIG5ldyBtb2RlbC4KLQkgKiAKLQkgKi8KLQl2b2lkIGJlZ2luQ2hhbmdpbmcoYm9vbGVhbiBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKiBDYW5jZWwgcGVuZGluZyBub3RpZmljYXRpb25zLiBUaGlzIGlzIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZgotCSAqICJyZWluaXRpYWxpemF0aW9uIiBzbyBpcyBhc3N1bWVkIEFMTCBub3RpZmljYXRpb25zIGNhbiBiZSBzYWZlbHkKLQkgKiBjYW5jZWxlZCwgYXNzdW1pbmcgdGhhdCBvbmNlIGZhY3RvcmllcyBhbmQgYWRhcHRlcnMgYXJlIHJlLWluaXRpYWxpemVkCi0JICogdGhleSB3aWxsIGJlIHJlLW5vdGlmaWVkIGFzIHRleHQgaXMgc2V0IGluIG1vZGVsLCBpZiBzdGlsbCBhcHByb3ByaWF0ZS4KLQkgKi8KLQl2b2lkIGNhbmNlbFBlbmRpbmcoKTsKLQotCS8qKgotCSAqIGNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKTsKLQotCS8qKgotCSAqIEVkaXRhYmxlIHN0YXRlIGNoYW5nZWQgZm9yIG5vZGUuCi0JICogCi0JICovCi0Jdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFNpZ25hbCBjaGFuZ2luZyBpcyBmaW5pc2hlZC4KLQkgKiAKLQkgKi8KLQl2b2lkIGVuZENoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiBTaWduYWwgZW5kIHRhZyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogCi0JICovCi0Jdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlZmxlY3Qgc3RhdGUgb2YgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIG1vZGVsIGhhZCBjaGFuZ2VkLgotCSAqIAotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogVXNlZCB0byByZWZsZWN0IHN0YXRlIG9mIHBhcnNpbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgbW9kZWwgaXMgY3VycmVudGx5IGNoYW5naW5nLgotCSAqLwotCWJvb2xlYW4gaXNDaGFuZ2luZygpOwotCi0JLyoqCi0JICogc2lnbmFsIHByb3BlcnR5IGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgcHJvcGVydHlDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBzaWduYWwgc3RhcnQgdGFnIGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXZvaWQgc3RhcnRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBzaWduYWwgc3RydWN0dXJlZCBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCBzdHJ1Y3R1cmVDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHZhbHVlQ2hhbmdlZChOb2RlIG5vZGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOTE0OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbE5vdGlmaWVySW1wbCBpbXBsZW1lbnRzIFhNTE1vZGVsTm90aWZpZXIgewotCi0JLyogZW5kOiBmb3IgZGVidWdnaW5nIG9ubHkgKi8KLQlwcml2YXRlIGNsYXNzIE5vdGlmeUV2ZW50IHsKLQkJT2JqZWN0IGNoYW5nZWRGZWF0dXJlOwotCQlib29sZWFuIGRpc2NhcmRlZDsKLQkJT2JqZWN0IG5ld1ZhbHVlOwotCQkvLyBub3RlOiBkb24ndCBpbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcywgc2luY2UKLQkJLy8gdGhhdCBjYXVzZXMgZG91YmxlIGFzc2lnbm1lbnRzLCBhbmQgbG90cyBvZiB0aGVzZSBhcmUgY3JlYXRlZC4KLQkJSU5vZGVOb3RpZmllciBub3RpZmllcjsKLQkJT2JqZWN0IG9sZFZhbHVlOwotCQlpbnQgcG9zOwotCQlTdHJpbmcgcmVhc29uOwotCQlpbnQgdHlwZTsKLQkJaW50IGluZGV4OwotCi0JCU5vdGlmeUV2ZW50KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCB0eXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5jaGFuZ2VkRmVhdHVyZSA9IGNoYW5nZWRGZWF0dXJlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQkJdGhpcy5wb3MgPSBwb3M7Ci0JCQl0aGlzLnJlYXNvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURERURfVEhFTl9SRU1PVkVEID0gIkRpc2NhcmQ6IEFkZGVkIHRoZW4gcmVtb3ZlZCBydWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZk9wdGltaXplRGVmZXJyZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudEFkZGVkID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRSZW1vdmVkID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSRU5UX0lTX0FEREVEID0gIkRpc2FyZGVkOiBQYXJlbnQgaGFzIGp1c3QgYmVlbiBhZGRlZCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBzdGFydDogZm9yIGRlYnVnZ2luZyBvbmx5ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9JU19SRU1PVkVEX1RPTyA9ICJEaXNjYXJkOiBQYXJlbnQgd2FzIHJlbW92ZWQgdG9vIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJFTlRfSVNfUkVQQVJFTlRFRCA9ICJOb3QgRGlzY2FyZDogUGFyZW50IHdhcyByZW1vdmVkIHNvIHRoaXMgaW1wbGllcyByZXBhcmVudGluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE5vZGUgY2hhbmdlZFJvb3QgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5naW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRvaW5nTmV3TW9kZWwgPSBmYWxzZTsKLQlwcml2YXRlIFZlY3RvciBldmVudHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmbHVzaGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHVibGljIFhNTE1vZGVsTm90aWZpZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyUmVwbGFjZWQoRWxlbWVudCBlbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlBdHRyIGF0dHIgPSBudWxsOwotCQlTdHJpbmcgb2xkVmFsdWUgPSBudWxsOwotCQlTdHJpbmcgbmV3VmFsdWUgPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyID0gb2xkQXR0cjsKLQkJCW9sZFZhbHVlID0gb2xkQXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCWF0dHIgPSBuZXdBdHRyOwotCQkJbmV3VmFsdWUgPSBuZXdBdHRyLmdldFZhbHVlKCk7Ci0JCX0KLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBhdHRyLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5DaGFuZ2luZygpIHsKLQkJdGhpcy5jaGFuZ2luZyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5DaGFuZ2luZyhib29sZWFuIG5ld01vZGVsKSB7Ci0JCWJlZ2luQ2hhbmdpbmcoKTsKLQkJdGhpcy5kb2luZ05ld01vZGVsID0gbmV3TW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FuY2VsUGVuZGluZygpIHsKLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhpcyBhcnJheSwgc2luY2UKLQkJLy8gdGhlIGFycmF5IG1heSBiZSBiZWluZyBwcm9jZXNzZWQsIGluIHRoZSBkZWZmZXJyZWQgbm90aWZpY2F0aW9uCi0JCS8vIGxvb3AsIGJ1dCB3ZSBjYW4gc2lnbmFsIHRoYXQgYWxsCi0JCS8vIHNob3VsZCBiZSBkaXNjYXJkZWQsIHNvIGFueSByZW1haW5pbmcgb25lcyB3aWxsIGJlIGlnbm9yZWQuCi0JCWlmICh0aGlzLmV2ZW50cyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIHRoaXMgY2FuY2VsIGlzIHByZXN1bWFibHkgYmVpbmcgY2FsbGVkIGFzIGEgZnVuY3Rpb24gb2YKLQkJLy8gInJlaW5pdGlhaWxpemF0aW9uIiBzbyB3ZSBjYW4gaWdub3JlIGNoYW5nZXMgdG8gdGhlCi0JCS8vIG9sZCByb290LCBhbmQgY2hhbmdlcyB0byB0aGUgbmV3IG9uZSB3aWxsIGJlIHRyaWdnZXJlZCBkdXJpbmcKLQkJLy8gcmVpbml0aWFsaXphdGlvbi4KLQkJY2hhbmdlZFJvb3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIGNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGlsZFJlcGxhY2VkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgcGFyZW50Tm9kZTsKLQkJaW50IHR5cGUgPSBJTm9kZU5vdGlmaWVyLkNIQU5HRTsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwpCi0JCQl0eXBlID0gSU5vZGVOb3RpZmllci5SRU1PVkU7Ci0JCWVsc2UgaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQl0eXBlID0gSU5vZGVOb3RpZmllci5BREQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIHR5cGUsIG9sZENoaWxkLCBvbGRDaGlsZCwgbmV3Q2hpbGQsIG9mZnNldCk7Ci0JCXN0cnVjdHVyZUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVkaXRhYmxlQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCBudWxsLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZENoYW5naW5nKCkgewotCQl0aGlzLmRvaW5nTmV3TW9kZWwgPSBmYWxzZTsKLQkJaWYgKCF0aGlzLmNoYW5naW5nKQotCQkJcmV0dXJuOyAvLyBhdm9pZCBuZXN0aW5nIGNhbGxzCi0JCW5vdGlmeURlZmVycmVkKCk7Ci0JCWlmICh0aGlzLmNoYW5nZWRSb290ICE9IG51bGwpIHsKLQkJCW5vdGlmeVN0cnVjdHVyZUNoYW5nZWQodGhpcy5jaGFuZ2VkUm9vdCk7Ci0JCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCVN0cmluZyBwID0gdGhpcy5jaGFuZ2VkUm9vdC5nZXROb2RlTmFtZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVmZXJyZWQgU1RSVUNVVFJFX0NIQU5HRUQ6ICIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IG51bGw7Ci0JCX0KLQkJdGhpcy5jaGFuZ2luZyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgbnVsbCwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQoKSB7Ci0JCXJldHVybiAodGhpcy5ldmVudHMgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeShJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jaGFuZ2luZyAmJiAhdGhpcy5mbHVzaGluZykgewotCQkJLy8gZGVmZXIgbm90aWZpY2F0aW9uCi0JCQlpZiAodGhpcy5ldmVudHMgPT0gbnVsbCkKLQkJCQl0aGlzLmV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLQkJCS8vIHdlIGRvIG5vdCBkZWZlciBhbnl0aGluZyBpZiB3ZSBhcmUgZG9pbmcgYSBuZXcgTW9kZWwsCi0JCQkvLyBleGNlcHQgZm9yIHRoZSBkb2N1bWVudCBldmVudCwgc2luY2UgYWxsIG90aGVycyBhcmUKLQkJCS8vIHRyaXZpYWwgYW5kIG5vdCBuZWVkZWQgYXQgdGhhdCBpbml0aWFsIHBvaW50LgotCQkJLy8gQnV0IGV2ZW4gZm9yIHRoYXQgb25lIGRvY3VtZW50IGV2ZW50LCBpbiB0aGUgbmV3IG1vZGVsIGNhc2UsCi0JCQkvLyBpdCBpcyBzdGlsbCBpbXBvcnRhbnQgdG8gZGVmZXIgaXQuCi0JCQlpZiAoKCFkb2luZ05ld01vZGVsKSB8fCAoKChOb2RlKSBub3RpZmllcikuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkJdGhpcy5ldmVudHMuYWRkRWxlbWVudChuZXcgTm90aWZ5RXZlbnQobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIEl0cyBpbXBvcnRhbnQgdG8gImtlZXAgZ29pbmciIGlmIGV4Y2VwdGlvbiBvY2N1cnMsIHNpbmNlIHRoaXMKLQkJCS8vIG5vdGlmaWNhdGlvbgotCQkJLy8gY29tZXMgaW4gYmV0d2VlbiAiYWJvdXQgdG8gY2hhbmdlIiBhbmQgImNoYW5nZWQiIGV2ZW50cy4gV2UgZG8KLQkJCS8vIGxvZywgaG93ZXZlciwKLQkJCS8vIHNpbmNlIHdvdWxkIGluZGljYXRlIGEgcHJvZ3JhbSBlcnJvci4KLQkJCW5vdGlmaWVyLm5vdGlmeShldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJBIHN0cnVjdHVyZWQgbW9kZWwgY2xpZW50IHRocmV3IGZvbGxvd2luZyBleGNlcHRpb24gZHVyaW5nIGFkYXB0ZXIgbm90aWZpY2F0aW9uICgiICsgSU5vZGVOb3RpZmllci5FVkVOVF9UWVBFX1NUUklOR1NbZXZlbnRUeXBlXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlEZWZlcnJlZCgpIHsKLQkJaWYgKHRoaXMuZXZlbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmZsdXNoaW5nKQotCQkJcmV0dXJuOwotCQl0aGlzLmZsdXNoaW5nID0gdHJ1ZTsgLy8gZm9yY2Ugbm90aWZpY2F0aW9uCi0JCWludCBjb3VudCA9IHRoaXMuZXZlbnRzLnNpemUoKTsKLQkJaWYgKCFkb2luZ05ld01vZGVsICYmIGZPcHRpbWl6ZURlZmVycmVkKSB7Ci0JCQlNYXAgdmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmV2ZW50cy5lbGVtZW50QXQoaSk7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWV2ZW50LmluZGV4ID0gaTsKLQkJCQlpZihldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCWFkZFRvTWFwKGV2ZW50Lm9sZFZhbHVlLCBldmVudCwgdmFsdWVzKTsKLQkJCQl9Ci0JCQkJaWYoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQlhZGRUb01hcChldmVudC5uZXdWYWx1ZSwgZXZlbnQsIHZhbHVlcyk7Ci0JCQkJfQotCQkJfQotCQkJSXRlcmF0b3IgaXQgPSB2YWx1ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10pdmFsdWVzLmdldCh2YWx1ZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcy5sZW5ndGggLSAxOyBpKyspIHsKLQkJCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSBlc1tpXTsKLQkJCQkJaWYoZXNbaV0uZGlzY2FyZGVkKSBjb250aW51ZTsKLQkJCQkJTm90aWZ5RXZlbnQgbmV4dCA9IGVzW2kgKyAxXTsKLQkJCQkJaWYoZXNbaV0udHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCAmJiBuZXh0LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJCS8vIEFkZGVkIHRoZW4gcmVtb3ZlZCBsYXRlciwgZGlzY2FyZCBib3RoCi0JCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJbmV4dC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQlldmVudC5yZWFzb24gPSBldmVudC5yZWFzb24gKyBBRERFRF9USEVOX1JFTU9WRUQgKyAiKHNlZSAiICsgbmV4dC5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbmV4dC5yZWFzb24gPSBuZXh0LnJlYXNvbiArIEFEREVEX1RIRU5fUkVNT1ZFRCArICIoc2VlICIgKyBldmVudC5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5ldmVudHMuZWxlbWVudEF0KGkpOwotCQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJCWlmIChldmVudC5ub3RpZmllciAhPSBudWxsICYmIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRBZGRlZCkgewotCQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKXZhbHVlcy5nZXQoZXZlbnQubm90aWZpZXIpOwotCQkJCQkJaWYoZXMgIT0gbnVsbCkgZm9yIChpbnQgcCA9IDA7IHAgPCBlcy5sZW5ndGggJiYgZXNbcF0uaW5kZXggPCBldmVudC5pbmRleDsgcCsrKSB7Ci0JCQkJCQkJTm90aWZ5RXZlbnQgcHJldiA9IGVzW3BdOwotCQkJCQkJCWlmIChwcmV2LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUgJiYgcHJldi5vbGRWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkvLyBwYXJlbnQgaXMgcmVwYXJlbnRlZCwgZG8gbm90IGRpc2NhcmQKLQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19SRVBBUkVOVEVEICsgIihzZWUgIiArIHByZXYuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gZWxzZSBpZiAocHJldi50eXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIHByZXYubmV3VmFsdWUgPT0gZXZlbnQubm90aWZpZXIpIHsKLQkJCQkJCQkJLy8gcGFyZW50IGhhcyBiZWVuIGFkZGVkLCBkaXNjYXJkIHRoaXMKLQkJCQkJCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19BRERFRCArICIoc2VlICIgKyBwcmV2LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkJCQotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQkJaWYgKGV2ZW50Lm5vdGlmaWVyICE9IG51bGwgJiYgZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudFJlbW92ZWQpIHsKLQkJCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJCU5vdGlmeUV2ZW50W10gZXMgPSAoTm90aWZ5RXZlbnRbXSl2YWx1ZXMuZ2V0KGV2ZW50Lm5vdGlmaWVyKTsKLQkJCQkJCWlmKGVzICE9IG51bGwpIGZvciAoaW50IG4gPSAwOyBuIDwgZXMubGVuZ3RoOyBuKyspIHsKLQkJCQkJCQlOb3RpZnlFdmVudCBuZXh0ID0gZXNbbl07Ci0JCQkJCQkJaWYobmV4dC5pbmRleCA+IGV2ZW50LmluZGV4ICYmIG5leHQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJCQlpZiAobmV4dC5vbGRWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkJLy8gcGFyZW50IHdpbGwgYmUgcmVtb3ZlZCwgZGlzY2FyZCB0aGlzCi0JCQkJCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCQlldmVudC5yZWFzb24gPSBldmVudC5yZWFzb24gKyBQQVJFTlRfSVNfUkVNT1ZFRF9UT08gKyAiKHNlZSAiICsgbmV4dC5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQkJCQkJCQotCQkJCX0KLQkJCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZXZlbnRzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJaWYoZXZlbnQuZGlzY2FyZGVkKSBjb250aW51ZTsKLQkJCW5vdGlmeShldmVudC5ub3RpZmllciwgZXZlbnQudHlwZSwgZXZlbnQuY2hhbmdlZEZlYXR1cmUsIGV2ZW50Lm9sZFZhbHVlLCBldmVudC5uZXdWYWx1ZSwgZXZlbnQucG9zKTsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBjb3VudDsgbCsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZXZlbnRzLmVsZW1lbnRBdChsKTsKLQkJCQlPYmplY3QgbyA9IG51bGw7Ci0JCQkJU3RyaW5nIHQgPSBudWxsOwotCQkJCWlmIChldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuQUREKSB7Ci0JCQkJCW8gPSBldmVudC5uZXdWYWx1ZTsKLQkJCQkJdCA9ICIgKyAiOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCW8gPSBldmVudC5vbGRWYWx1ZTsKLQkJCQkJdCA9ICIgLSAiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChvIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQlTdHJpbmcgcCA9ICgoTm9kZSkgZXZlbnQubm90aWZpZXIpLmdldE5vZGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBjID0gKChOb2RlKSBvKS5nZXROb2RlTmFtZSgpOwotCQkJCQlTdHJpbmcgZCA9IChldmVudC5kaXNjYXJkZWQgPyAiISAiIDogIiAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZCArIHAgKyB0ICsgYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRoaXMuZmx1c2hpbmcgPSBmYWxzZTsKLQkJdGhpcy5ldmVudHMgPSBudWxsOwotCX0KLQotCXZvaWQgYWRkVG9NYXAoT2JqZWN0IG8sIE5vdGlmeUV2ZW50IGV2ZW50LCBNYXAgbWFwKSB7Ci0JCWlmKG8gPT0gbnVsbCkgcmV0dXJuOwotCQlPYmplY3QgeCA9IG1hcC5nZXQobyk7Ci0JCWlmKHggPT0gbnVsbCkgewotCQkJbWFwLnB1dChvLCBuZXcgTm90aWZ5RXZlbnRbXXtldmVudH0pOwotCQl9IGVsc2UgewotCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKXg7Ci0JCQlOb3RpZnlFdmVudFtdIGVzMiA9IG5ldyBOb3RpZnlFdmVudFtlcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXMsIDAsIGVzMiwgMCwgZXMubGVuZ3RoKTsKLQkJCWVzMltlcy5sZW5ndGhdID0gZXZlbnQ7Ci0JCQltYXAucHV0KG8sIGVzMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5U3RydWN0dXJlQ2hhbmdlZChOb2RlIHJvb3QpIHsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSByb290OwotCQl0cnkgewotCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIgaWYgZXhjZXB0aW9uIG9jY3Vycywgc2luY2UgdGhpcwotCQkJLy8gbm90aWZpY2F0aW9uCi0JCQkvLyBjb21lcyBpbiBiZXR3ZWVuICJhYm91dCB0byBjaGFuZ2UiIGFuZCAiY2hhbmdlZCIgZXZlbnRzLiBXZSBkbwotCQkJLy8gbG9nLCBob3dldmVyLAotCQkJLy8gc2luY2Ugd291bGQgaW5kaWNhdGUgYSBwcm9ncmFtIGVycm9yLgotCQkJbm90aWZpZXIubm90aWZ5KElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQsIG51bGwsIG51bGwsIG51bGwsIC0xKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQgdGhyZXcgZm9sbG93aW5nIGV4Y2VwdGlvbiBkdXJpbmcgYWRhcHRlciBub3RpZmljYXRpb24gKCIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE5vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbW1vblJvb3RJZk5lZWRlZChOb2RlIG5vZGUpIHsKLQkJLy8gZGVmZXIgbm90aWZpY2F0aW9uCi0JCWlmICh0aGlzLmNoYW5nZWRSb290ID09IG51bGwpIHsKLQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBub2RlOwotCQl9IGVsc2UgewotCQkJLy8gdGlueSBvcHRpbWl6YXRpb246IGlmIHByZXZpb3VzIGNvbW1vbkFuY2VzdG9yIChjaGFuZ2VkUm9vdCkgaXMKLQkJCS8vIGFscmVhZHkgJ2RvY3VtZW50JywKLQkJCS8vIG9yIGlmIGFscmVhZHkgZXF1YWwgdG8gdGhpcyAnbm9kZScsCi0JCQkvLyB0aGVuIG5vIG5lZWQgdG8gcmUtY2FsY3VsYXRlCi0JCQlpZiAoY2hhbmdlZFJvb3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgY2hhbmdlZFJvb3QgIT0gbm9kZSkgewotCQkJCU5vZGUgY29tbW9uID0gKChOb2RlSW1wbCkgdGhpcy5jaGFuZ2VkUm9vdCkuZ2V0Q29tbW9uQW5jZXN0b3Iobm9kZSk7Ci0JCQkJaWYgKGNvbW1vbiAhPSBudWxsKQotCQkJCQl0aGlzLmNoYW5nZWRSb290ID0gY29tbW9uOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IG5vZGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgbnVsbCwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHN0cnVjdHVyZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NoYW5naW5nKCkpIHsKLQkJCXNldENvbW1vblJvb3RJZk5lZWRlZChub2RlKTsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJU3RyaW5nIHAgPSB0aGlzLmNoYW5nZWRSb290LmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXF1ZXN0ZWQgU1RSVUNVVFJFX0NIQU5HRUQ6ICIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQlTdHJpbmcgcCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RSVUNVVFJFX0NIQU5HRUQ6ICIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vdGlmeVN0cnVjdHVyZUNoYW5nZWQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0JCQlub3RpZmllciA9IChJRE9NTm9kZSkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCS8vIFRPRE9fZG13OiBleHBlcmltZW50YWw6IGNoYW5nZWQgMDYvMjkvMjAwNCB0byBzZW5kICJzdHJ1Y3V0dXJlCi0JCQkvLyBjaGFuZ2VkIiBldmVuIGZvciBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlcwotCQkJLy8gdGhlcmUgYXJlIHByb3MgYW5kIGNvbnMgdG8gY29uc2lkZXJpbmcgYXR0cmlidXRlIHZhbHVlCi0JCQkvLyAic3RydWN0dXJlIGNoYW5nZWQiLiBXaWxsIChyZSljb25zaWRlcgotCQkJLy8gc2V0Q29tbW9uUm9vdElmTmVlZGVkKG5vdGlmaWVyKTsKLQkJCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiB3ZSBkbyBub3Qgc2VuZCBzdHJ1Y3R1cmVkIGNoYW5nZWQgZXZlbnQgZm9yIGNvbnRlbnQKLQkJCS8vIGNoYW5nZWQKLQkJCW5vdGlmaWVyID0gKElET01Ob2RlKSBub2RlOwotCQkJU3RyaW5nIHZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJbm90aWZ5KHBhcmVudCwgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQsIG5vZGUsIG51bGwsIHZhbHVlLCBvZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwMzJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogWE1MTW9kZWxQYXJzZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsUGFyc2VyIHsKLQlwcml2YXRlIFhNTE1vZGVsQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIERPTU1vZGVsSW1wbCBtb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MTW9kZWxQYXJzZXIoRE9NTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jYW5CZUltcGxpY2l0VGFnKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50LCBjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGltcGwuaXNFbmRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsgLy8gaW52YWxpZCAoZmxvYXRpbmcpIGVuZCB0YWcKLQkJaWYgKCFpbXBsLmlzQ29udGFpbmVyKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlpZiAoaW1wbC5pc0pTUENvbnRhaW5lcigpIHx8IGltcGwuaXNDREFUQUNvbnRhaW5lcigpKSB7Ci0JCQkJLy8gYWNjZXB0cyBvbmx5IFRleHQgY2hpbGQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNhbkNvbnRhaW4oZWxlbWVudCwgY2hpbGQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyRXF1YWwoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSBub2RlOwotCQkJCXBpLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGFjdHVhbGx5LCBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0ck5hbWUgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgZGF0YQotCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCkgbm9kZTsKLQkJCQlwaS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGF0dHIuZ2V0TmFtZVJlZ2lvbigpICE9IHJlZ2lvbikKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0clZhbHVlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgZGF0YQotCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCkgbm9kZTsKLQkJCQlwaS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGF0dHIuZ2V0VmFsdWVSZWdpb24oKSAhPSByZWdpb24pCi0JCQkJY29udGludWU7Ci0JCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyB2YWx1ZQotCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlRGF0YSBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlRGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCQlpZiAodGV4dC5pc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpKSB7Ci0JCQkJCS8vIGhhcyBjb25zZWN1dGl2ZSB0ZXh0IHNoYXJpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShub2RlKTsKLQkJCQljbGVhbnVwVGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJLy8gY29tbWVudCB0YWcKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJTm9kZUltcGwgaW1wbCA9IChOb2RlSW1wbCkgbm9kZTsKLQkJaW1wbC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBjaGFuZ2UgaXMgb25seSBmb3IgY2xvc2UgdGFnCi0JCWlmIChuZXdSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBuZXdSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IG9sZFJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIGNoYW5nZSBmb3IgY2xvc2UgdGFnIGhhcyBubyBpbXBhY3QKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIGNoYW5nZVJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5jb250ZXh0ID0gbmV3IFhNTE1vZGVsQ29udGV4dCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpOwotCi0JCS8vIG9wdGltaXplIHR5cGljYWwgY2FzZXMKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCBpc05lc3RlZENvbnRlbnQocmVnaW9uVHlwZSkpIHsKLQkJCWNoYW5nZURhdGEoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCWNoYW5nZUF0dHJOYW1lKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJY2hhbmdlQXR0clZhbHVlKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCWNoYW5nZUF0dHJFcXVhbChmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJY2hhbmdlVGFnTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVN0YXJ0VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQotCQkvLyBjaGVjayBpZiBjaGFuZ2VzIGFyZSBvbmx5IGZvciBhdHRyaWJ1dGVzIGFuZCBjbG9zZSB0YWcKLQkJYm9vbGVhbiB0YWdOYW1lVW5jaGFuZ2VkID0gZmFsc2U7Ci0JCWlmIChuZXdSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBuZXdSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCQkvLyBjaGFuZ2UgZnJvbSBlbXB0eSB0YWcgbWF5IGhhdmUgaW1wYWN0IG9uIHN0cnVjdHVyZQotCQkJCQlpZiAoIWVsZW1lbnQuaXNFbXB0eVRhZygpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJCVN0cmluZyBvbGRUYWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdUYWdOYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCQlpZiAob2xkVGFnTmFtZSAhPSBudWxsICYmIG5ld1RhZ05hbWUgIT0gbnVsbCAmJiBvbGRUYWdOYW1lLmVxdWFscyhuZXdUYWdOYW1lKSkgewotCQkJCQkJLy8gdGhlIHRhZyBuYW1lIGlzIHVuY2hhbmdlZAotCQkJCQkJdGFnTmFtZVVuY2hhbmdlZCA9IHRydWU7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChvbGRSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBvbGRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCQkvLyBjaGFuZ2UgZnJvbSBlbXB0eSB0YWcgbWF5IGhhdmUgaW1wYWN0IG9uIHN0cnVjdHVyZQotCQkJCQlpZiAoIWVsZW1lbnQuaXNFbXB0eVRhZygpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJCS8vIGlmIG5ldyB0YWcgbmFtZSBpcyB1bmNoYW5nZWQsIGl0J3MgT0sKLQkJCQkJaWYgKHRhZ05hbWVVbmNoYW5nZWQpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIHVwZGF0ZSBhdHRyaWJ1dGVzCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCS8vIGZpcnN0IHJlbW92ZSBhdHRyaWJ1dGVzCi0JCWludCByZWdpb25JbmRleCA9IDA7Ci0JCWludCBhdHRySW5kZXggPSAwOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJd2hpbGUgKGF0dHJJbmRleCA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShhdHRySW5kZXgpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgeyAvLyBlcnJvcgotCQkJCWF0dHJJbmRleCsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQkJaWYgKG5hbWVSZWdpb24gPT0gbnVsbCkgeyAvLyBlcnJvcgotCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSByZWdpb25JbmRleDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQlpZiAocmVnaW9uID09IG5hbWVSZWdpb24pIHsKLQkJCQkJcmVnaW9uSW5kZXggPSBpICsgMTsgLy8gbmV4dCByZWdpb24KLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQpIHsKLQkJCQlhdHRySW5kZXgrKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluc2VydCBvciB1cGRhdGUgYXR0cmlidXRlcwotCQlhdHRySW5kZXggPSAwOyAvLyByZXNldCB0byBmaXJzdAotCQlBdHRySW1wbCBuZXdBdHRyID0gbnVsbDsKLQkJSVRleHRSZWdpb24gb2xkVmFsdWVSZWdpb24gPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQkJCS8vIGluc2VydCBkZWZlcnJlZCBuZXcgYXR0cmlidXRlCi0JCQkJCWVsZW1lbnQuaW5zZXJ0QXR0cmlidXRlTm9kZShuZXdBdHRyLCBhdHRySW5kZXgrKyk7Ci0JCQkJCW5ld0F0dHIgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIGlmIChhdHRyICE9IG51bGwgJiYgb2xkVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkvLyBub3RpZnkgZXhpc3RpbmcgYXR0cmlidXRlIHZhbHVlIHJlbW92YWwKLQkJCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQl9Ci0KLQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGF0dHJJbmRleCk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmdldE5hbWVSZWdpb24oKSA9PSByZWdpb24pIHsKLQkJCQkJLy8gZXhpc3RpbmcgYXR0cmlidXRlCi0JCQkJCWF0dHJJbmRleCsrOwotCQkJCQkvLyBjbGVhciBvdGhlciByZWdpb25zCi0JCQkJCW9sZFZhbHVlUmVnaW9uID0gYXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCQlhdHRyLnNldEVxdWFsUmVnaW9uKG51bGwpOwotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKG51bGwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJLy8gZGVmZXIgaW5zZXJ0aW9uIG9mIG5ldyBhdHRyaWJ1dGUKLQkJCQkJbmV3QXR0ciA9IGF0dHI7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlpZiAoYXR0ciAhPSBuZXdBdHRyICYmIG9sZFZhbHVlUmVnaW9uICE9IHJlZ2lvbikgewotCQkJCQkJLy8gbm90aWZ5IGV4aXN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSBjaGFuZ2VkCi0JCQkJCQlhdHRyLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJCW9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJCQkJYXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJLy8gaW5zZXJ0IGRlZmVycmVkIG5ldyBhdHRyaWJ1dGUKLQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZShuZXdBdHRyKTsKLQkJfQotCQllbHNlIGlmIChhdHRyICE9IG51bGwgJiYgb2xkVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gbm90aWZ5IGV4aXN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSByZW1vdmFsCi0JCQlhdHRyLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXNldHVwQ29udGV4dChmbGF0Tm9kZSk7Ci0KLQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJLy8gbWFrZSBzdXJlIHRoZSBwYXJlbnQgaXMgc2V0IHRvIGRlZXBlc3QgbGV2ZWwKLQkJLy8gd2hlbiBlbmQgdGFnIGhhcyBiZWVuIHJlbW92ZWQKLQkJdGhpcy5jb250ZXh0LnNldExhc3QoKTsKLQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQljbGVhbnVwVGV4dCgpOwotCQljbGVhbnVwRW5kVGFnKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVRhZ05hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCVN0cmluZyBuZXdUYWdOYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpZiAobmV3VGFnTmFtZSA9PSBudWxsIHx8ICFlbGVtZW50Lm1hdGNoVGFnTmFtZShuZXdUYWdOYW1lKSkgewotCQkJLy8gdGhlIHRhZyBuYW1lIGlzIGNoYW5nZWQKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyB0aGUgdGFnIG5hbWUgaXMgdW5jaGFuZ2VkCi0JCS8vIHRoaXMgaGFwcGVucyB3aGVuIHR5cGluZyBzcGFjZXMgYWZ0ZXIgdGhlIHRhZyBuYW1lCi0JCS8vIGRvIG5vdGhpbmcsIGJ1dC4uLgotCQkvLyBpZiBpdCdzIG5vdCBhIGNoYW5nZSBpbiB0aGUgZW5kIHRhZyBvZiBhbiBlbGVtZW50IHdpdGggdGhlIHN0YXJ0Ci0JCS8vIHRhZywKLQkJLy8gYW5kIGNhc2UgaGFzIGJlZW4gY2hhbmdlZCwgc2V0IHRvIGVsZW1lbnQgYW5kIG5vdGlmeQotCQlpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSB8fCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0UmVnaW9uVHlwZShmbGF0Tm9kZSkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCB8fCAhdGFnTmFtZS5lcXVhbHMobmV3VGFnTmFtZSkpIHsKLQkJCQllbGVtZW50LnNldFRhZ05hbWUobmV3VGFnTmFtZSk7Ci0JCQkJZWxlbWVudC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNsZWFudXBDb250ZXh0IG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhbnVwRW5kVGFnKCkgewotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCU5vZGUgbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQlpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCWlmIChlbGVtZW50LmlzRW5kVGFnKCkpIHsKLQkJCQkJCS8vIGZsb2F0aW5nIGVuZCB0YWcKLQkJCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJCQlTdHJpbmcgcm9vdE5hbWUgPSBnZXRGaW5kUm9vdE5hbWUodGFnTmFtZSk7Ci0JCQkJCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRTdGFydFRhZyh0YWdOYW1lLCByb290TmFtZSk7Ci0JCQkJCQlpZiAoc3RhcnQgIT0gbnVsbCkgewotCQkJCQkJCWluc2VydEVuZFRhZyhzdGFydCk7Ci0JCQkJCQkJLy8gbW92ZSB0aGUgZW5kIHRhZyBmcm9tICdlbGVtZW50JyB0byAnc3RhcnQnCi0JCQkJCQkJc3RhcnQuYWRkRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQkJCQkJcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQluZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIGZpcnN0ID0gbmV4dC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCQkJcGFyZW50ID0gbmV4dDsKLQkJCQkJbmV4dCA9IGZpcnN0OwotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpICYmIGVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBlbGVtZW50LmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQlFbGVtZW50SW1wbCBlbmQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kRW5kVGFnKHRhZ05hbWUpOwotCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCS8vIG1vdmUgdGhlIGVuZCB0YWcgZnJvbSAnZW5kJyB0byAnZWxlbWVudCcKLQkJCQkJCWVsZW1lbnQuYWRkRW5kVGFnKGVuZCk7Ci0JCQkJCQlyZW1vdmVFbmRUYWcoZW5kKTsKLQkJCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7IC8vIHJlc2V0IGNvbnRleHQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQluZXh0ID0gcGFyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cFRleHQoKSB7Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJTm9kZSBwcmV2ID0gKG5leHQgPT0gbnVsbCA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IG5leHQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpOwotCi0JCVRleHRJbXBsIG5leHRUZXh0ID0gbnVsbDsKLQkJVGV4dEltcGwgcHJldlRleHQgPSBudWxsOwotCQlpZiAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJbmV4dFRleHQgPSAoVGV4dEltcGwpIG5leHQ7Ci0JCX0KLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCXByZXZUZXh0ID0gKFRleHRJbXBsKSBwcmV2OwotCQl9Ci0JCWlmIChuZXh0VGV4dCA9PSBudWxsICYmIHByZXZUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChuZXh0VGV4dCAhPSBudWxsICYmIHByZXZUZXh0ICE9IG51bGwpIHsKLQkJCS8vIGNvbnNlY3V0aXZlIFRleHQgbm9kZXMgY3JlYXRlZCBieSBzZXR1cENvbnRleHQoKSwKLQkJCS8vIGNvbmNhdCB0aGVtCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV4dFRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQlwcmV2VGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJTm9kZSBuZXdOZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5leHQpOwotCQkJbmV4dCA9IG51bGw7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCX0KLQotCQlUZXh0SW1wbCBjaGlsZFRleHQgPSAocHJldlRleHQgIT0gbnVsbCA/IHByZXZUZXh0IDogbmV4dFRleHQpOwotCQlpZiAoY2hpbGRUZXh0LmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCAmJiBjaGlsZFRleHQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCkgewotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgcGFyZW50RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCWlmICghcGFyZW50RWxlbWVudC5oYXNTdGFydFRhZygpICYmICFwYXJlbnRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCWlmIChjaGlsZFRleHQuaXNXaGl0ZXNwYWNlKCkgfHwgY2hpbGRUZXh0LmlzSW52YWxpZCgpKSB7Ci0JCQkJCQkvLyBpbXBsaWNpdCBwYXJlbnQgaXMgbm90IHJlcXVpcmVkCi0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCQlOb2RlIG5ld05leHQgPSBwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQluZXdQYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50KTsKLQkJCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGRUZXh0KTsKLQkJCQkJCQluZXdQYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkVGV4dCwgbmV3TmV4dCk7Ci0JCQkJCQkJaWYgKGNoaWxkVGV4dCA9PSBuZXh0KSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZFRleHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChuZXdOZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gdHJ5IGFnYWluCi0JCQkJCQkJY2xlYW51cFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcm91dGluZSBjcmVhdGUgYW4gRWxlbWVudCBmcm9tIGNvbW1lbnQgZGF0YSBmb3IgY29tbWVudCBzdHlsZQotCSAqIGVsZW1lbnRzLCBzdWNoIGFzIFNTSSBhbmQgTUVUQURBVEEKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlTdHJpbmcgdHJpbW1lZERhdGEgPSBkYXRhLnRyaW0oKTsKLQkJQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gY29uZmlncyA9IENvbW1lbnRFbGVtZW50UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpQ29uZmlnID0gMDsgaUNvbmZpZyA8IGNvbmZpZ3MubGVuZ3RoOyBpQ29uZmlnKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2lDb25maWddOwotCQkJaWYgKChpc0pTUFRhZyAmJiAhY29uZmlnLmFjY2VwdEpTUENvbW1lbnQoKSkgfHwgKCFpc0pTUFRhZyAmJiAhY29uZmlnLmFjY2VwdFhNTENvbW1lbnQoKSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZ1tdIHByZWZpeGVzID0gY29uZmlnLmdldFByZWZpeCgpOwotCQkJZm9yIChpbnQgaVByZWZpeCA9IDA7IGlQcmVmaXggPCBwcmVmaXhlcy5sZW5ndGg7IGlQcmVmaXgrKykgewotCQkJCWlmICh0cmltbWVkRGF0YS5zdGFydHNXaXRoKHByZWZpeGVzW2lQcmVmaXhdKSkgewotCQkJCQlyZXR1cm4gY29uZmlnLmNyZWF0ZUVsZW1lbnQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLCBkYXRhLCBpc0pTUFRhZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVDb21tZW50RWxlbWVudCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCksIGRhdGEsIGlzSlNQVGFnKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIGltcGxpY2l0IEVsZW1lbnQgZm9yIGdpdmVuIHBhcmVudCBhbmQgY2hpbGQsCi0JICogc3VjaCBhcyBIVE1MLCBCT0RZLCBIRUFELCBhbmQgVEJPRFkgZm9yIEhUTUwgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlSW1wbGljaXRFbGVtZW50KE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVJbXBsaWNpdEVsZW1lbnQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLCBwYXJlbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVtb3RlTm9kZXMoTm9kZSByb290LCBOb2RlIG5ld1BhcmVudCwgTm9kZSBvbGRQYXJlbnQsIE5vZGUgbmV4dCkgewotCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQotCQkvLyBmaW5kIG5leHQKLQkJd2hpbGUgKG5leHQgPT0gbnVsbCkgewotCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybjsKLQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJCXJldHVybjsKLQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCWlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCWlmIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJLy8gZGVtb3RlIGNoaWxkcmVuCi0JCQkJCQluZXh0ID0gbmV4dENoaWxkOwotCQkJCQkJb2xkUGFyZW50ID0gbmV4dEVsZW1lbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJaWYgKG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCW5ld0VsZW1lbnQuYWRkRW5kVGFnKG5leHRFbGVtZW50KTsKLQotCQkJCQkJCWlmIChuZXdFbGVtZW50ID09IHJvb3QpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlOb2RlIHAgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQkvLyBjaGVjayBpZiByZWFjaGVkIHRvIHRvcAotCQkJCQkJCWlmIChwID09IG51bGwgfHwgcCA9PSBvbGRQYXJlbnQgfHwgcC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcDsKLQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHJlbW92ZSBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFkb25lKSB7Ci0JCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCWlmIChuZXdFbGVtZW50ID09IHJvb3QpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCU5vZGUgcCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkvLyBjaGVjayBpZiByZWFjaGVkIHRvIHRvcAotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAgPT0gb2xkUGFyZW50IHx8IHAuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybjsKLQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCWluc2VydE5vZGUobmV3RWxlbWVudCwgY2hpbGQsIG51bGwpOwotCQkJCU5vZGUgY2hpbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGNoaWxkUGFyZW50ICE9IG5ld0VsZW1lbnQpIHsKLQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgY2hpbGRQYXJlbnQ7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmaW5kIG5leHQgcGFyZW50IGFuZCBzaWJsaW5nCi0JCQl3aGlsZSAobmV4dCA9PSBudWxsKSB7Ci0JCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQlyZXR1cm47Ci0JCQkJRWxlbWVudEltcGwgb2xkRWxlbWVudCA9IChFbGVtZW50SW1wbCkgb2xkUGFyZW50OwotCi0JCQkJLy8gZHVnIHBhcmVudCBtdXN0IG5vdCBoYXZlIGNoaWxkcmVuIGF0IHRoaXMgcG9pbnQKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmICFvbGRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCQkJbmV4dCA9IG9sZEVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJCQlyZXR1cm47Ci0JCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJbmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTW9kZWxQYXJzZXJBZGFwdGVyIGdldFBhcnNlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoTW9kZWxQYXJzZXJBZGFwdGVyKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuZ2V0QWRhcHRlckZvcihNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmRSb290TmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJRE9NTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsOwotCX0KLQotCS8qKgotCSAqIGluc2VydENEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Q0RBVEFTZWN0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ0RBVEFTZWN0aW9uSW1wbCBjZGF0YSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljZGF0YSA9IChDREFUQVNlY3Rpb25JbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQ0RBVEFTZWN0aW9uKG51bGwpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoY2RhdGEgPT0gbnVsbCkgeyAvLyBDREFUQSBzZWN0aW9uIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQKLQkJCWluc2VydEludmFsaWREZWNsKGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgZGVjbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2RhdGEuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShjZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0Q29tbWVudCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Q29tbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBkYXRhID0gbnVsbDsKLQkJYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNOZXN0ZWRDb21tZW50T3BlbihyZWdpb25UeXBlKSkgewotCQkJCWlzSlNQVGFnID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IGlzTmVzdGVkQ29tbWVudFRleHQocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQkJCWRhdGEgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY3JlYXRlQ29tbWVudEVsZW1lbnQoZGF0YSwgaXNKU1BUYWcpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmICghaXNFbmRUYWcoZWxlbWVudCkpIHsKLQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCWluc2VydFN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gZW5kIHRhZwotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFN0YXJ0VGFnKHRhZ05hbWUsIHJvb3ROYW1lKTsKLQkJCQlpZiAoc3RhcnQgIT0gbnVsbCkgeyAvLyBzdGFydCB0YWcgZm91bmQKLQkJCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCQkJc3RhcnQuYWRkRW5kVGFnKGVsZW1lbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gaW52YWxpZCBlbmQgdGFnCi0JCQkJaW5zZXJ0Tm9kZShlbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlDb21tZW50SW1wbCBjb21tZW50ID0gKENvbW1lbnRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQ29tbWVudChudWxsKTsKLQkJaWYgKGNvbW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzSlNQVGFnKQotCQkJY29tbWVudC5zZXRKU1BUYWcodHJ1ZSk7Ci0JCWNvbW1lbnQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShjb21tZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnREZWNsIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnREZWNsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYm9vbGVhbiBpc0RvY1R5cGUgPSBmYWxzZTsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaXNEb2NUeXBlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpIHsKLQkJCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCQkJcHVibGljSWQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpIHsKLQkJCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLQkJCQkJc3lzdGVtSWQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCS8vIGludmFsaWQgZGVjbGFyYXRpb24KLQkJaWYgKCFpc0RvY1R5cGUpIHsKLQkJCWluc2VydEludmFsaWREZWNsKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCURvY3VtZW50VHlwZUltcGwgZG9jVHlwZSA9IChEb2N1bWVudFR5cGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHB1YmxpY0lkICE9IG51bGwpCi0JCQlkb2NUeXBlLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJZG9jVHlwZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGRvY1R5cGUpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVuZFRhZyBtZXRob2QgY2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcywgYnV0IG5vdCBvdmVycmlkZWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBuZXdQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghKChFbGVtZW50SW1wbCkgZWxlbWVudCkuaXNDb250YWluZXIoKSkgewotCQkJLy8ganVzdCB1cGRhdGUgY29udGV4dAotCQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHByb21vdGUgY2hpbGRyZW4KLQkJTm9kZSBuZXdOZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCXByb21vdGVOb2RlcyhlbGVtZW50LCBuZXdQYXJlbnQsIG5ld05leHQsIG9sZFBhcmVudCwgb2xkTmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJLy8gcmUtY2hlY2sgdGhlIG5leHQgc2libGluZwotCQluZXdOZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdQYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0RW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJCQl0YWdOYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIGVuZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgcm9vdE5hbWUgPSBnZXRGaW5kUm9vdE5hbWUodGFnTmFtZSk7Ci0JCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFN0YXJ0VGFnKHRhZ05hbWUsIHJvb3ROYW1lKTsKLQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsgLy8gc3RhcnQgdGFnIGZvdW5kCi0JCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJc3RhcnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGludmFsaWQgZW5kIHRhZwotCQlFbGVtZW50SW1wbCBlbmQgPSBudWxsOwotCQl0cnkgewotCQkJZW5kID0gKEVsZW1lbnRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGVuZCA9PSBudWxsKSB7IC8vIGludmFsaWQgZW5kIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShlbmQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0RW50aXR5UmVmKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHsKLQkJCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCQluYW1lID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRFbnRpdHlSZWZOYW1lKGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIGVudGl0eQotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBJU1NVRTogYXZvaWQgdGhpcyBjYXN0Ci0JCVN0cmluZyB2YWx1ZSA9ICgoRG9jdW1lbnRJbXBsKXRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgeyAvLyBjaGFyYWN0ZXIgZW50aXR5Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFByZXZpb3VzVGV4dCgpOwotCQkJaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBleGlzdGluZyB0ZXh0IGZvdW5kCi0JCQkJLy8gZG8gbm90IGFwcGVuZCBkYXRhCi0JCQkJdGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCS8vIG5vdGlmeSB0aGUgY2hhbmdlCi0JCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIG5ldyB0ZXh0Ci0JCQl0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCWluc2VydE5vZGUodGV4dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBnZW5lcmFsIGVudGl0eSByZWZlcmVuY2UKLQkJRW50aXR5UmVmZXJlbmNlSW1wbCByZWYgPSBudWxsOwotCQl0cnkgewotCQkJcmVmID0gKEVudGl0eVJlZmVyZW5jZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbnRpdHlSZWZlcmVuY2UobmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChyZWYgPT0gbnVsbCkgeyAvLyBlbnRpdHkgcmVmZXJlbmNlIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZWYuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShyZWYpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEludmFsaWREZWNsIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRJbnZhbGlkRGVjbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoIiEiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0SlNQVGFnIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnROZXN0ZWRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG51bGw7Ci0JCUF0dHJJbXBsIGF0dHIgPSBudWxsOwotCQlWZWN0b3IgYXR0ck5vZGVzID0gbnVsbDsKLQkJYm9vbGVhbiBpc0Nsb3NlVGFnID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc05lc3RlZFRhZ09wZW4ocmVnaW9uVHlwZSkgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJdGFnTmFtZSA9IGNvbXB1dGVOZXN0ZWRUYWcocmVnaW9uVHlwZSwgdGFnTmFtZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChpc05lc3RlZFRhZ0Nsb3NlKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaXNDbG9zZVRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IFZlY3RvcigpOwotCQkJCQlhdHRyTm9kZXMuYWRkRWxlbWVudChhdHRyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldEVxdWFsUmVnaW9uKHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh0YWdOYW1lID09IG51bGwpIHsKLQkJCWlmIChpc0Nsb3NlVGFnKSB7Ci0JCQkJLy8gY2xvc2UgSlNQIHRhZwotCQkJCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQkJaWYgKHN0YXJ0LmlzSlNQQ29udGFpbmVyKCkpIHsKLQkJCQkJCWluc2VydEVuZFRhZyhzdGFydCk7Ci0JCQkJCQlzdGFydC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gaW52YWxpZCBKU1AgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoYXR0ck5vZGVzICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGFlID0gYXR0ck5vZGVzLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoYWUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlBdHRyIGEgPSAoQXR0cikgYWUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoYSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUoYSk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudC5zZXRKU1BUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlLCBTdHJpbmcgdGFnTmFtZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBjaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChjYW5Db250YWluKGVsZW1lbnQsIG5vZGUpKSB7Ci0JCQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dCA9PSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSkgewotCQkJCQkvLyBmaXJzdCBjaGlsZCBvZiBpbXBsaWNpdCB0YWcKLQkJCQkJLy8gZGVsZXRlZ2UgdG8gdGhlIHBhcmVudAotCQkJCQlwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQluZXh0ID0gZWxlbWVudDsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIHByb21vdGUgc2libGluZ3MKLQkJCU5vZGUgbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlOb2RlIG5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV3TmV4dCk7Ci0JCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQl9Ci0KLQkJCS8vIGxlYXZlIHRoZSBvbGQgZW5kIHRhZyB3aGVyZSBpdCBpcwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQlFbGVtZW50IGVuZCA9IGVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZW5kLCBuZXdOZXh0KTsKLQkJCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQkJCW5leHQgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJaWYgKCFlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB1cGRhdGUgY29udGV4dAotCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQluZXh0ID0gbmV3TmV4dDsKLQkJCWlmIChuZXh0ICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCX0KLQotCQlpbnNlcnROb2RlKHBhcmVudCwgbm9kZSwgbmV4dCk7Ci0JCW5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIHBhcmVudCwgTm9kZSBub2RlLCBOb2RlIG5leHQpIHsKLQkJd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJaWYgKG5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIWNhbkJlSW1wbGljaXRUYWcobmV4dEVsZW1lbnQsIG5vZGUpKQotCQkJCWJyZWFrOwotCQkJcGFyZW50ID0gbmV4dEVsZW1lbnQ7Ci0JCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCUVsZW1lbnQgaW1wbGljaXRFbGVtZW50ID0gY3JlYXRlSW1wbGljaXRFbGVtZW50KHBhcmVudCwgbm9kZSk7Ci0JCWlmIChpbXBsaWNpdEVsZW1lbnQgIT0gbnVsbCkKLQkJCW5vZGUgPSBpbXBsaWNpdEVsZW1lbnQ7Ci0JCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0UEkgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhcmdldCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQl0YXJnZXQgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCX0KLQotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBudWxsKTsKLQkJaWYgKHBpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXBpLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocGkpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0YXJ0VGFnIG1ldGhvZCBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLCBidXQgbm90IG92ZXJyaWRkZW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWluc2VydE5vZGUoZWxlbWVudCk7Ci0KLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKG5ld0VsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFuZXdFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmdzCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJZGVtb3RlTm9kZXMoZWxlbWVudCwgZWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdENoaWxkKTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0U3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFN0YXJ0VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlib29sZWFuIGlzRW1wdHlUYWcgPSBmYWxzZTsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCVZlY3RvciBhdHRyTm9kZXMgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJCQl0YWdOYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQlpc0VtcHR5VGFnID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0TmFtZVJlZ2lvbihyZWdpb24pOwotCQkJCQlpZiAoYXR0ck5vZGVzID09IG51bGwpCi0JCQkJCQlhdHRyTm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCWF0dHJOb2Rlcy5hZGRFbGVtZW50KGF0dHIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJYXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIHN0YXJ0IHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQkJLy8gdHlwaWNhbGx5IGludmFsaWQgbmFtZQotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBhZSA9IGF0dHJOb2Rlcy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGFlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJQXR0ciBhID0gKEF0dHIpIGFlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWxlbWVudC5hcHBlbmRBdHRyaWJ1dGVOb2RlKGEpOwotCQkJfQotCQl9Ci0JCWlmIChpc0VtcHR5VGFnKQotCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydFN0YXJ0VGFnKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCWluc2VydFN0YXJ0VGFnKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJaW5zZXJ0RW5kVGFnKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiB8fCBpc05lc3RlZENvbW1lbnRPcGVuKHJlZ2lvblR5cGUpKSB7Ci0JCQlpbnNlcnRDb21tZW50KGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgewotCQkJaW5zZXJ0RW50aXR5UmVmKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCWluc2VydERlY2woZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgewotCQkJaW5zZXJ0UEkoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgewotCQkJaW5zZXJ0Q0RBVEFTZWN0aW9uKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc05lc3RlZFRhZyhyZWdpb25UeXBlKSkgewotCQkJaW5zZXJ0TmVzdGVkVGFnKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRUZXh0KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdOYW1lKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb250ZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0VGV4dCBtZXRob2QgQ2FuIGJlIGNhbGxlZCBmcm9tIHN1YmNsYXNzZXMsIG5vdCB0byBiZSBvdmVycmlkZWQgb3IKLQkgKiByZS1pbXBsZW1lbnRlZC4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRQcmV2aW91c1RleHQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBleGlzdGluZyB0ZXh0IGZvdW5kCi0JCQl0ZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ldyB0ZXh0Ci0JCXRleHQgPSAoVGV4dEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKHRleHQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmlzRW5kVGFnKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50LmlzRW5kVGFnKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb21vdGVOb2RlcyhOb2RlIHJvb3QsIE5vZGUgbmV3UGFyZW50LCBOb2RlIG5ld05leHQsIE5vZGUgb2xkUGFyZW50LCBOb2RlIG5leHQpIHsKLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IG51bGw7Ci0JCWlmIChuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQl9Ci0KLQkJTm9kZSByb290UGFyZW50ID0gcm9vdC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChvbGRQYXJlbnQgIT0gcm9vdFBhcmVudCkgewotCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCWJvb2xlYW4gZW5kVGFnID0gZmFsc2U7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCQlOb2RlIG5leHRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCWlmIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJCS8vIHByb21vdGUgY2hpbGRyZW4KLQkJCQkJCQluZXh0ID0gbmV4dENoaWxkOwotCQkJCQkJCW9sZFBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCQlpZiAobmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkJZW5kVGFnID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyByZW1vdmUgaW1wbGljaXQgZWxlbWVudAotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWRvbmUpIHsKLQkJCQkJaWYgKCFlbmRUYWcgJiYgbmV3RWxlbWVudCAhPSBudWxsICYmICFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJCQlOb2RlIGVsZW1lbnROZXh0ID0gbmV3RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJLy8gcHJvbW90ZSBzaWJsaW5ncwotCQkJCQkJcHJvbW90ZU5vZGVzKG5ld0VsZW1lbnQsIG5ld1BhcmVudCwgZWxlbWVudE5leHQsIG5ld0VsZW1lbnQsIG5ld05leHQpOwotCQkJCQkJbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW5ld0VsZW1lbnQgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJaW5zZXJ0Tm9kZShuZXdQYXJlbnQsIGNoaWxkLCBuZXdOZXh0KTsKLQkJCQkJTm9kZSBjaGlsZFBhcmVudCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGNoaWxkUGFyZW50ICE9IG5ld1BhcmVudCkgewotCQkJCQkJbmV3UGFyZW50ID0gY2hpbGRQYXJlbnQ7Ci0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQluZXdOZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybjsKLQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJRWxlbWVudCBlbmQgPSBudWxsOwotCQkJCWlmICghb2xkRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkgJiYgIW9sZEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCQkJCWVuZCA9IG9sZEVsZW1lbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbmQgPSBvbGRFbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCX0KLQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJaW5zZXJ0Tm9kZShuZXdQYXJlbnQsIGVuZCwgbmV3TmV4dCk7Ci0JCQkJCU5vZGUgZW5kUGFyZW50ID0gZW5kLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGVuZFBhcmVudCAhPSBuZXdQYXJlbnQpIHsKLQkJCQkJCW5ld1BhcmVudCA9IGVuZFBhcmVudDsKLQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCW5ld05leHQgPSBlbmQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKCEoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5pc0NvbnRhaW5lcigpKSB7Ci0JCQkvLyBqdXN0IHVwZGF0ZSBjb250ZXh0Ci0JCQlOb2RlIGVsZW1lbnROZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGVsZW1lbnROZXh0ICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVsZW1lbnROZXh0KTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmdzCi0JCU5vZGUgbmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJLy8gZmluZCBuZXcgcGFyZW50Ci0JCWZvciAoTm9kZSBsYXN0ID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQlicmVhazsKLQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJfQotCQlOb2RlIGxhc3RDaGlsZCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCWRlbW90ZU5vZGVzKGVsZW1lbnQsIG5ld0VsZW1lbnQsIHBhcmVudCwgbmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBuZXdOZXh0ID0gbnVsbDsKLQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJbmV3TmV4dCA9IGxhc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQllbHNlCi0JCQluZXdOZXh0ID0gbmV3RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChuZXdOZXh0ICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld0VsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5vZGUgaWYgaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGltcGxpY2l0IHRhZyB3aXRoCi0JICogcmVtYWluaW5nIGNoaWxkIG5vZGVzIHByb21vdGVkLgotCSAqLwotCXByaXZhdGUgRWxlbWVudCByZW1vdmVJbXBsaWNpdEVsZW1lbnQoTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCWlmICghZWxlbWVudC5pc0ltcGxpY2l0VGFnKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNhbkJlSW1wbGljaXRUYWcoZWxlbWVudCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGVsZW1lbnRQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKGVsZW1lbnRQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7Ci0JCU5vZGUgZWxlbWVudE5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlOb2RlIG5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQllbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCWVsZW1lbnRQYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBlbGVtZW50TmV4dCk7Ci0JCQljaGlsZCA9IG5leHRDaGlsZDsKLQkJfQotCi0JCS8vIHJlc2V0IGNvbnRleHQKLQkJaWYgKHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCkgPT0gZWxlbWVudCkgewotCQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAob2xkTmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG9sZE5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGVsZW1lbnROZXh0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVsZW1lbnROZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGVsZW1lbnRQYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmICh0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKSA9PSBlbGVtZW50KSB7Ci0JCQlpZiAoZmlyc3RDaGlsZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGZpcnN0Q2hpbGQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGVsZW1lbnROZXh0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVsZW1lbnROZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGVsZW1lbnRQYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIHJlbW92ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgb2xkUGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vZGUgPT0gb2xkUGFyZW50KSB7Ci0JCQlpZiAobmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobm9kZSA9PSBvbGROZXh0KSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJfQotCQl9Ci0KLQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCi0JCWlmIChyZW1vdmVJbXBsaWNpdEVsZW1lbnQocGFyZW50KSAhPSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGRlbW90ZSBzaWJsaW5nCi0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0VuZFRhZygpICYmICFuZXdFbGVtZW50LmlzRW1wdHlUYWcoKSAmJiBuZXdFbGVtZW50LmlzQ29udGFpbmVyKCkpIHsKLQkJCQkvLyBmaW5kIG5ldyBwYXJlbnQKLQkJCQlmb3IgKE5vZGUgbGFzdCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7IGxhc3QgIT0gbnVsbDsgbGFzdCA9IGxhc3QuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCWJyZWFrOwotCQkJCQlFbGVtZW50SW1wbCBsYXN0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQkJCWJyZWFrOwotCQkJCQluZXdFbGVtZW50ID0gbGFzdEVsZW1lbnQ7Ci0JCQkJfQotCQkJCU5vZGUgbGFzdENoaWxkID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQlkZW1vdGVOb2RlcyhwcmV2LCBuZXdFbGVtZW50LCBwYXJlbnQsIG5leHQpOwotCi0JCQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJCQlOb2RlIG5ld05leHQgPSBudWxsOwotCQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCQkJbmV3TmV4dCA9IGxhc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWVsc2UKLQkJCQkJbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChuZXdOZXh0ICE9IG51bGwpCi0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCQllbHNlCi0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld0VsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBmb3IgaW1wbGljaXQgdGFnCi0JCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChjYW5CZUltcGxpY2l0VGFnKG9sZEVsZW1lbnQpKSB7Ci0JCQlOb2RlIG5ld1BhcmVudCA9IG51bGw7Ci0JCQlOb2RlIHByZXYgPSBvbGRFbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBwcmV2RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCQlpZiAoIXByZXZFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCWlmIChwcmV2RWxlbWVudC5oYXNTdGFydFRhZygpIHx8IHByZXZFbGVtZW50Lm1hdGNoVGFnTmFtZShvbGRFbGVtZW50LmdldFRhZ05hbWUoKSkpIHsKLQkJCQkJCW5ld1BhcmVudCA9IHByZXZFbGVtZW50OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBlbGVtZW50IHNob3VsZCBzdGF5IGFzIGltcGxpY2l0IHRhZwotCQkJCS8vIGp1c3QgcmVtb3ZlIGFsbCBhdHRyaWJ1dGVzCi0JCQkJb2xkRWxlbWVudC5yZW1vdmVTdGFydFRhZygpOwotCi0JCQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJCQlOb2RlIGNoaWxkID0gb2xkRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShvbGRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIGZvciBjb21tZW50IHRhZwotCQlpZiAob2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCW9sZEVsZW1lbnQucmVtb3ZlU3RhcnRUYWcoKTsKLQotCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCU5vZGUgZWxlbWVudFBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIHBhcmVudCA9IGVsZW1lbnRQYXJlbnQ7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBmaXJzdCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlOb2RlIGZpcnN0RWxlbWVudCA9IG51bGw7IC8vIGZvciB0aGUgY2FzZSBmaXJzdCBpcyByZW1vdmVkIGFzIGVuZAotCQkvLyB0YWcKLQkJaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgbmV3IHBhcmVudCBmb3IgY2hpbGRyZW4KLQkJCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQkJZm9yIChOb2RlIGxhc3QgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJYnJlYWs7Ci0JCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQkJYnJlYWs7Ci0JCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJfQotCQkJTm9kZSBuZXh0ID0gZmlyc3Q7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV3RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkvLyBzdG9wIGF0IHRoZSBtYXRjaGVkIGludmFsaWQgZW5kIHRhZwotCQkJCQkJCU5vZGUgZWxlbWVudENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJCXdoaWxlIChlbGVtZW50Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJCQlOb2RlIG5leHRDaGlsZCA9IGVsZW1lbnRDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQluZXh0RWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCWVsZW1lbnRDaGlsZCA9IG5leHRDaGlsZDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50ID09IGZpcnN0KQotCQkJCQkJCQlmaXJzdEVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0JCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCX0KLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCX0KLQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQlpZiAobmV3RWxlbWVudCA9PSBudWxsIHx8IGNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBlbGVtZW50KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJcGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQkvLyBwcm9tb3RlIHNpYmxpbmdzCi0JCQkJTm9kZSBuZXdOZXh0ID0gbmV3RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCU5vZGUgY2hpbGQgPSBlbGVtZW50OwotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCU5vZGUgbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJbmV3RWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5ld05leHQpOwotCQkJCQljaGlsZCA9IG5leHRDaGlsZDsKLQkJCQl9Ci0KLQkJCQkvLyBsZWF2ZSB0aGUgb2xkIGVuZCB0YWcgd2hlcmUgaXQgaXMKLQkJCQlpZiAobmV3RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlFbGVtZW50IGVuZCA9IG5ld0VsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlbmQsIG5ld05leHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghbmV3RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5ld0VsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU5vZGUgbmV3TmV4dCA9IGVsZW1lbnQ7Ci0JCU5vZGUgc3RhcnRFbGVtZW50ID0gbnVsbDsgLy8gZm9yIHRoZSBjYXNlIGVsZW1lbnQgaXMgcmVtb3ZlZCBhcyBlbmQKLQkJLy8gdGFnCi0JCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkvLyBmaW5kIG5ldyBwYXJlbnQgZm9yIGludmFsaWQgZW5kIHRhZyBhbmQgc2libGluZ3MKLQkJCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQkJZm9yIChOb2RlIGxhc3QgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJYnJlYWs7Ci0JCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQkJYnJlYWs7Ci0JCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJfQotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGRlbW90ZSBpbnZhbGlkIGVuZCB0YWcgYW5kIHNpYmxpbmcKLQkJCQlOb2RlIG5leHQgPSBlbGVtZW50OwotCQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHRFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQlOb2RlIGVsZW1lbnRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoZWxlbWVudENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBlbGVtZW50Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJbmV4dEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQllbGVtZW50Q2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJCQkJfQotCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50ID09IG5ld05leHQpCi0JCQkJCQkJCXN0YXJ0RWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0KLQkJCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gcGFyZW50KQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJCWJyZWFrOyAvLyBlcnJvcgotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlpZiAoY2hpbGQgPT0gb2xkRWxlbWVudCkgewotCQkJCQkJaWYgKCFvbGRFbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJCQkJLy8gY2xvbmUgKHJlLWNyZWF0ZSkgZW5kIHRhZwotCQkJCQkJCUVsZW1lbnQgZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCQkJY2hpbGQgPSBlbmQ7Ci0JCQkJCQkJCW5ld05leHQgPSBlbmQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghb2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQkvLyBjbG9uZSAocmUtY3JlYXRlKSBlbmQgdGFnCi0JCQkJCUVsZW1lbnQgZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGVuZCwgb2xkRWxlbWVudCk7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCQkJCQluZXdOZXh0ID0gZW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJbmV3TmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChvbGRFbGVtZW50KTsKLQkJfQotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgb2xkUGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWlmIChlbGVtZW50ID09IG9sZFBhcmVudCkgewotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShvbGROZXh0KTsgLy8gcmVzZXQgZm9yIG5ldyBwYXJlbnQKLQkJCX0KLQkJCWVsc2UgaWYgKG5ld05leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCA9PSBvbGROZXh0KSB7Ci0JCQlpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShmaXJzdEVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoZmlyc3QgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGFydEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHN0YXJ0RWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVJbXBsaWNpdEVsZW1lbnQoZWxlbWVudFBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJTm9kZUltcGwgbmV4dCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbmV4dC5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5leHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlyZW1vdmVOb2RlKG5leHQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvciBlbXB0eSBUZXh0Ci0JCQkJCS8vIHJlbW92ZSBhbmQgY29udGludWUKLQkJCQkJcmVtb3ZlTm9kZShuZXh0KTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV4dDsKLQkJCQlib29sZWFuIGlzU2hhcmVkID0gdGV4dC5pc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlpZiAoaXNTaGFyZWQpIHsKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZXJlIGlzIG5leHQgVGV4dCBub2RlIHNoYXJpbmcgdGhpcwotCQkJCQlUZXh0SW1wbCBuZXh0VGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmROZXh0VGV4dCgpOwotCQkJCQlpZiAobmV4dFRleHQgPT0gbnVsbCB8fCAhbmV4dFRleHQuaGFzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCQkJCWlzU2hhcmVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGV4dC5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIHBhcnRpYWwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCQkvLyByZW1vdmVkCi0JCQkJCXJlbW92ZU5vZGUodGV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJCQl0ZXh0Lm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQkvLyBpZiBzaGFyZWQsIGNvbnRpbnVlIHRvIHJlbW92ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJLy8gZnJvbSB0aGVtCi0JCQkJaWYgKGlzU2hhcmVkKQotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpIHx8IGVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJCXJlbW92ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGNoaWxkKTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJLy8gaW1wbGljaXQgZWxlbWVudAotCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCWlmIChlbmQuaGFzRW5kVGFnKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbmQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmICghZW5kLmhhc1N0YXJ0VGFnKCkgJiYgIWVuZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZW5kKTsKLQkJCQlyZW1vdmVOb2RlKGVuZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCXJlbW92ZUVuZFRhZyhlbmQpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbmV4dCA9IChOb2RlSW1wbCkgZW5kLmdldE5leHRTaWJsaW5nKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGFyZW50ID0gZW5kLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlUmVnaW9ucyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqIEBwYXJhbSBvbGRSZWdpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0Jdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5jb250ZXh0ID0gbmV3IFhNTE1vZGVsQ29udGV4dCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpOwotCi0JCS8vIG9wdGltaXplIHR5cGljYWwgY2FzZXMKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWNoYW5nZUVuZFRhZyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgbWV0aG9kCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5jb250ZXh0ID0gbmV3IFhNTE1vZGVsQ29udGV4dCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpOwotCi0JCWludCBuZXdDb3VudCA9IChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgPyBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpIDogMCk7Ci0JCWludCBvbGRDb3VudCA9IChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgPyBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpIDogMCk7Ci0KLQkJaWYgKG9sZENvdW50ID4gMCkgewotCQkJc2V0dXBDb250ZXh0KG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCQkvLyBOb2RlIHN0YXJ0UGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQotCQkJRW51bWVyYXRpb24gZSA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobmV3Q291bnQgPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlzZXR1cENvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKTsKLQkJfQotCQkvLyBtYWtlIHN1cmUgdGhlIHBhcmVudCBpcyBzZXQgdG8gZGVlcGVzdCBsZXZlbAotCQkvLyB3aGVuIGVuZCB0YWcgaGFzIGJlZW4gcmVtb3ZlZAotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCi0JCWlmIChuZXdDb3VudCA+IDApIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqIHNldHVwQ29udGV4dCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBDb250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCS8vIGF0IHRoZSBiZWdnaW5pbmcgb2YgZG9jdW1lbnQKLQkJCU5vZGUgY2hpbGQgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocm9vdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBtaWdodCBiZSBhdCB0aGUgZW5kIG9mIGRvY3VtZW50Ci0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShyb290KTsKLQkJCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2Zmc2V0ID09IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCVRleHQgbmV4dFRleHQgPSB0ZXh0LnNwbGl0VGV4dChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCWlmIChuZXh0VGV4dCA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0VGV4dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAob2Zmc2V0ID49ICgoTm9kZUltcGwpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSkKLQkJCQljb250aW51ZTsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobm9kZSk7Ci0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE1vZGVsQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2JiYzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsVXBkYXRlciBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxVcGRhdGVyIHsKLQlwcml2YXRlIGludCBkaWZmID0gMDsKLQlwcml2YXRlIGludCBnYXBMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGdhcE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgbmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxVcGRhdGVyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCQl0aGlzLmdlbmVyYXRvciA9IG1vZGVsLmdldEdlbmVyYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0clZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhdHRyTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShBdHRyIGF0dHJOb2RlKSB7Ci0JCWlmIChhdHRyTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJOb2RlOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlzdGFydCArPSBuYW1lUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUgdGFpbGluZyBzcGFjZXMKLQkJZW5kICs9IG5hbWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCi0JCXJlcGxhY2VTb3VyY2UobmFtZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0clZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhdHRyTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyVmFsdWUoQXR0ciBhdHRyTm9kZSkgewotCQlpZiAoYXR0ck5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyTm9kZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQljaGFyIHF1b3RlID0gMDsgLy8gbm8gcXVvdGUgcHJlZmVyZW5jZQotCQkJLy8gRFc6IDQvMTYvMjAwMyBkdWUgdG8gY2hhbmdlIGluIHN0cnVjdHVyZWREb2N1bWVudCAuLi4gd2UgbmVlZCBhCi0JCQkvLyBmbGF0bm9kZSB0bwotCQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlCi0JCQkvLyBmaXJzdAotCQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlTdHJpbmcgb2xkVmFsdWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkVmFsdWUuY2hhckF0KDApOwotCQkJCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQkJCXF1b3RlID0gZmlyc3RDaGFyOwotCQkJCX0KLQkJCX0KLQotCQkJSVRleHRSZWdpb24gc3RhcnRSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQotCQkJdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyLCBxdW90ZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXZhbHVlID0gbmV3IFN0cmluZygpOwotCQkJCS8vIHJlbW92ZSBlcXVhbCB0b28KLQkJCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQkJCQlpZiAoZXF1YWxSZWdpb24gIT0gbnVsbCkKLQkJCQkJc3RhcnRSZWdpb24gPSBlcXVhbFJlZ2lvbjsKLQkJCX0KLQkJCWF0dHIuc2V0VmFsdWVSZWdpb24odmFsdWVSZWdpb24pOyAvLyByZXNldCB2YWx1ZQotCi0JCQlzdGFydCArPSBzdGFydFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZSB0YWlsaW5nCi0JCQkvLyBzcGFjZXMKLQkJCWVuZCArPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQotCQkJdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uID09IG51bGwpCi0JCQkJCXJldHVybjsgLy8gbm90aG5nIHRvIGRvCi0JCQkJdmFsdWUgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJLy8gcmVtb3ZlIGVxdWFsCi0JCQkJc3RhcnQgKz0gZXF1YWxSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQllbmQgKz0gZXF1YWxSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZQotCQkJCQkvLyB0YWlsaW5nIHNwYWNlcwotCQkJCQlzdGFydCArPSBlcXVhbFJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUKLQkJCQkJLy8gdGFpbGluZyBzcGFjZXMKLQkJCQkJc3RhcnQgKz0gbmFtZVJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJCXZhbHVlID0gJz0nICsgdmFsdWU7Ci0JCQkJfQotCQkJCWVuZCA9IHN0YXJ0OwotCQkJfQotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZSh2YWx1ZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBjaGFuZ2VFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaW50IG9mZnNldCA9IGltcGwuZ2V0RW5kU3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWltcGwuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCkpOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZU5hbWUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHN1cHBvcnQgY2hhbmdpbmcgbmFtZSBvZiBhdHRyaWJ1dGUgZm9yIHNldFByZWZpeCgpCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJY2hhbmdlQXR0ck5hbWUoKEF0dHIpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm47Ci0JfQotCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIGZ1dHVyZV9UT0RPOiBvcHRpbWl6ZQotCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihmbGF0Tm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIGZhbGxiYWNrIG1ldGhvZCB0byByZWdlbmVyYXRlIHRoZSBzdGFydCB0YWcuCi0JICovCi0Jdm9pZCBjaGFuZ2VTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoIWltcGwuaGFzU3RhcnRUYWcoKSAmJiAhaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgdGFncwotCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VDaGlsZChwYXJlbnQsIGVsZW1lbnQsIGVsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIGVsc2UgZXJyb3IKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0JCWlmIChpbXBsLmhhc1N0YXJ0VGFnKCkpIHsKLQkJCWVuZCA9IGltcGwuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWltcGwuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKSk7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXh0RW5kID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJCWlmIChuZXh0T2Zmc2V0IDwgb2xkRW5kICYmIG5leHRFbmQgPiBvbGRPZmZzZXQpIHsKLQkJCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChlbmRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG93bmVyTm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyTm9kZTsKLQkJCWlmIChpc0VuZFRhZykgewotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdXBkYXRlQXR0clJlZ2lvbnMoZWxlbWVudCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgb3duZXJOb2RlOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlpbnQgbmV3T2Zmc2V0ID0gb2xkT2Zmc2V0OwotCQkJCWludCBuZXdFbmQgPSBvbGRFbmQ7Ci0JCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQluZXdPZmZzZXQgKz0gdGhpcy5kaWZmOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV3RW5kID0gdGhpcy5nYXBPZmZzZXQ7Ci0JCQkJfQotCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkobmV3T2Zmc2V0LCBuZXdMZW5ndGgsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChvZmZzZXQgPT0gb2xkT2Zmc2V0ICYmIGVuZCA9PSBvbGRFbmQpIHsKLQkJCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoZW5kID4gb2xkRW5kKSB7Ci0JCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG9sZEVuZCk7Ci0JCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihwcm94eSk7Ci0JCQkJCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJCWVuZCArPSB0aGlzLmRpZmY7Ci0JCQkJfQotCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWludCBuZXdPZmZzZXQgPSBvbGRPZmZzZXQ7Ci0JCQkJCQlpbnQgbmV3RW5kID0gb2xkRW5kOwotCQkJCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCW5ld09mZnNldCArPSB0aGlzLmRpZmY7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluZXdFbmQgPSB0aGlzLmdhcE9mZnNldDsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShuZXdPZmZzZXQsIG5ld0xlbmd0aCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0KLQkJCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZW5kIDw9IG9sZE9mZnNldCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKG9mZnNldCA9PSBvbGRPZmZzZXQgJiYgZW5kID09IG9sZEVuZCkgewotCQkJCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaWYgKGVuZCA+IG9sZEVuZCkgewotCQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJCQlwcm94eS5zZXRMZW5ndGgoZW5kIC0gb2xkRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJCQlpZiAoZW5kIDwgb2xkRW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQkJCQllbmQgKz0gdGhpcy5kaWZmOwotCQkJCQkJfQotCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW93bmVyTm9kZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUZXh0RGF0YShUZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2UodGV4dCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCQlpbnQgb2Zmc2V0ID0gc3RhcnQ7Ci0KLQkJLy8gbWFrZSBzdXJlIHByZXZpb3VzIHRhZyBpcyBjbG9zZWQKLQkJTm9kZSBwcmV2ID0gdGV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZVRhZyA9IGdldENsb3NlVGFnKChJRE9NTm9kZSkgcHJldik7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCW9mZnNldCArPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJc291cmNlID0gcHJlVGFnICsgc291cmNlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlTdHJpbmcgcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQlvZmZzZXQgKz0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlidWZmZXIuYXBwZW5kKHByZVRhZyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJCQkJaWYgKHRleHQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmICFlbGVtZW50Lmhhc0VuZFRhZygpICYmIChlbGVtZW50LmlzSlNQQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCkpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJaWYgKHBvc3RUYWcgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3N0TGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQkJCQlpZiAocG9zdExlbmd0aCA+IDApIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChwb3N0VGFnKTsKLQkJCQkJCQkJaW50IHBvc3RPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkocG9zdE9mZnNldCwgcG9zdExlbmd0aCk7Ci0JCQkJCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBpbXBsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJaW1wbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZVZhbHVlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQljaGFuZ2VUZXh0RGF0YSgoVGV4dCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZSgoQXR0cikgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdGFydFRhZygoRWxlbWVudCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2Uobm9kZSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlOb2RlSW1wbCBpbXBsID0gKE5vZGVJbXBsKSBub2RlOwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCi0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoc3RhcnQsIGxlbmd0aCk7Ci0JCWltcGwuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0clZhbHVlQ2xvc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgb3BlbiBKU1AgdGFnCi0JCWJvb2xlYW4gY2xvc2VKU1BUYWcgPSBmYWxzZTsKLQkJaW50IG9mZnNldCA9IHZhbHVlLmluZGV4T2YoSlNQVGFnLlRBR19PUEVOKTsKLQkJd2hpbGUgKG9mZnNldCA+PSAwKSB7Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDIpOwotCQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCQljbG9zZUpTUFRhZyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfT1BFTiwgb2Zmc2V0ICsgMik7Ci0JCX0KLQotCQkvLyBjaGVjayBxdW90ZQotCQlib29sZWFuIGNsb3NlUXVvdGUgPSBmYWxzZTsKLQkJY2hhciBmaXJzdENoYXIgPSB2YWx1ZS5jaGFyQXQoMCk7Ci0JCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQlpZiAoY2xvc2VKU1BUYWcgfHwgbGVuZ3RoID09IDEgfHwgdmFsdWUuY2hhckF0KGxlbmd0aCAtIDEpICE9IGZpcnN0Q2hhcikgewotCQkJCWNsb3NlUXVvdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjbG9zZUpTUFRhZyAmJiAhY2xvc2VRdW90ZSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChjbG9zZUpTUFRhZykKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLlRBR19DTE9TRSk7Ci0JCWlmIChjbG9zZVF1b3RlKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdENoYXIpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2F0aGVyIGNsb3NlIHRhZ3MgcmVjdXJzaXZlbHkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xvc2VUYWcoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuaXNDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKG5vZGUpOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIGVuZCB0YWcgaXMgbm90IGNsb3NlZAotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQ2xvc2VUYWcoZWxlbWVudCk7Ci0JCX0KLQotCQkvLyBubyBlbmQgdGFnCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgZWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQlpZiAoIWVsZW1lbnQuaXNTdGFydFRhZ0Nsb3NlZCgpKSB7Ci0JCQkJaWYgKGVsZW1lbnQucHJlZmVyRW1wdHlUYWcoKSkKLQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQlTdHJpbmcgY2xvc2VUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCWlmIChjbG9zZVRhZyAhPSBudWxsKSB7Ci0JCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBjbG9zZVRhZyA9IGdldENsb3NlVGFnKGxhc3RDaGlsZCk7Ci0JCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTdGFydENsb3NlVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmlzU3RhcnRUYWdDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQlTdHJpbmcgY2xvc2VUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl0aGlzLmdhcE9mZnNldCA9IDA7Ci0JCXRoaXMuZ2FwTGVuZ3RoID0gMDsKLQkJdGhpcy5kaWZmID0gMDsKLQkJdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGludCBlbmRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpIDwgZW5kT2Zmc2V0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpID49IHN0YXJ0T2Zmc2V0KQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG5ld09mZnNldCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgbmV3RW5kID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gbmV3T2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJaW50IG5leHRFbmQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCQkJaWYgKG5leHRPZmZzZXQgPCBuZXdFbmQgJiYgbmV4dEVuZCA+IG5ld09mZnNldCkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIGNoaWxkID0gdGhpcy5uZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgY2hpbGQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMubmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHRoaXMucGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5wYXJlbnROb2RlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG5ld09mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXVwZGF0ZUF0dHJSZWdpb25zKGVsZW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG93bmVyTm9kZTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQgJiYgb2xkRW5kID09IG5ld0VuZCkgewotCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQpIHsKLQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IG5ld1Byb3h5ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KCk7Ci0JCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2xkT2Zmc2V0KTsKLQkJCQkJCW5ld1Byb3h5LnNldExlbmd0aChuZXdFbmQgLSBvbGRPZmZzZXQpOwotCQkJCQkJbmV3UHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5KTsKLQkJCQkJfQotCQkJCQlwcm94eS5zZXRPZmZzZXQobmV3RW5kKTsKLQkJCQkJcHJveHkuc2V0TGVuZ3RoKG9sZEVuZCAtIG5ld0VuZCk7Ci0JCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJveHkpOwotCQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQkJaWYgKG9sZEVuZCA8IG5ld0VuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaW50IG9mZnNldCA9IGNvbnRlbnQuZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGVuZCA9IGNvbnRlbnQuZ2V0RW5kKCk7Ci0JCQkJCWlmIChlbmQgPD0gbmV3T2Zmc2V0KQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChvZmZzZXQgPT0gbmV3T2Zmc2V0ICYmIGVuZCA9PSBuZXdFbmQpIHsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJCWlmIChlbmQgPiBuZXdFbmQpIHsKLQkJCQkJCQlpZiAob2Zmc2V0ID09IG5ld09mZnNldCkgewotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBuZXdQcm94eSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpOwotCQkJCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQkJCQkJbmV3UHJveHkuc2V0TGVuZ3RoKG5ld0VuZCAtIG9mZnNldCk7Ci0JCQkJCQkJCW5ld1Byb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5LCBpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG5ld0VuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG5ld0VuZCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJaWYgKGVuZCA9PSBuZXdFbmQpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvbGRFbmQgPCBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJfQotCQllbHNlIGlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlpZiAoY291bnQgPiAxKQotCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJZWxzZQotCQkJCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWlmIChjb3VudCA+IDEpCi0JCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBnYXBFbmQgPSB0aGlzLmdhcE9mZnNldCArIHRoaXMuZ2FwTGVuZ3RoOwotCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWludCBvbGRFbmQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCWlmIChvbGRPZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQgJiYgb2xkRW5kIDw9IGdhcEVuZCkKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZwotCQlpbnQgb2xkTGVuZ3RoID0gb2xkRW5kIC0gb2xkT2Zmc2V0OwotCQlpZiAob2xkT2Zmc2V0ID49IGdhcEVuZCkKLQkJCW9sZE9mZnNldCArPSB0aGlzLmRpZmY7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIG93bmVyRW5kVGFnID0gbnVsbDsKLQkJVGV4dEltcGwgb3duZXJUZXh0ID0gbnVsbDsKLQkJd2hpbGUgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubmV4dE5vZGU7Ci0JCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJb3duZXJUZXh0ID0gdGV4dDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlpZiAoZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQlvd25lckVuZFRhZyA9IGVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAob3duZXJUZXh0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBvd25lclRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2xkT2Zmc2V0LCBvbGRMZW5ndGgpOwotCQkJCW93bmVyVGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCX0KLQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJLy8gc2hhcmVkCi0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvbGRPZmZzZXQsIG9sZExlbmd0aCk7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJCQkJLy8gc2hhcmVkCi0JCQkJCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9sZE9mZnNldCwgb2xkTGVuZ3RoKTsKLQkJCWlmIChvd25lckVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbmRUYWcuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQXR0ciBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXZvaWQgcmVwbGFjZUF0dHIoRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChvd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgb3duZXJFbGVtZW50OwotCQlpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCWJvb2xlYW4gaW5zZXJ0U3BhY2UgPSBmYWxzZTsKLQkJU3RyaW5nIGF0dHJWYWx1ZUNsb3NlID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJQXR0ckltcGwgaW1wbCA9IChBdHRySW1wbCkgb2xkQXR0cjsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBpbXBsLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGltcGwuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxhc3RSZWdpb24gPSBpbXBsLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVuZCArPSBuYW1lUmVnaW9uLmdldEVuZCgpOwotCQkJCQlsYXN0UmVnaW9uID0gbmFtZVJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjaGVjayB0aGVyZSBhcmUgZXh0cmEgc3BhY2UgYmVmb3JlIHRoZSBsYXN0IGF0dHJpYnV0ZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkgLSAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVnaW9uID09IGxhc3RSZWdpb24pIHsKLQkJCQkJaWYgKGkgKyAxIDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJCW5leHRSZWdpb24gPSByZWdpb25zLmdldChpICsgMSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYm9vbGVhbiBpc0xhc3RBdHRyID0gZmFsc2U7Ci0JCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgaXNOZXN0ZWRUYWdDbG9zZShyZWdpb25UeXBlKSkgewotCQkJCQlpc0xhc3RBdHRyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNMYXN0QXR0ciAmJiBwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydCArPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCX0KLQotCQkJLy8gaW1wbC5yZXNldFJlZ2lvbnMob3duZXJFbGVtZW50KTsKLQkJCWltcGwucmVzZXRSZWdpb25zKGVsZW1lbnQpOwotCQl9Ci0JCWVsc2UgeyAvLyBhcHBlbmQgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCi0JCQlhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwgJiYgYXR0clZhbHVlQ2xvc2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCXN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJZW5kID0gc3RhcnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJaW50IGF0dHJTdGFydCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJaWYgKHJlZ2lvbkVuZCA9PSByZWdpb24uZ2V0VGV4dEVuZCgpKQotCQkJCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCQlhdHRyU3RhcnQgPSByZWdpb25FbmQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoYXR0clN0YXJ0ID09IDApCi0JCQkJCXJldHVybjsgLy8gbm90IGZvdW5kLCBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCXN0YXJ0ICs9IGF0dHJTdGFydDsKLQkJCQllbmQgPSBzdGFydDsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IDI7Ci0JCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCQlzaXplICs9IGF0dHJWYWx1ZUNsb3NlLmxlbmd0aCgpOwotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJOYW1lKG5ld0F0dHIpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQlzaXplICs9IG5hbWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShuZXdBdHRyKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCXNpemUgKz0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzaXplKTsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQkJaWYgKGluc2VydFNwYWNlKQotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCX0KLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHJlcGxhY2VDaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwgJiYgb2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGVuZCA9IDA7Ci0JCVN0cmluZyBwcmVUYWcgPSBudWxsOwotCQlTdHJpbmcgcG9zdFRhZyA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIHBvc3RFbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9sZENoaWxkICE9IG51bGwpIHsKLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIG9sZENoaWxkOwotCQkJc3RhcnQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQllbmQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG9sZENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0JCQlub2RlLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyByZXNldCB2YWx1ZXMgZnJvbQotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQl9Ci0JCWVsc2UgewotCQkJTm9kZUltcGwgcHJldiA9IChOb2RlSW1wbCkgbmV3Q2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJc3RhcnQgPSBwcmV2LmdldEVuZE9mZnNldCgpOwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJCXByZVRhZyA9IGdldENsb3NlVGFnKHByZXYpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZmlyc3QgY2hpbGQKLQkJCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBuZXdDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQgPSBuZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVuZCA9IHN0YXJ0OwotCQkJCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKChJRE9NRWxlbWVudCkgcGFyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5ld2x5IGhhdmluZyBhIGNoaWxkCi0JCQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudE5vZGU7Ci0JCQkJCQlpZiAoZWxlbWVudC5pc0VtcHR5VGFnKCkpIHsgLy8gZW1wdHkgdGFnIGZvcm1hdAotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCQkJCQllbmQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0ID0gZW5kIC0gMjsgLy8gZm9yICIvPiIKLQkJCQkJCQllbGVtZW50LnNldEVtcHR5VGFnKGZhbHNlKTsKLQkJCQkJCQlwcmVUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlwb3N0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICghZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCQkJc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJZW5kID0gc3RhcnQ7Ci0JCQkJCQkJLy8gaW52YWxpZCBlbmQgdGFnIG9yIGltcGxpY2l0IHRhZwotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IHRhZwotCQkJCQkJCXByZVRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJaWYgKHByZVRhZyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHN0YXJ0LCBsZW5ndGgpOwotCQkJCQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQkJCS8vIGltcGxpY2l0IHRhZwotCQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFncwotCQkJCQkJCQlwb3N0VGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJCXBvc3RFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdGFydCA9IGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCQkJCQllbmQgPSBzdGFydDsKLQkJCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCWlmIChwcmVUYWcgIT0gbnVsbCAmJiBwcmVUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiAoZWxlbWVudC5pc0pTUENvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNDREFUQUNvbnRhaW5lcigpKSkgewotCQkJCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZwotCQkJCQkJCQkJcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJCQkJcG9zdEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGVsc2UgbWlnaHQgRE9DVU1FTlRfTk9ERSwgc3RhcnQgYW5kIGVuZCBhcmUgMAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBvZmZzZXQgPSBzdGFydDsKLQkJCWlmIChwcmVUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJYnVmZmVyLmFwcGVuZChwcmVUYWcpOwotCQkJCX0KLQkJCX0KLQotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlpZiAoZWxlbWVudC5wcmVmZXJFbXB0eVRhZygpKQotCQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCVN0cmluZyBzdGFydFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChzdGFydFRhZyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gc3RhcnRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGNvbnRlbnQgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVNvdXJjZShub2RlKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJCWludCBsZW5ndGggPSBjb250ZW50Lmxlbmd0aCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQl9Ci0JCQkJCW5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJbm9kZSA9IGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChub2RlID09IG5ld0NoaWxkKSB7Ci0JCQkJCQlub2RlID0gbnVsbDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCQkJbm9kZSA9IG5leHQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCW5vZGUgPSAoTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJY29udGludWU7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwb3N0VGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHBvc3RUYWcpOwotCQkJCQlpZiAocG9zdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlwb3N0RWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoc3RhcnQgPT0gZW5kICYmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIG5vIHRoaW5nIGNoYW5nZWQKLQkJCXJldHVybjsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQkvLyBmdXR1cmVfVE9ETzogb3B0aW1pemUKLQotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXBzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ucmVwbGFjZVRleHQoKSBhbmQgc2V0cyBjb250ZXh0dWFsCi0JICogaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VTb3VyY2UoU3RyaW5nIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWludCBpbnNlcnRlZCA9IDA7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJZWxzZQotCQkJaW5zZXJ0ZWQgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZW1vdmVkID0gZW5kIC0gc3RhcnQ7Ci0JCWlmIChpbnNlcnRlZCA9PSAwICYmIHJlbW92ZWQgPT0gMCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmdhcE9mZnNldCA9IHN0YXJ0OwotCQl0aGlzLmdhcExlbmd0aCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZGlmZiA9IGluc2VydGVkIC0gcmVtb3ZlZDsKLQkJLy8gTm90ZTogZHVlIHRvIGJ1ZwotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzYxOQotCQkvLyBmb3Igbm93IGFzc3VtZSAiaWdub3JlIHJlYWRvbmx5IiByZWdpb24gaXMgb2sgLS0gYXNzdW1lIERPTSBpdHNlbGYKLQkJLy8gY2hlY2tzIGlmCi0JCS8vIG9rIHRvIGluc2VydCBvciBub3QuIEluIHJlYWxpdHksIHdlIG1heSBoYXZlIHRvIG1ha2Ugb3IgImNvbnRhaW5zIgotCQkvLyBtZXRob2QgbW9yZQotCQkvLyBiZXR0ZXIuIE9yLCB3ZSBtYXkgaGF2ZSB0byAicGVyY3VsYXRlIHVwIiB0aGUgcGFyYW1ldGVyIGZvciBjbGllbnRzCi0JCS8vIHRvIHRlbGwgdXMgcHJvZ3JhbWF0aWNhbGx5Ci0JCS8vIHRoYXQgaXRzIG9rIHRvIGluc2VydC9mb3JtYXQgaW4gYSByZWFkLW9ubHkgcmVnaW9uLgotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLm1vZGVsLCB0aGlzLmdhcE9mZnNldCwgdGhpcy5nYXBMZW5ndGgsIHNvdXJjZSwgdHJ1ZSk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUVudW1lcmF0aW9uIGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQlFbnVtZXJhdGlvbiBlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQkJfQotCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCQkvLyBtYWtlIHN1cmUgdG8gcmVzdG9yZSBhbGwgYmFja3VwZWQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCS8vIG1ha2Ugc3VyZSB0byByZXN0b3JlIGFsbCBiYWNrdXBlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcih0aGlzLmdhcE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQXR0clJlZ2lvbnMoRWxlbWVudCBlbGVtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0KLQkJLy8gdXBkYXRlIGF0dHJpYnV0ZXMKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9IC0xOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKCsraW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIHJlc2V0IG90aGVyIHJlZ2lvbnMKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzMjhkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuZCBwYXJzZXMgZmlyc3Qgb2YgWE1MIGZpbGUgdG8gZ2V0IGVuY29kaW5nLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgewotCi0JLyoqCi0JICogWE1MTG9hZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4ZGVhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhbiBYTUwgZmlsZSBhbmQgY3JlYXRlcyBhbiBYTUwgU3RydWN0dXJlZCBNb2RlbC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQotCXB1YmxpYyBYTUxEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgZGVmYXVsdCwgVVRGLTggYXMgcGVyIFhNTCBzcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIobmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjE2ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTDsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRYTUwgaW1wbGVtZW50cyBFbWJlZGRlZFR5cGVIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIExpc3Qgc3VwcG9ydGVkTWltZVR5cGVzOwotCXB1YmxpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9FbWJlZGRlZFhNTCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29udGVudHR5cGUuRW1iZWRkZWRYTUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1iZWRkZWRYTUwuCi0JICovCi0JcHVibGljIEVtYmVkZGVkWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2dldEFkYXB0ZXJGYWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCgpKTsKLQkJLy8gZmFjdG9yaWVzLmFkZEFsbChQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3JpZXModGhpcykpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNnZXRGYW1pbHlJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYW1pbHlJZCgpIHsKLQkJcmV0dXJuIE1vZGVsSGFuZGxlckZvclhNTC5Bc3NvY2lhdGVkQ29udGVudFR5cGVJRDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKSB7Ci0JCWlmIChzdXBwb3J0ZWRNaW1lVHlwZXMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGVkTWltZVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC94bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJLy9UT0RPOiBpbml0aWFsaXplCi0JfQotCi0JLyoKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjaW5pdGlhbGl6ZVBhcnNlcihSZWdpb25QYXJzZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUgZm9yICJwdXJlIiBYTUwKLQkJLy8gY29tcGFyZSB3aXRoIFhIVE1MCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gdW5kbyBhbnl0aGluZyB3ZSBkaWQgaW4gaW5pdGlhbGl6ZQotCi0JfQotCi0JcHVibGljIHZvaWQgdW5pbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCS8vIG5lZWQgdG8gdW5kbyBhbnl0aGluZyB3ZSBkaWQgaW4gaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZSA9IGdldFN1cHBvcnRlZE1pbWVUeXBlcygpLmNvbnRhaW5zKG1pbWVUeXBlKTsKLQkJaWYoIWNhbkhhbmRsZSkgewotCQkJY2FuSGFuZGxlID0gbWltZVR5cGUuZW5kc1dpdGgoIit4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3N2EyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGdlbmVyaWMgWE1MIG1vZGVsIGhhbmRsaW5nLiBJdCBpcyBhbHNvIG1hcmtlZCBhcyB0aGUgZGVmYXVsdAotICogY29udGVudCB0eXBlIGhhbmRsZXIuIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGRlZmF1bHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9yWE1MKCkgewotCQlzdXBlcigpOwkKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YTUxNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI5YmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkRlYnVnQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUl9FTkNPRElORyA9ICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFhNTExvYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJLy8gRG9lcyBYTUwgbmVlZCBwcm9wYWdhdGluZyBhZGFwdGVyPyBPciBqdXN0IEpTUD8KLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRE9NTW9kZWxJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQotCQlpZiAoRGVidWcuZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMpIHsKLQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgRGVidWdBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUzNjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MKCkgewotCQlzdXBlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZURvY3VtZW50TWFuYWdlcihDTURvY3VtZW50TWFuYWdlciBtZ3IpIHsKLQkJc3VwZXIuY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKG1ncik7Ci0JCW1nci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVNZTkNfTE9BRCwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIElTU1VFOiB0aGlzICJmb3JjZXMiIGEgbmV3IG9uZSB0byBhbHdheXMgYmUgY3JlYXRlZC9yZXR1cm5lZCwgCi0JICogbm90ICJjYWNoZWQiIG9uIHRoZSBub2RlLiBUaGF0IHNlZW1zIGluY29ycmVjdC4gCi0JICogU2ltcGx5IHVzaW5nIHNob3VsZFJlZ2lzdGVyRmFsc2Ugc2hvdWxkIHdvcmssIGV4Y2VwdCwgCi0JICogdGhlcmUgbWlnaHQgaGF2ZSBiZWVuIG9uZSB0aGVyZSB0aGF0IHNvbWVvbmUgZWxzZSBhbHJlYWR5IAotCSAqIGV4cGxpY2l0bHkgcHV0IHRoZXJlLCBzbyB0aGlzIGlzIG9ubHkgd2F5IEkga25vdyB0byAKLQkgKiBvdmVycmlkZSB0aGF0LiBFc3BlY2lhbGx5IGNvbXBsaWNhdGVkIGhlcmUgc2luY2UgYSBudW1iZXIKLQkgKiBvZiBhZGFwdGVycyBhcmUgZm9yIE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBvYmplY3QpIHsKLQkJcmV0dXJuIGFkYXB0TmV3KG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWI1YzA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JSVN0cnVjdHVyZWRNb2RlbCBzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQlwcml2YXRlIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpIHsKLQkJdGhpcyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQljbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCXN0YXRlTm90aWZpZXIgPSBuZXdNb2RlbDsKLQkJCXVwZGF0ZVJlc29sdmVyKHN0YXRlTm90aWZpZXIpOwotCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCX0KLQotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b0xvYWRDTSgpIHsKLQkJLy8gdW50aWwgdGhlIGV4aXN0ZW5jZSBvZiBhIENNRG9jdW1lbnRSZXF1ZXN0ZXJGYWN0b3J5IHRvIGNyZWF0ZSB0aGUKLQkJLy8gbG9hZCByZXF1ZXN0cywKLQkJLy8gcmV0dXJuIHRydWUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKENNRG9jdW1lbnRNYW5hZ2VyIG1ncikgewotCQkvLyB0aGlzIGRlcGVuZHMgb24gdGhlcmUgYmVpbmcgYSBDTURvY3VtZW50UmVxdWVzdGVyRmFjdG9yeSBpbnN0YWxsZWQKLQkJbWdyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQsIGF1dG9Mb2FkQ00oKSk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0KLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLmRpc3BsYXlJbmZvKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQlzdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCXN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBudWxsOwotCQkJCVN0cmluZyBtb2RlbEJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCWlmIChtb2RlbEJhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBQYXRoKG1vZGVsQmFzZUxvY2F0aW9uKS50b0ZpbGUoKTsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKG1vZGVsQmFzZUxvY2F0aW9uKTsKLQkJCQkJCUlQYXRoIGRlcml2ZWRQYXRoID0gbnVsbDsKLQkJCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJCQkJZGVyaXZlZFBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZGVyaXZlZFBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGJhc2VQYXRoKTsKLQkJCQkJCWlmIChkZXJpdmVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gZGVyaXZlZFBhdGgudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheUluZm8pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC4uLiBiYXNlTG9jYXRpb24gOiAiICsgYmFzZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSA9IG5ldyBDTURvY3VtZW50Q2FjaGUoKTsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBudWxsOwotCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBudWxsOwotCi0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLmRpc3BsYXlJbmZvKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqWE1MTW9kZWxRdWVyeUltcGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyIHJlc29sdmVyID0gbW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCQlpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwgfHwgcmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQltb2RlbFF1ZXJ5ID0gbmV3IFhNTE1vZGVsUXVlcnlJbXBsKGNtRG9jdW1lbnRDYWNoZSwgaWRSZXNvbHZlcik7Ci0KLQkJCQkvLyBjcyB0b2RvLi4uCi0JCQkJLy8gZm9yIG5vdyB3ZSBjcmVhdGUgYSBDTURvY3VtZW50Q2FjaGUgb24gYSAncGVyIGVkaXRvcicgYmFzaXMKLQkJCQkvLyBpbiB0aGUgZnV0dXJlIHdlIG5lZWQgdG8gc3VwcG9ydCBhIENNRG9jdW1lbnRDYWNoZSB0aGF0IGlzCi0JCQkJLy8gc2hhcmVkIGJldHdlZW4gZWRpdG9ycwotCQkJCS8vIG5zZCBjb21tZW50OiBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIGRlcGVuZGluZyBvbgotCQkJCUNNRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQlpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKGRvY3VtZW50TWFuYWdlcik7Ci0JCQkJfQotCQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbCA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwoY21Eb2N1bWVudENhY2hlLCBtb2RlbFF1ZXJ5LCBpZFJlc29sdmVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJaWYgKHN0YXRlTm90aWZpZXIgIT0gbnVsbCkKLQkJCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCQlzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCAhPSBudWxsKQotCQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsLnJlbGVhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID0gbmV3IEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzU3MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBNb2RlbFF1ZXJ5IChhbmQgcmVsYXRlZCBkYXRhKSB3aXRoIGEKLSAqIERvY3VtZW50IChvciBJU3RydWN0dXJlZE1vZGVsKS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZShEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0Q01Eb2N1bWVudENhY2hlKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcihEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0SWRSZXNvbHZlcigpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmICgoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHx8IG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldE1vZGVsUXVlcnkoKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnlBZGFwdGVyIGdldE1vZGVsUXVlcnlBZGFwdGVyKERvY3VtZW50IG5vZGUpIHsKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQkJCXJlc3VsdCA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTENhdGFsb2dJZFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OGFhNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTENhdGFsb2dJZFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLy8gVE9ETyBjcyA6IHJlbW92ZSB0aGlzIGNsYXNzIGFuZCB1dGlsaXplIHRoZSBjb21tb24gVVJJUmVzb2x2ZXIgZGlyZWN0bHkKLS8vIFdlIG5lZWQgdG8gdXBkYXRlIHNvbWUgb2YgdGhlIE1vZGVsUXVlcnkgcmVsYXRlZCBjb2RlIHRvIHBhc3MgdGhlCi0vLyAnYmFzZUxvY2F0aW9uJyB0aHJ1Ci0vLyBhbmQgdGhlbiB0aGVyZSdsbCBiZSBub2RlIG5lZWQgZm9yIHRoaXMgY2xhc3MuCi0vLyAKLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nSWRSZXNvbHZlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXIgewotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQotCXByb3RlY3RlZCBVUklSZXNvbHZlciB1cmlyZXNvbHZlcjsKLQotCXByaXZhdGUgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nSWRSZXNvbHZlcihTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbikgewotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBYTUxDYXRhbG9nSWRSZXNvbHZlcihTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiwgVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIpIHsKLQkJdGhpcyhyZXNvdXJjZUxvY2F0aW9uKTsKLS8vIHRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCB0d28gbnVsbCBhcmd1bWVudHMuCi0vLyBJZiBzbywgYW4gYXNzZXJ0IHdpbGwgb2NjdXIgbGF0ZXIgd2hlbiByZXNvbHZlIGlzIGNhbGxlZC4gCi0vLyBTZWUgMTE4MzcxIFhNTENhdGFsb2dJZFJlc29sdmVyI3Jlc29sdmUgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbgotLy8KLS8vIGJ1dCwgSSdtIG5vdCBlbmFibGluZyB0aGlzIGNoZWNrIG5vdyBkdWUgdG8gbGF0ZW5lc3MgaW4gY3ljbGUuIAkJCi0vLwkJaWYgKHJlc291cmNlTG9jYXRpb24gPT0gbnVsbCAmJiB1cmlyZXNvbHZlciA9PSBudWxsKSB7Ci0vLwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJvdGggbG9jYXRpb24gYW5kIHJlc29sdmVyIGNhbiBub3QgYmUgbnVsbCIpOwotLy8JCX0KLQkJdGhpcy51cmlyZXNvbHZlciA9IHVyaXJlc29sdmVyOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2VMb2NhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRSZXNvdXJjZUxvY2F0aW9uKCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJaWYgKHVyaXJlc29sdmVyICE9IG51bGwpCi0JCQkJbG9jYXRpb24gPSB1cmlyZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCi0JCVN0cmluZyByZXN1bHQgPSBzeXN0ZW1JZDsKLQkJaWYgKGJhc2UgPT0gbnVsbCkgewotCQkJYmFzZSA9IGdldFJlc291cmNlTG9jYXRpb24oKTsKLQkJCS8vIGJ1ZyAxMTczMjAsIGVuc3VyZSBiYXNlIFVSSSBpcyAncHJvdG9jYWwnIHF1YWxpZmllZCBiZWZvcmUKLQkJCS8vIHBhc3NpbmcgaXQgdGhydSB0byBVUklSZXNvbHZlcgotCQkJLy8gYnVnIDExNzQyNCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gYXNzdW1lIHRoYXQgdGhlIGJhc2UgbG9jYXRpb24KLQkJCS8vIGlzIG5vbi1udWxsCi0JCQlBc3NlcnQuaXNOb3ROdWxsKGJhc2UsICJCYXNlIGxvY2F0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIG5vbiBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQliYXNlID0gVVJJSGVscGVyLmFkZEltcGxpZWRGaWxlUHJvdG9jb2woYmFzZSk7Ci0JCX0KLQkJcmVzdWx0ID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2UsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBsb2dpY2FsTG9jYXRpb24pIHsKLQkJLy8gVGhpcyBjbGFzcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHRvIHBlcmZvcm0gcGh5c2ljYWwgcmVzb2x1dGlvbiEKLQkJLy8gSWYgaXQgZG9lcyB3ZSBzaG91bGQgbG9nIGl0IGFzIGFuIGVycm9yCi0JCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCAiWE1MQ2F0YWxvZ0lEUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oKSBjYWxsZWQgdW5leHBlY3RlZGx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxvZ2ljYWxMb2NhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQ3MGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuWE1MQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyCi0gKiAKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdCB3aWxsCi0gKiBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCi0JcHVibGljIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihjYWNoZSk7Ci0JCXRoaXMuaWRSZXNvbHZlciA9IGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQotCQkvLyBDUyA6IHNwb29reSBjb2RlIGFsZXJ0IQotCQkvLyB0aGlzIGxvb2sgcmVhbGx5IHN0cmFuZ2UgYmVjYXVzZSB3ZSdyZSBwYXNzaW5nIG51bGwgaW4gYXMgdGhlIGZpcnN0Ci0JCS8vIGFyZ3VtZW50Ci0JCS8vIGhvd2V2ZXIgd2UncmUgYXNzdW1pbmcgdGhlIHVzZSBvZiBhICdmdWRnZWQnIFVSSVJlc29sdmVyIHRoYXQga25vd3MKLQkJLy8gdGhlCi0JCS8vIGNvcnJlY3QgYmFzZUxvY2F0aW9uIGFuZCB3aWxsIGNhbGwgdG8gdGhlIFVSSVJlc29sdmVyIGZyYW1ld29yawotCQkvLyBwcm9wZXJseQotCi0JCS8vIENTIDogbm90ZSB0aGF0IHdlIHNob3VsZCBuZXZlciBjYWxsIHJlc29sdmVQaHlzaWNhbCBhdCB0aGlzIHBvaW50LgotCQkvLyBQaHlzaWNhbCByZXNvbHV0aW9uIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4gd2UncmUgaW50ZXJlc3RpbmcgdG8KLQkJLy8gb3BlbmluZyB0aGUgYWN0dWFsIHN0cmVhbS4KLQkJLy8gVGhlIENNRG9jdW1lbnRGYWN0b3J5IGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHJlc3BvbnNpYmxlIGZvcgotCQkvLyBjYWxsaW5nIHJlc29sdmVQaHlzaWNhbC4KLQkJLy8gQWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyByZXR1cm4gYSAnbG9naWNhbCcgVVJJCi0KLQkJaWYgKGlkUmVzb2x2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5MmE3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW92YWJsZU1vZGVsUXVlcnk7Ci0KLQotcHVibGljIGNsYXNzIFhNTE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb3ZhYmxlTW9kZWxRdWVyeSB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGZDYWNoZSA9IG51bGw7Ci0KLQlwdWJsaWMgWE1MTW9kZWxRdWVyeUltcGwoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcikpOwotCQlmQ2FjaGUgPSBjYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vdmFibGVNb2RlbFF1ZXJ5I3NldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyID0gbmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0Jsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDIwNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhcnRpdGlvblR5cGU7Ci0KLQkvKioKLQkgKiBBIEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGxpa2UgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCSAqIGJ1dCBpcyB0aGUgcmVzdWx0IG9mIGEgImJsb2NrIHNjYW4iLgotCSAqLwotCXB1YmxpYyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoKSB7Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IG51bGwpIHsKLQkJCS8vIGV2ZW50dWFsbHkgY2FuIGxvb2sgdXAgc3Vycm91bmRpbmdUYWcgbmFtZQotCQkJLy8gYnV0IHRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IGVudGVuZGVkIGZvciBmdXR1cmUKLQkJCS8vIGV4dGVuc2liaWxpdHkuIFRoaXMgbWF5IGNoYW5nZS4KLQkJCS8vcGFydGl0aW9uVHlwZSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuIiArIHRhZ25hbWU7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uVHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQl0aGlzLnBhcnRpdGlvblR5cGUgPSBwYXJ0aXRpb25UeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkYzdlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElUZXh0UmVnaW9uQ29udGFpbmVyIHsKLQlwcm90ZWN0ZWQgaW50IGxlbmd0aDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnM7Ci0JcHJvdGVjdGVkIGludCBzdGFydDsKLQlwcm90ZWN0ZWQgaW50IHRleHRMZW5ndGg7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCi0JcHVibGljIENvbnRleHRSZWdpb25Db250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSAiZGVlcCIgcGFyZW50aW5nIGlzIG5vdCBub3JtYWwsIGJ1dCBqdXN0IGluIGNhc2UuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IF9nZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJLy8gZ28gdXAgZW5vdWdoIHBhcmVudHMgdG8gZ2V0IHRvIGRvY3VtZW50Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIHdvdWxkIGJlIGFuIGVycm9yIG5vdCB0byBiZSBjb250YWluZXIsIGJ1dAotCQkJLy8gd29uJ3QgY2hlY2sgZm9yIGl0IG5vdwotCQkJcGFyZW50ID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gKChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBwYXJlbnQpLmdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQotCQlzdGFydCArPSBpOwotCQkvLyBJIGVycm9uZW91c2x5IGFkZGVkIGxlbmd0aCBhbmQgdGV4dExlbmd0aAotCQkvLyBUT0RPOiBtYXkgd2FudCB0byByZW5hbWUgdGhpcyBtZXRob2QgdG8gYWRqdXN0U3RhcnQKLQkJLy9sZW5ndGggKz0gaTsKLQkJLy90ZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJbGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgKz0gaTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSBpICYmIGkgPCBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGdldEVuZE9mZnNldChjb250YWluZWRSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gZXF1YXRlIHBvc2l0aW9ucy4gY2xpZW50cyBtYXkgKHdpbGwgcHJvYmFibHkpCi0JICogc3RpbGwgbmVlZCB0byBtYWtlIGNhbGxzIHRvIGVxdWF0ZSByZWdpb25zLCBwYXJlbnQsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJdGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJLy8gb3VyIHN0YXJ0T2Zmc2V0IHRha2UgaW50byBhY2NvdW50IG91ciBwYXJlbnQsIGFuZCBvdXIgc3RhcnQKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyBnZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgKyBjb250YWluZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0RnVsbFRleHQodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIE11c3QgYmUgcHJveGllZCBoZXJlIHNpbmNlIGFSZWdpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGNoaWxkIG9mCi0JCS8vICp0aGlzKiBjb250YWluZXIgYW5kIGluZGV4ZWQgZnJvbQotCQkvLyB0aGlzIGNvbnRhaW5lcidzIG9mZnNldAotCQlyZXR1cm4gcGFyZW50LmdldEZ1bGxUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0ICsgYVJlZ2lvbi5nZXRTdGFydCgpLCBzdGFydCArIGFSZWdpb24uZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLmdldChnZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlciBvZmZzZXQgcmVmZXJzIHRvIHRoZSBvdmVyYWxsIG9mZnNldCBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJLy8gdHJhbnNmb3JtIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IHRvIHRoZSAic2NhbGUiIHRoYXQKLQkJCS8vIHJlZ2lvbnMgYXJlIHN0b3JlZCBpbiwgd2hpY2ggYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUKLQkJCS8vIHN0YXJ0IHBvaW50LgotCQkJLy9pbnQgdHJhbnNmb3JtZWRPZmZzZXQgPSBvZmZzZXQgLSBnZXRTdGFydE9mZnNldCgpOwotCQkJLy8KLQkJCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uKHMpIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246OmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0OiAiICsgcmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZXF1ZXN0ZWQgb2Zmc2V0OiAiICsgb2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIHRyYW5zZm9ybWVkT2Zmc2V0OiAiICsKLQkJCQkJLy8gdHJhbnNmb3JtZWRPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBzdGFydDogIiArIHJlZ2lvbi5nZXRTdGFydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gZW5kOiAiICsgcmVnaW9uLmdldEVuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gdHlwZTogIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBjbGFzczogIiArIHJlZ2lvbi5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmICgoZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBnZXRFbmRPZmZzZXQocmVnaW9uKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0U3RhcnRPZmZzZXQoKSArIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJLy8gaXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBudWxsIHRvIHRoaXMgbWV0aG9kCi0JCS8vIElTU1VFOiBuZWVkIGJldHRlciAic3BlYyIgb24gZXJyb3IgYmVoYXZpb3I6IAotCQkvLyBmb3Igbm93IHdpbGwgcmV0dXJuIHplcm8gYXMgdGhpcyB3aWxsIHJvdWdobHkgCi0JCS8vIHdvcmsgZm9yIHNvbWUgY2FzZXMgKGFuZCBhdm9pZCBOUEUpLgotCQlpZiAoY29udGFpbmVkUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgY29udGFpbmVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogc2FtZSBhcyBnZXRGdWxsVGV4dCBmb3IgdGhpcyByZWdpb24gdHlwZSAuLi4gZG8gd2UgbmVlZCB0byB0YWtlIHdoaXRlCi0JICogc3BhY2Ugb2ZmPwotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcGFyZW50RG9jdW1lbnQgPSBfZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCXJlc3VsdCA9IHBhcmVudERvY3VtZW50LmdldChzdGFydCwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvZ3JhbSBlcnJvcjogdW5yZWFjaGFibGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIE11c3QgYmUgcHJveGllZCBoZXJlIHNpbmNlIGFSZWdpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGNoaWxkIG9mCi0JCS8vICp0aGlzKiBjb250YWluZXIgYW5kIGluZGV4ZWQgZnJvbQotCQkvLyB0aGlzIGNvbnRhaW5lcidzIG9mZnNldAotCQlyZXR1cm4gcGFyZW50LmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQgKyBhUmVnaW9uLmdldFN0YXJ0KCksIHN0YXJ0ICsgYVJlZ2lvbi5nZXRUZXh0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIHN0YXJ0ICsgdGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCS8vIG91ciBzdGFydE9mZnNldCB0YWtlIGludG8gYWNjb3VudCBvdXIgcGFyZW50LCBhbmQgb3VyIHN0YXJ0Ci0JCS8vIChwYSkgMTAvNCBjaGFuZ2VkIHRvIGJlIGJhc2VkIG9uIHRleHQgZW5kCi0JCS8vICAgICAgICAgICBpdCB1c2VkIHRvIHJldHVybiBpbmNvcnJlY3QgdmFsdWUgZm9yIGVtYmVkZGVkIHJlZ2lvbiBjb250YWluZXJzCi0JCS8vCi0KLQkJLy8gVE9ETyBDUklUSUNBTCAtLSBuZWVkIHRvIHJlLXdvcmsgdGhpcyB3b3JrIGFyb3VuZCwgc28gZG9lc24ndAotCQkvLyBkZXBlbmQgb24gWE1MUmVnaW9uQ29udGV4dAotCQkvLwkJLy8gdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIDIyNjgyMy8vLy8vLy8vLy8vCi0JCS8vCQlmb3IgKGludCBpID0gcmVnaW9ucy5zaXplKCkgLSAxOyBpID49IDAgJiYgcmVnaW9uLmdldFR5cGUoKSA9PQotCQkvLyBYTUxSZWdpb25Db250ZXh0LldISVRFX1NQQUNFOyBpLS0pCi0JCS8vCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJLy8JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gPT0gY29udGFpbmVkUmVnaW9uKSB7Ci0JCQkJCXJlc3VsdCA9IGdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgKyByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiB0ZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBpKSB7Ci0JCWxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnRSZWdpb24pIHsKLQkJcGFyZW50ID0gcGFyZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGNvbnRhaW5lZFJlZ2lvbnMpIHsKLQkJcmVnaW9ucyA9IGNvbnRhaW5lZFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGV4dExlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXR5cGUgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9ICJDb250YWluZXIhISEgIiArIHNob3J0Q2xhc3NOYW1lICsgIi0tPiAiICsgZ2V0VHlwZSgpICsgIjogIiArIGdldFN0YXJ0KCkgKyAiLSIgKyBnZXRUZXh0RW5kKCkgKyAoZ2V0VGV4dEVuZCgpICE9IGdldEVuZCgpID8gKCIvIiArIGdldEVuZCgpKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBGVVRVUkVfVE9fRE86IG5lZWQgdG8gaW1wbGVtZW50IHJlZ2lvbiBsZXZlbCBwYXJzaW5nIGluCi0JCS8vIElUZXh0UmVnaW9uQ29udGFpbmVyOjp1cGRhdGVNb2RlbAotCQkvLyBuZXZlciBiZWluZyBjYWxsZWQ/Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3MTU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwODkzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9SZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vbmV3UmVnaW9uLnNldFBhcmVudChwYXJlbnQpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1ZGYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUwxME5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDcvNS8wNSAxOjQwIEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNAotICogb24gNy81LzA1IDE6NDAgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+RDovYnVpbGRzL1dvcmtzcGFjZXMvUHVyZUhlYWRXVFBfTTcvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXg8L3R0PgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MMTBOYW1lcyB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAyMDQ4OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxMVwwXDFcMVwxXDJcMlwwXDFcMVwyMlwwXDFcMVwxNFwwXDFcMFwyXDAiKwotICAgICJcMTJcMFwxXDNcNlwwXDMyXDNcNFwwXDFcM1wxXDBcMzJcM1w3NFwwXDFcMCIrCi0gICAgIlwxMFwwXDI3XDNcMVwwXDM3XDNcMVwwXDcyXDNcMlwwXDEzXDNcMlwwXDEwXDMiKwotICAgICJcMVwwXDY1XDNcMVwwXDEwNFwzXDExXDBcNDRcM1wzXDBcMlwzXDRcMFwzNlwzIisKLSAgICAiXDcwXDBcMTMxXDNcMjJcMFw3XDNcMTZcMFwyXDBcNTZcMFwxMDZcMFwzMlwwXDJcMCIrCi0gICAgIlw0NFwwXDFcM1wxXDBcM1wzXDFcMFwxXDNcMVwwXDI0XDNcMVwwXDU0XDMiKwotICAgICJcMVwwXDdcM1wzXDBcMVwzXDFcMFwxXDNcMVwwXDFcM1wxXDBcMVwzIisKLSAgICAiXDFcMFwyMlwzXDE1XDBcMTRcM1wxXDBcMTAyXDNcMVwwXDE0XDNcMVwwXDQ0XDMiKwotICAgICJcMVwwXDRcMFwxMVwwXDY1XDNcMlwwXDJcM1wyXDBcMlwzXDNcMFwzNFwzIisKLSAgICAiXDJcMFwxMFwzXDJcMFwyXDNcNjdcMFw0NlwzXDJcMFwxXDNcN1wwXDQ2XDMiKwotICAgICJcMTJcMFwyMVwwXDFcMFwyN1wwXDFcMFwzXDBcMVwwXDFcMFwxXDBcMlwwIisKLSAgICAiXDFcMFwxXDBcMTNcMFwzM1wzXDVcMFwzXDNcNTZcMFwzMlwzXDVcMFwxXDAiKwotICAgICJcMTJcM1wxMFwwXDE1XDBcMTJcMFw2XDBcMVwwXDEwN1wzXDJcMFw1XDNcMVwwIisKLSAgICAiXDE3XDNcMVwwXDRcM1wxXDBcMVwzXDE3XDBcMlwzXDJcMFwxXDBcNFwwIisKLSAgICAiXDJcMFwxMlwwXHUwMjA3XDBcM1wwXDFcMFw2NVwzXDJcMFwxXDBcMVwzXDIwXDAiKwotICAgICJcM1wwXDRcMFwzXDBcMTJcM1wyXDBcMlwwXDEyXDBcMjFcMFwzXDBcMVwwIisKLSAgICAiXDEwXDNcMlwwXDJcM1wyXDBcMjZcM1wxXDBcN1wzXDFcMFwxXDNcM1wwIisKLSAgICAiXDRcM1wyXDBcMVwwXDFcMFw3XDBcMlwwXDJcMFwyXDBcM1wwXDExXDAiKwotICAgICJcMVwwXDRcMFwyXDNcMVwwXDNcM1wyXDBcMlwwXDEyXDBcMlwzXDIwXDAiKwotICAgICJcMVwwXDJcMFw2XDNcNFwwXDJcM1wyXDBcMjZcM1wxXDBcN1wzXDFcMCIrCi0gICAgIlwyXDNcMVwwXDJcM1wxXDBcMlwzXDJcMFwxXDBcMVwwXDVcMFw0XDAiKwotICAgICJcMlwwXDJcMFwzXDBcMTNcMFw0XDNcMVwwXDFcM1w3XDBcMTJcMFwyXDAiKwotICAgICJcM1wzXDE0XDBcM1wwXDFcMFw3XDNcMVwwXDFcM1wxXDBcM1wzXDFcMCIrCi0gICAgIlwyNlwzXDFcMFw3XDNcMVwwXDJcM1wxXDBcNVwzXDJcMFwxXDBcMVwzIisKLSAgICAiXDEwXDBcMVwwXDNcMFwxXDBcM1wwXDIyXDBcMVwzXDVcMFwxMlwwXDIxXDAiKwotICAgICJcM1wwXDFcMFwxMFwzXDJcMFwyXDNcMlwwXDI2XDNcMVwwXDdcM1wxXDAiKwotICAgICJcMlwzXDJcMFw0XDNcMlwwXDFcMFwxXDNcNlwwXDNcMFwyXDBcMlwwIisKLSAgICAiXDNcMFwxMFwwXDJcMFw0XDBcMlwzXDFcMFwzXDNcNFwwXDEyXDBcMjJcMCIrCi0gICAgIlwyXDBcMVwwXDZcM1wzXDBcM1wzXDFcMFw0XDNcM1wwXDJcM1wxXDAiKwotICAgICJcMVwzXDFcMFwyXDNcM1wwXDJcM1wzXDBcM1wzXDNcMFwxMFwzXDFcMCIrCi0gICAgIlwzXDNcNFwwXDVcMFwzXDBcM1wwXDFcMFw0XDBcMTFcMFwxXDBcMTdcMCIrCi0gICAgIlwxMVwwXDIxXDBcM1wwXDFcMFwxMFwzXDFcMFwzXDNcMVwwXDI3XDNcMVwwIisKLSAgICAiXDEyXDNcMVwwXDVcM1w0XDBcN1wwXDFcMFwzXDBcMVwwXDRcMFw3XDAiKwotICAgICJcMlwwXDExXDBcMlwzXDRcMFwxMlwwXDIyXDBcMlwwXDFcMFwxMFwzXDFcMCIrCi0gICAgIlwzXDNcMVwwXDI3XDNcMVwwXDEyXDNcMVwwXDVcM1w0XDBcN1wwXDFcMCIrCi0gICAgIlwzXDBcMVwwXDRcMFw3XDBcMlwwXDdcMFwxXDNcMVwwXDJcM1w0XDAiKwotICAgICJcMTJcMFwyMlwwXDJcMFwxXDBcMTBcM1wxXDBcM1wzXDFcMFwyN1wzXDFcMCIrCi0gICAgIlwyMFwzXDRcMFw2XDBcMlwwXDNcMFwxXDBcNFwwXDExXDBcMVwwXDEwXDAiKwotICAgICJcMlwzXDRcMFwxMlwwXDIyMVwwXDU2XDNcMVwwXDFcM1wxXDBcMlwzXDdcMCIrCi0gICAgIlw1XDBcNlwzXDFcMFwxMFwwXDFcMFwxMlwwXDQ3XDBcMlwzXDFcMFwxXDMiKwotICAgICJcMlwwXDJcM1wxXDBcMVwzXDJcMFwxXDNcNlwwXDRcM1wxXDBcN1wzIisKLSAgICAiXDFcMFwzXDNcMVwwXDFcM1wxXDBcMVwzXDJcMFwyXDNcMVwwXDJcMyIrCi0gICAgIlwxXDBcMVwzXDFcMFwyXDNcNlwwXDFcMFwyXDBcMVwzXDJcMFw1XDMiKwotICAgICJcMVwwXDFcMFwxXDBcNlwwXDJcMFwxMlwwXDc2XDBcMlwwXDZcMFwxMlwwIisKLSAgICAiXDEzXDBcMVwwXDFcMFwxXDBcMVwwXDFcMFw0XDBcMlwwXDEwXDNcMVwwIisKLSAgICAiXDQxXDNcN1wwXDI0XDBcMVwwXDZcMFw0XDBcNlwwXDFcMFwxXDBcMVwwIisKLSAgICAiXDI1XDBcM1wwXDdcMFwxXDBcMVwwXDM0NlwwXDQ2XDNcMTJcMFw0N1wzXDExXDAiKwotICAgICJcMVwzXDFcMFwyXDNcMVwwXDNcM1wxXDBcMVwzXDFcMFwyXDNcMVwwIisKLSAgICAiXDVcM1w1MVwwXDFcM1wxXDBcMVwzXDFcMFwxXDNcMTNcMFwxXDNcMVwwIisKLSAgICAiXDFcM1wxXDBcMVwzXDNcMFwyXDNcM1wwXDFcM1w1XDBcM1wzXDFcMCIrCi0gICAgIlwxXDNcMVwwXDFcM1wxXDBcMVwzXDFcMFwxXDNcM1wwXDJcM1wzXDAiKwotICAgICJcMlwzXDFcMFwxXDNcNTBcMFwxXDNcMTFcMFwxXDNcMlwwXDFcM1wyXDAiKwotICAgICJcMlwzXDdcMFwyXDNcMVwwXDFcM1wxXDBcN1wzXDUwXDBcMVwzXDRcMCIrCi0gICAgIlwxXDNcMTBcMFwxXDNcdTBjMDZcMFwyMzRcM1w0XDBcMTMyXDNcNlwwXDI2XDNcMlwwIisKLSAgICAiXDZcM1wyXDBcNDZcM1wyXDBcNlwzXDJcMFwxMFwzXDFcMFwxXDNcMVwwIisKLSAgICAiXDFcM1wxXDBcMVwzXDFcMFwzN1wzXDJcMFw2NVwzXDFcMFw3XDNcMVwwIisKLSAgICAiXDFcM1wzXDBcM1wzXDFcMFw3XDNcM1wwXDRcM1wyXDBcNlwzXDRcMCIrCi0gICAgIlwxNVwzXDVcMFwzXDNcMVwwXDdcM1wzMjNcMFwxNVwwXDRcMFwxXDBcMTA0XDAiKwotICAgICJcMVwzXDNcMFwyXDNcMlwwXDFcM1wxMjFcMFwzXDNcdTBlODJcMFwxXDBcMVwwIisKLSAgICAiXDFcM1wzMVwwXDExXDNcNlwwXDFcMFw1XDBcMTNcMFwxMjRcM1w0XDBcMlwwIisKLSAgICAiXDJcMFwyXDBcMlwwXDEzMlwzXDFcMFwzXDBcNlwwXDUwXDNcdTFjZDNcMFx1NTFhNlwzIisKLSAgICAiXHUwYzVhXDBcdTJiYTRcM1x1Mjg1Y1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMVwxXDJcNFwxIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbN107Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1JPV01BUCA9IHp6VW5wYWNrUm93TWFwKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1JPV01BUF9QQUNLRURfMCA9Ci0gICAgIlwwXDBcMFw0XDBcMTBcMFwxNFwwXDIwXDBcMjRcMFwzMCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrUm93TWFwKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzddOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrUm93TWFwKFpaX1JPV01BUF9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tSb3dNYXAoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGhpZ2ggPSBwYWNrZWQuY2hhckF0KGkrKykgPDwgMTY7Ci0gICAgICByZXN1bHRbaisrXSA9IGhpZ2ggfCBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVFJBTlMgW10gPSB7Ci0gICAgMSwgMSwgLTEsIDIsIC0xLCAtMSwgLTEsIC0xLCAyLCAzLCAKLSAgICA0LCAyLCAyLCAzLCA0LCA1LCAtMSwgNCwgNCwgNiwgCi0gICAgNSwgNSwgNCwgNSwgNiwgNiwgLTEsIDYsIAotICB9OwotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQVRUUklCVVRFID0genpVbnBhY2tBdHRyaWJ1dGUoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQVRUUklCVVRFX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDExXDVcMSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzddOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQXR0cmlidXRlKFpaX0FUVFJJQlVURV9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBdHRyaWJ1dGUoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB6elB1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAvL3ByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIC8vcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy9wcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvL3ByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBYTUwxME5hbWVzKCkgewotCQl0aGlzLnp6UmVhZGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLQkJfQotCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLQkJCS8vICJub3QiCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyMjYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLS8vICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0vLyAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0vLwotLy8gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0vLyAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotLy8gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0genpQdXNoYmFja1BvcyA9IDA7Ci0vLyAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0vLyAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0vLyAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0vLyAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLS8vICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotLy8gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0vLyAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLS8vICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0vLyAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotLy8KLS8vICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLS8vICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICAgIHsge3JldHVybiBmYWxzZTt9IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWZjNmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUYWdQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5DaGFyU2VxdWVuY2VSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGFrZXMgaW5wdXQgZnJvbSB0aGUgSFRNTFRva2VuaXplciBhbmQgY3JlYXRlcyBhIHRhZyBsaXN0Ci0gKi8KLQotcHVibGljIGNsYXNzIFhNTFNvdXJjZVBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciwgQmxvY2tUYWdQYXJzZXIsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciwgSVJlZ2lvbkNvbXBhcmlibGUsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbiB7Ci0JLy8gbWFkZSBwdWJsaWMgdG8gYWlkIGFjY2VzcyBmcm9tIGlubmVyIGNsYXNzZXMgaW4gaGllcmFyY2h5LgotCS8vIFRPRE86IGluIGZ1dHVyZSwgZmlndXJlIG91dCBob3cgdG8gc29sdmUgd2l0aG91dCBleHBvc2luZyBkYXRhLgotCXB1YmxpYyBDaGFyU2VxdWVuY2UgZkNoYXJTZXF1ZW5jZVNvdXJjZSA9IG51bGw7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50SW5wdXQ7Ci0JcHJvdGVjdGVkIGludCBmT2Zmc2V0ID0gMDsKLQkvLyBETVc6IDIvMTIvMDMuIFJlbW92ZWQgc29tZSBzdGF0ZSBkYXRhLCBzaW5jZSBub3QgcmVhbGx5IG5lZWRlZCwKLQkvLyBhbmQgc2luY2UgaXQgYWRkZWQgYSBsb3QgdG8gb3ZlcmhlYWQgKHNpbmNlIHNvIG1hbnkgcmVnaW9ucyBhcmUKLQkvLyBjcmVhdGVkLgotCS8vIHByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZk5vZGVzID0gbnVsbDsKLQkvLyBwcm90ZWN0ZWQgTGlzdCBmUmVnaW9ucyA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIE9iamVjdCBmSW5wdXQgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlN0cmluZ0lucHV0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnM7Ci0KLQlwcm90ZWN0ZWQgQmxvY2tUb2tlbml6ZXIgZlRva2VuaXplciA9IG51bGw7Ci0JcHJvdGVjdGVkIGxvbmcgc3RhcnRUaW1lOwotCXByb3RlY3RlZCBsb25nIHN0b3BUaW1lOwotCi0JLyoqCi0JICogSFRNTFNvdXJjZVBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxTb3VyY2VQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgc2ltcGxlIHV0aWxpdHkgdG8gY291bnQgbm9kZXMuIFVzZWQgb25seSBmb3IgZGVidWcKLQkgKiBzdGF0ZW1lbnRzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgX2NvdW50Tm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBub2RlczsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkuYWRkQmxvY2tNYXJrZXIobWFya2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcikgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5hZGQoaGFuZGxlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5CbG9ja1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJZ2V0VG9rZW5pemVyKCkuYmVnaW5CbG9ja1RhZ1NjYW4obmV3VGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG51bGw7Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkKLQkJCW5ld05vZGUgPSBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuWE1MX0JMT0NLKTsKLQkJZWxzZQotCQkJbmV3Tm9kZSA9IFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5YTUwpOwotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZSkgewotCQkvLyBuZXZlciBsZXQgYW4gRXhjZXB0aW9ucyBmcm9tIGZvcmVpZ24gY29kZSBpbnRlcmZlcmUgd2l0aCBjb21wbGV0aW9uCi0JCS8vIG9mIHBhcnNpbmcuIFRvIGdldCBhbiBleGNlcHRpb24gaGVyZSBpcyBkZWZpbml0ZWx5IGEgcHJvZ3JhbSBlcnJvcgotCQkvLyBzb21ld2hlcmUsCi0JCS8vIHdlIGNhbid0IGFmZm9yZCB0byBpbnRlcnJ1cHQgdGhlIGZsb3cgb2YgY29udHJvbC4gb3IgYmFja3dhcmRzCi0JCS8vIHR5cGluZyBjYW4gcmVzdWx0IQotCQkvLyAKLQkJLy8gCi0JCXRyeSB7Ci0JCQlpZiAoZkN1cnJlbnROb2RlICE9IG51bGwgJiYgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5zaXplKCk7IGkrKykKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuZ2V0KGkpKS5ub2RlUGFyc2VkKGZDdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyIGdldEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCUxpc3QgbWFya2VycyA9IGdldFRva2VuaXplcigpLmdldEJsb2NrTWFya2VycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcikgbWFya2Vycy5nZXQoaSk7Ci0JCQlpZiAobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJaWYgKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ05hbWUpKQotCQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIG1hcmtlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JCXJldHVybiBnZXRUb2tlbml6ZXIoKS5nZXRCbG9ja01hcmtlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZG5vZGUgPSBudWxsOwotCQlpZiAoaGVhZG5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQloZWFkbm9kZSA9IHBhcnNlTm9kZXMoKTsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCXN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLS0gY3JlYXRpbmcgbm9kZXMgb2YgSVN0cnVjdHVyZWREb2N1bWVudCAtLSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIFRpbWUgcGFyc2UgYW5kIGluaXQgYWxsIHJlZ2lvbnM6ICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiAobXNlY3MpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZm9yICIgKyBmUmVnaW9ucy5zaXplKCkgKyAiCi0JCQkJLy8gUmVnaW9ucyIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICBhbmQgIiArIF9jb3VudE5vZGVzKGhlYWRub2RlKSArICIgTm9kZXMiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXRUb2tlbml6ZXIoKS5nZXROZXh0VG9rZW4oKTsKLQkJCS8vIERNVzogMi8xMi8wMyBSZW1vdmVkIHN0YXRlCi0JCQkvLyBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZSZWdpb25zLmFkZChyZWdpb24pOwotCQkJLy8gfQotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSArICIgKCIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICIpIiwgZSk7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbCBsaXN0IG9mIGtub3duIHJlZ2lvbnMuIFR5cGljYWxseSBnZXROb2RlcyBzaG91bGQgYmUKLQkgKiB1c2VkIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCWlmICghZ2V0VG9rZW5pemVyKCkuaXNFT0YoKSkgewotCQkJaGVhZE5vZGUgPSBnZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCS8vIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhcnNpbmcgaGFzIG5vdCBmaW5pc2hlZCIpOwotCQl9Ci0JCS8vIGZvciBtZW1vcnkgcmVjb3ZlcnksIHdlIGFzc3VtZSBpZiBzb21lb25lCi0JCS8vIHJlcXVlc3RzIGFsbCByZWdpb25zLCB3ZSBjYW4gcmVzZXQgb3VyIGJpZwotCQkvLyBtZW1vcnkgY29uc3VtaW5nIG9iamVjdHMKLQkJLy8gYnV0IHRoZSBuZXcgImdldFJlZ2lvbnMiIG1ldGhvZCBpcyB0aGVuIG1vcmUgZXhwZW5zaXZlLgotCQkvLyBJIGRvbid0IHRoaW5rIGl0cyB1c2VkIG11Y2gsIHRob3VnaC4KLQkJTGlzdCBsb2NhbFJlZ2lvbnNMaXN0ID0gZ2V0UmVnaW9ucyhoZWFkTm9kZSk7Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gbG9jYWxSZWdpb25zTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0UmVnaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gaGVhZE5vZGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJTGlzdCBhbGxSZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gaGVhZE5vZGU7Ci0JCXdoaWxlIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMgPSBjdXJyZW50Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWxsUmVnaW9ucy5hZGQobm9kZVJlZ2lvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBhbGxSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9PSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgaW5wdXQuIFRleHQgaXMgb25seSB2YWxpZCBiZWZvcmUKLQkgKiBnZXROb2RlcygpIGhhcyBiZWVuIGNhbGxlZCBhbmQgb25seSB3aGVuIGEgcmF3IFN0cmluZyBvciBEb2N1bWVudFJlYWRlcgotCSAqIGlzIGdpdmVuIGFzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCWludCBzdGFydCA9IGZPZmZzZXQgKyBvZmZzZXQ7Ci0JCQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0JCQl0ZXh0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShzdGFydCwgZW5kKS50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYgKGZEb2N1bWVudElucHV0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGV4dCA9IGZEb2N1bWVudElucHV0LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZTdHJpbmdJbnB1dCA9PSBudWxsIHx8IGZTdHJpbmdJbnB1dC5sZW5ndGgoKSA9PSAwIHx8IG9mZnNldCArIGxlbmd0aCA+IGZTdHJpbmdJbnB1dC5sZW5ndGgoKSB8fCBvZmZzZXQgPCAwKSB7Ci0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBvZmZzZXQgaXMgZW50aXJlbHkgdmFsaWQgZHVyaW5nIHBhcnNpbmcgYXMgdGhlIHBhcnNlCi0JCQkJLy8gbnVtYmVycyBoYXZlbid0IGJlZW4gYWRqdXN0ZWQuCi0JCQkJdGV4dCA9IGZTdHJpbmdJbnB1dC5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBCbG9ja1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgWE1MVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlYTUxTb3VyY2VQYXJzZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JCW5ld0luc3RhbmNlLnNldFRva2VuaXplcihnZXRUb2tlbml6ZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcnNlTm9kZXMoKSB7Ci0JCS8vIHJlZ2lvbnMgYXJlIGluaXRpYWxseSByZXBvcnRlZCBhcyBjb21wbGV0ZSBvZmZzZXRzIHdpdGhpbiB0aGUKLQkJLy8gc2Nhbm5lZCBpbnB1dAotCQkvLyB0aGV5IGFyZSBhZGp1c3RlZCBoZXJlIHRvIGJlIGluZGV4ZXMgZnJvbSB0aGUgY3VycmVudE5vZGUncyBzdGFydAotCQkvLyBvZmZzZXQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCXdoaWxlICgocmVnaW9uID0gZ2V0TmV4dFJlZ2lvbigpKSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIHRoZXNlIHR5cGVzIChtaWdodCkgZGVtYW5kIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmb3IgZWFjaAotCQkJLy8gb2YgdGhlbQotCQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkJLy8gbXVsdGlwbGUgYmxvY2sgdGV4dHMgaW5kaWNhdGVkIGVtYmVkZGVkIGNvbnRhaW5lcnM7IG5vCi0JCQkJCS8vIG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdCBjb250aW51aW5nIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QKLQkJCQkJCS8vIHRlcm1pbmF0ZWQKLQkJCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLnNldFRleHRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLQotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCX0KLQkJCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJCX0KLQkJCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgT1BFTiBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJZWxzZSBpZiAoKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuaXNFbmRlZCgpKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0IHRlcm1pbmF0ZWQKLQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJLy8gZkN1cnJlbnROb2RlLnNldFRleHRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLQotCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQl9Ci0JCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJfQotCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgbmVpdGhlciBvcGVuIG5vciBjbG9zZQotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsganVzdCBhZGQgdG8gdGhlbQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpKSB7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIGNsb3NlIG9mZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQkvLyBjbGVhbmx5Ci0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoaXMgaXMgZXh0cmVtZWx5IHJhcmUsIGJ1dCB2YWxpZAotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCQkvLyBwYWNrIHRoZSBlbWJlZGRlZCBjb250YWluZXIgd2l0aCB0aGlzIHJlZ2lvbgotCQkJCWlmIChsYXN0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJSVRleHRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSBsYXN0UmVnaW9uOwotCQkJCQljb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChyZWdpb24pOwotCQkJCQkvLyBjb250YWluZXJzIG11c3QgaGF2ZSBwYXJlbnQgc2V0IC4uLgotCQkJCQkvLyBzZXR0aW5nIGZvciBFQUNIIHN1YnJlZ2lvbiBpcyByZWR1bmRlbnQsIGJ1dCBub3Qgc3VyZQotCQkJCQkvLyB3aGVyZSBlbHNlIHRvIGRvLCBzbyB3aWxsIGRvIGhlcmUgZm9yIG5vdy4KLQkJCQkJY29udGFpbmVyLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjb250YWluZXIpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoY29udGFpbmVyLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBza2lwIG9uIGEgdmVyeS1maXJzdCByZWdpb24gc2l0dWF0aW9uIGFzIHRoZSBkZWZhdWx0Ci0JCQkJLy8gYmVoYXZpb3IgaXMgZ29vZCBlbm91Z2gKLQkJCQkvLyBjb21iaW5lIHdpdGggcHJldmlvdXMgaWYgYWxzbyB1bmRlZmluZWQKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkvLyBwcmV2aW91cyB3YXNuJ3QgdW5kZWZpbmVkCi0JCQkJZWxzZSB7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBhbiB1bmtub3duIHR5cGUgaXMgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQsCi0JCQkJLy8gZW5zdXJlIHRoYXQgYSBub2RlIGV4aXN0cwotCQkJCWlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCByZWdpb24gb2Ygbm90IHNwZWNpZmljYWxseSBoYW5kbGVkIHR5cGUgIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiIEAgIiArIHJlZ2lvbi5nZXRTdGFydCgpICsgIlsiICsgcmVnaW9uLmdldExlbmd0aCgpICsgIl0iKTsgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyB0aGVzZSByZWdpb25zIGFsc28gZ2V0IHRoZWlyIG93biBub2RlLCBzbyBjbG9zZSB0aGVtIGNsZWFubHkKLQkJCS8vIE5PVEU6IHRoZXNlIHJlZ2lvbnMgaGF2ZSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBjcmVhdGVkCi0JCQkvLyBmb3IgdGhlbSBhYm92ZTsgaXQgbWF5Ci0JCQkvLyBiZSBtb3JlIHJlYWRhYmxlIGlmIHRoYXQgaXMgaGFuZGxlZCBoZXJlIGFzIHdlbGwsIGJ1dCB0aGUKLQkJCS8vIGN1cnJlbnQgbGF5b3V0Ci0JCQkvLyBlbnN1cmVzIHRoYXQgdGhleSBvcGVuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgdGhlIHNhbWUgd2F5Ci0JCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCX0KLQkJfQotCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQl9Ci0JCS8vIGZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJlc2V0KCkgewotCQkvLyBmTm9kZXMgPSBudWxsOwotCQkvLyBmUmVnaW9ucyA9IG51bGw7Ci0JCS8vIGZJbnB1dCA9IG51bGw7Ci0JCWZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JCWZDaGFyU2VxdWVuY2VTb3VyY2UgPSBudWxsOwotCQlmRG9jdW1lbnRJbnB1dCA9IG51bGw7Ci0JCWZPZmZzZXQgPSAwOwotCQkvLyBmQ3VycmVudE5vZGUgPSBudWxsOwotCQkvLyBETVc6IGFsc28gcmVzZXQgdG9rZW5pemVyIHNvIGl0IGRvZXNuJ3QgaG9sZCBvbgotCQkvLyB0byBsYXJnZSBhcnJheXMKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQobmV3IGNoYXJbMF0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGUjcmVnaW9uTWF0Y2hlcyhpbnQsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24KLQkJaWYgKHN0cmluZ1RvQ29tcGFyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwgJiYgZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQlyZXN1bHQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gb2xkIGZhc2hpb25lZCB3YXlzCi0JCQlTdHJpbmcgdGVzdCA9IG51bGw7Ci0JCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdGVzdCA9IGZDaGFyU2VxdWVuY2VTb3VyY2Uuc3ViU2VxdWVuY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RyaW5nSW5wdXQgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmU3RyaW5nSW5wdXQuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCX0KLQkJCXJlc3VsdCA9IHN0cmluZ1RvQ29tcGFyZS5lcXVhbHModGVzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24KLQkJaWYgKHN0cmluZ1RvQ29tcGFyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwgJiYgZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQlyZXN1bHQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5cwotCQkJU3RyaW5nIHRlc3QgPSBudWxsOwotCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKS50b1N0cmluZygpOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0cmluZ0lucHV0ICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBzdHJpbmdUb0NvbXBhcmUuZXF1YWxzSWdub3JlQ2FzZSh0ZXN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlnZXRUb2tlbml6ZXIoKS5yZW1vdmVCbG9ja01hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWdldFRva2VuaXplcigpLnJlbW92ZUJsb2NrTWFya2VyKHRhZ05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5jb250YWlucyhoYW5kbGVyKSkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5yZW1vdmUoaGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSkgewotCQlwcmltUmVzZXQoKTsKLQkJLy8gZklucHV0ID0gaW5zdHJlYW07Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KGluc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotCQlyZXNldChyZWFkZXIsIDApOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyLCBpbnQgcG9zaXRpb24pIHsKLQkJcHJpbVJlc2V0KCk7Ci0JCWZPZmZzZXQgPSBwb3NpdGlvbjsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWlmIChyZWFkZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlYWRlcikgewotCQkJSURvY3VtZW50IGRvYyA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKLQkJCQlmQ2hhclNlcXVlbmNlU291cmNlID0gKENoYXJTZXF1ZW5jZSkgZG9jOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gb2xkIGZhc2hpb25lZCBJRG9jdW1lbnQKLQkJCQlmRG9jdW1lbnRJbnB1dCA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKHJlYWRlciBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZVJlYWRlcikgewotCQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9ICgoQ2hhclNlcXVlbmNlUmVhZGVyKSByZWFkZXIpLmdldE9yaWdpbmFsU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nKSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKSk7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nLCBpbnQgcG9zaXRpb24pIHsKLQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKTsKLQkJcmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldEhhbmRsZXJzKCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLmdldChpKSkucmVzZXROb2RlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIExpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyhMaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRva2VuaXplcihCbG9ja1Rva2VuaXplciBuZXdUb2tlbml6ZXIpIHsKLQkJLy8gRE1XOiBjaGFuZ2VkIGZyb20gcHJpdmF0ZSB0byBwcm90ZWN0ZWQsIHNvIHN1YmNsYXNzIGNvdWxkIHVzZSBpbgotCQkvLyBjcmVhdGlvbiBvZiAnbmV3SW5zdGFuY2UnLgotCQlmVG9rZW5pemVyID0gbmV3VG9rZW5pemVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTg2ZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCXB1YmxpYyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kRGlydHlFbmQoaW50IGVuZCkgewotCQkvLyBDYXV0aW9uOiBoZXJlJ3Mgb25lIHBsYWNlIHdlIGhhdmUgdG8gY2FzdAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kKTsKLQkJLy8gaWYgbm90IHdlbGwgZm9ybWVkLCBnZXQgb25lIHBhc3QsIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZQotCQlpZiAoKHJlc3VsdCAhPSBudWxsKSAmJiAoIXJlc3VsdC5pc0VuZGVkKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBhbHNvLCBnZXQgb25lIHBhc3QgaWYgZXhhY3RseSBlcXVhbCB0byB0aGUgZW5kICh0aGlzIHdhcyBuZWVkZWQKLQkJLy8gYXMgYSBzaW1wbGUgZml4IHRvIHdoZW4gYSB3aG9sZSBleGFjdCByZWdpb24gaXMgZGVsZXRlZC4KLQkJLy8gdGhlcmUncyBwcm9iYWJseSBhIGJldHRlciB3YXkuCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmIChlbmQgPT0gcmVzdWx0LmdldEVuZCgpKSkgewotCQkJaWYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyAxMi82LzIwMDEgLSBTaW5jZSB3ZSd2ZSBjaGFuZ2VkIHRoZSBwYXJzZXIvc2Nhbm5lciB0byBhbGxvdyBhIGxvbmUKLQkJLy8gJzwnIHdpdGhvdXQKLQkJLy8gYWx3YXlzIGludGVycHJldHRpbmcgaXQgYXMgc3RhcnQgb2YgYSB0YWcgbmFtZSwgd2UgbmVlZCB0byBiZSBhCi0JCS8vIGxpdHRsZSBmYW5jaWVyLCBpbiBvcmRlcgotCQkvLyB0byAic2tpcCIgb3ZlciBhbnkgcGxhaW4gJ29sIGNvbnRlbnQgYmV0d2VlbiB0aGUgbG9uZSAnPCcgYW5kIGFueQotCQkvLyBwb3RlbnRpYWwgbWVhdGluZwotCQkvLyByZWdpb25zIHBhc3QgcGxhaW4gJ29sIGNvbnRlbnQuCi0JCWlmIChpc0xvbmVPcGVuRm9sbG93ZWRCeUNvbnRlbnQocmVzdWx0KSAmJiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJZGlydHlFbmQgPSByZXN1bHQ7Ci0KLQkJcmV0dXJuIGRpcnR5RW5kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmREaXJ0eVN0YXJ0KGludCBzdGFydCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkvLyBoZXVyaXN0aWM6IGlmIHRoZSBwb3N0aW9uIGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHN0YXJ0LCB0aGVuCi0JCS8vIGdvIGJhY2sgb25lIG1vcmUsIGlmIGl0IGV4aXN0cy4gVGhpcyBwcmV2ZW50cyBwcm9ibGVtcyB3aXRoCi0JCS8vIGluc2VydGlvbnMKLQkJLy8gb2YgdGV4dCB0aGF0IHNob3VsZCBiZSBtZXJnZWQgd2l0aCB0aGUgcHJldmlvdXMgbm9kZSBpbnN0ZWFkIG9mCi0JCS8vIHNpbXBseSBodW5nCi0JCS8vIG9mZiBvZiBpdCBhcyBhIHNlcGFyYXRlIG5vZGUgKGV4LjogWE1MIGNvbnRlbnQgaW5zZXJ0ZWQgcmlnaHQKLQkJLy8gYmVmb3JlIGFuIG9wZW4KLQkJLy8gYnJhY2tldCBzaG91bGQgYmVjb21lIHBhcnQgb2YgdGhlIHByZXZpb3VzIGNvbnRlbnQgbm9kZSkKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gcmVzdWx0LmdldFByZXZpb3VzKCk7Ci0JCQlpZiAoKHByZXZpb3VzICE9IG51bGwpICYmICgoIShwcmV2aW91cy5pc0VuZGVkKCkpKSB8fCAoc3RhcnQgPT0gcmVzdWx0LmdldFN0YXJ0KCkpKSkgewotCQkJCXJlc3VsdCA9IHByZXZpb3VzOwotCQkJfQotCQkJLy8gSWYgd2UgYXJlIG5vdyBhdCB0aGUgZW5kIG9mIGEgInRhZyBkZXBlbmRlbnQiIGNvbnRlbnQgYXJlYSAob3IKLQkJCS8vIEpTUCBhcmVhKQotCQkJLy8gdGhlbiB3ZSBuZWVkIHRvIGJhY2sgdXAgYWxsIHRoZSB3YXkgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGF0LgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwb3RlbnRpYWwgPSByZXN1bHQ7Ci0JCQl3aGlsZSAoaXNQYXJ0T2ZCbG9ja1JlZ2lvbihwb3RlbnRpYWwpKSB7Ci0JCQkJcG90ZW50aWFsID0gcG90ZW50aWFsLmdldFByZXZpb3VzKCk7Ci0JCQl9Ci0JCQlpZiAocG90ZW50aWFsICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBwb3RlbnRpYWw7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQkJfQotCQl9Ci0JCWRpcnR5U3RhcnQgPSByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJ1bGUgaXMsIHRoYXQgaXMgd2UgYXJlIGNvbnRlbnQsIHByZWNlZGVkIGJ5IGxvbmUgPCwgdGhlbiB3ZSBuZWVkCi0JICogdG8gYWR2YW5jZSBvbmUgbW9yZSBmb3IgZGlydHkgZW5kLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTG9uZU9wZW5Gb2xsb3dlZEJ5Q29udGVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJCVN0cmluZyBwcmV2aW91c1R5cGUgPSBudWxsOwotCQkJaWYgKHByZXZpb3VzICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c1R5cGUgPSBwcmV2aW91cy5nZXRUeXBlKCk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXNUeXBlICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSAocHJldmlvdXNUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFydE9mQmxvY2tSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJcmVzdWx0ID0gKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRjODFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LlhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiBTdHJ1Y3R1cmVkUmVnaW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBKU1BfRElSRUNUSVZFID0gMTAwMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBYTUwgPSAxMDAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFhNTF9CTE9DSyA9IDEwMDI7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlUmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgWE1MIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgWE1MX0JMT0NLIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWJzdHJhY3RSZWdpb246OmNyZWF0ZVJlZ2lvbi4gSW52YWxpZCB0eXBlLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmMTZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ODEgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMS8yNy8wNSA0OjQ4IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDUgNDo0OCBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0IHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjJcMlwwXDFcMTRcMjJcMFwxXDE0XDFcMjFcMVwxMVwxXDUxIisKLSAgICAiXDFcMTZcMVwxN1wxXDEyXDFcMTNcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDE2XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDE1XDFcMTBcMVw1NFwxXDFcMVw0M1wxXDJcMVw0XDFcMTYiKwotICAgICJcMVwzMlwxXDU1XDFcMzBcMVwzMVwxXDM1XDFcNTJcMVwzNFwxXDM0XDFcNDBcMVwzNCIrCi0gICAgIlwxXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDMzIisKLSAgICAiXDFcNTNcMlwzNFwxXDIzXDFcNDRcMVwzNFwxXDI3XDFcMFwxXDIwXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDQ3XDFcNTVcMVw1NlwxXDUwXDFcMzVcMVw1MlwxXDM0XDFcMzRcMVw0MCIrCi0gICAgIlwyXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDQ2IisKLSAgICAiXDFcNTNcMVwzNFwxXDM0XDFcMjRcMVw0NFwxXDM0XDFcMFwxXDBcNzJcMFwxXDYwIisKLSAgICAiXDEwXDBcMjdcNTdcMVwwXDM3XDU3XDFcMFw3Mlw1N1wyXDBcMTNcNTdcMlwwXDEwXDU3IisKLSAgICAiXDFcMFw2NVw1N1wxXDBcMTA0XDU3XDExXDBcNDRcNTdcM1wwXDJcNTdcNFwwXDM2XDU3IisKLSAgICAiXDcwXDBcMTMxXDU3XDIyXDBcN1w1N1wxNlwwXDJcNjBcNTZcMFwxMDZcNjBcMzJcMFwyXDYwIisKLSAgICAiXDQ0XDBcMVw1N1wxXDYwXDNcNTdcMVwwXDFcNTdcMVwwXDI0XDU3XDFcMFw1NFw1NyIrCi0gICAgIlwxXDBcN1w1N1wzXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1NyIrCi0gICAgIlwxXDBcMjJcNTdcMTVcMFwxNFw1N1wxXDBcMTAyXDU3XDFcMFwxNFw1N1wxXDBcNDRcNTciKwotICAgICJcMVwwXDRcNjBcMTFcMFw2NVw1N1wyXDBcMlw1N1wyXDBcMlw1N1wzXDBcMzRcNTciKwotICAgICJcMlwwXDEwXDU3XDJcMFwyXDU3XDY3XDBcNDZcNTdcMlwwXDFcNTdcN1wwXDQ2XDU3IisKLSAgICAiXDEyXDBcMjFcNjBcMVwwXDI3XDYwXDFcMFwzXDYwXDFcMFwxXDYwXDFcMFwyXDYwIisKLSAgICAiXDFcMFwxXDYwXDEzXDBcMzNcNTdcNVwwXDNcNTdcNTZcMFwzMlw1N1w1XDBcMVw2MCIrCi0gICAgIlwxMlw1N1wxMFw2MFwxNVwwXDEyXDYwXDZcMFwxXDYwXDEwN1w1N1wyXDBcNVw1N1wxXDAiKwotICAgICJcMTdcNTdcMVwwXDRcNTdcMVwwXDFcNTdcMTdcNjBcMlw1N1wyXDYwXDFcMFw0XDYwIisKLSAgICAiXDJcMFwxMlw2MFx1MDIwN1wwXDNcNjBcMVwwXDY1XDU3XDJcMFwxXDYwXDFcNTdcMjBcNjAiKwotICAgICJcM1wwXDRcNjBcM1wwXDEyXDU3XDJcNjBcMlwwXDEyXDYwXDIxXDBcM1w2MFwxXDAiKwotICAgICJcMTBcNTdcMlwwXDJcNTdcMlwwXDI2XDU3XDFcMFw3XDU3XDFcMFwxXDU3XDNcMCIrCi0gICAgIlw0XDU3XDJcMFwxXDYwXDFcMFw3XDYwXDJcMFwyXDYwXDJcMFwzXDYwXDExXDAiKwotICAgICJcMVw2MFw0XDBcMlw1N1wxXDBcM1w1N1wyXDYwXDJcMFwxMlw2MFwyXDU3XDIwXDAiKwotICAgICJcMVw2MFwyXDBcNlw1N1w0XDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDJcNTdcMVwwXDJcNTdcMlwwXDFcNjBcMVwwXDVcNjBcNFwwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMTNcMFw0XDU3XDFcMFwxXDU3XDdcMFwxMlw2MFwyXDYwIisKLSAgICAiXDNcNTdcMTRcMFwzXDYwXDFcMFw3XDU3XDFcMFwxXDU3XDFcMFwzXDU3XDFcMCIrCi0gICAgIlwyNlw1N1wxXDBcN1w1N1wxXDBcMlw1N1wxXDBcNVw1N1wyXDBcMVw2MFwxXDU3IisKLSAgICAiXDEwXDYwXDFcMFwzXDYwXDFcMFwzXDYwXDIyXDBcMVw1N1w1XDBcMTJcNjBcMjFcMCIrCi0gICAgIlwzXDYwXDFcMFwxMFw1N1wyXDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMlwwXDRcNTdcMlwwXDFcNjBcMVw1N1w2XDYwXDNcMFwyXDYwXDJcMCIrCi0gICAgIlwzXDYwXDEwXDBcMlw2MFw0XDBcMlw1N1wxXDBcM1w1N1w0XDBcMTJcNjBcMjJcMCIrCi0gICAgIlwyXDYwXDFcMFw2XDU3XDNcMFwzXDU3XDFcMFw0XDU3XDNcMFwyXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwyXDU3XDNcMFwyXDU3XDNcMFwzXDU3XDNcMFwxMFw1N1wxXDAiKwotICAgICJcM1w1N1w0XDBcNVw2MFwzXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTdcMCIrCi0gICAgIlwxMVw2MFwyMVwwXDNcNjBcMVwwXDEwXDU3XDFcMFwzXDU3XDFcMFwyN1w1N1wxXDAiKwotICAgICJcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwXDNcNjBcMVwwXDRcNjBcN1wwIisKLSAgICAiXDJcNjBcMTFcMFwyXDU3XDRcMFwxMlw2MFwyMlwwXDJcNjBcMVwwXDEwXDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFwyN1w1N1wxXDBcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwIisKLSAgICAiXDNcNjBcMVwwXDRcNjBcN1wwXDJcNjBcN1wwXDFcNTdcMVwwXDJcNTdcNFwwIisKLSAgICAiXDEyXDYwXDIyXDBcMlw2MFwxXDBcMTBcNTdcMVwwXDNcNTdcMVwwXDI3XDU3XDFcMCIrCi0gICAgIlwyMFw1N1w0XDBcNlw2MFwyXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTBcMCIrCi0gICAgIlwyXDU3XDRcMFwxMlw2MFwyMjFcMFw1Nlw1N1wxXDBcMVw1N1wxXDYwXDJcNTdcN1w2MCIrCi0gICAgIlw1XDBcNlw1N1wxXDYwXDEwXDYwXDFcMFwxMlw2MFw0N1wwXDJcNTdcMVwwXDFcNTciKwotICAgICJcMlwwXDJcNTdcMVwwXDFcNTdcMlwwXDFcNTdcNlwwXDRcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDFcNTdcMlwwXDJcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDFcNTdcMVw2MFwyXDU3XDZcNjBcMVwwXDJcNjBcMVw1N1wyXDBcNVw1NyIrCi0gICAgIlwxXDBcMVw2MFwxXDBcNlw2MFwyXDBcMTJcNjBcNzZcMFwyXDYwXDZcMFwxMlw2MCIrCi0gICAgIlwxM1wwXDFcNjBcMVwwXDFcNjBcMVwwXDFcNjBcNFwwXDJcNjBcMTBcNTdcMVwwIisKLSAgICAiXDQxXDU3XDdcMFwyNFw2MFwxXDBcNlw2MFw0XDBcNlw2MFwxXDBcMVw2MFwxXDAiKwotICAgICJcMjVcNjBcM1wwXDdcNjBcMVwwXDFcNjBcMzQ2XDBcNDZcNTdcMTJcMFw0N1w1N1wxMVwwIisKLSAgICAiXDFcNTdcMVwwXDJcNTdcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDJcNTdcMVwwIisKLSAgICAiXDVcNTdcNTFcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDEzXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDBcMVw1N1w1XDBcM1w1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDAiKwotICAgICJcMlw1N1wxXDBcMVw1N1w1MFwwXDFcNTdcMTFcMFwxXDU3XDJcMFwxXDU3XDJcMCIrCi0gICAgIlwyXDU3XDdcMFwyXDU3XDFcMFwxXDU3XDFcMFw3XDU3XDUwXDBcMVw1N1w0XDAiKwotICAgICJcMVw1N1wxMFwwXDFcNTdcdTBjMDZcMFwyMzRcNTdcNFwwXDEzMlw1N1w2XDBcMjZcNTdcMlwwIisKLSAgICAiXDZcNTdcMlwwXDQ2XDU3XDJcMFw2XDU3XDJcMFwxMFw1N1wxXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMzdcNTdcMlwwXDY1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwxXDU3XDNcMFwzXDU3XDFcMFw3XDU3XDNcMFw0XDU3XDJcMFw2XDU3XDRcMCIrCi0gICAgIlwxNVw1N1w1XDBcM1w1N1wxXDBcN1w1N1wzMjNcMFwxNVw2MFw0XDBcMVw2MFwxMDRcMCIrCi0gICAgIlwxXDU3XDNcMFwyXDU3XDJcMFwxXDU3XDEyMVwwXDNcNTdcdTBlODJcMFwxXDYwXDFcMCIrCi0gICAgIlwxXDU3XDMxXDBcMTFcNTdcNlw2MFwxXDBcNVw2MFwxM1wwXDEyNFw1N1w0XDBcMlw2MCIrCi0gICAgIlwyXDBcMlw2MFwyXDBcMTMyXDU3XDFcMFwzXDYwXDZcMFw1MFw1N1x1MWNkM1wwXHU1MWE2XDU3IisKLSAgICAiXHUwYzVhXDBcdTJiYTRcNTdcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA0OSwgICAgOTgsICAgMTQ3LCAgIDE5NiwgICAyNDUsICAgMjk0LCAgIDM0MywgICAzOTIsICAgNDQxLCAKLSAgICAgIDQ5MCwgICA1MzksICAgNTg4LCAgIDYzNywgICA2ODYsICAgNzM1LCAgIDc4NCwgICA4MzMsICAgODgyLCAgIDkzMSwgCi0gICAgICA5ODAsICAxMDI5LCAgMTA3OCwgIDExMjcsICAxMTc2LCAgMTIyNSwgIDEyNzQsICAxMzIzLCAgMTM3MiwgIDE0MjEsIAotICAgICAxNDcwLCAgMTUxOSwgIDE1NjgsICAxNjE3LCAgMTY2NiwgIDE3MTUsICAxNzY0LCAgMTcxNSwgIDE3NjQsICAxODEzLCAKLSAgICAgMTcxNSwgIDE3MTUsICAxNzY0LCAgMTg2MiwgIDE5MTEsICAxOTYwLCAgMjAwOSwgIDIwNTgsICAyMTA3LCAgMjE1NiwgCi0gICAgIDE3MTUsICAxNzY0LCAgMjIwNSwgIDIyNTQsICAyMzAzLCAgMTcxNSwgIDIzNTIsICAyMzUyLCAgMjQwMSwgIDI0NTAsIAotICAgICAyNDk5LCAgMjIwNSwgIDE3MTUsICAyNTQ4LCAgMjU5NywgIDE3MTUsICAyNjQ2LCAgMjY5NSwgIDI3NDQsICAyNzkzLCAKLSAgICAgMjg0MiwgIDI4OTEsICAxNzE1LCAgMjk0MCwgIDI5ODksICAzMDM4LCAgMzA4NywgIDE3MTUsICAzMTM2LCAgMzE4NSwgCi0gICAgIDMyMzQsICAzMjgzLCAgMzMzMiwgIDE3MTUsICAzMzgxLCAgMzQzMCwgIDM0NzksICAzNTI4LCAgMzU3NywgIDM2MjYsIAotICAgICAzNjc1LCAgMzcyNCwgIDM3MjQsICAzNzczLCAgMzgyMiwgIDM4NzEsICAzOTIwLCAgMzkyMCwgIDM5NjksICA0MDE4LCAKLSAgICAgNDA2NywgIDQxMTYsICA0MTE2LCAgNDE2NSwgIDQyMTQsICA0MjYzLCAgNDMxMiwgIDE3MTUsICA0MzYxLCAgNDM2MSwgCi0gICAgIDQ0MTAsICA0NDU5LCAgNDUwOCwgIDQ1NTcsICAxNzE1LCAgMTcxNSwgIDE3NjQsICAxNzE1LCAgMTcxNSwgIDQ2MDYsIAotICAgICA0NjU1LCAgNDcwNCwgIDQ3NTMsICA0ODAyLCAgNDg1MSwgIDQ5MDAsICA0OTQ5LCAgMTcxNSwgIDQ5OTgsICA1MDQ3LCAKLSAgICAgMTcxNSwgIDE3MTUsICAyMzUyLCAgNTA5NiwgIDI0NTAsICAxNzE1LCAgNTE0NSwgIDI0OTksICAyNTQ4LCAgMjY0NiwgCi0gICAgIDI2OTUsICA1MTk0LCAgMjc0NCwgIDE3MTUsICA1MjQzLCAgMjc5MywgIDE3MTUsICAzMTM2LCAgNTI5MiwgIDMyMzQsIAotICAgICAxNzE1LCAgNTM0MSwgIDMyODMsICA0NjA2LCAgNTM5MCwgIDU0MzksICA1NDg4LCAgMzUyOCwgIDE3MTUsICA1NTM3LCAKLSAgICAgNTU4NiwgIDM3MjQsICA1NjM1LCAgMzc3MywgIDE3MTUsICA1Njg0LCAgNTczMywgIDU3ODIsICA1NzgyLCAgNTgzMSwgCi0gICAgIDU4ODAsICAzODcxLCAgMzcyNCwgIDM5MjAsICA1OTI5LCAgMzk2OSwgIDE3MTUsICA1OTc4LCAgNDAxOCwgIDQwNjcsIAotICAgICAzOTIwLCAgNDExNiwgIDYwMjcsICA0MTY1LCAgMTcxNSwgIDYwNzYsICA2MTI1LCAgNjE3NCwgIDYxNzQsICA2MjIzLCAKLSAgICAgNjI3MiwgIDYzMjEsICA0MzYxLCAgNjM3MCwgIDQ0MTAsICAxNzE1LCAgNjQxOSwgIDY0NjgsICA2NTE3LCAgNjUxNywgCi0gICAgIDY1NjYsICA2NjE1LCAgNjY2NCwgIDY3MTMsICA2NzYyLCAgNjgxMSwgIDY4NjAsICAxNzE1LCAgNjkwOSwgIDY5NTgsIAotICAgICAxNzE1LCAgMTcxNSwgIDE3MTUsICAyMDA5LCAgNzAwNywgIDcwNTYsICA3MTA1LCAgNzE1NCwgIDcyMDMsICA3MjUyLCAKLSAgICAgNTY4NCwgIDczMDEsICA3MzAxLCAgNjA3NiwgIDczNTAsICA3MzUwLCAgNzM5OSwgIDY0MTksICA3NDQ4LCAgNzQ0OCwgCi0gICAgIDc0OTcsICAxNzE1LCAgNzU0NiwgIDc1OTUsICAxNzE1LCAgNzY0NCwgIDc2OTMsICA3NzQyLCAgNzc5MSwgIDc4NDAsIAotICAgICA3ODg5LCAgNzkzOCwgIDU4MzEsICA2MjIzLCAgNzk4NywgIDY1NjYsICA4MDM2LCAgODA4NSwgIDgxMzQsICA4MTgzLCAKLSAgICAgODIzMiwgIDgyODEsICA4MzMwLCAgODM3OSwgIDg0MjgsICA4NDc3LCAgODUyNiwgIDg1NzUsICA4NjI0LCAgODY3MywgCi0gICAgIDg3MjIsICAxNzE1LCAgMTcxNSwgIDg3NzEsICA4ODIwLCAgODg2OSwgIDg5MTgsICAxNzE1LCAgMTcxNSwgIDE3MTUsIAotICAgICA4OTY3LCAgOTAxNiwgIDkwNjUsICA5MTE0LCAgOTE2MywgIDE3MTUsICA0MjYzLCAgNDUwOAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0MVw0MFwxXDQ0IisKLSAgICAiXDFcNDVcNTdcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDM2XDQ2XDFcNTJcMVw1M1w1N1w1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcMzdcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwyXDYwXDJcNTdcMVw0NiIrCi0gICAgIlwxMFw1N1wxXDYxXDJcNTdcMVw0Nlw1XDU3XDFcNDZcMlw1N1wxXDQ2IisKLSAgICAiXDNcNTdcMlw0NlwxXDQ3XDJcNDZcMVw1NVwxXDYyXDZcNDZcMVw2MiIrCi0gICAgIlw1XDQ2XDFcNjJcMzZcNDZcMVw2M1wxXDY0XDJcNjNcMVw2NVwxNVw2MyIrCi0gICAgIlwxXDUxXDM2XDYzXDFcNDZcMVw0N1wyXDQ2XDFcNjZcMVw1NlwyXDQ2IisKLSAgICAiXDFcNjdcM1w0NlwxXDU2XDVcNDZcMVw1Nlw0XDY3XDFcNDZcMTNcNjciKwotICAgICJcMVw0Nlw1XDY3XDFcNDZcMlw2N1wxXDQ2XDNcNjdcMlw0NlwxXDQ3IisKLSAgICAiXDJcNDZcMVw2NlwxXDU2XDJcNDZcMVw2N1wzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDRcNjdcMVw0NlwxM1w2N1wxXDcwXDVcNjdcMVw0NlwyXDY3IisKLSAgICAiXDFcNDZcM1w2N1wxXDQ2XDFcNzFcMVw0N1wxXDQ2XDFcNzJcMVw3MyIrCi0gICAgIlwxXDU2XDNcNzFcMVw3NFwxXDcxXDFcNzVcMVw1Nlw1XDcxXDFcNTYiKwotICAgICJcMzZcNzFcMVw0NlwxXDQ3XDJcNDZcMVw3NlwxNVw0NlwxXDUxXDM3XDQ2IisKLSAgICAiXDFcNDdcMVw3N1wxXDEwMFwxXDQ2XDFcNTZcMlw0NlwxXDEwMVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTAxXDFcNDZcMTNcMTAxXDFcNDZcNVwxMDEiKwotICAgICJcMVw0NlwyXDEwMVwxXDQ2XDNcMTAxXDJcNDZcMVw0N1wxXDc3XDFcMTAwIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTAxXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNFwxMDFcMVw0NlwxM1wxMDFcMVwxMDJcNVwxMDFcMVw0NlwyXDEwMVwxXDQ2IisKLSAgICAiXDNcMTAxXDFcNDZcMVwxMDNcMVw0N1wxXDc3XDFcMTA0XDFcMTAzXDFcNTYiKwotICAgICJcM1wxMDNcMVwxMDVcMVwxMDNcMVwxMDZcMVw1Nlw1XDEwM1wxXDU2XDM2XDEwMyIrCi0gICAgIlwxXDQ2XDFcNDdcM1w0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcMzZcNDZcMVwxMDdcMVwxMTBcMVwxMTFcMVwxMTJcNFwxMDdcMVwxMTNcMTJcMTA3IisKLSAgICAiXDRcMTE0XDFcMTA3XDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwNyIrCi0gICAgIlwzXDExNFwxXDEwN1wxXDQ2XDFcMTEwXDFcMTExXDFcMTEyXDFcNDZcMVw1NiIrCi0gICAgIlwyXDQ2XDFcMTE1XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNFwxMTVcMVw0NiIrCi0gICAgIlwxM1wxMTVcMVw0Nlw1XDExNVwxXDQ2XDJcMTE1XDFcNDZcM1wxMTVcMlw0NiIrCi0gICAgIlwxXDExMFwxXDExMVwxXDExMlwxXDQ2XDFcNTZcMlw0NlwxXDExNVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTE1XDFcNDZcMTNcMTE1XDFcMTE2XDVcMTE1IisKLSAgICAiXDFcNDZcMlwxMTVcMVw0NlwzXDExNVwxXDQ2XDFcMTE3XDFcMTEwXDFcMTExIisKLSAgICAiXDFcMTIwXDFcMTE3XDFcNTZcM1wxMTdcMVwxMjFcMVwxMTdcMVwxMjJcMVw1NiIrCi0gICAgIlw1XDExN1wxXDU2XDM2XDExN1wxXDQ2XDFcMTIzXDFcMTI0XDJcNDZcMVw1NiIrCi0gICAgIlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMjVcMVwxMjZcMlw0NiIrCi0gICAgIlwxXDEyN1wxMVw0NlwxXDEyNlwxXDEyNVwxMVw0NlwxXDQ3XDFcMTI0XDJcNDYiKwotICAgICJcMVw1Nlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDRcNDZcMVwxMzBcMzJcNDYiKwotICAgICJcMVw0N1wxXDEyNFwyXDQ2XDFcNTZcMlw0NlwxXDEzMVwzXDQ2XDFcNTYiKwotICAgICJcNVw0NlwxXDU2XDRcMTMxXDFcMTMwXDEzXDEzMVwxXDQ2XDVcMTMxXDFcNDYiKwotICAgICJcMlwxMzFcMVw0NlwzXDEzMVwyXDQ2XDFcNDdcMVwxMjRcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNFw0NlwxXDEzMFw3XDQ2XDFcMTMyIisKLSAgICAiXDVcNDZcMVwxMzNcMTNcNDZcMVwxMzRcMVw0N1wxXDEyNFwxXDEzNVwxXDEzNCIrCi0gICAgIlwxXDU2XDNcMTM0XDFcMTM2XDFcMTM0XDFcMTM3XDFcNTZcNVwxMzRcMVw1NiIrCi0gICAgIlw0XDEzNFwxXDE0MFwzMVwxMzRcMVwxNDFcMVw0N1wxXDEyNFwxXDE0MlwxXDE0MSIrCi0gICAgIlwxXDU2XDNcMTQxXDFcMTQzXDFcMTQxXDFcMTQ0XDFcNTZcNVwxNDFcMVw1NiIrCi0gICAgIlw0XDE0MVwxXDE0NVwzMVwxNDFcMVwxNDZcMVw0N1wxXDEyNFwxXDE0N1wxXDE0NiIrCi0gICAgIlwxXDU2XDNcMTQ2XDFcMTUwXDFcMTQ2XDFcMTUxXDFcNTZcNVwxNDZcMVw1NiIrCi0gICAgIlwzNlwxNDZcMVwxNTJcMVwxNTNcMVwxNTRcNTZcMTUyXDFcMTU1XDFcNDdcMVwxMjQiKwotICAgICJcMVwxNTZcMVwxNTVcMVw1NlwzXDE1NVwxXDE1N1wxXDE1NVwxXDE2MFwxXDU2IisKLSAgICAiXDVcMTU1XDFcNTZcMzZcMTU1XDFcMTYxXDFcMTYyXDFcMTYzXDU2XDE2MVwxXDE2NCIrCi0gICAgIlwxXDE2NVw1N1wxNjRcMVw0MFwxXDBcMTBcNDBcMVwwXDRcNDBcMVwwIisKLSAgICAiXDQxXDQwXDNcMFwxXDE2NlwxXDE2N1wxNFwwXDFcMTcwXDQ0XDBcMVwxNzEiKwotICAgICJcMlwwXDFcMTcyXDNcMFwxXDE3MVw1XDBcMVwxNzFcNFwxNzJcMVwwIisKLSAgICAiXDEzXDE3MlwxXDBcNVwxNzJcMVwxNzNcMlwxNzJcMVwwXDNcMTcyXDZcMCIrCi0gICAgIlwxXDE3MVwyXDBcMVwxNzRcM1wwXDFcMTcxXDVcMFwxXDE3MVw0XDE3NCIrCi0gICAgIlwxXDBcMTNcMTc0XDFcMFw1XDE3NFwxXDBcMlwxNzRcMVwwXDNcMTc0IisKLSAgICAiXDEwM1wwXDFcMTc1XDU3XDBcMVwxNzZcNDdcMFwxXDE3N1w1M1wwXDFcMjAwIisKLSAgICAiXDYzXDBcMVw1Nlw2XDBcMVw1Nlw1XDBcMVw1Nlw0NFwwXDNcNTciKwotICAgICJcNFwwXDFcNTdcNVwwXDRcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAxXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAyXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDVcMFwxXDYyXDZcMFwxXDYyIisKLSAgICAiXDVcMFwxXDYyXDQwXDBcMVwyMDNcNjBcMFwxXDIwNFw2NFwwXDNcNjciKwotICAgICJcNFwwXDFcNjdcNVwwXDRcNjdcMVwwXDEzXDY3XDFcMFw1XDY3IisKLSAgICAiXDFcMFwyXDY3XDFcMFw0XDY3XDFcNzFcMlwwXDFcMjA1XDFcNzEiKwotICAgICJcMVwwXDNcNzFcMVwwXDFcNzFcMlwwXDVcNzFcMVwwXDM3XDcxIisKLSAgICAiXDFcMFwxXDIwNFwxXDIwNVwxXDcxXDFcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDJcMFw1XDcxXDFcMFwzNlw3MVwxXDc0XDFcMFwxXDIwNlwxXDIwNyIrCi0gICAgIlwxXDc0XDFcMjA2XDNcNzRcMVwyMTBcMVw3NFwyXDIwNlw1XDc0XDFcMjA2IisKLSAgICAiXDM2XDc0XDFcNzVcMVwwXDFcMjExXDFcMjEyXDFcNzVcMVwyMTFcM1w3NSIrCi0gICAgIlwxXDIxMVwxXDc1XDFcMjEwXDFcMjExXDVcNzVcMVwyMTFcMzZcNzVcMlwwIisKLSAgICAiXDFcNzdcMVwyMTNcNjNcMFwzXDEwMVw0XDBcMVwxMDFcNVwwXDRcMTAxIisKLSAgICAiXDFcMFwxM1wxMDFcMVwwXDVcMTAxXDFcMFwyXDEwMVwxXDBcNFwxMDEiKwotICAgICJcMVwxMDNcMlwwXDFcMjE0XDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMlwwXDVcMTAzXDFcMFwzN1wxMDNcMVwwXDFcNzdcMVwyMTVcMVwxMDMiKwotICAgICJcMVwwXDNcMTAzXDFcMFwxXDEwM1wyXDBcNVwxMDNcMVwwXDM2XDEwMyIrCi0gICAgIlwxXDEwNVwxXDBcMVwyMTZcMVwyMTdcMVwxMDVcMVwyMTZcM1wxMDVcMVwyMjAiKwotICAgICJcMVwxMDVcMlwyMTZcNVwxMDVcMVwyMTZcMzZcMTA1XDFcMTA2XDFcMFwxXDIyMSIrCi0gICAgIlwxXDIyMlwxXDEwNlwxXDIyMVwzXDEwNlwxXDIyMVwxXDEwNlwxXDIyMFwxXDIyMSIrCi0gICAgIlw1XDEwNlwxXDIyMVwzNlwxMDZcMVwxMDdcM1wwXDE3XDEwN1w0XDBcMVwxMDciKwotICAgICJcMTNcMFwxXDEwN1w1XDBcMVwxMDdcMlwwXDFcMTA3XDNcMFwxXDEwNyIrCi0gICAgIlwzXDBcMVwxNjZcMTVcMFwxXDE3MFw0MVwwXDFcMjIzXDU2XDBcMVwxMDciKwotICAgICJcM1wwXDJcMTA3XDNcMTEzXDRcMTA3XDFcMTEzXDVcMTA3XDRcMTE0XDFcMTA3IisKLSAgICAiXDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwN1wzXDExNFwxXDExMyIrCi0gICAgIlw2XDBcM1wxMTRcNFwwXDFcMTE0XDVcMFw0XDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFw1XDExNFwxXDBcMlwxMTRcMVwwXDRcMTE0XDZcMFwzXDExNSIrCi0gICAgIlw0XDBcMVwxMTVcNVwwXDRcMTE1XDFcMFwxM1wxMTVcMVwwXDVcMTE1IisKLSAgICAiXDFcMFwyXDExNVwxXDBcNFwxMTVcMVwxMTdcMlwwXDFcMjI0XDFcMTE3IisKLSAgICAiXDFcMFwzXDExN1wxXDBcMVwxMTdcMlwwXDVcMTE3XDFcMFwzN1wxMTciKwotICAgICJcMVwwXDFcMjIzXDFcMjI0XDFcMTE3XDFcMFwzXDExN1wxXDBcMVwxMTciKwotICAgICJcMlwwXDVcMTE3XDFcMFwzNlwxMTdcMVwxMjFcMVwwXDFcMjI1XDFcMjI2IisKLSAgICAiXDFcMTIxXDFcMjI1XDNcMTIxXDFcMjI3XDFcMTIxXDJcMjI1XDVcMTIxXDFcMjI1IisKLSAgICAiXDM2XDEyMVwxXDEyMlwxXDBcMVwyMzBcMVwyMzFcMVwxMjJcMVwyMzBcM1wxMjIiKwotICAgICJcMVwyMzBcMVwxMjJcMVwyMjdcMVwyMzBcNVwxMjJcMVwyMzBcMzZcMTIyXDNcMCIrCi0gICAgIlwxXDE2NlwxNVwwXDFcMjMyXDEwMFwwXDFcMjMzXDUyXDBcMVwyMzRcMTJcMCIrCi0gICAgIlwxXDIzNFw0MFwwXDFcMjM1XDMyXDBcMjBcMjM2XDFcMjM3XDQwXDIzNlw2XDAiKwotICAgICJcM1wxMzFcNFwwXDFcMTMxXDVcMFw0XDEzMVwxXDBcMTNcMTMxXDFcMCIrCi0gICAgIlw1XDEzMVwxXDBcMlwxMzFcMVwwXDRcMTMxXDQ0XDBcMVwyNDBcNjdcMCIrCi0gICAgIlwxXDI0MVw1XDBcMVwxMzRcMlwwXDFcMjQyXDFcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcMlwwXDVcMTM0XDFcMFwzNlwxMzRcMVwxMzZcMVwwIisKLSAgICAiXDFcMjQzXDFcMjQ0XDFcMTM2XDFcMjQzXDNcMTM2XDFcMjQ1XDFcMTM2XDJcMjQzIisKLSAgICAiXDVcMTM2XDFcMjQzXDM2XDEzNlwxXDI0NlwxXDBcMVwyNDdcMVwyNTBcMVwyNTEiKwotICAgICJcMVwyNDdcM1wyNTFcMVwyNDdcMVwyNDZcMVwyNTJcMVwyNTNcM1wyNTFcMVwyNDYiKwotICAgICJcMVwyNTFcMVwyNTNcNFwyNTFcMVwyNDZcMjdcMjUxXDJcMjQ2XDFcMTQwXDJcMjM2IisKLSAgICAiXDFcMjU0XDFcMTQwXDFcMjM2XDNcMTQwXDFcMjM2XDFcMTQwXDJcMjM2XDNcMTQwIisKLSAgICAiXDFcMjU1XDFcMTQwXDFcMjM2XDM2XDE0MFwxXDE0MVwyXDBcMVwyNTZcMVwxNDEiKwotICAgICJcMVwwXDNcMTQxXDFcMFwxXDE0MVwyXDBcNVwxNDFcMVwwXDM2XDE0MSIrCi0gICAgIlwxXDE0M1wyXDI1N1wxXDI2MFwxXDE0M1wxXDI1N1wzXDE0M1wxXDI2MVwxXDE0MyIrCi0gICAgIlwyXDI1N1w1XDE0M1wxXDI1N1wzNlwxNDNcMVwxNDRcMlwyNjJcMVwyNjNcMVwxNDQiKwotICAgICJcMVwyNjJcM1wxNDRcMVwyNjJcMVwxNDRcMVwyNjFcMVwyNjJcNVwxNDRcMVwyNjIiKwotICAgICJcMzZcMTQ0XDFcMTQ1XDJcMjM2XDFcMjY0XDFcMTQ1XDFcMjM2XDNcMTQ1XDFcMjM2IisKLSAgICAiXDFcMTQ1XDJcMjM2XDNcMTQ1XDFcMjY1XDFcMTQ1XDFcMjM2XDM2XDE0NVwxXDE0NiIrCi0gICAgIlwyXDBcMVwyNjZcMVwxNDZcMVwwXDNcMTQ2XDFcMFwxXDE0NlwyXDAiKwotICAgICJcNVwxNDZcMVwwXDM2XDE0NlwxXDE1MFwxXDBcMVwyNjdcMVwyNzBcMVwxNTAiKwotICAgICJcMVwyNjdcM1wxNTBcMVwyNzFcMVwxNTBcMlwyNjdcNVwxNTBcMVwyNjdcMzZcMTUwIisKLSAgICAiXDFcMjcyXDFcMFwxXDI3M1wxXDI3NFwxXDI3NVwxXDI3M1wzXDI3NVwxXDI3MyIrCi0gICAgIlwxXDI3MlwxXDI3NlwxXDI3N1wzXDI3NVwxXDI3MlwxXDI3NVwxXDI3N1w0XDI3NSIrCi0gICAgIlwxXDI3MlwyN1wyNzVcMlwyNzJcMlwxNTJcMVwwXDYwXDE1MlwxXDBcMTZcMTUyIisKLSAgICAiXDFcMzAwXDM3XDE1MlwxXDE1NVwyXDBcMVwzMDFcMVwxNTVcMVwwXDNcMTU1IisKLSAgICAiXDFcMFwxXDE1NVwyXDBcNVwxNTVcMVwwXDM2XDE1NVwxXDE1N1wxXDAiKwotICAgICJcMVwzMDJcMVwzMDNcMVwxNTdcMVwzMDJcM1wxNTdcMVwzMDRcMVwxNTdcMlwzMDIiKwotICAgICJcNVwxNTdcMVwzMDJcMzZcMTU3XDFcMzA1XDFcMFwxXDMwNlwxXDMwN1wxXDMxMCIrCi0gICAgIlwxXDMwNlwzXDMxMFwxXDMwNlwxXDMwNVwxXDMxMVwxXDMxMlwzXDMxMFwxXDMwNSIrCi0gICAgIlwxXDMxMFwxXDMxMlw0XDMxMFwxXDMwNVwyN1wzMTBcMlwzMDVcMlwxNjFcMVwwIisKLSAgICAiXDYwXDE2MVwxXDBcMTZcMTYxXDFcMzEzXDM3XDE2MVw3XDBcMVwzMTRcMTdcMCIrCi0gICAgIlwxXDMxNVwzNlwwXDFcMTcxXDJcMFwxXDQwXDNcMFwxXDE3MVw1XDAiKwotICAgICJcMVwxNzFcNFw0MFwxXDBcMTNcNDBcMVwwXDVcNDBcMVwwXDJcNDAiKwotICAgICJcMVwwXDNcNDBcMVwwXDFcMzE2XDFcMFwzXDMxNlwxXDMxN1wzXDE3MiIrCi0gICAgIlwxXDMxNlwxXDBcMVwzMTZcMVwzMTdcMVwxNzJcMVwzMTZcMVwwXDJcMzE2IisKLSAgICAiXDFcMzE3XDRcMTcyXDFcMzE2XDEzXDE3MlwxXDMxNlw1XDE3MlwxXDMxNlwyXDE3MiIrCi0gICAgIlwxXDMyMFw0XDE3MlwxNVwwXDFcMzIxXDZcMFwxXDMyMlwzNFwwXDFcMzE2IisKLSAgICAiXDFcMFwzXDMxNlwxXDMxN1wzXDE3NFwxXDMxNlwxXDBcMVwzMTZcMVwzMTciKwotICAgICJcMVwxNzRcMVwzMTZcMVwwXDJcMzE2XDFcMzE3XDRcMTc0XDFcMzE2XDEzXDE3NCIrCi0gICAgIlwxXDMxNlw1XDE3NFwxXDMxNlwyXDE3NFwxXDMyM1w0XDE3NFwyN1wwXDFcMzE1IisKLSAgICAiXDMzXDBcMVwzMjRcNjBcMFwxXDMyNVw2NFwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDNcNTdcMVwzMjZcMVwwXDEzXDU3XDFcMFw1XDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw0XDU3XDFcMFwxM1w1N1wxXDBcMVw1N1wxXDMyN1wzXDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDFcMjA2XDFcMFw3XDIwNlwxXDIxMFw0N1wyMDYiKwotICAgICJcMVwyMTFcMVwwXDExXDIxMVwxXDIxMFw0NVwyMTFcMVwyMTZcMVwwXDdcMjE2IisKLSAgICAiXDFcMjIwXDQ3XDIxNlwxXDIyMVwxXDBcMTFcMjIxXDFcMjIwXDQ1XDIyMVwxXDIyNSIrCi0gICAgIlwxXDBcN1wyMjVcMVwyMjdcNDdcMjI1XDFcMjMwXDFcMFwxMVwyMzBcMVwyMjciKwotICAgICJcNDVcMjMwXDMwXDBcMVwzMzBcMjVcMFwxXDMzMFwzNVwwXDFcMzMxXDEyXDAiKwotICAgICJcMVwzMzFcNDdcMFwxXDMzMlw2MlwwXDFcMzMzXDc2XDBcMVwzMzRcM1wwIisKLSAgICAiXDFcMjQzXDFcMFw3XDI0M1wxXDI0NVw0N1wyNDNcMVwyNDZcMVwwXDFcMjQ3IisKLSAgICAiXDFcMzM1XDFcMjQ2XDFcMjQ3XDNcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjQ1XDFcMjQ3IisKLSAgICAiXDVcMjQ2XDFcMjQ3XDM2XDI0NlwxXDI0N1wxXDBcMTFcMjQ3XDFcMjQ1XDQ1XDI0NyIrCi0gICAgIlwxXDI0NlwxXDBcMVwyNDdcMVwzMzVcMVwyNDZcMVwyNDdcM1wyNDZcMVwyNDciKwotICAgICJcMVwyNDZcMVwzMzZcMVwyNDdcNVwyNDZcMVwyNDdcMzZcMjQ2XDEzXDBcMVwzMzciKwotICAgICJcNDVcMFwxXDI0N1wxXDBcMTFcMjQ3XDFcMzM2XDQ1XDI0N1wxMVwyNTdcMVwyNjEiKwotICAgICJcNDdcMjU3XDEzXDI2MlwxXDI2MVw0NVwyNjJcMVwyNjdcMVwwXDdcMjY3XDFcMjcxIisKLSAgICAiXDQ3XDI2N1wxXDI3MlwxXDBcMVwyNzNcMVwzNDBcMVwyNzJcMVwyNzNcM1wyNzIiKwotICAgICJcMVwyNzNcMVwyNzJcMVwyNzFcMVwyNzNcNVwyNzJcMVwyNzNcMzZcMjcyXDFcMjczIisKLSAgICAiXDFcMFwxMVwyNzNcMVwyNzFcNDVcMjczXDFcMjcyXDFcMFwxXDI3M1wxXDM0MCIrCi0gICAgIlwxXDI3MlwxXDI3M1wzXDI3MlwxXDI3M1wxXDI3MlwxXDM0MVwxXDI3M1w1XDI3MiIrCi0gICAgIlwxXDI3M1wzNlwyNzJcMTNcMFwxXDM0Mlw0NVwwXDFcMjczXDFcMFwxMVwyNzMiKwotICAgICJcMVwzNDFcNDVcMjczXDJcMTUyXDFcMFwyNFwxNTJcMVwzNDNcMzFcMTUyXDFcMzAyIisKLSAgICAiXDFcMFw3XDMwMlwxXDMwNFw0N1wzMDJcMVwzMDVcMVwwXDFcMzA2XDFcMzQ0IisKLSAgICAiXDFcMzA1XDFcMzA2XDNcMzA1XDFcMzA2XDFcMzA1XDFcMzA0XDFcMzA2XDVcMzA1IisKLSAgICAiXDFcMzA2XDM2XDMwNVwxXDMwNlwxXDBcMTFcMzA2XDFcMzA0XDQ1XDMwNlwxXDMwNSIrCi0gICAgIlwxXDBcMVwzMDZcMVwzNDRcMVwzMDVcMVwzMDZcM1wzMDVcMVwzMDZcMVwzMDUiKwotICAgICJcMVwzNDVcMVwzMDZcNVwzMDVcMVwzMDZcMzZcMzA1XDEzXDBcMVwzNDZcNDVcMCIrCi0gICAgIlwxXDMwNlwxXDBcMTFcMzA2XDFcMzQ1XDQ1XDMwNlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcMzQ3XDMxXDE2MVw3XDBcMVwzNTBcMTAxXDBcMVwzNTFcMzBcMFwxXDMxNiIrCi0gICAgIlwxXDBcMTBcMzE2XDFcMFw0XDMxNlwxXDBcMzRcMzE2XDFcMFw1XDMxNiIrCi0gICAgIlwxXDBcM1wzMTZcMVwzMTdcNFwzMTZcMVwwXDFcMzE2XDFcMzE3XDJcMzE2IisKLSAgICAiXDFcMFwyXDMxNlwxXDMxN1wzMVwzMTZcMVwzNTJcNFwzMTZcMTVcMFwxXDMyMSIrCi0gICAgIlwzNlwwXDFcMzUzXDIxXDBcMVwzNTRcMTJcMFwzXDM1NFwyXDBcMVwzNTQiKwotICAgICJcMTFcMFwyXDM1NFwxXDBcMVwzNTRcMlwwXDJcMzU0XDEwXDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNFw1N1wxXDBcMTFcNTdcMVwzNTVcMVw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzM1wwXDFcMzU2IisKLSAgICAiXDEyXDBcMVwzNTZcNDBcMFwxXDM1N1w1N1wwXDFcMzYwXDY2XDBcMVwzNjEiKwotICAgICJcMTJcMFwxXDM2MVw0MFwwXDFcMzYyXDM1XDBcMlwzNjNcMVwwXDNcMzYzIisKLSAgICAiXDJcMFwxXDI1Mlw0XDM2M1wxXDBcNlwzNjNcMVwwXDI3XDM2M1w1XDAiKwotICAgICJcMlwzNjRcMVwwXDNcMzY0XDJcMFwxXDI3Nlw0XDM2NFwxXDBcNlwzNjQiKwotICAgICJcMVwwXDI3XDM2NFwyXDBcMlwxNTJcMVwwXDI1XDE1MlwxXDM2NVwzMFwxNTIiKwotICAgICJcM1wwXDJcMzY2XDFcMFwzXDM2NlwyXDBcMVwzMTFcNFwzNjZcMVwwIisKLSAgICAiXDZcMzY2XDFcMFwyN1wzNjZcMlwwXDJcMTYxXDFcMFwyNVwxNjFcMVwzNjciKwotICAgICJcMzBcMTYxXDMxXDBcMVwzNzBcMTAzXDBcMVwzNTJcMjFcMFwxXDM1NFwxMlwwIisKLSAgICAiXDNcMzU0XDJcMFwxXDM1NFwxMVwwXDJcMzU0XDFcMFwxXDM1NFwxXDAiKwotICAgICJcMVwzNTNcMlwzNTRcMTBcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3IisKLSAgICAiXDFcMFw2XDU3XDFcMzcxXDRcNTdcMVwwXDVcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDRcNTdcNDRcMFwxXDM3Mlw1NFwwXDFcMzczXDU1XDBcMVwzNzQiKwotICAgICJcNjBcMFwxXDM3NVw2M1wwXDFcMzc2XDIwXDBcMlwxNTJcMVwwXDI2XDE1MiIrCi0gICAgIlwxXDM3N1wyN1wxNTJcMlwxNjFcMVwwXDI2XDE2MVwxXHUwMTAwXDI3XDE2MVwzMlwwIisKLSAgICAiXDFcdTAxMDFcMzRcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcdTAxMDJcN1w1N1wxXDBcMlw1N1wxXHUwMTAyXDJcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDRcNTdcNDVcMFwxXHUwMTAzXDUyXDBcMVx1MDEwNFw2M1wwIisKLSAgICAiXDFcdTAxMDVcNDNcMFwxXHUwMTA2XDYzXDBcMVx1MDEwN1wyNVwwXDFcdTAxMDdcMlwwIisKLSAgICAiXDJcMTUyXDFcMFwyN1wxNTJcMVx1MDEwOFwyNlwxNTJcMlwxNjFcMVwwXDI3XDE2MSIrCi0gICAgIlwxXHUwMTA5XDI2XDE2MVwzM1wwXDFcdTAxMGFcMzJcMFwxXHUwMTBiXDNcNTdcM1wwIisKLSAgICAiXDFcdTAxMGJcMVw1N1w0XDBcMVx1MDEwYlw0XDU3XDFcMFwxM1w1N1wxXDAiKwotICAgICJcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzNVwwXDFcdTAxMGNcNTZcMCIrCi0gICAgIlwxXHUwMTBkXDEyXDBcMVx1MDEwZFw0NVwwXDFcdTAxMGVcMTJcMFwxXHUwMTBlXDEyXDAiKwotICAgICJcMlwxNTJcMVwwXDMwXDE1MlwxXHUwMTBmXDI1XDE1MlwyXDE2MVwxXDBcMzBcMTYxIisKLSAgICAiXDFcdTAxMTBcMjVcMTYxXDMyXDBcMVx1MDExMVwzM1wwXDFcdTAxMGJcNlwwXDFcdTAxMGIiKwotICAgICJcNVwwXDFcdTAxMGJcMzZcMFwyXDE1MlwxXDBcMjdcMTUyXDFcdTAxMTJcMjZcMTUyIisKLSAgICAiXDJcMTYxXDFcMFwyN1wxNjFcMVx1MDExM1wyNlwxNjFcMjdcMFwxXHUwMTE0XDMxXDAiKwotICAgICJcMlwxNTJcMVwwXDI0XDE1MlwxXHUwMTE1XDMxXDE1MlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcdTAxMTZcMzFcMTYxIjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAKLSAgICAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDksIAotICAgICAwLCAgMCwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgOSwgIDEsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JeXlfc3RhcnRSZWFkID0gMDsKLQotCS8qKiAKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgKiBmcm9tIGlucHV0IAotCSAqLwotCXl5X2VuZFJlYWQgPSAwOwotCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXlsaW5lID0gMDsKLQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5Y2hhciA9IDA7Ci0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JeXlfYXRFT0YgPSBmYWxzZTsKLQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCS8qIHVzZXIgdmFyczogKi8KLQlmVG9rZW5Db3VudCA9IDA7Ci0gCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQljb250ZXh0ID0gbnVsbDsKLQlzdGFydCA9IDA7Ci0JdGV4dExlbmd0aCA9IDA7Ci0JbGVuZ3RoID0gMDsKLX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotLyogdXNlciBtZXRob2QgKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzkyMTJdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDMyMjApIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzcyKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjc1OiAKLSAgICAgICAgY2FzZSAyNzY6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjgwOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyODE6IGJyZWFrOwotICAgICAgICBjYXNlIDI2NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSAyODM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgMjg0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTc6IAotICAgICAgICBjYXNlIDI2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAyODU6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjg4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSAyOTM6IGJyZWFrOwotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzAyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICAgIHsgCi0JLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgMzA0OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMDU6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgIGNhc2UgMjQ4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSAzMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzExOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgIGNhc2UgMjI2OiAKLSAgICAgICAgY2FzZSAyNDQ6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjYzOiAKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICBjYXNlIDI3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzEyOiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjMwOiAKLSAgICAgICAgY2FzZSAyNDY6IAotICAgICAgICBjYXNlIDI1NTogCi0gICAgICAgIGNhc2UgMjY0OiAKLSAgICAgICAgY2FzZSAyNzE6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzE0OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgMzE1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JU3RyaW5nIGJsb2NrQ29udGV4dCA9IGRvQmxvY2tTY2FuKCJdXT4iLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIGJsb2NrQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgMzE2OiBicmVhazsKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE3OiBicmVhazsKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzE4OiBicmVhazsKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzIzOiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICBjYXNlIDE2OTogCi0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDMyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgIGNhc2UgMjAwOiAKLSAgICAgICAgY2FzZSAyMjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDMzNDogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVFcXVhbHNSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGYzYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVFcXVhbHNSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRXF1YWxzUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotCXByaXZhdGUgc2hvcnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTdkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZU5hbWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQlwdWJsaWMgQXR0cmlidXRlTmFtZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlTmFtZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJfQotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhN2IzYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVWYWx1ZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQlwdWJsaWMgQXR0cmlidXRlVmFsdWVSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSAxOwotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJfQotCQkJLy8gdXBkYXRlIGxlbmd0aCAoYW5kIGVuZCkgYWZ0ZXIgYWJvdmUgY2hlY2sgZm9yIHdoaXRlIHNwYWNlLAotCQkJLy8gc2luY2UKLQkJCS8vIGl0IGxvb2tzIHRvIGRldGVybWluZSBpZiBhdCBlbmQgb2YgcmVnaW9uLgotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0dlbmVyaWNUZW1wbGF0ZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRmOThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCwgaXRzIGp1c3QgcHJlc2VudCB0byBzZXJ2ZXIgYXMgYQotICogZ2VuZXJpYyBzdGFydGluZyBwb2ludCBmb3IgYWRkaW5nIG5ldyBzcGVjaWZpYyByZWdpb24gdHlwZXMuCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1RlbXBsYXRlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCS8vIHNwZWNpZnkgY29ycmVjdCB0eXBlCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBHZW5lcmljVGVtcGxhdGVSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNUZW1wbGF0ZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblRvU3RyaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDc3OGJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdpb25Ub1N0cmluZ1V0aWwgewotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gcmVnaW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lICsgIi0tPiAiICsgcmVnaW9uLmdldFR5cGUoKSArICI6ICIgKyByZWdpb24uZ2V0U3RhcnQoKSArICItIiArIHJlZ2lvbi5nZXRUZXh0RW5kKCkgKyAocmVnaW9uLmdldFRleHRFbmQoKSAhPSByZWdpb24uZ2V0RW5kKCkgPyAoIi8iICsgcmVnaW9uLmdldEVuZCgpKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25VcGRhdGVSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblVwZGF0ZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1ODMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblVwZGF0ZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGNlbnRyYWxpemUgJ3JlZ2lvbicgdXBkYXRlLiBOb3RlOiBjYXJlIG11c3QgYmUKLSAqIHRha2VuIHRoYXQgaXMgaXMgbm90IHVzZWQgZm9yIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9yIGNvbnRhaW5lcgotICogcmVnaW9ucywgaXRzIG9ubHkgZm9yICJ0b2tlbiByZWdpb25zIgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uVXBkYXRlUnVsZSB7Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNoZWNrIHRoYXQgYSBKYXZhIExldHRlciBvciBEaWdpdCBpcwotCQkJLy8gdGhlIHNhbWUgdGhpbmcgYXMgYW4gWE1MIGxldHRlciBvciBkaWdpdAotCQkJaWYgKCEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFuZ2VzLmNoYXJBdChpKSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlcy5jaGFyQXQoaSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAocGFyZW50LmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQoSVRleHRSZWdpb24gcmVnaW9uLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKHJlZ2lvbi5nZXRUZXh0RW5kKCkpKSAmJiAoYWxsTGV0dGVyT3JEaWdpdChjaGFuZ2VzKSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIHdlIGRvbid0IGV4cGxlY3QgYSBudWxsIHBhcmVudCwgYnV0IGp1c3QgaW4gY2FzZSEKLQkJLy8gKGluIHdoaWNoIGNhc2UsIHdlIG11c3QgYmUgZGVhbGluZyB3aXRoIHJlZ2lvbnMgdGhhdCBhcmUKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykuCi0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJaWYgKHJlcXVlc3RTdGFydCA+IHBhcmVudC5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJaWYgKHJlcXVlc3RTdGFydCA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gbmVlZCBhbiBhZGp1c3QgdGV4dCBsZW5ndGggQVBJIGJlZm9yZSB0aGlzIGNhbiBiZSB1c2VkCi0Jc3RhdGljIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChJVGV4dFJlZ2lvbiByZWdpb24sIE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgcmVnaW9uLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKHJlZ2lvbi5nZXRTdGFydCgpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkgLSByZWdpb24uZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlyZWdpb24uYWRqdXN0TGVuZ3RoKGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlZ2lvbi5nZXRTdGFydCgpLCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJLy8JCQkJcmVnaW9uLmFkanVzdFRleHRMZW5ndGgobGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgcmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMmYxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnQ2xvc2VSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgYnl0ZSBmTGVuZ3RoID0gMTsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMTsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0U7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0KLQlwdWJsaWMgVGFnQ2xvc2VSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRhZ0Nsb3NlUmVnaW9uKGludCBzdGFydCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDYxOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUYWdOYW1lUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FOwotCXByaXZhdGUgc2hvcnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBzaG9ydCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIFRhZ05hbWVSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRhZ05hbWVSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IChzaG9ydCkgdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IChzaG9ydCkgbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSAoc2hvcnQpIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ09wZW5SZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnT3BlblJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTkwNGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnT3BlblJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnT3BlblJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODBjOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9XaGl0ZVNwYWNlT25seVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgV2hpdGVTcGFjZU9ubHlSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgYnl0ZSBmVGV4dExlbmd0aCA9IDA7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aDsKLQlwcm90ZWN0ZWQgaW50IGZTdGFydDsKLQotCXB1YmxpYyBXaGl0ZVNwYWNlT25seVJlZ2lvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBwb3NpdGlvbikgewotCi0JCXJldHVybiBmU3RhcnQgPD0gcG9zaXRpb24gJiYgcG9zaXRpb24gPCBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgaSkgewotCQlmU3RhcnQgPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRMZW5ndGgoc2hvcnQgaSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBjYWxsIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBzdHJpbmcpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgY2FsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdGhpcyBJVGV4dFJlZ2lvbiB0eXBlLCB0aGUgc3RhcnQgbXVzdCBpbiB0ZXJtcyBvZiB3aGF0IHRoZSByZWdpb24KLQkgKiBleHBlY3RzIC4uLiB0aGF0IGlzLCBpdHMgbm90IGRvY3VtZW50IG9mZnNldCwgYnV0IHN0YXJ0IHJlbGF0aXZlIHRvCi0JICogd2hhdCBldmVyIGNvbnRhaW5zIGl0LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCi0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ0RhdGFUZXh0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENEYXRhVGV4dFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWZhZWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ0RhdGFUZXh0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTENEYXRhVGV4dFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgWE1MQ0RhdGFUZXh0UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDRGF0YVRleHRSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkvLyBUT0RPOiBzaG91bGRuJ3QgY2RhdGEgYmUgbGlrZSBYTUwgQ29udGVudCAuLi4gbGVuZ3RoIGFuZCB0ZXh0Ci0JCS8vIGxlbmd0aAotCQkvLyBhbHdheXMgYmUgdGhlIHNhbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hpdGVzcGFjZT8KLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENEYXRhIHJlZ2lvbiBjYW4gaGF2ZQotCQkvLyBhIG11Y2gKLQkJLy8gYmV0dGVyIHJ1bGUgZm9yIHJlZ2lvbiB1cGRhdGUsIGJ1dCB0aGlzIGlzIHdoYXQgcHJldmlvdXMKLQkJLy8gKHVuZmFjdG9yZWQpCi0JCS8vIHZlcnNpb24gaGFkLCBzbyBJJ2xsIGNhcnJ5IGl0IG92ZXIsIG9mIG5vdy4KLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJfQotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENvbnRlbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2NiNTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLQotcHVibGljIGNsYXNzIFhNTENvbnRlbnRSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVDsKLQkvLyBsZW5ndGggYW5kIHRleHRMZW5ndGggYXJlIGFsd2F5cyB0aGUgc2FtZSBmb3IgY29udGVudCByZWdpb24KLQkvL3ByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0KLQlwdWJsaWMgWE1MQ29udGVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MQ29udGVudFJlZ2lvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgYSBwcmV0dHkgbGFtZSBtZXRob2QsIHNpbmNlIFhNTCBDb250ZW50IGNhbiBoYXZlIGEKLQkJLy8gbXVjaAotCQkvLyBiZXR0ZXIgcnVsZSBmb3IgcmVnaW9uIHVwZGF0ZSwgYnV0IHRoaXMgaXMgd2hhdCBwcmV2aW91cwotCQkvLyAodW5mYWN0b3JlZCkKLQkJLy8gdmVyc2lvbiBoYWQsIHNvIEknbGwgY2FycnkgaXQgb3Zlciwgb2Ygbm93LgotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJLy8gZG9uJ3QgbmVlZCBmb3IgY29udGVudCByZWdpb24KLQkJCS8vCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBjaGFuZ2VzLAotCQkJLy8gZlN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkvLwkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJLy8JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhOTk1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTEhlYWRQYXJzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFBhcnNlckZhY3RvcnkgewotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJLy8JCWlmIChjb250ZXh0ID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJbmV3UmVnaW9uID0gbmV3IFhNTEhlYWRQYXJzZXJSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgdGV4dCk7Ci0JCS8vCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTEhlYWRQYXJzZXJSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjZWVhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTEhlYWRQYXJzZXJSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFBhcnNlclJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IGNvbnRleHQ7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4M2Q2NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vIG5ld1JlZ2lvbi5zZXRQYXJlbnQocGFyZW50KTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBYTUxDRGF0YVRleHRSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgWE1MQ29udGVudFJlZ2lvbihzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnTmFtZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZU5hbWVSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnT3BlblJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IFRhZ0Nsb3NlUmVnaW9uKHN0YXJ0KTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBXaGl0ZVNwYWNlT25seVJlZ2lvbihzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlCi0JCS8vIHJlbW92ZWQgdGhpcyBjb25kaXRpb24gZHVyaW5nIHRyYW5zaXRpb24sIGFuZCBpbXBsZW1lbnRlZCBpbgotCQkvLyBzdWJjbGFzcwotCQkvLyBpZiAoY29udGV4dCA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkvLyBuZXdSZWdpb24gPSBuZXcgSlNQQ29kZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJLy8gfSBlbHNlCi0JCWlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IEZvcmVpZ25SZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCQkoKEZvcmVpZ25SZWdpb24pIG5ld1JlZ2lvbikuc2V0U3Vycm91bmRpbmdUYWcoc3Vycm91bmRpbmdUYWcpOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3UmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlODgxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhNTCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0JCS8vIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRILCA3Mik7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZmFsc2UpOwotCQlub2RlLnB1dChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCAxKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZhbHNlKTsKLQotCQkvLyBjbGVhbnVwIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUywgZmFsc2UpOwotCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgIlVURi04Iik7Ly8kTk9OLU5MUy0xJAotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSLCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMzc5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBYTUwgY29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgWE1MQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHRlbnNpb24gdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIE5ldyBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogVGhlIG1heGltdW0gd2lkdGggb2YgYSBsaW5lIGJlZm9yZSBhIGxpbmUgc3BsaXQgaXMgbmVlZGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfV0lEVEggPSAibGluZVdpZHRoIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgYWxsIGJsYW5rcyBsaW5lcyBzaG91bGQgYmUgY2xlYXJlZCBkdXJpbmcgZm9ybWF0dGluZy4KLQkgKiBCbGFuayBsaW5lcyB3aWxsIGJlIGtlcHQgd2hlbiBmYWxzZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9BTExfQkxBTktfTElORVMgPSAiY2xlYXJBbGxCbGFua0xpbmVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mICNJTkRFTlRBVElPTl9DSEFSIGZvciAxIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX1NJWkUgPSAiaW5kZW50YXRpb25TaXplIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIHVzZWQgZm9yIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUQUIsIFNQQUNFfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9DSEFSID0gImluZGVudGF0aW9uQ2hhciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogdGFiIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjU1BBQ0UKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gInRhYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHNwYWNlIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjVEFCCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFID0gInNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRhZ3Mgd2l0aCBtdWx0aXBsZSBhdHRyaWJ1dGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQKLQkgKiAoc3BsaXR0aW5nIGVhY2ggYXR0ciBvbiBhIG5ldyBsaW5lKS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUExJVF9NVUxUSV9BVFRSUyA9ICJzcGxpdE11bHRpQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBjbGVhbnVwIHByb2Nlc3NvciBzaG91bGQgZm9ybWF0IHNvdXJjZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGVtcHR5IGVsZW1lbnRzIHNob3VsZCBiZSBjb21wcmVzc2VkIGR1cmluZwotCSAqIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTID0gImNvbXByZXNzRW1wdHlFbGVtZW50VGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9SRVFVSVJFRF9BVFRSUyA9ICJpbnNlcnRSZXF1aXJlZEF0dHJzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IG1pc3NpbmcgdGFncyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfTUlTU0lOR19UQUdTID0gImluc2VydE1pc3NpbmdUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gcXVvdGUgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVEVfQVRUUl9WQUxVRVMgPSAicXVvdGVBdHRyVmFsdWVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gY29udmVydCBhbGwgbGluZSBkZWxpbWl0ZXJzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBsaW5lIGRlbGltaXRlciB0byB1c2UgZHVyaW5nIGNsZWFudXAgaWYgY29udmVydGluZyBsaW5lCi0JICogZGVsaW1pdGVycy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7Q1IsIENSTEYsIExGLCBOT19UUkFOU0xBVElPTn0KLQkgKiA8L3A+Ci0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIHdhcm5pbmcgc2hvdWxkIGJlIHByb2R1Y2VkIHdoZW4gdmFsaWRhdGluZyBhCi0JICogZmlsZSB0aGF0IHNwZWNpZmllcyBub3QgZ3JhbW1hci4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RSVUUsIEZBTFNFfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOX05PX0dSQU1NQVIgPSAid2Fybk5vR3JhbW1hciI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmQ2MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLS8qKgotICogVGhlIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgaXMgcGFydCBvZiB0aGUgImFkYXB0IG9uIGNyZWF0ZSIgbWVjaGFuaXNtLiBBCi0gKiBQcm9wYWdhdGluZ0FkYXB0ZXIsIG9uY2UgYWRkZWQgdG8gYSBub2RlLCB3aWxsIGNhdXNlIHByb2FnYXRpbmcgYWRhcHRlcnMgdG8KLSAqIGJlIGNyZWF0ZWQgZm9yIGFsbCBjaGlsZCBub2Rlcy4gQSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyBhCi0gKiBQcm9wYWdhdGluZ0FkYXB0ZXIgZm9yIGEgbm9kZSBpcyB0aGF0IGlzIGlzIGFsc28gY3JlYXRlcyBhZGFwdGVycyBmb3IgYW5kCi0gKiBhZGFwdHMgdGhlIE5vZGUgZm9yIGFsbCBvdGhlciByZWdpc3RlcmVkICdjcmVhdGUgb24gYWRhcHQnIEFkYXB0ZXJzLiBUaGlzCi0gKiBvdGhlciBhZGFwdGVycyBhcmUgcmVnaXN0ZXJlZCBieSByZWdpc3RlcmluZyB0aGVpciBmYWN0b3JpZXMgdmlhIHBsdWdpbgotICogZXh0ZW5zaW9uIHBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIFByb3BhZ2F0aW5nQWRhcHRlciBmQWRhcHRlckluc3RhbmNlOwotCXByaXZhdGUgTGlzdCBmQ29udHJpYnV0ZWRGYWN0b3JpZXMgPSBudWxsOwotCi0JLyoqCi0JICogUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpIHsKLQkJdGhpcyhQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7IC8vICwKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29udHJpYnV0ZWRGYWN0b3JpZXMoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWlmIChmQ29udHJpYnV0ZWRGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZkNvbnRyaWJ1dGVkRmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJLy8gZXZlcnkgbm90aWZpZXIgZ2V0J3Mgb25lIG9mIHRoZXNlCi0JCS8vIChhbmQgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgaXQpCi0JCXJldHVybiBnZXRBZGFwdGVySW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVySW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgUHJvcGFnYXRpbmdBZGFwdGVyCi0JICovCi0JcHJpdmF0ZSBQcm9wYWdhdGluZ0FkYXB0ZXIgZ2V0QWRhcHRlckluc3RhbmNlKCkgewotCQlpZiAoZkFkYXB0ZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmQWRhcHRlckluc3RhbmNlID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckltcGwoKTsKLQkJCWlmIChmQ29udHJpYnV0ZWRGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkNvbnRyaWJ1dGVkRmFjdG9yaWVzLnNpemUoKTsgaSsrKQotCQkJCQlmQWRhcHRlckluc3RhbmNlLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KChQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5KSBmQ29udHJpYnV0ZWRGYWN0b3JpZXMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkFkYXB0ZXJJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnaXZlIHRoZSBhZGFwdGVyIGluc3RhbmNlIGEgY2hhbmNlIHRvIHJlbGVhc2UgaXRzIGZhY3RvcmllcwotCQlnZXRBZGFwdGVySW5zdGFuY2UoKS5yZWxlYXNlKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250cmlidXRlZEZhY3RvcmllcyhBcnJheUxpc3QgbGlzdCkgewotCQlmQ29udHJpYnV0ZWRGYWN0b3JpZXMgPSBsaXN0OwotCi0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBjbG9uZWRJbnN0YW5jZSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCQkvLyBjbG9uZSB0aGlzIGFkYXB0ZXJzIHNwZWNpZmljIGxpc3Qgb2YgYWRhcHRlciBmYWN0b3JpZXMgdG9vCi0JCWlmIChmQ29udHJpYnV0ZWRGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZDb250cmlidXRlZEZhY3Rvcmllcy5pdGVyYXRvcigpOwotCQkJY2xvbmVkSW5zdGFuY2Uuc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMobmV3IEFycmF5TGlzdCgpKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGV4aXN0aW5nRmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJY2xvbmVkSW5zdGFuY2UuYWRkQ29udHJpYnV0ZWRGYWN0b3JpZXMoZXhpc3RpbmdGYWN0b3J5LmNvcHkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNsb25lZEluc3RhbmNlOwotCX0KLQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODE1OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgUHJvcGFnYXRpbmdBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFByb3BhZ2F0aW5nQWRhcHRlciB7Ci0KLQlwcml2YXRlIExpc3QgYWRhcHRPbkNyZWF0ZUZhY3RvcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdFByb3BhZ2F0aW5nQWRhcHRlckltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJvcGFnYXRpbmdBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRhcHRPbkNyZWF0ZShJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIGdpdmUgZWFjaCBvZiB0aGUgZmFjdG9yaWVzIGEgY2hhbmNlIHRvIGFkYXB0IHRoZSBub2RlLCBpZiBpdAotCQkvLyBjaG9vc2VzIHRvCi0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzICE9IG51bGwpIHsKLQotCi0JCQlzeW5jaHJvbml6ZWQgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMpIHsKLQkJCQlpbnQgbGVuZ3RoID0gYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJCWZhY3RvcnkuYWRhcHQobm9kZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWVjaGFuaXNtIGNhbiBiZSBtYWRlICJlYXNpZXIgdG8gdXNlIiBsYXRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJZ2V0QWRhcHRPbkNyZWF0ZUZhY3RvcmllcygpLmFkZChmYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCkgewotCQlpZiAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcyA9PSBudWxsKQotCQkJYWRhcHRPbkNyZWF0ZUZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGFkYXB0T25DcmVhdGVGYWN0b3JpZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIFByb3BhZ2F0aW5nQWRhcHRlciNpbml0aWFsaXplRm9yRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5LAotCSAqICAgICAgSU5vZGVOb3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRm9yRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElOb2RlTm90aWZpZXIgbm9kZSkgewotCQkvLyBJU1NVRTogd2UgYXJlIGEgRE9NIHNwZWNpZmljIGltcGxpbWVudGF0aW9uLCAKLQkJLy8gd2Ugc2hvdWxkIG5vdCBiZS4KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCXByb3BhZ2F0ZVRvKHhtbE5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0ludGVyZXN0aW5nKE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gKG5ld1ZhbHVlICE9IG51bGwgJiYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBuZXdWYWx1ZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIElzc3VlOiBXZSBvbmx5IHByb3BhZ2F0ZSB0byBFbGVtZW50cyAuLi4KLQkJLy8gbm90IGF0dHJpYnV0ZXMgdG9vISBXZSBzaG91bGQgY2FyZWZ1bCBjb25zaWRlciBkb25pbmcgYWxsIHdoZW4KLQkJLy8gd2hlbiB3ZSBpbXByb3ZlICJhZGFwdCBvbiBjcmVhdGUiIGRlc2lnbi4KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCAmJiBpc0ludGVyZXN0aW5nKG5ld1ZhbHVlKSkgewotCQkJcHJvcGFnYXRlVG8oKElET01Ob2RlKSBuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvcGFnYXRlVG8oSURPTU5vZGUgbm9kZSkgewotCQkvLyBnZXQgYWRhcHRlciB0byBlbnN1cmUgaXRzIGNyZWF0ZWQKLQkJbm9kZS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCWFkYXB0T25DcmVhdGUobm9kZSk7Ci0JCXByb3BhZ2F0ZVRvQ2hpbGRyZW4obm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb3BhZ2F0ZVRvQ2hpbGRyZW4oSURPTU5vZGUgcGFyZW50KSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJcHJvcGFnYXRlVG8oKElET01Ob2RlKSBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFByb3BhZ2F0aW5nQWRhcHRlciNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcyAhPSBudWxsKSB7Ci0KLQkJCXN5bmNocm9uaXplZCAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcykgewotCQkJCWludCBsZW5ndGggPSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLmdldChpKTsKLQkJCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTENoYXJFbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTENoYXJFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExNzE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxDaGFyRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogWE1MIE5hbWVzcGFjZSBjb25zdGFudHMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTENoYXJFbnRpdHkgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX05BTUUgPSAiYW1wIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTVBfUkVGID0gIiZhbXA7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTVBfVkFMVUUgPSAiJiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBPU19OQU1FID0gImFwb3MiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfUkVGID0gIiZhcG9zOyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBPU19WQUxVRSA9ICInIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHVF9OQU1FID0gImd0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHVF9SRUYgPSAiJmd0OyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfVkFMVUUgPSAiPiI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMVF9OQU1FID0gImx0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMVF9SRUYgPSAiJmx0OyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfVkFMVUUgPSAiPCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVF9OQU1FID0gInF1b3QiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfUkVGID0gIiZxdW90OyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVF9WQUxVRSA9ICJcIiI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NzM0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiBYTUwgTmFtZXNwYWNlIGNvbnN0YW50cwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MTmFtZXNwYWNlIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX1BSRUZJWCA9ICJ4bWxuczoiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0MGUwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIEtleXMgdG8gdXNlIGZvciBwcmVmZXJlbmNlIHNldHRpbmdzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxQcmVmZXJlbmNlTmFtZXMgewotCVN0cmluZyBDTEVBTlVQX0FUVFJfTkFNRV9DQVNFID0gImNsZWFudXBBdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCS8vIGNsZWFudXAgcHJlZmVyZW5jZSBuYW1lcwotCVN0cmluZyBDTEVBTlVQX1RBR19OQU1FX0NBU0UgPSAiY2xlYW51cFRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRfTUlTU0lOR19UQUdTID0gImluc2VydE1pc3NpbmdUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvLyBvdGhlcnMKLQlTdHJpbmcgTEFTVF9BQ1RJVkVfUEFHRSA9ICJsYXN0QWN0aXZlUGFnZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogbm90IHVzZWQgZm9yIG5vdyAvLyBoaWdobGlnaHRpbmcgdHlwZXMgU3RyaW5nIENPTU1FTlRfQk9SREVSID0KLQkgKiAiY29tbWVudEJvcmRlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ09NTUVOVF9URVhUID0KLQkgKiAiY29tbWVudFRleHQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENEQVRBX0JPUkRFUiA9Ci0JICogImNkYXRhQm9yZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBDREFUQV9URVhUID0KLQkgKiAiY2RhdGFUZXh0IjsvLyROT04tTkxTLTEkIFN0cmluZyBQSV9CT1JERVIgPSAicGlCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQkgKiBTdHJpbmcgUElfQ09OVEVOVCA9ICJwaUNvbnRlbnQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFRBR19CT1JERVIgPQotCSAqICJ0YWdCb3JkZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFRBR19OQU1FID0gInRhZ05hbWUiOy8vJE5PTi1OTFMtMSQKLQkgKiBTdHJpbmcgVEFHX0FUVFJJQlVURV9OQU1FID0gInRhZ0F0dHJpYnV0ZU5hbWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nCi0JICogVEFHX0FUVFJJQlVURV9WQUxVRSA9ICJ0YWdBdHRyaWJ1dGVWYWx1ZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcKLQkgKiBERUNMX0JPUkRFUiA9ICJkZWNsQm9kZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfTkFNRSA9Ci0JICogImRvY3R5cGVOYW1lIjsvLyROT04tTkxTLTEkIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEID0KLQkgKiAiZG9jdHlwZUV4dGVybmFsSWQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGID0KLQkgKiAiZG9jdHlwZUV4dGVybmFsUHVicmVmIjsvLyROT04tTkxTLTEkIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiA9Ci0JICogImRvY3R5cGVFeHRyZW5hbFN5c3JlZiI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgWE1MX0NPTlRFTlQgPQotCSAqICJ4bWxDb250ZW50IjsvLyROT04tTkxTLTEkIC8vIGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlcyBTdHJpbmcgQ09NTUEgPQotCSAqICIsIjsvLyROT04tTkxTLTEkIFN0cmluZyBDT0xPUiA9ICJjb2xvciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgTkFNRSA9Ci0JICogIm5hbWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBCQUNLR1JPVU5EID0gImJhY2tncm91bmQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIEJPTEQgPQotCSAqICJib2xkIjsvLyROT04tTkxTLTEkIFN0cmluZyBJVEFMSUMgPSAiaXRhbGljIjsvLyROT04tTkxTLTEkCi0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL05hbWVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJkMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MMTBOYW1lczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbnNpc3RlbnQgd2F5IHRvIHByZS1jaGVjayBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIFhNTAotICogbmFtZSwgYmVmb3JlLCBmb3IgZXhhbXBsZSwgdHJ5aW5nIHRvIGFjdHVhbGx5IGNyZWF0ZSBhbiBFbGVtZW50IHdpdGggaXQuCi0gKiBBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBFbGVtZW50IHdpdGggYW4gaW52YWxpZCBuYW1lIHdpbGwgdGhyb3cgdGhlIGFwcHJvcHJpYXRlCi0gKiBET00gRXhjZXB0aW9uLCBidXQgb2Z0ZW4gY2xpZW50cyB3YW50IHRvIGNoZWNrIHRoZSB2YWxpZGl0aW5nIG9mIGEgbmFtZQotICogc3VjaCBhcyBiYXNlZCBvbiBzb21lIHVzZXIgaW5wdXQsIGxvbmcgaW4gYWR2YW5jZSBvZiBhY3R1YWxseSBtYWtpbmcgCi0gKiB0aGUgRE9NIGNhbGwuIEFuZCwgbmF0dWFsbHksIHdhbnQgdG8gZ2l2ZSB0aGUgdXNlciBmZWVkYmFjayBpbiBhIG1vcmUgCi0gKiB0aW1lbHkgZmFzaGlvbi4KLSAqIAotICogSVNTVUU6IGlzICJlbmRuczoiIHJlYWxseSB2YWxpZCB4bWwgbmFtZT8gSSB0aGluayBub3QsIGJ1dCB0aGlzIG1ldGhvZAotICogKGN1cnJlbnRseSkgc2F5cyBpdCBpcy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFhNTDEwTmFtZXMgeG1sMTBjaGFyQ2hlY2tlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgdmFsaWQgWE1MIG5hbWUgYWNjb3JkaW5nIHRvIFhNTAotCSAqIDEuMCBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIGlzIHRoZSBzdHJpbmcgdG8gdGVzdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZCBuYW1lIGFjY29yZGluZyB0byBYTUwgMS4wIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBuYW1lKSB7Ci0KLQkJaWYgKHhtbDEwY2hhckNoZWNrZXIgPT0gbnVsbCkgewotCQkJeG1sMTBjaGFyQ2hlY2tlciA9IGluaXRpdGFpbGl6ZVhNTDEwTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4geG1sMTBjaGFyQ2hlY2tlci5pc1ZhbGlkWE1MMTBOYW1lKG5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhNTDEwTmFtZXMgaW5pdGl0YWlsaXplWE1MMTBOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBYTUwxME5hbWVzKChSZWFkZXIpIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdCBpbnRlbnRlZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIE5hbWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3Zjk0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jVHlwZSB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hUTUxfRE9DX1RZUEUgPSAiQ0hUTUwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVE1MX0RPQ19UWVBFID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1AxMV9ET0NfVFlQRSA9ICJKU1AxMSI7Ly8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50VHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFRyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlOWIxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50VHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogUG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnQgdHJhY2tlci4gQSB0cmFja2VyIG1hdGNoZXMgYQotICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB3aXRoIGEgQ01Eb2N1bWVudCB0aGF0IGl0IGVuYWJsZXMgYWxsb3dpbmcgZm9yCi0gKiBwb3NpdGlvbi1kZXBlbmRlbnQgY29udGVudCBtb2RlbHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50VHJhY2tlciB7Ci0KLQlDTURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTA1YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIENNTm9kZVdyYXBwZXIgZXh0ZW5kcyBDTU5vZGUgewotCUNNTm9kZSBnZXRPcmlnaW5Ob2RlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODQ3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb250ZW50TW9kZWxBZGFwdGVyIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRNb2RlbEFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIGdldENNRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTURvY3VtZW50Ci0JICogQHBhcmFtIG5vdGlmZXIKLQkgKiAKLQkgKiBSZXR1cm5zIENNRG9jdW1lbnQgYXNzb2NpYXRlZCB0byB0aGUgYWRhcHRpbmcgbm9kZS4gRm9yIGV4YW1wbCA6IEhUTUwKLQkgKiBDTURvY3VtZW50IGlzIGFzc29jaWF0ZWQgdG8gSFRNTCBEb2N1bWVudCBub2RlLCBEVEQgQ01Eb2N1bWVudCBpcwotCSAqIGFzc29jaWF0ZWQgdG8gRG9jdW1lbnRUeXBlIG5vZGUsIERURC9TY2hlbWEgQ01Eb2N1bWVudCBpcyBhc3NvY2lhdGVkIHRvCi0JICogRWxlbWVudCBub2RlIChzb21ldGltZSB3aXRoIG5hbWVzcGFjZSksIGFuZCB0YWdsaWIgQ01Eb2N1bWVudCBpcwotCSAqIGFzc29jaWF0ZWQgdG8gdGFnbGliIGRpcmVjdGl2ZSBFbGVtZW50IG5vZGUuCi0JICogCi0JICogSU5vZGVOb3RpZmllciBpcyBwYXNzZWQgZm9yIHN0YXRlbGVzcyAoc2luZ2xldG9uKSBJTm9kZUFkYXB0ZXIKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlDTURvY3VtZW50IGdldENNRG9jdW1lbnQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXIgbm90aWZpZXIpOwotCi0JLyoqCi0JICogZ2V0RGVjbGFyYXRpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbm90aWZlcgotCSAqIAotCSAqIFJldHVybnMgRWxlbWVudERlZmluaXRpb24gb3IgQXR0cmlidXRlRGVmaW5pdGlvbiBmb3IgdGhlIGFkYXB0aW5nIG5vZGUuCi0JICogCi0JICogSU5vZGVOb3RpZmllciBpcyBwYXNzZWQgZm9yIHN0YXRlbGVzcyAoc2luZ2xldG9uKSBJTm9kZUFkYXB0ZXIKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlDTU5vZGUgZ2V0RGVjbGFyYXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXIgbm90aWZpZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvTnVsbENvbnRlbnRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvTnVsbENvbnRlbnRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU3N2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpbnRpYWxpemUgc3BlY2lmaWMgdmFyaWFibGVzIHRoYXQgbmVlZCBhIGNvbnRlbnQKLSAqIG1vZGVsLCB1bnRpbCB0aGUgdHJ1ZSBjb250ZW50IG1vZGVsIGlzIGF2YWlsYWJsZS4gVGhpcyBwcmV2ZW50cyBoYXZpbmcgdG8KLSAqIGRvIGxvdHMgb2YgbnVsbCBjaGVja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsQ29udGVudE1vZGVsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsQ01OYW1lZE5vZGVNYXAgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgTnVsbEl0ZXJhdG9yKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHVibGljIE51bGxJdGVyYXRvcigpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHVibGljIE51bGxDb250ZW50TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IE51bGxDTU5hbWVkTm9kZU1hcCgpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ01OYW1lZE5vZGVNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MzYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBmZXcgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yWE1MIHsKLQkvKioKLQkgKiBUaGlzIGNvbnRlbnQgdHlwZSBpcyBhY3R1YWxseSBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuIEl0cyBnaXZlbiBoZXJlCi0JICoganVzdCBhcyBkb2N1bWVudGF0aW9uIGZvciBXVFAgYmFzZWQgY2xpZW50cy4gVHlwaWNhbGx5LCBjbGllbnRzIHNob3VsZAotCSAqIHVzZSB0aGUgdmFsdWVzL2NvbnN0YW50cyBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9YTUwgPSBnZXRDb25zdGFudFN0cmluZzIoKTsKLQkvKioKLQkgKiBUaGlzIHZhbHVlIGlzIHB1YmxpYyBvbmx5IGZvciB0ZXN0aW5nIGFuZCBzcGVjaWFsIGluZnJhc3RydWN0dXJlLiBUaGUKLQkgKiBjb25zdGFudCBub3IgaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICogCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9TU0VYTUwgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcyKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzk4ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBleHRlbnNpb25zIHRvIGNvcnJlc3BvbmRpbmcgRE9NIGludGVyZmFjZSB0byBlbmFibGUKLSAqIGZ1bmN0aW9ucyBmb3Igc291cmNlIGVkaXRpbmcgYW5kIGluY3JlbWVudGFsIHBhcnNpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUF0dHIgZXh0ZW5kcyBJRE9NTm9kZSwgQXR0ciB7Ci0KLQkvKioKLQkgKiBHZXQncyB0aGUgcmVnaW9uIGluIGF0dHJpYnV0ZSByZXByZXNlbnRpbmcgdGhlICc9JyBzaWduLiBNYXkgb3IgbWF5IG5vdAotCSAqIGhhdmUgd2hpdGVzcGFjZSBzdXJyb3VuZGluZyBpdC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIAotCSAqIElTU1VFOiBuZWVkIHRvIGNoYW5nZS9yZW1vdmUgdG8gYXZvaWQgZXhwb3NpbmcgJ0lUZXh0UmVnaW9uJwotCSAqIGNoYW5nZSB0byBvZmZzZXQgcGF0dGVybiwgYXMgb3RoZXJzLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24gLSB0aGUgcmVnaW9uIHJlcHJlc2VudGluZyB0aGUgZXF1YWxzIHNpZ24sIG9yIG51bGwKLQkgKiAgICAgICAgIGlmIHRoZWlyIGlzIG5vIGVxdWFscyBzaWduLgotCSAqLwotCUlUZXh0UmVnaW9uIGdldEVxdWFsUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIG5hbWUsIGluY2x1ZGluZwotCSAqIHdoaXRlc3BhY2UuCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLAotCSAqICAgICAgICAgaW5jbHVkaW5nIHdoaXRlc3BhY2UuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25FbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCWludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZVJlZ2lvblRleHQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgZXhjbHVkaW5nCi0JICogd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHJldHVybnMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIG5hbWUsIGV4Y2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCWludCBnZXROYW1lUmVnaW9uVGV4dEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gcmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlCi0JICogICAgICAgICB2YWx1ZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBiZXR0ZXIgc3BlYyBpbnRlcmFjdGlvbiB3aXRoIHF1b3RlIG1hcmtzCi0JICovCi0JaW50IGdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSByZXR1cm5zIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIGEgbmVzdGVkIHZhbHVlIChzdWNoIGFzIGEgSlNQIGV4cHJlc3Npb24pLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjb250YWlucyBhIG5lc3RlZCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gaGFzTmVzdGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIG9ubHkgbmFtZSBidXQgbm90IGVxdWFsIHNpZ24gbm9yIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgb25seSBuYW1lIGJ1dCBub3QgZXF1YWwgc2lnbiBub3IgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBoYXNOYW1lT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGF0dHJpYnV0ZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGZvciBkb2N1bWVudC4gUmV0dXJucwotCSAqIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBwcmVjZWVkZWQgYnkgYSBwcmVmaXggKHdoZXRoZXIgdmFsaWQgbmFtZSBzcGFjZQotCSAqIG9yIG5vdCkuIFJldHVybnMgdHJ1ZSBpZiBpdHMgb3duaW5nIGVsZW1lbnQgaXMgYSBnbG9iYWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgYXR0cmlidXRlIGlzIGRlZmluZWQgZ2xvYmFsbHkgZm9yIGRvY3VtZW50LiBSZXR1cm5zCi0JICogICAgICAgICBmYWxzZSBpZiBhdHRyaWJ1dGUgaXMgcHJlY2VlZGVkIGJ5IGEgcHJlZml4ICh3aGV0aGVyIHZhbGlkIG5hbWUKLQkgKiAgICAgICAgIHNwYWNlIG9yIG5vdCkuIFJldHVybnMgdHJ1ZSBpZiBpdHMgb3duaW5nIGVsZW1lbnQgaXMgYSBnbG9iYWwKLQkgKiAgICAgICAgIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbEF0dHIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgYXR0cgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHNwZWNpZnkgdGhpcyBvbmUgaW4gYSBtZWFuaW5nZnVsIHdheS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSByZXR1cm5zIHRydWUgaWYgaXMgeG1sIGF0dHIKLQkgKi8KLQlib29sZWFuIGlzWE1MQXR0cigpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5OTFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgY3JlYXRpb24gb2YgRE9DVFlQRSBkZWNsYXJhdGlvbiBhbmQgc29tZSBET00gTGV2ZWwgMgotICogaW50ZXJmYWNlcy4gTWF5IGJlIHJlZmVyZW5jZWQgYnV0IG5vdCBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRG9jdW1lbnQgZXh0ZW5kcyBOb2RlLCBEb2N1bWVudCwgSURPTU5vZGUgewotCi0JLyoqCi0JICogY3JlYXRlIGNvbW1lbnQgZWxlbWVudC4gdGFnTmFtZSBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgY29tbWVudCBlbGVtZW50Ci0JICogbmFtZSBpbiBwbHVnaW4ueG1sCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgSlNQIHN0eWxlIGNvbW1lbnQgKCZsdDslLS0gLi4uCi0JICogICAgICAgICAgICAtLSUmZ3Q7KQotCSAqIEByZXR1cm4gRWxlbWVudCBlbGVtZW50IGluc3RhbmNlCi0JICogQHRocm93cyBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aHJvd24gaWYgdGhlIGVsZW1lbnQgbmFtZSBpcyByZWdpc3RlcmVkIGFzIGNvbW1lbnQgZWxlbWVudAotCSAqLwotCUVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gaXNKU1BUYWcpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAKLQkgKiBJU1NVRTogSSBiZWxpZXZlIHRoaXMgJ25hbWUnIGlzIHRoZSBvbmUgc3BlY2lmaWMgaW4gZG9jdHlwZSBleHRlbnNpb24sCi0JICogbmVlZCB0byB2ZXJpZnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUgLQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZG9jdHlwZQotCSAqIEByZXR1cm4gRG9jdW1lbnRUeXBlIC0gcmV0dXJucyBhIGRvY3VtZW50IHR5cGUgbm9kZS4KLQkgKi8KLQlEb2N1bWVudFR5cGUgY3JlYXRlRG9jdHlwZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBEb2N1bWVudFR5cGUgSUQuIFVubGlrZSB0aGUgc3RhbmRhcmQgRE9NIGFwcHJvYWNoIG9mCi0JICogImdldERvY3VtZW50VHlwZSgpLmdldFB1YmxpY0lkKCkiLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpZCBldmVuIGlmCi0JICogaW1wbGljaXQuCi0JICogCi0JICogQHJldHVybiB0aGUgRG9jdW1lbnRUeXBlIElECi0JICovCi0JU3RyaW5nIGdldERvY3VtZW50VHlwZUlkKCk7Ci0KLQkvKioKLQkgKiBOT1QgQVBJIC4uLiBuZWVkcyB0byBiZSByZW1vdmVkL2NoYW5nZWQKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzcGVjaWZ5Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgSlNQRG9jdW1lbnQKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzSlNQRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLi4uIG5lZWRzIHRvIGJlIHJlbW92ZWQvY2hhbmdlZAotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWNpZnkKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNKU1BUeXBlKCk7Ci0KLQkvKioKLQkgKiBOT1QgQVBJIC4uLiBtYXkgcmVtb3ZlZC9jaGFuZ2VkCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlY2lmeSAtLSBjdXJyZW50bHkgdXNlZCB0byBkZW5vdGUgYW4gSFRNTCBET00gZG9jdW1lbnQKLQkgKiBpcyBYSFRNTAotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICogCi0JICovCi0JYm9vbGVhbiBpc1hNTFR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmZWU2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIHNldHRpbmcgb2YgUHVibGljIGFuZCBTeXN0ZW0gSUQgZm9yIERPQ1RZUEUKLSAqIGRlY2xhcmF0aW9uLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRG9jdW1lbnRUeXBlIGV4dGVuZHMgSURPTU5vZGUsIERvY3VtZW50VHlwZSB7Ci0KLQotCS8qKgotCSAqIFNldHMgZG9jdW1lbnQgdHlwZSdzIHB1YmxpYyBpZCwgYXMgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcgLQotCSAqICAgICAgICAgICAgdGhlIHB1YmxpY0lkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogU2V0cyBkb2NtZW50IHR5cGUncyBzeXN0ZW0gaWQsIGFzIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSBzeXN0ZW1JZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhNmZlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBleHRlbnNpb25zIHRvIGNvcnJlc3BvbmRpbmcgRE9NIGludGVyZmFjZSB0byBlbmFibGUKLSAqIGZ1bmN0aW9ucyBmb3Igc291cmNlIGVkaXRpbmcgYW5kIGluY3JlbWVudGFsIHBhcnNpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUVsZW1lbnQgZXh0ZW5kcyBJRE9NTm9kZSwgRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1bnMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgZW5kIHRhZy4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzb3J0IG91dCBuZWVkIGZvciB0aGlzCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLgotCSAqLwotCWludCBnZXRFbmRTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzb3J0IG91dCBuZWVkIGZvciB0aGlzCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgZW5kIG9mZnNldCBvZiB0aGUgc3RhcnQgdGFnLgotCSAqLwotCWludCBnZXRTdGFydEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGhhcyBhbiBlbmQgdGFnLgotCSAqIAotCSAqIEluIG91ciBzb3VyY2Utb3JpZW50ZWQgRE9NLCBzb21ldGltZXMgRWxlbWVudHMgYXJlICJlbmRlZCIsIGV2ZW4KLQkgKiB3aXRob3V0IGFuIGV4cGxpY2l0IGVuZCB0YWcgaW4gdGhlIHNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaGFzIGFuIGVuZCB0YWcuCi0JICovCi0JYm9vbGVhbiBoYXNFbmRUYWcoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBoYXMgYSBzdGFydCB0YWcuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZS1vcmllbnRlZCBET00sIGEgbG9uZSBlbmQgdGFnIHdpbGwgY2F1c2UgYSBub2RlIHRvIGJlCi0JICogY3JlYXRlZCBpbiB0aGUgdHJlZSwgdW5saWtlIHdlbGwtZm9ybWVkLW9ubHkgRE9Ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaGFzIGEgc3RhcnQgdGFnLgotCSAqLwotCWJvb2xlYW4gaGFzU3RhcnRUYWcoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYSBjb21tZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBlbGVtZW50IGlzIGEgY29tbWVudCBlbGVtZW50Ci0JICovCi0JYm9vbGVhbiBpc0NvbW1lbnRUYWcoKTsKLQotCS8qKgotCSAqIGlzRW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiBpcyBlbXB0eSB0YWcsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNFbXB0eVRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGZsb2F0aW5nIGVuZCB0YWcuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGZsb2F0aW5nIGVuZCB0YWcuCi0JICovCi0JYm9vbGVhbiBpc0VuZFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGZvciAiZ2xvYmFsIHRhZyIgKGJhc2ljYWxseSwgd2l0aG91dCBwcmVmaXgpCi0JICogCi0JICogQHJldHVybiB0cnVlIGZvciAiZ2xvYmFsIHRhZyIgKGJhc2ljYWxseSwgd2l0aG91dCBwcmVmaXgpCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGZvciBubyBzdGFydCBhbmQgdGhlIGVuZCB0YWdzIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBQcm92aWRlZCBmb3Igc29tZSB2ZXJ5IHNwZWNpYWwgY2FzZXMgd2hlbiwgZm9yIGV4YW1wbGUsIGFuZCBIVE1MIHRhZyBpcwotCSAqIGFzc3VtZWQgaW4gYW4gSFRNTCBkb2N1bWVudCB0aGF0IGRvZXMgbm90IGhhdmUgYSBsaXRlcmFsIEhUTUwgdGFnLgotCSAqIAotCSAqIElTU1VFOiBjaGVjayB3aXRoIGNsaWVudHMgdG8gc2VlIGlmIHN0aWxsIG5lZWRlZAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBvciBubyBzdGFydCBhbmQgdGhlIGVuZCB0YWdzIGluIHNvdXJjZS4KLQkgKi8KLQlib29sZWFuIGlzSW1wbGljaXRUYWcoKTsKLQotCS8qKgotCSAqIGlzSlNQVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIElTU1VFOiBjaGFuZ2UgdG8gaXNDb250YWluZXJMYW5ndWFnZVRhZyhTdHJpbmcgdHlwZSk7Ci0JICovCi0JYm9vbGVhbiBpc0pTUFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHN0YXJ0IHRhZyBpcyBjbG9zZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHN0YXJ0IHRhZyBpcyBjbG9zZWQuCi0JICovCi0JYm9vbGVhbiBpc1N0YXJ0VGFnQ2xvc2VkKCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgaXMgeG1sIHRhZwotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWMgdGhpcyBiZXR0ZXIuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGlzIHhtbCB0YWcKLQkgKi8KLQlib29sZWFuIGlzWE1MVGFnKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqIAotCSAqIG5vdGlmeUVuZFRhZ0NoYW5nZWQKLQkgKiAKLQkgKi8KLQl2b2lkIG5vdGlmeUVuZFRhZ0NoYW5nZWQoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogbm90aWZ5U3RhcnRUYWdDaGFuZ2VkCi0JICogCi0JICovCi0Jdm9pZCBub3RpZnlTdGFydFRhZ0NoYW5nZWQoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGEgY29tbWVudAotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzLgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q29tbWVudFRhZyhib29sZWFuIGlzQ29tbWVudFRhZyk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqIAotCSAqIFNpZ25pZnkgdGhhdCB0aGlzIHRhZyBpcyBhbiBlbXB0eSB0YWcKLQkgKiAKLQkgKiBGb3IgdXNlIG9ubHkgYnkgcGFyc2VycwotCSAqLwotCXZvaWQgc2V0RW1wdHlUYWcoYm9vbGVhbiBpc0VtcHR5VGFnKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGEgSlNQIHRhZwotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzCi0JICogCi0JICogSVNTVUU6IEkgaGF2ZSBoYWQgb25lIG5vbi1wYXJzaW5nIGNsaWVudCB3aG8gaGFzIGhhZCB0byB1c2UgdGhpcyAuLi4KLQkgKiBuZWVkIHRvIGNoZWNrCi0JICogCi0JICovCi0Jdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZyk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNJZCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlTm9kZShBdHRyIGlkQXR0ciwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGZmYjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eTsKLQotcHVibGljIGludGVyZmFjZSBJRE9NRW50aXR5IGV4dGVuZHMgRW50aXR5IHsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxNmQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBJRE9NSW1wbGVtZW50YXRpb24gewotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBUaGlzIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3BlY2lhbGl6ZWQgb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlCi0JICogc3BlY2lhbGl6ZWQgQVBJcyBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIHZlcnNpb24sIGFzIHNwZWNpZmllZCBpbiAuCi0JICogVGhlIHNwZWNpYWxpemVkIG9iamVjdCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBieSB1c2luZyBiaW5kaW5nLXNwZWNpZmljCi0JICogY2FzdGluZyBtZXRob2RzIGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgZXhwZWN0ZWQgdG8sIGFzIGRpc2N1c3NlZCBpbiAuCi0JICogVGhpcyBtZXRob2QgYWxzbyBhbGxvdyB0aGUgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBzcGVjaWFsaXplZAotCSAqIG9iamVjdHMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgcmVxdWVzdGVkLiBOb3RlIHRoYXQgYW55IHBsdXMgc2lnbgotCSAqICAgICAgICAgICAgIisiIHByZXBlbmRlZCB0byB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB3aWxsIGJlIGlnbm9yZWQKLQkgKiAgICAgICAgICAgIHNpbmNlIGl0IGlzIG5vdCBzaWduaWZpY2FudCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIG1ldGhvZC4KLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlIHNwZWNpYWxpemVkIEFQSXMgb2YgdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgdmVyc2lvbiwgaWYgYW55LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlcmUgaXMgbm8gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgaW50ZXJmYWNlcyBhc3NvY2lhdGVkCi0JICogICAgICAgICB3aXRoIHRoYXQgZmVhdHVyZS4gSWYgdGhlIDxjb2RlPkRPTU9iamVjdDwvY29kZT4gcmV0dXJuZWQgYnkKLQkgKiAgICAgICAgIHRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBpdCBtdXN0IGRlbGVnYXRlIHRvIHRoZSBwcmltYXJ5IGNvcmUKLQkgKiAgICAgICAgIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPiBhbmQgbm90IHJldHVybiByZXN1bHRzCi0JICogICAgICAgICBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcHJpbWFyeSBjb3JlCi0JICogICAgICAgICA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4gc3VjaCBhcwotCSAqICAgICAgICAgPGNvZGU+aGFzRmVhdHVyZTwvY29kZT4sIDxjb2RlPmdldEZlYXR1cmU8L2NvZGU+LCBldGMuCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhZjlkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxOb3RpZmllcjsKLQotLyoqCi0gKiBQcm92aWRlcyBtZWFucyB0byBnZXQgdGhlIFhNTE1vZGVsIGZvcm0gb2YgSVN0cnVjdXRyZWRNb2RlbC4gTm90IHRvIGJlCi0gKiBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NTW9kZWwgZXh0ZW5kcyBJU3RydWN0dXJlZE1vZGVsIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERPTSBEb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBET00gRG9jdW1lbnQuCi0JICovCi0JSURPTURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBSZXR1cm5zIGFuIHNvdXJjZSBnZW5lcmF0b3IgYXBwcm9wcmlhdGUgZm9yIHRoaXMgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIGdlbmVyYXRvcgotCSAqLwotCUlTb3VyY2VHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqIAotCSAqIFJldHVybnMgYW4gWE1MTW9kZWxOb3RpZmllci4gQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogc2hvdWxkIGJlICJpbnRlcm5hbGl6ZWQiLgotCSAqIAotCSAqLwotCVhNTE1vZGVsTm90aWZpZXIgZ2V0TW9kZWxOb3RpZmllcigpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKgotCSAqIFNldHMgdGhlIG1vZGVsIG5vdGlmaWVyIENsaWVudHMgc2hvdWxkIG5vdCB1c2UuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmV2aWV3IHdpdGggbGVnYWN5IGNsaWVudHMuCi0JICovCi0Jdm9pZCBzZXRNb2RlbE5vdGlmaWVyKFhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzg5YzI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVzY3JpYmVzIHRoZSBleHRlbmRlZCBmdW5jdGlvbmFsaXR5IG9mIG91ciBzb3VyY2Utb3JpZW50ZWQKLSAqIERPTS4gRmlyc3QsIG91ciBub2RlcyBleHRlbmQgdGhlIHczYyBOb2RlIGludGVyZmFjZSwgSW5kZXhlZFJlZ2lvbiwgYW5kCi0gKiBJTm9kZU5vdGlmaWVyLiBQbHVzLCBoYXMgdGhlIGV4dHJhIG1ldGhvZHMgY2FsbGVkIG91dCBoZXJlLgotICogCi0gKiBJU1NVRTogdGhlICdyZWFkLW9ubHknIEFQSSBzaG91bGQgYmUgYnJva2VuIG91dCBpbiB0aGVpciBvd24gaW50ZXJmYWNlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTU5vZGUgZXh0ZW5kcyBJbmRleGVkUmVnaW9uLCBJTm9kZU5vdGlmaWVyLCBOb2RlIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0RW5kL2dldExhc3QgY29uZnVzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAtIHJldHVybnMgdGhlIGxhc3Qgc3RydWN0dXJlZAotCSAqICAgICAgICAgZG9jdW1lbnQgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmVzb2x2ZSBnZXRGaXJzdC9nZXRTdGFydCBjb25mdXNpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmVzb2x2ZSBnZXRFbmQvZ2V0TGFzdCBjb25mdXNpb24uCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC0gcmV0dXJucyB0aGUgbGFzdCBzdHJ1Y3R1cmVkCi0JICogICAgICAgICBkb2N1bWVudCByZWdpb24gYXNzb2NpYXRlZCB3aXRoCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLiBSZXR1cm5zIG51bGwgaWYgbm90IHBhcnQKLQkgKiBvZiBhbiBhY3RpdmUgbW9kZWwuCi0JICogCi0JICogQHJldHVybiBJRE9NTW9kZWwgLSByZXR1cm5zIHRoZSBJRE9NTW9kZWwgdGhpcyBub2RlIGlzIHBhcnQgb2YuCi0JICovCi0JSURPTU1vZGVsIGdldE1vZGVsKCk7Ci0KLQkvKioKLQkgKiBHZXQncyB0aGUgcmVnaW9uIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBJU1NVRTogb25seSBpbXBsZW1lbnRlZC91c2VkIGF0IGF0dHJpYnV0ZSBhbmQgRFRETm9kZXMgLS0gc2hvdWxkIG1vdmUuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHJldHVybnMgdGhlIElUZXh0UmVnaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JICogICAgICAgICBOb2RlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCBzb3VyY2UgcmVwcmVzZW50aW5nIHRoaXMgbm9kZSBpbiBzb3VyY2UgZG9jdW1lbnQuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gZml4IGltcGxlbWVudGF0aW9uIHRvIG1hdGNoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpdGVyYWwgc291cmNlIHJlcHJlc2VudGluZyB0aGlzIG5vZGUgaW4gc291cmNlIGRvY3VtZW50LgotCSAqLwotCVN0cmluZyBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEZpcnN0L2dldFN0YXJ0IGNvbmZ1c2lvbgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHRoYXQgdW5kZXJsaWVzIHRoaXMgbm9kZSdzIG1vZGVsLgotCSAqIAotCSAqIFJldHVybnMgbnVsbCBpZiB0aGlzIG5vZGUgaXMgbm90IGFjdGl2ZWx5IHBhcnQgb2YgYSBzb3VyY2UgZG9jdW1lbnQuIEluCi0JICogY29udHJhc3QsIGluIHRoZSBwdXJlIERPTSB3b3JsZCwgIm93bmluZyBkb2N1bWVudCIgaXMgbm90IG51bGwgZXZlbgotCSAqIGFmdGVyIGEgbm9kZSBpcyBkZWxldGVkIGZyb20gdGhlIERPTS4KLQkgKiAKLQkgKiBJU1NVRTogd2UgbmVlZCB0byBmaXggb3VyIGltcGxlbWVudGF0aW9uIHRvIG1hdGNoIHRoaXMgc3BlYy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBHZXQncyB0aGUgcmVnaW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhpcyBub2RlIGlmIG9ubHkgb25lCi0JICogSVRleHRSZWdpb24sIG51bGwgb3RoZXJ3aXNlLgotCSAqIAotCSAqIElTU1VFOiBvbmx5IGltcGxlbWVudGVkL3VzZWQgYXQgYXR0cmlidXRlIGxldmVsLCBtb3ZlICJkb3duIi4KLQkgKiAKLQkgKiBAcmV0dXJuIElUZXh0UmVnaW9uIC0gcmV0dXJucyB0aGUgSVRleHRSZWdpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkgKiAgICAgICAgIE5vZGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXRWYWx1ZVJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSBvZiB0aGlzIG5vZGUsIGJ1dCB3aXRoCi0JICogY2hhcmFjdGVyIGVudGllcyBjb252ZXJ0ZWQgKGUuZy4gJmx0OyBpcyBjb252ZXJ0ZWQgdG8gJzwnKS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBiZXR0ZXIgc3BlYyBleHRlbnQgb2YgdGhpcyBjb252ZXJzaW9uLCB3ZSBtYXkgbm90IGtub3cKLQkgKiBhbGwgY2hhcmFjdGVyIGVudGl0aWVzLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGZpeCBpbXBsZW1lbnRhdGlvbiB0byBtYXRjaCBzcGVjLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIC0gZ2V0J3MgdGhlIHNvdXJjZSBvZiB0aGlzIE5vZGUuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlU291cmNlKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGtub3cgcmVhZC1vbmx5IHN0YXRlIG9mIGNoaWxkcmVuLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50IGNhbiBiZSBhcHBlbmRlZCBvcgotCSAqICAgICAgICAgcmVtb3ZlZC4KLQkgKi8KLQlib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRhZyBpcyBjbG9zZWQgaW4gc291cmNlLgotCSAqIAotCSAqIEluIG91ciBzb3VyY2Ugb3JpZW50IERPTSB3ZSBzb21ldGltZXMgZW5kIGEgTm9kZSB3aXRob3V0IGl0IGJlaW5nCi0JICogZXhwbGljaXRseSBjbG9zZWQgaW4gc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiAtIHRydWUgaWYgbm9kZSBpcyBjbG9zZWQKLQkgKi8KLQlib29sZWFuIGlzQ2xvc2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBub2RlIGNhbiBjb250YWluIGNoaWxkcmVuLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiAtIHRydWUgaWYgdGhpcyBub2RlIGNhbiBjb250YWluIGNoaWxkcmVuLgotCSAqLwotCWJvb2xlYW4gaXNDb250YWluZXIoKTsKLQotCS8qKgotCSAqIFVzZWQgdG8ga25vdyByZWFkLW9ubHkgc3RhdGUgb2YgZGF0YS4KLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzRGF0YUVkaXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXQncyByZWFkb25seSBzdGF0ZSBvZiBjaGlsZHJlbgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q2hpbGRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKTsKLQotCS8qKgotCSAqIFNldCdzIHJlYWRvbmx5IHN0YXRlIG9mIGRhdGEKLQkgKiAKLQkgKi8KLQl2b2lkIHNldERhdGFFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKTsKLQotCS8qKgotCSAqIFNldHMgcmVhZG9ubHkgc3RhdGUgb2YgZGF0YQotCSAqIAotCSAqIGZhc3RlciBhcHByb2FjaCB0byBzZXQgcmVhZC1vbmx5IHN0YXRlLgotCSAqLwotCXZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSwgYm9vbGVhbiBkZWVwKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCByYXcgc291cmNlIHRvIHRoZSBUZXh0IG5vZGUuIFRocm93cwotCSAqIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gd2hlbiB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgaW5jbHVkZXMKLQkgKiBpbnZhbGlkIGNoYXJhY3RlcnMsIHN1Y2ggYXMsICcgPCcsICc+JyBhbmQgJyYnLiBWYWxpZCBjaGFyYWN0ZXIKLQkgKiBlbnRpdGllcywgc3VjaCBhcywgIiZhbXA7bHQ7IiwgYXJlIGFjY2VwdGVkLgotCSAqLwotCXZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgdG8gdGhlIFRleHQgb3IgQXR0ciBub2RlJ3MgdmFsdWUuIFdoZW4KLQkgKiB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgaW5jbHVkZXMgaW52YWxpZCBjaGFyYWN0ZXJzLCBzdWNoIGFzLCAnIDwnLAotCSAqICc+JyBhbmQgJyYnLCBjb252ZXJ0cyB0aGVtLiBWYWxpZCBjaGFyYWN0ZXIgZW50aXRpZXMsIHN1Y2ggYXMsCi0JICogIiZhbXA7bHQ7IiwgYXJlIGFjY2VwdGVkLgotCSAqLwotCXZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSk7Ci0JCi0JCi0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG90aGVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VVUkkoKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbik7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dENvbnRlbnQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXF1YWxOb2RlKE5vZGUgYXJnKTsKLQkKLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcik7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKTsKLQkKLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0Q29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQkKLQkKLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTVRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4OGM3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01UZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZXh0ZW5zaW9ucyB0byBjb3JyZXNwb25kaW5nIERPTSBpbnRlcmZhY2UgdG8gZW5hYmxlCi0gKiBmdW5jdGlvbnMgZm9yIHNvdXJjZSBlZGl0aW5nIGFuZCBpbmNyZW1lbnRhbCBwYXJzaW5nLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01UZXh0IGV4dGVuZHMgSURPTU5vZGUsIFRleHQgewotCi0JLyoqCi0JICogTk9UIEFQSSAtIGNhbiBiZSBlbGltaW5hdGVkIG9yIG1vdmVkIHRvIGx0ayBsZXZlbAotCSAqIAotCSAqIEFwcGVuZHMgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgbm9kZQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0IHRvIGFwcGVuZC4KLQkgKi8KLQl2b2lkIGFwcGVuZFRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLSBjYW4gYmUgZWxpbWluYXRlZCBvciBtb3ZlZCB0byBsdGsgbGV2ZWwKLQkgKiAKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgbm90IHZhbGlkLgotCSAqLwotCWJvb2xlYW4gaXNJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgZW50aXJlbHkgd2hpdGUgc3BhY2UuCi0JICogCi0JICogVGhpcyBpcyBpbnRlbmVkIHRvIGJlIGJldHRlciBwZXJmb3JtaW5nIHRoYXQgYWxsIGNsaWVudHMgZ2V0dGluZyB0aGUKLQkgKiBzb3VyY2UsIGFuZCBjaGVja2luZyB0aGVtc2VsdmVzLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGNsYXJpZnkgaWYgaW1wbGVtZW50YXRpb24gaXMgcHVyZSB0byAid2hpdGUgc3BhY2UiIGFzCi0JICogcGVyIERPTSBzcGVjPyBIZXJlIGlzIHRoZSBET00gc3BlYzoKLQkgKiAKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZXh0IG5vZGUgY29udGFpbnMgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy14bWwtaW5mb3NldC0yMDA0MDIwNCNpbmZvaXRlbS5jaGFyYWN0ZXInPgotCSAqIGVsZW1lbnQgY29udGVudCB3aGl0ZXNwYWNlPC9hPiwgb2Z0ZW4gYWJ1c2l2ZWx5IGNhbGxlZCAiaWdub3JhYmxlCi0JICogd2hpdGVzcGFjZSIuIFRoZSB0ZXh0IG5vZGUgaXMgZGV0ZXJtaW5lZCB0byBjb250YWluIHdoaXRlc3BhY2UgaW4KLQkgKiBlbGVtZW50IGNvbnRlbnQgZHVyaW5nIHRoZSBsb2FkIG9mIHRoZSBkb2N1bWVudCBvciBpZiB2YWxpZGF0aW9uIG9jY3VycwotCSAqIHdoaWxlIHVzaW5nIDxjb2RlPkRvY3VtZW50Lm5vcm1hbGl6ZURvY3VtZW50KCk8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgZW50aXJlbHkgd2hpdGUgc3BhY2UuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpOwotCi0JLyoqCi0JICogTk9UIFlFVCBJTVBMRU1URU5URUQgYnV0IGV4aXN0cyBoZXJlIGludGVyZmFjZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NMwotCSAqIAotCSAqIFJldHVybnMgYWxsIHRleHQgb2YgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMgbG9naWNhbGx5LWFkamFjZW50IHRleHQKLQkgKiBub2RlcyB0byB0aGlzIG5vZGUsIGNvbmNhdGVuYXRlZCBpbiBkb2N1bWVudCBvcmRlci4gPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGV4YW1wbGUgYmVsb3cgPGNvZGU+d2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUKLQkgKiA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQgY29udGFpbnMgImJhciIgcmV0dXJucyAiYmFyZm9vIiwgd2hpbGUgb24KLQkgKiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0IGNvbnRhaW5zICJmb28iIGl0IHJldHVybnMgImJhcmZvbyIuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2hvbGVUZXh0KCk7Ci0KLQkvKioKLQkgKiBOT1QgWUVUIElNUExFTVRFTlRFRCBidXQgZXhpc3RzIGhlcmUgaW50ZXJmYWNlIGluIHByZXBhcmF0aW9uIGZvciBET00zCi0JICogCi0JICogUmVwbGFjZXMgdGhlIHRleHQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0Ci0JICogbm9kZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQuIEFsbCBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUKLQkgKiByZW1vdmVkIGluY2x1ZGluZyB0aGUgY3VycmVudCBub2RlIHVubGVzcyBpdCB3YXMgdGhlIHJlY2lwaWVudCBvZiB0aGUKLQkgKiByZXBsYWNlbWVudCB0ZXh0LiA8YnI+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbm9kZSB3aGljaCByZWNlaXZlZCB0aGUgcmVwbGFjZW1lbnQgdGV4dC4gVGhlCi0JICogcmV0dXJuZWQgbm9kZSBpczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPm51bGw8L2NvZGU+LCB3aGVuIHRoZSByZXBsYWNlbWVudCB0ZXh0IGlzIHRoZSBlbXB0eQotCSAqIHN0cmluZzsgPC9saT4KLQkgKiA8bGk+dGhlIGN1cnJlbnQgbm9kZSwgZXhjZXB0IHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyByZWFkLW9ubHk7IDwvbGk+Ci0JICogPGxpPiBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIG9mIHRoZSBzYW1lIHR5cGUgKAotCSAqIDxjb2RlPlRleHQ8L2NvZGU+IG9yIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4pIGFzIHRoZSBjdXJyZW50Ci0JICogbm9kZSBpbnNlcnRlZCBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcGxhY2VtZW50LiA8L2xpPgotCSAqIDwvdWw+Ci0JICogPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUgY2FsbGluZwotCSAqIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+IG9uIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQKLQkgKiBjb250YWlucyAiYmFyIiB3aXRoICJ5byIgaW4gYXJndW1lbnQgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOiA8YnI+Ci0JICogV2hlcmUgdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQgYXJlIHJlYWQtb25seSBkZXNjZW5kYW50cyBvZiBhbgotCSAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+Ci0JICogbXVzdCBiZSByZW1vdmVkIGluc3RlYWQgb2YgdGhlIHJlYWQtb25seSBub2Rlcy4gSWYgYW55Ci0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiB0byBiZSByZW1vdmVkIGhhcyBkZXNjZW5kYW50cyB0aGF0IGFyZQotCSAqIG5vdCA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+LCA8Y29kZT5UZXh0PC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLCB0aGUgPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4KLQkgKiBtZXRob2QgbXVzdCBmYWlsIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIGRvY3VtZW50LAotCSAqIHJhaXNpbmcgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGNvZGUKLQkgKiA8Y29kZT5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI8L2NvZGU+LiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhhbXBsZSBiZWxvdyBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIGZhaWxzLCBiZWNhdXNlIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUKLQkgKiAiZW50IiBjb250YWlucyBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2RlIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICBUaGUgY29udGVudCBvZiB0aGUgcmVwbGFjaW5nIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUuCi0JICogQHJldHVybiBUaGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgY29udGVudC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcyBiZWluZyByZXBsYWNlZCBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU291cmNlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1NzZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogCi0gKiBJU291cmNlR2VuZXJhdG9yIGFsbG93cyBET00gbW9kZWxzIHRvIGdlbmVyYXRlIHNvdXJjZSBhcHByb3ByaWF0ZSBmb3IgdGhlaXIKLSAqIHBhcmFtZXRlciwgcmVsYXRpdmUgdG8gdGhlIG1vZGVsIHRoYXQgcHJvdmlkZXMgdGhlIHNvdXJjZSBnZW5lcmF0b3IuCi0gKiAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VHZW5lcmF0b3IgewotCi0JLyoqCi0JICogR2VuZXJhdGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0ck5hbWUoQXR0ciBhdHRyKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0cik7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUF0dHJWYWx1ZQotCSAqIAotCSAqIEBwYXJhbSBhdHRyIC0KLQkgKiAgICAgICAgICAgIHRoZSBBdHRyCi0JICogQHBhcmFtIGNoYXIgLQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcXVvdGUgZGVzaXJlZCAoJyBvciAiKS4KLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0ciwgY2hhciBxdW90ZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUF0dHJWYWx1ZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIFN0cmluZyB2YWx1ZQotCSAqIEBwYXJhbSBjaGFyIC0KLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHF1b3RlIGRlc2lyZWQgKCcgb3IgIikuCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIENEQVRBU2VjdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAcGFyYW0gTm9kZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDaGlsZChOb2RlIHBhcmVudE5vZGUpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDbG9zZVRhZwotCSAqIAotCSAqIEBwYXJhbSBub2RlIC0KLQkgKiAgICAgICAgICAgIHRoZSBOb2RlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNsb3NlVGFnKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNvbW1lbnQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkNvbW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQ29tbWVudChDb21tZW50IGNvbW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVEb2N0eXBlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkb2NUeXBlCi0JICogICAgICAgICAgICBEb2N1bWVudFR5cGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRG9jdHlwZShEb2N1bWVudFR5cGUgZG9jVHlwZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVuZFRhZyhFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVFbnRpdHlSZWYgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVudGl0eVJlZgotCSAqICAgICAgICAgICAgRW50aXR5UmVmZXJlbmNlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVudGl0eVJlZihFbnRpdHlSZWZlcmVuY2UgZW50aXR5UmVmKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlUEkgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBpIC0KLQkgKiAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVQSShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVTb3VyY2UgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIE5vZGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU291cmNlKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSB0YWcgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRhZ05hbWUoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCAtCi0JICogICAgICAgICAgICB0aGUgVGV4dAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVUZXh0KFRleHQgdGV4dCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZSB0ZXh0IGRhdGEKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCAtCi0JICogICAgICAgICAgICB0aGUgVGV4dAotCSAqIEBwYXJhbSBkYXRhIC0KLQkgKiAgICAgICAgICAgIHRoZSBkYXRhCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHREYXRhKFRleHQgdGV4dCwgU3RyaW5nIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0NvbW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjUyZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBOb2RlRm9ybWF0dGVyIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgYWRqdXN0SW5kZW50YXRpb25zKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgbGluZUluZGVudCwgU3RyaW5nIHNpbmdsZUluZGVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZygpOwotCi0JCWludCBpbmRleE9mTGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZMaW5lRGVsaW1pdGVyKGFTdHJpbmcpOwotCQlyZXN1bHQgPSBhU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleE9mTGluZURlbGltaXRlcik7Ci0JCXdoaWxlIChpbmRleE9mTGluZURlbGltaXRlciAhPSAtMSkgewotCQkJLy8gQmVmb3JlIGZpbmQgdGhlIG5leHQgTGluZURlbGltaXRlciwgd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZQotCQkJLy8gc2l6ZSBvZiB0aGUgY3VycmVudCBMaW5lRGVsaW1pdGVyCi0JCQkvLyBzbyB3ZSBjYW4gZmlndXJlIG91dCBob3cgbWFueSBieXRlcyB0byBza2lwIGJlZm9yZSBmaW5kaW5nIHRoZQotCQkJLy8gbmV4dCBMaW5lRGVsaW1pdGVyLgotCQkJLy8gT3RoZXJ3aXNlLCB3ZSBtYXkgdHJlYXQgdGhlIExGIGluIENSTEYgYXMgdGhlIG5leHQKLQkJCS8vIExpbmVEZWxpbWl0ZXIuCi0JCQlpbnQgbGluZURlbGltaXRlclNpemUgPSAxOwotCQkJaWYgKGFTdHJpbmcubGVuZ3RoKCkgPj0gaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAyICYmIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZMaW5lRGVsaW1pdGVyLCBpbmRleE9mTGluZURlbGltaXRlciArIDEpLmNvbXBhcmVUbyhDUikgPT0gMCAmJiBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTGluZURlbGltaXRlciArIDEsIGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMikuY29tcGFyZVRvKExGKSA9PSAwKQotCQkJCWxpbmVEZWxpbWl0ZXJTaXplID0gMjsKLQotCQkJaW50IGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgbGluZURlbGltaXRlclNpemUpOwotCQkJaW50IGluZGV4T2ZOb25ibGFuayA9IFN0cmluZ1V0aWxzLmluZGV4T2ZOb25ibGFuayhhU3RyaW5nLCBpbmRleE9mTGluZURlbGltaXRlcik7Ci0KLQkJCWlmIChpbmRleE9mTm9uYmxhbmsgIT0gLTEpIHsKLQkJCQlpZiAoaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyID09IC0xKSB7Ci0JCQkJCS8vIGxhc3QgbGluZTsgY29weSB0aWxsIHRoZSBlbmQKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQgKyBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTm9uYmxhbmspOwotCQkJCX0gZWxzZSBpZiAoaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyICE9IC0xICYmIGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA8IGluZGV4T2ZOb25ibGFuaykgewotCQkJCQkvLyBibGFuayBsaW5lOyBqdXN0IGFkZCBhIGluZGVudAotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjb3B5IGFsbCB0ZXh0IGJldHdlZW4gaW5kZXhPZk5vbmJsYW5rIGFuZAotCQkJCQkvLyBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQgKyBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTm9uYmxhbmssIGluZGV4T2ZOZXh0TGluZURlbGltaXRlcik7Ci0JCQkJfQotCi0JCQkJaW5kZXhPZkxpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXI7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPT0gLTEpIHsKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYmxhbmsgbGluZTsganVzdCBhZGQgYSBpbmRlbnQKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJfQotCi0JCQkJaW5kZXhPZkxpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJLy8gbGluZURlbGltaXRlckZvdW5kIG1lYW5zIG11bHRpIGxpbmUgY29tbWVudAotCQkJU3RyaW5nIG5vZGVWYWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlib29sZWFuIGxpbmVEZWxpbWl0ZXJGb3VuZEluQ29tbWVudCA9IFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihub2RlVmFsdWUpOwotCi0JCQlpZiAobGluZURlbGltaXRlckZvdW5kSW5Db21tZW50KSB7Ci0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGJlZm9yZSBub2RlCi0JCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJLy8gYWRqdXN0IGluZGVudGF0aW9ucyBpbiBtdWx0aSBsaW5lIGNvbW1lbnQKLQkJCQlTdHJpbmcgbGluZURlbGltaXRlciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJCQlTdHJpbmcgbmV3Tm9kZXZhbHVlID0gYWRqdXN0SW5kZW50YXRpb25zKG5vZGVWYWx1ZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQsIHNpbmdsZUluZGVudCk7Ci0JCQkJaWYgKG5vZGVWYWx1ZS5jb21wYXJlVG8obmV3Tm9kZXZhbHVlKSAhPSAwKQotCQkJCQlub2RlLnNldE5vZGVWYWx1ZShuZXdOb2RldmFsdWUpOwotCQkJfQotCi0JCQlpZiAoIW5vZGVIYXNTaWJsaW5ncyhub2RlKSB8fCAobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSAhPSBudWxsICYmIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVZhbHVlKCkpICYmIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSkgewotCQkJCS8vIHNpbmdsZSBjaGlsZAotCQkJCS8vIG9yIGlubGluZSBjb21tZW50IGFmdGVyIHRleHQKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9IGVsc2UKLQkJCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJCWZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRG9jdW1lbnROb2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2YmUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50Tm9kZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkcmVuKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCVN0cmluZyBzaW5nbGVJbmRlbnQgPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCi0JCWlmIChub2RlICE9IG51bGwgJiYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCB8fCAhZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkvLyBub3JtYWxpemUgbm9kZSBmaXJzdCB0byBjb21iaW5lIGFkamFjZW50IHRleHQgbm9kZXMKLQkJCW5vZGUubm9ybWFsaXplKCk7Ci0KLQkJCUlET01Ob2RlIG5leHRDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQlJRE9NTm9kZSBlYWNoQ2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IChJRE9NTm9kZSkgZWFjaENoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IGdldEZvcm1hdHRlcihlYWNoQ2hpbGROb2RlKTsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgY2hpbGRGb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCQlTdHJpbmcgY2hpbGRJbmRlbnQgPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRDdXJyZW50SW5kZW50KGNoaWxkSW5kZW50KTsKLQkJCQljaGlsZEZvcm1hdENvbnRyYWludHMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKTsKLQotCQkJCS8vIGZvcm1hdCBlYWNoIGNoaWxkCi0JCQkJZm9ybWF0dGVyLmZvcm1hdChlYWNoQ2hpbGROb2RlLCBjaGlsZEZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJaWYgKG5leHRDaGlsZCAhPSBudWxsICYmIG5leHRDaGlsZC5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLQkJCQkJLy8gbmV4dE5vZGUgaXMgZGVsZXRlZCBkdXJpbmcgZm9ybWF0Ci0JCQkJCW5leHRDaGlsZCA9IChJRE9NTm9kZSkgZWFjaENoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0VsZW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDA5YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlRm9ybWF0dGVyIGV4dGVuZHMgRG9jdW1lbnROb2RlRm9ybWF0dGVyIHsKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJyInOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVTID0gIlwiXCIiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgRVFVQUxfQ0hBUiA9ICc9JzsgLy8gZXF1YWwgc2lnbiROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUFJFU0VSVkUgPSAicHJlc2VydmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9RVU9URUQgPSAiXCJwcmVzZXJ2ZVwiIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFhNTF9TUEFDRSA9ICJ4bWw6c3BhY2UiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEVuZFRhZyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAoIWlzRW5kVGFnTWlzc2luZyhub2RlKSkgewotCQkJLy8gZW5kIHRhZyBleGlzdHMKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQlTdHJpbmcgbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCWlmIChpc0VuZFRhZ01pc3NpbmcobGFzdENoaWxkKSkgewotCQkJCQkvLyBmaW5kIGRlZXBlc3QgY2hpbGQKLQkJCQkJSURPTU5vZGUgZGVlcGVzdENoaWxkID0gKElET01Ob2RlKSBsYXN0Q2hpbGQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJCXdoaWxlIChkZWVwZXN0Q2hpbGQgIT0gbnVsbCAmJiBkZWVwZXN0Q2hpbGQuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiBpc0VuZFRhZ01pc3NpbmcoZGVlcGVzdENoaWxkKSkgewotCQkJCQkJbGFzdENoaWxkID0gZGVlcGVzdENoaWxkOwotCQkJCQkJZGVlcGVzdENoaWxkID0gKElET01Ob2RlKSBkZWVwZXN0Q2hpbGQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZGVlcGVzdENoaWxkICE9IG51bGwpIHsKLQkJCQkJCWlmIChkZWVwZXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCS8vIFNwZWNpYWwgaW5kZW50YXRpb24gaGFuZGxpbmcgaWYgbGFzdENoaWxkJ3MgZW5kCi0JCQkJCQkJLy8gdGFnIGlzIG1pc3NpbmcgYW5kIGRlZXBlc3RDaGlsZCBpcyBhIHRleHQgbm9kZS4KLQkJCQkJCQlTdHJpbmcgbm9kZVRleHQgPSBkZWVwZXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0KLQkJCQkJCQlpZiAoIW5vZGVUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJCQkJCW5vZGVUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKG5vZGVUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQkJbm9kZVRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgobm9kZVRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQkJfQotCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShkZWVwZXN0Q2hpbGQsIG5vZGVUZXh0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCS8vIGluZGVudCBlbmQgdGFnCi0JCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJfQotCQkJZWxzZSBpZiAobGFzdENoaWxkID09IG51bGwgJiYgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluc0xpbmVEZWxpbWl0ZXJzKG5vZGUpKSB7Ci0JCQkJLy8gaW5kZW50IGVuZCB0YWcKLQkJCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpLCAwLCBsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKTsKLQkJCX0KLQotCQkJLy8gZm9ybWF0IGVuZCB0YWcgbmFtZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQkJSVRleHRSZWdpb24gZW5kVGFnTmFtZVJlZ2lvbiA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCXJlbW92ZVJlZ2lvblNwYWNlcyhub2RlLCBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGVuZFRhZ05hbWVSZWdpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYmVmb3JlIG5vZGUKLQkJCWZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQotCQkJLy8gZm9ybWF0IHN0YXJ0IHRhZwotCQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0KLQkJCWJvb2xlYW4gY3VycmVudGx5SW5YbWxTcGFjZVByZXNlcnZlID0gZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCk7Ci0JCQlmb3JtYXRTdGFydFRhZyhub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCS8vIHNhdmUgbmV3IG5vZGUKLQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCQkvLyBmb3JtYXQgY2hpbGRyZW4gYW5kIGVuZCB0YWcgaWYgbm90IGVtcHR5IHN0YXJ0IHRhZwotCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gZm9ybWF0IGNoaWxkcmVuCi0JCQkJCWZvcm1hdENoaWxkcmVuKG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJCS8vIHNhdmUgbmV3IG5vZGUKLQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0KLQkJCQkJLy8gZm9ybWF0IGVuZCB0YWcKLQkJCQkJZm9ybWF0RW5kVGFnKG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQkJCX0KLQkJCX0KLQotCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGN1cnJlbnRseUluWG1sU3BhY2VQcmVzZXJ2ZSk7Ci0JCQkvLyBvbmx5IGluZGVudCBpZiBub3QgYXQgbGFzdCBub2RlCi0JCQlpZiAobmV3Tm9kZSAhPSBudWxsICYmIG5ld05vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBhZnRlciBub2RlCi0JCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmb3JtYXRzIHRoZSBzdGFydCB0YWcgbmFtZSwgYW5kIGZvcm1hdHMgdGhlIGF0dHJpYnV0ZXMgaWYKLQkgKiBhdmFpbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0U3RhcnRUYWcoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCVN0cmluZyBhdHRySW5kZW50ID0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMgPSAoKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuZ2V0U3BsaXRNdWx0aUF0dHJzKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJLy8gTm90ZTogYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIG51bGwgZXZlbiBpZiB0aGUgbm9kZSBoYXMgbm8KLQkJLy8gYXR0cmlidXRlcy4gSG93ZXZlciwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSB3aWxsIGJlIDAuIEJ1dCwgY2hlY2sKLQkJLy8gZm9yIG51bGwganVzdCBpbiBjYXNlLgotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkvLyBjb21wdXRlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCWludCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gMDsKLQkJCXRyeSB7Ci0JCQkJLy8gMSBpcyBmb3IgIjwiCi0JCQkJaW50IG5vZGVOYW1lT2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSArIG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKTsKLQkJCQlpbnQgbGluZU9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQobm9kZU5hbWVPZmZzZXQpLmdldE9mZnNldCgpOwotCQkJCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQobGluZU9mZnNldCwgbm9kZU5hbWVPZmZzZXQgLSBsaW5lT2Zmc2V0KTsKLQkJCQlpbnQgdXNlZFdpZHRoID0gZ2V0SW5kZW50YXRpb25MZW5ndGgodGV4dCk7Ci0JCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCkgLSB1c2VkV2lkdGg7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQkJaW50IGF0dHJMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJaW50IGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSAwOwotCQkJYm9vbGVhbiBzYXdYbWxTcGFjZSA9IGZhbHNlOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJMZW5ndGg7IGkrKykgewotCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0KLQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQlTdHJpbmcgdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBhdHRyLmdldFN0YXJ0T2Zmc2V0KCkgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGF0dHIuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJCS8vIGNoZWNrIGZvciB4bWw6c3BhY2UgYXR0cmlidXRlCi0JCQkJaWYgKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikuY29tcGFyZVRvKFhNTF9TUEFDRSkgPT0gMCkgewotCQkJCQlpZiAodmFsdWVSZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gWzExMTY3NF0gSWYgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHlldCwgdHJlYXQgYXMKLQkJCQkJCS8vIHByZXNlcnZlLCBidXQgb25seSBhcyBoaW50Ci0JCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQkvLyBOb3RlIHdlIGRvbid0IHNldCAnc2F3WG1sU3BhY2UnLCBzbyB0aGF0IGRlZmF1bHQgb3IKLQkJCQkJCS8vIGZpeGVkIERURC9YU0QgdmFsdWVzIG1heSBvdmVycmlkZS4KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQotCQkJCQkJLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluCi0JCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBub3cuCi0JCQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikuY2hhckF0KDApOwotCQkJCQkJCWlmICgoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkgfHwgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpKQotCQkJCQkJCQluZXdBdHRyVmFsdWUgPSBET1VCTEVfUVVPVEVTOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV3QXR0clZhbHVlLmNvbXBhcmVUbyhQUkVTRVJWRV9RVU9URUQpID09IDApCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KHRydWUpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChmYWxzZSk7Ci0JCQkJCQlzYXdYbWxTcGFjZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc3BsaXRNdWx0aUF0dHJzICYmIGF0dHJMZW5ndGggPiAxKSB7Ci0JCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobGluZURlbGltaXRlciArIGF0dHJJbmRlbnQpOwotCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKTsKLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChFUVVBTF9DSEFSKTsKLQotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKTsKLQotCQkJCQkJLy8gTm90ZTogdHJpbSgpIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvcgotCQkJCQkJLy8gdmFsdWVSZWdpb24uZ2V0VGV4dCgpLiBKdXN0IGEgd29ya2Fyb3VuZCBmb3IgYQotCQkJCQkJLy8gcHJvYmxlbSBmb3VuZCBpbiB2YWx1ZVJlZ2lvbiBmb3Igbm93LgotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS50cmltKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJaW50IHRleHRMZW5ndGggPSAxICsgZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKSArIDEgKyBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJCWlmIChpID09IGF0dHJMZW5ndGggLSAxKSB7Ci0JCQkJCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKQotCQkJCQkJCQkJLy8gMyBpcyBmb3IgIiAvPiIKLQkJCQkJCQkJCXRleHRMZW5ndGggKz0gMzsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJLy8gMSBpcyBmb3IgIj4iCi0JCQkJCQkJCQl0ZXh0TGVuZ3RoKys7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA+PSB0ZXh0TGVuZ3RoKSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLS07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIgKyBhdHRySW5kZW50KTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSAtIGF0dHJJbmRlbnQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0KLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbik7Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoRVFVQUxfQ0hBUik7Ci0KLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbik7Ci0KLQkJCQkJCS8vIE5vdGU6IHRyaW0oKSBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IKLQkJCQkJCS8vIHZhbHVlUmVnaW9uLmdldFRleHQoKS4gSnVzdCBhIHdvcmthcm91bmQgZm9yIGEKLQkJCQkJCS8vIHByb2JsZW0gZm91bmQgaW4gdmFsdWVSZWdpb24gZm9yIG5vdy4KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikudHJpbSgpKTsKLQotCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCAtPSBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpOwotCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aC0tOwotCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCAtPSBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS50cmltKCkubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA+PSAxICsgZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKSkgewotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoU1BBQ0VfQ0hBUik7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aC0tOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCkgLSBhdHRySW5kZW50Lmxlbmd0aCgpOwotCQkJCQkJfQotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCi0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC09IGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJU3RyaW5nIHVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgbm9kZS5nZXRFbmRPZmZzZXQoKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCi0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyAxIGlzIGZvciAiPCIKLQkJCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxICsgbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpOwotCQkJLy8gMSBpcyBmb3IgIjwiCi0JCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSAtIDEgLSBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCk7Ci0KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQotCQkJCWlmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKQotCQkJCQkvLyBza2lwIGZvcm1hdHRpbmcgZm9yIGVuZCB0YWdzIGluIHRoaXMgZm9ybWF0OiA8L3RhZ05hbWU+Ci0JCQkJCXJldHVybjsKLQkJCQllbHNlIHsKLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCBsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJCQlsZW5ndGggPSBsZW5ndGggLSBsYXN0UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJCQkvLyBsZWF2ZSBzcGFjZSBiZWZvcmUgWE1MX0VNUFRZX1RBR19DTE9TRTogPHRhZ05hbWUgLz4KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoU1BBQ0VfQ0hBUik7Ci0JCQkJfQotCQkJfQotCi0KLQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JCQkvLyBJZiB3ZSBkaWRuJ3Qgc2VlIGEgeG1sOnNwYWNlIGF0dHJpYnV0ZSBhYm92ZSwgd2UnbGwgbG9vayBmb3IKLQkJCS8vIG9uZSBpbiB0aGUgRFRELgotCQkJLy8gV2UgZG8gbm90IGNoZWNrIGZvciBhIGNvbmZsaWN0IGJldHdlZW4gYSBEVEQncyAnZml4ZWQnIHZhbHVlCi0JCQkvLyBhbmQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3VuZCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQsIHdlCi0JCQkvLyBsZWF2ZSB0aGF0IHRvIHRoZSB2YWxpZGF0b3IuCi0JCQlpZiAoIXNhd1htbFNwYWNlKSB7Ci0JCQkJTW9kZWxRdWVyeUFkYXB0ZXIgYWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJRE9NRG9jdW1lbnQpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENNTm9kZShub2RlKTsKLQkJCQlpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJQ01OYW1lZE5vZGVNYXAgY21BdHRyaWJ1dGVzID0gZWxlbWVudERlY2xhcmF0aW9uLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJLy8gQ2hlY2sgaW1wbGllZCB2YWx1ZXMgZnJvbSB0aGUgRFREIHdheS4KLQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKFhNTF9TUEFDRSk7Ci0JCQkJCWlmIChhdHRyaWJ1dGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGZvdW5kLCBjaGVjayBpdCBvdXQuCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QXR0clR5cGUoKS5nZXRJbXBsaWVkVmFsdWUoKTsKLQotCQkJCQkJLy8geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgbWVhbnMgcHJlc2VydmUgc3BhY2UsCi0JCQkJCQkvLyBldmVyeXRoaW5nIGVsc2UgbWVhbnMgYmFjayB0byBkZWZhdWx0LgotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZS5jb21wYXJlVG8oUFJFU0VSVkUpID09IDApCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KHRydWUpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZGVmaW5lZFJlZ2lvbnMoSURPTU5vZGUgbm9kZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCi0JCQlpZiAocmVnaW9uVHlwZS5jb21wYXJlVG8oRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpID09IDAgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCArIGxlbmd0aCkKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0KLQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gU1BBQ0UgKyByZXN1bHQudHJpbSgpOwotCQllbHNlCi0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYmU5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DREFUQVNlY3Rpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBGb3JtYXRQcm9jZXNzb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAieG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCSgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQkJfQotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IEVsZW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ0RBVEFTZWN0aW9uSW1wbCkKLQkJCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdHRlciA9IG5ldyBUZXh0Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgQ29tbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgZm9tYXR0ZXIKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQlmb3JtYXR0ZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGZQcm9ncmVzc01vbml0b3IpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjIzMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZXh0ZW5kcyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIHsKLQlib29sZWFuIGdldFNwbGl0TXVsdGlBdHRycygpOwotCi0Jdm9pZCBzZXRTcGxpdE11bHRpQXR0cnMoYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNThjNTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L05vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNEQVRBU2VjdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNoYXJhY3RlckRhdGFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuVGFnTmFtZVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlRm9ybWF0dGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENSTEYgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBERUxJTUlURVJTID0gIiBcdFxuXHJcZiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEZGID0gIlxmIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBjaGFyIFNQQUNFX0NIQVIgPSAnICc7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBjaGFyIFRBQl9DSEFSID0gJ1x0JzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXByZXNzU3BhY2VzKFN0cmluZyBzdHJpbmcsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8qCi0JCSAqIE5vdGUgdGhhdCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3Igc3VwcG9ydHMgbWl4ZWQgbmV3IGxpbmUKLQkJICogY2hhcmFjdGVycyAoQ1IsIExGLCBDUkxGKSBpbiBvbmUgZmlsZS4gV2UgaGF2ZSB0byBoYW5kbGUgdGhhdCB3aGVuCi0JCSAqIHdlIHRyeSB0byBwcmVzZXJ2ZSBibGFuayBsaW5lcy4KLQkJICovCi0JCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbnVsbDsKLQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCWlmIChjbGVhckFsbEJsYW5rTGluZXMpCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkoc3RyaW5nKTsKLQkJZWxzZQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHN0cmluZywgREVMSU1JVEVSUywgdHJ1ZSk7Ci0KLQkJU3RyaW5nQnVmZmVyIGNvbXByZXNzZWRTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChzdHJpbmdBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQlib29sZWFuIGNyID0gZmFsc2UsIGxmID0gZmFsc2UsIGNyMiA9IGZhbHNlLCBub25TcGFjZSA9IHRydWU7Ci0KLQkJCWlmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oQ1IpID09IDApCi0JCQkJY3IgPSB0cnVlOwotCQkJZWxzZSBpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKExGKSA9PSAwKQotCQkJCWxmID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oU1BBQ0UpICE9IDApICYmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5WzBdKTsKLQkJCQlub25TcGFjZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc3RyaW5nQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKENSKSA9PSAwKSB7Ci0JCQkJCWlmIChjciAmJiBsZikgewotCQkJCQkJaWYgKG5vblNwYWNlKSB7Ci0JCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoQ1IgKyBMRik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJCWNyMiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY3IpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKENSKTsKLQkJCQkJCQlub25TcGFjZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQkJY3IyID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQljciA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhMRikgPT0gMCkgewotCQkJCQlpZiAoY3IgJiYgbGYgJiYgY3IyKSB7Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobGYpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKExGKTsKLQkJCQkJCQlub25TcGFjZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWxmID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhTUEFDRSkgIT0gMCkgJiYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhUQUIpICE9IDApICYmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJCWlmIChjb21wcmVzc2VkU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKFNQQUNFKTsKLQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCi0JCQkJCWNyID0gZmFsc2U7Ci0JCQkJCWxmID0gZmFsc2U7Ci0JCQkJCWNyMiA9IGZhbHNlOwotCQkJCQlub25TcGFjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbXByZXNzZWRTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBnZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0KLQkJZm9ybWF0KG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoZ2V0U2libGluZ0luZGVudChub2RlKSk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCWZvcm1hdE5vZGUoKElET01Ob2RlKSBub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlLmdldEVuZE9mZnNldCgpKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCS8vIEJVRzExNTcxNjogaWYgY2Fubm90IGdldCBsaW5lIGRlbGltaXRlciBmcm9tIGN1cnJlbnQgbGluZSwganVzdAotCQkJLy8gdXNlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIKLQkJCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0KLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQlpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkKLQkJCQkJCWlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWdldEZvcm1hdHRlcihuZXh0U2libGluZykuZm9ybWF0KG5leHRTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQl9Ci0KLQkJCQllbHNlIGlmIChuZXh0U2libGluZyAhPSBudWxsKQotCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCWdldEZvcm1hdHRlcihuZXh0U2libGluZykuZm9ybWF0KG5leHRTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSURPTU5vZGUgaW5kZW50Tm9kZSA9IGdldFBhcmVudEluZGVudE5vZGUobm9kZSk7Ci0JCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChpbmRlbnROb2RlKTsKLQkJCQkJSURPTU5vZGUgbGFzdENoaWxkID0gZ2V0RGVlcGVzdENoaWxkTm9kZShub2RlKTsKLQkJCQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJaWYgKChsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKGxhc3RDaGlsZC5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkJLy8gdGhpcyB0ZXh0IG5vZGUgYWxyZWFkeSBlbmRzIHdpdGggdGhlIHJlcXVlc3RlZAotCQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCQl9Ci0KLQkJCQkJCWVsc2UgaWYgKChsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKGxhc3RDaGlsZC5nZXROb2RlVmFsdWUoKSAhPSBudWxsICYmIGxhc3RDaGlsZC5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkpCi0JCQkJCQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWlmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGFzIGxvbmcgYXMgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAoZW5kUmVnaW9uICE9IG51bGwgJiYgZW5kUmVnaW9uLmdldE5leHQoKSAhPSBudWxsKQotCQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIFsxMTE2NzRdIElmIGluc2lkZSB4bWw6c3BhY2U9InByZXNlcnZlIiBlbGVtZW50LCB3ZSBiYWlsCi0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSURPTU5vZGUgcHJldmlvdXNTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQobm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGxpbmUgPiAwKSB7Ci0JCQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcihsaW5lIC0gMSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCS8vIEJVRzExNTcxNjogaWYgY2Fubm90IGdldCBsaW5lIGRlbGltaXRlciBmcm9tIGN1cnJlbnQgbGluZSwganVzdAotCQkJLy8gdXNlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIKLQkJCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCi0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwpCi0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJZ2V0Rm9ybWF0dGVyKHByZXZpb3VzU2libGluZykuZm9ybWF0KHByZXZpb3VzU2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpbnNlcnRCZWZvcmVOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgPT0gbnVsbCB8fCBwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJLy8gMjYxOTY4IC0gZm9ybWF0dGluZyB0YWcgd2l0aG91dCBjbG9zaW5nIGJyYWNrZXQ6Ci0JCQkJCQkvLyA8dDE+PHQxCi0JCQkJCQkvLyAyNjU2NzMgLSBOdWxsIHB0ciBpbiBmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUKLQkJCQkJCWludCBwcmV2RW5kTm9kZU9mZnNldCA9IC0xOwotCQkJCQkJaW50IHByZXZFbmRSZWdpb25PZmZzZXQgPSAtMTsKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkgewotCQkJCQkJCXByZXZFbmROb2RlT2Zmc2V0ID0gcHJldmlvdXNTaWJsaW5nLmdldEVuZE9mZnNldCgpOwotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gcHJldmlvdXNTaWJsaW5nLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlwcmV2RW5kUmVnaW9uT2Zmc2V0ID0gZW5kUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoKHByZXZpb3VzU2libGluZyA9PSBudWxsKSB8fCAocHJldkVuZE5vZGVPZmZzZXQgIT0gLTEgJiYgcHJldkVuZE5vZGVPZmZzZXQgPT0gcHJldkVuZFJlZ2lvbk9mZnNldCkpIHsKLQkJCQkJCQlpbnNlcnRCZWZvcmVOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZy5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUocHJldmlvdXNTaWJsaW5nLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpZiAoIXByZXZpb3VzU2libGluZy5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpIHsKLQkJCQkJCQkJaWYgKHByZXZpb3VzU2libGluZy5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkgewotCQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKHByZXZpb3VzU2libGluZywgbGluZUluZGVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJZ2V0Rm9ybWF0dGVyKHByZXZpb3VzU2libGluZykuZm9ybWF0KHByZXZpb3VzU2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsICYmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwgfHwgIWZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGJlZm9yZSBub2RlCi0JCQlmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBhZnRlciBub2RlCi0JCQlmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgY29tcHV0ZSB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbiBhZnRlciB0aGlzIG5vZGUKLQkgKiBkZXBlbmRpbmcgb24gdGhlIGluZGVudGF0aW9ucyBvZiBpdHMgc2libGluZyBub2RlcyBhbmQgcGFyZW50IG5vZGUuIE5vdAotCSAqIG5lZWRlZCBhbnltb3JlPwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFRyYWlsaW5nVGV4dChJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQlTdHJpbmcgcGFyZW50TGluZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZS5nZXRQYXJlbnROb2RlKCkpOwotCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJSURPTU5vZGUgbmV4dFNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmICgobmV4dFNpYmxpbmcgIT0gbnVsbCkgJiYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKSB7Ci0JCQkJU3RyaW5nIG5leHRTaWJsaW5nVGV4dCA9IG5leHRTaWJsaW5nLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChuZXh0U2libGluZy5nZXROZXh0U2libGluZygpID09IG51bGwpCi0JCQkJCWlmICgobmV4dFNpYmxpbmcuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobmV4dFNpYmxpbmdUZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJCQkJCS8vIGRlbGV0ZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKLQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIEVNUFRZX1NUUklORyk7Ci0JCQkJCWVsc2UKLQkJCQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgbm9kZSB3aXRoIHBhcmVudCBpbmRlbnRhdGlvbgotCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShuZXh0U2libGluZywgbGluZURlbGltaXRlciArIHBhcmVudExpbmVJbmRlbnQpOwotCQkJCWVsc2UKLQkJCQkJLy8gcmVwbGFjZSB0aGUgdGV4dCBub2RlIHdpdGggaW5kZW50YXRpb24KLQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShuZXh0U2libGluZywgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5leHRTaWJsaW5nID09IG51bGwpIHsKLQkJCQkJbGluZUluZGVudCA9IHBhcmVudExpbmVJbmRlbnQ7Ci0KLQkJCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkpIHsKLQkJCQkJCQkvLyB0aGlzIHRleHQgbm9kZSBhbHJlYWR5IGVuZHMgd2l0aCB0aGUgcmVxdWVzdGVkCi0JCQkJCQkJLy8gaW5kZW50YXRpb24KLQkJCQkJCX0KLQotCQkJCQkJZWxzZSBpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJCWlmIChjbGVhckFsbEJsYW5rTGluZXMpCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lSW5kZW50KTsKLQkJCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlpZiAobm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpZiAoIW5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKQotCQkJCQkJCQlpZiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkKLQkJCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lSW5kZW50KTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkpIHsKLQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCX0KLQotCQkJCQllbHNlIGlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkpCi0JCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lSW5kZW50KTsKLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJZWxzZQotCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcHJlc3NlZE5vZGVUZXh0KElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCXJldHVybiBjb21wcmVzc1NwYWNlcyhnZXROb2RlVGV4dChub2RlKSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGdldERlZXBlc3RDaGlsZE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSByZXN1bHQgPSBudWxsOwotCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0KLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKQotCQkJcmVzdWx0ID0gbm9kZTsKLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXREZWVwZXN0Q2hpbGROb2RlKGxhc3RDaGlsZCk7Ci0KLQkJCWlmICgocmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgfHwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpICYmICFpc0VuZFRhZ01pc3Npbmcobm9kZSkpCi0JCQkJcmVzdWx0ID0gbm9kZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKCkgewotCQlpZiAoZkZvcm1hdENvbnRyYWludHMgPT0gbnVsbCkgewotCQkJZkZvcm1hdENvbnRyYWludHMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMoKTsKLQotCQkJZkZvcm1hdENvbnRyYWludHMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRDb250cmFpbnRzOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCSgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQkJfQotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKElET01Ob2RlIG5vZGUpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXNob3J0IG5vZGVUeXBlID0gKChOb2RlKSBub2RlKS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBFbGVtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENEQVRBU2VjdGlvbkltcGwpCi0JCQkJCWZvcm1hdHRlciA9IG5ldyBOb2RlRm9ybWF0dGVyKCk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgVGV4dE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IENvbW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRG9jdW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb2RlRm9ybWF0dGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IGZvbWF0dGVyCi0JCWZvcm1hdHRlci5zZXRGb3JtYXRQcmVmZXJlbmNlcyhnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJZm9ybWF0dGVyLnNldFByb2dyZXNzTW9uaXRvcihmUHJvZ3Jlc3NNb25pdG9yKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0SW5kZW50YXRpb25MZW5ndGgoU3RyaW5nIGluZGVudCkgewotCQkvLyBUT0RPIEtpdCA6IFRoZSBjYWxjdWxhdGlvbiBvZiBJbmRlbnRhdGlvbkxlbmd0aCBpcyBub3QgY29ycmVjdAotCQkvLyBoZXJlLgotCQkvLyBub2RlSW5kZW50YXRpb24gbWF5IGNvbnRhaW4gdGFicy4gTXVsdGlwbHkgYnkgNCB0ZW1wb3JhcmlseSB0byBnZXQKLQkJLy8gYXBwcm94LiB3aWR0aC4KLQkJLy8gTmVlZCB0byByZS13b3JrLgotCi0JCWludCBpbmRlbnRhdGlvbkxlbmd0aCA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGluZGVudC5zdWJzdHJpbmcoaSwgaSArIDEpLmNvbXBhcmVUbyhUQUIpID09IDApCi0JCQkJaW5kZW50YXRpb25MZW5ndGggKz0gNDsKLQkJCWVsc2UKLQkJCQlpbmRlbnRhdGlvbkxlbmd0aCsrOwotCQl9Ci0KLQkJcmV0dXJuIGluZGVudGF0aW9uTGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgdGhlIGluZGVudGF0aW9uIGZvciB0aGlzIG5vZGUuIEl0IHdpbGwgc2VhcmNoCi0JICogYmFja3dhcmRzIHN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbm9kZSB1bnRpbCBhIGNoYXJhY3RlcgotCSAqIG90aGVyIHRoYW4gYSBzcGFjZSBvciBhIHRhYiBpcyBmb3VuZC4gSWYgdGhpcyBub2RlIGlzIG51bGwgb3IgaXQncyBhCi0JICogZG9jdW1lbnQgbm9kZSBvciBpdCdzIGEgZmlyc3QgbGV2ZWwgbm9kZSAobm9kZSdzIHBhcmVudCBpcyBhIGRvY3VtZW50Ci0JICogbm9kZSkgdGhlIGRlZmF1bHQgZW1wdHkgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgdGhlIGluZGVudGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZUluZGVudChOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpICYmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQlJRE9NTm9kZSBzaWJsaW5nVGV4dE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAoKHNpYmxpbmdUZXh0Tm9kZSAhPSBudWxsKSAmJiAoc2libGluZ1RleHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKSB7Ci0JCQkJLy8gZmluZCB0aGUgaW5kZW50YXRpb24KLQkJCQlTdHJpbmcgc2libGluZ1RleHQgPSBzaWJsaW5nVGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJaW50IHNpYmxpbmdUZXh0TGVuZ3RoID0gc2libGluZ1RleHQubGVuZ3RoKCk7Ci0JCQkJaWYgKChzaWJsaW5nVGV4dCAhPSBudWxsKSAmJiAoc2libGluZ1RleHRMZW5ndGggPiAwKSAmJiAoKHNpYmxpbmdUZXh0LmNoYXJBdChzaWJsaW5nVGV4dExlbmd0aCAtIDEpID09IFNQQUNFX0NIQVIpIHx8IChzaWJsaW5nVGV4dC5jaGFyQXQoc2libGluZ1RleHRMZW5ndGggLSAxKSA9PSBUQUJfQ0hBUikpKSB7Ci0JCQkJCWludCBzZWFyY2hJbmRleCA9IHNpYmxpbmdUZXh0TGVuZ3RoIC0gMTsKLQkJCQkJd2hpbGUgKChzZWFyY2hJbmRleCA+PSAwKSAmJiAoKHNpYmxpbmdUZXh0LmNoYXJBdChzZWFyY2hJbmRleCkgPT0gU1BBQ0VfQ0hBUikgfHwgKHNpYmxpbmdUZXh0LmNoYXJBdChzZWFyY2hJbmRleCkgPT0gVEFCX0NIQVIpKSkKLQkJCQkJCXNlYXJjaEluZGV4LS07Ci0KLQkJCQkJaWYgKHNlYXJjaEluZGV4IDwgc2libGluZ1RleHRMZW5ndGgpCi0JCQkJCQlyZXN1bHQgPSBzaWJsaW5nVGV4dC5zdWJzdHJpbmcoc2VhcmNoSW5kZXggKyAxLCBzaWJsaW5nVGV4dExlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vZGVOYW1lKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vZGVUZXh0KElET01Ob2RlIG5vZGUpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCi0JCWlmICgobm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGFJbXBsKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgJiYgIShub2RlIGluc3RhbmNlb2YgQ0RBVEFTZWN0aW9uSW1wbCkgJiYgIWlzSlNQVGFnKG5vZGUpKQotCQkJdGV4dCA9ICgoQ2hhcmFjdGVyRGF0YUltcGwpIG5vZGUpLmdldFNvdXJjZSgpOwotCQllbHNlCi0JCQl0ZXh0ID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0UGFyZW50SW5kZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0JCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJcmVzdWx0ID0gcGFyZW50Tm9kZTsKLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBwYXJlbnROb2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKQotCQkJCXJlc3VsdCA9IHBhcmVudE5vZGU7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gZ2V0UGFyZW50SW5kZW50Tm9kZShwYXJlbnROb2RlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBmaW5kIHRoZSBpbmRlbnRhdGlvbiBmb3IgYSBub2RlIHNpYmxpbmcgdG8gdGhpcyBub2RlLgotCSAqIEl0IHdpbGwgdHJ5IHRvIGZpbmQgYSBzaWJsaW5nIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSBmaXJzdC4gSWYgdGhlcmUgaXMKLQkgKiBubyBzaWJsaW5nIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSwgaXQgd2lsbCB0cnkgdG8gZmluZCBhIHNpYmxpbmcgbm9kZQotCSAqIGFmdGVyIHRoaXMgbm9kZS4gSWYgc3RpbGwgbm90IGZvdW5kLCB3ZSB3aWxsIGNoZWNrIGlmIHRoaXMgbm9kZSBpcwotCSAqIGFscmVhZHkgaW5kZW50ZWQgZnJvbSBpdHMgcGFyZW50LiBJZiB5ZXMsIHRoaXMgbm9kZSdzIGluZGVudGF0aW9uIHdpbGwKLQkgKiBiZSB1c2VkLiBPdGhlcndpc2UsIHRoZSBwYXJlbnQgbm9kZSdzIGluZGVudGF0aW9uIHBsdXMgb25lIGluZGVudGF0aW9uCi0JICogd2lsbCBiZSB1c2VkLiBJZiB0aGlzIG5vZGUgaXMgbnVsbCBvciBpdCdzIGEgZG9jdW1lbnQgbm9kZSBvciBpdCdzIGEKLQkgKiBmaXJzdCBsZXZlbCBub2RlIChub2RlJ3MgcGFyZW50IGlzIGEgZG9jdW1lbnQgbm9kZSkgdGhlIGRlZmF1bHQgZW1wdHkKLQkgKiBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgaW5kZW50YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaWJsaW5nSW5kZW50KE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpICYmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCS8vIGZpbmQgdGhlIHRleHQgbm9kZSBiZWZvcmUgdGhlIHByZXZpb3VzIG5vbi10ZXh0IHNpYmxpbmcKLQkJCS8vIGlmIHRoYXQncyBub3QgZm91bmQsIHdlIHdpbGwgdHJ5IHRoZSB0ZXh0IG5vZGUgYmVmb3JlIHRoZSBuZXh0Ci0JCQkvLyBub24tdGV4dCBzaWJsaW5nCi0JCQlJRE9NTm9kZSBzaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJd2hpbGUgKChzaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgfHwgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSkgewotCQkJCWlmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUgJiYgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKSAhPSBudWxsICYmIHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIoc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVmFsdWUoKSkpCi0JCQkJCWJyZWFrOwotCQkJCXNpYmxpbmcgPSAoSURPTU5vZGUpIHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCQkJc2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCXdoaWxlICgoc2libGluZyAhPSBudWxsKSAmJiAoc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkKLQkJCQkJc2libGluZyA9IChJRE9NTm9kZSkgc2libGluZy5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCQlTdHJpbmcgcGFyZW50TGluZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZS5nZXRQYXJlbnROb2RlKCkpOwotCi0JCQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHNpYmxpbmdJbmRlbnQgPSBnZXROb2RlSW5kZW50KHNpYmxpbmcpOwotCQkJCWlmIChzaWJsaW5nSW5kZW50Lmxlbmd0aCgpID4gMCkKLQkJCQkJcmVzdWx0ID0gc2libGluZ0luZGVudDsKLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIG5vZGVJbmRlbnQgPSBnZXROb2RlSW5kZW50KG5vZGUpOwotCQkJCQlpZiAobm9kZUluZGVudC5sZW5ndGgoKSA+IHBhcmVudExpbmVJbmRlbnQubGVuZ3RoKCkpCi0JCQkJCQkvLyB0aGlzIG5vZGUgaXMgaW5kZW50ZWQgZnJvbSBpdHMgcGFyZW50LCBpdHMKLQkJCQkJCS8vIGluZGVudGF0aW9uIHdpbGwgYmUgdXNlZAotCQkJCQkJcmVzdWx0ID0gbm9kZUluZGVudDsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0ID0gcGFyZW50TGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgbm9kZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZSk7Ci0JCQkJaWYgKG5vZGVJbmRlbnQubGVuZ3RoKCkgPiBwYXJlbnRMaW5lSW5kZW50Lmxlbmd0aCgpKQotCQkJCQkvLyB0aGlzIG5vZGUgaXMgaW5kZW50ZWQgZnJvbSBpdHMgcGFyZW50LCBpdHMgaW5kZW50YXRpb24KLQkJCQkJLy8gd2lsbCBiZSB1c2VkCi0JCQkJCXJlc3VsdCA9IG5vZGVJbmRlbnQ7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQgPSBwYXJlbnRMaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRBZnRlck5vZGUoSURPTU5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJLy8gMjYxOTY4IC0gZm9ybWF0dGluZyB0YWcgd2l0aG91dCBjbG9zaW5nIGJyYWNrZXQ6IDx0MT48dDEKLQkJaWYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQl9Ci0JCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRCZWZvcmVOb2RlKElET01Ob2RlIG5vZGUsIFN0cmluZyBzdHJpbmcpIHsKLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgMCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKElTdHJ1Y3R1cmVkRm9ybWF0dGVyLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuZFRhZ01pc3NpbmcoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgIWlzSlNQVGFnKG5vZGUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJSVRleHRSZWdpb24gc3RhcnRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkKLQkJCQlzdGFydFRhZ05hbWVSZWdpb24gPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gZW5kVGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKQotCQkJCWVuZFRhZ05hbWVSZWdpb24gPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQotCQkJSVRleHRSZWdpb25MaXN0IHN0YXJ0VGFnUmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ05hbWVSZWdpb24gPT0gZW5kVGFnTmFtZVJlZ2lvbiAmJiBzdGFydFRhZ05hbWVSZWdpb24gIT0gbnVsbCAmJiAoc3RhcnRUYWdSZWdpb25zLmdldCgwKSkuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiAmJiAoc3RhcnRUYWdSZWdpb25zLmdldChzdGFydFRhZ1JlZ2lvbnMuc2l6ZSgpIC0gMSkuZ2V0VHlwZSgpKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJLy8gZW5kIHRhZyBtaXNzaW5nCi0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm9kZUhhc1NpYmxpbmdzKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwpIHx8IChub2RlLmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTm9kZSBjaGFuZ2VkLiBObyBmb3JtYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWdpb25TcGFjZXMoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmICgocmVnaW9uICE9IG51bGwpICYmIChyZWdpb24gaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uIHx8IHJlZ2lvbiBpbnN0YW5jZW9mIFRhZ05hbWVSZWdpb24pICYmIChmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSA+IGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkpIHsKLQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgLSBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbiksIEVNUFRZX1NUUklORyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgdGhlIHN0cmluZyBhdCBvZmZzZXQgYW5kIGxlbmd0aCB3aXRoIGEgbmV3Ci0JICogc3RyaW5nLiBJZiB0aGUgc3RyaW5nIHRvIGJlIHJlcGxhY2VkIGlzIHRoZSBzYW1lIGFzIHRoZSBuZXcgc3RyaW5nLCB0aGUKLQkgKiBzdHJpbmcgd2lsbCBub3QgYmUgcmVwbGFjZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZShJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZykgewotCQl0cnkgewotCQkJU3RyaW5nIHN0cnVjdHVyZWREb2N1bWVudFN0cmluZyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFN0cmluZy5jb21wYXJlVG8oc3RyaW5nKSAhPSAwKQotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmcpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIHRoZSBub2RlIHZhbHVlIHdpdGggYSBuZXcgc3RyaW5nLiBJZiB0aGUgbm9kZQotCSAqIHZhbHVlIHRvIGJlIHJlcGxhY2VkIGlzIHRoZSBzYW1lIGFzIHRoZSBuZXcgc3RyaW5nLCB0aGUgbm9kZSB2YWx1ZSB3aWxsCi0JICogbm90IGJlIHJlcGxhY2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VOb2RlVmFsdWUoSURPTU5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJ1Y3R1cmVkRG9jdW1lbnRTdHJpbmcgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRTdHJpbmcuY29tcGFyZVRvKHN0cmluZykgIT0gMCkKLQkJCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHN0cmluZyk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRQcmVmZXJlbmNlcyhJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKSB7Ci0JCWZGb3JtYXRQcmVmZXJlbmNlcyA9IGZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlciNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQVGFnKE5vZGUgbm9kZSkgewotCi0JCWZpbmFsIFN0cmluZyBKU1BfQ0xPU0UgPSAiSlNQX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfQ0xPU0UgPSAiSlNQX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX09QRU4gPSAiSlNQX0NPTU1FTlRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX1RFWFQgPSAiSlNQX0NPTU1FTlRfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAiSlNQX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT05fT1BFTiA9ICJKU1BfREVDTEFSQVRJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfQ0xPU0UgPSAiSlNQX0RJUkVDVElWRV9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfTkFNRSA9ICJKU1BfRElSRUNUSVZFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfT1BFTiA9ICJKU1BfRElSRUNUSVZFX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfRVhQUkVTU0lPTl9PUEVOID0gIkpTUF9FWFBSRVNTSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gZmluYWwgU3RyaW5nIEpTUF9ST09UX1RBR19OQU1FID0gIkpTUF9ST09UX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX09QRU4gPSAiSlNQX1NDUklQVExFVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSURPTU5vZGUpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkvLyBpbiBzb21lIGNhc2VzLCB0aGUgbm9kZXMgZXhpc3RzLCBidXQgaGFzbid0IGJlZW4gYXNzb2NpYXRlZAotCQkJLy8gd2l0aAotCQkJLy8gYSBmbGF0bm9kZSB5ZXQgKHRoZSBzY3JlZW4gdXBkYXRlcyBjYW4gYmUgaW5pdGlhdGVkIG9uIGEKLQkJCS8vIGRpZmZlcmVudCB0aHJlYWQsCi0JCQkvLyBzbyB0aGUgcmVxdWVzdCBmb3IgYSBmbGF0bm9kZSBjYW4gY29tZSBpbiBiZWZvcmUgdGhlIG5vZGUgaXMKLQkJCS8vIGZ1bGx5IGZvcm1lZC4KLQkJCS8vIGlmIHRoZSBmbGF0bm9kZSBpcyBudWxsLCB3ZSdsbCBqdXN0IGFsbG93IHRoZSBkZWZhdWx0cyB0bwotCQkJLy8gYXBwbHkuCi0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmbGF0Tm9kZVR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCQkJLy8gc2hvdWxkIG5vdCBiZSBudWxsLCBidXQganVzdCB0byBiZSBzdXJlCi0JCQkJaWYgKGZsYXROb2RlVHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICgoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfQ09OVEVOVCkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9FWFBSRVNTSU9OX09QRU4pKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfU0NSSVBUTEVUX09QRU4pKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfREVDTEFSQVRJT05fT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfQ0xPU0UpKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfRElSRUNUSVZFX05BTUUpKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfRElSRUNUSVZFX09QRU4pKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfQ0xPU0UpKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0YzY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MIGV4dGVuZHMgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCB7Ci0JcHJpdmF0ZSBib29sZWFuIGZTcGxpdE11bHRpQXR0cnM7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRTcGxpdE11bHRpQXR0cnMoKSB7Ci0JCXJldHVybiBmU3BsaXRNdWx0aUF0dHJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwbGl0TXVsdGlBdHRycyhib29sZWFuIHNwbGl0TXVsdGlBdHRycykgewotCQlmU3BsaXRNdWx0aUF0dHJzID0gc3BsaXRNdWx0aUF0dHJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1RleHROb2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9UZXh0Tm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJjZmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1RleHROb2RlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0geG1sOnNwYWNlPSdwcmVzZXJ2ZScgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBUZXh0Tm9kZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJLy8gWzExMTY3NF0gSWYgaW5zaWRlIHhtbDpzcGFjZT0icHJlc2VydmUiIGVsZW1lbnQsIHdlIGJhaWwKLQkJaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQkJdHJ5IHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSk7Ci0JCQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCQkJbGluZURlbGltaXRlciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJaW50IGxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCk7Ci0JCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCVN0cmluZyBub2RlSW5kZW50YXRpb24gPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQotCQkJLy8gY29tcHV0ZSBjdXJyZW50IGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQlpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IDA7Ci0JCQl0cnkgewotCQkJCWludCBub2RlTmFtZU9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGluZU9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQobm9kZU5hbWVPZmZzZXQpLmdldE9mZnNldCgpOwotCQkJCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQobGluZU9mZnNldCwgbm9kZU5hbWVPZmZzZXQgLSBsaW5lT2Zmc2V0KTsKLQkJCQlpbnQgdXNlZFdpZHRoID0gZ2V0SW5kZW50YXRpb25MZW5ndGgodGV4dCk7Ci0JCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCkgLSB1c2VkV2lkdGg7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCi0JCQlTdHJpbmcgY29tcHJlc3NlZFRleHQgPSBnZXRDb21wcmVzc2VkTm9kZVRleHQobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCWlmICgoKGVub3VnaFNwYWNlKHBhcmVudE5vZGUsIGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgsIGNvbXByZXNzZWRUZXh0KSkgJiYgKG5vU2libGluZ3NBbmROb0ZvbGxvd2luZ0NvbW1lbnQobm9kZSkpICYmICFmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMocGFyZW50Tm9kZSkpIHx8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA9PSAwKSB7Ci0JCQkJLy8gZW5vdWdoIHNwYWNlCi0JCQkJLy8gYW5kIHRleHQgaGFzIG5vIGxpbmUgZGVsaW1pdGVycwotCQkJCS8vIGFuZCAobm9kZSBoYXMgbm8gc2libGluZ3Mgb3IgZm9sbG93ZWQgYnkgaW5saW5lIGNvbW1lbnQpCi0JCQkJLy8gYW5kCi0JCQkJLy8gcGFyZW50Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluc0xpbmVEZWxpbWl0ZXJzCi0KLQkJCQlpZiAoaXNFbmRUYWdNaXNzaW5nKHBhcmVudE5vZGUpKSB7Ci0JCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl3aGlsZSAoaXNFbmRUYWdNaXNzaW5nKHBhcmVudE5vZGUpKQotCQkJCQkJcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgcGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJLy8gYWRkIHBhcmVudCdzIGluZGVudGF0aW9uIHRvIGVuZAotCQkJCQlub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KHBhcmVudE5vZGUpOwotCi0JCQkJCWlmICghY29tcHJlc3NlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCWNvbXByZXNzZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKGNvbXByZXNzZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCWNvbXByZXNzZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKGNvbXByZXNzZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKChwYXJlbnROb2RlICE9IG51bGwpICYmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA+IDApICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAoKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSkpCi0JCQkJCS8vIGRlbGV0ZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCWNvbXByZXNzZWRUZXh0ID0gRU1QVFlfU1RSSU5HOwotCi0JCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBjb21wcmVzc2VkVGV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBub3QgZW5vdWdoIHNwYWNlLCBuZWVkIHRvIHJlZmxvdyB0ZXh0Ci0KLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoIC0gZ2V0SW5kZW50YXRpb25MZW5ndGgobm9kZUluZGVudGF0aW9uKTsKLQkJCQlMaXN0IHZlY3RvciA9IHJlZmxvd1RleHQoY29tcHJlc3NlZFRleHQsIGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJCWludCB2ZWN0b3JTaXplID0gdmVjdG9yLnNpemUoKTsKLQkJCQlTdHJpbmcgcmVmbG93ZWRUZXh0ID0gbmV3IFN0cmluZygpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3JTaXplOyBpKyspIHsKLQkJCQkJaWYgKCgoU3RyaW5nKSB2ZWN0b3IuZ2V0KGkpKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJcmVmbG93ZWRUZXh0ID0gcmVmbG93ZWRUZXh0ICsgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbiArIChTdHJpbmcpIHZlY3Rvci5nZXQoaSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlZmxvd2VkVGV4dCA9IHJlZmxvd2VkVGV4dCArIGxpbmVEZWxpbWl0ZXI7Ci0JCQkJfQotCi0JCQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpIHsKLQkJCQkJCS8vIGRvbid0IGFkZCBpbmRlbnRhdGlvbiB0byBlbmQgaWYgcGFyZW50IGVuZCB0YWcgaXMKLQkJCQkJCS8vIG1pc3NpbmcKLQkJCQkJfQotCi0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHBhcmVudCdzIGluZGVudGF0aW9uIHRvIGVuZAotCQkJCQkJbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChwYXJlbnROb2RlKTsKLQotCQkJCQkJaWYgKCFyZWZsb3dlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoIXJlZmxvd2VkVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJLy8gbm90IGFscmVhZHkgZW5kZWQgd2l0aCB0aGUgZXhwZWN0ZWQgaW5kZW50YXRpb24KLQotCQkJCQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJCQkJLy8gYWRkIGluZGVudGF0aW9uIHRvIGVuZCBpZgotCQkJCQkJCS8vIGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyCi0JCQkJCQkJLy8gb3IgZm9sbG93ZWQgYnkgbXVsdGlMaW5lQ29tbWVudAotCi0JCQkJCQkJU3RyaW5nIG5vZGVUZXh0ID0gZ2V0Tm9kZVRleHQobm9kZSk7Ci0JCQkJCQkJaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZMYXN0TGluZURlbGltaXRlcihub2RlVGV4dCk7Ci0JCQkJCQkJYm9vbGVhbiBjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciA9IGluZGV4T2ZMYXN0TGluZURlbGltaXRlciAhPSAtMTsKLQkJCQkJCQlpZiAoY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIpIHsKLQkJCQkJCQkJLy8gbm8gbW9yZSBub24gYmxhbmsgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0Ci0JCQkJCQkJCS8vIGxpbmUgZGVsaW1pdGVyCi0JCQkJCQkJCWN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyID0gU3RyaW5nVXRpbHMuaW5kZXhPZk5vbmJsYW5rKG5vZGVUZXh0LCBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIpID09IC0xOwotCQkJCQkJCX0KLQotCQkJCQkJCVN0cmluZyBub2RlVmFsdWUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJYm9vbGVhbiBtdWx0aUxpbmVDb21tZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGVWYWx1ZSk7Ci0KLQkJCQkJCQlpZiAoY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgfHwgbXVsdGlMaW5lQ29tbWVudCkgewotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBub3QgYSBjb21tZW50LCBqdXN0IGFkZCBhZGQgaW5kZW50YXRpb24gdG8gZW5kCi0JCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbGluZURlbGltaXRlcik7Ci0JCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgcmVmbG93ZWRUZXh0KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vU2libGluZ3NBbmROb0ZvbGxvd2luZ0NvbW1lbnQoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXh0U2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQlyZXR1cm4gIW5vZGVIYXNTaWJsaW5ncyhub2RlKSB8fCAobm9MaW5lRGVsaW1pdGVyKG5vZGUpICYmIGlzQ29tbWVudChuZXh0U2libGluZykgJiYgbm9MaW5lRGVsaW1pdGVyKG5leHRTaWJsaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub0xpbmVEZWxpbWl0ZXIoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVub3VnaFNwYWNlKElET01Ob2RlIHBhcmVudE5vZGUsIGludCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLCBTdHJpbmcgY29tcHJlc3NlZFRleHQpIHsKLQkJcmV0dXJuIGNvbXByZXNzZWRUZXh0Lmxlbmd0aCgpIDw9IChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC0gcGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpIC0gMykgJiYgIVN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihjb21wcmVzc2VkVGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIFZlY3RvciByZWZsb3dUZXh0KFN0cmluZyB0ZXh0LCBpbnQgYXZhaWxhYmxlV2lkdGgpIHsKLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBudWxsOwotCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheSh0ZXh0KTsKLQkJZWxzZQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHRleHQsIERFTElNSVRFUlMsIHRydWUpOwotCi0JCVZlY3RvciBvdXRwdXQgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmICgoc3RyaW5nQXJyYXkgIT0gbnVsbCkgJiYgKHN0cmluZ0FycmF5Lmxlbmd0aCA+IDApKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhDUikgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKHN0cmluZ0FycmF5WzBdKTsKLQkJCWludCBidWZmZXJMZW5ndGggPSBzdHJpbmdBcnJheVswXS50b1N0cmluZygpLmxlbmd0aCgpOwotCQkJYm9vbGVhbiBjciA9IHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhDUikgPT0gMDsKLQotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBlYWNoU3RyaW5nID0gc3RyaW5nQXJyYXlbaV07Ci0JCQkJaWYgKChlYWNoU3RyaW5nLmNvbXBhcmVUbyhTUEFDRSkgIT0gMCkgJiYgKGVhY2hTdHJpbmcuY29tcGFyZVRvKFRBQikgIT0gMCkgJiYgKGVhY2hTdHJpbmcuY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCQlpZiAoKGJ1ZmZlckxlbmd0aCArIDEgKyBlYWNoU3RyaW5nLmxlbmd0aCgpID4gYXZhaWxhYmxlV2lkdGgpIHx8IChlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgPT0gMCkgfHwgKGVhY2hTdHJpbmcuY29tcGFyZVRvKExGKSA9PSAwKSkgewotCQkJCQkJaWYgKChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgPT0gMCkgJiYgY3IpIHsKLQkJCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlvdXRwdXQuYWRkKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJYnVmZmVyTGVuZ3RoID0gMDsKLQkJCQkJCX0KLQkJCQkJCWNyID0gZWFjaFN0cmluZy5jb21wYXJlVG8oQ1IpID09IDA7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJYnVmZmVyLmFwcGVuZChTUEFDRSk7Ci0JCQkJCQlidWZmZXJMZW5ndGgrKzsKLQkJCQkJfQotCQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKENSKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oTEYpICE9IDApKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGVhY2hTdHJpbmcpOwotCQkJCQkJYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoICsgZWFjaFN0cmluZy5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW91dHB1dC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWVsc2UKLQkJCW91dHB1dC5hZGQodGV4dCk7Ci0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWM4MWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBYTUwuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MUGFydGl0aW9ucyB7Ci0JCi0JU3RyaW5nIFhNTF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DREFUQSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DREFUQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX1BJID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX1BJIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVDTCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIFRoaXMgdmFsdWUgaXMgdXNlZCBhcyBhIHByZWZpeCB0byBhbnkgdW5rbm93biBwcm9jZXNzaW5nIGluc3RydWN0aW9ucwotCSAqIHdlIGZpbmQuIFRoZSBwcm9jZXNzb3IgdGFyZ2V0IG5hbWUgaXMgY29udmVydGVkIHRvIHVwcGVyY2FzZSBhbmQKLQkgKiBhcHBlbmRlZCB0byB0aGUgcHJlZml4IHRvIGNyZWF0ZSBhIHVuaXF1ZSBwYXJ0aXRpb24gdHlwZS4KLQkgKi8KLQlTdHJpbmcgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9QUkVGSVggPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNob3VsZCBtYXRjaAotCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kdGQucGFydGl0aW9uaW5nLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuU1RfRFREX1NVQlNFVAotCSAqLwotCVN0cmluZyBEVERfU1VCU0VUID0gIm9yZy5lY2xpcHNlLndzdC54bWwuZHRkLmludGVybmFsX3N1YnNldCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01SZWdpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzc5ODk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01SZWdpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIERPTVJlZ2lvbkNvbnRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tfVEVYVCA9ICJCTE9DS19URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFX1NQQUNFID0gIldISVRFX1NQQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfQ0xPU0UgPSAiWE1MX0FUVExJU1RfREVDTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQgPSAiWE1MX0FUVExJU1RfREVDTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRSA9ICJYTUxfQVRUTElTVF9ERUNMX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9ICJYTUxfQVRUTElTVF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0RBVEFfQ0xPU0UgPSAiWE1MX0NEQVRBX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9PUEVOID0gIlhNTF9DREFUQV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9URVhUID0gIlhNTF9DREFUQV9URVhUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DSEFSX1JFRkVSRU5DRSA9ICJYTUxfQ0hBUl9SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfQ0xPU0UgPSAiWE1MX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9PUEVOID0gIlhNTF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfVEVYVCA9ICJYTUxfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTlRFTlQgPSAiWE1MX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gIlhNTF9ERUNMQVJBVElPTl9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERUNMQVJBVElPTl9PUEVOID0gIlhNTF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQgPSAiWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX05BTUUgPSAiWE1MX0RPQ1RZUEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX0NMT1NFID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9DT05URU5UID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgPSAiWE1MX0VMRU1FTlRfREVDTF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAiWE1MX0VMRU1FTlRfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VNUFRZX1RBR19DTE9TRSA9ICJYTUxfRU1QVFlfVEFHX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTkRfVEFHX09QRU4gPSAiWE1MX0VORF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU5USVRZX1JFRkVSRU5DRSA9ICJYTUxfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QRV9SRUZFUkVOQ0UgPSAiWE1MX1BFX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUElfQ0xPU0UgPSAiWE1MX1BJX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9DT05URU5UID0gIlhNTF9QSV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9PUEVOID0gIlhNTF9QSV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyA9ICJYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfTkFNRSA9ICJYTUxfVEFHX0FUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFID0gIlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQ0xPU0UgPSAiWE1MX1RBR19DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX05BTUUgPSAiWE1MX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19PUEVOID0gIlhNTF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTQ2NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKTsKLQotCXB1YmxpYyBVUklSZXNvbHZlciBnZXRJZFJlc29sdmVyKCk7Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KCk7Ci0KLQl2b2lkIHJlbGVhc2UoKTsKLQotCXZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiMDBlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kZWxRdWVyeUFkYXB0ZXIgewotCXByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlOwotCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXRoaXMuY21Eb2N1bWVudENhY2hlID0gY21Eb2N1bWVudENhY2hlOwotCQl0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5OwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCX0KLQotCXB1YmxpYyBDTURvY3VtZW50Q2FjaGUgZ2V0Q01Eb2N1bWVudENhY2hlKCkgewotCQlyZXR1cm4gY21Eb2N1bWVudENhY2hlOwotCX0KLQotCXB1YmxpYyBVUklSZXNvbHZlciBnZXRJZFJlc29sdmVyKCkgewotCQlyZXR1cm4gaWRSZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KCkgewotCQlyZXR1cm4gbW9kZWxRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kZWxRdWVyeUFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZGVsUXVlcnlBZGFwdGVyI3NldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIpCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJaWRSZXNvbHZlciA9IG5ld0lkUmVzb2x2ZXI7Ci0JCWlmIChtb2RlbFF1ZXJ5IGluc3RhbmNlb2YgTW92YWJsZU1vZGVsUXVlcnkpCi0JCQkoKE1vdmFibGVNb2RlbFF1ZXJ5KSBtb2RlbFF1ZXJ5KS5zZXRJZFJlc29sdmVyKG5ld0lkUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vdmFibGVNb2RlbFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTdlZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vdmFibGVNb2RlbFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW92YWJsZU1vZGVsUXVlcnkgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHsKLQotCXZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdVUklSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90YXNrcy9YTUxGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMGQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGaWxlVGFza1NjYW5uZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyIHsKLQlwdWJsaWMgWE1MRmlsZVRhc2tTY2FubmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNjNDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0KLQlwdWJsaWMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHN1cGVyLmdldFR5cGUoKTsKLQkJLy8gbm9ybWFsbHksIHdlIHdhbnQgdGhlIHNlY29uZCByZWdpb24gYXMgdGhlIGZsYXRub2RlIHR5cGUgLi4uIHNpbmNlCi0JCS8vIHRoZQotCQkvLyBmaXJzdCBvbmUgaXMgdXN1YWxseSBqdXN0ICJvcGVuIHRhZyIuCi0JCWlmICgocmVzdWx0ICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pICYmIChnZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkpIHsKLQkJCXJlc3VsdCA9IGdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjEwOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVH07Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlci5zZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBjb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEE7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgewotCQkJLyoqCi0JCQkgKiBHcmFtbWF0aWNhbGx5LCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgUElfQ09OVEVOVCByZWdpb24KLQkJCSAqIHdpdGhvdXQgYSBwcmVjZWRpbmcgWE1MX1RBR19OQU1FIHJlZ2lvbi4gUmVseWluZyBvbiB0aGlzLAotCQkJICogZXh0cmFjdCB0aGUgdGFyZ2V0IHByb2Nlc3NvciBuYW1lIGFuZCBjcmVhdGUgYSBwYXJ0aXRpb24gdHlwZQotCQkJICogZHluYW1pY2FsbHkuCi0JCQkgKi8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJSVRleHRSZWdpb24gbmFtZSA9IGRvY1JlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpIC0gMSk7Ci0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1BSRUZJWCArIGRvY1JlZ2lvbi5nZXRUZXh0KG5hbWUpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfUEk7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTjsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQ7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShGb3JlaWduUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyB0ZW1wIGFkZGVkIGp1c3QgdG8gZGlzLWFtYmlndWF0ZSBjYWxsIGZyb20gc3ViY2xhc3MKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHdhcyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQlTdHJpbmcgbmV3UmVzdWx0ID0gcmVzdWx0OwotCQkvLyBuc2RfVE9ETzogRGF2aWQgYW5kIEkgbmVlZCB0byBkaXNjdXNzLCBkZXNpZ24sIGFuZCBpbXBsZW1lbnQgdGhpcwotCQkvLyBmb3IgYWxsIGJsb2NrIHRhZ3MgYW5kIGNvbW1lbnRzCi0JCS8vIGFuZCBtYWtlIHN1cmUgaXMgcGFydCBvZiAiZXh0ZW5zaWJsZSIgZGVzaWduIG9mIGJsb2NrIHRhZ3MKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkvLyBmb3IgY29kZSBzYWZldHksIHdlJ2xsIGFsd2F5cyBjaGVjayBpbnN0YW5jZW9mLCBidXQgSSB0aGluawotCQkJLy8gYWx3YXlzIHRydWUuCi0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCS8vIHN1cGVyIGlzIHVzZWQgYmVsb3cgc28gd29uJ3QgYmUgYW1iaWd1b3VzCi0JCQkJbmV3UmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoRm9yZWlnblJlZ2lvbikgcmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCW5ld1Jlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1Jlc3VsdCA9IGdldFVua25vd24oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgd2FzIG1vdmVkIGRvd24gdG8gc3ViY2xhc3Mgb2YgU3RydWN0dXJlZFRleHRQYXJ0aW9uZXIKLQkJLy8gZm9yIHF1aWNrIGZpeCB0byB0cmFuc2l0aW9uIHByb2JsZW1zLiBIZWlyYXJjaHkgbmVlZHMgbG90cyBvZgotCQkvLyBjbGVhbnVwLgotCQlpZiAocHJldmlvdXNTdGFydCAhPSBudWxsICYmIHByZXZpb3VzU3RhcnQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIG5leHQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJSVRleHRSZWdpb24gcHJldmlvdXNOYW1lID0gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHByZXZpb3VzU3RhcnQpKTsKLQkJCUlUZXh0UmVnaW9uIG5leHROYW1lID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHQpKTsKLQkJCWlmIChwcmV2aW91c05hbWUgIT0gbnVsbCAmJiBuZXh0TmFtZSAhPSBudWxsICYmIHByZXZpb3VzTmFtZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgJiYgbmV4dE5hbWUuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgc2RSZWdpb24pKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvbkZvdW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWY0NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdGlvbkNvbXBvbmVudCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRWYWxpZGF0b3IoKS52YWxpZGF0ZShub2RlKTsKLQotCi0JCVByb3BhZ2F0b3IucHJvcGFnYXRlVG9DaGlsZEVsZW1lbnRzKGdldFByb3BhZ2F0ZWUoKSwgKE5vZGUpIG5vZGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Qcm9wYWdhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4ZDFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFByb3BhZ2F0b3IgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZVRvQ2hpbGRFbGVtZW50cyhWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciwgTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDbGFzcyBjbGF6eiA9IHZhbGlkYXRvci5nZXRDbGFzcygpOwotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0KLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgY2hpbGQ7Ci0JCQlWYWxpZGF0aW9uQWRhcHRlciB2YSA9IChWYWxpZGF0aW9uQWRhcHRlcikgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKGNsYXp6KTsKLQkJCWlmICh2YSA9PSBudWxsKSB7Ci0JCQkJbm90aWZpZXIuYWRkQWRhcHRlcih2YWxpZGF0b3IpOwotCQkJCXZhID0gdmFsaWRhdG9yOwotCQkJfQotCQkJdmEudmFsaWRhdGUoKEluZGV4ZWRSZWdpb24pIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3BhZ2F0b3IgaXMganVzdCBhIHBsYWNlaG9sZGVyIG9mIHV0aWxpdGllcy4gRG9uJ3QgaW5zdGFudGlhdGUuCi0JICovCi0JcHJpdmF0ZSBQcm9wYWdhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTBmZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBWYWxpZGF0aW9uQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFZhbGlkYXRpb25Db21wb25lbnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkNvbXBvbmVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFZhbGlkYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIFYyLgotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2YzU3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQ7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBmb3IgWE1MLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxQYXJ0aXRpb25zIHsKLQkKLQlTdHJpbmcgWE1MX0RFRkFVTFQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0NEQVRBID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NEQVRBIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfUEkgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfUEkiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9ERUNMQVJBVElPTiA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUNMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogVGhpcyB2YWx1ZSBpcyB1c2VkIGFzIGEgcHJlZml4IHRvIGFueSB1bmtub3duIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCi0JICogd2UgZmluZC4gVGhlIHByb2Nlc3NvciB0YXJnZXQgbmFtZSBpcyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlIGFuZAotCSAqIGFwcGVuZGVkIHRvIHRoZSBwcmVmaXggdG8gY3JlYXRlIGEgdW5pcXVlIHBhcnRpdGlvbiB0eXBlLgotCSAqLwotCVN0cmluZyBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2hvdWxkIG1hdGNoCi0JICogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmR0ZC5wYXJ0aXRpb25pbmcuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5TVF9EVERfU1VCU0VUCi0JICovCi0JU3RyaW5nIERURF9TVUJTRVQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5kdGQuaW50ZXJuYWxfc3Vic2V0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyNjUyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYyIgLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAga2luZD0ic3JjIgotICAgICAgICBwYXRoPSJzcmMtdmFsaWRhdGlvbiIgLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAga2luZD0ic3JjIgotICAgICAgICBwYXRoPSJzcmMtbXVsdGlwYWdlIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy13aXphcmRzIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy1jYXRhbG9nIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJjb24iCi0gICAgICAgIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIgLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIgotICAgICAgICBraW5kPSJjb24iPgotICAgICAgICA8YWNjZXNzcnVsZXM+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZQotICAgICAgICAgICAgICAgIGtpbmQ9ImFjY2Vzc2libGUiCi0gICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIiAvPgotICAgICAgICA8L2FjY2Vzc3J1bGVzPgotICAgIDwvY2xhc3NwYXRoZW50cnk+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9Im91dHB1dCIKLSAgICAgICAgcGF0aD0iYmluIiAvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFjMjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi14bWxlZGl0b3IuamFyCi1vcmcuZWNsaXBzZS53c3QueG1sLnVpXzEuMC4wLmphcgotb3JnLmVjbGlwc2Uud3N0LnhtbC51aV8xLjAuMC56aXAKLXhtbGVkaXRvcnNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjYWU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QueG1sLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZGM0YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPjwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM0MzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNg0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlY2ZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhtbC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54bWwudWksCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuaWNvbnMuZXRvb2w1MDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5pY29ucy5vYmoxNjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5pY29ucy5vdnIxNjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG91YmxlY2xpY2s7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuaWNvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmFhMmZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIGV4YW1wbGVzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjLW11bHRpcGFnZS8sXAotICAgICAgICAgICBzcmMtd2l6YXJkcy8sXAotICAgICAgICAgICBzcmMtY2F0YWxvZy8sXAotICAgICAgICAgICBzcmMtdmFsaWRhdGlvbgotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9leGFtcGxlcy9FZGl0aW5nQW5kVmFsaWRhdGluZ1hNTC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTc3NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9YTUxGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlYjFiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvWE1MRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc0NzIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMwZGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub2ZmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub2ZmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkY2ViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9mZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIzZDU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzM3YjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kX2FsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJjMTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld194bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjZmRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld194bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9ybGRncm1yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvcmxkZ3Jtci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MzI1ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9ybGRncm1yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi92YWxpZGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWQxNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi92YWxpZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzViYzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ4MGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub2ZmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub2ZmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhYjA0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9mZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODJmOWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY0NTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjA1YjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjYyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvcmxkZ3Jtci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWNhYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzQ3YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBlZWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYWRkX2NvcnJlY3Rpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYWRkX2NvcnJlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTJkN2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2FkZF9jb3JyZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dF9yZXFfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dF9yZXFfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjNjZkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2RhdGFzZWN0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NkYXRhc2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDg3MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2RhdGFzZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Nob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTNiYTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Nob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzJjY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29ycmVjdGlvbl9jaGFuZ2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29ycmVjdGlvbl9jaGFuZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjgzYzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2RvY3R5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZG9jdHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDBmODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZG9jdHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzBhY2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY3ODE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZkM2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWY5MTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW51bS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwYTQ4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Vycm9yLW92ZXJsYXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXJyb3Itb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXJyb3Itb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDRiMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FkMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L29jY3Vyb25lX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2N1cm9uZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmI2NWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L29jY3Vyb25lX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDM2ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvaW5zdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMtZGVlbXBoYXNpemVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLWRlZW1waGFzaXplZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZjQ3ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMtZGVlbXBoYXNpemVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLWVtcGhhc2l6ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMtZW1waGFzaXplZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWJhNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMtZW1waGFzaXplZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZjUxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1tYWNyby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTdhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyNmU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVmNWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc3RhbGVfZXJyb3Jfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwNDcxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2Fybl9vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2Fybl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzUwNzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3dhcm5fb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3ZpZXcxNi9hdHRpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC92aWV3MTYvYXR0aWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3ZpZXcxNi9hdHRpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5NmIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpemJhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGZmMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMveG1sZG9jLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGViMWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk3OGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVhNTCBVSSBQbHVnaW4KLVhNTF9GaWxlcy5uYW1lPVhNTCBGaWxlcwotWE1MX1NvdXJjZS5uYW1lPVhNTCBTb3VyY2UKLVhNTF9UZW1wbGF0ZXMubmFtZT1YTUwgVGVtcGxhdGVzCi1YTUxfU3R5bGVzLm5hbWU9WE1MIFN0eWxlcwotWE1MX0VkaXRvci5uYW1lPVhNTCBFZGl0b3IKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9XSVpBUkRfTkVXX1hNTD1YTUwKLWdlbk1lbnVMYWJlbD0mR2VuZXJhdGUKLV9VSV9BQ1RJT05fQ1JFQVRFX1hNTD0mWE1MIEZpbGUuLi4KLV9VSV9DUkVBVEVfTkVXX1hNTF9GSUxFPUNyZWF0ZSBhIG5ldyBYTUwgZmlsZS4KLVhNTEV4YW1wbGUubmFtZT1FZGl0aW5nIGFuZCB2YWxpZGF0aW5nIFhNTCBmaWxlcwotWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBwcm9qZWN0IGNvbnRhaW5pbmcgWE1MIHNhbXBsZSBmaWxlcwotWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wcm9qZWN0bmFtZT1YTUxFeGFtcGxlcwotWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdldGl0bGU9WE1MIHNhbXBsZSBmaWxlcyBmb3IgZWRpdGluZyBhbmQgdmFsaWRhdGluZwotWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdlZGVzY3JpcHRpb249Q3JlYXRlIGEgcHJvamVjdCBjb250YWluaW5nIFhNTCBzYW1wbGUgZmlsZXMuCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmxhYmVsPSZQcm9qZWN0IE5hbWU6Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BbGxfWE1MX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUFsbCBYTUwKLVhNTF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IFhNTAotWE1MX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgVGFnCi1YTUxfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCBBdHRyaWJ1dGUKLVhNTF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9WE1MIEF0dHJpYnV0ZSB2YWx1ZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQWRkVGFzay5sYWJlbD1BZGQgJlRhc2suLi4KLUFkZFRhc2sudG9vbHRpcD1BZGQgVGFzay4uLgotQWRkQm9va21hcmsubGFiZWw9QWRkIEJvbyZrbWFyay4uLgotQWRkQm9va21hcmsudG9vbHRpcD1BZGQgQm9va21hcmsuLi4KLVNlbGVjdFJ1bGVyLmxhYmVsPVNlbGVjdCBSdWxlcgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotWE1MX0NhdGFsb2dfRmlsZV9UeXBlX0V4dGVuc2lvbl9Qb2ludC5uYW1lPVhNTCBDYXRhbG9nIGZpbGUgdHlwZSBleHRlbnNpb24gcG9pbnQKLV9VSV9QUkVGX1hNTF9DQVRBTE9HPVhNTCBDYXRhbG9nCi1fVUlfUFJFRl9EVERfRklMRVM9RFREIEZpbGVzCi1fVUlfUFJFRl9YU0RfRklMRVM9WFNEIEZpbGVzCi1fVUlfUFJFRl9UQUdMSUJfREVGX0ZJTEVTPVRhZ2xpYiBEZWZpbml0aW9uIEZpbGVzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1fVUlfWE1MX1ZBTElEQVRPUiAgICAgICAgICAgICAgICAgICA9IFhNTCBWYWxpZGF0b3IKLV9VSV9SRUZfRklMRV9TSE9XX0RFVEFJTFMgICAgICAgICAgID0gU2hvdyBEZXRhaWxzLi4uCi1fVUlfTUVOVV9WQUxJREFURV9YTUwgICAgICAgICAgICAgICA9IFZhbGlkYXRlIFhNTCBGaWxlCi0jIwotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2YzODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjYXRhbG9nRmlsZVR5cGUiIG5hbWU9IiVYTUxfQ2F0YWxvZ19GaWxlX1R5cGVfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NhdGFsb2dGaWxlVHlwZS5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9QUkVGX1hNTF9DQVRBTE9HIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY2F0YWxvZ0ZpbGVUeXBlIj4KLQkJPGZpbGVUeXBlCi0JCQlleHRlbnNpb25zPSJkdGQsIGVudCwgbW9kIgotCQkJZGVzY3JpcHRpb249IiVfVUlfUFJFRl9EVERfRklMRVMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS5kdGQiPgotCQk8L2ZpbGVUeXBlPgotCQk8ZmlsZVR5cGUKLQkJCWV4dGVuc2lvbnM9InhzZCIKLQkJCWRlc2NyaXB0aW9uPSIlX1VJX1BSRUZfWFNEX0ZJTEVTIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS51aS5jYXRhbG9nRmlsZVR5cGUueHNkIj4KLQkJPC9maWxlVHlwZT4KLQkJPGZpbGVUeXBlCi0JCQlleHRlbnNpb25zPSJ0bGQiCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9QUkVGX1RBR0xJQl9ERUZfRklMRVMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS50bGQiPgotCQk8L2ZpbGVUeXBlPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS1UaGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSBjb250ZW50IHR5cGUgaXMgb25seSBmb3IKLQkJaGFuZGxpbmcgc29tZSBzcGVjaWFsIGNhc2VzIG9mIGlsbC1mb3JtZWQgeG1sIGluIGEgcmVhc29uYWJsZQotCQltYW5uZXIsIGFuZCBzaG91bGQgbm90IGJlIGVtdWxhdGVkIGJ5IGNsaWVudHMuIFRoZSB0d28gY29udGVudAotCQl0eXBlcyBhcmUgb2Z0ZW4gdXNlZCBpbnRlcmNoYW5nZWFibHkgYnkgdGhlIFhNTCBjb21wb25lbnQsIGJ1dAotCQlwbGVhc2UgdXNlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwgaW5zdGVhZC4gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmUuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InNvdXJjZWVkaXRpbmd0ZXh0dG9vbHMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRleHQuWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjb3JyZWN0aW9uYXNzaXN0YW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLmNvbG9ycyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPCEtLSBYTUwgUFJFRkVSRU5DRSBQQUdFUyAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfRmlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbCI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX1RlbXBsYXRlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50ZW1wbGF0ZXMiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX1N0eWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29sb3JQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLmNvbG9ycyI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPjwvcGFydD4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPjwvcGFydD4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUFsbF9YTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfYWxsIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlWE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9uZXciPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVYTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX3RhZyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJVhNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfYXR0cmlidXRlIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlWE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9hdHRyaWJ1dGVfdmFsdWUiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8aW5jbHVkZQotCQkJZmlsZT0idGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyI+Ci0JCTwvaW5jbHVkZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlWE1MX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy94bWxkb2MuZ2lmIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0Ij4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydAotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0Ij4KLQkJCTwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydAotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0Ij4KLQkJCTwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIENvbnRyaWJ1dGUgYSAnTmV3IFdpemFyZCcgZm9yIFhNTCBmaWxlcyAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTxjYXRlZ29yeQotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hNTCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiPgotCQk8L2NhdGVnb3J5PgotCQk8d2l6YXJkCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfWE1MIgotCQkJaWNvbj0iJG5sJC9pY29ucy9YTUxGaWxlLmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuTmV3WE1MV2l6YXJkIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9ORVdfWE1MX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCTwvc2VsZWN0aW9uPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEFsbG93IHRoZSAnTmV3IFhNTCcgd2l6YXJkIHRvIGJlIGFjY2Vzc2VkIHZpYSB0aGUgJ0dlbmVyYXRlJyBtZW51IG9uIGEgWFNEIGZpbGUgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQluYW1lRmlsdGVyPSIqLnhzZCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sd2l6YXJkLmNyZWF0ZVhNTEZyb21YU0QiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJWdlbk1lbnVMYWJlbCIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9ImdlbmVyYXRlWE1MQXJ0aWZhY3RzIj4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9InhtbCIgLz4KLQkJCTwvbWVudT4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJV9VSV9BQ1RJT05fQ1JFQVRFX1hNTCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLlhNTEltcG9ydEFjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJnZW5lcmF0ZVhNTEFydGlmYWN0cy94bWwiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tWFNEQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEFsbG93IHRoZSAnTmV3IFhNTCcgd2l6YXJkIHRvIGJlIGFjY2Vzc2VkIHZpYSB0aGUgJ0dlbmVyYXRlJyBtZW51IG9uIGEgRFREIGZpbGUgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQluYW1lRmlsdGVyPSIqLmR0ZCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sd2l6YXJkLmNyZWF0ZVhNTEZyb21EVEQiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJWdlbk1lbnVMYWJlbCIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9ImdlbmVyYXRlWE1MQXJ0aWZhY3RzIj4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9InhtbCIgLz4KLQkJCTwvbWVudT4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJV9VSV9BQ1RJT05fQ1JFQVRFX1hNTCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLlhNTEltcG9ydEFjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJnZW5lcmF0ZVhNTEFydGlmYWN0cy94bWwiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tRFREQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIENvbnRyaWJ1dGUgYSBOZXctPkV4YW1wbGUuLi4gZW50cnkgZm9yIEVkaXRpbmcgYW5kIFZhbGlkYXRpbmcgWE1MIGZpbGVzICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPCEtLSBkZWZpbmUgdGhlIFhNTFNhbXBsZXMgcHJvamVjdCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTxjYXRlZ29yeQotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hNTCIKLQkJCXBhcmVudENhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmV4YW1wbGVzIj4KLQkJPC9jYXRlZ29yeT4KLQkJPHdpemFyZAotCQkJbmFtZT0iJVhNTEV4YW1wbGUubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmV4YW1wbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLQkJCXByb2plY3Q9InRydWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuZGVzY3JpcHRpb24KLQkJCTwvZGVzY3JpcHRpb24+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBjb25maWd1cmUgdGhlIFhNTFNhbXBsZXMgcHJvamVjdCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQlpZD0iWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZEV4dGVuc2lvbiI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLlhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiCi0JCQliYW5uZXI9Imljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLmdpZiI+Ci0JCQk8cHJvamVjdHNldHVwCi0JCQkJcGFnZXRpdGxlPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdldGl0bGUiCi0JCQkJbmFtZT0iJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucHJvamVjdG5hbWUiCi0JCQkJbGFiZWw9IiVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmxhYmVsIgotCQkJCXBhZ2VkZXNjcmlwdGlvbj0iJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucGFnZWRlc2NyaXB0aW9uIgotCQkJCW9wZW49InJlYWRtZS5odG1sIj4KLQkJCQk8aW1wb3J0Ci0JCQkJCWRlc3Q9IiIKLQkJCQkJc3JjPSJleGFtcGxlcy9FZGl0aW5nQW5kVmFsaWRhdGluZ1hNTC56aXAiIC8+Ci0JCQk8L3Byb2plY3RzZXR1cD4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUgeG1sIHVpIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ubWFya3VwdmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEV4dGVybmFsRmlsZUVkaXRvcklucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgotCQk8cHJvdmlkZXIKLQkJCWlucHV0VHlwZXM9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkV4dGVybmFsRmlsZUVkaXRvcklucHV0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RmlsZURvY3VtZW50UHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5FeHRlcm5hbEZpbGVEb2N1bWVudFByb3ZpZGVyIj4KLQkJPC9wcm92aWRlcj4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBBbiBleHRlbnNpb24gZm9yIGNyZWF0aW5nIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLiAgLS0+Ci0JPCEtLSBUaGlzIGV4dGVuc2lvbiBzaG91bGQgYmUgbW92ZWQgd2hlbiB0aGUgcmVmZXJlbmNlZCAgICAgLS0+Ci0JPCEtLSBmaWxlcyBkaWFsb2cgaXMgbW92ZWQgdG8gYW5vdGhlciBwbHVnaW4uICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5uZXN0ZWRlcnJvcmxpc3QiCi0JCQluYW1lRmlsdGVyPSIqIj4KLQkJCTxmaWx0ZXIKLQkJCQluYW1lPSJkb25lIgotCQkJCXZhbHVlPSJ0cnVlIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW5hbWU9InR5cGUiCi0JCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiPgotCQkJPC9maWx0ZXI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVfVUlfUkVGX0ZJTEVfU0hPV19ERVRBSUxTIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm8uUmVmZXJlbmNlZEZpbGVFcnJvckFjdGlvbkRlbGVnYXRlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm8uUmVmZXJlbmNlZEZpbGVFcnJvckFjdGlvbkRlbGVnYXRlIj4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaC5YTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iRmluZE9jY3VycmVuY2VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NjaGVtYS9jYXRhbG9nRmlsZVR5cGUuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Mjk2NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NjaGVtYS9jYXRhbG9nRmlsZVR5cGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIiBpZD0iY2F0YWxvZ0ZpbGVUeXBlIiBuYW1lPSJYTUwgQ2F0YWxvZyBmaWxlIHR5cGUgZXh0ZW5zaW9uIHBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWxlVHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWxlVHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbnMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQWR2YW5jZWRPcHRpb25zRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0FkdmFuY2VkT3B0aW9uc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRjNWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQWR2YW5jZWRPcHRpb25zRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFkdmFuY2VkT3B0aW9uc0RpYWxvZyBleHRlbmRzIERpYWxvZyAKLXsKLSAgcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQotICBwdWJsaWMgQWR2YW5jZWRPcHRpb25zRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJQ2F0YWxvZyB3b3JraW5nVXNlckNhdGFsb2cpIAotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7ICAgCi0gICAgdGhpcy53b3JraW5nVXNlckNhdGFsb2cgPSB3b3JraW5nVXNlckNhdGFsb2c7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIENvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0vLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nQXJlYSwgbmV3IENvbnRyb2xDb250ZXh0Q29tcHV0ZXIoZGlhbG9nQXJlYSwgWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9QUk9KRUNUX0RJQUxPRykpOwotICAgICAgICAgIAotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsgIAotCi0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRElBTE9HX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7ICAgICAKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAKLSAgICBDb21wb3NpdGUgcGxhY2VIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUoYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOyAKLSAgICBidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKCkpOwotCi0gICAgQnV0dG9uIGltcG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0gICAgaW1wb3J0QnV0dG9uLnNldFRleHQoIiAgIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9CVVRUT05fSU1QT1JUICsgIiAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgQnV0dG9uIGV4cG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0gICAgZXhwb3J0QnV0dG9uLnNldFRleHQoIiAgIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9CVVRUT05fRVhQT1JUICsgIiAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgcGxhY2VIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgLy8gYWRkIGltcG9ydEJ1dHRvbiBsaXN0ZW5lcgotICAgIFNlbGVjdGlvbkxpc3RlbmVyIGltcG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW52b2tlSW1wb3J0RGlhbG9nKCk7ICAgICAgICAgICAgICAKLSAgICAgIH0gICAgIAotICAgIH07IAotICAgIGltcG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihpbXBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgICAgIAotICAgIC8vIGFkZCBleHBvcnRCdXR0b24gbGlzdGVuZXIKLSAgICBTZWxlY3Rpb25MaXN0ZW5lciBleHBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludm9rZUV4cG9ydERpYWxvZygpOyAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAKLSAgICB9OyAKLSAgICBleHBvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXhwb3J0QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0gICAgcmV0dXJuIGRpYWxvZ0FyZWE7Ci0gIH0KLSAgICAgICAKLSAgcHJvdGVjdGVkIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKCkKLSAgewotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkNFTlRFUik7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSOwotICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotICAgIHJldHVybiBnZDsKLSAgfQotIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgaW52b2tlSW1wb3J0RGlhbG9nKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBudWxsLCB0cnVlKTsgCi0gICAgU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiLnhtbGNhdGFsb2ciLCAiLnhtbCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBkaWFsb2cuYWRkRmlsdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsgICAKLSAgICBkaWFsb2cuY3JlYXRlKCk7ICAgCi0gICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19USVRMRSk7Ci0gICAgZGlhbG9nLnNldFRpdGxlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9JTVBPUlRfRElBTE9HX0hFQURJTkcpOwotICAgIGRpYWxvZy5zZXRNZXNzYWdlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9JTVBPUlRfRElBTE9HX01FU1NBR0UpOwotICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICBpbnQgcmMgPSBkaWFsb2cub3BlbigpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChyYyA9PSBXaW5kb3cuT0spCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIElGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENhdGFsb2dTZXQgdGVtcFJlc291cmNlU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsgCi0gICAgICAgICAgICBJQ2F0YWxvZyBuZXdDYXRhbG9nID0gdGVtcFJlc291cmNlU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygidGVtcCIsIGZpbGVOYW1lKTsgICAgICAgLy8kTk9OLU5MUy0xJAotICAJCSAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2cobmV3Q2F0YWxvZyk7IAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIC8vVE9ETy4uLiBnaXZlIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgfSAgIAotICAgICAgfQotICAgICAgY2xvc2UoKTsKLSAgICB9Ci0gIH0KLSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgaW52b2tlRXhwb3J0RGlhbG9nKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBJUGF0aCBvcmlnaW5hbEZpbGVQYXRoID0gbnVsbDsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgIGlmIChwcm9qZWN0cy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIG9yaWdpbmFsRmlsZVBhdGggPSBwcm9qZWN0c1swXS5nZXRGdWxsUGF0aCgpLmFwcGVuZCgiLnhtbGNhdGFsb2ciKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU2F2ZUFzRGlhbG9nIGRpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgaWYgKG9yaWdpbmFsRmlsZVBhdGggIT0gbnVsbCkKLSAgICB7Ci0JICAgIElGaWxlIG9yaWdpbmFsRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShvcmlnaW5hbEZpbGVQYXRoKTsgICAKLSAgICAgIGRpYWxvZy5zZXRPcmlnaW5hbEZpbGUob3JpZ2luYWxGaWxlKTsgCi0gICAgfQotICAgIGRpYWxvZy5jcmVhdGUoKTsgICAgCi0KLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9FWFBPUlRfRElBTE9HX1RJVExFKTsKLSAgICBkaWFsb2cuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0gICAgZGlhbG9nLnNldE1lc3NhZ2UoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfTUVTU0FHRSk7Ci0KLSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgaW50IHJjID0gZGlhbG9nLm9wZW4oKTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocmMgPT0gV2luZG93Lk9LKQotICAgIHsgCi0gICAgICBJUGF0aCBwYXRoID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHBhdGggIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBoZXJlIHdlIHNhdmUgdGhlIGNhdGFsb2cgZW50cmllcyB0byB0aGUgc2VsZWN0ZWQgZmlsZSAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgIGNyZWF0ZUZpbGVJZlJlcXVpcmVkKGZpbGUpOyAKLSAgICAgICAgICB3b3JraW5nVXNlckNhdGFsb2cuc2V0TG9jYXRpb24oZmlsZU5hbWUpOwotICAgICAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZy5zYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQ0FUQUxPR19TQVZFX0VSUk9SOyAgICAKLSAgICAgICAgICAgIFN0cmluZyBicmllZk1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQ7ICAgICAKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBmaWxlLmlzUmVhZE9ubHkoKSA/Ci0gICAgICAgICAgICAJCU5MUy5iaW5kKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9GSUxFX0lTX1JFQURfT05MWSwgZmlsZU5hbWUpIDogCi0gICAgICAgICAgICAJCQlOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuRVJST1JfU0FWSU5HX0ZJTEUsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzID0gTkxTLmJpbmQoWE1MQ2F0YWxvZ01lc3NhZ2VzLkVSUk9SX1NBVklOR19GSUxFLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgYnJpZWZNZXNzYWdlLCBjcmVhdGVTdGF0dXMocmVhc29uLCBkZXRhaWxzKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBUT0RPLi4uIFRoaXMgd2FzIGNvcGllZCBmcm9tIFdpbmRvd1V0aWxpdHkuICBJcyB0aGVyZSBhbiBlYXNpZXIgd2F5IHRvIGNyZWF0ZSBhIHN0YXR1cyBvYmplY3Q/Ci0gIC8vIElmIG5vdCwgd2Ugc2hvdWxkIG9wZW4gYW4gZWNsaXBzZSBidWcgb3IgYWRkIGEgc2ltaWxhciB1dGlsaXR5IHRvIGJhc2VFeHRlbnNpb25zVUkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKFN0cmluZyByZWFzb24sIFN0cmluZyBtc2cpCi0gIHsKLQlTdHJpbmcgcGx1Z2luSWQgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7ICAgIAotCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCAwLCByZWFzb24sIG51bGwpOwotCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklkLCAwLCBtc2csIG51bGwpOwotCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCXJldHVybiBtdWx0aVN0YXR1czsKLSAgfSAgIAotICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlSWZSZXF1aXJlZChJRmlsZSBmaWxlKQotICB7Ci0gICAgdHJ5Ci0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpKQotICAgICAgewotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7ICAgICAgCi0JICAgICAgZmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotICAgICAgICAvL2NyZWF0ZUVtcHR5WE1MQ2F0YWxvZyhmaWxlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNGE4ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgc3RhdGljIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyIF9pbnN0YW5jZTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRVhURU5TSU9OUyA9ICJleHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjYXRhbG9nRmlsZVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImZpbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLQkJCV9pbnN0YW5jZSA9IG5ldyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlcigpOwotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5oYXNoTWFwLnZhbHVlcygpOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcCBoYXNoTWFwOwotCi0JcHVibGljIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyKCkgewotCQl0aGlzLmhhc2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZWFkUmVnaXN0cnkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCVhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGhhc2hNYXAuZ2V0KGlkKTsKLQkJCQlpZiAoZmlsZVR5cGUgPT0gbnVsbCkgewotCQkJCQlmaWxlVHlwZSA9IG5ldyBYTUxDYXRhbG9nRmlsZVR5cGUoKTsKLQkJCQkJaGFzaE1hcC5wdXQoaWQsIGZpbGVUeXBlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZmlsZVR5cGUuZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVTQ1JJUFRJT04pOwotCQkJCQlmaWxlVHlwZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJCX0KLQotCQkJCWZpbGVUeXBlLmFkZEV4dGVuc2lvbnMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0VYVEVOU0lPTlMpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCXJlYWRSZWdpc3RyeShFWFRFTlNJT05fUE9JTlRfSUQpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkUmVnaXN0cnkoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoWE1MVUlQbHVnaW4uSUQsIGV4dGVuc2lvblBvaW50SWQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VkaXRDYXRhbG9nRW50cnlEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvRWRpdENhdGFsb2dFbnRyeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE4ZDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvRWRpdENhdGFsb2dFbnRyeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzLlNlbGVjdFNpbmdsZUZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGJvcndzZUltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi9maWxlX2V4cGFuZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgY2F0YWxvZ0VudHJ5VG9vbEJhckltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9ldG9vbDUwL2NhdGFsb2dFbnRyeS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgbmV4dENhdGFsb2dUb29sQmFySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL2V0b29sNTAvbmV4dENhdGFsb2cuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBjbGFzcyBDYXRhbG9nRW50cnlQYWdlIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnRQYWdlIHsKLQotCQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnk7Ci0KLQkJcHJvdGVjdGVkIEJ1dHRvbiBjaGVja2JveEJ1dHRvbjsKLQotCQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0KLQkJcHJvdGVjdGVkIFRleHQga2V5RmllbGQ7Ci0KLQkJcHJvdGVjdGVkIENvbWJvIGtleVR5cGVDb21ibzsKLQotCQlwcm90ZWN0ZWQgVGV4dCByZXNvdXJjZUxvY2F0aW9uRmllbGQ7Ci0KLQkJcHJvdGVjdGVkIENvbWJvIHJlc291cmNlVHlwZUNvbWJvOwotCi0JCXByb3RlY3RlZCBUZXh0IHdlYkFkZHJlc3NGaWVsZDsKLQotCQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotCQkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzb3VyY2VMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCQlpZiAoZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoZmlsZU5hbWUuaW5kZXhPZigiLi4iKSAhPSAtMSB8fCBmaWxlTmFtZS5pbmRleE9mKCIuLyIpICE9IC0xIHx8IGZpbGVOYW1lLmluZGV4T2YoIi8uIikgIT0gLTEgfHwgZmlsZU5hbWUuaW5kZXhPZigiLlxcIikgIT0gLTEgfHwgZmlsZU5hbWUuaW5kZXhPZigiXFwuIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTVVTVF9OT1RfSEFWRV9ET1RTOwotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIHVyaSA9IGZpbGVOYW1lOwotCQkJCQlpZiAoIVVSSUhlbHBlci5oYXNQcm90b2NvbCh1cmkpKSB7Ci0JCQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZSh1cmkpID8gVVJJSGVscGVyLnByZXBlbmRGaWxlUHJvdG9jb2wodXJpKSA6IFVSSUhlbHBlci5wcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgJiYgIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICsgZmlsZU5hbWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0YXVsbHkKLQkJCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQkJZXJyb3JNZXNzYWdlID0gIiI7ICAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgJiYgY2hlY2tib3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgd2ViQWRkcmVzc0ZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0YXVsbHkKLQkJCQkvLyByZXBvcnRlZCAuLi4gT0sgaXMganVzdCBkaXNhYmxlZAotCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgJiYga2V5RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLy8gdGhpcyBhbiBlcnJvciB0aGF0IGlzIG5vdCBhY3RhdWxseQotCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJZXJyb3JNZXNzYWdlID0gIiI7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDYXRhbG9nRW50cnlQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCU1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoZS53aWRnZXQgPT0gcmVzb3VyY2VMb2NhdGlvbkZpZWxkKSB7Ci0JCQkJCQlpZiAoa2V5RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlTdHJpbmcgdXJpID0gcmVzb3VyY2VMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCQkJCQlpZiAodXJpLmVuZHNXaXRoKCJ4c2QiKSAmJiAhVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZSh1cmkpID8gVVJJSGVscGVyLnByZXBlbmRGaWxlUHJvdG9jb2wodXJpKSA6IFVSSUhlbHBlci5wcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSk7Ci0JCQkJCQkJCVN0cmluZyBuYW1lc3BhY2VVUkkgPSBYTUxRdWlja1NjYW4uZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKHVyaSk7Ci0JCQkJCQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotCQkJCQkJCQkJa2V5RmllbGQuc2V0VGV4dChuYW1lc3BhY2VVUkkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXVwZGF0ZVdpZGdldHMoZS53aWRnZXQpOwotCQkJCX0KLQkJCX07Ci0KLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCQlMYWJlbCByZXNvdXJjZUxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXJlc291cmNlTG9jYXRpb25MYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VUklfQ09MT04pOwotCi0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGdldEVudHJ5KCkuZ2V0VVJJKCkpKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZXNvdXJjZUxvY2F0aW9uRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1VSSSk7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0KLQkJCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJyb3dzZUJ1dHRvbihncm91cCk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoYnJvd3NlQnV0dG9uLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9CUk9XU0UpOwotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKHJlc291cmNlTG9jYXRpb25GaWVsZCkpOwotCi0JCQkvLyBLZXkgVHlwZQotCQkJLy8KLQkJCUxhYmVsIGtleVR5cGVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJa2V5VHlwZUxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0NPTE9OKTsKLQotCQkJa2V5VHlwZUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlrZXlUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQl1cGRhdGVLZXlUeXBlQ29tYm8oZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSk7Ci0JCQlrZXlUeXBlQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleVR5cGVDb21ibywKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfS0VZX1RZUEUpOwotCi0JCQkvLyBhIHBsYWNlaG9sZGVyIHRvIGZpbGwgdGhlIDNyZCBjb2x1bW4KLQkJCUJ1dHRvbiBwbGFjZUhvbGRlciA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXBsYWNlSG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQkvLyBLZXkKLQkJCS8vIAotCQkJTGFiZWwga2V5VmFsdWVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJa2V5VmFsdWVMYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVlfQ09MT04pOwotCQkJa2V5RmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleUZpZWxkLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9LRVkpOwotCQkJa2V5RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlrZXlGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEtleSgpKSk7Ci0JCQlrZXlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cDIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJLy8gY2hlY2tib3ggLS0gbm90ZSBwYXJlbnQgaXMgZGlhbG9nQXJlYQotCQkJLy8KLQkJCWNoZWNrYm94QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cDIsIFNXVC5DSEVDSyk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2hlY2tib3hCdXR0b24sCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1NQRUNJRllfQUxURVJOQVRJVkUpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMKTsKLQkJCWNoZWNrYm94QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0U2VsZWN0aW9uKGdldEVudHJ5KCkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpICE9IG51bGwpOwotCQkJU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIG5vIGltcGwKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNoZWNrYm94QnV0dG9uKSB7Ci0JCQkJCQl1cGRhdGVXaWRnZXRzKGNoZWNrYm94QnV0dG9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQljaGVja2JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0KLQkJCS8vIFdlYiBBZGRyZXNzIGZpZWxkCi0JCQkvLwotCi0JCQlNb2RpZnlMaXN0ZW5lciB3ZWJBZGRyZXNzRmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl3ZWJBZGRyZXNzRmllbGQgPSBuZXcgVGV4dChncm91cDIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh3ZWJBZGRyZXNzRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1dFQl9BRERSRVNTKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKSkpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHdlYkFkZHJlc3NGaWVsZExpc3RlbmVyKTsKLQotCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cDIsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCXVwZGF0ZVdpZGdldHMobnVsbCk7Ci0KLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJZkNvbnRyb2wgPSBjcmVhdGVDYXRhbG9nRW50cnlQYW5lbChwYXJlbnQpOwotCi0JCQlyZXR1cm4gZkNvbnRyb2w7Ci0JCX0KLQotCi0JCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0RGF0YSgpIHsKLQkJCXJldHVybiBnZXRFbnRyeSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElDYXRhbG9nRW50cnkgZ2V0RW50cnkoKSB7Ci0JCQlpZiAoY2F0YWxvZ0VudHJ5ID09IG51bGwpIHsKLQkJCQlpZiAoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwgJiYgZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSkgewotCQkJCQljYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhdGFsb2dFbnRyeTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0S2V5VHlwZSgpIHsKLQkJCXN3aXRjaCAoa2V5VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlpZiAoInNjaGVtYSIuZXF1YWxzKGtleVR5cGVDb21iby5nZXREYXRhKCJrZXlUeXBlIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7IC8vIHhzZCBuYW1lc3BhY2UgaXMgVVJJIHR5cGUga2V5Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0JCQkJY2FzZSAyIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2F2ZURhdGEoKSB7Ci0JCQlTdHJpbmcgdXJpID0gcmVzb3VyY2VMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCWlmICghVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZSh1cmkpID8gVVJJSGVscGVyLnByZXBlbmRGaWxlUHJvdG9jb2wodXJpKSA6IFVSSUhlbHBlci5wcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSk7Ci0JCQl9Ci0JCQlnZXRFbnRyeSgpLnNldFVSSSh1cmkpOwotCQkJZ2V0RW50cnkoKS5zZXRLZXkoa2V5RmllbGQuZ2V0VGV4dCgpKTsKLQkJCWdldEVudHJ5KCkuc2V0RW50cnlUeXBlKGdldEtleVR5cGUoKSk7Ci0JCQlnZXRFbnRyeSgpLnNldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMLCBjaGVja2JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA/IHdlYkFkZHJlc3NGaWVsZC5nZXRUZXh0KCkgOiBudWxsKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUtleVR5cGVDb21ibyhpbnQgdHlwZSkgewotCQkJa2V5VHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJZm9yIChJdGVyYXRvciBpID0gQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuZ2V0WE1MQ2F0YWxvZ0ZpbGVUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCWlmICh0aGVGaWxlVHlwZS5leHRlbnNpb25zICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBqID0gdGhlRmlsZVR5cGUuZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBqLm5leHQoKTsKLQkJCQkJCWlmIChyZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpLmVuZHNXaXRoKGV4dGVuc2lvbikpIHsKLQkJCQkJCQlpZiAodGhlRmlsZVR5cGUuZGVzY3JpcHRpb24uZXF1YWxzKCJYU0QgRmlsZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9QVUJMSUMpOwotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLnNldERhdGEoImtleVR5cGUiLCAic2NoZW1hIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmICh0aGVGaWxlVHlwZS5kZXNjcmlwdGlvbi5lcXVhbHMoIkRURCBGaWxlcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1BVQkxJQyk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQkJaWYgKGtleVR5cGVDb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuCi0JCQkJCQlVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfUFVCTElDKTsKLQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy4KLQkJCQkJCVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLgotCQkJCQkJVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCX0KLQkJCi0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMgOgotCQkJCQlrZXlUeXBlQ29tYm8uc2VsZWN0KDApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0gOgotCQkJCQlrZXlUeXBlQ29tYm8uc2VsZWN0KDEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk6IC8vIGhhbmRsZSBYTUwgU2NoZW1hLCB3aGVyZSBuYW1lc3BhY2UgbmFtZSBpcyBtYXBwZWQgdG8gVVJJIHNpdHVhdGlvbgotCQkJCQlpZiAoInNjaGVtYSIuZXF1YWxzKGtleVR5cGVDb21iby5nZXREYXRhKCJrZXlUeXBlIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsgLy8gbmFtZXNwYWNlIG5hbWUgYXMgVVJJIGtleSB0eXBlCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlrZXlUeXBlQ29tYm8uc2VsZWN0KDIpOyAvLyBVUkkga2V5IHR5cGUKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKGtleVR5cGVDb21iby5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdlYkFkZHJlc3NXaWRnZXRzKGludCBrZXlUeXBlKSB7Ci0JCQlib29sZWFuIGlzUHVibGljS2V5VHlwZSA9IChrZXlUeXBlID09IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0RW5hYmxlZChpc1B1YmxpY0tleVR5cGUpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLnNldEVuYWJsZWQoaXNQdWJsaWNLZXlUeXBlICYmIGNoZWNrYm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoV2lkZ2V0IHdpZGdldCkgewotCQkJaWYgKHdpZGdldCAhPSBrZXlUeXBlQ29tYm8pIHsKLQkJCQl1cGRhdGVLZXlUeXBlQ29tYm8oZ2V0S2V5VHlwZSgpKTsKLQkJCX0KLQkJCXVwZGF0ZVdlYkFkZHJlc3NXaWRnZXRzKGdldEtleVR5cGUoKSk7Ci0JCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBDYXRhbG9nRWxlbWVudFBhZ2UgewotCi0JCUNvbnRyb2wgZkNvbnRyb2w7Ci0KLQkJcHVibGljIENhdGFsb2dFbGVtZW50UGFnZSgpIHsKLQkJCXN1cGVyKCk7Ci0KLQkJfQotCi0JCXB1YmxpYyBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkJcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyBhYnN0cmFjdCBJQ2F0YWxvZ0VsZW1lbnQgZ2V0RGF0YSgpOwotCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVEYXRhKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEZpbHRlcmFibGVTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIENvbWJvIGZpbHRlckNvbnRyb2w7Ci0KLQkJcHVibGljIEZpbHRlcmFibGVTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCQlzdXBlcihwYXJlbnRTaGVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCQlzZXRGaWx0ZXJzKG51bGwpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQW5kT3BlbigpIHsKLQkJCXRoaXMuY3JlYXRlKCk7Ci0JCQlnZXRTaGVsbCgpLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1NFTEVDVF9GSUxFKTsKLQkJCXNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJb3BlbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MKTsKLQotCQkJZmlsdGVyQ29udHJvbCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlmaWx0ZXJDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlmaWx0ZXJDb250cm9sLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1RFWFRfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0wpOwotCi0JCQlmaWx0ZXJDb250cm9sLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfVEVYVF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmdldFhNTENhdGFsb2dGaWxlVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSAoWE1MQ2F0YWxvZ0ZpbGVUeXBlKSBpLm5leHQoKTsKLQkJCQlpZiAoZmlsZVR5cGUuZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlmaWx0ZXJDb250cm9sLmFkZChmaWxlVHlwZS5kZXNjcmlwdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQlmaWx0ZXJDb250cm9sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc2V0RmlsdGVycyhYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUpIHsKLQkJCWlmIChmaWxlVHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8gY29tcHV0ZSBhbGwgdGhlIHN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnMKLQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuZ2V0WE1MQ2F0YWxvZ0ZpbGVUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlYTUxDYXRhbG9nRmlsZVR5cGUgdGhlRmlsZVR5cGUgPSAoWE1MQ2F0YWxvZ0ZpbGVUeXBlKSBpLm5leHQoKTsKLQkJCQkJaWYgKHRoZUZpbGVUeXBlLmV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQkJCQkJbGlzdC5hZGRBbGwodGhlRmlsZVR5cGUuZXh0ZW5zaW9ucyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gQW55IGZpbGVzIGFyZSBub3cgc3VwcG9ydGVkIHdpdGggUmVzb3VyY2UgVVJJCi0JCQkJLy8gc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0RmlsdGVyRXh0ZW5zaW9ucyhjcmVhdGVTdHJpbmdBcnJheShsaXN0KSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZmlsZVR5cGUuZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldEZpbHRlckV4dGVuc2lvbnMoY3JlYXRlU3RyaW5nQXJyYXkoZmlsZVR5cGUuZXh0ZW5zaW9ucykpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGZpbHRlckNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIGZpbGVUeXBlID0gZ2V0TWF0Y2hpbmdGaWxlVHlwZSh0ZXh0KTsKLQkJCXNldEZpbHRlcnMoZmlsZVR5cGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE5leHRDYXRhbG9nUGFnZSBleHRlbmRzIENhdGFsb2dFbGVtZW50UGFnZSB7Ci0JCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JCXByb3RlY3RlZCBUZXh0IGNhdGFsb2dMb2NhdGlvbkZpZWxkOwotCi0JCXByb3RlY3RlZCBJTmV4dENhdGFsb2cgbmV4dENhdGFsb2c7Ci0KLQkJcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCi0JCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCi0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBjYXRhbG9nTG9jYXRpb25GaWVsZC5nZXRUZXh0KCk7Ci0JCQkJaWYgKGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKGZpbGVOYW1lLmluZGV4T2YoIi4uIikgIT0gLTEgfHwgZmlsZU5hbWUuaW5kZXhPZigiLi8iKSAhPSAtMSB8fCBmaWxlTmFtZS5pbmRleE9mKCIvLiIpICE9IC0xIHx8IGZpbGVOYW1lLmluZGV4T2YoIi5cXCIpICE9IC0xIHx8IGZpbGVOYW1lLmluZGV4T2YoIlxcLiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUzsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyB1cmkgPSBmaWxlTmFtZTsKLQkJCQkJaWYgKCFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgewotCQkJCQkJdXJpID0gVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKSA/IFVSSUhlbHBlci5wcmVwZW5kRmlsZVByb3RvY29sKHVyaSkgOiBVUklIZWxwZXIucHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsICYmICFVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTiArIGZpbGVOYW1lOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdHVhbGx5IAotCQkJCQkvLyByZXBvcnRlZCAuLi4gT0sgaXMganVzdCBkaXNhYmxlZAotCQkJCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlmQ29udHJvbCA9IGNyZWF0ZU5leHRDYXRhbG9nUGFuZWwocGFyZW50KTsKLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZU5leHRDYXRhbG9nUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCXVwZGF0ZVdpZGdldHMoZS53aWRnZXQpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJTGFiZWwgcmVzb3VyY2VMb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uTGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQ0FUQUxPR19VUklfQ09MT04pOwotCi0JCQkvLyBmaWxsZXIKLQkJCW5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCi0JCQljYXRhbG9nTG9jYXRpb25GaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQljYXRhbG9nTG9jYXRpb25GaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGdldE5leHRDYXRhbG9nKCkuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkpKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZXNvdXJjZUxvY2F0aW9uRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1VSSSk7Ci0JCQljYXRhbG9nTG9jYXRpb25GaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJyb3dzZUJ1dHRvbihncm91cCk7Ci0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoY2F0YWxvZ0xvY2F0aW9uRmllbGQpKTsKLQotCQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl1cGRhdGVXaWRnZXRzKG51bGwpOwotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0RGF0YSgpIHsKLQkJCXJldHVybiBnZXROZXh0Q2F0YWxvZygpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElOZXh0Q2F0YWxvZyBnZXROZXh0Q2F0YWxvZygpIHsKLQkJCWlmIChuZXh0Q2F0YWxvZyA9PSBudWxsKSB7Ci0JCQkJaWYgKGZDYXRhbG9nRWxlbWVudCAhPSBudWxsICYmIGZDYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HKSB7Ci0JCQkJCW5leHRDYXRhbG9nID0gKElOZXh0Q2F0YWxvZykgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJbmV4dENhdGFsb2cgPSAoSU5leHRDYXRhbG9nKSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV4dENhdGFsb2c7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzYXZlRGF0YSgpIHsKLQkJCVN0cmluZyB1cmkgPSBjYXRhbG9nTG9jYXRpb25GaWVsZC5nZXRUZXh0KCk7Ci0JCQlpZiAoIVVSSUhlbHBlci5oYXNQcm90b2NvbCh1cmkpKSB7Ci0JCQkJdXJpID0gVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKSA/IFVSSUhlbHBlci5wcmVwZW5kRmlsZVByb3RvY29sKHVyaSkgOiBVUklIZWxwZXIucHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpOwotCQkJfQotCQkJZ2V0TmV4dENhdGFsb2coKS5zZXRDYXRhbG9nTG9jYXRpb24odXJpKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoV2lkZ2V0IHdpZGdldCkgewotCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoZXJyb3JNZXNzYWdlTGFiZWwpOwotCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBzZWxlY3Rpb24gPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJaWYgKCFzaG93UGFnZSgoQ2F0YWxvZ0VsZW1lbnRQYWdlKSAoKFRvb2xJdGVtKSBzZWxlY3Rpb24pLmdldERhdGEoKSkpIHsKLQkJCQkJLy8gUGFnZSBmbGlwcGluZyB3YXNuJ3Qgc3VjY2Vzc2Z1bAotCQkJCQkvLyBoYW5kbGVFcnJvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjcmVhdGVTdHJpbmdBcnJheShMaXN0IGxpc3QpIHsKLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJc3RyaW5nQXJyYXlbaV0gPSAoU3RyaW5nKSBsaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nQXJyYXk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NsYXNoKFN0cmluZyB1cmkpIHsKLQkJLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgdmFsdWUgdG8gYXZvaWQgdGhlIHdob2xlIGxlYWRpbmcKLQkJLy8gc2xhc2gKLQkJLy8gYW1iaWd1aXR5IHByb2JsZW0KLQkJLy8gICAgICAgCi0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdXJpID0gdXJpLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBjYXRhbG9nOwotCi0JcHJvdGVjdGVkIElDYXRhbG9nRWxlbWVudCBmQ2F0YWxvZ0VsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBDYXRhbG9nRWxlbWVudFBhZ2Ugc2VsZWN0ZWRQYWdlOwotCi0JLy8gcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBUb29sQmFyIHRvb2xCYXI7Ci0JCi0JcHJvdGVjdGVkIENvbG9yIGNvbG9yOwotCi0JcHVibGljIEVkaXRDYXRhbG9nRW50cnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElDYXRhbG9nIGFDYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5jYXRhbG9nID0gYUNhdGFsb2c7Ci0JfQotCi0JcHVibGljIEVkaXRDYXRhbG9nRW50cnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuZkNhdGFsb2dFbGVtZW50ID0gY2F0YWxvZ0VsZW1lbnQ7Ci0JCS8vIFRPRE8gRUI6IGZpeCBoaXMKLQkJLy8gZW50cnkuc2V0VVJJKFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZW50cnkuZ2V0VVJJKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJc2VsZWN0ZWRQYWdlLnNhdmVEYXRhKCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRW50cnlCdXR0b24oKSB7Ci0JCUNhdGFsb2dFbGVtZW50UGFnZSBwYWdlID0gbmV3IENhdGFsb2dFbnRyeVBhZ2UoKTsKLQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQlUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCXRvb2xJdGVtLnNldEltYWdlKGNhdGFsb2dFbnRyeVRvb2xCYXJJbWFnZSk7Ci0JCXRvb2xJdGVtLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLkVkaXRDYXRhbG9nRW50cnlEaWFsb2dfY2F0YWxvZ0VudHJ5TGFiZWwpOwotCQl0b29sSXRlbS5zZXREYXRhKHBhZ2UpOwotCQl0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgVG9vbEJhckl0ZW1TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWFDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpYWxvZ0FyZWFDb21wb3NpdGUuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlkaWFsb2dBcmVhQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC53aWR0aEhpbnQgPSA1MDA7Ci0JCWdkLmhlaWdodEhpbnQgPSAyNTA7Ci0JCWRpYWxvZ0FyZWFDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNyZWF0ZU1haW5Db21wb25lbnQoZGlhbG9nQXJlYUNvbXBvc2l0ZSk7Ci0JCXJldHVybiB0aGlzLmRpYWxvZ0FyZWE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChjb2xvciAhPSBudWxsKSB7Ci0JCQljb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVNYWluQ29tcG9uZW50KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGZDYXRhbG9nRWxlbWVudCAhPSBudWxsKSAvLyAiZWRpdCIgYWN0aW9uCi0JCXsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUxID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWNvbXBvc2l0ZTEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZTEuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCXBhZ2VDb250YWluZXIgPSBuZXcgUGFnZUJvb2soY29tcG9zaXRlMSwgU1dULk5PTkUpOwotCQkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJaWYgKGZDYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpIHsKLQkJCQlDYXRhbG9nRWxlbWVudFBhZ2UgZW50cnlQYWdlID0gbmV3IENhdGFsb2dFbnRyeVBhZ2UoKTsKLQkJCQllbnRyeVBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJCQlzaG93UGFnZShlbnRyeVBhZ2UpOwotCQkJfQotCQkJZWxzZSBpZiAoZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpIHsKLQkJCQlDYXRhbG9nRWxlbWVudFBhZ2UgbmV4dENhdGFsb2dQYWdlID0gbmV3IE5leHRDYXRhbG9nUGFnZSgpOwotCQkJCW5leHRDYXRhbG9nUGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQkJCXNob3dQYWdlKG5leHRDYXRhbG9nUGFnZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wb3NpdGUxOwotCQl9Ci0JCXJldHVybiBjcmVhdGVNYWluQ29tcG9uZW50V2l0aFRvb2xiYXIoY29tcG9zaXRlKTsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVNYWluQ29tcG9uZW50V2l0aFRvb2xiYXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCi0JCUZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJZm9ybUxheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZm9ybUxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCB8IFNXVC5WRVJUSUNBTCk7Ci0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsYWJlbCwgMCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJLy8gZGF0YS5oZWlnaHQgPSAyNTA7Ci0JCS8vIGRhdGEud2lkdGggPSA1MDsKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUxID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxhYmVsLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRvb2xCYXIsIDAsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQljb21wb3NpdGUxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZTEuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlUGFnZUJvb2tQYW5lbChjb21wb3NpdGUxKTsKLQkJcGFnZUNvbnRhaW5lciA9IG5ldyBQYWdlQm9vayhjb21wb3NpdGUxLCBTV1QuTk9ORSk7Ci0JCXBhZ2VDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gYWRkIHBhZ2VzIGZvciBlYWNoIHR5cGUgb2YgY2F0YWxvZyBlbGVtZW50Ci0JCWNyZWF0ZUNhdGFsb2dFbnRyeUJ1dHRvbigpOwotCQljcmVhdGVOZXh0Q2F0YWxvZ0J1dHRvbigpOwotCQlpZiAodG9vbEJhci5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSB0b29sQmFyLmdldEl0ZW0oMCk7Ci0JCQlzaG93UGFnZSgoQ2F0YWxvZ0VsZW1lbnRQYWdlKSAoaXRlbS5nZXREYXRhKCkpKTsKLQkJfQotCQlyZXR1cm4gY29tcG9zaXRlMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOZXh0Q2F0YWxvZ0J1dHRvbigpIHsKLQkJQ2F0YWxvZ0VsZW1lbnRQYWdlIHBhZ2UgPSBuZXcgTmV4dENhdGFsb2dQYWdlKCk7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQl0b29sSXRlbS5zZXRJbWFnZShuZXh0Q2F0YWxvZ1Rvb2xCYXJJbWFnZSk7Ci0JCXRvb2xJdGVtLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLkVkaXRDYXRhbG9nRW50cnlEaWFsb2dfbmV4dENhdGFsb2dMYWJlbCk7Ci0JCXRvb2xJdGVtLnNldERhdGEocGFnZSk7Ci0JCXRvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBUb29sQmFySXRlbVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotCi0JfQotCi0JcHJvdGVjdGVkIElDYXRhbG9nRWxlbWVudCBnZXRDYXRhbG9nRWxlbWVudCgpIHsKLQkJcmV0dXJuIGZDYXRhbG9nRWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dGaWxlVHlwZSBnZXRNYXRjaGluZ0ZpbGVUeXBlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlYTUxDYXRhbG9nRmlsZVR5cGUgdGhlRmlsZVR5cGUgPSAoWE1MQ2F0YWxvZ0ZpbGVUeXBlKSBpLm5leHQoKTsKLQkJCWlmICh0aGVGaWxlVHlwZS5kZXNjcmlwdGlvbiAhPSBudWxsICYmIHRoZUZpbGVUeXBlLmRlc2NyaXB0aW9uLmVxdWFscyhkZXNjcmlwdGlvbikpIHsKLQkJCQlmaWxlVHlwZSA9IHRoZUZpbGVUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UGFnZShDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSkgewotCQlpZiAocGFnZUNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlzZWxlY3RlZFBhZ2UgPSBwYWdlOwotCQlwYWdlQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCXBhZ2VDb250YWluZXIuc2hvd1BhZ2Uoc2VsZWN0ZWRQYWdlLmdldENvbnRyb2woKSk7Ci0JCWZDYXRhbG9nRWxlbWVudCA9IHNlbGVjdGVkUGFnZS5nZXREYXRhKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKExhYmVsIGVycm9yTWVzc2FnZUxhYmVsKSB7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS0J1dHRvblN0YXRlKCkgewotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJyb3dzZUJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQkvLyBicm93c2VCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuCi0JCS8vIFVJX0JVVFRPTl9CUk9XU0UiKSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRJbWFnZShib3J3c2VJbWFnZSk7Ci0JCVJlY3RhbmdsZSByID0gYm9yd3NlSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWludCBJTUFHRV9XSURUSF9NQVJHSU4gPSA2OwotCQlpbnQgSU1BR0VfSEVJR0hUX01BUkdJTiA9IDY7Ci0JCWdkLmhlaWdodEhpbnQgPSByLmhlaWdodCArIElNQUdFX0hFSUdIVF9NQVJHSU47Ci0JCWdkLndpZHRoSGludCA9IHIud2lkdGggKyBJTUFHRV9XSURUSF9NQVJHSU47Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlyZXR1cm4gYnJvd3NlQnV0dG9uOwotCi0JfQotCi0JY2xhc3MgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwcml2YXRlIE1lbnUgbWVudSA9IG51bGw7Ci0JCXByaXZhdGUgQ29udHJvbCBjb250cm9sOwotCi0JCXB1YmxpYyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKENvbnRyb2wgYUNvbnRyb2wpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbnRyb2wgPSBhQ29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBDcmVhdGUgdGhlIG1lbnUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY3JlYXRlZAotCQkJaWYgKG1lbnUgPT0gbnVsbCkgewotCQkJCS8vIExhenkgY3JlYXRlIHRoZSBtZW51LgotCQkJCW1lbnUgPSBuZXcgTWVudShnZXRTaGVsbCgpKTsKLQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX01FTlVfQlJPV1NFX1dPUktTUEFDRSk7Ci0JCQkJLyoKLQkJCQkgKiBBZGQgYSBtZW51IHNlbGVjdGlvbiBsaXN0ZW5lciBzbyB0aGF0IHRoZSBtZW51IGlzIGhpZGRlbgotCQkJCSAqIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGRyb3AgZG93biBtZW51LgotCQkJCSAqLwotCQkJCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQlpbnZva2VXb3Jrc3BhY2VGaWxlU2VsZWN0aW9uRGlhbG9nKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCW1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCQltZW51SXRlbS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9CVVRUT05fTUVOVV9CUk9XU0VfRklMRV9TWVNURU0pOwotCQkJCS8qCi0JCQkJICogQWRkIGEgbWVudSBzZWxlY3Rpb24gbGlzdGVuZXIgc28gdGhhdCB0aGUgbWVudSBpcyBoaWRkZW4KLQkJCQkgKiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4KLQkJCQkgKi8KLQkJCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJc2V0TWVudVZpc2libGUoZmFsc2UpOwotCQkJCQkJaW52b2tlRmlsZVNlbGVjdGlvbkRpYWxvZygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCX0KLQotCQkJLy8gUG9zaXRpb24gdGhlIG1lbnUgYmVsb3cgYW5kIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIHRoZSB0aGUKLQkJCS8vIGRyb3AgZG93biB0b29sIGJ1dHRvbi4KLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0KLQkJCS8vIHNldCBsb2NhdGlvbgotCQkJUG9pbnQgcHRCcm93c2UgPSBidXR0b24uZ2V0TG9jYXRpb24oKTsKLQkJCVJlY3RhbmdsZSByY0Jyb3dzZSA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCXB0QnJvd3NlLnkgKz0gcmNCcm93c2UuaGVpZ2h0OwotCQkJcHRCcm93c2UgPSBidXR0b24uZ2V0UGFyZW50KCkudG9EaXNwbGF5KHB0QnJvd3NlKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocHRCcm93c2UueCwgcHRCcm93c2UueSk7Ci0KLQkJCXNldE1lbnVWaXNpYmxlKHRydWUpOwotCi0JCX0KLQotCQl2b2lkIHNldE1lbnVWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJbWVudS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJLy8gdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKLQkJfQotCi0JCXZvaWQgaW52b2tlV29ya3NwYWNlRmlsZVNlbGVjdGlvbkRpYWxvZygpIHsKLQkJCUZpbHRlcmFibGVTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWx0ZXJhYmxlU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCWRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0KLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCS8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoIGZyb20gdGhlIHZhbHVlIHRvIGF2b2lkIHRoZQotCQkJCS8vIHdob2xlIGxlYWRpbmcgc2xhc2ggYW1iaWd1aXR5IHByb2JsZW0KLQkJCQkvLyAgICAgICAgICAgICAgICAgICAgCi0JCQkJU3RyaW5nIHVyaSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJCXdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJCX0KLQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJKChUZXh0KSBjb250cm9sKS5zZXRUZXh0KHVyaSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQl2b2lkIGludm9rZUZpbGVTZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCksIFNXVC5TSU5HTEUpOwotCQkJU3RyaW5nIGZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0ICYmIGZpbGUgIT0gbnVsbCkgewotCQkJCSgoVGV4dCkgY29udHJvbCkuc2V0VGV4dChmaWxlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FbGVtZW50Tm9kZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvRWxlbWVudE5vZGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTg5MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FbGVtZW50Tm9kZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50Tm9kZVBhZ2UgewotCQotCUNvbnRyb2wgZkNvbnRyb2w7Ci0JCi0JcHVibGljIEVsZW1lbnROb2RlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJCi0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0JCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpewotCQlyZXR1cm4gZkNvbnRyb2w7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVEYXRhKCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9JbWFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0ODY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEltYWdlRmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUF9MRUZUID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX1JJR0hUID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX0xFRlQgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fUklHSFQgPSA0OyAgICAgCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXVtdIE9WRVJMQVlfQ09PUkRJTkFURSA9IHt7MCwwfSx7MCwyfSx7MiwwfSx7MiwyfX07Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIEltYWdlRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBJbWFnZUZhY3RvcnkoKTsKLQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGNvbXBvc2l0ZUltYWdlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgcHVibGljIEltYWdlRmFjdG9yeSgpCi0gIHsKLQkgIHN1cGVyKCk7Ci0gIH0KLSAgCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkKLQl7Ci0JICBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgIAotCSAgaWYgKGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKSAhPSBudWxsKQotCSAgewotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCSAgfQotCSAgZWxzZQotCSAgewotCQlpbWFnZVJlZ2lzdHJ5LnB1dChpY29uTmFtZSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKGdldENsYXNzKCksIGljb25OYW1lKSk7Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0JICB9Ci0JfQotCi0gIHB1YmxpYyBJbWFnZSBjcmVhdGVDb21wb3NpdGVJbWFnZShJbWFnZSBiYXNlLCBJbWFnZSBvdmVybGF5LCBpbnQgb3ZlcmxheVBvc2l0aW9uKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGtleSA9IGJhc2UgKyAiKiIgKyBvdmVybGF5ICsgIioiICsgb3ZlcmxheVBvc2l0aW9uOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBJbWFnZSByZXN1bHQgPSAoSW1hZ2UpY29tcG9zaXRlSW1hZ2VUYWJsZS5nZXQoa2V5KTsKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXlzW11bXSA9IG5ldyBJbWFnZURlc2NyaXB0b3JbM11bM107IAotICAgICAgaW50W10gY29vcmQgPSBPVkVSTEFZX0NPT1JESU5BVEVbb3ZlcmxheVBvc2l0aW9uXTsKLSAgICAgIG92ZXJsYXlzW2Nvb3JkWzFdXVtjb29yZFswXV0gPSBuZXcgSW1hZ2VCYXNlZEltYWdlRGVzY3JpcHRvcihvdmVybGF5KTsKLSAgICAgIE92ZXJsYXlJY29uIGljb24gPSBuZXcgT3ZlcmxheUljb24obmV3IEltYWdlQmFzZWRJbWFnZURlc2NyaXB0b3IoYmFzZSksIG92ZXJsYXlzLCBuZXcgUG9pbnQoMTYsIDE2KSk7Ci0gICAgICByZXN1bHQgPSBpY29uLmNyZWF0ZUltYWdlKCk7Ci0gICAgICBjb21wb3NpdGVJbWFnZVRhYmxlLnB1dChrZXksIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotCi0KLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yV3JhcHBlcihJbWFnZSBpbWFnZSkKLSAgewotICAgIHJldHVybiBuZXcgSW1hZ2VCYXNlZEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4KLSAgICovCi0gICBjbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLSAgICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDIyOwotCi0gICAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7Ci0KLSAgICAgIHByaXZhdGUgUG9pbnQgZlNpemUgPSBudWxsOwotCi0gICAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmQmFzZTsKLQotICAgICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlzW11bXTsKLQotICAgICAgcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLAotICAgICAgICAgICAgICBQb2ludCBzaXplKSB7Ci0gICAgICAgICAgZkJhc2UgPSBiYXNlOwotICAgICAgICAgIGZPdmVybGF5cyA9IG92ZXJsYXlzOwotICAgICAgICAgIGZTaXplID0gc2l6ZTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLSAgICAgICAgICBpZiAob3ZlcmxheXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0gICAgICAgICAgaW50IHggPSAwOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIEltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotICAgICAgICAgICAgICAgICAgZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICB4ICs9IGlkLndpZHRoOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLSAgICAgICAgICBpZiAob3ZlcmxheXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0gICAgICAgICAgaW50IHggPSBnZXRTaXplKCkueDsKLSAgICAgICAgICBmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgICAgICAgICAgICB4IC09IGlkLndpZHRoOwotICAgICAgICAgICAgICAgICAgZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQotICAgICAgICovCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgSW1hZ2VEYXRhIGJnOwotICAgICAgICAgIGlmIChmQmFzZSA9PSBudWxsIHx8IChiZyA9IGZCYXNlLmdldEltYWdlRGF0YSgpKSA9PSBudWxsKQotICAgICAgICAgICAgICBiZyA9IERFRkFVTFRfSU1BR0VfREFUQTsKLSAgICAgICAgICBkcmF3SW1hZ2UoYmcsIDAsIDApOwotCi0gICAgICAgICAgaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgIGRyYXdUb3BSaWdodChmT3ZlcmxheXNbMF0pOwotCi0gICAgICAgICAgICAgIGlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkKLSAgICAgICAgICAgICAgICAgIGRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOwotCi0gICAgICAgICAgICAgIGlmIChmT3ZlcmxheXMubGVuZ3RoID4gMikKLSAgICAgICAgICAgICAgICAgIGRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7Ci0KLSAgICAgICAgICAgICAgaWYgKGZPdmVybGF5cy5sZW5ndGggPiAzKQotICAgICAgICAgICAgICAgICAgZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCB2b2lkIGRyYXdUb3BMZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0gICAgICAgICAgaWYgKG92ZXJsYXlzID09IG51bGwpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotICAgICAgICAgIGludCB4ID0gMDsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgICAgICAgICAgIGRyYXdJbWFnZShpZCwgeCwgMCk7Ci0gICAgICAgICAgICAgICAgICB4ICs9IGlkLndpZHRoOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLSAgICAgICAgICBpZiAob3ZlcmxheXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0gICAgICAgICAgaW50IHggPSBnZXRTaXplKCkueDsKLSAgICAgICAgICBmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgICAgICAgICAgICB4IC09IGlkLndpZHRoOwotICAgICAgICAgICAgICAgICAgZHJhd0ltYWdlKGlkLCB4LCAwKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLSAgICAgICAqLwotICAgICAgcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0gICAgICAgICAgcmV0dXJuIGZTaXplOwotICAgICAgfQotICB9Ci0KLSAgIHN0YXRpYyBjbGFzcyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2U7Ci0KLSAgICBwdWJsaWMgSW1hZ2VCYXNlZEltYWdlRGVzY3JpcHRvcihJbWFnZSBpbWFnZSkKLSAgICB7Ci0gICAgICB0aGlzLmltYWdlID0gaW1hZ2U7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpCi0gICAgewotICAgICAgcmV0dXJuIGltYWdlLmdldEltYWdlRGF0YSgpOwotICAgIH0KLSAgfSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJpZXNWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyaWVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTcwNmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJpZXNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nRW50cmllc1ZpZXcgZXh0ZW5kcyBDb21wb3NpdGUKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBuZXdCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0gIHByb3RlY3RlZCBYTUxDYXRhbG9nVHJlZVZpZXdlciB0YWJsZVZpZXdlcjsKLSAgcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLSAgcHJvdGVjdGVkIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0gIC8vcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWdlRW5hYmxlZCA9IHRydWU7Ci0KLSAgcHVibGljIFhNTENhdGFsb2dFbnRyaWVzVmlldyhDb21wb3NpdGUgcGFyZW50LCBJQ2F0YWxvZyB3b3JraW5nVXNlckNhdGFsb2csIElDYXRhbG9nIHN5c3RlbUNhdGFsb2cpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB0aGlzLndvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLSAgICB0aGlzLnN5c3RlbUNhdGFsb2cgPSBzeXN0ZW1DYXRhbG9nOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICB0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIHRhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIodGhpcyk7Ci0gICAgdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIHRhYmxlVmlld2VyLnNldElucHV0KCJkdW1teSIpOyAvLyROT04tTkxTLTEkCi0gICAgdGFibGVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLSAgICB0YWJsZVZpZXdlci5yZXZlYWwoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpOwotCi0gICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRlV2lkZ2V0RW5hYmxlZFN0YXRlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICB0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgY3JlYXRlQnV0dG9ucyh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxlYWRpbmdTbGFzaChTdHJpbmcgdXJpKQotICB7Ci0gICAgLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgdmFsdWUgdG8gYXZvaWQgdGhlIHdob2xlIGxlYWRpbmcgc2xhc2ggYW1iaWd1aXR5IHByb2JsZW0KLSAgICAvLyAgICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgewotICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBTdHJpbmcgaGVhZGluZ3NbXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgaGVhZGluZ3NbMF0gPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfS0VZOwotICAgIGhlYWRpbmdzWzFdID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VSSTsKLQotICAgIFhNTENhdGFsb2dUcmVlVmlld2VyIHRoZVRhYmxlVmlld2VyID0gbmV3IFhNTENhdGFsb2dUcmVlVmlld2VyKHBhcmVudCwgd29ya2luZ1VzZXJDYXRhbG9nLCBzeXN0ZW1DYXRhbG9nKTsKLSAgICByZXR1cm4gdGhlVGFibGVWaWV3ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA3OwotICAgIGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0KLSAgICBCdXR0b24gaGlkZGVuQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBoaWRkZW5CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgaGlkZGVuQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotICAgIGhpZGRlbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgIFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLndpZGdldCA9PSBuZXdCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICBwZXJmb3JtTmV3KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikKLSAgICAgICAgewotICAgICAgICAgIHBlcmZvcm1FZGl0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybURlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIC8vIGFkZCB0aGUgIk5ldy4uLiIgYnV0dG9uCi0gICAgLy8KLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0gICAgbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBuZXdCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX05FVyk7Ci0gICAgLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAobmV3QnV0dG9uLCBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX01BUFBJTkdfTkVXKTsKLSAgICBuZXdCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotICAgIC8vIGFkZCB0aGUgIkVkaXQuLi4iIGJ1dHRvbgotICAgIC8vCi0gICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBlZGl0QnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9FRElUKTsKLSAgICAvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChlZGl0QnV0dG9uLCBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX01BUFBJTkdfRURJVCk7Ci0gICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBlZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotICAgIC8vIGFkZCB0aGUgIkRlbGV0ZSIgYnV0dG9uCi0gICAgLy8KLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZGVsZXRlQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9ERUxFVEUpOwotICAgIC8vV29ya2JlbmNoSGVscC5zZXRIZWxwKGRlbGV0ZUJ1dHRvbiwgWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9NQVBQSU5HX0RFTEVURSk7Ci0gICAgZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotICAgIGRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICAvLyBhIGNydWRkeSBoYWNrIHNvIHRoYXQgdGhlIFByZWZlcmVuY2VEaWFsb2cgZG9lc24ndCBjbG9zZSBldmVyeSB0aW1lIHdlIHByZXNzICdlbnRlcicKLSAgICAvLwotICAgIGdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihoaWRkZW5CdXR0b24pOwotICAgIHVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ly9YTUxDYXRhbG9nVHJlZVZpZXdlci5VU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdENhdGFsb2dFbnRyeURpYWxvZyBpbnZva2VEaWFsb2coU3RyaW5nIHRpdGxlLCBJQ2F0YWxvZ0VsZW1lbnQgZW50cnkpCi0gIHsKLSAgICBTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQlFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nKHNoZWxsLCBlbnRyeSk7Ci0gICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIHJldHVybiBkaWFsb2c7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIElDYXRhbG9nIGNhdGFsb2cpCi0gIHsKLSAgICBTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQlFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nKHNoZWxsLCBjYXRhbG9nKTsKLSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgcmV0dXJuIGRpYWxvZzsKLSAgfQotICAKLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtTmV3KCkKLSAgewotCi0JLy9JQ2F0YWxvZ0VudHJ5IG5ld0VudHJ5ID0gKElDYXRhbG9nRW50cnkpd29ya2luZ1VzZXJDYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLSAgICBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGRpYWxvZyA9IGludm9rZURpYWxvZyhYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfTkVXX0RJQUxPR19USVRMRSwgd29ya2luZ1VzZXJDYXRhbG9nKTsKLSAgICBJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGRpYWxvZy5nZXRDYXRhbG9nRWxlbWVudCgpOwotCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykKLSAgICB7Ci0gICAgICB3b3JraW5nVXNlckNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoZWxlbWVudCk7Ci0gICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCksIHRydWUpOwotCSAgdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1FZGl0KCkKLSAgewotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCi0gICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbGVtZW50KQotICAgIHsKLQkJSUNhdGFsb2dFbGVtZW50IG9sZEVudHJ5ID0gKElDYXRhbG9nRWxlbWVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCUlDYXRhbG9nRWxlbWVudCBuZXdFbnRyeSA9IChJQ2F0YWxvZ0VsZW1lbnQpKChDYXRhbG9nRWxlbWVudClvbGRFbnRyeSkuY2xvbmUoKTsKLQotICAgICAgRWRpdENhdGFsb2dFbnRyeURpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VESVRfRElBTE9HX1RJVExFLCBuZXdFbnRyeSk7Ci0gICAgICBpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIC8vIGRlbGV0ZSB0aGUgb2xkIHZhbHVlIGlmIHRoZSAnbWFwRnJvbScgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8KLSAgICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLnJlbW92ZUNhdGFsb2dFbGVtZW50KG9sZEVudHJ5KTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIG5ldyBtYXBwaW5nCi0gICAgICAgIC8vCi0gICAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChuZXdFbnRyeSk7Ci0gICAgICAgIHRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdFbnRyeSkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKQotICB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0KLSAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VsZW1lbnQpCi0gICAgewotCSAgSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50ID0gKElDYXRhbG9nRWxlbWVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICB3b3JraW5nVXNlckNhdGFsb2cucmVtb3ZlQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpCi0gIHsKLQkgIGJvb2xlYW4gaXNFZGl0YWJsZSA9IGZhbHNlOwotCSAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkgIE9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkgIAotCSAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbGVtZW50KQotCSAgewotCQkgIElDYXRhbG9nRWxlbWVudFtdIGVsZW1lbnRzID0gKChDYXRhbG9nKXdvcmtpbmdVc2VyQ2F0YWxvZykuZ2V0Q2F0YWxvZ0VsZW1lbnRzKCk7Ci0JCSAgLy9kdyBMaXN0IGVudHJpZXNMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5sZW5ndGgpOwotCQkgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCSAgewotCQkJICBJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJICBpc0VkaXRhYmxlID0gc2VsZWN0ZWRPYmplY3QuZXF1YWxzKGVsZW1lbnQpOwotCQkJICBpZihpc0VkaXRhYmxlKSBicmVhazsgIAotCQkgIH0KLQkgIH0KLQkgIAotCSAgLy9pZiAoaXNQYWdlRW5hYmxlZCkKLQkgIHsKLQkJICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0JCSAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0JICB9Ci0gIH0KLQotLyoKLSAgcHVibGljIHZvaWQgc2V0UGFnZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICB7Ci0gICAgaXNQYWdlRW5hYmxlZCA9IGVuYWJsZWQ7Ci0KLSAgICB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLQotICAgIG5ld0J1dHRvbi5zZXRFbmFibGVkKGlzUGFnZUVuYWJsZWQpOwotICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLSAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLSAgfQotKi8KLSAgcHVibGljIHZvaWQgdXBkYXRlUGFnZSgpCi0gIHsKLSAgICByZWZyZXNoKCk7Ci0gICAgdXBkYXRlV2lkZ2V0RW5hYmxlZFN0YXRlKCk7Ci0gIH0KLQotICBwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpCi0gIHsKLSAgICByZXR1cm4gdGFibGVWaWV3ZXI7Ci0gIH0KLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2N2IxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldwoteyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFRleHQgZGV0YWlsc1RleHQ7Ci0gIHByb3RlY3RlZCBTY3JvbGxCYXIgdmVydGljYWxTY3JvbGwsIGhvcml6b250YWxTY3JvbGw7Ci0KLSAgcHVibGljIFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgQ29sb3IgY29sb3IgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOyAKLSAgICAgICAgICAgICAgICAKLQlkZXRhaWxzVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CQotCWRhdGEuaGVpZ2h0SGludCA9IDY1OwotCWRldGFpbHNUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICB2ZXJ0aWNhbFNjcm9sbCA9IGRldGFpbHNUZXh0LmdldFZlcnRpY2FsQmFyKCk7Ci0gICAgLy92ZXJ0aWNhbFNjcm9sbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICBob3Jpem9udGFsU2Nyb2xsID0gZGV0YWlsc1RleHQuZ2V0SG9yaXpvbnRhbEJhcigpOwotICAgIGRldGFpbHNUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBkZXRhaWxzVGV4dC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENhdGFsb2dFbGVtZW50KElDYXRhbG9nRW50cnkgZW50cnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyB2YWx1ZSA9IGdldERpc3BsYXlWYWx1ZShlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0VVJJKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgbGluZTEgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19VUklfQ09MT04gKyAiXHRcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHZhbHVlID0gZW50cnkgIT0gbnVsbCA/IGdldEtleVR5cGVWYWx1ZShlbnRyeSkgOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBsaW5lMiA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVRBSUxTX0NPTE9OICsgIlx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0KLSAgICB2YWx1ZSA9IGdldERpc3BsYXlWYWx1ZShlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0S2V5KCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgbGluZTMgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19LRVlfQ09MT04gKyAiXHRcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCi0gICAgU3RyaW5nIGVudGlyZVN0cmluZyA9ICJcbiIgKyBsaW5lMSArICJcbiIgKyBsaW5lMiArICJcbiIgKyBsaW5lMzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICBkZXRhaWxzVGV4dC5zZXRUZXh0KGVudGlyZVN0cmluZyk7Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VsZW1lbnQoSU5leHRDYXRhbG9nIG5leHRDYXRhbG9nKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgdmFsdWUgPSBnZXREaXNwbGF5VmFsdWUobmV4dENhdGFsb2cgIT0gbnVsbCA/IG5leHRDYXRhbG9nLmdldENhdGFsb2dMb2NhdGlvbigpIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIGxpbmUxID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OICsgIlx0XHQiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBTdHJpbmcgZW50aXJlU3RyaW5nID0gIlxuIiArIGxpbmUxOyAvLyROT04tTkxTLTEkCi0gICAgZGV0YWlsc1RleHQuc2V0VGV4dChlbnRpcmVTdHJpbmcpOwotICB9ICAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgfSAgICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5VHlwZVZhbHVlKElDYXRhbG9nRW50cnkgZW50cnkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsgCi0gICAgaWYgKGVudHJ5LmdldFVSSSgpICE9IG51bGwgJiYgZW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoInhzZCIpKSAgICAgLy8kTk9OLU5MUy0xJAotICAgIHsgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSAoZW50cnkuZ2V0RW50cnlUeXBlKCkgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSkgPyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQyA6Ci0gICAgICAgICAgICAgICBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTTsKLSAgICB9IAotICAgIGVsc2UKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKSB7Ci0JCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM6Ci0JCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU06Ci0JCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU07Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJlc3VsdCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRmlsZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0ZpbGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2FkZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRmlsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dGaWxlVHlwZSAKLXsKLSAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgcHVibGljIExpc3QgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHVibGljIFN0cmluZyBpY29uRmlsZU5hbWU7Ci0gIHB1YmxpYyBJbWFnZSBpY29uOyAKLSAgICAKLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9ucyhTdHJpbmcgY29udHJpYnV0ZWRFeHRlbnNpb25zKQotICB7Ci0JTGlzdCBsaXN0ID0gcGFyc2VFeHRlbnNpb25zKGNvbnRyaWJ1dGVkRXh0ZW5zaW9ucyk7Ci0JZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCXsKLQkgIFN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKWkubmV4dCgpOwotCSAgaWYgKCFleHRlbnNpb25zLmNvbnRhaW5zKGV4dGVuc2lvbikpCi0JICB7Ci0JCWV4dGVuc2lvbnMuYWRkKGV4dGVuc2lvbik7Ci0JICB9Ci0JfQotICB9ICAKLSAgCi0gIHByb3RlY3RlZCBMaXN0IHBhcnNlRXh0ZW5zaW9ucyhTdHJpbmcgc3RyaW5nKQotICB7Ci0JTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsICIsICIpOyBzdC5oYXNNb3JlVG9rZW5zKCk7ICkgLy8kTk9OLU5MUy0xJAotCXsKLQkgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCSAgaWYgKHRva2VuICE9IG51bGwpCi0JICB7ICAgICAgICAgIAkKLQkJbGlzdC5hZGQodG9rZW4pOyAKLQkgIH0gICAgICAgIAkgIAkgCi0JfSAgCi0JcmV0dXJuIGxpc3Q7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmZjE5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBFZGl0b3IKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1Jlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dJWkFSRF9TQ0hFTUFfQU5EX05BTUVfU1BBQ0VfSU5GTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9OQU1FX1NQQUNFX1BSRUZJWDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9OQU1FX1NQQUNFX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9YU0RfTE9DQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRE9DVFlQRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TWVNURU1fSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUFVCTElDX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFTEVDVF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0tFWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9LRVlfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfREVUQUlMU19LRVlfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1VSSV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DQVRBTE9HX1VSSV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERVRBSUxTX1VSSV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVRBSUxTX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9QVUJMSUM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfUFVCTElDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NQRUNJRllfQUxURVJOQVRJVkVfV0VCX1VSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19JTlZBTElEX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19JTlZBTElEX0ZJTEVfTE9ORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX05PX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19FTEVNRU5UX0RURF9MT05HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfTk9fRUxFTUVOVF9YU0RfTE9ORzsKLQotCi0JLy9OZXdNb2RlbFdpemFyZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0lOVkFMSURfR1JBTU1BUl9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fQlJPV1NFOwotCi0JLy9YTUxDYXRhbG9nSWRNYXBwaW5nUGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX01BUF9UTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9NQVBfRlJPTSA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX05FVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fRURJVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX05FV19ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRURJVF9ESUFMT0dfVElUTEU7Ci0KLQotCS8vIFhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1VTRVJfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVNfVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0NIQU5HRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TRUxFQ1RfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TUEVDSUZZX1BST0pFQ1RfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19QUk9KRUNUU19DUkVBVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEIDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX1BST0pFQ1RfRE9FU19OT1RfRVhJU1QgOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1BST0pFQ1RfVE9fVVNFIDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DQVRBTE9HX1NBVkVfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQURWQU5DRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQURWQU5DRURfWE1MX0NBVEFMT0dfUFJFRlM7ICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1BFQ0lGWV9QRVJTSVNURU5DRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NBVkVfQ0FUQUxPR19ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU0FWRV9DQVRBTE9HX0RJQUxPR19ERVNDOyAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0JST1dTRV9DQVRBTE9HX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9ERVNDOyAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVNFUl9TUEVDSUZJRURfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVM7Ci0KLQkvLyBBZHZhbmNlZE9wdGlvbnNEaWFsb2cKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fSU1QT1JUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9FWFBPUlQ7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9JTVBPUlRfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9JTVBPUlRfRElBTE9HX01FU1NBR0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FWFBPUlRfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FWFBPUlRfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfU0FWSU5HX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRklMRV9JU19SRUFEX09OTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRElBTE9HX0RFU0NSSVBUSU9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdENhdGFsb2dFbnRyeURpYWxvZ19jYXRhbG9nRW50cnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX25leHRDYXRhbG9nTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX01FTlVfQlJPV1NFX1dPUktTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fTUVOVV9CUk9XU0VfRklMRV9TWVNURU07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0w7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfVEVYVF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTDsKLQkKLQkKLQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTENhdGFsb2dNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgWE1MQ2F0YWxvZ01lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjk0N2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotICAgICAgICBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIElDYXRhbG9nTGlzdGVuZXIKLXsKLQotICAgIHByb3RlY3RlZCBYTUxDYXRhbG9nRW50cmllc1ZpZXcgY2F0YWxvZ0VudHJpZXNWaWV3OwotCi0gICAgcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQotICAgIHByb3RlY3RlZCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nOwotCi0gICAgcHJvdGVjdGVkIElDYXRhbG9nIHVzZXJDYXRhbG9nOwotCi0gICAgcHJvdGVjdGVkIElDYXRhbG9nIGRlZmF1bHRDYXRhbG9nOwotCi0gICAgcHJvdGVjdGVkIEJ1dHRvbiBhZHZhbmNlZEJ1dHRvbjsKLQotICAgIHB1YmxpYyBYTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UoKQotICAgIHsKLSAgICAgICAgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotICAgICAgICBJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotICAgICAgICAgICAgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRAotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lECi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlckNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2ggdGhlIHZpZXcgaW4gcmVzcG9uY2UgdG8gYW4gZXZlbnQgc2VudCBieSB0aGUgQ2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKElDYXRhbG9nRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICBjYXRhbG9nRW50cmllc1ZpZXcudXBkYXRlUGFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICAgIC8vIHdlIGNyZWF0ZSBhIHdvcmtpbmcgY29weSBvZiB0aGUgJ1VzZXIgU2V0dGluZ3MnIGZvciB0aGUgQ2F0YWxvZwotICAgICAgICAvLyB0aGF0IHdlIGNhbiBtb2RpZnkKLSAgICAgICAgQ2F0YWxvZ1NldCB0ZW1wQ2F0YWxvZ1NldCA9IG5ldyBDYXRhbG9nU2V0KCk7IAotICAgICAgICB3b3JraW5nVXNlckNhdGFsb2cgPSB0ZW1wQ2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coIndvcmtpbmciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogYWRkIGVudHJpZXMgZnJvbSB0aGUgbmVzdGVkIGNhdGFsb2dzIGFzIHdlbGwKLSAgICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyh1c2VyQ2F0YWxvZyk7Ci0gICAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIC8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsIG5ldwotICAgICAgICAvLyBDb250cm9sQ29udGV4dENvbXB1dGVyKGNvbXBvc2l0ZSwKLSAgICAgICAgLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9DQVRBTE9HX1BBR0UpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBjcmVhdGVDYXRhbG9nRW50cmllc1ZpZXcoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlQ2F0YWxvZ0RldGFpbHNWaWV3KGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZUFkdmFuY2VkQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIC8vIGNhdGFsb2dFbnRyaWVzVmlldy51cGRhdGVQYWdlKCk7Ci0gICAgICAgIGFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBZHZhbmNlZEJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlKQotICAgIHsKLSAgICAgICAgQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgcGFuZWwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgLy8gVE9ETy4uLiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZXhwYW5kIHRoZSBwYWdlIHdpZHRoPwotICAgICAgICAvLyBUaGlzIGludmlzaWJsZSBsYWJlbCBpcyBjcmVhdGVkIHRvIGZvcmNlIHRoZSB3aWR0aCBvZiB0aGUgcGFnZSB0byBiZQotICAgICAgICAvLyB3aWRlIGVub3VnaCB0byBzaG93Ci0gICAgICAgIC8vIHRoZSByYXRoZXIgbG9uZyB1cmkgYW5kIGtleSBmaWVsZHMgb2YgYSBjYXRhbG9nIGVudHJ5LgotICAgICAgICBMYWJlbCB3aWR0aEZ1ZGdlciA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotICAgICAgICBTdHJpbmcgd2lkdGhGdWRnZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU1OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdpZHRoRnVkZ2VyU3RyaW5nICs9ICJ4IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHdpZHRoRnVkZ2VyLnNldFRleHQod2lkdGhGdWRnZXJTdHJpbmcpOwotICAgICAgICB3aWR0aEZ1ZGdlci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgQ29tcG9zaXRlIHBsYWNlSG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYW5lbCwgU1dULk5PTkUpOwotICAgICAgICBwbGFjZUhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgYWR2YW5jZWRCdXR0b24gPSBuZXcgQnV0dG9uKHBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0FEVkFOQ0VEKTsKLSAgICAgICAgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWR2YW5jZWRPcHRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBBZHZhbmNlZE9wdGlvbnNEaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLCB3b3JraW5nVXNlckNhdGFsb2cpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaGVsbCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0FEVkFOQ0VEX1hNTF9DQVRBTE9HX1BSRUZTKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYWR2YW5jZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZUZpbGVOYW1lKFN0cmluZyBhLCBTdHJpbmcgYikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGEuZXF1YWxzKGIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0YWxvZ0VudHJpZXNWaWV3KENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgZ3JvdXAuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTKTsKLSAgICAgICAgZ3JvdXAuc2V0VG9vbFRpcFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VTRVJfRU5UUklFU19UT09MX1RJUCk7Ci0gICAgICAgIC8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh1c2VyRW50cmllc0dyb3VwLCBuZXcKLSAgICAgICAgLy8gQ29udHJvbENvbnRleHRDb21wdXRlcih1c2VyRW50cmllc0dyb3VwLAotICAgICAgICAvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0NBVEFMT0dfVVNFUl9HUk9VUCkpOwotICAgICAgICBjYXRhbG9nRW50cmllc1ZpZXcgPSBuZXcgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3KGdyb3VwLAotICAgICAgICAgICAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZyk7Ci0gICAgICAgIGNhdGFsb2dFbnRyaWVzVmlldy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICAgIEdyb3VwIGRldGFpbHNHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGV0YWlsc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBkZXRhaWxzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBkZXRhaWxzR3JvdXAuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMUyk7Ci0gICAgICAgIGZpbmFsIFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3IGRldGFpbHNWaWV3ID0gbmV3IFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3KAotICAgICAgICAgICAgICAgIGRldGFpbHNHcm91cCk7Ci0gICAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotICAgICAgICAgICAgICAgICAgICBkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudChlbnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSU5leHRDYXRhbG9nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAJSU5leHRDYXRhbG9nIGVudHJ5ID0gKElOZXh0Q2F0YWxvZykgc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbHNWaWV3LnNldENhdGFsb2dFbGVtZW50KGVudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgCWRldGFpbHNWaWV3LnNldENhdGFsb2dFbGVtZW50KChJQ2F0YWxvZ0VudHJ5KSBudWxsKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBjYXRhbG9nRW50cmllc1ZpZXcuZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gICAgewotICAgICAgICByZXR1cm4gc3RvcmVWYWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdG9yZVZhbHVlcygpCi0gICAgewotICAgICAgIC8vZHcgIE9iamVjdCBmaWxlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdXNlckNhdGFsb2cgc28gdGhhdCBpdHMgdGhlIHNhbWUgYXMgdGhlIHdvcmtpbmcKLSAgICAgICAgICAgIC8vIGNhdGFsb2cKLSAgICAgICAgICAgIHVzZXJDYXRhbG9nLmNsZWFyKCk7Ci0gICAgICAgICAgICAvLyBUT0RPIGFkZCBlbnRyaWVzIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncz8KLSAgICAgICAgICAgIHVzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyh3b3JraW5nVXNlckNhdGFsb2cpOwotICAgICAgICAgICAgLy8gbm93IHNhdmUgdGhlIHVzZXJDYXRhbG9nCi0gICAgICAgICAgICB1c2VyQ2F0YWxvZy5zYXZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlN2FjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1VSV9XSVpBUkRfU0NIRU1BX0FORF9OQU1FX1NQQUNFX0lORk8gPSBTY2hlbWEgYW5kIE5hbWVzcGFjZSBJbmZvcm1hdGlvbgotVUlfTEFCRUxfTkFNRV9TUEFDRV9QUkVGSVggICAgICAgICAgID0gTmFtZXNwYWNlIHByZWZpeDoKLVVJX0xBQkVMX05BTUVfU1BBQ0VfVVJJICAgICAgICAgICAgICA9IE5hbWVzcGFjZSBVUkk6Ci1VSV9MQUJFTF9YU0RfTE9DQVRJT04gICAgICAgICAgICAgICAgPSBTY2hlbWEgbG9jYXRpb246Ci1VSV9MQUJFTF9ET0NUWVBFX0lORk9STUFUSU9OICAgICAgICAgPSBEb2N1bWVudCB0eXBlIGluZm9ybWF0aW9uCi1VSV9MQUJFTF9TWVNURU1fSUQgICAgICAgICAgICAgICAgICAgPSAmU3lzdGVtIElEOgotVUlfTEFCRUxfUFVCTElDX0lEICAgICAgICAgICAgICAgICAgID0gJlB1YmxpYyBJRDoKLVVJX0xBQkVMX1NFTEVDVF9GSUxFICAgICAgICAgICAgICAgICA9IFNlbGVjdCBGaWxlCi1VSV9MQUJFTF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgPSBLZXkKLVVJX0xBQkVMX0tFWV9DT0xPTiAgICAgICAgICAgICAgICAgICA9ICZLZXk6Ci1VSV9MQUJFTF9ERVRBSUxTX0tFWV9DT0xPTiAgICAgICAgICAgPSBLZXk6Ci1VSV9MQUJFTF9VUkkgICAgICAgICAgICAgICAgICAgICAgICAgPSBVUkkKLVVJX0xBQkVMX1VSSV9DT0xPTiAgICAgICAgICAgICAgICAgICA9ICZVUkk6ICAKLVVJX0xBQkVMX0NBVEFMT0dfVVJJX0NPTE9OCQkgICAgICA9IFVSSSBvZiBhbm90aGVyIFhNTCBDYXRhbG9nIGZpbGU6Ci1VSV9MQUJFTF9ERVRBSUxTX1VSSV9DT0xPTiAgICAgICAgICAgPSBVUkk6ICAgCi1VSV9LRVlfVFlQRV9DT0xPTiAgICAgICAgICAgICAgICAgICAgPSBLZXkgJlR5cGU6Ci1VSV9LRVlfVFlQRV9ERVRBSUxTX0NPTE9OICAgICAgICAgICAgPSBLZXkgVHlwZToKLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9QVUJMSUMgICA9IE5hbWVzcGFjZSBOYW1lCi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNICAgPSBTY2hlbWEgTG9jYXRpb24KLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMgICA9IFB1YmxpYyBJRAotVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTSAgID0gU3lzdGVtIElECi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkgICAJCSAgPSBVUkkKLVVJX0xBQkVMX1NQRUNJRllfQUxURVJOQVRJVkVfV0VCX1VSTCA9IFNwZWNpZnkgJmFsdGVybmF0aXZlIHdlYiBhZGRyZXNzCi1VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFMgICAgPSBVUkkgbXVzdCBub3QgaW5jbHVkZWQgJy4nIG9yICcuLicKLQotVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICAgICAgID0gVGhlIHNwZWNpZmllZCByZXNvdXJjZSBjYW4ndCBiZSBsb2NhdGVkIDoKLVVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9MT05HICAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBjYW5ub3QgYmUgZm91bmQuIEl0IG1heSBoYXZlIGJlZW4gbW92ZWQgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uIElmIHRoZSBmaWxlIGlzIGxvY2F0ZWQgcmVtb3RlbHksIGEgbmV0d29yayBjb25uZWN0aW9uIGNhbm5vdCBiZSBlc3RhYmxpc2hlZCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLiAKLVVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFICAgICAgICAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBpcyBpbnZhbGlkLgotVUlfV0FSTklOR19JTlZBTElEX0ZJTEVfTE9ORyAgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIGlzIGludmFsaWQuIEEgcHJvcGVyIFhNTCBmaWxlIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZnJvbSBpdC4gT3BlbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgZWRpdCBpdCBhcyBuZWNlc3NhcnksIHZhbGlkYXRlIGl0IGFuZCB0cnkgYWdhaW4uCi1VSV9XQVJOSU5HX05PX0VMRU1FTlQgICAgICAgICAgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50IGRlY2xhcmF0aW9uLgotVUlfV0FSTklOR19OT19FTEVNRU5UX0RURF9MT05HICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSByb290IGVsZW1lbnQgaW4gdGhlIGdlbmVyYXRlZCBYTUwgZmlsZS4KLVVJX1dBUk5JTkdfTk9fRUxFTUVOVF9YU0RfTE9ORyAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgZ2VuZXJhdGVkIFhNTCBmaWxlLgotCi0KLSFOZXdNb2RlbFdpemFyZAotVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SICAgICAgICAgICAgID0gSW52YWxpZCBHcmFtbWFyCi1VSV9CVVRUT05fQlJPV1NFICAgICAgICAgICAgICAgICAgICAgPSAmQnJvd3NlLi4uCi0KLSFYTUxDYXRhbG9nSWRNYXBwaW5nUGFnZQotVUlfTEFCRUxfTUFQX1RPICAgICAgICAgICAgICAgICAgICAgID0gTWFwIHRvOgotVUlfTEFCRUxfTUFQX0ZST00gICAgICAgICAgICAgICAgICAgID0gTWFwIGZyb206Ci1VSV9CVVRUT05fTkVXICAgICAgICAgICAgICAgICAgICAgICAgPSAmQWRkLi4uCi1VSV9CVVRUT05fRURJVCAgICAgICAgICAgICAgICAgICAgICAgPSAmRWRpdC4uLgotVUlfQlVUVE9OX0RFTEVURSAgICAgICAgICAgICAgICAgICAgID0gJkRlbGV0ZQotVUlfTEFCRUxfTkVXX0RJQUxPR19USVRMRSAgICAgICAgICAgID0gQWRkIFhNTCBDYXRhbG9nIEVudHJ5Ci1VSV9MQUJFTF9FRElUX0RJQUxPR19USVRMRSAgICAgICAgICAgPSBFZGl0IFhNTCBDYXRhbG9nIEVudHJ5Ci0KLQotIVhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZQotVUlfTEFCRUxfVVNFUl9FTlRSSUVTICAgICAgICAgICAgICAgID0gWE1MIENhdGFsb2cgRW50cmllcwotVUlfTEFCRUxfVVNFUl9FTlRSSUVTX1RPT0xfVElQICAgICAgID0gWE1MIENhdGFsb2cgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLVVJX0xBQkVMX1NZU1RFTV9FTlRSSUVTICAgICAgICAgICAgICA9IFBsdWctaW4gc3BlY2lmaWVkIGVudHJpZXMKLVVJX0xBQkVMX1NZU1RFTV9FTlRSSUVTX1RPT0xfVElQICAgICA9IFhNTCBDYXRhbG9nIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGJ5IGEgcGx1Zy1pbgotVUlfQlVUVE9OX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgID0gQ2hhbmdlLi4uCi1VSV9MQUJFTF9TRUxFQ1RfUFJPSkVDVCAgICAgICAgICAgICAgPSBTZWxlY3QgUHJvamVjdAotVUlfTEFCRUxfU1BFQ0lGWV9QUk9KRUNUX0RFU0NSSVBUSU9OID0gU3BlY2lmeSB0aGUgcHJvamVjdCB0byBwZXJzaXN0IHRoZSBYTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbgotVUlfV0FSTklOR19OT19QUk9KRUNUU19DUkVBVEVEICAgICAgID0gTm8gcHJvamVjdHMgaGF2ZSBiZWVuIGNyZWF0ZWQgeWV0LgotVUlfV0FSTklOR19QUk9KRUNUX05PVF9TUEVDSUZJRUQgICAgID0gQSBwcm9qZWN0IG5hbWUgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4KLVVJX1dBUk5JTkdfUFJPSkVDVF9ET0VTX05PVF9FWElTVCAgICA9IFRoZSBzcGVjaWZpZWQgcHJvamVjdCBkb2VzIG5vdCBleGlzdC4KLVVJX0xBQkVMX1BST0pFQ1RfVE9fVVNFICAgICAgICAgICAgICA9IFByb2plY3QgdG8gdXNlIHRvIHBlcnNpc3QgWE1MIENhdGFsb2cgVXNlciBFbnRyaWVzOiAKLVVJX0xBQkVMX0NBVEFMT0dfU0FWRV9FUlJPUiAgICAgICAgICA9IFhNTCBDYXRhbG9nIFNhdmUgRXJyb3IKLVVJX0xBQkVMX0NBVEFMT0dfQ09VTERfTk9UX0JFX1NBVkVEICA9IFRoZSBYTUwgQ2F0YWxvZyBlbnRyeSBjb3VsZCBub3QgYmUgc2F2ZWQuCi1VSV9MQUJFTF9BRFZBTkNFRCAgICAgICAgICAgICAgICAgICAgPSAmQWR2YW5jZWQuLi4KLVVJX0xBQkVMX0FEVkFOQ0VEX1hNTF9DQVRBTE9HX1BSRUZTICA9IEFkdmFuY2VkIFhNTCBDYXRhbG9nIFByZWZlcmVuY2VzICAgCi1VSV9MQUJFTF9TUEVDSUZZX1BFUlNJU1RFTkNFX0ZJTEUgICAgPSAmU3BlY2lmeSBhIGZpbGUgdG8gdXNlIHRvIHBlcnNpc3QgdGhlIFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uLgotVUlfTEFCRUxfU0FWRV9DQVRBTE9HX0RJQUxPR19USVRMRSAgID0gU2F2ZSBDaGFuZ2VzCi1VSV9MQUJFTF9TQVZFX0NBVEFMT0dfRElBTE9HX0RFU0MgICAgPSBZb3UgaGF2ZSBtYWRlIHVuc2F2ZWQgY2hhbmdlcyB0byB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyIGNoYW5nZXMgYmVmb3JlIGxvYWRpbmcgdGhlIG5ldyBYTUwgQ2F0YWxvZyBzZXR0aW5ncz8gICAKLVVJX0xBQkVMX0JST1dTRV9DQVRBTE9HX0ZJTEVfVElUTEUgICA9IFNlbGVjdCBGb2xkZXIKLVVJX0xBQkVMX0JST1dTRV9DQVRBTE9HX0ZJTEVfREVTQyAgICA9IFNlbGVjdCB0aGUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlICcueG1sY2F0YWxvZycgZmlsZS4gICAKLVVJX0xBQkVMX0RFVEFJTFMgICAgICAgICAgICAgICAgICAgICA9IERldGFpbHMKLVVJX0xBQkVMX1VTRVJfU1BFQ0lGSUVEX0VOVFJJRVMgICAgICA9IFVzZXIgU3BlY2lmaWVkIEVudHJpZXMKLVVJX0xBQkVMX1BMVUdJTl9TUEVDSUZJRURfRU5UUklFUyAgICA9IFBsdWdpbiBTcGVjaWZpZWQgRW50cmllcwotCi0hQWR2YW5jZWRPcHRpb25zRGlhbG9nCi1VSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT04gICAgICAgICAgPSBVc2UgdGhlIGJ1dHRvbnMgYmVsb3cgdG8gaW1wb3J0IG9yIGV4cG9ydCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4KLVVJX0JVVFRPTl9JTVBPUlQgICAgICAgICAgICAgICAgICAgICA9IEltcG9ydC4uLgotVUlfQlVUVE9OX0VYUE9SVCAgICAgICAgICAgICAgICAgICAgID0gRXhwb3J0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19USVRMRSAgICAgICAgID0gSW1wb3J0IFhNTCBDYXRhbG9nIFNldHRpbmdzCi1VSV9MQUJFTF9JTVBPUlRfRElBTE9HX0hFQURJTkcgICAgICAgPSBTcGVjaWZ5IFhNTCBDYXRhbG9nIEZpbGUKLVVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRSAgICAgICA9IFNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIHVzZWQgdG8gbG9hZCB0aGUgWE1MIENhdGFsb2cgU2V0dGluZ3MKLQotVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19USVRMRSAgICAgICAgID0gRXhwb3J0IFhNTCBDYXRhbG9nIFNldHRpbmdzCi1VSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkcgICAgICAgPSBTcGVjaWZ5IFhNTCBDYXRhbG9nIEZpbGUKLVVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfTUVTU0FHRSAgICAgICA9IFNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIHVzZWQgdG8gc2F2ZSB0aGUgWE1MIENhdGFsb2cgU2V0dGluZwotRVJST1JfU0FWSU5HX0ZJTEUJCQkJCSA9IEVycm9yIHNhdmluZyBmaWxlICUxCi1VSV9MQUJFTF9GSUxFX0lTX1JFQURfT05MWSAgICAgICAgICAgPSBGaWxlICUxIGlzIHJlYWQgb25seQotCi1FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsPUNhdGFsb2cgRW50cnkKLUVkaXRDYXRhbG9nRW50cnlEaWFsb2dfbmV4dENhdGFsb2dMYWJlbD1OZXh0IENhdGFsb2cKLVVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0U9V29ya3NwYWNlLi4uCi1VSV9CVVRUT05fTUVOVV9CUk9XU0VfRklMRV9TWVNURU09RmlsZSBTeXN0ZW0uLi4KLVVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MPUZpbGVzIG9mIHR5cGU6Ci1VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MPUFsbCBTdXBwb3J0ZWQgRmlsZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyMGMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB4bWxDYXRhbG9nSW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBlcnJvckltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vdnIxNi9lcnJvci1vdmVybGF5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBlbnRyeUltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi9lbnRyeV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIG5leHRDYXRhbG9nSW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgRVJST1JfU1RBVEVfS0VZID0gImVycm9yc3RhdGVrZXkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZldvcmtpbmdVc2VyQ2F0YWxvZzsKLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZlN5c3RlbUNhdGFsb2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX1NQRUNJRklFRF9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTOwotCi0JcHVibGljIFhNTENhdGFsb2dUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZywgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5mV29ya2luZ1VzZXJDYXRhbG9nID0gd29ya2luZ1VzZXJDYXRhbG9nOwotCQl0aGlzLmZTeXN0ZW1DYXRhbG9nID0gc3lzdGVtQ2F0YWxvZzsKLQotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlcigpKTsKLQkJc2V0TGFiZWxQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5TGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJcmVzZXRGaWx0ZXJzKCk7Ci0JCWFkZEZpbHRlcihuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKGV4dGVuc2lvbnMpKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgSGFzaE1hcCBpbWFnZVRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQlyZXN1bHQgPSBjYXRhbG9nRW50cnkuZ2V0S2V5KCk7Ci0JCQkJLy8gcmVzdWx0ID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChyZXN1bHQpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5leHRDYXRhbG9nKSB7Ci0JCQkJSU5leHRDYXRhbG9nIG5leHRDYXRhbG9nID0gKElOZXh0Q2F0YWxvZykgb2JqZWN0OwotCQkJCXJlc3VsdCA9IG5leHRDYXRhbG9nLmdldENhdGFsb2dMb2NhdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogb2JqZWN0LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCUltYWdlIGJhc2UgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXJlc3VsdCA9IHhtbENhdGFsb2dJbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQlJRWRpdG9yUmVnaXN0cnkgZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGVyLmdldEltYWdlRGVzY3JpcHRvcih1cmkpOwotCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZVRhYmxlLmdldChpbWFnZURlc2NyaXB0b3IpOwotCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQkJCWltYWdlVGFibGUucHV0KGltYWdlRGVzY3JpcHRvciwgaW1hZ2UpOwotCQkJCX0KLQkJCQliYXNlID0gaW1hZ2U7Ci0KLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIHRydWUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBiYXNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0ID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZUltYWdlKGJhc2UsIGVycm9ySW1hZ2UsIEltYWdlRmFjdG9yeS5CT1RUT01fTEVGVCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQkvLyBUT0RPOiBhZGQgaW1hZ2UgdG8gdGhlIGltYWdlVGFibGUgYW5kIGFkZCBlcnJvciBvdmVybGF5IGlmCi0JCQkJLy8gbmV4dCBjYXRhbG9nIFVSSSBpcyBub3QgcmVhZGFibGUKLQkJCQlyZXN1bHQgPSBuZXh0Q2F0YWxvZ0ltYWdlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbWFnZVRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQl7Ci0JCQkJKChJbWFnZSlpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIE9iamVjdFtdIHJvb3RzOwotCi0JCXB1YmxpYyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlyb290cyA9IG5ldyBPYmplY3RbMl07Ci0JCQlyb290c1swXSA9IFVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUOwotCQkJcm9vdHNbMV0gPSBQTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSb290KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcgfHwgb2JqZWN0IGluc3RhbmNlb2YgSU5leHRDYXRhbG9nOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gcm9vdHM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQlpZiAocGFyZW50RWxlbWVudCA9PSByb290c1swXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZXb3JraW5nVXNlckNhdGFsb2cpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCA9PSByb290c1sxXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZTeXN0ZW1DYXRhbG9nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQlJQ2F0YWxvZyBuZXh0Q2F0YWxvZyA9ICgoSU5leHRDYXRhbG9nKSBwYXJlbnRFbGVtZW50KS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKG5leHRDYXRhbG9nKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0Q2hpbGRyZW5IZWxwZXIoSUNhdGFsb2cgY2F0YWxvZykgewotCQkJLy8gVE9ETyBhZGQgZW50cmllcyBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3MKLQotCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQlpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7Ci0JCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCQlpZiAobzEgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5ICYmIG8yIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCQkJCUlDYXRhbG9nRW50cnkgZW50cnkxID0gKElDYXRhbG9nRW50cnkpIG8xOwotCQkJCQkJCUlDYXRhbG9nRW50cnkgZW50cnkyID0gKElDYXRhbG9nRW50cnkpIG8yOwotCQkJCQkJCXJlc3VsdCA9IENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShlbnRyeTEuZ2V0S2V5KCksIGVudHJ5Mi5nZXRLZXkoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlBcnJheXMuc29ydChlbnRyaWVzLCBjb21wYXJhdG9yKTsKLQkJCX0KLQkJCVZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoZW50cmllcykpOwotCQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCUxpc3QgbmV4dENhdGFsb2dzTGlzdCA9IEFycmF5cy5hc0xpc3QobmV4dENhdGFsb2dzKTsKLQkJCXJlc3VsdC5hZGRBbGwobmV4dENhdGFsb2dzTGlzdCk7Ci0KLQkJCXJldHVybiAgcmVzdWx0LnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSA/IG51bGwgOiBVU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gaXNSb290KGVsZW1lbnQpID8gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCA6IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZGlzcG9zZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLQkJCS8vIElTU1VFOiBzZWVtcyB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGhlcmUKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0KLQljbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQotCQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMxKSB7Ci0JCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIGVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QgKSB8fAotCQkJCQllbGVtZW50LmVxdWFscyhYTUxDYXRhbG9nVHJlZVZpZXdlci5VU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCkgKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MUXVpY2tTY2FuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTFF1aWNrU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzA5NzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MUXVpY2tTY2FuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgcmVzdWx0ID0gWE1MUXVpY2tTY2FuLmdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYShpbnB1dFN0cmVhbSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoSW5wdXRTdHJlYW0gaW5wdXQpCi0gIHsKLSAgICBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyKCk7Ci0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxRdWlja1NjYW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCSAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JICBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSwgaGFuZGxlcik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlci50YXJnZXROYW1lc3BhY2VVUkk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJOwotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoInNjaGVtYSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIGludCBuQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJpYnV0ZXM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShpKS5lcXVhbHMoInRhcmdldE5hbWVzcGFjZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlVVJJID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gdG9kbyB0aGVyZSdzIGEgbmljZSB3YXkgdG8gZG8gdGhpcyBJJ20gc3VyZSAgICAKLSAgICAgIC8vIGhlcmUgSSBpbnRlbnRpYWxseSBjYXVzZSBhbiBleGNlcHRpb24uLi4gCi0gICAgICBTdHJpbmcgeCA9IG51bGw7Ci0gICAgICB4Lmxlbmd0aCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL2NhdGFsb2dFbnRyeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1YjI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvbmV4dENhdGFsb2cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTkzNGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2VudHJ5X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2VudHJ5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGZmMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9lbnRyeV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX2V4cGFuZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmOWJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTE2MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YmZlNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9uZXh0Q2F0YWxvZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi94bWxjYXRhbG9nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxNDQxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL292cjE2L2Vycm9yLW92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9ET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9ET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NGQ5YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIQUNLID0gImhhY2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSgpIHsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVBdHRyaWJ1dGVQcm9wZXJ0eURlc2NyaXB0b3IoQXR0ciBhdHRyKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IG1xLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCQlpZiAoYWQgIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHZhbHVlc0FycmF5ID0gbXEuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhhdHRyLmdldE93bmVyRWxlbWVudCgpLCBhZCk7Ci0JCQkJaWYgKHZhbHVlc0FycmF5ICE9IG51bGwgJiYgdmFsdWVzQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lLCB2YWx1ZXNBcnJheSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlQ0RBVEFTZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKENEQVRBU2VjdGlvbiBjZGF0YVNlY3Rpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlQ29tbWVudFByb3BlcnR5RGVzY3JpcHRvcihDb21tZW50IGNvbW1lbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRG9jdW1lbnRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHsKLQkJcmV0dXJuIG51bGw7IC8vIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0ssIEhBQ0spOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUVudGl0eVJlZmVyZW5jZVByb3BlcnR5RGVzY3JpcHRvcihFbnRpdHlSZWZlcmVuY2UgZW50aXR5UmVmZXJlbmNlKSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUF0dHJpYnV0ZVByb3BlcnR5RGVzY3JpcHRvcigoQXR0cikgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVDREFUQVNlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoKENEQVRBU2VjdGlvbikgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVDb21tZW50UHJvcGVydHlEZXNjcmlwdG9yKChDb21tZW50KSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZURvY3VtZW50VHlwZVByb3BlcnR5RGVzY3JpcHRvcigoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoKEVsZW1lbnQpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlRW50aXR5UmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKChFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcigoVGV4dCkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoVGV4dCB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Njk0MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXNpZ25WaWV3ZXIgewotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKTsKLQotCVN0cmluZyBnZXRUaXRsZSgpOwotCi0Jdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpOwotCQotCUlTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTQ1ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JcHVibGljIHZvaWQgaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhJQWN0aW9uQmFycyBiYXJzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwZTFlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0KLXB1YmxpYyBjbGFzcyBTb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSUV4dGVuZGVkQ29udHJpYnV0b3IgewotCi0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIFhNTE11bHRpUGFnZUVkaXRvclBhcnQgbXVsdGlQYWdlRWRpdG9yID0gbnVsbDsKLQotCS8vIEVkaXRvckV4dGVuc2lvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUV4dGVuZGVkQ29udHJpYnV0b3IgZXh0ZW5kZWRDb250cmlidXRvcjsKLQotCXB1YmxpYyBTb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciA9IG5ldyBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IoKTsKLQotCQkvLyBSZWFkIGFjdGlvbiBleHRlbnNpb25zLgotCQlFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIoKTsKLQkJZXh0ZW5kZWRDb250cmlidXRvciA9IGJ1aWxkZXIucmVhZEFjdGlvbkV4dGVuc2lvbnMoRURJVE9SX0lEKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuaW5pdChhY3Rpb25CYXJzKTsKLQotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQlpbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoYWN0aW9uQmFycyk7Ci0JCQlpbml0U291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IoYWN0aW9uQmFycyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmluaXQoYWN0aW9uQmFycywgZ2V0UGFnZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmluaXQoYWN0aW9uQmFycywgZ2V0UGFnZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5kaXNwb3NlKCk7Ci0KLQkJaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0KLQkJYWRkVG9NZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciNjb250cmlidXRlVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCi0JCWFkZFRvUG9wdXBNZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlhZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWFkZFRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSUV4dGVuZGVkQ29udHJpYnV0b3IjdXBkYXRlVG9vbGJhckFjdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCkgewotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci51cGRhdGVUb29sYmFyQWN0aW9ucygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJLy8gc2F2ZSBtdWx0aVBhZ2VFZGl0b3IgYmVmb3JlIGNhbGxpbmcKLQkJLy8gc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcikKLQkJLy8gc3VwZXIuc2V0QWN0aXZlRWRpdG9yIHdpbGwgY2FsbCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0Ci0JCS8vIGFjdGl2ZUVkaXRvcikKLQkJLy8gbXVsdGlQYWdlRWRpdG9yIGlzIG5lZWRlZCBpbiBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0Ci0JCS8vIGFjdGl2ZUVkaXRvcikKLQkJaWYgKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvclBhcnQpCi0JCQltdWx0aVBhZ2VFZGl0b3IgPSAoWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgdGFyZ2V0RWRpdG9yOwotCi0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJLy8gVGhpcyBjb250cmlidXRvciBpcyBkZXNpZ25lZCBmb3IgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0LgotCQkvLyBUbyBzYWZlLWd1YXJkIHRoaXMgZnJvbSBwcm9ibGVtcyBjYXVzZWQgYnkgdW5leHBlY3RlZCB1c2FnZSBieQotCQkvLyBvdGhlciBlZGl0b3JzLCB0aGUgZm9sbG93aW5nCi0JCS8vIGNoZWNrIGlzIGFkZGVkLgotCQlpZiAobXVsdGlQYWdlRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCAmJiBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLQkJCQlhY3RpdmF0ZVNvdXJjZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJCWVsc2UKLQkJCQlhY3RpdmF0ZURlc2lnblBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJfQotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIG1lbnUgYmFyIGFuZCB0b29sIGJhcgotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZURlc2lnblBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsICYmIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0KLQkJCS8vIG51bGwsIHNvIHBhc3MgaW4gbXVsdGlQYWdlRWRpdG9yIGluc3RlYWQgKGQyODI0MTQpCi0JCQlpZiAoYWN0aXZlRWRpdG9yID09IG51bGwpIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQl9Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVTb3VyY2VQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjgzYzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JYTUw7Ci0KLQotLyoqCi0gKiBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IKLSAqIAotICogVGhpcyBjbGFzcyBpcyBmb3IgbXVsdGkgcGFnZSBlZGl0b3IncyBzb3VyY2UgcGFnZSBjb250cmlidXRvci4KLSAqIAotICogVXNlIFhNTEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvclhNTCB7Ci0KLQlwcml2YXRlIElBY3Rpb25CYXJzIGZCYXJzOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FsbHM6Ci0JICogPHVsPgotCSAqIDxsaT48Y29kZT5jb250cmlidXRlVG9NZW51PC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyBtZW51Ci0JICogbWFuYWdlcjwvbGk+Ci0JICogPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb1Rvb2xCYXI8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIHRvb2wKLQkgKiBiYXIgbWFuYWdlcjwvbGk+Ci0JICogPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nCi0JICogc3RhdHVzIGxpbmUgbWFuYWdlcjwvbGk+Ci0JICogPC91bD4KLQkgKiBUaGUgZ2l2ZW4gYWN0aW9uIGJhcnMgYXJlIGFsc28gcmVtZW1iZXJlZCBhbmQgbWFkZSBhY2Nlc3NpYmxlIHZpYQotCSAqIDxjb2RlPmdldEFjdGlvbkJhcnM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBiYXJzCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIGJhcnMKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzKSB7Ci0JCWZCYXJzID0gYmFyczsKLQkJY29udHJpYnV0ZVRvTWVudShiYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9Ub29sQmFyKGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JCWNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgY29udHJpYnV0b3IncyBhY3Rpb24gYmFycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gYmFycwotCSAqLwotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gZkJhcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9UcmVlQ29udGVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY1N2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgd29yayBvZiB0YWtpbmcgYSBET00gdHJlZSBhbmQgY29udmVydGluZyBpdCB0byBhCi0gKiBkaXNwbGF5YWJsZSAnVUknIHRyZWUuCi0gKiAKLSAqIEZvciBleGFtcGxlIDogLSB3aGl0ZSBzcGFjZSB0ZXh0IG5vZGVzIGFyZSBvbW1pdGVkIGZyb20gdGhlICdVSScgdHJlZSAtCi0gKiBhZGphY2VudCBUZXh0IGFuZCBFbnRpdHlSZWZlcmVuY2Ugbm9kZXMgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgJ1VJJwotICogbm9kZSAtIEVsZW1lbnRzIHdpdGggJ3RleHQgb25seScgY2hpbGRyZW4gYXJlIGRpcGxheWVkIHdpdGhvdXQgY2hpbGRyZW4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFRyZWVDb250ZW50SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJREVfV0hJVEVfU1BBQ0VfVEVYVF9OT0RFUyA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NQklORV9BREpBQ0VOVF9URVhUX0FORF9FTlRJVFlfUkVGRVJFTkNFUyA9IDE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTID0gMzI7Ci0KLQlwcm90ZWN0ZWQgaW50IHN0eWxlID0gSElERV9XSElURV9TUEFDRV9URVhUX05PREVTIHwgQ09NQklORV9BREpBQ0VOVF9URVhUX0FORF9FTlRJVFlfUkVGRVJFTkNFUyB8IEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1N0eWxlRmxhZyhpbnQgZmxhZykgewotCQlyZXR1cm4gKHN0eWxlICYgZmxhZykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWJvb2xlYW4gdGV4dENvbnRlbnRPbmx5ID0gdHJ1ZTsKLQotCQkJTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKG1hcC5pdGVtKGkpKTsKLQkJCQkJdGV4dENvbnRlbnRPbmx5ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlOb2RlIHByZXZJbmNsdWRlZE5vZGUgPSBudWxsOwotCQkJZm9yIChOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZE5vZGUgIT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpbnQgY2hpbGROb2RlVHlwZSA9IGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpOwotCQkJCWJvb2xlYW4gaW5jbHVkZU5vZGUgPSB0cnVlOwotCi0JCQkJaWYgKGluY2x1ZGVOb2RlICYmIGhhc1N0eWxlRmxhZyhISURFX1dISVRFX1NQQUNFX1RFWFRfTk9ERVMpKSB7Ci0JCQkJCWlmIChpc0lnbm9yYWJsZVRleHQoY2hpbGROb2RlKSkgewotCQkJCQkJLy8gZmlsdGVyIG91dCB0aGUgaWdub3JhYmxlIHRleHQgbm9kZQotCQkJCQkJaW5jbHVkZU5vZGUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmNsdWRlTm9kZSAmJiBoYXNTdHlsZUZsYWcoQ09NQklORV9BREpBQ0VOVF9URVhUX0FORF9FTlRJVFlfUkVGRVJFTkNFUykpIHsKLQkJCQkJaWYgKGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShjaGlsZE5vZGUpICYmIHByZXZJbmNsdWRlZE5vZGUgIT0gbnVsbCAmJiBpc1RleHRPckVudGl0eVJlZmVyZW5jZU5vZGUocHJldkluY2x1ZGVkTm9kZSkpIHsKLQkJCQkJCS8vIHdlIG9ubHkgc2hvdyB0aGUgZmlyc3Qgb2YgYSBsaXN0IG9mIGFkamFjZW50IHRleHQKLQkJCQkJCS8vIG9yIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBpbiB0aGUgdHJlZQotCQkJCQkJLy8gc28gd2UgZmlsdGVyIG91dCB0aGlzIHN1YnNlcXVlbnQgb25lCi0JCQkJCQlpbmNsdWRlTm9kZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGhhc1N0eWxlRmxhZyhISURFX0VMRU1FTlRfQ0hJTERfVEVYVF9OT0RFUykpIHsKLQkJCQkJaWYgKGNoaWxkTm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGROb2RlVHlwZSAhPSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCQkJdGV4dENvbnRlbnRPbmx5ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaW5jbHVkZU5vZGUpIHsKLQkJCQkJbGlzdC5hZGQoY2hpbGROb2RlKTsKLQkJCQkJcHJldkluY2x1ZGVkTm9kZSA9IGNoaWxkTm9kZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChoYXNTdHlsZUZsYWcoSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVMpICYmIHRleHRDb250ZW50T25seSkgewotCQkJCXJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlVGV4dChOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJU3RyaW5nIGRhdGEgPSAoKFRleHQpIG5vZGUpLmdldERhdGEoKTsKLQkJCXJlc3VsdCA9IChkYXRhID09IG51bGwgfHwgZGF0YS50cmltKCkubGVuZ3RoKCkgPT0gMCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21iaW5lZFRleHROb2RlKE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlOb2RlIG5leHROb2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKG5leHROb2RlICE9IG51bGwpIHsKLQkJCQlpZiAobmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29tYmluZWRUZXh0Tm9kZUxpc3QoTm9kZSB0aGVOb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJYm9vbGVhbiBwcmV2SXNFbnRpdHkgPSBmYWxzZTsKLQkJZm9yIChOb2RlIG5vZGUgPSB0aGVOb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCXByZXZJc0VudGl0eSA9IHRydWU7Ci0JCQkJbGlzdC5hZGQobm9kZSk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFICYmIChwcmV2SXNFbnRpdHkgfHwgbm9kZSA9PSB0aGVOb2RlKSkgewotCQkJCXByZXZJc0VudGl0eSA9IGZhbHNlOwotCQkJCWxpc3QuYWRkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0VmFsdWUoRWxlbWVudCBlbGVtZW50KSAKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBfZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotICAgICAgcmV0dXJuIGxpc3QgIT0gbnVsbCA/IGdldFZhbHVlRm9yVGV4dENvbnRlbnQobGlzdCkgOiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50VGV4dFZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIHNldEVsZW1lbnROb2RlVmFsdWUoZWxlbWVudCwgdmFsdWUpOyAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3QgX2dldEVsZW1lbnRUZXh0Q29udGVudChFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgfHwgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFkZChub2RlKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQkvKioKLQkgKiBJZiB0aGUgZWxlbWVudCBpcyBoYXMgJ3RleHQgb25seScgY29udGVudCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUKLQkgKiBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgY29tcG9zZSB0aGUgdGV4dCBvbmx5IGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbGVtZW50VGV4dENvbnRlbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZXMoKSkgewotCQkJcmVzdWx0ID0gX2dldEVsZW1lbnRUZXh0Q29udGVudChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotICAgIAotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZShOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCXJlc3VsdCA9ICgoQXR0cikgbm9kZSkuZ2V0VmFsdWUoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCXJlc3VsdCA9ICgoQ2hhcmFjdGVyRGF0YSkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSBnZXREb2N1bWVudFR5cGVWYWx1ZSgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gZ2V0RWxlbWVudE5vZGVWYWx1ZSgoRWxlbWVudCkgbm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSBnZXRUZXh0Tm9kZVZhbHVlKG5vZGUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSAoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyB2YWx1ZSkgewotCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCXRyeSB7Ci0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQkoKEF0dHIpIG5vZGUpLnNldFZhbHVlKHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCS8vIGRyb3AgdGhydQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCSgoQ2hhcmFjdGVyRGF0YSkgbm9kZSkuc2V0RGF0YSh2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQlzZXRFbGVtZW50Tm9kZVZhbHVlKChFbGVtZW50KSBub2RlLCB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlzZXRUZXh0Tm9kZVZhbHVlKG5vZGUsIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCSgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKS5zZXREYXRhKHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChET01FeGNlcHRpb24gZSkgewotCQkJRGlzcGxheSBkID0gZ2V0RGlzcGxheSgpOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkLmJlZXAoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50VHlwZVZhbHVlKERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHsKLQkJcmV0dXJuIERPTVdyaXRlci5nZXREb2N1bWVudFR5cGVEYXRhKGRvY3VtZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5vZGVWYWx1ZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IGdldEVsZW1lbnRUZXh0Q29udGVudChlbGVtZW50KTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50Tm9kZVZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZhbHVlKSB7Ci0JCUxpc3QgbGlzdCA9IGdldEVsZW1lbnRUZXh0Q29udGVudChlbGVtZW50KTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJc2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0LCB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJVGV4dCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwotCQkJZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHROb2RlVmFsdWUoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAoaXNDb21iaW5lZFRleHROb2RlKG5vZGUpKSB7Ci0JCQlsaXN0ID0gZ2V0Q29tYmluZWRUZXh0Tm9kZUxpc3Qobm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJbGlzdC5hZGQobm9kZSk7Ci0JCX0KLQkJcmVzdWx0ID0gZ2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dE5vZGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyB2YWx1ZSkgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAoaXNDb21iaW5lZFRleHROb2RlKG5vZGUpKSB7Ci0JCQlsaXN0ID0gZ2V0Q29tYmluZWRUZXh0Tm9kZUxpc3Qobm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJbGlzdC5hZGQobm9kZSk7Ci0JCX0KLQkJc2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFRleHQgZ2V0RWZmZWN0aXZlVGV4dE5vZGVGb3JDb21iaW5lZE5vZGVMaXN0KExpc3QgbGlzdCkgewotCQlUZXh0IHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKFRleHQpIG5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUZvclRleHRDb250ZW50KExpc3QgbGlzdCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJSURPTU5vZGUgZmlyc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KDApOwotCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgbGlzdC5nZXQobGlzdC5zaXplKCkgLSAxKTsKLQkJCUlET01Nb2RlbCBtb2RlbCA9IGZpcnN0LmdldE1vZGVsKCk7Ci0JCQlpbnQgc3RhcnQgPSBmaXJzdC5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldChzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCS8vIHdlIHRyaW0gdGhlIGNvbnRlbnQgc28gdGhhdCBpdCBsb29rcyBuaWNlIHdoZW4gdmlld2VkCi0JCS8vIHdlIG5lZWQgdG8gYmUgY2FyZnVsbCB0byBwcmVzZXJ2ZSB0aGUgJ3RyaW1tZWQnIHRleHQgd2hlbiB0aGUgdmFsdWUKLQkJLy8gaXMgc2V0IChzZWUgc2V0VmFsdWVGb3JUZXh0Q29udGVudCkKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQudHJpbSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlRm9yVGV4dENvbnRlbnQoTGlzdCBsaXN0LCBTdHJpbmcgdmFsdWUpIHsKLQkJLy9TdHJpbmcgb2xkVmFsdWUgPSBnZXRWYWx1ZUZvclRleHRDb250ZW50KCk7Ci0JCS8vIHdlIHdvcnJ5IGFib3V0IHByZXNlcnZpbmcgdHJpbW1lZCB0ZXh0Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUlET01Ob2RlIGZpcnN0ID0gKElET01Ob2RlKSBsaXN0LmdldCgwKTsKLQkJCUlET01Ob2RlIGxhc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCQlpbnQgc3RhcnQgPSBmaXJzdC5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlmaXJzdC5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIHN0YXJ0LCBlbmQgLSBzdGFydCwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoTm9kZSBub2RlKSB7Ci0JCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gZ2V0RWxlbWVudFRleHRDb250ZW50KChFbGVtZW50KSBub2RlKSAhPSBudWxsIHx8IG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID09IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTAzZDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgVHJlZUV4dGVuc2lvbiBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIFRyZWUgZlRyZWU7Ci0JcHJvdGVjdGVkIEVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyOwotCXByb3RlY3RlZCBTdHJpbmdbXSBmQ29sdW1uUHJvcGVydGllczsKLQlwcm90ZWN0ZWQgSUNlbGxNb2RpZmllciBjZWxsTW9kaWZpZXI7Ci0JcHJvdGVjdGVkIGludCBjb2x1bW5Qb3NpdGlvbiA9IDMwMDsKLQlwcm90ZWN0ZWQgaW50IGNvbHVtbkhpdFdpZHRoID0gNTsKLQlwcm90ZWN0ZWQgQ29sb3IgdGFibGVMaW5lQ29sb3I7Ci0JcHJvdGVjdGVkIGludCBjb250cm9sV2lkdGg7Ci0JcHJvdGVjdGVkIERlbGF5ZWREcmF3VGltZXIgZGVsYXllZERyYXdUaW1lcjsKLQlwcml2YXRlIGJvb2xlYW4gZmlzVW5zdXBwb3J0ZWRJbnB1dCA9IGZhbHNlOwotCi0JcHVibGljIFRyZWVFeHRlbnNpb24oVHJlZSB0cmVlKSB7Ci0JCXRoaXMuZlRyZWUgPSB0cmVlOwotCQlJbnRlcm5hbE1vdXNlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb3VzZUxpc3RlbmVyKCk7Ci0JCXRyZWUuYWRkTW91c2VNb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0cmVlLmFkZE1vdXNlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0cmVlLmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0JCWVkaXRNYW5hZ2VyID0gbmV3IEVkaXRNYW5hZ2VyKHRyZWUpOwotCQlkZWxheWVkRHJhd1RpbWVyID0gbmV3IERlbGF5ZWREcmF3VGltZXIodHJlZSk7Ci0KLQkJdGFibGVMaW5lQ29sb3IgPSB0cmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGFibGVMaW5lQ29sb3IuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxNb2RpZmllcihJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyKSB7Ci0JCWNlbGxNb2RpZmllciA9IG1vZGlmaWVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0Q2FjaGVkRGF0YSgpIHsKLQkJLy8gdG9kbzogc3VyZSBzZWVtcyB3ZSBzaG91bGQgcmVzZXQgc29tZXRoaW5nPwotCX0KLQotCXB1YmxpYyBJQ2VsbE1vZGlmaWVyIGdldENlbGxNb2RpZmllcigpIHsKLQkJcmV0dXJuIGNlbGxNb2RpZmllcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRJdGVtTGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCQlnZXRJdGVtTGlzdEhlbHBlcihmVHJlZS5nZXRJdGVtcygpLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2V0SXRlbUxpc3RIZWxwZXIoVHJlZUl0ZW1bXSBpdGVtcywgTGlzdCBsaXN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWxpc3QuYWRkKGl0ZW0pOwotCQkJZ2V0SXRlbUxpc3RIZWxwZXIoaXRlbS5nZXRJdGVtcygpLCBsaXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBUcmVlSXRlbSBnZXRUcmVlSXRlbU9uUm93KGludCBweCwgaW50IHB5KSB7Ci0JCVRyZWVJdGVtIHJlc3VsdCA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IGdldEl0ZW1MaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBpLm5leHQoKTsKLQkJCVJlY3RhbmdsZSByID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJCWlmIChyICE9IG51bGwgJiYgcHggPj0gci54ICYmIHB5ID49IHIueSAmJiBweSA8PSByLnkgKyByLmhlaWdodCkgewotCQkJCXJlc3VsdCA9IGl0ZW07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxNb3VzZUxpc3RlbmVyIGV4dGVuZHMgTW91c2VBZGFwdGVyIGltcGxlbWVudHMgTW91c2VNb3ZlTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgaW50IGNvbHVtbkRyYWdnZWQgPSAtMTsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNEb3duID0gZmFsc2U7Ci0JCXByb3RlY3RlZCBpbnQgcHJldlggPSAtMTsKLQkJcHJvdGVjdGVkIEN1cnNvciBjdXJzb3IgPSBudWxsOwotCi0JCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCWlmIChlLnggPiBjb2x1bW5Qb3NpdGlvbiAtIGNvbHVtbkhpdFdpZHRoICYmIGUueCA8IGNvbHVtblBvc2l0aW9uICsgY29sdW1uSGl0V2lkdGgpIHsKLQkJCQlpZiAoY3Vyc29yID09IG51bGwpIHsKLQkJCQkJY3Vyc29yID0gbmV3IEN1cnNvcihmVHJlZS5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfU0laRVdFKTsKLQkJCQkJZlRyZWUuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0JCQkJCWZUcmVlLnNldEN1cnNvcihudWxsKTsKLQkJCQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJCQkJY3Vyc29yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjb2x1bW5EcmFnZ2VkICE9IC0xKSB7Ci0JCQkJLy8gdXNpbmcgdGhlIGRlbGF5IHRpbWVyIHdpbGwgbWFrZSByZWRyYXdzIGxlc3MgZmxpY2tlcnkKLQkJCQlpZiAoZS54ID4gMjApIHsKLQkJCQkJY29sdW1uUG9zaXRpb24gPSBlLng7Ci0JCQkJCWRlbGF5ZWREcmF3VGltZXIucmVzZXQoMjApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCS8vIGhlcmUgd2UgaGFuZGxlIHRoZSBjb2x1bW4gcmVzaXppbmcgYnkgZGV0ZWN0IGlmIHRoZSB1c2VyIGhhcwotCQkJLy8gY2xpY2sgb24gYSBjb2x1bW4gc2VwYXJhdG9yCi0JCQkvLwotCQkJY29sdW1uRHJhZ2dlZCA9IC0xOwotCQkJZWRpdE1hbmFnZXIuZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotCQkJaWYgKGUueCA+IGNvbHVtblBvc2l0aW9uIC0gY29sdW1uSGl0V2lkdGggJiYgZS54IDwgY29sdW1uUG9zaXRpb24gKyBjb2x1bW5IaXRXaWR0aCkgewotCQkJCWNvbHVtbkRyYWdnZWQgPSAwOwotCQkJfQotCi0JCQkvLyBoZXJlIHdlIGhhbmRsZSBzZWxlY3RpbmcgdHJlZSBpdGVtcyB3aGVuIGFueSB0aGluZyBvbiB0aGUgJ3JvdycKLQkJCS8vIGlzIGNsaWNrZWQKLQkJCS8vCi0JCQlUcmVlSXRlbSBpdGVtID0gZlRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlpdGVtID0gZ2V0VHJlZUl0ZW1PblJvdyhlLngsIGUueSk7Ci0JCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtWzFdOwotCQkJCQlpdGVtc1swXSA9IGl0ZW07Ci0JCQkJCWZUcmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCWNvbHVtbkRyYWdnZWQgPSAtMTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZkNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuZkNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCVJlY3RhbmdsZSB0cmVlQm91bmRzID0gZlRyZWUuZ2V0Qm91bmRzKCk7Ci0KLQkJY29udHJvbFdpZHRoID0gdHJlZUJvdW5kcy53aWR0aDsKLQkJQ29sb3IgYmcgPSBmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbG9yIGJnMiA9IGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCi0JCWdjLnNldEJhY2tncm91bmQoYmcyKTsKLQotCQkvLyAvLyBUaGlzIG5leHQgcGFydCBjYXVzZXMgcHJvYmxlbXMgb24gTElOVVgsIHNvIGxldCdzIG5vdCBkbyBpdAotCQkvLyB0aGVyZQotCQkvLyBpZiAoQjJCSGFja3MuSVNfVU5JWCA9PSBmYWxzZSkgewotCQkvLyBUcmVlSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkvLyBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkvLyBUcmVlSXRlbSBpdGVtID0gc2VsZWN0ZWRJdGVtc1tpXTsKLQkJLy8gUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCS8vIGlmIChib3VuZHMgIT0gbnVsbCkgewotCQkvLyBnYy5maWxsUmVjdGFuZ2xlKGJvdW5kcy54ICsgYm91bmRzLndpZHRoLCBib3VuZHMueSwgY29udHJvbFdpZHRoLAotCQkvLyBib3VuZHMuaGVpZ2h0KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQlpZiAoIWZpc1Vuc3VwcG9ydGVkSW5wdXQpIHsKLQkJCVRyZWVJdGVtW10gaXRlbXMgPSBmVHJlZS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKHRhYmxlTGluZUNvbG9yKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJnKTsKLQotCQkJCWdjLmZpbGxSZWN0YW5nbGUoY29sdW1uUG9zaXRpb24sIHRyZWVCb3VuZHMueCwgdHJlZUJvdW5kcy53aWR0aCwgdHJlZUJvdW5kcy5oZWlnaHQpOwotCi0JCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtc1swXS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgaGVpZ2h0ID0gY29tcHV0ZVRyZWVJdGVtSGVpZ2h0KCk7Ci0KLQkJCQlpZiAoaXRlbUJvdW5kcyAhPSBudWxsKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEJvdW5kcyB3aWxsIGJlIGZvciB0aGUgZmlyc3QgaXRlbSwgd2hpY2ggd2lsbCBlaXRoZXIgYmUKLQkJCQkJICogdmlzaWJsZSBhdCB0aGUgdG9wIG9mIHRoZSBUcmVlLCBvciBzY3JvbGxlZCBvZmYgd2l0aAotCQkJCQkgKiBuZWdhdGl2ZSB2YWx1ZXMKLQkJCQkJICovCi0JCQkJCWludCBzdGFydFkgPSBpdGVtQm91bmRzLnk7Ci0KLQkJCQkJLyogT25seSBkcmF3IGxpbmVzIHdpdGhpbiB0aGUgVHJlZSBib3VuZGFyaWVzICovCi0JCQkJCWZvciAoaW50IGkgPSBzdGFydFk7IGkgPCB0cmVlQm91bmRzLmhlaWdodDsgaSArPSBoZWlnaHQpIHsKLQkJCQkJCWlmIChpID49IHRyZWVCb3VuZHMueSkgewotCQkJCQkJCWdjLmRyYXdMaW5lKDAsIGksIHRyZWVCb3VuZHMud2lkdGgsIGkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLmRyYXdMaW5lKGNvbHVtblBvc2l0aW9uLCAwLCBjb2x1bW5Qb3NpdGlvbiwgdHJlZUJvdW5kcy5oZWlnaHQpOwotCQkJCXBhaW50SXRlbXMoZ2MsIGl0ZW1zLCB0cmVlQm91bmRzKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkRW1wdHlUcmVlTWVzc2FnZShnYyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRVbmFibGVUb1BvcHVsYXRlVHJlZU1lc3NhZ2UoZ2MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb21wdXRlVHJlZUl0ZW1IZWlnaHQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQotCQkvKgotCQkgKiBPbiBHVEsgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgc2VlbXMgdG8gbGllIHRvIHVzLiBJdCByZXBvcnRzIHRoYXQgdGhlCi0JCSAqIHRyZWUgaXRlbSBvY2N1cGllcyBhIGZldyBwaXhsZXMgbGVzcyB2ZXJ0aWNhbCBzcGFjZSB0aGFuIGl0IHNob3VsZAotCQkgKiAocG9zc2libHkgYmVjYXVzZSBvZiB0aGUgaW1hZ2UgaGVpZ2h0IHZzLiB0aGUgdGV4dCBoZWlnaHQ/KS4gVGhpcwotCQkgKiBmb2lscyBvdXIgY29kZSB0aGF0IGRyYXdzIHRoZSAncm93JyBsaW5lcyBzaW5jZSB3ZSBhc3N1bWUgdGhhdAotCQkgKiBsaW5lcyBzaG91bGQgYmUgZHJhd24gYXQgJ2l0ZW1IZWlnaHQnIGluY3JlbWVudHMuIERvbid0IHRydXN0Ci0JCSAqIGdldEl0ZW1IZWlnaHQoKSB0byBjb21wdXRlIHRoZSBpbmNyZW1lbnQuLi4gaW5zdGVhZCBjb21wdXRlIHRoZQotCQkgKiB2YWx1ZSBiYXNlZCBvbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBUcmVlSXRlbXMsIGFuZCB0aGVuIHVzZSB0aGUKLQkJICogbGFyZ2VyIHZhbHVlLgotCQkgKiAKLQkJICogVGhpcyBzdHJhdGVneSBvbmx5IHdvcmtzIG9uIHRyZWVzIHdoZXJlIHRoZSBpdGVtcyBhcmUgb2YgZXZlbgotCQkgKiBoZWlnaHQsIGhvd2V2ZXIgYnVnCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTcyMDEgaW5kaWNhdGVzIHRoYXQKLQkJICogdGhpcyBpcyBubyBsb25nZXIgcHJvbWlzZWQsIGF0IGxlYXN0IG9uIHdpbjMyIGFuZCBsaWtlbHkgb24gb3RoZXIKLQkJICogcGxhdGZvcm1zIHNvb24uCi0JCSAqLwotCQlpZiAoZlRyZWUuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zID0gZlRyZWUuZ2V0SXRlbXMoKTsKLQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gaXRlbXNbMF0uZ2V0Qm91bmRzKCk7Ci0KLQkJCWlmIChpdGVtc1swXS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IGl0ZW1zWzBdLmdldEl0ZW1zKCk7Ci0JCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJcmVzdWx0ID0gY2hpbGRyZW5bMF0uZ2V0Qm91bmRzKCkueSAtIGl0ZW1Cb3VuZHMueTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpdGVtcy5sZW5ndGggPiAxKSB7Ci0JCQkJcmVzdWx0ID0gaXRlbXNbMV0uZ2V0Qm91bmRzKCkueSAtIGl0ZW1Cb3VuZHMueTsKLQkJCX0KLQkJfQotCi0JCXJlc3VsdCA9IE1hdGgubWF4KGZUcmVlLmdldEl0ZW1IZWlnaHQoKSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eVRyZWVNZXNzYWdlKEdDIGdjKSB7Ci0JCS8vIG5vdGhpbmcgdG8gYWRkIGhlcmUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVW5hYmxlVG9Qb3B1bGF0ZVRyZWVNZXNzYWdlKEdDIGdjKSB7Ci0JCS8vIGhlcmUgd2UgcHJpbnQgYSBtZXNzYWdlIHdoZW4gdGhlIGRvY3VtZW50IGNhbm5vdCBiZSBkaXNwbGF5ZWQganVzdAotCQkvLyB0byBnaXZlIHRoZQotCQkvLyB1c2VyIGEgdmlzdWFsIGN1ZQotCQkvLyBzbyB0aGF0IHRoZXkga25vdyBob3cgdG8gcHJvY2VlZCB0byBlZGl0IHRoZSBibGFuayB2aWV3Ci0JCWdjLnNldEZvcmVncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuVHJlZUV4dGVuc2lvbl8wLCAxMCwgMTApOwotCX0KLQotCXZvaWQgc2V0SXNVbnN1cHBvcnRlZElucHV0KGJvb2xlYW4gaXNVbnN1cHBvcnRlZCkgewotCQlmaXNVbnN1cHBvcnRlZElucHV0ID0gaXNVbnN1cHBvcnRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludEl0ZW1zKEdDIGdjLCBUcmVlSXRlbVtdIGl0ZW1zLCBSZWN0YW5nbGUgdHJlZUJvdW5kcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJCQlpZiAoYm91bmRzICE9IG51bGwpIHsKLQkJCQkJCWlmICh0cmVlQm91bmRzLmludGVyc2VjdHMoYm91bmRzKSkgewotCQkJCQkJCXBhaW50SXRlbShnYywgaXRlbSwgYm91bmRzKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGRlZmVjdCAyNDEwMzkKLQkJCQkJLy8KLQkJCQkJaWYgKGl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQkJCQkJcGFpbnRJdGVtcyhnYywgaXRlbS5nZXRJdGVtcygpLCB0cmVlQm91bmRzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50SXRlbShHQyBnYywgVHJlZUl0ZW0gaXRlbSwgUmVjdGFuZ2xlIGJvdW5kcykgewotCQkvLyBub3RoaW5nIHRvIHBhaW50Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBJQ2VsbEVkaXRvclByb3ZpZGVyIHsKLQkJQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBvLCBpbnQgY29sKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW1wcm92ZSBkcmF3aW5nIGR1cmluZyBhIGNvbHVtbiByZXNpemUuCi0JICovCi0JcHVibGljIGNsYXNzIERlbGF5ZWREcmF3VGltZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBDb250cm9sIGNvbnRyb2w7Ci0KLQkJcHVibGljIERlbGF5ZWREcmF3VGltZXIoQ29udHJvbCBjb250cm9sMSkgewotCQkJdGhpcy5jb250cm9sID0gY29udHJvbDE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldChpbnQgbWlsbGlzZWNvbmRzKSB7Ci0JCQlnZXREaXNwbGF5KCkudGltZXJFeGVjKG1pbGxpc2Vjb25kcywgdGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQljb250cm9sLnJlZHJhdygpOwotCQl9Ci0JfQotCi0JRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0TWFuYWdlcgotCSAqLwotCXB1YmxpYyBjbGFzcyBFZGl0TWFuYWdlciB7Ci0JCXByb3RlY3RlZCBUcmVlIGZUcmVlMTsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY2VsbEVkaXRvckhvbGRlcjsKLQkJcHJvdGVjdGVkIENlbGxFZGl0b3JTdGF0ZSBjZWxsRWRpdG9yU3RhdGU7Ci0KLQkJcHVibGljIEVkaXRNYW5hZ2VyKFRyZWUgdHJlZSkgewotCQkJdGhpcy5mVHJlZTEgPSB0cmVlOwotCQkJdGhpcy5jZWxsRWRpdG9ySG9sZGVyID0gbmV3IENvbXBvc2l0ZSh0cmVlLCBTV1QuTk9ORSk7Ci0KLQkJCWZpbmFsIFRyZWUgdGhlVHJlZSA9IHRyZWU7Ci0KLQkJCU1vdXNlQWRhcHRlciB0aGVNb3VzZUFkYXB0ZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotCQkJCQlpZiAoZS54ID4gY29sdW1uUG9zaXRpb24gKyBjb2x1bW5IaXRXaWR0aCkgewotCQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRoZVRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkvLyBObyBlZGl0IGlmIG1vcmUgdGhhbiBvbmUgcm93IGlzIHNlbGVjdGVkLgotCQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygpOwotCQkJCQkJCWlmIChib3VuZHMgIT0gbnVsbCAmJiBlLnkgPj0gYm91bmRzLnkgJiYgZS55IDw9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCkgewotCQkJCQkJCQlpbnQgY29sdW1uVG9FZGl0ID0gMTsKLQkJCQkJCQkJYWN0aXZhdGVDZWxsRWRpdG9yKGl0ZW1zWzBdLCBjb2x1bW5Ub0VkaXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWFwcGx5Q2VsbEVkaXRvclZhbHVlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUtleUxpc3RlbmVyIGtleUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCWRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0JCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdGhlVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMSkgewotCQkJCQkJCWFjdGl2YXRlQ2VsbEVkaXRvcihpdGVtc1swXSwgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCi0JCQl0cmVlLmFkZE1vdXNlTGlzdGVuZXIodGhlTW91c2VBZGFwdGVyKTsKLQkJCXRyZWUuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotCQkJU2Nyb2xsQmFyIGhCYXIgPSB0cmVlLmdldEhvcml6b250YWxCYXIoKTsKLQkJCWlmIChoQmFyICE9IG51bGwpCi0JCQkJaEJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQlTY3JvbGxCYXIgdkJhciA9IHRyZWUuZ2V0VmVydGljYWxCYXIoKTsKLQkJCWlmICh2QmFyICE9IG51bGwpCi0JCQkJdkJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0b3JBY3RpdmUoKSB7Ci0JCQlyZXR1cm4gY2VsbEVkaXRvclN0YXRlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBseUNlbGxFZGl0b3JWYWx1ZSgpIHsKLQkJCWlmIChjZWxsRWRpdG9yU3RhdGUgIT0gbnVsbCAmJiBjZWxsTW9kaWZpZXIgIT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gY2VsbEVkaXRvclN0YXRlLmZUcmVlSXRlbTsKLQotCQkJCS8vIFRoZSBhcmVhIGJlbG93IHRoZSBjZWxsIGVkaXRvciBuZWVkcyB0byBiZSBleHBsaWNpdHkKLQkJCQkvLyByZXBhaW50ZWQgb24gTGludXgKLQkJCQkvLwotCQkJCS8vIFJlY3RhbmdsZSByID0gQjJCSGFja3MuSVNfVU5JWCA/IHRyZWVJdGVtLmdldEJvdW5kcygpIDoKLQkJCQkvLyBudWxsOwotCi0JCQkJT2JqZWN0IHZhbHVlID0gY2VsbEVkaXRvclN0YXRlLmZDZWxsRWRpdG9yLmdldFZhbHVlKCk7Ci0JCQkJU3RyaW5nIHByb3BlcnR5ID0gY2VsbEVkaXRvclN0YXRlLmZQcm9wZXJ0eTsKLQotCQkJCWRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0KLQkJCQljZWxsTW9kaWZpZXIubW9kaWZ5KHRyZWVJdGVtLCBwcm9wZXJ0eSwgdmFsdWUpOwotCi0JCQkJLy8gaWYgKHIgIT0gbnVsbCkgewotCQkJCS8vIHRyZWUucmVkcmF3KHIueCwgci55LCB0cmVlLmdldEJvdW5kcygpLndpZHRoLCByLmhlaWdodCwKLQkJCQkvLyBmYWxzZSk7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKSB7Ci0JCQkvLyBDbGVhbiB1cCBhbnkgcHJldmlvdXMgZWRpdG9yIGNvbnRyb2wKLQkJCWlmIChjZWxsRWRpdG9yU3RhdGUgIT0gbnVsbCkgewotCQkJCWNlbGxFZGl0b3JTdGF0ZS5kZWFjdGl2YXRlKCk7Ci0JCQkJY2VsbEVkaXRvclN0YXRlID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlQ2VsbEVkaXRvcihUcmVlSXRlbSB0cmVlSXRlbSwgaW50IGNvbHVtbikgewotCQkJaWYgKGNlbGxNb2RpZmllciBpbnN0YW5jZW9mIElDZWxsRWRpdG9yUHJvdmlkZXIpIHsKLQkJCQlJQ2VsbEVkaXRvclByb3ZpZGVyIGNlbGxFZGl0b3JQcm92aWRlciA9IChJQ2VsbEVkaXRvclByb3ZpZGVyKSBjZWxsTW9kaWZpZXI7Ci0JCQkJT2JqZWN0IGRhdGEgPSB0cmVlSXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKGZDb2x1bW5Qcm9wZXJ0aWVzLmxlbmd0aCA+IGNvbHVtbikgewotCQkJCQlTdHJpbmcgcHJvcGVydHkgPSBmQ29sdW1uUHJvcGVydGllc1tjb2x1bW5dOwotCQkJCQlpZiAoY2VsbE1vZGlmaWVyLmNhbk1vZGlmeShkYXRhLCBwcm9wZXJ0eSkpIHsKLQkJCQkJCUNlbGxFZGl0b3IgbmV3Q2VsbEVkaXRvciA9IGNlbGxFZGl0b3JQcm92aWRlci5nZXRDZWxsRWRpdG9yKGRhdGEsIGNvbHVtbik7Ci0JCQkJCQlpZiAobmV3Q2VsbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gVGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIHRoZSBlZGl0b3IgbXVzdCBiZSBhCi0JCQkJCQkJLy8gY2hpbGQgb2YgdGhlIGNvbHVtblBvc2l0aW9uCi0JCQkJCQkJQ29udHJvbCBjb250cm9sID0gbmV3Q2VsbEVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQkJCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQkJCQljZWxsRWRpdG9yU3RhdGUgPSBuZXcgQ2VsbEVkaXRvclN0YXRlKG5ld0NlbGxFZGl0b3IsIGNvbnRyb2wsIHRyZWVJdGVtLCBjb2x1bW4sIHByb3BlcnR5KTsKLQkJCQkJCQkJY2VsbEVkaXRvclN0YXRlLmFjdGl2YXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoaXMgY2xhc3MgaG9sZHMgdGhlIHN0YXRlIHRoYXQgaXMgbmVlZCBvbiBhIHBlciBjZWxsIGVkaXRvcgotCQkgKiBpbnZvY2F0aW9uIGJhc2lzCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgQ2VsbEVkaXRvclN0YXRlIGltcGxlbWVudHMgSUNlbGxFZGl0b3JMaXN0ZW5lciwgRm9jdXNMaXN0ZW5lciB7Ci0JCQlwdWJsaWMgQ2VsbEVkaXRvciBmQ2VsbEVkaXRvcjsKLQkJCXB1YmxpYyBDb250cm9sIGZDb250cm9sOwotCQkJcHVibGljIFRyZWVJdGVtIGZUcmVlSXRlbTsKLQkJCXB1YmxpYyBpbnQgZkNvbHVtbk51bWJlcjsKLQkJCXB1YmxpYyBTdHJpbmcgZlByb3BlcnR5OwotCi0JCQlwdWJsaWMgQ2VsbEVkaXRvclN0YXRlKENlbGxFZGl0b3IgY2VsbEVkaXRvciwgQ29udHJvbCBjb250cm9sLCBUcmVlSXRlbSB0cmVlSXRlbSwgaW50IGNvbHVtbk51bWJlciwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJdGhpcy5mQ2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCQkJdGhpcy5mQ29udHJvbCA9IGNvbnRyb2w7Ci0JCQkJdGhpcy5mVHJlZUl0ZW0gPSB0cmVlSXRlbTsKLQkJCQl0aGlzLmZDb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0JCQkJdGhpcy5mUHJvcGVydHkgPSBwcm9wZXJ0eTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBmVHJlZUl0ZW0uZ2V0RGF0YSgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGNlbGxNb2RpZmllci5nZXRWYWx1ZShlbGVtZW50LCBmUHJvcGVydHkpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKGZDb250cm9sIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZkNvbnRyb2w7Ci0JCQkJCWludCByZXF1aXJlZFNpemUgPSB2YWx1ZS5sZW5ndGgoKSArIDEwMDsKLQkJCQkJaWYgKHRleHQuZ2V0VGV4dExpbWl0KCkgPCByZXF1aXJlZFNpemUpIHsKLQkJCQkJCXRleHQuc2V0VGV4dExpbWl0KHJlcXVpcmVkU2l6ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJUmVjdGFuZ2xlIHIgPSBmVHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCQlmQ29udHJvbC5zZXRCb3VuZHMoY29sdW1uUG9zaXRpb24gKyA1LCByLnkgKyAxLCBmVHJlZTEuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gKGNvbHVtblBvc2l0aW9uICsgNSksIHIuaGVpZ2h0IC0gMSk7Ci0JCQkJCWZDb250cm9sLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWZDZWxsRWRpdG9yLnNldFZhbHVlKHZhbHVlKTsKLQkJCQkJZkNlbGxFZGl0b3IuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCWZDZWxsRWRpdG9yLnNldEZvY3VzKCk7Ci0JCQkJCWZDb250cm9sLmFkZEZvY3VzTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkJCWZDZWxsRWRpdG9yLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWZDb250cm9sLnJlbW92ZUZvY3VzTGlzdGVuZXIodGhpcyk7Ci0JCQkJZkNlbGxFZGl0b3IuZGVhY3RpdmF0ZSgpOwotCQkJCWZUcmVlMS5mb3JjZUZvY3VzKCk7Ci0JCQl9Ci0KLQkJCS8vIElDZWxsRWRpdG9yTGlzdGVuZXIgbWV0aG9kcwotCQkJLy8KLQkJCXB1YmxpYyB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKSB7Ci0JCQkJYXBwbHlDZWxsRWRpdG9yVmFsdWUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkgewotCQkJCWRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGVkaXRvclZhbHVlQ2hhbmdlZChib29sZWFuIG9sZFZhbGlkU3RhdGUsIGJvb2xlYW4gbmV3VmFsaWRTdGF0ZSkgewotCQkJCS8vIG5vdGhpbmcsIGZvciBub3cKLQkJCX0KLQotCQkJLy8gRm9jdXNMaXN0ZW5lciBtZXRob2RzCi0JCQkvLwotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJYXBwbHlDZWxsRWRpdG9yVmFsdWUoKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9WaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1ZGRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9WaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cGFuZEFjdGlvbjsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24oYm9vbGVhbiBpc0V4cGFuZEFjdGlvbikgewotCQl0aGlzLmlzRXhwYW5kQWN0aW9uID0gaXNFeHBhbmRBY3Rpb247Ci0JCWlmIChpc0V4cGFuZEFjdGlvbikgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGVfaW1hZ2VEZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9FWFBBTkRBTEwpOwotCQkJSW1hZ2VEZXNjcmlwdG9yIGRfaW1hZ2VEZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9FWFBBTkRBTEwpOwotCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZV9pbWFnZURlc2NyaXB0b3IpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoZF9pbWFnZURlc2NyaXB0b3IpOwotCQkJc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfSU5GT19FWFBBTkRfQUxMKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGVfaW1hZ2VEZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9DT0xMQVBTRUFMTCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZF9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTExBUFNFQUxMKTsKLQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGVfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGRfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0lORk9fQ09MTEFQU0VfQUxMKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyKEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCS8vIHRlbXBvcmFyaWx5IHNldCB0aGUgdmlzaWJpbGl0eSB0byBmYWxzZQotCQkJLy8gdGhpcyBoYXMgYSBIVUdFIHBlcmZvcm1hbmNlIGJlbmVmaXQKLQkJCWJvb2xlYW4gaXNWaXNpYmxlID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRWaXNpYmxlKCk7Ci0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQlpZiAoaXNFeHBhbmRBY3Rpb24pIHsKLQkJCQl2aWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQkJfQotCi0JCQkvLyByZXN0b3JlIHRoZSBwcmV2aW91cyB2aXNpYmlsaXR5IHN0YXRlCi0JCQkvLyAKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTY4Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotCi0KLS8qKgotICogRGVmaW5lcyB0aGUgZGVmaW5pdGlvbnMgaWRzIGZvciB0aGUgWE1MIGVkaXRvciBhY3Rpb25zLgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuQWN0aW9uRGVmaW5pdGlvbklkcyBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xFQU5VUF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuY2xlYW51cC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZm9ybWF0LmRvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkub3Blbi5maWxlLmZyb20uc291cmNlIjsvLyROT04tTkxTLTEkCi0JLy8JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5GT1JNQVRJT04gPQotCS8vICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuc2hvdy50b29sdGlwLmluZm9ybWF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5GT1JNQVRJT04gPSAib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLnNob3cuamF2YWRvYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuYWRkLmJyZWFrcG9pbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFOQUdFX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5tYW5hZ2UuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTkFCTEVfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLmVuYWJsZS5icmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJU0FCTEVfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLmRpc2FibGUuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkMGJlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgRWRpdG9yCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxFZGl0b3JSZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZVZpZXdlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTE11bHRpUGFnZUVkaXRvclBhcnRfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUcmVlRXh0ZW5zaW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHJlZUV4dGVuc2lvbl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUcmVlRXh0ZW5zaW9uXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZV9fZG9lc19ub3RfZXhpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX2NvdWxkX25vdF9iZV9vcGVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyZWVFeHRlbnNpb25fMDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxFZGl0b3JNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgWE1MRWRpdG9yTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkhPTERfT0xELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTE5ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgcGx1Z2luIGhhcyBjb21iaW5lZCB3aXRoIHRoZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpIHBsdWdpbi4KLSAqICAgICAgICAgICAgIFVzZSBYTUxVSVBsdWdpbiBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTEVkaXRvclBsdWdpbkhPTERfT0xEIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogWE1MVUlQbHVnaW4gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQotCQkvLyByZWZlcmVuY2UgdGhlIHByZWZlcmVuY2Ugc3RvcmUgc28KLQkJLy8gaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZSkgaXMKLQkJLy8gY2FsbGVkCi0JCWdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTEVkaXRvclBsdWdpbkhPTERfT0xEIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWY4ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBYTUxVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLwkgc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpCi0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4Zjg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIFhNTCBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvclBsdWdpbkltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTExBUFNFID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTExBUFNFID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT0xMQVBTRUFMTCA9ICJpY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfRVhQQU5EID0gImljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9FWFBBTkQgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0VYUEFOREFMTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kX2FsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0VYUEFOREFMTCA9ICJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX05FV19YTUwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L25ld194bWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9ORVdfWE1MID0gImljb25zL2Z1bGwvZXRvb2wxNi9uZXdfeG1sLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JSZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjJkMDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotWE1MVGFibGVUcmVlVmlld2VyXzA9RGVzaWduCi1YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0XzA9U291cmNlCi1YTUxUcmVlRXh0ZW5zaW9uXzA9U3RydWN0dXJlCi1YTUxUcmVlRXh0ZW5zaW9uXzE9VmFsdWUKLVhNTFRyZWVFeHRlbnNpb25fMz1UaGUgZG9jdW1lbnQgaXMgZW1wdHkuCi1YTUxUcmVlRXh0ZW5zaW9uXzQ9UmlnaHQgbW91c2UgY2xpY2sgaGVyZSB0byBpbnNlcnQgY29udGVudC4KLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzA9JlhNTAotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMT0mRXhwYW5kIEFsbAotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMj0mQ29sbGFwc2UgQWxsCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zPVR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPZmYKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzQ9JlR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPZmYKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzU9VHVybiBHcmFtbWFyIENvbnN0cmFpbnRzIE9uCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl82PSZUdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT24KLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzc9UmVsb2FkIERlcGVuZGVuY2llcwotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfOD0mUmVsb2FkIERlcGVuZGVuY2llcwotIyMKLUFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuMV9FUlJPUl89QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBpbnB1dCBmb3IgdGhlIHRoZSBlZGl0b3IncyBzb3VyY2UgcGFnZS4KLVJlc291cmNlX19kb2VzX25vdF9leGlzdD1SZXNvdXJjZSB7MH0gZG9lcyBub3QgZXhpc3QuCi1FZGl0b3JfY291bGRfbm90X2JlX29wZW49RWRpdG9yIGNvdWxkIG5vdCBiZSBvcGVuIG9uIHswfQotVHJlZUV4dGVuc2lvbl8wPUNhbm5vdCBkaXNwbGF5IGRvY3VtZW50IGNvbnRlbnRzLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ODNjNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXByaXZhdGUgYm9vbGVhbiBuZWVkc011bHRpSW5pdCA9IHRydWU7Ci0KLQlwdWJsaWMgWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCi0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKQotCQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKQotCQkJCSgoSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikuaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhhY3Rpb25CYXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZURlc2lnblBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0KLQkJCS8vIG51bGwsIHNvIHBhc3MgaW4gbXVsdGlQYWdlRWRpdG9yIGluc3RlYWQgKGQyODI0MTQpCi0JCQlpZiAoYWN0aXZlRWRpdG9yID09IG51bGwpIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQl9Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwgJiYgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQkJKChJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVTb3VyY2VQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwgJiYgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0JCW5lZWRzTXVsdGlJbml0ID0gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3Iob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlpZiAobmVlZHNNdWx0aUluaXQpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yID0gbmV3IFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQlpbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoZ2V0QWN0aW9uQmFycygpKTsKLQkJCW5lZWRzTXVsdGlJbml0ID0gZmFsc2U7Ci0JCX0KLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzRjMGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgewotCi0JLyoqCi0JICogSW50ZXJuYWwgcGFydCBhY3RpdmF0aW9uIGxpc3RlbmVyLCBjb3BpZWQgZnJvbSBBYnN0cmFjdFRleHRFZGl0b3IKLQkgKi8KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIgewotCi0JCS8qKiBDYWNoZSBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0LiAqLwotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCQkvKiogSW5kaWNhdGVzIHdoZXRoZXIgYWN0aXZhdGlvbiBoYW5kbGluZyBpcyBjdXJyZW50bHkgYmUgZG9uZS4gKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkvKioKLQkJICogVGhlIHBhcnQgc2VydmljZS4KLQkJICogCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXByaXZhdGUgSVBhcnRTZXJ2aWNlIGZQYXJ0U2VydmljZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGFydFNlcnZpY2UKLQkJICogICAgICAgICAgICB0aGUgcGFydCBzZXJ2aWNlIG9uIHdoaWNoIHRvIGFkZCB0aGUgcGFydCBsaXN0ZW5lcgotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZhdGlvbkxpc3RlbmVyKElQYXJ0U2VydmljZSBwYXJ0U2VydmljZSkgewotCQkJZlBhcnRTZXJ2aWNlID0gcGFydFNlcnZpY2U7Ci0JCQlmUGFydFNlcnZpY2UuYWRkUGFydExpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBEaXNwb3NlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlBhcnRTZXJ2aWNlLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVtb3ZlV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCQlmUGFydFNlcnZpY2UgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gcGFydDsKLQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydENsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIEhhbmRsZXMgdGhlIGFjdGl2YXRpb24gdHJpZ2dlcmluZyBhIGVsZW1lbnQgc3RhdGUgY2hlY2sgaW4gdGhlCi0JCSAqIGVkaXRvci4KLQkJICovCi0JCXZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQkJCWlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24gfHwgZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoZkFjdGl2ZVBhcnQgPT0gWE1MTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzKSB7Ci0JCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlnZXRUZXh0RWRpdG9yKCkuc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotCQkJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZQotCQkJCSAqIHJlbW92ZWQgd2hlbiBTV1QgaGFzIHNvbHZlZCB0aGUgcHJvYmxlbS4KLQkJCQkgKi8KLQkJCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dEZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyBmb3Igc2VsZWN0aW9uIGZyb20gdGhlIHNvdXJjZSBwYWdlLCBhcHBseWluZyBpdCB0byB0aGUgZGVzaWduCi0JICogdmlld2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGV4dEVkaXRvclBvc3RTZWxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgVUlKb2IgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJYm9vbGVhbiBmb3JjZVBvc3RTZWxlY3Rpb24gPSBmYWxzZTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JCXB1YmxpYyBUZXh0RWRpdG9yUG9zdFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlzdXBlcihnZXRUaXRsZSgpKTsKLQkJCXNldFVzZXIodHJ1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCAmJiAoKGdldEFjdGl2ZVBhZ2UoKSAhPSBmRGVzaWduUGFnZUluZGV4KSB8fCAhWE1MTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzLmVxdWFscyhnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZVBhcnQoKSkpKSB7Ci0JCQkJaWYgKGZvcmNlUG9zdFNlbGVjdGlvbikgewotCQkJCQlzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJc2NoZWR1bGUoMjAwKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEludGVybmFsIElQcm9wZXJ0eUxpc3RlbmVyCi0JICovCi0JY2xhc3MgUHJvcGVydHlMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkJCXN3aXRjaCAocHJvcElkKSB7Ci0JCQkJLy8gaGFkIHRvIGltcGxlbWVudCBpbnB1dCBjaGFuZ2VkICJsaXN0ZW5lciIgc28gdGhhdAotCQkJCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGNvdWxkIHRlbGwgaXQgY29udGFpbmluZyBlZGl0b3IgdGhhdAotCQkJCS8vIHRoZSBpbnB1dCBoYXMgY2hhbmdlLCB3aGVuIGEgJ3Jlc291cmNlIG1vdmVkJyBldmVudCBpcwotCQkJCS8vIGZvdW5kLgotCQkJCWNhc2UgSUVkaXRvclBhcnQuUFJPUF9JTlBVVCA6Ci0JCQkJY2FzZSBJRWRpdG9yUGFydC5QUk9QX0RJUlRZIDogewotCQkJCQlpZiAoc291cmNlID09IGdldFRleHRFZGl0b3IoKSkgewotCQkJCQkJaWYgKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpIHsKLQkJCQkJCQlzZXRJbnB1dChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiB0aXRsZSBzaG91bGQgYWx3YXlzIGNoYW5nZSB3aGVuIGlucHV0IGNoYW5nZXMuCi0JCQkJCQkJICogY3JlYXRlIHJ1bm5hYmxlIGZvciBmb2xsb3dpbmcgcG9zdCBjYWxsCi0JCQkJCQkJICovCi0JCQkJCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCV9maXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJCS8qCi0JCQkJCQkJICogVXBkYXRlIGlzIGp1c3QgdG8gcG9zdCB0aGluZ3Mgb24gdGhlIGRpc3BsYXkKLQkJCQkJCQkgKiBxdWV1ZSAodGhyZWFkKS4gV2UgaGF2ZSB0byBkbyB0aGlzIHRvIGdldCB0aGUKLQkJCQkJCQkgKiBkaXJ0eSBwcm9wZXJ0eSB0byBnZXQgdXBkYXRlZCBhZnRlciBvdGhlcgotCQkJCQkJCSAqIHRoaW5ncyBvbiB0aGUgcXVldWUgYXJlIGV4ZWN1dGVkLgotCQkJCQkJCSAqLwotCQkJCQkJCSgoQ29udHJvbCkgZ2V0VGV4dEVkaXRvcigpLmdldEFkYXB0ZXIoQ29udHJvbC5jbGFzcykpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIElXb3JrYmVuY2hQYXJ0LlBST1BfVElUTEUgOiB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgaW5wdXQgaWYgdGhlIHRpdGxlIGlzIGNoYW5nZWQKLQkJCQkJaWYgKHNvdXJjZSA9PSBnZXRUZXh0RWRpdG9yKCkpIHsKLQkJCQkJCWlmIChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0JCQkJCQkJc2V0SW5wdXQoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0IDogewotCQkJCQkvLyBwcm9wYWdhdGUgY2hhbmdlcy4gSXMgdGhpcyBuZWVkZWQ/IEFuc3dlcjogWWVzLgotCQkJCQlpZiAoc291cmNlID09IGdldFRleHRFZGl0b3IoKSkgewotCQkJCQkJX2ZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wSWQpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JY2xhc3MgVGV4dElucHV0TGlzdGVuZXIgaW1wbGVtZW50cyBJVGV4dElucHV0TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJCWlmIChmRGVzaWduVmlld2VyICE9IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkKLQkJCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KG5ld0lucHV0KTsKLQkJfQotCX0KLQotCS8qKiBUaGUgZGVzaWduIHBhZ2UgaW5kZXguICovCi0JcHJpdmF0ZSBpbnQgZkRlc2lnblBhZ2VJbmRleDsKLQotCS8qKiBUaGUgZGVzaWduIHZpZXdlciAqLwotCUlEZXNpZ25WaWV3ZXIgZkRlc2lnblZpZXdlcjsKLQotCXByaXZhdGUgQWN0aXZhdGlvbkxpc3RlbmVyIGZBY3RpdmF0aW9uTGlzdGVuZXI7Ci0KLQlJUHJvcGVydHlMaXN0ZW5lciBmUHJvcGVydHlMaXN0ZW5lciA9IG51bGw7Ci0KLQkvKiogVGhlIHNvdXJjZSBwYWdlIGluZGV4LiAqLwotCWludCBmU291cmNlUGFnZUluZGV4OwotCi0JLyoqIFRoZSB0ZXh0IGVkaXRvci4gKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGZUZXh0RWRpdG9yOwotCi0JcHJpdmF0ZSBUZXh0RWRpdG9yUG9zdFNlbGVjdGlvbkFkYXB0ZXIgZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0TXVsdGlQYWdlRWRpdG9yUGFydCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIGZpcmVQcm9wZXJ0eUNoYW5nZWQgYWNjZXNzaWJsZSBmcm9tIHNvbWUKLQkgKiAoYW5vbm9tb3VzKSBpbm5lciBjbGFzc2VzLgotCSAqLwotCXZvaWQgX2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHkpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBzb3VyY2UgcGFnZSBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlmU291cmNlUGFnZUluZGV4ID0gYWRkUGFnZShmVGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCXNldFBhZ2VUZXh0KGZTb3VyY2VQYWdlSW5kZXgsIFhNTEVkaXRvck1lc3NhZ2VzLlhNTE11bHRpUGFnZUVkaXRvclBhcnRfMCk7Ci0JCS8vIHRoZSB1cGRhdGUncyBjcml0aWNhbCwgdG8gZ2V0IHZpZXdlciBzZWxlY3Rpb24gbWFuYWdlciBhbmQKLQkJLy8gaGlnaGxpZ2h0aW5nIHRvIHdvcmsKLQkJZlRleHRFZGl0b3IudXBkYXRlKCk7Ci0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfVElUTEUpOwotCi0JCS8vIENoYW5nZXMgdG8gdGhlIFRleHQgVmlld2VyJ3MgZG9jdW1lbnQgaW5zdGFuY2Ugc2hvdWxkIGFsc28KLQkJLy8gZm9yY2UgYW4KLQkJLy8gaW5wdXQgcmVmcmVzaAotCQlmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCkuYWRkVGV4dElucHV0TGlzdGVuZXIobmV3IFRleHRJbnB1dExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIENvbm5lY3RzIHRoZSBkZXNpZ24gdmlld2VyIHdpdGggdGhlIHZpZXdlciBzZWxlY3Rpb24gbWFuYWdlci4gU2hvdWxkIGJlCi0JICogZG9uZSBhZnRlciBjcmVhdGVTb3VyY2VQYWdlKCkgaXMgZG9uZSBiZWNhdXNlIHdlIG5lZWQgdG8gZ2V0IHRoZQotCSAqIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgZnJvbSB0aGUgVGV4dEVkaXRvci4gc2V0TW9kZWwgaXMgYWxzbyBkb25lIGhlcmUKLQkgKiBiZWNhdXNlIGdldE1vZGVsKCkgbmVlZHMgdG8gcmVmZXJlbmNlIHRoZSBUZXh0RWRpdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25uZWN0RGVzaWduUGFnZSgpIHsKLQkJaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkgewotCQkJZkRlc2lnblZpZXdlci5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsKLQkJfQotCi0JCS8qCi0JCSAqIENvbm5lY3Qgc2VsZWN0aW9uIGZyb20gdGhlIERlc2lnbiBwYWdlIHRvIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkJICogZm9yIHRoZSBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IHNvIHRoYXQgc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlCi0JCSAqIERlc2lnbiBwYWdlIHdpbGwgcHJvcG9nYXRlIGFjcm9zcyB0aGUgd29ya2JlbmNoCi0JCSAqLwotCQlpZiAoZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJKChNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJKChNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLyoKLQkJICogQ29ubmVjdCBzZWxlY3Rpb24gZnJvbSB0aGUgRGVzaWduIHBhZ2UgdG8gdGhlIHNlbGVjdGlvbiBwcm92aWRlciBvZgotCQkgKiB0aGUgU291cmNlIHBhZ2Ugc28gdGhhdCBzZWxlY3Rpb24gaW4gdGhlIERlc2lnbiBwYWdlIHdpbGwgZHJpdmUKLQkJICogc2VsZWN0aW9uIGluIHRoZSBTb3VyY2UgcGFnZS4gUHJlZmVyIHBvc3Qgc2VsZWN0aW9uLgotCQkgKi8KLQkJaWYgKGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE9ubHkgZm9yY2Ugc2VsZWN0aW9uIHVwZGF0ZSBpZiBzb3VyY2UgcGFnZSBpcyBub3QKLQkJCQkJICogYWN0aXZlCi0JCQkJCSAqLwotCQkJCQlpZiAoZ2V0QWN0aXZlUGFnZSgpICE9IGZTb3VyY2VQYWdlSW5kZXgpIHsKLQkJCQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIHsKLQkJCWZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJLyoKLQkJCQkJICogT25seSBmb3JjZSBzZWxlY3Rpb24gdXBkYXRlIGlmIHNvdXJjZSBwYWdlIGlzIG5vdAotCQkJCQkgKiBhY3RpdmUKLQkJCQkJICovCi0JCQkJCWlmIChnZXRBY3RpdmVQYWdlKCkgIT0gZlNvdXJjZVBhZ2VJbmRleCkgewotCQkJCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJLyoKLQkJICogSGFuZGxlIGRvdWJsZS1jbGljayBpbiB0aGUgRGVzaWduIHBhZ2UgYnkgc2VsZWN0aW5nIHRoZQotCQkgKiBjb3JyZXNwb25kaW5nIGFtb3VudCBvZiB0ZXh0IGluIHRoZSBTb3VyY2UgcGFnZS4KLQkJICovCi0JCWZEZXNpZ25WaWV3ZXIuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBzdGFydCA9IC0xOwotCQkJCWludCBsZW5ndGggPSAtMTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJLyoKLQkJCQkJICogc2VsZWN0aW9uIGdvZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IG9iamVjdCB0bwotCQkJCQkgKiB0aGUgZW5kIG9mIHRoZSBsYXN0Ci0JCQkJCSAqLwotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCU9iamVjdCBvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJT2JqZWN0IG8yID0gbnVsbDsKLQkJCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJbzIgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvQXJyYXkoKVtzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSAtIDFdOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbzIgPSBvOwotCQkJCQl9Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlsZW5ndGggPSAoKEluZGV4ZWRSZWdpb24pIG8yKS5nZXRFbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG8yIGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCWxlbmd0aCA9ICgoSVRleHRSZWdpb24pIG8yKS5nZXRFbmQoKSAtIHN0YXJ0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCXN0YXJ0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKTsKLQkJCQl9Ci0JCQkJaWYgKHN0YXJ0ID4gLTEgJiYgbGVuZ3RoID4gLTEpIHsKLQkJCQkJZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChzdGFydCwgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8qCi0JCSAqIENvbm5lY3Qgc2VsZWN0aW9uIGZyb20gdGhlIFNvdXJjZSBwYWdlIHRvIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIgb2YKLQkJICogdGhlIERlc2lnbiBwYWdlIHNvIHRoYXQgc2VsZWN0aW9uIGluIHRoZSBTb3VyY2UgcGFnZSB3aWxsIGRyaXZlCi0JCSAqIHNlbGVjdGlvbiBpbiB0aGUgRGVzaWduIHBhZ2UuIFByZWZlciBwb3N0IHNlbGVjdGlvbi4KLQkJICovCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlpZiAoZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFRleHRFZGl0b3JQb3N0U2VsZWN0aW9uQWRhcHRlcigpOwotCQl9Ci0JCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCWZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIuZm9yY2VQb3N0U2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lci5mb3JjZVBvc3RTZWxlY3Rpb24gPSB0cnVlOwotCQkJcHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuZCBBZGQgdGhlIERlc2lnbiBQYWdlIHVzaW5nIGEgcmVnaXN0ZXJlZCBmYWN0b3J5Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEFkZERlc2lnblBhZ2UoKSB7Ci0JCUlEZXNpZ25WaWV3ZXIgZGVzaWduVmlld2VyID0gY3JlYXRlRGVzaWduUGFnZSgpOwotCi0JCWZEZXNpZ25WaWV3ZXIgPSBkZXNpZ25WaWV3ZXI7Ci0JCS8vIG5vdGU6IEJ5IGFkZGluZyB0aGUgZGVzaWduIHBhZ2UgYXMgYSBDb250cm9sIGluc3RlYWQgb2YgYW4KLQkJLy8gSUVkaXRvclBhcnQsIHBhZ2Ugc3dpdGNoZXMgd2lsbCBpbmRpY2F0ZQotCQkvLyBhICJudWxsIiBhY3RpdmUgZWRpdG9yIHdoZW4gdGhlIGRlc2lnbiBwYWdlIGlzIG1hZGUgYWN0aXZlCi0JCWZEZXNpZ25QYWdlSW5kZXggPSBhZGRQYWdlKGRlc2lnblZpZXdlci5nZXRDb250cm9sKCkpOwotCQlzZXRQYWdlVGV4dChmRGVzaWduUGFnZUluZGV4LCBkZXNpZ25WaWV3ZXIuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEZXNpZ25WaWV3ZXIgY3JlYXRlRGVzaWduUGFnZSgpIHsKLQkJWE1MVGFibGVUcmVlVmlld2VyIHRhYmxlVHJlZVZpZXdlciA9IG5ldyBYTUxUYWJsZVRyZWVWaWV3ZXIoZ2V0Q29udGFpbmVyKCkpOwotCQkvLyBTZXQgdGhlIGRlZmF1bHQgaW5mb3BvcCBmb3IgWE1MIGRlc2lnbiB2aWV3ZXIuCi0JCVhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGFibGVUcmVlVmlld2VyLmdldENvbnRyb2woKSwgWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuWE1MX0RFU0lHTl9WSUVXX0hFTFBJRCk7Ci0JCXJldHVybiB0YWJsZVRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFnZXMgb2YgdGhpcyBtdWx0aS1wYWdlIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcjwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzb3VyY2UgcGFnZSBNVVNUIGJlIGNyZWF0ZWQgYmVmb3JlIGRlc2lnbiBwYWdlLCBub3cKLQkJCWNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQotCQkJY3JlYXRlQW5kQWRkRGVzaWduUGFnZSgpOwotCQkJYWRkU291cmNlUGFnZSgpOwotCQkJY29ubmVjdERlc2lnblBhZ2UoKTsKLQotCQkJLy8gc2V0IHRoZSBhY3RpdmUgZWRpdG9yIGluIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZpcnN0Ci0JCQkvLyBiZWZvcmUgc2V0YWN0aXZlcGFnZSBjYWxscyBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yJ3MKLQkJCS8vIHNldGFjdGl2ZXBhZ2UgKGJ1ZzE0MTAxMyAtIHJlbW92ZSB3aGVuIGJ1ZzE1MTQ4OCBpcyBmaXhlZCkKLQkJCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCQkoKE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuc2V0QWN0aXZlRWRpdG9yKHRoaXMpOwotCQkJfQotCi0JCQlpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuTEFTVF9BQ1RJVkVfUEFHRSk7Ci0JCQlpZiAoYWN0aXZlUGFnZUluZGV4ID49IDAgJiYgYWN0aXZlUGFnZUluZGV4IDwgZ2V0UGFnZUNvdW50KCkpIHsKLQkJCQlzZXRBY3RpdmVQYWdlKGFjdGl2ZVBhZ2VJbmRleCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRBY3RpdmVQYWdlKGZTb3VyY2VQYWdlSW5kZXgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVTaXRlKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBJRWRpdG9yU2l0ZSBjcmVhdGVTaXRlKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlJRWRpdG9yU2l0ZSBzaXRlID0gbnVsbDsKLQkJaWYgKGVkaXRvciA9PSBmVGV4dEVkaXRvcikgewotCQkJc2l0ZSA9IG5ldyBNdWx0aVBhZ2VFZGl0b3JTaXRlKHRoaXMsIGVkaXRvcikgewotCQkJCS8qKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlI2dldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQkJCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBzdXBlci5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgbXVsdGlDb250cmlidXRvciA9IFhNTE11bHRpUGFnZUVkaXRvclBhcnQudGhpcy5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCQkJaWYgKG11bHRpQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJCQkJY29udHJpYnV0b3IgPSAoKFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBtdWx0aUNvbnRyaWJ1dG9yKS5zb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY29udHJpYnV0b3I7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQkJLy8gc2V0cyB0aGlzIGlkIHNvIG5lc3RlZCBlZGl0b3IgaXMgY29uc2lkZXJlZCB4bWwgc291cmNlCi0JCQkJCS8vIHBhZ2UKLQkJCQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwgKyAiLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQ7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQllbHNlIHsKLQkJCXNpdGUgPSBzdXBlci5jcmVhdGVTaXRlKGVkaXRvcik7Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc291cmNlIHBhZ2Ugb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlmVGV4dEVkaXRvciA9IGNyZWF0ZVRleHRFZGl0b3IoKTsKLQkJZlRleHRFZGl0b3Iuc2V0RWRpdG9yUGFydCh0aGlzKTsKLQotCQlpZiAoZlByb3BlcnR5TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5TGlzdGVuZXIgPSBuZXcgUHJvcGVydHlMaXN0ZW5lcigpOwotCQl9Ci0JCWZUZXh0RWRpdG9yLmFkZFByb3BlcnR5TGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjcmVhdGVUZXh0RWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gU3RydWN0dXJlZFRleHRFZGl0b3IKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGNyZWF0ZVRleHRFZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzY29ubmVjdERlc2lnblBhZ2UoKSB7Ci0JCWlmIChmRGVzaWduVmlld2VyICE9IG51bGwpIHsKLQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiWE1MTXVsdGlQYWdlRWRpdG9yUGFydDo6ZGlzcG9zZSBlbnRyeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlkaXNjb25uZWN0RGVzaWduUGFnZSgpOwotCi0JCWlmIChmQWN0aXZhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZBY3RpdmF0aW9uTGlzdGVuZXIuZGlzcG9zZSgpOwotCQkJZkFjdGl2YXRpb25MaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCAmJiBmUHJvcGVydHlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlmVGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCi0JCS8vIG1vdmVkIHRvIGxhc3Qgd2hlbiBhZGRlZCB3aW5kb3cgLi4uIHNlZW1zIGxpa2UKLQkJLy8gd2UnZCBiZSBpbiBkYW5nZXIgb2YgbG9zaW5nIHNvbWUgZGF0YSwgbGlrZSBzaXRlLAotCQkvLyBvciBzb21ldGhpbmcuCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0OjpkaXNwb3NlIGV4aXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZlRleHRFZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCWZUZXh0RWRpdG9yLmRvU2F2ZUFzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoa2V5ID09IElEZXNpZ25WaWV3ZXIuY2xhc3MpIHsKLQkJCXJlc3VsdCA9IGZEZXNpZ25WaWV3ZXI7Ci0KLQkJfQotCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgewotCQkJcmVzdWx0ID0gbmV3IElHb3RvTWFya2VyKCkgewotCQkJCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJCQkJWE1MTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzLmdvdG9NYXJrZXIobWFya2VyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UgewotCQkJLy8gRE1XOiBJJ20gYnVsbGV0LXByb29maW5nIHRoaXMgYmVjYXVzZQotCQkJLy8gaXRzIGJlZW4gcmVwb3J0ZWQgKG9uIElCTSBXU0FEIDQuMDMgdmVyc2lvbikgYSBudWxsIHBvaW50ZXIKLQkJCS8vIHNvbWV0aW1lcwotCQkJLy8gaGFwcGVucyBoZXJlIG9uIHN0YXJ0dXAsIHdoZW4gYW4gZWRpdG9yIGhhcyBiZWVuIGxlZnQKLQkJCS8vIG9wZW4gd2hlbiB3b3JrYmVuY2ggc2h1dGRvd24uCi0JCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoa2V5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCWRvY3VtZW50ID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gZ2V0VGV4dEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCX0KLQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCXRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0Jdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXNldEFjdGl2ZVBhZ2UoZlNvdXJjZVBhZ2VJbmRleCk7Ci0JCUlERS5nb3RvTWFya2VyKGZUZXh0RWRpdG9yLCBtYXJrZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkJLy8gd2Ugd2FudCB0byBsaXN0ZW4gZm9yIG91ciBvd24gYWN0aXZhdGlvbgotCQkJZkFjdGl2YXRpb25MaXN0ZW5lciA9IG5ldyBBY3RpdmF0aW9uTGlzdGVuZXIoc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBpbml0aWFsaXppbmcgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3IgIT0gbnVsbCAmJiBmVGV4dEVkaXRvci5pc1NhdmVBc0FsbG93ZWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJLy8gb3ZlcnJpZGluZyBzdXBlciBjbGFzcyBzaW5jZSBpdCBkb2VzIGEgbG93bHkgaXNEaXJ0eSEKLQkJaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gZlRleHRFZGl0b3IuaXNTYXZlT25DbG9zZU5lZWRlZCgpOwotCQlyZXR1cm4gaXNEaXJ0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3BhZ2VDaGFuZ2UoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCXNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KG5ld1BhZ2VJbmRleCk7Ci0KLQkJaWYgKG5ld1BhZ2VJbmRleCA9PSBmRGVzaWduUGFnZUluZGV4KSB7Ci0JCQkvLyBkZXNpZ24gcGFnZSBpc24ndCBhbiBJRWRpdG9yUGFydCwgdGhlcmVmb3JlIHdlIGhhdmUgdG8gc2VuZAotCQkJLy8gc2VsZWN0aW9uIGNoYW5nZXMgb3Vyc2VsdmVzCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCSgoTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KGludCBuZXdQYWdlSW5kZXgpIHsKLQkJLy8gc2F2ZSB0aGUgbGFzdCBhY3RpdmUgcGFnZSBpbmRleCB0byBwcmVmZXJlbmNlIG1hbmFnZXIKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSVhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFLCBuZXdQYWdlSW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJLy8gSWYgZHJpdmVuIGZyb20gdGhlIFNvdXJjZSBwYWdlLCBpdCdzICJtb2RlbCIgbWF5IG5vdCBiZSB1cCB0byBkYXRlCi0JCS8vIHdpdGggdGhlIGlucHV0IGp1c3QgeWV0LiBXZSdsbCByZWx5IG9uIGxhdGVyIG5vdGlmaWNhdGlvbiBmcm9tIHRoZQotCQkvLyBUZXh0Vmlld2VyIHRvIHNldCB1cyBzdHJhaWdodAotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0JCWlmIChmRGVzaWduVmlld2VyICE9IG51bGwpCi0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1YzdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERVNJR05fVklFV0VSX1NFUEFSQVRPUl8xX0lEID0gInNlZC50YWJsZXRyZWUuc2VwYXJhdG9yLjEiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMl9JRCA9ICJzZWQudGFibGV0cmVlLnNlcGFyYXRvci4yIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1hNTF9JRCA9ICJzZWQudGFibGV0cmVlLnZhbGlkYXRlWE1MIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTE9BRF9HUkFNTUFSX0lEID0gInNlZC50YWJsZXRyZWUucmVsb2FkR3JhbW1hciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBUT0dHTEVfRURJVF9NT0RFX0lEID0gInNlZC50YWJsZXRyZWUudG9nZ2xlRWRpdE1vZGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhQQU5EX0FMTF9JRCA9ICJzZWQudGFibGV0cmVlLmV4cGFuZEFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBDT0xMQVBTRV9BTExfSUQgPSAic2VkLnRhYmxldHJlZS5jb2xsYXBzZUFsbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBUb2dnbGVFZGl0TW9kZUFjdGlvbiB0b2dnbGVBY3Rpb247Ci0JcHJvdGVjdGVkIFJlbG9hZEdyYW1tYXJBY3Rpb24gcmVsb2FkR3JhbW1hckFjdGlvbjsKLQkvLwlwcm90ZWN0ZWQgVmFsaWRhdGVYTUxBY3Rpb24gdmFsaWRhdGVYTUxBY3Rpb247Ci0JcHJvdGVjdGVkIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uIGV4cGFuZEFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24gY29sbGFwc2VBY3Rpb247Ci0JcHJvdGVjdGVkIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uIHhtbE1lbnVFeHBhbmRBY3Rpb247Ci0JcHJvdGVjdGVkIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uIHhtbE1lbnVDb2xsYXBzZUFjdGlvbjsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb250cmlidXRpb25zKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdHJ5IHsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzFfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMl9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBWQUxJREFURV9YTUxfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgUkVMT0FEX0dSQU1NQVJfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgVE9HR0xFX0VESVRfTU9ERV9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBFWFBBTkRfQUxMX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIENPTExBUFNFX0FMTF9JRCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlbW92ZShJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCWlmIChtYW5hZ2VyLmZpbmQoaWQpICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZShpZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJaW5pdChiYXJzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRibSA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQotCQlJTWVudU1hbmFnZXIgeG1sTWVudSA9IGJhcnMuZ2V0TWVudU1hbmFnZXIoKS5maW5kTWVudVVzaW5nUGF0aCgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5kZXNpZ24ueG1sbWVudSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHhtbE1lbnUgPT0gbnVsbCkgewotCQkJeG1sTWVudSA9IG5ldyBNZW51TWFuYWdlcihYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wLCAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5kZXNpZ24ueG1sbWVudSIpOyAvLyROT04tTkxTLTEkCi0JCQliYXJzLmdldE1lbnVNYW5hZ2VyKCkuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9XSU5ET1csIHhtbE1lbnUpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ29udHJpYnV0aW9ucyh4bWxNZW51KTsKLQkJfQotCi0JCXRibS5hZGQobmV3IFNlcGFyYXRvcigiREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMV9JRCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFZhbGlkYXRlWE1MQWN0aW9uCi0JCS8vICAgICAgICAgICAgICAgICAgICAgICAgCi0JCS8vIHVnbHkgaGFjayAuLi4gd2UgZG9uJ3QgY29udHJpYnV0ZSB0aGUgZ2VuZXJpYyBYTUwgdmFsaWRhdG9yIGlmIHdlCi0JCS8vIGFscmVhZHkKLQkJLy8gaGF2ZSBhIERBRCB2YWxpZGF0b3IgY29udHJpYnV0aW9uIChpbiB0aGUgY2FzZSBvZiB0aGUgREFEIGVkaXRvcikuCi0JCS8vIFRoaXMgaGFjayB3aWxsIGJlIHJlbW92ZWQgd2hlbiBkZWZlY3QgMjEyNDQ4IGlzIGZpeGVkLgotCQkvLwotCQkvLwkJaWYgKHRibS5maW5kKCJ2YWxpZGF0ZS5kYWQudmFsaWRhdGVEQUQiKSA9PSBudWxsKSB7Ci0JCS8vCQkJdmFsaWRhdGVYTUxBY3Rpb24gPSBuZXcgVmFsaWRhdGVYTUxBY3Rpb24oKTsKLQkJLy8JCQl0Ym0uYWRkKHZhbGlkYXRlWE1MQWN0aW9uKTsKLQkJLy8JCQl4bWxNZW51LmFkZCh2YWxpZGF0ZVhNTEFjdGlvbik7Ci0JCS8vCQl9Ci0KLQkJLy8gVG9nZ2xlRWRpdE1vZGVBY3Rpb24KLQkJLy8gICAgICAgICAgIAotCQl0b2dnbGVBY3Rpb24gPSBuZXcgVG9nZ2xlRWRpdE1vZGVBY3Rpb24oKTsKLQkJdG9nZ2xlQWN0aW9uLnNldElkKFRPR0dMRV9FRElUX01PREVfSUQpOwotCQl4bWxNZW51LmFkZCh0b2dnbGVBY3Rpb24pOwotCQl0Ym0uYWRkKHRvZ2dsZUFjdGlvbik7Ci0KLQkJLy8gUmVsb2FkR3JhbW1hckFjdGlvbgotCQkvLwotCQlyZWxvYWRHcmFtbWFyQWN0aW9uID0gbmV3IFJlbG9hZEdyYW1tYXJBY3Rpb24oKTsKLQkJcmVsb2FkR3JhbW1hckFjdGlvbi5zZXRJZChSRUxPQURfR1JBTU1BUl9JRCk7Ci0JCXRibS5hZGQocmVsb2FkR3JhbW1hckFjdGlvbik7Ci0JCXhtbE1lbnUuYWRkKHJlbG9hZEdyYW1tYXJBY3Rpb24pOwotCi0JCXhtbE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJLy8gRXhwYW5kQ29sbGFwc2VBY3Rpb24KLQkJLy8KLQkJeG1sTWVudUV4cGFuZEFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbih0cnVlKTsKLQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRJZChFWFBBTkRfQUxMX0lEKTsKLQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzEpOyAvLyROT04tTkxTLTEkCi0JCXhtbE1lbnUuYWRkKHhtbE1lbnVFeHBhbmRBY3Rpb24pOwotCi0JCXhtbE1lbnVDb2xsYXBzZUFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbihmYWxzZSk7Ci0JCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRJZChDT0xMQVBTRV9BTExfSUQpOwotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0SWQoRVhQQU5EX0FMTF9JRCk7Ci0JCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzIpOyAvLyROT04tTkxTLTEkCi0JCXhtbE1lbnUuYWRkKHhtbE1lbnVDb2xsYXBzZUFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uV2l0aElkKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgQWN0aW9uIGFjdGlvbiwgU3RyaW5nIGlkKSB7Ci0JCWFjdGlvbi5zZXRJZChpZCk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnMoSUFjdGlvbkJhcnMgYmFycykgewotCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gYmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMl9JRCkpOwotCi0JCWV4cGFuZEFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbih0cnVlKTsKLQkJZXhwYW5kQWN0aW9uLnNldElkKEVYUEFORF9BTExfSUQpOwotCQl0Ym0uYWRkKGV4cGFuZEFjdGlvbik7Ci0KLQkJY29sbGFwc2VBY3Rpb24gPSBuZXcgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24oZmFsc2UpOwotCQljb2xsYXBzZUFjdGlvbi5zZXRJZChDT0xMQVBTRV9BTExfSUQpOwotCQl0Ym0uYWRkKGNvbGxhcHNlQWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoZXhwYW5kQWN0aW9uICE9IG51bGwpIHsKLQkJCWV4cGFuZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJaWYgKGNvbGxhcHNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWNvbGxhcHNlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZWRpdG9yUGFydCA9IHRhcmdldEVkaXRvcjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZ2V0TW9kZWxGb3JFZGl0b3JQYXJ0KHRhcmdldEVkaXRvcik7Ci0JCXJlbG9hZEdyYW1tYXJBY3Rpb24uc2V0TW9kZWwobW9kZWwpOwotCQl0b2dnbGVBY3Rpb24uc2V0TW9kZWxRdWVyeShNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKSk7Ci0KLQkJWE1MVGFibGVUcmVlVmlld2VyIHRhYmxlVHJlZVZpZXdlciA9IGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoZWRpdG9yUGFydCk7Ci0JCWlmICh0YWJsZVRyZWVWaWV3ZXIgIT0gbnVsbCkgewotCQkJZXhwYW5kQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCQkJY29sbGFwc2VBY3Rpb24uc2V0Vmlld2VyKHRhYmxlVHJlZVZpZXdlcik7Ci0KLQkJCXhtbE1lbnVFeHBhbmRBY3Rpb24uc2V0Vmlld2VyKHRhYmxlVHJlZVZpZXdlcik7Ci0JCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0Vmlld2VyKHRhYmxlVHJlZVZpZXdlcik7Ci0JCX0KLQotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvclBhcnQpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gZWRpdG9yUGFydC5nZXRTaXRlKCk7Ci0JCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIElFZGl0b3JTaXRlKSB7Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9ICgoWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgZWRpdG9yUGFydCkuZ2V0VGV4dEVkaXRvcigpOwotCQkJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSAoKElFZGl0b3JTaXRlKSBzaXRlKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBUT0RPLi4uIHVuY29tbWVudCB0aGlzIGFuZCBpbnZlc3RpZ2F0ZSBOUEUKLQkJLy8KLQkJLy8gYWRkIHRoZSBjdXQvY29weS9wYXN0ZSBmb3IgdGV4dCBmaWVsZHMKLQkJLy8gQWN0aW9uSGFuZGxlclBsdWdpbi5jb25uZWN0UGFydChlZGl0b3JQYXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSWQpIHsKLQkJcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklkKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgewotCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgdGV4dEVkaXRvciA9ICgoWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgdGFyZ2V0RWRpdG9yKS5nZXRUZXh0RWRpdG9yKCk7Ci0JCQlyZXN1bHQgPSAodGV4dEVkaXRvciAhPSBudWxsKSA/IHRleHRFZGl0b3IuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MVGFibGVUcmVlVmlld2VyIGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCVhNTFRhYmxlVHJlZVZpZXdlciByZXN1bHQgPSBudWxsOwotCQlPYmplY3Qgb2JqZWN0ID0gdGFyZ2V0RWRpdG9yLmdldEFkYXB0ZXIoSURlc2lnblZpZXdlci5jbGFzcyk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBYTUxUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXJlc3VsdCA9IChYTUxUYWJsZVRyZWVWaWV3ZXIpIG9iamVjdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVG9nZ2xlRWRpdE1vZGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIG9uSW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX0VUT09MX0NPTlNUUkFJTk9OKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBvZmZJbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfQ09OU1RSQUlOT0ZGKTsKLQkJcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCQlwdWJsaWMgVG9nZ2xlRWRpdE1vZGVBY3Rpb24oKSB7Ci0JCQlzZXRBcHBlYXJhbmNlRm9yRWRpdE1vZGUoTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlpbnQgbmV3U3RhdGUgPSBnZXROZXh0U3RhdGUobW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpKTsKLQkJCQltb2RlbFF1ZXJ5LnNldEVkaXRNb2RlKG5ld1N0YXRlKTsKLQkJCQlzZXRBcHBlYXJhbmNlRm9yRWRpdE1vZGUobmV3U3RhdGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TW9kZWxRdWVyeShNb2RlbFF1ZXJ5IG5ld01vZGVsUXVlcnkpIHsKLQkJCW1vZGVsUXVlcnkgPSBuZXdNb2RlbFF1ZXJ5OwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0QXBwZWFyYW5jZUZvckVkaXRNb2RlKGludCBlZGl0TW9kZSkgewotCQkJaWYgKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgewotCQkJCXNldFRvb2xUaXBUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzMpOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl80KTsgLy8kTk9OLU5MUy0xJAotCQkJCXNldEltYWdlRGVzY3JpcHRvcihvbkltYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0VG9vbFRpcFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzYpOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKG9mZkltYWdlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TmV4dFN0YXRlKGludCBlZGl0TW9kZSkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCQkJaWYgKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgewotCQkJCXJlc3VsdCA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVDsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIGNsYXNzIFJlbG9hZEdyYW1tYXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQotCQlwdWJsaWMgUmVsb2FkR3JhbW1hckFjdGlvbigpIHsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRFRPT0xfUkxER1JNUikpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfUkxER1JNUikpOwotCQkJc2V0VG9vbFRpcFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNyk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfOCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCXRoaXMubW9kZWwgPSBuZXdNb2RlbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShtb2RlbCk7Ci0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCAmJiBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCQltb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkuZ2V0Q01Eb2N1bWVudENhY2hlKCkuY2xlYXIoKTsKLQkJCQkJLy8gVE9ETy4uLiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFjY2VzcyB0aGUKLQkJCQkJLy8gRE9NT2JzZXJ2ZXIgdmlhIE1vZGVsUXVlcnkKLQkJCQkJLy8gIC4uLndoeT8KLQkJCQkJQ01Eb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKGRvY3VtZW50LCBtb2RlbFF1ZXJ5KTsKLQkJCQkJbG9hZGVyLmxvYWRDTURvY3VtZW50cygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNzJmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIsIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIENNRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlcjsKLQotCVN0cnVjdHVyZWRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0KLQlwcml2YXRlIFRyZWVDb250ZW50SGVscGVyIHRyZWVDb250ZW50SGVscGVyID0gbmV3IFRyZWVDb250ZW50SGVscGVyKCk7Ci0KLQlwdWJsaWMgWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vCi0JLy8gSUxhYmVsUHJvdmlkZXIgc3R1ZmYKLQkvLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gc2luY2Ugd2UgYWx3YXlzIHJldHVybiAnZmFsc2UnIGZvciAiaXNMYWJlbFByb3BlcnR5IiwKLQkJLy8gbm90IG5lZWQgdG8gbGlzdGVuLiBNYXliZSB0aGF0IHNob3VsZCBjaGFuZ2Ugc29tZSBkYXk/Ci0JfQotCi0JLy8gQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcgotCS8vCi0JcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQlkb0RlbGF5ZWRSZWZyZXNoRm9yVmlld2VycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNhY2hlVXBkYXRlZChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIGZpbmFsIFN0cmluZyB1cmksIGludCBvbGRTdGF0dXMsIGludCBuZXdTdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlpZiAobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEIHx8IG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSB7Ci0JCQlkb0RlbGF5ZWRSZWZyZXNoRm9yVmlld2VycygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9EZWxheWVkUmVmcmVzaEZvclZpZXdlcnMoKSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwgJiYgIWZWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJZlZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZlZpZXdlciAhPSBudWxsICYmICFmVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCWZWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikKLQkJCSgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCXJldHVybiB0cmVlQ29udGVudEhlbHBlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiAoY29sdW1uSW5kZXggPT0gMCkgPyBnZXRJbWFnZShvYmplY3QpIDogbnVsbDsKLQl9Ci0KLQkvLwotCS8vIElUYWJsZUxhYmVsUHJvdmlkZXIgc3R1ZmYKLQkvLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoY29sdW1uID09IDApIHsKLQkJCXJlc3VsdCA9IGdldFRleHQob2JqZWN0KTsKLQkJfQotCQllbHNlIGlmIChjb2x1bW4gPT0gMSAmJiBvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXN1bHQgPSB0cmVlQ29udGVudEhlbHBlci5nZXROb2RlVmFsdWUoKE5vZGUpIG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKQotCQkJKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCi0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQ0RBVEFTRUNUSU9OKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9DT01NRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9ET0NUWVBFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9FTEVNRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1RYVEVYVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCS8vIEltYWdlIG1hcmtlck92ZXJsYXlJbWFnZSA9Ci0JCQkvLyBvdmVybGF5SWNvbk1hbmFnZXIuZ2V0T3ZlcmxheUltYWdlRm9yT2JqZWN0KG5vZGUpOwotCQkJLy8gaWYgKG1hcmtlck92ZXJsYXlJbWFnZSAhPSBudWxsKSB7Ci0JCQkvLyBpbWFnZSA9IGltYWdlRmFjdG9yeS5jcmVhdGVDb21wb3NpdGVJbWFnZShpbWFnZSwKLQkJCS8vIG1hcmtlck92ZXJsYXlJbWFnZSwgSW1hZ2VGYWN0b3J5LkJPVFRPTV9MRUZUKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKQotCQkJKChJTm9kZU5vdGlmaWVyKSBvKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgbzsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCXJlc3VsdCA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotCi0JCWZvciAoTm9kZSBjaGlsZE5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkTm9kZSAhPSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcm9vdEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikKLQkJCSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gIkRPQ1RZUEUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlyZXN1bHQgPSAoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyByZW1vdmUgb3VyIGxpc3RlbmVycyB0byB0aGUgb2xkIHN0YXRlCi0JCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudCBkb21Eb2MgPSAoRG9jdW1lbnQpIG9sZElucHV0OwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9tRG9jKTsKLQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnRNYW5hZ2VyID0gbXEuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQlpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChvbGRJbnB1dCAhPSBudWxsICYmIG9sZElucHV0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJRE9NTm9kZSkgb2xkSW5wdXQpLmdldE1vZGVsKCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5yZW1vdmVMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJZlZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXI7Ci0JCX0KLQotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSURPTU5vZGUpIG5ld0lucHV0KS5nZXRNb2RlbCgpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudCBkb21Eb2MgPSAoRG9jdW1lbnQpIG5ld0lucHV0OwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9tRG9jKTsKLQotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQlkb2N1bWVudE1hbmFnZXIgPSBtcS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FTWU5DX0xPQUQsIHRydWUpOwotCQkJCQlkb2N1bWVudE1hbmFnZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGhhbmRsZSBmaWx0ZXJpbmcgYXNwZWN0cyBvZiB0aGUgdmlld2VyCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlVGV4dChOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlTdHJpbmcgZGF0YSA9ICgoVGV4dCkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCXJlc3VsdCA9IChkYXRhID09IG51bGwgfHwgZGF0YS50cmltKCkubGVuZ3RoKCkgPT0gMCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJZG9EZWxheWVkUmVmcmVzaEZvclZpZXdlcnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gc2luY2Ugd2UgYWx3YXlzIHJldHVybiAnZmFsc2UnIGZvciAiaXNMYWJlbFByb3BlcnR5IiwKLQkJLy8gbm90IG5lZWQgdG8gbGlzdGVuLiBNYXliZSB0aGF0IHNob3VsZCBjaGFuZ2Ugc29tZSBkYXk/Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzlhMzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotCi0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIFRhYmxlVHJlZSB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZCBvciBleHRlbmRlZC4KLSAqIDwvcD4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxUYWJsZVRyZWVIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gWE1MIERlc2lnbiBWaWV3Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFU0lHTl9WSUVXX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMzAwMCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmMyYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5IGV4dGVuZHMgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvckhlbHBlcihTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCVN0cmluZ1tdIHZhbHVlc0FycmF5ID0gbnVsbDsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCXZhbHVlc0FycmF5ID0gbXEuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhlbGVtZW50LCBjbU5vZGUpOwotCQl9Ci0JCWlmICh2YWx1ZXNBcnJheSAhPSBudWxsICYmIHZhbHVlc0FycmF5Lmxlbmd0aCA+IDApIHsKLQkJCXJlc3VsdCA9IG5ldyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIHZhbHVlc0FycmF5KTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoVGV4dCB0ZXh0KSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJTm9kZSBwYXJlbnROb2RlID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHRleHQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ySGVscGVyKEhBQ0ssIHBhcmVudEVsZW1lbnQsIGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IocGFyZW50RWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSywgSEFDSyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUF0dHJpYnV0ZVByb3BlcnR5RGVzY3JpcHRvcihBdHRyIGF0dHIpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gbnVsbDsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWFkID0gbXEuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLQkJfQotCQlpZiAoYWQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ySGVscGVyKGF0dHJpYnV0ZU5hbWUsIGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIGFkKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSB0cmVlQ29udGVudEhlbHBlci5nZXRFZmZlY3RpdmVUZXh0Tm9kZUZvckNvbWJpbmVkTm9kZUxpc3QobGlzdCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcih0ZXh0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSywgSEFDSyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyYThkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kLlhNTERyYWdBbmREcm9wTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgaW1wbGVtZW50cyBJRGVzaWduVmlld2VyIHsKLQotCWNsYXNzIE5vZGVBY3Rpb25NZW51TGlzdGVuZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJLy8gdXNlZCB0byBkaXNhYmxlIE5vZGVTZWxlY3Rpb24gbGlzdGVuaW5nIHdoaWxlIHJ1bm5pbmcKLQkJCS8vIE5vZGVBY3Rpb24KLQkJCVhNTE5vZGVBY3Rpb25NYW5hZ2VyIG5vZGVBY3Rpb25NYW5hZ2VyID0gbmV3IFhNTE5vZGVBY3Rpb25NYW5hZ2VyKCgoSURPTURvY3VtZW50KSBnZXRJbnB1dCgpKS5nZXRNb2RlbCgpLCBYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcykgewotCQkJCXB1YmxpYyB2b2lkIGJlZ2luTm9kZUFjdGlvbihOb2RlQWN0aW9uIGFjdGlvbikgewotCQkJCQlzdXBlci5iZWdpbk5vZGVBY3Rpb24oYWN0aW9uKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBlbmROb2RlQWN0aW9uKE5vZGVBY3Rpb24gYWN0aW9uKSB7Ci0JCQkJCXN1cGVyLmVuZE5vZGVBY3Rpb24oYWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQkJbm9kZUFjdGlvbk1hbmFnZXIuZmlsbENvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JaW50IGNvdW50ID0gMDsKLQotCXByb3RlY3RlZCBYTUxUcmVlRXh0ZW5zaW9uIHRyZWVFeHRlbnNpb247Ci0KLQlwdWJsaWMgWE1MVGFibGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0JCS8vIHNldCB1cCBwcm92aWRlcnMKLQkJdGhpcy50cmVlRXh0ZW5zaW9uID0gbmV3IFhNTFRyZWVFeHRlbnNpb24oZ2V0VHJlZSgpKTsKLQotCQlYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCXNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCi0JCWNyZWF0ZUNvbnRleHRNZW51KCk7Ci0KLQkJWE1MRHJhZ0FuZERyb3BNYW5hZ2VyLmFkZERyYWdBbmREcm9wU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsCi0JICogcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudSgpIHsKLQkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE5vZGVBY3Rpb25NZW51TGlzdGVuZXIoKSk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KGdldENvbnRyb2woKSk7Ci0JCWdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaChPYmplY3QgbywgYm9vbGVhbiBmcm9tRGVsYXllZCkgewotCQl0cmVlRXh0ZW5zaW9uLnJlc2V0Q2FjaGVkRGF0YSgpOwotCQlzdXBlci5yZWZyZXNoKG8pOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVWaWV3ZXJfMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEaXNwb3NlKERpc3Bvc2VFdmVudCBldmVudCkgewotCQlzdXBlci5oYW5kbGVEaXNwb3NlKGV2ZW50KTsKLQkJdHJlZUV4dGVuc2lvbi5kaXNwb3NlKCk7Ci0JCXNldERvY3VtZW50KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBvKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2gobyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2goYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLQkJdHJlZUV4dGVuc2lvbi5yZXNldENhY2hlZERhdGEoKTsKLQkJc3VwZXIucmVmcmVzaCh1cGRhdGVMYWJlbHMpOwotCQlnZXRDb250cm9sKCkucmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2goZWxlbWVudCwgdXBkYXRlTGFiZWxzKTsKLQkJZ2V0Q29udHJvbCgpLnJlZHJhdygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvKgotCQkgKiBsZXQgdGhlIHRleHQgZWRpdG9yIHRvIGJlIHRoZSBvbmUgdGhhdCBtYW5hZ2VzIHRoZSBtb2RlbCdzIGxpZmV0aW1lCi0JCSAqLwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0KLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJRG9jdW1lbnQgZG9tRG9jID0gbnVsbDsKLQkJCQlkb21Eb2MgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJc2V0SW5wdXQoZG9tRG9jKTsKLQkJCQl0cmVlRXh0ZW5zaW9uLnNldElzVW5zdXBwb3J0ZWRJbnB1dChmYWxzZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0cmVlRXh0ZW5zaW9uLnNldElzVW5zdXBwb3J0ZWRJbnB1dCh0cnVlKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRyZWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRyZWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NWZhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUcmVlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhNTFRyZWVFeHRlbnNpb24gZXh0ZW5kcyBUcmVlRXh0ZW5zaW9uIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUlVDVFVSRV9QUk9QRVJUWSA9IFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9IFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLQlwcm90ZWN0ZWQgTXlDZWxsTW9kaWZpZXIgbW9kaWZpZXI7Ci0JcHJvdGVjdGVkIFhNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkgcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeTsKLQlwcm90ZWN0ZWQgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQlwcm90ZWN0ZWQgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXByb3RlY3RlZCBDb2xvciBmMSwgZjIsIGIxLCBiMjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYWNoZWREYXRhSXNWYWxpZCA9IHRydWU7Ci0KLQlwdWJsaWMgWE1MVHJlZUV4dGVuc2lvbihUcmVlIHRyZWUpIHsKLQkJc3VwZXIodHJlZSk7Ci0JCWNvbnRyb2wgPSB0cmVlOwotCQltb2RpZmllciA9IG5ldyBNeUNlbGxNb2RpZmllcigpOwotCQlzZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCQlTdHJpbmdbXSBwcm9wZXJ0aWVzID0ge1NUUlVDVFVSRV9QUk9QRVJUWSwgVkFMVUVfUFJPUEVSVFl9OwotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCi0JCWYxID0gdHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCi0JCWludCByID0gTWF0aC5hYnMoYmFja2dyb3VuZC5nZXRSZWQoKSAtIDEyNSk7Ci0JCWludCBnID0gTWF0aC5hYnMoYmFja2dyb3VuZC5nZXRHcmVlbigpIC0gODUpOwotCQlpbnQgYiA9IE1hdGguYWJzKGJhY2tncm91bmQuZ2V0Qmx1ZSgpIC0gMTA1KTsKLQotCQlmMiA9IG5ldyBDb2xvcih0cmVlLmdldERpc3BsYXkoKSwgciwgZywgYik7Ci0JCWIxID0gdHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OKTsKLQkJYjIgPSBiYWNrZ3JvdW5kOwotCi0JCXByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkgPSBuZXcgWE1MVGFibGVUcmVlUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZjIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0Q2FjaGVkRGF0YSgpIHsKLQkJY2FjaGVkRGF0YUlzVmFsaWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludEl0ZW1zKEdDIGdjLCBUcmVlSXRlbVtdIGl0ZW1zLCBSZWN0YW5nbGUgdHJlZUJvdW5kcykgewotCQlzdXBlci5wYWludEl0ZW1zKGdjLCBpdGVtcywgdHJlZUJvdW5kcyk7Ci0JCWNhY2hlZERhdGFJc1ZhbGlkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gY29tcHV0ZVRyZWVFeHRlbnNpb25EYXRhKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sb3IgY29sb3IgPSBmMTsKLQkJU3RyaW5nIHN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJc3RyaW5nID0gKFN0cmluZykgbW9kaWZpZXIuZ2V0VmFsdWUob2JqZWN0LCBWQUxVRV9QUk9QRVJUWSk7Ci0JCQljb2xvciA9IGYxOwotCQl9Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCAmJiBvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlzdHJpbmcgPSBnZXRFbGVtZW50VmFsdWVIZWxwZXIoKEVsZW1lbnQpIG9iamVjdCk7Ci0JCQljb2xvciA9IGYyOwotCQl9Ci0JCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0WzJdOwotCQlkYXRhWzBdID0gc3RyaW5nOwotCQlkYXRhWzFdID0gY29sb3I7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50SXRlbShHQyBnYywgVHJlZUl0ZW0gaXRlbSwgUmVjdGFuZ2xlIGJvdW5kcykgewotCQlzdXBlci5wYWludEl0ZW0oZ2MsIGl0ZW0sIGJvdW5kcyk7Ci0JCU9iamVjdFtdIGRhdGEgPSBjb21wdXRlVHJlZUV4dGVuc2lvbkRhdGEoaXRlbS5nZXREYXRhKCkpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoID09IDIpIHsKLQkJCWdjLnNldENsaXBwaW5nKGNvbHVtblBvc2l0aW9uLCBib3VuZHMueSArIDEsIGNvbnRyb2xXaWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChDb2xvcikgZGF0YVsxXSk7Ci0JCQlnYy5kcmF3U3RyaW5nKChTdHJpbmcpIGRhdGFbMF0sIGNvbHVtblBvc2l0aW9uICsgNSwgYm91bmRzLnkgKyAxKTsKLQkJCWdjLnNldENsaXBwaW5nKChSZWN0YW5nbGUpIG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlUcmVlTWVzc2FnZShHQyBnYykgewotCQkvLyBoZXJlIHdlIHByaW50IGEgbWVzc2FnZSB3aGVuIHRoZSBkb2N1bWVudCBpcyBlbXB0eSBqdXN0IHRvIGdpdmUgdGhlCi0JCS8vIHVzZXIgYSB2aXN1YWwgY3VlCi0JCS8vIHNvIHRoYXQgdGhleSBrbm93IGhvdyB0byBwcm9jZWVkIHRvIGVkaXQgdGhlIGJsYW5rIHZpZXcKLQkJZ2Muc2V0Rm9yZWdyb3VuZChmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJZ2MuZHJhd1N0cmluZyhYTUxFZGl0b3JNZXNzYWdlcy5YTUxUcmVlRXh0ZW5zaW9uXzMsIDEwLCAxMCk7Ci0JCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl80LCAxMCwgMTAgKyBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRWYWx1ZUhlbHBlcihFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgbXEgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChlZCAhPSBudWxsICYmICFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJpc0luZmVycmVkIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBkZWNyaXB0aW9uQnVpbGRlci5idWlsZERlc2NyaXB0aW9uKGVkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBNeUNlbGxNb2RpZmllciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIsIFRyZWVFeHRlbnNpb24uSUNlbGxFZGl0b3JQcm92aWRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQkJcmVzdWx0ID0gcHJvcGVydHkgPT0gVkFMVUVfUFJPUEVSVFkgJiYgdHJlZUNvbnRlbnRIZWxwZXIuaXNFZGl0YWJsZShub2RlKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlc3VsdCA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgb2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiAocmVzdWx0ICE9IG51bGwpID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCS8vIGVuYWJsZU5vZGVTZWxlY3Rpb25MaXN0ZW5lcihmYWxzZSk7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgZWxlbWVudDsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgaXRlbS5nZXREYXRhKCkpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmICFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJdHJlZUNvbnRlbnRIZWxwZXIuc2V0Tm9kZVZhbHVlKChOb2RlKSBpdGVtLmdldERhdGEoKSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQkvLyBlbmFibGVOb2RlU2VsZWN0aW9uTGlzdGVuZXIodHJ1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBvLCBpbnQgY29sKSB7Ci0JCQlJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3Iobyk7Ci0JCQlyZXR1cm4gcGQgIT0gbnVsbCA/IHBkLmNyZWF0ZVByb3BlcnR5RWRpdG9yKGNvbnRyb2wpIDogbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDJjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ueG1sdmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFVEFJTFNfSU5GT1JNQVRJT05fVU5BVkFJTEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NBVkVfRElSVFlfRklMRV9NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TQVZFX0RJUlRZX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0VGFibGVWaWV3ZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdFRhYmxlVmlld2VyXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8zOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvckFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDU3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRGaWxlRXJyb3JBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlCi17Ci0gIHByb3RlY3RlZCBJTWFya2VyIHNlbGVjdGVkTWFya2VyOwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBSZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3RlZE1hcmtlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgCQotICAgICAgICBNYXAgbWFwID0gKE1hcCkgc2VsZWN0ZWRNYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRTZXNzaW9uUHJvcGVydHkoVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUpOwotICAgICAgICBpZiAobWFwID09IG51bGwpCi0gICAgICAgIHsKLQkJCVN0cmluZyBpbmZvVW5hdmFpbGFibGUgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfREVUQUlMU19JTkZPUk1BVElPTl9VTkFWQUlMQUJMRTsKLQkJCVN0cmluZyByZXZhbGlkYXRlVG9SZWdlbmVyYXRlRXJyb3JzID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEU7Ci0gICAgICAgIAlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBpbmZvVW5hdmFpbGFibGUsIHJldmFsaWRhdGVUb1JlZ2VuZXJhdGVFcnJvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB1cmkgPSBudWxsOwotCi0gICAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IChTdHJpbmcpIHNlbGVjdGVkTWFya2VyLmdldEF0dHJpYnV0ZSgiZ3JvdXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoInJlZmVyZW5jZWRGaWxlRXJyb3IiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmRleDEgPSBncm91cE5hbWUuaW5kZXhPZigiKCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpbnQgaW5kZXgyID0gZ3JvdXBOYW1lLmxhc3RJbmRleE9mKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpbmRleDEgIT0gLTEgJiYgaW5kZXgyID4gaW5kZXgxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1cmkgPSBncm91cE5hbWUuc3Vic3RyaW5nKGluZGV4MSArIDEsIGluZGV4Mik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLSAgICAgICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpIG1hcC5nZXQodXJpKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxpc3QgPSBtZXNzYWdlLmdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0ZWRGaWxlVVJJID0gc2VsZWN0ZWRNYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsvL1VSSUhlbHBlci5ub3JtYWxpemUoc2VsZWN0ZWRNYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICB2YWxpZGF0ZWRGaWxlVVJJID0gImZpbGU6LyIgKyB2YWxpZGF0ZWRGaWxlVVJJOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cgZGlhbG9nID0gbmV3IFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgbGlzdCwgdmFsaWRhdGVkRmlsZVVSSSwgdXJpKTsKLSAgICAgICAgICAgIGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgIAkvLyBEbyBub3RoaW5nLgotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbGVjdGlvbik7Ci0gICAgc2VsZWN0ZWRNYXJrZXIgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGZpcnN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIElNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpZmlyc3Q7Ci0gICAgICAgIHNlbGVjdGVkTWFya2VyID0gbWFya2VyOwotLy8gICAgICAgIFN0cmluZyBncm91cE5hbWUgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKCJncm91cE5hbWUiKTsKLS8vICAgICAgICBpZiAoZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoInJlZmVyZW5jZWRGaWxlRXJyb3IiKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBzZWxlY3RlZE1hcmtlciA9IG1hcmtlcjsKLS8vICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgCS8vIERvIG5vdGhpbmcuCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KQotICB7Ci0gICAvL2R3IGludCBpID0gMDsKLSAgfQotfQotCi0vKgotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRNYXAoTWFwIG1hcCkKLQl7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW50cnkgOiAiICsga2V5ICsgIiA9ICIgKyBtYXAuZ2V0KGtleSkpOwotCQl9Ci0JfQotICAKLQlwcml2YXRlIHZvaWQgcHJpbnRFcnJvck1hcChNYXAgbWFwKQotCXsKLQkJZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJRXJyb3JNZXNzYWdlIG1lc3NhZ2UgPSAoRXJyb3JNZXNzYWdlKSBtYXAuZ2V0KGtleSk7Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJewotCQkJCXByaW50RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotICAKLQlwcml2YXRlIHZvaWQgcHJpbnRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSkKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1lc3NhZ2UuZ2V0VGV4dCgpKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZXJyb3JNZXNzYWdlLmdldE5lc3RlZEVycm9ycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJcHJpbnRFcnJvck1lc3NhZ2UoKEVycm9yTWVzc2FnZSkgaS5uZXh0KCkpOwotCQl9Ci0JfQotICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0NjVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvblVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIFRhc2tMaXN0VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0gIHByb3RlY3RlZCBMaXN0IGVycm9yTGlzdDsKLSAgcHJvdGVjdGVkIFN0cmluZyBtYXJrZWRVcERldGFpbHNNZXNzYWdlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHRGaWxlOwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRGaWxlOwotICBwcm90ZWN0ZWQgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotICBwcm90ZWN0ZWQgVGV4dCBmdWxsRmlsZU5hbWVGaWVsZDsKLQotICBwdWJsaWMgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTGlzdCBlcnJvckxpc3QsIFN0cmluZyBjb250ZXh0RmlsZSwgU3RyaW5nIHJlZmVyZW5jZWRGaWxlKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotCi0gICAgaW50IHN0eWxlQml0cyA9IGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkU7Ci0gICAgc3R5bGVCaXRzICY9IH5TV1QuQVBQTElDQVRJT05fTU9EQUw7Ci0KLSAgICBzZXRTaGVsbFN0eWxlKHN0eWxlQml0cyk7Ci0gICAgdGhpcy5lcnJvckxpc3QgPSBlcnJvckxpc3Q7Ci0KLSAgICB0aGlzLnJlZmVyZW5jZWRGaWxlID0gcmVmZXJlbmNlZEZpbGU7Ci0gICAgdGhpcy5jb250ZXh0RmlsZSA9IGNvbnRleHRGaWxlOwotICAgIHRoaXMubWFya2VkVXBEZXRhaWxzTWVzc2FnZSA9IGdldE1hcmtlZFVwRGV0YWlsc01lc3NhZ2UoKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLSAgICBjcmVhdGUoKTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQoWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuX1VJX1JFRl9GSUxFX0VSUk9SX0RFVEFJTFMpOwotCQotICAgIHNldEJsb2NrT25PcGVuKGZhbHNlKTsKLSAgICByZXR1cm4gb3BlbigpOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBmdWxsRmlsZU5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGZ1bGxGaWxlTmFtZUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGZ1bGxGaWxlTmFtZUZpZWxkLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0gICAgZnVsbEZpbGVOYW1lRmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgc3VwZXIuY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgZGlhbG9nQXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIGMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGMuc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YSh0cnVlLCAtMSwgMjAwKSk7Ci0KLSAgICBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoYywgU1dULk1VTFRJIHwgU1dULldSQVApOwotICAgIHN0eWxlZFRleHQuc2V0QmFja2dyb3VuZChjLmdldEJhY2tncm91bmQoKSk7Ci0gICAgc2V0U3R5bGVkVGV4dChzdHlsZWRUZXh0LCBtYXJrZWRVcERldGFpbHNNZXNzYWdlKTsKLSAgICBzdHlsZWRUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBzdHlsZWRUZXh0LnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEoZmFsc2UsIDY1MCwgLTEpKTsKLQotICAgIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyKCk7Ci0gICAgc3R5bGVkVGV4dC5hZGRNb3VzZU1vdmVMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLQotICAgIHRhYmxlVmlld2VyID0gbmV3IFRhc2tMaXN0VGFibGVWaWV3ZXIoYywgMTApOwotICAgIHRhYmxlVmlld2VyLnNldElucHV0KGVycm9yTGlzdCk7Ci0gICAgdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJbnRlcm5hbFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotICAgIHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKHRydWUsIDcwMCwgLTEpKTsKLSAgICByZXR1cm4gZGlhbG9nQXJlYTsKLSAgfQotCi0gIFN0cmluZyBnZXRGdWxsVVJJKGludCBvZmZzZXQpCi0gIHsKLSAgICBTdHJpbmcgdXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbnQgaW5kZXggPSBnZXRJbmRleChvZmZzZXQpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAyIHx8IGluZGV4ID09IDMpCi0gICAgICB7Ci0gICAgICAgIHVyaSA9IHJlZmVyZW5jZWRGaWxlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB1cmkgPSBjb250ZXh0RmlsZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIHByaXZhdGUgaW50IGdldEluZGV4KGludCBvZmZzZXQpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgU3R5bGVSYW5nZVtdIHJhbmdlID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2UubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaW50IGwgPSByYW5nZVtpXS5zdGFydDsKLSAgICAgIGludCByID0gbCArIHJhbmdlW2ldLmxlbmd0aDsKLSAgICAgIGlmIChsIDw9IG9mZnNldCAmJiByID49IG9mZnNldCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBjbGFzcyBNb3VzZUxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VNb3ZlTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIFN0cmluZyB0b29sVGlwVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB0cnkKLSAgICAgIHsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICAgIHRvb2xUaXBUZXh0ID0gZ2V0RnVsbFVSSShvZmZzZXQpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgCS8vIERvIG5vdGhpbmcuCi0gICAgICB9Ci0gICAgICBzdHlsZWRUZXh0LnNldFRvb2xUaXBUZXh0KHRvb2xUaXBUZXh0KTsKLSAgICAgIGlmICh0b29sVGlwVGV4dCAhPSBudWxsICYmIHRvb2xUaXBUZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZnVsbEZpbGVOYW1lRmllbGQuc2V0VGV4dCh0b29sVGlwVGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWFya2VkVXBEZXRhaWxzTWVzc2FnZSgpCi0gIHsKLQlTdHJpbmcgZGV0YWlsc01lc3NhZ2UgPSAiIjsgIAkgLy8kTk9OLU5MUy0xJAotICAgIC8vIFRPRE8uLi4gbmVlZCB0byBtb3ZlICdfVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT04nIHRvIHRoaXMgcGx1Z2luJ3MgcHJvcGVydGllcyBmaWxlCi0gICAgLy8JCQkKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT047Ci0gICAgICAvLyBUT0RPLi4uIG5lZWQgdG8gZWRpdCB0aGUgcHJvcGVydGllcyBmaWxlIHRvIHJlbW92ZSAiJyIgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJpbmcKLSAgICAgIC8vIEknbSB1c2luZyB0aGVzZSBjaGFyYWN0ZXJzIHRvIG1hcmt1cCB0aGUgYm9sZCBmb250LiBJdCdzIHNhZmVyIGlmIEkgYWRkIHRoZXNlIHByb2dyYW10aWNhbGx5LgotICAgICAgLy8KLQkgIHN0cmluZyA9IHJlbW92ZVBhdHRlcm4oc3RyaW5nLCAiJyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIFN0cmluZyBjID0gIiciICsgZ2V0TGFzdFNlZ21lbnQoY29udGV4dEZpbGUpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIFN0cmluZyByID0gIiciICsgZ2V0TGFzdFNlZ21lbnQocmVmZXJlbmNlZEZpbGUpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgZGV0YWlsc01lc3NhZ2UgPSBOTFMuYmluZChzdHJpbmcsIG5ldyBPYmplY3RbXSB7IHIsIGMsIHIsIGMgfSk7ICAgIAotICAgIHJldHVybiBkZXRhaWxzTWVzc2FnZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHJlbW92ZVBhdHRlcm4oU3RyaW5nIHN0cmluZywgU3RyaW5nIHBhdHRlcm4pCi0gIHsKLSAgCXdoaWxlICh0cnVlKQotICAJewotICAJCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHBhdHRlcm4pOwotICAJCWlmIChpbmRleCAhPSAtMSkKLSAgCQl7Ci0gIAkJCXN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIHBhdHRlcm4ubGVuZ3RoKCkpOwotICAJCX0KLSAgCQllbHNlCi0gIAkJewotICAJCQlicmVhazsKLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gc3RyaW5nOyAgCQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldFN0eWxlZFRleHQoU3R5bGVkVGV4dCBzdHlsZWRUZXh0LCBTdHJpbmcgdGV4dCkKLSAgewotICAgIFN0cmluZyB2aXNpYmxlTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1hcmtlZFVwRGV0YWlsc01lc3NhZ2UsICInIiwgZmFsc2UpOyBzdC5oYXNNb3JlVG9rZW5zKCk7KSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB2aXNpYmxlTWVzc2FnZSArPSB0b2tlbjsKLSAgICB9Ci0KLSAgICBzdHlsZWRUZXh0LnNldFRleHQodmlzaWJsZU1lc3NhZ2UpOwotICAgLy9kdyBGb250IGZvbnQgPSBzdHlsZWRUZXh0LmdldEZvbnQoKTsKLQotICAgIGJvb2xlYW4gaW5RdW90ZSA9IGZhbHNlOwotICAgIGludCBwb3NpdGlvbiA9IDA7Ci0gICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1hcmtlZFVwRGV0YWlsc01lc3NhZ2UsICInIiwgdHJ1ZSk7IHN0Lmhhc01vcmVUb2tlbnMoKTspIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKLQotICAgICAgaWYgKHRva2VuLmVxdWFscygiJyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIGluUXVvdGUgPSAhaW5RdW90ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGluUXVvdGUpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIFN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShwb3NpdGlvbiwgdG9rZW4ubGVuZ3RoKCksIHN0eWxlZFRleHQuZ2V0Rm9yZWdyb3VuZCgpLCBzdHlsZWRUZXh0LmdldEJhY2tncm91bmQoKSwgU1dULkJPTEQpOwotICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBHcmlkRGF0YSBjcmVhdGVHcmlkRGF0YShib29sZWFuIGZpbGxCb3RoLCBpbnQgdywgaW50IGgpCi0gIHsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShmaWxsQm90aCA/IEdyaWREYXRhLkZJTExfQk9USCA6IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gdzsKLSAgICBnZC5oZWlnaHRIaW50ID0gaDsKLSAgICByZXR1cm4gZ2Q7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYXN0U2VnbWVudChTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHVyaTsKLSAgICBpbnQgaW5kZXggPSBNYXRoLm1heCh1cmkubGFzdEluZGV4T2YoIi8iKSwgdXJpLmxhc3RJbmRleE9mKCJcXCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB1cmlzdHJpbmcgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRVcmkoKTsKLSAgICAgICAgICBSZWZlcmVuY2VkRmlsZUVycm9yVXRpbGl0eS5vcGVuRWRpdG9yQW5kR290b0Vycm9yKHVyaXN0cmluZywgdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TGluZU51bWJlcigpLCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMGRmOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5sb2dnaW5nLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkKLXsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FZGl0b3JBbmRHb3RvRXJyb3IoU3RyaW5nIHVyaXN0cmluZywgZmluYWwgaW50IGxpbmUsIGZpbmFsIGludCBjb2x1bW4pCi0gIHsKLSAgICBpZiAodXJpc3RyaW5nICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmkgPSBuZXcgVVJMKHVyaXN0cmluZyk7Ci0gICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHVyaS5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoU3RyaW5nID0gdXJpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyaW5nKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwotICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmIGRldmljZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc2V0RGV2aWNlKGRldmljZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL1dvcmtiZW5jaFV0aWxpdHkub3BlbkVkaXRvcihmaWxlKTsKLSAgICAgICAgICAgICAgLy8gT3BlbiB0aGUgZWRpdG9yIGZvciB0aGlzIGZpbGUuCi0gICAgICAgICAgICAgIGZpbmFsIElGaWxlIGlGaWxlID0gZmlsZTsKLSAgICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgICBmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotICAgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMKLSAgICAgICAgICAgICAgKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihpRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgCVN0cmluZyBlZGl0b3JJZDsKLSAgICAgICAgICAgICAgICAgIAlpZihkZXNjcmlwdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAgICAgCSAgZWRpdG9ySWQgPSBkZXNjcmlwdG9yLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgCWVsc2UKLSAgICAgICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgICAgICAJICBlZGl0b3JJZCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKGlGaWxlLmdldE5hbWUoKSArICIudHh0IikuZ2V0SWQoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCBlZGl0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VySW5zdGFuY2UoKS5sb2dFcnJvcigiRXhjZXB0aW9uIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZSArICJcblxuIiwgZXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgIAkvL0IyQkdVSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZSArICJcblxuIiArIGV4KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IFdvcmtiZW5jaFV0aWxpdHkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgICBnb3RvRXJyb3IoZWRpdG9yUGFydCwgbGluZSwgY29sdW1uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgCS8vIERvIG5vdGhpbmcuCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHZvaWQgZ290b0Vycm9yKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIGludCBsaW5lLCBpbnQgY29sdW1uKQotICB7Ci0gICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoVGV4dEVkaXRvcikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKFRleHRFZGl0b3IuY2xhc3MpOwotICAgICAgaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBJRG9jdW1lbnRQcm92aWRlciBkcCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IChkcCAhPSBudWxsKSA/IGRwLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkgOiBudWxsOwotICAgICAgICAgIHRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSAtIDEpICsgY29sdW1uIC0gMSwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBtYXJrZXIgcmVmZXJzIHRvIGludmFsaWQgdGV4dCBwb3NpdGlvbiAtPiBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1Rhc2tMaXN0VGFibGVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vVGFza0xpc3RUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE1NjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vVGFza0xpc3RUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uVUlNZXNzYWdlczsKLQotCi0KLXB1YmxpYyBjbGFzcyBUYXNrTGlzdFRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIKLXsJCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9JQ09OID0gMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RFU0NSSVBUSU9OID0gMTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1JFU09VUkNFID0gMzsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0xPQ0FUSU9OID0gMjsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9JQ09OID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfREVTQ1JJUFRJT04gPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5UYXNrTGlzdFRhYmxlVmlld2VyXzA7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1JFU09VUkNFID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuVGFza0xpc3RUYWJsZVZpZXdlcl8xOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9MT0NBVElPTiA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMjsKLQotICBwcm90ZWN0ZWQgaW50IHZpc2libGVSb3dzID0gLTE7Ci0KLSAgcHJvdGVjdGVkIGludCBnZXRDb2x1bW5XaWR0aChpbnQgY29sdW1uKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgc3dpdGNoIChjb2x1bW4pCi0gICAgewotICAgICAgY2FzZSBDT0xVTU5fSUNPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIENPTFVNTl9ERVNDUklQVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAyMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBDT0xVTU5fUkVTT1VSQ0UgOgotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gMzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBDT0xVTU5fTE9DQVRJT04gOgotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gMzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFRhc2tMaXN0VGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIsIHZpc2libGVSb3dzKTsKLSAgfQotCi0gIHB1YmxpYyBUYXNrTGlzdFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IHZpc2libGVSb3dzKQotICB7Ci0gICAgc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgc3R5bGUpKTsKLSAgICBnZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKCk7Ci0gICAgc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotICAgIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXNBcnJheSA9IHsgTEFCRUxfSUNPTiwgTEFCRUxfREVTQ1JJUFRJT04sIExBQkVMX0xPQ0FUSU9OIH07Ci0gICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkpOwotCi0gICAgVGFibGUgdGFibGUgPSBnZXRUYWJsZSgpOwotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzQXJyYXlbaV0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YShnZXRDb2x1bW5XaWR0aChpKSwgdHJ1ZSkpOwotICAgIH0KLQotICAgIHRhYmxlLnNldExheW91dChsYXlvdXQpOwotICAgCi0gICAgdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzOwotICB9Ci0KLSAgLyoqCi0gIAkqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLSAgCSovCi0gIHByb3RlY3RlZCBjbGFzcyBQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgVmlld2VyIHZpZXdlcjsKLSAgICBJbWFnZSBlcnJvckltYWdlOyAKLSAgICBJbWFnZSB3YXJuSW1hZ2U7Ci0gICAgCi0gICAgcHVibGljIFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICBlcnJvckltYWdlID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyk7Ci0gICAgICAgCi0gICAgICB3YXJuSW1hZ2UgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0gICAgICByZXR1cm4gbGlzdCAhPSBudWxsID8gbGlzdC50b0FycmF5KCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotCSAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpIG9iamVjdDsgICAgCQotICAgICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsgCi0gICAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkKLSAgICAgIHsKLSAgICAgIAlpbnQgc2V2ZXJpdHkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpOwotICAgICAgCWlmIChzZXZlcml0eSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZIHx8IAotICAgICAgCSAgICBzZXZlcml0eSA9PSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpICAgICAgCSAgICAKLSAgICAgIAl7Ci0JCQlyZXN1bHQgPSBlcnJvckltYWdlOwotICAgICAgCX0gCi0gICAgICAJZWxzZQotICAgICAgCXsKLSAgICAgIAkgIHJlc3VsdCA9IHdhcm5JbWFnZTsKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uKQotICAgIHsKLSAgICAgIFZhbGlkYXRpb25NZXNzYWdlIGVycm9yTWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSkgb2JqZWN0OwotICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICBzd2l0Y2ggKGNvbHVtbikKLSAgICAgIHsKLSAgICAgICAgY2FzZSBDT0xVTU5fREVTQ1JJUFRJT04gOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGVycm9yTWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ09MVU1OX0xPQ0FUSU9OIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5UYXNrTGlzdFRhYmxlVmlld2VyXzMgKyBlcnJvck1lc3NhZ2UuZ2V0TGluZU51bWJlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYWE1OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIENvbnN0YW50cyBmb3Igc3RyaW5ncyAgCi0KLSMKLSMgUmVmZXJlbmNlZCBGaWxlIERpYWxvZyBSZWxhdGVkIE1lc3NhZ2UKLSMKLV9VSV9SRUZfRklMRV9FUlJPUl9ERVNDUklQVElPTiAgICAgID0gVGhlIGVycm9ycyBiZWxvdyB3ZXJlIGRldGVjdGVkIHdoZW4gdmFsaWRhdGluZyB0aGUgZmlsZSAiezB9IiB2aWEgdGhlIGZpbGUgInsxfSIuICBJbiBtb3N0IGNhc2VzIHRoZXNlIGVycm9ycyBjYW4gYmUgZGV0ZWN0ZWQgYnkgdmFsaWRhdGluZyAiezJ9IiBkaXJlY3RseS4gIEhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCBlcnJvcnMgd2lsbCBvbmx5IG9jY3VyIHdoZW4gezJ9IGlzIHZhbGlkYXRlZCBpbiB0aGUgY29udGV4dCBvZiB7M30uCi1fVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmlnaHQgY2xpY2sgb24gdGhlIG1lc3NhZ2UgYW5kIHNlbGVjdCAiU2hvdyBEZXRhaWxzLi4uIgotX1VJX1JFRl9GSUxFX0VSUk9SX0RFVEFJTFMgICAgICAgICAgPSBSZWZlcmVuY2VkIEZpbGUgRXJyb3IgRGV0YWlscwotCi1fVUlfREVUQUlMU19JTkZPUk1BVElPTl9VTkFWQUlMQUJMRSAgICAgICA9IERldGFpbHMgSW5mb3JtYXRpb24gVW5hdmFpbGFibGUKLV9VSV9ERVRBSUxTX0lORk9fUkVWQUxJREFURV9UT19SRUdFTkVSQVRFID0gRGV0YWlscyBpbmZvcm1hdGlvbiBjdXJyZW50bHkgdW5hdmFpbGFibGUuICBQbGVhc2UgcmV2YWxpZGF0ZSB0aGUgZmlsZSB0byByZWdlbmVyYXRlIHRoZSBlcnJvciBkZXRhaWxzLgotCi0jCi0jIERpcnR5IEZpbGUgRGlhbG9nIFJlbGF0ZWQgTWVzc2FnZXMKLSMKLVRhc2tMaXN0VGFibGVWaWV3ZXJfMD1EZXNjcmlwdGlvbgotVGFza0xpc3RUYWJsZVZpZXdlcl8xPVJlc291cmNlCi1UYXNrTGlzdFRhYmxlVmlld2VyXzI9TG9jYXRpb24KLVRhc2tMaXN0VGFibGVWaWV3ZXJfMz1saW5lIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxMmNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5aaXBGaWxlU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBlbGVtZW50VG9PcGVuOwotCi0JcHJpdmF0ZSBJT3ZlcndyaXRlUXVlcnkgb3ZlcndyaXRlUXVlcnk7Ci0KLQlwcml2YXRlIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlW10gcGFnZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlW10gbXlQYWdlcywgSU92ZXJ3cml0ZVF1ZXJ5IG15T3ZlcndyaXRlUXVlcnkpIHsKLQkJZWxlbWVudFRvT3BlbiA9IG51bGw7Ci0JCXBhZ2VzID0gbXlQYWdlczsKLQkJb3ZlcndyaXRlUXVlcnkgPSBteU92ZXJ3cml0ZVF1ZXJ5OwotCX0KLQotCXByaXZhdGUgSVByb2plY3QgY29uZmlnTmV3UHJvamVjdChJV29ya3NwYWNlUm9vdCByb290LCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gbmF0dXJlSWRzLCBJUHJvamVjdFtdIHJlZmVyZW5jZWRQcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KG5hbWUpOwotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCQl9Ci0JCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCQl9Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlkZXNjLnNldExvY2F0aW9uKG51bGwpOwotCQkJZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlSWRzKTsKLQkJCWRlc2Muc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0KLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzYywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0KLQkJCXJldHVybiBwcm9qZWN0OwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3QoSVdvcmtzcGFjZVJvb3Qgcm9vdCwgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UgcGFnZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzYyA9IHBhZ2UuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpbXBvcnRzID0gZGVzYy5nZXRDaGlsZHJlbigiaW1wb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbmF0dXJlcyA9IGRlc2MuZ2V0Q2hpbGRyZW4oIm5hdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJlZmVyZW5jZXMgPSBkZXNjLmdldENoaWxkcmVuKCJyZWZlcmVuY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IG5JbXBvcnRzID0gKGltcG9ydHMgPT0gbnVsbCkgPyAwIDogaW1wb3J0cy5sZW5ndGg7Ci0JCWludCBuTmF0dXJlcyA9IChuYXR1cmVzID09IG51bGwpID8gMCA6IG5hdHVyZXMubGVuZ3RoOwotCQlpbnQgblJlZmVyZW5jZXMgPSAocmVmZXJlbmNlcyA9PSBudWxsKSA/IDAgOiByZWZlcmVuY2VzLmxlbmd0aDsKLQotCQltb25pdG9yLmJlZ2luVGFzayhYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjX3Byb2osIG5JbXBvcnRzICsgMSk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBwYWdlLmdldFByb2plY3ROYW1lKCk7Ci0KLQkJU3RyaW5nW10gbmF0dXJlSWRzID0gbmV3IFN0cmluZ1tuTmF0dXJlc107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbk5hdHVyZXM7IGkrKykgewotCQkJbmF0dXJlSWRzW2ldID0gbmF0dXJlc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUHJvamVjdFtdIHJlZmVyZW5jZWRQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtuUmVmZXJlbmNlc107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblJlZmVyZW5jZXM7IGkrKykgewotCQkJcmVmZXJlbmNlZFByb2plY3RzW2ldID0gcm9vdC5nZXRQcm9qZWN0KHJlZmVyZW5jZXNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSVByb2plY3QgcHJvaiA9IGNvbmZpZ05ld1Byb2plY3Qocm9vdCwgbmFtZSwgbmF0dXJlSWRzLCByZWZlcmVuY2VkUHJvamVjdHMsIG1vbml0b3IpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkltcG9ydHM7IGkrKykgewotCQkJZG9JbXBvcnRzKHByb2osIGltcG9ydHNbaV0sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQl9Ci0KLQkJU3RyaW5nIG9wZW4gPSBkZXNjLmdldEF0dHJpYnV0ZSgib3BlbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChvcGVuICE9IG51bGwgJiYgb3Blbi5sZW5ndGgoKSA+IDApIHsKLQkJCUlSZXNvdXJjZSBmaWxlVG9PcGVuID0gcHJvai5maW5kTWVtYmVyKG5ldyBQYXRoKG9wZW4pKTsKLQkJCWlmIChmaWxlVG9PcGVuICE9IG51bGwpIHsKLQkJCQllbGVtZW50VG9PcGVuID0gZmlsZVRvT3BlbjsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvSW1wb3J0cyhJUHJvamVjdCBwcm9qZWN0LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY3VyciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVBhdGggZGVzdFBhdGg7Ci0JCQlTdHJpbmcgbmFtZSA9IGN1cnIuZ2V0QXR0cmlidXRlKCJkZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZGVzdFBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG5hbWUpOwotCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJCWRlc3RQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgaW1wb3J0UGF0aCA9IGN1cnIuZ2V0QXR0cmlidXRlKCJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGltcG9ydFBhdGggPT0gbnVsbCkgewotCQkJCWltcG9ydFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAicHJvamVjdHNldHVwIGRlc2NyaXB0b3I6IGltcG9ydCBtaXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVppcEZpbGUgemlwRmlsZSA9IGdldFppcEZpbGVGcm9tUGx1Z2luRGlyKGltcG9ydFBhdGgsIGdldENvbnRyaWJ1dGluZ1BsdWdpbihjdXJyKSk7Ci0JCQlpbXBvcnRGaWxlc0Zyb21aaXAoemlwRmlsZSwgZGVzdFBhdGgsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udHJpYnV0aW5nUGx1Z2luKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgewotCQlPYmplY3QgcGFyZW50ID0gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFeHRlbnNpb24pCi0JCQkJcmV0dXJuICgoSUV4dGVuc2lvbikgcGFyZW50KS5nZXROYW1lc3BhY2UoKTsKLQkJCXBhcmVudCA9ICgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBwYXJlbnQpLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0RWxlbWVudFRvT3BlbigpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb09wZW47Ci0JfQotCi0JcHJpdmF0ZSBaaXBGaWxlIGdldFppcEZpbGVGcm9tUGx1Z2luRGlyKFN0cmluZyBwbHVnaW5SZWxhdGl2ZVBhdGgsIFN0cmluZyBzeW1ib2xpY05hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoc3ltYm9saWNOYW1lKTsKLQkJCVVSTCBzdGFydGVyVVJMID0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGx1Z2luUmVsYXRpdmVQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBaaXBGaWxlKFBsYXRmb3JtLmFzTG9jYWxVUkwoc3RhcnRlclVSTCkuZ2V0RmlsZSgpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBwbHVnaW5SZWxhdGl2ZVBhdGggKyAiOiAiICsgZS5nZXRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNTFVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW1wb3J0RmlsZXNGcm9tWmlwKFppcEZpbGUgc3JjWmlwRmlsZSwgSVBhdGggZGVzdFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gbmV3IFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlcihzcmNaaXBGaWxlKTsKLQkJSW1wb3J0T3BlcmF0aW9uIG9wID0gbmV3IEltcG9ydE9wZXJhdGlvbihkZXN0UGF0aCwgc3RydWN0dXJlUHJvdmlkZXIuZ2V0Um9vdCgpLCBzdHJ1Y3R1cmVQcm92aWRlciwgb3ZlcndyaXRlUXVlcnkpOwotCQlvcC5ydW4obW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzYywgcGFnZXMubGVuZ3RoKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY3JlYXRlUHJvamVjdChyb290LCBwYWdlc1tpXSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM5Mjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0JcHJpdmF0ZSBjbGFzcyBJbXBvcnRPdmVyd3JpdGVRdWVyeSBpbXBsZW1lbnRzIElPdmVyd3JpdGVRdWVyeSB7Ci0KLQkJcHJpdmF0ZSBpbnQgb3BlbkRpYWxvZyhmaW5hbCBTdHJpbmcgZmlsZSkgewotCQkJZmluYWwgaW50W10gcmVzdWx0ID0ge0lEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEfTsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X3RpdGxlOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfbWVzc2FnZSwgZmlsZSk7Ci0JCQkJCVN0cmluZ1tdIG9wdGlvbnMgPSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9OwotCQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtc2csIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG9wdGlvbnMsIDApOwotCQkJCQlyZXN1bHRbMF0gPSBkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJCVN0cmluZ1tdIHJldHVybkNvZGVzID0ge1lFUywgTk8sIEFMTCwgQ0FOQ0VMfTsKLQkJCWludCByZXR1cm5WYWwgPSBvcGVuRGlhbG9nKGZpbGUpOwotCQkJcmV0dXJuIHJldHVyblZhbCA8IDAgPyBDQU5DRUwgOiByZXR1cm5Db2Rlc1tyZXR1cm5WYWxdOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgd2l6YXJkQ29uZmlnRWxlbWVudDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBleGFtcGxlQ29uZmlnRWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIEVYQU1QTEVfV0laQVJEX1hQX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VbXSBwYWdlczsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIFdFQl9CUk9XU0VSX0lEID0gIm9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERpYWxvZ1NldHRpbmdzKFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2l6YXJkI2FkZFBhZ2VzCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0KLQkJaWYgKGV4YW1wbGVDb25maWdFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gZXhhbXBsZUNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oInByb2plY3RzZXR1cCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImRlc2NyaXB0b3IgbXVzdCBjb250YWluIG9uZSBvcmUgbW9yZSBwcm9qZWN0c2V0dXAgdGFncyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlwYWdlcyA9IG5ldyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZVtjaGlsZHJlbi5sZW5ndGhdOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXBhZ2VzW2ldID0gbmV3IEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlKGksIGNoaWxkcmVuW2ldKTsKLQkJCWFkZFBhZ2UocGFnZXNbaV0pOwotCQl9Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLQkJaWYgKGV4YW1wbGVDb25maWdFbGVtZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBiYW5uZXIgPSBleGFtcGxlQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImJhbm5lciIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmFubmVyICE9IG51bGwpIHsKLQkJCQlVUkwgaW1hZ2VVUkwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShleGFtcGxlQ29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSksIG5ldyBQYXRoKGJhbm5lcikpOwotCQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQkJCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQkJfQotCQl9Ci0gICAgfQotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldEV4dGVuZGVkQ29uZmlndXJhdGlvbkVsZW1lbnRzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXhhbXBsZVdpemFyZFhQID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoRVhBTVBMRV9XSVpBUkRfWFBfSUQpOwotCQlpZiAoZXhhbXBsZVdpemFyZFhQID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCQl9Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXhhbXBsZVdpemFyZFhQLmdldEV4dGVuc2lvbihnZXRXaXphcmRFeHRlbnNpb25JZCgpKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4YW1wbGVXaXphcmRDRXMgPSBleGFtcGxlV2l6YXJkWFAuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCXJldHVybiBleGFtcGxlV2l6YXJkQ0VzOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlTdHJpbmcgdGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl90aXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl9tZXNzYWdlOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIHRhcmdldCkuZ2V0U3RhdHVzKCk7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCB0aXRsZSwgdGFyZ2V0LmdldE1lc3NhZ2UoKSk7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHRhcmdldCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5SZXNvdXJjZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKGFjdGl2ZVBhZ2UsIChJRmlsZSkgcmVzb3VyY2UsIFdFQl9CUk9XU0VSX0lELCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwocmVzb3VyY2UsIGFjdGl2ZVBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiBydW5uYWJsZSA9IG5ldyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKHBhZ2VzLCBuZXcgSW1wb3J0T3ZlcndyaXRlUXVlcnkoKSk7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24ocnVubmFibGUpOwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcCk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUod2l6YXJkQ29uZmlnRWxlbWVudCk7Ci0JCUlSZXNvdXJjZSByZXMgPSBydW5uYWJsZS5nZXRFbGVtZW50VG9PcGVuKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJb3BlblJlc291cmNlKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZm9yIHRoZSB3aXphcmQuIFRoZSBjb25maWcgZWxlbWVudAotCSAqIHdpbGwgYmUgdXNlZCBpbiA8Y29kZT5wZXJmb3JtRmluaXNoPC9jb2RlPiB0byBzZXQgdGhlIHJlc3VsdAotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHsKLQkJd2l6YXJkQ29uZmlnRWxlbWVudCA9IGNmaWc7Ci0JCVN0cmluZyB0aXRsZSA9IHdpemFyZENvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCXNldFdpbmRvd1RpdGxlKHRpdGxlKTsKLQkJfQotCQlTdHJpbmcgd2l6YXJkSWQgPSBnZXRXaXphcmRFeHRlbnNpb25JZCgpOyAvLyROT04tTkxTLTEkCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4YW1wbGVXaXphcmRDRXMgPSBnZXRFeHRlbmRlZENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4YW1wbGVXaXphcmRDRXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZXhhbXBsZVdpemFyZENFc1tpXTsKLQkJCVN0cmluZyBleHRXaXphcmRJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAod2l6YXJkSWQgIT0gbnVsbCAmJiBleHRXaXphcmRJZCAhPSBudWxsICYmIHdpemFyZElkLmVxdWFscyhleHRXaXphcmRJZCkpIHsKLQkJCQlleGFtcGxlQ29uZmlnRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJLy8gaW5pdGlhbGl6ZURlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuIHdpemFyZENvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDExMzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZTsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLQotCXB1YmxpYyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZShpbnQgcGFnZU51bWJlciwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0pIHsKLQotCQlzdXBlcigicGFnZSIgKyBwYWdlTnVtYmVyKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW07Ci0KLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoZWxlbSwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbml0aWFsUHJvamVjdE5hbWUoY2FsY3VsYXRlSW5pdGlhbFByb2plY3ROYW1lKG5hbWUpKTsKLQotCQlzZXREZXNjcmlwdGlvbihnZXRBdHRyaWJ1dGUoY29uZmlndXJhdGlvbkVsZW1lbnQsICJwYWdlZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoZ2V0QXR0cmlidXRlKGNvbmZpZ3VyYXRpb25FbGVtZW50LCAicGFnZXRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKgotCSAqIFNldCB0aGUgZGVmYXVsdCBwcm9qZWN0IG5hbWUgdGhhdCBpcyB0byBhcHBlYXIgb24gdGhlIGluaXRpYWxQYWdlIHBhZ2UKLQkgKiBvZiB0aGlzIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhbGN1bGF0ZUluaXRpYWxQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVByb2plY3QgcHJvamVjdEhhbmRsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdEhhbmRsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIHByb2plY3ROYW1lOwotCQl9Ci0JCS8vIENoYW5nZSB0aGUgbmFtZSB1bnRpbCBpdCBkb2Vzbid0IGV4aXN0cy4gVHJ5IDkgdGltZXMgYW5kIHRoZW4KLQkJLy8gZ2l2ZSB1cC4KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7Ci0JCQlwcm9qZWN0SGFuZGxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lICsgaSk7Ci0JCQlpZiAoIXByb2plY3RIYW5kbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qZWN0TmFtZSArICI5IjsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtLCBTdHJpbmcgdGFnKSB7Ci0JCVN0cmluZyByZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSh0YWcpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJldHVybiAnIScgKyB0YWcgKyAnISc7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IG9mIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJQ29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UjdmFsaWRhdGVQYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0UHJvamVjdE5hbWUoKTsKLQkJaWYgKHByb2plY3ROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVdpemFyZCB3aXphcmQgPSBnZXRXaXphcmQoKTsKLQkJaWYgKHdpemFyZCBpbnN0YW5jZW9mIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQpIHsKLQkJCUlXaXphcmRQYWdlW10gcGFnZXMgPSB3aXphcmQuZ2V0UGFnZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKHBhZ2VzW2ldICE9IHRoaXMpICYmIChwYWdlc1tpXSBpbnN0YW5jZW9mIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlKSkgewotCQkJCQlpZiAocHJvamVjdE5hbWUuZXF1YWxzKCgoRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UpIHBhZ2VzW2ldKS5nZXRQcm9qZWN0TmFtZSgpKSkgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZV9lcnJvcl9hbHJlYWR5ZXhpc3RzKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0lYTUxXaXphcmRIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQyZWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIHhtbCB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICovCi1pbnRlcmZhY2UgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSByYWRpbwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMV9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDEiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlIHJhZGlvIGJ1dHRvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gc2NyYXRjaCByYWRpbyBidXR0b24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX0NSRUFURVhNTDNfSEVMUElEID0gUFJFRklYICsgInhtbGMwMTAzIjsgLy8kTk9OLU5MUy0xJAotCS8vIFNlbGVjdCBTb3VyY2UgZmlsZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RTT1VSQ0VfSEVMUElEID0gUFJFRklYICsgInhtbGMwNTAwIjsgLy8kTk9OLU5MUy0xJAotCS8vIFJvb3QgZWxlbWVudCBmb3IgYm90aCBEVEQgYW5kIFhNTCBzY2hlbWEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgQXR0cmlidXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQxX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgRWxlbWVudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UM19IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDMiOyAvLyROT04tTkxTLTEkCi0JLy8gRmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlIHdpdGggZGF0YQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ0X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0NCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBTeXN0ZW0gSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ1X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBQdWJsaWMgSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ2X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIyMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZUluZm9Db250ZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODE3YzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyIGV4dGVuZHMgQ29udGVudEJ1aWxkZXIKLSAgeyAgICAgIAotICAgIHByb3RlY3RlZCBpbnQgY291bnQgPSAxOyAgIAotICAgIHB1YmxpYyBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsgICAKLQotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFueUVsZW1lbnROb2RlKENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICAgIHsKLSAgICAgIFN0cmluZyB1cmkgPSBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKHVyaSAhPSBudWxsICYmICF1cmkuc3RhcnRzV2l0aCgiIyMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBpZiAodGFibGUuZ2V0KHVyaSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgICAgaW5mby51cmkgPSB1cmk7ICAgICAKLSAgICAgICAgICBpbmZvLnByZWZpeCA9ICJwIiArIGNvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB0YWJsZS5wdXQodXJpLCBpbmZvKTsgCi0gICAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TW9kZWxXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TW9kZWxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkZTA1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLQotcHVibGljIGNsYXNzIE5ld01vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZAotewotICAKLSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0gIHByb3RlY3RlZCBJV29ya2JlbmNoIGZXb3JrYmVuY2g7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZkN1cnJlbnREaXJlY3Rvcnk7Ci0KLSAgcHVibGljIE5ld01vZGVsV2l6YXJkKCkKLSAgewotCSAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHRoaXMuZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLSAgICB0aGlzLmZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gKFdpemFyZFBhZ2UpZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICBpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjdXJyZW50UGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIHNob3dGaWxlRGlhbG9nCi0gICAqLwotICBwdWJsaWMgRmlsZURpYWxvZyBzaG93RmlsZURpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGRlZmF1bHREaXJlY3RvcnksIFN0cmluZyBkZWZhdWx0RmlsZSwgU3RyaW5nIFtdIGZpbHRlckV4dGVuc2lvbnMpCi0gIHsKLSAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCi0gICAgLy8gR2V0IHRoZSBsYXN0IHZpc2l0IGRpcmVjdG9yeSBpZiB3ZSBoYXZlbid0IGRlZmluZWQgYSBwYXJ0aWN1bGFyIG9uZSBoZXJlLgotICAgIGlmIChkZWZhdWx0RGlyZWN0b3J5ID09IG51bGwgfHwgZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIC8vZGVmYXVsdERpcmVjdG9yeSA9IExvY2F0ZS5pbnN0YW5jZSh0aGlzKS5nZXRMYXN0U2VsZWN0ZWREaXJlY3RvcnkoZ2V0UmVzb3VyY2VQYXRoKCkpOwotICAgIH0KLQotICAgIGlmIChkZWZhdWx0RGlyZWN0b3J5ICE9IG51bGwgJiYgZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSAhPSAwKQotICAgIHsKLSAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aChkZWZhdWx0RGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKGRlZmF1bHRGaWxlKTsKLSAgICBmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0KLSAgICBmaWxlRGlhbG9nLm9wZW4oKTsKLQotICAgIHJldHVybiBmaWxlRGlhbG9nOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RGlyZWN0b3J5KFN0cmluZyBjdXJyZW50RGlyZWN0b3J5MSkKLSAgewotICAgIHRoaXMuZkN1cnJlbnREaXJlY3RvcnkgPSBjdXJyZW50RGlyZWN0b3J5MTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgY3JlYXRlV29ya2JlbmNoUmVzb3VyY2UoSUNvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBmaWxlTmFtZSkKLSAgewotICAgIElQYXRoIHBhdGggPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKTsKLSAgICBwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotICAgIElGaWxlIGZpbGUgPSBjb250YWluZXIuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgaWYgKCFmaWxlLmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmaWxlLmNyZWF0ZShudWxsLCB0cnVlLCBudWxsKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRW5jb3VudGVyZWQgZXhjZXB0aW9uIGNyZWF0aW5nIGZpbGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0UGFnZQotICAgKi8KLSAgcHVibGljIGNsYXNzIFN0YXJ0UGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lcgotICB7Ci0gICAgcHJvdGVjdGVkIGludCBzZWxlY3RlZEJ1dHRvbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcmFkaW9CdXR0b25MYWJlbDsKLSAgICBwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b247Ci0KLSAgICBwdWJsaWMgU3RhcnRQYWdlKFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nW10gcmFkaW9CdXR0b25MYWJlbCkKLSAgICB7Ci0gICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgICB0aGlzLnJhZGlvQnV0dG9uTGFiZWwgPSByYWRpb0J1dHRvbkxhYmVsOwotICAgICAgcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uW3JhZGlvQnV0dG9uTGFiZWwubGVuZ3RoXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnV0dG9uIGdldFJhZGlvQnV0dG9uQXRJbmRleChpbnQgaSkKLSAgICB7Ci0gICAgICBCdXR0b24gcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChpID49IDAgJiYgaSA8IHJhZGlvQnV0dG9uLmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcmFkaW9CdXR0b25baV07Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRSYWRpb0J1dHRvbkluZGV4KCkKLSAgICB7Ci0gICAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9uLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAocmFkaW9CdXR0b25baV0uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotICAgICAgLy9yYWRpbyBidXR0b25zJyBjb250YWluZXIJCi0gICAgICBDb21wb3NpdGUgcmFkaW9CdXR0b25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLSAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsgICAgICAgICAgICAgICAgCi0KLSAgICAgIHJhZGlvQnV0dG9uc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgIGdkLmhlaWdodEhpbnQgPSAzMDA7Ci0gICAgICBnZC53aWR0aEhpbnQgPSA0MDA7Ci0gICAgICByYWRpb0J1dHRvbnNHcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbkxhYmVsLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByYWRpb0J1dHRvbltpXSA9IG5ldyBCdXR0b24ocmFkaW9CdXR0b25zR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIHJhZGlvQnV0dG9uW2ldLnNldFRleHQocmFkaW9CdXR0b25MYWJlbFtpXSk7Ci0gICAgICAgIHJhZGlvQnV0dG9uW2ldLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAvL3JhZGlvQnV0dG9uW2ldLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgICAgfQotICAgICAgc2V0Q29udHJvbChiYXNlKTsKLSAgICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgICAgewotICAgICAgICBzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogIE5ld0ZpbGVQYWdlCi0gICAqLwotICBwdWJsaWMgY2xhc3MgTmV3RmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIGRlZmF1bHROYW1lID0gIk5ld0ZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIFN0cmluZyBkZWZhdWx0RmlsZUV4dGVuc2lvbiA9ICIudHh0IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyAiKi50eHQifTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotICAgIHB1YmxpYyBOZXdGaWxlUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgc3VwZXIoIiIsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKQotICAgIHsKLSAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICBTdHJpbmcgZmlsZU5hbWUgPSBkZWZhdWx0TmFtZSArIGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotICAgICAgSVBhdGggY29udGFpbmVyRnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgICAgaWYgKGNvbnRhaW5lckZ1bGxQYXRoICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0gICAgICAgICAgaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHBhdGgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBmaWxlIG9mIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiBhbnkgY2FzZSBmb3Igc2VsZWN0ZWQgY29udGFpbmVyCi0gICAgcHJvdGVjdGVkIFN0cmluZyBleGlzdHNGaWxlQW55Q2FzZShTdHJpbmcgZmlsZU5hbWUpCi0gICAgewotICAgICAgaWYgKCAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAmJiAoZmlsZU5hbWUuY29tcGFyZVRvKCIiKSAhPSAwKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICAvL2xvb2sgdGhyb3VnaCBhbGwgcmVzb3VyY2VzIGF0IHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIC0gY29tcGFyZSBpbiB1cHBlciBjYXNlCi0gICAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICB7Ci0gICAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICAgICAgU3RyaW5nIGVudGVyZWRGaWxlVXBwZXIgPSBmaWxlTmFtZS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVVwcGVyTmFtZSA9IG1lbWJlcnNbaV0uZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgIGlmIChyZXNvdXJjZVVwcGVyTmFtZS5lcXVhbHMoZW50ZXJlZEZpbGVVcHBlcikpCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJzW2ldLmdldE5hbWUoKTsgICAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCWlmICghZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShmdWxsRmlsZU5hbWUpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gbm8gZmlsZUV4dGVuc2lvbiwgbGV0J3MgY2hlY2sgZm9yIHRoaXMgZmlsZSB3aXRoIGRlZmF1bHQgZmlsZSBleHRlbnNpb24KLQkJZnVsbEZpbGVOYW1lICs9IGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotCQlpZiAoKGdldENvbnRhaW5lckZ1bGxQYXRoKCkgIT0gbnVsbCkgJiYgKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZ2V0RmlsZU5hbWUoKS5jb21wYXJlVG8oIiIpICE9IDApKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCVBhdGggZnVsbFBhdGggPSBuZXcgUGF0aChnZXRDb250YWluZXJGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKyAnLycgKyBmdWxsRmlsZU5hbWUpOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGZ1bGxQYXRoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFhNTFdpemFyZHNNZXNzYWdlcy5fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgZm9yIGZpbGUgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUKLQkJU3RyaW5nIHNhbWVOYW1lID0gZXhpc3RzRmlsZUFueUNhc2UoZnVsbEZpbGVOYW1lKTsKLQkJaWYgKHNhbWVOYW1lICE9IG51bGwpIHsKLQkJCS8vSVNTVUU6IGlzIHF1YWxpdGlmZWRGaWxlTmFtZSBub3QgbmVlZGVkLCBvciBpcyBpdCBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2U/Ci0JCQkvL1N0cmluZyBxdWFsaWZpZWRGaWxlTmFtZSA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGZ1bGxGaWxlTmFtZTsKLQkJCXNldEVycm9yTWVzc2FnZShYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMgKyAiICIgKyBzYW1lTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgLy8gaW5oZXJpdCBkZWZhdWx0IGNvbnRhaW5lciBhbmQgbmFtZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMKLSAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgIHRoaXMuc2V0RmlsZU5hbWUoY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpKTsKLSAgICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gICAgfQotCQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIFhNTCBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIGZpbGVOYW1lIGlzIHZhbGlkIG5hbWUgZm9yIGNvbnRlbnQgdHlwZS4gVGFrZXMgYmFzZSBjb250ZW50Ci0JICogdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkgKi8KLQlib29sZWFuIGV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGUgdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjI5ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE5ld1hNTEdlbmVyYXRvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdyYW1tYXJVUkk7Ci0JcHJvdGVjdGVkIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLQlwcm90ZWN0ZWQgaW50IGJ1aWxkUG9saWN5OwotCXByb3RlY3RlZCBTdHJpbmcgcm9vdEVsZW1lbnROYW1lOwotCi0JcHJvdGVjdGVkIElDYXRhbG9nRW50cnkgeG1sQ2F0YWxvZ0VudHJ5OwotCi0JLy8gaW5mbyBmb3IgZHRkCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlkOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFN5c3RlbUlkOwotCi0JLy8gaW5mbyBmb3IgeHNkCi0JcHVibGljIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0KLQlwdWJsaWMgTmV3WE1MR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOZXdYTUxHZW5lcmF0b3IoU3RyaW5nIGdyYW1tYXJVUkksIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQl0aGlzLmdyYW1tYXJVUkkgPSBncmFtbWFyVVJJOwotCQl0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nW10gZXJyb3JJbmZvKSB7Ci0JCVN0cmluZyB0aXRsZSA9IG51bGw7Ci0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJTGlzdCBlcnJvckxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG51bGw7Ci0KLQkJaWYgKFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgdHJ1ZSkpIHsKLQkJICAgIC8vIChjcykgYXNzdW1lIHRoZSB1cmkgaGFzIGJlZW4gcHJvdmlkZWQgaW4gYSBub3JtYWxpemVkIGZvcm0KLQkJCWNtRG9jdW1lbnQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudCh1cmksIG51bGwpOwotCi0JCQlpZiAodXJpLmVuZHNXaXRoKCIuZHRkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChlcnJvckxpc3Quc2l6ZSgpID4gMCkgewotCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCQkJCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9EVERfSU5WQUxJRF9JTkZPOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgLy8gIi54c2QiCi0JCQl7Ci0JCQkJLy8gVG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBzY2hlbWEgZWRpdG9yIHZhbGlkYXRpb24KLQkJCQlYTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlciB2YWxpZGF0b3IgPSBuZXcgWE1MU2NoZW1hVmFsaWRhdGlvbkNoZWNrZXIoKTsKLQkJCQlpZiAoIXZhbGlkYXRvci5pc1ZhbGlkKHVyaSkpIHsKLQkJCQkJdGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0lOVkFMSURfR1JBTU1BUl9FUlJPUjsKLQkJCQkJbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfRVJST1JfU0NIRU1BX0lOVkFMSURfSU5GTzsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY21Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCWludCBnbG9iYWxFbGVtZW50Q291bnQgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWlmIChnbG9iYWxFbGVtZW50Q291bnQgPT0gMCkgewotCQkJCQkJdGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUzsKLQkJCQkJCW1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dBUk5JTkdfTVNHX05PX1JPT1RfRUxFTUVOVFM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19USVRMRV9OT19ST09UX0VMRU1FTlRTOwotCQkJbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICsgIiAiICsgdXJpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZXJyb3JJbmZvWzBdID0gdGl0bGU7Ci0JCWVycm9ySW5mb1sxXSA9IG1lc3NhZ2U7Ci0KLQkJcmV0dXJuIGNtRG9jdW1lbnQ7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFbXB0eVhNTERvY3VtZW50KElGaWxlIG5ld0ZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlTdHJpbmcgY2hhclNldCA9IGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0KCk7Ci0KLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KSk7Ci0JCXdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgY2hhclNldCArICJcIj8+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl3cml0ZXIuZmx1c2goKTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQluZXdGaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldCgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlyZXR1cm4gY2hhclNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVYTUxEb2N1bWVudChTdHJpbmcgeG1sRmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoeG1sRmlsZU5hbWUpOwotCQlTdHJpbmcgY2hhcnNldCA9IG51bGw7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQljaGFyc2V0ID0gY29udGVudFR5cGUuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJfQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gY3JlYXRlWE1MRG9jdW1lbnQoeG1sRmlsZU5hbWUsIGNoYXJzZXQpOwotCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHhtbEZpbGVOYW1lKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJb3V0cHV0U3RyZWFtLndyaXRlVG8oZm9zKTsKLQkJZm9zLmNsb3NlKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVYTUxEb2N1bWVudChJRmlsZSBuZXdGaWxlLCBTdHJpbmcgeG1sRmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgY2hhcnNldCA9IG5ld0ZpbGUuZ2V0Q2hhcnNldCgpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gY3JlYXRlWE1MRG9jdW1lbnQoeG1sRmlsZU5hbWUsIGNoYXJzZXQpOwotCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJbmV3RmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0KLQlwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNyZWF0ZVhNTERvY3VtZW50KFN0cmluZyB4bWxGaWxlTmFtZSwgU3RyaW5nIGNoYXJzZXQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoY2hhcnNldCA9PSBudWxsKSB7Ci0JCQljaGFyc2V0ID0gZ2V0VXNlclByZWZlcnJlZENoYXJzZXQoKTsKLQkJCWlmIChjaGFyc2V0ID09IG51bGwpIHsKLQkJCQljaGFyc2V0ID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNtRG9jdW1lbnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGdldFJvb3RFbGVtZW50TmFtZSgpKTsKLQotCQkvLyBjcmVhdGUgdGhlIHhtbCBtb2RlbAotCQlDTU5hbWVkTm9kZU1hcCBuYW1lTm9kZU1hcCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50RGVjbGFyYXRpb24gPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG5hbWVOb2RlTWFwLmdldE5hbWVkSXRlbShnZXRSb290RWxlbWVudE5hbWUoKSk7Ci0KLQkJRG9jdW1lbnQgeG1sRG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJRE9NQ29udGVudEJ1aWxkZXJJbXBsIGNvbnRlbnRCdWlsZGVyID0gbmV3IERPTUNvbnRlbnRCdWlsZGVySW1wbCh4bWxEb2N1bWVudCk7Ci0gICAgICAgIAotICAgICAgICAvLyB0aGlzICd1Z2x5VGVtcEhhY2snIGZsYWcgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gc3VwcmVzcyB0aGUgY3JlYXRpb24gYSBkZWZhdWx0IGVuY29kaW5nIAotICAgICAgICAvLyB3ZSdsbCBoYW5kbGUgdGhpcyBsYXRlciBpbiB0aGUgZG9tV3JpdGVyLnByaW50KCkgbWV0aG9kIHVzZWQgYmVsb3cKLSAgICAgICAgLy8KLSAgICAgICAgY29udGVudEJ1aWxkZXIuc3VwcmVzc0NyZWF0aW9uT2ZEb2N0eXBlQW5kWE1MRGVjbGFyYXRpb24gPSB0cnVlOwotCQljb250ZW50QnVpbGRlci5zZXRCdWlsZFBvbGljeShidWlsZFBvbGljeSk7Ci0JCWNvbnRlbnRCdWlsZGVyLnNldEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQobmV3IE15RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydChuYW1lc3BhY2VJbmZvTGlzdCwgeG1sRmlsZU5hbWUpKTsKLQkJY29udGVudEJ1aWxkZXIuY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KGNtRG9jdW1lbnQsIGNtRWxlbWVudERlY2xhcmF0aW9uLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyc2V0KTsKLSAgICAgICAgICAgIAotCQlET01Xcml0ZXIgZG9tV3JpdGVyID0gbmV3IERPTVdyaXRlcihvdXRwdXRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETy4uLiBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gZmlsZSBleHRlbnNpb25zLCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGdyYW1tYXIgdHlwZQotICAgICAgICAvLyBiZXR0ZXIgeWV0IHdlIHNob3VsZCByZWF0ZSBhbiBTU0UgZG9jdW1lbnQgc28gdGhhdCB3ZSBjYW4gZm9ybWF0IGl0IG5pY2VseSBiZWZvcmUgc2F2aW5nCi0gICAgICAgIC8vIHRoZW4gd2Ugd29uJ3QgbmVlZCB0aGUgRE9NV3JpdGVyIGF0IGFsbAotICAgICAgICAvLwotCQlkb21Xcml0ZXIucHJpbnQoeG1sRG9jdW1lbnQsIGNoYXJzZXQsIGNtRG9jdW1lbnQuZ2V0Tm9kZU5hbWUoKSwgZ2V0Tm9uV2hpdGVzcGFjZVN0cmluZyhnZXRQdWJsaWNJZCgpKSwgZ2V0Tm9uV2hpdGVzcGFjZVN0cmluZyhnZXRTeXN0ZW1JZCgpKSk7IAotCQlvdXRwdXRTdHJlYW0uZmx1c2goKTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJcmV0dXJuIG91dHB1dFN0cmVhbTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZU5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gKExpc3QpIGNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uYW1lc3BhY2VJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcmVzdWx0LnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgcmVzdWx0LmdldChpKTsKLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJU3RyaW5nIGxvY2F0aW9uSW5mbyA9IG51bGw7Ci0JCQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5ICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5LmdldEVudHJ5VHlwZSgpID09IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpIHsKLQkJCQkJCQkJbG9jYXRpb25JbmZvID0geG1sQ2F0YWxvZ0VudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWxvY2F0aW9uSW5mbyA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobG9jYXRpb25JbmZvID09IG51bGwpIHsKLQkJCQkJCQlsb2NhdGlvbkluZm8gPSBkZWZhdWx0U3lzdGVtSWQ7Ci0JCQkJCQl9Ci0JCQkJCQlpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSW5mbzsKLQkJCQkJCWluZm8uc2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWluZm8uc2V0UHJvcGVydHkoInVyaS1yZWFkT25seSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpbmZvLnNldFByb3BlcnR5KCJ1bnJlbW92YWJsZSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQotCQkJTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyKCk7Ci0JCQlidWlsZGVyLnNldEJ1aWxkUG9saWN5KENvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0JCQlidWlsZGVyLnZpc2l0Q01Ob2RlKGNtRG9jdW1lbnQpOwotCQkJcmVzdWx0LmFkZEFsbChidWlsZGVyLmxpc3QpOwotCQl9Ci0JCW5hbWVzcGFjZUluZm9MaXN0ID0gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNNaXNzaW5nTmFtZXNwYWNlTG9jYXRpb24oKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKGluZm8ubG9jYXRpb25IaW50ID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZXNwYWNlSW5mb0Vycm9ycygpIHsKLQkJU3RyaW5nW10gZXJyb3JMaXN0ID0gbnVsbDsKLQotCQlpZiAobmFtZXNwYWNlSW5mb0xpc3QgIT0gbnVsbCAmJiBpc01pc3NpbmdOYW1lc3BhY2VMb2NhdGlvbigpKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX05PX0xPQ0FUSU9OX0hJTlQ7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8xICsgIiAiICsgWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzIgKyAiXG5cbiIgKyBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWVycm9yTGlzdCA9IG5ldyBTdHJpbmdbMl07Ci0JCQllcnJvckxpc3RbMF0gPSB0aXRsZTsKLQkJCWVycm9yTGlzdFsxXSA9IG1lc3NhZ2U7Ci0JCX0KLQotCQlyZXR1cm4gZXJyb3JMaXN0OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0WE1MQ2F0YWxvZ0VudHJ5KElDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5KSB7Ci0JCXhtbENhdGFsb2dFbnRyeSA9IGNhdGFsb2dFbnRyeTsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCXJldHVybiB4bWxDYXRhbG9nRW50cnk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgcG9saWN5KSB7Ci0JCWJ1aWxkUG9saWN5ID0gcG9saWN5OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN5c3RlbUlkKFN0cmluZyBzeXNJZCkgewotCQlkZWZhdWx0U3lzdGVtSWQgPSBzeXNJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTeXN0ZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzSWQpIHsKLQkJc3lzdGVtSWQgPSBzeXNJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YklkKSB7Ci0JCXB1YmxpY0lkID0gcHViSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJVUkkoU3RyaW5nIGdyYW1VUkkpIHsKLQkJZ3JhbW1hclVSSSA9IGdyYW1VUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRHcmFtbWFyVVJJKCkgewotCQlyZXR1cm4gZ3JhbW1hclVSSTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDTURvY3VtZW50KENNRG9jdW1lbnQgY21Eb2MpIHsKLQkJY21Eb2N1bWVudCA9IGNtRG9jOwotCX0KLQotCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50TmFtZShTdHJpbmcgcm9vdE5hbWUpIHsKLQkJcm9vdEVsZW1lbnROYW1lID0gcm9vdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiByb290RWxlbWVudE5hbWU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IGltcGxlbWVudHMgRE9NQ29udGVudEJ1aWxkZXJJbXBsLkV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgewotCQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDE7Ci0JCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0KLQkJcHJvdGVjdGVkIE15RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydChMaXN0IG5hbWVzcGFjZUluZm9MaXN0UGFyYW0sIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZUluZm9MaXN0MSA9IG5hbWVzcGFjZUluZm9MaXN0UGFyYW07Ci0JCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQkJaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJU3RyaW5nIGxvY2F0aW9uSGludCA9IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QxLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKGluZm8udXJpKSkgewotCQkJCQkJbG9jYXRpb25IaW50ID0gaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobG9jYXRpb25IaW50ICE9IG51bGwpIHsKLQkJCQkJZ3JhbW1hclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShyZXNvdXJjZUxvY2F0aW9uLCBsb2NhdGlvbkhpbnQsIGxvY2F0aW9uSGludCk7Ci0JCQkJCXJlc3VsdCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KGdldEdyYW1tYXJVUkkoKSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gY21Eb2N1bWVudDsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb25XaGl0ZXNwYWNlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJaWYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVzdWx0ID0gc3RyaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFmMGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdSZXNvdXJjZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLk5hbWVzcGFjZUluZm9FcnJvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBOZXdYTUxXaXphcmQgZXh0ZW5kcyBOZXdNb2RlbFdpemFyZCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFX0ZST01fRFREID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfRlJPTV9YU0QgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENSRUFURV9GUk9NX1NDUkFUQ0ggPSAyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBjcmVhdGVGcm9tUmFkaW9CdXR0b25MYWJlbCA9IHtYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1JBRElPX1hNTF9GUk9NX0RURCwgWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9SQURJT19YTUxfRlJPTV9TQ0hFTUEsIFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfUkFESU9fWE1MX0ZST01fU0NSQVRDSH07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZpbGVQYWdlRmlsdGVyRXh0ZW5zaW9ucyA9IHsiLnhtbCJ9OyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBicm93c2VYU0RGaWx0ZXJFeHRlbnNpb25zID0geyIueHNkIn07IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGJyb3dzZURUREZpbHRlckV4dGVuc2lvbnMgPSB7Ii5kdGQifTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIE5ld0ZpbGVQYWdlIG5ld0ZpbGVQYWdlOwotCXByb3RlY3RlZCBTdGFydFBhZ2Ugc3RhcnRQYWdlOwotCXByb3RlY3RlZCBTZWxlY3RHcmFtbWFyRmlsZVBhZ2Ugc2VsZWN0R3JhbW1hckZpbGVQYWdlOwotCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2Ugc2VsZWN0Um9vdEVsZW1lbnRQYWdlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjbURvY3VtZW50RXJyb3JNZXNzYWdlOwotCi0JcHJvdGVjdGVkIE5ld1hNTEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLQotCXB1YmxpYyBOZXdYTUxXaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfSEVBRElORyk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYTUxXaXphcmQuY2xhc3MsICJpY29ucy9nZW5lcmF0ZXhtbF93aXouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdlbmVyYXRvciA9IG5ldyBOZXdYTUxHZW5lcmF0b3IoKTsKLQl9Ci0KLQotCXB1YmxpYyBOZXdYTUxXaXphcmQoSUZpbGUgZmlsZSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQotCQlnZW5lcmF0b3Iuc2V0R3JhbW1hclVSSShVUklIZWxwZXIuZ2V0UGxhdGZvcm1VUkkoZmlsZSkpOwotCQlnZW5lcmF0b3Iuc2V0Q01Eb2N1bWVudChjbURvY3VtZW50KTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RGlhbG9nKFNoZWxsIHNoZWxsLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCVN0cmluZ1tdIGVycm9ySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0JCS8vIChjcykgdGhlIFVSSSBhcmd1bWVudCB0byBjcmVhdGVDTURvY3VtZW50IG5lZWRzIHRvIGJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSSQotCQkvLwotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBOZXdYTUxHZW5lcmF0b3IuY3JlYXRlQ01Eb2N1bWVudChVUklIZWxwZXIuZ2V0UGxhdGZvcm1VUkkoZmlsZSksIGVycm9ySW5mbyk7Ci0JCWlmIChlcnJvckluZm9bMF0gPT0gbnVsbCkgewotCQkJTmV3WE1MV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdYTUxXaXphcmQoZmlsZSwgY21Eb2N1bWVudCk7Ci0JCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCXdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0RJQUxPR19ORVdfVElUTEUpOwotCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCQllbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBlcnJvckluZm9bMF0sIGVycm9ySW5mb1sxXSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0KLQkJaWYgKGdyYW1tYXJVUkkgPT0gbnVsbCkgewotCQkJLy8gc3RhcnQgcGFnZQotCQkJc3RhcnRQYWdlID0gbmV3IFN0YXJ0UGFnZSgiU3RhcnRQYWdlIiwgY3JlYXRlRnJvbVJhZGlvQnV0dG9uTGFiZWwpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQkJCWdldFJhZGlvQnV0dG9uQXRJbmRleChnZXRDcmVhdGVNb2RlKCkpLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJZ2V0UmFkaW9CdXR0b25BdEluZGV4KGdldENyZWF0ZU1vZGUoKSkuc2V0Rm9jdXMoKTsKLQotCQkJCQkvLyBTZXQgdGhlIGhlbHAgY29udGV4dCBmb3IgZWFjaCBidXR0b24KLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzdGFydFBhZ2UuZ2V0UmFkaW9CdXR0b25BdEluZGV4KDApLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9DUkVBVEVYTUwxX0hFTFBJRCk7Ci0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3RhcnRQYWdlLmdldFJhZGlvQnV0dG9uQXRJbmRleCgxKSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMl9IRUxQSUQpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHN0YXJ0UGFnZS5nZXRSYWRpb0J1dHRvbkF0SW5kZXgoMiksIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX0NSRUFURVhNTDNfSEVMUElEKTsKLQkJCQl9Ci0JCQl9OwotCi0KLQkJCXN0YXJ0UGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkcpOwotCQkJc3RhcnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfRVhQTCk7Ci0JCQlhZGRQYWdlKHN0YXJ0UGFnZSk7Ci0JCX0KLQotCQkvLyBuZXcgZmlsZSBwYWdlCi0JCW5ld0ZpbGVQYWdlID0gbmV3IE5ld0ZpbGVQYWdlKGZTZWxlY3Rpb24pOwotCQluZXdGaWxlUGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORyk7Ci0JCW5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdE5hbWUgPSAoZ3JhbW1hclVSSSAhPSBudWxsKSA/IFVSSUhlbHBlci5yZW1vdmVGaWxlRXh0ZW5zaW9uKFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChncmFtbWFyVVJJKSkgOiAiTmV3RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLiIrZXh0OyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVQYWdlLmZpbHRlckV4dGVuc2lvbnMgPSBmaWxlUGFnZUZpbHRlckV4dGVuc2lvbnM7Ci0JCWFkZFBhZ2UobmV3RmlsZVBhZ2UpOwotCi0JCS8vIHNlbGVjdEdyYW1tYXJGaWxlUGFnZQotCQlzZWxlY3RHcmFtbWFyRmlsZVBhZ2UgPSBuZXcgU2VsZWN0R3JhbW1hckZpbGVQYWdlKCk7Ci0JCWFkZFBhZ2Uoc2VsZWN0R3JhbW1hckZpbGVQYWdlKTsKLQotCQkvLyBzZWxlY3Qgcm9vdCBlbGVtZW50IHBhZ2UKLQkJc2VsZWN0Um9vdEVsZW1lbnRQYWdlID0gbmV3IFNlbGVjdFJvb3RFbGVtZW50UGFnZSgpOwotCQlzZWxlY3RSb290RWxlbWVudFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfSEVBRElORyk7Ci0JCXNlbGVjdFJvb3RFbGVtZW50UGFnZS5zZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9FWFBMKTsKLQkJYWRkUGFnZShzZWxlY3RSb290RWxlbWVudFBhZ2UpOwotCX0KLQotCi0JcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKLQkJV2l6YXJkUGFnZSByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RhcnRQYWdlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHN0YXJ0UGFnZTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IG5ld0ZpbGVQYWdlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldENyZWF0ZU1vZGUoKSB7Ci0JCVN0cmluZyBncmFtbWFyVVJJID0gZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKTsKLQotCQlpbnQgcmVzdWx0ID0gQ1JFQVRFX0ZST01fU0NSQVRDSDsKLQkJaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCkgewotCQkJaWYgKGdyYW1tYXJVUkkuZW5kc1dpdGgoIi5kdGQiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCXJlc3VsdCA9IENSRUFURV9GUk9NX0RURDsKLQkJCX0KLQkJCWVsc2UgaWYgKGdyYW1tYXJVUkkuZW5kc1dpdGgoIi54c2QiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCXJlc3VsdCA9IENSRUFURV9GUk9NX1hTRDsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdGFydFBhZ2UgIT0gbnVsbCkgewotCQkJaW50IHNlbGVjdGVkSW5kZXggPSBzdGFydFBhZ2UuZ2V0U2VsZWN0ZWRSYWRpb0J1dHRvbkluZGV4KCk7Ci0JCQlpZiAoc2VsZWN0ZWRJbmRleCAhPSAtMSkgewotCQkJCXJlc3VsdCA9IHNlbGVjdGVkSW5kZXg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSkgewotCQlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKLQkJaWYgKGN1cnJlbnRQYWdlID09IHN0YXJ0UGFnZSkgewotCQkJbmV4dFBhZ2UgPSBuZXdGaWxlUGFnZTsKLQkJfQotCQllbHNlIGlmIChjdXJyZW50UGFnZSA9PSBuZXdGaWxlUGFnZSkgewotCQkJaWYgKGdldENyZWF0ZU1vZGUoKSA9PSBDUkVBVEVfRlJPTV9TQ1JBVENIKSB7Ci0JCQkJbmV4dFBhZ2UgPSBudWxsOwotCQkJfQotCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA9PSBudWxsKSB7Ci0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXh0UGFnZSA9IHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjdXJyZW50UGFnZSA9PSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpIHsKLQkJCW5leHRQYWdlID0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0KLQkJaWYgKChzdGFydFBhZ2UgIT0gbnVsbCAmJiBzdGFydFBhZ2UuZ2V0U2VsZWN0ZWRSYWRpb0J1dHRvbkluZGV4KCkgPT0gQ1JFQVRFX0ZST01fU0NSQVRDSCAmJiBjdXJyZW50UGFnZSA9PSBuZXdGaWxlUGFnZSkgfHwgKGN1cnJlbnRQYWdlID09IHNlbGVjdFJvb3RFbGVtZW50UGFnZSkpIHsKLQkJCXJlc3VsdCA9IGN1cnJlbnRQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJc3VwZXIucGVyZm9ybUZpbmlzaCgpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCQl0cnkgewotCi0JCQlTdHJpbmdbXSBuYW1lc3BhY2VFcnJvcnMgPSBnZW5lcmF0b3IuZ2V0TmFtZXNwYWNlSW5mb0Vycm9ycygpOwotCQkJaWYgKG5hbWVzcGFjZUVycm9ycyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gbmFtZXNwYWNlRXJyb3JzWzBdOwotCQkJCVN0cmluZyBtZXNzYWdlID0gbmFtZXNwYWNlRXJyb3JzWzFdOwotCQkJCXJlc3VsdCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0KLQotCQkJaWYgKHJlc3VsdCkgewotCQkJCWZpbGVOYW1lID0gbmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJCQlpZiAoKG5ldyBQYXRoKGZpbGVOYW1lKSkuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpIHsKLQkJCQkJbmV3RmlsZVBhZ2Uuc2V0RmlsZU5hbWUoZmlsZU5hbWUuY29uY2F0KG5ld0ZpbGVQYWdlLmRlZmF1bHRGaWxlRXh0ZW5zaW9uKSk7Ci0JCQkJfQotCi0JCQkJSUZpbGUgbmV3RmlsZSA9IG5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQlTdHJpbmcgeG1sRmlsZU5hbWUgPSBuZXdGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0JCQkJaWYgKGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlKSB7Ci0KLQkJCQkJZ2VuZXJhdG9yLmNyZWF0ZVhNTERvY3VtZW50KG5ld0ZpbGUsIHhtbEZpbGVOYW1lKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWdlbmVyYXRvci5jcmVhdGVFbXB0eVhNTERvY3VtZW50KG5ld0ZpbGUpOwotCQkJCX0KLQotCQkJCW5ld0ZpbGUucmVmcmVzaExvY2FsKDEsIG51bGwpOwotCi0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCUJhc2ljTmV3UmVzb3VyY2VXaXphcmQuc2VsZWN0QW5kUmV2ZWFsKG5ld0ZpbGUsIHdvcmtiZW5jaFdpbmRvdyk7Ci0JCQkJb3BlbkVkaXRvcihuZXdGaWxlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBjb21wbGV0aW5nIE5ldyBYTUwgd2l6YXJkICIgKyBmaWxlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoSUZpbGUgZmlsZSkgewotCQkvLyBPcGVuIGVkaXRvciBvbiBuZXcgZmlsZS4KLQkJU3RyaW5nIGVkaXRvcklkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQllZGl0b3JJZCA9IGVkaXRvci5nZXRJZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBlZGl0b3IgaWQgY291bGQgbm90IGJlIHJldHJpZXZlZCwgc28gd2UgY2FuIG5vdCBvcGVuIGVkaXRvcgotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hXaW5kb3cgZHcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQl0cnkgewotCQkJaWYgKGR3ICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpCi0JCQkJCXBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JJZCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGVkaXRvciBjYW4gbm90IG9wZW4gZm9yIHNvbWUgcmVhc29uCi0JCQlyZXR1cm47Ci0JCX0KLQotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKSB7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSAicGxhdGZvcm06L3Jlc291cmNlLyIgKyBuZXdGaWxlUGFnZS5nZXRDb250YWluZXJGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKyAiL2R1bW15IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgcmVsYXRpdmVQYXRoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNlbGVjdEdyYW1tYXJGaWxlUGFnZQotCSAqLwotCWNsYXNzIFNlbGVjdEdyYW1tYXJGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQlwcm90ZWN0ZWQgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgcGFuZWw7Ci0KLQkJU2VsZWN0R3JhbW1hckZpbGVQYWdlKCkgewotCQkJc3VwZXIoIlNlbGVjdEdyYW1tYXJGaWxlUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX1NFTEVDVFNPVVJDRV9IRUxQSUQpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkJcGFuZWwgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoY29tcG9zaXRlKTsKLQkJCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFuZWwuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQlpZiAodmlzaWJsZSkgewotCQkJCWlmIChnZXRDcmVhdGVNb2RlKCkgPT0gQ1JFQVRFX0ZST01fRFREKSB7Ci0JCQkJCXNldFRpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9USVRMRSk7Ci0JCQkJCXNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9ERVNDKTsKLQkJCQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhicm93c2VEVERGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFRpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRSk7Ci0JCQkJCXNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9ERVNDKTsKLQkJCQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhicm93c2VYU0RGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCQl9Ci0JCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkobnVsbCk7Ci0JCQkJZ2VuZXJhdG9yLnNldENNRG9jdW1lbnQobnVsbCk7Ci0JCQkJY21Eb2N1bWVudEVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQl9Ci0JCQlwYW5lbC5zZXRWaXNpYmxlSGVscGVyKHZpc2libGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlTdHJpbmcgdXJpID0gcGFuZWwuZ2V0WE1MQ2F0YWxvZ1VSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IHBhbmVsLmdldEZpbGUoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlyZXR1cm4gZ2V0VVJJKCkgIT0gbnVsbCAmJiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCVN0cmluZyB1cmkgPSBnZXRVUkkoKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCWlmICghVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9DQVRBTE9HX0VOVFJZX0lOVkFMSUQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQkJfQotCi0KLQkJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQkgKi8KLQljbGFzcyBTZWxlY3RSb290RWxlbWVudFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29tYm8gY29tYm87Ci0JCXByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbjsKLQkJcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCQlwcm90ZWN0ZWQgWFNET3B0aW9uc1BhbmVsIHhzZE9wdGlvbnNQYW5lbDsKLQkJcHJvdGVjdGVkIERURE9wdGlvbnNQYW5lbCBkdGRPcHRpb25zUGFuZWw7Ci0KLQotCQlTZWxlY3RSb290RWxlbWVudFBhZ2UoKSB7Ci0JCQlzdXBlcigiU2VsZWN0Um9vdEVsZW1lbnRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCQlDb21wb3NpdGUgY29udGFpbmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250YWluZXJHcm91cCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlRfSEVMUElEKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJc2V0Q29udHJvbChjb250YWluZXJHcm91cCk7Ci0KLQkJCS8vIHNlbGVjdCByb290IGVsZW1lbnQKLQkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQljb250YWluZXJMYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UKTsKLQkJCWNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lckdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBPcHRpb25zCi0JCQl7Ci0JCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUyk7Ci0KLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bNF07Ci0KLQkJCQlyYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfQVRUUklCVVRFUyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzBdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDFfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzFdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsxXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9PUFRJT05BTF9FTEVNRU5UUyk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzFdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDJfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsyXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzJdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDNfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblszXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzNdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDRfSEVMUElEKTsKLQkJCQkvKgotCQkJCSAqIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJCQkgKiAKLQkJCQkgKiByYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJICogcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCIpKTsKLQkJCQkgKiByYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldwotCQkJCSAqIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCSAqIHJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMF0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfT05MWSk7Ci0JCQkJICogCi0JCQkJICogcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJCSAqIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLmdldFN0cmluZygiX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUwiKSk7Ci0JCQkJICogcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcKLQkJCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMV0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfQU5EX09QVElPTik7Ci0JCQkJICovCi0JCQl9Ci0KLQkJCS8vIGFkZCB0aGUgZ3JhbW1hciBzcGVjaWZpYyBnZW5lcmF0aW9uIG9wdGlvbnMKLQkJCS8vCi0JCQl7Ci0JCQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQl4c2RPcHRpb25zUGFuZWwgPSBuZXcgWFNET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlkdGRPcHRpb25zUGFuZWwgPSBuZXcgRFRET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlwYWdlQm9vay5zaG93UGFnZSh4c2RPcHRpb25zUGFuZWwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gKGluZGV4ICE9IC0xKSA/IGNvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkJCWdlbmVyYXRvci5zZXRSb290RWxlbWVudE5hbWUocm9vdEVsZW1lbnROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgewotCQkJCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFVSSSgpKTsKLQkJCQkJCWdlbmVyYXRvci5zZXRYTUxDYXRhbG9nRW50cnkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFhNTENhdGFsb2dFbnRyeSgpKTsKLQkJCQkJfQotCQkJCQlBc3NlcnQuaXNOb3ROdWxsKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkpOwotCi0JCQkJCWlmIChnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpID09IG51bGwpIHsKLQkJCQkJCWZpbmFsIFN0cmluZ1tdIGVycm9ySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQlmaW5hbCBDTURvY3VtZW50W10gY21kb2NzID0gbmV3IENNRG9jdW1lbnRbMV07Ci0JCQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJY21kb2NzWzBdID0gTmV3WE1MR2VuZXJhdG9yLmNyZWF0ZUNNRG9jdW1lbnQoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgZXJyb3JJbmZvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcik7Ci0KLQkJCQkJCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtZG9jc1swXSk7Ci0JCQkJCQljbURvY3VtZW50RXJyb3JNZXNzYWdlID0gZXJyb3JJbmZvWzFdOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRDTURvY3VtZW50KCkgIT0gbnVsbCAmJiBjbURvY3VtZW50RXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQkJCUNNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwID0gZ2VuZXJhdG9yLmdldENNRG9jdW1lbnQoKS5nZXRFbGVtZW50cygpOwotCQkJCQkJVmVjdG9yIG5hbWVOb2RlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVOb2RlTWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbmFtZU5vZGVNYXAuaXRlbShpKTsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSBjbUVsZW1lbnREZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmICh2YWx1ZSAhPSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJCQkJbmFtZU5vZGVWZWN0b3IuYWRkKGNtRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJT2JqZWN0W10gbmFtZU5vZGVBcnJheSA9IG5hbWVOb2RlVmVjdG9yLnRvQXJyYXkoKTsKLQkJCQkJCWlmIChuYW1lTm9kZUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQkJCQlBcnJheXMuc29ydChuYW1lTm9kZUFycmF5LCBDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRSb290TmFtZSA9IChTdHJpbmcpIChnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpKS5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmF1bHRSb290TmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpbnQgZGVmYXVsdFJvb3RJbmRleCA9IC0xOwotCQkJCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0KLQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lTm9kZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gKFN0cmluZykgbmFtZU5vZGVBcnJheVtpXTsKLQotCQkJCQkJCWNvbWJvLmFkZChlbGVtZW50TmFtZSk7Ci0JCQkJCQkJaWYgKGRlZmF1bHRSb290TmFtZSAhPSBudWxsICYmIGRlZmF1bHRSb290TmFtZS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJCQkJCWRlZmF1bHRSb290SW5kZXggPSBpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5hbWVOb2RlQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCWRlZmF1bHRSb290SW5kZXggPSBkZWZhdWx0Um9vdEluZGV4ICE9IC0xID8gZGVmYXVsdFJvb3RJbmRleCA6IDA7Ci0JCQkJCQkJY29tYm8uc2VsZWN0KGRlZmF1bHRSb290SW5kZXgpOwotCQkJCQkJCWdlbmVyYXRvci5zZXRSb290RWxlbWVudE5hbWUoY29tYm8uZ2V0SXRlbShkZWZhdWx0Um9vdEluZGV4KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5lbmRzV2l0aCgieHNkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoeHNkT3B0aW9uc1BhbmVsKTsKLQkJCQkJCWdlbmVyYXRvci5zZXREZWZhdWx0U3lzdGVtSWQoZ2V0RGVmYXVsdFN5c3RlbUlkKCkpOwotCQkJCQkJZ2VuZXJhdG9yLmNyZWF0ZU5hbWVzcGFjZUluZm9MaXN0KCk7Ci0KLQkJCQkJCS8vIFByb3ZpZGUgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4IGlmIG5vbmUKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJhdG9yLm5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbykgZ2VuZXJhdG9yLm5hbWVzcGFjZUluZm9MaXN0LmdldChpKTsKLQkJCQkJCQlpZiAoKG5zaW5mby5wcmVmaXggPT0gbnVsbCB8fCBuc2luZm8ucHJlZml4LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAobnNpbmZvLnVyaSAhPSBudWxsICYmIG5zaW5mby51cmkudHJpbSgpLmxlbmd0aCgpICE9IDApKSB7Ci0JCQkJCQkJCW5zaW5mby5wcmVmaXggPSBnZXREZWZhdWx0UHJlZml4KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJeHNkT3B0aW9uc1BhbmVsLnNldE5hbWVzcGFjZUluZm9MaXN0KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZHRkT3B0aW9uc1BhbmVsKTsKLQkJCQkJCWR0ZE9wdGlvbnNQYW5lbC51cGRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7IGlmCi0JCQkJICogKGVycm9yTWVzc2FnZSA9PSBudWxsKSBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCSAqLwotCi0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJlZml4KExpc3QgbnNJbmZvTGlzdCkgewotCQkJU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuc0luZm9MaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0KLQkJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc0luZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbykgbnNJbmZvTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKG5zaW5mby5wcmVmaXggIT0gbnVsbCkKLQkJCQkJdi5hZGRFbGVtZW50KG5zaW5mby5wcmVmaXgpOwotCQkJfQotCi0JCQlpZiAodi5jb250YWlucyhkZWZhdWx0UHJlZml4KSkgewotCQkJCVN0cmluZyBzID0gZGVmYXVsdFByZWZpeDsKLQkJCQlmb3IgKGludCBqID0gMDsgdi5jb250YWlucyhzKTsgaisrKSB7Ci0JCQkJCXMgPSBkZWZhdWx0UHJlZml4ICsgSW50ZWdlci50b1N0cmluZyhqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHM7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVmYXVsdFByZWZpeDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJYm9vbGVhbiBjb21wbGV0ZSA9IChnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkgIT0gbnVsbCAmJiBnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPiAwKSAmJiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCi0JCQlpZiAoY29tcGxldGUpIHsKLQkJCQkvKgotCQkJCSAqIGludCBidWlsZFBvbGljeSA9IHJhZGlvQnV0dG9uWzBdLmdldFNlbGVjdGlvbigpID8KLQkJCQkgKiBET01Db250ZW50QnVpbGRlci5CVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQgOgotCQkJCSAqIERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX0FMTF9DT05URU5UOwotCQkJCSAqLwotCQkJCWludCBidWlsZFBvbGljeSA9IDA7Ci0JCQkJaWYgKHJhZGlvQnV0dG9uWzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUzsKLQkJCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9PUFRJT05BTF9FTEVNRU5UUzsKLQkJCQlpZiAocmFkaW9CdXR0b25bMl0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9GSVJTVF9DSE9JQ0UgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9GSVJTVF9TVUJTVElUVVRJT047Ci0JCQkJaWYgKHJhZGlvQnV0dG9uWzNdLmdldFNlbGVjdGlvbigpKQotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfVEVYVF9OT0RFUzsKLQotCQkJCWdlbmVyYXRvci5zZXRCdWlsZFBvbGljeShidWlsZFBvbGljeSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wbGV0ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCi0JCQlpZiAoY21Eb2N1bWVudEVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gY21Eb2N1bWVudEVycm9yTWVzc2FnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKSA9PSBudWxsIHx8IGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQlpZiAoeHNkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0KLQkJCQkJZXJyb3JNZXNzYWdlID0geHNkT3B0aW9uc1BhbmVsLmNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZHRkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSA9IGR0ZE9wdGlvbnNQYW5lbC5jb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vL0VuZCBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQotCi0KLQlwdWJsaWMgc3RhdGljIEdyaWRMYXlvdXQgY3JlYXRlT3B0aW9uc1BhbmVsTGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQljbGFzcyBYU0RPcHRpb25zUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgewotCQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZTsKLQkJcHJvdGVjdGVkIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGVkaXROYW1lc3BhY2VzOwotCi0JCXB1YmxpYyBYU0RPcHRpb25zUGFuZWwoU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHBhcmVudFBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJdGhpcy5wYXJlbnRQYWdlID0gcGFyZW50UGFnZTsKLQotCQkJc2V0TGF5b3V0KGNyZWF0ZU9wdGlvbnNQYW5lbExheW91dCgpKTsKLQkJCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlDb21wb3NpdGUgY28gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJCWNvLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJaWYgKG5ld0ZpbGVQYWdlICE9IG51bGwgJiYgbmV3RmlsZVBhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJLy8gdG9kby4uLiB0aGlzIGlzIGEgbmFzdHkgbWVzcy4gSSBuZWVkIHRvIHJldmlzdCB0aGlzIGNvZGUuCi0JCQkJLy8KLQkJCQlTdHJpbmcgcmVzb3VyY2VVUkkgPSAicGxhdGZvcm06L3Jlc291cmNlIiArIG5ld0ZpbGVQYWdlLmdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICIvZHVtbXkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcmVzb2x2ZWRQYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZXNvdXJjZVVSSSwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKHJlc29sdmVkUGF0aC5zdGFydHNXaXRoKCJmaWxlOi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZWRQYXRoLnN1YnN0cmluZyg2KTsKLQkJCQl9Ci0JCQkJLy8gZW5kIG5hc3R5IG1lc3NzCi0JCQkJU3RyaW5nIHRhYmxlVGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9JTkZPUk1BVElPTjsKLQkJCQllZGl0TmFtZXNwYWNlcyA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhjbywgbmV3IFBhdGgocmVzb2x2ZWRQYXRoKSwgdGFibGVUaXRsZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJCWVkaXROYW1lc3BhY2VzLnNldE5hbWVzcGFjZUluZm9MaXN0KGxpc3QpOwotCQkJZWRpdE5hbWVzcGFjZXMudXBkYXRlRXJyb3JNZXNzYWdlKGxpc3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJCU5hbWVzcGFjZUluZm9FcnJvckhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCk7Ci0JCQllcnJvck1lc3NhZ2UgPSBoZWxwZXIuY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCwgbnVsbCk7Ci0JCQlwYXJlbnRQYWdlLnVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQl9Ci0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRFRET3B0aW9uc1BhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgR3JvdXAgZ3JvdXA7Ci0JCXByb3RlY3RlZCBUZXh0IHN5c3RlbUlkRmllbGQ7Ci0JCXByb3RlY3RlZCBUZXh0IHB1YmxpY0lkRmllbGQ7Ci0JCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZTsKLQotCQlwdWJsaWMgRFRET3B0aW9uc1BhbmVsKFNlbGVjdFJvb3RFbGVtZW50UGFnZSBwYXJlbnRQYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRoaXMucGFyZW50UGFnZSA9IHBhcmVudFBhZ2U7Ci0JCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJc2V0TGF5b3V0KGNyZWF0ZU9wdGlvbnNQYW5lbExheW91dCgpKTsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9ET0NUWVBFX0lORk9STUFUSU9OKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJTGFiZWwgcHVibGljSWRMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcHVibGljSWRMYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEKTsKLQkJCXB1YmxpY0lkRmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJcHVibGljSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXB1YmxpY0lkRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHB1YmxpY0lkRmllbGQsIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UNV9IRUxQSUQpOwotCi0JCQlMYWJlbCBzeXN0ZW1JZExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQpOwotCQkJc3lzdGVtSWRGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlzeXN0ZW1JZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJc3lzdGVtSWRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3lzdGVtSWRGaWVsZCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ2X0hFTFBJRCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlTdHJpbmcgdGhlUHVibGljSWQgPSBudWxsOwotCQkJU3RyaW5nIHRoZVN5c3RlbUlkID0gbnVsbDsKLQkJCUlDYXRhbG9nRW50cnkgeG1sQ2F0YWxvZ0VudHJ5ID0gZ2VuZXJhdG9yLmdldFhNTENhdGFsb2dFbnRyeSgpOwotCi0JCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5ICE9IG51bGwpIHsKLQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5LmdldEVudHJ5VHlwZSgpID09IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpIHsKLQkJCQkJdGhlUHVibGljSWQgPSB4bWxDYXRhbG9nRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCXRoZVN5c3RlbUlkID0geG1sQ2F0YWxvZ0VudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKTsKLQkJCQkJaWYgKHRoZVN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXRoZVN5c3RlbUlkID0gZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5zdGFydHNXaXRoKCJodHRwOiIpID8gZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA6IFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGVTeXN0ZW1JZCA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGVTeXN0ZW1JZCA9IGdldERlZmF1bHRTeXN0ZW1JZCgpOwotCQkJfQotCi0JCQlwdWJsaWNJZEZpZWxkLnNldFRleHQodGhlUHVibGljSWQgIT0gbnVsbCA/IHRoZVB1YmxpY0lkIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQodGhlU3lzdGVtSWQgIT0gbnVsbCA/IHRoZVN5c3RlbUlkIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWdlbmVyYXRvci5zZXRTeXN0ZW1JZChzeXN0ZW1JZEZpZWxkLmdldFRleHQoKSk7Ci0JCQlnZW5lcmF0b3Iuc2V0UHVibGljSWQocHVibGljSWRGaWVsZC5nZXRUZXh0KCkpOwotCQkJcGFyZW50UGFnZS51cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyZGQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTEltcG9ydEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vLyBUT0RPIGNzLi4uIHJlbmFtZSB0aGlzIGNsYXNzIE5ld1hNTEFjdGlvbkRlbGVnYXRlCi0vLyB3ZSBuZWVkIHRvIHJlLWFkZCBwcmUtdmFsaWRhdGlvbiB1c2luZyB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgQVBJJ3MKLS8vIHNpbmNlIHdlIGFsc28gbmVlZCB0byBhZGQgdmFsaWRhdGlvbiB0byB0aGUgJ05ldyBYTUwnIGNhc2UsIHRoaXMgcHJldmFsaWRhdGlvbgotLy8gZnVuY3Rpb24gc2hvdWxkIHJlYWxseSBnbyBpbnRvIHRoZSBOZXdXaXphcmQgc29tZXdoZXJlCi0vLwotcHVibGljIGNsYXNzIFhNTEltcG9ydEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17IAotICAvKioKLSAgICogQ2hlY2tzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgcnVucyB0aGUgc2VwYXJhdGUgYnJvd3NlcgotICAgKiB0byBzaG93IHRoZSBjb250ZW50IG9mIHRoZSBSZWFkbWUgZmlsZS4gVGhpcyBjb2RlIHNob3dzIGhvdwotICAgKiB0byBsYXVuY2ggc2VwYXJhdGUgYnJvd3NlcnMgdGhhdCBhcmUgbm90IFZBL0Jhc2UgZGVza3RvcCBwYXJ0cy4KLSAgICoKLSAgICogQHBhcmFtIGFjdGlvbiAgdGhlIGFjdGlvbiB0aGF0IHdhcyBwZXJmb3JtZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gZ2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLSAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJRmlsZSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJRmlsZSBmaWxlID0gKElGaWxlKXNlbGVjdGVkT2JqZWN0OwotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247ICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIE5ld1hNTFdpemFyZC5zaG93RGlhbG9nKHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCBmaWxlLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9YTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coKTsKLSAgICAgIH0gICAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHVudXNlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICAvLyB1bnVzZWQKLSAgfQotCi0gIC8vIHNjYW1tZWQgZnJvbSBXaW5kb3dVdGlsaXR5Ci0gIC8vCi0gIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9IC8vIGVuZCBvZiBpZiAoKQotCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBlcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICBJdGVyYXRvciBpPSBlcy5pdGVyYXRvcigpOwotICAgICAgIGlmIChpLmhhc05leHQoKSkKLSAgICAgICB7Ci0gICAgICAgICByZXN1bHQ9IGkubmV4dCgpOwotICAgICAgIH0KLSAgICB9CQkJCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzRhMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBYTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlciB7Ci0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJRmlsZSBpZmlsZSkgewotCQlTdHJpbmcgeHNkRmlsZU5hbWUgPSBpZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBpc1ZhbGlkKHhzZEZpbGVOYW1lKTsKLQl9Ci0JLyoqCi0JICogU2hvdWxkIHRoaXMgYmUgaW1wbGVtZW50ZWQgYXMgYSBWYWxpZGF0b3IgYW5kIHNpbXBseSBjYWxsZWQgYXMgc3VjaCB3aXRoCi0JICogYSByZXBvcnRlciB0aGF0IG9ubHkgY2hlY2tzIHRoZSByZXN1bHRzIGZvciBzZXZlcml0eSA9IGVycm9yPyAgT3Igc2hvdWxkCi0JICogdGhlIFhlcmNlcyByZXF1aXJlbWVudCBiZSBicm9rZW4gdXNpbmcgYSBwbHVnLWluIGV4dGVuc2lvbj8KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHhzZEZpbGVOYW1lKSB7Ci0vLwkJRE9NQVNCdWlsZGVySW1wbCBidWlsZGVyID0gbmV3IERPTUFTQnVpbGRlckltcGwoKTsKLS8vCQlET01FcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERPTUVycm9ySGFuZGxlcigpOwotLy8JCWJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0JCXRyeSB7Ci0JCQkvL1N0cmluZyB1cmkgPSAKLQkJCQlVUklIZWxwZXIuZ2V0VVJJRm9yRmlsZVBhdGgoeHNkRmlsZU5hbWUpOwotLy8JCQlBU01vZGVsIG1vZGVsID0gYnVpbGRlci5wYXJzZUFTVVJJKHVyaSk7Ci0vLwkJCWlmIChlcnJvckhhbmRsZXIuaGFzRXJyb3IoKSkKLS8vCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIC8vIGludmFsaWQgc2NoZW1hCi0JCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBpbm5lciBjbGFzcwotCWNsYXNzIERPTUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBoYXNFcnJvciA9IGZhbHNlOwotCi0JCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgewotCQkJcmV0dXJuIGhhc0Vycm9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXJyKSB7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaGFzRXJyb3IgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIG5vdCBhbiBlcnJvcgotCQl9Ci0JfSAvLyBlbmQgRE9NRXJyb3JIYW5kbGVySW1wbAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjYWZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIFhNTFdpemFyZAotewotICBwcm90ZWN0ZWQgc3RhdGljIFhNTFdpemFyZCBpbnN0YW5jZSA9IG5ldyBYTUxXaXphcmQoKTsKLQotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxXaXphcmQgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICBwdWJsaWMgWE1MV2l6YXJkKCkKLSAgewotICAgIGluc3RhbmNlID0gdGhpczsKLQotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkKLSAgewotICAgIHRyeSB7Ci0gICAgICBVUkwgdXJsPSBuZXcgVVJMKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIpLmdldEVudHJ5KCIvIiksIG5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotICAgIH0KLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZHNNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjZkMWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgV2l6YXJkcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFdpemFyZHNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy53aXphcmRSZXNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19USVRMRV9JTlZBTElEX0dSQU1NQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fWE1MX0ZST01fRFREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19YTUxfRlJPTV9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1hNTF9GUk9NX1NDUkFUQ0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfWFNEX0ZJTEVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9ST09UX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ST09UX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fUk9PVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9fTE9DQVRJT05fSElOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRDsvLyBjb21tZW50ZWQgb3V0Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUw7Ly8gY29tbWVudGVkIG91dAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfRklSU1RfQ0hPSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfRklMTF9FTEVNRU5UU19BTkRfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9DVFlQRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1lTVEVNX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX1NDSEVNQV9JTlZBTElEX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX0NBVEFMT0dfRU5UUllfSU5WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fUGx1Z2luc19VbmF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2Nhbm5vdF9iZV9wZXJmb3JtZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzY19wcm9qOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX29wX2Vycm9yX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VfZXJyb3JfYWxyZWFkeWV4aXN0czsKLQkKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MV2l6YXJkc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTFdpemFyZHNNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL2ljb25zL2dlbmVyYXRleG1sX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL2ljb25zL2dlbmVyYXRleG1sX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGY2NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9pY29ucy9nZW5lcmF0ZXhtbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy93aXphcmRSZXNvdXJjZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy93aXphcmRSZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjM5M2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvd2l6YXJkUmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNTCBUb29scyAtICBOZXcgWE1MIFdpemFyZAotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSFYTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZQotX1VJX0RJQUxPR19ORVdfVElUTEUgICAgICAgID0gTmV3Ci1fVUlfRElBTE9HX1RJVExFX0lOVkFMSURfR1JBTU1BUiA9IEludmFsaWQgR3JhbW1hcgotX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUiA9IFRoZSBncmFtbWFyIGZpbGUgY29udGFpbnMgZXJyb3JzLiBJZiB5b3UgcHJvY2VlZCwgYW4gaW5jb3JyZWN0IHJlc3VsdCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIU5ld1hNTEJXaXphcmQKLV9VSV9SQURJT19YTUxfRlJPTV9EVEQgICAgICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhICZEVEQgZmlsZQotX1VJX1JBRElPX1hNTF9GUk9NX1NDSEVNQSAgICAgICAgICAgICA9IENyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuICZYTUwgc2NoZW1hIGZpbGUKLV9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSAmc2NyYXRjaAotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkcgICAgICAgICA9IENyZWF0ZSBYTUwgRmlsZQotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEwgICAgICAgICAgICA9IFNlbGVjdCBob3cgeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIHlvdXIgWE1MIGZpbGUuCi1fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9IRUFESU5HICAgID0gWE1MIEZpbGUgTmFtZQotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfRVhQTCAgICAgICA9IFNwZWNpZnkgYSBuYW1lIGZvciB0aGUgbmV3IFhNTCBmaWxlLgotX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfREVTQyAgICAgICA9IFNlbGVjdCB0aGUgRFREIGZpbGUgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS4KLV9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFICAgICAgPSBTZWxlY3QgRFREIEZpbGUKLV9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0MgICAgICAgPSBTZWxlY3QgdGhlIHNjaGVtYSBmaWxlIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuCi1fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRSAgICAgID0gU2VsZWN0IFhNTCBTY2hlbWEgRmlsZQotX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HICAgICAgICA9IFNlbGVjdCBSb290IEVsZW1lbnQKLV9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfRVhQTCAgICAgICAgICAgPSBTZWxlY3QgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIGZpbGUuCi1fVUlfTEFCRUxfUk9PVF9FTEVNRU5UICAgICAgICAgICAgICAgID0gUm9vdCBlbGVtZW50OgotX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUyAgICA9IE5vIFJvb3QgRWxlbWVudHMKLV9VSV9XQVJOSU5HX01TR19OT19ST09UX0VMRU1FTlRTICAgICAgPSBObyByb290IGVsZW1lbnQgZXhpc3RzIHNpbmNlIHRoZSBzY2hlbWEgcHJvdmlkZWQgaGFzIG5vIGdsb2JhbCBlbGVtZW50cy4KLV9VSV9MQUJFTF9OT19MT0NBVElPTl9ISU5UICAgICAgICAgICAgPSBVbnNwZWNpZmllZCBOYW1lc3BhY2UgTG9jYXRpb24KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzEgICAgPSBZb3UgaGF2ZSBub3Qgc3BlY2lmaWVkIGEgbG9jYXRpb24gaGludCBmb3Igb25lIG9yIG1vcmUgbmFtZXNwYWNlIGVudHJpZXMuCi1fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yICAgID0gRWxlbWVudHMgZnJvbSB0aGVzZSBuYW1lc3BhY2VzIHdpbGwgbm90IGJlIGdlbmVyYXRlZC4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbnZhbGlkIGdlbmVyYXRlZCBkb2N1bWVudC4KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzMgICAgPSBDbGljayBZZXMgdG8gY29udGludWUsIENsaWNrIE5vIHRvIGdvIGJhY2sgYW5kIHNwZWNpZnkgdGhlIGxvY2F0aW9uIGhpbnRzLgotX1VJX1dJWkFSRF9DT05URU5UX09QVElPTlMgICAgICAgICAgICA9IENvbnRlbnQgb3B0aW9ucwotCi1fVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCAgICAgICAgICAgID0gJkNyZWF0ZSByZXF1aXJlZCBjb250ZW50IG9ubHkKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMICAgICAgICAgICAgPSBDcmVhdGUgcmVxdWlyZWQgYW5kICZvcHRpb25hbCBjb250ZW50Ci0KLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVMgPSBDcmVhdGUgb3B0aW9uYWwgJmF0dHJpYnV0ZXMKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0VMRU1FTlRTICAgPSBDcmVhdGUgb3B0aW9uYWwgZSZsZW1lbnRzCi1fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UgICAgICAgID0gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCAmY2hvaWNlCi1fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMgPSBGaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggJmRhdGEKLQotX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04gICAgICAgICA9IERvY3VtZW50IHR5cGUgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9TWVNURU1fSUQgICAgICAgICAgICAgICAgICAgPSAmU3lzdGVtIElEOgotX1VJX0xBQkVMX1BVQkxJQ19JRCAgICAgICAgICAgICAgICAgICA9ICZQdWJsaWMgSUQ6Ci0KLV9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gICAgICAgPSBUaGUgc3BlY2lmaWVkIHJlc291cmNlIGNhbm5vdCBiZSBsb2NhdGVkIDoKLQotIU5ld01vZGVsV2l6YXJkCi1fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SICAgICAgICAgICAgID0gSW52YWxpZCBHcmFtbWFyCi0KLSFOZXdNb2RlbFdpemFyZAotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgICAgICAgID0gVGhlIHNhbWUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KLV9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQgPSBBIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4KLV9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPICAgPSBUaGUgc2NoZW1hIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBmb3IgZGV0YWlscy4KLV9VSV9MQUJFTF9FUlJPUl9EVERfSU5WQUxJRF9JTkZPICAgICAgPSBUaGUgRFREIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yIGZvciBkZXRhaWxzLgotCi1fVUlfTEFCRUxfRVJST1JfQ0FUQUxPR19FTlRSWV9JTlZBTElEID0gVGhlIHNlbGVjdGVkIGNhdGFsb2cgZW50cnkgc3BlY2lmaWVzIGEgVVJJIHRoYXQgY2FuIG5vdCBiZSBsb2NhdGVkLgotCi1fVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OPU5hbWVzcGFjZSBJbmZvcm1hdGlvbgotVmFsaWRhdGlvbl9QbHVnaW5zX1VuYXZhaWxhYmxlPVZhbGlkYXRpb24gUGx1Z2lucyBVbmF2YWlsYWJsZQotVmFsaWRhdGlvbl9jYW5ub3RfYmVfcGVyZm9ybWVkPVZhbGlkYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSB2YWxpZGF0aW9uIHBsdWdpbnMgd2VyZSBkaXNhYmxlZCBvciBub3QgZm91bmQuICBUaGUgZ2VuZXJhdGVkIGZpbGUgbWF5IGJlIGludmFsaWQuICBEbyB5b3Ugd2lzaCB0byBjb250aW51ZT8KLSMKLSMgRXhhbXBsZVByb2plY3QKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzYz1DcmVhdGluZyBleGFtcGxlIHByb2plY3RzLi4uCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uX29wX2Rlc2NfcHJvaj1Db25maWd1cmluZyBwcm9qZWN0Li4uCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX3RpdGxlPU5ldyBFeGFtcGxlIFByb2plY3QKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfdGl0bGU9UHJvamVjdCBDcmVhdGlvbiBGYWlsZWQKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfbWVzc2FnZT1Qcm9qZWN0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV90aXRsZT1PdmVyd3JpdGUKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfbWVzc2FnZT1EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgezB9PwotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VfZXJyb3JfYWxyZWFkeWV4aXN0cz1Qcm9qZWN0IGFscmVhZHkgZXhpc3RzLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYxZjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFiczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0LlN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kb3VibGVjbGljay5YTUxEb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlhNTEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLlhNTEluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLlhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgWE1MIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlclN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKHN1cGVyU3RyYXRlZ2llc1tpXSk7Ci0JCX0KLQotCQlpZiAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneVhNTCgpKTsKLQkJfQotCi0JCS8vIGJlIHN1cmUgdGhpcyBpcyBsYXN0LCBzbyBpdCBjYW4gbW9kaWZ5IGFueSByZXN1bHRzIGZvcm0gcHJldmlvdXMKLQkJLy8gY29tbWFuZHMgdGhhdCBtaWdodCBvbiBvbiBzYW1lIHBhcnRpaW9uIHR5cGUuCi0JCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicygpKTsKLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCi0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXSB4bWxUeXBlcyA9IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW3htbFR5cGVzLmxlbmd0aCArIDJdOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMF0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT047Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1sxXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHhtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0gMiwgeG1sVHlwZXMubGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IG51bGw7Ci0KLQkJaWYgKChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTikgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IFhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04pIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJZmluYWwgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpOwotCi0JCWZvcm1hdHRlci5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCkpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0KLQkJSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGRvdWJsZUNsaWNrU3RyYXRlZ3kgPSBudWxsOwotCQlpZiAoY29udGVudFR5cGUuY29tcGFyZVRvKElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSA9PSAwKQotCQkJZG91YmxlQ2xpY2tTdHJhdGVneSA9IG5ldyBYTUxEb3VibGVDbGlja1N0cmF0ZWd5KCk7Ci0JCWVsc2UKLQkJCWRvdWJsZUNsaWNrU3RyYXRlZ3kgPSBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQlyZXR1cm4gZG91YmxlQ2xpY2tTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgSUh5cGVybGlua0RldGVjdG9yW10gZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbCB8fCAhZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0hZUEVSTElOS1NfRU5BQkxFRCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlMaXN0IGFsbERldGVjdG9ycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWFsbERldGVjdG9ycy5hZGQobmV3IFhNTEh5cGVybGlua0RldGVjdG9yKCkpOwotCi0JCUlIeXBlcmxpbmtEZXRlY3RvcltdIHN1cGVyRGV0ZWN0b3JzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKHNvdXJjZVZpZXdlcik7Ci0JCWZvciAoaW50IG0gPSAwOyBtIDwgc3VwZXJEZXRlY3RvcnMubGVuZ3RoOyBtKyspIHsKLQkJCUlIeXBlcmxpbmtEZXRlY3RvciBkZXRlY3RvciA9IHN1cGVyRGV0ZWN0b3JzW21dOwotCQkJaWYgKCFhbGxEZXRlY3RvcnMuY29udGFpbnMoZGV0ZWN0b3IpKSB7Ci0JCQkJYWxsRGV0ZWN0b3JzLmFkZChkZXRlY3Rvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJSHlwZXJsaW5rRGV0ZWN0b3JbXSkgYWxsRGV0ZWN0b3JzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtEZXRlY3RvclswXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJVmVjdG9yIHZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCQkvLyBwcmVmaXhbMF0gaXMgZWl0aGVyICdcdCcgb3IgJyAnIHggdGFiV2lkdGgsIGRlcGVuZGluZyBvbiBwcmVmZXJlbmNlCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCWJvb2xlYW4gdXNlU3BhY2VzID0gWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMoaW5kZW50Q2hhclByZWYpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJU3RyaW5nQnVmZmVyIHByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYXBwZW5kVGFiID0gZmFsc2U7Ci0KLQkJCWlmICh1c2VTcGFjZXMpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiArIGkgPCBpbmRlbnRhdGlvbldpZHRoOyBqKyspCi0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gaW5kZW50YXRpb25XaWR0aCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFwcGVuZFRhYikgewotCQkJCXByZWZpeC5hcHBlbmQoJ1x0Jyk7Ci0JCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCQkJLy8gcmVtb3ZlIHRoZSB0YWIgc28gdGhhdCBpbmRlbnRhdGlvbiAtIHRhYiBpcyBhbHNvIGFuIGluZGVudAotCQkJCS8vIHByZWZpeAotCQkJCXByZWZpeC5kZWxldGVDaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJfQotCi0JCXZlY3Rvci5hZGQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChTdHJpbmdbXSkgdmVjdG9yLnRvQXJyYXkobmV3IFN0cmluZ1t2ZWN0b3Iuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIElJbmZvcm1hdGlvblByb3ZpZGVyIGdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlJbmZvcm1hdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJaWYgKChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTikgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpKSB7Ci0JCQlwcm92aWRlciA9IG5ldyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04gfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfUEkpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9yWE1MKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9yWE1MKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MID09IG51bGwpCi0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKTsKLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvclhNTDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRIb3ZlciBnZXRUZXh0SG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSwgaW50IHN0YXRlTWFzaykgewotCQlJVGV4dEhvdmVyIHRleHRIb3ZlciA9IG51bGw7Ci0KLQkJLy8gbG9vayBmb3IgYXBwcm9wcmlhdGUgdGV4dCBob3ZlciBwcm9jZXNzb3IgdG8gcmV0dXJuIGJhc2VkIG9uCi0JCS8vIGNvbnRlbnQgdHlwZSBhbmQgc3RhdGUgbWFzawotCQlpZiAoKGNvbnRlbnRUeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTikgfHwgKGNvbnRlbnRUeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSkgewotCQkJLy8gY2hlY2sgd2hpY2ggb2YgeG1sJ3MgdGV4dCBob3ZlciBpcyBoYW5kbGluZyBzdGF0ZU1hc2sKLQkJCVRleHRIb3Zlck1hbmFnZXIgbWFuYWdlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCk7Ci0JCQlUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3JbXSBob3ZlckRlc2NzID0gbWFuYWdlci5nZXRUZXh0SG92ZXJzKCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IGhvdmVyRGVzY3MubGVuZ3RoICYmIHRleHRIb3ZlciA9PSBudWxsKSB7Ci0JCQkJaWYgKGhvdmVyRGVzY3NbaV0uaXNFbmFibGVkKCkgJiYgRWRpdG9yVXRpbGl0eS5jb21wdXRlU3RhdGVNYXNrKGhvdmVyRGVzY3NbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKSkgPT0gc3RhdGVNYXNrKSB7Ci0JCQkJCVN0cmluZyBob3ZlclR5cGUgPSBob3ZlckRlc2NzW2ldLmdldElkKCk7Ci0JCQkJCWlmIChUZXh0SG92ZXJNYW5hZ2VyLkNPTUJJTkFUSU9OX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkKLQkJCQkJCXRleHRIb3ZlciA9IG1hbmFnZXIuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQkJCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5ET0NVTUVOVEFUSU9OX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkKLQkJCQkJCXRleHRIb3ZlciA9IG5ldyBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKTsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJLy8gbm8gYXBwcm9wcmlhdGUgdGV4dCBob3ZlcnMgZm91bmQsIHRyeSBzdXBlcgotCQlpZiAodGV4dEhvdmVyID09IG51bGwpCi0JCQl0ZXh0SG92ZXIgPSBzdXBlci5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSwgc3RhdGVNYXNrKTsKLQotCQlyZXR1cm4gdGV4dEhvdmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9ET01PYnNlcnZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0RPTU9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjU5NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0RPTU9ic2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5DTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBvYnNlcnZlIGNoYW5nZXMgaW4gdGhlIERPTSBhbmQgcGVyZm9ybQotICogb2NjYXNpb25hbCdzY2FucycgdG8gZGVkdWNlIGluZm9ybWF0aW9uLiBXZSB1c2UgYSBkZWxheSB0aW1lciBtZWNoYW5pc20gdG8KLSAqIGVuc3VyZSBzY2FucyBhcmUgbWFkZSBldmVyeSBjb3VwbGUgb2Ygc2Vjb25kcyB0byBhdm9pZCBwZXJmb3JtYW5jZQotICogcHJvYmxlbXMuIEN1cnJlbnRseSB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiByZWZlcmVuY2VkIGdyYW1tYXIKLSAqIHVyaSdzIHdpdGhpbiB0aGUgZG9jdW1lbnQgZW5zdXJlIHRoYXQgdGhleSBhcmUgbG9hZGVkIGJ5IHRoZQotICogQ01Eb2N1bWVudE1hbmFnZXIuIFdlIG1pZ2h0IHdhbnQgdG8gZ2VuZXJhbGl6ZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gb3RoZXIKLSAqIHN1cGxpbWVudGFsIGluZm9ybWF0aW9uIGdhdGhlcmluZyB0aGF0IGlzIHN1aXRhYmxlIGZvciAndGltZSBkZWxheWVkJwotICogY29tcHV0YXRpb24gKGVycm9yIGhpbnRzIGV0Yy4pLgotICovCi0vLyBUT0RPOiBXaGVyZSBzaG91bGQgdGhpcyBjbGFzcyBnbz8KLXB1YmxpYyBjbGFzcyBET01PYnNlcnZlciB7Ci0KLQotCS8vIEFuIGFic3RyYWN0IGFkYXB0ZXIgdGhhdCBlbnN1cmVzIHRoYXQgdGhlIGNoaWxkcmVuIG9mIGEgbmV3IE5vZGUgYXJlCi0JLy8gYWxzbyBhZGFwdGVkCi0JLy8KLQlhYnN0cmFjdCBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdChEb2N1bWVudCBkb2N1bWVudCkgewotCQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuYWRkQWRhcHRlcih0aGlzKTsKLQkJCWFkYXB0KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpY2Nvbm5lY3QoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCSgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLnJlbW92ZUFkYXB0ZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGFwdChFbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIodGhpcykgPT0gbnVsbCkgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmFkZEFkYXB0ZXIodGhpcyk7Ci0KLQkJCQkJZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQlhZGFwdCgoRWxlbWVudCkgY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIHR5cGUgPT0gdGhpczsKLQkJfQotCi0JCWFic3RyYWN0IHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgbGlzdGVucyB0byB0aGUgY2hhbmdlcyBpbiB0aGUgQ01Eb2N1bWVudCBhbmQgdHJpZ2dlcnMgYQotCSAqIENNRG9jdW1lbnQgbG9hZAotCSAqLwotCWNsYXNzIE15RG9jdW1lbnRBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyIHsKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOiB7Ci0JCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQUREICh0byAiICsKLQkJCQkJCS8vICgoTm9kZSlub3RpZmllcikuZ2V0Tm9kZU5hbWUoKSArICIpICIgKwotCQkJCQkJLy8gKChFbGVtZW50KW5ld1ZhbHVlKS5nZXROb2RlTmFtZSgpICsgIiBvbGQgIiArCi0JCQkJCQkvLyBvbGRWYWx1ZSk7Ci0JCQkJCQlhZGFwdCgoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkJLy8gY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRToKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgOiB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBub3RpZmllcjsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOiB7Ci0JCQkJCQkJCS8vIHN0cnVjdHVyZSBjaGFuZ2UKLQkJCQkJCQkJaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIDogewotCQkJCQkJCQkvLyBzb21lIGNvbnRlbnQgY2hhbmdlZAotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZW50aW9uYWxseSBsZWZ0IHZpc2libGUgdG8gdGhlIHVzZXIKLQkgKi8KLQljbGFzcyBUaW1lckpvYiBleHRlbmRzIEpvYiB7Ci0JCXB1YmxpYyBUaW1lckpvYigpIHsKLQkJCXN1cGVyKFNTRVVJTWVzc2FnZXMuTG9hZGluZ1JlZmVyZW5jZWRHcmFtbWFycyk7Ci0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCWludm9rZUNNRG9jdW1lbnRMb2FkKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKb2IgdGltZXIgPSBuZXcgVGltZXJKb2IoKTsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBib29sZWFuIGlzR3JhbW1hckluZmVyZW5jZUVuYWJsZWQ7Ci0KLQlwdWJsaWMgRE9NT2JzZXJ2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlmRG9jdW1lbnQgPSAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpID8gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpIDogbnVsbDsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIGhlcmUgd2UgY3JlYXRlIGFuZCBpbml0IGFuIGFkYXB0ZXIgdGhhdCB3aWxsIGxpc3RlbiB0bwotCQkJLy8gY2hhbmdlcyB0byB0aGUgZG9jdW1lbnQgYW5kIGNvbnRhaW5lZCBlbGVtZW50cwotCQkJTXlEb2N1bWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNeURvY3VtZW50QWRhcHRlcigpOwotCQkJYWRhcHRlci5jb25uZWN0KGZEb2N1bWVudCk7Ci0KLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZkRvY3VtZW50KTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwgJiYgbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpICE9IG51bGwpIHsKLQkJCQlDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciA9IG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQljbURvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FELCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQkvLyBDUzogd2Ugc2VlbSB0byBleHBvc2UgYW4gWFNEIGluaXRpYWxpemF0aW9uIHByb2JsZW0gd2hlbiB3ZSBkbyB0aGlzCi0JCS8vIGltbWVkaWF0ZWx5Ci0JCS8vIHZlcnkgbmFzdHkuLi4gSSBuZWVkIHRvIHJldmlzdCB0aGlzIHByb2JsZW0gd2l0aCBFZCBNZXJrcwotCQkvLwotCQkvLyBpbnZva2VDTURvY3VtZW50TG9hZCgpOwotCQlpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZva2VDTURvY3VtZW50TG9hZCgpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmRG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50TG9hZGVyIGxvYWRlciA9IGlzR3JhbW1hckluZmVyZW5jZUVuYWJsZWQgPyBuZXcgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKGZEb2N1bWVudCwgbW9kZWxRdWVyeSkgOiBuZXcgQ01Eb2N1bWVudExvYWRlcihmRG9jdW1lbnQsIG1vZGVsUXVlcnkpOwotCQkJbG9hZGVyLmxvYWRDTURvY3VtZW50cygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCkgewotCQl0aW1lci5zY2hlZHVsZSgyMDAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcmFtbWFySW5mZXJlbmNlRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlpc0dyYW1tYXJJbmZlcmVuY2VFbmFibGVkID0gaXNFbmFibGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhNjY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNjI3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBVSQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX1hNTF9kb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X0NvbnRlbnRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfTmFtZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9OYW1lc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX1ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVjbGFyYXRpb25fRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0RBVEFfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0RBVEFfQ29udGVudF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9EZWxfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fQ29uX1VJX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9OYW1lX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX1NZU1RFTV9QVUJMSUNfS2V5d19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9QdWJsaWNfUmVmZXJlbmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX1N5c3RlbV9SZWZlcmVuY2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQUZURVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQkVGT1JFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9DSElMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRU1PVkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVQTEFDRV9XSVRIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfRE9DVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVU5ET19SRVBMQUNFX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FRElUX0RPQ1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lORk9fRVhQQU5EX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5GT19DT0xMQVBTRV9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0RURF9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfU0NIRU1BX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX05BTUVTUEFDRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0RURF9JTkZPUk1BVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT05fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9TQ0hFTUFfSU5GT1JNQVRJT05fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfTkVXX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ORVdfQVRUUklCVVRFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfQVRUUklCVVRFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX05FV19FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX05FV19FTEVNRU5UX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRU5BTUVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQ0RBVEFfU0VDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfUENEQVRBOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9DREFUQV9TRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1BDREFUQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTU1FTlRfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BJX1RBUkdFVF9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUElfREFUQV9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUk9PVF9FTEVNRU5UX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UQVJHRVRfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RBVEFfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9OQU1FX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QVUJMSUNfSURfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NZU1RFTV9JRF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQlJPV1NFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRUxFQ1RfWE1MX0NBVEFMT0dfRU5UUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NQRUNJRllfU1lTVEVNX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRUxFQ1RfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfS0VZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1hNTF9DQVRBTE9HX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTE9DQVRJT05fSElOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTE9DQVRJT05fSElOVF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFJFRklYX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19OQU1FU1BBQ0VfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTk9fUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9WQUxVRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX05FVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX0VESVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9XT1JLU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSE9VVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSE9VVF9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19TQ0hFTUFfQ0FOX05PVF9CRV9MT0NBVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX0xPQ0FUSU9OX0hJTlRfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19OQU1FU1BBQ0VfTkFNRV9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1BSRUZJWF9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19TWVNURU1fSURfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lOVkFMSURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRU5URVJfUkVRX1BSRUZJWF9BTkRfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TRUxFQ1RfUkVHSVNURVJFRF9OQU1FU1BBQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TUEVDSUZZX05FV19OQU1FU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFTEVDVF9OQU1FU1BBQ0VfVE9fQUREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BRERfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEFSR0VUX05BTUVTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfWE1MX0FUVFJJQlVURV9BTFJFQURZX0VYSVNUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9tZXNzYWdlX2dvZXNfaGVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdTZXR0aW5nc18wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nU2V0dGluZ3NfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEcmFnTm9kZUNvbW1hbmRfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEcmFnTm9kZUNvbW1hbmRfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZ18wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpGYWNlTm9kZUFkYXB0ZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF85OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFByb3BlcnR5U291cmNlQWRhcHRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaG91dGxpbmVfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfdGFnX2hhc19hdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9faXNfbWlzc2luZ19hX3ZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9faGFzX25vX3ZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfZW5kX3RhZ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF93aXRoXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVZFUkVfaW50ZXJuYWxfZXJyb3Jfb2NjdV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fa25vd25fYXR0cmlidXRlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRfX2lzX3Vua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsb3NlX3dpdGhfXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfd2l0aF9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsb3NlX3dpdGhfX187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fX187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0hhc19ub19hdmFpbGFibGVfY2hpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fa25vd25fY2hpbGRfdGFnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9fSGFzX25vX2tub3duX2NoaWxkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2tub3duX2NoaWxkX3RhZ19uYW1lczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaGVfZG9jdW1lbnRfZWxlbWVudF9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2RlZmluaXRpb25fZm9yX2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2RlZmluaXRpb25fZm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2NvbnRlbnRfbW9kZWxfZm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2NvbnRlbnRfbW9kZWxfZm91bmRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXByZXNzX2VtcHR5X2VsZW1lbnRfdGFnc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydF9taXNzaW5nX3RhZ3NfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdF9zb3VyY2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRfRU9MX2NvZGVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfV2luZG93c19VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfVW5peF9VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfTWFjX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfb3Jfc2F2aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF9vZl9saW5lX2NvZGVfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfb2ZfbGluZV9jb2RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9XaW5kb3dzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9Vbml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9NYWM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX05vVHJhbnNsYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfYXNzaXN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdHRpbmdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmVfd2lkdGhfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTcGxpdF9tdWx0aXBsZV9hdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ190YWJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ19zcGFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplX3RpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdyYW1tYXJfQ29uc3RyYWludHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlX2luZmVycmVkX2dyYW1tYXJfaW5fYWJzZW5jZV9vZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdWdnZXN0aW9uX1N0cmF0ZWd5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3lfTGF4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3lfU3RyaWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRfX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X01vZGVsX19fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX19fXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YV9UeXBlX19fXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bWVyYXRlZF9WYWx1ZXNfX19fNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvdXJjZU1lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmNvbW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuY29tbWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmNvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzX2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93VG9vbHRpcERlc2NfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dUb29sdGlwRGVzY190b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93VG9vbHRpcERlc2NfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RQcm9wb3NhbHNfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RQcm9wb3NhbHNfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdFByb3Bvc2Fsc19kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2VidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXREb2N1bWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXREb2N1bWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGl2ZUVsZW1lbnRzX3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGl2ZUVsZW1lbnRzX2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfWE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2Fybl9ub19ncmFtbWFyX3NwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW5nX2ZpbGVzOwotCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTFkODgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFhNTFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSB4bWwgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIHhtbCBlZGl0b3IuCi0JICogCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JcHVibGljIFhNTFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIHhtbCBlZGl0b3IgdGVtcGxhdGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeG1sIGVkaXRvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlpZiAoZlRlbXBsYXRlU3RvcmUgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlU3RvcmUgPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZSgKLQkJCQkJZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCVhNTFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSB4bWwgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIHhtbCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BTEwpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5UQUcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BVFRSSUJVVEUpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BVFRSSUJVVEVfVkFMVUUpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLQkvKioKLQkgICAqIEdldCBhbiBpbWFnZSBmcm9tIHRoZSByZWdpc3RyeS4gCi0JICAgKiAKLQkgICAqICpUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSByZWZlcmVuY2luZ2ZpbGUgZGlhbG9nIGFuZCBzaG91bGQgYmUgCi0JICAgKiAgcmVtb3ZlZCB3aGVuIHRoZSBkaWFsb2cgaXMgbW92ZWQgdG8gYW5vdGhlcmNvbXBvbmVudC4KLQkgICAqIAotCSAgICogQHBhcmFtIGltYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgaW1hZ2UuCi0JICAgKiBAcmV0dXJuIFRoZSBpbWFnZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gbmFtZS4KLQkgICAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKXsKLQkgICAgcmV0dXJuIGdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKGltYWdlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3Y2JmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBYTUwgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIGJlZ2luIGNvbG9yIGRlZmluaXRpb25zCi0jIyBOb3JtYWwgdGV4dCBjb250ZW50LgotU2FtcGxlX1hNTF9kb2M9PD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbjw/Y3VzdG9tUHJvY2Vzc2luZ0luc3RydWN0aW9uXG5cdFhNTCBwcm9jZXNzb3Igc3BlY2lmaWNcblx0Y29udGVudCA/PlxuPCFET0NUWVBFIGNvbG9yc1xuXHRQVUJMSUMgXCIvL0lCTS9YTUwvQ09MT1JTL1wiIFwiY29sb3JzLmR0ZFwiPlxuPGNvbG9ycz5cblx0PCEtLSBiZWdpbiBjb2xvciBkZWZpbml0aW9ucyAtLT5cblx0PGNvbG9yIG5hbWU9XCJwbGFpbnRleHRcIiBmb3JlZ3JvdW5kPVwiIzAwMDAwMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIiAvPlxuXHQ8Y29sb3IgbmFtZT1cImJvbGRcIiBmb3JlZ3JvdW5kPVwiIzAwMDAwMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNCM0FDQTBcIiAvPlxuXHQ8IVtDREFUQVs8MTIzNDU2Nzg5Pl1dPlxuXHROb3JtYWwgdGV4dCBjb250ZW50LlxuXHQ8Y29sb3IgbmFtZT1cImludmVyc2VcIiBmb3JlZ3JvdW5kPVwiI0YwRjBGMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIiAvPlxuXG48L2NvbG9ycz5cbgotQ29tbWVudF9EZWxpbWl0ZXJzX1VJXz1Db21tZW50IERlbGltaXRlcnMKLUNvbW1lbnRfQ29udGVudF9VSV89Q29tbWVudCBDb250ZW50Ci1UYWdfRGVsaW1pdGVyc19VSV89VGFnIERlbGltaXRlcnMKLVRhZ19OYW1lc19VSV89VGFnIE5hbWVzCi1BdHRyaWJ1dGVfTmFtZXNfVUlfPUF0dHJpYnV0ZSBOYW1lcwotQXR0cmlidXRlX1ZhbHVlc19VSV89QXR0cmlidXRlIFZhbHVlcwotRGVjbGFyYXRpb25fRGVsaW1pdGVyc19VSV89RGVjbGFyYXRpb24gRGVsaW1pdGVycwotQ29udGVudF9VSV89Q29udGVudAotIyMgb24gdGhlIGZvbGxvd2luZyAyIGxpbmVzLCBkbyBub3QgdHJhbnNsYXRlIENEQVRBCi1DREFUQV9EZWxpbWl0ZXJzX1VJXz1DREFUQSBEZWxpbWl0ZXJzCi1DREFUQV9Db250ZW50X1VJXz1DREFUQSBDb250ZW50Ci1Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV89UHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBEZWxpbWl0ZXJzCi1Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfPVByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gQ29udGVudAotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBOYW1lCi1ET0NUWVBFX05hbWVfVUlfPURPQ1RZUEUgTmFtZQotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBLZXl3b3JkCi1ET0NUWVBFX1NZU1RFTV9QVUJMSUNfS2V5d19VSV89RE9DVFlQRSBTWVNURU0vUFVCTElDIEtleXdvcmQKLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBzb2xlbHkgdHJhbnNsYXRlOiAgUHVibGljIFJlZmVyZW5jZQotRE9DVFlQRV9QdWJsaWNfUmVmZXJlbmNlX1VJXz1ET0NUWVBFIFB1YmxpYyBSZWZlcmVuY2UKLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBzb2xlbHkgdHJhbnNsYXRlOiAgU3lzdGVtIFJlZmVyZW5jZQotRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXz1ET0NUWVBFIFN5c3RlbSBSZWZlcmVuY2UKLSMgWE1MIENvbW1vbiBVSQotIyBDb25zdGFudHMgZm9yIHN0cmluZ3MKLQotREVMRVRFPVJlbW92ZQotQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT049QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLQotX1VJX01FTlVfQUREX0FGVEVSPUFkZCAmQWZ0ZXIKLV9VSV9NRU5VX0FERF9BVFRSSUJVVEU9QWRkIEEmdHRyaWJ1dGUKLV9VSV9NRU5VX0FERF9CRUZPUkU9QWRkICZCZWZvcmUKLV9VSV9NRU5VX0FERF9DSElMRD1BZGQgJkNoaWxkCi1fVUlfTUVOVV9SRU1PVkU9UmUmbW92ZQotX1VJX01FTlVfUkVQTEFDRV9XSVRIPVJlJnBsYWNlIFdpdGgKLV9VSV9NRU5VX0VESVRfRE9DVFlQRT1FZGl0IERPQ1RZUEUuLi4KLV9VSV9MQUJFTF9VTkRPX1JFUExBQ0VfREVTQ1JJUFRJT049UmVwbGFjZQotX1VJX0xBQkVMX0VESVRfRE9DVFlQRT1FZGl0IERPQ1RZUEUKLV9VSV9JTkZPX0VYUEFORF9BTEw9RXhwYW5kIEFsbAotX1VJX0lORk9fQ09MTEFQU0VfQUxMPUNvbGxhcHNlIEFsbAotCi1fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OPUFkZCBEVEQgSW5mb3JtYXRpb24uLi4KLV9VSV9NRU5VX0FERF9TQ0hFTUFfSU5GT1JNQVRJT049QWRkIFNjaGVtYSBJbmZvcm1hdGlvbi4uLgotX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OPUVkaXQgUHJvY2VzcyZpbmcgSW5zdHJ1Y3Rpb24uLi4KLV9VSV9NRU5VX0VESVRfTkFNRVNQQUNFUz1FZGl0ICZOYW1lc3BhY2VzLi4uCi0KLV9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT05fVElUTEU9QWRkIERURCBJbmZvcm1hdGlvbgotX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1RJVExFPUVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbgotX1VJX01FTlVfRURJVF9TQ0hFTUFfSU5GT1JNQVRJT05fVElUTEU9RWRpdCBTY2hlbWEgSW5mb3JtYXRpb24KLQotX1VJX01FTlVfTkVXX0FUVFJJQlVURT0mTmV3IEF0dHJpYnV0ZS4uLgotX1VJX01FTlVfTkVXX0FUVFJJQlVURV9USVRMRT1OZXcgQXR0cmlidXRlCi1fVUlfTUVOVV9FRElUX0FUVFJJQlVURT1FZGl0IEF0dHJpYnV0ZS4uLgotX1VJX01FTlVfRURJVF9BVFRSSUJVVEVfVElUTEU9RWRpdCBBdHRyaWJ1dGUKLV9VSV9NRU5VX05FV19FTEVNRU5UPU5ldyAmRWxlbWVudC4uLgotX1VJX01FTlVfTkVXX0VMRU1FTlRfVElUTEU9TmV3IEVsZW1lbnQKLV9VSV9NRU5VX1JFTkFNRT1SJmVuYW1lCi1fVUlfTUVOVV9SRU5BTUVfVElUTEU9UmVuYW1lCi1fVUlfTEFCRUxfRUxFTUVOVF9OQU1FPUVsZW1lbnQgbmFtZToKLQotX1VJX01FTlVfQUREX0NPTU1FTlQ9QWRkIENvbW1lbnQKLV9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OPUFkZCBQcm9jZXNzaW5nIEluc3RydWN0aW9uCi1fVUlfTUVOVV9BRERfQ0RBVEFfU0VDVElPTj1BZGQgQ0RBVEEgU2VjdGlvbgotX1VJX01FTlVfQUREX1BDREFUQT1BZGQgI1BDREFUQTsKLQotX1VJX01FTlVfQ09NTUVOVD1DJm9tbWVudAotX1VJX01FTlVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTj1QJnJvY2Vzc2luZyBJbnN0cnVjdGlvbgotX1VJX01FTlVfQ0RBVEFfU0VDVElPTj1DREFUQSBTZWN0aW9uCi1fVUlfTUVOVV9QQ0RBVEE9I1BDJkRBVEE7Ci0KLV9VSV9NRU5VX0FERD1BZGQKLQotX1VJX0NPTU1FTlRfVkFMVUU9Y29tbWVudAotX1VJX1BJX1RBUkdFVF9WQUxVRT10YXJnZXQKLV9VSV9QSV9EQVRBX1ZBTFVFPWRhdGEKLV9VSV9MQUJFTF9ST09UX0VMRU1FTlRfVkFMVUU9Um9vdEVsZW1lbnQKLQotX1VJX0xBQkVMX1RBUkdFVF9DT0xPTj1UYXJnZXQ6Ci1fVUlfTEFCRUxfREFUQV9DT0xPTj1EYXRhOgotX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9OQU1FX0NPTE9OPVJvb3QgZWxlbWVudCBuYW1lOgotX1VJX0xBQkVMX1BVQkxJQ19JRF9DT0xPTj1QdWJsaWMgSUQ6Ci1fVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OPVN5c3RlbSBJRDoKLV9VSV9MQUJFTF9CUk9XU0U9QnJvd3NlLi4uCi1fVUlfTEFCRUxfU0VMRUNUX1hNTF9DQVRBTE9HX0VOVFJZPVNlbGVjdCBYTUwgQ2F0YWxvZyBFbnRyeQotX1VJX0xBQkVMX1NQRUNJRllfU1lTVEVNX0lEPVNwZWNpZnkgU3lzdGVtIElECi1fVUlfTEFCRUxfU0VMRUNUX0ZJTEU9U2VsZWN0IEZpbGUKLQotX1VJX0xBQkVMX0tFWT1LZXkKLV9VSV9MQUJFTF9VUkk9VVJJOgotX1VJX0xBQkVMX1hNTF9DQVRBTE9HX0NPTE9OPVhNTCBDYXRhbG9nCi1fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUU9TmFtZXNwYWNlIE5hbWUKLV9VSV9MQUJFTF9MT0NBVElPTl9ISU5UPUxvY2F0aW9uIEhpbnQKLV9VSV9MQUJFTF9QUkVGSVg9UHJlZml4Ci1fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUVfQ09MT049TmFtZXNwYWNlIE5hbWU6Ci1fVUlfTEFCRUxfTE9DQVRJT05fSElOVF9DT0xPTj1Mb2NhdGlvbiBIaW50OgotX1VJX0xBQkVMX1BSRUZJWF9DT0xPTj1QcmVmaXg6Ci1fVUlfTk9fTkFNRVNQQUNFX05BTUU9PG5vIG5hbWVzcGFjZSBuYW1lPgotX1VJX05PX1BSRUZJWD08bm8gcHJlZml4PgotCi1fVUlfTEFCRUxfWE1MX1NDSEVNQV9JTkZPUk1BVElPTj1YTUwgU2NoZW1hIEluZm9ybWF0aW9uCi0KLV9VSV9MQUJFTF9OQU1FX0NPTE9OPU5hbWU6Ci1fVUlfTEFCRUxfVkFMVUVfQ09MT049VmFsdWU6Ci0KLV9VSV9CVVRUT05fREVMRVRFPURlbGV0ZQotX1VJX0JVVFRPTl9ORVc9TmV3Li4uCi1fVUlfQlVUVE9OX0VESVQ9RWRpdC4uLgotCi1fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTj1OZXcgTmFtZXNwYWNlIEluZm9ybWF0aW9uCi0KLSMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQotCi1fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRT1TZWxlY3QgZmlsZSBmcm9tIHdvcmtiZW5jaAotX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9DQVRBTE9HPVNlbGVjdCBYTUwgQ2F0YWxvZyBlbnRyeQotCi1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfTkFNRT1Nb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aCB0aGUgbmFtZXNwYWNlIG5hbWUgOgotX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU9TW9yZSB0aGFuIG9uZSBzY2hlbWEgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGhvdXQgYSBuYW1lc3BhY2UgbmFtZQotX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWD1Nb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpY2VkIHdpdGhvdXQgYSBwcmVmaXgKLV9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9QUkVGSVg9TW9yZSB0aGFuIG9uZSBuYW1lc3BhY2UgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGggdGhlIHByZWZpeCA6Ci1fVUlfV0FSTklOR19TQ0hFTUFfQ0FOX05PVF9CRV9MT0NBVEVEPVRoZSBzcGVjaWZpZWQgc2NoZW1hIGNhbiBub3QgYmUgbG9jYXRlZCA6Ci1fVUlfV0FSTklOR19MT0NBVElPTl9ISU5UX05PVF9TUEVDSUZJRUQ9QSBsb2NhdGlvbiBoaW50IGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgZm9yIHRoZSBuYW1lc3BhY2Ugd2l0aCBuYW1lCi1fVUlfV0FSTklOR19OQU1FU1BBQ0VfTkFNRV9OT1RfU1BFQ0lGSUVEPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIG5hbWVzcGFjZSB3aXRoIHByZWZpeCA6Ci1fVUlfV0FSTklOR19QUkVGSVhfTk9UX1NQRUNJRklFRD1BIHByZWZpeCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIG5hbWVzcGFjZSBuYW1lZCA6Ci1fVUlfV0FSTklOR19ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ9QSByb290IGVsZW1lbnQgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLV9VSV9XQVJOSU5HX1NZU1RFTV9JRF9NVVNUX0JFX1NQRUNJRklFRD1BIHN5c3RlbSBJRCBtdXN0IGJlIHNwZWNpZmllZC4KLQotX1VJX0lOVkFMSURfTkFNRT1JbnZhbGlkIG5hbWUKLQotIyBTdHJpbmcgdXNlZCBmb3IgZWRpdGluZyBuYW1lc3BhY2VzIChvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5zZWRpdCkKLV9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0U9RW50ZXIgdGhlIHJlcXVpcmVkIHByZWZpeCBhbmQgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4KLV9VSV9TRUxFQ1RfUkVHSVNURVJFRF9OQU1FU1BBQ0VTPVNlbGVjdCBGcm9tIFJlZ2lzdGVyZWQgTmFtZXNwYWNlcwotX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRT1TcGVjaWZ5IE5ldyBOYW1lc3BhY2UKLV9VSV9TRUxFQ1RfTkFNRVNQQUNFX1RPX0FERD1TZWxlY3QgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdG8gYWRkLgotX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TPUFkZCBOYW1lc3BhY2UgRGVjbGFyYXRpb25zCi1fVUlfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUz1OYW1lc3BhY2UgRGVjbGFyYXRpb25zCi1fVUlfVEFSR0VUX05BTUVTUEFDRT1UYXJnZXQgTmFtZXNwYWNlCi0KLV9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTPVRoZSBlbGVtZW50IGFscmVhZHkgaGFzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoaXMgbmFtZS4KLQotIwotZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmU9ZXJyb3IgbWVzc2FnZSBnb2VzIGhlcmUKLVN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzA9U3Vycm91bmQgd2l0aCBuZXcgZWxlbWVudAotU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMT1TdXJyb3VuZCB3aXRoIG5ldyBlbGVtZW50Ci1SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA9TGluayBhbGwgcmVmZXJlbmNlcyBmb3IgYSByZW5hbWUgaW4gZmlsZSAoZG9lcyBub3QgY2hhbmdlIHJlZmVyZW5jZXMgaW4gb3RoZXIgZmlsZXMpCi1SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzE9UmVuYW1lIGluIGZpbGUKLUluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMKLUluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzE9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMKLUVuY29kaW5nU2V0dGluZ3NfMD1JQU5BOgotRW5jb2RpbmdTZXR0aW5nc18xPUVuY29kaW5nOgotRHJhZ05vZGVDb21tYW5kXzA9TW92ZQotRHJhZ05vZGVDb21tYW5kXzE9Q29weQotQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2dfMD1BZGQuLi4KLUpGYWNlTm9kZUFkYXB0ZXJfMT1SZWZyZXNoIFByb3BlcnR5IFNoZWV0Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF8wPVJlbW92ZSBlbXB0eSB0YWcKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzE9Q2hhbmdlIHRvIGVtcHR5LWVsZW1lbnQgdGFnCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8yPVJlbW92ZSB0aGlzIHRhZwotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMz1JbnNlcnQgZW5kIHRhZyBiZWZvcmUgZmlyc3QgY2hpbGQgZWxlbWVudAotUXVpY2tGaXhQcm9jZXNzb3JYTUxfND1JbnNlcnQgZW5kIHRhZyBhdCBlbmQgb2YgZWxlbWVudAotUXVpY2tGaXhQcm9jZXNzb3JYTUxfNT1SZW1vdmUgYXR0cmlidXRlcyBpbiBlbmQgdGFnCi1RdWlja0ZpeFByb2Nlc3NvclhNTF82PUluc2VydCBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfNz1SZW1vdmUgdGhpcyBhdHRyaWJ1dGUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzg9UmVtb3ZlIHNwYWNlcyBiZWZvcmUgdGFnIG5hbWUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzk9UmVtb3ZlIHNwYWNlcyBiZWZvcmUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTA9UmVtb3ZlIG5hbWVzcGFjZSBpbiBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xMT1SZW1vdmUgdGhpcyBlbGVtZW50Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF8xMj1SZW1vdmUgdGhpcyBhdHRyaWJ1dGUgdmFsdWUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzEzPUluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzE0PVF1b3RlIGF0dHJpYnV0ZSB2YWx1ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTU9SW5zZXJ0IGNsb3NpbmcgYnJhY2tldAotWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA9QXR0cmlidXRlcwotCi1Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nc18wPVVzZSB3b3JrYmVuY2ggZW5jb2RpbmcKLXJlZnJlc2hvdXRsaW5lXzA9UmVmcmVzaGluZyBPdXRsaW5lCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi0jIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXAKLUVuZF90YWdfaGFzX2F0dHJpYnV0ZXM9RW5kIHRhZyBoYXMgYXR0cmlidXRlcwotQXR0cmlidXRlX19pc19taXNzaW5nX2FfdmFsdWU9QXR0cmlidXRlIFwiezB9XCIgaXMgbWlzc2luZyBhIHZhbHVlCi1BdHRyaWJ1dGVfX2hhc19ub192YWx1ZT1BdHRyaWJ1dGUgXCJ7MH1cIiAgaGFzIG5vIHZhbHVlCi1NaXNzaW5nX2VuZF90YWdfPU1pc3NpbmcgZW5kIHRhZyBcInswfVwiCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA9TWlzc2luZyBjbG9zaW5nIHF1b3RlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzE9TWlzc2luZyBxdW90ZXMgZm9yIGF0dHJpYnV0ZSB2YWx1ZQotUmVjb25jaWxlU3RlcEZvck1hcmt1cF8yPUEgdGFnbmFtZSBjYW5ub3Qgc3RhcnQgd2l0aCBhIHNwYWNlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM9RW1wdHkgdGFncyBhcmUgbm90IGFsbG93ZWQKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfND1OYW1lc3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gdGFyZ2V0Ci1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzU9U3BhY2VzIGFyZSBub3QgYWxsb3dlZCBiZWZvcmUgYSBQcm9jZXNzaW5nIEluc3RydWN0aW9uCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY9VGFnIG1pc3NpbmcgY2xvc2luZyBicmFja2V0ICc+JwotIyBDb250ZW50IEFzc2lzdAotRW5kX3dpdGhfPUVuZCB3aXRoIHswfT4KLVNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXz1TRVZFUkUgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQKLU5vX2tub3duX2F0dHJpYnV0ZV9fVUlfPU5vIGtub3duIGF0dHJpYnV0ZQotQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfPUNvbnRlbnQgQXNzaXN0IG5vdCBhdmFpbGFibGUgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24KLUVsZW1lbnRfX2lzX3Vua25vd249RWxlbWVudCA8ezB9PiBpcyB1bmtub3duLgotQ29tbWVudF9fPWNvbW1lbnQgezB9Ci1DbG9zZV93aXRoX189Q2xvc2Ugd2l0aCB7MH0KLUVuZF93aXRoX189RW5kIHdpdGggXCI8L3swfT5cIgotQ2xvc2Vfd2l0aF9fXz1DbG9zZSB3aXRoIFwiezB9XCIKLUNsb3NlX3dpdGhfX19fPUNsb3NlIHdpdGggXCI+PC97MH0+XCIKLV9IYXNfbm9fYXZhaWxhYmxlX2NoaWxkPXswfSBoYXMgbm8gYXZhaWxhYmxlIGNoaWxkIHRhZ3MuCi1Ob19rbm93bl9jaGlsZF90YWc9Tm8ga25vd24gY2hpbGQgdGFnIG5hbWVzIG9mIDx7MH0+IGJlZ2luIHdpdGggXCJ7MX1cIi4KLV9fSGFzX25vX2tub3duX2NoaWxkPTx7MH0+IGhhcyBubyBrbm93biBjaGlsZCB0YWdzLgotTm9fa25vd25fY2hpbGRfdGFnX25hbWVzPU5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIKLVRoZV9kb2N1bWVudF9lbGVtZW50X189VGhlIGRvY3VtZW50IGVsZW1lbnQgPHswfT4gaXMgYWxyZWFkeSBwcmVzZW50LgotTm9fZGVmaW5pdGlvbl9mb3JfaW49Tm8gZGVmaW5pdGlvbiB3YXMgZm91bmQgZm9yIGVsZW1lbnQgPHswfT4gaW4gezF9Ci1Ob19kZWZpbml0aW9uX2Zvcj1ObyBkZWZpbml0aW9uIHdhcyBmb3VuZCBmb3IgZWxlbWVudCA8ezB9PgotTm9fY29udGVudF9tb2RlbF9mb3I9Tm8gY29udGVudCBtb2RlbCBmb3VuZCBmb3IgezB9LgotTm9fY29udGVudF9tb2RlbF9mb3VuZF9VSV89Tm8gY29udGVudCBtb2RlbCBmb3VuZAotIyMgVGhlIGZvbGxvd2luZyBzdHJpbmdzIGFyZSBmb3IgdGhlIFhNTCBDbGVhbnVwIGRpYWxvZwotQ2xlYW51cF9VSV89Q2xlYW51cAotQ29tcHJlc3NfZW1wdHlfZWxlbWVudF90YWdzX1VJXz0mQ29tcHJlc3MgZW1wdHkgZWxlbWVudCB0YWdzCi1JbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV89SW5zZXJ0ICZyZXF1aXJlZCBhdHRyaWJ1dGVzCi1JbnNlcnRfbWlzc2luZ190YWdzX1VJXz0mSW5zZXJ0IG1pc3NpbmcgdGFncwotUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV89JlF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXMKLUZvcm1hdF9zb3VyY2VfVUlfPSZGb3JtYXQgc291cmNlCi1Db252ZXJ0X0VPTF9jb2Rlc19VSV89Q29udmVydCBsaW5lICZkZWxpbWl0ZXJzIHRvCi1FT0xfV2luZG93c19VST0mV2luZG93cwotRU9MX1VuaXhfVUk9VSZOSVgKLUVPTF9NYWNfVUk9Jk1hYwotIyMgWE1MIEZpbGVzIHByZWZlcmVuY2UgcGFnZQotQ3JlYXRpbmdfZmlsZXM9Q3JlYXRpbmcgZmlsZXMKLUVuY29kaW5nX2Rlc2M9VGhlIGZvbGxvd2luZyBlbmNvZGluZyB3aWxsIGFwcGx5OgotRW5jb2Rpbmc9RW4mY29kaW5nOgotQ3JlYXRpbmdfb3Jfc2F2aW5nX2ZpbGVzPUNyZWF0aW5nIG9yIHNhdmluZyBmaWxlcwotRW5kX29mX2xpbmVfY29kZV9kZXNjPVRoZSBmb2xsb3dpbmcgbGluZSBkZWxpbWl0ZXIgd2lsbCBhcHBseToKLUVuZF9vZl9saW5lX2NvZGU9JkxpbmUgZGVsaW1pdGVyOgotRU9MX1dpbmRvd3M9V2luZG93cwotRU9MX1VuaXg9VU5JWAotRU9MX01hYz1NYWMKLUVPTF9Ob1RyYW5zbGF0aW9uPU5vIHRyYW5zbGF0aW9uCi1WYWxpZGF0aW5nX2ZpbGVzPVZhbGlkYXRpbmcgZmlsZXMKLVdhcm5fbm9fZ3JhbW1hcl9zcGVjaWZpZWQ9V2FybiB3aGVuIG5vIGdyYW1tYXIgaXMgc3BlY2lmaWVkCi1YTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsPUFkZCB0aGlzIHN1ZmZpeCAoaWYgbm90IHNwZWNpZmllZCk6Ci1YTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yPVN1ZmZpeCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHswfS4KLSMjIFhNTCBTb3VyY2UgcHJlZmVyZW5jZSBwYWdlCi1Db250ZW50X2Fzc2lzdF9VSV89Q29udGVudCBhc3Npc3QKLUF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXz1BdXRvbWF0aWNhbGx5IG1hJmtlIHN1Z2dlc3Rpb25zCi1Qcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV89UCZyb21wdCB3aGVuIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkOgotRm9ybWF0dGluZ19VSV89Rm9ybWF0dGluZwotTGluZV93aWR0aF9fVUlfPUxpbmUgJndpZHRoOgotU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlcz1TcGxpdCAmbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmUKLUluZGVudF91c2luZ190YWJzPSZJbmRlbnQgdXNpbmcgdGFicwotSW5kZW50X3VzaW5nX3NwYWNlcz1JJm5kZW50IHVzaW5nIHNwYWNlcwotSW5kZW50YXRpb25fc2l6ZT1JbiZkZW50YXRpb24gc2l6ZToKLUluZGVudGF0aW9uX3NpemVfdGlwPUluZGVudGF0aW9uIHNpemUKLUNsZWFyX2FsbF9ibGFua19saW5lc19VSV89Q2xlYXIgYWxsICZibGFuayBsaW5lcwotR3JhbW1hcl9Db25zdHJhaW50cz1HcmFtbWFyIENvbnN0cmFpbnRzCi1Vc2VfaW5mZXJyZWRfZ3JhbW1hcl9pbl9hYnNlbmNlX29mPVVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYQotU3VnZ2VzdGlvbl9TdHJhdGVneT0mU3VnZ2VzdGlvbiBzdHJhdGVneToKLVN1Z2dlc3Rpb25fU3RyYXRlZ3lfTGF4PUxheAotU3VnZ2VzdGlvbl9TdHJhdGVneV9TdHJpY3Q9U3RyaWN0Ci0jIyB0YWcgaW5mbwotRWxlbWVudF9fX18xPUVsZW1lbnQgOgotQ29udGVudF9Nb2RlbF9fX18yPUNvbnRlbnQgTW9kZWwgOgotQXR0cmlidXRlX19fXzM9QXR0cmlidXRlIDoKLURhdGFfVHlwZV9fX180PURhdGEgVHlwZSA6Ci1FbnVtZXJhdGVkX1ZhbHVlc19fX181PUVudW1lcmF0ZWQgVmFsdWVzIDoKLSMjIGNvcGllZCBmcm9tIHNzZS51aQotRm9ybWF0TWVudV9sYWJlbD1GJm9ybWF0Ci1Tb3VyY2VNZW51X2xhYmVsPSZTb3VyY2UKLUNvbW1lbnRfbGFiZWw9Q28mbW1lbnQKLUNvbW1lbnRfdG9vbHRpcD1Db21tZW50Ci1Db21tZW50X2Rlc2NyaXB0aW9uPUNvbW1lbnQKLVVuY29tbWVudF9sYWJlbD0mVW5jb21tZW50Ci1VbmNvbW1lbnRfdG9vbHRpcD1VbmNvbW1lbnQKLVVuY29tbWVudF9kZXNjcmlwdGlvbj1VbmNvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLVNob3dUb29sdGlwRGVzY19sYWJlbD1TaG93ICZUb29sdGlwIERlc2NyaXB0aW9uCi1TaG93VG9vbHRpcERlc2NfdG9vbHRpcD1EaXNwbGF5cyB0aGUgaG92ZXIgaGVscCBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQKLVNob3dUb29sdGlwRGVzY19kZXNjcmlwdGlvbj1EaXNwbGF5cyB0aGUgaG92ZXIgaGVscCBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQKLUNvbnRlbnRBc3Npc3RQcm9wb3NhbHNfbGFiZWw9Q29uJnRlbnQgQXNzaXN0Ci1Db250ZW50QXNzaXN0UHJvcG9zYWxzX3Rvb2x0aXA9Q29udGVudCBBc3Npc3QKLUNvbnRlbnRBc3Npc3RQcm9wb3NhbHNfZGVzY3JpcHRpb249Q29udGVudCBBc3Npc3QKLVF1aWNrRml4X2xhYmVsPSZRdWljayBGaXgKLVF1aWNrRml4X3Rvb2x0aXA9UXVpY2sgRml4Ci1RdWlja0ZpeF9kZXNjcmlwdGlvbj1RdWljayBGaXgKLUZvcm1hdERvY3VtZW50X2xhYmVsPSZEb2N1bWVudAotRm9ybWF0RG9jdW1lbnRfdG9vbHRpcD1Gb3JtYXQgRG9jdW1lbnQKLUZvcm1hdERvY3VtZW50X2Rlc2NyaXB0aW9uPUZvcm1hdCBEb2N1bWVudAotRm9ybWF0QWN0aXZlRWxlbWVudHNfbGFiZWw9QWN0Jml2ZSBFbGVtZW50cwotRm9ybWF0QWN0aXZlRWxlbWVudHNfdG9vbHRpcD1Gb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi1Gb3JtYXRBY3RpdmVFbGVtZW50c19kZXNjcmlwdGlvbj1Gb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi1PcGVuRmlsZUZyb21Tb3VyY2VfbGFiZWw9T3AmZW4gU2VsZWN0aW9uCi1PcGVuRmlsZUZyb21Tb3VyY2VfdG9vbHRpcD1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotT3BlbkZpbGVGcm9tU291cmNlX2Rlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMD1TaG93IEF0dHJpYnV0ZXMKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLU1FU1NBR0VfWE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV89WE1MIFZhbGlkYXRvciB2YWxpZGF0aW5nIHswfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZWVlMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjb21tZW50IGFjdGlvbiBkZWxlZ2F0ZSBmb3IgWE1MIGVkaXRvcnMKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0NPTU1FTlQgPSAiLS0+IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9DT01NRU5UID0gIjwhLS0iOyAvLyROT04tTkxTLTEkCi0KLQlJRWRpdG9yUGFydCBmRWRpdG9yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGdldCBjdXJyZW50IHRleHQgc2VsZWN0aW9uCi0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJCXJldHVybjsKLQotCQkJCXByb2Nlc3NBY3Rpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByaXZhdGUgSVRleHRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKChJVGV4dEVkaXRvcikgZkVkaXRvcikuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pCi0JCQkJCXJldHVybiAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gVGV4dFNlbGVjdGlvbi5lbXB0eVNlbGVjdGlvbigpOwotCX0KLQotCWFic3RyYWN0IHZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pOwotCi0Jdm9pZCByZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdHJ5IHsKLQkJCWludCBhZGp1c3RlZF9sZW5ndGggPSBsZW5ndGg7Ci0KLQkJCS8vIHJlbW92ZSBvcGVuIGNvbW1lbnRzCi0JCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCWludCBpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihPUEVOX0NPTU1FTlQpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQgKyBpbmRleCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihPUEVOX0NPTU1FTlQsIGluZGV4IC0gMSk7Ci0JCQkJYWRqdXN0ZWRfbGVuZ3RoIC09IE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGNsb3NlIGNvbW1lbnRzCi0JCQlzdHJpbmcgPSBkb2N1bWVudC5nZXQob2Zmc2V0LCBhZGp1c3RlZF9sZW5ndGgpOwotCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoQ0xPU0VfQ09NTUVOVCk7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlkb2N1bWVudC5yZXBsYWNlKG9mZnNldCArIGluZGV4LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihDTE9TRV9DT01NRU5ULCBpbmRleCAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmIzNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5DTUltYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbk1hbmFnZXIgewotCi0KLQkvKioKLQkgKiBBZGROb2RlQWN0aW9uCi0JICovCi0JcHVibGljIGNsYXNzIEFkZE5vZGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIENNTm9kZSBjbW5vZGU7Ci0JCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JCXByb3RlY3RlZCBpbnQgbm9kZVR5cGU7Ci0JCXByb3RlY3RlZCBOb2RlIHBhcmVudDsKLQkJcHJvdGVjdGVkIFN0cmluZyB1bmRvRGVzY3JpcHRpb247Ci0KLQotCQlwdWJsaWMgQWRkTm9kZUFjdGlvbihDTU5vZGUgY21ub2RlLCBOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLmNtbm9kZSA9IGNtbm9kZTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCi0JCQlTdHJpbmcgdGV4dCA9IGdldExhYmVsKHBhcmVudCwgY21ub2RlKTsKLQkJCXNldFRleHQodGV4dCk7Ci0JCQlkZXNjcmlwdGlvbiA9IHRleHQ7Ci0JCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERCArICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBDTUltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9yID0gaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQl9Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCX0KLQotCi0JCXB1YmxpYyBBZGROb2RlQWN0aW9uKGludCBub2RlVHlwZSwgTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQkJdGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ09NTUVOVDsgLy8kTk9OLU5MUy0xJAotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DT01NRU5UOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsgLy8kTk9OLU5MUy0xJAotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ0RBVEFfU0VDVElPTjsgLy8kTk9OLU5MUy0xJAotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DREFUQV9TRUNUSU9OOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUENEQVRBOyAvLyROT04tTkxTLTEkCi0JCQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX1BDREFUQTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IobmV3IEludGVnZXIobm9kZVR5cGUpKSk7Ci0JCX0KLQotCi0JCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVGb3JDTU5vZGUoKSB7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlpbnNlcnQocGFyZW50LCBjbW5vZGUsIGluZGV4KTsKLQkJCX0KLQkJfQotCi0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUZvck5vZGVUeXBlKCkgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpIHBhcmVudCA6IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlOb2RlIG5ld0NoaWxkTm9kZSA9IG51bGw7Ci0JCQlib29sZWFuIGZvcm1hdCA9IHRydWU7Ci0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChYTUxVSU1lc3NhZ2VzLl9VSV9DT01NRU5UX1ZBTFVFKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTFVJTWVzc2FnZXMuX1VJX1BJX1RBUkdFVF9WQUxVRSwgWE1MVUlNZXNzYWdlcy5fVUlfUElfREFUQV9WQUxVRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlQ0RBVEFTZWN0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJZm9ybWF0ID0gZmFsc2U7Ci0JCQkJCW5ld0NoaWxkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmVudC5nZXROb2RlTmFtZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobmV3Q2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKDEpOwotCQkJCWxpc3QuYWRkKG5ld0NoaWxkTm9kZSk7Ci0JCQkJaW5zZXJ0Tm9kZXNBdEluZGV4KHBhcmVudCwgbGlzdCwgaW5kZXgsIGZvcm1hdCk7Ci0JCQl9Ci0JCX0KLQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIHVuZG9EZXNjcmlwdGlvbjsKLQkJfQotCi0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCQkJaWYgKGNtbm9kZSAhPSBudWxsKSB7Ci0JCQkJYWRkTm9kZUZvckNNTm9kZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlhZGROb2RlRm9yTm9kZVR5cGUoKTsKLQkJCX0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERlbGV0ZUFjdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCQlwdWJsaWMgRGVsZXRlQWN0aW9uKExpc3QgbGlzdCkgewotCQkJc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTU9WRSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMubGlzdCA9IGxpc3Q7Ci0JCX0KLQotCQlwdWJsaWMgRGVsZXRlQWN0aW9uKE5vZGUgbm9kZSkgewotCQkJc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTU9WRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQlsaXN0LmFkZChub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuREVMRVRFOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGkubmV4dCgpOwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLQkJCQkJYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQkJTm9kZSBwcmV2aW91c1NpYmxpbmcgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsICYmIGlzV2hpdGVzcGFjZVRleHROb2RlKHByZXZpb3VzU2libGluZykpIHsKLQkJCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQocHJldmlvdXNTaWJsaW5nKTsKLQkJCQkJCX0KLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZW5kTm9kZUFjdGlvbih0aGlzKTsKLQkJfQotCX0KLQotCi0JY2xhc3MgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUgewotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGF0dHJpYnV0ZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBhdHRyaWJ1dGVSZXFJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVF9SRVFfT0JKKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBjZGF0YVNlY3Rpb25JbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgY29tbWVudEltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09NTUVOVCk7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZWxlbWVudEltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVCk7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgcGlJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgdGV4dEltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKTsKLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgb2JqZWN0OwotCQkJCXN3aXRjaCAoY21ub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQkJY2FzZSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OIDogewotCQkJCQkJcmVzdWx0ID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQkJaWYgKCgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlKS5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0JCQkJCQkJCXJlc3VsdCA9IGF0dHJpYnV0ZVJlcUltYWdlOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcmVzdWx0ID0gYXR0cmlidXRlSW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5EQVRBX1RZUEUgOiB7Ci0JCQkJCQlyZXN1bHQgPSB0ZXh0SW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDogewotCQkJCQkJcmVzdWx0ID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQkJcmVzdWx0ID0gZWxlbWVudEltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBDTU5vZGUuR1JPVVAgOiB7Ci0JCQkJCQlyZXN1bHQgPSBlbGVtZW50SW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCUludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKSBvYmplY3Q7Ci0JCQkJc3dpdGNoIChpbnRlZ2VyLmludFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IGNvbW1lbnRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCQlyZXN1bHQgPSBwaUltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IGNkYXRhU2VjdGlvbkltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IHRleHRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCS8vIFRPRE8uLi4gcmVtb3ZlIHRoaXMgY2xhc3MuIEknbSBwcmV0dHkgc3VyZSBpdCBpcyBubyBsb25nZXIgdXNlZCBieQotCS8vIGFueW9uZS4KLQkvKioKLQkgKiBAZGVwcmFjYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBJbnNlcnRBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHJvdGVjdGVkIGludCBpbmRleDsKLQkJcHJvdGVjdGVkIGludCBub2RlVHlwZTsKLQkJcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCi0JCXB1YmxpYyBJbnNlcnRBY3Rpb24oaW50IG5vZGVUeXBlLCBOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ09NTUVOVDsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9DREFUQV9TRUNUSU9OOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUENEQVRBOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXNldFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihub2RlVHlwZSkpKTsKLQkJfQotCi0JCXB1YmxpYyBJbnNlcnRBY3Rpb24oaW50IG5vZGVUeXBlLCBOb2RlIHBhcmVudCwgaW50IGluZGV4LCBTdHJpbmcgdGl0bGUpIHsKLQkJCXRoaXMubm9kZVR5cGUgPSBub2RlVHlwZTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJZGVzY3JpcHRpb24gPSB0aXRsZTsKLQkJCXNldFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihub2RlVHlwZSkpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREICsgIiAiICsgZGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCi0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Q2hpbGROb2RlID0gbnVsbDsKLQkJCWJvb2xlYW4gZm9ybWF0ID0gdHJ1ZTsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFhNTFVJTWVzc2FnZXMuX1VJX0NPTU1FTlRfVkFMVUUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oWE1MVUlNZXNzYWdlcy5fVUlfUElfVEFSR0VUX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLl9VSV9QSV9EQVRBX1ZBTFVFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlmb3JtYXQgPSBmYWxzZTsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdDaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoMSk7Ci0JCQkJbGlzdC5hZGQobmV3Q2hpbGROb2RlKTsKLQkJCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBsaXN0LCBpbmRleCwgZm9ybWF0KTsKLQkJCX0KLQotCQkJZW5kTm9kZUFjdGlvbih0aGlzKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmVwbGFjZU5vZGVBY3Rpb24KLQkgKi8KLQlwdWJsaWMgY2xhc3MgUmVwbGFjZU5vZGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIENNTm9kZSBjbW5vZGU7Ci0JCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCXByb3RlY3RlZCBpbnQgZW5kSW5kZXg7Ci0JCXByb3RlY3RlZCBOb2RlIHBhcmVudDsKLQkJcHJvdGVjdGVkIGludCBzdGFydEluZGV4OwotCi0KLQkJcHVibGljIFJlcGxhY2VOb2RlQWN0aW9uKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMuY21ub2RlID0gY21ub2RlOwotCQkJdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKLQkJCXRoaXMuZW5kSW5kZXggPSBlbmRJbmRleDsKLQotCQkJc2V0VGV4dChnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSkpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1VORE9fUkVQTEFDRV9ERVNDUklQVElPTjsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ICs9ICIgIiArIGdldExhYmVsKHBhcmVudCwgY21ub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQotCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIGNtbm9kZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlKHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotCQkJCWluc2VydChwYXJlbnQsIGNtbm9kZSwgc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCQllbmROb2RlQWN0aW9uKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvckNhY2hlIGltYWdlRGVzY3JpcHRvckNhY2hlID0gbmV3IEltYWdlRGVzY3JpcHRvckNhY2hlKCk7Ci0JcHJvdGVjdGVkIFZpZXdlciBmVmlld2VyOwotCi0JcHVibGljIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5LCBWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1vZGVsLCBtb2RlbFF1ZXJ5KTsKLQkJdGhpcy5mVmlld2VyID0gdmlld2VyOwotCX0KLQotCi0JcHVibGljIHZvaWQgYmVnaW5Ob2RlQWN0aW9uKE5vZGVBY3Rpb24gYWN0aW9uKSB7Ci0JCWZNb2RlbC5iZWdpblJlY29yZGluZyhhY3Rpb24sIGFjdGlvbi5nZXRVbmRvRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkJaWYgKGFkID09IG51bGwpIHsKLQkJCWFjdGlvbiA9IG5ldyBFZGl0QXR0cmlidXRlQWN0aW9uKHRoaXMsIHBhcmVudCwgbnVsbCwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfQVRUUklCVVRFLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19BVFRSSUJVVEVfVElUTEUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGFkLCBwYXJlbnQsIC0xKTsKLQkJfQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRDRGF0YVNlY3Rpb25BY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEFkZE5vZGVBY3Rpb24oTm9kZS5DREFUQV9TRUNUSU9OX05PREUsIHBhcmVudCwgaW5kZXgpOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRDb21tZW50QWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBBZGROb2RlQWN0aW9uKE5vZGUuQ09NTUVOVF9OT0RFLCBwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRG9jdHlwZUFjdGlvbihEb2N1bWVudCBkb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgRWRpdERvY3R5cGVBY3Rpb24oZk1vZGVsLCBkb2N1bWVudCwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT04pOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEVsZW1lbnRBY3Rpb24oTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0JCWlmIChlZCA9PSBudWxsKSB7Ci0JCQlhY3Rpb24gPSBuZXcgRWRpdEVsZW1lbnRBY3Rpb24odGhpcywgcGFyZW50LCBpbmRleCwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfRUxFTUVOVCwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfRUxFTUVOVF9USVRMRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oZWQsIHBhcmVudCwgaW5kZXgpOwotCQl9Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFBDRGF0YUFjdGlvbihOb2RlIHBhcmVudCwgQ01EYXRhVHlwZSBkYXRhVHlwZSwgaW50IGluZGV4KSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBudWxsOwotCQlpZiAoZGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oTm9kZS5URVhUX05PREUsIHBhcmVudCwgaW5kZXgpOwotCQl9IGVsc2UgewotCQkJYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oZGF0YVR5cGUsIHBhcmVudCwgaW5kZXgpOwotCQl9Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCU5vZGUgcmVmQ2hpbGQgPSBnZXRSZWZDaGlsZE5vZGVBdEluZGV4KHBhcmVudCwgaW5kZXgpOwotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24odGhpcywgcGFyZW50LCByZWZDaGlsZCwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgWE1MVUlNZXNzYWdlcy5BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkpKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkU2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBFZGl0U2NoZW1hSW5mb0FjdGlvbih0aGlzLCBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9TQ0hFTUFfSU5GT1JNQVRJT04pOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbihMaXN0IHNlbGVjdGlvbikgewotCQlEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbihzZWxlY3Rpb24pOwotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChzZWxlY3Rpb24uc2l6ZSgpID4gMCk7Ci0JCXJldHVybiBkZWxldGVBY3Rpb247Ci0JfQotCi0KLQlwdWJsaWMgRE9NQ29udGVudEJ1aWxkZXIgY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRE9NQ29udGVudEJ1aWxkZXJJbXBsIGJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsKLQkJcmV0dXJuIGJ1aWxkZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRBdHRyaWJ1dGVBY3Rpb24oQXR0ciBhdHRyLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCXJldHVybiBuZXcgRWRpdEF0dHJpYnV0ZUFjdGlvbih0aGlzLCBhdHRyLmdldE93bmVyRWxlbWVudCgpLCBhdHRyLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfQVRUUklCVVRFLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfQVRUUklCVVRFX1RJVExFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXREb2N0eXBlQWN0aW9uKERvY3VtZW50VHlwZSBkb2N0eXBlKSB7Ci0JCXJldHVybiBuZXcgRWRpdERvY3R5cGVBY3Rpb24oZk1vZGVsLCBkb2N0eXBlLCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9ET0NUWVBFKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQlyZXR1cm4gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24odGhpcywgcGksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9USVRMRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0U2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBFZGl0U2NoZW1hSW5mb0FjdGlvbih0aGlzLCBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfTkFNRVNQQUNFUyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlUmVuYW1lQWN0aW9uKE5vZGUgbm9kZSkgewotCQlBY3Rpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXN1bHQgPSBuZXcgRWRpdEVsZW1lbnRBY3Rpb24odGhpcywgKEVsZW1lbnQpIG5vZGUsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUkVOQU1FLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTkFNRV9USVRMRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlcGxhY2VBY3Rpb24oTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlTm9kZUFjdGlvbihwYXJlbnQsIGNtbm9kZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZE5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1vZGVsLmVuZFJlY29yZGluZyhhY3Rpb24pOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0cnkgewotCQkJTGlzdCBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoaS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJY29udHJpYnV0ZUFjdGlvbnMobWVudU1hbmFnZXIsIHNlbGVjdGlvbkxpc3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiPyIgKyBjbW5vZGUgKyAiPyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoY21ub2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IChTdHJpbmcpIGNtbm9kZS5nZXRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkgewotCQkJCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCQkJcmVzdWx0ID0gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oY21ub2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoY21ub2RlLCBwYXJlbnQsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBmTW9kZWw7Ci0JfQotCi0KLQlwdWJsaWMgU2hlbGwgZ2V0V29ya2JlbmNoV2luZG93U2hlbGwoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUsIGludCBpbmRleCkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJRE9NQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZURPTUNvbnRlbnRCdWlsZGVyKGRvY3VtZW50KTsKLQkJYnVpbGRlci5zZXRCdWlsZFBvbGljeShET01Db250ZW50QnVpbGRlci5CVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQpOwotCQlidWlsZGVyLmJ1aWxkKHBhcmVudCwgY21ub2RlKTsKLQkJaW5zZXJ0Tm9kZXNBdEluZGV4KHBhcmVudCwgYnVpbGRlci5nZXRSZXN1bHQoKSwgaW5kZXgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgaW5zZXJ0Tm9kZXNBdEluZGV4KE5vZGUgcGFyZW50LCBMaXN0IGxpc3QsIGludCBpbmRleCkgewotCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBsaXN0LCBpbmRleCwgdHJ1ZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2Rlc0F0SW5kZXgoTm9kZSBwYXJlbnQsIExpc3QgbGlzdCwgaW50IGluZGV4LCBib29sZWFuIGZvcm1hdCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJaW5kZXggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJfQotCQlOb2RlIHJlZkNoaWxkID0gKGluZGV4IDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpID8gbm9kZUxpc3QuaXRlbShpbmRleCkgOiBudWxsOwotCi0JCS8vIGhlcmUgd2UgY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgdGhlIHByZXZpb3VzIG5vZGUgaXMgYSAnd2hpdGUKLQkJLy8gc3BhY2UnIFRleHQgbm9kZQotCQkvLyB3ZSBzaG91bGQgcmVhbGx5IGRvIHRoZSBpbnNlcnQgYmVmb3JlIHRoaXMgbm9kZQotCQkvLwotCQlpbnQgcHJldkluZGV4ID0gaW5kZXggLSAxOwotCQlOb2RlIHByZXZDaGlsZCA9IChwcmV2SW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKHByZXZJbmRleCkgOiBudWxsOwotCQlpZiAoaXNXaGl0ZXNwYWNlVGV4dE5vZGUocHJldkNoaWxkKSkgewotCQkJcmVmQ2hpbGQgPSBwcmV2Q2hpbGQ7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTm9kZSBuZXdOb2RlID0gKE5vZGUpIGkubmV4dCgpOwotCi0JCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50OwotCQkJCXBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZSgoQXR0cikgbmV3Tm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmQ2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBmb3JtYXREZWVwID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJZm9ybWF0RGVlcCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChmb3JtYXQpIHsKLQkJCQlyZWZvcm1hdChuZXdOb2RlLCBmb3JtYXREZWVwKTsKLQkJCX0KLQkJfQotCi0JCXNldFZpZXdlclNlbGVjdGlvbihsaXN0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGFic3RyYWN0IHNpbmNlIGN1cnJlbnRseSwgdGhlIHNlZCBlZGl0b3IgaXMgcmVxdWlyZWQgdG8KLQkgKiBwZXJmb3JtIGZvcm1hdGluZyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoZSBzZWQKLQkgKiBlZGl0b3IuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVmb3JtYXQoTm9kZSBwYXJlbnQsIGJvb2xlYW4gZGVlcCk7Ci0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShOb2RlIHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSBlbmRJbmRleDsgaSA+PSBzdGFydEluZGV4OyBpLS0pIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb24oTGlzdCBsaXN0KSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpLCB0cnVlKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uKE5vZGUgbm9kZSkgewotCQlpZiAoZlZpZXdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub2RlKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhYThiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXRhcmdldFRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogWE1MRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IKLSAqIAotICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG11bHRpIHBhZ2UgZWRpdG9yJ3MKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yLCBzaW5jZSBjYXNjYWRlZCBpbml0KCkgY2FsbCBmcm9tIHRoZQotICogQWN0aW9uQmFyQ29udHJpYnV0b3Igd2lsbCBjYXVzZXMgZXhjZXB0aW9uIGFuZCBpdCBsZWFkcyB0byBsb3NlIHdob2xlCi0gKiB0b29sYmFycy4KLSAqIAotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3Igb2YKLSAqIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3JYTUwgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiLCAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UyIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDbGVhbnVwRG9jdW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvbW1lbnQgPSBudWxsOwotCS8vIHRvb2x0aXAKLQkvLyBhY3Rpb24KLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb250ZW50QXNzaXN0ID0gbnVsbDsKLQkvLyBhY3Rpb24KLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGaW5kT2NjdXJyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGb3JtYXREb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGZGb3JtYXRNZW51ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZPcGVuRmlsZUFjdGlvbiA9IG51bGw7IC8vIG9wZW4gZmlsZQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlF1aWNrRml4ID0gbnVsbDsKLQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlNob3dUb29sdGlwQWN0aW9uID0gbnVsbDsgLy8gc2hvdwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlVuY29tbWVudCA9IG51bGw7Ci0KLQlwdWJsaWMgQWN0aW9uQ29udHJpYnV0b3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBYTUxVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCk7Ci0KLQkJLy8gZWRpdCBjb21tYW5kcwotCQlmU2hvd1Rvb2x0aXBBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7CS8vJE5PTi1OTFMtMSQKLQkJZlNob3dUb29sdGlwQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLklORk9STUFUSU9OKTsKLQotCQlmQ29udGVudEFzc2lzdCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsJLy8kTk9OLU5MUy0xJAotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7Ci0KLQkJZlF1aWNrRml4ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOwkvLyROT04tTkxTLTEkCi0JCWZRdWlja0ZpeC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5RVUlDS19GSVgpOwotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlmQ2xlYW51cERvY3VtZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOwkvLyROT04tTkxTLTEkCi0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuQ0xFQU5VUF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdERvY3VtZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOwkvLyROT04tTkxTLTEkCi0JCWZGb3JtYXREb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfRE9DVU1FTlQpOwotCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cyA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsJLy8kTk9OLU5MUy0xJAotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0KLQkJZkZvcm1hdE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoWE1MVUlNZXNzYWdlcy5Gb3JtYXRNZW51X2xhYmVsKTsKLQkJZkZvcm1hdE1lbnUuYWRkKGZGb3JtYXREb2N1bWVudCk7Ci0JCWZGb3JtYXRNZW51LmFkZChmRm9ybWF0QWN0aXZlRWxlbWVudHMpOwotCi0JCS8vIG5hdmlnYXRlIGNvbW1hbmRzCi0JCWZPcGVuRmlsZUFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsJLy8kTk9OLU5MUy0xJAotCQlmT3BlbkZpbGVBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuT1BFTl9GSUxFKTsKLQotCQlmRmluZE9jY3VycmVuY2VzID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOwkvLyROT04tTkxTLTEkCi0JCWZGaW5kT2NjdXJyZW5jZXMuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRklORF9PQ0NVUlJFTkNFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmRXhwYW5kU2VsZWN0aW9uVG9NZW51KTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZTaG93VG9vbHRpcEFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbnRlbnRBc3Npc3QpOwotCQkJZWRpdE1lbnUuYWRkKGZRdWlja0ZpeCk7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IFhNTFVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsKLQkJU3RyaW5nIHNvdXJjZU1lbnVJZCA9ICJzb3VyY2VNZW51SWQiOyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBzb3VyY2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHNvdXJjZU1lbnVMYWJlbCwgc291cmNlTWVudUlkKTsKLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgc291cmNlTWVudSk7Ci0JCWlmIChzb3VyY2VNZW51ICE9IG51bGwpIHsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmVG9nZ2xlQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQWRkQmxvY2tDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZSZW1vdmVCbG9ja0NvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0UmlnaHQpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0TGVmdCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ2xlYW51cERvY3VtZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZGb3JtYXRNZW51KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmRmluZE9jY3VycmVuY2VzKTsKLQkJfQotCi0JCS8vIG5hdmlnYXRlIGNvbW1hbmRzCi0JCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7Ci0JCWlmIChuYXZpZ2F0ZU1lbnUgIT0gbnVsbCkgewotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCW5hdmlnYXRlTWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQsIGZPcGVuRmlsZUFjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkNvbnRyaWJ1dG9yI2dldEV4dGVuc2lvbklEcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGdldEFjdGl2ZUVkaXRvclBhcnQoKSA9PSBhY3RpdmVFZGl0b3IpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShudWxsKTsKLQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gZ2V0VGV4dEVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCWZTaG93VG9vbHRpcEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0lORk9STUFUSU9OKSk7Ci0JCWZDb250ZW50QXNzaXN0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMpKTsKLQkJZlF1aWNrRml4LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfUVVJQ0tfRklYKSk7Ci0KLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UKSk7Ci0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpKTsKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRFbmFibGVkKHRleHRFZGl0b3IgIT0gbnVsbCAmJiB0ZXh0RWRpdG9yLmlzRWRpdGFibGUoKSk7Ci0JCWZGb3JtYXREb2N1bWVudC5zZXRFbmFibGVkKHRleHRFZGl0b3IgIT0gbnVsbCAmJiB0ZXh0RWRpdG9yLmlzRWRpdGFibGUoKSk7Ci0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRFbmFibGVkKHRleHRFZGl0b3IgIT0gbnVsbCAmJiB0ZXh0RWRpdG9yLmlzRWRpdGFibGUoKSk7Ci0KLQkJZk9wZW5GaWxlQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKSk7Ci0KLQkJZkZpbmRPY2N1cnJlbmNlcy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZJTkRfT0NDVVJSRU5DRVMpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yI3NldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGVuYWJsZWQpOwotCi0JCWZTaG93VG9vbHRpcEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmQ29udGVudEFzc2lzdC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUXVpY2tGaXguc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gY2xlYW51cCBhbmQgZm9ybWF0IGRvY3VtZW50IGFjdGlvbnMgZG8gbm90IHJlbHkgb24gc291cmNlIHZpZXdlcgotCQkvLyBiZWluZyBlbmFibGVkCi0JCS8vCQlmQ2xlYW51cERvY3VtZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCS8vCQlmRm9ybWF0RG9jdW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZk9wZW5GaWxlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZGaW5kT2NjdXJyZW5jZXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMTQ5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ29tbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEFkZCBibG9jayBjb21tZW50IGFjdGlvbiBkZWxlZ2F0ZSBmb3IgWE1MIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdENvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5BZGRCbG9ja0NvbW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlpZiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9PSBudWxsICYmIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkJfQotCQkJCWlmIChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCi0KLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwICYmIHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIDAsIE9QRU5fQ09NTUVOVCk7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCAwLCBDTE9TRV9DT01NRU5UKTsKLQkJCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQmFzZU5vZGVBY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlZjlhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZUFjdGlvbk1hbmFnZXIgewotCi0KLQkvKioKLQkgKiBNeU1lbnVNYW5hZ2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNeU1lbnVNYW5hZ2VyIGV4dGVuZHMgTWVudU1hbmFnZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JCXB1YmxpYyBNeU1lbnVNYW5hZ2VyKFN0cmluZyBzKSB7Ci0JCQlzdXBlcihzKTsKLQkJCXRpdGxlID0gczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiAhaXNFbXB0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aXRsZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnRUeXBlIGdldERvY3R5cGUoTm9kZSBub2RlKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCXJldHVybiBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gbmV3IE1lbnVCdWlsZGVyKCk7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0KLQlwcm90ZWN0ZWQgQmFzZU5vZGVBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSkgewotCQl0aGlzLmZNb2RlbCA9IG1vZGVsOwotCQl0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5OwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uSGVscGVyKElNZW51TWFuYWdlciBtZW51LCBMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0KSB7Ci0JCUxpc3QgYWN0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUFjdGlvbkxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKSBpLm5leHQoKTsKLQkJCWlmIChhY3Rpb24uZ2V0Q01Ob2RlKCkgIT0gbnVsbCkgewotCQkJCWludCBjbU5vZGVUeXBlID0gYWN0aW9uLmdldENNTm9kZSgpLmdldE5vZGVUeXBlKCk7Ci0JCQkJaWYgKGFjdGlvbi5nZXRLaW5kKCkgPT0gTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpIHsKLQkJCQkJc3dpdGNoIChjbU5vZGVUeXBlKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04gOiB7Ci0JCQkJCQkJYWN0aW9uTGlzdC5hZGQoY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKChFbGVtZW50KSBhY3Rpb24uZ2V0UGFyZW50KCksIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhY3Rpb24uZ2V0Q01Ob2RlKCkpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOiB7Ci0JCQkJCQkJYWN0aW9uTGlzdC5hZGQoY3JlYXRlQWRkRWxlbWVudEFjdGlvbihhY3Rpb24uZ2V0UGFyZW50KCksIChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWN0aW9uLmdldENNTm9kZSgpLCBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFjdGlvbi5nZXRLaW5kKCkgPT0gTW9kZWxRdWVyeUFjdGlvbi5SRVBMQUNFKSB7Ci0JCQkJCWlmIChhY3Rpb24uZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiBhY3Rpb24uZ2V0Q01Ob2RlKCkgIT0gbnVsbCkgewotCQkJCQkJYWN0aW9uTGlzdC5hZGQoY3JlYXRlUmVwbGFjZUFjdGlvbihhY3Rpb24uZ2V0UGFyZW50KCksIGFjdGlvbi5nZXRDTU5vZGUoKSwgYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSwgYWN0aW9uLmdldEVuZEluZGV4KCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQltZW51QnVpbGRlci5wb3B1bGF0ZU1lbnUobWVudSwgYWN0aW9uTGlzdCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBY3Rpb24oSU1lbnVNYW5hZ2VyIG1lbnUsIEFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQltZW51LmFkZChhY3Rpb24pOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBzZWxlY3Rpb24pIHsKLQkJaW50IGVkaXRNb2RlID0gbW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpOwotCQlpbnQgaWMgPSBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0JCWludCB2YyA9IChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpID8gTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QgOiBNb2RlbFF1ZXJ5LlZBTElESVRZX05PTkU7Ci0KLQkJTGlzdCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCA9IG51bGw7Ci0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQlpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCA9IGdldFNlbGVjdGVkTm9kZXMoc2VsZWN0aW9uLCB0cnVlKTsKLQotCQkJLy8gY29udHJpYnV0ZSBkZWxldGUgYWN0aW9ucwotCQkJY29udHJpYnV0ZURlbGV0ZUFjdGlvbnMobWVudSwgaW1wbGljaXRseVNlbGVjdGVkTm9kZUxpc3QsIGljLCB2Yyk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0aW9uLmdldCgwKTsKLQotCQkJLy8gY29udHJpYnV0ZSBlZGl0IGFjdGlvbnMKLQkJCWNvbnRyaWJ1dGVFZGl0QWN0aW9ucyhtZW51LCBub2RlKTsKLQotCQkJLy8gY29udHJpYnV0ZSBhZGQgY2hpbGQgYWN0aW9ucwotCQkJY29udHJpYnV0ZUFkZENoaWxkQWN0aW9ucyhtZW51LCBub2RlLCBpYywgdmMpOwotCi0JCQkvLyBjb250cmlidXRlIGFkZCBiZWZvcmUgYWN0aW9ucwotCQkJY29udHJpYnV0ZUFkZFNpYmxpbmdBY3Rpb25zKG1lbnUsIG5vZGUsIGljLCB2Yyk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCS8vIGNvbnRyaWJ1dGUgcmVwbGFjZSBhY3Rpb25zCi0JCQljb250cmlidXRlUmVwbGFjZUFjdGlvbnMobWVudSwgaW1wbGljaXRseVNlbGVjdGVkTm9kZUxpc3QsIGljLCB2Yyk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAwKSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBmTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQljb250cmlidXRlQWRkRG9jdW1lbnRDaGlsZEFjdGlvbnMobWVudSwgZG9jdW1lbnQsIGljLCB2Yyk7Ci0JCQljb250cmlidXRlRWRpdEdyYW1tYXJJbmZvcm1hdGlvbkFjdGlvbnMobWVudSwgZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQWRkQ2hpbGRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUsIGludCBpYywgaW50IHZjKSB7Ci0JCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCS8vICdBZGQgQ2hpbGQuLi4nIGFuZCAnQWRkIEF0dHJpYnV0ZS4uLicgYWN0aW9ucwotCQkJLy8KLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCi0JCQlJTWVudU1hbmFnZXIgYWRkQXR0cmlidXRlTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0FUVFJJQlVURSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNZW51TWFuYWdlciBhZGRDaGlsZE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DSElMRCk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZU1lbnUpOwotCQkJbWVudS5hZGQoYWRkQ2hpbGRNZW51KTsKLQotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkvLyBhZGQgaW5zZXJ0IGF0dHJpYnV0ZSBhY3Rpb25zCi0JCQkJLy8KLQkJCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhlbGVtZW50LCBlZCwgLTEsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRBdHRyaWJ1dGVNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0KLQkJCQkvLyBhZGQgaW5zZXJ0IGNoaWxkIG5vZGUgYWN0aW9ucwotCQkJCS8vCi0JCQkJbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKGVsZW1lbnQsIGVkLCAtMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJYWRkQWN0aW9uSGVscGVyKGFkZENoaWxkTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJfQotCi0JCQkvLyBhZGQgUEkgYW5kIENPTU1FTlQKLQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZENoaWxkTWVudSwgZWxlbWVudCwgZWQsIC0xKTsKLQotCQkJLy8gYWRkIFBDREFUQSwgQ0RBVEFfU0VDVElPTgotCQkJY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhhZGRDaGlsZE1lbnUsIGVsZW1lbnQsIGVkLCAtMSk7Ci0KLQkJCS8vIGFkZCBORVcgRUxFTUVOVAotCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZENoaWxkTWVudSwgZWxlbWVudCwgZWQsIC0xKTsKLQotCQkJLy8gYWRkIEFUVFJJQlVURQotCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBdHRyaWJ1dGVBY3Rpb25zKGFkZEF0dHJpYnV0ZU1lbnUsIGVsZW1lbnQsIGVkKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFkZERvY3VtZW50Q2hpbGRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGljLCBpbnQgdmMpIHsKLQkJSU1lbnVNYW5hZ2VyIGFkZENoaWxkTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NISUxEKTsgLy8kTk9OLU5MUy0xJAotCQltZW51LmFkZChhZGRDaGlsZE1lbnUpOwotCi0JCS8vIGFkZCBQSSBhbmQgQ09NTUVOVAotCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRDaGlsZE1lbnUsIGRvY3VtZW50LCAtMSk7Ci0KLQkJLy8gYWRkIE5FVyBFTEVNRU5UCi0JCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRDaGlsZE1lbnUsIGRvY3VtZW50LCAtMSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQWRkU2libGluZ0FjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgaW50IGljLCBpbnQgdmMpIHsKLQkJSU1lbnVNYW5hZ2VyIGFkZEJlZm9yZU1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9CRUZPUkUpOyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBhZGRBZnRlck1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9BRlRFUik7IC8vJE5PTi1OTFMtMSQKLQkJbWVudS5hZGQoYWRkQmVmb3JlTWVudSk7Ci0JCW1lbnUuYWRkKGFkZEFmdGVyTWVudSk7Ci0KLQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGdldEluZGV4KHBhcmVudE5vZGUsIG5vZGUpOwotCQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVEID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLQkJCQlpZiAocGFyZW50RUQgIT0gbnVsbCkgewotCQkJCQkvLyAnQWRkIEJlZm9yZS4uLicgYW5kICdBZGQgQWZ0ZXIuLi4nIGFjdGlvbnMKLQkJCQkJLy8KLQkJCQkJTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRCZWZvcmVNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0KLQkJCQkJbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXggKyAxLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKGFkZEFmdGVyTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCX0KLQotCQkJCS8vIGFkZCBDT01NRU5UIGFuZCBQSSBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQmVmb3JlTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4KTsKLQkJCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRBZnRlck1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCArIDEpOwotCi0JCQkJLy8gYWRkIFBDREFUQSwgQ0RBVEFfU0VDVElPTiBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhhZGRCZWZvcmVNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXgpOwotCQkJCWNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMoYWRkQWZ0ZXJNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXggKyAxKTsKLQotCQkJCS8vIGFkZCBORVcgRUxFTUVOVCBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZEJlZm9yZU1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZEFmdGVyTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4ICsgMSk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IChEb2N1bWVudCkgcGFyZW50Tm9kZTsKLQkJCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KHBhcmVudE5vZGUpOwotCQkJCWlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJLy8gYWRkIHBvc3NpYmxlIHJvb3QgZWxlbWVudCBpbnNlcnRpb25zCi0JCQkJCS8vICAgICAgICAKLQkJCQkJTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKGRvY3VtZW50LCBjbURvY3VtZW50LCBpbmRleCwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRBZnRlck1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQotCQkJCQltb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKGRvY3VtZW50LCBjbURvY3VtZW50LCBpbmRleCArIDEsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQWZ0ZXJNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJfQotCi0JCQkJLy8gYWRkIENPTU1FTlQgYW5kIFBJIGJlZm9yZSBhbmQgYWZ0ZXIKLQkJCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRCZWZvcmVNZW51LCBkb2N1bWVudCwgaW5kZXgpOwotCQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZEFmdGVyTWVudSwgZG9jdW1lbnQsIGluZGV4ICsgMSk7Ci0KLQkJCQkvLyBhZGQgRUxFTUVOVCBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZEJlZm9yZU1lbnUsIGRvY3VtZW50LCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZEFmdGVyTWVudSwgZG9jdW1lbnQsIGluZGV4ICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlRGVsZXRlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBsaXN0LCBpbnQgaWMsIGludCB2YykgewotCQlib29sZWFuIGNhblJlbW92ZSA9IG1vZGVsUXVlcnkuY2FuUmVtb3ZlKGxpc3QsIHZjKTsKLQotCi0JCS8vIGEgZGVsZXRlIGFjdGlvbiB3aXRoIGFuIGVtcHR5IGxpc3Qgd2lsbCBwcm9kdWNlIGEgZGlzYWJsZWQgbWVudQotCQkvLyBpdGVtCi0JCS8vCi0JCUxpc3QgcmVzdWx0TGlzdCA9IGNhblJlbW92ZSA/IGxpc3QgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZURlbGV0ZUFjdGlvbihyZXN1bHRMaXN0KSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlRWRpdEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSkgewotCQljb250cmlidXRlRWRpdEdyYW1tYXJJbmZvcm1hdGlvbkFjdGlvbnMobWVudSwgbm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpKTsKLQkJfSBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVFZGl0QXR0cmlidXRlQWN0aW9uKChBdHRyKSBub2RlLCBudWxsKSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgbm9kZSA6IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JCURvY3VtZW50VHlwZSBkb2N0eXBlID0gZ2V0RG9jdHlwZShub2RlKTsKLQkJaWYgKGRvY3R5cGUgPT0gbnVsbCkgewotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGREb2N0eXBlQWN0aW9uKGRvY3VtZW50LCAtMSkpOwotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVFZGl0RG9jdHlwZUFjdGlvbigoRG9jdW1lbnRUeXBlKSBub2RlKSk7Ci0JCX0KLQotCQlpZiAoZG9jdHlwZSA9PSBudWxsICYmIGdldFJvb3RFbGVtZW50KGRvY3VtZW50KSAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKGdldFJvb3RFbGVtZW50KGRvY3VtZW50KSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJLy8gdGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5kZXggaXNuJ3QgYmVmb3JlIHRoZSBYTUwgZGVjbGFyYXRpb24KLQkJLy8gCi0JCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQ29tbWVudEFjdGlvbihkb2N1bWVudCwgaW5kZXgpKTsKLQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oZG9jdW1lbnQsIGluZGV4KSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCWlmIChwYXJlbnRFZCA9PSBudWxsIHx8IGlzQ29tbWVudEFsbG93ZWQocGFyZW50RWQpKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZENvbW1lbnRBY3Rpb24ocGFyZW50RWxlbWVudCwgaW5kZXgpKTsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkUHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKHBhcmVudEVsZW1lbnQsIGluZGV4KSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVSZXBsYWNlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBzZWxlY3RlZE5vZGVMaXN0LCBpbnQgaWMsIGludCB2YykgewotCQkvLyAnUmVwbGFjZSBXaXRoLi4uJyBhY3Rpb25zCi0JCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlJTWVudU1hbmFnZXIgcmVwbGFjZVdpdGhNZW51ID0gbmV3IE15TWVudU1hbmFnZXIoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9SRVBMQUNFX1dJVEgpOyAvLyROT04tTkxTLTEkCi0JCW1lbnUuYWRkKHJlcGxhY2VXaXRoTWVudSk7Ci0KLQkJaWYgKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QgJiYgc2VsZWN0ZWROb2RlTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWROb2RlTGlzdC5nZXQoMCk7Ci0JCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpIHBhcmVudE5vZGU7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RUQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotCQkJCWlmIChwYXJlbnRFRCAhPSBudWxsKSB7Ci0JCQkJCUxpc3QgcmVwbGFjZUFjdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0UmVwbGFjZUFjdGlvbnMocGFyZW50RWxlbWVudCwgcGFyZW50RUQsIHNlbGVjdGVkTm9kZUxpc3QsIGljLCB2YywgcmVwbGFjZUFjdGlvbkxpc3QpOwotCQkJCQlhZGRBY3Rpb25IZWxwZXIocmVwbGFjZVdpdGhNZW51LCByZXBsYWNlQWN0aW9uTGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCWlmIChwYXJlbnRFZCA9PSBudWxsIHx8IGlzVGV4dEFsbG93ZWQocGFyZW50RWQpKSB7Ci0JCQlDTURhdGFUeXBlIGRhdGFUeXBlID0gcGFyZW50RWQgIT0gbnVsbCA/IHBhcmVudEVkLmdldERhdGFUeXBlKCkgOiBudWxsOwotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24ocGFyZW50RWxlbWVudCwgZGF0YVR5cGUsIGluZGV4KSk7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihwYXJlbnRFbGVtZW50LCBpbmRleCkpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGlzVW5jb25zdHJhaW5lZEFjdGlvbkFsbG93ZWQoKSkgewotCQkJaWYgKGdldFJvb3RFbGVtZW50KGRvY3VtZW50KSA9PSBudWxsKSB7Ci0JCQkJaW50IHhtbERlY2xhcmF0aW9uSW5kZXggPSAtMTsKLQkJCQlpbnQgZG9jdHlwZUluZGV4ID0gLTE7Ci0JCQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCQlkb2N0eXBlSW5kZXggPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGU7Ci0JCQkJCQlpZiAocGkuZ2V0VGFyZ2V0KCkuZXF1YWxzSWdub3JlQ2FzZSgieG1sIikgJiYgeG1sRGVjbGFyYXRpb25JbmRleCA9PSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJeG1sRGVjbGFyYXRpb25JbmRleCA9IGk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoKHhtbERlY2xhcmF0aW9uSW5kZXggPT0gLTEgfHwgaW5kZXggPiB4bWxEZWNsYXJhdGlvbkluZGV4KSAmJiAoZG9jdHlwZUluZGV4ID09IC0xIHx8IGluZGV4ID4gZG9jdHlwZUluZGV4KSkgewotCQkJCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZEVsZW1lbnRBY3Rpb24oZG9jdW1lbnQsIG51bGwsIGluZGV4KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oSU1lbnVNYW5hZ2VyIG1lbnUsIEVsZW1lbnQgcGFyZW50RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQsIGludCBpbmRleCkgewotCQlpZiAoaXNVbmNvbnN0cmFpbmVkQWN0aW9uQWxsb3dlZCgpKSB7Ci0JCQlpZiAocGFyZW50RWQgPT0gbnVsbCB8fCBwYXJlbnRFZC5nZXRQcm9wZXJ0eSgiaXNJbmZlcnJlZCIpID09IEJvb2xlYW4uVFJVRSB8fCAobW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpICE9IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCAmJiBpc0VsZW1lbnRBbGxvd2VkKHBhcmVudEVkKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkRWxlbWVudEFjdGlvbihwYXJlbnRFbGVtZW50LCBudWxsLCBpbmRleCkpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVW5jb25zdHJhaW5lZEF0dHJpYnV0ZUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIEVsZW1lbnQgcGFyZW50RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQpIHsKLQkJaWYgKGlzVW5jb25zdHJhaW5lZEFjdGlvbkFsbG93ZWQoKSkgewotCQkJaWYgKHBhcmVudEVkID09IG51bGwgfHwgcGFyZW50RWQuZ2V0UHJvcGVydHkoImlzSW5mZXJyZWQiKSA9PSBCb29sZWFuLlRSVUUgfHwgbW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpICE9IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRBdHRyaWJ1dGVBY3Rpb24ocGFyZW50RWxlbWVudCwgbnVsbCkpOwotCQkJfQotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRBdHRyaWJ1dGVBY3Rpb24oRWxlbWVudCBwYXJlbnQsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRDRGF0YVNlY3Rpb25BY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENvbW1lbnRBY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZERvY3R5cGVBY3Rpb24oRG9jdW1lbnQgcGFyZW50LCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRFbGVtZW50QWN0aW9uKE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkUENEYXRhQWN0aW9uKE5vZGUgcGFyZW50LCBDTURhdGFUeXBlIGRhdGFUeXBlLCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFNjaGVtYUluZm9BY3Rpb24oRWxlbWVudCBlbGVtZW50KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKExpc3Qgc2VsZWN0aW9uKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdEF0dHJpYnV0ZUFjdGlvbihBdHRyIGF0dHJpYnV0ZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXREb2N0eXBlQWN0aW9uKERvY3VtZW50VHlwZSBkb2N0eXBlKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0U2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVSZW5hbWVBY3Rpb24oTm9kZSBub2RlKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlUmVwbGFjZUFjdGlvbihOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCk7Ci0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkKSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBpbmRleCA9IC0xOwotCQlpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKG5vZGVMaXN0Lml0ZW0oaSkgPT0gY2hpbGQpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCi0JcHVibGljIE5vZGUgZ2V0UmVmQ2hpbGROb2RlQXRJbmRleChOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJTm9kZSByZWZDaGlsZCA9IChpbmRleCA+PSAwICYmIGluZGV4IDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpID8gbm9kZUxpc3QuaXRlbShpbmRleCkgOiBudWxsOwotCQlyZXR1cm4gcmVmQ2hpbGQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJlc3VsdCA9IChFbGVtZW50KSBub2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKExpc3QgbGlzdCwgYm9vbGVhbiBpbmNsdWRlVGV4dE5vZGVzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCWlmIChpbmNsdWRlVGV4dE5vZGVzKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50QWxsb3dlZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpbnQgY29udGVudFR5cGUgPSBwYXJlbnRFZC5nZXRDb250ZW50VHlwZSgpOwotCQlyZXR1cm4gY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50QWxsb3dlZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpbnQgY29udGVudFR5cGUgPSBwYXJlbnRFZC5nZXRDb250ZW50VHlwZSgpOwotCQlyZXR1cm4gY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RleHRBbGxvd2VkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkKSB7Ci0JCWludCBjb250ZW50VHlwZSA9IHBhcmVudEVkLmdldENvbnRlbnRUeXBlKCk7Ci0JCXJldHVybiBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVbmNvbnN0cmFpbmVkQWN0aW9uQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2VUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRkYmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNsZWFudXAuQ2xlYW51cFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQ2xlYW51cCBhY3Rpb24gZGVsZWdhdGUgZm9yIENTUyBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIENsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCURpYWxvZyBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dYTUwoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJLy8gbW9kZWwgY2hhbmdlCi0JCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCQkJLy8gcnVuCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCkgewotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IENsZWFudXBQcm9jZXNzb3JYTUwoKTsKLQotCQlyZXR1cm4gZkNsZWFudXBQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cERpYWxvZ1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cERpYWxvZ1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE3MGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBEaWFsb2dYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRGlhbG9nWE1MIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Q29udmVydEVPTENvZGVzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Rm9ybWF0U291cmNlOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIGZNb2RlbCA9IG51bGw7Ci0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlcjsKLQotCXB1YmxpYyBDbGVhbnVwRGlhbG9nWE1MKFNoZWxsIHNoZWxsKSB7Ci0KLQkJc3VwZXIoc2hlbGwpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWdldFNoZWxsKCkuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNsZWFudXBfVUlfKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNyZWF0ZURpYWxvZ0FyZWFJbkNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlpbml0aWFsaXplT3B0aW9ucygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURpYWxvZ0FyZWFJbkNvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5DTEVBTlVQX1hNTF9IRUxQSUQpOyAvLyB1c2UKLQkJLy8gWE1MCi0JCS8vIHNwZWNpZmljCi0JCS8vIGhlbHAKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBDb21wcmVzcyBlbXB0eSBlbGVtZW50IHRhZ3MKLQkJZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ29tcHJlc3NfZW1wdHlfZWxlbWVudF90YWdzX1VJXyk7Ci0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBJbnNlcnQgbWlzc2luZyByZXF1aXJlZCBhdHRycwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkluc2VydF9yZXF1aXJlZF9hdHRyaWJ1dGVzX1VJXyk7Ci0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gSW5zZXJ0IG1pc3NpbmcgYmVnaW4vZW5kIHRhZ3MKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkluc2VydF9taXNzaW5nX3RhZ3NfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5RdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX1VJXyk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBGb3JtYXQgc291cmNlCi0JCWZDaGVja0JveEZvcm1hdFNvdXJjZSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkZvcm1hdF9zb3VyY2VfVUlfKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENvbnZlcnQgRU9MIGNvZGUKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ29udmVydF9FT0xfY29kZXNfVUlfKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlDb21wb3NpdGUgRU9MQ29kZXMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlFT0xDb2Rlcy5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkVPTF9XaW5kb3dzX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4ID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkVPTF9Vbml4X1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgPSBuZXcgQnV0dG9uKEVPTENvZGVzLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldFRleHQoWE1MVUlNZXNzYWdlcy5FT0xfTWFjX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVFT0xDb2RlUmFkaW9zKGJvb2xlYW4gZW5hYmxlKSB7Ci0KLQkJaWYgKChmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgIT0gbnVsbCkpIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0RW5hYmxlZChlbmFibGUpOwotCQkJaWYgKCFmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSAmJiAhZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgJiYgIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zKCkgewotCi0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCVN0cmluZyBFT0xDb2RlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpOwotCQlpZiAoRU9MQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpID09IDApCi0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UgaWYgKEVPTENvZGUuY29tcGFyZVRvKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKSA9PSAwKQotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQotCQlzdG9yZU9wdGlvbnMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCWZNb2RlbCA9IG1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlT3B0aW9ucygpIHsKLQotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIGZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKTsKLQkJfSBlbHNlIGlmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUik7Ci0JCX0gZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQkJfQotCQkvLyBleHBsaWNpdGx5IHNhdmUgcGx1Z2luIHByZWZlcmVuY2VzIHNvIHZhbHVlcyBhcmUgc3RvcmVkCi0JCVhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCgoZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlciAhPSBudWxsICYmIChmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpIHx8IGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpKSB8fCAoZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIgIT0gbnVsbCAmJiAoZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpKSB8fCBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94Rm9ybWF0U291cmNlLmdldFNlbGVjdGlvbigpIHx8IGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSB8fCAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggIT0gbnVsbCAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSkpKTsKLQkJaWYgKGUud2lkZ2V0ID09IGZDaGVja0JveENvbnZlcnRFT0xDb2RlcykKLQkJCWVuYWJsZUVPTENvZGVSYWRpb3MoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0QXR0cmlidXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0QXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlM2E5ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEF0dHJpYnV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0QXR0cmlidXRlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXR0ciBhdHRyOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgb3duZXJFbGVtZW50OwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwdWJsaWMgRWRpdEF0dHJpYnV0ZUFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgb3duZXJFbGVtZW50LCBBdHRyIGF0dHIsIFN0cmluZyBhY3Rpb25MYWJlbCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmF0dHIgPSBhdHRyOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXNldFRleHQoYWN0aW9uTGFiZWwpOwotCQkvLyBhc3N1bWUgaWYgYXR0ciBpcyBudWxsIHRoZW4gdGhpcyBpcyBhbiAnQWRkJyB0aGF0IHJlcXVpcmVzIGFjdGlvbgotCQkvLyBhbiBpY29ucy4uLiBvdGhlcndpc2UgdGhpcyBpcyBhbiBlZGl0Ci0JCWlmIChhdHRyID09IG51bGwpIHsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihjcmVhdGVJbWFnZURlc2NyaXB0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbWFuYWdlci5iZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlFZGl0QXR0cmlidXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0QXR0cmlidXRlRGlhbG9nKHNoZWxsLCBvd25lckVsZW1lbnQsIGF0dHIpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IG93bmVyRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlBdHRyIG5ld0F0dHJpYnV0ZSA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShkaWFsb2cuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCW5ld0F0dHJpYnV0ZS5zZXRWYWx1ZShkaWFsb2cuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCQlvd25lckVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyaWJ1dGUpOwotCQkJbWFuYWdlci5zZXRWaWV3ZXJTZWxlY3Rpb24obmV3QXR0cmlidXRlKTsKLQkJfQotCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RG9jdHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdERvY3R5cGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3YzJiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RG9jdHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0RG9jdHlwZURpYWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEVkaXREb2N0eXBlQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0RG9jdHlwZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBkb2N0eXBlOwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgZG9jdHlwZS4KLQkgKi8KLQlwdWJsaWMgRWRpdERvY3R5cGVBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGVkaXQgYW4gZXhpc2l0bmcgZG9jdHlwZS4KLQkgKi8KLQlwdWJsaWMgRWRpdERvY3R5cGVBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRG9jdW1lbnRUeXBlIGRvY3R5cGUsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5kb2N0eXBlID0gZG9jdHlwZTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKEVkaXREb2N0eXBlRGlhbG9nIGRpYWxvZywgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRG9jdW1lbnRUeXBlIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50SW1wbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50SW1wbCA9IChJRE9NRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJSURPTURvY3VtZW50VHlwZSBkb2N0eXBlSW1wbCA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudEltcGwuY3JlYXRlRG9jdHlwZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJCWRvY3R5cGVJbXBsLnNldFB1YmxpY0lkKGRpYWxvZy5nZXRQdWJsaWNJZCgpKTsKLQkJCWRvY3R5cGVJbXBsLnNldFN5c3RlbUlkKGRpYWxvZy5nZXRTeXN0ZW1JZCgpKTsKLQkJCXJlc3VsdCA9IGRvY3R5cGVJbXBsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyb290RWxlbWVudCA9IChFbGVtZW50KSBjaGlsZE5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RFbGVtZW50ICE9IG51bGwgPyByb290RWxlbWVudC5nZXROb2RlTmFtZSgpIDogWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX1ZBTFVFOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydERvY3R5cGUoRG9jdW1lbnRUeXBlIGRvY3R5cGUsIERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCU5vZGUgcmVmQ2hpbGQgPSBudWxsOwotCQlOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIHx8IGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJLy8gY29udGludWUgb24gdG8gdGhlIG5leHROb2RlCi0JCQl9IGVsc2UgewotCQkJCXJlZkNoaWxkID0gY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKGRvY3R5cGUsIHJlZkNoaWxkKTsKLQkJLy9tYW5hZ2VyLnJlZm9ybWF0KGRvY3R5cGUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFVuZG9EZXNjcmlwdGlvbigpKTsKLQkJLy9TaGVsbCBzaGVsbCA9Ci0JCS8vIFhNTENvbW1vblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJU2hlbGwgc2hlbGwgPSBnZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJRWRpdERvY3R5cGVEaWFsb2cgZGlhbG9nID0gc2hvd0VkaXREb2N0eXBlRGlhbG9nKHNoZWxsKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCWlmIChkb2N0eXBlICE9IG51bGwpIHsKLQkJCQl1cGRhdGVEb2N0eXBlKGRpYWxvZywgZG9jdHlwZSk7Ci0JCQl9IGVsc2UgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGNyZWF0ZURvY3R5cGUoZGlhbG9nLCBkb2N1bWVudCk7Ci0JCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCQlpbnNlcnREb2N0eXBlKGRvY3R5cGUsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0RG9jdHlwZURpYWxvZyBzaG93RWRpdERvY3R5cGVEaWFsb2coU2hlbGwgc2hlbGwpIHsKLQkJRWRpdERvY3R5cGVEaWFsb2cgZGlhbG9nID0gbnVsbDsKLQotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQlkaWFsb2cgPSBuZXcgRWRpdERvY3R5cGVEaWFsb2coc2hlbGwsIGRvY3R5cGUpOwotCQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCQl0aXRsZSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0VESVRfRE9DVFlQRTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyByb290RWxlbWVudE5hbWUgPSBnZXRSb290RWxlbWVudE5hbWUoZG9jdW1lbnQpOwotCQkJZGlhbG9nID0gbmV3IEVkaXREb2N0eXBlRGlhbG9nKHNoZWxsLCByb290RWxlbWVudE5hbWUsICIiLCByb290RWxlbWVudE5hbWUgKyAiLmR0ZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmICh0aXRsZSA9PSBudWxsKSB7Ci0JCQkJdGl0bGUgPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT05fVElUTEU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWRpYWxvZy5zZXRDb21wdXRlU3lzdGVtSWQoZG9jdHlwZSA9PSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSA9PSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCk7Ci0KLQkJZGlhbG9nLnNldEVycm9yQ2hlY2tpbmcoZmFsc2UpOy8vIW1vZGVsLmdldFR5cGUoKS5lcXVhbHMoSVN0cnVjdHVyZWRNb2RlbC5IVE1MKSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24obmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbikpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEb2N0eXBlKEVkaXREb2N0eXBlRGlhbG9nIGRpYWxvZywgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJaWYgKGRvY3R5cGUgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnRUeXBlKSB7Ci0JCQlJRE9NRG9jdW1lbnRUeXBlIGRvY3R5cGVJbXBsID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3R5cGU7Ci0JCQlpZiAoZG9jdHlwZUltcGwuZ2V0TmFtZSgpLmVxdWFscyhkaWFsb2cuZ2V0TmFtZSgpKSkgewotCQkJCWRvY3R5cGVJbXBsLnNldFB1YmxpY0lkKGRpYWxvZy5nZXRQdWJsaWNJZCgpKTsKLQkJCQlkb2N0eXBlSW1wbC5zZXRTeXN0ZW1JZChkaWFsb2cuZ2V0U3lzdGVtSWQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9uZSBhbmQgcmVtb3ZlIHRoZSBvbGQKLQkJCQkvLyAgICAgICAgICAgICAgICAgIAotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9jdHlwZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJRG9jdW1lbnRUeXBlIG5ld0RvY3R5cGUgPSBjcmVhdGVEb2N0eXBlKGRpYWxvZywgZG9jdW1lbnQpOwotCQkJCWRvY3VtZW50Lmluc2VydEJlZm9yZShuZXdEb2N0eXBlLCBkb2N0eXBlKTsKLQkJCQlkb2N1bWVudC5yZW1vdmVDaGlsZChkb2N0eXBlKTsKLQkJCQkvL21hbmFnZXIucmVmb3JtYXQobmV3RG9jdHlwZSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODRmYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdEVsZW1lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIEVkaXRFbGVtZW50QWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBpbnQgaW5zZXJ0aW9uSW5kZXggPSAtMTsKLQlwcm90ZWN0ZWQgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyOwotCXByb3RlY3RlZCBOb2RlIHBhcmVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIEVkaXRFbGVtZW50QWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyBkaWFsb2dUaXRsZSkgewotCQl0aGlzKG1hbmFnZXIsIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLCAtMSwgZWxlbWVudCwgYWN0aW9uTGFiZWwsIGRpYWxvZ1RpdGxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdEVsZW1lbnRBY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIHBhcmVudCwgaW50IGluZGV4LCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhY3Rpb25MYWJlbCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmluc2VydGlvbkluZGV4ID0gaW5kZXg7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJc2V0VGV4dChhY3Rpb25MYWJlbCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihjcmVhdGVJbWFnZURlc2NyaXB0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRWRpdEVsZW1lbnRBY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIHBhcmVudCwgaW50IGluZGV4LCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQl0aGlzKG1hbmFnZXIsIHBhcmVudCwgaW5kZXgsIG51bGwsIGFjdGlvbkxhYmVsLCB0aXRsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCW1hbmFnZXIuYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJRWRpdEVsZW1lbnREaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRFbGVtZW50RGlhbG9nKHNoZWxsLCBlbGVtZW50KTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpIHBhcmVudCA6IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gaGVyZSB3ZSBuZWVkIHRvIGRvIGEgcmVuYW1lLi4uIHdoaWNoIHNlZW1zIHRvIGJlIHF1aXRlIGhhcmQKLQkJCQkvLyB0byBkbyA6LSgKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCUlET01FbGVtZW50IGVsZW1lbnRJbXBsID0gKElET01FbGVtZW50KSBlbGVtZW50OwotCQkJCQlJRE9NTW9kZWwgbW9kZWwgPSBlbGVtZW50SW1wbC5nZXRNb2RlbCgpOwotCQkJCQlTdHJpbmcgb2xkTmFtZSA9IGVsZW1lbnRJbXBsLmdldE5vZGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gZGlhbG9nLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVsZW1lbnROYW1lKG1vZGVsLCBlbGVtZW50SW1wbC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uRWxlbWVudE5hbWUobW9kZWwsIGVsZW1lbnRJbXBsLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUVsZW1lbnQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZGlhbG9nLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJCQlOb2RlIHJlZkNoaWxkID0gaW5zZXJ0aW9uSW5kZXggPCBub2RlTGlzdExlbmd0aCAmJiBpbnNlcnRpb25JbmRleCA+PSAwID8gbm9kZUxpc3QuaXRlbShpbnNlcnRpb25JbmRleCkgOiBudWxsOwotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3RWxlbWVudCwgcmVmQ2hpbGQpOwotCQkJCW1hbmFnZXIucmVmb3JtYXQobmV3RWxlbWVudCwgZmFsc2UpOwotCQkJCW1hbmFnZXIuc2V0Vmlld2VyU2VsZWN0aW9uKG5ld0VsZW1lbnQpOwotCQkJfQotCQl9Ci0JCW1hbmFnZXIuZW5kTm9kZUFjdGlvbih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbGVtZW50TmFtZShJRE9NTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZE5hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJaW5kZXggKz0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBpbmRleCwgb2xkTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxY2MxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLS8qKgotICogRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBOb2RlIGNoaWxkUmVmOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGk7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBhZGQgYSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZFJlZiwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dChhY3Rpb25MYWJlbCk7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmNoaWxkUmVmID0gY2hpbGRSZWY7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gZWRpdCBhIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqLwotCXB1YmxpYyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpLCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQlzZXRUZXh0KGFjdGlvbkxhYmVsKTsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5waSA9IHBpOwotCQl0aGlzLnBhcmVudCA9IHBpLmdldFBhcmVudE5vZGUoKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0KLQkJRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyBkaWFsb2cgPSBudWxsOwotCQlpZiAocGkgIT0gbnVsbCkgewotCQkJZGlhbG9nID0gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coc2hlbGwsIHBpKTsKLQkJfSBlbHNlIHsKLQkJCWRpYWxvZyA9IG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nKHNoZWxsLCBYTUxVSU1lc3NhZ2VzLl9VSV9QSV9UQVJHRVRfVkFMVUUsIFhNTFVJTWVzc2FnZXMuX1VJX1BJX0RBVEFfVkFMVUUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCWlmIChwaSAhPSBudWxsKSB7Ci0JCQkJY2hpbGRSZWYgPSBwaTsKLQkJCX0KLQotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpIHBhcmVudCA6IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlOb2RlIG5ld05vZGUgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oZGlhbG9nLmdldFRhcmdldCgpLCBkaWFsb2cuZ2V0RGF0YSgpKTsKLQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgY2hpbGRSZWYpOwotCi0JCQlpZiAocGkgIT0gbnVsbCkgewotCQkJCXBhcmVudC5yZW1vdmVDaGlsZChwaSk7Ci0JCQl9Ci0KLQkJCW1hbmFnZXIucmVmb3JtYXQobmV3Tm9kZSwgZmFsc2UpOwotCQkJbWFuYWdlci5zZXRWaWV3ZXJTZWxlY3Rpb24obmV3Tm9kZSk7Ci0JCX0KLQkJbWFuYWdlci5lbmROb2RlQWN0aW9uKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRTY2hlbWFJbmZvQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0U2NoZW1hSW5mb0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE5MzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRTY2hlbWFJbmZvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRTY2hlbWFJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBFZGl0RG9jdHlwZUFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFNjaGVtYUluZm9BY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQlwcm90ZWN0ZWQgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyOwotCXByb3RlY3RlZCBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCXByb3RlY3RlZCBOb2RlIG5vZGU7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwdWJsaWMgRWRpdFNjaGVtYUluZm9BY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGNyZWF0ZVByZWZpeE1hcHBpbmcoTGlzdCBvbGRMaXN0LCBMaXN0IG5ld0xpc3QpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlIYXNodGFibGUgb2xkVVJJVG9QcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gb2xkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCW9sZFVSSVRvUHJlZml4VGFibGUucHV0KG9sZEluZm8udXJpLCBvbGRJbmZvKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IG5ld0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIG5ld0luZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2xkVVJJVG9QcmVmaXhUYWJsZS5nZXQobmV3SW5mby51cmkgIT0gbnVsbCA/IG5ld0luZm8udXJpIDogIiIpOyAvLyROT04tTkxTLTEkCi0KLQotCQkJLy8gaWYgb2xkSW5mbyBpcyBub24gbnVsbCAuLi4gdGhlcmUncyBhIG1hdGNoaW5nIFVSSSBpbiB0aGUgb2xkCi0JCQkvLyBzZXQKLQkJCS8vIHdlIGNhbiB1c2UgaXRzIHByZWZpeCB0byBkZXRlbWluZSBvdXQgbWFwcGluZwotCQkJLy8KLQkJCS8vIGlmIG9sZEluZm8gaXMgbnVsbCAuLi4gd2UgdXNlIHRoZSAnb2xkQ29weScgd2Ugc3Rhc2hlZCBhd2F5Ci0JCQkvLyBhc3N1bWluZyB0aGF0IHRoZSB1c2VyIGNoYW5nZWQgdGhlIFVSSSBhbmQgdGhlIHByZWZpeAotCQkJaWYgKG9sZEluZm8gPT0gbnVsbCkgewotCQkJCW9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmV3SW5mby5nZXRQcm9wZXJ0eSgib2xkQ29weSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChvbGRJbmZvICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgb2xkUHJlZml4ID0gb2xkSW5mby5wcmVmaXggIT0gbnVsbCA/IG9sZEluZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIW9sZFByZWZpeC5lcXVhbHMobmV3UHJlZml4KSkgewotCQkJCQltYXAucHV0KG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KE5vZGUgbm9kZSkgewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJlc3VsdCA9IChFbGVtZW50KSBub2RlOwotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXJlc3VsdCA9IGdldFJvb3RFbGVtZW50KChEb2N1bWVudCkgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotCQlOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcm9vdEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbWFuYWdlci5iZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0KLQkJLy8gdG9kby4uLiBjaGFuZ2UgY29uc3RydWN0b3IgdG8gdGFrZSBhbiBlbGVtZW50Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQobm9kZSk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkJRWRpdFNjaGVtYUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRTY2hlbWFJbmZvRGlhbG9nKHNoZWxsLCBuZXcgUGF0aChyZXNvdXJjZUxvY2F0aW9uKSk7Ci0KLQkJCUxpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLQkJCUxpc3Qgb2xkTmFtZXNwYWNlSW5mb0xpc3QgPSBOYW1lc3BhY2VJbmZvLmNsb25lTmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0JCQkvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotCQkJLy8gdGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBjcmVhdGVQcmVmaXhNYXBwaW5nKCkgdG8gZmlndXJlIG91dAotCQkJLy8gaG93IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQKLQkJCS8vIGluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZXMKLQkJCWZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCQlOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLQkJCQlpbmZvLnNldFByb3BlcnR5KCJvbGRDb3B5Iiwgb2xkQ29weSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZGlhbG9nLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCS8vZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg1MDAsIDMwMCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9TQ0hFTUFfSU5GT1JNQVRJT05fVElUTEUpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCi0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlMaXN0IG5ld0luZm9MaXN0ID0gZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0JCQkJbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLQkJCQluYW1lc3BhY2VJbmZvTWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKGVsZW1lbnQsIG5ld0luZm9MaXN0LCB0cnVlKTsKLQotCQkJCS8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmFtZSBhbnkgcHJlZml4ZXMKLQkJCQlNYXAgcHJlZml4TWFwcGluZyA9IGNyZWF0ZVByZWZpeE1hcHBpbmcob2xkTmFtZXNwYWNlSW5mb0xpc3QsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCQlpZiAocHJlZml4TWFwcGluZy5zaXplKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYW5hZ2VyLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCQlSZXBsYWNlUHJlZml4QWN0aW9uIHJlcGxhY2VQcmVmaXhBY3Rpb24gPSBuZXcgUmVwbGFjZVByZWZpeEFjdGlvbihtYW5hZ2VyLCBlbGVtZW50LCBwcmVmaXhNYXBwaW5nKTsKLQkJCQkJCXJlcGxhY2VQcmVmaXhBY3Rpb24ucnVuKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltYW5hZ2VyLmdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbWFuYWdlci5lbmROb2RlQWN0aW9uKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL01lbnVCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9NZW51QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDcxNmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL01lbnVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgTWVudUJ1aWxkZXIgewotCi0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGdldFNvcnRLZXkobzEpLCBnZXRTb3J0S2V5KG8yKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvcnRLZXkoT2JqZWN0IG8pIHsKLQkJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQWN0aW9uKSB7Ci0JCQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgbzsKLQkJCQlyZXN1bHQgPSBhY3Rpb24uZ2V0VGV4dCgpOwotCQkJfQotCQkJLy9lbHNlIGlmIChvIGluc3RhbmNlb2YgTWVudURhdGEpCi0JCQkvL3sKLQkJCS8vICByZXN1bHQgPSAieiIgKyAoKE1lbnVEYXRhKW8pLm5hbWU7Ci0JCQkvL30KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9OwotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbHBoZWJldGljYWxHcm91cGluZyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBhY3Rpb25MaXN0KSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gYWN0aW9uTGlzdC50b0FycmF5KCk7Ci0JCWlmIChhcnJheS5sZW5ndGggPiAwKSB7Ci0JCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCX0KLQotCQlpbnQgZ3JvdXBTaXplID0gMTU7Ci0JCWludCBtaW5Hcm91cFNpemUgPSA1OwotCQlpbnQgbnVtYmVyT2ZHcm91cHMgPSAoYXJyYXkubGVuZ3RoIC8gZ3JvdXBTaXplKSArICgoYXJyYXkubGVuZ3RoICUgZ3JvdXBTaXplID4gbWluR3JvdXBTaXplKSA/IDEgOiAwKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mR3JvdXBzOyBpKyspIHsKLQkJCWJvb2xlYW4gaXNMYXN0R3JvdXAgPSAoaSA9PSAobnVtYmVyT2ZHcm91cHMgLSAxKSk7Ci0JCQlpbnQgZmlyc3RJbmRleCA9IGkgKiBncm91cFNpemU7Ci0JCQlpbnQgbGFzdEluZGV4ID0gaXNMYXN0R3JvdXAgPyBhcnJheS5sZW5ndGggLSAxIDogaSAqIGdyb3VwU2l6ZSArIGdyb3VwU2l6ZSAtIDE7Ci0JCQlBY3Rpb24gZmlyc3RBY3Rpb24gPSAoQWN0aW9uKSBhcnJheVtmaXJzdEluZGV4XTsKLQkJCUFjdGlvbiBsYXN0QWN0aW9uID0gKEFjdGlvbikgYXJyYXlbbGFzdEluZGV4XTsKLQkJCU1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoZmlyc3RBY3Rpb24uZ2V0VGV4dCgpICsgIiAtICIgKyBsYXN0QWN0aW9uLmdldFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnUuYWRkKHN1Ym1lbnUpOwotCQkJZm9yIChpbnQgaiA9IGZpcnN0SW5kZXg7IGogPD0gbGFzdEluZGV4OyBqKyspIHsKLQkJCQlzdWJtZW51LmFkZCgoQWN0aW9uKSBhcnJheVtqXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlTWVudShJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBhY3Rpb25MaXN0LCBib29sZWFuIGNyZWF0ZVRpZXJlZCkgewotCQkvLyBzb3J0IHRoZSBhY3Rpb25zCi0JCWlmIChhY3Rpb25MaXN0LnNpemUoKSA8IDI1KSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IGFjdGlvbkxpc3QudG9BcnJheSgpOwotCQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWVudS5hZGQoKEFjdGlvbikgYXJyYXlbaV0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJY3JlYXRlQWxwaGViZXRpY2FsR3JvdXBpbmcobWVudSwgYWN0aW9uTGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb3BlcnR5R3JvdXBpbmcoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QKLQkgKiBhY3Rpb25MaXN0KSB7IE1lbnVEYXRhVGFibGUgbWVudURhdGFUYWJsZSA9IG5ldyBNZW51RGF0YVRhYmxlKCk7Ci0JICogCi0JICogZm9yIChJdGVyYXRvciBpID0gYWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7IFN0cmluZwotCSAqIGdyb3VwTmFtZSA9IG51bGw7IEFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKWkubmV4dCgpOyBpZiAoYWN0aW9uCi0JICogaW5zdGFuY2VvZiBOb2RlQWN0aW9uKSB7IGdyb3VwTmFtZSA9Ci0JICogKChOb2RlQWN0aW9uKWFjdGlvbikuZ2V0R3JvdXBOYW1lKCk7IH0gaWYgKGdyb3VwTmFtZSA9PSBudWxsKSB7Ci0JICogZ3JvdXBOYW1lID0gIiI7IH0gTWVudURhdGEgbWVudURhdGEgPQotCSAqIG1lbnVEYXRhVGFibGUubG9va3VwT3JDcmVhdGUoZ3JvdXBOYW1lLCAiIik7Ci0JICogbWVudURhdGEuY2hpbGRMaXN0LmFkZChhY3Rpb24pOyB9IHBvcHVsYXRlTWVudShtZW51LAotCSAqIG1lbnVEYXRhVGFibGUuZ2V0Um9vdCgpKTsgfQotCSAqIAotCSAqIAotCSAqIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWVudShNZW51TWFuYWdlciBtZW51TWFuYWdlciwgTWVudURhdGEgbWVudURhdGEpIHsKLQkgKiBmb3IgKEl0ZXJhdG9yIGkgPSBtZW51RGF0YS5jaGlsZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCSAqIE9iamVjdCBvID0gaS5uZXh0KCk7IGlmIChvIGluc3RhbmNlb2YgQWN0aW9uKSB7Ci0JICogbWVudU1hbmFnZXIuYWRkKChBY3Rpb24pbyk7IH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIE1lbnVEYXRhKSB7Ci0JICogTWVudURhdGEgY2hpbGRNZW51RGF0YSA9IChNZW51RGF0YSlvOyBNZW51TWFuYWdlciBjaGlsZE1lbnVNYW5hZ2VyID0KLQkgKiBuZXcgTWVudU1hbmFnZXIoY2hpbGRNZW51RGF0YS5uYW1lKTsgbWVudU1hbmFnZXIuYWRkKGNoaWxkTWVudU1hbmFnZXIpOwotCSAqIHBvcHVsYXRlTWVudShjaGlsZE1lbnVNYW5hZ2VyLCBjaGlsZE1lbnVEYXRhKTsgfSB9IH0KLQkgKiAKLQkgKiAKLQkgKiBwdWJsaWMgTWVudURhdGFUYWJsZSB7IHByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JICogcHJvdGVjdGVkIE1lbnVEYXRhIHJvb3Q7Ci0JICogCi0JICogcHVibGljIE1lbnVEYXRhVGFibGUoKSB7IHJvb3QgPSBsb29rdXBPckNyZWF0ZU1lbnVEYXRhKG51bGwsIG51bGwpOyB9Ci0JICogCi0JICogcHJvdGVjdGVkIE1lbnVEYXRhIGxvb2t1cE1lbnVEYXRhKFN0cmluZyBuYW1lKSB7IFN0cmluZyBrZXkgPSBuYW1lICE9Ci0JICogbnVsbCA/IG5hbWUgOiAiIjsgcmV0dXJuIChNZW51RGF0YSltZW51RGF0YVRhYmxlLmdldChrZXkpOyB9Ci0JICogCi0JICogcHJvdGVjdGVkIE1lbnVEYXRhIGxvb2t1cE9yQ3JlYXRlTWVudURhdGEoU3RyaW5nIG5hbWUsIFN0cmluZwotCSAqIHBhcmVudE5hbWUpIHsgU3RyaW5nIGtleSA9IG5hbWUgIT0gbnVsbCA/IG5hbWUgOiAiIjsgTWVudURhdGEgbWVudURhdGEgPQotCSAqIChNZW51RGF0YSltZW51RGF0YVRhYmxlLmdldChrZXkpOyBpZiAobWVudURhdGEgPT0gbnVsbCkgeyBtZW51RGF0YSA9Ci0JICogbmV3IE1lbnVEYXRhKG5hbWUsIHBhcmVudE5hbWUpOyBtZW51RGF0YVRhYmxlLnB1dChrZXksIG1lbnVEYXRhKTsgfQotCSAqIHJldHVybiBtZW51RGF0YTsgfQotCSAqIAotCSAqIHB1YmxpYyBNZW51RGF0YSBnZXRSb290KCkgeyByZXR1cm4gcm9vdDsgfSB9Ci0JICogCi0JICogCi0JICogcHJvdGVjdGVkIGNsYXNzIE1lbnVEYXRhIHsgcHVibGljIFN0cmluZyBuYW1lOyBwdWJsaWMgU3RyaW5nCi0JICogcGFyZW50TmFtZTsgcHVibGljIExpc3QgY2hpbGRMaXN0ID0gbmV3IFZlY3RvcigpOwotCSAqIAotCSAqIE1lbnVEYXRhKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50TmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOwotCSAqIHRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgdm9pZCBzb3J0KCkgeyBPYmplY3RbXSBhcnJheSA9IGNoaWxkTGlzdC50b0FycmF5KCk7IGlmCi0JICogKGFycmF5Lmxlbmd0aCA+IDAgKSB7IEFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsgfSBjaGlsZExpc3QgPQotCSAqIEFycmF5cy5hc0xpc3QoYXJyYXkpOwotCSAqIAotCSAqIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7IE9iamVjdCBvID0KLQkgKiBpLm5leHQoKTsgaWYgKG8gaW5zdGFuY2VvZiBNZW51RGF0YSkgeyAoKE1lbnVEYXRhKW8pLnNvcnQoKTsgfSB9IH0gfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM0NzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL05vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U29ydEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzYyY2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogUmVtb3ZlIGJsb2NrIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIHsKLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlpZiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID09IG51bGwgfHwgc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID09IDApIHsKLQkJCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQotCQkJCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlcGxhY2VQcmVmaXhBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlcGxhY2VQcmVmaXhBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0MzBlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXBsYWNlUHJlZml4QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVByZWZpeEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCi0JY2xhc3MgTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yIGV4dGVuZHMgRE9NVmlzaXRvciB7Ci0JCXB1YmxpYyBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVmaXhDaGFuZ2VkTmVlZGVkKE5vZGUgbm9kZSkgewotCQkJU3RyaW5nIGtleSA9IG5vZGUuZ2V0UHJlZml4KCkgIT0gbnVsbCA/IG5vZGUuZ2V0UHJlZml4KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHByZWZpeE1hcHBpbmcuZ2V0KGtleSkgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZpc2l0QXR0cihBdHRyIGF0dHIpIHsKLQkJCS8qCi0JCQkgKiBpZiAoaXNQcmVmaXhDaGFuZ2VkTmVlZGVkKGVsZW1lbnQpKSB7IGxpc3QuYWRkKGF0dHIpOyB9Ci0JCQkgKi8KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQkJCWlmIChpc1ByZWZpeENoYW5nZWROZWVkZWQoZWxlbWVudCkpIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE1hcCBwcmVmaXhNYXBwaW5nOwotCi0JcHVibGljIFJlcGxhY2VQcmVmaXhBY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBFbGVtZW50IGVsZW1lbnQsIE1hcCBwcmVmaXhNYXBwaW5nKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHJlZml4TWFwcGluZyA9IHByZWZpeE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yIHZpc2l0b3IgPSBuZXcgTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yKCk7Ci0JCXZpc2l0b3IudmlzaXROb2RlKGVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSB2aXNpdG9yLmxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gbm9kZS5nZXRQcmVmaXgoKSAhPSBudWxsID8gbm9kZS5nZXRQcmVmaXgoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmV3UHJlZml4ID0gKFN0cmluZykgcHJlZml4TWFwcGluZy5nZXQoa2V5KTsKLQkJCWlmIChuZXdQcmVmaXggIT0gbnVsbCkgewotCQkJCW5vZGUuc2V0UHJlZml4KG5ld1ByZWZpeCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY3MTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFRvZ2dsZSBjb21tZW50IGFjdGlvbiBkZWxlZ2F0ZSBmb3IgWE1MIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgewotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlRvZ2dsZUNvbW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0Jdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQkvLyBnZXQgdGV4dCBzZWxlY3Rpb24gbGluZXMgaW5mbwotCQlpbnQgc2VsZWN0aW9uU3RhcnRMaW5lID0gdGV4dFNlbGVjdGlvbi5nZXRTdGFydExpbmUoKTsKLQkJaW50IHNlbGVjdGlvbkVuZExpbmUgPSB0ZXh0U2VsZWN0aW9uLmdldEVuZExpbmUoKTsKLQkJdHJ5IHsKLQkJCWludCBzZWxlY3Rpb25FbmRMaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzZWxlY3Rpb25FbmRMaW5lKTsKLQkJCWludCBzZWxlY3Rpb25FbmRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQotCQkJLy8gYWRqdXN0IHNlbGVjdGlvbiBlbmQgbGluZQotCQkJaWYgKHNlbGVjdGlvbkVuZExpbmUgPiBzZWxlY3Rpb25TdGFydExpbmUgJiYgc2VsZWN0aW9uRW5kTGluZU9mZnNldCA9PSBzZWxlY3Rpb25FbmRPZmZzZXQpCi0JCQkJc2VsZWN0aW9uRW5kTGluZS0tOwotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCS8vIHNhdmUgdGhlIHNlbGVjdGlvbiBwb3NpdGlvbiBzaW5jZSBpdCB3aWxsIGJlIGNoYW5naW5nCi0JCVBvc2l0aW9uIHNlbGVjdGlvblBvc2l0aW9uID0gbnVsbDsKLQkJYm9vbGVhbiB1cGRhdGVTdGFydE9mZnNldCA9IGZhbHNlOwotCQl0cnkgewotCQkJc2VsZWN0aW9uUG9zaXRpb24gPSBuZXcgUG9zaXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQlkb2N1bWVudC5hZGRQb3NpdGlvbihzZWxlY3Rpb25Qb3NpdGlvbik7Ci0KLQkJCS8vIGV4dHJhIGNoZWNrIGlmIGNvbW1lbnRpbmcgZnJvbSBiZWdpbm5pbmcgb2YgbGluZQotCQkJaW50IHNlbGVjdGlvblN0YXJ0TGluZU9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc2VsZWN0aW9uU3RhcnRMaW5lKTsKLQkJCWlmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCAmJiBzZWxlY3Rpb25TdGFydExpbmVPZmZzZXQgPT0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSAmJiAhaXNDb21tZW50TGluZShkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lKSkKLQkJCQl1cGRhdGVTdGFydE9mZnNldCA9IHRydWU7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXByb2Nlc3NBY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblN0YXJ0TGluZSwgc2VsZWN0aW9uRW5kTGluZSk7Ci0KLQkJdXBkYXRlQ3VycmVudFNlbGVjdGlvbihzZWxlY3Rpb25Qb3NpdGlvbiwgZG9jdW1lbnQsIHVwZGF0ZVN0YXJ0T2Zmc2V0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzZWxlY3Rpb25TdGFydExpbmUsIGludCBzZWxlY3Rpb25FbmRMaW5lKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgWE1MVUlNZXNzYWdlcy5Ub2dnbGVDb21tZW50X3Rvb2x0aXApOwotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJZm9yIChpbnQgaSA9IHNlbGVjdGlvblN0YXJ0TGluZTsgaSA8PSBzZWxlY3Rpb25FbmRMaW5lOyBpKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkb2N1bWVudC5nZXRMaW5lTGVuZ3RoKGkpID4gMCkgewotCQkJCQkJCWlmIChpc0NvbW1lbnRMaW5lKGRvY3VtZW50LCBpKSkgewotCQkJCQkJCQlpbnQgbGluZU9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoaSk7Ci0JCQkJCQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCQkJCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gbGluZU9mZnNldCArIHN0cmluZy5pbmRleE9mKE9QRU5fQ09NTUVOVCk7Ci0JCQkJCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBsaW5lT2Zmc2V0ICsgc3RyaW5nLmluZGV4T2YoQ0xPU0VfQ09NTUVOVCkgLSBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQkJCQkJCXVuY29tbWVudChkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQsIGNsb3NlQ29tbWVudE9mZnNldCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGkpOwotCQkJCQkJCQlpbnQgbGluZURlbGltaXRlckxlbmd0aCA9IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSkgPT0gbnVsbCA/IDAgOiBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpLmxlbmd0aCgpOwotCQkJCQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gb3BlbkNvbW1lbnRPZmZzZXQgKyBkb2N1bWVudC5nZXRMaW5lTGVuZ3RoKGkpIC0gbGluZURlbGltaXRlckxlbmd0aCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCQkJCQkJY29tbWVudChkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQsIGNsb3NlQ29tbWVudE9mZnNldCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50TGluZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBsaW5lKSB7Ci0JCWJvb2xlYW4gaXNDb21tZW50ID0gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmUpOwotCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSkudHJpbSgpOwotCQkJaXNDb21tZW50ID0gc3RyaW5nLmxlbmd0aCgpID49IE9QRU5fQ09NTUVOVC5sZW5ndGgoKSArIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkgJiYgc3RyaW5nLnN0YXJ0c1dpdGgoT1BFTl9DT01NRU5UKSAmJiBzdHJpbmcuZW5kc1dpdGgoQ0xPU0VfQ09NTUVOVCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gaXNDb21tZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCAwLCBPUEVOX0NPTU1FTlQpOwotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIDAsIENMT1NFX0NPTU1FTlQpOwotCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5jb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudFNlbGVjdGlvbihQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCS8vIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGlmIHRleHQgc2VsZWN0aW9uIGNoYW5nZWQKLQkJCWlmIChzZWxlY3Rpb25Qb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQkJCQlpZiAodXBkYXRlU3RhcnRPZmZzZXQpCi0JCQkJCXNlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCWVsc2UKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblBvc2l0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKChJVGV4dEVkaXRvcikgZkVkaXRvcikuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlwcm92aWRlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQkJZG9jdW1lbnQucmVtb3ZlUG9zaXRpb24oc2VsZWN0aW9uUG9zaXRpb24pOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3ZmVjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBdXRvRWRpdFN0cmF0ZWd5IHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluc2VydGVkIHdoZW4gVGFiIGtleSBpcyBwcmVzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGlmIG5vdCBpbiBzbWFydCBpbnNlcnQgbW9kZSBqdXN0IGlnbm9yZQotCQlpZiAoIWlzU21hcnRJbnNlcnRNb2RlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKGNvbW1hbmQubGVuZ3RoID09IDAgJiYgY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKSAhPSAtMSkKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IGdldEluZGVudGF0aW9uV2lkdGgoKTsKLQkJaWYgKGluZGVudGF0aW9uV2lkdGggPiAtMSkgewotCQkJU3RyaW5nIG9yaWdpbmFsVGV4dCA9IGNvbW1hbmQudGV4dDsKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihvcmlnaW5hbFRleHQpOwotCi0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQotCQkJSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gZ2V0TGluZVRyYWNrZXIoZG9jdW1lbnQsIG9yaWdpbmFsVGV4dCk7Ci0KLQkJCWludCBzdGFydEluZGV4ID0gMDsKLQkJCWludCBpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50YXRpb25XaWR0aCwgbGluZU9mZnNldCwgbGluZVRyYWNrZXIsIGluZGV4KTsKLQotCQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVyIHdpdGggc3BhY2VzCi0JCQkJbmV3VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIDEsIGluZGVudCk7Ci0JCQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpbmVUcmFja2VyLnJlcGxhY2UoaW5kZXgsIDEsIGluZGVudCk7Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggcmVwbGFjaW5nIHRleHQsIGp1c3QKLQkJCQkJCS8vIHJlc2V0IHRvIGN1cnJlbnQgc3RyaW5nCi0JCQkJCQlsaW5lVHJhY2tlci5zZXQobmV3VGV4dC50b1N0cmluZygpKTsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXN0YXJ0SW5kZXggPSBpbmRleCArIGluZGVudC5sZW5ndGgoKTsKLQkJCQlpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWNvbW1hbmQudGV4dCA9IG5ld1RleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygc3BhY2VzIGZvciBuZXh0IHRhYiBzdG9wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRhdGlvbldpZHRoLCBpbnQgbGluZU9mZnNldCwgSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQlpbnQgb2Zmc2V0SW5MaW5lID0gLTE7Ci0JCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBsaW5lVHJhY2tlci5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbmRleCk7Ci0JCQkJaWYgKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDAgJiYgbGluZU9mZnNldCA+IC0xKQotCQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQkJZWxzZQotCQkJCQlvZmZzZXRJbkxpbmUgPSBpbmRleCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9mZnNldEluTGluZSA+IC0xICYmIGluZGVudGF0aW9uV2lkdGggPiAwKSB7Ci0JCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRTaXplOyBpKyspCi0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKGRlbGltc1swXSAhPSAtMSB8fCBkZWxpbXNbMV0gIT0gLTEpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCQkKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvcjsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcillZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpCi0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCXJldHVybiBpc1NtYXJ0SW5zZXJ0TW9kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJcmV0dXJuIHdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneVhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWMwYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEF1dG9tYXRpY2FsbHkgaW5zZXJ0cyBjbG9zaW5nIGNvbW1lbnQgdGFnIG9yIGVuZCB0YWcgd2hlbiBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCS8qCi0JICogTk9URTogY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3RzIGluCi0JICogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdAotCSAqIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICovCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJT2JqZWN0IHRleHRFZGl0b3IgPSBnZXRBY3RpdmVUZXh0RWRpdG9yKCk7Ci0JCWlmICghKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCkgewotCQkJCQlzbWFydEluc2VydEZvckNvbW1lbnQoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQkJc21hcnRJbnNlcnRGb3JFbmRUYWcoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50ICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JDb21tZW50KERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCItIikgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMyAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAzLCAzKS5lcXVhbHMoIjwhLSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWNvbW1hbmQudGV4dCArPSAiICAtLT4iOyAvLyROT04tTkxTLTEkCi0JCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDI7Ci0JCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvckVuZFRhZyhEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiLyIpICYmIGRvY3VtZW50LmdldExlbmd0aCgpID49IDEgJiYgZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0IC0gMSwgMSkuZXF1YWxzKCI8IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgKChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCAtIDEpKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlIHBhcmVudAotCQkJCQl3aGlsZSAocGFyZW50Tm9kZSAhPSBudWxsICYmIGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0RvY3VtZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBvbmx5IGFkZCBlbmQgdGFnIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmCi0JCQkJCS8vIGFkZCAnLycgZG9lcyBub3QgY3JlYXRlIG9uZSBhbHJlYWR5Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcGFyZW50Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgdG9BZGQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAodG9BZGQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdG9BZGQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgc3VmZml4ID0gdG9BZGQudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoKGRvY3VtZW50LmdldExlbmd0aCgpIDwgY29tbWFuZC5vZmZzZXQgKyBzdWZmaXgubGVuZ3RoKCkpIHx8ICghc3VmZml4LmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIHN1ZmZpeC5sZW5ndGgoKSkpKSkgewotCQkJCQkJCQljb21tYW5kLnRleHQgKz0gc3VmZml4OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVlM2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLkNNSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFnaW5mby5NYXJrdXBUYWdJbmZvUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ0xPU0UgPSAiSlNQX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfQ0xPU0UgPSAiSlNQX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX09QRU4gPSAiSlNQX0NPTU1FTlRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTEVSUk9SID0gWE1MVUlNZXNzYWdlcy5TRVZFUkVfaW50ZXJuYWxfZXJyb3Jfb2NjdV9VSV87Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9BVFRSID0gWE1MVUlNZXNzYWdlcy5Ob19rbm93bl9hdHRyaWJ1dGVfX1VJXzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFWFQgPSBYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXzsKLQlwcm90ZWN0ZWQgY2hhciBjb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNbXSA9IG51bGw7Ci0JcHJvdGVjdGVkIGNoYXIgY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByaXZhdGUgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIgZkF0dHJpYnV0ZUluZm9Qcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgZkNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZkdlbmVyYXRvcjsKLQkvLyBwcm90ZWN0ZWQgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgTWFya3VwVGFnSW5mb1Byb3ZpZGVyIGZJbmZvUHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBJVGV4dFZpZXdlciBmVGV4dFZpZXdlciA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2hvd1ZhbHVlcyA9IHRydWU7Ci0KLQlwdWJsaWMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlpbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkvLyByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQotCQkJLy8gY2hlY2sgd2hldGhlciBhbiBhdHRyaWJ1dGUgcmVhbGx5IGV4aXN0cyBmb3IgdGhlIHJlcGxhY2VtZW50Ci0JCQkvLyBvZmZzZXRzIEFORCBpZiBpdCBwb3NzZXNzZXMgYSB2YWx1ZQotCQkJYm9vbGVhbiBhdHRyQXRMb2NhdGlvbkhhc1ZhbHVlID0gZmFsc2U7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUF0dHJJbXBsIGV4aXN0aW5nQXR0ciA9IChBdHRySW1wbCkgYXR0cnMuaXRlbShpKTsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gZXhpc3RpbmdBdHRyLmdldE5hbWVSZWdpb24oKTsKLQotCQkJCWlmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSA8PSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSAmJiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSArIG5hbWUuZ2V0TGVuZ3RoKCkgPj0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpICYmIGV4aXN0aW5nQXR0ci5nZXRWYWx1ZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQkJYXR0ckF0TG9jYXRpb25IYXNWYWx1ZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gb25seSBhZGQgcHJvcG9zYWxzIGZvciB0aGUgYXR0cmlidXRlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoCi0JCQkvLyB0aGUgbWF0Y2hzdHJpbmcKLQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCi0JCQkJCWludCBpc1JlcXVpcmVkID0gMDsKLQkJCQkJaWYgKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJaXNSZXF1aXJlZCA9IFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1JFUVVJUkVEOwotCQkJCQl9Ci0KLQkJCQkJYm9vbGVhbiBzaG93QXR0cmlidXRlID0gdHJ1ZTsKLQkJCQkJc2hvd0F0dHJpYnV0ZSA9IHNob3dBdHRyaWJ1dGUgJiYgYmVnaW5zV2l0aChnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpLCBtYXRjaFN0cmluZy50cmltKCkpOwotCQkJCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKSk7Ci0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyICE9IG51bGwgPyBhdHRyLmdldE5hbWVSZWdpb24oKSA6IG51bGw7Ci0JCQkJCS8vIG5hbWVSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyAxIGlzIHJlcXVpcmVkIHRvIGFsbG93IGZvcgotCQkJCQkvLyBtYXRjaGVzIGFnYWluc3QgdGhlIGZ1bGwgbmFtZSBvZiBhbiBleGlzdGluZyBBdHRyCi0JCQkJCXNob3dBdHRyaWJ1dGUgPSBzaG93QXR0cmlidXRlICYmICgoYXR0ciA9PSBudWxsKSB8fCAobmFtZVJlZ2lvbiAhPSBudWxsICYmIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pIDw9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICYmIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pICsgbmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCkpKTsKLQkJCQkJaWYgKHNob3dBdHRyaWJ1dGUpIHsKLQkJCQkJCUltYWdlIGF0dHJJbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGF0dHJEZWNsKTsKLQkJCQkJCWlmIChhdHRySW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCWlmIChpc1JlcXVpcmVkID4gMCkgewotCQkJCQkJCQlhdHRySW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVF9SRVFfT0JKKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWF0dHJJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKGVsZW1lbnREZWNsLCBhdHRyRGVjbCk7Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBudWxsOwotCQkJCQkJLy8gYXR0cmlidXRlIGlzIGF0IHRoaXMgbG9jYXRpb24gYW5kIGFscmVhZHkgZXhpc3RzCi0JCQkJCQlpZiAoYXR0ckF0TG9jYXRpb25IYXNWYWx1ZSkgewotCQkJCQkJCS8vIG9ubHkgcHJvcG9zZSB0aGUgbmFtZQotCQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCk7Ci0JCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSwgYXR0ckltYWdlLCBwcm9wb3NlZFRleHQsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9OQU1FICsgaXNSZXF1aXJlZCwgdHJ1ZSk7CQkKLQkJCQkJCX0KLQkJCQkJCS8vIG5vIGF0dHJpYnV0ZSBleGlzdHMgb3IgaXMgZWxzZXdoZXJlLCBnZW5lcmF0ZQotCQkJCQkJLy8gbWluaW1hbGx5Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlBdHRyIGV4aXN0aW5nQXR0ck5vZGUgPSAoQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCkpOwotCQkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGV4aXN0aW5nQXR0ck5vZGUgIT0gbnVsbCkKLQkJCQkJCQkJdmFsdWUgPSBleGlzdGluZ0F0dHJOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkKLQkJCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGF0dHJEZWNsLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgKyAyLCBhdHRySW1hZ2UsCi0JCQkJCQkJLy8gaWYgdGhlIHZhbHVlIGlzbid0IGVtcHR5IChubyBlbXB0eSBzZXQgb2YKLQkJCQkJCQkJCQkvLyBxdW90ZXMpLCBzaG93IGl0Ci0JCQkJCQkJCQkJKHNob3dWYWx1ZXMgJiYgcHJvcG9zZWRUZXh0LmluZGV4T2YoIlwiXCIiKSA8IDApID8gcHJvcG9zZWRUZXh0IDogZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9OQU1FICsgaXNSZXF1aXJlZCk7Ci0JCQkJCQl9Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbGVtZW50X19pc191bmtub3duLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCi0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSByZWdpb24gYW5kIG5hbWUgZm9yIHdoaWNoIHRoaXMgcG9zaXRpb24gc2hvdWxkCi0JCS8vIGhhdmUgYSB2YWx1ZSBwcm9wb3NlZAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQlpbnQgaSA9IG9wZW5SZWdpb25zLmluZGV4T2YoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkpOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQluYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQlpZiAobmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gdGhlIG5hbWUgcmVnaW9uIGlzIFJFUVVJUkVEIHRvIGRvIGFueXRoaW5nIHVzZWZ1bAotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBSZXRyaWV2ZSB0aGUgZGVjbGFyYXRpb24KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0KLQkJCS8vIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbmFtZVJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG9wZW4uZ2V0VGV4dChuYW1lUmVnaW9uKTsKLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0KLQkJCS8vIE5vIENNRWxlbWVudERlY2xhcmF0aW9uIG1lYW5zIG5vIGF0dHJpYnV0ZSBtZXRhZGF0YSwgYnV0Ci0JCQkvLyByZXRyaWV2ZSB0aGUKLQkJCS8vIGRlY2xhcmF0aW9uIGZvciB0aGUgYXR0cmlidXRlIG90aGVyd2lzZQotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCVN0cmluZyBub3ByZWZpeE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0cmlidXRlTmFtZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShub3ByZWZpeE5hbWUpOwotCQkJCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQVRUUiwgYXR0cmlidXRlTmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IG51bGw7Ci0JCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGF0dHJEZWNsKTsKLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJEZWNsICE9IG51bGwgJiYgYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRfUkVRX09CSik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChhdHRyRGVjbCAhPSBudWxsICYmIGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgewotCQkJCS8vIGF0dHJpYnV0ZSBpcyBrbm93biwgcHJvbXB0IHdpdGggdmFsdWVzIGZyb20gdGhlIGRlY2xhcmF0aW9uCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQlMaXN0IHBvc3NpYmxlVmFsdWVzID0gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhub2RlLCBhdHRyRGVjbCk7Ci0JCQkJaWYgKHBvc3NpYmxlVmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gRU5VTUVSQVRFRCBWQUxVRVMKLQkJCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCQkJaWYgKG1hdGNoU3RyaW5nID09IG51bGwpCi0JCQkJCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDAgJiYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikgfHwgbWF0Y2hTdHJpbmcuc3RhcnRzV2l0aCgiJyIpKSkgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQkJCQlib29sZWFuIGN1cnJlbnRWYWxpZCA9IGZhbHNlOwotCi0JCQkJCS8vIGQyMTA4NTgsIGlmIHRoZSByZWdpb24ncyBhIGNvbnRhaW5lciwgZG9uJ3Qgc3VnZ2VzdCB0aGUKLQkJCQkJLy8gZW51bWVyYXRlZCB2YWx1ZXMgYXMgdGhleSBwcm9iYWJseSB3b24ndCBoZWxwCi0JCQkJCWJvb2xlYW4gZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgIT0gbnVsbCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQkJCQlpZiAoIWV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBqID0gcG9zc2libGVWYWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJU3RyaW5nIHBvc3NpYmxlVmFsdWUgPSAoU3RyaW5nKSBqLm5leHQoKTsKLQkJCQkJCQljdXJyZW50VmFsaWQgPSBjdXJyZW50VmFsaWQgfHwgcG9zc2libGVWYWx1ZS5lcXVhbHMoY3VycmVudFZhbHVlKTsKLQkJCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBwb3NzaWJsZVZhbHVlLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkJCQotCQkJCQkJCQlTdHJpbmcgclN0cmluZyA9ICJcIiIgKyBwb3NzaWJsZVZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaW50IHJPZmZzZXQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQkJCQkJaW50IHJMZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCQkJCQlpbnQgY3Vyc29yQWZ0ZXIgPSBwb3NzaWJsZVZhbHVlLmxlbmd0aCgpICsgMTsKLQkJCQkJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSAiXCIiICsgcG9zc2libGVWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCQotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJTdHJpbmcsIHJPZmZzZXQsIHJMZW5ndGgsIGN1cnNvckFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLkZJWEVEIHx8IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCkgJiYgYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJCS8vIEZJWEVEIHZhbHVlcwotCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCVN0cmluZyByVmFsdWUgPSAiXCIiICsgdmFsdWUgKyAiXCIiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJWYWx1ZSwgCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgclZhbHVlLmxlbmd0aCgpICsgMSwgaW1hZ2UsIHJWYWx1ZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCWlmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwICYmICF2YWx1ZS5lcXVhbHMoY3VycmVudFZhbHVlKSkgewotCQkJCQkJCXJWYWx1ZSA9ICJcIiIgKyBjdXJyZW50VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChyVmFsdWUsCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHJWYWx1ZS5sZW5ndGgoKSArIDEsIGltYWdlLCByVmFsdWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdW5rbm93biBhdHRyaWJ1dGUsIHNvIHN1cHBseSBuaWNlIGVtcHR5IHZhbHVlcwotCQkJCXByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVsZW1lbnREZWNsKTsKLQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBudWxsOwotCQkJCWlmIChjdXJyZW50VmFsdWUgIT0gbnVsbCAmJiBjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCVN0cmluZyByVmFsdWUgPSAiXCIiICsgY3VycmVudFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJWYWx1ZSwKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDEsIGltYWdlLCByVmFsdWUsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIjwhLS0gIC0tPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDUsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09NTUVOVCksIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ29tbWVudF9fLCAobmV3IE9iamVjdFtdeyIgPCEtLSAgLS0+In0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DT01NRU5UKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCBvZiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgaW50IHRoZSBDTUNvbnRlbnQgb2JqZWN0IGludG8gb25lCi0JICogYmlnIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudChMaXN0IGNvbnRlbnRMaXN0LCBDTUNvbnRlbnQgY29udGVudCkgewotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNR3JvdXApIHsKLQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQkJY29udGVudExpc3QuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkgewotCQkJCQkJYWRkQ29udGVudChjb250ZW50TGlzdCwgKENNQ29udGVudCkgY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjb250ZW50IGNoaWxkOiAiICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb250ZW50TGlzdC5hZGQoY29udGVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREb2NUeXBlUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gaWYgYSBEb2N1bWVudEVsZW1lbnQgZXhpc3RzLCB1c2UgdGhhdCBmb3IgdGhlIHJvb3QgRWxlbWVudCBuYW1lCi0JCVN0cmluZyByb290bmFtZSA9ICJ1bnNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJvb3RuYW1lID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXROb2RlTmFtZSgpOwotCi0JCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPCFET0NUWVBFICIgKyByb290bmFtZSArICIgUFVCTElDIFwiLy9VTktOT1dOL1wiIFwidW5rbm93bi5kdGRcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgMTAsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRE9DVFlQRSksICI8IURPQ1RZUEUgLi4uID4iLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0RPQ1RZUEUpOwotCQkvLyBUT0RPIHByb3ZpZGUgc3BlY2lhbCBkb2N1bWVudGF0aW9uIG9uIGRvYyB0eXBlCi0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgYSBjb21wbGV0ZWx5IGVtcHR5IGRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wb3NhbHMgZm9yIHRoZSBuYW1lIGluIGFuIGVuZCB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0KLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCkgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCkgPCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSkgewotCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiAnPicifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHX05BTUUpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQl9Ci0JCWVsc2UgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlOb2RlIGFOb2RlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCWlmIChtYXRjaFN0cmluZy5zdGFydHNXaXRoKCI8LyIpKSAvLyROT04tTkxTLTEkCi0JCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMik7Ci0JCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChhTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChhTm9kZS5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQlJRE9NTm9kZSBhWE1MTm9kZSA9IChJRE9NTm9kZSkgYU5vZGU7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIGFOb2RlKTsKLQkJCQkJCWlmICgoYVhNTE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgJiYgKGVkID09IG51bGwgfHwgKGVkLmdldENvbnRlbnRUeXBlKCkgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpKSkgewotCQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBhTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSAoZWQgIT0gbnVsbCkgPyBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlZCkgOiBudWxsOwotCQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKQotCQkJCQkJCQlwcm9wb3NlZFRleHQgKz0gIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbnVsbDsKLQkJCQkJCQkvLyBkb3VibGUgY2hlY2sgdG8gc2VlIGlmIHRoZSByZWdpb24gYWN0ZWQgdXBvbiBpcwotCQkJCQkJCS8vIGEgdGFnIG5hbWU7IHJlcGxhY2UgaXQgaWYgc28KLQkJCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBpbWFnZSwgcHJvcG9zZWRUZXh0LCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiciICsgcHJvcG9zZWRUZXh0ICsgIicifSkpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYU5vZGUgPSBhTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgZm9yIGVuZCB0YWdzIHRvIGEgbm9uLWVtcHR5IE5vZGUgdGhhdCBoYXNuJ3QgZW5kZWQgSGFuZGxlcyB0aGVzZQotCSAqIGNhc2VzOiA8YnI+Ci0JICogPHRhZ09wZW4+fCA8YnI+Ci0JICogPHRhZ09wZW4+PCB8PGJyPgotCSAqIDx0YWdPcGVuPjwvIHwKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0KLQkJaWYgKGlzQ29tbWVudE5vZGUobm9kZSkpIHsKLQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgbm9kZSBwYXJlbnQKLQkJCXdoaWxlIChub2RlICE9IG51bGwgJiYgaXNDb21tZW50Tm9kZShub2RlKSkgewotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBub2RlIGlzIGFscmVhZHkgY2xvc2VkCi0JCWlmKG5vZGUuaXNDbG9zZWQoKSkgewotCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCB1bmNsb3NlIG5vZGUgcGFyZW50Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUuaXNDbG9zZWQoKSkgewotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCS8vIHRoZXJlIHdlcmUgbm8gdW5jbG9zZWQgdGFncwotCQlpZihub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBkYXRhIHRvIGNyZWF0ZSBhIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbAotCQlTdHJpbmcgcmVwbGFjZVRleHQgPSBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHJlcGxhY2VCZWdpbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCWludCBjdXJzb3JPZmZzZXQgPSBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgKyAxOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwcm9wb3NlZEluZm8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJYm9vbGVhbiBhZGRQcm9wb3NhbCA9IGZhbHNlOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZUZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHhtbEVuZFRhZ09wZW4gPSBzRG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQkJCS8vIHNraXAgYmFja3dhcmQgdG8gIjwiLCAiPC8iLCBvciB0aGUgKHVuY2xvc2VkKSBzdGFydCB0YWcsIG51bGwKLQkJCS8vIGlmIG5vdCBmb3VuZAotCQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHhtbEVuZFRhZ09wZW4gIT0gbnVsbCAmJiAodHlwZSA9IHhtbEVuZFRhZ09wZW4uZ2V0VHlwZSgpKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gJiYgdHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgJiYgIW5lZWRzRW5kVGFnKHhtbEVuZFRhZ09wZW4pICYmIHR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQl4bWxFbmRUYWdPcGVuID0geG1sRW5kVGFnT3Blbi5nZXRQcmV2aW91cygpOwotCQkJfQotCi0JCQlpZiAoeG1sRW5kVGFnT3BlbiA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oeG1sRW5kVGFnT3Blbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCi0JCQlpZiAoaXNTdGFydFRhZyh4bWxFbmRUYWdPcGVuKSkgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yIGEgc3RhcnQgdGFnIHcvb3V0IGVuZCB0YWcKLQkJCQkvLyBlZzoKLQkJCQkvLyA8cD4KLQkJCQkvLyA8JSBTdHJpbmcgdGVzdCA9ICJ0ZXN0IjsgJT4KLQkJCQkvLyB8Ci0JCQkJaWYgKG5lZWRzRW5kVGFnKHhtbEVuZFRhZ09wZW4pKSB7Ci0JCQkJCVN0cmluZyB0YWdOYW1lID0gZ2V0VGFnTmFtZSh4bWxFbmRUYWdPcGVuKTsKLQkJCQkJeG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQkJCXJlcGxhY2VMZW5ndGggPSAwOwotCQkJCQlyZXBsYWNlVGV4dCA9ICI8LyIgKyB0YWdOYW1lICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgJE5PTi1OTFMtMiQKLQkJCQkJLy8gcmVwbGFjZVRleHQgPSAiPC8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOwotCQkJCQkvLyAvLyROT04tTkxTLTEkICROT04tTkxTLTIkCi0JCQkJCWN1cnNvck9mZnNldCA9IHRhZ05hbWUubGVuZ3RoKCkgKyAzOwotCQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF9fLCAobmV3IE9iamVjdFtde3RhZ05hbWV9KSk7Ci0JCQkJCWFkZFByb3Bvc2FsID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yOiA8dGFnPiA8LyB8Ci0JCQkJLy8gcG9zc2libHkgPHRhZz4gPC8gfDxhbm90aGVyVGFnPgotCQkJCS8vIHNob3VsZCBvbmx5IGJlIHJlcGxhY2luZyB3aGl0ZSBzcGFjZS4uLgotCQkJCXJlcGxhY2VMZW5ndGggPSAocmVwbGFjZUJlZ2luID4geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkpID8gcmVwbGFjZUJlZ2luIC0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkgOiAwOwotCQkJCXJlcGxhY2VUZXh0ID0gbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJY3Vyc29yT2Zmc2V0ID0gcmVwbGFjZVRleHQubGVuZ3RoKCk7Ci0JCQkJcmVwbGFjZUJlZ2luID0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3I6IDx0YWc+IDwgfAotCQkJCXJlcGxhY2VUZXh0ID0gIi8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgJE5PTi1OTFMtMiQKLQkJCQljdXJzb3JPZmZzZXQgPSByZXBsYWNlVGV4dC5sZW5ndGgoKTsKLQkJCQkvLyByZXBsYWNlVGV4dCA9ICIvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCS8vICROT04tTkxTLTIkCi0JCQkJLy8gc2hvdWxkIG9ubHkgYmUgcmVwbGFjaW5nIHdoaXRlIHNwYWNlLi4uCi0JCQkJcmVwbGFjZUxlbmd0aCA9IChyZXBsYWNlQmVnaW4gPiB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKSkgPyByZXBsYWNlQmVnaW4gLSB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKSA6IDA7Ci0JCQkJcmVwbGFjZUJlZ2luID0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAgKG5ldyBPYmplY3RbXXsiLyIgKyBub2RlLmdldE5vZGVOYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIHNvbWV0aW1lcyB0aGUgbm9kZSBpcyBub3QgbnVsbCwgYnV0Ci0JCS8vIGdldE5vZGVWYWx1ZSgpIGlzIG51bGwsIHB1dCBpbiBhIG51bGwgY2hlY2sKLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVmFsdWUoKSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVZhbHVlKCkuaW5kZXhPZigiPC8iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aGUgY2FzZSB3aGVyZSAiPC8iIGlzIHN0YXJ0ZWQsIGJ1dCB0aGUgbm9kZXMgY29tZXMgaW4gYXMgYQotCQkJLy8gdGV4dCBub2RlIChpbnN0ZWFkIG9mIGVsZW1lbnQpCi0JCQkvLyBsaWtlIHRoaXM6IDx0YWc+IDwvfAotCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXBsYWNlVGV4dCA9IHBhcmVudC5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJY3Vyc29yT2Zmc2V0ID0gcmVwbGFjZVRleHQubGVuZ3RoKCk7Ci0JCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfXywgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYWRkUHJvcG9zYWwgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9DT05URVhUKTsKLQkJfQotCQlpZiAoYWRkUHJvcG9zYWwgPT0gdHJ1ZSkgewotCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChyZXBsYWNlVGV4dCwgcmVwbGFjZUJlZ2luLCByZXBsYWNlTGVuZ3RoLCBjdXJzb3JPZmZzZXQsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUcpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGVwcyA9IGNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUpOwotCQlmb3IgKGludCBpID0gMDsgZXBzICE9IG51bGwgJiYgaSA8IGVwcy5sZW5ndGg7IGkrKykKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKGVwc1tpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKFZlY3RvciBwcm9wb3NhbHMsIFByb3BlcnRpZXMgbWFwLCBTdHJpbmcga2V5LCBpbnQgbm9kZU9mZnNldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbikgewotCQlpZiAobWFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGVudGl0eVZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW1hZ2UgZW50aXR5SWNvbiA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5USVRZX1JFRkVSRU5DRSk7Ci0JCVN0cmluZyByZXBsYWNlbWVudFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUVudW1lcmF0aW9uIGtleXMgPSBtYXAua2V5cygpOwotCi0JCXdoaWxlIChrZXlzICE9IG51bGwgJiYga2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZW50aXR5TmFtZSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCWVudGl0eVZhbHVlID0gbWFwLmdldFByb3BlcnR5KGVudGl0eU5hbWUpOwotCQkJLy8gZmlsdGVyIGJhc2VkIG9uIHBhcnRpYWwgZW50aXR5IHN0cmluZy4uLgotCQkJaWYgKGVudGl0eU5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGtleS50b0xvd2VyQ2FzZSgpKSB8fCBrZXkudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQkvLyBmaWd1cmUgb3V0IHNlbGVjdGlvbi4uLmlmIHRleHQgaXMgc2VsZWN0ZWQsIGFkZCBpdCB0bwotCQkJCS8vIHNlbGVjdGlvbiBsZW5ndGgKLQkJCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gbm9kZU9mZnNldDsKLQkJCQlpZiAoZlRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25MZW5ndGggKz0gZlRleHRWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnk7Ci0JCQkJfQotCQkJCS8vIGNyZWF0ZSBhIG5ldyBwcm9wb3NhbCBmb3IgZW50aXR5IHN0cmluZy4uLgotCQkJCXJlcGxhY2VtZW50VGV4dCA9ICImIiArIGVudGl0eU5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlkaXNwbGF5U3RyaW5nID0gIiYiICsgZW50aXR5TmFtZSArICI7ICgiICsgZW50aXR5VmFsdWUgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBjcCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocmVwbGFjZW1lbnRUZXh0LCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgc2VsZWN0aW9uTGVuZ3RoLCByZXBsYWNlbWVudFRleHQubGVuZ3RoKCksIGVudGl0eUljb24sIGRpc3BsYXlTdHJpbmcsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VOVElUWSk7Ci0JCQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCQkJcHJvcG9zYWxzLmFkZChjcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUENEQVRBUHJvcG9zYWwoU3RyaW5nIG5vZGVOYW1lLCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IVtDREFUQVtdXT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCA5LCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTiksICJDREFUQSBTZWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQotCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwobm9kZU5hbWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBub2RlTmFtZS5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQpLCAiI1BDREFUQSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0RBVEEpOwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlOb2RlIGFOb2RlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJRG9jdW1lbnQgb3duaW5nRG9jdW1lbnQgPSBhTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCS8vID09PiAvLyBpbnQgeG1scGlOb2RlUG9zaXRpb24gPSAtMTsKLQotCQkvLyBtYWtlIHN1cmUgeG1scGkgaXMgcm9vdCBlbGVtZW50Ci0JCS8vIGRvbid0IHdhbnQgZG9jdHlwZSBwcm9wb3NhbCBpZiBYTUxQSSBpc24ndCBmaXJzdCBlbGVtZW50Li4uCi0JCU5vZGUgZmlyc3QgPSBvd25pbmdEb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWJvb2xlYW4geG1scGlJc0ZpcnN0RWxlbWVudCA9IChmaXJzdCAhPSBudWxsICYmIGZpcnN0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpOwotCQlib29sZWFuIGluc2VydERvY3R5cGUgPSB4bWxwaUlzRmlyc3RFbGVtZW50OwotCi0JCWZvciAoTm9kZSBjaGlsZCA9IG93bmluZ0RvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlib29sZWFuIHhtbHBpID0gKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInhtbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJeG1scGlGb3VuZCA9IHhtbHBpRm91bmQgfHwgeG1scGk7Ci0JCQlpZiAoeG1scGlGb3VuZCkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCS8vID09PiAvLyBpbnQgeG1scGlOb2RlUG9zaXRpb24gPQotCQkJCQkvLyAoKFhNTE5vZGUpY2hpbGQpLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCQkvLyBza2lwIHdoaXRlIHNwYWNlIGFuZCB0ZXh0Ci0JCQkJd2hpbGUgKChjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpICE9IG51bGwgJiYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKSB7Ci0JCQkJCS8vIGp1c3Qgc2tpcHBpbmcKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgaWYgdGhlcmVzIGEgbm9kZSBpbmJldHdlZW4gWE1MUEkgYW5kIGN1cnNvciBwb3NpdGlvbgotCQkJCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpID49ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSB8fCAheG1scGlJc0ZpcnN0RWxlbWVudCkgewotCQkJCQkJaW5zZXJ0RG9jdHlwZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHhtbHBpRm91bmQgJiYgb3duaW5nRG9jdW1lbnQuZ2V0RG9jdHlwZSgpID09IG51bGwgJiYgaXNDdXJzb3JBZnRlclhNTFBJKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSAmJiBpbnNlcnREb2N0eXBlKSB7Ci0JCQlhZGREb2NUeXBlUHJvcG9zYWwoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgYW4gdW5jbG9zZWQgc3RhcnQgdGFnCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnQ2xvc2VQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSAoZWxlbWVudERlY2wgIT0gbnVsbCkgPyBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlbGVtZW50RGVjbCkgOiBudWxsOwotCQkJaW50IGNvbnRlbnRUeXBlID0gKGVsZW1lbnREZWNsICE9IG51bGwpID8gZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA6IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJCS8vIGlmIGl0J3MgWE1MIGFuZCBjb250ZW50IGRvZXNuJ3QgSEFWRSB0byBiZSBlbGVtZW50LCBhZGQgIi8+IgotCQkJLy8gcHJvcG9zYWwuCi0JCQlib29sZWFuIGVuZFdpdGhTbGFzaEJyYWNrZXQgPSAoZ2V0WE1MKG5vZGUpICYmIGNvbnRlbnRUeXBlICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpOwotCi0JCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVsZW1lbnREZWNsKTsKLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCX0KLQotCQkJLy8gaXMgdGhlIHN0YXJ0IHRhZyBlbmRlZCBwcm9wZXJseT8KLQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpID09IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAmJiAhKG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkuaXNFbmRlZCgpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCS8vIElzIHRoaXMgc3VwcG9zZWQgdG8gYmUgYW4gZW1wdHkgdGFnPyBOb3RlIHRoYXQgaWYgd2UgY2FuJ3QKLQkJCQkvLyB0ZWxsLCB3ZSBhc3N1bWUgaXQncyBub3QuCi0JCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwgJiYgZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJCQkvLyBwcm9tcHQgd2l0aCBhIHNlbGYtY2xvc2luZyBlbmQgY2hhcmFjdGVyIGlmIG5lZWRlZAotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRTdGFydFRhZ0Nsb3NlKG5vZGUsIGVsZW1lbnREZWNsKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlIHRoZSBsZW5ndGggLS0KLQkJCQkJCQkJLy8gYWx3YXlzIGluc2VydAotCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkwLCBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCksIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfX18sIChuZXcgT2JqZWN0W117Z2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpfSkpLAotCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHByb21wdCB3aXRoIGEgY2xvc2UgZm9yIHRoZSBzdGFydCB0YWcKLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlIHRoZQotCQkJCQkJCQkvLyBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkwLCAxLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiAnPicifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCi0JCQkJCS8vIHByb21wdCB3aXRoIHRoZSBjbG9zZXIgZm9yIHRoZSBzdGFydCB0YWcgYW5kIGFuIGVuZCB0YWcKLQkJCQkJLy8gaWYgb25lIGlzIG5vdCBwcmVzZW50Ci0JCQkJCWlmIChub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJCS8vIG1ha2Ugc3VyZSB0YWcgbmFtZSBpcyBhY3R1YWxseSB3aGF0IGl0IHRoaW5rcyBpdAotCQkJCQkJLy8gaXMuLi4oZWcuIDwlQCB2cy4gPGpzcDpkaXJlY3RpdmUpCi0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkciA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlTdHJpbmcgb3BlbmluZ1RhZ1RleHQgPSAoc2RyICE9IG51bGwpID8gc2RyLmdldEZ1bGxUZXh0KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKG9wZW5pbmdUYWdUZXh0ICE9IG51bGwgJiYgb3BlbmluZ1RhZ1RleHQuaW5kZXhPZihub2RlLmdldE5vZGVOYW1lKCkpICE9IC0xKSB7Ci0JCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI+PC8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iLCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8KLQkJCQkJCQkJCQkvLyBpZ25vcmUgdGhlIGxlbmd0aCAtLSBhbHdheXMgaW5zZXJ0Ci0JCQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJCQkwLCAxLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX19fXywgKG5ldyBPYmplY3RbXXtub2RlLmdldE5vZGVOYW1lKCl9KSksCi0JCQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBwcm9tcHQgd2l0aCBzbGFzaCBicmFja2V0ICIvPiIgaW5jYXNlIGlmIGl0J3MgYSBzZWxmCi0JCQkJCS8vIGVuZGluZyB0YWcKLQkJCQkJaWYgKGVuZFdpdGhTbGFzaEJyYWNrZXQpIHsKLQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiLz4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlCi0JCQkJCQkJCQkvLyB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCQkwLCAyLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiBcIi8+XCIifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyArIDEpOyAvLyArMQotCQkJCQkJLy8gdG8KLQkJCQkJCS8vIGJyaW5nCi0JCQkJCQkvLyB0bwotCQkJCQkJLy8gdG9wCi0JCQkJCQkvLyBvZgotCQkJCQkJLy8gbGlzdAotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKSA9PSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAmJiAhbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCS8vIHByb21wdCB3aXRoIGEgY2xvc2luZyBlbmQgY2hhcmFjdGVyIGZvciB0aGUgZW5kIHRhZwotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0byBpZ25vcmUgdGhlCi0JCQkJCQkJLy8gbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCTAsIDEsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiICc+JyJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0NPTlRFWFQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlMaXN0IGNtbm9kZXMgPSBudWxsOwotCQlOb2RlIHBhcmVudCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpOwotCQlTdHJpbmcgZXJyb3IgPSBudWxsOwotCi0JCS8vIChuc2QpIFRoaXMgaXMgb25seSB2YWxpZCBhdCB0aGUgZG9jdW1lbnQgZWxlbWVudCBsZXZlbAotCQkvLyBvbmx5IHZhbGlkIGlmIGl0J3MgWE1MIChjaGVjayBhZGRlZCAyLzE3LzIwMDQpCi0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgKChJRE9NRG9jdW1lbnQpIHBhcmVudCkuaXNYTUxUeXBlKCkgJiYgIWlzQ3Vyc29yQWZ0ZXJYTUxQSShjb250ZW50QXNzaXN0UmVxdWVzdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBvbmx5IHdhbnQgcHJvcG9zYWxzIGlmIGN1cnNvciBpcyBhZnRlciBkb2N0eXBlLi4uCi0JCWlmICghaXNDdXJzb3JBZnRlckRvY3R5cGUoY29udGVudEFzc2lzdFJlcXVlc3QpKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gZml4IGZvciBtZXRhLWluZm8gY29tbWVudCBub2Rlcy4uIHRoZXkgY3VycmVudGx5ICJoaWRlIiBvdGhlcgotCQkvLyBwcm9wb3NhbHMgYmVjYXVzZSB0aGUgZG9uJ3QKLQkJLy8gaGF2ZSBhIGNvbnRlbnQgbW9kZWwgKHNvIGNhbid0IHByb3Bvc2UgYW55IGNoaWxkcmVuLi4pCi0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBpc0NvbW1lbnROb2RlKChJRE9NTm9kZSkgcGFyZW50KSkgewotCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlPwotCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIGlzQ29tbWVudE5vZGUoKElET01Ob2RlKSBwYXJlbnQpKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0JCQlpZiAocGFyZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJLy8gWFNELXNwZWNpZmljIGFiaWxpdHkgLSBubyBmaWx0ZXJpbmcKLQkJCQlDTURhdGFUeXBlIGNoaWxkVHlwZSA9IHBhcmVudERlY2wuZ2V0RGF0YVR5cGUoKTsKLQkJCQlpZiAoY2hpbGRUeXBlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gY2hpbGRTdHJpbmdzID0gY2hpbGRUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCQkJaWYgKGNoaWxkU3RyaW5ncyAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0aGUgY29udGVudCBzdHJpbmcgaXMgdGhlIHNvbGUgdmFsaWQgY2hpbGQuLi5zbwotCQkJCQkJLy8gcmVwbGFjZSB0aGUgcmVzdAotCQkJCQkJaW50IGJlZ2luID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCWlmICgoKElET01Ob2RlKSBwYXJlbnQpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSAoKElET01Ob2RlKSBwYXJlbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkJCQkJYmVnaW4gPSAoKElET01Ob2RlKSBwYXJlbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJCWxlbmd0aCA9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgLSBiZWdpbjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8ocGFyZW50RGVjbCwgY2hpbGRUeXBlKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHRleHRQcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoY2hpbGRTdHJpbmdzW2ldLCBiZWdpbiwgbGVuZ3RoLCBjaGlsZFN0cmluZ3NbaV0ubGVuZ3RoKCksIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5VTSksIGNoaWxkU3RyaW5nc1tpXSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfSU5TRVJUSU9OKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbCh0ZXh0UHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBhcmVudERlY2wgIT0gbnVsbCAmJiBwYXJlbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB7Ci0JCQkJYWRkUENEQVRBUHJvcG9zYWwocGFyZW50RGVjbC5nZXROb2RlTmFtZSgpLCBjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhbGwgcG9zc2libGUgY2hpbGRyZW4gd2l0aGluIHRoaXMgcGFyZW50IGNvbnRleHQKLQkJCQljbW5vZGVzID0gZ2V0QXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KXBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIHRoZSBwb3NzaWJsZSBjaGlsZHJlbiB3aXRoaW4gdGhpcyBwYXJlbnQgY29udGV4dCBhbmQgYXQgdGhpcyBpbmRleAotICAgICAgICAgICAgICAgIExpc3Qgc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVC5lcXVhbHMoWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWSkpKSAKLSAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMgPSBnZXRWYWxpZENoaWxkRWxlbWVudERlY2xhcmF0aW9ucygoRWxlbWVudClwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotIAkJCQlJdGVyYXRvciBub2RlSXRlcmF0b3IgPSBjbW5vZGVzLml0ZXJhdG9yKCk7Ci0JCQkJaWYgKCFub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWlmIChnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpICE9IG51bGwpCi0JCQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX0hhc19ub19hdmFpbGFibGVfY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWVycm9yID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbGVtZW50X19pc191bmtub3duLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJCX0KLQkJCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJCS8vIGNob3Agb2ZmIGFueSBsZWFkaW5nIDwncyBhbmQgd2hpdGVzcGFjZSBmcm9tIHRoZQotCQkJCS8vIG1hdGNoc3RyaW5nCi0JCQkJd2hpbGUgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDApICYmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1hdGNoU3RyaW5nLmNoYXJBdCgwKSkgfHwgYmVnaW5zV2l0aChtYXRjaFN0cmluZywgIjwiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQltYXRjaFN0cmluZyA9IG1hdGNoU3RyaW5nLnN1YnN0cmluZygxKTsKLQkJCQl3aGlsZSAobm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbyA9IG5vZGVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBvOwotCQkJCQkJLy8gb25seSBhZGQgcHJvcG9zYWxzIGZvciB0aGUgY2hpbGQgZWxlbWVudCdzIHRoYXQKLQkJCQkJCS8vIGJlZ2luIHdpdGggdGhlIG1hdGNoc3RyaW5nCi0JCQkJCQlTdHJpbmcgdGFnbmFtZSA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTdHJpY3RDTU5vZGVTdWdnZXN0aW9uID0gc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMgIT0gbnVsbCA/IHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zLmNvbnRhaW5zKGVsZW1lbnREZWNsKSA6IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVsZW1lbnREZWNsKTsKLSAgCi0JCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlID0gaXNTdHJpY3RDTU5vZGVTdWdnZXN0aW9uID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkgICAgICAgICAgICBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDX0VNUEhBU0laRUQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDX0RFRU1QSEFTSVpFRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCX0KLQotCQkJCQkJLy9pbnQgbWFya3VwQWRqdXN0bWVudCA9IGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRNaW5pbWFsU3RhcnRUYWdMZW5ndGgocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQlpZiAoYmVnaW5zV2l0aCh0YWduYW1lLCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KHBhcmVudCwgZWxlbWVudERlY2wpOwotCQkJCQkJCQotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgxMQotCQkJCQkJCS8vIHBsYWNlIGN1cnNvciBpbiBmaXJzdCBlbXB0eSBxdW90ZXMKLQkJCQkJCQlpbnQgbWFya3VwQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0JCQkJCQkJCi0JCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKHBhcmVudERlY2wsIGVsZW1lbnREZWNsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVsZXZhbmNlID0gaXNTdHJpY3RDTU5vZGVTdWdnZXN0aW9uID8gWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfU1RSSUNUTFlfVkFMSURfVEFHX0lOU0VSVElPTiA6IFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT047IAotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbWFya3VwQWRqdXN0bWVudCwgaW1hZ2UsIHRhZ25hbWUsIG51bGwsIHByb3Bvc2VkSW5mbywgcmVsZXZhbmNlKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCWlmIChlcnJvciAhPSBudWxsKQotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCQkJZWxzZSBpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKSAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuTm9fa25vd25fY2hpbGRfdGFnLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpfSkpKTsKLQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJObyBrbm93biBjaGlsZCB0YWcgbmFtZXMgb2YgPHswfT4gYmVnaW4gd2l0aCBcInsxfVwiLiIKLQkJCQkJZWxzZQotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCS8vIENhbiBvbmx5IHByb21wdCB3aXRoIGVsZW1lbnRzIGlmIHRoZSBjdXJzb3IgcG9zaXRpb24gaXMgcGFzdAotCQkJLy8gdGhlIFhNTCBwcm9jZXNzaW5nCi0JCQkvLyBpbnN0cnVjdGlvbiBhbmQgRE9DVFlQRSBkZWNsYXJhdGlvbgotCQkJYm9vbGVhbiB4bWxwaUZvdW5kID0gZmFsc2U7Ci0JCQlib29sZWFuIGRvY3R5cGVGb3VuZCA9IGZhbHNlOwotCQkJaW50IG1pbmltdW1PZmZzZXQgPSAtMTsKLQotCQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0KLQkJCQlib29sZWFuIHhtbHBpID0gKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInhtbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJvb2xlYW4gZG9jdHlwZSA9IGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU7Ci0JCQkJaWYgKHhtbHBpIHx8IGRvY3R5cGUgJiYgbWluaW11bU9mZnNldCA8IDApCi0JCQkJCW1pbmltdW1PZmZzZXQgPSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgKChJRE9NTm9kZSkgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpOwotCQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJCWRvY3R5cGVGb3VuZCA9IGRvY3R5cGVGb3VuZCB8fCBkb2N0eXBlOwotCQkJfQotCi0JCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0gbWluaW11bU9mZnNldCkgewotCQkJCUxpc3QgY2hpbGREZWNscyA9IGdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbigoRG9jdW1lbnQpIHBhcmVudCwgY2hpbGRQb3NpdGlvbik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZERlY2xzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjaGlsZERlY2xzLmdldChpKTsKLQkJCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWQpOwotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkVGV4dChwYXJlbnQsIGVkKTsKLQkJCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpOwotCQkJCQkJLy8gYWNjb3VudCBmb3IgdGhlICZsdDsgYW5kICZndDsKLQkJCQkJCWludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChwYXJlbnQsIGVkKTsKLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlZCk7Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIG1hcmt1cEFkanVzdG1lbnQsIGltYWdlLCB0YWduYW1lLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT04pOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJTGlzdCBjbW5vZGVzID0gbnVsbDsKLQkJTm9kZSBwYXJlbnQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQlTdHJpbmcgZXJyb3IgPSBudWxsOwotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JCQkvL3ZhbGlkQWN0aW9ucyA9IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleCgoRWxlbWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCWNtbm9kZXMgPSBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoKEVsZW1lbnQpcGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCk7Ci0JCQlJdGVyYXRvciBub2RlSXRlcmF0b3IgPSBjbW5vZGVzLml0ZXJhdG9yKCk7Ci0JCQkvLyBjaG9wIG9mZiBhbnkgbGVhZGluZyA8J3MgYW5kIHdoaXRlc3BhY2UgZnJvbSB0aGUgbWF0Y2hzdHJpbmcKLQkJCXdoaWxlICgobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKSAmJiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtYXRjaFN0cmluZy5jaGFyQXQoMCkpIHx8IGJlZ2luc1dpdGgobWF0Y2hTdHJpbmcsICI8IikpKSAvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQkJaWYgKCFub2RlSXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCWVycm9yID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5fX0hhc19ub19rbm93bl9jaGlsZCwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCXdoaWxlIChub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJQ01Ob2RlIGVsZW1lbnREZWNsID0gKENNTm9kZSkgbm9kZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCQkvLyBvbmx5IGFkZCBwcm9wb3NhbHMgZm9yIHRoZSBjaGlsZCBlbGVtZW50J3MgdGhhdCBiZWdpbgotCQkJCQkvLyB3aXRoIHRoZSBtYXRjaHN0cmluZwotCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gbnVsbDsKLQkJCQkJaW50IGN1cnNvckFkanVzdG1lbnQgPSAwOwotCi0JCQkJCS8vIGRvIGEgY2hlY2sgdG8gc2VlIGlmIHBhcnRpYWwgYXR0cmlidXRlcyBvZiBwYXJ0aWFsIHRhZwotCQkJCQkvLyBuYW1lcyBhcmUgaW4gbGlzdAotCQkJCQlpZiAoKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsICYmIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpID4gMCAmJiBhdHRyaWJ1dGVJbkxpc3Qobm9kZSwgcGFyZW50LCBlbGVtZW50RGVjbCkpIHx8ICgobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSAmJiBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSkgewotCi0JCQkJCQlwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpOwotCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKTsKLQkJCQkJCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnREZWNsOwotCQkJCQkJCWlmIChlZC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSB7Ci0JCQkJCQkJCXByb3Bvc2VkVGV4dCArPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShwYXJlbnQsIGVkKTsKLQkJCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgxMQotCQkJCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhwYXJlbnQsIGVkLCBzYik7Ci0JCQkJCQkJCS8vIHNpbmNlIGl0J3MgYSBuYW1lIHByb3Bvc2FsLCBhc3N1bWUgJzwnIGlzIGFscmVhZHkgdGhlcmUKLQkJCQkJCQkJLy8gb25seSByZXR1cm4gdGhlIHJlc3Qgb2YgdGhlIHRhZwotCQkJCQkJCQlwcm9wb3NlZFRleHQgPSBzYi50b1N0cmluZygpLnN1YnN0cmluZygxKTsKLQkJCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0JCQkJCQkJCQotCQkJCQkJCQkvL2N1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxOwotCQkJCQkJCQkvL3Byb3Bvc2VkVGV4dCArPSAiPjwvIiArIGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKSArICI+IjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGJlZ2luc1dpdGgocHJvcG9zZWRUZXh0LCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCksIGVsZW1lbnREZWNsKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgY3Vyc29yQWRqdXN0bWVudCwgaW1hZ2UsIGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfTkFNRSk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID09IDApIHsKLQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCQllbHNlIGlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpICE9IG51bGwgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApCi0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2NoaWxkX3RhZ19uYW1lcywgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKX0pKSk7Ci0JCQkJLy8kTk9OLU5MUy0xJCA9ICJObyBrbm93biBjaGlsZCB0YWcgbmFtZXMgb2YgPHswfT4gYmVnaW4gd2l0aCBcInsxfVwiIgotCQkJCWVsc2UKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJTGlzdCBjaGlsZEVsZW1lbnRzID0gZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKChEb2N1bWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUNNTm9kZSBlZCA9IChDTU5vZGUpIGNoaWxkRWxlbWVudHMuZ2V0KGkpOwotCQkJCWlmIChlZCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gbnVsbDsKLQkJCQlpbnQgY3Vyc29yQWRqdXN0bWVudCA9IDA7Ci0JCQkJaWYoZWQgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkvLyBwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlZCk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudCwgKENNRWxlbWVudERlY2xhcmF0aW9uKWVkLCBzYik7Ci0JCQkJCS8vIHRhZyBzdGFydHMgdy8gJzwnLCBidXQgd2Ugd2FudCB0byBjb21wYXJlIHRvIG5hbWUKLQkJCQkJcHJvcG9zZWRUZXh0ID0gc2IudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQotCQkJCQlpZiAoIWJlZ2luc1dpdGgocHJvcG9zZWRUZXh0LCBtYXRjaFN0cmluZykpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJCi0JCQkJCWN1cnNvckFkanVzdG1lbnQgPSBnZXRDdXJzb3JQb3NpdGlvbkZvclByb3Bvc2VkVGV4dChwcm9wb3NlZFRleHQpOwotCQkJCQotCQkJCQlpZiAoZWQgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVkOwotCQkJCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpIHsKLQkJCQkJCQlwcm9wb3NlZFRleHQgKz0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2UocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQotCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCX0KLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBjdXJzb3JBZGp1c3RtZW50LCBpbWFnZSwgZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiB0aGlzIGlzIHRoZSBwb3NpdGlvbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBpbiBhZnRlciB0aGUgcHJvcG9zYWwgaXMgYXBwbGllZAotCSAqIEBwYXJhbSBwcm9wb3NlZFRleHQKLQkgKiBAcmV0dXJuICB0aGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgYmUgaW4gYWZ0ZXIgdGhlIHByb3Bvc2FsIGlzIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRDdXJzb3JQb3NpdGlvbkZvclByb3Bvc2VkVGV4dChTdHJpbmcgcHJvcG9zZWRUZXh0KSB7Ci0JCWludCBjdXJzb3JBZGp1c3RtZW50OwotCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0LmluZGV4T2YoIlwiXCIiKSArIDE7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb3RoZXJ3aXNlLCBhZnRlciB0aGUgZmlyc3QgdGFnCi0JCWlmKGN1cnNvckFkanVzdG1lbnQ9PTApCi0JCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0LmluZGV4T2YoJz4nKSArIDE7Ci0JCWlmKGN1cnNvckFkanVzdG1lbnQ9PTApCi0JCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMTsKLQkJCi0JCXJldHVybiBjdXJzb3JBZGp1c3RtZW50OwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFhNTCBwcm9wb3NhbCBpcyBhZGRlZCB2aWEgeG1sIGRlY2xhcmF0aW9uIHRlbXBsYXRlIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYTUxQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0VXNlclByZWZlcnJlZENoYXJzZXROYW1lKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpICsgIlwiPz4iOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBwcm9wb3NlZFRleHQubGVuZ3RoKCksIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPQ0VTU0lOR0lOU1RSVUNUSU9OKSwgcHJvcG9zZWRUZXh0LCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfREVDTEFSQVRJT04pOwotCQkvLyBUT0RPIGFkZCBzcGVjaWFsIFhNTCBwcm9wb3NhbCBpbmZvCi0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIGlmIGFueSBvZiB0aGUgYXR0cmlidXRlcyBpbiB0aGUgcHJvcG9zZWQgWE1MTm9kZQotCSAqIG5vZGUsIGFyZSBwb3NzaWJsZSB2YWx1ZXMgb2YgYXR0cmlidXRlcyBmcm9tIHBvc3NpYmxlIEVsZW1lbnRzIGF0IHRoaXMKLQkgKiBwb2ludCBpbiB0aGUgZG9jdW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBDb250ZW50IE1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB3aXRoIGF0dHJpYnV0ZXMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB0ZXN0IGlmCi0JICogICAgICAgICAgICBhcmUgcG9zc2libGUgZm9yIHBvc3NpYmxlIEVsZW1lbnRzIGF0IHRoaXMgcG9pbnQKLQkgKiBAcGFyYW0gY21ub2RlCi0JICogICAgICAgICAgICBwb3NzaWJsZSBlbGVtZW50IGF0IHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IChkZXBlbmRpbmcgb24KLQkgKiAgICAgICAgICAgIHdoYXQgJ25vZGUnIGlzKSB0cnVlIGlmIGFueSBhdHRyaWJ1dGVzIG9mICdub2RlJyBtYXRjaCBhbnkKLQkgKiAgICAgICAgICAgIHBvc3NpYmxlIGF0dHJpYnV0ZXMgZnJvbSAnY21ub2RlcycgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdHRyaWJ1dGVJbkxpc3QoSURPTU5vZGUgbm9kZSwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBwYXJlbnQgPT0gbnVsbCB8fCBjbW5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGVsZW1lbnRNYXRjaFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIGNtbm9kZU5hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBjbW5vZGUpOy8vIGNtbm9kZS5nZXROb2RlTmFtZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCU5hbWVkTm9kZU1hcCBtYXAgPSAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZXMoKTsKLQkJCVN0cmluZyBhdHRyTWF0Y2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJQ01OYW1lZE5vZGVNYXAgY21hdHRyTWFwID0gbnVsbDsKLQkJCS8vIGl0ZXJhdGUgYXR0cmlidXRlIHBvc3NpYmlsaXRpZXMgZm9yIHBhcnRpYWxseSBzdGFydGVkIG5vZGUKLQkJCWZvciAoaW50IGkgPSAwOyBtYXAgIT0gbnVsbCAmJiBpIDwgbWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlhdHRyTWF0Y2hTdHJpbmcgPSBtYXAuaXRlbShpKS5nZXROb2RlTmFtZSgpOwotCQkJCS8vIGZpbHRlciBvbiB3aGF0ZXZlciB1c2VyIHR5cGVkIGZvciBlbGVtZW50IG5hbWUgYWxyZWFkeQotCQkJCWlmIChiZWdpbnNXaXRoKGNtbm9kZU5hbWUsIGVsZW1lbnRNYXRjaFN0cmluZykpIHsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQljbWF0dHJNYXAgPSAoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW5vZGUpLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCS8vIGl0ZXJhdGUgcG9zc2libGUgYXR0cmlidXRlcyBmcm9tIGEgY21ub2RlIGluCi0JCQkJCQkvLyBwcm9wb3NhbCBsaXN0Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgY21hdHRyTWFwICE9IG51bGwgJiYgayA8IGNtYXR0ck1hcC5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgbmFtZSBtYXRjaGVzCi0JCQkJCQkJaWYgKGNtYXR0ck1hcC5pdGVtKGspLmdldE5vZGVOYW1lKCkuZXF1YWxzKGF0dHJNYXRjaFN0cmluZykpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChhU3RyaW5nID09IG51bGwgfHwgcHJlZml4ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gKHBhKSBtYXRjaGluZyBpbmRlcGVuZGVudCBvZiBjYXNlIHRvIGJlIGNvbnNpc3RhbnQgd2l0aCBKYXZhCi0JCS8vIGVkaXRvciBDQQotCQlyZXR1cm4gYVN0cmluZy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZml4LnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChkb2N1bWVudFBvc2l0aW9uIDwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCS8vIHNldHVwIHRvIGluc2VydCBuZXcgYXR0cmlidXRlcwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTZXR1cCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBuYW1lCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50TGVuZ3RoKDApOwotCQlpZiAobm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwgJiYgKCFub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSkgewotCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSAmJiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpICE9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJLy8gc2V0dXAgdG8gYWRkIGEgbmV3IGF0dHJpYnV0ZSBhdCB0aGUgZG9jdW1lbnRQb3NpdGlvbgotCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQlpZiAoYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwgJiYgIWFjdHVhbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpIHsKLQkJCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZXR1cCB0byByZXBsYWNlIHRoZSBleGlzdGluZyB2YWx1ZQotCQkJaWYgKCFub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkgJiYgZG9jdW1lbnRQb3NpdGlvbiA8IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSB7Ci0JCQkJLy8gaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXNuJ3QgY2xvc2VkIGFuZCB0aGUKLQkJCQkvLyBjdXJzb3IgaXMgaW4gZnJvbnQgb2YgdGhlIHZhbHVlLCBhZGQKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCi0JCS8vIEhhbmRsZSB0aGUgbW9zdCBjb21tb24gYW5kIGJlc3Qgc3VwcG9ydGVkIGNhc2VzCi0JCWlmICh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVUYWdPcGVuUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlVGFnTmFtZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVFcXVhbHNQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiBkb2N1bWVudFBvc2l0aW9uID09IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoKSAmJiAoc2RSZWdpb24uZ2V0VGV4dChjb21wbGV0aW9uUmVnaW9uKS5lbmRzV2l0aCgiXCIiKSB8fCBzZFJlZ2lvbi5nZXRUZXh0KGNvbXBsZXRpb25SZWdpb24pLmVuZHNXaXRoKCJcJyIpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl7Ci0JCQkJLy8gdGhpcyBpcyBmb3Igd2hlbiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGNsb3NpbmcKLQkJCQkvLyBxdW90ZSBmb3IgYW4gYXR0cmlidXRlLi4KLQkJCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSB4bWxub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9DTE9TRSkpKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlVGFnQ2xvc2VQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlRW5kVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUEVfUkVGRVJFTkNFKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQ29udGVudFByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCi0JCQkvLyBUaGVzZSBJVGV4dFJlZ2lvbiB0eXBlcyBiZWdpbiBET00gRWxlbWVudHMgYXMgd2VsbCBhbmQgYWx0aG91Z2gKLQkJCS8vIGludGVybmFsbHkgaGFyZGVyIHRvIGFzc2lzdCwKLQkJCS8vIHRleHQgaW5zZXJ0aW9ucyBkaXJlY3RseSBiZWZvcmUgdGhlbSBjYW4gYmUgbWFkZQotCQkJZWxzZSBpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSAmJiAocmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ09NTUVOVF9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KHRyZWVOb2RlKSk7Ci0JCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQkJLy8gTm90IGEgRG9jdW1lbnQgb3IgRWxlbWVudD8gKG9kZCBjYXNlcyBnbyBoZXJlIGZvciBub3cpCi0JCWVsc2UgaWYgKGlzQ2xvc2VSZWdpb24oY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QodHJlZU5vZGUsIHhtbG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpCi0JCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KHRyZWVOb2RlKSArIDEpOwotCQl9Ci0JCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgJiYgKHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NPTU1FTlRfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfU0NSSVBUTEVUX09QRU4pIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkodHJlZU5vZGUpKTsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBDT05URU5UIEFTU0lTVCBTVEFSVFMgSEVSRQotCSAqIAotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uIC0KLQkgKiAgICAgICAgICAgIHRoZSBjdXJzb3IgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIAotCSAqIGFuIGFycmF5IG9mIElDb21wbGV0aW9uUHJvcG9zYWxzCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlmVGV4dFZpZXdlciA9IHRleHRWaWV3ZXI7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIHRyZWVOb2RlOwotCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKQotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlJRE9NTm9kZSB4bWxub2RlID0gKElET01Ob2RlKSBub2RlOwotCi0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihkb2N1bWVudFBvc2l0aW9uLCBub2RlKTsKLQotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBnZXRNYXRjaFN0cmluZyhzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gSGFuZGxlIGVtcHR5IERvY3VtZW50cwotCQlpZiAoY29tcGxldGlvblJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAoKCh0cmVlTm9kZSA9PSBudWxsKSB8fCAoKE5vZGUpIHRyZWVOb2RlKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgY29tcGxldGlvblJlZ2lvbiA9PSBudWxsICYmICh4bWxub2RlID09IG51bGwgfHwgeG1sbm9kZS5nZXRDaGlsZE5vZGVzKCkgPT0gbnVsbCB8fCB4bWxub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJSURPTURvY3VtZW50IGRvY05vZGUgPSAoKElET01Nb2RlbCkgc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChkb2NOb2RlLCBkb2NOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbnVsbCk7Ci0JCQkJCQlhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInByb2JsZW0gZ2V0dGluZyBtb2RlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJfQotCQkJCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCQl9Ci0JCQkvLyBNQVNTSVZFIEVSUk9SIENPTkRJVElPTgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21wbGV0aW9uIHJlZ2lvbiB3YXMgbnVsbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0RXJyb3JNZXNzYWdlKElOVEVSTkFMRVJST1IpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCgoTm9kZSkgdHJlZU5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Q29tcGxldGlvblByb3Bvc2FscygpOwotCQl9Ci0KLQotCQkvLyBjYXRjaCBkb2N1bWVudHMgd2hlcmUgbm8gcmVnaW9uIGNhbiBiZSBkZXRlcm1pbmVkCi0JCWlmICh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFICYmIChjb21wbGV0aW9uUmVnaW9uID09IG51bGwgfHwgeG1sbm9kZS5nZXRDaGlsZE5vZGVzKCkgPT0gbnVsbCB8fCB4bWxub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlU3RhcnREb2N1bWVudFByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgKElET01Ob2RlKSB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Q29tcGxldGlvblByb3Bvc2FscygpOwotCQl9Ci0KLQkJLy8gY29tcHV0ZSBub3JtYWwgcHJvcG9zYWxzCi0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIChJRE9NTm9kZSkgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCgoTm9kZSkgdHJlZU5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVTktOT1dOX0NPTlRFWFQgKyAiICIgKyBjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSArICJAIiArIGRvY3VtZW50UG9zaXRpb24pOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID09IDApCi0JCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9DT05URVhUKTsKLQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Q29tcGxldGlvblByb3Bvc2FscygpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29udGVudFByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCi0JCS8vIHNldHVwIHRvIGFkZCBjaGlsZHJlbiBhdCB0aGUgY29udGVudCBub2RlJ3MgcG9zaXRpb24KLQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKSwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgKChEb2N1bWVudCkgbm9kZSkuZ2V0RG9jdHlwZSgpID09IG51bGwpCi0JCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJfQotCQkvLyBlbnRpdGllcz8KLQkJYWRkRW50aXR5UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlKTsKLQkJLy8gYWRkRW50aXR5UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwb3NzaWJsZQotCSAqICAgICAgICAgICAgY29udGV4dHMgYW4gYXJyYXkgb2YgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCWlmIChmQXR0cmlidXRlSW5mb1Byb3ZpZGVyID09IG51bGwpCi0JCQlmQXR0cmlidXRlSW5mb1Byb3ZpZGVyID0gbmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyKChJU3RydWN0dXJlZERvY3VtZW50KSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKSwgKEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcikgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkpOwotCQlyZXR1cm4gZkF0dHJpYnV0ZUluZm9Qcm92aWRlci5nZXRBdHRyaWJ1dGVJbmZvcm1hdGlvbihkb2N1bWVudE9mZnNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWludCBjb21wbGV0aW9uUmVnaW9uU3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJaW50IGNvbXBsZXRpb25SZWdpb25MZW5ndGggPSBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uQXRDb21wbGV0aW9uT2Zmc2V0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChjb21wbGV0aW9uUmVnaW9uU3RhcnQgKyBjb21wbGV0aW9uUmVnaW9uTGVuZ3RoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uQXRFbmRPZkNvbXBsZXRpb24gPSBzZFJlZ2lvbkF0Q29tcGxldGlvbk9mZnNldC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChjb21wbGV0aW9uUmVnaW9uU3RhcnQgKyBjb21wbGV0aW9uUmVnaW9uTGVuZ3RoKTsKLQotCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiAhPSBjb21wbGV0aW9uUmVnaW9uU3RhcnQgJiYgcmVnaW9uQXRFbmRPZkNvbXBsZXRpb24gIT0gbnVsbCAmJiByZWdpb25BdEVuZE9mQ29tcGxldGlvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSByZWdpb25BdEVuZE9mQ29tcGxldGlvbjsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIG5hbWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gc2RSZWdpb24pIHsKLQkJCQkvLyBhYm5vcm1hbCBjYXNlLCB0aGlzIHVubWF0Y2hlZCBlbmQgdGFnIHdpbGwgYmUgYSBzaWJsaW5nCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGVBdE9mZnNldC5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBub3JtYWwgY2FzZSwgdGhpcyBlbmQgdGFnIGlzIHRoZSBwYXJlbnQKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZUF0T2Zmc2V0LCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJfQotCQl9Ci0JCS8vIGlmIChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsKLQkJLy8gY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpCi0JCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCS8vIGVsc2UKLQkJaWYgKGNvbXBsZXRpb25SZWdpb25TdGFydCA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyBwb3NpdGlvbmVkIGF0IHN0YXJ0IG9mIGVuZCB0YWcKLQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gYWxsIHBvc3NpYmxlIEVudGl0eVJlZmVyZW5jZVByb3Bvc2FscyAoYWNjb3JkaW5nIHRvIGN1cnJlbnQKLQkgKiBwb3NpdGlvbiBpbiBkb2MpCi0JICovCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSkgewotCQkvLyBvbmx5IGhhbmRsZSBYTUwgY29udGVudCBmb3Igbm93Ci0JCVZlY3RvciBwcm9wb3NhbHMgPSBuZXcgVmVjdG9yKCk7IC8vIElDb21wbGV0aW9uUHJvcG9zYWxzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChjb21wbGV0aW9uUmVnaW9uICE9IG51bGwgJiYgY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJaW50IG5vZGVPZmZzZXQgPSBkb2N1bWVudFBvc2l0aW9uIC0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbik7Ci0JCQlTdHJpbmcgcmVnaW9uVGV4dCA9IHNkUmVnaW9uLmdldEZ1bGxUZXh0KGNvbXBsZXRpb25SZWdpb24pOwotCi0JCQkvLyBpZiBkaXJlY3RseSB0byB0aGUgcmlnaHQgb2YgYSAmLCByZWdpb24gd2lsbCBiZSBudWxsLCBuZWVkIHRvCi0JCQkvLyBtb3ZlIHRvCi0JCQkvLyB0aGUgcHJldmlvdXMgcmVnaW9uLi4udGhlcmUgbWlnaHQgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMKLQkJCWlmIChyZWdpb25UZXh0ICE9IG51bGwgJiYgcmVnaW9uVGV4dC50cmltKCkuZXF1YWxzKCIiKSAmJiBkb2N1bWVudFBvc2l0aW9uID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gdHJlZU5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXRGdWxsVGV4dCgpLnRyaW0oKS5lcXVhbHMoIiYiKSkgeyAvLyROT04tTkxTLTEkCQkKLQkJCQkJY29tcGxldGlvblJlZ2lvbiA9IHByZXY7Ci0JCQkJCXJlZ2lvblRleHQgPSBwcmV2LmdldEZ1bGxUZXh0KCk7Ci0JCQkJCW5vZGVPZmZzZXQgPSAxOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc3RyaW5nIG11c3Qgc3RhcnQgdy8gJgotCQkJaWYgKHJlZ2lvblRleHQgIT0gbnVsbCAmJiByZWdpb25UZXh0LnN0YXJ0c1dpdGgoIiYiKSkgeyAvLyROT04tTkxTLTEkCQkJCQkJIAkJCi0JCQkJU3RyaW5nIGtleSA9IChub2RlT2Zmc2V0ID4gMCkgPyByZWdpb25UZXh0LnN1YnN0cmluZygxLCBub2RlT2Zmc2V0KSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBnZXQgZW50aXR5IHByb3Bvc2FscywgcGFzc2luZyBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhcnQKLQkJCQkvLyBzdHJpbmcKLQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKE5vZGUpIHRyZWVOb2RlKS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgeG1sRG9jID0gbXEuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQodHJlZU5vZGUpOwotCQkJCQlDTU5hbWVkTm9kZU1hcCBjbW1hcCA9IG51bGw7Ci0JCQkJCVByb3BlcnRpZXMgZW50aXRpZXMgPSBudWxsOwotCQkJCQlpZiAoeG1sRG9jICE9IG51bGwpIHsKLQkJCQkJCWNtbWFwID0geG1sRG9jLmdldEVudGl0aWVzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNtbWFwICE9IG51bGwpIHsKLQkJCQkJCWVudGl0aWVzID0gbWFwVG9Qcm9wZXJ0aWVzKGNtbWFwKTsKLQkJCQkJfQotCQkJCQllbHNlIC8vIDIyNDc4NyBpbiBhYnNlbmNlIG9mIGNvbnRlbnQgbW9kZWwsIGp1c3QgdXNlCi0JCQkJCS8vIG1pbmltYWwgNSBlbnRpdGllcwotCQkJCQl7Ci0JCQkJCQllbnRpdGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCQllbnRpdGllcy5wdXQoInF1b3QiLCAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImFwb3MiLCAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiYW1wIiwgIiYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImx0IiwgIjwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImd0IiwgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJCQkJZW50aXRpZXMucHV0KCJuYnNwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCQkJCi0JCQkJCX0KLQkJCQkJYWRkRW50aXR5UHJvcG9zYWxzKHByb3Bvc2FscywgZW50aXRpZXMsIGtleSwgbm9kZU9mZnNldCwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSAoKHByb3Bvc2Fscy5zaXplKCkgPiAwKSA/IHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKSA6IG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlRXF1YWxzUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsICYmIHZhbHVlUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyByZXBsYWNlIHRoZSBhZGphY2VudCBhdHRyaWJ1dGUgdmFsdWUKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgdmFsdWVSZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhcHBlbmQgYW4gYXR0cmlidXRlIHZhbHVlIGFmdGVyIHRoZSAnPScKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlU3RhcnREb2N1bWVudFByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJLy8gc2V0dXAgZm9yIGEgbm9uLWVtcHR5IGRvY3VtZW50LCBidXQgb25lIHRoYXQgaGFzbid0IGJlZW4gZm9ybWFsbHkKLQkJLy8gc3RhcnRlZAotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiksIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ0Nsb3NlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB8fCAoZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSkpIHsKLQkJCS8vIHRoaXMgaXMgYSBjb250ZW50IHJlcXVlc3QgYXMgdGhlIGRvY3VtZW50UG9zaXRpb24gaXMgQUZURVIgdGhlCi0JCQkvLyBlbmQgb2YgdGhlIGNsb3NpbmcgcmVnaW9uCi0JCQlpZiAobm9kZSA9PSBub2RlQXRPZmZzZXQgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFnJ3MgY2xvc2Ugb3Igd2l0aGluIGl0Ci0JCQlJVGV4dFJlZ2lvbiBjbG9zZVJlZ2lvbiA9IHNkUmVnaW9uLmdldExhc3RSZWdpb24oKTsKLQkJCWJvb2xlYW4gaW5zaWRlVGFnID0gIXNkUmVnaW9uLmlzRW5kZWQoKSB8fCBkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNsb3NlUmVnaW9uKTsKLQkJCWlmIChpbnNpZGVUYWcpIHsKLQkJCQkvLyB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgY29tcGxldGlvbnMgd2l0aGluIGEgdGFnCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQl9Ci0JCQkJaWYgKHNkUmVnaW9uID09IG5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRMZW5ndGgoMCk7Ci0JCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdOYW1lUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJaWYgKHNkUmVnaW9uICE9IG5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQkvLyBjb21wbGV0aW5nIHRoZSAqZmlyc3QqIHRhZyBpbiAiPHRhZ25hbWUxIHw8dGFnbmFtZTIiCi0JCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQlpZiAoYWN0dWFsTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFjdHVhbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzZFJlZ2lvbikgewotCQkJCQkvLyBzdGFydCB0YWcKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCS8vIGl0J3MgYXR0cmlidXRlcwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiAtIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgLSAxKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSAtIDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikKLQkJCQkJCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGl0J3MgbmFtZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24gLSBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkoYWN0dWFsTm9kZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCS8vIGluc2VydCBuYW1lCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcmVwbGFjZSBuYW1lCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJYWRkRW5kVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCQkJLy8gdW5jbG9zZWQgdGFnIHdpdGggb25seSBhIG5hbWU7IHNob3VsZCBwcm9tcHQgZm9yIGF0dHJpYnV0ZXMKLQkJCQkvLyBhbmQgYSBjbG9zZSBpbnN0ZWFkCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCkuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGRvY3VtZW50UG9zaXRpb24gLSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlLCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCByZXBsYWNlTGVuZ3RoLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJaWYgKGFjdHVhbE5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCQlhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdPcGVuUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChzZFJlZ2lvbiAhPSBub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJLy8gY29tcGxldGluZyB0aGUgKmZpcnN0KiBYTUxfVEFHX09QRU4gaW4gIjw8dGFnbmFtZSIKLQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCWlmIChhY3R1YWxOb2RlICE9IG51bGwpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkoYWN0dWFsTm9kZSkpOwotCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7IC8vIChwYSkgMjIwODUwCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIGFuIGV4aXN0aW5nIHRhZywgcmlnaHQgYmVmb3JlIHRoZSAnPCcKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJLy8gYXQgdGhlIG9wZW5pbmcgb2YgdGhlIFZFUlkgZmlyc3QgdGFnIHdpdGggYSAnPCcKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdpdGhpbiB0aGUgd2hpdGUgc3BhY2UKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gZ2V0TmFtZVJlZ2lvbihub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJCS8vIChwYSkgSVRleHRSZWdpb24gcmVmYWN0b3IKLQkJCQkvLyBpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuY29udGFpbnNPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikpCi0JCQkJLy8gewotCQkJCWlmIChuYW1lICE9IG51bGwgJiYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpIDw9IGRvY3VtZW50UG9zaXRpb24gJiYgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KG5hbWUpID49IGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQkJCS8vIHJlcGxhY2UgdGhlIGV4aXN0aW5nIG5hbWUKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlLCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpLCBuYW1lLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gaW5zZXJ0IGEgdmFsaWQgbmV3IG5hbWUsIG9yIHBvc3NpYmx5IGFuIGVuZCB0YWcKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsICgoTm9kZSkgbm9kZUF0T2Zmc2V0KS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIFJldHJlaXZlcyBjbW5vZGUncyBkb2N1bWVudGF0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGNvbXBsZXRpb24KLQkgKiBwcm9wb3NhbCdzIGFkZGl0aW9uYWwgaW5mby4gSWYgbm8gZG9jdW1lbnRhdGlvbiBleGlzdHMgZm9yIGNtbm9kZSwgdHJ5Ci0JICogZGlzcGxheWluZyBwYXJlbnRPck93bmVyJ3MgZG9jdW1lbnRhdGlvbgotCSAqIAotCSAqIFN0cmluZyBhbnkgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGZvciBjbW5vZGUuCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oQ01Ob2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIGFkZGxJbmZvID0gbnVsbDsKLQotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhjbW5vZGUpOwotCQlpZiAoYWRkbEluZm8gPT0gbnVsbCAmJiBwYXJlbnRPck93bmVyICE9IG51bGwpCi0JCQlhZGRsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8ocGFyZW50T3JPd25lcik7Ci0JCXJldHVybiBhZGRsSW5mbzsKLQl9Ci0KLQkvLyByZXR1cm5zIGEgbGlzdCBvZiBNb2RlbFF1ZXJ5QWN0aW9ucwotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQlpZiAocGFyZW50RGVjbCAhPSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJLy8gdGFrZW4gZnJvbSBBY3Rpb25NYW5hZ2VycwotCQkJLy8gaW50IGVkaXRNb2RlID0gbW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpOwotCQkJaW50IGVkaXRNb2RlID0gTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRDsKLQkJCWludCBpYyA9IChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpID8gTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTIHwgTW9kZWxRdWVyeS5JTkNMVURFX1NFUVVFTkNFX0dST1VQUyA6IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIHBhcmVudERlY2wsIGluZGV4LCBpYywgdmFsaWRpdHlDaGVja2luZywgbGlzdCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLy8gcmV0dXJucyBhIGxpc3Qgb2YgQ01FbGVtZW50RGVjbGFyYXRpb25zCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKERvY3VtZW50IGRvY3VtZW50LCBpbnQgY2hpbGRJbmRleCkgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCi0JCS8vIGV4dHJhY3QgdGhlIHZhbGlkICdyb290JyBub2RlIG5hbWUgZnJvbSB0aGUgRG9jdW1lbnRUeXBlIE5vZGUKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCVN0cmluZyByb290TmFtZSA9IG51bGw7Ci0JCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCXJvb3ROYW1lID0gZG9jVHlwZS5nZXROb2RlTmFtZSgpOwotCQl9Ci0JCWlmIChyb290TmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCS8vIG1ha2Ugc3VyZSB0aGUgInJvb3QiIEVsZW1lbnQgaXNuJ3QgYWxyZWFkeSBwcmVzZW50Ci0JCQkvLyBpcyBpdCByZXF1aXJlZCB0byBiZSBhbiBFbGVtZW50PwotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgc3RyaW5nc0VxdWFsKGNoaWxkLmdldE5vZGVOYW1lKCksIHJvb3ROYW1lKSkgewotCQkJCS8vIGlmIHRoZSBub2RlIGlzIG1pc3NpbmcgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgdGFnLCBkb24ndAotCQkJCS8vIGNvdW50IGl0IGFzIHByZXNlbnQKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiAoKChJRE9NTm9kZSkgY2hpbGQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCB8fCAoKElET01Ob2RlKSBjaGlsZCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJvb3ROYW1lICsgIiBhbHJlYWR5IHByZXNlbnQhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5UaGVfZG9jdW1lbnRfZWxlbWVudF9fLCAobmV3IE9iamVjdFtde3Jvb3ROYW1lfSkpKTsKLQkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJCX0KLQkJfQotCi0JCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBjbWRvYyA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJaWYgKGNtZG9jICE9IG51bGwpIHsKLQkJCQlpZiAocm9vdE5hbWUgIT0gbnVsbCkgewotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByb290RGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21kb2MuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0ocm9vdE5hbWUpOwotCQkJCQlpZiAocm9vdERlY2wgIT0gbnVsbCkgewotCQkJCQkJbGlzdC5hZGQocm9vdERlY2wpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gc3VwcGx5IHRoZSBnaXZlbiBkb2N1bWVudCBuYW1lIGFueXdheSwgZXZlbiBpZiBpdAotCQkJCQkJLy8gaXMgYW4gZXJyb3IKLQkJCQkJCWxpc3QuYWRkKG5ldyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbihyb290TmFtZSkpOwotCQkJCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvIHx8IERlYnVnLmRpc3BsYXlXYXJuaW5ncykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGRlZmluaXRpb24gZm91bmQgZm9yICIgKyByb290TmFtZSArICIgaW4gIiArIGRvY1R5cGUuZ2V0UHVibGljSWQoKSArICIvIiArIGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSk7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gIiIgKyAoZG9jVHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgPyBkb2NUeXBlLmdldFB1YmxpY0lkKCkgKyAiLyIgOiAiIikgKyAoZG9jVHlwZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwgPyBkb2NUeXBlLmdldFN5c3RlbUlkKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChsb2NhdGlvbi5sZW5ndGgoKSA+IDApCi0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuTm9fZGVmaW5pdGlvbl9mb3JfaW4sIChuZXcgT2JqZWN0W117cm9vdE5hbWUsIGxvY2F0aW9ufSkpKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19kZWZpbml0aW9uX2ZvciwgKG5ldyBPYmplY3RbXXtyb290TmFtZX0pKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGlzcGxheUluZm8gfHwgRGVidWcuZGlzcGxheVdhcm5pbmdzKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGNvbnRlbnQgbW9kZWwgZm91bmQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiICsgKGRvY1R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iIDogIiIpICsgKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobG9jYXRpb24ubGVuZ3RoKCkgPiAwKQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19jb250ZW50X21vZGVsX2ZvciwgKG5ldyBPYmplY3RbXXtsb2NhdGlvbn0pKSk7Ci0JCQkJZWxzZQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MVUlNZXNzYWdlcy5Ob19jb250ZW50X21vZGVsX2ZvdW5kX1VJXyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IG9mZnNldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA9PSBvZmZzZXQpIHsKLQkJCS8vIFRoZSBvZmZzZXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9uCi0JCQlpZiAoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSkgJiYgKHNkUmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgJiYgKCFzZFJlZ2lvbi5nZXRQcmV2aW91cygpLmlzRW5kZWQoKSkpIHsKLQkJCQkvLyBJcyB0aGUgcmVnaW9uIGFsc28gdGhlIHN0YXJ0IG9mIHRoZSBub2RlPyBJZiBzbywgdGhlCi0JCQkJLy8gcHJldmlvdXMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCS8vIHdoZXJlIHRvIGxvb2sgZm9yIGEgdXNlZnVsIHJlZ2lvbi4KLQkJCQlyZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCAtIDEpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gSXMgdGhlcmUgbm8gc2VwYXJhdGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIHByZXZpb3VzIHJlZ2lvbj8KLQkJCQkvLyBJZiBub3QsCi0JCQkJLy8gdGhlbiB0aGF0IHJlZ2lvbiBpcyB0aGUgaW1wb3J0YW50IG9uZQotCQkJCUlUZXh0UmVnaW9uIHByZXZpb3VzUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0IC0gMSk7Ci0JCQkJaWYgKChwcmV2aW91c1JlZ2lvbiAhPSBudWxsKSAmJiAocHJldmlvdXNSZWdpb24gIT0gcmVnaW9uKSAmJiAocHJldmlvdXNSZWdpb24uZ2V0VGV4dExlbmd0aCgpID09IHByZXZpb3VzUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQlyZWdpb24gPSBwcmV2aW91c1JlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGUgb2Zmc2V0IGlzIE5PVCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb24KLQkJCWlmIChvZmZzZXQgPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCS8vIElzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSB3aGl0ZXNwYWNlIGFmdGVyIHRoZSB0ZXh0IGluIHRoaXMKLQkJCQkvLyByZWdpb24/Ci0JCQkJLy8gSWYgc28sIHVzZSB0aGUgbmV4dCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkKLQkJCQkJcmVnaW9uID0gbmV4dFJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIElzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBpbXBvcnRhbnQgdGV4dCBmb3IgdGhpcyByZWdpb24/Ci0JCQkJLy8gSWYgc28sIHRoZW4gd2UndmUgYWxyZWFkeSBnb3QgdGhlIHJpZ2h0IG9uZS4KLQkJCX0KLQkJfQotCi0JCS8vIHZhbGlkIFdISVRFX1NQQUNFIHJlZ2lvbiBoYW5kbGVyICgjMTc5OTI0KQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgLSAxKTsKLQkJCWlmIChwcmV2aW91c1JlZ2lvbiAhPSBudWxsKQotCQkJCXJlZ2lvbiA9IHByZXZpb3VzUmVnaW9uOwotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lvbiB3aG9zZSBjb250ZW50J3MgcmVxdWlyZSBjb21wbGV0aW9uLiBUaGlzIGlzIHNvbWV0aGluZwotCSAqIG9mIGEgbWlzbm9tZXIgYXMgc29tZXRpbWVzIHRoZSB1c2VyIHdhbnRzIHRvIGJlIHByb21wdGVkIGZvciBjb250ZW50cwotCSAqIG9mIGEgbm9uLWV4aXN0YW50IElUZXh0UmVnaW9uLCBzdWNoIGFzIGZvciBlbnVtZXJhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKiBmb2xsb3dpbmcgYW4gJz0nIHNpZ24uCi0JICovCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IGRvY3VtZW50UG9zaXRpb24sIE5vZGUgZG9tbm9kZSkgewotCQlpZiAoZG9tbm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IGRvY3VtZW50UG9zaXRpb247Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBkb21ub2RlOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlvZmZzZXQtLTsKLQkJCQlyZXN1bHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJLy8gRGV0ZXJtaW5lIGlmIHRoZSBvZmZzZXQgaXMgd2l0aGluIHRoZSBzdGFydAotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBlbmQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb3IKLQkJLy8gc29tZXdoZXJlIHdpdGhpbiB0aGUgTm9kZSdzIFhNTCBjb250ZW50LgotCQlpZiAoKHN0YXJ0VGFnICE9IG51bGwpICYmIChzdGFydFRhZy5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IHN0YXJ0VGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBzdGFydFRhZy5nZXRMZW5ndGgoKSkpCi0JCQlmbGF0Tm9kZSA9IHN0YXJ0VGFnOwotCQllbHNlIGlmICgoZW5kVGFnICE9IG51bGwpICYmIChlbmRUYWcuZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBlbmRUYWcuZ2V0U3RhcnRPZmZzZXQoKSArIGVuZFRhZy5nZXRMZW5ndGgoKSkpCi0JCQlmbGF0Tm9kZSA9IGVuZFRhZzsKLQotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJLy8gdGhlIG9mZnNldCBpcyBkZWZpbml0ZWx5IHdpdGhpbiB0aGUgc3RhcnQgb3IgZW5kIHRhZywgY29udGludWUKLQkJCS8vIG9uIGFuZCBmaW5kIHRoZSByZWdpb24KLQkJCXJlZ2lvbiA9IGdldENvbXBsZXRpb25SZWdpb24ob2Zmc2V0LCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0aGUgZG9jUG9zaXRpb24gaXMgbmVpdGhlciB3aXRoaW4gdGhlIHN0YXJ0IG5vciB0aGUgZW5kLCBzbyBpdAotCQkJLy8gbXVzdCBiZSBjb250ZW50Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCS8vIChwYSkgSVRleHRSZWdpb24gcmVmYWN0b3IKLQkJCS8vIGlmIChmbGF0Tm9kZS5jb250YWlucyhkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZG9jdW1lbnRQb3NpdGlvbiAmJiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSA+PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJLy8gd2UncmUgaW50ZXJlc3RpbmcgaW4gY29tcGxldGluZy9leHRlbmRpbmcgdGhlIHByZXZpb3VzCi0JCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpZiB0aGUgY3VycmVudAotCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXNuJ3QgcGxhaW4gY29udGVudCBvciBpZiBpdCdzCi0JCQkJLy8gcHJlY2VkZWQgYnkgYW4gb3JwaGFuICc8JwotCQkJCWlmICgob2Zmc2V0ID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpICYmIChmbGF0Tm9kZS5nZXRQcmV2aW91cygpICE9IG51bGwpICYmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKSAhPSBudWxsICYmIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IGZsYXROb2RlLmdldFByZXZpb3VzKCkuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCBmbGF0Tm9kZS5nZXRQcmV2aW91cygpLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkgewotCQkJCQkvLyBJcyB0aGUgcmVnaW9uIGFsc28gdGhlIHN0YXJ0IG9mIHRoZSBub2RlPyBJZiBzbywgdGhlCi0JCQkJCS8vIHByZXZpb3VzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMKLQkJCQkJLy8gd2hlcmUgdG8gbG9vayBmb3IgYSB1c2VmdWwgcmVnaW9uLgotCQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpLmdldExhc3RSZWdpb24oKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbikgewotCQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNhdGNoIGVuZCBvZiBkb2N1bWVudCBwb3NpdGlvbnMgd2hlcmUgdGhlIGRvY1Bvc2l0aW9uIGlzbid0Ci0JCQkJLy8gaW4gYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlZCBieSBkZWZhdWx0LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB3aXRoIHRoZWlyIG93bgotCSAqIGltcGxlbWVudGF0aW9ucy4KLQkgKiAKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZW50R2VuZXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoKSB7Ci0JCWlmIChmR2VuZXJhdG9yID09IG51bGwpCi0JCQlmR2VuZXJhdG9yID0gbmV3IFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcigpOwotCQlyZXR1cm4gZkdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgcHJlc2VudGluZyBjb250ZXh0IGluZm9ybWF0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQKLQkgKiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlpZiAoZkNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciA9PSBudWxsKQotCQkJZkNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciA9IG5ldyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIoKTsKLQkJcmV0dXJuIGZDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UG9zaXRpb24oTm9kZSBjaGlsZCkgewotCQlOb2RlIHBhcmVudCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpbnQgY291bnQgPSAwOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgPT0gY2hpbGQpCi0JCQkJcmV0dXJuIGNvdW50OwotCQkJZWxzZQotCQkJCS8vIGlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY291bnQrKzsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRQb3NpdGlvbihjaGlsZCk7Ci0JCS8vIHJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkKLQkgKiBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBhbiBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlSZXNvdXJjZQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVJlc291cmNlIGlSZXNvdXJjZSkgewotCS8vIHRoaXMucmVzb3VyY2UgPSBpUmVzb3VyY2U7Ci0JLy8gfQotCS8qKgotCSAqIEdldHMgdGhlIGluZm9Qcm92aWRlci4KLQkgKiAKLQkgKiBmSW5mb1Byb3ZpZGVyIGFuZCBpZiBmSW5mb1Byb3ZpZGVyIHdhcyA8Y29kZT5udWxsPC9jb2RlPiBjcmVhdGUgYSBuZXcKLQkgKiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZ2V0SW5mb1Byb3ZpZGVyKCkgewotCQlpZiAoZkluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmSW5mb1Byb3ZpZGVyID0gbmV3IE1hcmt1cFRhZ0luZm9Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5mb1Byb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKGFSZWdpb24gPT0gbnVsbCB8fCBpc0Nsb3NlUmVnaW9uKGFSZWdpb24pKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtYXRjaFN0cmluZyA9IG51bGw7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gYVJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgKG9mZnNldCA+IHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSArIGFSZWdpb24uZ2V0VGV4dExlbmd0aCgpKSkgewotCQkJbWF0Y2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJbWF0Y2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHBhcmVudC5nZXRUZXh0KGFSZWdpb24pLmxlbmd0aCgpID4gMCAmJiBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikgPCBvZmZzZXQpCi0JCQkJbWF0Y2hTdHJpbmcgPSBwYXJlbnQuZ2V0VGV4dChhUmVnaW9uKS5zdWJzdHJpbmcoMCwgb2Zmc2V0IC0gcGFyZW50LmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pKTsKLQkJCWVsc2UKLQkJCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uTGlzdC5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9uTGlzdC5uZXh0KCk7Ci0JCQlpZiAoaXNOYW1lUmVnaW9uKHJlZ2lvbikpCi0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgYWxsIG9mIHRoZSBwb3NzaWJsZSB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlCi0JICogZGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKE5vZGUgbm9kZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCVN0cmluZ1tdIGRhdGFUeXBlVmFsdWVzID0gbnVsbDsKLQkJCS8vIFRoZSBNb2RlbFF1ZXJ5IG1heSBub3QgYmUgYXZhaWxhYmxlIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0JCQkvLyBhZGFwdGVyCi0JCQkvLyBpcyBhYnNlbnQKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCWRhdGFUeXBlVmFsdWVzID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGFkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChhZC5nZXRBdHRyVHlwZSgpICE9IG51bGwpCi0JCQkJCWRhdGFUeXBlVmFsdWVzID0gYWQuZ2V0QXR0clR5cGUoKS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCQl9Ci0JCQlpZiAoZGF0YVR5cGVWYWx1ZXMgIT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KGRhdGFUeXBlVmFsdWVzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhVHlwZVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlsaXN0LmFkZChkYXRhVHlwZVZhbHVlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoY21ub2RlID09IG51bGwgfHwgcGFyZW50T3JPd25lciA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRSZXF1aXJlZE5hbWUocGFyZW50T3JPd25lciwgY21ub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkVGV4dChOb2RlIHBhcmVudE9yT3duZXIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVJlcXVpcmVkQXR0cmlidXRlKHBhcmVudE9yT3duZXIsIGF0dHJEZWNsLCBidWZmKTsKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkVGV4dChOb2RlIHBhcmVudE9yT3duZXIsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcocGFyZW50T3JPd25lciwgZWxlbWVudERlY2wsIGJ1ZmYpOwotCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Vmlld2VyIG11c3QgYmUgc2V0IGJlZm9yZSB1c2luZyB0aGlzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgcG9zKSB7Ci0JCS8vIChwYSkgSVRleHRSZWdpb24gcmVmYWN0b3IgZGVmZWN0IDI0NTE5MAotCQkvLyByZXR1cm4KLQkJLy8gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCgoU3RydWN0dXJlZFRleHRWaWV3ZXIpZlRleHRWaWV3ZXIsCi0JCS8vIHBvcyk7Ci0JCXJldHVybiBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZUZXh0Vmlld2VyLCBwb3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRhZ05hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQluYW1lID0gc2RSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotICAgIC8vIHJldHVybnMgYSBsaXN0IG9mIENNTm9kZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIHBhcmVudCBjb250ZXh0Ci0gICAgLy8gR2l2ZW4gdGhlIGdyYW1tYXIgc2hvd24gYmVsb3cgYW5kIGEgc25pcHBldCBvZiBYTUwgY29kZSAod2hlcmUgdGhlICd8JyBpbmRpY2F0ZWQgdGhlIGN1cnNvciBwb3NpdGlvbikgCi0gICAgLy8gdGhlIGxpc3Qgd291bGQgcmV0dXJuIGFsbCBvZiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgcG90ZW50aWFsIGNoaWxkIGVsZW1lbnRzIG9mIEZvby4gCi0gICAgLy8KLSAgICAvLyBncmFtbWFyIDogRm9vIC0+IChBLCBCLCBDKSAgIAotICAgIC8vIHNuaXBwZXQgOiA8Rm9vPjxBPnwKLSAgICAvLyByZXN1bHQgIDoge0EsIEIsIEN9Ci0gICAgLy8gCi0gICAgLy8gVE9ETyBjcy4uLiBkbyB3ZSBuZWVkIHRvIHBhc3MgaW4gdGhlICdraW5kT2ZBY3Rpb24nPyAgU2VlbXMgdG8gbWUgd2UgY291bGQgYXNzdW1lIGl0J3MgYWx3YXlzIGFuIGluc2VydC4KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSAKLSAgICB7Ci0gICAgICAgIExpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSAgZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeS5WQUxJRElUWV9OT05FKTsgCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxRdWVyeUFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJTGlzdCBjbW5vZGVzID0gbmV3IFZlY3RvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGRQb3NpdGlvbiA8IDAgfHwgKGFjdGlvbi5nZXRTdGFydEluZGV4KCkgPD0gY2hpbGRQb3NpdGlvbiAmJiBjaGlsZFBvc2l0aW9uIDw9IGFjdGlvbi5nZXRFbmRJbmRleCgpKSAmJiBhY3Rpb24uZ2V0S2luZCgpID09IGtpbmRPZkFjdGlvbikgewotCQkJCUNNTm9kZSBhY3Rpb25DTU5vZGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCk7Ci0JCQkJaWYgKGFjdGlvbkNNTm9kZSAhPSBudWxsICYmICFjbW5vZGVzLmNvbnRhaW5zKGFjdGlvbkNNTm9kZSkpCi0JCQkJCWNtbm9kZXMuYWRkKGFjdGlvbkNNTm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNtbm9kZXM7Ci0JfQotCi0gICAgLy8gcmV0dXJucyBhIGxpc3Qgb2YgQ01Ob2RlcyB0aGF0IGNhbiBiZSB2YWxpZGx5IGluc2VydGVkIGF0IHRoaXMgY2hpbGRQb3NpdGlvbiAKLSAgICAvLyBHaXZlbiB0aGUgZ3JhbW1hciBzaG93biBiZWxvdyBhbmQgYSBzbmlwcGV0IG9mIFhNTCBjb2RlICh3aGVyZSB0aGUgJ3wnIGluZGljYXRlZCB0aGUgY3Vyc29yIHBvc2l0aW9uKSAKLSAgICAvLyB0aGUgbGlzdCB3b3VsZCByZXR1cm4gb25seSB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgY2FuIGJlIGluc2VydGVkIHdoaWxlIG1haW50YWluZyB2YWxpZGl0eSBvZiB0aGUgY29udGVudC4gCi0gICAgLy8KLSAgICAvLyBncmFtbWFyIDogRm9vIC0+IChBLCBCLCBDKSAgIAotICAgIC8vIHNuaXBwZXQgOiA8Rm9vPjxBPnwKLSAgICAvLyByZXN1bHQgIDoge0J9Ci0gICAgLy8gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0VmFsaWRDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSAKLSAgICB7Ci0gICAgICAgIExpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSAgZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QpOyAKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbFF1ZXJ5QWN0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICBMaXN0IGNtbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsgICAgICAKLSAgICAgICAgICAgIGlmIChjaGlsZFBvc2l0aW9uIDwgMCB8fCAoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uICYmIGNoaWxkUG9zaXRpb24gPD0gYWN0aW9uLmdldEVuZEluZGV4KCkpICYmIGFjdGlvbi5nZXRLaW5kKCkgPT0ga2luZE9mQWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ01Ob2RlIGFjdGlvbkNNTm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ01Ob2RlICE9IG51bGwgJiYgIWNtbm9kZXMuY29udGFpbnMoYWN0aW9uQ01Ob2RlKSkKLSAgICAgICAgICAgICAgICAgICAgY21ub2Rlcy5hZGQoYWN0aW9uQ01Ob2RlKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbW5vZGVzOwotICAgIH0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gdGhlIGNhbGwgaW4gSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuIFBhc3MgaW4gYSBub2RlLCBpdAotCSAqIHRlbGxzIHlvdSBpZiB0aGUgZG9jdW1lbnQgaXMgWE1MIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRYTUwoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJZG9jID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpID8gbm9kZS5nZXRPd25lckRvY3VtZW50KCkgOiAoKERvY3VtZW50KSBub2RlKTsKLQotCQlyZXR1cm4gKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgJiYgKChJRE9NRG9jdW1lbnQpIGRvYykuaXNYTUxUeXBlKCk7Ci0JfQotCi0JLy8gSW5pdGlhbGl6ZSBsb2NhbCBzZXR0aW5ncwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0FUVExJU1RfREVDTF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIHRvIGRldGVybWluZSBpZiBhIHRhZyBpcyBhIHNwZWNpYWwgbWV0YS1pbmZvIGNvbW1lbnQgdGFnIHRoYXQKLQkgKiBzaG93cyB1cCBhcyBhbiBFTEVNRU5UCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQgJiYgKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDb21tZW50VGFnKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBjdXJzb3IgcG9zaXRpb24gaXMgYWZ0ZXIgZG9jdHlwZSB0YWcuLi4KLQkgKiAKLQkgKiBAcGFyYW0gY2FyCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXJzb3JBZnRlckRvY3R5cGUoQ29udGVudEFzc2lzdFJlcXVlc3QgY2FyKSB7Ci0JCU5vZGUgYU5vZGUgPSBjYXIuZ2V0Tm9kZSgpOwotCQlEb2N1bWVudCBwYXJlbnQgPSBhTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWludCB4bWxkb2N0eXBlTm9kZVBvc2l0aW9uID0gLTE7Ci0JCWJvb2xlYW4gaXNBZnRlckRvY3R5cGUgPSB0cnVlOwotCi0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyBibGFuayBkb2N1bWVudCBjYXNlCi0KLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCXhtbGRvY3R5cGVOb2RlUG9zaXRpb24gPSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWlzQWZ0ZXJEb2N0eXBlID0gKGNhci5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSB4bWxkb2N0eXBlTm9kZVBvc2l0aW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0FmdGVyRG9jdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gY2hlY2sgaWYgdGhlIGN1cnNvciBpcyBhZnRlciB0aGUgWE1MUEkKLQkgKiAKLQkgKiBAcGFyYW0gY2FyCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXJzb3JBZnRlclhNTFBJKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNhcikgewotCQlOb2RlIGFOb2RlID0gY2FyLmdldE5vZGUoKTsKLQkJYm9vbGVhbiB4bWxwaUZvdW5kID0gZmFsc2U7Ci0JCURvY3VtZW50IHBhcmVudCA9IGFOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaW50IHhtbHBpTm9kZVBvc2l0aW9uID0gLTE7Ci0JCWJvb2xlYW4gaXNBZnRlclhNTFBJID0gZmFsc2U7Ci0KLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIGJsYW5rIGRvY3VtZW50IGNhc2UKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWJvb2xlYW4geG1scGkgPSAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sIikpOyAvLyROT04tTkxTLTEkCi0JCQl4bWxwaUZvdW5kID0geG1scGlGb3VuZCB8fCB4bWxwaTsKLQkJCWlmICh4bWxwaUZvdW5kKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJeG1scGlOb2RlUG9zaXRpb24gPSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWlzQWZ0ZXJYTUxQSSA9IChjYXIuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0geG1scGlOb2RlUG9zaXRpb24pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNBZnRlclhNTFBJOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQVRUTElTVF9ERUNMX05BTUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX1JPT1RfVEFHX05BTUUpIHx8IHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9OQU1FKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNRdW90ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyB0cmltbWVkID0gc3RyaW5nLnRyaW0oKTsKLQkJaWYgKHRyaW1tZWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJpbW1lZC5jaGFyQXQoMCkgPT0gJ1wnJyB8fCB0cmltbWVkLmNoYXJBdCgwKSA9PSAnIic7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGZDbG9zZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnLmdldFJlZ2lvbnMoKTsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCQlyZXN1bHQgPSByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiBzZFJlZ2lvbi5pc0VuZGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBtYXBUb1Byb3BlcnRpZXMoQ01OYW1lZE5vZGVNYXAgbWFwKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUNNRW50aXR5RGVjbGFyYXRpb24gZGVjbCA9IChDTUVudGl0eURlY2xhcmF0aW9uKSBtYXAuaXRlbShpKTsKLQkJCXAucHV0KGRlY2wuZ2V0TmFtZSgpLCBkZWNsLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MTm9kZSwgYW5kIGNoZWNrcyBpZiBpdCdzIGNsb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRUYWcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZykgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZy5nZXRTdGFydCgpKTsKLQkJCQlpZiAoIWlzU3RhcnRUYWcoc3RhcnRUYWcpKQotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQllbHNlIGlmIChpc1NlbGZDbG9zZWQoc3RhcnRUYWcpKQotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQllbHNlIGlmICgheG1sTm9kZS5pc0NvbnRhaW5lcigpKQotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdCA9IHhtbE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbDsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoTm9kZSBub2RlLCBOb2RlIHBvc3NpYmxlUGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBpbnQgYmVnaW4sIGludCBsZW5ndGgsIFN0cmluZyBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChub2RlLCBwb3NzaWJsZVBhcmVudCwgZG9jdW1lbnRSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGJlZ2luLCBsZW5ndGgsIGZpbHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZkdlbmVyYXRvciA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJZkVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkKLQkgKiBjb21wbGV0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIGFwcGVuZCkgewotCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlICsgYXBwZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkKLQkgKiBjb21wbGV0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHByZXBlbmQsIFN0cmluZyBhcHBlbmQpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKHByZXBlbmQgKyBlcnJvck1lc3NhZ2UgKyBhcHBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJLy8gKHBhKSAyMjExOTAgbWF0Y2hpbmcgaW5kZXBlbmRlbnQgb2YgY2FzZSB0byBiZSBjb25zaXN0YW50IHdpdGggSmF2YQotCQkvLyBlZGl0b3IgQ0EKLQkJcmV0dXJuIGEuZXF1YWxzSWdub3JlQ2FzZShiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3YWM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyYXRlQ2hpbGRyZW4gPSBmYWxzZTsKLQotCXB1YmxpYyBBYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUF0dHJpYnV0ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQXR0cmlidXRlcyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJZ2VuZXJhdGVBdHRyaWJ1dGUoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuaXRlbShpKSwgYnVmZmVyKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVFbmRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpOwotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVSZXF1aXJlZENoaWxkcmVuKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGdlbmVyYXRlQ2hpbGRyZW4pIHsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVTdGFydFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcik7Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVRhZyhOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwgfHwgYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0KLQkJZ2VuZXJhdGVTdGFydFRhZyh0YWdOYW1lLCBwYXJlbnQsIGVsZW1lbnREZWNsLCBidWZmZXIpOwotCQlnZW5lcmF0ZVJlcXVpcmVkQ2hpbGRyZW4ocGFyZW50LCBlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJZ2VuZXJhdGVFbmRUYWcodGFnTmFtZSwgcGFyZW50LCBlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWluaW1hbFN0YXJ0VGFnTGVuZ3RoKE5vZGUgbm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpOwotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBvd25lck5vZGUsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKG93bmVyTm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtbm9kZSwgb3duZXJOb2RlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNBdHRyaWJ1dGVzKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLml0ZW0oaSkpLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4N2I2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBJQ29udGV4dEluZm9ybWF0aW9uLiBBZGRzIGtub3dsZWRnZSBhYm91dCB0aGUgaW5mb3JtYXRpb24KLSAqIGRpc3BsYXkgc3RyaW5nIHN1Y2ggYXMgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBjb250ZXh0LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvbiB7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZBdHRyMlJhbmdlTWFwOwotCS8qKiBUaGUgbmFtZSBvZiB0aGUgY29udGV4dCAqLwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0RGlzcGxheVN0cmluZzsKLQkvKiogVGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZCAqLwotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCS8qKiBUaGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkICovCi0JcHJpdmF0ZSBTdHJpbmcgZkluZm9ybWF0aW9uRGlzcGxheVN0cmluZzsKLQlwcml2YXRlIGludCBmUG9zaXRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW5mb3JtYXRpb24gd2l0aCBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBkaXNwbGF5IHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqIEBwYXJhbSBjb250ZXh0RGlzcGxheVN0cmluZwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB1c2VkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqIEBwYXJhbSBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqICAgICAgICAgICAgaW5mb3JtYXRpb24sIG1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKEltYWdlIGltYWdlLCBTdHJpbmcgY29udGV4dERpc3BsYXlTdHJpbmcsIFN0cmluZyBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsIEhhc2hNYXAgYXR0cjJSYW5nZU1hcCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGluZm9ybWF0aW9uRGlzcGxheVN0cmluZywgImlsbGVnYWwgYXJndW1lbnQ6IGluZm9ybWF0aW9uRGlzcGxheVN0cmluZyBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZJbWFnZSA9IGltYWdlOwotCQlmQ29udGV4dERpc3BsYXlTdHJpbmcgPSBjb250ZXh0RGlzcGxheVN0cmluZzsKLQkJZkluZm9ybWF0aW9uRGlzcGxheVN0cmluZyA9IGluZm9ybWF0aW9uRGlzcGxheVN0cmluZzsKLQkJZkF0dHIyUmFuZ2VNYXAgPSBhdHRyMlJhbmdlTWFwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBpbmZvcm1hdGlvbiB3aXRob3V0IGFuIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0RGlzcGxheVN0cmluZwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB1c2VkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqIEBwYXJhbSBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqICAgICAgICAgICAgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKFN0cmluZyBjb250ZXh0RGlzcGxheVN0cmluZywgU3RyaW5nIGluZm9ybWF0aW9uRGlzcGxheVN0cmluZywgSGFzaE1hcCBhdHRyMlJhbmdlTWFwKSB7Ci0JCXRoaXMobnVsbCwgY29udGV4dERpc3BsYXlTdHJpbmcsIGluZm9ybWF0aW9uRGlzcGxheVN0cmluZywgYXR0cjJSYW5nZU1hcCk7Ci0JfQotCi0JLyoqCi0JICogTWFwcyAoU3RyaW5nIC0+IFBvc2l0aW9uKS4gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBUZXh0IHBvc2l0aW9uLgotCSAqIAotCSAqIAotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEF0dHIyUmFuZ2VNYXAoKSB7Ci0JCXJldHVybiBmQXR0cjJSYW5nZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldENvbnRleHREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHREaXNwbGF5U3RyaW5nKCkgewotCQlpZiAoZkNvbnRleHREaXNwbGF5U3RyaW5nICE9IG51bGwpCi0JCQlyZXR1cm4gZkNvbnRleHREaXNwbGF5U3RyaW5nOwotCQlyZXR1cm4gZkluZm9ybWF0aW9uRGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uI2dldENvbnRleHRJbmZvcm1hdGlvblBvc2l0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRleHRJbmZvcm1hdGlvblBvc2l0aW9uKCkgewotCQlyZXR1cm4gZlBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGZJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRJbmZvcm1hdGlvblBvc2l0aW9uKGludCBwb3NpdGlvbikgewotCQlmUG9zaXRpb24gPSBwb3NpdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWNmZGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgY29udGV4dCBpbmZvIHBvcHVwLiBUaGlzIGluY2x1ZGVzCi0gKiB0ZXh0IHN0eWxlLCBhbmQgd2hlbiB0aGUgd2luZG93IHNob3VsZCBjbG9zZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIsIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgewotCXByaXZhdGUgaW50IGZEb2N1bWVudFBvc2l0aW9uID0gLTE7Ci0KLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb24gZkluZm8gPSBudWxsOwotCXByaXZhdGUgQ29udGV4dEluZm9Nb2RlbFV0aWwgZk1vZGVsVXRpbCA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpbnN0YWxsKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZJbmZvID0gaW5mbzsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZkRvY3VtZW50UG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQlmTW9kZWxVdGlsID0gbmV3IENvbnRleHRJbmZvTW9kZWxVdGlsKChJU3RydWN0dXJlZERvY3VtZW50KSBmVmlld2VyLmdldERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQkvLyBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhpcyBjb250ZXh0IGluZm8gc2hvdWxkIHN0aWxsIGJlCi0JCS8vIHNob3dpbmcuLi4KLQkJLy8gaWYgY3Vyc29yIHN0aWxsIHdpdGhpbiB0aGUgZWxlbWVudCBpdCdzIHZhbGlkLi4uCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChmTW9kZWxVdGlsICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSBmTW9kZWxVdGlsLmdldFhNTE5vZGUoZkRvY3VtZW50UG9zaXRpb24pLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnQgc3RhcnQgPSBzdGFydFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IHN0YXJ0UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJcmVzdWx0ID0gZG9jdW1lbnRQb3NpdGlvbiA8IGVuZCAmJiBkb2N1bWVudFBvc2l0aW9uID4gc3RhcnQgKyAxOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciN1cGRhdGVQcmVzZW50YXRpb24oaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVByZXNlbnRhdGlvbihpbnQgZG9jdW1lbnRQb3NpdGlvbiwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJcHJlc2VudGF0aW9uLmNsZWFyKCk7Ci0KLQkJaWYgKCEoZkluZm8gaW5zdGFuY2VvZiBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGl0ZXJhdGUgZXhpc3RpbmcgYXR0cmlidXRlcyBmcm9tIGN1cnJlbnQgbm9kZQotCQlJRE9NTm9kZSB4bWxOb2RlID0gZk1vZGVsVXRpbC5nZXRYTUxOb2RlKGRvY3VtZW50UG9zaXRpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0geG1sTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdCB0ZW1wID0gbnVsbDsKLQkJUG9zaXRpb24gcCA9IG51bGw7Ci0JCUhhc2hNYXAgbWFwID0gKChBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24pIGZJbmZvKS5nZXRBdHRyMlJhbmdlTWFwKCk7Ci0KLQkJLy8gc28gd2UgY2FuIGFkZCByYW5nZXMgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZVtdIHNvcnRlZCA9IG5ldyBTdHlsZVJhbmdlW2ZJbmZvLmdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpLmxlbmd0aCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ck5hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCXRlbXAgPSBtYXAuZ2V0KGF0dHJOYW1lKTsKLQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXAgPSAoUG9zaXRpb24pIHRlbXA7Ci0JCQkJCXNvcnRlZFtwLm9mZnNldF0gPSBuZXcgU3R5bGVSYW5nZShwLm9mZnNldCwgcC5sZW5ndGgsIG51bGwsIG51bGwsIFNXVC5CT0xEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc3R5bGUgcmFuZ2VzIG5lZWQgdG8gYmUgYWRkZWQgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZSBzciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlzciA9IHNvcnRlZFtpXTsKLQkJCWlmIChzciAhPSBudWxsKQotCQkJCXByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKHNyKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzNGVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQ2FsY3VsYXRlcyBhdHRyaWJ1dGUgY29udGV4dCBpbmZvcm1hdGlvbiBiYXNlZCBvbiBhIFN0cnVjdHVlZERvY3VtZW50IGFuZAotICogZG9jdW1lbnQgcG9zaXRpb24uCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyIHsKLQlwcml2YXRlIGZpbmFsIElDb250ZXh0SW5mb3JtYXRpb25bXSBFTVBUWV9DT05URVhUX0lORk8gPSBuZXcgSUNvbnRleHRJbmZvcm1hdGlvblswXTsKLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENvbnRleHRJbmZvTW9kZWxVdGlsIGZNb2RlbFV0aWwgPSBudWxsOwotCi0JcHVibGljIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgcHJlc2VudGVyKSB7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQkJZk1vZGVsVXRpbCA9IG5ldyBDb250ZXh0SW5mb01vZGVsVXRpbChmRG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUHJvcG9zZUluZm8oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoc2RSZWdpb24gIT0gbnVsbCAmJiBpc0VuZFRhZyhzZFJlZ2lvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gZ2V0QXR0cmlidXRlSW5mb3JtYXRpb24oaW50IG9mZnNldCkgewotCQkvKgotCQkgKiBuZWVkIHRvIHRha2UgY2FyZSBvZiBzcGVjaWFsIGNhc2VzIHcvIGFtYmlndW91cyByZWdpb25zIDx0YWc+fAotCQkgKiA8L3RhZz4gYWxzbyBlbmQgdGFncy4uCi0JCSAqLwotCQlJQ29udGV4dEluZm9ybWF0aW9uW10gcmVzdWx0cyA9IEVNUFRZX0NPTlRFWFRfSU5GTzsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZk1vZGVsVXRpbC5nZXREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWlmICghY2FuUHJvcG9zZUluZm8oc2RSZWdpb24pKQotCQkJcmV0dXJuIEVNUFRZX0NPTlRFWFRfSU5GTzsKLQotCQlJRE9NTm9kZSBub2RlID0gZk1vZGVsVXRpbC5nZXRYTUxOb2RlKG9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJCXJlc3VsdHMgPSBnZXRJbmZvRm9yRWxlbWVudChub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkvLyBmdXR1cmUuLi4KLQkJCS8vCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkvLwkJCQlyZXN1bHRzID0gZ2V0SW5mb0ZvclRleHQobm9kZSk7Ci0JCQkvLwkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tcGFyYXRvciB0aGF0IGNvbXBhcmVzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gbmFtZXMuCi0JICogCi0JICB0aGUgY29tcGFyYXRvcgotCSAqLwotCXByaXZhdGUgQ29tcGFyYXRvciBnZXRDTUF0dHJpYnV0ZUNvbXBhcmF0b3IoKSB7Ci0JCWlmIChmQ29tcGFyYXRvciA9PSBudWxsKQotCQkJZkNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJcmV0dXJuICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgbzEpLmdldEF0dHJOYW1lKCkuY29tcGFyZVRvKCgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgbzIpLmdldEF0dHJOYW1lKCkpOwotCQkJCX0KLQkJCX07Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAKLQkgKi8KLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb25bXSBnZXRJbmZvRm9yRWxlbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCUlDb250ZXh0SW5mb3JtYXRpb25bXSByZXN1bHRzID0gRU1QVFlfQ09OVEVYVF9JTkZPOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZk1vZGVsVXRpbC5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJCVN0cmluZyBhdHRyQ29udGV4dFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZ0J1ZmZlciBhdHRySW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJSGFzaE1hcCBhdHRyUG9zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWludCBwb3MgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpbnQgbnVtUGVyTGluZSA9IDg7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb25bXSBzb3J0ZWRBdHRycyA9IGdldFNvcnRlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkQXR0cnMubGVuZ3RoOyBpKyspIHsKLQkJCQluYW1lID0gc29ydGVkQXR0cnNbaV0uZ2V0QXR0ck5hbWUoKTsKLQkJCQlsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCQkJCXBvcyA9IGF0dHJJbmZvLmxlbmd0aCgpOwotCi0JCQkJYXR0ckluZm8uYXBwZW5kKG5hbWUpOwotCi0JCQkJaWYgKHNvcnRlZEF0dHJzW2ldLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQlhdHRySW5mby5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsZW5ndGgrKzsKLQkJCQl9Ci0JCQkJaWYgKGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIC0gMSkgewotCQkJCQlhdHRySW5mby5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaSAhPSAwICYmIGkgJSBudW1QZXJMaW5lID09IDApCi0JCQkJCQlhdHRySW5mby5hcHBlbmQoIlxuICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWF0dHJQb3NNYXAucHV0KG5hbWUsIG5ldyBQb3NpdGlvbihwb3MsIGxlbmd0aCkpOwotCQkJfQotCQkJaWYgKCFhdHRySW5mby50b1N0cmluZygpLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBJQ29udGV4dEluZm9ybWF0aW9uW117bmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbihhdHRyQ29udGV4dFN0cmluZywgYXR0ckluZm8udG9TdHJpbmcoKSwgYXR0clBvc01hcCl9OwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JIAotCSAqLwotCSBJQ29udGV4dEluZm9ybWF0aW9uW10gZ2V0SW5mb0ZvclRleHQoSURPTU5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlTdHJpbmcgY29udGV4dFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIGluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZk1vZGVsVXRpbC5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIHBhcmVudCk7Ci0JCQlDTUNvbnRlbnQgY29udGVudCA9IGRlY2wuZ2V0Q29udGVudCgpOwotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUdyb3VwKSB7Ci0JCQkJQ01Hcm91cCBjbUdyb3VwID0gKENNR3JvdXApIGNvbnRlbnQ7Ci0JCQkJQ01Ob2RlTGlzdCBjaGlsZHJlbiA9IGNtR3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotCQkJCUNNTm9kZSBjbU5vZGUgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQljbU5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCQljb250ZXh0U3RyaW5nID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCWlmIChjb250ZXh0U3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCWluZm8uYXBwZW5kKCI8IiArIGNtTm9kZS5nZXROb2RlTmFtZSgpICsgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpZiAoaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpIC0gMSkKLQkJCQkJCQlpbmZvLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFpbmZvLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltde25ldyBDb250ZXh0SW5mb3JtYXRpb24oY29udGV4dFN0cmluZywgaW5mby50b1N0cmluZygpKX07Ci0JCWVsc2UKLQkJCXJldHVybiBFTVBUWV9DT05URVhUX0lORk87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3J0ZWQgYXJyYXkgb2YgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgCi0JICovCi0JcHJpdmF0ZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW10gZ2V0U29ydGVkQXR0cmlidXRlcyhDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzKSB7Ci0JCUxpc3Qgc29ydGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCXNvcnRlZC5hZGQoYXR0cmlidXRlcy5pdGVtKGkpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQsIGdldENNQXR0cmlidXRlQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW10pIHNvcnRlZC50b0FycmF5KG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW3NvcnRlZC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCXJldHVybiByZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZW50QXNzaXN0UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWUxYmQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGVudEFzc2lzdFJlcXVlc3QgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBtYWNyb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBtYXRjaFN0cmluZzsKLQlwcm90ZWN0ZWQgTm9kZSBub2RlID0gbnVsbDsKLQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQgPSBudWxsOwotCXByb3RlY3RlZCBMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IHJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbjsKLQlwcm90ZWN0ZWQgaW50IHJlcGxhY2VtZW50TGVuZ3RoOwotCi0JLy8JcHJpdmF0ZSBCb29sZWFuIHNlcGFyYXRlID0gbnVsbDsgLy8gKHBhKSBub3QgdXNlZAotCS8vCXByaXZhdGUgQm9vbGVhbiBzb3J0ID0gbnVsbDsgLy8gKHBhKSBub3QgdXNlZAotCS8qKgotCSAqIFhNTENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbnRlbnRBc3Npc3RSZXF1ZXN0KE5vZGUgbm9kZSwgTm9kZSBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlcikgewotCQlzdXBlcigpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXRQYXJlbnQocGFyZW50KTsKLQkJc2V0RG9jdW1lbnRSZWdpb24oZG9jdW1lbnRSZWdpb24pOwotCQlzZXRSZWdpb24oY29tcGxldGlvblJlZ2lvbik7Ci0JCXNldE1hdGNoU3RyaW5nKGZpbHRlcik7Ci0JCXNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihiZWdpbik7Ci0JCXNldFJlcGxhY2VtZW50TGVuZ3RoKGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWFjcm8oSUNvbXBsZXRpb25Qcm9wb3NhbCBuZXdQcm9wb3NhbCkgewotCQltYWNyb3MuYWRkKG5ld1Byb3Bvc2FsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wb3NhbChJQ29tcGxldGlvblByb3Bvc2FsIG5ld1Byb3Bvc2FsKSB7Ci0JCXByb3Bvc2Fscy5hZGQobmV3UHJvcG9zYWwpOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0Q29tcGxldGlvblByb3Bvc2FscygpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCByZXN1bHRzW10gPSBudWxsOwotCQlpZiAoZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID4gMCB8fCBnZXRNYWNyb3MoKS5zaXplKCkgPiAwKSB7Ci0JCQlMaXN0IGFsbFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICghc2hvdWxkU2VwYXJhdGUoKSkgewotCQkJCWFsbFByb3Bvc2Fscy5hZGRBbGwoZ2V0UHJvcG9zYWxzKCkpOwotCQkJCS8vIHNob3VsZCBiZSBlbXB0eSwgYXMgYWxsIG1hY3JvcyBzaG91bGQgaGF2ZSBnb25lIGludG8gdGhlCi0JCQkJLy8gcHJvcG9zYWwgbGlzdAotCQkJCWFsbFByb3Bvc2Fscy5hZGRBbGwoZ2V0TWFjcm9zKCkpOwotCQkJCWFsbFByb3Bvc2FscyA9IHNvcnRQcm9wb3NhbHMoYWxsUHJvcG9zYWxzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChzb3J0UHJvcG9zYWxzKGdldFByb3Bvc2FscygpKSk7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChzb3J0UHJvcG9zYWxzKGdldE1hY3JvcygpKSk7Ci0JCQl9Ci0KLQkJCXJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFthbGxQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvcG9zYWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVzdWx0c1tpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBhbGxQcm9wb3NhbHMuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBkb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldE1hY3JvcygpIHsKLQkJcmV0dXJuIG1hY3JvczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNYXRjaFN0cmluZygpIHsKLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFByb3Bvc2FscygpIHsKLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgewotCQlyZXR1cm4gcmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKGdldERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCAmJiBnZXRSZWdpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBnZXREb2N1bWVudFJlZ2lvbigpKS5nZXRTdGFydE9mZnNldChnZXRSZWdpb24oKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChnZXREb2N1bWVudFJlZ2lvbigpICE9IG51bGwgJiYgZ2V0UmVnaW9uKCkgIT0gbnVsbCkKLQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZ2V0RG9jdW1lbnRSZWdpb24oKSkuZ2V0VGV4dChnZXRSZWdpb24oKSk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJaWYgKGdldERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCAmJiBnZXRSZWdpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBnZXREb2N1bWVudFJlZ2lvbigpKS5nZXRUZXh0RW5kT2Zmc2V0KGdldFJlZ2lvbigpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlkb2N1bWVudFJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWF0Y2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld01hdGNoU3RyaW5nKSB7Ci0JCW1hdGNoU3RyaW5nID0gbmV3TWF0Y2hTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlKG9yZy53M2MuZG9tLk5vZGUgbmV3Tm9kZSkgewotCQlub2RlID0gbmV3Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KG9yZy53M2MuZG9tLk5vZGUgbmV3UGFyZW50KSB7Ci0JCXBhcmVudCA9IG5ld1BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVnaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9uKElUZXh0UmVnaW9uIG5ld1JlZ2lvbikgewotCQlyZWdpb24gPSBuZXdSZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1JlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbgotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGludCBuZXdSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24pIHsKLQkJcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uID0gbmV3UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IG5ld1JlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCXJlcGxhY2VtZW50TGVuZ3RoID0gbmV3UmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2VwYXJhdGUoKSB7Ci0JCS8qCi0JCSAqIGlmIChzZXBhcmF0ZSA9PSBudWxsKSB7IFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPQotCQkgKiBnZXRQcmVmZXJlbmNlTWFuYWdlcigpOyBpZihtYW5hZ2VyID09IG51bGwpIHsgc2VwYXJhdGUgPQotCQkgKiBCb29sZWFuLkZBTFNFOyB9IGVsc2UgeyBFbGVtZW50IGNhU2V0dGluZ3MgPQotCQkgKiBtYW5hZ2VyLmdldEVsZW1lbnQoUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUKTsgc2VwYXJhdGUgPSBuZXcKLQkJICogQm9vbGVhbihjYVNldHRpbmdzLmdldEF0dHJpYnV0ZShQcmVmZXJlbmNlTmFtZXMuU0VQQVJBVEUpLmVxdWFscyhQcmVmZXJlbmNlTmFtZXMuVFJVRSkpOyB9IH0KLQkJICogcmV0dXJuIHNlcGFyYXRlLmJvb2xlYW5WYWx1ZSgpOwotCQkgKi8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IHNvcnRQcm9wb3NhbHMoTGlzdCBwcm9wb3NhbHNJbikgewotCQlDb2xsZWN0aW9ucy5zb3J0KHByb3Bvc2Fsc0luLCBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gcHJvcG9zYWxzSW47Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJOb2RlOiAiICsgZ2V0Tm9kZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5QYXJlbnQ6ICIgKyBnZXRQYXJlbnQoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOiAiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERvY3VtZW50UmVnaW9uKCkudG9TdHJpbmcoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcblJlZ2lvbjogIiArIGdldFJlZ2lvbigpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5NYXRjaCBzdHJpbmc6ICciICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE1hdGNoU3RyaW5nKCkpICsgIiciIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuT2Zmc2V0czogWyIgKyBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArICItIiArIChnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArIGdldFJlcGxhY2VtZW50TGVuZ3RoKCkpICsgIl1cbiI7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGV4dEluZm9Nb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRleHRJbmZvTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMzhlNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGV4dEluZm9Nb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dEluZm9Nb2RlbFV0aWwgewotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQotCUNvbnRleHRJbmZvTW9kZWxVdGlsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jKSB7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KCkgewotCQlNb2RlbFF1ZXJ5IG1xID0gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCW1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh4bWxNb2RlbCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtcTsKLQl9Ci0KLQlwdWJsaWMgSURPTU5vZGUgZ2V0WE1MTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQlJRE9NTm9kZSB4bWxOb2RlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCXhtbE5vZGUgPSAoSURPTU5vZGUpIHhtbE1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiB4bWxOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4Yjc0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSAqIFB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBtYWtlIHRoZSBhZGRpdGlvbmFsIHByb3Bvc2FsIGluZm8gaW50byBjb250ZW50Ci0gKiBmaXQgZm9yIGFuIEhUTUwgdmlld2VyIChieSBlc2NhcGluZyBjaGFyYWN0ZXJzKQotICovCi1jbGFzcyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsIGV4dGVuZHMgVGVtcGxhdGVQcm9wb3NhbCBpbXBsZW1lbnRzIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQotCXB1YmxpYyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIEltYWdlIGltYWdlLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXN1cGVyKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGltYWdlLCByZWxldmFuY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlyZXR1cm4gU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQoYWRkaXRpb25hbEluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTAxMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLQotLyoqCi0gKiBDb250ZW50QXNzaXN0UHJvY2Vzc29yIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGluIGNvbnRlbnQgYXNzaXN0IHdoZXJlIHRoZQotICogcGFydGl0aW9uZXIgY2Fubm90IGRldGVybWluZSBhIHBhcnRpdGlvbiB0eXBlIGF0IHRoZSBjdXJyZW50IGN1cnNvcgotICogcG9zaXRpb24gKHVzdWFsbHkgYXQgRU9GKS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGNoYXIgY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIEVNUFRZX1BST1BPU0FMX1NFVCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCi0JcHVibGljIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZk5hbWVUb1Byb2Nlc3Nvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQkJaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWFkZFByb2Nlc3NvcihmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAsIGtleSwgcHJvY2Vzc29yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvY2Vzc29yKFN0cmluZyBrZXksIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvcikgewotCQlhZGRQcm9jZXNzb3IoZk5hbWVUb1Byb2Nlc3Nvck1hcCwga2V5LCBwcm9jZXNzb3IpOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRQYXJ0aXRpb25Qcm9jZXNzb3IoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyByZWxlYXNlIGlmIGl0J3MgYSBkdXBsaWNhdGUgcGFydGl0aW9uIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2Nlc3NvcihIYXNoTWFwIG1hcCwgU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCBvID0gbWFwLnJlbW92ZShrZXkpOwotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJKChJUmVsZWFzYWJsZSkgbykucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCW1hcC5wdXQoa2V5LCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEZpZ3VyZXMgb3V0IHdoYXQgdGhlIGNvcnJlY3QgSUNvbXBsZXRpb25Qcm9wb3NhbFByb2Nlc3NvciBpcyBhbmQKLQkgKiBjb21wdXRlc0NvbXBsZXRpb25Qcm9wb3NhbHMgb24gdGhhdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IG51bGw7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCi0JCXAgPSBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3Iodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCWlmIChwICE9IG51bGwpCi0JCQlyZXN1bHRzID0gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQotCQlyZXR1cm4gKHJlc3VsdHMgIT0gbnVsbCkgPyByZXN1bHRzIDogRU1QVFlfUFJPUE9TQUxfU0VUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJLy8gZ2V0IGNvbnRleHQgaW5mbyBmcm9tIHByb2Nlc3NvciB0aGF0IHdlIGVuZCB1cCB1c2luZy4uLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBjb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCS8vIHJldHVybiB0aGUgdmFsaWRhdG9yIGZvciB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIHRoYXQgd2UKLQkJLy8gdXNlZC4uLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZkVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlcyB5b3UgdGhlIGRvY3VtZW50IHBhcnRpdGlvbiB0eXBlIChTdHJpbmcpIGZvciB0aGUgZ2l2ZW4KLQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBhbmQgZG9jdW1lbnRQb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IG51bGw7Ci0JCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJcGFydGl0aW9uID0gZG9jdW1lbnQuZ2V0UGFydGl0aW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJcGFydGl0aW9uVHlwZSA9IHBhcnRpdGlvbi5nZXRUeXBlKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXBhcnRpdGlvblR5cGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBwYXJ0aXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIEd1ZXNzZXMgYSBDb250ZW50QXNzaXN0UHJvY2Vzc29yIGJhc2VkIG9uIHRoZSBUZXh0Vmlld2VyIGFuZAotCSAqIGRvY3VtZW50T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRPZmZzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ3Vlc3NDb250ZW50QXNzaXN0UHJvY2Vzc29yKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCS8vIG1hcHBpbmcgbG9naWMgaGVyZS4uLgotCQkvLyBsb29rIEAgcHJldmlvdXMgcmVnaW9uCi0JCS8vIGxvb2sgQCBwcmV2aW91cyBkb2MgcGFydGl0aW9uIHR5cGUKLQkJLy8gbG9vayBAIHBhZ2UgbGFuZ3VhZ2UKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQlpZiAoc2RSZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIGN1cnJlbnRSZWdpb25UeXBlID0gc2RSZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50IHJlZ2lvbiB0eXBlIGlzID4+ICIgKwotCQkJLy8gY3VycmVudFJlZ2lvblR5cGUpOwotCQkJaWYgKGN1cnJlbnRSZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFByZXYgPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJCWlmIChzZFByZXYgIT0gbnVsbCkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN0cmluZyBwcmV2UmVnaW9uVHlwZSA9IHNkUHJldi5nZXRUeXBlKCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInByZXZpb3VzIHJlZ2lvbiB0eXBlIGlzID4+ICIgKyBwcmV2UmVnaW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyB3b3JraW5nIHcvIHZpZXdlciAmIGRvY3VtZW50IHBhcnRpdGlvbgotCQlpZiAocCA9PSBudWxsICYmIHZpZXdlci5nZXREb2N1bWVudCgpLmdldExlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIHByZXZQYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRPZmZzZXQgLSAxKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJldmlvdXMgcGFydGl0aW9uIHR5cGUgaXMgPiAiICsKLQkJCS8vIHByZXZQYXJ0aXRpb25UeXBlKTsKLQkJCXAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQocHJldlBhcnRpdGlvblR5cGUpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEluaXRzIG1hcCBmb3IgZXh0cmEgQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgKHVzZUJlYW4sIGdldC9zZXRQcm9wZXJ0eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQkvLyBub3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZQotCX0KLQotCS8qKgotCSAqIEFkZHMgYWxsIHJlbGV2ZW50IENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIHRvIHRoZSBwYXJ0aXRpb24gdG8gcHJvY2Vzc29yCi0JICogbWFwIChqdXN0IFhNTCBoZXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciB4bWxQcm9jZXNzb3IgPSBuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQcm9jZXNzb3IoZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCwgeG1sUHJvY2Vzc29yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlyZWxlYXNlUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKTsKLQkJcmVsZWFzZU5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VNYXAoSGFzaE1hcCBtYXApIHsKLQkJaWYgKG1hcCAhPSBudWxsICYmICFtYXAuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJa2V5ID0gaXQubmV4dCgpOwotCQkJCWlmIChtYXAuZ2V0KGtleSkgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkgewotCQkJCQkoKElSZWxlYXNhYmxlKSBtYXAuZ2V0KGtleSkpLnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQltYXAuY2xlYXIoKTsKLQkJCW1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZOYW1lVG9Qcm9jZXNzb3JNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTI0MDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uIHsKLQotCXByb3RlY3RlZCBDTU5vZGUgY21ub2RlID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGVuZEluZGV4ID0gMDsKLQlwcm90ZWN0ZWQgaW50IGtpbmQgPSBJTlNFUlQ7Ci0JcHJvdGVjdGVkIGludCBzdGFydEluZGV4ID0gMDsKLQlwcm90ZWN0ZWQgT2JqZWN0IHVzZXJEYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uKENNTm9kZSBuZXdDaGlsZCwgaW50IG5ld0tpbmQsIGludCBuZXdTdGFydCwgaW50IG5ld0VuZCwgT2JqZWN0IG5ld1VzZXJEYXRhKSB7Ci0JCXN1cGVyKCk7Ci0JCWNtbm9kZSA9IG5ld0NoaWxkOwotCQlraW5kID0gbmV3S2luZDsKLQkJc3RhcnRJbmRleCA9IG5ld1N0YXJ0OwotCQllbmRJbmRleCA9IG5ld0VuZDsKLQkJdXNlckRhdGEgPSBuZXdVc2VyRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDTU5vZGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIGdldENNTm9kZSgpIHsKLQkJcmV0dXJuIGNtbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKSB7Ci0JCXJldHVybiBlbmRJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0UGFyZW50IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKSB7Ci0JCXJldHVybiBzdGFydEluZGV4OwotCX0KLQotCS8qKgotCSAqIGdldFVzZXJEYXRhIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHBlcmZvcm1BY3Rpb24gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXRDTU5vZGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q01Ob2RlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIG5ld05vZGUpIHsKLQkJY21ub2RlID0gbmV3Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RW5kSW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVuZEluZGV4KGludCBuZXdFbmRJbmRleCkgewotCQllbmRJbmRleCA9IG5ld0VuZEluZGV4OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdLaW5kCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRLaW5kKGludCBuZXdLaW5kKSB7Ci0JCWtpbmQgPSBuZXdLaW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdTdGFydEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdGFydEluZGV4KGludCBuZXdTdGFydEluZGV4KSB7Ci0JCXN0YXJ0SW5kZXggPSBuZXdTdGFydEluZGV4OwotCX0KLQotCS8qKgotCSAqIHNldFVzZXJEYXRhIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJEYXRhKE9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgYWN0aW9uTmFtZSA9IG51bGw7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJTlNFUlQgOgotCQkJCWFjdGlvbk5hbWUgPSAiSU5TRVJUIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFTU9WRSA6Ci0JCQkJYWN0aW9uTmFtZSA9ICJSRU1PVkUiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVQTEFDRSA6Ci0JCQkJYWN0aW9uTmFtZSA9ICJSRVBMQUNFIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlhY3Rpb25OYW1lID0gIlVOS05PV04gQUNUSU9OICI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBub2RlTmFtZSA9IChjbW5vZGUgIT0gbnVsbCkgPyBnZXRDTU5vZGUoKS5nZXROb2RlTmFtZSgpIDogIih1bmtub3duKSI7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYWN0aW9uTmFtZSArICI9IiArIG5vZGVOYW1lICsgIigiICsgc3RhcnRJbmRleCArICIuLi4iICsgZW5kSW5kZXggKyAiKSI7Ly8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1Byb3Bvc2FsQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUHJvcG9zYWxDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGExNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUHJvcG9zYWxDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9wb3NhbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCWludCByZWxldmFuY2UgPSAwOwotCQlpZiAobzEgaW5zdGFuY2VvZiBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsICYmIG8yIGluc3RhbmNlb2YgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJLy8gc29ydCBiYXNlZCBvbiByZWxldmFuY2UKLQkJCUlSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgY3AxID0gKElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpIG8xOwotCQkJSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCBjcDIgPSAoSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgbzI7Ci0KLQkJCXJlbGV2YW5jZSA9IGNwMi5nZXRSZWxldmFuY2UoKSAtIGNwMS5nZXRSZWxldmFuY2UoKTsKLQotCQkJLy8gaWYgc2FtZSByZWxldmFuY2UsIHNlY29uZGFyeSBzb3J0IChsZXhpZ3JhcGhpY2FsbHkpCi0JCQlpZiAocmVsZXZhbmNlID09IDAgJiYgbzEgaW5zdGFuY2VvZiBJQ29tcGxldGlvblByb3Bvc2FsICYmIG8yIGluc3RhbmNlb2YgSUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9ICgoSUNvbXBsZXRpb25Qcm9wb3NhbCkgbzEpLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSAoKElDb21wbGV0aW9uUHJvcG9zYWwpIG8yKS5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCQkJaWYgKGRpc3BsYXlTdHJpbmcxICE9IG51bGwgJiYgZGlzcGxheVN0cmluZzIgIT0gbnVsbCkKLQkJCQkJLy9yZWxldmFuY2UgPSBkaXNwbGF5U3RyaW5nMS5jb21wYXJlVG8oZGlzcGxheVN0cmluZzIpOwotCQkJCQkvLyAvLyB0aGlzIGRpZG4ndCBtaXggY2FwcyB3LyBsb3dlcmNhc2UKLQkJCQkJcmVsZXZhbmNlID0gY29tLmlibS5pY3UudGV4dC5Db2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCX0KLQkJfQotCQkvLyBvdGhlcndpc2UgaWYgaXQncyBub3QgSVNFRFJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCwgZG9uJ3Qgc29ydAotCQlyZXR1cm4gcmVsZXZhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI5OGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBKdXN0IGxpa2UgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgZXhjZXB0IGlmIGFuIGluc2VydCBvZmZzZXQgaXMgcGFzc2VkIGluLAotICogZHVyaW5nIGV2YWx1YXRpb24sIHRoZSAicHJlZml4IiBiZWZvcmUgdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2hlY2tlZCB0byBzZWUKLSAqIGlmIGl0IG1hdGNoZXMgdGhlIHRlbXBsYXRlIG5hbWUuIElmIHNvLCBvdmVyd3JpdGUgdGhlIHRlbXBsYXRlIG5hbWUuCi0gKiBPdGhlcndpc2UsIGp1c3QgaW5zZXJ0IHRoZSB0ZW1wbGF0ZSBhdCB0aGUgaW5zZXJ0IG9mZnNldCBsb2NhdGlvbiAoYnkgbm90Ci0gKiBvdmVyd3JpdGluZyB0aGUgcHJlZml4IHRleHQpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dCBleHRlbmRzIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IHsKLQlwcml2YXRlIGludCBmSW5zZXJ0T2Zmc2V0ID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LiBUaGUgc3VwcGxpZWQgPGNvZGU+UG9zaXRpb248L2NvZGU+Ci0JICogd2lsbCBiZSBxdWVyaWVkIHRvIGNvbXB1dGUgdGhlIDxjb2RlPmdldFN0YXJ0PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5nZXRFbmQ8L2NvZGU+IG1ldGhvZHMsIHdoaWNoIHdpbGwgdGhlcmVmb3JlIGFuc3dlciB1cGRhdGVkCi0JICogcG9zaXRpb24gZGF0YSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBkZXNjcmliaW5nIHRoZSBhcmVhIG9mIHRoZSBkb2N1bWVudCB3aGljaCBmb3JtcwotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGNvbnRleHQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlzdXBlcih0eXBlLCBkb2N1bWVudCwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gaW5zZXJ0T2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24gd2hlcmUgaW5zZXJ0IHdhcwotCSAqICAgICAgICAgICAgb3JpZ2luYWxseSByZXF1ZXN0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbnNlcnRPZmZzZXQpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JCWZJbnNlcnRPZmZzZXQgPSBpbnNlcnRPZmZzZXQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dCNldmFsdWF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZSkKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVCdWZmZXIgZXZhbHVhdGUoVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgVGVtcGxhdGVFeGNlcHRpb24gewotCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBzdXBlci5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGZJbnNlcnRPZmZzZXQgPiAtMSAmJiBmSW5zZXJ0T2Zmc2V0ID4gZ2V0U3RhcnQoKSkgewotCQkJCVN0cmluZyBwcmVmaXggPSBnZXREb2N1bWVudCgpLmdldChnZXRTdGFydCgpLCBmSW5zZXJ0T2Zmc2V0IC0gZ2V0U3RhcnQoKSk7Ci0JCQkJaWYgKCF0ZW1wbGF0ZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIGEgbmV3IGJ1ZmZlciB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZQotCQkJCQkvLyB0ZXh0IHRoYXQgd2FzIGdvaW5nIHRvIGJlIG92ZXJ3cml0dGVuCi0JCQkJCWJ1ZmZlciA9IG5ldyBUZW1wbGF0ZUJ1ZmZlcihwcmVmaXggKyBidWZmZXIuZ2V0U3RyaW5nKCksIGJ1ZmZlci5nZXRWYXJpYWJsZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1NpbXBsZUNNRWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2Q2YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24gewotCi0JU3RyaW5nIGZOb2RlTmFtZTsKLQotCS8qKgotCSAqIFNpbXBsZUNNRUxlbWVudERlY2xhcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNpbXBsZUNNRWxlbWVudERlY2xhcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgbm9kZU5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0Tm9kZU5hbWUobm9kZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqIAotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgQXR0cmlidXRlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDTUNvbnRlbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTUNvbnRlbnQKLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50J3MgY29udGVudCBtb2RlbC4gVGhpcyBjYW4gYmUgYW4KLQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbiBvciBhIENNR3JvdXAKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29udGVudFR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBSZXR1cm5zIG9uZSBvZiA6IEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldERhdGFUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqIAotCSAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsbHkgZGVmaW5lZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBmTm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqIAotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICogIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld05vZGVOYW1lKSB7Ci0JCWZOb2RlTmFtZSA9IG5ld05vZGVOYW1lOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1NvdXJjZUVkaXRvckltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Tb3VyY2VFZGl0b3JJbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2JkNjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1NvdXJjZUVkaXRvckltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBpbnRlcm5hbCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBvciBleHRlcm5hbAotICogICAgICAgICAgICAgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGVhZAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIgewotCi0JcHVibGljIFNvdXJjZUVkaXRvckltYWdlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCUpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI0MGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByb3RlY3RlZCBJUmVzb3VyY2UgZlJlc291cmNlID0gbnVsbDsKLQlwcml2YXRlIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBmVGVtcGxhdGVQcm9jZXNzb3IgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVGVtcGxhdGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BVFRSSUJVVEUpOwotCQlzdXBlci5hZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJc3VwZXIuYWRkRW1wdHlEb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLlRBRyk7Ci0JCXN1cGVyLmFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY2hpbGRQb3NpdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydE9mZnNldCkgewotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGlmIGFscmVhZHkgYWRkaW5nIHRlbXBsYXRlIHByb3Bvc2FscyBmb3IgYSBjZXJ0YWluIGNvbnRleHQgdHlwZSwgZG8KLQkJLy8gbm90IGFkZCBhZ2FpbgotCQlpZiAoIWZUZW1wbGF0ZUNvbnRleHRzLmNvbnRhaW5zKGNvbnRleHQpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5hZGQoY29udGV4dCk7Ci0JCQlib29sZWFuIHVzZVByb3Bvc2FsTGlzdCA9ICFjb250ZW50QXNzaXN0UmVxdWVzdC5zaG91bGRTZXBhcmF0ZSgpOwotCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldENvbnRleHRUeXBlKGNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhmVGV4dFZpZXdlciwgc3RhcnRPZmZzZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWlmICh1c2VQcm9wb3NhbExpc3QpCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQllbHNlCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRNYWNybyhwcm9wb3NhbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCS8vIGJ1ZzExNTkyNyB1c2Ugb3JpZ2luYWwgZG9jdW1lbnQgcG9zaXRpb24gZm9yIGFsbC9hbnkgcmVnaW9uIHRlbXBsYXRlcwotCQlhZGRUZW1wbGF0ZXMocmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BTEwsIGRvY3VtZW50UG9zaXRpb24pOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlmVGVtcGxhdGVDb250ZXh0cy5jbGVhcigpOwotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSA9PSBudWxsKQotCQkJZlByZWZlcmVuY2VTdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHJpdmF0ZSBYTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBYTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXJlaW5pdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotCQlpZiAocHJvcGVydHkuY29tcGFyZVRvKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkgPT0gMCB8fCBwcm9wZXJ0eS5jb21wYXJlVG8oWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpID09IDApIHsKLQkJCXJlaW5pdCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVpbml0KCkgewotCQlTdHJpbmcga2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFOwotCQlib29sZWFuIGRvQXV0byA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KTsKLQkJaWYgKGRvQXV0bykgewotCQkJa2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREU7Ci0JCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoa2V5KS50b0NoYXJBcnJheSgpOwotCQl9IGVsc2UgewotCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTE4ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlNjcmlwdExhbmd1YWdlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcyBleHRlbmRzIENvbnRlbnRBc3Npc3RVdGlscyB7Ci0JCi0gICAgLyoqCi0gICAgICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotICAgICAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uICJuZXN0ZWRDb250ZXh0Ii4KLSAgICAgKi8KLQlwcml2YXRlIGNsYXNzIERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVCA9ICJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfU0NSSVBUX1RZUEUgPSAiQ29udGVudC1TY3JpcHQtVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFEID0gIkhFQUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfRVFVSVYgPSAiSFRUUC1FUVVJViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBID0gIk1FVEEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY2xvc2luZyBwcm9wb3NhbCBnaXZlbiB0aGUKLQkgKiBjb250ZW50cyAoSW5kZXhlZFJlZ2lvbikgb2YgYSB0YWcgdGhhdCBpcyBzdGFydGVkLCBidXQgcG9zc2libHkgbm90Ci0JICogZW5kZWQKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGluZGV4ZWROb2RlCi0JICogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIHRhZyB0aGF0IGlzIHN0YXJ0ZWQgYnV0IHBvc3NpYmx5IG5vdAotCSAqICAgICAgICAgICAgZW5kZWQKLQkgKiBAcGFyYW0gcGFyZW50VGFnTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhZyBvbiB3aGljaCB5b3UgYXJlIGNoZWNraW4gZm9yIGFuIGVuZGluZyB0YWcKLQkgKiBAcGFyYW0gaW1hZ2VQYXRoCi0JICogICAgICAgICAgICBjb250ZW50IGFzc2lzdCBpbWFnZSByZWxhdGl2ZSBwYXRoIAotCSAqIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBjb21wdXRlSlNQRW5kVGFnUHJvcG9zYWwoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSwgU3RyaW5nIHBhcmVudFRhZ05hbWUsIFN0cmluZyBpbWFnZVBhdGgpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwID0gbnVsbDsKLQotCQkvLyBjaGVjayBpZiB0YWcgaXMgY2xvc2VkCi0JCWJvb2xlYW4gaGFzRW5kVGFnID0gdHJ1ZTsKLQkJYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCQlJRE9NTm9kZSB4bm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0YWdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXhub2RlID0gKChJRE9NTm9kZSkgaW5kZXhlZE5vZGUpOwotCQkJLy8gaXQncyBlbmRlZCBhbHJlYWR5Li4uCi0JCQlpZiAoeG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCUlET01Ob2RlIG9wZW5Ob2RlID0gbnVsbDsKLQkJCWlmICgheG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHBhcmVudFRhZ05hbWUpKQotCQkJCW9wZW5Ob2RlID0gKElET01Ob2RlKSB4bm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAob3Blbk5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChvcGVuTm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCWlzSlNQVGFnID0gKChJRE9NRWxlbWVudCkgb3Blbk5vZGUpLmlzSlNQVGFnKCk7Ci0JCQkJfQotCQkJCXRhZ05hbWUgPSBvcGVuTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCWhhc0VuZFRhZyA9IChvcGVuTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCi0JCS8vIGl0J3MgY2xvc2VkLCBkb24ndCBhZGQgY2xvc2UgdGFnIHByb3Bvc2FsCi0JCWlmICghaGFzRW5kVGFnICYmICFpc0pTUFRhZykgewotCi0JCQkvLyBjcmVhdGUgYXBwcm9wcmlhdGUgY2xvc2UgdGFnIHRleHQKLQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPC8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZpZXdlclRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQkJCWlmICh2aWV3ZXJUZXh0Lmxlbmd0aCgpID49IGRvY3VtZW50UG9zaXRpb24gJiYgdmlld2VyVGV4dC5sZW5ndGgoKSA+PSAyICYmIGRvY3VtZW50UG9zaXRpb24gPj0gMikgewotCQkJCVN0cmluZyBsYXN0MmNoYXJzID0gdmlld2VyVGV4dC5zdWJzdHJpbmcoZG9jdW1lbnRQb3NpdGlvbiAtIDIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8LyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXByb3Bvc2VkVGV4dCA9IHRhZ05hbWU7Ci0JCQkJZWxzZSBpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXByb3Bvc2VkVGV4dCA9ICIvIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHByb3Bvc2FsCi0JCQlwID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQgKyAiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50UG9zaXRpb24sIDAsIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VQYXRoKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF8sIChuZXcgT2JqZWN0W117cHJvcG9zZWRUZXh0fSkpLAotCQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VuZFRhZyAmJiBpc0pTUFRhZykgewotCi0JCQkvLyBjcmVhdGUgYXBwcm9wcmlhdGUgY2xvc2UgdGFnIHRleHQKLQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiJSI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2aWV3ZXJUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0KLQkJCS8vIFRPRE8gKHBhKSBtYWtlIGl0IHNtYXJ0ZXIgdG8gYWRkICIlPiIgb3IganVzdCAiPiIgaWYgJSBpcwotCQkJLy8gYWxyZWFkeSB0aGVyZS4uLgotCQkJaWYgKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gZG9jdW1lbnRQb3NpdGlvbiAmJiB2aWV3ZXJUZXh0Lmxlbmd0aCgpID49IDIpIHsKLQkJCQlTdHJpbmcgbGFzdDJjaGFycyA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlTdHJpbmcgbGFzdGNoYXIgPSB2aWV3ZXJUZXh0LnN1YnN0cmluZyhkb2N1bWVudFBvc2l0aW9uIC0gMSwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGxhc3RjaGFyLmVxdWFscygiJSIpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPCUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHJvcG9zZWRUZXh0ID0gIiUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCXByb3Bvc2VkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBjcmVhdGUgcHJvcG9zYWwKLQkJCXAgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCArICI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnRQb3NpdGlvbiwgMCwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVBhdGgpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtwcm9wb3NlZFRleHR9KSksCi0JCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHKTsKLQkJfQotCi0JCXJldHVybiBwOwotCX0KLQotCi0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGNsb3NpbmcgcHJvcG9zYWwgZ2l2ZW4gdGhlCi0JICogY29udGVudHMgKEluZGV4ZWRSZWdpb24pIG9mIGEgdGFnIHRoYXQgaXMgc3RhcnRlZCwgYnV0IHBvc3NpYmx5IG5vdAotCSAqIGVuZGVkCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHRleHQgdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBpbmRleGVkTm9kZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWcgdGhhdCBpcyBzdGFydGVkIGJ1dCBwb3NzaWJseSBub3QKLQkgKiAgICAgICAgICAgIGVuZGVkCi0JICogQHBhcmFtIHBhcmVudFRhZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YWcgb24gd2hpY2ggeW91IGFyZSBjaGVja2luIGZvciBhbiBlbmRpbmcgdGFnCi0JICogQHBhcmFtIGltYWdlUGF0aAotCSAqICAgICAgICAgICAgY29udGVudCBhc3Npc3QgcmVsYXRpdmUgaW1hZ2UgcGF0aAotCSAqIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBjb21wdXRlWE1MRW5kVGFnUHJvcG9zYWwoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSwgU3RyaW5nIHBhcmVudFRhZ05hbWUsIFN0cmluZyBpbWFnZVBhdGgpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwID0gbnVsbDsKLQotCQkvLyBjaGVjayBpZiB0YWcgaXMgY2xvc2VkCi0JCWJvb2xlYW4gaGFzRW5kVGFnID0gdHJ1ZTsKLQkJSURPTU5vZGUgeG5vZGUgPSBudWxsOwotCQlTdHJpbmcgdGFnTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQl4bm9kZSA9ICgoSURPTU5vZGUpIGluZGV4ZWROb2RlKTsKLQkJCS8vIGl0J3MgZW5kZWQgYWxyZWFkeS4uLgotCQkJaWYgKHhub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJRE9NTm9kZSBzdHlsZU5vZGUgPSBudWxsOwotCQkJaWYgKCF4bm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocGFyZW50VGFnTmFtZSkpCi0JCQkJc3R5bGVOb2RlID0gKElET01Ob2RlKSB4bm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoc3R5bGVOb2RlICE9IG51bGwpIHsKLQkJCQl0YWdOYW1lID0gc3R5bGVOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJaGFzRW5kVGFnID0gKHN0eWxlTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCi0JCS8vIGl0J3MgY2xvc2VkLCBkb24ndCBhZGQgY2xvc2UgdGFnIHByb3Bvc2FsCi0JCWlmICghaGFzRW5kVGFnKSB7Ci0KLQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBjbG9zZSB0YWcgdGV4dAotCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8LyIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmlld2VyVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQkJaWYgKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gZG9jdW1lbnRQb3NpdGlvbiAmJiB2aWV3ZXJUZXh0Lmxlbmd0aCgpID49IDIgJiYgZG9jdW1lbnRQb3NpdGlvbiA+PSAyKSB7Ci0JCQkJU3RyaW5nIGxhc3QyY2hhcnMgPSB2aWV3ZXJUZXh0LnN1YnN0cmluZyhkb2N1bWVudFBvc2l0aW9uIC0gMiwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGxhc3QyY2hhcnMuZW5kc1dpdGgoIjwvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zZWRUZXh0ID0gdGFnTmFtZTsKLQkJCQllbHNlIGlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zZWRUZXh0ID0gIi8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyBjcmVhdGUgcHJvcG9zYWwKLQkJCXAgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCArICI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnRQb3NpdGlvbiwgMCwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVBhdGgpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtwcm9wb3NlZFRleHR9KSksCi0JCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YVNjcmlwdFR5cGUoRG9jdW1lbnQgZG9jKSB7Ci0JCS8vIENhbiBub3QganVzdCBkbyBhIERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZykgYXMgdGhpcwotCQkvLyBuZWVkcwotCQkvLyB0byBiZSByZWxhdGl2ZWx5IGZhc3QuCi0JCUxpc3QgbWV0YXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoZWNrIGZvciBNRVRBIHRhZ3MgdW5kZXIgdGhlIERvY3VtZW50Ci0JCU5vZGUgaHRtbCA9IG51bGw7Ci0JCU5vZGUgaGVhZCA9IG51bGw7Ci0JCU5vZGUgY2hpbGQgPSBudWxsOwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIChwYSkgMjAwMjEyMTcKLQkJLy8gY212YyBkZWZlY3QgMjM1NTU0Ci0JCS8vIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50OiB1c2luZyBjaGlsZC5nZXROZXh0U2libGluZygpIHJhdGhlciB0aGFuCi0JCS8vIG5vZGVMaXN0KGl0ZW0pIGZvciBPKG4pIHZzLiBPKG4qbikKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCWZvciAoY2hpbGQgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkKLQkJCQltZXRhcy5hZGQoY2hpbGQpOwotCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUwpKQotCQkJCWh0bWwgPSBjaGlsZDsKLQkJfQotCQkvLyBOb2RlTGlzdCBjaGlsZHJlbiA9IGRvYy5nZXRDaGlsZE5vZGVzKCk7Ci0JCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCS8vIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJLy8gY29udGludWU7Ci0JCS8vIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkKLQkJLy8gbWV0YXMuYWRkKGNoaWxkKTsKLQkJLy8gZWxzZSBpZihjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpCi0JCS8vIGh0bWwgPSBjaGlsZDsKLQkJLy8gfQotCi0JCS8vIGNoZWNrIGZvciBNRVRBIHRhZ3MgdW5kZXIgSEVBRAotCQlpZiAoaHRtbCAhPSBudWxsKSB7Ci0JCQlmb3IgKGNoaWxkID0gaHRtbC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGwgJiYgaGVhZCA9PSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIRUFEKSkKLQkJCQkJaGVhZCA9IGNoaWxkOwotCQkJfQotCQkJLy8gY2hpbGRyZW4gPSBodG1sLmdldENoaWxkTm9kZXMoKTsKLQkJCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKSAmJiBoZWFkID09IG51bGw7IGkrKykgewotCQkJLy8gY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCS8vIGNvbnRpbnVlOwotCQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKQotCQkJLy8gaGVhZCA9IGNoaWxkOwotCQkJLy8gfQotCQl9Ci0KLQkJaWYgKGhlYWQgIT0gbnVsbCkgewotCQkJZm9yIChoZWFkLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTUVUQSkpCi0JCQkJCW1ldGFzLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCQkvLyBjaGlsZHJlbiA9IGhlYWQuZ2V0Q2hpbGROb2RlcygpOwotCQkJLy8gZm9yKGludCBpID0gMCA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkvLyBpZihjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJLy8gY29udGludWU7Ci0JCQkvLyBpZihjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTUVUQSkpCi0JCQkvLyBtZXRhcy5hZGQoY2hpbGQpOwotCQkJLy8gfQotCQl9Ci0KLQkJcmV0dXJuIGdldE1ldGFTY3JpcHRUeXBlKG1ldGFzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YVNjcmlwdFR5cGUoTGlzdCBtZXRhTm9kZUxpc3QpIHsKLQkJTm9kZSBtZXRhID0gbnVsbDsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBudWxsOwotCQlib29sZWFuIGh0dHBFcXVpdiA9IGZhbHNlOwotCQlTdHJpbmcgY29udGVudFNjcmlwdFR5cGUgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSBtZXRhTm9kZUxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCW1ldGEgPSAoTm9kZSkgbWV0YU5vZGVMaXN0LmdldChpKTsKLQkJCWF0dHJpYnV0ZXMgPSBtZXRhLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWh0dHBFcXVpdiA9IGZhbHNlOwotCQkJY29udGVudFNjcmlwdFR5cGUgPSBudWxsOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQlpZiAoYXR0cmlidXRlcy5pdGVtKGopLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVFRQX0VRVUlWKSkgewotCQkJCQlodHRwRXF1aXYgPSBhdHRyaWJ1dGVzLml0ZW0oaikuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZShDT05URU5UX1NDUklQVF9UWVBFKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0cmlidXRlcy5pdGVtKGopLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShDT05URU5UKSkgewotCQkJCQljb250ZW50U2NyaXB0VHlwZSA9IGF0dHJpYnV0ZXMuaXRlbShqKS5nZXROb2RlVmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaHR0cEVxdWl2ICYmIGNvbnRlbnRTY3JpcHRUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIGNvbnRlbnRTY3JpcHRUeXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSB0aGUgc2NyaXB0Tm9kZSBpcyBpbiBDdXJyZW50bHkgcmV0dXJucwotCSAqIGphdmFzY3JpcHQgdW5sZXNzIHNvbWUgdW5rbm93biB0eXBlIG9yIGxhbmd1YWdlIGlzIHNwZWNpZmllZC4gVGhlbiB0aGUKLQkgKiB1bmtub3duIHR5cGUvbGFuZ3VhZ2UgaXMgcmV0dXJuZWQKLQkgKiAKLQkgKiBAcGFyYW0gc2NyaXB0Tm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNjcmlwdExhbmd1YWdlKE5vZGUgc2NyaXB0Tm9kZSkgewotCQlOb2RlIGF0dHIgPSBudWxsOwotCi0JCWJvb2xlYW4gc3BlY2lmaWVkID0gZmFsc2U7Ci0JCS8vIHRyeSB0byBmaW5kIGEgc2NyaXB0aW5nIGFkYXB0ZXIgZm9yICd0eXBlJwotCQlpZiAoKHNjcmlwdE5vZGUgPT0gbnVsbCkgfHwgKHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlcygpID09IG51bGwpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJYXR0ciA9IHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgidHlwZSIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJc3BlY2lmaWVkID0gdHJ1ZTsKLQkJCVN0cmluZyB0eXBlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQl9Ci0JCS8vIG5vdyB0cnkgdG8gZmluZCBhIHNjcmlwdGluZyBhZGFwdGVyIGZvciAnbGFuZ3VhZ2UnIChkZXByZWNhdGVkIGJ5Ci0JCS8vIEhUTUwgc3BlY2lmaWNhdGlvbnMpCi0JCWF0dHIgPSBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImxhbmd1YWdlIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlzcGVjaWZpZWQgPSB0cnVlOwotCQkJU3RyaW5nIGxhbmd1YWdlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQkJLy8gY2hlY2sgaWYgb25lIGlzIHNwZWNpZmllZCBieSBhIE1FVEEgdGFnIGF0IHRoZSByb290IGxldmVsIG9yIGluc2lkZQotCQkvLyBvZiBIRUFECi0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJaWYgKCFzcGVjaWZpZWQpCi0JCQl0eXBlID0gZ2V0TWV0YVNjcmlwdFR5cGUoc2NyaXB0Tm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlzcGVjaWZpZWQgPSB0cnVlOwotCQkJcmV0dXJuIGxvb2t1cFNjcmlwdFR5cGUodHlwZSk7Ci0JCX0KLQkJLy8gcmV0dXJuIGRlZmF1bHQKLQkJaWYgKCFzcGVjaWZpZWQpCi0JCQlyZXR1cm4gU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgdGhlICU+IGRlbGltaXRlcgotCSAqIAotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BDbG9zZURlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuKSB7Ci0JCWlmIChmbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNKU1BDbG9zZURlbGltaXRlcihmbi5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BDbG9zZURlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NMT1NFKSB8fCB0eXBlLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZWxscyB5b3UgaWYgdGhlIGZsYXRub2RlIGlzIHRoZSBKU1AgcmVnaW9uIDwlJT4sIDwlPSU+LCA8JSElPgotCSAqIAotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbikgewotCQlib29sZWFuIGlzRGVsaW1pdGVyID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZm4uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlpc0RlbGltaXRlciA9IGlzSlNQRGVsaW1pdGVyKHR5cGUpOwotCQl9Ci0JCXJldHVybiBpc0RlbGltaXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQRGVsaW1pdGVyKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoaXNKU1BPcGVuRGVsaW1pdGVyKHR5cGUpIHx8IGlzSlNQQ2xvc2VEZWxpbWl0ZXIodHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgPCUsIDwlPSwgb3IgPCUhIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mCi0JICogaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcyB3YXkgZm9yIGV4cGVkZW5jeS4KLQkgKiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BPcGVuRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJaWYgKGZuID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc0pTUE9wZW5EZWxpbWl0ZXIoZm4uZ2V0VHlwZSgpKTsKLQl9Ci0KLSAgICAvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQT3BlbkRlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX1NDUklQVExFVF9PUEVOKSB8fCB0eXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCB0eXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9FWFBSRVNTSU9OX09QRU4pKTsKLQl9Ci0KLQkvKioKLQkgKiBUZWxscyB5b3UgaWYgdGhlIGZsYXRub2RlIGlzIHRoZSA8anNwOnNjcmlwdGxldD4sIDxqc3A6ZXhwcmVzc2lvbj4sIG9yCi0JICogPGpzcDpkZWNsYXJhdGlvbj50YWcKLQkgKiAKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MSlNQRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJYm9vbGVhbiBpc0RlbGltaXRlciA9IGZhbHNlOwotCQlpZiAoZm4gIT0gbnVsbCAmJiBmbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlPYmplY3RbXSByZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZm4pLmdldFJlZ2lvbnMoKS50b0FycmF5KCk7Ci0JCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCXRlbXAgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnNbaV07Ci0JCQkJaWYgKHRlbXAuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCXJlZ2lvblRleHQgPSBmbi5nZXRUZXh0KHRlbXApOwotCQkJCQlpZiAocmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6c2NyaXB0bGV0IikgfHwgcmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZXhwcmVzc2lvbiIpIHx8IHJlZ2lvblRleHQuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRlY2xhcmF0aW9uIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlpc0RlbGltaXRlciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0RlbGltaXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICJqYXZhc2NyaXB0IiBpZiBsYW5ndWFnZSBhdHRyaWJ1dGUgaXMgc29tZSBmb3JtIG9mIGphdmFzY3JpcHQsCi0JICogImphdmEiIGlmIGxhbmd1YWdlIGF0dHJpYnV0ZSBpcyBzb21lIGZvcm0gb2YgamF2YS4gT3RoZXJ3aXNlLCBqdXN0Ci0JICogcmV0dXJucyB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvb2t1cFNjcmlwdExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpKQotCQkJCXJldHVybiBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVDsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQV9MQU5HVUFHRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpKQotCQkJCXJldHVybiBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQTsKLQkJfQotCQlyZXR1cm4gbGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAiamF2YXNjcmlwdCIgaWYgdHlwZSAodXNlZCBpbiA8c2NyaXB0IHR5cGU9Inh4eCI+IGlzIGFjdHVhbGx5Ci0JICogamF2YXNjcmlwdCB0eXBlLiBPdGhlcndpc2UsIGp1c3QgcmV0dXJucyB0eXBlCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb29rdXBTY3JpcHRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTUlNRV9UWVBFX0tFWVMubGVuZ3RoOyBpKyspCi0JCQlpZiAoU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTUlNRV9UWVBFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkKLQkJCQlyZXR1cm4gU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFQ7Ci0JCXJldHVybiB0eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzg3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQXR0cmlidXRlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGF0dHJEZWNsID09IG51bGwgfHwgYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCB1c2FnZSA9IGF0dHJEZWNsLmdldFVzYWdlKCk7Ci0JCWlmICh1c2FnZSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdlbmVyYXRlUmVxdWlyZWRBdHRyaWJ1dGUobnVsbCwgYXR0ckRlY2wsIGJ1ZmZlcik7IC8vIHRvZG8gcGFzcwotCQkJLy8gb3duZXJOb2RlIGFzCi0JCQkvLyAxc3QgcGFyYW0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVFbmRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJYnVmZmVyLmFwcGVuZCgiPC8iICsgdGFnTmFtZSArICI+Iik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlUmVxdWlyZWRBdHRyaWJ1dGUoTm9kZSBvd25lck5vZGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGF0dHJEZWNsID09IG51bGwgfHwgYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYXR0cmlidXRlIG5hbWUKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBnZXRSZXF1aXJlZE5hbWUob3duZXJOb2RlLCBhdHRyRGVjbCk7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQkvLyA9IHNpZ24KLQkJYnVmZmVyLmFwcGVuZChhdHRyaWJ1dGVOYW1lICsgIj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGF0dHJpYnV0ZSB2YWx1ZQotCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJLy8gaW5zZXJ0IGFueSB2YWx1ZSB0aGF0IGlzIGltcGxpZWQKLQkJCWlmIChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUgJiYgYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQkJfQotCQkJLy8gb3RoZXJ3aXNlLCBpZiBhbiBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWVzIGV4aXN0cywgdXNlIHRoZQotCQkJLy8gZmlyc3QgdmFsdWUKLQkJCWVsc2UgaWYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSAhPSBudWxsICYmIGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKClbMF0pOwotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwgfHwgYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWJ1ZmZlci5hcHBlbmQoIjwiICsgdGFnTmFtZSk7Ly8kTk9OLU5MUy0xJAotCQlnZW5lcmF0ZUF0dHJpYnV0ZXMoZWxlbWVudERlY2wsIGJ1ZmZlcik7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3RhcnRUYWdDbG9zZShwYXJlbnROb2RlLCBlbGVtZW50RGVjbCkpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIGludCBnZXRNaW5pbWFsU3RhcnRUYWdMZW5ndGgoTm9kZSBub2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpZiAocmVxdWlyZXNBdHRyaWJ1dGVzKGVsZW1lbnREZWNsKSkgewotCQkJcmV0dXJuIGdldFJlcXVpcmVkTmFtZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCkgKyAyOyAvLyA8ICsKLQkJCS8vIG5hbWUgKwotCQkJLy8gc3BhY2UKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAxICsgZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGVsZW1lbnREZWNsKS5sZW5ndGgoKSArIGdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpOyAvLyA8ICsKLQkJCS8vIG5hbWUKLQkJCS8vICsKLQkJCS8vIGFwcHJvcHJpYXRlCi0JCQkvLyBjbG9zZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdGhlckNsb3NlKE5vZGUgbm90QVRhZ05vZGUpIHsKLQkJaWYgKG5vdEFUYWdOb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9ICgoSURPTU5vZGUpIG5vdEFUYWdOb2RlKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE51bWJlck9mUmVnaW9ucygpID4gMSAmJiBub2RlLmdldFJlZ2lvbnMoKS5nZXQoMCkuZ2V0VHlwZSgpLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfT1BFTikpIHsKLQkJCQlyZXR1cm4gIiU+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWdDbG9zZShOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCVN0cmluZyBvdGhlciA9IGdldE90aGVyQ2xvc2UocGFyZW50Tm9kZSk7Ci0JCWlmIChvdGhlciAhPSBudWxsKQotCQkJcmV0dXJuIG90aGVyOwotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybiAiPiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCXJldHVybiAiLz4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxSZWxldmFuY2VDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFJlbGV2YW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWMzNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFJlbGV2YW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLQotCi0KLS8qKgotICogc29tZSByZWxldmFuY2UgY29uc3RhbnRzIGZvciBjb250ZW50IGFzc2lzdCBoaWdoZXIgcmVsZXZhbmNlIG1lYW5zIGl0IHNob3dzCi0gKiB1cCBoaWdoZXIgb24gdGhlIGxpc3QKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxSZWxldmFuY2VDb25zdGFudHMgZXh0ZW5kcyBJUmVsZXZhbmNlQ29uc3RhbnRzIHsKLQotCWludCBSX0NEQVRBID0gNDAwOwotCWludCBSX0NMT1NFX1RBRyA9IDE1MDA7Ci0KLQlpbnQgUl9DT01NRU5UID0gMTAwOwotCi0JLy8gbW92ZWQgdGhpcyBhYm92ZSBtYWNyb3MKLQlpbnQgUl9ET0NUWVBFID0gNjAwOwotCWludCBSX0VORF9UQUcgPSAxNDAwOwotCWludCBSX0VORF9UQUdfTkFNRSA9IDExMDA7Ci0JaW50IFJfRU5USVRZID0gMTAwMDsKLQlpbnQgUl9KU1AgPSA1MDA7Ci0KLQlpbnQgUl9KU1BfQVRUUklCVVRFX1ZBTFVFID0gNzAwOwotCi0JLy8gKHBhKSBtYWtlIHRoZXNlIHRoZSBzYW1lIHJlbGV2YW5jZSBzbyBwcm9wb3NhbHMgYXJlIHNhbWUgb3JkZXIgZm9yIFY1MDEKLQlpbnQgUl9NQUNSTyA9IDUwMDsKLQotCS8vIGFkZCB0aGlzIG9udG8gInJlcXVpcmVkIiBhdHRycywgZWxlbWVudHMsIGV0YyB0byBidWJibGUgdGhlbSB1cCBvbgotCS8vIHNvcnRpbmcuLi4KLQkvLyBDTVZDIDI0NjYxOAotCWludCBSX1JFUVVJUkVEID0gMTA7Ci0JaW50IFJfVEFHX0lOU0VSVElPTiA9IDUwMDsKLSAgICBpbnQgUl9TVFJJQ1RMWV9WQUxJRF9UQUdfSU5TRVJUSU9OID0gNjAwOwotCWludCBSX1RBR19OQU1FID0gMTIwMDsKLQlpbnQgUl9YTUxfQVRUUklCVVRFX05BTUUgPSA5MDA7Ci0JaW50IFJfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDgwMDsKLQlpbnQgUl9YTUxfREVDTEFSQVRJT04gPSAxMzAwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwMmQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLS8qKgotICogQ29tcGxldGlvbiBwcm9jZXNzb3IgZm9yIFhNTCBUZW1wbGF0ZXMuIE1vc3Qgb2YgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lIGJ5Ci0gKiB0aGUgWE1MIENvbnRlbnQgQXNzaXN0IHByb2Nlc3Nvciwgc28gYnkgdGhlIHRpbWUgdGhlCi0gKiBYTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgaXMgYXNrZWQgZm9yIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FscywgdGhlCi0gKiBYTUwgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGhhcyBhbHJlYWR5IHNldCB0aGUgY29udGV4dCB0eXBlIGZvcgotICogdGVtcGxhdGVzLgotICovCi1jbGFzcyBYTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByb3Bvc2FsQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCXJldHVybiAoKFRlbXBsYXRlUHJvcG9zYWwpIG8yKS5nZXRSZWxldmFuY2UoKSAtICgoVGVtcGxhdGVQcm9wb3NhbCkgbzEpLmdldFJlbGV2YW5jZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBmZ1Byb3Bvc2FsQ29tcGFyYXRvciA9IG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIFN0cmluZyBmQ29udGV4dFR5cGVJZCA9IG51bGw7Ci0KLQkvKgotCSAqIENvcGllZCBmcm9tIHN1cGVyIGNsYXNzIGV4Y2VwdCBpbnN0ZWFkIG9mIGNhbGxpbmcgY3JlYXRlQ29udGV4dCh2aWV3ZXIsCi0JICogcmVnaW9uKSBjYWxsIGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQkvLyBhZGp1c3Qgb2Zmc2V0IHRvIGVuZCBvZiBub3JtYWxpemVkIHNlbGVjdGlvbgotCQlpZiAoc2VsZWN0aW9uLmdldE9mZnNldCgpID09IG9mZnNldCkKLQkJCW9mZnNldCA9IHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQotCQlTdHJpbmcgcHJlZml4ID0gZXh0cmFjdFByZWZpeCh2aWV3ZXIsIG9mZnNldCk7Ci0JCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCAtIHByZWZpeC5sZW5ndGgoKSwgcHJlZml4Lmxlbmd0aCgpKTsKLQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCi0JCS8vIG5hbWUgb2YgdGhlIHNlbGVjdGlvbiB2YXJpYWJsZXMge2xpbmUsIHdvcmR9X3NlbGVjdGlvbgotCQljb250ZXh0LnNldFZhcmlhYmxlKCJzZWxlY3Rpb24iLCBzZWxlY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlW10gdGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKTsKLQotCQlMaXN0IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLnZhbGlkYXRlKHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCQl9Ci0JCQljYXRjaCAoVGVtcGxhdGVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHRlbXBsYXRlLm1hdGNoZXMocHJlZml4LCBjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXR5cGUgPSByZWdpc3RyeS5nZXRDb250ZXh0VHlwZShmQ29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCS8vIGp1c3QgcmV0dXJuIHRoZSBzYW1lIGltYWdlIGZvciBub3cKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX01BQ1JPKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCX0KLQotCXZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJZkNvbnRleHRUeXBlSWQgPSBjb250ZXh0VHlwZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmU0YzQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQWRhcHRzIGEgRE9NIG5vZGUgdG8gYSBKRmFjZSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVBZGFwdGVyIGltcGxlbWVudHMgSUpGYWNlTm9kZUFkYXB0ZXIgewotCi0JZmluYWwgc3RhdGljIENsYXNzIEFEQVBURVJfS0VZID0gSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBkZWJ1ZyAub3B0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGdldERlYnVnVmFsdWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0RGVidWdWYWx1ZSgpIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvb3V0bGluZSIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBSZWZyZXNoU3RydWN0dXJlSm9iIGZSZWZyZXNoSm9iID0gbnVsbDsKLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZkFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZUltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsgLy8gYWN0dWFsbHksIFRFWFQgc2hvdWxkIG5ldmVyIGJlIHNlZW4gaW4KLQkJCQkvLyB0aGUgdHJlZQotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DREFUQVNFQ1RJT04pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQljYXNlIE5vZGUuRU5USVRZX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5USVRZKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPQ0VTU0lOR0lOU1RSVUNUSU9OKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09NTUVOVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0RPQ1RZUEUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfTk9UQVRJT04pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VSZXNvdXJjZU5hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VSZXNvdXJjZU5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gKHBhKSAyMDAyMTIxNwotCQkvLyBjbXZjIGRlZmVjdCAyMzU1NTQKLQkJLy8gcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQ6IHVzaW5nIGNoaWxkLmdldE5leHRTaWJsaW5nKCkgcmF0aGVyIHRoYW4KLQkJLy8gbm9kZUxpc3QoaXRlbSkgZm9yIE8obikgdnMuIE8obipuKQotCQkvLwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJTm9kZSBuID0gY2hpbGQ7Ci0JCQlpZiAobi5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJCXYuYWRkKG4pOwotCQl9Ci0JCXJldHVybiB2LnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIHdpdGggdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gVGhlc2UgYXJlIHRoZSB0b3AgbGV2ZWwgaXRlbXMgaW4gYSBsaXN0LCB0cmVlLCB0YWJsZSwgZXRjLi4uCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBub2RlKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBGZXRjaGVzIHRoZSBsYWJlbCBpbWFnZSBzcGVjaWZpYyB0byB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0TGFiZWxJbWFnZShPYmplY3Qgbm9kZSkgewotCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKENNSW1hZ2VVdGlsLmdldERlY2xhcmF0aW9uKChOb2RlKSBub2RlKSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsICYmIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKSAhPSBudWxsKSB7Ci0JCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBnZXROb2RlTmFtZShub2RlKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQobm9kZU5hbWUpOwotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlpbWFnZSA9IGNyZWF0ZUltYWdlKG5vZGUpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlpbWFnZVJlZ2lzdHJ5LnB1dChub2RlTmFtZSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBGZXRjaGVzIHRoZSBsYWJlbCB0ZXh0IHNwZWNpZmljIHRvIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KE9iamVjdCBub2RlKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZShub2RlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROb2RlTmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZ0J1ZmZlciBub2RlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJbm9kZU5hbWUuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJbm9kZU5hbWUuaW5zZXJ0KDAsICJET0NUWVBFOiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5vZGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCXJldHVybiBub2RlLmdldFBhcmVudE5vZGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBSZWZyZXNoU3RydWN0dXJlSm9iIGdldFJlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUmVmcmVzaEpvYiA9PSBudWxsKQotCQkJZlJlZnJlc2hKb2IgPSBuZXcgUmVmcmVzaFN0cnVjdHVyZUpvYigpOwotCQlyZXR1cm4gZlJlZnJlc2hKb2I7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIChwYSkgMjAwMjEyMTcKLQkJLy8gY212YyBkZWZlY3QgMjM1NTU0ID4gdXNlIGNoaWxkLmdldE5leHRTaWJsaW5nKCkgaW5zdGVhZCBvZgotCQkvLyBub2RlTGlzdChpdGVtKSBmb3IgTyhuKSB2cy4gTyhuKm4pCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0eXBlLmVxdWFscyhBREFQVEVSX0tFWSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBvYmplY3QgYmVpbmcgYWRhcHRlciAodGhlIG5vdGlmaWVyKSB3aGVuIHNvbWV0aGluZyBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBmdXR1cmVfVE9ETzogdGhlICd1aWpvYnMnIHVzZWQgaW4gdGhpcyBtZXRob2Qgd2VyZSBhZGRlZCB0byBzb2x2ZQotCQkvLyB0aHJlYWRpbmcgcHJvYmxlbXMgd2hlbiB0aGUgZG9tCi0JCS8vIGlzIHVwZGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgd2hpbGUgdGhlIGVkaXRvciBpcyBvcGVuLiBUaGV5IG1heSBiZQotCQkvLyBhIGJpdCBvdmVya2lsbCBhbmQgbm90IHRoYXQgdXNlZnVsLgotCQkvLyAoVGhhdCBpcywgbWF5IGJlIGJlIHdvcnRoeSBvZiBqb2IgbWFuYWdlciBtYW5hZ2VtZW50KS4gSWYgdGhleSBhcmUKLQkJLy8gZm91bmQgdG8gYmUgaW1wb3J0YW50IGVub3VnaCB0byBsZWF2ZSBpbiwKLQkJLy8gdGhlcmUncyBwcm9iYWJseSBzb21lIG9wdGltaXphdGlvbiB0aGF0IGNhbiBiZSBkb25lLgotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3RlbmVycyA9IGZBZGFwdGVyRmFjdG9yeS5nZXRMaXN0ZW5lcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0KLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNjM3Ci0JCQkJLy8gaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSAmJiAobGlzdGVuZXIgaW5zdGFuY2VvZgotCQkJCS8vIFN0cnVjdHVyZWRWaWV3ZXIpICYmIChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLkNIQU5HRSAmJiBjaGFuZ2VkRmVhdHVyZSA9PSBudWxsKSkpIHsKLQkJCQlpZiAoKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgJiYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCB8fCAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpGYWNlTm9kZUFkYXB0ZXIgbm90aWZpZWQgb24gZXZlbnQgdHlwZSA+ICIgKyBldmVudFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQkvLyByZWZyZXNoIG9uIHN0cnVjdHVyYWwgYW5kICJ1bmtub3duIiBjaGFuZ2VzCi0JCQkJCVN0cnVjdHVyZWRWaWV3ZXIgc3RydWN0dXJlZFZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lcjsKLQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUyMzAKLQkJCQkJaWYgKHN0cnVjdHVyZWRWaWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwpIHsKLQkJCQkJCWdldFJlZnJlc2hKb2IoKS5yZWZyZXNoKHN0cnVjdHVyZWRWaWV3ZXIsIChOb2RlKSBub3RpZmllcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU4YjQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLS8qKgotICogQW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZU5vZGVBZGFwdGVycy4gVXNlIHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0gKiB3aXRoIGEgSkZhY2VBZGFwdGVyQ29udGVudFByb3ZpZGVyIHRvIGRpc3BsYXkgRE9NIG5vZGVzIGluIGEgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCQlpZiAobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEIHx8IG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSB7Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJaWYgKGNtRG9jdW1lbnRNYW5hZ2VyLmdldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQpKSB7Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VycygpIHsKLQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQkJZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgbGlzdGVuZXJzW2ldOwotCQkJCQlKb2IgcmVmcmVzaCA9IG5ldyBVSUpvYihYTUxVSU1lc3NhZ2VzLnJlZnJlc2hvdXRsaW5lXzApIHsKLQkJCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJQ29udHJvbCByZWZyZXNoQ29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQkJCQkJaWYgKHJlZnJlc2hDb250cm9sICE9IG51bGwgJiYgIXJlZnJlc2hDb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgVmlld2VyKSB7Ci0JCQkJCWZpbmFsIFZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCUpvYiByZWZyZXNoID0gbmV3IFVJSm9iKFhNTFVJTWVzc2FnZXMucmVmcmVzaG91dGxpbmVfMCkgewotCQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQlDb250cm9sIHJlZnJlc2hDb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAocmVmcmVzaENvbnRyb2wgIT0gbnVsbCAmJiAhcmVmcmVzaENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlyZWZyZXNoLnNldFN5c3RlbSh0cnVlKTsKLQkJCQkJcmVmcmVzaC5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJCQlyZWZyZXNoLnNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcjsKLQlwcml2YXRlIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXJJbXBsIGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyID0gbnVsbDsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgU2V0IGZMaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBzaW5nbGV0b25BZGFwdGVyOwotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEpGYWNlIGFkYXB0ZXIgZm9yIHRoZSBET00gbm9kZSBwYXNzZWQgaW4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCWlmIChzaW5nbGV0b25BZGFwdGVyID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSB0aGUgSkZhY2VOb2RlQWRhcHRlcgotCQkJc2luZ2xldG9uQWRhcHRlciA9IG5ldyBKRmFjZU5vZGVBZGFwdGVyKHRoaXMpOwotCQkJaW5pdEFkYXB0ZXIoc2luZ2xldG9uQWRhcHRlciwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkFkYXB0ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiByZXR1cm5zICJjb3B5IiBzbyBubyBvbmUgY2FuIG1vZGlmeSBvdXIgbGlzdC4gSXQgaXMgYSBzaGFsbG93IGNvcHkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uIGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoZkxpc3RlbmVycyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIsIElOb2RlTm90aWZpZXIgbm9kZSkgewotCQkvLyByZWdpc3RlciBmb3IgQ01Eb2N1bWVudE1hbmFnZXIgZXZlbnRzCi0JCU1vZGVsUXVlcnlBZGFwdGVyIG1xYWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgbm9kZS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKG1xYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1xdWVyeSA9IG1xYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCk7Ci0JCQlpZiAobXF1ZXJ5ICE9IG51bGwgJiYgbXF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCWNtRG9jdW1lbnRNYW5hZ2VyID0gbXF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwoKTsKLQkJCQljbURvY3VtZW50TWFuYWdlci5hZGRMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZXJlZ2lzdGVyIGZyb20gQ01Eb2N1bWVudE1hbmFnZXIgZXZlbnRzCi0JCWlmIChjbURvY3VtZW50TWFuYWdlciAhPSBudWxsICYmIGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWNtRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCQlmTGlzdGVuZXJzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgewotCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzI3YjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogQW4gSVRyZWVDb250ZW50UHJvdmlkZXIgZm9yIGEgVHJlZVZpZXdlcnMgdXNlZCB0byBkaXNwbGF5IERPTSBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciB0YWtlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlIGFkYXB0ZXJzIGZvciB0aGUKLSAqIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikKLQkJCQlyZXR1cm4gKElKRmFjZU5vZGVBZGFwdGVyKSBhZGFwdGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVGhlIHJvb3QgaXMgdXN1YWxseSBhbiBpbnN0YW5jZSBvZiBhbiBYTUxTdHJ1Y3R1cmVkTW9kZWwgaW4KLQkJLy8gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGV4dHJhY3QgdGhlIGRvY3VtZW50LgotCQlPYmplY3QgdG9wTm9kZSA9IG9iamVjdDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElET01Nb2RlbCkKLQkJCXRvcE5vZGUgPSAoKElET01Nb2RlbCkgb2JqZWN0KS5nZXREb2N1bWVudCgpOwotCi0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKHRvcE5vZGUpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyh0b3BOb2RlKTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChvbGRJbnB1dCAhPSBudWxsICYmIG9sZElucHV0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRNb2RlbCkgewotCQkJSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KSAoKElTdHJ1Y3R1cmVkTW9kZWwpIG9sZElucHV0KS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LnJlbW92ZUxpc3RlbmVyKHZpZXdlcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5ld0lucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgbmV3SW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDcyZGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLQotLyoqCi0gKiBBIGxhYmVsIHByb3ZpZGVyIGJhY2tlZCBieSBKRmFjZU5vZGVBZGFwdGVycy4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkZhY2UgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGFkYXB0YWJsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGdldCB0aGUgYWRhcHRlciBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgSUpGYWNlTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlKSB7Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9ICgoSU5vZGVOb3RpZmllcikgYWRhcHRhYmxlKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUpGYWNlTm9kZUFkYXB0ZXIpCi0JCQkJcmV0dXJuIChJSkZhY2VOb2RlQWRhcHRlcikgYWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoZWxlbWVudCkuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcihlbGVtZW50KS5nZXRMYWJlbFRleHQoZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9SZWZyZXNoU3RydWN0dXJlSm9iLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUmVmcmVzaFN0cnVjdHVyZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmI5MGJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9SZWZyZXNoU3RydWN0dXJlSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGpvYiBob2xkcyBhIHF1ZXVlIG9mIHVwZGF0ZXMgKGFmZmVjdGVkIG5vZGVzKSBmb3IgbXVsdGlwbGUgc3RydWN0dXJlZAotICogdmlld2Vycy4gV2hlbiBhIG5ldyByZXF1ZXN0IGNvbWVzIGluLCB0aGUgY3VycmVudCBydW4gaXMgY2FuY2VsbGVkLCB0aGUgbmV3Ci0gKiByZXF1ZXN0IGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgdGhlbiB0aGUgam9iIGlzIHJlLXNjaGVkdWxlZC4gU3VwcG9ydCBmb3IKLSAqIG11bHRpcGxlIHN0cnVjdHVyZWQgdmlld2VycyBpcyByZXF1aXJlZCBiZWNhdXNlIHJlZnJlc2ggdXBkYXRlcyBhcmUgdXN1YWxseQotICogdHJpZ2dlcmVkIGJ5IG1vZGVsIGNoYW5nZXMsIGFuZCB0aGUgbW9kZWwgbWF5IGJlIHZpc2libGUgaW4gbW9yZSB0aGFuIG9uZQotICogdmlld2VyLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBSZWZyZXNoU3RydWN0dXJlSm9iIGV4dGVuZHMgSm9iIHsKLQotCS8qKiBkZWJ1ZyBmbGFnICovCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfREVMQVkgPSAyNTA7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVmcmVzaFN0cnVjdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqIExpc3Qgb2YgcmVmcmVzaCByZXF1ZXN0cyAoTm9kZXMpICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZSZXF1ZXN0czsKLQkvKiogdGhlIHN0cnVjdHVyZWQgdmlld2VycyAqLwotCUxpc3QgZlZpZXdlcnMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCi0JcHVibGljIFJlZnJlc2hTdHJ1Y3R1cmVKb2IoKSB7Ci0JCXN1cGVyKFhNTFVJTWVzc2FnZXMucmVmcmVzaG91dGxpbmVfMCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCWZSZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSZXF1ZXN0KE5vZGUgbm9kZSkgewotCQlpbnQgc2l6ZSA9IGZSZXF1ZXN0cy5zaXplKCk7Ci0JCWlmIChzaXplID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkvKgotCQkJCSAqIElmIHdlIGFscmVhZHkgaGF2ZSBhIHJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIG5ldwotCQkJCSAqIHJlcXVlc3QsIGRpc2NhcmQgdGhlIG5ldyByZXF1ZXN0Ci0JCQkJICovCi0JCQkJTm9kZSBub2RlMiA9IChOb2RlKSBmUmVxdWVzdHMuZ2V0KGkpOwotCQkJCWlmIChjb250YWlucyhub2RlMiwgbm9kZSkpCi0JCQkJCXJldHVybjsKLQkJCQkvKgotCQkJCSAqIElmIG5ldyByZXF1ZXN0IGNvbnRhaW5zIGFueSBleGlzdGluZyByZXF1ZXN0cywgcmVwbGFjZSBpdAotCQkJCSAqIHdpdGggbmV3IHJlcXVlc3QKLQkJCQkgKi8KLQkJCQlpZiAoY29udGFpbnMobm9kZSwgbm9kZTIpKSB7Ci0JCQkJCWZSZXF1ZXN0cy5zZXQoaSwgbm9kZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLyoqCi0JCQkJICogTm9uZSBvZiB0aGUgYWJvdmUsIGhhdmUgYSBzZXBhcmF0ZSByZWZyZXNoIHN1YnRyZWUsIHRoZW4uCi0JCQkJICovCi0JCQkJZlJlcXVlc3RzLmFkZChub2RlKTsKLQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZlJlcXVlc3RzLmFkZChub2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkVmlld2VyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmICghZlZpZXdlcnMuY29udGFpbnModmlld2VyKSkgewotCQkJZlZpZXdlcnMuYWRkKHZpZXdlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9vdAotCSAqIEBwYXJhbSBwb3NzaWJsZQotCSAqIEByZXR1cm4gaWYgdGhlIHJvb3QgaXMgcGFyZW50IG9mIHBvc3NpYmxlLCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlCi0JICogICAgICAgICByZXR1cm4gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoTm9kZSByb290LCBOb2RlIHBvc3NpYmxlKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlY3Vyc2l2ZSBjYWxsIHcvIHJvb3Q6ICIgKyByb290LmdldE5vZGVOYW1lKCkgKyAiIGFuZCBwb3NzaWJsZTogIiArIHBvc3NpYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHRoZSBmb2xsb3dpbmcgY2hlY2tzIGFyZSBpbXBvcnRhbnQKLQkJLy8gI2RvY3VtZW50IG5vZGUgd2lsbCBicmVhayB0aGUgYWxnb3JpdGhtIG90aGVyd2lzZQotCi0JCS8vIGNhbid0IGNvbnRhaW4gdGhlIGNoaWxkIGlmIGl0J3MgbnVsbAotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXR1cm5pbmcgZmFsc2U6IHJvb3QgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gbm90aGluZyBjYW4gYmUgcGFyZW50IG9mIERvY3VtZW50IG5vZGUKLQkJaWYgKHBvc3NpYmxlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyBmYWxzZTogcG9zc2libGUgaXMgRG9jdW1lbnQgbm9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZG9jdW1lbnQgY29udGFpbnMgZXZlcnl0aGluZwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXR1cm5pbmcgdHJ1ZTogcm9vdCBpcyBEb2N1bWVudCBub2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gY2hlY2sgcGFyZW50YWdlCi0JCU5vZGUgY3VycmVudCA9IHBvc3NpYmxlOwotCQkvLyBsb29wIHBhcmVudHMKLQkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkvLyBmb3VuZCBpdAotCQkJaWYgKHJvb3QuZXF1YWxzKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICEhISBmb3VuZDogIiArIHBvc3NpYmxlLmdldE5vZGVOYW1lKCkgKyAiIGluIHN1YmVsZW1lbnQgb2Y6ICIgKyByb290LmdldE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZXZlciBmb3VuZCBpdAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZnJlc2ggb246IFsiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZXdlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCF2aWV3ZXJzW2ldLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKHRydWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKG5vZGUsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgISEhIHNraXBwZWQgcmVmcmVzaGluZyBkaXNwb3NlZCB2aWV3ZXI6ICIgKyB2aWV3ZXJzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhbHNvIHN5bmNocm9uaXplZCBiZWNhdXNlIGl0IGFjY2Vzc2VzIHRoZSBmUmVxdWVzdHMgcXVldWUKLQkgKiBhbmQgZlZpZXdlcnMgbGlzdAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbmQgYXJyYXkgb2YgdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgTm9kZXMKLQkgKiAgICAgICAgIHRvIHJlZnJlc2ggYW5kIHRoZSB2aWV3ZXJzIGluIHdoaWNoIHRvIHJlZnJlc2ggdGhlbQotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIE9iamVjdFtdIGdldFJlcXVlc3RzKCkgewotCQlOb2RlW10gdG9SZWZyZXNoID0gKE5vZGVbXSkgZlJlcXVlc3RzLnRvQXJyYXkobmV3IE5vZGVbZlJlcXVlc3RzLnNpemUoKV0pOwotCQlmUmVxdWVzdHMuY2xlYXIoKTsKLQotCQlTdHJ1Y3R1cmVkVmlld2VyW10gdmlld2VycyA9IChTdHJ1Y3R1cmVkVmlld2VyW10pIGZWaWV3ZXJzLnRvQXJyYXkobmV3IFN0cnVjdHVyZWRWaWV3ZXJbZlZpZXdlcnMuc2l6ZSgpXSk7Ci0JCWZWaWV3ZXJzLmNsZWFyKCk7Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXXt0b1JlZnJlc2gsIHZpZXdlcnN9OwotCX0KLQotCS8qKgotCSAqIEludm9rZSBhIHJlZnJlc2ggb24gdGhlIHZpZXdlciBvbiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWFkZFZpZXdlcih2aWV3ZXIpOwotCQlhZGRSZXF1ZXN0KG5vZGUpOwotCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl0cnkgewotCQkJLy8gUmV0cmlldmUgQk9USCB2aWV3ZXJzIGFuZCBOb2RlcyBvbiBvbmUgYmxvY2sKLQkJCU9iamVjdFtdIHJlcXVlc3RzID0gZ2V0UmVxdWVzdHMoKTsKLQkJCU5vZGVbXSBub2RlcyA9IChOb2RlW10pIHJlcXVlc3RzWzBdOwotCQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSByZXF1ZXN0c1sxXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJZG9SZWZyZXNoKG5vZGVzW2ldLCB2aWV3ZXJzKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvWE1MTm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9YTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNiMDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9YTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxOb2RlQWN0aW9uTWFuYWdlciBleHRlbmRzIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgewotCXB1YmxpYyBYTUxOb2RlQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1vZGVsLCBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKSwgdmlld2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZvcm1hdChOb2RlIG5ld0VsZW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQl0cnkgewotCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLQkJCWZNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUKLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKG5ld0VsZW1lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0JCQlmTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCWZNb2RlbCA9IG5ld01vZGVsOwotCQlzZXRNb2RlbFF1ZXJ5KE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobmV3TW9kZWwpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbFF1ZXJ5KE1vZGVsUXVlcnkgbmV3TW9kZWxRdWVyeSkgewotCQltb2RlbFF1ZXJ5ID0gbmV3TW9kZWxRdWVyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjg3YWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBDb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgWE1MCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwgZXh0ZW5kcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIgewotCi0JcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvcnJlY3Rpb25Bc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJSUNvbnRlbnRBc3Npc3RhbnQgY2EgPSBudWxsOwotCi0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCi0JCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBjb3JyZWN0aW9uUHJvY2Vzc29yID0gbmV3IENvcnJlY3Rpb25Qcm9jZXNzb3JYTUwoc291cmNlVmlld2VyKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfUEkpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQpOwotCQkJfQotCQkJY2EgPSBhc3Npc3RhbnQ7Ci0JCX0KLQotCQlyZXR1cm4gY2E7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uUHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uUHJvY2Vzc29yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzQ4MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvblByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLklRdWlja0ZpeFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uU3RydWN0dXJlZENvcnJlY3Rpb25Qcm9jZXNzb3I7Ci0KLQotcHVibGljIGNsYXNzIENvcnJlY3Rpb25Qcm9jZXNzb3JYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElRdWlja0Fzc2lzdFByb2Nlc3NvciBmUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0JcHJvdGVjdGVkIElRdWlja0ZpeFByb2Nlc3NvciBmUXVpY2tGaXhQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgQ29ycmVjdGlvblByb2Nlc3NvclhNTChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlzdXBlcihzb3VyY2VWaWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmUXVpY2tBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCWZRdWlja0Fzc2lzdFByb2Nlc3NvciA9IG5ldyBRdWlja0Fzc2lzdFByb2Nlc3NvclhNTCgpOwotCi0JCXJldHVybiBmUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0JfQotCi0JcHJvdGVjdGVkIElRdWlja0ZpeFByb2Nlc3NvciBnZXRRdWlja0ZpeFByb2Nlc3NvcigpIHsKLQkJaWYgKGZRdWlja0ZpeFByb2Nlc3NvciA9PSBudWxsKQotCQkJZlF1aWNrRml4UHJvY2Vzc29yID0gbmV3IFF1aWNrRml4UHJvY2Vzc29yWE1MKCk7Ci0KLQkJcmV0dXJuIGZRdWlja0ZpeFByb2Nlc3NvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5MDM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi1wdWJsaWMgY2xhc3MgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiB7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZSZXF1aXJlZEF0dHJzOwotCi0JLyoqCi0JICogQHBhcmFtIHJlcXVpcmVkQXR0cnMKLQkgKi8KLQlwdWJsaWMgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWwoTGlzdCByZXF1aXJlZEF0dHJzKSB7Ci0JCWZSZXF1aXJlZEF0dHJzID0gcmVxdWlyZWRBdHRyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBub3QgaW1wbGVtZW50ZWQ/Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpbnQgaW5kZXggPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExhc3RSZWdpb24oKTsKLQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJaW5kZXgtLTsKLQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQl9Ci0JCWVsc2UgaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJaW5kZXggPSBpbmRleCAtIDI7Ci0JCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJfQotCQlNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgZlJlcXVpcmVkQXR0cnMuZ2V0KGkpOwotCQkJCVN0cmluZyByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyRGVjbC5nZXREZWZhdWx0VmFsdWUoKTsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCi0JCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG5hbWVBbmREZWZhdWx0VmFsdWUgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaSA9PSAwICYmIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCkgPiBsYXN0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChpbmRleCwgbmFtZUFuZERlZmF1bHRWYWx1ZSkpOwotCQkJCS8vIEJVRzMzODE6IE11bHRpVGV4dEVkaXQgYXBwbGllcyBhbGwgY2hpbGQgVGV4dEVkaXQncyBiYXNpbmcKLQkJCQkvLyBvbiBvZmZzZXRzCi0JCQkJLy8gaW4gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgZmlyc3QgVGV4dEVkaXQsIG5vdCBhZnRlciBlYWNoCi0JCQkJLy8gY2hpbGQgVGV4dEVkaXQuIFRoZXJlZm9yZSwgZG8gbm90IG5lZWQgdG8gYWR2YW5jZSB0aGUKLQkJCQkvLyBpbmRleC4KLQkJCQkvLyBpbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJfQotCQkJbXVsdGlUZXh0RWRpdC5hcHBseSh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZywgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgdGhlcmUncyByZWFzb25zIHdoeSB3ZSBnZXQgc29tZQotCQkJLy8gaGVyZS4KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbF8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRDb250ZXh0SW5mb3JtYXRpb24oKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLkluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0xPQ0FMKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0NPUlJFQ1RJT04pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlciwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Qcm9ibGVtSURzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Qcm9ibGVtSURzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDAwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUHJvYmxlbUlEc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvYmxlbUlEc1hNTCB7Ci0JaW50IEF0dHJzSW5FbmRUYWcgPSAzOwotCWludCBBdHRyVmFsdWVOb3RRdW90ZWQgPSAxMzsKLQlpbnQgRW1wdHlUYWcgPSAxOwotCWludCBJbnZhbGlkQXR0clZhbHVlID0gMTE7Ci0JaW50IE1pc3NpbmdBdHRyVmFsdWUgPSA0OwotCWludCBNaXNzaW5nQ2xvc2luZ0JyYWNrZXQgPSAxNDsKLQlpbnQgTWlzc2luZ0VuZFRhZyA9IDI7Ci0JaW50IE1pc3NpbmdSZXF1aXJlZEF0dHIgPSAxMjsKLQlpbnQgTmFtZXNwYWNlSW5QSSA9IDg7Ci0JaW50IE5vQXR0clZhbHVlID0gNTsKLQlpbnQgU3BhY2VzQmVmb3JlUEkgPSA3OwotCWludCBTcGFjZXNCZWZvcmVUYWdOYW1lID0gNjsKLQlpbnQgVW5jbGFzc2lmaWVkID0gMDsKLQlpbnQgVW5rbm93bkF0dHIgPSAxMDsKLQlpbnQgVW5rbm93bkVsZW1lbnQgPSA5OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tBc3Npc3RQcm9jZXNzb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrQXNzaXN0UHJvY2Vzc29yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZmQ5NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tBc3Npc3RQcm9jZXNzb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFF1aWNrQXNzaXN0UHJvY2Vzc29yWE1MIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29ycmVjdGlvbi5JUXVpY2tBc3Npc3RQcm9jZXNzb3IjY2FuQXNzaXN0KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcG9zYWxzCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJSURPTU5vZGUgY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhjdXJzb3JOb2RlKTsKLQkJCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBjdXJyZW50QXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCQkJaW5zZXJ0QXR0cnMuYWRkQWxsKHJlcXVpcmVkQXR0cnMpOwotCQkJCQllbHNlIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJOYW1lID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSByZXF1aXJlZEF0dHJzLmdldChpKSkuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCQlTdHJpbmcgY3VycmVudEF0dHJOYW1lID0gY3VycmVudEF0dHJzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpCi0JCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApCi0JCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbChpbnNlcnRBdHRycykpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdldExvY2FsUmVuYW1lUXVpY2tBc3Npc3RQcm9wb3NhbChBcnJheUxpc3QgcHJvcG9zYWxzLCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlID09IG51bGwgPyBudWxsIDogbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCByZWdpb25UZXh0RW5kT2Zmc2V0ID0gMDsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJcmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCXJlZ2lvblRleHRFbmRPZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0gZWxzZSBpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCXJlZ2lvbiA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJcmVnaW9uVGV4dEVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpICYmIG9mZnNldCA8PSByZWdpb25UZXh0RW5kT2Zmc2V0KQotCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKERvY3VtZW50KSBub2RlKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvciNnZXRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCB2aWV3ZXIsIG9mZnNldCk7Ci0JCWdldFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsKHByb3Bvc2Fscywgdmlld2VyLCBvZmZzZXQpOwotCQlnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByb3Bvc2Fscywgdmlld2VyLCBvZmZzZXQpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3Bvc2FscwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0U3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwoQXJyYXlMaXN0IHByb3Bvc2FscywgU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcHJvcG9zYWxzLmFkZChuZXcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tGaXhQcm9jZXNzb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UHJvY2Vzc29yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjVhOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tGaXhQcm9jZXNzb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi1wdWJsaWMgY2xhc3MgUXVpY2tGaXhQcm9jZXNzb3JYTUwgaW1wbGVtZW50cyBJUXVpY2tGaXhQcm9jZXNzb3IgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvcnJlY3Rpb24uSVF1aWNrRml4UHJvY2Vzc29yI2NhbkZpeChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wQW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotCQkJaW50IHByb2JsZW1JRCA9IHRlbXBBbm5vdGF0aW9uLmdldFByb2JsZW1JRCgpOwotCQkJc3dpdGNoIChwcm9ibGVtSUQpIHsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nRW5kVGFnIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZyA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Ob0F0dHJWYWx1ZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVRhZ05hbWUgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5hbWVzcGFjZUluUEkgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duRWxlbWVudCA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25BdHRyIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuSW52YWxpZEF0dHJWYWx1ZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdSZXF1aXJlZEF0dHIgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQgOgotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vcmV0dXJuCi0JCS8vIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09SUkVDVElPTl9DSEFOR0UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0ZpeFByb2Nlc3NvciNnZXRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbikKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGVtcEFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLQkJCWludCBwcm9ibGVtSUQgPSB0ZW1wQW5ub3RhdGlvbi5nZXRQcm9ibGVtSUQoKTsKLQkJCXN3aXRjaCAocHJvYmxlbUlEKSB7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkVtcHR5VGFnIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nRW5kVGFnIDoKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVswXTsKLQkJCQkJU3RyaW5nIHRhZ0Nsb3NlID0gKFN0cmluZykgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMV07Ci0JCQkJCWludCB0YWdDbG9zZU9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMl0pLmludFZhbHVlKCk7Ci0JCQkJCWludCBzdGFydFRhZ0VuZE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbM10pLmludFZhbHVlKCk7Ci0JCQkJCWludCBmaXJzdENoaWxkU3RhcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzRdKS5pbnRWYWx1ZSgpOwotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVs1XSkuaW50VmFsdWUoKTsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKHRhZ0Nsb3NlLCB0YWdDbG9zZU9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHN0YXJ0VGFnRW5kT2Zmc2V0IC0gdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8yLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGZpcnN0Q2hpbGRTdGFydE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8zLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPC8iICsgdGFnTmFtZSArICI+IiwgZW5kT2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzQsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJzSW5FbmRUYWcgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNSwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUgOgotCQkJCQlTdHJpbmcgZGVmYXVsdEF0dHJWYWx1ZSA9IChTdHJpbmcpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzBdOwotCQkJCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVsxXSkuaW50VmFsdWUoKTsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBkZWZhdWx0QXR0clZhbHVlICsgIlwiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSArIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCkgKyBpbnNlcnRPZmZzZXQsIDAsIGRlZmF1bHRBdHRyVmFsdWUubGVuZ3RoKCkgKyAyLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzYsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Ob0F0dHJWYWx1ZSA6Ci0JCQkJCWRlZmF1bHRBdHRyVmFsdWUgPSAoU3RyaW5nKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIj1cIiIgKyBkZWZhdWx0QXR0clZhbHVlICsgIlwiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSArIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGRlZmF1bHRBdHRyVmFsdWUubGVuZ3RoKCkgKyAzLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzYsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzgsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF85LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25FbGVtZW50IDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTEpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkF0dHIgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkludmFsaWRBdHRyVmFsdWUgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nUmVxdWlyZWRBdHRyIDoKLQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ciA9IChTdHJpbmcpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzBdOwotCQkJCQlpbnNlcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzFdKS5pbnRWYWx1ZSgpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwocmVxdWlyZWRBdHRyLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgaW5zZXJ0T2Zmc2V0LCAwLCByZXF1aXJlZEF0dHIubGVuZ3RoKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTMsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0clZhbHVlTm90UXVvdGVkIDoKLQkJCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IChTdHJpbmcpIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgYXR0clZhbHVlICsgIlwiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgYXR0clZhbHVlLmxlbmd0aCgpICsgMiwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xNCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0Nsb3NpbmdCcmFja2V0IDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSArIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIDEsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTUsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWM1NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFJlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbCBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWwsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yIHsKLQlwcml2YXRlIE9iamVjdCBmQWRkaXRpb25hbEZpeEluZm8gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEaXNwbGF5U3RyaW5nOwotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCXByaXZhdGUgUG9pbnQgZlNlbGVjdGlvbjsgLy8gaW5pdGlhbGl6ZWQgYnkgYXBwbHkoKQotCi0JcHVibGljIFJlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbChPYmplY3QgYWRkaXRpb25hbEZpeEluZm8sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZykgewotCQlmQWRkaXRpb25hbEZpeEluZm8gPSBhZGRpdGlvbmFsRml4SW5mbzsKLQkJZkltYWdlID0gaW1hZ2U7Ci0JCWZEaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBub3QgaW1wbGVtZW50ZWQ/Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBzdGFydFRhZ09mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVswXSkuaW50VmFsdWUoKTsKLQkJaW50IHN0YXJ0VGFnTGVuZ3RoID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdKS5pbnRWYWx1ZSgpOwotCQlpbnQgZW5kVGFnT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzJdKS5pbnRWYWx1ZSgpOwotCQlpbnQgZW5kVGFnTGVuZ3RoID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzNdKS5pbnRWYWx1ZSgpOwotCi0JCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCWlmIChlbmRUYWdPZmZzZXQgIT0gLTEpIHsKLQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IERlbGV0ZUVkaXQoZW5kVGFnT2Zmc2V0LCBlbmRUYWdMZW5ndGgpKTsKLQkJCWZTZWxlY3Rpb24gPSBuZXcgUG9pbnQoZW5kVGFnT2Zmc2V0LCAwKTsKLQkJfQotCQlpZiAoc3RhcnRUYWdPZmZzZXQgIT0gLTEpIHsKLQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IERlbGV0ZUVkaXQoc3RhcnRUYWdPZmZzZXQsIHN0YXJ0VGFnTGVuZ3RoKSk7Ci0JCQlmU2VsZWN0aW9uID0gbmV3IFBvaW50KHN0YXJ0VGFnT2Zmc2V0LCAwKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQltdWx0aVRleHRFZGl0LmFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIGZpbmQgcmVhc29ucyBub3QgdG8uCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3MgZmluZCByZWFzb25zIG5vdCB0by4KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldENvbnRleHRJbmZvcm1hdGlvbigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldERpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJaWYgKGZEaXNwbGF5U3RyaW5nID09IG51bGwpCi0JCQlmRGlzcGxheVN0cmluZyA9IFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTE7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZkltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlciwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzMzBhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IubGluay5FZGl0b3JMaW5rZWRNb2RlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiB7Ci0JcHJvdGVjdGVkIElSZWdpb24gZlNlbGVjdGVkUmVnaW9uOyAvLyBpbml0aWFsaXplZCBieSBhcHBseSgpCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJTGlua2VkUG9zaXRpb25Hcm91cCBncm91cCA9IG5ldyBMaW5rZWRQb3NpdGlvbkdyb3VwKCk7Ci0JCXRyeSB7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSA/IG51bGwgOiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0U3RhcnQoKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSwgMCkpOwotCi0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCQkJcmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKQotCQkJCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDEpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJcmVnaW9uID0gKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSA/IG51bGwgOiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnTmFtZVJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgc3RhcnRUYWdOYW1lUmVnaW9uLmdldFN0YXJ0KCksIHN0YXJ0VGFnTmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDApKTsKLQkJCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAxKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlCi0JCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAwKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUT0RPIENvbXBsZXRpb25Qcm9wb3NhbFBvcHVwI2luc2VydFByb3Bvc2FsKCkgY2FsbHMKLQkJCQkvLyBJUmV3cml0ZVRhcmdldC5iZWdpbkNvbXBvdW5kQ2hhbmdlKCkKLQkJCQkvLyAgICAgIHdoaWNoIGRpc2FibGVzIHJlZHJhdyBpbiBJVGV4dFZpZXdlci4gV29ya2Fyb3VuZCBmb3Igbm93LgotCQkJCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuc2V0UmVkcmF3KHRydWUpOwotCQkJfQotCi0JCQlMaW5rZWRNb2RlTW9kZWwgbGlua2VkTW9kZU1vZGVsID0gbmV3IExpbmtlZE1vZGVNb2RlbCgpOwotCQkJbGlua2VkTW9kZU1vZGVsLmFkZEdyb3VwKGdyb3VwKTsKLQkJCWxpbmtlZE1vZGVNb2RlbC5mb3JjZUluc3RhbGwoKTsKLQotCQkJTGlua2VkTW9kZVVJIHVpID0gbmV3IEVkaXRvckxpbmtlZE1vZGVVSShsaW5rZWRNb2RlTW9kZWwsIHZpZXdlcik7Ci0JCQl1aS5zZXRFeGl0UG9zaXRpb24odmlld2VyLCBvZmZzZXQsIDAsIExpbmtlZFBvc2l0aW9uR3JvdXAuTk9fU1RPUCk7Ci0JCQl1aS5lbnRlcigpOwotCi0JCQlmU2VsZWN0ZWRSZWdpb24gPSB1aS5nZXRTZWxlY3RlZFJlZ2lvbigpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0xPQ0FMKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfTE9DQUxfVkFSSUFCTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZlNlbGVjdGVkUmVnaW9uLmdldE9mZnNldCgpLCBmU2VsZWN0ZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlciwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQwMGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwgZXh0ZW5kcyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQl0cnkgewotCQkJaW50IHN0YXJ0VGFnT2Zmc2V0ID0gb2Zmc2V0OwotCQkJaW50IGVuZFRhZ09mZnNldCA9IG9mZnNldCArIHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueTsKLQotCQkJLy8gc3Vycm91bmQgdGhlIG5vZGUgaWYgbm8gc2VsZWN0aW9uCi0JCQlpZiAoc3RhcnRUYWdPZmZzZXQgPT0gZW5kVGFnT2Zmc2V0KSB7Ci0JCQkJSURPTU5vZGUgY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCQkJLy8gdXNlIHBhcmVudCBub2RlIGlmIHRleHQgbm9kZSBpcyBlbXB0eQotCQkJCWlmIChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlzdGFydFRhZ09mZnNldCA9IGN1cnNvck5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQllbmRUYWdPZmZzZXQgPSBjdXJzb3JOb2RlLmdldEVuZE9mZnNldCgpOwotCQkJfQotCi0JCQkvLyBpbnNlcnQgbmV3IGVsZW1lbnQKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkvLyBlbGVtZW50IHRhZyBuYW1lIGNhbm5vdCBiZSBEQkNTLCBkbyBub3QgdHJhbnNsYXRlICI8ZWxlbWVudD4iCi0JCQkvLyBhbmQgIjwvZWxlbWVudD4iCi0JCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KHN0YXJ0VGFnT2Zmc2V0LCAiPGVsZW1lbnQ+IikpOyAvLyROT04tTkxTLTEkCi0JCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGVuZFRhZ09mZnNldCwgIjwvZWxlbWVudD4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpVGV4dEVkaXQuYXBwbHkodmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQkvLyBnZXQgbmV3IGVsZW1lbnQgbm9kZQotCQkJSURPTU5vZGUgbmV3RWxlbWVudE5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBzdGFydFRhZ09mZnNldCk7Ci0KLQkJCS8vIGZvcm1hdCBuZXcgZWxlbWVudAotCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUobmV3RWxlbWVudE5vZGUpOwotCi0JCQkvLyByZW5hbWUgbmV3IGVsZW1lbnQKLQkJCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBuZXdFbGVtZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0xPQ0FMKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0NPUlJFQ1RJT04pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRBdHRyaWJ1dGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRBdHRyaWJ1dGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0NGE1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0QXR0cmlidXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRWRpdEF0dHJpYnV0ZURpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgQXR0ciBhdHRyaWJ1dGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVOYW1lOwotCXByb3RlY3RlZCBUZXh0IGF0dHJpYnV0ZU5hbWVGaWVsZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotCXByb3RlY3RlZCBUZXh0IGF0dHJpYnV0ZVZhbHVlRmllbGQ7Ci0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIEVsZW1lbnQgb3duZXJFbGVtZW50OwotCi0JcHVibGljIEVkaXRBdHRyaWJ1dGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIEVsZW1lbnQgb3duZXJFbGVtZW50LCBBdHRyIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJYXR0cmlidXRlTmFtZSA9IGdldE1vZGVsVmFsdWUoYXR0cmlidXRlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCQlhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlRmllbGQuZ2V0VGV4dCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5mb3JjZUZvY3VzKCk7Ci0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5zZWxlY3RBbGwoKTsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0FUVFJJQlVURV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLwotCQkvLyBTdHlsZSBjb252ZW5pZW5jZSBjb25zdGFudHMKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGF0dHJpYnV0ZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYXR0cmlidXRlTmFtZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRV9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQlhdHRyaWJ1dGVOYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhdHRyaWJ1dGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShhdHRyaWJ1dGUgIT0gbnVsbCA/IGF0dHJpYnV0ZS5nZXROYW1lKCkgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlMYWJlbCBhdHRyaWJ1dGVWYWx1ZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVWYWx1ZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVkFMVUVfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBzdHlsZSA9IFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSOwotCQlpZiAodmFsdWUuaW5kZXhPZigiXG4iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZSA9IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEw7Ci0JCX0KLQotCQlhdHRyaWJ1dGVWYWx1ZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBzdHlsZSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDMwMDsKLQkJYXR0cmlidXRlVmFsdWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXR0cmlidXRlVmFsdWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShhdHRyaWJ1dGUgIT0gbnVsbCA/IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpIDogIiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGVycm9yIG1lc3NhZ2UKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5lcnJvcl9tZXNzYWdlX2dvZXNfaGVyZSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQlnZC5oZWlnaHRIaW50ID0gTWF0aC5tYXgoMzAsIGVycm9yTWVzc2FnZUxhYmVsLmNvbXB1dGVTaXplKDAsIDAsIGZhbHNlKS55ICogMik7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gYXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gYXR0cmlidXRlVmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kZWxWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCXJlc3VsdCA9IHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZU5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCUF0dHIgbWF0Y2hpbmdBdHRyaWJ1dGUgPSBvd25lckVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJCWlmIChtYXRjaGluZ0F0dHJpYnV0ZSAhPSBudWxsICYmIG1hdGNoaW5nQXR0cmlidXRlICE9IGF0dHJpYnV0ZSkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX0VSUk9SX1hNTF9BVFRSSUJVVEVfQUxSRUFEWV9FWElTVFM7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVE9ETyBnZXQgY2hlY2tOYW1lIGZyb20gTW9kZWwKLQkJCQkvL2Vycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZShuYW1lKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yTWVzc2FnZUxhYmVsLmdldFBhcmVudCgpLmxheW91dCgpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RG9jdHlwZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdERvY3R5cGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2N2VkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RG9jdHlwZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotcHVibGljIGNsYXNzIEVkaXREb2N0eXBlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlU3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGRvY3R5cGVEYXRhOwotCXByb3RlY3RlZCBib29sZWFuIGVycm9yQ2hlY2tpbmc7Ci0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaWNJZEJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCBwdWJsaWNJZEZpZWxkOwotCXByb3RlY3RlZCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBUZXh0IHJvb3RFbGVtZW50TmFtZUZpZWxkOwotCXByb3RlY3RlZCBCdXR0b24gc3lzdGVtSWRCcm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgc3lzdGVtSWRGaWVsZDsKLQotCXB1YmxpYyBFZGl0RG9jdHlwZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZG9jdHlwZS5nZXROYW1lKCksIGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdERvY3R5cGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCWRvY3R5cGVEYXRhID0gbmV3IFN0cmluZ1szXTsKLQkJZG9jdHlwZURhdGFbMF0gPSBuYW1lOwotCQlkb2N0eXBlRGF0YVsxXSA9IHB1YmxpY0lkOwotCQlkb2N0eXBlRGF0YVsyXSA9IHN5c3RlbUlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWRvY3R5cGVEYXRhWzBdID0gZ2V0TW9kZWxWYWx1ZShyb290RWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsxXSA9IGdldE1vZGVsVmFsdWUocHVibGljSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsyXSA9IGdldE1vZGVsVmFsdWUoc3lzdGVtSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0NvbnRyb2wgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQ29udHJvbCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0NvbnRyb2wsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRGaWVsZCkgewotCQkJCQljb21wdXRlU3lzdGVtSWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gcm93IDEKLQkJLy8KLQkJTGFiZWwgcm9vdEVsZW1lbnROYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvb3RFbGVtZW50TmFtZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJcm9vdEVsZW1lbnROYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyb290RWxlbWVudE5hbWVGaWVsZCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9ST09UKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQlyb290RWxlbWVudE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcm9vdEVsZW1lbnROYW1lRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZG9jdHlwZURhdGFbMF0pKTsKLQkJcm9vdEVsZW1lbnROYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIHBsYWNlSG9sZGVyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwbGFjZUhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkvLyByb3cgMgotCQkvLwotCQlMYWJlbCBwdWJsaWNJZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwdWJsaWNJZExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEX0NPTE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpY0lkRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwdWJsaWNJZEZpZWxkLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9ET0NUWVBFX1BVQkxJQyk7Ci0JCXB1YmxpY0lkRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXB1YmxpY0lkRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZG9jdHlwZURhdGFbMV0pKTsKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUVkaXRFbnRpdHlIZWxwZXIgaGVscGVyID0gbmV3IEVkaXRFbnRpdHlIZWxwZXIoKTsKLQkJCQlpZiAoZS53aWRnZXQgPT0gcHVibGljSWRCcm93c2VCdXR0b24pIHsKLQkJCQkJaGVscGVyLnBlcmZvcm1Ccm93c2VGb3JQdWJsaWNJZChnZXRTaGVsbCgpLCBwdWJsaWNJZEZpZWxkLCBjb21wdXRlU3lzdGVtSWQgPyBzeXN0ZW1JZEZpZWxkIDogbnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGUud2lkZ2V0ID09IHN5c3RlbUlkQnJvd3NlQnV0dG9uKSB7Ci0JCQkJCWhlbHBlci5wZXJmb3JtQnJvd3NlRm9yU3lzdGVtSWQoZ2V0U2hlbGwoKSwgc3lzdGVtSWRGaWVsZCwgcmVzb3VyY2VMb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXB1YmxpY0lkQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHVibGljSWRCcm93c2VCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9CUk9XU0UpOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpY0lkQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyByb3cgMwotCQlMYWJlbCBzeXN0ZW1JZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN5c3RlbUlkRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzeXN0ZW1JZEZpZWxkLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9ET0NUWVBFX1NZU1RFTSk7Ci0JCXN5c3RlbUlkRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5c3RlbUlkRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZG9jdHlwZURhdGFbMl0pKTsKLQkJc3lzdGVtSWRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQotCQlzeXN0ZW1JZEJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXN5c3RlbUlkQnJvd3NlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfQlJPV1NFKTsgLy8kTk9OLU5MUy0xJAotCQlzeXN0ZW1JZEJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gZXJyb3IgbWVzc2FnZQotCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dDb250cm9sLCBTV1QuTk9ORSk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCi0JCXJldHVybiBkaWFsb2dDb250cm9sOwotCX0KLQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vIGxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRFcnJvckNoZWNraW5nKCkgewotCQlyZXR1cm4gZXJyb3JDaGVja2luZzsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kZWxWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCXJlc3VsdCA9IHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGRvY3R5cGVEYXRhWzBdOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBkb2N0eXBlRGF0YVsxXTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gZG9jdHlwZURhdGFbMl07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcHV0ZVN5c3RlbUlkKGJvb2xlYW4gY29tcHV0ZVN5c3RlbUlkKSB7Ci0JCXRoaXMuY29tcHV0ZVN5c3RlbUlkID0gY29tcHV0ZVN5c3RlbUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yQ2hlY2tpbmcoYm9vbGVhbiBlcnJvckNoZWNraW5nKSB7Ci0JCXRoaXMuZXJyb3JDaGVja2luZyA9IGVycm9yQ2hlY2tpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMb2NhdGlvbihJUGF0aCBwYXRoKSB7Ci0JCXJlc291cmNlTG9jYXRpb24gPSBwYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJaWYgKGVycm9yQ2hlY2tpbmcpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQkJaWYgKGdldE1vZGVsVmFsdWUoc3lzdGVtSWRGaWVsZC5nZXRUZXh0KCkpID09IG51bGwpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX1NZU1RFTV9JRF9NVVNUX0JFX1NQRUNJRklFRDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoZ2V0TW9kZWxWYWx1ZShyb290RWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpID09IG51bGwpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbGVtZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RWxlbWVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTYwOThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbGVtZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEVkaXRFbGVtZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50TmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCBlbGVtZW50TmFtZUZpZWxkOwotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JcHVibGljIEVkaXRFbGVtZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQllbGVtZW50TmFtZSA9IGdldE1vZGVsVmFsdWUoZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJZWxlbWVudE5hbWVGaWVsZC5mb3JjZUZvY3VzKCk7Ci0JCWVsZW1lbnROYW1lRmllbGQuc2VsZWN0QWxsKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2dBcmVhLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9FTEVNRU5UX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgZWxlbWVudE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWxlbWVudE5hbWVMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQotCQllbGVtZW50TmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJZWxlbWVudE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZWxlbWVudE5hbWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50LmdldE5vZGVOYW1lKCkgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnROYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gZXJyb3IgbWVzc2FnZQotCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLmVycm9yX21lc3NhZ2VfZ29lc19oZXJlKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbFZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCS8vCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnROYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBUT0RPIHVzZSBjaGVja05hbWUgZnJvbSBtb2RlbCBsZXZlbAotCQkJLy9lcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUobmFtZSk7Ci0JCQlpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX0lOVkFMSURfTkFNRTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCX0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiZWM0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RW50aXR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVkaXRFbnRpdHlIZWxwZXIgewotCi0JcHVibGljIHZvaWQgcGVyZm9ybUJyb3dzZUZvclB1YmxpY0lkKFNoZWxsIHBhcmVudFNoZWxsLCBUZXh0IHB1YmxpY0lkRmllbGQpIHsKLQkJcGVyZm9ybUJyb3dzZUZvclB1YmxpY0lkKHBhcmVudFNoZWxsLCBwdWJsaWNJZEZpZWxkLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQnJvd3NlRm9yUHVibGljSWQoU2hlbGwgcGFyZW50U2hlbGwsIFRleHQgcHVibGljSWRGaWVsZCwgVGV4dCBzeXN0ZW1JZEZpZWxkKSB7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7ImR0ZCIsICJ0eHQifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVNlbGVjdFhNTENhdGFsb2dJZERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nKHBhcmVudFNoZWxsLCBleHRlbnNpb25zKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1NFTEVDVF9YTUxfQ0FUQUxPR19FTlRSWSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlwdWJsaWNJZEZpZWxkLnNldFRleHQoaWQpOwotCQkJCWlmIChzeXN0ZW1JZEZpZWxkICE9IG51bGwgJiYgZGlhbG9nLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkgewotCQkJCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoZGlhbG9nLmdldFN5c3RlbUlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Ccm93c2VGb3JTeXN0ZW1JZChTaGVsbCBwYXJlbnRTaGVsbCwgVGV4dCBzeXN0ZW1JZEZpZWxkLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7ImR0ZCJ9OyAvLyROT04tTkxTLTEkCi0JCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKHBhcmVudFNoZWxsLCBleHRlbnNpb25zLCBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1NQRUNJRllfU1lTVEVNX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGlkID0gZGlhbG9nLmdldElkKCk7Ci0JCQlJRmlsZSBmaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJc3lzdGVtSWRGaWVsZC5zZXRUZXh0KGlkKTsKLQkJCX0gZWxzZSBpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJaWYgKHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1cmkgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCX0KLQkJCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQodXJpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXROYW1lc3BhY2VJbmZvRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0TmFtZXNwYWNlSW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmYxNmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXROYW1lc3BhY2VJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwdWJsaWMgc3RhdGljIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8sIElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mbyBmSW5mbzsKLQlwcm90ZWN0ZWQgVGV4dCBsb2NhdGlvbkhpbnRGaWVsZDsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgcHJlZml4RmllbGQ7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFRleHQgdXJpRmllbGQ7Ci0KLQlwdWJsaWMgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuZkluZm8gPSBpbmZvOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlmSW5mby51cmkgPSB1cmlGaWVsZC5nZXRUZXh0KCk7Ci0JCQlmSW5mby5wcmVmaXggPSBwcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0JCQlmSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnRGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQl1cGRhdGVXaWRnZXRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dzdWJBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2dzdWJBcmVhLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9OQU1FU1BBQ0VfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dzdWJBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzUwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl1cGRhdGVXaWRnZXRzKCk7Ci0JCQl9Ci0JCX07Ci0KLQotCQkvLyByb3cgMQotCQkvLwotCQlMYWJlbCB1cmlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdXJpTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRV9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQl1cmlGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdXJpRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVyaUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGZJbmZvLnVyaSkpOwotCQl1cmlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCXVyaUZpZWxkLnNldEVuYWJsZWQoZkluZm8uZ2V0UHJvcGVydHkoInVyaS1yZWFkT25seSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV2ZXIgcmVhZAotICAgICAgICAgICAgICAgTGFiZWwgcGxhY2VIb2xkZXIxID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgcGxhY2VIb2xkZXIxLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcm93IDIKLQkJLy8KLQkJTGFiZWwgcHJlZml4TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXByZWZpeExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUFJFRklYX0NPTE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCXByZWZpeEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlwcmVmaXhGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcHJlZml4RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZkluZm8ucHJlZml4KSk7Ci0JCXByZWZpeEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJcHJlZml4RmllbGQuc2V0RW5hYmxlZChmSW5mby5nZXRQcm9wZXJ0eSgicHJlZml4LXJlYWRPbmx5IikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBuZXZlciByZWFkCi0gICAgICAgICAgICAgICAgTGFiZWwgcGxhY2VIb2xkZXIyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIHBsYWNlSG9sZGVyMi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJvdyAzCi0JCS8vCi0JCUxhYmVsIGxvY2F0aW9uSGludExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkhpbnRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlRfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJbG9jYXRpb25IaW50RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxvY2F0aW9uSGludEZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShmSW5mby5sb2NhdGlvbkhpbnQpKTsKLQkJbG9jYXRpb25IaW50RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRFbmFibGVkKGZJbmZvLmdldFByb3BlcnR5KCJsb2NhdGlvbkhpbnQtcmVhZE9ubHkiKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGVyZm9ybUJyb3dzZSgpOwotCQkJfQotCQl9OwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRSk7IC8vJE5PTi1OTFMtMSQKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobG9jYXRpb25IaW50RmllbGQuZ2V0RW5hYmxlZCgpKTsKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ3N1YkFyZWEsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLmVycm9yX21lc3NhZ2VfZ29lc19oZXJlKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQlyZXR1cm4gZGlhbG9nc3ViQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUJyb3dzZSgpIHsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKGdldFNoZWxsKCksIGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBncmFtbWFyVVJJID0gbnVsbDsKLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJU3RyaW5nIGlkID0gZGlhbG9nLmdldElkKCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJaWYgKHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJZ3JhbW1hclVSSSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl1cmkgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQlncmFtbWFyVVJJID0gdXJpOwotCQkJCX0KLQkJCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KHVyaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChpZCAhPSBudWxsKSB7Ci0JCQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChpZCk7Ci0JCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJCWdyYW1tYXJVUkkgPSByZXNvbHZlci5yZXNvbHZlKG51bGwsIGlkLCBpZCk7Ci0JCQl9Ci0KLQotCQkJQ01Eb2N1bWVudCBkb2N1bWVudCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KGdyYW1tYXJVUkksICJ4c2QiKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IChMaXN0KSBkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCWlmICh1cmlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDAgJiYgaW5mby51cmkgIT0gbnVsbCkgewotCQkJCXVyaUZpZWxkLnNldFRleHQoaW5mby51cmkpOwotCQkJfQotCQkJaWYgKHByZWZpeEZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCAmJiBpbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJcHJlZml4RmllbGQuc2V0VGV4dChpbmZvLnByZWZpeCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHBhdGgpIHsKLQkJcmVzb3VyY2VMb2NhdGlvbiA9IHBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoKSB7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS0J1dHRvblN0YXRlKCkgewotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKHVyaUZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCAmJiBwcmVmaXhGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDAgJiYgbG9jYXRpb25IaW50RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZWxzZQotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cygpIHsKLQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbCgpOwotCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNmZTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGE7Ci0JcHJvdGVjdGVkIFRleHQgZGF0YUZpZWxkOwotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0OwotCXByb3RlY3RlZCBUZXh0IHRhcmdldEZpZWxkOwotCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBwaS5nZXRUYXJnZXQoKSwgcGkuZ2V0RGF0YSgpKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQl0YXJnZXQgPSBnZXRNb2RlbFZhbHVlKHRhcmdldEZpZWxkLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBnZXRNb2RlbFZhbHVlKGRhdGFGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0gCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWExID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWExLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9QUk9DRVNTSU5HX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYTEsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjUwOwotCi0JCUxhYmVsIHRhcmdldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0YXJnZXRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1RBUkdFVF9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQl0YXJnZXRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0YXJnZXRGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFyZ2V0RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUodGFyZ2V0KSk7Ci0KLQkJTGFiZWwgZGF0YUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkYXRhTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9EQVRBX0NPTE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRhdGFGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlkYXRhRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRhdGFGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShkYXRhKSk7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWExOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvL2xhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0cmluZyAhPSBudWxsICYmIHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0U2NoZW1hSW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWFlZmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0U2NoZW1hSW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFVwZGF0ZUxpc3RlbmVyIHsKLQkvLyBwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mb1RhYmxlIG5hbWVzcGFjZUluZm9UYWJsZTsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0KLQlwdWJsaWMgRWRpdFNjaGVtYUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX1NDSEVNQV9JTkZPX0RJQUxPRyk7Ci0JCQotCQlDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coZGlhbG9nQXJlYSwgcmVzb3VyY2VMb2NhdGlvbiwgWE1MVUlNZXNzYWdlcy5fVUlfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUywgZmFsc2UsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWVkaXROYW1lc3BhY2VzQ29udHJvbC5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgZ2V0RGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZShMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB7Ci0JCU5hbWVzcGFjZUluZm9FcnJvckhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBoZWxwZXIuY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCwgbnVsbCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVPY2N1cmVkKE9iamVjdCBvYmplY3QsIE9iamVjdCBhcmcpIHsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlKChMaXN0KSBhcmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL05hbWVzcGFjZUluZm9FcnJvckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzYwYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIgewotCi0JcHJvdGVjdGVkIExpc3QgZXJyb3JMaXN0OwotCi0JcHVibGljIE5hbWVzcGFjZUluZm9FcnJvckhlbHBlcigpIHsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJSGFzaHRhYmxlIHByZWZpeFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlIYXNodGFibGUgdXJpVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQluc0luZm8ubm9ybWFsaXplKCk7Ci0KLQkJCVN0cmluZyB1cmlrZXkgPSBuc0luZm8udXJpICE9IG51bGwgPyBuc0luZm8udXJpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCU5hbWVzcGFjZUluZm8gbnNJbmZvMiA9IG51bGw7Ci0JCQlpZiAoKG5zSW5mbzIgPSAoTmFtZXNwYWNlSW5mbykgdXJpVGFibGUuZ2V0KHVyaWtleSkpICE9IG51bGwpIHsKLQkJCQlpZiAobnNJbmZvLnVyaSAhPSBudWxsICYmIG5zSW5mby51cmkuZXF1YWxzKG5zSW5mbzIudXJpKSkgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9OQU1FICsgIiciICsgbnNJbmZvLnVyaSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSE9VVF9OQU1FOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQl1cmlUYWJsZS5wdXQodXJpa2V5LCBuc0luZm8pOwotCQkJfQotCi0JCQlpZiAobnNJbmZvLnVyaSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGtleSA9IG5zSW5mby5wcmVmaXggIT0gbnVsbCA/IG5zSW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwcmVmaXhUYWJsZS5nZXQoa2V5KSAhPSBudWxsKSB7Ci0JCQkJCWlmIChuc0luZm8ucHJlZml4ICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX1BSRUZJWCArICInIiArIG5zSW5mby5wcmVmaXggKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWDsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlwcmVmaXhUYWJsZS5wdXQoa2V5LCBuc0luZm8pOwotCQkJCX0KLQotCQkJCWlmIChuc0luZm8ubG9jYXRpb25IaW50ICE9IG51bGwgJiYgaWRSZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBncmFtbWFyVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIG5zSW5mby5sb2NhdGlvbkhpbnQsIG5zSW5mby5sb2NhdGlvbkhpbnQpOwotCQkJCQlpZiAoIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKGdyYW1tYXJVUkksIGZhbHNlKSkgewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19TQ0hFTUFfQ0FOX05PVF9CRV9MT0NBVEVEICsgIiAnIiArIG5zSW5mby5sb2NhdGlvbkhpbnQgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaWRSZXNvbHZlciAhPSBudWxsICYmIG5zSW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCAmJiAhbnNJbmZvLnVyaS5lcXVhbHMoRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuWFNJX1VSSSkpIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19MT0NBVElPTl9ISU5UX05PVF9TUEVDSUZJRUQgKyAiICciICsgbnNJbmZvLnVyaSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAobnNJbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTkFNRVNQQUNFX05BTUVfTk9UX1NQRUNJRklFRCArICIgJyIgKyBuc0luZm8ucHJlZml4ICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkaXRpb25hbCB0ZXN0cwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJCW5zSW5mby5ub3JtYWxpemUoKTsKLQkJCQlpZiAobnNJbmZvLnVyaSAhPSBudWxsICYmIG5zSW5mby5pc1ByZWZpeFJlcXVpcmVkICYmIG5zSW5mby5wcmVmaXggPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX1BSRUZJWF9OT1RfU1BFQ0lGSUVEICsgIiAnIiArIG5zSW5mby51cmkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MzBlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm9UYWJsZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQkvKioKLQkgKiBOYW1lc3BhY2VJbmZvVGFibGVMYWJlbFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmplY3Q7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCXN3aXRjaCAoY29sdW1uKSB7Ci0JCQkJY2FzZSAwIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnVyaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMSA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby5wcmVmaXg7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8ubG9jYXRpb25IaW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN3aXRjaCAoY29sdW1uKSB7Ci0JCQkJCWNhc2UgMCA6IHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX05PX05BTUVTUEFDRV9OQU1FOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIDEgOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19QUkVGSVg7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCSBTdHJpbmcgZ2V0RGVmYXVsdFByZWZpeCgpIHsKLQkJCVN0cmluZyBkZWZhdWx0UHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobmFtZXNwYWNlSW5mb0xpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZGVmYXVsdFByZWZpeDsKLQkJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJCU5hbWVzcGFjZUluZm8gbnNpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldChpKTsKLQkJCQlpZiAobnNpbmZvLnByZWZpeCAhPSBudWxsKQotCQkJCQl2LmFkZEVsZW1lbnQobnNpbmZvLnByZWZpeCk7Ci0JCQl9Ci0JCQlpZiAodi5jb250YWlucyhkZWZhdWx0UHJlZml4KSkgewotCQkJCVN0cmluZyBzID0gZGVmYXVsdFByZWZpeDsKLQkJCQlmb3IgKGludCBqID0gMDsgdi5jb250YWlucyhzKTsgaisrKSB7Ci0JCQkJCXMgPSBkZWZhdWx0UHJlZml4ICsgSW50ZWdlci50b1N0cmluZyhqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHM7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZGVmYXVsdFByZWZpeDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3QudG9BcnJheSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9ISU5UID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQVRJT05fSElOVDsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUkkgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWDsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBib29sZWFuIGR1bW15Um93c1JlbW92ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBuZXdCdXR0b247Ci0JcHJvdGVjdGVkIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBVcGRhdGVMaXN0ZW5lciB1cGRhdGVMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgaW50IHZpc2libGVSb3dzID0gLTE7Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIC0xLCAtMSwgLTEpOwotCX0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXRoaXMocGFyZW50LCAtMSwgLTEsIHZpc2libGVSb3dzKTsKLQl9Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KSB7Ci0JCXRoaXMocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIC0xKTsKLQl9Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldExheW91dChjcmVhdGVHcmlkTGF5b3V0KCkpOwotCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JvdXAgbmFtZXNwYWNlSW5mb0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsKLQkJbmFtZXNwYWNlSW5mb0dyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfWE1MX1NDSEVNQV9JTkZPUk1BVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKHdpZHRoSGludCAhPSAtMSkgewotCQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl9Ci0JCWlmIChoZWlnaHRIaW50ICE9IC0xKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJfQotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKG5hbWVzcGFjZUluZm9Hcm91cCwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIobmFtZXNwYWNlSW5mb0dyb3VwLAotCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxDX05BTUVTUEFDRV9HUk9VUCkpOwotCQlTdHJpbmdbXSB0aXRsZUFycmF5ID0ge05BTUVTUEFDRV9VUkksIFBSRUZJWCwgTE9DQVRJT05fSElOVH07Ci0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKG5hbWVzcGFjZUluZm9Hcm91cCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJcHJvdmlkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcigpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyh0aXRsZUFycmF5KTsKLQkJVGFibGUgdGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJaW50W10gd2lkdGhBcnJheSA9IHs1MCwgMjAsIDMwfTsKLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGl0bGVBcnJheS5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLQkJCWNvbHVtbi5zZXRUZXh0KHRpdGxlQXJyYXlbaV0pOwotCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSh3aWR0aEFycmF5W2ldLCB0cnVlKSk7Ci0JCX0KLQkJdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVSb3dzOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KCIjIyMjIyMjIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbdGl0bGVBcnJheS5sZW5ndGhdOwotCQljZWxsRWRpdG9yc1sxXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0JCWNlbGxFZGl0b3JzWzJdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCQlNb3VzZUFkYXB0ZXIgbW91c2VBZGFwdGVyID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKSAhPSBudWxsKSB7Ci0JCQkJCXBlcmZvcm1FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlQWRhcHRlcik7Ci0JCWNyZWF0ZUJ1dHRvbnMobmFtZXNwYWNlSW5mb0dyb3VwKTsKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlCdXR0b24gaGlkZGVuQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGlkZGVuQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQloaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbmV3QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1OZXcoKTsKLQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGVkaXRCdXR0b24pIHsKLQkJCQkJcGVyZm9ybUVkaXQoKTsKLQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlbGV0ZUJ1dHRvbikgewotCQkJCQlwZXJmb3JtRGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgdGhyZWUgYnV0dG9ucwotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbkdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlidXR0b25HcmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlidXR0b25HcmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uR3JpZExheW91dCk7Ci0JCS8vIGFkZCB0aGUgTmV3IGJ1dHRvbgotCQkvLwotCQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQluZXdCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fTkVXKTsgLy8kTk9OLU5MUy0xJAotCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCS8vIGFkZCB0aGUgRWRpdCBidXR0b24KLQkJLy8KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fRURJVCk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCS8vIGFkZCB0aGUgRGVsZXRlIGJ1dHRvbgotCQkvLwotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIEdyaWRMYXlvdXQgY3JlYXRlR3JpZExheW91dCgpIHsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlyZXR1cm4gZ3JpZExheW91dDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotCX0KLQotCXByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGdldFRhcmdldE5hbWVzcGFjZUluZm8oKSB7Ci0JCXJldHVybiAobmFtZXNwYWNlSW5mb0xpc3QgIT0gbnVsbCAmJiBuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKSA/IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBpbnZva2VEaWFsb2coU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8pIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyhzaGVsbCwgaW5mbyk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKSB7Ci0JCVJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCWdldERpc3BsYXkoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0JCWlmICh1cGRhdGVMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LnJlbW92ZShzZWxlY3RlZE9iamVjdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTmFtZXNwYWNlSW5mbykgewotCQkJaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIChOYW1lc3BhY2VJbmZvKSBzZWxlY3RlZE9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtTmV3KCkgewotCQlOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotCQlFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiwgaW5mbyk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQluYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQl0aGlzLm5hbWVzcGFjZUluZm9MaXN0ID0gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JCXVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTG9jYXRpb24oSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZUxpc3RlbmVyKFVwZGF0ZUxpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyKSB7Ci0JCXRoaXMudXBkYXRlTGlzdGVuZXIgPSB1cGRhdGVMaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXVwZGF0ZUhlbHBlcihuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0JCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBzZWxlY3RlZE9iamVjdDsKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGluZm8gIT0gbnVsbCk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGluZm8gIT0gbnVsbCAmJiBpbmZvLmdldFByb3BlcnR5KCJ1bnJlbW92YWJsZSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlSGVscGVyKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJaWYgKHZpc2libGVSb3dzICE9IC0xICYmICFkdW1teVJvd3NSZW1vdmVkKSB7Ci0JCQlkdW1teVJvd3NSZW1vdmVkID0gdHJ1ZTsKLQkJCXRhYmxlVmlld2VyLmdldFRhYmxlKCkucmVtb3ZlQWxsKCk7Ci0JCX0KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJaWYgKG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKSA+IDApIHsKLQkJCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmM5NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgaW50IGNhdGFsb2dFbnRyeVR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGV4dGVuc2lvbnM7Ci0JcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBwYW5lbDsKLQotCXB1YmxpYyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZXh0ZW5zaW9ucywgMCk7Ci0JfQotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nW10gZXh0ZW5zaW9ucywgaW50IGNhdGFsb2dFbnRyeVR5cGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCQl0aGlzLmNhdGFsb2dFbnRyeVR5cGUgPSBjYXRhbG9nRW50cnlUeXBlOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWZpbGUgPSBwYW5lbC5nZXRGaWxlKCk7Ci0JCQlpZCA9IHBhbmVsLmdldFhNTENhdGFsb2dJZCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCXBhbmVsID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKGRpYWxvZ0FyZWEpOwotCQlwYW5lbC5zZXRDYXRhbG9nRW50cnlUeXBlKGNhdGFsb2dFbnRyeVR5cGUpOwotCQlwYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlwYW5lbC5zZXRWaXNpYmxlSGVscGVyKHRydWUpOwotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKSB7Ci0JCQkJdXBkYXRlQnV0dG9uU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJcGFuZWwuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uU3RhdGUoKSB7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQocGFuZWwuZ2V0RmlsZSgpICE9IG51bGwgfHwgcGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCkgIT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMzU0ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JLyoqCi0JICogVE9ETzogQ2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgaW50ZXJmYWNlOyAiTGlzdGVuZXIiIGlzIHVzZWQgYnkgU1dULgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgewotCQl2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlTZWxlY3RTaW5nbGVGaWxlVmlldyBleHRlbmRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3IGltcGxlbWVudHMgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29udHJvbCBjb250cm9sOwotCi0JCXB1YmxpYyBNeVNlbGVjdFNpbmdsZUZpbGVWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKG51bGwsIHRydWUpOwotCQkJLy9TdHJpbmdbXSBleHQgPSB7Ii5kdGQifTsKLQkJCS8vYWRkRmlsdGVyRXh0ZW5zaW9ucyhleHQpOwotCQkJY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlNeVNlbGVjdFNpbmdsZUZpbGVWaWV3LnRoaXMuc2V0TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIGNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29tcGxldGUoYm9vbGVhbiBpc0NvbXBsZXRlKSB7Ci0JCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGVIZWxwZXIoaXNWaXNpYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b247Ci0JcHJvdGVjdGVkIE15U2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0JcHJvdGVjdGVkIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsOwotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCXNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQlzZXRMYXlvdXREYXRhKGdkKTsKLQotCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bMl07Ci0JCXJhZGlvQnV0dG9uWzBdID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvblswXS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9XT1JLU1BBQ0UpOyAvLyROT04tTkxTLTEkCi0JCXJhZGlvQnV0dG9uWzBdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyYWRpb0J1dHRvblswXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXJhZGlvQnV0dG9uWzBdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJhZGlvQnV0dG9uWzFdID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvblsxXS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9DQVRBTE9HKTsgLy8kTk9OLU5MUy0xJAotCQlyYWRpb0J1dHRvblsxXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmFkaW9CdXR0b25bMV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlzZWxlY3RTaW5nbGVGaWxlVmlldyA9IG5ldyBNeVNlbGVjdFNpbmdsZUZpbGVWaWV3KHBhZ2VCb29rKTsKLQotCQlJQ2F0YWxvZyB4bWxDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwocGFnZUJvb2ssIHhtbENhdGFsb2cpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JCQl9Ci0JCX0pOwotCQlwYWdlQm9vay5zaG93UGFnZShzZWxlY3RTaW5nbGVGaWxlVmlldy5nZXRDb250cm9sKCkpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlJRmlsZSByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VudHJ5IGdldFhNTENhdGFsb2dFbnRyeSgpIHsKLQkJSUNhdGFsb2dFbnRyeSByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFhNTENhdGFsb2dFbnRyeSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dVUkkoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFVSSSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5zZXRDYXRhbG9nRW50cnlUeXBlKGNhdGFsb2dFbnRyeVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5yZXNldEZpbHRlcnMoKTsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0VmlzaWJsZUhlbHBlcihpc1Zpc2libGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWxpc3RlbmVyLmNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gcmFkaW9CdXR0b25bMF0pIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldENvbnRyb2woKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWdlQm9vay5zaG93UGFnZShzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCk7Ci0JCX0KLQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlYTQ0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uVUlDb250ZXh0SWRzOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBwYW5lbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhbmVsLmdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQkJCXB1YmxpY0lkID0gbWFwcGluZ0luZm8uZ2V0S2V5KCk7Ci0JCQkJc3lzdGVtSWQgPSBjb21wdXRlRGVmYXVsdFN5c3RlbUlkKG1hcHBpbmdJbmZvKTsKLQkJCX0KLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVEZWZhdWx0U3lzdGVtSWQoSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbykgewotCQlTdHJpbmcgcmVzdWx0ID0gbWFwcGluZ0luZm8uZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpOwotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgbWFwcGluZ0luZm8uZ2V0VVJJKCkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gbWFwcGluZ0luZm8uZ2V0VVJJKCkubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gaW5kZXggIT0gLTEgPyBtYXBwaW5nSW5mby5nZXRVUkkoKS5zdWJzdHJpbmcoaW5kZXggKyAxKSA6IG1hcHBpbmdJbmZvLmdldFVSSSgpOwotCQkJcmVzdWx0ID0gbGFzdFNlZ21lbnQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2dBcmVhLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9DQVRBTE9HX0RJQUxPRyk7Ci0KLQkJSUNhdGFsb2cgeG1sQ2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCXBhbmVsID0gbmV3IFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKGRpYWxvZ0FyZWEsIHhtbENhdGFsb2cpOwotCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJcGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5zZXRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlwYW5lbC5nZXRUYWJsZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gcHVibGljSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvblN0YXRlKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhbmVsLmdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGVkOWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGludCBjYXRhbG9nRW50cnlUeXBlOwotCXByb3RlY3RlZCBib29sZWFuIGRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZlhtbENhdGFsb2c7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgeG1sQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5mWG1sQ2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdGhpcy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdkLndpZHRoSGludCA9IDcwMDsKLQkJdGhpcy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJdGFibGVWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcih0aGlzKTsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCgiZHVtbXkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgaGVhZGluZ3NbXSA9IG5ldyBTdHJpbmdbMl07Ci0JCWhlYWRpbmdzWzBdID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfS0VZOyAvLyROT04tTkxTLTEkCi0JCWhlYWRpbmdzWzFdID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVVJJOyAvLyROT04tTkxTLTEkCi0KLQkJWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRoZVRhYmxlVmlld2VyID0gbmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlcihwYXJlbnQsIGhlYWRpbmdzKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGFkZFhNTENhdGFsb2dFbnRyaWVzKExpc3QgbGlzdCwgSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMpIHsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCQlpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSAwKSB7Ci0JCQkJCQlsaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0gZWxzZSBpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSBlbnRyeS5nZXRFbnRyeVR5cGUoKSkgewotCQkJCQkJbGlzdC5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRYTUxDYXRhbG9nRW50cmllcygpIHsKLQkJCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJCQlpZiAoZlhtbENhdGFsb2cgPT0gbnVsbCB8fCBkb1RhYmxlU2l6ZUhhY2spIHsKLQkJCQkJLy8gdGhpcyBsZXRzIHVzIGNyZWF0ZSBhIHRhYmxlIHdpdGggYW4gaW5pdGlhbCBoZWlnaHQgb2YKLQkJCQkJLy8gMTAgcm93cwotCQkJCQkvLyBvdGhlcndpc2Ugd2UgZ2V0IHN0dWNrIHdpdGggMCByb3cgaGVpZ2ggdGFibGUuLi4gdGhhdCdzCi0JCQkJCS8vIHRvbyBzbWFsbAotCQkJCQlkb1RhYmxlU2l6ZUhhY2sgPSBmYWxzZTsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotCQkJCQkJcmVzdWx0LmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJIElOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGZYbWxDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0JCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQkJICAgICAgICAgICAgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJICAgICAgICAgICAgaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpCi0JCQkJICAgICAgICAgICAgewotCQkJCSAgICAgICAgICAgICAgICBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRAotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0JCQkJICAgICAgICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICAgICAgICAgIElDYXRhbG9nIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkgICAgICAgICAgICAgICAgICAgIGFkZFhNTENhdGFsb2dFbnRyaWVzKHJlc3VsdCwgc3lzdGVtQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpKTsKLQkJCQkgICAgICAgICAgICAgICAgICAgIAotCQkJCSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lECi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLQkJCQkgICAgICAgICAgICAgICAgewotCQkJCSAgICAgICAgICAgICAgICAJSUNhdGFsb2cgdXNlckNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkgICAgICAgICAgICAgICAgICAgIGFkZFhNTENhdGFsb2dFbnRyaWVzKHJlc3VsdCwgdXNlckNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0JCQkJICAgCQkJCSAKLQkJCQkgICAgICAgICAgICAgICAgfQotCQkJCSAgICAgICAgICAgIH0KLQkJCQkgICAgICAgIH0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHRoZVRhYmxlVmlld2VyOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldEtleSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgZW50cnkgPSBnZXRYTUxDYXRhbG9nRW50cnkoKTsKLQkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRVUkkoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJcmVzdWx0ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQl0aGlzLmNhdGFsb2dFbnRyeVR5cGUgPSBjYXRhbG9nRW50cnlUeXBlOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1VwZGF0ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTcwY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotcHVibGljIGludGVyZmFjZSBVcGRhdGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVPY2N1cmVkKE9iamVjdCBvYmplY3QsIE9iamVjdCBhcmcpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvWE1MQ2F0YWxvZ1RhYmxlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwZTQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IGdldFhNTENhdGFsb2dFbnRyaWVzKCkudG9BcnJheSgpOwotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCWludCByZXN1bHQgPSAwOwotCQkJCQlpZiAobzEgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5ICYmIG8yIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCQkJSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbzEgPSAoSUNhdGFsb2dFbnRyeSkgbzE7Ci0JCQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvMiA9IChJQ2F0YWxvZ0VudHJ5KSBvMjsKLQkJCQkJCXJlc3VsdCA9IENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShtYXBwaW5nSW5mbzEuZ2V0S2V5KCksIG1hcHBpbmdJbmZvMi5nZXRLZXkoKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlJbWFnZSByZXN1bHQgPSBudWxsOwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlJbWFnZSBiYXNlID0gbnVsbDsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJCVN0cmluZyB1cmkgPSBjYXRhbG9nRW50cnkuZ2V0VVJJKCk7Ci0JCQkJCWlmICh1cmkuZW5kc1dpdGgoImR0ZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2UgPSBkdGRGaWxlSW1hZ2U7Ci0JCQkJCX0gZWxzZSBpZiAodXJpLmVuZHNXaXRoKCJ4c2QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQliYXNlID0geHNkRmlsZUltYWdlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmFzZSA9IHVua25vd25GaWxlSW1hZ2U7Ci0JCQkJCX0KLQotCQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJCQlyZXN1bHQgPSBiYXNlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvL1RPRE8uLi4gU1NFIHBvcnQKLQkJCQkJCQlyZXN1bHQgPSBiYXNlOy8vaW1hZ2VGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZUltYWdlKGJhc2UsCi0JCQkJCQkJLy8gZXJyb3JJbWFnZSwKLQkJCQkJCQkvLyBJbWFnZUZhY3RvcnkuQk9UVE9NX0xFRlQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJcmVzdWx0ID0gY29sdW1uSW5kZXggPT0gMCA/IGNhdGFsb2dFbnRyeS5nZXRLZXkoKSA6IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQlyZXN1bHQgPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHJlc3VsdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQljbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQotCQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGVsZW1lbnQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjYXRhbG9nRW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGR0ZEZpbGVJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRFRERklMRSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFUlJPUl9TVEFURV9LRVkgPSAiZXJyb3JzdGF0ZWtleSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVycm9ySW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT1ZSX0VSUk9SKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgdW5rbm93bkZpbGVJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKTsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHhzZEZpbGVJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfWFNERklMRSk7Ci0KLQkvL3Byb3RlY3RlZCBJbWFnZUZhY3RvcnkgaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeSgpOwotCi0JcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kbmQvRHJhZ05vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDM5MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBEcmFnTm9kZUNvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQlwcml2YXRlIExpc3QgZlNlbGVjdGlvbnM7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCQotCXB1YmxpYyBEcmFnTm9kZUNvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCQlmVHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0JCWZTZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpbk1vZGVsQ2hhbmdlKE5vZGUgbm9kZSwgYm9vbGVhbiBiYXRjaFVwZGF0ZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbChub2RlKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdW5kb0Rlc2MgPSBuZXcgU3RyaW5nKCk7Ci0JCQlpZiAoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJCXVuZG9EZXNjID0gWE1MVUlNZXNzYWdlcy5EcmFnTm9kZUNvbW1hbmRfMDsKLQkJCX0gZWxzZSBpZiAoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfQ09QWSkgewotCQkJCXVuZG9EZXNjID0gWE1MVUlNZXNzYWdlcy5EcmFnTm9kZUNvbW1hbmRfMTsKLQkJCX0KLQkJCQotCQkJc3RydWN0dXJlZE1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIHVuZG9EZXNjKTsKLQkJCWlmIChiYXRjaFVwZGF0ZSkgewotCQkJCS8vICBzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZXhlY3V0ZUhlbHBlcih0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9Nb2RpZnkoTm9kZSBzb3VyY2UsIE5vZGUgcGFyZW50Tm9kZSwgTm9kZSByZWZDaGlsZCwgYm9vbGVhbiB0ZXN0T25seSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoc291cmNlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJQXR0ciBzb3VyY2VBdHRyaWJ1dGUgPSAoQXR0cikgc291cmNlOwotCQkJRWxlbWVudCBzb3VyY2VBdHRyaWJ1dGVPd25lckVsZW1lbnQgPSBzb3VyY2VBdHRyaWJ1dGUuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIHNvdXJjZUF0dHJpYnV0ZU93bmVyRWxlbWVudCAhPSBwYXJlbnROb2RlKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlpZiAoIXRlc3RPbmx5KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJCQkJRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKEVsZW1lbnQpIHBhcmVudE5vZGU7Ci0JCQkJCQkJc291cmNlQXR0cmlidXRlT3duZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoc291cmNlQXR0cmlidXRlKTsKLQkJCQkJCQl0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5zZXROYW1lZEl0ZW0oc291cmNlQXR0cmlidXRlKTsKLQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQoc291cmNlQXR0cmlidXRlKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQkJCQlBdHRyIGNsb25lQXR0cmlidXRlID0gKEF0dHIpIHNvdXJjZUF0dHJpYnV0ZS5jbG9uZU5vZGUoZmFsc2UpOwkJCQkJCQotCQkJCQkJCUVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJCQkJCXRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLnNldE5hbWVkSXRlbShjbG9uZUF0dHJpYnV0ZSk7Ci0JCQkJCQkJZlNlbGVjdGlvbnMuYWRkKGNsb25lQXR0cmlidXRlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICgocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFIHx8IHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpICYmIAotCQkJCSEocmVmQ2hpbGQgaW5zdGFuY2VvZiBBdHRyKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0KLQkJCQlpZiAoIXRlc3RPbmx5KSB7Ci0JCQkJCWlmIChpc0FuY2VzdG9yKHNvdXJjZSwgcGFyZW50Tm9kZSkpIHsKLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYW4gbm90IHBlcmZvcm0gdGhpcyBkcmFnIGRyb3Agb3BlcmF0aW9uLi4uLiB0b2RvLi4uIHBvcCB1cCBkaWFsb2ciKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGRlZmVjdCAyMjEwNTUgdGhpcyB0ZXN0IGlzIHJlcXVpcmVkIG9yIGVsc2UgdGhlIG5vZGUgd2lsbAotCQkJCQkJLy8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIGFuZCB0aGUgaW5zZXJ0IHdpbGwgZmFpbAotCQkJCQkJaWYgKHNvdXJjZSAhPSByZWZDaGlsZCkgewotCQkJCQkJCWlmKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX01PVkUpIHsKLQkJCQkJCQkJc291cmNlLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChzb3VyY2UpOwotCQkJCQkJCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShzb3VyY2UsIHJlZkNoaWxkKTsKLQkJCQkJCQkJZlNlbGVjdGlvbnMuYWRkKHNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQkJCQkJTm9kZSBub2RlQ2xvbmUgPSBzb3VyY2UuY2xvbmVOb2RlKHRydWUpOwotCQkJCQkJCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlQ2xvbmUsIHJlZkNoaWxkKTsKLQkJCQkJCQkJZlNlbGVjdGlvbnMuYWRkKG5vZGVDbG9uZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbmRNb2RlbENoYW5nZShOb2RlIG5vZGUsIGJvb2xlYW4gYmF0Y2hVcGRhdGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBnZXRTdHJ1Y3R1cmVkTW9kZWwobm9kZSk7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJc3RydWN0dXJlZE1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCWlmIChiYXRjaFVwZGF0ZSkgewotCQkJCS8vICBzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlleGVjdXRlSGVscGVyKGZhbHNlKTsKLQkJCi0JCS8vIE1ha2Ugb3VyIHNlbGVjdGlvbiBpZiB0aGUgdHJlZVZpZXdlciAhPSBudWxsCi0JCWlmIChmVHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmU2VsZWN0aW9ucyk7Ci0JCQlmVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUhlbHBlcihib29sZWFuIHRlc3RPbmx5KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgdGFyZ2V0Tm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCQlOb2RlIHBhcmVudE5vZGUgPSBnZXRQYXJlbnRGb3JEcm9wUG9zaXRpb24odGFyZ2V0Tm9kZSk7Ci0JCQlOb2RlIHJlZkNoaWxkID0gZ2V0UmVmQ2hpbGQodGFyZ2V0Tm9kZSk7Ci0KLQkJCVZlY3RvciBzb3VyY2VzTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCXNvdXJjZXNMaXN0LmFkZEFsbChzb3VyY2VzKTsKLQotCQkJcmVtb3ZlTWVtYmVyRGVzY2VuZGFudHMoc291cmNlc0xpc3QpOwotCQkJYm9vbGVhbiBwZXJmb3JtQmF0Y2hVcGRhdGUgPSBzb3VyY2VzTGlzdC5zaXplKCkgPiA1OwotCi0JCQlpZiAoIXRlc3RPbmx5KSB7Ci0JCQkJYmVnaW5Nb2RlbENoYW5nZSh0YXJnZXROb2RlLCBwZXJmb3JtQmF0Y2hVcGRhdGUpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpID0gc291cmNlc0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHNvdXJjZSA9IGkubmV4dCgpOwotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCWlmICghKHJlZkNoaWxkID09IG51bGwgJiYgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEF0dHIpKSB7Ci0JCQkJCQlyZXN1bHQgPSBkb01vZGlmeSgoTm9kZSkgc291cmNlLCBwYXJlbnROb2RlLCByZWZDaGlsZCwgdGVzdE9ubHkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCWVuZE1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGludCBnZXRGZWVkYmFjaygpIHsKLQkJaW50IHJlc3VsdCA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCWlmIChsb2NhdGlvbiA+IDAuNzUpIHsKLQkJCXJlc3VsdCA9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCX0gZWxzZSBpZiAobG9jYXRpb24gPCAwLjI1KSB7Ci0JCQlyZXN1bHQgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXRQYXJlbnRGb3JEcm9wUG9zaXRpb24oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcmVzdWx0ID0gbnVsbDsKLQotCQlpbnQgZmVlZGJhY2sgPSBnZXRGZWVkYmFjaygpOwotCQlpZiAoZmVlZGJhY2sgPT0gRE5ELkZFRURCQUNLX1NFTEVDVCkgewotCQkJcmVzdWx0ID0gbm9kZTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGdldFBhcmVudE9yT3duZXIobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZSBnZXRQYXJlbnRPck93bmVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSA/ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkgOiBub2RlLmdldFBhcmVudE5vZGUoKTsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZSBnZXRSZWZDaGlsZChOb2RlIG5vZGUpIHsKLQkJTm9kZSByZXN1bHQgPSBudWxsOwotCi0JCWludCBmZWVkYmFjayA9IGdldEZlZWRiYWNrKCk7Ci0KLQkJaWYgKGZlZWRiYWNrID09IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFKSB7Ci0JCQlyZXN1bHQgPSBub2RlOwotCQl9IGVsc2UgaWYgKGZlZWRiYWNrID09IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVIpIHsKLQkJCXJlc3VsdCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRTdHJ1Y3R1cmVkTW9kZWwgKE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXJlc3VsdCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyByZXR1cm5zIHRydWUgaWYgYSBpcyBhbiBhbmNlc3RvcmUgb2YgYgotCS8vCi0JcHJpdmF0ZSBib29sZWFuIGlzQW5jZXN0b3IoTm9kZSBhLCBOb2RlIGIpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChOb2RlIHBhcmVudCA9IGI7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50ID09IGEpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIG1lbWJlcnMgb2YgdGhlIGxpc3QgdGhhdCBoYXZlIGFuY2VzdG9ycyB0aGF0IGFyZQotCSAqIGFsc28gbWVtYmVycyBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWVtYmVyRGVzY2VuZGFudHMoTGlzdCBsaXN0KSB7Ci0JCUhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBub2RlID0gaS5uZXh0KCk7Ci0JCQl0YWJsZS5wdXQobm9kZSwgbm9kZSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGxpc3QuZ2V0KGkpOwotCQkJZm9yIChOb2RlIHBhcmVudCA9IGdldFBhcmVudE9yT3duZXIobm9kZSk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBnZXRQYXJlbnRPck93bmVyKHBhcmVudCkpIHsKLQkJCQlpZiAodGFibGUuZ2V0KHBhcmVudCkgIT0gbnVsbCkgewotCQkJCQlsaXN0LnJlbW92ZShpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9YTUxEcmFnQW5kRHJvcE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kbmQvWE1MRHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTZlZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9YTUxEcmFnQW5kRHJvcE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLk9iamVjdFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLlZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLlZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxEcmFnQW5kRHJvcE1hbmFnZXIgaW1wbGVtZW50cyBEcmFnQW5kRHJvcE1hbmFnZXIgewotCXByaXZhdGUgVHJlZVZpZXdlciBmVmlld2VyOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGREcmFnQW5kRHJvcFN1cHBvcnQoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW117T2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyb3BBZGFwdGVyKHZpZXdlciwgbmV3IFhNTERyYWdBbmREcm9wTWFuYWdlcih2aWV3ZXIpKSk7Ci0JfQotCi0JcHVibGljIFhNTERyYWdBbmREcm9wTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFhNTERyYWdBbmREcm9wTWFuYWdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlmVmlld2VyID0gdmlld2VyOwotCX0KLQotCXB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKSB7Ci0JCURyYWdBbmREcm9wQ29tbWFuZCByZXN1bHQgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmVzdWx0ID0gbmV3IERyYWdOb2RlQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSwgZlZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWE1MRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RvdWJsZWNsaWNrL1hNTERvdWJsZUNsaWNrU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmNzU2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWE1MRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kb3VibGVjbGljazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdFRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTERvdWJsZUNsaWNrU3RyYXRlZ3kgZXh0ZW5kcyBEZWZhdWx0VGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEUgPSAnXCcnOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTUEFDRSA9ICcgJzsKLQlwcm90ZWN0ZWQgaW50IGZDYXJldFBvc2l0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIGludCBmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JcHJvdGVjdGVkIE5vZGUgZk5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIGZTdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBmU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGZUZXh0UmVnaW9uID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrZWQoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlpZiAodGV4dFZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB7Ci0JCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIgPSAoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHRleHRWaWV3ZXI7Ci0JCQl0cnkgewotCQkJCWZTdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQotCQkJCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IGNhcmV0UG9zaXRpb24gPSB0ZXh0Vmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS54OwotCQkJCQlpZiAoY2FyZXRQb3NpdGlvbiA8IDApCi0JCQkJCQlyZXR1cm47Ci0KLQkJCQkJZk5vZGUgPSAoTm9kZSkgZlN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNhcmV0UG9zaXRpb24pOwotCQkJCQlpZiAoZk5vZGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQotCQkJCQl1cGRhdGVEb3VibGVDbGlja0NvdW50KGNhcmV0UG9zaXRpb24pOwotCQkJCQl1cGRhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJdXBkYXRlVGV4dFJlZ2lvbigpOwotCi0JCQkJCWlmIChmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJcHJvY2Vzc1RleHREb3VibGVDbGlja2VkKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXByb2Nlc3NFbGVtZW50RG91YmxlQ2xpY2tlZCgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJZlN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRXb3JkKFN0cmluZyBzdHJpbmcsIGludCBjdXJzb3IpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IHdvcmRTdGFydCA9IDA7Ci0JCWludCB3b3JkRW5kID0gc3RyaW5nLmxlbmd0aCgpOwotCi0JCXdvcmRTdGFydCA9IHN0cmluZy5sYXN0SW5kZXhPZihTUEFDRSwgY3Vyc29yIC0gMSk7Ci0JCWludCB0ZW1wID0gc3RyaW5nLmxhc3RJbmRleE9mKFNJTkdMRV9RVU9URSwgY3Vyc29yIC0gMSk7Ci0JCXdvcmRTdGFydCA9IE1hdGgubWF4KHdvcmRTdGFydCwgdGVtcCk7Ci0JCXRlbXAgPSBzdHJpbmcubGFzdEluZGV4T2YoRE9VQkxFX1FVT1RFLCBjdXJzb3IgLSAxKTsKLQkJd29yZFN0YXJ0ID0gTWF0aC5tYXgod29yZFN0YXJ0LCB0ZW1wKTsKLQkJaWYgKHdvcmRTdGFydCA9PSAtMSkKLQkJCXdvcmRTdGFydCA9IGN1cnNvcjsKLQkJZWxzZQotCQkJd29yZFN0YXJ0Kys7Ci0KLQkJd29yZEVuZCA9IHN0cmluZy5pbmRleE9mKFNQQUNFLCBjdXJzb3IpOwotCQlpZiAod29yZEVuZCA9PSAtMSkKLQkJCXdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCXRlbXAgPSBzdHJpbmcuaW5kZXhPZihTSU5HTEVfUVVPVEUsIGN1cnNvcik7Ci0JCWlmICh0ZW1wID09IC0xKQotCQkJdGVtcCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJd29yZEVuZCA9IE1hdGgubWluKHdvcmRFbmQsIHRlbXApOwotCQl0ZW1wID0gc3RyaW5nLmluZGV4T2YoRE9VQkxFX1FVT1RFLCBjdXJzb3IpOwotCQlpZiAodGVtcCA9PSAtMSkKLQkJCXRlbXAgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCXdvcmRFbmQgPSBNYXRoLm1pbih3b3JkRW5kLCB0ZW1wKTsKLQkJaWYgKHdvcmRFbmQgPT0gc3RyaW5nLmxlbmd0aCgpKQotCQkJd29yZEVuZCA9IGN1cnNvcjsKLQotCQlpZiAoKHdvcmRTdGFydCA9PSB3b3JkRW5kKSAmJiAhaXNRdW90ZWQoc3RyaW5nKSkgewotCQkJd29yZFN0YXJ0ID0gMDsKLQkJCXdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFBvaW50KHdvcmRTdGFydCwgd29yZEVuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkgJiYgKGxhc3RDaGFyID09IFNJTkdMRV9RVU9URSkpIHx8ICgoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URSkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudEF0dHJFcXVhbHNEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pIC0gMTsKLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0JCWludCBuZXh0UmVnaW9uT2Zmc2V0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoZlRleHRSZWdpb24pOwotCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXh0UmVnaW9uT2Zmc2V0KTsKLQotCQlpZiAoKHByZXZSZWdpb24gIT0gbnVsbCkgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgJiYgKG5leHRSZWdpb24gIT0gbnVsbCkgJiYgKG5leHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZSZWdpb24pLCBuZXh0UmVnaW9uLmdldFRleHRFbmQoKSAtIHByZXZSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudEF0dHJOYW1lRG91YmxlQ2xpY2tlZDJUaW1lcygpIHsKLQkJaW50IG5leHRSZWdpb25PZmZzZXQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChmVGV4dFJlZ2lvbik7Ci0JCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5leHRSZWdpb25PZmZzZXQpOwotCi0JCWlmIChuZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCW5leHRSZWdpb25PZmZzZXQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChuZXh0UmVnaW9uKTsKLQkJCW5leHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5leHRSZWdpb25PZmZzZXQpOwotCQkJaWYgKChuZXh0UmVnaW9uICE9IG51bGwpICYmIChuZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pLCBuZXh0UmVnaW9uLmdldFRleHRFbmQoKSAtIGZUZXh0UmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQoKSB7Ci0JCVN0cmluZyByZWdpb25UZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KGZUZXh0UmVnaW9uKTsKLQotCQlpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMSkgewotCQkJUG9pbnQgd29yZCA9IGdldFdvcmQocmVnaW9uVGV4dCwgZkNhcmV0UG9zaXRpb24gLSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSk7Ci0JCQlpZiAod29yZC54ID09IHdvcmQueSkgeyAvLyBubyB3b3JkIGZvdW5kOyBzZWxlY3Qgd2hvbGUgcmVnaW9uCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIHJlZ2lvblRleHQubGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQl9IGVsc2UKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSArIHdvcmQueCwgd29yZC55IC0gd29yZC54KTsKLQkJfSBlbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAyKSB7Ci0JCQlpZiAoaXNRdW90ZWQocmVnaW9uVGV4dCkpIHsKLQkJCQkvLyA9PT4gLy8gUG9pbnQgd29yZCA9IGdldFdvcmQocmVnaW9uVGV4dCwgZkNhcmV0UG9zaXRpb24gLQotCQkJCS8vIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pKTsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgcmVnaW9uVGV4dC5sZW5ndGgoKSk7Ci0JCQl9IGVsc2UKLQkJCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJfSBlbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAzKSB7Ci0JCQlpZiAoaXNRdW90ZWQocmVnaW9uVGV4dCkpCi0JCQkJcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQllbHNlIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZkRvdWJsZUNsaWNrQ291bnQgPT0gNAotCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0clZhbHVlRG91YmxlQ2xpY2tlZDJUaW1lcygpIHsKLQkJaW50IHByZXZSZWdpb25PZmZzZXQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSAtIDE7Ci0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZSZWdpb25PZmZzZXQpOwotCi0JCWlmIChwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCXByZXZSZWdpb25PZmZzZXQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZSZWdpb24pIC0gMTsKLQkJCXByZXZSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZSZWdpb25PZmZzZXQpOwotCQkJaWYgKChwcmV2UmVnaW9uICE9IG51bGwpICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChwcmV2UmVnaW9uKSwgZlRleHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gcHJldlJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50RG91YmxlQ2xpY2tlZCgpIHsKLQkJaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkKCk7IC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yCi0JCS8vIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFCi0JCWVsc2UgewotCQkJaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDEpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBmVGV4dFJlZ2lvbi5nZXRTdGFydCgpLCBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJfSBlbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAyKSB7Ci0JCQkJaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCXByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJZWxzZSBpZiAoZlRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKQotCQkJCQlwcm9jZXNzRWxlbWVudEF0dHJFcXVhbHNEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBmRG91YmxlQ2xpY2tDb3VudCA9PSAzCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGV4dERvdWJsZUNsaWNrZWQoKSB7Ci0JCWlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAxKSB7Ci0JCQlzdXBlci5kb3VibGVDbGlja2VkKGZTdHJ1Y3R1cmVkVGV4dFZpZXdlcik7Ci0KLQkJCVBvaW50IHNlbGVjdGVkUmFuZ2UgPSBmU3RydWN0dXJlZFRleHRWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJaWYgKChzZWxlY3RlZFJhbmdlLnggPT0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikpICYmIChzZWxlY3RlZFJhbmdlLnkgPT0gZlRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpKSkKLQkJCQkvLyBvbmx5IG9uZSB3b3JkIGluIHJlZ2lvbiwgc2tpcCBvbmUgbGV2ZWwgb2YgZG91YmxlIGNsaWNrCi0JCQkJLy8gc2VsZWN0aW9uCi0JCQkJZkRvdWJsZUNsaWNrQ291bnQrKzsKLQkJfSBlbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAyKSB7Ci0JCQlpZiAoZlRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpc1F1b3RlZChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGZUZXh0UmVnaW9uKSkpCi0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pICsgMSwgZlRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpIC0gMik7Ci0JCQkJZWxzZQotCQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgZlRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoZkRvdWJsZUNsaWNrQ291bnQgPT0gMykgJiYgaXNRdW90ZWQoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dChmVGV4dFJlZ2lvbikpKQotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pLCBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKChmRG91YmxlQ2xpY2tDb3VudCA9PSAzKSAmJiBpc1F1b3RlZChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCkpCi0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIDEsIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkgLSAyKTsKLQkJCQllbHNlIHsKLQkJCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWZTdHJ1Y3R1cmVkTW9kZWwgPSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRG91YmxlQ2xpY2tDb3VudChpbnQgY2FyZXRQb3NpdGlvbikgewotCQlpZiAoZkNhcmV0UG9zaXRpb24gPT0gY2FyZXRQb3NpdGlvbikgewotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCsrOwotCQkJZWxzZQotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMTsKLQkJfSBlbHNlIHsKLQkJCWZDYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbjsKLQkJCWZEb3VibGVDbGlja0NvdW50ID0gMTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZkNhcmV0UG9zaXRpb24pOwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJZWxzZQotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRleHRSZWdpb24oKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWZUZXh0UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ2FyZXRQb3NpdGlvbik7Ci0JCQkvLyBpZiBmVGV4dFJlZ2lvbiBpcyBudWxsLCBpdCBtZWFucyB3ZSBhcmUgYXQganVzdCBwYXN0IHRoZSBsYXN0Ci0JCQkvLyBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCQkJLy8gYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBkb2N1bWVudCwgc28gd2UnbGwgdXNlIHRoZSBsYXN0IHRleHQKLQkJCS8vIHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQKLQkJCWlmIChmVGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJZlRleHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZDYXJldFBvc2l0aW9uIC0gMSk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJZlRleHRSZWdpb24gPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvQ01JbWFnZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvQ01JbWFnZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwNjE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0NNSW1hZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIG5zZAotICovCi1wdWJsaWMgY2xhc3MgQ01JbWFnZVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBDTU5vZGUgZ2V0RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCUNNTm9kZSBkZWNsID0gbnVsbDsKLQkJTW9kZWxRdWVyeSBtcSA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KCgoQXR0cikgbm9kZSkuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQlkZWNsID0gbXEuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQXR0cikgbm9kZSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCW1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJZGVjbCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGNhY2hlIENNLXNwZWNpZmllZCBpbWFnZXMgd2l0aCB0aGUgWE1MIFVJIHBsdWdpbgotCQlTdHJpbmcgaW1hZ2VVUkxTdHJpbmcgPSAoU3RyaW5nKSBjbW5vZGUuZ2V0UHJvcGVydHkoInNtYWxsLWljb24iKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChpbWFnZVVSTFN0cmluZyAhPSBudWxsICYmIGltYWdlVVJMU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJZGVzY3JpcHRvciA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpCi0JCQkJCS5nZXREZXNjcmlwdG9yKGltYWdlVVJMU3RyaW5nKTsKLQkJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGltYWdlVVJMU3RyaW5nKTsKLQkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gaW1hZ2VVUkwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2VEYXRhKGRhdGEpOwotCQkJCQlYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoCi0JCQkJCQkJaW1hZ2VVUkxTdHJpbmcsIGRlc2NyaXB0b3IpOwotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBudWxsOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ01JbWFnZVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYmVjNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBYTUwgU291cmNlIEVkaXRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gWE1MVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBYTUwgU291cmNlIHBhZ2UgZWRpdG9yCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NPVVJDRVZJRVdfSEVMUElEID0KLQkvLyBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MICsiX3NvdXJjZV9IZWxwSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA2MCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBYTUwgU291cmNlIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QUkVGV0VCWF9TT1VSQ0VfSEVMUElEID0gUFJFRklYICsgIndlYngwMDYxIjsgLy8kTk9OLU5MUy0xJAotCS8vIFhNTCBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjIiOyAvLyROT04tTkxTLTEkCi0JLy8gWE1MIFRlbXBsYXRlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA2MyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFhNTCBDbGVhbnVwIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfWE1MX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTIwMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzMzhkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBYTUxVSVBsdWdpbi5JRDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiNGFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgWE1MIFNvdXJjZSBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvclBsdWdpbkltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09OU1RSQUlOT0ZGID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PTiA9ICJpY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9STERHUk1SID0gImljb25zL2Z1bGwvZHRvb2wxNi9ybGRncm1yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfVkFMSURBVEUgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09OU1RSQUlOT0ZGID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PTiA9ICJpY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9STERHUk1SID0gImljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfVkFMSURBVEUgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9DT1JSRUNUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvYWRkX2NvcnJlY3Rpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQVRUX1JFUV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0RBVEFTRUNUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvY2RhdGFzZWN0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPTU1FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DT1JSRUNUSU9OX0NIQU5HRSA9ICJpY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RPQ1RZUEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RUREZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTEVNRU5UID0gImljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5USVRZID0gImljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVU0gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0xPQ0FMX1ZBUklBQkxFID0gImljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTk9UQVRJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDX0RFRU1QSEFTSVpFRCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLWRlZW1waGFzaXplZC5naWYiOyAvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUNfRU1QSEFTSVpFRCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLWVtcGhhc2l6ZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJCAgICAgICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfTUFDUk8gPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctbWFjcm8uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVFhURVhUID0gImljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9XQVJOSU5HX09CSiA9ICJpY29ucy9mdWxsL29iajE2L3dhcm5pbmdfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1hTREZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfRVJST1IgPSAiaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfU1RBTEVfRVJST1IgPSAiaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfV0FSTiA9ICJpY29ucy9mdWxsL292cjE2L3dhcm5fb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlODZmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSAqIEVkaXRvcklucHV0IGZvciBleHRlcm5hbCBmaWxlcy4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmVkaXRvcnMudGV4dC5KYXZhRmlsZUVkaXRvcklucHV0Ci0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggYWRhcHRlciB3aGljaCBzaW1wbHkgcHJvdmlkZXMgdGhlIGxhYmVsLgotCSAqLwotCXByaXZhdGUgY2xhc3MgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAoKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvKS5nZXROYW1lKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGZGaWxlOwotCXByaXZhdGUgV29ya2JlbmNoQWRhcHRlciBmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQkJZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmRmlsZS5leGlzdHMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJTG9jYXRpb25Qcm92aWRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCXJldHVybiBmV29ya2JlbmNoQWRhcHRlcjsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0I2dldFBhdGgoKQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQkJCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgSVBhdGhFZGl0b3JJbnB1dCBpbnB1dD0gKElQYXRoRWRpdG9ySW5wdXQpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKCkuZXF1YWxzKGlucHV0LmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRmlsZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTZhMDcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIGV4dGVybmFsIGZpbGVzLgotICovCi1jbGFzcyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JCi0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb247Ci0JcHJpdmF0ZSBGaWxlIGZIeXBlcmxpbmtGaWxlOwotCi0JcHVibGljIEV4dGVybmFsRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgRmlsZSBmaWxlKSB7Ci0JCWZIeXBlcmxpbmtGaWxlID0gZmlsZTsKLQkJZkh5cGVybGlua1JlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkh5cGVybGlua0ZpbGUgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEV4dGVybmFsRmlsZUVkaXRvcklucHV0KGZIeXBlcmxpbmtGaWxlKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZmU5Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBmaWxlcyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gKEFzIGxvbmcgYXMgdGhlcmUgaXMgYW4gSUZpbGUsCi0gKiB0aGlzIGNhbiBiZSB1c2VkKSBPcGVucyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoZSBmaWxlLgotICovCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmRmlsZSAhPSBudWxsICYmIGZGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmRmlsZSwgdHJ1ZSk7Ci0JCQkJLy8gaGlnaGxpZ2h0IHJhbmdlIGluIGVkaXRvciBpZiBwb3NzaWJsZQotCQkJCWlmIChmSGlnaGxpZ2h0UmFuZ2UgIT0gbnVsbCAmJiBlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkoKElUZXh0RWRpdG9yKSBlZGl0b3IpLnNldEhpZ2hsaWdodFJhbmdlKGZIaWdobGlnaHRSYW5nZS5nZXRPZmZzZXQoKSwgZkhpZ2hsaWdodFJhbmdlLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzk1OTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5VUkxIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIERldGVjdHMgaHlwZXJsaW5rcyBpbiBYTUwgdGFncy4gSW5jbHVkZXMgZGV0ZWN0aW9uIGluIERPQ1RZUEUgYW5kIGF0dHJpYnV0ZQotICogdmFsdWVzLiBSZXNvbHZlcyByZWZlcmVuY2VzIHRvIHNjaGVtYXMsIGR0ZHMsIGV0YyB1c2luZyB0aGUgQ29tbW9uIFVSSQotICogUmVzb2x2ZXIuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTEh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudHMgSUh5cGVybGlua0RldGVjdG9yIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OID0gIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBoeXBlcmxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEByZXR1cm4gSUh5cGVybGluawotCSAqLwotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoU3RyaW5nIHVyaVN0cmluZywgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBub2RlKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0KLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKSB7Ci0JCQlsaW5rID0gbmV3IFVSTEh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHVyaVN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCUZpbGUgc3lzdGVtRmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoc3lzdGVtRmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbVBhdGggPSBzeXN0ZW1GaWxlLmdldFBhdGgoKTsKLQkJCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShzeXN0ZW1QYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZXhpc3RzIGluCi0JCQkJCS8vIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgaXMgYW4gRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZG9lcyBub3QKLQkJCQkJLy8gZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgc3lzdGVtRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCS8vIGZvciBub3csIG9ubHkgY2FwYWJsZSBvZiBjcmVhdGluZyAxIGh5cGVybGluawotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCU5vZGUgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZShkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaVN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJLy8gZG9jdHlwZSBub2RlcwotCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudE5vZGUsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkvLyBlbGVtZW50IG5vZGVzCi0JCQkJCUF0dHIgY3VycmVudEF0dHIgPSBnZXRDdXJyZW50QXR0ck5vZGUoY3VycmVudE5vZGUsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBsaW5rIGZvciBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJLy8gcmVzb2x2ZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJLy8gdmVyaWZ5IHZhbGlkaXR5IG9mIHVyaSBzdHJpbmcKLQkJCQkJCWlmICh1cmlTdHJpbmcgPT0gbnVsbCB8fCAhaXNWYWxpZFVSSSh1cmlTdHJpbmcpKQotCQkJCQkJCS8vIHJlc2V0IGN1cnJlbnQgYXR0cmlidXRlCi0JCQkJCQkJY3VycmVudEF0dHIgPSBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJyZW50QXR0ciA9PSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBhIGxpbmthYmxlIGF0dHJpYnV0ZSB3aXRoaW4gZWxlbWVudAotCQkJCQkJY3VycmVudEF0dHIgPSBnZXRMaW5rYWJsZUF0dHIoKEVsZW1lbnQpIGN1cnJlbnROb2RlKTsKLQkJCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnRBdHRyLCBkb2N1bWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUgPSBjdXJyZW50QXR0cjsKLQkJCQl9Ci0JCQkJLy8gdHJ5IHRvIGNyZWF0ZSBoeXBlcmxpbmsgZnJvbSBpbmZvcm1hdGlvbiBnYXRoZXJlZAotCQkJCWlmICh1cmlTdHJpbmcgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsICYmIGlzVmFsaWRVUkkodXJpU3RyaW5nKSkgewotCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSk7Ci0JCQkJCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCwgY3VycmVudE5vZGUpOwotCQkJCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCQkJCWh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGxvY2FsIGZpbGUgc3lzdGVtKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEJhc2VMb2NhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWlmIChsb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQliYXNlTG9jID0gbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJCQliYXNlTG9jID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxvY2F0aW9uKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGxvY2F0aW9uKS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZUxvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIGZvciBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWVkID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBub2RlIHdpdGhpbiBub2RlIGF0IG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gQXR0cgotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRDdXJyZW50QXR0ck5vZGUoTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBhdHRyaWJ1dGUgaW4gbm9kZSBhbmQgaWYgYXR0cmlidXRlIGNvbnRhaW5zCi0JCQkvLyBvZmZzZXQsIHJldHVybiB0aGF0IGF0dHJpYnV0ZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkJLy8gYXNzdW1wdGlvbiB0aGF0IGlmIHBhcmVudCBub2RlIGlzIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbiwKLQkJCQkvLyB0aGVuIGl0cyBhdHRyaWJ1dGVzIHdpbGwgYWxzbyBiZSBvZiB0eXBlIEluZGV4ZWRSZWdpb24KLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkgewotCQkJCQlyZXR1cm4gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQlpZiAoaW5vZGUgPT0gbnVsbCkKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCi0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoTm9kZSkgaW5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQKLQkgKiBmaWxlIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgZmlsZSA9PSBudWxsOyBpKyspCi0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKQotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCX0KLQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdXJpU3RyaW5nIGlzIG5vdCBodHRwOi8vCi0JICogQHJldHVybiBGaWxlIGNyZWF0ZWQgZnJvbSB1cmlTdHJpbmcgaWYgcG9zc2libGUsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEZpbGVGcm9tVXJpU3RyaW5nKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IGp1c3QgdHJ5IHRvIGNyZWF0ZSBhIGZpbGUgZGlyZWN0bHkgZnJvbSB1cmlTdHJpbmcgYXMKLQkJCS8vIGRlZmF1bHQgaW4gY2FzZSBjcmVhdGUgZmlsZSBmcm9tIHVyaSBkb2VzIG5vdCB3b3JrCi0JCQlmaWxlID0gbmV3IEZpbGUodXJpU3RyaW5nKTsKLQotCQkJLy8gdHJ5IHRvIGNyZWF0ZSBmaWxlIGZyb20gdXJpCi0JCQlVUkkgdXJpID0gbmV3IFVSSSh1cmlTdHJpbmcpOwotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgRmlsZSBqdXN0IGlnbm9yZQotCQkJLy8gYW5kIGZpbGUgd2lsbCBiZSBudWxsCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihOb2RlIG5vZGUpIHsKLQkJSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQkJCUlET01Ob2RlIGRvY05vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9jTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlcwotCQkJCUlET01BdHRyIGF0dCA9IChJRE9NQXR0cikgbm9kZTsKLQkJCQkvLyBkbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCWludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQlpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKSB7Ci0JCQkJCQkrK3JlZ09mZnNldDsKLQkJCQkJCXJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0JCQkJCX0KLQkJCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGh5cGVyUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGZpbmQgYW4gYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50IHRoYXQgaXMgb3BlbmFibGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIEF0dHIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG9wZW4gb24sIG51bGwgaWYgbm8KLQkgKiAgICAgICAgIGF0dHJpYnV0ZSBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRMaW5rYWJsZUF0dHIoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCS8vIGdldCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIG5vZGUKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkgewotCQkJLy8gY2hlY2sgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIgotCQkJQXR0ciBhdHQgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCWlmIChpc0xpbmthYmxlQXR0cihhdHQsIGVkKSkgewotCQkJCXJldHVybiBhdHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgbG9jYXRpb24gaGludCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVVSSSBpZiBpdCBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudE5vZGUgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBsb2NhdGlvbiBoaW50IChzeXN0ZW1JZCkgaWYgaXQgd2FzIGZvdW5kLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uSGludChFbGVtZW50IGVsZW1lbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCUF0dHIgc2NoZW1hTG9jTm9kZSA9IGVsZW1lbnROb2RlLmdldEF0dHJpYnV0ZU5vZGVOUyhYU0lfTkFNRVNQQUNFX1VSSSwgU0NIRU1BX0xPQ0FUSU9OKTsKLQkJaWYgKHNjaGVtYUxvY05vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzY2hlbWFMb2NOb2RlLmdldFZhbHVlKCkpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJLy8gZm91bmQgbG9jYXRpb24gaGludAotCQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzSWdub3JlQ2FzZShwdWJsaWNJZCkpCi0JCQkJCXJldHVybiBzeXN0ZW1JZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVSSVN0cmluZyhOb2RlIG5vZGUsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgcmVzb2x2ZWRVUkkgPSBudWxsOwotCQkvLyBuZWVkIHRoZSBiYXNlIGxvY2F0aW9uLCBwdWJsaWNJZCwgYW5kIHN5c3RlbUlkIGZvciBVUklSZXNvbHZlcgotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0JCQlwdWJsaWNJZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGUKLQkJCUF0dHIgYXR0ck5vZGUgPSAoQXR0cikgbm9kZTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJOb2RlLmdldE5hbWUoKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXRWYWx1ZSgpOwotCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXAoYXR0clZhbHVlKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiBhdHRyVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0JCQkJCi0JCQkJLy8gaGFuZGxlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCQkJCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkJCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQlwdWJsaWNJZCA9IGF0dHJWYWx1ZTsKLQkJCQkJc3lzdGVtSWQgPSBnZXRMb2NhdGlvbkhpbnQoYXR0ck5vZGUuZ2V0T3duZXJFbGVtZW50KCksIHB1YmxpY0lkKTsKLQkJCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyTm9kZSkpKSAmJiAoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCS8vIGZvciBub3cganVzdCB1c2UgdGhlIGZpcnN0IHBhaXIKLQkJCQkJLy8gbmVlZCB0byBsb29rIGludG8gYmVpbmcgbW9yZSBwcmVjaXNlCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCXN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQkvLyBlbHNlIGNoZWNrIGlmIHhtbG5zIHB1YmxpY0lkID0gdmFsdWUKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlc29sdmVkVVJJID0gcmVzb2x2ZVVSSShiYXNlTG9jLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdXJpU3RyaW5nIGlzIGFuIGh0dHAgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB1cmlTdHJpbmcgaXMgaHR0cCBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0h0dHAoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzSHR0cCA9IGZhbHNlOwotCQlpZiAodXJpU3RyaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZW1wU3RyaW5nID0gdXJpU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcFN0cmluZy5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKQotCQkJCWlzSHR0cCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzSHR0cDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgb3BlbmFibGUuIEF0dHJpYnV0ZSBpcyBvcGVuYWJsZQotCSAqIGlmIGl0IGlzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBvciBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzCi0JICogb2YgdHlwZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIGNtRWxlbWVudAotCSAqICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgKGNhbiBiZQotCSAqICAgICAgICAgICAgbnVsbCkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIiBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5rYWJsZUF0dHIoQXR0ciBhdHRyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnQpIHsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBpcyBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBjb250YWlucyBzY2hlbWEgbG9jYXRpb24KLQkJaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyKSkpICYmICgoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpIHx8IChOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgdmFsdWUgaXMgb2YgdHlwZSBVUkkKLQkJaWYgKGNtRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKENNRGF0YVR5cGUuVVJJLmVxdWFscyhhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHVyaVN0cmluZyBpcyByZWFsbHkgcG9pbnRpbmcgdG8gYSBmaWxlCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVVJJKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0KLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKQotCQkJaXNWYWxpZCA9IHRydWU7Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJaXNWYWxpZCA9IGZpbGUuaXNGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIFVSSSBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24KLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiBAcmV0dXJuIFN0cmluZyByZXNvbHZlZCB1cmkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQkvLyBkb250IHJlc29sdmUgaWYgdGhlcmUncyBub3RoaW5nIHRvIHJlc29sdmUKLQkJaWYgKChiYXNlTG9jYXRpb24gPT0gbnVsbCkgJiYgKHB1YmxpY0lkID09IG51bGwpICYmIChzeXN0ZW1JZCA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWJjOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25BZGROYW1lc3BhY2VzQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCWNsYXNzIEVkaXROYW1lc3BhY2VDb250cm9sIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JCVRleHQgbG9jYXRpb25IaW50RmllbGQ7Ci0JCVRleHQgcHJlZml4RmllbGQ7Ci0JCVRleHQgdXJpRmllbGQ7Ci0KLQkJLy9wcm90ZWN0ZWQgTmFtZXNwYWNlSW5mbyBpbmZvOwotCi0JCXB1YmxpYyBFZGl0TmFtZXNwYWNlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsgLy9CT1JERVIpOwotCQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfRU5URVJfUkVRX1BSRUZJWF9BTkRfTkFNRVNQQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCS8vIHJvdyAxCi0JCQkvLwotCQkJTGFiZWwgcHJlZml4TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlwcmVmaXhMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWF9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHJlZml4RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXByZWZpeEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy9wcmVmaXhGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShpbmZvLnByZWZpeCkpOwotCQkJLy9wcmVmaXhGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkvL3ByZWZpeEZpZWxkLnNldEVuYWJsZWQoaW5mby5nZXRQcm9wZXJ0eSgicHJlZml4LXJlYWRPbmx5IikgPT0KLQkJCS8vIG51bGwpOwotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCQkvLyByb3cgMgotCQkJLy8KLQkJCUxhYmVsIHVyaUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJdXJpTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRV9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQkJdXJpRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXVyaUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy91cmlGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShpbmZvLnVyaSkpOwotCQkJLy91cmlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkvL3VyaUZpZWxkLnNldEVuYWJsZWQoaW5mby5nZXRQcm9wZXJ0eSgidXJpLXJlYWRPbmx5IikgPT0gbnVsbCk7Ci0KLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkJLy8gcm93IDMKLQkJCS8vCi0JCQlMYWJlbCBsb2NhdGlvbkhpbnRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxvY2F0aW9uSGludExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQVRJT05fSElOVF9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQkJbG9jYXRpb25IaW50RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWxvY2F0aW9uSGludEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy9sb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShpbmZvLmxvY2F0aW9uSGludCkpOwotCQkJLy9sb2NhdGlvbkhpbnRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkvL2xvY2F0aW9uSGludEZpZWxkLnNldEVuYWJsZWQoaW5mby5nZXRQcm9wZXJ0eSgibG9jYXRpb25IaW50LXJlYWRPbmx5IikKLQkJCS8vID09IG51bGwpOwotCi0JCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcGVyZm9ybUJyb3dzZSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlicm93c2VCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9CUk9XU0UpOyAvLyROT04tTkxTLTEkCi0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobG9jYXRpb25IaW50RmllbGQuZ2V0RW5hYmxlZCgpKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Ccm93c2UoKSB7Ci0JCQlTdHJpbmdbXSBleHRlbnNpb25zID0geyIueHNkIn07IC8vJE5PTi1OTFMtMSQKLQkJCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKGdldFNoZWxsKCksIGV4dGVuc2lvbnMpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCS8vU3RyaW5nIGdyYW1tYXJVUkkgPSBudWxsOwotCQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJCWlmIChyZXNvdXJjZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIHJlc291cmNlTG9jYXRpb24pOwotCQkJCQkJLy9ncmFtbWFyVVJJID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVyaSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCQkvL2dyYW1tYXJVUkkgPSB1cmk7Ci0JCQkJCX0KLQkJCQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dCh1cmkpOwotCQkJCX0gZWxzZSBpZiAoaWQgIT0gbnVsbCkgewotCQkJCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KGlkKTsKLQkJCQkJLy9VUklSZXNvbHZlciByZXNvbHZlciA9IAotCQkJCQkJVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQkJLy9ncmFtbWFyVVJJID0gcmVzb2x2ZXIucmVzb2x2ZShudWxsLCBpZCwgaWQpOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCS8vVE9ETyBDTURvY3VtZW50IGRvY3VtZW50ID0KLQkJCQkJLy8gQ01Eb2N1bWVudEJ1aWxkZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmJ1aWxkQ01Eb2N1bWVudChncmFtbWFyVVJJKTsKLQkJCQkJLy8JCQkJIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPQotCQkJCQkvLyAoTGlzdClkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iKTsKLQkJCQkJLy8JCQkJIE5hbWVzcGFjZUluZm8gaW5mbyA9Ci0JCQkJCS8vIChOYW1lc3BhY2VJbmZvKW5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCQkJLy8JCQkJIGlmICh1cmlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDAgJiYgaW5mby51cmkKLQkJCQkJLy8gIT0gbnVsbCkKLQkJCQkJLy8JCQkJIHsKLQkJCQkJLy8JCQkJCSB1cmlGaWVsZC5zZXRUZXh0KGluZm8udXJpKTsKLQkJCQkJLy8JCQkJIH0KLQkJCQkJLy8JCQkJIGlmIChwcmVmaXhGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDAgJiYKLQkJCQkJLy8gaW5mby5wcmVmaXggIT0gbnVsbCkKLQkJCQkJLy8JCQkJIHsKLQkJCQkJLy8JCQkJCSBwcmVmaXhGaWVsZC5zZXRUZXh0KGluZm8ucHJlZml4KTsKLQkJCQkJLy8JCQkJIH0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgRWRpdE5hbWVzcGFjZUNvbnRyb2wgZWRpdE5hbWVzcGFjZUNvbnRyb2w7Ci0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gMjUwOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uOwotCXByb3RlY3RlZCBQYWdlQm9vayBwYWdlQm9vazsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJhZGlvMTsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJhZGlvMjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRhYmxlU2VjdGlvbjsKLQlwcm90ZWN0ZWQgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBpbnQgd2lkdGhIaW50ID0gNTAwOwotCi0KLQlwdWJsaWMgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAod2lkdGhIaW50ICE9IC0xKSB7Ci0JCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCX0KLQkJaWYgKGhlaWdodEhpbnQgIT0gLTEpIHsKLQkJCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl9Ci0JCXNldExheW91dERhdGEoZ2QpOwotCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJcmFkaW8xID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpbzEuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9TRUxFQ1RfUkVHSVNURVJFRF9OQU1FU1BBQ0VTKTsgLy8kTk9OLU5MUy0xJAotCQlyYWRpbzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmFkaW8yID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpbzIuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9TUEVDSUZZX05FV19OQU1FU1BBQ0UpOyAvLyROT04tTkxTLTEkCi0JCXJhZGlvMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwodGhpcywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkvL0dyb3VwIG5hbWVzcGFjZUluZm9Hcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTk9ORSk7Ci0JCS8vbmFtZXNwYWNlSW5mb0dyb3VwLnNldFRleHQoIk5hbWVzcGFjZSBEZWNsYXJhdGlvbnMiKTsKLQkJLy8gLy9YTUxDb21tb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0xBQkVMX1hNTF9TQ0hFTUFfSU5GT1JNQVRJT04iKSk7Ci0JCS8vbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkvL25hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQl0YWJsZVNlY3Rpb24gPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCXRhYmxlU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlU2VjdGlvbiwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1NFTEVDVF9OQU1FU1BBQ0VfVE9fQUREKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRhYmxlVmlld2VyID0gbmV3IENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSh0YWJsZVNlY3Rpb24sIFNXVC5DSEVDSywgNik7Ci0JCWVkaXROYW1lc3BhY2VDb250cm9sID0gbmV3IEVkaXROYW1lc3BhY2VDb250cm9sKHBhZ2VCb29rKTsKLQkJcGFnZUJvb2suc2hvd1BhZ2UodGFibGVTZWN0aW9uKTsKLQotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JfQotCi0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyYWRpbzEuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQkJaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0JCQkJCWxpc3QuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotCQkJaW5mby5wcmVmaXggPSBlZGl0TmFtZXNwYWNlQ29udHJvbC5wcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0JCQlpbmZvLnVyaSA9IGVkaXROYW1lc3BhY2VDb250cm9sLnVyaUZpZWxkLmdldFRleHQoKTsKLQkJCWluZm8ubG9jYXRpb25IaW50ID0gZWRpdE5hbWVzcGFjZUNvbnRyb2wubG9jYXRpb25IaW50RmllbGQuZ2V0VGV4dCgpOwotCQkJbGlzdC5hZGQoaW5mbyk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0KSB7Ci0JCW5hbWVzcGFjZUluZm9MaXN0ID0gbGlzdDsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gcmFkaW8xKSB7Ci0JCQlwYWdlQm9vay5zaG93UGFnZSh0YWJsZVNlY3Rpb24pOwotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhZGlvMikgewotCQkJcGFnZUJvb2suc2hvd1BhZ2UoZWRpdE5hbWVzcGFjZUNvbnRyb2wpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4NGFlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIENvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sIGFkZE5hbWVzcGFjZXNDb250cm9sOwotCXByb3RlY3RlZCBMaXN0IGV4aXN0aW5nTmFtZXNwYWNlczsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBIYXNoTWFwIHByZWZlcnJlZFByZWZpeFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIENvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbiwgTGlzdCBleGlzdGluZ05hbWVzcGFjZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZXhpc3RpbmdOYW1lc3BhY2VzID0gZXhpc3RpbmdOYW1lc3BhY2VzOwotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgIndzZGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIsICJzb2FwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iLCAiaHR0cCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiwgIm1pbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCAic29hcGVuYyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJzb2FwZW52Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4c2QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQnVpbHRJbk5hbWVzcGFjZXMoTGlzdCBsaXN0KSB7Ci0JCVN0cmluZyB4c2lOYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB4c2ROYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JCWlmICghaXNBbHJlYWR5RGVjbGFyZWQoeHNpTmFtZXNwYWNlKSkgewotCQkJbGlzdC5hZGQobmV3IE5hbWVzcGFjZUluZm8oImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKCFpc0FscmVhZHlEZWNsYXJlZCh4c2ROYW1lc3BhY2UpKSB7Ci0JCQlsaXN0LmFkZChuZXcgTmFtZXNwYWNlSW5mbygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAieHNkIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENhdGFsb2dNYXBUb0xpc3QoSUNhdGFsb2cgY2F0YWxvZywgTGlzdCBsaXN0KSB7Ci0JCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gY2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDICYmIGVudHJ5LmdldFVSSSgpLmVuZHNXaXRoKCIueHNkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghaXNBbHJlYWR5RGVjbGFyZWQoZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKGVudHJ5LmdldEtleSgpLCAieHgiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsaXN0LmFkZChuYW1lc3BhY2VJbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJbmFtZXNwYWNlSW5mb0xpc3QgPSBhZGROYW1lc3BhY2VzQ29udHJvbC5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXB1dGVBZGRhYmxlUHJlZml4ZXMoTGlzdCBhZGRhYmxlTGlzdCwgTGlzdCBleGlzaXRpbmdMaXN0KSB7Ci0JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZXhpc2l0aW5nTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCWlmIChpbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChpbmZvLnByZWZpeCwgaW5mbyk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpID0gYWRkYWJsZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby51cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBwcmVmZXJyZWRQcmVmaXhUYWJsZS5nZXQoaW5mby51cmkpOwotCQkJCWluZm8ucHJlZml4ID0gZ2V0VW5pcXVlUHJlZml4KG1hcCwgcHJlZml4LCBpbmZvLnVyaSk7Ci0JCQkJbWFwLnB1dChpbmZvLnByZWZpeCwgaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKSB7Ci0JCWNyZWF0ZSgpOwotCQlnZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlSZWN0YW5nbGUgciA9IGdldFNoZWxsKCkuZ2V0Qm91bmRzKCk7Ci0JCWdldFNoZWxsKCkuc2V0Qm91bmRzKHIueCArIDgwLCByLnkgKyA4MCwgci53aWR0aCwgci5oZWlnaHQpOwotCQlzZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJcmV0dXJuIG9wZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlhZGROYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25BZGROYW1lc3BhY2VzQ29udHJvbChkaWFsb2dBcmVhLCBTV1QuTk9ORSwgcmVzb3VyY2VMb2NhdGlvbik7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlhZGRCdWlsdEluTmFtZXNwYWNlcyhsaXN0KTsKLQkJSUNhdGFsb2cgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotICAgICAgICAgICAgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAlJQ2F0YWxvZyB1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICAgICAgICAgIAlhZGRDYXRhbG9nTWFwVG9MaXN0KHVzZXJDYXRhbG9nLCBsaXN0KTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRAotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgCUlDYXRhbG9nIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgICAgICAgICAgIAkJYWRkQ2F0YWxvZ01hcFRvTGlzdChzeXN0ZW1DYXRhbG9nLCBsaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkKLQkJY29tcHV0ZUFkZGFibGVQcmVmaXhlcyhsaXN0LCBleGlzdGluZ05hbWVzcGFjZXMpOwotCi0JCWFkZE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KGxpc3QpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHByZWZlcnJlZFByZWZpeFRhYmxlLmdldChuYW1lc3BhY2VVUkkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVByZWZpeChIYXNoTWFwIHByZWZpeE1hcCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCWludCBsYXN0SW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsYXN0SW5kZXggPT0gdXJpLmxlbmd0aCgpIC0gMSkgewotCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTsKLQkJCQlsYXN0SW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCX0KLQkJCXByZWZpeCA9IHVyaS5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSk7Ci0JCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMjAgfHwgcHJlZml4LmluZGV4T2YoJzonKSAhPSAtMSkgewotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQlwcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocHJlZml4TWFwLmdldChwcmVmaXgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBiYXNlID0gcHJlZml4OwotCQkJZm9yIChpbnQgY291bnQgPSAwOyBwcmVmaXhNYXAuZ2V0KHByZWZpeCkgIT0gbnVsbDsgY291bnQrKykgewotCQkJCXByZWZpeCA9IGJhc2UgKyBjb3VudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWxyZWFkeURlY2xhcmVkKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gZXhpc3RpbmdOYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMobmFtZXNwYWNlSW5mby51cmkpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwZDljMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLk5hbWVzcGFjZUluZm9FcnJvckhlbHBlcjsKLQotcHVibGljIGNsYXNzIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIHsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbW1vbkNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gMjUwOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBuZXdCdXR0b247Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd0xvY2F0aW9uVGV4dCA9IGZhbHNlOwotCXByb3RlY3RlZCBTdHJpbmcgdGFibGVMYWJlbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSB0YWJsZVZpZXdlcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlOwotCXByb3RlY3RlZCBib29sZWFuIHVzZUdyb3VwOwotCXByb3RlY3RlZCBpbnQgd2lkdGhIaW50ID0gNTAwOwotCi0JcHVibGljIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyBzdHJpbmdUYWJsZUxhYmVsKSB7Ci0JCXRoaXMocGFyZW50LCByZXNvdXJjZUxvY2F0aW9uLCBzdHJpbmdUYWJsZUxhYmVsLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhDb21wb3NpdGUgcGFyZW50LCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgc3RyaW5nVGFibGVMYWJlbCwgYm9vbGVhbiB1c2VHcm91cCwgYm9vbGVhbiBzaG93TG9jVGV4dCkgewotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0YWJsZUxhYmVsID0gc3RyaW5nVGFibGVMYWJlbDsKLQkJdGhpcy51c2VHcm91cCA9IHVzZUdyb3VwOwotCQlzaG93TG9jYXRpb25UZXh0ID0gc2hvd0xvY1RleHQ7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKHdpZHRoSGludCAhPSAtMSkgewotCQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl9Ci0JCWlmIChoZWlnaHRIaW50ICE9IC0xKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJfQotCi0JCS8vIFNldCBHcmlkRGF0YSBhbmQgR3JpZExheW91dCBmb3IgdGhlIHBhcmVudCBDb21wb3NpdGUKLQkJcGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgdG9wIENvbXBvc2l0ZQotCQl0b3BDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSB0b3BEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXRvcERhdGEuaGVpZ2h0SGludCA9IDA7Ci0JCXRvcENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHRvcERhdGEpOwotCQl0b3BDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgJ2NvbW1vbicvbWlkZGxlIENvbXBvc2l0ZQotCQlpZiAodXNlR3JvdXApIHsKLQkJCWNvbW1vbkNvbXBvc2l0ZSA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJfSBlbHNlIHsKLQkJCWNvbW1vbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCX0KLQkJY29tbW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21tb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJLy8gQWRkIHRoZSBlcnJvciBNZXNzYWdlIExhYmVsCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCi0JCWNyZWF0ZUNvbnRyb2xBcmVhKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbmV3QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1OZXcoKTsKLQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGVkaXRCdXR0b24pIHsKLQkJCQkJcGVyZm9ybUVkaXQoKTsKLQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlbGV0ZUJ1dHRvbikgewotCQkJCQlwZXJmb3JtRGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB0aHJlZSBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShjcmVhdGVIb3Jpem9udGFsRmlsbCgpKTsKLQkJR3JpZExheW91dCBidXR0b25HcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJLy9idXR0b25HcmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkvL2J1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25HcmlkTGF5b3V0KTsKLQotCQkvLyBhZGQgdGhlIE5ldyBidXR0b24KLQkJLy8KLQkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJLy9uZXdCdXR0b24uc2V0VGV4dCgiICIgKwotCQkvLyBYTUxDb21tb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0JVVFRPTl9ORVciKSArICIgIik7Ci0JCW5ld0J1dHRvbi5zZXRUZXh0KCIgICAiICsgWE1MVUlNZXNzYWdlcy5Db21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZ18wICsgIiAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSBFZGl0IGJ1dHRvbgotCQkvLwotCQkvL2dkID0gbmV3IEdyaWREYXRhKCk7Ci0JCS8vZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IGdkLkZJTEw7Ci0JCS8vZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fRURJVCk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgLy9WaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbCgpKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSBEZWxldGUgYnV0dG9uCi0JCS8vCi0JCS8vZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy9nZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gZ2QuRklMTDsKLQkJLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xBcmVhKCkgewotCQlpZiAodXNlR3JvdXApIHsKLQkJCSgoR3JvdXApIGNvbW1vbkNvbXBvc2l0ZSkuc2V0VGV4dCh0YWJsZUxhYmVsKTsKLQkJfSBlbHNlIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbW1vbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh0YWJsZUxhYmVsKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEoZmFsc2UsIDMpKTsKLQkJfQotCi0JCXRhYmxlVmlld2VyID0gbmV3IENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZShjb21tb25Db21wb3NpdGUsIDYsIHNob3dMb2NhdGlvblRleHQpOwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YSh0cnVlLCAyKSk7Ci0JCWNyZWF0ZUJ1dHRvbnMoY29tbW9uQ29tcG9zaXRlKTsKLQotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCXVwZGF0ZUJ1dHRvbkVuYWJsZWRTdGF0ZSgpOwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKGJvb2xlYW4gYm90aCwgaW50IHNwYW4pIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoYm90aCA/IEdyaWREYXRhLkZJTExfQk9USCA6IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcmV0dXJuIGdkOwotCX0KLQotCXByaXZhdGUgR3JpZERhdGEgY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJcmV0dXJuIGdkOwotCX0KLQotCi0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJTmFtZXNwYWNlSW5mbyByZXN1bHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCWlmIChpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0JCQkJcmVzdWx0ID0gaW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUl0ZXJhdG9yIGkgPSBlcy5pdGVyYXRvcigpOwotCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJcmVzdWx0ID0gaS5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFVzZSB0aGUgcmV0dXJuZWQgQ29tcG9zaXRlIHRvIGFkZCBjb250ZW50IGFib3ZlIHRoZSAnY29tbW9uIGNvbnRlbnRzJy4KLQkgKiBOb3RlOiBUaGUgR3JpZERhdGEgZm9yIHRoZSByZXR1cm5lZCBDb21wb3NpdGUgaGFzIGEgaGVpZ2h0SGludCA9IDAuCi0JICogVGhpcyBtZWFucyB3aGVuIHVzaW5nIHRoZSByZXR1cm5lZCBDb21wb3NpdGUsIHRoZSBHcmlkRGF0YSBtdXN0IGJlCi0JICogcmVzZXQsIGVsc2UgdGhlIENvbXBvc2l0ZSBhbmQgaXQncyBjb250ZW50cyB3aWxsIG5vdCBhcHBlYXIuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZXRUb3BDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0b3BDb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpIHsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkvKgotCQkgKiBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCSAqIHRhYmxlVmlld2VyLnJlZnJlc2goKTsgfSB9OwotCQkgKiBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0JCSAqLwotCQkvL2lmICh1cGRhdGVMaXN0ZW5lciAhPSBudWxsKQotCQkvL3sKLQkJLy8gIHVwZGF0ZUxpc3RlbmVyLnVwZGF0ZU9jY3VyZWQodGhpcywgbmFtZXNwYWNlSW5mb0xpc3QpOwotCQkvL30KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVsZXRlKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LnJlbW92ZUFsbChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoKSB7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWludm9rZURpYWxvZyhYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfTkFNRVNQQUNFX0lORk9STUFUSU9OLCAoTmFtZXNwYWNlSW5mbykgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtTmV3KCkgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyBkaWFsb2cgPSBuZXcgQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyhzaGVsbCwgWE1MVUlNZXNzYWdlcy5fVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlMsIHJlc291cmNlTG9jYXRpb24sIG5hbWVzcGFjZUluZm9MaXN0KTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LmFkZEFsbChkaWFsb2cuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKSk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QpOwotCQkJcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkgewotCQluYW1lc3BhY2VJbmZvTGlzdCA9IGxpc3Q7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKSB7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgc2VsZWN0aW9uOwotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoaW5mbyAhPSBudWxsKTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0UHJvcGVydHkoInVucmVtb3ZhYmxlIikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQlOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUluZm9FcnJvckhlbHBlcigpOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gaGVscGVyLmNvbXB1dGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QsIG51bGwpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhZTQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKgotICogVGhpcyBjbGFzcyBpcyBhbiBleHRlbnNpb24gb2YgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuIFRoaXMgY2xhc3MgYWRkcwotICogdGhlIHRhcmdldCBuYW1lc3BhY2VzIGRpYWxvZyBmaWVsZC4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cgZXh0ZW5kcyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyB7Ci0KLQljbGFzcyBUYXJnZXROYW1lc3BhY2VNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQkJdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlRmllbGQuZ2V0VGV4dCgpOwotCQkJdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyhvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQlwcm90ZWN0ZWQgVGV4dCB0YXJnZXROYW1lc3BhY2VGaWVsZDsKLQotCXB1YmxpYyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIElQYXRoIHJlc291cmNlTG9jYXRpb24xKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VMb2NhdGlvbjEsIFhNTFVJTWVzc2FnZXMuX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMpOyAvLyROT04tTkxTLTEkCi0KLQkJQ29tcG9zaXRlIHRhcmdldENvbXAgPSBnZXRUb3BDb21wb3NpdGUoKTsKLQkJdGFyZ2V0Q29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlMYWJlbCB0YXJnZXROYW1lc3BhY2VMYWJlbCA9IG5ldyBMYWJlbCh0YXJnZXRDb21wLCBTV1QuTk9ORSk7Ci0JCXRhcmdldE5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQl0YXJnZXROYW1lc3BhY2VMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1RBUkdFVF9OQU1FU1BBQ0UpOyAvLyROT04tTkxTLTEkCi0KLQkJdGFyZ2V0TmFtZXNwYWNlRmllbGQgPSBuZXcgVGV4dCh0YXJnZXRDb21wLCBTV1QuQk9SREVSKTsKLQkJdGFyZ2V0TmFtZXNwYWNlRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRhcmdldE5hbWVzcGFjZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBUYXJnZXROYW1lc3BhY2VNb2RpZnlMaXN0ZW5lcigpKTsKLQotCQkvLyBjcmVhdGVDb250cm9sQXJlYSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KCkgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGVkaXRUYXJnZXROYW1lc3BhY2UgPSBmYWxzZTsKLQkJCU5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGlvbjsKLQkJCWlmIChnZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMobnNJbmZvLnVyaSkpIHsKLQkJCQllZGl0VGFyZ2V0TmFtZXNwYWNlID0gdHJ1ZTsKLQkJCX0KLQotCQkJaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIG5zSW5mbyk7IC8vJE5PTi1OTFMtMSQKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCi0JCQlpZiAoZWRpdFRhcmdldE5hbWVzcGFjZSkgewotCQkJCXRhcmdldE5hbWVzcGFjZUZpZWxkLnNldFRleHQobnNJbmZvLnVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRoZVRhcmdldE5hbWVzcGFjZSkgewotCQl0YXJnZXROYW1lc3BhY2UgPSB0aGVUYXJnZXROYW1lc3BhY2UgIT0gbnVsbCA/IHRoZVRhcmdldE5hbWVzcGFjZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXRhcmdldE5hbWVzcGFjZUZpZWxkLnNldFRleHQodGFyZ2V0TmFtZXNwYWNlKTsKLQkJLy8gdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyh0YXJnZXROYW1lc3BhY2UpOwotCX0KLQotCXZvaWQgdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyhTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCU5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm8obmV3VGFyZ2V0TmFtZXNwYWNlKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJaW5mbyA9IGdldE5hbWVzcGFjZUluZm8ob2xkVGFyZ2V0TmFtZXNwYWNlKTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8obmV3VGFyZ2V0TmFtZXNwYWNlLCAidG5zIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbmZvLnVyaSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJCX0KLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25OYW1lc3BhY2VJbmZvVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjM3M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25OYW1lc3BhY2VJbmZvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCS8qKgotCSAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlWaWV3ZXIgdmlld2VyOwotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpbnQgY29sdW1uQ29kZSA9IGdldENvbHVtbkNvZGUoY29sdW1uSW5kZXgpOwotCQkJaWYgKGNvbHVtbkNvZGUgPT0gQ09MVU1OX0xPQ0FUSU9OX0hJTlQpIHsKLQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2JqZWN0OwotCQkJCWlmIChpbmZvLmxvY2F0aW9uSGludCA9PSBudWxsIHx8IGluZm8ubG9jYXRpb25IaW50LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gQ29tbWVudCB0aGlzIG91dCB1bnRpbCB3ZSBzb2x2ZSB0aGUgYWxpZ25tZW50LyhzcGFjZQotCQkJCQkvLyBmb3IgaW1hZ2UgYmVpbmcgYWxsb2NhdGVkCi0JCQkJCS8vIHRvIHByZWZpeCBjb2x1bW4pIC4uLi4uLgotCQkJCQkvLyAgICAgICAgICByZXN1bHQgPQotCQkJCQkvLyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1dBUk5JTkdfT0JKKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG9iamVjdDsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaW50IGNvbHVtbkNvZGUgPSBnZXRDb2x1bW5Db2RlKGNvbHVtbik7Ci0JCQlzd2l0Y2ggKGNvbHVtbkNvZGUpIHsKLQkJCQljYXNlIENPTFVNTl9QUkVGSVggOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8ucHJlZml4OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT0xVTU5fTkFNRVNQQUNFX1VSSSA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby51cmk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENPTFVNTl9DSEVDS0JPWCA6IHsKLQkJCQkJcmVzdWx0ID0gIiI7IC8vaW5mby5sb2NhdGlvbkhpbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09MVU1OX0xPQ0FUSU9OX0hJTlQgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8ubG9jYXRpb25IaW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN3aXRjaCAoY29sdW1uQ29kZSkgewotCQkJCQljYXNlIENPTFVNTl9QUkVGSVggOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19QUkVGSVg7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19OQU1FU1BBQ0VfTkFNRTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCXJldHVybiBsaXN0ICE9IG51bGwgPyBsaXN0LnRvQXJyYXkoKSA6IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFibGVJdGVtQ2hlY2tlciBleHRlbmRzIE1vdXNlQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gZ2V0VGFibGUoKS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCU9iamVjdCBvYmogPSBpdGVtLmdldERhdGEoKTsKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG9iajsKLQkJCQkJVGFibGVDb2x1bW4gY29sID0gZ2V0VGFibGUoKS5nZXRDb2x1bW4oMCk7Ci0JCQkJCWlmIChlLnggPCBjb2wuZ2V0V2lkdGgoKSkgLy8gaWYgdGhlIHBvaW50IGZhbGxzIHdpdGhpbiB0aGUKLQkJCQkJLy8gU2VsZWN0IGNvbHVtbiB0aGVuIHBlcmZvcm0KLQkJCQkJLy8gY2hlY2svdW5jaGVjawotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgY3VycmVudFN0YXRlID0gKFN0cmluZykgaW5mby5nZXRQcm9wZXJ0eSgiY2hlY2tlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnRTdGF0ZSIgKyBjdXJyZW50U3RhdGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoY3VycmVudFN0YXRlID09IG51bGwgfHwgY3VycmVudFN0YXRlLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWluZm8uc2V0UHJvcGVydHkoImNoZWNrZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgiY2hlY2tlZCIsICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DSEVDS0JPWCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0xPQ0FUSU9OX0hJTlQgPSA0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9OQU1FU1BBQ0VfVVJJID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUFJFRklYID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0NIRUNLQk9YID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9MT0NBVElPTl9ISU5UID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQVRJT05fSElOVDsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX05BTUVTUEFDRV9VUkkgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1BSRUZJWCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWDsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBMaXN0IGNoZWNrZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy9wcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgaW50W10gY29sdW1uSW5kZXhNYXA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0NoZWNrQm94ZXMgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBzaG93TG9jYXRpb25UZXh0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSLCB2aXNpYmxlUm93cywgZmFsc2UpOwotCX0KLQotCS8vcHJvdGVjdGVkIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihpbnQgY29sdW1uKQotCS8vIHsKLQkvLyAgcmV0dXJuIChjb2x1bW4gPT0gQ09MVU1OX0NIRUNLQk9YKSA/IGNoZWNrQm94Q2VsbEVkaXRvciA6Ci0JLy8gdGV4dENlbGxFZGl0b3I7Ci0JLy8gfQotCi0JcHVibGljIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MsIGJvb2xlYW4gc2hvd0xvY2F0aW9uVGV4dCkgewotCQl0aGlzKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiwgdmlzaWJsZVJvd3MsIHNob3dMb2NhdGlvblRleHQpOwotCX0KLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBzdHlsZSwgdmlzaWJsZVJvd3MsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IHZpc2libGVSb3dzLCBib29sZWFuIHNob3dMb2NhdGlvblRleHQpIHsKLQkJc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgc3R5bGUpKTsKLQkJZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRoaXMuc2hvd0NoZWNrQm94ZXMgPSAoc3R5bGUgJiBTV1QuQ0hFQ0spICE9IDA7Ci0JCWNvbHVtbkluZGV4TWFwID0gY3JlYXRlQ29sdW1uSW5kZXhNYXAoKTsKLQkJdGhpcy5zaG93TG9jYXRpb25UZXh0ID0gc2hvd0xvY2F0aW9uVGV4dDsKLQotCQlQcm92aWRlciBwcm92aWRlciA9IG5ldyBQcm92aWRlcigpOwotCQlzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkgPSBjcmVhdGVDb2x1bW5Qcm9wZXJ0aWVzQXJyYXkoKTsKLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkpOwotCi0JCXRhYmxlID0gZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQlpZiAoKGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSkuZXF1YWxzKExBQkVMX0xPQ0FUSU9OX0hJTlQpKSB7Ci0JCQkJaWYgKHNob3dMb2NhdGlvblRleHQpIHsKLQkJCQkJY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc0FycmF5W2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDb21tZW50IHRoaXMgb3V0IHVudGlsIHdlIHNvbHZlIHRoZSBhbGlnbm1lbnQvKHNwYWNlCi0JCQkJCS8vIGZvciBpbWFnZSBiZWluZyBhbGxvY2F0ZWQKLQkJCQkJLy8gdG8gcHJlZml4IGNvbHVtbikgLi4uLi4uCi0JCQkJCS8vICAgICAgICAgIAljb2x1bW4uc2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSk7Ci0JCQl9Ci0JCQljb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKGdldENvbHVtbldpZHRoKGkpLCB0cnVlKSk7Ci0JCX0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzOwotCQkvL2ZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZVJvd3M7IGkrKykKLQkJLy8gewotCQkvLyAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCS8vICBpdGVtLnNldFRleHQoIiMjIyMjIyMiKTsKLQkJLy99Ci0JCS8vY2hlY2tCb3hDZWxsRWRpdG9yID0gbmV3IE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IodGFibGUpOwotCQkvL3RleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQotCQkvKgotCQkgKiBDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcKLQkJICogQ2VsbEVkaXRvcltjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoXTsgZm9yIChpbnQgaSA9IDA7IGkgPAotCQkgKiBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoOyBpKyspIHsgY2VsbEVkaXRvcnNbaV0gPQotCQkgKiBnZXRDZWxsRWRpdG9yKGkpOyB9IHNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJICovCi0JCS8vaWYgKHNob3dDaGVja0JveGVzKQotCQkvL3sKLQkJLy8gIGdldFRhYmxlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgVGFibGVJdGVtQ2hlY2tlcigpKTsKLQkJLy99Ci0JfQotCi0JLy9wcm90ZWN0ZWQgQ2VsbEVkaXRvciBjaGVja0JveENlbGxFZGl0b3I7Ci0JLy9wcm90ZWN0ZWQgQ2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBpbnRbXSBjcmVhdGVDb2x1bW5JbmRleE1hcCgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtzaG93Q2hlY2tCb3hlcyA/IDQgOiAzXTsKLQkJaW50IGkgPSAwOwotCQlpZiAoc2hvd0NoZWNrQm94ZXMpIHsKLQkJCXJlc3VsdFtpKytdID0gQ09MVU1OX0NIRUNLQk9YOwotCQl9Ci0JCXJlc3VsdFtpKytdID0gQ09MVU1OX1BSRUZJWDsKLQkJcmVzdWx0W2krK10gPSBDT0xVTU5fTkFNRVNQQUNFX1VSSTsKLQkJaWYgKCFzaG93Q2hlY2tCb3hlcykgewotCQkJcmVzdWx0W2krK10gPSBDT0xVTU5fTE9DQVRJT05fSElOVDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVDb2x1bW5Qcm9wZXJ0aWVzQXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbM107Ci0JCWludCBpID0gMDsKLQkJaWYgKHNob3dDaGVja0JveGVzKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IExBQkVMX0NIRUNLQk9YOwotCQl9Ci0JCXJlc3VsdFtpKytdID0gTEFCRUxfUFJFRklYOwotCQlyZXN1bHRbaSsrXSA9IExBQkVMX05BTUVTUEFDRV9VUkk7Ci0JCWlmICghc2hvd0NoZWNrQm94ZXMpIHsKLQkJCXJlc3VsdFtpKytdID0gTEFCRUxfTE9DQVRJT05fSElOVDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uQ29kZShpbnQgY29sdW1uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoY29sdW1uIDwgY29sdW1uSW5kZXhNYXAubGVuZ3RoKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW5JbmRleE1hcFtjb2x1bW5dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5XaWR0aChpbnQgY29sdW1uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlzd2l0Y2ggKGdldENvbHVtbkNvZGUoY29sdW1uKSkgewotCQkJY2FzZSBDT0xVTU5fUFJFRklYIDogewotCQkJCXJlc3VsdCA9IDU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9OQU1FU1BBQ0VfVVJJIDogewotCQkJCS8vIFNpemUgY29sdW1ucyBkaWZmZXJlbnRseSB3aGVuIGxvY2F0aW9uIGhpbnQgdGV4dCBsYWJlbCBpcwotCQkJCS8vIGRpc3BsYXllZAotCQkJCWlmIChzaG93TG9jYXRpb25UZXh0KSB7Ci0JCQkJCXJlc3VsdCA9IDEwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IDIwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX0NIRUNLQk9YIDogewotCQkJCXJlc3VsdCA9IDE7IC8vaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9MT0NBVElPTl9ISU5UIDogewotCQkJCS8vIFNpemUgY29sdW1ucyBkaWZmZXJlbnRseSB3aGVuIGxvY2F0aW9uIGhpbnQgdGV4dCBsYWJlbCBpcwotCQkJCS8vIGRpc3BsYXllZAotCQkJCWlmIChzaG93TG9jYXRpb25UZXh0KSB7Ci0JCQkJCXJlc3VsdCA9IDEwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IDI7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qCi0JICogcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyIHsKLQkgKiBwdWJsaWMgTmFtZXNwYWNlSW5mb0NlbGxNb2RpZmllcigpIHsgfQotCSAqIAotCSAqIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7IGlmCi0JICogKHByb3BlcnR5LmVxdWFscyhMQUJFTF9DSEVDS0JPWCkpIHsgcmV0dXJuIHRydWU7IH0gZWxzZSBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfUFJFRklYKSkgeyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7IH0KLQkgKiAKLQkgKiBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsgaW50IGNvbHVtbiA9Ci0JICogMDsgaWYgKHByb3BlcnR5LmVxdWFscyhMQUJFTF9DSEVDS0JPWCkpIHsgY29sdW1uID0gMDsgfSBlbHNlIGlmCi0JICogKHByb3BlcnR5LmVxdWFscyhMQUJFTF9QUkVGSVgpKSB7IGNvbHVtbiA9IDE7IH0gZWxzZSBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfTkFNRVNQQUNFX1VSSSkpIHsgY29sdW1uID0gMjsgfQotCSAqIAotCSAqIC8vaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIC8veyAvLyByZXR1cm4KLQkgKiBwcm92aWRlci5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIGNvbHVtbik7IC8vfSAvL2Vsc2UgLy97IC8vIHJldHVybiBudWxsOyAvLyB9Ci0JICogcmV0dXJuICJoZWxsbyI7IH0KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7IH0gfQotCSAqIAotCSAqIHByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yIGV4dGVuZHMKLQkgKiBDaGVja2JveENlbGxFZGl0b3IgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyIHsgcHVibGljCi0JICogTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7IHN1cGVyKHBhcmVudCk7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgeyB9Ci0JICogCi0JICogcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7IHN1cGVyLmFjdGl2YXRlKCk7IGRlYWN0aXZhdGUoKTsKLQkgKiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb2N1c0NvbnRyb2woKS5yZWRyYXcoKTsgfQotCSAqIAotCSAqIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsgaWYgKGdldFRhYmxlKCkuZ2V0SXRlbShuZXcKLQkgKiBQb2ludChlLngsIGUueSkpICE9IG51bGwpIHsgfSB9IHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudAotCSAqIGUpIHsgfSBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgeyB9IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbmNvZGluZ1NldHRpbmdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGU0ZjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbmNvZGluZ1NldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEVuY29kaW5nU2V0dGluZ3MgaXMgYSBjb21wb3NpdGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBzZXQgb2YKLSAqIGVuY29kaW5nIHZhbHVlcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuIFRoZSBsaXN0IG9mIGVuY29kaW5nIHZhbHVlcwotICogaXMgYmFzZWQgb2ZmIHRoZSBTdXBwb3J0ZWRKYXZhRW5jb2RpbmcgY2xhc3MuIEFzIHRoZSB1c2VyIHNlbGVjdHMgYW4KLSAqIGVuY29kaW5nIGZyb20gdGhlIGNvbWJvIGJveCwgdGhlIHJlYWRvbmx5IGZpZWxkIGJlbG93IGl0IGNoYW5nZXMgdG8gc2hvdwotICogdGhlIElBTkEgdGFnIGZvciB0aGF0IHBhcnRpY3VsYXIgZW5jb2RpbmcgZGVzY3JpcHRpb24uIFRoZSBsYWJlbHMgZm9yIHRoZQotICogd2lkZ2V0cyBhcmUgY29uZmlndXJhYmxlIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyIGNhbgotICogYmUgc2V0IHVzaW5nIHRoZSBzZXRJQU5BVGFnKCkuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW50cnkncyBJQU5BIHRhZyBjYW4KLSAqIGJlIHJldHJpZXZlZCB3aXRoIGdldElBTkFUYWcoKS4gRW50cmllcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgY2FuIGJlIGFkZGVkCi0gKiBhbmQgcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nU2V0dGluZ3MgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWludCBpID0gZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaWYgKGkgPj0gMCAmJiBpIDwgaWFuYVZlY3Rvci5zaXplKCkpCi0JCQkJaWFuYVRleHQuc2V0VGV4dCgoU3RyaW5nKSAoaWFuYVZlY3Rvci5lbGVtZW50QXQoZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVOQ09ESU5HX0xBQkVMID0gWE1MVUlNZXNzYWdlcy5FbmNvZGluZ1NldHRpbmdzXzE7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJQU5BX0xBQkVMID0gWE1MVUlNZXNzYWdlcy5FbmNvZGluZ1NldHRpbmdzXzA7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciA9IG5ldyBDb21ib0xpc3RlbmVyKCk7Ci0JcHJvdGVjdGVkIENvbWJvIGVuY29kaW5nQ29tYm87Ci0JcHJvdGVjdGVkIExhYmVsIGVuY29kaW5nTGFiZWwsIGlhbmFMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBpYW5hVGV4dDsKLQlwcm90ZWN0ZWQgVmVjdG9yIGlhbmFWZWN0b3I7Ci0KLQkvKioKLQkgKiBNZXRob2QgRW5jb2RpbmdTZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIEVuY29kaW5nU2V0dGluZ3MoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJaW5pdChJQU5BX0xBQkVMLCBFTkNPRElOR19MQUJFTCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIEVuY29kaW5nU2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlbmNvZGluZ0xhYmVsIC0KLQkgKiAgICAgICAgICAgIHRleHQgbGFiZWwgdG8gdXNlIGJlc2lkZSB0aGUgbG9jYWxlIHNlbnNpdGl2ZSBkZXNjcmlwdGlvbiBvZgotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbmNvZGluZwotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBlbmNvZGluZ0xhYmVsKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlpbml0KElBTkFfTEFCRUwsIGVuY29kaW5nTGFiZWwpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBFbmNvZGluZ1NldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaWFuYUxhYmVsID0KLQkgKiAgICAgICAgICAgIHRleHQgbGFiZWwgdG8gdXNlIGJlc2lkZSB0aGUgZGlzcGxheSBvbmx5IElBTkEgZmllbGQKLQkgKiBAcGFyYW0gZW5jb2RpbmdMYWJlbCAtCi0JICogICAgICAgICAgICB0ZXh0IGxhYmVsIHRvIHVzZSBiZXNpZGUgdGhlIGxvY2FsZSBzZW5zaXRpdmUgZGVzY3JpcHRpb24gb2YKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW5jb2RpbmcKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdTZXR0aW5ncyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWFuYUxhYmVsLCBTdHJpbmcgZW5jb2RpbmdMYWJlbCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJaW5pdChpYW5hTGFiZWwsIGVuY29kaW5nTGFiZWwpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBhZGRFbnRyeS4gQWRkIGFuIGVudHJ5IHRvIHRoZSBlbmQgb2YgdGhlIEVuY29kaW5nIENvbWJvYm94Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIC0KLQkgKiAgICAgICAgICAgIGVuY29kaW5nIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkKLQkgKiBAcGFyYW0gaWFuYVRhZyAtCi0JICogICAgICAgICAgICBJQU5BIHRhZyBmb3IgdGhlIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgaWFuYVRhZykgewotCQllbmNvZGluZ0NvbWJvLmFkZChkZXNjcmlwdGlvbik7Ci0JCWlhbmFWZWN0b3IuYWRkKGlhbmFUYWcpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBhZGRFbnRyeS4gQWRkIGFuIGVudHJ5IHRvIHRoZSBFbmNvZGluZyBDb21ib2JveCBhdCBpbmRleCBpbmRleAotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtCi0JICogICAgICAgICAgICBlbmNvZGluZyBkZXNjcmlwdGlvbiB0byBkaXNwbGF5Ci0JICogQHBhcmFtIGlhbmFUYWcgLQotCSAqICAgICAgICAgICAgSUFOQSB0YWcgZm9yIHRoZSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBpbmRleCAtCi0JICogICAgICAgICAgICBpbmRleCBpbnRvIHRoZSBjb21ibyB0byBhZGQgdG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBpYW5hVGFnLCBpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID09IGlhbmFWZWN0b3Iuc2l6ZSgpKSB7Ci0JCQkvLyBqdXN0IGFkZCB0byB0aGUgZW5kCi0JCQlhZGRFbnRyeShkZXNjcmlwdGlvbiwgaWFuYVRhZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IGlhbmFWZWN0b3Iuc2l6ZSgpKSB7Ci0JCQllbmNvZGluZ0NvbWJvLmFkZChkZXNjcmlwdGlvbiwgaW5kZXgpOwotCQkJaWFuYVZlY3Rvci5hZGQoaW5kZXgsIGlhbmFUYWcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlpbnQgc3R5bGUgPSBpc1JlYWRPbmx5ID09IHRydWUgPyBTV1QuUkVBRF9PTkxZIDogU1dULkRST1BfRE9XTjsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZW5jb2RpbmdDb21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQ29tYm8oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBpYW5hVGFncyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJCWludCB0b3RhbE51bSA9IGlhbmFUYWdzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxOdW07IGkrKykgewotCQkJCVN0cmluZyBpYW5hID0gaWFuYVRhZ3NbaV07Ci0JCQkJU3RyaW5nIGVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXREaXNwbGF5U3RyaW5nKGlhbmEpOwotCi0JCQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQkJCWVuY29kaW5nQ29tYm8uYWRkKGVuYyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkNvbW1vbkNoYXJzZXROYW1lcy5nZXREaXNwbGF5U3RyaW5nKCIgKyBpYW5hICsgIikgcmV0dXJuZWQgbnVsbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZW5jb2RpbmdDb21iby5hZGQoaWFuYSk7Ci0JCQkJfQotCQkJCWlhbmFWZWN0b3IuYWRkKGlhbmEpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9lLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy9NZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiUmVzb3VyY2UgZXhjZXB0aW9uIiwKLQkJCS8vICJVbmFibGUgdG8gb2J0YWluIGVuY29kaW5nIHN0cmluZ3MuIENoZWNrIHJlc291cmNlIGZpbGUiKTsKLQkJCS8vWE1MRW5jb2RpbmdQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoZS50b1N0cmluZygpKTsKLQkJCS8vWE1MRW5jb2RpbmdQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRFbmNvZGluZzwvY29kZT4gR2V0IHRoZSBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lIHRoYXQgd2FzCi0JICogc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gZW5jb2RpbmdDb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldEVuY29kaW5nQ29tYm8uIFJldHVybnMgdGhlIGNvbWJvIHVzZWQgdG8gZGlzcGxheSB0aGUgZW5jb2RpbmcKLQkgKiBkZXNjcmlwdGlvbnMuCi0JICogCi0JICogQHJldHVybiBDb21ibwotCSAqLwotCXB1YmxpYyBDb21ibyBnZXRFbmNvZGluZ0NvbWJvKCkgewotCQlyZXR1cm4gZW5jb2RpbmdDb21ibzsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRJQU5BVGFnPC9jb2RlPiBHZXQgdGhlIElBTkEgdGFnIGVxdWl2YWxlbnQgb2YgdGhlIHNlbGVjdGVkCi0JICogZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJQU5BVGFnKCkgewotCQlpbnQgaSA9IGVuY29kaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmV0dXJuIChTdHJpbmcpIChpYW5hVmVjdG9yLmVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChTdHJpbmcgaWFuYUxhYmVsU3RyLCBTdHJpbmcgZW5jb2RpbmdMYWJlbFN0cikgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZW5jb2RpbmdMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsIGVuY29kaW5nTGFiZWxTdHIpOwotCQllbmNvZGluZ0NvbWJvID0gY3JlYXRlQ29tYm9Cb3godGhpcywgdHJ1ZSk7Ci0JCWlhbmFMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsIGlhbmFMYWJlbFN0cik7Ci0JCWlhbmFUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKHRoaXMsIDIwKTsKLQkJaWFuYVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCQlmaWxsQ29tYm8oKTsKLQkJcmVzZXRUb0RlZmF1bHRFbmNvZGluZygpOwotCQllbmNvZGluZ0NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmlzRW5jb2RpbmdJbkxpc3Q8L2NvZGU+IENoZWNrcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBuYW1lIGlzIGluCi0JICogdGhlIGNvbWJvCi0JICogCi0JICogQHBhcmFtIGVuYwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgZW5jb2RpbmcgbmFtZS4KLQkgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuIFRSVUUgaWYgZW5jb2RpbmcgaXMgaW4gbGlzdC4KLQkgKiAgICAgICAgIEZBTFNFIGlmIGVuY29kaW5nIGlzIG5vdCBpbiBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5jb2RpbmdJbkxpc3QoU3RyaW5nIGVuYykgewotCQlpbnQgaSA9IGVuY29kaW5nQ29tYm8uaW5kZXhPZihlbmMpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+aXNJQU5BVGFnSW5MaXN0PC9jb2RlPiBDaGVja3Mgd2hldGhlciB0aGUgSUFOQSB0YWcgaXMgaW4gdGhlCi0JICogY29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gaWFuYVRhZwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgSUFOQSB0YWcuCi0JICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLiBUUlVFIGlmIHRhZyBpcyBpbiBsaXN0LiBGQUxTRQotCSAqICAgICAgICAgaWYgdGFnIGlzIG5vdCBpbiBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSUFOQVRhZ0luTGlzdChTdHJpbmcgaWFuYVRhZykgewotCQlpbnQgaSA9IGlhbmFWZWN0b3IuaW5kZXhPZihpYW5hVGFnKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCByZW1vdmVFbnRyeS4gUmVtb3ZlcyBib3RoIHRoZSBkZXNjcmlwdGlvbiBhbmQgdGhlIElBTkEgdGFnIGF0Ci0JICogdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KGludCBpbmRleCkgewotCQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IGlhbmFWZWN0b3Iuc2l6ZSgpKSB7Ci0JCQllbmNvZGluZ0NvbWJvLnJlbW92ZShpbmRleCk7Ci0JCQlpYW5hVmVjdG9yLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgcmVzZXRUb0RlZmF1bHRFbmNvZGluZy4gUmVzZXQgdGhlIGNvbnRyb2wgdG8gdGhlIGRlZmF1bHQKLQkgKiBlbmNvZGluZy4gQ3VycmVudGx5IFVURi04Ci0JICovCi0JcHVibGljIHZvaWQgcmVzZXRUb0RlZmF1bHRFbmNvZGluZygpIHsKLQkJU3RyaW5nIGRlZmF1bHRJQU5BVGFnID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlpYW5hVGV4dC5zZXRUZXh0KGRlZmF1bHRJQU5BVGFnKTsKLQkJc2V0SUFOQVRhZyhkZWZhdWx0SUFOQVRhZyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNldEVuYWJsZWQuIEVuYWJsZS9kaXNhYmxlIHRoZSBFbmNvZGluZ1NldHRpbmdzIGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWVuY29kaW5nQ29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZW5jb2RpbmdMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlpYW5hTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWFuYVRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5zZXRFbmNvZGluZzwvY29kZT4gU2V0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbWJvIHRvIHRoZQotCSAqIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGVuYwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBOb3RlIHRoaXMgaXMgbm90IHRoZSBJQU5BCi0JICogICAgICAgICAgICB0YWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuYykgewotCQllbmNvZGluZ0NvbWJvLnNldFRleHQoZW5jKTsKLQkJZW5jb2RpbmdDb21iby5zZWxlY3QoZW5jb2RpbmdDb21iby5pbmRleE9mKGVuYykpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPnNldElBTkFUYWc8L2NvZGU+IFNldCB0aGUgSUFOQSB0YWcgZm9yIHRoZSBjb21ibwotCSAqIAotCSAqIEBwYXJhbSBpYW5hVGFnCi0JICogICAgICAgICAgICBhIDxjb2RlPnN0cmluZzwvY29kZT4gdmFsdWUuIFRoZSBJQU5BIHRhZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJQU5BVGFnKFN0cmluZyBpYW5hVGFnKSB7Ci0JCWludCBpID0gaWFuYVZlY3Rvci5pbmRleE9mKGlhbmFUYWcpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQllbmNvZGluZ0NvbWJvLnNlbGVjdChpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5NmIxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGlzIGFuIGV4dGVuc2lvbiBvZiBFbmNvZGluZ1NldHRpbmdzLiBUaGlzCi0gKiBjb21wb3NpdGUgY29udGFpbnMgRW5jb2RpbmdTZXR0aW5ncyBmb3IgdXNlcnMgdG8gc2VsZWN0IHRoZSBlbmNvZGluZyB0aGV5Ci0gKiBkZXNpcmUgYXMgd2VsbCBhcyBhIGNoZWNrYm94IGZvciB1c2VycyB0byBzZWxlY3QgdG8gdXNlIHRoZSBkZWZhdWx0Ci0gKiB3b3JrYmVuY2ggZW5jb2RpbmcgaW5zdGVhZC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVuY29kaW5nU2V0dGluZ3MKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTkRFTlQgPSAxNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0JFTkNIX0RFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRW5jb2RpbmdTZXR0aW5ncyBmRW5jb2RpbmdTZXR0aW5nczsKLQlwcml2YXRlIFN0cmluZyBmTm9uRGVmYXVsdElBTkEgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGZVc2VEZWZhdWx0QnV0dG9uOwotCi0JcHVibGljIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xzKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZVc2VEZWZhdWx0QnV0dG9uID0gbmV3IEJ1dHRvbihkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZVc2VEZWZhdWx0QnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nc18wKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZVc2VEZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQotCQlmRW5jb2RpbmdTZXR0aW5ncyA9IG5ldyBFbmNvZGluZ1NldHRpbmdzKHRoaXMpOwotCQkoKEdyaWRMYXlvdXQpIGZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dCgpKS5tYXJnaW5XaWR0aCA9IDA7Ci0JCSgoR3JpZERhdGEpIGZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IElOREVOVDsKLQotCX0KLQotCXByaXZhdGUgQ29tYm8gZ2V0RW5jb2RpbmdDb21ibygpIHsKLQkJcmV0dXJuIGZFbmNvZGluZ1NldHRpbmdzLmdldEVuY29kaW5nQ29tYm8oKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRJQU5BVGFnPC9jb2RlPiBHZXQgdGhlIElBTkEgdGFnIGVxdWl2YWxlbnQgb2YgdGhlIHNlbGVjdGVkCi0JICogZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZS4gUmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgdXNpbmcgd29ya2JlbmNoCi0JICogZW5jb2RpbmcuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElBTkFUYWcoKSB7Ci0JCWlmICghaXNEZWZhdWx0KCkpCi0JCQlyZXR1cm4gZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpOwotCQlyZXR1cm4gV09SS0JFTkNIX0RFRkFVTFQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0V29ya2JlbmNoRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKLQl9Ci0KLQl2b2lkIGhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpIHsKLQkJaWYgKGZVc2VEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlmTm9uRGVmYXVsdElBTkEgPSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRJQU5BVGFnKCk7Ci0JCQlTdHJpbmcgd29ya2JlbmNoVmFsdWUgPSBnZXRXb3JrYmVuY2hFbmNvZGluZygpOwotCQkJd29ya2JlbmNoVmFsdWUgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKHdvcmtiZW5jaFZhbHVlKTsKLQkJCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcod29ya2JlbmNoVmFsdWUpOwotCQl9IGVsc2UgaWYgKGZOb25EZWZhdWx0SUFOQSAhPSBudWxsKSB7Ci0JCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGZOb25EZWZhdWx0SUFOQSk7Ci0JCX0KLQkJZ2V0RW5jb2RpbmdDb21ibygpLnNldEVuYWJsZWQoIWZVc2VEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0RW5hYmxlZCghZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5zZXRFbmNvZGluZzwvY29kZT4gU2V0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbWJvIHRvIHRoZQotCSAqIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUuIFNlbGVjdHMgdXNlIHdvcmtiZW5jaCBlbmNvZGluZyBpZiBpYW5hVGFnIGlzCi0JICogbnVsbCBvciBlbXB0eSBzdHJpbmcuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUFOQVRhZyhTdHJpbmcgaWFuYVRhZykgewotCQlpZiAoaWFuYVRhZyA9PSBudWxsIHx8IGlhbmFUYWcuZXF1YWxzKFdPUktCRU5DSF9ERUZBVUxUKSkgewotCQkJZlVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJaGFuZGxlVXNlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmVXNlRGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJaGFuZGxlVXNlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQlpZiAoIWlzRGVmYXVsdCgpKQotCQkJCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoaWFuYVRhZyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDkzNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb2xvclBhZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbG9yUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TYW1wbGVfWE1MX2RvYzsgLy8kTk9OLU5MUy0xJCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuPD9jdXN0b21Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25cblx0WE1MIHByb2Nlc3NvciBzcGVjaWZpY1xuXHRjb250ZW50ID8+XG48IURPQ1RZUEUgY29sb3JzXG5cdFBVQkxJQyBcIi8vSUJNL1hNTC9DT0xPUlMvXCIgXCJjb2xvcnMuZHRkXCI+XG48Y29sb3JzPlxuXHQ8IS0tIGJlZ2luIGNvbG9yIGRlZmluaXRpb25zIC0tPlxuXHQ8Y29sb3IgbmFtZT1cInBsYWludGV4dFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiLz5cblx0PGNvbG9yIG5hbWU9XCJib2xkXCIgZm9yZWdyb3VuZD1cIiMwMDAwMDBcIlxuXHRcdGJhY2tncm91bmQ9XCIjQjNBQ0EwXCI+XG5cdDwhW0NEQVRBWzwxMjM0NTY3ODk+XV0+XG5cdE5vcm1hbCB0ZXh0IGNvbnRlbnQuXG5cdDxjb2xvciBuYW1lPVwiaW52ZXJzZVwiIGZvcmVncm91bmQ9XCIjRjBGMEYwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiLz5cblxuPC9jb2xvcnM+XG4iOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb21tb25Db250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbW1vbkRlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbnMgZm9yIGhpbGlnaHRpbmcgdHlwZXMKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9EZWxpbWl0ZXJzX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQ29tbWVudCBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9Db250ZW50X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQ29tbWVudCBDb250ZW50IgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLlRhZ19EZWxpbWl0ZXJzX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiVGFnIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCBYTUxVSU1lc3NhZ2VzLlRhZ19OYW1lc19VSV8pOyAvLyROT04tTkxTLTEkID0gIlRhZyBOYW1lcyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9OYW1lc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkF0dHJpYnV0ZSBOYW1lcyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfVmFsdWVzX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQXR0cmlidXRlIFZhbHVlcyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuRGVjbGFyYXRpb25fRGVsaW1pdGVyc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkRlY2xhcmF0aW9uIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJDb250ZW50IgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb21tb25TdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQotCQkvL2xpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQkvL2xpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJLy9saXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJLy9saXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0KLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJaW5pdENvbW1vbkNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlpbml0RG9jVHlwZUNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5ULCBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0RlbGltaXRlcnNfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJDREFUQSBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0NvbnRlbnRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJDREFUQSBDb250ZW50IgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIFhNTFVJTWVzc2FnZXMuUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9EZWxfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9jZXNzaW5nIEluc3RydWN0aW9uIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIFhNTFVJTWVzc2FnZXMuUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBDb250ZW50IgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREb2NUeXBlQ29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQywgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzIGZvciBET0NUWVBFIHJlbGF0ZWQgaXRlbXMKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfTmFtZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIkRPQ1RZUEUgTmFtZSIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1NZU1RFTV9QVUJMSUNfS2V5d19VSV8pOyAvLyROT04tTkxTLTEkID0gIkRPQ1RZUEUgU1lTVEVNL1BVQkxJQyBLZXl3b3JkIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJET0NUWVBFIFB1YmxpYyBSZWZlcmVuY2UiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfU3lzdGVtX1JlZmVyZW5jZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIkRPQ1RZUEUgU3lzdGVtIFJlZmVyZW5jZSIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RG9jVHlwZVN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCi0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCQlpbml0Q29tbW9uU3R5bGVMaXN0KGxpc3QpOwotCQlpbml0RG9jVHlwZVN0eWxlTGlzdChsaXN0KTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5UKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCS8vIHJlcXVpcmVkIHNpbmNlIHRoZSBzdXBlcmNsYXNzICpyZW1vdmVzKiBleGlzdGluZyBwcmVmZXJlbmNlcyBiZWZvcmUKLQkJLy8gc2F2aW5nIGl0cyBvd24KLQkJc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKS5nZXRQYXJzZXIoKSk7Ci0KLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NzE2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIEVuY29kaW5nU2V0dGluZ3MgZkVuY29kaW5nU2V0dGluZ3MgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbWJvIGZFbmRPZkxpbmVDb2RlID0gbnVsbDsKLQlwcml2YXRlIFZlY3RvciBmRU9MQ29kZXMgPSBudWxsOwotCXByaXZhdGUgVGV4dCBmRGVmYXVsdFN1ZmZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGZXYXJuTm9HcmFtbWFyID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvclZhbGlkYXRpbmdHcm91cChjb21wb3NpdGUpOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBjcmVhdGluZ0dyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJY3JlYXRpbmdHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXMpOwotCi0JCS8vIERlZmF1bHQgZXh0ZW5zaW9uIGZvciBOZXcgZmlsZSBXaXphcmQKLQkJY3JlYXRlTGFiZWwoY3JlYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsKTsKLQkJZkRlZmF1bHRTdWZmaXggPSBjcmVhdGVUZXh0RmllbGQoY3JlYXRpbmdHcm91cCk7Ci0JCWZEZWZhdWx0U3VmZml4LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCUxhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwoY3JlYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5FbmNvZGluZ19kZXNjKTsKLQkJKChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZFbmNvZGluZ1NldHRpbmdzID0gbmV3IEVuY29kaW5nU2V0dGluZ3MoY3JlYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5FbmNvZGluZyk7Ci0JCSgoR3JpZERhdGEpIGZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgY3JlYXRpbmdPclNhdmluZ0dyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJY3JlYXRpbmdPclNhdmluZ0dyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5DcmVhdGluZ19vcl9zYXZpbmdfZmlsZXMpOwotCi0JCUxhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwoY3JlYXRpbmdPclNhdmluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkVuZF9vZl9saW5lX2NvZGVfZGVzYyk7Ci0JCSgoR3JpZERhdGEpIGxhYmVsLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkoKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCkpLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0JCWNyZWF0ZUxhYmVsKGNyZWF0aW5nT3JTYXZpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5FbmRfb2ZfbGluZV9jb2RlKTsKLQkJZkVuZE9mTGluZUNvZGUgPSBjcmVhdGVEcm9wRG93bkJveChjcmVhdGluZ09yU2F2aW5nR3JvdXApOwotCQlwb3B1bGF0ZUxpbmVEZWxpbWl0ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCB2YWxpZGF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQl2YWxpZGF0aW5nR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlZhbGlkYXRpbmdfZmlsZXMpOwotCi0JCWlmIChmV2Fybk5vR3JhbW1hciA9PSBudWxsKSB7Ci0JCQlmV2Fybk5vR3JhbW1hciA9IGNyZWF0ZUNoZWNrQm94KHZhbGlkYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5XYXJuX25vX2dyYW1tYXJfc3BlY2lmaWVkKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZEZWZhdWx0U3VmZml4LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpbmUgZGVsaW1pdGVyIHByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGluZSBkZWxpbWl0ZXIgY29uc3RhbnQgZnJvbSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnRFT0xDb2RlKCkgewotCQlpbnQgaSA9IGZFbmRPZkxpbmVDb2RlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpID49IDApIHsKLQkJCXJldHVybiAoU3RyaW5nKSAoZkVPTENvZGVzLmVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2UjZ2V0TW9kZWxQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JDcmVhdGluZ0dyb3VwKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCVN0cmluZyBlbmNvZGluZyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBlbmRPZkxpbmVDb2RlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFKTsKLQotCQlpZiAoZW5kT2ZMaW5lQ29kZS5sZW5ndGgoKSA+IDApCi0JCQlzZXRDdXJyZW50RU9MQ29kZShlbmRPZkxpbmVDb2RlKTsKLQkJZWxzZQotCQkJc2V0Q3VycmVudEVPTENvZGUoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTk9fVFJBTlNMQVRJT04pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKSB7Ci0JCWJvb2xlYW4gd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XQVJOX05PX0dSQU1NQVIpOwotCi0KLQkJaWYgKGZXYXJuTm9HcmFtbWFyICE9IG51bGwpIHsKLQkJCWZXYXJuTm9HcmFtbWFyLnNldFNlbGVjdGlvbih3YXJuTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ3JlYXRpbmdHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ0dyb3VwKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCWZEZWZhdWx0U3VmZml4LnNldFRleHQoc3VmZml4KTsKLQotCQlTdHJpbmcgZW5jb2RpbmcgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhlbmNvZGluZyk7Ci0JCS8vIGZFbmNvZGluZ1NldHRpbmdzLnJlc2V0VG9EZWZhdWx0RW5jb2RpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBlbmRPZkxpbmVDb2RlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSk7Ci0KLQkJaWYgKGVuZE9mTGluZUNvZGUubGVuZ3RoKCkgPiAwKQotCQkJc2V0Q3VycmVudEVPTENvZGUoZW5kT2ZMaW5lQ29kZSk7Ci0JCWVsc2UKLQkJCXNldEN1cnJlbnRFT0xDb2RlKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk5PX1RSQU5TTEFUSU9OKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JWYWxpZGF0aW5nR3JvdXAoKSB7Ci0JCWJvb2xlYW4gd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSKTsKLQotCQlpZiAoZldhcm5Ob0dyYW1tYXIgIT0gbnVsbCkgewotCQkJZldhcm5Ob0dyYW1tYXIuc2V0U2VsZWN0aW9uKHdhcm5Ob0dyYW1tYXJCdXR0b25TZWxlY3RlZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIHZlY3RvciBjb250YWluaW5nIHRoZSBsaW5lIGRlbGltaXRlciB0byBkaXNwbGF5IHN0cmluZwotCSAqIG1hcHBpbmcgYW5kIHRoZSBjb21ib2JveCBkaXNwbGF5aW5nIGxpbmUgZGVsaW1pdGVycwotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpbmVEZWxpbWl0ZXJzKCkgewotCQlmRU9MQ29kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZFbmRPZkxpbmVDb2RlLmFkZChYTUxVSU1lc3NhZ2VzLkVPTF9Vbml4KTsKLQkJZkVPTENvZGVzLmFkZChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRik7Ci0KLQkJZkVuZE9mTGluZUNvZGUuYWRkKFhNTFVJTWVzc2FnZXMuRU9MX01hYyk7Ci0JCWZFT0xDb2Rlcy5hZGQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpOwotCi0JCWZFbmRPZkxpbmVDb2RlLmFkZChYTUxVSU1lc3NhZ2VzLkVPTF9XaW5kb3dzKTsKLQkJZkVPTENvZGVzLmFkZChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQotCQlmRW5kT2ZMaW5lQ29kZS5hZGQoWE1MVUlNZXNzYWdlcy5FT0xfTm9UcmFuc2xhdGlvbik7Ci0JCWZFT0xDb2Rlcy5hZGQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTk9fVFJBTlNMQVRJT04pOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgaW4gdGhlIGVvbCBjb21ib2JveAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50RU9MQ29kZShTdHJpbmcgZW9sQ29kZSkgewotCQkvLyBDbGVhciB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JCWZFbmRPZkxpbmVDb2RlLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCWZFbmRPZkxpbmVDb2RlLmRlc2VsZWN0QWxsKCk7Ci0KLQkJaW50IGkgPSBmRU9MQ29kZXMuaW5kZXhPZihlb2xDb2RlKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJZkVuZE9mTGluZUNvZGUuc2VsZWN0KGkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGZEZWZhdWx0U3VmZml4LmdldFRleHQoKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sIHN1ZmZpeCk7Ci0KLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBmRW5jb2RpbmdTZXR0aW5ncy5nZXRJQU5BVGFnKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKCkgewotCQlTdHJpbmcgZW9sQ29kZSA9IGdldEN1cnJlbnRFT0xDb2RlKCk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCBlb2xDb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLQkJaWYgKGZXYXJuTm9HcmFtbWFyICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkID0gZldhcm5Ob0dyYW1tYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XQVJOX05PX0dSQU1NQVIsIHdhcm5Ob0dyYW1tYXJCdXR0b25TZWxlY3RlZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRWYWxpZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWlzVmFsaWQpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlzVmFsaWQgPSBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MTFlNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBYTUxTb3VyY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUlOX0lOREVOVEFUSU9OX1NJWkUgPSAwOwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9JTkRFTlRBVElPTl9TSVpFID0gMTY7Ci0KLQkvLyBDb250ZW50IEFzc2lzdAotCXByb3RlY3RlZCBCdXR0b24gZkF1dG9Qcm9wb3NlOwotCXByb3RlY3RlZCBMYWJlbCBmQXV0b1Byb3Bvc2VMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBmQXV0b1Byb3Bvc2VUZXh0OwotCXByaXZhdGUgQ29tYm8gZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvOwotCXByaXZhdGUgVmVjdG9yIGZTdWdnZXN0aW9uU3RyYXRlZ2llcyA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCi0JLy8gRm9ybWF0dGluZwotCXByb3RlY3RlZCBMYWJlbCBmTGluZVdpZHRoTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgZkxpbmVXaWR0aFRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmU3BsaXRNdWx0aUF0dHJzOwotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1RhYnM7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nU3BhY2VzOwotCXByaXZhdGUgU3Bpbm5lciBmSW5kZW50YXRpb25TaXplOwotCi0JLy8gZ3JhbW1hciBjb25zdHJhaW50cwotCXByb3RlY3RlZCBCdXR0b24gZlVzZUluZmVycmVkR3JhbW1hcjsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQpOwotCi0JCWNyZWF0ZUNvbnRlbnRzRm9yRm9ybWF0dGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yQ29udGVudEFzc2lzdEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoY29tcG9zaXRlKTsKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQ29udGVudEFzc2lzdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgY29udGVudEFzc2lzdEdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJY29udGVudEFzc2lzdEdyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Db250ZW50X2Fzc2lzdF9VSV8pOwotCi0JCWZBdXRvUHJvcG9zZSA9IGNyZWF0ZUNoZWNrQm94KGNvbnRlbnRBc3Npc3RHcm91cCwgWE1MVUlNZXNzYWdlcy5BdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQXV0b1Byb3Bvc2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZBdXRvUHJvcG9zZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlmQXV0b1Byb3Bvc2VMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRlbnRBc3Npc3RHcm91cCwgWE1MVUlNZXNzYWdlcy5Qcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV8pOwotCQlmQXV0b1Byb3Bvc2VUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKGNvbnRlbnRBc3Npc3RHcm91cCk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGVudEFzc2lzdEdyb3VwLCBYTUxVSU1lc3NhZ2VzLlN1Z2dlc3Rpb25fU3RyYXRlZ3kpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8gPSBuZXcgQ29tYm8oY29udGVudEFzc2lzdEdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVnaWVzID0gbmV3IFZlY3RvcigpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5hZGQoWE1MVUlNZXNzYWdlcy5TdWdnZXN0aW9uX1N0cmF0ZWd5X0xheCk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ2llcy5hZGQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVgpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uYWRkKFhNTFVJTWVzc2FnZXMuU3VnZ2VzdGlvbl9TdHJhdGVneV9TdHJpY3QpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuYWRkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGZvcm1hdHRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWZvcm1hdHRpbmdHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuRm9ybWF0dGluZ19VSV8pOwotCi0JCWZMaW5lV2lkdGhMYWJlbCA9IGNyZWF0ZUxhYmVsKGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5MaW5lX3dpZHRoX19VSV8pOwotCQlmTGluZVdpZHRoVGV4dCA9IG5ldyBUZXh0KGZvcm1hdHRpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDI1OwotCQlmTGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJZkxpbmVXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlNwbGl0TXVsdGlBdHRycyA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5TcGxpdF9tdWx0aXBsZV9hdHRyaWJ1dGVzKTsKLQkJKChHcmlkRGF0YSkgZlNwbGl0TXVsdGlBdHRycy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5DbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkNsZWFyQWxsQmxhbmtMaW5lcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmSW5kZW50VXNpbmdUYWJzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkluZGVudF91c2luZ190YWJzKTsKLQkJKChHcmlkRGF0YSkgZkluZGVudFVzaW5nVGFicy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmSW5kZW50VXNpbmdTcGFjZXMgPSBjcmVhdGVSYWRpb0J1dHRvbihmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3NwYWNlcyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1NwYWNlcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZSk7Ci0JCWZJbmRlbnRhdGlvblNpemUgPSBuZXcgU3Bpbm5lcihmb3JtYXR0aW5nR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlmSW5kZW50YXRpb25TaXplLnNldExheW91dERhdGEoZ2QpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZV90aXApOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1pbmltdW0oTUlOX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1heGltdW0oTUFYX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldEluY3JlbWVudCgxKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRQYWdlSW5jcmVtZW50KDQpOwotCQlmSW5kZW50YXRpb25TaXplLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncmFtbWFyQ29uc3RyYWludHNHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMSk7Ci0JCWdyYW1tYXJDb25zdHJhaW50c0dyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5HcmFtbWFyX0NvbnN0cmFpbnRzKTsKLQkJZ3JhbW1hckNvbnN0cmFpbnRzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLQkJZlVzZUluZmVycmVkR3JhbW1hciA9IGNyZWF0ZUNoZWNrQm94KGdyYW1tYXJDb25zdHJhaW50c0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlVzZV9pbmZlcnJlZF9ncmFtbWFyX2luX2Fic2VuY2Vfb2YpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBlZGl0b3IKLQkJWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVmFsdWVzKCkgewotCQlpZiAoZkF1dG9Qcm9wb3NlICE9IG51bGwpIHsKLQkJCWlmIChmQXV0b1Byb3Bvc2UuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWZBdXRvUHJvcG9zZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZBdXRvUHJvcG9zZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWZBdXRvUHJvcG9zZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlCi0JICogCi0JICogQHJldHVybiBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgY29uc3RhbnQgZnJvbSBYTUxVSVByZWZlcmVuY2VOYW1lcwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koKSB7Ci0JCWludCBpID0gZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpID49IDApIHsKLQkJCXJldHVybiAoU3RyaW5nKSAoZlN1Z2dlc3Rpb25TdHJhdGVnaWVzLmVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKSB7Ci0JCS8vIENvbnRlbnQgQXNzaXN0Ci0JCWZBdXRvUHJvcG9zZS5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkpOwotCQlTdHJpbmcgc3VnZ2VzdGlvblN0cmF0ZWd5ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1kpOwotCQlpZiAoc3VnZ2VzdGlvblN0cmF0ZWd5Lmxlbmd0aCgpID4gMCkKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koc3VnZ2VzdGlvblN0cmF0ZWd5KTsKLQkJZWxzZQotCQkJc2V0Q3VycmVudFN1Z2dlc3Rpb25TdHJhdGVneShYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX0xBWCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQlpZiAoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0KLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCWZVc2VJbmZlcnJlZEdyYW1tYXIuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuVVNFX0lORkVSUkVEX0dSQU1NQVIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKTsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JDb250ZW50QXNzaXN0R3JvdXAoKSB7Ci0JCS8vIENvbnRlbnQgQXNzaXN0Ci0JCWZBdXRvUHJvcG9zZS5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSk7Ci0JCWZBdXRvUHJvcG9zZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFKSk7Ci0JCVN0cmluZyBzdWdnZXN0aW9uU3RyYXRlZ3kgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1kpOwotCQlpZiAoc3VnZ2VzdGlvblN0cmF0ZWd5Lmxlbmd0aCgpID4gMCkKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koc3VnZ2VzdGlvblN0cmF0ZWd5KTsKLQkJZWxzZQotCQkJc2V0Q3VycmVudFN1Z2dlc3Rpb25TdHJhdGVneShYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX0xBWCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCWZMaW5lV2lkdGhUZXh0LnNldFRleHQoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCkgewotCQlmVXNlSW5mZXJyZWRHcmFtbWFyLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldCBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaW4gc3VnZ2VzdGlvbiBzdHJhdGVneSBjb21ibyBib3gKLQkgKiAKLQkgKiBAcGFyYW0gc3RyYXRlZ3kKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudFN1Z2dlc3Rpb25TdHJhdGVneShTdHJpbmcgc3RyYXRlZ3kpIHsKLQkJLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0KLQkJaW50IGkgPSBmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuaW5kZXhPZihzdHJhdGVneSk7Ci0JCWlmIChpID49IDApIHsKLQkJCWZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5zZWxlY3QoaSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIGZBdXRvUHJvcG9zZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCBmQXV0b1Byb3Bvc2VUZXh0LmdldFRleHQoKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1ksIGdldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZTcGxpdE11bHRpQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMsIGZDbGVhckFsbEJsYW5rTGluZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCWlmIChmSW5kZW50VXNpbmdUYWJzLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFKTsKLQkJfQotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCBmSW5kZW50YXRpb25TaXplLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUiwgZlVzZUluZmVycmVkR3JhbW1hci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gaXNFcnJvciA9IGZhbHNlOwotCQlTdHJpbmcgd2lkdGhUZXh0ID0gbnVsbDsKLQotCQlpZiAoZkxpbmVXaWR0aFRleHQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3aWR0aFRleHQgPSBmTGluZVdpZHRoVGV4dC5nZXRUZXh0KCk7Ci0JCQkJaW50IGZvcm1hdHRpbmdMaW5lV2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KHdpZHRoVGV4dCk7Ci0JCQkJaWYgKChmb3JtYXR0aW5nTGluZVdpZHRoIDwgV0lEVEhfVkFMSURBVElPTl9MT1dFUl9MSU1JVCkgfHwgKGZvcm1hdHRpbmdMaW5lV2lkdGggPiBXSURUSF9WQUxJREFUSU9OX1VQUEVSX0xJTUlUKSkKLQkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmV4YykgewotCQkJCXNldEludmFsaWRJbnB1dE1lc3NhZ2Uod2lkdGhUZXh0KTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJaXNFcnJvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgaW5kZW50U2l6ZSA9IDA7Ci0JCWlmIChmSW5kZW50YXRpb25TaXplICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW5kZW50U2l6ZSA9IGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChpbmRlbnRTaXplIDwgTUlOX0lOREVOVEFUSU9OX1NJWkUpIHx8IChpbmRlbnRTaXplID4gTUFYX0lOREVOVEFUSU9OX1NJWkUpKQotCQkJCQl0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZXhjKSB7Ci0JCQkJc2V0SW52YWxpZElucHV0TWVzc2FnZShJbnRlZ2VyLnRvU3RyaW5nKGluZGVudFNpemUpKTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJaXNFcnJvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWlzRXJyb3IpIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldFZhbGlkKHRydWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzFjZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgWE1MIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCi0JcHVibGljIFhNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCVhNTFVJUGx1Z2luIHhtbEVkaXRvclBsdWdpbiA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoeG1sRWRpdG9yUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZSh4bWxFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVTdG9yZSgpKTsKLQkJc2V0Q29udGV4dFR5cGVSZWdpc3RyeSh4bWxFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMoYW5jZXN0b3IpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQxZDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhNTCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA5NDYKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoCi0JCQkJCVhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSLCB0cnVlKTsKLQotCQkvLyBYTUwgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDEyNywgMCwgMTI3KQotCQkJCSsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNDIsIDAsIDI1NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZAotCQkvLyB2YWx1ZQotCQkvLyBpcwotCQkvLyBibGFjazsKLQkJLy8gbGVhdmluZwotCQkvLyBhcwotCQkvLyB3aWRnZXQKLQkJLy8gZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgOTUsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLAotCQkJCXN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygxMjgsIDEyOCwgMTI4KQotCQkJCSsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCAxMjcsIDk1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLAotCQkJCXN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBzdHlsZVZhbHVlKTsgLy8gc3BlY2lmaWVkCi0JCS8vIHZhbHVlCi0JCS8vIGlzCi0JCS8vIGJsYWNrOwotCQkvLyBsZWF2aW5nCi0JCS8vIGFzCi0JCS8vIHdpZGdldAotCQkvLyBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgMTI3LCAxMjcpCi0JCQkJKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZAotCQkvLyB2YWx1ZQotCQkvLyBpcwotCQkvLyBibGFjazsKLQkJLy8gbGVhdmluZwotCQkvLyBhcwotCQkvLyB3aWRnZXQKLQkJLy8gZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygwLCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIHN0eWxlVmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2OTMwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIFhNTCBVSQotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlTmFtZXMgewotICAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX0xBWCA9ICJMYXgiOwkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9TVFJJQ1QgPSAiU3RyaWN0IjsJICAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgaWYgY29kZSBhc3Npc3QgZ2V0cyBhdXRvIGFjdGl2YXRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1BST1BPU0UgPSBnZXRBdXRvUHJvcG9zZUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF1dG9Qcm9wb3NlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgaG9sZHMgdGhlIGNoYXJhY3RlcnMgdGhhdCBhdXRvIGFjdGl2YXRlIGNvZGUKLQkgKiBhc3Npc3QuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBBbGwgY2hhcmFjdGVycyB0aGF0IHRyaWdnZXIKLQkgKiBhdXRvIGNvZGUgYXNzaXN0LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1BST1BPU0VfQ09ERSA9IGdldEF1dG9Qcm9wb3NlQ29kZUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF1dG9Qcm9wb3NlQ29kZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZUNvZGUiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIGN1c3RvbWl6ZWQgdGVtcGxhdGVzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX0tFWSA9IGdldFRlbXBsYXRlc0tleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRlbXBsYXRlc0tleSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmN1c3RvbV90ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBvciBncmFtbWFyIHNob3VsZCBiZSBpbmZlcnJlZAotCSAqIG9yIG5vdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfSU5GRVJSRURfR1JBTU1BUiA9IGdldFVzZUluZmVycmVkR3JhbW1hcktleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVzZUluZmVycmVkR3JhbW1hcktleSgpIHsKLQkJcmV0dXJuICJ1c2VJbmZlcnJlZEdyYW1tYXIiOyAvLyROT04tTkxTLTEkCi0JfQotICAgIAotICAgIC8qKgotICAgICAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0gICAgICogYXNzaXN0LgotICAgICAqIDxwPgotICAgICAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0gICAgICogYXV0byBjb2RlIGFzc2lzdC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VHR0VTVElPTl9TVFJBVEVHWSA9IGdldFN1Z2dlc3Rpb25TdHJhdGVnZXlLZXkoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdWdnZXN0aW9uU3RyYXRlZ2V5S2V5KCkgewotICAgICAgICByZXR1cm4gInN1Z2dlc3Rpb25TdHJhdGVneSI7Ly8kTk9OLU5MUy0xJAotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0MTVmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENvbnRhaW5zIGEgc2V0IG9mIHByb2plY3Rpb24gbW9kZWwgYWRkaXRpb25zL2RlbGV0aW9ucy9tb2RpZmljYXRpb25zCi0gKi8KLWNsYXNzIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQlwcml2YXRlIE5vZGUgZk5vZGU7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZkRlbGV0aW9uczsKLQlwcml2YXRlIE1hcCBmQWRkaXRpb25zOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZNb2RpZmljYXRpb25zOwotCi0JcHVibGljIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJZk5vZGUgPSBub2RlOwotCQlmRGVsZXRpb25zID0gZGVsZXRpb25zOwotCQlmQWRkaXRpb25zID0gYWRkaXRpb25zOwotCQlmTW9kaWZpY2F0aW9ucyA9IG1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRBZGRpdGlvbnMoKSB7Ci0JCXJldHVybiBmQWRkaXRpb25zOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0RGVsZXRpb25zKCkgewotCQlyZXR1cm4gZkRlbGV0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldE1vZGlmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiBmTW9kaWZpY2F0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gZk5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjYmE0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiBtb2RlbCBub2RlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlByb2plY3Rpb25WaWV3ZXJzOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCgpIHsKLQkJc3VwZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCBhZGFwdGVyID0gbnVsbDsKLQotCQkvLyBjcmVhdGUgYWRhcHRlciBmb3IgZXZlcnkgZWxlbWVudCB0YWcKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKChOb2RlKSB0YXJnZXQpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwodGhpcyk7Ci0JCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIoKE5vZGUpIHRhcmdldCk7Ci0JCX0KLQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZhY3RvcnkgaXMgY3VycmVudGx5IGFjdGl2ZWx5IG1hbmFnaW5nIHByb2plY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCAmJiAhZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0aW9uIHZpZXdlciBpZgotCSAqIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkCi0JICogd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucywgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gY3JlYXRlIGEgY2hhbmdlIG9iamVjdCBmb3IgbGF0ZXN0IGNoYW5nZSBhbmQgYWRkIHRvIHF1ZXVlCi0JCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSA9IG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucyk7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMuZ2V0KHZpZXdlcik7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnbyB0aHJvdWdoIGV2ZXJ5IHByb2plY3Rpb252aWV3ZXIgYW5kIGNhbGwKLQkJLy8gcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQkJaW5mb3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHZpZXdlciB0byBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzIGZhY3RvcnkgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdmlld2VyJ3MgZG9jdW1lbnQgYW5kIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCSAqICAgICAgICAgICAgYXJlIG5vdCBudWxsCi0JICovCi0Jdm9pZCBhZGRQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHJlbW92ZSBvbGQgZW50cnkgaWYgaXQgZXhpc3RzCi0JCXJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzID09IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgbmV3IG9iamVjdCBjb250YWluaW5nIHByb2plY3Rpb24gdmlld2VyIGFuZCBpdHMgaW5mbwotCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IG5ldyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24odmlld2VyKTsKLQkJZlByb2plY3Rpb25WaWV3ZXJzLnB1dCh2aWV3ZXIsIGluZm8pOwotCQlpbmZvLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiB2aWV3ZXIgZnJvbSB0aGUgbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcwotCSAqIGZhY3RvciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCByZW1vdmVQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBvZiB2aWV3ZXJzCi0JCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5yZW1vdmUodmlld2VyKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vIGlmIHJlbW92aW5nIGxhc3QgcHJvamVjdGlvbiB2aWV3ZXIsIGNsZWFyIG91dCBldmVyeXRoaW5nCi0JCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwMjZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCB3aXRoIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgZm9yIHRoaXMKLSAqIGFkYXB0ZXIgbm9kZSdzIGNoaWxkcmVuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgZmFjdG9yeSkgewotCQlmQWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJUG9zaXRpb24gcG9zID0gbnVsbDsKLQkJaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpICYmIG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkvLyBJRG9jdW1lbnQgZG9jdW1lbnQgPQotCQkJLy8gZkFkYXB0ZXJGYWN0b3J5LmdldFByb2plY3Rpb25WaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotCQkJLy8gaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUluZGV4ZWRSZWdpb24gaW5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCWludCBzdGFydCA9IGlub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gaW5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoc3RhcnQgPj0gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJCS8vIHJlZ2lvbi1iYXNlZAotCQkJCS8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24gaW5jcmVhc2Ugd2hlbiBhZGQKLQkJCQkvLyBuZXdsaW5lCi0JCQkJcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJLy8gdHJ5IHsKLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbiBpbmNyZWFzZSB3aGVuCi0JCQkJLy8gYWRkIG5ld2xpbmUKLQkJCQkvLyBJUmVnaW9uIHN0YXJ0TGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIElSZWdpb24gZW5kTGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpbnQgc3RhcnRPZmZzZXQgPSBzdGFydExpbmVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGVuZExpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIGVuZExpbmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJLy8gaWYgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCQkJLy8gfQotCi0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIG5vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCByZWdpb24gaW5jcmVhc2Ugd2hlbgotCQkJCS8vIGFkZCBuZXdsaW5lCi0JCQkJLy8gaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpZiAoZW5kTGluZSArIDEgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkpIHsKLQkJCQkvLyBpbnQgb2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzdGFydExpbmUpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUgKyAxKTsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBudWxsLCB4KTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZvciBub2RlIGluIHRoZSBjdXJyZW50IGxpc3Qgb2YgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb25zIGZvciB0aGlzIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGFnUHJvamVjdGlvbkFubm90YXRpb24KLQkgKi8KLQlwcml2YXRlIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGdldEV4aXN0aW5nQW5ub3RhdGlvbihOb2RlIG5vZGUpIHsKLQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYW5ubyA9IG51bGw7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpICYmIGFubm8gPT0gbnVsbCkgewotCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGEgPSAoVGFnUHJvamVjdGlvbkFubm90YXRpb24pIGl0Lm5leHQoKTsKLQkJCQlOb2RlIG4gPSBhLmdldE5vZGUoKTsKLQkJCQlpZiAobm9kZS5lcXVhbHMobikpIHsKLQkJCQkJYW5ubyA9IGE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhbm5vOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgYSBub2RlIHR5cGUgYWJsZSB0byBmb2xkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBub2RlIGlzIHByb2plY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gY2hlY2sgaWYgZm9sZGluZyBpcyBldmVuIGVuYWJsZWQsIGlmIG5vdCwganVzdCBpZ25vcmUgbm90aWZ5Q2hhbmdlZAotCQkvLyBldmVudHMKLQkJaWYgKCFmQWRhcHRlckZhY3RvcnkuaXNBY3RpdmUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXVwZGF0ZUFkYXB0ZXIoKE5vZGUpIG5vdGlmaWVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihOb2RlIG5vZGUsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlNYXAgYWRkaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb2plY3Rpb25Bbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJLy8gZ28gdGhyb3VnaCBpbW1lZGlhdGUgY2hpbGQgbm9kZXMgYW5kIGZpZ3VyZSBvdXQgcHJvamVjdGlvbgotCQkvLyBtb2RlbCBhbm5vdGF0aW9ucwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24oY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQlhZGRpdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KGV4aXN0aW5nLCBuZXdQb3MpOwotCQkJCQkJLy8gcmVtb3ZlIGZyb20gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gZGVsZXRlCi0JCQkJCQlmVGFnQW5ub3RhdGlvbnMucmVtb3ZlKGV4aXN0aW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQotCQkJLy8gaW4gdGhlIGVuZCwgd2FudCB0byBkZWxldGUgYW55dGhpbmcgbGVmdG92ZXIgaW4gb2xkIGxpc3QsIGFkZAotCQkJLy8gZXZlcnl0aGluZyBpbiBhZGRpdGlvbnMsIGFuZCB1cGRhdGUgZXZlcnl0aGluZyBpbgotCQkJLy8gcHJvamVjdGlvbkFubm90YXRpb25zCi0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG9sZExpc3QgPSBudWxsOwotCQkJaWYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJb2xkTGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBtb2RpZnlMaXN0ID0gbnVsbDsKLQkJCWlmICghcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW1vZGlmeUxpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgcHJvamVjdGlvbkFubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQotCQkJLy8gc3BlY2lmaWNhbGx5IGFkZCBhbGwgYW5ub3RhdGlvbnMgdG8gdmlld2VyCi0JCQlpZiAodmlld2VyICE9IG51bGwgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKG9sZExpc3QgIT0gbnVsbCAmJiBvbGRMaXN0Lmxlbmd0aCA+IDApIHx8ICghYWRkaXRpb25zLmlzRW1wdHkoKSkgfHwgKG1vZGlmeUxpc3QgIT0gbnVsbCAmJiBtb2RpZnlMaXN0Lmxlbmd0aCA+IDApKQotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgb2xkTGlzdCwgYWRkaXRpb25zLCBtb2RpZnlMaXN0KTsKLQkJfQotCi0JCS8vIHNhdmUgbmV3IGxpc3Qgb2YgYW5ub3RhdGlvbnMKLQkJZlRhZ0Fubm90YXRpb25zID0gcHJvamVjdGlvbkFubm90YXRpb25zOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLnVwZGF0ZUFkYXB0ZXIgKCIgKyBub2RlTmFtZSArICIpOiIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjBjMTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0aW9uIHZpZXdlciBhbmQgYWxzbyBtYW5hZ2VzIHVwZGF0aW5nCi0gKiB0aGUgdmlld2VyJ3MgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0gKi8KLWNsYXNzIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmSW5mby5oYXNDaGFuZ2VzUXVldWVkKCkpCi0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJZkluZm8uYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIHZpZXdlcgotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkvKioKLQkgKiBEb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCi0JcHVibGljIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlmRG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0JfQotCi0Jdm9pZCBzZXRJc0RvY3VtZW50Q2hhbmdpbmcoYm9vbGVhbiBjaGFuZ2luZykgewotCQlmSXNEb2N1bWVudENoYW5naW5nID0gY2hhbmdpbmc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRDaGFuZ2luZygpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50Q2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgcGVuZGluZyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0byB0aGUKLQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCUxpc3QgcXVldWVkQ2hhbmdlcyA9IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCk7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkKLQkJLy8gdGhlbSB0bwotCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCXdoaWxlICghcXVldWVkQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIGNoYW5nZXMgPSAoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMpIHF1ZXVlZENoYW5nZXMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5tb2RpZnlBbm5vdGF0aW9ucyhjaGFuZ2VzLmdldERlbGV0aW9ucygpLCBjaGFuZ2VzLmdldEFkZGl0aW9ucygpLCBjaGFuZ2VzLmdldE1vZGlmaWNhdGlvbnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYmUgY29udGludWUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFubm90YXRpb24gY2hhbmdlcyBxdWV1ZWQgdXAsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlc1F1ZXVlZCgpIHsKLQkJcmV0dXJuICFnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSkgewotCQkvKgotCQkgKiBmdXR1cmVfVE9ETzogbWF5YmUgaW1wcm92ZSBieSBjaGVja2luZyBpZiBhbm5vdGF0aW9uIHByb2plY3Rpb24KLQkJICogbW9kZWwgY2hhbmdlIGFscmVhZHkgZXhpc3RzIGZvciBub2RlLiBpZiBzbywgdGhyb3cgb3V0IG9sZCBjaGFuZ2UuCi0JCSAqLwotCQlnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmFkZChuZXdDaGFuZ2UpOwotCi0JCS8vIGlmIGRvY3VtZW50IGlzbid0IGNoYW5naW5nLCBnbyBhaGVhZCBhbmQgYXBwbHkgaXQKLQkJaWYgKCFpc0RvY3VtZW50Q2hhbmdpbmcoKSkgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBhZGQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZEb2N1bWVudExpc3RlbmVyID0gbmV3IERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyByZW1vdmUgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgbGlzdCBvZiBxdWV1ZWQgY2hhbmdlcyBzaW5jZSBpdCBtYXkgbm8gbG9uZ2VyCi0JCS8vIGJlIGFjY3VyYXRlCi0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzLmNsZWFyKCk7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzY5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbW9kZWwgb2YgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciBYTUwuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlclhNTCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciwgSVByb2plY3Rpb25MaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCS8qKgotCSAqIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIG5vZGVzIHRvIGFkZCBhZGFwdGVycyB0byAobGltaXQgZm9yIHBlcmZvcm1hbmNlCi0JICogc2FrZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfQ0hJTERSRU4gPSAxMDsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBzaWJsaW5nIG5vZGVzIHRvIGFkZCBhZGFwdGVycyB0byAobGltaXQgZm9yCi0JICogcGVyZm9ybWFuY2Ugc2FrZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfU0lCTElOR1MgPSAxMDAwOwotCi0JLyoqCi0JICogQWRkcyBhbiBhZGFwdGVyIHRvIG5vZGUgYW5kIGl0cyBjaGlsZHJlbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGNoaWxkTGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKE5vZGUgbm9kZSwgaW50IGNoaWxkTGV2ZWwpIHsKLQkJLy8gc3RvcCBhZGRpbmcgaW5pdGlhbCBhZGFwdGVycyBNQVhfQ0hJTERSRU4gbGV2ZWxzIGRlZXAgZm9yCi0JCS8vIHBlcmZvcm1hbmNlIHNha2UKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyICYmIGNoaWxkTGV2ZWwgPCBNQVhfQ0hJTERSRU4pIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQotCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGFkYXB0ZXIgZm9yIHRoZSBjdXJyZW50IG5vZGUgYW5kIHVwZGF0ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgd2l0aCBwcm9qZWN0aW9uIGluZm9ybWF0aW9uCi0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCBhZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIudXBkYXRlQWRhcHRlcihub2RlLCBmVmlld2VyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGp1c3QgY2FsbCBnZXRhZGFwdGVyIHNvIHRoZSBhZGFwdGVyIGlzIGNyZWF0ZWQgYW5kCi0JCQkJLy8gYXV0b21hdGljYWxseSBpbml0aWFsaXplZAotCQkJCW5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpOwotCQkJfQotCQkJaW50IHNpYmxpbmdMZXZlbCA9IDA7Ci0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsICYmIHNpYmxpbmdMZXZlbCA8IE1BWF9TSUJMSU5HUykgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgY2hpbGRMZXZlbCArIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIGFkZHMgYW4gYWRhcHRlciBvbnRvIGVhY2ggZm9yIHRyYWNraW5nCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCQkrK3NpYmxpbmdMZXZlbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlclhNTC5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCB0byB1c2Ugd2l0aCB0aGlzIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgZ2V0QWRhcHRlckZhY3RvcnkoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc01vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JCQkJCS8vIGdldHRpbmcgdGhlIHByb2plY3Rpb25tb2RlbG5vZGVhZGFwdGVyIGZvciB0aGUgZmlyc3QKLQkJCQkJLy8gdGltZQotCQkJCQkvLyBzbyBkbyBzb21lIGluaXRpYWxpemluZwotCQkJCQlpZiAoIWZhY3RvcnlSZWdpc3RyeS5jb250YWlucyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5jbGFzcykgJiYgY3JlYXRlSWZOZWVkZWQpIHsKLQkJCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBuZXdGYWN0b3J5ID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCgpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBmYWN0b3J5IHJlZ2lzdHJ5Ci0JCQkJCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShuZXdGYWN0b3J5KTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gcHJvcG9nYXRpbmcgYWRhcHRlcgotCQkJCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc01vZGVsOwotCQkJCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChwcm9wYWdhdGluZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXdGYWN0b3J5KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBmYWN0b3J5Ci0JCQkJCWZhY3RvcnkgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MKSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuZ2V0QWRhcHRlckZhY3Rvcnk6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gY2xlYXIgb3V0IG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkvLyBzZXQgcHJvamVjdGlvbiB2aWV3ZXIgb24gbmV3IGRvY3VtZW50J3MgYWRhcHRlciBmYWN0b3J5Ci0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KHRydWUpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQotCQkJYWRkQWxsQWRhcHRlcnMoKTsKLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGUgYSBQcm9qZWN0aW9uVmlld2VyIHdpdGggdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHVuaW5zdGFsbCBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbGwgbmV3IHZpZXdlcgotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJdW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeShmYWxzZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnkucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgYW5ub3RhdGlvbnMKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpCi0JCQlmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5yZW1vdmVBbGxBbm5vdGF0aW9ucygpOwotCi0JCXJlbW92ZUFsbEFkYXB0ZXJzKCk7Ci0KLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIGFkYXB0ZXIgZnJvbSBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBsZXZlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBsZXZlbCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQotCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGFkYXB0ZXIgZm9yIHRoZSBjdXJyZW50IG5vZGUgYW5kIHJlbW92ZSBpdAotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0KLQkJCU5vZGUgbmV4dENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5leHRDaGlsZDsKLQkJCQluZXh0Q2hpbGQgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgbGV2ZWwgKyAxKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGFuZCByZW1vdmVzIGFkYXB0ZXIgZnJvbSBlYWNoIGZvciBjbGVhbnVwCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSAoTm9kZSkgc3RhcnROb2RlOwotCQkJCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oY3VycmVudE5vZGUsIDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwucmVtb3ZlQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgZm9sZGluZyBpcyBlbmFibGVkIGFuZCBuZXcgZG9jdW1lbnQgaXMgZ29pbmcgdG8gYmUgYSB0b3RhbGx5Ci0JCS8vIGRpZmZlcmVudCBkb2N1bWVudCwgZGlzYWJsZSBwcm9qZWN0aW9uCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmRG9jdW1lbnQgIT0gbmV3SW5wdXQpIHsKLQkJCS8vIGRpc2FibGUgcHJvamVjdGlvbiBhbmQgZGlzY29ubmVjdCBldmVyeXRoaW5nCi0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBwcm9qZWN0aW9uIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgYmVmb3JlIGlucHV0IGRvY3VtZW50IGNoYW5nZWQKLQkJLy8gYW5kIG5ldyBkb2N1bWVudCBpcyBkaWZmZXJlbnQgdGhhbiBvbGQgZG9jdW1lbnQKLQkJaWYgKGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCAmJiBmRG9jdW1lbnQgPT0gbnVsbCAmJiBuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0aW9uRW5hYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZyb20gcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDIyNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBmb3IgcHJvcGVydGllcyB3aGljaCByZXF1aXJlIGEgY29tYm8gYm94IGNlbGwKLSAqIGVkaXRvciBhbmQgd2hvc2UgdmFsdWVzIGNvbnNpc3Qgb2YgYSBsaXN0IG9mIGVudW1lcmF0ZWQgc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBQcm9wZXJ0eURlc2NyaXB0b3IgewotCXByb3RlY3RlZCBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IgZkVkaXRvcjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGZQYXJlbnQ7Ci0KLQkvKioKLQkgKiBUaGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBkZXNjcmliZWQgcHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZWYWx1ZXNbXSA9IG51bGw7Ci0KLQlwdWJsaWMgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBuZXdEaXNwbGF5TmFtZSwgU3RyaW5nW10gdmFsdWVzQXJyYXkpIHsKLQkJc3VwZXIoaWQsIG5ld0Rpc3BsYXlOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZykgaWQpOwotCQlmVmFsdWVzID0gdmFsdWVzQXJyYXk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjZWxsIGVkaXRvciBmb3IgZWRpdGluZyB0aGlzIHByb3BlcnR5LgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBlZGl0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHdpZGdldCBmb3IgdGhlIGNlbGwgZWRpdG9yCi0JICogQHJldHVybiB0aGUgY2VsbCBlZGl0b3IgZm9yIHRoaXMgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGlzIHByb3BlcnR5IGNhbm5vdCBiZSBlZGl0ZWQKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBDZWxsIEVkaXRvciB3aXRoIGEgdmFsaWQgQ29udHJvbAotCQkvLyB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotCQkvLyBJZiBhbnkgb2YgdGhhdCdzIG5vdCB0cnVlLCBjcmVhdGUgYW5kIHJldHVybiBhIG5ldyBDZWxsIEVkaXRvcgotCQlpZiAoZkVkaXRvciA9PSBudWxsIHx8IGZFZGl0b3IuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZkVkaXRvci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpIHx8IHBhcmVudCAhPSBmUGFyZW50KQotCQkJZkVkaXRvciA9IG5ldyBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IocGFyZW50LCBmVmFsdWVzKTsKLQkJZlBhcmVudCA9IHBhcmVudDsKLQkJcmV0dXJuIGZFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVmFsdWVzKFN0cmluZyBuZXdWYWx1ZXNbXSkgewotCQlpZiAoQXJyYXlzLmVxdWFscyhmVmFsdWVzLCBuZXdWYWx1ZXMpKQotCQkJcmV0dXJuOwotCQlmVmFsdWVzID0gbmV3VmFsdWVzOwotCQlpZiAoZkVkaXRvciAhPSBudWxsKSB7Ci0JCQlmRWRpdG9yLnNldEl0ZW1zKG5ld1ZhbHVlcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TdHJpbmdDb21ib0JveENlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1N0cmluZ0NvbWJvQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY0Nzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1N0cmluZ0NvbWJvQm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIEFuIGV4dGVuZGVkIENvbWJvQm94Q2VsbEVkaXRvciB0aGF0IHNlbGVjdHMgYW5kIHJldHVybnMgU3RyaW5ncwotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IgZXh0ZW5kcyBDb21ib0JveENlbGxFZGl0b3IgewotCXByaXZhdGUgYm9vbGVhbiBmU2V0dGluZ1ZhbHVlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICovCi0JcHVibGljIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcykgewotCQlzdXBlcihwYXJlbnQsIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcywgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgaXRlbXMsIHN0eWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKSB7Ci0JCS8vIG90aGVyd2lzZSBsaW1pdHMgdG8gc2V0IG9mIHZhbGlkIHZhbHVlcwotCQlPYmplY3QgaW5kZXggPSBzdXBlci5kb0dldFZhbHVlKCk7Ci0JCWludCBzZWxlY3Rpb24gPSAtMTsKLQkJaWYgKGluZGV4IGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCXNlbGVjdGlvbiA9ICgoSW50ZWdlcikgaW5kZXgpLmludFZhbHVlKCk7Ci0JCWlmIChzZWxlY3Rpb24gPj0gMCkKLQkJCXJldHVybiBnZXRJdGVtcygpW3NlbGVjdGlvbl07Ci0JCWVsc2UgaWYgKGdldENvbnRyb2woKSBpbnN0YW5jZW9mIENDb21ibykgewotCQkJLy8gcmV0cmlldmUgdGhlIGFjdHVhbCB0ZXh0IGFzIHRoZSBsaXN0IG9mIHZhbGlkIGl0ZW1zIGRvZXNuJ3QKLQkJCS8vIGNvbnRhaW4gdGhlIHZhbHVlCi0JCQlyZXR1cm4gKChDQ29tYm8pIGdldENvbnRyb2woKSkuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmU2V0dGluZ1ZhbHVlKQotCQkJcmV0dXJuOwotCQlmU2V0dGluZ1ZhbHVlID0gdHJ1ZTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJc3VwZXIuZG9TZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJaW50IHNlbGVjdGlvbiA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRJdGVtcygpLmxlbmd0aDsgaSsrKQotCQkJCWlmIChnZXRJdGVtcygpW2ldLmVxdWFscyhzdHJpbmdWYWx1ZSkpCi0JCQkJCXNlbGVjdGlvbiA9IGk7Ci0JCQlpZiAoc2VsZWN0aW9uID49IDApCi0JCQkJc3VwZXIuZG9TZXRWYWx1ZShuZXcgSW50ZWdlcihzZWxlY3Rpb24pKTsKLQkJCWVsc2UgewotCQkJCXN1cGVyLmRvU2V0VmFsdWUobmV3IEludGVnZXIoLTEpKTsKLQkJCQlpZiAoZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ0NvbWJvICYmICFzdHJpbmdWYWx1ZS5lcXVhbHMoKChDQ29tYm8pIGdldENvbnRyb2woKSkuZ2V0VGV4dCgpKSkgewotCQkJCQkvLyB1cGRhdGUgdGhlIFRleHQgd2lkZ2V0Ci0JCQkJCSgoQ0NvbWJvKSBnZXRDb250cm9sKCkpLnNldFRleHQoc3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmU2V0dGluZ1ZhbHVlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gbmV3SXRlbXMpIHsKLQkJaWYgKGdldENvbnRyb2woKSA9PSBudWxsIHx8IGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBpdGVtIGxpc3QgZm9yIGRpc3Bvc2VkIGNlbGwgZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGtlZXAgc2VsZWN0aW9uIGlmIHBvc3NpYmxlCi0JCU9iamVjdCBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBnZXRWYWx1ZSgpOwotCQlzdXBlci5zZXRJdGVtcyhuZXdJdGVtcyk7Ci0JCWlmIChwcmV2aW91c1NlbGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBnZXRDb250cm9sKCkgaW5zdGFuY2VvZiBDQ29tYm8pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobmV3SXRlbXNbaV0uZXF1YWxzKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSkpCi0JCQkJCXNldFZhbHVlKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvWE1MUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmOTRjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBbiBJUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgSkZhY2Ugdmlld2VyIHVzZWQgdG8gZGlzcGxheQotICogcHJvcGVydGllcyBvZiBET00gbm9kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZSwgSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uLCBJUHJvcGVydHlTb3VyY2UyIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9BVFRSSUJVVEVTID0gWE1MVUlNZXNzYWdlcy5YTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBmU2V0RXhwZXJ0RmlsdGVyID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBkZXJpdmUgY2F0ZWdvcmllcyBmcm9tIENNRGF0YVR5cGVzOyBkaXNhYmxlZCB1bnRpbCBkaXNwbGF5IHN0cmluZ3MgY2FuCi0JICogYmUgcGxhbm5lZAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZlNob3VsZERlcml2ZUNhdGVnb3JpZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZlNvcnRFbnVtZXJhdGVkVmFsdWVzID0gdHJ1ZTsKLQotCS8qKgotCSAqIE5vdGU6IHdlIHdhbnQgdGhlIGRlZmF1bHQgZkNhc2VTZW5zaXRpdmUgdG8gYmUgdHJ1ZSwgYnV0LCB0byBhdm9pZAotCSAqIG1lYW5pbmdsZXNzIGRvdWJsZSBpbml0aWFsaXphdGlvbiwgd2UgbGVhdmUgZGVmYXVsdCBoZXJlLCBhbmQgc2V0IGluCi0JICogY29uc3RydWN0b3Igb25seS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZkNhc2VTZW5zaXRpdmU7Ci0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yW10gZkRlc2NyaXB0b3JzID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgZk5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdGFjayBmVmFsdWVzQmVpbmdTZXQgPSBuZXcgU3RhY2soKTsKLQotCXB1YmxpYyBYTUxQcm9wZXJ0eVNvdXJjZShJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlzdXBlcigpOwotCQlmTm9kZSA9IGluaXROb2RlKHRhcmdldCk7Ci0JCWZDYXNlU2Vuc2l0aXZlID0gaW5pdENhc2VTZW5zaXRpdmUoZk5vZGUpOwotCi0JfQotCi0JLyoqIHNlcGVyYXRlIG1ldGhvZCBqdXN0IHRvIGlzb2xhdGUgZXJyb3IgcHJvY2Vzc2luZyAqLwotCXByaXZhdGUgTm9kZSBpbml0Tm9kZShJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJYTUxQcm9wZXJ0eVNvdXJjZSBpcyBvbmx5IGZvciBOb2RlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluaXRDYXNlU2Vuc2l0aXZlKE5vZGUgbm9kZSkgewotCQkvLyBhbG1vc3QgYWxsIHRhZ3MgYXJlIGNhc2Ugc2Vuc3RpdmUsIGV4Y2VwdCB0aGF0IG9sZCBIVE1MCi0JCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCWFkYXB0ZXIgPSBnZXREb2NUeXBlRnJvbURPTU5vZGUobm9kZSk7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJY2FzZVNlbnNpdGl2ZSA9IChhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCkgPT0gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRSk7Ci0JCX0KLQkJcmV0dXJuIGNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogYnkgImludGVybmFsIHNwZWMiIHRoZSBET0NUWVBFIGFkYXB0ZXIgaXMgb25seSBhdmFpbGFibGUgZnJvbSBEb2N1bWVudAotCSAqIE5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIHtAbGluayBEb2N1bWVudFR5cGVBZGFwdGVyfQotCSAqLwotCXByaXZhdGUgRG9jdW1lbnRUeXBlQWRhcHRlciBnZXREb2NUeXBlRnJvbURPTU5vZGUoTm9kZSBub2RlKSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCURvY3VtZW50IG93bmVyRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKG93bmVyRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJLy8gaWYgb3duZXJEb2N1bWVudCBpcyBudWxsLCB0aGVuIGZOb2RlIG11c3QgYmUgdGhlIERvY3VtZW50IE5vZGUKLQkJCS8vIFtvbGQsIG9sZCBjb21tZW50XQotCQkJLy8gaG1tbW0sIGd1ZXNzIG5vdC4gU2VlCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMjMzCi0JCQkvLyBndWVzcyB0aGlzIGlzIHVzZWQgZm9yIG1hbnkgSU5vZGVOb3RpZmllcnMsIG5vdCBqdXN0IFhNTC4KLQkJCS8vIChhbmQgRFREJ3MgdXNlIElET01Ob2RlPyAuLi4gdGhhdCBkb2Vzbid0IHNvdW5kIHF1aXRlIHJpZ2h0Ci0JCQkvLyAuLi4gYnV0LCBtYXliZSBhIHNlcGFyYXRlIGlzc3VlKS4KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCQlvd25lckRvY3VtZW50ID0gKERvY3VtZW50KSBub2RlOwotCQkJfQotCQl9Ci0JCWlmKG93bmVyRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyRG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIF9nZXRWYWxpZEZpeGVkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIGhlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJU3RyaW5nIGltcGxpZWRWYWx1ZSA9IGhlbHBlci5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJaWYgKGltcGxpZWRWYWx1ZSAhPSBudWxsKQotCQkJdmFsdWVzLmFkZChpbXBsaWVkVmFsdWUpOwotCQlib29sZWFuIGNoZWNrSWZDdXJyZW50VmFsdWVJc0luY2x1ZGVkID0gKGZOb2RlLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsICYmIGZOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkgIT0gbnVsbCAmJiBmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpOwotCQlpZiAoY2hlY2tJZkN1cnJlbnRWYWx1ZUlzSW5jbHVkZWQpIHsKLQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBudWxsOwotCQkJY3VycmVudFZhbHVlID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQkJCWlmICghY3VycmVudFZhbHVlLmVxdWFscyhpbXBsaWVkVmFsdWUpKQotCQkJCXZhbHVlcy5hZGQoY3VycmVudFZhbHVlKTsKLQkJfQotCQlTdHJpbmdbXSB2YWxpZFN0cmluZ3MgPSBuZXcgU3RyaW5nW3ZhbHVlcy5zaXplKCldOwotCQl2YWxpZFN0cmluZ3MgPSAoU3RyaW5nW10pIHZhbHVlcy50b0FycmF5KHZhbGlkU3RyaW5ncyk7Ci0JCXJldHVybiB2YWxpZFN0cmluZ3M7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBfZ2V0VmFsaWRTdHJpbmdzKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIENNRGF0YVR5cGUgdmFsdWVzSGVscGVyKSB7Ci0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlib29sZWFuIGN1cnJlbnRWYWx1ZUtub3duID0gZmFsc2U7Ci0JCWJvb2xlYW4gY2hlY2tJZkN1cnJlbnRWYWx1ZUlzS25vd24gPSAoZk5vZGUuZ2V0QXR0cmlidXRlcygpICE9IG51bGwgJiYgZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKSAhPSBudWxsICYmIGZOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCk7Ci0JCVN0cmluZyBjdXJyZW50VmFsdWUgPSBudWxsOwotCQlpZiAoY2hlY2tJZkN1cnJlbnRWYWx1ZUlzS25vd24pCi0JCQljdXJyZW50VmFsdWUgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCi0JCWlmICh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCAmJiB2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJLy8gRklYRUQgdmFsdWUKLQkJCWN1cnJlbnRWYWx1ZUtub3duID0gY3VycmVudFZhbHVlICE9IG51bGwgJiYgdmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpLmVxdWFscyhjdXJyZW50VmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gRU5VTUVSQVRFRCB2YWx1ZXMKLQkJCVN0cmluZ1tdIHZhbHVlU3RyaW5ncyA9IG51bGw7Ci0JCQkvLyB2YWx1ZVN0cmluZ3MgPSB2YWx1ZXNIZWxwZXIuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmTm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCAmJiBmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJdmFsdWVTdHJpbmdzID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKChFbGVtZW50KSBmTm9kZSwgYXR0ckRlY2wpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmFsdWVTdHJpbmdzID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCQl9Ci0JCQlpZiAodmFsdWVTdHJpbmdzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoY2hlY2tJZkN1cnJlbnRWYWx1ZUlzS25vd24gJiYgdmFsdWVTdHJpbmdzW2ldLmVxdWFscyhjdXJyZW50VmFsdWUpKQotCQkJCQkJY3VycmVudFZhbHVlS25vd24gPSB0cnVlOwotCQkJCQl2YWx1ZXMuYWRkKHZhbHVlU3RyaW5nc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FICYmIHZhbHVlc0hlbHBlci5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQlpZiAoIXZhbHVlcy5jb250YWlucyh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpKQotCQkJCXZhbHVlcy5hZGQodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpKTsKLQkJfQotCi0JCWlmIChjaGVja0lmQ3VycmVudFZhbHVlSXNLbm93biAmJiAhY3VycmVudFZhbHVlS25vd24gJiYgY3VycmVudFZhbHVlICE9IG51bGwgJiYgY3VycmVudFZhbHVlLmxlbmd0aCgpID4gMCkKLQkJCXZhbHVlcy5hZGQoY3VycmVudFZhbHVlKTsKLQkJU3RyaW5nW10gdmFsaWRTdHJpbmdzID0gbmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXTsKLQkJdmFsaWRTdHJpbmdzID0gKFN0cmluZ1tdKSB2YWx1ZXMudG9BcnJheSh2YWxpZFN0cmluZ3MpOwotCQlyZXR1cm4gdmFsaWRTdHJpbmdzOwotCX0KLQotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiBoaWRlT25GaWx0ZXIpIHsKLQkJLy8gVGhlIGRlc2NyaXB0b3IgY2xhc3MgdXNlZCBoZXJlIGlzIGFsc28gdXNlZCBpbgotCQkvLyB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCWRlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoZ2V0Q2F0ZWdvcnkobnVsbCkpOwotCQlkZXNjcmlwdG9yLnNldERlc2NyaXB0aW9uKGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoaGlkZU9uRmlsdGVyICYmIGZTZXRFeHBlcnRGaWx0ZXIpCi0JCQlkZXNjcmlwdG9yLnNldEZpbHRlckZsYWdzKG5ldyBTdHJpbmdbXXtJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlR9KTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGFuIGF0dHJpYnV0ZSB3aXRoIEVOVU1FUkFURUQgdmFsdWVzIC0KLQkgKiBpZiB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QsIGFuIGVkaXRhYmxlIGNvbWJvIGJveCBpcyByZXR1cm5lZCAtIGlmIHRoZQotCSAqIHZhbHVlIGV4aXN0cyBidXQgaXMgbm90IG9uZSBpbiB0aGUgZW51bWVyYXRlZCBsaXN0IG9mIHZhbHVlLCBhIGNvbWJvCi0JICogYm94IGZlYXR1cmluZyB0aGUgY3VycmVudCBhbmQgY29ycmVjdCB2YWx1ZXMgaXMgcmV0dXJuZWQgLSBpZiB0aGUgdmFsdWUKLQkgKiBleGlzdHMgYW5kIGl0IGlzIGEgdmFsaWQgdmFsdWUsIGEgY29tYm8gYm94IGZlYXR1cmluZyB0aGUgY29ycmVjdAotCSAqIHZhbHVlcyB3aXRoIHRoZSBjdXJyZW50IG9uZSB2aXNpYmxlIGlzIHJldHVybmVkCi0JICovCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUVudW1lcmF0ZWRQcm9wZXJ0eURlc2NyaXB0b3IoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgQ01EYXRhVHlwZSB2YWx1ZXNIZWxwZXIpIHsKLQkJLy8gdGhlIGRpc3BsYXlOYW1lIE1VU1QgYmUgc2V0Ci0JCUVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLmdldEF0dHJOYW1lKCksIGF0dHJEZWNsLmdldEF0dHJOYW1lKCksIF9nZXRWYWxpZFN0cmluZ3MoYXR0ckRlY2wsIHZhbHVlc0hlbHBlcikpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KGF0dHJEZWNsKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSk7Ci0JCWlmIChhdHRyRGVjbC5nZXRVc2FnZSgpICE9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQgJiYgZlNldEV4cGVydEZpbHRlcikKLQkJCWRlc2NyaXB0b3Iuc2V0RmlsdGVyRmxhZ3MobmV3IFN0cmluZ1tde0lQcm9wZXJ0eVNoZWV0RW50cnkuRklMVEVSX0lEX0VYUEVSVH0pOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYW4gYXR0cmlidXRlIHdpdGggYSBGSVhFRCB2YWx1ZSAtIGlmCi0JICogdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0LCBhbiBlZGl0YWJsZSBjb21ibyBib3ggaXMgcmV0dXJuZWQgLSBpZiB0aGUKLQkgKiB2YWx1ZSBleGlzdHMgYnV0IGlzIG5vdCB0aGUgZml4ZWQvZGVmYXVsdCB2YWx1ZSwgYSBjb21ibyBib3ggZmVhdHVyaW5nCi0JICogdGhlIGN1cnJlbnQgYW5kIGNvcnJlY3QgdmFsdWUgaXMgcmV0dXJuZWQgLSBpZiB0aGUgdmFsdWUgZXhpc3RzIGFuZCBpdAotCSAqIGlzIHRoZSBmaXhlZC9kZWZhdWx0IHZhbHVlLCBubyBjZWxsIGVkaXRvciBpcyBwcm92aWRlZCAibG9ja2luZyIgdGhlCi0JICogdmFsdWUgaW4KLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRml4ZWRQcm9wZXJ0eURlc2NyaXB0b3IoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgQ01EYXRhVHlwZSBoZWxwZXIpIHsKLQkJLy8gdGhlIGRpc3BsYXlOYW1lIE1VU1QgYmUgc2V0Ci0JCUVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLmdldE5vZGVOYW1lKCksIGF0dHJEZWNsLmdldE5vZGVOYW1lKCksIF9nZXRWYWxpZEZpeGVkU3RyaW5ncyhhdHRyRGVjbCwgaGVscGVyKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoZ2V0Q2F0ZWdvcnkoYXR0ckRlY2wpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihhdHRyRGVjbC5nZXRBdHRyTmFtZSgpKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCk7Ci0KLQkJaWYgKGF0dHJUeXBlICE9IG51bGwpIHsKLQkJCS8vIGhhbmRsZSBkZWNsYXJhdGlvbnMgdGhhdCBwcm92aWRlIEZJWEVEL0VOVU1FUkFURUQgdmFsdWVzCi0JCQlpZiAoYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpICE9IG51bGwgJiYgYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpLmxlbmd0aCA+IDApIHsKLQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlRW51bWVyYXRlZFByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCwgYXR0clR5cGUpOwotCQkJfQotCQkJZWxzZSBpZiAoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCB8fCBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgPT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVEKSAmJiBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRvciA9IGNyZWF0ZUZpeGVkUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBhdHRyVHlwZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBwbGFpbiB0ZXh0Ci0JCQkJZGVzY3JpcHRvciA9IGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gbm8gZXh0cmEgaW5mb3JtYXRpb24gZ2l2ZW4KLQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMuCi0JICogCi0JICogQHJldHVybiBhbGwgdmFsaWQgZGVzY3JpcHRvcnMuCi0JICovCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yW10gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCX0KLQotCQlMaXN0IGRlc2NyaXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0KLQkJLy8gYWRkIGRlc2NyaXB0b3JzIGZvciBleGlzdGluZyBhdHRyaWJ1dGVzCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJLy8gaWYgbWV0YWluZm8gaXMgcHJlc2VudCBmb3IgdGhpcyBhdHRyaWJ1dGUsIHVzZSB0aGUKLQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHRvIGRlcml2ZSBhIGRlc2NyaXB0b3IKLQkJCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJCQlpZiAoZkNhc2VTZW5zaXRpdmUpCi0JCQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyTWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0ckRlY2wgPSBudWxsOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyTWFwLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlpZiAoIWZDYXNlU2Vuc2l0aXZlICYmIGF0dHJNYXAuaXRlbShqKS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShqKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGJlIGNvbnNpc3RlbnQ6IGlmIHRoZXJlJ3MgbWV0YWluZm8sIHVzZSAqdGhhdCogYXMgdGhlCi0JCQkJLy8gZGVzY3JpcHRvciBJRAotCQkJCWlmIChhdHRyRGVjbCAhPSBudWxsKSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJbmFtZXMuYWRkKGF0dHJEZWNsLmdldE5vZGVOYW1lKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVzY3JpcHRvciA9IGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ci5nZXROYW1lKCkpOwotCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJbmFtZXMuYWRkKGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQkJZGVzY3JpcHRvckxpc3QuYWRkKGRlc2NyaXB0b3IpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGRlc2NyaXB0b3JzIGZyb20gdGhlIG1ldGFpbmZvIHRoYXQgYXJlIG5vdCB5ZXQgbGlzdGVkCi0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5pdGVtKGkpOwotCQkJCWlmICghbmFtZXMuY29udGFpbnMoYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSkpIHsKLQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBob2xkRGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCWlmIChob2xkRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQlkZXNjcmlwdG9yTGlzdC5hZGQoaG9sZERlc2NyaXB0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSVByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbZGVzY3JpcHRvckxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykKLQkJCWRlc2NyaXB0b3JzW2ldID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpIGRlc2NyaXB0b3JMaXN0LmdldChpKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSwgYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoZ2V0Q2F0ZWdvcnkoYXR0ckRlY2wpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihhdHRyRGVjbC5nZXRBdHRyTmFtZSgpKTsKLQkJaWYgKGF0dHJEZWNsLmdldFVzYWdlKCkgIT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCAmJiBmU2V0RXhwZXJ0RmlsdGVyKQotCQkJZGVzY3JpcHRvci5zZXRGaWx0ZXJGbGFncyhuZXcgU3RyaW5nW117SVByb3BlcnR5U2hlZXRFbnRyeS5GSUxURVJfSURfRVhQRVJUfSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENhdGVnb3J5KENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCWlmIChhdHRyRGVjbC5zdXBwb3J0cygiY2F0ZWdvcnkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIChTdHJpbmcpIGF0dHJEZWNsLmdldFByb3BlcnR5KCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZlNob3VsZERlcml2ZUNhdGVnb3JpZXMgJiYgYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsICYmIGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsICYmIGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXR1cm4gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ0FURUdPUllfQVRUUklCVVRFUzsKLQl9Ci0KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlpZiAoZk5vZGUgPT0gbnVsbCB8fCBmTm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZk5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIGZOb2RlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGlzIE5vZGUgdGhhdCBjYW4gYmUgZWRpdHRlZCBpbiBhIHByb3BlcnR5IHNoZWV0LgotCSAqIAotCSAqIEByZXR1cm4gYSB2YWx1ZSB0aGF0IGNhbiBiZSBlZGl0dGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMuCi0JICogCi0JICogQHJldHVybiBhbGwgdmFsaWQgZGVzY3JpcHRvcnMuCi0JICovCi0JcHVibGljIGZpbmFsIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlpZiAoZkRlc2NyaXB0b3JzID09IG51bGwgfHwgZkRlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKSB7Ci0JCQlmRGVzY3JpcHRvcnMgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIGZEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgbmFtZWQgcHJvcGVydHkuCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0KSB7Ci0JCVN0cmluZyBuYW1lID0gbmFtZU9iamVjdC50b1N0cmluZygpOwotCQlTdHJpbmcgcmV0dXJuZWRWYWx1ZSA9IG51bGw7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQlOb2RlIGF0dHJpYnV0ZSA9IGF0dHJNYXAuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIElET01Ob2RlKQotCQkJCQlyZXR1cm5lZFZhbHVlID0gKChJRE9NTm9kZSkgYXR0cmlidXRlKS5nZXRWYWx1ZVNvdXJjZSgpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuZWRWYWx1ZSA9IGF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLQkJCX0KLQkJfQotCQlpZiAocmV0dXJuZWRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuZWRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXR1cm5lZFZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VmFsaWRWYWx1ZXMoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCi0JCVN0cmluZ1tdIHZhbGlkVmFsdWVzID0gbnVsbDsKLQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCk7Ci0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQl2YWxpZFZhbHVlcyA9IF9nZXRWYWxpZFN0cmluZ3MoYXR0ckRlY2wsIGF0dHJUeXBlKTsKLQkJCWlmIChmU29ydEVudW1lcmF0ZWRWYWx1ZXMpCi0JCQkJQXJyYXlzLnNvcnQodmFsaWRWYWx1ZXMpOwotCQl9Ci0JCWlmICh2YWxpZFZhbHVlcyA9PSBudWxsKQotCQkJdmFsaWRWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOwotCQlyZXR1cm4gdmFsaWRWYWx1ZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVJlbW92YWJsZShPYmplY3QgaWQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVJlc2V0dGFibGUoT2JqZWN0IGlkKSB7Ci0JCWJvb2xlYW4gcmVzZXR0YWJsZSA9IGZhbHNlOwotCQlTdHJpbmcgcHJvcGVydHkgPSBpZC50b1N0cmluZygpOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyRGVjbHMgPSBudWxsOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJEZWNscyA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJfQotCi0JCWlmIChhdHRyRGVjbHMgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyRGVjbHMuZ2V0TmFtZWRJdGVtKHByb3BlcnR5KTsKLQkJCWlmIChhdHRyRGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgewotCQkJCQlDTURhdGFUeXBlIGhlbHBlciA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCk7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FICYmIGhlbHBlci5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNldHRhYmxlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzZXR0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IHZhbHVlIGhhcyBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMKLQkgKiAgICAgICAgIGNoYW5nZWQgZnJvbSBpdHMgb3JpZ2luYWwgZGVmYXVsdCB2YWx1ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgcHJvcGVydHlPYmplY3QpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gcHJvcGVydHlPYmplY3QudG9TdHJpbmcoKTsKLQotCQlOYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkKLQkJCXJldHVybiBhdHRyTWFwLmdldE5hbWVkSXRlbShwcm9wZXJ0eSkgIT0gbnVsbDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlIGZyb20gdGhlIE5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3QgcHJvcGVydHlPYmplY3QpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCU5vZGUgYXR0cmlidXRlID0gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHlPYmplY3QudG9TdHJpbmcoKSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhdHRyTWFwLnJlbW92ZU5hbWVkSXRlbShwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChlLmNvZGUgIT0gRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUikgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5J3MgdmFsdWUgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eU9iamVjdCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyRGVjbHMgPSBudWxsOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJEZWNscyA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ckRlY2xzICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShwcm9wZXJ0eSk7Ci0JCQlTdHJpbmcgZGVmVmFsdWUgPSBudWxsOwotCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCUNNRGF0YVR5cGUgaGVscGVyID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJCQkJaWYgKGhlbHBlci5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUgJiYgaGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpCi0JCQkJCQlkZWZWYWx1ZSA9IGhlbHBlci5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGVmVmFsdWUgIT0gbnVsbCAmJiBkZWZWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkoKEF0dHIpIGF0dHJNYXAuZ2V0TmFtZWRJdGVtKHByb3BlcnR5KSkuc2V0VmFsdWUoZGVmVmFsdWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYXR0ck1hcC5yZW1vdmVOYW1lZEl0ZW0ocHJvcGVydHkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYXR0ck1hcC5yZW1vdmVOYW1lZEl0ZW0ocHJvcGVydHkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZWQgcHJvcGVydHkgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWVPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkvLyBBdm9pZCBjeWNsaW5nIC0gY2FuIGhhcHBlbiBpZiBhIGNsb3NpbmcgY2VsbCBlZGl0b3IgY2F1c2VzIGEKLQkJLy8gcmVmcmVzaAotCQkvLyBvbiB0aGUgUHJvcGVydHlTaGVldCBwYWdlIGFuZCB0aGUgc2V0SW5wdXQgYWdhaW4gYXNrcyB0aGUgZWRpdG9yIHRvCi0JCS8vIGNsb3NlOyBiZXNpZGVzLCB3aHkgYXBwbHkgdGhlIHNhbWUgdmFsdWUgdHdpY2U/Ci0JCWlmICghZlZhbHVlc0JlaW5nU2V0LmlzRW1wdHkoKSAmJiBmVmFsdWVzQmVpbmdTZXQucGVlaygpID09IG5hbWVPYmplY3QpCi0JCQlyZXR1cm47Ci0JCWZWYWx1ZXNCZWluZ1NldC5wdXNoKG5hbWVPYmplY3QpOwotCQlTdHJpbmcgbmFtZSA9IG5hbWVPYmplY3QudG9TdHJpbmcoKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQl2YWx1ZVN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQl0cnkgewotCQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRyTWFwLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCS8vIEVYSVNUSU5HIFZBTFVFCi0JCQkJCS8vIHBvdGVudGlhbCBvdXQgb2YgY29udHJvbCBsb29wIGlmIHVwZGF0aW5nIHRoZSB2YWx1ZQotCQkJCQkvLyB0cmlnZ2VycyBhIHZpZXdlciB1cGRhdGUsIGZvcmNpbmcgdGhlCi0JCQkJCS8vIGFjdGl2ZSBjZWxsIGVkaXRvciB0byBzYXZlIGl0cyB2YWx1ZSBhbmQgY2F1c2luZyB0aGUKLQkJCQkJLy8gbG9vcCB0byBjb250aW51ZQotCQkJCQlpZiAoYXR0ci5nZXRWYWx1ZSgpID09IG51bGwgfHwgIWF0dHIuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWVTdHJpbmcpKSB7Ci0JCQkJCQlpZiAoYXR0ciBpbnN0YW5jZW9mIElET01Ob2RlKQotCQkJCQkJCSgoSURPTU5vZGUpIGF0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlU3RyaW5nKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlhdHRyLnNldFZhbHVlKHZhbHVlU3RyaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gTkVXKD8pIHZhbHVlCi0JCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7IC8vIG5ldmVyIGNyZWF0ZSBhbiBlbXB0eSBhdHRyaWJ1dGUKLQkJCQkJCUF0dHIgbmV3QXR0ciA9IGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJCQlpZiAobmV3QXR0ciBpbnN0YW5jZW9mIElET01Ob2RlKQotCQkJCQkJCSgoSURPTU5vZGUpIG5ld0F0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlU3RyaW5nKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQluZXdBdHRyLnNldFZhbHVlKHZhbHVlU3RyaW5nKTsKLQkJCQkJCWF0dHJNYXAuc2V0TmFtZWRJdGVtKG5ld0F0dHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGZOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQkoKEVsZW1lbnQpIGZOb2RlKS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWVTdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCURpc3BsYXkgZCA9IGdldERpc3BsYXkoKTsKLQkJCWlmIChkICE9IG51bGwpCi0JCQkJZC5iZWVwKCk7Ci0JCX0KLQkJZlZhbHVlc0JlaW5nU2V0LnBvcCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBmRGVzY3JpcHRvcnMubGVuZ3RoID09IDApCi0JCQkvLyBOb3RoaW5nIHRvIHVwZGF0ZQotCQkJcmV0dXJuOwotCi0JCS8vIExpc3Qgb2YgYWxsIG5hbWVzIGVuY291bnRlcmVkIGluIHRoZSB0YWcgYW5kIGRlZmluZWQgYnkgdGhlIGVsZW1lbnQKLQkJTGlzdCBkZWNsYXJlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBOZXcgZGVzY3JpcHRvciBsaXN0IHRoYXQgd2lsbCBiZWNvbWUgZkRlc2NyaXB0b3JzIGFmdGVyIGFsbAotCQkvLyBwcm9jZXNzaW5nIGlzIGRvbmUKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTmFtZXMgb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBhYm92ZSBMaXN0Ci0JCUxpc3QgZGVzY3JpcHRvck5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFVwZGF0ZSBhbnkgZGVzY3JpcHRvcnMgZGVyaXZlZCBmcm9tIHRoZSBtZXRhaW5mbwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBudWxsOwotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJYXR0ck1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJfQotCQkvLyBVcGRhdGUgZXhpdGluZyBkZXNjcmlwdG9yczsgbm90IGFkZGVkIHRvIHRoZSBmaW5hbCBsaXN0IGhlcmUKLQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJLy8gVXBkYXRlIGV4aXN0aW5nIGRlc2NyaXB0b3IgdHlwZXMgYmFzZWQgb24gbWV0YWluZm8KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyTWFwLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQlpZiAoIWRlY2xhcmVkTmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCWRlY2xhcmVkTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmRGVzY3JpcHRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJYm9vbGVhbiBzYW1lTmFtZSA9IChmQ2FzZVNlbnNpdGl2ZSAmJiBmRGVzY3JpcHRvcnNbal0uZ2V0SWQoKS5lcXVhbHMoYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKSkpIHx8ICghZkNhc2VTZW5zaXRpdmUgJiYgYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZkRlc2NyaXB0b3JzW2pdLmdldElkKCkudG9TdHJpbmcoKSkpOwotCQkJCQlpZiAoc2FtZU5hbWUpIHsKLQkJCQkJCVN0cmluZ1tdIHZhbGlkVmFsdWVzID0gZ2V0VmFsaWRWYWx1ZXMoYXR0ckRlY2wpOwotCQkJCQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzCi0JCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIChvbmx5IGVudW1lcmF0ZWQgdmFsdWVzIGdldAotCQkJCQkJLy8gdXBkYXRlZCBmb3Igbm93KQotCQkJCQkJaWYgKGZEZXNjcmlwdG9yc1tqXSBpbnN0YW5jZW9mIEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCQkJCQkoKEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IpIGZEZXNjcmlwdG9yc1tqXSkudXBkYXRlVmFsdWVzKHZhbGlkVmFsdWVzKTsKLQkJCQkJCX0KLQkJCQkJCS8vIFJlcGxhY2Ugd2l0aCBiZXR0ZXIgZGVzY3JpcHRvcgotCQkJCQkJZWxzZSBpZiAodmFsaWRWYWx1ZXMgIT0gbnVsbCAmJiB2YWxpZFZhbHVlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZkRlc2NyaXB0b3JzW2pdID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFVwZGF0ZSBleGlzdGluZyBkZXNjcmlwdG9ycyBiYXNlZCBvbiBub3QgaGF2aW5nIGFueSBtZXRhaW5mbwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmRGVzY3JpcHRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkvLyBSZXBsYWNlIHdpdGggYmFzaWMgZGVzY3JpcHRvcgotCQkJCWlmICghKGZEZXNjcmlwdG9yc1tqXSBpbnN0YW5jZW9mIFRleHRQcm9wZXJ0eURlc2NyaXB0b3IpKSB7Ci0JCQkJCWZEZXNjcmlwdG9yc1tqXSA9IGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoKFN0cmluZykgZkRlc2NyaXB0b3JzW2pdLmdldElkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCi0JCS8vIFJlbW92ZSBkZXNjcmlwdG9ycyBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBwcmVzZW50IEFORCBhcmVuJ3QKLQkJLy8ga25vd24gdGhyb3VnaCBtZXRhaW5mbywKLQkJLy8gZG8gdGhpcyBieSBvbmx5IHJldXNpbmcgZXhpc3RpbmcgZGVzY3JpcHRvcnMgZm9yIGF0dHJpYnV0ZXMgdGhhdAotCQkvLyBhcmUgcHJlc2VudCBvciBkZWNsYXJlZAotCQlmb3IgKGludCBpID0gMDsgaSA8IGZEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZEZXNjcmlwdG9yc1tpXSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGRlc2NyaXB0b3JOYW1lID0gZkRlc2NyaXB0b3JzW2ldLmdldElkKCkudG9TdHJpbmcoKTsKLQkJCQlpZiAoKGRlY2xhcmVkTmFtZXMuY29udGFpbnMoZGVzY3JpcHRvck5hbWUpIHx8IChhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShkZXNjcmlwdG9yTmFtZSkgIT0gbnVsbCkpICYmICFkZXNjcmlwdG9yTmFtZXMuY29udGFpbnMoZGVzY3JpcHRvck5hbWUpKSB7Ci0JCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoZGVzY3JpcHRvck5hbWUpOwotCQkJCQlkZXNjcmlwdG9ycy5hZGQoZkRlc2NyaXB0b3JzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgZGVzY3JpcHRvcnMgZm9yIGRlY2xhcmVkIGF0dHJpYnV0ZXMgdGhhdCBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCS8vIFVwZGF0ZSBleGlzdGluZyBkZXNjcmlwdG9yIHR5cGVzIGJhc2VkIG9uIG1ldGFpbmZvCi0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5pdGVtKGkpOwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCQkJaWYgKGZDYXNlU2Vuc2l0aXZlKSB7Ci0JCQkJCWlmICghZGVzY3JpcHRvck5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvck5hbWVzLnNpemUoKTsgaisrKQotCQkJCQkJZXhpc3RzID0gKGRlc2NyaXB0b3JOYW1lcy5nZXQoaikudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgfHwgZXhpc3RzOwotCQkJCQlpZiAoIWV4aXN0cykgewotCQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBkZXNjcmlwdG9ycyBmb3IgZXhpc3RpbmcgYXR0cmlidXRlcyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJCWlmIChmQ2FzZVNlbnNpdGl2ZSkgewotCQkJCQlpZiAoIWRlc2NyaXB0b3JOYW1lcy5jb250YWlucyhhdHRyTmFtZSkpIHsKLQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ck5hbWUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yTmFtZXMuc2l6ZSgpOyBqKyspCi0JCQkJCQlleGlzdHMgPSAoZGVzY3JpcHRvck5hbWVzLmdldChqKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB8fCBleGlzdHM7Ci0JCQkJCWlmICghZXhpc3RzKSB7Ci0JCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCWRlc2NyaXB0b3JzLmFkZChjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJOYW1lKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBVcGRhdGUgZkRlc2NyaXB0b3JzCi0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBuZXdEZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2Rlc2NyaXB0b3JzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0JCQluZXdEZXNjcmlwdG9yc1tpXSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCWZEZXNjcmlwdG9ycyA9IG5ld0Rlc2NyaXB0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9JRE9NU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMThiMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5Ob2RlTG9jYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scyBleHRlbmRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgVzNDIERPTSBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gRG9jdW1lbnQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGNvcnJlc3BvbmRpbmcKLQkgKiAgICAgICAgIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0Ci0JICovCi0JRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFczQyBET00gTm9kZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gdGhlIElEb2N1bWVudAotCSAqIEByZXR1cm4gYSBOb2RlIGF0IHRoYXQgbG9jYXRpb24sIGlmIG9uZSBpcyBwcmVzZW50Ci0JICogCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGZvciBpbnZhbGlkIG9mZnNldHMKLQkgKi8KLQlOb2RlIGdldE5vZGUoaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhIE5vZGVMb2NhdGlvbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gaW5mb3JtYXRpb24gb2YKLQkgKiB0aGUgTm9kZSdzIHN0YXJ0IGFuZCBlbmQgdGFncy4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGhlIE5vZGVMb2NhdGlvbiBmb3IgdGhpcyBOb2RlLCBudWxsIGZvciB1bnN1cHBvcnRlZCBOb2RlCi0JICogICAgICAgICBpbnN0YW5jZXMuCi0JICovCi0JTm9kZUxvY2F0aW9uIGdldE5vZGVMb2NhdGlvbihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBzZXJ2ZXItc2lkZSBwYWdlIGxhbmd1YWdlIGZvciB0aGUgRG9jdW1lbnQgb2YgdGhlCi0JICogZ2l2ZW4gTm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzZXJ2ZXItc2lkZSBwYWdlIGxhbmd1YWdlIGZvciB0aGlzIG5vZGVtIG51bGwgZm9yIE5vZGVzCi0JICogICAgICAgICB3aXRoaW4gdW5zdXBwb3J0ZWQgRG9jdW1lbnRzLgotCSAqLwotCVN0cmluZyBnZXRQYWdlTGFuZ3VhZ2UoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFJldHVybnMgc3RhcnQgb2Zmc2V0IG9mIGdpdmVuIE5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHczYyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQgb3IgLTEgZm9yIHVuc3VwcG9ydGVkIE5vZGVzCi0JICovCi0JaW50IGdldFN0YXJ0T2Zmc2V0KE5vZGUgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvWE1MU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1hNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5Y2NjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvWE1MU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5Ob2RlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEltcGxlbWVudHMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGltcGxlbWVudHMgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMsIElOb2RlQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTm9kZUxvY2F0aW9uSW1wbCBpbXBsZW1lbnRzIE5vZGVMb2NhdGlvbiB7Ci0JCXByaXZhdGUgSURPTU5vZGUgbm9kZTsKLQotCQlwdWJsaWMgTm9kZUxvY2F0aW9uSW1wbChJRE9NTm9kZSB4bWxub2RlKSB7Ci0JCQlzdXBlcigpOwotCQkJbm9kZSA9IHhtbG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEVuZFRhZ0VuZE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpCi0JCQkJcmV0dXJuIG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEVuZFRhZ1N0YXJ0T2Zmc2V0KCkgewotCQkJaWYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTdGFydFRhZ0VuZE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTdGFydFRhZ1N0YXJ0T2Zmc2V0KCkgewotCQkJaWYgKG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCXJldHVybiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGZUZXh0RWRpdG9yID0gbnVsbDsKLQotCXB1YmxpYyBpbnQgZ2V0Q2FyZXRPZmZzZXQoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyIHN0diA9IGZUZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHN0diAhPSBudWxsICYmIHN0di5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCAmJiAhc3R2LmdldFRleHRXaWRnZXQoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBzdHYud2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KHN0di5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoKSB7Ci0JCXJldHVybiAoRG9jdW1lbnQpIGZUZXh0RWRpdG9yLmdldE1vZGVsKCkuZ2V0QWRhcHRlcihEb2N1bWVudC5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiBJZiBzaW1pbGFyIGZ1bmN0aW9uIGlzIG5lZWRlZCwgY29tcG9zaXRlIGl0IGFyb3VuZCB0aGUgdGV4dCBlZGl0b3IncwotCSAqIGluc3RhbmNlLiBSZW1vdmVkIGFsc28gYmVjYXVzZSBpdCByZXR1cm5zIGFuIGFscmVhZC1yZWxlYXNlZCBtb2RlbAotCSAqIAotCSAqIHB1YmxpYyBEb2N1bWVudCBnZXRET01Eb2N1bWVudChJTWFya2VyIG1hcmtlcikgeyBpZiAobWFya2VyID09IG51bGwpCi0JICogcmV0dXJuIG51bGw7Ci0JICogCi0JICogSVJlc291cmNlIHJlcyA9IG1hcmtlci5nZXRSZXNvdXJjZSgpOyBpZiAocmVzID09IG51bGwgfHwgIShyZXMKLQkgKiBpbnN0YW5jZW9mIElGaWxlKSkgcmV0dXJuIG51bGw7Ci0JICogCi0JICogSU1vZGVsTWFuYWdlciBtbSA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JICogSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7IHRyeSB7IG1vZGVsID0KLQkgKiBtbS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCgoSUZpbGUpIHJlcyk7IGlmIChtb2RlbCA9PSBudWxsIHx8ICEobW9kZWwKLQkgKiBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHJldHVybiBudWxsOwotCSAqIAotCSAqIHJldHVybiAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7IH0gZmluYWxseSB7IGlmIChtb2RlbCAhPQotCSAqIG51bGwpIG1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOyB9IH0KLQkgKi8KLQotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3IuZ2V0RWRpdG9yUGFydCgpOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5vZGUoaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKDAgPD0gb2Zmc2V0ICYmIG9mZnNldCA8PSBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpKSB7Ci0JCQlub2RlID0gKE5vZGUpIGZUZXh0RWRpdG9yLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuU291cmNlRWRpdGluZ1RleHRUb29scyNnZXROb2RlTG9jYXRpb24ob3JnLnczYy5kb20uTm9kZSkKLQkgKi8KLQlwdWJsaWMgTm9kZUxvY2F0aW9uIGdldE5vZGVMb2NhdGlvbihOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0JCQlyZXR1cm4gbmV3IE5vZGVMb2NhdGlvbkltcGwoKElET01Ob2RlKSBub2RlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlTGFuZ3VhZ2UoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoSVRleHRTZWxlY3Rpb24pIGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogSUV4dGVuZGVkTWFya3VwRWRpdG9yIG1ldGhvZAotCSAqLwotCS8vIHB1YmxpYyBMaXN0IGdldFNlbGVjdGVkTm9kZXMoKSB7Ci0JLy8gVmlld2VyU2VsZWN0aW9uTWFuYWdlciB2c20gPSBnZXRWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0JLy8gcmV0dXJuICh2c20gIT0gbnVsbCkgPyB2c20uZ2V0U2VsZWN0ZWROb2RlcygpIDogbnVsbDsKLQkvLyB9Ci0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCAhKG5vZGUgaW5zdGFuY2VvZiBJRE9NVGV4dCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbm9kZSA9ICgoSURPTVRleHQpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXJldHVybiBmbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvcmUuSU5vZGVBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcy5lcXVhbHModHlwZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29yZS5JTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29yZS5JTm9kZU5vdGlmaWVyLAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dEVkaXRvcihTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJZlRleHRFZGl0b3IgPSBlZGl0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YjlkZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5ET01PYnNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MIGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0KLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCS8vIGFkZCB0aGUgbm9ybWFsIGNvbnRlbnQgYmFzZWQgZmFjdG9yaWVzIHRvIG1vZGVsJ3MgcmVnaXN0cnkKLQkJYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkJZmFjdG9yeSA9IGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IG5ldyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSgpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQotCQkvLyBjcy4uLiBhZGRlZCBmb3IgaW5mZXJyZWQgZ3JhbW1hciBzdXBwb3J0Ci0JCS8vCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCUNNRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQlpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQkJYm9vbGVhbiB1c2VJbmZlcnJlZEdyYW1tYXIgPSAoc3RvcmUgIT0gbnVsbCkgPyBzdG9yZS5nZXRCb29sZWFuKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSKSA6IHRydWU7Ci0KLQkJCQkJZG9jdW1lbnRNYW5hZ2VyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BU1lOQ19MT0FELCB0cnVlKTsKLQkJCQkJZG9jdW1lbnRNYW5hZ2VyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQsIGZhbHNlKTsKLQkJCQkJZG9jdW1lbnRNYW5hZ2VyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSwgdHJ1ZSk7Ci0JCQkJCURPTU9ic2VydmVyIGRvbU9ic2VydmVyID0gbmV3IERPTU9ic2VydmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQkJCWRvbU9ic2VydmVyLnNldEdyYW1tYXJJbmZlcmVuY2VFbmFibGVkKHVzZUluZmVycmVkR3JhbW1hcik7Ci0JCQkJCWRvbU9ic2VydmVyLmluaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjaXNGb3Iob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JYTUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGYyZWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZXRzIHVwIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGZvciB4bWwgZmluZCBvY2N1cnJlbmNlcyBwcm9jZXNzb3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlYTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBYTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChodG1sUHJvY2Vzc29yKTsKLQkJfQotCQlyZXR1cm4gZlByb2Nlc3NvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTBjMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIENvbmZpZ3VyZXMgYSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3Igd2l0aCBYTUwgcGFydGl0aW9ucyBhbmQgcmVnaW9ucwotICovCi1wdWJsaWMgY2xhc3MgWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVH07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlZ2lvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUV9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWZhYzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCQkKLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmIChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWIzODVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlvZmZzZXQgPSAwOwotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIG9mZnNldCk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbjIoaW5kZXhlZFJlZ2lvbiwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIHNlcGFyYXRlZCBvdXQgZnJvbSBnZXROZXdTZWxlY3Rpb25SZWdpb24yIGJlY2F1c2UgdGhlCi0JICogY29kZSBpbiBoZXJlIGlzIGFsbG93ZWQgdG8gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleGVkUmVnaW9uCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIG5ldyByZWdpb24gdG8gc2VsZWN0IG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbjIoSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCQkJTm9kZSBuZXdOb2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCW5ld05vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJCQkJaWYgKG5ld05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbjIobmV3SW5kZXhlZFJlZ2lvbiwgbmV3IFRleHRTZWxlY3Rpb24obmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYjIwNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24sIG5ldyBUZXh0U2VsZWN0aW9uKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0MDg2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN5bWJvbGljIG5hbWUgb2Ygc3R5bGVzIHVzZWQgYnkgTGluZVN0eWxlUHJvdmlkZXIsCi0gKiBDb2xvck1hbmFnZXIsIGFuZCBhbnkgb3RoZXJzIHdobyBtYXkgYmUgaW50ZXJlc3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c1hNTCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0JPUkRFUiA9ICJjZGF0YUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1RFWFQgPSAiY2RhdGFUZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9CT1JERVIgPSAiY29tbWVudEJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfVEVYVCA9ICJjb21tZW50VGV4dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xfQk9SREVSID0gImRlY2xCb2RlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSUQgPSAiZG9jdHlwZUV4dGVybmFsSWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiA9ICJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiA9ICJkb2N0eXBlRXh0cmVuYWxTeXNyZWYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX05BTUUgPSAiZG9jdHlwZU5hbWUiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CT1JERVIgPSAicGlCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DT05URU5UID0gInBpQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURV9FUVVBTFMgPSAidGFnQXR0cmlidXRlRXF1YWxzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSSUJVVEVfTkFNRSA9ICJ0YWdBdHRyaWJ1dGVOYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURV9WQUxVRSA9ICJ0YWdBdHRyaWJ1dGVWYWx1ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19CT1JERVIgPSAidGFnQm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAidGFnTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT05URU5UID0gInhtbENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmE2MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qKgotCQkgKiBhIG1ldGhvZCB0byBjZW50cmFsaXplIGFsbCB0aGUgImZvcm1hdCBydWxlcyIgZm9yIHJlZ2lvbnMKLQkJICogc3BlY2lmaWNhbGx5IGFzc29jaWF0ZWQgZm9yIGhvdyB0byAib3BlbiIgdGhlIHJlZ2lvbi4KLQkJICovCi0JCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGNvbWluZyB0aHJvdWdoIG51bGwsIGJ1dCBqdXN0IHRvIGNhdGNoIGl0Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0gZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJfSBlbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCX0gZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJfSBlbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX05BTUUpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5UKTsKLQkJfSBlbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCX0gZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRikgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU0pIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJLy8gd2hpdGUgc3BhY2UgaXMgbm9ybWFsbCBub3Qgb24gaXRzIG93biAuLi4gYnV0IHdoZW4gaXQgaXMsIHdlJ2xsCi0JCQkvLyB0cmVhdCBhcyBjb250ZW50Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0gZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSkpIHsKLQkJCS8vIHdlIG1heSB3YW50IHRvIGNoYXJhY3RlciBhbmQgZW50aXR5IHJlZmVyZW5jZXMgdG8gaGF2ZSBpdCBvd24KLQkJCS8vIGNvbG9yIGluIGZ1dHVyZSwKLQkJCS8vIGJ1dCBmb3Igbm93LCB3ZSdsbCBtYWtlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBkZWZhdWx0LCByZXR1cm4gbnVsbCB0byBzaWduYWwgIm5vdCBoYW5kbGVkIgotCQkJLy8gaW4gd2hpY2ggY2FzZSwgb3RoZXIgZmFjdG9yaWVzIHNob3VsZCBiZSB0cmllZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVDsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVI7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQ7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRDsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5UOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRleHQgYXR0cmlidXRlcyBpbnRvIG1hcC4gTWFrZSBzdXJlIG1hcCBpcyBjbGVhcmVkIGJlZm9yZSBjYWxsaW5nCi0JICogdGhpcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9NYXJrdXBUYWdJbmZvUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL01hcmt1cFRhZ0luZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU1M2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL01hcmt1cFRhZ0luZm9Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFByb3ZpZGVzIGJhc2ljIHRhZyBpbmZvcm1hdGlvbiBzdWNoIGFzIGVsZW1lbnQvYXR0cmlidXRlIG5hbWUsIGRhdGEgdHlwZSwKLSAqIGFuZCB0YWcgaW5mby9kb2N1bWVudGF0aW9uIGZvciBDTU5vZGVzLiBVc2VzIEhUTUwgdG8gZW5oYW5jZSBwcmVzZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPTERfRU5EID0gIjwvYj4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9MRF9TVEFSVCA9ICI8Yj4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBRElOR19FTkQgPSAiPC9oNT4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBRElOR19TVEFSVCA9ICI8aDU+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfQkVHSU4gPSAiPHVsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX0VMRU1FTlQgPSAiPGxpPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBORVdfTElORSA9ICI8ZGw+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9FTkQgPSAiPC9wPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBQQVJBR1JBUEhfU1RBUlQgPSAiPHA+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIGJhc2ljIHRhZyBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheSBnaXZlbiBhIENNTm9kZQotCSAqICAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mbyhDTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gd2UgYXNzdW1lIHRoYXQgaWYgdGhlcmUgaXMgdGFnSW5mbyBwcmVzZW50LCBvbmx5IGRpc3BsYXkgdGFnSW5mbwotCQlwcmludFRhZ0luZm8oc2IsIG5vZGUpOwotCi0JCS8vIG5vIHRhZ0luZm8gcHJlc2VudCwgc28gdHJ5IHRvIGRpc3BsYXkgdGFnIGRlc2NyaXB0aW9uCi0JCWlmIChzYi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwcmludERlc2NyaXB0aW9uKHNiLCBub2RlKTsKLQkJfQotCi0JCS8vIG5vIHRhZyBkZXNjcmlwdGlvbiBwcmVzZW50IGVpdGhlciwgc28gZGlzcGxheSBkZWZhdWx0IGluZm8KLQkJaWYgKHNiLmxlbmd0aCgpID09IDApIHsKLQkJCXByaW50RGVmYXVsdEluZm8obm9kZSwgc2IpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBkYXRhVHlwZSdzIGRhdGEgdHlwZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGVudW1lcmF0ZWQgdHlwZSB2YWx1ZXMKLQkgKiB0byBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGF0YVR5cGVJbmZvKFN0cmluZ0J1ZmZlciBzYiwgQ01EYXRhVHlwZSBkYXRhVHlwZSkgewotCQlTdHJpbmcgZGF0YVR5cGVOYW1lID0gZGF0YVR5cGUuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKChkYXRhVHlwZU5hbWUgIT0gbnVsbCkgJiYgKGRhdGFUeXBlTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRGF0YV9UeXBlX19fXzQgKyBTUEFDRSArIEJPTERfRU5EKTsKLQkJCXNiLmFwcGVuZChkYXRhVHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JCVN0cmluZ1tdIGVudW1lcmF0ZWRWYWx1ZSA9IGRhdGFUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJaWYgKGVudW1lcmF0ZWRWYWx1ZSAhPSBudWxsICYmIGVudW1lcmF0ZWRWYWx1ZS5sZW5ndGggPiAwKSB7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRW51bWVyYXRlZF9WYWx1ZXNfX19fNSArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKExJU1RfQkVHSU4pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtZXJhdGVkVmFsdWUubGVuZ3RoOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTElTVF9FTEVNRU5UICsgZW51bWVyYXRlZFZhbHVlW2ldKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGRlZmF1bHQgaW5mbyAoZWxlbWVudCBuYW1lLCBjb250ZW50IG1vZGVsLCBkYXRhIHR5cGUpIG9mCi0JICogQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVmYXVsdEluZm8oQ01Ob2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzYikgewotCQl7Ci0KLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbm9kZTsKLQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRWxlbWVudF9fX18xICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJaWYgKGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSBlZC5nZXREYXRhVHlwZSgpOwotCQkJCQlpZiAoZGF0YVR5cGUgIT0gbnVsbCkgewotCQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUNNRGVzY3JpcHRpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gYnVpbGRlci5idWlsZERlc2NyaXB0aW9uKG5vZGUpOwotCQkJCQlpZiAoKGRlc2NyaXB0aW9uICE9IG51bGwpICYmIChkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuQ29udGVudF9Nb2RlbF9fX18yICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJCQlzYi5hcHBlbmQoZGVzY3JpcHRpb24gKyBQQVJBR1JBUEhfRU5EKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9fX18zICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0JCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuREFUQV9UWVBFKSB7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkRhdGFfVHlwZV9fX180ICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVzY3JpcHRpb24oU3RyaW5nQnVmZmVyIHNiLCBDTU5vZGUgbm9kZSkgewotCQlTdHJpbmcgdGFnSW5mbyA9IChTdHJpbmcpIG5vZGUuZ2V0UHJvcGVydHkoImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhZ0luZm8gIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIHRhZ0luZm8udHJpbSgpICsgUEFSQUdSQVBIX0VORCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSB0YWcgZG9jdW1lbnRhdGlvbiBwcm9wZXJ0eSBvZiB0aGUgQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLAotCSAqIHNiCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnREb2N1bWVudGF0aW9uKFN0cmluZ0J1ZmZlciBzYiwgQ01Ob2RlIG5vZGUpIHsKLQkJQ01Ob2RlTGlzdCBub2RlTGlzdCA9IChDTU5vZGVMaXN0KSBub2RlLmdldFByb3BlcnR5KCJkb2N1bWVudGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKChub2RlTGlzdCAhPSBudWxsKSAmJiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQ01Eb2N1bWVudGF0aW9uIGRvY3VtZW50YXRpb24gPSAoQ01Eb2N1bWVudGF0aW9uKSBub2RlTGlzdC5pdGVtKGkpOwotCQkJCVN0cmluZyBkb2MgPSBkb2N1bWVudGF0aW9uLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBkb2MudHJpbSgpICsgUEFSQUdSQVBIX0VORCk7Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKE5FV19MSU5FKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHRhZyBpbmZvIHByb3BlcnR5IG9mIHRoZSBDTU5vZGUgdG8gdGhlIHN0cmluZyBidWZmZXIsIHNiCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRUYWdJbmZvKFN0cmluZ0J1ZmZlciBzYiwgQ01Ob2RlIG5vZGUpIHsKLQkJU3RyaW5nIHRhZ0luZm8gPSAoU3RyaW5nKSBub2RlLmdldFByb3BlcnR5KCJ0YWdJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhZ0luZm8gIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIHRhZ0luZm8udHJpbSgpICsgUEFSQUdSQVBIX0VORCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZmVlMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIFhNTCB0YWdzIChTaG93cyB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUluZm9ybWF0aW9uUHJvdmlkZXIsIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uI2dldEluZm9ybWF0aW9uMihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldFN1YmplY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODI1ZGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQWJzdHJhY3RIb3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogUHJvdmlkZXMgaG92ZXIgaGVscCBkb2N1bWVudGF0aW9uIGZvciB4bWwgdGFncwotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcgotICovCi1wdWJsaWMgY2xhc3MgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIE1hcmt1cFRhZ0luZm9Qcm92aWRlciBmSW5mb1Byb3ZpZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBYTUxUZXh0SG92ZXJQcm9jZXNzb3IuCi0JICovCi0JcHVibGljIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpIHsKLQkJLy8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHJlaXZlcyBkb2N1bWVudGF0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGhvdmVyIGhlbHAgcG9wdXAuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUhvdmVySGVscChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQlJbmRleGVkUmVnaW9uIHRyZWVOb2RlID0gQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKHRyZWVOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBub2RlID0gKE5vZGUpIHRyZWVOb2RlOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpCi0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdGV4dFZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY29tcHV0ZVJlZ2lvbkhlbHAodHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXJoZWxwIGJhc2VkIG9uIHJlZ2lvbgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGhvdmVyaGVscAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVJlZ2lvbkhlbHAoSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkKLQkJCXJlc3VsdCA9IGNvbXB1dGVUYWdOYW1lSGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQlyZXN1bHQgPSBjb21wdXRlVGFnQXR0TmFtZUhlbHAoKElET01Ob2RlKSB0cmVlTm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCXJlc3VsdCA9IGNvbXB1dGVUYWdBdHRWYWx1ZUhlbHAoKElET01Ob2RlKSB0cmVlTm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVRhZ0F0dE5hbWVIZWxwKElET01Ob2RlIHhtbG5vZGUsIElET01Ob2RlIHBhcmVudE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHhtbG5vZGUpOwotCQlTdHJpbmcgYXR0TmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHREZWNsID0gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihlbGVtZW50RGVjbCwgYXR0TmFtZSk7Ci0JCXJldHVybiBnZXRBZGRpdGlvbmFsSW5mbyhlbGVtZW50RGVjbCwgYXR0RGVjbCk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKHRoaXMgaXMgdGhlIHNhbWUgYXMKLQkgKiB0aGUgYXR0cmlidXRlIG5hbWUncyBoZWxwKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVRhZ0F0dFZhbHVlSGVscChJRE9NTm9kZSB4bWxub2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbih4bWxub2RlKTsKLQkJSVRleHRSZWdpb24gYXR0ck5hbWVSZWdpb24gPSBnZXRBdHRyTmFtZVJlZ2lvbih4bWxub2RlLCByZWdpb24pOwotCi0JCVN0cmluZyBhdHROYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChhdHRyTmFtZVJlZ2lvbik7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0RGVjbCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oZWxlbWVudERlY2wsIGF0dE5hbWUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dERlY2wpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgdGFnIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdOYW1lSGVscChJRE9NTm9kZSB4bWxub2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbih4bWxub2RlKTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50Tm9kZSk7Ci0JCXJldHVybiBnZXRBZGRpdGlvbmFsSW5mbyhwZWxlbWVudERlY2wsIGVsZW1lbnREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgY21ub2RlJ3MgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBob3ZlciBoZWxwIHBvcHVwLiBJZgotCSAqIG5vIGRvY3VtZW50YXRpb24gZXhpc3RzIGZvciBjbW5vZGUsIHRyeSBkaXNwbGF5aW5nIHBhcmVudE9yT3duZXIncwotCSAqIGRvY3VtZW50YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyBhbnkgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGZvciBjbW5vZGUuCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3BsYXkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbyhDTU5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlTdHJpbmcgYWRkbEluZm8gPSBudWxsOwotCi0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJYWRkbEluZm8gPSBnZXRJbmZvUHJvdmlkZXIoKS5nZXRJbmZvKGNtbm9kZSk7Ci0JCWlmIChhZGRsSW5mbyA9PSBudWxsICYmIHBhcmVudE9yT3duZXIgIT0gbnVsbCkKLQkJCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhwYXJlbnRPck93bmVyKTsKLQkJcmV0dXJuIGFkZGxJbmZvOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHJlZ2lvbiBvZiB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUKLQkgKiByZWdpb24KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0ck5hbWVSZWdpb24oSURPTU5vZGUgbm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKHJlZ2lvbik7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGkgPj0gMCkgewotCQkJbmFtZVJlZ2lvbiA9IG9wZW5SZWdpb25zLmdldChpLS0pOwotCQkJaWYgKG5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbmFtZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbmRpY2F0ZWQgYnkgYXR0cmlidXRlIG5hbWUgd2l0aGluCi0JICogZWxlbWVudERlY2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmcgYXR0TmFtZSkgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCVN0cmluZyBub3ByZWZpeE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0TmFtZSk7Ci0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0obm9wcmVmaXhOYW1lKTsKLQkJCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHROYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJEZWNsOwotCX0KLQotCS8qKgotCSAqIFJldHJlaXZlcyBDTUVsZW1lbnREZWNsYXJhdGlvbiBmb3IgZ2l2ZW4gbm9kZQotCSAqIAotCSAqIEByZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24gLSBDTUVsZW1lbnREZWNsYXJhdGlvbiBvZiBub2RlIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgcG9zc2libGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlpZiAoKGhvdmVyUmVnaW9uID09IG51bGwpIHx8ICh2aWV3ZXIgPT0gbnVsbCkgfHwgKHZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGRpc3BsYXlUZXh0ID0gbnVsbDsKLQkJaW50IGRvY3VtZW50T2Zmc2V0ID0gaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWRpc3BsYXlUZXh0ID0gY29tcHV0ZUhvdmVySGVscCh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQotCQlyZXR1cm4gZGlzcGxheVRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9uIHRvIGhvdmVyIHRoZSB0ZXh0IG92ZXIgYmFzZWQgb24gdGhlIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAKLQkgKiBAcmV0dXJuIElSZWdpb24gcmVnaW9uIHRvIGhvdmVyIG92ZXIgaWYgb2Zmc2V0IGlzIHdpdGhpbiB0YWcgbmFtZSwKLQkgKiAgICAgICAgIGF0dHJpYnV0ZSBuYW1lLCBvciBhdHRyaWJ1dGUgdmFsdWUgYW5kIGlmIG9mZnNldCBpcyBub3Qgb3ZlcgotCSAqICAgICAgICAgaW52YWxpZCB3aGl0ZXNwYWNlLiBvdGhlcndpc2UsIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgodGV4dFZpZXdlciA9PSBudWxsKSB8fCAodGV4dFZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdGV4dFZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCi0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQl9Ci0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBvbmx5IHN1cHBseSBob3ZlcmhlbHAgZm9yIHRhZyBuYW1lLCBhdHRyaWJ1dGUgbmFtZSwgb3IKLQkJCS8vIGF0dHJpYnV0ZSB2YWx1ZQotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGF0IHdoaXRlc3BhY2UgYmVmb3JlIG9yIGFmdGVyIGxpbmUKLQkJCQkJSVJlZ2lvbiBsaW5lID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWlmICgob2Zmc2V0ID4gKGxpbmUuZ2V0T2Zmc2V0KCkpKSAmJiAob2Zmc2V0IDwgKGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpKSkpIHsKLQkJCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBpbiByZWdpb24ncyB0cmFpbGluZyB3aGl0ZXNwYWNlCi0JCQkJCQkvLyAod2hpdGVzcGFjZSBhZnRlciByZWxldmFudCBpbmZvKQotCQkJCQkJaWYgKG9mZnNldCA8IGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCQkJCXJldHVybiBuZXcgUmVnaW9uKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGlmIGVuYWJsZWQgZmxhZyBpcyBmYWxzZSwgZG9udCBjYWxsIGdldEhvdmVyUmVnaW9uIGluIHRoZQotCSAqICAgICAgICAgICAgIGZpcnN0IHBsYWNlIGlmIHRydWUsIHVzZSBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoKCFlbmFibGVkKSB8fCAodGV4dFZpZXdlciA9PSBudWxsKSB8fCAodGV4dFZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdGV4dFZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCi0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQl9Ci0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBvbmx5IHN1cHBseSBob3ZlcmhlbHAgZm9yIHRhZyBuYW1lLCBhdHRyaWJ1dGUgbmFtZSwgb3IKLQkJCS8vIGF0dHJpYnV0ZSB2YWx1ZQotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGF0IHdoaXRlc3BhY2UgYmVmb3JlIG9yIGFmdGVyIGxpbmUKLQkJCQkJSVJlZ2lvbiBsaW5lID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWlmICgob2Zmc2V0ID4gKGxpbmUuZ2V0T2Zmc2V0KCkpKSAmJiAob2Zmc2V0IDwgKGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpKSkpIHsKLQkJCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBpbiByZWdpb24ncyB0cmFpbGluZyB3aGl0ZXNwYWNlCi0JCQkJCQkvLyAod2hpdGVzcGFjZSBhZnRlciByZWxldmFudCBpbmZvKQotCQkJCQkJaWYgKG9mZnNldCA8IGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCQkJCXJldHVybiBuZXcgUmVnaW9uKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluZm9Qcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgZkluZm9Qcm92aWRlciBhbmQgaWYgZkluZm9Qcm92aWRlciB3YXMKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHNldCBmSW5mb1Byb3ZpZGVyIHRvIERlZmF1bHRJbmZvUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgTWFya3VwVGFnSW5mb1Byb3ZpZGVyIGdldEluZm9Qcm92aWRlcigpIHsKLQkJaWYgKGZJbmZvUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkluZm9Qcm92aWRlciA9IG5ldyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluZm9Qcm92aWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWIwNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwgZXh0ZW5kcyBTaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19UWVBFID0gZ2V0RW5jb2RpbmdUeXBlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmdUeXBlKCkgewotCQlyZXR1cm4gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW5jb2RpbmcgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwoKSB7Ci0JCXN1cGVyKEVOQ09ESU5HX1RZUEUsIFhNTFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXNfZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShUZW1wbGF0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjJmNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSBnZXRBbGwoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9IGdldEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFID0gZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9IGdldE5ldygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gZ2V0VGFnKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWxsKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2FsbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlX3ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfbmV3IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiAieG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUYWcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfdGFnIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2NmMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBYTUwgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIFhNTCBjb250ZW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlWE1MIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZVhNTCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZXh0L1hNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZXh0L1hNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViMzNkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dC5Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCi0JcHVibGljIFhNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JCXN1cGVyKG5ldyBTdHJpbmdbXXtET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UfSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1NoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDkzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09OU1RSQUlOT0ZGID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9DT05TVFJBSU5PRkY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTlNUUkFJTk9OID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9DT05TVFJBSU5PTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfUkxER1JNUiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfUkxER1JNUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfVkFMSURBVEUgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX1ZBTElEQVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PRkYgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0NPTlNUUkFJTk9GRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09OU1RSQUlOT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0NPTlNUUkFJTk9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9STERHUk1SID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9STERHUk1SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9WQUxJREFURSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfVkFMSURBVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BVFRSSUJVVEUgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DREFUQVNFQ1RJT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DREFUQVNFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DT01NRU5UID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RPQ1RZUEUgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRUxFTUVOVCA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTlRJVFkgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5USVRZX1JFRkVSRU5DRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX05PVEFUSU9OID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfTk9UQVRJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX01BQ1JPID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX01BQ1JPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVFhURVhUID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUOwotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZnJvbSB0aGUgeG1sIHNvdXJjZSBlZGl0b3IgcGx1Z2luJ3MgaW1hZ2UKLQkgKiByZWdpc3RyeS4gTm90ZTogVGhlIHJldHVybmVkIDxjb2RlPkltYWdlPC9jb2RlPiBpcyBtYW5hZ2VkIGJ5IHRoZQotCSAqIHdvcmtiZW5jaDsgY2xpZW50cyBtdXN0IDxiPm5vdCA8L2I+IGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBzeW1ib2xpY05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBpbWFnZTsgdGhlcmUgYXJlIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgICAgICAgICAgaW4gdGhpcyBjbGFzcyBmb3IgYnVpbGQtaW4gaW1hZ2VzIHRoYXQgY29tZSB3aXRoIHRoZSB4bWwKLQkgKiAgICAgICAgICAgIHNvdXJjZSBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKHN5bWJvbGljTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciBzcGVjaWZpZWQgaW1hZ2UgZnJvbSB0aGUgeG1sIHNvdXJjZQotCSAqIGVkaXRvciBwbHVnaW4ncyBpbWFnZSByZWdpc3RyeS4gVW5saWtlIDxjb2RlPkltYWdlPC9jb2RlPnMsIGltYWdlCi0JICogZGVzY3JpcHRvcnMgdGhlbXNlbHZlcyBkbyBub3QgbmVlZCB0byBiZSBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCi0JICogICAgICAgICAgICB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgaW1hZ2U7IHRoZXJlIGFyZSBjb25zdGFudHMgZGVjbGFyZWQKLQkgKiAgICAgICAgICAgIGluIHRoaXMgaW50ZXJmYWNlIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlIHhtbAotCSAqICAgICAgICAgICAgc291cmNlIGVkaXRvcgotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihzeW1ib2xpY05hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblJlc291cmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjQxZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgWE1MVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoKSBpbnN0ZWFkCi0gKi8KLS8qKgotICogVGhpcyBjbGFzcyBleGlzdHMgdGVtcG9yYXJpbHkgdW50aWwgdGhlIHByb3BlcnRpZXMgZmlsZXMgY2FuIGJlCi0gKiByZS1vcmdhbml6ZWQgYW5kIHRoZSB2YXJpb3VzIHJlc291cmNlIHJlZmVyZW5jZXMgY2FuIGJlIHVwZGF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhNTENvbW1vblJlc291cmNlcyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBYTUxDb21tb25SZXNvdXJjZXMgaW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxDb21tb25SZXNvdXJjZXMgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgWE1MQ29tbW9uUmVzb3VyY2VzKFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFhNTFVJUGx1Z2luIGVkaXRvclBsdWdpbjsKLQotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgWE1MQ29tbW9uUmVzb3VyY2VzKFhNTFVJUGx1Z2luIGVkaXRvclBsdWdpbikgewotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCXRoaXMuZWRpdG9yUGx1Z2luID0gZWRpdG9yUGx1Z2luOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW5SZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL1RPRE8uLi4gbG9nIGFuIGVycm9yIG1lc3NhZ2UKLQkJCS8vQjJCVXRpbFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZShCMkJVdGlsUGx1Z2luLmdldEdVSVN0cmluZygiX1dBUk5fUExVR0lOX1BST1BFUlRJRVNfTUlTU0lORyIpCi0JCQkvLyArIGRlc2NyaXB0b3IuZ2V0TGFiZWwoKSk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkgSW1hZ2VEZXNjcmlwdG9yIF9nZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIGljb25OYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czF9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyB0d28gc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczJ9KTsKLQl9Ci0KLQlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBlZGl0b3JQbHVnaW4uZ2V0V29ya2JlbmNoKCk7Ci0JfQotCS8qCi0JICogcHVibGljIEltYWdlRmFjdG9yeSBnZXRJbWFnZUZhY3RvcnkoKSB7IHJldHVybiBpbWFnZUZhY3Rvcnk7IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblVJQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMmNmY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxDb21tb25VSUNvbnRleHRJZHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwNTAwIGZvciBFZGl0IEF0dHJpYnV0ZSBJbnN0cnVjdGlvbiBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0FUVFJJQlVURV9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTA1MDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwNDAwIGZvciBTZWxlY3QgWE1MIENhdGFsb2cgSUQgRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9DQVRBTE9HX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDQwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSURzIGZvciBYTUwgQ29tbW9uIFVJIHVzZSB4Y3VpeHh4IGNvbnRleHQgSURzICovCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMDEwIGZvciBFZGl0IERvY3R5cGUgRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9ET0NUWVBFX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBDT05URVhUX0lEIHhjdWkwMDMwIGZvciBQdWJsaWMgSUQgVGV4dCBFZGl0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9ET0NUWVBFX1BVQkxJQyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDAzMCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBDT05URVhUX0lEIHhjdWkwMDIwIGZvciBSb290IEVsZW1lbnQgTmFtZSBUZXh0IEVkaXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfUk9PVCA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBDT05URVhUX0lEIHhjdWkwMDQwIGZvciBTeXN0ZW0gSUQgVGV4dCBFZGl0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9ET0NUWVBFX1NZU1RFTSA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDA1MCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTAzMDAgZm9yIEVkaXQgRWxlbWVudCBJbnN0cnVjdGlvbiBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0VMRU1FTlRfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwNjAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDIwMCBmb3IgRWRpdCBOYW1lc3BhY2UgRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9OQU1FU1BBQ0VfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMjAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDMwMCBmb3IgRWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfUFJPQ0VTU0lOR19ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTAzMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMTAwIGZvciBFZGl0IFNjaGVtYSBJbmZvcm1hdGlvbiBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX1NDSEVNQV9JTkZPX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDEwMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiZDIyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JTWVzc2FnZUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEEgRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvciBjYWxscyBpdHMgZGVsZWdhdGUgdmFsaWRhdG9yIHRvIGdldCBhIGxpc3QKLSAqIG9mIHZhbGlkYXRpb24gZXJyb3IgSU1lc3NhZ2VzLiBVc2luZyBpbmZvcm1hdGlvbiBpbiB0aGlzIElNZXNzYWdlIHRoZQotICogRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvciB1cGRhdGVzIHRoZSBJTWVzc2FnZSB3aXRoIGFuIG9mZnNldCBhbmQgbGVuZ3RoCi0gKiB0byBnaXZlIGEgZ29vZCByYW5nZSB0byBiZSAic3F1aWdnbGVkIiBhbmQgYWRkcyB0aGUgbWVzc2FnZXMgdG8gdGhlCi0gKiBJUmVwb3J0ZXIKLSAqIAotICogQGF1dGhvciBNYXJrIEh1dGNoaW5zb24KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCS8vIHRoZSBzZWxlY3Rpb24gc3RyYXRlZ2llczoKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQVRUUklCVVRFUyA9ICJBTExfQVRUUklCVVRFUyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAiQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9ICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJURVhUIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQgPSAiRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VOVElUWV9SRUZFUkVOQ0UgPSAiVEVYVF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFID0gIlZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCQotICAvKioKLSAgICogVGhpcyBjb25zdGFudCBzcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZSBuYW1lIHRoYXQgc3BlY2lmaWVzIHRoZSBzaWRlIG9mIHRoZSAnc3RhcnQgdGFnJwotICAgKiB0aGF0IHRoZSB2YWxpZGF0b3IgaGFzIHVzZWQgdG8gcmVwb3J0IGFuIGVycm9yLiAgQSB2YWxpZGF0b3IgbWF5IGNob29zZSB0byByZXBvcnQgYSBtZXNzYWdlCi0gICAqIGF0IHRoZSBsZWZ0ICh0aGUgc3RhcnQgb2YgdGhlIHN0YXJ0IHRhZylvciBhdCB0aGUgcmlnaHQgKHRoZSBlbmQgb2YgdGhlIHN0YXJ0IHRhZykuCi0gICAqIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCBlcnJvciBFUlJPUl9TSURFX0xFRlQgaXMgdGhlIGRlZmF1bHQuCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NJREUgPSAiRVJST1JfU0lERSI7IC8vJE5PTi1OTFMtMSQKLQkKLSAgLyoqCi0gICAqIFdoZW4gdGhlIEVSUk9SX1NJREUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgRVJST1JfU0lERV9MRUZUIHZhbHVlIGl0IGlzIGFzc3VtZWQKLSAgICogdGhhdCB0aGUgbWVzc2FnZSBzcGVjaWZpZXMgYSBsb2NhdGlvbiB0byB0aGUgbGVmdCBvZiB0aGUgc3RhcnQgdGFnCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NJREVfTEVGVCA9ICJFUlJPUl9TSURFX0xFRlQiOyAvLyROT04tTkxTLTEkCQotCQotICAvKioKLSAgICogV2hlbiB0aGUgRVJST1JfU0lERSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBFUlJPUl9TSURFX1JJR0hUIHZhbHVlIGl0IGlzIGFzc3VtZWQKLSAgICogdGhhdCB0aGUgbWVzc2FnZSBzcGVjaWZpZXMgYSBsb2NhdGlvbiB0byB0aGUgcmlnaHQgb2YgdGhlIHN0YXJ0IHRhZwotICAgKi8JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0lERV9SSUdIVCA9ICJFUlJPUl9TSURFX1JJR0hUIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTlVNQkVSX0FUVFJJQlVURSA9ICJjb2x1bW5OdW1iZXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSA9ICJzcXVpZ2dsZVNlbGVjdGlvblN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFID0gInNxdWlnZ2xlTmFtZU9yVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsgLy8gY29uc3RydWN0b3IKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciBhcmcwKSB7IC8vIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50Ci0JfQotCi0JLy8gTXkgSW1wbGVtZW50YXRpb24gb2YgSUhlbHBlcgotCWNsYXNzIE15SGVscGVyIGltcGxlbWVudHMgSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCB7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtOwotCi0JCUlGaWxlIGZpbGU7Ci0KLQkJcHVibGljIE15SGVscGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRCdWlsZEtpbmQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCQlpZiAoc3ltYm9saWNOYW1lLmVxdWFscygiZ2V0RmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoImlucHV0U3RyZWFtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBpbnB1dFN0cmVhbTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZ1tdIGdldFVSSXMoKSB7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9OwotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8vIE15IEltcGxlbWVudGF0aW9uIG9mIElSZXBvcnRlcgotCWNsYXNzIE15UmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIE15UmVwb3J0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIG9yaWdpbiwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkJbGlzdC5hZGQobWVzc2FnZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkJLyogZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50ICovCi0JCX0KLQotCQlwdWJsaWMgSU1lc3NhZ2VBY2Nlc3MgZ2V0TWVzc2FnZUFjY2VzcygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbiwgT2JqZWN0IG9iamVjdCkgeyAvLyBkbwotCQkJLyogZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50ICovCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbikgewotCQkJLyogZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50ICovCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ly8gZG8KLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCQlyZXR1cm4gbGlzdDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBDYWxscyBhIGRlbGVnYXRlIHZhbGlkYXRvciBnZXR0aW5nIGFuZCB1cGRhdGVzIGl0J3MgbGlzdCBvZgotCSAqIFZhbGlkYXRpb25NZXNzYWdlcyB3aXRoIGEgZ29vZCBzcXVpZ2dsZSBvZmZzZXQgYW5kIGxlbmd0aC4KLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogICAgICAgICAgICBsb2FkcyBhbiBvYmplY3QuCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogICAgICAgICAgICBJcyBhbiBpbnN0YW5jZSBvZiBhbiBJUmVwb3J0ZXIgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGZvcgotCSAqICAgICAgICAgICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gZGVsdGEgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlpZiAoZGVsdGEubGVuZ3RoID4gMCkgewotCQkJLy8gZ2V0IHRoZSBmaWxlLCBtb2RlbCBhbmQgZG9jdW1lbnQ6Ci0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShkZWx0YVswXSk7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBnZXRNb2RlbEZvclJlc291cmNlKGZpbGUpOwotCQkJdHJ5IHsKLQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQkJLy8gc3RvcmUgdGhlIHRleHQgaW4gYSBieXRlIGFycmF5OyBtYWtlIGEgZnVsbCBjb3B5IHRvIGVhc2UKLQkJCQkvLyBhbnkgdGhyZWFkaW5nIHByb2JsZW1zCi0JCQkJYnl0ZVtdIGJ5dGVBcnJheTsKLQkJCQl0cnkgewotCQkJCQlieXRlQXJyYXkgPSB4bWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKS5nZXRCeXRlcygiVVRGLTgiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gTm90IGxpa2VseSB0byBoYXBwZW4KLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoZmlsZSkpIHsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpOwotCQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCS8vIFZhbGlkYXRlIHRoZSBmaWxlOgotCQkJCQkJSVZhbGlkYXRpb25Db250ZXh0IHZIZWxwZXIgPSBuZXcgTXlIZWxwZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSksIGZpbGUpOwotCQkJCQkJTXlSZXBvcnRlciB2UmVwb3J0ZXIgPSBuZXcgTXlSZXBvcnRlcigpOwotCQkJCQkJaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IpIHsKLQkJCQkJCQkoKElWYWxpZGF0b3JKb2IpIHZhbGlkYXRvcikudmFsaWRhdGVJbkpvYih2SGVscGVyLCB2UmVwb3J0ZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHZIZWxwZXIsIHZSZXBvcnRlcik7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IG1lc3NhZ2VzID0gdlJlcG9ydGVyLmxpc3Q7Ci0KLQkJCQkJCS8vIHNldCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGgKLQkJCQkJCXVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlcyhtZXNzYWdlcywgZG9jdW1lbnQsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCi0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBtZXNzYWdlcyBhbmQgY2FsY3VsYXRlcyBhICJiZXR0ZXIiIG9mZnNldCBhbmQKLQkgKiBsZW5ndGgKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZXMgLQotCSAqICAgICAgICAgICAgYSBMaXN0IG9mIElNZXNzYWdlcwotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gcmVwb3J0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIHJlcG9ydGVyIHRoZSBtZXNzYWdlcyBhcmUgdG8gYmUgYWRkZWQgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWYWxpZGF0aW9uTWVzc2FnZXMoTGlzdCBtZXNzYWdlcywgSURPTURvY3VtZW50IGRvY3VtZW50LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgbWVzc2FnZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlpZiAobWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpICE9IG51bGwpIHsKLQkJCQkJaW50IGNvbHVtbiA9ICgoSW50ZWdlcikgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpKS5pbnRWYWx1ZSgpOwotCQkJCQlTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSAoU3RyaW5nKSBtZXNzYWdlLmdldEF0dHJpYnV0ZShTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFKTsKLQkJCQkJU3RyaW5nIG5hbWVPclZhbHVlID0gKFN0cmluZykgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUpOwotCi0JCQkJCS8vIGNvbnZlcnQgdGhlIGxpbmUgYW5kIENvbHVtbiBudW1iZXJzIHRvIGFuIG9mZnNldDoKLQkJCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChtZXNzYWdlLmdldExpbmVOdW1iZXIoKSAtIDEpICsgY29sdW1uIC0gMTsKLQotCQkJCQkvLyBjYWxjdWxhdGUgdGhlICJiZXR0ZXIiIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0OgotCQkJCQlpbnRbXSByZXN1bHQgPSBjb21wdXRlU3RhcnRBbmRFbmRMb2NhdGlvbihzdGFydCwgc2VsZWN0aW9uU3RyYXRlZ3ksIGdldEVycm9yU2lkZShtZXNzYWdlKSwgbmFtZU9yVmFsdWUsIGRvY3VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChyZXN1bHRbMF0pOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgocmVzdWx0WzFdIC0gcmVzdWx0WzBdKTsKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeyAvLyB0aGlzIGV4Y2VwdGlvbiBzaG91bGQgbm90Ci0JCQkJLy8gb2NjdXIgLSBpdCBpcyB0aHJvd24gaWYKLQkJCQkvLyB0cnlpbmcgdG8gY29udmVydCBhbgotCQkJCS8vIGludmFsaWQgbGluZSBudW1iZXIgdG8gYW5kCi0JCQkJLy8gb2Zmc2V0Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWx0YQotCSAqICAgICAgICAgICAgdGhlIElGaWxlRGVsdGEgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIHRvIGdldAotCSAqIEByZXR1cm4gdGhlIElGaWxlCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGRlbHRhKSB7Ci0JCUlSZXNvdXJjZSByZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZGVsdGEpKTsKLQkJcmV0dXJuIHJlcyBpbnN0YW5jZW9mIElGaWxlID8gKElGaWxlKSByZXMgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBnZXQgdGhlIG1vZGVsIGZvcgotCSAqIEByZXR1cm4gdGhlIGZpbGUncyBYTUxNb2RlbAotCSAqLwotCXByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0TW9kZWxGb3JSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCi0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJLy8gVE9ETy4uIEhUTUwgdmFsaWRhdG9yIHRyaWVzIGFnYWluIHRvIGdldCBhIG1vZGVsIGEgMm5kIHdheQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCA/IChJRE9NTW9kZWwpIG1vZGVsIDogbnVsbDsKLQl9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIHVzZSBjb21wdXRlU3RhcnRFbmRMb2NhdGlvbihpbnQgc3RhcnRPZmZzZXQsIFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSwgYm9vbGVhbiBsZWZ0RXJyb3IsIFN0cmluZyBuYW1lT3JWYWx1ZSwgSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgaW50W10gY29tcHV0ZVN0YXJ0RW5kTG9jYXRpb24oaW50IHN0YXJ0T2Zmc2V0LCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3ksIFN0cmluZyBuYW1lT3JWYWx1ZSwgSURPTURvY3VtZW50IGRvY3VtZW50KSAKLSAgewotICAgIHJldHVybiBjb21wdXRlU3RhcnRBbmRFbmRMb2NhdGlvbihzdGFydE9mZnNldCwgc2VsZWN0aW9uU3RyYXRlZ3ksIEVSUk9SX1NJREVfUklHSFQsIG5hbWVPclZhbHVlLCBkb2N1bWVudCk7Ci0gIH0gIAotICAKLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSAiYmV0dGVyIiBvZmZzZXRzLgotCSAqIEBwYXJhbSBzdGFydE9mZnNldCAtCi0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IGdpdmVuIGJ5IFhlcmNlcwotCSAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgLQotCSAqICAgICAgICAgICAgdGhlIFhlcmNlcyBlcnJvciBNZXNzYWdlCi0JICogQHBhcmFtIHNlbGVjdGlvblN0cmF0ZWd5IC0KLQkgKiAgICAgICAgICAgIHRoZSBzZWxlY3Rpb25TdHJhdGVneQotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGludFtdIC0gcG9zaXRpb24gMCBoYXMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgc3F1aWdnbGUgcmFuZ2UsCi0JICogICAgICAgICBwb3NpdGlvbiAxIGhhcyB0aGUgZW5kT2Zmc2V0Ci0JICovCi0JLyoKLQkgKiBUaGUgd2F5IHRoZSBvZmZzZXRzIGlzIGNhbGN1bGF0ZWQgaXM6IC0gZmluZCB0aGUgaW5kZXhlZCByZWdpb24KLQkgKiAoZWxlbWVudCkgY2xvc2VzdCB0byB0aGUgZ2l2ZW4gb2Zmc2V0IC0gaWYgd2UgYXJlIGJldHdlZW4gdHdvIGVsZW1lbnRzLAotCSAqIGNob29zaW5nIGxlZnQgb3IgcmlnaHQgZWxlbWVudCB3aWxsIGRlcGVuZCBvbiBwYXJhbWV0ZXIgJ2Vycm9yU2lkZScgCi0JICogLSBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uU3RyYXRlZ3kgY2hvb3NlIHRoZSB1bmRlcmxpbmluZyBzdHJhdGVneSAKLQkgKiAgKGVnIFNUQVJUX1RBRyBtZWFucyB1bmRlcmxpbmUgdGhlIHN0YXJ0IHRhZyBvZiB0aGF0IGVsZW1lbnQpIAotCSAqIC0gdXNlIGluZm9ybWF0aW9uIGZyb20gbmFtZU9yVmFsdWUgYW5kIHRoZSBET00gdG8KLQkgKiBnZXQgYmV0dGVyIG9mZnNldHMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50W10gY29tcHV0ZVN0YXJ0QW5kRW5kTG9jYXRpb24oaW50IHN0YXJ0T2Zmc2V0LCBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3ksIFN0cmluZyBlcnJvclNpZGUsIFN0cmluZyBuYW1lT3JWYWx1ZSwgSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc3RhcnRFbmRQb3NpdGlvbnNbXSA9IG5ldyBpbnRbMl07Ci0KLQkJCUluZGV4ZWRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCUluZGV4ZWRSZWdpb24gcHJldlJlZ2lvbiA9IGRvY3VtZW50LmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCAtIDEpOwotCi0JCQlpZiAocHJldlJlZ2lvbiAhPSByZWdpb24pIHsKLQkJCQkvLyBpZiBiZXR3ZWVuIHR3byByZWdpb25zIHdlIHVzZSB0aGUgJ2Vycm9yU2lkZScgdG8gdW5kZXJzdGFuZCB3aGljaAotCQkJCS8vIGVsZW1lbnQgaXMgYXBwbGljYWJsZS4gIGlmIHdlIGtub3cgdGhlIGVycm9yIGhhcyBiZWVuIHJlcG9ydGVkIHRvIHRoZQotCQkJCS8vIHJpZ2h0IG9mIHRoZSB0YWcsIHRoZW4gd2UgY2FuIGFzc3VtZSB3ZSBuZWVkIHRvIHN0ZXAgYmFjayB0byB0aGUgcHJldmlvdXMKLQkJCQkvLyByZWdpb24gdG8gbGFuZCBhdCB0aGUgJ2NvcnJlY3QgbG9jYXRpb24uICBPdGhlcndpc2UgYXNzdW1lIHdlJ3JlCi0JCQkJLy8gZXhhY3RseSB3aGVyZSB3ZSBuZWVkIHRvIGJlLgkJCQkKLQkJCQlpZiAoRVJST1JfU0lERV9MRUZULmVxdWFscyhlcnJvclNpZGUpKQotCQkJCXsKLQkJCQkgIHJlZ2lvbiA9IHByZXZSZWdpb247Ci0JCQkJfSAgCi0JCQl9Ci0KLQkJCS8vIGluaXRpYWxpemUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgdG8gYmUgdGhlIHN0YXJ0IHBvc2l0aW9ucwotCQkJLy8gdGhpcyBtZWFucyBpZiB0aGUKLQkJCS8vIHNwZWNpYWwgY2FzZSBpcyBub3QgdGFrZW4gY2FyZSBvZiBiZWxvdyB0aGUgc3RhcnQgYW5kIGVuZAotCQkJLy8gb2Zmc2V0IGFyZSBzZXQgdG8gYmUKLQkJCS8vIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uIHdoZXJlIHRoZSBlcnJvciB3YXMKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydEVuZFBvc2l0aW9uc1swXTsKLQkJCX0KLQkJCWVsc2UgeyAvLyB0aGlzIHdpbGwgbWVzc2FnZSB3aWxsIG5vdCBnZXQgYWRkZWQgdG8gdGhlIElSZXBvcnRlcgotCQkJCS8vIHNpbmNlIHRoZSBsZW5ndGggaXMgMAotCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gMDsKLQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IDA7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSByZWdpb247Ci0KLQkJCQlpZiAoU1RBUlRfVEFHLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsvLyB0aGVuIHdlIHdhbnQgdG8KLQkJCQkJLy8gdW5kZXJsaW5lIHRoZSBvcGVuaW5nIHRhZwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCkgKyAxOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydEVuZFBvc2l0aW9uc1swXSArIGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEFUVFJJQlVURV9OQU1FLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsgLy8gaW4KLQkJCQkJLy8gdW5kZXJsaW5lIHRoZSBhdHRyaWJ1dGUncyBuYW1lCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlJRE9NTm9kZSBhdHRyaWJ1dGVOb2RlID0gKElET01Ob2RlKSAoZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5hbWVPclZhbHVlKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBhdHRyaWJ1dGVOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBhdHRyaWJ1dGVOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBuYW1lT3JWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChBVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQkvLyB1bmRlcmxpbmUgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlJRE9NQXR0ciBhdHRyaWJ1dGVOb2RlID0gKElET01BdHRyKSAoZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5hbWVPclZhbHVlKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBhdHRyaWJ1dGVOb2RlLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgYXR0cmlidXRlTm9kZS5nZXRWYWx1ZVJlZ2lvblRleHQoKS5sZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChBTExfQVRUUklCVVRFUy5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCS8vIHVuZGVybGluZSBhbGwgYXR0cmlidXRlcwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQkJCQlJRE9NTm9kZSBmaXJzdCA9IChJRE9NTm9kZSkgYXR0cmlidXRlcy5pdGVtKDApOwotCQkJCQkJCUlET01Ob2RlIGxhc3QgPSAoSURPTU5vZGUpIGF0dHJpYnV0ZXMuaXRlbShhdHRyaWJ1dGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkJCQkJaWYgKGZpcnN0ICE9IG51bGwgJiYgbGFzdCAhPSBudWxsKSB7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURVhULmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHRhZ3MKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJSURPTVRleHQgdGV4dE5vZGUgPSAoSURPTVRleHQpIG5vZGU7Ci0JCQkJCQlpbnQgc3RhcnQgPSB0ZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJU3RyaW5nIHZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJY2hhciBjdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCS8vIGhlcmUgd2UgYXJlIGZpbmRpbmcgc3RhcnQgb2Zmc2V0IGJ5IHNraXBwaW5nIG92ZXIKLQkJCQkJCS8vIHdoaXRlc3BhY2U6Ci0JCQkJCQl3aGlsZSAoY3VyQ2hhciA9PSAnXG4nIHx8IGN1ckNoYXIgPT0gJ1x0JyB8fCBjdXJDaGFyID09ICdccicgfHwgY3VyQ2hhciA9PSAnICcpIHsKLQkJCQkJCQljdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCQlpbmRleCsrOwotCQkJCQkJfQotCQkJCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQkJCWluZGV4LS07Ci0KLQkJCQkJCX0KLQkJCQkJCXN0YXJ0ID0gc3RhcnQgKyBpbmRleDsKLQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gc3RhcnQgKyBpbmRleDsKLQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnQgKyB2YWx1ZS50cmltKCkubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJCQlJRE9NTm9kZSB4bWxDaGlsZCA9ICgoSURPTU5vZGUpIGNoaWxkKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHhtbENoaWxkLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSB4bWxDaGlsZC5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhULmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gc2VhcmNoIHRocm91Z2ggYWxsIGNoaWxkIG5vZGVzIGFuZCByZXR1cm4gcmFuZ2Ugb2YKLQkJCQkJLy8gZmlyc3Qgbm9uLXdoaXRlc3BhY2UKLQkJCQkJLy8gdGV4dCBub2RlCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCU5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCQkvLyBUT0RPIChUcnVuZykgSSBkb24ndCB0aGluayB3ZSBzaG91bGQgY2FsbCBnZXROb2RlVmFsdWUoKSwgdHJpbSgpLCBsZW5ndGgoKSByZXBlYXRlZGx5LgotCQkJCQkJCQkvLyBUaGlzIGlzIGluZWZmaWNpZW50LCB0byBpbXByb3ZlIHVzZSBsb2NhbCB2YXJpYWJsZXMgdG8gc3RvcmUgdmFsdWVzLgotCQkJCQkJCQlJRE9NVGV4dCB0ZXh0Tm9kZSA9IChJRE9NVGV4dCkgY3VycmVudE5vZGU7Ci0JCQkJCQkJCWlmICh0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQlTdHJpbmcgdmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQkJCQlpbnQgc3RhcnQgPSB0ZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCQkJY2hhciBjdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCQkJCS8vIGhlcmUgd2UgYXJlIGZpbmRpbmcgc3RhcnQgb2Zmc2V0IGJ5Ci0JCQkJCQkJCQkvLyBza2lwcGluZyBvdmVyIHdoaXRlc3BhY2U6Ci0JCQkJCQkJCQl3aGlsZSAoY3VyQ2hhciA9PSAnXG4nIHx8IGN1ckNoYXIgPT0gJ1x0JyB8fCBjdXJDaGFyID09ICdccicgfHwgY3VyQ2hhciA9PSAnICcpIHsKLQkJCQkJCQkJCQljdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCQkJCQlpbmRleCsrOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQkJCQkJCWluZGV4LS07Ci0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXN0YXJ0ID0gc3RhcnQgKyBpbmRleDsKLQkJCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gc3RhcnQ7Ci0JCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0ICsgdmFsdWUudHJpbSgpLmxlbmd0aCgpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWVsc2UgaWYgKFRFWFRfRU5USVRZX1JFRkVSRU5DRS5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBJbiB0aGlzIGNhc2UgdGhlIHVuZGVjbGFyZWQgZW50aXR5IG1pZ2h0IGJlIGluIG9uZQotCQkJCQkJICogb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMuIFNlYXJjaCB0aHJvdWdoIHRoZQotCQkJCQkJICogYXR0cmlidXRlcyB0byBmaW5kIHRoZSByYW5nZSBvZiB0aGUgdW5kZWNsYXJlZAotCQkJCQkJICogZW50aXR5LgotCQkJCQkJICovCi0JCQkJCQlTdHJpbmcgZW50aXR5ID0gIiYiICsgbmFtZU9yVmFsdWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQkJSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkJCVN0cmluZyBub2RlVmFsdWUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCWludCBpbmRleCA9IG5vZGVWYWx1ZS5pbmRleE9mKGVudGl0eSk7Ci0JCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gYXR0ci5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyBpbmRleCArIDE7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnRFbmRQb3NpdGlvbnNbMF0gKyBlbnRpdHkubGVuZ3RoKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQkvLyBUT0RPIChUcnVuZykgZG8gd2UgcmVhbGx5IG5lZWQgdGhpcyBzdHJhdGVneSA/Ci0JCQkJCS8vIElmIHdlIGtub3cgdGhlIG5hbWUgb2YgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSwgd2UgY2FuIHJldHJpZXZlIGl0cyB2YWx1ZS4KLQkJCQkJLy8gSGVuY2UsIHdlIGNhbiBpbmNvcGVyYXRlIHRoaXMgc3RyYXRlZ3kgd2l0aCBBVFRSSUJVVEVfVkFMVUUgPwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkvLyBoZXJlIHdlIHdpbGwgc2VhcmNoIHRocm91Z2ggYWxsIGF0dHJpYnV0ZXMgZm9yIHRoZQotCQkJCQkJLy8gb25lIHdpdGggdGhlCi0JCQkJCQkvLyB3aXRoIHRoZSB2YWx1ZSB3ZSB3YW50OgotCQkJCQkJLy8gVE9ETyAoVHJ1bmcpIEkgc2VlIGEgcG90ZW50aWFsIHByb2JsZW0gaGVyZS4KLQkJCQkJCS8vIFdoYXQgaGFwcGVucyB3aGVuIHRoZXJlIGlzIGFub3RoZXIgYXR0cmlidXRlIGhhdmluZyB0aGUgc2FtZSB2YWx1ZQotCQkJCQkJLy8gd2l0aCB0aGlzIGF0dHJpYnV0ZSdzIGJ1Z2d5IHZhbHVlID8KLQkJCQkJCS8vIE5lZWQgdG8gc29sdmUgd2hlbiB0aW1lIHBlcm1pdHMuCi0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlJRE9NQXR0ciBhdHRyID0gKElET01BdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJCQkJU3RyaW5nIG5vZGVWYWx1ZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpOwotCQkJCQkJCWlmIChub2RlVmFsdWUuZXF1YWxzKG5hbWVPclZhbHVlKSkgewotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydEVuZFBvc2l0aW9uc1swXSArIG5vZGVWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN0YXJ0RW5kUG9zaXRpb25zOwotCQl9Ci0JCS8vIGNhdGNoIChFeGNlcHRpb24gZSkgeyAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLyB9Ci0JCWZpbmFsbHkgewotCQl9Ci0JCS8vIHJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBkZWxlZ2F0ZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBiYXNlZCBvbiBWYWxpZGF0aW9uCi0JICogcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgZGVsZWdhdGUgdmFsaWRhdG9yIGlzIG5vdCBlbmFibGVkIGJhc2VkIG9uIFZhbGlkYXRvaW4KLQkgKiAgICAgICAgIHByZWZlcmVuY2VzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRGVsZWdhdGVWYWxpZGF0b3JFbmFibGVkKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yU2lkZShJTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgLy8gbm90ZSB0aGF0IGlmIHRoZSBFUlJPUl9TSURFIGlzIHVuc3BlY2lmaWVkIHdlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBFUlJPUl9TSURFX0xFRlQgICAgCi0gICAgT2JqZWN0IHZhbHVlID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoRVJST1JfU0lERSk7Ci0gICAgcmV0dXJuIEVSUk9SX1NJREVfUklHSFQuZXF1YWxzKHZhbHVlKSA/IEVSUk9SX1NJREVfUklHSFQgOiBFUlJPUl9TSURFX0xFRlQ7Ci0gIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZTkxMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuVmFsaWRhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgTWFyayBIdXRjaGluc29uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwgZXh0ZW5kcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SX0NMQVNTID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0RGVsZWdhdGVWYWxpZGF0b3IoKSB7Ci0JCUlWYWxpZGF0b3IgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IFZhbGlkYXRpb25GYWN0b3J5Lmluc3RhbmNlLmdldFZhbGlkYXRvcihWQUxJREFUT1JfQ0xBU1MpOwotCQl9Ci0JCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGVnYXRlVmFsaWRhdG9yRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShWQUxJREFUT1JfQ0xBU1MpOwotCQkJaWYgKGNvbmZpZ3VyYXRpb24uaXNCdWlsZEVuYWJsZWQodm1kKSB8fCBjb25maWd1cmF0aW9uLmlzTWFudWFsRW5hYmxlZCh2bWQpKQotCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJZWxzZQotCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiN2U2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLkFubm90YXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JbmNyZW1lbnRhbFJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Qcm9ibGVtSURzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQmFzaWMgWE1MIHN5bnRheCBjaGVja2luZyBzdGVwLgotICogT25seSB1c2VkIGFzIElTb3VyY2VWYWxpZGF0b3IgYXQgdGhlIG1vbW1lbnQKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE1hcmt1cFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IsIElTb3VyY2VWYWxpZGF0b3IgewotCXByaXZhdGUgU3RyaW5nIERRVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgU0VWRVJJVFlfQVRUUl9NSVNTSU5HX1ZBTFVFID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUjsKLQlwcm90ZWN0ZWQgU3RyaW5nIFNFVkVSSVRZX0FUVFJfTk9fVkFMVUUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SOwotCS8vIHNldmVyaXRpZXMgZm9yIHRoZSBwcm9ibGVtcyBkaXNjb3ZlcmFibGUgYnkgdGhpcyByZWNvbmNpbGVyOyBwb3NzaWJseQotCS8vIHVzZXIgY29uZmlndXJhYmxlIGxhdGVyCi0JcHJvdGVjdGVkIFN0cmluZyBTRVZFUklUWV9HRU5FUklDX0lMTEZPUk1FRF9TWU5UQVggPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkc7Ci0JcHJvdGVjdGVkIFN0cmluZyBTRVZFUklUWV9TVFJVQ1RVUkUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SOwotCXByb3RlY3RlZCBTdHJpbmcgU0VWRVJJVFlfU1lOVEFYX0VSUk9SID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUjsKLQkvLyB1c2VkIGZvciBhdHRyaWJ1dGUgcXVvdGUgY2hlY2tpbmcKLQlwcml2YXRlIFN0cmluZyBTUVVPVEUgPSAiJyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQotCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVFcnJvcihTdHJpbmcgbWVzc2FnZVRleHQsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZVRleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCwgaW50IHByb2JsZW1JZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgIElSZXBvcnRlciByZXBvcnRlcikgewotICAgICAgICAKLSAgICAgICAgaWYgKHNkUmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotICAgICAgICBMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtZXNzYWdlVGV4dCk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLSAgICAgICAgbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLSAgICAgICAgbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLSAgICAgICAgCi0gICAgICAgIEFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSwgcHJvYmxlbUlkLCBhdHRyaWJ1dGVWYWx1ZVRleHQpOwotICAgICAgICAoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0F0dHJpYnV0ZXNJbkVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0gICAgICAgIAotICAgICAgICBpZihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkgJiYgZXJyb3JDb3VudCA8IEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LkVMRU1FTlRfRVJST1JfTElNSVQgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCB0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyB8fCB0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKHN0YXJ0ID4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pKQotCQkJCQlzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJCQllbmQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHRleHRSZWdpb24pOwotCQkJCWVycm9yQ291bnQrKzsKLQkJCX0KLQkJfQotCQkvLyBjcmVhdGUgb25lIGVycm9yIGZvciBhbGwgYXR0cmlidXRlcyBpbiB0aGUgZW5kIHRhZwotCQlpZiAoZXJyb3JDb3VudCA+IDApIHsKLQkJCS8vIFBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuRW5kX3RhZ19oYXNfYXR0cmlidXRlczsKLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgoZW5kIC0gc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCQkJCi0JCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZywgbnVsbCk7Ci0JCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY2hlY2tDbG9zaW5nQnJhY2tldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0gICAgICAgIAotICAgICAgICBpZihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpICAmJiAhc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKQotCQkJCWNsb3NlZCA9IHRydWU7Ci0JCX0KLQkJaWYgKCFjbG9zZWQpIHsKLQotCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0KLQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpOwotCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCQkJCi0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtZXNzYWdlVGV4dCk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQotCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlLCBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCwgbnVsbCk7Ci0JCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRW1wdHlUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotICAgICAgICAKLSAgICAgICAgaWYoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLQkJLy8gbmF2aWdhdGUgdG8gbmFtZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAyKSB7Ci0JCQkvLyBtaXNzaW5nIG5hbWUgcmVnaW9uCi0JCQlpZiAocmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMzsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQkJCQkKLQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtZXNzYWdlVGV4dCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQkKLQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcsIG51bGwpOwotCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcilyZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRMaW5lTnVtYmVyKGludCBzdGFydCkgewotCQlpbnQgbGluZU5vID0gLTE7Ci0JCXRyeSB7Ci0JCQlsaW5lTm8gPSBnZXREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JBdHRyaWJ1dGVWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0gICAgICAgIAotICAgICAgICBpZihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKLQkJLy8gdHJhY2sgdGhlIGF0dHJpYnV0ZS9lcXVhbHMvdmFsdWUgc2VxdWVuY2UgdXNpbmcgYSBzdGF0ZSBvZiAwLCAxICwyCi0JCS8vIHJlcHJlc2VudGluZyB0aGUgbmFtZSwgPSwgYW5kIHZhbHVlLCByZXNwZWN0aXZlbHkKLQkJaW50IGF0dHJTdGF0ZSA9IDA7Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCS8vIFJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0U2NvcGUoKSk7Ci0JCQotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpICYmIGVycm9yQ291bnQgPCBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5FTEVNRU5UX0VSUk9SX0xJTUlUOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IGlzVGFnQ2xvc2VUZXh0UmVnaW9uKHRleHRSZWdpb24pKSB7Ci0JCQkJLy8gZGFuZ2xpbmcgbmFtZSBhbmQgJz0nCi0JCQkJaWYgKGF0dHJTdGF0ZSA9PSAyICYmIGkgPj0gMikgewotCQkJCQkvLyBjcmVhdGUgYW5ub3RhdGlvbgotCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkgLSAyKTsKLQkJCQkJT2JqZWN0W10gYXJncyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKX07Ci0JCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX19pc19taXNzaW5nX2FfdmFsdWUsIGFyZ3MpOwotCQkJCQkKLQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJCQlpbnQgZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0JCQkJCWludCB0ZXh0TGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCQkJCQkKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRMZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkKLQkJCQkJLy8gcXVpY2sgZml4IGluZm8KLQkJCQkJSVRleHRSZWdpb24gZXF1YWxzUmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkgLSAyICsgMSk7Ci0JCQkJCWludCBpbnNlcnRPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChlcXVhbHNSZWdpb24pIC0gZW5kOwotCQkJCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKSwgbmV3IEludGVnZXIoaW5zZXJ0T2Zmc2V0KX07Ci0JCQkJCQotCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSwgYWRkaXRpb25hbEZpeEluZm8pOwotCQkJCQkKLQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkJCi0JCQkJCS8vIGFubm90YXRpb24uc2V0QWRkaXRpb25hbEZpeEluZm8oYWRkaXRpb25hbEZpeEluZm8pOwotCQkJCQkvL3Jlc3VsdHMuYWRkKGFubm90YXRpb24pOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJCS8vIG5hbWUgYnV0IG5vICc9JyAoWE1MIG9ubHkpCi0JCQkJZWxzZSBpZiAoYXR0clN0YXRlID09IDEgJiYgaSA+PSAxKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhbm5vdGF0aW9uCi0JCQkJCUlUZXh0UmVnaW9uIHByZXZpb3VzUmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkgLSAxKTsKLQkJCQkJT2JqZWN0W10gYXJncyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbil9OwotCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9faGFzX25vX3ZhbHVlLCBhcmdzKTsKLQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZpb3VzUmVnaW9uKTsKLQkJCQkJaW50IHRleHRMZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCQkJCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0JCQkJCQotCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgodGV4dExlbmd0aCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkJCQotCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuTm9BdHRyVmFsdWUsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHByZXZpb3VzUmVnaW9uKSk7Ci0JCQkKLQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkJCi0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQkJYXR0clN0YXRlID0gMTsKLQkJCX0gZWxzZSBpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlhdHRyU3RhdGUgPSAyOwotCQkJfSBlbHNlIGlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJYXR0clN0YXRlID0gMDsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yU3BhY2VCZWZvcmVOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0JCVN0cmluZyBzZFJlZ2lvblRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJaWYgKHNkUmVnaW9uVGV4dC5zdGFydHNXaXRoKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBpcyBwb3NzaWJseSB0aGUgY2FzZSBvZiAiPCB0YWciCi0JCQkJaWYgKHByZXYuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxICYmIGlzU3RhcnRUYWcocHJldikpIHsKLQkJCQkJLy8gYWRkIHRoZSBlcnJvciBmb3IgcHJlY2VkaW5nIHNwYWNlIGluIHRhZyBuYW1lCi0JCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8yOwotCQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJLy8gZmluZCBsZW5ndGggb2Ygd2hpdGVzcGFjZQotCQkJCQlpbnQgbGVuZ3RoID0gc2RSZWdpb25UZXh0LnRyaW0oKS5lcXVhbHMoIiIpID8gc2RSZWdpb25UZXh0Lmxlbmd0aCgpIDogc2RSZWdpb25UZXh0LmluZGV4T2Yoc2RSZWdpb25UZXh0LnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0JCQkJCQotCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSwgbnVsbCk7Ci0JCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcilyZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTm9OYW1lc3BhY2VJblBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0JCS8vIG5hdmlnYXRlIHRvIG5hbWUKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpICYmIGVycm9yQ291bnQgPCBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5FTEVNRU5UX0VSUk9SX0xJTUlUICYmICFzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJU3RyaW5nIHBpVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCWludCBpbmRleCA9IHBpVGV4dC5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzQ7Ci0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIGluZGV4OwotCQkJCQlpbnQgbGVuZ3RoID0gcGlUZXh0LnRyaW0oKS5sZW5ndGgoKSAtIGluZGV4OwotCQkJCQkKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGdldExpbmVOdW1iZXIoc3RhcnQpKTsKLQkJCQkJCi0JCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSwgUHJvYmxlbUlEc1hNTC5OYW1lc3BhY2VJblBJLCBudWxsKTsKLQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUXVvdGVzRm9yQXR0cmlidXRlVmFsdWVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJWYWx1ZVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCkgJiYgZXJyb3JDb3VudCA8IEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LkVMRU1FTlRfRVJST1JfTElNSVQ7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJY29udGludWU7Ci0KLQkJCWF0dHJWYWx1ZVRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyKTsKLQkJCS8vIGF0dHJpYnV0ZSB2YWx1ZSBpbmNsdWRlcyBxdW90ZXMgaW4gdGhlIHN0cmluZwotCQkJLy8gc3BsaXQgdXAgYXR0cmlidXRlIHZhbHVlIG9uIHF1b3RlcwotCQkJLyoKLQkJCSAqIFdPUktBUk9VTkQgdGlsbAotCQkJICogaHR0cDovL2Rldi5pY3UtcHJvamVjdC5vcmcvY2dpLWJpbi9pY3UtYnVncy9pbmNvbWluZz9maW5kaWQ9NTIwNwotCQkJICogaXMgZml4ZWQuIChBbHNvIHNlZSBCVUcxNDM2MjgpCi0JCQkgKi8KLQotCQkJamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZVRleHQsICJcIiciLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotCQkJLy8gZ2V0IHRoZSBwaWVjZXMgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJU3RyaW5nIG9uZSA9ICIiLCB0d28gPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoc2l6ZSA+IDApCi0JCQkJb25lID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAoc2l6ZSA+IDEpCi0JCQkJdHdvID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAoc2l6ZSA+IDIpIHsKLQkJCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBwYXJzaW5nLi4uCi0JCQkJLy8gYXMgaW4gd2UgY2FuJ3QgaGF2ZSBhbiBhdHRyaWJ1dGUgdmFsdWUgbGlrZTogPGVsZW1lbnQKLQkJCQkvLyBhdHRyPSJhImIiYyIvPgotCQkJCS8vIGFuZCA8ZWxlbWVudCBhdHRyPSdhImIiYycgLz4gaXMgbGVnYWwKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCi0JCQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCQkJaWYgKG9uZS5lcXVhbHMoRFFVT1RFKSB8fCBvbmUuZXF1YWxzKFNRVU9URSkpIHsKLQkJCQkJLy8gbWlzc2luZyBjbG9zaW5nIHF1b3RlCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JCQkJCWFkZEF0dHJpYnV0ZUVycm9yKG1lc3NhZ2UsIGF0dHJWYWx1ZVRleHQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSwgYXR0clZhbHVlVGV4dC50cmltKCkubGVuZ3RoKCksIFByb2JsZW1JRHNYTUwuVW5jbGFzc2lmaWVkLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG1pc3NpbmcgYm90aAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNpemUgPT0gMikgewotCQkJCWlmIChvbmUuZXF1YWxzKFNRVU9URSkgJiYgIXR3by5lcXVhbHMoU1FVT1RFKSB8fCBvbmUuZXF1YWxzKERRVU9URSkgJiYgIXR3by5lcXVhbHMoRFFVT1RFKSkgewotCQkJCQkvLyBtaXNzaW5nIGNsb3NpbmcgcXVvdGUKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMDsKLQkJCQkJYWRkQXR0cmlidXRlRXJyb3IobWVzc2FnZSwgYXR0clZhbHVlVGV4dCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBhdHRyVmFsdWVUZXh0LnRyaW0oKS5sZW5ndGgoKSwgUHJvYmxlbUlEc1hNTC5VbmNsYXNzaWZpZWQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGVuZCBvZiByZWdpb24gZm9yIGxvb3AKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTdGFydEVuZFRhZ1BhaXJzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotICAgICAgICAKLSAgICAgICAgaWYoc2RSZWdpb24uaXNEZWxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotCQkvLyBjaGVjayBzdGFydC9lbmQgdGFnIHBhaXJzCi0JCUlET01Ob2RlIHhtbE5vZGUgPSBnZXRYTUxOb2RlKHNkUmVnaW9uKTsKLSAgICAgICAgCi0gICAgICAgIGlmKHhtbE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0JCWJvb2xlYW4gc2VsZkNsb3NlZCA9IGZhbHNlOwotCQlTdHJpbmcgdGFnTmFtZSA9IG51bGw7Ci0JCWludCBsZW5ndGggPSAwOwotCi0JCWlmICh4bWxOb2RlLmlzQ29udGFpbmVyKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0geG1sTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRSZWdpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSB4bWxOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYoIXN0YXJ0UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0gICAgCQkJCS8vIGFuYWx5emUgdGhlIHRhZyAoY2hlY2sgc2VsZiBjbG9zaW5nKQotICAgIAkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0UmVnaW9uLmdldFJlZ2lvbnMoKTsKLSAgICAJCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0gICAgCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotICAgIAkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotICAgIAkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotICAgIAkJCQkJCWxlbmd0aCsrOwotICAgIAkJCQkJfSBlbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotICAgIAkJCQkJCXRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotICAgIAkJCQkJCWxlbmd0aCArPSB0YWdOYW1lLmxlbmd0aCgpOwotICAgIAkJCQkJfSBlbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLSAgICAJCQkJCQlzZWxmQ2xvc2VkID0gdHJ1ZTsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotICAgIAotICAgIAkJCQlpZiAoIXNlbGZDbG9zZWQgJiYgdGFnTmFtZSAhPSBudWxsKSB7Ci0gICAgCQkJCQlPYmplY3RbXSBhcmdzID0ge3RhZ05hbWV9OwotICAgIAkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5NaXNzaW5nX2VuZF90YWdfLCBhcmdzKTsKLSAgICAKLSAgICAJCQkJCWludCBzdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0KCk7Ci0gICAgCQkJCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotICAgIAkJCQkJCi0gICAgCQkJCQkvL1NFVkVSSVRZX1NUUlVDVFVSRSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZCi0gICAgCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotICAgIAkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotICAgIAkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLSAgICAJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotICAgIAkJCQkJCi0gICAgCQkJCQlpZihyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpIHsKLSAgICAJCQkJCQkKLSAgICAgICAgCQkJCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IGdldFN0YXJ0RW5kRml4SW5mbyh4bWxOb2RlLCB0YWdOYW1lLCByKTsKLSAgICAgICAgCQkJCQkKLSAgICAgICAgCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuTWlzc2luZ0VuZFRhZywgYWRkaXRpb25hbEZpeEluZm8pOwotICAgICAgICAJCQkJCS8vYW5ub3RhdGlvbi5zZXRBZGRpdGlvbmFsRml4SW5mbyhhZGRpdGlvbmFsRml4SW5mbyk7Ci0gICAgICAgIAkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJCWVsc2UgewotICAgIAkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgICAgICAgICB9Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0U3RhcnRFbmRGaXhJbmZvKElET01Ob2RlIHhtbE5vZGUsIFN0cmluZyB0YWdOYW1lLCBJVGV4dFJlZ2lvbiByKSB7Ci0JCS8vIHF1aWNrIGZpeCBpbmZvCi0JCVN0cmluZyB0YWdDbG9zZSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHRhZ0Nsb3NlT2Zmc2V0ID0geG1sTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAociAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJdGFnQ2xvc2UgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCXRhZ0Nsb3NlT2Zmc2V0LS07Ci0JCX0KLQkJSURPTU5vZGUgZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgeG1sTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChmaXJzdENoaWxkICE9IG51bGwgJiYgZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlmaXJzdENoaWxkID0gKElET01Ob2RlKSBmaXJzdENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJaW50IGVuZE9mZnNldCA9IHhtbE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBmaXJzdENoaWxkU3RhcnRPZmZzZXQgPSBmaXJzdENoaWxkID09IG51bGwgPyBlbmRPZmZzZXQgOiBmaXJzdENoaWxkLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0ge3RhZ05hbWUsIHRhZ0Nsb3NlLCBuZXcgSW50ZWdlcih0YWdDbG9zZU9mZnNldCksIG5ldyBJbnRlZ2VyKHhtbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKSksIC8vIHN0YXJ0VGFnRW5kT2Zmc2V0Ci0JCQkJCW5ldyBJbnRlZ2VyKGZpcnN0Q2hpbGRTdGFydE9mZnNldCksIC8vIGZpcnN0Q2hpbGRTdGFydE9mZnNldAotCQkJCQluZXcgSW50ZWdlcihlbmRPZmZzZXQpfTsgLy8gZW5kT2Zmc2V0Ci0JCXJldHVybiBhZGRpdGlvbmFsRml4SW5mbzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTdGFydGluZ1NwYWNlRm9yUEkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotICAgICAgICAKLSAgICAgICAgaWYoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgIXByZXYuaXNEZWxldGVkKCkpIHsKLQkJCVN0cmluZyBwcmV2VGV4dCA9IHByZXYuZ2V0RnVsbFRleHQoKTsKLQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UICYmIHByZXZUZXh0LmVuZHNXaXRoKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF81OwotCQkJCWludCBzdGFydCA9IHByZXYuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJldi5nZXRMZW5ndGgoKTsKLQkJCQkKLQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtZXNzYWdlVGV4dCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCQkJCQotCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSwgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSwgbnVsbCk7Ci0JCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkKLS8vCQkJCVBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGxlbmd0aCk7Ci0vLwkJCQkKLS8vCQkJCVJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0U2NvcGUoKSk7Ci0vLwkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbihwLCBTRVZFUklUWV9TWU5UQVhfRVJST1IsIG1lc3NhZ2UsIGtleSwgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSk7Ci0vLwkJCQlyZXN1bHRzLmFkZChhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUw7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBnZXRYTUxOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHNkUmVnaW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgeE1vZGVsID0gbnVsbDsKLQkJSURPTU5vZGUgeG1sTm9kZSA9IG51bGw7Ci0JCS8vIGdldC9yZWxlYXNlIG1vZGVscyBzaG91bGQgYWx3YXlzIGJlIGluIGEgdHJ5L2ZpbmFsbHkgYmxvY2sKLQkJdHJ5IHsKLQkJCXhNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQkvLyB4TW9kZWwgaXMgc29tZXRpbWUgbnVsbCwgd2hlbiBjbG9zaW5nIGVkaXRvciwgZm9yIGV4YW1wbGUKLQkJCWlmICh4TW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE5vZGUgPSAoSURPTU5vZGUpIHhNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB4bWxOb2RlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBhIFhNTCAiZW5kIHRhZyIKLQkgKiBzaW5jZSB0aGV5J3JlIG5vdCBhbGxvd2VkIHRvIGhhdmUgYXR0cmlidXRlIElUZXh0UmVnaW9ucwotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU47Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBhbiBYTUwgUHJvY2Vzc2luZwotCSAqIEluc3RydWN0aW9uCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1BJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0gICAgICAgIGlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBYTUwgInN0YXJ0IHRhZyIKLQkgKiBzaW5jZSB0aGV5IG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IgcHJvcGVyIFhNTCBhdHRyaWJ1dGUgcmVnaW9uIHNlcXVlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOOwotCX0KLQotCS8vIEJlY2F1c2Ugd2UgY2hlY2sgdGhlICJwcm9wZXIiIGNsb3Npbmcgc2VwYXJhdGVseSBmcm9tIGF0dHJpYnV0ZQotCS8vIHNlcXVlbmNpbmcsIHdlIG5lZWQgdG8ga25vdyB3aGF0J3MKLQkvLyBhbiBhcHByb3ByaWF0ZSBjbG9zZS4KLQlwcml2YXRlIGJvb2xlYW4gaXNUYWdDbG9zZVRleHRSZWdpb24oSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIFhNTCBDb250ZW50Ci0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTENvbnRlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLSAgICAgICAgaWYoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpewotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JfQotCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXREb2N1bWVudChkb2N1bWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYoIShyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpKQotCQkJcmV0dXJuOwotCQlpZighKGdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCXJldHVybjsKLQotCQkvLyByZW1vdmUgb2xkIG1lc3NhZ2VzCi0JCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMpOwotCQkKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpZkRvY3VtZW50KS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGRpcnR5UmVnaW9uLmdldE9mZnNldCgpLCBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJdmFsaWRhdGUocmVnaW9uc1tpXSwgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoaXNTdGFydFRhZyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKLQkJCWNoZWNrRm9yQXR0cmlidXRlVmFsdWUoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayBpZiBzdGFydGVkIHRhZyBpcyBlbmRlZAotCQkJY2hlY2tTdGFydEVuZFRhZ1BhaXJzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwkJCi0JCQkvLyBjaGVjayBlbXB0eSB0YWcgPD4KLQkJCWNoZWNrRW1wdHlUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayB0aGF0IGVhY2ggYXR0cmlidXRlIGhhcyBxdW90ZXMKLQkJCWNoZWNrUXVvdGVzRm9yQXR0cmlidXRlVmFsdWVzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCB0aGUgY2xvc2luZyAnPicgaXMgdGhlcmUKLQkJCWNoZWNrQ2xvc2luZ0JyYWNrZXQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0gZWxzZSBpZiAoaXNFbmRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJY2hlY2tBdHRyaWJ1dGVzSW5FbmRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayB0aGF0IHRoZSBjbG9zaW5nICc+JyBpcyB0aGVyZQotCQkJY2hlY2tDbG9zaW5nQnJhY2tldChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfSBlbHNlIGlmIChpc1BJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIGNoZWNrIHZhbGlkaXR5IG9mIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLQkJCWNoZWNrU3RhcnRpbmdTcGFjZUZvclBJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJY2hlY2tOb05hbWVzcGFjZUluUEkoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0gZWxzZSBpZiAoaXNYTUxDb250ZW50KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCWNoZWNrRm9yU3BhY2VCZWZvcmVOYW1lKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzc5NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1hNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLk9iamVjdFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLlZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLlZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZC5YTUxEcmFnQW5kRHJvcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIE91dGxpbmUgQ29uZmlndXJhdGlvbiBmb3IgZ2VuZXJpYyBYTUwgc3VwcG9ydCwgZXhwZWN0cyB0aGF0IHRoZSB2aWV3ZXIncwotICogaW5wdXQgd2lsbCBiZSB0aGUgRE9NIE1vZGVsLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgY2xhc3MgQWN0aW9uTWFuYWdlck1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIsIElSZWxlYXNhYmxlIHsKLQkJcHJpdmF0ZSBYTUxOb2RlQWN0aW9uTWFuYWdlciBmQWN0aW9uTWFuYWdlcjsKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0JCXB1YmxpYyBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCQlmVHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCWlmIChmQWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJZkFjdGlvbk1hbmFnZXIgPSBjcmVhdGVOb2RlQWN0aW9uTWFuYWdlcihmVHJlZVZpZXdlcik7Ci0JCQl9Ci0JCQlmQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWFuYWdlciwgZlRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlI3JlbGVhc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJCWZUcmVlVmlld2VyID0gbnVsbDsKLQkJCWlmIChmQWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJZkFjdGlvbk1hbmFnZXIuc2V0TW9kZWwobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJpYnV0ZVNob3dpbmdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSkZhY2VOb2RlTGFiZWxQcm92aWRlciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG8pIHsKLQkJCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRUZXh0KG8pKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvOwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZlNob3dBdHRyaWJ1dGVzKSB7Ci0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODQ0NAotCQkJCQlpZiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCU5vZGUgaWRUeXBlZEF0dHJpYnV0ZSA9IG51bGw7Ci0JCQkJCQlOb2RlIHJlcXVpcmVkQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJCWJvb2xlYW4gaGFzSWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gaGFzTmFtZSA9IGZhbHNlOwotCQkJCQkJTm9kZSBzaG93bkF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkJCQkJCS8vIHRyeSB0byBnZXQgY29udGVudCBtb2RlbCBlbGVtZW50Ci0JCQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBudWxsOwotCQkJCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQkJCQllbGVtZW50RGVjbCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQkJLy8gZmluZCBhbiBhdHRyaWJ1dGUgb2YgdHlwZSAob3IganVzdCBuYW1lZCkKLQkJCQkJCS8vIElECi0JCQkJCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCQkJCWludCBpID0gMDsKLQkJCQkJCQl3aGlsZSAoaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgJiYgaWRUeXBlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJCQkJCU5vZGUgYXR0ciA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotCQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQkJCQkJCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLklELmVxdWFscyhhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpKSkpIHsKLQkJCQkJCQkJCQlpZFR5cGVkQXR0cmlidXRlID0gYXR0cjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCAmJiByZXF1aXJlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gYXMgYSBiYWNrdXAsIGtlZXAgdGFicyBvbgotCQkJCQkJCQkJCS8vIGFueSByZXF1aXJlZAotCQkJCQkJCQkJCS8vIGF0dHJpYnV0ZXMKLQkJCQkJCQkJCQlyZXF1aXJlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQloYXNJZCA9IGhhc0lkIHx8IGF0dHJOYW1lLmVxdWFscygiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWhhc05hbWUgPSBoYXNOYW1lIHx8IGF0dHJOYW1lLmVxdWFscygibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJKytpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLyoKLQkJCQkJCSAqIElmIG5vIHN1aXRhYmxlIGF0dHJpYnV0ZSB3YXMgZm91bmQsIHRyeSB1c2luZyBhCi0JCQkJCQkgKiByZXF1aXJlZCBhdHRyaWJ1dGUsIGlmIG5vbmUsIHRoZW4gcHJlZmVyICJpZCIgb3IKLQkJCQkJCSAqICJuYW1lIiwgb3RoZXJ3aXNlIGp1c3QgdXNlIGZpcnN0IGF0dHJpYnV0ZQotCQkJCQkJICovCi0JCQkJCQlpZiAoaWRUeXBlZEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBpZFR5cGVkQXR0cmlidXRlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocmVxdWlyZWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gcmVxdWlyZWRBdHRyaWJ1dGU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChoYXNJZCkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGhhc05hbWUpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzaG93bkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLml0ZW0oMCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGRpc3BsYXkgdGhlIGF0dHJpYnV0ZSBhbmQgdmFsdWUgKHdpdGhvdXQgcXVvdGVzKQotCQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBzaG93bkF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBhdHRyaWJ1dGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXRleHQuYXBwZW5kKCIgIiArIGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gc2hvd25BdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwgJiYgYXR0cmlidXRlVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCXRleHQuYXBwZW5kKCI9IiArIFN0cmluZ1V0aWxzLnN0cmlwKGF0dHJpYnV0ZVZhbHVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGlvbiBmb3Igd2hldGhlciBvciBub3QgdG8gZGlzcGxheSBlbGVtZW50J3MgZmlyc3QgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUb2dnbGVTaG93QXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg0NDQKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0JCXB1YmxpYyBUb2dnbGVTaG93QXR0cmlidXRlQWN0aW9uKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlLCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzAsIHN0b3JlLCBwcmVmZXJlbmNlLCB0cnVlKTsKLQkJCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCQkvLyBpbWFnZXMgbmVlZGVkCi0JCQkvLyBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihTWU5DRURfRCk7Ci0JCQkvLyAobnNkKSB0ZW1wb3JhcmlseSByZS11c2UgUHJvcGVydGllcyB2aWV3IGltYWdlCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPUF9QUykpOwotCQkJZlRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJc3VwZXIudXBkYXRlKCk7Ci0JCQlmU2hvd0F0dHJpYnV0ZXMgPSBpc0NoZWNrZWQoKTsKLQotCQkJLy8gbm90aWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjaGFuZ2UKLQkJCWVuYWJsZVNob3dBdHRyaWJ1dGVzKGZTaG93QXR0cmlidXRlcywgZlRyZWVWaWV3ZXIpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBvdXRsaW5lIHZpZXcKLQkJCWZUcmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIEFjdGlvbk1hbmFnZXJNZW51TGlzdGVuZXIgZkNvbnRleHRNZW51RmlsbGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JYm9vbGVhbiBmU2hvd0F0dHJpYnV0ZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzOwotCXByaXZhdGUgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCi0JLyoKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgU2hvdyBBdHRyaWJ1dGVzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TSE9XX0FUVFJJQlVURV9QUkVGID0gIm91dGxpbmUtc2hvdy1hdHRyaWJ1dGUtZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZU1lbnVDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXM7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODQ0NAotCQlJQ29udHJpYnV0aW9uSXRlbSBzaG93QXR0cmlidXRlSXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obmV3IFRvZ2dsZVNob3dBdHRyaWJ1dGVBY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfU0hPV19BVFRSSUJVVEVfUFJFRiwgdmlld2VyKSk7Ci0JCWl0ZW1zID0gc3VwZXIuY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnModmlld2VyKTsKLQkJaWYgKGl0ZW1zID09IG51bGwpIHsKLQkJCWl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW117c2hvd0F0dHJpYnV0ZUl0ZW19OwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgY29tYmluZWRJdGVtcywgMCwgaXRlbXMubGVuZ3RoKTsKLQkJCWNvbWJpbmVkSXRlbXNbaXRlbXMubGVuZ3RoXSA9IHNob3dBdHRyaWJ1dGVJdGVtOwotCQkJaXRlbXMgPSBjb21iaW5lZEl0ZW1zOwotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBOb2RlQWN0aW9uTWFuYWdlciB0byB1c2UgZm9yIHRoZSBnaXZlbiB0cmVlVmlld2VyLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIG5vZGUgYWN0aW9uIG1hbmFnZXIgZm9yIHVzZSB3aXRoIHRoaXMgdHJlZSB2aWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MTm9kZUFjdGlvbk1hbmFnZXIgY3JlYXRlTm9kZUFjdGlvbk1hbmFnZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgWE1MTm9kZUFjdGlvbk1hbmFnZXIoKElTdHJ1Y3R1cmVkTW9kZWwpIHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSwgdHJlZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb25maWd1cmF0aW9uIHRoYXQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QKLQkgKiB0byBzaG93IGF0dHJpYnV0ZSB2YWx1ZXMgaW4gdGhlIHRyZWUgdmlld2VyIGhhcyBjaGFuZ2VkLiBUaGUgdHJlZQotCSAqIHZpZXdlciBpcyBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlZCBhZnRlcndhcmRzIHRvIHVwZGF0ZSB0aGUgbGFiZWxzLgotCSAqIAotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLCBidXQgcmF0aGVyIHNob3VsZCByZWFjdCB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvd0F0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBzaG93IGF0dHJpYnV0ZSB2YWx1ZXMgaW4KLQkgKiAgICAgICAgICAgIHRoZSB0cmVlIHZpZXdlcgotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlU2hvd0F0dHJpYnV0ZXMoYm9vbGVhbiBzaG93QXR0cmlidXRlcywgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCS8vIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0Q29udGVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkNvbnRlbnRQcm92aWRlciA9IG5ldyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRGaWx0ZXJlZE5vZGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQotCQkJLy8gcmVwbGFjZSBhdHRyaWJ1dGUgbm9kZSBpbiBzZWxlY3Rpb24gd2l0aCBpdHMgcGFyZW50Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJbm9kZSA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkvLyByZXBsYWNlIFRleHROb2RlIGluIHNlbGVjdGlvbiB3aXRoIGl0cyBwYXJlbnQKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RmlsdGVyZWROb2RlcyhPYmplY3RbXSBmaWx0ZXJlZE5vZGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWROb2Rlcy5sZW5ndGg7IGkrKykgewotCQkJZmlsdGVyZWROb2Rlc1tpXSA9IGdldEZpbHRlcmVkTm9kZShmaWx0ZXJlZE5vZGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyZWROb2RlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldExhYmVsUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmTGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmTGFiZWxQcm92aWRlciA9IG5ldyBBdHRyaWJ1dGVTaG93aW5nTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldE1lbnVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGV4dE1lbnVGaWxsZXIgPT0gbnVsbCkgewotCQkJZkNvbnRleHRNZW51RmlsbGVyID0gbmV3IEFjdGlvbk1hbmFnZXJNZW51TGlzdGVuZXIodmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHRNZW51RmlsbGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVNlbGVjdGlvbiBmaWx0ZXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBmaWx0ZXJlZE5vZGVzID0gZ2V0RmlsdGVyZWROb2RlcygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSk7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbHRlcmVkTm9kZXMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkvLyBlbXVsYXRlIHRoZSBYTUxEcmFnQW5kRHJvcE1hbmFnZXIKLQkJCWZpbmFsIFZpZXdlckRyYWdBZGFwdGVyIGRyYWdBZGFwdGVyID0gbmV3IFZpZXdlckRyYWdBZGFwdGVyKHRyZWVWaWV3ZXIpOwotCQkJZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9IG5ldyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltde25ldyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyYWdBZGFwdGVyLmRyYWdGaW5pc2hlZChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyYWdBZGFwdGVyLmRyYWdTZXREYXRhKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyYWdBZGFwdGVyLmRyYWdTdGFydChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQkJCQlyZXR1cm4gT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQl9fTsKLQkJfQotCi0JCXJldHVybiBmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBnZXRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmIChmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID09IG51bGwpIHsKLQkJCS8vIGVtdWxhdGUgdGhlIFhNTERyYWdBbkRyb3BNYW5hZ2VyCi0JCQlmaW5hbCBWaWV3ZXJEcm9wQWRhcHRlciBkcm9wQWRhcHRlciA9IG5ldyBWaWV3ZXJEcm9wQWRhcHRlcih0cmVlVmlld2VyLCBuZXcgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyKCkpOwotCQkJZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9IG5ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltde25ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyb3BBZGFwdGVyLmRyYWdFbnRlcihldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcmFnTGVhdmUoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcmFnT3BlcmF0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWRyb3BBZGFwdGVyLmRyYWdPdmVyKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcm9wKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcm9wQWNjZXB0KGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJcmV0dXJuIGdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQkJcmV0dXJuIGZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiN1bmNvbmZpZ3VyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIudW5jb25maWd1cmUodmlld2VyKTsKLQkJZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9IG51bGw7Ci0JCWZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPSBudWxsOwotCQlpZiAoZkNvbnRleHRNZW51RmlsbGVyICE9IG51bGwpIHsKLQkJCWZDb250ZXh0TWVudUZpbGxlci5yZWxlYXNlKCk7Ci0JCQlmQ29udGV4dE1lbnVGaWxsZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL3Byb3BlcnRpZXMvWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NzgwNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL3Byb3BlcnRpZXMvWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSBzaGVldCBwYWdlIHdoaWNoIHNob3dzIFhNTCBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBjbGFzcyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjYWNoZUNsZWFyZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjYWNoZVVwZGF0ZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBmaW5hbCBTdHJpbmcgdXJpLCBpbnQgb2xkU3RhdHVzLCBpbnQgbmV3U3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJCWlmIChuZXdTdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FERUQgfHwgbmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpIHsKLQkJCQlyZWZyZXNoUGFnZXMoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJaWYgKGNtRG9jdW1lbnRNYW5hZ2VyLmdldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQpKSB7Ci0JCQkJcmVmcmVzaFBhZ2VzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVmcmVzaFBhZ2VzKCkgewotCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5zY2hlZHVsZShQcm9wZXJ0aWVzUmVmcmVzaEpvYi5VUERBVEVfREVMQVkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0aWVzUmVmcmVzaEpvYiBleHRlbmRzIFVJSm9iIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0RFTEFZID0gMjAwOwotCi0JCXByaXZhdGUgU2V0IHByb3BlcnR5U2hlZXRQYWdlcyA9IG51bGw7Ci0KLQkJcHVibGljIFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5KRmFjZU5vZGVBZGFwdGVyXzEpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcyA9IG5ldyBIYXNoU2V0KDEpOwotCQl9Ci0KLQkJdm9pZCBhZGRQcm9wZXJ0eVNoZWV0UGFnZShJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmFkZChwYWdlKTsKLQkJCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJT2JqZWN0W10gcGFnZXMgPSBwcm9wZXJ0eVNoZWV0UGFnZXMudG9BcnJheSgpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmNsZWFyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBwYWdlc1tpXTsKLQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFhNTFByb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBYTUxQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElOb2RlTm90aWZpZXIgZlNvdXJjZSA9IG51bGw7Ci0KLQkJcHVibGljIElQcm9wZXJ0eVNvdXJjZSBnZXRQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoZlNvdXJjZSAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoZlNvdXJjZSkpIHsKLQkJCQlyZXR1cm4gZlByb3BlcnR5U291cmNlOwotCQkJfQotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlmU291cmNlID0gKElOb2RlTm90aWZpZXIpIG9iamVjdDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSAoSVByb3BlcnR5U291cmNlKSBmU291cmNlLmdldEFkYXB0ZXJGb3IoSVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJCQlpZiAoZlByb3BlcnR5U291cmNlID09IG51bGwpIHsKLQkJCQkJZlByb3BlcnR5U291cmNlID0gbmV3IFhNTFByb3BlcnR5U291cmNlKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTb3VyY2UgPSBudWxsOwotCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZlByb3BlcnR5U291cmNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVySW1wbCBmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciA9IG5ldyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVySW1wbCgpOwotCXByaXZhdGUgUHJvcGVydGllc1JlZnJlc2hKb2IgZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbnVsbDsKLQlJUHJvcGVydHlTaGVldFBhZ2UgZlByb3BlcnR5U2hlZXRQYWdlID0gbnVsbDsKLQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIElOb2RlQWRhcHRlciBmUmVmcmVzaEFkYXB0ZXIgPSBuZXcgWE1MUHJvcGVydHlTaGVldFJlZnJlc2hBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBDTURvY3VtZW50TWFuYWdlcltdIGZTZWxlY3RlZENNRG9jdW1lbnRNYW5hZ2VycyA9IG5ldyBDTURvY3VtZW50TWFuYWdlclswXTsKLQlwcml2YXRlIElOb2RlTm90aWZpZXJbXSBmU2VsZWN0ZWROb3RpZmllcnMgPSBuZXcgSU5vZGVOb3RpZmllclswXTsKLQotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBYTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBYTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRJbnB1dFNlbGVjdGlvbihJV29ya2JlbmNoUGFydCBzZWxlY3RpbmdQYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZlNlbGVjdGVkTm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkTm90aWZpZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzW2ldLnJlbW92ZUFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCX0KLQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IG51bGw7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWZTZWxlY3RlZENNRG9jdW1lbnRNYW5hZ2Vyc1tpXS5yZW1vdmVMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQotCQlJU2VsZWN0aW9uIHByZWZlcnJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJCS8qCi0JCQkgKiBPbiBBdHRyIG5vZGVzLCBzZWxlY3QgdGhlIG93bmVyIEVsZW1lbnQuIE9uIFRleHQgbm9kZXMsIHNlbGVjdAotCQkJICogdGhlIHBhcmVudCBFbGVtZW50LgotCQkJICovCi0JCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSBuZXcgT2JqZWN0W3N0cnVjdHVyZWRTZWwuc2l6ZSgpXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RydWN0dXJlZFNlbC50b0FycmF5KCksIDAsIHNlbGVjdGVkT2JqZWN0cywgMCwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBpbm9kZSA9IHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpbm9kZTsKLQkJCQkJLy8gcmVwbGFjZSBBdHRyaWJ1dGUgTm9kZSB3aXRoIGl0cyBvd25lcgotCQkJCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50IG93bmVyRWxlbWVudCA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBvd25lckVsZW1lbnQ7Ci0JCQkJCX0KLQkJCQkJLy8gcmVwbGFjZSBUZXh0IE5vZGUgd2l0aCBpdHMgcGFyZW50Ci0JCQkJCWVsc2UgaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgfHwgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpICYmIHBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkJc2VsZWN0ZWRPYmplY3RzW2ldID0gcGFyZW50Tm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJU2V0IG1hbmFnZXJzID0gbmV3IEhhc2hTZXQoMSk7Ci0JCQkJU2V0IHNlbGVjdGVkTm90aWZpZXJzID0gbmV3IEhhc2hTZXQoMSk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJTW9kZWxRdWVyeSBxdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKChOb2RlKSBzZWxlY3RlZE9iamVjdHNbaV0pLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCQkJCUNNRG9jdW1lbnRNYW5hZ2VyIG1nciA9IHF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJCQkJCW1hbmFnZXJzLmFkZChtZ3IpOwotCQkJCQkJCQltZ3IuYWRkTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiBBZGQgVUkgcmVmcmVzaCBhZGFwdGVycyBhbmQgcmVtZW1iZXIgbm90aWZpZXJzIGZvcgotCQkJCQkgKiBsYXRlciByZW1vdmFsCi0JCQkJCSAqLwotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJc2VsZWN0ZWROb3RpZmllcnMuYWRkKHNlbGVjdGVkT2JqZWN0c1tpXSk7Ci0JCQkJCQkoKElOb2RlTm90aWZpZXIpIHNlbGVjdGVkT2JqZWN0c1tpXSkuYWRkQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZTZWxlY3RlZENNRG9jdW1lbnRNYW5hZ2VycyA9IChDTURvY3VtZW50TWFuYWdlcltdKSBtYW5hZ2Vycy50b0FycmF5KG5ldyBDTURvY3VtZW50TWFuYWdlclttYW5hZ2Vycy5zaXplKCldKTsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnMgPSAoSU5vZGVOb3RpZmllcltdKSBzZWxlY3RlZE5vdGlmaWVycy50b0FycmF5KG5ldyBJTm9kZU5vdGlmaWVyW3NlbGVjdGVkTm90aWZpZXJzLnNpemUoKV0pOwotCQkJfQotCi0KLQkJCXByZWZlcnJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkT2JqZWN0cyk7Ci0JCX0KLQkJcmV0dXJuIHByZWZlcnJlZFNlbGVjdGlvbjsKLQl9Ci0KLQlQcm9wZXJ0aWVzUmVmcmVzaEpvYiBnZXRQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJaWYgKGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydGllc1JlZnJlc2hKb2IgPSBuZXcgUHJvcGVydGllc1JlZnJlc2hKb2IoKTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnRpZXNSZWZyZXNoSm9iOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCWlmIChmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydHlTaGVldFBhZ2UgPSBwYWdlOwotCQkJZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBuZXcgWE1MUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlzdXBlci51bmNvbmZpZ3VyZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZENNRG9jdW1lbnRNYW5hZ2Vycy5sZW5ndGg7IGkrKykgewotCQkJZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzW2ldLnJlbW92ZUxpc3RlbmVyKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCQlmUHJvcGVydHlTaGVldFBhZ2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxYWVmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy5jb21tZW50Lm5hbWU9Y29tbWVudAotVGVtcGxhdGVzLmNvbW1lbnQuZGVzYz14bWwgY29tbWVudAotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLm5hbWU9eG1sIGRlY2xhcmF0aW9uCi1UZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24uZGVzYz14bWwgZGVjbGFyYXRpb24KLVRlbXBsYXRlcy54c2xwaS5uYW1lPVhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi1UZW1wbGF0ZXMueHNscGkuZGVzYz1YU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2QyMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dGVtcGxhdGVzPgotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24ubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24uZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uIiBjb250ZXh0PSJ4bWxfbmV3IiBlbmFibGVkPSJ0cnVlIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSI/Jmd0OzwvdGVtcGxhdGU+Ci08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5jb21tZW50Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmNvbW1lbnQuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLmNvbW1lbnQiIGNvbnRleHQ9InhtbF90YWciIGVuYWJsZWQ9InRydWUiPiZsdDshLS0gJHtjdXJzb3J9IC0tJmd0OzwvdGVtcGxhdGU+Ci08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54c2xwaS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54c2xwaS5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMueHNscGkiIGNvbnRleHQ9InhtbF90YWciIGVuYWJsZWQ9InRydWUiPiZsdDs/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9IiR7Y3Vyc29yfSI/Jmd0OzwvdGVtcGxhdGU+Ci0KLTwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYWFkZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMtY29udGVudG1vZGVsIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjLXZhbGlkYXRpb24iIGtpbmQ9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMiIGtpbmQ9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiIGtpbmQ9ImNvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIGtpbmQ9ImNvbiI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9ImJpbiIga2luZD0ib3V0cHV0Ii8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RkN2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZjhlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2QuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YmFjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGEzZjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJV9VSV9QTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLlhTRENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS54c2Q7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi44LjAsMi45LjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFiYTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMtY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLyxcCi0gICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzMyYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1MIFNjaGVtYSBWYWxpZGF0b3IKLQotIQotISBQbHVnaW4KLSEKLV9VSV9QTFVHSU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWFNEIENvcmUgUGx1Z2luCi1YU0RfQ29udGVudF9UeXBlPVhTRAotCi1fVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IgICAgICAgICAgICAgICAgICA9IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi1fVUlfWEVSQ0VTX1ZBTElEQVRPUl9ERUxFR0FURSAgICAgICAJICA9IFhlcmNlcy1iYXNlZCBYTUwgU2NoZW1hIFZhbGlkYXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmFmMDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVYU0RfQ29udGVudF9UeXBlIgotCQkJaWQ9InhzZHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiCi0JCQlmaWxlLWV4dGVuc2lvbnM9InhzZCIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJ4c2QiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuQ01Eb2N1bWVudEZhY3RvcnlYU0QiPgotCQk8L2ZhY3Rvcnk+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgWFNEIHZhbGlkYXRvciB3aXRoIHRoZSB2YWxpZGF0aW9uIAkJLS0+Ci0JPCEtLSBmcmFtZXdvcmsuIAkJCQkJCQkJCQkgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0ieHNkVmFsaWRhdG9yIgotCQluYW1lPSIlX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLQkJPHZhbGlkYXRvcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0JCQkJbmFtZUZpbHRlcj0iKi54c2QiPgotCQkJPC9maWx0ZXI+Ci0JCQkKLQkJCTxoZWxwZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5IZWxwZXIiPgotCQkJPC9oZWxwZXI+Ci0JCQkKLQkJCTxydW4KLSAgICAgICAgIGFzeW5jPSJ0cnVlIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuWFNERGVsZWdhdGluZ1ZhbGlkYXRvciIKLSAgICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgICBmdWxsQnVpbGQ9InRydWUiCi0gICAgICAgICBpbmNyZW1lbnRhbD0idHJ1ZSI+Ci0JCQk8L3J1bj4KLSAgICAgICA8IS0tIDxtYXJrZXJJZCBtYXJrZXJJZFZhbHVlPSJvcmcuZWNsaXBzZS54c2QuZGlhZ25vc3RpYyIvPi0tPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yRGVsZWdhdGVzIj4KLSAgICAJPGRlbGVnYXRlCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiCi0JCQluYW1lPSIlX1VJX1hFUkNFU19WQUxJREFUT1JfREVMRUdBVEUiCi0gICAgICAgIAl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuWFNERGVsZWdhdGluZ1ZhbGlkYXRvciIvPgotCSA8L2V4dGVuc2lvbj4KLQkgCi0JIDwhLS0gaW5pdGlhbGl6ZSB4bWwgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNRG9jdW1lbnRGYWN0b3J5WFNELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNRG9jdW1lbnRGYWN0b3J5WFNELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTNlZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci0KLS8qKgotICogIFRoaXMgYnVpbGRlciBoYW5kbGVzIGJ1aWxkaW5nIC5kdGQgLyAueHNkIGdyYW1tYXIgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRGYWN0b3J5WFNEIGltcGxlbWVudHMgQ01Eb2N1bWVudEZhY3RvcnkKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX0ZJTEVfVFlQRSA9ICJYU0QiOwotCi0gIHB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVhTRCgpIAotICB7ICAKLSAgICAvLyBoZXJlIHdlIGNhbGwgaW5pdCBvbiB0aGUgWFNEIGFuZCBEVEQgcGFja2FnZXMgdG8gYXZvaWQgc3RyYW5nZSBpbml0aWFsaXphdGlvbiBidWdzCi0gICAgLy8KLSAgICBYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0gICAgWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNERmFjdG9yeSgpOyAgCi0gIH0KLQotIAotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAJCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBYU0RJbXBsLmJ1aWxkQ01Eb2N1bWVudCh1cmkpOyAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGE2NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIENNTm9kZQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OID0gImRvY3VtZW50YXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRSA9ICJkb2N1bWVudGF0aW9uU291cmNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9MQU5HVUFHRSA9ICJkb2N1bWVudGF0aW9uTGFuZ3VhZ2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9NT0ZfTk9USUZJRVIgPSAia2V5IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uSW5mbyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT04gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmluaXRpb24iOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLSAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUik7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvYmplY3QpCi0gIHsKLQkgIC8vbm8gcHJvcGVydHllcyBzdXBwb3J0ZWQ/IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRENNTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RDTU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2ZjQ1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRENNTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBYU0RDTU1hbmFnZXIgZXh0ZW5kcyBQbHVnaW4gCi17Ci0gIHByaXZhdGUgc3RhdGljIFhTRENNTWFuYWdlciBpbnN0YW5jZTsKLSAgCi0gIHB1YmxpYyBYU0RDTU1hbmFnZXIoKSAKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNEQ01NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYU0RDTU1hbmFnZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gIHsKLSAgICBYU0RUeXBlVXRpbC5pbml0aWFsaXplKCk7Ci0gICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5mZXJyZWRHcmFtbWFyRmFjdG9yeShuZXcgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeUltcGwoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNESW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODcyZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01EYXRhVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTURvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRW50aXR5RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbC5YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb250ZW50VHlwZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RTY2hlbWFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYnVpbGQgY21ub2RlcyBmcm9tIFhNTCBTY2hlbWEgbm9kZXMuIFRoZSBYTUwgU2NoZW1hIG1vZGVsIGlzCi0gKiBmb3VuZCBpbiB0aGUgb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAqIAotICogVE9ETzogZ2V0TmFtZXNwYWNlVVJJKCljdXJyZW50bHkgYWx3YXlzIHJldHVybnMgJyMjYW55Jy4KLSAqLwotcHVibGljIGNsYXNzIFhTREltcGwKLXsKLSAgLyoKLSAgICogcHJvcGVydGllcyBjb21tb24gdG8gYWxsIGNtbm9kZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4KLSAgICogQ01Ob2RlSW1wbCBjbGFzczogUFJPUEVSVFlfRE9DVU1FTlRBVElPTiBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRQotICAgKiBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFIFBST1BFUlRZX01PRl9OT1RJRklFUgotICAgKiBQUk9QRVJUWV9ERUZJTklUSU9OX0lORk8gUFJPUEVSVFlfREVGSU5JVElPTgotICAgKiAKLSAgICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcywgWFNESW1wbDoKLSAgICogUFJPUEVSVFlfQ01ET0NVTUVOVCBQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TCi0gICAqIFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUgUFJPUEVSVFlfTlNfUFJFRklYX1FVQUxJRklDQVRJT04KLSAgICogUFJPUEVSVFlfTklMTEFCTEUgUFJPUEVSVFlfU1BFQwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ01ET0NVTUVOVCA9ICJDTURvY3VtZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVNFU19MT0NBTF9FTEVNRU5UX0RFQ0xBUkFUSU9OUyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdXNlc0xvY2FsRWxlbWVudERlY2xhcmF0aW9ucyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2lzTmFtZVNwYWNlQXdhcmUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTiA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbnNQcmVmaXhRdWFsaWZpY2F0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTklMTEFCTEUgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25pbGxhYmxlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1BFQyA9ICJzcGVjIjsKLSAgLyoKLSAgICogcHJvcGVydGllcyBjb21tb24gdG8gYWxsIENNRG9jdW1lbnQgbm9kZXM6IFBST1BFUlRZX1RBUkdFVF9OQU1FU1BBQ0VfVVJJCi0gICAqIFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPIFBST1BFUlRZX05BTUVTUEFDRV9JTkZPCi0gICAqIFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUIFBST1BFUlRZX0FOTk9UQVRJT05fTUFQCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSU1QT1JURURfTkFNRVNQQUNFX0lORk8gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2ltcG9ydGVkTmFtZXNwYWNlSW5mbyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUVTUEFDRV9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uYW1lc3BhY2VJbmZvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRUxFTUVOVF9GT1JNX0RFRkFVTFQgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2VsZW1lbnRGb3JtRGVmYXVsdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FOTk9UQVRJT05fTUFQID0gImFubm90YXRpb25NYXAiOwotICAvKgotICAgKiBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgQ01FbGVtZW50RGVjbGFyYXRpb24gbm9kZXM6IFBST1BFUlRZX1hTSVRZUEVTCi0gICAqIFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTiBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVAKLSAgICogUFJPUEVSVFlfQUJTVFJBQ1QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hTSVRZUEVTID0gIlhTSVR5cGVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gIkRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVAgPSAiU3Vic3RpdHV0aW9uR3JvdXAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BQlNUUkFDVCA9ICJBYnN0cmFjdCI7Ci0gIC8qKgotICAgKiBEZWZpbml0aW9uIGluZm8gZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5JVElPTl9JTkZPX0dMT0JBTCA9ICJnbG9iYWwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OX0lORk9fTE9DQUwgPSAibG9jYWwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTEFOR19BVFRSSUJVVEUgPSAieG1sOmxhbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QUk9UT0NPTCA9ICJwbGF0Zm9ybToiOwotICBwcm90ZWN0ZWQgc3RhdGljIFhTREFkYXB0ZXJGYWN0b3J5SW1wbCB4c2RBZGFwdGVyRmFjdG9yeUltcGwgPSBuZXcgWFNEQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgWFNJRG9jdW1lbnQgeHNpRG9jdW1lbnQgPSBuZXcgWFNJRG9jdW1lbnQoKTsKLQotICAvKioKLSAgICogR2l2ZW4gdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50LCBwYXJzZSB0aGUgZG9jdW1lbnQgYW5kIGJ1aWxkCi0gICAqIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtCi0gICAqICAgICAgICAgIHRoZSB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQKLSAgICogQHBhcmFtIGdyYW1tYXJFcnJvckNoZWNraW5nIC0KLSAgICogICAgICAgICAgZ3JhbW1hciBlcnJvciBjaGVja2luZyBmbGFnCi0gICAqIEBwYXJhbSBlcnJvckxpc3QgLQotICAgKiAgICAgICAgICB0aGUgcmVzdWx0aW5nIGVycm9yIGxpc3QKLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIEBkZXByZWNhdGVkIC0tIHVzZSBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSwgaW50IGdyYW1tYXJFcnJvckNoZWNraW5nLCBMaXN0IGVycm9yTGlzdCkKLSAgewotICAgIHJldHVybiBidWlsZENNRG9jdW1lbnQodXJpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLSAgICogY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgdGhlIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudAotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSkKLSAgewotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG51bGw7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGJ1aWxkWFNETW9kZWwodXJpKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIHJldHVybiBjbURvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudCwgcGFyc2UgdGhlIGRvY3VtZW50IGFuZCBidWlsZAotICAgKiBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgLQotICAgKiAgICAgICAgICB0aGUgdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50Ci0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYU0RTY2hlbWEgYnVpbGRYU0RNb2RlbChTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gaWYgWE1MIFNjaGVtYSBmb3IgU2NoZW1hIGlzIHJlcXVlc3RlZCwgZ2V0IGl0IHRocm91Z2ggc2NoZW1hIG1vZGVsIAotICAgICAgaWYgKHVyaVN0cmluZy5lbmRzV2l0aCgiMjAwMS9YTUxTY2hlbWEueHNkIikpCi0gICAgICB7Ci0gICAgICAJeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsJCQkKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgCQotICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICAgICAgLy9yZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAKLSAgICAgICAgVVJJIHVyaSA9IGNyZWF0ZVVSSSh1cmlTdHJpbmcpOyAgIAotICAgICAgICAKLSAgICAgICAgLy8gQ1MgOiBidWcgMTEzNTM3IGVuc3VyZSB3ZSBwZXJmb3JtIHBoeXNpY2FsIHJlc29sdXRpb24gYmVmb3JlIG9wZW5pbmcgYSBzdHJlYW0gZm9yIHRoZSByZXNvdXJjZQotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgcGh5c2ljYWxMb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oIiIsICIiLCB1cmlTdHJpbmcpOyAgICAgICAKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKHBoeXNpY2FsTG9jYXRpb24pKTsKLSAgICAgICAgWFNEUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLnhzZCIpKTsKLSAgICAgICAgcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0gICAgICAgIHJlc291cmNlLmxvYWQoaW5wdXRTdHJlYW0sIG51bGwpOyAgICAgICAgIAotICAgICAgICB4c2RTY2hlbWEgPSByZXNvdXJjZS5nZXRTY2hlbWEoKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotICAKLSAgLy8gVE9ETyAuLi4gbG9va3MgbGlrZSB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2xhc3M/Ci0gIC8vCi0gIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFVSSUNvbnZlcnRlciBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwKLSAgewotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBjcmVhdGVVUkxJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAoImh0dHAiLmVxdWFscyh1cmkuc2NoZW1lKCkpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdGhlVVJJID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBtYXBwZWQgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUodGhlVVJJLCB0aGVVUkksIHRoZVVSSSk7Ci0gICAgICAgIGlmIChtYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9IGNyZWF0ZVVSSShtYXBwZWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuY3JlYXRlVVJMSW5wdXRTdHJlYW0odXJpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBhcHByb3ByaWF0ZSBVUkkgYmFzZWQgb24gYSB1cmkgc3RyaW5nLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVN0cmluZyAtCi0gICAqICAgICAgICAgIGEgdXJpIHN0cmluZy4KLSAgICogQHJldHVybiBhbiBhcHByb3ByaWF0ZSBVUkkgYmFzZWQgb24gYSB1cmkgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICBpZiAoaGFzUHJvdG9jb2wodXJpU3RyaW5nKSkKLSAgICAgIHJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKHVyaVN0cmluZyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOwotICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlJ0MnIGluICdDOi8nIGlzIG5vdCBpbnRlcnByZXRlZCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBzdHJpbmcgYmVnaW5zIHdpdGggcGxhdGZvcm0gcHJvdG9jb2wuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLSAgICogICAgICAgICAgYSB1cmkgc3RyaW5nLgotICAgKiBAcmV0dXJuIHRydWUgaWYgc3RyaW5nIGJlZ2lucyB3aXRoIHBsYXRmb3JtIHByb3RvY29sLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHdpdGhQbGF0Zm9ybVByb3RvY29sKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gdXJpU3RyaW5nLnN0YXJ0c1dpdGgoUExBVEZPUk1fUFJPVE9DT0wpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAqIAotICAgKiBAcGFyYW0gY29tcG9uZW50IC0KLSAgICogICAgICAgICAgYSBjb25jcmV0ZSBjb21wb25lbnQuCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluT2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtaW5PY2N1ciA9IDE7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEUGFydGljbGUpIG8pLmlzU2V0TWluT2NjdXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5PY2N1ciA9ICgoWFNEUGFydGljbGUpIG8pLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXIgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWluT2NjdXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgLQotICAgKiAgICAgICAgICBhIGNvbmNyZXRlIGNvbXBvbmVudC4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRNYXhPY2N1cnMoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaW50IG1heE9jY3VyID0gMTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RQYXJ0aWNsZSkgbykuaXNTZXRNYXhPY2N1cnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heE9jY3VyID0gKChYU0RQYXJ0aWNsZSkgbykuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhPY2N1ciA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXhPY2N1cjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZSAtCi0gICAqICAgICAgICAgIGEgdHlwZSBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9OQU1FX0JPT0xFQU4gPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9WQUxVRV9GQUxTRT0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsgICAgICAgICAKLSAgICAgIGlmIChUWVBFX05BTUVfQk9PTEVBTi5lcXVhbHModHlwZS5nZXROYW1lKCkpICYmIHR5cGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkgPT0gdHlwZS5nZXRTY2hlbWEoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZChUWVBFX1ZBTFVFX1RSVUUpOwotICAgICAgICByZXN1bHQuYWRkKFRZUEVfVkFMVUVfRkFMU0UpOwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgIAotICAgICAgICBMaXN0IGVudW1lcmF0aW9uRmFjZXRzID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZW51bWVyYXRpb25GYWNldHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaS5uZXh0KCk7Ci0gICAgICAgICAgTGlzdCB2YWx1ZXMgPSBlbnVtRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSB2YWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gai5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQuYWRkKG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICBTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV07Ci0gICAgcmVzdWx0LnRvQXJyYXkoYXJyYXkpOwotICAgIHJldHVybiBhcnJheTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4gV29ya2luZwotICAgKiB3aXRoIGRvY3VtZW50YXRpb24gZWxlbWVudHMgcmVxdWlyZXMgZHJvcHBpbmcgZG93biBpbnRvIHRoZSBET00gbW9kZWwuCi0gICAqIAotICAgKiBAcGFyYW0gYW5ub3RhdGlvbiAtCi0gICAqICAgICAgICAgIGFuIFhTREFubm90YXRpb24gbm9kZS4KLSAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9ucyhYU0RBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gIHsKLSAgICBDTU5vZGVMaXN0SW1wbCBkb2N1bWVudGF0aW9ucyA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBkb2N1bWVudGF0aW9uc0VsZW1lbnRzID0gYW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRvY3VtZW50YXRpb25zRWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9ucy5nZXRMaXN0KCkuYWRkKG5ldyBEb2N1bWVudGF0aW9uSW1wbCgoRWxlbWVudCkgaS5uZXh0KCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRvY3VtZW50YXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkYXB0ZWQgZnJvbSBwdWJsaWMgc3RhdGljIExpc3QgZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEU2NoZW1hIHNjaGVtYSwKLSAgICogU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkgaW4gY2xhc3MgWFNEU2NoZW1hUXVlcnlUb29scyBmb3VuZCBpbgotICAgKiBvcmcuZWNsaXBzZS54c2QgcGx1Z2luLgotICAgKiAKLSAgICogRmluZCB0eXBlRGVmaW5pdGlvbnMgdGhhdCBkZXJpdmUgZnJvbSBhIGdpdmVuIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZQotICAgKiAgICAgICAgICB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHJldHVybiBMaXN0IG9mIGFueSBYU0RUeXBlRGVmaW5pdGlvbnMgZm91bmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBmaW5kVHlwZXNEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgQXJyYXlMaXN0IHR5cGVzRGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdHlwZS5nZXRTY2hlbWEoKTsKLSAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgIGlmICgobnVsbCAhPSBzY2hlbWEpICYmIChudWxsICE9IGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIC8vIEEgaGFuZHkgY29udmVuaWVuY2UgbWV0aG9kIHF1aWNrbHkgZ2V0cyBhbGwKLSAgICAgICAgLy8gdHlwZURlZmluaXRpb25zIHdpdGhpbiBvdXIgc2NoZW1hOyBub3RlIHRoYXQKLSAgICAgICAgLy8gd2hldGhlciBvciBub3QgdGhpcyByZXR1cm5zIHR5cGVzIGluIGluY2x1ZGVkLAotICAgICAgICAvLyBpbXBvcnRlZCwgb3IgcmVkZWZpbmVkIHNjaGVtYXMgaXMgc3ViamVjdCB0byBjaGFuZ2UKLSAgICAgICAgTGlzdCB0eXBlZGVmcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWRlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZWRlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHR5cGVkZWYgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkKLSAgICAgICAgICAgIC8vIG9mIHRoZW0gbWF0Y2ggdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAgICAgICAgIGlmIChpc1R5cGVEZXJpdmVkRnJvbSh0eXBlZGVmLCBuYW1lc3BhY2UsIGxvY2FsTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGl0LCByZXR1cm4gdGhlIG9yaWdpbmFsIG9uZSBhbmQgY29udGludWUKLSAgICAgICAgICAgICAgdHlwZXNEZXJpdmVkRnJvbS5hZGQodHlwZWRlZik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHlwZXNEZXJpdmVkRnJvbTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVHlwZURlcml2ZWRGcm9tKFhTRFR5cGVEZWZpbml0aW9uCi0gICAqIHR5cGVkZWYsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIGluIGNsYXNzIFhTRFNjaGVtYVF1ZXJ5VG9vbHMKLSAgICogZm91bmQgaW4gb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAgICogCi0gICAqIFJlY3Vyc2l2ZSB3b3JrZXIgbWV0aG9kIHRvIGZpbmQgdHlwZURlZmluaXRpb25zIHRoYXQgZGVyaXZlIGZyb20gYSBuYW1lZAotICAgKiB0eXBlLgotICAgKiAKLSAgICogQHNlZSAjZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEU2NoZW1hLCBTdHJpbmcsIFN0cmluZykKLSAgICogQHBhcmFtIHR5cGVEZWYKLSAgICogICAgICAgICAgdG8gc2VlIGlmIGl0J3MgZGVyaXZlZCBmcm9tCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICogICAgICAgICAgZm9yIHRoZSB0eXBlIGRlcml2ZWQgZnJvbQotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqICAgICAgICAgIGZvciB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzOyBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1R5cGVEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlZGVmLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkKLSAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlZGVmLmdldEJhc2VUeXBlKCk7Ci0gICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAJewotICAgICAgLy8gdHlwZWRlZiBpcyBhIHJvb3QgdHlwZSBsaWtlIHhzZDphbnlUeXBlLCBzbyBpdCBoYXMgbm8gYmFzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBBcyB0aGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpZiBvdXIgcGFyYW1ldGVycyBtYXRjaAotICAgIGlmIChiYXNlVHlwZS5oYXNOYW1lQW5kVGFyZ2V0TmFtZXNwYWNlKGxvY2FsTmFtZSwgbmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcm9vdFR5cGUgPSB0eXBlZGVmLmdldFJvb3RUeXBlKCk7Ci0gICAgaWYgKHJvb3RUeXBlID09IGJhc2VUeXBlKQotICAgIHsKLSAgICAgIC8vIElmIHdlJ3ZlIGhpdCB0aGUgcm9vdCwgd2UgYXJlbid0IGRlcml2ZWQgZnJvbSBpdAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gT3RoZXJ3aXNlIGNvbnRpbnVlIHRvIHRyYXZlcnNlIHVwd2FyZHMKLSAgICAgIHJldHVybiBpc1R5cGVEZXJpdmVkRnJvbShiYXNlVHlwZSwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGNtbm9kZSBvZiB0aGUgc3BlY2lmaWVkIFhNTCBTY2hlbWEgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXQgLQotICAgKiAgICAgICAgICBhbiBYTUwgU2NoZW1hIG5vZGUKLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBjbW5vZGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNTm9kZSBnZXRBZGFwdGVyKE5vdGlmaWVyIG8pCi0gIHsKLSAgICByZXR1cm4gKENNTm9kZSkgeHNkQWRhcHRlckZhY3RvcnlJbXBsLmFkYXB0KG8pOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkYXB0ZWQgZnJvbSBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbnMsIGJvb2xlYW4gd2l0aENvbG9uKSBpbiBjbGFzcwotICAgKiBUeXBlc0hlbHBlciBmb3VuZCBpbiBvcmcuZWNsaXBzZS53c3QueHNkLmVkaXRvciBwbHVnaW4uCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIC0KLSAgICogICAgICAgICAgdGhlIHJlbGV2YW50IHNjaGVtYQotICAgKiBAcGFyYW0gbnMgLQotICAgKiAgICAgICAgICB0aGUgcmVsZXZhbnQgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIG5zKQotICB7Ci0gICAgU3RyaW5nIGtleSA9ICIiOwotICAgIGlmICgoc2NoZW1hICE9IG51bGwpICYmIChucyAhPSBudWxsKSkKLSAgICB7Ci0gICAgICBNYXAgbWFwID0gc2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGtleU9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBtYXAuZ2V0KGtleU9iaik7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKG5zKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChrZXlPYmogIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSBrZXlPYmoudG9TdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtleSA9ICIiOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4ga2V5OwotICB9Ci0gIC8qKgotICAgKiBUaGUgRmFjdG9yeSBmb3IgdGhlIFhTRCBhZGFwdGVyIG1vZGVsLiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2gKLSAgICogbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi0gIHsKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkKLSAgICB7Ci0gICAgICBYU0RTd2l0Y2ggeHNkU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFdpbGRjYXJkKFhTRFdpbGRjYXJkIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNEV2lsZGNhcmRBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlVXNlKFhTREF0dHJpYnV0ZVVzZSBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hKFhTRFNjaGVtYSBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRFNjaGVtYUFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIE9iamVjdCBvID0geHNkU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotICAgICAgQWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQWRhcHRlcikgbzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgVGhyZWFkLmR1bXBTdGFjaygpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpCi0gICAgewotICAgICAgcmV0dXJuIGFkYXB0KHRhcmdldCwgdGhpcyk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RCYXNlQWRhcHRlciAtLSBhbiBhYnN0cmFjdCBiYXNlIG5vZGUgaW4gdGhlIG1vZGVsLiBBbGwgb3RoZXIgbW9kZWwgbm9kZXMKLSAgICogYXJlIGRlcml2ZWQgZnJvbSBpdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgWFNEQmFzZUFkYXB0ZXIgZXh0ZW5kcyBDTU5vZGVJbXBsCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgZG9jdW1lbnRhdGlvbiA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIG9mIHRoZSBnaXZlbiBmYWN0b3J5IGlzIHRoZSBmYWN0b3J5IGZvciB0aGlzIFhTRCBhZGFwdGVyCi0gICAgICogbW9kZWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgLQotICAgICAqICAgICAgICAgIGEgZmFjdG9yeQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGlzIG1vZGVsLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0geHNkQWRhcHRlckZhY3RvcnlJbXBsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTlNfUFJFRklYX1FVQUxJRklDQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTklMTEFCTEUpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVVNFU19MT0NBTF9FTEVNRU5UX0RFQ0xBUkFUSU9OUykKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9MQU5HVUFHRSkKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERUZJTklUSU9OX0lORk8pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9DTURPQ1VNRU5UKQotICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfSVNfTkFNRV9TUEFDRV9BV0FSRSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TUEVDKSB8fCBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTmlsbGFibGUnIGF0dHJpYnV0ZS4gVGhpcyByZXByZXNlbnRzIHRoZQotICAgICAqIG5pbGxhYmxlIGluZm9zZXQgcHJvcGVydHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLiBBbGwgZGVyaXZlZAotICAgICAqIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTmlsbGFibGUnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4gVGhlIGRlZmF1bHQKLSAgICAgKiB2YWx1ZSBpcyBudWxsOyBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbwotICAgICAqIG5vdCB3YW50IHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5Ci0gICAgICogQ01Ob2RlTGlzdDsgQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90Ci0gICAgICogd2FudCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0NNRE9DVU1FTlQpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRDTURvY3VtZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT04pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXREb2N1bWVudGF0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBCb29sZWFuLlRSVUU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBCb29sZWFuLlRSVUU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05JTExBQkxFKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gaXNOaWxsYWJsZSgpID8geHNpRG9jdW1lbnQubmlsQXR0cmlidXRlIDogbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTU9GX05PVElGSUVSKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0S2V5KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1NQRUMpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRTcGVjKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDTURvY3VtZW50KCk7Ci0gICAgICAgICAgaWYgKGNtRG9jdW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NYXAgbWFwID0gKChYU0RTY2hlbWFBZGFwdGVyKSBjbURvY3VtZW50KS5hbm5vdGF0aW9uTWFwOwotICAgICAgICAgICAgaWYgKG1hcCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgc3BlYyA9IGdldFNwZWMoKTsKLSAgICAgICAgICAgICAgaWYgKHNwZWMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1hcC5nZXRQcm9wZXJ0eShnZXRTcGVjKCksIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgICAgIAotCi0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdIHdoaWNoIGFmZmVjdHMgdGhlIHRhcmdldAotICAgICAqIG5hbWVzcGFjZSBvZiBsb2NhbGx5IHNjb3BlZCBmZWF0dXJlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgbnVsbC4gQWxsCi0gICAgICogZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUgZGVmYXVsdAotICAgICAqIHZhbHVlLiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIi8vIiArIGdldE5vZGVOYW1lKCk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RTY2hlbWFBZGFwdGVyIGltcGxlbWVudHMgQ01Eb2N1bWVudC4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwKLSAgICogb2JqZWN0ICdTY2hlbWEnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RTY2hlbWFBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTURvY3VtZW50Ci0gIHsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIG5hbWVkTm9kZU1hcDsKLSAgICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGVudGl0eU5vZGVNYXA7Ci0gICAgcHJvdGVjdGVkIEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBzdWJzdGl0dXRpb25Hcm91cFRhYmxlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhzZFNjaGVtYSAtCi0gICAgICogICAgICAgICAgdGhlIHNjaGVtYSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBYU0RTY2hlbWFBZGFwdGVyKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkU2NoZW1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGVuYW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGVuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIC8vIFNlZSBidWlsZENNRG9jdW1lbnQoKSBhYm92ZS4KLSAgICAgIHJldHVybiB4c2RTY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1RBUkdFVF9OQU1FU1BBQ0VfVVJJKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05BTUVTUEFDRV9JTkZPKQotICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRUxFTUVOVF9GT1JNX0RFRkFVTFQpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQU5OT1RBVElPTl9NQVApIHx8IHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGEgcHJlZml4IGlzIGdsb2JhbGx5IHJlcXVpcmVkIGZvciBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geHNkU2NoZW1hIC0KLSAgICAgKiAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBzY2hlbWEgbm9kZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBwcmVmaXggaXMgZ2xvYmFsbHkgcmVxdWlyZWQgZm9yIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUHJlZml4UmVxdWlyZWQoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgICBpZiAoeHNkU2NoZW1hLmlzU2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpCi0gICAgICAgIHJlc3VsdCA9ICEoeHNkU2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpLmdldFZhbHVlKCkgPT0gWFNERm9ybS5RVUFMSUZJRUQpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuIFJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfSU1QT1JURURfTkFNRVNQQUNFX0lORk8pKQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGdldEltcG9ydGVkTmFtZXNwYWNlSW5mbyh4c2RTY2hlbWEsIGxpc3QpOwotICAgICAgICByZXN1bHQgPSBsaXN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTykpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICAgICAgaW5mby51cmkgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGluZm8ucHJlZml4ID0gZ2V0UHJlZml4KHhzZFNjaGVtYSwgaW5mby51cmkpOwotICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IG51bGw7IC8vIG5vdGUgdGhhdCB0aGlzIGxvY2F0aW9uSGludCBpbmZvIGlzIG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJvb3QgeHNkIGZpbGUKLSAgICAgICAgaW5mby5pc1ByZWZpeFJlcXVpcmVkID0gaXNQcmVmaXhSZXF1aXJlZCh4c2RTY2hlbWEpOwotICAgICAgICBsaXN0LmFkZChpbmZvKTsKLSAgICAgICAgZ2V0SW1wb3J0ZWROYW1lc3BhY2VJbmZvKHhzZFNjaGVtYSwgbGlzdCk7Ci0gICAgICAgIHJlc3VsdCA9IGxpc3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0geHNkU2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQU5OT1RBVElPTl9NQVApKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBhbm5vdGF0aW9uTWFwOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYWxsRWxlbWVudHMiKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0QWxsRWxlbWVudHMoKTsKLSAgICAgIH0gIAotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoImdldEVsZW1lbnRGb3JUeXBlIyIpKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSBwcm9wZXJ0eU5hbWUuaW5kZXhPZigiIyIpOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcHJvcGVydHlOYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSB4c2RTY2hlbWEucmVzb2x2ZVR5cGVEZWZpbml0aW9uKHR5cGVOYW1lKTsKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBMb2NhbEVsZW1lbnRWaXNpdG9yIGxvY2FsRWxlbWVudFZpc2l0b3IgPSBuZXcgTG9jYWxFbGVtZW50VmlzaXRvcigpOwotICAgICAgICAgIGxvY2FsRWxlbWVudFZpc2l0b3IudmlzaXRUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgICAgcmVzdWx0ID0gbG9jYWxFbGVtZW50VmlzaXRvci5nZXRDTU5hbWVkTm9kZU1hcCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdhdGhlciBpbmZvcm1hdGlvbiBvbiBuYW1lc3BhY2VzIHVzZWQgaW4gZXh0ZXJuYWwgcmVmZXJlbmNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhlWFNEU2NoZW1hIC0KLSAgICAgKiAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBzY2hlbWEgbm9kZQotICAgICAqIEBwYXJhbSBsaXN0IC0KLSAgICAgKiAgICAgICAgICB0aGUgbGlzdCBvZiBpbXBvcnRlZCBuYW1lc3BhY2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldEltcG9ydGVkTmFtZXNwYWNlSW5mbyhYU0RTY2hlbWEgdGhlWFNEU2NoZW1hLCBMaXN0IGxpc3QpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRoZVhTRFNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYUNvbnRlbnQgY29udGVudCA9IChYU0RTY2hlbWFDb250ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0IHhJbXBvcnQgPSAoWFNESW1wb3J0KSBjb250ZW50OwotICAgICAgICAgIFhTRFNjaGVtYSBpbXBvcnRlZFhTRFNjaGVtYSA9IHhJbXBvcnQuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgICAgICAgIGluZm8udXJpID0geEltcG9ydC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICBpbmZvLnByZWZpeCA9IGdldFByZWZpeChpbXBvcnRlZFhTRFNjaGVtYSwgaW5mby51cmkpOwotICAgICAgICAgIGluZm8ubG9jYXRpb25IaW50ID0geEltcG9ydC5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgIGlmIChpbXBvcnRlZFhTRFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8uaXNQcmVmaXhSZXF1aXJlZCA9IGlzUHJlZml4UmVxdWlyZWQoaW1wb3J0ZWRYU0RTY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBsaXN0LmFkZChpbmZvKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgc2V0IG9mIG5hbWVkICh0b3AtbGV2ZWwpIGVsZW1lbnQgZGVjbGFyYXRpb25zIGZvciB0aGlzIHNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHNldCBvZiBuYW1lZCAodG9wLWxldmVsKSBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKQotICAgIHsKLSAgICAgIGlmIChuYW1lZE5vZGVNYXAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZWROb2RlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgICAgICAKLSAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHdlIGNhbGwgeHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKQotICAgICAgICAvLyB3ZSBnZXQgJ21vcmUnIGVsZW1lbnRzIHRoYW4gd2UgcmVhbGx5IHdhbnQgc2luY2Ugd2UgYWxzbwotICAgICAgICAvLyBnZXQgJ2ltcG9ydGVkJyBlbGVtZW50cy4gIEJlbG93IHdlIHRlc3QgdG8gZW5zdXJlIHRoZSBlbGVtZW50cwotICAgICAgICAvLyBhY3R1YWxseSBoYXZlIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIHNjaGVtYS4KLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgPyB0YXJnZXROYW1lc3BhY2UuZXF1YWxzKGVkLmdldFRhcmdldE5hbWVzcGFjZSgpKSA6IGVkLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIGdldEFkYXB0ZXIoZWQpOwotICAgICAgICAgICAgbmFtZWROb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dChhZGFwdGVyLmdldE5vZGVOYW1lKCksIGFkYXB0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWVkTm9kZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBidWlsdC1pbiBlbnRpdHkgZGVjbGFyYXRpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ1aWx0LWluIGVudGl0eSBkZWNsYXJhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkKLSAgICB7Ci0gICAgICBpZiAoZW50aXR5Tm9kZU1hcCA9PSBudWxsKQotICAgICAgewotICAgICAgICBlbnRpdHlOb2RlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgICAgICAvLyBhZGQgdGhlIGJ1aWx0IGluIGVudGl0eSBkZWNsYXJhdGlvbnMKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImFtcCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYW1wIiwgIiYiKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJsdCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgibHQiLCAiPCIpKTsKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImd0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJndCIsICI+IikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgicXVvdCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgicXVvdCIsICJcIiIpKTsKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImFwb3MiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImFwb3MiLCAiJyIpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBlbnRpdHlOb2RlTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIERPQ1VNRU5UOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyBudWxsLiAhISEgV2h5IGFyZSB3ZSBub3QgaW1wbGVtZW50aW5nIHRoaXM/Pz8/IEByZXR1cm4gbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QWxsRWxlbWVudHMoKQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgICBtYXAucHV0KGVkKTsgICAgICAgICAgIAotICAgICAgICBhZGRMb2NhbEVsZW1lbnREZWZpbml0aW9ucyhtYXAsIGVkKTsgICAgICAgICAgICAgIAotICAgICAgfSAgICAgCi0gICAgICByZXR1cm4gbWFwOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRMb2NhbEVsZW1lbnREZWZpbml0aW9ucyhDTU5hbWVkTm9kZU1hcEltcGwgbWFwLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgQ01OYW1lZE5vZGVNYXAgbG9jYWxFbGVtZW50TWFwID0gcGFyZW50RWxlbWVudERlY2xhcmF0aW9uLmdldExvY2FsRWxlbWVudHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxvY2FsRWxlbWVudE1hcC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgaWYgKG1hcC5nZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSkgPT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgbWFwLnB1dChlZCk7ICAgICAgICAKLSAgICAgICAgICBhZGRMb2NhbEVsZW1lbnREZWZpbml0aW9ucyhtYXAsIGVkKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAgICAgICAgCi0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi4gQSByZXByZXNlbnRhdGlvbgotICAgKiBvZiB0aGUgbW9kZWwgb2JqZWN0ICdBdHRyaWJ1dGUgVXNlJy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEQXR0cmlidXRlVXNlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbgotICB7Ci0gICAgLy8gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgU2NoZW1hIG5vZGUKLSAgICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZTsKLSAgICAvLyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZQotICAgIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhzZEF0dHJpYnV0ZVVzZSAtCi0gICAgICogICAgICAgICAgdGhlIFhNTCBTY2hlbWEgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEQXR0cmlidXRlVXNlQWRhcHRlcihYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlKQotICAgIHsKLSAgICAgIHRoaXMueHNkQXR0cmlidXRlVXNlID0geHNkQXR0cmlidXRlVXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEF0dHJpYnV0ZVVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZ2VuZXJhbCBYUGF0aCBleHByZXNzaW9uIGZvciB0aGUgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgZ2VuZXJhbCBYUGF0aCBleHByZXNzaW9uIGZvciB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNwZWMoKQotICAgIHsKLSAgICAgIHJldHVybiAiLy9AIiArIGdldEF0dHJOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFNpbWlsYXIgdG8gZ2V0QXR0ck5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRBdHRyTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldEVudW1BdHRyIG1ldGhvZAotICAgICAqIAotICAgICAqIEByZXR1cm4gamF2YS51dGlsLkVudW1lcmF0aW9uCi0gICAgICogQGRlcHJlY2F0ZWQgLS0gdG8gYmUgcmVwbGFjZWQgaW4gZnV0dXJlIHdpdGggYWRkaXRpb25hbCBDTURhdGFUeXBlCi0gICAgICogICAgICAgICAgICAgbWV0aG9kcyAoY3VycmVudGx5IGZvdW5kIG9uIENNRGF0YVR5cGVIZWxwZXIpCi0gICAgICovCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4gU2ltaWxhciB0byBnZXROb2RlTmFtZSgpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZGF0YVR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXNhZ2UgY29uc3RyYWludCBmb3IgdGhpcyBhdHRyaWJ1dGUuIFRoZSB1c2FnZXMgYXJlIGRlZmluZWQKLSAgICAgKiBpbiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGNsYXNzIChPUFRJT05BTCwgUkVRVUlSRUQsIEZJWEVEIG9yCi0gICAgICogUFJPSElCSVRFRCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXNhZ2UgY29uc3RyYWludCBmb3IgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRVc2FnZSgpCi0gICAgewotICAgICAgaW50IHVzZUtpbmQgPSBPUFRJT05BTDsKLSAgICAgIHN3aXRjaCAoeHNkQXR0cmlidXRlVXNlLmdldFVzZSgpLmdldFZhbHVlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuT1BUSU9OQUwgOiB7Ci0gICAgICAgICAgdXNlS2luZCA9IE9QVElPTkFMOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuUFJPSElCSVRFRCA6IHsKLSAgICAgICAgICB1c2VLaW5kID0gUFJPSElCSVRFRDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5LlJFUVVJUkVEIDogewotICAgICAgICAgIHVzZUtpbmQgPSBSRVFVSVJFRDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHVzZUtpbmQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXSB3aGljaCBhZmZlY3RzIHRoZSB0YXJnZXQKLSAgICAgKiBuYW1lc3BhY2Ugb2YgbG9jYWxseSBzY29wZWQgZmVhdHVyZXMuIElmIHRoZSBmb3JtIGlzIG5vdCBzZXQgb24gdGhpcwotICAgICAqIGF0dHJpYnV0ZSwgdGhlbiBzZWUgaWYgdGhlcmUgaXMgYSBnbG9iYWxseSBkZWZpbmVkIGRlZmF1bHQuIEByZXR1cm4gdGhlCi0gICAgICogdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIFN0cmluZyBmb3JtID0gbnVsbDsKLSAgICAgIGlmICh4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29udGVudCgpICE9IHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKQotICAgICAgewotICAgICAgCWZvcm0gPSAgInF1YWxpZmllZCI7Ci0gICAgICB9CQotICAgICAgZWxzZSBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKS5pc1NldEZvcm0oKSkKLSAgICAgIHsKLSAgICAgICAgZm9ybSA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCkuZ2V0Rm9ybSgpLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIGZvcm0gPSBzY2hlbWEuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZm9ybTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZEF0dHJpYnV0ZVVzZS5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuRGF0YVR5cGVJbXBsIEFuIGlubmVyIGNsYXNzIHRvIGhvbGQgdHlwZQotICAgICAqIGluZm9ybWF0aW9uIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS4gU2FtZSBhcyBnZXREYXRhVHlwZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RGF0YVR5cGVOYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyBmYWxzZS4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiBmYWxzZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgbnVsbC4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiBudWxsLgotICAgICAgICovCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLiBTYW1lIGFzIGdldE5vZGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNjID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gc2MuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gdHlwZU5hbWUgIT0gbnVsbCA/IHR5cGVOYW1lIDogInN0cmluZyI7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLiBUaGUga2luZHMgYXJlCi0gICAgICAgKiBkZWZpbmVkIGluIENNRGF0YVR5cGUgY2xhc3MgKElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCBvcgotICAgICAgICogSU1QTElFRF9WQUxVRV9ERUZBVUxUKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICAgICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9OT05FOwotICAgICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb25zdHJhaW50KCkuZ2V0VmFsdWUoKSA9PSBYU0RDb25zdHJhaW50LkRFRkFVTFQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQ7Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuRklYRUQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0ZJWEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogR2VuZXJhdGUgYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBiYXNlZCBvbiBpdHMgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIFhTRFR5cGVVdGlsLmdldEluc3RhbmNlVmFsdWUoYXR0ci5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgICAqLwotICAgICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiBhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbi4gVGhpcyBpcyB0aGUKLSAgICogYmFzZSBjbGFzcyBmb3IgWFNERWxlbWVudERlY2xhcmF0aW9uIGFuZCBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbC4KLSAgICogCi0gICAqIEFic3RyYWN0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmU6IHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCk7IHB1YmxpYyBhYnN0cmFjdAotICAgKiBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7IHB1YmxpYyBhYnN0cmFjdAotICAgKiBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlKCk7IHB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldFhTSVR5cGVzKCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZwotICAgKiB1cmlRdWFsaWZpZWRUeXBlTmFtZSk7IHB1YmxpYyBhYnN0cmFjdCBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpOyBwdWJsaWMKLSAgICogYWJzdHJhY3QgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCk7IHB1YmxpYyBhYnN0cmFjdCBDTU5vZGVMaXN0SW1wbAotICAgKiBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbCBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24KLSAgewotICAgIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBuYW1lZE5vZGVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBFTEVNRU5UX0RFQ0xBUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBzYW1lIGFzIGdldEVsZW1lbnROYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4gVGhlIHNhbWUgYXMgZ2V0Tm9kZU5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1hTSVRZUEVTKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVApCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BQlNUUkFDVCkgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGdldEF0dHJpYnV0ZXMobWFwLCB0ZCk7Ci0gICAgICBhZGRYU0lUeXBlQXR0cmlidXRlKG1hcCk7Ci0gICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdhdGhlciB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgLQotICAgICAqICAgICAgICAgIHVzZWQgZm9yIHJldHVybmluZyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIHhzZFR5cGVEZWZpbml0aW9uIC0KLSAgICAgKiAgICAgICAgICB0aGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0QXR0cmlidXRlcyhDTU5hbWVkTm9kZU1hcEltcGwgbWFwLCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkVHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdGQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c2RUeXBlRGVmaW5pdGlvbjsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY3RkLmdldEF0dHJpYnV0ZVVzZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIpIGdldEFkYXB0ZXIoeHNkQXR0cmlidXRlVXNlKTsKLSAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpCi0gICAgewotICAgICAgQ01Db250ZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgRGVyaXZlZENoaWxkVmlzaXRvciBkY3YgPSBuZXcgRGVyaXZlZENoaWxkVmlzaXRvcih0ZCk7Ci0gICAgICAgIGRjdi52aXNpdFR5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGRjdi5nZXRDaGlsZE5vZGVMaXN0KCk7Ci0gICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgQ01Hcm91cEltcGwobm9kZUxpc3QsIENNR3JvdXAuU0VRVUVOQ0UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChDTUNvbnRlbnQpIG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlIG9mIHRoaXMgZWxlbWVudC4gVGhlIGNvbnRlbnQgdHlwZSBpcyBkZWZpbmVkIGluCi0gICAgICogQ01FbGVtZW50RGVjbGFyYXRpb24gKEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEgb3IgQ0RBVEEpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpCi0gICAgewotICAgICAgaW50IGNvbnRlbnRUeXBlID0gRU1QVFk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSB0ZC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsICYmIHR5cGVOYW1lLmVxdWFscygiYW55VHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudFR5cGUgPSBBTlk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudFR5cGUgPSBQQ0RBVEE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRkIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb250ZW50VHlwZUNhdGVnb3J5IGNhdGVnb3J5ID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRkKS5nZXRDb250ZW50VHlwZUNhdGVnb3J5KCk7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoIChjYXRlZ29yeS5nZXRWYWx1ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5FTEVNRU5UX09OTFkgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IEVMRU1FTlQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LkVNUFRZIDoKLSAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBFTVBUWTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuTUlYRUQgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IE1JWEVEOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5TSU1QTEUgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IFBDREFUQTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpCi0gICAgewotICAgICAgQ01EYXRhVHlwZSByZXN1bHQgPSBudWxsOwotICAgICAgaW50IGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGJvb2xlYW4gaGFzRGF0YVR5cGUgPSBjb250ZW50VHlwZSA9PSBQQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gTUlYRUQ7Ci0gICAgICBpZiAoaGFzRGF0YVR5cGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGRhdGFUeXBlOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3VycyhnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiB0aGlzIGlzIGFuIGVsZW1lbnQKLSAgICAgKiByZWZlcmVuY2UuIE90aGVyd2lzZSBpdCByZXR1cm5zIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZSBnZXREZWZpbml0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBsb2NhbCB0byB0aGlzIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgbG9jYWwgdG8gdGhpcyBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBpZiAobmFtZWROb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExvY2FsRWxlbWVudFZpc2l0b3IgbG9jYWxFbGVtZW50VmlzaXRvciA9IG5ldyBMb2NhbEVsZW1lbnRWaXNpdG9yKCk7Ci0gICAgICAgIGxvY2FsRWxlbWVudFZpc2l0b3IudmlzaXRUeXBlRGVmaW5pdGlvbihnZXRYU0RUeXBlKCkpOwotICAgICAgICBuYW1lZE5vZGVNYXAgPSBsb2NhbEVsZW1lbnRWaXNpdG9yLmdldENNTmFtZWROb2RlTWFwKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZWROb2RlTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT05fSU5GTykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERlZmluaXRpb25JbmZvKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXREZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1hTSVRZUEVTKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0WFNJVHlwZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTikpCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKCI9Iik7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICByZXN1bHQgPSBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVApKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQUJTVFJBQ1QpKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0QWJzdHJhY3QoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLiBUaGlzIHJlcHJlc2VudHMgdGhlCi0gICAgICogbmlsbGFibGUgaW5mb3NldCBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKQotICAgIHsKLSAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc1NldE5pbGxhYmxlKCkpCi0gICAgICAgIHJldHVybiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc05pbGxhYmxlKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgJ0Fic3RyYWN0Jy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgJ0Fic3RyYWN0Jy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRBYnN0cmFjdCgpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzQWJzdHJhY3QoKTsKLSAgICAgIC8vIFRPRE8uLi4gaG93IGRvIHdlIGhhbmRsZSBlbGVtZW50cyB3aXRoIGFic3RyYWN0IHR5cGUncyA/Ci0gICAgICByZXR1cm4gcmVzdWx0ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKGFubm90YXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0IGdldFhTSVR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXJpIHF1YWxpZmllZAotICAgICAqIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqICAgICAgICAgIGEgdXJpIHF1YWxpZmllZCB0eXBlIG5hbWUKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFhTSVR5cGVBdHRyaWJ1dGUoQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBnZXRYU0lUeXBlcygpOwotICAgICAgaW50IGxpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICBpZiAobGlzdFNpemUgPiAxKQotICAgICAgewotICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKCJ0eXBlTmFtZXMiLCAoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYXR0cmlidXRlID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKCJ0eXBlIiwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCwgZGF0YVR5cGUpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0Q01Eb2N1bWVudCh4c2lEb2N1bWVudCk7Ci0gICAgICAgIGF0dHJpYnV0ZS5zZXRQcmVmaXhRdWFsaWZpY2F0aW9uKHRydWUpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0WFNJVHlwZXMobGlzdCk7Ci0gICAgICAgIG1hcC5nZXRIYXNodGFibGUoKS5wdXQoYXR0cmlidXRlLmdldE5vZGVOYW1lKCksIGF0dHJpYnV0ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgeyAgICAgIAotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCk7Ci0gICAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgZWxzZSAgCi0gICAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcihzY2hlbWEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LiBUaGUgZ3JvdXAgY29uc2lzdHMgb2Y6Ci0gICAgICogMS4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXRzZWxmIDIuIGFuZCBhbnkgZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGhhcwotICAgICAqIGEge3N1YnN0aXR1dGlvbiBncm91cCBhZmZpbGlhdGlvbn0gaW4gdGhlIGdyb3VwCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZUxpc3RJbXBsIGdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgLyoKLSAgICAgKiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLkRhdGFUeXBlSW1wbCBBbiBpbm5lciBjbGFzcyB0byBob2xkIHR5cGUKLSAgICAgKiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlCi0gICAgewotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4gU2FtZSBhcyBnZXREYXRhVHlwZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgZmFsc2UuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbnkgcHJvcGVydGllcy4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gZmFsc2UuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIG51bGwuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbnkgcHJvcGVydGllcy4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gbnVsbC4KLSAgICAgICAqLwotICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuIFNhbWUgYXMgZ2V0Tm9kZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ZCA9IGdldFhTRFR5cGUoKS5nZXRTaW1wbGVUeXBlKCk7Ci0gICAgICAgIGlmIChzdGQgIT0gbnVsbCkKLSAgICAgICAgICB0eXBlTmFtZSA9IHN0ZC5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZSAhPSBudWxsID8gdHlwZU5hbWUgOiAic3RyaW5nIjsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuIFRoZSBraW5kcyBhcmUKLSAgICAgICAqIGRlZmluZWQgaW4gQ01EYXRhVHlwZSBjbGFzcyAoSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVEIG9yCi0gICAgICAgKiBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gICAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0gICAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRDb25zdHJhaW50KCkuZ2V0VmFsdWUoKSA9PSBYU0RDb25zdHJhaW50LkRFRkFVTFQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQ7Ci0gICAgICAgICAgZWxzZSBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5GSVhFRCkKLSAgICAgICAgICAgIHJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTRFR5cGVVdGlsLmdldEluc3RhbmNlVmFsdWUoZ2V0WFNEVHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgICAgewotICAgICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uLiBBCi0gICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJ0VsZW1lbnQgRGVjbGFyYXRpb24nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgTGlzdCB4c2lUeXBlcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIHN1YnN0aXR1dGlvbkdyb3VwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhzZEVsZW1lbnREZWNsYXJhdGlvbiAtCi0gICAgICogICAgICAgICAgdGhlIFhNTCBTY2hlbWEgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcihYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkRWxlbWVudERlY2xhcmF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZGVjbGFyYXRpb24gaWYgdGhpcyBpcyBhbiBlbGVtZW50Ci0gICAgICogcmVmZXJlbmNlLiBPdGhlcndpc2UgaXQgcmV0dXJucyBpdHNlbGYuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIGdldEFkYXB0ZXIoeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqIGxvY2FsLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiAgICAgICAgIGxvY2FsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKQotICAgIHsKLSAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICBlbHNlIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSkKLSAgICAgICAgcmV0dXJuIERFRklOSVRJT05fSU5GT19HTE9CQUw7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBERUZJTklUSU9OX0lORk9fTE9DQUw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIFN0cmluZyBmb3JtID0gbnVsbDsKLSAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgZm9ybSA9ICJxdWFsaWZpZWQiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzU2V0Rm9ybSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9ybSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRGb3JtKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICAgZm9ybSA9IHNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmb3JtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFhTSVR5cGVzKCkKLSAgICB7Ci0gICAgICBpZiAoeHNpVHlwZXMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mbygpOwotICAgICAgfQotICAgICAgcmV0dXJuIHhzaVR5cGVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVEZXJpdmVkVHlwZUluZm8oKQotICAgIHsKLSAgICAgIHhzaVR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgICAgZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBjb21wdXRlRGVyaXZlZFR5cGVJbmZvSGVscGVyKGdldFhTRFR5cGUoKSwgeHNpVHlwZXMsIGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRGVyaXZlZFR5cGVJbmZvSGVscGVyKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUsIExpc3QgdHlwZU5hbWVMaXN0LCBMaXN0IGVkTGlzdCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgTGlzdCBkZXJpdmVkVHlwZXMgPSBmaW5kVHlwZXNEZXJpdmVkRnJvbSh0eXBlKTsKLSAgICAgICAgQXJyYXlMaXN0IGluY2x1c2l2ZURlcml2ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW5jbHVzaXZlRGVyaXZlZFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgaWYgKChkZXJpdmVkVHlwZXMgIT0gbnVsbCkgJiYgKGRlcml2ZWRUeXBlcy5zaXplKCkgPiAwKSkKLSAgICAgICAgewotICAgICAgICAgIGluY2x1c2l2ZURlcml2ZWRUeXBlcy5hZGRBbGwoZGVyaXZlZFR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbmNsdXNpdmVEZXJpdmVkVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gZGVyaXZlZFR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBkZXJpdmVkVHlwZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGVyaXZlZFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZSA9IHVyaSAhPSBudWxsID8gKCJbIiArIHVyaSArICJdIiArIG5hbWUpIDogbmFtZTsKLSAgICAgICAgICAgICAgdHlwZU5hbWVMaXN0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSBuZXcgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwodGhpcywgZGVyaXZlZFR5cGUsIG5hbWUpOwotICAgICAgICAgICAgICBlZExpc3QuYWRkKGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXJpIHF1YWxpZmllZAotICAgICAqIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqICAgICAgICAgIGEgdXJpIHF1YWxpZmllZCB0eXBlIG5hbWUKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb21wdXRlRGVyaXZlZFR5cGVJbmZvKCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gKERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKChlZCAhPSBudWxsKSAmJiAoZWQudXJpUXVhbGlmaWVkVHlwZU5hbWUgIT0gbnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZWQudXJpUXVhbGlmaWVkVHlwZU5hbWUuZXF1YWxzKHVyaVF1YWxpZmllZFR5cGVOYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgewotICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgICAgIExpc3Qgc2dyb3VwID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZ3JvdXAuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7ICAKLSAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cC5hZGQoZ2V0QWRhcHRlcihlZCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uR3JvdXA7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCBleHRlbmRzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsCi0gICAqICAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgb3duZXI7Ci0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIHhzZFR5cGU7Ci0gICAgcHVibGljIFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvd25lciAtCi0gICAgICogQHBhcmFtIHhzZFR5cGUgLQotICAgICAqIEBwYXJhbSB1cmlRdWFsaWZpZWRUeXBlTmFtZSAtCi0gICAgICovCi0gICAgcHVibGljIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgb3duZXIsIFhTRFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLm93bmVyID0gb3duZXI7Ci0gICAgICB0aGlzLnhzZFR5cGUgPSB4c2RUeXBlOwotICAgICAgdGhpcy51cmlRdWFsaWZpZWRUeXBlTmFtZSA9IHVyaVF1YWxpZmllZFR5cGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG93bmVyLmdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG93bmVyLmdldEtleSgpKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFhTSVR5cGVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0WFNJVHlwZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXJpIHF1YWxpZmllZAotICAgICAqIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqICAgICAgICAgIGEgdXJpIHF1YWxpZmllZCB0eXBlIG5hbWUKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24odXJpUXVhbGlmaWVkVHlwZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiB0aGlzIGlzIGFuIGVsZW1lbnQKLSAgICAgKiByZWZlcmVuY2UuIE90aGVyd2lzZSBpdCByZXR1cm5zIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZSBnZXREZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0RGVmaW5pdGlvbkluZm8oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdIHdoaWNoIGFmZmVjdHMgdGhlIHRhcmdldAotICAgICAqIG5hbWVzcGFjZSBvZiBsb2NhbGx5IHNjb3BlZCBmZWF0dXJlcy4gQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZvcm0KLSAgICAgKiBbYXR0cmlidXRlXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LiBUaGUgZ3JvdXAgY29uc2lzdHMgb2Y6Ci0gICAgICogMS4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXRzZWxmIDIuIGFuZCBhbnkgZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGhhcwotICAgICAqIGEge3N1YnN0aXR1dGlvbiBncm91cCBhZmZpbGlhdGlvbn0gaW4gdGhlIGdyb3VwCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIGdldFN1YnN0aXR1dGlvbkdyb3VwKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRFdpbGRjYXJkQWRhcHRlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RXaWxkY2FyZEFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQW55RWxlbWVudAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkOwotCi0gICAgcHVibGljIFhTRFdpbGRjYXJkQWRhcHRlcihYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB0aGlzLnhzZFdpbGRjYXJkID0geHNkV2lsZGNhcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkV2lsZGNhcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQU5ZX0VMRU1FTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gImFueSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgIFN0cmluZyB1cmkgPSB4c2RXaWxkY2FyZC5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsKLSAgICAgIHJldHVybiAodXJpICE9IG51bGwgfHwgdXJpLmxlbmd0aCgpID09IDApID8gdXJpIDogIiMjYW55IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3Vycyh4c2RXaWxkY2FyZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoeHNkV2lsZGNhcmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RXaWxkY2FyZC5nZXRTY2hlbWEoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IHhzZFdpbGRjYXJkLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRE1vZGVsR3JvdXBBZGFwdGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRE1vZGVsR3JvdXBBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUdyb3VwCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEdST1VQOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZE1vZGVsR3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0gICAgewotICAgICAgQ01Ob2RlTGlzdEltcGwgbm9kZUxpc3QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZE1vZGVsR3JvdXAuZ2V0UGFydGljbGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGkubmV4dCgpOwotICAgICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBjb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgICAgIENNTm9kZSBhZGFwdGVyID0gZ2V0QWRhcHRlcihjb250ZW50KTsKLSAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGVMaXN0LmdldExpc3QoKS5hZGQoYWRhcHRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLSAgICAgIHJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3Vycyh4c2RNb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3Vycyh4c2RNb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gb3BlcmF0b3Igb2YgdGhpcyBncm91cCAtLSBDSE9JQ0UsIFNFUVVFTkNFIG9yIEFMTCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRvciBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKQotICAgIHsKLSAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgLy90b2RvLi4uIGhhbmRsZSBBTE9ORSBjYXNlIGJ5IGNoZWNraWcgaWYgY2hpbGQgY291bnQgPT0gMQotICAgICAgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoICh4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKS5nZXRWYWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkNIT0lDRSA6IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IENIT0lDRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0UgOiB7Ci0gICAgICAgICAgICByZXN1bHQgPSBTRVFVRU5DRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQUxMIDogewotICAgICAgICAgICAgcmVzdWx0ID0gQUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RNb2RlbEdyb3VwLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUdyb3VwCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0KLSAgICBwdWJsaWMgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkTW9kZWxHcm91cERlZmluaXRpb24gPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBHUk9VUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkKLSAgICB7Ci0gICAgICBDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBhZGFwdGVyID0gZ2V0QWRhcHRlcihtb2RlbEdyb3VwKTsKLSAgICAgICAgbm9kZUxpc3QuYWRkKGFkYXB0ZXIpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGVMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVzY3JpcHRpb25CdWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gb3BlcmF0b3Igb2YgdGhpcyBncm91cCAtLSBDSE9JQ0UsIFNFUVVFTkNFIG9yIEFMTCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRvciBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RDb21wb3NpdG9yLlNFUVVFTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIERvY3VtZW50YXRpb25JbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudGF0aW9uLiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgKiBkb2N1bWVudGF0aW9uIGVsZW1lbnQgcGFydCBvZiB0aGUgJ1VzZXIgSW5mb3JtYXRpb24nIGZlYXR1cmUuIFdvcmtpbmcgd2l0aAotICAgKiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IHJlcXVpcmVzIGRyb3BwaW5nIGRvd24gaW50byB0aGUgRE9NIG1vZGVsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbgotICB7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZG9jdW1lbnRhdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIC0KLSAgICAgKiAgICAgICAgICBhIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRhdGlvbkltcGwoRWxlbWVudCBkb2N1bWVudGF0aW9uKQotICAgIHsKLSAgICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gRE9DVU1FTlRBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBmYWxzZS4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBudWxsLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgIFN0cmluZyBjb250ZW50ID0gIiI7Ci0gICAgICBib29sZWFuIGNvbnRlbnRGb3VuZCA9IGZhbHNlOwotICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudGF0aW9uLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICBjb250ZW50ICs9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjb250ZW50Rm91bmQgPyBjb250ZW50IDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbi5oYXNBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MX05BTUVTUEFDRV9VUklfMTk5OCwgWE1MX0xBTkdfQVRUUklCVVRFKSA/IGRvY3VtZW50YXRpb24uZ2V0QXR0cmlidXRlTlMoWFNEQ29uc3RhbnRzLlhNTF9OQU1FU1BBQ0VfVVJJXzE5OTgsIFhNTF9MQU5HX0FUVFJJQlVURSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uLmhhc0F0dHJpYnV0ZU5TKG51bGwsIFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSA/IGRvY3VtZW50YXRpb24uZ2V0QXR0cmlidXRlTlMobnVsbCwgWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpIDogbnVsbDsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTSURvY3VtZW50IGV4dGVuZHMgQ01Eb2N1bWVudEltcGwuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIHRob3NlCi0gICAqIGF0dHJpYnV0ZXMgdGhhdCBhcmUgZm9yIGRpcmVjdCB1c2UgaW4gYW55IFhNTCBkb2N1bWVudHMuIFRoZXNlIGF0dHJpYnV0ZXMKLSAgICogYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSwgd2hpY2ggaGFzIHRoZSBuYW1lc3BhY2UgbmFtZQotICAgKiBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZS4gQXR0cmlidXRlcyBpbiB0aGlzIG5hbWVzcGFjZQotICAgKiBpbmNsdWRlOiB4c2k6dHlwZSB4c2k6bmlsIHhzaTpzY2hlbWFMb2NhdGlvbiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0lEb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnRJbXBsCi0gIHsKLSAgICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgbmlsQXR0cmlidXRlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgdGhlICd4c2k6bmlsJwotICAgICAqLwotICAgIHB1YmxpYyBYU0lEb2N1bWVudCgpCi0gICAgewotICAgICAgc3VwZXIoWFNEQ29uc3RhbnRzLlNDSEVNQV9JTlNUQU5DRV9VUklfMjAwMSk7Ci0gICAgICAvLyBjcmVhdGUgdGhlICduaWxsJyBhdHRyaWJ1dGUKLSAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHsiZmFsc2UiLCAidHJ1ZSJ9OwotICAgICAgbmlsQXR0cmlidXRlID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKCJuaWwiLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVELCBuZXcgQ01EYXRhVHlwZUltcGwoImJvb2xlYW4iLCB2YWx1ZXMpKTsKLSAgICAgIG5pbEF0dHJpYnV0ZS5zZXRQcmVmaXhRdWFsaWZpY2F0aW9uKHRydWUpOwotICAgICAgbmlsQXR0cmlidXRlLnNldENNRG9jdW1lbnQodGhpcyk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBOb3RlIHRoaXMgWFNEIG1vZGVsIHZpc2l0b3IgZGlmZmVycyBmcm9tIHRoZSBYU0QgbW9kZWwgdmlzaXRvciBpbgotICAgKiBvcmcuZWNsaXBzZS53c3QueHNkLmVkaXRvciBwbHVnaW4uIEluIHZpc2l0TW9kZWxHcm91cCBtZXRob2Qgd2UgY2FsbAotICAgKiBnZXRQYXJ0aWNsZXMoKSBpbnN0ZWFkIG9mIGdldENvbnRlbnRzKCkuIFRoaXMgZ2F0aGVycyBhbGwgb2YgdGhlIGNvbnRlbnQgb2YKLSAgICogYSBkZXJpdmVkIHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRENNVmlzaXRvciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSkKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBjdGQgPSB0eXBlLmdldENvbXBsZXhUeXBlKCk7Ci0gICAgICBpZiAoY3RkICE9IG51bGwpCi0gICAgICAgIHZpc2l0UGFydGljbGUoY3RkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGlmIChtb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEEgdmlzaXRvciBjbGFzcyB0aGF0IHdhbGtzIHRoZSB4c2QgbW9kZWwgYW5kIGNvbXB1dGVzIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0gICAqIHRoYXQgYmVsb25nIHRvIHRoZSBpbml0aWFsbHkgdmlzaXRlZCBlbGVtZW50IHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERlcml2ZWRDaGlsZFZpc2l0b3IgZXh0ZW5kcyBYU0RDTVZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBjaGlsZE5vZGVMaXN0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgcHJvdGVjdGVkIExpc3QgYmFzZVR5cGVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIE9iamVjdCByb290OwotCi0gICAgRGVyaXZlZENoaWxkVmlzaXRvcihPYmplY3Qgcm9vdCkKLSAgICB7Ci0gICAgICB0aGlzLnJvb3QgPSByb290OwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5vZGVMaXN0SW1wbCBnZXRDaGlsZE5vZGVMaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gY2hpbGROb2RlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKHdpbGRjYXJkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIoZWxlbWVudCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIobW9kZWxHcm91cCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIobW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEEgdmlzaXRvciBjbGFzcyB0aGF0IGdhdGhlcnMgYWxsIG9mIHRoZSBlbGVtZW50cyB3aXRoaW4gYSB0eXBlIGRlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2FsRWxlbWVudFZpc2l0b3IgZXh0ZW5kcyBYU0RDTVZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbmFtZWROb2RlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgIHByb3RlY3RlZCBMaXN0IGJhc2VUeXBlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotICAgICAgbmFtZWROb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dChhZGFwdGVyLmdldE5vZGVOYW1lKCksIGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRDTU5hbWVkTm9kZU1hcCgpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWVkTm9kZU1hcDsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFR5cGVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFR5cGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDY4NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RUeXBlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2VuZXJhdGUgdmFsaWQgdmFsdWVzIGZvciBidWlsdC1pbiBzaW1wbGUgdHlwZXMuCi0gKi8KLQotcHVibGljIGNsYXNzIFhTRFR5cGVVdGlsCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgTWFwIGRlZmF1bHRWYWx1ZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKQotICB7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYW55U2ltcGxlVHlwZSIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImFueVR5cGUiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJhbnlVUkkiLCAiaHR0cDovL3RlbXB1cmkub3JnIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYmFzZTY0QmluYXJ5IiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJib29sZWFuIiwgInRydWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJieXRlIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkYXRlIiwgIjIwMDEtMDEtMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkYXRlVGltZSIsICIyMDAxLTEyLTMxVDEyOjAwOjAwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZGVjaW1hbCIsICIwLjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkb3VibGUiLCAiMC4wIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZHVyYXRpb24iLCAiUDFEIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiRU5USVRZIiwgImVudGl0eSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIkVOVElUSUVTIiwgImVudGl0aWVzIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZmxvYXQiLCAiMC4wIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ0RheSIsICItLS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdNb250aCIsICItLTAxLS0iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnTW9udGhEYXkiLCAiLS0wMS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdZZWFyIiwgIjIwMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnWWVhck1vbnRoIiwgIjIwMDEtMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJoZXhCaW5hcnkiLCAiMEYwMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIklEIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiSURSRUYiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJJRFJFRlMiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJpbnQiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImludGVnZXIiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImxhbmd1YWdlIiwgIkVOIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibG9uZyIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTmFtZSIsICJOYW1lIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTkNOYW1lIiwgIk5DTmFtZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5lZ2F0aXZlSW50ZWdlciIsICItMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5NVE9LRU4iLCAiTk1UT0tFTiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5NVE9LRU5TIiwgIk5NVE9LRU5TIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibm9uTmVnYXRpdmVJbnRlZ2VyIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJub25Qb3NpdGl2ZUludGVnZXIiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5vcm1hbGl6ZWRTdHJpbmciLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOT1RBVElPTiIsICJOT1RBVElPTiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInBvc2l0aXZlSW50ZWdlciIsICIxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiUU5hbWUiLCAiUU5hbWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJzaG9ydCIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgic3RyaW5nIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidGltZSIsICIxMjowMDowMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInRva2VuIiwgInRva2VuIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRCeXRlIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZEludCIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRMb25nIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZFNob3J0IiwgIjAiKTsKLSAgfQotCi0KLSAgLyoKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGJ1aWx0LWluLgotICAgKiBAcGFyYW0gdHlwZSAtIGFuIFhTRFR5cGVEZWZpbml0aW9uIG9iamVjdC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGJ1aWx0LWluLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQnVpbHRJbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7IAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICBkZWZhdWx0VmFsdWUuY29udGFpbnNLZXkobmFtZSk7IAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzaW1wbGUgdHlwZS4KLSAgICogQHBhcmFtIHR5cGUgLSBhIHNpbXBsZSBidWlsdC1pbiB0eXBlLgotICAgKiBAcmV0dXJuIGEgdmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNpbXBsZSB0eXBlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5zdGFuY2VWYWx1ZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaXNCdWlsdEluKHR5cGUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZUlEID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKWRlZmF1bHRWYWx1ZS5nZXQobmFtZUlEKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZXR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGlmIChiYXNldHlwZSAhPSB0eXBlKSByZXR1cm4gZ2V0SW5zdGFuY2VWYWx1ZShiYXNldHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGUxYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEVmlzaXRvcgotewotICBwdWJsaWMgWFNEVmlzaXRvcigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50ID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihpZGVudGl0eUNvbnN0cmFpbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyaWJ1dGVHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0Tm90YXRpb25EZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbigoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50KQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgewotICAgIGlmICghbW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gbm90YXRpb24pCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4Q29udGVudCA9IHR5cGUuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICB2aXNpdFBhcnRpY2xlKChYU0RQYXJ0aWNsZSkgY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHZpc2l0UGFydGljbGVDb250ZW50KHBhcnRpY2xlLmdldENvbnRlbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQpCi0gIHsKLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbigoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHZpc2l0V2lsZGNhcmQoKFhTRFdpbGRjYXJkKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNWRmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hTG9jYXRvckltcGwgc2NoZW1hTG9jYXRvciA9IG5ldyBYU0RTY2hlbWFMb2NhdG9ySW1wbCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0MjJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBYU0RTY2hlbWFMb2NhdG9yCi17Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yI2xvY2F0ZVNjaGVtYShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEU2NoZW1hIGxvY2F0ZVNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcmF3U2NoZW1hTG9jYXRpb25VUkksIFN0cmluZyByZXNvbHZlZFNjaGVtYUxvY2F0aW9uVVJJKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSByZXN1bHQgPSBudWxsOwotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgIAotICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCByYXdTY2hlbWFMb2NhdGlvblVSSSk7IAotICAgICAgaWYgKHJlc29sdmVkVVJJID09IG51bGwpIAotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9IHJlc29sdmVkU2NoZW1hTG9jYXRpb25VUkk7ICAgICAgIAotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAKLSAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSB4c2RTY2hlbWEuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocmVzb2x2ZWRVUkkpOwotICAgICAgICBSZXNvdXJjZSByID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7IAotICAgICAgICBYU0RSZXNvdXJjZUltcGwgcmVzb2x2ZWRSZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgIGlmIChyIGluc3RhbmNlb2YgWFNEUmVzb3VyY2VJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgICAgICAKLSAgICAgICAgeyAgCi0gICAgICAgICAgU3RyaW5nIHBoeXNpY2FsTG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCByZXNvbHZlZFVSSSk7ICAgICAKLSAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkocGh5c2ljYWxMb2NhdGlvbikpOwotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UgPSAoWFNEUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioueHNkIikpOwotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCBudWxsKTsgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZWRSZXNvdXJjZS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIC8vIEl0IGlzIGdlbmVyYWxseSBub3QgYW4gZXJyb3IgdG8gZmFpbCB0byByZXNvbHZlLgotICAgICAgICAvLyBJZiBhIHJlc291cmNlIGlzIGFjdHVhbGx5IGNyZWF0ZWQsIAotICAgICAgICAvLyB3aGljaCBoYXBwZW5zIG9ubHkgd2hlbiB3ZSBjYW4gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSwKLSAgICAgICAgLy8gdGhlbiBpdCdzIGFuIGVycm9yIGlmIGl0J3Mgbm90IGEgZ29vZCBzY2hlbWEKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjgyNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogQW4gWFNEIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBhbGxvd3Mgc2V0dGluZyBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0gKiBpbmZvcm1hdGlvbiBmb3IgYSBXVFAgWFNEIHZhbGlkYXRpb24gcnVuLiBBbnkgZmVhdHVyZXMgYW5kIHByb3BlcnRpZXMKLSAqIHNldCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHRob3NlIGZyb20KLSAqIHBhcnNlcnMgc3VjaCBhcyBYZXJjZXMuIChUaGlzIG9iamVjdCBkb2VzIG5vdCBieSBkZWZhdWx0IHdyYXAgZmVhdHVyZXMKLSAqIGFuZCBwcm9wZXJ0aWVzIGZyb20gc3BlY2lmaWMgcGFyc2Vycy4pCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiAKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TID0gIkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBib29sZWFuIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9ucyA9IGZhbHNlOwotICAKLSAgLyoqCi0gICAqIFNldCBhIGZlYXR1cmUgb2YgdGhpcyBjb25maWd1cmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSB0byBzZXQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiAJCVRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBmZWF0dXJlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMuZXF1YWxzKGZlYXR1cmUpKQotCSAgaG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zID0gdmFsdWU7Ci0JZWxzZQotCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotCQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gZmVhdHVyZS4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IGRlZmluZWQKLSAgICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgZmVhdHVyZSdzIHZhbHVlLCB0cnVlIG9yIGZhbHNlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMuZXF1YWxzKGZlYXR1cmUpKQotCSAgcmV0dXJuIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9uczsKLQkKLQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1Mzc2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5YTUxHcmFtbWFyUHJlcGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MR3JhbW1hclBvb2xJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUVycm9yOwotCi0vKioKLSAqIFRoZSBYU0RWYWxpZGF0b3Igd2lsbCB2YWxpZGF0ZSBYU0QgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyID0gbnVsbDsKLQotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0JcmV0dXJuIHZhbGlkYXRlKHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgWFNEIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgWFNEIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbSAKLSAgICogCQlBbiBpbnB1dCBzdHJlYW0gcmVwcmVzZW50aW5nIHRoZSBYU0QgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICogCQlBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBydW4uCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLSAgewotCWlmKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQl7Ci0JICBjb25maWd1cmF0aW9uID0gbmV3IFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCk7Ci0JfQotCVZhbGlkYXRpb25JbmZvIHZhbGluZm8gPSBuZXcgVmFsaWRhdGlvbkluZm8odXJpKTsKLQlYU0RFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IFhTREVycm9ySGFuZGxlcih2YWxpbmZvKTsKLQl0cnkKLQl7Ci0JICBYTUxHcmFtbWFyUHJlcGFyc2VyIGdyYW1tYXJQcmVwYXJzZXIgPSBuZXcgWE1MR3JhbW1hclByZXBhcnNlcigpOwotCSAgZ3JhbW1hclByZXBhcnNlci5yZWdpc3RlclByZXBhcnNlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSxudWxsLypzY2hlbWFMb2FkZXIqLyk7Ci0JCSAgCi0JICBncmFtbWFyUHJlcGFyc2VyLnNldFByb3BlcnR5KENvbnN0YW50cy5YRVJDRVNfUFJPUEVSVFlfUFJFRklYICsgQ29uc3RhbnRzLlhNTEdSQU1NQVJfUE9PTF9QUk9QRVJUWSwgbmV3IFhNTEdyYW1tYXJQb29sSW1wbCgpKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkNPTlRJTlVFX0FGVEVSX0ZBVEFMX0VSUk9SX0ZFQVRVUkUsIGZhbHNlKTsKLSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLk5BTUVTUEFDRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5OQU1FU1BBQ0VfUFJFRklYRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5WQUxJREFUSU9OX0ZFQVRVUkUsIHRydWUpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuU0NIRU1BX1ZBTElEQVRJT05fRkVBVFVSRSwgdHJ1ZSk7Ci0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5TQ0hFTUFfRlVMTF9DSEVDS0lORywgZmFsc2UpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuRVhURVJOQUxfR0VORVJBTF9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkVYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLldBUk5fT05fRFVQTElDQVRFX0FUVERFRl9GRUFUVVJFLCB0cnVlKTsKLQkgICAgIAotCSAgaWYoY29uZmlndXJhdGlvbi5nZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUykpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyAiaG9ub3VyLWFsbC1zY2hlbWFMb2NhdGlvbnMiLCB0cnVlKTsKLQkgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgIHsKLQkgICAgICAvLyBjYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCBpZ25vcmUKLQkgICAgfQotCSAgfQotCSAgICAgIAotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKLQkgIGlmICh1cmlyZXNvbHZlciAhPSBudWxsKQotCSAgewotCSAgICBYU0RFbnRpdHlSZXNvbHZlciByZXNvbHZlciA9IG5ldyBYU0RFbnRpdHlSZXNvbHZlcih1cmlyZXNvbHZlciwgdXJpKTsKLQkgICAgaWYgKHJlc29sdmVyICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKHJlc29sdmVyKTsKLQkgICAgfQotCSAgfQotCi0JICB0cnkKLQkgIHsKLQkgIAlYTUxJbnB1dFNvdXJjZSBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLCB1cmksIHVyaSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCSAgICBncmFtbWFyUHJlcGFyc2VyLmdldExvYWRlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSk7Ci0JCWdyYW1tYXJQcmVwYXJzZXIucHJlcGFyc2VHcmFtbWFyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLGlzKTsKLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQkgICAgLy9wYXJzZXIgd2lsbCByZXR1cm4gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgaXMgc3RydWN0dXJhbGx5IGludmFsaWQKLQkJLy9UT0RPOiBsb2cgZXJyb3IgbWVzc2FnZQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgIH0KLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCXsKLSAgICAgIC8vIFRPRE86IGxvZyBlcnJvci4KLQkgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotCX0KLQlyZXR1cm4gdmFsaW5mbzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFVSSSByZXNvbHZlciB0byB1c2Ugd2l0aCBYU0QgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlyZXNvbHZlcgotICAgKiAgICAgICAgICBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaXJlc29sdmVyKQotICB7Ci0gICAgdGhpcy51cmlyZXNvbHZlciA9IHVyaXJlc29sdmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBYU0RFcnJvckhhbmRsZXIgaGFuZGxlIFhlcmNlcyBwYXJzaW5nIGVycm9ycyBhbmQgcHV0cyB0aGUgZXJyb3JzCi0gICAqIGludG8gdGhlIGdpdmVuIFZhbGlkYXRpb25JbmZvIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYU0RFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBYTUxFcnJvckhhbmRsZXIKLSAgewotCSAgCi0gICAgcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uSW5mbyB2YWxpbmZvOwotCi0gICAgcHVibGljIFhTREVycm9ySGFuZGxlcihWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAgIHsKLSAgICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXJyb3JLZXkgVGhlIFhlcmNlcyBlcnJvciBrZXkuCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRoYXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgZXJyb3JLZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbiwgaW50IHNldmVyaXR5KQotICAgIHsgCi0gICAgICBTdHJpbmcgc3lzdGVtSWQgPSBleGNlcHRpb24uZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpOwotICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBET01FcnJvci5TRVZFUklUWV9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsaW5mby5hZGRXYXJuaW5nKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSwgc3lzdGVtSWQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBzeXN0ZW1JZCwgZXJyb3JLZXksIG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjd2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0JewotICAgIAlhZGRWYWxpZGF0aW9uTWVzc2FnZShrZXksIGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORyk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgICB7Ci0gICAgCWFkZFZhbGlkYXRpb25NZXNzYWdlKGtleSwgZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9FUlJPUik7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZmF0YWxFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0JewotICAgIAlhZGRWYWxpZGF0aW9uTWVzc2FnZShrZXksIGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfRkFUQUxfRVJST1IpOwotCX0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgWFNERW50aXR5UmVzb2x2ZXIgd3JhcHMgYW4gaWRyZXNvbHZlciB0byBwcm92aWRlIGVudGl0eSByZXNvbHV0aW9uIHRvCi0gICAqIHRoZSBYU0QgdmFsaWRhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFhTREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLSAgewotICAgIHByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkcmVzb2x2ZXIKLSAgICAgKiAgICAgICAgICBUaGUgaWRyZXNvbHZlciB0aGlzIGVudGl0eSByZXNvbHZlciB3cmFwcy4KLSAgICAgKiBAcGFyYW0gYmFzZWxvY2F0aW9uIFRoZSBiYXNlIGxvY2F0aW9uIHRvIHJlc29sdmUgd2l0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNERW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIsIFN0cmluZyBiYXNlbG9jYXRpb24pCi0gICAgewotICAgICAgdGhpcy51cmlyZXNvbHZlciA9IHVyaXJlc29sdmVyOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2VJZGVudGlmaWVyKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIFN0cmluZyBsaXRlcmFsU3lzdGVtSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TGl0ZXJhbFN5c3RlbUlkKCk7Ci0gICAgICBpZihsaXRlcmFsU3lzdGVtSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAJcmVzb3VyY2VJZGVudGlmaWVyLnNldExpdGVyYWxTeXN0ZW1JZChsaXRlcmFsU3lzdGVtSWQucmVwbGFjZSgnXFwnLCcvJykpOwotICAgICAgfQotICAgICAgICAvLyBUT0RPIGNzOiBJbiByZXZpc2lvbiAxLjEgd2UgZXhwbGljaXRseSBvcGVuZWQgYSBzdHJlYW0gdG8gZW5zdXJlCi0gICAgICAgIC8vIGZpbGUgSS9PIHByb2JsZW1zIHByb2R1Y2VkIG1lc3NhZ2VzLiBJJ3ZlIHJlbW92ZSB0aGlzIGZ1ZGdlIGZvciBub3cKLSAgICAgICAgLy8gc2luY2UgSSBjYW4ndCBzZWVtIHRvIHJlcHJvZHVjZSB0aGUgcHJvYmxlbSBpdCB3YXMgaW50ZW5kZWQgdG8gZml4LgotICAgICAgICAvLyBJJ20gaG9waW5nIHRoZSBuZXdlciBYZXJjZXMgY29kZSBiYXNlIGhhcyBmaXhlZCB0aGlzIHByb2JsZW0gYW5kIHRoZSBmdWRnZSBpcyBkZWZ1bmN0LgotICAgICAgICByZXR1cm4gWE1MVmFsaWRhdG9yLl9pbnRlcm5hbFJlc29sdmVFbnRpdHkodXJpcmVzb2x2ZXIsIHJlc291cmNlSWRlbnRpZmllcik7Ci0gICAgICAKLSAgICB9Ci0gIH0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTUwYWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwuWFNEQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBIYXNoTWFwIHhzZENvbmZpZ3VyYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3NldHVwVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCVhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLQlib29sZWFuIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucyA9IFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyk7Ci0JdHJ5Ci0JewotCSAgY29uZmlndXJhdGlvbi5zZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUywgaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgLy8gVW5hYmxlIHRvIHNldCB0aGUgaG9ub3VyIGFsbCBzY2hlbWEgbG9jYXRpb25zIG9wdGlvbi4gRG8gbm90aGluZy4KLQl9Ci0JeHNkQ29uZmlndXJhdGlvbnMucHV0KGNvbnRleHQsIGNvbmZpZ3VyYXRpb24pOwotCQotCXN1cGVyLnNldHVwVmFsaWRhdGlvbihjb250ZXh0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3RlYXJkb3duVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyZG93blZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCXhzZENvbmZpZ3VyYXRpb25zLnJlbW92ZShjb250ZXh0KTsKLQkKLQlzdXBlci50ZWFyZG93blZhbGlkYXRpb24oY29udGV4dCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmlvLklucHV0U3RyZWFtLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7ICAKLQlYU0RWYWxpZGF0b3IgdmFsaWRhdG9yID0gWFNEVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0JCi0JWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbil4c2RDb25maWd1cmF0aW9ucy5nZXQoY29udGV4dCk7Ci0KLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JCi0JdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbmZpZ3VyYXRpb24pOwotCQkgICAgICAgIAotCXJldHVybiB2YWxyZXBvcnQ7Ci0gIH0KLQkgIAotICAvKioKLSAgICogU3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgbWVzc2FnZSBwYXJhbWV0ZXJzLiBGb3IgWFNEIHZhbGlkYXRpb24gdGhlcmUKLSAgICogYXJlIHRocmVlIGFkZGl0aW9uYWwgcGllY2VzIG9mIGluZm9ybWF0aW9uIHRvIHN0b3JlOgotICAgKiBwYXJhbVswXSA9IHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBlcnJvcgotICAgKiBwYXJhbVsxXSA9IHRoZSAnc3F1aWdnbGUgc2VsZWN0aW9uIHN0cmF0ZWd5JyBmb3Igd2hpY2ggRE9NIHBhcnQgdG8gc3F1aWdnbGUKLSAgICogcGFyYW1bMl0gPSB0aGUgbmFtZSBvciB2YWx1ZSBvZiB3aGF0IGlzIHRvIGJlIHNxdWlnZ2xlZAotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI2FkZEluZm9Ub01lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEluZm9Ub01lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UsIElNZXNzYWdlIG1lc3NhZ2UpCi0gIHsgCi0JU3RyaW5nIGtleSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldEtleSgpOwotCWlmKGtleSAhPSBudWxsKQotCXsKLQkgIFhTRE1lc3NhZ2VJbmZvSGVscGVyIG1lc3NhZ2VJbmZvSGVscGVyID0gbmV3IFhTRE1lc3NhZ2VJbmZvSGVscGVyKCk7Ci0JICBTdHJpbmdbXSBtZXNzYWdlSW5mbyA9IG1lc3NhZ2VJbmZvSGVscGVyLmNyZWF0ZU1lc3NhZ2VJbmZvKGtleSwgdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TWVzc2FnZSgpKTsKLQotCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUsIG5ldyBJbnRlZ2VyKHZhbGlkYXRpb25NZXNzYWdlLmdldENvbHVtbk51bWJlcigpKSk7Ci0JICBtZXNzYWdlLnNldEF0dHJpYnV0ZShTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFLCBtZXNzYWdlSW5mb1swXSk7Ci0JICBtZXNzYWdlLnNldEF0dHJpYnV0ZShTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMV0pOwotCX0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI2dldFZhbGlkYXRvcklEKCkKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9ySUQoKQotICB7Ci0gICAgLy8gQmVjYXVzZSB0aGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBkZWxlZ2F0ZSwgcmV0dXJuIHRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yCi0gICAgLy8gd2hpY2ggZGVsZWdhdGVzIHRvIHRoaXMgY2xhc3MuCi0KLSAgICByZXR1cm4gWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjE1YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuRGVsZWdhdGluZ1ZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdW5pcXVlIG5hbWUgKGNsYXNzIG5hbWUpIHdoaWNoIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yawotICogd2lsbCB1c2UgdG8gaWRlbnRpZnkgdGhlIFhTRCB2YWxpZGF0b3IuIFRoZSBhY3R1YWwgZGVsZWdhdGluZyB2YWxpZGF0b3IKLSAqIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgdGhlIGJhc2UgY2xhc3MuIFRoZSBhY3R1YWwgdmFsaWRhdGlvbgotICogZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSB0aGUgZGVsZWdhdGVzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNsYXNzIGFzCi0gKiB0aGVpciB0YXJnZXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0REZWxlZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgRGVsZWdhdGluZ1ZhbGlkYXRvcgotewotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBYU0REZWxlZ2F0aW5nVmFsaWRhdG9yKCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRE1lc3NhZ2VJbmZvSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTY1ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RNZXNzYWdlSW5mb0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi0KLS8qKgotICogVGhlIFhTRE1lc3NhZ2VJbmZvSGVscGVyIGNyZWF0ZXMgYSBzdHJpbmcgd2l0aCB0aGUKLSAqLwotcHVibGljIGNsYXNzIFhTRE1lc3NhZ2VJbmZvSGVscGVyCi17Ci0gIHB1YmxpYyBYU0RNZXNzYWdlSW5mb0hlbHBlcigpCi0gIHsgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBjcmVhdGVNZXNzYWdlSW5mbyhTdHJpbmcgZXJyb3JLZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpCi0gIHsgCi0gICAgLy9Ob3cgbWFwIHRoZSBlcnJvciBrZXkgdG8gd2hhdCB3ZSB3b3VsZCB3YW50IHRvIHVuZGVybGluZToKLSAgICBTdHJpbmcgbmFtZU9yVmFsdWUgPSAiIjsKLSAgICBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiIjsKLSAgICBpZihlcnJvcktleSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtaW52YWxpZC1jb250ZW50LjEiKSB8fCBlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtbXVzdC1tYXRjaC4xIikgfHwgCi0gICAgCQkgIGVycm9yS2V5LmVxdWFscygiczRzLWF0dC1tdXN0LWFwcGVhciIpIHx8IGVycm9yS2V5LmVxdWFscygiczRzLWVsdC1pbnZhbGlkLWNvbnRlbnQuMiIpKQotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiU1RBUlRfVEFHIjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiczRzLWF0dC1ub3QtYWxsb3dlZCIpKQotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX05BTUUiOwotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtYXR0LWludmFsaWQtdmFsdWUiKSkKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9WQUxVRSI7Ci0gICAgICAgIG5hbWVPclZhbHVlID0gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuU2luZ2xlUXVvdGVzKGVycm9yTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtY2hhcmFjdGVyIikpCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJURVhUIjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygic3JjLXJlc29sdmUuNC4yIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJzcmMtcmVzb2x2ZSIpKQotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUiOwotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmcgbWVzc2FnZUluZm9bXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgbWVzc2FnZUluZm9bMF0gPSBzZWxlY3Rpb25TdHJhdGVneTsKLSAgICBtZXNzYWdlSW5mb1sxXSA9IG5hbWVPclZhbHVlOwotICAgIHJldHVybiBtZXNzYWdlSW5mbzsgICAgCi0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHZhbHVlIGJldHdlZW4gdGhlIGZpcnN0IHBhaXIgb2Ygc2luZ2xlIHF1b3RlcwotICAgKiBJdCBpcyB1c2VkIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgZXJyb3IgTWVzc2FnZSAoZm9yIGV4YW1wbGUKLSAgICogYW4gYXR0cmlidXRlIG5hbWUpCi0gICAqIAotICAgKiBAcGFyYW0gcwotICAgKiAJCVRoZSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuU2luZ2xlUXVvdGVzKFN0cmluZyBzKQotICB7Ci0gICAgaW50IGZpcnN0ID0gcy5pbmRleE9mKCInIik7Ci0gICAgaW50IHNlY29uZCA9IHMuaW5kZXhPZigiJyIsIGZpcnN0ICsgMSk7Ci0gICAgU3RyaW5nIGJldHdlZW5RdW90ZXMgPSBudWxsOwotICAgIGlmIChmaXJzdCAhPSAtMSAmJiBzZWNvbmQgIT0gLTEpCi0gICAgeyBiZXR3ZWVuUXVvdGVzID0gcy5zdWJzdHJpbmcoZmlyc3QgKyAxLCBzZWNvbmQpOwotICAgIH0KLSAgICByZXR1cm4gYmV0d2VlblF1b3RlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjFiYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLQotCi0vKioKLSAqIEFuIFhTRCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogWFNEIHZhbGlkYXRvciBhbiBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LgotICogVXNpbmcgdGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBpbnRlcm5hbCBYU0QgdmFsaWRhdG9yIGFuZCByZWdpc3RlcmluZwotICogdGhlIFVSSSByZXNvbHZlciBmcm9tIHRoZSBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RWYWxpZGF0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0RWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgWFNEVmFsaWRhdG9yIGluc3RhbmNlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgWFNEIHZhbGlkYXRvci4gVGhlIHZhbGlkYXRvcgotICAgKiBjYW4gYmUgcmV1c2VkIGFuZCBjYW5ub3QgYmUgY3VzdG9taXplZCBzbyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgaW5zdGFuY2Ugb2YgaXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIFhTRCB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhTRFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZihpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFhTRFZhbGlkYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBDcmVhdGUgdGhlIFhTRCB2YWxpZGF0b3IgYW5kIHNldCB0aGUgVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIFhTRFZhbGlkYXRvcigpCi0gIHsKLSAgICB0aGlzLnNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL1hTRENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvWFNEQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjMwZjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvWFNEQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLlhTRENNTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFhTRENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYU0RDb3JlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhTRENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgWFNEQ01NYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RhcnR1cCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNEQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzVlM2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwuWFNEQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBYU0QgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCi0JCS8vIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMuCi0JCW5vZGUucHV0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUywgZmFsc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2QwY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBYU0QgY29yZQotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBYU0RDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYWxsIHNjaGVtYSBsb2NhdGlvbnMgc2hvdWxkIGJlIGhvbm91cmVkCi0JICogZHVyaW5nIFhTRCB2YWxpZGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0JICogPC9wPgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9ICJob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGggYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3YjljNS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnByb3BlcnRpZXMKLWJ1aWxkLnhtbAotc3NlanVuaXQuamFyCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNTEwOS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4OThiYS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC43LjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHNzZXVuaXR0ZXN0cy5qYXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLm1pbm9ydG9vbHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnRlc3RzLmVuY29kaW5nLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cy5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy50ZXN0cy5lbmNvZGluZywKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnRlc3RzLnBlcmZvcm1hbmNlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC50ZXN0cy5lbmNvZGluZywKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cy5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QueG1sLnRlc3RzLmVuY29kaW5nLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkudGVzdHMucGVyZm9ybWFuY2UsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWksCi0gb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWksCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC52YWxpZGF0aW9uLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aSwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0MzcwYi4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVhNTF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1YTUwgU291cmNlIFBhZ2UgRWRpdG9yCi1KYXZhU2NyaXB0X1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUphdmFTY3JpcHQgU291cmNlIFBhZ2UgRWRpdG9yCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gVW5pdCBUZXN0cwotYWRkaXRpb25hbFRlc3RzPUFkZGl0aW9uYWwgVGVzdENhc2VzIGFuZCBUZXN0U3VpdGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnhtbCBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOWVlMTkuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgICAgICAgICAgICA8ZWRpdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSIlWE1MX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvc291cmNlRWRpdG9yLmdpZiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC9lZGl0b3I+Ci0gICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVKYXZhU2NyaXB0X1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iaWNvbnMvc291cmNlRWRpdG9yLmdpZiIKLQkJCWV4dGVuc2lvbnM9ImpzIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvckpTIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmVkaXRvci5KU0VkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQuY29yZS5qYXZhc2NyaXB0c291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQuY29yZS5qYXZhc2NyaXB0c291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFkZGl0aW9uYWxUZXN0cyIgbmFtZT0iJWFkZGl0aW9uYWxUZXN0cyIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJMaXN0VGVzdFN1aXRlLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTU3N2VlLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJMaXN0VGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRlc3RzLkpTUENvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC50ZXN0cy5lbmNvZGluZy5KU1BFbmNvZGluZ1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzLkpTUFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXN0cy5DU1NDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudGVzdHMuZW5jb2RpbmcuQ1NTRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZXN0cy5DU1NVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnRlc3RzLkRURFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGVzdHMuSFRNTENvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudGVzdHMuZW5jb2RpbmcuSFRNTEVuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlc3RzLkhUTUxVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGVzdHMuU1NFTW9kZWxUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cy5TU0VVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGVzdHMuU1NFTW9kZWxYTUxUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC50ZXN0cy5lbmNvZGluZy5FbmNvZGluZ1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlc3RzLlhNTFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbC5BbGxYTUxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuQWxsWFNEVGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBNYXN0ZXJMaXN0VGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXB1YmxpYyBNYXN0ZXJMaXN0VGVzdFN1aXRlKCkgewotCQlzdXBlcigiQWxsIFRlc3RzIik7Ci0KLQkJU3lzdGVtLnNldFByb3BlcnR5KCJ3dHAuYXV0b3Rlc3Qubm9uaW50ZXJhY3RpdmUiLCAidHJ1ZSIpOwotCi0JCWFkZFRlc3QoU1NFTW9kZWxUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoU1NFTW9kZWxYTUxUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQ1NTQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU1BDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoQWxsWE1MVGVzdHMuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChDU1NVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoU1NFVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoWE1MVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoRFREVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChBbGxYU0RUZXN0cy5zdWl0ZSgpKTsKLQotCQkvLyBhZGRUZXN0KFJlZ3Jlc3Npb25CdWNrZXQuc3VpdGUoKSk7Ci0JCS8vIGFkZFRlc3QoQWxsVGVzdENhc2VzLnN1aXRlKCkpOwotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLmFkZGl0aW9uYWxTdWl0ZXMiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoInN1aXRlIikpIHsKLQkJCQlUZXN0U3VpdGUgc3VpdGU7Ci0JCQkJdHJ5IHsKLQkJCQkJc3VpdGUgPSAoVGVzdFN1aXRlKSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCQlhZGRUZXN0KHN1aXRlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIpKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZWxlbWVudHNbaV0uZ2V0TmFtZSgpLmVxdWFscygidGVzdCIpKSB7Ci0JCQkJVGVzdCB0ZXN0OwotCQkJCXRyeSB7Ci0JCQkJCXRlc3QgPSAoVGVzdCkgZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKHRlc3QuZ2V0Q2xhc3MoKSkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIikpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgewotCQkvLyB0aGlzIG1ldGhvZCBuZWVkcyB0byBleGlzdCwgYnV0IGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nCi0JCS8vIG90aGVyIHRoYW4gdG8gc2lnbmFsIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotCQkvLyBUaGUgcmVzdCBpdCBhdXRvbWF0aWMgZnJvbSB0aGUgdGVzdHMgYWRkZWQgaW4gY29uc3RydWN0b3IuCi0JfQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3RlclBlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5MTAxNC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzLnBlcmZvcm1hbmNlLkpTUFVJUGVyZm9ybWFuY2VUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnRlc3RzLnBlcmZvcm1hbmNlLkNTU1VJUGVyZm9ybWFuY2VUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVzdHMucGVyZm9ybWFuY2UuSFRNTFVJUGVyZm9ybWFuY2VUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cy5wZXJmb3JtYW5jZS5TU0VVSVBlcmZvcm1hbmNlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudGVzdHMucGVyZm9ybWFuY2UuWE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wdWJsaWMgY2xhc3MgTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIE1hc3RlclBlcmZvcm1hbmNlVGVzdFN1aXRlKCkgewotCQlzdXBlcigiQWxsIFRlc3RzIik7Ci0KLQkJYWRkVGVzdChKU1BVSVBlcmZvcm1hbmNlVGVzdHMuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQ1NTVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChTU0VVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFhNTFVJUGVyZm9ybWFuY2VUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGwoKSB7Ci0JCS8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGV4aXN0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmdVdGlscy5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMGQ1ZTUuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLm1pbm9ydG9vbHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGVzdFN0cmluZ1V0aWxzIHsKLQotCS8qKgotCSAqIFRlc3RTdHJpbmdVdGlscyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVGVzdFN0cmluZ1V0aWxzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgbWF0Y2hpbmcgbGl0ZXJhbCBwb3J0aW9ucyBvZiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotCQlpZiAoYVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBub3JtYWxTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gYVN0cmluZy5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IHNwYWNlciA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJd2hpbGUgKHBvc2l0aW9uICsgc3BhY2VyIC0gMSA8IGxlbmd0aCAmJiBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwb3NpdGlvbikgPiAtMSkgewotCQkJcG9zaXRpb24gPSBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwcmV2aW91cyk7Ci0JCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwcmV2aW91cywgcG9zaXRpb24pICsgdGFyZ2V0OwotCQkJcG9zaXRpb24gKz0gc3BhY2VyOwotCQkJcHJldmlvdXMgPSBwb3NpdGlvbjsKLQkJfQotCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwb3NpdGlvbiwgYVN0cmluZy5sZW5ndGgoKSk7Ci0KLQkJcmV0dXJuIG5vcm1hbFN0cmluZzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExYTY2OC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMubWlub3J0b29sczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cy51dGlsLkNvbW1vblhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogTW9kaWZpZXMgcGx1Z2luLnhtbCBhbmQgZnJhZ21lbnQueG1sIGZpbGVzIHRvIG5vdCByZXF1aXJlIHNwZWNpZmljIHZlcnNpb25zCi0gKiBvZiB0aGVpciBwbHVnaW4gZGVwZW5kZW5jaWVzLgotICogCi0gKiBAYXV0aG9yIG5pdGluCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uUmVtb3ZlciB7Ci0KLQljaGFyW10gY2hhcmJ1ZmYgPSBuZXcgY2hhclsyMDQ4XTsKLQlTdHJpbmdCdWZmZXIgcyA9IG51bGw7Ci0KLQlwdWJsaWMgVmVyc2lvblJlbW92ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MubGVuZ3RoIDwgMSkKLQkJCW5ldyBWZXJzaW9uUmVtb3ZlcigpLnZpc2l0KG5ldyBGaWxlKCJkOi90YXJnZXQiKSk7Ci0JCWVsc2UKLQkJCW5ldyBWZXJzaW9uUmVtb3ZlcigpLnZpc2l0KG5ldyBGaWxlKGFyZ3NbMF0pKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXQoRmlsZSBmaWxlKSB7Ci0JCS8vIFNraXAgZGlyZWN0b3JpZXMgbGlrZSBvcmcuZWNsaXBzZS4qLCBvcmcuYXBhY2hlLiosIGFuZCBvcmcuanVuaXQuKgotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpICYmICFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS4iKSAmJiAhZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmFwYWNoZSIpICYmICFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuanVuaXQiKSkgewotCQkJU3RyaW5nW10gY29udGVudHMgPSBmaWxlLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspCi0JCQkJdmlzaXQobmV3IEZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICcvJyArIGNvbnRlbnRzW2ldKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaXh1cEZpbGUoZmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXh1cEZpbGUoRmlsZSBmaWxlKSB7Ci0JCS8vIG9ubHkgbG9hZCBhbmQgZml4dXAgZmlsZXMgbmFtZWQgcGx1Z2luLnhtbCBvciBmcmFnbWVudC54bWwgdW5kZXIgZWNsaXBzZVxwbHVnaW5zXFhYWFhYWFguKgotCQlpZiAoIShmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJwbHVnaW4ueG1sIikgfHwgZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZnJhZ21lbnQueG1sIikpIHx8IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuaW5kZXhPZigiZWNsaXBzZVxccGx1Z2luc1xcWFhYWFhYWC4iKSA9PSAtMSkKLQkJCXJldHVybjsKLQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJ5IHsKLQkJCURvY3VtZW50IGRvYyA9IENvbW1vblhNTC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShmaWxlKTsKLQkJCU5vZGVMaXN0IGltcG9ydHMgPSBudWxsOwotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInBsdWdpbi54bWwiKSkKLQkJCQlpbXBvcnRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbXBvcnQiKTsKLQkJCWVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZyYWdtZW50LnhtbCIpKQotCQkJCWltcG9ydHMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZyYWdtZW50Iik7Ci0JCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBpbXBvcnROb2RlID0gaW1wb3J0cy5pdGVtKGkpOwotCQkJCWlmIChpbXBvcnROb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaW1wb3J0IikgJiYgaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJ2ZXJzaW9uIikgIT0gbnVsbCkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkucmVtb3ZlTmFtZWRJdGVtKCJ2ZXJzaW9uIik7Ci0JCQkJfQotCQkJCWlmIChpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInBsdWdpbi12ZXJzaW9uIikgIT0gbnVsbCkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkucmVtb3ZlTmFtZWRJdGVtKCJwbHVnaW4tdmVyc2lvbiIpOwotCQkJCX0KLQkJCQlpZiAoaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJtYXRjaCIpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkucmVtb3ZlTmFtZWRJdGVtKCJtYXRjaCIpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hhbmdlZCkgewotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3N0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCUNvbW1vblhNTC5zZXJpYWxpemUoZG9jLCBvc3RyZWFtKTsKLQkJCQlvc3RyZWFtLmNsb3NlKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllZCAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZmlsZS5nZXRQYXRoKCkgKyAiOiAiICsgZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihmaWxlLmdldFBhdGgoKSArICI6ICIgKyBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWJlMWJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9FZGl0b3JKc3BDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9FZGl0b3JKc3BDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYzFmZWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJqc3BmMTAwMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIGRyb3AtZG93biBsaXN0czoKLS0gIDxiPkNoYXJhY3RlciBjb2RlOjwvYj4gU3BlY2lmaWVzIHRoZSBwYWdlIGRpcmVjdGl2ZSdzIHBhZ2VFbmNvZGluZyB2YWx1ZSBhbmQgY29udGVudFR5cGUgY2hhcnNldC4gSW4gSFRNTCBkb2N1bWVudHMsIHRoaXMgdmFsdWUgaXMgYWxzbyB1c2VkIGZvciB0aGUgJmx0O01FVEEmZ3Q7IHRhZydzIGNoYXJzZXQgcHJvcGVydHkuCi0tICA8Yj5MYW5ndWFnZTo8L2I+IFNwZWNpZmllcyB0aGUgcGFnZSBkaXJlY3RpdmUncyBwcm9ncmFtbWluZyBsYW5ndWFnZS4KLS0gIDxiPkNvbnRlbnQgVHlwZTo8L2I+IFNwZWNpZmllcyB0aGUgY29udGVudFR5cGUncyBUWVBFIHZhbHVlIGZvciB0aGUgcGFnZSBkaXJlY3RpdmUuIEluIEhUTUwgZG9jdW1lbnRzLCB0aGlzIHZhbHVlIGlzIGFsc28gdXNlZCBmb3IgdGhlICZsdDtNRVRBJmd0OyB0YWcncyBjb250ZW50IHByb3BlcnR5LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImpzcHIwMDEwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+UmVuYW1lIFJlc291cmNlPC9iPiBkaWFsb2csIGlmIGFwcGxpY2FibGUsIHdoaWNoIGxldHMgeW91IHJlbmFtZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudCBhbmQgcmVmZXJlbmNlcyB0byB0aGF0IGVsZW1lbnQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc291cmNlIGNvZGUgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ianNwcjAwMjAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5Nb3ZlPC9iPiBkaWFsb2csIGlmIGFwcGxpY2FibGUsIHdoaWNoIGxldHMgeW91IG1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnQuIEZvciBleGFtcGxlLCB5b3UgY2FuIG1vdmUgYSBtZXRob2QgZnJvbSBvbmUgY2xhc3MgdG8gYW5vdGhlci4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNvdXJjZSBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzb3VyY2UgY29kZSAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDUwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGEgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlLgotCi1WYXJpb3VzIGRldmVsb3BtZW50IHBsYXRmb3JtcyB1c2UgZGlmZmVyZW50IGxpbmUgZGVsaW1pdGVycyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4gU2VsZWN0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgY29ycmVzcG9uZHMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtLgotPGI+Tm90ZTo8L2I+IFRoaXMgZGVsaW1pdGVyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gYW55IGRvY3VtZW50cyB0aGF0IGN1cnJlbnRseSBleGlzdC4gSXQgd2lsbCBiZSBhZGRlZCBvbmx5IHRvIGRvY3VtZW50cyB0aGF0IHlvdSBjcmVhdGUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LCBvciB0byBleGlzdGluZyBmaWxlcyB0aGF0IHlvdSBvcGVuIGFuZCB0aGVuIHJlc2F2ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4uCi0KLVRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgSlNQIGZpbGVzLiAgQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3IEpTUCBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTEiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgdGhhdCB0aGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBlZGl0b3IgZG9lcyB3aGVuIHlvdSBhcmUgZWRpdGluZyBhIGZpbGUuIgotCi1UaGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBzb3VyY2UgdHlwZXMgdGhhdCB5b3UgY2FuIHNlbGVjdCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gZWl0aGVyIHNlbGVjdCB0aGUgY29udGVudCB0eXBlIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LCBvciBjbGljayB0ZXh0IGluIHRoZSB0ZXh0IHNhbXBsZSB3aW5kb3cgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY29udGVudCB0eXBlIGZvciB3aGljaCB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHRleHQgaGlnaGxpZ2h0aW5nLgotCi1UaGUgPGI+Rm9yZWdyb3VuZDwvYj4gYW5kIDxiPkJhY2tncm91bmQ8L2I+IHB1c2ggYnV0dG9ucyBvcGVuIDxiPkNvbG9yPC9iPiBkaWFsb2cgYm94ZXMgdGhhdCBsZXQgeW91IHNwZWNpZnkgdGV4dCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycywgcmVzcGVjdGl2ZWx5LiBTZWxlY3QgdGhlIDxiPkJvbGQ8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGFwcGVhciBpbiBib2xkLgotCi1DbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0PC9iPiBwdXNoIGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDUyIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3JlYXRlIG5ldyBhbmQgZWRpdCBleGlzdGluZyB0ZW1wbGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgZWRpdCBhIEpTUCBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTEwNTAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5DbGVhbnVwPC9iPiBkaWFsb2csIHdoaWNoIGNvbnRhaW5zIHNldHRpbmdzIHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQgYW5kIGZvcm1hdHRlZC4gQ2xlYW51cCBpbmNsdWRlcyBzdWNoIGFjdGl2aXRpZXMgYXMgaW5zZXJ0aW5nIG1pc3NpbmcgdGFncywgYWRkaW5nIHF1b3RhdGlvbiBtYXJrcyBhcm91bmQgYXR0cmlidXRlIHZhbHVlcywgbm9kZSBjYXBpdGFsaXphdGlvbiwgYW5kIGZvcm1hdHRpbmcgYSBkb2N1bWVudC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9FZGl0b3JKc3BDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwODM1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9FZGl0b3JKc3BDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJqc3Bzb3VyY2Vfc291cmNlX0hlbHBJZCI+Ci08ZGVzY3JpcHRpb24+VGhlIEpTUCBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIEphdmFTZXJ2ZXIgUGFnZXMgZmlsZS4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgdXNlci1kZWZpbmVkIHRlbXBsYXRlcywgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ik1ha2luZyBjb250ZW50IGFzc2lzdCB3b3JrIGZvciBKU1AgZmlsZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianNwZjEwMDAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdHM6Ci0tICA8Yj5DaGFyYWN0ZXIgY29kZTo8L2I+IFNwZWNpZmllcyB0aGUgcGFnZSBkaXJlY3RpdmUncyBwYWdlRW5jb2RpbmcgdmFsdWUgYW5kIGNvbnRlbnRUeXBlIGNoYXJzZXQuIEluIEhUTUwgZG9jdW1lbnRzLCB0aGlzIHZhbHVlIGlzIGFsc28gdXNlZCBmb3IgdGhlICZsdDtNRVRBJmd0OyB0YWcncyBjaGFyc2V0IHByb3BlcnR5LgotLSAgPGI+TGFuZ3VhZ2U6PC9iPiBTcGVjaWZpZXMgdGhlIHBhZ2UgZGlyZWN0aXZlJ3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0tICA8Yj5Db250ZW50IFR5cGU6PC9iPiBTcGVjaWZpZXMgdGhlIGNvbnRlbnRUeXBlJ3MgVFlQRSB2YWx1ZSBmb3IgdGhlIHBhZ2UgZGlyZWN0aXZlLiBJbiBIVE1MIGRvY3VtZW50cywgdGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgZm9yIHRoZSAmbHQ7TUVUQSZndDsgdGFnJ3MgY29udGVudCBwcm9wZXJ0eS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqc3ByMDAxMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPlJlZmFjdG9yIFJlbmFtZTwvYj4gZGlhbG9nLCBpZiBhcHBsaWNhYmxlLCB3aGljaCBsZXRzIHlvdSByZW5hbWUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnQgYW5kIHJlZmVyZW5jZXMgdG8gdGhhdCBlbGVtZW50LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNvdXJjZSBjb2RlIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9ImpzcHIwMDIwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+UmVmYWN0b3IgTW92ZTwvYj4gZGlhbG9nLCBpZiBhcHBsaWNhYmxlLCB3aGljaCBsZXRzIHlvdSBtb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBtb3ZlIGEgbWV0aG9kIGZyb20gb25lIGNsYXNzIHRvIGFub3RoZXIuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc291cmNlIGNvZGUgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZS4KLQotVmFyaW91cyBkZXZlbG9wbWVudCBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudCBsaW5lIGRlbGltaXRlcnMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUuIFNlbGVjdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IGNvcnJlc3BvbmRzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybS4KLTxiPk5vdGU6PC9iPiBUaGlzIGRlbGltaXRlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGFueSBkb2N1bWVudHMgdGhhdCBjdXJyZW50bHkgZXhpc3QuIEl0IHdpbGwgYmUgYWRkZWQgb25seSB0byBkb2N1bWVudHMgdGhhdCB5b3UgY3JlYXRlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPiwgb3IgdG8gZXhpc3RpbmcgZmlsZXMgdGhhdCB5b3Ugb3BlbiBhbmQgdGhlbiByZXNhdmUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LgotCi1UaGUgZW5jb2RpbmcgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2V0IHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIEpTUCBmaWxlcy4gIENoYW5naW5nIHRoZSBlbmNvZGluZyBjYXVzZXMgYW55IG5ldyBKU1AgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDUxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLiIKLQotVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBwdXNoIGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgbGV0IHlvdSBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQotQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdDwvYj4gcHVzaCBidXR0b24gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MiI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGNyZWF0ZSBuZXcgYW5kIGVkaXQgZXhpc3RpbmcgdGVtcGxhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGVkaXQgYSBKU1AgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDUwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+Q2xlYW51cDwvYj4gZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkIGFuZCBmb3JtYXR0ZWQuIENsZWFudXAgaW5jbHVkZXMgc3VjaCBhY3Rpdml0aWVzIGFzIGluc2VydGluZyBtaXNzaW5nIHRhZ3MsIGFkZGluZyBxdW90YXRpb24gbWFya3MgYXJvdW5kIGF0dHJpYnV0ZSB2YWx1ZXMsIG5vZGUgY2FwaXRhbGl6YXRpb24sIGFuZCBmb3JtYXR0aW5nIGEgZG9jdW1lbnQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvSnNwV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvSnNwV2l6Q29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDA4NWUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0pzcFdpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImpzcHcwMDEwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU2VsZWN0IHRoZSBKU1AgdGVtcGxhdGUgY2hlY2tib3ggdG8gY3JlYXRlIHlvdXIgSlNQIGZpbGUgYmFzZWQgb24gYSBkZWZhdWx0IHRlbXBsYXRlLiBZb3UgY2FuIGNob29zZSB0byBoYXZlIHlvdXIgSlNQIGNyZWF0ZWQgd2l0aCBIVE1MLCBYSFRNTCwgb3IgWEhUTUwgd2l0aCBYTUwgbWFya3VwLiBJZiB5b3UgZG8gbm90IHNlbGVjdCBhIHRlbXBsYXRlLCB5b3VyIG5ld2x5IGNyZWF0ZWQgSlNQIGZpbGUgd2lsbCBiZSBjb21wbGV0ZWx5IGJsYW5rLgotCQk8L2Rlc2NyaXB0aW9uPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2MwN2IwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjYjZjNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gRWRpdG9ySnNwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckpzcENvbnRleHRzMi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgRWRpdG9ySnNwQ29udGV4dHMyLnhtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JKc3BDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzhjNDRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVHJhbnNsYXRpb24gSW5zdHJ1Y3Rpb246IHNlY3Rpb24gdG8gYmUgdHJhbnNsYXRlZAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBsdWdpbi5uYW1lID0gSlNQIHRvb2xzIGluZm9wb3BzCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWIxMTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4xIj8+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JKc3BDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JKc3BDb250ZXh0czIueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJKc3BXaXpDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIvPgotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2M4NDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXJfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM3NWI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkNmRhYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMy5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGYyNTUzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLUBpbXBvcnQgIi4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKLQotUC5Db2RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwLjAwcHQ7Ci0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMTVwdDsKLQlmb250LXNpemU6IDEwLjAwMDAwMHB0OwotCWZvbnQtd2VpZ2h0OiBtZWRpdW07Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQljb2xvcjogIzQ0NDRDQzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOwotfQotCi1INi5DYXB0aW9uRmlnQ29sdW1uIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwLjAwMDAwMHB0OwotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0OwotCWZvbnQtc2l6ZTogOS4wMDAwMDBwdDsKLQlmb250LXdlaWdodDogbWVkaXVtOwotCWZvbnQtc3R5bGU6IEl0YWxpYzsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQXJpYWwiOwotfQotCi1QLk5vdGUgewotCWRpc3BsYXk6IGJsb2NrOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0JdGV4dC1pbmRlbnQ6IDBwdDsKLQltYXJnaW4tdG9wOiAxOS41MDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAxOS41MDAwMDBwdDsKLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWxlZnQ6IDMwcHQ7Ci0JZm9udC1zaXplOiAxMS4wMDAwMDBwdDsKLQlmb250LXdlaWdodDogbWVkaXVtOwotCWZvbnQtc3R5bGU6IEl0YWxpYzsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQXJpYWwiOwotfQotCi1FTS5VSUxhYmVsIHsKLQlmb250LXdlaWdodDogQm9sZDsKLQlmb250LXN0eWxlOiBSZWd1bGFyOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0JdGV4dC10cmFuc2Zvcm06IG5vbmU7Ci19Ci0KLUVNLkNvZGVOYW1lIHsKLQlmb250LXdlaWdodDogQm9sZDsKLQlmb250LXN0eWxlOiBSZWd1bGFyOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0JdGV4dC10cmFuc2Zvcm06IG5vbmU7Ci0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyI7Ci19Ci0KLS8qIGZvbGxvd2luZyBmb250IGZhY2UgZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgcmVtb3ZlZCBmb3IgREJDUyAqLwotYm9keSxoMSxoMixoMyxoNCxoNSxoNixwLHRhYmxlLHRkLGNhcHRpb24sdGgsdWwsb2wsZGwsbGksZGQsZHQgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWNvbG9yOiAjMDAwMDAwCi19Ci0KLXByZSB7Ci0JZm9udC1mYW1pbHk6IENvdXJpZXIsIG1vbm9zcGFjZQotfQotCi0vKiBlbmQgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyAqLwotCS8qIGZvbGxvd2luZyBmb250IHNpemUgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBPSyBmb3IgREJDUyAqLwotYm9keSxoMSxoMixoMyxoNCxoNSxoNixwLHRhYmxlLHRkLGNhcHRpb24sdGgsdWwsb2wsZGwsbGksZGQsZHQgewotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotcHJlIHsKLQlmb250LXNpemU6IDEwcHQKLX0KLQotLyogZW5kIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgKi8KLWJvZHkgewotCWJhY2tncm91bmQ6ICNGRkZGRkYKLX0KLQotaDEgewotCWZvbnQtc2l6ZTogMThwdDsKLQltYXJnaW4tdG9wOiA1OwotCW1hcmdpbi1ib3R0b206IDEKLX0KLQotaDIgewotCWZvbnQtc2l6ZTogMTRwdDsKLQltYXJnaW4tdG9wOiAyNTsKLQltYXJnaW4tYm90dG9tOiAzCi19Ci0KLWgzIHsKLQlmb250LXNpemU6IDExcHQ7Ci0JbWFyZ2luLXRvcDogMjA7Ci0JbWFyZ2luLWJvdHRvbTogMwotfQotCi1oNCB7Ci0JZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbi10b3A6IDIwOwotCW1hcmdpbi1ib3R0b206IDM7Ci0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLXAgewotCW1hcmdpbi10b3A6IDEwcHg7Ci0JbWFyZ2luLWJvdHRvbTogMTBweAotfQotCi1wcmUgewotCW1hcmdpbi1sZWZ0OiA2OwotCWZvbnQtc2l6ZTogOXB0Ci19Ci0KLWE6bGluayB7Ci0JY29sb3I6ICMwMDAwRkYKLX0KLQotYTpob3ZlciB7Ci0JY29sb3I6ICMwMDAwODAKLX0KLQotYTp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi11bCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAxMAotfQotCi1saSB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwCi19Ci0KLWxpIHAgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMAotfQotCi1vbCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAxMAotfQotCi1kbCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAxMAotfQotCi1kdCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotCWZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLWRkIHsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDAKLX0KLQotc3Ryb25nIHsKLQlmb250LXdlaWdodDogYm9sZAotfQotCi1lbSB7Ci0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLXZhciB7Ci0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLWRpdi5yZXZpc2lvbiB7Ci0JYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkOwotCWJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOwotCWJvcmRlci1sZWZ0LWNvbG9yOiAjN0I2OEVFOwotCXBhZGRpbmctbGVmdDogNQotfQotCi10aCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyNzBlOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBjb21tb24uY3NzLFwKLSAgICAgICAgICAgICAgIGNvbW1vbmx0ci5jc3MsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbm90aWNlcy5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvLFwKLSAgICAgICAgICAgICAgIGJvb2suY3NzLFwKLSAgICAgICAgICAgICAgIGNvbW1vbnJ0bC5jc3MKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRmM2YyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk3ICswLDAgQEAKLWJvZHkgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuOGVtOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6IEJsYWNrOwotCW1hcmdpbi1yaWdodDogNWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmlibWZpbGVwYXRoIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLmlibWNvbW1hbmQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaWJtZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLm12LC5waywucGtkZWYsLnB2IHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctcmlnaHQ6IC4zZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWxlZnQ6IC4zZW07Ci19Ci0KLXR0LHNhbXAgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi1CT0RZLm5hdiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIHJpZGdlIGJsYWNrOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uYmFzZSB7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC12YXJpYW50OiBub3JtYWw7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLVRBQkxFIHsKLQljb2xvcjogYmxhY2s7Ci0Jd2lkdGg6IDkwJTsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotCWJvcmRlci1jb2xvcjogQmxhY2s7Ci0JYmFja2dyb3VuZDogd2hpdGU7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tcmlnaHQ6IDBlbTsKLX0KLQotLnRibGRlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotVEggewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC43ZW07Ci0JY29sb3I6IGJsYWNrOwotCWJhY2tncm91bmQtY29sb3I6ICNkYWRhZGE7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVRILmJhc2UgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiBibGFjazsKLQlib3JkZXI6IDEgc29saWQgIzYwNjA2MDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGNkYWRhOwotCXBhZGRpbmctdG9wOiAwLjY1ZW07Ci0JcGFkZGluZy1ib3R0b206IDAuNjVlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVREIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuM2VtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotQ0lURSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1FTSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1TVFJPTkcgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1jYXB0aW9uIHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRFQgewotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotfQotCi1ERCB7Ci0JbWFyZ2luLWxlZnQ6IDEuMGVtOwotfQotCi1QUkUscHJlLmNncmFwaGljIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTJweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmc6IDVweDsKLX0KLQotLml0YWxpYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS51bmRlcmxpbmVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtaXRhbGljLC5ib2xkSXRhbGljIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5zbWFsbENhcHMsLnNtYWxsY2FwcyB7Ci0JdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKLQlmb250LXNpemU6IHNtYWxsZXI7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotfQotCi0uaXRhbGljLXVuZGVybGluZWQgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5zbWFsbGNhcHMtdW5kZXJsaW5lZCB7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmlubGluZWRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc2lkZWJhciB7Ci0JYmFja2dyb3VuZDogI2NjY2NjYzsKLX0KLQotQTpsaW5rIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTp2aXNpdGVkIHsKLQljb2xvcjogIzk5NjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTphY3RpdmUgewotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOmhvdmVyIHsKLQljb2xvcjogIzk5NjY5OTs7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5wdG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5pbmRleGxpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS50YWJsZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi1hLmJvbGRncmV5bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5ydW5uaW5naGVhZGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuN2VtOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmxpbmsgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTphY3RpdmUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTp2aXNpdGVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6aG92ZXIgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0jYnJlYWRjcnVtYiwuYnJlYWRjcnVtYixzcGFuLmJyZWFkY3J1bWJzIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLX0KLQotLmZhc3RwYXRoIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZmFzdHBhdGh0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b2MgewotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLS5uZXN0ZWQwIHsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS5wIHsKLQltYXJnaW4tdG9wOiAxZW07Ci19Ci0KLXNwYW4uZmlnY2FwIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uZmlnZGVzYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYuZmlnYm94IHsKLQkKLX0KLQotZGl2LmZpZ3J1bGVzIHsKLQkKLX0KLQotZGl2LmZpZ25vbmUgewotCQotfQotCi0uZmlnbm9uZSB7Ci0JCi19Ci0KLS5maWdib3JkZXIgewotCQotfQotCi0uZmlnc2lkZXMgewotCQotfQotCi0uZmlndG9wIHsKLQkKLX0KLQotLmZpZ2JvdHRvbSB7Ci0JCi19Ci0KLS5maWd0b3Bib3QgewotCQotfQotCi0ucGFyZW50bGluayB7Ci0JCi19Ci0KLS5wcmV2bGluayB7Ci0JCi19Ci0KLS5uZXh0bGluayB7Ci0JCi19Ci0KLS5yZWxjb25jZXB0c2hkIHsKLQkKLX0KLQotLnJlbHRhc2tzaGQgewotCQotfQotCi0ucmVscmVmaGQgewotCQotfQotCi0uc3lubm9uZSB7Ci0JCi19Ci0KLS5zeW5ib3JkZXIgewotCQotfQotCi0uc3luc2lkZXMgewotCQotfQotCi0uc3ludG9wIHsKLQkKLX0KLQotLnN5bmJvdHRvbSB7Ci0JCi19Ci0KLS5zeW50b3Bib3QgewotCQotfQotCi0uc2tpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi0uc2tpcHNwYWNlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udWxjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5vbGNoaWxkbGluayB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotdWwsb2wgewotCW1hcmdpbi10b3A6IDAuMWVtOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLX0KLQotdWwuc2ltcGxlIHsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLXVsLmluZGV4bGlzdCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi1PTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1VTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1PTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi1VTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0qIFtjb21wYWN0PSJ5ZXMiXT5saSB7Ci0JbWFyZ2luLXRvcDogMCBlbTsKLX0KLQotKiBbY29tcGFjdD0ibm8iXT5saSB7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWhyIHsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JbWFyZ2luLXRvcDogMGVtOwotCXBhZGRpbmctdG9wOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQl3aWR0aDogOTAlOwotCWNvbG9yOiAjY2NjY2NjOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotSDEsLnRpdGxlLC5wYWdldGl0bGUsLnRvcGljdGl0bGUxIHsKLQlmb250LXNpemU6IDEuNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQl3b3JkLXNwYWNpbmc6IDAuMWVtOwotfQotCi1IMiwuc3VidGl0bGUsLnBhZ2VzdWJ0aXRsZSwudG9waWN0aXRsZTIgewotCWZvbnQtc2l6ZTogMS4yNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4wZW07Ci19Ci0KLUgzLC5ib2xkdGl0bGUsLnRvcGljdGl0bGUzIHsKLQlmb250LXNpemU6IDEuMGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4xZW07Ci19Ci0KLUg0LC50b3BpY3RpdGxlNCB7Ci0JZm9udC1zaXplOiAwLjllbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1oNSwudG9waWN0aXRsZTUgewotCWZvbnQtc2l6ZTogMC44ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1oNiwudG9waWN0aXRsZTYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1kaXYuaGVhZHRpdGxlIHsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMGVtOwotfQotCi1kaXYuaGVhZDAgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQxIHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAxZW07Ci0JcGFkZGluZy10b3A6IDAuNWVtOwotfQotCi1kaXYuaGVhZDIgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuaGVhZDMgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYuaGVhZDQgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNGVtOwotfQotCi1kaXYuaGVhZDUgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuaGVhZDYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNmVtOwotfQotCi1kaXYuaGVhZDcgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogN2VtOwotfQotCi1kaXYuaGVhZDggewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOGVtOwotfQotCi1kaXYuaGVhZDkgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOWVtOwotfQotCi0udGlwIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udGlwdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uZmlyc3Rjb2wgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucHRvY0gxIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5wdG9jSDIgewotCWZvbnQtc2l6ZTogeC1zbWFsbDsKLX0KLQotLnN0aXRsZSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0ubnRlIHsKLQkKLX0KLQotLnh4bGluZXMgewotCXdoaXRlLXNwYWNlOiBwcmU7Ci0JZm9udC1zaXplOiAwLjk1ZW07Ci19Ci0KLS5zZWN0aW9udGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JY29sb3I6IGJsYWNrOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5pbWFnZWxlZnQgewotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5pbWFnZWNlbnRlciB7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYuaW1hZ2VyaWdodCB7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLWRpdi5pbWFnZWp1c3RpZnkgewotCXRleHQtYWxpZ246IGp1c3RpZnk7Ci19Ci0KLWRpdi5tbW9iaiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9iamxlZnQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotZGl2Lm1tb2JqY2VudGVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2Lm1tb2JqcmlnaHQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXByZS5zY3JlZW4gewotCXBhZGRpbmc6IDFlbSAxZW0gMWVtIDFlbTsKLQltYXJnaW4tdG9wOiAwLjRlbTsKLQltYXJnaW4tYm90dG9tOiAwLjRlbTsKLQlib3JkZXI6IHRoaW4gc29saWQgQmxhY2s7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi0ucHJlcmVxIHsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci19Ci0KLS5kZWZMaXN0SGVhZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ubXYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5tZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Ci19Ci0KLS5wayxzcGFuLnBrIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5wa2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ucHYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5wdmRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLmt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ua2R3ZGVmIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLnBhcm1MaXN0S3dkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnBhcm1MaXN0VmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ub3BlciB7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotfQotCi1zcGFuLm9wZXJkZWYgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1WQVIsc3Bhbi52YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi52YXJkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotZGl2Lm1zZyB7Ci0JcGFkZGluZzogMC4yZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci19Ci0KLWRpdi5tc2dudW0gewotCWZsb2F0OiBsZWZ0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQltYXJnaW4tcmlnaHQ6IDFlbTsKLX0KLQotZGl2Lm1zZ3RleHQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotZGl2Lm1zZ2l0ZW10aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubXNnaXRlbSB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0uYXR0ZW50aW9uLGRpdi5hdHRlbnRpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5hdHRlbnRpb250aXRsZSxzcGFuLmF0dGVudGlvbnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmNhdXRpb250aXRsZSxkaXYuY2F1dGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9uLGRpdi5jYXV0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZGFuZ2VyLGRpdi5kYW5nZXIgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlcjogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcnRpdGxlLGRpdi5kYW5nZXJ0aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaW1wb3J0YW50IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uaW1wb3J0YW50dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucmVtZW1iZXIgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5yZW1lbWJlcnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlc3RyaWN0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVzdHJpY3Rpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi53YXJuaW5ndGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ2JvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW0KLX0KLQotLm5vdGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5ub3RldGl0bGUsZGl2Lm5vdGV0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5ub3RlYm9keSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2Lm5vdGVsaXN0dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuZm5udW0gewotCWZsb2F0OiBsZWZ0OwotfQotCi1kaXYuZm50ZXh0IHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGwgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5zdGVwbG51bSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogMC41ZW07Ci19Ci0KLWRpdi5zdGVwbHRleHQgewotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5sZWRpIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkZXNjIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1zcGFuLnBibGt0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5wYmxrbGJsYm94IHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLX0KLQotc3Bhbi5lZG5vdGljZXN0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udWljb250cm9sIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi50ZXJtIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5pZHhzaG93IHsKLQljb2xvcjogZ3JlZW47Ci19Ci0KLWRpdi5jb2RlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLXNwYW4ucmVma2V5IHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogd2hpdGU7Ci0JYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Ci19Ci0KLXR0LmFwbCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYucXVhbGlmc3RhcnQgewotCXBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlci10b3A6IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5xdWFsaWZlbmQgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuMWVtIDAuNWVtOwotCWJvcmRlci1ib3R0b206IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLS5ub3NoYWRlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLX0KLQotLnhsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLmxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQjBCMEIwOwotfQotCi0ubWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEM4QzhDOwotfQotCi0uZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZFNkU2RTsKLX0KLQotLnhkYXJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNTg1ODU4OwotfQotCi0ubGlnaHQteWVsbG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkNDOwotfQotCi0ua2hha2kgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDOTk7Ci19Ci0KLS5tZWRpdW0tYmx1ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2OTlDQzsKLX0KLQotLmxpZ2h0LWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDRkY7Ci19Ci0KLS5taWQtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLX0KLQotLmxpZ2h0LWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodGVzdC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTZFNkU2OwotfQotCi0jY2hhbmdlZCB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCWxlZnQ6IDAuMmVtOwotCWNvbG9yOiAjN0I2OEVFOwotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1JTlBVVC5idXR0b25zIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLQlib3JkZXItdG9wOiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1ib3R0b206IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1sZWZ0OiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0uY2dyYXBoaWMgewotCWZvbnQtc2l6ZTogOTAlOwotCWNvbG9yOiBibGFjazsKLX0KLQotLmFpeCwuaHB1eCwuc3VuLC51bml4LC53aW4yLC53aW5udCwud2luLC56b3MsLmxpbnV4LC5vczM5MCwub3M0MDAsLmMsLmNwbHVzcGx1cywuY29ib2wsLmZvcnRyYW4sLmphdmEsLm1hY29zeCwub3MyLC5wbDEsLnJwZwotCXsKLQliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0OwotCW1hcmdpbi10b3A6IDAuNWVtOwotCXRleHQtaW5kZW50OiA1NXB4OwotfQotCi0uYWl4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdhaXguZ2lmKTsKLX0KLQotLmhwdXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2hwdXguZ2lmKTsKLX0KLQotLnN1biB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nc29sYXJpcy5naWYpOwotfQotCi0udW5peCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ndW5peC5naWYpOwotfQotCi0ud2luMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMjAwMC5naWYpOwotfQotCi0ud2lueHAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3hwLmdpZik7Ci19Ci0KLS53aW5udCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nbnQuZ2lmKTsKLX0KLQotLndpbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nd2luLmdpZik7Ci19Ci0KLS56b3MgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3pvcy5naWYpOwotfQotCi0ubGludXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2xpbnV4LmdpZik7Ci19Ci0KLS5vczM5MCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMzkwLmdpZik7Ci19Ci0KLS5vczQwMCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nNDAwLmdpZik7Ci19Ci0KLS5jIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjLmdpZik7Ci19Ci0KLS5jcGx1c3BsdXMgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NwcC5naWYpOwotfQotCi0uY29ib2wgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NvYm9sLmdpZik7Ci19Ci0KLS5mb3J0cmFuIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdmb3J0cmFuLmdpZik7Ci19Ci0KLS5qYXZhIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdqYXZhLmdpZik7Ci19Ci0KLS5tYWNvc3ggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ21hY29zeC5naWYpOwotfQotCi0ub3MyIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdvczIuZ2lmKTsKLX0KLQotLnBsMSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ncGwxLmdpZik7Ci19Ci0KLS5ycGcgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3JwZy5naWYpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbmx0ci5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE4MTk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbmx0ci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA2ICswLDAgQEAKLS8qCi0gfCAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0LCAyMDA1IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLSAKLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLmJhc2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB9Ci0KLS8qIEFkZCBzcGFjZSBmb3IgdG9wIGxldmVsIHRvcGljcyAqLwotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLQotLyogZGl2IHdpdGggY2xhc3M9cCBpcyB1c2VkIGZvciBwYXJhZ3JhcGhzIHRoYXQgY29udGFpbiBibG9ja3MsIHRvIGtlZXAgdGhlIFhIVE1MIHZhbGlkICovCi0ucCB7bWFyZ2luLXRvcDogMWVtfQotCi0vKiBEZWZhdWx0IG9mIGl0YWxpY3MgdG8gc2V0IGFwYXJ0IGZpZ3VyZSBjYXB0aW9ucyAqLwotLmZpZ2NhcCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uZmlnZGVzYyB7IGZvbnQtc3R5bGU6IG5vcm1hbCB9Ci0KLS8qIFVzZSBAZnJhbWUgdG8gY3JlYXRlIGZyYW1lcyBvbiBmaWd1cmVzICovCi0uZmlnYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdzaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLyogTW9zdCBsaW5rIGdyb3VwcyBhcmUgY3JlYXRlZCB3aXRoIDxkaXY+LiBFbnN1cmUgdGhleSBoYXZlIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIuICovCi0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0d2l0aGNoaWxkIHsgbWFyZ2luLWxlZnQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5zdWJsaW5rbGlzdCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0ucmVsY29uY2VwdHMgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsdGFza3MgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVscmVmIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbGluZm8geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uYnJlYWRjcnVtYiB7IGZvbnQtc2l6ZSA6IHNtYWxsZXI7IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucHJlcmVxIHsgbWFyZ2luLWxlZnQgOiAyMHB4O30KLQotLyogU2V0IGhlYWRpbmcgc2l6ZXMsIGdldHRpbmcgc21hbGxlciBmb3IgZGVlcGVyIG5lc3RpbmcgKi8KLS50b3BpY3RpdGxlMSB7IG1hcmdpbi10b3A6IDBwYzsgbWFyZ2luLWJvdHRvbTogLjFlbTsgZm9udC1zaXplOiAxLjM0ZW07IH0KLS50b3BpY3RpdGxlMiB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjQ1ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyB9Ci0udG9waWN0aXRsZTMgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC4xN2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNCB7IG1hcmdpbi10b3A6IC44M2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNSB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU2IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnNlY3Rpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMGVtOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDt9Ci0uc2VjdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5leGFtcGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGwgbm90ZSBmb3JtYXRzIGhhdmUgdGhlIHNhbWUgZGVmYXVsdCBwcmVzZW50YXRpb24gKi8KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmNhdXRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5jYXV0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b20gOiAxZW07IH0KLQotLyogU2ltcGxlIGxpc3RzIGRvIG5vdCBnZXQgYSBidWxsZXQgKi8KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS8qIFVzZWQgb24gdGhlIGZpcnN0IGNvbHVtbiBvZiBhIHRhYmxlLCB3aGVuIHJvd2hlYWRlcj0iZmlyc3Rjb2wiIGlzIHVzZWQgKi8KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS8qIFZhcmlvdXMgYmFzaWMgcGhyYXNlIHN0eWxlcyAqLwotLmJvbGQgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmJvbGRJdGFsaWMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uaXRhbGljIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0udW5kZXJsaW5lZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udWljb250cm9sIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS8qIERlZmF1bHQgb2YgYm9sZCBmb3IgZGVmaW5pdGlvbiBsaXN0IHRlcm1zICovCi0uZGx0ZXJtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLQotLyogVXNlIENTUyB0byBleHBhbmQgbGlzdHMgd2l0aCBAY29tcGFjdD0ibm8iICovCi0uZGx0ZXJtZXhwYW5kIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDFlbTsgfQotKltjb21wYWN0PSJ5ZXMiXT5saSB7IG1hcmdpbi10b3A6IDBlbTt9Ci0qW2NvbXBhY3Q9Im5vIl0+bGkgeyBtYXJnaW4tdG9wOiAuNTNlbTt9CQotLmxpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnNsaWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5kbGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5kZGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN1YnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS8qIEFsaWduIGltYWdlcyBiYXNlZCBvbiBAYWxpZ24gb24gdG9waWMvaW1hZ2UgKi8KLWRpdi5pbWFnZWxlZnQgeyB0ZXh0LWFsaWduOiBsZWZ0IH0KLWRpdi5pbWFnZWNlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlciB9Ci1kaXYuaW1hZ2VyaWdodCB7IHRleHQtYWxpZ246IHJpZ2h0IH0KLWRpdi5pbWFnZWp1c3RpZnkgeyB0ZXh0LWFsaWduOiBqdXN0aWZ5IH0KLQotcHJlLnNjcmVlbiB7IHBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsgYm9yZGVyOiBvdXRzZXQ7IGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7IG1hcmdpbi10b3A6IDJweDsgbWFyZ2luLWJvdHRvbSA6IDJweDsgd2hpdGUtc3BhY2U6IHByZX0KLQotLyogY29waWVkIGZyb20gY29tbW9uLmNzcyAqLwotYm9keSB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMC44ZW07Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQljb2xvcjogQmxhY2s7Ci0JbWFyZ2luLXJpZ2h0OiA1ZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uaWJtZmlsZXBhdGggewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi0uaWJtY29tbWFuZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5pYm1lbXBoYXNpcyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0ubXYsLnBrLC5wa2RlZiwucHYgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotCXBhZGRpbmctdG9wOiAwZW07Ci0JcGFkZGluZy1yaWdodDogLjNlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotCXBhZGRpbmctbGVmdDogLjNlbTsKLX0KLQotdHQsc2FtcCB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci19Ci0KLUJPRFkubmF2IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWJvcmRlci1yaWdodDogMC4yZW0gcmlkZ2UgYmxhY2s7Ci0JZm9udC1zaXplOiAwLjk1ZW07Ci19Ci0KLS5iYXNlIHsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXZhcmlhbnQ6IG5vcm1hbDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLX0KLQotVEFCTEUgewotCWNvbG9yOiBibGFjazsKLQl3aWR0aDogOTAlOwotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci0JYm9yZGVyLWNvbG9yOiBCbGFjazsKLQliYWNrZ3JvdW5kOiB3aGl0ZTsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQltYXJnaW4tbGVmdDogMGVtOwotCW1hcmdpbi1yaWdodDogMGVtOwotfQotCi0udGJsZGVzYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1USCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQljb2xvcjogYmxhY2s7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RhZGFkYTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuM2VtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotVEguYmFzZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IGJsYWNrOwotCWJvcmRlcjogMSBzb2xpZCAjNjA2MDYwOwotCWJhY2tncm91bmQtY29sb3I6ICNkY2RhZGE7Ci0JcGFkZGluZy10b3A6IDAuNjVlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC42NWVtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotVEQgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JY29sb3I6IGJsYWNrOwotCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4zZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1DSVRFIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLUVNIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLVNUUk9ORyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWNhcHRpb24gewotCXRleHQtYWxpZ246IGxlZnQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1EVCB7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci19Ci0KLUREIHsKLQltYXJnaW4tbGVmdDogMS4wZW07Ci19Ci0KLVBSRSxwcmUuY2dyYXBoaWMgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMnB4OwotCWJhY2tncm91bmQtY29sb3I6ICNkYWRhZGE7Ci0JcGFkZGluZzogNXB4OwotfQotCi0uaXRhbGljIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnVuZGVybGluZWQgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYm9sZC1pdGFsaWMsLmJvbGRJdGFsaWMgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLnNtYWxsQ2Fwcywuc21hbGxjYXBzIHsKLQl0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwotCWZvbnQtc2l6ZTogc21hbGxlcjsKLQlmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7Ci19Ci0KLS5pdGFsaWMtdW5kZXJsaW5lZCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYm9sZC11bmRlcmxpbmVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtaXRhbGljLXVuZGVybGluZWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLnNtYWxsY2Fwcy11bmRlcmxpbmVkIHsKLQlmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5lbXBoYXNpcyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uaW5saW5lZGVmIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5zaWRlYmFyIHsKLQliYWNrZ3JvdW5kOiAjY2NjY2NjOwotfQotCi1BOmxpbmsgewotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOnZpc2l0ZWQgewotCWNvbG9yOiAjOTk2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOmFjdGl2ZSB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6aG92ZXIgewotCWNvbG9yOiAjOTk2Njk5OzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS50b2NsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRvY2xpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRvY2xpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLnB0b2NsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wdG9jbGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wdG9jbGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmluZGV4bGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5maWd1cmVsaXN0OmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmZpZ3VyZWxpc3Q6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmZpZ3VyZWxpc3Q6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLnRhYmxlbGlzdDpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudGFibGVsaXN0OmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudGFibGVsaXN0OmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5ib2xkZ3JleWxpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi1hLmJvbGRncmV5bGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotLnJ1bm5pbmdoZWFkZXIgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuN2VtOwotfQotCi0ucnVubmluZ2Zvb3RlciB7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMC43ZW07Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6bGluayB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmFjdGl2ZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOnZpc2l0ZWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTpob3ZlciB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLSNicmVhZGNydW1iLC5icmVhZGNydW1iLHNwYW4uYnJlYWRjcnVtYnMgewotCWZvbnQtc2l6ZTogMC43NWVtOwotfQotCi0uZmFzdHBhdGggewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5mYXN0cGF0aHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvYyB7Ci0JZm9udC1zaXplOiBzbWFsbDsKLX0KLQotLm5lc3RlZDAgewotCW1hcmdpbi10b3A6IDBlbTsKLX0KLQotLnAgewotCW1hcmdpbi10b3A6IDFlbTsKLX0KLQotc3Bhbi5maWdjYXAgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5maWdkZXNjIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLWRpdi5maWdib3ggewotCQotfQotCi1kaXYuZmlncnVsZXMgewotCQotfQotCi1kaXYuZmlnbm9uZSB7Ci0JCi19Ci0KLS5maWdub25lIHsKLQkKLX0KLQotLmZpZ2JvcmRlciB7Ci0JCi19Ci0KLS5maWdzaWRlcyB7Ci0JCi19Ci0KLS5maWd0b3AgewotCQotfQotCi0uZmlnYm90dG9tIHsKLQkKLX0KLQotLmZpZ3RvcGJvdCB7Ci0JCi19Ci0KLS5wYXJlbnRsaW5rIHsKLQkKLX0KLQotLnByZXZsaW5rIHsKLQkKLX0KLQotLm5leHRsaW5rIHsKLQkKLX0KLQotLnJlbGNvbmNlcHRzaGQgewotCQotfQotCi0ucmVsdGFza3NoZCB7Ci0JCi19Ci0KLS5yZWxyZWZoZCB7Ci0JCi19Ci0KLS5zeW5ub25lIHsKLQkKLX0KLQotLnN5bmJvcmRlciB7Ci0JCi19Ci0KLS5zeW5zaWRlcyB7Ci0JCi19Ci0KLS5zeW50b3AgewotCQotfQotCi0uc3luYm90dG9tIHsKLQkKLX0KLQotLnN5bnRvcGJvdCB7Ci0JCi19Ci0KLS5za2lwIHsKLQltYXJnaW4tdG9wOiAxZW07Ci19Ci0KLS5za2lwc3BhY2UgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS51bGNoaWxkbGluayB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLm9sY2hpbGRsaW5rIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi11bCxvbCB7Ci0JbWFyZ2luLXRvcDogMC4xZW07Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotfQotCi11bC5zaW1wbGUgewotCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLX0KLQotdWwuaW5kZXhsaXN0IHsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLU9MIExJIHsKLQltYXJnaW4tdG9wOiAwLjBlbTsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQltYXJnaW4tbGVmdDogMC4wZW07Ci19Ci0KLVVMIExJIHsKLQltYXJnaW4tdG9wOiAwLjBlbTsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQltYXJnaW4tbGVmdDogMC4wZW07Ci19Ci0KLU9MIExJIERJViBQIHsKLQlsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci19Ci0KLVVMIExJIERJViBQIHsKLQlsaXN0LXN0eWxlLXR5cGU6IGRpc2M7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci19Ci0KLSogW2NvbXBhY3Q9InllcyJdPmxpIHsKLQltYXJnaW4tdG9wOiAwIGVtOwotfQotCi0qIFtjb21wYWN0PSJubyJdPmxpIHsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLX0KLQotaHIgewotCW1hcmdpbi1ib3R0b206IDBlbTsKLQltYXJnaW4tdG9wOiAwZW07Ci0JcGFkZGluZy10b3A6IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotCXdpZHRoOiA5MCU7Ci0JY29sb3I6ICNjY2NjY2M7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1IMSwudGl0bGUsLnBhZ2V0aXRsZSwudG9waWN0aXRsZTEgewotCWZvbnQtc2l6ZTogMS41ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCXdvcmQtc3BhY2luZzogMC4xZW07Ci19Ci0KLUgyLC5zdWJ0aXRsZSwucGFnZXN1YnRpdGxlLC50b3BpY3RpdGxlMiB7Ci0JZm9udC1zaXplOiAxLjI1ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCXBhZGRpbmctYm90dG9tOiAwLjBlbTsKLX0KLQotSDMsLmJvbGR0aXRsZSwudG9waWN0aXRsZTMgewotCWZvbnQtc2l6ZTogMS4wZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotCXBhZGRpbmctYm90dG9tOiAwLjFlbTsKLX0KLQotSDQsLnRvcGljdGl0bGU0IHsKLQlmb250LXNpemU6IDAuOWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjFlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4xZW07Ci19Ci0KLWg1LC50b3BpY3RpdGxlNSB7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci19Ci0KLWg2LC50b3BpY3RpdGxlNiB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci19Ci0KLWRpdi5oZWFkdGl0bGUgewotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci19Ci0KLWRpdi5oZWFkMCB7Ci0JZm9udC1zaXplOiAwLjllbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMGVtOwotCW1hcmdpbi10b3A6IDAuNWVtOwotfQotCi1kaXYuaGVhZDEgewotCWZvbnQtc2l6ZTogMC44ZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXRvcDogMC41ZW07Ci19Ci0KLWRpdi5oZWFkMiB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5oZWFkMyB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5oZWFkNCB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA0ZW07Ci19Ci0KLWRpdi5oZWFkNSB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA1ZW07Ci19Ci0KLWRpdi5oZWFkNiB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA2ZW07Ci19Ci0KLWRpdi5oZWFkNyB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA3ZW07Ci19Ci0KLWRpdi5oZWFkOCB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA4ZW07Ci19Ci0KLWRpdi5oZWFkOSB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA5ZW07Ci19Ci0KLS50aXAgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS50aXB0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5maXJzdGNvbCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5wdG9jSDEgewotCWZvbnQtc2l6ZTogeC1zbWFsbDsKLX0KLQotLnB0b2NIMiB7Ci0JZm9udC1zaXplOiB4LXNtYWxsOwotfQotCi0uc3RpdGxlIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5udGUgewotCQotfQotCi0ueHhsaW5lcyB7Ci0Jd2hpdGUtc3BhY2U6IHByZTsKLQlmb250LXNpemU6IDAuOTVlbTsKLX0KLQotLnNlY3Rpb250aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQljb2xvcjogYmxhY2s7Ci0JZm9udC1zaXplOiAxLjJlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LmltYWdlbGVmdCB7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotZGl2LmltYWdlY2VudGVyIHsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5pbWFnZXJpZ2h0IHsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotZGl2LmltYWdlanVzdGlmeSB7Ci0JdGV4dC1hbGlnbjoganVzdGlmeTsKLX0KLQotZGl2Lm1tb2JqIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2Lm1tb2JqbGVmdCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi1kaXYubW1vYmpjZW50ZXIgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYubW1vYmpyaWdodCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotcHJlLnNjcmVlbiB7Ci0JcGFkZGluZzogMWVtIDFlbSAxZW0gMWVtOwotCW1hcmdpbi10b3A6IDAuNGVtOwotCW1hcmdpbi1ib3R0b206IDAuNGVtOwotCWJvcmRlcjogdGhpbiBzb2xpZCBCbGFjazsKLQlmb250LXNpemU6IDEwMCU7Ci19Ci0KLS5wcmVyZXEgewotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLX0KLQotLmRlZkxpc3RIZWFkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotc3Bhbi5tdiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLm1kIHsKLQl0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKLX0KLQotLnBrLHNwYW4ucGsgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLnBrZGVmIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotc3Bhbi5wdiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLnB2ZGVmIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ua3dkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5rZHdkZWYgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0ucGFybUxpc3RLd2QgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucGFybUxpc3RWYXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5vcGVyIHsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0KLXNwYW4ub3BlcmRlZiB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLVZBUixzcGFuLnZhciB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLnZhcmRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1kaXYubXNnIHsKLQlwYWRkaW5nOiAwLjJlbSAxZW0gMWVtIDFlbTsKLQltYXJnaW4tdG9wOiAwLjRlbTsKLQltYXJnaW4tYm90dG9tOiAwLjRlbTsKLX0KLQotZGl2Lm1zZ251bSB7Ci0JZmxvYXQ6IGxlZnQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCW1hcmdpbi1yaWdodDogMWVtOwotfQotCi1kaXYubXNndGV4dCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1kaXYubXNnaXRlbXRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotcC5tc2dpdGVtIHsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS5hdHRlbnRpb24sZGl2LmF0dGVudGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmF0dGVudGlvbnRpdGxlLHNwYW4uYXR0ZW50aW9udGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uY2F1dGlvbnRpdGxlLGRpdi5jYXV0aW9udGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmNhdXRpb24sZGl2LmNhdXRpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5kYW5nZXIsZGl2LmRhbmdlciB7Ci0JcGFkZGluZzogMC41ZW0gMC41ZW0gMC41ZW0gMC41ZW07Ci0JYm9yZGVyOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZGFuZ2VydGl0bGUsZGl2LmRhbmdlcnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5pbXBvcnRhbnQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5pbXBvcnRhbnR0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5yZW1lbWJlciB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnJlbWVtYmVydGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucmVzdHJpY3Rpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5yZXN0cmljdGlvbnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2Lndhcm5pbmd0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi53YXJuaW5nYm9keSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbQotfQotCi0ubm90ZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLm5vdGV0aXRsZSxkaXYubm90ZXRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2Lm5vdGVib2R5IHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYubm90ZWxpc3R0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5mbm51bSB7Ci0JZmxvYXQ6IGxlZnQ7Ci19Ci0KLWRpdi5mbnRleHQgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5zdGVwbCB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LnN0ZXBsbnVtIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogMC41ZW07Ci19Ci0KLWRpdi5zdGVwbHRleHQgewotCW1hcmdpbi1sZWZ0OiA1ZW07Ci19Ci0KLWRpdi5zdGVwbG51bSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiAwLjVlbTsKLX0KLQotZGl2LnN0ZXBsdGV4dCB7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmxlZGkgewotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5sZWRlc2MgewotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLXNwYW4ucGJsa3RpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LnBibGtsYmxib3ggewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlcjogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCW1hcmdpbi10b3A6IDAuMmVtOwotfQotCi1zcGFuLmVkbm90aWNlc3RpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi50ZXJtIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5pZHhzaG93IHsKLQljb2xvcjogZ3JlZW47Ci19Ci0KLWRpdi5jb2RlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLXNwYW4ucmVma2V5IHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogd2hpdGU7Ci0JYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Ci19Ci0KLXR0LmFwbCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYucXVhbGlmc3RhcnQgewotCXBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlci10b3A6IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5xdWFsaWZlbmQgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuMWVtIDAuNWVtOwotCWJvcmRlci1ib3R0b206IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLS5ub3NoYWRlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLX0KLQotLnhsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLmxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQjBCMEIwOwotfQotCi0ubWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEM4QzhDOwotfQotCi0uZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZFNkU2RTsKLX0KLQotLnhkYXJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNTg1ODU4OwotfQotCi0ubGlnaHQteWVsbG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkNDOwotfQotCi0ua2hha2kgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDOTk7Ci19Ci0KLS5tZWRpdW0tYmx1ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2OTlDQzsKLX0KLQotLmxpZ2h0LWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDRkY7Ci19Ci0KLS5taWQtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLX0KLQotLmxpZ2h0LWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodGVzdC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTZFNkU2OwotfQotCi0jY2hhbmdlZCB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCWxlZnQ6IDAuMmVtOwotCWNvbG9yOiAjN0I2OEVFOwotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1JTlBVVC5idXR0b25zIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLQlib3JkZXItdG9wOiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1ib3R0b206IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1sZWZ0OiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0uY2dyYXBoaWMgewotCWZvbnQtc2l6ZTogOTAlOwotCWNvbG9yOiBibGFjazsKLX0KLQotLmFpeCwuaHB1eCwuc3VuLC51bml4LC53aW4yLC53aW5udCwud2luLC56b3MsLmxpbnV4LC5vczM5MCwub3M0MDAsLmMsLmNwbHVzcGx1cywuY29ib2wsLmZvcnRyYW4sLmphdmEsLm1hY29zeCwub3MyLC5wbDEsLnJwZwotCXsKLQliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0OwotCW1hcmdpbi10b3A6IDAuNWVtOwotCXRleHQtaW5kZW50OiA1NXB4OwotfQotCi0uYWl4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdhaXguZ2lmKTsKLX0KLQotLmhwdXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2hwdXguZ2lmKTsKLX0KLQotLnN1biB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nc29sYXJpcy5naWYpOwotfQotCi0udW5peCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ndW5peC5naWYpOwotfQotCi0ud2luMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMjAwMC5naWYpOwotfQotCi0ud2lueHAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3hwLmdpZik7Ci19Ci0KLS53aW5udCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nbnQuZ2lmKTsKLX0KLQotLndpbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nd2luLmdpZik7Ci19Ci0KLS56b3MgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3pvcy5naWYpOwotfQotCi0ubGludXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2xpbnV4LmdpZik7Ci19Ci0KLS5vczM5MCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMzkwLmdpZik7Ci19Ci0KLS5vczQwMCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nNDAwLmdpZik7Ci19Ci0KLS5jIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjLmdpZik7Ci19Ci0KLS5jcGx1c3BsdXMgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NwcC5naWYpOwotfQotCi0uY29ib2wgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NvYm9sLmdpZik7Ci19Ci0KLS5mb3J0cmFuIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdmb3J0cmFuLmdpZik7Ci19Ci0KLS5qYXZhIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdqYXZhLmdpZik7Ci19Ci0KLS5tYWNvc3ggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ21hY29zeC5naWYpOwotfQotCi0ub3MyIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdvczIuZ2lmKTsKLX0KLQotLnBsMSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ncGwxLmdpZik7Ci19Ci0KLS5ycGcgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3JwZy5naWYpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbnJ0bC5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUwYjAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbnJ0bC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSB8IChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQsIDIwMDUgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotIAotLnVucmVzb2x2ZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiBza3libHVlOyB9Ci0ubm9UZW1wbGF0ZSB7IGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgfQotCi0uYmFzZSB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IH0KLQotLyogQWRkIHNwYWNlIGZvciB0b3AgbGV2ZWwgdG9waWNzICovCi0ubmVzdGVkMCB7IG1hcmdpbi10b3AgOiAxZW07fQotCi0vKiBkaXYgd2l0aCBjbGFzcz1wIGlzIHVzZWQgZm9yIHBhcmFncmFwaHMgdGhhdCBjb250YWluIGJsb2NrcywgdG8ga2VlcCB0aGUgWEhUTUwgdmFsaWQgKi8KLS5wIHttYXJnaW4tdG9wOiAxZW19Ci0KLS8qIERlZmF1bHQgb2YgaXRhbGljcyB0byBzZXQgYXBhcnQgZmlndXJlIGNhcHRpb25zICovCi0uZmlnY2FwIHsgZm9udC1zdHlsZTogaXRhbGljIH0KLS5maWdkZXNjIHsgZm9udC1zdHlsZTogbm9ybWFsIH0KLQotLyogVXNlIEBmcmFtZSB0byBjcmVhdGUgZnJhbWVzIG9uIGZpZ3VyZXMgKi8KLS5maWdib3JkZXIgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3NpZGVzIHsgYm9yZGVyLWxlZnQgOiAycHggc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXJpZ2h0IDogMnB4IHNvbGlkOyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wIHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ2JvdHRvbSB7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wYm90IHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0vKiBNb3N0IGxpbmsgZ3JvdXBzIGFyZSBjcmVhdGVkIHdpdGggPGRpdj4uIEVuc3VyZSB0aGV5IGhhdmUgc3BhY2UgYmVmb3JlIGFuZCBhZnRlci4gKi8KLS51bGxpbmtzIHsgbGlzdC1zdHlsZS10eXBlOiBub25lIH0KLS51bGNoaWxkbGluayB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5vbGNoaWxkbGluayB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdHdpdGhjaGlsZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLXJpZ2h0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0uc3VibGlua2xpc3QgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1yaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnJlbGNvbmNlcHRzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHRhc2tzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHJlZiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxpbmZvIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnByZXJlcSB7IG1hcmdpbi1yaWdodCA6IDIwcHg7fQotCi0vKiBTZXQgaGVhZGluZyBzaXplcywgZ2V0dGluZyBzbWFsbGVyIGZvciBkZWVwZXIgbmVzdGluZyAqLwotLnRvcGljdGl0bGUxIHsgbWFyZ2luLXRvcDogMHBjOyBtYXJnaW4tYm90dG9tOiAuMWVtOyBmb250LXNpemU6IDEuMzRlbTsgfQotLnRvcGljdGl0bGUyIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuNDVlbTsgZm9udC1zaXplOiAxLjE3ZW07IH0KLS50b3BpY3RpdGxlMyB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjE3ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU0IHsgbWFyZ2luLXRvcDogLjgzZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU1IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTYgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uc2VjdGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwZW07IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkO30KLS5zZWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmV4YW1wbGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS8qIEFsbCBub3RlIGZvcm1hdHMgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0IHByZXNlbnRhdGlvbiAqLwotLm5vdGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLm5vdGV0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5ub3RlbGlzdHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnRpcCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0udGlwdGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZmFzdHBhdGggeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmZhc3RwYXRodGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uaW1wb3J0YW50IHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5pbXBvcnRhbnR0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5yZW1lbWJlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ucmVtZW1iZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5yZXN0cmljdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ucmVzdHJpY3Rpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5hdHRlbnRpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmF0dGVudGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlcnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uY2F1dGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmNhdXRpb24geyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLWJvdHRvbSA6IDFlbTsgfQotCi0vKiBTaW1wbGUgbGlzdHMgZG8gbm90IGdldCBhIGJ1bGxldCAqLwotdWwuc2ltcGxlIHsgbGlzdC1zdHlsZS10eXBlOiBub25lIH0KLQotLyogVXNlZCBvbiB0aGUgZmlyc3QgY29sdW1uIG9mIGEgdGFibGUsIHdoZW4gcm93aGVhZGVyPSJmaXJzdGNvbCIgaXMgdXNlZCAqLwotLmZpcnN0Y29sIHsgZm9udC13ZWlnaHQgOiBib2xkO30KLQotLyogVmFyaW91cyBiYXNpYyBwaHJhc2Ugc3R5bGVzICovCi0uYm9sZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uYm9sZEl0YWxpYyB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5pdGFsaWMgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS51bmRlcmxpbmVkIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS51aWNvbnRyb2wgeyBmb250LXdlaWdodDogYm9sZDsgfQotLnBhcm1uYW1lIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5rd2QgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmRlZmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnZhciB7IGZvbnQtc3R5bGUgOiBpdGFsaWM7fQotLnNob3J0Y3V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLQotLyogRGVmYXVsdCBvZiBib2xkIGZvciBkZWZpbml0aW9uIGxpc3QgdGVybXMgKi8KLS5kbHRlcm0geyBmb250LXdlaWdodDogYm9sZDsgfQotCi0vKiBVc2UgQ1NTIHRvIGV4cGFuZCBsaXN0cyB3aXRoIEBjb21wYWN0PSJubyIgKi8KLS5kbHRlcm1leHBhbmQgeyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMWVtOyB9Ci0qW2NvbXBhY3Q9InllcyJdPmxpIHsgbWFyZ2luLXRvcDogMGVtO30KLSpbY29tcGFjdD0ibm8iXT5saSB7IG1hcmdpbi10b3A6IC41M2VtO30KLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGlnbiBpbWFnZXMgYmFzZWQgb24gQGFsaWduIG9uIHRvcGljL2ltYWdlICovCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdEV4aXN0aW5nU2VydmVyLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGRiZTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdEV4aXN0aW5nU2VydmVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdE5ld1NlcnZlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjZiNDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdE5ld1NlcnZlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDY0YmI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhNDM0Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkODdkMGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM0YmJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NjE0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZTk5TC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDZhYmRiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZTk5TC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VFSjkuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3MzUwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VFSjkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlSUFJLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjYyNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlSUFJLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUxLRi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjk4ZjQyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUxLRi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VPNzguanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwNzdmOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VPNzguanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlVTcxLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTA0MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlVTcxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9ub3RlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9ub3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyNjBkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvc2VsZWN0Um9vdEVsZW1lbnREVEQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmMjYwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvc2VsZWN0Um9vdEVsZW1lbnREVEQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50WFNELnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTVlZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50WFNELnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsX21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA3NGU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsX21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1iYWNrYnV0dG9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZDFjNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1iYWNrYnV0dG9uLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmluZGluZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzRkNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmluZGluZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1jb21wbGV4LXR5cGUuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkNjA3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1jb21wbGV4LXR5cGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1maW5pc2hlZC13c2RsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1NjM0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1maW5pc2hlZC13c2RsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LW9wZXJhdGlvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzM0YTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LW9wZXJhdGlvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctc2tlbGV0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkZGIyOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctc2tlbGV0b24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctd2l6YXJkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1NTNmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctd2l6YXJkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNldGVsZW1lbnQtZGlhbG9nLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNldGVsZW1lbnQtZGlhbG9nLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4MTY1ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXR0eXBlLWRpYWxvZy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXR0eXBlLWRpYWxvZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzZhNjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zbWFydC1yZW5hbWUxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2OGE0NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zbWFydC1yZW5hbWUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItYmFja2J1dHRvbi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDkyNjA1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItYmFja2J1dHRvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTEuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiNGY2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUyLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGM2MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjZiNmU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTQuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExODdkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU1LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjIyZWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTI1M2I4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTcuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiNzUyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU4LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjE3NzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRlZWNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ub3RpY2VzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ub3RpY2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTYzODcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0iYm9vay5jc3MiIENIQVJTRVQ9IklTTy04ODU5LTEiCi0JVFlQRT0idGV4dC9jc3MiPgotPHRpdGxlPkxlZ2FsIE5vdGljZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMz48YSBOQU1FPSJOb3RpY2VzIj48L2E+Tm90aWNlczwvaDM+Ci08cD5UaGUgbWF0ZXJpYWwgaW4gdGhpcyBndWlkZSBpcyBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQKLW90aGVycyAyMDAwLCAyMDA2LjwvcD4KLTxwPjxhIGhyZWY9ImFib3V0Lmh0bWwiPlRlcm1zIGFuZCBjb25kaXRpb25zIHJlZ2FyZGluZyB0aGUgdXNlIG9mIHRoaXMKLWd1aWRlLjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYzYjg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgID0gTWFzdGVyIFVzZXIgRG9jIFRPQwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE2MTdmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLQkJPHRvYyBmaWxlPSJ0b2MueG1sIiBwcmltYXJ5PSJ0cnVlIiAvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwNjBmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0JKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0JKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLQkqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0JKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCSogCi0JKiBDb250cmlidXRvcnM6Ci0JKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBEZWZpbmUgdGhlIHRvcCBsZXZlbCB0b3BpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dG9jIGxhYmVsPSJXZWIgQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgVXNlciBHdWlkZSIKLQl0b3BpYz0idG9waWNzL292ZXJ2aWV3Lmh0bWwiPgotCi0JPHRvcGljIGxhYmVsPSJDcmVhdGluZyBXZWIgYXBwbGljYXRpb25zIj4KLQkJPGxpbmsKLQkJCXRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIEoyRUUgYW5kIGVudGVycHJpc2UgYXBwbGljYXRpb25zIj4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MueG1sIiAvPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvZWpiX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkVkaXRpbmcgbWFya3VwIGxhbmd1YWdlIGZpbGVzIgotCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy54bWwiIC8+Ci0JCTxsaW5rCi0JCQl0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy54bWwiIC8+Ci0JCTxsaW5rCi0JCQl0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MueG1sIiAvPgotCQk8bGluawotCQkJdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPCEtLSA8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC54bWwuZG9jLnVzZXIveG1sX3RvYy54bWwiLz4tLT4KLQk8dG9waWMgbGFiZWw9IkRldmVsb3BpbmcgV2ViIHNlcnZpY2UgYXBwbGljYXRpb25zIj4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvd2Vic2VydmljZV90b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJVc2luZyBkYXRhIHRvb2xzIj4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QuZGF0YXRvb2xzLnNlcnZlci51aS5kb2MudXNlci9kYXRhYmFzZV9leHBsb3Jlcl90b2MueG1sIiAvPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC5kYXRhdG9vbHMuc2VydmVyLnVpLmRvYy51c2VyL2RhdGFvdXRwdXRfdmlld190b2MueG1sIiAvPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC5kYXRhdG9vbHMuY29ubmVjdGlvbi51aS5kb2MudXNlci9jb25uZWN0aW9uX3VpX3RvYy54bWwiIC8+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LmRhdGF0b29scy5mZS51aS5kb2MudXNlci9mZV91aV90b2MueG1sIiAvPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC5kYXRhdG9vbHMuZGF0YS51aS5kb2MudXNlci9kYXRhX3VpX3RvYy54bWwiIC8+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnNxbGVkaXRvci5kb2MudXNlci9zcWxlZGl0b3JfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iVXNpbmcgdGhlIHNlcnZlciB0b29scyI+Ci0gIAkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmRvYy51c2VyL3d0cF9tYWluX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkxpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXMiIGhyZWY9InRvcGljcy9saW1pdGF0aW9ucy5odG1sIiAvPgotCTx0b3BpYyBsYWJlbD0iTGVnYWwiIGhyZWY9Im5vdGljZXMuaHRtbCIgLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9saW1pdGF0aW9ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL2xpbWl0YXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjZmM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL2xpbWl0YXRpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotCWhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPldlYiBUb29scyBQcm9qZWN0IExpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+V2ViIFRvb2xzIFByb2plY3QgTGltaXRhdGlvbnMgYW5kIEtub3duIElzc3VlczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSBsaW1pdGF0aW9ucyBhbmQga25vd24gaXNzdWVzOjwvcD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48Yj5XaGVuIHVzaW5nIFhEb2NsZXQgdGhlIGdlbmVyYXRpb24gZG9lcyBub3QgYXBwZWFyIHRvIHJ1bi48L2I+PC9kdD4KLTxkZD48cD5DYXVzZTogWERvY2xldCBoYXMgc29tZSBsaW1pdGF0aW9ucyB3aXRoIGxvbmcgcGF0aCBuYW1lcy48L3A+Ci08cD5Tb2x1dGlvbjogWW91IHNob3VsZCBpbnN0YWxsIEVjbGlwc2UgYW5kIHRoZSBXZWIgVG9vbHMgUGxhdGZvcm0gaW50byBhIGRpcmVjdG9yeSB3aXRoIGEgc2hvcnQKLXBhdGguPC9wPgotPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48Yj5XaGVuIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgeW91IG1heSBzZWUgYSBtZXNzYWdlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBvbmU6PC9iPjwvZHQ+Ci08ZGQ+PHA+PHNhbXA+b3JnLmFwYWNoZS5heGlzLnV0aWxzLkphdmFVdGlscyBpc0F0dGFjaG1lbnRTdXBwb3J0ZWQKLVdBUk5JTkc6IFVuYWJsZSB0byBmaW5kIHJlcXVpcmVkIGNsYXNzZXMgKGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgYW5kIAotamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTXVsdGlwYXJ0KS4gQXR0YWNobWVudCBzdXBwb3J0IGlzIGRpc2FibGVkLgotPC9zYW1wPjwvcD4KLTxwPkNhdXNlOiBBdHRhY2htZW50IHN1cHBvcnQgaXMgZGlzYWJsZWQuPC9wPgotPHA+U29sdXRpb246IFRoZSBBcGFjaGUgQXhpcyB0b29scyBzaG91bGQgYXV0by1kZXRlY3QgdGhlIGphdmF4LmFjdGl2YXRpb24gY2xhc3NlcyBwcm92aWRlZCB5b3UgYWRkIAotPHNhbXA+YWN0aXZhdGlvbi5qYXI8L3NhbXA+IHRvIHRoZSBidWlsZCBwYXRoIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHlvdSBhcmUgZ2VuZXJhdGluZyB5b3VyIFdlYiBzZXJ2aWNlIG9yIGNsaWVudC4gCi1Gb3Igc2VydmljZXMsIHlvdSB3aWxsIGFsc28gbmVlZCB0byBtYWtlIHN1cmUgPHNhbXA+YWN0aXZhdGlvbi5qYXI8L3NhbXA+IGlzIGF2YWlsYWJsZSB0byB0aGUgVG9tY2F0IEpSRSwgZWl0aGVyIGJ5IAotaW5jbHVkaW5nIGl0IGluIHRoZSBzZXJ2ZXIncyBnbG9iYWwgY2xhc3NwYXRoIG9yIGJ5IHBsYWNpbmcgYSBjb3B5IG9mIGFjdGl2YXRpb24uamFyIGludG8gdGhlIHRhcmdldCBXZWIgCi1wcm9qZWN0J3MgPHNhbXA+bGliLzwvc2FtcD4gZGlyZWN0b3J5LgotPC9wPgotPC9kZD4KLTwvZGw+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL292ZXJ2aWV3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b3BpY3Mvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjMjFmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b3BpY3Mvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhZG9jdHlwZSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0JaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+V2ViIFRvb2xzIFByb2plY3QgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+V2ViIFRvb2xzIFByb2plY3QgT3ZlcnZpZXc8L2gxPgotPHA+VGhlIFdlYiBUb29scyBQcm9qZWN0IGFpbXMgdG8gcHJvdmlkZSBjb21tb24gaW5mcmFzdHJ1Y3R1cmUgYXZhaWxhYmxlCi10byBhbnkgRWNsaXBzZS1iYXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0YXJnZXRpbmcgV2ViLWVuYWJsZWQKLWFwcGxpY2F0aW9ucy48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjJmNjlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjRkYTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci08ZGVzY3JpcHRpb24vPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IndlYngwMDIwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGZpbGUuCi0KLVRoZSBsaW5lIGRlbGltaXRlcnMgYXJlIEN0cmwtSiAoVU5JWCksIEN0cmwtTSAoTWFjKSwgb3IgQ3RybC1NIEN0cmwtSiAoV2luZG93cykuPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAyMSI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLgotCi1UaGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBzb3VyY2UgdHlwZXMgdGhhdCB5b3UgY2FuIHNlbGVjdCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gZWl0aGVyIHNlbGVjdCB0aGUgY29udGVudCB0eXBlIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LCBvciBjbGljayB0ZXh0IGluIHRoZSB0ZXh0IHNhbXBsZSB3aW5kb3cgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY29udGVudCB0eXBlIGZvciB3aGljaCB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHRleHQgaGlnaGxpZ2h0aW5nLgotCi1UaGUgPGI+Rm9yZWdyb3VuZDwvYj4gYW5kIDxiPkJhY2tncm91bmQ8L2I+IHB1c2ggYnV0dG9ucyBvcGVuIDxiPkNvbG9yPC9iPiBkaWFsb2cgYm94ZXMgdGhhdCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB0ZXh0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCByZXNwZWN0aXZlbHkuIFNlbGVjdCB0aGUgPGI+Qm9sZDwvYj4gY2hlY2sgYm94IHRvIG1ha2UgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgYXBwZWFyIGluIGJvbGQuCi0KLUNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IHB1c2ggYnV0dG9uIHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwiIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0id2VieDAwMjIiPgotPGRlc2NyaXB0aW9uPlRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLgotCi1DbGljayA8Yj5OZXc8L2I+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IHRlbXBsYXRlLgotCi1TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPGI+TmFtZTwvYj4gYW5kIDxiPkRlc2NyaXB0aW9uPC9iPi4gVGhlIDxiPkNvbnRleHQ8L2I+IGZvciB0aGUgdGVtcGxhdGUgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gU3BlY2lmeSB0aGUgPGI+UGF0dGVybjwvYj4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuCi0KLUlmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPGI+SW5zZXJ0IFZhcmlhYmxlPC9iPiBidXR0b24gYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIEZvciBleGFtcGxlLCB0aGUgPGI+ZGF0ZTwvYj4gdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4KLQotWW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUgUHJlZmVyZW5jZXMgcGFnZS4KLQotSWYgeW91IGhhdmUgYSB0ZW1wbGF0ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIDxiPlRlbXBsYXRlczwvYj4gcHJlZmVyZW5jZXMgcGFnZS48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwiIGxhYmVsPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwiIGxhYmVsPSJDcmVhdGluZyBEVEQgZmlsZXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJkdGR3MDAxMCI+Ci08ZGVzY3JpcHRpb24+Q2xpY2sgdGhlIDxiPlVzZSBEVEQgVGVtcGxhdGU8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0byB1c2UgYSBEVEQgdGVtcGxhdGUgYXMgdGhlIGluaXRpYWwgY29udGVudCBpbiB5b3VyIG5ldyBEVEQgcGFnZS4gQSBsaXN0IG9mIGF2YWlsYWJsZSBEVEQgdGVtcGxhdGVzIGlzIGxpc3RlZCAtIHNlbGVjdCB0aGUgb25lIHlvdSB3YW50IHRvIHVzZS4gQSBwcmV2aWV3IG9mIHlvdXIgRFREIGZpbGUgaXMgc2hvd24gb25jZSB5b3Ugc2VsZWN0IGEgRFREIHRlbXBsYXRlLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbCIgbGFiZWw9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbCIgbGFiZWw9IkNyZWF0aW5nIERURCBmaWxlcyIvPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL0VkaXRvckR0ZENvbnRleHRzMi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ0ZDI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL0VkaXRvckR0ZENvbnRleHRzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLTxkZXNjcmlwdGlvbi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iZHRkc291cmNlX3NvdXJjZV9IZWxwSWQiPgotPGRlc2NyaXB0aW9uPlRoZSBEVEQgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24uCi0KLVRoZSBlZGl0b3IgcHJvdmlkZXMgdGV4dCBlZGl0aW5nIGZlYXR1cmVzIHN1Y2ggYXMgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8uCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Yzk2ZGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0Y2E4NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgRWRpdG9yRHRkQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JEdGRDb250ZXh0czIueG1sCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmM1MmJhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgICAgPSBEVEQgRWRpdG9yIGluZm9wb3BzCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1N2ZiYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JEdGRDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yRHRkQ29udGV4dHMyLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTIzNDNlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODZkN2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDE5MzJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0gCi08dG9jIGxhYmVsPSJEVEQgRWRpdG9yIj4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIERURHMiIGhyZWY9InRvcGljcy9jd29ya2R0ZHMuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIERURHMiIGhyZWY9InRvcGljcy90Y3JldGR0ZC5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL2NkdGRvdmVyLmh0bWwiLz4KLSAgICAgICAgICAgPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0Lmh0bWwiLz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgRFREcyIgaHJlZj0idG9waWNzL3RpbXB0ZHRkLmh0bWwiLz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3IiIGhyZWY9InRvcGljcy9yZHRkaWNvbnMuaHRtbCIvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmNWY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWZlOTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IERUREVkaXRvcm1hcF90b2MueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Db21tZW50LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTYxMWQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRWxlbWVudC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNDg4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQxNTA2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZhOWI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FkMDg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX05vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliYTgyNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYzZjk3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmNkZTk0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlX2xpc3QuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjAyOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25EVERGaWxlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbkRUREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzk5MTQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbkRUREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYW55LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTdkOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVtcHR5LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVtcHR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZTNkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbXB0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzYzZiYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zb3J0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwY2U4Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXBsdWdpbk5hbWUgICAgID0gRFREIEVkaXRvciBkb2N1bWVudGF0aW9uCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDEyMWUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjEiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgPHRvYyBmaWxlPSJEVERFZGl0b3JtYXBfdG9jLnhtbCIvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YWJlZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2R0ZG92ZXIiPjxhIG5hbWU9ImNkdGRvdmVyIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldzwvaDE+Ci08ZGl2PjxwPkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBtZWFucyB0bwotdmFsaWRhdGUgWE1MIGZpbGVzIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMuIFdoZW4geW91IGNyZWF0ZSBhIERURCBmaWxlLCB5b3UKLWNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UKLXRoZSBEVEQgZmlsZS48L3A+PHA+QSBEVEQgY2FuIGNvbnRhaW4gZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBub3RhdGlvbnMsCi1hbmQgZW50aXRpZXMgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiBJdCBhbHNvIGVzdGFibGlzaGVzCi1jb25zdHJhaW50cyBmb3IgaG93IGVhY2ggZWxlbWVudCwgYXR0cmlidXRlLCBub3RhdGlvbiwgYW5kIGVudGl0eSBjYW4gYmUgdXNlZAotd2l0aGluIGFueSBvZiB0aGUgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS48L3A+Ci08cD5UbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIHRoZSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5Ci1hIERURCAob3IgYW4gWE1MIHNjaGVtYSksIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQKLShvciBYTUwgc2NoZW1hKS48L3A+Ci08cD5DZXJ0YWluIFhNTCBwYXJzZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVhZCBEVERzIGFuZCBjaGVjayB0byBzZWUgaWYgdGhlCi1YTUwgZmlsZSBpdCBpcyByZWFkaW5nIGZvbGxvd3MgYWxsIG9mIHRob3NlIHJ1bGVzLiBXaGlsZSB0aGUgcGFyc2VyIGlzIHJlYWRpbmcKLXRoZSBYTUwgZmlsZSwgaXQgd2lsbCBjaGVjayBlYWNoIGxpbmUgdG8gYmUgc3VyZSB0aGF0IGl0IGNvbmZvcm1zCi10byB0aGUgcnVsZXMgdGhhdCBhcmUgbGFpZCBvdXQgaW4gdGhlIERURCBmaWxlLiBJZiB0aGVyZSBpcyBhIHByb2JsZW0sIHRoZQotcGFyc2VyIGdlbmVyYXRlcyBhbiBlcnJvciBhbmQgcG9pbnRzIHRvIHdoZXJlIHRoZSBlcnJvciBvY2N1cnMgaW4gdGhlIFhNTAotZmlsZS4gVGhpcyBraW5kIG9mIHBhcnNlciBpcyBjYWxsZWQgYSB2YWxpZGF0aW5nIHBhcnNlciBiZWNhdXNlIGl0IHZhbGlkYXRlcwotdGhlIGNvbnRlbnQgb2YgdGhlIFhNTCBmaWxlIGFnYWluc3QgdGhlIERURC48L3A+Ci08L2Rpdj4KLQotPGRpdj4KLTxwPgotPGIgY2xhc3M9InBhcmVudGxpbmsiPlBhcmVudCB0b3BpYzo8L2I+IDxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiB0aXRsZT0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iPkNyZWF0aW5nIERURHM8L2E+PGJyIC8+Ci08L3A+Ci08cD48YiBjbGFzcz0icmVsdGFza3NoZCI+UmVsYXRlZCB0YXNrczwvYj48YnIgLz4KLTxhIGhyZWY9Ii4uL3RvcGljcy90dmFsZHRkLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy4iPlZhbGlkYXRpbmcgRFREczwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjdiYmEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotCi08dGl0bGU+V29ya2luZyB3aXRoIERURHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtpbmd3aXRoZHRkcyI+PGEgbmFtZT0id29ya2luZ3dpdGhkdGRzIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBEVERzPC9oMT4KLTxkaXY+PHA+VGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIj5DcmVhdGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4KLWJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gbWFudWFsbHkKLWVkaXQgaXQsIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQKLW5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQKLWZpbGUuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RpbXB0ZHRkLmh0bWwiPkltcG9ydGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YKLXRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBEVEQKLWVkaXRvci4gPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3R2YWxkdGQuaHRtbCI+VmFsaWRhdGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotVmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkIGFuZAotZG9lcyBub3QgY29udGFpbiBhbnkgZXJyb3JzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9yZHRkaWNvbnMuaHRtbCI+SWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvcjwvYT48L3N0cm9uZz48YnIgLz4KLVRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9saT4KLTwvdWw+Ci08L2Rpdj48L2JvZHk+Ci08L2h0bWw+IAotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzE5YzIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvcjwvaDE+Ci08ZGl2PjxwPlRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHI+PHRoIHZhbGlnbj0idG9wIiBpZD0iZDBlMjAiPgotCUljb248L3RoPgotPHRoIHZhbGlnbj0idG9wIiBpZD0iZDBlMjIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+Jm5ic3A7PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjIgIj4mbmJzcDs8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvbmFueS5naWYiIC8+IDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIyICI+QU5ZIGNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvYXR0cmlidXRlLmdpZiIgLz4gPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjIgIj5hdHRyaWJ1dGU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYiIC8+IDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIyICI+YXR0cmlidXRlIGxpc3Q8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfQ29tbWVudC5naWYiIC8+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjIgIj5jb21tZW50PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRENob2ljZS5naWYiIC8+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjIgIj5jb250ZW50IG1vZGVsIC0gY2hvaWNlPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPiAgPGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYiIC8+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjIgIj5jb250ZW50IG1vZGVsIC0gc2VxdWVuY2U8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfRWxlbWVudC5naWYiIC8+IDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIyICI+ZWxlbWVudDwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uZW1wdHkuZ2lmIiAvPiA8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMiAiPkVNUFRZIGNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvQUREX0VudGl0eS5naWYiIC8+IDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIyICI+ZW50aXR5PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvQUREX05vdGF0aW9uLmdpZiIgLz4gPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjIgIj5ub3RhdGlvbjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYiIC8+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjIgIj5wYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+PC9kaXY+Ci0KLTxkaXY+Ci08cD4KLTxiIGNsYXNzPSJwYXJlbnRsaW5rIj5QYXJlbnQgdG9waWM6PC9iPiA8YSBocmVmPSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIHRpdGxlPSJXb3JraW5nIHdpdGggRFREcyI+V29ya2luZyB3aXRoIERURHM8L2E+PGJyIC8+Ci08L3A+Ci0KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhYWYzNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgbmV3IGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNyZXRkdGQiPjxhIG5hbWU9InRjcmV0ZHRkIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgRFREczwvaDE+Ci08ZGl2PjxwPkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuCi1iZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQKLWl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywKLWFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuPC9wPjxkaXYgY2xhc3M9InNraXBzcGFjZSI+PHA+PC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCAKLXRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+Rm9sbG93Ci10aGVzZSBzdGVwcyB0byBjcmVhdGUgYSBuZXcgRFREOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JZiBuZWNlc3NhcnksIGNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgRFRELjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkluIHRoZSB3b3JrYmVuY2gsIHNlbGVjdCAgPGI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IERURCBGaWxlPC9iPjwvc3Bhbj48L3NwYW4+IGFuZCBjbGljayAgPGI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj48L2I+LiA8L3NwYW4+IAotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIERURC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgbmFtZTwvc3Bhbj48L2I+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mCi10aGUgRFRELCBmb3IgZXhhbXBsZSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPk15RFRELmR0ZDwva2JkPi48L3NwYW4+IFRoZQotbmFtZSBvZiB5b3VyIERURCBmaWxlIG11c3QgZW5kIHdpdGggdGhlIGV4dGVuc2lvbiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPi5kdGQuPC9rYmQ+PC9saT4KLQk8bGkgY2xhc3M9InNraXBzcGFjZSI+Q2xpY2sgPGI+TmV4dDwvYj4uIDwvbGk+Ci0JPGxpIGNsYXNzPSJza2lwc3BhY2UiPllvdSBjYW4gdXNlIGEgRFREIHRlbXBsYXRlIGFzIHRoZSBiYXNpcyBmb3IgeW91ciBuZXcgCi0JRFREIGZpbGUuIFRvIGRvIHNvLCBjbGljayB0aGUgPGI+VXNlIERURCBUZW1wbGF0ZSA8L2I+Y2hlY2sgYm94LCBhbmQgc2VsZWN0IAotCXRoZSB0ZW1wbGF0ZSB5b3Ugd2FudCB0byB1c2UuPC9saT4KLQk8bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+PGI+RmluaXNoPC9iPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48cD5UaGUgRFREIGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBhdXRvbWF0aWNhbGx5IAotb3BlbnMgaW4gdGhlIERURCBlZGl0b3IuIEluIHRoZSBEVEQgZWRpdG9yLCB5b3UgY2FuIG1hbnVhbGx5IGFkZCBlbGVtZW50cywgYXR0cmlidXRlcywKLW5vdGF0aW9ucywgZW50aXRpZXMsIGFuZCBjb21tZW50cyB0byB0aGUgRFRELiBJZiB5b3UgY2xvc2UgdGhlIGZpbGUsIGFuZCB3YW50Ci10byBsYXRlciByZS1vcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yLCBkb3VibGUtY2xpY2sgaXQgaW4gdGhlCi1OYXZpZ2F0b3Igdmlldy48L3A+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2PgotPHA+Ci08YiBjbGFzcz0icGFyZW50bGluayI+UGFyZW50IHRvcGljOjwvYj4gPGEgaHJlZj0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiB0aXRsZT0iV29ya2luZyB3aXRoIERURHMiPldvcmtpbmcgd2l0aCBEVERzPC9hPjxiciAvPgotPC9wPgotCi08L2Rpdj4KLQotPGRpdj48cD48YiBjbGFzcz0icmVsY29uY2VwdHNoZCI+UmVsYXRlZCBjb25jZXB0czwvYj48YnIgLz4KLTxhIGhyZWY9Ii4uL3RvcGljcy9jZHRkb3Zlci5odG1sIiB0aXRsZT0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgcHJvdmlkZXMgeW91IHdpdGggdGhlIG1lYW5zIHRvIHZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91IGNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiI+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldzwvYT48L3A+Ci0JPHA+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyPgotCTxhIGhyZWY9InRkdGVtcGx0Lmh0bWwiPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC9hPjxicj4KLQk8YnIgLz4KLTwvcD4KLQotCi08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTM3M2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdtYWNybyI+PGEgbmFtZT0idHdtYWNybyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC9oMT4KLTxkaXY+PHA+VGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBEVEQgCi0JZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIAotCXlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gCi0Jbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuPC9wPgotCTxkaXYgY2xhc3M9InNraXBzcGFjZSI+PHA+VG8gY3JlYXRlIGEgbmV3IERURCB0ZW1wbGF0ZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIDxiPiA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gJmd0OyA8L3NwYW4+Ci0JPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RFREPC9zcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+IEZpbGVzPC9zcGFuPiAmZ3Q7IDwvc3Bhbj4KLQk8c3BhbiBjbGFzcz0idWljb250cm9sIj5EVEQ8L3NwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj4KLVRlbXBsYXRlczwvc3Bhbj48L3NwYW4+PC9iPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayA8Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPjwvYj4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseQotbmV3IHRlbXBsYXRlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8Yj5OYW1lPC9iPiBhbmQgPGI+RGVzY3JpcHRpb248L2I+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlNwZWNpZnkgdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPjwvYj4gZm9yIHRoZSB0ZW1wbGF0ZS48L3NwYW4+IFRoaXMgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwKLWxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIDwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+U3BlY2lmeSB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+PC9iPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZwotdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudAotYXNzaXN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlIGluIHlvdXIgPGI+UGF0dGVybjwvYj4sIGNsaWNrIHRoZQotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZTwvc3Bhbj48L2I+IGJ1dHRvbgotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIDwvc3Bhbj4gIEZvciBleGFtcGxlLCB0aGU8Yj4gZGF0ZSA8L2I+dmFyaWFibGUgaW5kaWNhdGVzIAotdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlIGluc2VydGVkLiA8L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj48L2I+IGFuZCB0aGVuIAotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPjwvYj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUKLQlwcmVmZXJlbmNlcyBwYWdlLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUsIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcgotaW4gdGhlIERURCB0ZW1wbGF0ZXMgbGlzdCB3aGVuIHlvdSBjcmVhdGUgYSBmaWxlLCBnbyB0byB0aGUgPGI+RFREIFRlbXBsYXRlcyA8L2I+cHJlZmVyZW5jZXMgcGFnZSBhbmQgCi0JY2xlYXIKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnI+Ci0JPGEgaHJlZj0idGNyZXRkdGQuaHRtbCI+Q3JlYXRpbmcgYSBEVEQgZmlsZTwvYT48YnIgLz4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NiY2QyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR0YWdoaWx0Ij48YSBuYW1lPSJ0dGFnaGlsdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2gxPgotPGRpdj48cD5JZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBEVEQgc291cmNlCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIERURCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycwotdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uPC9wPgotCTwvcD48ZGl2IGNsYXNzPSJza2lwc3BhY2UiPjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgRFREIGNvZGUsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+Q2xpY2sgPGI+IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDwvc3Bhbj4KLQk8c3BhbiBjbGFzcz0idWljb250cm9sIj5EVEQ8L3NwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj4gRmlsZXM8L3NwYW4+ICZndDsgPC9zcGFuPgotCTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRURDwvc3Bhbj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiAKLVN0eWxlczwvc3Bhbj48L3NwYW4+PC9iPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JbiB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgdHlwZTwvc3Bhbj48L2I+IGxpc3QsIHNlbGVjdCB0aGUgc291cmNlCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbwotY2xpY2sgdGV4dCBpbiB0aGUgc2FtcGxlIHRleHQgdG8gc3BlY2lmeSB0aGUgc291cmNlIHRhZyB0eXBlIHRoYXQgeW91IHdpc2gKLXRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JlZ3JvdW5kPC9zcGFuPjwvYj4gYm94Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCB0aGUgY29sb3IgdGhhdCB5b3Ugd2FudCB0aGUgdGV4dCBvZiB0aGUgdGFnIHRvIGFwcGVhciBpbgotYW5kIGNsaWNrIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj48L2I+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIHRoZTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiA8Yj5CYWNrZ3JvdW5kPC9iPjwvc3Bhbj4gYm94Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCB0aGUgY29sb3IgdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVoaW5kIHRoZSB0YWcgYW5kIGNsaWNrPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Ci08Yj5PSzwvYj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJvbGQ8L3NwYW4+PC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8KLW1ha2UgdGhlIHR5cGUgYm9sZC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0czwvc3Bhbj48L2I+IHRvIHNldAotdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4mbmJzcDsgSWYgeW91IG9ubHkgd2FudCB0byAKLXJlc2V0IHRoZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IAotZmllbGQsIHRoZSBjbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0IDwvYj5idXR0b24gbmV4dCB0byBpdC4gPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPjwvYj4gdG8gc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj4mbmJzcDs8L2Rpdj4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjkyZTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5JbXBvcnRpbmcgRFREczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGltcHRkdGQiPjxhIG5hbWU9InRpbXB0ZHRkIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIERURHM8L2gxPgotPGRpdj48cD5JZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggRFREIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZgotdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURAotZWRpdG9yLjwvcD48ZGl2IGNsYXNzPSJza2lwc3BhY2UiPjxwPlRvIGltcG9ydCBhIERURCBpbnRvIHRoZSB3b3JrYmVuY2gsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj48Yj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvYj48L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGltcG9ydCBzb3VyY2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjxiPk5leHQ8L2I+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5GaWxsIGluIHRoZSBmaWVsZHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj4gd2l6YXJkCi1hcyBuZWNlc3NhcnkuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+V2hlbiB5b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj48Yj5GaW5pc2g8L2I+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIERURCBmaWxlIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgZG91YmxlLWNsaWNrIGl0IHRvCi1vcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+PHA+QWZ0ZXIgeW91IGhhdmUgaW1wb3J0ZWQgYSBEVEQgZmlsZSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW5lZAotaXQgaW4gdGhlIERURCBlZGl0b3IsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseS48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxwPgotPGIgY2xhc3M9InBhcmVudGxpbmsiPlBhcmVudCB0b3BpYzo8L2I+IDxhIGhyZWY9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgdGl0bGU9Ildvcmtpbmcgd2l0aCBEVERzIj5Xb3JraW5nIHdpdGggRFREczwvYT48YnIgLz4KLTwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjRkYzgzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIERURHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR2YWxkdGQiPjxhIG5hbWU9InR2YWxkdGQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIERURHM8L2gxPgotPGRpdj48cD5WYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kCi1kb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuPC9wPjxkaXYgY2xhc3M9InNraXBzcGFjZSI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy6gPC9wPgotPHA+VG8gdmFsaWRhdGUKLWEgRFRELCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+PGI+VmFsaWRhdGUgRFREIEZpbGU8L2I+PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvZGl2PgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj5BIGRpYWxvZyBvcGVucywgaW5kaWNhdGluZyBpZiB0aGUgRFREIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWQKLW9yIG5vdC4gSWYgdGhlIGZpbGUgaXMgaW52YWxpZCwgYW55IGVycm9ycyB3aWxsIGFwcGVhciBpbiB0aGUgUHJvYmxlbXMgdmlldy4KLaA8cD48Yj5Ob3RlPC9iPjogSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nCi10aGF0IHRoZSBQcm9ibGVtcyB2aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcwotYWxsb3dlZCBieSBzZWxlY3RpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj48Yj5Qcm9wZXJ0aWVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L2I+PC9zcGFuPjwvc3Bhbj4gZnJvbSB0aGUgcHJvamVjdCdzIHBvcC11cCBtZW51IGFuZCBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlcgotb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZC4gWW91IG1pZ2h0IGhhdmUgdG8gc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj48Yj5PdmVycmlkZQotdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvc3Bhbj48L2I+IGNoZWNrIGJveCBpbiBvcmRlciB0byBlbmFibGUgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjxiPk1heGltdW0KLW51bWJlciBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzPC9iPjwvc3Bhbj4gZmllbGQuPC9wPgotPHA+WW91IGNhbiBzZXQgdXAgcHJvamVjdCdzCi1wcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzIGFyZSBhdXRvbWF0aWNhbGx5Ci12YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51IHNlbGVjdCAgPGI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj48L2I+LAotdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+PGI+VmFsaWRhdGlvbjwvYj48L3NwYW4+LiBBbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1bgotYWdhaW5zdCB5b3VyoHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24gcGFnZS6gPC9wPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdj4KLTxwPgotPGIgY2xhc3M9InBhcmVudGxpbmsiPlBhcmVudCB0b3BpYzo8L2I+IDxhIGhyZWY9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgdGl0bGU9Ildvcmtpbmcgd2l0aCBEVERzIj5Xb3JraW5nIHdpdGggRFREczwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgdGl0bGU9IkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiI+Li4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWw8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWFhMWI0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGRjMTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJtaXNjMDE3MCI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGVkaXQgdGhlIFdlYiBjb250ZW50IHNldHRpbmdzIGZvciBhIFdlYiBwcm9qZWN0LiBZb3UgY2FuIHNwZWNpZnkgdGhlIGRlZmF1bHQgZG9jdW1lbnQgdHlwZSwgQ1NTIHByb2ZpbGUsIGFuZCB0YXJnZXQgZGV2aWNlLiBUaGUgcHVibGljIElEIGFuZCBzeXN0ZW0gSUQgYXJlIHBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5LiBUbyByZXN0b3JlIHRoZSBkZWZhdWx0cywgY2xpY2sgPGI+UmVzdG9yZSBEZWZhdWx0czwvYj4uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwMzAiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlLCBzYXZlLCBvciBsb2FkIGFuIEhUTUwgZmlsZS4KLQotVmFyaW91cyBkZXZlbG9wbWVudCBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudCBsaW5lIGRlbGltaXRlcnMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUuIFNlbGVjdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IGNvcnJlc3BvbmRzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybS4KLTxiPk5vdGU6PC9iPiBUaGlzIGRlbGltaXRlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGFueSBkb2N1bWVudHMgdGhhdCBjdXJyZW50bHkgZXhpc3QuIEl0IHdpbGwgYmUgYWRkZWQgb25seSB0byBkb2N1bWVudHMgdGhhdCB5b3UgY3JlYXRlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPiwgb3IgdG8gZXhpc3RpbmcgZmlsZXMgdGhhdCB5b3Ugb3BlbiBhbmQgdGhlbiByZXNhdmUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LgotCi1UaGUgZW5jb2RpbmcgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2V0IHRoYXQgaXMgdXNlZCB3aGVuIGVpdGhlciBjcmVhdGluZyBIVE1MIGZpbGVzIG9yIGxvYWRpbmcgeW91ciBIVE1MIGZpbGVzIGludG8gdGhlIGVkaXRvci4gIENoYW5naW5nIHRoZSBjcmVhdGluZyBmaWxlcyBlbmNvZGluZyBjYXVzZXMgYW55IG5ldyBIVE1MIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAzMSI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGZvcm1hdHRpbmcsIGNvbnRlbnQgYXNzaXN0LCBhbmQgY2FwaXRhbGl6YXRpb24gc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgZWRpdCBhbiBIVE1MIGZpbGUuCi0KLUVudGVyIGEgbWF4aW11bSB3aWR0aCBpbiB0aGUgPGI+TGluZSB3aWR0aDwvYj4gZmllbGQgdG8gc3BlY2lmeSB0aGUgbGluZSB3aWR0aCB0byBicmVhayBhIGxpbmUgdG8gZml0IG9udG8gbW9yZSB0aGFuIG9uZSBsaW5lIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQotU2VsZWN0IDxiPlNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lPC9iPiB0byBzdGFydCBldmVyeSBhdHRyaWJ1dGUgb24gYSBuZXcgbGluZSB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuIEF0dHJpYnV0ZXMgd2lsbCByZXR1cm4gdG8gdGhlIHNhbWUgbWFyZ2luIGFzIHRoZSBwcmV2aW91cyBsaW5lLgotCi1TZWxlY3QgPGI+SW5kZW50IHVzaW5nIHRhYnM8L2I+IGlmIHlvdSB3YW50IHRvIHVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLgotCi1JZiB5b3UgcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8Yj5JbmRlbnQgdXNpbmcgc3BhY2VzPC9iPi4KLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDxiPkluZGVudGF0aW9uIHNpemU8L2I+IHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uCi0KLVNlbGVjdCA8Yj5DbGVhciBhbGwgYmxhbmsgbGluZXM8L2I+IHRvIHJlbW92ZSBibGFuayBsaW5lcyB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuCi0KLVRvIGFwcGx5IHRoZXNlIGZvcm1hdHRpbmcgc3R5bGVzLCBzZWxlY3QgdGhlIDxiPkZvcm1hdCBEb2N1bWVudDwvYj4gbWVudSBpdGVtLgotCi1JZiB0aGUgPGI+QXV0b21hdGljYWxseSBtYWtlIHN1Z2dlc3Rpb25zPC9iPiBjaGVjayBib3ggaXMgc2VsZWN0ZWQsIHlvdSBjYW4gc3BlY2lmeSB0aGF0IGNlcnRhaW4gY2hhcmFjdGVycyB3aWxsIGNhdXNlIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IHRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5LiBTcGVjaWZ5IHRoZXNlIGNoYXJhY3RlcnMgaW4gdGhlIDxiPlByb21wdCB3aGVuIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkPC9iPiBmaWVsZC4KLQotU2VsZWN0IHRoZSBVcHBlcmNhc2Ugb3IgTG93ZXJjYXNlIHJhZGlvIGJ1dHRvbiB0byBkZXRlcm1pbmUgdGhlIGNhc2UgZm9yIHRhZyBhbmQgYXR0cmlidXRlIG5hbWVzIHRoYXQgYXJlIGluc2VydGVkIGludG8gdGhlIGRvY3VtZW50IHdoZW4gdXNpbmcgY29udGVudCBhc3Npc3Qgb3IgY29kZSBnZW5lcmF0aW9uLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwMzIiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgdGhhdCB0aGUgSFRNTCBlZGl0b3IgZG9lcyB3aGVuIHlvdSBhcmUgZWRpdGluZyBhIGZpbGUuCi0KLVRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHNvdXJjZSB0eXBlcyB0aGF0IHlvdSBjYW4gc2VsZWN0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBlaXRoZXIgc2VsZWN0IHRoZSBjb250ZW50IHR5cGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QsIG9yIGNsaWNrIHRleHQgaW4gdGhlIHRleHQgc2FtcGxlIHdpbmRvdyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGV4dCBoaWdobGlnaHRpbmcuCi0KLVRoZSA8Yj5Gb3JlZ3JvdW5kPC9iPiBhbmQgPGI+QmFja2dyb3VuZDwvYj4gcHVzaCBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGFsbG93IHlvdSB0byBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQotQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdDwvYj4gcHVzaCBidXR0b24gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAzMyI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGNyZWF0ZSBuZXcgYW5kIGVkaXQgZXhpc3RpbmcgdGVtcGxhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGVkaXQgYW4gSFRNTCBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMTAwIj4KLTxkZXNjcmlwdGlvbj5DbGVhbnVwIG9wdGlvbnMgZW5hYmxlIHlvdSB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkIGFuZCBmb3JtYXR0ZWQuCi0KLVRoZSBmb2xsb3dpbmcgY2xlYW51cCBvcHRpb25zIGxldCB5b3Ugc2VsZWN0IHJhZGlvIGJ1dHRvbnMgdG8gY2hvb3NlIHRoZSB0eXBlIG9mIGNsZWFudXAgdG8gYmUgcGVyZm9ybWVkOgotLSA8Yj5UYWcgbmFtZSBjYXNlIGZvciBIVE1MPC9iPjogVW5sZXNzIHNldCB0byA8Yj5Bcy1pczwvYj4sIGNoYW5nZXMgdGhlIGNhc2Ugb2YgYWxsIHRhZ3MgaW4gYSBmaWxlIGZvciBlYXNpZXIgdmlzdWFsIHBhcnNpbmcgYW5kIGNvbnNpc3RlbmN5LgotLSA8Yj5BdHRyaWJ1dGUgbmFtZSBjYXNlIGZvciBIVE1MPC9iPjogVW5sZXNzIHNldCB0byA8Yj5Bcy1pczwvYj4sIGNoYW5nZXMgdGhlIGNhc2Ugb2YgYWxsIGF0dHJpYnV0ZXMgaW4gYSBmaWxlIGZvciBlYXNpZXIgdmlzdWFsIHBhcnNpbmcgYW5kIGNvbnNpc3RlbmN5LgotCi1UaGUgZm9sbG93aW5nIGNsZWFudXAgb3B0aW9ucyBjYW4gYmUgc2V0IHRvIG9uIG9yIG9mZiwgc28gdGhhdCB5b3UgY2FuIGxpbWl0IHRoZSB0eXBlIG9mIGNsZWFudXAgcGVyZm9ybWVkOgotLSA8Yj5JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlczwvYj46IEluc2VydHMgYW4gbWlzc2luZyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSB0YWcgdG8gbWFrZSB0aGUgZWxlbWVudCBvciBkb2N1bWVudCB3ZWxsLWZvcm1lZC4KLS0gPGI+SW5zZXJ0IG1pc3NpbmcgdGFnczwvYj46IENvbXBsZXRlcyBhbnkgbWlzc2luZyB0YWdzIChzdWNoIGFzIGFkZGluZyBhbiBlbmQgdGFnKSBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgZWxlbWVudCBvciBkb2N1bWVudCB3ZWxsLWZvcm1lZC4KLS0gPGI+UXVvdGUgYXR0cmlidXRlIHZhbHVlczwvYj46IEFwcHJvcHJpYXRlbHkgYWRkcyBkb3VibGUtIG9yIHNpbmdsZS1xdW90ZXMgYmVmb3JlIGFuZCBhZnRlciBhdHRyaWJ1dGUgdmFsdWVzIGlmIHRoZXkgYXJlIG1pc3NpbmcuCi0tIDxiPkZvcm1hdCBzb3VyY2U8L2I+OiBGb3JtYXRzIHRoZSBkb2N1bWVudCBqdXN0IGFzIHRoZSA8Yj5Gb3JtYXQgRG9jdW1lbnQ8L2I+IGNvbnRleHQgbWVudSBvcHRpb24gZG9lcywgaW1tZWRpYXRlbHkgYWZ0ZXIgcGVyZm9ybWluZyBhbnkgb3RoZXIgc3BlY2lmaWVkIDxiPkNsZWFudXA8L2I+IG9wdGlvbnMuCi0tIDxiPkNvbnZlcnQgbGluZSBkZWxpbWl0ZXJzIHRvPC9iPjogQ29udmVydHMgYWxsIGxpbmUgZGVsaW1pdGVycyBpbiB0aGUgZmlsZSB0byB0aGUgc2VsZWN0ZWQgb3BlcmF0aW5nIHN5c3RlbSdzIHR5cGUuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjE0MTg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9Imh0bWxzb3VyY2Vfc291cmNlX0hlbHBJZCI+Ci08ZGVzY3JpcHRpb24+VGhlIEhUTUwgc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBmaWxlIHRoYXQgaXMgY29kZWQgaW4gdGhlIEh5cGVydGV4dCBNYXJrdXAgTGFuZ3VhZ2Ugb3IgaW4gWEhUTUwuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwiLz4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvSFRNTFdpekNvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9IVE1MV2l6Q29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDY4Y2YyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9IVE1MV2l6Q29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJodG1sdzAwMTAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgSFRNTCB0ZW1wbGF0ZSBjaGVja2JveCB0byBjcmVhdGUgeW91ciBIVE1MIGZpbGUgYmFzZWQgb24gYSBkZWZhdWx0IHRlbXBsYXRlLiBDaG9vc2Ugb25lIG9mIHRoZSBmcmFtZXNldCB0ZW1wbGF0ZXMgaWYgeW91IGFyZSBkZXZlbG9waW5nIGEgV2ViIHNpdGUgd2l0aCBmcmFtZXMuIElmIHlvdSBkbyBub3Qgc2VsZWN0IGEgdGVtcGxhdGUsIHlvdXIgbmV3bHkgY3JlYXRlZCBKU1AgZmlsZSB3aWxsIGJlIGNvbXBsZXRlbHkgYmxhbmsuCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi0KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZTkzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMDAxLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmOTcwMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckh0bWxDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvckh0bWxDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDQ0NGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcAotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBIVE1MIGVkaXRvciBpbmZvcG9wcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDg1ZTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckh0bWxDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckh0bWxDb250ZXh0czIueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIi8+Ci0gICAgICAgICA8Y29udGV4dHMgZmlsZT0iSFRNTFdpekNvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIvPgotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhMmY4OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyXzEuMC4wLmphcgotdGVtcAotRGl0YUxpbmsuY2F0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ2NDA2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyMTMxNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAzLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwZjEwNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3NlX3RvYy54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9uY29udGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjAxNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9uY29udGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmpzY2Rhc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWExNDFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmpzY2Rhc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzEzNWNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubWFjc2NycC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTYzNzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubWFjc2NycC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25xdWVzdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25xdWVzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYWExZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ud2luLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWY5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ud2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA1ZGU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnLWluIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgcGFnZXMgICAgICAtLT4KLTwhLS0gZm9yIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyAoc291cmNlIGVkaXRvcnMpLiAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYyBmaWxlPSJzc2VfdG9jLnhtbCI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIubWFwbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBmNGRhNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9InNzZV90b2MuZGl0YW1hcCIvPg0KLSAgPC9uYXY+DQotICA8bGluaz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmNDhlZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGluZGV4PgotICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlbW92aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkhUTUwiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJKU1AiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI4Lmh0bWwjdHNyY2VkdDAyOCIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuaHRtbCN0c3JjZWR0MDI3IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwjY3NyY2VkdDAwNCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJlZmVyZW5jZSBzZXR0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5odG1sI3RzcmNlZHQwMjUiIHRpdGxlPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiIHRpdGxlPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIvPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGV4dCBzZWFyY2giPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDA3Lmh0bWwjdHNyY2VkdDAwNyIgdGl0bGU9IlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZSIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNwZWxsIGNoZWNrIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxMC5odG1sI3RzcmNlZHQwMTAiIHRpdGxlPSJDaGVja2luZyBzcGVsbGluZyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXJrdXAgbGFuZ3VhZ2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuaHRtbCN0c3JjZWR0MDAwIiB0aXRsZT0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJtYXJrdXAgbGFuZ3VhZ2UgZWRpdGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5odG1sI3RzcmNlZHQwMDAiIHRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwjdHNyY2VkdDAwMCIgdGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sI3RzcmNlZHQwMDEiIHRpdGxlPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgYW5kIHJlbW92aW5nIHRlbXBsYXRlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuaHRtbCN0c3JjZWR0MDI3IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGlvbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNvdXJjZSB2cyBiYXRjaCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N2YWxpZGF0ZS5odG1sI2NzcmNlZHQwMDEiIHRpdGxlPSJTb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb24iLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcmt1cCBsYW5ndWFnZSBzZXR0aW5ncyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuaHRtbCN0c3JjZWR0MDAxIiB0aXRsZT0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0Ij4KLSAgICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDA1Lmh0bWwjdHNyY2VkdDAwNSIgdGl0bGU9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW5hYmxpbmcgZm9yIEpTUCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIiB0aXRsZT0iRW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKU1AgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCBlbmFibGVtZW50Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMy5odG1sI3RzcmNlZHQwMjMiIHRpdGxlPSJFbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZpbGUgdHlwZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIiB0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29udGVudCB0eXBlIj4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBmaWxlIGV4dGVuc2lvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuaHRtbCN0Y29udGVudHR5cGUiIHRpdGxlPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJmaWxlIGV4dGVuc2lvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGNvbnRlbnQgdHlwZSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sI3Rjb250ZW50dHlwZSIgdGl0bGU9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVuY29kaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciIHRpdGxlPSJGaWxlIEVuY29kaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNwZWxsIGNoZWNrIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmh0bWwjdHNyY2VkdDAxMCIgdGl0bGU9IkNoZWNraW5nIHNwZWxsaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkhUTUwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9InJlbW92aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0icmV1c2Ugd2l0aCBzbmlwcGV0cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5odG1sI3RzcmNlZHQwMjYiIHRpdGxlPSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZXVzZSB3aXRoIHNuaXBwZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5odG1sI3RzcmNlZHQwMjYiIHRpdGxlPSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKU1AgdGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sI3RzcmNlZHQwMjgiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZW1vdmluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InhtbCB0ZW1wbGF0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlbW92aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5odG1sI3RzcmNlZHQwMjciIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic25pcHBldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2IiB0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkcmF3ZXJzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0IiB0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZGVsZXRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0IiB0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBpdGVtcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNC5odG1sI3RzcmNlZHQwMTQiIHRpdGxlPSJBZGRpbmcgc25pcHBldHMgZHJhd2VycyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJoaWRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0IiB0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBpdGVtcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjIuaHRtbCN0c3JjZWR0MDIyIiB0aXRsZT0iRWRpdGluZyBzbmlwcGV0IGl0ZW1zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGVsZXRpbmcgb3IgaGlkaW5nIGRyYXdlcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE2Lmh0bWwjdHNyY2VkdDAxNiIgdGl0bGU9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSmF2YVNjcmlwdCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJldXNlIHdpdGggc25pcHBldHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI2Lmh0bWwjdHNyY2VkdDAyNiIgdGl0bGU9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpTUCBjb2RlIj4KLSAgICA8ZW50cnkga2V5d29yZD0icmV1c2Ugd2l0aCBzbmlwcGV0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2IiB0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlNQIHRhZ3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjdXN0b20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9InJldXNlIHdpdGggc25pcHBldHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2IiB0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlNuaXBwZXRzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuaHRtbCNjc3JjZWR0MDAxIiB0aXRsZT0iU25pcHBldHMgdmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzbmlwcGV0IGRyYXdlcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgaXRlbXMgdG8iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE1Lmh0bWwjdHNyY2VkdDAxNSIgdGl0bGU9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNuaXBwZXQgaXRlbXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgdG8gZHJhd2VycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTUuaHRtbCN0c3JjZWR0MDE1IiB0aXRsZT0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZHJhd2VycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRlbGV0aW5nIHNuaXBwZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiIHRpdGxlPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaGlkaW5nIHNuaXBwZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiIHRpdGxlPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLTwvaW5kZXg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdjMmYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBhbmQgc25pcHBldHMgZG9jdW1lbnRhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDVkZTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnLWluIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgcGFnZXMgICAgICAtLT4KLTwhLS0gZm9yIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyAoc291cmNlIGVkaXRvcnMpLiAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYyBmaWxlPSJzc2VfdG9jLnhtbCI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiYzc1MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgaWQ9IndzdHNzZXRvYyIgbGlua2luZz0ibm9uZSIgdGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5kaXRhIiBuYXZ0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5kaXRhIiBsb2NrdGl0bGU9InllcyIgbmF2dGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzICINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N2YWxpZGF0ZS5kaXRhIiBuYXZ0aXRsZT0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIg0KLXR5cGU9ImNvbmNlcHQiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI1LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDA1LmRpdGEiIG5hdnRpdGxlPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NzcmNlZHQwMDYuZGl0YSIgbmF2dGl0bGU9IkNvbnRlbnQgYXNzaXN0IiB0eXBlPSJjb25jZXB0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMy5kaXRhIiBuYXZ0aXRsZT0iTWFraW5nIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUCBmaWxlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuZGl0YSIgbmF2dGl0bGU9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBmaWxlIHR5cGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuZGl0YSIgbmF2dGl0bGU9IkZpbGUgRW5jb2RpbmciIHR5cGU9ImNvbmNlcHQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDA3LmRpdGEiIG5hdnRpdGxlPSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuZGl0YSIgbmF2dGl0bGU9IkNoZWNraW5nIHNwZWxsaW5nIiB0eXBlPSJ0YXNrIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNy5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI4LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI2LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuZGl0YSIgbmF2dGl0bGU9IlNuaXBwZXRzIHZpZXciIHR5cGU9ImNvbmNlcHQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDE0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgc25pcHBldHMgZHJhd2VycyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjIuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgdHlwZT0idGFzayI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuZGl0YSIgbmF2dGl0bGU9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZjNiN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTx0b2MgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiB0b3BpY3M9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwiPgotICAgPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzICIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbiIgaHJlZj0idG9waWNzL2N2YWxpZGF0ZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5odG1sIj4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sIi8+Ci0gICAgICAgICA8L3RvcGljPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDUuaHRtbCI+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik1ha2luZyBjb250ZW50IGFzc2lzdCB3b3JrIGZvciBKU1AgZmlsZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwiLz4KLSAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBmaWxlIHR5cGVzIiBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRmlsZSBFbmNvZGluZyIgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZSIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDcuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDaGVja2luZyBzcGVsbGluZyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuaHRtbCI+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwiLz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuaHRtbCIvPgotICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciIGhyZWY9InRvcGljcy90c3JjZWR0MDI2Lmh0bWwiPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNC5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjIuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sIi8+Ci0gICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2JhOWMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjZW5jb2RpbmciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkZpbGUgRW5jb2Rpbmc8L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZW5jb2Rpbmc8aW5kZXh0ZXJtPmZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPiBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIFhNTCwgKFgpSFRNTCBmaWxlcywgYW5kIEpTUCBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkDQotYW5kIGludm9rZWQgaW4gbWFueSBkaWZmZXJlbnQgd2F5czsgaG93ZXZlciwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkNCi10aGUgZW5jb2RpbmcgaW4gZWFjaCBvbmUgb2YgeW91ciBzb3VyY2UgZmlsZXMsIGZvciB0aGF0IGlzIHdoZXJlIG1hbnkgWE1MLA0KLUhUTUwsIEpTUCBlZGl0b3JzIGV4cGVjdCB0byBmaW5kIHRoZSBlbmNvZGluZy48L3A+DQotPHA+Rm9yIGV4YW1wbGUsIGZvciBKU1AgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgYW5kL29yDQotdGhlIGNvbnRlbnRUeXBlIGF0dHJpYnV0ZSBpbiB0aGUgcGFnZSBkaXJlY3RpdmUsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcNCi1leGFtcGxlOjxjb2RlYmxvY2s+Jmx0OyVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSINCi0gICAgcGFnZUVuY29kaW5nPSJJU08tODg1OS0xIiUmZ3Q7DQotPC9jb2RlYmxvY2s+PC9wPg0KLTxwPkZvciBYTUwgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlIGVuY29kaW5nIHBzZXVkby1hdHRyaWJ1dGUgaW4gdGhlIHhtbCBkZWNsYXJhdGlvbg0KLWF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50IG9yIHRoZSB0ZXh0IGRlY2xhcmF0aW9uIGF0IHRoZSBzdGFydCBvZiBhbiBlbnRpdHksDQotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOiA8Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiID8+PC9jb2RlYmxvY2s+PC9wPg0KLTxwPkZvciAoWClIVE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSAmbHQ7bWV0YSZndDsgdGFnIGluc2lkZSB0aGUgJmx0O2hlYWQmZ3Q7DQotdGFncywgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxjb2RlYmxvY2s+Jmx0O21ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz48L2NvZGVibG9jaz48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzZmFiZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5GaWxlIEVuY29kaW5nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjZW5jb2RpbmciPjxhIG5hbWU9ImNlbmNvZGluZyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5GaWxlIEVuY29kaW5nPC9oMT4KLTxkaXY+PHA+PC9wPgotPHA+IFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gWE1MLCAoWClIVE1MIGZpbGVzLCBhbmQgSlNQIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQKLWFuZCBpbnZva2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXM7IGhvd2V2ZXIsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5Ci10aGUgZW5jb2RpbmcgaW4gZWFjaCBvbmUgb2YgeW91ciBzb3VyY2UgZmlsZXMsIGZvciB0aGF0IGlzIHdoZXJlIG1hbnkgWE1MLAotSFRNTCwgSlNQIGVkaXRvcnMgZXhwZWN0IHRvIGZpbmQgdGhlIGVuY29kaW5nLjwvcD4KLTxkaXYgY2xhc3M9InAiPkZvciBleGFtcGxlLCBmb3IgSlNQIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIGFuZC9vcgotdGhlIGNvbnRlbnRUeXBlIGF0dHJpYnV0ZSBpbiB0aGUgcGFnZSBkaXJlY3RpdmUsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcKLWV4YW1wbGU6PHByZT4mbHQ7JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIgotICAgIHBhZ2VFbmNvZGluZz0iSVNPLTg4NTktMSIlJmd0OzwvcHJlPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5Gb3IgWE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBlbmNvZGluZyBwc2V1ZG8tYXR0cmlidXRlIGluIHRoZSB4bWwgZGVjbGFyYXRpb24KLWF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50IG9yIHRoZSB0ZXh0IGRlY2xhcmF0aW9uIGF0IHRoZSBzdGFydCBvZiBhbiBlbnRpdHksCi1hcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IDxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPyZndDs8L3ByZT4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+Rm9yIChYKUhUTUwgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlICZsdDttZXRhJmd0OyB0YWcgaW5zaWRlIHRoZSAmbHQ7aGVhZCZndDsKLXRhZ3MsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8cHJlPiZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8mZ3Q7PC9wcmU+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODVjOTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjc3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TbmlwcGV0cyB2aWV3PC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nDQotb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGgNCi1maWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlNuaXBwZXRzIHZpZXc8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPiBUaGUgU25pcHBldHMgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91DQotZGVmaW5lIGFuZCBpbmNsdWRlLiBUbyB2aWV3IG9yIGNvbGxhcHNlIHRoZSBvYmplY3RzIGluIGEgc3BlY2lmaWMgZHJhd2VyLA0KLWNsaWNrIHRoZSBkcmF3ZXIgbmFtZS48L3A+DQotPHA+VGhlIFNuaXBwZXRzIHZpZXcgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6IDx1bD4NCi08bGk+RHJhZy1hbmQtZHJvcCB0byB2YXJpb3VzIHNvdXJjZSBlZGl0aW5nIHBhZ2VzOiBZb3UgY2FuIGRyYWcgaXRlbXMgZnJvbQ0KLXRoZSB2aWV3IGludG8gdGhlIGFjdGl2ZSBlZGl0b3IgYW5kIHRoZSB0ZXh0IHdpbGwgYmUgZHJvcHBlZCBpbnRvIHRoZSBkb2N1bWVudA0KLWF0IHRoZSBjdXJzb3IgbG9jYXRpb24gPC9saT4NCi08bGk+RG91YmxlLWNsaWNrIHN1cHBvcnQ6IFlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGFuIGl0ZW0gYW5kIGhhdmUgaXQgaW5zZXJ0ZWQNCi1hdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIGFjdGl2ZSBlZGl0b3IgPC9saT4NCi08bGk+VXNlci1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBZb3UgY2FuIGRlZmluZSwgZWRpdCwgYW5kIHJlbW92ZSBpdGVtcw0KLWZyb20gdmlldyBkcmF3ZXJzIGFzIGRlc2lyZWQuPC9saT4NCi08bGk+UGx1Zy1pbi1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGNvbnRyaWJ1dGUgYQ0KLWRlZmF1bHQgbGlzdCBvZiBpdGVtcyB0byB0aGVpciBvd24gZHJhd2Vycy48L2xpPg0KLTxsaT5WYXJpYWJsZXMgaW4gaW5zZXJ0aW9uczogQnkgZGVmYXVsdCwgaXRlbXMgd2lsbCBiZSBlZGl0ZWQgdXNpbmcgYSBkaWFsb2cNCi1hbmQsIHdoZW4gaW5zZXJ0ZWQsIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIHZhcmlhYmxlcy48L2xpPg0KLTxsaT5DdXN0b21pemF0aW9uOiBZb3UgY2FuIHNlbGVjdCB3aGljaCBkcmF3ZXJzIGFuZCBpdGVtcyBhcmUgc2hvd24gaW4gdGhlDQotU25pcHBldHMgdmlldy48L2xpPg0KLTxsaT5DdXN0b20gaW5zZXJ0aW9uOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgaXRlbXMNCi1zbyB0aGF0IHdoZW4gdGhleSBhcmUgZHJvcHBlZCBkdXJpbmcgYSBkcmFnLWFuZC1kcm9wIGFjdGlvbiwgYm90aCB0aGUgdGV4dA0KLXRoYXQgaXMgaW5zZXJ0ZWQgYW5kIHRoZSBpbnNlcnRpb24gbG9jYXRpb24gYXJlIHN0cmljdGx5IGRlZmluZWQuPC9saT4NCi08L3VsPjwvcD4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiN2UyMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+U25pcHBldHMgdmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3NyY2VkdDAwMSI+PGEgbmFtZT0iY3NyY2VkdDAwMSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNuaXBwZXRzIHZpZXc8L2gxPgotPGRpdj48cD5UaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLAotc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHSZLCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMKLWFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMKLXRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS48L3A+Ci08cD5UbyB2aWV3IG9yIGNvbGxhcHNlIHRoZSBvYmplY3RzIGluIGEgc3BlY2lmaWMgZHJhd2VyLCBjbGljayB0aGUgZHJhd2VyCi1uYW1lLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBTbmlwcGV0cyB2aWV3IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiA8dWw+PGxpPkRyYWctYW5kLWRyb3AgdG8gdmFyaW91cyBzb3VyY2UgZWRpdGluZyBwYWdlczogWW91IGNhbiBkcmFnIGl0ZW1zIGZyb20KLXRoZSB2aWV3IGludG8gdGhlIGFjdGl2ZSBlZGl0b3IgYW5kIHRoZSB0ZXh0IHdpbGwgYmUgZHJvcHBlZCBpbnRvIHRoZSBkb2N1bWVudAotYXQgdGhlIGN1cnNvciBsb2NhdGlvbiA8L2xpPgotPGxpPkRvdWJsZS1jbGljayBzdXBwb3J0OiBZb3UgY2FuIGRvdWJsZS1jbGljayBvbiBhbiBpdGVtIGFuZCBoYXZlIGl0IGluc2VydGVkCi1hdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIGFjdGl2ZSBlZGl0b3IgPC9saT4KLTxsaT5Vc2VyLWRlZmluZWQgZHJhd2VycyBhbmQgaXRlbXM6IFlvdSBjYW4gZGVmaW5lLCBlZGl0LCBhbmQgcmVtb3ZlIGl0ZW1zCi1mcm9tIHZpZXcgZHJhd2VycyBhcyBkZXNpcmVkLjwvbGk+Ci08bGk+UGx1Zy1pbi1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGNvbnRyaWJ1dGUgYQotZGVmYXVsdCBsaXN0IG9mIGl0ZW1zIHRvIHRoZWlyIG93biBkcmF3ZXJzLjwvbGk+Ci08bGk+VmFyaWFibGVzIGluIGluc2VydGlvbnM6IEJ5IGRlZmF1bHQsIGl0ZW1zIHdpbGwgYmUgZWRpdGVkIHVzaW5nIGEgZGlhbG9nCi1hbmQsIHdoZW4gaW5zZXJ0ZWQsIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIHZhcmlhYmxlcy48L2xpPgotPGxpPkN1c3RvbWl6YXRpb246IFlvdSBjYW4gc2VsZWN0IHdoaWNoIGRyYXdlcnMgYW5kIGl0ZW1zIGFyZSBzaG93biBpbiB0aGUKLVNuaXBwZXRzIHZpZXcuPC9saT4KLTxsaT5DdXN0b20gaW5zZXJ0aW9uOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgaXRlbXMKLXNvIHRoYXQgd2hlbiB0aGV5IGFyZSBkcm9wcGVkIGR1cmluZyBhIGRyYWctYW5kLWRyb3AgYWN0aW9uLCBib3RoIHRoZSB0ZXh0Ci10aGF0IGlzIGluc2VydGVkIGFuZCB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9uIGFyZSBzdHJpY3RseSBkZWZpbmVkLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE0Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiI+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBhZGQgYSBuZXcgaXRlbSB0byBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gbW9kaWZ5IHRoZSB0ZW1wbGF0ZSBjb2RlIHRoYXQgaXMgaW4gYW4gaXRlbSBpbiBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PGJyIC8+Ci08IS0tIDxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwgb3IgWE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvYT4tLT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTczZDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwNCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPjxxPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3I8L3E+IGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0DQoteW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvcg0KLVhNTC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGtleXdvcmQ+c291cmNlIGVkaXRvcnM8L2tleXdvcmQ+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPjxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48aW5kZXh0ZXJtPnJlbW92aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi1UaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyByZXByZXNlbnRlZCBieSB2YXJpb3VzIGVkaXRvcnMgdGhhdCB5b3UgY2FuDQotdXNlIHRvIGVkaXQgZmlsZXMgY29kZWQgd2l0aCBtYXJrdXAgdGFnczo8L3A+DQotPHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMyI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9Ijg5KiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDIiDQotY29sd2lkdGg9IjEzNCoiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIgY29sd2lkdGg9IjY5KiIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIiB2YWxpZ249InRvcCI+RmlsZSB0eXBlPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiIgdmFsaWduPSJ0b3AiPkVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249InRvcCI+Q29udGVudCBhc3Npc3Q/PC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5DYXNjYWRpbmcgc3R5bGUgc2hlZXQ8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5DU1Mgc291cmNlIHBhZ2UgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uczwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkRURCBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+Tm88L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkhUTUw8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5IVE1MIHNvdXJjZSBwYWdlIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gc291cmNlIHBhZ2UgZWRpdG9yIG9yIHNvdXJjZQ0KLXRhYiBvZiBKYXZhU2NyaXB0IGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkpTUDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkpTUCBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5YTUw8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Tb3VyY2UgdGFiIG9mIFhNTCBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5YU0QgKHNjaGVtYSk8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Tb3VyY2UgdGFiIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTxwPllvdSBjYW4gYWNjZXNzIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGJ5IHJpZ2h0LWNsaWNraW5nIG9uIGEgcmVsZXZhbnQNCi1maWxlIG5hbWUgaW4gTmF2aWdhdG9yIG9yIFBhY2thZ2UgRXhwbG9yZXIgdmlldyBhbmQgdGhlbiBjbGlja2luZyA8dWljb250cm9sPk9wZW4NCi1XaXRoPC91aWNvbnRyb2w+IGFuZCBzZWxlY3RpbmcgdGhlIGVkaXRvciBtZW50aW9uZWQgYWJvdmUuPC9wPg0KLTxwPlRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHByb3ZpZGVzIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgcmVnYXJkbGVzcyBvZg0KLXRoZSBtYXJrdXAgbGFuZ3VhZ2Ugd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLiBJdCBwcm92aWRlcyBjYXBhYmlsaXRpZXMNCi1zdWNoIGFzIGZpbmQgYW5kIHJlcGxhY2UsIHVuZG8sIHJlZG8sIGEgc3BlbGxpbmcgY2hlY2tlciwgYW5kIGNvZGluZyBhc3Npc3RhbmNlDQotKHVubGVzcyBvdGhlcndpc2Ugbm90ZWQpLiBJdCBhbHNvIGhpZ2hsaWdodHMgc3ludGF4IGluIGRpZmZlcmVudCBjb2xvcnMuIEZvbGxvd2luZw0KLWlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcidzIGNhcGFiaWxpdGllczo8L3A+DQotPGRsPjxkbGVudHJ5Pg0KLTxkdD5zeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4NCi08ZGQ+RWFjaCBrZXl3b3JkIHR5cGUgYW5kIHN5bnRheCB0eXBlIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBlbmFibGluZw0KLXlvdSB0byBlYXNpbHkgZmluZCBhIGNlcnRhaW4ga2luZCBvZiBrZXl3b3JkIGZvciBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgaW4NCi1IVE1MLCBlbGVtZW50IG5hbWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGF0dHJpYnV0ZSB2YWx1ZXMsIGFuZCBjb21tZW50cyBoYXZlDQotZGlmZmVyZW50IGNvbG9yczsgaW4gPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZQ0KLW5hbWVzLCBxdW90ZWQgdGV4dCBzdHJpbmdzLCBhbmQgY29tbWVudHMgaGF2ZSBkaWZmZXJlbnQgY29sb3JzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD51bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbzwvZHQ+DQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQ0KLXRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZSBpbmNyZW1lbnRlZA0KLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5jb250ZW50IGFzc2lzdDwvZHQ+DQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSB0byBpbnNlcnQgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gZnVuY3Rpb25zLCBIVE1MIHRhZ3MsIG9yDQotb3RoZXIga2V5d29yZHMuIENob2ljZXMgYXZhaWxhYmxlIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGFyZSBiYXNlZCBvbg0KLWZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBmaWxlIGlzIGNvZGVkLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD51c2VyLWRlZmluZWQgdGVtcGxhdGVzIGFuZCBzbmlwcGV0czwvZHQ+DQotPGRkPkJ5IHVzaW5nIHRoZSBTbmlwcGV0cyB2aWV3LCB5b3UgY2FuIGFjY2VzcyB1c2VyLWRlZmluZWQgY29kZSBzbmlwcGV0cw0KLWFuZCAoZm9yIGFsbCBjb2RlIHR5cGVzIGV4Y2VwdCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPikgdGVtcGxhdGVzIHRvIGhlbHAgeW91DQotcXVpY2tseSBhZGQgcmVndWxhcmx5IHVzZWQgdGV4dCBzdHJpbmdzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5mdW5jdGlvbiBzZWxlY3Rpb248L2R0Pg0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IsIHRoZSBmdW5jdGlvbiBvciB0YWcgc2VsZWN0aW9uIGluZGljYXRvcg0KLWhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBmdW5jdGlvbiBvciB0YWcgaW4gdGhlIHZlcnRpY2FsDQotcnVsZXIgb24gdGhlIGxlZnQgYXJlYSBvZiB0aGUgU291cmNlIHBhZ2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnBvcC11cCBtZW51IG9wdGlvbnM8L2R0Pg0KLTxkZD5UaGVzZSBhcmUgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zIGF2YWlsYWJsZSBpbiB0aGUgd29ya2JlbmNoIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPiBtZW51LjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGYxNWU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDQiPjxhIG5hbWU9ImNzcmNlZHQwMDQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwvaDE+Ci08ZGl2PjxwPjxzcGFuIGNsYXNzPSJxIj4iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciI8L3NwYW4+IGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0Ci15b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yCi1YTUwuPC9wPjxwPlRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IHZhcmlvdXMgZWRpdG9ycyB0aGF0IHlvdSBjYW4KLXVzZSB0byBlZGl0IGZpbGVzIGNvZGVkIHdpdGggbWFya3VwIHRhZ3M6PC9wPgotCi08ZGl2IGNsYXNzPSJza2lwc3BhY2UiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIGlkPSJkMGUyOSI+RmlsZSB0eXBlPC90aD4KLTx0aCB2YWxpZ249InRvcCIgaWQ9ImQwZTMxIj5FZGl0b3I8L3RoPgotPHRoIHZhbGlnbj0idG9wIiBpZD0iZDBlMzMiPkNvbnRlbnQgYXNzaXN0PzwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT48dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyOSAiPkNhc2NhZGluZyBzdHlsZSBzaGVldDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxICI+Q1NTIHNvdXJjZSBwYWdlIGVkaXRvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMzICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyOSAiPkRlcGxveW1lbnQgZGVzY3JpcHRvciAod2ViLnhtbCk8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSAiPlNvdXJjZSB0YWIgb2YgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVkaXRvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMzICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyOSAiPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSAiPkRURCBzb3VyY2UgcGFnZSBlZGl0b3I8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMyAiPk5vPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyOSAiPkhUTUw8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSAiPkhUTUwgc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzMgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTI5ICI+SmF2YVNjcmlwdJk8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSAiPkphdmFTY3JpcHQgc291cmNlIHBhZ2UgZWRpdG9yIG9yIHNvdXJjZQotdGFiIG9mIEphdmFTY3JpcHQgZWRpdG9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzMgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTI5ICI+SlNQPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzEgIj5KU1Agc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzMgIj5ZZXM8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTI5ICI+WE1MPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzEgIj5YTUwgc291cmNlIHBhZ2UgZWRpdG9yIG9yIFNvdXJjZSB0YWIgb2YgWE1MIGVkaXRvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMzICI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyOSAiPlhTRCAoc2NoZW1hKTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxICI+U291cmNlIHRhYiBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMzICI+WWVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPHA+WW91IGNhbiBhY2Nlc3MgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgYnkgcmlnaHQtY2xpY2tpbmcgb24gYSByZWxldmFudAotZmlsZSBuYW1lIGluIE5hdmlnYXRvciBvciBQYWNrYWdlIEV4cGxvcmVyIHZpZXcgYW5kIHRoZW4gY2xpY2tpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbgotV2l0aDwvc3Bhbj4gYW5kIHNlbGVjdGluZyB0aGUgZWRpdG9yIG1lbnRpb25lZCBhYm92ZS48L3A+Ci08cD5UaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHJlZ2FyZGxlc3Mgb2YKLXRoZSBtYXJrdXAgbGFuZ3VhZ2Ugd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLiBJdCBwcm92aWRlcyBjYXBhYmlsaXRpZXMKLXN1Y2ggYXMgZmluZCBhbmQgcmVwbGFjZSwgdW5kbywgcmVkbywgYSBzcGVsbGluZyBjaGVja2VyLCBhbmQgY29kaW5nIGFzc2lzdGFuY2UKLSh1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkKS4gSXQgYWxzbyBoaWdobGlnaHRzIHN5bnRheCBpbiBkaWZmZXJlbnQgY29sb3JzLiBGb2xsb3dpbmcKLWlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcidzIGNhcGFiaWxpdGllczo8L3A+Ci08ZGw+PGR0IGNsYXNzPSJib2xkIj5zeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4KLTxkZD5FYWNoIGtleXdvcmQgdHlwZSBhbmQgc3ludGF4IHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksIGVuYWJsaW5nCi15b3UgdG8gZWFzaWx5IGZpbmQgYSBjZXJ0YWluIGtpbmQgb2Yga2V5d29yZCBmb3IgZWRpdGluZy4gRm9yIGV4YW1wbGUsIGluCi1IVE1MLCBlbGVtZW50IG5hbWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGF0dHJpYnV0ZSB2YWx1ZXMsIGFuZCBjb21tZW50cyBoYXZlCi1kaWZmZXJlbnQgY29sb3JzOyBpbiBKYXZhU2NyaXB0LCBmdW5jdGlvbiBhbmQgdmFyaWFibGUgbmFtZXMsCi1xdW90ZWQgdGV4dCBzdHJpbmdzLCBhbmQgY29tbWVudHMgaGF2ZSBkaWZmZXJlbnQgY29sb3JzLjwvZGQ+Ci08ZHQgY2xhc3M9ImJvbGQiPnVubGltaXRlZCB1bmRvIGFuZCByZWRvPC9kdD4KLTxkZD5UaGVzZSBvcHRpb25zIGFsbG93IHlvdSB0byBpbmNyZW1lbnRhbGx5IHVuZG8gYW5kIHJlZG8gZXZlcnkgY2hhbmdlIG1hZGUKLXRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZSBpbmNyZW1lbnRlZAotb25lIGNoYXJhY3RlciBvciBzZXQgb2Ygc2VsZWN0ZWQgY2hhcmFjdGVycyBhdCBhIHRpbWUuPC9kZD4KLTxkdCBjbGFzcz0iYm9sZCI+Y29udGVudCBhc3Npc3Q8L2R0PgotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSB0byBpbnNlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbnMsIEhUTUwgdGFncywgb3Igb3RoZXIKLWtleXdvcmRzLiBDaG9pY2VzIGF2YWlsYWJsZSBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCBhcmUgYmFzZWQgb24gZnVuY3Rpb25zCi1kZWZpbmVkIGJ5IHRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBmaWxlIGlzIGNvZGVkLjwvZGQ+Ci08ZHQgY2xhc3M9ImJvbGQiPnVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMgYW5kIHNuaXBwZXRzPC9kdD4KLTxkZD5CeSB1c2luZyB0aGUgU25pcHBldHMgdmlldywgeW91IGNhbiBhY2Nlc3MgdXNlci1kZWZpbmVkIGNvZGUgc25pcHBldHMKLWFuZCAoZm9yIGFsbCBjb2RlIHR5cGVzIGV4Y2VwdCBKYXZhU2NyaXB0KSB0ZW1wbGF0ZXMgdG8gaGVscCB5b3UgcXVpY2tseQotYWRkIHJlZ3VsYXJseSB1c2VkIHRleHQgc3RyaW5ncy48L2RkPgotPGR0IGNsYXNzPSJib2xkIj5mdW5jdGlvbiBzZWxlY3Rpb248L2R0PgotPGRkPkJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZiB5b3VyIGN1cnNvciwgdGhlIGZ1bmN0aW9uIG9yIHRhZyBzZWxlY3Rpb24gaW5kaWNhdG9yCi1oaWdobGlnaHRzIHRoZSBsaW5lIG51bWJlcnMgdGhhdCBpbmNsdWRlIGEgZnVuY3Rpb24gb3IgdGFnIGluIHRoZSB2ZXJ0aWNhbAotcnVsZXIgb24gdGhlIGxlZnQgYXJlYSBvZiB0aGUgU291cmNlIHBhZ2UuPC9kZD4KLTxkdCBjbGFzcz0iYm9sZCI+cG9wLXVwIG1lbnUgb3B0aW9uczwvZHQ+Ci08ZGQ+VGhlc2UgYXJlIHRoZSBzYW1lIGVkaXRpbmcgb3B0aW9ucyBhdmFpbGFibGUgaW4gdGhlIHdvcmtiZW5jaCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LjwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08ZGl2PjxwPjxiIGNsYXNzPSJyZWxjb25jZXB0c2hkIj5SZWxhdGVkIGNvbmNlcHRzPC9iPjxiciAvPgotPGEgaHJlZj0iY3NyY2VkdDAwNi5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiI+Q29udGVudCBhc3Npc3Q8L2E+PGJyIC8+Ci08L3A+Ci08cD48YiBjbGFzcz0icmVsdGFza3NoZCI+UmVsYXRlZCB0YXNrczwvYj48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwgb3IgWE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDUwOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwNiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q29udGVudCBhc3Npc3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3INCi1maW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3INCi1pbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucw0KLWZvciBjb21wbGV0aW9uLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPk1vc3Qgb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGhhdmUgY29udGVudCBhc3Npc3QuIEZvciBhIGxpc3Qgb2YNCi1lZGl0b3JzIHRoYXQgaGF2ZSBjb250ZW50IGFzc2lzdCwgc2VlIDx4cmVmIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSIgdHlwZT0iY29uY2VwdCI+U3RydWN0dXJlZA0KLXRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwveHJlZj4uIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2V0IGNvbnRlbnQNCi1hc3Npc3RhbmNlLCBzZWUgPHhyZWYgaHJlZj0idHNyY2VkdDAwNS5kaXRhIiB0eXBlPSJ0YXNrIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZQ0KLWluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC94cmVmPjwvcD4NCi08cD5UaGUgc2VjdGlvbnMgYmVsb3cgZGVzY3JpYmUgc3BlY2lmaWNzIG9mIEhUTUwgY29udGVudCBhc3Npc3QsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IGNvbnRlbnQNCi1hc3Npc3QsIGFuZCBKU1AgY29udGVudCBhc3Npc3QuPC9wPg0KLTxzZWN0aW9uPjx0aXRsZT5IVE1MIGNvbnRlbnQgYXNzaXN0PC90aXRsZT48cD5IVE1MIGlzIGZsZXhpYmxlIGluIHRoYXQgc29tZQ0KLUhUTUwgZWxlbWVudHMgYWxsb3cgZW5kIHRhZ3MgdG8gYmUgb3B0aW9uYWxseSBvbWl0dGVkLCBzdWNoIGFzIDxjb2RlcGg+UDwvY29kZXBoPiwgPGNvZGVwaD5EVDwvY29kZXBoPiwgPGNvZGVwaD5ERDwvY29kZXBoPiwgPGNvZGVwaD5MSTwvY29kZXBoPiwgPGNvZGVwaA0KLT5USEVBRDwvY29kZXBoPiwgPGNvZGVwaD5UUjwvY29kZXBoPiwgPGNvZGVwaD5URDwvY29kZXBoPiwgPGNvZGVwaD5USDwvY29kZXBoPiwNCi1hbmQgc28gb24uIE90aGVyIEhUTUwgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCB0byBoYXZlIG5vIGNvbnRlbnQgbWF5IHJlcXVpcmUNCi10aGUgZW5kIHRhZyBhbHdheXMgYmUgb21pdHRlZCwgc3VjaCBhcyA8Y29kZXBoPkJSPC9jb2RlcGg+LCA8Y29kZXBoPkhSPC9jb2RlcGg+LCA8Y29kZXBoPkxJTks8L2NvZGVwaD4sIDxjb2RlcGg+TUVUQTwvY29kZXBoPiwNCi1hbmQgPGNvZGVwaD5JTUc8L2NvZGVwaD4uIFRoaXMgZmxleGliaWxpdHkgbWFrZXMgdGhlIGNvbnRlbnQgYXNzaXN0IGZ1bmN0aW9uDQotd2l0aGluIHRoZSBIVE1MIHNvdXJjZSBwYWdlIGVkaXRvciBsZXNzIHByZWNpc2UgdGhhbiBpdCBtaWdodCBiZSB3aXRoIGEgbW9yZQ0KLXJpZ2lkbHkgY29uc3RyYWluZWQgbWFya3VwIGxhbmd1YWdlLjwvcD48cD5IVE1MIGNvbnRlbnQgYXNzaXN0IGlzIG1vc3QgYmVuZWZpY2lhbA0KLXdoZW4geW91IG5lZWQgdG8gY29tcGxldGUgYSB0YWcgbmFtZSwgYWRkIGFuIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIHBhaXIgd2l0aGluDQotYSBzdGFydCB0YWcsIG9yIHNlbGVjdCBmcm9tIGFuIGVudW1lcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGUgdmFsdWVzLjwvcD48cD5BbHRob3VnaA0KLWNvbnRlbnQgYXNzaXN0IG9ubHkgc2hvd3MgYXR0cmlidXRlIG5hbWVzIHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHNwZWNpZmllZA0KLWluIGEgc3RhcnQgdGFnLCBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBncmFtbWFyIGNvbnN0cmFpbnRzIGZvciB0YWdzLg0KLUZvciBleGFtcGxlLCB0aGUgPGNvZGVwaD5IRUFEPC9jb2RlcGg+IGVsZW1lbnQgaW4gSFRNTCBvbmx5IHBlcm1pdHMgemVybyBvcg0KLW9uZSBvY2N1cnJlbmNlcyBvZiBhIDxjb2RlcGg+VElUTEU8L2NvZGVwaD4gdGFnIGluIGl0cyBjb250ZW50LiBJZiB5b3UgcHJvbXB0DQotZm9yIGNvbnRlbnQgYXNzaXN0IHdpdGhpbiBhIDxjb2RlcGg+SEVBRDwvY29kZXBoPiBjb250ZW50IHRoYXQgYWxyZWFkeSBjb250YWlucw0KLWEgPGNvZGVwaD5USVRMRTwvY29kZXBoPiB0YWcsIGNvbnRlbnQgYXNzaXN0IHdpbGwgc3RpbGwgc2hvdyA8Y29kZXBoPlRJVExFPC9jb2RlcGg+IGluDQotaXRzIHByb3Bvc2FsIGxpc3QuPC9wPjxwPkhvd2V2ZXIsIGlmIGFuIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBhY2NvcmRpbmcgdG8NCi10aGUgRFREL1NjaGVtYSwgdGhhdCBhdHRyaWJ1dGUgd2lsbCBzaG93IHVwIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdpdGggYQ0KLXllbGxvdyBjaXJjbGUgaW5kaWNhdG9yIG9uIGl0cyBpY29uLjwvcD48cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uDQotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZC4NCi1UaGUgbGlzdCBpcyBiYXNlZCBvbiB0aGUgY29udGV4dC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgZGlyZWN0bHkNCi1hZnRlciBhbiBvcGVuaW5nIHBhcmFncmFwaCB0YWcgKDxjb2RlcGg+Jmx0O3A+PC9jb2RlcGg+KSAsIHRoZSBmaXJzdCBpdGVtDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3Qgd2lsbCBiZSB0aGUgY29ycmVzcG9uZGluZyBjbG9zaW5nIHBhcmFncmFwaCAoPGNvZGVwaD4mbHQ7L3A+PC9jb2RlcGg+KQ0KLXRhZy48L3A+PHA+VGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgZGlzcGxheXMgYWxsIGF2YWlsYWJsZSB0YWdzIGZvciB0aGUgY3VycmVudA0KLWN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gVGhlIHBpY3R1cmUgYmVsb3cgc2hvd3MgdGhlIGRlZmF1bHQNCi1jb250ZW50IGFzc2lzdCBsaXN0IGZvciBhIHBhcmFncmFwaCB0YWcgZXhhbXBsZTo8aW1hZ2UgYWx0PSJIVE1MIENvbnRlbnQgYXNzaXN0Ig0KLWhyZWY9Ii4uL2ltYWdlcy9uY29udGFzcy5naWYiIHBsYWNlbWVudD0iYnJlYWsiPjwvaW1hZ2U+PC9wPjxwPlRhZyBwcm9wb3NhbHMNCi1hcmUgbGlzdGVkIGFscGhhYmV0aWNhbGx5LiBJZiB5b3UgdHlwZSBhIDxjb2RlcGg+Jmx0OzwvY29kZXBoPiAodG8gYmVnaW4gYQ0KLW5ldyB0YWcpIGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCBhbmQgYmVnaW4gdHlwaW5nIHRoZSBmaXJzdCBvbmUNCi1vciB0d28gbGV0dGVycyBvZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gYWRkLCB0aGUgcHJvcG9zYWwgbGlzdCBhdXRvbWF0aWNhbGx5DQotcmVmcmVzaGVzIHRvIHJlZmxlY3QgcHJvcG9zYWxzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4geW91IGhhdmUgdHlwZWQuIElmIHlvdQ0KLWRvIG5vdCB0eXBlIGEgPGNvZGVwaD4mbHQ7PC9jb2RlcGg+IGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCB5b3UNCi1jYW4gY2xpY2sgd2l0aGluIHRoZSBwcm9wb3NhbCBsaXN0IGFuZCB0aGVuIHR5cGUgdGhlIGxldHRlciB0aGF0IHRoZSB0YWcgYmVnaW5zDQotd2l0aCwgdG8gcmVkdWNlIChzb21ld2hhdCkgdGhlIGFtb3VudCBvZiBzY3JvbGxpbmcgdG8gbG9jYXRlIHRoZSBkZXNpcmVkIHRhZy48L3A+PHA+QXMNCi15b3UgdHlwZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsZXR0ZXJzIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZXMgb3IgZW51bWVyYXRlZA0KLWF0dHJpYnV0ZSB2YWx1ZXMgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gYSB0YWcsIHRoZSBsaXN0IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVzDQotdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZC48L3A+PG5vdGUgdHlwZT0icmVzdHJpY3Rpb24iPjxpbWFnZQ0KLWFsdD0iRm9yIExpbnV4LiIgaHJlZj0iLi4vaW1hZ2VzL25saW51eC5naWYiPjwvaW1hZ2U+IFdoZW4gdXNpbmcgTGludXggKE1vdGlmDQotb3IgR1RLKSBhbmQgYSBEQkNTIGxvY2FsZSwgZG91YmxlLWNsaWNraW5nIG9uIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGNhbg0KLXNvbWV0aW1lcyBjYXVzZSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gVk0gdG8gdGVybWluYXRlLiBJbnN0ZWFkIG9mIGRvdWJsZS1jbGlja2luZw0KLW9uIHRoZSBsaXN0LCB1c2UgdGhlIGFycm93cyBhbmQgRW50ZXIga2V5cyB0byBtYWtlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUNCi1saXN0Ljwvbm90ZT48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IGNvbnRlbnQgYXNzaXN0PC90aXRsZT48cD5JdGVtcyBpbiB0aGUgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gY29udGVudA0KLWFzc2lzdCBsaXN0IGFyZSBwcmVjZWRlZCBieSBhbiBJbnRlcm5ldCBFeHBsb3JlciBpY29uLCBhIE5ldHNjYXBlIGljb24sIG9yDQotYm90aCwgdG8gaW5kaWNhdGUgd2hldGhlciBzcGVjaWZpYyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBvYmplY3RzLCBtZXRob2RzLCBvciBmdW5jdGlvbnMNCi1hcmUgc3VwcG9ydGVkIGJ5IG9uZSBvciBib3RoIGJyb3dzZXJzLiBJZiB0aGUgSW50ZXJuZXQgRXhwbG9yZXIgaWNvbiBpcyBwcmVzZW50LA0KLWl0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QsIG1ldGhvZCwgb3IgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IEludGVybmV0DQotRXhwbG9yZXIgVmVyc2lvbiA1LjAgb3IgaGlnaGVyLiAgSWYgdGhlIE5ldHNjYXBlIGljb24gaXMgcHJlc2VudCwgaXQgaW5kaWNhdGVzDQotdGhhdCB0aGUgb2JqZWN0LCBtZXRob2QsIG9yIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSBOZXRzY2FwZSBOYXZpZ2F0b3IgVmVyc2lvbg0KLTQuNyBvciBoaWdoZXIuIEEgcXVlc3Rpb24gbWFyayBpY29uICg8aW1hZ2UgYWx0PSJRdWVzdGlvbiBtYXJrIGljb24iIGhyZWY9Ii4uL2ltYWdlcy9ucXVlc3QuZ2lmIg0KLXBsYWNlbWVudD0iaW5saW5lIj48L2ltYWdlPikgaW4gcGxhY2Ugb2Ygb25lIG9mIHRoZSBicm93c2VyIGljb25zIGluZGljYXRlcw0KLXRoYXQgaXQgaXMgdW5rbm93biB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBvYmplY3QsIG1ldGhvZCwgb3IgZnVuY3Rpb24uPC9wPjxwPlRoZQ0KLXBpY3R1cmUgYmVsb3cgc2hvd3MgdGhlIGRlZmF1bHQgY29udGVudCBhc3Npc3QgbGlzdCB3aXRoaW4gYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBmaWxlOjxpbWFnZQ0KLWFsdD0iSmF2YVNjcmlwdCBjb250ZW50IGFzc2lzdCIgaHJlZj0iLi4vaW1hZ2VzL25qc2NkYXN0LmdpZiIgcGxhY2VtZW50PSJicmVhayI+DQotPC9pbWFnZT48L3A+PHA+Q29kZSBwcm9wb3NhbHMgYXJlIGxpc3RlZCBhbHBoYWJldGljYWxseS4gSWYgeW91IHR5cGUgYSA8Y29kZXBoPi4gPC9jb2RlcGg+IChpbmNsdWRlDQotdGhlIHNwYWNlKSBiZWZvcmUgcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGJlZ2luIHR5cGluZyB0aGUgZmlyc3QNCi1vbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIGNvZGUgdGhhdCB5b3Ugd2FudCB0byBhZGQsIHRoZSBwcm9wb3NhbCBsaXN0IGF1dG9tYXRpY2FsbHkNCi1yZWZyZXNoZXMgdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZCwgdG8gcmVkdWNlDQotKHNvbWV3aGF0KSB0aGUgYW1vdW50IG9mIHNjcm9sbGluZyB0byBsb2NhdGUgdGhlIGRlc2lyZWQgY29kZS48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5KU1AgY29udGVudCBhc3Npc3Q8L3RpdGxlPjxwPllvdSBoYXZlIG1hbnkgb3B0aW9ucyBmb3IgZW1iZWRkaW5nIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGFuZA0KLUhUTUwgY29kZSBpbiB5b3VyIEpTUCBwYWdlcyBieSB1c2luZyBjb250ZW50IGFzc2lzdC48L3A+PHA+QWxsIG9mIHRoZSBKU1ANCi10YWdzIGFyZSBpbmNsdWRlZCBib3RoIGluIHRoZSB0ZW1wbGF0ZSBsaXN0IGFuZCBpbiBYTUwgZm9ybWF0IChmb3IgZXhhbXBsZSwgPGNvZGVwaD4mbHQ7anNwOmV4cHJlc3Npb24+PC9jb2RlcGg+KS4NCi1UbyBhZGQgSlNQIHNjcmlwdGxldCB0YWdzLCBmb3IgZXhhbXBsZSwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBhcHByb3ByaWF0ZQ0KLXBvc2l0aW9uIGluIHRoZSBmaWxlIGFuZCBwcmVzcyBDdHJsK1NwYWNlIHRvIHVzZSBjb250ZW50IGFzc2lzdC4gU2VsZWN0IDxpbWFnZQ0KLWFsdD0iSlNQIHNjcmlwdGxldCBjb250ZW50IGFzc2lzdCIgaHJlZj0iLi4vaW1hZ2VzL25tYWNzY3JwLmdpZiIgcGxhY2VtZW50PSJpbmxpbmUiPg0KLTwvaW1hZ2U+IGZyb20gdGhlIHByb3Bvc2FsIGxpc3QgdG8gaW5zZXJ0IDxjb2RlcGg+Jmx0OyUgJT48L2NvZGVwaD4gIGluIHRoZQ0KLWRvY3VtZW50LjwvcD48cD5TY3JpcHRsZXRzIGFyZSBpbnNlcnRlZCBpbiBhIHRhZyA8Y29kZXBoPiZsdDslICU+PC9jb2RlcGg+Lg0KLUZvciBleGFtcGxlOiA8Y29kZWJsb2NrPiZsdDslIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICU+PC9jb2RlYmxvY2s+PC9wPjxwPlRoaXMNCi1leGFtcGxlIHdpbGwgZXZhbHVhdGUgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHN0YXRlbWVudCB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBpbg0KLW1pbGxpc2Vjb25kcy48L3A+PHA+VG8gaGF2ZSB0aGUgcmVzdWx0IG9mIHRoZSBzdGF0ZW1lbnQgaW5zZXJ0ZWQgaW4gdGhlIGZpbGUsDQotcHV0IGFuIGVxdWFscyBzaWduICg9KSBpbiB0aGUgZnJvbnQgb2YgdGhlIHN0YXRlbWVudC4gRm9yIGV4YW1wbGU6IDxjb2RlYmxvY2s+Jmx0O2I+VGhpcyBpcyB0aGUgdGltZSA6ICZsdDslPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSU+Jmx0Oy9iPjwvY29kZWJsb2NrDQotPjwvcD48cD5XaGVuIHlvdSBhcmUgd2l0aGluIGEgc2NyaXB0bGV0IHlvdSBhcmUgd3JpdGluZyBwdXJlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvZGUuDQotVGhlcmVmb3JlLCBjb250ZW50IGFzc2lzdCB3b3JrcyBleGFjdGx5IHRoZSBzYW1lIGFzIGl0IGRvZXMgZm9yIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBlZGl0b3IuDQotRm9yIGV4YW1wbGUsIGlmIHlvdSByZXF1ZXN0IGNvbnRlbnQgYXNzaXN0IGFmdGVyIDxjb2RlcGg+U3lzdGVtPC9jb2RlcGg+LA0KLWNvbnRlbnQgYXNzaXN0IGRpc3BsYXlzIGEgbGlzdCBvZiBtZXRob2RzLiA8bm90ZT48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb250ZW50IGFzc2lzdCB3b3JrcyBvbmx5IGluIGEgV2ViDQotcHJvamVjdCwgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGJ1aWxkcGF0aCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGFzc2VzLjwvbm90ZT48L3A+PHA+VGhlcmUNCi1hcmUgYWxzbyBzcGVjaWFsIHRhZ3Mgc3VjaCBhcyB1c2VCZWFuLiBGb3IgZXhhbXBsZTogPGNvZGVibG9jaz4mbHQ7anNwOnVzZUJlYW4gaWQ9InVzZUJlYW4iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+PC9jb2RlYmxvY2s+PC9wPjxwPlRoZQ0KLXVzZUJlYW4gdGFnIGVuYWJsZXMgeW91IHRvIGNyZWF0ZSBhIGJlYW4gY2FsbGVkIDxjb2RlcGg+YVN0cmluZzwvY29kZXBoPiBvZg0KLXR5cGUgPGNvZGVwaD5TdHJpbmc8L2NvZGVwaD4uIFRoZW4gd2hlbiB5b3UgdXNlIGNvbnRlbnQgYXNzaXN0LCB0aGlzIGlzIHJlY29nbml6ZWQNCi1hcyBhIGRlY2xhcmVkIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlciA8Y29kZXBoPmFTdHJpbmc8L2NvZGVwaD4sDQotYXMgZm9sbG93czo8L3A+PHA+IDxjb2RlYmxvY2s+Jmx0OyUgYVN0cmluZy4gJT4gPC9jb2RlYmxvY2s+dGhlIGNvbnRlbnQgYXNzaXN0DQotbGlzdCBzaG93cyBhdmFpbGFibGUgbWV0aG9kcy4gVGhpcyBpcyBiZWNhdXNlIDxjb2RlcGg+YVN0cmluZzwvY29kZXBoPiBoYXMNCi1iZWVuIGRlY2xhcmVkIGFzIGEgYmVhbiBvZiB0eXBlIFN0cmluZy48L3A+PHA+SWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlcg0KLXRoZSA8Y29kZXBoPmE8L2NvZGVwaD4sIGFzIGZvbGxvd3M6IDxjb2RlYmxvY2s+Jmx0OyUgYSAlPiA8L2NvZGVibG9jaz5jb250ZW50DQotYXNzaXN0IGtub3dzIHRoYXQgPGNvZGVwaD5hU3RyaW5nPC9jb2RlcGg+IGV4aXN0cywgYW5kIGl0IGlzIHNob3duIGluIHRoZQ0KLWNvbnRlbnQgYXNzaXN0IGxpc3QuPC9wPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiPjxsaW5rdGV4dD5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjA4ZDc3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+Q29udGVudCBhc3Npc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDYiPjxhIG5hbWU9ImNzcmNlZHQwMDYiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db250ZW50IGFzc2lzdDwvaDE+Ci08ZGl2PjxwPkNvbnRlbnQgYXNzaXN0IChDdHJsK1NwYWNlYmFyKSAgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IKLWZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvcgotaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMKLWZvciBjb21wbGV0aW9uLjwvcD48cD5Nb3N0IG9mIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBoYXZlIGNvbnRlbnQgYXNzaXN0LiBGb3IgYSBsaXN0IG9mCi1lZGl0b3JzIHRoYXQgaGF2ZSBjb250ZW50IGFzc2lzdCwgc2VlIDxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCI+U3RydWN0dXJlZAotdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC9hPi4gRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZXQgY29udGVudAotYXNzaXN0YW5jZSwgc2VlIDxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UKLWluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9hPjwvcD4KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSBzcGVjaWZpY3Mgb2YgSFRNTCBjb250ZW50IGFzc2lzdCwgSmF2YVNjcmlwdJkgY29udGVudAotYXNzaXN0LCBhbmQgSlNQIGNvbnRlbnQgYXNzaXN0LjwvcD4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkhUTUwgY29udGVudCBhc3Npc3Q8L2g0PjxwPkhUTUwgaXMgZmxleGlibGUgaW4gdGhhdCBzb21lCi1IVE1MIGVsZW1lbnRzIGFsbG93IGVuZCB0YWdzIHRvIGJlIG9wdGlvbmFsbHkgb21pdHRlZCwgc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj5QPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+RFQ8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5ERDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkxJPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VEhFQUQ8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5UUjwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlREPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VEg8L3NhbXA+LAotYW5kIHNvIG9uLiBPdGhlciBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgdG8gaGF2ZSBubyBjb250ZW50IG1heSByZXF1aXJlCi10aGUgZW5kIHRhZyBhbHdheXMgYmUgb21pdHRlZCwgc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj5CUjwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkhSPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+TElOSzwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPk1FVEE8L3NhbXA+LAotYW5kIDxzYW1wIGNsYXNzPSJjb2RlcGgiPklNRzwvc2FtcD4uIFRoaXMgZmxleGliaWxpdHkgbWFrZXMgdGhlIGNvbnRlbnQgYXNzaXN0IGZ1bmN0aW9uCi13aXRoaW4gdGhlIEhUTUwgc291cmNlIHBhZ2UgZWRpdG9yIGxlc3MgcHJlY2lzZSB0aGFuIGl0IG1pZ2h0IGJlIHdpdGggYSBtb3JlCi1yaWdpZGx5IGNvbnN0cmFpbmVkIG1hcmt1cCBsYW5ndWFnZS48L3A+Ci08cD5IVE1MIGNvbnRlbnQgYXNzaXN0IGlzIG1vc3QgYmVuZWZpY2lhbAotd2hlbiB5b3UgbmVlZCB0byBjb21wbGV0ZSBhIHRhZyBuYW1lLCBhZGQgYW4gYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciB3aXRoaW4KLWEgc3RhcnQgdGFnLCBvciBzZWxlY3QgZnJvbSBhbiBlbnVtZXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlIHZhbHVlcy48L3A+Ci08cD5BbHRob3VnaAotY29udGVudCBhc3Npc3Qgb25seSBzaG93cyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkCi1pbiBhIHN0YXJ0IHRhZywgaXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgZ3JhbW1hciBjb25zdHJhaW50cyBmb3IgdGFncy4KLUZvciBleGFtcGxlLCB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SEVBRDwvc2FtcD4gZWxlbWVudCBpbiBIVE1MIG9ubHkgcGVybWl0cyB6ZXJvIG9yCi1vbmUgb2NjdXJyZW5jZXMgb2YgYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5USVRMRTwvc2FtcD4gdGFnIGluIGl0cyBjb250ZW50LiBJZiB5b3UgcHJvbXB0Ci1mb3IgY29udGVudCBhc3Npc3Qgd2l0aGluIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SEVBRDwvc2FtcD4gY29udGVudCB0aGF0IGFscmVhZHkgY29udGFpbnMKLWEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VElUTEU8L3NhbXA+IHRhZywgY29udGVudCBhc3Npc3Qgd2lsbCBzdGlsbCBzaG93IDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRJVExFPC9zYW1wPiBpbgotaXRzIHByb3Bvc2FsIGxpc3QuPC9wPgotPHA+SG93ZXZlciwgaWYgYW4gYXR0cmlidXRlIGlzIHJlcXVpcmVkIGFjY29yZGluZyB0bwotdGhlIERURC9TY2hlbWEsIHRoYXQgYXR0cmlidXRlIHdpbGwgc2hvdyB1cCBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0LCB3aXRoIGEKLXllbGxvdyBjaXJjbGUgaW5kaWNhdG9yIG9uIGl0cyBpY29uLjwvcD4KLTxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24KLXdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcyBpcyBkaXNwbGF5ZWQuCi1UaGUgbGlzdCBpcyBiYXNlZCBvbiB0aGUgY29udGV4dC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgZGlyZWN0bHkKLWFmdGVyIGFuIG9wZW5pbmcgcGFyYWdyYXBoIHRhZyAoPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O3AmZ3Q7PC9zYW1wPikgLCB0aGUgZmlyc3QgaXRlbQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3Qgd2lsbCBiZSB0aGUgY29ycmVzcG9uZGluZyBjbG9zaW5nIHBhcmFncmFwaCAoPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Oy9wJmd0Ozwvc2FtcD4pCi10YWcuPC9wPgotPHA+VGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgZGlzcGxheXMgYWxsIGF2YWlsYWJsZSB0YWdzIGZvciB0aGUgY3VycmVudAotY3Vyc29yIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGVtcGxhdGVzLiBUaGUgcGljdHVyZSBiZWxvdyBzaG93cyB0aGUgZGVmYXVsdAotY29udGVudCBhc3Npc3QgbGlzdCBmb3IgYSBwYXJhZ3JhcGggdGFnIGV4YW1wbGU6PGJyIC8+PGltZyBzcmM9Ii4uL2ltYWdlcy9uY29udGFzcy5naWYiIGFsdD0iSFRNTCBDb250ZW50IGFzc2lzdCIgLz48YnIgLz48L3A+Ci08cD5UYWcgcHJvcG9zYWxzIGFyZSBsaXN0ZWQKLWFscGhhYmV0aWNhbGx5LiBJZiB5b3UgdHlwZSBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDs8L3NhbXA+ICh0byBiZWdpbiBhIG5ldyB0YWcpIGJlZm9yZQotcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGJlZ2luIHR5cGluZyB0aGUgZmlyc3Qgb25lIG9yIHR3byBsZXR0ZXJzCi1vZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gYWRkLCB0aGUgcHJvcG9zYWwgbGlzdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlcwotdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZC4gSWYgeW91IGRvIG5vdAotdHlwZSBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDs8L3NhbXA+IGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCB5b3UgY2FuCi1jbGljayB3aXRoaW4gdGhlIHByb3Bvc2FsIGxpc3QgYW5kIHRoZW4gdHlwZSB0aGUgbGV0dGVyIHRoYXQgdGhlIHRhZyBiZWdpbnMKLXdpdGgsIHRvIHJlZHVjZSAoc29tZXdoYXQpIHRoZSBhbW91bnQgb2Ygc2Nyb2xsaW5nIHRvIGxvY2F0ZSB0aGUgZGVzaXJlZCB0YWcuPC9wPgotPHA+QXMKLXlvdSB0eXBlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lcyBvciBlbnVtZXJhdGVkCi1hdHRyaWJ1dGUgdmFsdWVzIHRoYXQgeW91IHdhbnQgdG8gYWRkIHRvIGEgdGFnLCB0aGUgbGlzdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlcwotdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZC48L3A+Ci08ZGl2IGNsYXNzPSJyZXN0cmljdGlvbiI+PHNwYW4gY2xhc3M9InJlc3RyaWN0aW9udGl0bGUiPlJlc3RyaWN0aW9uOiA8L3NwYW4+PGltZyBzcmM9Ii4uL2ltYWdlcy9ubGludXguZ2lmIiBhbHQ9IkZvciBMaW51eC4iIC8+IFdoZW4gdXNpbmcgTGludXggKE1vdGlmIG9yCi1HVEspIGFuZCBhIERCQ1MgbG9jYWxlLCBkb3VibGUtY2xpY2tpbmcgb24gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgY2FuIHNvbWV0aW1lcwotY2F1c2UgdGhlIEphdmGZIFZNIHRvIHRlcm1pbmF0ZS4gSW5zdGVhZCBvZiBkb3VibGUtY2xpY2tpbmcgb24KLXRoZSBsaXN0LCB1c2UgdGhlIGFycm93cyBhbmQgRW50ZXIga2V5cyB0byBtYWtlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgbGlzdC48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SmF2YVNjcmlwdCBjb250ZW50IGFzc2lzdDwvaDQ+PHA+SXRlbXMKLWluIHRoZSBKYXZhU2NyaXB0IGNvbnRlbnQgYXNzaXN0IGxpc3QgYXJlIHByZWNlZGVkIGJ5IGFuIEludGVybmV0Ci1FeHBsb3JlciBpY29uLCBhIE5ldHNjYXBlIGljb24sIG9yIGJvdGgsIHRvIGluZGljYXRlIHdoZXRoZXIgc3BlY2lmaWMgSmF2YVNjcmlwdCBvYmplY3RzLAotbWV0aG9kcywgb3IgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIGJvdGggYnJvd3NlcnMuIElmIHRoZSBJbnRlcm5ldAotRXhwbG9yZXIgaWNvbiBpcyBwcmVzZW50LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0LCBtZXRob2QsIG9yIGZ1bmN0aW9uCi1pcyBzdXBwb3J0ZWQgYnkgSW50ZXJuZXQgRXhwbG9yZXIgVmVyc2lvbiA1LjAgb3IgaGlnaGVyLiAgSWYgdGhlIE5ldHNjYXBlCi1pY29uIGlzIHByZXNlbnQsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QsIG1ldGhvZCwgb3IgZnVuY3Rpb24gaXMgc3VwcG9ydGVkCi1ieSBOZXRzY2FwZSBOYXZpZ2F0b3IgVmVyc2lvbiA0Ljcgb3IgaGlnaGVyLiBBIHF1ZXN0aW9uIG1hcmsgaWNvbiAoPGltZyBzcmM9Ii4uL2ltYWdlcy9ucXVlc3QuZ2lmIiBhbHQ9IlF1ZXN0aW9uIG1hcmsgaWNvbiIgLz4pCi1pbiBwbGFjZSBvZiBvbmUgb2YgdGhlIGJyb3dzZXIgaWNvbnMgaW5kaWNhdGVzIHRoYXQgaXQgaXMgdW5rbm93biB3aGV0aGVyCi10aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgb2JqZWN0LCBtZXRob2QsIG9yIGZ1bmN0aW9uLjwvcD4KLTxwPlRoZSBwaWN0dXJlIGJlbG93Ci1zaG93cyB0aGUgZGVmYXVsdCBjb250ZW50IGFzc2lzdCBsaXN0IHdpdGhpbiBhIEphdmFTY3JpcHQgZmlsZTo8YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL25qc2NkYXN0LmdpZiIgYWx0PSJKYXZhU2NyaXB0IGNvbnRlbnQgYXNzaXN0IiAvPjxiciAvPjwvcD4KLTxwPkNvZGUKLXByb3Bvc2FscyBhcmUgbGlzdGVkIGFscGhhYmV0aWNhbGx5LiBJZiB5b3UgdHlwZSBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi4gPC9zYW1wPiAoaW5jbHVkZQotdGhlIHNwYWNlKSBiZWZvcmUgcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGJlZ2luIHR5cGluZyB0aGUgZmlyc3QKLW9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUgY29kZSB0aGF0IHlvdSB3YW50IHRvIGFkZCwgdGhlIHByb3Bvc2FsIGxpc3QgYXV0b21hdGljYWxseQotcmVmcmVzaGVzIHRvIHJlZmxlY3QgcHJvcG9zYWxzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4geW91IGhhdmUgdHlwZWQsIHRvIHJlZHVjZQotKHNvbWV3aGF0KSB0aGUgYW1vdW50IG9mIHNjcm9sbGluZyB0byBsb2NhdGUgdGhlIGRlc2lyZWQgY29kZS48L3A+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkpTUCBjb250ZW50IGFzc2lzdDwvaDQ+PHA+WW91IGhhdmUgbWFueSBvcHRpb25zIGZvciBlbWJlZGRpbmcgSmF2YSBhbmQKLUhUTUwgY29kZSBpbiB5b3VyIEpTUCBwYWdlcyBieSB1c2luZyBjb250ZW50IGFzc2lzdC48L3A+Ci08cD5BbGwgb2YgdGhlIEpTUAotdGFncyBhcmUgaW5jbHVkZWQgYm90aCBpbiB0aGUgdGVtcGxhdGUgbGlzdCBhbmQgaW4gWE1MIGZvcm1hdCAoZm9yIGV4YW1wbGUsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtqc3A6ZXhwcmVzc2lvbiZndDs8L3NhbXA+KS4KLVRvIGFkZCBKU1Agc2NyaXB0bGV0IHRhZ3MsIGZvciBleGFtcGxlLCBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGFwcHJvcHJpYXRlCi1wb3NpdGlvbiBpbiB0aGUgZmlsZSBhbmQgcHJlc3MgQ3RybCtTcGFjZSB0byB1c2UgY29udGVudCBhc3Npc3QuIFNlbGVjdCA8aW1nIHNyYz0iLi4vaW1hZ2VzL25tYWNzY3JwLmdpZiIgYWx0PSJKU1Agc2NyaXB0bGV0IGNvbnRlbnQgYXNzaXN0IiAvPiBmcm9tCi10aGUgcHJvcG9zYWwgbGlzdCB0byBpbnNlcnQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyUgJSZndDs8L3NhbXA+ICBpbiB0aGUgZG9jdW1lbnQuPC9wPgotPGRpdiBjbGFzcz0icCI+U2NyaXB0bGV0cwotYXJlIGluc2VydGVkIGluIGEgdGFnIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDslICUmZ3Q7PC9zYW1wPi4gRm9yIGV4YW1wbGU6IDxwcmU+Jmx0OyUgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJSZndDs8L3ByZT4KLTwvZGl2PgotPHA+VGhpcwotZXhhbXBsZSB3aWxsIGV2YWx1YXRlIHRoZSBKYXZhIHN0YXRlbWVudCB0byBnZXQgdGhlIGN1cnJlbnQgdGltZQotaW4gbWlsbGlzZWNvbmRzLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRvIGhhdmUgdGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IGluc2VydGVkIGluIHRoZQotZmlsZSwgcHV0IGFuIGVxdWFscyBzaWduICg9KSBpbiB0aGUgZnJvbnQgb2YgdGhlIHN0YXRlbWVudC4gRm9yIGV4YW1wbGU6IDxwcmU+Jmx0O2ImZ3Q7VGhpcyBpcyB0aGUgdGltZSA6ICZsdDslPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSUmZ3Q7Jmx0Oy9iJmd0OzwvcHJlPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5XaGVuIHlvdSBhcmUgd2l0aGluIGEgc2NyaXB0bGV0IHlvdSBhcmUgd3JpdGluZyBwdXJlIEphdmEgY29kZS4KLVRoZXJlZm9yZSwgY29udGVudCBhc3Npc3Qgd29ya3MgZXhhY3RseSB0aGUgc2FtZSBhcyBpdCBkb2VzIGZvciB0aGUgSmF2YSBlZGl0b3IuCi1Gb3IgZXhhbXBsZSwgaWYgeW91IHJlcXVlc3QgY29udGVudCBhc3Npc3QgYWZ0ZXIgPHNhbXAgY2xhc3M9ImNvZGVwaCI+U3lzdGVtPC9zYW1wPiwKLWNvbnRlbnQgYXNzaXN0IGRpc3BsYXlzIGEgbGlzdCBvZiBtZXRob2RzLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOiA8L3NwYW4+SmF2YSBjb250ZW50IGFzc2lzdCB3b3JrcyBvbmx5IGluIGEgV2ViCi1wcm9qZWN0LCBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgYnVpbGRwYXRoIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIEphdmEgY2xhc3Nlcy48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+VGhlcmUKLWFyZSBhbHNvIHNwZWNpYWwgdGFncyBzdWNoIGFzIHVzZUJlYW4uIEZvciBleGFtcGxlOiA8cHJlPiZsdDtqc3A6dXNlQmVhbiBpZD0idXNlQmVhbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLyZndDs8L3ByZT4KLTwvZGl2PgotPHA+VGhlCi11c2VCZWFuIHRhZyBlbmFibGVzIHlvdSB0byBjcmVhdGUgYSBiZWFuIGNhbGxlZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiBvZgotdHlwZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5TdHJpbmc8L3NhbXA+LiBUaGVuIHdoZW4geW91IHVzZSBjb250ZW50IGFzc2lzdCwgdGhpcyBpcyByZWNvZ25pemVkCi1hcyBhIGRlY2xhcmVkIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlciA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiwKLWFzIGZvbGxvd3M6PC9wPgotPGRpdiBjbGFzcz0icCI+IDxwcmU+Jmx0OyUgYVN0cmluZy4gJSZndDsgPC9wcmU+Ci10aGUgY29udGVudCBhc3Npc3QKLWxpc3Qgc2hvd3MgYXZhaWxhYmxlIG1ldGhvZHMuIFRoaXMgaXMgYmVjYXVzZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiBoYXMKLWJlZW4gZGVjbGFyZWQgYXMgYSBiZWFuIG9mIHR5cGUgU3RyaW5nLjwvZGl2PgotPGRpdiBjbGFzcz0icCI+SWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlcgotdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmE8L3NhbXA+LCBhcyBmb2xsb3dzOiA8cHJlPiZsdDslIGEgJSZndDsgPC9wcmU+Ci1jb250ZW50Ci1hc3Npc3Qga25vd3MgdGhhdCA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiBleGlzdHMsIGFuZCBpdCBpcyBzaG93biBpbiB0aGUKLWNvbnRlbnQgYXNzaXN0IGxpc3QuPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48cD48YiBjbGFzcz0icmVsY29uY2VwdHNoZCI+UmVsYXRlZCBjb25jZXB0czwvYj48YnIgLz4KLTxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PGJyIC8+Ci08L3A+Ci08cD48YiBjbGFzcz0icmVsdGFza3NoZCI+UmVsYXRlZCB0YXNrczwvYj48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCIgdGl0bGU9IlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjxiciAvPgotPC9wPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOTI4N2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gIi4uXGR0ZFxjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNzcmNlZHQwMDEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbjwvdGl0bGU+DQotPHNob3J0ZGVzYz48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT52YWxpZGF0aW9uPGluZGV4dGVybT5zb3VyY2UgdnMgYmF0Y2g8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiB2YWxpZGF0aW9uIHRoYXQgY2FuIG9jY3VyIHdoZW4geW91IGFyZSB3b3JraW5nIHdpdGgNCi1zb3VyY2UgZmlsZXMgaW4gYSBzdHJ1Y3R1cmVkIHNvdXJjZSBlZGl0b3I6IHNvdXJjZSB2YWxpZGF0aW9uIGFuZCBiYXRjaCB2YWxpZGF0aW9uLiA8L3A+DQotPHA+U291cmNlIHZhbGlkYXRpb24gb2NjdXJzIGFzIHlvdSB0eXBlIHlvdXIgY29kZTsgdGhpcyB2YWxpZGF0aW9uIHJlZmxlY3RzDQotdGhlICJ1bnNhdmVkIiBhbmQgInVuYnVpbHQiIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgeW91IGFyZSBlZGl0aW5nLiBGb3IgZXhhbXBsZSwNCi1pZiB5b3Ugd2VyZSB0byB0eXBlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIEpTUCBlZGl0b3I6PGxpbmVzPjxjb2RlcGg+Jmx0O2ZvbzpiYXI+PC9jb2RlcGg+PC9saW5lcz53aGVyZSA8Y29kZXBoPmZvbzpiYXI8L2NvZGVwaD5pcw0KLWEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9ibGVtIHdvdWxkIGJlIGRpc2NvdmVyZWQgaW1tZWRpYXRlbHkgYW5kDQotd291bGQgYXBwZWFyIHVuZGVybGluZWQgaW4gdGhlIGVkaXRvci4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbg0KLWlzIHRoYXQgaXQgY2FuIGFsZXJ0IHlvdSB0byBlcnJvcnMgaW5zdGFudGx5Ljxub3RlPlRvIHR1cm4gc291cmNlIHZhbGlkYXRpb24NCi1vbiAob3Igb2ZmKSBmb3IgYWxsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjaGVjayAob3INCi11bmNoZWNrKSA8Yj5SZXBvcnQgcHJvYmxlbXMgYXMgeW91IHR5cGU8L2I+Ljwvbm90ZT48L3A+DQotPHA+QmF0Y2ggdmFsaWRhdGlvbiBvY2N1cnMgb24gc2F2ZWQgZmlsZXMuIEl0IGNhbiBjYXRjaCBidWlsZCBwcm9jZXNzIGVycm9ycw0KLWFuZCBvdGhlciBlcnJvcnMgdGhhdCB0aGUgc291cmNlIHZhbGlkYXRvciBjYW5ub3QuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdQ0KLXR5cGVkIHRoZSBmb2xsb3dpbmcgaW4gYSBKU1AgZWRpdG9yOjxsaW5lcz4NCi08Y29kZXBoPiZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4NCi0mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+PC9jb2RlcGg+PC9saW5lcz5Jbg0KLXRoaXMgZXhhbXBsZSwgdGhlIHNhbWUgcHJlZml4IGlzIHVzZWQgdHdpY2UuIFRoaXMgd291bGQgcHJvbXB0IHRoZSBiYXRjaCB2YWxpZGF0b3INCi10byB0cmlnZ2VyIG1hcmtlcnMgYW5kIHRvIGdlbmVyYXRlIGJ1aWxkIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyB2aWV3IGFuZA0KLWluIHRoZSBOYXZpZ2F0b3IuIDwvcD4NCi08cD5CYXRjaCB2YWxpZGF0aW9uIGNhbiB1bmNvdmVyIGVycm9ycyBpbiBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlIGFuZCBnaXZlDQoteW91IGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHdoZXJlIHByb2JsZW1hdGljIGNvZGUgY2FuIGJlIGZvdW5kIGluIHlvdXIgcHJvamVjdC4NCi1Nb3Jlb3ZlciwgeW91IGRvIG5vdCBuZWVkIHRvIG9wZW4gZmlsZXMgaW4gYW4gZWRpdG9yIHRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uLg0KLVRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uIG9uIHNwZWNpZmljIGZpbGVzLCBzZWxlY3QgYW5kIHJpZ2h0IGNsaWNrIHRoZSBmaWxlcw0KLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5SdW4gVmFsaWRhdGlvbjwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGZyb20gdGhlIHBvcHVwIG1lbnUuPC9wPg0KLTxub3RlPlRvIHNldCBwcmVmZXJlbmNlcyBmb3IgYmF0Y2ggdmFsaWRhdGlvbiwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9ub3RlPg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmZTBmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5Tb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDEiPjxhIG5hbWU9ImNzcmNlZHQwMDEiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uPC9oMT4KLTxkaXY+PHA+PC9wPgotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiB2YWxpZGF0aW9uIHRoYXQgY2FuIG9jY3VyIHdoZW4geW91IGFyZSB3b3JraW5nIHdpdGgKLXNvdXJjZSBmaWxlcyBpbiBhIHN0cnVjdHVyZWQgc291cmNlIGVkaXRvcjogc291cmNlIHZhbGlkYXRpb24gYW5kIGJhdGNoIHZhbGlkYXRpb24uIDwvcD4KLTxkaXYgY2xhc3M9InAiPlNvdXJjZSB2YWxpZGF0aW9uIG9jY3VycyBhcyB5b3UgdHlwZSB5b3VyIGNvZGU7IHRoaXMgdmFsaWRhdGlvbiByZWZsZWN0cwotdGhlICJ1bnNhdmVkIiBhbmQgInVuYnVpbHQiIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgeW91IGFyZSBlZGl0aW5nLiBGb3IgZXhhbXBsZSwKLWlmIHlvdSB3ZXJlIHRvIHR5cGUgdGhlIGZvbGxvd2luZyBjb2RlIGluIGEgSlNQIGVkaXRvcjo8cD48c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7Zm9vOmJhciZndDs8L3NhbXA+PC9wPgotd2hlcmUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Zm9vOmJhcjwvc2FtcD5pcwotYSB0YWcgdGhhdCBkb2VzIG5vdCBleGlzdCwgdGhlIHByb2JsZW0gd291bGQgYmUgZGlzY292ZXJlZCBpbW1lZGlhdGVseSBhbmQKLXdvdWxkIGFwcGVhciB1bmRlcmxpbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24KLWlzIHRoYXQgaXQgY2FuIGFsZXJ0IHlvdSB0byBlcnJvcnMgaW5zdGFudGx5LjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUbyB0dXJuIHNvdXJjZSB2YWxpZGF0aW9uCi1vbiAob3Igb2ZmKSBmb3IgYWxsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcnM8L3NwYW4+PC9zcGFuPiBhbmQgY2hlY2sgKG9yCi11bmNoZWNrKSA8c3Ryb25nPlJlcG9ydCBwcm9ibGVtcyBhcyB5b3UgdHlwZTwvc3Ryb25nPi48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+QmF0Y2ggdmFsaWRhdGlvbiBvY2N1cnMgb24gc2F2ZWQgZmlsZXMuIEl0IGNhbiBjYXRjaCBidWlsZCBwcm9jZXNzIGVycm9ycwotYW5kIG90aGVyIGVycm9ycyB0aGF0IHRoZSBzb3VyY2UgdmFsaWRhdG9yIGNhbm5vdC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91Ci10eXBlZCB0aGUgZm9sbG93aW5nIGluIGEgSlNQIGVkaXRvcjo8cD48c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiUmZ3Q7PGJyIC8+Ci0mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiUmZ3Q7PC9zYW1wPjwvcD4KLUluCi10aGlzIGV4YW1wbGUsIHRoZSBzYW1lIHByZWZpeCBpcyB1c2VkIHR3aWNlLiBUaGlzIHdvdWxkIHByb21wdCB0aGUgYmF0Y2ggdmFsaWRhdG9yCi10byB0cmlnZ2VyIG1hcmtlcnMgYW5kIHRvIGdlbmVyYXRlIGJ1aWxkIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyB2aWV3IGFuZAotaW4gdGhlIE5hdmlnYXRvci4gPC9kaXY+Ci08cD5CYXRjaCB2YWxpZGF0aW9uIGNhbiB1bmNvdmVyIGVycm9ycyBpbiBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlIGFuZCBnaXZlCi15b3UgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2Ygd2hlcmUgcHJvYmxlbWF0aWMgY29kZSBjYW4gYmUgZm91bmQgaW4geW91ciBwcm9qZWN0LgotTW9yZW92ZXIsIHlvdSBkbyBub3QgbmVlZCB0byBvcGVuIGZpbGVzIGluIGFuIGVkaXRvciB0byBydW4gYmF0Y2ggdmFsaWRhdGlvbi4KLVRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uIG9uIHNwZWNpZmljIGZpbGVzLCBzZWxlY3QgYW5kIHJpZ2h0IGNsaWNrIHRoZSBmaWxlcwotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIFZhbGlkYXRpb248L3NwYW4+PC9zcGFuPiBmcm9tIHRoZSBwb3B1cCBtZW51LjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUbyBzZXQgcHJlZmVyZW5jZXMgZm9yIGJhdGNoIHZhbGlkYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+PC9zcGFuPjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWMzNWE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y29udGVudHR5cGUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmZpbGUgdHlwZXM8aW5kZXh0ZXJtPmVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmNvbnRlbnQgdHlwZTxpbmRleHRlcm0+bWFwcGluZyBmaWxlIGV4dGVuc2lvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmZpbGUgZXh0ZW5zaW9uczxpbmRleHRlcm0+bWFwcGluZyBjb250ZW50IHR5cGU8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gYXNzb2NpYXRlIGNlcnRhaW4gZWRpdG9ycyB3aXRoIGEgZmlsZSB0eXBlIGJ5IGNsaWNraW5nDQotb24gPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsZQ0KLUFzc29jaWF0aW9uPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNldHRpbmcgdXAgdGhlIGFzc29jaWF0aW9ucyBpbiB0aGUNCi1GaWxlIEFzc29jaWF0aW9ucyBXaW5kb3cuPC9wPjxwPlNvbWUgRWNsaXBzZS1iYXNlZCBlZGl0b3JzLCBob3dldmVyLCB3aWxsDQotb25seSByZWNvZ25pemUgYSBmaWxlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4gQ29uc2VxdWVudGx5LCBpZg0KLXlvdSB3YW50IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIGZpbGUgdHlwZSB3aXRoIHNvbWUgZWRpdG9ycywgeW91IG1heSBoYXZlDQotdG8gZmlyc3QgbWFwIHRoZSBjb250ZW50IHR5cGUgd2l0aCBpdHMgZmlsZSBleHRlbnNpb24uIFRvIG1hcCBhIGNvbnRlbnQgdHlwZQ0KLXdpdGggYSBmaWxlIGV4dGVuc2lvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPjxvbD4NCi08bGk+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Db250ZW50IFR5cGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIFRoZSBDb250ZW50IFR5cGUgd2luZG93DQotYXBwZWFycy4gPC9saT4NCi08bGk+U2VsZWN0IGEgY29udGVudCB0eXBlIGluIHRoZSBDb250ZW50IFR5cGUgd2luZG93LCBhbmQgdGhlbiBzZWxlY3QgPGI+QWRkPC9iPiAuDQotVGhlIERlZmluZSBhIE5ldyBGaWxlIFR5cGUgd2luZG93IGFwcGVhcnMuPC9saT4NCi08bGk+VHlwZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0eXBlLCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4uPC9saT4NCi08L29sPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5ZGYyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5Bc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNvbnRlbnR0eXBlIj48YSBuYW1lPSJ0Y29udGVudHR5cGUiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXM8L2gxPgotPGRpdj48cD48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGFzc29jaWF0ZSBjZXJ0YWluIGVkaXRvcnMgd2l0aCBhIGZpbGUgdHlwZSBieSBjbGlja2luZwotb24gPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUKLUFzc29jaWF0aW9uPC9zcGFuPjwvc3Bhbj4gYW5kIHNldHRpbmcgdXAgdGhlIGFzc29jaWF0aW9ucyBpbiB0aGUKLUZpbGUgQXNzb2NpYXRpb25zIFdpbmRvdy48L3A+Ci08cD5Tb21lIEVjbGlwc2UtYmFzZWQgZWRpdG9ycywgaG93ZXZlciwgd2lsbAotb25seSByZWNvZ25pemUgYSBmaWxlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4gQ29uc2VxdWVudGx5LCBpZgoteW91IHdhbnQgdG8gYXNzb2NpYXRlIGFuIGFkZGl0aW9uYWwgZmlsZSB0eXBlIHdpdGggc29tZSBlZGl0b3JzLCB5b3UgbWF5IGhhdmUKLXRvIGZpcnN0IG1hcCB0aGUgY29udGVudCB0eXBlIHdpdGggaXRzIGZpbGUgZXh0ZW5zaW9uLiBUbyBtYXAgYSBjb250ZW50IHR5cGUKLXdpdGggYSBmaWxlIGV4dGVuc2lvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPgotPG9sPjxsaT5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgVHlwZXM8L3NwYW4+PC9zcGFuPi4gVGhlIENvbnRlbnQgVHlwZSB3aW5kb3cKLWFwcGVhcnMuIDwvbGk+Ci08bGk+U2VsZWN0IGEgY29udGVudCB0eXBlIGluIHRoZSBDb250ZW50IFR5cGUgd2luZG93LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gLgotVGhlIERlZmluZSBhIE5ldyBGaWxlIFR5cGUgd2luZG93IGFwcGVhcnMuPC9saT4KLTxsaT5UeXBlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHR5cGUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjlhMGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDAwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5FZGl0aW5nIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSA8dGVybT5zdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3I8L3Rlcm0+LiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuDQotdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPm1hcmt1cCBsYW5ndWFnZXM8aW5kZXh0ZXJtPmVkaXRpbmc8L2luZGV4dGVybT48aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT5tYXJrdXAgbGFuZ3VhZ2UgZWRpdGluZzwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PkluIGFkZGl0aW9uIHRvIGJhc2ljIGVkaXRpbmcgdGFza3Mgc3VjaCBhcyBhZGRpbmcsIG1vZGlmeWluZywgYW5kDQotZGVsZXRpbmcgdGV4dCwgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDI1LmRpdGEiIHR5cGU9InRhc2siPlNldCBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yczwveHJlZj48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiIHR5cGU9InRhc2siPkdldCBjb250ZW50IGFzc2lzdGFuY2UNCi1pbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwveHJlZj48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDA3LmRpdGEiIHR5cGU9InRhc2siPlNlYXJjaCBvciBmaW5kIHRleHQgd2l0aGluDQotYSBmaWxlPC94cmVmPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPjx4cmVmIGhyZWY9InRzcmNlZHQwMTAuZGl0YSIgdHlwZT0idGFzayI+Q2hlY2sgc3BlbGxpbmc8L3hyZWY+PC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+PHhyZWYgaHJlZj0idHNyY2VkdDAyNy5kaXRhIiB0eXBlPSJ0YXNrIj5BZGQgb3IgcmVtb3ZlIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlczwveHJlZj48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiIHR5cGU9InRhc2siPkVkaXQgd2l0aCBzbmlwcGV0czwveHJlZj48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcy11bm9yZGVyZWQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDYuZGl0YSI+PGxpbmt0ZXh0PkNvbnRlbnQgYXNzaXN0PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjUuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDUuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDcuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTAuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjcuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTAyOWZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDAwIj48YSBuYW1lPSJ0c3JjZWR0MDAwIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIDxkZm4gY2xhc3M9InRlcm0iPnN0cnVjdHVyZWQKLXRleHQgZWRpdG9yPC9kZm4+LiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuCi11c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCBvciBYTUwuPC9wPjxkaXYgY2xhc3M9InNraXBzcGFjZSI+SW4gYWRkaXRpb24gdG8gYmFzaWMgZWRpdGluZyB0YXNrcyBzdWNoIGFzIGFkZGluZywgbW9kaWZ5aW5nLCBhbmQKLWRlbGV0aW5nIHRleHQsIHlvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvZGl2PgotPHVsPjxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDI1Lmh0bWwiPlNldCBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCI+R2V0IGNvbnRlbnQgYXNzaXN0YW5jZQotaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAwNy5odG1sIj5TZWFyY2ggb3IgZmluZCB0ZXh0IHdpdGhpbgotYSBmaWxlPC9hPjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMTAuaHRtbCI+Q2hlY2sgc3BlbGxpbmc8L2E+PC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIj5BZGQgb3IgcmVtb3ZlIG1hcmt1cCBsYW5ndWFnZQotdGVtcGxhdGVzPC9hPjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCI+RWRpdCB3aXRoIHNuaXBwZXRzPC9hPjwvc3Bhbj48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdj48cD48YiBjbGFzcz0icmVsY29uY2VwdHNoZCI+UmVsYXRlZCBjb25jZXB0czwvYj48YnIgLz4KLTxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48YnIgLz4KLTxhIGhyZWY9ImNzcmNlZHQwMDEuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBnaXZlcyBhbiBvdmVydmlldyBvZiB0aGUgU25pcHBldHMgdmlldy4iPlNuaXBwZXRzIHZpZXc8L2E+PGJyIC8+Ci08L3A+Ci08cD48YiBjbGFzcz0icmVsdGFza3NoZCI+UmVsYXRlZCB0YXNrczwvYj48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMjUuaHRtbCIgdGl0bGU9IiI+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDA3Lmh0bWwiIHRpdGxlPSIiPlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMTAuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iPkNoZWNraW5nIHNwZWxsaW5nPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWI4MzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgPHRlcm0+YW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvdGVybT4gZm9yDQotV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZQ0KLXN5bnRhY3RpYyB2YWxpZGl0eSBvZiB5b3VyIGZpbGUgd2hpbGUgeW91IGFyZSB0eXBpbmcgYW5kIHdoYXQgY29sb3JzIHRvIHVzZQ0KLXRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyDQotdGV4dC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5hbm5vdGF0aW9uIHByZWZlcmVuY2VzPGluZGV4dGVybT5tYXJrdXAgbGFuZ3VhZ2Ugc2V0dGluZ3M8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPm1hcmt1cCBsYW5ndWFnZXM8aW5kZXh0ZXJtPnNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkJ5IGRlZmF1bHQsIHdoZW4geW91IGVkaXQgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLCB5b3VyIHNvdXJjZQ0KLWNvZGUgaXMgdmFsaWRhdGVkIGFzIHlvdSB0eXBlIGl0IGluLiBMaWtlIG90aGVyIEVjbGlwc2UtYmFzZWQgZWRpdG9ycywgdGhlDQotc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMgZmxhZyB3YXJuaW5ncyBhbmQgZXJyb3JzIGluIHRoZQ0KLXNvdXJjZSBjb2RlIGluIHRoZSBlZGl0b3IgYXJlYS4gVGhlIHdhcm5pbmdzIGFuZCBlcnJvcnMgYWxzbyBzaG93IHVwIGluIHRoZQ0KLVRhc2tzIHZpZXcgd2hlbiB5b3Ugc2F2ZSB0aGUgZmlsZS48L3A+PG5vdGU+SGlnaGxpZ2h0aW5nIGlzIGZ1bGx5IGR5bmFtaWMNCi13aXRoIHRoZSBleGNlcHRpb24gb2Ygc2VhcmNoIHJlc3VsdHMuIFNlYXJjaCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBiYXNlZA0KLXVwb24gd2hhdCBoYXMgYmVlbiBzYXZlZCB0byBkaXNrLjwvbm90ZT48bm90ZSB0eXBlPSJ0aXAiPllvdSBjYW4gaW1wcm92ZSBhDQotc3RydWN0dXJlZCB0ZXh0IGVkaXRvcidzIHBlcmZvcm1hbmNlIGJ5IHR1cm5pbmcgb2ZmIHRoZSByZWFsLXRpbWUgdmFsaWRhdGlvbi48L25vdGU+PHA+VG8NCi1zZXQgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PHN0ZXByZXN1bHQ+QSBQcmVmZXJlbmNlcyB3aW5kb3cgYXBwZWFycy48L3N0ZXByZXN1bHQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByZWZlcmVuY2VzIHdpbmRvdywgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5UbyB0dXJuIG9mZiByZWFsLXRpbWUgc3ludGF4IHZhbGlkYXRpb24sIGNsaWNrIDx1aWNvbnRyb2w+U3RydWN0dXJlZA0KLVRleHQgRWRpdG9yPC91aWNvbnRyb2w+IGFuZCB1bmNoZWNrIHRoZSA8dWljb250cm9sPkFuYWx5emUgYW5ub3RhdGlvbnMgd2hpbGUNCi10eXBpbmc8L3VpY29udHJvbD4gYm94LjwvY2hvaWNlPg0KLTxjaG9pY2U+VG8gY29udHJvbCBvdGhlciBhbm5vdGF0aW9uIHNldHRpbmdzLCBjbGljayA8dWljb250cm9sPkFubm90YXRpb25zPC91aWNvbnRyb2w+IGFuZA0KLXNlbGVjdCB5b3VyIGFubm90YXRpb24gcHJlZmVyZW5jZXMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB5b3VyIHByZWZlcmVuY2VzIGFuZCBjbG9zZQ0KLXRoZSBwYWdlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI1LmRpdGEiPjxsaW5rdGV4dD5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjNiZDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwMSI+PGEgbmFtZT0idHNyY2VkdDAwMSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlczwvaDE+Ci08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIHNldCA8ZGZuIGNsYXNzPSJ0ZXJtIj5hbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9kZm4+IGZvcgotV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZQotc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlCi10byBoaWdobGlnaHQgZXJyb3JzLCB3YXJuaW5ncywgdGFza3MsIHNlYXJjaCByZXN1bHRzLCBib29rbWFya3MsIGFuZCBvdGhlcgotdGV4dC48L3A+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj4gPHA+QnkgZGVmYXVsdCwgd2hlbiB5b3UgZWRpdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IsIHlvdXIgc291cmNlCi1jb2RlIGlzIHZhbGlkYXRlZCBhcyB5b3UgdHlwZSBpdCBpbi4gTGlrZSBvdGhlciBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIHRoZQotc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMgZmxhZyB3YXJuaW5ncyBhbmQgZXJyb3JzIGluIHRoZQotc291cmNlIGNvZGUgaW4gdGhlIGVkaXRvciBhcmVhLiBUaGUgd2FybmluZ3MgYW5kIGVycm9ycyBhbHNvIHNob3cgdXAgaW4gdGhlCi1UYXNrcyB2aWV3IHdoZW4geW91IHNhdmUgdGhlIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTogPC9zcGFuPkhpZ2hsaWdodGluZyBpcyBmdWxseSBkeW5hbWljCi13aXRoIHRoZSBleGNlcHRpb24gb2Ygc2VhcmNoIHJlc3VsdHMuIFNlYXJjaCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBiYXNlZAotdXBvbiB3aGF0IGhhcyBiZWVuIHNhdmVkIHRvIGRpc2suPC9kaXY+Ci08ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOiA8L3NwYW4+WW91IGNhbiBpbXByb3ZlIGEKLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IncyBwZXJmb3JtYW5jZSBieSB0dXJuaW5nIG9mZiB0aGUgcmVhbC10aW1lIHZhbGlkYXRpb24uPC9kaXY+Ci08cD5Ubwotc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotIDwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4gQSBQcmVmZXJlbmNlcyB3aW5kb3cgYXBwZWFycy48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8L3NwYW4+PHVsPjxsaT5UbyB0dXJuIG9mZiByZWFsLXRpbWUgc3ludGF4IHZhbGlkYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQKLVRleHQgRWRpdG9yPC9zcGFuPiBhbmQgdW5jaGVjayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5hbHl6ZSBhbm5vdGF0aW9ucyB3aGlsZQotdHlwaW5nPC9zcGFuPiBib3guPC9saT4KLTxsaT5UbyBjb250cm9sIG90aGVyIGFubm90YXRpb24gc2V0dGluZ3MsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFubm90YXRpb25zPC9zcGFuPiBhbmQKLXNlbGVjdCB5b3VyIGFubm90YXRpb24gcHJlZmVyZW5jZXMuPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGNsb3NlCi10aGUgcGFnZS48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI1Lmh0bWwiIHRpdGxlPSIiPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQKLXRleHQgZWRpdG9yczwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjI2MmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDA1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+DQotPCEtLUZvcm1lcmx5ICJVc2luZyBKYXZhU2NyaXB0IGNvbnRlbnQgYXNzaXN0IjsgbW92ZWQgc29tZSBKYXZhU2NyaXB0LXNwZWNpZmljIGNvbnRlbnQgdG8gY3NyY2VkdDAwNi5kaXRhICgiQ29udGVudCBhc3Npc3QiKS0tPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdA0KLWluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcNCi1vciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5Db250ZW50IGFzc2lzdCBhbHNvIGVuYWJsZXMgeW91IHRvIHNlbGVjdCBhbmQgaW5zZXJ0IHRlbXBsYXRlcyBpbg0KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzDQotdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi48L2NvbnRleHQ+DQotPHN0ZXBzLXVub3JkZXJlZD4NCi08c3RlcD48Y21kPjwvY21kPjxpbmZvPllvdSBjYW4gcmVxdWVzdCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZw0KLXR3byB3YXlzOjwvaW5mbz4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPkZyb20gdGhlIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5Db250ZW50DQotQXNzaXN0PC91aWNvbnRyb2w+PC9jaG9pY2U+DQotPGNob2ljZT5QcmVzcyBDdHJsK1NwYWNlPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPjxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCBhIHByZWZlcmVuY2UgdGhhdCBjYXVzZXMgY29udGVudCBhc3Npc3QNCi10byBwb3AgdXAgYXV0b21hdGljYWxseSB3aGVuIGNlcnRhaW4gY2hhcmFjdGVycyBhcmUgdHlwZWQsIHN1Y2ggYXMgPGNvZGVwaD4uPC9jb2RlcGg+IGluDQotdGhlIGNhc2Ugb2YgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gb3IgPGNvZGVwaD4mbHQ7PC9jb2RlcGg+IGluIHRoZSBjYXNlDQotb2YgSFRNTCBhbmQgWE1MLiBUbyBzZXQgdGhpcyBwcmVmZXJlbmNlLCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPiBmcm9tDQotdGhlIDx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+IG1lbnUsIGFuZCB0aGVuIHNlbGVjdCA8dWljb250cm9sPldlYiBhbmQNCi1YTUwgRmlsZXM8L3VpY29udHJvbD4sIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlczo8dWw+DQotPGxpPjxtZW51Y2FzY2FkZT48dWljb250cm9sPkhUTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgU291cmNlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L2xpPg0KLTxsaT48bWVudWNhc2NhZGU+PHVpY29udHJvbD5KYXZhU2NyaXB0IEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5KYXZhU2NyaXB0DQotU291cmNlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2xpPg0KLTxsaT48bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvbGk+DQotPC91bD5JbiB0aGUgPHVpY29udHJvbD5Db250ZW50IGFzc2lzdDwvdWljb250cm9sPiBncm91cCBib3gsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5BdXRvbWF0aWNhbGx5DQotbWFrZSBzdWdnZXN0aW9uczwvdWljb250cm9sPiBjaGVjayBib3gsIGFuZCBzdXBwbHkgYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycw0KLXRoYXQgc2hvdWxkIHRyaWdnZXIgY29udGVudCBhc3Npc3QuPC9wPjxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24NCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBjaG9pY2VzDQotaXMgZGlzcGxheWVkLiBGb3IgZWFjaCBvZiB0aGVzZSBjaG9pY2VzLCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGlzDQotcHJvdmlkZWQuPC9wPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcy11bm9yZGVyZWQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08IS0tICA8bGluayBocmVmPSJjb250ZW50YXNzaXN0IiB0eXBlPSJzaG93bWUiIGZvcm1hdD0idmlld2xldCI+PGxpbmt0ZXh0PlNob3cgTWU8L2xpbmt0ZXh0PjwvbGluaz4gIC0tPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIzLmRpdGEiPjxsaW5rdGV4dD5NYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQDQotZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzc1MWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDA1Ij4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2gxPgotPGRpdj48cD5UbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QKLWluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcKLW9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9wPjxkaXYgY2xhc3M9InNraXBzcGFjZSI+Q29udGVudCBhc3Npc3QgYWxzbyBlbmFibGVzIHlvdSB0byBzZWxlY3QgYW5kIGluc2VydCB0ZW1wbGF0ZXMgaW4KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzCi10aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHNwYW4+PC9zcGFuPiBZb3UgY2FuIHJlcXVlc3QgY29udGVudCBhc3Npc3QgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcKLXR3byB3YXlzOjx1bD48bGk+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQKLUFzc2lzdDwvc3Bhbj48L2xpPgotPGxpPlByZXNzIEN0cmwrU3BhY2U8L2xpPgotPC91bD4KLSA8ZGl2IGNsYXNzPSJwIj5JbiBhZGRpdGlvbiwgeW91IGNhbiBzZXQgYSBwcmVmZXJlbmNlIHRoYXQgY2F1c2VzIGNvbnRlbnQgYXNzaXN0Ci10byBwb3AgdXAgYXV0b21hdGljYWxseSB3aGVuIGNlcnRhaW4gY2hhcmFjdGVycyBhcmUgdHlwZWQsIHN1Y2ggYXMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Ljwvc2FtcD4gaW4KLXRoZSBjYXNlIG9mIEphdmFTY3JpcHSZIG9yIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDs8L3NhbXA+IGluIHRoZSBjYXNlIG9mCi1IVE1MIGFuZCBYTUwuIFRvIHNldCB0aGlzIHByZWZlcmVuY2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gZnJvbQotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQKLVhNTCBGaWxlczwvc3Bhbj4sIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlczo8dWw+PGxpPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIFNvdXJjZTwvc3Bhbj48L3NwYW4+PC9saT4KLTxsaT48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmFTY3JpcHQgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdAotU291cmNlPC9zcGFuPjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBTb3VyY2U8L3NwYW4+PC9zcGFuPjwvbGk+Ci08L3VsPgotSW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgYXNzaXN0PC9zcGFuPiBncm91cCBib3gsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXV0b21hdGljYWxseQotbWFrZSBzdWdnZXN0aW9uczwvc3Bhbj4gY2hlY2sgYm94LCBhbmQgc3VwcGx5IGFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMKLXRoYXQgc2hvdWxkIHRyaWdnZXIgY29udGVudCBhc3Npc3QuPC9kaXY+Ci08cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBjaG9pY2VzCi1pcyBkaXNwbGF5ZWQuIEZvciBlYWNoIG9mIHRoZXNlIGNob2ljZXMsIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgaXMKLXByb3ZpZGVkLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxwPjxiIGNsYXNzPSJyZWxjb25jZXB0c2hkIj5SZWxhdGVkIGNvbmNlcHRzPC9iPjxiciAvPgotPGEgaHJlZj0iY3NyY2VkdDAwNi5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiI+Q29udGVudCBhc3Npc3Q8L2E+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDIzLmh0bWwiIHRpdGxlPSJIYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSBKYXZhIGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50IGFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyIHRvIGJlIGFibGUgdG8gY29ycmVjdGx5IHJlc29sdmUgbGlua3MgdG8gc2VydmxldHMgb3IgSmF2YSBiZWFucyBpbiBKU1AgYW5kIEhUTUwgZmlsZXMuIj5NYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQCi1maWxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMjcuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UKLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCBvciBYTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YWE4YjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDA3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT50ZXh0IHNlYXJjaDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPHByZXJlcT48bm90ZSB0eXBlPSJ0aXAiPkJlZm9yZSB5b3UgZG8gYSBTZWFyY2ggb3BlcmF0aW9uIGluIGEgc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yLCBzYXZlIHRoZSBmaWxlIHlvdSBhcmUgc2VhcmNoaW5nLiBUaGUgc2VhcmNoIGZ1bmN0aW9uIHdvcmtzIGZyb20NCi10aGUgbW9zdCByZWNlbnRseSBzYXZlZCB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJhdGhlciB0aGFuIGZyb20gdGhlIGNvbnRlbnRzDQotdGhhdCB5b3Ugc2VlIGluIHRoZSBlZGl0b3IgYXJlYS4gWW91IGRvIG5vdCBuZWVkIHRvIHNhdmUgeW91ciBmaWxlIGJlZm9yZQ0KLXlvdSBkbyBhIEZpbmQvUmVwbGFjZSBvcGVyYXRpb24uIDwvbm90ZT48L3ByZXJlcT4NCi08Y29udGV4dD5FYWNoIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgdHdvIHdheXMgdG8gbG9jYXRlIGEgdGV4dCBzdHJpbmcNCi1pbiB0aGUgZmlsZSB5b3UgYXJlIGVkaXRpbmcgYW5kIG9wdGlvbmFsbHkgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3RyaW5nOiA8ZGw+DQotPGRsZW50cnk+DQotPGR0PkZpbmQvUmVwbGFjZTwvZHQ+DQotPGRkPkxldHMgeW91IGxvY2F0ZSB0ZXh0IGluIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlNlYXJjaDwvZHQ+DQotPGRkPkxldHMgeW91IGxvY2F0ZSB0ZXh0IGluIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkIHRvIHlvdXIgd29ya3NwYWNlLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PHA+VG8gbG9jYXRlIGFuZCBvcHRpb25hbGx5IHJlcGxhY2UgdGV4dCwgc2VsZWN0IG9uZSBvZiB0aGUNCi1mb2xsb3dpbmcgbWVudSBwYXRoczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD48bWVudWNhc2NhZGU+PHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+PHVpY29udHJvbD5GaW5kL1JlcGxhY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiAob3IgPHVpY29udHJvbD5DdHJsK0Y8L3VpY29udHJvbD4pPC9jbWQ+PGluZm8+VGhpcyBvcHRpb24gaXMNCi1zZWxmLWV4cGxhbmF0b3J5LjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcy11bm9yZGVyZWQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2FjZTRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMDciPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOiA8L3NwYW4+QmVmb3JlIHlvdSBkbyBhIFNlYXJjaCBvcGVyYXRpb24gaW4gYSBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvciwgc2F2ZSB0aGUgZmlsZSB5b3UgYXJlIHNlYXJjaGluZy4gVGhlIHNlYXJjaCBmdW5jdGlvbiB3b3JrcyBmcm9tCi10aGUgbW9zdCByZWNlbnRseSBzYXZlZCB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJhdGhlciB0aGFuIGZyb20gdGhlIGNvbnRlbnRzCi10aGF0IHlvdSBzZWUgaW4gdGhlIGVkaXRvciBhcmVhLiBZb3UgZG8gbm90IG5lZWQgdG8gc2F2ZSB5b3VyIGZpbGUgYmVmb3JlCi15b3UgZG8gYSBGaW5kL1JlcGxhY2Ugb3BlcmF0aW9uLiA8L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj5FYWNoIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgdHdvIHdheXMgdG8gbG9jYXRlIGEgdGV4dCBzdHJpbmcKLWluIHRoZSBmaWxlIHlvdSBhcmUgZWRpdGluZyBhbmQgb3B0aW9uYWxseSByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBzdHJpbmc6IDxkbD48ZHQgY2xhc3M9ImJvbGQiPkZpbmQvUmVwbGFjZTwvZHQ+Ci08ZGQ+TGV0cyB5b3UgbG9jYXRlIHRleHQgaW4gdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIGVkaXRlZC48L2RkPgotPGR0IGNsYXNzPSJib2xkIj5TZWFyY2g8L2R0PgotPGRkPkxldHMgeW91IGxvY2F0ZSB0ZXh0IGluIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkIHRvIHlvdXIgd29ya3NwYWNlLjwvZGQ+Ci08L2RsPgotPHA+VG8gbG9jYXRlIGFuZCBvcHRpb25hbGx5IHJlcGxhY2UgdGV4dCwgc2VsZWN0IG9uZSBvZiB0aGUKLWZvbGxvd2luZyBtZW51IHBhdGhzOjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHNwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmQvUmVwbGFjZTwvc3Bhbj48L3NwYW4+IChvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdHJsK0Y8L3NwYW4+KTwvc3Bhbj4gVGhpcyBvcHRpb24gaXMKLXNlbGYtZXhwbGFuYXRvcnkuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MIG9yIFhNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbgotbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9hPjxiciAvPgotPC9wPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjNmQwMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMTAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNoZWNraW5nIHNwZWxsaW5nPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNwZWxsIGNoZWNrPGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPnNwZWxsIGNoZWNrPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIChhY2Nlc3NlZCBmcm9tDQotdGhlIFByb2plY3QgRXhwbG9yZXIncyBwb3AtdXAgbWVudSBvciBieSBjbGlja2luZyB0aGUgU291cmNlIHRhYiBpbiBjZXJ0YWluDQotZWRpdG9ycykgcHJvdmlkZSBhIHNwZWxsIGNoZWNraW5nIGZlYXR1cmUuPC9wPjxwPlRvIGNoZWNrIHNwZWxsaW5nIGluIGFuIEhUTUwsDQotWE1MLCBvciBvdGhlciBmaWxlIHRoYXQgdXNlcyBhIHN0cnVjdHVyZWQgbWFya3VwIGxhbmd1YWdlOjwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgVG8gc2VsZWN0IHRoZSBkaWN0aW9uYXJ5IHRoYXQgd2lsbCBiZSB1c2VkLCBjbGljayA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5TcGVsbA0KLUNoZWNrPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+T3BlbiBpbiBhICBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHRoZSBmaWxlIHdob3NlIHNwZWxsaW5nIHlvdSB3YW50DQotdG8gY2hlY2suPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3RhcnQgdGhlIHNwZWxsaW5nIGNoZWNrZXIgYnkgY2xpY2tpbmcgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+U3BlbGwgQ2hlY2s8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgbmV3IHNwZWxsaW5nIGludG8gdGhlIDx1aWNvbnRyb2w+Q2hhbmdlIHRvPC91aWNvbnRyb2w+IGZpZWxkLA0KLW9yIHNlbGVjdCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zLiBDbGljayB0aGUgPHVpY29udHJvbD5DaGFuZ2U8L3VpY29udHJvbD4gYnV0dG9uDQotdG8gY2hhbmdlIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSB3b3JkIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LiBDbGljaw0KLXRoZSA8dWljb250cm9sPkNoYW5nZSBBbGw8L3VpY29udHJvbD4gYnV0dG9uIHRvIGNoYW5nZSBhbGwgaW5zdGFuY2VzIG9mIHRoZQ0KLXdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuIFlvdSBjYW4gYWxzbyBjbGljayB0aGUgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4gYnV0dG9uDQotdG8gYWRkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3BlbGxpbmcgdG8geW91ciBkaWN0aW9uYXJ5LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVzZSB0aGUgY29udHJvbHMgaW4gdGhlIFNwZWxsIENoZWNrIGRpYWxvZyBib3ggdG8gaWdub3JlLCBjaGFuZ2UsDQotb3IgYWRkIHRlcm1zIHRvIHRoZSBjdXJyZW50IGRpY3Rpb25hcnkuIChUbyByZW1vdmUgYSB3b3JkIGFmdGVyIGl0IGhhcyBiZWVuDQotYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnksIGNsaWNrIHRoZSA8dWljb250cm9sPkRpY3Rpb25hcnk8L3VpY29udHJvbD4gcHVzaA0KLWJ1dHRvbi4pPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGRmY2EyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5DaGVja2luZyBzcGVsbGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAxMCI+PGEgbmFtZT0idHNyY2VkdDAxMCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNoZWNraW5nIHNwZWxsaW5nPC9oMT4KLTxkaXY+PHA+VGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvci48L3A+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj4gPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIChhY2Nlc3NlZCBmcm9tCi10aGUgUHJvamVjdCBFeHBsb3JlcidzIHBvcC11cCBtZW51IG9yIGJ5IGNsaWNraW5nIHRoZSBTb3VyY2UgdGFiIGluIGNlcnRhaW4KLWVkaXRvcnMpIHByb3ZpZGUgYSBzcGVsbCBjaGVja2luZyBmZWF0dXJlLjwvcD4KLTxwPlRvIGNoZWNrIHNwZWxsaW5nIGluIGFuIEhUTUwsCi1YTUwsIG9yIG90aGVyIGZpbGUgdGhhdCB1c2VzIGEgc3RydWN0dXJlZCBtYXJrdXAgbGFuZ3VhZ2U6PC9wPgotIDwvZGl2PgotPG9sPjxsaT48c3Bhbj4oT3B0aW9uYWwpIFRvIHNlbGVjdCB0aGUgZGljdGlvbmFyeSB0aGF0IHdpbGwgYmUgdXNlZCwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwKLUNoZWNrPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T3BlbiBpbiBhICBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHRoZSBmaWxlIHdob3NlIHNwZWxsaW5nIHlvdSB3YW50Ci10byBjaGVjay48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TdGFydCB0aGUgc3BlbGxpbmcgY2hlY2tlciBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwgQ2hlY2s8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5UeXBlIGEgbmV3IHNwZWxsaW5nIGludG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNoYW5nZSB0bzwvc3Bhbj4gZmllbGQsCi1vciBzZWxlY3Qgb25lIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4gQ2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNoYW5nZTwvc3Bhbj4gYnV0dG9uCi10byBjaGFuZ2UgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIHdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuIENsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2hhbmdlIEFsbDwvc3Bhbj4gYnV0dG9uIHRvIGNoYW5nZSBhbGwgaW5zdGFuY2VzIG9mIHRoZQotd29yZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudC4gWW91IGNhbiBhbHNvIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IGJ1dHRvbgotdG8gYWRkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3BlbGxpbmcgdG8geW91ciBkaWN0aW9uYXJ5Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlVzZSB0aGUgY29udHJvbHMgaW4gdGhlIFNwZWxsIENoZWNrIGRpYWxvZyBib3ggdG8gaWdub3JlLCBjaGFuZ2UsCi1vciBhZGQgdGVybXMgdG8gdGhlIGN1cnJlbnQgZGljdGlvbmFyeS4gKFRvIHJlbW92ZSBhIHdvcmQgYWZ0ZXIgaXQgaGFzIGJlZW4KLWFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGljdGlvbmFyeTwvc3Bhbj4gcHVzaAotYnV0dG9uLik8L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MIG9yIFhNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjxiciAvPgotPC9wPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1MjFhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMTQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3DQotYnkgYWRkaW5nIGEgbmV3IGRyYXdlci48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zbmlwcGV0czxpbmRleHRlcm0+ZHJhd2VyczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5kZWxldGluZzwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+ZWRpdGluZyBpdGVtczwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+aGlkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBhZGQgYSBuZXcgZHJhd2VyIHRvIHRoZSBTbmlwcGV0cyB2aWV3OjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayBhbnl3aGVyZSBpbiB0aGUgU25pcHBldHMgdmlldyBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcG9wLXVwIG1lbnUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5DYXRlZ29yeTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBuZXcgZHJhd2VyIGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+T3B0aW9uYWxseSwgdHlwZSBhIGRlc2NyaXB0aW9uIGluIHRoZSA8dWljb250cm9sPkRlc2NyaXB0aW9uPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgZHJhd2VyJ3MgYmVoYXZpb3IgYnkgY2hlY2tpbmcgY2hlY2sgYm94ZXMgYXMgYXBwcm9wcmlhdGUuDQotVGhlIGNoZWNrIGJveGVzIGFyZSBhcyBmb2xsb3dzOjwvY21kPg0KLTxjaG9pY2V0YWJsZT4NCi08Y2hyb3c+PGNob3B0aW9uPkhpZGU8L2Nob3B0aW9uPjxjaGRlc2M+RG8gbm90IGRpc3BsYXkgdGhlIGRyYXdlci48L2NoZGVzYz4NCi08L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+T3BlbiBkcmF3ZXIgYXQgc3RhcnQtdXA8L2Nob3B0aW9uPjxjaGRlc2M+QXQgc3RhcnQtdXAsIGRpc3BsYXkNCi10aGUgZHJhd2VyJ3MgaXRlbXMuPC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPlBpbiBkcmF3ZXIgb3BlbiBhdCBzdGFydC11cDwvY2hvcHRpb24+PGNoZGVzYz5LZWVwIHRoZSBkcmF3ZXINCi1vcGVuLjwvY2hkZXNjPjwvY2hyb3c+DQotPC9jaG9pY2V0YWJsZT4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiBUaGUgbmV3IGRyYXdlciB3aWxsIGJlIGFkZGVkIHRvDQotdGhlIGxpc3Qgb2YgZHJhd2VycyBpbiB0aGUgU25pcHBldHMgdmlldy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDAxLmRpdGEiPjxsaW5rdGV4dD5TbmlwcGV0cyB2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjIuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgc25pcHBldCBpdGVtczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTYuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yDQotZHJhd2VyczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmE5NzFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAxNCI+PGEgbmFtZT0idHNyY2VkdDAxNCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9oMT4KLTxkaXY+PHA+VGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcKLWJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuPC9wPjxkaXYgY2xhc3M9InNraXBzcGFjZSI+VG8gYWRkIGEgbmV3IGRyYXdlciB0byB0aGUgU25pcHBldHMgdmlldzo8L2Rpdj4KLTxvbD48bGk+PHNwYW4+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gdGhlIFNuaXBwZXRzIHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgQ2F0ZWdvcnk8L3NwYW4+PC9zcGFuPiBhbmQgdHlwZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGRyYXdlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T3B0aW9uYWxseSwgdHlwZSBhIGRlc2NyaXB0aW9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2VsZWN0IHRoZSBkcmF3ZXIncyBiZWhhdmlvciBieSBjaGVja2luZyBjaGVjayBib3hlcyBhcyBhcHByb3ByaWF0ZS4KLVRoZSBjaGVjayBib3hlcyBhcmUgYXMgZm9sbG93czo8L3NwYW4+Ci08dGFibGUgYm9yZGVyPSIxIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0icm93cyIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGNsYXNzPSJza2lwc3BhY2UiPgotPHRoZWFkPjx0cj48dGQ+PGI+T3B0aW9uPC9iPjwvdGQ+PHRkPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+PC90cj48L3RoZWFkPgotPHRib2R5PgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGlkPSJkMGU0MyI+PGI+SGlkZTwvYj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlNDMiPkRvIG5vdCBkaXNwbGF5IHRoZSBkcmF3ZXIuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTQ4Ij48Yj5PcGVuIGRyYXdlciBhdCBzdGFydC11cDwvYj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlNDgiPkF0IHN0YXJ0LXVwLCBkaXNwbGF5Ci10aGUgZHJhd2VyJ3MgaXRlbXMuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTUzIj48Yj5QaW4gZHJhd2VyIG9wZW4gYXQgc3RhcnQtdXA8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTUzIj5LZWVwIHRoZSBkcmF3ZXIKLW9wZW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PjwvdGFibGU+Ci08L2xpPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gVGhlIG5ldyBkcmF3ZXIgd2lsbCBiZSBhZGRlZCB0bwotdGhlIGxpc3Qgb2YgZHJhd2VycyBpbiB0aGUgU25pcHBldHMgdmlldy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFNuaXBwZXRzIHZpZXcuIj5TbmlwcGV0cyB2aWV3PC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBhZGQgYSBuZXcgaXRlbSB0byBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gbW9kaWZ5IHRoZSB0ZW1wbGF0ZSBjb2RlIHRoYXQgaXMgaW4gYW4gaXRlbSBpbiBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PGJyIC8+Ci08L3A+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDdhNzZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAxNSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNuaXBwZXQgZHJhd2VyczxpbmRleHRlcm0+YWRkaW5nIGl0ZW1zIHRvPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5zbmlwcGV0IGl0ZW1zPGluZGV4dGVybT5hZGRpbmcgdG8gZHJhd2VyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IFRvIGFkZCBuZXcgaXRlbXMgdG8gYW4gZXhpc3Rpbmcgc25pcHBldHMgZHJhd2VyOjo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hvaWNlczo8L2NtZD48aW5mbz48dGFibGUgY29sc2VwPSIwIiBmcmFtZT0idG9wYm90Ij4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiIGNvbHdpZHRoPSI3MioiLz48Y29sc3BlYyBjb2xuYW1lPSJjb2wyIg0KLWNvbHdpZHRoPSIxMjcqIi8+DQotPHRoZWFkPg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiIHZhbGlnbj0idG9wIj5UbyBzdGFydCB3aXRoIHRoaXM6PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiIgdmFsaWduPSJ0b3AiPkRvIHRoaXM6PC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbiBlbXB0eSBpdGVtIHRoYXQgeW91IGNhbiBlZGl0PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyLCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4sDQotYW5kIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+TmV3IEl0ZW08L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhbiBleGlzdGluZw0KLWRyYXdlcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkNvcHkgb3IgY3V0IHRleHQgdG8gdGhlIGNsaXBib2FyZC4gSW4gdGhlIFNuaXBwZXRzIHZpZXcsDQotcmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyIGFuZCBjbGljayA8dWljb250cm9sPlBhc3RlPC91aWNvbnRyb2w+LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RXhpc3RpbmcgdGV4dCBwYXN0ZWQgaW50byBhIG5ldyBpdGVtIGluIGEgbmV3IG9yIGV4aXN0aW5nDQotZHJhd2VyPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+U2VsZWN0IHRoZSB0ZXh0LCByaWdodC1jbGljaywgY2xpY2sgPHVpY29udHJvbD5BZGQgdG8NCi1TbmlwcGV0czwvdWljb250cm9sPiwgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3DQotdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIHRoZSBpdGVtLCBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT48L2luZm8+PHN0ZXByZXN1bHQ+QSA8d2ludGl0bGU+Q3VzdG9taXplIFBhbGV0dGU8L3dpbnRpdGxlPiB3aW5kb3cNCi1hcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgbmFtZSBmb3IgdGhlIG5ldyBpdGVtLCBhbmQsIG9wdGlvbmFsbHksIHByb3ZpZGUgYSBkZXNjcmlwdGlvbi48L2NtZD4NCi08c3RlcHJlc3VsdD5UaGUgdmFsdWUgdGhhdCB5b3UgdHlwZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkDQotd2lsbCBhcHBlYXIgbmV4dCB0byB0aGUgaXRlbSdzIGljb24gaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGluY2x1ZGUgaW4gdGhlIDx1aWNvbnRyb2w+VGVtcGxhdGUgUGF0dGVybjwvdWljb250cm9sPiBmaWVsZA0KLWEgdmFyaWFibGUgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQsIGNsaWNrIDx1aWNvbnRyb2w+SW5zZXJ0IFZhcmlhYmxlDQotUGxhY2Vob2xkZXI8L3VpY29udHJvbD4uIDwvY21kPjxpbmZvPkEgdmFyaWFibGUgcGxhY2Vob2xkZXIgaXMgYSBtYXJrZXIgdGhhdCwNCi13aGVuIHRhZ2dpbmcgaXMgaW5zZXJ0ZWQgaW50byB0aGUgYWN0aXZlIGZpbGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlDQotdGhhdCBpcyBlbnRlcmVkIGludG8gdGhlIDx1aWNvbnRyb2w+SW5zZXJ0IFRlbXBsYXRlOjwvdWljb250cm9sPjx2YXJuYW1lPkl0ZW1fbmFtZTwvdmFybmFtZT4gZGlhbG9nDQotYXQgaW5zZXJ0aW9uIHRpbWUuIENsaWNraW5nIHRoZSA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvdWljb250cm9sPiBidXR0b24NCi1vciB0eXBpbmcgQ3RybCtTcGFjZSBhY3RpdmF0ZXMgYSBwb3AtdXAgaW4gdGhlIHRleHQgYXJlYSB0aGF0IHByb21wdHMgeW91DQotd2l0aCB0aGUgY29ycmVjdCBzZXF1ZW5jZXMgdG8gY3JlYXRlIGEgbWFya2VyIGZvciB0aGUgdmFyaWFibGUuPC9pbmZvPjxzdGVweG1wPkZvcg0KLWV4YW1wbGUsIGlmIHlvdSBjcmVhdGUgdHdvIHZhcmlhYmxlcyBuYW1lZCA8dmFybmFtZT51cmk8L3Zhcm5hbWU+IGFuZCA8dmFybmFtZT5wcmVmaXg8L3Zhcm5hbWU+LA0KLWFuZCBjcmVhdGUgdmFyaWFibGUgcGxhY2Vob2xkZXJzIGZvciBib3RoLCB0aGUgdGVtcGxhdGUgcGF0dGVybiBtaWdodCBsb29rDQotbGlrZSB0aGlzOjxjb2RlYmxvY2s+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICU+PC9jb2RlYmxvY2s+PC9zdGVweG1wPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UaGUgbmV3IGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUNCi1kcmF3ZXIuPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNDg5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTUiPjxhIG5hbWU9InRzcmNlZHQwMTUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvaDE+Ci08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGFkZCBhIG5ldyBpdGVtIHRvIGEgZHJhd2VyCi1pbiB0aGUgU25pcHBldHMgdmlldy48L3A+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj4gVG8gYWRkIG5ldyBpdGVtcyB0byBhbiBleGlzdGluZyBzbmlwcGV0cyBkcmF3ZXI6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6PC9zcGFuPiAKLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iaHNpZGVzIiBib3JkZXI9IjEiIHJ1bGVzPSJyb3dzIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIGlkPSJkMGUyNCI+VG8gc3RhcnQgd2l0aCB0aGlzOjwvdGg+Ci08dGggdmFsaWduPSJ0b3AiIGlkPSJkMGUyNiI+RG8gdGhpczo8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjQgIj5BbiBlbXB0eSBpdGVtIHRoYXQgeW91IGNhbiBlZGl0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjYgIj5SaWdodC1jbGljayBhbnl3aGVyZSBpbiBhbiBleGlzdGluZyBkcmF3ZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+LAotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldyBJdGVtPC9zcGFuPjwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyNCAiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhbiBleGlzdGluZwotZHJhd2VyPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjYgIj5Db3B5IG9yIGN1dCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuIEluIHRoZSBTbmlwcGV0cyB2aWV3LAotcmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXN0ZTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyNCAiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhIG5ldyBvciBleGlzdGluZwotZHJhd2VyPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjYgIj5TZWxlY3QgdGhlIHRleHQsIHJpZ2h0LWNsaWNrLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgdG8KLVNuaXBwZXRzPC9zcGFuPiwgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3Ci10byB3aGljaCB5b3Ugd2FudCB0byBhZGQgdGhlIGl0ZW0sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotIEEgPHNwYW4gY2xhc3M9IndpbnRpdGxlIj5DdXN0b21pemUgUGFsZXR0ZTwvc3Bhbj4gd2luZG93Ci1hcHBlYXJzLjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgaXRlbSwgYW5kLCBvcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpb24uPC9zcGFuPiBUaGUgdmFsdWUgdGhhdCB5b3UgdHlwZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQKLXdpbGwgYXBwZWFyIG5leHQgdG8gdGhlIGl0ZW0ncyBpY29uIGluIHRoZSBTbmlwcGV0cyB2aWV3LjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+VG8gaW5jbHVkZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGVtcGxhdGUgUGF0dGVybjwvc3Bhbj4gZmllbGQKLWEgdmFyaWFibGUgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZQotUGxhY2Vob2xkZXI8L3NwYW4+LiA8L3NwYW4+IEEgdmFyaWFibGUgcGxhY2Vob2xkZXIgaXMgYSBtYXJrZXIgdGhhdCwKLXdoZW4gdGFnZ2luZyBpcyBpbnNlcnRlZCBpbnRvIHRoZSBhY3RpdmUgZmlsZSwgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmFsdWUKLXRoYXQgaXMgZW50ZXJlZCBpbnRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVGVtcGxhdGU6PC9zcGFuPjx2YXIgY2xhc3M9InZhcm5hbWUiPkl0ZW1fbmFtZTwvdmFyPiBkaWFsb2cKLWF0IGluc2VydGlvbiB0aW1lLiBDbGlja2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFZhcmlhYmxlIFBsYWNlaG9sZGVyPC9zcGFuPiBidXR0b24KLW9yIHR5cGluZyBDdHJsK1NwYWNlIGFjdGl2YXRlcyBhIHBvcC11cCBpbiB0aGUgdGV4dCBhcmVhIHRoYXQgcHJvbXB0cyB5b3UKLXdpdGggdGhlIGNvcnJlY3Qgc2VxdWVuY2VzIHRvIGNyZWF0ZSBhIG1hcmtlciBmb3IgdGhlIHZhcmlhYmxlLiBGb3IKLWV4YW1wbGUsIGlmIHlvdSBjcmVhdGUgdHdvIHZhcmlhYmxlcyBuYW1lZCA8dmFyIGNsYXNzPSJ2YXJuYW1lIj51cmk8L3Zhcj4gYW5kIDx2YXIgY2xhc3M9InZhcm5hbWUiPnByZWZpeDwvdmFyPiwKLWFuZCBjcmVhdGUgdmFyaWFibGUgcGxhY2Vob2xkZXJzIGZvciBib3RoLCB0aGUgdGVtcGxhdGUgcGF0dGVybiBtaWdodCBsb29rCi1saWtlIHRoaXM6PHByZT4mbHQ7JUAgdGFnbGliIHVyaT0iJHt1cml9IiBwcmVmaXg9IiR7cHJlZml4fSIgJSZndDs8L3ByZT4KLTwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+VGhlIG5ldyBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlCi1kcmF3ZXIuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFNuaXBwZXRzIHZpZXcuIj5TbmlwcGV0cyB2aWV3PC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE0Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiI+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBtb2RpZnkgdGhlIHRlbXBsYXRlIGNvZGUgdGhhdCBpcyBpbiBhbiBpdGVtIGluIGEgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjE1ZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDE2IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5EZWxldGluZyBhbmQgaGlkaW5nIGRyYXdlcnMgYW5kIGl0ZW1zPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kDQotaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c25pcHBldHM8aW5kZXh0ZXJtPmRlbGV0aW5nIG9yIGhpZGluZyBkcmF3ZXJzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5kcmF3ZXJzPGluZGV4dGVybT5kZWxldGluZyBzbmlwcGV0czwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+aGlkaW5nIHNuaXBwZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5Zb3UgY2FuIGhpZGUgYW55IGRyYXdlciBvciBpdGVtIHRoYXQgc2hvd3MgdXAgaW4gdGhlIFNuaXBwZXRzIHZpZXcuDQotSWYgdGhlIGRyYXdlciBvciBpdGVtIGlzIHVzZXItZGVmaW5lZCwgeW91IGNhbiBkZWxldGUgaXQgcGVybWFuZW50bHkuIFRvIGRlbGV0ZQ0KLW9yIGhpZGUgYSBkcmF3ZXIgb3IgaXRlbSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBpdGVtIG9yIGRyYXdlciB0aGF0IHlvdSB3YW50IHRvIHJlbW92ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplPC91aWNvbnRyb2w+IGZyb20gdGhlDQotcG9wLXVwIG1lbnUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBpdGVtIG9yIGRyYXdlciBhbmQgY2xpY2sgPHVpY29udHJvbD5EZWxldGU8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5IaWRlPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIFRoZSBpdGVtIG9yIGRyYXdlciB3aWxsIGJlIGRlbGV0ZWQNCi1vciBoaWRkZW4gZnJvbSB0aGUgU25pcHBldHMgdmlldy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDAxLmRpdGEiPjxsaW5rdGV4dD5TbmlwcGV0cyB2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTM1ZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTYiPjxhIG5hbWU9InRzcmNlZHQwMTYiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC9oMT4KLTxkaXY+PHA+VGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQKLWl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LjwvcD48ZGl2IGNsYXNzPSJza2lwc3BhY2UiPllvdSBjYW4gaGlkZSBhbnkgZHJhd2VyIG9yIGl0ZW0gdGhhdCBzaG93cyB1cCBpbiB0aGUgU25pcHBldHMgdmlldy4KLUlmIHRoZSBkcmF3ZXIgb3IgaXRlbSBpcyB1c2VyLWRlZmluZWQsIHlvdSBjYW4gZGVsZXRlIGl0IHBlcm1hbmVudGx5LiBUbyBkZWxldGUKLW9yIGhpZGUgYSBkcmF3ZXIgb3IgaXRlbSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L2Rpdj4KLTxvbD48bGk+PHNwYW4+U2VsZWN0IHRoZSBpdGVtIG9yIGRyYXdlciB0aGF0IHlvdSB3YW50IHRvIHJlbW92ZS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5SaWdodC1jbGljayBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4gZnJvbSB0aGUKLXBvcC11cCBtZW51Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGV0ZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SGlkZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiBUaGUgaXRlbSBvciBkcmF3ZXIgd2lsbCBiZSBkZWxldGVkCi1vciBoaWRkZW4gZnJvbSB0aGUgU25pcHBldHMgdmlldy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFNuaXBwZXRzIHZpZXcuIj5TbmlwcGV0cyB2aWV3PC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE0Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiI+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBhZGQgYSBuZXcgaXRlbSB0byBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gbW9kaWZ5IHRoZSB0ZW1wbGF0ZSBjb2RlIHRoYXQgaXMgaW4gYW4gaXRlbSBpbiBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjMxYmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDIyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNuaXBwZXRzPGluZGV4dGVybT5lZGl0aW5nIGl0ZW1zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gVG8gbW9kaWZ5IGFuIGV4aXN0aW5nIGl0ZW0gaW4gYSBTbmlwcGV0cyBkcmF3ZXIsIGNvbXBsZXRlIHRoZSBzdGVwcw0KLWxpc3RlZCBiZWxvdy4gSWYgeW91IGhhdmUganVzdCBjb21wbGV0ZWQgdGhlIHRhc2sgPHhyZWYgaHJlZj0idHNyY2VkdDAxNS5kaXRhIg0KLXR5cGU9InRhc2siPkFkZGluZyBhbiBpdGVtIHRvIGEgc25pcHBldHMgZHJhd2VyPC94cmVmPiBhbmQgdGhlIDx3aW50aXRsZT5DdXN0b21pemUNCi1QYWxldHRlPC93aW50aXRsZT4gd2luZG93IGlzIHN0aWxsIG9wZW4sIHlvdSBjYW4gc2tpcCBzdGVwcyAxIGFuZCAyLjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgU25pcHBldHMgdmlldywgcmlnaHQtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIGl0ZW0gdGhhdCB5b3UNCi13YW50IHRvIG1vZGlmeSwgYW5kIHNlbGVjdCA8dWljb250cm9sPkN1c3RvbWl6ZTwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5PcHRpb25hbGx5LCB0eXBlIGEgbmV3IG5hbWUgYW5kIGEgbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgaXRlbS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBkZWNsYXJlIGEgdmFyaWFibGUsIGNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IGFuZCB0eXBlDQotdGhlIHZhcmlhYmxlJ3MgbmFtZSwgZGVzY3JpcHRpb24sIGFuZCBkZWZhdWx0IHZhbHVlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGVkaXQgYW4gZXhpc3RpbmcgdmFyaWFibGUsIHR5cGUgb3ZlciB0aGUgZXhpc3RpbmcgdmFsdWVzLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGVkaXQgdGhlIDx1aWNvbnRyb2w+VGVtcGxhdGUgUGF0dGVybjwvdWljb250cm9sPiBmaWVsZCwgdHlwZQ0KLWludG8gdGhlIGZpZWxkLCBjdXQgYW5kIHBhc3RlIGludG8gdGhlIGZpZWxkLCBvciwgaWYgeW91IGhhdmUgZGVmaW5lZCBvbmUNCi1vciBtb3JlIHZhcmlhYmxlcywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+SW5zZXJ0IFZhcmlhYmxlIFBsYWNlaG9sZGVyPC91aWNvbnRyb2w+IGJ1dHRvbiwNCi1hbmQgZG91YmxlLWNsaWNrIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHlvdSB3YW50IHRvIGluc2VydC48L2NtZD48c3RlcHhtcD5Gb3INCi1leGFtcGxlLCBpZiB5b3UgaGF2ZSBkZWNsYXJlIHZhcmlhYmxlcyBuYW1lZCA8dmFybmFtZT51cmk8L3Zhcm5hbWU+IGFuZCA8dmFybmFtZT5wcmVmaXg8L3Zhcm5hbWU+LA0KLWNsaWNraW5nIHRoZSBidXR0b24gYnJpbmdzIHVwIGEgbWVudSB0aGF0IGNvbnRhaW5zIHRob3NlIG5hbWVzLiBEb3VibGUtY2xpY2tpbmcgPHZhcm5hbWU+dXJpPC92YXJuYW1lPiBpbnNlcnRzIDxjb2RlcGg+JHt1cml9PC9jb2RlcGg+LA0KLWFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDslQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlPjwvY29kZWJsb2NrPjwvc3RlcHhtcD4NCi08c3RlcHJlc3VsdD5MYXRlciwgd2hlbiB5b3UgaW5zZXJ0IHRoZSBzbmlwcGV0IGludG8gYSBmaWxlLCA8Y29kZXBoPiR7dXJpfTwvY29kZXBoPiBhbmQgPGNvZGVwaD4ke3ByZWZpeH08L2NvZGVwaD4gYXJlDQotZWFjaCBjb252ZXJ0ZWQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgZGVjbGFyZWQgaW4gdGhlIFZhcmlhYmxlcyB0YWJsZS4gVXNlcnMNCi1jYW4gcmVwbGFjZSB0aGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDx1aWNvbnRyb2w+SW5zZXJ0IFRlbXBsYXRlOjwvdWljb250cm9sPjx2YXJuYW1lPkl0ZW1fbmFtZTwvdmFybmFtZT4gZGlhbG9nDQotYXQgaW5zZXJ0aW9uIHRpbWUuPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UaGUgbW9kaWZpZWQgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBhcHByb3ByaWF0ZQ0KLWRyYXdlci48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDAxLmRpdGEiPjxsaW5rdGV4dD5TbmlwcGV0cyB2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWNlZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkVkaXRpbmcgc25pcHBldCBpdGVtczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyMiI+PGEgbmFtZT0idHNyY2VkdDAyMiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvaDE+Ci08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIG1vZGlmeSB0aGUgdGVtcGxhdGUgY29kZSB0aGF0Ci1pcyBpbiBhbiBpdGVtIGluIGEgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3LjwvcD48ZGl2IGNsYXNzPSJza2lwc3BhY2UiPiBUbyBtb2RpZnkgYW4gZXhpc3RpbmcgaXRlbSBpbiBhIFNuaXBwZXRzIGRyYXdlciwgY29tcGxldGUgdGhlIHN0ZXBzCi1saXN0ZWQgYmVsb3cuIElmIHlvdSBoYXZlIGp1c3QgY29tcGxldGVkIHRoZSB0YXNrIDxhIGhyZWY9InRzcmNlZHQwMTUuaHRtbCI+QWRkaW5nIGFuIGl0ZW0gdG8gYSBzbmlwcGV0cyBkcmF3ZXI8L2E+IGFuZCB0aGUgPHNwYW4gY2xhc3M9IndpbnRpdGxlIj5DdXN0b21pemUKLVBhbGV0dGU8L3NwYW4+IHdpbmRvdyBpcyBzdGlsbCBvcGVuLCB5b3UgY2FuIHNraXAgc3RlcHMgMSBhbmQgMi48L2Rpdj4KLTxvbD48bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIFNuaXBwZXRzIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBuYW1lIG9mIHRoZSBpdGVtIHRoYXQgeW91Ci13YW50IHRvIG1vZGlmeSwgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPk9wdGlvbmFsbHksIHR5cGUgYSBuZXcgbmFtZSBhbmQgYSBuZXcgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlRvIGRlY2xhcmUgYSB2YXJpYWJsZSwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBhbmQgdHlwZQotdGhlIHZhcmlhYmxlJ3MgbmFtZSwgZGVzY3JpcHRpb24sIGFuZCBkZWZhdWx0IHZhbHVlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlRvIGVkaXQgYW4gZXhpc3RpbmcgdmFyaWFibGUsIHR5cGUgb3ZlciB0aGUgZXhpc3RpbmcgdmFsdWVzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlRvIGVkaXQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlIFBhdHRlcm48L3NwYW4+IGZpZWxkLCB0eXBlCi1pbnRvIHRoZSBmaWVsZCwgY3V0IGFuZCBwYXN0ZSBpbnRvIHRoZSBmaWVsZCwgb3IsIGlmIHlvdSBoYXZlIGRlZmluZWQgb25lCi1vciBtb3JlIHZhcmlhYmxlcywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvc3Bhbj4gYnV0dG9uLAotYW5kIGRvdWJsZS1jbGljayB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB5b3Ugd2FudCB0byBpbnNlcnQuPC9zcGFuPiBGb3IKLWV4YW1wbGUsIGlmIHlvdSBoYXZlIGRlY2xhcmUgdmFyaWFibGVzIG5hbWVkIDx2YXIgY2xhc3M9InZhcm5hbWUiPnVyaTwvdmFyPiBhbmQgPHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+LAotY2xpY2tpbmcgdGhlIGJ1dHRvbiBicmluZ3MgdXAgYSBtZW51IHRoYXQgY29udGFpbnMgdGhvc2UgbmFtZXMuIERvdWJsZS1jbGlja2luZyA8dmFyIGNsYXNzPSJ2YXJuYW1lIj51cmk8L3Zhcj4gaW5zZXJ0cyA8c2FtcCBjbGFzcz0iY29kZXBoIj4ke3VyaX08L3NhbXA+LAotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxwcmU+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICUmZ3Q7PC9wcmU+Ci0gTGF0ZXIsIHdoZW4geW91IGluc2VydCB0aGUgc25pcHBldCBpbnRvIGEgZmlsZSwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHt1cml9PC9zYW1wPiBhbmQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHtwcmVmaXh9PC9zYW1wPiBhcmUKLWVhY2ggY29udmVydGVkIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGRlY2xhcmVkIGluIHRoZSBWYXJpYWJsZXMgdGFibGUuIFVzZXJzCi1jYW4gcmVwbGFjZSB0aGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBUZW1wbGF0ZTo8L3NwYW4+PHZhciBjbGFzcz0idmFybmFtZSI+SXRlbV9uYW1lPC92YXI+IGRpYWxvZwotYXQgaW5zZXJ0aW9uIHRpbWUuPC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj5UaGUgbW9kaWZpZWQgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBhcHByb3ByaWF0ZQotZHJhd2VyLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxwPjxiIGNsYXNzPSJyZWxjb25jZXB0c2hkIj5SZWxhdGVkIGNvbmNlcHRzPC9iPjxiciAvPgotPGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBTbmlwcGV0cyB2aWV3LiI+U25pcHBldHMgdmlldzwvYT48YnIgLz4KLTwvcD4KLTxwPjxiIGNsYXNzPSJyZWx0YXNrc2hkIj5SZWxhdGVkIHRhc2tzPC9iPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyNi5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS4iPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gYWRkIGEgbmV3IGl0ZW0gdG8gYSBkcmF3ZXIgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PGJyIC8+Ci08L3A+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE0NWVhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyMyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5IYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudA0KLWFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyDQotdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFucw0KLWluIEpTUCBhbmQgSFRNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5KU1AgZmlsZXM8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0IGVuYWJsZW1lbnQ8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PGluZGV4dGVybT5lbmFibGluZyBmb3IgSlNQIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBlbmFibGUgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+VG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJ1aWxkIHBhdGggaXMgY29ycmVjdCwgc2VsZWN0IDx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPiBmcm9tDQotdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+SmF2YSBCdWlsZCBQYXRoPC91aWNvbnRyb2w+LCBhbmQgdGhlbiB0aGUgPHVpY29udHJvbD5MaWJyYXJpZXM8L3VpY29udHJvbD4gcGFnZS4gPC9jbWQ+DQotPGluZm8+WW91IHNob3VsZCBzZWUgdGhlIGZvbGxvd2luZyBmaWxlczo8dWw+DQotPGxpPmoyZWUuamFyPC9saT4NCi08bGk+cnQuamFyIDwvbGk+DQotPGxpPnNlcnZsZXQuamFyPC9saT4NCi08bGk+d2ViY29udGFpbmVyLmphcjwvbGk+DQotPC91bD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgdGhleSBhcmUgbm90IHByZXNlbnQsIGFkZCB0aGVtIGFzIEV4dGVybmFsIEpBUiBmaWxlcy4gWW91IG1heQ0KLWhhdmUgeW91ciBvd24gdmVyc2lvbnMgb2YgdGhlc2UgZmlsZXMsIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgSkRLIG9yIFNlcnZsZXQNCi1BUEkgZm9yIHdoaWNoIHlvdSBhcmUgZGV2ZWxvcGluZy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgcmVmZXJlbmNlIG90aGVyIEpBUnMsIHlvdSBjYW4gcGxhY2UgdGhlbQ0KLWluIHRoZSBidWlsZCBwYXRoIGFzIGZvbGxvd3M6PC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+VXNlIHRoZSA8dWljb250cm9sPkFkZCBKQVJzPC91aWNvbnRyb2w+IGJ1dHRvbiBvbiB0aGUgTGlicmFyeQ0KLXBhZ2UuIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKQVIgZmlsZSBpcyBhdmFpbGFibGUgdG8gdGhlIHNlcnZlciBieSBwcm9wZXJseQ0KLWNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+QWRkIHRoZSBKQVJzIHRvIHRoZSA8ZmlsZXBhdGg+V0VCLUlORi9saWI8L2ZpbGVwYXRoPiBkaXJlY3RvcnkuDQotVGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGJ1aWxkIHBhdGggYW5kIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXINCi1pbiBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IFdBUi48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiPjxsaW5rdGV4dD5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOTNkZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPk1ha2luZyBjb250ZW50IGFzc2lzdCB3b3JrIGZvciBKU1AgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjMiPjxhIG5hbWU9InRzcmNlZHQwMjMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQIGZpbGVzPC9oMT4KLTxkaXY+PHA+SGF2aW5nIHRoZSBwcm9wZXIgZmlsZXMgZGVmaW5lZCBpbiB0aGUgSmF2YZkgYnVpbGQgY2xhc3MgcGF0aCBpcyBlc3NlbnRpYWwgZm9yCi1jb250ZW50IGFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZQotbGlua3MgYnVpbGRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMKLWluIEpTUCBhbmQgSFRNTCBmaWxlcy48L3A+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj5UbyBtYWtlIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUCBmaWxlczo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+VG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJ1aWxkIHBhdGggaXMgY29ycmVjdCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+IGZyb20KLXRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhIEJ1aWxkIFBhdGg8L3NwYW4+LCBhbmQgdGhlbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGlicmFyaWVzPC9zcGFuPiBwYWdlLiA8L3NwYW4+IFlvdSBzaG91bGQgc2VlIHRoZSBmb2xsb3dpbmcgZmlsZXM6PHVsPjxsaT5qMmVlLmphcjwvbGk+Ci08bGk+cnQuamFyIDwvbGk+Ci08bGk+c2VydmxldC5qYXI8L2xpPgotPGxpPndlYmNvbnRhaW5lci5qYXI8L2xpPgotPC91bD4KLTwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SWYgdGhleSBhcmUgbm90IHByZXNlbnQsIGFkZCB0aGVtIGFzIEV4dGVybmFsIEpBUiBmaWxlcy4gWW91IG1heQotaGF2ZSB5b3VyIG93biB2ZXJzaW9ucyBvZiB0aGVzZSBmaWxlcywgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiBKREsgb3IgU2VydmxldAotQVBJIGZvciB3aGljaCB5b3UgYXJlIGRldmVsb3BpbmcuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SWYgeW91ciBXZWIgYXBwbGljYXRpb25zIHJlZmVyZW5jZSBvdGhlciBKQVJzLCB5b3UgY2FuIHBsYWNlIHRoZW0KLWluIHRoZSBidWlsZCBwYXRoIGFzIGZvbGxvd3M6PC9zcGFuPjxvbCB0eXBlPSJhIj48bGk+PHNwYW4+VXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgSkFSczwvc3Bhbj4gYnV0dG9uIG9uIHRoZSBMaWJyYXJ5Ci1wYWdlLiBZb3UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgSkFSIGZpbGUgaXMgYXZhaWxhYmxlIHRvIHRoZSBzZXJ2ZXIgYnkgcHJvcGVybHkKLWNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+QWRkIHRoZSBKQVJzIHRvIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPldFQi1JTkYvbGliPC9zcGFuPiBkaXJlY3RvcnkuCi1UaGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgYnVpbGQgcGF0aCBhbmQgZGVwbG95ZWQgdG8gdGhlIHNlcnZlcgotaW4gYXMgcGFydCBvZiB0aGUgcHJvamVjdCBXQVIuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48YnIgLz4KLTxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PGJyIC8+Ci08L3A+Ci08cD48YiBjbGFzcz0icmVsdGFza3NoZCI+UmVsYXRlZCB0YXNrczwvYj48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCIgdGl0bGU9IlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI4Lmh0bWwiIHRpdGxlPSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwgb3IgWE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PGJyIC8+Ci08L3A+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDc1ZTk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5IVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZA0KLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcw0KLXByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkhUTUw8aW5kZXh0ZXJtPnRlbXBsYXRlczxpbmRleHRlcm0+cmVtb3Zpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPnRlbXBsYXRlczxpbmRleHRlcm0+SFRNTDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSB3b3JrIG9uIGEgZ3JvdXAgb2YgSFRNTCBwYWdlcyB0aGF0IHNob3VsZA0KLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMNCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUNCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0DQotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLikgVGhlbiBzZWxlY3QNCi10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91DQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBIVE1MIG9yIFhIVE1MIGZpbGUuPC9wPjxwPlRvIGFkZA0KLWEgbmV3IEhUTUwgdGVtcGxhdGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIFRlbXBsYXRlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uDQotb2YgdGhlIHRlbXBsYXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVzaW5nIHRoZSA8dWljb250cm9sPkNvbnRleHQ8L3VpY29udHJvbD4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkNCi10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudA0KLWFzc2lzdCBpcyByZXF1ZXN0ZWQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlDQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQ0KLWluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5WYXJpYWJsZTwvdWljb250cm9sPiBidXR0b24NCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L2NtZD48c3RlcHhtcD5Gb3IgZXhhbXBsZSwgdGhlIDx2YXJuYW1lPndvcmRfc2VsZWN0aW9uPC92YXJuYW1lPiB2YXJpYWJsZQ0KLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLA0KLWFuZCB0aGUgPHZhcm5hbWU+Y3Vyc29yPC92YXJuYW1lPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbA0KLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L3N0ZXB4bXA+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlDQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQ0KLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUNCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+PHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQ0KLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXINCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrDQotaXRzIGNoZWNrIGJveC48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDBlZDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjQiPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9oMT4KLTxkaXY+PHA+SFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQKLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcwotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPjxkaXYgY2xhc3M9InNraXBzcGFjZSI+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBIVE1MIHBhZ2VzIHRoYXQgc2hvdWxkCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUKLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQKLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLikgVGhlbiBzZWxlY3QKLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UKLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gSFRNTCBvciBYSFRNTCBmaWxlLjwvcD4KLTxwPlRvIGFkZAotYSBuZXcgSFRNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBUZW1wbGF0ZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uCi1vZiB0aGUgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+VXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5Ci10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudAotYXNzaXN0IGlzIHJlcXVlc3RlZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+d29yZF9zZWxlY3Rpb248L3Zhcj4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLAotYW5kIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5jdXJzb3I8L3Zhcj4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwKLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyOS5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCBvciBYTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTA1NDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+U2V0dGluZyBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHByZWZlcmVuY2VzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+cHJlZmVyZW5jZSBzZXR0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5Zb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIHdvcmtpbmcgZW52aXJvbm1lbnQgYnkgc3BlY2lmeWluZyBwcmVmZXJlbmNlcw0KLWZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIG1haW4gbWVudSwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBvbmUgb2YgdGhlIGNob2ljZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZTo8L2NtZD4NCi08Y2hvaWNldGFibGUgcmVsY29sd2lkdGg9IjEwKiAzMCoiPg0KLTxjaGhlYWQ+PGNob3B0aW9uaGQ+SXRlbTwvY2hvcHRpb25oZD48Y2hkZXNjaGQ+TWVudSBwYXRoPC9jaGRlc2NoZD48L2NoaGVhZD4NCi08Y2hyb3c+PGNob3B0aW9uPkFubm90YXRpb24gc2V0dGluZ3M8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PHVpY29udHJvbD5Bbm5vdGF0aW9uczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkNoYXJhY3RlciBlbmNvZGluZzwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+LA0KLXRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hvaWNlczogPHVpY29udHJvbD5DU1MgRmlsZXM8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+SFRNTA0KLUZpbGVzPC91aWNvbnRyb2w+LCA8dWljb250cm9sPkpTUCBGaWxlczwvdWljb250cm9sPiwgPHVpY29udHJvbD4qWE1MIEZpbGVzDQotKCAqbm90IGltcGxlbWVudGVkIGluIFdUUCk8L3VpY29udHJvbD48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q29udGVudCBhc3Npc3Q6IEhUTUw8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2ViDQotYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBTb3VyY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Db250ZW50IGFzc2lzdDogSmF2YVNjcmlwdDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SmF2YVNjcmlwdCBGaWxlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SmF2YVNjcmlwdCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Db250ZW50IGFzc2lzdDogWE1MPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPipYTUwgRmlsZXMgKCpub3QgaW1wbGVtZW50ZWQgaW4gV1RQKTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MIFNvdXJjZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBhcHBlYXJhbmNlPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+QXBwZWFyYW5jZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBmb250PC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+Q29sb3JzIGFuZCBGb250czwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBuYXZpZ2F0aW9uPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+TmF2aWdhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkZpbGUtdHlwZS1zcGVjaWZpYyBzZXR0aW5nczwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD4sIHRoZW4gbmF2aWdhdGUgdG8gdGhlIGZpbGUgdHlwZSBhbmQgcGFydGljdWxhciBzZXR0aW5nPC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkhvdmVyIGhlbHA8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Ib3ZlcnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5LZXkgYmluZGluZ3M8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5LZXlzPC91aWNvbnRyb2w+PHVpY29udHJvbD5LZXlib2FyZCBTaG9ydGN1dHM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiB0aGVuDQotaW4gdGhlIDx1aWNvbnRyb2w+Q2F0ZWdvcnk8L3VpY29udHJvbD4gZmllbGQgc3BlY2lmeSA8dWljb250cm9sPlNvdXJjZTwvdWljb250cm9sPjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5TcGVsbCBjaGVja2luZzwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPlNwZWxsIENoZWNrPC91aWNvbnRyb2w+PC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPlN5bnRheCBjaGVja2luZzwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3VpY29udHJvbD4NCi08dWljb250cm9sPkFwcGVhcmFuY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiB0aGVuIGNoZWNrIG9yIHVuY2hlY2sgdGhlIDx1aWNvbnRyb2w+QW5hbHl6ZQ0KLWFubm90YXRpb25zIHdoaWxlIHR5cGluZzwvdWljb250cm9sPiBib3guPC9jaGRlc2M+PC9jaHJvdz4NCi08L2Nob2ljZXRhYmxlPg0KLTxpbmZvPjxub3RlPllvdSBjYW5ub3Qgc2V0IDx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD4gcHJlZmVyZW5jZXMNCi11bmxlc3MgdGhlIENvcmUgWE1MIFN1cHBvcnQgY2FwYWJpbGl0eSAoPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5DYXBhYmlsaXRpZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPikgaXMgZW5hYmxlZCwgYW5kIHlvdSBjYW5ub3QNCi1zZXQgcHJlZmVyZW5jZXMgZm9yIERURCBmaWxlcyB1bmxlc3MgdGhlIFhNTCBEZXZlbG9wbWVudCBjYXBhYmlsaXR5IGlzIGVuYWJsZWQuPC9ub3RlPjwvaW5mbz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvcg0KLW1hcmt1cCBsYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDEwLmRpdGEiPjxsaW5rdGV4dD5DaGVja2luZyBzcGVsbGluZzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmMxODQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNSI+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj5Zb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIHdvcmtpbmcgZW52aXJvbm1lbnQgYnkgc3BlY2lmeWluZyBwcmVmZXJlbmNlcwotZm9yIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgbWFpbiBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlNlbGVjdCBvbmUgb2YgdGhlIGNob2ljZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZTo8L3NwYW4+Ci08dGFibGUgYm9yZGVyPSIxIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0icm93cyIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGNsYXNzPSJza2lwc3BhY2UiPgotPHRib2R5PgotPHRyPjx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJkMGUyOSIgd2lkdGg9IjI1JSI+SXRlbTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0iZDBlMzEiIHdpZHRoPSI3NSUiPk1lbnUgcGF0aDwvdGg+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGlkPSJkMGUzNCIgaGVhZGVycz0iZDBlMjkiPjxiPkFubm90YXRpb24gc2V0dGluZ3M8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxIGQwZTM0Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFubm90YXRpb25zPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBpZD0iZDBlNDUiIGhlYWRlcnM9ImQwZTI5Ij48Yj5DaGFyYWN0ZXIgZW5jb2Rpbmc8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxIGQwZTQ1Ij48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4sCi10aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNTUyBGaWxlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwKLUZpbGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQIEZpbGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGlkPSJkMGU2MyIgaGVhZGVycz0iZDBlMjkiPjxiPkNvbnRlbnQgYXNzaXN0OiBIVE1MPC9iPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSBkMGU2MyI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLWFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIFNvdXJjZTwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTc0IiBoZWFkZXJzPSJkMGUyOSI+PGI+Q29udGVudCBhc3Npc3Q6IEphdmFTY3JpcHQ8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxIGQwZTc0Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmFTY3JpcHQgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdCBTb3VyY2U8L3NwYW4+PC9zcGFuPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGlkPSJkMGU4NSIgaGVhZGVycz0iZDBlMjkiPjxiPkNvbnRlbnQgYXNzaXN0OiBYTUw8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxIGQwZTg1Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIFNvdXJjZTwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTk2IiBoZWFkZXJzPSJkMGUyOSI+PGI+RWRpdG9yIGFwcGVhcmFuY2U8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxIGQwZTk2Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwZWFyYW5jZTwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTEwOSIgaGVhZGVycz0iZDBlMjkiPjxiPkVkaXRvciBmb250PC9iPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSBkMGUxMDkiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbG9ycyBhbmQgRm9udHM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTEyMCIgaGVhZGVycz0iZDBlMjkiPjxiPkVkaXRvciBuYXZpZ2F0aW9uPC9iPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSBkMGUxMjAiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYXZpZ2F0aW9uPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBpZD0iZDBlMTMzIiBoZWFkZXJzPSJkMGUyOSI+PGI+RmlsZS10eXBlLXNwZWNpZmljIHNldHRpbmdzPC9iPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSBkMGUxMzMiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotYW5kIFhNTDwvc3Bhbj4sIHRoZW4gbmF2aWdhdGUgdG8gdGhlIGZpbGUgdHlwZSBhbmQgcGFydGljdWxhciBzZXR0aW5nPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTE0MCIgaGVhZGVycz0iZDBlMjkiPjxiPkhvdmVyIGhlbHA8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxIGQwZTE0MCI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhvdmVyczwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTE1MyIgaGVhZGVycz0iZDBlMjkiPjxiPktleSBiaW5kaW5nczwvYj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMzEgZDBlMTUzIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXlzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleWJvYXJkIFNob3J0Y3V0czwvc3Bhbj48L3NwYW4+IHRoZW4KLWluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DYXRlZ29yeTwvc3Bhbj4gZmllbGQgc3BlY2lmeSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2U8L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgaWQ9ImQwZTE3MCIgaGVhZGVycz0iZDBlMjkiPjxiPlNwZWxsIGNoZWNraW5nPC9iPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUzMSBkMGUxNzAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWxsIENoZWNrPC9zcGFuPjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGlkPSJkMGUxNzYiIGhlYWRlcnM9ImQwZTI5Ij48Yj5TeW50YXggY2hlY2tpbmc8L2I+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTMxIGQwZTE3NiI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGVhcmFuY2U8L3NwYW4+PC9zcGFuPiB0aGVuIGNoZWNrIG9yIHVuY2hlY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFuYWx5emUKLWFubm90YXRpb25zIHdoaWxlIHR5cGluZzwvc3Bhbj4gYm94LjwvdGQ+Ci08L3RyPgotPC90Ym9keT48L3RhYmxlPgotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6IDwvc3Bhbj5Zb3UgY2Fubm90IHNldCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gcHJlZmVyZW5jZXMKLXVubGVzcyB0aGUgQ29yZSBYTUwgU3VwcG9ydCBjYXBhYmlsaXR5ICg8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DYXBhYmlsaXRpZXM8L3NwYW4+PC9zcGFuPikgaXMgZW5hYmxlZCwgYW5kIHlvdSBjYW5ub3QKLXNldCBwcmVmZXJlbmNlcyBmb3IgRFREIGZpbGVzIHVubGVzcyB0aGUgWE1MIERldmVsb3BtZW50IGNhcGFiaWxpdHkgaXMgZW5hYmxlZC48L2Rpdj4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjxwPjxiIGNsYXNzPSJyZWxjb25jZXB0c2hkIj5SZWxhdGVkIGNvbmNlcHRzPC9iPjxiciAvPgotPGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48YnIgLz4KLTwvcD4KLTxwPjxiIGNsYXNzPSJyZWx0YXNrc2hkIj5SZWxhdGVkIHRhc2tzPC9iPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIFdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUgc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlIHRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyIHRleHQuIj5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yCi1tYXJrdXAgbGFuZ3VhZ2VzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAxMC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+Q2hlY2tpbmcgc3BlbGxpbmc8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MIG9yIFhNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjxiciAvPgotPC9wPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZTQyZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nDQotb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGgNCi1maWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzDQotdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNuaXBwZXRzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+ZWRpdGluZzxpbmRleHRlcm0+cmV1c2Ugd2l0aCBzbmlwcGV0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+SmF2YVNjcmlwdDxpbmRleHRlcm0+cmV1c2Ugd2l0aCBzbmlwcGV0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+SlNQIGNvZGU8aW5kZXh0ZXJtPnJldXNlIHdpdGggc25pcHBldHM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPkpTUCB0YWdzPGluZGV4dGVybT5jdXN0b208aW5kZXh0ZXJtPnJldXNlIHdpdGggc25pcHBldHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPkhUTUw8aW5kZXh0ZXJtPnJldXNlIHdpdGggc25pcHBldHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PkluIHRoZSBTbmlwcGV0cyB2aWV3IHlvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvY29udGV4dD4NCi08c3RlcHMtdW5vcmRlcmVkPg0KLTxzdGVwPjxjbWQ+QWRkIHNuaXBwZXRzIGRyYXdlcnM8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5BZGQgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVkaXQgc25pcHBldCBpdGVtczwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkRlbGV0ZSBvciBoaWRlIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VyczwvY21kPjwvc3RlcD4NCi08L3N0ZXBzLXVub3JkZXJlZD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDAxLmRpdGEiPjxsaW5rdGV4dD5TbmlwcGV0cyB2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjIuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgc25pcHBldCBpdGVtczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTYuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yDQotZHJhd2VyczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjFmMWQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNiI+PGEgbmFtZT0idHNyY2VkdDAyNiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+VGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcKLW9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0mSwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzCi1hbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzCi10aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuPC9wPjxkaXYgY2xhc3M9InNraXBzcGFjZSI+SW4gdGhlIFNuaXBwZXRzIHZpZXcgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9kaXY+Ci08dWw+PGxpPjxzcGFuPkFkZCBzbmlwcGV0cyBkcmF3ZXJzPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+QWRkIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5FZGl0IHNuaXBwZXQgaXRlbXM8L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5EZWxldGUgb3IgaGlkZSBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L3NwYW4+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFNuaXBwZXRzIHZpZXcuIj5TbmlwcGV0cyB2aWV3PC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE0Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiI+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBhZGQgYSBuZXcgaXRlbSB0byBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gbW9kaWZ5IHRoZSB0ZW1wbGF0ZSBjb2RlIHRoYXQgaXMgaW4gYW4gaXRlbSBpbiBhIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldy4iPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MIG9yIFhNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCBvciBYTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9hPjxiciAvPgotPC9wPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjOTVmOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5BZGRpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Db250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsDQotdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLA0KLWN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlczxpbmRleHRlcm0+YWRkaW5nIGFuZCByZW1vdmluZyB0ZW1wbGF0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRlbXBsYXRlcyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIG1hcmt1cCBsYW5ndWFnZXM6PHVsPg0KLTxsaT5IVE1MIG9yIFhIVE1MPC9saT4NCi08bGk+SlNQPC9saT4NCi08L3VsPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjguZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjkuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU4NDVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNyI+PGEgbmFtZT0idHNyY2VkdDAyNyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+Q29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLAotdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLAotY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj5UZW1wbGF0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBtYXJrdXAgbGFuZ3VhZ2VzOjx1bD48bGk+SFRNTCBvciBYSFRNTDwvbGk+Ci08bGk+SlNQPC9saT4KLTxsaT5YTUw8L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxwPjxiIGNsYXNzPSJyZWxjb25jZXB0c2hkIj5SZWxhdGVkIGNvbmNlcHRzPC9iPjxiciAvPgotPGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48YnIgLz4KLTwvcD4KLTxwPjxiIGNsYXNzPSJyZWx0YXNrc2hkIj5SZWxhdGVkIHRhc2tzPC9iPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyNC5odG1sIiB0aXRsZT0iSFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAyOS5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9hPjxiciAvPgotPGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCBvciBYTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48YnIgLz4KLTwvcD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzMyNTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI4IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+SlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZA0KLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcw0KLXByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkpTUCB0ZW1wbGF0ZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+cmVtb3Zpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPnRlbXBsYXRlczxpbmRleHRlcm0+SlNQPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIEpTUCBwYWdlcyB0aGF0IHNob3VsZA0KLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMNCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUNCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0DQotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLikgVGhlbiBzZWxlY3QNCi10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91DQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhIEpTUCBmaWxlLjwvcD48cD5UbyBhZGQgYSBuZXcgSlNQIHRlbXBsYXRlLA0KLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5KU1AgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkpTUCBUZW1wbGF0ZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RW50ZXIgdGhlIG5ldyB0ZW1wbGF0ZSBuYW1lIChhIHRleHQgc3RyaW5nKSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbg0KLW9mIHRoZSB0ZW1wbGF0ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Vc2luZyB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5DQotdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQNCi1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQ0KLXRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgKHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSkgdG8gYmUNCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+VmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uDQotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuPC9jbWQ+PHN0ZXB4bXA+Rm9yIGV4YW1wbGUsIHRoZSA8dmFybmFtZT53b3JkX3NlbGVjdGlvbjwvdmFybmFtZT4gdmFyaWFibGUNCi1pbmRpY2F0ZXMgdGhlIHdvcmQgdGhhdCBpcyBzZWxlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRlbXBsYXRlIGluc2VydGlvbiwNCi1hbmQgdGhlIDx2YXJuYW1lPmN1cnNvcjwvdmFybmFtZT4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwNCi1iZSBhZnRlciB0aGUgdGVtcGxhdGUgaXMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgZG9jdW1lbnQuPC9zdGVweG1wPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB0aGUgbmV3IHRlbXBsYXRlLjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZQ0KLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUNCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlDQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPjxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUNCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGdvIHRvIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMgcGFnZSBhbmQgdW5jaGVjaw0KLWl0cyBjaGVjayBib3guPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNy5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UNCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI5LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmNGY0NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI4Ij48YSBuYW1lPSJ0c3JjZWR0MDI4Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9oMT4KLTxkaXY+PHA+SlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZAotY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzCi1wcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj4gPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IHdhbnQgdG8gd29yayBvbiBhIGdyb3VwIG9mIEpTUCBwYWdlcyB0aGF0IAotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gWW91IGNhbiBjcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUKLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQKLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLikgVGhlbiB5b3UgY2FuIHNlbGVjdAotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhIEpTUCBmaWxlLjwvcD4KLTxwPlRvIGFkZCBhIG5ldyBKU1AgdGVtcGxhdGUsCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLSA8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBUZW1wbGF0ZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uCi1vZiB0aGUgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+VXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5Ci10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudAotYXNzaXN0IGlzIHJlcXVlc3RlZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+d29yZF9zZWxlY3Rpb248L3Zhcj4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLAotYW5kIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5jdXJzb3I8L3Zhcj4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwKLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMjQuaHRtbCIgdGl0bGU9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI5Lmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MIG9yIFhNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjxiciAvPgotPC9wPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MTc0OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPCEtLSAkSWQ6IHRzcmNlZHQwMjkuZGl0YSx2IDEuNCAyMDA2LzA0LzEzIDIwOjM3OjEzIGJrb3JuIEV4cCAkIC0tPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkDQotY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcw0KLXByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT54bWwgdGVtcGxhdGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48aW5kZXh0ZXJtPnJlbW92aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT50ZW1wbGF0ZXM8aW5kZXh0ZXJtPlhNTDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBYTUwgcGFnZXMgdGhhdCBzaG91bGQNCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zDQotdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlDQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dA0KLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZC4pIFRoZW4gc2VsZWN0DQotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQ0KLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gWE1MIGZpbGUuPC9wPjxwPlRvIGFkZCBhIG5ldyBYTUwNCi10ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBUZW1wbGF0ZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RW50ZXIgdGhlIG5ldyB0ZW1wbGF0ZSBuYW1lIChhIHRleHQgc3RyaW5nKSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbg0KLW9mIHRoZSB0ZW1wbGF0ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Vc2luZyB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5DQotdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQNCi1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQ0KLXRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgKHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSkgdG8gYmUNCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+VmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uDQotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuPC9jbWQ+PHN0ZXB4bXA+Rm9yIGV4YW1wbGUsIHRoZSA8dmFybmFtZT53b3JkX3NlbGVjdGlvbjwvdmFybmFtZT4gdmFyaWFibGUNCi1pbmRpY2F0ZXMgdGhlIHdvcmQgdGhhdCBpcyBzZWxlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRlbXBsYXRlIGluc2VydGlvbiwNCi1hbmQgdGhlIDx2YXJuYW1lPmN1cnNvcjwvdmFybmFtZT4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwNCi1iZSBhZnRlciB0aGUgdGVtcGxhdGUgaXMgaW5zZXJ0ZWQgaW4gdGhlIFhNTCBkb2N1bWVudC48L3N0ZXB4bXA+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlDQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQ0KLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUNCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+PHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQ0KLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXINCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrDQotaXRzIGNoZWNrIGJveC48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjguZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdlOGIzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjciPjxhIG5hbWU9InRzcmNlZHQwMjciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2gxPgotPGRpdj48cD5YTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQKLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMKLXByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+PGRpdiBjbGFzcz0ic2tpcHNwYWNlIj4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIFhNTCBwYWdlcyB0aGF0IHNob3VsZAotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucwotdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0Ci1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZC4pIFRoZW4gc2VsZWN0Ci10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91Ci13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjwvcD4KLTxwPlRvIGFkZCBhIG5ldyBYTUwKLXRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+Ci0gPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgVGVtcGxhdGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPi4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+RW50ZXIgdGhlIG5ldyB0ZW1wbGF0ZSBuYW1lIChhIHRleHQgc3RyaW5nKSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbgotb2YgdGhlIHRlbXBsYXRlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPlVzaW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQotdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQKLWFzc2lzdCBpcyByZXF1ZXN0ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUKLXRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgKHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSkgdG8gYmUKLWluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWFibGU8L3NwYW4+IGJ1dHRvbgotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuPC9zcGFuPiBGb3IgZXhhbXBsZSwgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPndvcmRfc2VsZWN0aW9uPC92YXI+IHZhcmlhYmxlCi1pbmRpY2F0ZXMgdGhlIHdvcmQgdGhhdCBpcyBzZWxlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRlbXBsYXRlIGluc2VydGlvbiwKLWFuZCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+Y3Vyc29yPC92YXI+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsCi1iZSBhZnRlciB0aGUgdGVtcGxhdGUgaXMgaW5zZXJ0ZWQgaW4gdGhlIFhNTCBkb2N1bWVudC48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PHA+PGIgY2xhc3M9InJlbGNvbmNlcHRzaGQiPlJlbGF0ZWQgY29uY2VwdHM8L2I+PGJyIC8+Ci08YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjxiciAvPgotPC9wPgotPHA+PGIgY2xhc3M9InJlbHRhc2tzaGQiPlJlbGF0ZWQgdGFza3M8L2I+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMjQuaHRtbCIgdGl0bGU9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0c3JjZWR0MDI4Lmh0bWwiIHRpdGxlPSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvYT48YnIgLz4KLTxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwgb3IgWE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PGJyIC8+Ci08L3A+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDljYzg0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODA2N2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQotPGNvbnRleHQgaWQ9InN0ZWQwMDAxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4KLVdoZW4gdGhlIDxiPkhpZ2hsaWdodCBtYXRjaGluZyBicmFja2V0czwvYj4gb3B0aW9uIGlzIHNlbGVjdGVkLCB3aGVuZXZlciB0aGUgY3Vyc29yIGlzIG5leHQgdG8gYSBicmFja2V0IG9yIGN1cmx5IGJyYWNlcywgaXRzIG9wZW5pbmcgb3IgY2xvc2luZyBjb3VudGVyIHBhcnQgaXMgaGlnaGxpZ2h0ZWQuCi1TZWxlY3QgdGhlIDxiPlJlcG9ydCBwcm9ibGVtcyBhcyB5b3UgdHlwZTwvYj4gY2hlY2sgYm94IHRvIHVwZGF0ZSB2YWxpZGl0eSBhbm5vdGF0aW9ucyAodGVtcG9yYXJ5IGFubm90YXRpb25zLCBzdWNoIGFzIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyBiYXNlZCBvbiBhIERURCwgdGhhdCBnbyBhd2F5IHdoZW4gdGhlIGVkaXRvciBpcyBjbG9zZWQsIG9yIHRoZSBwcm9ibGVtIGlzIGZpeGVkKSBhcyB0aGUgdXNlciB0eXBlcy4KLUluIHRoZSA8Yj5BcHBlYXJhbmNlIGNvbG9yIG9wdGlvbnM8L2I+IHRhYmxlLCB5b3UgY2FuIGFkanVzdCB2YXJpb3VzIGVkaXRvciBhcHBlYXJhbmNlIGZlYXR1cmVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InN0ZWQwMDAzIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIGhvdmVyIHRleHQgaW4gdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXNwZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDEwIj4KLTxkZXNjcmlwdGlvbj5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgdG8gZmluaXNoIHRhZ3Mgb3IgbGluZXMgb2YgY29kZSBhbmQgaW5zZXJ0IHRlbXBsYXRlcy4gRGVwZW5kaW5nIG9uIHRoZSBzb3VyY2UgbWFya3VwIGxhbmd1YWdlLCB0aGUgY2hvaWNlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgYXJlIGJhc2VkIG9uIHRhZ3MgZGVmaW5lZCBieSBEVEQgYW5kIHNjaGVtYSBmaWxlcywgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMsIG9yIGNvbnRlbnQgbW9kZWwgc3RhbmRhcmQgdGhhdCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4gSFRNTCBjb250ZW50IGFzc2lzdCBjaG9pY2VzIGFyZSBiYXNlZCBvbiB0aGUgVzNDIEhUTUwgNC4wMSBjb250ZW50IG1vZGVsLgotCi1JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcyBpcyBkaXNwbGF5ZWQuIFRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCBhdmFpbGFibGUgY29tcGxldGlvbnMgZm9yIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gQ29udGVudCBhc3Npc3QgaXMgYWxzbyBhdmFpbGFibGUgYnkgcHJlc3NpbmcgQ3RybCtTcGFjZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNvbnRlbnQgYXNzaXN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDMwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZm9ybWF0IGFuIGVudGlyZSBkb2N1bWVudC4gRm9ybWF0dGluZyByZXN0b3JlcyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gYW5kIHBvc2l0aW9uaW5nLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG9mZnNldCBkdXJpbmcgZWRpdGluZywgdG8gc2VlIG5lc3RpbmcgaGllcmFyY2hpZXMgYW5kIHJlbGF0aW9uc2hpcHMgbW9yZSBjbGVhcmx5IGluIHRoZSBmaWxlLiBFZGl0IHRoZSBhcHByb3ByaWF0ZSBQcmVmZXJlbmNlcyBwYWdlcyB0byBtYWtlIGNoYW5nZXMgaW4gc3BlY2lmaWMgZm9ybWF0dGluZyBiZWhhdmlvci4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTA0MCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIGZvcm1hdCBzZWxlY3RlZCBlbGVtZW50cy4gRm9ybWF0dGluZyByZXN0b3JlcyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gYW5kIHBvc2l0aW9uaW5nLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG9mZnNldCBkdXJpbmcgZWRpdGluZywgdG8gc2VlIG5lc3RpbmcgaGllcmFyY2hpZXMgYW5kIHJlbGF0aW9uc2hpcHMgbW9yZSBjbGVhcmx5IGluIHRoZSBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDcwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+UHJvcGVydGllczwvYj4gdmlldywgd2hpY2ggZGlzcGxheXMgcHJvcGVydGllcyByZWxldmFudCB0byB0aGUgY3VycmVudCBlbGVtZW50IGlmIGFueSBleGlzdC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlByb3BlcnRpZXMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3Byb3B2aWV3Lmh0bSIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0yMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIHRleHQgZmlsZSB0aGF0IGlzIGNvZGVkIGluIGEgbWFya3VwIGxhbmd1YWdlLiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLiBGb3IgYSBtb3JlIHNwZWNpZmljIGxpc3Qgb2YgZWRpdGluZyBmZWF0dXJlcywgc2VlIHRoZSBmaXJzdCBsaW5rIGJlbG93LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRhc2sgdGFnIGRpc2NvdmVyeSBpbiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iZWNzczAwMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBDU1Mgc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBjYXNjYWRpbmcgc3R5bGUgc2hlZXQuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9Im1pc2MwMTgwIj4KLSA8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGVkaXQgdGhlIENTUyBjb250ZW50IHNldHRpbmdzIGZvciBhIENTUyBmaWxlLiBZb3UgY2FuIHNwZWNpZnkgQ1NTIHByb2ZpbGUgb3IgcmVzdG9yZSB0aGUgZGVmYXVsdCBieSBjbGlja2luZyA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLSA8L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNzc0NvbnRleHRzMi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDc3NDb250ZXh0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGJjMzlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNzc0NvbnRleHRzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzc3NvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgQ1NTIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgY2FzY2FkaW5nIHN0eWxlIHNoZWV0LiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJlY3NzMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIENTUyBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGNhc2NhZGluZyBzdHlsZSBzaGVldC4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0gPGNvbnRleHQgaWQ9Im1pc2MwMTgwIj4KLSA8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGVkaXQgdGhlIENTUyBjb250ZW50IHNldHRpbmdzIGZvciBhIENTUyBmaWxlLiBZb3UgY2FuIHNwZWNpZnkgQ1NTIHByb2ZpbGUgb3IgcmVzdG9yZSB0aGUgZGVmYXVsdCBieSBjbGlja2luZyA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLSA8L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTRmNWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZDQ3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBFZGl0b3JDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JDc3NDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGYzMDZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFNTRSBpbmZvcG9wcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM3OTZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckNzc0NvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzRhNmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmEwMzc3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBTdGF0aWMgV2ViIGluZm9wb3AKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjBmNDAzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0id2VidzIwMDAiPgotPGRlc2NyaXB0aW9uPiBVc2UgdGhpcyBwYWdlIHRvIG5hbWUgeW91ciBXZWIgcHJvamVjdCBhbmQgc3BlY2lmeSB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gKHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVzb3VyY2VzIHlvdSBjcmVhdGUgYXJlIHN0b3JlZC4pIFdoZW4gdGhlIFVzZSBkZWZhdWx0IGNoZWNrIGJveCBpcyBzZWxlY3RlZCwgdGhlIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiB3aGVyZSB5b3VyIHdvcmtzcGFjZSByZXNpZGVzLiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gbG9jYXRpb24sIGNsZWFyIHRoZSBjaGVja2JveCBhbmQgbG9jYXRlIHRoZSBwYXRoIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gVG8gY29uZmlndXJlIGFkZGl0aW9uYWwgb3B0aW9ucywgc2VsZWN0IHRoZSA8Yj5OZXh0PC9iPiBidXR0b24uCi1JbiB0aGUgVGFyZ2V0IFJ1bnRpbWUgZmllbGQsIHNlbGVjdCB0aGUgc2VydmVyIHdoZXJlIHlvdSB3YW50IHRvIHB1Ymxpc2ggdGhlIFdlYiBwcm9qZWN0LiBpZiBhIHNlcnZlciBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8Yj5OZXc8L2I+IHRvIHNlbGVjdCBhIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50LiA8L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ3MjEwMCI+Ci08ZGVzY3JpcHRpb24+UHJlc2V0cyBhcmUgdXNlZCB0byBkZWZpbmUgYSBkZWZhdWx0IHNldCBvZiBmYWNldCB2ZXJzaW9ucyB0aGF0IHdpbGwgY29uZmlndXJlIGEgcHJvamVjdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZGV2ZWxvcG1lbnQuIFRoZSBTdGF0aWMgV2ViIE1vZHVsZSBmYWNldCBlbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgc3RhdGljCi1XZWIgbW9kdWxlLiBDbGljayBTaG93IFJ1bnRpbWVzIHRvIHZpZXcgdGhlIGF2YWlsYWJsZSBydW50aW1lcyBhbmQgcnVudGltZSBjb21wb3NpdGlvbnMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VidzIyMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBXZWIgY29udGVudCBmb2xkZXIgaXMgd2hlcmUgdGhlIGVsZW1lbnRzIG9mIHlvdXIgV2ViIHNpdGUgc3VjaCBhcyBXZWIgcGFnZXMsIGdyYXBoaWNzIGFuZCBzdHlsZSBzaGVldHMgYXJlIHN0b3JlZC4gVGhpcyBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB5b3VyIFdlYiBzaXRlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIGF0IGRlcGxveW1lbnQgYW5kIHRoYXQgbGluayB2YWxpZGF0aW9uIHdpbGwgd29yayBjb3JyZWN0bHkuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhOTNkOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBTdGF0aWNXZWJXaXpDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxZDJkZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICAgID0gU3RhdGljIFdlYiBpbmZvcG9wCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWMwMTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgIDxjb250ZXh0cyBmaWxlPSJTdGF0aWNXZWJXaXpDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDc5YmQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1YjE1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTQzMmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDkyMjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3ZWJ0b29sc190b2MueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICB0b3BpY3MvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2ZpeGl0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9maXhpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYWZjM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2ZpeGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ncnB0eXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ncnB0eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkMjQ1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZ3JwdHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbWVudWJ1dHRvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbWVudWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjFhNjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL21lbnVidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25saW51eC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMzVjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9uc2hvd2Vyci5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbnNob3dlcnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJmZGQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9uc2hvd2Vyci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndhcm5pbmcuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253YXJuaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0ZmRmOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmOWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Jyay5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmticmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxNDMzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Jyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtjc3MuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rY3NzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwY2FmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtjc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3ItbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3M2I2YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNjI2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtpbmQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5raW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzZjc1Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtpbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbWFsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua21hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWM0N2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua251bS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI0YTYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua251bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtvdHIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rb3RyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NjU5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtvdHIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rcXVlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3F1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWY5MzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3Rzay5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmt0c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q0N2VlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvc2tpcGl0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9za2lwaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY1YjFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9za2lwaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3ZpZXdsaW5rLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy92aWV3bGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwN2IwNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3ZpZXdsaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmEwMjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgPSBXZWIgdG9vbHMgZG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMTQ5Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+IAotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLSAgIDxwbHVnaW4+IAotICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgICAgIAk8dG9jIGZpbGU9IndlYnRvb2xzX3RvYy54bWwiIC8+IAotICAgICAgICAgCSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAgICAJICAgPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliMWQ0MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5TdGF0aWMgV2ViIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjY3N0YXRpYyI+PGEgbmFtZT0iY2NzdGF0aWMiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3RhdGljIFdlYiBwcm9qZWN0czwvaDE+Ci08ZGl2PjxwPklmIHlvdSAgd2FudCB0byBjcmVhdGUgYSBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiB0aGF0IGRvZXMgbm90IGNvbnRhaW4KLWFueSBkeW5hbWljIGNvbnRlbnQgIChzdWNoIGFzIHNlcnZsZXRzLCBKU1AgZmlsZXMsIGZpbHRlcnMsIGFuZCBhc3NvY2lhdGVkCi1tZXRhZGF0YSkgeW91IG1pZ2h0IHByZWZlciB0byBjcmVhdGUgYSBzdGF0aWMgV2ViIHByb2plY3QsIGFzIG9wcG9zZWQgdG8gYSA8YSBocmVmPSJjY3dlYnByai5odG1sIj5keW5hbWljIFdlYiBwcm9qZWN0PC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJwIj5TdGF0aWMgV2ViIHByb2plY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6ICA8dWw+PGxpPmEgV2ViIGNvbnRlbnQgZm9sZGVyIChjYWxsZWQgV2ViQ29udGVudCkgZm9yIGFsbCBwdWJsaXNoYWJsZSByZXNvdXJjZXMsCi1Zb3UgY2FuIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGZvbGRlciBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUuPC9saT4KLTxsaT5hIFRoZW1lIGZvbGRlciwgdGhlIHN1Z2dlc3RlZCBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cwotYW5kIG90aGVyIHN0eWxlLXJlbGF0ZWQgb2JqZWN0cy48L2xpPgotPGxpPnRoZSBhYmlsaXR5IHRvIGRlZmluZSBmb2xkZXJzIG91dHNpZGUgb2YgdGhlIFdlYiBjb250ZW50IGZvbGRlciwgZm9yIHN0b3JpbmcKLWludGVybWVkaWF0ZSBmaWxlcywgc3VjaCBhcyBNSUYgZmlsZXM8L2xpPgotPGxpPmEgY29udmVyc2lvbiBwYXRoIGZyb20gYSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYSBkeW5hbWljIFdlYiBwcm9qZWN0LgotSWYgeW91IGRlY2lkZSB0byA8YSBocmVmPSJ0d3BjbnZydC5odG1sIj5jb252ZXJ0PC9hPiB0aGUgcHJvamVjdCwgaXQgd2lsbCBiZSBhIGZ1bGx5LXZhbGlkIGR5bmFtaWMKLVdlYiBwcm9qZWN0LiA8L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+SW4gYWRkaXRpb24sIHlvdXIgcHJvamVjdCB3aWxsIHN0aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyAod2hpY2gKLWFyZSBjb21tb24gdG8gYm90aCBzdGF0aWMgYW5kIGR5bmFtaWMgV2ViIHByb2plY3RzICkgOiA8dWw+PGxpPkhUTUwgc3ludGF4IHZhbGlkYXRpb248L2xpPgotPGxpPmEgYnJva2VuIGxpbmsgZml4LXVwIHdpemFyZDwvbGk+Ci08bGk+YSBXZWIgc2l0ZSBuYXZpZ2F0aW9uIHRvb2w8L2xpPgotPGxpPmEgbmV3IHNlcnZlciB0eXBlLCB0aGUgU3RhdGljIFdlYiBzZXJ2ZXIsIHdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gcHVibGlzaAotc3RhdGljIFdlYiBwcm9qZWN0czwvbGk+Ci08L3VsPgotIDwvZGl2PgotPHA+VGhlIGZvbGRlciB0aGF0IGEgc3RhdGljIFdlYiBwcm9qZWN0IGlzIHB1Ymxpc2hlZCB0byBpcyBtb2RpZmlhYmxlLCBzbwotdGhhdCB3aGVuIHlvdSBzZXQgdGhlIHB1Ymxpc2hpbmcgInJvb3QiIHZhbHVlIChjYWxsZWQgYSA8ZW0+Y29udGV4dCByb290PC9lbT4pLAotc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj4vd2ViMTwvc2FtcD4sIGZvciBhIHN0YXRpYyBwcm9qZWN0LCBldmVyeXRoaW5nIGluIHRoZSBXZWIKLWNvbnRlbnQgZm9sZGVyIHdpbGwgYmUgcHVibGlzaGVkIHRvIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYjE8L3NwYW4+IGZvbGRlciB1bmRlcgotdGhlIFdlYiBzZXJ2ZXIncyBkb2Mgcm9vdC4gVGhpcyBlbmFibGVzIHlvdSB0byBncm91cCBXZWIgcmVzb3VyY2VzIG9uIGEgV2ViCi1zZXJ2ZXIgaW4gZm9sZGVycyB0aGF0IGNvcnJlc3BvbmQgdG8gV2ViIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2guIFdoZW4gcHJvamVjdHMKLWRlZmluZWQgaW4gdGhpcyB3YXkgYXJlIHJlYWR5IGZvciBwcm9kdWN0aW9uLCB5b3UgY2FuIHB1Ymxpc2ggc3BlY2lmaWMgcHJvamVjdHMKLWRpcmVjdGx5IHRvIHRoZSBkb2Mgcm9vdCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gPHNhbXAgY2xhc3M9ImNvZGVwaCI+Lzwvc2FtcD4gYW5kIGFsbAotcHVibGlzaGluZywgbGluayBmaXhpbmcsIGFuZCBicm93c2luZyB3aWxsIHVwZGF0ZSBhdXRvbWF0aWNhbGx5LjwvcD4KLTxkaXYgY2xhc3M9InAiPkFsaWFzZXMgY2FuIGFsc28gYmUgdXNlZCB0byBzcGVjaWZ5IGEgY29udGV4dCByb290IHZhbHVlLiBGb3IgZXhhbXBsZSwKLXN1cHBvc2UgdGhhdCB0aGVyZSBpcyBhbiBhbGlhcyB0aGF0IGlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBXZWIgc2VydmVyLCBhcwotZm9sbG93czogPHByZT5BbGlhcyAvc2NyaXB0cy8gIi92YXIvd3d3L3NjcmlwdHMiPC9wcmU+Ci1JbiB0aGlzCi1leGFtcGxlLCBpbiB3aGljaCB0aGUgY3VycmVudCBzdGF0aWMgV2ViIHByb2plY3Qgd2lsbCBjb250YWluIGNvbW1vbiBKYXZhU2NyaXB0JiM4NDgyOyBmaWxlcywKLXlvdSBjYW4gc2V0IHRoZSBjb250ZXh0IHJvb3QgdmFsdWUgdG8gYmUgPHNwYW4+InNjcmlwdHMiPC9zcGFuPi4gIEluIG9yZGVyIGZvcgotdGhlIHJlc291cmNlcyBpbiB0aGUgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGJlIHB1Ymxpc2hlZCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbgotb24gdGhlIFdlYiBzZXJ2ZXIsIHlvdSBtdXN0IGFkZCB0aGlzIEFsaWFzIG1hcHBpbmcgdG8gdGhlIHNlcnZlciB0b29scyBpbnN0YW5jZQotb2YgdGhlIHN0YXRpYyBXZWIgc2VydmVyLCBhcyBmb2xsb3dzLiAgPG9sPjxsaT5Gcm9tIHRoZSBTZXJ2ZXIgdmlldywgZG91YmxlLWNsaWNrIG9uIHRoZSBzdGF0aWMgV2ViIHNlcnZlciBjb25maWd1cmF0aW9uCi10byBvcGVuIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBlZGl0b3IuPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoaXMgYXNzdW1lcyB0aGF0IHlvdSd2ZSBhbHJlYWR5Ci1kZWZpbmVkIHRoZSBzdGF0aWMgV2ViIHNlcnZlci48L2Rpdj4KLTwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxiPkNvbmZpZ3VyYXRpb248L2I+IGVkaXRvciB0YWIuPC9saT4KLTxsaT5TY3JvbGwgZG93biB0byB0aGUgPGI+QWxpYXMgUGF0aCBNYXBwaW5nPC9iPiBzZWN0aW9uLAotYW5kIGFkZCB0aGUgbmV3IEFsaWFzIG1hcHBpbmcuPC9saT4KLTwvb2w+Ci1Ob3cgdGhhdCA8c3Bhbj4ic2NyaXB0cyI8L3NwYW4+IGlzIGRlZmluZWQgYXMgYW4gQWxpYXMsIHRoZSBXZWIgY29udGVudCBpbgotdGhlIHN0YXRpYyBXZWIgcHJvamVjdCB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgbWFwcGVkIHBhdGgsIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+L3Zhci93d3cvc2NyaXB0czwvc3Bhbj4uPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0iY3dlYnJlc291cmNlcy5odG1sIj5XZWIgcmVzb3VyY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjd3dhcm92ci5odG1sIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0idHdjcmVzdGEuaHRtbCI+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjM4NGQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjY3dlYnByaiI+PGEgbmFtZT0iY2N3ZWJwcmoiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvaDE+Ci08ZGl2PjxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgV2ViIHByb2plY3RzOiBkeW5hbWljIGFuZCA8YSBocmVmPSJjY3N0YXRpYy5odG1sIj5zdGF0aWM8L2E+LiBEeW5hbWljIHdlYiBwcm9qZWN0cyBjYW4gY29udGFpbiBkeW5hbWljIEoyRUUKLXJlc291cmNlcyBzdWNoIGFzIHNlcnZsZXRzLCBKU1AgZmlsZXMsIGZpbHRlcnMsIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhLCBpbgotYWRkaXRpb24gdG8gc3RhdGljIHJlc291cmNlcyBzdWNoIGFzIGltYWdlcyBhbmQgSFRNTCBmaWxlcy4gU3RhdGljIHdlYiBwcm9qZWN0cwotb25seSBjb250YWlucyBzdGF0aWMgcmVzb3VyY2VzLiBXaGVuIHlvdSBjcmVhdGUgV2ViIHByb2plY3RzLCB5b3UgY2FuIGluY2x1ZGUKLWNhc2NhZGluZyBzdHlsZSBzaGVldHMgYW5kIEpTUCB0YWcgbGlicmFyaWVzIChmb3IgZHluYW1pYyBXZWIgcHJvamVjdHMpLCBzbwotdGhhdCB5b3UgY2FuIGJlZ2luIGRldmVsb3BtZW50IHdpdGggYSByaWNoZXIgc2V0IG9mIHByb2plY3QgcmVzb3VyY2VzLjwvcD4KLTxwPkR5bmFtaWMgV2ViIHByb2plY3RzIGFyZSBhbHdheXMgaW1iZWRkZWQgaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0cy4KLVRoZSB3aXphcmQgdGhhdCB5b3UgdXNlIHRvIGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3Qgd2lsbCBhbHNvIGNyZWF0ZSBhbgotRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIFRoZSB3aXphcmQKLXdpbGwgYWxzbyB1cGRhdGUgdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+YXBwbGljYXRpb24ueG1sPC9zcGFuPiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLW9mIHRoZSBzcGVjaWZpZWQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGRlZmluZSB0aGUgV2ViIHByb2plY3QKLWFzIGEgbW9kdWxlIGVsZW1lbnQuIElmIHlvdSBhcmUgaW1wb3J0aW5nIGEgV0FSIGZpbGUgcmF0aGVyIHRoYW4gY3JlYXRpbmcKLWEgZHluYW1pYyBXZWIgcHJvamVjdCBuZXcsIHRoZSBXQVIgSW1wb3J0IHdpemFyZCByZXF1aXJlcyB0aGF0IHlvdSBzcGVjaWZ5Ci1hIFdlYiBwcm9qZWN0LCB3aGljaCBhbHJlYWR5IHJlcXVpcmVzIGFuIEVBUiBwcm9qZWN0LiA8L3A+Ci08cD5KMkVFIGNvbnZlbnRpb25zIG1heSByZXByZXNlbnQgZXh0cmEgb3ZlcmhlYWQgaWYgeW91IG9ubHkgd2FudCB0byBjcmVhdGUKLWEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiwgd2hpY2ggY29udGFpbnMgbm8gZHluYW1pYyBmaWxlcywKLXN1Y2ggYXMgSlNQIGZpbGVzIG9yIHNlcnZsZXRzLiBJbiB0aGlzIGNhc2UsIHdoZW4geW91IG5lZWQgb25seSB0aGUgbW9zdCBiYXNpYwotV2ViIHByb2plY3QsIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUgPGVtPnN0YXRpYzwvZW0+IFdlYiBwcm9qZWN0IHR5cGUgKHNlZSA8YSBocmVmPSJjY3N0YXRpYy5odG1sIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPikuICBOb3RlIHRoYXQKLXN0YXRpYyBXZWIgcHJvamVjdHMgY2FuICBiZSBjb252ZXJ0ZWQgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMgYnkgc2VsZWN0aW5nIDxzdHJvbmc+Q29udmVydAotdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC9zdHJvbmc+LCBmcm9tIHRoZSBQcm9qZWN0IG1lbnUuPC9wPgotPHA+VGhlIEoyRUUgbW9kZWwsIGFuZCBtb3JlIHNwZWNpZmljYWxseSwgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSYjODQ4MjsgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LCBkZWZpbmVzIGEgV2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhdAotc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBXZWIgY29udGVudCBmaWxlcywgY2xhc3MgZmlsZXMsIGNsYXNzIHBhdGhzLCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycywgYW5kIHN1cHBvcnRpbmcgbWV0YWRhdGEuIFRoZSBXZWIgcHJvamVjdCBoaWVyYXJjaHkgbWlycm9ycyB0aGF0Ci1vZiB0aGUgV2ViIGFwcGxpY2F0aW9uIGNyZWF0ZWQgZnJvbSBhIHByb2plY3QuIEluIHRoZSB3b3JrYmVuY2gsIHlvdSBjYW4gdXNlCi10aGUgPHNwYW4+TmV3IFdlYiBQcm9qZWN0PC9zcGFuPiB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IFdlYiBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBtYWluIHByb2plY3QgZm9sZGVyIGNvbnRhaW5zIGFsbCBkZXZlbG9wbWVudCBvYmplY3RzIHJlbGF0ZWQgdG8gYSBXZWIKLWFwcGxpY2F0aW9uLiBUaGUgV2ViIGNvbnRlbnQgZm9sZGVyIGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiB0aGUgcHJvamVjdCBuZWNlc3NhcnkKLXRvIGNyZWF0ZSBhIFdlYiBhcHBsaWNhdGlvbi4gVGhpcyBmb2xkZXIgc3RydWN0dXJlIG1hcHMgdG8gdGhlIFdlYiBhcHBsaWNhdGlvbgotYXJjaGl2ZSAoV0FSKSBzdHJ1Y3R1cmUgZGVmaW5lZCBieSBTdW4gTWljcm9zeXN0ZW1zLi4gVGhlIGZvbGxvd2luZyBkZWZhdWx0Ci1lbGVtZW50cyBhcmUgbG9jYXRlZCBpbiB0aGUgV2ViIHByb2plY3QgZm9sZGVyIGhpZXJhcmNoeTogPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEluIHRoZSBQcm9qZWN0Ci1FeHBsb3JlciB2aWV3LCBXZWIgcHJvamVjdHMgYXJlIGZpbHRlcmVkIGludG8gZm9sZGVyIG5vZGVzIHRvIGN1c3RvbWl6ZSB0aGUKLWRpc3BsYXkgb2YgV2ViIHJlc291cmNlcyBmb3IgZWFzeSBtYW5hZ2VtZW50IGR1cmluZyBkZXZlbG9wbWVudC4gRm9yIGluZm9ybWF0aW9uCi1vbiB0aGUgZmlsdGVyZWQgc3RydWN0dXJlLCBzZWUgPGEgaHJlZj0iY2N3ZWJ2dy5odG1sIj5Qcm9qZWN0Ci1FeHBsb3JlciB2aWV3PC9hPi48L2Rpdj4KLTxkbD48ZHQgY2xhc3M9ImRsdGVybSI+V2ViIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZHQ+Ci08ZGQ+VGhlIHN0YW5kYXJkIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+IGZpbGUpLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YVNvdXJjZTwvZHQ+Ci08ZGQ+Q29udGFpbnMgdGhlIHByb2plY3QncyBKYXZhIHNvdXJjZSBjb2RlIGZvciBjbGFzc2VzLCBiZWFucywgYW5kCi1zZXJ2bGV0cy4gV2hlbiB0aGVzZSByZXNvdXJjZXMgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKLWNvbXBpbGVkIGFuZCB0aGUgZ2VuZXJhdGVkIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yeS4KLVRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgbm90IHBhY2thZ2VkIGluIFdBUiBmaWxlcyB1bmxlc3MKLWFuIG9wdGlvbiBpcyBzcGVjaWZpZWQgd2hlbiBhIFdBUiBmaWxlIGlzIGNyZWF0ZWQuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaG91Z2ggdGhlIGRlZmF1bHQKLW5hbWUgZ2l2ZW4gdG8gdGhlIGZvbGRlciBpcyBKYXZhU291cmNlcywgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUgYnkgcmlnaHQtY2xpY2tpbmcgb24gdGhlIG5hbWUgaW4gdGhlIAotUHJvamVjdCBFeHBsb3JlciBhbmQgY2xpY2tpbmcgb24gPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48Yj5SZWZhY3RvcjwvYj4gJmd0OyA8Yj5SZW5hbWU8L2I+PC9zcGFuPi48L2Rpdj4KLTwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+aW1wb3J0ZWRfY2xhc3NlcyBmb2xkZXI8L2R0PgotPGRkPlRoaXMgZm9sZGVyIG1heSBiZSBjcmVhdGVkIGR1cmluZyBhIFdBUiBpbXBvcnQsIGFuZCBjb250YWlucyBjbGFzcyBmaWxlcwotdGhhdCBkbyBub3QgaGF2ZSBhY2NvbXBhbnlpbmcgc291cmNlLiAgVGhlIDxiPmltcG9ydGVkX2NsYXNzZXM8L2I+IGZvbGRlcgotaXMgYSBKYXZhIGNsYXNzZXMKLWZvbGRlcjsgSmF2YSBjbGFzc2VzIGZvbGRlcnMgY2FuIGFsc28gYmUgY3JlYXRlZCB1c2luZyB0aGUgV2ViCi1wcm9qZWN0IDxiPkphdmEgQnVpbGQgUGF0aDwvYj4gcHJvcGVydGllcyBwYWdlLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+V2ViQ29udGVudCBmb2xkZXI8L2R0PgotPGRkPlRoZSBtYW5kYXRvcnkgbG9jYXRpb24gb2YgYWxsIFdlYiByZXNvdXJjZXMsIGluY2x1ZGluZyBIVE1MLCBKU1AsIGdyYXBoaWMKLWZpbGVzLCBhbmQgc28gb24uIElmIHRoZSBmaWxlcyBhcmUgbm90IHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSAob3IgaW4gYSBzdWJkaXJlY3RvcnkKLXN0cnVjdHVyZSB1bmRlciB0aGlzIGRpcmVjdG9yeSksIHRoZSBmaWxlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUgd2hlbiB0aGUKLWFwcGxpY2F0aW9uIGlzIGV4ZWN1dGVkIG9uIGEgc2VydmVyLiBUaGUgV2ViIGNvbnRlbnQgZm9sZGVyIHJlcHJlc2VudHMgdGhlCi1jb250ZW50cyBvZiB0aGUgV0FSIGZpbGUgdGhhdCB3aWxsIGJlIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEFueSBmaWxlcyBub3QKLXVuZGVyIHRoZSBXZWIgY29udGVudCBmb2xkZXIgYXJlIGNvbnNpZGVyZWQgZGV2ZWxvcG1lbnQtdGltZSByZXNvdXJjZXMgKGZvcgotZXhhbXBsZSwgLmphdmEgZmlsZXMsIC5zcWwgZmlsZXMsIGFuZCAubWlmIGZpbGVzKSwgYW5kIGFyZSBub3QgZGVwbG95ZWQgd2hlbgotdGhlIHByb2plY3QgaXMgdW5pdCB0ZXN0ZWQgb3IgcHVibGlzaGVkLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhvdWdoIHRoZSBkZWZhdWx0IG5hbWUgZ2l2ZW4KLXRvIHRoZSBmb2xkZXIgaXMgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5XZWJDb250ZW50PC9zcGFuPiwgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUKLSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBieSByaWdodC1jbGlja2luZyB0aGUgZm9sZGVyIGFuZCBzZWxlY3RpbmcgPGI+UmVmYWN0b3I8L2I+ICZndDsgPGI+UmVuYW1lPC9iPiBvcgotZnJvbSB0aGUgV2ViIHBhZ2Ugb2YgdGhlIHByb2plY3QncyBQcm9wZXJ0aWVzIGRpYWxvZy4gSW4gYSBkeW5hbWljIFdlYiBwcm9qZWN0LAotY2hhbmdpbmcgdGhlIGZvbGRlciBuYW1lIHdpbGwgdXBkYXRlIHRoZSBKYXZhIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkuPC9kaXY+Ci08L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPk1FVEEtSU5GPC9kdD4KLTxkZD5UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5NQU5JRkVTVC5NRjwvc3Bhbj4gZmlsZSwgd2hpY2gKLWlzIHVzZWQgdG8gbWFwIGNsYXNzIHBhdGhzIGZvciBkZXBlbmRlbnQgSkFSIGZpbGVzIHRoYXQgZXhpc3QgaW4gb3RoZXIgcHJvamVjdHMKLWluIHRoZSBzYW1lIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4gQW4gZW50cnkgaW4gdGhpcyBmaWxlIHdpbGwgdXBkYXRlCi10aGUgcnVuLXRpbWUgcHJvamVjdCBjbGFzcyBwYXRoIGFuZCBKYXZhIGJ1aWxkIHNldHRpbmdzIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZWQKLUpBUiBmaWxlcy48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPnRoZW1lPC9kdD4KLTxkZD5UaGUgc3VnZ2VzdGVkIGRpcmVjdG9yeSBmb3IgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBhbmQgb3RoZXIgc3R5bGUtcmVsYXRlZAotb2JqZWN0cy48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPldFQi1JTkY8L2R0PgotPGRkPkJhc2VkIG9uIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4sIHRoaXMKLWRpcmVjdG9yeSBjb250YWlucyB0aGUgc3VwcG9ydGluZyBXZWIgcmVzb3VyY2VzIGZvciBhIFdlYiBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nCi10aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj53ZWIueG1sPC9zcGFuPiBmaWxlIGFuZCB0aGUgY2xhc3NlcyBhbmQgbGliIGRpcmVjdG9yaWVzLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+L2NsYXNzZXM8L2R0PgotPGRkPlRoaXMgZGlyZWN0b3J5IGlzIGZvciBzZXJ2bGV0cywgdXRpbGl0eSBjbGFzc2VzLCBhbmQgdGhlIEphdmEgY29tcGlsZXIKLW91dHB1dCBkaXJlY3RvcnkuIFRoZSBjbGFzc2VzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbgotY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIGNsYXNzZXMuIEZvbGRlcnMgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBtYXAgcGFja2FnZQotYW5kIGNsYXNzIG5hbWVzLCBhcyBpbjogPHNhbXAgY2xhc3M9ImNvZGVwaCI+L1dFQi1JTkYvY2xhc3Nlcy9jb20vbXljb3JwL3NlcnZsZXRzL015U2VydmxldC5jbGFzczwvc2FtcD4uPHA+RG8KLW5vdCBwbGFjZSBhbnkgLmNsYXNzIGZpbGVzIGRpcmVjdGx5IGludG8gdGhpcyBkaXJlY3RvcnkuIFRoZSAuY2xhc3MgZmlsZXMKLWFyZSBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnkgYXV0b21hdGljYWxseSB3aGVuIHRoZSBKYXZhIGNvbXBpbGVyCi1jb21waWxlcyBKYXZhIHNvdXJjZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5KYXZhIFJlc291cmNlczwvc3Bhbj4gZGlyZWN0b3J5LgotQW55IGZpbGVzIHBsYWNlZCBkaXJlY3RseSBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIEphdmEgY29tcGlsZXIKLXdoZW4gaXQgcnVucy48L3A+Ci08L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPi9saWI8L2R0PgotPGRkPlRoZSBzdXBwb3J0aW5nIEpBUiBmaWxlcyB0aGF0IHlvdXIgV2ViIGFwcGxpY2F0aW9uIHJlZmVyZW5jZXMuIEFueSBjbGFzc2VzCi1pbiAuamFyIGZpbGVzIHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91ciBXZWIgYXBwbGljYXRpb248L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkxpYnJhcmllczwvZHQ+Ci08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gVGhpcyBmb2xkZXIKLW1pcnJvcnMgdGhlIGNvbnRlbnQgb2YgdGhlIGxpYiBmb2xkZXIuIEluIGFkZGl0aW9uLCBXZWIgTGlicmFyeSBQcm9qZWN0cywKLXdoaWNoIGFyZSAidmlydHVhbCIgSkFSIGZpbGVzIHRoYXQgZG8gbm90IHBoeXNpY2FsbHkgcmVzaWRlIGluIHRoZSBXZWIgcHJvamVjdCwKLWJ1dCBhcmUgYXNzb2NpYXRlZCB3aXRoIEphdmEgcHJvamVjdHMgZWxzZXdoZXJlIGluIHlvdXIgd29ya3NwYWNlLAotYXJlIGluY2x1ZGVkIGluIHRoaXMgZm9sZGVyLiBUaGV5IGFyZSBwYWNrYWdlZCB3aXRoIHlvdXIgcHJvamVjdCB3aGVuIHlvdQotZXhwb3J0IHRoZSBhcHBsaWNhdGlvbidzIFdBUiBmaWxlLjwvZGQ+Ci08L2RsPgotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGxpYnJhcnkgZW50cnkgb24gdGhlIEphdmEgYnVpbGQgcGF0aCB3aWxsIHJlbWFpbiB0aGVyZSB1bmxlc3MKLXRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIuIElmIHlvdSByZW1vdmUKLWEgbGlicmFyeSBwYXRoIGVudHJ5IGJ1dCBub3QgdGhlIEpBUiBmaWxlLCB0aGUgbGlicmFyeSBlbnRyeSB3aWxsIGJlIHJlLWFkZGVkCi10byB0aGUgcGF0aCBhdXRvbWF0aWNhbGx5LjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0iY3dlYnJlc291cmNlcy5odG1sIj5XZWIgcmVzb3VyY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjd3dhcm92ci5odG1sIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0idHdjcmVwcmouaHRtbCI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0amNyZWpzcC5odG1sIj5DcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OGViNjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+UHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgeG1sOmxhbmc9ImVuLXVzIiBpZD0iY2N3ZWJ2dyI+PGEgbmFtZT0iY2N3ZWJ2dyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0icCI+VGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG5vdGFibGUgZmVhdHVyZXM6IDx1bD48bGk+PGltZyBzcmM9Ii4uL2ltYWdlcy9ud2luLmdpZiIgYWx0PSJGb3IgV2luZG93cyI+IFlvdSBjYW4gZHJhZyBhbmQgZHJvcCBmaWxlcyBmcm9tIFdpbmRvd3M8c3VwPiZyZWc7PC9zdXA+IEV4cGxvcmVyIG9yIHRoZSBkZXNrdG9wIGludG8KLXRoZSBOYXZpZ2F0b3Igdmlldy48L2xpPgotPGxpPlZpZXcgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZCBieSBzZWxlY3RpbmcgPHNwYW4+PGI+RmlsdGVyczwvYj48L3NwYW4+IGZyb20KLXRoZSBOYXZpZ2F0b3IgdmlldyA8c3Bhbj48Yj5NZW51PC9iPjwvc3Bhbj4gYnV0dG9uLiBSZXNvdXJjZXMKLWNhbiBiZSBmaWx0ZXJlZCBieSBuYW1lLCBwcm9qZWN0IHR5cGUgb3IgY29udGVudCB0eXBlLiBGaWxlcyBiZWdpbm5pbmcgd2l0aAotYSBwZXJpb2QgYXJlIGZpbHRlcmVkIG91dCBieSBkZWZhdWx0LjwvbGk+Ci08bGk+VGhlIHN0YXR1cyBsaW5lIHNob3dzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlLjwvbGk+Ci08bGk+RHJhZ2dpbmcgYSAuamF2YSBmaWxlIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3IGludG8gYSBKU1AgZmlsZSB3aWxsIGluc2VydAotYSB1c2ViZWFuIHRhZywgdGhlIHNhbWUgYmVoYXZpb3IgdGhhdCBpcyBleGhpYml0ZWQgd2hlbiBhIC5jbGFzcyBmaWxlIGlzIGRyYWdnZWQKLWludG8gYSBKU1AgZmlsZS48L2xpPgotPGxpPkVycm9ycyBhbmQgd2FybmluZ3Mgb24gcmVzb3VyY2VzIChpbmNsdWRpbmcgSmF2YSYjODQ4MjssIEhUTUwvSlNQLCBhbmQgTGlua3MgQnVpbGRlciBlcnJvcnMKLWFuZCB3YXJuaW5ncykgYXJlIGluZGljYXRlZCB3aXRoIGEgcmVkIGVycm9yIDxpbWcgc3JjPSIuLi9pbWFnZXMvbnNob3dlcnIuZ2lmIiBhbHQ9IkVycm9yIGljb24iPiBvciB5ZWxsb3cgd2FybmluZyA8aW1nIHNyYz0iLi4vaW1hZ2VzL253YXJuaW5nLmdpZiIgYWx0PSJXYXJuaW5nIGljb24iPiBuZXh0IHRvIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBlcnJvciwgYXMgd2VsbCBhcwotdGhlIHBhcmVudCBjb250YWluZXJzIHVwIHRvIHRoZSBwcm9qZWN0LiBUaGlzIGFwcGxpZXMgZm9yIGFsbCBwcm9qZWN0IHR5cGVzLAotbm90IG9ubHkgV2ViIHByb2plY3RzLjwvbGk+Ci08bGk+SXRlbXMgYXZhaWxhYmxlIGZyb20gdGhlIDxzcGFuPjxiPk5ldzwvYj48L3NwYW4+IGNhc2NhZGluZwotbWVudSBpbiB0aGUgcHJvamVjdCBwb3AtdXAgbWVudSBhcmUgY29udGV4dCBzZW5zaXRpdmUuICBBbGwgbWVudXMgd2lsbCBoYXZlIDxzcGFuPjxiPlByb2plY3Q8L2I+PC9zcGFuPiBhbmQgPHNwYW4+PGI+T3RoZXI8L2I+PC9zcGFuPiBvcHRpb25zLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5Pcmdhbml6YXRpb24gb2YgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldzwvaDQ+PHA+VGhlIFByb2plY3QKLUV4cGxvcmVyIHZpZXcgc2hvd3MgYSBjdXN0b20gdmlldyBvZiBhbGwgV2ViIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIGFyZSBzb21lCi1vZiB0aGUgbm90YWJsZSB0b3AtbGV2ZWwgb2JqZWN0cyB0aGF0IGFwcGVhciBiZW5lYXRoIHRoZSBwcm9qZWN0IG5vZGUgKGJhc2VkCi1vbiBkZWZhdWx0IGZvbGRlciBuYW1lcykuPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5XZWIgY29udGVudCBmb2xkZXI8L3N0cm9uZz4gLSBUaGlzIGZvbGRlciBjb250YWlucwotaXRlbXMgdG8gYmUgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIuIEJ5IGRlZmF1bHQsIHRoaXMgZm9sZGVyIHdpbGwgYmUgbmFtZWQgPHN0cm9uZz5XZWJDb250ZW50PC9zdHJvbmc+IGZvcgotbmV3bHkgY3JlYXRlZCBzdGF0aWMgYW5kIGR5bmFtaWMgV2ViIHByb2plY3RzLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUKLWluIHRoZSBjcmVhdGlvbiB3aXphcmQgV2ViIGZhY2V0IHBhZ2UuPC9kaXY+Ci08dWw+PGxpPjxzdHJvbmc+TUVUQS1JTkY8L3N0cm9uZz4gLSBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5NQU5JRkVTVC5NRjwvc3Bhbj4gZmlsZSwKLXdoaWNoIGlzIHVzZWQgdG8gbWFwIGNsYXNzIHBhdGhzIGZvciBkZXBlbmRlbnQgSkFSIGZpbGVzIHRoYXQgZXhpc3QgaW4gb3RoZXIKLXByb2plY3RzIGluIHRoZSBzYW1lIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4gQW4gZW50cnkgaW4gdGhpcyBmaWxlCi13aWxsIHVwZGF0ZSB0aGUgcnVuLXRpbWUgcHJvamVjdCBjbGFzcyBwYXRoIGFuZCBKYXZhIGJ1aWxkIHNldHRpbmdzIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZWQKLUpBUiBmaWxlcy48L2xpPgotPC91bD4KLTx1bD48bGk+PHN0cm9uZz5XRUItSU5GPC9zdHJvbmc+IC0gVGhlIGRpcmVjdG9yeSB3aGVyZSBzdXBwb3J0aW5nIFdlYiByZXNvdXJjZXMgZm9yIGEgV2ViCi1hcHBsaWNhdGlvbiBhcmUga2VwdCAoZm9yIGV4YW1wbGU6IC54bWkgZmlsZXMsIC54bWwgZmlsZXMsIGFuZCB3ZWIueG1sLikgPC9saT4KLTwvdWw+Ci0gPC9kaXY+Ci0gPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+PGRpdiBjbGFzcz0icnVubmluZ2Zvb3RlciI+Ci0JCTxicj4KLQkJPCEtLSB4eCAgLS0+Ci0JCTxicj4gCi08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhOTcxMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNjd3RvdmVyIj48YSBuYW1lPSJjY3d0b3ZlciI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L2gxPgotPGRpdj48cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIHRoZSB0b29scyB5b3UgbmVlZCB0byBkZXZlbG9wCi1XZWIgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSYjODQ4MjsgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGFuZCB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKU1AgMS4yIFNwZWNpZmljYXRpb248L2NpdGU+LgotV2ViIGFwcGxpY2F0aW9ucyBjYW4gYmUgc2ltcGxlIChjb25zaXN0aW5nIG9mIG9ubHkgc3RhdGljIFdlYiBwYWdlcykgb3IgdGhleQotY2FuIGJlIG1vcmUgYWR2YW5jZWQgYW5kIGluY2x1ZGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyBhbmQgSmF2YSBzZXJ2bGV0cy4KLVRoZXNlIHJlc291cmNlcywgYWxvbmcgd2l0aCBhbiBYTUwgZGVwbG95bWVudCBkZXNjcmlwdG9yIChhbmQgb3RoZXIgPGEgaHJlZj0iY3dlYnJlc291cmNlcy5odG1sIj4gV2ViIHJlc291cmNlczwvYT4sIGFyZSBjb250YWluZWQKLXdpdGhpbiBhIFdlYiBwcm9qZWN0IGR1cmluZyBkZXZlbG9wbWVudC4gV2hlbiB5b3UgYXJlIHJlYWR5IHRvIHB1Ymxpc2ggdGhlCi1XZWIgYXBwbGljYXRpb24gdG8gdGhlIFdlYiwgeW91IGRlcGxveSB0aGUgV2ViIHByb2plY3QgdG8gdGhlIHNlcnZlciBpbiB0aGUKLWZvcm0gb2YgYSBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlIC4gVGhlIGVuZCB1c2VyIGNhbiB0aGVuIHZpZXcgdGhlIFdlYiBhcHBsaWNhdGlvbgotYXMgYSBXZWIgc2l0ZSBmcm9tIGEgVVJMLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJjd3RmZWF0dXJlcy5odG1sIiB0aXRsZT0iVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseSBjcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuIj5XZWIgdG9vbHMgZmVhdHVyZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnI+Ci08ZGl2PjxhIGhyZWY9InR3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGpkZXRhZ3MuaHRtbCI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjM2M3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgNC4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+PGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotPHRpdGxlPkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3BkanNwcyI+PGEgbmFtZT0iY3BkanNwcyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5KYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3k8L2gxPgotPGRpdj48cD5UaGUgSmF2YVNlcnZlciBQYWdlcyB0ZWNobm9sb2d5IGVuYWJsZXMgeW91IHRvIGdlbmVyYXRlIGR5bmFtaWMgd2ViIGNvbnRlbnQsCi1zdWNoIGFzIEhUTUwsIERIVE1MLCBYSFRNTCwgYW5kIFhNTCBmaWxlcywgdG8gaW5jbHVkZSBpbiBhIFdlYiBhcHBsaWNhdGlvbi4KLUpTUCBmaWxlcyBhcmUgb25lIHdheSB0byBpbXBsZW1lbnQgc2VydmVyLXNpZGUgZHluYW1pYyBwYWdlIGNvbnRlbnQuIEpTUCBmaWxlcwotYWxsb3cgYSBXZWIgc2VydmVyLCBzdWNoIGFzIEFwYWNoZSBUb21jYXQsCi10byBhZGQgY29udGVudCBkeW5hbWljYWxseSB0byB5b3VyIEhUTUwgcGFnZXMgYmVmb3JlIHRoZXkgYXJlIHNlbnQgdG8gYSByZXF1ZXN0aW5nCi1icm93c2VyLjwvcD4KLTxwPldoZW4geW91IGRlcGxveSBhIEpTUCBmaWxlIHRvIGEgV2ViIHNlcnZlciB0aGF0IHByb3ZpZGVzIGEgc2VydmxldCBlbmdpbmUsCi1pdCBpcyBwcmVwcm9jZXNzZWQgaW50byBhIHNlcnZsZXQgdGhhdCBydW5zIG9uIHRoZSBXZWIgc2VydmVyLiBUaGlzIGlzIGluCi1jb250cmFzdCB3aXRoIGNsaWVudC1zaWRlIEphdmFTY3JpcHQmIzg0ODI7ICh3aXRoaW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O1NDUklQVCZndDs8L3NhbXA+IHRhZ3MpLAotd2hpY2ggaXMgcnVuIGluIGEgYnJvd3Nlci4gQSBKU1AgcGFnZSBpcyBpZGVhbCBmb3IgdGFza3MgdGhhdCBhcmUgYmV0dGVyIHN1aXRlZAotdG8gZXhlY3V0aW9uIG9uIHRoZSBzZXJ2ZXIsIHN1Y2ggYXMgYWNjZXNzaW5nIGRhdGFiYXNlcyBvciBjYWxsaW5nIEVudGVycHJpc2UgSmF2YSYjODQ4MjsgYmVhbnMuPC9wPgotPHA+WW91IGNhbiBjcmVhdGUgYW5kIGVkaXQgYSBKU1AgZmlsZSBpbiB0aGUgSFRNTCBlZGl0b3IgYnkgYWRkaW5nIHlvdXIgb3duCi10ZXh0IGFuZCBpbWFnZXMgdXNpbmcgSFRNTCwgSlNQIHRhZ2dpbmcsIG9yIEphdmFTY3JpcHQsIGluY2x1ZGluZyBKYXZhIHNvdXJjZQotY29kZSBpbnNpZGUgb2Ygc2NyaXB0bGV0IHRhZ3MuIFR5cGljYWxseSwgSlNQIGZpbGVzIGhhdmUgdGhlIGZpbGUgZXh0ZW5zaW9uCi0uanNwLiBBZGRpdGlvbmFsbHksIHRoZSBKU1Agc3BlY2lmaWNhdGlvbiBzdWdnZXN0cyB0aGF0IEpTUCBmcmFnbWVudCBmaWxlcwotc2hvdWxkIGhhdmUgZmlsZSBleHRlbnNpb24gLmpzcGYuIElmIHRoaXMgY29udmVudGlvbiBpcyBub3QgZm9sbG93ZWQsIHRoZQotSlNQIHZhbGlkYXRvciB3aWxsIHRyZWF0IEpTUCBmcmFnbWVudHMgYXMgcmVndWxhciBzdGFuZGFsb25lIEpTUCBmaWxlcywgYW5kCi1jb21waWxhdGlvbiBlcnJvcnMgbWlnaHQgYmUgcmVwb3J0ZWQuPC9wPgotPHA+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPiBwcm92aWRlcyB0aGUgYWJpbGl0eQotdG8gY3JlYXRlIGN1c3RvbSBKU1AgdGFncy4gQ3VzdG9tIHRhZ3Mgc2ltcGxpZnkgY29tcGxleCBhY3Rpb25zIGFuZCAgcHJvdmlkZQotZGV2ZWxvcGVycyB3aXRoIGdyZWF0ZXIgY29udHJvbCBvdmVyIHBhZ2UgY29udGVudC4gQ3VzdG9tIHRhZ3MgYXJlIGNvbGxlY3RlZAotaW50byBhIGxpYnJhcnkgKHRhZ2xpYikuIEEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmaWxlICh0YWdsaWIudGxkKSBpcyBhbgotWE1MIGRvY3VtZW50IHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZyBsaWJyYXJ5LCBpbmNsdWRpbmcgdGhlCi10YWdsaWIgc2hvcnQgbmFtZSwgbGlicmFyeSBkZXNjcmlwdGlvbiwgYW5kIHRhZyBkZXNjcmlwdGlvbnMuIFJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4KLU1pY3Jvc3lzdGVtcyBKU1AgMS4yIFNwZWNpZmljYXRpb248L2NpdGU+IGZvciBtb3JlIGRldGFpbHMuPC9wPgotPHA+VG8gdXNlIEpTUCAxLjIgY3VzdG9tIHRhZ2xpYnMsIHlvdSBjYW4gaW1wb3J0IHRoZSB0YWcgbGlicmFyeSAudGxkIGFuZAotLmphciBmaWxlcyBpbnRvIHlvdXIgcHJvamVjdCB0byB1c2UgdGhlbSwgb3IgYXNzb2NpYXRlIHRoZW0gYXMgV2ViIExpYnJhcnkKLXByb2plY3RzLiBZb3UgY2FuIGFsc28gcmVmZXJlbmNlIGEgVExEIGZpbGUgYnkgdXNpbmcgYSBVUkkuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnI+Ci08ZGl2PjxhIGhyZWY9ImN3c2VydmJuLmh0bWwiPlNlcnZsZXRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJ0amNyZWpzcC5odG1sIj5DcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwYWdlZGVzaWduLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmNTlkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5XZWIgcGFnZSBkZXNpZ248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3ZWJwYWdlZGVzaWduIj48YSBuYW1lPSJjd2VicGFnZWRlc2lnbiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgcGFnZSBkZXNpZ248L2gxPgotPGRpdj48cD5XZWIgcGFnZXMgYXJlIGFuIGludGVncmFsIHBhcnQgb2YgZXZlcnkgV2ViIGFwcGxpY2F0aW9uLiBFYWNoIFdlYiBwYWdlCi1zaG91bGQgc2VydmUgdG8gaGVscCBhY2hpZXZlIHRoZSBvdmVyYWxsIGdvYWwgb2YgdGhlIGVudGlyZSBXZWIgc2l0ZS48L3A+Ci08cD4gVGhlcmUgYXJlIG1hbnkgdHlwZXMgb2YgV2ViIHBhZ2VzLCByYW5naW5nIGZyb20gc2ltcGxlIEhUTUwgcGFnZXMgdGhhdAotY29udGFpbiBubyBkeW5hbWljIGVsZW1lbnRzLCB0byBhZHZhbmNlZCBKYXZhLWJhc2VkIHBhZ2VzIHRoYXQgbWFrZSB1c2Ugb2YKLXNlcnZsZXRzLCBzY3JpcHRzLCBmb3Jtcywgb3IgZGF0YSBhY2Nlc3MgY29tcG9uZW50cy48L3A+Ci08cD5BIGZldyBvZiB0aGUgbWFueSBpdGVtcyB5b3Ugc2hvdWxkIGNvbnNpZGVyIHdoZW4gZGVzaWduaW5nIHlvdXIgcGFnZXMgYXJlCi1tYXJrdXAgbGFuZ3VhZ2UsIGxpbmtzLCBpbWFnZXMsIGFuZCBzdHlsZSBzaGVldHMuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0idGpkZXRhZ3MuaHRtbCI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Y2YxODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgNC4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+PGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotPHRpdGxlPldlYiBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnByb2plY3RzIj48YSBuYW1lPSJjd2VicHJvamVjdHMiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIHByb2plY3RzPC9oMT4KLTxkaXY+PHA+V2ViIHByb2plY3RzIGhvbGQgYWxsIG9mIHRoZSBXZWIgcmVzb3VyY2VzIHRoYXQgYXJlIGNyZWF0ZWQgYW5kIHVzZWQgd2hlbgotZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpcnN0IHN0ZXAgdG8gY3JlYXRpbmcgb3IgaW1wb3J0aW5nIGEKLVdlYiBhcHBsaWNhdGlvbiBpcyB0byBjcmVhdGUgZWl0aGVyIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdC4gU3RhdGljCi1XZWIgcHJvamVjdHMgYXJlIG1lYW50IHRvIGNvbnRhaW4gb25seSBzaW1wbGUgV2ViIHNpdGUgcmVzb3VyY2VzLCBzdWNoIGFzCi1IVE1MIGZpbGVzLiBEeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgdXNlZCB0byBzdHJ1Y3R1cmUgV2ViIGFwcGxpY2F0aW9ucyB0aGF0Ci13aWxsIHVzZSBtb3JlIGNvbXBsaWNhdGVkLCBkeW5hbWljIFdlYiB0ZWNobm9sb2dpZXMsIHN1Y2ggYXMgSmF2YVNlcnZlciBQYWdlcwotZmlsZXMsIGFuZCBwb3NzaWJseSBkYXRhIGFjY2VzcyByZXNvdXJjZXMuPC9wPgotPHA+VGhvdWdoIHRoZSBXZWIgcHJvamVjdCBpcyBzdHJ1Y3R1cmVkIG9uIHlvdXIgZmlsZSBzeXN0ZW0gaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgSjJFRSBXZWIgYXBwbGljYXRpb24gc3RhbmRhcmQgZm9yIGRlcGxveW1lbnQgcHVycG9zZXMsIHRoZSBQcm9qZWN0Ci1FeHBsb3JlciB2aWV3IGlzIGRlc2lnbmVkIHRvIHNob3cgdGhlIG1vc3QgY29udmVuaWVudCBkaXNwbGF5IG9mIHByb2plY3QgcmVzb3VyY2VzCi1mb3IgdXNlIHdoaWxlIHlvdSBhcmUgYWN0dWFsbHkgZGV2ZWxvcGluZyB0aGUgV2ViIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUKLWZpbmlzaGVkIGRldmVsb3BpbmcgeW91ciBXZWIgYXBwbGljYXRpb24sIHlvdSB1c2UgdGhlIFdlYiBwcm9qZWN0IHRvIGRlcGxveQotdGhlIGNvcnJlY3QgcmVzb3VyY2VzIHRvIHRoZSBzZXJ2ZXIuIFRoZXNlIHJlc291cmNlcyB3aWxsIGJlIHBhY2thZ2VkIGluIGEKLWZpbGUgY2FsbGVkIGEgV2ViIGFyY2hpdmUsIG9yIFdBUiBmaWxlLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJjY3N0YXRpYy5odG1sIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjY3dlYnByai5odG1sIj5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjd3dhcm92ci5odG1sIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0idHdjcmVzdGEuaHRtbCI+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VkNmI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+V2ViIHJlc291cmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnJlc291cmNlcyI+PGEgbmFtZT0iY3dlYnJlc291cmNlcyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgcmVzb3VyY2VzPC9oMT4KLTxkaXY+PHA+SW4gbW9zdCBjYXNlcywgYWxsIG9mIHRoZSByZXNvdXJjZXMgdGhhdCB5b3UgbmVlZCB0byBjcmVhdGUgZm9yIHlvdXIgV2ViCi1hcHBsaWNhdGlvbiBhcmUgZGV2ZWxvcGVkIGR1cmluZyBXZWIgc2l0ZSBvciBXZWIgcGFnZSBkZXNpZ247IGhvd2V2ZXIsIHRoZXJlCi1hcmUgYWRkaXRpb25hbCByZXNvdXJjZXMgdGhhdCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0Ci1pZiB5b3UgYXJlIHVzaW5nIG1vcmUgYWR2YW5jZWQgV2ViIHRlY2hub2xvZ2llcyBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KLTxwPlRoZXNlIFdlYiByZXNvdXJjZXMgYXJlIG5vdCB0eXBpY2FsIFdlYiBwYWdlIGZpbGVzLCBhbmQgYXJlIG9mdGVuIG5vdCB0aGUKLXJlc291cmNlcyB0aGF0IHlvdSBjb25zaWRlciBwYXJ0IG9mIHRoZSBmaW5hbCBXZWIgc2l0ZS4gRm9yIGV4YW1wbGUsIHRhZyBsaWJyYXJpZXMKLWFuZCBKYXZhJiM4NDgyOyByZXNvdXJjZXMsCi1zdWNoIGFzIEpBUiBmaWxlcywgYXJlIHJlc291cmNlcyB5b3UgbWlnaHQgbmVlZCB0byBpbmNsdWRlIGluIHlvdXIgV2ViIHByb2plY3QuIDwvcD4KLTxwPkluIGZhY3QsIGV2ZW4gdGhlIFdBUiBmaWxlIGl0c2VsZiBjb3VsZCBiZSBjb25zaWRlcmVkIGEgV2ViIHJlc291cmNlLCBpZgoteW91IGNvbnNpZGVyIGltcG9ydGluZyBvciBleHBvcnRpbmcgdGhlIHJlc291cmNlLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJjd3dhcm92ci5odG1sIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTg3NjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+U2VydmxldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3c2VydmJuIj48YSBuYW1lPSJjd3NlcnZibiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXJ2bGV0czwvaDE+Ci08ZGl2PjxwPlNlcnZsZXRzIGFyZSBzZXJ2ZXItc2lkZSBKYXZhJiM4NDgyOyBwcm9ncmFtcyB0aGF0IHVzZSB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQKLUFQSTwvY2l0ZT4gYW5kIGl0cyBhc3NvY2lhdGVkIGNsYXNzZXMgYW5kIG1ldGhvZHMsIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1bgotTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uIFRoZXNlIEphdmEgcHJvZ3JhbXMKLWV4dGVuZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhIFdlYiBzZXJ2ZXIgYnkgZ2VuZXJhdGluZyBkeW5hbWljIGNvbnRlbnQgYW5kCi1yZXNwb25kaW5nIHRvIFdlYiBjbGllbnQgcmVxdWVzdHMuIFdoZW4gYSBicm93c2VyIHNlbmRzIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyLAotdGhlIHNlcnZlciBjYW4gc2VuZCB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBhIHNlcnZsZXQsIHNvIHRoYXQgdGhlIHNlcnZsZXQKLWNhbiBjb25zdHJ1Y3QgdGhlIHJlc3BvbnNlIHRoYXQgaXMgc2VudCBiYWNrIHRvIHRoZSBicm93c2VyLjwvcD4KLTxwPkp1c3QgYXMgYXBwbGV0cyBydW4gb24gYSBXZWIgYnJvd3NlciBhbmQgZXh0ZW5kIHRoZSBicm93c2VyJ3MgY2FwYWJpbGl0aWVzLAotc2VydmxldHMgcnVuIG9uIGEgSmF2YS1lbmFibGVkIFdlYiBzZXJ2ZXIgYW5kIGV4dGVuZAotdGhlIHNlcnZlcidzIGNhcGFiaWxpdGllcy4gQmVjYXVzZSBvZiB0aGVpciBmbGV4aWJpbGl0eSBhbmQgc2NhbGFiaWxpdHksIHNlcnZsZXRzCi1hcmUgY29tbW9ubHkgdXNlZCB0byBlbmFibGUgYnVzaW5lc3NlcyB0byBjb25uZWN0IGRhdGFiYXNlcyB0byB0aGUgV2ViLjwvcD4KLTxkaXYgY2xhc3M9InAiPkFsdGhvdWdoIGEgc2VydmxldCBjYW4gYmUgYSBjb21wbGV0ZWx5IHNlbGYtY29udGFpbmVkIHByb2dyYW0sIHlvdSBjYW4KLXNwbGl0IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGludG8gdHdvIHBvcnRpb25zOiAgPHVsPjxsaT5UaGUgYnVzaW5lc3MgbG9naWMgKGNvbnRlbnQgZ2VuZXJhdGlvbiksIHdoaWNoIGdvdmVybnMgdGhlIHJlbGF0aW9uc2hpcAotYmV0d2VlbiBpbnB1dCwgcHJvY2Vzc2luZywgYW5kIG91dHB1dDwvbGk+Ci08bGk+VGhlIHByZXNlbnRhdGlvbiBsb2dpYyAoY29udGVudCBwcmVzZW50YXRpb24sIG9yIGdyYXBoaWMgZGVzaWduIHJ1bGVzKSwKLXdoaWNoIGRldGVybWluZXMgaG93IGluZm9ybWF0aW9uIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlcjwvbGk+Ci08L3VsPgotVXNpbmcgdGhpcyBwYXJhZGlnbSwgeW91IG1heSBjaG9vc2UgdG8gaGF2ZSBidXNpbmVzcyBsb2dpYyBoYW5kbGVkIGJ5IEphdmEgYmVhbnMsCi10aGUgcHJlc2VudGF0aW9uIGxvZ2ljIGhhbmRsZWQgYnkgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBvciBIVE1MIGZpbGVzLCBhbmQKLXRoZSBIVFRQIHByb3RvY29sIGhhbmRsZWQgYnkgYSBzZXJ2bGV0LiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSlNQIGZpbGVzIGNhbiBiZSB1c2VkIHRvIG1hbmFnZQotYm90aCB0aGUgcHJlc2VudGF0aW9uIGFuZCBidXNpbmVzcyBsb2dpYyBmb3IgYSBXZWIgYXBwbGljYXRpb24uIEpTUCBmaWxlcwotdXNlIHN0cnVjdHVyZWQgbWFya3VwIGZvciBwcmVzZW50YXRpb24sIGFuZCBzdXBwbHkgc2VydmxldCBtb2RlbCBiZWhhdmlvcgotYXQgcnVuIHRpbWUuPC9kaXY+Ci08L2Rpdj4KLTxwPllvdSBjYW4gZGV2ZWxvcCwgZGVidWcsIGFuZCBkZXBsb3kgc2VydmxldHMsIHNldCBicmVha3BvaW50cyB3aXRoaW4gc2VydmxldAotb2JqZWN0cywgYW5kIHN0ZXAgdGhyb3VnaCBjb2RlIHRvIG1ha2UgY2hhbmdlcyB0aGF0IGFyZSBkeW5hbWljYWxseSBmb2xkZWQKLWludG8gdGhlIHJ1bm5pbmcgc2VydmxldCBvbiBhIHJ1bm5pbmcgc2VydmVyLCB3aXRob3V0IGhhdmluZyB0byByZXN0YXJ0IGVhY2gKLXRpbWUuPC9wPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2VydmxldHMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L3NhbXA+LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJjY3d0b3Zlci5odG1sIj5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnI+Ci08ZGl2PjxhIGhyZWY9InR3c3J2d2l6Lmh0bWwiPkNyZWF0aW5nIHNlcnZsZXRzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhMGFlMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5XZWIgdG9vbHMgZmVhdHVyZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3dGZlYXR1cmVzIj48YSBuYW1lPSJjd3RmZWF0dXJlcyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgdG9vbHMgZmVhdHVyZXM8L2gxPgotPGRpdj48cD4gVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseQotY3JlYXRlLCBhc3NlbWJsZSwgcHVibGlzaCwgZGVwbG95IGFuZCBtYWludGFpbiBkeW5hbWljLCBpbnRlcmFjdGl2ZSBXZWIgYXBwbGljYXRpb25zLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBoaWdoLWxldmVsIGNhcGFiaWxpdGllczoKLSA8dWw+PGxpPkR5bmFtaWMgV2ViIHByb2plY3QgY3JlYXRpb24sIHVzaW5nIHRoZSBKMkVFLWRlZmluZWQgaGllcmFyY2h5LCBvciBhIHN0YXRpYwotdmVyc2lvbiB0aGF0IHJlZHVjZXMgcHJvamVjdCBvdmVyaGVhZCB3aGVuIGR5bmFtaWMgZWxlbWVudHMgYXJlIG5vdCByZXF1aXJlZC4KLSBTdGF0aWMgV2ViIHByb2plY3RzIGNhbiBsYXRlciBiZSBjb252ZXJ0ZWQgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMuPHA+PC9wPgotPC9saT4KLTxsaT5DcmVhdGlvbiBhbmQgZWRpdGluZyBvZiBhIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+d2ViLnhtbDwvc3Bhbj4pCi0gZmlsZTxwPjwvcD4KLTwvbGk+Ci08bGk+SlNQIGFuZCBIVE1MIGZpbGUgY3JlYXRpb24sIHZhbGlkYXRpb24sIGVkaXRpbmcsIGFuZCBkZWJ1Z2dpbmc8cD48L3A+Ci08L2xpPgotPGxpPkFuIGV4dGVuc2libGUgdmlldywgY2FsbGVkIHRoZSBTbmlwcGV0cyB2aWV3LCB3aGljaCBhbGxvd3MgdXNlcnMgdG8gY2F0YWxvZwotIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQmIzg0ODI7LAotIGFuZCBKU1AgbWFya3VwLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gdGFncywgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4KLSBleGlzdGluZyBmaWxlczxwPjwvcD4KLTwvbGk+Ci08bGk+RHluYW1pYyB0YWcgaGVscCAoY29udGVudCBhc3Npc3QpICwgd2hpY2ggZGlzcGxheXMgdGFnIHVzYWdlIGFuZCBhdHRyaWJ1dGUKLWluZm9ybWF0aW9uIGZvciAgSFRNTCwgSlNQLCBhbmQgSmF2YVNjcmlwdCB0YWdzIGJhc2VkIG9uIGN1cnNvciBsb2NhdGlvbgotIGluIHRoZSBTb3VyY2UgcGFnZS4gKFlvdSBpbnZva2UgQ29udGVudCBBc3Npc3QgYnkgcHJlc3NpbmcgKEN0cmwrU3BhY2ViYXIpCi0pPHA+PC9wPgotPC9saT4KLTxsaT5DYXNjYWRpbmcgc3R5bGUgc2hlZXQgKENTUykgZWRpdGluZyBzdXBwb3J0PHA+PC9wPgotPC9saT4KLTxsaT5IVFRQL0ZUUCBpbXBvcnQ8cD48L3A+Ci08L2xpPgotPGxpPkZUUCBleHBvcnQgKHNpbXBsZSByZXNvdXJjZSBjb3B5KSB0byBhIHNlcnZlcjxwPjwvcD4KLTwvbGk+Ci08bGk+V0FSIGZpbGUgaW1wb3J0LCBleHBvcnQsIGFuZCB2YWxpZGF0aW9uPHA+PC9wPgotPC9saT4KLTxsaT5TZXJ2bGV0IGNyZWF0aW9uLCB3aGljaCBlbXBsb3lzIHRoZSBTZXJ2bGV0IFdpemFyZCB0byBjcmVhdGUgbmV3IHNlcnZsZXRzLjxwPjwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0iY2N3ZWJwcmouaHRtbCI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3dlYnBhZ2VkZXNpZ24uaHRtbCI+V2ViIHBhZ2UgZGVzaWduPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJ0d2NyZXByai5odG1sIj5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRqY3JlanNwLmh0bWwiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR3c3J2d2l6Lmh0bWwiPkNyZWF0aW5nIHNlcnZsZXRzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmZWJiZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3d3YXJvdnIiPjxhIG5hbWU9ImN3d2Fyb3ZyIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLTxkaXY+PHA+IEEgV2ViIGFwcGxpY2F0aW9uIGlzIGEgZ3JvdXAgb2YgSFRNTCBwYWdlcywgSlNQIHBhZ2VzLCBzZXJ2bGV0cywgcmVzb3VyY2VzCi1hbmQgc291cmNlIGZpbGUsIHdoaWNoIGNhbiBiZSBtYW5hZ2VkIGFzIGEgc2luZ2xlIHVuaXQuIEEgV2ViIGFyY2hpdmUgKFdBUikKLWZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24uIFdBUiBmaWxlcyBjYW4gYmUgdXNlZCB0byBpbXBvcnQgYSBXZWIKLWFwcGxpY2F0aW9uIGludG8gYSBXZWIgc2VydmVyLjwvcD4KLTxwPkluIGFkZGl0aW9uIHRvIHByb2plY3QgcmVzb3VyY2VzLCB0aGUgV0FSIGZpbGUgaW5jbHVkZXMgYSBXZWIgZGVwbG95bWVudAotZGVzY3JpcHRvciBmaWxlLiBUaGUgV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBhbiBYTUwgZmlsZSB0aGF0IGNvbnRhaW5zCi1kZXBsb3ltZW50IGluZm9ybWF0aW9uLCBNSU1FIHR5cGVzLCBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZGV0YWlscywgYW5kIG90aGVyCi1zZXR0aW5ncyBmb3IgYSBXZWIgYXBwbGljYXRpb24uIFRoZSBXZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgKDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+d2ViLnhtbDwvc3Bhbj4pCi1wcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgV0FSIGZpbGUgaXMgc2hhcmVkIHdpdGggdGhlIGRldmVsb3BlcnMsIGFzc2VtYmxlcnMsCi1hbmQgZGVwbG95ZXJzIGluIGEgSjJFRSBlbnZpcm9ubWVudC48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nCi1XQVIgZmlsZXMsIHVzaW5nIHRoZSBmb2xsb3dpbmcgd2l6YXJkczogPHVsPjxsaT48c3Bhbj5JbXBvcnQgUmVzb3VyY2VzIGZyb20gYSBXQVIgRmlsZTwvc3Bhbj4sIHdoaWNoIHJlcXVpcmVzIHRoYXQgeW91IHRvCi1zcGVjaWZ5IGEgV2ViIHByb2plY3QuIFlvdSBjYW4gdXNlIGV4aXN0aW5nIHByb2plY3RzIG9yIGNyZWF0ZSB0aGVtIGFzIHlvdQotdXNlIHRoZSB3aXphcmQuPC9saT4KLTxsaT48c3Bhbj5FeHBvcnQgUmVzb3VyY2VzIHRvIGEgV0FSIEZpbGU8L3NwYW4+LCB3aGljaCByZXF1aXJlcyBvbmx5IGFuIGV4cG9ydAotbG9jYXRpb24gYW5kIHNvbWUgb3B0aW9uYWwgc2V0dGluZ3M8L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnI+Ci08ZGl2PjxhIGhyZWY9ImN3ZWJyZXNvdXJjZXMuaHRtbCI+V2ViIHJlc291cmNlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0idHdpbXB3YXIuaHRtbCI+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0d2NyZXdhci5odG1sIj5FeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDg5NDQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgNC4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+PGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotPHRpdGxlPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3dlZHR2dyI+PGEgbmFtZT0iY3d3ZWR0dnciPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnM8L2gxPgotPGRpdj48cD5UaGVyZSBhcmUgc2V2ZXJhbCBlZGl0b3JzIGZvciB1c2UgaW4gdmFyaW91cyBjb250ZXh0cyBmb3IgdmFyaW91cyBmaWxlCi10eXBlcy4gVG8gZWRpdCBhIGZpbGUgdXNpbmcgaXRzIGRlZmF1bHQgZWRpdG9yLCBkb3VibGUtY2xpY2sgb24gdGhlIGZpbGUgbmFtZQotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgb3IgcmlnaHQtY2xpY2sgb24gdGhlIGZpbGUgYW5kIHNlbGVjdCA8Yj5PcGVuPC9iPi4KLVRoZSBlZGl0b3IgdGhhdCBpcyBsYXN0IHVzZWQgdG8gb3BlbiBhIGZpbGUgYmVjb21lcyB0aGUgZGVmYXVsdCBmb3IgdGhhdCBwYXJ0aWN1bGFyCi1maWxlLiBUbyBlZGl0IHRoZSBmaWxlIHdpdGggYSBkaWZmZXJlbnQgZWRpdG9yLCByaWdodC1jbGljayBvbiB0aGUgZmlsZSBhbmQKLXNlbGVjdCA8Yj5PcGVuIFdpdGg8L2I+IHRvIGNob29zZSBmcm9tIGEgbGlzdCBvZiBhdmFpbGFibGUKLWVkaXRvcnMuPC9wPgotPHA+SW4gdGhlIHdvcmtiZW5jaCwgeW91IGNhbiBhc3NvY2lhdGUgZmlsZS1uYW1lIGV4dGVuc2lvbnMgZm9yIGRpZmZlcmVudAotdHlwZXMgb2YgcmVzb3VyY2VzIHdpdGggdmFyaW91cyBlZGl0b3JzLiBBIHJlc291cmNlIGV4dGVuc2lvbiBjYW4gaGF2ZSBtb3JlCi10aGFuIG9uZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIGl0OyB0aGUgbGFzdCBlZGl0b3IgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyCi1leHRlbnNpb24gdHlwZSBpcyBpbmRpY2F0ZWQgYnkgYSBibGFjayBkb3QgYmVmb3JlIGl0IGluIHRoZSA8Yj5PcGVuCi1XaXRoPC9iPiBwb3AtdXAgbWVudS4gWW91IGNhbiBhc3NvY2lhdGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBrbm93bgotdG8gdGhlIHdvcmtiZW5jaCB3aXRoIGFkZGl0aW9uYWwgZWRpdG9ycywgYnkgdXNpbmcgdGhlIDxzdHJvbmc+RmlsZSBBc3NvY2lhdGlvbnM8L3N0cm9uZz4gcHJlZmVyZW5jZXMKLXBhZ2UsIGFjY2Vzc2VkIGJ5IHNlbGVjdGluZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxiPldpbmRvdzwvYj4gJmd0OyA8Yj5QcmVmZXJlbmNlczwvYj4gJmd0OyA8Yj5Xb3JrYmVuY2g8L2I+ICZndDsgPGI+RmlsZSBBc3NvY2lhdGlvbnM8L2I+PC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgUHJvcGVydGllcyB2aWV3IHByb3ZpZGVzIGdlbmVyYWwgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGFkdmFudGFnZW91cwotdG8gV2ViIGVkaXRvciB1c2Vycy4gPGRsPjxkdCBjbGFzcz0iZGx0ZXJtIj5Qcm9wZXJ0aWVzIHZpZXc8L2R0PgotPGRkPlRoZSBQcm9wZXJ0aWVzIHZpZXcgKDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+V2luZG93PC9iPiAmZ3Q7IDxiPlNob3cKLVZpZXc8L2I+ICZndDsgPGI+UHJvcGVydGllczwvYj48L3NwYW4+KSBjb250YWlucwotYSBsaXN0IG9mIGF0dHJpYnV0ZXMgYW5kIGVkaXRhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMuIEZvciBleGFtcGxlLCB3aGVuIHlvdQotc2VsZWN0IGFuIGltYWdlIHRhZyA8Yj5pbWc8L2I+ICwgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCi1hcHBlYXIgZm9yIGVkaXRpbmcuIEluIGFkZGl0aW9uLCBhbnkgb3RoZXIgYXR0cmlidXRlcyBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZAotc3BlY2lmaWVkIGluIHRoZSBET0NUWVBFIGZvciB0aGUgZmlsZSAoc3VjaCBhcyB0aGUgSFRNTCA0LjAuMSBEVEQpIGFyZSBsaXN0ZWQuCi1XaGVuIHlvdSBjbGljayB0aGUgdmFsdWUgY29sdW1uIG9mIGEgcHJvcGVydHksIHlvdSBjYW4gc2VsZWN0IGZyb20gYW1vbmcgdGhlCi1saXN0IG9mIGF2YWlsYWJsZSBhdHRyaWJ1dGUgdmFsdWVzLiA8cD5UaGUgcG9wLXVwIG1lbnUgaW4gdGhlIFByb3BlcnRpZXMgdmlldwotZW5hYmxlcyB5b3UgdG8gdW5kbywgY3V0LCBjb3B5LCBwYXN0ZSwgZGVsZXRlLCBhbmQgc2VsZWN0IGFsbC4gVGhlIG9wdGlvbnMKLXRoYXQgYXJlIGF2YWlsYWJsZSBhdCBhIGdpdmVuIHRpbWUgZGVwZW5kcyBvbiB3aGVyZSB0aGUgY3Vyc29yIGlzIGxvY2F0ZWQKLXdoZW4geW91IHJpZ2h0LWNsaWNrIHRvIGRpc3BsYXkgdGhlIHBvcC11cCBtZW51LiBUbyBzZWUgdGhlIHBvcC11cCBtZW51IHRoYXQKLWNvbnRhaW5zIHVuZG8sIGN1dCwgYW5kIHNvIG9uLCB0aGUgcHJvcGVydHkgdmFsdWUgZmllbGQgbXVzdCBiZSBhY3RpdmUuIChUaGlzCi1pcyBhY2NvbXBsaXNoZWQgYnkgc2VsZWN0aW5nIHRoZSBwcm9wZXJ0eSBhbmQgdGhlbiBzZWxlY3RpbmcgaXRzIHZhbHVlLikgT3RoZXJ3aXNlLAotdGhlIHBvcC11cCBtZW51IHdpbGwgY29udGFpbiBkaWZmZXJlbnQgb3B0aW9ucy48L3A+Ci0gPHA+VXNlIHRoZSA8Yj5SZXN0b3JlCi1EZWZhdWx0IFZhbHVlPC9iPiBidXR0b24gdG8gY2hhbmdlIGFueSB2YWx1ZSBiYWNrIHRvIHRoZSBkZWZhdWx0IHNldHRpbmcuPC9wPgotIDxwPkFmdGVyCi15b3UgYXJlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gbW9kaWZ5IG90aGVyIHByb3BlcnR5IHZhbHVlcyBmb3Igc3BlY2lmaWMKLXRhZ3MuIFRvIGVkaXQgYW5vdGhlciB0YWcgdXNpbmcgdGhlIFByb3BlcnRpZXMgdmlldywgbW92ZSB0aGUgY3Vyc29yIHdpdGhpbgotdGhlIGVkaXRpbmcgYXJlYSBvZiB0aGUgU291cmNlIHBhZ2Ugb3IgRGVzaWduIHBhZ2UgdG8gdGhlIHRhZyB5b3Ugd2FudCB0bwotZWRpdC4gVGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBQcm9wZXJ0aWVzCi12aWV3LjwvcD4KLTwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNoZ3hkdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGE5NzRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNoZ3hkdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgNC4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+PGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotPHRpdGxlPlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpjaGd4ZHQiPjxhIG5hbWU9InRqY2hneGR0Ij48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5BbiA8ZW0+aW1wbGljaXQ8L2VtPiBkb2N1bWVudCB0eXBlIGlzIHVzZWQgZm9yIGNvbnRlbnQgYXNzaXN0IChDVFJMK1NwYWNlYmFyKSwKLXRoZSBQcm9wZXJ0aWVzIHZpZXcsIGFuZCBvdGhlciBlZGl0aW5nIGNvbnRleHRzIHdoZW4gbm8gRE9DVFlQRSBkZWNsYXJhdGlvbgotaXMgc3BlY2lmaWVkIGluIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZmlsZS4gVHlwaWNhbGx5LCB0aGlzIGZlYXR1cmUgaXMgdXNlZAotZm9yIGEgZnJhZ21lbnQgKHBhcnRpYWwgZG9jdW1lbnQpIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIHBhZ2VzIHVzaW5nCi1KU1AgaW5jbHVkZSBvciBzZXJ2ZXItc2lkZSBpbmNsdWRlLjwvcD4KLTxwPlRvIGFzc2lnbiBhbiBpbXBsaWNpdCBkb2N1bWVudCB0eXBlCi10byBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50LCBkbyB0aGUgZm9sbG93aW5nOiA8L3A+Ci0gPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgSFRNTCwgWEhUTUwsIG9yIEpTUAotZnJhZ21lbnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3Bhbj48Yj5Qcm9wZXJ0aWVzPC9iPjwvc3Bhbj4gZnJvbSB0aGUgZmlsZSdzCi1wb3AtdXAgbWVudS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxiPldlYiBDb250ZW50IFNldHRpbmdzPC9iPiBwYWdlLCBzZWxlY3QKLXRoZSBkZXNpcmVkIERPQ1RZUEUgZnJvbSB0aGUgPHNwYW4+PGI+RG9jdW1lbnQgdHlwZTwvYj48L3NwYW4+IGRyb3AtZG93bgotbGlzdC48L3NwYW4+IDxwPlRoZSA8c3Bhbj48Yj5Qcm9wZXJ0aWVzPC9iPjwvc3Bhbj4gZGlhbG9nCi1mb3IgV2ViIHByb2plY3RzIGFsc28gaW5jbHVkZXMgYW4gPHNwYW4+PGI+V2ViIENvbnRlbnQgU2V0dGluZ3M8L2I+PC9zcGFuPiBwYWdlLAotd2hlcmUgeW91IGNhbiBzcGVjaWZ5IHByb2plY3QtZGVmYXVsdCBIVE1MIGRvY3VtZW50IHR5cGUuIFRoaXMgc2V0dGluZyB3aWxsCi1iZSB1c2VkIGlmIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBmaWxlLCBhbmQgbm8gZGVmYXVsdAotZG9jdW1lbnQgdHlwZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxzcGFuPjxiPldlYiBDb250ZW50IFNldHRpbmdzPC9iPjwvc3Bhbj4gcGFnZQotb24gdGhlIDxzcGFuPjxiPlByb3BlcnRpZXM8L2I+PC9zcGFuPiBkaWFsb2cgZm9yIHRoZSBmaWxlLjwvcD4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTdkM2JkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgNC4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+PGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotPHRpdGxlPkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY3JlaHRtIj48YSBuYW1lPSJ0amNyZWh0bSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzPC9oMT4KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIE5ldyBIVE1MIEZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBIVE1MIGFuZCBYSFRNTCBmaWxlcwotYW5kIGZyYW1lc2V0cy4gPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQotZG9uZSBzby48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L3NwYW4+IE5vdGUKLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSFRNTCBmaWxlLCB0aGVuCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbgotYWRkaXRpb24sIGxpbmsgdmFsaWRhdGlvbiB3aWxsIG5vdCBlbmNvbXBhc3MgZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZQotV2ViQ29udGVudCBmb2xkZXIuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgY29udGV4dCBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48Yj5OZXc8L2I+ICZndDsgPGI+T3RoZXI8L2I+ICZndDsgPGI+V2ViPC9iPiAmZ3Q7IDxiPkhUTUw8L2I+PC9zcGFuPi48L3NwYW4+IFRoZSBOZXcgSFRNTCBQYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91cgotZm9sZGVyIHNlbGVjdGVkPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlCi1hbiBodG1sIGV4dGVuc2lvbiAoaHRtbCwgaHRtLCB4aHRtbCwgaHRwbCwgd21sLCBzaHRtbCwgb3Igc2h0bSkgaW4gdGhlIGZpbGUKLW5hbWUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9zcGFuPjx1bD48bGk+VG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggYSBuZXcgSFRNTCBmaWxlLCBzZWxlY3QgPGI+RmluaXNoLjwvYj48L2xpPgotPGxpPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSFRNTCBwYWdlLAotc2VsZWN0IDxiPk5leHQ8L2I+LiBUaGUgU2VsZWN0IEhUTUwgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuCi1TZWxlY3QgdGhlIDxiPlVzZSBIVE1MIFRlbXBsYXRlPC9iPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdAotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8Yj5IVE1MIFRlbXBsYXRlczwvYj4gbGluawotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvbGk+Ci08L3VsPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmY1ZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpjcmVqc3AiPjxhIG5hbWU9InRqY3JlanNwIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Nb3N0IHR5cGVzIG9mIEpTUCBmaWxlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgTmV3IEpTUCBGaWxlCi13aXphcmQuIFRvIGNyZWF0ZSBhIGJhc2ljIEpTUCBmaWxlIHVzaW5nIHRoZSB3aXphcmQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOiA8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkgZG9uZSBzby48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICBOb3RlIHRoYXQgaWYgeW91Ci1jaG9vc2UgYW55IG90aGVyIGZvbGRlciBpbiB3aGljaCB0byBjcmVhdGUgdGhlIEpTUCwgdGhlbiBpdCB3aWxsIG5vdCBiZSBpbmNsdWRlZAotaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gSW4gYWRkaXRpb24sIGxpbmsgdmFsaWRhdGlvbgotd2lsbCBub3QgZW5jb21wYXNzIGZpbGVzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUgV2ViQ29udGVudCBmb2xkZXIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+TmV3PC9iPiAmZ3Q7IDxiPkpTUDwvYj48L3NwYW4+Ljwvc3Bhbj4gVGhlIE5ldyBKYXZhIFNlcnZlcgotUGFnZSB3aW5kb3cgYXBwZWFycyB3aXRoIHlvdXIgZm9sZGVyIHNlbGVjdGVkPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlCi10aGUganNwIGV4dGVuc2lvbiAoanNwLCBqc3YsIGp0cGwsIG9yIGpzcHgpIGluIHRoZSBmaWxlIG5hbWUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9zcGFuPjx1bD48bGk+VG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggYSBuZXcgSlNQIGZpbGUsIHNlbGVjdCA8Yj5GaW5pc2guPC9iPjwvbGk+Ci08bGk+VG8gbGluayB0byBhIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBzcGVjaWZ5IHBhdGggdmFyaWFibGVzLCBzZWxlY3QgPGI+QWR2YW5jZWQ8L2I+IGFuZAotdGhlbiBtYWtlIHlvdXIgc2VsZWN0aW9ucyB1c2luZyB0aGUgPGI+QnJvd3NlPC9iPiBhbmQgPGI+VmFyaWFibGVzPC9iPiBidXR0b25zLiA8L2xpPgotPGxpPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSlNQIHBhZ2UsCi1zZWxlY3QgPGI+TmV4dDwvYj4uIFRoZSBTZWxlY3QgSlNQIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLgotU2VsZWN0IHRoZSA8Yj5Vc2UgSlNQIFRlbXBsYXRlPC9iPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdAotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8Yj5KU1AgVGVtcGxhdGVzPC9iPiBsaW5rCi10byBhZGQgb3IgcmVtb3ZlIEpTUCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2xpPgotPC91bD4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnI+Ci08ZGl2PjxhIGhyZWY9ImNwZGpzcHMuaHRtbCI+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJ0d2NyZXByai5odG1sIiB0aXRsZT0iWW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zIGluIFdlYiBwcm9qZWN0cy4iPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqZGV0YWdzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTI0MTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqZGV0YWdzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqZGV0YWdzIj48YSBuYW1lPSJ0amRldGFncyI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldzwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UbyBhaWQgaW4gV2ViIHNpdGUgZGV2ZWxvcG1lbnQgYW5kIGVkaXRpbmcsIHRoZXJlIGlzIGxvY2FsIHRhZwotaG92ZXIgaGVscCBmb3IgYWxsIHN1cHBvcnRlZCB0YWcgc2V0cywgYXMgd2VsbCBhcyA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuaHRtbCI+Y29udGVudCBhc3Npc3Q8L2E+IChDdHJsK1NwYWNlYmFyKSwgYSB0b29sIHRoYXQgaGVscHMgeW91Ci1pbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQKLXRleHQgZWRpdG9yLjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbndpbi5naWYiIGFsdD0iRm9yIFdpbmRvd3MiPiBZb3UgY2FuIHRvZ2dsZSBhbW9uZyB0aHJlZSBtb2RlcyB0byB2aXN1YWxseSBkZXNpZ24gcGFnZXMsIHdvcmsgd2l0aAotSFRNTCwgSmF2YVNjcmlwdCYjODQ4Mjsgb3IKLUpTUCBjb250ZW50LCBhbmQgcHJldmlldyB5b3VyIHBhZ2VzLiBUbyBoZWxwIHlvdSBjcmVhdGUgdGhlIHZpc3VhbCBpbXBhY3QKLXlvdSB3YW50IG9uIHlvdXIgV2ViIHNpdGVzLCB0aGUgZWRpdG9yIGluY2x1ZGVzIGl0cyBvd24gbGlicmFyeSBvZiByZXVzYWJsZQotZ3JhcGhpY3MgYW5kIHR3byBncmFwaGljIHByb2dyYW1zIGZvciBjcmVhdGluZywgZWRpdGluZywgYW5kIGFuaW1hdGluZyBpbWFnZQotZmlsZXMuIDwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmxpbnV4LmdpZiIgYWx0PSJGb3IgTGludXgiPiBZb3UgY2FuIHRvZ2dsZSBiZXR3ZWVuIHR3byBtb2RlcyB0byB2aXN1YWxseSBkZXNpZ24gcGFnZXMgb3Igd29yawotd2l0aCBIVE1MLCBKYXZhU2NyaXB0IG9yIEpTUCBjb250ZW50LiBUbyBoZWxwIHlvdSBjcmVhdGUKLXRoZSB2aXN1YWwgaW1wYWN0IHlvdSB3YW50IG9uIHlvdXIgV2ViIHNpdGVzLCB0aGUgZWRpdG9yIGluY2x1ZGVzIGl0cyBvd24KLWxpYnJhcnkgb2YgcmV1c2FibGUgZ3JhcGhpY3MgYW5kIGEgZ3JhcGhpYyBwcm9ncmFtIGZvciBjcmVhdGluZywgZWRpdGluZywKLWFuZCBhbmltYXRpbmcgaW1hZ2UgZmlsZXMuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFVzZSBlaXRoZXIgdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMKLWNoYXJhY3RlcnMgY29uc2lzdGVudGx5IHdoZW4gbmFtaW5nIEhUTUwgZmlsZXMgYW5kIGVtYmVkZGVkIGZpbGVzIChzdWNoIGFzCi1pbWFnZSBmaWxlcykgdXNlZCBpbiB5b3VyIFdlYiBwYWdlcywgYmVjYXVzZSBzb21lIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtcwotYXJlIGNhc2Ugc2Vuc2l0aXZlLiBEbyBub3QgdXNlIHNwYWNlcyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyBleGNsYW1hdGlvbgotcG9pbnRzIG9yIHF1ZXN0aW9uIG1hcmtzIGluIGZpbGUgbmFtZXMuPC9kaXY+Ci0gPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0iY2N3dG92ZXIuaHRtbCI+V2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90anByZWZzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmY4ZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPjwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+RGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anByZWZzIj48YSBuYW1lPSJ0anByZWZzIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UbyBkZWZpbmUgZ2VuZXJhbCBIVE1MIGZpbGUgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIDxiPldpbmRvdzwvYj4gbWVudSwgc2VsZWN0IDxiPlByZWZlcmVuY2VzPC9iPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHdpbmRvdywgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+V2ViIGFuZAotWE1MPC9iPiAmZ3Q7IDxiPkhUTUwgRmlsZXM8L2I+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHJlbGF0ZWQgdG8gc2F2aW5nIGFuIEhUTUwgc291cmNlCi1wYWdlLiBUaGUgZGVmYXVsdHMgYXJlIHJlY29tbWVuZGVkIGFuZCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB3aGVuIHRoZXJlCi1pcyBhIHNwZWNpZmljIHJlYXNvbiB0byBkbyBzby4gPC9zcGFuPiA8ZGw+PGR0IGNsYXNzPSJkbHRlcm0iPkxpbmUgZGVsaW1pdGVyPC9kdD4KLTxkZD5TcGVjaWZ5IHRoZSBhcHByb3ByaWF0ZSBFT0wgY2hhcmFjdGVyIGZvciB5b3VyIGVudmlyb25tZW50LiBUaGUgZGVmYXVsdAotaXMgPGI+Tm8gdHJhbnNsYXRpb248L2I+LjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+QWRkIHRoaXMgc3VmZml4PC9kdD4KLTxkZD5TcGVjaWZ5IGEgZGVmYXVsdCBzdWZmaXggZm9yIGZpbGVzIHRoYXQgeW91IHNhdmUuIFRoZSBkZWZhdWx0IGlzIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+aHRtbDwva2JkPi48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkVuY29kaW5nLCBJQU5BLCAoVXNlIHdvcmtiZW5jaCBkZWZhdWx0KTwvZHQ+Ci08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3UgY3JlYXRlLiBUaGUKLWRlZmF1bHQgaXMgdGhlIFdvcmtiZW5jaCdzIGVuY29kaW5nIHByZWZlcmVuY2UuIDwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SW5zZXJ0IERPQ1RZUEUgZGVjbGFyYXRpb248L2R0PgotPGRkPk9wdGlvbmFsbHksIHlvdSBjYW4gYXV0b21hdGljYWxseSBhZGQgYSBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIEhUTUwgZmlsZXMuCi1UaGUgZGVmYXVsdCBET0NUWVBFIGlzIGRldGVybWluZWQgd2hlbiB5b3UgY3JlYXRlIGFuIEhUTUwgZmlsZSBvciBhIEpTUCBmaWxlCi11c2luZyBhIHdpemFyZC4gSWYgeW91IGFkZCB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgeW91IHNob3VsZCBpbmNsdWRlIGF0Ci1sZWFzdCBhIFB1YmxpYyBJRCBzcGVjaWZpY2F0aW9uLCBhbmQsIG9wdGlvbmFsbHksIGEgU3lzdGVtIElELjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SW5zZXJ0IEdFTkVSQVRPUiB3aXRoIE1FVEEgdGFnPC9kdD4KLTxkZD5PcHRpb25hbGx5LCBzZWxlY3QgdGhlIGNoZWNrIGJveCB0byBzcGVjaWZ5IEdFTkVSQVRPUiBpbiBhIE1FVEEgdGFnIGluCi10aGUgSFRNTCBmaWxlIGhlYWRlci48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkxvYWRpbmcgZmlsZXM8L2R0PgotPGRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKGNvZGUgcGFnZSkgZm9yIGZpbGVzIHRoYXQgeW91IG9wZW4uIFRoZQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gRGVzZWxlY3QgdGhlIDxiPlVzZQotd29ya2JlbmNoIGRlZmF1bHQ8L2I+IGNoZWNrIGJveCB0byBzZWxlY3QgYW5vdGhlciBlbmNvZGluZy4gICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRW5jb2RpbmcKLWRldGVjdGlvbiAod2hlbiBsb2FkaW5nIGZpbGVzKSBpcyBwZXJmb3JtZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogICA8dWw+PGxpPkxvY2F0ZSB0aGUgZW5jb2RpbmcgbmFtZSBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQuPC9saT4KLTxsaT5XaGVuIG5vIGVuY29kaW5nIGlzIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudCwgYW4gYXV0b21hdGljIGVuY29kaW5nIGRldGVjdG9yCi1hdHRlbXB0cyB0byBkZXRlcm1pbmUgZW5jb2RpbmcgdXNlZCBpbiB0aGUgZG9jdW1lbnQuPC9saT4KLTxsaT5JZiB0aGUgZW5jb2Rpbmcgc3RpbGwgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSBlbmNvZGluZyBkZWZpbmVkIGluIHRoZSA8Yj5FbmNvZGluZzwvYj4gZmllbGQKLWlzIHVzZWQuPC9saT4KLTwvdWw+Ci0gPC9kaXY+Ci0gPC9kZD4KLTwvZGw+Ci0gPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPGI+QXBwbHk8L2I+IHRoZW4gPGI+T0s8L2I+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTgyYzkwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+U2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNlcnZlcnRhcmdldCI+PGEgbmFtZT0idHNlcnZlcnRhcmdldCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zPC9oMT4KLTxkaXY+PHA+VG8gc3VwcG9ydCBkaWZmZXJlbnQgSjJFRSBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCB0aGUgSjJFRSB0b29saW5nIGFsbG93cwoteW91IHRvIHRhcmdldCBhIHNwZWNpZmljIHNlcnZlciBkdXJpbmcgeW91ciBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QKLWRldmVsb3BtZW50LiBJbiBtb3N0IGNhc2VzLCBhIFdlYiBwcm9qZWN0IG11c3QgdGFyZ2V0IHRoZSBzYW1lIHNlcnZlciBhcyB0aGUKLUVBUiBwcm9qZWN0IGluIG9yZGVyIHRvIGRlcGxveSB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgcHJvcGVybHkuIDwvcD4KLTxwPkFmdGVyIHlvdSBoYXZlIGEgV2ViIHByb2plY3QgY3JlYXRlZCwgeW91IGNhbiBtb2RpZnkgdGhlIHRhcmdldCBzZXJ2ZXIKLXVzaW5nIHRoZSBwcm9qZWN0J3MgcHJvcGVydGllcyBkaWFsb2cuIFRvIGRvIHRoaXMsIHJpZ2h0LWNsaWNrIG9uIHRoZSBwcm9qZWN0Ci1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+UHJvcGVydGllczwvYj4gJmd0OyA8Yj5TZXJ2ZXI8L2I+PC9zcGFuPi48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0idHdjcmVwcmouaHRtbCIgdGl0bGU9IllvdSBjcmVhdGUgYW5kIG1haW50YWluIHRoZSByZXNvdXJjZXMgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyBpbiBXZWIgcHJvamVjdHMuIj5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg2NTQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgNC4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+PGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotPHRpdGxlPkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzdHlsZXNoZWV0Ij48YSBuYW1lPSJ0c3R5bGVzaGVldCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzPC9oMT4KLTxkaXY+PHA+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBlbmFibGUgeW91IHRvIGRlZmluZSBhIGNvbnNpc3RlbnQgbG9vayBhbmQKLWZlZWwgdGhyb3VnaG91dCB5b3VyIFdlYiBzaXRlIGJ5IG1haW50YWluaW5nIHRoZSBjb250ZW50cyAoV2ViIHBhZ2VzKSBhbmQKLXRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSBuZXcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0OjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQotZG9uZSBzby48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L3NwYW4+IE5vdGUKLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgQ1NTIGZpbGUsIHRoZW4KLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIDwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+TmV3PC9iPiAmZ3Q7IDxiPk90aGVyPC9iPiAmZ3Q7IDxiPldlYjwvYj4gJmd0OyA8Yj5DU1M8L2I+PC9zcGFuPi48L3NwYW4+IFRoZSBOZXcgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IHdpbmRvdyBhcHBlYXJzCi13aXRoIHlvdXIgZm9sZGVyIHNlbGVjdGVkPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlCi1hIGNzcyBleHRlbnNpb24gaW4gdGhlIGZpbGUgbmFtZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L3NwYW4+PHVsPjxsaT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBDU1MgZmlsZSwgc2VsZWN0IDxiPkZpbmlzaC48L2I+PC9saT4KLTxsaT4gVG8gdXNlIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIGluaXRpYWwgY29udGVudCBvZiB5b3VyIENTUyBmaWxlLAotc2VsZWN0IDxiPk5leHQ8L2I+LiBUaGUgU2VsZWN0IENTUyBUZW1wbGF0ZSB3aW5kb3cgYXBwZWFycy4KLVNlbGVjdCB0aGUgPGI+VXNlIENTUyBUZW1wbGF0ZTwvYj4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QKLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPGI+Q1NTIFRlbXBsYXRlczwvYj4gbGluawotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvbGk+Ci08L3VsPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhYjcwYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgIGlkPSJ0d2NyZXByaiI+PGEgbmFtZT0idHdjcmVwcmoiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9oMT4KLTxkaXY+PHA+WW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zCi1pbiBXZWIgcHJvamVjdHMuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiBVbmxpa2Ugd2l0aCA8YSBocmVmPSJ0d2NyZXN0YS5odG1sIj5zdGF0aWM8L2E+IFdlYgotcHJvamVjdHMsICBkeW5hbWljIFdlYiBwcm9qZWN0cyBlbmFibGUgeW91IHRvIGNyZWF0ZSByZXNvdXJjZXMgc3VjaCBhcyBKYXZhU2VydmVyCi1QYWdlcyBhbmQgc2VydmxldHMuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGR5bmFtaWMgV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZQotZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5PcGVuIHRoZSBKMkVFIHBlcnNwZWN0aXZlLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCByaWdodCBjbGljayBvbiBEeW5hbWljIFdlYiBQcm9qZWN0cywgYW5kCi1zZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48Yj5OZXc8L2I+ICZndDsgPGI+RHluYW1pYyBXZWIgUHJvamVjdDwvYj48L3NwYW4+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhlIE5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvcD4KLTxkbD48ZHQgY2xhc3M9ImRsdGVybSI+UHJvamVjdCBGYWNldHMgPC9kdD4KLTxkZD5BIGZhY2V0IHJlcHJlc2VudHMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgaW4gYSBXZWIgcHJvamVjdC4gRm9yIGV4YW1wbGUsCi10aGUgRHluYW1pYyBXZWIgTW9kdWxlIGZhY2V0IGVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBkeW5hbWljCi1XZWIgbW9kdWxlLiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBmYWNldCBhcHBlYXJzIGluIHRoZSB3aXphcmQKLXdoZW4geW91IHNlbGVjdCBpdC4gIE5vdGUgdGhhdCBpbiBtYW55IGluc3RhbmNlcywgeW91IGNhbiB2aWV3IHRoZSBjb25zdHJhaW50cwotZm9yIGEgcHJvamVjdCBmYWNldCBieSByaWdodCBjbGlja2luZyBvbiB0aGUgZmFjZXQgYW5kIHNlbGVjdGluZyBwcm9qZWN0IGNvbnN0cmFpbnRzCi1mcm9tIHRoZSBwb3AgdXAgbWVudS4gIDwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+VGFyZ2V0IFJ1bnRpbWU8L2R0PgotPGRkPlVzZSB0aGlzIGZpZWxkIHRvIGRlZmluZSBhIG5ldyBpbnN0YWxsZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUnVudGltZXMKLWFyZSB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gY29tcGlsZSBwcm9qZWN0cy48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpPC9kdD4KLTxkZD5BIG5ldyBvciBleGlzdGluZyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgKEVBUiBQcm9qZWN0KSBtdXN0IGJlCi1hc3NvY2lhdGVkIHdpdGggeW91ciBuZXcgV2ViIHByb2plY3QgdG8gZmFjaWxpdGF0ZSBkZXBsb3ltZW50LiBJZiB5b3Ugd2FudAotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QsIHlvdQotY2FuIGRvIHNvIHVzaW5nIHRoZSB3aXphcmQuIFdoZW4geW91ciBXZWIgcHJvamVjdCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQgb2YKLXRoZSB3aXphcmQsIHRoZSBuZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IGlzIGFsc28gY3JlYXRlZCB3aXRoIHRoZQotbmFtZSBzcGVjaWZpZWQgaW4gdGhlIEVBUiBwcm9qZWN0IGZpZWxkLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUKLW9mIHRoZSB3ZWIgcHJvamVjdCBhcHBlbmRlZCB3aXRoIEVBUiAodW5sZXNzIHRoZSBlYXIgcHJvamVjdCB3YXMgc2VsZWN0ZWQKLXdoZW4geW91IG9wZW5lZCB0aGUgd2l6YXJkLik8L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkNvbnRleHQgUm9vdDwvZHQ+Ci08ZGQ+VGhlIGNvbnRleHQgcm9vdCBpcyB0aGUgV2ViIGFwcGxpY2F0aW9uIHJvb3QsIHdoaWNoIGlzIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5Ci1vZiB5b3VyIGFwcGxpY2F0aW9uIHdoZW4gaXQgaXMgZGVwbG95ZWQgdG8gdGhlIFdlYiBzZXJ2ZXIuIFlvdSBjYW4gY2hhbmdlCi10aGUgY29udGV4dCByb290IGFmdGVyIHlvdSBjcmVhdGUgYSBwcm9qZWN0IHVzaW5nIHRoZSBwcm9qZWN0IFByb3BlcnRpZXMgZGlhbG9nLAotd2hpY2ggeW91IGFjY2VzcyBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUuIFRoZSBjb250ZXh0IHJvb3QgY2FuIGFsc28KLWJlIHVzZWQgYnkgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gZW5zdXJlIHRoYXQgeW91ciBsaW5rcyByZW1haW4gcmVhZHkgdG8gcHVibGlzaAotYXMgeW91IG1vdmUgYW5kIHJlbmFtZSBmaWxlcyBpbnNpZGUgeW91ciBwcm9qZWN0LjwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0iY2NzdGF0aWMuaHRtbCI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY2N3ZWJwcmouaHRtbCI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0idGpjcmVqc3AuaHRtbCI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDBiZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y3Jlc3RhIj48YSBuYW1lPSJ0d2NyZXN0YSI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvaDE+Ci08ZGl2PjxwPjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBJbiB0aGUgd29ya2JlbmNoLCB5b3UgY3JlYXRlIGFuZCBtYWludGFpbiByZXNvdXJjZXMgZm9yIFdlYiBhcHBsaWNhdGlvbnMKLWluIFdlYiBwcm9qZWN0cy4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbgotdGhhdCBjb250YWlucyBubyBkeW5hbWljIGVsZW1lbnRzLCBzdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cywgdXNlIHRoZSA8c3Bhbj48Yj5OZXcKLVN0YXRpYyBXZWIgUHJvamVjdDwvYj48L3NwYW4+IHdpemFyZC4gPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IHN0YXRpYwotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHRoZSBKMkVFIHBlcnNwZWN0aXZlIDwvc3Bhbj4gPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIHJpZ2h0IGNsaWNrIG9uIE90aGVyIFByb2plY3RzIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXctJmd0O090aGVyLSZndDtXZWItJmd0O1N0YXRpYwotV2ViIFByb2plY3Q8L3N0cm9uZz4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGUgTmV3IFN0YXRpYyBXZWIgUHJvamVjdCB3aXphcmQgc3RhcnRzLiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzPC9zcGFuPiA8L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvcD4KLTxkbD48ZHQgY2xhc3M9ImRsdGVybSI+UHJvamVjdCBGYWNldHMgPC9kdD4KLTxkZD5BIGZhY2V0IHJlcHJlc2VudHMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgaW4gYSBXZWIgcHJvamVjdC4gRm9yIGV4YW1wbGUsCi10aGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYwotV2ViIG1vZHVsZS4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QgZmFjZXQgYXBwZWFycyBpbiB0aGUgd2l6YXJkCi13aGVuIHlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMKLWZvciBhIHByb2plY3QgZmFjZXQgYnkgcmlnaHQgY2xpY2tpbmcgb24gdGhlIGZhY2V0IGFuZCBzZWxlY3RpbmcgcHJvamVjdCBjb25zdHJhaW50cwotZnJvbSB0aGUgcG9wIHVwIG1lbnUuICA8L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPlRhcmdldCBSdW50aW1lPC9kdD4KLTxkZD5Vc2UgdGhpcyBmaWVsZCB0byBkZWZpbmUgYSBuZXcgaW5zdGFsbGVkIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFJ1bnRpbWVzCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuIDwvZGQ+Ci08L2RsPgotPGRsPjxkdCBjbGFzcz0iZGx0ZXJtIj5XZWIgQ29udGVudCBGb2xkZXI8L2R0PgotPGRkPlRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdG8gc3RvcmUgeW91ciBwdWJsaXNoYWJsZSByZXNvdXJjZXMuIDwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0iY2NzdGF0aWMuaHRtbCI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXdhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOWFjMjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2NyZXdhciI+PGEgbmFtZT0idHdjcmV3YXIiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiBBIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24gdGhhdAotY2FuIGJlIGV4cG9ydGVkIHRvIHRlc3QsIHB1Ymxpc2gsIGFuZCBkZXBsb3kgdGhlIHJlc291cmNlcyBkZXZlbG9wZWQgd2l0aGluCi1hIFdlYiBwcm9qZWN0LjwvcD4KLTxwPlRvIGV4cG9ydCBhIFdBUiBmaWxlIGZyb20gYSBXZWIgcHJvamVjdCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGZvbGRlciBhbmQgc2VsZWN0IDxzdHJvbmc+RXhwb3J0PC9zdHJvbmc+IGZyb20KLXRoZSBwb3AtdXAgbWVudS4gVGhlbiBzZWxlY3Q8c3Ryb25nPiBXQVIgZmlsZTwvc3Ryb25nPiBpbiB0aGUgRXhwb3J0IHdpbmRvdyBhbmQgdGhlbgotc2VsZWN0IDxzdHJvbmc+TmV4dDwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgV2ViIHByb2plY3QgeW91IHdhbnQgdG8gZXhwb3J0ICh0aGlzIGZpZWxkIGlzIHByaW1lZAotaWYgeW91IHVzZWQgdGhlIHBvcC11cCBtZW51IHRvIG9wZW4gdGhlIHdpemFyZCksIGFuZCBzcGVjaWZ5IGEgbG9jYXRpb24gZm9yCi10aGUgbmV3IFdBUiBmaWxlPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPk9wdGlvbmFsbHksIHN1cHBseSBXQVIgZXhwb3J0IDxzcGFuPk9wdGlvbnM8L3NwYW4+LAotc3VjaCBhcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIEphdmEmIzg0ODI7IHNvdXJjZSBmaWxlcyBpbiB0aGUgV0FSLCBhbmQgd2hldGhlcgotdG8gb3ZlcndyaXRlIGFueSBleGlzdGluZyByZXNvdXJjZXMgZHVyaW5nIHRoZSBleHBvcnQgcHJvY2Vzcy4gPC9zcGFuPiBTb3VyY2UKLWZpbGVzIGFyZSBub3QgdXN1YWxseSBpbmNsdWRlZCBpbiBhIFdBUiBmaWxlLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBuZWNlc3NhcnkKLWZvciB0aGUgc2VydmVyIHRvIHJ1biB0aGUgd2ViIGFwcGxpY2F0aW9uLjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuPjxiPkZpbmlzaDwvYj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJjd3dhcm92ci5odG1sIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxOGMyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+U2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjdnNyIj48YSBuYW1lPSJ0d2N2c3IiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0czwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5XaGVuIHlvdSB1c2UgYSBDVlMgcmVwb3NpdG9yeSBkdXJpbmcgdGVhbSBkZXZlbG9wbWVudCwgeW91IG1pZ2h0Ci13YW50IHRvIHVzZSB0aGUgZm9sbG93aW5nIHNldHVwIHRvIGVuc3VyZSB0aGF0IHRoZSBDVlMgdmVyc2lvbmluZyBzdXBwb3J0Ci1pZ25vcmVzIHRoZSBwcm9qZWN0J3MgYnVpbGQgb3V0cHV0IGZvbGRlcjo8L3A+Ci0gPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBmaWxlIGNhbGxlZCAuY3ZzaWdub3JlIGluIHlvdXIgcHJvamVjdCdzIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+V2ViQ29udGVudC9XRUItSU5GPC9zcGFuPiBmb2xkZXIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoaXMgZmlsZSwgYWRkIGEgbGluZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyCi0oZm9yIGV4YW1wbGUsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmNsYXNzZXM8L3NhbXA+KS48L3NwYW4+IDxwPkN1cnJlbnRseSwgeW91IGhhdmUKLXRoZSBvcHRpb24gb2YgY3JlYXRpbmcgdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgKGFzIGEgZmVhdHVyZSkgd2hlbiB1c2luZyB0aGUKLU5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZC48L3A+Ci08cD5XaGVuIHlvdSBzeW5jaHJvbml6ZSB3aXRoIGEgQ1ZTIHRlYW0KLXN0cmVhbSwgdGhlIG91dHB1dCBmb2xkZXIgd2lsbCBiZSBpZ25vcmVkLjwvcD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIGFkZGl0aW9uLCB5b3Ugc2hvdWxkIHR1cm4gb2ZmIHRoZSA8c3Bhbj48Yj5QcnVuZSBlbXB0eQotZGlyZWN0b3JpZXM8L2I+PC9zcGFuPiBvcHRpb24uIFNlbGVjdCA8c3Bhbj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxiPldpbmRvd3M8L2I+ICZndDsgPGI+UHJlZmVyZW5jZXM8L2I+PC9zcGFuPjwvc3Bhbj4sIHN3aXRjaCB0byB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48Yj5UZWFtPC9iPiAmZ3Q7IDxiPkNWUzwvYj48L3NwYW4+PC9zcGFuPiBwcm9wZXJ0aWVzCi1wYWdlLCBhbmQgZW5zdXJlIHRoYXQgdGhlIDxzcGFuPjxiPlBydW5lIGVtcHR5IGRpcmVjdG9yaWVzPC9iPjwvc3Bhbj4gY2hlY2sKLWJveCBpcyBub3QgY2hlY2tlZC48L3NwYW4+IDxwPklmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIHlvdXIgV2ViIHByb2plY3Qncwotc291cmNlIGRpcmVjdG9yeSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIHByb2plY3QgaXMgYWRkZWQgdG8KLXlvdXIgd29ya3NwYWNlIGZyb20gYSBDVlMgcmVwb3NpdG9yeSwgY2F1c2luZyBhIEphdmEmIzg0ODI7IGJ1aWxkIGVycm9yLjwvcD4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDQ3NjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2ltcHdhciI+PGEgbmFtZT0idHdpbXB3YXIiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkEgV2ViIEFyY2hpdmUgKFdBUikgZmlsZSBpcyBhIHBvcnRhYmxlLCBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24KLXRoYXQgeW91IGNhbiBpbXBvcnQgaW50byB5b3VyIHdvcmtzcGFjZS4gPC9wPgotPHA+IEJlZm9yZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSwKLXlvdSBzaG91bGQgZmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSBXQVIgZmlsZSBjb250YWlucyBuZWVkZWQgSmF2YSYjODQ4Mjsgc291cmNlCi1maWxlcy4gV2hlbiBpbXBvcnRpbmcgYSBXQVIgZmlsZSBpbnRvIGFuIGV4aXN0aW5nIFdlYiBwcm9qZWN0LCB0aGUgaW1wb3J0ZWQKLVdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMgYXJlIGVpdGhlciBub3QgY2hhbmdlZCBvciBvdmVyd3JpdHRlbiBieSB0aGUKLW9uZXMgaW5jbHVkZWQgaW4gdGhlIGltcG9ydGVkIFdBUiBmaWxlLCBiYXNlZCBvbiB5b3VyIHJlc3BvbnNlIHRvIHRoZSBwcm9tcHQKLXRoYXQgaXMgcHJvdmlkZWQuICBJbiBlaXRoZXIgY2FzZSwgdGhpcyBhY3Rpb24gZG9lcyA8ZW0+bm90PC9lbT4gcmVwcmVzZW50IGEKLW1lcmdpbmcgb2YgdGhlIHR3byBzZXRzIG9mIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICA8L3A+Ci0gIDxwPlRvIGltcG9ydCB0aGUKLVdlYiBwcm9qZWN0IHJlc291cmNlcyBpbiBhIFdBUiBmaWxlIGludG8geW91ciB3b3Jrc3BhY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+RmlsZTwvYj4gJmd0OyA8Yj5JbXBvcnQ8L2I+PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBJbiB0aGUgSW1wb3J0IGRpYWxvZywgc2VsZWN0IDxzcGFuPjxiPldBUiBmaWxlPC9iPjwvc3Bhbj4gYW5kCi10aGVuIGNsaWNrIDxzcGFuPjxiPk5leHQ8L2I+PC9zcGFuPi4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkxvY2F0ZSB0aGUgV0FSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgdXNpbmcgdGhlIDxzcGFuPjxiPkJyb3dzZTwvYj48L3NwYW4+IGJ1dHRvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+IFRoZSB3aXphcmQgYXNzdW1lcyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgV2ViIHByb2plY3Qgd2l0aCB0aGUKLXNhbWUgbmFtZSBhcyB0aGUgV0FSIGZpbGUuIElmIHlvdSBhY2NlcHQgdGhpcyBjaG9pY2UsIHRoZSBwcm9qZWN0IHdpbGwgYmUKLWNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBzZXJ2bGV0IHZlcnNpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSBXQVIgZmlsZSBhbmQgaW4KLXRoZSBzYW1lIGxvY2F0aW9uLiBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGVzZSBzZXR0aW5ncywgeW91IGNhbiBjbGljayA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQKLXNwZWNpZnkgeW91ciBuZXcgc2V0dGluZ3MgaW4gdGhlIER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvc3Bhbj4gIDxwPklmCi15b3Ugd2FudCB0byBpbXBvcnQgdGhlIFdBUiBmaWxlIGludG8gYW4gZXhpc3RpbmcgV2ViIHByb2plY3QsIHlvdSBjYW4gc2VsZWN0Ci10aGUgcHJvamVjdCBmcm9tIHRoZSBXZWIgcHJvamVjdCBkcm9wLWRvd24gbGlzdC4gTm90ZSB0aGF0IGlmIHlvdSBzZWxlY3QgYW4KLWV4aXN0aW5nIHByb2plY3QsIHlvdSBtdXN0IGRlY2lkZSB3aGV0aGVyIHlvdSB3YW50IHRvIHNlbGVjdCB0aGUgc2V0dGluZyB0byA8c3Ryb25nPm92ZXJ3cml0ZQotZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZzwvc3Ryb25nPjwvcD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuPjxiPkZpbmlzaDwvYj48L3NwYW4+IHRvIHBvcHVsYXRlIHRoZSBXZWIKLXByb2plY3QuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnI+Ci08ZGl2PjxhIGhyZWY9ImN3d2Fyb3ZyLmh0bWwiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3MTVkMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5Db252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3cGNudnJ0Ij48YSBuYW1lPSJ0d3BjbnZydCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+IElmIHlvdSB3YW50IHRvIGFkZCBkeW5hbWljIGVsZW1lbnRzIHRvIGEgc3RhdGljIHdlYiBwcm9qZWN0LAotc3VjaCBhcyBKYXZhJiM4NDgyOyBzZXJ2bGV0cyBhbmQgSlNQIGZpbGVzLCB5b3UgbXVzdCBjb252ZXJ0IHRoZSBwcm9qZWN0Ci1mcm9tIGEgc3RhdGljIHRvIGEgZHluYW1pYyBvbmUuIFRvIGNvbnZlcnQgYSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYSBkeW5hbWljCi1XZWIgcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHByb2plY3QgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgYW5kIHRoZW4gc2VsZWN0IDxzcGFuPjxiPkNvbnZlcnQKLXRvIGEgRHluYW1pYyBXZWIgUHJvamVjdDwvYj48L3NwYW4+IGZyb20gdGhlIDxzdHJvbmc+UHJvamVjdDwvc3Ryb25nPiBtZW51Ljwvc3Bhbj4gVGhpcyBjb252ZXJzaW9uIGFzc3VtZXMgdGhlICBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uIHdpbGwgYmUgdGhlIHNhbWUuCi1UaGUgY29udmVyc2lvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIENTUyBmaWxlIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgc3RhdGljCi1wcm9qZWN0LCBzbyBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgZHluYW1pYyBXZWIgcHJvamVjdC4gPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+IFNwZWNpZnkgdGhlIHByb2plY3QgcHJvcGVydGllcyB0aGF0IGFyZSBhdmFpbGFibGUgd2hlbiAgPGEgaHJlZj0idHdjcmVwcmouaHRtbCI+Q3JlYXRpbmcgYSBEeW5hbWljIFdlYiBwcm9qZWN0LjwvYT48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxicj4KLTxkaXY+PGEgaHJlZj0iY2NzdGF0aWMuaHRtbCI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY2N3ZWJwcmouaHRtbCI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlODgzYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3BsaWIiPjxhIG5hbWU9InR3cGxpYiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+V2ViIGxpYnJhcnkgcHJvamVjdHMgYWxsb3cgeW91IHRvIGFzc29jaWF0ZSBKYXZhJiM4NDgyOyBwcm9qZWN0cwotd2l0aCAidmlydHVhbCIgSkFSIGZpbGVzIGluIGEgV2ViIHByb2plY3QncyBXRUItSU5GL2xpYiBkaXJlY3RvcnkuIFlvdSBjYW4KLXJlZmVyZW5jZSBKQVIgZmlsZXMgdGhhdCBleGlzdCBlbHNld2hlcmUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotdGhhdCBjb250YWlucyB5b3VyIFdlYiBwcm9qZWN0LCBpZiB0aGV5IGFyZSBpbiB0aGUgV2ViIHByb2plY3QncyBidWlsZCBwYXRoLAotYW5kIGF2b2lkIHRoZSBuZWVkIHRvIGV4cGxpY2l0bHkgY29weSB0aGVzZSBKQVIgZmlsZXMgaW50byB0aGUgcHJvamVjdCdzIGxpYgotZm9sZGVyIGJlZm9yZSB5b3UgcHVibGlzaCB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIGEgc2VydmVyLjwvcD4KLTxwPlRvIHNldCB1cCB0aGVzZSBhc3NvY2lhdGlvbnM6PC9wPgotIDwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gYSBXZWIgcHJvamVjdCBhbmQgc2VsZWN0IDxiPlByb3BlcnRpZXM8L2I+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+IDwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCA8Yj5KMkVFIE1vZHVsZSBEZXBlbmRlbmNpZXM8L2I+PC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNldCB1cCB5b3VyIGFzc29jaWF0aW9ucyBpbiB0aGUgSjJFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIHdpbmRvdzwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Bhbj48Yj5PSzwvYj48L3NwYW4+IHdoZW4geW91IGFyZSBkb25lLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyYmQ0NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCA0LjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD48aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIi8+Ci08dGl0bGU+U2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3ByanNldCI+PGEgbmFtZT0idHdwcmpzZXQiPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRoZXJlIGFyZSBtYW55IFdlYiBwcm9qZWN0IHByb3BlcnRpZXMgdGhhdCB5b3UgY2FuIHNldCB0aGF0IGFmZmVjdAotdGhlIHBoYXNlcyBpbiB0aGUgbGlmZWN5Y2xlIG9mIHlvdXIgcHJvamVjdCBhbmQgaXRzIGRlcGVuZGVuY2llcyBvbiBvdGhlcgotV2ViIHJlc291cmNlcyBhbmQgV2ViIGRldmVsb3BtZW50IHByb2Nlc3Nlcy4gWW91IG1pZ2h0IHdhbnQgdG8gdmVyaWZ5IG9yIHVwZGF0ZQotdGhlc2UgcHJvcGVydGllcyBhZnRlciB5b3UgaGF2ZSB1cGRhdGVkIGFuIGV4aXN0aW5nIHByb2plY3Qgb3IgaGF2ZSBpbXBvcnRlZAotV2ViIHJlc291cmNlcyBpbnRvIGEgcHJvamVjdCAuPC9wPgotPHA+VG8gdmlldyBvciBzZXQgV2ViIHByb2plY3QgcHJvcGVydGllcywKLWRvIHRoZSBmb2xsb3dpbmc6IDwvcD4KLSA8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIG9uIGEgV2ViIFByb2plY3QsIGFuZCBmcm9tIHRoZSBwb3AtdXAgbWVudSBzZWxlY3QgPHNwYW4+PGI+UHJvcGVydGllczwvYj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBwcm9wZXJ0eSB0eXBlIGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByb3BlcnRpZXMgZGlhbG9nCi10byB2aWV3IG9yIHVwZGF0ZSBwcm9wZXJ0aWVzIGluIHRoZSBXZWIgcHJvamVjdC4gRm9yIGVhY2ggcHJvcGVydHksIHlvdSBjYW4KLWFwcGx5IGNoYW5nZXMgYW5kIG1vZGlmeSBkZWZhdWx0IHNldHRpbmdzLiBCYXNlZCBvbiB3aGV0aGVyIHlvdSBoYXZlIGEgc3RhdGljCi1vciBhIGR5bmFtaWMgV2ViIHByb2plY3QsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdHlwZXMgYXJlIGF2YWlsYWJsZTo8L3NwYW4+IDxkbD48ZHQgY2xhc3M9ImRsdGVybSI+SW5mbzwvZHQ+Ci08ZGQ+UHJvdmlkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBwcm9qZWN0IHR5cGUsIGxvY2F0aW9uLCBhbmQgbW9kaWZpY2F0aW9uCi1zdGF0dXMuIDwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+QmVhbkluZm8gUGF0aCAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci08ZGQ+SWYgeW91IHNlbGVjdCB0aGUgRW5hYmxlIEJlYW5pbmZvIEludHJvc3BlY3Rpb24gb24gdGhpcyBwcm9qZWN0LCB5b3UgY2FuCi1zcGVjaWZ5IHRoZSBjb250ZW50cyBhbmQgb3JkZXIgb2YgSmF2YSYjODQ4MjsgQmVhbiBzZWFyY2ggcGF0aHMgdG8gcHJvdmlkZSBCZWFuIGluZm9ybWF0aW9uCi1yZWxldmFudCB0byB0aGUgcHJvamVjdC4gWW91IGNhbiBhZGQsIHJlbW92ZSwgYW5kIHJlb3JkZXIgKHVzaW5nIHRoZSA8c3Bhbj5VcDwvc3Bhbj4gYW5kIDxzcGFuPkRvd248L3NwYW4+IGJ1dHRvbnMpCi10aGUgcGFja2FnZXMgdXNlZCB0byBpbmNsdWRlIEJlYW4gaW5mb3JtYXRpb24uPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5CdWlsZGVyczwvZHQ+Ci08ZGQ+QWRkLCByZW1vdmUsIG9yIHJlb3JkZXIgZXh0ZXJuYWwgdG9vbHMgaW4gdGhlIGJ1aWxkIG9yZGVyLiBXaGVuIHlvdSBzZWxlY3QgPGI+TmV3PC9iPiB0bwotY3JlYXRlIGEgbmV3IGV4dGVybmFsIHRvb2wgdG8gdGhlIGxpc3QsIHRoZSBOZXcgRXh0ZXJuYWwgVG9vbCB3aXphcmQgb3BlbnMsCi1zbyB0aGF0IHlvdSBjYW4gZGVmaW5lIHRoZSBuZXcgYnVpbGQgdG9vbC48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkoyRUUgKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotPGRkPklkZW50aWZ5IFdlYiBsZXZlbCBzcGVjaWZpY2F0aW9uIGFuZCBtb2RpZnkgY29udGV4dCByb290IGFuZCBXZWIgY29udGVudAotZm9sZGVyIG5hbWU8L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmEgQnVpbGQKLVBhdGggKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotPGRkPlZpZXcgb3IgY2hhbmdlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgSmF2YSBidWlsZCBwYXRoIHRoYXQgeW91IHN1cHBsaWVkIHdoZW4gY3JlYXRpbmcKLXRoZSBwcm9qZWN0IHVzaW5nIHRoZSA8c3Bhbj5DcmVhdGUgYSBEeW5hbWljV2ViIFByb2plY3Q8L3NwYW4+IHdpemFyZC4gV2hlbmV2ZXIKLXRoZSBXZWIgcHJvamVjdCBpcyByZWJ1aWx0LCBhbnkgY2xhc3MgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBvciB1cGRhdGVkIHdpbGwKLWJlIG91dHB1dCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBmb2xkZXIuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGxpYnJhcnkgZW50cnkgb24gdGhlIEphdmEgYnVpbGQKLXBhdGggd2lsbCByZW1haW4gdGhlcmUgdW5sZXNzIHRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYgotZm9sZGVyLiBJZiB5b3UgcmVtb3ZlIGEgbGlicmFyeSBwYXRoIGVudHJ5IGJ1dCBub3QgdGhlIEpBUiBmaWxlLCB0aGUgbGlicmFyeQotZW50cnkgd2lsbCBiZSByZS1hZGRlZCB0byB0aGUgcGF0aCBhdXRvbWF0aWNhbGx5LjwvZGl2PgotPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhIENvbXBpbGVyCi0oRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci08ZGQ+RGVmaW5lIHdoZXRoZXIgdG8gdXNlIHdvcmtzcGFjZSBzZXR0aW5ncyBvciBwcm9qZWN0IHNldHRpbmcgZm9yIGNvbXBpbGluZyBKYXZhIGNvZGUsCi1pbmNsdWRpbmcgc2V0dGluZ3MgZm9yIFByb2JsZW1zLCBTdHlsZSwgQ29tcGxpYW5jZSBhbmQgQ2xhc3NmaWxlcywgYW5kIEJ1aWxkCi1QYXRoLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YWRvYyBMb2NhdGlvbiAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci08ZGQ+RGVmaW5lIGEgZGVmYXVsdCBsb2NhdGlvbiAoVVJMKSBmb3IgYW55IEphdmFkb2MgYXZhaWxhYmxlIHRvIHRoZSBwcm9qZWN0LjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YSBKQVIKLURlcGVuZGVuY2llcyAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci08ZGQ+RGVmaW5lIGFuZCByZW9yZGVyIEpBUiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm9qZWN0LiBOb3RlIHRoYXQgdGhlc2UgZGVwZW5kZW5jaWVzCi1tYXkgZGlmZmVyIGJhc2VkIG9uIGEgV2ViIHByb2plY3QncyBhc3NvY2lhdGlvbiB3aXRoIG11bHRpcGxlIEVudGVycHJpc2UgYXBwbGljYXRpb24KLXByb2plY3RzLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SlNQIFRhc2sgVGFnczwvZHQ+Ci08ZGQ+QWRkLCBlZGl0LCBvciByZW1vdmUgSlNQIHRhc2sgdGFncyBhbmQgYXNzaWduIHRhZyBwcmlvcml0aWVzLiBUaGVzZSAmYW1wO3RvIGRvJmFtcDsgaXRlbXMgYXBwZWFyIGluIHlvdXIgVGFza3Mgdmlldy48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkpTUCBDb21waWxhdGlvbjwvZHQ+Ci08ZGQ+U3BlY2lmeSB3aGVuIGluIHRoZSBidWlsZCBwcm9jZXNzIGEgSlNQIHNob3VsZCBiZSBzZXQgdG8gY29tcGlsZTwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SlNQIEZyYWdtZW50IChkeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLTxkZD5EZWZpbmUgZGVmYXVsdCBlbmNvZGluZywgcGFnZSBkaXJlY3RpdmUsIGFuZCBjb250ZW50IHR5cGUgdmFsdWVzIGZvciBKU1AKLWZyYWdtZW50IGRvY3VtZW50cyBpbiB0aGUgd2ViIHByb2plY3QuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5MaW5rcyBWYWxpZGF0aW9uL1JlZmFjdG9yaW5nPC9kdD4KLTxkZD5EZWZpbmUgcHJvamVjdC1sZXZlbCBsaW5rIG1hbmFnZW1lbnQgYW5kIHZhbGlkYXRpb24gc2V0dGluZ3MuIFRoZXNlIHNldHRpbmdzCi1vdmVycmlkZSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGluIHRoZSBXb3JrYmVuY2ggUHJlZmVyZW5jZSBzZXR0aW5ncyBmb3IgdGhlCi1jdXJyZW50IHByb2plY3QuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Qcm9qZWN0IFJlZmVyZW5jZXM8L2R0PgotPGRkPlJlZmVyZW5jZSBvdGhlciBXZWIgcHJvamVjdHMgdGhhdCBleGlzdCBvbiB5b3VyIHdvcmtiZW5jaCB3b3Jrc3BhY2UuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5TZXJ2ZXI8L2R0PgotPGRkPlNlbGVjdCB0aGUgc2VydmVyIGluc3RhbmNlIHVzZWQgdG8gcGVyZm9ybSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQsIHRlc3QsCi1hbmQgcHVibGlzaGluZyBmdW5jdGlvbnMgZm9yIHRoZSBwcm9qZWN0LjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+VmFsaWRhdGlvbjwvZHQ+Ci08ZGQ+U3BlY2lmeSB3aGljaCB2YWxpZGF0b3JzIHNob3VsZCBydW4gZm9yIHRoZSBwcm9qZWN0LCBhbmQgd2hldGhlciB2YWxpZGF0aW9uCi1zaG91bGQgb2NjdXIgYXV0b21hdGljYWxseSB3aGVuIHJlc291cmNlIHVwZGF0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHByb2plY3QuCi1UaGUgYXZhaWxhYmxlIHZhbGlkYXRvcnMgYXJlIGJhc2VkIG9uIHRoZSB0eXBlcyBvZiByZXNvdXJjZXMgaW4geW91ciBwcm9qZWN0LgotQnkgZGVmYXVsdCwgdmFsaWRhdG9ycyBhcmUgYXV0b21hdGljYWxseSBydW4gd2hlbiB5b3Ugc2F2ZSByZXNvdXJjZXMgaW4gYQotV2ViIHByb2plY3QuIElmIHlvdSBkbyBub3Qgd2FudCB2YWxpZGF0b3JzIHRvIHJ1biBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUKLXRoZXNlIHJlc291cmNlcywgZW5hYmxlIHRoZSA8Yj5PdmVycmlkZSB2YWxpZGF0aW9uPC9iPiBwcmVmZXJlbmNlcwotb3B0aW9uIGFuZCBkaXNhYmxlIHRoZSA8Yj5SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUKLWNoYW5nZXMgdG8gcmVzb3VyY2VzPC9iPiBvcHRpb24uIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIGFsc28gIGRpc2FibGUgYXV0b21hdGljCi12YWxpZGF0aW9uIChhbmQgYnVpbGRzKSBmb3IgYWxsIHByb2plY3RzIGJ5IGRpc2FibGluZyA8Yj5QZXJmb3JtIGJ1aWxkCi0gYXV0b21hdGljYWxseSBvbiByZXNvdXJjZSBtb2RpZmljYXRpb248L2I+IGZyb20gdGhlIDxiPldvcmtiZW5jaDwvYj4gcHJvcGVydGllcy4KLUlmICB5b3UgZGlzYWJsZSBhdXRvbWF0aWMgYnVpbGRzLCB5b3UgY2FuIG1hbnVhbGx5ICBydW4gYSBidWlsZCAoYW5kIHZhbGlkYXRpb24pCi1ieSBzZWxlY3RpbmcgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+UHJvamVjdDwvYj4gJmd0OyA8Yj5SZWJ1aWxkCi1wcm9qZWN0PC9iPjwvc3Bhbj4uPC9kaXY+Ci08L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPldlYiBDb250ZW50IFNldHRpbmdzPC9kdD4KLTxkZD5Qcm92aWRlIGFueSBhcHBsaWNhYmxlIFdlYiBjb250ZW50IHNldHRpbmdzIGZvciBhIFdlYiBwcm9qZWN0LiBZb3UgY2FuCi1zcGVjaWZ5IHRoZSBkb2N1bWVudCB0eXBlLCBDU1MgcHJvZmlsZSwgYW5kIHRhcmdldCBkZXZpY2UuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XZWIgUHJvamVjdCBGZWF0dXJlczwvZHQ+Ci08ZGQ+U2VsZWN0IHRoZSBmZWF0dXJlcyB5b3Ugd2FudCB0byBiZSBlbmFibGVkIGZvciB5b3VyIFdlYiBwcm9qZWN0LCBzdWNoCi1hcyBQYWdlIFRlbXBsYXRlIHN1cHBvcnQuPC9kZD4KLTwvZGw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XaGVuIHlvdSBoYXZlIGNvbXBsZXRlZCB1cGRhdGVzIHRvIFdlYiBwcm9qZWN0IHNldHRpbmdzLCBjbGljayA8c3Bhbj48Yj5PSzwvYj48L3NwYW4+IHRvCi1zYXZlIGFuZCBjbG9zZSB0aGUgUHJvcGVydGllcyBkaWFsb2cuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNkZDNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgNC4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+PGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIvPgotPHRpdGxlPkNyZWF0aW5nIHNlcnZsZXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IHhtbDpsYW5nPSJlbi11cyIgaWQ9InR3c3J2d2l6Ij48YSBuYW1lPSJ0d3NydndpeiI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBzZXJ2bGV0czwvaDE+Ci08ZGl2PjxwPlRoZSBzZXJ2bGV0IHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIEphdmEmIzg0ODI7IHNlcnZsZXRzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlCi1jcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IKLXRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgc2VydmxldHMgY2FuIHJ1bgotb24gSjJFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRvIGNyZWF0ZSBhIHNlcnZsZXQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgSjJFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDxhIGhyZWY9ImNjd2VicHJqLmh0bWwiPmR5bmFtaWMgcHJvamVjdDwvYT4gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gdGhlIDxzdHJvbmc+U2VydmxldDwvc3Ryb25nPiBpY29uLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PGI+TmV3PC9iPiAmZ3Q7IDxiPlNlcnZsZXQ8L2I+PC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuPC9zcGFuPiAgVGhlIDxiPkNyZWF0ZSBTZXJ2bGV0PC9iPiB3aXphcmQKLWFwcGVhcnMuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvcD4KLTxkbD48ZHQgY2xhc3M9ImRsdGVybSI+TW9kaWZpZXJzPC9kdD4KLTxkZD5Zb3UgY2FuIHNlbGVjdCBhIG1vZGlmaWVyIGluIHRoZSB3aXphcmQgdG8gc3BlY2lmeSB3aGV0aGVyIHlvdXIgc2VydmxldAotY2xhc3MgaXMgcHVibGljLCBhYnN0cmFjdCwgb3IgZmluYWwuIE5vdGUgdGhhdCBjbGFzc2VzIGNhbm5vdCBiZSBib3RoIGFic3RyYWN0Ci1hbmQgZmluYWwuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5qYXZheC5zZXJ2bGV0LlNlcnZsZXQ8L2R0PgotPGRkPkFsdGhvdWdoIGphdmF4LnNlcnZsZXQuU2VydmxldCBpcyBwcm92aWRlZCBhcyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UsIHlvdQotY2FuIHVzZSB0aGUgd2l6YXJkIHRvIGFkZCBhZGRpdGlvbmFsIGludGVyZmFjZXMgdG8gaW1wbGVtZW50LjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0PgotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IGVsZWN0IHRvIGFkZCBhbiBpbnRlcmZhY2UgdG8geW91ciBzZXJ2bGV0LgotQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIGxpc3Qgb2YgYXZhaWxhYmxlCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgTWF0Y2hpbmcgdHlwZXMgbGlzdCBib3ggdXBkYXRlcyBkeW5hbWljYWxseSB0byBkaXNwbGF5Ci1vbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFlvdSBzaG91bGQgY2hvb3NlIGFuIGludGVyZmFjZQotdG8gc2VlIHRoZSBxdWFsaWZpZXIsIGFuZCB0aGVuIGNsaWNrIE9LIHdoZW4gZmluaXNoZWQuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5NZXRob2Qgc3R1YnM8L2R0PgotPGRkPllvdSBjYW4gc2VsZWN0IGFueSBhcHByb3ByaWF0ZSBtZXRob2Qgc3R1YnMgdG8gYmUgY3JlYXRlZCBpbiB0aGUgc2VydmxldAotZmlsZS4gVGhlIHN0dWJzIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIEluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzIG9wdGlvbiBtdXN0Ci1iZSBpbXBsZW1lbnRlZCBpZiB5b3UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW4gYWJzdHJhY3Qgc2VydmxldC4gTm90ZSB0aGF0Ci10aGlzIGlzIG5vdCB0cnVlIGZvciBDb25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzPC9kZD4KLTwvZGw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyPgotPGRpdj48YSBocmVmPSJjd3NlcnZibi5odG1sIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDMyYTJiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHRvYyBsYWJlbD0iV2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IiB0b3BpYz0idG9waWNzL2Njd3RvdmVyLmh0bWwiPgotICAgIDx0b3BpYyBsYWJlbD0iV2ViIHRvb2xzIGZlYXR1cmVzIiBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50IiBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IldlYiByZXNvdXJjZXMiIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iV2ViIHBhZ2UgZGVzaWduIiBocmVmPSJ0b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iV2ViIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiIGhyZWY9InRvcGljcy9jY3dlYnByai5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlN0YXRpYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIGhyZWY9InRvcGljcy90d2ltcHdhci5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIiBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiIGhyZWY9InRvcGljcy9jd3dlZHR2dy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIiBocmVmPSJ0b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBzZXJ2bGV0cyIgaHJlZj0idG9waWNzL3R3c3J2d2l6Lmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJTZXJ2bGV0cyIgaHJlZj0idG9waWNzL2N3c2VydmJuLmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiIGhyZWY9InRvcGljcy90amNyZWpzcC5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5IiBocmVmPSJ0b3BpY3MvY3BkanNwcy5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIgaHJlZj0idG9waWNzL3R3Y3Zzci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnMiIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGZmNjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0ZmNhOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLTxkZXNjcmlwdGlvbi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0id2VieDAwNjAiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS4KLQotVmFyaW91cyBkZXZlbG9wbWVudCBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudCBsaW5lIGRlbGltaXRlcnMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUuIFNlbGVjdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IGNvcnJlc3BvbmRzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybS4KLQotPGI+Tm90ZTo8L2I+IFRoaXMgZGVsaW1pdGVyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gYW55IGRvY3VtZW50cyB0aGF0IGN1cnJlbnRseSBleGlzdC4gSXQgd2lsbCBiZSBhZGRlZCBvbmx5IHRvIGRvY3VtZW50cyB0aGF0IHlvdSBjcmVhdGUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LCBvciB0byBleGlzdGluZyBmaWxlcyB0aGF0IHlvdSBvcGVuIGFuZCB0aGVuIHJlc2F2ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4uCi0KLVRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQgZmlsZXMgKERURHMsIFhNTCBmaWxlcywgWE1MIHNjaGVtYXMpLiBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcsIFhNTCByZWxhdGVkIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmh0bWwiIGxhYmVsPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGFuZCBsaW5lIGRlbGltaXRlcnMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA2MSI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGZvcm1hdHRpbmcgYW5kIGNvbnRlbnQgYXNzaXN0IHByZWZlcmVuY2VzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gZWRpdGluZyBhbiBYTUwgZmlsZS4KLQotRW50ZXIgYSBtYXhpbXVtIHdpZHRoIGluIHRoZSA8Yj5MaW5lIHdpZHRoPC9iPiBmaWVsZCB0byBzcGVjaWZ5IHdoZW4gYSBsaW5lIHNob3VsZCBiZSBicm9rZW4gdG8gZml0IG9udG8gbW9yZSB0aGFuIG9uZSBsaW5lLiBUaGlzIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuCi0KLVNlbGVjdCA8Yj5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvYj4gdG8gc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCi1TZWxlY3QgPGI+Q2xlYXIgYWxsIGJsYW5rIGxpbmVzPC9iPiB0byByZW1vdmUgYmxhbmsgbGluZXMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCi1TZWxlY3QgPGI+SW5kZW50IHVzaW5nIHRhYnM8L2I+IGlmIHlvdSB3YW50IHRvIHVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLgotCi1JZiB5b3UgcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8Yj5JbmRlbnQgdXNpbmcgc3BhY2VzPC9iPi4KLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDxiPkluZGVudGF0aW9uIHNpemU8L2I+IHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uCi0KLVRvIGFwcGx5IHRoZXNlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIDxiPkZvcm1hdCAmZ3Q7IERvY3VtZW50PC9iPi4KLQotSWYgdGhlIDxiPkF1dG9tYXRpY2FsbHkgbWFrZSBzdWdnZXN0aW9uczwvYj4gY2hlY2sgYm94IGlzIHNlbGVjdGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhhdCBjZXJ0YWluIGNoYXJhY3RlcnMgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4gU3BlY2lmeSB0aGVzZSBjaGFyYWN0ZXJzIGluIHRoZSA8Yj5Qcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvYj4gZmllbGQuCi0KLUlmIHlvdSBzZWxlY3QgPGI+U3RyaWN0PC9iPiBmcm9tIHRoZSA8Yj5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9iPiBsaXN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgc2hvd24gZmlyc3QgKHdpdGggYm9sZCBpY29ucykgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQgc2NvcGUsIGJ1dCBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCwgd2lsbCBiZSBzaG93biBiZWxvdyB0aGVtIHdpdGggYSBkZS1lbXBoYXNpemVkIGljb24uIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIDxiPkxheDwvYj4uCi0KLUlmIGEgRFREIG9yIHNjaGVtYSAob3Igb3RoZXIgbW9kZWwpIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGFuIFhNTCBmaWxlLCBzZWxlY3RpbmcgPGI+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC9iPiBhbGxvd3MgdGhlIGVkaXRvciB0byAiZ3Vlc3MiIHdoYXQgZWxlbWVudHMgb3IgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGJhc2VkIG9uIGV4aXN0aW5nIGNvbnRlbnQuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwiIGxhYmVsPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0id2VieDAwNjIiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgdGhhdCB0aGUgWE1MIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4KLQotVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGFsbG93IHlvdSB0byBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQotQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdHM8L2I+IGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gSWYgeW91IG9ubHkgd2FudCB0byByZXNldCB0aGUgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUsIHNlbGVjdCBpdCBpbiB0aGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCwgdGhlIGNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IGJ1dHRvbiBuZXh0IHRvIGl0LjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuaHRtbCIgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA2MyI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGNyZWF0ZSBuZXcgdGVtcGxhdGVzIGFuZCBlZGl0IGV4aXN0aW5nIG9uZXMgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGVkaXRpbmcgYW4gWE1MIGZpbGUuIEEgdGVtcGxhdGUgaXMgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4KLQotQ2xpY2sgPGI+TmV3PC9iPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5IG5ldyB0ZW1wbGF0ZS4KLQotU3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxiPk5hbWU8L2I+IGFuZCA8Yj5EZXNjcmlwdGlvbjwvYj4uIFRoZSA8Yj5Db250ZXh0PC9iPiBmb3IgdGhlIHRlbXBsYXRlIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIFNwZWNpZnkgdGhlIDxiPlBhdHRlcm48L2I+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LgotCi1JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxiPkluc2VydCBWYXJpYWJsZTwvYj4gYnV0dG9uIGFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiBGb3IgZXhhbXBsZSwgdGhlIDxiPmRhdGU8L2I+IHZhcmlhYmxlIGluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuCi0KLVlvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlIGl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUgbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuCi0KLUlmIHlvdSBoYXZlIGEgdGVtcGxhdGUgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBjbGVhciBpdHMgY2hlY2sgYm94IGluIHRoZSA8Yj5UZW1wbGF0ZXM8L2I+IHByZWZlcmVuY2VzIHBhZ2UuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWwiIGxhYmVsPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbG0xMjAwIj4KLTxkZXNjcmlwdGlvbj5DbGVhbnVwIG9wdGlvbnMgZW5hYmxlIHlvdSB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkIGFuZCBjb25zaXN0ZW50bHkgZm9ybWF0dGVkLgotCi1UaGUgZm9sbG93aW5nIGNsZWFudXAgb3B0aW9ucyBjYW4gYmUgc2V0IHRvIG9uIG9yIG9mZiwgc28gdGhhdCB5b3UgY2FuIGxpbWl0IHRoZSB0eXBlIG9mIGNsZWFudXAgcGVyZm9ybWVkOgotCi0tIDxiPkNvbXByZXNzIGVtcHR5IGVsZW1lbnQgdGFnczwvYj46IENvbXByZXNzIGVsZW1lbnQgdGFncyB3aXRoIG5vIGNvbnRlbnQgdG8gb25lIHRhZyB3aXRoIGFuIGVuZCB0YWcgZGVsaW1pdGVyIChpZTogY2hhbmdlICZsdDt0YWcmZ3Q7Jmx0Oy90YWcmZ3Q7IHRvICZsdDt0YWcvJmd0OykuCi0KLS0gPGI+SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXM8L2I+OiBJbnNlcnRzIGFueSBtaXNzaW5nIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHRhZyB0byBtYWtlIHRoZSBlbGVtZW50IG9yIGRvY3VtZW50IHdlbGwtZm9ybWVkLgotCi0tIDxiPkluc2VydCBtaXNzaW5nIHRhZ3M8L2I+OiBDb21wbGV0ZXMgYW55IG1pc3NpbmcgdGFncyAoc3VjaCBhcyBhZGRpbmcgYW4gZW5kIHRhZykgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2VsbC1mb3JtZWQuCi0KLS0gPGI+UXVvdGUgYXR0cmlidXRlIHZhbHVlczwvYj46IEFwcHJvcHJpYXRlbHkgYWRkcyBkb3VibGUtIG9yIHNpbmdsZS1xdW90ZXMgYmVmb3JlIGFuZCBhZnRlciBhdHRyaWJ1dGUgdmFsdWVzIGlmIHRoZXkgYXJlIG1pc3NpbmcuCi0KLS0gPGI+Rm9ybWF0IHNvdXJjZTwvYj46IEZvcm1hdHMgdGhlIGRvY3VtZW50IGp1c3QgYXMgdGhlIDxiPkZvcm1hdCBEb2N1bWVudDwvYj4gY29udGV4dCBtZW51IG9wdGlvbiBkb2VzLCBpbW1lZGlhdGVseSBhZnRlciBwZXJmb3JtaW5nIGFueSBvdGhlciBzcGVjaWZpZWQgPGI+Q2xlYW51cDwvYj4gb3B0aW9ucy4KLQotLSA8Yj5Db252ZXJ0IGxpbmUgZGVsaW1pdGVycyB0bzwvYj46IENvbnZlcnRzIGFsbCBsaW5lIGRlbGltaXRlcnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNlbGVjdGVkIG9wZXJhdGluZyBzeXN0ZW0ncyB0eXBlLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ii8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTA1MDAiPgotPGRlc2NyaXB0aW9uPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIDxiPk5hbWU8L2I+IGZpZWxkLCB0aGVuIGVudGVyIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGluIHRoZSA8Yj5WYWx1ZTwvYj4gZmllbGQuIENsaWNrIDxiPk9LPC9iPi4gVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmaWxlLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTAwMTAiPgotPGRlc2NyaXB0aW9uPlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgPGI+UHVibGljIElEPC9iPiBmaWVsZCB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gdXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkgb3IgdGhlIDxiPlN5c3RlbSBJRDwvYj4gZmllbGQgdG8gY3JlYXRlIGFuIGFzc29jaWF0aW9uIHVzaW5nIGEgZmlsZSBpbiB0aGUgd29ya2JlbmNoLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhjdWkwMDIwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHNob3VsZCBtYXRjaCB0aGUgbmFtZSBvZiB5b3VyIFhNTCBmaWxlJ3Mgcm9vdCBlbGVtZW50LjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhjdWkwMDMwIj4KLTxkZXNjcmlwdGlvbj5UaGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpcyB0aGUgUHVibGljIElkZW50aWZpZXIuIEl0IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSAodXNpbmcgYW4gWE1MIGNhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZSBieSBwcm92aWRpbmcgYSBoaW50IHRvIHRoZSBYTUwgcHJvY2Vzc29yLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhjdWkwMDUwIj4KLTxkZXNjcmlwdGlvbj5UaGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpcyB0aGUgRFREIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIFlvdSBjYW4gY2hhbmdlIHRoZSBEVEQgdGhlIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGJ5IGVkaXRpbmcgdGhpcyBmaWVsZC4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB0cnkgdG8gdXNlIHRoZSBQdWJsaWMgSUQgdG8gbG9jYXRlIHRoZSBEVEQsIGFuZCBpZiB0aGlzIGZhaWxzLCBpdCB3aWxsIHVzZSB0aGUgU3lzdGVtIElEIHRvIGZpbmQgaXQuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTA2MDAiPgotPGRlc2NyaXB0aW9uPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGluIHRoZSA8Yj5FbGVtZW50IG5hbWU8L2I+IGZpZWxkLCB0aGVuIGNsaWNrIDxiPk9LPC9iPi4gVGhlIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZmlsZS48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhjdWkwMzAwIj4KLTxkZXNjcmlwdGlvbj5BIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaXMgYSBzeW50YXggaW4gWE1MIGZvciBwYXNzaW5nIGluc3RydWN0aW9ucyBhbG9uZyB0byB0aGUgYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LiBUaGUgPGI+VGFyZ2V0PC9iPiBmaWVsZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbiB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG9uZ3MgdG8uIFRoZSA8Yj5EYXRhPC9iPiBmaWVsZCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbCIgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTAxMDAiPgotPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSByZWFkLW9ubHkgZGlhbG9nLiBTZWxlY3QgdGhlIGVudHJ5IHlvdSB3YW50IHRvIGVkaXQgYW5kIGNsaWNrIDxiPkVkaXQ8L2I+LjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgeW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24iLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4Y3VpMDIwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIHZhbHVlIGluIHRoZSA8Yj5OYW1lc3BhY2UgTmFtZTwvYj4gZmllbGQgaXMgdGhlIG5hbWVzcGFjZSB0aGUgWE1MIGZpbGUgYmVsb25ncyB0by4KLQotQWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lc3BhY2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoZSA8Yj5QcmVmaXg8L2I+IHZhbHVlLgotCi1UaGUgPGI+TG9jYXRpb24gSGludDwvYj4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgc2NoZW1hIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIEFuIFhNTCBDYXRhbG9nIElEIG9yIGEgVVJJIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZC4gWW91IGNhbiBzZWFyY2ggZm9yIHRoZSBzY2hlbWEgeW91IHdhbnQgdG8gdXNlIGJ5IGNsaWNraW5nIDxiPkJyb3dzZTwvYj4uIE9uY2UgeW91IHNlbGVjdCBhIGZpbGUsIHRoZSA8Yj5OYW1lc3BhY2UgTmFtZTwvYj4gYW5kIDxiPlByZWZpeDwvYj4gZmllbGRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBmaWxsZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGZyb20gdGhlIHNjaGVtYSAoeW91IG11c3QgbGVhdmUgdGhlIGZpZWxkcyBibGFuayBmb3IgdGhpcyB0byBvY2N1cikuIDxiPk5vdGU8L2I+OiBJZiB5b3UgYXJlIGNyZWF0aW5nIGFuIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjaGFuZ2UgdGhlIDxiPk5hbWVzcGFjZSBOYW1lPC9iPiBvciA8Yj5Mb2NhdGlvbiBIaW50PC9iPiB2YWx1ZXMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyB5b3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhjdWkwNDAwIj4KLTxkZXNjcmlwdGlvbj5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVUkkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFNlbGVjdCB0aGUgY2F0YWxvZyBlbnRyeSB5b3Ugd2FudCB0byBhc3NvY2lhdGUgeW91ciBYTUwgZmlsZSB3aXRoLjwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZWJhYjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci08ZGVzY3JpcHRpb24vPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbF9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgWE1MIHNvdXJjZSB2aWV3IGxldHMgeW91IGVkaXQgYSBmaWxlIHRoYXQgaXMgY29kZWQgaW4gdGhlIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlLiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCB1c2VyLWRlZmluZWQgdGVtcGxhdGVzLCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ii8+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZGYwNzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1RhYmxlVHJlZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9UYWJsZVRyZWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNjNmUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1RhYmxlVHJlZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotIAotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotPGRlc2NyaXB0aW9uLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxtMzAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yIHJlcHJlc2VudHMgeW91ciBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZSwgd2hpY2ggaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gRGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIGZpbGUgeW91IGFyZSB3b3JraW5nIHdpdGgsIGNvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgbG9jYXRpb24uPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWE1MV2l6YXJkQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWE1MV2l6YXJkQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTc4MWM1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1hNTFdpemFyZENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLTxkZXNjcmlwdGlvbi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzAxMDEiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgPGI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZTwvYj4gcmFkaW8gYnV0dG9uIHRvIGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGUuIFRoZSBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50LCBwb3B1bGF0ZWQgd2l0aCBhbnkgcmVxdWlyZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzAxMDIiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgPGI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlPC9iPiByYWRpbyBidXR0b24gdG8gY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYS4gVGhlIGZpbGUgd2lsbCBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGFueSBlbGVtZW50cyBvciBhdHRyaWJ1dGVzIGl0IGNvbnRhaW5zLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxjMDEwMyI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSA8Yj5DcmVhdGUgWE1MIGZpbGUgZnJvbSBzY3JhdGNoPC9iPiByYWRpbyBidXR0b24gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGFuIFhNTCBmaWxlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IFhNTCBzY2hlbWEgb3IgRFREIGZpbGUuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sIiBsYWJlbD0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzA1MDAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgPGI+U2VsZWN0IGZpbGUgZnJvbSB3b3JrYmVuY2g8L2I+IHJhZGlvIGJ1dHRvbiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBYTUwgZmlsZSBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgdGhhdCBpcyBpbiB0aGUgd29ya2JlbmNoLgotCi1TZWxlY3QgdGhlIDxiPlNlbGVjdCBYTUwgQ2F0YWxvZyBlbnRyeTwvYj4gcmFkaW8gYnV0dG9uIGlmIHlvdSB3YW50IHRvIHVzZSBhIGZpbGUgbGlzdGVkIGluIHRoZSBYTUwgQ2F0YWxvZyB0byBjcmVhdGUgeW91ciBYTUwgZmlsZS48L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbGMwNDEwIj4KLTxkZXNjcmlwdGlvbj5UaGUgcm9vdCBlbGVtZW50IG9mIGFuIFhNTCBmaWxlIGlzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIG90aGVyIGVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIERURCBvciBhbGwgZ2xvYmFsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFhNTCBzY2hlbWEgYXJlIGluY2x1ZGVkIGluIHRoaXMgbGlzdC4KLQotPGI+Tm90ZTwvYj46IElmIHlvdSBkbyBub3QgaGF2ZSBhbnkgZWxlbWVudHMgaW4geW91ciBEVEQgb3IgYW55IGdsb2JhbCBlbGVtZW50cyBpbiB5b3VyIFhNTCBzY2hlbWEsIHlvdSBjYW5ub3QgY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gaXQuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxjMDQ0MSI+Ci08ZGVzY3JpcHRpb24+SWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgYm90aCBtYW5kYXRvcnkgYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuIElmIHlvdSBkbyBub3Qgc2VsZWN0IGl0LCBvbmx5IG1hbmRhdG9yeSBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzA0NDIiPgotPGRlc2NyaXB0aW9uPklmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGJvdGggdGhlIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuIElmIHlvdSBkbyBub3Qgc2VsZWN0IGl0LCBvbmx5IG1hbmRhdG9yeSBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbGMwNDQzIj4KLTxkZXNjcmlwdGlvbj5JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCB0aGUgZmlyc3QgY2hvaWNlIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4geW91ciBzb3VyY2UgZmlsZToKLQotPGI+Jmx0O2Nob2ljZSZndDsgJmx0O2VsZW1lbnQgbmFtZT0iYSIgdHlwZT0ic3RyaW5nJmd0OyAmbHQ7ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJpbnRlZ2VyJmd0OyAmbHQ7L2Nob2ljZSZndDs8L2I+IAotCi1hbmQgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgYW4gZWxlbWVudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBjcmVhdGVkIGluIHlvdXIgWE1MIGZpbGU6Ci0KLTxiPiZsdDthJmd0O2hlbGxvJmx0Oy9hJmd0OzwvYj4gPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxjMDQ0NCI+Ci08ZGVzY3JpcHRpb24+SWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgYW55IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLCBzdWNoIGFzIDxiPiZsdDt0ZXh0Jmd0O0VtcHR5VGV4dCZsdDsvdGV4dCZndDsuPC9iPiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBlbXB0eSAtIHRoYXQgaXMsIDxiPiZsdDt0ZXh0Jmd0OyZsdDsvdGV4dCZndDsuPC9iPiA8L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbGMwMjEwIj4KLTxkZXNjcmlwdGlvbj5UaGUgU3lzdGVtIElEIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBVUkkgKHBoeXNpY2FsIGxvY2F0aW9uKSBvZiB0aGUgRFREIGZpbGUuIFRoZSBQdWJsaWMgSUQgdmFsdWUgY2FuIHJlZmVyIHRvIGEgRFREIGVudHJ5IGluIGFuIFhNTCBDYXRhbG9nLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbGMwMjIwIj4KLTxkZXNjcmlwdGlvbj5UaGUgU3lzdGVtIElEIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBVUkkgKHBoeXNpY2FsIGxvY2F0aW9uKSBvZiB0aGUgRFREIGZpbGUuIFRoZSBQdWJsaWMgSUQgdmFsdWUgY2FuIHJlZmVyIHRvIGEgRFREIGVudHJ5IGluIGFuIFhNTCBDYXRhbG9nLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTk2OWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvclhtbENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JYbWxDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotc3JjLmluY2x1ZGVzID0gWE1MV2l6YXJkQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFRhYmxlVHJlZS54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjVmOTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFhNTCBpbmZvcG9wcwotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODdjODQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4xIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yWG1sQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvclhtbENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJUYWJsZVRyZWUueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IlhNTFdpemFyZENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIvPgotCi08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTMyOThlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJfMS4wLjAuamFyCi1iYWsKLXRlbXAKLURpdGFMaW5rLmNhdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzM2FmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjBkMmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMy5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVhNDJhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiIgIm1hcC5kdGQiPg0KLTxtYXAgY29sbGVjdGlvbi10eXBlPSJzZXF1ZW5jZSIgdGl0bGU9IkRldmVsb3BpbmcgWE1MIGZpbGVzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3b3JrWE1MLmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIGZpbGVzIj48P1B1YiBDYXJldDE/Pg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NyZWF0eG0uZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIFhNTCBmaWxlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JldHhtbC5kaXRhIiBpZD0ieG1sY3JldHhtbCIgbmF2dGl0bGU9IkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JleHhzZC5kaXRhIiBuYXZ0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEiIG5hdnRpdGxlPSJMaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yIg0KLXRvYz0ibm8iPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHRhZy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhwcmVmcy5kaXRhIiBuYXZ0aXRsZT0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dGFnaGlsdC5kaXRhIiBpZD0idGFnaGlsdCIgbmF2dGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0ZW5jLmRpdGEiIG5hdnRpdGxlPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sZW5jLmRpdGEiIG5hdnRpdGxlPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIGlkPSJ0eGVkdGRlcyIgbGlua2luZz0ibm9uZSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgaWQ9InRlZHRkb2MiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5kaXRhIiBpZD0idGVkdHNjaCIgbmF2dGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuZGl0YSIgaWQ9InRlZHRwcm9jIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIGlkPSJ0eGVkc3JjIiBsaW5raW5nPSJub25lIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdtYWNyby5kaXRhIiBpZD0idHdtYWNybyIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Y25zdC5kaXRhIiBpZD0idGVkdGNudCIgbmF2dGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4c2l0eXAuZGl0YSIgbmF2dGl0bGU9IlVzaW5nIHhzaTp0eXBlIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcmV4dGN0bi5kaXRhIiBpZD0icmV4dGN0biIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3eHZhbGlkLmRpdGEiIGlkPSJ4bWx2YWxpZCIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbGNhdC5kaXRhIiBsaW5raW5nPSJub25lIiBuYXZ0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBpZD0idHhtbGNhdCIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIGlkPSJ0ZWR0Z3JhbSIgbmF2dGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmRpdGEiIGlkPSJyaWNvbnMiIG5hdnRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC9tYXA+DQotPD9QdWIgKjAwMDAwMDMxNDM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRkYTE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJEZXZlbG9waW5nIFhNTCBmaWxlcyIgdG9waWM9InRvcGljcy9jd29ya1hNTC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL2N3b3JrWE1MLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy9jY3JlYXR4bS5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIGhyZWY9InRvcGljcy90Y3JleGR0ZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwiPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyIgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiIGhyZWY9InRvcGljcy9jeG1sZW5jLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiLz4KLTwvdG9waWM+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVzaW5nIHhzaTp0eXBlIiBocmVmPSJ0b3BpY3MvdHhzaXR5cC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXMiIGhyZWY9InRvcGljcy9yZXh0Y3RuLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmh0bWwiLz4KLTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRkYjdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiIgIm1hcC5kdGQiPg0KLTxtYXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPjw/UHViIENhcmV0MT8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JldHhtbC5kaXRhIiBpZD0ieG1sY3JldHhtbCIgbmF2dGl0bGU9IkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JleHhzZC5kaXRhIiBuYXZ0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHRhZy5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3htbGVkdC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbGNhdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Y25zdC5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4bWxjYXQuZGl0YSIgaWQ9InR4bWxjYXQiIG5hdnRpdGxlPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5kaXRhIiBpZD0idGVkdGdyYW0iIG5hdnRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbGNhdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Y25zdC5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5kaXRhIiBuYXZ0aXRsZT0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5IiBsaW5raW5nPSJub3JtYWwiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuZGl0YSIgaWQ9InRlZHRwcm9jIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiIGxpbmtpbmc9Im5vcm1hbCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3htbGVkdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGVkaXRvciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSIgbGlua2luZz0ibm9ybWFsIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3eHZhbGlkLmRpdGEiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIFhNTCBmaWxlcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JleHhzZC5kaXRhIiBuYXZ0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEiDQotbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBuYW1lc3BhY2VzIiBzY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5kaXRhIg0KLWxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgbmFtZXNwYWNlcyIgc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIGlkPSJ0eGVkc3JjIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NkYXN0LmRpdGEiIG5hdnRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bWFjcm8uZGl0YSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dGFnaGlsdC5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdtYWNyby5kaXRhIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y2Rhc3QuZGl0YSIgbmF2dGl0bGU9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5Ij4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0ZG9jLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmRpdGEiIG5hdnRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08L21hcD4NCi08P1B1YiAqMDAwMDAwNjAwMj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg3Mzc4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgdG9waWM9InRvcGljcy90Y3JldHhtbC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIGhyZWY9InRvcGljcy90Y3JleGR0ZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90d3h2YWxpZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBuYW1lc3BhY2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhNTAyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gWE1MQnVpbGRlcm1hcF90b2MueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDg3MmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMwZGU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb21tZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzJjY2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb21tZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2RvY3R5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMGY4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2RvY3R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9leHBhbmRfYWxsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmMxNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmF0dHJpYi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWE5OTc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmF0dHJpYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVsZW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFiZGRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25yc3RydmFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MmI4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25yc3RydmFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9wcm9pbnN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDM2ZDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9wcm9pbnN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3JsZGdybXIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5Y2FjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3JsZGdybXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zdWdnZXN0aW9uLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOGJiMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zdWdnZXN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAzYzc2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iWE1MQnVpbGRlcm1hcF90b2MueG1sIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYzE1M2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIExpY2Vuc2VkIE1hdGVyaWFscyBQcm9wZXJ0eSBvZiBJQk0gLS0+Ci08IS0tIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLS0+Ci08IS0tIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IC0tPgotPCEtLSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaWJtZGl0YS5jc3MiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzd2dfaW5mb19jb21tb24uY3NzIiAvPgotPHRpdGxlPkluZGV4PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPkluZGV4PC9oMT4KLTxhIG5hbWU9IklEWDBfNDUiIGhyZWY9IiNJRFgxXzQ1Ij5FPC9hPgotPGEgbmFtZT0iSURYMF81OCIgaHJlZj0iI0lEWDFfNTgiPlg8L2E+Ci08aHI+PC9ocj4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80NSIgaHJlZj0iI0lEWDBfNDUiPkU8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+RW5jb2RpbmdzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N4bWxlbmMuaHRtbCNjeG1sZW5jIj5IVE1MPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sI2N4bWxlbmMiPlhNTDwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTgiIGhyZWY9IiNJRFgwXzU4Ij5YPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPlhNTCBjYXRhbG9nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0Ij5hZGRpbmcgZW50cmllczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0Ij5leHBvcnRpbmcgZW50cmllczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0Ij5pbXBvcnRpbmcgZW50cmllczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0Ij5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwgZWRpdG9yCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0Ij5jb250ZW50IGFzc2lzdDwvYT4KLTwvbGk+Ci08bGk+RE9DVFlQRSBkZWNsYXJhdGlvbnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiPmVkaXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciPmVkaXRpbmc8L2E+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0Ij5jb250ZW50IGFzc2lzdDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIj5ET0NUWVBFIGRlY2xhcmF0aW9uczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwjdHhlZHRkZXMiPmluIHRoZSBEZXNpZ24gdmlldzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwjdHhlZHRzcmMiPmluIHRoZSBTb3VyY2UgdmlldzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCN0ZWR0c2NoIj5uYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIj5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwjdGVkdGNuc3QiPndpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCNyaWNvbnMiPmljb25zPC9hPgotPC9saT4KLTxsaT5uYW1lc3BhY2UgaW5mb3JtYXRpb24KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giPmVkaXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwjY3d4bWxlZHQiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT5wcm9jZXNzaW5nIGluc3RydWN0aW9ucwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIj5lZGl0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNldHRpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiPmNvbnRlbnQgYXNzaXN0IHJ1bGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiPmluZGVudGF0aW9uIHN0eWxlPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiPmxpbmUgd3JhcHBpbmcgcnVsZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuaHRtbCN4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiPnNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sI3R0YWdoaWx0Ij5zZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9hPgotPC9saT4KLTxsaT51cGRhdGluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sI3RlZHRncmFtIj5YTUwgZmlsZXMgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciPlhNTCBmaWxlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwgZmlsZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiPmFzc29jaWF0aW5nIHdpdGggRFREczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0Ij5hc3NvY2lhdGluZyB3aXRoIFhNTCBzY2hlbWFzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCN0Y3JldHhtbCI+Y3JlYXRpbmc8L2E+Ci08L2xpPgotPGxpPkRPQ1RZUEUgZGVjbGFyYXRpb25zCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIj5lZGl0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sI3R4ZWR0dGFnIj5lZGl0aW5nPC9hPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwjdHdjZGFzdCI+Y29udGVudCBhc3Npc3Q8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwjdGVkdGRvYyI+RE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCI+bmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCN0ZWR0cHJvYyI+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sI3RlZHRjbnN0Ij53aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90Y3JleGR0ZC5odG1sI3RjcmV4ZHRkIj5nZW5lcmF0aW5nIGZyb20gRFREczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RjcmV4eHNkLmh0bWwjdGNyZXh4c2QiPmdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hczwvYT4KLTwvbGk+Ci08bGk+bmFtZXNwYWNlIGluZm9ybWF0aW9uCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCN0ZWR0c2NoIj5lZGl0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwjdGVkdHByb2MiPmVkaXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+c3BlY2lmeWluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0ZW5jLmh0bWwjdGVkdGVuYyI+ZW5jb2Rpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0ZW5jLmh0bWwjdGVkdGVuYyI+bGluZSBkZWxpbWl0ZXJzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sI3RlZHRncmFtIj51cGRhdGluZyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3eHZhbGlkLmh0bWwjdHd4dmFsaWQiPnZhbGlkYXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+WE1MIHRlbXBsYXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyI+Y3JlYXRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyI+ZWRpdGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIj5leHBvcnRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyI+aW1wb3J0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iPnJlbW92aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTFhNTdkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwjdGNyZXR4bWwiIHRpdGxlPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gRFREcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gWE1MIHNjaGVtYXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sI3R4ZWR0dGFnIiB0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiLz4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJET0NUWVBFIGRlY2xhcmF0aW9ucyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiIHRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Im5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giIHRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCN0ZWR0cHJvYyIgdGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwjdHdjZGFzdCIgdGl0bGU9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJ3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sI3RlZHRjbnN0IiB0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNwZWNpZnlpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImxpbmUgZGVsaW1pdGVycyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGVuYy5odG1sI3RlZHRlbmMiIHRpdGxlPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlbmNvZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGVuYy5odG1sI3RlZHRlbmMiIHRpdGxlPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJET0NUWVBFIGRlY2xhcmF0aW9ucyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiIHRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giIHRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCN0ZWR0cHJvYyIgdGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbGlkYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d3h2YWxpZC5odG1sI3R3eHZhbGlkIiB0aXRsZT0iVmFsaWRhdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhc3NvY2lhdGluZyB3aXRoIERURHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwjY3htbGNhdCIgdGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpbmcgd2l0aCBYTUwgc2NoZW1hcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0IiB0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ1cGRhdGluZyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwjdGVkdGdyYW0iIHRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciIHRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyIvPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImluIHRoZSBEZXNpZ24gdmlldyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCN0eGVkdGRlcyIgdGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwjdGVkdGRvYyIgdGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ibmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaW4gdGhlIFNvdXJjZSB2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sI3R4ZWR0c3JjIiB0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBhc3Npc3QiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IndpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwjdGVkdGNuc3QiIHRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCN0eGVkdHRhZyIgdGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sI2N3eG1sZWR0IiB0aXRsZT0iWE1MIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNldHRpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImxpbmUgd3JhcHBpbmcgcnVsZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4cHJlZnMuaHRtbCN0eHByZWZzIiB0aXRsZT0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCBydWxlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiIHRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImluZGVudGF0aW9uIHN0eWxlIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwjdHhwcmVmcyIgdGl0bGU9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5odG1sI3htbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSIgdGl0bGU9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sI3R0YWdoaWx0IiB0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwjdGVkdGRvYyIgdGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBhc3Npc3QiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwjdHdjZGFzdCIgdGl0bGU9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZmlsZXMgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwjdGVkdGdyYW0iIHRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpY29ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCNyaWNvbnMiIHRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkVuY29kaW5ncyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkhUTUwiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jeG1sZW5jLmh0bWwjY3htbGVuYyIgdGl0bGU9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jeG1sZW5jLmh0bWwjY3htbGVuYyIgdGl0bGU9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIHRlbXBsYXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyIgdGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icmVtb3ZpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyIgdGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGNhdGFsb2ciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0IiB0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgZW50cmllcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0IiB0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIGVudHJpZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eG1sY2F0Lmh0bWwjdHhtbGNhdCIgdGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyBlbnRyaWVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sI3R4bWxjYXQiIHRpdGxlPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZWQxZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgICAgPSBYTUwgZWRpdG9yCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAzYzc2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9IlhNTEJ1aWxkZXJtYXBfdG9jLnhtbCIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+ICAgICAKLSAgPC9leHRlbnNpb24+Ci0gIAotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE5NDU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0iY3JlYXRpbmd4bWxmaWxlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6PC9zaG9ydGRlc2M+DQotPGNvbmJvZHk+PC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rbGlzdD4NCi08bGluayBocmVmPSJ0Y3JldHhtbC5kaXRhIj48bGlua3RleHQ+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idGNyZXhkdGQuZGl0YSI+PGxpbmt0ZXh0PkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gYSBEVERzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idGNyZXh4c2QuZGl0YSI+PGxpbmt0ZXh0PkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gPD9QdWIgQ2FyZXQ/PlhNTA0KLXNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDA3MTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjNGNiOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3JlYXRpbmd4bWxmaWxlcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRpbmd4bWxmaWxlcyI+PGEgbmFtZT0iY3JlYXRpbmd4bWxmaWxlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9oMT4KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6PC9wPgotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9InRjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiI+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0Y3JleGR0ZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIGEgRFREczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGNyZXh4c2QuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTAotc2NoZW1hczwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFhNDBlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY2NyZWF0eG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHd4dmFsaWQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJyeG1sYmljb25zLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0id29ya2luZ3dpdGh4bWxmaWxlcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtpbmd3aXRoeG1sZmlsZXMiPjxhIG5hbWU9Indvcmtpbmd3aXRoeG1sZmlsZXMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBYTUwgZmlsZXM8L2gxPgotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9ImNjcmVhdHhtLmh0bWwiIHRpdGxlPSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOiI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0eGVkdHRhZy5odG1sIiB0aXRsZT0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiI+RWRpdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR3eHZhbGlkLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTAotc2NoZW1hPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyeG1sYmljb25zLmh0bWwiIHRpdGxlPSJUaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24gdmlldy4iPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmt4bWwuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmt4bWwuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3MGNmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JreG1sLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9Indvcmtpbmd3aXRoeG1sZmlsZXMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgZmlsZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9zaG9ydGRlc2M+DQotPGNvbmJvZHk+PC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rbGlzdD4NCi08bGluayBocmVmPSJjY3JlYXR4bS5kaXRhIj48bGlua3RleHQ+Q3JlYXRpbmcgWE1MIGZpbGVzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHhlZHR0YWcuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgWE1MIGZpbGVzPC9saW5rdGV4dD48P1B1YiBDYXJldDE/Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0d3h2YWxpZC5kaXRhIj48bGlua3RleHQ+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjeG1sY2F0LmRpdGEiPjxsaW5rdGV4dD5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwNCi1zY2hlbWE8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJyeG1sYmljb25zLmRpdGEiPjxsaW5rdGV4dD5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9saW5rdGV4dD4NCi08L2xpbms+DQotPC9saW5rbGlzdD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAwODcxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYmEwNzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIiAgImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3d4bWxlZHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+WW91IGNhbiB1c2UgaXQgdG8gcGVyZm9ybSBhIHZhcmlldHkgb2YgdGFza3Mgc3VjaCBhczo8L3A+DQotPHVsPg0KLTxsaT5DcmVhdGluZyBuZXcsIGVtcHR5IFhNTCBmaWxlcyBvciBnZW5lcmF0aW5nIHRoZW0gZnJvbSBleGlzdGluZyBEVERzIG9yDQotZXhpc3RpbmcgWE1MIHNjaGVtYXM8L2xpPg0KLTxsaT5FZGl0aW5nIFhNTCBmaWxlczwvbGk+DQotPGxpPkltcG9ydGluZyBleGlzdGluZyBYTUwgZmlsZXMgZm9yIHN0cnVjdHVyZWQgdmlld2luZzwvbGk+DQotPGxpPkFzc29jaWF0aW5nIFhNTCBmaWxlcyB3aXRoIERURHMgb3IgWE1MIHNjaGVtYXM8L2xpPg0KLTwvdWw+DQotPHA+VGhlIFhNTCBlZGl0b3IgaGFzIHR3byBtYWluIHZpZXdzIC0gdGhlIFNvdXJjZSB2aWV3IGFuZCB0aGUgRGVzaWduIHZpZXcuDQotWW91IGNhbiBhbHNvIHVzZSB0aGUgPGI+T3V0bGluZTwvYj4gdmlldyB0byBpbnNlcnQgYW5kIGRlbGV0ZSBlbGVtZW50cy48L3A+DQotPHNlY3Rpb24+PHRpdGxlPlNvdXJjZSB2aWV3PC90aXRsZT48cD5UaGUgU291cmNlIHZpZXcgZW5hYmxlcyB5b3UgdG8gdmlldw0KLWFuZCB3b3JrIGRpcmVjdGx5IHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUuIE1hbnkgb2YgdGhlIFhNTCBlZGl0aW5nIGZlYXR1cmVzDQotaW4gdGhlIFhNTCBlZGl0b3IgU291cmNlIHZpZXcgYXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBhdmFpbGFibGUgaW4gdGhlIFNvdXJjZQ0KLXZpZXcgb2YgUGFnZSBEZXNpZ25lci48L3A+PHA+VGhlIFNvdXJjZSB2aWV3IGhhcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywNCi1zdWNoIGFzOiA8dWw+DQotPGxpPiBTeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kby9yZWRvLCBhbmQgdXNlci1kZWZpbmVkIHRlbXBsYXRlcy48L2xpPg0KLTxsaT4gQ29udGVudCBhc3Npc3QsIHdoaWNoIHVzZXMgdGhlIGluZm9ybWF0aW9uIGluIGEgRFREIG9yIHNjaGVtYSBjb250ZW50DQotbW9kZWwgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBjb250aW51YXRpb25zIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUNCi1jdXJzb3IgaXMgbG9jYXRlZCBpbiBhbiBYTUwgZmlsZSwgb3Igd2hhdCBoYXMganVzdCBiZWVuIHR5cGU8L2xpPg0KLTxsaT4iU21hcnQiIGRvdWJsZS1jbGlja2luZyBiZWhhdmlvci4gSWYgeW91ciBjdXJzb3IgaXMgcGxhY2VkIGluIGFuIGF0dHJpYnV0ZQ0KLXZhbHVlLCBvbmUgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhhdCB2YWx1ZSwgYW5vdGhlciBkb3VibGUgY2xpY2sgc2VsZWN0cyB0aGUNCi1hdHRyaWJ1dGUtdmFsdWUgcGFpciwgYW5kIGEgdGhpcmQgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhlIGVudGlyZSB0YWcuIFRoaXMNCi1tYWtlcyBpdCBlYXNpZXIgdG8gY29weSBhbmQgcGFzdGUgY29tbW9ubHkgdXNlZCBwaWVjZXMgb2YgWE1MLjwvbGk+DQotPC91bD48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5EZXNpZ24gdmlldzwvdGl0bGU+PHA+VGhlIFhNTCBlZGl0b3IgYWxzbyBoYXMgYSBEZXNpZ24gdmlldy4NCi1JbiBpdDogPHVsPg0KLTxsaT5UaGUgWE1MIGZpbGUgaXMgcmVwcmVzZW50ZWQgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzDQotaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci48L2xpPg0KLTxsaT5Db250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLA0KLXdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBub2RlcyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3INCi10aGF0IGxvY2F0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSA8dWljb250cm9sPkFkZCBjaGlsZDwvdWljb250cm9sPiBtZW51IGl0ZW0NCi13aWxsIGxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2ggd291bGQgYmUgdmFsaWQNCi1jaGlsZHJlbiBhdCB0aGF0IHBvaW50IChhcyBsb25nIGFzIGdyYW1tYXIgY29uc3RyYWludHMgYXJlIG9uKS48L2xpPg0KLTwvdWw+PC9wPjxwPlRoZSBEZXNpZ24gdmlldyBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgaWYgeW91IGFyZSBuZXcgdG8gWE1MLCBvcg0KLW5lZWQgdG8gZG8gZm9ybS1vcmllbnRlZCBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGUgQ3JlYXRlIFhNTA0KLUZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIHRlbXBsYXRlIFhNTCBmaWxlIGZvciBhIGpvYiBkZXNjcmlwdGlvbiBmb3JtIGZyb20NCi1hIGpvYiBkZXNjcmlwdGlvbiA8P1B1YiBDYXJldD8+RFRELiBBZnRlciB0aG9zZSBzdGVwcyBhcmUgY29tcGxldGVkLCB5b3Ugd291bGQNCi1vbmx5IGhhdmUgdG8gZmlsbCBpbiB0aGUgZm9ybSBkYXRhIHVzaW5nIHRoZSBEZXNpZ24gdmlldy48L3A+PHA+VGhlIGZvbGxvd2luZw0KLWxpbmtzIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGVkaXRvcjo8L3A+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDI5OTQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5ZmFkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldHhtbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d3h2YWxpZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3eG1sZWR0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIGVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3d4bWxlZHQiPjxhIG5hbWU9ImN3eG1sZWR0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy48L3A+Ci0KLTxwPllvdSBjYW4gdXNlIGl0IHRvIHBlcmZvcm0gYSB2YXJpZXR5IG9mIHRhc2tzIHN1Y2ggYXM6PC9wPgotCi08dWw+Ci08bGk+Q3JlYXRpbmcgbmV3LCBlbXB0eSBYTUwgZmlsZXMgb3IgZ2VuZXJhdGluZyB0aGVtIGZyb20gZXhpc3RpbmcgRFREcyBvcgotZXhpc3RpbmcgWE1MIHNjaGVtYXM8L2xpPgotCi08bGk+RWRpdGluZyBYTUwgZmlsZXM8L2xpPgotCi08bGk+SW1wb3J0aW5nIGV4aXN0aW5nIFhNTCBmaWxlcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nPC9saT4KLQotPGxpPkFzc29jaWF0aW5nIFhNTCBmaWxlcyB3aXRoIERURHMgb3IgWE1MIHNjaGVtYXM8L2xpPgotCi08L3VsPgotCi08cD5UaGUgWE1MIGVkaXRvciBoYXMgdHdvIG1haW4gdmlld3MgLSB0aGUgU291cmNlIHZpZXcgYW5kIHRoZSBEZXNpZ24gdmlldy4KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIDxzdHJvbmc+T3V0bGluZTwvc3Ryb25nPiB2aWV3IHRvIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNvdXJjZSB2aWV3PC9oND48cD5UaGUgU291cmNlIHZpZXcgZW5hYmxlcyB5b3UgdG8gdmlldwotYW5kIHdvcmsgZGlyZWN0bHkgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZS4gTWFueSBvZiB0aGUgWE1MIGVkaXRpbmcgZmVhdHVyZXMKLWluIHRoZSBYTUwgZWRpdG9yIFNvdXJjZSB2aWV3IGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2UgYXZhaWxhYmxlIGluIHRoZSBTb3VyY2UKLXZpZXcgb2YgUGFnZSBEZXNpZ25lci48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgU291cmNlIHZpZXcgaGFzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLAotc3VjaCBhczogPHVsPgotPGxpPiBTeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kby9yZWRvLCBhbmQgdXNlci1kZWZpbmVkIHRlbXBsYXRlcy48L2xpPgotCi08bGk+IENvbnRlbnQgYXNzaXN0LCB3aGljaCB1c2VzIHRoZSBpbmZvcm1hdGlvbiBpbiBhIERURCBvciBzY2hlbWEgY29udGVudAotbW9kZWwgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBjb250aW51YXRpb25zIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUKLWN1cnNvciBpcyBsb2NhdGVkIGluIGFuIFhNTCBmaWxlLCBvciB3aGF0IGhhcyBqdXN0IGJlZW4gdHlwZTwvbGk+Ci0KLTxsaT4iU21hcnQiIGRvdWJsZS1jbGlja2luZyBiZWhhdmlvci4gSWYgeW91ciBjdXJzb3IgaXMgcGxhY2VkIGluIGFuIGF0dHJpYnV0ZQotdmFsdWUsIG9uZSBkb3VibGUtY2xpY2sgc2VsZWN0cyB0aGF0IHZhbHVlLCBhbm90aGVyIGRvdWJsZSBjbGljayBzZWxlY3RzIHRoZQotYXR0cmlidXRlLXZhbHVlIHBhaXIsIGFuZCBhIHRoaXJkIGRvdWJsZS1jbGljayBzZWxlY3RzIHRoZSBlbnRpcmUgdGFnLiBUaGlzCi1tYWtlcyBpdCBlYXNpZXIgdG8gY29weSBhbmQgcGFzdGUgY29tbW9ubHkgdXNlZCBwaWVjZXMgb2YgWE1MLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+RGVzaWduIHZpZXc8L2g0PjxkaXYgY2xhc3M9InAiPlRoZSBYTUwgZWRpdG9yIGFsc28gaGFzIGEgRGVzaWduIHZpZXcuCi1JbiBpdDogPHVsPgotPGxpPlRoZSBYTUwgZmlsZSBpcyByZXByZXNlbnRlZCBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMKLWhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuPC9saT4KLQotPGxpPkNvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsCi13aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgbm9kZXMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yCi10aGF0IGxvY2F0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgY2hpbGQ8L3NwYW4+IG1lbnUgaXRlbQotd2lsbCBsaXN0IG9ubHkgdGhvc2UgZWxlbWVudHMgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHdoaWNoIHdvdWxkIGJlIHZhbGlkCi1jaGlsZHJlbiBhdCB0aGF0IHBvaW50IChhcyBsb25nIGFzIGdyYW1tYXIgY29uc3RyYWludHMgYXJlIG9uKS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08cD5UaGUgRGVzaWduIHZpZXcgaXMgZXNwZWNpYWxseSBoZWxwZnVsIGlmIHlvdSBhcmUgbmV3IHRvIFhNTCwgb3IKLW5lZWQgdG8gZG8gZm9ybS1vcmllbnRlZCBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGUgQ3JlYXRlIFhNTAotRmlsZSB3aXphcmQgdG8gY3JlYXRlIGEgdGVtcGxhdGUgWE1MIGZpbGUgZm9yIGEgam9iIGRlc2NyaXB0aW9uIGZvcm0gZnJvbQotYSBqb2IgZGVzY3JpcHRpb24gRFRELiBBZnRlciB0aG9zZSBzdGVwcyBhcmUgY29tcGxldGVkLCB5b3Ugd291bGQKLW9ubHkgaGF2ZSB0byBmaWxsIGluIHRoZSBmb3JtIGRhdGEgdXNpbmcgdGhlIERlc2lnbiB2aWV3LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcKLWxpbmtzIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGVkaXRvcjo8L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldHhtbC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gV2hlbiB5b3UgY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgaXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iPkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d3h2YWxpZC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0byBzZWUgdGhhdCB5b3VyIGZpbGUgaXMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLiI+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3MTM2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9ImN4bWxjYXQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcw0KLWJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQNCi1hIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwNCi1hbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+YXNzb2NpYXRpbmcgd2l0aCBEVERzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmFzc29jaWF0aW5nIHdpdGggWE1MIHNjaGVtYXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBjYXRhbG9nPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIGFzc29jaWF0ZSBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzLjwvcD4NCi08b2w+DQotPGxpPkRpcmVjdCBhc3NvY2lhdGlvbiAtIFRoZSBYTUwgZmlsZSBjb250YWlucyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBEVEQgaW4NCi1pdHMgZG9jdHlwZSBkZWNsYXJhdGlvbiAoZm9yIGV4YW1wbGUsICZsdDshRE9DVFlQRSByb290LWVsZW1lbnQgU1lTVEVNICIgPHZhcm5hbWU+ZHRkZmlsZS5kdGQ8L3Zhcm5hbWU+Ig0KLT4sIHdoZXJlICA8dmFybmFtZT5kdGRmaWxlLmR0ZDwvdmFybmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhlIERURCBmaWxlKSBvciBpdA0KLWNvbnRhaW5zIHRoZSBwYXRoIG9mIGFuIFhNTCBzY2hlbWEgaW4gdGhlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBvZiB0aGUNCi1YTUwgZmlsZSByb290IGVsZW1lbnQgKGZvciBleGFtcGxlLCAmbHQ7eHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20NCi0gPHZhcm5hbWU+c2NoZW1hLnhzZDwvdmFybmFtZT4iPiwgd2hlcmUgIDx2YXJuYW1lPnNjaGVtYS54c2Q8L3Zhcm5hbWU+IGlzDQotdGhlIG5hbWUgb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4NCi08bGk+WE1MIENhdGFsb2cgZW50cnkgLSBZb3UgY2FuIHJlZ2lzdGVyIERURCBhbmQgWE1MIHNjaGVtYSBmaWxlcyBpbiB0aGUgWE1MDQotQ2F0YWxvZyBhbmQgYXNzb2NpYXRlIHRoZW0gd2l0aCBhICA8dmFybmFtZT5LZXk8L3Zhcm5hbWU+IHRoYXQgcmVwcmVzZW50cw0KLXRoZW0uIFlvdSBjYW4gdGhlbiByZWZlciB0byBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUgIDx2YXJuYW1lPktleTwvdmFybmFtZT4gZnJvbQ0KLWFuIFhNTCBmaWxlIGluc3RlYWQgb2YgcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLiBBbg0KLVhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIHRoZSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgdGhlIERURCBvcg0KLVhNTCBzY2hlbWEpIGFuZCBhIFVSSSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERURCBvciBYTUwgc2NoZW1hDQotbG9jYXRpb24pLjwvbGk+DQotPC9vbD4NCi08c2VjdGlvbj48dGl0bGU+SG93IGFuIGFzc29jaWF0aW9uIHdvcmtzPC90aXRsZT48Yj5Bc3NvY2lhdGluZyBhbiBYTUwgZmlsZQ0KLXdpdGggYSBEVEQgPC9iPjxwPklmIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCwgYSBET0NUWVBFIHRhZyBzdWNoDQotYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gdGhlIFhNTCBmaWxlOjxjb2RlYmxvY2s+Jmx0OyFET0NUWVBFIHJvb3QtbmFtZSBQVUJMSUMgIjx2YXJuYW1lPkludm9pY2VJZDwvdmFybmFtZT4iICI8dmFybmFtZT5DOlxteWR0ZHNcSW52b2ljZS5kdGQ8L3Zhcm5hbWUNCi0+Ij4NCi08L2NvZGVibG9jaz48L3A+PHA+PHZhcm5hbWU+SW52b2ljZUlkPC92YXJuYW1lPiBpcyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YNCi10aGUgRFREIGZpbGUuIEl0IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFREIGZpbGUgKGluIHRoaXMNCi1jYXNlLCB0aGUgRFREIGZpbGUgaXMgIDx2YXJuYW1lPkludm9pY2UuZHRkPC92YXJuYW1lPikuIElmIHRoZSBwdWJsaWMgaWRlbnRpZmllcg0KLUludm9pY2VJZCBjb3JyZXNwb25kcyB0byB0aGUgIDx2YXJuYW1lPktleTwvdmFybmFtZT4gb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5DQotZm9yIEludm9pY2UuZHRkLCB0aGVuIHRoZSAgPHZhcm5hbWU+VVJJPC92YXJuYW1lPiBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkNCi0od2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIEludm9pY2UuZHRkKSBpcyB1c2VkIHRvDQotbG9jYXRlIHRoZSBEVEQuIE90aGVyd2lzZSwgdGhlIERPQ1RZUEUncyBzeXN0ZW0gaWRlbnRpZmllciAoIDx2YXJuYW1lPiJDOlxteWR0ZHNcSW52b2ljZS5kdGQiPC92YXJuYW1lPiksDQotd2hpY2ggcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvZiB0aGUgRFRELCBpcyB1c2VkIHRvIGxvY2F0ZQ0KLXRoZSBEVEQuPC9wPjxwPiA8Yj5Ob3RlPC9iPjogWW91IGNhbiBhbHNvIHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5DQotaW4gYW4gWE1MIENhdGFsb2cgZW50cnkuIElmIHlvdSB1c2UgYSBzeXN0ZW0gaWRlbnRpZmllciBhcyBhIEtleSwgYSBET0NUWVBFDQotdGFnIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gYW4gWE1MIGZpbGU6PC9wPjxjb2RlYmxvY2s+Jmx0OyFET0NUWVBFIFJvb3QtbmFtZSBTWVNURU0gIjx2YXJuYW1lPk15RFRELmR0ZDwvdmFybmFtZT4iPiA8L2NvZGVibG9jaw0KLT48cD53aGVyZSAgPHZhcm5hbWU+TXlEVEQuZHRkPC92YXJuYW1lPiBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcw0KLXRvIHRoZSBLZXkgb2YgYW4gWE1MIENhdGFsb2cgZW50cnkuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48Yj5Bc3NvY2lhdGluZyBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWE8L2I+PHA+SWYgYW4gWE1MIGZpbGUNCi1pcyBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSwgb25lIG9yIG1vcmUgc2NoZW1hIGxvY2F0aW9uIGF0dHJpYnV0ZXMgYXJlDQotaW5jbHVkZWQgaW4gdGhlIFhNTCBmaWxlLiBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIHNjaGVtYUxvY2F0aW9uIGlzIHByb3ZpZGVkDQotYXMgYSAiaGludCIgdG8gdGhlIFhNTCBwcm9jZXNzb3IuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBzY2hlbWFMb2NhdGlvbg0KLWF0dHJpYnV0ZXMuPC9wPjxwPiA8Yj5FeGFtcGxlIDEgPC9iPjxjb2RlYmxvY2s+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSINCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBDOlxteXNjaGVtYXNcUHVyY2hhc2VPcmRlci54c2QiPg0KLSZsdDtzaGlwVG8gY291bnRyeT0iVVMiPg0KLS4uLjwvY29kZWJsb2NrPiAgICA8L3A+PHA+PGI+RXhhbXBsZSAyIDwvYj48Y29kZWJsb2NrPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iDQoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gUE8ueHNkIj4NCi0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIj4NCi0uLi4uPC9jb2RlYmxvY2s+ICA8L3A+PHA+SW4gRXhhbXBsZSAxLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnQzpcbXlzY2hlbWFzXFB1cmNoYXNlT3JkZXIueHNkJykNCi1yZWZlcnMgZGlyZWN0bHkgdG8gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgWE1MIHNjaGVtYS4gSW4gdGhpcw0KLWNhc2UsIHRoZSBzY2hlbWEgZmlsZSB3aWxsIGJlIGxvY2F0ZWQgYnkgdGhlIFhNTCBwcm9jZXNzb3IgZGlyZWN0bHkuPC9wPjxwPkluDQotRXhhbXBsZSAyLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnUE8ueHNkJykgcmVmZXJzIHRvIGFuIFhNTCBDYXRhbG9nIGVudHJ5Lg0KLVBPLnhzZCBjb3JyZXNwb25kcyB0byB0aGUgIDx2YXJuYW1lPktleTwvdmFybmFtZT4gb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5DQotZm9yIFB1cmNoYXNlT3JkZXIueHNkLCBhbmQgdGhlIFVSSSBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkgKHdoaWNoIGNvbnRhaW5zDQotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIFB1cmNoYXNlT3JkZXIueHNkKSB3aWxsIGJlIHVzZWQgdG8gbG9jYXRlZA0KLXRoZSBYTUwgc2NoZW1hLjwvcD48cD5JbiBib3RoIGV4YW1wbGVzLCA8Y29kZXBoPmh0dHA6Ly93d3cuaWJtLmNvbTwvY29kZXBoPiBpbg0KLXRoZSA8Y29kZXBoPnhzaTpzY2hlbWFMb2NhdGlvbjwvY29kZXBoPiB0YWcgaXMgYSBVUkkgdGhhdCBpZGVudGlmaWVzIHRoZSBuYW1lc3BhY2UNCi1mb3IgdGhlIFhNTCBzY2hlbWEuPC9wPjxwPllvdSBjYW4gYWxzbyB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXkgZm9yIGFuIFhNTA0KLUNhdGFsb2cgZW50cnkuIElmIHlvdSB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXksIGEgc2NoZW1hTG9jYXRpb24gdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiBhbiBYTUwgZmlsZTo8Y29kZWJsb2NrPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zOj0id3d3LmlibS5jb20iDQoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gcG8veHNkL1B1cmNoYXNlT3JkZXIueHNkICI+PC9jb2RlYmxvY2s+PC9wPjxwPlRoZQ0KLXNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBwb2ludHMgdG8gYm90aCB0aGUgS2V5IGFuZCB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mDQotdGhlIHNjaGVtYS48L3A+PHA+PGI+RFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiBhIHJlbW90ZSBzZXJ2ZXI8L2I+PC9wPjxwPlNldmVyYWwNCi1mdW5jdGlvbnMgaW4gdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdmFsaWRhdGlvbiBhbmQgY29udGVudCBhc3Npc3QsIHJlcXVpcmUNCi10aGUgYXZhaWxhYmlsaXR5IG9mIGEgRFREIG9yIGFuIFhNTCBzY2hlbWEuIFRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gcHJvdmlkZXMNCi11c2FnZSBpbmZvcm1hdGlvbiBmb3IgY2FzZXMgd2hlbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiB5b3VyIGxvY2FsDQotbWFjaGluZS4gSG93ZXZlciwgaW4gbWFueSBjYXNlcywgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiByZXNpZGUgb24gYSByZW1vdGUNCi1zZXJ2ZXIsIGZvciBleGFtcGxlOjwvcD48cD48Y29kZXBoPiZsdDshRE9DVFlQRSBDYXRhbG9nIFBVQkxJQyAiYWJjL0NhdGFsb2ciDQotImh0dHA6Ly94eXouYWJjLm9yZy9kdGRzL2NhdGFsb2cuZHRkIj48L2NvZGVwaD48L3A+PHA+Tm9ybWFsbHksIHRoaXMgY2FzZQ0KLXBvc2VzIG5vIHByb2JsZW0sIGJlY2F1c2UgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUNCi1yZW1vdGUgc2VydmVyLiBIb3dldmVyLCBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsLCBhbmQgZG8gbm90IGhhdmUgYSBTT0NLU2lmaWVkDQotc3lzdGVtLCB0aGUgd29ya2JlbmNoIGN1cnJlbnRseSBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IGZvciB5b3UgdG8gc3BlY2lmeQ0KLWEgc29ja3Mgc2VydmVyIGZvciByZXRyaWV2aW5nIGEgRFREIG9yIFhNTCBzY2hlbWEuIElmIHlvdSBhcmUgdW5hYmxlIHRvIFNPQ0tTaWZ5DQoteW91ciBzeXN0ZW0sIHRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIHByb2JsZW0gaXMgdG8gcmV0cmlldmUgYSBjb3B5IG9mIHRoZQ0KLURURCBvciBYTUwgc2NoZW1hICh1c2luZyBhIFdlYiBicm93c2VyLCBmb3IgZXhhbXBsZSkgYW5kIHNhdmUgdGhhdCBjb3B5IG9uDQoteW91ciBsb2NhbCBtYWNoaW5lLiBUaGVuLCB5b3UgY2FuIGVpdGhlciBwbGFjZSBhIGxvY2FsIGNvcHkgaW4gdGhlIHNhbWUgcHJvamVjdA0KLWFzIHlvdXIgWE1MIGZpbGUsIG9yIHVzZSB0aGUgWE1MIENhdGFsb2cgdG8gYXNzb2NpYXRlIGEgcHVibGljIGlkZW50aWZpZXINCi13aXRoIHRoZSBEVEQncyAobG9jYWwpIGxvY2F0aW9uLjwvcD48cD48Yj5Ob3RlPC9iPjogSWYgeW91IGhhdmUgYW4gWE1MIGZpbGUNCi1hc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSBvciBEVEQgdGhhdCBpcyBlbHNld2hlcmUgaW4gdGhlIG5ldHdvcmssIGFuZA0KLXlvdSBhcmUgd29ya2luZyBvbiBhIG1hY2hpbmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIG5ldHdvcmssIHlvdSBjYW4gZm9sbG93DQotdGhlIHN0ZXBzIGRlc2NyaWJlZCBwcmV2aW91c2x5IGlmIHlvdSB3YW50IHRvIHVzZSBjb250ZW50IGFzc2lzdCBvciB2YWxpZGF0ZQ0KLXlvdXIgWE1MIGZpbGUuICA8L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5BZHZhbnRhZ2VzIG9mIFhNTCBDYXRhbG9nIGVudHJ5IGFzc29jaWF0aW9uczwvdGl0bGU+PHA+SWYNCi15b3UgY3JlYXRlIGEgZGlyZWN0IGFzc29jaWF0aW9uIGJldHdlZW4gYW4gWE1MIGZpbGUgYW5kIGFuIFhNTCBzY2hlbWEgb3IgRFREDQotZmlsZSwgYW55IHRpbWUgeW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQgeW91IGhhdmUgdG8gdHJhY2sNCi1kb3duIGFuZCB1cGRhdGUgYWxsIG9mIHRoZSByZWZlcmVuY2luZyBYTUwgZmlsZXMgd2l0aCB0aGUgbmV3IGxvY2F0aW9uIG9mDQotdGhlIERURCBvciBzY2hlbWEuIElmLCBob3dldmVyLCB5b3UgYXNzb2NpYXRlIGFuIFhNTCBmaWxlIHdpdGggYW4gWE1MIHNjaGVtYQ0KLW9yIERURCBLZXksIHRoZW4sIHdoZW4geW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQsIHlvdSBvbmx5DQotaGF2ZSB0byB1cGRhdGUgdGhlIFhNTCBDYXRhbG9nIGVudHJ5LCBpbnN0ZWFkIG9mIGVhY2ggaW5kaXZpZHVhbCBYTUwgZmlsZS48L3A+PHA+Rm9yDQotZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgY2FsbGVkICJCdWlsZGluZy5kdGQiLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggZml2ZQ0KLVhNTCBmaWxlcyAtIE9mZmljZS54bWwsIEhvdXNlLnhtbCwgQXBhcnRtZW50LnhtbCwgQmFuay54bWwsIGFuZCBQb3N0T2ZmaWNlLnhtbC4NCi1Zb3UgbW92ZSB0aGUgRFREIGZpbGUgQnVpbGRpbmcuZHRkIHRvIGEgbmV3IGxvY2F0aW9uLiBJZiB5b3UgaGF2ZSBhIGRpcmVjdGlvbg0KLWFzc29jaWF0aW9uIGJldHdlZW4gQnVpbGRpbmcuZHRkIGFuZCBhbGwgdGhlIFhNTCBmaWxlcywgeW91IHdpbGwgaGF2ZSB0byB1cGRhdGUNCi10aGUgJmx0O0RPQ1RUWVBFPiBkZWNsYXJhdGlvbiBpbiBlYWNoIFhNTCBmaWxlIHRvIHJlZmxlY3QgdGhlIG5ldyBsb2NhdGlvbg0KLW9mIEJ1aWxkaW5nLmR0ZC48P1B1YiBDYXJldD8+IElmLCBob3dldmVyLCB5b3UgaGF2ZSBhbiBYTUwgQ2F0YWxvZyBhc3NvY2lhdGlvbiwNCi1hbmQgYWxsIHRoZSBYTUwgZmlsZXMganVzdCByZWZlciB0byB0aGUgS2V5IG9mIEJ1aWxkaW5nLmR0ZCwgdGhlbiB5b3Ugb25seQ0KLWhhdmUgdG8gdXBkYXRlIHRoZSBVUkkgYW5kIGFsbCB0aGUgWE1MIGZpbGVzIHdpbGwgcG9pbnQgdG8gdGhlIG5ldyBsb2NhdGlvbg0KLW9mIEJ1aWxkaW5nLmR0ZC48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5VcGRhdGluZyBhbiBlbnRyeSBpbiB0aGUgWE1MIENhdGFsb2c8L3RpdGxlPjxwPkFmdGVyIHlvdSBoYXZlDQotdXBkYXRlZCBhbiBlbnRyeSBpbiB0aGUgWE1MIENhdGFsb2csIHlvdSBtaWdodCBuZWVkIHRvIHJlZnJlc2ggdGhlIFhNTCBlZGl0b3INCi12aWV3IHNvIHRoYXQgaXQgdXNlcyB0aGUgbmV3IGluZm9ybWF0aW9uLiBUbyBkbyB0aGlzLCBjbGljayB0aGUgPHVpY29udHJvbD5SZWxvYWQNCi1EZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gdG9vbGJhciBidXR0b24gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9ybGRncm1yLmdpZiI+DQotPGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIFJlbG9hZCBEZXBlbmRlbmNpZXMgdG9vbGJhciBidXR0b248L2FsdD48L2ltYWdlPiBhbmQNCi10aGUgdmlldyB3aWxsIGJlIHVwZGF0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgWE1MIENhdGFsb2cgc2V0dGluZ3MuIFlvdSBvbmx5DQotbmVlZCB0byByZWZyZXNoIHRoZSBYTUwgZWRpdG9yIHZpZXcgd2hlbiB5b3UgaGF2ZSBhbiBYTUwgZmlsZSBvcGVuIHRoYXQgcmVmZXJlbmNlcw0KLXRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0aGF0IHdhcyB1cGRhdGVkLjwvcD48cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXINCi10byB0aGUgcmVsYXRlZCB0YXNrcy48L3A+PHA+KGMpIENvcHlyaWdodCAyMDAxLCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtDQotKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbg0KLUluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS48L3A+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDg4NDQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjQ0OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGFzc29jaWF0aW5nIHdpdGggRFREcywgYXNzb2NpYXRpbmcgd2l0aCBYTUwgc2NoZW1hcywgWE1MIGNhdGFsb2csIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBhc3NvY2lhdGluZyB3aXRoIERURHMsIGFzc29jaWF0aW5nIHdpdGggWE1MIHNjaGVtYXMsIFhNTCBjYXRhbG9nLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHByb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjeG1sY2F0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN4bWxjYXQiPjxhIG5hbWU9ImN4bWxjYXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5XaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcwotYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZAotYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsCi1hbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLjwvcD4KLQotPHA+VGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyB0byBhc3NvY2lhdGUgWE1MIGZpbGVzIHdpdGggRFREcyBvciBYTUwgc2NoZW1hcy48L3A+Ci0KLTxvbD4KLTxsaT5EaXJlY3QgYXNzb2NpYXRpb24gLSBUaGUgWE1MIGZpbGUgY29udGFpbnMgZWl0aGVyIHRoZSBuYW1lIG9mIGEgRFREIGluCi1pdHMgZG9jdHlwZSBkZWNsYXJhdGlvbiAoZm9yIGV4YW1wbGUsICZsdDshRE9DVFlQRSByb290LWVsZW1lbnQgU1lTVEVNICIgPHZhciBjbGFzcz0idmFybmFtZSI+ZHRkZmlsZS5kdGQ8L3Zhcj4iCi0mZ3Q7LCB3aGVyZSAgPHZhciBjbGFzcz0idmFybmFtZSI+ZHRkZmlsZS5kdGQ8L3Zhcj4gaXMgdGhlIG5hbWUgb2YgdGhlIERURCBmaWxlKSBvciBpdAotY29udGFpbnMgdGhlIHBhdGggb2YgYW4gWE1MIHNjaGVtYSBpbiB0aGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIG9mIHRoZQotWE1MIGZpbGUgcm9vdCBlbGVtZW50IChmb3IgZXhhbXBsZSwgJmx0O3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tCi0gPHZhciBjbGFzcz0idmFybmFtZSI+c2NoZW1hLnhzZDwvdmFyPiImZ3Q7LCB3aGVyZSAgPHZhciBjbGFzcz0idmFybmFtZSI+c2NoZW1hLnhzZDwvdmFyPiBpcwotdGhlIG5hbWUgb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4KLQotPGxpPlhNTCBDYXRhbG9nIGVudHJ5IC0gWW91IGNhbiByZWdpc3RlciBEVEQgYW5kIFhNTCBzY2hlbWEgZmlsZXMgaW4gdGhlIFhNTAotQ2F0YWxvZyBhbmQgYXNzb2NpYXRlIHRoZW0gd2l0aCBhICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5LZXk8L3Zhcj4gdGhhdCByZXByZXNlbnRzCi10aGVtLiBZb3UgY2FuIHRoZW4gcmVmZXIgdG8gYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5LZXk8L3Zhcj4gZnJvbQotYW4gWE1MIGZpbGUgaW5zdGVhZCBvZiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIEFuCi1YTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSB0aGUgS2V5ICh3aGljaCByZXByZXNlbnRzIHRoZSBEVEQgb3IKLVhNTCBzY2hlbWEpIGFuZCBhIFVSSSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERURCBvciBYTUwgc2NoZW1hCi1sb2NhdGlvbikuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkhvdyBhbiBhc3NvY2lhdGlvbiB3b3JrczwvaDQ+PHN0cm9uZz5Bc3NvY2lhdGluZyBhbiBYTUwgZmlsZQotd2l0aCBhIERURCA8L3N0cm9uZz48ZGl2IGNsYXNzPSJwIj5JZiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQsIGEgRE9DVFlQRSB0YWcgc3VjaAotYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gdGhlIFhNTCBmaWxlOjxwcmU+Jmx0OyFET0NUWVBFIHJvb3QtbmFtZSBQVUJMSUMgIjx2YXIgY2xhc3M9InZhcm5hbWUiPkludm9pY2VJZDwvdmFyPiIgIjx2YXIgY2xhc3M9InZhcm5hbWUiPkM6XG15ZHRkc1xJbnZvaWNlLmR0ZDwvdmFyPiImZ3Q7Ci08L3ByZT4KLTwvZGl2PgotPHA+PHZhciBjbGFzcz0idmFybmFtZSI+SW52b2ljZUlkPC92YXI+IGlzIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZgotdGhlIERURCBmaWxlLiBJdCBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURCBmaWxlIChpbiB0aGlzCi1jYXNlLCB0aGUgRFREIGZpbGUgaXMgIDx2YXIgY2xhc3M9InZhcm5hbWUiPkludm9pY2UuZHRkPC92YXI+KS4gSWYgdGhlIHB1YmxpYyBpZGVudGlmaWVyCi1JbnZvaWNlSWQgY29ycmVzcG9uZHMgdG8gdGhlICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5LZXk8L3Zhcj4gb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5Ci1mb3IgSW52b2ljZS5kdGQsIHRoZW4gdGhlICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5VUkk8L3Zhcj4gb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5Ci0od2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIEludm9pY2UuZHRkKSBpcyB1c2VkIHRvCi1sb2NhdGUgdGhlIERURC4gT3RoZXJ3aXNlLCB0aGUgRE9DVFlQRSdzIHN5c3RlbSBpZGVudGlmaWVyICggPHZhciBjbGFzcz0idmFybmFtZSI+IkM6XG15ZHRkc1xJbnZvaWNlLmR0ZCI8L3Zhcj4pLAotd2hpY2ggcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvZiB0aGUgRFRELCBpcyB1c2VkIHRvIGxvY2F0ZQotdGhlIERURC48L3A+Ci08cD4gPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBZb3UgY2FuIGFsc28gdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXkKLWluIGFuIFhNTCBDYXRhbG9nIGVudHJ5LiBJZiB5b3UgdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXksIGEgRE9DVFlQRQotdGFnIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gYW4gWE1MIGZpbGU6PC9wPgotPHByZT4mbHQ7IURPQ1RZUEUgUm9vdC1uYW1lIFNZU1RFTSAiPHZhciBjbGFzcz0idmFybmFtZSI+TXlEVEQuZHRkPC92YXI+IiZndDsgPC9wcmU+Ci08cD53aGVyZSAgPHZhciBjbGFzcz0idmFybmFtZSI+TXlEVEQuZHRkPC92YXI+IGlzIHRoZSBzeXN0ZW0gaWRlbnRpZmllciB0aGF0IGNvcnJlc3BvbmRzCi10byB0aGUgS2V5IG9mIGFuIFhNTCBDYXRhbG9nIGVudHJ5LjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48c3Ryb25nPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlIHdpdGggYW4gWE1MIHNjaGVtYTwvc3Ryb25nPjxwPklmIGFuIFhNTCBmaWxlCi1pcyBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSwgb25lIG9yIG1vcmUgc2NoZW1hIGxvY2F0aW9uIGF0dHJpYnV0ZXMgYXJlCi1pbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGUuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2NoZW1hTG9jYXRpb24gaXMgcHJvdmlkZWQKLWFzIGEgImhpbnQiIHRvIHRoZSBYTUwgcHJvY2Vzc29yLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgc2NoZW1hTG9jYXRpb24KLWF0dHJpYnV0ZXMuPC9wPgotPGRpdiBjbGFzcz0icCI+IDxzdHJvbmc+RXhhbXBsZSAxIDwvc3Ryb25nPjxwcmU+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIEM6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCImZ3Q7Ci0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIiZndDsKLS4uLjwvcHJlPgotICAgIDwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5FeGFtcGxlIDIgPC9zdHJvbmc+PHByZT4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIgoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gUE8ueHNkIiZndDsKLSZsdDtzaGlwVG8gY291bnRyeT0iVVMiJmd0OwotLi4uLjwvcHJlPgotICA8L2Rpdj4KLTxwPkluIEV4YW1wbGUgMSwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ0M6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCcpCi1yZWZlcnMgZGlyZWN0bHkgdG8gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgWE1MIHNjaGVtYS4gSW4gdGhpcwotY2FzZSwgdGhlIHNjaGVtYSBmaWxlIHdpbGwgYmUgbG9jYXRlZCBieSB0aGUgWE1MIHByb2Nlc3NvciBkaXJlY3RseS48L3A+Ci08cD5JbgotRXhhbXBsZSAyLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnUE8ueHNkJykgcmVmZXJzIHRvIGFuIFhNTCBDYXRhbG9nIGVudHJ5LgotUE8ueHNkIGNvcnJlc3BvbmRzIHRvIHRoZSAgPHZhciBjbGFzcz0idmFybmFtZSI+S2V5PC92YXI+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQotZm9yIFB1cmNoYXNlT3JkZXIueHNkLCBhbmQgdGhlIFVSSSBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkgKHdoaWNoIGNvbnRhaW5zCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgUHVyY2hhc2VPcmRlci54c2QpIHdpbGwgYmUgdXNlZCB0byBsb2NhdGVkCi10aGUgWE1MIHNjaGVtYS48L3A+Ci08cD5JbiBib3RoIGV4YW1wbGVzLCA8c2FtcCBjbGFzcz0iY29kZXBoIj5odHRwOi8vd3d3LmlibS5jb208L3NhbXA+IGluCi10aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+eHNpOnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0YWcgaXMgYSBVUkkgdGhhdCBpZGVudGlmaWVzIHRoZSBuYW1lc3BhY2UKLWZvciB0aGUgWE1MIHNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Zb3UgY2FuIGFsc28gdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5IGZvciBhbiBYTUwKLUNhdGFsb2cgZW50cnkuIElmIHlvdSB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXksIGEgc2NoZW1hTG9jYXRpb24gdGFnIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjxwcmU+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM6PSJ3d3cuaWJtLmNvbSIKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHBvL3hzZC9QdXJjaGFzZU9yZGVyLnhzZCAiJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5UaGUKLXNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBwb2ludHMgdG8gYm90aCB0aGUgS2V5IGFuZCB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mCi10aGUgc2NoZW1hLjwvcD4KLTxwPjxzdHJvbmc+RFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiBhIHJlbW90ZSBzZXJ2ZXI8L3N0cm9uZz48L3A+Ci08cD5TZXZlcmFsCi1mdW5jdGlvbnMgaW4gdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdmFsaWRhdGlvbiBhbmQgY29udGVudCBhc3Npc3QsIHJlcXVpcmUKLXRoZSBhdmFpbGFiaWxpdHkgb2YgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYS4gVGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiBwcm92aWRlcwotdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGNhc2VzIHdoZW4gdGhlIERURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24geW91ciBsb2NhbAotbWFjaGluZS4gSG93ZXZlciwgaW4gbWFueSBjYXNlcywgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiByZXNpZGUgb24gYSByZW1vdGUKLXNlcnZlciwgZm9yIGV4YW1wbGU6PC9wPgotPHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyFET0NUWVBFIENhdGFsb2cgUFVCTElDICJhYmMvQ2F0YWxvZyIKLSJodHRwOi8veHl6LmFiYy5vcmcvZHRkcy9jYXRhbG9nLmR0ZCImZ3Q7PC9zYW1wPjwvcD4KLTxwPk5vcm1hbGx5LCB0aGlzIGNhc2UKLXBvc2VzIG5vIHByb2JsZW0sIGJlY2F1c2UgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUKLXJlbW90ZSBzZXJ2ZXIuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwsIGFuZCBkbyBub3QgaGF2ZSBhIFNPQ0tTaWZpZWQKLXN5c3RlbSwgdGhlIHdvcmtiZW5jaCBjdXJyZW50bHkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBmb3IgeW91IHRvIHNwZWNpZnkKLWEgc29ja3Mgc2VydmVyIGZvciByZXRyaWV2aW5nIGEgRFREIG9yIFhNTCBzY2hlbWEuIElmIHlvdSBhcmUgdW5hYmxlIHRvIFNPQ0tTaWZ5Ci15b3VyIHN5c3RlbSwgdGhlIHdvcmthcm91bmQgZm9yIHRoaXMgcHJvYmxlbSBpcyB0byByZXRyaWV2ZSBhIGNvcHkgb2YgdGhlCi1EVEQgb3IgWE1MIHNjaGVtYSAodXNpbmcgYSBXZWIgYnJvd3NlciwgZm9yIGV4YW1wbGUpIGFuZCBzYXZlIHRoYXQgY29weSBvbgoteW91ciBsb2NhbCBtYWNoaW5lLiBUaGVuLCB5b3UgY2FuIGVpdGhlciBwbGFjZSBhIGxvY2FsIGNvcHkgaW4gdGhlIHNhbWUgcHJvamVjdAotYXMgeW91ciBYTUwgZmlsZSwgb3IgdXNlIHRoZSBYTUwgQ2F0YWxvZyB0byBhc3NvY2lhdGUgYSBwdWJsaWMgaWRlbnRpZmllcgotd2l0aCB0aGUgRFREJ3MgKGxvY2FsKSBsb2NhdGlvbi48L3A+Ci08cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBoYXZlIGFuIFhNTCBmaWxlCi1hc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSBvciBEVEQgdGhhdCBpcyBlbHNld2hlcmUgaW4gdGhlIG5ldHdvcmssIGFuZAoteW91IGFyZSB3b3JraW5nIG9uIGEgbWFjaGluZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbmV0d29yaywgeW91IGNhbiBmb2xsb3cKLXRoZSBzdGVwcyBkZXNjcmliZWQgcHJldmlvdXNseSBpZiB5b3Ugd2FudCB0byB1c2UgY29udGVudCBhc3Npc3Qgb3IgdmFsaWRhdGUKLXlvdXIgWE1MIGZpbGUuICA8L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkFkdmFudGFnZXMgb2YgWE1MIENhdGFsb2cgZW50cnkgYXNzb2NpYXRpb25zPC9oND48cD5JZgoteW91IGNyZWF0ZSBhIGRpcmVjdCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIFhNTCBmaWxlIGFuZCBhbiBYTUwgc2NoZW1hIG9yIERURAotZmlsZSwgYW55IHRpbWUgeW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQgeW91IGhhdmUgdG8gdHJhY2sKLWRvd24gYW5kIHVwZGF0ZSBhbGwgb2YgdGhlIHJlZmVyZW5jaW5nIFhNTCBmaWxlcyB3aXRoIHRoZSBuZXcgbG9jYXRpb24gb2YKLXRoZSBEVEQgb3Igc2NoZW1hLiBJZiwgaG93ZXZlciwgeW91IGFzc29jaWF0ZSBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWEKLW9yIERURCBLZXksIHRoZW4sIHdoZW4geW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQsIHlvdSBvbmx5Ci1oYXZlIHRvIHVwZGF0ZSB0aGUgWE1MIENhdGFsb2cgZW50cnksIGluc3RlYWQgb2YgZWFjaCBpbmRpdmlkdWFsIFhNTCBmaWxlLjwvcD4KLTxwPkZvcgotZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgY2FsbGVkICJCdWlsZGluZy5kdGQiLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggZml2ZQotWE1MIGZpbGVzIC0gT2ZmaWNlLnhtbCwgSG91c2UueG1sLCBBcGFydG1lbnQueG1sLCBCYW5rLnhtbCwgYW5kIFBvc3RPZmZpY2UueG1sLgotWW91IG1vdmUgdGhlIERURCBmaWxlIEJ1aWxkaW5nLmR0ZCB0byBhIG5ldyBsb2NhdGlvbi4gSWYgeW91IGhhdmUgYSBkaXJlY3Rpb24KLWFzc29jaWF0aW9uIGJldHdlZW4gQnVpbGRpbmcuZHRkIGFuZCBhbGwgdGhlIFhNTCBmaWxlcywgeW91IHdpbGwgaGF2ZSB0byB1cGRhdGUKLXRoZSAmbHQ7RE9DVFRZUEUmZ3Q7IGRlY2xhcmF0aW9uIGluIGVhY2ggWE1MIGZpbGUgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uCi1vZiBCdWlsZGluZy5kdGQuIElmLCBob3dldmVyLCB5b3UgaGF2ZSBhbiBYTUwgQ2F0YWxvZyBhc3NvY2lhdGlvbiwKLWFuZCBhbGwgdGhlIFhNTCBmaWxlcyBqdXN0IHJlZmVyIHRvIHRoZSBLZXkgb2YgQnVpbGRpbmcuZHRkLCB0aGVuIHlvdSBvbmx5Ci1oYXZlIHRvIHVwZGF0ZSB0aGUgVVJJIGFuZCBhbGwgdGhlIFhNTCBmaWxlcyB3aWxsIHBvaW50IHRvIHRoZSBuZXcgbG9jYXRpb24KLW9mIEJ1aWxkaW5nLmR0ZC48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlVwZGF0aW5nIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZzwvaDQ+PHA+QWZ0ZXIgeW91IGhhdmUKLXVwZGF0ZWQgYW4gZW50cnkgaW4gdGhlIFhNTCBDYXRhbG9nLCB5b3UgbWlnaHQgbmVlZCB0byByZWZyZXNoIHRoZSBYTUwgZWRpdG9yCi12aWV3IHNvIHRoYXQgaXQgdXNlcyB0aGUgbmV3IGluZm9ybWF0aW9uLiBUbyBkbyB0aGlzLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVsb2FkCi1EZXBlbmRlbmNpZXM8L3NwYW4+IHRvb2xiYXIgYnV0dG9uIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmxkZ3Jtci5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvb2xiYXIgYnV0dG9uIiAvPiBhbmQKLXRoZSB2aWV3IHdpbGwgYmUgdXBkYXRlZCB1c2luZyB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gWW91IG9ubHkKLW5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvciB2aWV3IHdoZW4geW91IGhhdmUgYW4gWE1MIGZpbGUgb3BlbiB0aGF0IHJlZmVyZW5jZXMKLXRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0aGF0IHdhcyB1cGRhdGVkLjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlcgotdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPgotPHA+KGMpIENvcHlyaWdodCAyMDAxLCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtCi0oTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuCi1JbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgKHRoYXQgaXMsIGEgc2V0IG9mIHJ1bGVzKSBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgdGl0bGU9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiB0aXRsZT0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleSI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgdGl0bGU9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIHRpdGxlPSJZb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLiI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0cHJvYy5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHBhc3MgYWxvbmcgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIj5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlM2VhYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9ImN4bWxlbmMiIHhtbDpsYW5nPSJlbi11cyI+PD9QdWIgQ2FyZXQ/Pg0KLTx0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0DQotaXMgaW4uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RW5jb2RpbmdzPGluZGV4dGVybT5IVE1MPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5FbmNvZGluZ3M8aW5kZXh0ZXJtPlhNTDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgSUFOQSBuYW1lIGlzIHVzZWQgaW4gdGhlIGVuY29kaW5nIHN0YXRlbWVudCBvZiBhbiBYTUwgZmlsZSwgb3IgY2hhcnNldA0KLWRpcmVjdGl2ZSBpbiBhbiBIVE1MIGZpbGUuPC9wPg0KLTxwPlRoZSBIVE1MIGFuZCBYTUwgZWRpdG9ycyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzOjwvcD4NCi08dGFibGUgcm93aGVhZGVyPSJmaXJzdGNvbCI+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMxIi8+DQotPHRoZWFkPg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249InRvcCI+IDxwPjxiPlhNTCBFbmNvZGluZyAoSUFOQSBOYW1lKTwvYj48L3A+IDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIiB2YWxpZ249InRvcCI+IDxwPjxiPkRlc2NyaXB0aW9uPC9iPjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeT4gPHA+QklHNTwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkJpZzUsIFRyYWRpdGlvbmFsIENoaW5lc2U8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPkVVQy1KUDwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkVVQyBlbmNvZGluZywgSmFwYW5lc2U8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPkVVQy1LUjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkVVQyBlbmNvZGluZywgS29yZWFuPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5HQjIzMTI8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5HQkssIFNpbXBsaWZpZWQgQ2hpbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5HQjE4MDMwPC9lbnRyeT4NCi08ZW50cnk+TmF0aW9uYWwgU3RhbmRhcmQsIENoaW5lc2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklCTTg2NDwvZW50cnk+DQotPGVudHJ5PlBDIEFyYWJpYyAoZW5jb2Rpbmcgbm90IHN1cHBvcnRlZCBieSB0aGUgUGFnZSBEZXNpZ25lciBEZXNpZ24gcGFnZS4NCi0pPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTIwMjItSlA8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMjAyMiwgSmFwYW5lc2U8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy0yMDIyLUtSPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIDIwMjIsIEtvcmVhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTg4NTktMTwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyBMYXRpbi0xPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTI8L2VudHJ5Pg0KLTxlbnRyeT5DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYyk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTM8L2VudHJ5Pg0KLTxlbnRyeT5Tb3V0aGVybiBFdXJvcGVhbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktNDwvZW50cnk+DQotPGVudHJ5PklTTyA4ODU5LTQsIEN5cmlsbGljPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS01PC9lbnRyeT4NCi08ZW50cnk+SVNPIDg4NTktNSwgQ3lyaWxsaWM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS02PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+QXJhYmljIChMb2dpY2FsKTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS03PC9lbnRyeT4NCi08ZW50cnk+R3JlZWs8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS04LUk8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXcgKExvZ2ljYWwpPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS04PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SGVicmV3IChWaXN1YWwpKGVuY29kaW5nIHN1cHBvcnRlZCwgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBhZ2UNCi1EZXNpZ25lciBEZXNpZ24gcGFnZSk8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktOTwvZW50cnk+DQotPGVudHJ5PlR1cmtpc2g8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5TSElGVF9KSVM8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5TaGlmdC1KSVMsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PlRJUy02MjA8L2VudHJ5Pg0KLTxlbnRyeT5USVNJLCBUaGFpPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVMtQVNDSUk8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5VUyBBU0NJSTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTg8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMTA2NDYvVW5pY29kZSwgb25lLWJ5dGUgZW5jb2Rpbmc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAxMDY0Ni9Vbmljb2RlLCB0d28tYnl0ZSBlbmNvZGluZzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2QkU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIEJpZ0VuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2TEU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIExpdHRsZUVuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5XSU5ET1dTLTg3NDwvZW50cnk+DQotPGVudHJ5PlRoYWksIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJNaWNyb3NvZnQgQ29ycG9yYXRpb24iIHRtdHlwZT0icmVnIg0KLXRyYWRlbWFyaz0iTWljcm9zb2Z0Ij5NaWNyb3NvZnQ8L3RtPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPldJTkRPV1MtMTI1MjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyBMYXRpbi0xPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5XSU5ET1dTLTEyNTU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPldJTkRPV1MtMTI1NjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkFyYWJpYzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5YLUVVQy1KUDwvZW50cnk+DQotPGVudHJ5PkVVQyBlbmNvZGluZywgSmFwYW5lc2UgKGFsaWFzIGZvciBFVUMtSlApPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5YLVNKSVM8L2VudHJ5Pg0KLTxlbnRyeT5TaGlmdC1KSVMsIEphcGFuZXNlIChhbGlhcyBmb3IgU0hJRlRfSklTKTwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDM5OTE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjEwMTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIGFuZCBIVE1MIGVuY29kaW5ncyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJFbmNvZGluZ3MgZW5hYmxlIHlvdSB0byBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHlvdXIgdGV4dCBpcyBpbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iRW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQgaXMgaW4uIiAvPgotPG1ldGEgY29udGVudD0iRW5jb2RpbmdzLCBIVE1MLCBYTUwiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJFbmNvZGluZ3MsIEhUTUwsIFhNTCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3htbGVuYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN4bWxlbmMiPjxhIG5hbWU9ImN4bWxlbmMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L2gxPgotCi0KLQotCi08ZGl2PjxwPkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0Ci1pcyBpbi48L3A+Ci0KLTxwPlRoZSBJQU5BIG5hbWUgaXMgdXNlZCBpbiB0aGUgZW5jb2Rpbmcgc3RhdGVtZW50IG9mIGFuIFhNTCBmaWxlLCBvciBjaGFyc2V0Ci1kaXJlY3RpdmUgaW4gYW4gSFRNTCBmaWxlLjwvcD4KLQotPHA+VGhlIEhUTUwgYW5kIFhNTCBlZGl0b3JzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBlbmNvZGluZ3M6PC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDA3QiI+IDxwPjxzdHJvbmc+WE1MIEVuY29kaW5nIChJQU5BIE5hbWUpPC9zdHJvbmc+PC9wPgotIDwvdGg+Ci0KLTx0aCB2YWxpZ249InRvcCIgaWQ9Ik4xMDA4RCI+IDxwPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3A+Ci0gPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAwQUIiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5CSUc1PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEFCIE4xMDA4RCAiPiA8cD5CaWc1LCBUcmFkaXRpb25hbCBDaGluZXNlPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMENCIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+RVVDLUpQPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMENCIE4xMDA4RCAiPiA8cD5FVUMgZW5jb2RpbmcsIEphcGFuZXNlPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMEVCIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+RVVDLUtSPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVCIE4xMDA4RCAiPiA8cD5FVUMgZW5jb2RpbmcsIEtvcmVhbjwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDEwQiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPkdCMjMxMjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwQiBOMTAwOEQgIj4gPHA+R0JLLCBTaW1wbGlmaWVkIENoaW5lc2U8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxMkIiIGhlYWRlcnM9Ik4xMDA3QiAiPkdCMTgwMzA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEyQiBOMTAwOEQgIj5OYXRpb25hbCBTdGFuZGFyZCwgQ2hpbmVzZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTNGIiBoZWFkZXJzPSJOMTAwN0IgIj5JQk04NjQ8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEzRiBOMTAwOEQgIj5QQyBBcmFiaWMgKGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBhZ2UgRGVzaWduZXIgRGVzaWduIHBhZ2UuCi0pPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxNTMiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5JU08tMjAyMi1KUDwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE1MyBOMTAwOEQgIj4gPHA+SVNPIDIwMjIsIEphcGFuZXNlPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTczIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+SVNPLTIwMjItS1I8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNzMgTjEwMDhEICI+IDxwPklTTyAyMDIyLCBLb3JlYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxOTMiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5JU08tODg1OS0xPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkzIE4xMDA4RCAiPiA8cD5JU08gTGF0aW4tMTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFCMyIgaGVhZGVycz0iTjEwMDdCICI+SVNPLTg4NTktMjwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMUIzIE4xMDA4RCAiPkNlbnRyYWwvRWFzdCBFdXJvcGVhbiAoU2xhdmljKTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUM3IiBoZWFkZXJzPSJOMTAwN0IgIj5JU08tODg1OS0zPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxQzcgTjEwMDhEICI+U291dGhlcm4gRXVyb3BlYW48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFEQiIgaGVhZGVycz0iTjEwMDdCICI+SVNPLTg4NTktNDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMURCIE4xMDA4RCAiPklTTyA4ODU5LTQsIEN5cmlsbGljPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxRUYiIGhlYWRlcnM9Ik4xMDA3QiAiPklTTy04ODU5LTU8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFFRiBOMTAwOEQgIj5JU08gODg1OS01LCBDeXJpbGxpYzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjAzIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+SVNPLTg4NTktNjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDIwMyBOMTAwOEQgIj4gPHA+QXJhYmljIChMb2dpY2FsKTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDIyMyIgaGVhZGVycz0iTjEwMDdCICI+SVNPLTg4NTktNzwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjIzIE4xMDA4RCAiPkdyZWVrPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMzciIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5JU08tODg1OS04LUk8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyMzcgTjEwMDhEICI+IDxwPkhlYnJldyAoTG9naWNhbCk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyNTciIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5JU08tODg1OS04PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjU3IE4xMDA4RCAiPiA8cD5IZWJyZXcgKFZpc3VhbCkoZW5jb2Rpbmcgc3VwcG9ydGVkLCBidXQgbm90IHN1cHBvcnRlZCBieSB0aGUgUGFnZQotRGVzaWduZXIgRGVzaWduIHBhZ2UpPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjc3IiBoZWFkZXJzPSJOMTAwN0IgIj5JU08tODg1OS05PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyNzcgTjEwMDhEICI+VHVya2lzaDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjhCIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+U0hJRlRfSklTPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjhCIE4xMDA4RCAiPiA8cD5TaGlmdC1KSVMsIEphcGFuZXNlPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkFCIiBoZWFkZXJzPSJOMTAwN0IgIj5USVMtNjIwPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyQUIgTjEwMDhEICI+VElTSSwgVGhhaTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkJGIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+VVMtQVNDSUk8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyQkYgTjEwMDhEICI+IDxwPlVTIEFTQ0lJPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkRGIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+VVRGLTg8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyREYgTjEwMDhEICI+IDxwPklTTyAxMDY0Ni9Vbmljb2RlLCBvbmUtYnl0ZSBlbmNvZGluZzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDJGRiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPlVURi0xNjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJGRiBOMTAwOEQgIj4gPHA+SVNPIDEwNjQ2L1VuaWNvZGUsIHR3by1ieXRlIGVuY29kaW5nPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMzFGIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+VVRGLTE2QkU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzMUYgTjEwMDhEICI+IDxwPlVuaWNvZGUgQmlnRW5kaWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMzNGIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+VVRGLTE2TEU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzM0YgTjEwMDhEICI+IDxwPlVuaWNvZGUgTGl0dGxlRW5kaWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMzVGIiBoZWFkZXJzPSJOMTAwN0IgIj5XSU5ET1dTLTg3NDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMzVGIE4xMDA4RCAiPlRoYWksIE1pY3Jvc29mdDxzdXA+wq48L3N1cD48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDM3QyIgaGVhZGVycz0iTjEwMDdCICI+IDxwPldJTkRPV1MtMTI1MjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDM3QyBOMTAwOEQgIj4gPHA+SVNPIExhdGluLTE8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzOUMiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5XSU5ET1dTLTEyNTU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzOUMgTjEwMDhEICI+IDxwPkhlYnJldzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDNCQyIgaGVhZGVycz0iTjEwMDdCICI+IDxwPldJTkRPV1MtMTI1NjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDNCQyBOMTAwOEQgIj4gPHA+QXJhYmljPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwM0RDIiBoZWFkZXJzPSJOMTAwN0IgIj5YLUVVQy1KUDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwM0RDIE4xMDA4RCAiPkVVQyBlbmNvZGluZywgSmFwYW5lc2UgKGFsaWFzIGZvciBFVUMtSlApPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzRjAiIGhlYWRlcnM9Ik4xMDA3QiAiPlgtU0pJUzwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwM0YwIE4xMDA4RCAiPlNoaWZ0LUpJUywgSmFwYW5lc2UgKGFsaWFzIGZvciBTSElGVF9KSVMpPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sdG9vbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sdG9vbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzFlMDAyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN4bWx0b29sIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5YTUwgdG9vbHMgLSBvdmVydmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIHRvb2xzIC0gb3ZlcnZpZXc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBwcm9kdWN0IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2aXN1YWwgWE1MIGRldmVsb3BtZW50IGVudmlyb25tZW50Lg0KLVRoZSB0b29sIHNldCBpbmNsdWRlcyBjb21wb25lbnRzIGZvciBidWlsZGluZyBEVERzLCBYTUwgc2NoZW1hcywgYW5kIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgdG9vbHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZSBmb2xsb3dpbmcgWE1MIHRvb2xzIGFyZSBhdmFpbGFibGUuIDwvcD4NCi08cD5UaGUgPGI+WE1MIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIFlvdQ0KLWNhbiB1c2UgaXQgdG8gY3JlYXRlIG5ldyBYTUwgZmlsZXMsIGVpdGhlciBmcm9tIHNjcmF0Y2gsIGV4aXN0aW5nIERURHMsIG9yDQotZXhpc3RpbmcgWE1MIHNjaGVtYXMuIFlvdSBjYW4gYWxzbyB1c2UgaXQgdG8gZWRpdCBYTUwgZmlsZXMsIGFzc29jaWF0ZSB0aGVtDQotd2l0aCBEVERzIG9yIHNjaGVtYXMsIGFuZCB2YWxpZGF0ZSB0aGVtLiA8L3A+DQotPHA+IFRoZSA8Yj5EVEQgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIERURHMuICAgPC9wPg0KLTxwPlRoZSA8Yj5YTUwgc2NoZW1hIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcNCi1YTUwgc2NoZW1hcy4gWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgZWRpdG9yIHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyBjcmVhdGluZw0KLVhNTCBzY2hlbWEgY29tcG9uZW50cyBhbmQgaW1wb3J0aW5nIGFuZCB2aWV3aW5nIFhNTCBzY2hlbWFzLiA8L3A+PD9QdWIgQ2FyZXQxPz4NCi08cD48Yj5Ob3Rlczo8L2I+PC9wPg0KLTxzZWN0aW9uPkV4ZXJjaXNlIGNhdXRpb24gd2hlbiBvcGVuaW5nIGxhcmdlIGZpbGVzIHdpdGggYW55IG9mIHRoZSBYTUwgZWRpdG9ycy4NCi1JZiB0aGUgbWVtb3J5IGxpbWl0cyBvZiB0aGUgd29ya2JlbmNoIGFyZSBleGNlZWRlZCwgaXQgd2lsbCBhYnJ1cHRseSBjbG9zZQ0KLXdpdGhvdXQgc2F2aW5nIGFueSBkYXRhIChhbmQgd2l0aG91dCB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2VzKS4gVGhlIG51bWJlcg0KLW9mIGVsZW1lbnRzIGluIGFuIFhNTCBmaWxlLCBub3QgaXRzIHNpemUsIGlzIHRoZSBiZXN0IGluZGljYXRvciBvZiBob3cgbXVjaA0KLW1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkLiBNZW1vcnkgcmVxdWlyZW1lbnRzIGFsc28gZGVwZW5kIG9uIHdoYXQgZWxzZSBpcyBvcGVuDQotaW4gdGhlIHdvcmtiZW5jaCAtIGluIHNvbWUgY2FzZXMgeW91IGNhbiBvcGVuIGEgZmlmdGVlbiBtZWdhYnl0ZXMgZmlsZSwgYnV0DQotaW4gb3RoZXIgY2FzZXMgYSBvbmUgbWVnYWJ5dGUgZmlsZSBtaWdodCBjYXVzZSBwcm9ibGVtcy4gVGhlcmVmb3JlLCB3ZSByZWNvbW1lbmQNCi15b3Ugc2F2ZSBhbGwgZGF0YSBpbiB0aGUgd29ya2JlbmNoIGJlZm9yZSBvcGVuaW5nIGxhcmdlIFhNTCBmaWxlcy4gVGhpcyBpcw0KLWEgcGVybWFuZW50IHJlc3RyaWN0aW9uLjwvc2VjdGlvbj4NCi08c2VjdGlvbiBjb25yZWY9InJsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhI3JsaW1pdGF0aW9uc19zbHVzaFhNTC91bnJlc29sdl9VUkkiPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAyMDY0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Njk2MzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sdG9vbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5YTUwgdG9vbHMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3htbHRvb2wiPjxhIG5hbWU9ImN4bWx0b29sIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIHRvb2xzIC0gb3ZlcnZpZXc8L2gxPgotPGRpdj48cD5UaGlzIHByb2R1Y3QgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHZpc3VhbCBYTUwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCi1UaGUgdG9vbCBzZXQgaW5jbHVkZXMgY29tcG9uZW50cyBmb3IgYnVpbGRpbmcgRFREcywgWE1MIHNjaGVtYXMsIGFuZCBYTUwgZmlsZXMuPC9wPjxwPlRoZSBmb2xsb3dpbmcgWE1MIHRvb2xzIGFyZSBhdmFpbGFibGU6PC9wPgotPHA+VGhlIDxiPlhNTCBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiBZb3UKLWNhbiB1c2UgaXQgdG8gY3JlYXRlIG5ldyBYTUwgZmlsZXMsIGVpdGhlciBmcm9tIHNjcmF0Y2gsIGV4aXN0aW5nIERURHMsIG9yCi1leGlzdGluZyBYTUwgc2NoZW1hcy4gWW91IGNhbiBhbHNvIHVzZSBpdCB0byBlZGl0IFhNTCBmaWxlcywgYXNzb2NpYXRlIHRoZW0KLXdpdGggRFREcyBvciBzY2hlbWFzLCBhbmQgdmFsaWRhdGUgdGhlbS48L3A+Ci08cD5UaGUgPGI+RFREIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBEVERzLiA8L3A+Ci08cD5UaGUgPGI+WE1MIHNjaGVtYSBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIAotWE1MIHNjaGVtYXMuIFlvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGVkaXRvciB0byBwZXJmb3JtIHRhc2tzIHN1Y2ggYXMgY3JlYXRpbmcgCi1YTUwgc2NoZW1hIGNvbXBvbmVudHMgYW5kIGltcG9ydGluZyBhbmQgdmlld2luZyBYTUwgc2NoZW1hcy4gPC9wPgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj5FeGVyY2lzZSBjYXV0aW9uIHdoZW4gb3BlbmluZyBsYXJnZSBmaWxlcyB3aXRoIGFueSBvZiB0aGUgWE1MIGVkaXRvcnMuCi1JZiB0aGUgbWVtb3J5IGxpbWl0cyBvZiB0aGUgd29ya2JlbmNoIGFyZSBleGNlZWRlZCwgaXQgd2lsbCBhYnJ1cHRseSBjbG9zZQotd2l0aG91dCBzYXZpbmcgYW55IGRhdGEgKGFuZCB3aXRob3V0IHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZXMpLiBUaGUgbnVtYmVyCi1vZiBlbGVtZW50cyBpbiBhbiBYTUwgZmlsZSwgbm90IGl0cyBzaXplLCBpcyB0aGUgYmVzdCBpbmRpY2F0b3Igb2YgaG93IG11Y2gKLW1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkLiBNZW1vcnkgcmVxdWlyZW1lbnRzIGFsc28gZGVwZW5kIG9uIHdoYXQgZWxzZSBpcyBvcGVuCi1pbiB0aGUgd29ya2JlbmNoIC0gaW4gc29tZSBjYXNlcyB5b3UgY2FuIG9wZW4gYSAxNSBtZWdhYnl0ZXMgZmlsZSwgYnV0IGluCi1vdGhlciBjYXNlcyBhIG9uZS1tZWdhYnl0ZSBmaWxlIG1heSBjYXVzZSBwcm9ibGVtcy4gVGhlcmVmb3JlLCB3ZSByZWNvbW1lbmQKLXlvdSBzYXZlIGFsbCBkYXRhIGluIHRoZSB3b3JrYmVuY2ggYmVmb3JlIG9wZW5pbmcgbGFyZ2UgWE1MIGZpbGVzLiBUaGlzIGlzCi1hIHBlcm1hbmVudCByZXN0cmljdGlvbi48L2Rpdj4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+PHA+VGhlCi1iZWhhdmlvciBvZiB0aGUgWE1MIHBhcnNlciB3aGVuIGVuY291bnRlcmluZyBhbiB1bnJlc29sdmFibGUgVVJJIChmb3IgZXhhbXBsZSwKLWluIGEgRE9DVFlQRSBkZWNsYXJhdGlvbikgaXMgdG8gcmVwb3J0IGEgZmF0YWwgSU8gZXJyb3IgYW5kIHN0b3AgYW55IGZ1cnRoZXIKLXByb2Nlc3NpbmcuIEFuIHVucmVzb2x2ZWQgVVJJIGlzIHNlZW4gbmVpdGhlciBhcyBhIHN5bnRhY3RpYyBub3IgYSBzZW1hbnRpYwotZXJyb3IgYW5kIGFzIHN1Y2gsIHRoZSBwYXJzZXIgZG9lcyBub3QgYXR0ZW1wdCB0byBoYW5kbGUgaXQuIEVzc2VudGlhbGx5LAotdGhlIGRvY3VtZW50IHJlbWFpbnMgdW5jaGVja2VkLiBUaGlzIGlzIGEga25vd24gcHJvYmxlbS48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYmU3MTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiIgInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJleHRjdG4iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCB0byBleHRlbmQNCi10aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuPC9zaG9ydGRlc2M+DQotPHJlZmJvZHk+DQotPHNlY3Rpb24+PHA+Rm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFuIFhNTCBzY2hlbWEgZmlsZSBjYWxsZWQgQm9vay54c2QgdGhhdA0KLWNvbnRhaW5zIGEgY29tcGxleCB0eXBlIGNhbGxlZCBCb29rVHlwZS4gQm9va1R5cGUgY29udGFpbnMgNCBlbGVtZW50cyAodGl0bGUsDQotYXV0aG9yLCB5ZWFyLCBhbmQgSVNCTikgYW5kIG9uZSAgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudC4gVGhlIG5hbWVzcGFjZQ0KLWZvciB0aGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gIGVsZW1lbnQgaXMgIDxjb2RlcGg+IyNhbnk8L2NvZGVwaD4uIFRoaXMgbWVhbnMNCi10aGF0IGluIGFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZQ0KLWRlZmluaXRpb24gb2YgdGhlIEJvb2tUeXBlLjwvcD48cD5Zb3UgY2FuIGFsc28gcHJvdmlkZSBhIG1vcmUgc3BlY2lmaWMgbmFtZXNwYWNlLg0KLUZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbm90aGVyIHNjaGVtYSBjYWxsZWQgTXlfQm9vay54c2QsIHdoaWNoIGNvbnRhaW5zIGENCi1jb21wbGV4IHR5cGUgY2FsbGVkIE15X0Jvb2tUeXBlLiBNeV9Cb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwgYXV0aG9yLA0KLXllYXIsIGFuZCBJU0JOKSBhbmQgb25lICA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LCBidXQgaW4gdGhpcyBjYXNlIHRoZQ0KLW5hbWVzcGFjZSBmb3IgdGhlICBCb29rVHlwZSBlbGVtZW50IGlzIHd3dy53ZXNsZXkuY29tLiBUaGlzIG1lYW5zIHRoYXQgaW4NCi1hbiBpbnN0YW5jZSBkb2N1bWVudCwgeW91IGNhbiBpbnNlcnQgYW55IFhNTCBlbGVtZW50IHRvIGV4dGVuZCB0aGUgZGVmaW5pdGlvbg0KLW9mIHRoZSBCb29rVHlwZSwgcHJvdmlkZWQgdGhhdCB0aGV5IGJlbG9uZyB0byB0aGUgbmFtZXNwYWNlIGh0dHA6Ly93d3cud2VzbGV5LmNvbS48L3A+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTkwODZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGFueSBlbGVtZW50IHRvIGV4dGVuZCB0aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGFueSBlbGVtZW50IHRvIGV4dGVuZCB0aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJleHRjdG4iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXh0Y3RuIj48YSBuYW1lPSJyZXh0Y3RuIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzPC9oMT4KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IHRvIGV4dGVuZAotdGhlIGNvbnRlbnQgbW9kZWwgb2YgYW4gWE1MIGRvY3VtZW50LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFuIFhNTCBzY2hlbWEgZmlsZSBjYWxsZWQgQm9vay54c2QgdGhhdAotY29udGFpbnMgYSBjb21wbGV4IHR5cGUgY2FsbGVkIEJvb2tUeXBlLiBCb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwKLWF1dGhvciwgeWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudC4gVGhlIG5hbWVzcGFjZQotZm9yIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+ICBlbGVtZW50IGlzICA8c2FtcCBjbGFzcz0iY29kZXBoIj4jI2FueTwvc2FtcD4uIFRoaXMgbWVhbnMKLXRoYXQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQsIHlvdSBjYW4gaW5zZXJ0IGFueSBYTUwgZWxlbWVudCB0byBleHRlbmQgdGhlCi1kZWZpbml0aW9uIG9mIHRoZSBCb29rVHlwZS48L3A+Ci08cD5Zb3UgY2FuIGFsc28gcHJvdmlkZSBhIG1vcmUgc3BlY2lmaWMgbmFtZXNwYWNlLgotRm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFub3RoZXIgc2NoZW1hIGNhbGxlZCBNeV9Cb29rLnhzZCwgd2hpY2ggY29udGFpbnMgYQotY29tcGxleCB0eXBlIGNhbGxlZCBNeV9Cb29rVHlwZS4gTXlfQm9va1R5cGUgY29udGFpbnMgNCBlbGVtZW50cyAodGl0bGUsIGF1dGhvciwKLXllYXIsIGFuZCBJU0JOKSBhbmQgb25lICA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlCi1uYW1lc3BhY2UgZm9yIHRoZSAgQm9va1R5cGUgZWxlbWVudCBpcyB3d3cud2VzbGV5LmNvbS4gVGhpcyBtZWFucyB0aGF0IGluCi1hbiBpbnN0YW5jZSBkb2N1bWVudCwgeW91IGNhbiBpbnNlcnQgYW55IFhNTCBlbGVtZW50IHRvIGV4dGVuZCB0aGUgZGVmaW5pdGlvbgotb2YgdGhlIEJvb2tUeXBlLCBwcm92aWRlZCB0aGF0IHRoZXkgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy53ZXNsZXkuY29tLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZWU0YjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmxpbWl0YXRpb25zX3NsdXNoWE1MIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLjwvc2hvcnRkZXNjPg0KLTxyZWZib2R5Pg0KLTwhLS1Vc2UgdGhpcyB0ZW1wbGF0ZSB0byBzaW5nbGUgc291cmNlIHRoZSByZWFkbWUgaW5mb3JtYXRpb24uICBUaGUgY29udGVudCBmb3IgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIGluIHRoaXMgdG9waWMgYW5kIGlzIGluc2VydGVkIGludG8gdGhlIHJlbGF0ZWQgdG9waWMgdXNpbmcgdGhlIGNvbnJlZiBhdHRyaWJ1dGUuIFRoaXMgZmlsZSB3aWxsIG5vdCBiZSBzdXJmYWNlZCBpbiB5b3VyIG5hdmlnYXRpb24uLS0+DQotPHNlY3Rpb24gaWQ9InVucmVzb2x2X1VSSSI+PCEtLU5vIGRlZmVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcy4gSXQgaXMgZnJvbSB0aGUgNS4xLiByZWFkbWUuLS0+PHA+VGhlDQotYmVoYXZpb3Igb2YgdGhlIFhNTCBwYXJzZXIgd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5yZXNvbHZhYmxlIFVSSSAoZm9yIGV4YW1wbGUsDQotaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uKSBpcyB0byByZXBvcnQgYSBmYXRhbCBJTyBlcnJvciBhbmQgc3RvcCBhbnkgZnVydGhlcg0KLXByb2Nlc3NpbmcuIEFuIHVucmVzb2x2ZWQgVVJJIGlzIHNlZW4gbmVpdGhlciBhcyBhIHN5bnRhY3RpYyBub3IgYSBzZW1hbnRpYw0KLWVycm9yIGFuZCBhcyBzdWNoLCB0aGUgcGFyc2VyIGRvZXMgbm90IGF0dGVtcHQgdG8gaGFuZGxlIGl0LiBFc3NlbnRpYWxseSwNCi10aGUgZG9jdW1lbnQgcmVtYWlucyB1bmNoZWNrZWQuIFRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVjZTZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJybGltaXRhdGlvbnNfc2x1c2hYTUwiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUwiPjxhIG5hbWU9InJsaW1pdGF0aW9uc19zbHVzaFhNTCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvcjwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLjwvcD4KLQotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0icmxpbWl0YXRpb25zX3NsdXNoWE1MX191bnJlc29sdl9VUkkiPjxhIG5hbWU9InJsaW1pdGF0aW9uc19zbHVzaFhNTF9fdW5yZXNvbHZfVVJJIj48IS0tIC0tPjwvYT48cD5UaGUKLWJlaGF2aW9yIG9mIHRoZSBYTUwgcGFyc2VyIHdoZW4gZW5jb3VudGVyaW5nIGFuIHVucmVzb2x2YWJsZSBVUkkgKGZvciBleGFtcGxlLAotaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uKSBpcyB0byByZXBvcnQgYSBmYXRhbCBJTyBlcnJvciBhbmQgc3RvcCBhbnkgZnVydGhlcgotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljCi1lcnJvciBhbmQgYXMgc3VjaCwgdGhlIHBhcnNlciBkb2VzIG5vdCBhdHRlbXB0IHRvIGhhbmRsZSBpdC4gRXNzZW50aWFsbHksCi10aGUgZG9jdW1lbnQgcmVtYWlucyB1bmNoZWNrZWQuIFRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyZDJlZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08cmVmZXJlbmNlIGlkPSJyaWNvbnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduDQotdmlldy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5pY29uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08dGFibGU+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMxIi8+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249ImJvdHRvbSI+PGI+SWNvbjwvYj48L2VudHJ5Pjw/UHViIENhcmV0MT8+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIiB2YWxpZ249ImJvdHRvbSI+PGI+RGVzY3JpcHRpb248L2I+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZQ0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWNoYXJhY3RlciBkYXRhIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudA0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRQ0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PkRPQ1RZUEUgZGVjbGFyYXRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL25lbGVtLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9ucyBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCi08P1B1YiAqMDAwMDAwMTgyND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwODdhOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24gdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgaWNvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBpY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJpY29ucyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24KLXZpZXcuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5JY29uPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0iYm90dG9tIj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZSYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7Y2hhcmFjdGVyIGRhdGEgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudCYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRSYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPkRPQ1RZUEUgZGVjbGFyYXRpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25lbGVtLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+ZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZyYjMTA7aW5zdHJ1Y3Rpb25zIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljZjA3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRjcmV0eG1sIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluDQotdGhlIFhNTCBlZGl0b3IuIFdoZW4geW91IGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIGl0IGlzIG5vdCBhc3NvY2lhdGVkDQotd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YNCi1jb250ZW50IGl0IGNhbiBjb250YWluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBjcmVhdGUgYSBuZXcsDQotZW1wdHkgWE1MIGZpbGUsIGZvbGxvdyB0aGVzZSBpbnN0cnVjdGlvbnM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JZiBuZWNlc3NhcnksIGNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5DcmVhdGUgWE1MIGZpbGUgZnJvbSBzY3JhdGNoPC91aWNvbnRyb2w+IHJhZGlvDQotYnV0dG9uLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV4dC48L3VpY29udHJvbD48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgZmlsZS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5GaWxlIG5hbWU8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YNCi10aGUgWE1MIGZpbGUsIGZvciBleGFtcGxlIDx1c2VyaW5wdXQ+TXlYTUxGaWxlLnhtbDwvdXNlcmlucHV0Pi4gVGhlIG5hbWUgb2YNCi15b3VyIFhNTCBmaWxlICA8dmFybmFtZT5tdXN0PC92YXJuYW1lPiBlbmQgaW4gPHVzZXJpbnB1dD4ueG1sPC91c2VyaW5wdXQ+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMGE5ZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFdoZW4geW91IGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFdoZW4geW91IGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JldHhtbCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNyZXR4bWwiPjxhIG5hbWU9InRjcmV0eG1sIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4KLXRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZAotd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YKLWNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldywKLWVtcHR5IFhNTCBmaWxlLCBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+SWYgbmVjZXNzYXJ5LCBjcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj48L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgWE1MIGZpbGUgZnJvbSBzY3JhdGNoPC9zcGFuPiByYWRpbwotYnV0dG9uLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dC48L3NwYW4+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgbmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YKLXRoZSBYTUwgZmlsZSwgZm9yIGV4YW1wbGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5NeVhNTEZpbGUueG1sPC9rYmQ+LiBUaGUgbmFtZSBvZgoteW91ciBYTUwgZmlsZSAgPHZhciBjbGFzcz0idmFybmFtZSI+bXVzdDwvdmFyPiBlbmQgaW4gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4ueG1sPC9rYmQ+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2MGQzYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRjcmV4ZHRkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQ8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkNCi1jcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXINCi1EVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aA0KLXlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91cg0KLURURC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmdlbmVyYXRpbmcgZnJvbSBEVERzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQ0KLWl0IGluIHRoZSBYTUwgZWRpdG9yLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZQ0KLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1jcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIERURCBmaWxlIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgdGhlIERURCBmaWxlIHRoYXQgeW91IHdhbnQgdG8NCi13b3JrIHdpdGguPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSBpdHMgcG9wLXVwIG1lbnUgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhdGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPlhNTCBGaWxlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IGEgcHJvamVjdCBvciBmb2xkZXIgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgYW5kIHR5cGUgYSBuYW1lDQotZm9yIGl0LjwvY21kPjxpbmZvPlRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDx1c2VyaW5wdXQ+LnhtbDwvdXNlcmlucHV0Pi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+Um9vdCBlbGVtZW50PC91aWNvbnRyb2w+IG9mIHRoZSBYTUwgZmlsZS48L2NtZD4NCi08aW5mbz5UaGUgcm9vdCBlbGVtZW50IG9mIGFuIFhNTCBmaWxlIGlzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIG90aGVyDQotZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgdGhlIGVsZW1lbnRzIHRoYXQgeW91IGhhdmUgZGVmaW5lZCBpbiB0aGUgRFREIHdpbGwNCi1iZSBzaG93biBpbiB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gbGlzdC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6ICA8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGF0dHJpYnV0ZXM8L3VpY29udHJvbD4uIEJvdGggbWFuZGF0b3J5DQotYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPkNyZWF0ZSBvcHRpb25hbCBlbGVtZW50czwvdWljb250cm9sPi4gQm90aCBtYW5kYXRvcnkgYW5kDQotb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9jaG9pY2U+PD9QdWIgQ2FyZXQxPz4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD4uIFRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPi4gQW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPiA8cD5JZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtDQotYW1vdW50IG9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9wPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPlB1YmxpYyBJRDwvdWljb250cm9sPiBvciA8dWljb250cm9sPlN5c3RlbQ0KLUlEPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPllvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IGJvdGguIElmIHlvdSBkbywgdGhlDQotUHVibGljIElEIHdpbGwgYmUgdXNlZCBiZWZvcmUgdGhlIFN5c3RlbSBJRC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBmaWxlIHdpbGwgb25seSBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgYW5kIGFueQ0KLWVsZW1lbnRzIG9yIGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoZSByb290IGVsZW1lbnQuIFlvdSBjYW4gbm93IGFkZCBlbGVtZW50cywNCi1hdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucyB0byB0aGUgWE1MIGZpbGUsIGhvd2V2ZXIsIHRoZXkgbXVzdCBmb2xsb3cNCi10aGUgcnVsZXMgZXN0YWJsaXNoZWQgaW4gdGhlIERURCB0aGF0IHlvdSB1c2VkIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMzM0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTU1ZWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBnZW5lcmF0aW5nIGZyb20gRFREcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIERURHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JleGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4ZHRkIj48YSBuYW1lPSJ0Y3JleGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyCi1EVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAoteW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyCi1EVEQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayB0aGUgRFREIGZpbGUgdGhhdCB5b3Ugd2FudCB0bwotd29yayB3aXRoLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gaXRzIHBvcC11cCBtZW51IGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhdGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGFuZCB0eXBlIGEgbmFtZQotZm9yIGl0Ljwvc3Bhbj4gVGhlIG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBlbmQgaW4gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4ueG1sPC9rYmQ+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IG9mIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci0gVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcgotZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgdGhlIGVsZW1lbnRzIHRoYXQgeW91IGhhdmUgZGVmaW5lZCBpbiB0aGUgRFREIHdpbGwKLWJlIHNob3duIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IGxpc3QuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb3B0aW9uczogIDwvc3Bhbj4KLTx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvc3Bhbj4uIEJvdGggbWFuZGF0b3J5Ci1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC9zcGFuPi4gQm90aCBtYW5kYXRvcnkgYW5kCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3NwYW4+LiBUaGUKLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvc3Bhbj4uIEFueQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9saT4KLQotPC91bD4KLQotICA8cD5JZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtCi1hbW91bnQgb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L3A+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYyBJRDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtCi1JRDwvc3Bhbj4uPC9zcGFuPiBZb3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBib3RoLiBJZiB5b3UgZG8sIHRoZQotUHVibGljIElEIHdpbGwgYmUgdXNlZCBiZWZvcmUgdGhlIFN5c3RlbSBJRC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIGZpbGUgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55Ci1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMsCi1hdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucyB0byB0aGUgWE1MIGZpbGUsIGhvd2V2ZXIsIHRoZXkgbXVzdCBmb2xsb3cKLXRoZSBydWxlcyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIHRoYXQgeW91IHVzZWQgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFdoZW4geW91IGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiB0aXRsZT0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiI+RWRpdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWUxMzYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0Y3JleHhzZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+R2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWE8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0bw0KLXF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTA0KLWZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5DQotYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzDQotYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+Z2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQ0KLWl0IGluIHRoZSBYTUwgZWRpdG9yLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZQ0KLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1nZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgc2NoZW1hIGZpbGUgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayB0aGUgWE1MIHNjaGVtYSBmaWxlIHRoYXQgeW91DQotd2FudCB0byB3b3JrIHdpdGguPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSBpdHMgcG9wLXVwIG1lbnUgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhdGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPlhNTCBGaWxlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IGEgcHJvamVjdCBvciBmb2xkZXIgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUsIHR5cGUgYSBuYW1lDQotZm9yIGl0IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+VGhlIG5hbWUgb2YgdGhlIGZpbGUNCi1tdXN0IGVuZCBpbjxzeXN0ZW1vdXRwdXQ+LnhtbC48L3N5c3RlbW91dHB1dD4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudDwvdWljb250cm9sPiBvZiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPGluZm8+VGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcg0KLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIG9mIHRoZSBnbG9iYWwgZWxlbWVudHMgeW91IGhhdmUgZGVmaW5lZCBpbiB0aGUNCi1YTUwgc2NoZW1hIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFJvb3QgZWxlbWVudCBsaXN0LiBJZiB5b3UgZG8gbm90IGhhdmUgYW55DQotZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC91aWNvbnRyb2w+LiBCb3RoIG1hbmRhdG9yeQ0KLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3VpY29udHJvbD4uIEJvdGggbWFuZGF0b3J5IGFuZA0KLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZTwvdWljb250cm9sPi4gVGhlDQotZmlyc3Qgb3B0aW9uIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPkZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCBkYXRhPC91aWNvbnRyb2w+LiBBbnkNCi1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YS48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPGluZm8+SWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQNCi1vZiBjb250ZW50IHJlcXVpcmVkIGZvciB0aGUgWE1MIGZpbGUgd2lsbCBiZSBjcmVhdGVkLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgTmFtZXNwYWNlIGluZm9ybWF0aW9uIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlDQotdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgWE1MIHNjaGVtYSwgaXRzIHByZWZpeCwgYW5kIHRoZSBzY2hlbWEgbG9jYXRpb24uPC9jbWQ+DQotPGluZm8+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIHByZWZpeGVzLCByZWZlcg0KLXRvIHRoZSByZWxhdGVkIHJlZmVyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lc3BhY2UgTmFtZTwvdWljb250cm9sPiBmaWVsZCBpcw0KLXRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLjwvY21kPjxpbmZvPllvdXIgWE1MIGZpbGUgc2hvdWxkIGJlDQotYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQNCi13aXRoIHRoZSBuYW1lc3BhY2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoZSA8dWljb250cm9sPlByZWZpeDwvdWljb250cm9sPiB2YWx1ZS48L2NtZD48P1B1YiBDYXJldDE/Pg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSAgPHVpY29udHJvbD5Mb2NhdGlvbiBIaW50PC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbg0KLW9mIHRoZSBYTUwgc2NoZW1hLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4sIHRoZW4gPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgWE1MIGZpbGUgd2lsbCBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgYW5kIGFueSBlbGVtZW50cw0KLW9yIGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoZSByb290IGVsZW1lbnQuIEl0IGFsc28gY29udGFpbnMgaW5mb3JtYXRpb24NCi1hYm91dCB0aGUgWE1MIGZpbGUgbmFtZXNwYWNlIGFuZCBsb2NhdGlvbi4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzDQotdG8gdGhlIFhNTCBmaWxlLjwvcD48cD48Yj5Ob3RlOjwvYj4gSW4gY2VydGFpbiBjYXNlcywgd2hlbiBhbiBYTUwgZmlsZSBpcw0KLWdlbmVyYXRlZCBmcm9tIGEgY29tcGxleCBYTUwgc2NoZW1hIGZpbGUsIHRoZSBYTUwgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQuDQotSWYgdGhpcyBvY2N1cnMsIHlvdSBjYW4gb3BlbiB0aGUgZ2VuZXJhdGVkIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IgYW5kIGNvcnJlY3QNCi1hbnkgZXJyb3JzIHRoYXQgb2NjdXIuIFVzdWFsbHksIG9ubHkgYSBmZXcgZXJyb3JzIG5lZWQgdG8gYmUgZml4ZWQuIFRoZSBmb2xsb3dpbmcNCi1YTUwgc2NoZW1hIGNvbnN0cnVjdHMgbWlnaHQgcHJlc2VudCBwcm9ibGVtczo8L3A+PG9sPg0KLTxsaT5SZXN0cmljdGlvbnMuIFNvbWV0aW1lcyByZXN0cmljdGVkIGVsZW1lbnRzIGFyZSBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuIDwvbGk+DQotPGxpPkZhY2V0czogRGVmYXVsdCBnZW5lcmF0ZWQgZGF0YSB2YWx1ZXMgbWlnaHQgbm90IGNvbmZvcm0gdG8gY29tcGxleCBmYWNldHMNCi0oZm9yIGV4YW1wbGUsIHBhdHRlcm5zKS48L2xpPg0KLTxsaT5BYnN0cmFjdCBlbGVtZW50cy4gYWJzdHJhY3QgZWxlbWVudHMgYXJlIHNvbWV0aW1lcyBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuPC9saT4NCi08L29sPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA0NzU3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGE5ZmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjcmV4eHNkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWE8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4eHNkIj48YSBuYW1lPSJ0Y3JleHhzZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0bwotcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQotYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzCi1hbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIHNjaGVtYSBmaWxlIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3UKLXdhbnQgdG8gd29yayB3aXRoLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gaXRzIHBvcC11cCBtZW51IGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhdGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlLCB0eXBlIGEgbmFtZQotZm9yIGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+IFRoZSBuYW1lIG9mIHRoZSBmaWxlCi1tdXN0IGVuZCBpbjx0dCBjbGFzcz0ic3lzb3V0Ij4ueG1sLjwvdHQ+IDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJvb3QgZWxlbWVudDwvc3Bhbj4gb2YgdGhlIFhNTCBmaWxlLjwvc3Bhbj4KLSBUaGUgcm9vdCBlbGVtZW50IG9mIGFuIFhNTCBmaWxlIGlzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIG90aGVyCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBvZiB0aGUgZ2xvYmFsIGVsZW1lbnRzIHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlCi1YTUwgc2NoZW1hIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFJvb3QgZWxlbWVudCBsaXN0LiBJZiB5b3UgZG8gbm90IGhhdmUgYW55Ci1nbG9iYWwgZWxlbWVudHMgaW4geW91ciBYTUwgc2NoZW1hLCB5b3UgY2Fubm90IGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGl0LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb3B0aW9uczo8L3NwYW4+Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGF0dHJpYnV0ZXM8L3NwYW4+LiBCb3RoIG1hbmRhdG9yeQotYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBlbGVtZW50czwvc3Bhbj4uIEJvdGggbWFuZGF0b3J5IGFuZAotb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBmaXJzdCBjaG9pY2Ugb2YgcmVxdWlyZWQgY2hvaWNlPC9zcGFuPi4gVGhlCi1maXJzdCBvcHRpb24gb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3aXRoIGRhdGE8L3NwYW4+LiBBbnkKLWVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLjwvbGk+Ci0KLTwvdWw+Ci0KLSBJZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtIGFtb3VudAotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSBOYW1lc3BhY2UgaW5mb3JtYXRpb24gc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLXRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEsIGl0cyBwcmVmaXgsIGFuZCB0aGUgc2NoZW1hIGxvY2F0aW9uLjwvc3Bhbj4KLSBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzIGFuZCBuYW1lc3BhY2UgcHJlZml4ZXMsIHJlZmVyCi10byB0aGUgcmVsYXRlZCByZWZlcmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IGZpZWxkIGlzCi10aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgWE1MIHNjaGVtYS48L3NwYW4+IFlvdXIgWE1MIGZpbGUgc2hvdWxkIGJlCi1hc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlIGFzIGl0cyBYTUwgc2NoZW1hIGlzIGFzc29jaWF0ZWQgd2l0aC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZAotd2l0aCB0aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiB2YWx1ZS48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb24gSGludDwvc3Bhbj4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi1vZiB0aGUgWE1MIHNjaGVtYS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4sIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIGZpbGUgd2lsbCBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgYW5kIGFueSBlbGVtZW50cwotb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gSXQgYWxzbyBjb250YWlucyBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIFhNTCBmaWxlIG5hbWVzcGFjZSBhbmQgbG9jYXRpb24uIFlvdSBjYW4gbm93IGFkZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcwotdG8gdGhlIFhNTCBmaWxlLjwvcD4KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSW4gY2VydGFpbiBjYXNlcywgd2hlbiBhbiBYTUwgZmlsZSBpcwotZ2VuZXJhdGVkIGZyb20gYSBjb21wbGV4IFhNTCBzY2hlbWEgZmlsZSwgdGhlIFhNTCBmaWxlIG1pZ2h0IG5vdCBiZSB2YWxpZC4KLUlmIHRoaXMgb2NjdXJzLCB5b3UgY2FuIG9wZW4gdGhlIGdlbmVyYXRlZCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIGFuZCBjb3JyZWN0Ci1hbnkgZXJyb3JzIHRoYXQgb2NjdXIuIFVzdWFsbHksIG9ubHkgYSBmZXcgZXJyb3JzIG5lZWQgdG8gYmUgZml4ZWQuIFRoZSBmb2xsb3dpbmcKLVhNTCBzY2hlbWEgY29uc3RydWN0cyBtaWdodCBwcmVzZW50IHByb2JsZW1zOjwvcD4KLTxvbD4KLTxsaT5SZXN0cmljdGlvbnMuIFNvbWV0aW1lcyByZXN0cmljdGVkIGVsZW1lbnRzIGFyZSBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuIDwvbGk+Ci0KLTxsaT5GYWNldHM6IERlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzCi0oZm9yIGV4YW1wbGUsIHBhdHRlcm5zKS48L2xpPgotCi08bGk+QWJzdHJhY3QgZWxlbWVudHMuIGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+Ci0KLTwvb2w+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFdoZW4geW91IGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiB0aXRsZT0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiI+RWRpdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGRlMGM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdGNuc3QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZg0KLWNvbnN0cmFpbnRzICh0aGF0IGlzLCBhIHNldCBvZiBydWxlcykgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UNCi1jYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91DQotZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPndpdGggRFREIG9yIFhNTA0KLXNjaGVtYSBjb25zdHJhaW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIGZpbGVzPD9QdWIgQ2FyZXQ/PjxpbmRleHRlcm0+ZWRpdGluZzxpbmRleHRlcm0+d2l0aA0KLURURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gV2hlbiB0aGUgY29uc3RyYWludHMgYXJlIHR1cm5lZCBvbiwgYW5kIHlvdSBhcmUgd29ya2luZyBpbiB0aGUNCi1EZXNpZ24gdmlldywgdGhlIFhNTCBlZGl0b3IgcHJldmVudHMgeW91IGZyb20gaW5zZXJ0aW5nIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLA0KLW9yIGF0dHJpYnV0ZSB2YWx1ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgcnVsZXMgb2YgdGhlIFhNTCBzY2hlbWEgb3IgRFRELCBhbmQNCi1mcm9tIHJlbW92aW5nIG5lY2Vzc2FyeSBvciBwcmVkZWZpbmVkIHNldHMgb2YgdGFncyBhbmQgdmFsdWVzLiBJbiB0aGlzIG1vZGUsDQotYW4gZWxlbWVudCdzIGNvbnRlbnQgbXVzdCBiZSB2YWxpZCB0byB1c2UgdGhlIFhNTCBlZGl0b3IncyBndWlkZWQgZWRpdGluZw0KLW9wdGlvbnMuPC9wPjxwPllvdSBtaWdodCB3YW50IHRvIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9mZiBmb3IgYW4gWE1MIGZpbGUNCi1pZiB5b3UgbmVlZCBtb3JlIGZsZXhpYmlsaXR5LiBGb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gdHJ5IHdvcmtpbmcgd2l0aCBlbGVtZW50cw0KLW9yIGF0dHJpYnV0ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgYXNzb2NpYXRlZCBEVEQgb3IgWE1MIHNjaGVtYSwgd2l0aG91dCBhY3R1YWxseQ0KLXJlbW92aW5nIHRoZSBhc3NvY2lhdGlvbiB3aXRoIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS48L3A+PHA+VG8gdHVybiB0aGUgY29uc3RyYWludHMNCi1mb3IgYW4gWE1MIGZpbGUgb2ZmLCBjbGljayA8dWljb250cm9sPlhNTCA+IFR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPZmY8L3VpY29udHJvbD4uDQotQWZ0ZXIgeW91IGhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlDQotYW55IGVsZW1lbnQgb3IgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIHJ1bGVzLiBZb3UgY2FuDQotY3JlYXRlIG5ldyBlbGVtZW50cyBvciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgRFREIG9yIHNjaGVtYSAtIHRoZXNlDQotRGVzaWduIHZpZXcgcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4NCi1UaGUgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQsIGhvd2V2ZXIsIGlmIHlvdSBkbyB0aGlzLiA8L3A+PHA+VGhlIGZvbGxvd2luZw0KLWluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvDQotd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHdoYXQgeW91DQotY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciAocmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPikuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBoYXZlIGEgRFREIHRoYXQgc3BlY2lmaWVzIHRoYXQgYW4gZWxlbWVudCByZXF1aXJlcyBhdCBsZWFzdA0KLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L2NtZD48aW5mbz48Y29kZWJsb2NrPiZsdDshRUxFTUVOVCBwYXJlbnRFbGVtZW50IChjaGlsZEVsZW1lbnQrKT4NCi08L2NvZGVibG9jaz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYsIGluIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgeW91IGF0dGVtcHQgdG8gcmVtb3ZlDQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwNCi10aGUgZWRpdG9yIHdpbGwgbm90IGFsbG93IHlvdSB0byBkbyB0aGlzLCBhcyBpdCB3aWxsIG1ha2UgdGhlIGRvY3VtZW50IGludmFsaWQuPC9jbWQ+DQotPGluZm8+WW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdA0KLXRoZSA8dWljb250cm9sPlJlbW92ZTwvdWljb250cm9sPiBvcHRpb24gaXMgZ3JheWVkIG91dC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gdHVybiB0aGUgRFREIGNvbnN0cmFpbnRzIG9mZiwgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBUdXJuIEdyYW1tYXINCi1Db25zdHJhaW50cyBPZmY8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMNCi1vZmYsIHRoZSBlZGl0b3Igd2lsbCBhbGxvdyB5b3UgdG8uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gY29ycmVjdCB0aGUgaW52YWxpZCBkb2N1bWVudCwgeW91IHdpbGwgaGF2ZSB0byByZS1hZGQgdGhlIG5lY2Vzc2FyeQ0KLWVsZW1lbnQsIG9yIHJlbW92ZSB0aGUgaW52YWxpZCB0YWdnaW5nIG9yIHZhbHVlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+SWYgeW91IGludHJvZHVjZSBlcnJvcnMgaW50byB5b3VyIGZpbGVzLCB5b3UgbXVzdCBzYXZlIGFuZCB2YWxpZGF0ZQ0KLXRoZSBmaWxlIGluIG9yZGVyIHRvIHNlZSBhIGxpc3Qgb2YgdGhlIGVycm9ycyB5b3UgaGF2ZSBpbnRyb2R1Y2VkLiBUaGV5IHdpbGwNCi1iZSBsaXN0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIEFmdGVyIHlvdSBmaXggdGhlIGVycm9ycywgeW91IG11c3Qgc2F2ZSBhbmQNCi12YWxpZGF0ZSB5b3VyIGZpbGUgYWdhaW4gdG8gc2VlIGlmIHRoZSBmaWxlIGlzIG5vdyB2YWxpZC48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzg1ND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhhY2Q3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzICh0aGF0IGlzLCBhIHNldCBvZiBydWxlcykgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyAodGhhdCBpcywgYSBzZXQgb2YgcnVsZXMpIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcsIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMsIFhNTCBmaWxlcywgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcsIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMsIFhNTCBmaWxlcywgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0Y25zdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGNuc3QiPjxhIG5hbWU9InRlZHRjbnN0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZgotY29uc3RyYWludHMgKHRoYXQgaXMsIGEgc2V0IG9mIHJ1bGVzKSBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdQotY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdQotZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFdoZW4gdGhlIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQgb24sIGFuZCB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlCi1EZXNpZ24gdmlldywgdGhlIFhNTCBlZGl0b3IgcHJldmVudHMgeW91IGZyb20gaW5zZXJ0aW5nIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLAotb3IgYXR0cmlidXRlIHZhbHVlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBydWxlcyBvZiB0aGUgWE1MIHNjaGVtYSBvciBEVEQsIGFuZAotZnJvbSByZW1vdmluZyBuZWNlc3Nhcnkgb3IgcHJlZGVmaW5lZCBzZXRzIG9mIHRhZ3MgYW5kIHZhbHVlcy4gSW4gdGhpcyBtb2RlLAotYW4gZWxlbWVudCdzIGNvbnRlbnQgbXVzdCBiZSB2YWxpZCB0byB1c2UgdGhlIFhNTCBlZGl0b3IncyBndWlkZWQgZWRpdGluZwotb3B0aW9ucy48L3A+Ci08cD5Zb3UgbWlnaHQgd2FudCB0byB0dXJuIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGFuIFhNTCBmaWxlCi1pZiB5b3UgbmVlZCBtb3JlIGZsZXhpYmlsaXR5LiBGb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gdHJ5IHdvcmtpbmcgd2l0aCBlbGVtZW50cwotb3IgYXR0cmlidXRlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBhc3NvY2lhdGVkIERURCBvciBYTUwgc2NoZW1hLCB3aXRob3V0IGFjdHVhbGx5Ci1yZW1vdmluZyB0aGUgYXNzb2NpYXRpb24gd2l0aCB0aGUgRFREIG9yIFhNTCBzY2hlbWEuPC9wPgotPHA+VG8gdHVybiB0aGUgY29uc3RyYWludHMKLWZvciBhbiBYTUwgZmlsZSBvZmYsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPZmY8L3NwYW4+LgotQWZ0ZXIgeW91IGhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlCi1hbnkgZWxlbWVudCBvciBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcnVsZXMuIFlvdSBjYW4KLWNyZWF0ZSBuZXcgZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgaW4gdGhlIERURCBvciBzY2hlbWEgLSB0aGVzZQotRGVzaWduIHZpZXcgcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4KLVRoZSBmaWxlIG1pZ2h0IG5vdCBiZSB2YWxpZCwgaG93ZXZlciwgaWYgeW91IGRvIHRoaXMuIDwvcD4KLTxwPlRoZSBmb2xsb3dpbmcKLWluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvCi13b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB3aGF0IHlvdQotY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IgKHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+KS4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgaGF2ZSBhIERURCB0aGF0IHNwZWNpZmllcyB0aGF0IGFuIGVsZW1lbnQgcmVxdWlyZXMgYXQgbGVhc3QKLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L3NwYW4+IDxwcmU+Jmx0OyFFTEVNRU5UIHBhcmVudEVsZW1lbnQgKGNoaWxkRWxlbWVudCspJmd0OwotPC9wcmU+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmLCBpbiBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIHlvdSBhdHRlbXB0IHRvIHJlbW92ZQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwKLXRoZSBlZGl0b3Igd2lsbCBub3QgYWxsb3cgeW91IHRvIGRvIHRoaXMsIGFzIGl0IHdpbGwgbWFrZSB0aGUgZG9jdW1lbnQgaW52YWxpZC48L3NwYW4+Ci0gWW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdAotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbW92ZTwvc3Bhbj4gb3B0aW9uIGlzIGdyYXllZCBvdXQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyB0dXJuIHRoZSBEVEQgY29uc3RyYWludHMgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBUdXJuIEdyYW1tYXIKLUNvbnN0cmFpbnRzIE9mZjwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMKLW9mZiwgdGhlIGVkaXRvciB3aWxsIGFsbG93IHlvdSB0by48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjb3JyZWN0IHRoZSBpbnZhbGlkIGRvY3VtZW50LCB5b3Ugd2lsbCBoYXZlIHRvIHJlLWFkZCB0aGUgbmVjZXNzYXJ5Ci1lbGVtZW50LCBvciByZW1vdmUgdGhlIGludmFsaWQgdGFnZ2luZyBvciB2YWx1ZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SWYgeW91IGludHJvZHVjZSBlcnJvcnMgaW50byB5b3VyIGZpbGVzLCB5b3UgbXVzdCBzYXZlIGFuZCB2YWxpZGF0ZQotdGhlIGZpbGUgaW4gb3JkZXIgdG8gc2VlIGEgbGlzdCBvZiB0aGUgZXJyb3JzIHlvdSBoYXZlIGludHJvZHVjZWQuIFRoZXkgd2lsbAotYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0IHNhdmUgYW5kCi12YWxpZGF0ZSB5b3VyIGZpbGUgYWdhaW4gdG8gc2VlIGlmIHRoZSBmaWxlIGlzIG5vdyB2YWxpZC48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzVjMmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRkb2MiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nDQotb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbg0KLXRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+ZWRpdGluZzxpbmRleHRlcm0+RE9DVFlQRSBkZWNsYXJhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZWRpdCB5b3VyIERPQ1RZUEUNCi1kZWNsYXJhdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayA8dWljb250cm9sPkRPQ1RZUEU8L3VpY29udHJvbD4gYW5kDQotY2xpY2sgPHVpY29udHJvbD5FZGl0IERPQ1RZUEU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudCBuYW1lPC91aWNvbnRyb2w+IGZpZWxkDQotc2hvdWxkIG1hdGNoIHRoZSByb290IGVsZW1lbnQgb2YgeW91ciBYTUwgZmlsZSBleGFjdGx5LjwvY21kPjxpbmZvPllvdSBzaG91bGQNCi1vbmx5IGVkaXQgdGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaWYgeW91ciByb290IGVsZW1lbnQgY2hhbmdlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBzZWxlY3QgYSBQdWJsaWMgSUQgZm9yIGFueSBleGlzdGluZyBYTUwgQ2F0YWxvZyBlbnRyaWVzDQotYnkgY2xpY2tpbmcgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4uIDwvY21kPjxpbmZvPlRoZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5QdWJsaWMNCi1JRDwvdWljb250cm9sPiBmaWVsZCBpcyB0aGUgUHVibGljIElkZW50aWZpZXIuIEl0IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZQ0KLVhNTCBmaWxlICh1c2luZyBhbiBYTUwgQ2F0YWxvZyBlbnRyeSkgd2l0aCBhIERURCBmaWxlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbg0KLW9uIFhNTCBDYXRhbG9nIGVudHJpZXMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+U3lzdGVtIElEPC91aWNvbnRyb2w+IGZpZWxkIGlzIHRoZQ0KLURURCB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBUeXBlIHRoZSBwYXRoIG9mIHRoZSBEVEQgZmlsZSAob3IgYnJvd3NlDQotZm9yIGl0KSB5b3Ugd2FudCB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGluIHRoaXMgZmllbGQuIDwvY21kPjxpbmZvPiAgPGI+Tm90ZTwvYj46DQotV2hlbiB0aGUgWE1MIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yLCBpdCB3aWxsIGZpcnN0IHRyeSB0bw0KLXVzZSB0aGUgUHVibGljIElEIHRvIGxvY2F0ZSB0aGUgRFRELCBhbmQgaWYgdGhpcyBmYWlscywgaXQgd2lsbCB1c2UgdGhlIFN5c3RlbQ0KLUlEIHRvIGZpbmQgaXQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPklmIHlvdSBkbyBub3QgaGF2ZSBhIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4geW91ciBYTUwgZmlsZSwgeW91IGNhbg0KLXJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRFREIEluZm9ybWF0aW9uPC91aWNvbnRyb2w+IHRvDQotYWRkIG9uZS48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4NzdhMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBET0NUWVBFIGRlY2xhcmF0aW9ucywgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZywgRE9DVFlQRSBkZWNsYXJhdGlvbnMsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGRvYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRkb2MiPjxhIG5hbWU9InRlZHRkb2MiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZwotb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbgotdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gZWRpdCB5b3VyIERPQ1RZUEUKLWRlY2xhcmF0aW9uLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5ET0NUWVBFPC9zcGFuPiBhbmQKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQgRE9DVFlQRTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQgbmFtZTwvc3Bhbj4gZmllbGQKLXNob3VsZCBtYXRjaCB0aGUgcm9vdCBlbGVtZW50IG9mIHlvdXIgWE1MIGZpbGUgZXhhY3RseS48L3NwYW4+IFlvdSBzaG91bGQKLW9ubHkgZWRpdCB0aGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpZiB5b3VyIHJvb3QgZWxlbWVudCBjaGFuZ2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBzZWxlY3QgYSBQdWJsaWMgSUQgZm9yIGFueSBleGlzdGluZyBYTUwgQ2F0YWxvZyBlbnRyaWVzCi1ieSBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+LiA8L3NwYW4+IFRoZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljCi1JRDwvc3Bhbj4gZmllbGQgaXMgdGhlIFB1YmxpYyBJZGVudGlmaWVyLiBJdCBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUKLVhNTCBmaWxlICh1c2luZyBhbiBYTUwgQ2F0YWxvZyBlbnRyeSkgd2l0aCBhIERURCBmaWxlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gWE1MIENhdGFsb2cgZW50cmllcywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbSBJRDwvc3Bhbj4gZmllbGQgaXMgdGhlCi1EVEQgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gVHlwZSB0aGUgcGF0aCBvZiB0aGUgRFREIGZpbGUgKG9yIGJyb3dzZQotZm9yIGl0KSB5b3Ugd2FudCB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGluIHRoaXMgZmllbGQuIDwvc3Bhbj4gICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46Ci1XaGVuIHRoZSBYTUwgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIFhNTCBwcm9jZXNzb3IsIGl0IHdpbGwgZmlyc3QgdHJ5IHRvCi11c2UgdGhlIFB1YmxpYyBJRCB0byBsb2NhdGUgdGhlIERURCwgYW5kIGlmIHRoaXMgZmFpbHMsIGl0IHdpbGwgdXNlIHRoZSBTeXN0ZW0KLUlEIHRvIGZpbmQgaXQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JZiB5b3UgZG8gbm90IGhhdmUgYSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4KLXJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIERURCBJbmZvcm1hdGlvbjwvc3Bhbj4gdG8KLWFkZCBvbmUuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgdGl0bGU9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyAodGhhdCBpcywgYSBzZXQgb2YgcnVsZXMpIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiB0aXRsZT0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleSI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgdGl0bGU9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4Yzk4Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdGVuYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcNCi10aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+c3BlY2lmeWluZyA8aW5kZXh0ZXJtPmxpbmUgZGVsaW1pdGVyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5zcGVjaWZ5aW5nIDxpbmRleHRlcm0+ZW5jb2Rpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIHlvdSB3YW50IHRvIHVzZTo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5MaW5lIGRlbGltaXRlcjwvdWljb250cm9sPiBsaXN0LCBzZWxlY3QgdGhlIG9wZXJhdGluZw0KLXN5c3RlbSB0aGF0IGFwcGxpZXMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtLiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPkVuY29kaW5nPC91aWNvbnRyb2w+PD9QdWIgQ2FyZXQ/PiBmaWVsZCwgc3BlY2lmeQ0KLXRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQNCi1maWxlcyAoRFREcywgWE1MIGZpbGVzLCBYTUwgc2NoZW1hcykuIENoYW5naW5nIHRoZSBlbmNvZGluZyBjYXVzZXMgYW55IG5ldywNCi1YTUwgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+LCB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTY5OD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwY2ZkNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgc3BlY2lmeWluZywgbGluZSBkZWxpbWl0ZXJzLCBlbmNvZGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgc3BlY2lmeWluZywgbGluZSBkZWxpbWl0ZXJzLCBlbmNvZGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGVuYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0ZW5jIj48YSBuYW1lPSJ0ZWR0ZW5jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVyczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZwotdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIHlvdSB3YW50IHRvIHVzZTo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5MaW5lIGRlbGltaXRlcjwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBvcGVyYXRpbmcKLXN5c3RlbSB0aGF0IGFwcGxpZXMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtLiA8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY29kaW5nPC9zcGFuPiBmaWVsZCwgc3BlY2lmeQotdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBYTUwgcmVsYXRlZAotZmlsZXMgKERURHMsIFhNTCBmaWxlcywgWE1MIHNjaGVtYXMpLiBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcsCi1YTUwgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+LCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVkYWMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdGdyYW0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGgNCi1hbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIDx1aWNvbnRyb2w+WE1MID4gUmVsb2FkIERlcGVuZGVuY2llczwvdWljb250cm9sPiB0bw0KLXVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiA8P1B1YiBDYXJldD8+dGhlDQotZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT51cGRhdGluZzxpbmRleHRlcm0+WE1MIGZpbGVzIHdpdGgNCi1hc3NvY2lhdGVkIGNoYW5nZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+dXBkYXRpbmcNCi13aXRoIGFzc29jaWF0ZWQgY2hhbmdlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+Rm9yIGV4YW1wbGUsIHlvdSBoYXZlIGEgRFREIGZpbGUgY2FsbGVkICJDb250YWN0LmR0ZCIgYW5kIGFuIFhNTA0KLWZpbGUgY2FsbGVkICJDb250YWN0LnhtbCIgYXNzb2NpYXRlZCB3aXRoIGl0LiBDb250YWN0LmR0ZCBjb250YWlucyBhIHJvb3QNCi1lbGVtZW50IGNhbGxlZCAgPHVpY29udHJvbD5Db250YWN0PC91aWNvbnRyb2w+IHRoYXQgY2FuIGNvbnRhaW4gYW55IG9mIHRoZQ0KLWZvbGxvd2luZyBjaGlsZHJlbiBlbGVtZW50czogIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiwgIDx1aWNvbnRyb2w+UG9zdGFsQWRkcmVzczwvdWljb250cm9sPiwNCi0gPHVpY29udHJvbD5FbWFpbDwvdWljb250cm9sPi4gSWYgeW91IHJlbW92ZSB0aGUgY2hpbGQgZWxlbWVudCAgPHVpY29udHJvbD5FbWFpbDwvdWljb250cm9sPiBmcm9tDQotdGhlIERURCwgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWRkIGFuICA8dWljb250cm9sPkVtYWlsPC91aWNvbnRyb2w+IGNoaWxkDQotZWxlbWVudCB0byB5b3VyIHJvb3QgZWxlbWVudCBDb250YWN0IGluIHlvdXIgQ29udGFjdC54bWwgZmlsZS4gVGhpcyBjaGFuZ2UsDQotaG93ZXZlciwgd2lsbCBub3QgY29tZSBpbnRvIGVmZmVjdCB1bnRpbCB5b3Ugc2F2ZSB5b3VyIGNoYW5nZXMgaW4gdGhlIERURA0KLWFuZCBjbGljayA8dWljb250cm9sPlhNTCA+IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gaW4gdGhlIFhNTCBlZGl0b3IuDQotVW50aWwgeW91IGNsaWNrIGl0LCB5b3Ugd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGFkZCA8dWljb250cm9sPkVtYWlsPC91aWNvbnRyb2w+IGVsZW1lbnRzDQotdG8gQ29udGFjdC54bWwuPC9wPjxwPlRoaXMgZmVhdHVyZSBpcyB2ZXJ5IGhhbmR5IHdoZW4geW91IGFyZSBtYWtpbmcgdXBkYXRlcw0KLXRvIGJvdGggRFREcyBhbmQgWE1MIHNjaGVtYXMgYW5kIFhNTCBmaWxlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggRFREcyBhbmQNCi1YTUwgc2NoZW1hcy48L3A+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMDQwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYWJhMWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHVwZGF0aW5nLCBYTUwgZmlsZXMgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMsIFhNTCBmaWxlcywgdXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCB1cGRhdGluZywgWE1MIGZpbGVzIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzLCBYTUwgZmlsZXMsIHVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRncmFtIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRncmFtIj48YSBuYW1lPSJ0ZWR0Z3JhbSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aAotYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzPC9zcGFuPiB0bwotdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZQotZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlLCB5b3UgaGF2ZSBhIERURCBmaWxlIGNhbGxlZCAiQ29udGFjdC5kdGQiIGFuZCBhbiBYTUwKLWZpbGUgY2FsbGVkICJDb250YWN0LnhtbCIgYXNzb2NpYXRlZCB3aXRoIGl0LiBDb250YWN0LmR0ZCBjb250YWlucyBhIHJvb3QKLWVsZW1lbnQgY2FsbGVkICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250YWN0PC9zcGFuPiB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUKLWZvbGxvd2luZyBjaGlsZHJlbiBlbGVtZW50czogIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+LCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UG9zdGFsQWRkcmVzczwvc3Bhbj4sCi0gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW1haWw8L3NwYW4+LiBJZiB5b3UgcmVtb3ZlIHRoZSBjaGlsZCBlbGVtZW50ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbWFpbDwvc3Bhbj4gZnJvbQotdGhlIERURCwgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWRkIGFuICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbWFpbDwvc3Bhbj4gY2hpbGQKLWVsZW1lbnQgdG8geW91ciByb290IGVsZW1lbnQgQ29udGFjdCBpbiB5b3VyIENvbnRhY3QueG1sIGZpbGUuIFRoaXMgY2hhbmdlLAotaG93ZXZlciwgd2lsbCBub3QgY29tZSBpbnRvIGVmZmVjdCB1bnRpbCB5b3Ugc2F2ZSB5b3VyIGNoYW5nZXMgaW4gdGhlIERURAotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3NwYW4+IGluIHRoZSBYTUwgZWRpdG9yLgotVW50aWwgeW91IGNsaWNrIGl0LCB5b3Ugd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGFkZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbWFpbDwvc3Bhbj4gZWxlbWVudHMKLXRvIENvbnRhY3QueG1sLjwvcD4KLTxwPlRoaXMgZmVhdHVyZSBpcyB2ZXJ5IGhhbmR5IHdoZW4geW91IGFyZSBtYWtpbmcgdXBkYXRlcwotdG8gYm90aCBEVERzIGFuZCBYTUwgc2NoZW1hcyBhbmQgWE1MIGZpbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBEVERzIGFuZAotWE1MIHNjaGVtYXMuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgdGl0bGU9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyAodGhhdCBpcywgYSBzZXQgb2YgcnVsZXMpIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5Ij5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIHRpdGxlPSJZb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLiI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI2NWZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdHByb2MiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gcGFzcyBhbG9uZyB0byBhbiBhcHBsaWNhdGlvbg0KLXVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8aW5kZXh0ZXJtPmVkaXRpbmcgPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZWRpdCBhIHByb2Nlc3NpbmcNCi1pbnN0cnVjdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayB5b3VyIHByb2Nlc3NpbmcNCi1pbnN0cnVjdGlvbiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSA8dWljb250cm9sPlRhcmdldDwvdWljb250cm9sPiBmaWVsZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZQ0KLWFwcGxpY2F0aW9uIHRoZSBpbnN0cnVjdGlvbnMgYmVsb25ncyB0by48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5EYXRhPC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5UbyBjcmVhdGUgYSBuZXcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgcmlnaHQtY2xpY2sgaW4gdGhlIERlc2lnbg0KLXZpZXcsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiwgPHVpY29udHJvbD5BZGQgQmVmb3JlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+QWRkDQotQWZ0ZXI8L3VpY29udHJvbD4sIHRoZW4gY2xpY2sgPHVpY29udHJvbD5BZGQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvdWljb250cm9sPi48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDA1MzRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBwYXNzIGFsb25nIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gcGFzcyBhbG9uZyB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgZWRpdGluZywgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZywgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGVkaXRpbmcsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRwcm9jIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRwcm9jIj48YSBuYW1lPSJ0ZWR0cHJvYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBwYXNzIGFsb25nIHRvIGFuIGFwcGxpY2F0aW9uCi11c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGVkaXQgYSBwcm9jZXNzaW5nCi1pbnN0cnVjdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayB5b3VyIHByb2Nlc3NpbmcKLWluc3RydWN0aW9uLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldDwvc3Bhbj4gZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUKLWFwcGxpY2F0aW9uIHRoZSBpbnN0cnVjdGlvbnMgYmVsb25ncyB0by48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EYXRhPC9zcGFuPiBmaWVsZCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIG5ldyBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCByaWdodC1jbGljayBpbiB0aGUgRGVzaWduCi12aWV3LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIENoaWxkPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEJlZm9yZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1BZnRlcjwvc3Bhbj4sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3NwYW4+LjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2guZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlMmJmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2guZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdHNjaCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uDQotYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZA0KLXdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzDQotYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdA0KLXdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5uYW1lc3BhY2UgaW5mb3JtYXRpb248L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPm5hbWVzcGFjZSBpbmZvcm1hdGlvbjxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5uYW1lc3BhY2UgaW5mb3JtYXRpb248L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+bmFtZXNwYWNlIGluZm9ybWF0aW9uPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZWRpdCB5b3VyIHNjaGVtYQ0KLWluZm9ybWF0aW9uLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIHlvdXIgcm9vdCBlbGVtZW50DQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdCBOYW1lc3BhY2VzPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdXIgWE1MIGZpbGUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBvcg0KLXNjaGVtYS48L2NtZD48aW5mbz5TZWxlY3QgdGhlIGVudHJ5IHlvdSB3YW50IHRvIGVkaXQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk5hbWVzcGFjZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkIGlzDQotYSBuYW1lc3BhY2UgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L2NtZD48aW5mbz5Zb3VyIFhNTCBmaWxlIHNob3VsZA0KLWJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UocykgaXRzIFhNTCBzY2hlbWEgaXMgYXNzb2NpYXRlZCB3aXRoLg0KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZXMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHJlZmVyZW5jZS48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZA0KLXdpdGggdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IHZhbHVlLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSA8dWljb250cm9sPkxvY2F0aW9uIEhpbnQ8L3VpY29udHJvbD4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uDQotb2YgdGhlIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L2NtZD48aW5mbz5BbiBYTUwgQ2F0YWxvZw0KLUtleSBvciBhIG5hbWVzcGFjZSBuYW1lIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZC4gQ2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gdG8NCi12aWV3IGFsbCBYTUwgc2NoZW1hcyBpbiB0aGUgd29ya2JlbmNoIGFuZCBYTUwgQ2F0YWxvZy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiwgdGhlbiBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IGFnYWluLjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uLCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiBpbnN0ZWFkDQotb2YgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LiBZb3UgY2FuIHRoZW4gZWl0aGVyIGNsaWNrIHRoZSA8dWljb250cm9sPlNwZWNpZnkNCi1Gcm9tIFJlZ2lzdGVyZWQgTmFtZXNwYWNlPC91aWNvbnRyb2w+IHJhZGlvIGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSBuYW1lc3BhY2UNCi1kZWNsYXJhdGlvbnMgeW91IHdhbnQgdG8gYWRkIG9yIGNsaWNrIHRoZSA8dWljb250cm9sPlNwZWNpZnkgTmV3IE5hbWVzcGFjZTwvdWljb250cm9sPiByYWRpbw0KLWJ1dHRvbiBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIGFzIG5lY2Vzc2FyeS48L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+SWYgeW91IGRvIG5vdCBoYXZlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpbiB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuDQotcmlnaHQtY2xpY2sgeW91ciByb290IGVsZW1lbnQgaW4gdGhlIERlc2lnbiB2aWV3IGFuZCBjbGljayA8dWljb250cm9sPkVkaXQNCi1OYW1lc3BhY2VzPC91aWNvbnRyb2w+IHRvIGFkZCBpdC4gSWYgeW91IGRvIG5vdCBoYXZlIGEgcm9vdCBlbGVtZW50LCB5b3UgbXVzdA0KLWNyZWF0ZSBvbmUgYmVmb3JlIHlvdSBjYW4gYWRkIHRoZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24uPC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjkzODEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBuYW1lc3BhY2UgaW5mb3JtYXRpb24sIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcsIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiwgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdHNjaCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0c2NoIj48YSBuYW1lPSJ0ZWR0c2NoIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQKLXdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzCi1hc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0Ci13aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGVkaXQgeW91ciBzY2hlbWEKLWluZm9ybWF0aW9uLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayB5b3VyIHJvb3QgZWxlbWVudAotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQgTmFtZXNwYWNlczwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91ciBYTUwgZmlsZSBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIG9yCi1zY2hlbWEuPC9zcGFuPiBTZWxlY3QgdGhlIGVudHJ5IHlvdSB3YW50IHRvIGVkaXQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZSBOYW1lPC9zcGFuPiBmaWVsZCBpcwotYSBuYW1lc3BhY2UgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L3NwYW4+IFlvdXIgWE1MIGZpbGUgc2hvdWxkCi1iZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlKHMpIGl0cyBYTUwgc2NoZW1hIGlzIGFzc29jaWF0ZWQgd2l0aC4KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZXMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHJlZmVyZW5jZS4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZAotd2l0aCB0aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiB2YWx1ZS48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Mb2NhdGlvbiBIaW50PC9zcGFuPiBmaWVsZCBjb250YWlucyB0aGUgbG9jYXRpb24KLW9mIHRoZSBYTUwgc2NoZW1hIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9zcGFuPiBBbiBYTUwgQ2F0YWxvZwotS2V5IG9yIGEgbmFtZXNwYWNlIG5hbWUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkLiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IHRvCi12aWV3IGFsbCBYTUwgc2NoZW1hcyBpbiB0aGUgd29ya2JlbmNoIGFuZCBYTUwgQ2F0YWxvZy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gYWdhaW4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IGluc3RlYWQKLW9mIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+LiBZb3UgY2FuIHRoZW4gZWl0aGVyIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVjaWZ5Ci1Gcm9tIFJlZ2lzdGVyZWQgTmFtZXNwYWNlPC9zcGFuPiByYWRpbyBidXR0b24gYW5kIHNlbGVjdCB0aGUgbmFtZXNwYWNlCi1kZWNsYXJhdGlvbnMgeW91IHdhbnQgdG8gYWRkIG9yIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVjaWZ5IE5ldyBOYW1lc3BhY2U8L3NwYW4+IHJhZGlvCi1idXR0b24gYW5kIGZpbGwgaW4gdGhlIGZpZWxkcyBhcyBuZWNlc3NhcnkuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPklmIHlvdSBkbyBub3QgaGF2ZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaW4geW91ciBYTUwgZmlsZSwgeW91IGNhbgotcmlnaHQtY2xpY2sgeW91ciByb290IGVsZW1lbnQgaW4gdGhlIERlc2lnbiB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0Ci1OYW1lc3BhY2VzPC9zcGFuPiB0byBhZGQgaXQuIElmIHlvdSBkbyBub3QgaGF2ZSBhIHJvb3QgZWxlbWVudCwgeW91IG11c3QKLWNyZWF0ZSBvbmUgYmVmb3JlIHlvdSBjYW4gYWRkIHRoZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24uPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgdGl0bGU9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyAodGhhdCBpcywgYSBzZXQgb2YgcnVsZXMpIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiB0aXRsZT0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleSI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgdGl0bGU9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3BlY3htbGVuYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3BlY3htbGVuYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzk3MTNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHNwZWN4bWxlbmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0ic3BlY2lmeWluZ3htbGVuY29kaW5nIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TcGVjaWZ5aW5nIFhNTCBlbmNvZGluZzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+U3BlY2lmeWluZyBYTUwgZW5jb2Rpbmc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdA0KLWlzIHVzZWQgZm9yIHlvdXIgWE1MIHJlbGF0ZWQgZG9jdW1lbnRzIChEVERzLCBYTUwgZmlsZXMsIGFuZCBYTUwgc2NoZW1hcykuDQotIENoYW5naW5nIHRoaXMgYXR0cmlidXRlIGNhdXNlcyBhbnkgbmV3IFhNTCwgRFREIG9yIFhNTCBzY2hlbWEgdGhhdCBpcyBjcmVhdGVkDQotd2l0aCBhIGNvcnJlc3BvbmRpbmcgIk5ldy4uLiIgd2l6YXJkIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5zcGVjaWZ5aW5nIDxpbmRleHRlcm0+ZW5jb2Rpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpPGluZGV4dGVybT5zcGVjaWZ5aW5nIDxpbmRleHRlcm0+ZW5jb2Rpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWFzPGluZGV4dGVybT5zcGVjaWZ5aW5nIDxpbmRleHRlcm0+ZW5jb2Rpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBkZWZhdWx0IFhNTCBlbmNvZGluZyB2YWx1ZSBpcyBVVEYtOC48L3A+PHA+VG8gY2hhbmdlIHRoZSBYTUwNCi1lbmNvZGluZyB2YWx1ZSwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUwgZmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBGaWxlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gdGhlIDx1aWNvbnRyb2w+RW5jb2Rpbmc8L3VpY29udHJvbD4gZmllbGQsIHNlbGVjdCB0aGUgdHlwZQ0KLW9mIGVuY29kaW5nIHlvdSB3b3VsZCBsaWtlIHRvIHVzZS4mbmJzcDs8L2NtZD48aW5mbz5Ob3RlOiBUaGlzIGVuY29kaW5nIHdpbGwNCi1ub3QgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBhbnkgWE1MIGRvY3VtZW50cyB0aGF0IGN1cnJlbnRseSBleGlzdC4gSXQgd2lsbA0KLW9ubHkgYmUgYWRkZWQgdG8gZG9jdW1lbnRzIHlvdSBjcmVhdGUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgZW5jb2RpbmcgYW5kIGNsaWNrDQotIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD47IG9yIHRvIGV4aXN0aW5nIGZpbGVzIHRoYXQgeW91IG9wZW4gYW5kIHRoZW4NCi1yZS1zYXZlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4sIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+V2hlbiB5b3UgY3JlYXRlIGFuIFhNTCBmaWxlLCBEVEQsIG9yIFhNTCBzY2hlbWEsIHRoZSBkZWZhdWx0IGVuY29kaW5nDQotdmFsdWUgd2lsbCBhcHBlYXIgaW4gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZpbGUsIGFzIHNob3duOjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Pz48L2NvZGVibG9jaz4gPC9wPjxwPlRoaXMNCi1pcyBrbm93biBhcyB0aGUgWE1MIERlY2xhcmF0aW9uLjwvcD48cD5BZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgZmlsZSwgeW91DQotY2FuIHdvcmsgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBhcHByb3ByaWF0ZSBlZGl0b3IgYW5kIG1hbnVhbGx5IGVkaXQgdGhlDQotZW5jb2RpbmcgdmFsdWUgaWYgeW91IHdpc2ggdG8gY2hhbmdlIGl0LiBXaGVuIHRoZSBmaWxlIGlzIHNhdmVkLCBpdCB3aWxsIGJlDQotc2F2ZWQgd2l0aCB0aGUgZW5jb2RpbmcgdGhhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUNCi1YTUwgdGV4dCBkZWNsYXJhdGlvbi4gSWYgdGhlIFhNTCBkZWNsYXJhdGlvbiBmb3IgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbg0KLWFuIGVuY29kaW5nIGF0dHJpYnV0ZSwgdGhlIGVuY29kaW5nIGNhbiBvbmx5IGJlIFVURi04IG9yIFVURi0xNi4gSWYgaXQgaXMNCi1VVEYtMTYsIHRoZSBmaWxlIG11c3QgYmVnaW4gd2l0aCB0aGUgcHJvcGVyIEJ5dGUgT3JkZXIgTWFyay48L3A+PHA+SWYgeW91DQotY3JlYXRlIGFuIFhNTCByZWxhdGVkIGRvY3VtZW50IGZyb20gYW5vdGhlciBYTUwgcmVsYXRlZCBkb2N1bWVudCwgdGhlIGVuY29kaW5nDQotdmFsdWUgaW4gdGhlIHNvdXJjZSBmaWxlIGlzIGNhcnJpZWQgb3ZlciB0byB0aGUgbmV3IGZpbGUuIEZvciBleGFtcGxlLCBpZg0KLXlvdSBoYXZlIGEgRFREIHdpdGggYW4gZW5jb2RpbmcgdmFsdWUgb2YgLCA8Y29kZXBoPlVTLUFTQ0lJPC9jb2RlcGg+YW5kIHlvdQ0KLWNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGl0LCB0aGUgZW5jb2RpbmcgdmFsdWUgb2YgdGhlIFhNTCBmaWxlIHdpbGwgYWxzbyBiZQ0KLSA8Y29kZXBoPlVTLUFTQ0lJPC9jb2RlcGg+LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzcGVsbGNoLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzcGVsbGNoLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzUyNDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3BlbGxjaC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRzcGVsbGNoIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TcGVsbCBjaGVja2luZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlNwZWxsIGNoZWNraW5nIHlvdXIgWE1MIGZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIHRoZSBzcGVsbCBjaGVja2VyIHRvIGNoZWNrIGZvciBtaXNzcGVsbGVkIHdvcmRzIGluDQoteW91ciBYTUwgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5zcGVsbCBjaGVja2luZyBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5zcGVsbCBjaGVja2luZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+PD9QdWIgQ2FyZXQxPz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBYTUwgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIHVzZSB0aGUgWE1MIGVkaXRvcg0KLXNwZWxsIGNoZWNrZXIsIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4gdGhlIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBzcGVsbCBjaGVjayBpbiB0aGUgWE1MIGVkaXRvci48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Td2l0Y2ggdG8gdGhlIDxiPlNvdXJjZTwvYj4gdmlldy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+PHVpY29udHJvbD4gU3BlbGwNCi1DaGVjazwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IG9yIGNsaWNrICA8dWljb250cm9sPkY3PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSBzcGVsbCBjaGVjayBkaWFsb2cgb3BlbnMuPC9jbWQ+PGluZm8+SWYgeW91IGhhdmUgbm8gZXJyb3JzLA0KLXRoZSBkaWFsb2cgd2lsbCBjb250YWluIHRoZSBtZXNzYWdlIDxzeXN0ZW1vdXRwdXQ+U3BlbGwgY2hlY2sgY29tcGxldGVkPC9zeXN0ZW1vdXRwdXQ+IGFuZA0KLW5vdGhpbmcgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIDx1aWNvbnRyb2w+TWlzc3BlbGxlZCB3b3JkPC91aWNvbnRyb2w+ZmllbGQuDQotT3RoZXJ3aXNlLCB0aGUgZmlyc3QgbWlzc3BlbGxpbmcgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIDx1aWNvbnRyb2w+TWlzc3BlbGxlZA0KLXdvcmQ8L3VpY29udHJvbD4gZmllbGQuJm5ic3A7PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBoYXZlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHRoZSBtaXNzcGVsbGVkDQotd29yZDogIDwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+Q2xpY2sgPHVpY29udHJvbD5JZ25vcmU8L3VpY29udHJvbD4gdG8gaWdub3JlIHRoZSBjdXJyZW50IGluc3RhbmNlDQotb2YgdGhlIHdvcmQgb3IgY2xpY2sgPHVpY29udHJvbD5JZ25vcmUgQWxsPC91aWNvbnRyb2w+IHRvIGlnbm9yZSBhbGwgaW5zdGFuY2VzDQotb2YgdGhlIHdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuPC9jaG9pY2U+DQotPGNob2ljZT5UeXBlIGEgbmV3IHNwZWxsaW5nIGluIHRoZSA8dWljb250cm9sPkNoYW5nZSB0bzwvdWljb250cm9sPiBmaWVsZCwNCi1vciBzZWxlY3Qgb25lIG9mIHRoZSBzdWdnZXN0ZWQgb3B0aW9ucy4gQ2xpY2sgPHVpY29udHJvbD5DaGFuZ2U8L3VpY29udHJvbD4gdG8NCi1jaGFuZ2UgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIHdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgb3IgY2xpY2smbmJzcDsgPHVpY29udHJvbD5DaGFuZ2UNCi1BbGw8L3VpY29udHJvbD4gdG8gY2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuPC9jaG9pY2U+DQotPGNob2ljZT5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiB0byBhZGQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzcGVsbGluZw0KLXRvIHlvdXIgdXNlciBkaWN0aW9uYXJ5LiBUaGlzIHNwZWxsaW5nIHdpbGwgbm93IGJlIHZhbGlkIGZvciBhbGwgWE1MIGRvY3VtZW50cw0KLXlvdSBzcGVsbCBjaGVjayBpbiB0aGUgWE1MIGVkaXRvci48L2Nob2ljZT4NCi08Y2hvaWNlPkNsaWNrICA8dWljb250cm9sPkRpY3Rpb25hcnk8L3VpY29udHJvbD4gdG8gZWRpdCB5b3VyIHVzZXIgZGljdGlvbmFyeS4NCi1BbGwgd29yZHMgeW91IGhhdmUgYWRkZWQgdG8geW91ciB1c2VyIGRpY3Rpb25hcnkgdXNpbmcgdGhlIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWluIHRoZSA8Yj5TcGVsbCBDaGVjazwvYj4gZGlhbG9nIHdpbGwgYmUgbGlzdGVkIGluIHRoZSA8dWljb250cm9sPkVkaXQgRGljdGlvbmFyeTwvdWljb250cm9sPiBkaWFsb2cuDQotVG8gcmVtb3ZlIGEgd29yZCBmcm9tIHlvdXIgdXNlciBkaWN0aW9uYXJ5LCBzZWxlY3QgaXQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RGVsZXRlPC91aWNvbnRyb2w+Lg0KLVRvIGFkZCBvbmUsIHR5cGUgaXQgYW5kIGNsaWNrICA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmVwZWF0IHRoZSBzYW1lIHByb2Nlc3MgZm9yIGFsbCBwb3RlbnRpYWwgbWlzc3BlbGxpbmdzIGlkZW50aWZpZWQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5DbG9zZTwvdWljb250cm9sPiB3aGVuIHRoZSA8c3lzdGVtb3V0cHV0PlNwZWxsDQotY2hlY2sgY29tcGxldGVkPC9zeXN0ZW1vdXRwdXQ+IG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoZSBkaWFsb2cuIFRoaXMgd2lsbA0KLXJldHVybiB5b3UgdG8gdGhlIGFjdGl2ZSBkb2N1bWVudCwgc28gdGhhdCB5b3UgY2FuIGNvbnRpbnVlIGVkaXRpbmcuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+VG8gZGVmaW5lIGRpY3Rpb25hcnkgcHJlZmVyZW5jZXMsIHVzZSB0aGUgU3BlbGwgQ2hlY2sgcGFnZSBpbiB0aGUNCi1QcmVmZXJlbmNlcyBkaWFsb2cgKDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvd3M8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TcGVsbCBDaGVjazwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+KS48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM0NTY/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFiOWYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQNCi1hc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kNCi1pcyBzZXQgdG8gIlN0cmljdCIsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlICdzdHJpY3RseScgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsDQotYmUgZGlzcGxheWVkIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyDQotc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5DQotdmFsaWQsIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbg0KLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byAiTGF4IiwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluDQotdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnNldHRpbmc8aW5kZXh0ZXJtPnNvdXJjZSBzdWdnZXN0aW9uDQotc3RyYXRlZ3k8P1B1YiBDYXJldD8+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBzZXQgdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgbWVudSBiYXIsIENsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5CZXNpZGUgU3VnZ2VzdGlvbiBzdHJhdGVneSBpbiB0aGUgQ29udGVudCBhc3Npc3Qgc2VjdGlvbiwgc2VsZWN0DQotdGhlIGFwcHJvcHJpYXRlIHNldHRpbmcgKGZvciBleGFtcGxlLCA8dWljb250cm9sPlN0cmljdDwvdWljb250cm9sPikuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPGV4YW1wbGU+PHA+VGhlIGZvbGxvd2luZyBzY3JlZW4gY2FwdHVyZSBkZW1vbnN0cmF0ZXMgY29udGVudCBhc3Npc3Qgd2l0aA0KLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHNldCB0byAiU3RyaWN0Ijo8L3A+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9zdWdnZXN0aW9uLmdpZiINCi1wbGFjZW1lbnQ9ImJyZWFrIj48YWx0PkV4YW1wbGUgb2YgU3RyaWN0IFN1Z2dlc3Rpb24gU3RyYXRlZ3k8L2FsdD48L2ltYWdlPjwvZXhhbXBsZT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTkxNz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGZmOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gJnF1b3Q7U3RyaWN0JnF1b3Q7LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSAnc3RyaWN0bHknIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvICZxdW90O0xheCZxdW90OywgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQgYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byAmcXVvdDtTdHJpY3QmcXVvdDssIHN1Z2dlc3Rpb25zIHRoYXQgYXJlICdzdHJpY3RseScgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQsIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gJnF1b3Q7TGF4JnF1b3Q7LCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcsIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc2V0dGluZywgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiPjxhIG5hbWU9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3Q8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudAotYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5Ci1pcyBzZXQgdG8gIlN0cmljdCIsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlICdzdHJpY3RseScgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsCi1iZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIKLXN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseQotdmFsaWQsIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbgotdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvICJMYXgiLCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4KLXRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHNldCB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0OjwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+RnJvbSB0aGUgbWVudSBiYXIsIENsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1GaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5CZXNpZGUgU3VnZ2VzdGlvbiBzdHJhdGVneSBpbiB0aGUgQ29udGVudCBhc3Npc3Qgc2VjdGlvbiwgc2VsZWN0Ci10aGUgYXBwcm9wcmlhdGUgc2V0dGluZyAoZm9yIGV4YW1wbGUsIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cmljdDwvc3Bhbj4pLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPlRoZSBmb2xsb3dpbmcgc2NyZWVuIGNhcHR1cmUgZGVtb25zdHJhdGVzIGNvbnRlbnQgYXNzaXN0IHdpdGgKLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHNldCB0byAiU3RyaWN0Ijo8L3A+Ci08YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmIiBhbHQ9IkV4YW1wbGUgb2YgU3RyaWN0IFN1Z2dlc3Rpb24gU3RyYXRlZ3kiIC8+PGJyIC8+PC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1NGM2MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR0YWdoaWx0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UNCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycw0KLXRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgWE1MIGNvZGUsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPiBYTUwNCi1TdHlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Db250ZW50IHR5cGU8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UNCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljaw0KLXRleHQgaW4gdGhlIHNhbXBsZSB0ZXh0IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldA0KLWEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Gb3JlZ3JvdW5kPC91aWNvbnRyb2w+IGJveC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5CYWNrZ3JvdW5kPC91aWNvbnRyb2w+IGJveC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Cb2xkPC91aWNvbnRyb2w+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bw0KLW1ha2UgdGhlIHR5cGUgYm9sZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZw0KLXN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBJZiB5b3Ugb25seSB3YW50IHRvIHJlc2V0IHRoZSB2YWx1ZSBmb3INCi1hIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDx1aWNvbnRyb2w+Q29udGVudCB0eXBlIDwvdWljb250cm9sPiA8P1B1YiBDYXJldD8+ZmllbGQsDQotdGhlIGNsaWNrIHRoZSA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPiBidXR0b24gbmV4dCB0byBpdC4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMjYyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmRkNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHRhZ2hpbHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0dGFnaGlsdCI+PGEgbmFtZT0idHRhZ2hpbHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UKLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgWE1MIGNvZGUsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBYTUwKLVN0eWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgdHlwZTwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UKLXRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBhbHNvIGNsaWNrCi10ZXh0IGluIHRoZSBzYW1wbGUgdGV4dCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQKLWEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JlZ3JvdW5kPC9zcGFuPiBib3guPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmFja2dyb3VuZDwvc3Bhbj4gYm94Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBjb2xvciB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWhpbmQgdGhlIHRhZyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJvbGQ8L3NwYW4+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bwotbWFrZSB0aGUgdHlwZSBib2xkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZwotc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIElmIHlvdSBvbmx5IHdhbnQgdG8gcmVzZXQgdGhlIHZhbHVlIGZvcgotYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IHR5cGUgPC9zcGFuPiBmaWVsZCwKLXRoZSBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiBidXR0b24gbmV4dCB0byBpdC4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWVjZTE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InR3Y2Rhc3QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mDQotY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QNCi10byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+Y29udGVudCBhc3Npc3Q8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTA0KLWZpbGVzPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+PD9QdWIgQ2FyZXQxPz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4geW91ciBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dA0KLWZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9wPjxwPllvdSBjYW4NCi1sYXVuY2ggY29udGVudCBhc3Npc3QgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+PHVsPg0KLTxsaT5Gcm9tIHRoZSA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4gbWVudSwgY2xpY2sgPHVpY29udHJvbD5Db250ZW50IEFzc2lzdDwvdWljb250cm9sPiwNCi1vcjwvbGk+DQotPGxpPlByZXNzIEN0cmwrU3BhY2U8L2xpPg0KLTwvdWw+PHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gc2V0IHVwIGFuIG9wdGlvbiB0aGF0IGNhdXNlcyBjb250ZW50IGFzc2lzdCB0bw0KLXBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZC4gVG8gc2V0IHVwIHRoaXMgb3B0aW9uLA0KLWNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+IFByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gdG8gb3BlbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCB0aGVuIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBGaWxlcyA8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiAuIEluIHRoZSA8dWljb250cm9sPkNvbnRlbnQgYXNzaXN0PC91aWNvbnRyb2w+IGdyb3VwIGJveCwgc2VsZWN0DQotdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseSBtYWtlIHN1Z2dlc3Rpb25zPC91aWNvbnRyb2w+IGNoZWNrIGJveCwgYW5kIHN1cHBseQ0KLWFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgdHJpZ2dlciBjb250ZW50IGFzc2lzdC48L3A+PHA+SWYgeW91cg0KLWN1cnNvciBpcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZg0KLWF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZCB3aGVuIHlvdSBsYXVuY2ggY29udGVudCBhc3Npc3QuIFRoZSBsaXN0IGlzDQotYmFzZWQgb24gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgYSBEVEQgb3IgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlDQotWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gQWRkcmVzcyBlbGVtZW50IHRoYXQgY2FuDQotY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjaGlsZHJlbiBlbGVtZW50czogTmFtZSwgU3RyZWV0LCBDaXR5LCBaaXAgQ29kZSwNCi1Db3VudHJ5LCBhbmQgUHJvdmluY2UsIGFuZCB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYWZ0ZXIgYW55IG9mIHRoZW0gYW5kIGxhdW5jaA0KLWNvbnRlbnQgYXNzaXN0LCBhbGwgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBjb250ZW50IGFzc2lzdA0KLWxpc3QuPC9wPjxwPlRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCB2YWxpZCB0YWdzIGZvciB0aGUgY3VycmVudA0KLWN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gSWYgeW91ciBncmFtbWFyIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQNCi1vZmYsIGFsbCBhdmFpbGFibGUgdGFncywgbm90IGp1c3QgdmFsaWQgb25lcyBhcmUgZGlzcGxheWVkLiA8L3A+PHA+IDwvcD48cD5Bcw0KLXlvdSB0eXBlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIHRhZyB0aGF0IHlvdSB3YW50LCB0aGUgbGlzdCBhdXRvbWF0aWNhbGx5DQotcmVmcmVzaGVzIHdpdGggYWxwaGFiZXRpemVkIGNob2ljZXMgdGhhdCBtYXRjaCB5b3VyIGlucHV0LjwvcD48cD48Yj5Ob3RlPC9iPjoNCi1UaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcyBkZXNjcmliZWQgaWYgeW91IGZpcnN0IHR5cGUgPHVzZXJpbnB1dD4mbHQ7PC91c2VyaW5wdXQ+IGJlZm9yZQ0KLXByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QuPC9wPjxwPlNjcm9sbCBkb3duIGFuZCBzZWxlY3QgdGhlIHRhZyB0aGF0IHlvdQ0KLXdhbnQgdG8gdXNlIGJ5IGRvdWJsZS1jbGlja2luZyBvbiBpdC4gPC9wPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzA2MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwZTA1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZywgY29udGVudCBhc3Npc3QsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcsIGNvbnRlbnQgYXNzaXN0LCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RzdWdzdHJhdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y2Rhc3QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y2Rhc3QiPjxhIG5hbWU9InR3Y2Rhc3QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YKLWNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0Ci10byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB5b3VyIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0Ci1mb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvcD4KLTxwPllvdSBjYW4KLWxhdW5jaCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KLTx1bD4KLTxsaT5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IEFzc2lzdDwvc3Bhbj4sCi1vcjwvbGk+Ci0KLTxsaT5QcmVzcyBDdHJsK1NwYWNlPC9saT4KLQotPC91bD4KLTxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCB1cCBhbiBvcHRpb24gdGhhdCBjYXVzZXMgY29udGVudCBhc3Npc3QgdG8KLXBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZC4gVG8gc2V0IHVwIHRoaXMgb3B0aW9uLAotY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IFByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiB0byBvcGVuIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLWFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzIDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPgotPC9zcGFuPiAuIEluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IGFzc2lzdDwvc3Bhbj4gZ3JvdXAgYm94LCBzZWxlY3QKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHN1cHBseQotYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycyB0aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD4KLTxwPklmIHlvdXIKLWN1cnNvciBpcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZgotYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkIHdoZW4geW91IGxhdW5jaCBjb250ZW50IGFzc2lzdC4gVGhlIGxpc3QgaXMKLWJhc2VkIG9uIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIGEgRFREIG9yIFhNTCBzY2hlbWEgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gQWRkcmVzcyBlbGVtZW50IHRoYXQgY2FuCi1jb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoaWxkcmVuIGVsZW1lbnRzOiBOYW1lLCBTdHJlZXQsIENpdHksIFppcCBDb2RlLAotQ291bnRyeSwgYW5kIFByb3ZpbmNlLCBhbmQgeW91IHBsYWNlIHlvdXIgY3Vyc29yIGFmdGVyIGFueSBvZiB0aGVtIGFuZCBsYXVuY2gKLWNvbnRlbnQgYXNzaXN0LCBhbGwgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBjb250ZW50IGFzc2lzdAotbGlzdC48L3A+Ci08cD5UaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgdmFsaWQgdGFncyBmb3IgdGhlIGN1cnJlbnQKLWN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gSWYgeW91ciBncmFtbWFyIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQKLW9mZiwgYWxsIGF2YWlsYWJsZSB0YWdzLCBub3QganVzdCB2YWxpZCBvbmVzIGFyZSBkaXNwbGF5ZWQuIDwvcD4KLTxwPiA8L3A+Ci08cD5BcwoteW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQsIHRoZSBsaXN0IGF1dG9tYXRpY2FsbHkKLXJlZnJlc2hlcyB3aXRoIGFscGhhYmV0aXplZCBjaG9pY2VzIHRoYXQgbWF0Y2ggeW91ciBpbnB1dC48L3A+Ci08cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46Ci1UaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcyBkZXNjcmliZWQgaWYgeW91IGZpcnN0IHR5cGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4mbHQ7PC9rYmQ+IGJlZm9yZQotcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdC48L3A+Ci08cD5TY3JvbGwgZG93biBhbmQgc2VsZWN0IHRoZSB0YWcgdGhhdCB5b3UKLXdhbnQgdG8gdXNlIGJ5IGRvdWJsZS1jbGlja2luZyBvbiBpdC4gPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiI+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90c3Vnc3RyYXQuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gJnF1b3Q7U3RyaWN0JnF1b3Q7LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSAnc3RyaWN0bHknIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvICZxdW90O0xheCZxdW90OywgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODU1YzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3bWFjcm8iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5YTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQNCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuDQoteW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdQ0KLWRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCB0ZW1wbGF0ZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgdGVtcGxhdGVzPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwNCi10ZW1wbGF0ZXM8aW5kZXh0ZXJtPnJlbW92aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgdGVtcGxhdGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCB0ZW1wbGF0ZXM8aW5kZXh0ZXJtPmV4cG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WW91IGNhbiB1c2UgYSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwNCi1vciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD5Gb3IgZXhhbXBsZSwgeW91IGNhbiB3b3JrIG9uIGEgZ3JvdXAgb2YgWE1MDQotcGFnZXMgdGhhdCBzaG91bGQgYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGENCi10ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlDQotYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlIHZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZQ0KLXRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQuKQ0KLVRoZW4gc2VsZWN0IHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlcg0KLXlvdSB3YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjxwPlRvIGNyZWF0ZSBhIG5ldyBYTUwNCi10ZW1wbGF0ZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1UZW1wbGF0ZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5DQotbmV3IHRlbXBsYXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gYW5kIDx1aWNvbnRyb2w+RGVzY3JpcHRpb248L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGZvciB0aGUgdGVtcGxhdGUuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbA0KLWxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcNCi10aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50DQotYXNzaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5JbnNlcnQgVmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uDQotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIDwvY21kPjxpbmZvPkZvciBleGFtcGxlLCB0aGUgPGI+ZGF0ZTwvYj4gdmFyaWFibGUNCi1pbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlIGluc2VydGVkLiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUNCi1wcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQ0KLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUNCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC4gPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQ0KLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUNCi1jb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgPGI+WE1MIFRlbXBsYXRlczwvYj4gcHJlZmVyZW5jZXMgcGFnZSBhbmQgY2xlYXINCi1pdHMgY2hlY2sgYm94LjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM0Mjc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmM1MTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCB0ZW1wbGF0ZXMsIGNyZWF0aW5nLCBlZGl0aW5nLCBYTUwgdGVtcGxhdGVzLCByZW1vdmluZywgaW1wb3J0aW5nLCBleHBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgdGVtcGxhdGVzLCBjcmVhdGluZywgZWRpdGluZywgWE1MIHRlbXBsYXRlcywgcmVtb3ZpbmcsIGltcG9ydGluZywgZXhwb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdtYWNybyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d21hY3JvIj48YSBuYW1lPSJ0d21hY3JvIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuCi15b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91Ci1kbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gdXNlIGEgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsCi1vciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLUZvciBleGFtcGxlLCB5b3UgY2FuIHdvcmsgb24gYSBncm91cCBvZiBYTUwKLXBhZ2VzIHRoYXQgc2hvdWxkIGFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhCi10ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlCi1hdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlCi10YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKQotVGhlbiBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyCi15b3Ugd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48cD5UbyBjcmVhdGUgYSBuZXcgWE1MCi10ZW1wbGF0ZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1UZW1wbGF0ZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkKLW5ldyB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGZvciB0aGUgdGVtcGxhdGUuPC9zcGFuPgotIFRoaXMgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwKLWxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcKLXRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQKLWFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC4gPC9zcGFuPiBGb3IgZXhhbXBsZSwgdGhlIDxzdHJvbmc+ZGF0ZTwvc3Ryb25nPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUKLXByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC4gPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZQotY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIDxzdHJvbmc+WE1MIFRlbXBsYXRlczwvc3Ryb25nPiBwcmVmZXJlbmNlcyBwYWdlIGFuZCBjbGVhcgotaXRzIGNoZWNrIGJveC48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzNTBiNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3eHZhbGlkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VmFsaWRhdGluZyBYTUwgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+V2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0bw0KLXNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT52YWxpZGF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgWE1MIGVkaXRvciB3aWxsIHByb2Nlc3MgWE1MIGZpbGVzIHRoYXQgYXJlIGludmFsaWQgb3Igbm90DQotd2VsbC1mb3JtZWQuIFRoZSBlZGl0b3IgdXNlcyBoZXVyaXN0aWNzIHRvIG9wZW4gYSBmaWxlIHVzaW5nIHRoZSBiZXN0IGludGVycHJldGF0aW9uDQotb2YgdGhlIHRhZ2dpbmcgdGhhdCBpdCBjYW4uIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIGVuZCB0YWcNCi1pcyBzaW1wbHkgYXNzdW1lZCB0byBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuIEFzIHlvdSBtYWtlIHVwZGF0ZXMgdG8NCi1hIGZpbGUsIHRoZSBlZGl0b3IgaW5jcmVtZW50YWxseSByZWludGVycHJldHMgeW91ciBkb2N1bWVudCwgY2hhbmdpbmcgdGhlDQotaGlnaGxpZ2h0aW5nLCB0cmVlIHZpZXcsIGFuZCBzbyBvbi4gTWFueSBmb3JtYXRpb24gZXJyb3JzIGFyZSBlYXN5IHRvIHNwb3QNCi1pbiB0aGUgc3ludGF4IGhpZ2hsaWdodGluZywgc28geW91IGNhbiBlYXNpbHkgY29ycmVjdCBvYnZpb3VzIGVycm9ycyBvbi10aGUtZmx5Lg0KLUhvd2V2ZXIsIHRoZXJlIHdpbGwgYmUgb3RoZXIgY2FzZXMgd2hlbiBpdCB3aWxsIGJlIGJlbmVmaWNpYWwgdG8gcGVyZm9ybSBmb3JtYWwNCi12YWxpZGF0aW9uIG9uIHlvdXIgZG9jdW1lbnRzLjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiB2YWxpZGF0ZSB5b3VyIGZpbGUgYnkgc2VsZWN0aW5nIGl0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywNCi1yaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDx1aWNvbnRyb2w+VmFsaWRhdGUgWE1MIGZpbGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5BbnkgdmFsaWRhdGlvbiBwcm9ibGVtcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiA8L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+PHA+SW4gdGhlIFByb2JsZW1zIHZpZXcsIHlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGluZGl2aWR1YWwgZXJyb3JzLA0KLWFuZCB5b3Ugd2lsbCBiZSB0YWtlbiB0byB0aGUgaW52YWxpZCB0YWcgaW4gdGhlIGZpbGUsIHNvIHRoYXQgeW91IGNhbiBtYWtlDQotY29ycmVjdGlvbnMuIDwvcD48cD48Yj5Ob3RlPC9iPjogSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nDQotdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMNCi1hbGxvd2VkIGJ5IHNlbGVjdGluZyA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5WYWxpZGF0aW9uPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gZnJvbSB0aGUgcHJvamVjdCdzIHBvcC11cCBtZW51IGFuZCBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlcg0KLW9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQuIFlvdSBtdXN0IHNlbGVjdCB0aGUgPHVpY29udHJvbD5PdmVycmlkZSB2YWxpZGF0aW9uDQotcHJlZmVyZW5jZXM8L3VpY29udHJvbD4gY2hlY2sgYm94IGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZG8gdGhpcy48L3A+PHA+QXMNCi13ZWxsLCB5b3UgY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QNCi1yZXNvdXJjZXMgYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbS4gRnJvbSBhIHByb2plY3Qncw0KLXBvcC11cCBtZW51IHNlbGVjdCA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sIHRoZW4gc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPi4NCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbg0KLXBhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5kaXRhIiBzY29wZT0icGVlciI+DQotPGRlc2M+R2VuZXJhbCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uPC9kZXNjPg0KLTwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1ZWNhNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHd4dmFsaWQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHd4dmFsaWQiPjxhIG5hbWU9InR3eHZhbGlkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0bwotc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZWRpdG9yIHdpbGwgcHJvY2VzcyBYTUwgZmlsZXMgdGhhdCBhcmUgaW52YWxpZCBvciBub3QKLXdlbGwtZm9ybWVkLiBUaGUgZWRpdG9yIHVzZXMgaGV1cmlzdGljcyB0byBvcGVuIGEgZmlsZSB1c2luZyB0aGUgYmVzdCBpbnRlcnByZXRhdGlvbgotb2YgdGhlIHRhZ2dpbmcgdGhhdCBpdCBjYW4uIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIGVuZCB0YWcKLWlzIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gQXMgeW91IG1ha2UgdXBkYXRlcyB0bwotYSBmaWxlLCB0aGUgZWRpdG9yIGluY3JlbWVudGFsbHkgcmVpbnRlcnByZXRzIHlvdXIgZG9jdW1lbnQsIGNoYW5naW5nIHRoZQotaGlnaGxpZ2h0aW5nLCB0cmVlIHZpZXcsIGFuZCBzbyBvbi4gTWFueSBmb3JtYXRpb24gZXJyb3JzIGFyZSBlYXN5IHRvIHNwb3QKLWluIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLCBzbyB5b3UgY2FuIGVhc2lseSBjb3JyZWN0IG9idmlvdXMgZXJyb3JzIG9uLXRoZS1mbHkuCi1Ib3dldmVyLCB0aGVyZSB3aWxsIGJlIG90aGVyIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBiZW5lZmljaWFsIHRvIHBlcmZvcm0gZm9ybWFsCi12YWxpZGF0aW9uIG9uIHlvdXIgZG9jdW1lbnRzLjwvcD4KLTwvZGl2PgotCi0KLTxkaXYgY2xhc3M9InAiPjxzcGFuPllvdSBjYW4gdmFsaWRhdGUgeW91ciBmaWxlIGJ5IHNlbGVjdGluZyBpdCBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsCi1yaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlIFhNTCBmaWxlPC9zcGFuPi48L3NwYW4+Ci08L2Rpdj4KLQotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgdmFsaWRhdGlvbiBwcm9ibGVtcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiA8L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SW4gdGhlIFByb2JsZW1zIHZpZXcsIHlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGluZGl2aWR1YWwgZXJyb3JzLAotYW5kIHlvdSB3aWxsIGJlIHRha2VuIHRvIHRoZSBpbnZhbGlkIHRhZyBpbiB0aGUgZmlsZSwgc28gdGhhdCB5b3UgY2FuIG1ha2UKLWNvcnJlY3Rpb25zLiA8L3A+Ci08cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZwotdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMKLWFsbG93ZWQgYnkgc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPgotPC9zcGFuPiBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUgYW5kIHNwZWNpZnlpbmcgdGhlIG1heGltdW0gbnVtYmVyCi1vZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkLiBZb3UgbXVzdCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJyaWRlIHZhbGlkYXRpb24KLXByZWZlcmVuY2VzPC9zcGFuPiBjaGVjayBib3ggaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBkbyB0aGlzLjwvcD4KLTxwPkFzCi13ZWxsLCB5b3UgY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QKLXJlc291cmNlcyBhcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzCi1wb3AtdXAgbWVudSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4sIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LgotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24KLXBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgdGl0bGU9IkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiI+Li4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWw8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTI1ZWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0eGVkdGRlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZQ0KLXNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcNCi1lYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsDQotd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvcg0KLXRoYXQgcGFydGljdWxhciBlbGVtZW50Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPmluIHRoZSBEZXNpZ24NCi12aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gRm9yIGV4YW1wbGUsIHRoZSA8dWljb250cm9sPkFkZCBjaGlsZDwvdWljb250cm9sPiBtZW51IGl0ZW0gd2lsbA0KLWxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2ggd291bGQgYmUgdmFsaWQgY2hpbGRyZW4NCi1hdCB0aGF0IHBvaW50LjwvcD48cD5XaGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hDQotb3IgRFREIGZpbGUsIGNlcnRhaW4gdGFncyBhbmQgcnVsZXMgZm9yIHRoYXQgZmlsZSBoYXZlIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCwNCi13aGljaCBpcyB3aHkgdGhlIERlc2lnbiB2aWV3IGNhbiBwcm92aWRlIHByb21wdHMgKHZpYSBhIHBvcC11cCBtZW51KSBmb3IgdGhvc2UNCi10YWdzLiBXaGVuIHlvdSBjcmVhdGUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWENCi1vciBEVEQgZmlsZSwgaXQgaGFzIG5vIHRhZ3Mgb3IgcnVsZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBzbyB0aGUgRGVzaWduIHZpZXcNCi1jYW5ub3QgcHJvdmlkZSBwcm9tcHRzIGZvciBzcGVjaWZpYyB0YWdzLCBidXQgaXQgY2FuIHByb3ZpZGUgcHJvbXB0cyB0byBjcmVhdGUNCi1uZXcgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9wPjxwPkZvciBhbnkgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTA0KLXNjaGVtYSBvciBEVEQgZmlsZSwgeW91IGNhbiB1c2UgdGhlIERlc2lnbiB2aWV3IHRvIGFkZCBhbnkgaXRlbXMgZGVmaW5lZCBpbg0KLXRoZSBYTUwgc2NoZW1hIG9yIERURCAoc3VjaCBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcykgdG8gdGhlIFhNTCBmaWxlLiBZb3UNCi1jYW4gYWxzbyB1c2UgaXQgdG8gYWRkIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFuZCBjb21tZW50cyB0byBhbGwgWE1MIGZpbGVzLjwvcD48cD5Gb3INCi1tb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBpY29ucyB1c2VkIGluIHRoZSBEZXNpZ24gdmlldywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQNCi1yZWZlcmVuY2UuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWVkaXQgYW4gWE1MIGZpbGUgaW4gdGhlIERlc2lnbiB2aWV3LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBYTUwgZmlsZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBpbiB0aGUgWE1MIGVkaXRvcg0KLShyaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoDQotPiBYTUwgRWRpdG9yPC91aWNvbnRyb2w+KS4gSWYgbmVjZXNzYXJ5LCBjbGljayB0aGUgPHVpY29udHJvbD5EZXNpZ248L3VpY29udHJvbD4gdGFiLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGV4cGFuZCBhbGwgdGhlIGl0ZW1zIGluIHlvdXIgWE1MIGZpbGUsIGNsaWNrIHRoZSA8dWljb250cm9sPkV4cGFuZA0KLUFsbDwvdWljb250cm9sPiB0b29sYmFyIGJ1dHRvbiAgPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgRXhwYW5kIEFsbCB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGNvbGxhcHNlIHRoZW0sIGNsaWNrIHRoZSA8dWljb250cm9sPkNvbGxhcHNlIEFsbDwvdWljb250cm9sPiB0b29sYmFyDQotYnV0dG9uICA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLUNvbGxhcHNlIEFsbCB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHRoZSBpdGVtIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoLjwvY21kPjxpbmZvPlNvbWUNCi1vciBhbGwgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zIChhcyBhcHBsaWNhYmxlKSB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoZQ0KLXBvcC11cCBtZW51IHRoYXQgYXBwZWFyczo8dWw+DQotPGxpPiA8dWljb250cm9sPkFkZCBEVEQgSW5mb3JtYXRpb248L3VpY29udHJvbD4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvDQotYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFRELjwvbGk+DQotPGxpPiA8dWljb250cm9sPkVkaXQgRE9DVFlQRTwvdWljb250cm9sPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gZWRpdA0KLXRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLiBSZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9saT4NCi08bGk+IDx1aWNvbnRyb2w+RWRpdCBOYW1lc3BhY2VzPC91aWNvbnRyb2w+IC0gQ2xpY2sgdGhpcyBpZiB5b3Ugd2FudCB0byBlZGl0DQotdGhlIGV4aXN0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBvciBjcmVhdGUgYSBuZXcgYXNzb2NpYXRpb24gd2l0aCBhIG5hbWVzcGFjZS4NCi1SZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9saT4NCi08bGk+IDx1aWNvbnRyb2w+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC91aWNvbnRyb2w+IC0gQ2xpY2sgdGhpcyBpZiB5b3UNCi13YW50IHRvIGVkaXQgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUNCi1kZXRhaWxzLjwvbGk+DQotPGxpPiA8dWljb250cm9sPlJlbW92ZTwvdWljb250cm9sPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZQ0KLWl0ZW0gdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCBmcm9tIHRoZSBYTUwgZmlsZS4gVGhpcyBvcHRpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlDQotaWYgdGhlIGl0ZW0geW91IHdhbnQgdG8gcmVtb3ZlIG11c3QgZXhpc3QgKGZvciBleGFtcGxlLCBpbiB5b3VyIERURCwgeW91IGhhdmUNCi1kZWNsYXJlZCB0aGF0ICJPbmUgb3IgbW9yZSIgb2YgdGhlIGl0ZW0gbXVzdCBhbHdheXMgZXhpc3QgaW4geW91ciBYTUwgZmlsZSwNCi1hbmQgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQgaXMgdGhlIG9ubHkgb25lIHRoYXQgZXhpc3RzIGluIHlvdXIgWE1MIGZpbGUpLjwvbGk+DQotPGxpPiA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGU8L3VpY29udHJvbD4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIGFkZA0KLWFuIGF0dHJpYnV0ZSB0byB0aGUgZWxlbWVudCB0aGF0IHlvdSBzZWxlY3RlZC4gQW55IGF0dHJpYnV0ZXMgeW91IGFyZSBhbGxvd2VkDQotdG8gYWRkIHRvIHRoZSBlbGVtZW50IHdpbGwgYmUgbGlzdGVkLiBBZnRlciB5b3UgaGF2ZSBhZGRlZCB0aGUgYXR0cmlidXRlIHRvDQotdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrIGluIHRoZSByaWdodC1oYW5kIGNvbHVtbiB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mDQotdGhlIGF0dHJpYnV0ZS4gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgc2V0IHZhbHVlcywgdGhleSB3aWxsIGFwcGVhciBpbiBhIGxpc3Q8P1B1YiBDYXJldD8+LjwvbGk+DQotPGxpPiA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiAtIENsaWNrIHRoaXMgdG8gYWRkIGFub3RoZXIgZWxlbWVudCwNCi1hIGNvbW1lbnQsIG9yIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgZWxlbWVudC48L2xpPg0KLTxsaT4gPHVpY29udHJvbD5BZGQgQmVmb3JlPC91aWNvbnRyb2w+ICAtIENsaWNrIHRoaXMgdG8gYWRkIGEgY2hpbGQgZWxlbWVudCwNCi1jb21tZW50LCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRoYXQgY2FuIGdvIGJlZm9yZSB0aGUgaXRlbSB5b3UgaGF2ZSBzZWxlY3RlZC4NCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgIkNEIENvbGxlY3Rpb25zIiB0aGF0IGNhbg0KLWNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgIkNEIiwgeW91IGNvdWxkIGNsaWNrIGEgQ0QNCi1lbGVtZW50IGFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5BZGQgQmVmb3JlPC91aWNvbnRyb2w+PHVpY29udHJvbD4gQ0Q8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiAsIGFzIGEgQ0QgZWxlbWVudCBjYW4gZ28gYmVmb3JlIGFub3RoZXIgQ0QgZWxlbWVudC48L2xpPg0KLTxsaT4gPHVpY29udHJvbD5BZGQgQWZ0ZXI8L3VpY29udHJvbD4gLSBDbGljayB0aGlzIHRvIGFkZCBhIGNoaWxkIGVsZW1lbnQsDQotY29tbWVudCwgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0aGF0IGNhbiBnbyBhZnRlciB0aGUgaXRlbSB5b3UgaGF2ZSBzZWxlY3RlZC4NCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgIkNEIENvbGxlY3Rpb25zIiB0aGF0IGNhbg0KLWNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgIkNEIiwgeW91IGNvdWxkIGNsaWNrIGEgQ0QNCi1lbGVtZW50IGFuZCBjbGljayAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+QWRkIEFmdGVyPC91aWNvbnRyb2w+PHVpY29udHJvbD4gQ0Q8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiwgYXMgYSBDRCBlbGVtZW50IGNhbiBnbyBhZnRlciBhbm90aGVyIENEIGVsZW1lbnQuPC9saT4NCi08bGk+IDx1aWNvbnRyb2w+UmVwbGFjZSBXaXRoPC91aWNvbnRyb2w+IC0gQ2xpY2sgdGhpcyBpZiB5b3Ugd2FudCB0byByZXBsYWNlDQotb25lIGl0ZW0gd2l0aCBhbm90aGVyLiBUaGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIGlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMNCi1vZmYgb3IgaWYgdGhlcmUgYXJlIG5vIHZhbGlkIGFsdGVybmF0aXZlcyBmb3IgeW91IHRvIHJlcGxhY2UgdGhlIGl0ZW0gd2l0aC48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSBhcHByb3ByaWF0ZSBvcHRpb24uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgRGVzaWduIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQ0KLVNvdXJjZSB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNTk3MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2UwNWIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgRGVzaWduIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgRGVzaWduIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0cHJvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnhtbGJpY29ucy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0ZGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0ZGVzIj48YSBuYW1lPSJ0eGVkdGRlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZQotc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZwotZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLAotd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvcgotdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD4gRm9yIGV4YW1wbGUsIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgY2hpbGQ8L3NwYW4+IG1lbnUgaXRlbSB3aWxsCi1saXN0IG9ubHkgdGhvc2UgZWxlbWVudHMgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHdoaWNoIHdvdWxkIGJlIHZhbGlkIGNoaWxkcmVuCi1hdCB0aGF0IHBvaW50LjwvcD4KLTxwPldoZW4geW91IGhhdmUgYW4gWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEKLW9yIERURCBmaWxlLCBjZXJ0YWluIHRhZ3MgYW5kIHJ1bGVzIGZvciB0aGF0IGZpbGUgaGF2ZSBhbHJlYWR5IGJlZW4gZXN0YWJsaXNoZWQsCi13aGljaCBpcyB3aHkgdGhlIERlc2lnbiB2aWV3IGNhbiBwcm92aWRlIHByb21wdHMgKHZpYSBhIHBvcC11cCBtZW51KSBmb3IgdGhvc2UKLXRhZ3MuIFdoZW4geW91IGNyZWF0ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYQotb3IgRFREIGZpbGUsIGl0IGhhcyBubyB0YWdzIG9yIHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgc28gdGhlIERlc2lnbiB2aWV3Ci1jYW5ub3QgcHJvdmlkZSBwcm9tcHRzIGZvciBzcGVjaWZpYyB0YWdzLCBidXQgaXQgY2FuIHByb3ZpZGUgcHJvbXB0cyB0byBjcmVhdGUKLW5ldyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy48L3A+Ci08cD5Gb3IgYW55IFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwKLXNjaGVtYSBvciBEVEQgZmlsZSwgeW91IGNhbiB1c2UgdGhlIERlc2lnbiB2aWV3IHRvIGFkZCBhbnkgaXRlbXMgZGVmaW5lZCBpbgotdGhlIFhNTCBzY2hlbWEgb3IgRFREIChzdWNoIGFzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzKSB0byB0aGUgWE1MIGZpbGUuIFlvdQotY2FuIGFsc28gdXNlIGl0IHRvIGFkZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhbmQgY29tbWVudHMgdG8gYWxsIFhNTCBmaWxlcy48L3A+Ci08cD5Gb3IKLW1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGljb25zIHVzZWQgaW4gdGhlIERlc2lnbiB2aWV3LCByZWZlciB0byB0aGUgcmVsYXRlZAotcmVmZXJlbmNlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWVkaXQgYW4gWE1MIGZpbGUgaW4gdGhlIERlc2lnbiB2aWV3LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggaW4gdGhlIFhNTCBlZGl0b3IKLShyaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aAotJmd0OyBYTUwgRWRpdG9yPC9zcGFuPikuIElmIG5lY2Vzc2FyeSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2lnbjwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gZXhwYW5kIGFsbCB0aGUgaXRlbXMgaW4geW91ciBYTUwgZmlsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cGFuZAotQWxsPC9zcGFuPiB0b29sYmFyIGJ1dHRvbiAgPGltZyBzcmM9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiIgYWx0PSJUaGlzJiMxMDtncmFwaGljIGlzIHRoZSBFeHBhbmQgQWxsIHRvb2xiYXIgYnV0dG9uIiAvPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjb2xsYXBzZSB0aGVtLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29sbGFwc2UgQWxsPC9zcGFuPiB0b29sYmFyCi1idXR0b24gIDxpbWcgc3JjPSIuLi9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlJiMxMDtDb2xsYXBzZSBBbGwgdG9vbGJhciBidXR0b24iIC8+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIHRoZSBpdGVtIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoLjwvc3Bhbj4gU29tZQotb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyAoYXMgYXBwbGljYWJsZSkgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUKLXBvcC11cCBtZW51IHRoYXQgYXBwZWFyczo8dWw+Ci08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBEVEQgSW5mb3JtYXRpb248L3NwYW4+IC0gQ2xpY2sgdGhpcyBpZiB5b3Ugd2FudCB0bwotYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFRELjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdCBET0NUWVBFPC9zcGFuPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gZWRpdAotdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQgTmFtZXNwYWNlczwvc3Bhbj4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIGVkaXQKLXRoZSBleGlzdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24gb3IgY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggYSBuYW1lc3BhY2UuCi1SZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9saT4KLQotPGxpPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3NwYW4+IC0gQ2xpY2sgdGhpcyBpZiB5b3UKLXdhbnQgdG8gZWRpdCB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IgbW9yZQotZGV0YWlscy48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbW92ZTwvc3Bhbj4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUKLWl0ZW0gdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCBmcm9tIHRoZSBYTUwgZmlsZS4gVGhpcyBvcHRpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlCi1pZiB0aGUgaXRlbSB5b3Ugd2FudCB0byByZW1vdmUgbXVzdCBleGlzdCAoZm9yIGV4YW1wbGUsIGluIHlvdXIgRFRELCB5b3UgaGF2ZQotZGVjbGFyZWQgdGhhdCAiT25lIG9yIG1vcmUiIG9mIHRoZSBpdGVtIG11c3QgYWx3YXlzIGV4aXN0IGluIHlvdXIgWE1MIGZpbGUsCi1hbmQgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQgaXMgdGhlIG9ubHkgb25lIHRoYXQgZXhpc3RzIGluIHlvdXIgWE1MIGZpbGUpLjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZTwvc3Bhbj4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIGFkZAotYW4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHRoYXQgeW91IHNlbGVjdGVkLiBBbnkgYXR0cmlidXRlcyB5b3UgYXJlIGFsbG93ZWQKLXRvIGFkZCB0byB0aGUgZWxlbWVudCB3aWxsIGJlIGxpc3RlZC4gQWZ0ZXIgeW91IGhhdmUgYWRkZWQgdGhlIGF0dHJpYnV0ZSB0bwotdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrIGluIHRoZSByaWdodC1oYW5kIGNvbHVtbiB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mCi10aGUgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIGhhcyBzZXQgdmFsdWVzLCB0aGV5IHdpbGwgYXBwZWFyIGluIGEgbGlzdC48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4gLSBDbGljayB0aGlzIHRvIGFkZCBhbm90aGVyIGVsZW1lbnQsCi1hIGNvbW1lbnQsIG9yIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgZWxlbWVudC48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBCZWZvcmU8L3NwYW4+ICAtIENsaWNrIHRoaXMgdG8gYWRkIGEgY2hpbGQgZWxlbWVudCwKLWNvbW1lbnQsIG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYmVmb3JlIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLgotRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgY2FsbGVkICJDRCBDb2xsZWN0aW9ucyIgdGhhdCBjYW4KLWNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgIkNEIiwgeW91IGNvdWxkIGNsaWNrIGEgQ0QKLWVsZW1lbnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEJlZm9yZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gQ0Q8L3NwYW4+Ci08L3NwYW4+ICwgYXMgYSBDRCBlbGVtZW50IGNhbiBnbyBiZWZvcmUgYW5vdGhlciBDRCBlbGVtZW50LjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFmdGVyPC9zcGFuPiAtIENsaWNrIHRoaXMgdG8gYWRkIGEgY2hpbGQgZWxlbWVudCwKLWNvbW1lbnQsIG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYWZ0ZXIgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQuCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgIkNEIENvbGxlY3Rpb25zIiB0aGF0IGNhbgotY29udGFpbiBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCAiQ0QiLCB5b3UgY291bGQgY2xpY2sgYSBDRAotZWxlbWVudCBhbmQgY2xpY2sgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFmdGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBDRDwvc3Bhbj4KLTwvc3Bhbj4sIGFzIGEgQ0QgZWxlbWVudCBjYW4gZ28gYWZ0ZXIgYW5vdGhlciBDRCBlbGVtZW50LjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVwbGFjZSBXaXRoPC9zcGFuPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gcmVwbGFjZQotb25lIGl0ZW0gd2l0aCBhbm90aGVyLiBUaGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIGlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMKLW9mZiBvciBpZiB0aGVyZSBhcmUgbm8gdmFsaWQgYWx0ZXJuYXRpdmVzIGZvciB5b3UgdG8gcmVwbGFjZSB0aGUgaXRlbSB3aXRoLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSBhcHByb3ByaWF0ZSBvcHRpb24uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFueSBjaGFuZ2VzIHlvdSBtYWtlIGluIHRoZSBEZXNpZ24gdmlldyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhlCi1Tb3VyY2UgdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgdGl0bGU9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHByb2MuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBwYXNzIGFsb25nIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnhtbGJpY29ucy5odG1sIiB0aXRsZT0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMThiNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4ZWR0c3JjIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UNCi1jb2RlIGRpcmVjdGx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPmluIHRoZSBTb3VyY2UNCi12aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gVGhlIFNvdXJjZSB2aWV3IGhhcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhczo8L3A+PGRsPg0KLTxkbGVudHJ5Pg0KLTxkdD5TeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4NCi08ZGQ+RWFjaCB0YWcgdHlwZSBpcyBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSwgZW5hYmxpbmcgeW91IHRvIGVhc2lseSBmaW5kDQotYSBjZXJ0YWluIGtpbmQgb2YgdGFnIGZvciBlZGl0aW5nLiBJbiBhZGRpdGlvbiwgc3ludGF4IGhpZ2hsaWdodGluZyBpcyB2YWx1YWJsZQ0KLWluIGxvY2F0aW5nIHN5bnRheCBlcnJvcnMuIEZvciBleGFtcGxlLCBpZiB5b3UgYmVnaW4gYSBjb21tZW50IGluIHRoZSBtaWRkbGUNCi1vZiB0aGUgZG9jdW1lbnQgd2l0aCA8Y29kZXBoPiZsdDshLS08L2NvZGVwaD4gZXZlcnl0aGluZyB1bnRpbCB0aGUgbmV4dCA8Y29kZXBoPi0tPjwvY29kZXBoPiBpcw0KLWNvbnNpZGVyZWQgYSBjb21tZW50LCBhbmQgd2lsbCBiZSBoaWdobGlnaHRlZCBhY2NvcmRpbmdseS4gVGhlIGxhcmdlIGhpZ2hsaWdodGVkDQotYXJlYSB3aWxsIGluZGljYXRlIHRoYXQgeW91IG5lZWQgdG8gYWRkIDxjb2RlcGg+LS0+PC9jb2RlcGg+IHRvIGNsb3NlIHRoZQ0KLWNvbW1lbnQuPHA+WW91IGNhbiBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcuIFJlZmVyIHRvIHRoZSByZWxhdGVkDQotdGFza3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PGRsPjxkbGVudHJ5Pg0KLTxkdD5VbmxpbWl0ZWQgdW5kbyBhbmQgcmVkbzwvZHQ+DQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQ0KLXRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZSBpbmNyZW1lbnRlZA0KLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Db250ZW50IGFzc2lzdDwvZHQ+DQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBmaW5pc2ggdGFncyBhbmQgaW5zZXJ0IG1hY3Jvcy4gPD9QdWIgQ2FyZXQ/PlJlZmVyDQotdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IgbW9yZSBkZXRhaWxzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UZW1wbGF0ZTwvZHQ+DQotPGRkPllvdSBjYW4gYWNjZXNzIHRlbXBsYXRlcyAodXNpbmcgY29udGVudCBhc3Npc3QpIHRvIGhlbHAgeW91IHF1aWNrbHkgYWRkDQotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Tm9kZSBzZWxlY3Rpb248L2R0Pg0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwNCi10aGUgbm9kZSBzZWxlY3Rpb24gaW5kaWNhdG9yIGhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBub2RlDQotKGZvciBleGFtcGxlLCBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSksIGluIHRoZSB2ZXJ0aWNhbCBydWxlciBpbiB0aGUgbGVmdA0KLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Qb3AtdXAgbWVudSBvcHRpb25zPC9kdD4NCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zDQotYXZhaWxhYmxlIGFzIHlvdSBkbyBmcm9tIHRoZSB3b3JrYmVuY2ggIDxiPkVkaXQ8L2I+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUNCi1vcHRpb25zIHN1Y2ggYXM6IDx1aWNvbnRyb2w+Q2xlYW51cCBEb2N1bWVudCw8L3VpY29udHJvbD4gdG8gb3BlbiB0aGUgPHVpY29udHJvbD5DbGVhbnVwPC91aWNvbnRyb2w+IA0KLWRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZA0KLWFuZCBmb3JtYXR0ZWQgYW5kIDx1aWNvbnRyb2w+Rm9ybWF0LDwvdWljb250cm9sPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUNCi1lbnRpcmUgZG9jdW1lbnQgb3Igc2VsZWN0ZWQgZWxlbWVudHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PiJTbWFydCIgZG91YmxlIGNsaWNraW5nPC9kdD4NCi08ZGQ+WW91IGNhbiB1c2UgZG91YmxlLWNsaWNrIHRvIHNlbGVjdCBhdHRyaWJ1dGUgdmFsdWVzLCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsDQotYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwgY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48cD5UbyBlZGl0IGFuIFhNTCBmaWxlIGluIHRoZSBTb3VyY2UgdmlldywgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgWE1MIGZpbGUgeW91IHdhbnQgdG8gd29yayB3aXRoIGluIHRoZSBYTUwgZWRpdG9yICAocmlnaHQtY2xpY2sNCi10aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPikuIDwvY21kPg0KLTxpbmZvPllvdSBtaWdodCBuZWVkIHRvIGNsaWNrIHRoZSA8dWljb250cm9sPlNvdXJjZTwvdWljb250cm9sPiB0YWIuIFR5cGljYWxseSwNCi1hbGwgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGRvIHRvIG9wZW4gdGhlIGZpbGUgaXMgdG8gZG91YmxlLWNsaWNrIGl0IGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LiBJZiB0aGlzIGRvZXMgbm90IHdvcmssIHJpZ2h0LWNsaWNrIGl0IGFuZCBjbGljayA8dWljb250cm9sPk9wZW4NCi1XaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RWRpdCB0aGUgY29kZSBhcyBuZWNlc3NhcnksIHVzaW5nIGFueSBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzLjwvY21kPg0KLTxpbmZvPkFzIHlvdSBtb3ZlIHRoZSBjdXJzb3Igd2l0aGluIHlvdXIgWE1MIGZpbGUgKG9yIHNlbGVjdCBpdGVtcyBmcm9tIHRoZQ0KLU91dGxpbmUgdmlldyksIHRoZSBub2RlIHNlbGVjdGlvbiBpbmRpY2F0b3Igd2lsbCBoaWdobGlnaHQgdGhlIGxpbmUgbnVtYmVycw0KLXRoYXQgZW5jb21wYXNzIHRoZSBub2RlIChmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLiBZb3UgY2FuIHVzZQ0KLXNtYXJ0IGRvdWJsZS1jbGlja2luZyBiZWhhdmlvciB0byBzZWxlY3QgYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlDQotcGFpcnMsIGFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsIGNvcHksIG9yIHJlbW92ZSBjb250ZW50LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BdCBpbnRlcnZhbHMsIHlvdSBtaWdodCB3aXNoIHRvIGZvcm1hdCBpbmRpdmlkdWFsIG5vZGVzLCBvciB0aGUNCi1lbnRpcmUgWE1MIGZpbGUgdG8gcmVzdG9yZSBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gdG8gc2VlIG5lc3RpbmcNCi1oaWVyYXJjaGllcyBtb3JlIGNsZWFybHkgaW4gdGhlIGZpbGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgZGVzaXJlZCwgdmFsaWRhdGUgYW5kIHNhdmUgdGhlIFhNTCBmaWxlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+QW55IGNoYW5nZXMgeW91IG1ha2UgaW4gdGhlIFNvdXJjZSB2aWV3IGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGUNCi1EZXNpZ24gdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQ0MjM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2YzQzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgU291cmNlIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgU291cmNlIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dGFnaGlsdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0c3JjIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0c3JjIj48YSBuYW1lPSJ0eGVkdHNyYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlCi1jb2RlIGRpcmVjdGx5LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXM6PC9wPgotPGRsPgotCi08ZHQgY2xhc3M9ImRsdGVybSI+U3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+Ci0KLTxkZD5FYWNoIHRhZyB0eXBlIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBlbmFibGluZyB5b3UgdG8gZWFzaWx5IGZpbmQKLWEgY2VydGFpbiBraW5kIG9mIHRhZyBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgdmFsdWFibGUKLWluIGxvY2F0aW5nIHN5bnRheCBlcnJvcnMuIEZvciBleGFtcGxlLCBpZiB5b3UgYmVnaW4gYSBjb21tZW50IGluIHRoZSBtaWRkbGUKLW9mIHRoZSBkb2N1bWVudCB3aXRoIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDshLS08L3NhbXA+IGV2ZXJ5dGhpbmcgdW50aWwgdGhlIG5leHQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+LS0mZ3Q7PC9zYW1wPiBpcwotY29uc2lkZXJlZCBhIGNvbW1lbnQsIGFuZCB3aWxsIGJlIGhpZ2hsaWdodGVkIGFjY29yZGluZ2x5LiBUaGUgbGFyZ2UgaGlnaGxpZ2h0ZWQKLWFyZWEgd2lsbCBpbmRpY2F0ZSB0aGF0IHlvdSBuZWVkIHRvIGFkZCA8c2FtcCBjbGFzcz0iY29kZXBoIj4tLSZndDs8L3NhbXA+IHRvIGNsb3NlIHRoZQotY29tbWVudC48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQKLXRhc2tzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGQ+Ci0KLTwvZGw+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+VW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0PgotCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQKLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkNvbnRlbnQgYXNzaXN0PC9kdD4KLQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBmaW5pc2ggdGFncyBhbmQgaW5zZXJ0IG1hY3Jvcy4gUmVmZXIKLXRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5UZW1wbGF0ZTwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIGFjY2VzcyB0ZW1wbGF0ZXMgKHVzaW5nIGNvbnRlbnQgYXNzaXN0KSB0byBoZWxwIHlvdSBxdWlja2x5IGFkZAotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Ob2RlIHNlbGVjdGlvbjwvZHQ+Ci0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwKLXRoZSBub2RlIHNlbGVjdGlvbiBpbmRpY2F0b3IgaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIG5vZGUKLShmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLCBpbiB0aGUgdmVydGljYWwgcnVsZXIgaW4gdGhlIGxlZnQKLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlBvcC11cCBtZW51IG9wdGlvbnM8L2R0PgotCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zCi1hdmFpbGFibGUgYXMgeW91IGRvIGZyb20gdGhlIHdvcmtiZW5jaCAgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUKLW9wdGlvbnMgc3VjaCBhczogPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2xlYW51cCBEb2N1bWVudCw8L3NwYW4+IHRvIG9wZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsZWFudXA8L3NwYW4+IAotZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkCi1hbmQgZm9ybWF0dGVkIGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JtYXQsPC9zcGFuPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUKLWVudGlyZSBkb2N1bWVudCBvciBzZWxlY3RlZCBlbGVtZW50cy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4iU21hcnQiIGRvdWJsZSBjbGlja2luZzwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIHVzZSBkb3VibGUtY2xpY2sgdG8gc2VsZWN0IGF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywKLWFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsIGNvcHksIG9yIHJlbW92ZSBjb250ZW50LjwvZGQ+Ci0KLTwvZGw+Ci08cD5UbyBlZGl0IGFuIFhNTCBmaWxlIGluIHRoZSBTb3VyY2UgdmlldywgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4gdGhlIFhNTCBmaWxlIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBpbiB0aGUgWE1MIGVkaXRvciAgKHJpZ2h0LWNsaWNrCi10aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+KS4gPC9zcGFuPgotIFlvdSBtaWdodCBuZWVkIHRvIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2U8L3NwYW4+IHRhYi4gVHlwaWNhbGx5LAotYWxsIHRoYXQgeW91IHdpbGwgbmVlZCB0byBkbyB0byBvcGVuIHRoZSBmaWxlIGlzIHRvIGRvdWJsZS1jbGljayBpdCBpbiB0aGUKLU5hdmlnYXRvciB2aWV3LiBJZiB0aGlzIGRvZXMgbm90IHdvcmssIHJpZ2h0LWNsaWNrIGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuCi1XaXRoICZndDsgWE1MIEVkaXRvcjwvc3Bhbj4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FZGl0IHRoZSBjb2RlIGFzIG5lY2Vzc2FyeSwgdXNpbmcgYW55IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMuPC9zcGFuPgotIEFzIHlvdSBtb3ZlIHRoZSBjdXJzb3Igd2l0aGluIHlvdXIgWE1MIGZpbGUgKG9yIHNlbGVjdCBpdGVtcyBmcm9tIHRoZQotT3V0bGluZSB2aWV3KSwgdGhlIG5vZGUgc2VsZWN0aW9uIGluZGljYXRvciB3aWxsIGhpZ2hsaWdodCB0aGUgbGluZSBudW1iZXJzCi10aGF0IGVuY29tcGFzcyB0aGUgbm9kZSAoZm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKS4gWW91IGNhbiB1c2UKLXNtYXJ0IGRvdWJsZS1jbGlja2luZyBiZWhhdmlvciB0byBzZWxlY3QgYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlCi1wYWlycywgYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwgY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkF0IGludGVydmFscywgeW91IG1pZ2h0IHdpc2ggdG8gZm9ybWF0IGluZGl2aWR1YWwgbm9kZXMsIG9yIHRoZQotZW50aXJlIFhNTCBmaWxlIHRvIHJlc3RvcmUgZWxlbWVudCBhbmQgYXR0cmlidXRlIGluZGVudGF0aW9uIHRvIHNlZSBuZXN0aW5nCi1oaWVyYXJjaGllcyBtb3JlIGNsZWFybHkgaW4gdGhlIGZpbGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgZGVzaXJlZCwgdmFsaWRhdGUgYW5kIHNhdmUgdGhlIFhNTCBmaWxlLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgU291cmNlIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQotRGVzaWduIHZpZXcgYW5kIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHRhZ2hpbHQuaHRtbCIgdGl0bGU9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIj5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNzYwMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4ZWR0dGFnIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MDQotZWRpdG9yPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIGl0IGluIHRoZSBOYXZpZ2F0b3INCi12aWV3IGFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5PcGVuIFdpdGg8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiA8L3A+PHA+V2UgcmVjb21tZW5kIHdvcmtpbmcgaW4gdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgWE1MIGZpbGVzLiBUaGUgdmlld3MgdGhhdCBhcHBlYXIgYnkgZGVmYXVsdA0KLWluIHRoaXMgcGVyc3BlY3RpdmUgKHN1Y2ggYXMgdGhlIE91dGxpbmUgdmlldykgaGVscCBmYWNpbGl0YXRlIFhNTCBkZXZlbG9wbWVudC48L3A+PHA+VGhlDQotWE1MIGVkaXRvciBlbmFibGVzIHlvdSB0byBkaXJlY3RseSBlZGl0IFhNTCBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50DQotdmlld3MgeW91IGNhbiB1c2UgdG8gZWRpdCB5b3VyIGZpbGVzOjwvcD48dWw+DQotPGxpPjxiPlNvdXJjZSB2aWV3PC9iPiAtIHlvdSBjYW4gbWFudWFsbHkgaW5zZXJ0LCBlZGl0LCBhbmQgZGVsZXRlIGVsZW1lbnRzDQotYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBUbyBmYWNpbGl0YXRlIHRoaXMgZWZmb3J0LA0KLXlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHdoaWxlIHlvdSBhcmUgaW4gdGhlIFNvdXJjZSB2aWV3LjwvbGk+DQotPGxpPjxiPkRlc2lnbiB2aWV3PC9iPiAtIHlvdSBjYW4gaW5zZXJ0LCBkZWxldGUsIGFuZCBlZGl0IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLA0KLWNvbW1lbnRzLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+DQotPGxpPjxiPk91dGxpbmUgdmlldyA8L2I+LSB5b3UgY2FuIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzIGF0dHJpYnV0ZXMsIGNvbW1lbnRzLA0KLWFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4NCi08L3VsPjxwPk9mdGVuLCB5b3UgbWF5IGZpbmQgdGhhdCB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHdheSB0byBwZXJmb3JtIGEgc3BlY2lmaWMNCi10YXNrLiBGb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIGZpbGUgIk15U2Nob29sU3ViamVjdHMueG1sIiBhc3NvY2lhdGVkDQotd2l0aCBhbiBYTUwgc2NoZW1hIGZpbGUgIlNjaG9vbFN1YmplY3RzLnhzZCIsIHdoaWNoIGxpc3QgYWxsIHRoZSBzdWJqZWN0cw0KLXRhdWdodCBpbiBhIHNjaG9vbC4gWW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgIk1hdGgiIGludG8geW91ciBmaWxlLg0KLVlvdSBjYW4gZG8gc28gaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD48dWw+DQotPGxpPkluIHRoZSBPdXRsaW5lIG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgYXBwcm9wcmlhdGUgcGFyZW50IGVsZW1lbnQNCi1hbmQgc2VsZWN0IDx1aWNvbnRyb2w+TWF0aDwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiBwb3AtdXANCi1tZW51LjwvbGk+DQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmQgdGhlIGFwcHJvcHJpYXRlDQotbG9jYXRpb24gYW5kIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudC48L2xpPg0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHR5cGUgdGhlIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudA0KLWluIHRoZSBmaWxlLjwvbGk+DQotPC91bD48L2NvbnRleHQ+DQotPHBvc3RyZXE+VGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBlZGl0b3INCi1hbmQgZWRpdGluZyBYTUwgZmlsZXM6PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YjY5Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGVkaXRpbmcsIFhNTCBlZGl0b3IiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGVkaXRpbmcsIFhNTCBlZGl0b3IiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0dGFnIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0dGFnIj48YSBuYW1lPSJ0eGVkdHRhZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIGl0IGluIHRoZSBOYXZpZ2F0b3IKLXZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRWRpdG9yPC9zcGFuPjwvc3Bhbj4uIDwvcD4KLTxwPldlIHJlY29tbWVuZCB3b3JraW5nIGluIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgWE1MIGZpbGVzLiBUaGUgdmlld3MgdGhhdCBhcHBlYXIgYnkgZGVmYXVsdAotaW4gdGhpcyBwZXJzcGVjdGl2ZSAoc3VjaCBhcyB0aGUgT3V0bGluZSB2aWV3KSBoZWxwIGZhY2lsaXRhdGUgWE1MIGRldmVsb3BtZW50LjwvcD4KLTxwPlRoZQotWE1MIGVkaXRvciBlbmFibGVzIHlvdSB0byBkaXJlY3RseSBlZGl0IFhNTCBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50Ci12aWV3cyB5b3UgY2FuIHVzZSB0byBlZGl0IHlvdXIgZmlsZXM6PC9wPgotPHVsPgotPGxpPjxzdHJvbmc+U291cmNlIHZpZXc8L3N0cm9uZz4gLSB5b3UgY2FuIG1hbnVhbGx5IGluc2VydCwgZWRpdCwgYW5kIGRlbGV0ZSBlbGVtZW50cwotYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBUbyBmYWNpbGl0YXRlIHRoaXMgZWZmb3J0LAoteW91IGNhbiB1c2UgY29udGVudCBhc3Npc3Qgd2hpbGUgeW91IGFyZSBpbiB0aGUgU291cmNlIHZpZXcuPC9saT4KLQotPGxpPjxzdHJvbmc+RGVzaWduIHZpZXc8L3N0cm9uZz4gLSB5b3UgY2FuIGluc2VydCwgZGVsZXRlLCBhbmQgZWRpdCBlbGVtZW50cywgYXR0cmlidXRlcywKLWNvbW1lbnRzLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+Ci0KLTxsaT48c3Ryb25nPk91dGxpbmUgdmlldyA8L3N0cm9uZz4tIHlvdSBjYW4gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMgYXR0cmlidXRlcywgY29tbWVudHMsCi1hbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+Ci0KLTwvdWw+Ci08cD5PZnRlbiwgeW91IG1heSBmaW5kIHRoYXQgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSB3YXkgdG8gcGVyZm9ybSBhIHNwZWNpZmljCi10YXNrLiBGb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIGZpbGUgIk15U2Nob29sU3ViamVjdHMueG1sIiBhc3NvY2lhdGVkCi13aXRoIGFuIFhNTCBzY2hlbWEgZmlsZSAiU2Nob29sU3ViamVjdHMueHNkIiwgd2hpY2ggbGlzdCBhbGwgdGhlIHN1YmplY3RzCi10YXVnaHQgaW4gYSBzY2hvb2wuIFlvdSB3YW50IHRvIGluc2VydCBhIG5ldyBlbGVtZW50ICJNYXRoIiBpbnRvIHlvdXIgZmlsZS4KLVlvdSBjYW4gZG8gc28gaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KLTx1bD4KLTxsaT5JbiB0aGUgT3V0bGluZSBvciBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGFwcHJvcHJpYXRlIHBhcmVudCBlbGVtZW50Ci1hbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGg8L3NwYW4+IGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4gcG9wLXVwCi1tZW51LjwvbGk+Ci0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5kIHRoZSBhcHByb3ByaWF0ZQotbG9jYXRpb24gYW5kIGNvZGUgZm9yIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXRoPC9zcGFuPiBlbGVtZW50LjwvbGk+Ci0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHR5cGUgdGhlIGNvZGUgZm9yIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXRoPC9zcGFuPiBlbGVtZW50Ci1pbiB0aGUgZmlsZS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBmb2xsb3dpbmcgbGlua3MgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZWRpdG9yCi1hbmQgZWRpdGluZyBYTUwgZmlsZXM6PC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlMjhhYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idHhtbGNhdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMNCi1hIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgKHdoaWNoIGNvbnRhaW5zDQotaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluDQotYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nDQotZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGNhdGFsb2c8aW5kZXh0ZXJtPmFkZGluZyBlbnRyaWVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgY2F0YWxvZzxpbmRleHRlcm0+aW1wb3J0aW5nIGVudHJpZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBjYXRhbG9nPGluZGV4dGVybT5leHBvcnRpbmcgZW50cmllczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLA0KLXlvdSBhcmUgd29ya2luZyBvbiBhbiBYTUwgZmlsZSBvbiB5b3VyIG1haW4gZGVza3RvcCBjb21wdXRlciBhbmQgcG9pbnQgaXRzIDxjb2RlcGg+c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdG93YXJkcw0KLWEgc2NoZW1hIGNhbGxlZCA8Y29kZXBoPmM6XE15U2NoZW1hLnhzZDwvY29kZXBoPi4gWW91IHRoZW4gc2F2ZSBpdCB0byB5b3VyDQotbGFwdG9wIGNvbXB1dGVyIHNvIHlvdSBjYW4gd29yayBvbiBpdCBsYXRlci4gV2hlbiB5b3Ugb3BlbiB0aGUgZmlsZSBvbiB5b3VyDQotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8Y29kZXBoPk15U2NoZW1hLnhzZDwvY29kZXBoPiBzY2hlbWENCi1iZWNhdXNlIGl0IGlzIGFjdHVhbGx5IGluc3RhbGxlZCBvbiB5b3VyIEQgZHJpdmUuIFlvdSB3aWxsIGhhdmUgdG8gZWRpdCB0aGUgPGNvZGVwaD5zY2hlbWFMb2NhdGlvbjwvY29kZXBoPiB0bw0KLXBvaW50IHRvIDxjb2RlcGg+ZDpcTXlTY2hlbWEueHNkPC9jb2RlcGg+LiBXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIGVkaXRpbmcNCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdA0KLXRoZSBVUkkgYWdhaW4gc28gdGhhdCBpdCBwb2ludHMgdG8gYSByZXNvdXJjZSB0aGF0IGlzIGFjY2Vzc2libGUgb24gdGhlIFdlYi4NCi1CeSBub3csIHRoZSBwcm9ibGVtIGlzIG9idmlvdXMuIEEgVVJJIHVzZWQgd2l0aGluIGFuIFhNTCBmaWxlIGlzIG5vdCBhcyBwb3J0YWJsZQ0KLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwNCi15b3UgY2FuIHVzZSB0aGUgWE1MIENhdGFsb2cuPC9wPjxwPkFuIFhNTCBDYXRhbG9nIGVudHJ5IGlzIHVzZWQgYnkgYW4gWE1MDQotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cNCi10byBzcGVjaWZ5IGhvdyBlbnRpdGllcyBzaG91bGQgYmUgcmVzb2x2ZWQuIElmIHlvdSBjb25zaWRlciB0aGUgcHJlY2VkaW5nDQotZXhhbXBsZSwgeW91IGNvdWxkIHNwZWNpZnkgYSBydWxlIHRoYXQgcmVkaXJlY3RzIGFuIEludGVybmV0IHJlc291cmNlIHJlZmVyZW5jZQ0KLShmb3IgZXhhbXBsZSwgIDxjb2RlcGg+Imh0dHA6Ly93d3cuaWJtLmNvbS9wdWJsaXNoZWQtc2NoZW1hcy9NeVNjaGVtYS54c2QiPC9jb2RlcGg+KQ0KLXNvIHRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2Ugb24gdGhlIGRldmVsb3BlcidzIGxvY2FsIG1hY2hpbmUgKGZvciBleGFtcGxlLA0KLSA8Y29kZXBoPiJmaWxlOi8vL0M6L015U2NoZW1hLnhzZCI8L2NvZGVwaD4pLiBOb3csIGluc3RlYWQgb2YgZnJlcXVlbnRseSBlZGl0aW5nDQotWE1MIGRvY3VtZW50cyB0byB1cGRhdGUgdGhlIFVSSXMgKGVzcGVjaWFsbHkgd2hlbiB0aGVyZSBhcmUgbWFueSBkb2N1bWVudHMNCi1pbiB5b3VyIHByb2plY3QpLCB5b3Ugb25seSBuZWVkIHRvIHVwZGF0ZSBhIHNpbmdsZSBydWxlIGluIHlvdXIgWE1MIENhdGFsb2cuPC9wPjxwPlRoZQ0KLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5DQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbnRyeSB0byB0aGUgWE1MDQotQ2F0YWxvZywgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCBhIERURCBvciBYTUwNCi1zY2hlbWEuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgQ2F0YWxvZzwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSAgPHVpY29udHJvbD5YTUwgQ2F0YWxvZyBFbnRyaWVzPC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zDQotYSBsaXN0IG9mIGFueSB1c2VyLWRlZmluZWQgYW5kIHBsdWctaW4gZGVmaW5lZCBjYXRhbG9nIGVudHJpZXMuPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IGFueSBlbnRyeSB0byBzZWUgZGV0YWlscyBhYm91dCBpdCBpbiB0aGUgPHVpY29udHJvbD5EZXRhaWxzPC91aWNvbnRyb2w+IGZpZWxkLiA8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiB0byBjcmVhdGUgYSBuZXcgY2F0YWxvZyBlbnRyeS48L2NtZD4NCi08L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5VUkk8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgdGhlIGxvY2F0aW9uIG9mIHRoZQ0KLURURCBvciBYTUwgc2NoZW1hIG9yIGJyb3dzZSBmb3IgaXQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNwZWNpZmllZCBhIERURCBpbiB0aGUgPHVpY29udHJvbD5VUkk8L3VpY29udHJvbD4gZmllbGQsDQoteW91IGNhbiBzZWxlY3QgZWl0aGVyIDx1aWNvbnRyb2w+UHVibGljIElEPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+U3lzdGVtDQotSUQ8L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5LZXkgVHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD48aW5mbz5JZg0KLXlvdSBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMgSUQsPC91aWNvbnRyb2w+IHRoZSB2YWx1ZSB5b3UgZW50ZXIgaW4gdGhlIDx1aWNvbnRyb2w+S2V5PC91aWNvbnRyb2w+IGZpZWxkDQotc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBQdWJsaWMgSUQgaW4gdGhlIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4NCi1JZiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+U3lzdGVtIElEPC91aWNvbnRyb2w+LCB0aGUgdmFsdWUgeW91IGVudGVyIHNob3VsZA0KLWNvcnJlc3BvbmQgdG8gdGhlIFN5c3RlbSBJRCBpbiBhbiBYTUwgZmlsZSdzIERPQ1RZUEUgZGVjbGFyYXRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBzcGVjaWZpZWQgYW4gWE1MIHNjaGVtYSBpbiB0aGUgPHVpY29udHJvbD5VUkk8L3VpY29udHJvbD4gZmllbGQsDQoteW91IGNhbiBzZWxlY3QgZWl0aGVyIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gb3IgIDx1aWNvbnRyb2w+U2NoZW1hDQotTG9jYXRpb248L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5LZXkgVHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz5JZiB0aGUgc2NoZW1hIGRlZmluZXMgYSB0YXJnZXQgbmFtZXNwYWNlLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYXBwZWFyDQotaW4gdGhlIDx1aWNvbnRyb2w+S2V5PC91aWNvbnRyb2w+IGZpZWxkLiBPdGhlcndpc2UsIHlvdSBjYW4gZW50ZXIgdGhlIHNjaGVtYQ0KLWxvY2F0aW9uIGluIHRoZSA8dWljb250cm9sPktleTwvdWljb250cm9sPiBmaWVsZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlNwZWNpZnkgYWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3M8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHJlc291cmNlLjwvY21kPg0KLTxpbmZvPlRoaXMgV2ViIGFkZHJlc3MgaXMgdXNlZCB3aGVuIGFuIFhNTCBpbnN0YW5jZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGlzDQotY2F0YWxvZyBlbnRyeS4gIDxiPk5vdGU8L2I+OiBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+UHVibGljDQotSUQ8L3VpY29udHJvbD4gKGZvciBhIERURCkgb3IgIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gKGZvcg0KLWEgc2NoZW1hKSBpbiB0aGUgIDx1aWNvbnRyb2w+S2V5IHR5cGU8L3VpY29udHJvbD4gZmllbGQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFub3RoZXIgY2F0YWxvZyB3aXRob3V0IGltcG9ydGluZyBpdCBpbnRvDQotdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHVpY29udHJvbD5OZXh0IENhdGFsb2c8L3VpY29udHJvbD4uIFR5cGUgb3IgYnJvd3NlIGZvcg0KLXRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudCB0byByZWZlciB0by4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QWR2YW5jZWQ8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8gaW1wb3J0IG9yDQotZXhwb3J0IGFueSBYTUwgQ2F0YWxvZyBzZXR0aW5ncy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5FeHBvcnQ8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8gcGVyc2lzdCB0aGUNCi1YTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbi4gT25seSB5b3VyIHVzZXIgc3BlY2lmaWVkIGVudHJpZXMgd2lsbCBiZSBleHBvcnRlZC48L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5Zb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBzZWxlY3QgYSBwcm9qZWN0IGFuZCBwcm92aWRlIGEgZmlsZQ0KLW5hbWUgdG8gc3RvcmUgeW91ciBjYXRhbG9nIGVudHJpZXMgaW4gYW4gLnhtbGNhdGFsb2cgZmlsZSwgd2hpY2ggY2FuIGJlIG9wZW5lZA0KLWZyb20gdGhlIE5hdmlnYXRvciB2aWV3LiBTbmNlIHlvdXIgY2F0YWxvZyBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gYW4gLnhtbGNhdGFsb2cNCi1maWxlLCB5b3UgY2FuIGNoZWNrIHRoZW0gaW4gYW5kIG91dCBhbmQgc2hhcmUgdGhlbSBsaWtlIGFueSBvdGhlciBwcm9qZWN0DQotcmVzb3VyY2UuIDwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+IGlmIHlvdSB3YW50IHRvIGltcG9ydCBhbiAueG1sY2F0YWxvZw0KLWZpbGUuPD9QdWIgQ2FyZXQ/PiBZb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBzZWxlY3QgdGhlIGZpbGUgeW91IHdhbnQgdG8gaW1wb3J0LjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPldoZW4geW91IGltcG9ydCBhIC54bWxjYXRhbG9nIGZpbGUsIGFueSBlbnRyaWVzIGluIGl0IHdpbGwgYmUNCi1sb2FkZWQgaW50byB0aGUgWE1MIENhdGFsb2cgKGFuZCBhbnkgZXhpc3RpbmcgZW50cmllcyB3aWxsIGJlIG92ZXJ3cml0dGVuKS4gPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIGNsb3NlIHRoZSBBZHZhbmNlZCBYTUwgQ2F0YWxvZw0KLVByZWZlcmVuY2VzIGRpYWxvZy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5NYWtlIHN1cmUgdGhlIFhNTCBmaWxlIGlzIGluIGZvY3VzIGFuZCBjbGljayB0aGUgPHVpY29udHJvbD5SZWxvYWQNCi1kZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gdG9vbGJhciBidXR0b24uIDwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIFhNTCBmaWxlIGlzIG5vdyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBYTUwNCi1zY2hlbWEgb3IgRFRELjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA3MDg3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE3MmI0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgY2F0YWxvZywgYWRkaW5nIGVudHJpZXMsIGltcG9ydGluZyBlbnRyaWVzLCBleHBvcnRpbmcgZW50cmllcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcywgaW1wb3J0aW5nIGVudHJpZXMsIGV4cG9ydGluZyBlbnRyaWVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhtbGNhdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhtbGNhdCI+PGEgbmFtZT0idHhtbGNhdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9oMT4KLQotCi0KLQotPGRpdj48cD5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cwotYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpICh3aGljaCBjb250YWlucwotaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluCi1hbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cKLWVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLAoteW91IGFyZSB3b3JraW5nIG9uIGFuIFhNTCBmaWxlIG9uIHlvdXIgbWFpbiBkZXNrdG9wIGNvbXB1dGVyIGFuZCBwb2ludCBpdHMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+c2NoZW1hTG9jYXRpb248L3NhbXA+IHRvd2FyZHMKLWEgc2NoZW1hIGNhbGxlZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5jOlxNeVNjaGVtYS54c2Q8L3NhbXA+LiBZb3UgdGhlbiBzYXZlIGl0IHRvIHlvdXIKLWxhcHRvcCBjb21wdXRlciBzbyB5b3UgY2FuIHdvcmsgb24gaXQgbGF0ZXIuIFdoZW4geW91IG9wZW4gdGhlIGZpbGUgb24geW91cgotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5NeVNjaGVtYS54c2Q8L3NhbXA+IHNjaGVtYQotYmVjYXVzZSBpdCBpcyBhY3R1YWxseSBpbnN0YWxsZWQgb24geW91ciBEIGRyaXZlLiBZb3Ugd2lsbCBoYXZlIHRvIGVkaXQgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0bwotcG9pbnQgdG8gPHNhbXAgY2xhc3M9ImNvZGVwaCI+ZDpcTXlTY2hlbWEueHNkPC9zYW1wPi4gV2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCBlZGl0aW5nCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdAotdGhlIFVSSSBhZ2FpbiBzbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgYWNjZXNzaWJsZSBvbiB0aGUgV2ViLgotQnkgbm93LCB0aGUgcHJvYmxlbSBpcyBvYnZpb3VzLiBBIFVSSSB1c2VkIHdpdGhpbiBhbiBYTUwgZmlsZSBpcyBub3QgYXMgcG9ydGFibGUKLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwKLXlvdSBjYW4gdXNlIHRoZSBYTUwgQ2F0YWxvZy48L3A+Ci08cD5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBpcyB1c2VkIGJ5IGFuIFhNTAotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cKLXRvIHNwZWNpZnkgaG93IGVudGl0aWVzIHNob3VsZCBiZSByZXNvbHZlZC4gSWYgeW91IGNvbnNpZGVyIHRoZSBwcmVjZWRpbmcKLWV4YW1wbGUsIHlvdSBjb3VsZCBzcGVjaWZ5IGEgcnVsZSB0aGF0IHJlZGlyZWN0cyBhbiBJbnRlcm5ldCByZXNvdXJjZSByZWZlcmVuY2UKLShmb3IgZXhhbXBsZSwgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiJodHRwOi8vd3d3LmlibS5jb20vcHVibGlzaGVkLXNjaGVtYXMvTXlTY2hlbWEueHNkIjwvc2FtcD4pCi1zbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIG9uIHRoZSBkZXZlbG9wZXIncyBsb2NhbCBtYWNoaW5lIChmb3IgZXhhbXBsZSwKLSA8c2FtcCBjbGFzcz0iY29kZXBoIj4iZmlsZTovLy9DOi9NeVNjaGVtYS54c2QiPC9zYW1wPikuIE5vdywgaW5zdGVhZCBvZiBmcmVxdWVudGx5IGVkaXRpbmcKLVhNTCBkb2N1bWVudHMgdG8gdXBkYXRlIHRoZSBVUklzIChlc3BlY2lhbGx5IHdoZW4gdGhlcmUgYXJlIG1hbnkgZG9jdW1lbnRzCi1pbiB5b3VyIHByb2plY3QpLCB5b3Ugb25seSBuZWVkIHRvIHVwZGF0ZSBhIHNpbmdsZSBydWxlIGluIHlvdXIgWE1MIENhdGFsb2cuPC9wPgotPHA+VGhlCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGVudHJ5IHRvIHRoZSBYTUwKLUNhdGFsb2csIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHRoZSBYTUwgZmlsZSB0aGF0IHlvdSB3YW50IHRvIGFzc29jaWF0ZSB3aXRoIGEgRFREIG9yIFhNTAotc2NoZW1hLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nIEVudHJpZXM8L3NwYW4+IGZpZWxkIGNvbnRhaW5zCi1hIGxpc3Qgb2YgYW55IHVzZXItZGVmaW5lZCBhbmQgcGx1Zy1pbiBkZWZpbmVkIGNhdGFsb2cgZW50cmllcy48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+U2VsZWN0IGFueSBlbnRyeSB0byBzZWUgZGV0YWlscyBhYm91dCBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGV0YWlsczwvc3Bhbj4gZmllbGQuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBjYXRhbG9nIGVudHJ5Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4gZmllbGQsIHR5cGUgdGhlIGxvY2F0aW9uIG9mIHRoZQotRFREIG9yIFhNTCBzY2hlbWEgb3IgYnJvd3NlIGZvciBpdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc3BlY2lmaWVkIGEgRFREIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VUkk8L3NwYW4+IGZpZWxkLAoteW91IGNhbiBzZWxlY3QgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYyBJRDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtCi1JRDwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IFR5cGU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gSWYKLXlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljIElELDwvc3Bhbj4gdGhlIHZhbHVlIHlvdSBlbnRlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5PC9zcGFuPiBmaWVsZAotc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBQdWJsaWMgSUQgaW4gdGhlIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4KLUlmIHlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtIElEPC9zcGFuPiwgdGhlIHZhbHVlIHlvdSBlbnRlciBzaG91bGQKLWNvcnJlc3BvbmQgdG8gdGhlIFN5c3RlbSBJRCBpbiBhbiBYTUwgZmlsZSdzIERPQ1RZUEUgZGVjbGFyYXRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc3BlY2lmaWVkIGFuIFhNTCBzY2hlbWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4gZmllbGQsCi15b3UgY2FuIHNlbGVjdCBlaXRoZXIgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IG9yICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY2hlbWEKLUxvY2F0aW9uPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXkgVHlwZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotIElmIHRoZSBzY2hlbWEgZGVmaW5lcyBhIHRhcmdldCBuYW1lc3BhY2UsIGl0IHdpbGwgYXV0b21hdGljYWxseSBhcHBlYXIKLWluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXk8L3NwYW4+IGZpZWxkLiBPdGhlcndpc2UsIHlvdSBjYW4gZW50ZXIgdGhlIHNjaGVtYQotbG9jYXRpb24gaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleTwvc3Bhbj4gZmllbGQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZnkgYWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3M8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHJlc291cmNlLjwvc3Bhbj4KLSBUaGlzIFdlYiBhZGRyZXNzIGlzIHVzZWQgd2hlbiBhbiBYTUwgaW5zdGFuY2UgaXMgZ2VuZXJhdGVkIGZyb20gdGhpcwotY2F0YWxvZyBlbnRyeS4gIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMKLUlEPC9zcGFuPiAoZm9yIGEgRFREKSBvciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IChmb3IKLWEgc2NoZW1hKSBpbiB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSB0eXBlPC9zcGFuPiBmaWVsZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFub3RoZXIgY2F0YWxvZyB3aXRob3V0IGltcG9ydGluZyBpdCBpbnRvCi10aGUgd29ya2JlbmNoLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0IENhdGFsb2c8L3NwYW4+LiBUeXBlIG9yIGJyb3dzZSBmb3IKLXRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudCB0byByZWZlciB0by4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLWNsb3NlIHRoZSBBZGQgWE1MIENhdGFsb2cgRW50cnkgZGlhbG9nLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZHZhbmNlZDwvc3Bhbj4gaWYgeW91IHdhbnQgdG8gaW1wb3J0IG9yCi1leHBvcnQgYW55IFhNTCBDYXRhbG9nIHNldHRpbmdzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+IGlmIHlvdSB3YW50IHRvIHBlcnNpc3QgdGhlCi1YTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbi4gT25seSB5b3VyIHVzZXIgc3BlY2lmaWVkIGVudHJpZXMgd2lsbCBiZSBleHBvcnRlZC48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+WW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2VsZWN0IGEgcHJvamVjdCBhbmQgcHJvdmlkZSBhIGZpbGUKLW5hbWUgdG8gc3RvcmUgeW91ciBjYXRhbG9nIGVudHJpZXMgaW4gYW4gLnhtbGNhdGFsb2cgZmlsZSwgd2hpY2ggY2FuIGJlIG9wZW5lZAotZnJvbSB0aGUgTmF2aWdhdG9yIHZpZXcuIFNuY2UgeW91ciBjYXRhbG9nIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBhbiAueG1sY2F0YWxvZwotZmlsZSwgeW91IGNhbiBjaGVjayB0aGVtIGluIGFuZCBvdXQgYW5kIHNoYXJlIHRoZW0gbGlrZSBhbnkgb3RoZXIgcHJvamVjdAotcmVzb3VyY2UuIDwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+IGlmIHlvdSB3YW50IHRvIGltcG9ydCBhbiAueG1sY2F0YWxvZwotZmlsZS4gWW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2VsZWN0IHRoZSBmaWxlIHlvdSB3YW50IHRvIGltcG9ydC48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+V2hlbiB5b3UgaW1wb3J0IGEgLnhtbGNhdGFsb2cgZmlsZSwgYW55IGVudHJpZXMgaW4gaXQgd2lsbCBiZQotbG9hZGVkIGludG8gdGhlIFhNTCBDYXRhbG9nIChhbmQgYW55IGV4aXN0aW5nIGVudHJpZXMgd2lsbCBiZSBvdmVyd3JpdHRlbikuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIGNsb3NlIHRoZSBBZHZhbmNlZCBYTUwgQ2F0YWxvZwotUHJlZmVyZW5jZXMgZGlhbG9nLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB0aGUgWE1MIGZpbGUgaXMgaW4gZm9jdXMgYW5kIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWxvYWQKLWRlcGVuZGVuY2llczwvc3Bhbj4gdG9vbGJhciBidXR0b24uIDwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgWE1MIGZpbGUgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIFhNTAotc2NoZW1hIG9yIERURC48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzICh0aGF0IGlzLCBhIHNldCBvZiBydWxlcykgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDIyNzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idHhwcmVmcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTA0KLWVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50DQotYXNzaXN0IHJ1bGVzLiAgVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiBpbiB0aGUgU291cmNlDQotdmlldyBmb3IgeW91ciBYTUwgZG9jdW1lbnQsIGFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Gb3JtYXQ8L3VpY29udHJvbD4NCi08dWljb250cm9sPkRvY3VtZW50PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+c2V0dGluZzxpbmRleHRlcm0+bGluZSB3cmFwcGluZw0KLXJ1bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5zZXR0aW5nPGluZGV4dGVybT5jb250ZW50DQotYXNzaXN0IHJ1bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5zZXR0aW5nPGluZGV4dGVybT5pbmRlbnRhdGlvbg0KLXN0eWxlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBkZWZpbmUgWE1MIHByZWZlcmVuY2VzLCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotU291cmNlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RW50ZXIgYSBtYXhpbXVtIHdpZHRoIGZvciBmb3JtYXR0ZWQgbGluZXMgaW4gdGhlIDx1aWNvbnRyb2w+TGluZQ0KLXdpZHRoPC91aWNvbnRyb2w+IGZpZWxkPC9jbWQ+PGluZm8+VGhlIGRlZmF1bHQgdmFsdWUgaXMgNzIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPlNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lPC91aWNvbnRyb2w+IHRvDQotc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgYmxhbmsgbGluZXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQsDQotc2VsZWN0IHRoZSA8dWljb250cm9sPkNsZWFyIGFsbCBibGFuayBsaW5lczwvdWljb250cm9sPiBjaGVjayBib3guIDwvY21kPg0KLTxpbmZvPkJ5IGRlZmF1bHQsIGJsYW5rIGxpbmVzIGFyZSBwcmVzZXJ2ZWQgaW4gYSBmb3JtYXR0ZWQgZG9jdW1lbnQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPkluZGVudCB1c2luZyB0YWJzPC91aWNvbnRyb2w+IGlmIHlvdSB3YW50IHRvDQotdXNlIHRhYiBjaGFyYWN0ZXJzIChcdCkgYXMgdGhlIHN0YW5kYXJkIGZvcm1hdHRpbmcgaW5kZW50YXRpb24sIG9yLCBpZiB5b3UNCi1wcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDx1aWNvbnRyb2w+SW5kZW50IHVzaW5nIHNwYWNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgPHVpY29udHJvbD5JbmRlbnRhdGlvbiBzaXplPC91aWNvbnRyb2w+IHdoaWNoDQotaXMgdGhlIG51bWJlciBvZiB0YWJzIG9yIHNwYWNlIGNoYXJhY3RlcnMgdXNlZCBmb3IgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIHNwZWNpZnkgY2VydGFpbiBjaGFyYWN0ZXJzICgnJmx0OycgaXMgZGVmYXVsdCkgdGhhdCB3aWxsDQotY2F1c2UgdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkuIEVuc3VyZSB0aGUgPHVpY29udHJvbD5BdXRvbWF0aWNhbGx5DQotbWFrZSBzdWdnZXN0aW9uczwvdWljb250cm9sPiBjaGVjayBib3ggaXMgc2VsZWN0ZWQgYW5kIHNwZWNpZnkgdGhlIGNoYXJhY3RlcnMNCi1pbiB0aGUgPHVpY29udHJvbD5Qcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvdWljb250cm9sPiBmaWVsZC4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNlbGVjdCA8Yj5TdHJpY3Q8L2I+IGZyb20gdGhlIDxiPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L2I+IGxpc3QsDQotc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIHNob3duIGZpcnN0ICh3aXRoIGJvbGQgaWNvbnMpDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQNCi1zY29wZSwgYnV0IG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIHNob3duIGJlbG93IHRoZW0gd2l0aCBhIGRlLWVtcGhhc2l6ZWQNCi1pY29uLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyA8Yj5MYXg8L2I+LjwvY21kPjw/UHViIENhcmV0MT8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuIDwvY21kPjxpbmZvPklmIHRoaXMgYm94IGlzIHNlbGVjdGVkLCB3aGVuIHlvdQ0KLWhhdmUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIHlvdSB3aWxsDQotc3RpbGwgYmUgYWJsZSB0byBnZXQgY29udGVudCBhc3Npc3QgLSB0aGUgdG9vbCB3aWxsIGluZmVyIHdoYXQgc2hvdWxkIGNvbWUNCi1uZXh0IGluIHlvdXIgZmlsZSBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgY29udGVudC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM2MjQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTU5OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50IGFzc2lzdCBydWxlcy4gVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiBpbiB0aGUgU291cmNlIHZpZXcgZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgRm9ybWF0ICZndDsgRG9jdW1lbnQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50IGFzc2lzdCBydWxlcy4gVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiBpbiB0aGUgU291cmNlIHZpZXcgZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgRm9ybWF0ICZndDsgRG9jdW1lbnQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc2V0dGluZywgbGluZSB3cmFwcGluZyBydWxlcywgY29udGVudCBhc3Npc3QgcnVsZXMsIGluZGVudGF0aW9uIHN0eWxlIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc2V0dGluZywgbGluZSB3cmFwcGluZyBydWxlcywgY29udGVudCBhc3Npc3QgcnVsZXMsIGluZGVudGF0aW9uIHN0eWxlIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eHByZWZzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhwcmVmcyI+PGEgbmFtZT0idHhwcmVmcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwKLWVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50Ci1hc3Npc3QgcnVsZXMuICBUbyBhcHBseSB0aGUgZm9ybWF0dGluZyBzdHlsZXMsIHJpZ2h0LWNsaWNrIGluIGluIHRoZSBTb3VyY2UKLXZpZXcgZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JtYXQ8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudDwvc3Bhbj48L3NwYW4+LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gZGVmaW5lIFhNTCBwcmVmZXJlbmNlcywgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLVNvdXJjZTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIGEgbWF4aW11bSB3aWR0aCBmb3IgZm9ybWF0dGVkIGxpbmVzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5MaW5lCi13aWR0aDwvc3Bhbj4gZmllbGQ8L3NwYW4+IFRoZSBkZWZhdWx0IHZhbHVlIGlzIDcyLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lPC9zcGFuPiB0bwotc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgYmxhbmsgbGluZXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQsCi1zZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsZWFyIGFsbCBibGFuayBsaW5lczwvc3Bhbj4gY2hlY2sgYm94LiA8L3NwYW4+Ci0gQnkgZGVmYXVsdCwgYmxhbmsgbGluZXMgYXJlIHByZXNlcnZlZCBpbiBhIGZvcm1hdHRlZCBkb2N1bWVudC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudCB1c2luZyB0YWJzPC9zcGFuPiBpZiB5b3Ugd2FudCB0bwotdXNlIHRhYiBjaGFyYWN0ZXJzIChcdCkgYXMgdGhlIHN0YW5kYXJkIGZvcm1hdHRpbmcgaW5kZW50YXRpb24sIG9yLCBpZiB5b3UKLXByZWZlciB0byB1c2Ugc3BhY2VzLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5kZW50IHVzaW5nIHNwYWNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5kZW50YXRpb24gc2l6ZTwvc3Bhbj4gd2hpY2gKLWlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIHNwZWNpZnkgY2VydGFpbiBjaGFyYWN0ZXJzICgnJmx0OycgaXMgZGVmYXVsdCkgdGhhdCB3aWxsCi1jYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4gRW5zdXJlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdXRvbWF0aWNhbGx5Ci1tYWtlIHN1Z2dlc3Rpb25zPC9zcGFuPiBjaGVjayBib3ggaXMgc2VsZWN0ZWQgYW5kIHNwZWNpZnkgdGhlIGNoYXJhY3RlcnMKLWluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvc3Bhbj4gZmllbGQuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHNlbGVjdCA8c3Ryb25nPlN0cmljdDwvc3Ryb25nPiBmcm9tIHRoZSA8c3Ryb25nPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L3N0cm9uZz4gbGlzdCwKLXN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBzaG93biBmaXJzdCAod2l0aCBib2xkIGljb25zKQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQKLXNjb3BlLCBidXQgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQsIHdpbGwgYmUgc2hvd24gYmVsb3cgdGhlbSB3aXRoIGEgZGUtZW1waGFzaXplZAotaWNvbi4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgPHN0cm9uZz5MYXg8L3N0cm9uZz4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC9zcGFuPiBjaGVjawotYm94IGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuIDwvc3Bhbj4gSWYgdGhpcyBib3ggaXMgc2VsZWN0ZWQsIHdoZW4geW91Ci1oYXZlIGFuIFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCB5b3Ugd2lsbAotc3RpbGwgYmUgYWJsZSB0byBnZXQgY29udGVudCBhc3Npc3QgLSB0aGUgdG9vbCB3aWxsIGluZmVyIHdoYXQgc2hvdWxkIGNvbWUKLW5leHQgaW4geW91ciBmaWxlIGJhc2VkIG9uIHRoZSBleGlzdGluZyBjb250ZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE2YmRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eHNpdHlwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Vc2luZyB4c2k6dHlwZTwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXNpbmcgeHNpOnR5cGU8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLA0KLXhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZQ0KLWFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuPC9zaG9ydGRlc2M+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gYWxsb3dzIHlvdSB0byBkZXJpdmUgdHlwZXMgYnkgZXh0ZW5zaW9uLg0KLUZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbiBYTUwgc2NoZW1hIGFuZCB5b3UgY3JlYXRlIGEgY29tcGxleCB0eXBlIGZvciBpdCBjYWxsZWQNCi0gPHVzZXJpbnB1dD5BZGRyZXNzPC91c2VyaW5wdXQ+LiBZb3UgdGhlbiBhZGQgc29tZSBiYXNpYyBlbGVtZW50cyB0byA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD4sDQotc3VjaCBhcyA8dXNlcmlucHV0PnN0cmVldE5hbWU8L3VzZXJpbnB1dD4gYW5kIDx1c2VyaW5wdXQ+Y2l0eTwvdXNlcmlucHV0Pi48L3A+PHA+QWZ0ZXINCi10aGlzLCB5b3UgZGVyaXZlIChieSBleHRlbnNpb24pIHR3byBuZXcgY29tcGxleCB0eXBlcyBmcm9tICA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD4gLSA8dXNlcmlucHV0PlVTQWRkcmVzczwvdXNlcmlucHV0PiBhbmQgPHVzZXJpbnB1dD5VS0FkZHJlc3M8L3VzZXJpbnB1dA0KLT4gWW91IGFkZCBhIG5ldyBlbGVtZW50IHRvIDx1c2VyaW5wdXQ+VVNBZGRyZXNzPC91c2VyaW5wdXQ+IGNhbGxlZCAgPHVzZXJpbnB1dD5zdGF0ZTwvdXNlcmlucHV0PiwNCi1hbmQgYWxzbyBhIG5ldyBlbGVtZW50IHRvIDx1c2VyaW5wdXQ+VUtBZGRyZXNzPC91c2VyaW5wdXQ+IGNhbGxlZCA8dXNlcmlucHV0PnBvc3Rjb2RlPC91c2VyaW5wdXQ+LjwvcD48cD5BZnRlcg0KLXlvdSBoYXZlIGRvbmUgdGhpcywgeW91IGNyZWF0ZSB0d28gbW9yZSBlbGVtZW50cyAtIDx1c2VyaW5wdXQ+YmlsbFRvPC91c2VyaW5wdXQ+IGFuZCA8dXNlcmlucHV0PnNoaXBUbzwvdXNlcmlucHV0PiAtDQotYXMgIDxzeXN0ZW1vdXRwdXQ+QWRkcmVzczwvc3lzdGVtb3V0cHV0PiB0eXBlcy48L3A+PHA+V2hlbiB5b3UgY3JlYXRlIGFuIFhNTA0KLWluc3RhbmNlIGRvY3VtZW50IGZvciBhbiBlbGVtZW50IHN1Y2ggYXMgIDxzeXN0ZW1vdXRwdXQ+YmlsbFRvPC9zeXN0ZW1vdXRwdXQ+IG9yDQotIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0PiwgYW4geHNpOnR5cGUgYXR0cmlidXRlIHdpbGwgYXV0b21hdGljYWxseQ0KLWJlIGFkZGVkIHRvIGl0LiBGb3IgZXhhbXBsZTo8L3A+PGNvZGVibG9jaz4mbHQ7YmlsbFRvIHhzaTp0eXBlPSJpcG86QWRkcmVzcyI+PC9jb2RlYmxvY2s+PHA+VGhlDQoteHNpOnR5cGUgYXR0cmlidXRlIGlzIHVzZWQgdG8gaWRlbnRpZnkgZGVyaXZlZCBjb21wbGV4IHR5cGVzIChhcyB3ZWxsIGFzIGNvbXBsZXgNCi10eXBlcyB0aGF0IGhhdmUgYmVlbiBkZXJpdmVkIGZyb20pLjwvcD48cD5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsDQotYSBsaXN0IHdpbGwgYmUgYXZhaWxhYmxlLCBsZXR0aW5nIHlvdSBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHR5cGUgZGVmaW5pdGlvbg0KLSg8dWljb250cm9sPkFkZHJlc3M8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+VVNBZGRyZXNzPC91aWNvbnRyb2w+LCBvciAgPHVpY29udHJvbD5VS0FkZHJlc3M8L3VpY29udHJvbD4pLg0KLVRoZSBndWlkZWQgZWRpdGluZyBmb3IgdGhlIGNvbnRlbnQgbW9kZWwgd2lsbCByZWZsZWN0IHRoZSB0eXBlIGRlZmluaXRpb24NCi10aGF0IHlvdSBjaG9vc2UuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2VsZWN0ICA8dWljb250cm9sPlVTQWRkcmVzczwvdWljb250cm9sPiAsDQoteW91ciA8Y29kZXBoPmJpbGxUbzwvY29kZXBoPiBlbGVtZW50IGNhbiBjb250YWluIGEgPGNvZGVwaD5zdGF0ZTwvY29kZXBoPiBlbGVtZW50LA0KLWJ1dCBpdCBjYW5ub3QgY29udGFpbiBhIDxjb2RlcGg+cG9zdGNvZGU8L2NvZGVwaD4gZWxlbWVudC48L3A+PHA+VGhlIFhNTCBleGFtcGxlDQotIkVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzIiBkZW1vbnN0cmF0ZXMgPGI+eHNpOnR5cGU8L2I+IHN1cHBvcnQuPC9wPjxwPkZvcg0KLW1vcmUgaW5mb3JtYXRpb24gYWJvdXQgeHNpOnR5cGUsIHJlZmVyIHRvIHRoZSA8Yj5Vc2luZyBEZXJpdmVkIFR5cGVzIGluIEluc3RhbmNlDQotRG9jdW1lbnRzPC9iPiBzZWN0aW9uIGluIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvI1VzZURlcml2SW5JbnN0RG9jcyINCi1zY29wZT0iZXh0ZXJuYWwiPlhNTCBTY2hlbWEgUGFydCAwOiBQcmltZXIuPC94cmVmPjwvcD48cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbg0KLWFib3V0IHZhbGlkYXRpb24gc2VtYW50aWNzIHdoZW4geHNpOnR5cGUgaXMgdXNlZCwgcmVmZXIgdG8gdGhlIDxiPlNjaGVtYS1SZWxhdGVkDQotTWFya3VwIGluIERvY3VtZW50cyBCZWluZyBWYWxpZGF0ZWQ8L2I+IHNlY3Rpb24gaW4gIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI3hzaV90eXBlIg0KLXNjb3BlPSJleHRlcm5hbCI+WE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L3hyZWY+IDwvcD48L2NvbnRleHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlZDJjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzaW5nIHhzaTp0eXBlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGVsZW1lbnRzIGluIHlvdXIgWE1MIGZpbGUgd2hvc2UgdHlwZSBpcyBhIGNvbXBsZXggdHlwZSwgeHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlIGFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGVsZW1lbnRzIGluIHlvdXIgWE1MIGZpbGUgd2hvc2UgdHlwZSBpcyBhIGNvbXBsZXggdHlwZSwgeHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlIGFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4c2l0eXAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Vc2luZyB4c2k6dHlwZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhzaXR5cCI+PGEgbmFtZT0idHhzaXR5cCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXNpbmcgeHNpOnR5cGU8L2gxPgotCi0KLQotPGRpdj48cD5JZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsCi14c2k6dHlwZSBzdXBwb3J0IGluIHRoZSBYTUwgZWRpdG9yIGxldHMgeW91IGNob29zZSBiZXR3ZWVuIHRoZSBjb21wbGV4IHR5cGUKLWFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGFsbG93cyB5b3UgdG8gZGVyaXZlIHR5cGVzIGJ5IGV4dGVuc2lvbi4KLUZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbiBYTUwgc2NoZW1hIGFuZCB5b3UgY3JlYXRlIGEgY29tcGxleCB0eXBlIGZvciBpdCBjYWxsZWQKLSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD4uIFlvdSB0aGVuIGFkZCBzb21lIGJhc2ljIGVsZW1lbnRzIHRvIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPiwKLXN1Y2ggYXMgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5zdHJlZXROYW1lPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPmNpdHk8L2tiZD4uPC9wPgotPHA+QWZ0ZXIKLXRoaXMsIHlvdSBkZXJpdmUgKGJ5IGV4dGVuc2lvbikgdHdvIG5ldyBjb21wbGV4IHR5cGVzIGZyb20gIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPiAtIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+VVNBZGRyZXNzPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVLQWRkcmVzczwva2JkPiBZb3UgYWRkIGEgbmV3IGVsZW1lbnQgdG8gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VU0FkZHJlc3M8L2tiZD4gY2FsbGVkICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPnN0YXRlPC9rYmQ+LAotYW5kIGFsc28gYSBuZXcgZWxlbWVudCB0byA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVLQWRkcmVzczwva2JkPiBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5wb3N0Y29kZTwva2JkPi48L3A+Ci08cD5BZnRlcgoteW91IGhhdmUgZG9uZSB0aGlzLCB5b3UgY3JlYXRlIHR3byBtb3JlIGVsZW1lbnRzIC0gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5iaWxsVG88L2tiZD4gYW5kIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+c2hpcFRvPC9rYmQ+IC0KLWFzICA8dHQgY2xhc3M9InN5c291dCI+QWRkcmVzczwvdHQ+IHR5cGVzLjwvcD4KLTxwPldoZW4geW91IGNyZWF0ZSBhbiBYTUwKLWluc3RhbmNlIGRvY3VtZW50IGZvciBhbiBlbGVtZW50IHN1Y2ggYXMgIDx0dCBjbGFzcz0ic3lzb3V0Ij5iaWxsVG88L3R0PiBvcgotIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPiwgYW4geHNpOnR5cGUgYXR0cmlidXRlIHdpbGwgYXV0b21hdGljYWxseQotYmUgYWRkZWQgdG8gaXQuIEZvciBleGFtcGxlOjwvcD4KLTxwcmU+Jmx0O2JpbGxUbyB4c2k6dHlwZT0iaXBvOkFkZHJlc3MiJmd0OzwvcHJlPgotPHA+VGhlCi14c2k6dHlwZSBhdHRyaWJ1dGUgaXMgdXNlZCB0byBpZGVudGlmeSBkZXJpdmVkIGNvbXBsZXggdHlwZXMgKGFzIHdlbGwgYXMgY29tcGxleAotdHlwZXMgdGhhdCBoYXZlIGJlZW4gZGVyaXZlZCBmcm9tKS48L3A+Ci08cD5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsCi1hIGxpc3Qgd2lsbCBiZSBhdmFpbGFibGUsIGxldHRpbmcgeW91IHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBkZWZpbml0aW9uCi0oPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkcmVzczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVTQWRkcmVzczwvc3Bhbj4sIG9yICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VS0FkZHJlc3M8L3NwYW4+KS4KLVRoZSBndWlkZWQgZWRpdGluZyBmb3IgdGhlIGNvbnRlbnQgbW9kZWwgd2lsbCByZWZsZWN0IHRoZSB0eXBlIGRlZmluaXRpb24KLXRoYXQgeW91IGNob29zZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWxlY3QgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVTQWRkcmVzczwvc3Bhbj4gLAoteW91ciA8c2FtcCBjbGFzcz0iY29kZXBoIj5iaWxsVG88L3NhbXA+IGVsZW1lbnQgY2FuIGNvbnRhaW4gYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5zdGF0ZTwvc2FtcD4gZWxlbWVudCwKLWJ1dCBpdCBjYW5ub3QgY29udGFpbiBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnBvc3Rjb2RlPC9zYW1wPiBlbGVtZW50LjwvcD4KLTxwPlRoZSBYTUwgZXhhbXBsZQotIkVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzIiBkZW1vbnN0cmF0ZXMgPHN0cm9uZz54c2k6dHlwZTwvc3Ryb25nPiBzdXBwb3J0LjwvcD4KLTxwPkZvcgotbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB4c2k6dHlwZSwgcmVmZXIgdG8gdGhlIDxzdHJvbmc+VXNpbmcgRGVyaXZlZCBUeXBlcyBpbiBJbnN0YW5jZQotRG9jdW1lbnRzPC9zdHJvbmc+IHNlY3Rpb24gaW4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvI1VzZURlcml2SW5JbnN0RG9jcyIgdGFyZ2V0PSJfYmxhbmsiPlhNTCBTY2hlbWEgUGFydCAwOiBQcmltZXIuPC9hPjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uCi1hYm91dCB2YWxpZGF0aW9uIHNlbWFudGljcyB3aGVuIHhzaTp0eXBlIGlzIHVzZWQsIHJlZmVyIHRvIHRoZSA8c3Ryb25nPlNjaGVtYS1SZWxhdGVkCi1NYXJrdXAgaW4gRG9jdW1lbnRzIEJlaW5nIFZhbGlkYXRlZDwvc3Ryb25nPiBzZWN0aW9uIGluICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jeHNpX3R5cGUiIHRhcmdldD0iX2JsYW5rIj5YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlczwvYT4gPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTY2MjI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTcwYjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQ4OGI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAxLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzZWUwMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi0gPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIiAibWFwLmR0ZCI+DQotPG1hcD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3htbHNjaC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBpZD0ieHNkY29uY2VwdHMiIGxpbmtpbmc9InRhcmdldG9ubHkiDQotbmF2dGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxzY2VkLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2ZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90aW1wc2NobS5kaXRhIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIFhNTCBzY2hlbWFzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW1wdC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbmNsLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdG5hdnNyYy5kaXRhIiBuYXZ0aXRsZT0iTmF2aWdhdGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxzY2VkLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgbGlua2luZz0ibm9ybWFsIiBuYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3htbHNjaC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNteHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBjb21wbGV4IHR5cGVzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY21vZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY21vZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtci5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRnbGVtLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3J1cC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGdyb3VwcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnByLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbW9kLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnByLmRpdGEiIGxpbmtpbmc9Im5vcm1hbCIgbmF2dGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdydXAuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBncm91cHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbXB0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uZGl0YSIgbmF2dGl0bGU9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JubXNwYy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2ZHRzY2htLmRpdGEiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3htbHNjaC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JyZWZpbnRnLmRpdGEiIG5hdnRpdGxlPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ybm1zcGMuZGl0YSIgbmF2dGl0bGU9IlhNTCBuYW1lc3BhY2VzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHByZWYuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkc21wdC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIHNpbXBsZSB0eXBlcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRyZWcuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbW9kLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkYW55ZS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3Jwci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RkZWxzY21wLmRpdGEiIG5hdnRpdGxlPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ycmVmaW50Zy5kaXRhIiBuYXZ0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkYW55ZS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkYW55ZS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFjNmZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RMZWRpdG9ycmVsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgdG9waWM9InRvcGljcy90Y3htbHNjaC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90aW1wc2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90bmF2c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb21wbGV4IHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29udGVudCBtb2RlbHMiIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb250ZW50IG1vZGVscyIgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb250ZW50IG1vZGVscyIgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwcyIgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb250ZW50IG1vZGVscyIgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cHMiIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBuYW1lc3BhY2VzIiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0idG9waWNzL3JubXNwYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgc2ltcGxlIHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb250ZW50IG1vZGVscyIgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGFueSBlbGVtZW50IiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIiBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGFueSBlbGVtZW50IiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzRiY2Y3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBjb2xsZWN0aW9uLXR5cGU9InNlcXVlbmNlIiBpZD0id3N0eHNkdG9jIiB0aXRsZT0iWE1MIHNjaGVtYXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtYU0QuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgc2NoZW1hcyAoWFNEcykiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmRpdGEiIG5hdnRpdGxlPSJYU0QgU2x1c2ggZmlsZSINCi10b2M9Im5vIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGltcHNjaG0uZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBhbiBYTUwgc2NoZW1hIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdG5hdnNyYy5kaXRhIiBuYXZ0aXRsZT0iTmF2aWdhdGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmRpdGEiIG5hdnRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRwcmVmLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgIGVkaXRvciBwcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBpZD0ieHNkY29uY2VwdHMiIG5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gYXR0cmlidXRlIGdyb3VwIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNteHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGNvbXBsZXggdHlwZSI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbW9kLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBjb250ZW50IG1vZGVsIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRhbnllLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gZWxlbWVudCI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG1yLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2UiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3Jwci5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ3JvdXAgcmVmZXJlbmNlIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xiYS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ2xvYmFsIGF0dHJpYnV0ZSI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRnbGVtLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBnbG9iYWwgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnVwLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBncm91cCI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbXB0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gaW1wb3J0IGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW5jbC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGluY2x1ZGUgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRyZGZuLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSByZWRlZmluZSBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIHNpbXBsZSB0eXBlIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRyZWcuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIHBhdHRlcm4gZmFjZXQgdG8gYSBzaW1wbGUgdHlwZSI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuZGl0YSIgaWQ9InhzZGljb25zIiBuYXZ0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZGVsc2NtcC5kaXRhIiBuYXZ0aXRsZT0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JyZWZpbnRnLmRpdGEiIG5hdnRpdGxlPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmR0c2NobS5kaXRhIiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmRpdGEiIG5hdnRpdGxlPSJYTUwgbmFtZXNwYWNlcyI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxMGIxZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJYTUwgc2NoZW1hcyIgdG9waWM9InRvcGljcy9jd29ya1hTRC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3dvcmtYU0QuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90aW1wc2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90bmF2c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCI+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbXBsZXggdHlwZXMiIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb250ZW50IG1vZGVscyIgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwiPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwcyIgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHNpbXBsZSB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBuYW1lc3BhY2VzIiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODAyNjE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBYU0RlZGl0b3JtYXBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Ccm93c2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Ccm93c2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQnJvd3NlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvTW9yZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL01vcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvTW9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFsbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzdmYmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmOTNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4MGNjMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4ZGY3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzFkYjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjVhZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY1ODNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGI5NGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjZmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyYzJkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXBSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODk4N2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREltcG9ydC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREltcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDRjZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbmNsdWRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW5jbHVkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmM1MjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbmNsdWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RSZWRlZmluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTY0YzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RSZWRlZmluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI4NjEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDc5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTEzY2Y0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3NDQzMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODczMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLnhtbCIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmY0NjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0iWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwIi8+DQotICAgIDxtYXAgZmlsZT0iWFNETGVkaXRvcnJlbC5kaXRhbWFwIi8+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjNTRhYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTGljZW5zZWQgTWF0ZXJpYWxzIFByb3BlcnR5IG9mIElCTSAtLT4KLTwhLS0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtLT4KLTwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+Ci08IS0tIEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJpYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5JbmRleDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5JbmRleDwvaDE+Ci08YSBuYW1lPSJJRFgwXzQ0IiBocmVmPSIjSURYMV80NCI+RDwvYT4KLTxhIG5hbWU9IklEWDBfNDUiIGhyZWY9IiNJRFgxXzQ1Ij5FPC9hPgotPGEgbmFtZT0iSURYMF80OSIgaHJlZj0iI0lEWDFfNDkiPkk8L2E+Ci08YSBuYW1lPSJJRFgwXzUyIiBocmVmPSIjSURYMV81MiI+UjwvYT4KLTxhIG5hbWU9IklEWDBfNTgiIGhyZWY9IiNJRFgxXzU4Ij5YPC9hPgotPGhyPjwvaHI+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDQiIGhyZWY9IiNJRFgwXzQ0Ij5EPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5kZXBlbmRhbnQgYXJ0aWZhY3RzPC9hPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDUiIGhyZWY9IiNJRFgwXzQ1Ij5FPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5lZGl0aW5nIFhNTCBzY2hlbWFzPC9hPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDkiIGhyZWY9IiNJRFgwXzQ5Ij5JPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPkljb25zCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3J4c2RpY29ucy5odG1sI3JpY29ucyI+WE1MIHNjaGVtYSBlZGl0b3I8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzUyIiBocmVmPSIjSURYMF81MiI+UjwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+cmVmYWN0b3Jpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5yZW5hbWluZzwvYT4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzU4IiBocmVmPSIjSURYMF81OCI+WDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5YTUwgbmFtZXNwYWNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9ybm1zcGMuaHRtbCNybm1zcGMiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5hZGRpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSI+YW4gYW55IGVsZW1lbnQ8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIj5hdHRyaWJ1dGUgZ3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCI+Y29tcGxleCB0eXBlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiPmNvbnRlbnQgbW9kZWxzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciI+ZWxlbWVudCByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iPmVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSI+Z2xvYmFsIGF0dHJpYnV0ZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIj5nbG9iYWwgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIj5ncm91cCByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCI+Z3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCI+aW1wb3J0IGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCI+aW5jbHVkZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIj5wYXR0ZXJuIGZhY2V0czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iPnJlZGVmaW5lIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCI+c2ltcGxlIHR5cGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmFuIGFueSBlbGVtZW50Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5hdHRyaWJ1dGVzIGdyb3VwcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwjcnJlZmludGciPmNsZWFuIHVwIGluPC9hPgotPC9saT4KLTxsaT5jb21wbGV4IHR5cGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5jb250ZW50IG1vZGVscwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZGVsZXRpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCI+Y29tcG9uZW50czwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5lZGl0aW5nIFhNTCBzY2hlbWFzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwjdGVkdHNjaG0iPnNpbXBsZSB0eXBlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5lbGVtZW50IHJlZmVyZW5jZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmVsZW1lbnRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Z2xvYmFsIGF0dHJpYnV0ZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmdsb2JhbCBlbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Z3JvdXAgcmVmZXJlbmNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Z3JvdXBzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmh0bWwjcmljb25zIj5pY29uczwvYT4KLTwvbGk+Ci08bGk+aW1wb3J0IGVsZW1lbnRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5pbmNsdWRlIGVsZW1lbnRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCNjeG1sc2NlZCI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPGxpPnBhdHRlcm4gZmFjZXRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+cmVkZWZpbmUgZWxlbWVudHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIj5yZWZlcmVudGlhbCBpbnRlZ3JpdHk8L2E+Ci08L2xpPgotPGxpPnNpbXBsZSB0eXBlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0Ij5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+WE1MIHNjaGVtYSBmaWxlczwvYT4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5hZGRpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSI+YW4gYW55IGVsZW1lbnQ8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIj5hdHRyaWJ1dGUgZ3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCI+Y29tcGxleCB0eXBlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiPmNvbnRlbnQgbW9kZWxzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciI+ZWxlbWVudCByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iPmVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSI+Z2xvYmFsIGF0dHJpYnV0ZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIj5nbG9iYWwgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIj5ncm91cCByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCI+Z3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCI+aW1wb3J0IGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCI+aW5jbHVkZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIj5wYXR0ZXJuIGZhY2V0czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iPnJlZGVmaW5lIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCI+c2ltcGxlIHR5cGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmFuIGFueSBlbGVtZW50Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5hdHRyaWJ1dGVzIGdyb3VwcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Y29tcGxleCB0eXBlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0Ij5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Y29udGVudCBtb2RlbHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sI3RjeG1sc2NoIj5jcmVhdGluZzwvYT4KLTwvbGk+Ci08bGk+ZGVmaW5pbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiI+ZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiI+c2NoZW1hIHByZWZpeDwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5kZWxldGluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sI3RkZWxzY21wIj5jb21wb25lbnRzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmVkaXRpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCN0ZWR0c2NobSI+c2ltcGxlIHR5cGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmVsZW1lbnQgcmVmZXJlbmNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sI3RhZGRlbG1yIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZWxlbWVudHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5nbG9iYWwgYXR0cmlidXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Z2xvYmFsIGVsZW1lbnRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwjdGFkZGdsZW0iPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5ncm91cCByZWZlcmVuY2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwjdGFkZGdycHIiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5ncm91cHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmltcG9ydCBlbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0Ij5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RpbXBzY2htLmh0bWwjdGltcHNjaG0iPmltcG9ydGluZzwvYT4KLTwvbGk+Ci08bGk+aW5jbHVkZSBlbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RuYXZzcmMuaHRtbCN0bmF2c3JjIj5uYXZpZ2F0aW5nPC9hPgotPC9saT4KLTxsaT5wYXR0ZXJuIGZhY2V0cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnJlZGVmaW5lIGVsZW1lbnRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5zaW1wbGUgdHlwZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sI3R2ZHRzY2htIj52YWxpZGF0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjEzNzdiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgc2NoZW1hIGZpbGVzIj4KLSAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCN0Y3htbHNjaCIgdGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGltcHNjaG0uaHRtbCN0aW1wc2NobSIgdGl0bGU9IkltcG9ydGluZyBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im5hdmlnYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90bmF2c3JjLmh0bWwjdG5hdnNyYyIgdGl0bGU9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWZpbmluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sI3RlZHRwcmVmIiB0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic2NoZW1hIHByZWZpeCI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9InNpbXBsZSB0eXBlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCN0ZWR0c2NobSIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlIGdyb3VwcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCIgdGl0bGU9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNvbXBsZXggdHlwZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiIHRpdGxlPSJBZGRpbmcgY29tcGxleCB0eXBlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IG1vZGVscyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCIgdGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhbiBhbnkgZWxlbWVudCI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSIgdGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iIHRpdGxlPSJBZGRpbmcgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudCByZWZlcmVuY2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sI3RhZGRlbG1yIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cCByZWZlcmVuY2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIiB0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGF0dHJpYnV0ZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGVsZW1lbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiIHRpdGxlPSJBZGRpbmcgZ3JvdXBzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydCBlbGVtZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCIgdGl0bGU9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaW5jbHVkZSBlbGVtZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCIgdGl0bGU9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InJlZGVmaW5lIGVsZW1lbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIiB0aXRsZT0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InNpbXBsZSB0eXBlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCIgdGl0bGU9IkFkZGluZyBzaW1wbGUgdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0icGF0dGVybiBmYWNldHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIiB0aXRsZT0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGVzIGdyb3VwcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIiB0aXRsZT0iQWRkaW5nIGF0dHJpYnV0ZSBncm91cHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29tcGxleCB0eXBlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0IiB0aXRsZT0iQWRkaW5nIGNvbXBsZXggdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBtb2RlbHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCIgdGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhbiBhbnkgZWxlbWVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIiB0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnQgcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sI3RhZGRlbG1yIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cCByZWZlcmVuY2VzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwjdGFkZGdycHIiIHRpdGxlPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgYXR0cmlidXRlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCIgdGl0bGU9IkFkZGluZyBncm91cHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0IGVsZW1lbnRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiIHRpdGxlPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImluY2x1ZGUgZWxlbWVudHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCIgdGl0bGU9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlZGVmaW5lIGVsZW1lbnRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iIHRpdGxlPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2ltcGxlIHR5cGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiIHRpdGxlPSJBZGRpbmcgc2ltcGxlIHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBhdHRlcm4gZmFjZXRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIiB0aXRsZT0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWxldGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29tcG9uZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCIgdGl0bGU9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWxpZGF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCN0dmR0c2NobSIgdGl0bGU9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBlZGl0b3IiPgotICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBYTUwgc2NoZW1hcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic2ltcGxlIHR5cGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sI3RlZHRzY2htIiB0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sI2N4bWxzY2VkIiB0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZSBncm91cHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwjdGFkZGFncnAiIHRpdGxlPSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJjb21wbGV4IHR5cGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0IiB0aXRsZT0iQWRkaW5nIGNvbXBsZXggdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBtb2RlbHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiIHRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYW4gYW55IGVsZW1lbnQiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiIHRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnQgcmVmZXJlbmNlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciIgdGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXAgcmVmZXJlbmNlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciIgdGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBhdHRyaWJ1dGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBlbGVtZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXBzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIiB0aXRsZT0iQWRkaW5nIGdyb3VwcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnQgZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiIHRpdGxlPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImluY2x1ZGUgZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiIHRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJyZWRlZmluZSBlbGVtZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiIgdGl0bGU9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJzaW1wbGUgdHlwZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiIHRpdGxlPSJBZGRpbmcgc2ltcGxlIHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InBhdHRlcm4gZmFjZXRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyIgdGl0bGU9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlcyBncm91cHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCIgdGl0bGU9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbXBsZXggdHlwZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCIgdGl0bGU9IkFkZGluZyBjb21wbGV4IHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgbW9kZWxzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiIHRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYW4gYW55IGVsZW1lbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSIgdGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSIgdGl0bGU9IkFkZGluZyBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50IHJlZmVyZW5jZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciIgdGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXAgcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIiB0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGF0dHJpYnV0ZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgZWxlbWVudHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXBzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiIHRpdGxlPSJBZGRpbmcgZ3JvdXBzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydCBlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0IiB0aXRsZT0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmNsdWRlIGVsZW1lbnRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiIHRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZWRlZmluZSBlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIiB0aXRsZT0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNpbXBsZSB0eXBlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0IiB0aXRsZT0iQWRkaW5nIHNpbXBsZSB0eXBlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwYXR0ZXJuIGZhY2V0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyIgdGl0bGU9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaWNvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuaHRtbCNyaWNvbnMiIHRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRlbGV0aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJjb21wb25lbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sI3RkZWxzY21wIiB0aXRsZT0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlZmVyZW50aWFsIGludGVncml0eSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwjcnJlZmludGciIHRpdGxlPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY2xlYW4gdXAgaW4iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIiB0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJyZWZhY3RvcmluZyI+Ci0gICAgPHRvcGljIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIiB0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIvPgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVuYW1pbmciPgotICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgWE1MIHNjaGVtYXMiPgotICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRlcGVuZGFudCBhcnRpZmFjdHMiPgotICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Ikljb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBlZGl0b3IiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuaHRtbCNyaWNvbnMiIHRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgbmFtZXNwYWNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwjcm5tc3BjIiB0aXRsZT0iWE1MIG5hbWVzcGFjZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMWExMWExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotUGx1Z2luLm5hbWUgPSBYTUwgc2NoZW1hIGVkaXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODczMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iWFNEZWRpdG9ybWFwX3RvYy54bWwiLz4KLSAgICAgIAotPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiMWJmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGh4bWxzY2hlbWFzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nDQotdGhlIGNvbnRlbnQgb2YgWE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxjb25ib2R5Pg0KLTxwPlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+PD9QdWIgQ2FyZXQxPz4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmsgaHJlZj0idGN4bWxzY2guZGl0YSI+PGxpbmt0ZXh0PkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idGltcHNjaG0uZGl0YSI+PGxpbmt0ZXh0PkltcG9ydGluZyBYTUwgc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRuYXZzcmMuZGl0YSI+PGxpbmt0ZXh0Pk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0cmVmYWN0clhTRC5kaXRhIj48bGlua3RleHQ+UmVmYWN0b3JpbmcgaW4gWE1MIHNjaGVtYXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0ZWR0cHJlZi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJyeHNkaWNvbnMuZGl0YSI+PGxpbmt0ZXh0Pkljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idGRlbHNjbXAuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InR2ZHRzY2htLmRpdGEiPjxsaW5rdGV4dD5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0icm5tc3BjLmRpdGEiPjxsaW5rdGV4dD5YTUwgbmFtZXNwYWNlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDEyNjc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmMzViNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nIHRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nIHRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjeG1sc2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRpbXBzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRuYXZzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHJlZmFjdHJYU0QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGVkdHByZWYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0icnhzZGljb25zLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRkZWxzY21wLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InR2ZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InJubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9Indvcmtpbmd3aXRoeG1sc2NoZW1hcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya2luZ3dpdGh4bWxzY2hlbWFzIj48YSBuYW1lPSJ3b3JraW5nd2l0aHhtbHNjaGVtYXMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBYTUwgc2NoZW1hczwvaDE+Ci0KLQotPGRpdj48cD5YTUwgc2NoZW1hcyBhcmUgYW4gWE1MIGxhbmd1YWdlIGZvciBkZXNjcmliaW5nIGFuZCBjb25zdHJhaW5pbmcKLXRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy48L3A+Ci0KLTxwPlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idGN4bWxzY2guaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5DcmVhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGltcHNjaG0uaHRtbCIgdGl0bGU9IklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFRoZSBYTUwgc2NoZW1hIGVkaXRvciBwcm92aWRlcyB5b3Ugd2l0aCBhIHN0cnVjdHVyZWQgdmlldyBvZiB0aGUgWE1MIHNjaGVtYS4iPkltcG9ydGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idG5hdnNyYy5odG1sIiB0aXRsZT0iV2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIGNsaWNraW5nIEYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiI+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHJlZmFjdHJYU0QuaHRtbCIgdGl0bGU9IldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYSBzaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzLiI+UmVmYWN0b3JpbmcgaW4gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRlZHRwcmVmLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLiI+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRkZWxzY21wLmh0bWwiIHRpdGxlPSJJZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLCB5b3UgY2FuIGRlbGV0ZSB0aGVtLiI+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJyeHNkaWNvbnMuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYSBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lLCBEZXNpZ24sIGFuZCBQcm9wZXJ0aWVzIHZpZXcuIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI0YWU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3htbHNjZWQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgc2NoZW1hIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLA0KLWFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYPD9QdWIgQ2FyZXQxPz5NTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uDQotb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwNCi1hbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+QSBzY2hlbWEgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gYSBEVEQsIGJ1dCBpcyB3cml0dGVuIGluIFhNTDsgYQ0KLXNjaGVtYSBhbHNvIHByb3ZpZGVzIGZvciBleHRlbmRlZCBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZGF0YSB0eXBpbmcsIGluaGVyaXRhbmNlLA0KLWFuZCBwcmVzZW50YXRpb24gcnVsZXMuPC9wPg0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBzY2hlbWEsIHJlZmVyIHRvOjwvcD4NCi08dWw+DQotPGxpPiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC88L3hyZWY+IDwvbGk+DQotPGxpPiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS88L3hyZWY+IDwvbGk+DQotPGxpPiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi88L3hyZWY+IDwvbGk+DQotPC91bD4NCi08cD5Vc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW46PC9wPg0KLTx1bD4NCi08bGk+Q3JlYXRlIGFuZCBkZWxldGUgWE1MIHNjaGVtYSBjb21wb25lbnRzIHN1Y2ggYXMgY29tcGxleCB0eXBlcywgc2ltcGxlDQotdHlwZXMsIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgZ3JvdXBzLCBhbmQgZ3JvdXBzLjwvbGk+DQotPGxpPkVkaXQgWE1MIHNjaGVtYXMuPC9saT4NCi08bGk+SW1wb3J0IGV4aXN0aW5nIFhNTCBzY2hlbWFzIGZvciBzdHJ1Y3R1cmVkIHZpZXdpbmcuPC9saT4NCi08L3VsPg0KLTxwPlRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gZnJvbSB0aGUgVzNDIFdlYiBzaXRlIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24uPC9wPg0KLTxzZWN0aW9uPjx0aXRsZT5YTUwgc2NoZW1hIGVkaXRvciB2aWV3cyAtIERlc2lnbiwgT3V0bGluZSwgUHJvcGVydGllcywgYW5kDQotU291cmNlPC90aXRsZT5UaGVyZSBhcmUgZm91ciBtYWluIHZpZXdzIHlvdSBjYW4gd29yayB3aXRoIGluIHRoZSBYTUwgc2NoZW1hDQotZWRpdG9yOjx1bD4NCi08bGk+RGVzaWduIC0gdGhlIERlc2lnbiB2aWV3IHByb3ZpZGVzIGEgZ3JhcGhpY2FsIHdheSB0byBlZGl0IHlvdXIgc2NoZW1hPC9saT4NCi08bGk+T3V0bGluZSAtIHRoZSBPdXRsaW5lIHZpZXcgc2hvd3MgeW91IHRoZSBtYWluIGNvbXBvbmVudHMgaW4geW91ciBYTUwgc2NoZW1hLg0KLVlvdSBjYW4gdXNlIHRoaXMgdmlldyB0byBhZGQgYW5kIHJlbW92ZSBjZXJ0YWluIGNvbXBvbmVudHMuPC9saT4NCi08bGk+UHJvcGVydGllcyAtIHRoZSBQcm9wZXJ0aWVzIHZpZXcgZW5hYmxlcyB5b3UgdG8gZWRpdCB0aGUgcHJvcGVydGllcyBvZg0KLXlvdXIgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9saT4NCi08bGk+U291cmNlIC0gdGhlIFNvdXJjZSB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgeW91ciBzb3VyY2UgY29kZSBkaXJlY3RseTwvbGk+DQotPC91bD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlN0YXR1cyBvZiB0aGUgWE1MIHNjaGVtYTwvdGl0bGU+PHA+PC9wPjxwPlRocmVlIHN0YXR1cyBpbmRpY2F0b3JzDQotZm9yIHRoZSBzY2hlbWEgYXJlIGF2YWlsYWJsZS4gVGhleSBhcmUgaW4gdGhlIGJvdHRvbSByaWdodCBjb3JuZXI6PC9wPjx1bD4NCi08bGk+IDx1aWNvbnRyb2w+V3JpdGFibGU8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5SZWFkIE9ubHk8L3VpY29udHJvbD4uIDwvbGk+DQotPGxpPiAoU291cmNlIHZpZXcgb25seSkgPHVpY29udHJvbD5TbWFydCBJbnNlcnQ8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5PdmVyd3JpdGU8L3VpY29udHJvbD4uDQotVG8gdG9nZ2xlIGJldHdlZW4gdGhlc2UgbW9kZXMsIHByZXNzIHRoZSA8dWljb250cm9sPkluc2VydDwvdWljb250cm9sPiBidXR0b24NCi1vbiB5b3VyIGtleWJvYXJkLjwvbGk+DQotPGxpPiA8dWljb250cm9sPkxpbmU8L3VpY29udHJvbD4gYW5kIDx1aWNvbnRyb2w+Y29sdW1uPC91aWNvbnRyb2w+IG51bWJlci4gPC9saT4NCi08L3VsPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAyODgzPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWFkMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxzY2VkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN4bWxzY2VkIj48YSBuYW1lPSJjeG1sc2NlZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIHNjaGVtYSBlZGl0b3I8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsCi1hbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24KLW9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsCi1hbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiA8L3A+Ci0KLTxwPkEgc2NoZW1hIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGEgRFRELCBidXQgaXMgd3JpdHRlbiBpbiBYTUw7IGEKLXNjaGVtYSBhbHNvIHByb3ZpZGVzIGZvciBleHRlbmRlZCBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZGF0YSB0eXBpbmcsIGluaGVyaXRhbmNlLAotYW5kIHByZXNlbnRhdGlvbiBydWxlcy48L3A+Ci0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBzY2hlbWEsIHJlZmVyIHRvOjwvcD4KLQotPHVsPgotPGxpPiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC88L2E+IDwvbGk+Ci0KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvPC9hPiA8L2xpPgotCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLzwvYT4gPC9saT4KLQotPC91bD4KLQotPHA+VXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuOjwvcD4KLQotPHVsPgotPGxpPkNyZWF0ZSBhbmQgZGVsZXRlIFhNTCBzY2hlbWEgY29tcG9uZW50cyBzdWNoIGFzIGNvbXBsZXggdHlwZXMsIHNpbXBsZQotdHlwZXMsIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgZ3JvdXBzLCBhbmQgZ3JvdXBzLjwvbGk+Ci0KLTxsaT5FZGl0IFhNTCBzY2hlbWFzLjwvbGk+Ci0KLTxsaT5JbXBvcnQgZXhpc3RpbmcgWE1MIHNjaGVtYXMgZm9yIHN0cnVjdHVyZWQgdmlld2luZy48L2xpPgotCi08L3VsPgotCi08cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIFczQyBXZWIgc2l0ZSBpcyB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlhNTCBzY2hlbWEgZWRpdG9yIHZpZXdzIC0gRGVzaWduLCBPdXRsaW5lLCBQcm9wZXJ0aWVzLCBhbmQKLVNvdXJjZTwvaDQ+VGhlcmUgYXJlIGZvdXIgbWFpbiB2aWV3cyB5b3UgY2FuIHdvcmsgd2l0aCBpbiB0aGUgWE1MIHNjaGVtYQotZWRpdG9yOjx1bD4KLTxsaT5EZXNpZ24gLSB0aGUgRGVzaWduIHZpZXcgcHJvdmlkZXMgYSBncmFwaGljYWwgd2F5IHRvIGVkaXQgeW91ciBzY2hlbWE8L2xpPgotCi08bGk+T3V0bGluZSAtIHRoZSBPdXRsaW5lIHZpZXcgc2hvd3MgeW91IHRoZSBtYWluIGNvbXBvbmVudHMgaW4geW91ciBYTUwgc2NoZW1hLgotWW91IGNhbiB1c2UgdGhpcyB2aWV3IHRvIGFkZCBhbmQgcmVtb3ZlIGNlcnRhaW4gY29tcG9uZW50cy48L2xpPgotCi08bGk+UHJvcGVydGllcyAtIHRoZSBQcm9wZXJ0aWVzIHZpZXcgZW5hYmxlcyB5b3UgdG8gZWRpdCB0aGUgcHJvcGVydGllcyBvZgoteW91ciBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2xpPgotCi08bGk+U291cmNlIC0gdGhlIFNvdXJjZSB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgeW91ciBzb3VyY2UgY29kZSBkaXJlY3RseTwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlN0YXR1cyBvZiB0aGUgWE1MIHNjaGVtYTwvaDQ+PHAgLz4KLTxwPlRocmVlIHN0YXR1cyBpbmRpY2F0b3JzCi1mb3IgdGhlIHNjaGVtYSBhcmUgYXZhaWxhYmxlLiBUaGV5IGFyZSBpbiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lcjo8L3A+Ci08dWw+Ci08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldyaXRhYmxlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWFkIE9ubHk8L3NwYW4+LiA8L2xpPgotCi08bGk+IChTb3VyY2UgdmlldyBvbmx5KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TbWFydCBJbnNlcnQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJ3cml0ZTwvc3Bhbj4uCi1UbyB0b2dnbGUgYmV0d2VlbiB0aGVzZSBtb2RlcywgcHJlc3MgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydDwvc3Bhbj4gYnV0dG9uCi1vbiB5b3VyIGtleWJvYXJkLjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGluZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmNvbHVtbjwvc3Bhbj4gbnVtYmVyLiA8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjeG1sc2NoLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiB0aXRsZT0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwMjYwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYU0QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy48L3Nob3J0ZGVzYz4NCi08cmVmYm9keT4NCi08IS0tVXNlIHRoaXMgdGVtcGxhdGUgdG8gc2luZ2xlIHNvdXJjZSB0aGUgcmVhZG1lIGluZm9ybWF0aW9uLiAgVGhlIGNvbnRlbnQgZm9yIHRoZSByZWFkbWUgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCBpbiB0aGlzIHRvcGljIGFuZCBpcyBpbnNlcnRlZCBpbnRvIHRoZSByZWxhdGVkIHRvcGljIHVzaW5nIHRoZSBjb25yZWYgYXR0cmlidXRlLiBUaGlzIGZpbGUgd2lsbCBub3QgYmUgc3VyZmFjZWQgaW4geW91ciBuYXZpZ2F0aW9uLi0tPg0KLTxzZWN0aW9uPjx0aXRsZT5IZWJyZXcgTG9naWNhbCBlbmNvZGluZzwvdGl0bGU+PHAgaWQ9ImVuY29kaW5nIj48IS0tVGhlcmUgaXMgbm8gZGVmZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudHJ5LiBJdCBpcyBmcm9tIHRoZSA1LjEgcmVhZG1lLi0tPldoZW4NCi1IZWJyZXcgTG9naWNhbCAoSVNPLTg4NTktOC1JKSBlbmNvZGluZyBpcyBzZWxlY3RlZCBhcyBhIHByZWZlcmVuY2UgZm9yIGVuY29kaW5nDQotb2YgSFRNTCBmaWxlcyAoPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgZmlsZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBpbiB0aGUgIldoZW4gY3JlYXRpbmcgZmlsZXMiIHNlY3Rpb24pLCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uDQotZmlsZXMgZ2VuZXJhdGVkIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlIHdpbGwgc3RpbGwgaGF2ZSBhIFVURi04IGVuY29kaW5nLg0KLVRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVjYzU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmxpbWl0YXRpb25zX3NsdXNoWFNEIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhTRCI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWFNEIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLjwvcD4KLQotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SGVicmV3IExvZ2ljYWwgZW5jb2Rpbmc8L2g0PjxwIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYU0RfX2VuY29kaW5nIj48YSBuYW1lPSJybGltaXRhdGlvbnNfc2x1c2hYU0RfX2VuY29kaW5nIj48IS0tIC0tPjwvYT5XaGVuCi1IZWJyZXcgTG9naWNhbCAoSVNPLTg4NTktOC1JKSBlbmNvZGluZyBpcyBzZWxlY3RlZCBhcyBhIHByZWZlcmVuY2UgZm9yIGVuY29kaW5nCi1vZiBIVE1MIGZpbGVzICg8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgZmlsZXM8L3NwYW4+Ci08L3NwYW4+IGluIHRoZSAiV2hlbiBjcmVhdGluZyBmaWxlcyIgc2VjdGlvbiksIHRoZSBIVE1MIGRvY3VtZW50YXRpb24KLWZpbGVzIGdlbmVyYXRlZCBmcm9tIGFuIFhNTCBzY2hlbWEgZmlsZSB3aWxsIHN0aWxsIGhhdmUgYSBVVEYtOCBlbmNvZGluZy4KLVRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMzdlOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiIgInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJubXNwYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIG5hbWVzcGFjZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBuYW1lc3BhY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJDQotcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZQ0KLW5hbWVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBuYW1lc3BhY2VzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj5YTUwgbmFtZXNwYWNlcyBhcmUgZGVmaW5lZCBieSBhIFczQyByZWNvbW1lbmRhdGlvbiwgZGF0aW5nIDE0IEphbnVhcnkNCi0xOTk5LCBjYWxsZWQgPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyINCi1zY29wZT0iZXh0ZXJuYWwiPk5hbWVzcGFjZXMgaW4gWE1MPC94cmVmPi4gWE1MIHRhZyBuYW1lcyBzaG91bGQgYmUgZ2xvYmFsbHkNCi11bmlxdWUsIGFzIHdlbGwgYXMgc2hvcnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEluIG9yZGVyIHRvIHJlc29sdmUgdGhpcw0KLWNvbmZsaWN0LCB0aGUgVzNDIG5hbWVzcGFjZSByZWNvbW1lbmRhdGlvbiBkZWZpbmVzIGFuIGF0dHJpYnV0ZSA8Yj54bWxuczwvYj4gd2hpY2gNCi1jYW4gYW1lbmQgYW55IFhNTCBlbGVtZW50LiBJZiBpdCBpcyBwcmVzZW50IGluIGFuIGVsZW1lbnQsIGl0IGlkZW50aWZpZXMgdGhlDQotbmFtZXNwYWNlIGZvciB0aGlzIGVsZW1lbnQuPC9zZWN0aW9uPg0KLTxzZWN0aW9uPjxwPlRoZSB4bWxucyBhdHRyaWJ1dGUgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4OjwvcD48cD48Y29kZXBoPnhtbG5zOjx2YXJuYW1lPnByZWZpeDwvdmFybmFtZT49bmFtZXNwYWNlPC9jb2RlcGg+IDwvcD48cD53aGVyZSA8Y29kZXBoPm5hbWVzcGFjZTwvY29kZXBoDQotPiBpcyBhIHVuaXF1ZSBVUkkgKHN1Y2ggYXMgd3d3LmlibS5jb20pIGFuZCB3aGVyZSA8Y29kZXBoPjx2YXJuYW1lPnByZWZpeDwvdmFybmFtZT48L2NvZGVwaD4gcmVwcmVzZW50cw0KLXRoZSBuYW1lc3BhY2UgYW5kIHByb3ZpZGVzIGEgcG9pbnRlciB0byBpdC48L3A+PHA+SW4gdGhlIGZvbGxvd2luZyBjdXN0b21lcg0KLWVsZW1lbnQgZGVmaW5pdGlvbiwgYW4gYWNjb3VudGluZyBuYW1lc3BhY2UgaXMgZGVmaW5lZCBpbiBvcmRlciB0byBiZSBhYmxlDQotdG8gZGlzdGluZ3Vpc2ggdGhlIGVsZW1lbnQgdGFncyBmcm9tIHRob3NlIGFwcGVhcmluZyBpbiBjdXN0b21lciByZWNvcmRzIGNyZWF0ZWQNCi1ieSBvdGhlciBidXNpbmVzcyBhcHBsaWNhdGlvbnM6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0O2FjY3Q6Y3VzdG9tZXIgeG1sbnM6YWNjdD0iaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCI+DQotCSZsdDthY2N0Om5hbWU+Q29ycG9yYXRpb24mbHQ7L2FjY3Q6bmFtZT4NCi0JJmx0O2FjY3Q6b3JkZXIgYWNjdDpyZWY9IjU1NjYiLz4NCi0JJmx0O2FjY3Q6c3RhdHVzPmludm9pY2UmbHQ7L2FjY3Q6c3RhdHVzPg0KLSZsdDsvYWNjdDpjdXN0b21lcj4gIDwvY29kZWJsb2NrPiA8L3A+PHA+VGhlIDxpPm5hbWVzcGFjZSBkZWZpbml0aW9uPC9pPiBpbg0KLXRoZSBmaXJzdCBsaW5lIGFzc2lnbnMgdGhlIG5hbWVzcGFjZSA8aT5odHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwPC9pPiB0bw0KLXRoZSBwcmVmaXguIFRoaXMgcHJlZml4IGlzIHVzZWQgb24gdGhlIGVsZW1lbnQgbmFtZXMgc3VjaCBhcyBuYW1lIGluIG9yZGVyDQotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIG5hbWVzcGFjZS4gQSBzZWNvbmQgYXBwbGljYXRpb24sIGZvciBleGFtcGxlLCBhIGZ1bGZpbGxtZW50DQotc3lzdGVtLCBjYW4gYXNzaWduIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0byBpdHMgY3VzdG9tZXIgZWxlbWVudHM6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0O2Z1bDpjdXN0b21lciB4bWxuczpmdWw9Imh0dHA6Ly93d3cueW91ci5jb20vZnVsIj4NCi0JJmx0O2Z1bDpuYW1lPkNvcnBvcmF0aW9uJmx0Oy9mdWw6bmFtZT4NCi0JJmx0O2Z1bDpvcmRlciBmdWw6cmVmPSJBOTg3NTYiLz4NCi0JJmx0O2Z1bDpzdGF0dXM+c2hpcHBlZCZsdDsvZnVsOnN0YXR1cz4NCi0gJmx0Oy9mdWw6Y3VzdG9tZXI+PC9jb2RlYmxvY2s+IDwvcD48cD5BbiBhcHBsaWNhdGlvbiBwcm9jZXNzaW5nIGJvdGggZGF0YQ0KLXN0cnVjdHVyZXMgaXMgbm93IGFibGUgdG8gdHJlYXQgdGhlIGFjY291bnRpbmcgYW5kIHRoZSBmdWxmaWxsbWVudCBkYXRhIGRpZmZlcmVudGx5Lg0KLVRoZXJlIGlzIGEgZGVmYXVsdCBuYW1lc3BhY2UuIEl0IGlzIHNldCBpZiBubyBsb2NhbCBuYW1lIGlzIGFzc2lnbmVkIGluIHRoZQ0KLW5hbWVzcGFjZSBkZWZpbml0aW9uOjwvcD48cD48Y29kZWJsb2NrPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zPSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIiB4bWxuczphY2N0PSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwICI+DQotJmx0O25hbWU+Q29ycG9yYXRpb24mbHQ7L25hbWU+DQotJmx0O29yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8+DQotJmx0O3N0YXR1cz5pbnZvaWNlJmx0Oy9zdGF0dXM+DQotJmx0Oy9jdXN0b21lcj48L2NvZGVibG9jaz48L3A+PHA+SW4gdGhpcyBleGFtcGxlLCBhbGwgdGFncyBpbiB0aGUgY3VzdG9tZXINCi1yZWNvcmQgYXJlIHF1YWxpZmllZCB0byByZXNpZGUgaW4gdGhlIG5hbWVzcGFjZSA8aT5odHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwLjwvaT4gTm8NCi1leHBsaWNpdCBwcmVmaXggaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIHVzZWQuIE5vdGUgdGhhdA0KLXRoZSBkZWZhdWx0IG5hbWVzcGFjZSBhcHBsaWVzIHRvIGFueSBhdHRyaWJ1dGVzIGRlZmluaXRpb25zLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlhNTCBzY2hlbWFzIGFuZCBuYW1lc3BhY2VzPC90aXRsZT48cD5JbiB0aGUgZm9sbG93aW5nIFhNTA0KLXNjaGVtYSwgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGZvciB0aGUgc2NoZW1hIGlzIGRlZmluZWQgYXMgdGhlIHN0YW5kYXJkIFhNTA0KLXNjaGVtYSBuYW1lc3BhY2UgPGk+aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbTwvaT5hOyB0aGVyZSBpcyBhbHNvIGENCi1zY2hlbWEgc3BlY2lmaWMgbmFtZXNwYWNlIDxpPmh0dHA6Ly93d3cuaWJtLmNvbTwvaT4uPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3NjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczpUZXN0U2NoZW1hPSJodHRwOi8vd3d3LmlibS5jb20iPg0KLSAmbHQ7c2ltcGxlVHlwZSBuYW1lPSJaaXBDb2RlVHlwZSI+DQotICZsdDtyZXN0cmljdGlvbiBiYXNlPSJpbnRlZ2VyIj4NCi0gICZsdDttaW5JbmNsdXNpdmUgdmFsdWU9IjEwMDAwIi8+DQotICZsdDttYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTk5Ii8+DQotJmx0Oy9yZXN0cmljdGlvbj4NCi0gJmx0Oy9zaW1wbGVUeXBlPiANCi0gJmx0OyEtLWVsZW1lbnQgZGVmaW5pdGlvbnMgc2tpcHBlZCAtLT4gIA0KLSZsdDsvc2NoZW1hPiAgPC9jb2RlYmxvY2s+PC9wPjxwPkFzc3VtaW5nIHRoYXQgdGhlIHByZWNlZGluZyBYTUwgc2NoZW1hIGlzDQotc2F2ZWQgYXMgPGZpbGVwYXRoPkM6XHRlbXBcVGVzdFNjaGVtYS54c2Q8L2ZpbGVwYXRoPiwgYSBzYW1wbGUgWE1MIGZpbGUgdGhhdA0KLXZhbGlkYXRlcyBhZ2FpbnN0IHRoaXMgc2NoZW1hIGlzOjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDt4OmFkZHJlc3NMaXN0IHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIGZpbGU6Ly8vQzovdGVtcC9UZXN0U2NoZW1hLnhzZCI+DQotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIGZpbGU6Ly8vQzovdGVtcC9UZXN0U2NoZW1hLnhzZCI+DQotJmx0O3g6YWRkcmVzcz4NCi0gJmx0O3g6c3RyZWV0Png6VmFuZ2Vyb3dzdHJhc3NlJmx0Oy94OnN0cmVldD4NCi0gICZsdDt4OnppcENvZGU+NjkxMTUmbHQ7L3g6emlwQ29kZT4NCi0gJmx0O3g6Y2l0eT54OkhlaWRlbGJlcmcmbHQ7L3g6Y2l0eT4NCi0gJmx0Oy94OmFkZHJlc3M+DQotICAgICZsdDt4OmFkZHJlc3M+IA0KLSZsdDt4OnN0cmVldD54OkJlcm5hbCBSb2FkJmx0Oy94OnN0cmVldD4gDQotJmx0O3g6emlwQ29kZT45MDM3NSZsdDsveDp6aXBDb2RlPg0KLSAgICAgJmx0O3g6Y2l0eT54OlNhbiBKb3NlJmx0Oy94OmNpdHk+DQotICZsdDsveDphZGRyZXNzPg0KLSZsdDsveDphZGRyZXNzTGlzdD4gPC9jb2RlYmxvY2s+PC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+VGFyZ2V0IG5hbWVzcGFjZTwvdGl0bGU+PHA+IFRoZSB0YXJnZXQgbmFtZXNwYWNlIHNlcnZlcyB0bw0KLWlkZW50aWZ5IHRoZSBuYW1lc3BhY2Ugd2l0aGluIHdoaWNoIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBlbGVtZW50IGFuZA0KLWl0cyBuYW1lIGV4aXN0cy4gSW4gdGhlIGNhc2Ugb2YgZGVjbGFyYXRpb25zLCB0aGlzIGFzc29jaWF0aW9uIGRldGVybWluZXMNCi10aGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50cyBpbiBYTUwgZmlsZXMgY29uZm9ybWluZyB0byB0aGUgc2NoZW1hLiBBbiBYTUwNCi1maWxlIGltcG9ydGluZyBhIHNjaGVtYSBtdXN0IHJlZmVyZW5jZSBpdHMgdGFyZ2V0IG5hbWVzcGFjZSBpbiB0aGUgc2NoZW1hTG9jYXRpb24NCi1hdHRyaWJ1dGUuIEFueSBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIGFjdHVhbCBuYW1lc3BhY2Ugb2YgYW4NCi1lbGVtZW50IGFyZSByZXBvcnRlZCBhcyBzY2hlbWEgdmFsaWRhdGlvbiBlcnJvcnMuIEluIG91ciBleGFtcGxlLCB0aGUgdGFyZ2V0DQotbmFtZXNwYWNlIGlzIGh0dHA6Ly93d3cuaWJtLmNvbTsgaXQgaXMgZGVmaW5lZCBpbiB0aGUgIFhNTCBzY2hlbWEgZmlsZSBhbmQNCi1yZWZlcmVuY2VkIHR3aWNlIGluIHRoZSBYTUwgZmlsZS4gQW55IG1pc21hdGNoIGJldHdlZW4gdGhlc2UgdGhyZWUgb2NjdXJyZW5jZXMNCi1vZiB0aGUgbmFtZXNwYWNlIGxlYWQgdG8gdmFsaWRhdGlvbiBlcnJvcnMuPC9wPjxwPiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzDQotc2hvdyBob3cgdGFyZ2V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcyB3b3JrIGluIFhNTCBzY2hlbWFzIGFuZA0KLXRoZWlyIGNvcnJlc3BvbmRpbmcgWE1MIGluc3RhbmNlIGRvY3VtZW50cy48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgMSAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UNCi1hbmQgdW5xdWFsaWZpZWQgbG9jYWxzPC90aXRsZT48cD5UaGUgWE1MIHNjaGVtYTogIDwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIj4NCi0mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDtzZXF1ZW5jZT4NCi0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPiZsdDsvZWxlbWVudD4NCi0mbHQ7L3NlcXVlbmNlPg0KLSZsdDsvY29tcGxleFR5cGU+DQotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIj4mbHQ7L2VsZW1lbnQ+DQotJmx0Oy9zY2hlbWE+IDwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tDQotdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgPGk+dW5xdWFsaWZpZWQ8L2k+LjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICI+DQotJmx0O25hbWU+UGV0ZXIgU21pdGgmbHQ7L25hbWU+DQotJmx0Oy94Ok15QWRkcmVzcz4gPC9jb2RlYmxvY2s+PC9wPjxwPldoZW4gbG9jYWwgZWxlbWVudHMgKHN1Y2ggYXMgdGhlIDxpPiJuYW1lIjwvaT4gZWxlbWVudCkNCi1hbmQgYXR0cmlidXRlcyBhcmUgdW5xdWFsaWZpZWQgaW4gYW4gWE1MIGZpbGUsIHRoZW4gb25seSB0aGUgcm9vdCBlbGVtZW50DQotaXMgcXVhbGlmaWVkLiBTbywgaW4gdGhpcyBleGFtcGxlLCB0aGUgPGk+IngiPC9pPiBuYW1lc3BhY2UgcHJlZml4IGlzIGFzc2lnbmVkDQotdG8gdGhlIHJvb3QgZWxlbWVudCA8aT4iTXlBZGRyZXNzIjwvaT4sIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIG5hbWVzcGFjZSA8aT4iaHR0cDovL3d3dy5pYm0uY29tIiw8L2k+IGJ1dA0KLXRoZTxpPiJ4IjwvaT4gcHJlZml4IGlzIG5vdCBhc3NpZ25lZCB0byB0aGUgbG9jYWwgZWxlbWVudCA8aT4ibmFtZSI8L2k+LjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNhbXBsZSAyIC0gQSBzY2hlbWEgd2l0aCBib3RoIGEgZGVmYXVsdCBhbmQgdGFyZ2V0IG5hbWVzcGFjZQ0KLWFuZCBxdWFsaWZpZWQgbG9jYWxzPC90aXRsZT48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIj4NCi0mbHQ7c2VxdWVuY2U+DQotJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4mbHQ7L2VsZW1lbnQ+DQotJmx0Oy9zZXF1ZW5jZT4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDtlbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSI+Jmx0Oy9lbGVtZW50Pg0KLSAmbHQ7L3NjaGVtYT4gIDwvY29kZWJsb2NrPjwvcD48cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkIGZyb20NCi10aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSA8aT5xdWFsaWZpZWQ8L2k+IFRoaXMNCi1pcyBiZWNhdXNlIHRoZSBlbGVtZW50Rm9ybURlZmF1bHQgYXR0cmlidXRlIGlzIHNldCB0byBxdWFsaWZpZWQgaW4gdGhlIFhNTA0KLXNjaGVtYS48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0gICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICI+IA0KLSZsdDt4Om5hbWU+UGV0ZXIgU21pdGgmbHQ7L3g6bmFtZT4NCi0gJmx0Oy94Ok15QWRkcmVzcz48L2NvZGVibG9jaz4gPC9wPjxwPkluIHRoaXMgZXhhbXBsZSwgdGhlIDxpPiJ4IjwvaT4gbmFtZXNwYWNlDQotcHJlZml4IGlzIGFzc2lnbmVkIHRvIGJvdGggdGhlIHJvb3QgZWxlbWVudCA8aT4iTXlBZGRyZXNzIjwvaT4gYW5kIHRoZSBsb2NhbA0KLWVsZW1lbnQgPGk+Im5hbWUiPC9pPiwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoIHRoZSBuYW1lc3BhY2UgPGk+Imh0dHA6Ly93d3cuaWJtLmNvbSIsPC9pPi48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgMyAtIFNjaGVtYSB3aXRoIHRhcmdldCBOYW1lc3BhY2UsIGFuZCBleHBsaWNpdGx5IGRlZmluZXMNCi14bWxuczp4c2Q8L3RpdGxlPjxwPlRoaXMgWE1MIHNjaGVtYSBhZGRzIHRoaXMgYXR0cmlidXRlOiAgPC9wPjxjb2RlcGg+eG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSA8L2NvZGVwaD48cD5XaGF0DQotdGhpcyBtZWFucyBpcyB0aGF0IGVhY2ggb2YgdGhlIGNvbnN0cnVjdHMgdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgWE1MIHNjaGVtYQ0KLWxhbmd1YWdlIHdpbGwgbmVlZCB0byBiZSBxdWFsaWZpZWQgd2l0aCB0aGUgPHZhcm5hbWU+InhzZCI8L3Zhcm5hbWU+IHByZWZpeC4NCi1Gb3IgZXhhbXBsZSwgeHNkOmNvbXBsZXhUeXBlIGFuZCAgeHNkOnN0cmluZzwvcD48cD4uIE5vdGUgdGhhdCB5b3UgY2FuIGNob3NlDQotYW55IG90aGVyIHByZWZpeGVzIHN1Y2ggYXMgPHZhcm5hbWU+InhzIjwvdmFybmFtZT4gb3IgPHZhcm5hbWU+ImZvb2JhciI8L3Zhcm5hbWU+IGluDQoteW91ciBkZWNsYXJhdGlvbiBhbmQgdXNhZ2UuPC9wPjxwPllvdSBjYW4gc3BlY2lmeSB0aGlzIHByZWZpeCBpbiB0aGUgWE1MIHNjaGVtYQ0KLXByZWZlcmVuY2VzIHBhZ2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L3A+PHA+QWxsDQotdXNlciBkZWZpbmVkIHR5cGVzIGJlbG9uZyB0byB0aGUgbmFtZXNwYWNlICBodHRwOi8vd3d3LmlibS5jb20gYXMgZGVmaW5lZA0KLWJ5IHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlLCBhbmQgdGhlIHByZWZpeCBpcyA8aT4ieCI8L2k+IGFzIGRlZmluZWQNCi1ieSB0aGUgeG1sbnM6eCBhdHRyaWJ1dGUuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3hzZDpzZXF1ZW5jZT4NCi0JCSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7L3hzZDpzZXF1ZW5jZT4NCi0gJmx0Oy94c2Q6Y29tcGxleFR5cGU+DQotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0Oy94c2Q6c2NoZW1hPjwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZA0KLWZyb20gdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgPGk+dW5xdWFsaWZpZWQ8L2k+Lg0KLVRoZSBzZW1hbnRpY3Mgb2YgcXVhbGlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyBTYW1wbGUgMS48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0gJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiPg0KLSZsdDtuYW1lPlBldGVyIFNtaXRoJmx0Oy9uYW1lPg0KLSAmbHQ7L3g6TXlBZGRyZXNzPjwvY29kZWJsb2NrPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNhbXBsZSA0IC0gU2NoZW1hIHdpdGggdW5kZWNsYXJlZCB0YXJnZXQgTmFtZXNwYWNlIHRoYXQgZXhwbGljaXRseQ0KLWRlZmluZXMgeG1sbnM6eHNkPC90aXRsZT48cD5UaGlzIFhNTCBzY2hlbWEgaGFzIG5vIHRhcmdldCBuYW1lc3BhY2UgZm9yIGl0c2VsZi4NCi1JbiB0aGlzIGNhc2UsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IGFsbCBYTUwgc2NoZW1hIGNvbnN0cnVjdHMgYmUgZXhwbGljaXRseQ0KLXF1YWxpZmllZCB3aXRoIGEgcHJlZml4IHN1Y2ggYXMgPGk+InhzZCI8L2k+LiBUaGUgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucw0KLWZyb20gdGhpcyBzY2hlbWEgc3VjaCBhcyA8aT5BZGRyZXNzVHlwZTwvaT4gYXJlIHJlZmVyZW5jZWQgd2l0aG91dCBuYW1lc3BhY2UNCi1xdWFsaWZpY2F0aW9uIHNpbmNlIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSBwcmVmaXguICA8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIj4NCi0mbHQ7eHNkOnNlcXVlbmNlPg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4mbHQ7L3hzZDplbGVtZW50PiANCi0mbHQ7L3hzZDpzZXF1ZW5jZT4gDQotJmx0Oy94c2Q6Y29tcGxleFR5cGU+DQotJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0iQWRkcmVzc1R5cGUiPiZsdDsveHNkOmVsZW1lbnQ+IA0KLSZsdDsveHNkOnNjaGVtYT4gPC9jb2RlYmxvY2s+PC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQNCi1mcm9tIHRoZSBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBBbGwgZWxlbWVudHMgYXJlIDxpPnVucXVhbGlmaWVkPC9pPi48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7TXlBZGRyZXNzIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJ4LnhzZCI+DQotJmx0O25hbWU+bmFtZSZsdDsvbmFtZT4NCi0mbHQ7L015QWRkcmVzcz48L2NvZGVibG9jaz4gIDwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNhbXBsZSA1IC0gQSBzY2hlbWEgd2hlcmUgdGhlIHRhcmdldCBuYW1lc3BhY2UgaXMgdGhlIGRlZmF1bHQNCi1uYW1lc3BhY2U8L3RpdGxlPjxwPlRoaXMgaXMgYW4gWE1MIHNjaGVtYSB3aGVyZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyB0aGUNCi1kZWZhdWx0IG5hbWVzcGFjZS4gQXMgd2VsbCwgdGhlIG5hbWVzcGFjZSBoYXMgbm8gbmFtZXNwYWNlIHByZWZpeC48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0gJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iPg0KLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDt4c2Q6c2VxdWVuY2U+DQotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0Oy94c2Q6c2VxdWVuY2U+DQotJmx0Oy94c2Q6Y29tcGxleFR5cGU+DQotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9IkFkZHJlc3NUeXBlIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSAmbHQ7L3hzZDpzY2hlbWE+IDwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZA0KLWZyb20gdGhlIHNjaGVtYSBsb29rcyBsaWtlIHRoaXM6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0mbHQ7TXlBZGRyZXNzIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIE5ld1hNTFNjaGVtYS54c2QiPg0KLSZsdDtuYW1lPm5hbWUmbHQ7L25hbWU+DQotICZsdDsvTXlBZGRyZXNzPiAgPC9jb2RlYmxvY2s+IDwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTAzZTcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgbmFtZXNwYWNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBuYW1lc3BhY2VzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBuYW1lc3BhY2VzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0cHJlZi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJubXNwYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBuYW1lc3BhY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJybm1zcGMiPjxhIG5hbWU9InJubXNwYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIG5hbWVzcGFjZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJCi1yZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlCi1uYW1lcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlhNTCBuYW1lc3BhY2VzIGFyZSBkZWZpbmVkIGJ5IGEgVzNDIHJlY29tbWVuZGF0aW9uLCBkYXRpbmcgMTQgSmFudWFyeQotMTk5OSwgY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvIiB0YXJnZXQ9Il9ibGFuayI+TmFtZXNwYWNlcyBpbiBYTUw8L2E+LiBYTUwgdGFnIG5hbWVzIHNob3VsZCBiZSBnbG9iYWxseQotdW5pcXVlLCBhcyB3ZWxsIGFzIHNob3J0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJbiBvcmRlciB0byByZXNvbHZlIHRoaXMKLWNvbmZsaWN0LCB0aGUgVzNDIG5hbWVzcGFjZSByZWNvbW1lbmRhdGlvbiBkZWZpbmVzIGFuIGF0dHJpYnV0ZSA8c3Ryb25nPnhtbG5zPC9zdHJvbmc+IHdoaWNoCi1jYW4gYW1lbmQgYW55IFhNTCBlbGVtZW50LiBJZiBpdCBpcyBwcmVzZW50IGluIGFuIGVsZW1lbnQsIGl0IGlkZW50aWZpZXMgdGhlCi1uYW1lc3BhY2UgZm9yIHRoaXMgZWxlbWVudC48L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIHhtbG5zIGF0dHJpYnV0ZSBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6PC9wPgotPHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+eG1sbnM6PHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+PW5hbWVzcGFjZTwvc2FtcD4gPC9wPgotPHA+d2hlcmUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+bmFtZXNwYWNlPC9zYW1wPiBpcyBhIHVuaXF1ZSBVUkkgKHN1Y2ggYXMgd3d3LmlibS5jb20pIGFuZCB3aGVyZSA8c2FtcCBjbGFzcz0iY29kZXBoIj48dmFyIGNsYXNzPSJ2YXJuYW1lIj5wcmVmaXg8L3Zhcj48L3NhbXA+IHJlcHJlc2VudHMKLXRoZSBuYW1lc3BhY2UgYW5kIHByb3ZpZGVzIGEgcG9pbnRlciB0byBpdC48L3A+Ci08cD5JbiB0aGUgZm9sbG93aW5nIGN1c3RvbWVyCi1lbGVtZW50IGRlZmluaXRpb24sIGFuIGFjY291bnRpbmcgbmFtZXNwYWNlIGlzIGRlZmluZWQgaW4gb3JkZXIgdG8gYmUgYWJsZQotdG8gZGlzdGluZ3Vpc2ggdGhlIGVsZW1lbnQgdGFncyBmcm9tIHRob3NlIGFwcGVhcmluZyBpbiBjdXN0b21lciByZWNvcmRzIGNyZWF0ZWQKLWJ5IG90aGVyIGJ1c2luZXNzIGFwcGxpY2F0aW9uczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiJmd0OwotCSZsdDthY2N0Om5hbWUmZ3Q7Q29ycG9yYXRpb24mbHQ7L2FjY3Q6bmFtZSZndDsKLQkmbHQ7YWNjdDpvcmRlciBhY2N0OnJlZj0iNTU2NiIvJmd0OwotCSZsdDthY2N0OnN0YXR1cyZndDtpbnZvaWNlJmx0Oy9hY2N0OnN0YXR1cyZndDsKLSZsdDsvYWNjdDpjdXN0b21lciZndDsgIDwvcHJlPgotIDwvZGl2PgotPHA+VGhlIDxlbT5uYW1lc3BhY2UgZGVmaW5pdGlvbjwvZW0+IGluCi10aGUgZmlyc3QgbGluZSBhc3NpZ25zIHRoZSBuYW1lc3BhY2UgPGVtPmh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTA8L2VtPiB0bwotdGhlIHByZWZpeC4gVGhpcyBwcmVmaXggaXMgdXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lcyBzdWNoIGFzIG5hbWUgaW4gb3JkZXIKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBuYW1lc3BhY2UuIEEgc2Vjb25kIGFwcGxpY2F0aW9uLCBmb3IgZXhhbXBsZSwgYSBmdWxmaWxsbWVudAotc3lzdGVtLCBjYW4gYXNzaWduIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0byBpdHMgY3VzdG9tZXIgZWxlbWVudHM6PC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7ZnVsOmN1c3RvbWVyIHhtbG5zOmZ1bD0iaHR0cDovL3d3dy55b3VyLmNvbS9mdWwiJmd0OwotCSZsdDtmdWw6bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvZnVsOm5hbWUmZ3Q7Ci0JJmx0O2Z1bDpvcmRlciBmdWw6cmVmPSJBOTg3NTYiLyZndDsKLQkmbHQ7ZnVsOnN0YXR1cyZndDtzaGlwcGVkJmx0Oy9mdWw6c3RhdHVzJmd0OwotICZsdDsvZnVsOmN1c3RvbWVyJmd0OzwvcHJlPgotIDwvZGl2PgotPHA+QW4gYXBwbGljYXRpb24gcHJvY2Vzc2luZyBib3RoIGRhdGEKLXN0cnVjdHVyZXMgaXMgbm93IGFibGUgdG8gdHJlYXQgdGhlIGFjY291bnRpbmcgYW5kIHRoZSBmdWxmaWxsbWVudCBkYXRhIGRpZmZlcmVudGx5LgotVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZS4gSXQgaXMgc2V0IGlmIG5vIGxvY2FsIG5hbWUgaXMgYXNzaWduZWQgaW4gdGhlCi1uYW1lc3BhY2UgZGVmaW5pdGlvbjo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zPSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIiB4bWxuczphY2N0PSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwICImZ3Q7Ci0mbHQ7bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvbmFtZSZndDsKLSZsdDtvcmRlciBhY2N0OnJlZj0iNTU2NiIvJmd0OwotJmx0O3N0YXR1cyZndDtpbnZvaWNlJmx0Oy9zdGF0dXMmZ3Q7Ci0mbHQ7L2N1c3RvbWVyJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5JbiB0aGlzIGV4YW1wbGUsIGFsbCB0YWdzIGluIHRoZSBjdXN0b21lcgotcmVjb3JkIGFyZSBxdWFsaWZpZWQgdG8gcmVzaWRlIGluIHRoZSBuYW1lc3BhY2UgPGVtPmh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAuPC9lbT4gTm8KLWV4cGxpY2l0IHByZWZpeCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgdXNlZC4gTm90ZSB0aGF0Ci10aGUgZGVmYXVsdCBuYW1lc3BhY2UgYXBwbGllcyB0byBhbnkgYXR0cmlidXRlcyBkZWZpbml0aW9ucy48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlhNTCBzY2hlbWFzIGFuZCBuYW1lc3BhY2VzPC9oND48cD5JbiB0aGUgZm9sbG93aW5nIFhNTAotc2NoZW1hLCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZSBzY2hlbWEgaXMgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgWE1MCi1zY2hlbWEgbmFtZXNwYWNlIDxlbT5odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtPC9lbT5hOyB0aGVyZSBpcyBhbHNvIGEKLXNjaGVtYSBzcGVjaWZpYyBuYW1lc3BhY2UgPGVtPmh0dHA6Ly93d3cuaWJtLmNvbTwvZW0+LjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOlRlc3RTY2hlbWE9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0gJmx0O3NpbXBsZVR5cGUgbmFtZT0iWmlwQ29kZVR5cGUiJmd0OwotICZsdDtyZXN0cmljdGlvbiBiYXNlPSJpbnRlZ2VyIiZndDsKLSAgJmx0O21pbkluY2x1c2l2ZSB2YWx1ZT0iMTAwMDAiLyZndDsKLSAmbHQ7bWF4SW5jbHVzaXZlIHZhbHVlPSI5OTk5OSIvJmd0OwotJmx0Oy9yZXN0cmljdGlvbiZndDsKLSAmbHQ7L3NpbXBsZVR5cGUmZ3Q7IAotICZsdDshLS1lbGVtZW50IGRlZmluaXRpb25zIHNraXBwZWQgLS0mZ3Q7ICAKLSZsdDsvc2NoZW1hJmd0OyAgPC9wcmU+Ci08L2Rpdj4KLTxwPkFzc3VtaW5nIHRoYXQgdGhlIHByZWNlZGluZyBYTUwgc2NoZW1hIGlzCi1zYXZlZCBhcyA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPkM6XHRlbXBcVGVzdFNjaGVtYS54c2Q8L3NwYW4+LCBhIHNhbXBsZSBYTUwgZmlsZSB0aGF0Ci12YWxpZGF0ZXMgYWdhaW5zdCB0aGlzIHNjaGVtYSBpczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3g6YWRkcmVzc0xpc3QgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gZmlsZTovLy9DOi90ZW1wL1Rlc3RTY2hlbWEueHNkIiZndDsKLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiJmd0OwotJmx0O3g6YWRkcmVzcyZndDsKLSAmbHQ7eDpzdHJlZXQmZ3Q7eDpWYW5nZXJvd3N0cmFzc2UmbHQ7L3g6c3RyZWV0Jmd0OwotICAmbHQ7eDp6aXBDb2RlJmd0OzY5MTE1Jmx0Oy94OnppcENvZGUmZ3Q7Ci0gJmx0O3g6Y2l0eSZndDt4OkhlaWRlbGJlcmcmbHQ7L3g6Y2l0eSZndDsKLSAmbHQ7L3g6YWRkcmVzcyZndDsKLSAgICAmbHQ7eDphZGRyZXNzJmd0OyAKLSZsdDt4OnN0cmVldCZndDt4OkJlcm5hbCBSb2FkJmx0Oy94OnN0cmVldCZndDsgCi0mbHQ7eDp6aXBDb2RlJmd0OzkwMzc1Jmx0Oy94OnppcENvZGUmZ3Q7Ci0gICAgICZsdDt4OmNpdHkmZ3Q7eDpTYW4gSm9zZSZsdDsveDpjaXR5Jmd0OwotICZsdDsveDphZGRyZXNzJmd0OwotJmx0Oy94OmFkZHJlc3NMaXN0Jmd0OyA8L3ByZT4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5UYXJnZXQgbmFtZXNwYWNlPC9oND48cD4gVGhlIHRhcmdldCBuYW1lc3BhY2Ugc2VydmVzIHRvCi1pZGVudGlmeSB0aGUgbmFtZXNwYWNlIHdpdGhpbiB3aGljaCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZWxlbWVudCBhbmQKLWl0cyBuYW1lIGV4aXN0cy4gSW4gdGhlIGNhc2Ugb2YgZGVjbGFyYXRpb25zLCB0aGlzIGFzc29jaWF0aW9uIGRldGVybWluZXMKLXRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnRzIGluIFhNTCBmaWxlcyBjb25mb3JtaW5nIHRvIHRoZSBzY2hlbWEuIEFuIFhNTAotZmlsZSBpbXBvcnRpbmcgYSBzY2hlbWEgbXVzdCByZWZlcmVuY2UgaXRzIHRhcmdldCBuYW1lc3BhY2UgaW4gdGhlIHNjaGVtYUxvY2F0aW9uCi1hdHRyaWJ1dGUuIEFueSBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIGFjdHVhbCBuYW1lc3BhY2Ugb2YgYW4KLWVsZW1lbnQgYXJlIHJlcG9ydGVkIGFzIHNjaGVtYSB2YWxpZGF0aW9uIGVycm9ycy4gSW4gb3VyIGV4YW1wbGUsIHRoZSB0YXJnZXQKLW5hbWVzcGFjZSBpcyBodHRwOi8vd3d3LmlibS5jb207IGl0IGlzIGRlZmluZWQgaW4gdGhlICBYTUwgc2NoZW1hIGZpbGUgYW5kCi1yZWZlcmVuY2VkIHR3aWNlIGluIHRoZSBYTUwgZmlsZS4gQW55IG1pc21hdGNoIGJldHdlZW4gdGhlc2UgdGhyZWUgb2NjdXJyZW5jZXMKLW9mIHRoZSBuYW1lc3BhY2UgbGVhZCB0byB2YWxpZGF0aW9uIGVycm9ycy48L3A+Ci08cD4gVGhlIGZvbGxvd2luZyBleGFtcGxlcwotc2hvdyBob3cgdGFyZ2V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcyB3b3JrIGluIFhNTCBzY2hlbWFzIGFuZAotdGhlaXIgY29ycmVzcG9uZGluZyBYTUwgaW5zdGFuY2UgZG9jdW1lbnRzLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2FtcGxlIDEgLSBBIHNjaGVtYSB3aXRoIGJvdGggYSBkZWZhdWx0IGFuZCB0YXJnZXQgbmFtZXNwYWNlCi1hbmQgdW5xdWFsaWZpZWQgbG9jYWxzPC9oND48cD5UaGUgWE1MIHNjaGVtYTogIDwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiJmd0OwotJmx0O3NlcXVlbmNlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0mbHQ7L3NlcXVlbmNlJmd0OwotJmx0Oy9jb21wbGV4VHlwZSZndDsKLSZsdDtlbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy9lbGVtZW50Jmd0OwotJmx0Oy9zY2hlbWEmZ3Q7IDwvcHJlPgotIDwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tCi10aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSA8ZW0+dW5xdWFsaWZpZWQ8L2VtPi48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIiZndDsKLSZsdDtuYW1lJmd0O1BldGVyIFNtaXRoJmx0Oy9uYW1lJmd0OwotJmx0Oy94Ok15QWRkcmVzcyZndDsgPC9wcmU+Ci08L2Rpdj4KLTxwPldoZW4gbG9jYWwgZWxlbWVudHMgKHN1Y2ggYXMgdGhlIDxlbT4ibmFtZSI8L2VtPiBlbGVtZW50KQotYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkIGluIGFuIFhNTCBmaWxlLCB0aGVuIG9ubHkgdGhlIHJvb3QgZWxlbWVudAotaXMgcXVhbGlmaWVkLiBTbywgaW4gdGhpcyBleGFtcGxlLCB0aGUgPGVtPiJ4IjwvZW0+IG5hbWVzcGFjZSBwcmVmaXggaXMgYXNzaWduZWQKLXRvIHRoZSByb290IGVsZW1lbnQgPGVtPiJNeUFkZHJlc3MiPC9lbT4sIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIG5hbWVzcGFjZSA8ZW0+Imh0dHA6Ly93d3cuaWJtLmNvbSIsPC9lbT4gYnV0Ci10aGU8ZW0+IngiPC9lbT4gcHJlZml4IGlzIG5vdCBhc3NpZ25lZCB0byB0aGUgbG9jYWwgZWxlbWVudCA8ZW0+Im5hbWUiPC9lbT4uPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMiAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UKLWFuZCBxdWFsaWZpZWQgbG9jYWxzPC9oND48ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3NjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiZndDsKLSZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7c2VxdWVuY2UmZ3Q7Ci0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciJmd0OyZsdDsvZWxlbWVudCZndDsKLSZsdDsvc2VxdWVuY2UmZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0gJmx0Oy9zY2hlbWEmZ3Q7ICA8L3ByZT4KLTwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tCi10aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSA8ZW0+cXVhbGlmaWVkPC9lbT4gVGhpcwotaXMgYmVjYXVzZSB0aGUgZWxlbWVudEZvcm1EZWZhdWx0IGF0dHJpYnV0ZSBpcyBzZXQgdG8gcXVhbGlmaWVkIGluIHRoZSBYTUwKLXNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICImZ3Q7IAotJmx0O3g6bmFtZSZndDtQZXRlciBTbWl0aCZsdDsveDpuYW1lJmd0OwotICZsdDsveDpNeUFkZHJlc3MmZ3Q7PC9wcmU+Ci0gPC9kaXY+Ci08cD5JbiB0aGlzIGV4YW1wbGUsIHRoZSA8ZW0+IngiPC9lbT4gbmFtZXNwYWNlCi1wcmVmaXggaXMgYXNzaWduZWQgdG8gYm90aCB0aGUgcm9vdCBlbGVtZW50IDxlbT4iTXlBZGRyZXNzIjwvZW0+IGFuZCB0aGUgbG9jYWwKLWVsZW1lbnQgPGVtPiJuYW1lIjwvZW0+LCBhc3NvY2lhdGluZyB0aGVtIHdpdGggdGhlIG5hbWVzcGFjZSA8ZW0+Imh0dHA6Ly93d3cuaWJtLmNvbSIsPC9lbT4uPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMyAtIFNjaGVtYSB3aXRoIHRhcmdldCBOYW1lc3BhY2UsIGFuZCBleHBsaWNpdGx5IGRlZmluZXMKLXhtbG5zOnhzZDwvaDQ+PHA+VGhpcyBYTUwgc2NoZW1hIGFkZHMgdGhpcyBhdHRyaWJ1dGU6ICA8L3A+Ci08c2FtcCBjbGFzcz0iY29kZXBoIj54bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIDwvc2FtcD48cD5XaGF0Ci10aGlzIG1lYW5zIGlzIHRoYXQgZWFjaCBvZiB0aGUgY29uc3RydWN0cyB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hCi1sYW5ndWFnZSB3aWxsIG5lZWQgdG8gYmUgcXVhbGlmaWVkIHdpdGggdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPiJ4c2QiPC92YXI+IHByZWZpeC4KLUZvciBleGFtcGxlLCB4c2Q6Y29tcGxleFR5cGUgYW5kICB4c2Q6c3RyaW5nPC9wPgotPHA+LiBOb3RlIHRoYXQgeW91IGNhbiBjaG9zZQotYW55IG90aGVyIHByZWZpeGVzIHN1Y2ggYXMgPHZhciBjbGFzcz0idmFybmFtZSI+InhzIjwvdmFyPiBvciA8dmFyIGNsYXNzPSJ2YXJuYW1lIj4iZm9vYmFyIjwvdmFyPiBpbgoteW91ciBkZWNsYXJhdGlvbiBhbmQgdXNhZ2UuPC9wPgotPHA+WW91IGNhbiBzcGVjaWZ5IHRoaXMgcHJlZml4IGluIHRoZSBYTUwgc2NoZW1hCi1wcmVmZXJlbmNlcyBwYWdlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPgotPHA+QWxsCi11c2VyIGRlZmluZWQgdHlwZXMgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgIGh0dHA6Ly93d3cuaWJtLmNvbSBhcyBkZWZpbmVkCi1ieSB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSwgYW5kIHRoZSBwcmVmaXggaXMgPGVtPiJ4IjwvZW0+IGFzIGRlZmluZWQKLWJ5IHRoZSB4bWxuczp4IGF0dHJpYnV0ZS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIiZndDsKLSZsdDt4c2Q6c2VxdWVuY2UmZ3Q7Ci0JCSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDsveHNkOnNlcXVlbmNlJmd0OwotICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OwotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7L3hzZDpzY2hlbWEmZ3Q7PC9wcmU+Ci0gPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkCi1mcm9tIHRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIDxlbT51bnF1YWxpZmllZDwvZW0+LgotVGhlIHNlbWFudGljcyBvZiBxdWFsaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIFNhbXBsZSAxLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiJmd0OwotJmx0O25hbWUmZ3Q7UGV0ZXIgU21pdGgmbHQ7L25hbWUmZ3Q7Ci0gJmx0Oy94Ok15QWRkcmVzcyZndDs8L3ByZT4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgNCAtIFNjaGVtYSB3aXRoIHVuZGVjbGFyZWQgdGFyZ2V0IE5hbWVzcGFjZSB0aGF0IGV4cGxpY2l0bHkKLWRlZmluZXMgeG1sbnM6eHNkPC9oND48cD5UaGlzIFhNTCBzY2hlbWEgaGFzIG5vIHRhcmdldCBuYW1lc3BhY2UgZm9yIGl0c2VsZi4KLUluIHRoaXMgY2FzZSwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgYWxsIFhNTCBzY2hlbWEgY29uc3RydWN0cyBiZSBleHBsaWNpdGx5Ci1xdWFsaWZpZWQgd2l0aCBhIHByZWZpeCBzdWNoIGFzIDxlbT4ieHNkIjwvZW0+LiBUaGUgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucwotZnJvbSB0aGlzIHNjaGVtYSBzdWNoIGFzIDxlbT5BZGRyZXNzVHlwZTwvZW0+IGFyZSByZWZlcmVuY2VkIHdpdGhvdXQgbmFtZXNwYWNlCi1xdWFsaWZpY2F0aW9uIHNpbmNlIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSBwcmVmaXguICA8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7Ci0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIiZndDsKLSZsdDt4c2Q6c2VxdWVuY2UmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7IAotJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7IAotJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsgCi0mbHQ7L3hzZDpzY2hlbWEmZ3Q7IDwvcHJlPgotPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkCi1mcm9tIHRoZSBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBBbGwgZWxlbWVudHMgYXJlIDxlbT51bnF1YWxpZmllZDwvZW0+LjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7TXlBZGRyZXNzIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJ4LnhzZCImZ3Q7Ci0mbHQ7bmFtZSZndDtuYW1lJmx0Oy9uYW1lJmd0OwotJmx0Oy9NeUFkZHJlc3MmZ3Q7PC9wcmU+Ci0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgNSAtIEEgc2NoZW1hIHdoZXJlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIHRoZSBkZWZhdWx0Ci1uYW1lc3BhY2U8L2g0PjxwPlRoaXMgaXMgYW4gWE1MIHNjaGVtYSB3aGVyZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyB0aGUKLWRlZmF1bHQgbmFtZXNwYWNlLiBBcyB3ZWxsLCB0aGUgbmFtZXNwYWNlIGhhcyBubyBuYW1lc3BhY2UgcHJlZml4LjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iJmd0OwotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7eHNkOnNlcXVlbmNlJmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7L3hzZDpzZXF1ZW5jZSZndDsKLSZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OwotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9IkFkZHJlc3NUeXBlIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotICZsdDsveHNkOnNjaGVtYSZndDsgPC9wcmU+Ci0gPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkCi1mcm9tIHRoZSBzY2hlbWEgbG9va3MgbGlrZSB0aGlzOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDtNeUFkZHJlc3MgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gTmV3WE1MU2NoZW1hLnhzZCImZ3Q7Ci0mbHQ7bmFtZSZndDtuYW1lJmx0Oy9uYW1lJmd0OwotICZsdDsvTXlBZGRyZXNzJmd0OyAgPC9wcmU+Ci0gPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHByZWYuaHRtbCIgdGl0bGU9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuIj5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDk4OTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJycmVmaW50ZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+UmVmZXJlbnRpYWwgaW50ZWdyaXR5PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsDQotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQNCi13aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPnJlZmVyZW50aWFsIGludGVncml0eTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmNsZWFuIHVwIGluPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPldoZW4geW91IGRlZmluZSBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0DQotYW5kIHJlZmVyZW5jZSBhIGdsb2JhbCBlbGVtZW50LiA8cD5Gb3IgZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDtzY2hlbWE+DQotICZsdDtlbGVtZW50IG5hbWU9ImNvbW1lbnQiIHR5cGU9InN0cmluZyI+DQotCSZsdDtjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyI+DQotCQkmbHQ7c2VxdWVuY2U+DQotCQkJCSZsdDtlbGVtZW50IHJlZj0iY29tbWVudCI+DQotCQkgJmx0Oy9zZXF1ZW5jZT4NCi0JICZsdDsvY29tcGxleFR5cGU+DQotJmx0Oy9zY2hlbWE+PC9jb2RlYmxvY2s+PC9wPjxwPklmIHRoZSBnbG9iYWwgZWxlbWVudCAoY29tbWVudCkgd2FzIGRlbGV0ZWQsDQotYWxsIHJlZmVyZW5jZXMgdG8gaXQgd291bGQgYmUgaW4gZXJyb3IuIEhvd2V2ZXIsIHdoZW4geW91IGRlbGV0ZSB0aGUgZ2xvYmFsDQotZWxlbWVudCwgdGhlIFhNTCBzY2hlbWEgZWRpdG9yIHdpbGwgY2xlYW4gdXAgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06PC9wPjx1bD4NCi08bGk+SWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGdsb2JhbCBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCBpdCB3aWxsIGNoYW5nZQ0KLWFsbCBleGlzdGluZyByZWZlcmVuY2VzIHRvIHRoZSBmaXJzdCBnbG9iYWwgZWxlbWVudC48L2xpPg0KLTxsaT5JZiB0aGVyZSBpcyBubyBnbG9iYWwgZWxlbWVudCwgdGhlbiBpdCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudCByZWZlcmVuY2UNCi1mcm9tIHRoZSBjb250ZW50IG1vZGVsLjwvbGk+DQotPC91bD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPkRlbGV0aW5nIGluY2x1ZGVkIGFuZCBpbXBvcnRlZCBzY2hlbWE8L3RpdGxlPjxwPklmIGFuIGluY2x1ZGVkDQotb3IgaW1wb3J0ZWQgc2NoZW1hIGlzIGRlbGV0ZWQsIHlvdSBtdXN0IG1hbnVhbGx5IHJlc2V0IHRoZSBmb2xsb3dpbmcgdHlwZQ0KLXJlZmVyZW5jZXMgYXMgYXBwcm9wcmlhdGU6IDx1bD4NCi08bGk+R2xvYmFsIGVsZW1lbnQgYW5kIGVsZW1lbnQncyB0eXBlPC9saT4NCi08bGk+QXR0cmlidXRlIHR5cGU8L2xpPg0KLTxsaT5Db21wbGV4IHR5cGUgZGVyaXZhdGlvbjwvbGk+DQotPGxpPlNpbXBsZSB0eXBlIGRlcml2YXRpb24gPC9saT4NCi08L3VsPlRoZXkgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSByZXNldCBpZiBhbiBpbmNsdWRlZCBvciBpbXBvcnRlZCBzY2hlbWENCi1pcyBkZWxldGVkLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxOWEzYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwgaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQgd2lsbCBhdXRvbWF0aWNhbGx5IG9jY3VyLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbCBpbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBub2RlcywgY2xlYW4gdXAgZm9yIGFueSBub2RlcyBhZmZlY3RlZCB3aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIHJlZmVyZW50aWFsIGludGVncml0eSwgY2xlYW4gdXAgaW4iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgcmVmZXJlbnRpYWwgaW50ZWdyaXR5LCBjbGVhbiB1cCBpbiIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RkZWxzY21wLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icnJlZmludGciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5SZWZlcmVudGlhbCBpbnRlZ3JpdHk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJyZWZpbnRnIj48YSBuYW1lPSJycmVmaW50ZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwKLWludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkCi13aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5XaGVuIHlvdSBkZWZpbmUgYSBjb21wbGV4IHR5cGUsIHlvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBpdAotYW5kIHJlZmVyZW5jZSBhIGdsb2JhbCBlbGVtZW50LiA8ZGl2IGNsYXNzPSJwIj5Gb3IgZXhhbXBsZTo8cHJlPiZsdDtzY2hlbWEmZ3Q7Ci0gJmx0O2VsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ic3RyaW5nIiZndDsKLQkmbHQ7Y29tcGxleFR5cGUgbmFtZT0iSXRlbXMiJmd0OwotCQkmbHQ7c2VxdWVuY2UmZ3Q7Ci0JCQkJJmx0O2VsZW1lbnQgcmVmPSJjb21tZW50IiZndDsKLQkJICZsdDsvc2VxdWVuY2UmZ3Q7Ci0JICZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0mbHQ7L3NjaGVtYSZndDs8L3ByZT4KLTwvZGl2PgotPHA+SWYgdGhlIGdsb2JhbCBlbGVtZW50IChjb21tZW50KSB3YXMgZGVsZXRlZCwKLWFsbCByZWZlcmVuY2VzIHRvIGl0IHdvdWxkIGJlIGluIGVycm9yLiBIb3dldmVyLCB3aGVuIHlvdSBkZWxldGUgdGhlIGdsb2JhbAotZWxlbWVudCwgdGhlIFhNTCBzY2hlbWEgZWRpdG9yIHdpbGwgY2xlYW4gdXAgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06PC9wPgotPHVsPgotPGxpPklmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBnbG9iYWwgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgaXQgd2lsbCBjaGFuZ2UKLWFsbCBleGlzdGluZyByZWZlcmVuY2VzIHRvIHRoZSBmaXJzdCBnbG9iYWwgZWxlbWVudC48L2xpPgotCi08bGk+SWYgdGhlcmUgaXMgbm8gZ2xvYmFsIGVsZW1lbnQsIHRoZW4gaXQgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlCi1mcm9tIHRoZSBjb250ZW50IG1vZGVsLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkRlbGV0aW5nIGluY2x1ZGVkIGFuZCBpbXBvcnRlZCBzY2hlbWE8L2g0PjxkaXYgY2xhc3M9InAiPklmIGFuIGluY2x1ZGVkCi1vciBpbXBvcnRlZCBzY2hlbWEgaXMgZGVsZXRlZCwgeW91IG11c3QgbWFudWFsbHkgcmVzZXQgdGhlIGZvbGxvd2luZyB0eXBlCi1yZWZlcmVuY2VzIGFzIGFwcHJvcHJpYXRlOiA8dWw+Ci08bGk+R2xvYmFsIGVsZW1lbnQgYW5kIGVsZW1lbnQncyB0eXBlPC9saT4KLQotPGxpPkF0dHJpYnV0ZSB0eXBlPC9saT4KLQotPGxpPkNvbXBsZXggdHlwZSBkZXJpdmF0aW9uPC9saT4KLQotPGxpPlNpbXBsZSB0eXBlIGRlcml2YXRpb24gPC9saT4KLQotPC91bD4KLVRoZXkgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSByZXNldCBpZiBhbiBpbmNsdWRlZCBvciBpbXBvcnRlZCBzY2hlbWEKLWlzIGRlbGV0ZWQuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgdGl0bGU9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+WE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIHRpdGxlPSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGRlbHNjbXAuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsIHlvdSBjYW4gZGVsZXRlIHRoZW0uIj5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDAxNGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmljb25zIiB4bWw6bGFuZz0iZW4tdXMiPjw/UHViIENhcmV0MT8+DQotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgc2NoZW1hIGVkaXRvciBpY29uczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLA0KLWFuZCBQcm9wZXJ0aWVzIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmljb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5JY29uczxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHNlY3Rpb24+PC9zZWN0aW9uPg0KLTx0YWJsZT4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIi8+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzEiLz4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiIHZhbGlnbj0iYm90dG9tIj48Yj5JY29uPC9iPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIiB2YWxpZ249ImJvdHRvbSI+PGI+RGVzY3JpcHRpb248L2I+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWFueSBhdHRyaWJ1dGUgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pjxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBbnkuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgYW55IGVsZW1lbnQNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+PGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBdHRyaWJ1dGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgYXR0cmlidXRlDQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzDQotdGhlIGF0dHJpYnV0ZSBncm91cCBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlIGdyb3VwPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMNCi1pcyB0aGUgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBdHRyaWJ1dGVSZWYuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1hdHRyaWJ1dGUgcmVmZXJlbmNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGUgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREFsbC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBjb250ZW50DQotbW9kZWwgLSBhbGwgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbnRlbnQgbW9kZWwgLSBhbGw8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRENob2ljZS5naWYiPjxhbHQ+VGhpcw0KLWdyYXBoaWMgaXMgdGhlIGNvbnRlbnQgbW9kZWwgLSBjaG9pY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIj5jb250ZW50IG1vZGVsIC0gY2hvaWNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYiPjxhbHQ+VGhpcw0KLWdyYXBoaWMgaXMgdGhlIGNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPmNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWFueSBlbGVtZW50IGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jb21wbGV4IHR5cGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNERWxlbWVudC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50DQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWVsZW1lbnQgcmVmZXJlbmNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5lbGVtZW50IHJlZmVyZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotZW51bWVyYXRpb24gaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmVudW1lcmF0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzDQotdGhlIGdsb2JhbCBhdHRyaWJ1dGUgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pmdsb2JhbCBhdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcw0KLXRoZSBnbG9iYWwgZWxlbWVudCBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Z2xvYmFsIGVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREdyb3VwLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGdyb3VwDQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pmdyb3VwPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREdyb3VwUmVmLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGdyb3VwDQotcmVmZXJlbmNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5ncm91cCByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNESW1wb3J0LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGltcG9ydA0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5pbXBvcnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNESW5jbHVkZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBpbmNsdWRlDQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmluY2x1ZGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLXBhdHRlcm4gaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PnBhdHRlcm48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgcmVkZWZpbmUNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+cmVkZWZpbmU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEU2ltcGxlVHlwZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLXNpbXBsZSB0eXBlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5zaW1wbGUgdHlwZTwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCi08P1B1YiAqMDAwMDAwNDU4MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjY4YTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYSBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lLCBEZXNpZ24sIGFuZCBQcm9wZXJ0aWVzIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYSBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lLCBEZXNpZ24sIGFuZCBQcm9wZXJ0aWVzIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGljb25zLCBJY29ucyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpY29ucywgSWNvbnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJpY29ucyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yIGljb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyaWNvbnMiPjxhIG5hbWU9InJpY29ucyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYSBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lLCBEZXNpZ24sCi1hbmQgUHJvcGVydGllcyB2aWV3LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJib3R0b20iPjxzdHJvbmc+SWNvbjwvc3Ryb25nPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RBbnlBdHRyaWJ1dGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO2FueSBhdHRyaWJ1dGUgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj48c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RBbnkuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgYW55IGVsZW1lbnQmIzEwO2ljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+PHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUmIzEwO2ljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+YXR0cmlidXRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMmIzEwO3RoZSBhdHRyaWJ1dGUgZ3JvdXAgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGUgZ3JvdXA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyYjMTA7aXMgdGhlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7YXR0cmlidXRlIHJlZmVyZW5jZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmF0dHJpYnV0ZSByZWZlcmVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQWxsLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQmIzEwO21vZGVsIC0gYWxsIGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+Y29udGVudCBtb2RlbCAtIGFsbDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIiBhbHQ9IlRoaXMmIzEwO2dyYXBoaWMgaXMgdGhlIGNvbnRlbnQgbW9kZWwgLSBjaG9pY2UgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb250ZW50IG1vZGVsIC0gY2hvaWNlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiIgYWx0PSJUaGlzJiMxMDtncmFwaGljIGlzIHRoZSBjb250ZW50IG1vZGVsIC0gc2VxdWVuY2UgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb250ZW50IG1vZGVsIC0gc2VxdWVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO2FueSBlbGVtZW50IGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+Y29tcGxleCB0eXBlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREVsZW1lbnQuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgZWxlbWVudCYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5lbGVtZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREVsZW1lbnRSZWYuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO2VsZW1lbnQgcmVmZXJlbmNlIGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+ZWxlbWVudCByZWZlcmVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7ZW51bWVyYXRpb24gaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5lbnVtZXJhdGlvbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyYjMTA7dGhlIGdsb2JhbCBhdHRyaWJ1dGUgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5nbG9iYWwgYXR0cmlidXRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMmIzEwO3RoZSBnbG9iYWwgZWxlbWVudCBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmdsb2JhbCBlbGVtZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RHcm91cC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBncm91cCYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5ncm91cDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RHcm91cFJlZi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBncm91cCYjMTA7cmVmZXJlbmNlIGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+Z3JvdXAgcmVmZXJlbmNlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREltcG9ydC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBpbXBvcnQmIzEwO2ljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+aW1wb3J0PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREluY2x1ZGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgaW5jbHVkZSYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO3BhdHRlcm4gaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5wYXR0ZXJuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRFJlZGVmaW5lLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIHJlZGVmaW5lJiMxMDtpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPnJlZGVmaW5lPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO3NpbXBsZSB0eXBlIGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+c2ltcGxlIHR5cGU8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzE5YjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGFkZGFncnAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgYXR0cmlidXRlIGdyb3Vwczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgbmFtZQ0KLWFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucw0KLWNhbiBncmVhdGx5IGZhY2lsaXRhdGUgdGhlIG1haW50ZW5hbmNlIGFuZCByZXVzZSBvZiBjb21tb24gYXR0cmlidXRlIGRlY2xhcmF0aW9ucw0KLWluIGFuIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+YXR0cmlidXRlDQotZ3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YXR0cmlidXRlcw0KLWdyb3VwczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwNCi1zY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+YXR0cmlidXRlIGdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YXR0cmlidXRlcyBncm91cHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBhdHRyaWJ1dGUNCi1ncm91cCB0byBhbiBYTUwgc2NoZW1hLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgdGhlIDx1aWNvbnRyb2w+QXR0cmlidXRlIEdyb3VwczwvdWljb250cm9sPiBmb2xkZXINCi1hbmQgY2xpY2sgIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZSBHcm91cDwvdWljb250cm9sPi48L2NtZD48aW5mbz5JdCBhcHBlYXJzDQotaW4gdGhlIDx1aWNvbnRyb2w+QXR0cmlidXRlIEdyb3VwczwvdWljb250cm9sPiBmb2xkZXIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB5b3VyIG5ldyBncm91cCwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlDQotYXR0cmlidXRlIGdyb3VwIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LiBJbiB0aGUgPHVpY29udHJvbD5OZXcgTmFtZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGF0dHJpYnV0ZSBncm91cC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBhZGQgYW4gYXR0cmlidXRlLCByaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZQ0KLXZpZXcsIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZTwvdWljb250cm9sPi48L2NtZD48aW5mbz5UaGUgYXR0cmlidXRlDQotYXBwZWFycyBiZWxvdyB0aGUgYXR0cmlidXRlIGdyb3VwIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB0aGUgYXR0cmlidXRlLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgY3VycmVudA0KLShkZWZhdWx0KSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHRoZW4gdHlwZSB0aGUgbmV3IDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPi48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBhdHRyaWJ1dGUgdHlwZQ0KLWFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdCBicm93c2UgdG8gaW52b2tlDQotdGhlIFNldCBUeXBlIG1lbnUgZm9yIG1vcmUgb3B0aW9ucy48L2NtZD48aW5mbz5UaGUgU2V0IFR5cGUgZGlhbG9nIGxpc3RzIGFsbA0KLWJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YNCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluDQotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBhdHRyaWJ1dGUuDQotVG8gYWRkIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbXBsZXgNCi10eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGUgUmVmPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPkEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkDQotYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nDQotZGVjbGFyYXRpb24uIFNlbGVjdCB0aGUgcmVmZXJlbmNlLCB0aGVuIHNlbGVjdCB0aGUgYXR0cmlidXRlIGdyb3VwIHlvdSB3YW50DQotaXQgdG8gcmVmZXJlbmNlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGZyb20gdGhlPHVpY29udHJvbD5SZWY8L3VpY29udHJvbD4gbWVudS48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUNCi1ncm91cC4gVG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sNCi10aGUgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGUNCi1Hcm91cCBSZWY8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+QSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgYXR0cmlidXRlDQotZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUNCi1jb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4gc2VsZWN0DQotdGhlIGF0dHJpYnV0ZSBncm91cCB5b3Ugd2FudCBpdCB0byByZWZlcmVuY2UgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgZnJvbQ0KLXRoZTx1aWNvbnRyb2w+UmVmPC91aWNvbnRyb2w+IG1lbnUuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgZW5hYmxlcyBlbGVtZW50IGNvbnRlbnQgYWNjb3JkaW5nDQotdG8gbmFtZXNwYWNlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZSBlbGVtZW50DQotZW5hYmxlcyBhdHRyaWJ1dGVzIHRvIGFwcGVhciBpbiBlbGVtZW50cy4gVG8gYWRkIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZSwNCi1yaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQW55IEF0dHJpYnV0ZTwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXBwZWFycyBiZWxvdyB0aGUgYXR0cmlidXRlIGdyb3VwIGluIHRoZSBPdXRsaW5lDQotdmlldy4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGU6PC9pbmZvPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+Rm9yIGEgPHVpY29udHJvbD5uYW1lc3BhY2U8L3VpY29udHJvbD48P1B1YiBDYXJldD8+IHZhbHVlLCB5b3UgY2FuDQotc2VsZWN0Ojx1bD4NCi08bGk+PGI+IyNhbnk8L2I+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI2xvY2FsIDwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQNCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI290aGVyPC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPg0KLTxsaT48Yj4jI3RhcmdldE5hbWVzcGFjZSA8L2I+LiBUaGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UNCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08Y2hvaWNlPkZvciBhIDx1aWNvbnRyb2w+cHJvY2Vzc0NvbnRlbnRzPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+DQotPGxpPjxiPnNraXA8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQNCi1hdCBhbGwuPC9saT4NCi08bGk+PGI+bGF4PC9iPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQgYXMgbXVjaA0KLWFzIGl0IGNhbi48L2xpPg0KLTxsaT48Yj5zdHJpY3Q8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgYXR0cmlidXRlIGNvbnRlbnQuPC9saT4NCi08L3VsPjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNTc2OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDBiM2IwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgbmFtZSBhbmQgYSBzZXQgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gTmFtZWQgZ3JvdXBzIG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgY2FuIGdyZWF0bHkgZmFjaWxpdGF0ZSB0aGUgbWFpbnRlbmFuY2UgYW5kIHJldXNlIG9mIGNvbW1vbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGluIGFuIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBuYW1lIGFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBjYW4gZ3JlYXRseSBmYWNpbGl0YXRlIHRoZSBtYWludGVuYW5jZSBhbmQgcmV1c2Ugb2YgY29tbW9uIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgaW4gYW4gWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBhdHRyaWJ1dGUgZ3JvdXBzLCBhdHRyaWJ1dGVzIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcywgYXR0cmlidXRlIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcywgYXR0cmlidXRlcyBncm91cHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBhdHRyaWJ1dGUgZ3JvdXBzLCBhdHRyaWJ1dGVzIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcywgYXR0cmlidXRlIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcywgYXR0cmlidXRlcyBncm91cHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRhZ3JwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRhZ3JwIj48YSBuYW1lPSJ0YWRkYWdycCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBuYW1lCi1hbmQgYSBzZXQgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gTmFtZWQgZ3JvdXBzIG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMKLWNhbiBncmVhdGx5IGZhY2lsaXRhdGUgdGhlIG1haW50ZW5hbmNlIGFuZCByZXVzZSBvZiBjb21tb24gYXR0cmlidXRlIGRlY2xhcmF0aW9ucwotaW4gYW4gWE1MIHNjaGVtYS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGF0dHJpYnV0ZQotZ3JvdXAgdG8gYW4gWE1MIHNjaGVtYSwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXR0cmlidXRlIEdyb3Vwczwvc3Bhbj4gZm9sZGVyCi1hbmQgY2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGUgR3JvdXA8L3NwYW4+Ljwvc3Bhbj4gSXQgYXBwZWFycwotaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF0dHJpYnV0ZSBHcm91cHM8L3NwYW4+IGZvbGRlci48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIG5ldyBncm91cCwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlCi1hdHRyaWJ1dGUgZ3JvdXAgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj4KLTwvc3Bhbj4uIEluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgTmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgYSBuYW1lCi1mb3IgdGhlIGF0dHJpYnV0ZSBncm91cC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhZGQgYW4gYXR0cmlidXRlLCByaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZQotdmlldywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZTwvc3Bhbj4uPC9zcGFuPiBUaGUgYXR0cmlidXRlCi1hcHBlYXJzIGJlbG93IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaW4gdGhlIE91dGxpbmUgdmlldy4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50Ci0oZGVmYXVsdCkgbmFtZSBvZiB0aGUgYXR0cmlidXRlLCB0aGVuIHR5cGUgdGhlIG5ldyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGF0dHJpYnV0ZSB0eXBlCi1hbmQgc2VsZWN0IGEgdHlwZSBmcm9tIHRoZSBtZW51LiBBbHRlcm5hdGVseSwgeW91IGNhbiBzZWxlY3QgYnJvd3NlIHRvIGludm9rZQotdGhlIFNldCBUeXBlIG1lbnUgZm9yIG1vcmUgb3B0aW9ucy48L3NwYW4+IFRoZSBTZXQgVHlwZSBkaWFsb2cgbGlzdHMgYWxsCi1idWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY29wZTwvc3Bhbj4gb2YKLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbgoteW91ciB3b3Jrc3BhY2UuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNsb3NpbmcgUHJvamVjdDwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4KLQotPGxpPihEZWZhdWx0KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXJyZW50IFJlc291cmNlPC9zcGFuPi4gTGlzdCBhbGwgb2YgdGhlIHR5cGVzCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBhdHRyaWJ1dGUuCi1UbyBhZGQgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29tcGxleAotdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZSBSZWY8L3NwYW4+Ljwvc3Bhbj4KLSBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBhdHRyaWJ1dGUgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZAotYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nCi1kZWNsYXJhdGlvbi4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQKLWl0IHRvIHJlZmVyZW5jZSBpbiB0aGUgUHJvcGVydGllcyB2aWV3LCBmcm9tIHRoZTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZjwvc3Bhbj4gbWVudS4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUKLWdyb3VwLiBUbyBhZGQgYW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljawotdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZQotR3JvdXAgUmVmPC9zcGFuPi48L3NwYW4+IEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZQotZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUKLWNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBzZWxlY3QKLXRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGZyb20KLXRoZTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZjwvc3Bhbj4gbWVudS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCBlbmFibGVzIGVsZW1lbnQgY29udGVudCBhY2NvcmRpbmcKLXRvIG5hbWVzcGFjZXMsIGFuZCB0aGUgY29ycmVzcG9uZGluZyA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZSBlbGVtZW50Ci1lbmFibGVzIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIGluIGVsZW1lbnRzLiBUbyBhZGQgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGUsCi1yaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFueSBBdHRyaWJ1dGU8L3NwYW4+Ljwvc3Bhbj4KLSBUaGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhcHBlYXJzIGJlbG93IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaW4gdGhlIE91dGxpbmUKLXZpZXcuIFlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGU6Ci08dWw+Ci08bGk+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bmFtZXNwYWNlPC9zcGFuPiB2YWx1ZSwgeW91IGNhbgotc2VsZWN0Ojx1bD4KLTxsaT48c3Ryb25nPiMjYW55PC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI2xvY2FsIDwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBkZWNsYXJlZAotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNvdGhlcjwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tIHRoZSB0YXJnZXQKLW5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjdGFyZ2V0TmFtZXNwYWNlIDwvc3Ryb25nPi4gVGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGk+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cHJvY2Vzc0NvbnRlbnRzPC9zcGFuPiB2YWx1ZSwgeW91IGNhbiBzZWxlY3Q6PHVsPgotPGxpPjxzdHJvbmc+c2tpcDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50Ci1hdCBhbGwuPC9saT4KLQotPGxpPjxzdHJvbmc+bGF4PC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudCBhcyBtdWNoCi1hcyBpdCBjYW4uPC9saT4KLQotPGxpPjxzdHJvbmc+c3RyaWN0PC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgYXR0cmlidXRlIGNvbnRlbnQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjU4MmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRhbnllIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzDQotYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4NCi1UaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LCBzdWNoIGFzIGFuIEhUTUwgV2ViDQotcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+YW4gYW55IGVsZW1lbnQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hbiBhbnkgZWxlbWVudDxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmFuIGFueSBlbGVtZW50PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hbiBhbnkgZWxlbWVudDxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Gb3IgZXhhbXBsZTo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7ZWxlbWVudCBuYW1lID0gIk15V2ViUGFnZSI+DQotJmx0O2NvbXBsZXhUeXBlPg0KLSZsdDthbnkgbmFtZXNwYWNlID0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbD4NCi0gJmx0OyBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDsvZWxlbWVudD48L2NvZGVibG9jaz48L3A+PHA+VGhlIHByZWNlZGluZyBzY2hlbWEgZnJhZ21lbnQgYWxsb3dzIGEgPGNvZGVwaD4mbHQ7TXlXZWJQYWdlPjwvY29kZXBoPiBlbGVtZW50DQotdG8gY29udGFpbiBhbnkgd2VsbC1mb3JtZWQgWEhUTUwgZGF0YSB0aGF0IGFwcGVhcnMgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9wPjxwPlRoZQ0KLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5DQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50OjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgdGhhdCB5b3Ugd2FudA0KLXRvIHdvcmsgd2l0aCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQW55PC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIG5ldyA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcgb2YgdGhlIHNjaGVtYSBlZGl0b3IsIGZvciBhIDx1aWNvbnRyb2w+bmFtZXNwYWNlPC91aWNvbnRyb2w+IDw/UHViIENhcmV0MT8+dmFsdWUsDQoteW91IGNhbiBzZWxlY3Q6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48Yj4jI2FueTwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgZnJvbSBhbnkgbmFtZXNwYWNlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PGI+IyNsb2NhbCA8L2I+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGRlY2xhcmVkDQotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9jaG9pY2U+DQotPGNob2ljZT48Yj4jI290aGVyIDwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbQ0KLXRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9jaG9pY2U+DQotPGNob2ljZT48Yj4jI3RhcmdldE5hbWVzcGFjZTwvYj4uIFRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQ0KLW9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZvciBhIDx1aWNvbnRyb2w+cHJvY2Vzc0NvbnRlbnRzPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPjxiPnNraXA8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgY29udGVudCBhdCBhbGwuPC9jaG9pY2U+DQotPGNob2ljZT48Yj5sYXg8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBjb250ZW50IGFzIG11Y2ggYXMNCi1pdCBjYW4uPC9jaG9pY2U+DQotPGNob2ljZT48Yj5zdHJpY3Q8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgY29udGVudC48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+bWluT2NjdXJzPC91aWNvbnRyb2w+IHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgdGltZXMNCi10aGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBtdXN0IGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gWW91DQotY2FuIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdGhlIGVsZW1lbnQgdG8gYmUgb3B0aW9uYWw7DQotb3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5tYXhPY2N1cnM8L3VpY29udHJvbD4gdmFsdWUgaXMgdGhlIG1heGltdW0gbnVtYmVyDQotb2YgdGltZXMgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50Lg0KLVlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPiwgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LCBvciwgdG8NCi1pbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcywgPHVpY29udHJvbD51bmJvdW5kZWQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPihjKSBDb3B5cmlnaHQgMjAwMSwgV29ybGQgV2lkZSBXZWIgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mDQotVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwNCi1LZWlvIFVuaXZlcnNpdHkpLjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQyOTE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0MGVjYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGFuIGFueSBlbGVtZW50IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgYW4gYW55IGVsZW1lbnQsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBhbiBhbnkgZWxlbWVudCwgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGFueWUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRhbnllIj48YSBuYW1lPSJ0YWRkYW55ZSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMKLWEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuCi1UaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LCBzdWNoIGFzIGFuIEhUTUwgV2ViCi1wYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0O2VsZW1lbnQgbmFtZSA9ICJNeVdlYlBhZ2UiJmd0OwotJmx0O2NvbXBsZXhUeXBlJmd0OwotJmx0O2FueSBuYW1lc3BhY2UgPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJmd0OwotICZsdDsgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8mZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotJmx0Oy9lbGVtZW50Jmd0OzwvcHJlPgotPC9kaXY+Ci08cD5UaGUgcHJlY2VkaW5nIHNjaGVtYSBmcmFnbWVudCBhbGxvd3MgYSA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7TXlXZWJQYWdlJmd0Ozwvc2FtcD4gZWxlbWVudAotdG8gY29udGFpbiBhbnkgd2VsbC1mb3JtZWQgWEhUTUwgZGF0YSB0aGF0IGFwcGVhcnMgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9wPgotPHA+VGhlCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudDo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB0aGF0IHlvdSB3YW50Ci10byB3b3JrIHdpdGggYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBbnk8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIG5ldyA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldyBvZiB0aGUgc2NoZW1hIGVkaXRvciwgZm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bmFtZXNwYWNlPC9zcGFuPiB2YWx1ZSwKLXlvdSBjYW4gc2VsZWN0Ojwvc3Bhbj4KLTx1bD4KLTxsaT48c3Ryb25nPiMjYW55PC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI2xvY2FsIDwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBkZWNsYXJlZAotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNvdGhlciA8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbQotdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08bGk+PHN0cm9uZz4jI3RhcmdldE5hbWVzcGFjZTwvc3Ryb25nPi4gVGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cHJvY2Vzc0NvbnRlbnRzPC9zcGFuPiB2YWx1ZSwgeW91IGNhbiBzZWxlY3Q6PC9zcGFuPgotPHVsPgotPGxpPjxzdHJvbmc+c2tpcDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGNvbnRlbnQgYXQgYWxsLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmxheDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgY29udGVudCBhcyBtdWNoIGFzCi1pdCBjYW4uPC9saT4KLQotPGxpPjxzdHJvbmc+c3RyaWN0PC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgY29udGVudC48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5taW5PY2N1cnM8L3NwYW4+IHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgdGltZXMKLXRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgbXVzdCBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIFlvdQotY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPiBpZiB5b3Ugd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbDsKLW90aGVyd2lzZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bWF4T2NjdXJzPC9zcGFuPiB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXIKLW9mIHRpbWVzIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LgotWW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LCBvciwgdG8KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD4oYykgQ29weXJpZ2h0IDIwMDEsIFdvcmxkIFdpZGUgV2ViIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZgotVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwKLUtlaW8gVW5pdmVyc2l0eSkuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODMxMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRjbW9kIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgY29udGVudCBtb2RlbHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBjb250ZW50IG1vZGVsczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZA0KLWluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwNCi1kZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbA0KLWVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQNCi1pbnN0YW5jZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5jb250ZW50DQotbW9kZWxzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Y29udGVudA0KLW1vZGVsczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwNCi1zY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Y29udGVudCBtb2RlbHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmNvbnRlbnQgbW9kZWxzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQga2luZHMgb2YgY29udGVudCBtb2RlbHM6PHVsPg0KLTxsaT48Yj5TZXF1ZW5jZTwvYj4sIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4gY2FuDQotYXBwZWFyIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hLiBUaGV5IG11c3QsIGhvd2V2ZXIsIGFwcGVhciBpbiB0aGUNCi1vcmRlciB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4NCi08bGk+PGI+Q2hvaWNlPC9iPiwgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IG9uZSBvZiB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuDQotY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYS48L2xpPg0KLTxsaT48Yj5BbGw8L2I+LCB3aGljaCBtZWFucyB0aGF0IGFsbCBvZiB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuIGNhbiBhcHBlYXINCi1vbmNlIG9yIG5vdCBhdCBhbGwsIGFuZCB0aGV5IGNhbiBhcHBlYXIgaW4gYW55IG9yZGVyLiBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLA0KLWFsbCBvZiB0aGUgY29udGVudHMgbW9kZWwncyBjaGlsZHJlbiBtdXN0IGJlIGluZGl2aWR1YWwgZWxlbWVudHMgYW5kIG5vIGVsZW1lbnQNCi1pbiB0aGUgY29udGVudCBtb2RlbCBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlLjwvbGk+DQotPC91bD48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGNvbnRlbnQNCi1tb2RlbCB0byBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgZm9sbG93IHRoZXNlDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB5b3VyIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXA6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5JZiB5b3Ugc2VsZWN0ZWQgYSBjb21wbGV4IHR5cGUsIHlvdSBjYW4gcmlnaHQtY2xpY2sgaXQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotU2VxdWVuY2U8L3VpY29udHJvbD4sIG9yIDx1aWNvbnRyb2w+QWRkIENob2ljZTwvdWljb250cm9sPiB0byBhZGQgdGhlIHR5cGUNCi1vZiBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHlvdXIgY29tcGxleCB0eXBlLiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDx1aWNvbnRyb2w+YWxsPC91aWNvbnRyb2w+IGNvbnRlbnQNCi1tb2RlbCwgeW91IGNhbiBjaGFuZ2UgdGhlIG1vZGVsIGJ5IGNsaWNraW5nIHRoZSBtb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcsDQotYW5kIGluIHByb3BlcnRpZXMsIHNlbGVjdCA8dWljb250cm9sPmFsbDwvdWljb250cm9sPiBhcyB0aGUgPHVpY29udHJvbD5LaW5kPC91aWNvbnRyb2w+Lg0KLVlvdXIgY29udGVudCBtb2RlbCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGEgY2hpbGQgb2YgeW91ciBjb21wbGV4IHR5cGUNCi0tIGV4cGFuZCBpbiB0aGUgT3V0bGluZSB2aWV3IHRvIHNlZSBpdC4gPGI+Tm90ZTo8L2I+IFRoZXNlIG9wdGlvbnMgd2lsbCBub3QNCi1hcHBlYXIgaWYgeW91IGhhdmUgc2V0IGEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZS4gWW91IGNhbiBlaXRoZXIgc2V0DQotYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UgYWRkIGEgY29udGVudCBtb2RlbCB0byBpdCwgYnV0IHlvdQ0KLWNhbm5vdCBkbyBib3RoLjwvY2hvaWNlPg0KLTxjaG9pY2U+WW91ciBncm91cCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCBhIHNlcXVlbmNlIGNvbnRlbnQgbW9kZWwNCi1jaGlsZC4gRXhwYW5kIGl0IGluIHRoZSBPdXRsaW5lIHZpZXcgdG8gc2VlIGl0IGFuZCBzZWxlY3QgaXQuIEluIHRoZSBQcm9wZXJ0aWVzDQotdmlldywgeW91IGNhbiBzZWxlY3QgdG8gY2hhbmdlIGl0IHRvIGEgPHVpY29udHJvbD5jaG9pY2U8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5hbGw8L3VpY29udHJvbD4gY29udGVudA0KLW1vZGVsIGJ5IHNlbGVjdGluZyB0aGVzZSBvcHRpb25zIGZyb20gdGhlIDx1aWNvbnRyb2w+S2luZDwvdWljb250cm9sPiBtZW51LjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWluT2NjdXJzPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPlRoaXMgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBjb250ZW50IG1vZGVsIG11c3QgYXBwZWFyLiBJZg0KLXlvdSB3YW50IHRoZSBjb250ZW50IG1vZGVsIHRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHVpY29udHJvbD4wPC91aWNvbnRyb2w+Lg0KLU90aGVyd2lzZSwgc2VsZWN0IDx1aWNvbnRyb2w+MTwvdWljb250cm9sPi4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NYXhPY2N1cnM8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgYSBjb250ZW50IG1vZGVsIGNhbiBhcHBlYXIuIFlvdQ0KLWNhbiBzZWxlY3QgPHVpY29udHJvbD51bmJvdW5kZWQ8L3VpY29udHJvbD4gdG8gaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bQ0KLW51bWJlciBvZiBvY2N1cnJlbmNlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQgbW9kZWwuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48P1B1YiBDYXJldD8+PC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIGl0ZW1zIHRvIGEgY29udGVudCBvYmplY3QgbW9kZWwuIDwvcD48dWw+DQotPGxpPkFub3RoZXIgY29udGVudCBtb2RlbC48L2xpPg0KLTxsaT5BIGdyb3VwIHJlZmVyZW5jZSB3aGljaCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUNCi1pbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFRoaXMgbWVudQ0KLW9wdGlvbiBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50DQotb3IgaWYgZ3JvdXBzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGVkIHNjaGVtYXMuPC9saT4NCi08bGk+QW4gZWxlbWVudCwgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC48L2xpPg0KLTxsaT5BbiBlbGVtZW50IHJlZmVyZW5jZSwgd2hpY2ggcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4NCi1UaGlzIG1lbnUgb3B0aW9uIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUgZ2xvYmFsIGVsZW1lbnRzIGRlZmluZWQgZWxzZXdoZXJlDQotaW4gdGhlIGRvY3VtZW50LjwvbGk+DQotPGxpPkFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQuIFlvdSBjYW4gdXNlIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQNCi10byBleHRlbmQgeW91ciBjb250ZW50IG1vZGVsIGJ5IGFueSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpZWQgbmFtZXNwYWNlLjwvbGk+DQotPC91bD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDUzMTc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwYWZlMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGNvbnRlbnQgbW9kZWxzLCBYTUwgc2NoZW1hIGZpbGVzLCBjb250ZW50IG1vZGVscywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGNvbnRlbnQgbW9kZWxzLCBYTUwgc2NoZW1hIGZpbGVzLCBjb250ZW50IG1vZGVscywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRncnByLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGNtb2QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgY29udGVudCBtb2RlbHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRjbW9kIj48YSBuYW1lPSJ0YWRkY21vZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZAotaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbAotZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwKLWVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQKLWluc3RhbmNlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0icCI+VGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBraW5kcyBvZiBjb250ZW50IG1vZGVsczo8dWw+Ci08bGk+PHN0cm9uZz5TZXF1ZW5jZTwvc3Ryb25nPiwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbiBjYW4KLWFwcGVhciBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYS4gVGhleSBtdXN0LCBob3dldmVyLCBhcHBlYXIgaW4gdGhlCi1vcmRlciB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4KLQotPGxpPjxzdHJvbmc+Q2hvaWNlPC9zdHJvbmc+LCB3aGljaCBtZWFucyB0aGF0IG9ubHkgb25lIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4KLWNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4KLQotPGxpPjxzdHJvbmc+QWxsPC9zdHJvbmc+LCB3aGljaCBtZWFucyB0aGF0IGFsbCBvZiB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuIGNhbiBhcHBlYXIKLW9uY2Ugb3Igbm90IGF0IGFsbCwgYW5kIHRoZXkgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIuIElmIHlvdSBzZWxlY3QgdGhpcyBvcHRpb24sCi1hbGwgb2YgdGhlIGNvbnRlbnRzIG1vZGVsJ3MgY2hpbGRyZW4gbXVzdCBiZSBpbmRpdmlkdWFsIGVsZW1lbnRzIGFuZCBubyBlbGVtZW50Ci1pbiB0aGUgY29udGVudCBtb2RlbCBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgY29udGVudAotbW9kZWwgdG8gYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIGZvbGxvdyB0aGVzZQotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgeW91ciBjb21wbGV4IHR5cGUsIG9yIGdyb3VwOjwvc3Bhbj4KLTx1bD4KLTxsaT5JZiB5b3Ugc2VsZWN0ZWQgYSBjb21wbGV4IHR5cGUsIHlvdSBjYW4gcmlnaHQtY2xpY2sgaXQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotU2VxdWVuY2U8L3NwYW4+LCBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQ2hvaWNlPC9zcGFuPiB0byBhZGQgdGhlIHR5cGUKLW9mIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8geW91ciBjb21wbGV4IHR5cGUuIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YWxsPC9zcGFuPiBjb250ZW50Ci1tb2RlbCwgeW91IGNhbiBjaGFuZ2UgdGhlIG1vZGVsIGJ5IGNsaWNraW5nIHRoZSBtb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcsCi1hbmQgaW4gcHJvcGVydGllcywgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFsbDwvc3Bhbj4gYXMgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktpbmQ8L3NwYW4+LgotWW91ciBjb250ZW50IG1vZGVsIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMgYSBjaGlsZCBvZiB5b3VyIGNvbXBsZXggdHlwZQotLSBleHBhbmQgaW4gdGhlIE91dGxpbmUgdmlldyB0byBzZWUgaXQuIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlc2Ugb3B0aW9ucyB3aWxsIG5vdAotYXBwZWFyIGlmIHlvdSBoYXZlIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUuIFlvdSBjYW4gZWl0aGVyIHNldAotYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UgYWRkIGEgY29udGVudCBtb2RlbCB0byBpdCwgYnV0IHlvdQotY2Fubm90IGRvIGJvdGguPC9saT4KLQotPGxpPllvdXIgZ3JvdXAgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdpdGggYSBzZXF1ZW5jZSBjb250ZW50IG1vZGVsCi1jaGlsZC4gRXhwYW5kIGl0IGluIHRoZSBPdXRsaW5lIHZpZXcgdG8gc2VlIGl0IGFuZCBzZWxlY3QgaXQuIEluIHRoZSBQcm9wZXJ0aWVzCi12aWV3LCB5b3UgY2FuIHNlbGVjdCB0byBjaGFuZ2UgaXQgdG8gYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5jaG9pY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFsbDwvc3Bhbj4gY29udGVudAotbW9kZWwgYnkgc2VsZWN0aW5nIHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2luZDwvc3Bhbj4gbWVudS48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWluT2NjdXJzPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gVGhpcyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNvbnRlbnQgbW9kZWwgbXVzdCBhcHBlYXIuIElmCi15b3Ugd2FudCB0aGUgY29udGVudCBtb2RlbCB0byBiZSBvcHRpb25hbCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjA8L3NwYW4+LgotT3RoZXJ3aXNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhPY2N1cnM8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyBhIGNvbnRlbnQgbW9kZWwgY2FuIGFwcGVhci4gWW91Ci1jYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4gdG8gaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bQotbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb250ZW50IG1vZGVsLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgaXRlbXMgdG8gYSBjb250ZW50IG9iamVjdCBtb2RlbC4gPC9wPgotPHVsPgotPGxpPkFub3RoZXIgY29udGVudCBtb2RlbC48L2xpPgotCi08bGk+QSBncm91cCByZWZlcmVuY2Ugd2hpY2ggZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlCi1pbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFRoaXMgbWVudQotb3B0aW9uIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUgZ2xvYmFsIGdyb3VwcyBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQKLW9yIGlmIGdyb3VwcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlZCBzY2hlbWFzLjwvbGk+Ci0KLTxsaT5BbiBlbGVtZW50LCBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLjwvbGk+Ci0KLTxsaT5BbiBlbGVtZW50IHJlZmVyZW5jZSwgd2hpY2ggcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4KLVRoaXMgbWVudSBvcHRpb24gb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBlbHNld2hlcmUKLWluIHRoZSBkb2N1bWVudC48L2xpPgotCi08bGk+QW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50LiBZb3UgY2FuIHVzZSBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQKLXRvIGV4dGVuZCB5b3VyIGNvbnRlbnQgbW9kZWwgYnkgYW55IGVsZW1lbnRzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG0uaHRtbCIgdGl0bGU9IkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50IGRlY2xhcmF0aW9ucyBwcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwgZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy4iPkFkZGluZyBlbGVtZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIHRpdGxlPSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgdGl0bGU9IkEgZ3JvdXAgcmVmZXJlbmNlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ3JvdXAuIEl0IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWY3M2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkY214dCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGNvbXBsZXggdHlwZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBjb21wbGV4IHR5cGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgY29tcGxleCB0eXBlIGFsbG93cyBlbGVtZW50cyBpbiBpdHMgY29udGVudCBhbmQgY2FuIGNhcnJ5IGF0dHJpYnV0ZXMuDQotQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudCBmb3IgYW55DQotaW5zdGFuY2UgZG9jdW1lbnRzIGdlbmVyYXRlZCBmcm9tIG9yIGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Y29tcGxleA0KLXR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Y29tcGxleA0KLXR5cGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWENCi1maWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5jb21wbGV4IHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5jb21wbGV4IHR5cGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gYWRkIGFzIG1hbnkgY29tcGxleCB0eXBlcyBhcyB5b3Ugd2FudCB0byBhbiBYTUwgc2NoZW1hLjwvcD48cD5UaGUNCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleQ0KLXdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBjb21wbGV4IHR5cGUgdG8NCi1hbiBYTUwgc2NoZW1hLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQtY2xpY2sgdGhlIFR5cGVzIGNhdGVnb3J5IGluIHRoZSBEZXNpZ24gdmlldywgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotQ29tcGxleCBUeXBlPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGNvbXBsZXggdHlwZSBpbg0KLXRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIj4NCi08YWx0PkJyb3dzZSBpY29uPC9hbHQ+PC9pbWFnZT4gdG8gc2VsZWN0IGEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZS48L2NtZD4NCi08aW5mbz5Zb3UgY2FuIGVpdGhlciBzZXQgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UgY2FuIGFkZA0KLWEgY29udGVudCBtb2RlbCB0byBpdCAod2hpY2ggcmVwcmVzZW50cyBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlDQotYW4gZWxlbWVudCksIGJ1dCB5b3UgY2Fubm90IGRvIGJvdGguIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbnRlbnQgbW9kZWxzLA0KLXJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5yZXN0cmljdGlvbjwvdWljb250cm9sPiBvciA8dWljb250cm9sPmV4dGVuc2lvbjwvdWljb250cm9sPiBmcm9tDQotdGhlIDx1aWNvbnRyb2w+SW5oZXJpdGVkIGJ5PC91aWNvbnRyb2w+IGxpc3QuPC9jbWQ+PGluZm8+VGhpcyBzcGVjaWZpZXMgd2hldGhlcg0KLXlvdXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gaXRzIGJhc2UgdHlwZSBieSByZXN0cmljdGlvbiBvciBleHRlbnNpb24uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSBEZXNpZ24gdmlldyB3aWxsIGRpc3BsYXkgdGhlIGF0dHJpYnV0ZXMgd2l0aGluIHRoZSBjb21wbGV4DQotdHlwZS48L2NtZD48aW5mbz5Zb3UgY2FuIGFsc28gdXNlIHRoaXMgdmlldyB0byBhZGQgYXR0cmlidXRlcyB0byB5b3VyIGNvbXBsZXgNCi10eXBlLiBBbiBhdHRyaWJ1dGUgYXNzb2NpYXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSB3aXRoIGEgc3BlY2lmaWMgdHlwZSBhbmQgdmFsdWUuPC9pbmZvPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+VG8gYWRkIGFuIGF0dHJpYnV0ZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodCBjbGljayB5b3VyIGNvbXBsZXgNCi10eXBlIGFuZCBzZWxlY3QgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlPC91aWNvbnRyb2w+Ljx1bD4NCi08bGk+PHVpY29udHJvbD5uYW1lPC91aWNvbnRyb2w+LiBJbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBuYW1lIG9mIHRoZQ0KLWF0dHJpYnV0ZSB0byBtYWtlIGEgY2hhbmdlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+dHlwZTwvdWljb250cm9sPi4gSW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgdHlwZSBvZiB0aGUNCi1hdHRyaWJ1dGUgdG8gbWFrZSBhIGNoYW5nZS4gVGhlIGRyb3AtZG93biBtZW51IHByb3ZpZGVzIGNvbW1vbmx5IHVzZWQgdHlwZXMuDQotRm9yIG1vcmUgb3B0aW9ucywgc2ltcGx5IHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmcm9tIHRoZSBtZW51LjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBhdHRyaWJ1dGUuDQotVG8gYWRkIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbXBsZXgNCi10eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGUgUmVmPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPkEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkDQotYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nDQotZGVjbGFyYXRpb24uIFNlbGVjdCB0aGUgcmVmZXJlbmNlLCB0aGVuIHNlbGVjdCB0aGUgYXR0cmlidXRlIGdyb3VwIHlvdSB3YW50DQotaXQgdG8gcmVmZXJlbmNlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGZyb20gdGhlPHVpY29udHJvbD4gUmVmPC91aWNvbnRyb2w+IG1lbnUuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gYXR0cmlidXRlDQotZ3JvdXAuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrDQotdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlDQotR3JvdXAgUmVmPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPkEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGFuIGF0dHJpYnV0ZQ0KLWdyb3VwIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQNCi1pbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFNlbGVjdCB0aGUgcmVmZXJlbmNlLCB0aGVuDQotc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsDQotZnJvbSB0aGU8dWljb250cm9sPiBSZWY8L3VpY29udHJvbD4gbWVudS48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBlbmFibGVzIGVsZW1lbnQgY29udGVudCBhY2NvcmRpbmcNCi10byBuYW1lc3BhY2VzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlIGVsZW1lbnQNCi1lbmFibGVzIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIGluIGVsZW1lbnRzLiBUbyBhZGQgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlLA0KLXJpZ2h0LWNsaWNrIGluIHRoZSBjb21wbGV4IHR5cGUgaGVhZGVyLCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQW55IEF0dHJpYnV0ZTwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5Zb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZTo8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT5Gb3IgYSA8dWljb250cm9sPm5hbWVzcGFjZTwvdWljb250cm9sPiA8P1B1YiBDYXJldDE/PnZhbHVlLCB5b3UgY2FuDQotc2VsZWN0Ojx1bD4NCi08bGk+PGI+IyNhbnk8L2I+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI2xvY2FsIDwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQNCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI290aGVyPC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPg0KLTxsaT48Yj4jI3RhcmdldE5hbWVzcGFjZSA8L2I+LiBUaGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UNCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08Y2hvaWNlPkZvciBhIDx1aWNvbnRyb2w+cHJvY2Vzc0NvbnRlbnRzPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+DQotPGxpPjxiPnNraXA8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQNCi1hdCBhbGwuPC9saT4NCi08bGk+PGI+bGF4PC9iPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQgYXMgbXVjaA0KLWFzIGl0IGNhbi48L2xpPg0KLTxsaT48Yj5zdHJpY3Q8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgYXR0cmlidXRlIGNvbnRlbnQuPC9saT4NCi08L3VsPjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08aW5mbz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBsZXggdHlwZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDYyMDc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwNGM0MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGNvbXBsZXggdHlwZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBjb21wbGV4IHR5cGUgYWxsb3dzIGVsZW1lbnRzIGluIGl0cyBjb250ZW50IGFuZCBjYW4gY2FycnkgYXR0cmlidXRlcy4gQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudCBmb3IgYW55IGluc3RhbmNlIGRvY3VtZW50cyBnZW5lcmF0ZWQgZnJvbSBvciBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGNvbXBsZXggdHlwZSBhbGxvd3MgZWxlbWVudHMgaW4gaXRzIGNvbnRlbnQgYW5kIGNhbiBjYXJyeSBhdHRyaWJ1dGVzLiBDb21wbGV4IHR5cGVzIGNhbiBiZSB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IGZvciBhbnkgaW5zdGFuY2UgZG9jdW1lbnRzIGdlbmVyYXRlZCBmcm9tIG9yIGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgY29tcGxleCB0eXBlcywgWE1MIHNjaGVtYSBmaWxlcywgY29tcGxleCB0eXBlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGNvbXBsZXggdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMsIGNvbXBsZXggdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkY214dCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBjb21wbGV4IHR5cGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkY214dCI+PGEgbmFtZT0idGFkZGNteHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBjb21wbGV4IHR5cGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGNvbXBsZXggdHlwZSBhbGxvd3MgZWxlbWVudHMgaW4gaXRzIGNvbnRlbnQgYW5kIGNhbiBjYXJyeSBhdHRyaWJ1dGVzLgotQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudCBmb3IgYW55Ci1pbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gYWRkIGFzIG1hbnkgY29tcGxleCB0eXBlcyBhcyB5b3Ugd2FudCB0byBhbiBYTUwgc2NoZW1hLjwvcD4KLTxwPlRoZQotZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkKLXdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGNvbXBsZXggdHlwZSB0bwotYW4gWE1MIHNjaGVtYSwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayB0aGUgVHlwZXMgY2F0ZWdvcnkgaW4gdGhlIERlc2lnbiB2aWV3LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1Db21wbGV4IFR5cGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGNvbXBsZXggdHlwZSBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IkJyb3dzZSBpY29uIiAvPiB0byBzZWxlY3QgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLjwvc3Bhbj4KLSBZb3UgY2FuIGVpdGhlciBzZXQgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UgY2FuIGFkZAotYSBjb250ZW50IG1vZGVsIHRvIGl0ICh3aGljaCByZXByZXNlbnRzIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUKLWFuIGVsZW1lbnQpLCBidXQgeW91IGNhbm5vdCBkbyBib3RoLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb250ZW50IG1vZGVscywKLXJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnJlc3RyaWN0aW9uPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5leHRlbnNpb248L3NwYW4+IGZyb20KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Jbmhlcml0ZWQgYnk8L3NwYW4+IGxpc3QuPC9zcGFuPiBUaGlzIHNwZWNpZmllcyB3aGV0aGVyCi15b3VyIHR5cGUgaXMgZGVyaXZlZCBmcm9tIGl0cyBiYXNlIHR5cGUgYnkgcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgRGVzaWduIHZpZXcgd2lsbCBkaXNwbGF5IHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiB0aGUgY29tcGxleAotdHlwZS48L3NwYW4+IFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB2aWV3IHRvIGFkZCBhdHRyaWJ1dGVzIHRvIHlvdXIgY29tcGxleAotdHlwZS4gQW4gYXR0cmlidXRlIGFzc29jaWF0ZXMgYW4gYXR0cmlidXRlIG5hbWUgd2l0aCBhIHNwZWNpZmljIHR5cGUgYW5kIHZhbHVlLgotPHVsPgotPGxpPlRvIGFkZCBhbiBhdHRyaWJ1dGUsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQgY2xpY2sgeW91ciBjb21wbGV4Ci10eXBlIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZTwvc3Bhbj4uPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPm5hbWU8L3NwYW4+LiBJbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBuYW1lIG9mIHRoZQotYXR0cmlidXRlIHRvIG1ha2UgYSBjaGFuZ2UuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnR5cGU8L3NwYW4+LiBJbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSB0eXBlIG9mIHRoZQotYXR0cmlidXRlIHRvIG1ha2UgYSBjaGFuZ2UuIFRoZSBkcm9wLWRvd24gbWVudSBwcm92aWRlcyBjb21tb25seSB1c2VkIHR5cGVzLgotRm9yIG1vcmUgb3B0aW9ucywgc2ltcGx5IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGZyb20gdGhlIG1lbnUuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBhdHRyaWJ1dGUuCi1UbyBhZGQgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29tcGxleAotdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZSBSZWY8L3NwYW4+Ljwvc3Bhbj4KLSBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBhdHRyaWJ1dGUgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZAotYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nCi1kZWNsYXJhdGlvbi4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQKLWl0IHRvIHJlZmVyZW5jZSBpbiB0aGUgUHJvcGVydGllcyB2aWV3LCBmcm9tIHRoZTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBSZWY8L3NwYW4+IG1lbnUuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gYXR0cmlidXRlCi1ncm91cC4gVG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sKLXRoZSBjb21wbGV4IHR5cGUgY29udGFpbmluZyB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGUKLUdyb3VwIFJlZjwvc3Bhbj4uPC9zcGFuPiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhbiBhdHRyaWJ1dGUKLWdyb3VwIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLWluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4KLXNlbGVjdCB0aGUgYXR0cmlidXRlIGdyb3VwIHlvdSB3YW50IGl0IHRvIHJlZmVyZW5jZSBpbiB0aGUgUHJvcGVydGllcyB2aWV3LAotZnJvbSB0aGU8c3BhbiBjbGFzcz0idWljb250cm9sIj4gUmVmPC9zcGFuPiBtZW51LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGVuYWJsZXMgZWxlbWVudCBjb250ZW50IGFjY29yZGluZwotdG8gbmFtZXNwYWNlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlIGVsZW1lbnQKLWVuYWJsZXMgYXR0cmlidXRlcyB0byBhcHBlYXIgaW4gZWxlbWVudHMuIFRvIGFkZCBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZSwKLXJpZ2h0LWNsaWNrIGluIHRoZSBjb21wbGV4IHR5cGUgaGVhZGVyLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFueSBBdHRyaWJ1dGU8L3NwYW4+Ljwvc3Bhbj4KLSBZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlOgotPHVsPgotPGxpPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPm5hbWVzcGFjZTwvc3Bhbj4gdmFsdWUsIHlvdSBjYW4KLXNlbGVjdDo8dWw+Ci08bGk+PHN0cm9uZz4jI2FueTwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNsb2NhbCA8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQKLXRvIGJlIGluIGEgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjb3RoZXI8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbSB0aGUgdGFyZ2V0Ci1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08bGk+PHN0cm9uZz4jI3RhcmdldE5hbWVzcGFjZSA8L3N0cm9uZz4uIFRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnByb2Nlc3NDb250ZW50czwvc3Bhbj4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4KLTxsaT48c3Ryb25nPnNraXA8L3N0cm9uZz4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm90IHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudAotYXQgYWxsLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmxheDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQgYXMgbXVjaAotYXMgaXQgY2FuLjwvbGk+Ci0KLTxsaT48c3Ryb25nPnN0cmljdDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGF0dHJpYnV0ZSBjb250ZW50LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L3VsPgotCi0gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBsZXggdHlwZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTAwOTk5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRlbG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGVsZW1lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50IGRlY2xhcmF0aW9ucw0KLXByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLA0KLWVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsDQotYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5lbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmVsZW1lbnRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+ZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVsZW1lbnRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYW4gZWxlbWVudDo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlRvIGFkZCBhbiBlbGVtZW50LCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50DQotbW9kZWwgeW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBFbGVtZW50PC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPlRoZSBlbGVtZW50IGFwcGVhcnMgYXR0YWNoZWQgdG8gdGhlIGNvbnRlbnQgbW9kZWwgaW4gdGhlIERlc2lnbiB2aWV3LjwvaW5mbz4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIHRoZSBjdXJyZW50DQotKGRlZmF1bHQpIG5hbWUgb2YgdGhlIGVsZW1lbnQsIHdoaWNoIHB1dHMgeW91IGluIGRpcmVjdCBlZGl0aW5nIG1vZGUsIHRoZW4NCi10eXBlIHRoZSBuZXcgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGFuZCBwcmVzcyBlbnRlci48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBlbGVtZW50IHR5cGUNCi1hbmQgc2VsZWN0IGEgdHlwZSBmcm9tIHRoZSBtZW51LiBBbHRlcm5hdGVseSwgeW91IGNhbiBzZWxlY3QgYnJvd3NlIHRvIGludm9rZQ0KLXRoZSBTZXQgVHlwZSBkaWFsb2cgZm9yIG1vcmUgb3B0aW9ucy48L2NtZD48aW5mbz5UaGUgU2V0IFR5cGUgZGlhbG9nIGxpc3RzDQotYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YNCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluDQotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBJbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlDQotaW4gdGhlIDx1aWNvbnRyb2w+TWluT2NjdXJzPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjxpbmZvPlRoaXMgaXMgdGhlIDw/UHViIENhcmV0Pz5udW1iZXINCi1vZiB0aW1lcyB0aGUgZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudA0KLXRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHVpY29udHJvbD4wPC91aWNvbnRyb2w+LiBPdGhlcndpc2UsIHNlbGVjdCA8dWljb250cm9sPjE8L3VpY29udHJvbD4uIDwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWF4T2NjdXJzPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPlRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UNCi1kb2N1bWVudC4gU2VsZWN0IDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+IHRvIGluZGljYXRlIHRoZXJlIGlzIG5vDQotbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYW4gZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uDQotb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSB0aGUgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24NCi1hYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDA3OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2OWYxYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZWxlbWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJFbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIGFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ2xiYS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRlbG0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRlbG0iPjxhIG5hbWU9InRhZGRlbG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+RWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zCi1wcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwKLWVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsCi1hbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gZWxlbWVudDo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhZGQgYW4gZWxlbWVudCwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudAotbW9kZWwgeW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgRWxlbWVudDwvc3Bhbj4uPC9zcGFuPgotIFRoZSBlbGVtZW50IGFwcGVhcnMgYXR0YWNoZWQgdG8gdGhlIGNvbnRlbnQgbW9kZWwgaW4gdGhlIERlc2lnbiB2aWV3LgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIHRoZSBjdXJyZW50Ci0oZGVmYXVsdCkgbmFtZSBvZiB0aGUgZWxlbWVudCwgd2hpY2ggcHV0cyB5b3UgaW4gZGlyZWN0IGVkaXRpbmcgbW9kZSwgdGhlbgotdHlwZSB0aGUgbmV3IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGFuZCBwcmVzcyBlbnRlci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBlbGVtZW50IHR5cGUKLWFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdCBicm93c2UgdG8gaW52b2tlCi10aGUgU2V0IFR5cGUgZGlhbG9nIGZvciBtb3JlIG9wdGlvbnMuPC9zcGFuPiBUaGUgU2V0IFR5cGUgZGlhbG9nIGxpc3RzCi1hbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+LiBMaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbgotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgSW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZQotaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1pbk9jY3Vyczwvc3Bhbj4gZmllbGQuPC9zcGFuPiBUaGlzIGlzIHRoZSBudW1iZXIKLW9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdSB3YW50IHRoZSBlbGVtZW50Ci10byBiZSBvcHRpb25hbCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjA8L3NwYW4+LiBPdGhlcndpc2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4xPC9zcGFuPi4gCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF4T2NjdXJzPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZQotZG9jdW1lbnQuIFNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+IHRvIGluZGljYXRlIHRoZXJlIGlzIG5vCi1tYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZWxlbWVudC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGFuIGVsZW1lbnQsIHdoaWNoIGlzIHRoZSByZXByZXNlbnRhdGlvbgotb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSB0aGUgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLWFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50IG1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIHRpdGxlPSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiB0aXRsZT0iQW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbCBlbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiI+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgYW55IGVsZW1lbnQgaW4gYSBzaW1pbGFyIHdheSBhcyBhIERURCdzIEFOWSBjb250ZW50IG1vZGVsLCBob3dldmVyLCBpdCBtdXN0IGJlIGRvbmUgaW4gY29uanVuY3Rpb24gd2l0aCBuYW1lc3BhY2VzLiBUaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LCBzdWNoIGFzIGFuIEhUTUwgV2ViIHBhZ2UgdGhhdCBjb25mb3JtcyB0byBYSFRNTCAxLjAgc3ludGF4LiI+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdsYmEuaHRtbCIgdGl0bGU9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIj5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmQ2Njc1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkZWxtciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50Lg0KLUEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwNCi1lbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nDQotZGVjbGFyYXRpb24uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+ZWxlbWVudA0KLXJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5lbGVtZW50DQotcmVmZXJlbmNlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwNCi1zY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+ZWxlbWVudCByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5lbGVtZW50IHJlZmVyZW5jZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbGVtZW50DQotcmVmZXJlbmNlOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB3b3JrDQotd2l0aCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRWxlbWVudCBSZWY8L3VpY29udHJvbD4uPC9jbWQ+PHN0ZXByZXN1bHQ+SWYNCi1ubyBnbG9iYWwgZWxlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudCwgYSBuZXcgZ2xvYmFsIGVsZW1lbnQgaXMgY3JlYXRlZA0KLWZvciB5b3UsIGFuZCB0aGUgZWxlbWVudCByZWZlcmVuY2Ugd2lsbCBwb2ludCB0byBpdC48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBlbGVtZW50IHJlZmVyZW5jZS4gVG8gc3BlY2lmeSB2YWx1ZXMgZm9yIGFuIGVsZW1lbnQNCi1yZWZlcmVuY2U6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5DbGljayB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIERlc2lnbiB2aWV3LiBFbnRlcg0KLXRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS48L2Nob2ljZT4NCi08Y2hvaWNlPkNsaWNrIHRoZSBlbGVtZW50IHJlZmVyZW5jZSB0eXBlIGluIHRoZSBEZXNpZ248P1B1YiBDYXJldD8+IHZpZXcuDQotU2VsZWN0IGEgdHlwZSBmcm9tIHRoZSBtZW51LCBvciBzZWxlY3QgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gZm9yIG1vcmUNCi1vcHRpb25zLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWluT2NjdXJzPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPlRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZ2xvYmFsIGVsZW1lbnQgcmVmZXJlbmNlZCBjYW4gYXBwZWFyDQotaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdSB3YW50IHRoZSBlbGVtZW50IHRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHVpY29udHJvbD4wPC91aWNvbnRyb2w+Lg0KLU90aGVyd2lzZSwgc2VsZWN0IDx1aWNvbnRyb2w+MTwvdWljb250cm9sPi4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NYXhPY2N1cnM8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGdsb2JhbCBlbGVtZW50IHJlZmVyZW5jZWQgY2FuDQotYXBwZWFyLiBZb3UgY2FuIHNlbGVjdCA8dWljb250cm9sPnVuYm91bmRlZDwvdWljb250cm9sPiB0byBpbmRpY2F0ZSB0aGVyZQ0KLWlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZWxlbWVudCByZWZlcmVuY2UuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMjMyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTc3ZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBlbGVtZW50IHJlZmVyZW5jZXMsIFhNTCBzY2hlbWEgZmlsZXMsIGVsZW1lbnQgcmVmZXJlbmNlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGVsZW1lbnQgcmVmZXJlbmNlcywgWE1MIHNjaGVtYSBmaWxlcywgZWxlbWVudCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRnbGVtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdsYmEuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZWxtciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRlbG1yIj48YSBuYW1lPSJ0YWRkZWxtciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4KLUEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwKLWVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcKLWRlY2xhcmF0aW9uLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gZWxlbWVudAotcmVmZXJlbmNlOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8gd29yawotd2l0aCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEVsZW1lbnQgUmVmPC9zcGFuPi48L3NwYW4+IElmCi1ubyBnbG9iYWwgZWxlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudCwgYSBuZXcgZ2xvYmFsIGVsZW1lbnQgaXMgY3JlYXRlZAotZm9yIHlvdSwgYW5kIHRoZSBlbGVtZW50IHJlZmVyZW5jZSB3aWxsIHBvaW50IHRvIGl0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBlbGVtZW50IHJlZmVyZW5jZS4gVG8gc3BlY2lmeSB2YWx1ZXMgZm9yIGFuIGVsZW1lbnQKLXJlZmVyZW5jZTo8L3NwYW4+Ci08dWw+Ci08bGk+Q2xpY2sgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBEZXNpZ24gdmlldy4gRW50ZXIKLXRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS48L2xpPgotCi08bGk+Q2xpY2sgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIHR5cGUgaW4gdGhlIERlc2lnbiB2aWV3LgotU2VsZWN0IGEgdHlwZSBmcm9tIHRoZSBtZW51LCBvciBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBmb3IgbW9yZQotb3B0aW9ucy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWluT2NjdXJzPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwgZWxlbWVudCByZWZlcmVuY2VkIGNhbiBhcHBlYXIKLWluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjA8L3NwYW4+LgotT3RoZXJ3aXNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhPY2N1cnM8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgZ2xvYmFsIGVsZW1lbnQgcmVmZXJlbmNlZCBjYW4KLWFwcGVhci4gWW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5ib3VuZGVkPC9zcGFuPiB0byBpbmRpY2F0ZSB0aGVyZQotaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ2xlbS5odG1sIiB0aXRsZT0iQSBnbG9iYWwgZWxlbWVudCBpcyBhbiBlbGVtZW50IHdpdGggYSBnbG9iYWwgc2NvcGUuIEl0IGlzIG9uZSB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1haW4gc2NoZW1hIHJhdGhlciB0aGFuIGFzIHBhcnQgb2YgYSBjb250ZW50IG1vZGVsLiI+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG0uaHRtbCIgdGl0bGU9IkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50IGRlY2xhcmF0aW9ucyBwcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwgZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy4iPkFkZGluZyBlbGVtZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgYW55IGVsZW1lbnQgaW4gYSBzaW1pbGFyIHdheSBhcyBhIERURCdzIEFOWSBjb250ZW50IG1vZGVsLCBob3dldmVyLCBpdCBtdXN0IGJlIGRvbmUgaW4gY29uanVuY3Rpb24gd2l0aCBuYW1lc3BhY2VzLiBUaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LCBzdWNoIGFzIGFuIEhUTUwgV2ViIHBhZ2UgdGhhdCBjb25mb3JtcyB0byBYSFRNTCAxLjAgc3ludGF4LiI+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdsYmEuaHRtbCIgdGl0bGU9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIj5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc1ZTFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkZ2xiYSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBnbG9iYWwgYXR0cmlidXRlIGlzIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSByZWNvZ25pemVkIGFueXdoZXJlDQotaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZQ0KLW9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Z2xvYmFsIGF0dHJpYnV0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5nbG9iYWwgYXR0cmlidXRlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmdsb2JhbCBhdHRyaWJ1dGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5nbG9iYWwgYXR0cmlidXRlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGEgZ2xvYmFsDQotYXR0cmlidXRlOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxiPkF0dHJpYnV0ZXM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGVudGVyIGEgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcHJlZGVmaW5lZCBsaXN0IGluIHRoZSBtZW51IG5leHQgdG8gdGhlIDx1aWNvbnRyb2w+VHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz48cD5BbHRlcm5hdGl2ZWx5PD9QdWIgQ2FyZXQ/PiwgeW91IGNhbiBzZWxlY3QgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSBsaXN0IGZvciBtb3JlIG9wdGlvbnMuIDwvcD48cD5UaGUgU2V0IFR5cGUgZGlhbG9nIHdpbGwgYXBwZWFyLCBhbmQgbGlzdHMNCi1hbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZg0KLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluDQoteW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvcD48cD5TZWxlY3QgdGhlIHR5cGUgeW91IHdhbnQgaW4gdGhlIHR5cGUgbGlzdCwgdGhlbiBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiA8L3A+PC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBnbG9iYWwgYXR0cmlidXRlLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzIzMD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWIwYWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGdsb2JhbCBhdHRyaWJ1dGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgZ2xvYmFsIGF0dHJpYnV0ZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRnbGJhIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkZ2xiYSI+PGEgbmFtZT0idGFkZGdsYmEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBnbG9iYWwgYXR0cmlidXRlIGlzIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSByZWNvZ25pemVkIGFueXdoZXJlCi1pbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lCi1vciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSBnbG9iYWwKLWF0dHJpYnV0ZTo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPHN0cm9uZz5BdHRyaWJ1dGVzPC9zdHJvbmc+IHNlY3Rpb24KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBlbnRlciBhIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBmcm9tCi10aGUgcHJlZGVmaW5lZCBsaXN0IGluIHRoZSBtZW51IG5leHQgdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSA8cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGZyb20KLXRoZSBsaXN0IGZvciBtb3JlIG9wdGlvbnMuIDwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBTZXQgVHlwZSBkaWFsb2cgd2lsbCBhcHBlYXIsIGFuZCBsaXN0cwotYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZgotdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluCi15b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08cD5TZWxlY3QgdGhlIHR5cGUgeW91IHdhbnQgaW4gdGhlIHR5cGUgbGlzdCwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIDwvcD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdsb2JhbCBhdHRyaWJ1dGUuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDEzOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkZ2xlbSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQNCi1oYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudA0KLW1vZGVsLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmdsb2JhbCBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmdsb2JhbCBlbGVtZW50czxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmdsb2JhbCBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Z2xvYmFsIGVsZW1lbnRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBnbG9iYWwNCi1lbGVtZW50OjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHNlbGVjdCB5b3VyIHNjaGVtYS48L2NtZD48aW5mbz5UaGUgZW50aXJlDQotc2NoZW1hIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxiPkVsZW1lbnRzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEVsZW1lbnQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIsDQotYW5kIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGdsb2JhbCBlbGVtZW50IGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSB0eXBlIGZyb20NCi10aGUgcHJlZGVmaW5lZCBsaXN0IGluIHRoZSBtZW51IG5leHQgdG8gdGhlIDx1aWNvbnRyb2w+VHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz48cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmcm9tDQotdGhlIGxpc3QgZm9yIG1vcmUgb3B0aW9ucy4gPC9wPjxwPlRoZSA8dWljb250cm9sPlNldCBUeXBlPC91aWNvbnRyb2w+IGRpYWxvZw0KLWJveCBhcHBlYXJzLCBhbmQgbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4NCi1Zb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lDQotb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluDQoteW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvcD48cD5TZWxlY3QgdGhlIHR5cGUgeW91IHdhbnQgaW4gdGhlIHR5cGUgbGlzdCwgdGhlbiBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiA8L3A+PC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgQ2xpY2sgdGhlIDx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD4gdGFiLjwvY21kPjxpbmZvPkluDQotdGhpcyBwYWdlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YXJpb3VzIHZhbHVlcyBmb3IgdGhlIGdsb2JhbCBlbGVtZW50OiA8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPmFic3RyYWN0PC91aWNvbnRyb2w+LiBDbGljayA8Yj50cnVlIDwvYj5pZiB5b3Ugd2FudCB0aGUNCi1nbG9iYWwgZWxlbWVudCB0byBiZSBhYnN0cmFjdC4gV2hlbiBhIGdsb2JhbCBlbGVtZW50IGlzIGRlY2xhcmVkIHRvIGJlIGFic3RyYWN0LA0KLWl0IGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJbnN0ZWFkLCBhIG1lbWJlciBvZiB0aGF0IGdsb2JhbA0KLWVsZW1lbnQncyBzdWJzdGl0dXRpb24gZ3JvdXAgbXVzdCBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5ibG9jazwvdWljb250cm9sPi4gVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdsb2JhbA0KLWVsZW1lbnQgbWF5IGJlIHJlcGxhY2VkIGJ5IGFuIGVsZW1lbnQgZGVyaXZlZCBmcm9tIGl0LjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5maW5hbDwvdWljb250cm9sPi4gVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBnbG9iYWwNCi1lbGVtZW50IG1heSBiZSBkZXJpdmVkIGZyb20uPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPmZpeGVkL2RlZmF1bHQ8L3VpY29udHJvbD4uIENsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGFuZA0KLXNlbGVjdCA8dWljb250cm9sPkZpeGVkPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+RGVmYXVsdDwvdWljb250cm9sPiBhbmQNCi1zcGVjaWZ5IGFuIGFwcHJvcHJpYXRlIHZhbHVlLiBJZiB5b3Ugc2VsZWN0IDxiPkZpeGVkPC9iPiwgdGhlIGdsb2JhbCBlbGVtZW50DQotaGFzIGEgZml4ZWQgdmFsdWUsIHdoaWNoIGNhbm5vdCBiZSBjaGFuZ2VkLiBJZiB5b3Ugc2VsZWN0IDxiPkRlZmF1bHQ8L2I+LA0KLXRoZSBlbGVtZW50IGhhcyBhIGRlZmF1bHQgdmFsdWUuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPmZvcm08L3VpY29udHJvbD4uIFVzZSB0aGlzIGZpZWxkIHRvIGluZGljYXRlIGlmIHRoZSBhcHBlYXJhbmNlDQotb2YgdGhpcyBnbG9iYWwgZWxlbWVudCBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYSAoYW4gWE1MIGZpbGUgYXNzb2NpYXRlZA0KLXdpdGggdGhlIFhNTCBzY2hlbWEpIG11c3QgYmUgcXVhbGlmaWVkIGJ5IGEgbmFtZXNwYWNlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5uaWxsYWJsZTwvdWljb250cm9sPi4gU2VsZWN0IDxiPnRydWU8L2I+IGlmIHlvdSBkbyBub3QNCi13YW50IHRoZSBnbG9iYWwgZWxlbWVudCB0byBiZSBhYmxlIHRvIGhhdmUgYW55IGNoaWxkIGVsZW1lbnRzLCBvbmx5IGF0dHJpYnV0ZXMuIDwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5zdWJzdGl0dXRpb25Hcm91cDwvdWljb250cm9sPi4gQSBzdWJzdGl0dXRpb24gZ3JvdXAgYWxsb3dzDQotZWxlbWVudHMgdG8gYmUgc3Vic3RpdHV0ZWQgZm9yIG90aGVyIGVsZW1lbnRzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5BdHRyaWJ1dGVzPC91aWNvbnRyb2w+IHRhYi48L2NtZD48aW5mbz5Zb3UNCi1jYW4gdXNlIHRoaXMgcGFnZSB0byBhZGQgYXR0cmlidXRlcywgYXR0cmlidXRlIHJlZmVyZW5jZXMsIGF0dHJpYnV0ZXMgZ3JvdXANCi1yZWZlcmVuY2VzLCBhbmQgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlcyB0byB5b3VyIGdsb2JhbCBlbGVtZW50LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbiBhdHRyaWJ1dGUgYXNzb2NpYXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSB3aXRoIGEgc3BlY2lmaWMgdHlwZQ0KLWFuZCB2YWx1ZS4gVG8gYWRkIGFuIGF0dHJpYnV0ZSwgcmlnaHQtY2xpY2sgaW4gdGhlIEF0dHJpYnV0ZXMgcGFnZSwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotQXR0cmlidXRlPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPllvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3INCi1hbiBhdHRyaWJ1dGU6PC9pbmZvPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5maXhlZC9kZWZhdWx0PC91aWNvbnRyb2w+LiBDbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBhbmQNCi1zZWxlY3QgPHVpY29udHJvbD5GaXhlZDwvdWljb250cm9sPiBvciA8dWljb250cm9sPkRlZmF1bHQ8L3VpY29udHJvbD4gYW5kDQotc3BlY2lmeSBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gSWYgeW91IHNlbGVjdCA8Yj5GaXhlZDwvYj4sIHRoZSBhdHRyaWJ1dGUgaGFzDQotYSBmaXhlZCB2YWx1ZSwgd2hpY2ggY2Fubm90IGJlIGNoYW5nZWQuIElmIHlvdSBzZWxlY3QgPGI+RGVmYXVsdDwvYj4sIHRoZQ0KLWF0dHJpYnV0ZSBoYXMgYSBkZWZhdWx0IHZhbHVlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5mb3JtPC91aWNvbnRyb2w+LiBVc2UgdGhpcyBmaWVsZCB0byBpbmRpY2F0ZSBpZiB0aGUgYXBwZWFyYW5jZQ0KLW9mIHRoaXMgYXR0cmlidXRlIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hIG11c3QgYmUgcXVhbGlmaWVkIGJ5IGENCi1uYW1lc3BhY2UuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPm5hbWU8L3VpY29udHJvbD4uIEVudGVyIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPnR5cGU8L3VpY29udHJvbD4uIENsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGFuZA0KLXNlbGVjdCB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLiA8L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+dXNlPC91aWNvbnRyb2w+LiBUaGlzIGZpZWxkIGluZGljYXRlcyBob3cgYW4gYXR0cmlidXRlDQotY2FuIGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdSBzZWxlY3Qgb3B0aW9uYWwsIHRoZSBhdHRyaWJ1dGUNCi1jYW4gYXBwZWFyIG9uY2UsIGJ1dCBpdCBkb2VzIG5vdCBoYXZlIHRvLiBJZiB5b3Ugc2VsZWN0IHJlcXVpcmVkLCB0aGUgYXR0cmlidXRlDQotbXVzdCBhcHBlYXIgb25jZS4gSWYgeW91IHNlbGVjdCBwcm9oaWJpdGVkLCB0aGUgYXR0cmlidXRlIG11c3Qgbm90IGFwcGVhci4gPGI+Tm90ZTwvYj46DQotSWYgeW91IHNlbGVjdGVkIDx1aWNvbnRyb2w+RGVmYXVsdDwvdWljb250cm9sPiwgeW91IG11c3Qgc2VsZWN0IDxiPm9wdGlvbmFsPC9iPiBpbg0KLXRoaXMgZmllbGQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIG5vdCBiZSB2YWxpZC48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBhdHRyaWJ1dGUuDQotVG8gYWRkIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UsIHJpZ2h0LWNsaWNrIGluIHRoZSBBdHRyaWJ1dGVzIHBhZ2UsIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLUF0dHJpYnV0ZSBSZWY8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+QSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwNCi1hdHRyaWJ1dGUgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudA0KLWluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gVGhlIG1lbnUgb3B0aW9uIHRvIGFkZCBhbiBhdHRyaWJ1dGUNCi1yZWZlcmVuY2Ugb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgYXR0cmlidXRlcyBkZWZpbmVkIGVsc2V3aGVyZSBpbg0KLXRoZSBkb2N1bWVudC4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4gc2VsZWN0IHRoZSBnbG9iYWwgYXR0cmlidXRlIHlvdSB3YW50DQotaXQgdG8gcmVmZXJlbmNlIGZyb20gdGhlIDx1aWNvbnRyb2w+cmVmPC91aWNvbnRyb2w+IGxpc3QuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gYXR0cmlidXRlDQotZ3JvdXAuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlLCByaWdodC1jbGljayBpbiB0aGUgQXR0cmlidXRlcw0KLXBhZ2UsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGUgR3JvdXAgUmVmPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPkENCi1kZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYW4gYXR0cmlidXRlIGdyb3VwIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlDQotZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcNCi1kZWNsYXJhdGlvbi4gVGhlIG1lbnUgb3B0aW9uIHRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIG9ubHkgYXBwZWFycw0KLWlmIHRoZXJlIGFyZSBhdHRyaWJ1dGUgZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudC4gU2VsZWN0IHRoZQ0KLXJlZmVyZW5jZSwgdGhlbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSBncm91cCB5b3Ugd2FudCBpdCB0byByZWZlcmVuY2UgZnJvbSB0aGUgPHVpY29udHJvbD5yZWY8L3VpY29udHJvbD4gbGlzdC48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBlbmFibGVzIGVsZW1lbnQgY29udGVudCBhY2NvcmRpbmcNCi10byBuYW1lc3BhY2VzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlIGVsZW1lbnQNCi1lbmFibGVzIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIGluIGVsZW1lbnRzLiBUbyBhZGQgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlLA0KLXJpZ2h0LWNsaWNrIGluIHRoZSBBdHRyaWJ1dGVzIHBhZ2UgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEFueSBBdHRyaWJ1dGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+WW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGU6PC9pbmZvPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+Rm9yIGEgPHVpY29udHJvbD5uYW1lc3BhY2U8L3VpY29udHJvbD4gPD9QdWIgQ2FyZXQxPz52YWx1ZSwgeW91IGNhbg0KLXNlbGVjdDo8dWw+DQotPGxpPjxiPiMjYW55PC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9saT4NCi08bGk+PGI+IyNsb2NhbCA8L2I+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGRlY2xhcmVkDQotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4NCi08bGk+PGI+IyNvdGhlcjwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbSB0aGUgdGFyZ2V0DQotbmFtZXNwYWNlIG9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4NCi08bGk+PGI+IyN0YXJnZXROYW1lc3BhY2UgPC9iPi4gVGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlDQotb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPg0KLTwvdWw+PC9jaG9pY2U+DQotPGNob2ljZT5Gb3IgYSA8dWljb250cm9sPnByb2Nlc3NDb250ZW50czwvdWljb250cm9sPiB2YWx1ZSwgeW91IGNhbiBzZWxlY3Q6PHVsPg0KLTxsaT48Yj5za2lwPC9iPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50DQotYXQgYWxsLjwvbGk+DQotPGxpPjxiPmxheDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50IGFzIG11Y2gNCi1hcyBpdCBjYW4uPC9saT4NCi08bGk+PGI+c3RyaWN0PC9iPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGF0dHJpYnV0ZSBjb250ZW50LjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdsb2JhbCBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYSBnbG9iYWwgZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uDQotb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSB0aGUgZ2xvYmFsIGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uDQotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDk1Nzk/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4YzBkNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbWFpbiBzY2hlbWEgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiBhIGNvbnRlbnQgbW9kZWwuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudCBtb2RlbC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBnbG9iYWwgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBnbG9iYWwgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGdsZW0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZ2xvYmFsIGVsZW1lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkZ2xlbSI+PGEgbmFtZT0idGFkZGdsZW0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBnbG9iYWwgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdAotaGFzIGJlZW4gZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbWFpbiBzY2hlbWEgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiBhIGNvbnRlbnQKLW1vZGVsLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSBnbG9iYWwKLWVsZW1lbnQ6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHNlbGVjdCB5b3VyIHNjaGVtYS48L3NwYW4+IFRoZSBlbnRpcmUKLXNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIERlc2lnbiB2aWV3LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPHN0cm9uZz5FbGVtZW50czwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEVsZW1lbnQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIsCi1hbmQgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgZ2xvYmFsIGVsZW1lbnQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSB0eXBlIGZyb20KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotIDxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gZnJvbQotdGhlIGxpc3QgZm9yIG1vcmUgb3B0aW9ucy4gPC9wPgotPGRpdiBjbGFzcz0icCI+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNldCBUeXBlPC9zcGFuPiBkaWFsb2cKLWJveCBhcHBlYXJzLCBhbmQgbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4KLVlvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY29wZTwvc3Bhbj4gb2YgdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZQotb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbgoteW91ciB3b3Jrc3BhY2UuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNsb3NpbmcgUHJvamVjdDwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4KLQotPGxpPihEZWZhdWx0KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXJyZW50IFJlc291cmNlPC9zcGFuPi4gTGlzdCBhbGwgb2YgdGhlIHR5cGVzCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPHA+U2VsZWN0IHRoZSB0eXBlIHlvdSB3YW50IGluIHRoZSB0eXBlIGxpc3QsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiA8L3A+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBDbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+IHRhYi48L3NwYW4+IEluCi10aGlzIHBhZ2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhcmlvdXMgdmFsdWVzIGZvciB0aGUgZ2xvYmFsIGVsZW1lbnQ6IAotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFic3RyYWN0PC9zcGFuPi4gQ2xpY2sgPHN0cm9uZz50cnVlIDwvc3Ryb25nPmlmIHlvdSB3YW50IHRoZQotZ2xvYmFsIGVsZW1lbnQgdG8gYmUgYWJzdHJhY3QuIFdoZW4gYSBnbG9iYWwgZWxlbWVudCBpcyBkZWNsYXJlZCB0byBiZSBhYnN0cmFjdCwKLWl0IGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJbnN0ZWFkLCBhIG1lbWJlciBvZiB0aGF0IGdsb2JhbAotZWxlbWVudCdzIHN1YnN0aXR1dGlvbiBncm91cCBtdXN0IGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmJsb2NrPC9zcGFuPi4gVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdsb2JhbAotZWxlbWVudCBtYXkgYmUgcmVwbGFjZWQgYnkgYW4gZWxlbWVudCBkZXJpdmVkIGZyb20gaXQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmZpbmFsPC9zcGFuPi4gVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBnbG9iYWwKLWVsZW1lbnQgbWF5IGJlIGRlcml2ZWQgZnJvbS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Zml4ZWQvZGVmYXVsdDwvc3Bhbj4uIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gYW5kCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rml4ZWQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+IGFuZAotc3BlY2lmeSBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gSWYgeW91IHNlbGVjdCA8c3Ryb25nPkZpeGVkPC9zdHJvbmc+LCB0aGUgZ2xvYmFsIGVsZW1lbnQKLWhhcyBhIGZpeGVkIHZhbHVlLCB3aGljaCBjYW5ub3QgYmUgY2hhbmdlZC4gSWYgeW91IHNlbGVjdCA8c3Ryb25nPkRlZmF1bHQ8L3N0cm9uZz4sCi10aGUgZWxlbWVudCBoYXMgYSBkZWZhdWx0IHZhbHVlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5mb3JtPC9zcGFuPi4gVXNlIHRoaXMgZmllbGQgdG8gaW5kaWNhdGUgaWYgdGhlIGFwcGVhcmFuY2UKLW9mIHRoaXMgZ2xvYmFsIGVsZW1lbnQgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEgKGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQKLXdpdGggdGhlIFhNTCBzY2hlbWEpIG11c3QgYmUgcXVhbGlmaWVkIGJ5IGEgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5uaWxsYWJsZTwvc3Bhbj4uIFNlbGVjdCA8c3Ryb25nPnRydWU8L3N0cm9uZz4gaWYgeW91IGRvIG5vdAotd2FudCB0aGUgZ2xvYmFsIGVsZW1lbnQgdG8gYmUgYWJsZSB0byBoYXZlIGFueSBjaGlsZCBlbGVtZW50cywgb25seSBhdHRyaWJ1dGVzLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+c3Vic3RpdHV0aW9uR3JvdXA8L3NwYW4+LiBBIHN1YnN0aXR1dGlvbiBncm91cCBhbGxvd3MKLWVsZW1lbnRzIHRvIGJlIHN1YnN0aXR1dGVkIGZvciBvdGhlciBlbGVtZW50cy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdHRyaWJ1dGVzPC9zcGFuPiB0YWIuPC9zcGFuPiBZb3UKLWNhbiB1c2UgdGhpcyBwYWdlIHRvIGFkZCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgYXR0cmlidXRlcyBncm91cAotcmVmZXJlbmNlcywgYW5kIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlcyB0byB5b3VyIGdsb2JhbCBlbGVtZW50LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgYXNzb2NpYXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSB3aXRoIGEgc3BlY2lmaWMgdHlwZQotYW5kIHZhbHVlLiBUbyBhZGQgYW4gYXR0cmlidXRlLCByaWdodC1jbGljayBpbiB0aGUgQXR0cmlidXRlcyBwYWdlLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1BdHRyaWJ1dGU8L3NwYW4+Ljwvc3Bhbj4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvcgotYW4gYXR0cmlidXRlOgotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmZpeGVkL2RlZmF1bHQ8L3NwYW4+LiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGFuZAotc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpeGVkPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZhdWx0PC9zcGFuPiBhbmQKLXNwZWNpZnkgYW4gYXBwcm9wcmlhdGUgdmFsdWUuIElmIHlvdSBzZWxlY3QgPHN0cm9uZz5GaXhlZDwvc3Ryb25nPiwgdGhlIGF0dHJpYnV0ZSBoYXMKLWEgZml4ZWQgdmFsdWUsIHdoaWNoIGNhbm5vdCBiZSBjaGFuZ2VkLiBJZiB5b3Ugc2VsZWN0IDxzdHJvbmc+RGVmYXVsdDwvc3Ryb25nPiwgdGhlCi1hdHRyaWJ1dGUgaGFzIGEgZGVmYXVsdCB2YWx1ZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Zm9ybTwvc3Bhbj4uIFVzZSB0aGlzIGZpZWxkIHRvIGluZGljYXRlIGlmIHRoZSBhcHBlYXJhbmNlCi1vZiB0aGlzIGF0dHJpYnV0ZSBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYSBtdXN0IGJlIHF1YWxpZmllZCBieSBhCi1uYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPm5hbWU8L3NwYW4+LiBFbnRlciB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj50eXBlPC9zcGFuPi4gQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBhbmQKLXNlbGVjdCB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+dXNlPC9zcGFuPi4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgaG93IGFuIGF0dHJpYnV0ZQotY2FuIGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdSBzZWxlY3Qgb3B0aW9uYWwsIHRoZSBhdHRyaWJ1dGUKLWNhbiBhcHBlYXIgb25jZSwgYnV0IGl0IGRvZXMgbm90IGhhdmUgdG8uIElmIHlvdSBzZWxlY3QgcmVxdWlyZWQsIHRoZSBhdHRyaWJ1dGUKLW11c3QgYXBwZWFyIG9uY2UuIElmIHlvdSBzZWxlY3QgcHJvaGliaXRlZCwgdGhlIGF0dHJpYnV0ZSBtdXN0IG5vdCBhcHBlYXIuIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjoKLUlmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZhdWx0PC9zcGFuPiwgeW91IG11c3Qgc2VsZWN0IDxzdHJvbmc+b3B0aW9uYWw8L3N0cm9uZz4gaW4KLXRoaXMgZmllbGQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIG5vdCBiZSB2YWxpZC48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFuIGF0dHJpYnV0ZSByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgYXR0cmlidXRlLgotVG8gYWRkIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UsIHJpZ2h0LWNsaWNrIGluIHRoZSBBdHRyaWJ1dGVzIHBhZ2UsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUF0dHJpYnV0ZSBSZWY8L3NwYW4+Ljwvc3Bhbj4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwKLWF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50Ci1pbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFRoZSBtZW51IG9wdGlvbiB0byBhZGQgYW4gYXR0cmlidXRlCi1yZWZlcmVuY2Ugb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgYXR0cmlidXRlcyBkZWZpbmVkIGVsc2V3aGVyZSBpbgotdGhlIGRvY3VtZW50LiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBzZWxlY3QgdGhlIGdsb2JhbCBhdHRyaWJ1dGUgeW91IHdhbnQKLWl0IHRvIHJlZmVyZW5jZSBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5yZWY8L3NwYW4+IGxpc3QuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuIGF0dHJpYnV0ZQotZ3JvdXAuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlLCByaWdodC1jbGljayBpbiB0aGUgQXR0cmlidXRlcwotcGFnZSwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGUgR3JvdXAgUmVmPC9zcGFuPi48L3NwYW4+IEEKLWRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhbiBhdHRyaWJ1dGUgZ3JvdXAgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUKLWdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nCi1kZWNsYXJhdGlvbi4gVGhlIG1lbnUgb3B0aW9uIHRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIG9ubHkgYXBwZWFycwotaWYgdGhlcmUgYXJlIGF0dHJpYnV0ZSBncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50LiBTZWxlY3QgdGhlCi1yZWZlcmVuY2UsIHRoZW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnJlZjwvc3Bhbj4gbGlzdC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGVuYWJsZXMgZWxlbWVudCBjb250ZW50IGFjY29yZGluZwotdG8gbmFtZXNwYWNlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlIGVsZW1lbnQKLWVuYWJsZXMgYXR0cmlidXRlcyB0byBhcHBlYXIgaW4gZWxlbWVudHMuIFRvIGFkZCBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZSwKLXJpZ2h0LWNsaWNrIGluIHRoZSBBdHRyaWJ1dGVzIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBbnkgQXR0cmlidXRlPC9zcGFuPi48L3NwYW4+Ci0gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZToKLTx1bD4KLTxsaT5Gb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5uYW1lc3BhY2U8L3NwYW4+IHZhbHVlLCB5b3UgY2FuCi1zZWxlY3Q6PHVsPgotPGxpPjxzdHJvbmc+IyNhbnk8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgZnJvbSBhbnkgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjbG9jYWwgPC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGRlY2xhcmVkCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI290aGVyPC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGZyb20gdGhlIHRhcmdldAotbmFtZXNwYWNlIG9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4KLQotPGxpPjxzdHJvbmc+IyN0YXJnZXROYW1lc3BhY2UgPC9zdHJvbmc+LiBUaGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UKLW9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaT5Gb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5wcm9jZXNzQ29udGVudHM8L3NwYW4+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+Ci08bGk+PHN0cm9uZz5za2lwPC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQKLWF0IGFsbC48L2xpPgotCi08bGk+PHN0cm9uZz5sYXg8L3N0cm9uZz4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50IGFzIG11Y2gKLWFzIGl0IGNhbi48L2xpPgotCi08bGk+PHN0cm9uZz5zdHJpY3Q8L3N0cm9uZz4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgYWxsIHRoZSBhdHRyaWJ1dGUgY29udGVudC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdsb2JhbCBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYSBnbG9iYWwgZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBnbG9iYWwgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLWFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50IG1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIHRpdGxlPSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiB0aXRsZT0iQW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbCBlbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiI+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTg3MGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3Jwci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRncnByIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQNCi1lbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQNCi1vZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Z3JvdXAgcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmdyb3VwIHJlZmVyZW5jZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5ncm91cCByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5ncm91cCByZWZlcmVuY2VzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRoZSBtZW51IG9wdGlvbiB0byBhZGQgYSBncm91cCByZWZlcmVuY2Ugb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZQ0KLWdyb3VwcyBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQuPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZQ0KLXdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlcg0KLXBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGEgZ3JvdXAgcmVmZXJlbmNlLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHdvcmsNCi13aXRoIGFuZCBzZWxlY3QgPHVpY29udHJvbD5BZGQgR3JvdXAgUmVmPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgbmV3IGdyb3VwIHJlZmVyZW5jZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGdyb3VwIHlvdSB3YW50IHRvIHJlZmVyIHRvIGluDQotdGhlIDx1aWNvbnRyb2w+cmVmPC91aWNvbnRyb2w+IGxpc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdyb3VwIHJlZmVyZW5jZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjw/UHViIENhcmV0Pz48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMjc3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMGU0OWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3Jwci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBncm91cCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgZ3JvdXAgcmVmZXJlbmNlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ3J1cC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRncnByIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRncnByIj48YSBuYW1lPSJ0YWRkZ3JwciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZ3JvdXAgcmVmZXJlbmNlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ3JvdXAuIEl0Ci1lbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQKLW9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBtZW51IG9wdGlvbiB0byBhZGQgYSBncm91cCByZWZlcmVuY2Ugb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZQotZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudC48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlCi13cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIKLXBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSBncm91cCByZWZlcmVuY2UsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHdvcmsKLXdpdGggYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgR3JvdXAgUmVmPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIG5ldyBncm91cCByZWZlcmVuY2UuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBncm91cCB5b3Ugd2FudCB0byByZWZlciB0byBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnJlZjwvc3Bhbj4gbGlzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdyb3VwIHJlZmVyZW5jZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ3J1cC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgY3JlYXRlIGEgZ3JvdXAsIGl0IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLiBUaGUgY29udGVudCBtb2RlbCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLiI+QWRkaW5nIGdyb3VwczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWNmNGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0YWRkZ3J1cCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGdyb3VwczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdyb3Vwczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuDQotVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyDQotYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmdyb3VwczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Z3JvdXBzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQ0KLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1hZGQgYSBncm91cCwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIDxiPkdyb3VwczwvYj4sIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLUdyb3VwPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGdyb3VwIGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdyb3VwIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+PD9QdWIgQ2FyZXQ/PiBwYWdlIGFsbG93cyB5b3UgdG8NCi1zcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBleHBhbmQgdGhlIDx1aWNvbnRyb2w+R3JvdXBzPC91aWNvbnRyb2w+IGZvbGRlcg0KLWFuZCB5b3VyIG5ldyBncm91cC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3VyIGdyb3VwIGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLiA8L2NtZD48aW5mbz5BDQotZ3JvdXAncyBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQNCi1pbnNpZGUgdGhlIGdyb3VwLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsDQotcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNTAyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MTQxZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdyb3VwcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4gVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyIGJ5IHRoZSBncm91cCwgc3VjaCBhcyBlbGVtZW50cywgZWxlbWVudCByZWZlcmVuY2VzLCBhbmQgZ3JvdXAgcmVmZXJlbmNlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBncm91cHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBncm91cHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGdydXAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZ3JvdXBzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkZ3J1cCI+PGEgbmFtZT0idGFkZGdydXAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBncm91cHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4KLVRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlcgotYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHAgLz4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhIGdyb3VwLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIDxzdHJvbmc+R3JvdXBzPC9zdHJvbmc+LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1Hcm91cDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgZ3JvdXAgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBncm91cCBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0bwotc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIGV4cGFuZCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R3JvdXBzPC9zcGFuPiBmb2xkZXIKLWFuZCB5b3VyIG5ldyBncm91cC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3VyIGdyb3VwIGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLiA8L3NwYW4+IEEKLWdyb3VwJ3MgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkCi1pbnNpZGUgdGhlIGdyb3VwLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsCi1yZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ3Jwci5odG1sIiB0aXRsZT0iQSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZjI1M2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRpbXB0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpcg0KLWNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsDQotcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gPGNvZGVwaD5pbXBvcnQ8L2NvZGVwaD4gZWxlbWVudCB0bw0KLWJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudA0KLXNjaGVtYS4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+aW1wb3J0IGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+aW1wb3J0IGVsZW1lbnRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+aW1wb3J0IGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5pbXBvcnQgZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBjYW4gY29tZSBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIHRoZQ0KLWN1cnJlbnQgc2NoZW1hIGRvZXMuPC9wPjxwPllvdSBjYW4gYWRkIG11bHRpcGxlIGltcG9ydCBlbGVtZW50cyB0byBhbiBYTUwNCi1zY2hlbWEsIGhvd2V2ZXIsIHByZWZpeGVzIGFuZCBuYW1lc3BhY2VzIGhhdmUgdG8gdW5pcXVlIGFtb25nc3QgdGhlIGltcG9ydGVkDQotc2NoZW1hcy48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBpbXBvcnQNCi1lbGVtZW50LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvY21kPjxpbmZvPlRoZSBlbnRpcmUNCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodCBjbGljayBpbiB0aGUgPGI+RGlyZWN0aXZlczwvYj4gc2VjdGlvbg0KLWFuZCBjbGljayA8dWljb250cm9sPkFkZCBJbXBvcnQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxiPkdlbmVyYWw8L2I+IHRhYiBhbmQgY2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gPGltYWdlDQotaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gdG8NCi10aGUgcmlnaHQgb2YgdGhlIDx1aWNvbnRyb2w+U2NoZW1hIGxvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4gdGhlIHdvcmtiZW5jaDo8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5Xb3JrYmVuY2ggcHJvamVjdHM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHRoZSBzY2hlbWEgeW91IHdhbnQgdG8gaW1wb3J0IGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWI6PD9QdWIgQ2FyZXQ/PjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPkhUVFA8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPjxub3RlPkEgbG9jYWwgY29weSBvZiB0aGUgc2NoZW1hIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgd29ya2JlbmNoLg0KLUV2ZXJ5IHRpbWUgeW91IHZhbGlkYXRlIHlvdXIgc2NoZW1hLCB0aGUgc2NoZW1hJ3MgY29udGVudHMgd2lsbCBiZSBjaGVja2VkDQotZnJvbSB0aGUgVVJMIHlvdSBzcGVjaWZ5Ljwvbm90ZT48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIHdpbGwgcmV0cmlldmUgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIGltcG9ydGVkDQotWE1MIHNjaGVtYSBmaWxlIGFuZCBkaXNwbGF5IGl0IGFzIHJlYWQtb25seSBpbiB0aGUgPHVpY29udHJvbD5OYW1lc3BhY2U8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgbmVjZXNzYXJ5LCB0eXBlIGEgdW5pcXVlIHByZWZpeCBmb3IgdGhpcyBuYW1lc3BhY2UgaW4gdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBvcnQgZWxlbWVudC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIGFuIGltcG9ydCBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwgd2hlbg0KLXlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUgdHlwZXMgd2hlcmUNCi15b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWENCi13aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGxpc3QgZm9yIHRoZSBlbGVtZW50LA0KLWF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA0MzQwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTQ2ZWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSBhbiBpbXBvcnQgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGltcG9ydCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGltcG9ydCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRpbXB0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGltcHQiPjxhIG5hbWU9InRhZGRpbXB0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIKLWNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsCi1yZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5pbXBvcnQ8L3NhbXA+IGVsZW1lbnQgdG8KLWJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudAotc2NoZW1hLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBpbXBvcnRlZCBzY2hlbWEgY2FuIGNvbWUgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiB0aGUKLWN1cnJlbnQgc2NoZW1hIGRvZXMuPC9wPgotPHA+WW91IGNhbiBhZGQgbXVsdGlwbGUgaW1wb3J0IGVsZW1lbnRzIHRvIGFuIFhNTAotc2NoZW1hLCBob3dldmVyLCBwcmVmaXhlcyBhbmQgbmFtZXNwYWNlcyBoYXZlIHRvIHVuaXF1ZSBhbW9uZ3N0IHRoZSBpbXBvcnRlZAotc2NoZW1hcy48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiBpbXBvcnQKLWVsZW1lbnQsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvc3Bhbj4gVGhlIGVudGlyZQotc2NoZW1hIGFuZCBpdHMgY29udGVudHMgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0IGNsaWNrIGluIHRoZSA8c3Ryb25nPkRpcmVjdGl2ZXM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBJbXBvcnQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3Ryb25nPkdlbmVyYWw8L3N0cm9uZz4gdGFiIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IDxpbWcgc3JjPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b24iIC8+IHRvCi10aGUgcmlnaHQgb2YgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBsb2NhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoOjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoIHByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWI6PC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRUUDwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZAotZnJvbSB0aGUgVVJMIHlvdSBzcGVjaWZ5LjwvZGl2PgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCByZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIGZvciB0aGUgaW1wb3J0ZWQKLVhNTCBzY2hlbWEgZmlsZSBhbmQgZGlzcGxheSBpdCBhcyByZWFkLW9ubHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiBuZWNlc3NhcnksIHR5cGUgYSB1bmlxdWUgcHJlZml4IGZvciB0aGlzIG5hbWVzcGFjZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wb3J0IGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPk9uY2UgeW91IGhhdmUgYWRkZWQgYW4gaW1wb3J0IGVsZW1lbnQgdG8geW91ciBYTUwgc2NoZW1hLCB3aGVuCi15b3UgZGVmaW5lIG5ldyBlbGVtZW50cywgYXR0cmlidXRlcywgY29tcGxleCB0eXBlcywgb3Igc2ltcGxlIHR5cGVzIHdoZXJlCi15b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEKLXdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBsaXN0IGZvciB0aGUgZWxlbWVudCwKLWF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgdGl0bGU9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSByZWRlZmluZSBtZWNoYW5pc20gdG8gcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLiI+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyYjgzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGluY2wiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXINCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLA0KLXJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSA8Y29kZXBoPmluY2x1ZGU8L2NvZGVwaD4gZWxlbWVudCB0bw0KLWJyaW5nPD9QdWIgQ2FyZXQ/PiBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYQ0KLWludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZQ0KLWFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5pbmNsdWRlDQotZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5pbmNsdWRlDQotZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MDQotc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmluY2x1ZGUgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmluY2x1ZGUgZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgWE1MIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYW4gaW5jbHVkZQ0KLWVsZW1lbnQsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIGVudGlyZQ0KLXNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIERlc2lnbiB2aWV3LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEluY2x1ZGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxiPkdlbmVyYWw8L2I+IHRhYiBhbmQgY2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gPGltYWdlDQotaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gdG8NCi10aGUgcmlnaHQgb2YgdGhlIDx1aWNvbnRyb2w+U2NoZW1hIGxvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjxpbmZvPlRoZQ0KLVhNTCBzY2hlbWEgZmlsZSB5b3Ugc2VsZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQgc2NoZW1hLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBzZWxlY3QgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHRoZSB3b3JrYmVuY2gsIHNlbGVjdCA8dWljb250cm9sPldvcmtiZW5jaA0KLXByb2plY3RzPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgc2NoZW1hIHlvdSB3YW50IHRvIGluY2x1ZGUgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIHNlbGVjdCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgb24gdGhlIFdlYiwgc2VsZWN0IDx1aWNvbnRyb2w+SFRUUDwvdWljb250cm9sPiBhbmQNCi1jbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz48bm90ZT4gQSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guDQotRXZlcnkgdGltZSB5b3UgdmFsaWRhdGUgeW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyB3aWxsIGJlIGNoZWNrZWQNCi1mcm9tIHRoZSBVUkwgeW91IHNwZWNpZnkuPC9ub3RlPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCByZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkDQotWE1MIHNjaGVtYSBmaWxlLCBhbmQgZGlzcGxheSBpdCBpbiB0aGUgPHVpY29udHJvbD5TY2hlbWEgbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuDQotVGhpcyBmaWVsZCBjYW4gYmUgZWRpdGVkIGF0IGFueSB0aW1lIHRvIHJlZmxlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgc2NoZW1hDQotZmlsZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW5jbHVkZSBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPk9uY2UgeW91IGhhdmUgYWRkZWQgdGhlIGluY2x1ZGUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHdoZW4NCi15b3UgZGVmaW5lIG5ldyBlbGVtZW50cywgYXR0cmlidXRlcywgY29tcGxleCB0eXBlcywgb3Igc2ltcGxlIHR5cGVzIHdoZXJlDQoteW91IGNhbiBzcGVjaWZ5IHR5cGUgaW5mb3JtYXRpb24sIGFueSBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hDQotd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIDx1aWNvbnRyb2w+VHlwZTwvdWljb250cm9sPiBsaXN0IGZvciB0aGUgZWxlbWVudCwNCi1hdHRyaWJ1dGUsIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuPC9wPjxwPkZvciBleGFtcGxlLCBpZiBBZGRyZXNzLnhzZCBoYXMgdGhlDQotZm9sbG93aW5nIGNvbnRlbnQ6PC9wPjxjb2RlYmxvY2s+Jmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPg0KLSAgICAmbHQ7c2VxdWVuY2U+DQotICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic3RyZWV0IiB0eXBlPSJzdHJpbmciPg0KLSAgICAmbHQ7L3NlcXVlbmNlPg0KLSZsdDsvY29tcGxleFR5cGU+DQotPC9jb2RlYmxvY2s+YW5kIHlvdSBoYXZlIGFuIFhNTCBzY2hlbWEgY2FsbGVkIFB1cmNoYXNlT3JkZXIueHNkIHRoYXQgaGFzIGFkZGVkDQotYW4gaW5jbHVkZSBmb3IgQWRkcmVzcy54c2QsIHRoZW4gd2hlbiBkZWZpbmluZyBhIG5ldyBlbGVtZW50IGluICBQdXJjaGFzZU9yZGVyLA0KLXlvdSBjYW4gc2VsZWN0IEFkZHJlc3MgYXMgaXRzIHR5cGUuICA8cD4oYykgQ29weXJpZ2h0IDIwMDEsIFdvcmxkIFdpZGUgV2ViDQotQ29uc29ydGl1bSAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlDQotZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDcyOD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJiYTgzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgdGhlIGluY2x1ZGUgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBpbmNsdWRlIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzLCBpbmNsdWRlIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgaW5jbHVkZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcywgaW5jbHVkZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRpbmNsIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRpbmNsIj48YSBuYW1lPSJ0YWRkaW5jbCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpcgotY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwKLXJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5pbmNsdWRlPC9zYW1wPiBlbGVtZW50IHRvCi1icmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYQotaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlCi1hcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBYTUwgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gaW5jbHVkZQotZWxlbWVudCwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9zcGFuPiBUaGUgZW50aXJlCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+RGlyZWN0aXZlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEluY2x1ZGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3Ryb25nPkdlbmVyYWw8L3N0cm9uZz4gdGFiIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IDxpbWcgc3JjPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b24iIC8+IHRvCi10aGUgcmlnaHQgb2YgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBsb2NhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPiBUaGUKLVhNTCBzY2hlbWEgZmlsZSB5b3Ugc2VsZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQgc2NoZW1hLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBzZWxlY3QgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHRoZSB3b3JrYmVuY2gsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2gKLXByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgc2NoZW1hIHlvdSB3YW50IHRvIGluY2x1ZGUgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBzZWxlY3QgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWIsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVFRQPC9zcGFuPiBhbmQKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+Ci0gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+ICBBIGxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHdvcmtiZW5jaC4KLUV2ZXJ5IHRpbWUgeW91IHZhbGlkYXRlIHlvdXIgc2NoZW1hLCB0aGUgc2NoZW1hJ3MgY29udGVudHMgd2lsbCBiZSBjaGVja2VkCi1mcm9tIHRoZSBVUkwgeW91IHNwZWNpZnkuPC9kaXY+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIHJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQKLVhNTCBzY2hlbWEgZmlsZSwgYW5kIGRpc3BsYXkgaXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBsb2NhdGlvbjwvc3Bhbj4gZmllbGQuCi1UaGlzIGZpZWxkIGNhbiBiZSBlZGl0ZWQgYXQgYW55IHRpbWUgdG8gcmVmbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWEKLWZpbGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbmNsdWRlIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPk9uY2UgeW91IGhhdmUgYWRkZWQgdGhlIGluY2x1ZGUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHdoZW4KLXlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUgdHlwZXMgd2hlcmUKLXlvdSBjYW4gc3BlY2lmeSB0eXBlIGluZm9ybWF0aW9uLCBhbnkgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYQotd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGxpc3QgZm9yIHRoZSBlbGVtZW50LAotYXR0cmlidXRlLCBjb21wbGV4IG9yIHNpbXBsZSB0eXBlLjwvcD4KLTxwPkZvciBleGFtcGxlLCBpZiBBZGRyZXNzLnhzZCBoYXMgdGhlCi1mb2xsb3dpbmcgY29udGVudDo8L3A+Ci08cHJlPiZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIiZndDsKLSAgICAmbHQ7c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyImZ3Q7Ci0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ic3RyaW5nIiZndDsKLSAgICAmbHQ7L3NlcXVlbmNlJmd0OwotJmx0Oy9jb21wbGV4VHlwZSZndDsKLTwvcHJlPgotYW5kIHlvdSBoYXZlIGFuIFhNTCBzY2hlbWEgY2FsbGVkIFB1cmNoYXNlT3JkZXIueHNkIHRoYXQgaGFzIGFkZGVkCi1hbiBpbmNsdWRlIGZvciBBZGRyZXNzLnhzZCwgdGhlbiB3aGVuIGRlZmluaW5nIGEgbmV3IGVsZW1lbnQgaW4gIFB1cmNoYXNlT3JkZXIsCi15b3UgY2FuIHNlbGVjdCBBZGRyZXNzIGFzIGl0cyB0eXBlLiAgPHA+KGMpIENvcHlyaWdodCAyMDAxLCBXb3JsZCBXaWRlIFdlYgotQ29uc29ydGl1bSAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlCi1lbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIHRpdGxlPSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIj5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2ODBlZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkbm90IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgbm90YXRpb25zPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgbm90YXRpb25zPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgbm90YXRpb24gaXMgYSBtZWFucyBvZiBhc3NvY2lhdGluZyBhIGJpbmFyeSBkZXNjcmlwdGlvbiB3aXRoDQotYW4gZW50aXR5IG9yIGF0dHJpYnV0ZS4gVGhlIG1vc3QgY29tbW9uIHVzZXMgb2Ygbm90YXRpb25zIGFyZSB0byBpbmNsdWRlIGZhbWlsaWFyDQotdHlwZXMgb2YgYmluYXJ5IHJlZmVyZW5jZXMsIHN1Y2ggYXMgR0lGcyBhbmQgSlBHcywgaW4gYW4gWE1MIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+bm90YXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+bm90YXRpb25zPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+bm90YXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5ub3RhdGlvbnM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+Rm9yIGV4YW1wbGUsIHlvdSBhcmUgbWFraW5nIGEgY2F0YWxvZ3VlIG9mIHlvdXIgY2xvdGhpbmcgYW5kIHdhbnQNCi10byBpbmNsdWRlIGFuIGltYWdlIG9mIG9uZSBvZiB5b3VyIHNoaXJ0cy4gWW91IHdvdWxkIGhhdmUgdG8gY3JlYXRlIGEgbm90YXRpb24NCi1saWtlIHRoaXM6ICA8dXNlcmlucHV0PiZsdDtub3RhdGlvbiBuYW1lPSJNeV9TaGlydCIgc3lzdGVtPSJHSUYiPiZsdDsvbm90YXRpb24+PC91c2VyaW5wdXQ+IHdoaWNoDQotZGVmaW5lcyBhIG5vdGF0aW9uIGZvciBhIEdJRiBpbWFnZS48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZQ0KLXdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlcg0KLXBlcnNwZWN0aXZlcy48L3A+PHA+VG8gY3JlYXRlIGEgbm90YXRpb24sIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB5b3VyIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotTm90YXRpb248L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSB0aGUgbmFtZSBvZiB0aGUgbm90YXRpb24gaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPiB0YWIuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+cHVibGljPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIGEgcHVibGljIGlkZW50aWZpZXIuPC9jbWQ+DQotPGluZm8+IFRoaXMgaXMgb3B0aW9uYWwgaWYgeW91IGVudGVyIGEgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+c3lzdGVtPC91aWNvbnRyb2w+IGZpZWxkLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5zeXN0ZW08L3VpY29udHJvbD4gZmllbGQsIHR5cGUgYSBVUkkgcmVmZXJlbmNlLjwvY21kPg0KLTxpbmZvPiBUaGlzIGlzIG9wdGlvbmFsIGlmIHlvdSBlbnRlciBhIHZhbHVlIGluIHRoZSA8dWljb250cm9sPnB1YmxpYzwvdWljb250cm9sPiBmaWVsZC48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5vdGF0aW9uLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uIDx1aWNvbnRyb2w+QXBwDQotSW5mbzwvdWljb250cm9sPiBwYWdlIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucy48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjw/UHViIENhcmV0Pz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjk1OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwNzhiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+QWRkaW5nIG5vdGF0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZG5vdCI+PGEgbmFtZT0idGFkZG5vdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBub3RhdGlvbnM8L2gxPgotPGRpdj48cD5BIG5vdGF0aW9uIGlzIGEgbWVhbnMgb2YgYXNzb2NpYXRpbmcgYSBiaW5hcnkgZGVzY3JpcHRpb24gd2l0aAotYW4gZW50aXR5IG9yIGF0dHJpYnV0ZS4gVGhlIG1vc3QgY29tbW9uIHVzZXMgb2Ygbm90YXRpb25zIGFyZSB0byBpbmNsdWRlIGZhbWlsaWFyCi10eXBlcyBvZiBiaW5hcnkgcmVmZXJlbmNlcywgc3VjaCBhcyBHSUZzIGFuZCBKUEdzLCBpbiBhbiBYTUwgZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgeW91IGFyZSBtYWtpbmcgYSBjYXRhbG9ndWUgb2YgeW91ciBjbG90aGluZyBhbmQgd2FudAotdG8gaW5jbHVkZSBhbiBpbWFnZSBvZiBvbmUgb2YgeW91ciBzaGlydHMuIFlvdSB3b3VsZCBoYXZlIHRvIGNyZWF0ZSBhIG5vdGF0aW9uCi1saWtlIHRoaXM6ICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPiZsdDtub3RhdGlvbiBuYW1lPSJNeV9TaGlydCIgc3lzdGVtPSJHSUYiJmd0OyZsdDsvbm90YXRpb24mZ3Q7PC9rYmQ+IHdoaWNoCi1kZWZpbmVzIGEgbm90YXRpb24gZm9yIGEgR0lGIGltYWdlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgCi10aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1jcmVhdGUgYSBub3RhdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgeW91ciBYTUwgc2NoZW1hIGFuZCBjbGljayAKLTxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLU5vdGF0aW9uPC9zcGFuPjwvYj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSB0aGUgbmFtZSBvZiB0aGUgbm90YXRpb24gaW4gdGhlIAotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+PC9iPiBmaWVsZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPjwvYj4gdGFiLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkluIHRoZSA8Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cHVibGljPC9zcGFuPjwvYj4gZmllbGQsIHR5cGUgYSBwdWJsaWMgaWRlbnRpZmllci48L3NwYW4+ICBUaGlzIGlzIG9wdGlvbmFsIGlmIHlvdSBlbnRlciBhIHZhbHVlIGluIHRoZSAKLTxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5zeXN0ZW08L3NwYW4+PC9iPiBmaWVsZC48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkluIHRoZSA8Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+c3lzdGVtPC9zcGFuPjwvYj4gZmllbGQsIHR5cGUgYSBVUkkgcmVmZXJlbmNlLjwvc3Bhbj4gIFRoaXMgaXMgb3B0aW9uYWwgaWYgeW91IGVudGVyIGEgdmFsdWUgaW4gdGhlIAotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnB1YmxpYzwvc3Bhbj48L2I+IGZpZWxkLjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+Q2xpY2sgdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPjwvYj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5vdGF0aW9uLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24sIGFuZCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwCi1JbmZvPC9zcGFuPiBwYWdlIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucy48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlN2I0MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZHJkZm4iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyByZWRlZmluZSBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIHRoZSA8Y29kZXBoPnJlZGVmaW5lPC9jb2RlcGg+IG1lY2hhbmlzbSB0byByZWRlZmluZQ0KLXNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZCBmcm9tIGV4dGVybmFsDQotc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPnJlZGVmaW5lDQotZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5yZWRlZmluZQ0KLWVsZW1lbnRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTA0KLXNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5yZWRlZmluZSBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+cmVkZWZpbmUgZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+TGlrZSB0aGUgPGNvZGVwaD5pbmNsdWRlPC9jb2RlcGg+IG1lY2hhbmlzbSwgPGNvZGVwaD5yZWRlZmluZTwvY29kZXBoPiByZXF1aXJlcw0KLXRoZSBleHRlcm5hbCBjb21wb25lbnRzIHRvIGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIHJlZGVmaW5pbmcNCi1zY2hlbWEsIGFsdGhvdWdoIGV4dGVybmFsIGNvbXBvbmVudHMgZnJvbSBzY2hlbWFzIHRoYXQgaGF2ZSBubyBuYW1lc3BhY2UgY2FuDQotYWxzbyBiZSByZWRlZmluZWQuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhIHJlZGVmaW5lIGVsZW1lbnQ6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvY21kPjxpbmZvPlRoZSBlbnRpcmUNCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+RGlyZWN0aXZlczwvYj4gc2VjdGlvbg0KLWFuZCBjbGljayA8dWljb250cm9sPkFkZCBSZWRlZmluZTwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPGI+R2VuZXJhbDwvYj4gdGFiIGFuZCBjbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UNCi1ocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD48L2ltYWdlPiB0bw0KLTw/UHViIENhcmV0Pz50aGUgcmlnaHQgb2YgdGhlIDx1aWNvbnRyb2w+U2NoZW1hIGxvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPlRoZSBYTUwgc2NoZW1hIGZpbGUgeW91IHNlbGVjdCBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBjdXJyZW50DQotc2NoZW1hLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBzZWxlY3QgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHRoZSB3b3JrYmVuY2gsIHNlbGVjdCA8dWljb250cm9sPldvcmtiZW5jaA0KLXByb2plY3RzPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQuPC91aWNvbnRyb2w+PC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBzY2hlbWEgeW91IHdhbnQgdG8gaW5jbHVkZSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gc2VsZWN0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBvbiB0aGUgV2ViLCBzZWxlY3QgPHVpY29udHJvbD5IVFRQPC91aWNvbnRyb2w+IGFuZA0KLWNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPiA8bm90ZT5BIGxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHdvcmtiZW5jaC4NCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZA0KLWZyb20gdGhlIFVSTCB5b3Ugc3BlY2lmeS48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIHJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQNCi1YTUwgc2NoZW1hIGZpbGUsIGFuZCBkaXNwbGF5IGl0IGluIHRoZSA8dWljb250cm9sPlNjaGVtYSBsb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZC4NCi1UaGlzIGZpZWxkIGNhbiBiZSBlZGl0ZWQgYXQgYW55IHRpbWUgdG8gcmVmbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWENCi1maWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZWRlZmluZSBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPk9uY2UgeW91IGhhdmUgYWRkZWQgdGhlIHJlZGVmaW5lIGVsZW1lbnQgdG8geW91ciBYTUwgc2NoZW1hLCB5b3UNCi1jYW4gcmVkZWZpbmUgYW55IG9mIHRoZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMNCi1pbiB0aGUgWE1MIHNjaGVtYSB5b3Ugc2VsZWN0ZWQgaW4gdGhlIHJlZGVmaW5lIGVsZW1lbnQuIDwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDA1NT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgyMGM4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSByZWRlZmluZSBtZWNoYW5pc20gdG8gcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIHJlZGVmaW5lIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzLCByZWRlZmluZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIHJlZGVmaW5lIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzLCByZWRlZmluZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRyZGZuIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkcmRmbiI+PGEgbmFtZT0idGFkZHJkZm4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyByZWRlZmluZSBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnJlZGVmaW5lPC9zYW1wPiBtZWNoYW5pc20gdG8gcmVkZWZpbmUKLXNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZCBmcm9tIGV4dGVybmFsCi1zY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5MaWtlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5pbmNsdWRlPC9zYW1wPiBtZWNoYW5pc20sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnJlZGVmaW5lPC9zYW1wPiByZXF1aXJlcwotdGhlIGV4dGVybmFsIGNvbXBvbmVudHMgdG8gYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgcmVkZWZpbmluZwotc2NoZW1hLCBhbHRob3VnaCBleHRlcm5hbCBjb21wb25lbnRzIGZyb20gc2NoZW1hcyB0aGF0IGhhdmUgbm8gbmFtZXNwYWNlIGNhbgotYWxzbyBiZSByZWRlZmluZWQuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotYWRkIGEgcmVkZWZpbmUgZWxlbWVudDo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvc3Bhbj4gVGhlIGVudGlyZQotc2NoZW1hIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8c3Ryb25nPkRpcmVjdGl2ZXM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBSZWRlZmluZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzdHJvbmc+R2VuZXJhbDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gdG8KLXRoZSByaWdodCBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hIGxvY2F0aW9uPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gVGhlIFhNTCBzY2hlbWEgZmlsZSB5b3Ugc2VsZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQKLXNjaGVtYS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIHNlbGVjdCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4gdGhlIHdvcmtiZW5jaCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaAotcHJvamVjdHM8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0Ljwvc3Bhbj48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbmNsdWRlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gc2VsZWN0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBvbiB0aGUgV2ViLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRUUDwvc3Bhbj4gYW5kCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZAotZnJvbSB0aGUgVVJMIHlvdSBzcGVjaWZ5LjwvZGl2PgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCByZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkCi1YTUwgc2NoZW1hIGZpbGUsIGFuZCBkaXNwbGF5IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY2hlbWEgbG9jYXRpb248L3NwYW4+IGZpZWxkLgotVGhpcyBmaWVsZCBjYW4gYmUgZWRpdGVkIGF0IGFueSB0aW1lIHRvIHJlZmxlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgc2NoZW1hCi1maWxlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVkZWZpbmUgZWxlbWVudC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgcmVkZWZpbmUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHlvdQotY2FuIHJlZGVmaW5lIGFueSBvZiB0aGUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzCi1pbiB0aGUgWE1MIHNjaGVtYSB5b3Ugc2VsZWN0ZWQgaW4gdGhlIHJlZGVmaW5lIGVsZW1lbnQuIDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgdGl0bGU9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZmM3M2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRyZWciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MNCi1sZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksDQotd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5wYXR0ZXJuDQotZmFjZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+cGF0dGVybg0KLWZhY2V0czxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwNCi1zY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+cGF0dGVybiBmYWNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPnBhdHRlcm4gZmFjZXRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPiBUaGUgdmFsdWUgb2YgdGhlIHBhdHRlcm4gaXMgY2FsbGVkIGEgcmVndWxhciBleHByZXNzaW9uLiBZb3UNCi1jYW4gc3BlY2lmeSBpdCB1c2luZyB0aGUgPHVpY29udHJvbD5SZWd1bGFyIEV4cHJlc3Npb248L3VpY29udHJvbD4gd2l6YXJkLjwvcD48cD5Ubw0KLWFkZCBhIHBhdHRlcm4gdG8gYSBzaW1wbGUgdHlwZTo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBzaW1wbGUgdHlwZSB5b3Ugd2FudCB0byB3b3JrIHdpdGguPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+Q29uc3RyYWludHM8L3VpY29udHJvbD4gdGFiLA0KLXRoZW4gPHVpY29udHJvbD5QYXR0ZXJuczwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi48L2NtZD48aW5mbz5UaGUgUmVndWxhciBFeHByZXNzaW9uDQotd2l6YXJkIG9wZW5zLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHRva2VuIHlvdSB3YW50IHRvIGFkZCB0byB0aGUgZXhwcmVzc2lvbi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbmRpY2F0ZSBob3cgb2Z0ZW4geW91IHdhbnQgdGhlIHRva2VuIHRvIGFwcGVhciBpbiBvcmRlciBmb3IgYQ0KLW1hdGNoIHRvIHN1Y2NlZWQ6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5JZiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gcmVwZWF0LCBjbGljayA8dWljb250cm9sPlJlcGVhdDwvdWljb250cm9sPiBhbmQNCi1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHRva2VuIG11c3QgYXBwZWFyLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlDQotdG9rZW4gY2FuIGFwcGVhciwgY2xpY2sgPHVpY29udHJvbD5SYW5nZTwvdWljb250cm9sPiBhbmQgZW50ZXIgYSBtaW5pbXVtIGFuZA0KLW1heGltdW0gdmFsdWUuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4uIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGNyZWF0ZSB0aGUgZW50aXJlIGV4cHJlc3Npb24sIHJlcGVhdCBzdGVwcyA0IC0gNiBhcyBuZWNlc3NhcnkuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBUbyB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgc2VlIGlmIGENCi1tYXRjaCBvY2N1cnMsIGVudGVyIHNhbXBsZSB0ZXh0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjxzdGVwcmVzdWx0PiBUaGUgcmVndWxhcg0KLWV4cHJlc3Npb24gd2lsbCBhcHBlYXIgaW4gdGhlIFBhdHRlcm5zIHBhZ2UuIDxub3RlIHR5cGU9InRpcCI+IFRvIGVkaXQgYW4NCi1leGlzdGluZyBwYXR0ZXJuLCBzZWxlY3QgaXQgaW4gdGhlIFBhdHRlcm5zIHBhZ2UgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPi4NCi1UbyBkZWxldGUgYW4gZXhpc3RpbmcgcGF0dGVybiwgc2VsZWN0IGl0IGluIHRoZSBQYXR0ZXJucyBwYWdlIGFuZCBjbGljayA8dWljb250cm9sPkRlbGV0ZTwvdWljb250cm9sPi4gPD9QdWIgQ2FyZXQ/Pjwvbm90ZT48L3N0ZXByZXN1bHQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI5NTI/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGMwN2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzIGxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwgd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MgbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLCB3aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIHBhdHRlcm4gZmFjZXRzLCBYTUwgc2NoZW1hIGZpbGVzLCBwYXR0ZXJuIGZhY2V0cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIHBhdHRlcm4gZmFjZXRzLCBYTUwgc2NoZW1hIGZpbGVzLCBwYXR0ZXJuIGZhY2V0cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkc21wdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRyZWciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkcmVnIj48YSBuYW1lPSJ0YWRkcmVnIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncwotbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLAotd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBUaGUgdmFsdWUgb2YgdGhlIHBhdHRlcm4gaXMgY2FsbGVkIGEgcmVndWxhciBleHByZXNzaW9uLiBZb3UKLWNhbiBzcGVjaWZ5IGl0IHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWd1bGFyIEV4cHJlc3Npb248L3NwYW4+IHdpemFyZC48L3A+Ci08cD5UbwotYWRkIGEgcGF0dGVybiB0byBhIHNpbXBsZSB0eXBlOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBzaW1wbGUgdHlwZSB5b3Ugd2FudCB0byB3b3JrIHdpdGguPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29uc3RyYWludHM8L3NwYW4+IHRhYiwKLXRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybnM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uPC9zcGFuPiBUaGUgUmVndWxhciBFeHByZXNzaW9uCi13aXphcmQgb3BlbnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHRva2VuIHlvdSB3YW50IHRvIGFkZCB0byB0aGUgZXhwcmVzc2lvbi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbmRpY2F0ZSBob3cgb2Z0ZW4geW91IHdhbnQgdGhlIHRva2VuIHRvIGFwcGVhciBpbiBvcmRlciBmb3IgYQotbWF0Y2ggdG8gc3VjY2VlZDo8L3NwYW4+Ci08dWw+Ci08bGk+SWYgeW91IHdhbnQgdGhlIHRva2VuIHRvIHJlcGVhdCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVwZWF0PC9zcGFuPiBhbmQKLXNwZWNpZnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdG9rZW4gbXVzdCBhcHBlYXIuPC9saT4KLQotPC91bD4KLQotPHVsPgotPGxpPiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlCi10b2tlbiBjYW4gYXBwZWFyLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SYW5nZTwvc3Bhbj4gYW5kIGVudGVyIGEgbWluaW11bSBhbmQKLW1heGltdW0gdmFsdWUuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhZGQgdGhlIHRva2VuIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gY3JlYXRlIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgcmVwZWF0IHN0ZXBzIDQgLSA2IGFzIG5lY2Vzc2FyeS48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldoZW4geW91IGFyZSBmaW5pc2hlZCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIFRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBzZWUgaWYgYQotbWF0Y2ggb2NjdXJzLCBlbnRlciBzYW1wbGUgdGV4dC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4gIFRoZSByZWd1bGFyCi1leHByZXNzaW9uIHdpbGwgYXBwZWFyIGluIHRoZSBQYXR0ZXJucyBwYWdlLiA8ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOjwvc3Bhbj4gIFRvIGVkaXQgYW4KLWV4aXN0aW5nIHBhdHRlcm4sIHNlbGVjdCBpdCBpbiB0aGUgUGF0dGVybnMgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4uCi1UbyBkZWxldGUgYW4gZXhpc3RpbmcgcGF0dGVybiwgc2VsZWN0IGl0IGluIHRoZSBQYXR0ZXJucyBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWxldGU8L3NwYW4+LiA8L2Rpdj4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHNtcHQuaHRtbCIgdGl0bGU9IlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhdHlwZXMuIFRoZXkgcHJvdmlkZSBhIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykgYW5kIHRoZSBsZXhpY2FsIHNwYWNlIChhIHNldCBvZiB2YWxpZCBsaXRlcmFscykgb2YgYSBkYXRhdHlwZS4iPkFkZGluZyBzaW1wbGUgdHlwZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzIxMTExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZHNtcHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBzaW1wbGUgdHlwZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBzaW1wbGUgdHlwZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+U2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZTw/UHViIENhcmV0Pz4gZGVyaXZlZCBkYXRhdHlwZXMuDQotVGhleSBwcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQNCi10aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+c2ltcGxlIHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+c2ltcGxlIHR5cGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+c2ltcGxlIHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5zaW1wbGUgdHlwZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+QSBzaW1wbGUgdHlwZSBjYW5ub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQgYW5kIGNhbm5vdCBjYXJyeSBhdHRyaWJ1dGVzLg0KLUVsZW1lbnRzIHRoYXQgY29udGFpbiBudW1iZXJzIChhbmQgc3RyaW5ncywgYW5kIGRhdGVzLCBhbmQgc28gb24pIGJ1dCBkbyBub3QNCi1jb250YWluIGFueSBzdWItZWxlbWVudHMgaGF2ZSBhIHNpbXBsZSB0eXBlLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucw0KLXdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55DQotb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBzaW1wbGUgdHlwZTo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayA8Yj5UeXBlczwvYj4sIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLVNpbXBsZSBUeXBlPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHNlbGVjdCB0aGUgbmV3IHNpbXBsZSB0eXBlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD4gdGFiLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIHNpbXBsZSB0eXBlIGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZyb20gdGhlIDx1aWNvbnRyb2w+VmFyaWV0eTwvdWljb250cm9sPiBsaXN0OjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5hdG9taWM8L3VpY29udHJvbD4uIEF0b21pYyB0eXBlcyBhcmUgYWxsIHRoZSBzaW1wbGUgdHlwZXMNCi1idWlsdCBpbnRvIHRoZSBYTUwgc2NoZW1hIGxhbmd1YWdlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5saXN0PC91aWNvbnRyb2w+LiBMaXN0IHR5cGVzIGFyZSBjb21wcmlzZWQgb2Ygc2VxdWVuY2VzDQotb2YgYXRvbWljIHR5cGVzLiBUaGV5IGhhdmUgdmFsdWVzIHRoYXQgYXJlIGNvbXByaXNlZCBvZiBmaW5pdGUtbGVuZ3RoIHNlcXVlbmNlcw0KLW9mIGF0b21pYyB2YWx1ZXMuIDwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD51bmlvbjwvdWljb250cm9sPi4gQSB1bmlvbiB0eXBlIGVuYWJsZXMgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUNCi12YWx1ZSB0byBiZSBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2Ygb25lIHR5cGUgZHJhd24gZnJvbSB0aGUgdW5pb24gb2YgbXVsdGlwbGUNCi1hdG9taWMgYW5kIGxpc3QgdHlwZXMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBzZWxlY3RlZCA8dWljb250cm9sPmF0b21pYzwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPlZhcmlldHk8L3VpY29udHJvbD4gbGlzdCwNCi1jbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPjxhbHQ+VGhpcw0KLWdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD48L2ltYWdlPiBuZXh0IHRvIHRoZSA8dWljb250cm9sPkJhc2UgdHlwZTwvdWljb250cm9sPiBmaWVsZA0KLXRvIHNwZWNpZnkgYSBiYXNlIHR5cGUgZm9yIHRoZSBzaW1wbGUgdHlwZS48L2NtZD48aW5mbz5UaGUgU2V0IFR5cGUgZGlhbG9nDQotYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4NCi1jaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YgdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUNCi1mb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluDQotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+DQotPC91bD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNlbGVjdGVkIDx1aWNvbnRyb2w+bGlzdDwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPlZhcmlldHk8L3VpY29udHJvbD4gbGlzdCwNCi1jbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPjxhbHQ+VGhpcw0KLWdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD48L2ltYWdlPiBuZXh0IHRvIHRoZSA8dWljb250cm9sPkl0ZW0gdHlwZTwvdWljb250cm9sPiBmaWVsZA0KLXRvIHNwZWNpZnkgYSBpdGVtIHR5cGUgZm9yIHRoZSBzaW1wbGUgdHlwZS48L2NtZD48aW5mbz5UaGUgU2V0IFR5cGUgZGlhbG9nDQotYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4NCi1jaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YgdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUNCi1mb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluDQotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+DQotPC91bD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNlbGVjdGVkIDx1aWNvbnRyb2w+dW5pb248L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5WYXJpZXR5PC91aWNvbnRyb2w+IGxpc3QsDQotY2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gbmV4dCB0byB0aGUgPHVpY29udHJvbD5NZW1iZXIgdHlwZXM8L3VpY29udHJvbD4gZmllbGQNCi10byBzcGVjaWZ5IHRoZSBtZW1iZXIgdHlwZXMgZm9yIHRoZSBzaW1wbGUgdHlwZS48L2NtZD48aW5mbz5Zb3UgY2FuIHNlbGVjdA0KLXRvIGFkZCBib3RoIDx1aWNvbnRyb2w+QnVpbHQtaW4gc2ltcGxlIHR5cGVzPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPlVzZXItZGVmaW5lZA0KLXNpbXBsZSB0eXBlczwvdWljb250cm9sPiB0byB0aGUgbWVtYmVyIHR5cGVzIHZhbHVlIGxpc3QuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Db25zdHJhaW50czwvdWljb250cm9sPiB0YWIuPC9jbWQ+PGluZm8+RnJvbQ0KLWhlcmUgeW91IHdpbGwgYmUgYWJsZSB0byBzZXQgc3BlY2lmaWMgY29uc3RyYWludCB2YWx1ZXMgaW5jbHVkaW5nIGxlbmd0aCBjb25zdHJhaW50cywNCi1lbnVtZXJhdGlvbnMsIGFuZCBwYXR0ZXJucy4gPC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPkVudW1lcmF0aW9ucyBoZWxwIHlvdSB0byBkZWZpbmUgYSBzZXQgb2YgdmFsaWQgdmFsdWVzIGZvciBzaW1wbGUNCi10eXBlcy4gVGhleSBhcmUgdGhlIGFjdHVhbCB2YWx1ZXMgdGhlIHNpbXBsZSB0eXBlIGNhbiB0YWtlIGFzIHZhbGlkIHZhbHVlcw0KLWluIHRoZSBpbnN0YW5jZSBkb2N1bWVudC4gWW91IGNhbiBlaXRoZXIgYWRkIG9uZSBlbnVtZXJhdGlvbiBvciBzZXZlcmFsIGVudW1lcmF0aW9ucw0KLWF0IGEgdGltZTo8L2NtZD48aW5mbz48dWw+DQotPGxpPlRvIGFkZCBvbmUgZW51bWVyYXRpb24gYXQgYSB0aW1lLCB1bmRlciA8dWljb250cm9sPlNwZWNpZmljIGNvbnN0cmFpbnQNCi12YWx1ZXM8L3VpY29udHJvbD4sIHNlbGVjdCA8dWljb250cm9sPkVudW1lcmF0aW9uczwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4gYW5kDQotc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgZW51bWVyYXRpb24uPC9saT4NCi08bGk+VG8gYWRkIHNldmVyYWwgZW51bWVyYXRpb25zIGF0IG9uZSB0aW1lLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PG9sPg0KLTxsaT5TZWxlY3QgPHVpY29udHJvbD5FbnVtZXJhdGlvbnM8L3VpY29udHJvbD4uPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4uPC9saT4NCi08bGk+RW50ZXIgdGhlIHZhbHVlIG9mIGVhY2ggZW51bWVyYXRpb24uIEVhY2ggdmFsdWUgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgdGhlIDx1aWNvbnRyb2w+RGVsaW1pdGVyDQotY2hhcmFjdGVyPC91aWNvbnRyb2w+LiBGb3IgZXhhbXBsZTogPGNvZGVwaD5GaXJzdCwgU2Vjb25kPC9jb2RlcGg+IHdpbGwgY3JlYXRlDQotdHdvIGVudW1lcmF0aW9ucywgb25lIHdpdGggdGhlIHZhbHVlICJGaXJzdCIgYW5kIG9uZSB3aXRoIHRoZSB2YWx1ZSAiU2Vjb25kIi48L2xpPg0KLTxsaT5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+UHJlc2VydmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZTwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpZiB5b3Ugd2FudCBhbnkgd2hpdGUgc3BhY2UgYXJvdW5kIHlvdXIgZW51bWVyYXRpb24gdmFsdWVzIHRvIGJlIHByZXNlcnZlZC4NCi1JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCB0aGUgdmFsdWVzIG9mIDxjb2RlcGg+Rmlyc3QsIFNlY29uZDwvY29kZXBoPiB3aWxsDQotc2hvdyB1cCBhcyAiRmlyc3QiIGFuZCAiIFNlY29uZCIgKHRoZXJlIGlzIGEgc3BhY2UgYmVmb3JlIFNlY29uZCkgYmVjYXVzZQ0KLXlvdSBwdXQgYSBzcGFjZSBiZWZvcmUgIlNlY29uZCIgd2hlbiBlbnRlcmluZyB0aGUgdmFsdWUuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi4gWW91ciBlbnVtZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGFuZA0KLWFwcGVhciBpbiB0aGUgUHJvcGVydGllcyB2aWV3LjwvbGk+DQotPC9vbD48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlBhdHRlcm5zIGhlbHAgeW91IHRvIHBsYWNlIGNlcnRhaW4gY29uc3RyYWludHMgcmVnYXJkaW5nIGFsbG93YWJsZQ0KLXZhbHVlcy48L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwgeW91IGNvdWxkIHJlc3RyaWN0IHRoZSBmaWVsZCB0byBvbmx5IGFjY2VwdA0KLWlucHV0IHdoaWNoIGZvbGxvd3MgdGhlIHBhdHRlcm4gImZpdmUgZGlnaXRzIGZvbGxvd2VkIGJ5IHR3byB1cHBlci1jYXNlIEFTQ0lJDQotbGV0dGVycyIuIFRvIHNldCBhIHBhdHRlcm4gY29uc3RyYWludDo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPlBhdHRlcm5zPC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPkNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4geW91IHdpc2ggdG8gdXNlIGFzIHlvdXIgY29uc3RyYWludA0KLXVzaW5nIHRoZSA8dWljb250cm9sPlJlZ3VsYXIgRXhwcmVzc2lvbjwvdWljb250cm9sPiB3aXphcmQuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9saT4NCi08L29sPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2ltcGxlIHR5cGUuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA3ODI5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTkxNjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBzaW1wbGUgdHlwZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iU2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGF0eXBlcy4gVGhleSBwcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQgdGhlIGxleGljYWwgc3BhY2UgKGEgc2V0IG9mIHZhbGlkIGxpdGVyYWxzKSBvZiBhIGRhdGF0eXBlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJTaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGRlcml2ZWQgZGF0YXR5cGVzLiBUaGV5IHByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpIGFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgc2ltcGxlIHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgc2ltcGxlIHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRyZWcuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkc21wdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBzaW1wbGUgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRzbXB0Ij48YSBuYW1lPSJ0YWRkc21wdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIHNpbXBsZSB0eXBlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+U2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGF0eXBlcy4KLVRoZXkgcHJvdmlkZSBhIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykgYW5kCi10aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BIHNpbXBsZSB0eXBlIGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCBhbmQgY2Fubm90IGNhcnJ5IGF0dHJpYnV0ZXMuCi1FbGVtZW50cyB0aGF0IGNvbnRhaW4gbnVtYmVycyAoYW5kIHN0cmluZ3MsIGFuZCBkYXRlcywgYW5kIHNvIG9uKSBidXQgZG8gbm90Ci1jb250YWluIGFueSBzdWItZWxlbWVudHMgaGF2ZSBhIHNpbXBsZSB0eXBlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zCi13ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueQotb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIHNpbXBsZSB0eXBlOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayA8c3Ryb25nPlR5cGVzPC9zdHJvbmc+LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1TaW1wbGUgVHlwZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHRoZSBuZXcgc2ltcGxlIHR5cGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+IHRhYi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIHNpbXBsZSB0eXBlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gc2VsZWN0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpZXR5PC9zcGFuPiBsaXN0Ojwvc3Bhbj4KLTx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5hdG9taWM8L3NwYW4+LiBBdG9taWMgdHlwZXMgYXJlIGFsbCB0aGUgc2ltcGxlIHR5cGVzCi1idWlsdCBpbnRvIHRoZSBYTUwgc2NoZW1hIGxhbmd1YWdlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5saXN0PC9zcGFuPi4gTGlzdCB0eXBlcyBhcmUgY29tcHJpc2VkIG9mIHNlcXVlbmNlcwotb2YgYXRvbWljIHR5cGVzLiBUaGV5IGhhdmUgdmFsdWVzIHRoYXQgYXJlIGNvbXByaXNlZCBvZiBmaW5pdGUtbGVuZ3RoIHNlcXVlbmNlcwotb2YgYXRvbWljIHZhbHVlcy4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuaW9uPC9zcGFuPi4gQSB1bmlvbiB0eXBlIGVuYWJsZXMgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUKLXZhbHVlIHRvIGJlIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiBvbmUgdHlwZSBkcmF3biBmcm9tIHRoZSB1bmlvbiBvZiBtdWx0aXBsZQotYXRvbWljIGFuZCBsaXN0IHR5cGVzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmF0b21pYzwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWV0eTwvc3Bhbj4gbGlzdCwKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMmIzEwO2dyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b24iIC8+IG5leHQgdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJhc2UgdHlwZTwvc3Bhbj4gZmllbGQKLXRvIHNwZWNpZnkgYSBiYXNlIHR5cGUgZm9yIHRoZSBzaW1wbGUgdHlwZS48L3NwYW4+IFRoZSBTZXQgVHlwZSBkaWFsb2cKLWJveCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuCi1jaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZQotZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluCi15b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bGlzdDwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWV0eTwvc3Bhbj4gbGlzdCwKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMmIzEwO2dyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b24iIC8+IG5leHQgdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkl0ZW0gdHlwZTwvc3Bhbj4gZmllbGQKLXRvIHNwZWNpZnkgYSBpdGVtIHR5cGUgZm9yIHRoZSBzaW1wbGUgdHlwZS48L3NwYW4+IFRoZSBTZXQgVHlwZSBkaWFsb2cKLWJveCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuCi1jaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZQotZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluCi15b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5pb248L3NwYW4+IGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlldHk8L3NwYW4+IGxpc3QsCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IDxpbWcgc3JjPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiIgYWx0PSJUaGlzJiMxMDtncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uIiAvPiBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NZW1iZXIgdHlwZXM8L3NwYW4+IGZpZWxkCi10byBzcGVjaWZ5IHRoZSBtZW1iZXIgdHlwZXMgZm9yIHRoZSBzaW1wbGUgdHlwZS48L3NwYW4+IFlvdSBjYW4gc2VsZWN0Ci10byBhZGQgYm90aCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CdWlsdC1pbiBzaW1wbGUgdHlwZXM8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2VyLWRlZmluZWQKLXNpbXBsZSB0eXBlczwvc3Bhbj4gdG8gdGhlIG1lbWJlciB0eXBlcyB2YWx1ZSBsaXN0LiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25zdHJhaW50czwvc3Bhbj4gdGFiLjwvc3Bhbj4gRnJvbQotaGVyZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNldCBzcGVjaWZpYyBjb25zdHJhaW50IHZhbHVlcyBpbmNsdWRpbmcgbGVuZ3RoIGNvbnN0cmFpbnRzLAotZW51bWVyYXRpb25zLCBhbmQgcGF0dGVybnMuIAotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5FbnVtZXJhdGlvbnMgaGVscCB5b3UgdG8gZGVmaW5lIGEgc2V0IG9mIHZhbGlkIHZhbHVlcyBmb3Igc2ltcGxlCi10eXBlcy4gVGhleSBhcmUgdGhlIGFjdHVhbCB2YWx1ZXMgdGhlIHNpbXBsZSB0eXBlIGNhbiB0YWtlIGFzIHZhbGlkIHZhbHVlcwotaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIGVpdGhlciBhZGQgb25lIGVudW1lcmF0aW9uIG9yIHNldmVyYWwgZW51bWVyYXRpb25zCi1hdCBhIHRpbWU6PC9zcGFuPiA8dWw+Ci08bGk+VG8gYWRkIG9uZSBlbnVtZXJhdGlvbiBhdCBhIHRpbWUsIHVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZmljIGNvbnN0cmFpbnQKLXZhbHVlczwvc3Bhbj4sIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbnVtZXJhdGlvbnM8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IGFuZAotc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgZW51bWVyYXRpb24uPC9saT4KLQotPGxpPlRvIGFkZCBzZXZlcmFsIGVudW1lcmF0aW9ucyBhdCBvbmUgdGltZSwgZm9sbG93IHRoZXNlIHN0ZXBzOjxvbCB0eXBlPSJpIj4KLTxsaT5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW51bWVyYXRpb25zPC9zcGFuPi48L2xpPgotCi08bGk+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPi48L2xpPgotCi08bGk+RW50ZXIgdGhlIHZhbHVlIG9mIGVhY2ggZW51bWVyYXRpb24uIEVhY2ggdmFsdWUgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGltaXRlcgotY2hhcmFjdGVyPC9zcGFuPi4gRm9yIGV4YW1wbGU6IDxzYW1wIGNsYXNzPSJjb2RlcGgiPkZpcnN0LCBTZWNvbmQ8L3NhbXA+IHdpbGwgY3JlYXRlCi10d28gZW51bWVyYXRpb25zLCBvbmUgd2l0aCB0aGUgdmFsdWUgIkZpcnN0IiBhbmQgb25lIHdpdGggdGhlIHZhbHVlICJTZWNvbmQiLjwvbGk+Ci0KLTxsaT5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZXNlcnZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2U8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgYW55IHdoaXRlIHNwYWNlIGFyb3VuZCB5b3VyIGVudW1lcmF0aW9uIHZhbHVlcyB0byBiZSBwcmVzZXJ2ZWQuCi1JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCB0aGUgdmFsdWVzIG9mIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkZpcnN0LCBTZWNvbmQ8L3NhbXA+IHdpbGwKLXNob3cgdXAgYXMgIkZpcnN0IiBhbmQgIiBTZWNvbmQiICh0aGVyZSBpcyBhIHNwYWNlIGJlZm9yZSBTZWNvbmQpIGJlY2F1c2UKLXlvdSBwdXQgYSBzcGFjZSBiZWZvcmUgIlNlY29uZCIgd2hlbiBlbnRlcmluZyB0aGUgdmFsdWUuPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gWW91ciBlbnVtZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGFuZAotYXBwZWFyIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlBhdHRlcm5zIGhlbHAgeW91IHRvIHBsYWNlIGNlcnRhaW4gY29uc3RyYWludHMgcmVnYXJkaW5nIGFsbG93YWJsZQotdmFsdWVzLjwvc3Bhbj4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCByZXN0cmljdCB0aGUgZmllbGQgdG8gb25seSBhY2NlcHQKLWlucHV0IHdoaWNoIGZvbGxvd3MgdGhlIHBhdHRlcm4gImZpdmUgZGlnaXRzIGZvbGxvd2VkIGJ5IHR3byB1cHBlci1jYXNlIEFTQ0lJCi1sZXR0ZXJzIi4gVG8gc2V0IGEgcGF0dGVybiBjb25zdHJhaW50OjxvbCB0eXBlPSJpIj4KLTxsaT5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybnM8L3NwYW4+LjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+LjwvbGk+Ci0KLTxsaT5DcmVhdGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHlvdSB3aXNoIHRvIHVzZSBhcyB5b3VyIGNvbnN0cmFpbnQKLXVzaW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWd1bGFyIEV4cHJlc3Npb248L3NwYW4+IHdpemFyZC48L2xpPgotCi08bGk+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L2xpPgotCi08L29sPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNpbXBsZSB0eXBlLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkcmVnLmh0bWwiIHRpdGxlPSJBIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncyBsZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksIHdoaWNoIGluZGlyZWN0bHkgY29uc3RyYWlucyB0aGUgdmFsdWUgc3BhY2UuIj5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNDVkMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRjeG1sc2NoIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hDQotZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzDQotd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIHNjaGVtYS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgd29ya2JlbmNoLCBzZWxlY3QgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGUgPiBOZXcgPg0KLU90aGVyID4gWE1MID4gWE1MIFNjaGVtYTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIHNjaGVtYS4NCi1JbiB0aGUgPC9jbWQ+PGluZm8+PHVpY29udHJvbD5GaWxlIG5hbWU8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YNCi10aGUgWE1MIHNjaGVtYSwgZm9yIGV4YW1wbGUgPHVzZXJpbnB1dD5NeVhNTFNjaGVtYS54c2Q8L3VzZXJpbnB1dD4uIFRoZSBuYW1lDQotb2YgeW91ciBYTUwgc2NoZW1hIG11c3QgZW5kIGluIDxzeXN0ZW1vdXRwdXQ+LnhzZDwvc3lzdGVtb3V0cHV0Pi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIFhNTCBzY2hlbWEgb3BlbnMgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiA8L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZWM5MzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3htbHNjaCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0Y3htbHNjaCI+PGEgbmFtZT0idGN4bWxzY2giPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEKLWVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcwotd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIHNjaGVtYS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgd29ya2JlbmNoLCBzZWxlY3QgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7Ci1PdGhlciAmZ3Q7IFhNTCAmZ3Q7IFhNTCBTY2hlbWE8L3NwYW4+PC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgc2NoZW1hLgotSW4gdGhlIDwvc3Bhbj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSBuYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZgotdGhlIFhNTCBzY2hlbWEsIGZvciBleGFtcGxlIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+TXlYTUxTY2hlbWEueHNkPC9rYmQ+LiBUaGUgbmFtZQotb2YgeW91ciBYTUwgc2NoZW1hIG11c3QgZW5kIGluIDx0dCBjbGFzcz0ic3lzb3V0Ij4ueHNkPC90dD4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIFhNTCBzY2hlbWEgb3BlbnMgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiA8L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgdGl0bGU9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+WE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIHRpdGxlPSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgdGl0bGU9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIj5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkM2QxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRkZWxzY21wIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLA0KLXlvdSBjYW4gZGVsZXRlIHRoZW0uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmRlbGV0aW5nPGluZGV4dGVybT5jb21wb25lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5kZWxldGluZzxpbmRleHRlcm0+Y29tcG9uZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGRlbGV0ZSBhbiBYTUwNCi1zY2hlbWEgY29tcG9uZW50LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgdGhlIGl0ZW0gdG8gZGVsZXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHRoZSBpdGVtLCBhbmQsIGZyb20gaXRzIHBvcC11cCBtZW51LCBjbGljayA8dWljb250cm9sPkRlbGV0ZTwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsDQotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gY29tcG9uZW50cywgY2xlYW51cCB3aWxsIGF1dG9tYXRpY2FsbHkNCi1vY2N1ci48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGNjMjAwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLCB5b3UgY2FuIGRlbGV0ZSB0aGVtLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLCB5b3UgY2FuIGRlbGV0ZSB0aGVtLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBkZWxldGluZywgY29tcG9uZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBkZWxldGluZywgY29tcG9uZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ycmVmaW50Zy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRkZWxzY21wIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZGVsc2NtcCI+PGEgbmFtZT0idGRlbHNjbXAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwKLXlvdSBjYW4gZGVsZXRlIHRoZW0uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGRlbGV0ZSBhbiBYTUwKLXNjaGVtYSBjb21wb25lbnQsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIGNsaWNrIHRoZSBpdGVtIHRvIGRlbGV0ZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlJpZ2h0LWNsaWNrIHRoZSBpdGVtLCBhbmQsIGZyb20gaXRzIHBvcC11cCBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWxldGU8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsCi1pbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBjb21wb25lbnRzLCBjbGVhbnVwIHdpbGwgYXV0b21hdGljYWxseQotb2NjdXIuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnJlZmludGcuaHRtbCIgdGl0bGU9IlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsIGludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkIHdpbGwgYXV0b21hdGljYWxseSBvY2N1ci4iPlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTYwNzJhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdHByZWYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlDQotZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+ZGVmaW5pbmc8aW5kZXh0ZXJtPmRlZmF1bHQNCi10YXJnZXQgbmFtZXNwYWNlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgc2NoZW1hDQotZmlsZXM8aW5kZXh0ZXJtPmRlZmluaW5nPGluZGV4dGVybT5zY2hlbWEgcHJlZml4PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBkZWZpbmUgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5TZWxlY3QgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdyA+IFByZWZlcmVuY2VzID4gV2ViIGFuZA0KLVhNTCA+IFhNTCBTY2hlbWEgRmlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+UXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHM8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaWYgeW91IHdhbnQgYSBwcmVmaXggYXBwbGllZCB0byBhbGwgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluDQoteW91ciBYTUwgc2NoZW1hLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXg8L3VpY29udHJvbD4gZmllbGQsDQotdHlwZSB0aGUgcHJlZml4IHlvdSB3YW50IGFwcGxpZWQgdG8gWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluIHlvdXINCi1YTUwgc2NoZW1hLjwvY21kPjxpbmZvPiBUaGUgcHJlZml4IDx1aWNvbnRyb2w+eHNkPC91aWNvbnRyb2w+IGlzIHVzZWQgYnkgY29udmVudGlvbg0KLXRvIGRlbm90ZSB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UsIGJ1dCBhbnkgcHJlZml4IGNhbiBiZSB1c2VkLiBUaGUgcHVycG9zZQ0KLW9mIHRoZSBhc3NvY2lhdGlvbiBpcyB0byBpZGVudGlmeSB0aGUgZWxlbWVudHMgYW5kIHNpbXBsZSB0eXBlcyBhcyBiZWxvbmdpbmcNCi10byB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgWE1MIFNjaGVtYSBsYW5ndWFnZSByYXRoZXIgdGhhbiB0aGUgdm9jYWJ1bGFyeSBvZg0KLXRoZSBzY2hlbWEgYXV0aG9yLiAgPG5vdGU+VGhpcyBwcmVmaXggd2lsbCBub3QgYXBwZWFyIGluIGFueSBzY2hlbWFzIHRoYXQNCi1jdXJyZW50bHkgZXhpc3QgLSBpdCB3aWxsIG9ubHkgYXBwZWFyIGluIG5ldyBzY2hlbWFzIHlvdSBjcmVhdGUgYWZ0ZXIgeW91DQotdHlwZSB0aGUgcHJlZml4IGFuZCBjbGljayA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+LiBBbnkgc2NoZW1hcyB0aGF0IGFscmVhZHkNCi1leGlzdCB3aWxsIGhhdmUgdGhlIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhcHBsaWVkIHRvIHRoZSBYTUwgc2NoZW1hDQotbGFuZ3VhZ2UgY29uc3RydWN0cy48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPkRlZmF1bHQgVGFyZ2V0IE5hbWVzcGFjZTwvdWljb250cm9sPiB2YWx1ZS48L2NtZD4NCi08aW5mbz5UaGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQgd2lsbCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlDQotZm9yIGFueSBuZXcgWE1MIHNjaGVtYSBmaWxlcyBjcmVhdGVkLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc2NDMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgZGVmaW5pbmcsIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSwgWE1MIHNjaGVtYSBmaWxlcywgc2NoZW1hIHByZWZpeCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGRlZmluaW5nLCBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UsIFhNTCBzY2hlbWEgZmlsZXMsIHNjaGVtYSBwcmVmaXgiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRwcmVmIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRwcmVmIj48YSBuYW1lPSJ0ZWR0cHJlZiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUKLWRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gZGVmaW5lIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcywgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlcyAmZ3Q7IFdlYiBhbmQKLVhNTCAmZ3Q7IFhNTCBTY2hlbWEgRmlsZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlF1YWxpZnkgWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzPC9zcGFuPiBjaGVjawotYm94IGlmIHlvdSB3YW50IGEgcHJlZml4IGFwcGxpZWQgdG8gYWxsIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbgoteW91ciBYTUwgc2NoZW1hLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4PC9zcGFuPiBmaWVsZCwKLXR5cGUgdGhlIHByZWZpeCB5b3Ugd2FudCBhcHBsaWVkIHRvIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbiB5b3VyCi1YTUwgc2NoZW1hLjwvc3Bhbj4gIFRoZSBwcmVmaXggPHNwYW4gY2xhc3M9InVpY29udHJvbCI+eHNkPC9zcGFuPiBpcyB1c2VkIGJ5IGNvbnZlbnRpb24KLXRvIGRlbm90ZSB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UsIGJ1dCBhbnkgcHJlZml4IGNhbiBiZSB1c2VkLiBUaGUgcHVycG9zZQotb2YgdGhlIGFzc29jaWF0aW9uIGlzIHRvIGlkZW50aWZ5IHRoZSBlbGVtZW50cyBhbmQgc2ltcGxlIHR5cGVzIGFzIGJlbG9uZ2luZwotdG8gdGhlIHZvY2FidWxhcnkgb2YgdGhlIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgcmF0aGVyIHRoYW4gdGhlIHZvY2FidWxhcnkgb2YKLXRoZSBzY2hlbWEgYXV0aG9yLiAgPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoaXMgcHJlZml4IHdpbGwgbm90IGFwcGVhciBpbiBhbnkgc2NoZW1hcyB0aGF0Ci1jdXJyZW50bHkgZXhpc3QgLSBpdCB3aWxsIG9ubHkgYXBwZWFyIGluIG5ldyBzY2hlbWFzIHlvdSBjcmVhdGUgYWZ0ZXIgeW91Ci10eXBlIHRoZSBwcmVmaXggYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPi4gQW55IHNjaGVtYXMgdGhhdCBhbHJlYWR5Ci1leGlzdCB3aWxsIGhhdmUgdGhlIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhcHBsaWVkIHRvIHRoZSBYTUwgc2NoZW1hCi1sYW5ndWFnZSBjb25zdHJ1Y3RzLjwvZGl2PgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlPC9zcGFuPiB2YWx1ZS48L3NwYW4+Ci0gVGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkIHdpbGwgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZQotZm9yIGFueSBuZXcgWE1MIHNjaGVtYSBmaWxlcyBjcmVhdGVkLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc4MzBlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0ZWR0c2NobSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsDQotc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmcgWE1MIHNjaGVtYXM8aW5kZXh0ZXJtPnNpbXBsZQ0KLXR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5zaW1wbGUNCi10eXBlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGVkaXQgYW4gWE1MIHNjaGVtYSdzDQotcHJvcGVydGllcyBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LjwvY21kPjxpbmZvPiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIGNsaWNrIDx1aWNvbnRyb2w+RGlyZWN0aXZlczwvdWljb250cm9sPi48P1B1YiBDYXJldD8+PC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IGFzc29jaWF0ZWQgd2l0aA0KLXRoZSBjdXJyZW50IG5hbWVzcGFjZS48L2NtZD48aW5mbz5FbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBhcmUgYXNzb2NpYXRlZA0KLXdpdGggdGhpcyBuYW1lc3BhY2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoaXMgdmFsdWUuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gYWxzbyBlZGl0IHRoZSA8dWljb250cm9sPlRhcmdldCBuYW1lc3BhY2U8L3VpY29udHJvbD4gZm9yDQotdGhpcyBzY2hlbWEuPC9jbWQ+PGluZm8+IEEgbmFtZXNwYWNlIGlzIGEgVVJJIHRoYXQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQ0KLXRvIGFzc29jaWF0ZSB3aXRoIGFsbCB0aGUgZWxlbWVudHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMgaW4gYSBzY2hlbWEuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBYTUwgc2NoZW1hLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjM4OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDBlZjNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZWRpdGluZyBYTUwgc2NoZW1hcywgc2ltcGxlIHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGVkaXRpbmcgWE1MIHNjaGVtYXMsIHNpbXBsZSB0eXBlcywgWE1MIHNjaGVtYSBmaWxlcywgZWRpdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdHNjaG0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHNjaG0iPjxhIG5hbWU9InRlZHRzY2htIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywKLXN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBlZGl0IGFuIFhNTCBzY2hlbWEncwotcHJvcGVydGllcyBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEgb3IgZG91YmxlLWNsaWNrIGFuIGV4aXN0aW5nIHNjaGVtYSBpbiB0aGUKLU5hdmlnYXRvciB2aWV3Ljwvc3Bhbj4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGlyZWN0aXZlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gYXNzb2NpYXRlZCB3aXRoCi10aGUgY3VycmVudCBuYW1lc3BhY2UuPC9zcGFuPiBFbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBhcmUgYXNzb2NpYXRlZAotd2l0aCB0aGlzIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhpcyB2YWx1ZS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gYWxzbyBlZGl0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgbmFtZXNwYWNlPC9zcGFuPiBmb3IKLXRoaXMgc2NoZW1hLjwvc3Bhbj4gIEEgbmFtZXNwYWNlIGlzIGEgVVJJIHRoYXQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotdG8gYXNzb2NpYXRlIHdpdGggYWxsIHRoZSBlbGVtZW50cyBhbmQgdHlwZSBkZWZpbml0aW9ucyBpbiBhIHNjaGVtYS4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBYTUwgc2NoZW1hLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBmNWQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGltcHNjaG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkltcG9ydGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZQ0KLW9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZQ0KLVhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcNCi1vZiB0aGUgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBpbXBvcnQgYW4gWE1MDQotc2NoZW1hIGludG8gdGhlIHdvcmtiZW5jaDw/UHViIENhcmV0Pz46PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlID4gSW1wb3J0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBpbXBvcnQgc291cmNlLjwvY21kPjxpbmZvPiBDbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZpbGwgaW4gdGhlIGZpZWxkcyBpbiB0aGUgSW1wb3J0IHdpemFyZCBhcyBuZWNlc3NhcnkuPC9jbWQ+PGluZm8+IFdoZW4NCi15b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgaW1wb3J0ZWQgc2NoZW1hIG5vdyBhcHBlYXJzIGluIHRoZSBOYXZpZ2F0b3Igdmlldy4gRG91YmxlLWNsaWNrDQotaXQgdG8gb3BlbiBpdCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAxNDQ4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjZhMmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSW1wb3J0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFRoZSBYTUwgc2NoZW1hIGVkaXRvciBwcm92aWRlcyB5b3Ugd2l0aCBhIHN0cnVjdHVyZWQgdmlldyBvZiB0aGUgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0aW1wc2NobSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkltcG9ydGluZyBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGltcHNjaG0iPjxhIG5hbWU9InRpbXBzY2htIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZQotb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlCi1YTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3Ci1vZiB0aGUgWE1MIHNjaGVtYS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gaW1wb3J0IGFuIFhNTAotc2NoZW1hIGludG8gdGhlIHdvcmtiZW5jaDo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgJmd0OyBJbXBvcnQ8L3NwYW4+PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgaW1wb3J0IHNvdXJjZS48L3NwYW4+ICBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RmlsbCBpbiB0aGUgZmllbGRzIGluIHRoZSBJbXBvcnQgd2l6YXJkIGFzIG5lY2Vzc2FyeS48L3NwYW4+ICBXaGVuCi15b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBpbXBvcnRlZCBzY2hlbWEgbm93IGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3LiBEb3VibGUtY2xpY2sKLWl0IHRvIG9wZW4gaXQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgdGl0bGU9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdG5hdnNyYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjJhMGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRuYXZzcmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+V2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZQ0KLXRocm91Z2ggdGhlIGZpbGUgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbiB0aGUgYXBwcm9wcmlhdGUgaXRlbSBhbmQgY2xpY2tpbmcNCi1GMyB0byBqdW1wIHRvIHRoZSBpdGVtIGl0IHJlZmVycyB0by4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+bmF2aWdhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WW91IGNhbiBqdW1wIHRvIGFueSBvZiB0aGUgZm9sbG93aW5nIGl0ZW1zOjwvcD48dWw+DQotPGxpPkVsZW1lbnQgb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9uJ3MgdHlwZTwvbGk+DQotPGxpPkVsZW1lbnQgcmVmZXJlbmNlczwvbGk+DQotPGxpPkdyb3VwIHJlZmVyZW5jZXM8L2xpPg0KLTxsaT5BdHRyaWJ1dGUgcmVmZXJlbmNlczwvbGk+DQotPGxpPkF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2VzPC9saT4NCi08bGk+SW1wb3J0LCBpbmNsdWRlLCBhbmQgcmVkZWZpbmUgZWxlbWVudCAodGhlIGV4dGVybmFsIHNjaGVtYSB3aWxsIG9wZW4gaW4NCi10aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFRoaXMgb25seSB3b3JrcyB3aXRoIHNjaGVtYXMgaW4gdGhlIHdvcmtzcGFjZSkuPC9saT4NCi08L3VsPjxwPllvdSBtdXN0IHBsYWNlIHlvdXIgY3Vyc29yIGV4YWN0bHkgaW4gdGhlIGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2UNCi0oZm9yIGV4YW1wbGUgYmV0d2VlbiB0aGUgZG91YmxlIHF1b3RlcyBmb3IgPHN5c3RlbW91dHB1dD50eXBlID0gIiAiPC9zeXN0ZW1vdXRwdXQ+IG9yDQotIDxzeXN0ZW1vdXRwdXQ+YmFzZSA9ICIgIjwvc3lzdGVtb3V0cHV0PikuPC9wPjxwPkZvciBleGFtcGxlLCBpZiB5b3UgcGxhY2UNCi15b3VyIGN1cnNvciBhbnl3aGVyZSBpbiB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGNsaWNrIEYzOjwvcD48cD4gPHN5c3RlbW91dHB1dD4mbHQ7ZWxlbWVudA0KLW5hbWU9InNoaXBUbyIgdHlwZT0icG86VVNBZGRyZXNzIj4mbHQ7L2VsZW1lbnQ+PC9zeXN0ZW1vdXRwdXQ+IDwvcD48cD50aGUNCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSB0eXBlDQotVVNBZGRyZXNzIGlzIGRlZmluZWQuPC9wPjxwPk9yLCBpZiB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYW55d2hlcmUgaW4gdGhlIGZvbGxvd2luZw0KLXRleHQgYW5kIGNsaWNrIEYzOjwvcD48cD4gPHN5c3RlbW91dHB1dD4mbHQ7ZWxlbWVudCByZWY9InBvOkNvbnRhY3RFbGVtZW50Ij4mbHQ7L2VsZW1lbnQ+PC9zeXN0ZW1vdXRwdXQ+IDwvcD48cD50aGUNCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBnbG9iYWwNCi1lbGVtZW50IENvbnRhY3RFbGVtZW50IGlzIGRlZmluZWQuPC9wPjxwPlRoaXMgd29ya3MgYWNyb3NzIGZpbGVzLiBGb3IgZXhhbXBsZSwNCi1pZiB0aGUgdHlwZSB5b3UgaGF2ZSBzZWxlY3RlZCBpcyBkZWZpbmVkIGluIGFub3RoZXIgWE1MIHNjaGVtYSBhbmQgeW91IGNsaWNrDQotRjMsIHlvdSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdGFrZW4gdG8gdGhhdCBmaWxlLjwvcD48L2NvbnRleHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyZGVmNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIGNsaWNraW5nIEYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIGZpbGUgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbiB0aGUgYXBwcm9wcmlhdGUgaXRlbSBhbmQgY2xpY2tpbmcgRjMgdG8ganVtcCB0byB0aGUgaXRlbSBpdCByZWZlcnMgdG8uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgbmF2aWdhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIG5hdmlnYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0bmF2c3JjIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idG5hdnNyYyI+PGEgbmFtZT0idG5hdnNyYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZQotdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBjbGlja2luZwotRjMgdG8ganVtcCB0byB0aGUgaXRlbSBpdCByZWZlcnMgdG8uIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBqdW1wIHRvIGFueSBvZiB0aGUgZm9sbG93aW5nIGl0ZW1zOjwvcD4KLTx1bD4KLTxsaT5FbGVtZW50IG9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbidzIHR5cGU8L2xpPgotCi08bGk+RWxlbWVudCByZWZlcmVuY2VzPC9saT4KLQotPGxpPkdyb3VwIHJlZmVyZW5jZXM8L2xpPgotCi08bGk+QXR0cmlidXRlIHJlZmVyZW5jZXM8L2xpPgotCi08bGk+QXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZXM8L2xpPgotCi08bGk+SW1wb3J0LCBpbmNsdWRlLCBhbmQgcmVkZWZpbmUgZWxlbWVudCAodGhlIGV4dGVybmFsIHNjaGVtYSB3aWxsIG9wZW4gaW4KLXRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggc2NoZW1hcyBpbiB0aGUgd29ya3NwYWNlKS48L2xpPgotCi08L3VsPgotPHA+WW91IG11c3QgcGxhY2UgeW91ciBjdXJzb3IgZXhhY3RseSBpbiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZQotKGZvciBleGFtcGxlIGJldHdlZW4gdGhlIGRvdWJsZSBxdW90ZXMgZm9yIDx0dCBjbGFzcz0ic3lzb3V0Ij50eXBlID0gIiAiPC90dD4gb3IKLSA8dHQgY2xhc3M9InN5c291dCI+YmFzZSA9ICIgIjwvdHQ+KS48L3A+Ci08cD5Gb3IgZXhhbXBsZSwgaWYgeW91IHBsYWNlCi15b3VyIGN1cnNvciBhbnl3aGVyZSBpbiB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGNsaWNrIEYzOjwvcD4KLTxwPiA8dHQgY2xhc3M9InN5c291dCI+Jmx0O2VsZW1lbnQKLW5hbWU9InNoaXBUbyIgdHlwZT0icG86VVNBZGRyZXNzIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7PC90dD4gPC9wPgotPHA+dGhlCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSB0eXBlCi1VU0FkZHJlc3MgaXMgZGVmaW5lZC48L3A+Ci08cD5PciwgaWYgeW91IHBsYWNlIHlvdXIgY3Vyc29yIGFueXdoZXJlIGluIHRoZSBmb2xsb3dpbmcKLXRleHQgYW5kIGNsaWNrIEYzOjwvcD4KLTxwPiA8dHQgY2xhc3M9InN5c291dCI+Jmx0O2VsZW1lbnQgcmVmPSJwbzpDb250YWN0RWxlbWVudCImZ3Q7Jmx0Oy9lbGVtZW50Jmd0OzwvdHQ+IDwvcD4KLTxwPnRoZQotY3Vyc29yIHdpbGwgYXV0b21hdGljYWxseSBqdW1wIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgZmlsZSB3aGVyZSB0aGUgZ2xvYmFsCi1lbGVtZW50IENvbnRhY3RFbGVtZW50IGlzIGRlZmluZWQuPC9wPgotPHA+VGhpcyB3b3JrcyBhY3Jvc3MgZmlsZXMuIEZvciBleGFtcGxlLAotaWYgdGhlIHR5cGUgeW91IGhhdmUgc2VsZWN0ZWQgaXMgZGVmaW5lZCBpbiBhbm90aGVyIFhNTCBzY2hlbWEgYW5kIHlvdSBjbGljawotRjMsIHlvdSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdGFrZW4gdG8gdGhhdCBmaWxlLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMWMwYjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJyZWZhY3RvcmluZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+UmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+UmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaXRoaW4gYW4gWE1MIFNjaGVtYSBmaWxlLCByZWZhY3RvcmluZyBhbGxvd3MgYXV0aG9ycyB0byBtYWtlIGENCi1zaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlcg0KLWRlcGVuZGFudCBhcnRpZmFjdHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnJlZmFjdG9yaW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5yZW5hbWluZzwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+ZWRpdGluZw0KLVhNTCBzY2hlbWFzPC9pbmRleHRlcm0+PGluZGV4dGVybT5kZXBlbmRhbnQgYXJ0aWZhY3RzPC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08cHJlcmVxPjwvcHJlcmVxPg0KLTxjb250ZXh0PlJlZmFjdG9yaW5nIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHRoZSB0ZWRpb3VzIGVkaXRpbmcgbmVjZXNzYXJ5DQotdG8gcmVjb3ZlciBicm9rZW4gZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBhcnRpZmFjdCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJpcHBsZQ0KLWVmZmVjdHMgb24gb3RoZXIgZGVwZW5kYW50IGFydGlmYWN0cyAoc3VjaCBhcyByZW5hbWluZyBhbiBYTUwgU2NoZW1hIGVsZW1lbnQpLjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LjwvY21kPjxpbmZvPiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIHJlZmFjdG9yIGFuIGFydGlmYWN0LCBwb3NpdGlvbiBjdXJzb3Igd2l0aGluIHRoZSBhcnRpZmFjdCwgcmlnaHQtY2xpY2sNCi10aGUgYXJ0aWZhY3QsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlJlZmFjdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5SZW5hbWU8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY21kPjxpbmZvPkEgcG9wdXAgZGlhbG9nIHdpbGwgcmVxdWVzdCB0aGUgZW50cnkgb2YgYSBuZXcgbmFtZQ0KLWZvciB0aGF0IGFydGlmYWN0PC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlR5cGUgaW4gdGhlIG5ldyBuYW1lIG9mIHRoZSBhcnRpZmFjdC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD4oT3B0aW9uYWwpIENsaWNrIDxiPlByZXZpZXc8L2I+PD9QdWIgQ2FyZXQ/Pi48L2NtZD48aW5mbz5BIHdpbmRvdw0KLXdpbGwgb3BlbiBpbmRpY2F0aW5nIGFsbCBvZiB0aGUgY2hhbmdlcyB3aGljaCB3aWxsIHRha2UgcGxhY2UgZHVlIHRvIHRoZSByZWZhY3RvcmluZy48L2luZm8+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSy48L3VpY29udHJvbD48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRoZSBuZXcgbmFtZSB3aWxsIGJlIGVudGVyZWQgaW4gdGhlIG9wZW5lZCBYU0Qgc291cmNlLCBhcyB3ZWxsIGFzDQotaW4gYWxsIGRlcGVuZGFudCBhcnRpZmFjdHM8L3Jlc3VsdD4NCi08ZXhhbXBsZT48Yj48dT5Db21wb25lbnQgUmVmZXJlbmNlcyBpbiBYTUwgU2NoZW1hPC91PjwvYj48c2ltcGxldGFibGU+DQotPHN0aGVhZD4NCi08c3RlbnRyeT5HbG9iYWwgbmFtZWQgY29tcG9uZW50czwvc3RlbnRyeT4NCi08c3RlbnRyeT5SZWZlcmVuY2U8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2VsZW1lbnQgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2VsZW1lbnQgcmVmPSJmb28iPjwvbGk+DQotPGxpPiZsdDtlbGVtZW50IHN1YnN0aXR1dGlvbkdyb3VwPSJmb28iPC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDtzaW1wbGUvY29tcGxleFR5cGUgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2VsZW1lbnQgdHlwZT0iZm9vIj48L2xpPg0KLTxsaT4mbHQ7YXR0cmlidXRlIHR5cGU9ImZvbyI+PC9saT4NCi08bGk+Jmx0O3Jlc3RyaWN0aW9uIGJhc2U9ImZvbyI+PC9saT4NCi08bGk+Jmx0O3N1YnN0aXR1dGlvbiBiYXNlPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7YXR0cmlidXRlIG5hbWU9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDthdHRyaWJ1dGUgcmVmPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2dyb3VwIG5hbWU9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDtncm91cCByZWY9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9leGFtcGxlPg0KLTxwb3N0cmVxPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzEzMT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI4ODFkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYSBzaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaXRoaW4gYW4gWE1MIFNjaGVtYSBmaWxlLCByZWZhY3RvcmluZyBhbGxvd3MgYXV0aG9ycyB0byBtYWtlIGEgc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXIgZGVwZW5kYW50IGFydGlmYWN0cy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBYTUwgc2NoZW1hIGVkaXRvciwgcmVmYWN0b3JpbmcsIHJlbmFtaW5nLCBlZGl0aW5nIFhNTCBzY2hlbWFzLCBkZXBlbmRhbnQgYXJ0aWZhY3RzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgWE1MIHNjaGVtYSBlZGl0b3IsIHJlZmFjdG9yaW5nLCByZW5hbWluZywgZWRpdGluZyBYTUwgc2NoZW1hcywgZGVwZW5kYW50IGFydGlmYWN0cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmVmYWN0b3JpbmciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZWZhY3RvcmluZyI+PGEgbmFtZT0icmVmYWN0b3JpbmciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYQotc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXIKLWRlcGVuZGFudCBhcnRpZmFjdHMuPC9wPgotCi08ZGl2IGNsYXNzPSJwIiAvPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5SZWZhY3RvcmluZyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciB0aGUgdGVkaW91cyBlZGl0aW5nIG5lY2Vzc2FyeQotdG8gcmVjb3ZlciBicm9rZW4gZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBhcnRpZmFjdCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJpcHBsZQotZWZmZWN0cyBvbiBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzIChzdWNoIGFzIHJlbmFtaW5nIGFuIFhNTCBTY2hlbWEgZWxlbWVudCkuPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEgb3IgZG91YmxlLWNsaWNrIGFuIGV4aXN0aW5nIHNjaGVtYSBpbiB0aGUKLU5hdmlnYXRvciB2aWV3Ljwvc3Bhbj4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gcmVmYWN0b3IgYW4gYXJ0aWZhY3QsIHBvc2l0aW9uIGN1cnNvciB3aXRoaW4gdGhlIGFydGlmYWN0LCByaWdodC1jbGljawotdGhlIGFydGlmYWN0LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj4KLTwvc3Bhbj48L3NwYW4+IEEgcG9wdXAgZGlhbG9nIHdpbGwgcmVxdWVzdCB0aGUgZW50cnkgb2YgYSBuZXcgbmFtZQotZm9yIHRoYXQgYXJ0aWZhY3QKLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBpbiB0aGUgbmV3IG5hbWUgb2YgdGhlIGFydGlmYWN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgQ2xpY2sgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+Ljwvc3Bhbj4gQSB3aW5kb3cKLXdpbGwgb3BlbiBpbmRpY2F0aW5nIGFsbCBvZiB0aGUgY2hhbmdlcyB3aGljaCB3aWxsIHRha2UgcGxhY2UgZHVlIHRvIHRoZSByZWZhY3RvcmluZy4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0suPC9zcGFuPjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgbmV3IG5hbWUgd2lsbCBiZSBlbnRlcmVkIGluIHRoZSBvcGVuZWQgWFNEIHNvdXJjZSwgYXMgd2VsbCBhcwotaW4gYWxsIGRlcGVuZGFudCBhcnRpZmFjdHM8L2Rpdj4KLQotPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHN0cm9uZz48dT5Db21wb25lbnQgUmVmZXJlbmNlcyBpbiBYTUwgU2NoZW1hPC91Pjwvc3Ryb25nPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYm9yZGVyPSIxIiBjbGFzcz0ic2ltcGxldGFibGVib3JkZXIiPgotPHRyPgotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDBFQiI+R2xvYmFsIG5hbWVkIGNvbXBvbmVudHM8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMEYxIj5SZWZlcmVuY2U8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFQiI+PHVsPgotPGxpPiZsdDtlbGVtZW50IG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEYxIj48dWw+Ci08bGk+Jmx0O2VsZW1lbnQgcmVmPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7ZWxlbWVudCBzdWJzdGl0dXRpb25Hcm91cD0iZm9vIjwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFQiI+PHVsPgotPGxpPiZsdDtzaW1wbGUvY29tcGxleFR5cGUgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRjEiPjx1bD4KLTxsaT4mbHQ7ZWxlbWVudCB0eXBlPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7YXR0cmlidXRlIHR5cGU9ImZvbyImZ3Q7PC9saT4KLQotPGxpPiZsdDtyZXN0cmljdGlvbiBiYXNlPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7c3Vic3RpdHV0aW9uIGJhc2U9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVCIj48dWw+Ci08bGk+Jmx0O2F0dHJpYnV0ZSBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGMSI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGUgcmVmPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFQiI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGVHcm91cCBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGMSI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGVHcm91cCByZWY9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVCIj48dWw+Ci08bGk+Jmx0O2dyb3VwIG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEYxIj48dWw+Ci08bGk+Jmx0O2dyb3VwIHJlZj0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNmZmIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHZkdHNjaG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZg0KLXRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluDQotdGhlIFByb2JsZW1zIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+dmFsaWRhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIHZhbGlkYXRlIGFuIFhNTA0KLXNjaGVtYTo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHlvdXIgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+UnVuDQotVmFsaWRhdGlvbjwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gSWYgdmFsaWRhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIFByb2JsZW1zDQotdmlldyB0byBzZWUgd2hhdCBwcm9ibGVtcyB3ZXJlIGxvZ2dlZC4gPC9jbWQ+PGluZm8+IDxub3RlPklmIHlvdSByZWNlaXZlIGFuDQotZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zIHZpZXcgaXMgZnVsbCwgeW91IGNhbiBpbmNyZWFzZQ0KLXRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBzZWxlY3RpbmcgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlByb3BlcnRpZXMNCi0+IFZhbGlkYXRpb248L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiA8P1B1YiBDYXJldD8+YW5kIHNwZWNpZnlpbmcgdGhlIG1heGltdW0NCi1udW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZC48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBzY2hlbWEgc3VwcG9ydCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgaXMgYmFzZWQgb24gdGhlDQotVzNDIFhNTCBTY2hlbWEgUmVjb21tZW5kYXRpb24gU3BlY2lmaWNhdGlvbi4gVGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnMNCi1YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlcyBhbmQgWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBmcm9tIHRoZSBXM0MNCi1XZWIgc2l0ZSBhcmUgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+PHA+Q2VydGFpbiBlcnJvciBtZXNzYWdlcyBjb250YWluIGEgcmVmZXJlbmNlDQotdG8gdGhlIHNjaGVtYSBjb25zdHJhaW50cyBsaXN0ZWQgaW4gQXBwZW5kaXggQyBvZiB0aGUgWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMNCi1kb2N1bWVudC4gRWFjaCBjb25zdHJhaW50IGhhcyBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGluIHRoZQ0KLWVycm9yIG1lc3NhZ2UuIEZvciBleGFtcGxlLCBpZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIHdpdGggdGhpcyB0ZXh0Og0KLSA8c3lzdGVtb3V0cHV0PmN0LXByb3BzLWNvcnJlY3Q8L3N5c3RlbW91dHB1dD4gYW5kIHlvdSBzZWFyY2hlZCBpbiB0aGUgU3RydWN0dXJlDQotZG9jdW1lbnQgZm9yIHRoZSB0ZXh0LCB5b3Ugd291bGQgZmluZCB0aGF0IGl0IGlzIGZvciB0aGUgc2VjdGlvbiAiU2NoZW1hIENvbXBvbmVudA0KLUNvbnN0cmFpbnQ6IENvbXBsZXggVHlwZSBEZWZpbml0aW9uIFByb3BlcnRpZXMgQ29ycmVjdCIuIDwvcD48cD5Zb3UgY2FuIHNldA0KLXVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdCByZXNvdXJjZXMgYXJlDQotYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51IHNlbGVjdCA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sDQotdGhlbiBzZWxlY3QgPHVpY29udHJvbD5WYWxpZGF0aW9uPC91aWNvbnRyb2w+LiBBbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1bg0KLWFnYWluc3QgeW91ciBwcm9qZWN0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBWYWxpZGF0aW9uIHBhZ2UuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08ZGVzYz5HZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb248L2Rlc2M+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xIiBzY29wZT0iZXh0ZXJuYWwiPjxsaW5rdGV4dD5YTUwNCi1TY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC9saW5rdGV4dD4NCi08ZGVzYz5TZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zPC9kZXNjPg0KLTwvbGluaz4NCi08bGluayBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgc2NvcGU9ImV4dGVybmFsIj48bGlua3RleHQ+WE1MDQotU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzPC9saW5rdGV4dD4NCi08ZGVzYz5TZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zPC9kZXNjPg0KLTwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMTI0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODRhZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCB2YWxpZGF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjeG1sc2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMSIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHZkdHNjaG0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0dmR0c2NobSI+PGEgbmFtZT0idHZkdHNjaG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YKLXRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluCi10aGUgUHJvYmxlbXMgdmlldy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gdmFsaWRhdGUgYW4gWE1MCi1zY2hlbWE6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQtY2xpY2sgeW91ciBmaWxlIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuCi1WYWxpZGF0aW9uPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gSWYgdmFsaWRhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIFByb2JsZW1zCi12aWV3IHRvIHNlZSB3aGF0IHByb2JsZW1zIHdlcmUgbG9nZ2VkLiA8L3NwYW4+ICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgeW91IHJlY2VpdmUgYW4KLWVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSBQcm9ibGVtcyB2aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UKLXRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBzZWxlY3RpbmcgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllcwotJmd0OyBWYWxpZGF0aW9uPC9zcGFuPjwvc3Bhbj4gYW5kIHNwZWNpZnlpbmcgdGhlIG1heGltdW0KLW51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkLjwvZGl2PgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBzY2hlbWEgc3VwcG9ydCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgaXMgYmFzZWQgb24gdGhlCi1XM0MgWE1MIFNjaGVtYSBSZWNvbW1lbmRhdGlvbiBTcGVjaWZpY2F0aW9uLiBUaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucwotWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMgYW5kIFhNTCBTY2hlbWEgUGFydCAyOiBEYXRhdHlwZXMgZnJvbSB0aGUgVzNDCi1XZWIgc2l0ZSBhcmUgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+Ci08cD5DZXJ0YWluIGVycm9yIG1lc3NhZ2VzIGNvbnRhaW4gYSByZWZlcmVuY2UKLXRvIHRoZSBzY2hlbWEgY29uc3RyYWludHMgbGlzdGVkIGluIEFwcGVuZGl4IEMgb2YgdGhlIFhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzCi1kb2N1bWVudC4gRWFjaCBjb25zdHJhaW50IGhhcyBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGluIHRoZQotZXJyb3IgbWVzc2FnZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGlzIHRleHQ6Ci0gPHR0IGNsYXNzPSJzeXNvdXQiPmN0LXByb3BzLWNvcnJlY3Q8L3R0PiBhbmQgeW91IHNlYXJjaGVkIGluIHRoZSBTdHJ1Y3R1cmUKLWRvY3VtZW50IGZvciB0aGUgdGV4dCwgeW91IHdvdWxkIGZpbmQgdGhhdCBpdCBpcyBmb3IgdGhlIHNlY3Rpb24gIlNjaGVtYSBDb21wb25lbnQKLUNvbnN0cmFpbnQ6IENvbXBsZXggVHlwZSBEZWZpbml0aW9uIFByb3BlcnRpZXMgQ29ycmVjdCIuIDwvcD4KLTxwPllvdSBjYW4gc2V0Ci11cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzIGFyZQotYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiwKLXRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LiBBbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1bgotYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24gcGFnZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5DcmVhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiB0aXRsZT0iR2VuZXJhbCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIj4uLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iU2VlIHRoZSBXM0MgV2ViIHNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucyI+WE1MCi1TY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJTZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zIj5YTUwKLVNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5YjA2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwY2UxZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzQ1MjAwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdlYiB0b29scyBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjVmZWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjIiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZiIgdmVyc2lvbj0iMi4yIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZW0iIHZlcnNpb249IjEuMiIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5zdGFuZGFyZC5kdGRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGY3NmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFdlYiBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwNDg0ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5zb3VyY2UiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGFlYTAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmMWU2ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1YjQ1Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkMzhkNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDMwMmUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCi1vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OWY4NGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjA2MTIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxNzQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgdGhlIFdTVCB3ZWIgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5YzRjMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGI0NzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODkyODcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgVUkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XZWIgVUkgdG9vbHMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDhlNTgzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUiIHZlcnNpb249IjEuNS4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOGE2MTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZSA9IG9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiYzIzYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBXZWIgVUkuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxNWQyMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThhZWEwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTVjMGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODk1NTk3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTZmYjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmZTE3NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1ZWIzMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDg5ZDNkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIFdlYiB1c2VyIGRvY3VtZW50YXRpb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzE0NThiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhNTY4OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlXzEuNS4wLjIwMDYwNTA4MDEwNC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWUyNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOTI3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gTWF5IDA4IDA5OjEwOjI3IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4ZDg0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIENvcmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgWE1MIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmN2U3ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNS4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmFwYWNoZS54ZXJjZXMuZmVhdHVyZSIgdmVyc2lvbj0iMi44LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5yY3AiIHZlcnNpb249IjMuMiIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuMiIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mIiB2ZXJzaW9uPSIyLjIiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnhzZCIgdmVyc2lvbj0iMi4yIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTU1ZGRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBYTUwgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZWMwMDkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUuc291cmNlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNS4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThhZWEwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzI3MTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWI0NTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDM3NzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTA5ZTg1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzVmYTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDYwMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzkzZjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBXU1QgWE1MIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWI0YjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMThjNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FmZmM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3MjczNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdlYiBYTUwgdG9vbHMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBjNzExLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuYXBhY2hlLnhlcmNlcy5mZWF0dXJlIiB2ZXJzaW9uPSIyLjguMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5nZWYiIHZlcnNpb249IjMuMiIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliNzQ2OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGFkNzYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFhNTCBVSS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3NzkxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgc2VhcmNoLWxvY2F0aW9uPSJib3RoIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgc2VhcmNoLWxvY2F0aW9uPSJib3RoIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThhZWEwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTEwZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODk1NTk3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjVmNGQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM5MWIyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTI3ZTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgWE1MIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2M3MmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+Cg==